summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgignore18
-rw-r--r--doc/contributions.txt5
-rw-r--r--etc/message.xml2
-rw-r--r--indra/cmake/00-Common.cmake18
-rw-r--r--indra/cmake/APR.cmake9
-rw-r--r--indra/cmake/Boost.cmake6
-rw-r--r--indra/cmake/CMakeLists.txt2
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake395
-rw-r--r--indra/cmake/DeploySharedLibs.cmake73
-rw-r--r--indra/cmake/DragDrop.cmake23
-rw-r--r--indra/cmake/ExamplePlugin.cmake16
-rw-r--r--indra/cmake/GStreamer010Plugin.cmake1
-rw-r--r--indra/cmake/GetPrerequisites_2_8.cmake786
-rw-r--r--indra/cmake/GooglePerfTools.cmake7
-rw-r--r--indra/cmake/LLAddBuildTest.cmake13
-rw-r--r--indra/cmake/LLAudio.cmake3
-rw-r--r--indra/cmake/LLSharedLibs.cmake74
-rw-r--r--indra/cmake/Linking.cmake5
-rw-r--r--indra/cmake/QuickTimePlugin.cmake4
-rw-r--r--indra/cmake/TemplateCheck.cmake2
-rw-r--r--indra/cmake/Variables.cmake4
-rw-r--r--indra/cmake/WebKitLibPlugin.cmake1
-rw-r--r--indra/cmake/run_build_test.py222
-rwxr-xr-xindra/develop.py50
-rw-r--r--indra/integration_tests/llui_libtest/llwidgetreg.cpp1
-rw-r--r--indra/lib/python/indra/util/llmanifest.py6
-rw-r--r--indra/linux_crash_logger/CMakeLists.txt11
-rw-r--r--indra/linux_updater/CMakeLists.txt11
-rw-r--r--indra/llaudio/CMakeLists.txt6
-rw-r--r--indra/llaudio/llaudiodecodemgr.cpp3
-rw-r--r--indra/llaudio/llaudioengine.cpp6
-rw-r--r--indra/llaudio/llaudioengine.h11
-rw-r--r--indra/llaudio/llstreamingaudio_fmod.cpp2
-rw-r--r--indra/llcharacter/llbvhloader.h1
-rw-r--r--indra/llcharacter/llcharacter.cpp16
-rw-r--r--indra/llcharacter/llcharacter.h6
-rw-r--r--indra/llcharacter/lleditingmotion.cpp2
-rw-r--r--indra/llcharacter/llheadrotmotion.cpp11
-rw-r--r--indra/llcharacter/lljoint.cpp1
-rw-r--r--indra/llcharacter/llkeyframemotion.h1
-rw-r--r--indra/llcharacter/llkeyframewalkmotion.cpp12
-rw-r--r--indra/llcharacter/llstatemachine.cpp2
-rw-r--r--indra/llcharacter/llvisualparam.cpp18
-rw-r--r--indra/llcharacter/llvisualparam.h10
-rw-r--r--indra/llcommon/CMakeLists.txt110
-rw-r--r--indra/llcommon/imageids.cpp76
-rw-r--r--indra/llcommon/imageids.h57
-rw-r--r--indra/llcommon/indra_constants.cpp46
-rw-r--r--indra/llcommon/indra_constants.h22
-rw-r--r--indra/llcommon/linden_common.h2
-rw-r--r--indra/llcommon/ll_template_cast.h160
-rw-r--r--indra/llcommon/llallocator.h126
-rw-r--r--indra/llcommon/llallocator_heap_profile.cpp31
-rw-r--r--indra/llcommon/llapp.cpp2
-rw-r--r--indra/llcommon/llapp.h8
-rw-r--r--indra/llcommon/llapr.cpp161
-rw-r--r--indra/llcommon/llapr.h532
-rw-r--r--indra/llcommon/llassettype.cpp154
-rw-r--r--indra/llcommon/llassettype.h361
-rw-r--r--indra/llcommon/llchat.h11
-rw-r--r--indra/llcommon/llclickaction.h5
-rw-r--r--indra/llcommon/llcommon.h1
-rw-r--r--indra/llcommon/llcoros.h298
-rw-r--r--indra/llcommon/lldate.cpp3
-rw-r--r--indra/llcommon/lldictionary.cpp52
-rw-r--r--indra/llcommon/lldictionary.h27
-rw-r--r--indra/llcommon/llerror.cpp3
-rw-r--r--indra/llcommon/llerror.h2
-rw-r--r--indra/llcommon/llerrorlegacy.h8
-rw-r--r--indra/llcommon/lleventapi.cpp30
-rw-r--r--indra/llcommon/lleventapi.h66
-rw-r--r--indra/llcommon/lleventcoro.h7
-rw-r--r--indra/llcommon/lleventdispatcher.cpp26
-rw-r--r--indra/llcommon/lleventdispatcher.h323
-rw-r--r--indra/llcommon/llevents.cpp25
-rw-r--r--indra/llcommon/llevents.h1961
-rw-r--r--indra/llcommon/lleventtimer.cpp95
-rw-r--r--indra/llcommon/lleventtimer.h60
-rw-r--r--indra/llcommon/llfasttimer.h483
-rw-r--r--indra/llcommon/llfasttimer_class.cpp768
-rw-r--r--indra/llcommon/llfasttimer_class.h272
-rw-r--r--indra/llcommon/llfoldertype.cpp169
-rw-r--r--indra/llcommon/llfoldertype.h112
-rw-r--r--indra/llcommon/llinstancetracker.cpp20
-rw-r--r--indra/llcommon/llinstancetracker.h161
-rw-r--r--indra/llcommon/lllistenerwrapper.h181
-rw-r--r--indra/llcommon/lllivefile.cpp2
-rw-r--r--indra/llcommon/llmemory.h130
-rw-r--r--indra/llcommon/llmemtype.h496
-rw-r--r--indra/llcommon/llpointer.h1
-rw-r--r--indra/llcommon/llpreprocessor.h356
-rw-r--r--indra/llcommon/llprocesslauncher.h8
-rw-r--r--indra/llcommon/llprocessor.cpp3
-rw-r--r--indra/llcommon/llqueuedthread.cpp78
-rw-r--r--indra/llcommon/llqueuedthread.h4
-rw-r--r--indra/llcommon/llrefcount.cpp11
-rw-r--r--indra/llcommon/llrefcount.h14
-rw-r--r--indra/llcommon/llsd.cpp32
-rw-r--r--indra/llcommon/llsd.h6
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp15
-rw-r--r--indra/llcommon/llsingleton.h1
-rw-r--r--indra/llcommon/llstacktrace.cpp284
-rw-r--r--indra/llcommon/llstacktrace.h88
-rw-r--r--indra/llcommon/llstring.cpp48
-rw-r--r--indra/llcommon/llstring.h2598
-rw-r--r--indra/llcommon/llsys.cpp129
-rw-r--r--indra/llcommon/llthread.cpp18
-rw-r--r--indra/llcommon/llthread.h8
-rw-r--r--indra/llcommon/lltimer.cpp51
-rw-r--r--indra/llcommon/lltimer.h21
-rw-r--r--indra/llcommon/lltreeiterators.h34
-rw-r--r--indra/llcommon/lluri.cpp15
-rw-r--r--indra/llcommon/llversionserver.h2
-rw-r--r--indra/llcommon/llversionviewer.h2
-rw-r--r--indra/llcommon/llworkerthread.cpp2
-rw-r--r--indra/llcommon/llworkerthread.h6
-rw-r--r--indra/llcommon/tests/llerror_test.cpp9
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp166
-rw-r--r--indra/llcommon/tests/lltreeiterators_test.cpp3
-rw-r--r--indra/llimage/CMakeLists.txt4
-rw-r--r--indra/llimage/llimage.cpp107
-rw-r--r--indra/llimage/llimage.h13
-rw-r--r--indra/llimage/llimagedxt.cpp19
-rw-r--r--indra/llimage/llimagej2c.cpp5
-rw-r--r--indra/llimage/llimagejpeg.cpp9
-rw-r--r--indra/llimage/llimageworker.cpp207
-rw-r--r--indra/llimage/llimageworker.h95
-rw-r--r--indra/llimage/tests/llimageworker_test.cpp260
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp9
-rw-r--r--indra/llimagej2coj/llimagej2coj.h3
-rw-r--r--indra/llinventory/llinventory.cpp62
-rw-r--r--indra/llinventory/llinventory.h17
-rw-r--r--indra/llinventory/llinventorytype.cpp36
-rw-r--r--indra/llinventory/llinventorytype.h3
-rw-r--r--indra/llinventory/llnotecard.cpp4
-rw-r--r--indra/llinventory/tests/inventorymisc_test.cpp4
-rw-r--r--indra/llmath/CMakeLists.txt48
-rw-r--r--indra/llmath/llcamera.cpp7
-rw-r--r--indra/llmath/llinterp.h10
-rw-r--r--indra/llmath/llmath.h2
-rw-r--r--indra/llmath/lloctree.h1
-rw-r--r--indra/llmath/llvolume.cpp3
-rw-r--r--indra/llmath/xform.cpp5
-rw-r--r--indra/llmath/xform.h30
-rw-r--r--indra/llmessage/CMakeLists.txt59
-rw-r--r--indra/llmessage/llares.cpp17
-rw-r--r--indra/llmessage/llareslistener.cpp15
-rw-r--r--indra/llmessage/llareslistener.h9
-rw-r--r--indra/llmessage/llassetstorage.cpp3
-rw-r--r--indra/llmessage/llassetstorage.h11
-rw-r--r--indra/llmessage/llcachename.cpp40
-rw-r--r--indra/llmessage/llcachename.h4
-rw-r--r--indra/llmessage/llcurl.cpp56
-rw-r--r--indra/llmessage/llcurl.h18
-rw-r--r--indra/llmessage/lldatapacker.cpp12
-rw-r--r--indra/llmessage/lldatapacker.h5
-rw-r--r--indra/llmessage/llhttpassetstorage.cpp3
-rw-r--r--indra/llmessage/llhttpclient.cpp2
-rw-r--r--indra/llmessage/llhttpnode.h2
-rw-r--r--indra/llmessage/llinstantmessage.cpp2
-rw-r--r--indra/llmessage/lliohttpserver.cpp11
-rw-r--r--indra/llmessage/lliohttpserver.h1
-rw-r--r--indra/llmessage/llmessagetemplate.h4
-rw-r--r--indra/llmessage/llmessagetemplateparser.cpp4
-rw-r--r--indra/llmessage/llnamevalue.cpp1
-rw-r--r--indra/llmessage/llpacketbuffer.cpp5
-rw-r--r--indra/llmessage/llregionflags.h2
-rw-r--r--indra/llmessage/lltemplatemessagebuilder.cpp8
-rw-r--r--indra/llmessage/lltransfermanager.cpp2
-rw-r--r--indra/llmessage/lltransfersourceasset.cpp6
-rw-r--r--indra/llmessage/lltransfertargetfile.h7
-rw-r--r--indra/llmessage/lltransfertargetvfile.h1
-rw-r--r--indra/llmessage/llurlrequest.cpp1
-rw-r--r--indra/llmessage/llxfer.cpp1
-rw-r--r--indra/llmessage/machine.cpp62
-rw-r--r--indra/llmessage/machine.h28
-rw-r--r--indra/llmessage/message.cpp4
-rw-r--r--indra/llmessage/partsyspacket.cpp2
-rw-r--r--indra/llmessage/sound_ids.cpp314
-rw-r--r--indra/llmessage/sound_ids.h504
-rw-r--r--indra/llmessage/tests/llareslistener_test.cpp2
-rw-r--r--indra/llmessage/tests/llcurl_stub.cpp1
-rw-r--r--indra/llmessage/tests/llhttpclientadapter_test.cpp2
-rw-r--r--indra/llmessage/tests/llsdmessage_test.cpp27
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp54
-rw-r--r--indra/llplugin/llpluginclassmedia.h26
-rw-r--r--indra/llplugin/llpluginclassmediaowner.h2
-rw-r--r--indra/llplugin/llplugininstance.cpp35
-rw-r--r--indra/llplugin/llplugininstance.h26
-rw-r--r--indra/llplugin/llpluginmessage.cpp173
-rw-r--r--indra/llplugin/llpluginmessage.h19
-rw-r--r--indra/llplugin/llpluginmessageclasses.h2
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp11
-rw-r--r--indra/llplugin/llpluginmessagepipe.h2
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp51
-rw-r--r--indra/llplugin/llpluginprocesschild.h7
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp69
-rw-r--r--indra/llplugin/llpluginprocessparent.h17
-rw-r--r--indra/llplugin/llpluginsharedmemory.cpp14
-rw-r--r--indra/llplugin/llpluginsharedmemory.h55
-rw-r--r--indra/llplugin/slplugin/slplugin.cpp106
-rw-r--r--indra/llprimitive/CMakeLists.txt1
-rw-r--r--indra/llprimitive/llmaterialtable.cpp3
-rw-r--r--indra/llprimitive/llmaterialtable.h83
-rw-r--r--indra/llprimitive/llmediaentry.cpp9
-rw-r--r--indra/llprimitive/llprimitive.cpp1
-rw-r--r--indra/llprimitive/material_codes.cpp46
-rw-r--r--indra/llprimitive/material_codes.h19
-rw-r--r--indra/llprimitive/tests/llmediaentry_test.cpp231
-rw-r--r--indra/llrender/llcubemap.cpp13
-rw-r--r--indra/llrender/llfontbitmapcache.cpp4
-rw-r--r--indra/llrender/llfontfreetype.cpp42
-rw-r--r--indra/llrender/llfontfreetype.h5
-rw-r--r--indra/llrender/llfontgl.cpp164
-rw-r--r--indra/llrender/llfontgl.h10
-rw-r--r--indra/llrender/llgl.cpp41
-rw-r--r--indra/llrender/llglslshader.cpp2
-rw-r--r--indra/llrender/llglstates.h2
-rw-r--r--indra/llrender/llimagegl.cpp517
-rw-r--r--indra/llrender/llimagegl.h89
-rw-r--r--indra/llrender/llpostprocess.cpp2
-rw-r--r--indra/llrender/llrender.cpp24
-rw-r--r--indra/llrender/llrender.h4
-rw-r--r--indra/llrender/lltexture.h4
-rw-r--r--indra/llrender/llvertexbuffer.cpp79
-rw-r--r--indra/llui/CMakeLists.txt11
-rw-r--r--indra/llui/llaccordionctrl.cpp653
-rw-r--r--indra/llui/llaccordionctrl.h132
-rw-r--r--indra/llui/llaccordionctrltab.cpp634
-rw-r--r--indra/llui/llaccordionctrltab.h192
-rw-r--r--indra/llui/llbutton.cpp135
-rw-r--r--indra/llui/llbutton.h51
-rw-r--r--indra/llui/llcheckboxctrl.cpp7
-rw-r--r--indra/llui/llcheckboxctrl.h6
-rw-r--r--indra/llui/llcombobox.cpp35
-rw-r--r--indra/llui/llcombobox.h7
-rw-r--r--indra/llui/llconsole.cpp75
-rw-r--r--indra/llui/llconsole.h13
-rw-r--r--indra/llui/lldockablefloater.cpp44
-rw-r--r--indra/llui/lldockablefloater.h43
-rw-r--r--indra/llui/lldockcontrol.cpp80
-rw-r--r--indra/llui/lldockcontrol.h9
-rw-r--r--indra/llui/lldraghandle.cpp2
-rw-r--r--indra/llui/llflatlistview.cpp433
-rw-r--r--indra/llui/llflatlistview.h51
-rw-r--r--indra/llui/llfloater.cpp434
-rw-r--r--indra/llui/llfloater.h76
-rw-r--r--indra/llui/llfloaterreg.cpp30
-rw-r--r--indra/llui/llfloaterreg.h7
-rw-r--r--indra/llui/llfloaterreglistener.cpp30
-rw-r--r--indra/llui/llfloaterreglistener.h6
-rw-r--r--indra/llui/llflyoutbutton.cpp1
-rw-r--r--indra/llui/llfocusmgr.cpp43
-rw-r--r--indra/llui/llfocusmgr.h16
-rw-r--r--indra/llui/llhelp.h4
-rw-r--r--indra/llui/lliconctrl.cpp18
-rw-r--r--indra/llui/lliconctrl.h8
-rw-r--r--indra/llui/llkeywords.cpp82
-rw-r--r--indra/llui/llkeywords.h29
-rw-r--r--indra/llui/lllayoutstack.cpp72
-rw-r--r--indra/llui/lllayoutstack.h28
-rw-r--r--indra/llui/lllineeditor.cpp388
-rw-r--r--indra/llui/lllineeditor.h52
-rw-r--r--indra/llui/lllocalcliprect.cpp3
-rw-r--r--indra/llui/llmenubutton.cpp6
-rw-r--r--indra/llui/llmenubutton.h1
-rw-r--r--indra/llui/llmenugl.cpp252
-rw-r--r--indra/llui/llmenugl.h54
-rw-r--r--indra/llui/llmultifloater.cpp11
-rw-r--r--indra/llui/llmultislider.cpp85
-rw-r--r--indra/llui/llmultislider.h41
-rw-r--r--indra/llui/llmultisliderctrl.cpp19
-rw-r--r--indra/llui/llmultisliderctrl.h2
-rw-r--r--indra/llui/llnotificationptr.h41
-rw-r--r--indra/llui/llnotifications.cpp37
-rw-r--r--indra/llui/llnotifications.h15
-rw-r--r--indra/llui/llnotificationslistener.cpp285
-rw-r--r--indra/llui/llnotificationslistener.h24
-rw-r--r--indra/llui/llnotificationsutil.cpp101
-rw-r--r--indra/llui/llnotificationsutil.h72
-rw-r--r--indra/llui/llpanel.cpp121
-rw-r--r--indra/llui/llpanel.h26
-rw-r--r--indra/llui/llprogressbar.cpp9
-rw-r--r--indra/llui/llradiogroup.cpp111
-rw-r--r--indra/llui/llradiogroup.h47
-rw-r--r--indra/llui/llresizebar.cpp7
-rw-r--r--indra/llui/llresizehandle.cpp7
-rw-r--r--indra/llui/llscrollcontainer.cpp58
-rw-r--r--indra/llui/llscrollcontainer.h2
-rw-r--r--indra/llui/llscrolllistcell.cpp26
-rw-r--r--indra/llui/llscrolllistcell.h8
-rw-r--r--indra/llui/llscrolllistcolumn.cpp10
-rw-r--r--indra/llui/llscrolllistcolumn.h15
-rw-r--r--indra/llui/llscrolllistctrl.cpp25
-rw-r--r--indra/llui/llscrolllistctrl.h4
-rw-r--r--indra/llui/llscrolllistitem.h2
-rw-r--r--indra/llui/llsearcheditor.cpp18
-rw-r--r--indra/llui/llsearcheditor.h15
-rw-r--r--indra/llui/llslider.cpp168
-rw-r--r--indra/llui/llslider.h30
-rw-r--r--indra/llui/llsliderctrl.cpp9
-rw-r--r--indra/llui/llsliderctrl.h4
-rw-r--r--indra/llui/llspinctrl.cpp44
-rw-r--r--indra/llui/llspinctrl.h5
-rw-r--r--indra/llui/llstyle.cpp6
-rw-r--r--indra/llui/llstyle.h11
-rw-r--r--indra/llui/lltabcontainer.cpp275
-rw-r--r--indra/llui/lltabcontainer.h38
-rw-r--r--indra/llui/lltextbase.cpp566
-rw-r--r--indra/llui/lltextbase.h70
-rw-r--r--indra/llui/lltextbox.cpp41
-rw-r--r--indra/llui/lltextbox.h27
-rw-r--r--indra/llui/lltexteditor.cpp266
-rw-r--r--indra/llui/lltexteditor.h18
-rw-r--r--indra/llui/lltextvalidate.cpp302
-rw-r--r--indra/llui/lltextvalidate.h63
-rw-r--r--indra/llui/lltoggleablemenu.cpp9
-rw-r--r--indra/llui/lltoggleablemenu.h3
-rw-r--r--indra/llui/lltooltip.cpp176
-rw-r--r--indra/llui/lltooltip.h42
-rw-r--r--indra/llui/llui.cpp105
-rw-r--r--indra/llui/llui.h30
-rw-r--r--indra/llui/lluicolortable.cpp36
-rw-r--r--indra/llui/lluicolortable.h9
-rw-r--r--indra/llui/lluictrl.cpp227
-rw-r--r--indra/llui/lluictrl.h88
-rw-r--r--indra/llui/lluictrlfactory.cpp12
-rw-r--r--indra/llui/lluictrlfactory.h73
-rw-r--r--indra/llui/lluiimage.cpp64
-rw-r--r--indra/llui/lluiimage.h13
-rw-r--r--indra/llui/lluistring.cpp51
-rw-r--r--indra/llui/lluistring.h34
-rw-r--r--indra/llui/llurlaction.cpp12
-rw-r--r--indra/llui/llurlaction.h3
-rw-r--r--indra/llui/llurlentry.cpp222
-rw-r--r--indra/llui/llurlentry.h75
-rw-r--r--indra/llui/llurlmatch.cpp8
-rw-r--r--indra/llui/llurlmatch.h6
-rw-r--r--indra/llui/llurlregistry.cpp58
-rw-r--r--indra/llui/llurlregistry.h4
-rw-r--r--indra/llui/llview.cpp52
-rw-r--r--indra/llui/llview.h34
-rw-r--r--indra/llui/llviewmodel.h3
-rw-r--r--indra/llui/tests/llurlentry_test.cpp327
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp31
-rw-r--r--indra/llvfs/lldir.cpp23
-rw-r--r--indra/llvfs/lldir.h6
-rw-r--r--indra/llvfs/lldir_linux.cpp12
-rw-r--r--indra/llvfs/lldir_solaris.cpp11
-rw-r--r--indra/llvfs/lldir_win32.cpp8
-rw-r--r--indra/llvfs/lllfsthread.cpp4
-rwxr-xr-xindra/llvfs/llpidlock.cpp17
-rwxr-xr-xindra/llvfs/llpidlock.h12
-rw-r--r--indra/llvfs/llvfile.h1
-rw-r--r--indra/llwindow/CMakeLists.txt4
-rw-r--r--indra/llwindow/lldragdropwin32.cpp371
-rw-r--r--indra/llwindow/lldragdropwin32.h80
-rw-r--r--indra/llwindow/llkeyboardwin32.cpp2
-rw-r--r--indra/llwindow/llwindow.h6
-rw-r--r--indra/llwindow/llwindowcallbacks.cpp5
-rw-r--r--indra/llwindow/llwindowcallbacks.h15
-rw-r--r--indra/llwindow/llwindowheadless.h2
-rw-r--r--indra/llwindow/llwindowmacosx.cpp271
-rw-r--r--indra/llwindow/llwindowmacosx.h26
-rw-r--r--indra/llwindow/llwindowmesaheadless.h2
-rw-r--r--indra/llwindow/llwindowsdl.cpp157
-rw-r--r--indra/llwindow/llwindowsdl.h18
-rw-r--r--indra/llwindow/llwindowwin32.cpp85
-rw-r--r--indra/llwindow/llwindowwin32.h17
-rw-r--r--indra/llxml/llxmlnode.cpp2
-rw-r--r--indra/llxml/llxmltree.cpp3
-rw-r--r--indra/llxuixml/llinitparam.cpp41
-rw-r--r--indra/llxuixml/llinitparam.h144
-rw-r--r--indra/llxuixml/lltrans.cpp4
-rw-r--r--indra/llxuixml/lluicolor.cpp14
-rw-r--r--indra/llxuixml/lluicolor.h8
-rw-r--r--indra/llxuixml/llxuiparser.cpp36
-rw-r--r--indra/lscript/lscript_compile/indra.l1
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp17
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.h4
-rw-r--r--indra/lscript/lscript_export.h2
-rw-r--r--indra/lscript/lscript_library.h4
-rw-r--r--indra/mac_crash_logger/CMakeLists.txt4
-rw-r--r--indra/mac_updater/CMakeLists.txt1
-rw-r--r--indra/media_plugins/CMakeLists.txt2
-rw-r--r--indra/media_plugins/base/media_plugin_base.cpp58
-rw-r--r--indra/media_plugins/base/media_plugin_base.h46
-rw-r--r--indra/media_plugins/example/CMakeLists.txt74
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp490
-rw-r--r--indra/media_plugins/gstreamer010/CMakeLists.txt4
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h8
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp23
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h4
-rw-r--r--indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp80
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp2210
-rw-r--r--indra/media_plugins/webkit/CMakeLists.txt14
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp344
-rw-r--r--indra/newview/CMakeLists.txt671
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist2
-rw-r--r--indra/newview/app_settings/foldertypes.xml25
-rw-r--r--indra/newview/app_settings/ignorable_dialogs.xml560
-rw-r--r--indra/newview/app_settings/keywords.ini8
-rw-r--r--indra/newview/app_settings/settings.xml897
-rw-r--r--indra/newview/app_settings/settings_per_account.xml24
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl52
-rw-r--r--indra/newview/character/avatar_lad.xml18
-rw-r--r--indra/newview/featuretable.txt16
-rw-r--r--indra/newview/featuretable_linux.txt3
-rw-r--r--indra/newview/featuretable_mac.txt3
-rw-r--r--indra/newview/gpu_table.txt12
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/fix_application_icon_position.sh17
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/release-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/linux_tools/client-readme-voice.txt51
-rw-r--r--indra/newview/linux_tools/client-readme.txt5
-rwxr-xr-xindra/newview/linux_tools/register_secondlifeprotocol.sh22
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh2
-rw-r--r--indra/newview/llagent.cpp151
-rw-r--r--indra/newview/llagent.h14
-rw-r--r--indra/newview/llagentlistener.cpp18
-rw-r--r--indra/newview/llagentlistener.h4
-rw-r--r--indra/newview/llagentpicksinfo.cpp3
-rw-r--r--indra/newview/llagentui.cpp38
-rw-r--r--indra/newview/llagentui.h9
-rw-r--r--indra/newview/llagentwearables.cpp750
-rw-r--r--indra/newview/llagentwearables.h18
-rw-r--r--indra/newview/llappearancemgr.cpp1121
-rw-r--r--indra/newview/llappearancemgr.h291
-rw-r--r--indra/newview/llappviewer.cpp305
-rw-r--r--indra/newview/llappviewer.h23
-rw-r--r--indra/newview/llappviewerlistener.cpp14
-rw-r--r--indra/newview/llappviewerlistener.h9
-rw-r--r--indra/newview/llappviewermacosx.cpp54
-rw-r--r--indra/newview/llappviewermacosx.h3
-rw-r--r--indra/newview/llassetuploadresponders.cpp37
-rw-r--r--indra/newview/llassetuploadresponders.h1
-rw-r--r--indra/newview/llavataractions.cpp284
-rw-r--r--indra/newview/llavataractions.h69
-rw-r--r--indra/newview/llavatariconctrl.cpp93
-rw-r--r--indra/newview/llavatariconctrl.h8
-rw-r--r--indra/newview/llavatarlist.cpp146
-rw-r--r--indra/newview/llavatarlist.h37
-rw-r--r--indra/newview/llavatarlistitem.cpp442
-rw-r--r--indra/newview/llavatarlistitem.h125
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp132
-rw-r--r--indra/newview/llavatarpropertiesprocessor.h52
-rw-r--r--indra/newview/llbottomtray.cpp1124
-rw-r--r--indra/newview/llbottomtray.h141
-rw-r--r--indra/newview/llcallfloater.cpp789
-rw-r--r--indra/newview/llcallfloater.h272
-rw-r--r--indra/newview/llcallingcard.cpp52
-rw-r--r--indra/newview/llcallingcard.h1
-rw-r--r--indra/newview/llchannelmanager.cpp24
-rw-r--r--indra/newview/llchannelmanager.h12
-rw-r--r--indra/newview/llchatbar.cpp8
-rw-r--r--indra/newview/llchathistory.cpp649
-rw-r--r--indra/newview/llchathistory.h63
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp312
-rw-r--r--indra/newview/llchatitemscontainerctrl.h34
-rw-r--r--indra/newview/llchatmsgbox.cpp4
-rw-r--r--indra/newview/llchatmsgbox.h2
-rw-r--r--indra/newview/llchiclet.cpp1495
-rw-r--r--indra/newview/llchiclet.h936
-rw-r--r--indra/newview/llcolorswatch.cpp20
-rw-r--r--indra/newview/llcolorswatch.h1
-rw-r--r--indra/newview/llcommanddispatcherlistener.cpp60
-rw-r--r--indra/newview/llcommanddispatcherlistener.h31
-rw-r--r--indra/newview/llcommandhandler.cpp71
-rw-r--r--indra/newview/llcommandhandler.h5
-rw-r--r--indra/newview/llcompilequeue.cpp23
-rw-r--r--indra/newview/llcompilequeue.h4
-rw-r--r--indra/newview/llconfirmationmanager.cpp10
-rw-r--r--indra/newview/llcurrencyuimanager.cpp143
-rw-r--r--indra/newview/llcurrencyuimanager.h9
-rw-r--r--indra/newview/lldateutil.cpp87
-rw-r--r--indra/newview/lldebugmessagebox.cpp1
-rw-r--r--indra/newview/lldebugview.cpp49
-rw-r--r--indra/newview/lldebugview.h2
-rw-r--r--indra/newview/lldelayedgestureerror.cpp5
-rw-r--r--indra/newview/lldirpicker.cpp14
-rw-r--r--indra/newview/lldirpicker.h2
-rw-r--r--indra/newview/lldrawable.cpp20
-rw-r--r--indra/newview/lldrawable.h1
-rw-r--r--indra/newview/lldrawpool.cpp8
-rw-r--r--indra/newview/lldrawpoolalpha.cpp3
-rw-r--r--indra/newview/lldrawpoolavatar.h2
-rw-r--r--indra/newview/lldrawpoolbump.cpp6
-rw-r--r--indra/newview/lldrawpoolsky.cpp8
-rw-r--r--indra/newview/lldrawpoolterrain.cpp4
-rw-r--r--indra/newview/lldrawpooltree.cpp2
-rw-r--r--indra/newview/lldrawpoolwater.cpp4
-rw-r--r--indra/newview/lldrawpoolwater.h1
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp21
-rw-r--r--indra/newview/lldrawpoolwlsky.h2
-rw-r--r--indra/newview/lldriverparam.cpp64
-rw-r--r--indra/newview/lldriverparam.h11
-rw-r--r--indra/newview/lldynamictexture.cpp26
-rw-r--r--indra/newview/lleventinfo.cpp1
-rw-r--r--indra/newview/lleventinfo.h10
-rw-r--r--indra/newview/lleventnotifier.cpp9
-rw-r--r--indra/newview/lleventpoll.cpp2
-rw-r--r--indra/newview/llexpandabletextbox.cpp58
-rw-r--r--indra/newview/llexpandabletextbox.h18
-rw-r--r--indra/newview/llface.cpp231
-rw-r--r--indra/newview/llface.h27
-rw-r--r--indra/newview/llfasttimerview.cpp27
-rw-r--r--indra/newview/llfasttimerview.h1
-rw-r--r--indra/newview/llfavoritesbar.cpp536
-rw-r--r--indra/newview/llfavoritesbar.h29
-rw-r--r--indra/newview/llfeaturemanager.cpp1
-rw-r--r--indra/newview/llfeaturemanager.h10
-rw-r--r--indra/newview/llfilepicker.cpp13
-rw-r--r--indra/newview/llfilepicker.h8
-rw-r--r--indra/newview/llfirstuse.cpp47
-rw-r--r--indra/newview/llfirstuse.h7
-rw-r--r--indra/newview/llflexibleobject.cpp3
-rw-r--r--indra/newview/llfloaterabout.cpp679
-rw-r--r--indra/newview/llfloateranimpreview.cpp130
-rw-r--r--indra/newview/llfloateranimpreview.h4
-rw-r--r--indra/newview/llfloaterauction.cpp21
-rw-r--r--indra/newview/llfloateravatarpicker.cpp232
-rw-r--r--indra/newview/llfloateravatarpicker.h38
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp11
-rw-r--r--indra/newview/llfloaterbulkpermission.h3
-rw-r--r--indra/newview/llfloaterbump.cpp7
-rw-r--r--indra/newview/llfloaterbuy.cpp13
-rw-r--r--indra/newview/llfloaterbuycontents.cpp15
-rw-r--r--indra/newview/llfloaterbuycurrency.cpp3
-rw-r--r--indra/newview/llfloaterbuyland.cpp54
-rw-r--r--indra/newview/llfloatercamera.cpp132
-rw-r--r--indra/newview/llfloatercamera.h8
-rw-r--r--indra/newview/llfloaterchat.cpp76
-rw-r--r--indra/newview/llfloaterchat.h10
-rw-r--r--indra/newview/llfloaterchatterbox.cpp35
-rw-r--r--indra/newview/llfloaterchatterbox.h2
-rw-r--r--indra/newview/llfloatercolorpicker.cpp2
-rw-r--r--indra/newview/llfloatercolorpicker.h1
-rw-r--r--indra/newview/llfloaterdaycycle.cpp12
-rw-r--r--indra/newview/llfloaterdaycycle.h3
-rw-r--r--indra/newview/llfloaterenvsettings.cpp6
-rw-r--r--indra/newview/llfloaterenvsettings.h3
-rw-r--r--indra/newview/llfloaterevent.cpp324
-rw-r--r--indra/newview/llfloaterevent.h96
-rw-r--r--indra/newview/llfloaterfriends.cpp21
-rw-r--r--indra/newview/llfloaterfriends.h2
-rw-r--r--indra/newview/llfloatergesture.cpp578
-rw-r--r--indra/newview/llfloatergesture.h43
-rw-r--r--indra/newview/llfloatergodtools.cpp57
-rw-r--r--indra/newview/llfloatergodtools.h2
-rw-r--r--indra/newview/llfloatergroups.cpp13
-rw-r--r--indra/newview/llfloaterhardwaresettings.cpp18
-rw-r--r--indra/newview/llfloaterhardwaresettings.h3
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp19
-rw-r--r--indra/newview/llfloaterhud.cpp4
-rw-r--r--indra/newview/llfloaterinspect.cpp25
-rw-r--r--indra/newview/llfloaterinventory.cpp1869
-rw-r--r--indra/newview/llfloaterinventory.h350
-rw-r--r--indra/newview/llfloaterjoystick.cpp11
-rw-r--r--indra/newview/llfloaterjoystick.h2
-rw-r--r--indra/newview/llfloaterlagmeter.cpp24
-rw-r--r--indra/newview/llfloaterlagmeter.h2
-rw-r--r--indra/newview/llfloaterland.cpp223
-rw-r--r--indra/newview/llfloaterland.h19
-rw-r--r--indra/newview/llfloatermap.cpp57
-rw-r--r--indra/newview/llfloatermap.h2
-rw-r--r--indra/newview/llfloatermediasettings.cpp103
-rw-r--r--indra/newview/llfloatermediasettings.h15
-rw-r--r--indra/newview/llfloaternamedesc.cpp6
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp24
-rw-r--r--indra/newview/llfloaternotificationsconsole.h4
-rw-r--r--indra/newview/llfloateropenobject.cpp83
-rw-r--r--indra/newview/llfloateropenobject.h4
-rw-r--r--indra/newview/llfloaterparcel.cpp6
-rw-r--r--indra/newview/llfloaterpay.cpp11
-rw-r--r--indra/newview/llfloaterperms.cpp1
-rw-r--r--indra/newview/llfloaterpostcard.cpp18
-rw-r--r--indra/newview/llfloaterpostcard.h4
-rw-r--r--indra/newview/llfloaterpostprocess.cpp6
-rw-r--r--indra/newview/llfloaterpreference.cpp648
-rw-r--r--indra/newview/llfloaterpreference.h50
-rw-r--r--indra/newview/llfloaterproperties.cpp13
-rw-r--r--indra/newview/llfloaterregioninfo.cpp254
-rw-r--r--indra/newview/llfloaterregioninfo.h30
-rw-r--r--indra/newview/llfloaterreporter.cpp143
-rw-r--r--indra/newview/llfloaterreporter.h9
-rw-r--r--indra/newview/llfloaterscriptdebug.cpp2
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp1288
-rw-r--r--indra/newview/llfloaterscriptlimits.h269
-rw-r--r--indra/newview/llfloatersearch.cpp118
-rw-r--r--indra/newview/llfloatersearch.h10
-rw-r--r--indra/newview/llfloatersellland.cpp40
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp2
-rw-r--r--indra/newview/llfloatersnapshot.cpp74
-rw-r--r--indra/newview/llfloatersnapshot.h1
-rw-r--r--indra/newview/llfloatertelehub.cpp11
-rw-r--r--indra/newview/llfloatertestinspectors.cpp7
-rw-r--r--indra/newview/llfloatertestlistview.cpp40
-rw-r--r--indra/newview/llfloatertestlistview.h15
-rw-r--r--indra/newview/llfloatertools.cpp210
-rw-r--r--indra/newview/llfloatertools.h5
-rw-r--r--indra/newview/llfloatertopobjects.cpp23
-rw-r--r--indra/newview/llfloatertos.cpp4
-rw-r--r--indra/newview/llfloateruipreview.cpp32
-rw-r--r--indra/newview/llfloaterurldisplay.cpp5
-rw-r--r--indra/newview/llfloaterurlentry.cpp8
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp58
-rw-r--r--indra/newview/llfloatervoicedevicesettings.h2
-rw-r--r--indra/newview/llfloaterwater.cpp48
-rw-r--r--indra/newview/llfloaterwater.h4
-rw-r--r--indra/newview/llfloaterwhitelistentry.cpp3
-rw-r--r--indra/newview/llfloaterwindlight.cpp61
-rw-r--r--indra/newview/llfloaterwindlight.h4
-rw-r--r--indra/newview/llfloaterwindowsize.cpp164
-rw-r--r--indra/newview/llfloaterwindowsize.h41
-rw-r--r--indra/newview/llfloaterworldmap.cpp303
-rw-r--r--indra/newview/llfloaterworldmap.h15
-rw-r--r--indra/newview/llfolderview.cpp289
-rw-r--r--indra/newview/llfolderview.h54
-rw-r--r--indra/newview/llfoldervieweventlistener.h9
-rw-r--r--indra/newview/llfolderviewitem.cpp318
-rw-r--r--indra/newview/llfolderviewitem.h54
-rw-r--r--indra/newview/llfriendcard.cpp266
-rw-r--r--indra/newview/llfriendcard.h38
-rw-r--r--indra/newview/llgesturemgr.cpp157
-rw-r--r--indra/newview/llgesturemgr.h39
-rw-r--r--indra/newview/llglsandbox.cpp5
-rw-r--r--indra/newview/llgroupactions.cpp91
-rw-r--r--indra/newview/llgroupactions.h12
-rw-r--r--indra/newview/llgroupiconctrl.cpp146
-rw-r--r--indra/newview/llgroupiconctrl.h92
-rw-r--r--indra/newview/llgrouplist.cpp148
-rw-r--r--indra/newview/llgrouplist.h27
-rw-r--r--indra/newview/llgroupmgr.cpp75
-rw-r--r--indra/newview/llgroupmgr.h16
-rw-r--r--indra/newview/llhudicon.cpp26
-rw-r--r--indra/newview/llhudrender.cpp19
-rw-r--r--indra/newview/llhudtext.cpp22
-rw-r--r--indra/newview/llhudview.cpp14
-rw-r--r--indra/newview/llhudview.h2
-rw-r--r--indra/newview/llimfloater.cpp587
-rw-r--r--indra/newview/llimfloater.h42
-rw-r--r--indra/newview/llimfloatercontainer.cpp167
-rw-r--r--indra/newview/llimfloatercontainer.h76
-rw-r--r--indra/newview/llimhandler.cpp3
-rw-r--r--indra/newview/llimpanel.cpp30
-rw-r--r--indra/newview/llimpanel.h1
-rw-r--r--indra/newview/llimview.cpp1548
-rw-r--r--indra/newview/llimview.h239
-rw-r--r--indra/newview/llinspect.cpp66
-rw-r--r--indra/newview/llinspect.h9
-rw-r--r--indra/newview/llinspectavatar.cpp407
-rw-r--r--indra/newview/llinspectgroup.cpp3
-rw-r--r--indra/newview/llinspectobject.cpp173
-rw-r--r--indra/newview/llinspectremoteobject.cpp214
-rw-r--r--indra/newview/llinspectremoteobject.h40
-rw-r--r--indra/newview/llinspecttoast.cpp122
-rw-r--r--indra/newview/llinspecttoast.h40
-rw-r--r--indra/newview/llinventorybridge.cpp1733
-rw-r--r--indra/newview/llinventorybridge.h111
-rw-r--r--indra/newview/llinventoryfilter.cpp405
-rw-r--r--indra/newview/llinventoryfilter.h206
-rw-r--r--indra/newview/llinventoryfunctions.cpp373
-rw-r--r--indra/newview/llinventoryfunctions.h118
-rw-r--r--indra/newview/llinventorymodel.cpp1182
-rw-r--r--indra/newview/llinventorymodel.h399
-rw-r--r--indra/newview/llinventoryobserver.cpp596
-rw-r--r--indra/newview/llinventoryobserver.h254
-rw-r--r--indra/newview/llinventorypanel.cpp985
-rw-r--r--indra/newview/llinventorypanel.h226
-rw-r--r--indra/newview/lljoystickbutton.cpp54
-rw-r--r--indra/newview/lljoystickbutton.h10
-rw-r--r--indra/newview/lllandmarkactions.cpp85
-rw-r--r--indra/newview/lllandmarkactions.h15
-rw-r--r--indra/newview/lllandmarklist.cpp12
-rw-r--r--indra/newview/lllocaltextureobject.cpp5
-rw-r--r--indra/newview/lllocationhistory.cpp19
-rw-r--r--indra/newview/lllocationhistory.h10
-rw-r--r--indra/newview/lllocationinputctrl.cpp514
-rw-r--r--indra/newview/lllocationinputctrl.h59
-rw-r--r--indra/newview/lllogchat.cpp385
-rw-r--r--indra/newview/lllogchat.h55
-rw-r--r--indra/newview/llloginhandler.cpp60
-rw-r--r--indra/newview/llloginhandler.h6
-rw-r--r--indra/newview/lllogininstance.cpp47
-rw-r--r--indra/newview/lllogininstance.h2
-rw-r--r--indra/newview/llmanip.cpp17
-rw-r--r--indra/newview/llmaniprotate.cpp13
-rw-r--r--indra/newview/llmanipscale.cpp10
-rw-r--r--indra/newview/llmaniptranslate.cpp81
-rw-r--r--indra/newview/llmaniptranslate.h13
-rw-r--r--indra/newview/llmediactrl.cpp389
-rw-r--r--indra/newview/llmediactrl.h7
-rwxr-xr-xindra/newview/llmediadataclient.cpp763
-rwxr-xr-xindra/newview/llmediadataclient.h117
-rw-r--r--indra/newview/llmemoryview.cpp4
-rw-r--r--indra/newview/llmenucommands.cpp4
-rw-r--r--indra/newview/llmorphview.cpp4
-rw-r--r--indra/newview/llmoveview.cpp165
-rw-r--r--indra/newview/llmoveview.h34
-rw-r--r--indra/newview/llmutelist.cpp90
-rw-r--r--indra/newview/llmutelist.h9
-rw-r--r--indra/newview/llnamebox.cpp35
-rw-r--r--indra/newview/llnamebox.h6
-rw-r--r--indra/newview/llnamelistctrl.cpp94
-rw-r--r--indra/newview/llnamelistctrl.h24
-rw-r--r--indra/newview/llnavigationbar.cpp322
-rw-r--r--indra/newview/llnavigationbar.h63
-rw-r--r--indra/newview/llnearbychat.cpp261
-rw-r--r--indra/newview/llnearbychat.h29
-rw-r--r--indra/newview/llnearbychatbar.cpp307
-rw-r--r--indra/newview/llnearbychatbar.h59
-rw-r--r--indra/newview/llnearbychathandler.cpp107
-rw-r--r--indra/newview/llnearbychathandler.h2
-rw-r--r--indra/newview/llnetmap.cpp85
-rw-r--r--indra/newview/llnetmap.h15
-rw-r--r--indra/newview/llnotificationalerthandler.cpp23
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp19
-rw-r--r--indra/newview/llnotificationhandler.h111
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp278
-rw-r--r--indra/newview/llnotificationmanager.cpp14
-rw-r--r--indra/newview/llnotificationmanager.h2
-rw-r--r--indra/newview/llnotificationofferhandler.cpp188
-rw-r--r--indra/newview/llnotificationscripthandler.cpp73
-rw-r--r--indra/newview/llnotificationtiphandler.cpp71
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp96
-rw-r--r--indra/newview/lloutputmonitorctrl.h32
-rw-r--r--indra/newview/lloverlaybar.cpp9
-rw-r--r--indra/newview/llpanelappearancetab.h4
-rw-r--r--indra/newview/llpanelavatar.cpp402
-rw-r--r--indra/newview/llpanelavatar.h87
-rw-r--r--indra/newview/llpanelavatartag.cpp2
-rw-r--r--indra/newview/llpanelblockedlist.cpp15
-rw-r--r--indra/newview/llpanelblockedlist.h2
-rw-r--r--indra/newview/llpanelclassified.cpp655
-rw-r--r--indra/newview/llpanelclassified.h153
-rw-r--r--indra/newview/llpanelcontents.cpp15
-rw-r--r--indra/newview/llpanelcontents.h11
-rw-r--r--indra/newview/llpanelface.cpp60
-rw-r--r--indra/newview/llpanelgroup.cpp244
-rw-r--r--indra/newview/llpanelgroup.h39
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp39
-rw-r--r--indra/newview/llpanelgroupinvite.cpp51
-rw-r--r--indra/newview/llpanelgroupinvite.h4
-rw-r--r--indra/newview/llpanelgroupnotices.cpp11
-rw-r--r--indra/newview/llpanelgrouproles.cpp172
-rw-r--r--indra/newview/llpanelgrouproles.h17
-rw-r--r--indra/newview/llpanelhome.cpp79
-rw-r--r--indra/newview/llpanelhome.h64
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp186
-rw-r--r--indra/newview/llpanelimcontrolpanel.h44
-rw-r--r--indra/newview/llpanelland.cpp6
-rw-r--r--indra/newview/llpanelland.h1
-rw-r--r--indra/newview/llpanellandaudio.cpp69
-rw-r--r--indra/newview/llpanellandaudio.h4
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp476
-rw-r--r--indra/newview/llpanellandmarkinfo.h86
-rw-r--r--indra/newview/llpanellandmarks.cpp636
-rw-r--r--indra/newview/llpanellandmarks.h85
-rw-r--r--indra/newview/llpanellogin.cpp241
-rw-r--r--indra/newview/llpanellogin.h15
-rw-r--r--indra/newview/llpanelloginlistener.cpp34
-rw-r--r--indra/newview/llpanelloginlistener.h30
-rw-r--r--indra/newview/llpanelmaininventory.cpp1182
-rw-r--r--indra/newview/llpanelmaininventory.h159
-rw-r--r--indra/newview/llpanelme.cpp288
-rw-r--r--indra/newview/llpanelme.h111
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp969
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.h37
-rw-r--r--indra/newview/llpanelmediasettingspermissions.cpp154
-rw-r--r--indra/newview/llpanelmediasettingspermissions.h48
-rw-r--r--indra/newview/llpanelmediasettingssecurity.cpp677
-rw-r--r--indra/newview/llpanelmediasettingssecurity.h59
-rw-r--r--indra/newview/llpanelnearbymedia.cpp1197
-rw-r--r--indra/newview/llpanelnearbymedia.h185
-rw-r--r--indra/newview/llpanelobject.cpp9
-rw-r--r--indra/newview/llpanelobject.h1
-rw-r--r--indra/newview/llpanelobjectinventory.cpp1966
-rw-r--r--indra/newview/llpanelobjectinventory.h105
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp654
-rw-r--r--indra/newview/llpaneloutfitsinventory.h134
-rw-r--r--indra/newview/llpanelpeople.cpp467
-rw-r--r--indra/newview/llpanelpeople.h39
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp67
-rw-r--r--indra/newview/llpanelpeoplemenus.h5
-rw-r--r--indra/newview/llpanelpermissions.cpp771
-rw-r--r--indra/newview/llpanelpermissions.h3
-rw-r--r--indra/newview/llpanelpick.cpp186
-rw-r--r--indra/newview/llpanelpick.h37
-rw-r--r--indra/newview/llpanelpicks.cpp685
-rw-r--r--indra/newview/llpanelpicks.h113
-rw-r--r--indra/newview/llpanelplace.cpp6
-rw-r--r--indra/newview/llpanelplaceinfo.cpp972
-rw-r--r--indra/newview/llpanelplaceinfo.h161
-rw-r--r--indra/newview/llpanelplaceprofile.cpp606
-rw-r--r--indra/newview/llpanelplaceprofile.h123
-rw-r--r--indra/newview/llpanelplaces.cpp640
-rw-r--r--indra/newview/llpanelplaces.h45
-rw-r--r--indra/newview/llpanelplacestab.cpp14
-rw-r--r--indra/newview/llpanelplacestab.h14
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp745
-rw-r--r--indra/newview/llpanelprimmediacontrols.h86
-rw-r--r--indra/newview/llpanelprofile.cpp119
-rw-r--r--indra/newview/llpanelprofile.h8
-rw-r--r--indra/newview/llpanelprofileview.cpp79
-rw-r--r--indra/newview/llpanelprofileview.h31
-rw-r--r--indra/newview/llpanelteleporthistory.cpp402
-rw-r--r--indra/newview/llpanelteleporthistory.h9
-rw-r--r--indra/newview/llpanelvolume.cpp5
-rw-r--r--indra/newview/llpanelvolume.h1
-rw-r--r--indra/newview/llpanelvolumepulldown.cpp152
-rw-r--r--indra/newview/llpanelvolumepulldown.h64
-rw-r--r--indra/newview/llparticipantlist.cpp652
-rw-r--r--indra/newview/llparticipantlist.h219
-rw-r--r--indra/newview/llplacesinventorybridge.cpp7
-rw-r--r--indra/newview/llplacesinventorypanel.cpp218
-rw-r--r--indra/newview/llplacesinventorypanel.h98
-rw-r--r--indra/newview/llpreview.cpp14
-rw-r--r--indra/newview/llpreview.h4
-rw-r--r--indra/newview/llpreviewanim.cpp2
-rw-r--r--indra/newview/llpreviewgesture.cpp42
-rw-r--r--indra/newview/llpreviewgesture.h5
-rw-r--r--indra/newview/llpreviewnotecard.cpp19
-rw-r--r--indra/newview/llpreviewscript.cpp58
-rw-r--r--indra/newview/llpreviewscript.h3
-rw-r--r--indra/newview/llpreviewsound.cpp2
-rw-r--r--indra/newview/llpreviewtexture.cpp345
-rw-r--r--indra/newview/llpreviewtexture.h16
-rw-r--r--indra/newview/llprogressview.cpp32
-rw-r--r--indra/newview/llprogressview.h6
-rw-r--r--indra/newview/llrecentpeople.cpp17
-rw-r--r--indra/newview/llremoteparcelrequest.h1
-rw-r--r--indra/newview/llresourcedata.h3
-rw-r--r--indra/newview/llrootview.h1
-rw-r--r--indra/newview/llscreenchannel.cpp428
-rw-r--r--indra/newview/llscreenchannel.h51
-rw-r--r--indra/newview/llscriptfloater.cpp537
-rw-r--r--indra/newview/llscriptfloater.h211
-rw-r--r--indra/newview/llscrollingpanelparam.cpp17
-rw-r--r--indra/newview/llsearchcombobox.cpp3
-rw-r--r--indra/newview/llsearchhistory.h11
-rw-r--r--indra/newview/llselectmgr.cpp220
-rw-r--r--indra/newview/llselectmgr.h10
-rw-r--r--indra/newview/llsidepanelappearance.cpp405
-rw-r--r--indra/newview/llsidepanelappearance.h106
-rw-r--r--indra/newview/llsidepanelinventory.cpp325
-rw-r--r--indra/newview/llsidepanelinventory.h96
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.cpp151
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.h81
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp942
-rw-r--r--indra/newview/llsidepaneliteminfo.h90
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp1199
-rw-r--r--indra/newview/llsidepaneltaskinfo.h126
-rw-r--r--indra/newview/llsidetray.cpp386
-rw-r--r--indra/newview/llsidetray.h48
-rw-r--r--indra/newview/llsidetraypanelcontainer.cpp25
-rw-r--r--indra/newview/llsidetraypanelcontainer.h2
-rw-r--r--indra/newview/llslurl.cpp23
-rw-r--r--indra/newview/llslurl.h2
-rw-r--r--indra/newview/llspatialpartition.cpp11
-rw-r--r--indra/newview/llspeakbutton.cpp186
-rw-r--r--indra/newview/llspeakbutton.h100
-rw-r--r--indra/newview/llspeakers.cpp326
-rw-r--r--indra/newview/llspeakers.h148
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp288
-rw-r--r--indra/newview/llspeakingindicatormanager.h67
-rw-r--r--indra/newview/llstartup.cpp381
-rw-r--r--indra/newview/llstartup.h9
-rw-r--r--indra/newview/llstartuplistener.cpp34
-rw-r--r--indra/newview/llstartuplistener.h30
-rw-r--r--indra/newview/llstatusbar.cpp217
-rw-r--r--indra/newview/llstatusbar.h21
-rw-r--r--indra/newview/llstylemap.cpp4
-rw-r--r--indra/newview/llsurface.cpp7
-rw-r--r--indra/newview/llsurfacepatch.cpp4
-rw-r--r--indra/newview/llsyswellitem.cpp3
-rw-r--r--indra/newview/llsyswellwindow.cpp866
-rw-r--r--indra/newview/llsyswellwindow.h156
-rw-r--r--indra/newview/llteleporthistory.cpp12
-rw-r--r--indra/newview/llteleporthistory.h3
-rw-r--r--indra/newview/llteleporthistorystorage.cpp7
-rw-r--r--indra/newview/lltexglobalcolor.cpp4
-rw-r--r--indra/newview/lltexglobalcolor.h2
-rw-r--r--indra/newview/lltexlayer.cpp235
-rw-r--r--indra/newview/lltexlayer.h25
-rw-r--r--indra/newview/lltexlayerparams.cpp41
-rw-r--r--indra/newview/lltexlayerparams.h18
-rw-r--r--indra/newview/lltexturecache.cpp1371
-rw-r--r--indra/newview/lltexturecache.h71
-rw-r--r--indra/newview/lltexturectrl.cpp40
-rw-r--r--indra/newview/lltexturectrl.h8
-rw-r--r--indra/newview/lltexturefetch.cpp1242
-rw-r--r--indra/newview/lltexturefetch.h42
-rw-r--r--indra/newview/lltextureinfo.cpp290
-rw-r--r--indra/newview/lltextureinfo.h80
-rw-r--r--indra/newview/lltextureinfodetails.cpp40
-rw-r--r--indra/newview/lltextureinfodetails.h58
-rw-r--r--indra/newview/lltexturestats.cpp61
-rw-r--r--indra/newview/lltexturestats.h41
-rw-r--r--indra/newview/lltexturestatsuploader.cpp61
-rw-r--r--indra/newview/lltexturestatsuploader.h48
-rw-r--r--indra/newview/lltextureview.cpp357
-rw-r--r--indra/newview/lltextureview.h27
-rw-r--r--indra/newview/lltoast.cpp211
-rw-r--r--indra/newview/lltoast.h51
-rw-r--r--indra/newview/lltoastalertpanel.cpp111
-rw-r--r--indra/newview/lltoastalertpanel.h13
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp54
-rw-r--r--indra/newview/lltoastgroupnotifypanel.h2
-rw-r--r--indra/newview/lltoastimpanel.cpp198
-rw-r--r--indra/newview/lltoastimpanel.h21
-rw-r--r--indra/newview/lltoastnotifypanel.cpp306
-rw-r--r--indra/newview/lltoastnotifypanel.h18
-rw-r--r--indra/newview/lltoastpanel.cpp11
-rw-r--r--indra/newview/lltoastpanel.h4
-rw-r--r--indra/newview/lltoolbar.cpp60
-rw-r--r--indra/newview/lltoolbrush.cpp5
-rw-r--r--indra/newview/lltooldraganddrop.cpp448
-rw-r--r--indra/newview/lltooldraganddrop.h27
-rw-r--r--indra/newview/lltoolfocus.cpp6
-rw-r--r--indra/newview/lltoolgrab.cpp20
-rw-r--r--indra/newview/lltoolgun.cpp4
-rw-r--r--indra/newview/lltoolmgr.cpp6
-rw-r--r--indra/newview/lltoolmorph.cpp8
-rw-r--r--indra/newview/lltoolpie.cpp772
-rw-r--r--indra/newview/lltoolpie.h11
-rw-r--r--indra/newview/lltoolplacer.cpp6
-rw-r--r--indra/newview/lltoolplacer.h1
-rw-r--r--indra/newview/lltracker.cpp7
-rw-r--r--indra/newview/lltransientdockablefloater.cpp25
-rw-r--r--indra/newview/lltransientdockablefloater.h4
-rw-r--r--indra/newview/lltransientfloatermgr.cpp71
-rw-r--r--indra/newview/lltransientfloatermgr.h47
-rw-r--r--indra/newview/lluilistener.cpp12
-rw-r--r--indra/newview/lluilistener.h6
-rw-r--r--indra/newview/llurldispatcher.cpp21
-rw-r--r--indra/newview/llurldispatcherlistener.cpp58
-rw-r--r--indra/newview/llurldispatcherlistener.h32
-rw-r--r--indra/newview/llurlhistory.cpp2
-rw-r--r--indra/newview/llurlwhitelist.cpp6
-rw-r--r--indra/newview/llversioninfo.cpp109
-rw-r--r--indra/newview/llversioninfo.h71
-rw-r--r--indra/newview/llviewerassetstorage.cpp8
-rw-r--r--indra/newview/llviewerassettype.cpp113
-rw-r--r--indra/newview/llviewerassettype.h54
-rw-r--r--indra/newview/llvieweraudio.cpp59
-rw-r--r--indra/newview/llviewercamera.cpp60
-rw-r--r--indra/newview/llviewercamera.h19
-rw-r--r--indra/newview/llviewerchat.cpp221
-rw-r--r--indra/newview/llviewerchat.h52
-rw-r--r--indra/newview/llviewercontrol.cpp90
-rw-r--r--indra/newview/llviewercontrollistener.cpp20
-rw-r--r--indra/newview/llviewercontrollistener.h4
-rw-r--r--indra/newview/llviewerdisplay.cpp125
-rw-r--r--indra/newview/llviewerfloaterreg.cpp48
-rw-r--r--indra/newview/llviewerfoldertype.cpp277
-rw-r--r--indra/newview/llviewerfoldertype.h59
-rw-r--r--indra/newview/llviewergenericmessage.h1
-rw-r--r--indra/newview/llviewerhelp.cpp73
-rw-r--r--indra/newview/llviewerhelp.h10
-rw-r--r--indra/newview/llviewerhelputil.cpp63
-rw-r--r--indra/newview/llviewerhelputil.h4
-rw-r--r--indra/newview/llviewerhome.cpp83
-rw-r--r--indra/newview/llviewerhome.h49
-rw-r--r--indra/newview/llviewerinventory.cpp531
-rw-r--r--indra/newview/llviewerinventory.h27
-rw-r--r--indra/newview/llviewerjoint.cpp20
-rw-r--r--indra/newview/llviewerjoint.h3
-rw-r--r--indra/newview/llviewerjointmesh.cpp3
-rw-r--r--indra/newview/llviewerjointmesh.h1
-rw-r--r--indra/newview/llviewerkeyboard.cpp3
-rw-r--r--indra/newview/llviewermedia.cpp1207
-rw-r--r--indra/newview/llviewermedia.h184
-rw-r--r--indra/newview/llviewermedia_streamingaudio.cpp31
-rw-r--r--indra/newview/llviewermediafocus.cpp144
-rw-r--r--indra/newview/llviewermediafocus.h13
-rw-r--r--indra/newview/llviewermenu.cpp1248
-rw-r--r--indra/newview/llviewermenu.h39
-rw-r--r--indra/newview/llviewermenufile.cpp192
-rw-r--r--indra/newview/llviewermenufile.h7
-rw-r--r--indra/newview/llviewermessage.cpp1328
-rw-r--r--indra/newview/llviewermessage.h19
-rw-r--r--indra/newview/llviewernetwork.cpp6
-rw-r--r--indra/newview/llviewerobject.cpp30
-rw-r--r--indra/newview/llviewerobject.h3
-rw-r--r--indra/newview/llviewerobjectlist.cpp8
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewerparcelmedia.cpp90
-rw-r--r--indra/newview/llviewerparcelmedia.h2
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.cpp16
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.h4
-rw-r--r--indra/newview/llviewerparcelmgr.cpp209
-rw-r--r--indra/newview/llviewerparcelmgr.h32
-rw-r--r--indra/newview/llviewerparceloverlay.cpp3
-rw-r--r--indra/newview/llviewerpartsim.cpp11
-rw-r--r--indra/newview/llviewerprecompiledheaders.h108
-rw-r--r--indra/newview/llviewerregion.cpp7
-rw-r--r--indra/newview/llviewershadermgr.cpp3
-rw-r--r--indra/newview/llviewerstats.cpp33
-rw-r--r--indra/newview/llviewerstats.h4
-rw-r--r--indra/newview/llviewertexteditor.cpp58
-rw-r--r--indra/newview/llviewertexture.cpp1349
-rw-r--r--indra/newview/llviewertexture.h202
-rw-r--r--indra/newview/llviewertexturelist.cpp233
-rw-r--r--indra/newview/llviewertexturelist.h36
-rw-r--r--indra/newview/llviewervisualparam.cpp1
-rw-r--r--indra/newview/llviewervisualparam.h1
-rw-r--r--indra/newview/llviewerwindow.cpp921
-rw-r--r--indra/newview/llviewerwindow.h70
-rw-r--r--indra/newview/llviewerwindowlistener.cpp21
-rw-r--r--indra/newview/llviewerwindowlistener.h9
-rw-r--r--indra/newview/llvlcomposition.cpp18
-rw-r--r--indra/newview/llvoavatar.cpp311
-rw-r--r--indra/newview/llvoavatar.h22
-rw-r--r--indra/newview/llvoavatardefines.cpp23
-rw-r--r--indra/newview/llvoavatarself.cpp315
-rw-r--r--indra/newview/llvoavatarself.h21
-rw-r--r--indra/newview/llvoclouds.cpp2
-rw-r--r--indra/newview/llvoclouds.h2
-rw-r--r--indra/newview/llvograss.cpp8
-rw-r--r--indra/newview/llvograss.h2
-rw-r--r--indra/newview/llvoground.cpp2
-rw-r--r--indra/newview/llvoground.h2
-rw-r--r--indra/newview/llvoicechannel.cpp147
-rw-r--r--indra/newview/llvoicechannel.h35
-rw-r--r--indra/newview/llvoiceclient.cpp363
-rw-r--r--indra/newview/llvoiceclient.h13
-rw-r--r--indra/newview/llvoicevisualizer.cpp11
-rw-r--r--indra/newview/llvopartgroup.cpp11
-rw-r--r--indra/newview/llvopartgroup.h2
-rw-r--r--indra/newview/llvosky.cpp23
-rw-r--r--indra/newview/llvosky.h8
-rw-r--r--indra/newview/llvosurfacepatch.cpp2
-rw-r--r--indra/newview/llvosurfacepatch.h2
-rw-r--r--indra/newview/llvotextbubble.cpp2
-rw-r--r--indra/newview/llvotextbubble.h2
-rw-r--r--indra/newview/llvotree.cpp8
-rw-r--r--indra/newview/llvotree.h2
-rw-r--r--indra/newview/llvotreenew.h2
-rw-r--r--indra/newview/llvovolume.cpp666
-rw-r--r--indra/newview/llvovolume.h34
-rw-r--r--indra/newview/llvowater.cpp4
-rw-r--r--indra/newview/llvowater.h2
-rw-r--r--indra/newview/llvowlsky.cpp45
-rw-r--r--indra/newview/llwaterparammanager.cpp11
-rw-r--r--indra/newview/llwearable.cpp170
-rw-r--r--indra/newview/llwearable.h27
-rw-r--r--indra/newview/llwearablelist.cpp18
-rw-r--r--indra/newview/llwearablelist.h1
-rw-r--r--indra/newview/llweb.cpp72
-rw-r--r--indra/newview/llweb.h5
-rw-r--r--indra/newview/llwldaycycle.cpp8
-rw-r--r--indra/newview/llwlparammanager.cpp13
-rw-r--r--indra/newview/llworld.cpp1
-rw-r--r--indra/newview/llworldmap.cpp1174
-rw-r--r--indra/newview/llworldmap.h332
-rw-r--r--indra/newview/llworldmapmessage.cpp262
-rw-r--r--indra/newview/llworldmapmessage.h83
-rw-r--r--indra/newview/llworldmapview.cpp1253
-rw-r--r--indra/newview/llworldmapview.h51
-rw-r--r--indra/newview/llworldmipmap.cpp274
-rw-r--r--indra/newview/llworldmipmap.h100
-rw-r--r--indra/newview/llxmlrpclistener.cpp5
-rw-r--r--indra/newview/llxmlrpctransaction.cpp5
-rw-r--r--indra/newview/pipeline.cpp159
-rw-r--r--indra/newview/pipeline.h6
-rw-r--r--indra/newview/res/viewerRes.rc8
-rw-r--r--indra/newview/skins/default/colors.xml159
-rw-r--r--indra/newview/skins/default/html/da/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/de/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/en-us/loading/loading.html18
-rw-r--r--indra/newview/skins/default/html/es/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/fr/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/hu/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/it/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/ja/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/nl/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/pl/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/pt/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/ru/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/tr/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/uk/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/zh/loading/loading.html20
-rw-r--r--indra/newview/skins/default/textures/Blank.pngbin0 -> 110 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.pngbin0 -> 700 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.pngbin0 -> 754 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.pngbin0 -> 914 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.pngbin0 -> 959 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.pngbin0 -> 1087 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.pngbin0 -> 945 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.pngbin0 -> 1049 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.pngbin393 -> 3347 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Notices_Unread.pngbin0 -> 3693 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Snapshot_Off.pngbin332 -> 3204 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.pngbin0 -> 334 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Unread_IM.pngbin297 -> 458 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/WellButton_Lit.pngbin0 -> 309 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.pngbin0 -> 309 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cone_Selected.pngbin0 -> 576 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cube_Selected.pngbin0 -> 477 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cylinder_Selected.pngbin0 -> 443 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Grass_Selected.pngbin0 -> 757 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.pngbin0 -> 531 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.pngbin0 -> 463 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.pngbin0 -> 696 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Prism_Selected.pngbin0 -> 485 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Pyramid_Selected.pngbin0 -> 594 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Ring_Selected.pngbin0 -> 738 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Sphere_Selected.pngbin0 -> 1003 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.pngbin0 -> 558 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Torus_Selected.pngbin0 -> 825 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tree_Selected.pngbin0 -> 839 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tube_Selected.pngbin0 -> 552 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_Selected.pngbin0 -> 228 bytes
-rw-r--r--indra/newview/skins/default/textures/default_profile_picture.j2cbin6128 -> 1512 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_event_adult.tgabin648 -> 1006 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_top_pick.tgabin858 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/AudioMute_Off.pngbin0 -> 600 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/AudioMute_Over.pngbin0 -> 587 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Audio_Off.pngbin0 -> 467 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Audio_Press.pngbin0 -> 477 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/ExternalBrowser_Off.pngbin0 -> 279 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/ForSale_Badge.pngbin0 -> 5727 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Group.pngbin3354 -> 1523 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Object_Small.pngbin0 -> 410 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Alpha.pngbin0 -> 319 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Landmark.pngbin532 -> 582 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LinkFolder.pngbin0 -> 296 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LinkItem.pngbin0 -> 296 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.pngbin0 -> 391 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.pngbin0 -> 538 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Shoe.pngbin276 -> 54133 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Tattoo.pngbin0 -> 416 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/MinusItem_Disabled.pngbin0 -> 173 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/MinusItem_Off.pngbin0 -> 178 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/MinusItem_Press.pngbin0 -> 172 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.pngbin0 -> 516 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.pngbin0 -> 505 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Build_Dark.pngbin0 -> 343 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.pngbin0 -> 457 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.pngbin0 -> 325 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.pngbin0 -> 285 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Exp_Color.pngbin0 -> 272 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.pngbin0 -> 3221 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.pngbin0 -> 3235 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.pngbin0 -> 3077 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.pngbin0 -> 561 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Health_Dark.pngbin0 -> 285 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_M_Dark.pngbin0 -> 348 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_M_Light.pngbin0 -> 335 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.pngbin0 -> 620 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_PG_Dark.pngbin0 -> 400 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_PG_Light.pngbin0 -> 403 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.pngbin0 -> 523 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.pngbin0 -> 516 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Push_Dark.pngbin0 -> 430 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_R_Dark.pngbin0 -> 357 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_R_Light.pngbin0 -> 355 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.pngbin0 -> 620 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.pngbin0 -> 471 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.pngbin0 -> 492 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.pngbin0 -> 516 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.pngbin0 -> 380 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Voice_Light.pngbin0 -> 405 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Pause_Off.pngbin0 -> 163 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Pause_Over.pngbin0 -> 160 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Pause_Press.pngbin0 -> 156 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Play_Off.pngbin0 -> 293 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Play_Over.pngbin0 -> 258 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Play_Press.pngbin0 -> 287 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/SL_Logo.pngbin0 -> 973 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/SkipBackward_Off.pngbin0 -> 293 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/SkipForward_Off.pngbin0 -> 304 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/StopReload_Off.pngbin0 -> 533 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/StopReload_Over.pngbin0 -> 529 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Stop_Off.pngbin0 -> 148 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/UnZoom_Off.pngbin0 -> 423 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/YouAreHere_Badge.pngbin0 -> 6143 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Zoom_Off.pngbin0 -> 435 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/avaline_default_icon.jpgbin0 -> 3951 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/object_icon.pngbin0 -> 410 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EVRY.pngbin0 -> 393 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EXP.pngbin0 -> 272 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_M.pngbin0 -> 306 bytes
-rw-r--r--indra/newview/skins/default/textures/inv_folder_inbox.tgabin0 -> 2085 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_16.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_32.tgabin0 -> 2894 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_8.tgabin300 -> 300 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_above_32.tgabin0 -> 2909 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_below_32.tgabin0 -> 3037 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_you_32.tgabin0 -> 3395 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_adult.tgabin648 -> 1006 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_mature.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/map_home.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/map_infohub.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/map_telehub.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/BuyArrow_Over.pngbin2985 -> 2956 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/BuyArrow_Press.pngbin249 -> 2949 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Favorite_Link_Over.pngbin0 -> 191 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Flag.pngbin0 -> 338 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Lock.pngbin0 -> 302 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/NavBar_BG.pngbin210 -> 195 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.pngbin335 -> 405 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.pngbin456 -> 653 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml532
-rw-r--r--indra/newview/skins/default/textures/widgets/Arrow_Small_Left.pngbin0 -> 223 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Arrow_Small_Right.pngbin0 -> 217 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Arrow_Small_Up.pngbin0 -> 382 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_UpOff.pngbin0 -> 466 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.pngbin0 -> 536 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.pngbin0 -> 482 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Linden_Dollar_Background.pngbin9506 -> 56298 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Opaque.pngbin0 -> 311 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over_Opaque.pngbin0 -> 330 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Opaque.pngbin0 -> 311 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over_Opaque.pngbin0 -> 324 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Tooltip.pngbin0 -> 2910 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/jump_left_in.pngbin0 -> 342 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/jump_left_out.pngbin0 -> 321 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/jump_right_in.pngbin0 -> 320 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/jump_right_out.pngbin0 -> 315 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.pngbin0 -> 260 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Inspector_I.pngbin0 -> 548 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Volume_Background.pngbin0 -> 589 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/startup_logo.pngbin0 -> 2457 bytes
-rw-r--r--indra/newview/skins/default/textures/world/BeaconArrow.pngbin0 -> 994 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml71
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml370
-rw-r--r--indra/newview/skins/default/xui/da/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_animation_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/da/floater_auction.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_avatar_picker.xml46
-rw-r--r--indra/newview/skins/default/xui/da/floater_avatar_textures.xml54
-rw-r--r--indra/newview/skins/default/xui/da/floater_beacons.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_build_options.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/da/floater_bumps.xml31
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_contents.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml84
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_land.xml26
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_object.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/da/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_color_picker.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_customize.xml88
-rw-r--r--indra/newview/skins/default/xui/da/floater_day_cycle_options.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_device_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_env_settings.xml22
-rw-r--r--indra/newview/skins/default/xui/da/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_gesture.xml37
-rw-r--r--indra/newview/skins/default/xui/da/floater_hardware_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_help_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_hud.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_image_preview.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_incoming_call.xml21
-rw-r--r--indra/newview/skins/default/xui/da/floater_inspect.xml13
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory.xml61
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml92
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_joystick.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_lagmeter.xml215
-rw-r--r--indra/newview/skins/default/xui/da/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_live_lsleditor.xml23
-rw-r--r--indra/newview/skins/default/xui/da/floater_lsl_guide.xml12
-rw-r--r--indra/newview/skins/default/xui/da/floater_media_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_mem_leaking.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_moveview.xml45
-rw-r--r--indra/newview/skins/default/xui/da/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_my_friends.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_openobject.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_outgoing_call.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_pay.xml32
-rw-r--r--indra/newview/skins/default/xui/da/floater_pay_object.xml33
-rw-r--r--indra/newview/skins/default/xui/da/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_postcard.xml12
-rw-r--r--indra/newview/skins/default/xui/da/floater_preferences.xml21
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_classified.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_event.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_gesture.xml53
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_notecard.xml22
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_texture.xml39
-rw-r--r--indra/newview/skins/default/xui/da/floater_region_info.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_report_abuse.xml100
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_preview.xml7
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_queue.xml21
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/da/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_select_key.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_sell_land.xml125
-rw-r--r--indra/newview/skins/default/xui/da/floater_settings_debug.xml20
-rw-r--r--indra/newview/skins/default/xui/da/floater_snapshot.xml68
-rw-r--r--indra/newview/skins/default/xui/da/floater_sound_preview.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/da/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_telehub.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_texture_ctrl.xml24
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml585
-rw-r--r--indra/newview/skins/default/xui/da/floater_top_objects.xml34
-rw-r--r--indra/newview/skins/default/xui/da/floater_tos.xml11
-rw-r--r--indra/newview/skins/default/xui/da/floater_voice_controls.xml25
-rw-r--r--indra/newview/skins/default/xui/da/floater_water.xml66
-rw-r--r--indra/newview/skins/default/xui/da/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_world_map.xml122
-rw-r--r--indra/newview/skins/default/xui/da/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/da/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/da/inspect_object.xml34
-rw-r--r--indra/newview/skins/default/xui/da/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/da/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/da/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/da/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/da/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory.xml140
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/da/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/da/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_login.xml33
-rw-r--r--indra/newview/skins/default/xui/da/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/da/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml24
-rw-r--r--indra/newview/skins/default/xui/da/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_participant_list.xml16
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/da/menu_profile_overflow.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_slurl.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_viewer.xml493
-rw-r--r--indra/newview/skins/default/xui/da/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/da/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml990
-rw-r--r--indra/newview/skins/default/xui/da/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_avatar_list_item.xml25
-rw-r--r--indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_bottomtray.xml23
-rw-r--r--indra/newview/skins/default/xui/da/panel_classified_info.xml22
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_classified.xml33
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_profile.xml94
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/da/panel_friends.xml36
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_control_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_general.xml77
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml36
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_invite.xml37
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_land_money.xml39
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_notices.xml51
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_roles.xml162
-rw-r--r--indra/newview/skins/default/xui/da/panel_im_control_panel.xml13
-rw-r--r--indra/newview/skins/default/xui/da/panel_landmark_info.xml37
-rw-r--r--indra/newview/skins/default/xui/da/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml63
-rw-r--r--indra/newview/skins/default/xui/da/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/da/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_my_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/da/panel_navigation_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfits_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_people.xml53
-rw-r--r--indra/newview/skins/default/xui/da/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/da/panel_place_profile.xml103
-rw-r--r--indra/newview/skins/default/xui/da/panel_places.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_advanced.xml38
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_alerts.xml22
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml35
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_general.xml107
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml213
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_privacy.xml49
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_setup.xml58
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_sound.xml62
-rw-r--r--indra/newview/skins/default/xui/da/panel_prim_media_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_covenant.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_debug.xml51
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_estate.xml64
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_texture.xml24
-rw-r--r--indra/newview/skins/default/xui/da/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/da/panel_side_tray.xml26
-rw-r--r--indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_status_bar.xml61
-rw-r--r--indra/newview/skins/default/xui/da/panel_teleport_history.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/da/role_actions.xml245
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_appearance.xml11
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_item_info.xml70
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_task_info.xml119
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml2864
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml74
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml469
-rw-r--r--indra/newview/skins/default/xui/de/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_preview.xml219
-rw-r--r--indra/newview/skins/default/xui/de/floater_auction.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_picker.xml61
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_textures.xml65
-rw-r--r--indra/newview/skins/default/xui/de/floater_beacons.xml24
-rw-r--r--indra/newview/skins/default/xui/de/floater_build_options.xml17
-rw-r--r--indra/newview/skins/default/xui/de/floater_bulk_perms.xml66
-rw-r--r--indra/newview/skins/default/xui/de/floater_bumps.xml31
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_contents.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml81
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml299
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_object.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/de/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_color_picker.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_customize.xml157
-rw-r--r--indra/newview/skins/default/xui/de/floater_day_cycle_options.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_device_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_env_settings.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_event.xml48
-rw-r--r--indra/newview/skins/default/xui/de/floater_first_time_tip.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_gesture.xml38
-rw-r--r--indra/newview/skins/default/xui/de/floater_god_tools.xml129
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml30
-rw-r--r--indra/newview/skins/default/xui/de/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_hud.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_image_preview.xml28
-rw-r--r--indra/newview/skins/default/xui/de/floater_incoming_call.xml27
-rw-r--r--indra/newview/skins/default/xui/de/floater_inspect.xml24
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory.xml61
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml92
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml40
-rw-r--r--indra/newview/skins/default/xui/de/floater_joystick.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_lagmeter.xml215
-rw-r--r--indra/newview/skins/default/xui/de/floater_land_holdings.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_live_lsleditor.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_lsl_guide.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_map.xml5
-rw-r--r--indra/newview/skins/default/xui/de/floater_media_browser.xml31
-rw-r--r--indra/newview/skins/default/xui/de/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_mem_leaking.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_moveview.xml47
-rw-r--r--indra/newview/skins/default/xui/de/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_my_friends.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_notification.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_notifications_console.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_openobject.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay.xml30
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay_object.xml39
-rw-r--r--indra/newview/skins/default/xui/de/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml28
-rw-r--r--indra/newview/skins/default/xui/de/floater_preferences.xml21
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_animation.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_classified.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_event.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture.xml55
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_notecard.xml24
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_sound.xml13
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_texture.xml42
-rw-r--r--indra/newview/skins/default/xui/de/floater_region_info.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_report_abuse.xml109
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_queue.xml21
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml130
-rw-r--r--indra/newview/skins/default/xui/de/floater_settings_debug.xml20
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml100
-rw-r--r--indra/newview/skins/default/xui/de/floater_sound_preview.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/de/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_telehub.xml27
-rw-r--r--indra/newview/skins/default/xui/de/floater_texture_ctrl.xml26
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml558
-rw-r--r--indra/newview/skins/default/xui/de/floater_top_objects.xml67
-rw-r--r--indra/newview/skins/default/xui/de/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_controls.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml46
-rw-r--r--indra/newview/skins/default/xui/de/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_windlight_options.xml67
-rw-r--r--indra/newview/skins/default/xui/de/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/de/floater_world_map.xml135
-rw-r--r--indra/newview/skins/default/xui/de/inspect_avatar.xml26
-rw-r--r--indra/newview/skins/default/xui/de/inspect_group.xml35
-rw-r--r--indra/newview/skins/default/xui/de/inspect_object.xml48
-rw-r--r--indra/newview/skins/default/xui/de/inspect_remote_object.xml25
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/de/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/de/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/de/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/de/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory.xml40
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/de/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml35
-rw-r--r--indra/newview/skins/default/xui/de/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/de/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_object.xml25
-rw-r--r--indra/newview/skins/default/xui/de/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_participant_list.xml20
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby.xml12
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/de/menu_profile_overflow.xml11
-rw-r--r--indra/newview/skins/default/xui/de/menu_slurl.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml581
-rw-r--r--indra/newview/skins/default/xui/de/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/de/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml1242
-rw-r--r--indra/newview/skins/default/xui/de/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_avatar_list_item.xml27
-rw-r--r--indra/newview/skins/default/xui/de/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_bottomtray.xml38
-rw-r--r--indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_chat_header.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_classified_info.xml29
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_classified.xml41
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_profile.xml104
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/de/panel_friends.xml46
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_general.xml95
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_invite.xml42
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_land_money.xml216
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notices.xml141
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_roles.xml329
-rw-r--r--indra/newview/skins/default/xui/de/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/de/panel_instant_message.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_landmark_info.xml44
-rw-r--r--indra/newview/skins/default/xui/de/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml84
-rw-r--r--indra/newview/skins/default/xui/de/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/de/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_security.xml13
-rw-r--r--indra/newview/skins/default/xui/de/panel_my_profile.xml50
-rw-r--r--indra/newview/skins/default/xui/de/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_media.xml63
-rw-r--r--indra/newview/skins/default/xui/de/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/de/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml57
-rw-r--r--indra/newview/skins/default/xui/de/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_picks.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_place_profile.xml130
-rw-r--r--indra/newview/skins/default/xui/de/panel_places.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_alerts.xml26
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_general.xml128
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml233
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml47
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml56
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_sound.xml105
-rw-r--r--indra/newview/skins/default/xui/de/panel_prim_media_controls.xml73
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml56
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_covenant.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_debug.xml10
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_estate.xml75
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_texture.xml22
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml22
-rw-r--r--indra/newview/skins/default/xui/de/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/de/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_sidetray_home_tab.xml38
-rw-r--r--indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_status_bar.xml57
-rw-r--r--indra/newview/skins/default/xui/de/panel_sys_well_item.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_teleport_history.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/de/role_actions.xml244
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_appearance.xml16
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_item_info.xml79
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_task_info.xml128
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml2971
-rw-r--r--indra/newview/skins/default/xui/de/teleport_strings.xml10
-rw-r--r--indra/newview/skins/default/xui/en/accordion_drag.xml2
-rw-r--r--indra/newview/skins/default/xui/en/accordion_parent.xml1
-rw-r--r--indra/newview/skins/default/xui/en/alert_button.xml15
-rw-r--r--indra/newview/skins/default/xui/en/alert_check_box.xml7
-rw-r--r--indra/newview/skins/default/xui/en/alert_icon.xml8
-rw-r--r--indra/newview/skins/default/xui/en/alert_line_editor.xml11
-rw-r--r--indra/newview/skins/default/xui/en/favorites_bar_button.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml69
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml1116
-rw-r--r--indra/newview/skins/default/xui/en/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_preview.xml100
-rw-r--r--indra/newview/skins/default/xui/en/floater_auction.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml64
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_textures.xml48
-rw-r--r--indra/newview/skins/default/xui/en/floater_beacons.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_bulk_perms.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_contents.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml15
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_land.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml126
-rw-r--r--indra/newview/skins/default/xui/en/floater_choose_group.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_color_picker.xml82
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml2092
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml120
-rw-r--r--indra/newview/skins/default/xui/en/floater_device_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_env_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml245
-rw-r--r--indra/newview/skins/default/xui/en/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_gesture.xml40
-rw-r--r--indra/newview/skins/default/xui/en/floater_god_tools.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_help_browser.xml55
-rw-r--r--indra/newview/skins/default/xui/en/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_im.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml42
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml116
-rw-r--r--indra/newview/skins/default/xui/en/floater_image_preview.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_incoming_call.xml61
-rw-r--r--indra/newview/skins/default/xui/en/floater_inspect.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml420
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_joystick.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_lagmeter.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_land_holdings.xml101
-rw-r--r--indra/newview/skins/default/xui/en/floater_live_lsleditor.xml49
-rw-r--r--indra/newview/skins/default/xui/en/floater_lsl_guide.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml46
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_settings.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml29
-rw-r--r--indra/newview/skins/default/xui/en/floater_mute_object.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_notification.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_notifications_console.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_openobject.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_save_as.xml59
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml136
-rw-r--r--indra/newview/skins/default/xui/en/floater_pay.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_pay_object.xml67
-rw-r--r--indra/newview/skins/default/xui/en/floater_perm_prefs.xml46
-rw-r--r--indra/newview/skins/default/xui/en/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_classified.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_event.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_sound.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml100
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_info.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_report_abuse.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_script.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_debug_panel.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_limits.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_preview.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_queue.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_search.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml42
-rw-r--r--indra/newview/skins/default/xui/en/floater_select_key.xml35
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml146
-rw-r--r--indra/newview/skins/default/xui/en/floater_settings_debug.xml45
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml187
-rw-r--r--indra/newview/skins/default/xui/en/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml324
-rw-r--r--indra/newview/skins/default/xui/en/floater_sys_well.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_telehub.xml57
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_button.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_checkbox.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_combobox.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_inspectors.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_layout.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_line_editor.xml44
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_list_view.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_navigation_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_radiogroup.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_slider.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_spinner.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_editor.xml44
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_textbox.xml351
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml162
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml111
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml254
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml96
-rw-r--r--indra/newview/skins/default/xui/en/floater_tos.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_url_entry.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml132
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml274
-rw-r--r--indra/newview/skins/default/xui/en/floater_wearable_save_as.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_whitelist_entry.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_windlight_options.xml224
-rw-r--r--indra/newview/skins/default/xui/en/floater_window_size.xml64
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml768
-rw-r--r--indra/newview/skins/default/xui/en/fonts.xml25
-rw-r--r--indra/newview/skins/default/xui/en/inspect_avatar.xml194
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml76
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml150
-rw-r--r--indra/newview/skins/default/xui/en/inspect_remote_object.xml95
-rw-r--r--indra/newview/skins/default/xui/en/inspect_toast.xml19
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml188
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_other.xml107
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml103
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_icon.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_other.xml98
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml218
-rw-r--r--indra/newview/skins/default/xui/en/menu_bottomtray.xml53
-rw-r--r--indra/newview/skins/default/xui/en/menu_gesture_gear.xml65
-rw-r--r--indra/newview/skins/default/xui/en/menu_im_well_button.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_imchiclet_group.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml237
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml101
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml110
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml229
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml114
-rw-r--r--indra/newview/skins/default/xui/en/menu_land.xml64
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml130
-rw-r--r--indra/newview/skins/default/xui/en/menu_mini_map.xml24
-rw-r--r--indra/newview/skins/default/xui/en/menu_navbar.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_notification_well_button.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml164
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_list.xml180
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups.xml57
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml21
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml39
-rw-r--r--indra/newview/skins/default/xui/en/menu_picks_plus.xml25
-rw-r--r--indra/newview/skins/default/xui/en/menu_places_gear_folder.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_profile_overflow.xml74
-rw-r--r--indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_map.xml30
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_objectim.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_parcel.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_teleport.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml592
-rw-r--r--indra/newview/skins/default/xui/en/mime_types.xml34
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_linux.xml442
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_mac.xml442
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml1328
-rw-r--r--indra/newview/skins/default/xui/en/panel_active_object_row.xml77
-rw-r--r--indra/newview/skins/default/xui/en/panel_activeim_row.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml116
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml65
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_tag.xml96
-rw-r--r--indra/newview/skins/default/xui/en/panel_bars.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml55
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml350
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml95
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml79
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_item.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_separator.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml215
-rw-r--r--indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml257
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_eyes.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_gloves.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_hair.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pants.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml86
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml178
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shape.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shirt.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shoes.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skirt.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_socks.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_underpants.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_undershirt.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_friends.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml139
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml229
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml272
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_invite.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml322
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_list_item.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml306
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notify.xml152
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml827
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml210
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml82
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml296
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml59
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml438
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml487
-rw-r--r--indra/newview/skins/default/xui/en/panel_me.xml52
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml108
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml43
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_security.xml36
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml408
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml90
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml32
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml410
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml211
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_notifications_channel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_online_status.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_online_status_toast.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml129
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml67
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml403
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml93
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_list_item.xml44
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml130
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml931
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml130
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml275
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_alerts.xml53
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml234
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml260
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml122
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml115
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml643
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml553
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml654
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml548
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml44
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_covenant.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_debug.xml68
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml235
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml118
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general_layout.xml116
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_terrain.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_texture.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml120
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml99
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml140
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml82
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml222
-rw-r--r--indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml215
-rw-r--r--indra/newview/skins/default/xui/en/panel_sys_well_item.xml66
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history_item.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml123
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml48
-rw-r--r--indra/newview/skins/default/xui/en/role_actions.xml64
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml122
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml110
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml416
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml553
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml599
-rw-r--r--indra/newview/skins/default/xui/en/widgets/accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_icon.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml44
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chat_history.xml26
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml48
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml49
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml48
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml30
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_script.xml30
-rw-r--r--indra/newview/skins/default/xui/en/widgets/color_swatch.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/combo_box.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/context_menu.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/flat_list_view.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/floater.xml30
-rw-r--r--indra/newview/skins/default/xui/en/widgets/flyout_button.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/folder_view_item.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml31
-rw-r--r--indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/group_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inspector.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inventory_panel.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/line_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml114
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/output_monitor.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/radio_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_list.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_combo_box.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml13
-rw-r--r--indra/newview/skins/default/xui/en/widgets/side_tray.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/spinner.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml26
-rw-r--r--indra/newview/skins/default/xui/en/widgets/talk_button.xml40
-rw-r--r--indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text_editor.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/textbase.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tool_tip.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml69
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml445
-rw-r--r--indra/newview/skins/default/xui/es/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_animation_preview.xml216
-rw-r--r--indra/newview/skins/default/xui/es/floater_auction.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar_picker.xml55
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar_textures.xml48
-rw-r--r--indra/newview/skins/default/xui/es/floater_beacons.xml26
-rw-r--r--indra/newview/skins/default/xui/es/floater_build_options.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/es/floater_bumps.xml29
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml82
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml40
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_object.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/es/floater_choose_group.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_color_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml158
-rw-r--r--indra/newview/skins/default/xui/es/floater_day_cycle_options.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_env_settings.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_gesture.xml30
-rw-r--r--indra/newview/skins/default/xui/es/floater_god_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_hardware_settings.xml18
-rw-r--r--indra/newview/skins/default/xui/es/floater_help_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_im.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/es/floater_incoming_call.xml21
-rw-r--r--indra/newview/skins/default/xui/es/floater_inspect.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory.xml59
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml82
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_joystick.xml36
-rw-r--r--indra/newview/skins/default/xui/es/floater_lagmeter.xml221
-rw-r--r--indra/newview/skins/default/xui/es/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_live_lsleditor.xml21
-rw-r--r--indra/newview/skins/default/xui/es/floater_lsl_guide.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_moveview.xml42
-rw-r--r--indra/newview/skins/default/xui/es/floater_mute_object.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_my_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_outgoing_call.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_pay.xml30
-rw-r--r--indra/newview/skins/default/xui/es/floater_pay_object.xml29
-rw-r--r--indra/newview/skins/default/xui/es/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_postcard.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_animation.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture.xml64
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_notecard.xml22
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_sound.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_texture.xml37
-rw-r--r--indra/newview/skins/default/xui/es/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_report_abuse.xml105
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_queue.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_sell_land.xml125
-rw-r--r--indra/newview/skins/default/xui/es/floater_settings_debug.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_snapshot.xml67
-rw-r--r--indra/newview/skins/default/xui/es/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/es/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_telehub.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_texture_ctrl.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml573
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_tos.xml3
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_controls.xml25
-rw-r--r--indra/newview/skins/default/xui/es/floater_water.xml26
-rw-r--r--indra/newview/skins/default/xui/es/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_world_map.xml122
-rw-r--r--indra/newview/skins/default/xui/es/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/es/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/es/inspect_object.xml34
-rw-r--r--indra/newview/skins/default/xui/es/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/es/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/es/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/es/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml27
-rw-r--r--indra/newview/skins/default/xui/es/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/es/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_object.xml24
-rw-r--r--indra/newview/skins/default/xui/es/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_participant_list.xml16
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/es/menu_profile_overflow.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml493
-rw-r--r--indra/newview/skins/default/xui/es/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/es/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml1362
-rw-r--r--indra/newview/skins/default/xui/es/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_avatar_list_item.xml25
-rw-r--r--indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_bottomtray.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_classified_info.xml22
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_classified.xml33
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_profile.xml93
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/es/panel_friends.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_control_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml81
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml36
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_invite.xml24
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_land_money.xml37
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_notices.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_roles.xml171
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_landmark_info.xml37
-rw-r--r--indra/newview/skins/default/xui/es/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml65
-rw-r--r--indra/newview/skins/default/xui/es/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/es/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_my_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/es/panel_navigation_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml53
-rw-r--r--indra/newview/skins/default/xui/es/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_place_profile.xml103
-rw-r--r--indra/newview/skins/default/xui/es/panel_places.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml38
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_alerts.xml18
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml116
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml210
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml49
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml56
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml64
-rw-r--r--indra/newview/skins/default/xui/es/panel_prim_media_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile.xml48
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_covenant.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_debug.xml22
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_estate.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_side_tray.xml26
-rw-r--r--indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_status_bar.xml53
-rw-r--r--indra/newview/skins/default/xui/es/panel_teleport_history.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/es/role_actions.xml243
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_appearance.xml11
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_item_info.xml70
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_task_info.xml119
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml2872
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml490
-rw-r--r--indra/newview/skins/default/xui/fr/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_preview.xml236
-rw-r--r--indra/newview/skins/default/xui/fr/floater_auction.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_picker.xml57
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_textures.xml61
-rw-r--r--indra/newview/skins/default/xui/fr/floater_beacons.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/floater_build_options.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/fr/floater_bumps.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml86
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_land.xml280
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_object.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/fr/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml184
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_device_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_env_settings.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_event.xml48
-rw-r--r--indra/newview/skins/default/xui/fr/floater_first_time_tip.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_gesture.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/floater_god_tools.xml67
-rw-r--r--indra/newview/skins/default/xui/fr/floater_hardware_settings.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_hud.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_im.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/floater_incoming_call.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inspect.xml24
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory.xml67
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml78
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_joystick.xml38
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lagmeter.xml215
-rw-r--r--indra/newview/skins/default/xui/fr/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lsl_guide.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_map.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_media_browser.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_mem_leaking.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_moveview.xml43
-rw-r--r--indra/newview/skins/default/xui/fr/floater_mute_object.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_my_friends.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_notification.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_notifications_console.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pay.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pay_object.xml37
-rw-r--r--indra/newview/skins/default/xui/fr/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_classified.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_event.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture.xml83
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_notecard.xml24
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_sound.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_texture.xml42
-rw-r--r--indra/newview/skins/default/xui/fr/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_report_abuse.xml153
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_preview.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_queue.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_search.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/floater_select_key.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml127
-rw-r--r--indra/newview/skins/default/xui/fr/floater_settings_debug.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml80
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sound_preview.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_telehub.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml503
-rw-r--r--indra/newview/skins/default/xui/fr/floater_top_objects.xml69
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_controls.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml47
-rw-r--r--indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml67
-rw-r--r--indra/newview/skins/default/xui/fr/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/floater_world_map.xml158
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_avatar.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_group.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_object.xml48
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_remote_object.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml38
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_object.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_participant_list.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/menu_profile_overflow.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/menu_slurl.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml594
-rw-r--r--indra/newview/skins/default/xui/fr/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/fr/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml1209
-rw-r--r--indra/newview/skins/default/xui/fr/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_audio_device.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_bottomtray.xml38
-rw-r--r--indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_chat_header.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_classified_info.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_classified.xml41
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml104
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/fr/panel_friends.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_general.xml97
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_invite.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_land_money.xml137
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_notices.xml64
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_roles.xml183
-rw-r--r--indra/newview/skins/default/xui/fr/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/fr/panel_instant_message.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_landmark_info.xml44
-rw-r--r--indra/newview/skins/default/xui/fr/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml82
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/fr/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_security.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/panel_my_profile.xml50
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_media.xml63
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml57
-rw-r--r--indra/newview/skins/default/xui/fr/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_picks.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_place_profile.xml130
-rw-r--r--indra/newview/skins/default/xui/fr/panel_places.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml34
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_general.xml127
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml227
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml42
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml56
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml72
-rw-r--r--indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml73
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml56
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_covenant.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_estate.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_texture.xml24
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_sidetray_home_tab.xml38
-rw-r--r--indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_status_bar.xml56
-rw-r--r--indra/newview/skins/default/xui/fr/panel_sys_well_item.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_teleport_history.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/role_actions.xml245
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_appearance.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_item_info.xml79
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_task_info.xml128
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml2986
-rw-r--r--indra/newview/skins/default/xui/fr/teleport_strings.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml67
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml476
-rw-r--r--indra/newview/skins/default/xui/it/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_preview.xml216
-rw-r--r--indra/newview/skins/default/xui/it/floater_auction.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_picker.xml55
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/it/floater_beacons.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_build_options.xml13
-rw-r--r--indra/newview/skins/default/xui/it/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/it/floater_bumps.xml29
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_contents.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml85
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_land.xml47
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/it/floater_choose_group.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_color_picker.xml13
-rw-r--r--indra/newview/skins/default/xui/it/floater_customize.xml202
-rw-r--r--indra/newview/skins/default/xui/it/floater_day_cycle_options.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_env_settings.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_gesture.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml21
-rw-r--r--indra/newview/skins/default/xui/it/floater_help_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_im.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/it/floater_incoming_call.xml21
-rw-r--r--indra/newview/skins/default/xui/it/floater_inspect.xml17
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory.xml59
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml82
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_joystick.xml44
-rw-r--r--indra/newview/skins/default/xui/it/floater_lagmeter.xml221
-rw-r--r--indra/newview/skins/default/xui/it/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_live_lsleditor.xml21
-rw-r--r--indra/newview/skins/default/xui/it/floater_lsl_guide.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_moveview.xml42
-rw-r--r--indra/newview/skins/default/xui/it/floater_mute_object.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_my_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_outgoing_call.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml32
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay_object.xml37
-rw-r--r--indra/newview/skins/default/xui/it/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_postcard.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_animation.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture.xml60
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_notecard.xml22
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_sound.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_texture.xml37
-rw-r--r--indra/newview/skins/default/xui/it/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_report_abuse.xml102
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_queue.xml17
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_sell_land.xml126
-rw-r--r--indra/newview/skins/default/xui/it/floater_settings_debug.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_snapshot.xml75
-rw-r--r--indra/newview/skins/default/xui/it/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/it/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_telehub.xml19
-rw-r--r--indra/newview/skins/default/xui/it/floater_texture_ctrl.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml623
-rw-r--r--indra/newview/skins/default/xui/it/floater_top_objects.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_tos.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml25
-rw-r--r--indra/newview/skins/default/xui/it/floater_water.xml47
-rw-r--r--indra/newview/skins/default/xui/it/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_world_map.xml125
-rw-r--r--indra/newview/skins/default/xui/it/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/it/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/it/inspect_object.xml34
-rw-r--r--indra/newview/skins/default/xui/it/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/it/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/it/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml27
-rw-r--r--indra/newview/skins/default/xui/it/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/it/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/it/menu_object.xml24
-rw-r--r--indra/newview/skins/default/xui/it/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_participant_list.xml16
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/it/menu_profile_overflow.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml497
-rw-r--r--indra/newview/skins/default/xui/it/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/it/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml1408
-rw-r--r--indra/newview/skins/default/xui/it/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_avatar_list_item.xml25
-rw-r--r--indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_bottomtray.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_classified_info.xml22
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_classified.xml33
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_profile.xml93
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/it/panel_friends.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_control_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_general.xml79
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml36
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_invite.xml22
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_land_money.xml45
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notices.xml55
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_roles.xml145
-rw-r--r--indra/newview/skins/default/xui/it/panel_im_control_panel.xml13
-rw-r--r--indra/newview/skins/default/xui/it/panel_landmark_info.xml37
-rw-r--r--indra/newview/skins/default/xui/it/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml67
-rw-r--r--indra/newview/skins/default/xui/it/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/it/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/it/panel_navigation_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_people.xml53
-rw-r--r--indra/newview/skins/default/xui/it/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml103
-rw-r--r--indra/newview/skins/default/xui/it/panel_places.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml38
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_alerts.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml32
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml116
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml207
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml50
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml78
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml62
-rw-r--r--indra/newview/skins/default/xui/it/panel_prim_media_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml48
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_covenant.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_debug.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_estate.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_texture.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/it/panel_side_tray.xml26
-rw-r--r--indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml53
-rw-r--r--indra/newview/skins/default/xui/it/panel_teleport_history.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml72
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_appearance.xml11
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_item_info.xml70
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_task_info.xml119
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml2865
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml486
-rw-r--r--indra/newview/skins/default/xui/ja/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_preview.xml248
-rw-r--r--indra/newview/skins/default/xui/ja/floater_auction.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_picker.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml65
-rw-r--r--indra/newview/skins/default/xui/ja/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/floater_build_options.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bulk_perms.xml68
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml82
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_land.xml287
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/floater_choose_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_color_picker.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_critical.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_customize.xml166
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_device_settings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_env_settings.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/floater_first_time_tip.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_gesture.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml137
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hud.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_image_preview.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inspect.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory.xml63
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml90
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lagmeter.xml215
-rw-r--r--indra/newview/skins/default/xui/ja/floater_land_holdings.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lsl_guide.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_browser.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mem_leaking.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_friends.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_openobject.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay_object.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_postcard.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_classified.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_event.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture.xml61
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_notecard.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_sound.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_texture.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_info.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_report_abuse.xml152
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_preview.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_queue.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_select_key.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml133
-rw-r--r--indra/newview/skins/default/xui/ja/floater_settings_debug.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml78
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_preview.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_telehub.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml555
-rw-r--r--indra/newview/skins/default/xui/ja/floater_top_objects.xml69
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_water.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_windlight_options.xml65
-rw-r--r--indra/newview/skins/default/xui/ja/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_world_map.xml134
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_group.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_object.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_remote_object.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_list.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_overflow.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/menu_slurl.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml596
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml2349
-rw-r--r--indra/newview/skins/default/xui/ja/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_chat_header.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_classified_info.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_classified.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml104
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/ja/panel_friends.xml59
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_general.xml101
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_invite.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml132
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml59
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml172
-rw-r--r--indra/newview/skins/default/xui/ja/panel_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/panel_instant_message.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmark_info.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml86
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/ja/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml50
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml63
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml57
-rw-r--r--indra/newview/skins/default/xui/ja/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_picks.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml130
-rw-r--r--indra/newview/skins/default/xui/ja/panel_places.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml124
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml235
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml47
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml59
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml111
-rw-r--r--indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml73
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml56
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_covenant.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_debug.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_texture.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml59
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sys_well_item.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_teleport_history.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml249
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_appearance.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_item_info.xml79
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_task_info.xml128
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml3077
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml10
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_auction.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_beacons.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bulk_perms.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_currency.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_land.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_choose_group.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_customize.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_env_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inspect.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_joystick.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lagmeter.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mute_object.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_my_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_postcard.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preferences.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_report_abuse.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_queue.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_snapshot.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_telehub.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_top_objects.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_water.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_world_map.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/notifications.xml5
-rw-r--r--indra/newview/skins/default/xui/nl/panel_edit_profile.xml90
-rw-r--r--indra/newview/skins/default/xui/nl/panel_login.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/role_actions.xml76
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml1
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_about.xml71
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_about_land.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_animation_preview.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_auction.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_avatar_picker.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_avatar_textures.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_beacons.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_build_options.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_bulk_perms.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_bumps.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_contents.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_currency.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_land.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_object.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_camera.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_choose_group.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_color_picker.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_critical.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_customize.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_device_settings.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_env_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_font_test.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_gesture.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_god_tools.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_hardware_settings.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_hud.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_im.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_image_preview.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inspect.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_joystick.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_lagmeter.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_land_holdings.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_lsl_guide.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_media_browser.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_mem_leaking.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_moveview.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_mute_object.xml17
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_my_friends.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_openobject.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_pay.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_pay_object.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/floater_perm_prefs.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_post_process.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_postcard.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preferences.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_animation.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_classified.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_event.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_gesture.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_notecard.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_sound.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_texture.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_region_info.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_report_abuse.xml101
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_debug.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_preview.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_queue.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_search.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_select_key.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_sell_land.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_settings_debug.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_snapshot.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_stats.xml71
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_telehub.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_tools.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_top_objects.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_tos.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_url_entry.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_water.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_windlight_options.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_world_map.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/pl/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/pl/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/menu_landmark.xml7
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_login.xml33
-rw-r--r--indra/newview/skins/default/xui/pl/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/menu_object.xml24
-rw-r--r--indra/newview/skins/default/xui/pl/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_participant_list.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/menu_profile_overflow.xml5
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_slurl.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_teleport.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_viewer.xml491
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/mime_types.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_audio_device.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_profile.xml90
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_friends.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_general.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_invite.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_land_money.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_notices.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_roles.xml165
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_groups.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_login.xml65
-rw-r--r--indra/newview/skins/default/xui/pl/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml38
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml23
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_chat.xml31
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_general.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_setup.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_sound.xml66
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_covenant.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_debug.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_estate.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_general.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_terrain.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_texture.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_scrolling_param.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_status_bar.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/panel_world_map.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/role_actions.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/strings.xml2863
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/teleport_strings.xml12
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/xui_version.xml0
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml68
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml394
-rw-r--r--indra/newview/skins/default/xui/pt/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_animation_preview.xml216
-rw-r--r--indra/newview/skins/default/xui/pt/floater_auction.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar_picker.xml55
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/pt/floater_beacons.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/floater_build_options.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/floater_bumps.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_contents.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml80
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml47
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_object.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_color_picker.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml122
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_env_settings.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_gesture.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_god_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hardware_settings.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/floater_help_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/floater_incoming_call.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inspect.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory.xml59
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml78
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_joystick.xml42
-rw-r--r--indra/newview/skins/default/xui/pt/floater_lagmeter.xml221
-rw-r--r--indra/newview/skins/default/xui/pt/floater_land_holdings.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/floater_lsl_guide.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_moveview.xml42
-rw-r--r--indra/newview/skins/default/xui/pt/floater_mute_object.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_my_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outgoing_call.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay.xml34
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay_object.xml43
-rw-r--r--indra/newview/skins/default/xui/pt/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_post_process.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_postcard.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_animation.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_notecard.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_sound.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_texture.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_report_abuse.xml104
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_preview.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_queue.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sell_land.xml126
-rw-r--r--indra/newview/skins/default/xui/pt/floater_settings_debug.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_snapshot.xml70
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_telehub.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml579
-rw-r--r--indra/newview/skins/default/xui/pt/floater_top_objects.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tos.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml25
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_world_map.xml114
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_object.xml34
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_self.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/menu_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_hide_navbar.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/menu_mini_map.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_participant_list.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/menu_profile_overflow.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml503
-rw-r--r--indra/newview/skins/default/xui/pt/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/pt/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml1407
-rw-r--r--indra/newview/skins/default/xui/pt/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml25
-rw-r--r--indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_bottomtray.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_classified_info.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_classified.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_profile.xml93
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_wearable.xml101
-rw-r--r--indra/newview/skins/default/xui/pt/panel_friends.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_control_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_general.xml81
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml36
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_invite.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_land_money.xml47
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml54
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_roles.xml148
-rw-r--r--indra/newview/skins/default/xui/pt/panel_im_control_panel.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_landmark_info.xml37
-rw-r--r--indra/newview/skins/default/xui/pt/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml59
-rw-r--r--indra/newview/skins/default/xui/pt/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_my_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navigation_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_people.xml53
-rw-r--r--indra/newview/skins/default/xui/pt/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_place_profile.xml103
-rw-r--r--indra/newview/skins/default/xui/pt/panel_places.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml38
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_general.xml116
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml207
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml61
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_sound.xml63
-rw-r--r--indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_covenant.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_debug.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_estate.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_texture.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/pt/panel_side_tray.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_status_bar.xml53
-rw-r--r--indra/newview/skins/default/xui/pt/panel_teleport_history.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/role_actions.xml227
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_appearance.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_item_info.xml70
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_task_info.xml119
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml2864
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml8
-rw-r--r--indra/newview/tests/llcapabilitylistener_test.cpp1
-rw-r--r--indra/newview/tests/lldateutil_test.cpp36
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp847
-rw-r--r--indra/newview/tests/llmediadataclient_test.cpp503
-rw-r--r--indra/newview/tests/lltextureinfo_test.cpp284
-rw-r--r--indra/newview/tests/lltextureinfodetails_test.cpp98
-rw-r--r--indra/newview/tests/lltexturestatsuploader_test.cpp156
-rw-r--r--indra/newview/tests/llviewerhelputil_test.cpp125
-rw-r--r--indra/newview/tests/llworldmap_test.cpp523
-rw-r--r--indra/newview/tests/llworldmipmap_test.cpp176
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp2
-rwxr-xr-xindra/newview/viewer_manifest.py362
-rw-r--r--indra/test/CMakeLists.txt4
-rw-r--r--indra/test/llevents_tut.cpp30
-rw-r--r--indra/test/llhttpclient_tut.cpp1
-rw-r--r--indra/test/llsdutil_tut.cpp2
-rw-r--r--indra/test_apps/llplugintest/CMakeLists.txt86
-rw-r--r--indra/test_apps/llplugintest/bookmarks.txt1
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp64
-rw-r--r--indra/viewer_components/login/lllogin.cpp89
-rw-r--r--indra/viewer_components/login/tests/lllogin_test.cpp74
-rw-r--r--indra/win_crash_logger/CMakeLists.txt3
-rw-r--r--indra/win_updater/CMakeLists.txt3
-rw-r--r--install.xml66
-rwxr-xr-xscripts/install.py9
-rw-r--r--scripts/messages/message_template.msg6
-rwxr-xr-xscripts/template_verifier.py11
-rwxr-xr-xscripts/update_version_files.py20
3588 files changed, 182656 insertions, 78032 deletions
diff --git a/.hgignore b/.hgignore
index 8e02212e79..53ddf71bb7 100644
--- a/.hgignore
+++ b/.hgignore
@@ -1,12 +1,19 @@
syntax: glob
+# WinMerge temp files
+*.bak
+# Compiled python bytecode
*.pyc
+# Emacs temp files
*~
.*.swp
+#OSX image cache file
+*.DS_Store
LICENSES
indra/.distcc
indra/build-darwin-*
indra/build-vc[0-9]*
+indra/CMakeFiles
indra/lib/mono/1.0/*.dll
indra/lib/mono/indra/*.dll
indra/lib/mono/indra/*.exe
@@ -23,9 +30,9 @@ indra/newview/fmod.dll
indra/newview/mozilla-theme
indra/newview/mozilla-universal-darwin.tgz
indra/newview/res-sdl
-indra/newview/skins
indra/newview/vivox-runtime
indra/server-linux-*
+indra/temp
indra/test/linden_file.dat
indra/test_apps/llmediatest/dependencies/i686-win32
indra/test_apps/terrain_mule/*.dll
@@ -44,3 +51,12 @@ tarfile_tmp
^indra/web/dataservice/lib/shared/vault.*
^indra/web/dataservice/vendor.*
glob:indra/newview/dbghelp.dll
+glob:*.cpp.orig
+glob:*.cpp.bak
+glob:*.h.bak
+glob:*.h.orig
+glob:indra/newview/typed_locations.txt
+glob:indra/newview/teleport_history.txt
+glob:indra/newview/search_history.txt
+glob:indra/newview/filters.xml
+glob:indra/newview/avatar_icons_cache.txt
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 942ba0f0b9..2e4d803252 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -139,6 +139,7 @@ Blakar Ogre
blino Nakamura
VWR-17
Boroondas Gupte
+ SNOW-278
VWR-233
WEB-262
Bulli Schumann
@@ -296,6 +297,7 @@ Jacek Antonelli
VWR-2947
VWR-2948
VWR-3605
+ VWR-8617
JB Kraft
VWR-5283
VWR-7802
@@ -372,6 +374,7 @@ Michelle2 Zenovka
VWR-8310
VWR-9499
Mm Alder
+ VWR-197
VWR-3777
VWR-4794
VWR-13578
@@ -497,6 +500,7 @@ Ringo Tuxing
CT-231
CT-321
Robin Cornelius
+ SNOW-108
SNOW-204
VWR-2488
VWR-9557
@@ -597,6 +601,7 @@ Tharax Ferraris
Thickbrick Sleaford
VWR-7109
VWR-9287
+ VWR-13483
VWR-13947
Thraxis Epsilon
SVC-371
diff --git a/etc/message.xml b/etc/message.xml
index da08e12aa1..c17ae3656d 100644
--- a/etc/message.xml
+++ b/etc/message.xml
@@ -50,7 +50,7 @@
<key>OpenCircuit</key>
<map>
<key>flavor</key>
- <string>template</string>
+ <string>llsd</string>
<key>trusted-sender</key>
<boolean>false</boolean>
</map>
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index db5495091e..592e9fc901 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -35,13 +35,13 @@ if (WINDOWS)
# Don't build DLLs.
set(BUILD_SHARED_LIBS OFF)
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd"
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP"
CACHE STRING "C++ compiler debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
- "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD"
+ "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP"
CACHE STRING "C++ compiler release-with-debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE
- "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD"
+ "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP"
CACHE STRING "C++ compiler release options" FORCE)
set(CMAKE_CXX_STANDARD_LIBRARIES "")
@@ -119,14 +119,14 @@ if (LINUX)
endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
# Let's actually get a numerical version of gxx's version
- STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION})
+ STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
- # gcc 4.3 and above don't like the LL boost and also
+ # gcc 4.3 and above don't like the LL boost and also
# cause warnings due to our use of deprecated headers
- if(${CXX_VERSION} GREATER 429)
+ if(${CXX_VERSION_NUMBER} GREATER 429)
add_definitions(-Wno-parentheses)
set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
- endif (${CXX_VERSION} GREATER 429)
+ endif (${CXX_VERSION_NUMBER} GREATER 429)
# End of hacks.
@@ -171,8 +171,8 @@ if (LINUX)
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
add_definitions(-fno-stack-protector)
- # linking can be so slow - give us a chance to figure out why
- set(CMAKE_CXX_LINK_FLAGS "-Wl,--stats,--no-keep-memory")
+ # linking can be very memory-hungry, especially the final viewer link
+ set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
endif (NOT STANDALONE)
endif (VIEWER)
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index f4706dd4f2..180504d286 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -54,7 +54,10 @@ else (STANDALONE)
endif (WINDOWS)
set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
- if (LINUX AND VIEWER)
- list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
- endif (LINUX AND VIEWER)
+ if (LINUX)
+ if (VIEWER)
+ list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
+ endif (VIEWER)
+ list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
+ endif (LINUX)
endif (STANDALONE)
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index efe9ad74d3..3652508b6a 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -42,8 +42,8 @@ else (STANDALONE)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
elseif (LINUX)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
- set(BOOST_REGEX_LIBRARY boost_regex-mt)
- set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
+ set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt)
+ set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt)
+ set(BOOST_SIGNALS_LIBRARY boost_signals-gcc41-mt)
endif (WINDOWS)
endif (STANDALONE)
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 4563b59ad2..4fc25dcc24 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -16,7 +16,7 @@ set(cmake_SOURCE_FILES
CARes.cmake
CURL.cmake
CMakeCopyIfDifferent.cmake
- CopyWinLibs.cmake
+ Copy3rdPartyLibs.cmake
CSharpMacros.cmake
DBusGlib.cmake
DirectX.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
new file mode 100644
index 0000000000..faf9da8b14
--- /dev/null
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -0,0 +1,395 @@
+# -*- cmake -*-
+
+# The copy_win_libs folder contains file lists and a script used to
+# copy dlls, exes and such needed to run the SecondLife from within
+# VisualStudio.
+
+include(CMakeCopyIfDifferent)
+
+###################################################################
+# set up platform specific lists of files that need to be copied
+###################################################################
+if(WINDOWS)
+ set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug")
+ set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
+ set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release")
+
+ #*******************************
+ # VIVOX - *NOTE: no debug version
+ set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
+ set(vivox_files
+ SLVoice.exe
+ libsndfile-1.dll
+ vivoxplatform.dll
+ vivoxsdk.dll
+ ortp.dll
+ zlib1.dll
+ vivoxoal.dll
+ )
+
+ #*******************************
+ # Misc shared libs
+
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+ set(debug_files
+ openjpegd.dll
+ libapr-1.dll
+ libaprutil-1.dll
+ libapriconv-1.dll
+ )
+
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+ set(release_files
+ openjpeg.dll
+ libapr-1.dll
+ libaprutil-1.dll
+ libapriconv-1.dll
+ )
+
+ if(USE_GOOGLE_PERFTOOLS)
+ set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll)
+ set(release_files ${release_files} libtcmalloc_minimal.dll)
+ endif(USE_GOOGLE_PERFTOOLS)
+
+ if (FMOD_SDK_DIR)
+ set(fmod_files fmod.dll)
+ endif (FMOD_SDK_DIR)
+
+ #*******************************
+ # LLKDU
+ set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+ if(NOT EXISTS ${internal_llkdu_path})
+ if (EXISTS "${debug_src_dir}/llkdu.dll")
+ set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
+ set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll")
+ endif (EXISTS "${debug_src_dir}/llkdu.dll")
+
+ if (EXISTS "${release_src_dir}/llkdu.dll")
+ set(release_llkdu_src "${release_src_dir}/llkdu.dll")
+ set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll")
+ set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll")
+ endif (EXISTS "${release_src_dir}/llkdu.dll")
+ endif (NOT EXISTS ${internal_llkdu_path})
+
+#*******************************
+# Copy MS C runtime dlls, required for packaging.
+# *TODO - Adapt this to support VC9
+if (MSVC80)
+ FIND_PATH(debug_msvc8_redist_path msvcr80d.dll
+ PATHS
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT
+ NO_DEFAULT_PATH
+ NO_DEFAULT_PATH
+ )
+
+ if(EXISTS ${debug_msvc8_redist_path})
+ set(debug_msvc8_files
+ msvcr80d.dll
+ msvcp80d.dll
+ Microsoft.VC80.DebugCRT.manifest
+ )
+
+ copy_if_different(
+ ${debug_msvc8_redist_path}
+ "${SHARED_LIB_STAGING_DIR_DEBUG}"
+ out_targets
+ ${debug_msvc8_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ endif (EXISTS ${debug_msvc8_redist_path})
+
+ FIND_PATH(release_msvc8_redist_path msvcr80.dll
+ PATHS
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT
+ NO_DEFAULT_PATH
+ NO_DEFAULT_PATH
+ )
+
+ if(EXISTS ${release_msvc8_redist_path})
+ set(release_msvc8_files
+ msvcr80.dll
+ msvcp80.dll
+ Microsoft.VC80.CRT.manifest
+ )
+
+ copy_if_different(
+ ${release_msvc8_redist_path}
+ "${SHARED_LIB_STAGING_DIR_RELEASE}"
+ out_targets
+ ${release_msvc8_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ copy_if_different(
+ ${release_msvc8_redist_path}
+ "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+ out_targets
+ ${release_msvc8_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ endif (EXISTS ${release_msvc8_redist_path})
+endif (MSVC80)
+
+elseif(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug/Resources")
+ set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources")
+ set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources")
+
+ set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
+ set(vivox_files
+ SLVoice
+ libsndfile.dylib
+ libvivoxoal.dylib
+ libortp.dylib
+ libvivoxplatform.dylib
+ libvivoxsdk.dylib
+ )
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_debug")
+ set(debug_files
+ )
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release")
+ set(release_files
+ libapr-1.0.3.7.dylib
+ libapr-1.dylib
+ libaprutil-1.0.3.8.dylib
+ libaprutil-1.dylib
+ libexpat.0.5.0.dylib
+ libexpat.dylib
+ libllqtwebkit.dylib
+ libndofdev.dylib
+ )
+
+ # fmod is statically linked on darwin
+ set(fmod_files "")
+
+ #*******************************
+ # LLKDU
+ set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+ if(NOT EXISTS ${internal_llkdu_path})
+ if (EXISTS "${debug_src_dir}/libllkdu.dylib")
+ set(debug_llkdu_src "${debug_src_dir}/libllkdu.dylib")
+ set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.dylib")
+ endif (EXISTS "${debug_src_dir}/libllkdu.dylib")
+
+ if (EXISTS "${release_src_dir}/libllkdu.dylib")
+ set(release_llkdu_src "${release_src_dir}/libllkdu.dylib")
+ set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.dylib")
+ set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.dylib")
+ endif (EXISTS "${release_src_dir}/libllkdu.dylib")
+ endif (NOT EXISTS ${internal_llkdu_path})
+elseif(LINUX)
+ # linux is weird, multiple side by side configurations aren't supported
+ # and we don't seem to have any debug shared libs built yet anyways...
+ set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}")
+ set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}")
+ set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}")
+
+ set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
+ set(vivox_files
+ libsndfile.so.1
+ libortp.so
+ libvivoxoal.so.1
+ libvivoxplatform.so
+ libvivoxsdk.so
+ SLVoice
+ )
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_debug")
+ set(debug_files
+ )
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_release_client")
+ # *FIX - figure out what to do with duplicate libalut.so here -brad
+ set(release_files
+ libapr-1.so.0
+ libaprutil-1.so.0
+ libatk-1.0.so
+ libcrypto.so.0.9.7
+ libdb-4.2.so
+ libexpat.so
+ libgmock_main.so
+ libgmock.so.0
+ libgmodule-2.0.so
+ libgobject-2.0.so
+ libgtest_main.so
+ libgtest.so.0
+ libopenal.so
+ libopenjpeg.so
+ libssl.so
+ libstacktrace.so
+ libtcmalloc.so
+ libuuid.so.1
+ libssl.so.0.9.7
+ )
+
+ if (FMOD_SDK_DIR)
+ set(fmod_files "libfmod-3.75.so")
+ endif (FMOD_SDK_DIR)
+
+ #*******************************
+ # LLKDU
+ set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+ if(NOT EXISTS ${internal_llkdu_path})
+ if (EXISTS "${debug_src_dir}/libllkdu.so")
+ set(debug_llkdu_src "${debug_src_dir}/libllkdu.so")
+ set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.so")
+ endif (EXISTS "${debug_src_dir}/libllkdu.so")
+
+ if (EXISTS "${release_src_dir}/libllkdu.so")
+ set(release_llkdu_src "${release_src_dir}/libllkdu.so")
+ set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.so")
+ set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.so")
+ endif (EXISTS "${release_src_dir}/libllkdu.so")
+ endif(NOT EXISTS ${internal_llkdu_path})
+else(WINDOWS)
+ message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
+ set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
+ set(vivox_files "")
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
+ set(debug_files "")
+ # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+ # or ARCH_PREBUILT_DIRS
+ set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
+ set(release_files "")
+
+ set(fmod_files "")
+
+ set(debug_llkdu_src "")
+ set(debug_llkdu_dst "")
+ set(release_llkdu_src "")
+ set(release_llkdu_dst "")
+ set(relwithdebinfo_llkdu_dst "")
+endif(WINDOWS)
+
+
+################################################################
+# Done building the file lists, now set up the copy commands.
+################################################################
+
+copy_if_different(
+ ${vivox_src_dir}
+ "${SHARED_LIB_STAGING_DIR_DEBUG}"
+ out_targets
+ ${vivox_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+ ${vivox_src_dir}
+ "${SHARED_LIB_STAGING_DIR_RELEASE}"
+ out_targets
+ ${vivox_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+ ${vivox_src_dir}
+ "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+ out_targets
+ ${vivox_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+
+
+copy_if_different(
+ ${debug_src_dir}
+ "${SHARED_LIB_STAGING_DIR_DEBUG}"
+ out_targets
+ ${debug_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+ ${release_src_dir}
+ "${SHARED_LIB_STAGING_DIR_RELEASE}"
+ out_targets
+ ${release_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+ ${release_src_dir}
+ "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+ out_targets
+ ${release_files}
+ )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+if (FMOD_SDK_DIR)
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/Release"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+endif (FMOD_SDK_DIR)
+
+#*******************************
+# LLKDU
+set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+if(NOT EXISTS ${internal_llkdu_path})
+ if (EXISTS "${debug_llkdu_src}")
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${debug_llkdu_dst}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
+ DEPENDS ${debug_llkdu_src}
+ COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}"
+ )
+ set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
+ endif (EXISTS "${debug_llkdu_src}")
+
+ if (EXISTS "${release_llkdu_src}")
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${release_llkdu_dst}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
+ DEPENDS ${release_llkdu_src}
+ COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}"
+ )
+ set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
+
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${relwithdebinfo_llkdu_dst}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
+ DEPENDS ${release_llkdu_src}
+ COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+ )
+ set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
+ endif (EXISTS "${release_llkdu_src}")
+
+endif (NOT EXISTS ${internal_llkdu_path})
+
+
+add_custom_target(stage_third_party_libs ALL
+ DEPENDS
+ ${third_party_targets}
+ )
diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake
new file mode 100644
index 0000000000..663c272e50
--- /dev/null
+++ b/indra/cmake/DeploySharedLibs.cmake
@@ -0,0 +1,73 @@
+# DeploySharedLibs.cmake
+# This is a script to be run at build time! Its not part of the cmake configuration!
+# See indra/cmake/LLSharedLibs.cmake for a macro that simplifies adding a command to a target to run this script.
+
+# This script requires a few cmake variable to be set on the command line:
+# BIN_NAME= The full path the the binary to search for dependecies.
+# SEARCH_DIRS= The full paths to dirs to search for dependencies.
+# DST_PATH= The full path where the dependecies will be copied.
+
+# *FIX:Mani - I pulled in the CMake 2.8 GetPrerequisites.cmake script here, because it works on windows where 2.6 did not.
+# Once we have officially upgraded to 2.8 we can just use that version of GetPrerequisites.cmake.
+get_filename_component(current_dir ${CMAKE_CURRENT_LIST_FILE} PATH)
+include(${current_dir}/GetPrerequisites_2_8.cmake)
+
+message("Getting recursive dependencies for file: ${BIN_NAME}")
+
+set(EXCLUDE_SYSTEM 1)
+set(RECURSE 1)
+get_filename_component(EXE_PATH ${BIN_NAME} PATH)
+
+get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" )
+
+foreach(DEP ${RESULTS})
+ Message("Processing dependency: ${DEP}")
+ get_filename_component(DEP_FILE ${DEP} NAME)
+ set(DEP_FILES ${DEP_FILES} ${DEP_FILE})
+endforeach(DEP)
+
+if(DEP_FILES)
+ list(REMOVE_DUPLICATES DEP_FILES)
+endif(DEP_FILES)
+
+foreach(DEP_FILE ${DEP_FILES})
+ if(FOUND_FILES)
+ list(FIND FOUND_FILES ${DEP_FILE} FOUND)
+ else(FOUND_FILES)
+ set(FOUND -1)
+ endif(FOUND_FILES)
+
+ if(FOUND EQUAL -1)
+ find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH)
+ if(DEP_PATH)
+ set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}")
+ set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call.
+ else(DEP_PATH)
+ set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE})
+ endif(DEP_PATH)
+ endif(FOUND EQUAL -1)
+endforeach(DEP_FILE)
+
+if(MISSING_FILES)
+ message("Missing:")
+ foreach(FILE ${MISSING_FILES})
+ message(" ${FILE}")
+ endforeach(FILE)
+ message("Searched in:")
+ foreach(SEARCH_DIR ${SEARCH_DIRS})
+ message(" ${SEARCH_DIR}")
+ endforeach(SEARCH_DIR)
+ message(FATAL_ERROR "Failed")
+endif(MISSING_FILES)
+
+if(FOUND_FILES)
+ foreach(FILE ${FOUND_FILES})
+ get_filename_component(DST_FILE ${FILE} NAME)
+ set(DST_FILE "${DST_PATH}/${DST_FILE}")
+ message("Copying ${FILE} to ${DST_FILE}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
+ )
+ endforeach(FILE ${FOUND_FILES})
+endif(FOUND_FILES)
+message("Success!")
diff --git a/indra/cmake/DragDrop.cmake b/indra/cmake/DragDrop.cmake
new file mode 100644
index 0000000000..c0424396e5
--- /dev/null
+++ b/indra/cmake/DragDrop.cmake
@@ -0,0 +1,23 @@
+# -*- cmake -*-
+
+if (VIEWER)
+
+ set(OS_DRAG_DROP ON CACHE BOOL "Build the viewer with OS level drag and drop turned on or off")
+
+ if (OS_DRAG_DROP)
+
+ if (WINDOWS)
+ add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
+ endif (WINDOWS)
+
+ if (DARWIN)
+ add_definitions(-DLL_OS_DRAGDROP_ENABLED=1)
+ endif (DARWIN)
+
+ if (LINUX)
+ add_definitions(-DLL_OS_DRAGDROP_ENABLED=0)
+ endif (LINUX)
+
+ endif (OS_DRAG_DROP)
+
+endif (VIEWER)
diff --git a/indra/cmake/ExamplePlugin.cmake b/indra/cmake/ExamplePlugin.cmake
new file mode 100644
index 0000000000..599787ad21
--- /dev/null
+++ b/indra/cmake/ExamplePlugin.cmake
@@ -0,0 +1,16 @@
+# -*- cmake -*-
+include(Linking)
+include(Prebuilt)
+
+if (STANDALONE)
+ set(EXAMPLEPLUGIN OFF CACHE BOOL
+ "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
+else (STANDALONE)
+ set(EXAMPLEPLUGIN ON CACHE BOOL
+ "EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
+endif (STANDALONE)
+
+if (WINDOWS)
+elseif (DARWIN)
+elseif (LINUX)
+endif (WINDOWS)
diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake
index 0d334837d4..0ca432da18 100644
--- a/indra/cmake/GStreamer010Plugin.cmake
+++ b/indra/cmake/GStreamer010Plugin.cmake
@@ -24,7 +24,6 @@ elseif (LINUX)
gmodule-2.0
dl
gthread-2.0
- rt
glib-2.0
)
endif (STANDALONE)
diff --git a/indra/cmake/GetPrerequisites_2_8.cmake b/indra/cmake/GetPrerequisites_2_8.cmake
new file mode 100644
index 0000000000..5a24842c89
--- /dev/null
+++ b/indra/cmake/GetPrerequisites_2_8.cmake
@@ -0,0 +1,786 @@
+# GetPrerequisites.cmake
+#
+# This script provides functions to list the .dll, .dylib or .so files that an
+# executable or shared library file depends on. (Its prerequisites.)
+#
+# It uses various tools to obtain the list of required shared library files:
+# dumpbin (Windows)
+# ldd (Linux/Unix)
+# otool (Mac OSX)
+#
+# The following functions are provided by this script:
+# gp_append_unique
+# is_file_executable
+# gp_item_default_embedded_path
+# (projects can override with gp_item_default_embedded_path_override)
+# gp_resolve_item
+# (projects can override with gp_resolve_item_override)
+# gp_resolved_file_type
+# gp_file_type
+# get_prerequisites
+# list_prerequisites
+# list_prerequisites_by_glob
+#
+# Requires CMake 2.6 or greater because it uses function, break, return and
+# PARENT_SCOPE.
+
+#=============================================================================
+# Copyright 2008-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+# gp_append_unique list_var value
+#
+# Append value to the list variable ${list_var} only if the value is not
+# already in the list.
+#
+function(gp_append_unique list_var value)
+ set(contains 0)
+
+ foreach(item ${${list_var}})
+ if("${item}" STREQUAL "${value}")
+ set(contains 1)
+ break()
+ endif("${item}" STREQUAL "${value}")
+ endforeach(item)
+
+ if(NOT contains)
+ set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE)
+ endif(NOT contains)
+endfunction(gp_append_unique)
+
+
+# is_file_executable file result_var
+#
+# Return 1 in ${result_var} if ${file} is a binary executable.
+#
+# Return 0 in ${result_var} otherwise.
+#
+function(is_file_executable file result_var)
+ #
+ # A file is not executable until proven otherwise:
+ #
+ set(${result_var} 0 PARENT_SCOPE)
+
+ get_filename_component(file_full "${file}" ABSOLUTE)
+ string(TOLOWER "${file_full}" file_full_lower)
+
+ # If file name ends in .exe on Windows, *assume* executable:
+ #
+ if(WIN32)
+ if("${file_full_lower}" MATCHES "\\.exe$")
+ set(${result_var} 1 PARENT_SCOPE)
+ return()
+ endif("${file_full_lower}" MATCHES "\\.exe$")
+
+ # A clause could be added here that uses output or return value of dumpbin
+ # to determine ${result_var}. In 99%+? practical cases, the exe name
+ # match will be sufficient...
+ #
+ endif(WIN32)
+
+ # Use the information returned from the Unix shell command "file" to
+ # determine if ${file_full} should be considered an executable file...
+ #
+ # If the file command's output contains "executable" and does *not* contain
+ # "text" then it is likely an executable suitable for prerequisite analysis
+ # via the get_prerequisites macro.
+ #
+ if(UNIX)
+ if(NOT file_cmd)
+ find_program(file_cmd "file")
+ endif(NOT file_cmd)
+
+ if(file_cmd)
+ execute_process(COMMAND "${file_cmd}" "${file_full}"
+ OUTPUT_VARIABLE file_ov
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ # Replace the name of the file in the output with a placeholder token
+ # (the string " _file_full_ ") so that just in case the path name of
+ # the file contains the word "text" or "executable" we are not fooled
+ # into thinking "the wrong thing" because the file name matches the
+ # other 'file' command output we are looking for...
+ #
+ string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}")
+ string(TOLOWER "${file_ov}" file_ov)
+
+ #message(STATUS "file_ov='${file_ov}'")
+ if("${file_ov}" MATCHES "executable")
+ #message(STATUS "executable!")
+ if("${file_ov}" MATCHES "text")
+ #message(STATUS "but text, so *not* a binary executable!")
+ else("${file_ov}" MATCHES "text")
+ set(${result_var} 1 PARENT_SCOPE)
+ return()
+ endif("${file_ov}" MATCHES "text")
+ endif("${file_ov}" MATCHES "executable")
+ else(file_cmd)
+ message(STATUS "warning: No 'file' command, skipping execute_process...")
+ endif(file_cmd)
+ endif(UNIX)
+endfunction(is_file_executable)
+
+
+# gp_item_default_embedded_path item default_embedded_path_var
+#
+# Return the path that others should refer to the item by when the item
+# is embedded inside a bundle.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_item_default_embedded_path_override function.
+#
+function(gp_item_default_embedded_path item default_embedded_path_var)
+
+ # On Windows and Linux, "embed" prerequisites in the same directory
+ # as the executable by default:
+ #
+ set(path "@executable_path")
+ set(overridden 0)
+
+ # On the Mac, relative to the executable depending on the type
+ # of the thing we are embedding:
+ #
+ if(APPLE)
+ #
+ # The assumption here is that all executables in the bundle will be
+ # in same-level-directories inside the bundle. The parent directory
+ # of an executable inside the bundle should be MacOS or a sibling of
+ # MacOS and all embedded paths returned from here will begin with
+ # "@executable_path/../" and will work from all executables in all
+ # such same-level-directories inside the bundle.
+ #
+
+ # By default, embed things right next to the main bundle executable:
+ #
+ set(path "@executable_path/../../Contents/MacOS")
+
+ # Embed .dylibs right next to the main bundle executable:
+ #
+ if(item MATCHES "\\.dylib$")
+ set(path "@executable_path/../MacOS")
+ set(overridden 1)
+ endif(item MATCHES "\\.dylib$")
+
+ # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS):
+ #
+ if(NOT overridden)
+ if(item MATCHES "[^/]+\\.framework/")
+ set(path "@executable_path/../Frameworks")
+ set(overridden 1)
+ endif(item MATCHES "[^/]+\\.framework/")
+ endif(NOT overridden)
+ endif()
+
+ # Provide a hook so that projects can override the default embedded location
+ # of any given library by whatever logic they choose:
+ #
+ if(COMMAND gp_item_default_embedded_path_override)
+ gp_item_default_embedded_path_override("${item}" path)
+ endif(COMMAND gp_item_default_embedded_path_override)
+
+ set(${default_embedded_path_var} "${path}" PARENT_SCOPE)
+endfunction(gp_item_default_embedded_path)
+
+
+# gp_resolve_item context item exepath dirs resolved_item_var
+#
+# Resolve an item into an existing full path file.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_resolve_item_override function.
+#
+function(gp_resolve_item context item exepath dirs resolved_item_var)
+ set(resolved 0)
+ set(resolved_item "${item}")
+
+ # Is it already resolved?
+ #
+ if(EXISTS "${resolved_item}")
+ set(resolved 1)
+ endif(EXISTS "${resolved_item}")
+
+ if(NOT resolved)
+ if(item MATCHES "@executable_path")
+ #
+ # @executable_path references are assumed relative to exepath
+ #
+ string(REPLACE "@executable_path" "${exepath}" ri "${item}")
+ get_filename_component(ri "${ri}" ABSOLUTE)
+
+ if(EXISTS "${ri}")
+ #message(STATUS "info: embedded item exists (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ else(EXISTS "${ri}")
+ message(STATUS "warning: embedded item does not exist '${ri}'")
+ endif(EXISTS "${ri}")
+ endif(item MATCHES "@executable_path")
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ if(item MATCHES "@loader_path")
+ #
+ # @loader_path references are assumed relative to the
+ # PATH of the given "context" (presumably another library)
+ #
+ get_filename_component(contextpath "${context}" PATH)
+ string(REPLACE "@loader_path" "${contextpath}" ri "${item}")
+ get_filename_component(ri "${ri}" ABSOLUTE)
+
+ if(EXISTS "${ri}")
+ #message(STATUS "info: embedded item exists (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ else(EXISTS "${ri}")
+ message(STATUS "warning: embedded item does not exist '${ri}'")
+ endif(EXISTS "${ri}")
+ endif(item MATCHES "@loader_path")
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ set(ri "ri-NOTFOUND")
+ find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH)
+ find_file(ri "${item}" ${exepath} ${dirs} /usr/lib)
+ if(ri)
+ #message(STATUS "info: 'find_file' in exepath/dirs (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ set(ri "ri-NOTFOUND")
+ endif(ri)
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ if(item MATCHES "[^/]+\\.framework/")
+ set(fw "fw-NOTFOUND")
+ find_file(fw "${item}"
+ "~/Library/Frameworks"
+ "/Library/Frameworks"
+ "/System/Library/Frameworks"
+ )
+ if(fw)
+ #message(STATUS "info: 'find_file' found framework (${fw})")
+ set(resolved 1)
+ set(resolved_item "${fw}")
+ set(fw "fw-NOTFOUND")
+ endif(fw)
+ endif(item MATCHES "[^/]+\\.framework/")
+ endif(NOT resolved)
+
+ # Using find_program on Windows will find dll files that are in the PATH.
+ # (Converting simple file names into full path names if found.)
+ #
+ if(WIN32)
+ if(NOT resolved)
+ set(ri "ri-NOTFOUND")
+ find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH)
+ find_program(ri "${item}" PATHS "${exepath};${dirs}")
+ if(ri)
+ #message(STATUS "info: 'find_program' in exepath/dirs (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ set(ri "ri-NOTFOUND")
+ endif(ri)
+ endif(NOT resolved)
+ endif(WIN32)
+
+ # Provide a hook so that projects can override item resolution
+ # by whatever logic they choose:
+ #
+ if(COMMAND gp_resolve_item_override)
+ gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved)
+ endif(COMMAND gp_resolve_item_override)
+
+ if(NOT resolved)
+ message(STATUS "
+warning: cannot resolve item '${item}'
+
+ possible problems:
+ need more directories?
+ need to use InstallRequiredSystemLibraries?
+ run in install tree instead of build tree?
+")
+# message(STATUS "
+#******************************************************************************
+#warning: cannot resolve item '${item}'
+#
+# possible problems:
+# need more directories?
+# need to use InstallRequiredSystemLibraries?
+# run in install tree instead of build tree?
+#
+# context='${context}'
+# item='${item}'
+# exepath='${exepath}'
+# dirs='${dirs}'
+# resolved_item_var='${resolved_item_var}'
+#******************************************************************************
+#")
+ endif(NOT resolved)
+
+ set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE)
+endfunction(gp_resolve_item)
+
+
+# gp_resolved_file_type original_file file exepath dirs type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Use ${exepath} and ${dirs} if necessary to resolve non-absolute ${file}
+# values -- but only for non-embedded items.
+#
+# Possible types are:
+# system
+# local
+# embedded
+# other
+#
+function(gp_resolved_file_type original_file file exepath dirs type_var)
+ #message(STATUS "**")
+
+ if(NOT IS_ABSOLUTE "${original_file}")
+ message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file")
+ endif()
+
+ set(is_embedded 0)
+ set(is_local 0)
+ set(is_system 0)
+
+ set(resolved_file "${file}")
+
+ if("${file}" MATCHES "^@(executable|loader)_path")
+ set(is_embedded 1)
+ endif()
+
+ if(NOT is_embedded)
+ if(NOT IS_ABSOLUTE "${file}")
+ gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file)
+ endif()
+
+ string(TOLOWER "${original_file}" original_lower)
+ string(TOLOWER "${resolved_file}" lower)
+
+ if(UNIX)
+ if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(APPLE)
+ if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(WIN32)
+ string(TOLOWER "$ENV{SystemRoot}" sysroot)
+ string(REGEX REPLACE "\\\\" "/" sysroot "${sysroot}")
+
+ string(TOLOWER "$ENV{windir}" windir)
+ string(REGEX REPLACE "\\\\" "/" windir "${windir}")
+
+ if(lower MATCHES "^(${sysroot}/system|${windir}/system|${sysroot}/syswow|${windir}/syswow|(.*/)*msvc[^/]+dll)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(NOT is_system)
+ get_filename_component(original_path "${original_lower}" PATH)
+ get_filename_component(path "${lower}" PATH)
+ if("${original_path}" STREQUAL "${path}")
+ set(is_local 1)
+ endif()
+ endif()
+ endif()
+
+ # Return type string based on computed booleans:
+ #
+ set(type "other")
+
+ if(is_system)
+ set(type "system")
+ elseif(is_embedded)
+ set(type "embedded")
+ elseif(is_local)
+ set(type "local")
+ endif()
+
+ #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'")
+ #message(STATUS " type: '${type}'")
+
+ if(NOT is_embedded)
+ if(NOT IS_ABSOLUTE "${resolved_file}")
+ if(lower MATCHES "^msvc[^/]+dll" AND is_system)
+ message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'")
+ else()
+ message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect")
+ endif()
+ endif()
+ endif()
+
+ set(${type_var} "${type}" PARENT_SCOPE)
+
+ #message(STATUS "**")
+endfunction()
+
+
+# gp_file_type original_file file type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Possible types are:
+# system
+# local
+# embedded
+# other
+#
+function(gp_file_type original_file file type_var)
+ if(NOT IS_ABSOLUTE "${original_file}")
+ message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file")
+ endif()
+
+ get_filename_component(exepath "${original_file}" PATH)
+
+ set(type "")
+ gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type)
+
+ set(${type_var} "${type}" PARENT_SCOPE)
+endfunction(gp_file_type)
+
+
+# get_prerequisites target prerequisites_var exclude_system recurse dirs
+#
+# Get the list of shared library files required by ${target}. The list in
+# the variable named ${prerequisites_var} should be empty on first entry to
+# this function. On exit, ${prerequisites_var} will contain the list of
+# required shared library files.
+#
+# target is the full path to an executable file
+#
+# prerequisites_var is the name of a CMake variable to contain the results
+#
+# exclude_system is 0 or 1: 0 to include "system" prerequisites , 1 to
+# exclude them
+#
+# recurse is 0 or 1: 0 for direct prerequisites only, 1 for all prerequisites
+# recursively
+#
+# exepath is the path to the top level executable used for @executable_path
+# replacment on the Mac
+#
+# dirs is a list of paths where libraries might be found: these paths are
+# searched first when a target without any path info is given. Then standard
+# system locations are also searched: PATH, Framework locations, /usr/lib...
+#
+function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs)
+ set(verbose 0)
+ set(eol_char "E")
+
+ if(NOT IS_ABSOLUTE "${target}")
+ message("warning: target '${target}' is not absolute...")
+ endif(NOT IS_ABSOLUTE "${target}")
+
+ if(NOT EXISTS "${target}")
+ message("warning: target '${target}' does not exist...")
+ endif(NOT EXISTS "${target}")
+
+ # <setup-gp_tool-vars>
+ #
+ # Try to choose the right tool by default. Caller can set gp_tool prior to
+ # calling this function to force using a different tool.
+ #
+ if("${gp_tool}" STREQUAL "")
+ set(gp_tool "ldd")
+ if(APPLE)
+ set(gp_tool "otool")
+ endif(APPLE)
+ if(WIN32)
+ set(gp_tool "dumpbin")
+ endif(WIN32)
+ endif("${gp_tool}" STREQUAL "")
+
+ set(gp_tool_known 0)
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(gp_cmd_args "")
+ set(gp_regex "^[\t ]*[^\t ]+ => ([^\t ]+).*${eol_char}$")
+ set(gp_regex_cmp_count 1)
+ set(gp_tool_known 1)
+ endif("${gp_tool}" STREQUAL "ldd")
+
+ if("${gp_tool}" STREQUAL "otool")
+ set(gp_cmd_args "-L")
+ set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$")
+ set(gp_regex_cmp_count 3)
+ set(gp_tool_known 1)
+ endif("${gp_tool}" STREQUAL "otool")
+
+ if("${gp_tool}" STREQUAL "dumpbin")
+ set(gp_cmd_args "/dependents")
+ set(gp_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$")
+ set(gp_regex_cmp_count 1)
+ set(gp_tool_known 1)
+ set(ENV{VS_UNICODE_OUTPUT} "") # Block extra output from inside VS IDE.
+ endif("${gp_tool}" STREQUAL "dumpbin")
+
+ if(NOT gp_tool_known)
+ message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...")
+ message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'")
+ message(STATUS "Valid gp_tool values are dumpbin, ldd and otool.")
+ return()
+ endif(NOT gp_tool_known)
+
+ set(gp_cmd_paths ${gp_cmd_paths}
+ "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin"
+ "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin"
+ "C:/Program Files/Microsoft Visual Studio 8/VC/BIN"
+ "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN"
+ "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN"
+ "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN"
+ "/usr/local/bin"
+ "/usr/bin"
+ )
+
+ find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths})
+
+ if(NOT gp_cmd)
+ message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...")
+ return()
+ endif(NOT gp_cmd)
+
+ if("${gp_tool}" STREQUAL "dumpbin")
+ # When running dumpbin, it also needs the "Common7/IDE" directory in the
+ # PATH. It will already be in the PATH if being run from a Visual Studio
+ # command prompt. Add it to the PATH here in case we are running from a
+ # different command prompt.
+ #
+ get_filename_component(gp_cmd_dir "${gp_cmd}" PATH)
+ get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE)
+ if(EXISTS "${gp_cmd_dlls_dir}")
+ # only add to the path if it is not already in the path
+ if(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+ set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}")
+ endif(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+ endif(EXISTS "${gp_cmd_dlls_dir}")
+ endif("${gp_tool}" STREQUAL "dumpbin")
+ #
+ # </setup-gp_tool-vars>
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(old_ld_env "$ENV{LD_LIBRARY_PATH}")
+ foreach(dir ${exepath} ${dirs})
+ set(ENV{LD_LIBRARY_PATH} "${dir}:$ENV{LD_LIBRARY_PATH}")
+ endforeach(dir)
+ endif("${gp_tool}" STREQUAL "ldd")
+
+
+ # Track new prerequisites at each new level of recursion. Start with an
+ # empty list at each level:
+ #
+ set(unseen_prereqs)
+
+ # Run gp_cmd on the target:
+ #
+ execute_process(
+ COMMAND ${gp_cmd} ${gp_cmd_args} ${target}
+ OUTPUT_VARIABLE gp_cmd_ov
+ )
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(ENV{LD_LIBRARY_PATH} "${old_ld_env}")
+ endif("${gp_tool}" STREQUAL "ldd")
+
+ if(verbose)
+ message(STATUS "<RawOutput cmd='${gp_cmd} ${gp_cmd_args} ${target}'>")
+ message(STATUS "gp_cmd_ov='${gp_cmd_ov}'")
+ message(STATUS "</RawOutput>")
+ endif(verbose)
+
+ get_filename_component(target_dir "${target}" PATH)
+
+ # Convert to a list of lines:
+ #
+ string(REGEX REPLACE ";" "\\\\;" candidates "${gp_cmd_ov}")
+ string(REGEX REPLACE "\n" "${eol_char};" candidates "${candidates}")
+
+ # Analyze each line for file names that match the regular expression:
+ #
+ foreach(candidate ${candidates})
+ if("${candidate}" MATCHES "${gp_regex}")
+ # Extract information from each candidate:
+ string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}")
+
+ if(gp_regex_cmp_count GREATER 1)
+ string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}")
+ endif(gp_regex_cmp_count GREATER 1)
+
+ if(gp_regex_cmp_count GREATER 2)
+ string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}")
+ endif(gp_regex_cmp_count GREATER 2)
+
+ # Use the raw_item as the list entries returned by this function. Use the
+ # gp_resolve_item function to resolve it to an actual full path file if
+ # necessary.
+ #
+ set(item "${raw_item}")
+
+ # Add each item unless it is excluded:
+ #
+ set(add_item 1)
+
+ if(${exclude_system})
+ set(type "")
+ gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type)
+ if("${type}" STREQUAL "system")
+ set(add_item 0)
+ endif("${type}" STREQUAL "system")
+ endif(${exclude_system})
+
+ if(add_item)
+ list(LENGTH ${prerequisites_var} list_length_before_append)
+ gp_append_unique(${prerequisites_var} "${item}")
+ list(LENGTH ${prerequisites_var} list_length_after_append)
+
+ if(${recurse})
+ # If item was really added, this is the first time we have seen it.
+ # Add it to unseen_prereqs so that we can recursively add *its*
+ # prerequisites...
+ #
+ # But first: resolve its name to an absolute full path name such
+ # that the analysis tools can simply accept it as input.
+ #
+ if(NOT list_length_before_append EQUAL list_length_after_append)
+ gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item)
+ set(unseen_prereqs ${unseen_prereqs} "${resolved_item}")
+ endif(NOT list_length_before_append EQUAL list_length_after_append)
+ endif(${recurse})
+ endif(add_item)
+ else("${candidate}" MATCHES "${gp_regex}")
+ if(verbose)
+ message(STATUS "ignoring non-matching line: '${candidate}'")
+ endif(verbose)
+ endif("${candidate}" MATCHES "${gp_regex}")
+ endforeach(candidate)
+
+ list(LENGTH ${prerequisites_var} prerequisites_var_length)
+ if(prerequisites_var_length GREATER 0)
+ list(SORT ${prerequisites_var})
+ endif(prerequisites_var_length GREATER 0)
+ if(${recurse})
+ set(more_inputs ${unseen_prereqs})
+ foreach(input ${more_inputs})
+ get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}")
+ endforeach(input)
+ endif(${recurse})
+
+ set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE)
+endfunction(get_prerequisites)
+
+
+# list_prerequisites target all exclude_system verbose
+#
+# ARGV0 (target) is the full path to an executable file
+#
+# optional ARGV1 (all) is 0 or 1: 0 for direct prerequisites only,
+# 1 for all prerequisites recursively
+#
+# optional ARGV2 (exclude_system) is 0 or 1: 0 to include "system"
+# prerequisites , 1 to exclude them
+#
+# optional ARGV3 (verbose) is 0 or 1: 0 to print only full path
+# names of prerequisites, 1 to print extra information
+#
+function(list_prerequisites target)
+ if("${ARGV1}" STREQUAL "")
+ set(all 1)
+ else("${ARGV1}" STREQUAL "")
+ set(all "${ARGV1}")
+ endif("${ARGV1}" STREQUAL "")
+
+ if("${ARGV2}" STREQUAL "")
+ set(exclude_system 0)
+ else("${ARGV2}" STREQUAL "")
+ set(exclude_system "${ARGV2}")
+ endif("${ARGV2}" STREQUAL "")
+
+ if("${ARGV3}" STREQUAL "")
+ set(verbose 0)
+ else("${ARGV3}" STREQUAL "")
+ set(verbose "${ARGV3}")
+ endif("${ARGV3}" STREQUAL "")
+
+ set(count 0)
+ set(count_str "")
+ set(print_count "${verbose}")
+ set(print_prerequisite_type "${verbose}")
+ set(print_target "${verbose}")
+ set(type_str "")
+
+ get_filename_component(exepath "${target}" PATH)
+
+ set(prereqs "")
+ get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "")
+
+ if(print_target)
+ message(STATUS "File '${target}' depends on:")
+ endif(print_target)
+
+ foreach(d ${prereqs})
+ math(EXPR count "${count} + 1")
+
+ if(print_count)
+ set(count_str "${count}. ")
+ endif(print_count)
+
+ if(print_prerequisite_type)
+ gp_file_type("${target}" "${d}" type)
+ set(type_str " (${type})")
+ endif(print_prerequisite_type)
+
+ message(STATUS "${count_str}${d}${type_str}")
+ endforeach(d)
+endfunction(list_prerequisites)
+
+
+# list_prerequisites_by_glob glob_arg glob_exp
+#
+# glob_arg is GLOB or GLOB_RECURSE
+#
+# glob_exp is a globbing expression used with "file(GLOB" to retrieve a list
+# of matching files. If a matching file is executable, its prerequisites are
+# listed.
+#
+# Any additional (optional) arguments provided are passed along as the
+# optional arguments to the list_prerequisites calls.
+#
+function(list_prerequisites_by_glob glob_arg glob_exp)
+ message(STATUS "=============================================================================")
+ message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'")
+ message(STATUS "")
+ file(${glob_arg} file_list ${glob_exp})
+ foreach(f ${file_list})
+ is_file_executable("${f}" is_f_executable)
+ if(is_f_executable)
+ message(STATUS "=============================================================================")
+ list_prerequisites("${f}" ${ARGN})
+ message(STATUS "")
+ endif(is_f_executable)
+ endforeach(f)
+endfunction(list_prerequisites_by_glob)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 355ecb58f0..946fc6b375 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -23,12 +23,11 @@ else (STANDALONE)
endif (STANDALONE)
if (GOOGLE_PERFTOOLS_FOUND)
- set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.")
+ # XXX Disable temporarily, until we have compilation issues on 64-bit
+ # Etch sorted.
+ set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Build with Google PerfTools support.")
endif (GOOGLE_PERFTOOLS_FOUND)
-# XXX Disable temporarily, until we have compilation issues on 64-bit
-# Etch sorted.
-set(USE_GOOGLE_PERFTOOLS OFF)
if (WINDOWS)
# *TODO -reenable this once we get server usage sorted out
#set(USE_GOOGLE_PERFTOOLS ON)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index d8f64199cf..bf4d9b72a9 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -107,6 +107,8 @@ INCLUDE(GoogleMock)
# Setup target
ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
+ SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
+
#
# Per-codefile additional / external project dep and lib dep property extraction
#
@@ -142,8 +144,10 @@ INCLUDE(GoogleMock)
IF(WINDOWS)
set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ ELSEIF(DARWIN)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
ENDIF(WINDOWS)
LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD})
@@ -200,6 +204,7 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
endif(TEST_DEBUG)
ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
+ SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
# Add link deps to the executable
if(TEST_DEBUG)
@@ -230,8 +235,10 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
IF(WINDOWS)
set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ ELSEIF(DARWIN)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
ENDIF(WINDOWS)
LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command})
@@ -250,4 +257,4 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
# Use CTEST? Not sure how to yet...
# ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
-ENDFUNCTION(LL_ADD_INTEGRATION_TEST) \ No newline at end of file
+ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
diff --git a/indra/cmake/LLAudio.cmake b/indra/cmake/LLAudio.cmake
index 89b790c6b0..7c248dfc72 100644
--- a/indra/cmake/LLAudio.cmake
+++ b/indra/cmake/LLAudio.cmake
@@ -6,4 +6,5 @@ set(LLAUDIO_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llaudio
)
-set(LLAUDIO_LIBRARIES llaudio ${OPENAL_LIBRARIES})
+# be exhaustive here
+set(LLAUDIO_LIBRARIES llaudio ${VORBISFILE_LIBRARIES} ${VORBIS_LIBRARIES} ${VORBISENC_LIBRARIES} ${OGG_LIBRARIES} ${OPENAL_LIBRARIES})
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
new file mode 100644
index 0000000000..6f602680f4
--- /dev/null
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -0,0 +1,74 @@
+# ll_deploy_sharedlibs_command
+# target_exe: the cmake target of the executable for which the shared libs will be deployed.
+macro(ll_deploy_sharedlibs_command target_exe)
+ get_target_property(TARGET_LOCATION ${target_exe} LOCATION)
+ get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH)
+
+ if(DARWIN)
+ set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources")
+ get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
+ if(IS_BUNDLE)
+ # If its a bundle the exe is not in the target location, this should find it.
+ get_filename_component(TARGET_FILE ${TARGET_LOCATION} NAME)
+ set(OUTPUT_PATH ${TARGET_LOCATION}.app/Contents/MacOS)
+ set(TARGET_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
+ set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources)
+ endif(IS_BUNDLE)
+ elseif(WINDOWS)
+ set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" "$ENV{SystemRoot}/system32")
+ elseif(LINUX)
+ set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}")
+ set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
+ endif(DARWIN)
+
+ add_custom_command(
+ TARGET ${target_exe} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ "-DBIN_NAME=\"${TARGET_LOCATION}\""
+ "-DSEARCH_DIRS=\"${SEARCH_DIRS}\""
+ "-DDST_PATH=\"${OUTPUT_PATH}\""
+ "-P"
+ "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
+ )
+
+endmacro(ll_deploy_sharedlibs_command)
+
+# ll_stage_sharedlib
+# Performs config and adds a copy command for a sharedlib target.
+macro(ll_stage_sharedlib DSO_TARGET)
+ if(SHARED_LIB_STAGING_DIR)
+ # target gets written to the DLL staging directory.
+ # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
+ set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
+ if(NOT WINDOWS)
+ get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
+ get_filename_component(DSO_FILE ${DSO_PATH} NAME)
+ if(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
+ else(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ endif(DARWIN)
+
+ # *TODO - maybe make this a symbolic link? -brad
+ add_custom_command(
+ TARGET ${DSO_TARGET} POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${DSO_PATH}
+ ${SHARED_LIB_STAGING_DIR_CONFIG}/${DSO_FILE}
+ COMMENT "Copying llcommon to the staging folder."
+ )
+ endif(NOT WINDOWS)
+ endif(SHARED_LIB_STAGING_DIR)
+
+ if (DARWIN)
+ set_target_properties(${DSO_TARGET} PROPERTIES
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path/../Resources"
+ )
+ endif(DARWIN)
+
+endmacro(ll_stage_sharedlib) \ No newline at end of file
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 1f3553539f..bca99caf2a 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -6,6 +6,7 @@ if (NOT STANDALONE)
set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release)
set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug)
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables")
elseif (LINUX)
if (VIEWER)
set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
@@ -14,12 +15,14 @@ if (NOT STANDALONE)
endif (VIEWER)
set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged .sos")
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib CACHE FILEPATH "Location of staged .sos")
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin CACHE FILEPATH "Location of staged executables")
elseif (DARWIN)
set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
+ set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)" CACHE FILEPATH "Location of staged executables")
endif (WINDOWS)
endif (NOT STANDALONE)
diff --git a/indra/cmake/QuickTimePlugin.cmake b/indra/cmake/QuickTimePlugin.cmake
index 8afd8f304c..02f432e3c1 100644
--- a/indra/cmake/QuickTimePlugin.cmake
+++ b/indra/cmake/QuickTimePlugin.cmake
@@ -12,13 +12,13 @@ elseif (WINDOWS)
set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK"
CACHE PATH "Location of the QuickTime SDK.")
- find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient
+ find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient.lib
PATHS
${ARCH_PREBUILT_DIRS_DEBUG}
"${QUICKTIME_SDK_DIR}\\libraries"
)
- find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient
+ find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient.lib
PATHS
${ARCH_PREBUILT_DIRS_RELEASE}
"${QUICKTIME_SDK_DIR}\\libraries"
diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake
index 3b73dc82df..fa4e387dd5 100644
--- a/indra/cmake/TemplateCheck.cmake
+++ b/indra/cmake/TemplateCheck.cmake
@@ -5,7 +5,7 @@ include(Python)
macro (check_message_template _target)
add_custom_command(
TARGET ${_target}
- PRE_LINK
+ POST_BUILD
COMMAND ${PYTHON_EXECUTABLE}
ARGS ${SCRIPTS_DIR}/template_verifier.py
--mode=development --cache_master
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 6559051b5a..db0b44eb8f 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -24,6 +24,7 @@ set(SCRIPTS_PREFIX ../scripts)
set(SERVER_PREFIX)
set(VIEWER_PREFIX)
set(INTEGRATION_TESTS_PREFIX)
+set(LL_TESTS ON CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation")
set(LIBS_CLOSED_DIR ${CMAKE_SOURCE_DIR}/${LIBS_CLOSED_PREFIX})
set(LIBS_OPEN_DIR ${CMAKE_SOURCE_DIR}/${LIBS_OPEN_PREFIX})
@@ -115,4 +116,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both
")
endif (LINUX AND SERVER AND VIEWER)
+
+set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")
+
source_group("CMake Rules" FILES CMakeLists.txt)
diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake
index 9ec23e80ca..1c572ab27f 100644
--- a/indra/cmake/WebKitLibPlugin.cmake
+++ b/indra/cmake/WebKitLibPlugin.cmake
@@ -51,6 +51,7 @@ elseif (LINUX)
QtGui
QtCore
+ jpeg
fontconfig
X11
Xrender
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 17bce6f434..0f6967e42a 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -1,111 +1,111 @@
-#!/usr/bin/python
-"""\
-@file run_build_test.py
-@author Nat Goodspeed
-@date 2009-09-03
-@brief Helper script to allow CMake to run some command after setting
- environment variables.
-
-CMake has commands to run an external program. But remember that each CMake
-command must be backed by multiple build-system implementations. Unfortunately
-it seems CMake can't promise that every target build system can set specified
-environment variables before running the external program of interest.
-
-This helper script is a workaround. It simply sets the requested environment
-variables and then executes the program specified on the rest of its command
-line.
-
-Example:
-
-python run_build_test.py -DFOO=bar myprog somearg otherarg
-
-sets environment variable FOO=bar, then runs:
-myprog somearg otherarg
-
-$LicenseInfo:firstyear=2009&license=internal$
-Copyright (c) 2009, Linden Research, Inc.
-$/LicenseInfo$
-"""
-
-import os
-import sys
-import subprocess
-
-def main(command, libpath=[], vars={}):
- """Pass:
- command is a sequence (e.g. a list) of strings. The first item in the list
- must be the command name, the rest are its arguments.
-
- libpath is a sequence of directory pathnames. These will be appended to
- the platform-specific dynamic library search path environment variable.
-
- vars is a dict of arbitrary (var, value) pairs to be added to the
- environment before running 'command'.
-
- This function runs the specified command, waits for it to terminate and
- returns its return code. This will be negative if the command terminated
- with a signal, else it will be the process's specified exit code.
- """
- # Handle platform-dependent libpath first.
- if sys.platform == "win32":
- lpvars = ["PATH"]
- elif sys.platform == "darwin":
- lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
- elif sys.platform.startswith("linux"):
- lpvars = ["LD_LIBRARY_PATH"]
- else:
- # No idea what the right pathname might be! But only crump if this
- # feature is requested.
- if libpath:
- raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
- lpvars = []
- for var in lpvars:
- # Split the existing path. Bear in mind that the variable in question
- # might not exist; instead of KeyError, just use an empty string.
- dirs = os.environ.get(var, "").split(os.pathsep)
- # Append the sequence in libpath
-## print "%s += %r" % (var, libpath)
- dirs.extend(libpath)
- # Now rebuild the path string. This way we use a minimum of separators
- # -- and we avoid adding a pointless separator when libpath is empty.
- os.environ[var] = os.pathsep.join(dirs)
- # Now handle arbitrary environment variables. The tricky part is ensuring
- # that all the keys and values we try to pass are actually strings.
-## if vars:
-## print "Setting:"
-## for key, value in vars.iteritems():
-## print "%s=%s" % (key, value)
- os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
- # Run the child process.
-## print "Running: %s" % " ".join(command)
- return subprocess.call(command)
-
-if __name__ == "__main__":
- from optparse import OptionParser
- parser = OptionParser(usage="usage: %prog [options] command args...")
- # We want optparse support for the options we ourselves handle -- but we
- # DO NOT want it looking at options for the executable we intend to run,
- # rejecting them as invalid because we don't define them. So configure the
- # parser to stop looking for options as soon as it sees the first
- # positional argument (traditional Unix syntax).
- parser.disable_interspersed_args()
- parser.add_option("-D", "--define", dest="vars", default=[], action="append",
- metavar="VAR=value",
- help="Add VAR=value to the env variables defined")
- parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
- metavar="DIR",
- help="Add DIR to the platform-dependent DLL search path")
- opts, args = parser.parse_args()
- # What we have in opts.vars is a list of strings of the form "VAR=value"
- # or possibly just "VAR". What we want is a dict. We can build that dict by
- # constructing a list of ["VAR", "value"] pairs -- so split each
- # "VAR=value" string on the '=' sign (but only once, in case we have
- # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
- # the list returned by split(), then slice off anything after the pair we
- # want.
- rc = main(command=args, libpath=opts.libpath,
- vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
- if rc not in (None, 0):
- print >>sys.stderr, "Failure running: %s" % " ".join(args)
- print >>sys.stderr, "Error: %s" % rc
- sys.exit((rc < 0) and 255 or rc)
+#!/usr/bin/python
+"""\
+@file run_build_test.py
+@author Nat Goodspeed
+@date 2009-09-03
+@brief Helper script to allow CMake to run some command after setting
+ environment variables.
+
+CMake has commands to run an external program. But remember that each CMake
+command must be backed by multiple build-system implementations. Unfortunately
+it seems CMake can't promise that every target build system can set specified
+environment variables before running the external program of interest.
+
+This helper script is a workaround. It simply sets the requested environment
+variables and then executes the program specified on the rest of its command
+line.
+
+Example:
+
+python run_build_test.py -DFOO=bar myprog somearg otherarg
+
+sets environment variable FOO=bar, then runs:
+myprog somearg otherarg
+
+$LicenseInfo:firstyear=2009&license=internal$
+Copyright (c) 2009, Linden Research, Inc.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+import subprocess
+
+def main(command, libpath=[], vars={}):
+ """Pass:
+ command is a sequence (e.g. a list) of strings. The first item in the list
+ must be the command name, the rest are its arguments.
+
+ libpath is a sequence of directory pathnames. These will be appended to
+ the platform-specific dynamic library search path environment variable.
+
+ vars is a dict of arbitrary (var, value) pairs to be added to the
+ environment before running 'command'.
+
+ This function runs the specified command, waits for it to terminate and
+ returns its return code. This will be negative if the command terminated
+ with a signal, else it will be the process's specified exit code.
+ """
+ # Handle platform-dependent libpath first.
+ if sys.platform == "win32":
+ lpvars = ["PATH"]
+ elif sys.platform == "darwin":
+ lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
+ elif sys.platform.startswith("linux"):
+ lpvars = ["LD_LIBRARY_PATH"]
+ else:
+ # No idea what the right pathname might be! But only crump if this
+ # feature is requested.
+ if libpath:
+ raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
+ lpvars = []
+ for var in lpvars:
+ # Split the existing path. Bear in mind that the variable in question
+ # might not exist; instead of KeyError, just use an empty string.
+ dirs = os.environ.get(var, "").split(os.pathsep)
+ # Append the sequence in libpath
+ print "%s += %r" % (var, libpath)
+ dirs.extend(libpath)
+ # Now rebuild the path string. This way we use a minimum of separators
+ # -- and we avoid adding a pointless separator when libpath is empty.
+ os.environ[var] = os.pathsep.join(dirs)
+ # Now handle arbitrary environment variables. The tricky part is ensuring
+ # that all the keys and values we try to pass are actually strings.
+ if vars:
+ print "Setting:"
+ for key, value in vars.iteritems():
+ print "%s=%s" % (key, value)
+ os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
+ # Run the child process.
+ print "Running: %s" % " ".join(command)
+ return subprocess.call(command)
+
+if __name__ == "__main__":
+ from optparse import OptionParser
+ parser = OptionParser(usage="usage: %prog [options] command args...")
+ # We want optparse support for the options we ourselves handle -- but we
+ # DO NOT want it looking at options for the executable we intend to run,
+ # rejecting them as invalid because we don't define them. So configure the
+ # parser to stop looking for options as soon as it sees the first
+ # positional argument (traditional Unix syntax).
+ parser.disable_interspersed_args()
+ parser.add_option("-D", "--define", dest="vars", default=[], action="append",
+ metavar="VAR=value",
+ help="Add VAR=value to the env variables defined")
+ parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
+ metavar="DIR",
+ help="Add DIR to the platform-dependent DLL search path")
+ opts, args = parser.parse_args()
+ # What we have in opts.vars is a list of strings of the form "VAR=value"
+ # or possibly just "VAR". What we want is a dict. We can build that dict by
+ # constructing a list of ["VAR", "value"] pairs -- so split each
+ # "VAR=value" string on the '=' sign (but only once, in case we have
+ # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
+ # the list returned by split(), then slice off anything after the pair we
+ # want.
+ rc = main(command=args, libpath=opts.libpath,
+ vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
+ if rc not in (None, 0):
+ print >>sys.stderr, "Failure running: %s" % " ".join(args)
+ print >>sys.stderr, "Error: %s" % rc
+ sys.exit((rc < 0) and 255 or rc)
diff --git a/indra/develop.py b/indra/develop.py
index 7836c97473..0a2d3c5e52 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -41,6 +41,7 @@ import shutil
import socket
import sys
import commands
+import subprocess
class CommandError(Exception):
pass
@@ -239,6 +240,7 @@ class UnixSetup(PlatformSetup):
def run(self, command, name=None):
'''Run a program. If the program fails, raise an exception.'''
+ sys.stdout.flush()
ret = os.system(command)
if ret:
if name is None:
@@ -456,7 +458,7 @@ class DarwinSetup(UnixSetup):
targets = ' '.join(['-target ' + repr(t) for t in targets])
else:
targets = ''
- cmd = ('xcodebuild -configuration %s %s %s' %
+ cmd = ('xcodebuild -configuration %s %s %s | grep -v "^[[:space:]]*setenv" ; exit ${PIPESTATUS[0]}' %
(self.build_type, ' '.join(opts), targets))
for d in self.build_dirs():
try:
@@ -503,7 +505,7 @@ class WindowsSetup(PlatformSetup):
break
else:
print >> sys.stderr, 'Cannot find a Visual Studio installation!'
- eys.exit(1)
+ sys.exit(1)
return self._generator
def _set_generator(self, gen):
@@ -572,25 +574,32 @@ class WindowsSetup(PlatformSetup):
if self.gens[self.generator]['ver'] in [ r'8.0', r'9.0' ]:
config = '\"%s|Win32\"' % config
- return "buildconsole %s.sln /build %s" % (self.project_name, config)
+ executable = 'buildconsole'
+ cmd = "%(bin)s %(prj)s.sln /build /cfg=%(cfg)s" % {'prj': self.project_name, 'cfg': config, 'bin': executable}
+ return (executable, cmd)
# devenv.com is CLI friendly, devenv.exe... not so much.
- return ('"%sdevenv.com" %s.sln /build %s' %
- (self.find_visual_studio(), self.project_name, self.build_type))
+ executable = '%sdevenv.com' % (self.find_visual_studio(),)
+ cmd = ('"%s" %s.sln /build %s' %
+ (executable, self.project_name, self.build_type))
+ return (executable, cmd)
def run(self, command, name=None, retry_on=None, retries=1):
'''Run a program. If the program fails, raise an exception.'''
+ assert name is not None, 'On windows an executable path must be given in name. [DEV-44838]'
+ if os.path.isfile(name):
+ path = name
+ else:
+ path = self.find_in_path(name)[0]
while retries:
retries = retries - 1
- ret = os.system(command)
- if ret:
- if name is None:
- name = command.split(None, 1)[0]
- path = self.find_in_path(name)
- if not path:
- error = 'was not found'
- else:
- error = 'exited with status %d' % ret
+ print "develop.py tries to run:", command
+ ret = subprocess.call(command, executable=path)
+ print "got ret", ret, "from", command
+ if ret == 0:
+ break
+ else:
+ error = 'exited with status %d' % ret
if retry_on is not None and retry_on == ret:
print "Retrying... the command %r %s" % (name, error)
else:
@@ -612,18 +621,21 @@ class WindowsSetup(PlatformSetup):
if prev_build == self.build_type:
# Only run vstool if the build type has changed.
continue
- vstool_cmd = (os.path.join('tools','vstool','VSTool.exe') +
+ executable = os.path.join('tools','vstool','VSTool.exe')
+ vstool_cmd = (executable +
' --solution ' +
os.path.join(build_dir,'SecondLife.sln') +
' --config ' + self.build_type +
' --startup secondlife-bin')
print 'Running %r in %r' % (vstool_cmd, getcwd())
- self.run(vstool_cmd)
+ self.run(vstool_cmd, name=executable)
print >> open(stamp, 'w'), self.build_type
def run_build(self, opts, targets):
+ for t in targets:
+ assert t.strip(), 'Unexpected empty targets: ' + repr(targets)
cwd = getcwd()
- build_cmd = self.get_build_cmd()
+ executable, build_cmd = self.get_build_cmd()
for d in self.build_dirs():
try:
@@ -632,11 +644,11 @@ class WindowsSetup(PlatformSetup):
for t in targets:
cmd = '%s /project %s %s' % (build_cmd, t, ' '.join(opts))
print 'Running %r in %r' % (cmd, d)
- self.run(cmd, retry_on=4, retries=3)
+ self.run(cmd, name=executable, retry_on=4, retries=3)
else:
cmd = '%s %s' % (build_cmd, ' '.join(opts))
print 'Running %r in %r' % (cmd, d)
- self.run(cmd, retry_on=4, retries=3)
+ self.run(cmd, name=executable, retry_on=4, retries=3)
finally:
os.chdir(cwd)
diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
index 316fd810c0..c6e2e79a09 100644
--- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp
+++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
@@ -85,7 +85,6 @@ void LLWidgetReg::initClass(bool register_widgets)
LLDefaultChildRegistry::Register<LLLayoutStack> layout_stack("layout_stack", &LLLayoutStack::fromXML);
LLDefaultChildRegistry::Register<LLProgressBar> progress_bar("progress_bar");
LLDefaultChildRegistry::Register<LLRadioGroup> radio_group("radio_group");
- LLDefaultChildRegistry::Register<LLRadioCtrl> radio_item("radio_item");
LLDefaultChildRegistry::Register<LLSearchEditor> search_editor("search_editor");
LLDefaultChildRegistry::Register<LLScrollContainer> scroll_container("scroll_container");
LLDefaultChildRegistry::Register<LLScrollingPanelList> scrolling_panel_list("scrolling_panel_list");
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 59c84e571b..7e5b86c53f 100644
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -119,10 +119,10 @@ ARGUMENTS=[
On Linux this would try to use Linux_i686Manifest.""",
default=""),
dict(name='build', description='Build directory.', default=DEFAULT_SRCTREE),
+ dict(name='buildtype', description='Build type (i.e. Debug, Release, RelWithDebInfo).', default=None),
dict(name='configuration',
- description="""The build configuration used. Only used on OS X for
- now, but it could be used for other platforms as well.""",
- default="Universal"),
+ description="""The build configuration used.""",
+ default="Release"),
dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE),
dict(name='grid',
description="""Which grid the client will try to connect to. Even
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index 4b19e28066..ab62a0d0af 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -54,12 +54,5 @@ target_link_libraries(linux-crash-logger
${DB_LIBRARIES}
)
-add_custom_command(
- OUTPUT linux-crash-logger-stripped
- COMMAND strip
- ARGS --strip-debug -o linux-crash-logger-stripped linux-crash-logger
- DEPENDS linux-crash-logger
- )
-
-add_custom_target(linux-crash-logger-strip-target ALL
- DEPENDS linux-crash-logger-stripped)
+add_custom_target(linux-crash-logger-target ALL
+ DEPENDS linux-crash-logger)
diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt
index 9fe32ecb46..00a78b2a8f 100644
--- a/indra/linux_updater/CMakeLists.txt
+++ b/indra/linux_updater/CMakeLists.txt
@@ -47,12 +47,5 @@ target_link_libraries(linux-updater
${LLCOMMON_LIBRARIES}
)
-add_custom_command(
- OUTPUT linux-updater-stripped
- COMMAND strip
- ARGS --strip-debug -o linux-updater-stripped linux-updater
- DEPENDS linux-updater
- )
-
-add_custom_target(linux-updater-strip-target ALL
- DEPENDS linux-updater-stripped)
+add_custom_target(linux-updater-target ALL
+ DEPENDS linux-updater)
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 9e9e1aaeae..bfa2c34c12 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES
llaudioengine.cpp
lllistener.cpp
llaudiodecodemgr.cpp
- llvorbisdecode.cpp
llvorbisencode.cpp
)
@@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES
llaudioengine.h
lllistener.h
llaudiodecodemgr.h
- llvorbisdecode.h
llvorbisencode.h
llwindgen.h
)
@@ -60,11 +58,11 @@ if (FMOD)
)
if (LINUX)
- if (${CXX_VERSION} MATCHES "4.[23]")
+ if (${CXX_VERSION_NUMBER} GREATER 419)
set_source_files_properties(llaudioengine_fmod.cpp
llstreamingaudio_fmod.cpp
COMPILE_FLAGS -Wno-write-strings)
- endif (${CXX_VERSION} MATCHES "4.[23]")
+ endif (${CXX_VERSION_NUMBER} GREATER 419)
endif (LINUX)
endif (FMOD)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index ae959eaa81..290206ee22 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,7 +33,6 @@
#include "llaudiodecodemgr.h"
-#include "llvorbisdecode.h"
#include "llaudioengine.h"
#include "lllfsthread.h"
#include "llvfile.h"
@@ -182,6 +181,8 @@ LLVorbisDecodeState::LLVorbisDecodeState(const LLUUID &uuid, const std::string &
mFileHandle = LLLFSThread::nullHandle();
#endif
// No default value for mVF, it's an ogg structure?
+ // Hey, let's zero it anyway, for predictability.
+ memset(&mVF, 0, sizeof(mVF));
}
LLVorbisDecodeState::~LLVorbisDecodeState()
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index a28c94d00d..ed06c85e1a 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -202,12 +202,12 @@ void LLAudioEngine::updateInternetStream()
}
// virtual
-int LLAudioEngine::isInternetStreamPlaying()
+LLAudioEngine::LLAudioPlayState LLAudioEngine::isInternetStreamPlaying()
{
if (mStreamingAudioImpl)
- return mStreamingAudioImpl->isPlaying();
+ return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying();
- return 0; // Stopped
+ return LLAudioEngine::AUDIO_STOPPED; // Stopped
}
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 457fd93abe..d287104204 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -91,6 +91,15 @@ public:
AUDIO_TYPE_COUNT = 4 // last
};
+ enum LLAudioPlayState
+ {
+ // isInternetStreamPlaying() returns an *int*, with
+ // 0 = stopped, 1 = playing, 2 = paused.
+ AUDIO_STOPPED = 0,
+ AUDIO_PLAYING = 1,
+ AUDIO_PAUSED = 2
+ };
+
LLAudioEngine();
virtual ~LLAudioEngine();
@@ -156,7 +165,7 @@ public:
void stopInternetStream();
void pauseInternetStream(int pause);
void updateInternetStream(); // expected to be called often
- int isInternetStreamPlaying();
+ LLAudioPlayState isInternetStreamPlaying();
// use a value from 0.0 to 1.0, inclusive
void setInternetStreamGain(F32 vol);
std::string getInternetStreamURL();
diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp
index a71a87203c..a4620fa13c 100644
--- a/indra/llaudio/llstreamingaudio_fmod.cpp
+++ b/indra/llaudio/llstreamingaudio_fmod.cpp
@@ -174,7 +174,7 @@ void LLStreamingAudio_FMOD::update()
break;
case -3:
// failed to open, file not found, perhaps
- llwarns << "InternetSteam - failed to open" << llendl;
+ llwarns << "InternetStream - failed to open" << llendl;
stop();
return;
case -4:
diff --git a/indra/llcharacter/llbvhloader.h b/indra/llcharacter/llbvhloader.h
index 85ab035e61..38617bd6d4 100644
--- a/indra/llcharacter/llbvhloader.h
+++ b/indra/llcharacter/llbvhloader.h
@@ -166,6 +166,7 @@ public:
Translation()
{
mIgnore = FALSE;
+ mIgnorePositions = FALSE;
mRelativePositionKey = FALSE;
mRelativeRotationKey = FALSE;
mPriorityModifier = 0;
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index e68672d46f..40a9752268 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion)
// updateMotions()
//-----------------------------------------------------------------------------
static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation");
+static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");
void LLCharacter::updateMotions(e_update_t update_type)
{
- LLFastTimer t(FTM_UPDATE_ANIMATION);
if (update_type == HIDDEN_UPDATE)
{
+ LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION);
mMotionController.updateMotionsMinimal();
}
else
{
+ LLFastTimer t(FTM_UPDATE_ANIMATION);
// unpause if the number of outstanding pause requests has dropped to the initial one
if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1)
{
@@ -273,13 +275,13 @@ void LLCharacter::removeAnimationData(std::string name)
//-----------------------------------------------------------------------------
// setVisualParamWeight()
//-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake)
{
S32 index = which_param->getID();
visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
if (index_iter != mVisualParamIndexMap.end())
{
- index_iter->second->setWeight(weight, set_by_user);
+ index_iter->second->setWeight(weight, upload_bake);
return TRUE;
}
return FALSE;
@@ -288,7 +290,7 @@ BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, B
//-----------------------------------------------------------------------------
// setVisualParamWeight()
//-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake)
{
std::string tname(param_name);
LLStringUtil::toLower(tname);
@@ -296,7 +298,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
if (name_iter != mVisualParamNameMap.end())
{
- name_iter->second->setWeight(weight, set_by_user);
+ name_iter->second->setWeight(weight, upload_bake);
return TRUE;
}
llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter: " << param_name << llendl;
@@ -306,12 +308,12 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
//-----------------------------------------------------------------------------
// setVisualParamWeight()
//-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake)
{
visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
if (index_iter != mVisualParamIndexMap.end())
{
- index_iter->second->setWeight(weight, set_by_user);
+ index_iter->second->setWeight(weight, upload_bake);
return TRUE;
}
llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter index: " << index << llendl;
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index cb44a32e8a..27e2a51c62 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -203,9 +203,9 @@ public:
void addVisualParam(LLVisualParam *param);
void addSharedVisualParam(LLVisualParam *param);
- virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
- virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
- virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+ virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
+ virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
+ virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
// get visual param weight by param or name
F32 getVisualParamWeight(LLVisualParam *distortion);
diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp
index 381d19e614..57554bdc35 100644
--- a/indra/llcharacter/lleditingmotion.cpp
+++ b/indra/llcharacter/lleditingmotion.cpp
@@ -221,7 +221,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
if (!target.isFinite())
{
llerrs << "Non finite target in editing motion with target distance of " << target_dist <<
- " and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl;
+ " and focus point " << focus_pt << llendl;
}
mTarget.setPosition( target + mParentJoint.getPosition());
diff --git a/indra/llcharacter/llheadrotmotion.cpp b/indra/llcharacter/llheadrotmotion.cpp
index 88cd77f7af..0ee378f3b8 100644
--- a/indra/llcharacter/llheadrotmotion.cpp
+++ b/indra/llcharacter/llheadrotmotion.cpp
@@ -251,10 +251,13 @@ BOOL LLHeadRotMotion::onUpdate(F32 time, U8* joint_mask)
mLastHeadRot = head_rot_local;
// Set the head rotation.
- LLQuaternion torsoRotLocal = mNeckState->getJoint()->getParent()->getWorldRotation() * currentInvRootRotWorld;
- head_rot_local = head_rot_local * ~torsoRotLocal;
- mNeckState->setRotation( nlerp(NECK_LAG, LLQuaternion::DEFAULT, head_rot_local) );
- mHeadState->setRotation( nlerp(1.f - NECK_LAG, LLQuaternion::DEFAULT, head_rot_local));
+ if(mNeckState->getJoint() && mNeckState->getJoint()->getParent())
+ {
+ LLQuaternion torsoRotLocal = mNeckState->getJoint()->getParent()->getWorldRotation() * currentInvRootRotWorld;
+ head_rot_local = head_rot_local * ~torsoRotLocal;
+ mNeckState->setRotation( nlerp(NECK_LAG, LLQuaternion::DEFAULT, head_rot_local) );
+ mHeadState->setRotation( nlerp(1.f - NECK_LAG, LLQuaternion::DEFAULT, head_rot_local));
+ }
return TRUE;
}
diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp
index 37afcb7cda..5c49214051 100644
--- a/indra/llcharacter/lljoint.cpp
+++ b/indra/llcharacter/lljoint.cpp
@@ -70,6 +70,7 @@ LLJoint::LLJoint(const std::string &name, LLJoint *parent)
mXform.setScaleChildOffset(TRUE);
mXform.setScale(LLVector3(1.0f, 1.0f, 1.0f));
mDirtyFlags = MATRIX_DIRTY | ROTATION_DIRTY | POSITION_DIRTY;
+ mUpdateXform = FALSE;
mJointNum = 0;
setName(name);
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 7e8c84488c..50d9d05046 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -47,7 +47,6 @@
#include "llquaternion.h"
#include "v3dmath.h"
#include "v3math.h"
-#include "llapr.h"
#include "llbvhconsts.h"
class LLKeyframeDataCache;
diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp
index b5817e5bde..461309bee9 100644
--- a/indra/llcharacter/llkeyframewalkmotion.cpp
+++ b/indra/llcharacter/llkeyframewalkmotion.cpp
@@ -58,11 +58,15 @@ const F32 MAX_ROLL = 0.6f;
// LLKeyframeWalkMotion()
// Class Constructor
//-----------------------------------------------------------------------------
-LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id) : LLKeyframeMotion(id)
+LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id)
+ : LLKeyframeMotion(id),
+
+ mCharacter(NULL),
+ mCyclePhase(0.0f),
+ mRealTimeLast(0.0f),
+ mAdjTimeLast(0.0f),
+ mDownFoot(0)
{
- mRealTimeLast = 0.0f;
- mAdjTimeLast = 0.0f;
- mCharacter = NULL;
}
diff --git a/indra/llcharacter/llstatemachine.cpp b/indra/llcharacter/llstatemachine.cpp
index 73c6951211..e6fa4d7985 100644
--- a/indra/llcharacter/llstatemachine.cpp
+++ b/indra/llcharacter/llstatemachine.cpp
@@ -54,6 +54,7 @@ bool operator!=(const LLUniqueID &a, const LLUniqueID &b)
//-----------------------------------------------------------------------------
LLStateDiagram::LLStateDiagram()
{
+ mDefaultState = NULL;
mUseDefaultState = FALSE;
}
@@ -305,6 +306,7 @@ LLStateMachine::LLStateMachine()
// we haven't received a starting state yet
mCurrentState = NULL;
mLastState = NULL;
+ mLastTransition = NULL;
mStateDiagram = NULL;
}
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index 6232c7588b..297322fe58 100644
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -225,7 +225,7 @@ BOOL LLVisualParam::parseData(LLXmlTreeNode *node)
//-----------------------------------------------------------------------------
// setWeight()
//-----------------------------------------------------------------------------
-void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)
+void LLVisualParam::setWeight(F32 weight, BOOL upload_bake)
{
if (mIsAnimating)
{
@@ -243,19 +243,19 @@ void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)
if (mNext)
{
- mNext->setWeight(weight, set_by_user);
+ mNext->setWeight(weight, upload_bake);
}
}
//-----------------------------------------------------------------------------
// setAnimationTarget()
//-----------------------------------------------------------------------------
-void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake)
{
// don't animate dummy parameters
if (mIsDummy)
{
- setWeight(target_value, set_by_user);
+ setWeight(target_value, upload_bake);
return;
}
@@ -274,7 +274,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
if (mNext)
{
- mNext->setAnimationTarget(target_value, set_by_user);
+ mNext->setAnimationTarget(target_value, upload_bake);
}
}
@@ -291,24 +291,24 @@ void LLVisualParam::setNextParam( LLVisualParam *next )
//-----------------------------------------------------------------------------
// animate()
//-----------------------------------------------------------------------------
-void LLVisualParam::animate( F32 delta, BOOL set_by_user )
+void LLVisualParam::animate( F32 delta, BOOL upload_bake )
{
if (mIsAnimating)
{
F32 new_weight = ((mTargetWeight - mCurWeight) * delta) + mCurWeight;
- setWeight(new_weight, set_by_user);
+ setWeight(new_weight, upload_bake);
}
}
//-----------------------------------------------------------------------------
// stopAnimating()
//-----------------------------------------------------------------------------
-void LLVisualParam::stopAnimating(BOOL set_by_user)
+void LLVisualParam::stopAnimating(BOOL upload_bake)
{
if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
{
mIsAnimating = FALSE;
- setWeight(mTargetWeight, set_by_user);
+ setWeight(mTargetWeight, upload_bake);
}
}
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index affc49debf..12b45e6ebe 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -113,10 +113,10 @@ public:
//virtual BOOL parseData( LLXmlTreeNode *node ) = 0;
virtual void apply( ESex avatar_sex ) = 0;
// Default functions
- virtual void setWeight(F32 weight, BOOL set_by_user);
- virtual void setAnimationTarget( F32 target_value, BOOL set_by_user );
- virtual void animate(F32 delta, BOOL set_by_user);
- virtual void stopAnimating(BOOL set_by_user);
+ virtual void setWeight(F32 weight, BOOL upload_bake);
+ virtual void setAnimationTarget( F32 target_value, BOOL upload_bake );
+ virtual void animate(F32 delta, BOOL upload_bake);
+ virtual void stopAnimating(BOOL upload_bake);
virtual BOOL linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
virtual void resetDrivenParams();
@@ -151,7 +151,7 @@ public:
virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating && !mIsDummy; }
BOOL getAnimating() const { return mIsAnimating; }
- void setIsDummy(BOOL is_self) { mIsDummy = is_self; }
+ void setIsDummy(BOOL is_dummy) { mIsDummy = is_dummy; }
protected:
F32 mCurWeight; // current weight
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index e7aaf3c984..4481d334b2 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -1,3 +1,4 @@
+
# -*- cmake -*-
project(llcommon)
@@ -6,11 +7,10 @@ include(00-Common)
include(LLCommon)
include(Linking)
include(Boost)
-include (Pth)
-
-if (WINDOWS)
- include(CopyWinLibs)
-endif (WINDOWS)
+include(Pth)
+include(LLSharedLibs)
+include(GooglePerfTools)
+include(Copy3rdPartyLibs)
include_directories(
${EXPAT_INCLUDE_DIRS}
@@ -25,6 +25,8 @@ include_directories(
# ${LLCOMMON_LIBRARIES})
set(llcommon_SOURCE_FILES
+ imageids.cpp
+ indra_constants.cpp
llallocator.cpp
llallocator_heap_profile.cpp
llapp.cpp
@@ -39,17 +41,21 @@ set(llcommon_SOURCE_FILES
llcursortypes.cpp
lldate.cpp
lldependencies.cpp
+ lldictionary.cpp
llerror.cpp
llerrorthread.cpp
llevent.cpp
+ lleventapi.cpp
lleventcoro.cpp
lleventdispatcher.cpp
lleventfilter.cpp
llevents.cpp
- llfasttimer.cpp
+ lleventtimer.cpp
+ llfasttimer_class.cpp
llfile.cpp
llfindlocale.cpp
llfixedbuffer.cpp
+ llfoldertype.cpp
llformat.cpp
llframetimer.cpp
llheartbeat.cpp
@@ -140,6 +146,7 @@ set(llcommon_HEADER_FILES
llerrorlegacy.h
llerrorthread.h
llevent.h
+ lleventapi.h
lleventcoro.h
lleventdispatcher.h
lleventfilter.h
@@ -150,6 +157,7 @@ set(llcommon_HEADER_FILES
llfile.h
llfindlocale.h
llfixedbuffer.h
+ llfoldertype.h
llformat.h
llframetimer.h
llhash.h
@@ -157,9 +165,9 @@ set(llcommon_HEADER_FILES
llhttpstatuscodes.h
llindexedqueue.h
llinstancetracker.h
- llinstancetracker.h
llkeythrottle.h
lllazy.h
+ lllistenerwrapper.h
lllinkedqueue.h
llliveappconfig.h
lllivefile.h
@@ -217,6 +225,7 @@ set(llcommon_HEADER_FILES
llversionserver.h
llversionviewer.h
llworkerthread.h
+ ll_template_cast.h
metaclass.h
metaclasst.h
metaproperty.h
@@ -241,35 +250,7 @@ list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
if(LLCOMMON_LINK_SHARED)
add_library (llcommon SHARED ${llcommon_SOURCE_FILES})
-
- if(SHARED_LIB_STAGING_DIR)
- # *FIX:Mani ---
- # llcommon.dll get written to the DLL staging directory.
- # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
- set_target_properties(llcommon PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
- if(NOT WINDOWS)
- get_target_property(LLCOMMON_PATH llcommon LOCATION)
- get_filename_component(LLCOMMON_FILE ${LLCOMMON_PATH} NAME)
- add_custom_command(
- TARGET llcommon POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${LLCOMMON_PATH}
- ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/${LLCOMMON_FILE}
- COMMENT "Copying llcommon to the staging folder."
- )
- endif(NOT WINDOWS)
- endif(SHARED_LIB_STAGING_DIR)
-
- if (DARWIN)
- set_target_properties(llcommon PROPERTIES
- BUILD_WITH_INSTALL_RPATH 1
- INSTALL_NAME_DIR "@executable_path/../Resources"
- )
- endif(DARWIN)
-
+ ll_stage_sharedlib(llcommon)
else(LLCOMMON_LINK_SHARED)
add_library (llcommon ${llcommon_SOURCE_FILES})
endif(LLCOMMON_LINK_SHARED)
@@ -284,36 +265,39 @@ target_link_libraries(
${BOOST_PROGRAM_OPTIONS_LIBRARY}
${BOOST_REGEX_LIBRARY}
${PTH_LIBRARIES}
+ ${GOOGLE_PERFTOOLS_LIBRARIES}
)
add_dependencies(llcommon stage_third_party_libs)
-include(LLAddBuildTest)
-SET(llcommon_TEST_SOURCE_FILES
- # unit-testing llcommon is not possible right now as the test-harness *itself* depends upon llcommon, causing a circular dependency. Add your 'unit' tests as integration tests for now.
- )
-LL_ADD_PROJECT_UNIT_TESTS(llcommon "${llcommon_TEST_SOURCE_FILES}")
-
-#set(TEST_DEBUG on)
-set(test_libs llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES} ${GOOGLEMOCK_LIBRARIES})
-LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(bitpack "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llbase64 "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")
+if (LL_TESTS)
+ include(LLAddBuildTest)
+ SET(llcommon_TEST_SOURCE_FILES
+ # unit-testing llcommon is not possible right now as the test-harness *itself* depends upon llcommon, causing a circular dependency. Add your 'unit' tests as integration tests for now.
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llcommon "${llcommon_TEST_SOURCE_FILES}")
-# *TODO - reenable these once tcmalloc libs no longer break the build.
-#ADD_BUILD_TEST(llallocator llcommon)
-#ADD_BUILD_TEST(llallocator_heap_profile llcommon)
-#ADD_BUILD_TEST(llmemtype llcommon)
+ #set(TEST_DEBUG on)
+ set(test_libs llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES} ${GOOGLEMOCK_LIBRARIES})
+ LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(bitpack "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llbase64 "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llinstancetracker "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")
+ # *TODO - reenable these once tcmalloc libs no longer break the build.
+ #ADD_BUILD_TEST(llallocator llcommon)
+ #ADD_BUILD_TEST(llallocator_heap_profile llcommon)
+ #ADD_BUILD_TEST(llmemtype llcommon)
+endif (LL_TESTS)
diff --git a/indra/llcommon/imageids.cpp b/indra/llcommon/imageids.cpp
new file mode 100644
index 0000000000..f48bb1374d
--- /dev/null
+++ b/indra/llcommon/imageids.cpp
@@ -0,0 +1,76 @@
+/**
+ * @file imageids.cpp
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "imageids.h"
+
+#include "lluuid.h"
+
+//
+// USE OF THIS FILE IS DEPRECATED
+//
+// Please use viewerart.ini and the standard
+// art import path. // indicates if file is only
+ // on dataserver, or also
+ // pre-cached on viewer
+
+// Grass Images
+const LLUUID IMG_SMOKE ("b4ba225c-373f-446d-9f7e-6cb7b5cf9b3d"); // VIEWER
+
+const LLUUID IMG_DEFAULT ("d2114404-dd59-4a4d-8e6c-49359e91bbf0"); // VIEWER
+
+const LLUUID IMG_SUN ("cce0f112-878f-4586-a2e2-a8f104bba271"); // dataserver
+const LLUUID IMG_MOON ("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
+const LLUUID IMG_CLOUD_POOF ("fc4b9f0b-d008-45c6-96a4-01dd947ac621"); // dataserver
+const LLUUID IMG_SHOT ("35f217a3-f618-49cf-bbca-c86d486551a9"); // dataserver
+const LLUUID IMG_SPARK ("d2e75ac1-d0fb-4532-820e-a20034ac814d"); // dataserver
+const LLUUID IMG_FIRE ("aca40aa8-44cf-44ca-a0fa-93e1a2986f82"); // dataserver
+const LLUUID IMG_FACE_SELECT ("a85ac674-cb75-4af6-9499-df7c5aaf7a28"); // face selector
+const LLUUID IMG_DEFAULT_AVATAR ("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"); // dataserver
+const LLUUID IMG_INVISIBLE ("3a367d1c-bef1-6d43-7595-e88c1e3aadb3"); // dataserver
+
+const LLUUID IMG_EXPLOSION ("68edcf47-ccd7-45b8-9f90-1649d7f12806"); // On dataserver
+const LLUUID IMG_EXPLOSION_2 ("21ce046c-83fe-430a-b629-c7660ac78d7c"); // On dataserver
+const LLUUID IMG_EXPLOSION_3 ("fedea30a-1be8-47a6-bc06-337a04a39c4b"); // On dataserver
+const LLUUID IMG_EXPLOSION_4 ("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); // On dataserver
+const LLUUID IMG_SMOKE_POOF ("1e63e323-5fe0-452e-92f8-b98bd0f764e3"); // On dataserver
+
+const LLUUID IMG_BIG_EXPLOSION_1 ("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); // On dataserver
+const LLUUID IMG_BIG_EXPLOSION_2 ("9c8eca51-53d5-42a7-bb58-cef070395db8"); // On dataserver
+
+const LLUUID IMG_BLOOM1 ("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); // VIEWER
+const LLUUID TERRAIN_DIRT_DETAIL ("0bc58228-74a0-7e83-89bc-5c23464bcec5"); // VIEWER
+const LLUUID TERRAIN_GRASS_DETAIL ("63338ede-0037-c4fd-855b-015d77112fc8"); // VIEWER
+const LLUUID TERRAIN_MOUNTAIN_DETAIL ("303cd381-8560-7579-23f1-f0a880799740"); // VIEWER
+const LLUUID TERRAIN_ROCK_DETAIL ("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // VIEWER
+
+const LLUUID DEFAULT_WATER_NORMAL ("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
diff --git a/indra/llcommon/imageids.h b/indra/llcommon/imageids.h
index 832708c782..dc726dcf53 100644
--- a/indra/llcommon/imageids.h
+++ b/indra/llcommon/imageids.h
@@ -33,46 +33,43 @@
#ifndef LL_IMAGEIDS_H
#define LL_IMAGEIDS_H
-#include "lluuid.h"
-
//
// USE OF THIS FILE IS DEPRECATED
//
// Please use viewerart.ini and the standard
-// art import path. // indicates if file is only
- // on dataserver, or also
- // pre-cached on viewer
+// art import path.
+
+class LLUUID;
-// Grass Images
-const LLUUID IMG_SMOKE ("b4ba225c-373f-446d-9f7e-6cb7b5cf9b3d"); // VIEWER
+LL_COMMON_API extern const LLUUID IMG_SMOKE;
-const LLUUID IMG_DEFAULT ("d2114404-dd59-4a4d-8e6c-49359e91bbf0"); // VIEWER
+LL_COMMON_API extern const LLUUID IMG_DEFAULT;
-const LLUUID IMG_SUN ("cce0f112-878f-4586-a2e2-a8f104bba271"); // dataserver
-const LLUUID IMG_MOON ("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
-const LLUUID IMG_CLOUD_POOF ("fc4b9f0b-d008-45c6-96a4-01dd947ac621"); // dataserver
-const LLUUID IMG_SHOT ("35f217a3-f618-49cf-bbca-c86d486551a9"); // dataserver
-const LLUUID IMG_SPARK ("d2e75ac1-d0fb-4532-820e-a20034ac814d"); // dataserver
-const LLUUID IMG_FIRE ("aca40aa8-44cf-44ca-a0fa-93e1a2986f82"); // dataserver
-const LLUUID IMG_FACE_SELECT ("a85ac674-cb75-4af6-9499-df7c5aaf7a28"); // face selector
-const LLUUID IMG_DEFAULT_AVATAR ("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"); // dataserver
-const LLUUID IMG_INVISIBLE ("3a367d1c-bef1-6d43-7595-e88c1e3aadb3"); // dataserver
+LL_COMMON_API extern const LLUUID IMG_SUN;
+LL_COMMON_API extern const LLUUID IMG_MOON;
+LL_COMMON_API extern const LLUUID IMG_CLOUD_POOF;
+LL_COMMON_API extern const LLUUID IMG_SHOT;
+LL_COMMON_API extern const LLUUID IMG_SPARK;
+LL_COMMON_API extern const LLUUID IMG_FIRE;
+LL_COMMON_API extern const LLUUID IMG_FACE_SELECT;
+LL_COMMON_API extern const LLUUID IMG_DEFAULT_AVATAR;
+LL_COMMON_API extern const LLUUID IMG_INVISIBLE;
-const LLUUID IMG_EXPLOSION ("68edcf47-ccd7-45b8-9f90-1649d7f12806"); // On dataserver
-const LLUUID IMG_EXPLOSION_2 ("21ce046c-83fe-430a-b629-c7660ac78d7c"); // On dataserver
-const LLUUID IMG_EXPLOSION_3 ("fedea30a-1be8-47a6-bc06-337a04a39c4b"); // On dataserver
-const LLUUID IMG_EXPLOSION_4 ("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); // On dataserver
-const LLUUID IMG_SMOKE_POOF ("1e63e323-5fe0-452e-92f8-b98bd0f764e3"); // On dataserver
+LL_COMMON_API extern const LLUUID IMG_EXPLOSION;
+LL_COMMON_API extern const LLUUID IMG_EXPLOSION_2;
+LL_COMMON_API extern const LLUUID IMG_EXPLOSION_3;
+LL_COMMON_API extern const LLUUID IMG_EXPLOSION_4;
+LL_COMMON_API extern const LLUUID IMG_SMOKE_POOF;
-const LLUUID IMG_BIG_EXPLOSION_1 ("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); // On dataserver
-const LLUUID IMG_BIG_EXPLOSION_2 ("9c8eca51-53d5-42a7-bb58-cef070395db8"); // On dataserver
+LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_1;
+LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_2;
-const LLUUID IMG_BLOOM1 ("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); // VIEWER
-const LLUUID TERRAIN_DIRT_DETAIL ("0bc58228-74a0-7e83-89bc-5c23464bcec5"); // VIEWER
-const LLUUID TERRAIN_GRASS_DETAIL ("63338ede-0037-c4fd-855b-015d77112fc8"); // VIEWER
-const LLUUID TERRAIN_MOUNTAIN_DETAIL ("303cd381-8560-7579-23f1-f0a880799740"); // VIEWER
-const LLUUID TERRAIN_ROCK_DETAIL ("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // VIEWER
+LL_COMMON_API extern const LLUUID IMG_BLOOM1;
+LL_COMMON_API extern const LLUUID TERRAIN_DIRT_DETAIL;
+LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL;
+LL_COMMON_API extern const LLUUID TERRAIN_MOUNTAIN_DETAIL;
+LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;
-const LLUUID DEFAULT_WATER_NORMAL ("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
+LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;
#endif
diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp
new file mode 100644
index 0000000000..8a1290d4dc
--- /dev/null
+++ b/indra/llcommon/indra_constants.cpp
@@ -0,0 +1,46 @@
+/**
+ * @file indra_constants.cpp
+ * @brief some useful short term constants for Indra
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "indra_constants.h"
+
+#include "lluuid.h"
+
+// "agent id" for things that should be done to ALL agents
+const LLUUID LL_UUID_ALL_AGENTS("44e87126-e794-4ded-05b3-7c42da3d5cdb");
+
+// Governor Linden's agent id.
+const LLUUID ALEXANDRIA_LINDEN_ID("ba2a564a-f0f1-4b82-9c61-b7520bfcd09f");
+const LLUUID GOVERNOR_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
+const LLUUID REALESTATE_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
+// Maintenance's group id.
+const LLUUID MAINTENANCE_GROUP_ID("dc7b21cd-3c89-fcaa-31c8-25f9ffd224cd");
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 6b75a720af..d4a07d77cc 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -34,7 +34,8 @@
#define LL_INDRA_CONSTANTS_H
#include "stdtypes.h"
-#include "lluuid.h"
+
+class LLUUID;
// At 45 Hz collisions seem stable and objects seem
// to settle down at a reasonable rate.
@@ -46,7 +47,7 @@
#define PHYSICS_TIMESTEP (1.f / 45.f)
const F32 COLLISION_TOLERANCE = 0.1f;
-const F32 HALF_COLLISION_TOLERANCE = COLLISION_TOLERANCE * 0.5f;
+const F32 HALF_COLLISION_TOLERANCE = 0.05f;
// Time constants
const U32 HOURS_PER_LINDEN_DAY = 4;
@@ -97,9 +98,9 @@ const F32 MIN_AGENT_WIDTH = 0.40f;
const F32 DEFAULT_AGENT_WIDTH = 0.60f;
const F32 MAX_AGENT_WIDTH = 0.80f;
-const F32 MIN_AGENT_HEIGHT = 1.3f - 2.0f * COLLISION_TOLERANCE;
+const F32 MIN_AGENT_HEIGHT = 1.1f;
const F32 DEFAULT_AGENT_HEIGHT = 1.9f;
-const F32 MAX_AGENT_HEIGHT = 2.65f - 2.0f * COLLISION_TOLERANCE;
+const F32 MAX_AGENT_HEIGHT = 2.45f;
// For linked sets
const S32 MAX_CHILDREN_PER_TASK = 255;
@@ -266,14 +267,15 @@ const U8 GOD_LIKE = 1;
const U8 GOD_NOT = 0;
// "agent id" for things that should be done to ALL agents
-const LLUUID LL_UUID_ALL_AGENTS("44e87126-e794-4ded-05b3-7c42da3d5cdb");
+LL_COMMON_API extern const LLUUID LL_UUID_ALL_AGENTS;
+
+// inventory library owner
+LL_COMMON_API extern const LLUUID ALEXANDRIA_LINDEN_ID;
-// Governor Linden's agent id.
-const LLUUID ALEXANDRIA_LINDEN_ID("ba2a564a-f0f1-4b82-9c61-b7520bfcd09f");
-const LLUUID GOVERNOR_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
-const LLUUID REALESTATE_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
+LL_COMMON_API extern const LLUUID GOVERNOR_LINDEN_ID;
+LL_COMMON_API extern const LLUUID REALESTATE_LINDEN_ID;
// Maintenance's group id.
-const LLUUID MAINTENANCE_GROUP_ID("dc7b21cd-3c89-fcaa-31c8-25f9ffd224cd");
+LL_COMMON_API extern const LLUUID MAINTENANCE_GROUP_ID;
// Flags for kick message
const U32 KICK_FLAGS_DEFAULT = 0x0;
diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h
index c2eb867795..771af01279 100644
--- a/indra/llcommon/linden_common.h
+++ b/indra/llcommon/linden_common.h
@@ -64,6 +64,8 @@
#pragma warning (disable : 4244) // conversion from time_t to S32
#endif // LL_WINDOWS
+// *TODO: Eliminate these, most library .cpp files don't need them.
+// Add them to llviewerprecompiledheaders.h if necessary.
#include <list>
#include <map>
#include <vector>
diff --git a/indra/llcommon/ll_template_cast.h b/indra/llcommon/ll_template_cast.h
new file mode 100644
index 0000000000..cff58ce00d
--- /dev/null
+++ b/indra/llcommon/ll_template_cast.h
@@ -0,0 +1,160 @@
+/**
+ * @file ll_template_cast.h
+ * @author Nat Goodspeed
+ * @date 2009-11-21
+ * @brief Define ll_template_cast function
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LL_TEMPLATE_CAST_H)
+#define LL_LL_TEMPLATE_CAST_H
+
+/**
+ * Implementation for ll_template_cast() (q.v.).
+ *
+ * Default implementation: trying to cast two completely unrelated types
+ * returns 0. Typically you'd specify T and U as pointer types, but in fact T
+ * can be any type that can be initialized with 0.
+ */
+template <typename T, typename U>
+struct ll_template_cast_impl
+{
+ T operator()(U)
+ {
+ return 0;
+ }
+};
+
+/**
+ * ll_template_cast<T>(some_value) is for use in a template function when
+ * some_value might be of arbitrary type, but you want to recognize type T
+ * specially.
+ *
+ * It's designed for use with pointer types. Example:
+ * @code
+ * struct SpecialClass
+ * {
+ * void someMethod(const std::string&) const;
+ * };
+ *
+ * template <class REALCLASS>
+ * void somefunc(const REALCLASS& instance)
+ * {
+ * const SpecialClass* ptr = ll_template_cast<const SpecialClass*>(&instance);
+ * if (ptr)
+ * {
+ * ptr->someMethod("Call method only available on SpecialClass");
+ * }
+ * }
+ * @endcode
+ *
+ * Why is this better than dynamic_cast<>? Because unless OtherClass is
+ * polymorphic, the following won't even compile (gcc 4.0.1):
+ * @code
+ * OtherClass other;
+ * SpecialClass* ptr = dynamic_cast<SpecialClass*>(&other);
+ * @endcode
+ * to say nothing of this:
+ * @code
+ * void function(int);
+ * SpecialClass* ptr = dynamic_cast<SpecialClass*>(&function);
+ * @endcode
+ * ll_template_cast handles these kinds of cases by returning 0.
+ */
+template <typename T, typename U>
+T ll_template_cast(U value)
+{
+ return ll_template_cast_impl<T, U>()(value);
+}
+
+/**
+ * Implementation for ll_template_cast() (q.v.).
+ *
+ * Implementation for identical types: return same value.
+ */
+template <typename T>
+struct ll_template_cast_impl<T, T>
+{
+ T operator()(T value)
+ {
+ return value;
+ }
+};
+
+/**
+ * LL_TEMPLATE_CONVERTIBLE(dest, source) asserts that, for a value @c s of
+ * type @c source, <tt>ll_template_cast<dest>(s)</tt> will return @c s --
+ * presuming that @c source can be converted to @c dest by the normal rules of
+ * C++.
+ *
+ * By default, <tt>ll_template_cast<dest>(s)</tt> will return 0 unless @c s's
+ * type is literally identical to @c dest. (This is because of the
+ * straightforward application of template specialization rules.) That can
+ * lead to surprising results, e.g.:
+ *
+ * @code
+ * Foo myFoo;
+ * const Foo* fooptr = ll_template_cast<const Foo*>(&myFoo);
+ * @endcode
+ *
+ * Here @c fooptr will be 0 because <tt>&myFoo</tt> is of type <tt>Foo*</tt>
+ * -- @em not <tt>const Foo*</tt>. (Declaring <tt>const Foo myFoo;</tt> would
+ * force the compiler to do the right thing.)
+ *
+ * More disappointingly:
+ * @code
+ * struct Base {};
+ * struct Subclass: public Base {};
+ * Subclass object;
+ * Base* ptr = ll_template_cast<Base*>(&object);
+ * @endcode
+ *
+ * Here @c ptr will be 0 because <tt>&object</tt> is of type
+ * <tt>Subclass*</tt> rather than <tt>Base*</tt>. We @em want this cast to
+ * succeed, but without our help ll_template_cast can't recognize it.
+ *
+ * The following would suffice:
+ * @code
+ * LL_TEMPLATE_CONVERTIBLE(Base*, Subclass*);
+ * ...
+ * Base* ptr = ll_template_cast<Base*>(&object);
+ * @endcode
+ *
+ * However, as noted earlier, this is easily fooled:
+ * @code
+ * const Base* ptr = ll_template_cast<const Base*>(&object);
+ * @endcode
+ * would still produce 0 because we haven't yet seen:
+ * @code
+ * LL_TEMPLATE_CONVERTIBLE(const Base*, Subclass*);
+ * @endcode
+ *
+ * @TODO
+ * This macro should use Boost type_traits facilities for stripping and
+ * re-adding @c const and @c volatile qualifiers so that invoking
+ * LL_TEMPLATE_CONVERTIBLE(dest, source) will automatically generate all
+ * permitted permutations. It's really not fair to the coder to require
+ * separate:
+ * @code
+ * LL_TEMPLATE_CONVERTIBLE(Base*, Subclass*);
+ * LL_TEMPLATE_CONVERTIBLE(const Base*, Subclass*);
+ * LL_TEMPLATE_CONVERTIBLE(const Base*, const Subclass*);
+ * @endcode
+ *
+ * (Naturally we omit <tt>LL_TEMPLATE_CONVERTIBLE(Base*, const Subclass*)</tt>
+ * because that's not permitted by normal C++ assignment anyway.)
+ */
+#define LL_TEMPLATE_CONVERTIBLE(DEST, SOURCE) \
+template <> \
+struct ll_template_cast_impl<DEST, SOURCE> \
+{ \
+ DEST operator()(SOURCE wrapper) \
+ { \
+ return wrapper; \
+ } \
+}
+
+#endif /* ! defined(LL_LL_TEMPLATE_CAST_H) */
diff --git a/indra/llcommon/llallocator.h b/indra/llcommon/llallocator.h
index 0d6f18c5d4..50129b4526 100644
--- a/indra/llcommon/llallocator.h
+++ b/indra/llcommon/llallocator.h
@@ -1,63 +1,63 @@
-/**
- * @file llallocator.h
- * @brief Declaration of the LLAllocator class.
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLALLOCATOR_H
-#define LL_LLALLOCATOR_H
-
-#include <string>
-
-#include "llmemtype.h"
-#include "llallocator_heap_profile.h"
-
-class LL_COMMON_API LLAllocator {
- friend class LLMemoryView;
- friend class LLMemType;
-
-private:
- static void pushMemType(S32 type);
- static S32 popMemType();
-
-public:
- void setProfilingEnabled(bool should_enable);
-
- static bool isProfiling();
-
- LLAllocatorHeapProfile const & getProfile();
-
-private:
- std::string getRawProfile();
-
-private:
- LLAllocatorHeapProfile mProf;
-};
-
-#endif // LL_LLALLOCATOR_H
+/**
+ * @file llallocator.h
+ * @brief Declaration of the LLAllocator class.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLALLOCATOR_H
+#define LL_LLALLOCATOR_H
+
+#include <string>
+
+#include "llmemtype.h"
+#include "llallocator_heap_profile.h"
+
+class LL_COMMON_API LLAllocator {
+ friend class LLMemoryView;
+ friend class LLMemType;
+
+private:
+ static void pushMemType(S32 type);
+ static S32 popMemType();
+
+public:
+ void setProfilingEnabled(bool should_enable);
+
+ static bool isProfiling();
+
+ LLAllocatorHeapProfile const & getProfile();
+
+private:
+ std::string getRawProfile();
+
+private:
+ LLAllocatorHeapProfile mProf;
+};
+
+#endif // LL_LLALLOCATOR_H
diff --git a/indra/llcommon/llallocator_heap_profile.cpp b/indra/llcommon/llallocator_heap_profile.cpp
index 0a807702d0..e50d59fd4b 100644
--- a/indra/llcommon/llallocator_heap_profile.cpp
+++ b/indra/llcommon/llallocator_heap_profile.cpp
@@ -113,21 +113,24 @@ void LLAllocatorHeapProfile::parse(std::string const & prof_text)
++j;
while(j != line_elems.end() && j->empty()) { ++j; } // skip any separator tokens
- llassert_always(j != line_elems.end());
- ++j; // skip the '@'
-
- mLines.push_back(line(live_count, live_size, tot_count, tot_size));
- line & current_line = mLines.back();
-
- for(; j != line_elems.end(); ++j)
- {
- if(!j->empty()) {
- U32 marker = boost::lexical_cast<U32>(*j);
- current_line.mTrace.push_back(marker);
- }
- }
+ llassert(j != line_elems.end());
+ if (j != line_elems.end())
+ {
+ ++j; // skip the '@'
+
+ mLines.push_back(line(live_count, live_size, tot_count, tot_size));
+ line & current_line = mLines.back();
+
+ for(; j != line_elems.end(); ++j)
+ {
+ if(!j->empty())
+ {
+ U32 marker = boost::lexical_cast<U32>(*j);
+ current_line.mTrace.push_back(marker);
+ }
+ }
+ }
}
-
// *TODO - parse MAPPED_LIBRARIES section here if we're ever interested in it
}
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 968b92d1e7..6b2d1b7c20 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -41,7 +41,7 @@
#include "lllivefile.h"
#include "llmemory.h"
#include "llstl.h" // for DeletePointer()
-#include "lltimer.h"
+#include "lleventtimer.h"
//
// Signal handling
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 1a052ce62d..27a52cdd99 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -34,14 +34,18 @@
#define LL_LLAPP_H
#include <map>
-#include "llapr.h"
#include "llrun.h"
#include "llsd.h"
#include "lloptioninterface.h"
// Forward declarations
+template <typename Type> class LLAtomic32;
+typedef LLAtomic32<U32> LLAtomicU32;
class LLErrorThread;
class LLLiveFile;
+#if LL_LINUX
+typedef struct siginfo siginfo_t;
+#endif
typedef void (*LLAppErrorHandler)();
typedef void (*LLAppChildCallback)(int pid, bool exited, int status);
@@ -202,8 +206,6 @@ public:
#if !LL_WINDOWS
static U32 getSigChildCount();
static void incSigChildCount();
-#else
-#define getpid GetCurrentProcessId
#endif
static int getPid();
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index 669afc5330..ed70b1d9f2 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -57,7 +57,7 @@ void ll_init_apr()
if(!LLAPRFile::sAPRFilePoolp)
{
- LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool() ;
+ LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ;
}
}
@@ -99,13 +99,12 @@ void ll_cleanup_apr()
//
//LLAPRPool
//
-LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
-{
- mParent = parent ;
- mReleasePoolFlag = releasePoolFlag ;
- mMaxSize = size ;
- mPool = NULL ;
-
+LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
+ : mParent(parent),
+ mReleasePoolFlag(releasePoolFlag),
+ mMaxSize(size),
+ mPool(NULL)
+{
createAPRPool() ;
}
@@ -148,31 +147,65 @@ void LLAPRPool::releaseAPRPool()
}
}
+//virtual
apr_pool_t* LLAPRPool::getAPRPool()
+{
+ return mPool ;
+}
+
+LLVolatileAPRPool::LLVolatileAPRPool(BOOL is_local, apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
+ : LLAPRPool(parent, size, releasePoolFlag),
+ mNumActiveRef(0),
+ mNumTotalRef(0),
+ mMutexPool(NULL),
+ mMutexp(NULL)
{
- if(!mPool)
+ //create mutex
+ if(!is_local) //not a local apr_pool, that is: shared by multiple threads.
{
- createAPRPool() ;
+ apr_pool_create(&mMutexPool, NULL); // Create a pool for mutex
+ apr_thread_mutex_create(&mMutexp, APR_THREAD_MUTEX_UNNESTED, mMutexPool);
}
-
- return mPool ;
}
-LLVolatileAPRPool::LLVolatileAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag)
- : LLAPRPool(parent, size, releasePoolFlag)
+
+LLVolatileAPRPool::~LLVolatileAPRPool()
{
- mNumActiveRef = 0 ;
- mNumTotalRef = 0 ;
+ //delete mutex
+ if(mMutexp)
+ {
+ apr_thread_mutex_destroy(mMutexp);
+ apr_pool_destroy(mMutexPool);
+ }
}
-apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool()
+//
+//define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool().
+//
+//virtual
+apr_pool_t* LLVolatileAPRPool::getAPRPool()
{
+ return LLVolatileAPRPool::getVolatileAPRPool() ;
+}
+
+apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool()
+{
+ LLScopedLock lock(mMutexp) ;
+
mNumTotalRef++ ;
mNumActiveRef++ ;
- return getAPRPool() ;
+
+ if(!mPool)
+ {
+ createAPRPool() ;
+ }
+
+ return mPool ;
}
void LLVolatileAPRPool::clearVolatileAPRPool()
{
+ LLScopedLock lock(mMutexp) ;
+
if(mNumActiveRef > 0)
{
mNumActiveRef--;
@@ -251,10 +284,9 @@ void LLScopedLock::unlock()
bool ll_apr_warn_status(apr_status_t status)
{
if(APR_SUCCESS == status) return false;
-#ifndef LL_WINDOWS
char buf[MAX_STRING]; /* Flawfinder: ignore */
- LL_WARNS_ONCE("APR") << "APR: " << apr_strerror(status, buf, MAX_STRING) << LL_ENDL;
-#endif
+ apr_strerror(status, buf, MAX_STRING);
+ LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
return true;
}
@@ -268,10 +300,18 @@ void ll_apr_assert_status(apr_status_t status)
// LLAPRFile functions
//
LLAPRFile::LLAPRFile()
+ : mFile(NULL),
+ mCurrentFilePoolp(NULL)
+{
+}
+
+LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool)
+ : mFile(NULL),
+ mCurrentFilePoolp(NULL)
{
- mFile = NULL ;
- mCurrentFilePoolp = NULL ;
+ open(filename, flags, pool);
}
+
LLAPRFile::~LLAPRFile()
{
close() ;
@@ -295,11 +335,40 @@ apr_status_t LLAPRFile::close()
return ret ;
}
-apr_status_t LLAPRFile::open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep)
+apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool, S32* sizep)
{
apr_status_t s ;
- s = open(filename, flags, pool ? pool->getVolatileAPRPool() : NULL, sizep) ;
+
+ //check if already open some file
+ llassert_always(!mFile) ;
+ llassert_always(!mCurrentFilePoolp) ;
+ apr_pool_t* apr_pool = pool ? pool->getVolatileAPRPool() : NULL ;
+ s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool));
+
+ if (s != APR_SUCCESS || !mFile)
+ {
+ mFile = NULL ;
+
+ if (sizep)
+ {
+ *sizep = 0;
+ }
+ }
+ else if (sizep)
+ {
+ S32 file_size = 0;
+ apr_off_t offset = 0;
+ if (apr_file_seek(mFile, APR_END, &offset) == APR_SUCCESS)
+ {
+ llassert_always(offset <= 0x7fffffff);
+ file_size = (S32)offset;
+ offset = 0;
+ apr_file_seek(mFile, APR_SET, &offset);
+ }
+ *sizep = file_size;
+ }
+
if(!mCurrentFilePoolp)
{
mCurrentFilePoolp = pool ;
@@ -312,40 +381,25 @@ apr_status_t LLAPRFile::open(LLVolatileAPRPool* pool, const std::string& filenam
return s ;
}
-apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool, S32* sizep)
+
+//use gAPRPoolp.
+apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool)
{
apr_status_t s;
//check if already open some file
llassert_always(!mFile) ;
llassert_always(!mCurrentFilePoolp) ;
+ llassert_always(use_global_pool) ; //be aware of using gAPRPoolp.
- s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(pool));
+ s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, gAPRPoolp);
if (s != APR_SUCCESS || !mFile)
{
mFile = NULL ;
close() ;
- if (sizep)
- {
- *sizep = 0;
- }
return s;
}
- if (sizep)
- {
- S32 file_size = 0;
- apr_off_t offset = 0;
- if (apr_file_seek(mFile, APR_END, &offset) == APR_SUCCESS)
- {
- llassert_always(offset <= 0x7fffffff);
- file_size = (S32)offset;
- offset = 0;
- apr_file_seek(mFile, APR_SET, &offset);
- }
- *sizep = file_size;
- }
-
return s;
}
@@ -369,6 +423,7 @@ S32 LLAPRFile::read(void *buf, S32 nbytes)
apr_status_t s = apr_file_read(mFile, buf, &sz);
if (s != APR_SUCCESS)
{
+ ll_apr_warn_status(s);
return 0;
}
else
@@ -386,6 +441,7 @@ S32 LLAPRFile::write(const void *buf, S32 nbytes)
apr_status_t s = apr_file_write(mFile, buf, &sz);
if (s != APR_SUCCESS)
{
+ ll_apr_warn_status(s);
return 0;
}
else
@@ -434,6 +490,8 @@ apr_file_t* LLAPRFile::open(const std::string& filename, LLVolatileAPRPool* pool
s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool());
if (s != APR_SUCCESS || !file_handle)
{
+ ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to open filename: " << filename << LL_ENDL;
file_handle = NULL ;
close(file_handle, pool) ;
return NULL;
@@ -464,6 +522,7 @@ S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset)
}
if (s != APR_SUCCESS)
{
+ ll_apr_warn_status(s);
return -1;
}
else
@@ -501,6 +560,8 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb
apr_status_t s = apr_file_read(file_handle, buf, &bytes_read);
if (s != APR_SUCCESS)
{
+ LL_WARNS("APR") << " Attempting to read filename: " << filename << LL_ENDL;
+ ll_apr_warn_status(s);
bytes_read = 0;
}
else
@@ -549,6 +610,8 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n
apr_status_t s = apr_file_write(file_handle, buf, &bytes_written);
if (s != APR_SUCCESS)
{
+ LL_WARNS("APR") << " Attempting to write filename: " << filename << LL_ENDL;
+ ll_apr_warn_status(s);
bytes_written = 0;
}
else
@@ -575,8 +638,8 @@ bool LLAPRFile::remove(const std::string& filename, LLVolatileAPRPool* pool)
if (s != APR_SUCCESS)
{
- LL_DEBUGS("APR") << "LLAPRFile::remove failed on file: " << filename << LL_ENDL;
ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to remove filename: " << filename << LL_ENDL;
return false;
}
return true;
@@ -593,8 +656,8 @@ bool LLAPRFile::rename(const std::string& filename, const std::string& newname,
if (s != APR_SUCCESS)
{
- LL_DEBUGS("APR") << "LLAPRFile::rename failed on file: " << filename << LL_ENDL;
ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to rename filename: " << filename << LL_ENDL;
return false;
}
return true;
@@ -667,8 +730,8 @@ bool LLAPRFile::makeDir(const std::string& dirname, LLVolatileAPRPool* pool)
if (s != APR_SUCCESS)
{
- LL_DEBUGS("APR") << "LLAPRFile::makeDir failed on file: " << dirname << LL_ENDL;
ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to make directory: " << dirname << LL_ENDL;
return false;
}
return true;
@@ -685,8 +748,8 @@ bool LLAPRFile::removeDir(const std::string& dirname, LLVolatileAPRPool* pool)
if (s != APR_SUCCESS)
{
- LL_DEBUGS("APR") << "LLAPRFile::removeDir failed on file: " << dirname << LL_ENDL;
ll_apr_warn_status(s);
+ LL_WARNS("APR") << " Attempting to remove directory: " << dirname << LL_ENDL;
return false;
}
return true;
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 0898aeec47..b05a222b33 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -1,259 +1,273 @@
-/**
- * @file llapr.h
- * @author Phoenix
- * @date 2004-11-28
- * @brief Helper functions for using the apache portable runtime library.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLAPR_H
-#define LL_LLAPR_H
-
-#if LL_LINUX || LL_SOLARIS
-#include <sys/param.h> // Need PATH_MAX in APR headers...
-#endif
-
-#include <boost/noncopyable.hpp>
-
-#include "apr_thread_proc.h"
-#include "apr_thread_mutex.h"
-#include "apr_getopt.h"
-#include "apr_signal.h"
-#include "apr_atomic.h"
-#include "llstring.h"
-
-extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
-extern apr_thread_mutex_t* gCallStacksLogMutexp;
-
-/**
- * @brief initialize the common apr constructs -- apr itself, the
- * global pool, and a mutex.
- */
-void LL_COMMON_API ll_init_apr();
-
-/**
- * @brief Cleanup those common apr constructs.
- */
-void LL_COMMON_API ll_cleanup_apr();
-
-//
-//LL apr_pool
-//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
-//
-class LL_COMMON_API LLAPRPool
-{
-public:
- LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
- ~LLAPRPool() ;
-
- apr_pool_t* getAPRPool() ;
- apr_status_t getStatus() {return mStatus ; }
-
-protected:
- void releaseAPRPool() ;
- void createAPRPool() ;
-
-protected:
- apr_pool_t* mPool ; //pointing to an apr_pool
- apr_pool_t* mParent ; //parent pool
- apr_size_t mMaxSize ; //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
- apr_status_t mStatus ; //status when creating the pool
- BOOL mReleasePoolFlag ; //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
-};
-
-//
-//volatile LL apr_pool
-//which clears memory automatically.
-//so it can not hold static data or data after memory is cleared
-//
-class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
-{
-public:
- LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
- ~LLVolatileAPRPool(){}
-
- apr_pool_t* getVolatileAPRPool() ;
-
- void clearVolatileAPRPool() ;
-
- BOOL isFull() ;
- BOOL isEmpty() {return !mNumActiveRef ;}
-private:
- S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
- S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating.
-} ;
-
-/**
- * @class LLScopedLock
- * @brief Small class to help lock and unlock mutexes.
- *
- * This class is used to have a stack level lock once you already have
- * an apr mutex handy. The constructor handles the lock, and the
- * destructor handles the unlock. Instances of this class are
- * <b>not</b> thread safe.
- */
-class LL_COMMON_API LLScopedLock : private boost::noncopyable
-{
-public:
- /**
- * @brief Constructor which accepts a mutex, and locks it.
- *
- * @param mutex An allocated APR mutex. If you pass in NULL,
- * this wrapper will not lock.
- */
- LLScopedLock(apr_thread_mutex_t* mutex);
-
- /**
- * @brief Destructor which unlocks the mutex if still locked.
- */
- ~LLScopedLock();
-
- /**
- * @brief Check lock.
- */
- bool isLocked() const { return mLocked; }
-
- /**
- * @brief This method unlocks the mutex.
- */
- void unlock();
-
-protected:
- bool mLocked;
- apr_thread_mutex_t* mMutex;
-};
-
-template <typename Type> class LLAtomic32
-{
-public:
- LLAtomic32<Type>() {};
- LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
- ~LLAtomic32<Type>() {};
-
- operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
- Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
- void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
- void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
- Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
- Type operator --(int) { return apr_atomic_dec32(&mData); } // Type--
-
-private:
- apr_uint32_t mData;
-};
-
-typedef LLAtomic32<U32> LLAtomicU32;
-typedef LLAtomic32<S32> LLAtomicS32;
-
-// File IO convenience functions.
-// Returns NULL if the file fails to openm sets *sizep to file size of not NULL
-// abbreviated flags
-#define LL_APR_R (APR_READ) // "r"
-#define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
-#define LL_APR_RB (APR_READ|APR_BINARY) // "rb"
-#define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
-#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
-#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
-
-//
-//apr_file manager
-//which: 1)only keeps one file open;
-// 2)closes the open file in the destruction function
-// 3)informs the apr_pool to clean the memory when the file is closed.
-//Note: please close an open file at the earliest convenience.
-// especially do not put some time-costly operations between open() and close().
-// otherwise it might lock the APRFilePool.
-//there are two different apr_pools the APRFile can use:
-// 1, a temperary pool passed to an APRFile function, which is used within this function and only once.
-// 2, a global pool.
-//
-class LL_COMMON_API LLAPRFile
-{
-private:
- apr_file_t* mFile ;
- LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool.
-
-public:
- LLAPRFile() ;
- ~LLAPRFile() ;
-
- apr_status_t open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep = NULL);
- apr_status_t open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool = NULL, S32* sizep = NULL);
- apr_status_t close() ;
-
- // Returns actual offset, -1 if seek fails
- S32 seek(apr_seek_where_t where, S32 offset);
- apr_status_t eof() { return apr_file_eof(mFile);}
-
- // Returns bytes read/written, 0 if read/write fails:
- S32 read(void* buf, S32 nbytes);
- S32 write(const void* buf, S32 nbytes);
-
- apr_file_t* getFileHandle() {return mFile;}
-
-private:
- apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
-
-//
-//*******************************************************************************************************************************
-//static components
-//
-public:
- static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
-
-private:
- static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
- static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
- static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
-public:
- // returns false if failure:
- static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
- static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
- static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
- static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
- static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
- static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
-
- // Returns bytes read/written, 0 if read/write fails:
- static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
- static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
-//*******************************************************************************************************************************
-};
-
-/**
- * @brief Function which approprately logs error or remains quiet on
- * APR_SUCCESS.
- * @return Returns <code>true</code> if status is an error condition.
- */
-bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
-
-void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
-
-extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
-
-#endif // LL_LLAPR_H
+/**
+ * @file llapr.h
+ * @author Phoenix
+ * @date 2004-11-28
+ * @brief Helper functions for using the apache portable runtime library.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLAPR_H
+#define LL_LLAPR_H
+
+#if LL_LINUX || LL_SOLARIS
+#include <sys/param.h> // Need PATH_MAX in APR headers...
+#endif
+#if LL_WINDOWS
+ // Limit Windows API to small and manageable set.
+ // If you get undefined symbols, find the appropriate
+ // Windows header file and include that in your .cpp file.
+ #define WIN32_LEAN_AND_MEAN
+ #include <winsock2.h>
+ #include <windows.h>
+#endif
+
+#include <boost/noncopyable.hpp>
+
+#include "apr_thread_proc.h"
+#include "apr_thread_mutex.h"
+#include "apr_getopt.h"
+#include "apr_signal.h"
+#include "apr_atomic.h"
+#include "llstring.h"
+
+extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
+extern apr_thread_mutex_t* gCallStacksLogMutexp;
+
+/**
+ * @brief initialize the common apr constructs -- apr itself, the
+ * global pool, and a mutex.
+ */
+void LL_COMMON_API ll_init_apr();
+
+/**
+ * @brief Cleanup those common apr constructs.
+ */
+void LL_COMMON_API ll_cleanup_apr();
+
+//
+//LL apr_pool
+//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
+//
+class LL_COMMON_API LLAPRPool
+{
+public:
+ LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
+ virtual ~LLAPRPool() ;
+
+ virtual apr_pool_t* getAPRPool() ;
+ apr_status_t getStatus() {return mStatus ; }
+
+protected:
+ void releaseAPRPool() ;
+ void createAPRPool() ;
+
+protected:
+ apr_pool_t* mPool ; //pointing to an apr_pool
+ apr_pool_t* mParent ; //parent pool
+ apr_size_t mMaxSize ; //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
+ apr_status_t mStatus ; //status when creating the pool
+ BOOL mReleasePoolFlag ; //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
+};
+
+//
+//volatile LL apr_pool
+//which clears memory automatically.
+//so it can not hold static data or data after memory is cleared
+//
+class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
+{
+public:
+ LLVolatileAPRPool(BOOL is_local = TRUE, apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
+ virtual ~LLVolatileAPRPool();
+
+ /*virtual*/ apr_pool_t* getAPRPool() ; //define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool().
+ apr_pool_t* getVolatileAPRPool() ;
+ void clearVolatileAPRPool() ;
+
+ BOOL isFull() ;
+
+private:
+ S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
+ S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating.
+
+ apr_thread_mutex_t *mMutexp;
+ apr_pool_t *mMutexPool;
+} ;
+
+/**
+ * @class LLScopedLock
+ * @brief Small class to help lock and unlock mutexes.
+ *
+ * This class is used to have a stack level lock once you already have
+ * an apr mutex handy. The constructor handles the lock, and the
+ * destructor handles the unlock. Instances of this class are
+ * <b>not</b> thread safe.
+ */
+class LL_COMMON_API LLScopedLock : private boost::noncopyable
+{
+public:
+ /**
+ * @brief Constructor which accepts a mutex, and locks it.
+ *
+ * @param mutex An allocated APR mutex. If you pass in NULL,
+ * this wrapper will not lock.
+ */
+ LLScopedLock(apr_thread_mutex_t* mutex);
+
+ /**
+ * @brief Destructor which unlocks the mutex if still locked.
+ */
+ ~LLScopedLock();
+
+ /**
+ * @brief Check lock.
+ */
+ bool isLocked() const { return mLocked; }
+
+ /**
+ * @brief This method unlocks the mutex.
+ */
+ void unlock();
+
+protected:
+ bool mLocked;
+ apr_thread_mutex_t* mMutex;
+};
+
+template <typename Type> class LLAtomic32
+{
+public:
+ LLAtomic32<Type>() {};
+ LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
+ ~LLAtomic32<Type>() {};
+
+ operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
+ Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
+ void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
+ void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
+ Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
+ Type operator --(int) { return apr_atomic_dec32(&mData); } // Type--
+
+private:
+ apr_uint32_t mData;
+};
+
+typedef LLAtomic32<U32> LLAtomicU32;
+typedef LLAtomic32<S32> LLAtomicS32;
+
+// File IO convenience functions.
+// Returns NULL if the file fails to openm sets *sizep to file size of not NULL
+// abbreviated flags
+#define LL_APR_R (APR_READ) // "r"
+#define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
+#define LL_APR_RB (APR_READ|APR_BINARY) // "rb"
+#define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
+#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
+#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
+
+//
+//apr_file manager
+//which: 1)only keeps one file open;
+// 2)closes the open file in the destruction function
+// 3)informs the apr_pool to clean the memory when the file is closed.
+//Note: please close an open file at the earliest convenience.
+// especially do not put some time-costly operations between open() and close().
+// otherwise it might lock the APRFilePool.
+//there are two different apr_pools the APRFile can use:
+// 1, a temperary pool passed to an APRFile function, which is used within this function and only once.
+// 2, a global pool.
+//
+
+class LL_COMMON_API LLAPRFile : boost::noncopyable
+{
+ // make this non copyable since a copy closes the file
+private:
+ apr_file_t* mFile ;
+ LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool.
+
+public:
+ LLAPRFile() ;
+ LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL);
+ ~LLAPRFile() ;
+
+ apr_status_t open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL, S32* sizep = NULL);
+ apr_status_t open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool); //use gAPRPoolp.
+ apr_status_t close() ;
+
+ // Returns actual offset, -1 if seek fails
+ S32 seek(apr_seek_where_t where, S32 offset);
+ apr_status_t eof() { return apr_file_eof(mFile);}
+
+ // Returns bytes read/written, 0 if read/write fails:
+ S32 read(void* buf, S32 nbytes);
+ S32 write(const void* buf, S32 nbytes);
+
+ apr_file_t* getFileHandle() {return mFile;}
+
+private:
+ apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
+
+//
+//*******************************************************************************************************************************
+//static components
+//
+public:
+ static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
+
+private:
+ static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
+ static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
+ static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
+public:
+ // returns false if failure:
+ static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+ static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
+ static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
+ static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+ static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
+ static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
+
+ // Returns bytes read/written, 0 if read/write fails:
+ static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
+ static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
+//*******************************************************************************************************************************
+};
+
+/**
+ * @brief Function which approprately logs error or remains quiet on
+ * APR_SUCCESS.
+ * @return Returns <code>true</code> if status is an error condition.
+ */
+bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
+
+void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
+
+extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
+
+#endif // LL_LLAPR_H
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index b2a92861cc..6d5b12d840 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -43,30 +43,21 @@
struct AssetEntry : public LLDictionaryEntry
{
AssetEntry(const char *desc_name,
- const char *type_name, // 8 character limit!
- const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one
- const char *category_name, // used by llinventorymodel when creating new categories
- EDragAndDropType dad_type,
- bool can_link, // can you create a link to this type?
- bool is_protected) // can the viewer change categories of this type?
+ const char *type_name, // 8 character limit!
+ const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one
+ bool can_link) // can you create a link to this type?
:
LLDictionaryEntry(desc_name),
mTypeName(type_name),
mHumanName(human_name),
- mCategoryName(category_name),
- mDadType(dad_type),
- mCanLink(can_link),
- mIsProtected(is_protected)
+ mCanLink(can_link)
{
llassert(strlen(mTypeName) <= 8);
}
const char *mTypeName;
const char *mHumanName;
- const char *mCategoryName;
- EDragAndDropType mDadType;
bool mCanLink;
- bool mIsProtected;
};
class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -78,48 +69,32 @@ public:
LLAssetDictionary::LLAssetDictionary()
{
- // DESCRIPTION TYPE NAME HUMAN NAME CATEGORY NAME DRAG&DROP CAN LINK? PROTECTED?
- // |--------------------|-----------|-------------------|-------------------|---------------|-----------|-----------|
- addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", "Textures", DAD_TEXTURE, TRUE, TRUE));
- addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", "Sounds", DAD_SOUND, TRUE, TRUE));
- addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", "Calling Cards", DAD_CALLINGCARD, TRUE, TRUE));
- addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", "Landmarks", DAD_LANDMARK, TRUE, TRUE));
- addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", "Scripts", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", "Clothing", DAD_CLOTHING, TRUE, TRUE));
- addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", "Objects", DAD_OBJECT, TRUE, TRUE));
- addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", "Notecards", DAD_NOTECARD, TRUE, TRUE));
- addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", "New Folder", DAD_CATEGORY, TRUE, TRUE));
- addEntry(LLAssetType::AT_ROOT_CATEGORY, new AssetEntry("ROOT_CATEGORY", "root", "root", "Inventory", DAD_ROOT_CATEGORY, TRUE, TRUE));
- addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", "Scripts", DAD_SCRIPT, TRUE, TRUE));
- addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", "Scripts", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", "Uncompressed Images", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", "Body Parts", DAD_BODYPART, TRUE, TRUE));
- addEntry(LLAssetType::AT_TRASH, new AssetEntry("TRASH", "trash", "trash", "Trash", DAD_NONE, FALSE, TRUE));
- addEntry(LLAssetType::AT_SNAPSHOT_CATEGORY, new AssetEntry("SNAPSHOT_CATEGORY", "snapshot", "snapshot", "Photo Album", DAD_NONE, FALSE, TRUE));
- addEntry(LLAssetType::AT_LOST_AND_FOUND, new AssetEntry("LOST_AND_FOUND", "lstndfnd", "lost and found", "Lost And Found", DAD_NONE, FALSE, TRUE));
- addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", "Uncompressed SoundS", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", "Uncompressed Images", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", "Uncompressed Images", DAD_NONE, TRUE, TRUE));
- addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", "Animations", DAD_ANIMATION, TRUE, TRUE));
- addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", "Gestures", DAD_GESTURE, TRUE, TRUE));
- addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", "New Folder", DAD_NONE, FALSE, TRUE));
- addEntry(LLAssetType::AT_FAVORITE, new AssetEntry("FAVORITE", "favorite", "favorite", "favorite", DAD_NONE, FALSE, TRUE));
-
- addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", "Link", DAD_LINK, FALSE, TRUE));
- addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", "New Folder", DAD_LINK, FALSE, TRUE));
-
- for (S32 ensemble_num = S32(LLAssetType::AT_FOLDER_ENSEMBLE_START);
- ensemble_num <= S32(LLAssetType::AT_FOLDER_ENSEMBLE_END);
- ensemble_num++)
- {
- addEntry(LLAssetType::EType(ensemble_num), new AssetEntry("ENSEMBLE", "ensemble", "ensemble", "New Folder", DAD_CATEGORY, FALSE, FALSE));
- }
-
- addEntry(LLAssetType::AT_CURRENT_OUTFIT, new AssetEntry("CURRENT", "current", "current outfit", "Current Look", DAD_CATEGORY, FALSE, TRUE));
- addEntry(LLAssetType::AT_OUTFIT, new AssetEntry("OUTFIT", "outfit", "outfit", "New Look", DAD_CATEGORY, FALSE, FALSE));
- addEntry(LLAssetType::AT_MY_OUTFITS, new AssetEntry("MY_OUTFITS", "my_otfts", "my outfits", "My Looks", DAD_CATEGORY, FALSE, TRUE));
-
- addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, "New Folder", DAD_NONE, FALSE, FALSE));
+ // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK?
+ // |--------------------|-----------|-------------------|-----------|
+ addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", FALSE));
+ addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", FALSE));
+ addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", FALSE));
+ addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", FALSE));
+ addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", FALSE));
+ addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", TRUE));
+ addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", TRUE));
+ addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", FALSE));
+ addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", TRUE));
+ addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", FALSE));
+ addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", FALSE));
+ addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", FALSE));
+ addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", TRUE));
+ addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", FALSE));
+ addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", FALSE));
+ addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", FALSE));
+ addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", FALSE));
+ addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", TRUE));
+ addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", FALSE));
+
+ addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE));
+ addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE));
+
+ addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE));
};
// static
@@ -140,8 +115,7 @@ const std::string &LLAssetType::getDesc(LLAssetType::EType asset_type)
}
else
{
- static const std::string error_string = "BAD TYPE";
- return error_string;
+ return badLookup();
}
}
@@ -156,7 +130,7 @@ const char *LLAssetType::lookup(LLAssetType::EType asset_type)
}
else
{
- return "-1";
+ return badLookup().c_str();
}
}
@@ -166,6 +140,7 @@ LLAssetType::EType LLAssetType::lookup(const char* name)
return lookup(ll_safe_string(name));
}
+// static
LLAssetType::EType LLAssetType::lookup(const std::string& type_name)
{
const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
@@ -193,7 +168,7 @@ const char *LLAssetType::lookupHumanReadable(LLAssetType::EType asset_type)
}
else
{
- return NULL;
+ return badLookup().c_str();
}
}
@@ -203,6 +178,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const char* name)
return lookupHumanReadable(ll_safe_string(name));
}
+// static
LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_name)
{
const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
@@ -220,32 +196,6 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_
}
// static
-const char *LLAssetType::lookupCategoryName(LLAssetType::EType asset_type)
-{
- const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
- const AssetEntry *entry = dict->lookup(asset_type);
- if (entry)
- {
- return entry->mCategoryName;
- }
- else
- {
- return "New Folder";
- }
-}
-
-// static
-EDragAndDropType LLAssetType::lookupDragAndDropType(EType asset_type)
-{
- const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
- const AssetEntry *entry = dict->lookup(asset_type);
- if (entry)
- return entry->mDadType;
- else
- return DAD_NONE;
-}
-
-// static
bool LLAssetType::lookupCanLink(EType asset_type)
{
const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
@@ -269,37 +219,9 @@ bool LLAssetType::lookupIsLinkType(EType asset_type)
}
// static
-// Only ensembles and plain folders aren't protected. "Protected" means
-// you can't change certain properties such as their type.
-bool LLAssetType::lookupIsProtectedCategoryType(EType asset_type)
+const std::string &LLAssetType::badLookup()
{
- const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
- const AssetEntry *entry = dict->lookup(asset_type);
- if (entry)
- {
- return entry->mIsProtected;
- }
- return true;
-}
+ static const std::string sBadLookup = "llassettype_bad_lookup";
+ return sBadLookup;
-// static
-bool LLAssetType::lookupIsEnsembleCategoryType(EType asset_type)
-{
- return (asset_type >= AT_FOLDER_ENSEMBLE_START &&
- asset_type <= AT_FOLDER_ENSEMBLE_END);
-}
-
-
-// static. Generate a good default description
-void LLAssetType::generateDescriptionFor(LLAssetType::EType asset_type,
- std::string& description)
-{
- const S32 BUF_SIZE = 30;
- char time_str[BUF_SIZE]; /* Flawfinder: ignore */
- time_t now;
- time(&now);
- memset(time_str, '\0', BUF_SIZE);
- strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now));
- description.assign(time_str);
- description.append(LLAssetType::lookupHumanReadable(asset_type));
}
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 33705cd2b1..c7bbc2e74a 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -1,205 +1,156 @@
-/**
- * @file llassettype.h
- * @brief Declaration of LLAssetType.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLASSETTYPE_H
-#define LL_LLASSETTYPE_H
-
-#include <string>
-
-#include "stdenums.h" // for EDragAndDropType
-
-class LL_COMMON_API LLAssetType
-{
-public:
- enum EType
- {
- AT_TEXTURE = 0,
- // Used for painting the faces of geometry.
- // Stored in typical j2c stream format.
-
- AT_SOUND = 1,
- // Used to fill the aural spectrum.
-
- AT_CALLINGCARD = 2,
- // Links instant message access to the user on the card.
- // : E.G. A card for yourself, for linden support, for
- // : the guy you were talking to in the coliseum.
-
- AT_LANDMARK = 3,
- // Links to places in the world with location and a screen shot or image saved.
- // : E.G. Home, linden headquarters, the coliseum, destinations where
- // : we want to increase traffic.
-
- AT_SCRIPT = 4,
- // Valid scripts that can be attached to an object.
- // : E.G. Open a door, jump into the air.
-
- AT_CLOTHING = 5,
- // A collection of textures and parameters that can be worn by an avatar.
-
- AT_OBJECT = 6,
- // Any combination of textures, sounds, and scripts that are
- // associated with a fixed piece of geometry.
- // : E.G. A hot tub, a house with working door.
-
- AT_NOTECARD = 7,
- // Just text.
-
- AT_CATEGORY = 8,
- // Holds a collection of inventory items.
- // It's treated as an item in the inventory and therefore needs a type.
-
- AT_ROOT_CATEGORY = 9,
- // A user's root inventory category.
- // We decided to expose it visually, so it seems logical to fold
- // it into the asset types.
-
- AT_LSL_TEXT = 10,
- AT_LSL_BYTECODE = 11,
- // The LSL is the scripting language.
- // We've split it into a text and bytecode representation.
-
- AT_TEXTURE_TGA = 12,
- // Uncompressed TGA texture.
-
- AT_BODYPART = 13,
- // A collection of textures and parameters that can be worn by an avatar.
-
- AT_TRASH = 14,
- // Only to be used as a marker for a category preferred type.
- // Using this, we can throw things in the trash before completely deleting.
-
- AT_SNAPSHOT_CATEGORY = 15,
- // A marker for a folder meant for snapshots.
- // No actual assets will be snapshots, though if there were, you
- // could interpret them as textures.
-
- AT_LOST_AND_FOUND = 16,
- // Used to stuff lost&found items into.
-
- AT_SOUND_WAV = 17,
- // Uncompressed sound.
-
- AT_IMAGE_TGA = 18,
- // Uncompressed image, non-square.
- // Not appropriate for use as a texture.
-
- AT_IMAGE_JPEG = 19,
- // Compressed image, non-square.
- // Not appropriate for use as a texture.
-
- AT_ANIMATION = 20,
- // Animation.
-
- AT_GESTURE = 21,
- // Gesture, sequence of animations, sounds, chat, wait steps.
-
- AT_SIMSTATE = 22,
- // Simstate file.
-
- AT_FAVORITE = 23,
- // favorite items
-
- AT_LINK = 24,
- // Inventory symbolic link
-
- AT_LINK_FOLDER = 25,
- // Inventory folder link
-
- AT_FOLDER_ENSEMBLE_START = 26,
- AT_FOLDER_ENSEMBLE_END = 45,
- // This range is reserved for special clothing folder types.
-
- AT_CURRENT_OUTFIT = 46,
- // Current outfit
-
- AT_OUTFIT = 47,
- // Predefined outfit ("look")
-
- AT_MY_OUTFITS = 48,
- // Folder that holds your outfits.
-
-
- AT_COUNT = 49,
-
- // +*********************************************************+
- // | TO ADD AN ELEMENT TO THIS ENUM: |
- // +*********************************************************+
- // | 1. INSERT BEFORE AT_COUNT |
- // | 2. INCREMENT AT_COUNT BY 1 |
- // | 3. ADD TO LLAssetDictionary in LLAssetType.cpp |
- // | 3. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp |
- // +*********************************************************+
-
- AT_NONE = -1
- };
-
- // machine transation between type and strings
- static EType lookup(const char* name); // safe conversion to std::string, *TODO: deprecate
- static EType lookup(const std::string& type_name);
- static const char* lookup(EType asset_type);
-
- // translation from a type to a human readable form.
- static EType lookupHumanReadable(const char* desc_name); // safe conversion to std::string, *TODO: deprecate
- static EType lookupHumanReadable(const std::string& readable_name);
- static const char* lookupHumanReadable(EType asset_type);
-
- // Generate a good default description. You may want to add a verb
- // or agent name after this depending on your application.
- static void generateDescriptionFor(LLAssetType::EType asset_type,
- std::string& description);
-
- static EType getType(const std::string& desc_name);
- static const std::string& getDesc(EType asset_type);
- static EDragAndDropType lookupDragAndDropType(EType asset_type);
-
- static bool lookupCanLink(EType asset_type);
- static bool lookupIsLinkType(EType asset_type);
-
- static const char* lookupCategoryName(EType asset_type);
- static bool lookupIsProtectedCategoryType(EType asset_type);
- static bool lookupIsEnsembleCategoryType(EType asset_type);
-
- /* TODO: Change return types from "const char *" to "const std::string &".
- This is fairly straightforward, but requires changing some calls to use .c_str().
- e.g.:
- - fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
- + fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType).c_str());
- */
-
-private:
- // don't instantiate or derive one of these objects
- LLAssetType( void ) {}
- ~LLAssetType( void ) {}
-};
-
-#endif // LL_LLASSETTYPE_H
+/**
+ * @file llassettype.h
+ * @brief Declaration of LLAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLASSETTYPE_H
+#define LL_LLASSETTYPE_H
+
+#include <string>
+
+#include "stdenums.h" // for EDragAndDropType
+
+class LL_COMMON_API LLAssetType
+{
+public:
+ enum EType
+ {
+ AT_TEXTURE = 0,
+ // Used for painting the faces of geometry.
+ // Stored in typical j2c stream format.
+
+ AT_SOUND = 1,
+ // Used to fill the aural spectrum.
+
+ AT_CALLINGCARD = 2,
+ // Links instant message access to the user on the card.
+ // : E.G. A card for yourself, for linden support, for
+ // : the guy you were talking to in the coliseum.
+
+ AT_LANDMARK = 3,
+ // Links to places in the world with location and a screen shot or image saved.
+ // : E.G. Home, linden headquarters, the coliseum, destinations where
+ // : we want to increase traffic.
+
+ AT_SCRIPT = 4,
+ // Valid scripts that can be attached to an object.
+ // : E.G. Open a door, jump into the air.
+
+ AT_CLOTHING = 5,
+ // A collection of textures and parameters that can be worn by an avatar.
+
+ AT_OBJECT = 6,
+ // Any combination of textures, sounds, and scripts that are
+ // associated with a fixed piece of geometry.
+ // : E.G. A hot tub, a house with working door.
+
+ AT_NOTECARD = 7,
+ // Just text.
+
+ AT_CATEGORY = 8,
+ // Holds a collection of inventory items.
+ // It's treated as an item in the inventory and therefore needs a type.
+
+ AT_LSL_TEXT = 10,
+ AT_LSL_BYTECODE = 11,
+ // The LSL is the scripting language.
+ // We've split it into a text and bytecode representation.
+
+ AT_TEXTURE_TGA = 12,
+ // Uncompressed TGA texture.
+
+ AT_BODYPART = 13,
+ // A collection of textures and parameters that can be worn by an avatar.
+
+ AT_SOUND_WAV = 17,
+ // Uncompressed sound.
+
+ AT_IMAGE_TGA = 18,
+ // Uncompressed image, non-square.
+ // Not appropriate for use as a texture.
+
+ AT_IMAGE_JPEG = 19,
+ // Compressed image, non-square.
+ // Not appropriate for use as a texture.
+
+ AT_ANIMATION = 20,
+ // Animation.
+
+ AT_GESTURE = 21,
+ // Gesture, sequence of animations, sounds, chat, wait steps.
+
+ AT_SIMSTATE = 22,
+ // Simstate file.
+
+ AT_LINK = 24,
+ // Inventory symbolic link
+
+ AT_LINK_FOLDER = 25,
+ // Inventory folder link
+
+ AT_COUNT = 26,
+
+ // +*********************************************************+
+ // | TO ADD AN ELEMENT TO THIS ENUM: |
+ // +*********************************************************+
+ // | 1. INSERT BEFORE AT_COUNT |
+ // | 2. INCREMENT AT_COUNT BY 1 |
+ // | 3. ADD TO LLAssetType.cpp |
+ // | 4. ADD TO LLViewerAssetType.cpp |
+ // | 5. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp |
+ // +*********************************************************+
+
+ AT_NONE = -1
+ };
+
+ // machine transation between type and strings
+ static EType lookup(const char* name); // safe conversion to std::string, *TODO: deprecate
+ static EType lookup(const std::string& type_name);
+ static const char* lookup(EType asset_type);
+
+ // translation from a type to a human readable form.
+ static EType lookupHumanReadable(const char* desc_name); // safe conversion to std::string, *TODO: deprecate
+ static EType lookupHumanReadable(const std::string& readable_name);
+ static const char* lookupHumanReadable(EType asset_type);
+
+ static EType getType(const std::string& desc_name);
+ static const std::string& getDesc(EType asset_type);
+
+ static bool lookupCanLink(EType asset_type);
+ static bool lookupIsLinkType(EType asset_type);
+
+ static const std::string& badLookup(); // error string when a lookup fails
+
+protected:
+ LLAssetType() {}
+ ~LLAssetType() {}
+};
+
+#endif // LL_LLASSETTYPE_H
diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index acd0da61a4..52238d4533 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -68,7 +68,8 @@ typedef enum e_chat_audible_level
typedef enum e_chat_style
{
CHAT_STYLE_NORMAL,
- CHAT_STYLE_IRC
+ CHAT_STYLE_IRC,
+ CHAT_STYLE_HISTORY
}EChatStyle;
// A piece of chat
@@ -79,27 +80,33 @@ public:
: mText(text),
mFromName(),
mFromID(),
+ mNotifId(),
mSourceType(CHAT_SOURCE_AGENT),
mChatType(CHAT_TYPE_NORMAL),
mAudible(CHAT_AUDIBLE_FULLY),
mMuted(FALSE),
mTime(0.0),
+ mTimeStr(),
mPosAgent(),
mURL(),
- mChatStyle(CHAT_STYLE_NORMAL)
+ mChatStyle(CHAT_STYLE_NORMAL),
+ mSessionID()
{ }
std::string mText; // UTF-8 line of text
std::string mFromName; // agent or object name
LLUUID mFromID; // agent id or object id
+ LLUUID mNotifId;
EChatSourceType mSourceType;
EChatType mChatType;
EChatAudible mAudible;
BOOL mMuted; // pass muted chat to maintain list of chatters
F64 mTime; // viewer only, seconds from viewer start
+ std::string mTimeStr;
LLVector3 mPosAgent;
std::string mURL;
EChatStyle mChatStyle;
+ LLUUID mSessionID;
};
#endif
diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 8048724575..d4ffbf8634 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -33,7 +33,7 @@
#ifndef LL_LLCLICKACTION_H
#define LL_LLCLICKACTION_H
-
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
const U8 CLICK_ACTION_NONE = 0;
const U8 CLICK_ACTION_TOUCH = 0;
const U8 CLICK_ACTION_SIT = 1;
@@ -42,5 +42,6 @@ const U8 CLICK_ACTION_PAY = 3;
const U8 CLICK_ACTION_OPEN = 4;
const U8 CLICK_ACTION_PLAY = 5;
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
-
+const U8 CLICK_ACTION_ZOOM = 7;
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
#endif
diff --git a/indra/llcommon/llcommon.h b/indra/llcommon/llcommon.h
index b36471f9f8..05eef25b21 100644
--- a/indra/llcommon/llcommon.h
+++ b/indra/llcommon/llcommon.h
@@ -33,7 +33,6 @@
#define LL_COMMON_H
// *TODO: remove these?
-#include "llapr.h"
#include "lltimer.h"
#include "llfile.h"
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 6c5fa5af6d..141b0df43c 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -1,149 +1,149 @@
-/**
- * @file llcoros.h
- * @author Nat Goodspeed
- * @date 2009-06-02
- * @brief Manage running boost::coroutine instances
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * Copyright (c) 2009, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLCOROS_H)
-#define LL_LLCOROS_H
-
-#include <boost/coroutine/coroutine.hpp>
-#include "llsingleton.h"
-#include <boost/ptr_container/ptr_map.hpp>
-#include <string>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/iteration/local.hpp>
-#include <stdexcept>
-
-/**
- * Registry of named Boost.Coroutine instances
- *
- * The Boost.Coroutine library supports the general case of a coroutine
- * accepting arbitrary parameters and yielding multiple (sets of) results. For
- * such use cases, it's natural for the invoking code to retain the coroutine
- * instance: the consumer repeatedly calls into the coroutine, perhaps passing
- * new parameter values, prompting it to yield its next result.
- *
- * Our typical coroutine usage is different, though. For us, coroutines
- * provide an alternative to the @c Responder pattern. Our typical coroutine
- * has @c void return, invoked in fire-and-forget mode: the handler for some
- * user gesture launches the coroutine and promptly returns to the main loop.
- * The coroutine initiates some action that will take multiple frames (e.g. a
- * capability request), waits for its result, processes it and silently steals
- * away.
- *
- * This usage poses two (related) problems:
- *
- * # Who should own the coroutine instance? If it's simply local to the
- * handler code that launches it, return from the handler will destroy the
- * coroutine object, terminating the coroutine.
- * # Once the coroutine terminates, in whatever way, who's responsible for
- * cleaning up the coroutine object?
- *
- * LLCoros is a Singleton collection of currently-active coroutine instances.
- * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
- * name prefix; from your prefix it generates a distinct name, registers the
- * new coroutine and returns the actual name.
- *
- * The name can be used to kill off the coroutine prematurely, if needed. It
- * can also provide diagnostic info: we can look up the name of the
- * currently-running coroutine.
- *
- * Finally, the next frame ("mainloop" event) after the coroutine terminates,
- * LLCoros will notice its demise and destroy it.
- */
-class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
-{
-public:
- /// Canonical boost::coroutines::coroutine signature we use
- typedef boost::coroutines::coroutine<void()> coro;
- /// Canonical 'self' type
- typedef coro::self self;
-
- /**
- * Create and start running a new coroutine with specified name. The name
- * string you pass is a suggestion; it will be tweaked for uniqueness. The
- * actual name is returned to you.
- *
- * Usage looks like this, for (e.g.) two coroutine parameters:
- * @code
- * class MyClass
- * {
- * public:
- * ...
- * // Do NOT NOT NOT accept reference params other than 'self'!
- * // Pass by value only!
- * void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
- * ...
- * };
- * ...
- * std::string name = LLCoros::instance().launch(
- * "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
- * "somestring", LLSD(17));
- * @endcode
- *
- * Your function/method must accept LLCoros::self& as its first parameter.
- * It can accept any other parameters you want -- but ONLY BY VALUE!
- * Other reference parameters are a BAD IDEA! You Have Been Warned. See
- * DEV-32777 comments for an explanation.
- *
- * Pass a callable that accepts the single LLCoros::self& parameter. It
- * may work to pass a free function whose only parameter is 'self'; for
- * all other cases use boost::bind(). Of course, for a non-static class
- * method, the first parameter must be the class instance. Use the
- * placeholder _1 for the 'self' parameter. Any other parameters should be
- * passed via the bind() expression.
- *
- * launch() tweaks the suggested name so it won't collide with any
- * existing coroutine instance, creates the coroutine instance, registers
- * it with the tweaked name and runs it until its first wait. At that
- * point it returns the tweaked name.
- */
- template <typename CALLABLE>
- std::string launch(const std::string& prefix, const CALLABLE& callable)
- {
- return launchImpl(prefix, new coro(callable));
- }
-
- /**
- * Abort a running coroutine by name. Normally, when a coroutine either
- * runs to completion or terminates with an exception, LLCoros quietly
- * cleans it up. This is for use only when you must explicitly interrupt
- * one prematurely. Returns @c true if the specified name was found and
- * still running at the time.
- */
- bool kill(const std::string& name);
-
- /**
- * From within a coroutine, pass its @c self object to look up the
- * (tweaked) name string by which this coroutine is registered. Returns
- * the empty string if not found (e.g. if the coroutine was launched by
- * hand rather than using LLCoros::launch()).
- */
- template <typename COROUTINE_SELF>
- std::string getName(const COROUTINE_SELF& self) const
- {
- return getNameByID(self.get_id());
- }
-
- /// getName() by self.get_id()
- std::string getNameByID(const void* self_id) const;
-
-private:
- friend class LLSingleton<LLCoros>;
- LLCoros();
- std::string launchImpl(const std::string& prefix, coro* newCoro);
- std::string generateDistinctName(const std::string& prefix) const;
- bool cleanup(const LLSD&);
-
- typedef boost::ptr_map<std::string, coro> CoroMap;
- CoroMap mCoros;
-};
-
-#endif /* ! defined(LL_LLCOROS_H) */
+/**
+ * @file llcoros.h
+ * @author Nat Goodspeed
+ * @date 2009-06-02
+ * @brief Manage running boost::coroutine instances
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOROS_H)
+#define LL_LLCOROS_H
+
+#include <boost/coroutine/coroutine.hpp>
+#include "llsingleton.h"
+#include <boost/ptr_container/ptr_map.hpp>
+#include <string>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <stdexcept>
+
+/**
+ * Registry of named Boost.Coroutine instances
+ *
+ * The Boost.Coroutine library supports the general case of a coroutine
+ * accepting arbitrary parameters and yielding multiple (sets of) results. For
+ * such use cases, it's natural for the invoking code to retain the coroutine
+ * instance: the consumer repeatedly calls into the coroutine, perhaps passing
+ * new parameter values, prompting it to yield its next result.
+ *
+ * Our typical coroutine usage is different, though. For us, coroutines
+ * provide an alternative to the @c Responder pattern. Our typical coroutine
+ * has @c void return, invoked in fire-and-forget mode: the handler for some
+ * user gesture launches the coroutine and promptly returns to the main loop.
+ * The coroutine initiates some action that will take multiple frames (e.g. a
+ * capability request), waits for its result, processes it and silently steals
+ * away.
+ *
+ * This usage poses two (related) problems:
+ *
+ * # Who should own the coroutine instance? If it's simply local to the
+ * handler code that launches it, return from the handler will destroy the
+ * coroutine object, terminating the coroutine.
+ * # Once the coroutine terminates, in whatever way, who's responsible for
+ * cleaning up the coroutine object?
+ *
+ * LLCoros is a Singleton collection of currently-active coroutine instances.
+ * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
+ * name prefix; from your prefix it generates a distinct name, registers the
+ * new coroutine and returns the actual name.
+ *
+ * The name can be used to kill off the coroutine prematurely, if needed. It
+ * can also provide diagnostic info: we can look up the name of the
+ * currently-running coroutine.
+ *
+ * Finally, the next frame ("mainloop" event) after the coroutine terminates,
+ * LLCoros will notice its demise and destroy it.
+ */
+class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
+{
+public:
+ /// Canonical boost::coroutines::coroutine signature we use
+ typedef boost::coroutines::coroutine<void()> coro;
+ /// Canonical 'self' type
+ typedef coro::self self;
+
+ /**
+ * Create and start running a new coroutine with specified name. The name
+ * string you pass is a suggestion; it will be tweaked for uniqueness. The
+ * actual name is returned to you.
+ *
+ * Usage looks like this, for (e.g.) two coroutine parameters:
+ * @code
+ * class MyClass
+ * {
+ * public:
+ * ...
+ * // Do NOT NOT NOT accept reference params other than 'self'!
+ * // Pass by value only!
+ * void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
+ * ...
+ * };
+ * ...
+ * std::string name = LLCoros::instance().launch(
+ * "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
+ * "somestring", LLSD(17));
+ * @endcode
+ *
+ * Your function/method must accept LLCoros::self& as its first parameter.
+ * It can accept any other parameters you want -- but ONLY BY VALUE!
+ * Other reference parameters are a BAD IDEA! You Have Been Warned. See
+ * DEV-32777 comments for an explanation.
+ *
+ * Pass a callable that accepts the single LLCoros::self& parameter. It
+ * may work to pass a free function whose only parameter is 'self'; for
+ * all other cases use boost::bind(). Of course, for a non-static class
+ * method, the first parameter must be the class instance. Use the
+ * placeholder _1 for the 'self' parameter. Any other parameters should be
+ * passed via the bind() expression.
+ *
+ * launch() tweaks the suggested name so it won't collide with any
+ * existing coroutine instance, creates the coroutine instance, registers
+ * it with the tweaked name and runs it until its first wait. At that
+ * point it returns the tweaked name.
+ */
+ template <typename CALLABLE>
+ std::string launch(const std::string& prefix, const CALLABLE& callable)
+ {
+ return launchImpl(prefix, new coro(callable));
+ }
+
+ /**
+ * Abort a running coroutine by name. Normally, when a coroutine either
+ * runs to completion or terminates with an exception, LLCoros quietly
+ * cleans it up. This is for use only when you must explicitly interrupt
+ * one prematurely. Returns @c true if the specified name was found and
+ * still running at the time.
+ */
+ bool kill(const std::string& name);
+
+ /**
+ * From within a coroutine, pass its @c self object to look up the
+ * (tweaked) name string by which this coroutine is registered. Returns
+ * the empty string if not found (e.g. if the coroutine was launched by
+ * hand rather than using LLCoros::launch()).
+ */
+ template <typename COROUTINE_SELF>
+ std::string getName(const COROUTINE_SELF& self) const
+ {
+ return getNameByID(self.get_id());
+ }
+
+ /// getName() by self.get_id()
+ std::string getNameByID(const void* self_id) const;
+
+private:
+ friend class LLSingleton<LLCoros>;
+ LLCoros();
+ std::string launchImpl(const std::string& prefix, coro* newCoro);
+ std::string generateDistinctName(const std::string& prefix) const;
+ bool cleanup(const LLSD&);
+
+ typedef boost::ptr_map<std::string, coro> CoroMap;
+ CoroMap mCoros;
+};
+
+#endif /* ! defined(LL_LLCOROS_H) */
diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp
index ca7e471bf2..de7f2ead74 100644
--- a/indra/llcommon/lldate.cpp
+++ b/indra/llcommon/lldate.cpp
@@ -152,7 +152,8 @@ void LLDate::toStream(std::ostream& s) const
s << '.' << std::setw(2)
<< (int)(exp_time.tm_usec / (LL_APR_USEC_PER_SEC / 100));
}
- s << 'Z';
+ s << 'Z'
+ << std::setfill(' ');
}
bool LLDate::split(S32 *year, S32 *month, S32 *day, S32 *hour, S32 *min, S32 *sec) const
diff --git a/indra/llcommon/lldictionary.cpp b/indra/llcommon/lldictionary.cpp
new file mode 100644
index 0000000000..8730238d92
--- /dev/null
+++ b/indra/llcommon/lldictionary.cpp
@@ -0,0 +1,52 @@
+/**
+ * @file lldictionary.cpp
+ * @brief Lldictionary class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lldictionary.h"
+
+#include "llstring.h"
+
+// Define in .cpp file to prevent header include of llstring.h
+LLDictionaryEntry::LLDictionaryEntry(const std::string &name)
+: mName(name)
+{
+ mNameCapitalized = mName;
+ LLStringUtil::replaceChar(mNameCapitalized, '-', ' ');
+ LLStringUtil::replaceChar(mNameCapitalized, '_', ' ');
+ for (U32 i=0; i < mNameCapitalized.size(); i++)
+ {
+ if (i == 0 || mNameCapitalized[i-1] == ' ') // don't change ordering of this statement or crash
+ {
+ mNameCapitalized[i] = toupper(mNameCapitalized[i]);
+ }
+ }
+}
diff --git a/indra/llcommon/lldictionary.h b/indra/llcommon/lldictionary.h
index 436b689ca6..4a2bfb9f3f 100644
--- a/indra/llcommon/lldictionary.h
+++ b/indra/llcommon/lldictionary.h
@@ -33,23 +33,11 @@
#define LL_LLDICTIONARY_H
#include <map>
+#include <string>
-struct LLDictionaryEntry
+struct LL_COMMON_API LLDictionaryEntry
{
- LLDictionaryEntry(const std::string &name) :
- mName(name)
- {
- mNameCapitalized = mName;
- LLStringUtil::replaceChar(mNameCapitalized, '-', ' ');
- LLStringUtil::replaceChar(mNameCapitalized, '_', ' ');
- for (U32 i=0; i < mNameCapitalized.size(); i++)
- {
- if (i == 0 || mNameCapitalized[i-1] == ' ') // don't change ordering of this statement or crash
- {
- mNameCapitalized[i] = toupper(mNameCapitalized[i]);
- }
- }
- }
+ LLDictionaryEntry(const std::string &name);
virtual ~LLDictionaryEntry() {}
const std::string mName;
std::string mNameCapitalized;
@@ -88,11 +76,16 @@ public:
return dictionary_iter->first;
}
}
- llassert(false);
- return Index(-1);
+ return notFound();
}
protected:
+ virtual Index notFound() const
+ {
+ // default is to assert
+ llassert(false);
+ return Index(-1);
+ }
void addEntry(Index index, Entry *entry)
{
if (lookup(index))
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 77c0c2294a..bd334a6654 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -45,9 +45,6 @@
# include <syslog.h>
# include <unistd.h>
#endif // !LL_WINDOWS
-#if LL_WINDOWS
-# include <windows.h>
-#endif // LL_WINDOWS
#include <vector>
#include "llapp.h"
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 5a4c644859..09812de2b8 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -242,7 +242,7 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
do { \
static LLError::CallSite _site( \
level, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__, broadTag, narrowTag, once);\
- if (_site.shouldLog()) \
+ if (LL_UNLIKELY(_site.shouldLog())) \
{ \
std::ostringstream* _out = LLError::Log::out(); \
(*_out)
diff --git a/indra/llcommon/llerrorlegacy.h b/indra/llcommon/llerrorlegacy.h
index 7a970b1466..476d75380f 100644
--- a/indra/llcommon/llerrorlegacy.h
+++ b/indra/llcommon/llerrorlegacy.h
@@ -34,7 +34,7 @@
#ifndef LL_LLERRORLEGACY_H
#define LL_LLERRORLEGACY_H
-
+#include "llpreprocessor.h"
/*
LEGACY -- DO NOT USE THIS STUFF ANYMORE
@@ -75,6 +75,10 @@ const int LL_ERR_PRICE_MISMATCH = -23018;
#define SHOW_ASSERT
#else // _DEBUG
+#ifdef LL_RELEASE_WITH_DEBUG_INFO
+#define SHOW_ASSERT
+#endif // LL_RELEASE_WITH_DEBUG_INFO
+
#ifdef RELEASE_SHOW_DEBUG
#define SHOW_DEBUG
#endif
@@ -103,7 +107,7 @@ const int LL_ERR_PRICE_MISMATCH = -23018;
#define llwarning(msg, num) llwarns << "Warning # " << num << ": " << msg << llendl;
-#define llassert_always(func) if (!(func)) llerrs << "ASSERT (" << #func << ")" << llendl;
+#define llassert_always(func) if (LL_UNLIKELY(!(func))) llerrs << "ASSERT (" << #func << ")" << llendl;
#ifdef SHOW_ASSERT
#define llassert(func) llassert_always(func)
diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp
new file mode 100644
index 0000000000..1dd104da8f
--- /dev/null
+++ b/indra/llcommon/lleventapi.cpp
@@ -0,0 +1,30 @@
+/**
+ * @file lleventapi.cpp
+ * @author Nat Goodspeed
+ * @date 2009-11-10
+ * @brief Implementation for lleventapi.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "lleventapi.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):
+ lbase(name, field),
+ ibase(name),
+ mDesc(desc)
+{
+}
+
+LLEventAPI::~LLEventAPI()
+{
+}
diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
new file mode 100644
index 0000000000..96d1b03be8
--- /dev/null
+++ b/indra/llcommon/lleventapi.h
@@ -0,0 +1,66 @@
+/**
+ * @file lleventapi.h
+ * @author Nat Goodspeed
+ * @date 2009-10-28
+ * @brief LLEventAPI is the base class for every class that wraps a C++ API
+ * in an event API
+ * (see https://wiki.lindenlab.com/wiki/Incremental_Viewer_Automation/Event_API).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTAPI_H)
+#define LL_LLEVENTAPI_H
+
+#include "lleventdispatcher.h"
+#include "llinstancetracker.h"
+#include <string>
+
+/**
+ * LLEventAPI not only provides operation dispatch functionality, inherited
+ * from LLDispatchListener -- it also gives us event API introspection.
+ * Deriving from LLInstanceTracker lets us enumerate instances.
+ */
+class LL_COMMON_API LLEventAPI: public LLDispatchListener,
+ public LLInstanceTracker<LLEventAPI, std::string>
+{
+ typedef LLDispatchListener lbase;
+ typedef LLInstanceTracker<LLEventAPI, std::string> ibase;
+
+public:
+ /**
+ * @param name LLEventPump name on which this LLEventAPI will listen. This
+ * also serves as the LLInstanceTracker instance key.
+ * @param desc Documentation string shown to a client trying to discover
+ * available event APIs.
+ * @param field LLSD::Map key used by LLDispatchListener to look up the
+ * subclass method to invoke [default "op"].
+ */
+ LLEventAPI(const std::string& name, const std::string& desc, const std::string& field="op");
+ virtual ~LLEventAPI();
+
+ /// Get the string name of this LLEventAPI
+ std::string getName() const { return ibase::getKey(); }
+ /// Get the documentation string
+ std::string getDesc() const { return mDesc; }
+
+ /**
+ * Publish only selected add() methods from LLEventDispatcher.
+ * Every LLEventAPI add() @em must have a description string.
+ */
+ template <typename CALLABLE>
+ void add(const std::string& name,
+ const std::string& desc,
+ CALLABLE callable,
+ const LLSD& required=LLSD())
+ {
+ LLEventDispatcher::add(name, desc, callable, required);
+ }
+
+private:
+ std::string mDesc;
+};
+
+#endif /* ! defined(LL_LLEVENTAPI_H) */
diff --git a/indra/llcommon/lleventcoro.h b/indra/llcommon/lleventcoro.h
index c6d9de171d..1981ae7482 100644
--- a/indra/llcommon/lleventcoro.h
+++ b/indra/llcommon/lleventcoro.h
@@ -203,9 +203,12 @@ LLSD postAndWait(SELF& self, const LLSD& event, const LLEventPumpOrPumpName& req
// request event.
LLSD modevent(event);
LLEventDetail::storeToLLSDPath(modevent, replyPumpNamePath, replyPump.getPump().getName());
- LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName
+ LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName
<< " posting to " << requestPump.getPump().getName()
- << ": " << modevent << LL_ENDL;
+ << LL_ENDL;
+
+ // *NOTE:Mani - Removed because modevent could contain user's hashed passwd.
+ // << ": " << modevent << LL_ENDL;
requestPump.getPump().post(modevent);
}
LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName
diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp
index 6b1413d054..5fa6059718 100644
--- a/indra/llcommon/lleventdispatcher.cpp
+++ b/indra/llcommon/lleventdispatcher.cpp
@@ -36,9 +36,11 @@ LLEventDispatcher::~LLEventDispatcher()
}
/// Register a callable by name
-void LLEventDispatcher::add(const std::string& name, const Callable& callable, const LLSD& required)
+void LLEventDispatcher::add(const std::string& name, const std::string& desc,
+ const Callable& callable, const LLSD& required)
{
- mDispatch[name] = DispatchMap::mapped_type(callable, required);
+ mDispatch.insert(DispatchMap::value_type(name,
+ DispatchMap::mapped_type(callable, desc, required)));
}
void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const
@@ -98,14 +100,14 @@ bool LLEventDispatcher::attemptCall(const std::string& name, const LLSD& event)
}
// Found the name, so it's plausible to even attempt the call. But first,
// validate the syntax of the event itself.
- std::string mismatch(llsd_matches(found->second.second, event));
+ std::string mismatch(llsd_matches(found->second.mRequired, event));
if (! mismatch.empty())
{
LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ") calling '" << name
<< "': bad request: " << mismatch << LL_ENDL;
}
// Event syntax looks good, go for it!
- (found->second.first)(event);
+ (found->second.mFunc)(event);
return true; // tell caller we were able to call
}
@@ -116,7 +118,21 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons
{
return Callable();
}
- return found->second.first;
+ return found->second.mFunc;
+}
+
+LLSD LLEventDispatcher::getMetadata(const std::string& name) const
+{
+ DispatchMap::const_iterator found = mDispatch.find(name);
+ if (found == mDispatch.end())
+ {
+ return LLSD();
+ }
+ LLSD meta;
+ meta["name"] = name;
+ meta["desc"] = found->second.mDesc;
+ meta["required"] = found->second.mRequired;
+ return meta;
}
LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index 671f2a4d1c..1e625bcee8 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -1,130 +1,193 @@
-/**
- * @file lleventdispatcher.h
- * @author Nat Goodspeed
- * @date 2009-06-18
- * @brief Central mechanism for dispatching events by string name. This is
- * useful when you have a single LLEventPump listener on which you can
- * request different operations, vs. instantiating a different
- * LLEventPump for each such operation.
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * Copyright (c) 2009, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLEVENTDISPATCHER_H)
-#define LL_LLEVENTDISPATCHER_H
-
-#include <string>
-#include <map>
-#include <boost/function.hpp>
-#include <boost/bind.hpp>
-#include <typeinfo>
-#include "llevents.h"
-
-class LLSD;
-
-/**
- * Given an LLSD map, examine a string-valued key and call a corresponding
- * callable. This class is designed to be contained by an LLEventPump
- * listener class that will register some of its own methods, though any
- * callable can be used.
- */
-class LL_COMMON_API LLEventDispatcher
-{
-public:
- LLEventDispatcher(const std::string& desc, const std::string& key);
- virtual ~LLEventDispatcher();
-
- /// Accept any C++ callable, typically a boost::bind() expression
- typedef boost::function<void(const LLSD&)> Callable;
-
- /**
- * Register a @a callable by @a name. The optional @a required parameter
- * is used to validate the structure of each incoming event (see
- * llsd_matches()).
- */
- void add(const std::string& name, const Callable& callable, const LLSD& required=LLSD());
-
- /**
- * Special case: a subclass of this class can pass an unbound member
- * function pointer without explicitly specifying the
- * <tt>boost::bind()</tt> expression.
- */
- template <class CLASS>
- void add(const std::string& name, void (CLASS::*method)(const LLSD&),
- const LLSD& required=LLSD())
- {
- addMethod<CLASS>(name, method, required);
- }
-
- /// Overload for both const and non-const methods
- template <class CLASS>
- void add(const std::string& name, void (CLASS::*method)(const LLSD&) const,
- const LLSD& required=LLSD())
- {
- addMethod<CLASS>(name, method, required);
- }
-
- /// Unregister a callable
- bool remove(const std::string& name);
-
- /// Call a registered callable with an explicitly-specified name. If no
- /// such callable exists, die with LL_ERRS. If the @a event fails to match
- /// the @a required prototype specified at add() time, die with LL_ERRS.
- void operator()(const std::string& name, const LLSD& event) const;
-
- /// Extract the @a key value from the incoming @a event, and call the
- /// callable whose name is specified by that map @a key. If no such
- /// callable exists, die with LL_ERRS. If the @a event fails to match the
- /// @a required prototype specified at add() time, die with LL_ERRS.
- void operator()(const LLSD& event) const;
-
- /// Fetch the Callable for the specified name. If no such name was
- /// registered, return an empty() Callable.
- Callable get(const std::string& name) const;
-
-private:
- template <class CLASS, typename METHOD>
- void addMethod(const std::string& name, const METHOD& method, const LLSD& required)
- {
- CLASS* downcast = dynamic_cast<CLASS*>(this);
- if (! downcast)
- {
- addFail(name, typeid(CLASS).name());
- }
- else
- {
- add(name, boost::bind(method, downcast, _1), required);
- }
- }
- void addFail(const std::string& name, const std::string& classname) const;
- /// try to dispatch, return @c true if success
- bool attemptCall(const std::string& name, const LLSD& event) const;
-
- std::string mDesc, mKey;
- typedef std::map<std::string, std::pair<Callable, LLSD> > DispatchMap;
- DispatchMap mDispatch;
-};
-
-/**
- * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class
- * that contains (or derives from) LLDispatchListener need only specify the
- * LLEventPump name and dispatch key, and add() its methods. Incoming events
- * will automatically be dispatched.
- */
-class LL_COMMON_API LLDispatchListener: public LLEventDispatcher
-{
-public:
- LLDispatchListener(const std::string& pumpname, const std::string& key);
-
- std::string getPumpName() const { return mPump.getName(); }
-
-private:
- bool process(const LLSD& event);
-
- LLEventStream mPump;
- LLTempBoundListener mBoundListener;
-};
-
-#endif /* ! defined(LL_LLEVENTDISPATCHER_H) */
+/**
+ * @file lleventdispatcher.h
+ * @author Nat Goodspeed
+ * @date 2009-06-18
+ * @brief Central mechanism for dispatching events by string name. This is
+ * useful when you have a single LLEventPump listener on which you can
+ * request different operations, vs. instantiating a different
+ * LLEventPump for each such operation.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTDISPATCHER_H)
+#define LL_LLEVENTDISPATCHER_H
+
+#include <string>
+#include <map>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <typeinfo>
+#include "llevents.h"
+
+class LLSD;
+
+/**
+ * Given an LLSD map, examine a string-valued key and call a corresponding
+ * callable. This class is designed to be contained by an LLEventPump
+ * listener class that will register some of its own methods, though any
+ * callable can be used.
+ */
+class LL_COMMON_API LLEventDispatcher
+{
+public:
+ LLEventDispatcher(const std::string& desc, const std::string& key);
+ virtual ~LLEventDispatcher();
+
+ /// Accept any C++ callable, typically a boost::bind() expression
+ typedef boost::function<void(const LLSD&)> Callable;
+
+ /**
+ * Register a @a callable by @a name. The optional @a required parameter
+ * is used to validate the structure of each incoming event (see
+ * llsd_matches()).
+ */
+ void add(const std::string& name,
+ const std::string& desc,
+ const Callable& callable,
+ const LLSD& required=LLSD());
+
+ /**
+ * Special case: a subclass of this class can pass an unbound member
+ * function pointer without explicitly specifying the
+ * <tt>boost::bind()</tt> expression.
+ */
+ template <class CLASS>
+ void add(const std::string& name,
+ const std::string& desc,
+ void (CLASS::*method)(const LLSD&),
+ const LLSD& required=LLSD())
+ {
+ addMethod<CLASS>(name, desc, method, required);
+ }
+
+ /// Overload for both const and non-const methods
+ template <class CLASS>
+ void add(const std::string& name,
+ const std::string& desc,
+ void (CLASS::*method)(const LLSD&) const,
+ const LLSD& required=LLSD())
+ {
+ addMethod<CLASS>(name, desc, method, required);
+ }
+
+ /// Convenience: for LLEventDispatcher, not every callable needs a
+ /// documentation string.
+ template <typename CALLABLE>
+ void add(const std::string& name,
+ CALLABLE callable,
+ const LLSD& required=LLSD())
+ {
+ add(name, "", callable, required);
+ }
+
+ /// Unregister a callable
+ bool remove(const std::string& name);
+
+ /// Call a registered callable with an explicitly-specified name. If no
+ /// such callable exists, die with LL_ERRS. If the @a event fails to match
+ /// the @a required prototype specified at add() time, die with LL_ERRS.
+ void operator()(const std::string& name, const LLSD& event) const;
+
+ /// Extract the @a key value from the incoming @a event, and call the
+ /// callable whose name is specified by that map @a key. If no such
+ /// callable exists, die with LL_ERRS. If the @a event fails to match the
+ /// @a required prototype specified at add() time, die with LL_ERRS.
+ void operator()(const LLSD& event) const;
+
+ /// @name Iterate over defined names
+ //@{
+ typedef std::pair<std::string, std::string> NameDesc;
+
+private:
+ struct DispatchEntry
+ {
+ DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
+ mFunc(func),
+ mDesc(desc),
+ mRequired(required)
+ {}
+ Callable mFunc;
+ std::string mDesc;
+ LLSD mRequired;
+ };
+ typedef std::map<std::string, DispatchEntry> DispatchMap;
+
+public:
+ /// We want the flexibility to redefine what data we store per name,
+ /// therefore our public interface doesn't expose DispatchMap iterators,
+ /// or DispatchMap itself, or DispatchEntry. Instead we explicitly
+ /// transform each DispatchMap item to NameDesc on dereferencing.
+ typedef boost::transform_iterator<NameDesc(*)(const DispatchMap::value_type&), DispatchMap::const_iterator> const_iterator;
+ const_iterator begin() const
+ {
+ return boost::make_transform_iterator(mDispatch.begin(), makeNameDesc);
+ }
+ const_iterator end() const
+ {
+ return boost::make_transform_iterator(mDispatch.end(), makeNameDesc);
+ }
+ //@}
+
+ /// Fetch the Callable for the specified name. If no such name was
+ /// registered, return an empty() Callable.
+ Callable get(const std::string& name) const;
+
+ /// Get information about a specific Callable
+ LLSD getMetadata(const std::string& name) const;
+
+ /// Retrieve the LLSD key we use for one-arg <tt>operator()</tt> method
+ std::string getDispatchKey() const { return mKey; }
+
+private:
+ template <class CLASS, typename METHOD>
+ void addMethod(const std::string& name, const std::string& desc,
+ const METHOD& method, const LLSD& required)
+ {
+ CLASS* downcast = dynamic_cast<CLASS*>(this);
+ if (! downcast)
+ {
+ addFail(name, typeid(CLASS).name());
+ }
+ else
+ {
+ add(name, desc, boost::bind(method, downcast, _1), required);
+ }
+ }
+ void addFail(const std::string& name, const std::string& classname) const;
+ /// try to dispatch, return @c true if success
+ bool attemptCall(const std::string& name, const LLSD& event) const;
+
+ std::string mDesc, mKey;
+ DispatchMap mDispatch;
+
+ static NameDesc makeNameDesc(const DispatchMap::value_type& item)
+ {
+ return NameDesc(item.first, item.second.mDesc);
+ }
+};
+
+/**
+ * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class
+ * that contains (or derives from) LLDispatchListener need only specify the
+ * LLEventPump name and dispatch key, and add() its methods. Incoming events
+ * will automatically be dispatched.
+ */
+class LL_COMMON_API LLDispatchListener: public LLEventDispatcher
+{
+public:
+ LLDispatchListener(const std::string& pumpname, const std::string& key);
+
+ std::string getPumpName() const { return mPump.getName(); }
+
+private:
+ bool process(const LLSD& event);
+
+ LLEventStream mPump;
+ LLTempBoundListener mBoundListener;
+};
+
+#endif /* ! defined(LL_LLEVENTDISPATCHER_H) */
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 4bdfe5a867..31fdd9e60a 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -459,11 +459,25 @@ void LLEventPump::stopListening(const std::string& name)
bool LLEventStream::post(const LLSD& event)
{
if (! mEnabled)
+ {
return false;
+ }
+ // NOTE NOTE NOTE: Any new access to member data beyond this point should
+ // cause us to move our LLStandardSignal object to a pimpl class along
+ // with said member data. Then the local shared_ptr will preserve both.
+
+ // DEV-43463: capture a local copy of mSignal. We've turned up a
+ // cross-coroutine scenario (described in the Jira) in which this post()
+ // call could end up destroying 'this', the LLEventPump subclass instance
+ // containing mSignal, during the call through *mSignal. So -- capture a
+ // *stack* instance of the shared_ptr, ensuring that our heap
+ // LLStandardSignal object will live at least until post() returns, even
+ // if 'this' gets destroyed during the call.
+ boost::shared_ptr<LLStandardSignal> signal(mSignal);
// Let caller know if any one listener handled the event. This is mostly
// useful when using LLEventStream as a listener for an upstream
// LLEventPump.
- return (*mSignal)(event);
+ return (*signal)(event);
}
/*****************************************************************************
@@ -492,9 +506,16 @@ void LLEventQueue::flush()
// be processed in the *next* flush() call.
EventQueue queue(mEventQueue);
mEventQueue.clear();
+ // NOTE NOTE NOTE: Any new access to member data beyond this point should
+ // cause us to move our LLStandardSignal object to a pimpl class along
+ // with said member data. Then the local shared_ptr will preserve both.
+
+ // DEV-43463: capture a local copy of mSignal. See LLEventStream::post()
+ // for detailed comments.
+ boost::shared_ptr<LLStandardSignal> signal(mSignal);
for ( ; ! queue.empty(); queue.pop_front())
{
- (*mSignal)(queue.front());
+ (*signal)(queue.front());
}
}
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 64e5cb5da7..a73ada2931 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -1,943 +1,1018 @@
-/**
- * @file llevents.h
- * @author Kent Quirk, Nat Goodspeed
- * @date 2008-09-11
- * @brief This is an implementation of the event system described at
- * https://wiki.lindenlab.com/wiki/Viewer:Messaging/Event_System,
- * originally introduced in llnotifications.h. It has nothing
- * whatsoever to do with the older system in llevent.h.
- *
- * $LicenseInfo:firstyear=2008&license=viewergpl$
- * Copyright (c) 2008, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLEVENTS_H)
-#define LL_LLEVENTS_H
-
-#include <string>
-#include <map>
-#include <set>
-#include <vector>
-#include <deque>
-#include <stdexcept>
-#if LL_WINDOWS
- #pragma warning (push)
- #pragma warning (disable : 4263) // boost::signals2::expired_slot::what() has const mismatch
- #pragma warning (disable : 4264)
-#endif
-#include <boost/signals2.hpp>
-#if LL_WINDOWS
- #pragma warning (pop)
-#endif
-
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/enable_shared_from_this.hpp>
-#include <boost/utility.hpp> // noncopyable
-#include <boost/optional/optional.hpp>
-#include <boost/visit_each.hpp>
-#include <boost/ref.hpp> // reference_wrapper
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/function.hpp>
-#include <boost/static_assert.hpp>
-#include "llsd.h"
-#include "llsingleton.h"
-#include "lldependencies.h"
-
-// override this to allow binding free functions with more parameters
-#ifndef LLEVENTS_LISTENER_ARITY
-#define LLEVENTS_LISTENER_ARITY 10
-#endif
-
-// hack for testing
-#ifndef testable
-#define testable private
-#endif
-
-/*****************************************************************************
-* Signal and handler declarations
-* Using a single handler signature means that we can have a common handler
-* type, rather than needing a distinct one for each different handler.
-*****************************************************************************/
-
-/**
- * A boost::signals Combiner that stops the first time a handler returns true
- * We need this because we want to have our handlers return bool, so that
- * we have the option to cause a handler to stop further processing. The
- * default handler fails when the signal returns a value but has no slots.
- */
-struct LLStopWhenHandled
-{
- typedef bool result_type;
-
- template<typename InputIterator>
- result_type operator()(InputIterator first, InputIterator last) const
- {
- for (InputIterator si = first; si != last; ++si)
- {
- if (*si)
- {
- return true;
- }
- }
- return false;
- }
-};
-
-/**
- * We want to have a standard signature for all signals; this way,
- * we can easily document a protocol for communicating across
- * dlls and into scripting languages someday.
- *
- * We want to return a bool to indicate whether the signal has been
- * handled and should NOT be passed on to other listeners.
- * Return true to stop further handling of the signal, and false
- * to continue.
- *
- * We take an LLSD because this way the contents of the signal
- * are independent of the API used to communicate it.
- * It is const ref because then there's low cost to pass it;
- * if you only need to inspect it, it's very cheap.
- *
- * @internal
- * The @c float template parameter indicates that we will internally use @c
- * float to indicate relative listener order on a given LLStandardSignal.
- * Don't worry, the @c float values are strictly internal! They are not part
- * of the interface, for the excellent reason that requiring the caller to
- * specify a numeric key to establish order means that the caller must know
- * the universe of possible values. We use LLDependencies for that instead.
- */
-typedef boost::signals2::signal<bool(const LLSD&), LLStopWhenHandled, float> LLStandardSignal;
-/// Methods that forward listeners (e.g. constructed with
-/// <tt>boost::bind()</tt>) should accept (const LLEventListener&)
-typedef LLStandardSignal::slot_type LLEventListener;
-/// Result of registering a listener, supports <tt>connected()</tt>,
-/// <tt>disconnect()</tt> and <tt>blocked()</tt>
-typedef boost::signals2::connection LLBoundListener;
-/// Storing an LLBoundListener in LLTempBoundListener will disconnect the
-/// referenced listener when the LLTempBoundListener instance is destroyed.
-typedef boost::signals2::scoped_connection LLTempBoundListener;
-
-/**
- * A common idiom for event-based code is to accept either a callable --
- * directly called on completion -- or the string name of an LLEventPump on
- * which to post the completion event. Specifying a parameter as <tt>const
- * LLListenerOrPumpName&</tt> allows either.
- *
- * Calling a validly-constructed LLListenerOrPumpName, passing the LLSD
- * 'event' object, either calls the callable or posts the event to the named
- * LLEventPump.
- *
- * A default-constructed LLListenerOrPumpName is 'empty'. (This is useful as
- * the default value of an optional method parameter.) Calling it throws
- * LLListenerOrPumpName::Empty. Test for this condition beforehand using
- * either <tt>if (param)</tt> or <tt>if (! param)</tt>.
- */
-class LL_COMMON_API LLListenerOrPumpName
-{
-public:
- /// passing string name of LLEventPump
- LLListenerOrPumpName(const std::string& pumpname);
- /// passing string literal (overload so compiler isn't forced to infer
- /// double conversion)
- LLListenerOrPumpName(const char* pumpname);
- /// passing listener -- the "anything else" catch-all case. The type of an
- /// object constructed by boost::bind() isn't intended to be written out.
- /// Normally we'd just accept 'const LLEventListener&', but that would
- /// require double implicit conversion: boost::bind() object to
- /// LLEventListener, LLEventListener to LLListenerOrPumpName. So use a
- /// template to forward anything.
- template<typename T>
- LLListenerOrPumpName(const T& listener): mListener(listener) {}
-
- /// for omitted method parameter: uninitialized mListener
- LLListenerOrPumpName() {}
-
- /// test for validity
- operator bool() const { return bool(mListener); }
- bool operator! () const { return ! mListener; }
-
- /// explicit accessor
- const LLEventListener& getListener() const { return *mListener; }
-
- /// implicit conversion to LLEventListener
- operator LLEventListener() const { return *mListener; }
-
- /// allow calling directly
- bool operator()(const LLSD& event) const;
-
- /// exception if you try to call when empty
- struct Empty: public std::runtime_error
- {
- Empty(const std::string& what):
- std::runtime_error(std::string("LLListenerOrPumpName::Empty: ") + what) {}
- };
-
-private:
- boost::optional<LLEventListener> mListener;
-};
-
-/*****************************************************************************
-* LLEventPumps
-*****************************************************************************/
-class LLEventPump;
-
-/**
- * LLEventPumps is a Singleton manager through which one typically accesses
- * this subsystem.
- */
-class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
-{
- friend class LLSingleton<LLEventPumps>;
-public:
- /**
- * Find or create an LLEventPump instance with a specific name. We return
- * a reference so there's no question about ownership. obtain() @em finds
- * an instance without conferring @em ownership.
- */
- LLEventPump& obtain(const std::string& name);
- /**
- * Flush all known LLEventPump instances
- */
- void flush();
-
- /**
- * Reset all known LLEventPump instances
- * workaround for DEV-35406 crash on shutdown
- */
- void reset();
-
-private:
- friend class LLEventPump;
- /**
- * Register a new LLEventPump instance (internal)
- */
- std::string registerNew(const LLEventPump&, const std::string& name, bool tweak);
- /**
- * Unregister a doomed LLEventPump instance (internal)
- */
- void unregister(const LLEventPump&);
-
-private:
- LLEventPumps();
- ~LLEventPumps();
-
-testable:
- // Map of all known LLEventPump instances, whether or not we instantiated
- // them. We store a plain old LLEventPump* because this map doesn't claim
- // ownership of the instances. Though the common usage pattern is to
- // request an instance using obtain(), it's fair to instantiate an
- // LLEventPump subclass statically, as a class member, on the stack or on
- // the heap. In such cases, the instantiating party is responsible for its
- // lifespan.
- typedef std::map<std::string, LLEventPump*> PumpMap;
- PumpMap mPumpMap;
- // Set of all LLEventPumps we instantiated. Membership in this set means
- // we claim ownership, and will delete them when this LLEventPumps is
- // destroyed.
- typedef std::set<LLEventPump*> PumpSet;
- PumpSet mOurPumps;
- // LLEventPump names that should be instantiated as LLEventQueue rather
- // than as LLEventStream
- typedef std::set<std::string> PumpNames;
- PumpNames mQueueNames;
-};
-
-/*****************************************************************************
-* details
-*****************************************************************************/
-namespace LLEventDetail
-{
- /// Any callable capable of connecting an LLEventListener to an
- /// LLStandardSignal to produce an LLBoundListener can be mapped to this
- /// signature.
- typedef boost::function<LLBoundListener(const LLEventListener&)> ConnectFunc;
-
- /**
- * Utility template function to use Visitor appropriately
- *
- * @param listener Callable to connect, typically a boost::bind()
- * expression. This will be visited by Visitor using boost::visit_each().
- * @param connect_func Callable that will connect() @a listener to an
- * LLStandardSignal, returning LLBoundListener.
- */
- template <typename LISTENER>
- LLBoundListener visit_and_connect(const LISTENER& listener,
- const ConnectFunc& connect_func);
-} // namespace LLEventDetail
-
-/*****************************************************************************
-* LLEventTrackable
-*****************************************************************************/
-/**
- * LLEventTrackable wraps boost::signals2::trackable, which resembles
- * boost::trackable. Derive your listener class from LLEventTrackable instead,
- * and use something like
- * <tt>LLEventPump::listen(boost::bind(&YourTrackableSubclass::method,
- * instance, _1))</tt>. This will implicitly disconnect when the object
- * referenced by @c instance is destroyed.
- *
- * @note
- * LLEventTrackable doesn't address a couple of cases:
- * * Object destroyed during call
- * - You enter a slot call in thread A.
- * - Thread B destroys the object, which of course disconnects it from any
- * future slot calls.
- * - Thread A's call uses 'this', which now refers to a defunct object.
- * Undefined behavior results.
- * * Call during destruction
- * - @c MySubclass is derived from LLEventTrackable.
- * - @c MySubclass registers one of its own methods using
- * <tt>LLEventPump::listen()</tt>.
- * - The @c MySubclass object begins destruction. <tt>~MySubclass()</tt>
- * runs, destroying state specific to the subclass. (For instance, a
- * <tt>Foo*</tt> data member is <tt>delete</tt>d but not zeroed.)
- * - The listening method will not be disconnected until
- * <tt>~LLEventTrackable()</tt> runs.
- * - Before we get there, another thread posts data to the @c LLEventPump
- * instance, calling the @c MySubclass method.
- * - The method in question relies on valid @c MySubclass state. (For
- * instance, it attempts to dereference the <tt>Foo*</tt> pointer that was
- * <tt>delete</tt>d but not zeroed.)
- * - Undefined behavior results.
- * If you suspect you may encounter any such scenario, you're better off
- * managing the lifespan of your object with <tt>boost::shared_ptr</tt>.
- * Passing <tt>LLEventPump::listen()</tt> a <tt>boost::bind()</tt> expression
- * involving a <tt>boost::weak_ptr<Foo></tt> is recognized specially, engaging
- * thread-safe Boost.Signals2 machinery.
- */
-typedef boost::signals2::trackable LLEventTrackable;
-
-/*****************************************************************************
-* LLEventPump
-*****************************************************************************/
-/**
- * LLEventPump is the base class interface through which we access the
- * concrete subclasses LLEventStream and LLEventQueue.
- *
- * @NOTE
- * LLEventPump derives from LLEventTrackable so that when you "chain"
- * LLEventPump instances together, they will automatically disconnect on
- * destruction. Please see LLEventTrackable documentation for situations in
- * which this may be perilous across threads.
- */
-class LL_COMMON_API LLEventPump: public LLEventTrackable
-{
-public:
- /**
- * Exception thrown by LLEventPump(). You are trying to instantiate an
- * LLEventPump (subclass) using the same name as some other instance, and
- * you didn't pass <tt>tweak=true</tt> to permit it to generate a unique
- * variant.
- */
- struct DupPumpName: public std::runtime_error
- {
- DupPumpName(const std::string& what):
- std::runtime_error(std::string("DupPumpName: ") + what) {}
- };
-
- /**
- * Instantiate an LLEventPump (subclass) with the string name by which it
- * can be found using LLEventPumps::obtain().
- *
- * If you pass (or default) @a tweak to @c false, then a duplicate name
- * will throw DupPumpName. This won't happen if LLEventPumps::obtain()
- * instantiates the LLEventPump, because obtain() uses find-or-create
- * logic. It can only happen if you instantiate an LLEventPump in your own
- * code -- and a collision with the name of some other LLEventPump is
- * likely to cause much more subtle problems!
- *
- * When you hand-instantiate an LLEventPump, consider passing @a tweak as
- * @c true. This directs LLEventPump() to append a suffix to the passed @a
- * name to make it unique. You can retrieve the adjusted name by calling
- * getName() on your new instance.
- */
- LLEventPump(const std::string& name, bool tweak=false);
- virtual ~LLEventPump();
-
- /// group exceptions thrown by listen(). We use exceptions because these
- /// particular errors are likely to be coding errors, found and fixed by
- /// the developer even before preliminary checkin.
- struct ListenError: public std::runtime_error
- {
- ListenError(const std::string& what): std::runtime_error(what) {}
- };
- /**
- * exception thrown by listen(). You are attempting to register a
- * listener on this LLEventPump using the same listener name as an
- * already-registered listener.
- */
- struct DupListenerName: public ListenError
- {
- DupListenerName(const std::string& what):
- ListenError(std::string("DupListenerName: ") + what)
- {}
- };
- /**
- * exception thrown by listen(). The order dependencies specified for your
- * listener are incompatible with existing listeners.
- *
- * Consider listener "a" which specifies before "b" and "b" which
- * specifies before "c". You are now attempting to register "c" before
- * "a". There is no order that can satisfy all constraints.
- */
- struct Cycle: public ListenError
- {
- Cycle(const std::string& what): ListenError(std::string("Cycle: ") + what) {}
- };
- /**
- * exception thrown by listen(). This one means that your new listener
- * would force a change to the order of previously-registered listeners,
- * and we don't have a good way to implement that.
- *
- * Consider listeners "some", "other" and "third". "some" and "other" are
- * registered earlier without specifying relative order, so "other"
- * happens to be first. Now you attempt to register "third" after "some"
- * and before "other". Whoops, that would require swapping "some" and
- * "other", which we can't do. Instead we throw this exception.
- *
- * It may not be possible to change the registration order so we already
- * know "third"s order requirement by the time we register the second of
- * "some" and "other". A solution would be to specify that "some" must
- * come before "other", or equivalently that "other" must come after
- * "some".
- */
- struct OrderChange: public ListenError
- {
- OrderChange(const std::string& what): ListenError(std::string("OrderChange: ") + what) {}
- };
-
- /// used by listen()
- typedef std::vector<std::string> NameList;
- /// convenience placeholder for when you explicitly want to pass an empty
- /// NameList
- const static NameList empty;
-
- /// Get this LLEventPump's name
- std::string getName() const { return mName; }
-
- /**
- * Register a new listener with a unique name. Specify an optional list
- * of other listener names after which this one must be called, likewise
- * an optional list of other listener names before which this one must be
- * called. The other listeners mentioned need not yet be registered
- * themselves. listen() can throw any ListenError; see ListenError
- * subclasses.
- *
- * The listener name must be unique among active listeners for this
- * LLEventPump, else you get DupListenerName. If you don't care to invent
- * a name yourself, use inventName(). (I was tempted to recognize e.g. ""
- * and internally generate a distinct name for that case. But that would
- * handle badly the scenario in which you want to add, remove, re-add,
- * etc. the same listener: each new listen() call would necessarily
- * perform a new dependency sort. Assuming you specify the same
- * after/before lists each time, using inventName() when you first
- * instantiate your listener, then passing the same name on each listen()
- * call, allows us to optimize away the second and subsequent dependency
- * sorts.
- *
- * If (as is typical) you pass a <tt>boost::bind()</tt> expression as @a
- * listener, listen() will inspect the components of that expression. If a
- * bound object matches any of several cases, the connection will
- * automatically be disconnected when that object is destroyed.
- *
- * * You bind a <tt>boost::weak_ptr</tt>.
- * * Binding a <tt>boost::shared_ptr</tt> that way would ensure that the
- * referenced object would @em never be destroyed, since the @c
- * shared_ptr stored in the LLEventPump would remain an outstanding
- * reference. Use the weaken() function to convert your @c shared_ptr to
- * @c weak_ptr. Because this is easy to forget, binding a @c shared_ptr
- * will produce a compile error (@c BOOST_STATIC_ASSERT failure).
- * * You bind a simple pointer or reference to an object derived from
- * <tt>boost::enable_shared_from_this</tt>. (UNDER CONSTRUCTION)
- * * You bind a simple pointer or reference to an object derived from
- * LLEventTrackable. Unlike the cases described above, though, this is
- * vulnerable to a couple of cross-thread race conditions, as described
- * in the LLEventTrackable documentation.
- */
- template <typename LISTENER>
- LLBoundListener listen(const std::string& name, const LISTENER& listener,
- const NameList& after=NameList(),
- const NameList& before=NameList())
- {
- // Examine listener, using our listen_impl() method to make the
- // actual connection.
- // This is why listen() is a template. Conversion from boost::bind()
- // to LLEventListener performs type erasure, so it's important to look
- // at the boost::bind object itself before that happens.
- return LLEventDetail::visit_and_connect(listener,
- boost::bind(&LLEventPump::listen_impl,
- this,
- name,
- _1,
- after,
- before));
- }
-
- /// Get the LLBoundListener associated with the passed name (dummy
- /// LLBoundListener if not found)
- virtual LLBoundListener getListener(const std::string& name) const;
- /**
- * Instantiate one of these to block an existing connection:
- * @code
- * { // in some local scope
- * LLEventPump::Blocker block(someLLBoundListener);
- * // code that needs the connection blocked
- * } // unblock the connection again
- * @endcode
- */
- typedef boost::signals2::shared_connection_block Blocker;
- /// Unregister a listener by name. Prefer this to
- /// <tt>getListener(name).disconnect()</tt> because stopListening() also
- /// forgets this name.
- virtual void stopListening(const std::string& name);
- /// Post an event to all listeners. The @c bool return is only meaningful
- /// if the underlying leaf class is LLEventStream -- beware of relying on
- /// it too much! Truthfully, we return @c bool mostly to permit chaining
- /// one LLEventPump as a listener on another.
- virtual bool post(const LLSD&) = 0;
- /// Enable/disable: while disabled, silently ignore all post() calls
- virtual void enable(bool enabled=true) { mEnabled = enabled; }
- /// query
- virtual bool enabled() const { return mEnabled; }
-
- /// Generate a distinct name for a listener -- see listen()
- static std::string inventName(const std::string& pfx="listener");
-
-private:
- friend class LLEventPumps;
- /// flush queued events
- virtual void flush() {}
-
- virtual void reset();
-
-private:
- virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
- const NameList& after,
- const NameList& before);
- std::string mName;
-
-protected:
- /// implement the dispatching
- boost::scoped_ptr<LLStandardSignal> mSignal;
-
- /// valve open?
- bool mEnabled;
- /// Map of named listeners. This tracks the listeners that actually exist
- /// at this moment. When we stopListening(), we discard the entry from
- /// this map.
- typedef std::map<std::string, boost::signals2::connection> ConnectionMap;
- ConnectionMap mConnections;
- typedef LLDependencies<std::string, float> DependencyMap;
- /// Dependencies between listeners. For each listener, track the float
- /// used to establish its place in mSignal's order. This caches all the
- /// listeners that have ever registered; stopListening() does not discard
- /// the entry from this map. This is to avoid a new dependency sort if the
- /// same listener with the same dependencies keeps hopping on and off this
- /// LLEventPump.
- DependencyMap mDeps;
-};
-
-/*****************************************************************************
-* LLEventStream
-*****************************************************************************/
-/**
- * LLEventStream is a thin wrapper around LLStandardSignal. Posting an
- * event immediately calls all registered listeners.
- */
-class LL_COMMON_API LLEventStream: public LLEventPump
-{
-public:
- LLEventStream(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
- virtual ~LLEventStream() {}
-
- /// Post an event to all listeners
- virtual bool post(const LLSD& event);
-};
-
-/*****************************************************************************
-* LLEventQueue
-*****************************************************************************/
-/**
- * LLEventQueue isa LLEventPump whose post() method defers calling registered
- * listeners until flush() is called.
- */
-class LL_COMMON_API LLEventQueue: public LLEventPump
-{
-public:
- LLEventQueue(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
- virtual ~LLEventQueue() {}
-
- /// Post an event to all listeners
- virtual bool post(const LLSD& event);
-
-private:
- /// flush queued events
- virtual void flush();
-
-private:
- typedef std::deque<LLSD> EventQueue;
- EventQueue mEventQueue;
-};
-
-/*****************************************************************************
-* LLReqID
-*****************************************************************************/
-/**
- * This class helps the implementer of a given event API to honor the
- * ["reqid"] convention. By this convention, each event API stamps into its
- * response LLSD a ["reqid"] key whose value echoes the ["reqid"] value, if
- * any, from the corresponding request.
- *
- * This supports an (atypical, but occasionally necessary) use case in which
- * two or more asynchronous requests are multiplexed onto the same ["reply"]
- * LLEventPump. Since the response events could arrive in arbitrary order, the
- * caller must be able to demux them. It does so by matching the ["reqid"]
- * value in each response with the ["reqid"] value in the corresponding
- * request.
- *
- * It is the caller's responsibility to ensure distinct ["reqid"] values for
- * that case. Though LLSD::UUID is guaranteed to work, it might be overkill:
- * the "namespace" of unique ["reqid"] values is simply the set of requests
- * specifying the same ["reply"] LLEventPump name.
- *
- * Making a given event API echo the request's ["reqid"] into the response is
- * nearly trivial. This helper is mostly for mnemonic purposes, to serve as a
- * place to put these comments. We hope that each time a coder implements a
- * new event API based on some existing one, s/he will say, "Huh, what's an
- * LLReqID?" and look up this material.
- *
- * The hardest part about the convention is deciding where to store the
- * ["reqid"] value. Ironically, LLReqID can't help with that: you must store
- * an LLReqID instance in whatever storage will persist until the reply is
- * sent. For example, if the request ultimately ends up using a Responder
- * subclass, storing an LLReqID instance in the Responder works.
- *
- * @note
- * The @em implementer of an event API must honor the ["reqid"] convention.
- * However, the @em caller of an event API need only use it if s/he is sharing
- * the same ["reply"] LLEventPump for two or more asynchronous event API
- * requests.
- *
- * In most cases, it's far easier for the caller to instantiate a local
- * LLEventStream and pass its name to the event API in question. Then it's
- * perfectly reasonable not to set a ["reqid"] key in the request, ignoring
- * the @c isUndefined() ["reqid"] value in the response.
- */
-class LL_COMMON_API LLReqID
-{
-public:
- /**
- * If you have the request in hand at the time you instantiate the
- * LLReqID, pass that request to extract its ["reqid"].
- */
- LLReqID(const LLSD& request):
- mReqid(request["reqid"])
- {}
- /// If you don't yet have the request, use setFrom() later.
- LLReqID() {}
-
- /// Extract and store the ["reqid"] value from an incoming request.
- void setFrom(const LLSD& request)
- {
- mReqid = request["reqid"];
- }
-
- /// Set ["reqid"] key into a pending response LLSD object.
- void stamp(LLSD& response) const;
-
- /// Make a whole new response LLSD object with our ["reqid"].
- LLSD makeResponse() const
- {
- LLSD response;
- stamp(response);
- return response;
- }
-
- /// Not really sure of a use case for this accessor...
- LLSD getReqID() const { return mReqid; }
-
-private:
- LLSD mReqid;
-};
-
-/*****************************************************************************
-* Underpinnings
-*****************************************************************************/
-/**
- * We originally provided a suite of overloaded
- * LLEventTrackable::listenTo(LLEventPump&, ...) methods that would call
- * LLEventPump::listen(...) and then pass the returned LLBoundListener to
- * LLEventTrackable::track(). This was workable but error-prone: the coder
- * must remember to call listenTo() rather than the more straightforward
- * listen() method.
- *
- * Now we publish only the single canonical listen() method, so there's a
- * uniform mechanism. Having a single way to do this is good, in that there's
- * no question in the coder's mind which of several alternatives to choose.
- *
- * To support automatic connection management, we use boost::visit_each
- * (http://www.boost.org/doc/libs/1_37_0/doc/html/boost/visit_each.html) to
- * inspect each argument of a boost::bind expression. (Although the visit_each
- * mechanism was first introduced with the original Boost.Signals library, it
- * was only later documented.)
- *
- * Cases:
- * * At least one of the function's arguments is a boost::weak_ptr<T>. Pass
- * the corresponding shared_ptr to slot_type::track(). Ideally that would be
- * the object whose method we want to call, but in fact we do the same for
- * any weak_ptr we might find among the bound arguments. If we're passing
- * our bound method a weak_ptr to some object, wouldn't the destruction of
- * that object invalidate the call? So we disconnect automatically when any
- * such object is destroyed. This is the mechanism preferred by boost::
- * signals2.
- * * One of the functions's arguments is a boost::shared_ptr<T>. This produces
- * a compile error: the bound copy of the shared_ptr stored in the
- * boost_bind object stored in the signal object would make the referenced
- * T object immortal. We provide a weaken() function. Pass
- * weaken(your_shared_ptr) instead. (We can inspect, but not modify, the
- * boost::bind object. Otherwise we'd replace the shared_ptr with weak_ptr
- * implicitly and just proceed.)
- * * One of the function's arguments is a plain pointer/reference to an object
- * derived from boost::enable_shared_from_this. We assume that this object
- * is managed using boost::shared_ptr, so we implicitly extract a shared_ptr
- * and track that. (UNDER CONSTRUCTION)
- * * One of the function's arguments is derived from LLEventTrackable. Pass
- * the LLBoundListener to its LLEventTrackable::track(). This is vulnerable
- * to a couple different race conditions, as described in LLEventTrackable
- * documentation. (NOTE: Now that LLEventTrackable is a typedef for
- * boost::signals2::trackable, the Signals2 library handles this itself, so
- * our visitor needs no special logic for this case.)
- * * Any other argument type is irrelevant to automatic connection management.
- */
-
-namespace LLEventDetail
-{
- template <typename F>
- const F& unwrap(const F& f) { return f; }
-
- template <typename F>
- const F& unwrap(const boost::reference_wrapper<F>& f) { return f.get(); }
-
- // Most of the following is lifted from the Boost.Signals use of
- // visit_each.
- template<bool Cond> struct truth {};
-
- /**
- * boost::visit_each() Visitor, used on a template argument <tt>const F&
- * f</tt> as follows (see visit_and_connect()):
- * @code
- * LLEventListener listener(f);
- * Visitor visitor(listener); // bind listener so it can track() shared_ptrs
- * using boost::visit_each; // allow unqualified visit_each() call for ADL
- * visit_each(visitor, unwrap(f));
- * @endcode
- */
- class Visitor
- {
- public:
- /**
- * Visitor binds a reference to LLEventListener so we can track() any
- * shared_ptrs we find in the argument list.
- */
- Visitor(LLEventListener& listener):
- mListener(listener)
- {
- }
-
- /**
- * boost::visit_each() calls this method for each component of a
- * boost::bind() expression.
- */
- template <typename T>
- void operator()(const T& t) const
- {
- decode(t, 0);
- }
-
- private:
- // decode() decides between a reference wrapper and anything else
- // boost::ref() variant
- template<typename T>
- void decode(const boost::reference_wrapper<T>& t, int) const
- {
-// add_if_trackable(t.get_pointer());
- }
-
- // decode() anything else
- template<typename T>
- void decode(const T& t, long) const
- {
- typedef truth<(boost::is_pointer<T>::value)> is_a_pointer;
- maybe_get_pointer(t, is_a_pointer());
- }
-
- // maybe_get_pointer() decides between a pointer and a non-pointer
- // plain pointer variant
- template<typename T>
- void maybe_get_pointer(const T& t, truth<true>) const
- {
-// add_if_trackable(t);
- }
-
- // shared_ptr variant
- template<typename T>
- void maybe_get_pointer(const boost::shared_ptr<T>& t, truth<false>) const
- {
- // If we have a shared_ptr to this object, it doesn't matter
- // whether the object is derived from LLEventTrackable, so no
- // further analysis of T is needed.
-// mListener.track(t);
-
- // Make this case illegal. Passing a bound shared_ptr to
- // slot_type::track() is useless, since the bound shared_ptr will
- // keep the object alive anyway! Force the coder to cast to weak_ptr.
-
- // Trivial as it is, make the BOOST_STATIC_ASSERT() condition
- // dependent on template param so the macro is only evaluated if
- // this method is in fact instantiated, as described here:
- // http://www.boost.org/doc/libs/1_34_1/doc/html/boost_staticassert.html
-
- // ATTENTION: Don't bind a shared_ptr<anything> using
- // LLEventPump::listen(boost::bind()). Doing so captures a copy of
- // the shared_ptr, making the referenced object effectively
- // immortal. Use the weaken() function, e.g.:
- // somepump.listen(boost::bind(...weaken(my_shared_ptr)...));
- // This lets us automatically disconnect when the referenced
- // object is destroyed.
- BOOST_STATIC_ASSERT(sizeof(T) == 0);
- }
-
- // weak_ptr variant
- template<typename T>
- void maybe_get_pointer(const boost::weak_ptr<T>& t, truth<false>) const
- {
- // If we have a weak_ptr to this object, it doesn't matter
- // whether the object is derived from LLEventTrackable, so no
- // further analysis of T is needed.
- mListener.track(t);
-// std::cout << "Found weak_ptr<" << typeid(T).name() << ">!\n";
- }
-
-#if 0
- // reference to anything derived from boost::enable_shared_from_this
- template <typename T>
- inline void maybe_get_pointer(const boost::enable_shared_from_this<T>& ct,
- truth<false>) const
- {
- // Use the slot_type::track(shared_ptr) mechanism. Cast away
- // const-ness because (in our code base anyway) it's unusual
- // to find shared_ptr<const T>.
- boost::enable_shared_from_this<T>&
- t(const_cast<boost::enable_shared_from_this<T>&>(ct));
- std::cout << "Capturing shared_from_this()" << std::endl;
- boost::shared_ptr<T> sp(t.shared_from_this());
-/*==========================================================================*|
- std::cout << "Capturing weak_ptr" << std::endl;
- boost::weak_ptr<T> wp(sp);
-|*==========================================================================*/
- std::cout << "Tracking shared__ptr" << std::endl;
- mListener.track(sp);
- }
-#endif
-
- // non-pointer variant
- template<typename T>
- void maybe_get_pointer(const T& t, truth<false>) const
- {
- // Take the address of this object, because the object itself may be
- // trackable
-// add_if_trackable(boost::addressof(t));
- }
-
-/*==========================================================================*|
- // add_if_trackable() adds LLEventTrackable objects to mTrackables
- inline void add_if_trackable(const LLEventTrackable* t) const
- {
- if (t)
- {
- }
- }
-
- // pointer to anything not an LLEventTrackable subclass
- inline void add_if_trackable(const void*) const
- {
- }
-
- // pointer to free function
- // The following construct uses the preprocessor to generate
- // add_if_trackable() overloads accepting pointer-to-function taking
- // 0, 1, ..., LLEVENTS_LISTENER_ARITY parameters of arbitrary type.
-#define BOOST_PP_LOCAL_MACRO(n) \
- template <typename R \
- BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM_PARAMS(n, typename T)> \
- inline void \
- add_if_trackable(R (*)(BOOST_PP_ENUM_PARAMS(n, T))) const \
- { \
- }
-#define BOOST_PP_LOCAL_LIMITS (0, LLEVENTS_LISTENER_ARITY)
-#include BOOST_PP_LOCAL_ITERATE()
-#undef BOOST_PP_LOCAL_MACRO
-#undef BOOST_PP_LOCAL_LIMITS
-|*==========================================================================*/
-
- /// Bind a reference to the LLEventListener to call its track() method.
- LLEventListener& mListener;
- };
-
- /**
- * Utility template function to use Visitor appropriately
- *
- * @param raw_listener Callable to connect, typically a boost::bind()
- * expression. This will be visited by Visitor using boost::visit_each().
- * @param connect_funct Callable that will connect() @a raw_listener to an
- * LLStandardSignal, returning LLBoundListener.
- */
- template <typename LISTENER>
- LLBoundListener visit_and_connect(const LISTENER& raw_listener,
- const ConnectFunc& connect_func)
- {
- // Capture the listener
- LLEventListener listener(raw_listener);
- // Define our Visitor, binding the listener so we can call
- // listener.track() if we discover any shared_ptr<Foo>.
- LLEventDetail::Visitor visitor(listener);
- // Allow unqualified visit_each() call for ADL
- using boost::visit_each;
- // Visit each component of a boost::bind() expression. Pass
- // 'raw_listener', our template argument, rather than 'listener' from
- // which type details have been erased. unwrap() comes from
- // Boost.Signals, in case we were passed a boost::ref().
- visit_each(visitor, LLEventDetail::unwrap(raw_listener));
- // Make the connection using passed function. At present, wrapping
- // this functionality into this function is a bit silly: we don't
- // really need a visit_and_connect() function any more, just a visit()
- // function. The definition of this function dates from when, after
- // visit_each(), after establishing the connection, we had to
- // postprocess the new connection with the visitor object. That's no
- // longer necessary.
- return connect_func(listener);
- }
-} // namespace LLEventDetail
-
-// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
-// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
-// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
-// specialized for boost::weak_ptr. This remedies that omission.
-namespace boost
-{
- template <typename T>
- T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
-}
-
-/// Since we forbid use of listen(boost::bind(...shared_ptr<T>...)), provide an
-/// easy way to cast to the corresponding weak_ptr.
-template <typename T>
-boost::weak_ptr<T> weaken(const boost::shared_ptr<T>& ptr)
-{
- return boost::weak_ptr<T>(ptr);
-}
-
-#endif /* ! defined(LL_LLEVENTS_H) */
+/**
+ * @file llevents.h
+ * @author Kent Quirk, Nat Goodspeed
+ * @date 2008-09-11
+ * @brief This is an implementation of the event system described at
+ * https://wiki.lindenlab.com/wiki/Viewer:Messaging/Event_System,
+ * originally introduced in llnotifications.h. It has nothing
+ * whatsoever to do with the older system in llevent.h.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * Copyright (c) 2008, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTS_H)
+#define LL_LLEVENTS_H
+
+#include <string>
+#include <map>
+#include <set>
+#include <vector>
+#include <deque>
+#include <stdexcept>
+#if LL_WINDOWS
+ #pragma warning (push)
+ #pragma warning (disable : 4263) // boost::signals2::expired_slot::what() has const mismatch
+ #pragma warning (disable : 4264)
+#endif
+#include <boost/signals2.hpp>
+#if LL_WINDOWS
+ #pragma warning (pop)
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/utility.hpp> // noncopyable
+#include <boost/optional/optional.hpp>
+#include <boost/visit_each.hpp>
+#include <boost/ref.hpp> // reference_wrapper
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/function.hpp>
+#include <boost/static_assert.hpp>
+#include "llsd.h"
+#include "llsingleton.h"
+#include "lldependencies.h"
+#include "ll_template_cast.h"
+
+/*==========================================================================*|
+// override this to allow binding free functions with more parameters
+#ifndef LLEVENTS_LISTENER_ARITY
+#define LLEVENTS_LISTENER_ARITY 10
+#endif
+|*==========================================================================*/
+
+// hack for testing
+#ifndef testable
+#define testable private
+#endif
+
+/*****************************************************************************
+* Signal and handler declarations
+* Using a single handler signature means that we can have a common handler
+* type, rather than needing a distinct one for each different handler.
+*****************************************************************************/
+
+/**
+ * A boost::signals Combiner that stops the first time a handler returns true
+ * We need this because we want to have our handlers return bool, so that
+ * we have the option to cause a handler to stop further processing. The
+ * default handler fails when the signal returns a value but has no slots.
+ */
+struct LLStopWhenHandled
+{
+ typedef bool result_type;
+
+ template<typename InputIterator>
+ result_type operator()(InputIterator first, InputIterator last) const
+ {
+ for (InputIterator si = first; si != last; ++si)
+ {
+ if (*si)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+};
+
+/**
+ * We want to have a standard signature for all signals; this way,
+ * we can easily document a protocol for communicating across
+ * dlls and into scripting languages someday.
+ *
+ * We want to return a bool to indicate whether the signal has been
+ * handled and should NOT be passed on to other listeners.
+ * Return true to stop further handling of the signal, and false
+ * to continue.
+ *
+ * We take an LLSD because this way the contents of the signal
+ * are independent of the API used to communicate it.
+ * It is const ref because then there's low cost to pass it;
+ * if you only need to inspect it, it's very cheap.
+ *
+ * @internal
+ * The @c float template parameter indicates that we will internally use @c
+ * float to indicate relative listener order on a given LLStandardSignal.
+ * Don't worry, the @c float values are strictly internal! They are not part
+ * of the interface, for the excellent reason that requiring the caller to
+ * specify a numeric key to establish order means that the caller must know
+ * the universe of possible values. We use LLDependencies for that instead.
+ */
+typedef boost::signals2::signal<bool(const LLSD&), LLStopWhenHandled, float> LLStandardSignal;
+/// Methods that forward listeners (e.g. constructed with
+/// <tt>boost::bind()</tt>) should accept (const LLEventListener&)
+typedef LLStandardSignal::slot_type LLEventListener;
+/// Result of registering a listener, supports <tt>connected()</tt>,
+/// <tt>disconnect()</tt> and <tt>blocked()</tt>
+typedef boost::signals2::connection LLBoundListener;
+/// Storing an LLBoundListener in LLTempBoundListener will disconnect the
+/// referenced listener when the LLTempBoundListener instance is destroyed.
+typedef boost::signals2::scoped_connection LLTempBoundListener;
+
+/**
+ * A common idiom for event-based code is to accept either a callable --
+ * directly called on completion -- or the string name of an LLEventPump on
+ * which to post the completion event. Specifying a parameter as <tt>const
+ * LLListenerOrPumpName&</tt> allows either.
+ *
+ * Calling a validly-constructed LLListenerOrPumpName, passing the LLSD
+ * 'event' object, either calls the callable or posts the event to the named
+ * LLEventPump.
+ *
+ * A default-constructed LLListenerOrPumpName is 'empty'. (This is useful as
+ * the default value of an optional method parameter.) Calling it throws
+ * LLListenerOrPumpName::Empty. Test for this condition beforehand using
+ * either <tt>if (param)</tt> or <tt>if (! param)</tt>.
+ */
+class LL_COMMON_API LLListenerOrPumpName
+{
+public:
+ /// passing string name of LLEventPump
+ LLListenerOrPumpName(const std::string& pumpname);
+ /// passing string literal (overload so compiler isn't forced to infer
+ /// double conversion)
+ LLListenerOrPumpName(const char* pumpname);
+ /// passing listener -- the "anything else" catch-all case. The type of an
+ /// object constructed by boost::bind() isn't intended to be written out.
+ /// Normally we'd just accept 'const LLEventListener&', but that would
+ /// require double implicit conversion: boost::bind() object to
+ /// LLEventListener, LLEventListener to LLListenerOrPumpName. So use a
+ /// template to forward anything.
+ template<typename T>
+ LLListenerOrPumpName(const T& listener): mListener(listener) {}
+
+ /// for omitted method parameter: uninitialized mListener
+ LLListenerOrPumpName() {}
+
+ /// test for validity
+ operator bool() const { return bool(mListener); }
+ bool operator! () const { return ! mListener; }
+
+ /// explicit accessor
+ const LLEventListener& getListener() const { return *mListener; }
+
+ /// implicit conversion to LLEventListener
+ operator LLEventListener() const { return *mListener; }
+
+ /// allow calling directly
+ bool operator()(const LLSD& event) const;
+
+ /// exception if you try to call when empty
+ struct Empty: public std::runtime_error
+ {
+ Empty(const std::string& what):
+ std::runtime_error(std::string("LLListenerOrPumpName::Empty: ") + what) {}
+ };
+
+private:
+ boost::optional<LLEventListener> mListener;
+};
+
+/*****************************************************************************
+* LLEventPumps
+*****************************************************************************/
+class LLEventPump;
+
+/**
+ * LLEventPumps is a Singleton manager through which one typically accesses
+ * this subsystem.
+ */
+class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
+{
+ friend class LLSingleton<LLEventPumps>;
+public:
+ /**
+ * Find or create an LLEventPump instance with a specific name. We return
+ * a reference so there's no question about ownership. obtain() @em finds
+ * an instance without conferring @em ownership.
+ */
+ LLEventPump& obtain(const std::string& name);
+ /**
+ * Flush all known LLEventPump instances
+ */
+ void flush();
+
+ /**
+ * Reset all known LLEventPump instances
+ * workaround for DEV-35406 crash on shutdown
+ */
+ void reset();
+
+private:
+ friend class LLEventPump;
+ /**
+ * Register a new LLEventPump instance (internal)
+ */
+ std::string registerNew(const LLEventPump&, const std::string& name, bool tweak);
+ /**
+ * Unregister a doomed LLEventPump instance (internal)
+ */
+ void unregister(const LLEventPump&);
+
+private:
+ LLEventPumps();
+ ~LLEventPumps();
+
+testable:
+ // Map of all known LLEventPump instances, whether or not we instantiated
+ // them. We store a plain old LLEventPump* because this map doesn't claim
+ // ownership of the instances. Though the common usage pattern is to
+ // request an instance using obtain(), it's fair to instantiate an
+ // LLEventPump subclass statically, as a class member, on the stack or on
+ // the heap. In such cases, the instantiating party is responsible for its
+ // lifespan.
+ typedef std::map<std::string, LLEventPump*> PumpMap;
+ PumpMap mPumpMap;
+ // Set of all LLEventPumps we instantiated. Membership in this set means
+ // we claim ownership, and will delete them when this LLEventPumps is
+ // destroyed.
+ typedef std::set<LLEventPump*> PumpSet;
+ PumpSet mOurPumps;
+ // LLEventPump names that should be instantiated as LLEventQueue rather
+ // than as LLEventStream
+ typedef std::set<std::string> PumpNames;
+ PumpNames mQueueNames;
+};
+
+/*****************************************************************************
+* details
+*****************************************************************************/
+namespace LLEventDetail
+{
+ /// Any callable capable of connecting an LLEventListener to an
+ /// LLStandardSignal to produce an LLBoundListener can be mapped to this
+ /// signature.
+ typedef boost::function<LLBoundListener(const LLEventListener&)> ConnectFunc;
+
+ /// overload of visit_and_connect() when we have a string identifier available
+ template <typename LISTENER>
+ LLBoundListener visit_and_connect(const std::string& name,
+ const LISTENER& listener,
+ const ConnectFunc& connect_func);
+ /**
+ * Utility template function to use Visitor appropriately
+ *
+ * @param listener Callable to connect, typically a boost::bind()
+ * expression. This will be visited by Visitor using boost::visit_each().
+ * @param connect_func Callable that will connect() @a listener to an
+ * LLStandardSignal, returning LLBoundListener.
+ */
+ template <typename LISTENER>
+ LLBoundListener visit_and_connect(const LISTENER& listener,
+ const ConnectFunc& connect_func)
+ {
+ return visit_and_connect("", listener, connect_func);
+ }
+} // namespace LLEventDetail
+
+/*****************************************************************************
+* LLEventTrackable
+*****************************************************************************/
+/**
+ * LLEventTrackable wraps boost::signals2::trackable, which resembles
+ * boost::trackable. Derive your listener class from LLEventTrackable instead,
+ * and use something like
+ * <tt>LLEventPump::listen(boost::bind(&YourTrackableSubclass::method,
+ * instance, _1))</tt>. This will implicitly disconnect when the object
+ * referenced by @c instance is destroyed.
+ *
+ * @note
+ * LLEventTrackable doesn't address a couple of cases:
+ * * Object destroyed during call
+ * - You enter a slot call in thread A.
+ * - Thread B destroys the object, which of course disconnects it from any
+ * future slot calls.
+ * - Thread A's call uses 'this', which now refers to a defunct object.
+ * Undefined behavior results.
+ * * Call during destruction
+ * - @c MySubclass is derived from LLEventTrackable.
+ * - @c MySubclass registers one of its own methods using
+ * <tt>LLEventPump::listen()</tt>.
+ * - The @c MySubclass object begins destruction. <tt>~MySubclass()</tt>
+ * runs, destroying state specific to the subclass. (For instance, a
+ * <tt>Foo*</tt> data member is <tt>delete</tt>d but not zeroed.)
+ * - The listening method will not be disconnected until
+ * <tt>~LLEventTrackable()</tt> runs.
+ * - Before we get there, another thread posts data to the @c LLEventPump
+ * instance, calling the @c MySubclass method.
+ * - The method in question relies on valid @c MySubclass state. (For
+ * instance, it attempts to dereference the <tt>Foo*</tt> pointer that was
+ * <tt>delete</tt>d but not zeroed.)
+ * - Undefined behavior results.
+ * If you suspect you may encounter any such scenario, you're better off
+ * managing the lifespan of your object with <tt>boost::shared_ptr</tt>.
+ * Passing <tt>LLEventPump::listen()</tt> a <tt>boost::bind()</tt> expression
+ * involving a <tt>boost::weak_ptr<Foo></tt> is recognized specially, engaging
+ * thread-safe Boost.Signals2 machinery.
+ */
+typedef boost::signals2::trackable LLEventTrackable;
+
+/*****************************************************************************
+* LLEventPump
+*****************************************************************************/
+/**
+ * LLEventPump is the base class interface through which we access the
+ * concrete subclasses LLEventStream and LLEventQueue.
+ *
+ * @NOTE
+ * LLEventPump derives from LLEventTrackable so that when you "chain"
+ * LLEventPump instances together, they will automatically disconnect on
+ * destruction. Please see LLEventTrackable documentation for situations in
+ * which this may be perilous across threads.
+ */
+class LL_COMMON_API LLEventPump: public LLEventTrackable
+{
+public:
+ /**
+ * Exception thrown by LLEventPump(). You are trying to instantiate an
+ * LLEventPump (subclass) using the same name as some other instance, and
+ * you didn't pass <tt>tweak=true</tt> to permit it to generate a unique
+ * variant.
+ */
+ struct DupPumpName: public std::runtime_error
+ {
+ DupPumpName(const std::string& what):
+ std::runtime_error(std::string("DupPumpName: ") + what) {}
+ };
+
+ /**
+ * Instantiate an LLEventPump (subclass) with the string name by which it
+ * can be found using LLEventPumps::obtain().
+ *
+ * If you pass (or default) @a tweak to @c false, then a duplicate name
+ * will throw DupPumpName. This won't happen if LLEventPumps::obtain()
+ * instantiates the LLEventPump, because obtain() uses find-or-create
+ * logic. It can only happen if you instantiate an LLEventPump in your own
+ * code -- and a collision with the name of some other LLEventPump is
+ * likely to cause much more subtle problems!
+ *
+ * When you hand-instantiate an LLEventPump, consider passing @a tweak as
+ * @c true. This directs LLEventPump() to append a suffix to the passed @a
+ * name to make it unique. You can retrieve the adjusted name by calling
+ * getName() on your new instance.
+ */
+ LLEventPump(const std::string& name, bool tweak=false);
+ virtual ~LLEventPump();
+
+ /// group exceptions thrown by listen(). We use exceptions because these
+ /// particular errors are likely to be coding errors, found and fixed by
+ /// the developer even before preliminary checkin.
+ struct ListenError: public std::runtime_error
+ {
+ ListenError(const std::string& what): std::runtime_error(what) {}
+ };
+ /**
+ * exception thrown by listen(). You are attempting to register a
+ * listener on this LLEventPump using the same listener name as an
+ * already-registered listener.
+ */
+ struct DupListenerName: public ListenError
+ {
+ DupListenerName(const std::string& what):
+ ListenError(std::string("DupListenerName: ") + what)
+ {}
+ };
+ /**
+ * exception thrown by listen(). The order dependencies specified for your
+ * listener are incompatible with existing listeners.
+ *
+ * Consider listener "a" which specifies before "b" and "b" which
+ * specifies before "c". You are now attempting to register "c" before
+ * "a". There is no order that can satisfy all constraints.
+ */
+ struct Cycle: public ListenError
+ {
+ Cycle(const std::string& what): ListenError(std::string("Cycle: ") + what) {}
+ };
+ /**
+ * exception thrown by listen(). This one means that your new listener
+ * would force a change to the order of previously-registered listeners,
+ * and we don't have a good way to implement that.
+ *
+ * Consider listeners "some", "other" and "third". "some" and "other" are
+ * registered earlier without specifying relative order, so "other"
+ * happens to be first. Now you attempt to register "third" after "some"
+ * and before "other". Whoops, that would require swapping "some" and
+ * "other", which we can't do. Instead we throw this exception.
+ *
+ * It may not be possible to change the registration order so we already
+ * know "third"s order requirement by the time we register the second of
+ * "some" and "other". A solution would be to specify that "some" must
+ * come before "other", or equivalently that "other" must come after
+ * "some".
+ */
+ struct OrderChange: public ListenError
+ {
+ OrderChange(const std::string& what): ListenError(std::string("OrderChange: ") + what) {}
+ };
+
+ /// used by listen()
+ typedef std::vector<std::string> NameList;
+ /// convenience placeholder for when you explicitly want to pass an empty
+ /// NameList
+ const static NameList empty;
+
+ /// Get this LLEventPump's name
+ std::string getName() const { return mName; }
+
+ /**
+ * Register a new listener with a unique name. Specify an optional list
+ * of other listener names after which this one must be called, likewise
+ * an optional list of other listener names before which this one must be
+ * called. The other listeners mentioned need not yet be registered
+ * themselves. listen() can throw any ListenError; see ListenError
+ * subclasses.
+ *
+ * The listener name must be unique among active listeners for this
+ * LLEventPump, else you get DupListenerName. If you don't care to invent
+ * a name yourself, use inventName(). (I was tempted to recognize e.g. ""
+ * and internally generate a distinct name for that case. But that would
+ * handle badly the scenario in which you want to add, remove, re-add,
+ * etc. the same listener: each new listen() call would necessarily
+ * perform a new dependency sort. Assuming you specify the same
+ * after/before lists each time, using inventName() when you first
+ * instantiate your listener, then passing the same name on each listen()
+ * call, allows us to optimize away the second and subsequent dependency
+ * sorts.
+ *
+ * If (as is typical) you pass a <tt>boost::bind()</tt> expression as @a
+ * listener, listen() will inspect the components of that expression. If a
+ * bound object matches any of several cases, the connection will
+ * automatically be disconnected when that object is destroyed.
+ *
+ * * You bind a <tt>boost::weak_ptr</tt>.
+ * * Binding a <tt>boost::shared_ptr</tt> that way would ensure that the
+ * referenced object would @em never be destroyed, since the @c
+ * shared_ptr stored in the LLEventPump would remain an outstanding
+ * reference. Use the weaken() function to convert your @c shared_ptr to
+ * @c weak_ptr. Because this is easy to forget, binding a @c shared_ptr
+ * will produce a compile error (@c BOOST_STATIC_ASSERT failure).
+ * * You bind a simple pointer or reference to an object derived from
+ * <tt>boost::enable_shared_from_this</tt>. (UNDER CONSTRUCTION)
+ * * You bind a simple pointer or reference to an object derived from
+ * LLEventTrackable. Unlike the cases described above, though, this is
+ * vulnerable to a couple of cross-thread race conditions, as described
+ * in the LLEventTrackable documentation.
+ */
+ template <typename LISTENER>
+ LLBoundListener listen(const std::string& name, const LISTENER& listener,
+ const NameList& after=NameList(),
+ const NameList& before=NameList())
+ {
+ // Examine listener, using our listen_impl() method to make the
+ // actual connection.
+ // This is why listen() is a template. Conversion from boost::bind()
+ // to LLEventListener performs type erasure, so it's important to look
+ // at the boost::bind object itself before that happens.
+ return LLEventDetail::visit_and_connect(name,
+ listener,
+ boost::bind(&LLEventPump::listen_impl,
+ this,
+ name,
+ _1,
+ after,
+ before));
+ }
+
+ /// Get the LLBoundListener associated with the passed name (dummy
+ /// LLBoundListener if not found)
+ virtual LLBoundListener getListener(const std::string& name) const;
+ /**
+ * Instantiate one of these to block an existing connection:
+ * @code
+ * { // in some local scope
+ * LLEventPump::Blocker block(someLLBoundListener);
+ * // code that needs the connection blocked
+ * } // unblock the connection again
+ * @endcode
+ */
+ typedef boost::signals2::shared_connection_block Blocker;
+ /// Unregister a listener by name. Prefer this to
+ /// <tt>getListener(name).disconnect()</tt> because stopListening() also
+ /// forgets this name.
+ virtual void stopListening(const std::string& name);
+ /// Post an event to all listeners. The @c bool return is only meaningful
+ /// if the underlying leaf class is LLEventStream -- beware of relying on
+ /// it too much! Truthfully, we return @c bool mostly to permit chaining
+ /// one LLEventPump as a listener on another.
+ virtual bool post(const LLSD&) = 0;
+ /// Enable/disable: while disabled, silently ignore all post() calls
+ virtual void enable(bool enabled=true) { mEnabled = enabled; }
+ /// query
+ virtual bool enabled() const { return mEnabled; }
+
+ /// Generate a distinct name for a listener -- see listen()
+ static std::string inventName(const std::string& pfx="listener");
+
+private:
+ friend class LLEventPumps;
+ /// flush queued events
+ virtual void flush() {}
+
+ virtual void reset();
+
+private:
+ virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
+ const NameList& after,
+ const NameList& before);
+ std::string mName;
+
+protected:
+ /// implement the dispatching
+ boost::shared_ptr<LLStandardSignal> mSignal;
+
+ /// valve open?
+ bool mEnabled;
+ /// Map of named listeners. This tracks the listeners that actually exist
+ /// at this moment. When we stopListening(), we discard the entry from
+ /// this map.
+ typedef std::map<std::string, boost::signals2::connection> ConnectionMap;
+ ConnectionMap mConnections;
+ typedef LLDependencies<std::string, float> DependencyMap;
+ /// Dependencies between listeners. For each listener, track the float
+ /// used to establish its place in mSignal's order. This caches all the
+ /// listeners that have ever registered; stopListening() does not discard
+ /// the entry from this map. This is to avoid a new dependency sort if the
+ /// same listener with the same dependencies keeps hopping on and off this
+ /// LLEventPump.
+ DependencyMap mDeps;
+};
+
+/*****************************************************************************
+* LLEventStream
+*****************************************************************************/
+/**
+ * LLEventStream is a thin wrapper around LLStandardSignal. Posting an
+ * event immediately calls all registered listeners.
+ */
+class LL_COMMON_API LLEventStream: public LLEventPump
+{
+public:
+ LLEventStream(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+ virtual ~LLEventStream() {}
+
+ /// Post an event to all listeners
+ virtual bool post(const LLSD& event);
+};
+
+/*****************************************************************************
+* LLEventQueue
+*****************************************************************************/
+/**
+ * LLEventQueue isa LLEventPump whose post() method defers calling registered
+ * listeners until flush() is called.
+ */
+class LL_COMMON_API LLEventQueue: public LLEventPump
+{
+public:
+ LLEventQueue(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+ virtual ~LLEventQueue() {}
+
+ /// Post an event to all listeners
+ virtual bool post(const LLSD& event);
+
+private:
+ /// flush queued events
+ virtual void flush();
+
+private:
+ typedef std::deque<LLSD> EventQueue;
+ EventQueue mEventQueue;
+};
+
+/*****************************************************************************
+* LLReqID
+*****************************************************************************/
+/**
+ * This class helps the implementer of a given event API to honor the
+ * ["reqid"] convention. By this convention, each event API stamps into its
+ * response LLSD a ["reqid"] key whose value echoes the ["reqid"] value, if
+ * any, from the corresponding request.
+ *
+ * This supports an (atypical, but occasionally necessary) use case in which
+ * two or more asynchronous requests are multiplexed onto the same ["reply"]
+ * LLEventPump. Since the response events could arrive in arbitrary order, the
+ * caller must be able to demux them. It does so by matching the ["reqid"]
+ * value in each response with the ["reqid"] value in the corresponding
+ * request.
+ *
+ * It is the caller's responsibility to ensure distinct ["reqid"] values for
+ * that case. Though LLSD::UUID is guaranteed to work, it might be overkill:
+ * the "namespace" of unique ["reqid"] values is simply the set of requests
+ * specifying the same ["reply"] LLEventPump name.
+ *
+ * Making a given event API echo the request's ["reqid"] into the response is
+ * nearly trivial. This helper is mostly for mnemonic purposes, to serve as a
+ * place to put these comments. We hope that each time a coder implements a
+ * new event API based on some existing one, s/he will say, "Huh, what's an
+ * LLReqID?" and look up this material.
+ *
+ * The hardest part about the convention is deciding where to store the
+ * ["reqid"] value. Ironically, LLReqID can't help with that: you must store
+ * an LLReqID instance in whatever storage will persist until the reply is
+ * sent. For example, if the request ultimately ends up using a Responder
+ * subclass, storing an LLReqID instance in the Responder works.
+ *
+ * @note
+ * The @em implementer of an event API must honor the ["reqid"] convention.
+ * However, the @em caller of an event API need only use it if s/he is sharing
+ * the same ["reply"] LLEventPump for two or more asynchronous event API
+ * requests.
+ *
+ * In most cases, it's far easier for the caller to instantiate a local
+ * LLEventStream and pass its name to the event API in question. Then it's
+ * perfectly reasonable not to set a ["reqid"] key in the request, ignoring
+ * the @c isUndefined() ["reqid"] value in the response.
+ */
+class LL_COMMON_API LLReqID
+{
+public:
+ /**
+ * If you have the request in hand at the time you instantiate the
+ * LLReqID, pass that request to extract its ["reqid"].
+ */
+ LLReqID(const LLSD& request):
+ mReqid(request["reqid"])
+ {}
+ /// If you don't yet have the request, use setFrom() later.
+ LLReqID() {}
+
+ /// Extract and store the ["reqid"] value from an incoming request.
+ void setFrom(const LLSD& request)
+ {
+ mReqid = request["reqid"];
+ }
+
+ /// Set ["reqid"] key into a pending response LLSD object.
+ void stamp(LLSD& response) const;
+
+ /// Make a whole new response LLSD object with our ["reqid"].
+ LLSD makeResponse() const
+ {
+ LLSD response;
+ stamp(response);
+ return response;
+ }
+
+ /// Not really sure of a use case for this accessor...
+ LLSD getReqID() const { return mReqid; }
+
+private:
+ LLSD mReqid;
+};
+
+/**
+ * Base class for LLListenerWrapper. See visit_and_connect() and llwrap(). We
+ * provide virtual @c accept_xxx() methods, customization points allowing a
+ * subclass access to certain data visible at LLEventPump::listen() time.
+ * Example subclass usage:
+ *
+ * @code
+ * myEventPump.listen("somename",
+ * llwrap<MyListenerWrapper>(boost::bind(&MyClass::method, instance, _1)));
+ * @endcode
+ *
+ * Because of the anticipated usage (note the anonymous temporary
+ * MyListenerWrapper instance in the example above), the @c accept_xxx()
+ * methods must be @c const.
+ */
+class LL_COMMON_API LLListenerWrapperBase
+{
+public:
+ /// New instance. The accept_xxx() machinery makes it important to use
+ /// shared_ptrs for our data. Many copies of this object are made before
+ /// the instance that actually ends up in the signal, yet accept_xxx()
+ /// will later be called on the @em original instance. All copies of the
+ /// same original instance must share the same data.
+ LLListenerWrapperBase():
+ mName(new std::string),
+ mConnection(new LLBoundListener)
+ {
+ }
+
+ /// Copy constructor. Copy shared_ptrs to original instance data.
+ LLListenerWrapperBase(const LLListenerWrapperBase& that):
+ mName(that.mName),
+ mConnection(that.mConnection)
+ {
+ }
+ virtual ~LLListenerWrapperBase() {}
+
+ /// Ask LLEventPump::listen() for the listener name
+ virtual void accept_name(const std::string& name) const
+ {
+ *mName = name;
+ }
+
+ /// Ask LLEventPump::listen() for the new connection
+ virtual void accept_connection(const LLBoundListener& connection) const
+ {
+ *mConnection = connection;
+ }
+
+protected:
+ /// Listener name.
+ boost::shared_ptr<std::string> mName;
+ /// Connection.
+ boost::shared_ptr<LLBoundListener> mConnection;
+};
+
+/*****************************************************************************
+* Underpinnings
+*****************************************************************************/
+/**
+ * We originally provided a suite of overloaded
+ * LLEventTrackable::listenTo(LLEventPump&, ...) methods that would call
+ * LLEventPump::listen(...) and then pass the returned LLBoundListener to
+ * LLEventTrackable::track(). This was workable but error-prone: the coder
+ * must remember to call listenTo() rather than the more straightforward
+ * listen() method.
+ *
+ * Now we publish only the single canonical listen() method, so there's a
+ * uniform mechanism. Having a single way to do this is good, in that there's
+ * no question in the coder's mind which of several alternatives to choose.
+ *
+ * To support automatic connection management, we use boost::visit_each
+ * (http://www.boost.org/doc/libs/1_37_0/doc/html/boost/visit_each.html) to
+ * inspect each argument of a boost::bind expression. (Although the visit_each
+ * mechanism was first introduced with the original Boost.Signals library, it
+ * was only later documented.)
+ *
+ * Cases:
+ * * At least one of the function's arguments is a boost::weak_ptr<T>. Pass
+ * the corresponding shared_ptr to slot_type::track(). Ideally that would be
+ * the object whose method we want to call, but in fact we do the same for
+ * any weak_ptr we might find among the bound arguments. If we're passing
+ * our bound method a weak_ptr to some object, wouldn't the destruction of
+ * that object invalidate the call? So we disconnect automatically when any
+ * such object is destroyed. This is the mechanism preferred by boost::
+ * signals2.
+ * * One of the functions's arguments is a boost::shared_ptr<T>. This produces
+ * a compile error: the bound copy of the shared_ptr stored in the
+ * boost_bind object stored in the signal object would make the referenced
+ * T object immortal. We provide a weaken() function. Pass
+ * weaken(your_shared_ptr) instead. (We can inspect, but not modify, the
+ * boost::bind object. Otherwise we'd replace the shared_ptr with weak_ptr
+ * implicitly and just proceed.)
+ * * One of the function's arguments is a plain pointer/reference to an object
+ * derived from boost::enable_shared_from_this. We assume that this object
+ * is managed using boost::shared_ptr, so we implicitly extract a shared_ptr
+ * and track that. (UNDER CONSTRUCTION)
+ * * One of the function's arguments is derived from LLEventTrackable. Pass
+ * the LLBoundListener to its LLEventTrackable::track(). This is vulnerable
+ * to a couple different race conditions, as described in LLEventTrackable
+ * documentation. (NOTE: Now that LLEventTrackable is a typedef for
+ * boost::signals2::trackable, the Signals2 library handles this itself, so
+ * our visitor needs no special logic for this case.)
+ * * Any other argument type is irrelevant to automatic connection management.
+ */
+
+namespace LLEventDetail
+{
+ template <typename F>
+ const F& unwrap(const F& f) { return f; }
+
+ template <typename F>
+ const F& unwrap(const boost::reference_wrapper<F>& f) { return f.get(); }
+
+ // Most of the following is lifted from the Boost.Signals use of
+ // visit_each.
+ template<bool Cond> struct truth {};
+
+ /**
+ * boost::visit_each() Visitor, used on a template argument <tt>const F&
+ * f</tt> as follows (see visit_and_connect()):
+ * @code
+ * LLEventListener listener(f);
+ * Visitor visitor(listener); // bind listener so it can track() shared_ptrs
+ * using boost::visit_each; // allow unqualified visit_each() call for ADL
+ * visit_each(visitor, unwrap(f));
+ * @endcode
+ */
+ class Visitor
+ {
+ public:
+ /**
+ * Visitor binds a reference to LLEventListener so we can track() any
+ * shared_ptrs we find in the argument list.
+ */
+ Visitor(LLEventListener& listener):
+ mListener(listener)
+ {
+ }
+
+ /**
+ * boost::visit_each() calls this method for each component of a
+ * boost::bind() expression.
+ */
+ template <typename T>
+ void operator()(const T& t) const
+ {
+ decode(t, 0);
+ }
+
+ private:
+ // decode() decides between a reference wrapper and anything else
+ // boost::ref() variant
+ template<typename T>
+ void decode(const boost::reference_wrapper<T>& t, int) const
+ {
+// add_if_trackable(t.get_pointer());
+ }
+
+ // decode() anything else
+ template<typename T>
+ void decode(const T& t, long) const
+ {
+ typedef truth<(boost::is_pointer<T>::value)> is_a_pointer;
+ maybe_get_pointer(t, is_a_pointer());
+ }
+
+ // maybe_get_pointer() decides between a pointer and a non-pointer
+ // plain pointer variant
+ template<typename T>
+ void maybe_get_pointer(const T& t, truth<true>) const
+ {
+// add_if_trackable(t);
+ }
+
+ // shared_ptr variant
+ template<typename T>
+ void maybe_get_pointer(const boost::shared_ptr<T>& t, truth<false>) const
+ {
+ // If we have a shared_ptr to this object, it doesn't matter
+ // whether the object is derived from LLEventTrackable, so no
+ // further analysis of T is needed.
+// mListener.track(t);
+
+ // Make this case illegal. Passing a bound shared_ptr to
+ // slot_type::track() is useless, since the bound shared_ptr will
+ // keep the object alive anyway! Force the coder to cast to weak_ptr.
+
+ // Trivial as it is, make the BOOST_STATIC_ASSERT() condition
+ // dependent on template param so the macro is only evaluated if
+ // this method is in fact instantiated, as described here:
+ // http://www.boost.org/doc/libs/1_34_1/doc/html/boost_staticassert.html
+
+ // ATTENTION: Don't bind a shared_ptr<anything> using
+ // LLEventPump::listen(boost::bind()). Doing so captures a copy of
+ // the shared_ptr, making the referenced object effectively
+ // immortal. Use the weaken() function, e.g.:
+ // somepump.listen(boost::bind(...weaken(my_shared_ptr)...));
+ // This lets us automatically disconnect when the referenced
+ // object is destroyed.
+ BOOST_STATIC_ASSERT(sizeof(T) == 0);
+ }
+
+ // weak_ptr variant
+ template<typename T>
+ void maybe_get_pointer(const boost::weak_ptr<T>& t, truth<false>) const
+ {
+ // If we have a weak_ptr to this object, it doesn't matter
+ // whether the object is derived from LLEventTrackable, so no
+ // further analysis of T is needed.
+ mListener.track(t);
+// std::cout << "Found weak_ptr<" << typeid(T).name() << ">!\n";
+ }
+
+#if 0
+ // reference to anything derived from boost::enable_shared_from_this
+ template <typename T>
+ inline void maybe_get_pointer(const boost::enable_shared_from_this<T>& ct,
+ truth<false>) const
+ {
+ // Use the slot_type::track(shared_ptr) mechanism. Cast away
+ // const-ness because (in our code base anyway) it's unusual
+ // to find shared_ptr<const T>.
+ boost::enable_shared_from_this<T>&
+ t(const_cast<boost::enable_shared_from_this<T>&>(ct));
+ std::cout << "Capturing shared_from_this()" << std::endl;
+ boost::shared_ptr<T> sp(t.shared_from_this());
+/*==========================================================================*|
+ std::cout << "Capturing weak_ptr" << std::endl;
+ boost::weak_ptr<T> wp(sp);
+|*==========================================================================*/
+ std::cout << "Tracking shared__ptr" << std::endl;
+ mListener.track(sp);
+ }
+#endif
+
+ // non-pointer variant
+ template<typename T>
+ void maybe_get_pointer(const T& t, truth<false>) const
+ {
+ // Take the address of this object, because the object itself may be
+ // trackable
+// add_if_trackable(boost::addressof(t));
+ }
+
+/*==========================================================================*|
+ // add_if_trackable() adds LLEventTrackable objects to mTrackables
+ inline void add_if_trackable(const LLEventTrackable* t) const
+ {
+ if (t)
+ {
+ }
+ }
+
+ // pointer to anything not an LLEventTrackable subclass
+ inline void add_if_trackable(const void*) const
+ {
+ }
+
+ // pointer to free function
+ // The following construct uses the preprocessor to generate
+ // add_if_trackable() overloads accepting pointer-to-function taking
+ // 0, 1, ..., LLEVENTS_LISTENER_ARITY parameters of arbitrary type.
+#define BOOST_PP_LOCAL_MACRO(n) \
+ template <typename R \
+ BOOST_PP_COMMA_IF(n) \
+ BOOST_PP_ENUM_PARAMS(n, typename T)> \
+ inline void \
+ add_if_trackable(R (*)(BOOST_PP_ENUM_PARAMS(n, T))) const \
+ { \
+ }
+#define BOOST_PP_LOCAL_LIMITS (0, LLEVENTS_LISTENER_ARITY)
+#include BOOST_PP_LOCAL_ITERATE()
+#undef BOOST_PP_LOCAL_MACRO
+#undef BOOST_PP_LOCAL_LIMITS
+|*==========================================================================*/
+
+ /// Bind a reference to the LLEventListener to call its track() method.
+ LLEventListener& mListener;
+ };
+
+ /**
+ * Utility template function to use Visitor appropriately
+ *
+ * @param raw_listener Callable to connect, typically a boost::bind()
+ * expression. This will be visited by Visitor using boost::visit_each().
+ * @param connect_funct Callable that will connect() @a raw_listener to an
+ * LLStandardSignal, returning LLBoundListener.
+ */
+ template <typename LISTENER>
+ LLBoundListener visit_and_connect(const std::string& name,
+ const LISTENER& raw_listener,
+ const ConnectFunc& connect_func)
+ {
+ // Capture the listener
+ LLEventListener listener(raw_listener);
+ // Define our Visitor, binding the listener so we can call
+ // listener.track() if we discover any shared_ptr<Foo>.
+ LLEventDetail::Visitor visitor(listener);
+ // Allow unqualified visit_each() call for ADL
+ using boost::visit_each;
+ // Visit each component of a boost::bind() expression. Pass
+ // 'raw_listener', our template argument, rather than 'listener' from
+ // which type details have been erased. unwrap() comes from
+ // Boost.Signals, in case we were passed a boost::ref().
+ visit_each(visitor, LLEventDetail::unwrap(raw_listener));
+ // Make the connection using passed function.
+ LLBoundListener connection(connect_func(listener));
+ // If the LISTENER is an LLListenerWrapperBase subclass, pass it the
+ // desired information. It's important that we pass the raw_listener
+ // so the compiler can make decisions based on its original type.
+ const LLListenerWrapperBase* lwb =
+ ll_template_cast<const LLListenerWrapperBase*>(&raw_listener);
+ if (lwb)
+ {
+ lwb->accept_name(name);
+ lwb->accept_connection(connection);
+ }
+ // In any case, show new connection to caller.
+ return connection;
+ }
+} // namespace LLEventDetail
+
+// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
+// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
+// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
+// specialized for boost::weak_ptr. This remedies that omission.
+namespace boost
+{
+ template <typename T>
+ T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
+}
+
+/// Since we forbid use of listen(boost::bind(...shared_ptr<T>...)), provide an
+/// easy way to cast to the corresponding weak_ptr.
+template <typename T>
+boost::weak_ptr<T> weaken(const boost::shared_ptr<T>& ptr)
+{
+ return boost::weak_ptr<T>(ptr);
+}
+
+#endif /* ! defined(LL_LLEVENTS_H) */
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
new file mode 100644
index 0000000000..d44e7ec1e6
--- /dev/null
+++ b/indra/llcommon/lleventtimer.cpp
@@ -0,0 +1,95 @@
+/**
+ * @file lleventtimer.cpp
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lleventtimer.h"
+
+#include "u64.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// LLEventTimer Implementation
+//
+//////////////////////////////////////////////////////////////////////////////
+
+LLEventTimer::LLEventTimer(F32 period)
+: mEventTimer()
+{
+ mPeriod = period;
+}
+
+LLEventTimer::LLEventTimer(const LLDate& time)
+: mEventTimer()
+{
+ mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
+}
+
+
+LLEventTimer::~LLEventTimer()
+{
+}
+
+//static
+void LLEventTimer::updateClass()
+{
+ std::list<LLEventTimer*> completed_timers;
+
+ {
+ LLInstanceTrackerScopedGuard guard;
+ for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); )
+ {
+ LLEventTimer& timer = *iter++;
+ F32 et = timer.mEventTimer.getElapsedTimeF32();
+ if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+ timer.mEventTimer.reset();
+ if ( timer.tick() )
+ {
+ completed_timers.push_back( &timer );
+ }
+ }
+ }
+ }
+
+ if ( completed_timers.size() > 0 )
+ {
+ for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
+ completed_iter != completed_timers.end();
+ completed_iter++ )
+ {
+ delete *completed_iter;
+ }
+ }
+}
+
+
diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h
new file mode 100644
index 0000000000..5181cce52d
--- /dev/null
+++ b/indra/llcommon/lleventtimer.h
@@ -0,0 +1,60 @@
+/**
+ * @file lleventtimer.h
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_EVENTTIMER_H
+#define LL_EVENTTIMER_H
+
+#include "stdtypes.h"
+#include "lldate.h"
+#include "llinstancetracker.h"
+#include "lltimer.h"
+
+// class for scheduling a function to be called at a given frequency (approximate, inprecise)
+class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
+{
+public:
+ LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
+ LLEventTimer(const LLDate& time);
+ virtual ~LLEventTimer();
+
+ //function to be called at the supplied frequency
+ // Normally return FALSE; TRUE will delete the timer after the function returns.
+ virtual BOOL tick() = 0;
+
+ static void updateClass();
+
+protected:
+ LLTimer mEventTimer;
+ F32 mPeriod;
+};
+
+#endif //LL_EVENTTIMER_H
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 905d736d62..48461df6ae 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -1,317 +1,166 @@
-/**
- * @file llfasttimer.h
- * @brief Declaration of a fast timer.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_FASTTIMER_H
-#define LL_FASTTIMER_H
-
-#include "llinstancetracker.h"
-
-#define FAST_TIMER_ON 1
-
-#if LL_WINDOWS
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-inline U32 get_cpu_clock_count_32()
-{
- U32 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- shr eax,8
- shl edx,24
- or eax, edx
- mov dword ptr [ret_val], eax
- }
- return ret_val;
-}
-
-// return full timer value, still shifted by 8 bits
-inline U64 get_cpu_clock_count_64()
-{
- U64 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- mov eax,eax
- mov edx,edx
- mov dword ptr [ret_val+4], edx
- mov dword ptr [ret_val], eax
- }
- return ret_val >> 8;
-}
-
-#endif // LL_WINDOWS
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-inline U32 get_cpu_clock_count_32()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return (U32)x >> 8;
-}
-
-inline U32 get_cpu_clock_count_64()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return x >> 8;
-}
-#endif
-
-#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
-//
-// Mac PPC (deprecated) & Solaris SPARC implementation of CPU clock
-//
-// Just use gettimeofday implementation for now
-
-inline U32 get_cpu_clock_count_32()
-{
- return (U32)get_clock_count();
-}
-
-inline U32 get_cpu_clock_count_64()
-{
- return get_clock_count();
-}
-#endif
-
-class LLMutex;
-
-#include <queue>
-#include "llsd.h"
-
-
-class LL_COMMON_API LLFastTimer
-{
-public:
- // stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
- class LL_COMMON_API NamedTimer
- : public LLInstanceTracker<NamedTimer>
- {
- friend class DeclareTimer;
- public:
- ~NamedTimer();
-
- enum { HISTORY_NUM = 60 };
-
- const std::string& getName() const { return mName; }
- NamedTimer* getParent() const { return mParent; }
- void setParent(NamedTimer* parent);
- S32 getDepth();
- std::string getToolTip(S32 history_index = -1);
-
- typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
- child_const_iter beginChildren();
- child_const_iter endChildren();
- std::vector<NamedTimer*>& getChildren();
-
- void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
- bool getCollapsed() const { return mCollapsed; }
-
- U32 getCountAverage() const { return mCountAverage; }
- U32 getCallAverage() const { return mCallAverage; }
-
- U32 getHistoricalCount(S32 history_index = 0) const;
- U32 getHistoricalCalls(S32 history_index = 0) const;
-
- static NamedTimer& getRootNamedTimer();
-
- struct FrameState
- {
- FrameState(NamedTimer* timerp);
-
- U32 mSelfTimeCounter;
- U32 mCalls;
- FrameState* mParent; // info for caller timer
- FrameState* mLastCaller; // used to bootstrap tree construction
- NamedTimer* mTimer;
- U16 mActiveCount; // number of timers with this ID active on stack
- bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame
- };
-
- S32 getFrameStateIndex() const { return mFrameStateIndex; }
-
- FrameState& getFrameState() const;
-
-
- private:
- friend class LLFastTimer;
- friend class NamedTimerFactory;
-
- //
- // methods
- //
- NamedTimer(const std::string& name);
- // recursive call to gather total time from children
- static void accumulateTimings();
-
- // updates cumulative times and hierarchy,
- // can be called multiple times in a frame, at any point
- static void processTimes();
-
- static void buildHierarchy();
- static void resetFrame();
- static void reset();
-
-
- //
- // members
- //
- S32 mFrameStateIndex;
-
- std::string mName;
-
- U32 mTotalTimeCounter;
-
- U32 mCountAverage;
- U32 mCallAverage;
-
- U32* mCountHistory;
- U32* mCallHistory;
-
- // tree structure
- NamedTimer* mParent; // NamedTimer of caller(parent)
- std::vector<NamedTimer*> mChildren;
- bool mCollapsed; // don't show children
- bool mNeedsSorting; // sort children whenever child added
-
- };
-
- // used to statically declare a new named timer
- class LL_COMMON_API DeclareTimer
- : public LLInstanceTracker<DeclareTimer>
- {
- public:
- DeclareTimer(const std::string& name, bool open);
- DeclareTimer(const std::string& name);
-
- static void updateCachedPointers();
-
- // convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
- operator NamedTimer::FrameState&() { return *mFrameState; }
- private:
- NamedTimer& mTimer;
- NamedTimer::FrameState* mFrameState;
- };
-
-
-public:
- static LLMutex* sLogLock;
- static std::queue<LLSD> sLogQueue;
- static BOOL sLog;
- static BOOL sMetricLog;
-
- typedef std::vector<NamedTimer::FrameState> info_list_t;
- static info_list_t& getFrameStateList();
-
- enum RootTimerMarker { ROOT };
- LLFastTimer(RootTimerMarker);
-
- LLFastTimer(NamedTimer::FrameState& timer)
- : mFrameState(&timer)
- {
-#if FAST_TIMER_ON
- NamedTimer::FrameState* frame_state = &timer;
- U32 cur_time = get_cpu_clock_count_32();
- mStartSelfTime = cur_time;
- mStartTotalTime = cur_time;
-
- frame_state->mActiveCount++;
- frame_state->mCalls++;
- // keep current parent as long as it is active when we are
- frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
-
- mLastTimer = sCurTimer;
- sCurTimer = this;
-#endif
- }
-
- ~LLFastTimer()
- {
-#if FAST_TIMER_ON
- NamedTimer::FrameState* frame_state = mFrameState;
- U32 cur_time = get_cpu_clock_count_32();
- frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
-
- frame_state->mActiveCount--;
- LLFastTimer* last_timer = mLastTimer;
- sCurTimer = last_timer;
-
- // store last caller to bootstrap tree creation
- frame_state->mLastCaller = last_timer->mFrameState;
-
- // we are only tracking self time, so subtract our total time delta from parents
- U32 total_time = cur_time - mStartTotalTime;
- last_timer->mStartSelfTime += total_time;
-#endif
- }
-
-
- // call this once a frame to reset timers
- static void nextFrame();
-
- // dumps current cumulative frame stats to log
- // call nextFrame() to reset timers
- static void dumpCurTimes();
-
- // call this to reset timer hierarchy, averages, etc.
- static void reset();
-
- static U64 countsPerSecond();
- static S32 getLastFrameIndex() { return sLastFrameIndex; }
- static S32 getCurFrameIndex() { return sCurFrameIndex; }
-
- static void writeLog(std::ostream& os);
- static const NamedTimer* getTimerByName(const std::string& name);
-
-public:
- static bool sPauseHistory;
- static bool sResetHistory;
-
-private:
- typedef std::vector<LLFastTimer*> timer_stack_t;
- static LLFastTimer* sCurTimer;
- static S32 sCurFrameIndex;
- static S32 sLastFrameIndex;
- static U64 sLastFrameTime;
- static info_list_t* sTimerInfos;
-
- U32 mStartSelfTime; // start time + time of all child timers
- U32 mStartTotalTime; // start time + time of all child timers
- NamedTimer::FrameState* mFrameState;
- LLFastTimer* mLastTimer;
-};
-
-#endif // LL_LLFASTTIMER_H
+/**
+ * @file llfasttimer.h
+ * @brief Inline implementations of fast timers.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FASTTIMER_H
+#define LL_FASTTIMER_H
+
+// pull in the actual class definition
+#include "llfasttimer_class.h"
+
+#if LL_WINDOWS
+//
+// Windows implementation of CPU clock
+//
+
+//
+// NOTE: put back in when we aren't using platform sdk anymore
+//
+// because MS has different signatures for these functions in winnt.h
+// need to rename them to avoid conflicts
+//#define _interlockedbittestandset _renamed_interlockedbittestandset
+//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
+//#include <intrin.h>
+//#undef _interlockedbittestandset
+//#undef _interlockedbittestandreset
+
+//inline U32 LLFastTimer::getCPUClockCount32()
+//{
+// U64 time_stamp = __rdtsc();
+// return (U32)(time_stamp >> 8);
+//}
+//
+//// return full timer value, *not* shifted by 8 bits
+//inline U64 LLFastTimer::getCPUClockCount64()
+//{
+// return __rdtsc();
+//}
+
+// shift off lower 8 bits for lower resolution but longer term timing
+// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+inline U32 LLFastTimer::getCPUClockCount32()
+{
+ U32 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ shr eax,8
+ shl edx,24
+ or eax, edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+
+// return full timer value, *not* shifted by 8 bits
+inline U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ mov eax,eax
+ mov edx,edx
+ mov dword ptr [ret_val+4], edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+#endif
+
+
+#if LL_LINUX || LL_SOLARIS
+//
+// Linux and Solaris implementation of CPU clock - all architectures.
+//
+// Try to use the MONOTONIC clock if available, this is a constant time counter
+// with nanosecond resolution (but not necessarily accuracy) and attempts are made
+// to synchronize this value between cores at kernel start. It should not be affected
+// by CPU frequency. If not available use the REALTIME clock, but this may be affected by
+// NTP adjustments or other user activity affecting the system time.
+inline U64 LLFastTimer::getCPUClockCount64()
+{
+ struct timespec tp;
+
+#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
+ if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
+#endif
+ clock_gettime(CLOCK_REALTIME,&tp);
+
+ return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
+}
+
+inline U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
+}
+#endif // (LL_LINUX || LL_SOLARIS))
+
+
+#if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+//
+// Mac x86 implementation of CPU clock
+inline U32 LLFastTimer::getCPUClockCount32()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return (U32)(x >> 8);
+}
+
+inline U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return x;
+}
+#endif
+
+
+#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)))
+//
+// Mac PPC (deprecated) implementation of CPU clock
+//
+// Just use gettimeofday implementation for now
+
+inline U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(get_clock_count()>>8);
+}
+
+inline U64 LLFastTimer::getCPUClockCount64()
+{
+ return get_clock_count();
+}
+#endif
+
+#endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
new file mode 100644
index 0000000000..2e5edb1f3b
--- /dev/null
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -0,0 +1,768 @@
+/**
+ * @file llfasttimer_class.cpp
+ * @brief Implementation of the fast timer.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS."LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "llfasttimer.h"
+
+#include "llmemory.h"
+#include "llprocessor.h"
+#include "llsingleton.h"
+#include "lltreeiterators.h"
+#include "llsdserialize.h"
+
+#include <boost/bind.hpp>
+
+#if LL_WINDOWS
+#elif LL_LINUX || LL_SOLARIS
+#include <sys/time.h>
+#include <sched.h>
+#elif LL_DARWIN
+#include <sys/time.h>
+#include "lltimer.h" // get_clock_count()
+#else
+#error "architecture not supported"
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+// statics
+
+S32 LLFastTimer::sCurFrameIndex = -1;
+S32 LLFastTimer::sLastFrameIndex = -1;
+U64 LLFastTimer::sLastFrameTime = LLFastTimer::getCPUClockCount64();
+bool LLFastTimer::sPauseHistory = 0;
+bool LLFastTimer::sResetHistory = 0;
+LLFastTimer::CurTimerData LLFastTimer::sCurTimerData;
+BOOL LLFastTimer::sLog = FALSE;
+BOOL LLFastTimer::sMetricLog = FALSE;
+LLMutex* LLFastTimer::sLogLock = NULL;
+std::queue<LLSD> LLFastTimer::sLogQueue;
+
+#if LL_LINUX || LL_SOLARIS
+U64 LLFastTimer::sClockResolution = 1000000000; // Nanosecond resolution
+#else
+U64 LLFastTimer::sClockResolution = 1000000; // Microsecond resolution
+#endif
+
+std::vector<LLFastTimer::FrameState>* LLFastTimer::sTimerInfos = NULL;
+U64 LLFastTimer::sTimerCycles = 0;
+U32 LLFastTimer::sTimerCalls = 0;
+
+
+// FIXME: move these declarations to the relevant modules
+
+// helper functions
+typedef LLTreeDFSPostIter<LLFastTimer::NamedTimer, LLFastTimer::NamedTimer::child_const_iter> timer_tree_bottom_up_iterator_t;
+
+static timer_tree_bottom_up_iterator_t begin_timer_tree_bottom_up(LLFastTimer::NamedTimer& id)
+{
+ return timer_tree_bottom_up_iterator_t(&id,
+ boost::bind(boost::mem_fn(&LLFastTimer::NamedTimer::beginChildren), _1),
+ boost::bind(boost::mem_fn(&LLFastTimer::NamedTimer::endChildren), _1));
+}
+
+static timer_tree_bottom_up_iterator_t end_timer_tree_bottom_up()
+{
+ return timer_tree_bottom_up_iterator_t();
+}
+
+typedef LLTreeDFSIter<LLFastTimer::NamedTimer, LLFastTimer::NamedTimer::child_const_iter> timer_tree_dfs_iterator_t;
+
+
+static timer_tree_dfs_iterator_t begin_timer_tree(LLFastTimer::NamedTimer& id)
+{
+ return timer_tree_dfs_iterator_t(&id,
+ boost::bind(boost::mem_fn(&LLFastTimer::NamedTimer::beginChildren), _1),
+ boost::bind(boost::mem_fn(&LLFastTimer::NamedTimer::endChildren), _1));
+}
+
+static timer_tree_dfs_iterator_t end_timer_tree()
+{
+ return timer_tree_dfs_iterator_t();
+}
+
+
+
+// factory class that creates NamedTimers via static DeclareTimer objects
+class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
+{
+public:
+ NamedTimerFactory()
+ : mActiveTimerRoot(NULL),
+ mTimerRoot(NULL),
+ mAppTimer(NULL),
+ mRootFrameState(NULL)
+ {}
+
+ /*virtual */ void initSingleton()
+ {
+ mTimerRoot = new LLFastTimer::NamedTimer("root");
+
+ mActiveTimerRoot = new LLFastTimer::NamedTimer("Frame");
+ mActiveTimerRoot->setCollapsed(false);
+
+ mRootFrameState = new LLFastTimer::FrameState(mActiveTimerRoot);
+ mRootFrameState->mParent = &mTimerRoot->getFrameState();
+ mActiveTimerRoot->setParent(mTimerRoot);
+
+ mAppTimer = new LLFastTimer(mRootFrameState);
+ }
+
+ ~NamedTimerFactory()
+ {
+ std::for_each(mTimers.begin(), mTimers.end(), DeletePairedPointer());
+
+ delete mAppTimer;
+ delete mActiveTimerRoot;
+ delete mTimerRoot;
+ delete mRootFrameState;
+ }
+
+ LLFastTimer::NamedTimer& createNamedTimer(const std::string& name)
+ {
+ timer_map_t::iterator found_it = mTimers.find(name);
+ if (found_it != mTimers.end())
+ {
+ return *found_it->second;
+ }
+
+ LLFastTimer::NamedTimer* timer = new LLFastTimer::NamedTimer(name);
+ timer->setParent(mTimerRoot);
+ mTimers.insert(std::make_pair(name, timer));
+
+ return *timer;
+ }
+
+ LLFastTimer::NamedTimer* getTimerByName(const std::string& name)
+ {
+ timer_map_t::iterator found_it = mTimers.find(name);
+ if (found_it != mTimers.end())
+ {
+ return found_it->second;
+ }
+ return NULL;
+ }
+
+ LLFastTimer::NamedTimer* getActiveRootTimer() { return mActiveTimerRoot; }
+ LLFastTimer::NamedTimer* getRootTimer() { return mTimerRoot; }
+ const LLFastTimer* getAppTimer() { return mAppTimer; }
+ LLFastTimer::FrameState& getRootFrameState() { return *mRootFrameState; }
+
+ typedef std::map<std::string, LLFastTimer::NamedTimer*> timer_map_t;
+ timer_map_t::iterator beginTimers() { return mTimers.begin(); }
+ timer_map_t::iterator endTimers() { return mTimers.end(); }
+ S32 timerCount() { return mTimers.size(); }
+
+private:
+ timer_map_t mTimers;
+
+ LLFastTimer::NamedTimer* mActiveTimerRoot;
+ LLFastTimer::NamedTimer* mTimerRoot;
+ LLFastTimer* mAppTimer;
+ LLFastTimer::FrameState* mRootFrameState;
+};
+
+void update_cached_pointers_if_changed()
+{
+ // detect when elements have moved and update cached pointers
+ static LLFastTimer::FrameState* sFirstTimerAddress = NULL;
+ if (&*(LLFastTimer::getFrameStateList().begin()) != sFirstTimerAddress)
+ {
+ LLFastTimer::DeclareTimer::updateCachedPointers();
+ }
+ sFirstTimerAddress = &*(LLFastTimer::getFrameStateList().begin());
+}
+
+LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name, bool open )
+: mTimer(NamedTimerFactory::instance().createNamedTimer(name))
+{
+ mTimer.setCollapsed(!open);
+ mFrameState = &mTimer.getFrameState();
+ update_cached_pointers_if_changed();
+}
+
+LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
+: mTimer(NamedTimerFactory::instance().createNamedTimer(name))
+{
+ mFrameState = &mTimer.getFrameState();
+ update_cached_pointers_if_changed();
+}
+
+// static
+void LLFastTimer::DeclareTimer::updateCachedPointers()
+{
+ DeclareTimer::LLInstanceTrackerScopedGuard guard;
+ // propagate frame state pointers to timer declarations
+ for (DeclareTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ // update cached pointer
+ it->mFrameState = &it->mTimer.getFrameState();
+ }
+}
+
+//static
+#if LL_LINUX || LL_SOLARIS || ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)) )
+U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
+{
+ return sClockResolution >> 8;
+}
+#else // windows or x86-mac
+U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
+{
+ static U64 sCPUClockFrequency = U64(CProcessor().GetCPUFrequency(50));
+
+ // we drop the low-order byte in out timers, so report a lower frequency
+ return sCPUClockFrequency >> 8;
+}
+#endif
+
+LLFastTimer::FrameState::FrameState(LLFastTimer::NamedTimer* timerp)
+: mActiveCount(0),
+ mCalls(0),
+ mSelfTimeCounter(0),
+ mParent(NULL),
+ mLastCaller(NULL),
+ mMoveUpTree(false),
+ mTimer(timerp)
+{}
+
+
+LLFastTimer::NamedTimer::NamedTimer(const std::string& name)
+: mName(name),
+ mCollapsed(true),
+ mParent(NULL),
+ mTotalTimeCounter(0),
+ mCountAverage(0),
+ mCallAverage(0),
+ mNeedsSorting(false)
+{
+ info_list_t& frame_state_list = getFrameStateList();
+ mFrameStateIndex = frame_state_list.size();
+ getFrameStateList().push_back(FrameState(this));
+
+ mCountHistory = new U32[HISTORY_NUM];
+ memset(mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ mCallHistory = new U32[HISTORY_NUM];
+ memset(mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
+}
+
+LLFastTimer::NamedTimer::~NamedTimer()
+{
+ delete[] mCountHistory;
+ delete[] mCallHistory;
+}
+
+std::string LLFastTimer::NamedTimer::getToolTip(S32 history_idx)
+{
+ if (history_idx < 0)
+ {
+ // by default, show average number of calls
+ return llformat("%s (%d calls)", getName().c_str(), (S32)getCallAverage());
+ }
+ else
+ {
+ return llformat("%s (%d calls)", getName().c_str(), (S32)getHistoricalCalls(history_idx));
+ }
+}
+
+void LLFastTimer::NamedTimer::setParent(NamedTimer* parent)
+{
+ llassert_always(parent != this);
+ llassert_always(parent != NULL);
+
+ if (mParent)
+ {
+ // subtract our accumulated from previous parent
+ for (S32 i = 0; i < HISTORY_NUM; i++)
+ {
+ mParent->mCountHistory[i] -= mCountHistory[i];
+ }
+
+ // subtract average timing from previous parent
+ mParent->mCountAverage -= mCountAverage;
+
+ std::vector<NamedTimer*>& children = mParent->getChildren();
+ std::vector<NamedTimer*>::iterator found_it = std::find(children.begin(), children.end(), this);
+ if (found_it != children.end())
+ {
+ children.erase(found_it);
+ }
+ }
+
+ mParent = parent;
+ if (parent)
+ {
+ getFrameState().mParent = &parent->getFrameState();
+ parent->getChildren().push_back(this);
+ parent->mNeedsSorting = true;
+ }
+}
+
+S32 LLFastTimer::NamedTimer::getDepth()
+{
+ S32 depth = 0;
+ NamedTimer* timerp = mParent;
+ while(timerp)
+ {
+ depth++;
+ timerp = timerp->mParent;
+ }
+ return depth;
+}
+
+// static
+void LLFastTimer::NamedTimer::processTimes()
+{
+ if (sCurFrameIndex < 0) return;
+
+ buildHierarchy();
+ accumulateTimings();
+}
+
+// sort timer info structs by depth first traversal order
+struct SortTimersDFS
+{
+ bool operator()(const LLFastTimer::FrameState& i1, const LLFastTimer::FrameState& i2)
+ {
+ return i1.mTimer->getFrameStateIndex() < i2.mTimer->getFrameStateIndex();
+ }
+};
+
+// sort child timers by name
+struct SortTimerByName
+{
+ bool operator()(const LLFastTimer::NamedTimer* i1, const LLFastTimer::NamedTimer* i2)
+ {
+ return i1->getName() < i2->getName();
+ }
+};
+
+//static
+void LLFastTimer::NamedTimer::buildHierarchy()
+{
+ if (sCurFrameIndex < 0 ) return;
+
+ // set up initial tree
+ {
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+ if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
+
+ // bootstrap tree construction by attaching to last timer to be on stack
+ // when this timer was called
+ if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(timer.getFrameState().mLastCaller->mTimer);
+ // no need to push up tree on first use, flag can be set spuriously
+ timer.getFrameState().mMoveUpTree = false;
+ }
+ }
+ }
+
+ // bump timers up tree if they've been flagged as being in the wrong place
+ // do this in a bottom up order to promote descendants first before promoting ancestors
+ // this preserves partial order derived from current frame's observations
+ for(timer_tree_bottom_up_iterator_t it = begin_timer_tree_bottom_up(*NamedTimerFactory::instance().getRootTimer());
+ it != end_timer_tree_bottom_up();
+ ++it)
+ {
+ NamedTimer* timerp = *it;
+ // skip root timer
+ if (timerp == NamedTimerFactory::instance().getRootTimer()) continue;
+
+ if (timerp->getFrameState().mMoveUpTree)
+ {
+ // since ancestors have already been visited, reparenting won't affect tree traversal
+ //step up tree, bringing our descendants with us
+ //llinfos << "Moving " << timerp->getName() << " from child of " << timerp->getParent()->getName() <<
+ // " to child of " << timerp->getParent()->getParent()->getName() << llendl;
+ timerp->setParent(timerp->getParent()->getParent());
+ timerp->getFrameState().mMoveUpTree = false;
+
+ // don't bubble up any ancestors until descendants are done bubbling up
+ it.skipAncestors();
+ }
+ }
+
+ // sort timers by time last called, so call graph makes sense
+ for(timer_tree_dfs_iterator_t it = begin_timer_tree(*NamedTimerFactory::instance().getRootTimer());
+ it != end_timer_tree();
+ ++it)
+ {
+ NamedTimer* timerp = (*it);
+ if (timerp->mNeedsSorting)
+ {
+ std::sort(timerp->getChildren().begin(), timerp->getChildren().end(), SortTimerByName());
+ }
+ timerp->mNeedsSorting = false;
+ }
+}
+
+//static
+void LLFastTimer::NamedTimer::accumulateTimings()
+{
+ U32 cur_time = getCPUClockCount32();
+
+ // walk up stack of active timers and accumulate current time while leaving timing structures active
+ LLFastTimer* cur_timer = sCurTimerData.mCurTimer;
+ // root defined by parent pointing to self
+ CurTimerData* cur_data = &sCurTimerData;
+ while(cur_timer->mLastTimerData.mCurTimer != cur_timer)
+ {
+ U32 cumulative_time_delta = cur_time - cur_timer->mStartTime;
+ U32 self_time_delta = cumulative_time_delta - cur_data->mChildTime;
+ cur_data->mChildTime = 0;
+ cur_timer->mFrameState->mSelfTimeCounter += self_time_delta;
+ cur_timer->mStartTime = cur_time;
+
+ cur_data = &cur_timer->mLastTimerData;
+ cur_data->mChildTime += cumulative_time_delta;
+
+ cur_timer = cur_timer->mLastTimerData.mCurTimer;
+ }
+
+ // traverse tree in DFS post order, or bottom up
+ for(timer_tree_bottom_up_iterator_t it = begin_timer_tree_bottom_up(*NamedTimerFactory::instance().getActiveRootTimer());
+ it != end_timer_tree_bottom_up();
+ ++it)
+ {
+ NamedTimer* timerp = (*it);
+ timerp->mTotalTimeCounter = timerp->getFrameState().mSelfTimeCounter;
+ for (child_const_iter child_it = timerp->beginChildren(); child_it != timerp->endChildren(); ++child_it)
+ {
+ timerp->mTotalTimeCounter += (*child_it)->mTotalTimeCounter;
+ }
+
+ S32 cur_frame = sCurFrameIndex;
+ if (cur_frame >= 0)
+ {
+ // update timer history
+ int hidx = cur_frame % HISTORY_NUM;
+
+ timerp->mCountHistory[hidx] = timerp->mTotalTimeCounter;
+ timerp->mCountAverage = (timerp->mCountAverage * cur_frame + timerp->mTotalTimeCounter) / (cur_frame+1);
+ timerp->mCallHistory[hidx] = timerp->getFrameState().mCalls;
+ timerp->mCallAverage = (timerp->mCallAverage * cur_frame + timerp->getFrameState().mCalls) / (cur_frame+1);
+ }
+ }
+}
+
+// static
+void LLFastTimer::NamedTimer::resetFrame()
+{
+ if (sLog)
+ { //output current frame counts to performance log
+ F64 iclock_freq = 1000.0 / countsPerSecond(); // good place to calculate clock frequency
+
+ F64 total_time = 0;
+ LLSD sd;
+
+ {
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+ FrameState& info = timer.getFrameState();
+ sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);
+ sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
+
+ // computing total time here because getting the root timer's getCountHistory
+ // doesn't work correctly on the first frame
+ total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+ }
+ }
+
+ sd["Total"]["Time"] = (LLSD::Real) total_time;
+ sd["Total"]["Calls"] = (LLSD::Integer) 1;
+
+ {
+ LLMutexLock lock(sLogLock);
+ sLogQueue.push(sd);
+ }
+ }
+
+
+ // tag timers by position in depth first traversal of tree
+ S32 index = 0;
+ for(timer_tree_dfs_iterator_t it = begin_timer_tree(*NamedTimerFactory::instance().getRootTimer());
+ it != end_timer_tree();
+ ++it)
+ {
+ NamedTimer* timerp = (*it);
+
+ timerp->mFrameStateIndex = index;
+ index++;
+
+ llassert_always(timerp->mFrameStateIndex < (S32)getFrameStateList().size());
+ }
+
+ // sort timers by dfs traversal order to improve cache coherency
+ std::sort(getFrameStateList().begin(), getFrameStateList().end(), SortTimersDFS());
+
+ // update pointers into framestatelist now that we've sorted it
+ DeclareTimer::updateCachedPointers();
+
+ // reset for next frame
+ {
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+
+ FrameState& info = timer.getFrameState();
+ info.mSelfTimeCounter = 0;
+ info.mCalls = 0;
+ info.mLastCaller = NULL;
+ info.mMoveUpTree = false;
+ // update parent pointer in timer state struct
+ if (timer.mParent)
+ {
+ info.mParent = &timer.mParent->getFrameState();
+ }
+ }
+ }
+
+ //sTimerCycles = 0;
+ //sTimerCalls = 0;
+}
+
+//static
+void LLFastTimer::NamedTimer::reset()
+{
+ resetFrame(); // reset frame data
+
+ // walk up stack of active timers and reset start times to current time
+ // effectively zeroing out any accumulated time
+ U32 cur_time = getCPUClockCount32();
+
+ // root defined by parent pointing to self
+ CurTimerData* cur_data = &sCurTimerData;
+ LLFastTimer* cur_timer = cur_data->mCurTimer;
+ while(cur_timer->mLastTimerData.mCurTimer != cur_timer)
+ {
+ cur_timer->mStartTime = cur_time;
+ cur_data->mChildTime = 0;
+
+ cur_data = &cur_timer->mLastTimerData;
+ cur_timer = cur_data->mCurTimer;
+ }
+
+ // reset all history
+ {
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+ if (&timer != NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(NamedTimerFactory::instance().getRootTimer());
+ }
+
+ timer.mCountAverage = 0;
+ timer.mCallAverage = 0;
+ memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
+ }
+ }
+
+ sLastFrameIndex = 0;
+ sCurFrameIndex = 0;
+}
+
+//static
+LLFastTimer::info_list_t& LLFastTimer::getFrameStateList()
+{
+ if (!sTimerInfos)
+ {
+ sTimerInfos = new info_list_t();
+ }
+ return *sTimerInfos;
+}
+
+
+U32 LLFastTimer::NamedTimer::getHistoricalCount(S32 history_index) const
+{
+ S32 history_idx = (getLastFrameIndex() + history_index) % LLFastTimer::NamedTimer::HISTORY_NUM;
+ return mCountHistory[history_idx];
+}
+
+U32 LLFastTimer::NamedTimer::getHistoricalCalls(S32 history_index ) const
+{
+ S32 history_idx = (getLastFrameIndex() + history_index) % LLFastTimer::NamedTimer::HISTORY_NUM;
+ return mCallHistory[history_idx];
+}
+
+LLFastTimer::FrameState& LLFastTimer::NamedTimer::getFrameState() const
+{
+ llassert_always(mFrameStateIndex >= 0);
+ if (this == NamedTimerFactory::instance().getActiveRootTimer())
+ {
+ return NamedTimerFactory::instance().getRootFrameState();
+ }
+ return getFrameStateList()[mFrameStateIndex];
+}
+
+// static
+LLFastTimer::NamedTimer& LLFastTimer::NamedTimer::getRootNamedTimer()
+{
+ return *NamedTimerFactory::instance().getActiveRootTimer();
+}
+
+std::vector<LLFastTimer::NamedTimer*>::const_iterator LLFastTimer::NamedTimer::beginChildren()
+{
+ return mChildren.begin();
+}
+
+std::vector<LLFastTimer::NamedTimer*>::const_iterator LLFastTimer::NamedTimer::endChildren()
+{
+ return mChildren.end();
+}
+
+std::vector<LLFastTimer::NamedTimer*>& LLFastTimer::NamedTimer::getChildren()
+{
+ return mChildren;
+}
+
+//static
+void LLFastTimer::nextFrame()
+{
+ countsPerSecond(); // good place to calculate clock frequency
+ U64 frame_time = getCPUClockCount64();
+ if ((frame_time - sLastFrameTime) >> 8 > 0xffffffff)
+ {
+ llinfos << "Slow frame, fast timers inaccurate" << llendl;
+ }
+
+ if (sPauseHistory)
+ {
+ sResetHistory = true;
+ }
+ else if (sResetHistory)
+ {
+ sLastFrameIndex = 0;
+ sCurFrameIndex = 0;
+ sResetHistory = false;
+ }
+ else // not paused
+ {
+ NamedTimer::processTimes();
+ sLastFrameIndex = sCurFrameIndex++;
+ }
+
+ // get ready for next frame
+ NamedTimer::resetFrame();
+ sLastFrameTime = frame_time;
+}
+
+//static
+void LLFastTimer::dumpCurTimes()
+{
+ // accumulate timings, etc.
+ NamedTimer::processTimes();
+
+ F64 clock_freq = (F64)countsPerSecond();
+ F64 iclock_freq = 1000.0 / clock_freq; // clock_ticks -> milliseconds
+
+ // walk over timers in depth order and output timings
+ for(timer_tree_dfs_iterator_t it = begin_timer_tree(*NamedTimerFactory::instance().getRootTimer());
+ it != end_timer_tree();
+ ++it)
+ {
+ NamedTimer* timerp = (*it);
+ F64 total_time_ms = ((F64)timerp->getHistoricalCount(0) * iclock_freq);
+ // Don't bother with really brief times, keep output concise
+ if (total_time_ms < 0.1) continue;
+
+ std::ostringstream out_str;
+ for (S32 i = 0; i < timerp->getDepth(); i++)
+ {
+ out_str << "\t";
+ }
+
+
+ out_str << timerp->getName() << " "
+ << std::setprecision(3) << total_time_ms << " ms, "
+ << timerp->getHistoricalCalls(0) << " calls";
+
+ llinfos << out_str.str() << llendl;
+ }
+}
+
+//static
+void LLFastTimer::reset()
+{
+ NamedTimer::reset();
+}
+
+
+//static
+void LLFastTimer::writeLog(std::ostream& os)
+{
+ while (!sLogQueue.empty())
+ {
+ LLSD& sd = sLogQueue.front();
+ LLSDSerialize::toXML(sd, os);
+ LLMutexLock lock(sLogLock);
+ sLogQueue.pop();
+ }
+}
+
+//static
+const LLFastTimer::NamedTimer* LLFastTimer::getTimerByName(const std::string& name)
+{
+ return NamedTimerFactory::instance().getTimerByName(name);
+}
+
+LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state)
+: mFrameState(state)
+{
+ U32 start_time = getCPUClockCount32();
+ mStartTime = start_time;
+ mFrameState->mActiveCount++;
+ LLFastTimer::sCurTimerData.mCurTimer = this;
+ LLFastTimer::sCurTimerData.mFrameState = mFrameState;
+ LLFastTimer::sCurTimerData.mChildTime = 0;
+ mLastTimerData = LLFastTimer::sCurTimerData;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h
new file mode 100644
index 0000000000..ddb1a74793
--- /dev/null
+++ b/indra/llcommon/llfasttimer_class.h
@@ -0,0 +1,272 @@
+/**
+ * @file llfasttimer_class.h
+ * @brief Declaration of a fast timer.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FASTTIMER_CLASS_H
+#define LL_FASTTIMER_CLASS_H
+
+#include "llinstancetracker.h"
+
+#define FAST_TIMER_ON 1
+#define TIME_FAST_TIMERS 0
+
+class LLMutex;
+
+#include <queue>
+#include "llsd.h"
+
+class LL_COMMON_API LLFastTimer
+{
+public:
+ class NamedTimer;
+
+ struct LL_COMMON_API FrameState
+ {
+ FrameState(NamedTimer* timerp);
+
+ U32 mSelfTimeCounter;
+ U32 mCalls;
+ FrameState* mParent; // info for caller timer
+ FrameState* mLastCaller; // used to bootstrap tree construction
+ NamedTimer* mTimer;
+ U16 mActiveCount; // number of timers with this ID active on stack
+ bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame
+ };
+
+ // stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
+ class LL_COMMON_API NamedTimer
+ : public LLInstanceTracker<NamedTimer>
+ {
+ friend class DeclareTimer;
+ public:
+ ~NamedTimer();
+
+ enum { HISTORY_NUM = 60 };
+
+ const std::string& getName() const { return mName; }
+ NamedTimer* getParent() const { return mParent; }
+ void setParent(NamedTimer* parent);
+ S32 getDepth();
+ std::string getToolTip(S32 history_index = -1);
+
+ typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
+ child_const_iter beginChildren();
+ child_const_iter endChildren();
+ std::vector<NamedTimer*>& getChildren();
+
+ void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
+ bool getCollapsed() const { return mCollapsed; }
+
+ U32 getCountAverage() const { return mCountAverage; }
+ U32 getCallAverage() const { return mCallAverage; }
+
+ U32 getHistoricalCount(S32 history_index = 0) const;
+ U32 getHistoricalCalls(S32 history_index = 0) const;
+
+ static NamedTimer& getRootNamedTimer();
+
+ S32 getFrameStateIndex() const { return mFrameStateIndex; }
+
+ FrameState& getFrameState() const;
+
+ private:
+ friend class LLFastTimer;
+ friend class NamedTimerFactory;
+
+ //
+ // methods
+ //
+ NamedTimer(const std::string& name);
+ // recursive call to gather total time from children
+ static void accumulateTimings();
+
+ // updates cumulative times and hierarchy,
+ // can be called multiple times in a frame, at any point
+ static void processTimes();
+
+ static void buildHierarchy();
+ static void resetFrame();
+ static void reset();
+
+ //
+ // members
+ //
+ S32 mFrameStateIndex;
+
+ std::string mName;
+
+ U32 mTotalTimeCounter;
+
+ U32 mCountAverage;
+ U32 mCallAverage;
+
+ U32* mCountHistory;
+ U32* mCallHistory;
+
+ // tree structure
+ NamedTimer* mParent; // NamedTimer of caller(parent)
+ std::vector<NamedTimer*> mChildren;
+ bool mCollapsed; // don't show children
+ bool mNeedsSorting; // sort children whenever child added
+ };
+
+ // used to statically declare a new named timer
+ class LL_COMMON_API DeclareTimer
+ : public LLInstanceTracker<DeclareTimer>
+ {
+ friend class LLFastTimer;
+ public:
+ DeclareTimer(const std::string& name, bool open);
+ DeclareTimer(const std::string& name);
+
+ static void updateCachedPointers();
+
+ private:
+ NamedTimer& mTimer;
+ FrameState* mFrameState;
+ };
+
+public:
+ LLFastTimer(LLFastTimer::FrameState* state);
+
+ LL_FORCE_INLINE LLFastTimer(LLFastTimer::DeclareTimer& timer)
+ : mFrameState(timer.mFrameState)
+ {
+#if TIME_FAST_TIMERS
+ U64 timer_start = getCPUClockCount64();
+#endif
+#if FAST_TIMER_ON
+ LLFastTimer::FrameState* frame_state = mFrameState;
+ mStartTime = getCPUClockCount32();
+
+ frame_state->mActiveCount++;
+ frame_state->mCalls++;
+ // keep current parent as long as it is active when we are
+ frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
+
+ LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
+ mLastTimerData = *cur_timer_data;
+ cur_timer_data->mCurTimer = this;
+ cur_timer_data->mFrameState = frame_state;
+ cur_timer_data->mChildTime = 0;
+#endif
+#if TIME_FAST_TIMERS
+ U64 timer_end = getCPUClockCount64();
+ sTimerCycles += timer_end - timer_start;
+#endif
+ }
+
+ LL_FORCE_INLINE ~LLFastTimer()
+ {
+#if TIME_FAST_TIMERS
+ U64 timer_start = getCPUClockCount64();
+#endif
+#if FAST_TIMER_ON
+ LLFastTimer::FrameState* frame_state = mFrameState;
+ U32 total_time = getCPUClockCount32() - mStartTime;
+
+ frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
+ frame_state->mActiveCount--;
+
+ // store last caller to bootstrap tree creation
+ // do this in the destructor in case of recursion to get topmost caller
+ frame_state->mLastCaller = mLastTimerData.mFrameState;
+
+ // we are only tracking self time, so subtract our total time delta from parents
+ mLastTimerData.mChildTime += total_time;
+
+ LLFastTimer::sCurTimerData = mLastTimerData;
+#endif
+#if TIME_FAST_TIMERS
+ U64 timer_end = getCPUClockCount64();
+ sTimerCycles += timer_end - timer_start;
+ sTimerCalls++;
+#endif
+ }
+
+public:
+ static LLMutex* sLogLock;
+ static std::queue<LLSD> sLogQueue;
+ static BOOL sLog;
+ static BOOL sMetricLog;
+ static bool sPauseHistory;
+ static bool sResetHistory;
+ static U64 sTimerCycles;
+ static U32 sTimerCalls;
+
+ typedef std::vector<FrameState> info_list_t;
+ static info_list_t& getFrameStateList();
+
+
+ // call this once a frame to reset timers
+ static void nextFrame();
+
+ // dumps current cumulative frame stats to log
+ // call nextFrame() to reset timers
+ static void dumpCurTimes();
+
+ // call this to reset timer hierarchy, averages, etc.
+ static void reset();
+
+ static U64 countsPerSecond();
+ static S32 getLastFrameIndex() { return sLastFrameIndex; }
+ static S32 getCurFrameIndex() { return sCurFrameIndex; }
+
+ static void writeLog(std::ostream& os);
+ static const NamedTimer* getTimerByName(const std::string& name);
+
+ struct CurTimerData
+ {
+ LLFastTimer* mCurTimer;
+ FrameState* mFrameState;
+ U32 mChildTime;
+ };
+ static CurTimerData sCurTimerData;
+
+private:
+ static U32 getCPUClockCount32();
+ static U64 getCPUClockCount64();
+ static U64 sClockResolution;
+
+ static S32 sCurFrameIndex;
+ static S32 sLastFrameIndex;
+ static U64 sLastFrameTime;
+ static info_list_t* sTimerInfos;
+
+ U32 mStartTime;
+ LLFastTimer::FrameState* mFrameState;
+ LLFastTimer::CurTimerData mLastTimerData;
+
+};
+
+typedef class LLFastTimer LLFastTimer;
+
+#endif // LL_LLFASTTIMER_CLASS_H
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
new file mode 100644
index 0000000000..2610fe9e6a
--- /dev/null
+++ b/indra/llcommon/llfoldertype.cpp
@@ -0,0 +1,169 @@
+/**
+ * @file llfoldertype.cpp
+ * @brief Implementatino of LLFolderType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llfoldertype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llsingleton.h"
+
+///----------------------------------------------------------------------------
+/// Class LLFolderType
+///----------------------------------------------------------------------------
+struct FolderEntry : public LLDictionaryEntry
+{
+ FolderEntry(const std::string &type_name, // 8 character limit!
+ bool is_protected) // can the viewer change categories of this type?
+ :
+ LLDictionaryEntry(type_name),
+ mIsProtected(is_protected)
+ {
+ llassert(type_name.length() <= 8);
+ }
+
+ const bool mIsProtected;
+};
+
+class LLFolderDictionary : public LLSingleton<LLFolderDictionary>,
+ public LLDictionary<LLFolderType::EType, FolderEntry>
+{
+public:
+ LLFolderDictionary();
+protected:
+ virtual LLFolderType::EType notFound() const
+ {
+ return LLFolderType::FT_NONE;
+ }
+};
+
+LLFolderDictionary::LLFolderDictionary()
+{
+ // TYPE NAME PROTECTED
+ // |-----------|---------|
+ addEntry(LLFolderType::FT_TEXTURE, new FolderEntry("texture", TRUE));
+ addEntry(LLFolderType::FT_SOUND, new FolderEntry("sound", TRUE));
+ addEntry(LLFolderType::FT_CALLINGCARD, new FolderEntry("callcard", TRUE));
+ addEntry(LLFolderType::FT_LANDMARK, new FolderEntry("landmark", TRUE));
+ addEntry(LLFolderType::FT_CLOTHING, new FolderEntry("clothing", TRUE));
+ addEntry(LLFolderType::FT_OBJECT, new FolderEntry("object", TRUE));
+ addEntry(LLFolderType::FT_NOTECARD, new FolderEntry("notecard", TRUE));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new FolderEntry("root_inv", TRUE));
+ addEntry(LLFolderType::FT_LSL_TEXT, new FolderEntry("lsltext", TRUE));
+ addEntry(LLFolderType::FT_BODYPART, new FolderEntry("bodypart", TRUE));
+ addEntry(LLFolderType::FT_TRASH, new FolderEntry("trash", TRUE));
+ addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new FolderEntry("snapshot", TRUE));
+ addEntry(LLFolderType::FT_LOST_AND_FOUND, new FolderEntry("lstndfnd", TRUE));
+ addEntry(LLFolderType::FT_ANIMATION, new FolderEntry("animatn", TRUE));
+ addEntry(LLFolderType::FT_GESTURE, new FolderEntry("gesture", TRUE));
+ addEntry(LLFolderType::FT_FAVORITE, new FolderEntry("favorite", TRUE));
+
+ for (S32 ensemble_num = S32(LLFolderType::FT_ENSEMBLE_START); ensemble_num <= S32(LLFolderType::FT_ENSEMBLE_END); ensemble_num++)
+ {
+ addEntry(LLFolderType::EType(ensemble_num), new FolderEntry("ensemble", FALSE));
+ }
+
+ addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE));
+ addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE));
+ addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE));
+ addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
+
+ addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
+};
+
+// static
+LLFolderType::EType LLFolderType::lookup(const std::string& name)
+{
+ return LLFolderDictionary::getInstance()->lookup(name);
+}
+
+// static
+const std::string &LLFolderType::lookup(LLFolderType::EType folder_type)
+{
+ const FolderEntry *entry = LLFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mName;
+ }
+ else
+ {
+ return badLookup();
+ }
+}
+
+// static
+// Only ensembles and plain folders aren't protected. "Protected" means
+// you can't change certain properties such as their type.
+bool LLFolderType::lookupIsProtectedType(EType folder_type)
+{
+ const LLFolderDictionary *dict = LLFolderDictionary::getInstance();
+ const FolderEntry *entry = dict->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mIsProtected;
+ }
+ return true;
+}
+
+// static
+bool LLFolderType::lookupIsEnsembleType(EType folder_type)
+{
+ return (folder_type >= FT_ENSEMBLE_START &&
+ folder_type <= FT_ENSEMBLE_END);
+}
+
+// static
+LLAssetType::EType LLFolderType::folderTypeToAssetType(LLFolderType::EType folder_type)
+{
+ if (LLAssetType::lookup(LLAssetType::EType(folder_type)) == LLAssetType::badLookup())
+ {
+ llwarns << "Converting to unknown asset type " << folder_type << llendl;
+ }
+ return (LLAssetType::EType)folder_type;
+}
+
+// static
+LLFolderType::EType LLFolderType::assetTypeToFolderType(LLAssetType::EType asset_type)
+{
+ if (LLFolderType::lookup(LLFolderType::EType(asset_type)) == LLFolderType::badLookup())
+ {
+ llwarns << "Converting to unknown folder type " << asset_type << llendl;
+ }
+ return (LLFolderType::EType)asset_type;
+}
+
+// static
+const std::string &LLFolderType::badLookup()
+{
+ static const std::string sBadLookup = "llfoldertype_bad_lookup";
+ return sBadLookup;
+}
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
new file mode 100644
index 0000000000..7aa77f7f7e
--- /dev/null
+++ b/indra/llcommon/llfoldertype.h
@@ -0,0 +1,112 @@
+/**
+ * @file llfoldertype.h
+ * @brief Declaration of LLFolderType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFOLDERTYPE_H
+#define LL_LLFOLDERTYPE_H
+
+#include <string>
+#include "llassettype.h"
+
+// This class handles folder types (similar to assettype, except for folders)
+// and operations on those.
+class LL_COMMON_API LLFolderType
+{
+public:
+ // ! BACKWARDS COMPATIBILITY ! Folder type enums must match asset type enums.
+ enum EType
+ {
+ FT_TEXTURE = 0,
+
+ FT_SOUND = 1,
+
+ FT_CALLINGCARD = 2,
+
+ FT_LANDMARK = 3,
+
+ FT_CLOTHING = 5,
+
+ FT_OBJECT = 6,
+
+ FT_NOTECARD = 7,
+
+ FT_ROOT_INVENTORY = 8,
+ // We'd really like to change this to 9 since AT_CATEGORY is 8,
+ // but "My Inventory" has been type 8 for a long time.
+
+ FT_LSL_TEXT = 10,
+
+ FT_BODYPART = 13,
+
+ FT_TRASH = 14,
+
+ FT_SNAPSHOT_CATEGORY = 15,
+
+ FT_LOST_AND_FOUND = 16,
+
+ FT_ANIMATION = 20,
+
+ FT_GESTURE = 21,
+
+ FT_FAVORITE = 23,
+
+ FT_ENSEMBLE_START = 26,
+ FT_ENSEMBLE_END = 45,
+ // This range is reserved for special clothing folder types.
+
+ FT_CURRENT_OUTFIT = 46,
+ FT_OUTFIT = 47,
+ FT_MY_OUTFITS = 48,
+
+ FT_INBOX = 49,
+
+ FT_COUNT = 50,
+
+ FT_NONE = -1
+ };
+
+ static EType lookup(const std::string& type_name);
+ static const std::string& lookup(EType folder_type);
+
+ static bool lookupIsProtectedType(EType folder_type);
+ static bool lookupIsEnsembleType(EType folder_type);
+
+ static LLAssetType::EType folderTypeToAssetType(LLFolderType::EType folder_type);
+ static LLFolderType::EType assetTypeToFolderType(LLAssetType::EType asset_type);
+
+ static const std::string& badLookup(); // error string when a lookup fails
+
+protected:
+ LLFolderType() {}
+ ~LLFolderType() {}
+};
+
+#endif // LL_LLFOLDERTYPE_H
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
new file mode 100644
index 0000000000..c962cb5be1
--- /dev/null
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -0,0 +1,20 @@
+/**
+ * @file lllinstancetracker.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+// llinstancetracker.h is presently header-only. This file exists only because our CMake
+// test macro ADD_BUILD_TEST requires it.
+int dummy = 0;
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index ea50acbbc5..9df7998273 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -38,42 +38,76 @@
#include "string_table.h"
#include <boost/utility.hpp>
-
-// This mix-in class adds support for tracking all instances of the specified class parameter T
-// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup
-// If KEY is not provided, then instances are stored in a simple set
-// *NOTE: see explicit specialization below for default KEY==T* case
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/iterator/indirect_iterator.hpp>
+
+/// This mix-in class adds support for tracking all instances of the specified class parameter T
+/// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup
+/// If KEY is not provided, then instances are stored in a simple set
+/// @NOTE: see explicit specialization below for default KEY==T* case
template<typename T, typename KEY = T*>
class LLInstanceTracker : boost::noncopyable
{
+ typedef typename std::map<KEY, T*> InstanceMap;
+ typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter;
+ typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter;
public:
- typedef typename std::map<KEY, T*>::iterator instance_iter;
- typedef typename std::map<KEY, T*>::const_iterator instance_const_iter;
-
- static T* getInstance(const KEY& k) { instance_iter found = getMap().find(k); return (found == getMap().end()) ? NULL : found->second; }
+ /// Dereferencing key_iter gives you a const KEY&
+ typedef boost::transform_iterator<KeyGetter, typename InstanceMap::iterator> key_iter;
+ /// Dereferencing instance_iter gives you a T&
+ typedef boost::indirect_iterator< boost::transform_iterator<InstancePtrGetter, typename InstanceMap::iterator> > instance_iter;
+
+ static T* getInstance(const KEY& k)
+ {
+ typename InstanceMap::const_iterator found = getMap_().find(k);
+ return (found == getMap_().end()) ? NULL : found->second;
+ }
- static instance_iter beginInstances() { return getMap().begin(); }
- static instance_iter endInstances() { return getMap().end(); }
- static S32 instanceCount() { return getMap().size(); }
+ static key_iter beginKeys()
+ {
+ return boost::make_transform_iterator(getMap_().begin(),
+ boost::bind(&InstanceMap::value_type::first, _1));
+ }
+ static key_iter endKeys()
+ {
+ return boost::make_transform_iterator(getMap_().end(),
+ boost::bind(&InstanceMap::value_type::first, _1));
+ }
+ static instance_iter beginInstances()
+ {
+ return instance_iter(boost::make_transform_iterator(getMap_().begin(),
+ boost::bind(&InstanceMap::value_type::second, _1)));
+ }
+ static instance_iter endInstances()
+ {
+ return instance_iter(boost::make_transform_iterator(getMap_().end(),
+ boost::bind(&InstanceMap::value_type::second, _1)));
+ }
+ static S32 instanceCount() { return getMap_().size(); }
protected:
- LLInstanceTracker(KEY key) { add(key); }
- virtual ~LLInstanceTracker() { remove(); }
- virtual void setKey(KEY key) { remove(); add(key); }
+ LLInstanceTracker(KEY key) { add_(key); }
+ virtual ~LLInstanceTracker() { remove_(); }
+ virtual void setKey(KEY key) { remove_(); add_(key); }
virtual const KEY& getKey() const { return mKey; }
private:
- void add(KEY key)
+ void add_(KEY key)
{
mKey = key;
- getMap()[key] = static_cast<T*>(this);
+ getMap_()[key] = static_cast<T*>(this);
+ }
+ void remove_()
+ {
+ getMap_().erase(mKey);
}
- void remove() { getMap().erase(mKey); }
- static std::map<KEY, T*>& getMap()
+ static InstanceMap& getMap_()
{
if (! sInstances)
{
- sInstances = new std::map<KEY, T*>;
+ sInstances = new InstanceMap;
}
return *sInstances;
}
@@ -81,41 +115,82 @@ private:
private:
KEY mKey;
- static std::map<KEY, T*>* sInstances;
+ static InstanceMap* sInstances;
};
-// explicit specialization for default case where KEY is T*
-// use a simple std::set<T*>
+/// explicit specialization for default case where KEY is T*
+/// use a simple std::set<T*>
template<typename T>
class LLInstanceTracker<T, T*>
{
+ typedef typename std::set<T*> InstanceSet;
public:
- typedef typename std::set<T*>::iterator instance_iter;
- typedef typename std::set<T*>::const_iterator instance_const_iter;
-
- static instance_iter beginInstances() { return getSet().begin(); }
- static instance_iter endInstances() { return getSet().end(); }
- static S32 instanceCount() { return getSet().size(); }
+ /// Dereferencing key_iter gives you a T* (since T* is the key)
+ typedef typename InstanceSet::iterator key_iter;
+ /// Dereferencing instance_iter gives you a T&
+ typedef boost::indirect_iterator<key_iter> instance_iter;
+
+ /// for completeness of analogy with the generic implementation
+ static T* getInstance(T* k) { return k; }
+ static S32 instanceCount() { return getSet_().size(); }
+
+ // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense
+ // that it treats deletes of this type as errors as long as there is an instance of
+ // this class alive in scope somewhere (i.e. deleting while iterating is bad).
+ class LLInstanceTrackerScopedGuard
+ {
+ public:
+ LLInstanceTrackerScopedGuard()
+ {
+ ++sIterationNestDepth;
+ }
+
+ ~LLInstanceTrackerScopedGuard()
+ {
+ --sIterationNestDepth;
+ }
+
+ static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
+ static instance_iter endInstances() { return instance_iter(getSet_().end()); }
+ static key_iter beginKeys() { return getSet_().begin(); }
+ static key_iter endKeys() { return getSet_().end(); }
+ };
protected:
- LLInstanceTracker() { getSet().insert(static_cast<T*>(this)); }
- virtual ~LLInstanceTracker() { getSet().erase(static_cast<T*>(this)); }
+ LLInstanceTracker()
+ {
+ // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle.
+ //llassert(sIterationNestDepth == 0);
+ getSet_().insert(static_cast<T*>(this));
+ }
+ virtual ~LLInstanceTracker()
+ {
+ // it's unsafe to delete instances of this type while all instances are being iterated over.
+ llassert(sIterationNestDepth == 0);
+ getSet_().erase(static_cast<T*>(this));
+ }
- LLInstanceTracker(const LLInstanceTracker& other) { getSet().insert(static_cast<T*>(this)); }
+ LLInstanceTracker(const LLInstanceTracker& other)
+ {
+ //llassert(sIterationNestDepth == 0);
+ getSet_().insert(static_cast<T*>(this));
+ }
- static std::set<T*>& getSet() // called after getReady() but before go()
- {
- if (! sInstances)
- {
- sInstances = new std::set<T*>;
- }
- return *sInstances;
- }
+ static InstanceSet& getSet_()
+ {
+ if (! sInstances)
+ {
+ sInstances = new InstanceSet;
+ }
+ return *sInstances;
+ }
- static std::set<T*>* sInstances;
+ static InstanceSet* sInstances;
+ static S32 sIterationNestDepth;
};
-template <typename T, typename KEY> std::map<KEY, T*>* LLInstanceTracker<T, KEY>::sInstances = NULL;
-template <typename T> std::set<T*>* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
+template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0;
#endif
diff --git a/indra/llcommon/lllistenerwrapper.h b/indra/llcommon/lllistenerwrapper.h
new file mode 100644
index 0000000000..2f747fb182
--- /dev/null
+++ b/indra/llcommon/lllistenerwrapper.h
@@ -0,0 +1,181 @@
+/**
+ * @file lllistenerwrapper.h
+ * @author Nat Goodspeed
+ * @date 2009-11-30
+ * @brief Introduce LLListenerWrapper template
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLLISTENERWRAPPER_H)
+#define LL_LLLISTENERWRAPPER_H
+
+#include "llevents.h" // LLListenerWrapperBase
+#include <boost/visit_each.hpp>
+
+/**
+ * Template base class for coding wrappers for LLEventPump listeners.
+ *
+ * Derive your listener wrapper from LLListenerWrapper. You must use
+ * LLLISTENER_WRAPPER_SUBCLASS() so your subclass will play nicely with
+ * boost::visit_each (q.v.). That way boost::signals2 can still detect
+ * derivation from LLEventTrackable, and so forth.
+ */
+template <typename LISTENER>
+class LLListenerWrapper: public LLListenerWrapperBase
+{
+public:
+ /// Wrap an arbitrary listener object
+ LLListenerWrapper(const LISTENER& listener):
+ mListener(listener)
+ {}
+
+ /// call
+ virtual bool operator()(const LLSD& event)
+ {
+ return mListener(event);
+ }
+
+ /// Allow boost::visit_each() to peek at our mListener.
+ template <class V>
+ void accept_visitor(V& visitor) const
+ {
+ using boost::visit_each;
+ visit_each(visitor, mListener, 0);
+ }
+
+private:
+ LISTENER mListener;
+};
+
+/**
+ * Specialize boost::visit_each() (leveraging ADL) to peek inside an
+ * LLListenerWrapper<T> to traverse its LISTENER. We borrow the
+ * accept_visitor() pattern from boost::bind(), avoiding the need to make
+ * mListener public.
+ */
+template <class V, typename T>
+void visit_each(V& visitor, const LLListenerWrapper<T>& wrapper, int)
+{
+ wrapper.accept_visitor(visitor);
+}
+
+/// use this (sigh!) for each subclass of LLListenerWrapper<T> you write
+#define LLLISTENER_WRAPPER_SUBCLASS(CLASS) \
+template <class V, typename T> \
+void visit_each(V& visitor, const CLASS<T>& wrapper, int) \
+{ \
+ visit_each(visitor, static_cast<const LLListenerWrapper<T>&>(wrapper), 0); \
+} \
+ \
+/* Have to state this explicitly, rather than using LL_TEMPLATE_CONVERTIBLE, */ \
+/* because the source type is itself a template. */ \
+template <typename T> \
+struct ll_template_cast_impl<const LLListenerWrapperBase*, const CLASS<T>*> \
+{ \
+ const LLListenerWrapperBase* operator()(const CLASS<T>* wrapper) \
+ { \
+ return wrapper; \
+ } \
+}
+
+/**
+ * Make an instance of a listener wrapper. Every wrapper class must be a
+ * template accepting a listener object of arbitrary type. In particular, the
+ * type of a boost::bind() expression is deliberately undocumented. So we
+ * can't just write Wrapper<CorrectType>(boost::bind(...)). Instead we must
+ * write llwrap<Wrapper>(boost::bind(...)).
+ */
+template <template<typename> class WRAPPER, typename T>
+WRAPPER<T> llwrap(const T& listener)
+{
+ return WRAPPER<T>(listener);
+}
+
+/**
+ * This LLListenerWrapper template subclass is used to report entry/exit to an
+ * event listener, by changing this:
+ * @code
+ * someEventPump.listen("MyClass",
+ * boost::bind(&MyClass::method, ptr, _1));
+ * @endcode
+ * to this:
+ * @code
+ * someEventPump.listen("MyClass",
+ * llwrap<LLCoutListener>(
+ * boost::bind(&MyClass::method, ptr, _1)));
+ * @endcode
+ */
+template <class LISTENER>
+class LLCoutListener: public LLListenerWrapper<LISTENER>
+{
+ typedef LLListenerWrapper<LISTENER> super;
+
+public:
+ /// Wrap an arbitrary listener object
+ LLCoutListener(const LISTENER& listener):
+ super(listener)
+ {}
+
+ /// call
+ virtual bool operator()(const LLSD& event)
+ {
+ std::cout << "Entering listener " << *super::mName << " with " << event << std::endl;
+ bool handled = super::operator()(event);
+ std::cout << "Leaving listener " << *super::mName;
+ if (handled)
+ {
+ std::cout << " (handled)";
+ }
+ std::cout << std::endl;
+ return handled;
+ }
+};
+
+LLLISTENER_WRAPPER_SUBCLASS(LLCoutListener);
+
+/**
+ * This LLListenerWrapper template subclass is used to log entry/exit to an
+ * event listener, by changing this:
+ * @code
+ * someEventPump.listen("MyClass",
+ * boost::bind(&MyClass::method, ptr, _1));
+ * @endcode
+ * to this:
+ * @code
+ * someEventPump.listen("MyClass",
+ * llwrap<LLLogListener>(
+ * boost::bind(&MyClass::method, ptr, _1)));
+ * @endcode
+ */
+template <class LISTENER>
+class LLLogListener: public LLListenerWrapper<LISTENER>
+{
+ typedef LLListenerWrapper<LISTENER> super;
+
+public:
+ /// Wrap an arbitrary listener object
+ LLLogListener(const LISTENER& listener):
+ super(listener)
+ {}
+
+ /// call
+ virtual bool operator()(const LLSD& event)
+ {
+ LL_DEBUGS("LLLogListener") << "Entering listener " << *super::mName << " with " << event << LL_ENDL;
+ bool handled = super::operator()(event);
+ LL_DEBUGS("LLLogListener") << "Leaving listener " << *super::mName;
+ if (handled)
+ {
+ LL_CONT << " (handled)";
+ }
+ LL_CONT << LL_ENDL;
+ return handled;
+ }
+};
+
+LLLISTENER_WRAPPER_SUBCLASS(LLLogListener);
+
+#endif /* ! defined(LL_LLLISTENERWRAPPER_H) */
diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp
index effda6c49c..5ca90d82ba 100644
--- a/indra/llcommon/lllivefile.cpp
+++ b/indra/llcommon/lllivefile.cpp
@@ -33,7 +33,7 @@
#include "lllivefile.h"
#include "llframetimer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f;
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 09f19532b7..1c6f64dd8b 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -1,65 +1,65 @@
-/**
- * @file llmemory.h
- * @brief Memory allocation/deallocation header-stuff goes here.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- *
- * Copyright (c) 2002-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-#ifndef LLMEMORY_H
-#define LLMEMORY_H
-
-
-
-extern S32 gTotalDAlloc;
-extern S32 gTotalDAUse;
-extern S32 gDACount;
-
-extern void* ll_allocate (size_t size);
-extern void ll_release (void *p);
-
-class LL_COMMON_API LLMemory
-{
-public:
- static void initClass();
- static void cleanupClass();
- static void freeReserve();
- // Return the resident set size of the current process, in bytes.
- // Return value is zero if not known.
- static U64 getCurrentRSS();
-private:
- static char* reserveMem;
-};
-
-// LLRefCount moved to llrefcount.h
-
-// LLPointer moved to llpointer.h
-
-// LLSafeHandle moved to llsafehandle.h
-
-// LLSingleton moved to llsingleton.h
-
-#endif
+/**
+ * @file llmemory.h
+ * @brief Memory allocation/deallocation header-stuff goes here.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLMEMORY_H
+#define LLMEMORY_H
+
+
+
+extern S32 gTotalDAlloc;
+extern S32 gTotalDAUse;
+extern S32 gDACount;
+
+extern void* ll_allocate (size_t size);
+extern void ll_release (void *p);
+
+class LL_COMMON_API LLMemory
+{
+public:
+ static void initClass();
+ static void cleanupClass();
+ static void freeReserve();
+ // Return the resident set size of the current process, in bytes.
+ // Return value is zero if not known.
+ static U64 getCurrentRSS();
+private:
+ static char* reserveMem;
+};
+
+// LLRefCount moved to llrefcount.h
+
+// LLPointer moved to llpointer.h
+
+// LLSafeHandle moved to llsafehandle.h
+
+// LLSingleton moved to llsingleton.h
+
+#endif
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h
index 5952a3a7c5..677fad3034 100644
--- a/indra/llcommon/llmemtype.h
+++ b/indra/llcommon/llmemtype.h
@@ -1,248 +1,248 @@
-/**
- * @file llmemtype.h
- * @brief Runtime memory usage debugging utilities.
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- *
- * Copyright (c) 2005-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_MEMTYPE_H
-#define LL_MEMTYPE_H
-
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-
-#include "linden_common.h"
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// WARNING: Never commit with MEM_TRACK_MEM == 1
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-#define MEM_TRACK_MEM (0 && LL_WINDOWS)
-
-#include <vector>
-
-#define MEM_TYPE_NEW(T)
-
-class LL_COMMON_API LLMemType
-{
-public:
-
- // class we'll initialize all instances of as
- // static members of MemType. Then use
- // to construct any new mem type.
- class LL_COMMON_API DeclareMemType
- {
- public:
- DeclareMemType(char const * st);
- ~DeclareMemType();
-
- S32 mID;
- char const * mName;
-
- // array so we can map an index ID to Name
- static std::vector<char const *> mNameList;
- };
-
- LLMemType(DeclareMemType& dt);
- ~LLMemType();
-
- static char const * getNameFromID(S32 id);
-
- static DeclareMemType MTYPE_INIT;
- static DeclareMemType MTYPE_STARTUP;
- static DeclareMemType MTYPE_MAIN;
- static DeclareMemType MTYPE_FRAME;
-
- static DeclareMemType MTYPE_GATHER_INPUT;
- static DeclareMemType MTYPE_JOY_KEY;
-
- static DeclareMemType MTYPE_IDLE;
- static DeclareMemType MTYPE_IDLE_PUMP;
- static DeclareMemType MTYPE_IDLE_NETWORK;
- static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
- static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
- static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
- static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
- static DeclareMemType MTYPE_IDLE_AUDIO;
-
- static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
- static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
- static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
-
- static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
- static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
-
- static DeclareMemType MTYPE_RENDER;
- static DeclareMemType MTYPE_SLEEP;
-
- static DeclareMemType MTYPE_NETWORK;
- static DeclareMemType MTYPE_PHYSICS;
- static DeclareMemType MTYPE_INTERESTLIST;
-
- static DeclareMemType MTYPE_IMAGEBASE;
- static DeclareMemType MTYPE_IMAGERAW;
- static DeclareMemType MTYPE_IMAGEFORMATTED;
-
- static DeclareMemType MTYPE_APPFMTIMAGE;
- static DeclareMemType MTYPE_APPRAWIMAGE;
- static DeclareMemType MTYPE_APPAUXRAWIMAGE;
-
- static DeclareMemType MTYPE_DRAWABLE;
-
- static DeclareMemType MTYPE_OBJECT;
- static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
- static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
-
- static DeclareMemType MTYPE_DISPLAY;
- static DeclareMemType MTYPE_DISPLAY_UPDATE;
- static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
- static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
- static DeclareMemType MTYPE_DISPLAY_SWAP;
- static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
- static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
- static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
- static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
- static DeclareMemType MTYPE_DISPLAY_SKY;
- static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
- static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
- static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
- static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
-
- static DeclareMemType MTYPE_VERTEX_DATA;
- static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
- static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
- static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
- static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
- static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;
- static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
- static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
- static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
- static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
- static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
- static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
- static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
- static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
- static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
- static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
- static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
- static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
- static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
-
- static DeclareMemType MTYPE_SPACE_PARTITION;
-
- static DeclareMemType MTYPE_PIPELINE;
- static DeclareMemType MTYPE_PIPELINE_INIT;
- static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
- static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
- static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
- static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
- static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
- static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
- static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
- static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
- static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
- static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
- static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
- static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
- static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
- static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
- static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
- static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
- static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
- static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
- static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
- static DeclareMemType MTYPE_PIPELINE_POST_SORT;
-
- static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
- static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
- static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
- static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
- static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
- static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
- static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
- static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
- static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
- static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
- static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
- static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
-
- static DeclareMemType MTYPE_UPKEEP_POOLS;
-
- static DeclareMemType MTYPE_AVATAR;
- static DeclareMemType MTYPE_AVATAR_MESH;
- static DeclareMemType MTYPE_PARTICLES;
- static DeclareMemType MTYPE_REGIONS;
-
- static DeclareMemType MTYPE_INVENTORY;
- static DeclareMemType MTYPE_INVENTORY_DRAW;
- static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
- static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
- static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
- static DeclareMemType MTYPE_INVENTORY_FROM_XML;
- static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
- static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
- static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
- static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
-
- static DeclareMemType MTYPE_ANIMATION;
- static DeclareMemType MTYPE_VOLUME;
- static DeclareMemType MTYPE_PRIMITIVE;
-
- static DeclareMemType MTYPE_SCRIPT;
- static DeclareMemType MTYPE_SCRIPT_RUN;
- static DeclareMemType MTYPE_SCRIPT_BYTECODE;
-
- static DeclareMemType MTYPE_IO_PUMP;
- static DeclareMemType MTYPE_IO_TCP;
- static DeclareMemType MTYPE_IO_BUFFER;
- static DeclareMemType MTYPE_IO_HTTP_SERVER;
- static DeclareMemType MTYPE_IO_SD_SERVER;
- static DeclareMemType MTYPE_IO_SD_CLIENT;
- static DeclareMemType MTYPE_IO_URL_REQUEST;
-
- static DeclareMemType MTYPE_DIRECTX_INIT;
-
- static DeclareMemType MTYPE_TEMP1;
- static DeclareMemType MTYPE_TEMP2;
- static DeclareMemType MTYPE_TEMP3;
- static DeclareMemType MTYPE_TEMP4;
- static DeclareMemType MTYPE_TEMP5;
- static DeclareMemType MTYPE_TEMP6;
- static DeclareMemType MTYPE_TEMP7;
- static DeclareMemType MTYPE_TEMP8;
- static DeclareMemType MTYPE_TEMP9;
-
- static DeclareMemType MTYPE_OTHER; // Special; used by display code
-
- S32 mTypeIndex;
-};
-
-//----------------------------------------------------------------------------
-
-#endif
-
+/**
+ * @file llmemtype.h
+ * @brief Runtime memory usage debugging utilities.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_MEMTYPE_H
+#define LL_MEMTYPE_H
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+
+#include "linden_common.h"
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// WARNING: Never commit with MEM_TRACK_MEM == 1
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#define MEM_TRACK_MEM (0 && LL_WINDOWS)
+
+#include <vector>
+
+#define MEM_TYPE_NEW(T)
+
+class LL_COMMON_API LLMemType
+{
+public:
+
+ // class we'll initialize all instances of as
+ // static members of MemType. Then use
+ // to construct any new mem type.
+ class LL_COMMON_API DeclareMemType
+ {
+ public:
+ DeclareMemType(char const * st);
+ ~DeclareMemType();
+
+ S32 mID;
+ char const * mName;
+
+ // array so we can map an index ID to Name
+ static std::vector<char const *> mNameList;
+ };
+
+ LLMemType(DeclareMemType& dt);
+ ~LLMemType();
+
+ static char const * getNameFromID(S32 id);
+
+ static DeclareMemType MTYPE_INIT;
+ static DeclareMemType MTYPE_STARTUP;
+ static DeclareMemType MTYPE_MAIN;
+ static DeclareMemType MTYPE_FRAME;
+
+ static DeclareMemType MTYPE_GATHER_INPUT;
+ static DeclareMemType MTYPE_JOY_KEY;
+
+ static DeclareMemType MTYPE_IDLE;
+ static DeclareMemType MTYPE_IDLE_PUMP;
+ static DeclareMemType MTYPE_IDLE_NETWORK;
+ static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
+ static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
+ static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
+ static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
+ static DeclareMemType MTYPE_IDLE_AUDIO;
+
+ static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
+ static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
+ static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
+
+ static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
+ static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
+
+ static DeclareMemType MTYPE_RENDER;
+ static DeclareMemType MTYPE_SLEEP;
+
+ static DeclareMemType MTYPE_NETWORK;
+ static DeclareMemType MTYPE_PHYSICS;
+ static DeclareMemType MTYPE_INTERESTLIST;
+
+ static DeclareMemType MTYPE_IMAGEBASE;
+ static DeclareMemType MTYPE_IMAGERAW;
+ static DeclareMemType MTYPE_IMAGEFORMATTED;
+
+ static DeclareMemType MTYPE_APPFMTIMAGE;
+ static DeclareMemType MTYPE_APPRAWIMAGE;
+ static DeclareMemType MTYPE_APPAUXRAWIMAGE;
+
+ static DeclareMemType MTYPE_DRAWABLE;
+
+ static DeclareMemType MTYPE_OBJECT;
+ static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
+ static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
+
+ static DeclareMemType MTYPE_DISPLAY;
+ static DeclareMemType MTYPE_DISPLAY_UPDATE;
+ static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
+ static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
+ static DeclareMemType MTYPE_DISPLAY_SWAP;
+ static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
+ static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
+ static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
+ static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
+ static DeclareMemType MTYPE_DISPLAY_SKY;
+ static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
+ static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
+ static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
+ static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
+
+ static DeclareMemType MTYPE_VERTEX_DATA;
+ static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
+ static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
+ static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
+ static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
+ static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
+ static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
+ static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
+ static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
+ static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
+ static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
+ static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
+ static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
+
+ static DeclareMemType MTYPE_SPACE_PARTITION;
+
+ static DeclareMemType MTYPE_PIPELINE;
+ static DeclareMemType MTYPE_PIPELINE_INIT;
+ static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
+ static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
+ static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
+ static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
+ static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
+ static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
+ static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
+ static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
+ static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
+ static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
+ static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
+ static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
+ static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
+ static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
+ static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
+ static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
+ static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
+ static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
+ static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
+ static DeclareMemType MTYPE_PIPELINE_POST_SORT;
+
+ static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
+ static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
+ static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
+ static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
+ static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
+
+ static DeclareMemType MTYPE_UPKEEP_POOLS;
+
+ static DeclareMemType MTYPE_AVATAR;
+ static DeclareMemType MTYPE_AVATAR_MESH;
+ static DeclareMemType MTYPE_PARTICLES;
+ static DeclareMemType MTYPE_REGIONS;
+
+ static DeclareMemType MTYPE_INVENTORY;
+ static DeclareMemType MTYPE_INVENTORY_DRAW;
+ static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
+ static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
+ static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
+ static DeclareMemType MTYPE_INVENTORY_FROM_XML;
+ static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
+ static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
+ static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
+ static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
+
+ static DeclareMemType MTYPE_ANIMATION;
+ static DeclareMemType MTYPE_VOLUME;
+ static DeclareMemType MTYPE_PRIMITIVE;
+
+ static DeclareMemType MTYPE_SCRIPT;
+ static DeclareMemType MTYPE_SCRIPT_RUN;
+ static DeclareMemType MTYPE_SCRIPT_BYTECODE;
+
+ static DeclareMemType MTYPE_IO_PUMP;
+ static DeclareMemType MTYPE_IO_TCP;
+ static DeclareMemType MTYPE_IO_BUFFER;
+ static DeclareMemType MTYPE_IO_HTTP_SERVER;
+ static DeclareMemType MTYPE_IO_SD_SERVER;
+ static DeclareMemType MTYPE_IO_SD_CLIENT;
+ static DeclareMemType MTYPE_IO_URL_REQUEST;
+
+ static DeclareMemType MTYPE_DIRECTX_INIT;
+
+ static DeclareMemType MTYPE_TEMP1;
+ static DeclareMemType MTYPE_TEMP2;
+ static DeclareMemType MTYPE_TEMP3;
+ static DeclareMemType MTYPE_TEMP4;
+ static DeclareMemType MTYPE_TEMP5;
+ static DeclareMemType MTYPE_TEMP6;
+ static DeclareMemType MTYPE_TEMP7;
+ static DeclareMemType MTYPE_TEMP8;
+ static DeclareMemType MTYPE_TEMP9;
+
+ static DeclareMemType MTYPE_OTHER; // Special; used by display code
+
+ S32 mTypeIndex;
+};
+
+//----------------------------------------------------------------------------
+
+#endif
+
diff --git a/indra/llcommon/llpointer.h b/indra/llcommon/llpointer.h
index 2c37eadcc6..e6c736a263 100644
--- a/indra/llcommon/llpointer.h
+++ b/indra/llcommon/llpointer.h
@@ -95,7 +95,6 @@ public:
bool notNull() const { return (mPointer != NULL); }
operator Type*() const { return mPointer; }
- operator const Type*() const { return mPointer; }
bool operator !=(Type* ptr) const { return (mPointer != ptr); }
bool operator ==(Type* ptr) const { return (mPointer == ptr); }
bool operator ==(const LLPointer<Type>& ptr) const { return (mPointer == ptr.mPointer); }
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 48baa50edb..1c1503ca7b 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -1,168 +1,188 @@
-/**
- * @file llpreprocessor.h
- * @brief This file should be included in all Linden Lab files and
- * should only contain special preprocessor directives
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLPREPROCESSOR_H
-#define LLPREPROCESSOR_H
-
-// Figure out endianness of platform
-#ifdef LL_LINUX
-#define __ENABLE_WSTRING
-#include <endian.h>
-#endif // LL_LINUX
-
-#if LL_SOLARIS
-# ifdef __sparc // Since we're talking Solaris 10 and up, only 64 bit is supported.
-# define LL_BIG_ENDIAN 1
-# define LL_SOLARIS_ALIGNED_CPU 1 // used to designate issues where SPARC alignment is addressed
-# define LL_SOLARIS_NON_MESA_GL 1 // The SPARC GL does not provide a MESA-based GL API
-# endif
-# include <sys/isa_defs.h> // ensure we know which end is up
-#endif // LL_SOLARIS
-
-#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
-#define LL_LITTLE_ENDIAN 1
-#else
-#define LL_BIG_ENDIAN 1
-#endif
-
-// Per-compiler switches
-#ifdef __GNUC__
-#define LL_FORCE_INLINE inline __attribute__((always_inline))
-#else
-#define LL_FORCE_INLINE __forceinline
-#endif
-
-// Figure out differences between compilers
-#if defined(__GNUC__)
- #define GCC_VERSION (__GNUC__ * 10000 \
- + __GNUC_MINOR__ * 100 \
- + __GNUC_PATCHLEVEL__)
- #ifndef LL_GNUC
- #define LL_GNUC 1
- #endif
-#elif defined(__MSVC_VER__) || defined(_MSC_VER)
- #ifndef LL_MSVC
- #define LL_MSVC 1
- #endif
- #if _MSC_VER < 1400
- #define LL_MSVC7 //Visual C++ 2003 or earlier
- #endif
-#endif
-
-// Deal with minor differences on Unixy OSes.
-#if LL_DARWIN || LL_LINUX
- // Different name, same functionality.
- #define stricmp strcasecmp
- #define strnicmp strncasecmp
-
- // Not sure why this is different, but...
- #ifndef MAX_PATH
- #define MAX_PATH PATH_MAX
- #endif // not MAX_PATH
-
-#endif
-
-
-// Static linking with apr on windows needs to be declared.
-#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
-#ifndef APR_DECLARE_STATIC
-#define APR_DECLARE_STATIC // For APR on Windows
-#endif
-#ifndef APU_DECLARE_STATIC
-#define APU_DECLARE_STATIC // For APR util on Windows
-#endif
-#endif
-
-#if defined(LL_WINDOWS)
-#define BOOST_REGEX_NO_LIB 1
-#define CURL_STATICLIB 1
-#ifndef XML_STATIC
-#define XML_STATIC
-#endif
-#endif // LL_WINDOWS
-
-
-// Deal with VC6 problems
-#if LL_MSVC
-#pragma warning( 3 : 4701 ) // "local variable used without being initialized" Treat this as level 3, not level 4.
-#pragma warning( 3 : 4702 ) // "unreachable code" Treat this as level 3, not level 4.
-#pragma warning( 3 : 4189 ) // "local variable initialized but not referenced" Treat this as level 3, not level 4.
-//#pragma warning( 3 : 4018 ) // "signed/unsigned mismatch" Treat this as level 3, not level 4.
-#pragma warning( 3 : 4263 ) // 'function' : member function does not override any base class virtual member function
-#pragma warning( 3 : 4264 ) // "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
-#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual"
-#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden
-#pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file
-#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
-#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
-#pragma warning( disable : 4996 ) // warning: deprecated
-
-// level 4 warnings that we need to disable:
-#pragma warning (disable : 4100) // unreferenced formal parameter
-#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
-#pragma warning (disable : 4244) // possible loss of data on conversions
-#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
-#pragma warning (disable : 4512) // assignment operator could not be generated
-#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
-
-#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
-#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
-#endif // LL_MSVC
-
-#if LL_WINDOWS
-#define LL_DLLEXPORT __declspec(dllexport)
-#define LL_DLLIMPORT __declspec(dllimport)
-#elif LL_LINUX
-#define LL_DLLEXPORT __attribute__ ((visibility("default")))
-#define LL_DLLIMPORT
-#else
-#define LL_DLLEXPORT
-#define LL_DLLIMPORT
-#endif // LL_WINDOWS
-
-#if LL_COMMON_LINK_SHARED
-// CMake automagically defines llcommon_EXPORTS only when building llcommon
-// sources, and only when llcommon is a shared library (i.e. when
-// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
-// otherwise we can't distinguish between (non-llcommon source) and (llcommon
-// not shared).
-# if defined(llcommon_EXPORTS)
-# define LL_COMMON_API LL_DLLEXPORT
-# else //llcommon_EXPORTS
-# define LL_COMMON_API LL_DLLIMPORT
-# endif //llcommon_EXPORTS
-#else // LL_COMMON_LINK_SHARED
-# define LL_COMMON_API
-#endif // LL_COMMON_LINK_SHARED
-
-#endif // not LL_LINDEN_PREPROCESSOR_H
+/**
+ * @file llpreprocessor.h
+ * @brief This file should be included in all Linden Lab files and
+ * should only contain special preprocessor directives
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLPREPROCESSOR_H
+#define LLPREPROCESSOR_H
+
+// Figure out endianness of platform
+#ifdef LL_LINUX
+#define __ENABLE_WSTRING
+#include <endian.h>
+#endif // LL_LINUX
+
+#if LL_SOLARIS
+# ifdef __sparc // Since we're talking Solaris 10 and up, only 64 bit is supported.
+# define LL_BIG_ENDIAN 1
+# define LL_SOLARIS_ALIGNED_CPU 1 // used to designate issues where SPARC alignment is addressed
+# define LL_SOLARIS_NON_MESA_GL 1 // The SPARC GL does not provide a MESA-based GL API
+# endif
+# include <sys/isa_defs.h> // ensure we know which end is up
+#endif // LL_SOLARIS
+
+#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
+#define LL_LITTLE_ENDIAN 1
+#else
+#define LL_BIG_ENDIAN 1
+#endif
+
+
+// Per-compiler switches
+
+#ifdef __GNUC__
+#define LL_FORCE_INLINE inline __attribute__((always_inline))
+#else
+#define LL_FORCE_INLINE __forceinline
+#endif
+
+// Mark-up expressions with branch prediction hints. Do NOT use
+// this with reckless abandon - it's an obfuscating micro-optimization
+// outside of inner loops or other places where you are OVERWHELMINGLY
+// sure which way an expression almost-always evaluates.
+#if __GNUC__ >= 3
+# define LL_LIKELY(EXPR) __builtin_expect (!!(EXPR), true)
+# define LL_UNLIKELY(EXPR) __builtin_expect (!!(EXPR), false)
+#else
+# define LL_LIKELY(EXPR) (EXPR)
+# define LL_UNLIKELY(EXPR) (EXPR)
+#endif
+
+
+// Figure out differences between compilers
+#if defined(__GNUC__)
+ #define GCC_VERSION (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+ #ifndef LL_GNUC
+ #define LL_GNUC 1
+ #endif
+#elif defined(__MSVC_VER__) || defined(_MSC_VER)
+ #ifndef LL_MSVC
+ #define LL_MSVC 1
+ #endif
+ #if _MSC_VER < 1400
+ #define LL_MSVC7 //Visual C++ 2003 or earlier
+ #endif
+#endif
+
+// Deal with minor differences on Unixy OSes.
+#if LL_DARWIN || LL_LINUX
+ // Different name, same functionality.
+ #define stricmp strcasecmp
+ #define strnicmp strncasecmp
+
+ // Not sure why this is different, but...
+ #ifndef MAX_PATH
+ #define MAX_PATH PATH_MAX
+ #endif // not MAX_PATH
+
+#endif
+
+
+// Static linking with apr on windows needs to be declared.
+#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
+#ifndef APR_DECLARE_STATIC
+#define APR_DECLARE_STATIC // For APR on Windows
+#endif
+#ifndef APU_DECLARE_STATIC
+#define APU_DECLARE_STATIC // For APR util on Windows
+#endif
+#endif
+
+#if defined(LL_WINDOWS)
+#define BOOST_REGEX_NO_LIB 1
+#define CURL_STATICLIB 1
+#ifndef XML_STATIC
+#define XML_STATIC
+#endif
+#endif // LL_WINDOWS
+
+
+// Deal with VC6 problems
+#if LL_MSVC
+#pragma warning( 3 : 4701 ) // "local variable used without being initialized" Treat this as level 3, not level 4.
+#pragma warning( 3 : 4702 ) // "unreachable code" Treat this as level 3, not level 4.
+#pragma warning( 3 : 4189 ) // "local variable initialized but not referenced" Treat this as level 3, not level 4.
+//#pragma warning( 3 : 4018 ) // "signed/unsigned mismatch" Treat this as level 3, not level 4.
+#pragma warning( 3 : 4263 ) // 'function' : member function does not override any base class virtual member function
+#pragma warning( 3 : 4264 ) // "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
+#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual"
+#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden
+#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
+#pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file
+#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
+#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
+#pragma warning( disable : 4996 ) // warning: deprecated
+
+// Linker optimization with "extern template" generates these warnings
+#pragma warning( disable : 4231 ) // nonstandard extension used : 'extern' before template explicit instantiation
+#pragma warning( disable : 4506 ) // no definition for inline function
+
+// level 4 warnings that we need to disable:
+#pragma warning (disable : 4100) // unreferenced formal parameter
+#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
+#pragma warning (disable : 4244) // possible loss of data on conversions
+#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
+#pragma warning (disable : 4512) // assignment operator could not be generated
+#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
+
+#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
+#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
+#endif // LL_MSVC
+
+#if LL_WINDOWS
+#define LL_DLLEXPORT __declspec(dllexport)
+#define LL_DLLIMPORT __declspec(dllimport)
+#elif LL_LINUX
+#define LL_DLLEXPORT __attribute__ ((visibility("default")))
+#define LL_DLLIMPORT
+#else
+#define LL_DLLEXPORT
+#define LL_DLLIMPORT
+#endif // LL_WINDOWS
+
+#if LL_COMMON_LINK_SHARED
+// CMake automagically defines llcommon_EXPORTS only when building llcommon
+// sources, and only when llcommon is a shared library (i.e. when
+// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
+// otherwise we can't distinguish between (non-llcommon source) and (llcommon
+// not shared).
+# if defined(llcommon_EXPORTS)
+# define LL_COMMON_API LL_DLLEXPORT
+# else //llcommon_EXPORTS
+# define LL_COMMON_API LL_DLLIMPORT
+# endif //llcommon_EXPORTS
+#else // LL_COMMON_LINK_SHARED
+# define LL_COMMON_API
+#endif // LL_COMMON_LINK_SHARED
+
+#endif // not LL_LINDEN_PREPROCESSOR_H
diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h
index 880562157f..929d547f6e 100644
--- a/indra/llcommon/llprocesslauncher.h
+++ b/indra/llcommon/llprocesslauncher.h
@@ -70,6 +70,14 @@ public:
// This needs to be called periodically on Mac/Linux to clean up zombie processes.
static void reap(void);
+
+ // Accessors for platform-specific process ID
+#if LL_WINDOWS
+ HANDLE getProcessHandle() { return mProcessHandle; };
+#else
+ pid_t getProcessID() { return mProcessID; };
+#endif
+
private:
std::string mExecutable;
std::string mWorkingDir;
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 469e544b16..8a4a4a8f9a 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -281,7 +281,8 @@ bool CProcessor::AnalyzeIntelProcessor()
// already have a string here from GetCPUInfo(). JC
if ( CPUInfo.uiBrandID < LL_ARRAY_SIZE(INTEL_BRAND) )
{
- strcpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID]);
+ strncpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID], sizeof(CPUInfo.strBrandID)-1);
+ CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0';
if (CPUInfo.uiBrandID == 3 && CPUInfo.uiModel == 6)
{
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index 3db5c36545..06ceeb2bc3 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -42,7 +42,8 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
LLThread(name),
mThreaded(threaded),
mIdleThread(TRUE),
- mNextHandle(0)
+ mNextHandle(0),
+ mStarted(FALSE)
{
if (mThreaded)
{
@@ -53,6 +54,10 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
// MAIN THREAD
LLQueuedThread::~LLQueuedThread()
{
+ if (!mThreaded)
+ {
+ endThread();
+ }
shutdown();
// ~LLThread() will be called here
}
@@ -91,6 +96,7 @@ void LLQueuedThread::shutdown()
if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS)
{
++active_count;
+ req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest
}
req->deleteRequest();
}
@@ -106,6 +112,14 @@ void LLQueuedThread::shutdown()
// virtual
S32 LLQueuedThread::update(U32 max_time_ms)
{
+ if (!mStarted)
+ {
+ if (!mThreaded)
+ {
+ startThread();
+ mStarted = TRUE;
+ }
+ }
return updateQueue(max_time_ms);
}
@@ -423,6 +437,7 @@ S32 LLQueuedThread::processNextRequest()
if (req)
{
// process request
+ U32 start_priority = req->getPriority();
bool complete = req->processRequest();
if (complete)
@@ -443,35 +458,20 @@ S32 LLQueuedThread::processNextRequest()
lockData();
req->setStatus(STATUS_QUEUED);
mRequestQueue.insert(req);
- U32 priority = req->getPriority();
unlockData();
- if (priority < PRIORITY_NORMAL)
+ if (mThreaded && start_priority <= PRIORITY_LOW)
{
ms_sleep(1); // sleep the thread a little
}
}
}
- S32 res;
S32 pending = getPending();
- if (pending == 0)
- {
- if (isQuitting())
- {
- res = -1; // exit thread
- }
- else
- {
- res = 0;
- }
- }
- else
- {
- res = pending;
- }
- return res;
+
+ return pending;
}
+// virtual
bool LLQueuedThread::runCondition()
{
// mRunCondition must be locked here
@@ -481,35 +481,53 @@ bool LLQueuedThread::runCondition()
return true;
}
+// virtual
void LLQueuedThread::run()
{
+ // call checPause() immediately so we don't try to do anything before the class is fully constructed
+ checkPause();
+ startThread();
+ mStarted = TRUE;
+
while (1)
{
// this will block on the condition until runCondition() returns true, the thread is unpaused, or the thread leaves the RUNNING state.
checkPause();
- if(isQuitting())
+ if (isQuitting())
+ {
+ endThread();
break;
-
- //llinfos << "QUEUED THREAD RUNNING, queue size = " << mRequestQueue.size() << llendl;
+ }
mIdleThread = FALSE;
+
+ threadedUpdate();
int res = processNextRequest();
if (res == 0)
{
mIdleThread = TRUE;
+ ms_sleep(1);
}
-
- if (res < 0) // finished working and want to exit
- {
- break;
- }
-
//LLThread::yield(); // thread should yield after each request
}
+ llinfos << "LLQueuedThread " << mName << " EXITING." << llendl;
+}
+
+// virtual
+void LLQueuedThread::startThread()
+{
+}
- llinfos << "QUEUED THREAD " << mName << " EXITING." << llendl;
+// virtual
+void LLQueuedThread::endThread()
+{
+}
+
+// virtual
+void LLQueuedThread::threadedUpdate()
+{
}
//============================================================================
diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h
index 8bfa5632a1..9a9dbb18cc 100644
--- a/indra/llcommon/llqueuedthread.h
+++ b/indra/llcommon/llqueuedthread.h
@@ -166,6 +166,9 @@ private:
virtual bool runCondition(void);
virtual void run(void);
+ virtual void startThread(void);
+ virtual void endThread(void);
+ virtual void threadedUpdate(void);
protected:
handle_t generateHandle();
@@ -200,6 +203,7 @@ public:
protected:
BOOL mThreaded; // if false, run on main thread and do updates during update()
+ BOOL mStarted; // required when mThreaded is false to call startThread() from update()
LLAtomic32<BOOL> mIdleThread; // request queue is empty (or we are quitting) and the thread is idle
typedef std::set<QueuedRequest*, queued_request_less> request_queue_t;
diff --git a/indra/llcommon/llrefcount.cpp b/indra/llcommon/llrefcount.cpp
index 33b6875fb0..c90b52f482 100644
--- a/indra/llcommon/llrefcount.cpp
+++ b/indra/llcommon/llrefcount.cpp
@@ -35,6 +35,17 @@
#include "llerror.h"
+LLRefCount::LLRefCount(const LLRefCount& other)
+: mRef(0)
+{
+}
+
+LLRefCount& LLRefCount::operator=(const LLRefCount&)
+{
+ // do nothing, since ref count is specific to *this* reference
+ return *this;
+}
+
LLRefCount::LLRefCount() :
mRef(0)
{
diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h
index 9ab844eb22..a18f6706a9 100644
--- a/indra/llcommon/llrefcount.h
+++ b/indra/llcommon/llrefcount.h
@@ -41,22 +41,20 @@
class LL_COMMON_API LLRefCount
{
-private:
- LLRefCount(const LLRefCount& other); // no implementation
-private:
- LLRefCount& operator=(const LLRefCount&); // no implementation
protected:
+ LLRefCount(const LLRefCount& other);
+ LLRefCount& operator=(const LLRefCount&);
virtual ~LLRefCount(); // use unref()
public:
LLRefCount();
- void ref()
+ void ref() const
{
mRef++;
}
- S32 unref()
+ S32 unref() const
{
llassert(mRef >= 1);
if (0 == --mRef)
@@ -67,13 +65,15 @@ public:
return mRef;
}
+ //NOTE: when passing around a const LLRefCount object, this can return different results
+ // at different types, since mRef is mutable
S32 getNumRefs() const
{
return mRef;
}
private:
- S32 mRef;
+ mutable S32 mRef;
};
#endif
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index 9140ebb3f3..c863d4e266 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -355,7 +355,7 @@ namespace
using LLSD::Impl::erase; // Unhiding erase(LLSD::Integer)
using LLSD::Impl::ref; // Unhiding ref(LLSD::Integer)
virtual LLSD get(const LLSD::String&) const;
- LLSD& insert(const LLSD::String& k, const LLSD& v);
+ void insert(const LLSD::String& k, const LLSD& v);
virtual void erase(const LLSD::String&);
LLSD& ref(const LLSD::String&);
virtual const LLSD& ref(const LLSD::String&) const;
@@ -394,14 +394,9 @@ namespace
return (i != mData.end()) ? i->second : LLSD();
}
- LLSD& ImplMap::insert(const LLSD::String& k, const LLSD& v)
+ void ImplMap::insert(const LLSD::String& k, const LLSD& v)
{
mData.insert(DataMap::value_type(k, v));
- #ifdef LL_MSVC7
- return *((LLSD*)this);
- #else
- return *dynamic_cast<LLSD*>(this);
- #endif
}
void ImplMap::erase(const LLSD::String& k)
@@ -450,7 +445,7 @@ namespace
virtual int size() const;
virtual LLSD get(LLSD::Integer) const;
void set(LLSD::Integer, const LLSD&);
- LLSD& insert(LLSD::Integer, const LLSD&);
+ void insert(LLSD::Integer, const LLSD&);
void append(const LLSD&);
virtual void erase(LLSD::Integer);
LLSD& ref(LLSD::Integer);
@@ -499,14 +494,10 @@ namespace
mData[index] = v;
}
- LLSD& ImplArray::insert(LLSD::Integer i, const LLSD& v)
+ void ImplArray::insert(LLSD::Integer i, const LLSD& v)
{
if (i < 0) {
- #ifdef LL_MSVC7
- return *((LLSD*)this);
- #else
- return *dynamic_cast<LLSD*>(this);
- #endif
+ return;
}
DataVector::size_type index = i;
@@ -516,11 +507,6 @@ namespace
}
mData.insert(mData.begin() + index, v);
- #ifdef LL_MSVC7
- return *((LLSD*)this);
- #else
- return *dynamic_cast<LLSD*>(this);
- #endif
}
void ImplArray::append(const LLSD& v)
@@ -763,11 +749,12 @@ LLSD LLSD::emptyMap()
bool LLSD::has(const String& k) const { return safe(impl).has(k); }
LLSD LLSD::get(const String& k) const { return safe(impl).get(k); }
+void LLSD::insert(const String& k, const LLSD& v) { makeMap(impl).insert(k, v); }
-LLSD& LLSD::insert(const String& k, const LLSD& v)
+LLSD& LLSD::with(const String& k, const LLSD& v)
{
makeMap(impl).insert(k, v);
- return *dynamic_cast<LLSD*>(this);
+ return *this;
}
void LLSD::erase(const String& k) { makeMap(impl).erase(k); }
@@ -788,8 +775,9 @@ int LLSD::size() const { return safe(impl).size(); }
LLSD LLSD::get(Integer i) const { return safe(impl).get(i); }
void LLSD::set(Integer i, const LLSD& v){ makeArray(impl).set(i, v); }
+void LLSD::insert(Integer i, const LLSD& v) { makeArray(impl).insert(i, v); }
-LLSD& LLSD::insert(Integer i, const LLSD& v)
+LLSD& LLSD::with(Integer i, const LLSD& v)
{
makeArray(impl).insert(i, v);
return *this;
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 552bb57498..135133c19c 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -223,8 +223,9 @@ public:
bool has(const String&) const;
LLSD get(const String&) const;
- LLSD& insert(const String&, const LLSD&);
+ void insert(const String&, const LLSD&);
void erase(const String&);
+ LLSD& with(const String&, const LLSD&);
LLSD& operator[](const String&);
LLSD& operator[](const char* c) { return (*this)[String(c)]; }
@@ -238,9 +239,10 @@ public:
LLSD get(Integer) const;
void set(Integer, const LLSD&);
- LLSD& insert(Integer, const LLSD&);
+ void insert(Integer, const LLSD&);
void append(const LLSD&);
void erase(Integer);
+ LLSD& with(Integer, const LLSD&);
const LLSD& operator[](Integer) const;
LLSD& operator[](Integer);
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index 7e1c2e35e0..fca173df47 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -139,12 +139,8 @@ S32 LLSDXMLFormatter::format_impl(const LLSD& data, std::ostream& ostr, U32 opti
case LLSD::TypeBoolean:
ostr << pre << "<boolean>";
if(mBoolAlpha ||
-#if( LL_WINDOWS || __GNUC__ > 2)
(ostr.flags() & std::ios::boolalpha)
-#else
- (ostr.flags() & 0x0100)
-#endif
- )
+ )
{
ostr << (data.asBoolean() ? "true" : "false");
}
@@ -511,12 +507,7 @@ void LLSDXMLParser::Impl::reset()
mSkipping = false;
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
-
XML_ParserReset(mParser, "utf-8");
XML_SetUserData(mParser, this);
@@ -644,11 +635,7 @@ void LLSDXMLParser::Impl::startElementHandler(const XML_Char* name, const XML_Ch
LLSD& newElement = map[mCurrentKey];
mStack.push_back(&newElement);
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
}
else if (mStack.back()->isArray())
{
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index f55fafadd8..ddeb4d1489 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -35,7 +35,6 @@
#include <typeinfo>
#include <boost/noncopyable.hpp>
-#include <boost/any.hpp>
/// @brief A global registry of all singletons to prevent duplicate allocations
/// across shared library boundaries
diff --git a/indra/llcommon/llstacktrace.cpp b/indra/llcommon/llstacktrace.cpp
index 3cb074257b..6558df70a4 100644
--- a/indra/llcommon/llstacktrace.cpp
+++ b/indra/llcommon/llstacktrace.cpp
@@ -1,142 +1,142 @@
-/**
- * @file llstacktrace.cpp
- * @brief stack tracing functionality
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "llstacktrace.h"
-
-#ifdef LL_WINDOWS
-
-#include <iostream>
-#include <sstream>
-
-#include "windows.h"
-#include "Dbghelp.h"
-
-typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
- IN ULONG frames_to_skip,
- IN ULONG frames_to_capture,
- OUT PVOID *backtrace,
- OUT PULONG backtrace_hash);
-
-static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
- (RtlCaptureStackBackTrace_Function*)
- GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
- const S32 MAX_STACK_DEPTH = 32;
- const S32 STRING_NAME_LENGTH = 200;
- const S32 FRAME_SKIP = 2;
- static BOOL symbolsLoaded = false;
- static BOOL firstCall = true;
-
- HANDLE hProc = GetCurrentProcess();
-
- // load the symbols if they're not loaded
- if(!symbolsLoaded && firstCall)
- {
- symbolsLoaded = SymInitialize(hProc, NULL, true);
- firstCall = false;
- }
-
- // if loaded, get the call stack
- if(symbolsLoaded)
- {
- // create the frames to hold the addresses
- void* frames[MAX_STACK_DEPTH];
- memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
- S32 depth = 0;
-
- // get the addresses
- depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
-
- IMAGEHLP_LINE64 line;
- memset(&line, 0, sizeof(IMAGEHLP_LINE64));
- line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
-
- // create something to hold address info
- PIMAGEHLP_SYMBOL64 pSym;
- pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
- memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
- pSym->MaxNameLength = STRING_NAME_LENGTH;
- pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
-
- // get address info for each address frame
- // and store
- for(S32 i=0; i < depth; i++)
- {
- std::stringstream stack_line;
- BOOL ret;
-
- DWORD64 addr = (DWORD64)frames[i];
- ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
- if(ret)
- {
- stack_line << pSym->Name << " ";
- }
-
- DWORD dummy;
- ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
- if(ret)
- {
- std::string file_name = line.FileName;
- std::string::size_type index = file_name.rfind("\\");
- stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber;
- }
-
- lines.push_back(stack_line.str());
- }
-
- free(pSym);
-
- // TODO: figure out a way to cleanup symbol loading
- // Not hugely necessary, however.
- //SymCleanup(hProc);
- return true;
- }
- else
- {
- lines.push_back("Stack Trace Failed. PDB symbol info not loaded");
- }
-
- return false;
-}
-
-#else
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
- return false;
-}
-
-#endif
-
+/**
+ * @file llstacktrace.cpp
+ * @brief stack tracing functionality
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llstacktrace.h"
+
+#ifdef LL_WINDOWS
+
+#include <iostream>
+#include <sstream>
+
+#include "windows.h"
+#include "Dbghelp.h"
+
+typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
+ IN ULONG frames_to_skip,
+ IN ULONG frames_to_capture,
+ OUT PVOID *backtrace,
+ OUT PULONG backtrace_hash);
+
+static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
+ (RtlCaptureStackBackTrace_Function*)
+ GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+ const S32 MAX_STACK_DEPTH = 32;
+ const S32 STRING_NAME_LENGTH = 200;
+ const S32 FRAME_SKIP = 2;
+ static BOOL symbolsLoaded = false;
+ static BOOL firstCall = true;
+
+ HANDLE hProc = GetCurrentProcess();
+
+ // load the symbols if they're not loaded
+ if(!symbolsLoaded && firstCall)
+ {
+ symbolsLoaded = SymInitialize(hProc, NULL, true);
+ firstCall = false;
+ }
+
+ // if loaded, get the call stack
+ if(symbolsLoaded)
+ {
+ // create the frames to hold the addresses
+ void* frames[MAX_STACK_DEPTH];
+ memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
+ S32 depth = 0;
+
+ // get the addresses
+ depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
+
+ IMAGEHLP_LINE64 line;
+ memset(&line, 0, sizeof(IMAGEHLP_LINE64));
+ line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+
+ // create something to hold address info
+ PIMAGEHLP_SYMBOL64 pSym;
+ pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+ memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+ pSym->MaxNameLength = STRING_NAME_LENGTH;
+ pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
+
+ // get address info for each address frame
+ // and store
+ for(S32 i=0; i < depth; i++)
+ {
+ std::stringstream stack_line;
+ BOOL ret;
+
+ DWORD64 addr = (DWORD64)frames[i];
+ ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
+ if(ret)
+ {
+ stack_line << pSym->Name << " ";
+ }
+
+ DWORD dummy;
+ ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
+ if(ret)
+ {
+ std::string file_name = line.FileName;
+ std::string::size_type index = file_name.rfind("\\");
+ stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber;
+ }
+
+ lines.push_back(stack_line.str());
+ }
+
+ free(pSym);
+
+ // TODO: figure out a way to cleanup symbol loading
+ // Not hugely necessary, however.
+ //SymCleanup(hProc);
+ return true;
+ }
+ else
+ {
+ lines.push_back("Stack Trace Failed. PDB symbol info not loaded");
+ }
+
+ return false;
+}
+
+#else
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+ return false;
+}
+
+#endif
+
diff --git a/indra/llcommon/llstacktrace.h b/indra/llcommon/llstacktrace.h
index b84b1aa6ad..9f857f0fd3 100644
--- a/indra/llcommon/llstacktrace.h
+++ b/indra/llcommon/llstacktrace.h
@@ -1,44 +1,44 @@
-/**
- * @file llstacktrace.h
- * @brief stack trace functions
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_LLSTACKTRACE_H
-#define LL_LLSTACKTRACE_H
-
-#include "stdtypes.h"
-#include <vector>
-#include <string>
-
-LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
-
-#endif
-
+/**
+ * @file llstacktrace.h
+ * @brief stack trace functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLSTACKTRACE_H
+#define LL_LLSTACKTRACE_H
+
+#include "stdtypes.h"
+#include <vector>
+#include <string>
+
+LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
+
+#endif
+
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index f2edd5c559..5f3d9d6582 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -671,9 +671,9 @@ std::string ll_convert_wide_to_string(const wchar_t* in)
}
#endif // LL_WINDOWS
-long LLStringOps::sltOffset;
-long LLStringOps::localTimeOffset;
-bool LLStringOps::daylightSavings;
+long LLStringOps::sPacificTimeOffset = 0;
+long LLStringOps::sLocalTimeOffset = 0;
+bool LLStringOps::sPacificDaylightTime = 0;
std::map<std::string, std::string> LLStringOps::datetimeToCodes;
S32 LLStringOps::collate(const llwchar* a, const llwchar* b)
@@ -700,11 +700,11 @@ void LLStringOps::setupDatetimeInfo (bool daylight)
tmpT = gmtime (&nowT);
gmtT = mktime (tmpT);
- localTimeOffset = (long) (gmtT - localT);
+ sLocalTimeOffset = (long) (gmtT - localT);
- daylightSavings = daylight;
- sltOffset = (daylightSavings? 7 : 8 ) * 60 * 60;
+ sPacificDaylightTime = daylight;
+ sPacificTimeOffset = (sPacificDaylightTime? 7 : 8 ) * 60 * 60;
datetimeToCodes["wkday"] = "%a"; // Thu
datetimeToCodes["weekday"] = "%A"; // Thursday
@@ -957,36 +957,44 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token,
}
else if (param != "utc") // slt
{
- secFromEpoch -= LLStringOps::getSltOffset();
+ secFromEpoch -= LLStringOps::getPacificTimeOffset();
}
// if never fell into those two ifs above, param must be utc
if (secFromEpoch < 0) secFromEpoch = 0;
- LLDate * datetime = new LLDate((F64)secFromEpoch);
+ LLDate datetime((F64)secFromEpoch);
std::string code = LLStringOps::getDatetimeCode (token);
// special case to handle timezone
if (code == "%Z") {
if (param == "utc")
+ {
replacement = "GMT";
- else if (param == "slt")
- replacement = "SLT";
- else if (param != "local") // *TODO Vadim: not local? then what?
- replacement = LLStringOps::getDaylightSavings() ? "PDT" : "PST";
-
+ }
+ else if (param == "local")
+ {
+ replacement = ""; // user knows their own timezone
+ }
+ else
+ {
+ // "slt" = Second Life Time, which is deprecated.
+ // If not utc or user local time, fallback to Pacific time
+ replacement = LLStringOps::getPacificDaylightTime() ? "PDT" : "PST";
+ }
return true;
}
- replacement = datetime->toHTTPDateString(code);
+ replacement = datetime.toHTTPDateString(code);
- if (code.empty())
+ // *HACK: delete leading zero from hour string in case 'hour12' (code = %I) time format
+ // to show time without leading zero, e.g. 08:16 -> 8:16 (EXT-2738).
+ // We could have used '%l' format instead, but it's not supported by Windows.
+ if(code == "%I" && token == "hour12" && replacement.at(0) == '0')
{
- return false;
- }
- else
- {
- return true;
+ replacement = replacement.at(1);
}
+
+ return !code.empty();
}
// LLStringUtil::format recogizes the following patterns.
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 0f2f05a0d8..62cedcde4e 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1,1297 +1,1301 @@
-/**
- * @file llstring.h
- * @brief String utility functions and std::string class.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSTRING_H
-#define LL_LLSTRING_H
-
-#include <string>
-#include <cstdio>
-#include <locale>
-#include <iomanip>
-#include "llsd.h"
-#include "llfasttimer.h"
-
-#if LL_LINUX || LL_SOLARIS
-#include <wctype.h>
-#include <wchar.h>
-#endif
-
-#include <string.h>
-
-#if LL_SOLARIS
-// stricmp and strnicmp do not exist on Solaris:
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#endif
-
-const char LL_UNKNOWN_CHAR = '?';
-
-#if LL_DARWIN || LL_LINUX || LL_SOLARIS
-// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
-#include <cstring>
-
-namespace std
-{
-template<>
-struct char_traits<U16>
-{
- typedef U16 char_type;
- typedef int int_type;
- typedef streampos pos_type;
- typedef streamoff off_type;
- typedef mbstate_t state_type;
-
- static void
- assign(char_type& __c1, const char_type& __c2)
- { __c1 = __c2; }
-
- static bool
- eq(const char_type& __c1, const char_type& __c2)
- { return __c1 == __c2; }
-
- static bool
- lt(const char_type& __c1, const char_type& __c2)
- { return __c1 < __c2; }
-
- static int
- compare(const char_type* __s1, const char_type* __s2, size_t __n)
- { return memcmp(__s1, __s2, __n * sizeof(char_type)); }
-
- static size_t
- length(const char_type* __s)
- {
- const char_type *cur_char = __s;
- while (*cur_char != 0)
- {
- ++cur_char;
- }
- return cur_char - __s;
- }
-
- static const char_type*
- find(const char_type* __s, size_t __n, const char_type& __a)
- { return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
-
- static char_type*
- move(char_type* __s1, const char_type* __s2, size_t __n)
- { return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
-
- static char_type*
- copy(char_type* __s1, const char_type* __s2, size_t __n)
- { return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); } /* Flawfinder: ignore */
-
- static char_type*
- assign(char_type* __s, size_t __n, char_type __a)
- {
- // This isn't right.
- //return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type)));
-
- // I don't think there's a standard 'memset' for 16-bit values.
- // Do this the old-fashioned way.
-
- size_t __i;
- for(__i = 0; __i < __n; __i++)
- {
- __s[__i] = __a;
- }
- return __s;
- }
-
- static char_type
- to_char_type(const int_type& __c)
- { return static_cast<char_type>(__c); }
-
- static int_type
- to_int_type(const char_type& __c)
- { return static_cast<int_type>(__c); }
-
- static bool
- eq_int_type(const int_type& __c1, const int_type& __c2)
- { return __c1 == __c2; }
-
- static int_type
- eof() { return static_cast<int_type>(EOF); }
-
- static int_type
- not_eof(const int_type& __c)
- { return (__c == eof()) ? 0 : __c; }
- };
-};
-#endif
-
-class LL_COMMON_API LLStringOps
-{
-private:
- static long sltOffset;
- static long localTimeOffset;
- static bool daylightSavings;
- static std::map<std::string, std::string> datetimeToCodes;
-
-public:
- static char toUpper(char elem) { return toupper((unsigned char)elem); }
- static llwchar toUpper(llwchar elem) { return towupper(elem); }
-
- static char toLower(char elem) { return tolower((unsigned char)elem); }
- static llwchar toLower(llwchar elem) { return towlower(elem); }
-
- static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
- static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
-
- static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
- static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
-
- static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
- static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
-
- static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
- static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
-
- static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
- static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
-
- static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
- static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
-
- static S32 collate(const char* a, const char* b) { return strcoll(a, b); }
- static S32 collate(const llwchar* a, const llwchar* b);
-
- static void setupDatetimeInfo (bool daylight);
- static long getSltOffset (void) {return sltOffset;}
- static long getLocalTimeOffset (void) {return localTimeOffset;}
- static bool getDaylightSavings (void) {return daylightSavings;}
- static std::string getDatetimeCode (std::string key);
-};
-
-/**
- * @brief Return a string constructed from in without crashing if the
- * pointer is NULL.
- */
-LL_COMMON_API std::string ll_safe_string(const char* in);
-LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
-
-
-// Allowing assignments from non-strings into format_map_t is apparently
-// *really* error-prone, so subclass std::string with just basic c'tors.
-class LLFormatMapString
-{
-public:
- LLFormatMapString() {};
- LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
- LLFormatMapString(const std::string& s) : mString(s) {};
- operator std::string() const { return mString; }
- bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
- std::size_t length() const { return mString.length(); }
-
-private:
- std::string mString;
-};
-
-template <class T>
-class LLStringUtilBase
-{
-private:
- static std::string sLocale;
-
-public:
- typedef typename std::basic_string<T>::size_type size_type;
-
-public:
- /////////////////////////////////////////////////////////////////////////////////////////
- // Static Utility functions that operate on std::strings
-
- static std::basic_string<T> null;
-
- typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
- LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
- LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
- LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
- LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
- LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
- LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
- LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
- static void setLocale (std::string inLocale) {sLocale = inLocale;};
- static std::string getLocale (void) {return sLocale;};
-
- static bool isValidIndex(const std::basic_string<T>& string, size_type i)
- {
- return !string.empty() && (0 <= i) && (i <= string.size());
- }
-
- static void trimHead(std::basic_string<T>& string);
- static void trimTail(std::basic_string<T>& string);
- static void trim(std::basic_string<T>& string) { trimHead(string); trimTail(string); }
- static void truncate(std::basic_string<T>& string, size_type count);
-
- static void toUpper(std::basic_string<T>& string);
- static void toLower(std::basic_string<T>& string);
-
- // True if this is the head of s.
- static BOOL isHead( const std::basic_string<T>& string, const T* s );
-
- /**
- * @brief Returns true if string starts with substr
- *
- * If etither string or substr are empty, this method returns false.
- */
- static bool startsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr);
-
- /**
- * @brief Returns true if string ends in substr
- *
- * If etither string or substr are empty, this method returns false.
- */
- static bool endsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr);
-
- static void addCRLF(std::basic_string<T>& string);
- static void removeCRLF(std::basic_string<T>& string);
-
- static void replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
- static void replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
- static void replaceChar( std::basic_string<T>& string, T target, T replacement );
- static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
-
- static BOOL containsNonprintable(const std::basic_string<T>& string);
- static void stripNonprintable(std::basic_string<T>& string);
-
- /**
- * @brief Unsafe way to make ascii characters. You should probably
- * only call this when interacting with the host operating system.
- * The 1 byte std::string does not work correctly.
- * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
- * should work.
- */
- static void _makeASCII(std::basic_string<T>& string);
-
- // Conversion to other data types
- static BOOL convertToBOOL(const std::basic_string<T>& string, BOOL& value);
- static BOOL convertToU8(const std::basic_string<T>& string, U8& value);
- static BOOL convertToS8(const std::basic_string<T>& string, S8& value);
- static BOOL convertToS16(const std::basic_string<T>& string, S16& value);
- static BOOL convertToU16(const std::basic_string<T>& string, U16& value);
- static BOOL convertToU32(const std::basic_string<T>& string, U32& value);
- static BOOL convertToS32(const std::basic_string<T>& string, S32& value);
- static BOOL convertToF32(const std::basic_string<T>& string, F32& value);
- static BOOL convertToF64(const std::basic_string<T>& string, F64& value);
-
- /////////////////////////////////////////////////////////////////////////////////////////
- // Utility functions for working with char*'s and strings
-
- // Like strcmp but also handles empty strings. Uses
- // current locale.
- static S32 compareStrings(const T* lhs, const T* rhs);
- static S32 compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-
- // case insensitive version of above. Uses current locale on
- // Win32, and falls back to a non-locale aware comparison on
- // Linux.
- static S32 compareInsensitive(const T* lhs, const T* rhs);
- static S32 compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-
- // Case sensitive comparison with good handling of numbers. Does not use current locale.
- // a.k.a. strdictcmp()
- static S32 compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
- // Case *in*sensitive comparison with good handling of numbers. Does not use current locale.
- // a.k.a. strdictcmp()
- static S32 compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
- // Puts compareDict() in a form appropriate for LL container classes to use for sorting.
- static BOOL precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
-
- // A replacement for strncpy.
- // If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
- // up to dst_size-1 characters of src.
- static void copy(T* dst, const T* src, size_type dst_size);
-
- // Copies src into dst at a given offset.
- static void copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
-
- static bool isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
-
-
-#ifdef _DEBUG
- LL_COMMON_API static void testHarness();
-#endif
-
-private:
- LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
-};
-
-template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
-template<class T> std::string LLStringUtilBase<T>::sLocale;
-
-typedef LLStringUtilBase<char> LLStringUtil;
-typedef LLStringUtilBase<llwchar> LLWStringUtil;
-typedef std::basic_string<llwchar> LLWString;
-
-//@ Use this where we want to disallow input in the form of "foo"
-// This is used to catch places where english text is embedded in the code
-// instead of in a translatable XUI file.
-class LLStringExplicit : public std::string
-{
-public:
- explicit LLStringExplicit(const char* s) : std::string(s) {}
- LLStringExplicit(const std::string& s) : std::string(s) {}
- LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
-};
-
-struct LLDictionaryLess
-{
-public:
- bool operator()(const std::string& a, const std::string& b)
- {
- return (LLStringUtil::precedesDict(a, b) ? true : false);
- }
-};
-
-
-/**
- * Simple support functions
- */
-
-/**
- * @brief chop off the trailing characters in a string.
- *
- * This function works on bytes rather than glyphs, so this will
- * incorrectly truncate non-single byte strings.
- * Use utf8str_truncate() for utf8 strings
- * @return a copy of in string minus the trailing count bytes.
- */
-inline std::string chop_tail_copy(
- const std::string& in,
- std::string::size_type count)
-{
- return std::string(in, 0, in.length() - count);
-}
-
-/**
- * @brief This translates a nybble stored as a hex value from 0-f back
- * to a nybble in the low order bits of the return byte.
- */
-LL_COMMON_API U8 hex_as_nybble(char hex);
-
-/**
- * @brief read the contents of a file into a string.
- *
- * Since this function has no concept of character encoding, most
- * anything you do with this method ill-advised. Please avoid.
- * @param str [out] The string which will have.
- * @param filename The full name of the file to read.
- * @return Returns true on success. If false, str is unmodified.
- */
-LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
-LL_COMMON_API bool iswindividual(llwchar elem);
-
-/**
- * Unicode support
- */
-
-// Make the incoming string a utf8 string. Replaces any unknown glyph
-// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
-// of the data may not be recovered.
-LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
-
-//
-// We should never use UTF16 except when communicating with Win32!
-//
-typedef std::basic_string<U16> llutf16string;
-
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
-
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
-
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
-
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
-// Same function, better name. JC
-inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
-
-//
-LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
-
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
-
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
-
-// Length of this UTF32 string in bytes when transformed to UTF8
-LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr);
-
-// Length in bytes of this wide char in a UTF8 string
-LL_COMMON_API S32 wchar_utf8_length(const llwchar wc);
-
-LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
-
-// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
-LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
-
-// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
-LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
-
-// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
-LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
-
-/**
- * @brief Properly truncate a utf8 string to a maximum byte count.
- *
- * The returned string may be less than max_len if the truncation
- * happens in the middle of a glyph. If max_len is longer than the
- * string passed in, the return value == utf8str.
- * @param utf8str A valid utf8 string to truncate.
- * @param max_len The maximum number of bytes in the return value.
- * @return Returns a valid utf8 string with byte count <= max_len.
- */
-LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
-
-LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
-
-LL_COMMON_API S32 utf8str_compare_insensitive(
- const std::string& lhs,
- const std::string& rhs);
-
-/**
- * @brief Replace all occurences of target_char with replace_char
- *
- * @param utf8str A utf8 string to process.
- * @param target_char The wchar to be replaced
- * @param replace_char The wchar which is written on replace
- */
-LL_COMMON_API std::string utf8str_substChar(
- const std::string& utf8str,
- const llwchar target_char,
- const llwchar replace_char);
-
-LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
-
-// Hack - used for evil notecards.
-LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str);
-
-LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
-
-
-#if LL_WINDOWS
-/* @name Windows string helpers
- */
-//@{
-
-/**
- * @brief Implementation the expected snprintf interface.
- *
- * If the size of the passed in buffer is not large enough to hold the string,
- * two bad things happen:
- * 1. resulting formatted string is NOT null terminated
- * 2. Depending on the platform, the return value could be a) the required
- * size of the buffer to copy the entire formatted string or b) -1.
- * On Windows with VS.Net 2003, it returns -1 e.g.
- *
- * safe_snprintf always adds a NULL terminator so that the caller does not
- * need to check for return value or need to add the NULL terminator.
- * It does not, however change the return value - to let the caller know
- * that the passed in buffer size was not large enough to hold the
- * formatted string.
- *
- */
-
-// Deal with the differeneces on Windows
-namespace snprintf_hack
-{
- LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
-}
-
-using snprintf_hack::snprintf;
-
-/**
- * @brief Convert a wide string to std::string
- *
- * This replaces the unsafe W2A macro from ATL.
- */
-LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
-
-//@}
-#endif // LL_WINDOWS
-
-/**
- * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
- * specialization to work with the signed char type.
- * Sadly, it is not possible (AFAIK) to specialize a single method of
- * a template class.
- * That stuff should go here.
- */
-namespace LLStringFn
-{
- /**
- * @brief Replace all non-printable characters with replacement in
- * string.
- * NOTE - this will zap non-ascii
- *
- * @param [in,out] string the to modify. out value is the string
- * with zero non-printable characters.
- * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
- */
- LL_COMMON_API void replace_nonprintable_in_ascii(
- std::basic_string<char>& string,
- char replacement);
-
-
- /**
- * @brief Replace all non-printable characters and pipe characters
- * with replacement in a string.
- * NOTE - this will zap non-ascii
- *
- * @param [in,out] the string to modify. out value is the string
- * with zero non-printable characters and zero pipe characters.
- * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
- */
- LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
- char replacement);
-
-
- /**
- * @brief Remove all characters that are not allowed in XML 1.0.
- * Returns a copy of the string with those characters removed.
- * Works with US ASCII and UTF-8 encoded strings. JC
- */
- LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
-
-
- /**
- * @brief Replace all control characters (0 <= c < 0x20) with replacement in
- * string. This is safe for utf-8
- *
- * @param [in,out] string the to modify. out value is the string
- * with zero non-printable characters.
- * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
- */
- LL_COMMON_API void replace_ascii_controlchars(
- std::basic_string<char>& string,
- char replacement);
-}
-
-////////////////////////////////////////////////////////////
-// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
-// There is no LLWStringUtil::format implementation currently.
-// Calling thse for anything other than LLStringUtil will produce link errors.
-
-////////////////////////////////////////////////////////////
-
-
-// static
-template<class T>
-S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
-{
- S32 result;
- if( lhs == rhs )
- {
- result = 0;
- }
- else
- if ( !lhs || !lhs[0] )
- {
- result = ((!rhs || !rhs[0]) ? 0 : 1);
- }
- else
- if ( !rhs || !rhs[0])
- {
- result = -1;
- }
- else
- {
- result = LLStringOps::collate(lhs, rhs);
- }
- return result;
-}
-
-//static
-template<class T>
-S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
- return LLStringOps::collate(lhs.c_str(), rhs.c_str());
-}
-
-// static
-template<class T>
-S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
-{
- S32 result;
- if( lhs == rhs )
- {
- result = 0;
- }
- else
- if ( !lhs || !lhs[0] )
- {
- result = ((!rhs || !rhs[0]) ? 0 : 1);
- }
- else
- if ( !rhs || !rhs[0] )
- {
- result = -1;
- }
- else
- {
- std::basic_string<T> lhs_string(lhs);
- std::basic_string<T> rhs_string(rhs);
- LLStringUtilBase<T>::toUpper(lhs_string);
- LLStringUtilBase<T>::toUpper(rhs_string);
- result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
- }
- return result;
-}
-
-//static
-template<class T>
-S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
- std::basic_string<T> lhs_string(lhs);
- std::basic_string<T> rhs_string(rhs);
- LLStringUtilBase<T>::toUpper(lhs_string);
- LLStringUtilBase<T>::toUpper(rhs_string);
- return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
-}
-
-// Case sensitive comparison with good handling of numbers. Does not use current locale.
-// a.k.a. strdictcmp()
-
-//static
-template<class T>
-S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
- const T* a = astr.c_str();
- const T* b = bstr.c_str();
- T ca, cb;
- S32 ai, bi, cnt = 0;
- S32 bias = 0;
-
- ca = *(a++);
- cb = *(b++);
- while( ca && cb ){
- if( bias==0 ){
- if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
- if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
- }else{
- if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
- if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
- }
- if( LLStringOps::isDigit(ca) ){
- if( cnt-->0 ){
- if( cb!=ca ) break;
- }else{
- if( !LLStringOps::isDigit(cb) ) break;
- for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
- for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
- if( ai<bi ){ ca=0; break; }
- if( bi<ai ){ cb=0; break; }
- if( ca!=cb ) break;
- cnt = ai;
- }
- }else if( ca!=cb ){ break;
- }
- ca = *(a++);
- cb = *(b++);
- }
- if( ca==cb ) ca += bias;
- return ca-cb;
-}
-
-// static
-template<class T>
-S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
- const T* a = astr.c_str();
- const T* b = bstr.c_str();
- T ca, cb;
- S32 ai, bi, cnt = 0;
-
- ca = *(a++);
- cb = *(b++);
- while( ca && cb ){
- if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
- if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
- if( LLStringOps::isDigit(ca) ){
- if( cnt-->0 ){
- if( cb!=ca ) break;
- }else{
- if( !LLStringOps::isDigit(cb) ) break;
- for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
- for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
- if( ai<bi ){ ca=0; break; }
- if( bi<ai ){ cb=0; break; }
- if( ca!=cb ) break;
- cnt = ai;
- }
- }else if( ca!=cb ){ break;
- }
- ca = *(a++);
- cb = *(b++);
- }
- return ca-cb;
-}
-
-// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
-// static
-template<class T>
-BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
-{
- if( a.size() && b.size() )
- {
- return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
- }
- else
- {
- return (!b.empty());
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)
-{
- if( !string.empty() )
- {
- std::transform(
- string.begin(),
- string.end(),
- string.begin(),
- (T(*)(T)) &LLStringOps::toUpper);
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
-{
- if( !string.empty() )
- {
- std::transform(
- string.begin(),
- string.end(),
- string.begin(),
- (T(*)(T)) &LLStringOps::toLower);
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
-{
- if( !string.empty() )
- {
- size_type i = 0;
- while( i < string.length() && LLStringOps::isSpace( string[i] ) )
- {
- i++;
- }
- string.erase(0, i);
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
-{
- if( string.size() )
- {
- size_type len = string.length();
- size_type i = len;
- while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
- {
- i--;
- }
-
- string.erase( i, len - i );
- }
-}
-
-
-// Replace line feeds with carriage return-line feed pairs.
-//static
-template<class T>
-void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
-{
- const T LF = 10;
- const T CR = 13;
-
- // Count the number of line feeds
- size_type count = 0;
- size_type len = string.size();
- size_type i;
- for( i = 0; i < len; i++ )
- {
- if( string[i] == LF )
- {
- count++;
- }
- }
-
- // Insert a carriage return before each line feed
- if( count )
- {
- size_type size = len + count;
- T *t = new T[size];
- size_type j = 0;
- for( i = 0; i < len; ++i )
- {
- if( string[i] == LF )
- {
- t[j] = CR;
- ++j;
- }
- t[j] = string[i];
- ++j;
- }
-
- string.assign(t, size);
- }
-}
-
-// Remove all carriage returns
-//static
-template<class T>
-void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
-{
- const T CR = 13;
-
- size_type cr_count = 0;
- size_type len = string.size();
- size_type i;
- for( i = 0; i < len - cr_count; i++ )
- {
- if( string[i+cr_count] == CR )
- {
- cr_count++;
- }
-
- string[i] = string[i+cr_count];
- }
- string.erase(i, cr_count);
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
-{
- size_type found_pos = 0;
- while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
- {
- string[found_pos] = replacement;
- found_pos++; // avoid infinite defeat if target == replacement
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
-{
- size_type found_pos = 0;
- while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
- {
- string.replace( found_pos, target.length(), replacement );
- found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
-{
- const char LF = 10;
- const S8 MIN = 32;
-// const S8 MAX = 127;
-
- size_type len = string.size();
- for( size_type i = 0; i < len; i++ )
- {
- // No need to test MAX < mText[i] because we treat mText[i] as a signed char,
- // which has a max value of 127.
- if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
- {
- string[i] = replacement;
- }
- }
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
-{
- const T TAB = '\t';
- const T SPACE = ' ';
-
- std::basic_string<T> out_str;
- // Replace tabs with spaces
- for (size_type i = 0; i < str.length(); i++)
- {
- if (str[i] == TAB)
- {
- for (size_type j = 0; j < spaces_per_tab; j++)
- out_str += SPACE;
- }
- else
- {
- out_str += str[i];
- }
- }
- str = out_str;
-}
-
-//static
-template<class T>
-BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
-{
- const char MIN = 32;
- BOOL rv = FALSE;
- for (size_type i = 0; i < string.size(); i++)
- {
- if(string[i] < MIN)
- {
- rv = TRUE;
- break;
- }
- }
- return rv;
-}
-
-//static
-template<class T>
-void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
-{
- const char MIN = 32;
- size_type j = 0;
- if (string.empty())
- {
- return;
- }
- size_t src_size = string.size();
- char* c_string = new char[src_size + 1];
- if(c_string == NULL)
- {
- return;
- }
- copy(c_string, string.c_str(), src_size+1);
- char* write_head = &c_string[0];
- for (size_type i = 0; i < src_size; i++)
- {
- char* read_head = &string[i];
- write_head = &c_string[j];
- if(!(*read_head < MIN))
- {
- *write_head = *read_head;
- ++j;
- }
- }
- c_string[j]= '\0';
- string = c_string;
- delete []c_string;
-}
-
-template<class T>
-void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
-{
- // Replace non-ASCII chars with LL_UNKNOWN_CHAR
- for (size_type i = 0; i < string.length(); i++)
- {
- if (string[i] > 0x7f)
- {
- string[i] = LL_UNKNOWN_CHAR;
- }
- }
-}
-
-// static
-template<class T>
-void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
-{
- if( dst_size > 0 )
- {
- size_type min_len = 0;
- if( src )
- {
- min_len = llmin( dst_size - 1, strlen( src ) ); /* Flawfinder: ignore */
- memcpy(dst, src, min_len * sizeof(T)); /* Flawfinder: ignore */
- }
- dst[min_len] = '\0';
- }
-}
-
-// static
-template<class T>
-void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
-{
- if ( offset == dst.length() )
- {
- // special case - append to end of string and avoid expensive
- // (when strings are large) string manipulations
- dst += src;
- }
- else
- {
- std::basic_string<T> tail = dst.substr(offset);
-
- dst = dst.substr(0, offset);
- dst += src;
- dst += tail;
- };
-}
-
-// True if this is the head of s.
-//static
-template<class T>
-BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s )
-{
- if( string.empty() )
- {
- // Early exit
- return FALSE;
- }
- else
- {
- return (strncmp( s, string.c_str(), string.size() ) == 0);
- }
-}
-
-// static
-template<class T>
-bool LLStringUtilBase<T>::startsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr)
-{
- if(string.empty() || (substr.empty())) return false;
- if(0 == string.find(substr)) return true;
- return false;
-}
-
-// static
-template<class T>
-bool LLStringUtilBase<T>::endsWith(
- const std::basic_string<T>& string,
- const std::basic_string<T>& substr)
-{
- if(string.empty() || (substr.empty())) return false;
- std::string::size_type idx = string.rfind(substr);
- if(std::string::npos == idx) return false;
- return (idx == (string.size() - substr.size()));
-}
-
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
-{
- if( string.empty() )
- {
- return FALSE;
- }
-
- std::basic_string<T> temp( string );
- trim(temp);
- if(
- (temp == "1") ||
- (temp == "T") ||
- (temp == "t") ||
- (temp == "TRUE") ||
- (temp == "true") ||
- (temp == "True") )
- {
- value = TRUE;
- return TRUE;
- }
- else
- if(
- (temp == "0") ||
- (temp == "F") ||
- (temp == "f") ||
- (temp == "FALSE") ||
- (temp == "false") ||
- (temp == "False") )
- {
- value = FALSE;
- return TRUE;
- }
-
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
-{
- S32 value32 = 0;
- BOOL success = convertToS32(string, value32);
- if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
- {
- value = (U8) value32;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
-{
- S32 value32 = 0;
- BOOL success = convertToS32(string, value32);
- if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
- {
- value = (S8) value32;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value)
-{
- S32 value32 = 0;
- BOOL success = convertToS32(string, value32);
- if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
- {
- value = (S16) value32;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value)
-{
- S32 value32 = 0;
- BOOL success = convertToS32(string, value32);
- if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
- {
- value = (U16) value32;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value)
-{
- if( string.empty() )
- {
- return FALSE;
- }
-
- std::basic_string<T> temp( string );
- trim(temp);
- U32 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
- if(i_stream >> v)
- {
- value = v;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value)
-{
- if( string.empty() )
- {
- return FALSE;
- }
-
- std::basic_string<T> temp( string );
- trim(temp);
- S32 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
- if(i_stream >> v)
- {
- //TODO: figure out overflow and underflow reporting here
- //if((LONG_MAX == v) || (LONG_MIN == v))
- //{
- // // Underflow or overflow
- // return FALSE;
- //}
-
- value = v;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value)
-{
- F64 value64 = 0.0;
- BOOL success = convertToF64(string, value64);
- if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
- {
- value = (F32) value64;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
-{
- if( string.empty() )
- {
- return FALSE;
- }
-
- std::basic_string<T> temp( string );
- trim(temp);
- F64 v;
- std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
- if(i_stream >> v)
- {
- //TODO: figure out overflow and underflow reporting here
- //if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
- //{
- // // Underflow or overflow
- // return FALSE;
- //}
-
- value = v;
- return TRUE;
- }
- return FALSE;
-}
-
-template<class T>
-void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
-{
- size_type cur_size = string.size();
- string.resize(count < cur_size ? count : cur_size);
-}
-
-#endif // LL_STRING_H
+/**
+ * @file llstring.h
+ * @brief String utility functions and std::string class.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSTRING_H
+#define LL_LLSTRING_H
+
+#include <string>
+#include <cstdio>
+#include <locale>
+#include <iomanip>
+#include "llsd.h"
+#include "llfasttimer.h"
+
+#if LL_LINUX || LL_SOLARIS
+#include <wctype.h>
+#include <wchar.h>
+#endif
+
+#include <string.h>
+
+#if LL_SOLARIS
+// stricmp and strnicmp do not exist on Solaris:
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+const char LL_UNKNOWN_CHAR = '?';
+
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
+// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
+#include <cstring>
+
+namespace std
+{
+template<>
+struct char_traits<U16>
+{
+ typedef U16 char_type;
+ typedef int int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return memcmp(__s1, __s2, __n * sizeof(char_type)); }
+
+ static size_t
+ length(const char_type* __s)
+ {
+ const char_type *cur_char = __s;
+ while (*cur_char != 0)
+ {
+ ++cur_char;
+ }
+ return cur_char - __s;
+ }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); } /* Flawfinder: ignore */
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ {
+ // This isn't right.
+ //return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type)));
+
+ // I don't think there's a standard 'memset' for 16-bit values.
+ // Do this the old-fashioned way.
+
+ size_t __i;
+ for(__i = 0; __i < __n; __i++)
+ {
+ __s[__i] = __a;
+ }
+ return __s;
+ }
+
+ static char_type
+ to_char_type(const int_type& __c)
+ { return static_cast<char_type>(__c); }
+
+ static int_type
+ to_int_type(const char_type& __c)
+ { return static_cast<int_type>(__c); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static int_type
+ eof() { return static_cast<int_type>(EOF); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return (__c == eof()) ? 0 : __c; }
+ };
+};
+#endif
+
+class LL_COMMON_API LLStringOps
+{
+private:
+ static long sPacificTimeOffset;
+ static long sLocalTimeOffset;
+ static bool sPacificDaylightTime;
+ static std::map<std::string, std::string> datetimeToCodes;
+
+public:
+ static char toUpper(char elem) { return toupper((unsigned char)elem); }
+ static llwchar toUpper(llwchar elem) { return towupper(elem); }
+
+ static char toLower(char elem) { return tolower((unsigned char)elem); }
+ static llwchar toLower(llwchar elem) { return towlower(elem); }
+
+ static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
+ static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
+
+ static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
+ static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
+
+ static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
+ static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
+
+ static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
+ static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
+
+ static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
+ static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
+
+ static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
+ static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
+
+ static S32 collate(const char* a, const char* b) { return strcoll(a, b); }
+ static S32 collate(const llwchar* a, const llwchar* b);
+
+ static void setupDatetimeInfo(bool pacific_daylight_time);
+ static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
+ static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
+ // Is the Pacific time zone (aka server time zone)
+ // currently in daylight savings time?
+ static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
+
+ static std::string getDatetimeCode (std::string key);
+};
+
+/**
+ * @brief Return a string constructed from in without crashing if the
+ * pointer is NULL.
+ */
+LL_COMMON_API std::string ll_safe_string(const char* in);
+LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
+
+
+// Allowing assignments from non-strings into format_map_t is apparently
+// *really* error-prone, so subclass std::string with just basic c'tors.
+class LLFormatMapString
+{
+public:
+ LLFormatMapString() {};
+ LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
+ LLFormatMapString(const std::string& s) : mString(s) {};
+ operator std::string() const { return mString; }
+ bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
+ std::size_t length() const { return mString.length(); }
+
+private:
+ std::string mString;
+};
+
+template <class T>
+class LLStringUtilBase
+{
+private:
+ static std::string sLocale;
+
+public:
+ typedef typename std::basic_string<T>::size_type size_type;
+
+public:
+ /////////////////////////////////////////////////////////////////////////////////////////
+ // Static Utility functions that operate on std::strings
+
+ static std::basic_string<T> null;
+
+ typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
+ LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
+ LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
+ LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
+ LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
+ LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
+ LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
+ LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
+ static void setLocale (std::string inLocale) {sLocale = inLocale;};
+ static std::string getLocale (void) {return sLocale;};
+
+ static bool isValidIndex(const std::basic_string<T>& string, size_type i)
+ {
+ return !string.empty() && (0 <= i) && (i <= string.size());
+ }
+
+ static void trimHead(std::basic_string<T>& string);
+ static void trimTail(std::basic_string<T>& string);
+ static void trim(std::basic_string<T>& string) { trimHead(string); trimTail(string); }
+ static void truncate(std::basic_string<T>& string, size_type count);
+
+ static void toUpper(std::basic_string<T>& string);
+ static void toLower(std::basic_string<T>& string);
+
+ // True if this is the head of s.
+ static BOOL isHead( const std::basic_string<T>& string, const T* s );
+
+ /**
+ * @brief Returns true if string starts with substr
+ *
+ * If etither string or substr are empty, this method returns false.
+ */
+ static bool startsWith(
+ const std::basic_string<T>& string,
+ const std::basic_string<T>& substr);
+
+ /**
+ * @brief Returns true if string ends in substr
+ *
+ * If etither string or substr are empty, this method returns false.
+ */
+ static bool endsWith(
+ const std::basic_string<T>& string,
+ const std::basic_string<T>& substr);
+
+ static void addCRLF(std::basic_string<T>& string);
+ static void removeCRLF(std::basic_string<T>& string);
+
+ static void replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
+ static void replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
+ static void replaceChar( std::basic_string<T>& string, T target, T replacement );
+ static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
+
+ static BOOL containsNonprintable(const std::basic_string<T>& string);
+ static void stripNonprintable(std::basic_string<T>& string);
+
+ /**
+ * @brief Unsafe way to make ascii characters. You should probably
+ * only call this when interacting with the host operating system.
+ * The 1 byte std::string does not work correctly.
+ * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
+ * should work.
+ */
+ static void _makeASCII(std::basic_string<T>& string);
+
+ // Conversion to other data types
+ static BOOL convertToBOOL(const std::basic_string<T>& string, BOOL& value);
+ static BOOL convertToU8(const std::basic_string<T>& string, U8& value);
+ static BOOL convertToS8(const std::basic_string<T>& string, S8& value);
+ static BOOL convertToS16(const std::basic_string<T>& string, S16& value);
+ static BOOL convertToU16(const std::basic_string<T>& string, U16& value);
+ static BOOL convertToU32(const std::basic_string<T>& string, U32& value);
+ static BOOL convertToS32(const std::basic_string<T>& string, S32& value);
+ static BOOL convertToF32(const std::basic_string<T>& string, F32& value);
+ static BOOL convertToF64(const std::basic_string<T>& string, F64& value);
+
+ /////////////////////////////////////////////////////////////////////////////////////////
+ // Utility functions for working with char*'s and strings
+
+ // Like strcmp but also handles empty strings. Uses
+ // current locale.
+ static S32 compareStrings(const T* lhs, const T* rhs);
+ static S32 compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+
+ // case insensitive version of above. Uses current locale on
+ // Win32, and falls back to a non-locale aware comparison on
+ // Linux.
+ static S32 compareInsensitive(const T* lhs, const T* rhs);
+ static S32 compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+
+ // Case sensitive comparison with good handling of numbers. Does not use current locale.
+ // a.k.a. strdictcmp()
+ static S32 compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+ // Case *in*sensitive comparison with good handling of numbers. Does not use current locale.
+ // a.k.a. strdictcmp()
+ static S32 compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+ // Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+ static BOOL precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
+
+ // A replacement for strncpy.
+ // If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
+ // up to dst_size-1 characters of src.
+ static void copy(T* dst, const T* src, size_type dst_size);
+
+ // Copies src into dst at a given offset.
+ static void copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
+
+ static bool isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
+
+
+#ifdef _DEBUG
+ LL_COMMON_API static void testHarness();
+#endif
+
+private:
+ LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
+};
+
+template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
+template<class T> std::string LLStringUtilBase<T>::sLocale;
+
+typedef LLStringUtilBase<char> LLStringUtil;
+typedef LLStringUtilBase<llwchar> LLWStringUtil;
+typedef std::basic_string<llwchar> LLWString;
+
+//@ Use this where we want to disallow input in the form of "foo"
+// This is used to catch places where english text is embedded in the code
+// instead of in a translatable XUI file.
+class LLStringExplicit : public std::string
+{
+public:
+ explicit LLStringExplicit(const char* s) : std::string(s) {}
+ LLStringExplicit(const std::string& s) : std::string(s) {}
+ LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
+};
+
+struct LLDictionaryLess
+{
+public:
+ bool operator()(const std::string& a, const std::string& b)
+ {
+ return (LLStringUtil::precedesDict(a, b) ? true : false);
+ }
+};
+
+
+/**
+ * Simple support functions
+ */
+
+/**
+ * @brief chop off the trailing characters in a string.
+ *
+ * This function works on bytes rather than glyphs, so this will
+ * incorrectly truncate non-single byte strings.
+ * Use utf8str_truncate() for utf8 strings
+ * @return a copy of in string minus the trailing count bytes.
+ */
+inline std::string chop_tail_copy(
+ const std::string& in,
+ std::string::size_type count)
+{
+ return std::string(in, 0, in.length() - count);
+}
+
+/**
+ * @brief This translates a nybble stored as a hex value from 0-f back
+ * to a nybble in the low order bits of the return byte.
+ */
+LL_COMMON_API U8 hex_as_nybble(char hex);
+
+/**
+ * @brief read the contents of a file into a string.
+ *
+ * Since this function has no concept of character encoding, most
+ * anything you do with this method ill-advised. Please avoid.
+ * @param str [out] The string which will have.
+ * @param filename The full name of the file to read.
+ * @return Returns true on success. If false, str is unmodified.
+ */
+LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
+LL_COMMON_API bool iswindividual(llwchar elem);
+
+/**
+ * Unicode support
+ */
+
+// Make the incoming string a utf8 string. Replaces any unknown glyph
+// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
+// of the data may not be recovered.
+LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
+
+//
+// We should never use UTF16 except when communicating with Win32!
+//
+typedef std::basic_string<U16> llutf16string;
+
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
+
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
+
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
+
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
+// Same function, better name. JC
+inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
+
+//
+LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
+
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
+
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
+
+// Length of this UTF32 string in bytes when transformed to UTF8
+LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr);
+
+// Length in bytes of this wide char in a UTF8 string
+LL_COMMON_API S32 wchar_utf8_length(const llwchar wc);
+
+LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
+
+// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
+LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
+
+// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
+LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
+
+// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
+LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
+
+/**
+ * @brief Properly truncate a utf8 string to a maximum byte count.
+ *
+ * The returned string may be less than max_len if the truncation
+ * happens in the middle of a glyph. If max_len is longer than the
+ * string passed in, the return value == utf8str.
+ * @param utf8str A valid utf8 string to truncate.
+ * @param max_len The maximum number of bytes in the return value.
+ * @return Returns a valid utf8 string with byte count <= max_len.
+ */
+LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
+
+LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
+
+LL_COMMON_API S32 utf8str_compare_insensitive(
+ const std::string& lhs,
+ const std::string& rhs);
+
+/**
+ * @brief Replace all occurences of target_char with replace_char
+ *
+ * @param utf8str A utf8 string to process.
+ * @param target_char The wchar to be replaced
+ * @param replace_char The wchar which is written on replace
+ */
+LL_COMMON_API std::string utf8str_substChar(
+ const std::string& utf8str,
+ const llwchar target_char,
+ const llwchar replace_char);
+
+LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
+
+// Hack - used for evil notecards.
+LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str);
+
+LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
+
+
+#if LL_WINDOWS
+/* @name Windows string helpers
+ */
+//@{
+
+/**
+ * @brief Implementation the expected snprintf interface.
+ *
+ * If the size of the passed in buffer is not large enough to hold the string,
+ * two bad things happen:
+ * 1. resulting formatted string is NOT null terminated
+ * 2. Depending on the platform, the return value could be a) the required
+ * size of the buffer to copy the entire formatted string or b) -1.
+ * On Windows with VS.Net 2003, it returns -1 e.g.
+ *
+ * safe_snprintf always adds a NULL terminator so that the caller does not
+ * need to check for return value or need to add the NULL terminator.
+ * It does not, however change the return value - to let the caller know
+ * that the passed in buffer size was not large enough to hold the
+ * formatted string.
+ *
+ */
+
+// Deal with the differeneces on Windows
+namespace snprintf_hack
+{
+ LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
+}
+
+using snprintf_hack::snprintf;
+
+/**
+ * @brief Convert a wide string to std::string
+ *
+ * This replaces the unsafe W2A macro from ATL.
+ */
+LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
+
+//@}
+#endif // LL_WINDOWS
+
+/**
+ * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
+ * specialization to work with the signed char type.
+ * Sadly, it is not possible (AFAIK) to specialize a single method of
+ * a template class.
+ * That stuff should go here.
+ */
+namespace LLStringFn
+{
+ /**
+ * @brief Replace all non-printable characters with replacement in
+ * string.
+ * NOTE - this will zap non-ascii
+ *
+ * @param [in,out] string the to modify. out value is the string
+ * with zero non-printable characters.
+ * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+ */
+ LL_COMMON_API void replace_nonprintable_in_ascii(
+ std::basic_string<char>& string,
+ char replacement);
+
+
+ /**
+ * @brief Replace all non-printable characters and pipe characters
+ * with replacement in a string.
+ * NOTE - this will zap non-ascii
+ *
+ * @param [in,out] the string to modify. out value is the string
+ * with zero non-printable characters and zero pipe characters.
+ * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+ */
+ LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
+ char replacement);
+
+
+ /**
+ * @brief Remove all characters that are not allowed in XML 1.0.
+ * Returns a copy of the string with those characters removed.
+ * Works with US ASCII and UTF-8 encoded strings. JC
+ */
+ LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
+
+
+ /**
+ * @brief Replace all control characters (0 <= c < 0x20) with replacement in
+ * string. This is safe for utf-8
+ *
+ * @param [in,out] string the to modify. out value is the string
+ * with zero non-printable characters.
+ * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+ */
+ LL_COMMON_API void replace_ascii_controlchars(
+ std::basic_string<char>& string,
+ char replacement);
+}
+
+////////////////////////////////////////////////////////////
+// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
+// There is no LLWStringUtil::format implementation currently.
+// Calling thse for anything other than LLStringUtil will produce link errors.
+
+////////////////////////////////////////////////////////////
+
+
+// static
+template<class T>
+S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
+{
+ S32 result;
+ if( lhs == rhs )
+ {
+ result = 0;
+ }
+ else
+ if ( !lhs || !lhs[0] )
+ {
+ result = ((!rhs || !rhs[0]) ? 0 : 1);
+ }
+ else
+ if ( !rhs || !rhs[0])
+ {
+ result = -1;
+ }
+ else
+ {
+ result = LLStringOps::collate(lhs, rhs);
+ }
+ return result;
+}
+
+//static
+template<class T>
+S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+ return LLStringOps::collate(lhs.c_str(), rhs.c_str());
+}
+
+// static
+template<class T>
+S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
+{
+ S32 result;
+ if( lhs == rhs )
+ {
+ result = 0;
+ }
+ else
+ if ( !lhs || !lhs[0] )
+ {
+ result = ((!rhs || !rhs[0]) ? 0 : 1);
+ }
+ else
+ if ( !rhs || !rhs[0] )
+ {
+ result = -1;
+ }
+ else
+ {
+ std::basic_string<T> lhs_string(lhs);
+ std::basic_string<T> rhs_string(rhs);
+ LLStringUtilBase<T>::toUpper(lhs_string);
+ LLStringUtilBase<T>::toUpper(rhs_string);
+ result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+ }
+ return result;
+}
+
+//static
+template<class T>
+S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+ std::basic_string<T> lhs_string(lhs);
+ std::basic_string<T> rhs_string(rhs);
+ LLStringUtilBase<T>::toUpper(lhs_string);
+ LLStringUtilBase<T>::toUpper(rhs_string);
+ return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+}
+
+// Case sensitive comparison with good handling of numbers. Does not use current locale.
+// a.k.a. strdictcmp()
+
+//static
+template<class T>
+S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+ const T* a = astr.c_str();
+ const T* b = bstr.c_str();
+ T ca, cb;
+ S32 ai, bi, cnt = 0;
+ S32 bias = 0;
+
+ ca = *(a++);
+ cb = *(b++);
+ while( ca && cb ){
+ if( bias==0 ){
+ if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
+ if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
+ }else{
+ if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+ if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+ }
+ if( LLStringOps::isDigit(ca) ){
+ if( cnt-->0 ){
+ if( cb!=ca ) break;
+ }else{
+ if( !LLStringOps::isDigit(cb) ) break;
+ for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+ for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+ if( ai<bi ){ ca=0; break; }
+ if( bi<ai ){ cb=0; break; }
+ if( ca!=cb ) break;
+ cnt = ai;
+ }
+ }else if( ca!=cb ){ break;
+ }
+ ca = *(a++);
+ cb = *(b++);
+ }
+ if( ca==cb ) ca += bias;
+ return ca-cb;
+}
+
+// static
+template<class T>
+S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+ const T* a = astr.c_str();
+ const T* b = bstr.c_str();
+ T ca, cb;
+ S32 ai, bi, cnt = 0;
+
+ ca = *(a++);
+ cb = *(b++);
+ while( ca && cb ){
+ if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+ if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+ if( LLStringOps::isDigit(ca) ){
+ if( cnt-->0 ){
+ if( cb!=ca ) break;
+ }else{
+ if( !LLStringOps::isDigit(cb) ) break;
+ for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+ for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+ if( ai<bi ){ ca=0; break; }
+ if( bi<ai ){ cb=0; break; }
+ if( ca!=cb ) break;
+ cnt = ai;
+ }
+ }else if( ca!=cb ){ break;
+ }
+ ca = *(a++);
+ cb = *(b++);
+ }
+ return ca-cb;
+}
+
+// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+// static
+template<class T>
+BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
+{
+ if( a.size() && b.size() )
+ {
+ return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
+ }
+ else
+ {
+ return (!b.empty());
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)
+{
+ if( !string.empty() )
+ {
+ std::transform(
+ string.begin(),
+ string.end(),
+ string.begin(),
+ (T(*)(T)) &LLStringOps::toUpper);
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
+{
+ if( !string.empty() )
+ {
+ std::transform(
+ string.begin(),
+ string.end(),
+ string.begin(),
+ (T(*)(T)) &LLStringOps::toLower);
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
+{
+ if( !string.empty() )
+ {
+ size_type i = 0;
+ while( i < string.length() && LLStringOps::isSpace( string[i] ) )
+ {
+ i++;
+ }
+ string.erase(0, i);
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
+{
+ if( string.size() )
+ {
+ size_type len = string.length();
+ size_type i = len;
+ while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
+ {
+ i--;
+ }
+
+ string.erase( i, len - i );
+ }
+}
+
+
+// Replace line feeds with carriage return-line feed pairs.
+//static
+template<class T>
+void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
+{
+ const T LF = 10;
+ const T CR = 13;
+
+ // Count the number of line feeds
+ size_type count = 0;
+ size_type len = string.size();
+ size_type i;
+ for( i = 0; i < len; i++ )
+ {
+ if( string[i] == LF )
+ {
+ count++;
+ }
+ }
+
+ // Insert a carriage return before each line feed
+ if( count )
+ {
+ size_type size = len + count;
+ T *t = new T[size];
+ size_type j = 0;
+ for( i = 0; i < len; ++i )
+ {
+ if( string[i] == LF )
+ {
+ t[j] = CR;
+ ++j;
+ }
+ t[j] = string[i];
+ ++j;
+ }
+
+ string.assign(t, size);
+ delete[] t;
+ }
+}
+
+// Remove all carriage returns
+//static
+template<class T>
+void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
+{
+ const T CR = 13;
+
+ size_type cr_count = 0;
+ size_type len = string.size();
+ size_type i;
+ for( i = 0; i < len - cr_count; i++ )
+ {
+ if( string[i+cr_count] == CR )
+ {
+ cr_count++;
+ }
+
+ string[i] = string[i+cr_count];
+ }
+ string.erase(i, cr_count);
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
+{
+ size_type found_pos = 0;
+ while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+ {
+ string[found_pos] = replacement;
+ found_pos++; // avoid infinite defeat if target == replacement
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
+{
+ size_type found_pos = 0;
+ while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+ {
+ string.replace( found_pos, target.length(), replacement );
+ found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
+{
+ const char LF = 10;
+ const S8 MIN = 32;
+// const S8 MAX = 127;
+
+ size_type len = string.size();
+ for( size_type i = 0; i < len; i++ )
+ {
+ // No need to test MAX < mText[i] because we treat mText[i] as a signed char,
+ // which has a max value of 127.
+ if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
+ {
+ string[i] = replacement;
+ }
+ }
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
+{
+ const T TAB = '\t';
+ const T SPACE = ' ';
+
+ std::basic_string<T> out_str;
+ // Replace tabs with spaces
+ for (size_type i = 0; i < str.length(); i++)
+ {
+ if (str[i] == TAB)
+ {
+ for (size_type j = 0; j < spaces_per_tab; j++)
+ out_str += SPACE;
+ }
+ else
+ {
+ out_str += str[i];
+ }
+ }
+ str = out_str;
+}
+
+//static
+template<class T>
+BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
+{
+ const char MIN = 32;
+ BOOL rv = FALSE;
+ for (size_type i = 0; i < string.size(); i++)
+ {
+ if(string[i] < MIN)
+ {
+ rv = TRUE;
+ break;
+ }
+ }
+ return rv;
+}
+
+//static
+template<class T>
+void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
+{
+ const char MIN = 32;
+ size_type j = 0;
+ if (string.empty())
+ {
+ return;
+ }
+ size_t src_size = string.size();
+ char* c_string = new char[src_size + 1];
+ if(c_string == NULL)
+ {
+ return;
+ }
+ copy(c_string, string.c_str(), src_size+1);
+ char* write_head = &c_string[0];
+ for (size_type i = 0; i < src_size; i++)
+ {
+ char* read_head = &string[i];
+ write_head = &c_string[j];
+ if(!(*read_head < MIN))
+ {
+ *write_head = *read_head;
+ ++j;
+ }
+ }
+ c_string[j]= '\0';
+ string = c_string;
+ delete []c_string;
+}
+
+template<class T>
+void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
+{
+ // Replace non-ASCII chars with LL_UNKNOWN_CHAR
+ for (size_type i = 0; i < string.length(); i++)
+ {
+ if (string[i] > 0x7f)
+ {
+ string[i] = LL_UNKNOWN_CHAR;
+ }
+ }
+}
+
+// static
+template<class T>
+void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
+{
+ if( dst_size > 0 )
+ {
+ size_type min_len = 0;
+ if( src )
+ {
+ min_len = llmin( dst_size - 1, strlen( src ) ); /* Flawfinder: ignore */
+ memcpy(dst, src, min_len * sizeof(T)); /* Flawfinder: ignore */
+ }
+ dst[min_len] = '\0';
+ }
+}
+
+// static
+template<class T>
+void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
+{
+ if ( offset == dst.length() )
+ {
+ // special case - append to end of string and avoid expensive
+ // (when strings are large) string manipulations
+ dst += src;
+ }
+ else
+ {
+ std::basic_string<T> tail = dst.substr(offset);
+
+ dst = dst.substr(0, offset);
+ dst += src;
+ dst += tail;
+ };
+}
+
+// True if this is the head of s.
+//static
+template<class T>
+BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s )
+{
+ if( string.empty() )
+ {
+ // Early exit
+ return FALSE;
+ }
+ else
+ {
+ return (strncmp( s, string.c_str(), string.size() ) == 0);
+ }
+}
+
+// static
+template<class T>
+bool LLStringUtilBase<T>::startsWith(
+ const std::basic_string<T>& string,
+ const std::basic_string<T>& substr)
+{
+ if(string.empty() || (substr.empty())) return false;
+ if(0 == string.find(substr)) return true;
+ return false;
+}
+
+// static
+template<class T>
+bool LLStringUtilBase<T>::endsWith(
+ const std::basic_string<T>& string,
+ const std::basic_string<T>& substr)
+{
+ if(string.empty() || (substr.empty())) return false;
+ std::string::size_type idx = string.rfind(substr);
+ if(std::string::npos == idx) return false;
+ return (idx == (string.size() - substr.size()));
+}
+
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
+{
+ if( string.empty() )
+ {
+ return FALSE;
+ }
+
+ std::basic_string<T> temp( string );
+ trim(temp);
+ if(
+ (temp == "1") ||
+ (temp == "T") ||
+ (temp == "t") ||
+ (temp == "TRUE") ||
+ (temp == "true") ||
+ (temp == "True") )
+ {
+ value = TRUE;
+ return TRUE;
+ }
+ else
+ if(
+ (temp == "0") ||
+ (temp == "F") ||
+ (temp == "f") ||
+ (temp == "FALSE") ||
+ (temp == "false") ||
+ (temp == "False") )
+ {
+ value = FALSE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value)
+{
+ S32 value32 = 0;
+ BOOL success = convertToS32(string, value32);
+ if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
+ {
+ value = (U8) value32;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value)
+{
+ S32 value32 = 0;
+ BOOL success = convertToS32(string, value32);
+ if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
+ {
+ value = (S8) value32;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value)
+{
+ S32 value32 = 0;
+ BOOL success = convertToS32(string, value32);
+ if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
+ {
+ value = (S16) value32;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value)
+{
+ S32 value32 = 0;
+ BOOL success = convertToS32(string, value32);
+ if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
+ {
+ value = (U16) value32;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value)
+{
+ if( string.empty() )
+ {
+ return FALSE;
+ }
+
+ std::basic_string<T> temp( string );
+ trim(temp);
+ U32 v;
+ std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ if(i_stream >> v)
+ {
+ value = v;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value)
+{
+ if( string.empty() )
+ {
+ return FALSE;
+ }
+
+ std::basic_string<T> temp( string );
+ trim(temp);
+ S32 v;
+ std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ if(i_stream >> v)
+ {
+ //TODO: figure out overflow and underflow reporting here
+ //if((LONG_MAX == v) || (LONG_MIN == v))
+ //{
+ // // Underflow or overflow
+ // return FALSE;
+ //}
+
+ value = v;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value)
+{
+ F64 value64 = 0.0;
+ BOOL success = convertToF64(string, value64);
+ if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
+ {
+ value = (F32) value64;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
+{
+ if( string.empty() )
+ {
+ return FALSE;
+ }
+
+ std::basic_string<T> temp( string );
+ trim(temp);
+ F64 v;
+ std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+ if(i_stream >> v)
+ {
+ //TODO: figure out overflow and underflow reporting here
+ //if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
+ //{
+ // // Underflow or overflow
+ // return FALSE;
+ //}
+
+ value = v;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+template<class T>
+void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
+{
+ size_type cur_size = string.size();
+ string.resize(count < cur_size ? count : cur_size);
+}
+
+#endif // LL_STRING_H
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3652eeba72..0272c55db2 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
+#if LL_WINDOWS
+#ifndef DLLVERSIONINFO
+typedef struct _DllVersionInfo
+{
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformID;
+}DLLVERSIONINFO;
+#endif
+
+#ifndef DLLGETVERSIONPROC
+typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
+#endif
+
+bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
+{
+ bool result = false;
+ const U32 BUFF_SIZE = 32767;
+ WCHAR tempBuf[BUFF_SIZE];
+ if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
+ {
+
+ std::basic_string<WCHAR> shell32_path(tempBuf);
+
+ // Shell32.dll contains the DLLGetVersion function.
+ // according to msdn its not part of the API
+ // so you have to go in and get it.
+ // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
+ shell32_path += TEXT("\\shell32.dll");
+
+ HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
+ if(hDllInst)
+ { // Could successfully load the DLL
+ DLLGETVERSIONPROC pDllGetVersion;
+ /*
+ You must get this function explicitly because earlier versions of the DLL
+ don't implement this function. That makes the lack of implementation of the
+ function a version marker in itself.
+ */
+ pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
+ "DllGetVersion");
+
+ if(pDllGetVersion)
+ {
+ // DLL supports version retrieval function
+ DLLVERSIONINFO dvi;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+ HRESULT hr = (*pDllGetVersion)(&dvi);
+
+ if(SUCCEEDED(hr))
+ { // Finally, the version is at our hands
+ major = dvi.dwMajorVersion;
+ minor = dvi.dwMinorVersion;
+ build_number = dvi.dwBuildNumber;
+ result = true;
+ }
+ }
+
+ FreeLibrary(hDllInst); // Release DLL
+ }
+ }
+ return result;
+}
+#endif // LL_WINDOWS
+
LLOSInfo::LLOSInfo() :
mMajorVer(0), mMinorVer(0), mBuild(0)
{
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
mMinorVer = osvi.dwMinorVersion;
mBuild = osvi.dwBuildNumber;
+ DWORD shell32_major, shell32_minor, shell32_build;
+ bool got_shell32_version = get_shell32_dll_version(shell32_major,
+ shell32_minor,
+ shell32_build);
+
switch(osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
else
mOSStringSimple = "Microsoft Windows Server 2003 ";
}
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
+ else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
{
+ if(osvi.dwMinorVersion == 0)
+ {
+ mOSStringSimple = "Microsoft Windows Vista ";
+ }
+ else if(osvi.dwMinorVersion == 1)
+ {
+ mOSStringSimple = "Microsoft Windows 7 ";
+ }
+
+ if(osvi.wProductType != VER_NT_WORKSTATION)
+ {
+ mOSStringSimple += "Server ";
+ }
+
///get native system info if available..
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
SYSTEM_INFO si; //System Info object file contains architecture info
@@ -141,31 +229,12 @@ LLOSInfo::LLOSInfo() :
//of windows than this code does (in case it is needed for the future)
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
{
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista 64-bit ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
+ mOSStringSimple += "64-bit ";
}
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
{
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista 32-bit ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server 32-bit ";
+ mOSStringSimple += "32-bit ";
}
- else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked
- {
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server ";
- }
- }
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
- {
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows 7 ";
- else mOSStringSimple = "Microsoft Windows 7 Server ";
}
else // Use the registry on early versions of Windows NT.
{
@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
csdversion.c_str(),
(osvi.dwBuildNumber & 0xffff));
}
+
mOSString = mOSStringSimple + tmpstr;
}
break;
@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
mOSString = mOSStringSimple;
break;
}
+
+ std::string compatibility_mode;
+ if(got_shell32_version)
+ {
+ if(osvi.dwMajorVersion != shell32_major
+ || osvi.dwMinorVersion != shell32_minor)
+ {
+ compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
+ shell32_major,
+ shell32_minor,
+ shell32_build);
+ }
+ }
+ mOSString += compatibility_mode;
+
#else
struct utsname un;
if(uname(&un) != -1)
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 920d8c0977..37370e44e7 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -291,8 +291,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
LLMutex::~LLMutex()
{
-#if _DEBUG
- llassert(!isLocked()); // better not be locked!
+#if MUTEX_DEBUG
+ llassert_always(!isLocked()); // better not be locked!
#endif
apr_thread_mutex_destroy(mAPRMutexp);
mAPRMutexp = NULL;
@@ -306,10 +306,24 @@ LLMutex::~LLMutex()
void LLMutex::lock()
{
apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+ // Have to have the lock before we can access the debug info
+ U32 id = LLThread::currentID();
+ if (mIsLocked[id] != FALSE)
+ llerrs << "Already locked in Thread: " << id << llendl;
+ mIsLocked[id] = TRUE;
+#endif
}
void LLMutex::unlock()
{
+#if MUTEX_DEBUG
+ // Access the debug info while we have the lock
+ U32 id = LLThread::currentID();
+ if (mIsLocked[id] != TRUE)
+ llerrs << "Not locked in Thread: " << id << llendl;
+ mIsLocked[id] = FALSE;
+#endif
apr_thread_mutex_unlock(mAPRMutexp);
}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index c3d7650bd9..adef1a9192 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -33,9 +33,8 @@
#ifndef LL_LLTHREAD_H
#define LL_LLTHREAD_H
-#include "llapr.h"
#include "llapp.h"
-
+#include "llapr.h"
#include "apr_thread_cond.h"
class LLThread;
@@ -130,6 +129,8 @@ protected:
//============================================================================
+#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+
class LL_COMMON_API LLMutex
{
public:
@@ -144,6 +145,9 @@ protected:
apr_thread_mutex_t *mAPRMutexp;
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
+#if MUTEX_DEBUG
+ std::map<U32, BOOL> mIsLocked;
+#endif
};
// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index ea5b0c03ef..25b768079b 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -555,54 +555,3 @@ void secondsToTimecodeString(F32 current_time, std::string& tcstring)
}
-//////////////////////////////////////////////////////////////////////////////
-//
-// LLEventTimer Implementation
-//
-//////////////////////////////////////////////////////////////////////////////
-
-LLEventTimer::LLEventTimer(F32 period)
-: mEventTimer()
-{
- mPeriod = period;
-}
-
-LLEventTimer::LLEventTimer(const LLDate& time)
-: mEventTimer()
-{
- mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
-}
-
-
-LLEventTimer::~LLEventTimer()
-{
-}
-
-void LLEventTimer::updateClass()
-{
- std::list<LLEventTimer*> completed_timers;
- for (instance_iter iter = beginInstances(); iter != endInstances(); )
- {
- LLEventTimer* timer = *iter++;
- F32 et = timer->mEventTimer.getElapsedTimeF32();
- if (timer->mEventTimer.getStarted() && et > timer->mPeriod) {
- timer->mEventTimer.reset();
- if ( timer->tick() )
- {
- completed_timers.push_back( timer );
- }
- }
- }
-
- if ( completed_timers.size() > 0 )
- {
- for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
- completed_iter != completed_timers.end();
- completed_iter++ )
- {
- delete *completed_iter;
- }
- }
-}
-
-
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index d009c0f5f7..baba95bfa1 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -39,8 +39,6 @@
#include <limits.h>
#include "stdtypes.h"
-#include "lldate.h"
-#include "llinstancetracker.h"
#include <string>
#include <list>
@@ -171,25 +169,6 @@ LL_COMMON_API struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_dayli
LL_COMMON_API void microsecondsToTimecodeString(U64 current_time, std::string& tcstring);
LL_COMMON_API void secondsToTimecodeString(F32 current_time, std::string& tcstring);
-// class for scheduling a function to be called at a given frequency (approximate, inprecise)
-class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
-{
-public:
- LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
- LLEventTimer(const LLDate& time);
- virtual ~LLEventTimer();
-
- //function to be called at the supplied frequency
- // Normally return FALSE; TRUE will delete the timer after the function returns.
- virtual BOOL tick() = 0;
-
- static void updateClass();
-
-protected:
- LLTimer mEventTimer;
- F32 mPeriod;
-};
-
U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds
#endif
diff --git a/indra/llcommon/lltreeiterators.h b/indra/llcommon/lltreeiterators.h
index c946566e84..cb1304c54e 100644
--- a/indra/llcommon/lltreeiterators.h
+++ b/indra/llcommon/lltreeiterators.h
@@ -343,20 +343,20 @@ public:
/// Instantiate an LLTreeDFSIter to start a depth-first walk. Pass
/// functors to extract the 'child begin' and 'child end' iterators from
/// each node.
- LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc):
- mBeginFunc(beginfunc),
- mEndFunc(endfunc),
- mSkipChildren(false)
+ LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc)
+ : mBeginFunc(beginfunc),
+ mEndFunc(endfunc),
+ mSkipChildren(false)
{
// Only push back this node if it's non-NULL!
if (node)
mPending.push_back(node);
}
/// Instantiate an LLTreeDFSIter to mark the end of the walk
- LLTreeDFSIter() {}
+ LLTreeDFSIter() : mSkipChildren(false) {}
- /// flags iterator logic to skip traversing children of current node on next increment
- void skipDescendants(bool skip = true) { mSkipChildren = skip; }
+ /// flags iterator logic to skip traversing children of current node on next increment
+ void skipDescendants(bool skip = true) { mSkipChildren = skip; }
private:
/// leverage boost::iterator_facade
@@ -405,8 +405,8 @@ private:
func_type mBeginFunc;
/// functor to extract end() child iterator
func_type mEndFunc;
- /// flag which controls traversal of children (skip children of current node if true)
- bool mSkipChildren;
+ /// flag which controls traversal of children (skip children of current node if true)
+ bool mSkipChildren;
};
/**
@@ -451,21 +451,21 @@ public:
/// Instantiate an LLTreeDFSPostIter to start a depth-first walk. Pass
/// functors to extract the 'child begin' and 'child end' iterators from
/// each node.
- LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc):
- mBeginFunc(beginfunc),
- mEndFunc(endfunc),
- mSkipAncestors(false)
- {
+ LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc)
+ : mBeginFunc(beginfunc),
+ mEndFunc(endfunc),
+ mSkipAncestors(false)
+ {
if (! node)
return;
mPending.push_back(typename list_type::value_type(node, false));
makeCurrent();
}
/// Instantiate an LLTreeDFSPostIter to mark the end of the walk
- LLTreeDFSPostIter() {}
+ LLTreeDFSPostIter() : mSkipAncestors(false) {}
- /// flags iterator logic to skip traversing ancestors of current node on next increment
- void skipAncestors(bool skip = true) { mSkipAncestors = skip; }
+ /// flags iterator logic to skip traversing ancestors of current node on next increment
+ void skipAncestors(bool skip = true) { mSkipAncestors = skip; }
private:
/// leverage boost::iterator_facade
diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp
index f6e8f01f0e..9d4f3a98f0 100644
--- a/indra/llcommon/lluri.cpp
+++ b/indra/llcommon/lluri.cpp
@@ -46,10 +46,21 @@
void encode_character(std::ostream& ostr, std::string::value_type val)
{
- ostr << "%" << std::uppercase << std::hex << std::setw(2) << std::setfill('0')
+ ostr << "%"
+
+ << std::uppercase
+ << std::hex
+ << std::setw(2)
+ << std::setfill('0')
+
// VWR-4010 Cannot cast to U32 because sign-extension on
// chars > 128 will result in FFFFFFC3 instead of F3.
- << static_cast<S32>(static_cast<U8>(val));
+ << static_cast<S32>(static_cast<U8>(val))
+
+ // reset stream state
+ << std::nouppercase
+ << std::dec
+ << std::setfill(' ');
}
// static
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 71c6fc0591..0f1e59a18c 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -36,7 +36,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 31;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 3256;
+const S32 LL_VERSION_BUILD = 200030;
const char * const LL_CHANNEL = "Second Life Server";
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 082d054ba2..540aea4252 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -36,7 +36,7 @@
const S32 LL_VERSION_MAJOR = 2;
const S32 LL_VERSION_MINOR = 0;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 3256;
+const S32 LL_VERSION_BUILD = 200030;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp
index 5dda600755..1b0e03cb2a 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -188,6 +188,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
: mWorkerThread(workerthread),
mWorkerClassName(name),
mRequestHandle(LLWorkerThread::nullHandle()),
+ mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
mMutex(NULL),
mWorkFlags(0)
{
@@ -201,6 +202,7 @@ LLWorkerClass::~LLWorkerClass()
{
llassert_always(!(mWorkFlags & WCF_WORKING));
llassert_always(mWorkFlags & WCF_DELETE_REQUESTED);
+ llassert_always(!mMutex.isLocked());
if (mRequestHandle != LLWorkerThread::nullHandle())
{
LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle);
diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h
index a12bd52a64..a1e85d2ecc 100644
--- a/indra/llcommon/llworkerthread.h
+++ b/indra/llcommon/llworkerthread.h
@@ -52,6 +52,7 @@ class LLWorkerClass;
class LL_COMMON_API LLWorkerThread : public LLQueuedThread
{
+ friend class LLWorkerClass;
public:
class WorkRequest : public LLQueuedThread::QueuedRequest
{
@@ -92,8 +93,11 @@ public:
handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
- void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug
+
+private:
+ void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion
+
};
//============================================================================
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 1558df231a..6785d0cf17 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -545,6 +545,15 @@ namespace tut
// output order
void ErrorTestObject::test<10>()
{
+#if LL_LINUX
+ skip("Fails on Linux, see comments");
+// on Linux:
+// [error, 10] fail: 'order is time type location function message: expected
+// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
+// writeReturningLocationAndFunction: apple' actual
+// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
+// LLError::NoClassInfo::writeReturningLocationAndFunction: apple''
+#endif
LLError::setPrintLocation(true);
LLError::setTimeFunction(roswell);
mRecorder.setWantsTime(true);
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
new file mode 100644
index 0000000000..4bb3ec2922
--- /dev/null
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -0,0 +1,166 @@
+/**
+ * @file llinstancetracker_test.cpp
+ * @author Nat Goodspeed
+ * @date 2009-11-10
+ * @brief Test for llinstancetracker.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+#include <string>
+#include <vector>
+#include <set>
+#include <algorithm> // std::sort()
+// std headers
+// external library headers
+#include <boost/scoped_ptr.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+
+struct Keyed: public LLInstanceTracker<Keyed, std::string>
+{
+ Keyed(const std::string& name):
+ LLInstanceTracker<Keyed, std::string>(name),
+ mName(name)
+ {}
+ std::string mName;
+};
+
+struct Unkeyed: public LLInstanceTracker<Unkeyed>
+{
+};
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llinstancetracker_data
+ {
+ };
+ typedef test_group<llinstancetracker_data> llinstancetracker_group;
+ typedef llinstancetracker_group::object object;
+ llinstancetracker_group llinstancetrackergrp("llinstancetracker");
+
+ template<> template<>
+ void object::test<1>()
+ {
+ ensure_equals(Keyed::instanceCount(), 0);
+ {
+ Keyed one("one");
+ ensure_equals(Keyed::instanceCount(), 1);
+ Keyed* found = Keyed::getInstance("one");
+ ensure("couldn't find stack Keyed", found);
+ ensure_equals("found wrong Keyed instance", found, &one);
+ {
+ boost::scoped_ptr<Keyed> two(new Keyed("two"));
+ ensure_equals(Keyed::instanceCount(), 2);
+ Keyed* found = Keyed::getInstance("two");
+ ensure("couldn't find heap Keyed", found);
+ ensure_equals("found wrong Keyed instance", found, two.get());
+ }
+ ensure_equals(Keyed::instanceCount(), 1);
+ }
+ Keyed* found = Keyed::getInstance("one");
+ ensure("Keyed key lives too long", ! found);
+ ensure_equals(Keyed::instanceCount(), 0);
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ ensure_equals(Unkeyed::instanceCount(), 0);
+ {
+ Unkeyed one;
+ ensure_equals(Unkeyed::instanceCount(), 1);
+ Unkeyed* found = Unkeyed::getInstance(&one);
+ ensure_equals(found, &one);
+ {
+ boost::scoped_ptr<Unkeyed> two(new Unkeyed);
+ ensure_equals(Unkeyed::instanceCount(), 2);
+ Unkeyed* found = Unkeyed::getInstance(two.get());
+ ensure_equals(found, two.get());
+ }
+ ensure_equals(Unkeyed::instanceCount(), 1);
+ }
+ ensure_equals(Unkeyed::instanceCount(), 0);
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ Keyed one("one"), two("two"), three("three");
+ // We don't want to rely on the underlying container delivering keys
+ // in any particular order. That allows us the flexibility to
+ // reimplement LLInstanceTracker using, say, a hash map instead of a
+ // std::map. We DO insist that every key appear exactly once.
+ typedef std::vector<std::string> StringVector;
+ StringVector keys(Keyed::beginKeys(), Keyed::endKeys());
+ std::sort(keys.begin(), keys.end());
+ StringVector::const_iterator ki(keys.begin());
+ ensure_equals(*ki++, "one");
+ ensure_equals(*ki++, "three");
+ ensure_equals(*ki++, "two");
+ // Use ensure() here because ensure_equals would want to display
+ // mismatched values, and frankly that wouldn't help much.
+ ensure("didn't reach end", ki == keys.end());
+
+ // Use a somewhat different approach to order independence with
+ // beginInstances(): explicitly capture the instances we know in a
+ // set, and delete them as we iterate through.
+ typedef std::set<Keyed*> InstanceSet;
+ InstanceSet instances;
+ instances.insert(&one);
+ instances.insert(&two);
+ instances.insert(&three);
+ for (Keyed::instance_iter ii(Keyed::beginInstances()), iend(Keyed::endInstances());
+ ii != iend; ++ii)
+ {
+ Keyed& ref = *ii;
+ ensure_equals("spurious instance", instances.erase(&ref), 1);
+ }
+ ensure_equals("unreported instance", instances.size(), 0);
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ Unkeyed one, two, three;
+ typedef std::set<Unkeyed*> KeySet;
+ KeySet keys;
+ keys.insert(&one);
+ keys.insert(&two);
+ keys.insert(&three);
+ {
+ Unkeyed::LLInstanceTrackerScopedGuard guard;
+ for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys());
+ ki != kend; ++ki)
+ {
+ ensure_equals("spurious key", keys.erase(*ki), 1);
+ }
+ }
+ ensure_equals("unreported key", keys.size(), 0);
+
+ KeySet instances;
+ instances.insert(&one);
+ instances.insert(&two);
+ instances.insert(&three);
+ {
+ Unkeyed::LLInstanceTrackerScopedGuard guard;
+ for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances());
+ ii != iend; ++ii)
+ {
+ Unkeyed& ref = *ii;
+ ensure_equals("spurious instance", instances.erase(&ref), 1);
+ }
+ }
+ ensure_equals("unreported instance", instances.size(), 0);
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp
index d6d9f68110..31c70b4daa 100644
--- a/indra/llcommon/tests/lltreeiterators_test.cpp
+++ b/indra/llcommon/tests/lltreeiterators_test.cpp
@@ -35,9 +35,6 @@
// Precompiled header
#include "linden_common.h"
-#if LL_WINDOWS
-#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-#endif
// STL headers
// std headers
diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt
index 0635ddd5f5..22be4078a1 100644
--- a/indra/llimage/CMakeLists.txt
+++ b/indra/llimage/CMakeLists.txt
@@ -3,6 +3,7 @@
project(llimage)
include(00-Common)
+include(LLAddBuildTest)
include(LLCommon)
include(LLImage)
include(LLMath)
@@ -59,3 +60,6 @@ target_link_libraries(llimage
${PNG_LIBRARIES}
${ZLIB_LIBRARIES}
)
+
+# Add tests
+#ADD_BUILD_TEST(llimageworker llimage)
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 9bbc55509d..5649b4cab7 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -55,13 +55,9 @@ std::string LLImage::sLastErrorMessage;
LLMutex* LLImage::sMutex = NULL;
//static
-void LLImage::initClass(LLWorkerThread* workerthread)
+void LLImage::initClass()
{
sMutex = new LLMutex(NULL);
- if (workerthread)
- {
- LLImageWorker::initImageWorker(workerthread);
- }
LLImageJ2C::openDSO();
}
@@ -69,7 +65,6 @@ void LLImage::initClass(LLWorkerThread* workerthread)
void LLImage::cleanupClass()
{
LLImageJ2C::closeDSO();
- LLImageWorker::cleanupImageWorker();
delete sMutex;
sMutex = NULL;
}
@@ -316,6 +311,21 @@ void LLImageRaw::deleteData()
LLImageBase::deleteData();
}
+void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components)
+{
+ if(data == getData())
+ {
+ return ;
+ }
+
+ deleteData();
+
+ LLImageBase::setSize(width, height, components) ;
+ LLImageBase::setDataAndSize(data, width * height * components) ;
+
+ sGlobalRawMemory += getDataSize();
+}
+
BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)
{
if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components))
@@ -658,10 +668,13 @@ void LLImageRaw::fill( const LLColor4U& color )
// Src and dst can be any size. Src and dst can each have 3 or 4 components.
void LLImageRaw::copy(LLImageRaw* src)
{
- LLImageRaw* dst = this; // Just for clarity.
+ if (!src)
+ {
+ llwarns << "LLImageRaw::copy called with a null src pointer" << llendl;
+ return;
+ }
- llassert( (3 == src->getComponents()) || (4 == src->getComponents()) );
- llassert( (3 == dst->getComponents()) || (4 == dst->getComponents()) );
+ LLImageRaw* dst = this; // Just for clarity.
if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) )
{
@@ -816,6 +829,51 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
}
}
+//scale down image by not blending a pixel with its neighbors.
+BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)
+{
+ LLMemType mt1(mMemType);
+
+ S8 c = getComponents() ;
+ llassert((1 == c) || (3 == c) || (4 == c) );
+
+ S32 old_width = getWidth();
+ S32 old_height = getHeight();
+
+ S32 new_data_size = old_width * new_height * c ;
+ llassert_always(new_data_size > 0);
+
+ F32 ratio_x = (F32)old_width / new_width ;
+ F32 ratio_y = (F32)old_height / new_height ;
+ if( ratio_x < 1.0f || ratio_y < 1.0f )
+ {
+ return TRUE; // Nothing to do.
+ }
+ ratio_x -= 1.0f ;
+ ratio_y -= 1.0f ;
+
+ U8* new_data = new U8[new_data_size] ;
+ llassert_always(new_data != NULL) ;
+
+ U8* old_data = getData() ;
+ S32 i, j, k, s, t;
+ for(i = 0, s = 0, t = 0 ; i < new_height ; i++)
+ {
+ for(j = 0 ; j < new_width ; j++)
+ {
+ for(k = 0 ; k < c ; k++)
+ {
+ new_data[s++] = old_data[t++] ;
+ }
+ t += (S32)(ratio_x * c + 0.1f) ;
+ }
+ t += (S32)(ratio_y * old_width * c + 0.1f) ;
+ }
+
+ setDataAndSize(new_data, new_width, new_height, c) ;
+
+ return TRUE ;
+}
BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
{
@@ -1223,25 +1281,28 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
ifs.read ((char*)buffer, length);
ifs.close();
- image->updateData();
-
- if (j2c_lowest_mip_only && codec == IMG_CODEC_J2C)
+ BOOL success;
+
+ success = image->updateData();
+ if (success)
{
- S32 width = image->getWidth();
- S32 height = image->getHeight();
- S32 discard_level = 0;
- while (width > 1 && height > 1 && discard_level < MAX_DISCARD_LEVEL)
+ if (j2c_lowest_mip_only && codec == IMG_CODEC_J2C)
{
- width >>= 1;
- height >>= 1;
- discard_level++;
+ S32 width = image->getWidth();
+ S32 height = image->getHeight();
+ S32 discard_level = 0;
+ while (width > 1 && height > 1 && discard_level < MAX_DISCARD_LEVEL)
+ {
+ width >>= 1;
+ height >>= 1;
+ discard_level++;
+ }
+ ((LLImageJ2C *)((LLImageFormatted*)image))->setDiscardLevel(discard_level);
}
- ((LLImageJ2C *)((LLImageFormatted*)image))->setDiscardLevel(discard_level);
+ success = image->decode(this, 100000.0f);
}
-
- BOOL success = image->decode(this, 100000.0f);
- image = NULL; // deletes image
+ image = NULL; // deletes image
if (!success)
{
deleteData();
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 8108553107..686f583886 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -50,7 +50,8 @@ const S32 MAX_IMAGE_AREA = MAX_IMAGE_SIZE * MAX_IMAGE_SIZE;
const S32 MAX_IMAGE_COMPONENTS = 8;
const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS;
-// Note! These CANNOT be changed without invalidating the viewer VFS files, I think?
+// Note! These CANNOT be changed without modifying simulator code
+// *TODO: change both to 1024 when SIM texture fetching is deprecated
const S32 FIRST_PACKET_SIZE = 600;
const S32 MAX_IMG_PACKET_SIZE = 1000;
@@ -61,7 +62,6 @@ const S32 MAX_IMG_PACKET_SIZE = 1000;
class LLImageFormatted;
class LLImageRaw;
class LLColor4U;
-class LLWorkerThread;
typedef enum e_image_codec
{
@@ -82,7 +82,7 @@ typedef enum e_image_codec
class LLImage
{
public:
- static void initClass(LLWorkerThread* workerthread);
+ static void initClass();
static void cleanupClass();
static const std::string& getLastError();
@@ -131,7 +131,7 @@ public:
protected:
// special accessor to allow direct setting of mData and mDataSize by LLImageFormatted
- void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; };
+ void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }
public:
static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
@@ -192,6 +192,7 @@ public:
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
+ BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;
// Fill the buffer with a constant color
void fill( const LLColor4U& color );
@@ -240,6 +241,8 @@ protected:
U8 fastFractionalMult(U8 a,U8 b);
+ void setDataAndSize(U8 *data, S32 width, S32 height, S8 components) ;
+
public:
static S32 sGlobalRawMemory;
static S32 sRawImageCount;
@@ -310,7 +313,7 @@ protected:
protected:
S8 mCodec;
S8 mDecoding;
- S8 mDecoded;
+ S8 mDecoded; // unused, but changing LLImage layout requires recompiling static Mac/Linux libs. 2009-01-30 JC
S8 mDiscardLevel;
public:
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 1ce4517a0d..0aa6840ff6 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -264,6 +264,8 @@ void LLImageDXT::setFormat()
// virtual
BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
{
+ // *TODO: Test! This has been tweaked since its intial inception,
+ // but we don't use it any more!
llassert_always(raw_image);
if (mFileFormat >= FORMAT_DXT1 && mFileFormat <= FORMAT_DXR5)
@@ -274,8 +276,17 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
S32 width = getWidth(), height = getHeight();
S32 ncomponents = getComponents();
+ U8* data = NULL;
+ if (mDiscardLevel >= 0)
+ {
+ data = getData() + getMipOffset(mDiscardLevel);
+ calcDiscardWidthHeight(mDiscardLevel, mFileFormat, width, height);
+ }
+ else
+ {
+ data = getData() + getMipOffset(0);
+ }
S32 image_size = formatBytes(mFileFormat, width, height);
- U8* data = getData() + getMipOffset(0);
if ((!getData()) || (data + image_size > getData() + getDataSize()))
{
@@ -300,10 +311,8 @@ BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
llerrs << "Request for invalid discard level" << llendl;
}
U8* data = getData() + getMipOffset(discard);
- // I'm not sure these are the correct initial values for height and width,
- // but previously they were being used uninitialized. JC
- S32 width = raw->getWidth();
- S32 height = raw->getHeight();
+ S32 width = 0;
+ S32 height = 0;
calcDiscardWidthHeight(discard, mFileFormat, width, height);
raw = new LLImageRaw(data, width, height, getComponents());
return TRUE;
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 2352c8edd7..74f08b2d0b 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -283,6 +283,7 @@ BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
}
+// Returns TRUE to mean done, whether successful or not.
BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
{
LLMemType mt1(mMemType);
@@ -295,7 +296,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
if (!getData() || (getDataSize() < 16))
{
setLastError("LLImageJ2C uninitialized");
- res = FALSE;
+ res = TRUE; // done
}
else
{
@@ -348,7 +349,7 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text,
//static
S32 LLImageJ2C::calcHeaderSizeJ2C()
{
- return 600; //2048; // ??? hack... just needs to be >= actual header size...
+ return FIRST_PACKET_SIZE; // Hack. just needs to be >= actual header size...
}
//static
diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp
index fa0dd3ff05..79ea79cc07 100644
--- a/indra/llimage/llimagejpeg.cpp
+++ b/indra/llimage/llimagejpeg.cpp
@@ -188,6 +188,7 @@ void LLImageJPEG::decodeTermSource (j_decompress_ptr cinfo)
}
+// Returns true when done, whether or not decode was successful.
BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
{
llassert_always(raw_image);
@@ -198,7 +199,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
if (!getData() || (0 == getDataSize()))
{
setLastError("LLImageJPEG trying to decode an image with no data!");
- return FALSE;
+ return TRUE; // done
}
S32 row_stride = 0;
@@ -226,7 +227,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
if(setjmp(sSetjmpBuffer))
{
jpeg_destroy_decompress(&cinfo);
- return FALSE;
+ return TRUE; // done
}
try
{
@@ -320,7 +321,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
catch (int)
{
jpeg_destroy_decompress(&cinfo);
- return FALSE;
+ return TRUE; // done
}
// Check to see whether any corrupt-data warnings occurred
@@ -328,7 +329,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
{
// TODO: extract the warning to find out what went wrong.
setLastError( "Unable to decode JPEG image.");
- return FALSE;
+ return TRUE; // done
}
return TRUE;
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index 532e996188..20a72d0a28 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -37,152 +37,143 @@
//----------------------------------------------------------------------------
-//static
-LLWorkerThread* LLImageWorker::sWorkerThread = NULL;
-S32 LLImageWorker::sCount = 0;
+// MAIN THREAD
+LLImageDecodeThread::LLImageDecodeThread(bool threaded)
+ : LLQueuedThread("imagedecode", threaded)
+{
+ mCreationMutex = new LLMutex(getAPRPool());
+}
+
+// MAIN THREAD
+// virtual
+S32 LLImageDecodeThread::update(U32 max_time_ms)
+{
+ LLMutexLock lock(mCreationMutex);
+ for (creation_list_t::iterator iter = mCreationList.begin();
+ iter != mCreationList.end(); ++iter)
+ {
+ creation_info& info = *iter;
+ ImageRequest* req = new ImageRequest(info.handle, info.image,
+ info.priority, info.discard, info.needs_aux,
+ info.responder);
+
+ bool res = addRequest(req);
+ if (!res)
+ {
+ llerrs << "request added after LLLFSThread::cleanupClass()" << llendl;
+ }
+ }
+ mCreationList.clear();
+ S32 res = LLQueuedThread::update(max_time_ms);
+ return res;
+}
-//static
-void LLImageWorker::initImageWorker(LLWorkerThread* workerthread)
+LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image,
+ U32 priority, S32 discard, BOOL needs_aux, Responder* responder)
{
- sWorkerThread = workerthread;
+ LLMutexLock lock(mCreationMutex);
+ handle_t handle = generateHandle();
+ mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
+ return handle;
}
-//static
-void LLImageWorker::cleanupImageWorker()
+// Used by unit test only
+// Returns the size of the mutex guarded list as an indication of sanity
+S32 LLImageDecodeThread::tut_size()
+{
+ LLMutexLock lock(mCreationMutex);
+ S32 res = mCreationList.size();
+ return res;
+}
+
+LLImageDecodeThread::Responder::~Responder()
{
}
//----------------------------------------------------------------------------
-LLImageWorker::LLImageWorker(LLImageFormatted* image, U32 priority,
- S32 discard,
- LLPointer<LLResponder> responder)
- : LLWorkerClass(sWorkerThread, "Image"),
+LLImageDecodeThread::ImageRequest::ImageRequest(handle_t handle, LLImageFormatted* image,
+ U32 priority, S32 discard, BOOL needs_aux,
+ LLImageDecodeThread::Responder* responder)
+ : LLQueuedThread::QueuedRequest(handle, priority, FLAG_AUTO_COMPLETE),
mFormattedImage(image),
- mDecodedType(-1),
mDiscardLevel(discard),
- mPriority(priority),
+ mNeedsAux(needs_aux),
+ mDecodedRaw(FALSE),
+ mDecodedAux(FALSE),
mResponder(responder)
{
- ++sCount;
}
-LLImageWorker::~LLImageWorker()
+LLImageDecodeThread::ImageRequest::~ImageRequest()
{
- mDecodedImage = NULL;
+ mDecodedImageRaw = NULL;
+ mDecodedImageAux = NULL;
mFormattedImage = NULL;
- --sCount;
}
//----------------------------------------------------------------------------
-//virtual, main thread
-void LLImageWorker::startWork(S32 param)
-{
- llassert_always(mDecodedImage.isNull());
- mDecodedType = -1;
-}
-bool LLImageWorker::doWork(S32 param)
+// Returns true when done, whether or not decode was successful.
+bool LLImageDecodeThread::ImageRequest::processRequest()
{
- bool decoded = false;
- if(mDecodedImage.isNull())
- {
- if (!mFormattedImage->updateData())
- {
- mDecodedType = -2; // failed
- return true;
- }
- if (mDiscardLevel >= 0)
- {
- mFormattedImage->setDiscardLevel(mDiscardLevel);
- }
- if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents()))
- {
- decoded = true; // failed
- }
- else
- {
- mDecodedImage = new LLImageRaw(); // allow possibly smaller size set during decoding
- }
- }
- if (!decoded)
+ const F32 decode_time_slice = .1f;
+ bool done = true;
+ if (!mDecodedRaw && mFormattedImage.notNull())
{
- if (param == 0)
- {
- // Decode primary channels
- decoded = mFormattedImage->decode(mDecodedImage, .1f); // 1ms
- }
- else
+ // Decode primary channels
+ if (mDecodedImageRaw.isNull())
{
- // Decode aux channel
- decoded = mFormattedImage->decodeChannels(mDecodedImage, .1f, param, param); // 1ms
+ // parse formatted header
+ if (!mFormattedImage->updateData())
+ {
+ return true; // done (failed)
+ }
+ if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents()))
+ {
+ return true; // done (failed)
+ }
+ if (mDiscardLevel >= 0)
+ {
+ mFormattedImage->setDiscardLevel(mDiscardLevel);
+ }
+ mDecodedImageRaw = new LLImageRaw(mFormattedImage->getWidth(),
+ mFormattedImage->getHeight(),
+ mFormattedImage->getComponents());
}
+ done = mFormattedImage->decode(mDecodedImageRaw, decode_time_slice); // 1ms
+ mDecodedRaw = done;
}
- if (decoded)
+ if (done && mNeedsAux && !mDecodedAux && mFormattedImage.notNull())
{
- // Call the callback immediately; endWork doesn't get called until ckeckWork
- if (mResponder.notNull())
+ // Decode aux channel
+ if (!mDecodedImageAux)
{
- bool success = (!wasAborted() && mDecodedImage.notNull() && mDecodedImage->getDataSize() != 0);
- mResponder->completed(success);
+ mDecodedImageAux = new LLImageRaw(mFormattedImage->getWidth(),
+ mFormattedImage->getHeight(),
+ 1);
}
+ done = mFormattedImage->decodeChannels(mDecodedImageAux, decode_time_slice, 4, 4); // 1ms
+ mDecodedAux = done;
}
- return decoded;
-}
-void LLImageWorker::endWork(S32 param, bool aborted)
-{
- if (mDecodedType != -2)
- {
- mDecodedType = aborted ? -2 : param;
- }
+ return done;
}
-//----------------------------------------------------------------------------
-
-
-BOOL LLImageWorker::requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard)
+void LLImageDecodeThread::ImageRequest::finishRequest(bool completed)
{
- // For most codecs, only mDiscardLevel data is available.
- // (see LLImageDXT for exception)
- if (discard >= 0 && discard != mFormattedImage->getDiscardLevel())
+ if (mResponder.notNull())
{
- llerrs << "Request for invalid discard level" << llendl;
- }
- checkWork();
- if (mDecodedType == -2)
- {
- return TRUE; // aborted, done
- }
- if (mDecodedType != channel)
- {
- if (!haveWork())
- {
- addWork(channel, mPriority);
- }
- return FALSE;
- }
- else
- {
- llassert_always(!haveWork());
- llassert_always(mDecodedType == channel);
- raw = mDecodedImage; // smart pointer acquires ownership of data
- mDecodedImage = NULL;
- return TRUE;
+ bool success = completed && mDecodedRaw && (!mNeedsAux || mDecodedAux);
+ mResponder->completed(success, mDecodedImageRaw, mDecodedImageAux);
}
+ // Will automatically be deleted
}
-BOOL LLImageWorker::requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard)
+// Used by unit test only
+// Checks that a responder exists for this instance so that something can happen when completion is reached
+bool LLImageDecodeThread::ImageRequest::tut_isOK()
{
- if (mFormattedImage->getCodec() == IMG_CODEC_DXT)
- {
- // special case
- LLImageDXT* imagedxt = (LLImageDXT*)((LLImageFormatted*)mFormattedImage);
- return imagedxt->getMipData(raw, discard);
- }
- else
- {
- return requestDecodedAuxData(raw, 0, discard);
- }
+ return mResponder.notNull();
}
diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h
index 0d66695d6e..6a5b86a277 100644
--- a/indra/llimage/llimageworker.h
+++ b/indra/llimage/llimageworker.h
@@ -37,49 +37,72 @@
#include "llpointer.h"
#include "llworkerthread.h"
-class LLImageWorker : public LLWorkerClass
+class LLImageDecodeThread : public LLQueuedThread
{
public:
- static void initImageWorker(LLWorkerThread* workerthread);
- static void cleanupImageWorker();
-
-public:
- static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
-
- // LLWorkerThread
-public:
- LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard,
- LLPointer<LLResponder> responder);
- ~LLImageWorker();
-
- // called from WORKER THREAD, returns TRUE if done
- /*virtual*/ bool doWork(S32 param);
-
- BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1);
- BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1);
- void releaseDecodedData();
- void cancelDecode();
+ class Responder : public LLThreadSafeRefCount
+ {
+ protected:
+ virtual ~Responder();
+ public:
+ virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) = 0;
+ };
-private:
- // called from MAIN THREAD
- /*virtual*/ void startWork(S32 param); // called from addWork()
- /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork()
+ class ImageRequest : public LLQueuedThread::QueuedRequest
+ {
+ protected:
+ virtual ~ImageRequest(); // use deleteRequest()
+
+ public:
+ ImageRequest(handle_t handle, LLImageFormatted* image,
+ U32 priority, S32 discard, BOOL needs_aux,
+ LLImageDecodeThread::Responder* responder);
-protected:
- LLPointer<LLImageFormatted> mFormattedImage;
- LLPointer<LLImageRaw> mDecodedImage;
- S32 mDecodedType;
- S32 mDiscardLevel;
+ /*virtual*/ bool processRequest();
+ /*virtual*/ void finishRequest(bool completed);
-private:
- U32 mPriority;
- LLPointer<LLResponder> mResponder;
+ // Used by unit tests to check the consitency of the request instance
+ bool tut_isOK();
+
+ private:
+ // input
+ LLPointer<LLImageFormatted> mFormattedImage;
+ S32 mDiscardLevel;
+ BOOL mNeedsAux;
+ // output
+ LLPointer<LLImageRaw> mDecodedImageRaw;
+ LLPointer<LLImageRaw> mDecodedImageAux;
+ BOOL mDecodedRaw;
+ BOOL mDecodedAux;
+ LLPointer<LLImageDecodeThread::Responder> mResponder;
+ };
-protected:
- static LLWorkerThread* sWorkerThread;
-
public:
- static S32 sCount;
+ LLImageDecodeThread(bool threaded = true);
+ handle_t decodeImage(LLImageFormatted* image,
+ U32 priority, S32 discard, BOOL needs_aux,
+ Responder* responder);
+ S32 update(U32 max_time_ms);
+
+ // Used by unit tests to check the consistency of the thread instance
+ S32 tut_size();
+
+private:
+ struct creation_info
+ {
+ handle_t handle;
+ LLPointer<LLImageFormatted> image;
+ U32 priority;
+ S32 discard;
+ BOOL needs_aux;
+ LLPointer<Responder> responder;
+ creation_info(handle_t h, LLImageFormatted* i, U32 p, S32 d, BOOL aux, Responder* r)
+ : handle(h), image(i), priority(p), discard(d), needs_aux(aux), responder(r)
+ {}
+ };
+ typedef std::list<creation_info> creation_list_t;
+ creation_list_t mCreationList;
+ LLMutex* mCreationMutex;
};
#endif
diff --git a/indra/llimage/tests/llimageworker_test.cpp b/indra/llimage/tests/llimageworker_test.cpp
new file mode 100644
index 0000000000..cc44696a45
--- /dev/null
+++ b/indra/llimage/tests/llimageworker_test.cpp
@@ -0,0 +1,260 @@
+/**
+ * @file llimageworker_test.cpp
+ * @author Merov Linden
+ * @date 2009-04-28
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include <list>
+#include <map>
+#include <algorithm>
+// Class to test
+#include "../llimageworker.h"
+// For timer class
+#include "../llcommon/lltimer.h"
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+LLImageBase::LLImageBase() {}
+LLImageBase::~LLImageBase() {}
+void LLImageBase::dump() { }
+void LLImageBase::sanityCheck() { }
+void LLImageBase::deleteData() { }
+U8* LLImageBase::allocateData(S32 size) { return NULL; }
+U8* LLImageBase::reallocateData(S32 size) { return NULL; }
+
+LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components) { }
+LLImageRaw::~LLImageRaw() { }
+void LLImageRaw::deleteData() { }
+U8* LLImageRaw::allocateData(S32 size) { return NULL; }
+U8* LLImageRaw::reallocateData(S32 size) { return NULL; }
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+ // Test wrapper declarations
+
+ // Note: We derive the responder class for 2 reasons:
+ // 1. It's a pure virtual class and we can't compile without completed() being implemented
+ // 2. We actually need a responder to test that the thread work test completed
+ // We implement this making no assumption on what's done in the thread or worker
+ // though, just that the responder's completed() method is called in the end.
+ // Note on responders: responders are ref counted and *will* be deleted by the request they are
+ // attached to when the queued request is deleted. The recommended way of using them is to
+ // create them when creating a request, put a callback method in completed() and not rely on
+ // anything to survive in the responder object once completed() has been called. Let the request
+ // do the deletion and clean up itself.
+ class responder_test : public LLImageDecodeThread::Responder
+ {
+ public:
+ responder_test(bool* res)
+ {
+ done = res;
+ *done = false;
+ }
+ virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)
+ {
+ *done = true;
+ }
+ private:
+ // This is what can be thought of as the minimal implementation of a responder
+ // Done will be switched to true when completed() is called and can be tested
+ // outside the responder. A better way of doing this is to store a callback here.
+ bool* done;
+ };
+
+ // Test wrapper declaration : decode thread
+ struct imagedecodethread_test
+ {
+ // Instance to be tested
+ LLImageDecodeThread* mThread;
+
+ // Constructor and destructor of the test wrapper
+ imagedecodethread_test()
+ {
+ mThread = NULL;
+ }
+ ~imagedecodethread_test()
+ {
+ delete mThread;
+ }
+ };
+
+ // Test wrapper declaration : image worker
+ // Note: this class is not meant to be instantiated outside an LLImageDecodeThread instance
+ // but it's not a bad idea to get its public API a good shake as part of a thorough unit test set.
+ // Some gotcha with the destructor though (see below).
+ struct imagerequest_test
+ {
+ // Instance to be tested
+ LLImageDecodeThread::ImageRequest* mRequest;
+ bool done;
+
+ // Constructor and destructor of the test wrapper
+ imagerequest_test()
+ {
+ done = false;
+ mRequest = new LLImageDecodeThread::ImageRequest(0, 0,
+ LLQueuedThread::PRIORITY_NORMAL, 0, FALSE,
+ new responder_test(&done));
+ }
+ ~imagerequest_test()
+ {
+ // We should delete the object *but*, because its destructor is protected, that cannot be
+ // done from outside an LLImageDecodeThread instance... So we leak memory here... It's fine...
+ //delete mRequest;
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<imagedecodethread_test> imagedecodethread_t;
+ typedef imagedecodethread_t::object imagedecodethread_object_t;
+ tut::imagedecodethread_t tut_imagedecodethread("imagedecodethread");
+
+ typedef test_group<imagerequest_test> imagerequest_t;
+ typedef imagerequest_t::object imagerequest_object_t;
+ tut::imagerequest_t tut_imagerequest("imagerequest");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLImageDecodeThread interface
+ // ---------------------------------------------------------------------------------------
+ //
+ // Note on Unit Testing Queued Thread Classes
+ //
+ // Since methods on such a class are called on a separate loop and that we can't insert tut
+ // ensure() calls in there, we exercise the class with 2 sets of tests:
+ // - 1: Test as a single threaded instance: We declare the class but ask for no thread
+ // to be spawned (easy with LLThreads since there's a boolean argument on the constructor
+ // just for that). We can then unit test each public method like we do on a normal class.
+ // - 2: Test as a threaded instance: We let the thread launch and check that its external
+ // behavior is as expected (i.e. it runs, can accept a work order and processes
+ // it). Typically though there's no guarantee that this exercises all the methods of the
+ // class which is why we also need the previous "non threaded" set of unit tests for
+ // complete coverage.
+ //
+ // ---------------------------------------------------------------------------------------
+
+ template<> template<>
+ void imagedecodethread_object_t::test<1>()
+ {
+ // Test a *non threaded* instance of the class
+ mThread = new LLImageDecodeThread(false);
+ ensure("LLImageDecodeThread: non threaded constructor failed", mThread != NULL);
+ // Test that we start with an empty list right at creation
+ ensure("LLImageDecodeThread: non threaded init state incorrect", mThread->tut_size() == 0);
+ // Insert something in the queue
+ bool done = false;
+ LLImageDecodeThread::handle_t decodeHandle = mThread->decodeImage(NULL, LLQueuedThread::PRIORITY_NORMAL, 0, FALSE, new responder_test(&done));
+ // Verifies we got a valid handle
+ ensure("LLImageDecodeThread: non threaded decodeImage(), returned handle is null", decodeHandle != 0);
+ // Verifies that we do now have something in the queued list
+ ensure("LLImageDecodeThread: non threaded decodeImage() insertion in threaded list failed", mThread->tut_size() == 1);
+ // Trigger queue handling "manually" (on a threaded instance, this is done on the thread loop)
+ S32 res = mThread->update(0);
+ // Verifies that we successfully handled the list
+ ensure("LLImageDecodeThread: non threaded update() list handling test failed", res == 0);
+ // Verifies that the list is now empty
+ ensure("LLImageDecodeThread: non threaded update() list emptying test failed", mThread->tut_size() == 0);
+ }
+
+ template<> template<>
+ void imagedecodethread_object_t::test<2>()
+ {
+ // Test a *threaded* instance of the class
+ mThread = new LLImageDecodeThread(true);
+ ensure("LLImageDecodeThread: threaded constructor failed", mThread != NULL);
+ // Test that we start with an empty list right at creation
+ ensure("LLImageDecodeThread: threaded init state incorrect", mThread->tut_size() == 0);
+ // Insert something in the queue
+ bool done = false;
+ LLImageDecodeThread::handle_t decodeHandle = mThread->decodeImage(NULL, LLQueuedThread::PRIORITY_NORMAL, 0, FALSE, new responder_test(&done));
+ // Verifies we get back a valid handle
+ ensure("LLImageDecodeThread: threaded decodeImage(), returned handle is null", decodeHandle != 0);
+ // Wait a little so to simulate the main thread doing something on its main loop...
+ ms_sleep(500); // 500 milliseconds
+ // Verifies that the responder has *not* been called yet in the meantime
+ ensure("LLImageDecodeThread: responder creation failed", done == false);
+ // Ask the thread to update: that means tells the queue to check itself and creates work requests
+ mThread->update(1);
+ // Wait till the thread has time to handle the work order (though it doesn't do much per work order...)
+ const U32 INCREMENT_TIME = 500; // 500 milliseconds
+ const U32 MAX_TIME = 20 * INCREMENT_TIME; // Do the loop 20 times max, i.e. wait 10 seconds but no more
+ U32 total_time = 0;
+ while ((done == false) && (total_time < MAX_TIME))
+ {
+ ms_sleep(INCREMENT_TIME);
+ total_time += INCREMENT_TIME;
+ }
+ // Verifies that the responder has now been called
+ ensure("LLImageDecodeThread: threaded work unit not processed", done == true);
+ }
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLImageDecodeThread::ImageRequest interface
+ // ---------------------------------------------------------------------------------------
+
+ template<> template<>
+ void imagerequest_object_t::test<1>()
+ {
+ // Test that we start with a correct request at creation
+ ensure("LLImageDecodeThread::ImageRequest::ImageRequest() constructor test failed", mRequest->tut_isOK());
+ bool res = mRequest->processRequest();
+ // Verifies that we processed the request successfully
+ ensure("LLImageDecodeThread::ImageRequest::processRequest() processing request test failed", res == true);
+ // Check that we can call the finishing call safely
+ try {
+ mRequest->finishRequest(false);
+ } catch (...) {
+ fail("LLImageDecodeThread::ImageRequest::finishRequest() test failed");
+ }
+ }
+}
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index ec6264dcf5..3af31da083 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -97,7 +97,8 @@ void info_callback(const char* msg, void*)
}
-LLImageJ2COJ::LLImageJ2COJ() : LLImageJ2CImpl()
+LLImageJ2COJ::LLImageJ2COJ()
+ : LLImageJ2CImpl()
{
}
@@ -168,7 +169,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
// dereference the array.
if(!image || !image->numcomps)
{
- llwarns << "ERROR -> decodeImpl: failed to decode image!" << llendl;
+ LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image!" << LL_ENDL;
if (image)
{
opj_image_destroy(image);
@@ -241,7 +242,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
}
else // Some rare OpenJPEG versions have this bug.
{
- llwarns << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << llendl;
+ LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL;
opj_image_destroy(image);
return TRUE; // done
@@ -375,7 +376,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
if (!bSuccess)
{
opj_cio_close(cio);
- llinfos << "Failed to encode image." << llendl;
+ LL_DEBUGS("Texture") << "Failed to encode image." << LL_ENDL;
return FALSE;
}
codestream_length = cio_tell(cio);
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 73cb074f1f..8255d5225f 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -51,9 +51,6 @@ protected:
// Divide a by b to the power of 2 and round upwards.
return (a + (1 << b) - 1) >> b;
}
-
- // Temporary variables for in-progress decodes...
- LLImageRaw *mRawImagep;
};
#endif
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 5d3fbe5128..d665deb605 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -1324,7 +1324,7 @@ BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b )
LLInventoryCategory::LLInventoryCategory(
const LLUUID& uuid,
const LLUUID& parent_uuid,
- LLAssetType::EType preferred_type,
+ LLFolderType::EType preferred_type,
const std::string& name) :
LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name),
mPreferredType(preferred_type)
@@ -1332,7 +1332,7 @@ LLInventoryCategory::LLInventoryCategory(
}
LLInventoryCategory::LLInventoryCategory() :
- mPreferredType(LLAssetType::AT_NONE)
+ mPreferredType(LLFolderType::FT_NONE)
{
mType = LLAssetType::AT_CATEGORY;
}
@@ -1354,12 +1354,12 @@ void LLInventoryCategory::copyCategory(const LLInventoryCategory* other)
mPreferredType = other->mPreferredType;
}
-LLAssetType::EType LLInventoryCategory::getPreferredType() const
+LLFolderType::EType LLInventoryCategory::getPreferredType() const
{
return mPreferredType;
}
-void LLInventoryCategory::setPreferredType(LLAssetType::EType type)
+void LLInventoryCategory::setPreferredType(LLFolderType::EType type)
{
mPreferredType = type;
}
@@ -1405,13 +1405,13 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
if (sd.has(w))
{
S8 type = (U8)sd[w].asInteger();
- mPreferredType = static_cast<LLAssetType::EType>(type);
+ mPreferredType = static_cast<LLFolderType::EType>(type);
}
w = INV_ASSET_TYPE_LABEL_WS;
if (sd.has(w))
{
S8 type = (U8)sd[w].asInteger();
- mPreferredType = static_cast<LLAssetType::EType>(type);
+ mPreferredType = static_cast<LLFolderType::EType>(type);
}
w = INV_NAME_LABEL;
@@ -1433,7 +1433,7 @@ void LLInventoryCategory::unpackMessage(LLMessageSystem* msg,
msg->getUUIDFast(block, _PREHASH_ParentID, mParentUUID, block_num);
S8 type;
msg->getS8Fast(block, _PREHASH_Type, type, block_num);
- mPreferredType = static_cast<LLAssetType::EType>(type);
+ mPreferredType = static_cast<LLFolderType::EType>(type);
msg->getStringFast(block, _PREHASH_Name, mName, block_num);
LLStringUtil::replaceNonstandardASCII(mName, ' ');
}
@@ -1482,7 +1482,7 @@ BOOL LLInventoryCategory::importFile(LLFILE* fp)
}
else if(0 == strcmp("pref_type", keyword))
{
- mPreferredType = LLAssetType::lookup(valuestr);
+ mPreferredType = LLFolderType::lookup(valuestr);
}
else if(0 == strcmp("name", keyword))
{
@@ -1514,7 +1514,7 @@ BOOL LLInventoryCategory::exportFile(LLFILE* fp, BOOL) const
mParentUUID.toString(uuid_str);
fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str());
fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
- fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType));
+ fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str());
fprintf(fp, "\t\tname\t%s|\n", mName.c_str());
fprintf(fp,"\t}\n");
return TRUE;
@@ -1561,7 +1561,7 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)
}
else if(0 == strcmp("pref_type", keyword))
{
- mPreferredType = LLAssetType::lookup(valuestr);
+ mPreferredType = LLFolderType::lookup(valuestr);
}
else if(0 == strcmp("name", keyword))
{
@@ -1593,7 +1593,7 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL)
mParentUUID.toString(uuid_str);
output_stream << "\t\tparent_id\t" << uuid_str << "\n";
output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n";
- output_stream << "\t\tpref_type\t" << LLAssetType::lookup(mPreferredType) << "\n";
+ output_stream << "\t\tpref_type\t" << LLFolderType::lookup(mPreferredType) << "\n";
output_stream << "\t\tname\t" << mName.c_str() << "|\n";
output_stream << "\t}\n";
return TRUE;
@@ -1629,38 +1629,6 @@ LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item)
return rv;
}
-/* deprecated, use LLInventoryItem::fromLLSD() instead
-LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item)
-{
- LLPointer<LLInventoryItem> rv = new LLInventoryItem;
- rv->setUUID(sd_item[INV_ITEM_ID_LABEL].asUUID());
- rv->setParent(sd_item[INV_PARENT_ID_LABEL].asUUID());
- rv->rename(sd_item[INV_NAME_LABEL].asString());
- rv->setType(
- LLAssetType::lookup(sd_item[INV_ASSET_TYPE_LABEL].asString()));
- if (sd_item.has("shadow_id"))
- {
- LLUUID asset_id = sd_item["shadow_id"];
- LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
- cipher.decrypt(asset_id.mData, UUID_BYTES);
- rv->setAssetUUID(asset_id);
- }
- if (sd_item.has(INV_ASSET_ID_LABEL))
- {
- rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID());
- }
- rv->setDescription(sd_item[INV_DESC_LABEL].asString());
- rv->setSaleInfo(ll_sale_info_from_sd(sd_item[INV_SALE_INFO_LABEL]));
- rv->setPermissions(ll_permissions_from_sd(sd_item[INV_PERMISSIONS_LABEL]));
- rv->setInventoryType(
- LLInventoryType::lookup(
- sd_item[INV_INVENTORY_TYPE_LABEL].asString()));
- rv->setFlags((U32)(sd_item[INV_FLAGS_LABEL].asInteger()));
- rv->setCreationDate(sd_item[INV_CREATION_DATE_LABEL].asInteger());
- return rv;
-}
-*/
-
LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat)
{
LLSD rv;
@@ -1675,10 +1643,10 @@ LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat)
rv[INV_PARENT_ID_LABEL] = cat->getParentUUID();
rv[INV_NAME_LABEL] = cat->getName();
rv[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(cat->getType());
- if(LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()))
+ if(LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
rv[INV_PREFERRED_TYPE_LABEL] =
- LLAssetType::lookup(cat->getPreferredType());
+ LLFolderType::lookup(cat->getPreferredType()).c_str();
}
return rv;
}
@@ -1692,7 +1660,7 @@ LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat)
rv->setType(
LLAssetType::lookup(sd_cat[INV_ASSET_TYPE_LABEL].asString()));
rv->setPreferredType(
- LLAssetType::lookup(
- sd_cat[INV_PREFERRED_TYPE_LABEL].asString()));
+ LLFolderType::lookup(
+ sd_cat[INV_PREFERRED_TYPE_LABEL].asString()));
return rv;
}
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index bd581e860f..9faecbea85 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -35,8 +35,8 @@
#include <functional>
-#include "llassetstorage.h"
#include "lldarray.h"
+#include "llfoldertype.h"
#include "llinventorytype.h"
#include "llmemtype.h"
#include "llpermissions.h"
@@ -44,7 +44,6 @@
#include "llsaleinfo.h"
#include "llsd.h"
#include "lluuid.h"
-#include "llxmlnode.h"
// consts for Key field in the task inventory update message
extern const U8 TASK_INVENTORY_ITEM_KEY;
@@ -321,15 +320,15 @@ protected:
public:
MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
- LLAssetType::EType preferred_type,
+ LLFolderType::EType preferred_type,
const std::string& name);
LLInventoryCategory();
LLInventoryCategory(const LLInventoryCategory* other);
void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy
// accessors and mutators
- LLAssetType::EType getPreferredType() const;
- void setPreferredType(LLAssetType::EType type);
+ LLFolderType::EType getPreferredType() const;
+ void setPreferredType(LLFolderType::EType type);
// For messaging system support
virtual void packMessage(LLMessageSystem* msg) const;
virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
@@ -345,10 +344,8 @@ public:
virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
protected:
- // The type of asset that this category was "meant" to hold
- // (although it may in fact hold any type).
- LLAssetType::EType mPreferredType;
-
+ // May be the type that this category was "meant" to hold (although it may hold any type).
+ LLFolderType::EType mPreferredType;
};
@@ -358,7 +355,7 @@ protected:
typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList;
-// These functions convert between structured data and an inventroy
+// These functions convert between structured data and an inventory
// item, appropriate for serialization.
LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item);
//LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item);
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index a445466b26..4ef5df0b28 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -79,24 +79,16 @@ LLInventoryDictionary::LLInventoryDictionary()
addEntry(LLInventoryType::IT_SOUND, new InventoryEntry("sound", "sound", 1, LLAssetType::AT_SOUND));
addEntry(LLInventoryType::IT_CALLINGCARD, new InventoryEntry("callcard", "calling card", 1, LLAssetType::AT_CALLINGCARD));
addEntry(LLInventoryType::IT_LANDMARK, new InventoryEntry("landmark", "landmark", 1, LLAssetType::AT_LANDMARK));
- //addEntry(LLInventoryType::IT_SCRIPT, new InventoryEntry(NULL,NULL));
- //addEntry(LLInventoryType::IT_CLOTHING, new InventoryEntry(NULL,NULL));
addEntry(LLInventoryType::IT_OBJECT, new InventoryEntry("object", "object", 1, LLAssetType::AT_OBJECT));
addEntry(LLInventoryType::IT_NOTECARD, new InventoryEntry("notecard", "note card", 1, LLAssetType::AT_NOTECARD));
addEntry(LLInventoryType::IT_CATEGORY, new InventoryEntry("category", "folder" ));
addEntry(LLInventoryType::IT_ROOT_CATEGORY, new InventoryEntry("root", "root" ));
addEntry(LLInventoryType::IT_LSL, new InventoryEntry("script", "script", 2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE));
- //addEntry(LLInventoryType::IT_LSL_BYTECODE, new InventoryEntry(NULL,NULL));
- //addEntry(LLInventoryType::IT_TEXTURE_TGA, new InventoryEntry(NULL,NULL));
- //addEntry(LLInventoryType::IT_BODYPART, new InventoryEntry(NULL,NULL));
- //addEntry(LLInventoryType::IT_TRASH, new InventoryEntry(NULL,NULL));
addEntry(LLInventoryType::IT_SNAPSHOT, new InventoryEntry("snapshot", "snapshot", 1, LLAssetType::AT_TEXTURE));
- //addEntry(LLInventoryType::IT_LOST_AND_FOUND, new InventoryEntry(NULL,NULL, ));
addEntry(LLInventoryType::IT_ATTACHMENT, new InventoryEntry("attach", "attachment", 1, LLAssetType::AT_OBJECT));
addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION));
addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE));
- addEntry(LLInventoryType::IT_FAVORITE, new InventoryEntry("favorite", "favorite", 1, LLAssetType::AT_FAVORITE));
}
@@ -114,7 +106,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
LLInventoryType::IT_OBJECT, // AT_OBJECT
LLInventoryType::IT_NOTECARD, // AT_NOTECARD
LLInventoryType::IT_CATEGORY, // AT_CATEGORY
- LLInventoryType::IT_ROOT_CATEGORY, // AT_ROOT_CATEGORY
+ LLInventoryType::IT_NONE, // (null entry)
LLInventoryType::IT_LSL, // AT_LSL_TEXT
LLInventoryType::IT_LSL, // AT_LSL_BYTECODE
LLInventoryType::IT_TEXTURE, // AT_TEXTURE_TGA
@@ -128,35 +120,9 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
LLInventoryType::IT_ANIMATION, // AT_ANIMATION
LLInventoryType::IT_GESTURE, // AT_GESTURE
LLInventoryType::IT_NONE, // AT_SIMSTATE
- LLInventoryType::IT_FAVORITE, // AT_FAVORITE
LLInventoryType::IT_NONE, // AT_LINK
LLInventoryType::IT_NONE, // AT_LINK_FOLDER
-
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
- LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE
-
- LLInventoryType::IT_CATEGORY, // AT_CURRENT_OUTFIT
- LLInventoryType::IT_CATEGORY, // AT_OUTFIT
- LLInventoryType::IT_CATEGORY, // AT_MY_OUTFITS
};
// static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index 14b28bfe4b..e515b8a304 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -67,8 +67,7 @@ public:
IT_WEARABLE = 18,
IT_ANIMATION = 19,
IT_GESTURE = 20,
- IT_FAVORITE = 21,
- IT_COUNT = 22,
+ IT_COUNT = 21,
IT_NONE = -1
};
diff --git a/indra/llinventory/llnotecard.cpp b/indra/llinventory/llnotecard.cpp
index 9e7e043761..f6e41eecb4 100644
--- a/indra/llinventory/llnotecard.cpp
+++ b/indra/llinventory/llnotecard.cpp
@@ -35,7 +35,9 @@
#include "llstreamtools.h"
LLNotecard::LLNotecard(S32 max_text)
-: mMaxText(max_text)
+ : mMaxText(max_text),
+ mVersion(0),
+ mEmbeddedVersion(0)
{
}
diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp
index 770594dc9d..c797a70c50 100644
--- a/indra/llinventory/tests/inventorymisc_test.cpp
+++ b/indra/llinventory/tests/inventorymisc_test.cpp
@@ -94,7 +94,7 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat()
LLPointer<LLInventoryCategory> cat = new LLInventoryCategory(
item_id,
parent_id,
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
std::string("Sample category"));
return cat;
}
@@ -452,7 +452,7 @@ namespace tut
ensure_equals("4.type::getType() failed", dst->getType(), src->getType());
ensure_equals("5.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
- src->setPreferredType( LLAssetType::AT_TEXTURE);
+ src->setPreferredType( LLFolderType::FT_TEXTURE);
sd = ll_create_sd_from_inventory_category(src);
dst = ll_create_category_from_sd(sd);
ensure_equals("6.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index 7957c32be2..e93fe90650 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -86,27 +86,29 @@ list(APPEND llmath_SOURCE_FILES ${llmath_HEADER_FILES})
add_library (llmath ${llmath_SOURCE_FILES})
# Add tests
-include(LLAddBuildTest)
-# UNIT TESTS
-SET(llmath_TEST_SOURCE_FILES
- llbboxlocal.cpp
- llmodularmath.cpp
- llrect.cpp
- v2math.cpp
- v3color.cpp
- v4color.cpp
- v4coloru.cpp
- )
-LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}")
+if (LL_TESTS)
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llmath_TEST_SOURCE_FILES
+ llbboxlocal.cpp
+ llmodularmath.cpp
+ llrect.cpp
+ v2math.cpp
+ v3color.cpp
+ v4color.cpp
+ v4coloru.cpp
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}")
-# INTEGRATION TESTS
-set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
-# TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
-LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llquaternion llquaternion.cpp "${test_libs}")
-LL_ADD_INTEGRATION_TEST(mathmisc "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(m3math "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(v3dmath v3dmath.cpp "${test_libs}")
-LL_ADD_INTEGRATION_TEST(v3math v3math.cpp "${test_libs}")
-LL_ADD_INTEGRATION_TEST(v4math v4math.cpp "${test_libs}")
-LL_ADD_INTEGRATION_TEST(xform xform.cpp "${test_libs}")
+ # INTEGRATION TESTS
+ set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
+ # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
+ LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llquaternion llquaternion.cpp "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(mathmisc "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(m3math "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(v3dmath v3dmath.cpp "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(v3math v3math.cpp "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(v4math v4math.cpp "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(xform xform.cpp "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 21ea4b2e7c..487ed6451f 100644
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -45,7 +45,8 @@ LLCamera::LLCamera() :
mNearPlane(DEFAULT_NEAR_PLANE),
mFarPlane(DEFAULT_FAR_PLANE),
mFixedDistance(-1.f),
- mPlaneCount(6)
+ mPlaneCount(6),
+ mFrustumCornerDist(0.f)
{
calculateFrustumPlanes();
}
@@ -55,7 +56,8 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
LLCoordFrame(),
mViewHeightInPixels(view_height_in_pixels),
mFixedDistance(-1.f),
- mPlaneCount(6)
+ mPlaneCount(6),
+ mFrustumCornerDist(0.f)
{
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
@@ -648,7 +650,6 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
{
-
for (int i = 0; i < 8; i++)
{
mAgentFrustum[i] = frust[i];
diff --git a/indra/llmath/llinterp.h b/indra/llmath/llinterp.h
index 8beeef480b..88af004170 100644
--- a/indra/llmath/llinterp.h
+++ b/indra/llmath/llinterp.h
@@ -32,6 +32,13 @@
#ifndef LL_LLINTERP_H
#define LL_LLINTERP_H
+#if defined(LL_WINDOWS)
+// macro definitions for common math constants (e.g. M_PI) are declared under the _USE_MATH_DEFINES
+// on Windows system.
+// So, let's define _USE_MATH_DEFINES before including math.h
+ #define _USE_MATH_DEFINES
+#endif
+
#include "math.h"
// Class from which different types of interpolators can be derived
@@ -47,7 +54,7 @@ template <typename Type>
class LLInterp
{
public:
- LLInterp();
+ LLInterp();
virtual ~LLInterp() {}
virtual void start();
@@ -144,6 +151,7 @@ protected:
template <typename Type>
LLInterp<Type>::LLInterp()
+: mStartVal(Type()), mEndVal(Type()), mCurVal(Type())
{
mStartTime = 0.f;
mEndTime = 1.f;
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 7a5d51ff76..209b506c30 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -203,7 +203,7 @@ inline S32 llfloor( F32 f )
}
return result;
#else
- return (S32)floor(f);
+ return (S32)floorf(f);
#endif
}
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index ba8776690a..2f34fb1bb0 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -183,7 +183,6 @@ public:
{
mMax.mdV[i] = mCenter.mdV[i] + mSize.mdV[i];
mMin.mdV[i] = mCenter.mdV[i] - mSize.mdV[i];
- mCenter.mdV[i] = mCenter.mdV[i];
}
}
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index b8ef92f9a9..192c6157a8 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -3582,7 +3582,7 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
if (face == -1) // ALL_SIDES
{
start_face = 0;
- end_face = getNumFaces() - 1;
+ end_face = getNumVolumeFaces() - 1;
}
else
{
@@ -3822,6 +3822,7 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices,
// Generate the vertex mapping and the list of vertices without
// duplicates. This will crash if there are no vertices.
+ llassert(num_input_vertices > 0); // check for no vertices!
S32 *vertex_mapping = new S32[num_input_vertices];
LLVector3 *new_vertices = new LLVector3[num_input_vertices];
LLVertexIndexPair *prev_pairp = NULL;
diff --git a/indra/llmath/xform.cpp b/indra/llmath/xform.cpp
index ce6f756ab9..7a8b0cf6a3 100644
--- a/indra/llmath/xform.cpp
+++ b/indra/llmath/xform.cpp
@@ -42,6 +42,11 @@ LLXform::~LLXform()
{
}
+// Link optimization - don't inline these llwarns
+void LLXform::warn(const char* const msg)
+{
+ llwarns << msg << llendl;
+}
LLXform* LLXform::getRoot() const
{
diff --git a/indra/llmath/xform.h b/indra/llmath/xform.h
index 5b7b1900bc..c4edd46279 100644
--- a/indra/llmath/xform.h
+++ b/indra/llmath/xform.h
@@ -107,6 +107,12 @@ public:
inline void setRotation(const LLQuaternion& rot);
inline void setRotation(const F32 x, const F32 y, const F32 z);
inline void setRotation(const F32 x, const F32 y, const F32 z, const F32 s);
+
+ // Above functions must be inline for speed, but also
+ // need to emit warnings. llwarns causes inline LLError::CallSite
+ // static objects that make more work for the linker.
+ // Avoid inline llwarns by calling this function.
+ void warn(const char* const msg);
void setChanged(const U32 bits) { mChanged |= bits; }
BOOL isChanged() const { return mChanged; }
@@ -173,7 +179,7 @@ BOOL LLXform::setParent(LLXform* parent)
{
if (cur_par == this)
{
- //llwarns << "LLXform::setParent Creating loop when setting parent!" << llendl;
+ //warn("LLXform::setParent Creating loop when setting parent!");
return FALSE;
}
cur_par = cur_par->mParent;
@@ -191,7 +197,7 @@ void LLXform::setPosition(const LLVector3& pos)
else
{
mPosition.clearVec();
- llwarns << "Non Finite in LLXform::setPosition(LLVector3)" << llendl;
+ warn("Non Finite in LLXform::setPosition(LLVector3)");
}
}
@@ -203,7 +209,7 @@ void LLXform::setPosition(const F32 x, const F32 y, const F32 z)
else
{
mPosition.clearVec();
- llwarns << "Non Finite in LLXform::setPosition(F32,F32,F32)" << llendl;
+ warn("Non Finite in LLXform::setPosition(F32,F32,F32)");
}
}
@@ -215,7 +221,7 @@ void LLXform::setPositionX(const F32 x)
else
{
mPosition.mV[VX] = 0.f;
- llwarns << "Non Finite in LLXform::setPositionX" << llendl;
+ warn("Non Finite in LLXform::setPositionX");
}
}
@@ -227,7 +233,7 @@ void LLXform::setPositionY(const F32 y)
else
{
mPosition.mV[VY] = 0.f;
- llwarns << "Non Finite in LLXform::setPositionY" << llendl;
+ warn("Non Finite in LLXform::setPositionY");
}
}
@@ -239,7 +245,7 @@ void LLXform::setPositionZ(const F32 z)
else
{
mPosition.mV[VZ] = 0.f;
- llwarns << "Non Finite in LLXform::setPositionZ" << llendl;
+ warn("Non Finite in LLXform::setPositionZ");
}
}
@@ -249,7 +255,7 @@ void LLXform::addPosition(const LLVector3& pos)
if (pos.isFinite())
mPosition += pos;
else
- llwarns << "Non Finite in LLXform::addPosition" << llendl;
+ warn("Non Finite in LLXform::addPosition");
}
void LLXform::setScale(const LLVector3& scale)
@@ -260,7 +266,7 @@ void LLXform::setScale(const LLVector3& scale)
else
{
mScale.setVec(1.f, 1.f, 1.f);
- llwarns << "Non Finite in LLXform::setScale" << llendl;
+ warn("Non Finite in LLXform::setScale");
}
}
void LLXform::setScale(const F32 x, const F32 y, const F32 z)
@@ -271,7 +277,7 @@ void LLXform::setScale(const F32 x, const F32 y, const F32 z)
else
{
mScale.setVec(1.f, 1.f, 1.f);
- llwarns << "Non Finite in LLXform::setScale" << llendl;
+ warn("Non Finite in LLXform::setScale");
}
}
void LLXform::setRotation(const LLQuaternion& rot)
@@ -282,7 +288,7 @@ void LLXform::setRotation(const LLQuaternion& rot)
else
{
mRotation.loadIdentity();
- llwarns << "Non Finite in LLXform::setRotation" << llendl;
+ warn("Non Finite in LLXform::setRotation");
}
}
void LLXform::setRotation(const F32 x, const F32 y, const F32 z)
@@ -295,7 +301,7 @@ void LLXform::setRotation(const F32 x, const F32 y, const F32 z)
else
{
mRotation.loadIdentity();
- llwarns << "Non Finite in LLXform::setRotation" << llendl;
+ warn("Non Finite in LLXform::setRotation");
}
}
void LLXform::setRotation(const F32 x, const F32 y, const F32 z, const F32 s)
@@ -308,7 +314,7 @@ void LLXform::setRotation(const F32 x, const F32 y, const F32 z, const F32 s)
else
{
mRotation.loadIdentity();
- llwarns << "Non Finite in LLXform::setRotation" << llendl;
+ warn("Non Finite in LLXform::setRotation");
}
}
diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index a611de0cda..1f8ee26716 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -92,6 +92,7 @@ set(llmessage_SOURCE_FILES
llxfer_mem.cpp
llxfer_vfile.cpp
llxorcipher.cpp
+ machine.cpp
message.cpp
message_prehash.cpp
message_string_table.cpp
@@ -100,6 +101,7 @@ set(llmessage_SOURCE_FILES
patch_code.cpp
patch_dct.cpp
patch_idct.cpp
+ sound_ids.cpp
)
set(llmessage_HEADER_FILES
@@ -217,36 +219,37 @@ target_link_libraries(
)
# tests
-
-SET(llmessage_TEST_SOURCE_FILES
- # llhttpclientadapter.cpp
- llmime.cpp
- llnamevalue.cpp
- lltrustedmessageservice.cpp
- lltemplatemessagedispatcher.cpp
+if (LL_TESTS)
+ SET(llmessage_TEST_SOURCE_FILES
+ # llhttpclientadapter.cpp
+ llmime.cpp
+ llnamevalue.cpp
+ lltrustedmessageservice.cpp
+ lltemplatemessagedispatcher.cpp
llregionpresenceverifier.cpp
- )
-LL_ADD_PROJECT_UNIT_TESTS(llmessage "${llmessage_TEST_SOURCE_FILES}")
-
-# set(TEST_DEBUG on)
-set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
- ${LLVFS_LIBRARIES}
- ${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llmessage "${llmessage_TEST_SOURCE_FILES}")
+
+ # set(TEST_DEBUG on)
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
+ ${LLVFS_LIBRARIES}
+ ${LLMATH_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
- )
+ )
-LL_ADD_INTEGRATION_TEST(
- llsdmessage
- "llsdmessage.cpp"
- "${test_libs}"
- ${PYTHON_EXECUTABLE}
- "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py"
- )
+ LL_ADD_INTEGRATION_TEST(
+ llsdmessage
+ "llsdmessage.cpp"
+ "${test_libs}"
+ ${PYTHON_EXECUTABLE}
+ "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py"
+ )
-LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llpartdata "" "${test_libs}")
-LL_ADD_INTEGRATION_TEST(llxfer_file "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llpartdata "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llxfer_file "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp
index acbf51d75c..00e77d20e9 100644
--- a/indra/llmessage/llares.cpp
+++ b/indra/llmessage/llares.cpp
@@ -106,7 +106,7 @@ void LLAres::QueryResponder::queryError(int code)
LLAres::LLAres() :
chan_(NULL),
mInitSuccess(false),
- mListener(new LLAresListener("LLAres", this))
+ mListener(new LLAresListener(this))
{
if (ares_init(&chan_) != ARES_SUCCESS)
{
@@ -175,7 +175,8 @@ void LLAres::rewriteURI(const std::string &uri, UriRewriteResponder *resp)
LLQueryResponder::LLQueryResponder()
: LLAres::QueryResponder(),
- mResult(ARES_ENODATA)
+ mResult(ARES_ENODATA),
+ mType(RES_INVALID)
{
}
@@ -641,8 +642,10 @@ LLPtrRecord::LLPtrRecord(const std::string &name, unsigned ttl)
}
LLAddrRecord::LLAddrRecord(LLResType type, const std::string &name,
- unsigned ttl)
- : LLDnsRecord(type, name, ttl)
+ unsigned ttl)
+ : LLDnsRecord(type, name, ttl),
+
+ mSize(0)
{
}
@@ -701,7 +704,11 @@ bail:
}
LLSrvRecord::LLSrvRecord(const std::string &name, unsigned ttl)
- : LLHostRecord(RES_SRV, name, ttl)
+ : LLHostRecord(RES_SRV, name, ttl),
+
+ mPriority(0),
+ mWeight(0),
+ mPort(0)
{
}
diff --git a/indra/llmessage/llareslistener.cpp b/indra/llmessage/llareslistener.cpp
index a8beb8cbde..97efa96d53 100644
--- a/indra/llmessage/llareslistener.cpp
+++ b/indra/llmessage/llareslistener.cpp
@@ -22,14 +22,19 @@
#include "llevents.h"
#include "llsdutil.h"
-LLAresListener::LLAresListener(const std::string& pumpname, LLAres* llares):
- LLDispatchListener(pumpname, "op"),
+LLAresListener::LLAresListener(LLAres* llares):
+ LLEventAPI("LLAres",
+ "LLAres listener to request DNS operations"),
mAres(llares)
{
// add() every method we want to be able to invoke via this event API.
- // Optional third parameter validates expected LLSD request structure.
- add("rewriteURI", &LLAresListener::rewriteURI,
- LLSD().insert("uri", LLSD()).insert("reply", LLSD()));
+ // Optional last parameter validates expected LLSD request structure.
+ add("rewriteURI",
+ "Given [\"uri\"], return on [\"reply\"] an array of alternative URIs.\n"
+ "On failure, returns an array containing only the original URI, so\n"
+ "failure case can be processed like success case.",
+ &LLAresListener::rewriteURI,
+ LLSD().with("uri", LLSD()).with("reply", LLSD()));
}
/// This UriRewriteResponder subclass packages returned URIs as an LLSD
diff --git a/indra/llmessage/llareslistener.h b/indra/llmessage/llareslistener.h
index bf093b3d3d..33cef79c09 100644
--- a/indra/llmessage/llareslistener.h
+++ b/indra/llmessage/llareslistener.h
@@ -14,18 +14,17 @@
#if ! defined(LL_LLARESLISTENER_H)
#define LL_LLARESLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
class LLAres;
class LLSD;
/// Listen on an LLEventPump with specified name for LLAres request events.
-class LLAresListener: public LLDispatchListener
+class LLAresListener: public LLEventAPI
{
public:
- /// Specify the pump name on which to listen, and bind the LLAres instance
- /// to use (e.g. gAres)
- LLAresListener(const std::string& pumpname, LLAres* llares);
+ /// Bind the LLAres instance to use (e.g. gAres)
+ LLAresListener(LLAres* llares);
private:
/// command["op"] == "rewriteURI"
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index b3087bcc3f..0ab1081200 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -64,6 +64,9 @@ const LLUUID CATEGORIZE_LOST_AND_FOUND_ID(std::string("00000000-0000-0000-0000-0
const U64 TOXIC_ASSET_LIFETIME = (120 * 1000000); // microseconds
+LLTempAssetStorage::~LLTempAssetStorage()
+{
+}
///----------------------------------------------------------------------------
/// LLAssetInfo
diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h
index 56adbd5ccf..83cfdf6110 100644
--- a/indra/llmessage/llassetstorage.h
+++ b/indra/llmessage/llassetstorage.h
@@ -204,7 +204,16 @@ typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t;
typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id,
LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status);
-class LLAssetStorage
+class LLTempAssetStorage
+{
+public:
+ virtual ~LLTempAssetStorage() =0;
+ virtual void addTempAssetData(const LLUUID& asset_id,
+ const LLUUID& agent_id,
+ const std::string& host_name) = 0;
+};
+
+class LLAssetStorage : public LLTempAssetStorage
{
public:
// VFS member is public because static child methods need it :(
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index a403c44b71..9363b3a8d5 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -81,6 +81,8 @@ public:
};
LLCacheNameEntry::LLCacheNameEntry()
+ : mIsGroup(false),
+ mCreateTime(0)
{
}
@@ -125,7 +127,7 @@ private:
};
ReplySender::ReplySender(LLMessageSystem* msg)
- : mMsg(msg), mPending(false)
+ : mMsg(msg), mPending(false), mCurrIsGroup(false)
{ }
ReplySender::~ReplySender()
@@ -189,6 +191,7 @@ typedef std::set<LLUUID> AskQueue;
typedef std::list<PendingReply*> ReplyQueue;
typedef std::map<LLUUID,U32> PendingQueue;
typedef std::map<LLUUID, LLCacheNameEntry*> Cache;
+typedef std::map<std::string, LLUUID> ReverseCache;
class LLCacheName::Impl
{
@@ -198,7 +201,9 @@ public:
Cache mCache;
// the map of UUIDs to names
-
+ ReverseCache mReverseCache;
+ // map of names to UUIDs
+
AskQueue mAskNameQueue;
AskQueue mAskGroupQueue;
// UUIDs to ask our upstream host about
@@ -371,7 +376,9 @@ void LLCacheName::importFile(LLFILE* fp)
entry->mFirstName = firstname;
entry->mLastName = lastname;
impl.mCache[id] = entry;
-
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ impl.mReverseCache[fullname] = id;
+
count++;
}
@@ -407,6 +414,8 @@ bool LLCacheName::importFile(std::istream& istr)
entry->mFirstName = agent[FIRST].asString();
entry->mLastName = agent[LAST].asString();
impl.mCache[id] = entry;
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ impl.mReverseCache[fullname] = id;
++count;
}
@@ -428,6 +437,7 @@ bool LLCacheName::importFile(std::istream& istr)
entry->mCreateTime = ctime;
entry->mGroupName = group[NAME].asString();
impl.mCache[id] = entry;
+ impl.mReverseCache[entry->mGroupName] = id;
++count;
}
llinfos << "LLCacheName loaded " << count << " group names" << llendl;
@@ -548,6 +558,27 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
return FALSE;
}
}
+
+BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id)
+{
+ std::string fullname = first + " " + last;
+ return getUUID(fullname, id);
+}
+
+BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
+{
+ ReverseCache::iterator iter = impl.mReverseCache.find(fullname);
+ if (iter != impl.mReverseCache.end())
+ {
+ id = iter->second;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
// This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
// The reason it is a slot is so that the legacy get() function below can bind an old callback
// and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
@@ -897,10 +928,13 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
if (!isGroup)
{
mSignal(id, entry->mFirstName, entry->mLastName, FALSE);
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ mReverseCache[fullname] = id;
}
else
{
mSignal(id, entry->mGroupName, "", TRUE);
+ mReverseCache[entry->mGroupName] = id;
}
}
}
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 8641437d86..111cc8b650 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -86,6 +86,10 @@ public:
BOOL getName(const LLUUID& id, std::string& first, std::string& last);
BOOL getFullName(const LLUUID& id, std::string& fullname);
+ // Reverse lookup of UUID from name
+ BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id);
+ BOOL getUUID(const std::string& fullname, LLUUID& id);
+
// If available, this method copies the group name into the string
// provided. The caller must allocate at least
// DB_GROUP_NAME_BUF_SIZE characters. If not available, this
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 5ff41322b7..024e17a777 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -89,6 +89,10 @@ S32 gCurlMultiCount = 0;
std::vector<LLMutex*> LLCurl::sSSLMutex;
std::string LLCurl::sCAPath;
std::string LLCurl::sCAFile;
+// Verify SSL certificates by default (matches libcurl default). The ability
+// to alter this flag is only to allow us to suppress verification if it's
+// broken for some reason.
+bool LLCurl::sSSLVerify = true;
//static
void LLCurl::setCAPath(const std::string& path)
@@ -103,6 +107,18 @@ void LLCurl::setCAFile(const std::string& file)
}
//static
+void LLCurl::setSSLVerify(bool verify)
+{
+ sSSLVerify = verify;
+}
+
+//static
+bool LLCurl::getSSLVerify()
+{
+ return sSSLVerify;
+}
+
+//static
std::string LLCurl::getVersionString()
{
return std::string(curl_version());
@@ -229,7 +245,7 @@ public:
U32 report(CURLcode);
void getTransferInfo(LLCurl::TransferInfo* info);
- void prepRequest(const std::string& url, ResponderPtr, bool post = false);
+ void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, bool post = false);
const char* getErrorBuffer();
@@ -441,7 +457,9 @@ size_t curlHeaderCallback(void* data, size_t size, size_t nmemb, void* user_data
return n;
}
-void LLCurl::Easy::prepRequest(const std::string& url, ResponderPtr responder, bool post)
+void LLCurl::Easy::prepRequest(const std::string& url,
+ const std::vector<std::string>& headers,
+ ResponderPtr responder, bool post)
{
resetState();
@@ -463,7 +481,8 @@ void LLCurl::Easy::prepRequest(const std::string& url, ResponderPtr responder, b
setErrorBuffer();
setCA();
- setopt(CURLOPT_SSL_VERIFYPEER, true);
+ setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify());
+ setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify()? 2 : 0);
setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);
setoptString(CURLOPT_URL, url);
@@ -474,8 +493,13 @@ void LLCurl::Easy::prepRequest(const std::string& url, ResponderPtr responder, b
{
slist_append("Connection: keep-alive");
slist_append("Keep-alive: 300");
+ // Accept and other headers
+ for (std::vector<std::string>::const_iterator iter = headers.begin();
+ iter != headers.end(); ++iter)
+ {
+ slist_append((*iter).c_str());
+ }
}
- // *FIX: should have ACCEPT headers
}
////////////////////////////////////////////////////////////////////////////
@@ -685,15 +709,18 @@ LLCurlRequest::LLCurlRequest() :
mActiveMulti(NULL),
mActiveRequestCount(0)
{
+ mThreadID = LLThread::currentID();
}
LLCurlRequest::~LLCurlRequest()
{
+ llassert_always(mThreadID == LLThread::currentID());
for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer());
}
void LLCurlRequest::addMulti()
{
+ llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi();
mMultiSet.insert(multi);
mActiveMulti = multi;
@@ -723,17 +750,20 @@ bool LLCurlRequest::addEasy(LLCurl::Easy* easy)
void LLCurlRequest::get(const std::string& url, LLCurl::ResponderPtr responder)
{
- getByteRange(url, 0, -1, responder);
+ getByteRange(url, headers_t(), 0, -1, responder);
}
-bool LLCurlRequest::getByteRange(const std::string& url, S32 offset, S32 length, LLCurl::ResponderPtr responder)
+bool LLCurlRequest::getByteRange(const std::string& url,
+ const headers_t& headers,
+ S32 offset, S32 length,
+ LLCurl::ResponderPtr responder)
{
LLCurl::Easy* easy = allocEasy();
if (!easy)
{
return false;
}
- easy->prepRequest(url, responder);
+ easy->prepRequest(url, headers, responder);
easy->setopt(CURLOPT_HTTPGET, 1);
if (length > 0)
{
@@ -745,14 +775,17 @@ bool LLCurlRequest::getByteRange(const std::string& url, S32 offset, S32 length,
return res;
}
-bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::ResponderPtr responder)
+bool LLCurlRequest::post(const std::string& url,
+ const headers_t& headers,
+ const LLSD& data,
+ LLCurl::ResponderPtr responder)
{
LLCurl::Easy* easy = allocEasy();
if (!easy)
{
return false;
}
- easy->prepRequest(url, responder);
+ easy->prepRequest(url, headers, responder);
LLSDSerialize::toXML(data, easy->getInput());
S32 bytes = easy->getInput().str().length();
@@ -772,6 +805,7 @@ bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::Respo
// Note: call once per frame
S32 LLCurlRequest::process()
{
+ llassert_always(mThreadID == LLThread::currentID());
S32 res = 0;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
@@ -791,6 +825,7 @@ S32 LLCurlRequest::process()
S32 LLCurlRequest::getQueued()
{
+ llassert_always(mThreadID == LLThread::currentID());
S32 queued = 0;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
@@ -1011,7 +1046,7 @@ void LLCurl::initClass()
S32 mutex_count = CRYPTO_num_locks();
for (S32 i=0; i<mutex_count; i++)
{
- sSSLMutex.push_back(new LLMutex(gAPRPoolp));
+ sSSLMutex.push_back(new LLMutex(NULL));
}
CRYPTO_set_id_callback(&LLCurl::ssl_thread_id);
CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback);
@@ -1026,4 +1061,3 @@ void LLCurl::cleanupClass()
#endif
curl_global_cleanup();
}
-
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 0b58e7c4a5..caf02cccd9 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -158,6 +158,16 @@ public:
static const std::string& getCAPath() { return sCAPath; }
/**
+ * @ brief Set flag controlling whether to verify HTTPS certs.
+ */
+ static void setSSLVerify(bool verify);
+
+ /**
+ * @ brief Get flag controlling whether to verify HTTPS certs.
+ */
+ static bool getSSLVerify();
+
+ /**
* @ brief Initialize LLCurl class
*/
static void initClass();
@@ -182,6 +192,7 @@ public:
private:
static std::string sCAPath;
static std::string sCAFile;
+ static bool sSSLVerify;
};
namespace boost
@@ -194,12 +205,14 @@ namespace boost
class LLCurlRequest
{
public:
+ typedef std::vector<std::string> headers_t;
+
LLCurlRequest();
~LLCurlRequest();
void get(const std::string& url, LLCurl::ResponderPtr responder);
- bool getByteRange(const std::string& url, S32 offset, S32 length, LLCurl::ResponderPtr responder);
- bool post(const std::string& url, const LLSD& data, LLCurl::ResponderPtr responder);
+ bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder);
+ bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder);
S32 process();
S32 getQueued();
@@ -213,6 +226,7 @@ private:
curlmulti_set_t mMultiSet;
LLCurl::Multi* mActiveMulti;
S32 mActiveRequestCount;
+ U32 mThreadID; // debug
};
class LLCurlEasyRequest
diff --git a/indra/llmessage/lldatapacker.cpp b/indra/llmessage/lldatapacker.cpp
index 1f52bf3a23..a1b5c7908d 100644
--- a/indra/llmessage/lldatapacker.cpp
+++ b/indra/llmessage/lldatapacker.cpp
@@ -55,6 +55,18 @@ LLDataPacker::LLDataPacker() : mPassFlags(0), mWriteEnabled(FALSE)
{
}
+//virtual
+void LLDataPacker::reset()
+{
+ llerrs << "Using unimplemented datapacker reset!" << llendl;
+}
+
+//virtual
+void LLDataPacker::dumpBufferToLog()
+{
+ llerrs << "dumpBufferToLog not implemented for this type!" << llendl;
+}
+
BOOL LLDataPacker::packFixed(const F32 value, const char *name,
const BOOL is_signed, const U32 int_bits, const U32 frac_bits)
{
diff --git a/indra/llmessage/lldatapacker.h b/indra/llmessage/lldatapacker.h
index 92bfec698b..b8d9fcbdd4 100644
--- a/indra/llmessage/lldatapacker.h
+++ b/indra/llmessage/lldatapacker.h
@@ -45,8 +45,9 @@ class LLDataPacker
public:
virtual ~LLDataPacker() {}
- virtual void reset() { llerrs << "Using unimplemented datapacker reset!" << llendl; };
- virtual void dumpBufferToLog() { llerrs << "dumpBufferToLog not implemented for this type!" << llendl; }
+ // Not required to override, but error to call?
+ virtual void reset();
+ virtual void dumpBufferToLog();
virtual BOOL hasNext() const = 0;
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 49dbdbd56d..1980735bbb 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -126,8 +126,9 @@ LLHTTPAssetRequest::LLHTTPAssetRequest(LLHTTPAssetStorage *asp,
const std::string& url,
CURLM *curl_multi)
: LLAssetRequest(uuid, type),
- mZInitialized(false)
+ mZInitialized(false)
{
+ memset(&mZStream, 0, sizeof(mZStream)); // we'll initialize this later, but for now zero the whole C-style struct to avoid debug/coverity noise
mAssetStoragep = asp;
mCurlHandle = NULL;
mCurlMultiHandle = curl_multi;
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index 12ecbb36eb..dd56e18caf 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -222,7 +222,7 @@ static void request(
LLPumpIO::chain_t chain;
LLURLRequest* req = new LLURLRequest(method, url);
- req->checkRootCertificate(true);
+ req->checkRootCertificate(LLCurl::getSSLVerify());
lldebugs << LLURLRequest::actionAsVerb(method) << " " << url << " "
diff --git a/indra/llmessage/llhttpnode.h b/indra/llmessage/llhttpnode.h
index 915aacb7cc..8212f58653 100644
--- a/indra/llmessage/llhttpnode.h
+++ b/indra/llmessage/llhttpnode.h
@@ -305,7 +305,7 @@ protected:
~LLSimpleResponse();
private:
- LLSimpleResponse() {;} // Must be accessed through LLPointer.
+ LLSimpleResponse() : mCode(0) {} // Must be accessed through LLPointer.
};
std::ostream& operator<<(std::ostream& out, const LLSimpleResponse& resp);
diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp
index 3da41939fa..a9e1ee77ef 100644
--- a/indra/llmessage/llinstantmessage.cpp
+++ b/indra/llmessage/llinstantmessage.cpp
@@ -68,9 +68,11 @@ const S32 IM_TTL = 1;
* LLIMInfo
*/
LLIMInfo::LLIMInfo() :
+ mFromGroup(FALSE),
mParentEstateID(0),
mOffline(0),
mViewerThinksToIsOnline(false),
+ mIMType(IM_NOTHING_SPECIAL),
mTimeStamp(0),
mSource(IM_FROM_SIM),
mTTL(IM_TTL)
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index 97134bd336..27530fbfe1 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -74,7 +74,12 @@ class LLHTTPPipe : public LLIOPipe
{
public:
LLHTTPPipe(const LLHTTPNode& node)
- : mNode(node), mResponse(NULL), mState(STATE_INVOKE), mChainLock(0), mStatusCode(0)
+ : mNode(node),
+ mResponse(NULL),
+ mState(STATE_INVOKE),
+ mChainLock(0),
+ mLockedPump(NULL),
+ mStatusCode(0)
{ }
virtual ~LLHTTPPipe()
{
@@ -111,7 +116,7 @@ private:
void nullPipe();
private:
- Response() {;} // Must be accessed through LLPointer.
+ Response() : mPipe(NULL) {} // Must be accessed through LLPointer.
LLHTTPPipe* mPipe;
};
friend class Response;
@@ -403,7 +408,7 @@ void LLHTTPPipe::unlockChain()
class LLHTTPResponseHeader : public LLIOPipe
{
public:
- LLHTTPResponseHeader() {}
+ LLHTTPResponseHeader() : mCode(0) {}
virtual ~LLHTTPResponseHeader() {}
protected:
diff --git a/indra/llmessage/lliohttpserver.h b/indra/llmessage/lliohttpserver.h
index d1c9bdde85..e8e390f296 100644
--- a/indra/llmessage/lliohttpserver.h
+++ b/indra/llmessage/lliohttpserver.h
@@ -34,7 +34,6 @@
#ifndef LL_LLIOHTTPSERVER_H
#define LL_LLIOHTTPSERVER_H
-#include "llapr.h"
#include "llchainio.h"
#include "llhttpnode.h"
diff --git a/indra/llmessage/llmessagetemplate.h b/indra/llmessage/llmessagetemplate.h
index d7f02ebd85..8abc0aaab2 100644
--- a/indra/llmessage/llmessagetemplate.h
+++ b/indra/llmessage/llmessagetemplate.h
@@ -82,7 +82,7 @@ protected:
class LLMsgBlkData
{
public:
- LLMsgBlkData(const char *name, S32 blocknum) : mOffset(-1), mBlockNumber(blocknum), mTotalSize(-1)
+ LLMsgBlkData(const char *name, S32 blocknum) : mBlockNumber(blocknum), mTotalSize(-1)
{
mName = (char *)name;
}
@@ -108,7 +108,6 @@ public:
temp->addData(data, size, type, data_size);
}
- S32 mOffset;
S32 mBlockNumber;
typedef LLDynamicArrayIndexed<LLMsgVarData, const char *, 8> msg_var_data_map_t;
msg_var_data_map_t mMemberVarData;
@@ -136,7 +135,6 @@ public:
void addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1);
public:
- S32 mOffset;
typedef std::map<char*, LLMsgBlkData*> msg_blk_data_map_t;
msg_blk_data_map_t mMemberBlocks;
char *mName;
diff --git a/indra/llmessage/llmessagetemplateparser.cpp b/indra/llmessage/llmessagetemplateparser.cpp
index 283547ea00..2ddbf3e0df 100644
--- a/indra/llmessage/llmessagetemplateparser.cpp
+++ b/indra/llmessage/llmessagetemplateparser.cpp
@@ -403,6 +403,10 @@ LLTemplateParser::LLTemplateParser(LLTemplateTokenizer & tokens):
{
mMessages.push_back(templatep);
}
+ else
+ {
+ delete templatep;
+ }
}
if(!tokens.wantEOF())
diff --git a/indra/llmessage/llnamevalue.cpp b/indra/llmessage/llnamevalue.cpp
index 01e922eba2..43429b0ab3 100644
--- a/indra/llmessage/llnamevalue.cpp
+++ b/indra/llmessage/llnamevalue.cpp
@@ -963,6 +963,7 @@ std::ostream& operator<<(std::ostream& s, const LLNameValue &a)
U64_to_str(*a.mNameValueReference.u64, u64_string, sizeof(u64_string));
s << u64_string;
}
+ break;
case NVT_VEC3:
s << *(a.mNameValueReference.vec3);
break;
diff --git a/indra/llmessage/llpacketbuffer.cpp b/indra/llmessage/llpacketbuffer.cpp
index 027d35cf89..441e8ddd27 100644
--- a/indra/llmessage/llpacketbuffer.cpp
+++ b/indra/llmessage/llpacketbuffer.cpp
@@ -42,11 +42,14 @@
LLPacketBuffer::LLPacketBuffer(const LLHost &host, const char *datap, const S32 size) : mHost(host)
{
+ mSize = 0;
+ mData[0] = '!';
+
if (size > NET_BUFFER_SIZE)
{
llerrs << "Sending packet > " << NET_BUFFER_SIZE << " of size " << size << llendl;
}
- else // we previously relied on llerrs being fatal to not get here...
+ else
{
if (datap != NULL)
{
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 232478577c..40e4a4268d 100644
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -92,7 +92,7 @@ const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
-const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27);
+// const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); // We no longer support ELAR
const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp
index 6400310c46..55379fc6fd 100644
--- a/indra/llmessage/lltemplatemessagebuilder.cpp
+++ b/indra/llmessage/lltemplatemessagebuilder.cpp
@@ -737,10 +737,14 @@ static S32 buildBlock(U8* buffer, S32 buffer_size, const LLMessageBlock* templat
}
--block_count;
- ++block_iter;
+
if (block_iter != message_data->mMemberBlocks.end())
{
- mbci = block_iter->second;
+ ++block_iter;
+ if (block_iter != message_data->mMemberBlocks.end())
+ {
+ mbci = block_iter->second;
+ }
}
}
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index d67911e8e2..d64b666ede 100644
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -855,6 +855,7 @@ void LLTransferSourceChannel::updateTransfers()
break;
case LLTS_ERROR:
llwarns << "Error in transfer dataCallback!" << llendl;
+ // fall through
case LLTS_DONE:
// We need to clean up this transfer source.
//llinfos << "LLTransferSourceChannel::updateTransfers() " << tsp->getID() << " done" << llendl;
@@ -1195,6 +1196,7 @@ LLTransferTarget::LLTransferTarget(
mType(type),
mSourceType(source_type),
mID(transfer_id),
+ mChannelp(NULL),
mGotInfo(FALSE),
mSize(0),
mLastPacketID(-1)
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 41f3f3f607..8f36d516d7 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -226,7 +226,10 @@ void LLTransferSourceAsset::responderCallback(LLVFS *vfs, const LLUUID& uuid, LL
-LLTransferSourceParamsAsset::LLTransferSourceParamsAsset() : LLTransferSourceParams(LLTST_ASSET)
+LLTransferSourceParamsAsset::LLTransferSourceParamsAsset()
+ : LLTransferSourceParams(LLTST_ASSET),
+
+ mAssetType(LLAssetType::AT_NONE)
{
}
@@ -292,7 +295,6 @@ bool is_asset_id_knowable(LLAssetType::EType type)
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_ANIMATION:
case LLAssetType::AT_GESTURE:
- case LLAssetType::AT_FAVORITE:
case LLAssetType::AT_LINK:
case LLAssetType::AT_LINK_FOLDER:
rv = true;
diff --git a/indra/llmessage/lltransfertargetfile.h b/indra/llmessage/lltransfertargetfile.h
index 18b9b52062..92fb8f807c 100644
--- a/indra/llmessage/lltransfertargetfile.h
+++ b/indra/llmessage/lltransfertargetfile.h
@@ -40,7 +40,12 @@ typedef void (*LLTTFCompleteCallback)(const LLTSCode status, void *user_data);
class LLTransferTargetParamsFile : public LLTransferTargetParams
{
public:
- LLTransferTargetParamsFile() : LLTransferTargetParams(LLTTT_FILE) {}
+ LLTransferTargetParamsFile()
+ : LLTransferTargetParams(LLTTT_FILE),
+
+ mCompleteCallback(NULL),
+ mUserData(NULL)
+ {}
void setFilename(const std::string& filename) { mFilename = filename; }
void setCallback(LLTTFCompleteCallback cb, void *user_data) { mCompleteCallback = cb; mUserData = user_data; }
diff --git a/indra/llmessage/lltransfertargetvfile.h b/indra/llmessage/lltransfertargetvfile.h
index 8c2bc7e8bb..cd18d8ce3f 100644
--- a/indra/llmessage/lltransfertargetvfile.h
+++ b/indra/llmessage/lltransfertargetvfile.h
@@ -68,7 +68,6 @@ protected:
LLTTVFCompleteCallback mCompleteCallback;
void* mUserDatap;
S32 mErrCode;
- LLVFSThread::handle_t mHandle;
};
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index 81b7761ed5..4e7ceff984 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -163,6 +163,7 @@ void LLURLRequest::setBodyLimit(U32 size)
void LLURLRequest::checkRootCertificate(bool check)
{
mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, (check? TRUE : FALSE));
+ mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, (check? 2 : 0));
mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, "");
}
diff --git a/indra/llmessage/llxfer.cpp b/indra/llmessage/llxfer.cpp
index 8404f6519d..7aa833ee32 100644
--- a/indra/llmessage/llxfer.cpp
+++ b/indra/llmessage/llxfer.cpp
@@ -74,6 +74,7 @@ void LLXfer::init (S32 chunk_size)
mCallback = NULL;
mCallbackDataHandle = NULL;
+ mCallbackResult = 0;
mBufferContainsEOF = FALSE;
mBuffer = NULL;
diff --git a/indra/llmessage/machine.cpp b/indra/llmessage/machine.cpp
new file mode 100644
index 0000000000..afaaeb8ea2
--- /dev/null
+++ b/indra/llmessage/machine.cpp
@@ -0,0 +1,62 @@
+/**
+ * @file machine.cpp
+ * @brief LLMachine class header file
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "machine.h"
+
+#include "llerror.h"
+
+void LLMachine::setMachinePort(S32 port)
+{
+ if (port < 0)
+ {
+ llinfos << "Can't assign a negative number to LLMachine::mPort" << llendl;
+ mHost.setPort(0);
+ }
+ else
+ {
+ mHost.setPort(port);
+ }
+}
+
+void LLMachine::setControlPort( S32 port )
+{
+ if (port < 0)
+ {
+ llinfos << "Can't assign a negative number to LLMachine::mControlPort" << llendl;
+ mControlPort = 0;
+ }
+ else
+ {
+ mControlPort = port;
+ }
+}
diff --git a/indra/llmessage/machine.h b/indra/llmessage/machine.h
index 63a038159e..6da8e5e04e 100644
--- a/indra/llmessage/machine.h
+++ b/indra/llmessage/machine.h
@@ -33,7 +33,6 @@
#ifndef LL_MACHINE_H
#define LL_MACHINE_H
-#include "llerror.h"
#include "net.h"
#include "llhost.h"
@@ -79,31 +78,8 @@ public:
void setMachineIP(U32 ip) { mHost.setAddress(ip); }
void setMachineHost(const LLHost &host) { mHost = host; }
- void setMachinePort(S32 port)
- {
- if (port < 0)
- {
- llinfos << "Can't assign a negative number to LLMachine::mPort" << llendl;
- mHost.setPort(0);
- }
- else
- {
- mHost.setPort(port);
- }
- }
-
- void setControlPort( S32 port )
- {
- if (port < 0)
- {
- llinfos << "Can't assign a negative number to LLMachine::mControlPort" << llendl;
- mControlPort = 0;
- }
- else
- {
- mControlPort = port;
- }
- }
+ void setMachinePort(S32 port);
+ void setControlPort( S32 port );
// member variables
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index e56d818d65..916006bc2d 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -253,6 +253,8 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
{
init();
+ mSendSize = 0;
+
mSystemVersionMajor = version_major;
mSystemVersionMinor = version_minor;
mSystemVersionPatch = version_patch;
@@ -323,6 +325,8 @@ LLMessageSystem::LLMessageSystem(const std::string& filename, U32 port,
mMaxMessageTime = 1.f;
mTrueReceiveSize = 0;
+
+ mReceiveTime = 0.f;
}
diff --git a/indra/llmessage/partsyspacket.cpp b/indra/llmessage/partsyspacket.cpp
index cfb3572d84..2f9e59accb 100644
--- a/indra/llmessage/partsyspacket.cpp
+++ b/indra/llmessage/partsyspacket.cpp
@@ -144,6 +144,8 @@ LLPartSysCompressedPacket::LLPartSysCompressedPacket()
mData[i] = '\0';
}
+ mNumBytes = 0;
+
gSetInitDataDefaults(&mDefaults);
}
diff --git a/indra/llmessage/sound_ids.cpp b/indra/llmessage/sound_ids.cpp
new file mode 100644
index 0000000000..edd9a36c5f
--- /dev/null
+++ b/indra/llmessage/sound_ids.cpp
@@ -0,0 +1,314 @@
+/**
+ * @file sound_ids.cpp
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "sound_ids.h"
+
+#include "lluuid.h"
+
+const LLUUID SND_NULL = LLUUID::null;
+const LLUUID SND_RIDE ("00000000-0000-0000-0000-000000000100");
+const LLUUID SND_SHOT ("00000000-0000-0000-0000-000000000101");
+const LLUUID SND_MORTAR ("00000000-0000-0000-0000-000000000102");
+const LLUUID SND_HIT ("00000000-0000-0000-0000-000000000103");
+const LLUUID SND_EXPLOSION ("00000000-0000-0000-0000-000000000104");
+const LLUUID SND_BOING ("00000000-0000-0000-0000-000000000105");
+const LLUUID SND_OBJECT_CREATE ("9f1bc096-3592-411e-9b0b-c447a9ff054c");
+
+//
+// Different bird sounds for different states
+//
+
+const LLUUID SND_CHIRP ("00000000-0000-0000-0000-000000000106"); // Flying random chirp
+const LLUUID SND_CHIRP2 ("828a9526-175b-455d-8af0-0e3c0fb602b2"); // Spooked by user
+const LLUUID SND_CHIRP3 ("f99772d6-1ce6-4a39-a28b-06d26c94c9e3"); // Spooked by object
+const LLUUID SND_CHIRP4 ("54472ca4-7fc9-42cb-b7d5-99ad5b12bd50"); // Chasing other bird
+const LLUUID SND_CHIRP5 ("2929964f-fac5-40d7-9179-2864a8fa9ace"); // Hopping random chirp
+const LLUUID SND_CHIRPDEAD ("9abff1d3-863a-4e04-bd83-3834fd7fcff4"); // Hit by grenade - dead!
+
+
+const LLUUID SND_MUNCH ("00000000-0000-0000-0000-000000000107");
+const LLUUID SND_PUNCH ("00000000-0000-0000-0000-000000000108");
+const LLUUID SND_SPLASH ("00000000-0000-0000-0000-000000000109");
+const LLUUID SND_CLICK ("00000000-0000-0000-0000-000000000110");
+const LLUUID SND_WHISTLE ("ab858f9a-1f44-4d39-9b33-351543d03ccb");
+const LLUUID SND_TYPING ("5e191c7b-8996-9ced-a177-b2ac32bfea06");
+
+const LLUUID SND_ARROW_SHOT ("00000000-0000-0000-0000-000000000111");
+const LLUUID SND_ARROW_THUD ("00000000-0000-0000-0000-000000000112");
+const LLUUID SND_LASER_SHOT ("00000000-0000-0000-0000-000000000113");
+const LLUUID SND_JET_THRUST ("67f5e4f0-0534-4d97-bc01-f297648d20e0");
+
+const LLUUID SND_SILENCE ("00000000-0000-0000-0000-000000000114");
+const LLUUID SND_BUBBLES ("00000000-0000-0000-0000-000000000115");
+const LLUUID SND_WELCOME ("00000000-0000-0000-0000-000000000116");
+const LLUUID SND_SQUISH ("00000000-0000-0000-0000-000000000117");
+const LLUUID SND_SUBPOD ("00000000-0000-0000-0000-000000000118");
+const LLUUID SND_FOOTSTEPS ("00000000-0000-0000-0000-000000000119");
+const LLUUID SND_STEP_LEFT ("00000000-0000-0000-0000-000000000124");
+const LLUUID SND_STEP_RIGHT ("00000000-0000-0000-0000-000000000125");
+
+const LLUUID SND_BALL_COLLISION ("00000000-0000-0000-0000-000000000120");
+
+const LLUUID SND_OOOH_SCARE_ME ("00000000-0000-0000-0000-000000000121");
+const LLUUID SND_PAYBACK_TIME ("00000000-0000-0000-0000-000000000122");
+const LLUUID SND_READY_FOR_BATTLE ("00000000-0000-0000-0000-000000000123");
+
+const LLUUID SND_FLESH_FLESH ("dce5fdd4-afe4-4ea1-822f-dd52cac46b08");
+const LLUUID SND_FLESH_PLASTIC ("51011582-fbca-4580-ae9e-1a5593f094ec");
+const LLUUID SND_FLESH_RUBBER ("68d62208-e257-4d0c-bbe2-20c9ea9760bb");
+const LLUUID SND_GLASS_FLESH ("75872e8c-bc39-451b-9b0b-042d7ba36cba");
+const LLUUID SND_GLASS_GLASS ("6a45ba0b-5775-4ea8-8513-26008a17f873");
+const LLUUID SND_GLASS_PLASTIC ("992a6d1b-8c77-40e0-9495-4098ce539694");
+const LLUUID SND_GLASS_RUBBER ("2de4da5a-faf8-46be-bac6-c4d74f1e5767");
+const LLUUID SND_GLASS_WOOD ("6e3fb0f7-6d9c-42ca-b86b-1122ff562d7d");
+const LLUUID SND_METAL_FLESH ("14209133-4961-4acc-9649-53fc38ee1667");
+const LLUUID SND_METAL_GLASS ("bc4a4348-cfcc-4e5e-908e-8a52a8915fe6");
+const LLUUID SND_METAL_METAL ("9e5c1297-6eed-40c0-825a-d9bcd86e3193");
+const LLUUID SND_METAL_PLASTIC ("e534761c-1894-4b61-b20c-658a6fb68157");
+const LLUUID SND_METAL_RUBBER ("8761f73f-6cf9-4186-8aaa-0948ed002db1");
+const LLUUID SND_METAL_WOOD ("874a26fd-142f-4173-8c5b-890cd846c74d");
+const LLUUID SND_PLASTIC_PLASTIC ("0e24a717-b97e-4b77-9c94-b59a5a88b2da");
+const LLUUID SND_RUBBER_PLASTIC ("75cf3ade-9a5b-4c4d-bb35-f9799bda7fb2");
+const LLUUID SND_RUBBER_RUBBER ("153c8bf7-fb89-4d89-b263-47e58b1b4774");
+const LLUUID SND_STONE_FLESH ("55c3e0ce-275a-46fa-82ff-e0465f5e8703");
+const LLUUID SND_STONE_GLASS ("24babf58-7156-4841-9a3f-761bdbb8e237");
+const LLUUID SND_STONE_METAL ("aca261d8-e145-4610-9e20-9eff990f2c12");
+const LLUUID SND_STONE_PLASTIC ("0642fba6-5dcf-4d62-8e7b-94dbb529d117");
+const LLUUID SND_STONE_RUBBER ("25a863e8-dc42-4e8a-a357-e76422ace9b5");
+const LLUUID SND_STONE_STONE ("9538f37c-456e-4047-81be-6435045608d4");
+const LLUUID SND_STONE_WOOD ("8c0f84c3-9afd-4396-b5f5-9bca2c911c20");
+const LLUUID SND_WOOD_FLESH ("be582e5d-b123-41a2-a150-454c39e961c8");
+const LLUUID SND_WOOD_PLASTIC ("c70141d4-ba06-41ea-bcbc-35ea81cb8335");
+const LLUUID SND_WOOD_RUBBER ("7d1826f4-24c4-4aac-8c2e-eff45df37783");
+const LLUUID SND_WOOD_WOOD ("063c97d3-033a-4e9b-98d8-05c8074922cb");
+
+
+const LLUUID SND_SLIDE_FLESH_FLESH ("614eec22-f73d-4fdc-8691-a37dc5c58333");
+const LLUUID SND_SLIDE_FLESH_PLASTIC (SND_NULL);
+const LLUUID SND_SLIDE_FLESH_RUBBER (SND_NULL);
+const LLUUID SND_SLIDE_FLESH_FABRIC ("3678b9b9-2a0c-42b5-9c83-80b64ad6e898");
+const LLUUID SND_SLIDE_FLESH_GRAVEL ("02eaa42a-ce1a-4b6b-9c38-cd7ad0e8f4a6");
+const LLUUID SND_SLIDE_FLESH_GRAVEL_02 ("e7d3b501-79f8-4419-b842-ab6843e0f840");
+const LLUUID SND_SLIDE_FLESH_GRAVEL_03 ("4c3e8b52-6244-4e44-85a6-f4ab994418ed");
+const LLUUID SND_SLIDE_GLASS_GRAVEL ("ca491e77-5c47-4ea1-8021-b3ebbf636cab");
+const LLUUID SND_SLIDE_GLASS_GRAVEL_02 ("30794d49-91ce-48e3-a527-c06f67bd6cbe");
+const LLUUID SND_SLIDE_GLASS_GRAVEL_03 ("04c78e54-fd8d-46b6-8ab9-7678b5d6e5cb");
+const LLUUID SND_SLIDE_GLASS_FLESH (SND_NULL);
+const LLUUID SND_SLIDE_GLASS_GLASS (SND_NULL);
+const LLUUID SND_SLIDE_GLASS_PLASTIC (SND_NULL);
+const LLUUID SND_SLIDE_GLASS_RUBBER (SND_NULL);
+const LLUUID SND_SLIDE_GLASS_WOOD (SND_NULL);
+const LLUUID SND_SLIDE_METAL_FABRIC ("18b66e81-2958-42d4-a373-7a5054919adc");
+const LLUUID SND_SLIDE_METAL_FLESH ("dde65837-633c-4841-af2f-62ec471bf61e");
+const LLUUID SND_SLIDE_METAL_FLESH_02 ("f3cc2cbe-1a1a-4db7-a8d2-e9c8f8fa1f4f");
+const LLUUID SND_SLIDE_METAL_GLASS ("4188be39-7b1f-4495-bf2b-83ddd82eea05");
+const LLUUID SND_SLIDE_METAL_GLASS_02 ("336faa2b-9d96-4e14-93ad-b63b60074379");
+const LLUUID SND_SLIDE_METAL_GLASS_03 ("34d912aa-cf73-4462-b7d0-dcba2c66caba");
+const LLUUID SND_SLIDE_METAL_GLASS_04 ("97ffc063-e872-4469-8e95-1450ac6bad2b");
+const LLUUID SND_SLIDE_METAL_GRAVEL ("2bbff37d-009a-4cfc-9a0d-817652c08fbe");
+const LLUUID SND_SLIDE_METAL_GRAVEL_02 ("a906a228-783b-49e7-9f0a-e20a41d0e39f");
+const LLUUID SND_SLIDE_METAL_METAL ("09461277-c691-45de-b2c5-89dfd3712f79");
+const LLUUID SND_SLIDE_METAL_METAL_02 ("e00a5d97-8fdc-46c1-bd53-7e312727466c");
+const LLUUID SND_SLIDE_METAL_METAL_03 ("8ebfa780-c440-4b52-ab65-5edf3bc15bf1");
+const LLUUID SND_SLIDE_METAL_METAL_04 ("d6d03cb2-5b16-4e31-b7d4-2a81d2a0909b");
+const LLUUID SND_SLIDE_METAL_METAL_05 ("3a46f447-916e-47de-a1e5-95d1af46bd0f");
+const LLUUID SND_SLIDE_METAL_METAL_06 ("cd423231-e70d-4fd2-ad26-f1c6cf5f0610");
+const LLUUID SND_SLIDE_METAL_PLASTIC (SND_NULL);
+const LLUUID SND_SLIDE_METAL_RUBBER ("12d97bc0-3c15-4744-b6bd-77d1316eb4f0");
+const LLUUID SND_SLIDE_METAL_WOOD ("4afb6926-a73f-4cb7-85d5-0f9a40107434");
+const LLUUID SND_SLIDE_METAL_WOOD_02 ("349970bf-187d-4bcb-b2cf-e7bb6581590f");
+const LLUUID SND_SLIDE_METAL_WOOD_03 ("64bf6e87-73d4-4cb4-84f7-55cecfd97cd3");
+const LLUUID SND_SLIDE_METAL_WOOD_04 ("0dc670a9-dbe8-41bc-b8ee-4d96d99219d5");
+const LLUUID SND_SLIDE_METAL_WOOD_05 ("6e3cc57b-c9aa-4829-86a1-8e82aeaccb47");
+const LLUUID SND_SLIDE_METAL_WOOD_06 ("c1237f4c-8c88-4da1-bfbc-2af26a8d9e5a");
+const LLUUID SND_SLIDE_METAL_WOOD_07 ("0e1ec243-063b-4dcb-a903-52b8dffed3d2");
+const LLUUID SND_SLIDE_METAL_WOOD_08 ("66736d0f-533d-4007-a8ee-0f27c2034126");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL ("35092c21-5c48-4b4d-a818-3cf240af2348");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL_02("c37f5776-0020-47e8-89a0-c74cc6f5742d");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL_03("d2fc8db6-2e66-464a-8ccb-f99b61ee4987");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL_04("93cbdb10-6e82-4c0b-a547-7b3b79ac25f6");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL_05("2f6d0542-fcd1-4264-a17b-f57bf5ebf402");
+const LLUUID SND_SLIDE_PLASTIC_GRAVEL_06("5b8887d4-3be2-45a0-b25d-85af3b1e6392");
+const LLUUID SND_SLIDE_PLASTIC_PLASTIC (SND_NULL);
+const LLUUID SND_SLIDE_PLASTIC_PLASTIC_02 (SND_NULL);
+const LLUUID SND_SLIDE_PLASTIC_PLASTIC_03 (SND_NULL);
+const LLUUID SND_SLIDE_PLASTIC_FABRIC ("7294d9ad-3e41-4373-992c-a9f21d5d66ad");
+const LLUUID SND_SLIDE_PLASTIC_FABRIC_02("58608ce1-f524-472f-b447-bbe6ce4a46e0");
+const LLUUID SND_SLIDE_PLASTIC_FABRIC_03("06ae285e-0b34-4ea6-84ab-9c6c31b414fc");
+const LLUUID SND_SLIDE_PLASTIC_FABRIC_04("211613db-0461-49bd-9554-5c14ad8b31f6");
+const LLUUID SND_SLIDE_RUBBER_PLASTIC ("a98ffa5a-e48e-4f9d-9242-b9a3210ad84a");
+const LLUUID SND_SLIDE_RUBBER_PLASTIC_02 ("d4136c40-eeaa-49c6-a982-8e5a16f5d93a");
+const LLUUID SND_SLIDE_RUBBER_PLASTIC_03 ("29ec0fb2-0b23-47b2-835b-c83cc7cf9fb0");
+const LLUUID SND_SLIDE_RUBBER_RUBBER (SND_NULL);
+const LLUUID SND_SLIDE_STONE_FLESH (SND_NULL);
+const LLUUID SND_SLIDE_STONE_GLASS (SND_NULL);
+const LLUUID SND_SLIDE_STONE_METAL (SND_NULL);
+const LLUUID SND_SLIDE_STONE_PLASTIC ("afd0bcc3-d41a-4572-9e7f-08a29eeb0b8a");
+const LLUUID SND_SLIDE_STONE_PLASTIC_02 ("881b720a-96cf-4128-bb98-5d87e03e93c7");
+const LLUUID SND_SLIDE_STONE_PLASTIC_03 ("293dac42-658a-4c5a-a7a2-6d4c5e5658b0");
+const LLUUID SND_SLIDE_STONE_RUBBER ("0724b946-6a3f-4eeb-bb50-0a3b33120974");
+const LLUUID SND_SLIDE_STONE_RUBBER_02 ("ada93d00-76e2-4bf1-9ad9-493727630717");
+const LLUUID SND_SLIDE_STONE_STONE ("ade766dc-2e75-4699-9b41-7c8e53d2b3f2");
+const LLUUID SND_SLIDE_STONE_STONE_02 ("66698375-6594-47b0-8046-c3973de1291d");
+const LLUUID SND_SLIDE_STONE_WOOD ("174ef324-ed50-4f65-9479-b4da580aeb3c");
+const LLUUID SND_SLIDE_STONE_WOOD_02 ("33d517fd-ff11-4d01-a7b5-0e3abf818dcf");
+const LLUUID SND_SLIDE_STONE_WOOD_03 ("1bac4b63-e6fd-4659-9761-991284cf4582");
+const LLUUID SND_SLIDE_STONE_WOOD_04 ("a7d28564-6821-4c01-a378-cde98fba7ba9");
+const LLUUID SND_SLIDE_WOOD_FABRIC ("22c58e74-22cd-4960-9ab7-5bf08ab824e5");
+const LLUUID SND_SLIDE_WOOD_FABRIC_02 ("0b0ed22e-4a0f-4617-a4cf-20d0f2b78ccc");
+const LLUUID SND_SLIDE_WOOD_FABRIC_03 ("42b80abb-9823-4b74-a210-326ccf23636a");
+const LLUUID SND_SLIDE_WOOD_FABRIC_04 ("8538298a-1e6b-4b69-a9ee-5e01e4a02b35");
+const LLUUID SND_SLIDE_WOOD_FLESH ("84b026f3-a11c-4366-aa7c-07edcd89b2bb");
+const LLUUID SND_SLIDE_WOOD_FLESH_02 ("2644191f-4848-47ba-8ba7-bddc0bfcb3da");
+const LLUUID SND_SLIDE_WOOD_FLESH_03 ("edb978e4-9be9-456f-b2fc-e8502bfe25be");
+const LLUUID SND_SLIDE_WOOD_FLESH_04 ("bf2b972e-f42a-46d7-b53e-5fca38f5bc61");
+const LLUUID SND_SLIDE_WOOD_GRAVEL ("d063bb4d-0eff-4403-a6cc-c6c6c073e624");
+const LLUUID SND_SLIDE_WOOD_GRAVEL_02 ("511eb679-6d93-47fa-9141-c3ef9261c919");
+const LLUUID SND_SLIDE_WOOD_GRAVEL_03 ("4ed1fd43-4707-4e5c-b7b7-21ec4e72c1ac");
+const LLUUID SND_SLIDE_WOOD_GRAVEL_04 ("99ea89b3-aa76-4b87-99c8-670365c6d8c3");
+const LLUUID SND_SLIDE_WOOD_PLASTIC ("505ca3c4-94a0-4e28-8fc1-ea72a428396b");
+const LLUUID SND_SLIDE_WOOD_PLASTIC_02 ("fc404011-df71-4ed0-8f22-b72bdd18f63c");
+const LLUUID SND_SLIDE_WOOD_PLASTIC_03 ("67dbe225-26df-4efa-8c8b-f1ef669fec45");
+const LLUUID SND_SLIDE_WOOD_RUBBER (SND_NULL);
+const LLUUID SND_SLIDE_WOOD_WOOD ("3079d569-b3e8-4df4-9e09-f0d4611213ef");
+const LLUUID SND_SLIDE_WOOD_WOOD_02 ("276b093d-dbcb-4279-a89e-a54b0b416af6");
+const LLUUID SND_SLIDE_WOOD_WOOD_03 ("c3f3ca5e-2768-4081-847f-247139310fdb");
+const LLUUID SND_SLIDE_WOOD_WOOD_04 ("f08d44b8-ff87-4a98-9561-c72f1f2fec81");
+const LLUUID SND_SLIDE_WOOD_WOOD_05 ("2d8a58cf-f139-4238-8503-27d334d05c85");
+const LLUUID SND_SLIDE_WOOD_WOOD_06 ("e157ebbd-b12d-4225-aa7c-d47b026a7687");
+const LLUUID SND_SLIDE_WOOD_WOOD_07 ("35e17956-e7b4-478c-b274-e37db8a166b2");
+const LLUUID SND_SLIDE_WOOD_WOOD_08 ("e606fc65-0643-4964-9979-ff964fa6a62c");
+
+
+const LLUUID SND_ROLL_FLESH_FLESH (SND_NULL);
+const LLUUID SND_ROLL_FLESH_PLASTIC ("89a0be4c-848d-4a6e-8886-298f56c2cff4");
+const LLUUID SND_ROLL_FLESH_PLASTIC_02 ("beb06343-1aa1-4af2-b320-5d2ec31c53b1");
+const LLUUID SND_ROLL_FLESH_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_GLASS_GRAVEL ("ba795c74-7e09-4572-b495-e09886a46b86");
+const LLUUID SND_ROLL_GLASS_GRAVEL_02 ("4c93c3b7-14cb-4d9b-a7df-628ad935f1f2");
+const LLUUID SND_ROLL_GLASS_FLESH (SND_NULL);
+const LLUUID SND_ROLL_GLASS_GLASS (SND_NULL);
+const LLUUID SND_ROLL_GLASS_PLASTIC (SND_NULL);
+const LLUUID SND_ROLL_GLASS_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_GLASS_WOOD ("d40b1f48-a061-4f6e-b18f-4326a3dd5c29");
+const LLUUID SND_ROLL_GLASS_WOOD_02 ("78cd407a-bb36-4163-ba09-20f2e6d9d44b");
+const LLUUID SND_ROLL_GRAVEL_GRAVEL ("c7354cc3-6df5-4738-8dbb-b28a6ac46a05");
+const LLUUID SND_ROLL_GRAVEL_GRAVEL_02 ("01d194c4-72a6-47df-81a5-8db430faff87");
+const LLUUID SND_ROLL_METAL_FABRIC ("ce6e6564-20fd-48e4-81e2-cd3f81c00a3e");
+const LLUUID SND_ROLL_METAL_FABRIC_02 ("fc4d0065-32f6-4bb0-9f3f-f4737eb27163");
+const LLUUID SND_ROLL_METAL_FLESH (SND_NULL);
+const LLUUID SND_ROLL_METAL_GLASS ("63d530bb-a41f-402b-aa1f-be6b11959809");
+const LLUUID SND_ROLL_METAL_GLASS_02 ("f62642c2-6db5-4faa-8b77-939067d837c3");
+const LLUUID SND_ROLL_METAL_GLASS_03 ("db5b5a15-2817-4cd7-9f0b-9ad49b5e52c8");
+const LLUUID SND_ROLL_METAL_GRAVEL ("447164e3-9646-4c1a-a16d-606892891466");
+const LLUUID SND_ROLL_METAL_METAL ("c3c22cf3-5d1f-4cc3-b4b5-708b9f65979c");
+const LLUUID SND_ROLL_METAL_METAL_02 ("d8386277-a1ea-460e-b6fd-bb285c323bf1");
+const LLUUID SND_ROLL_METAL_METAL_03 ("69ee1f02-f9cd-4c8b-aedd-39a2d6705680");
+const LLUUID SND_ROLL_METAL_METAL_04 ("5cc6b5fd-26ce-47ad-b21d-3a7c190dd375");
+const LLUUID SND_ROLL_METAL_PLASTIC ("c6a9bbf6-df15-4713-9f84-7237fce4051e");
+const LLUUID SND_ROLL_METAL_PLASTIC_01 ("0fedb59b-2dbb-4cec-b6cc-8559ec027749");
+const LLUUID SND_ROLL_METAL_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_METAL_WOOD ("1d76af57-01b1-4c73-9a1d-69523bfa50ea");
+const LLUUID SND_ROLL_METAL_WOOD_02 ("78aa4e71-8e7c-4b90-a561-3ebdc639f99b");
+const LLUUID SND_ROLL_METAL_WOOD_03 ("777d95bf-962f-48fa-93bf-8c1806557d72");
+const LLUUID SND_ROLL_METAL_WOOD_04 ("1833da76-45e2-4a8b-97da-d17413e056c9");
+const LLUUID SND_ROLL_METAL_WOOD_05 ("b13e1232-3d8d-42e9-92ec-b30f9f823962");
+const LLUUID SND_ROLL_PLASTIC_FABRIC ("616a1f03-209f-4c55-b264-83a000b6ef0a");
+const LLUUID SND_ROLL_PLASTIC_PLASTIC ("873f3d82-00b2-4082-9c69-7aef3461dba1");
+const LLUUID SND_ROLL_PLASTIC_PLASTIC_02 ("cc39879f-ebc8-4405-a4fc-8342f5bed31e");
+const LLUUID SND_ROLL_RUBBER_PLASTIC (SND_NULL);
+const LLUUID SND_ROLL_RUBBER_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_STONE_FLESH (SND_NULL);
+const LLUUID SND_ROLL_STONE_GLASS (SND_NULL);
+const LLUUID SND_ROLL_STONE_METAL (SND_NULL);
+const LLUUID SND_ROLL_STONE_PLASTIC ("155f65a8-cae7-476e-a58b-fd362be7fd0e");
+const LLUUID SND_ROLL_STONE_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_STONE_STONE ("67d56e3f-6ed5-4658-9418-14f020c38b11");
+const LLUUID SND_ROLL_STONE_STONE_02 ("43d99d10-d75b-4246-accf-4ceb2c909aa7");
+const LLUUID SND_ROLL_STONE_STONE_03 ("f04e83ff-eed7-4e99-8f45-eb97e4e1d3b7");
+const LLUUID SND_ROLL_STONE_STONE_04 ("10fcc5ad-fa89-48d6-b774-986b580c1efc");
+const LLUUID SND_ROLL_STONE_STONE_05 ("3d86f5a3-1a91-49d9-b99f-8521a7422497");
+const LLUUID SND_ROLL_STONE_WOOD ("53e46fb7-6c21-4fe1-bffe-0567475d48fa");
+const LLUUID SND_ROLL_STONE_WOOD_02 ("5eba8c9a-a014-4299-87f1-315c45ec795b");
+const LLUUID SND_ROLL_STONE_WOOD_03 ("ea6c05fc-6e9c-4526-8a20-bc47810bb549");
+const LLUUID SND_ROLL_STONE_WOOD_04 ("64618cbf-3f42-4728-8094-e77807545efb");
+const LLUUID SND_ROLL_WOOD_FLESH ("26ee185d-6fc3-49f8-89ba-51cab04cfc42");
+const LLUUID SND_ROLL_WOOD_FLESH_02 ("334faa25-1e80-4c99-b29f-4c9c2a3d079d");
+const LLUUID SND_ROLL_WOOD_FLESH_03 ("2f876626-4dce-4f71-a91e-a25302edfab7");
+const LLUUID SND_ROLL_WOOD_FLESH_04 ("d6877aac-07fc-4931-bcde-585f223802ad");
+const LLUUID SND_ROLL_WOOD_GRAVEL ("2a23ebb5-a4a2-4f1f-8d75-7384239354aa");
+const LLUUID SND_ROLL_WOOD_GRAVEL_02 ("208bf26d-f097-450c-95c4-9d26317c613c");
+const LLUUID SND_ROLL_WOOD_GRAVEL_03 ("a26ecaf4-92c6-4e32-9864-56b7c70cab8e");
+const LLUUID SND_ROLL_WOOD_PLASTIC ("71c1000a-9f16-4cc3-8ede-ec4aa3bf5723");
+const LLUUID SND_ROLL_WOOD_PLASTIC_02 ("7bc20ba6-1e6d-4eea-83ad-c5cc3ae0e409");
+const LLUUID SND_ROLL_WOOD_RUBBER (SND_NULL);
+const LLUUID SND_ROLL_WOOD_WOOD ("2cc8eec4-bb4a-4ba8-b783-71526ec708e8");
+const LLUUID SND_ROLL_WOOD_WOOD_02 ("0a1f8070-a11a-4b4c-b260-5ffb6acb0a5d");
+const LLUUID SND_ROLL_WOOD_WOOD_03 ("160bef64-da9c-4be8-b07b-a5060b501700");
+const LLUUID SND_ROLL_WOOD_WOOD_04 ("1c62ea16-cc60-48ed-829a-68b8f4cf0c1c");
+const LLUUID SND_ROLL_WOOD_WOOD_05 ("be9cc8fe-b920-4bf5-8924-453088cbc03f");
+const LLUUID SND_ROLL_WOOD_WOOD_06 ("a76cfe60-56b0-43b1-8f31-93e56947d78b");
+const LLUUID SND_ROLL_WOOD_WOOD_07 ("0c6aa481-b5bc-4573-ae83-8e16ff27e750");
+const LLUUID SND_ROLL_WOOD_WOOD_08 ("214ab2c7-871a-451b-b0db-4c5677199011");
+const LLUUID SND_ROLL_WOOD_WOOD_09 ("0086e4db-3ac6-4545-b414-6f359bedd9a5");
+
+const LLUUID SND_SLIDE_STONE_STONE_01 ("2a7dcbd1-d3e6-4767-8432-8322648e7b9d");
+
+const LLUUID SND_STONE_DIRT_01 ("97727335-392c-4338-ac4b-23a7883279c2");
+const LLUUID SND_STONE_DIRT_02 ("cbe75eb2-3375-41d8-9e3f-2ae46b4164ed");
+const LLUUID SND_STONE_DIRT_03 ("31e236ee-001b-4c8e-ad6c-c2074cb64357");
+const LLUUID SND_STONE_DIRT_04 ("c8091652-e04b-4a11-84ba-15dba06e7a1b");
+
+const LLUUID SND_STONE_STONE_02 ("ba4ef5ac-7435-4240-b826-c24ba8fa5a78");
+const LLUUID SND_STONE_STONE_04 ("ea296329-0f09-4993-af1b-e6784bab1dc9");
+
+
+
+// extra guids
+#if 0
+const LLUUID SND_ ("a839b8ac-b0af-4ba9-9fde-188754744e02");
+const LLUUID SND_ ("20165fa8-836f-4993-85dc-1529172dcd14");
+const LLUUID SND_ ("fba8e17b-a4b3-4693-9fce-c14800f8a349");
+const LLUUID SND_ ("2d48db8b-7260-4b02-ad2a-b2c6bee60e94");
+const LLUUID SND_ ("956d344b-1808-4d8b-88b1-cbc82b7a96a1");
+const LLUUID SND_ ("b8303cc6-f0b4-4c6f-a199-81f87aba342e");
+const LLUUID SND_ ("fbf7cd0c-bc8f-4cba-9c19-11f4dd03a06b");
+const LLUUID SND_ ("85047f7d-933a-4ce5-a7b5-34670243e1ab");
+const LLUUID SND_ ("0f81acf7-6a2e-4490-957f-c7b0eda00559");
+const LLUUID SND_ ("5631a6a1-79b4-4de8-bccf-1880b6882da1");
+const LLUUID SND_ ("43c87a6b-ffb2-437b-89a0-9deba890a4fc");
+const LLUUID SND_ ("58878d1d-3156-4d01-ac3c-0c4fb99f4d53");
+const LLUUID SND_ ("9a83f321-44bf-40f6-b006-46c085515345");
+const LLUUID SND_ ("ff144533-33ab-40f2-bac8-39c34699ecc4");
+const LLUUID SND_ ("09018e87-d52c-4cd5-9805-015f413319e7");
+const LLUUID SND_ ("17d4c057-7edd-401e-9589-d5b9fe981bf2");
+#endif
diff --git a/indra/llmessage/sound_ids.h b/indra/llmessage/sound_ids.h
index e7a919056e..f67fdd2aaf 100644
--- a/indra/llmessage/sound_ids.h
+++ b/indra/llmessage/sound_ids.h
@@ -33,285 +33,263 @@
#ifndef LL_SOUND_IDS_H
#define LL_SOUND_IDS_H
-#include "lluuid.h"
+// *NOTE: Do not put the actual IDs in this file - otherwise the symbols
+// and values will be copied into every .o/.obj file and increase link time.
-const LLUUID SND_NULL = LLUUID::null;
-const LLUUID SND_RIDE ("00000000-0000-0000-0000-000000000100");
-const LLUUID SND_SHOT ("00000000-0000-0000-0000-000000000101");
-const LLUUID SND_MORTAR ("00000000-0000-0000-0000-000000000102");
-const LLUUID SND_HIT ("00000000-0000-0000-0000-000000000103");
-const LLUUID SND_EXPLOSION ("00000000-0000-0000-0000-000000000104");
-const LLUUID SND_BOING ("00000000-0000-0000-0000-000000000105");
-const LLUUID SND_OBJECT_CREATE ("9f1bc096-3592-411e-9b0b-c447a9ff054c");
+class LLUUID;
-//
-// Different bird sounds for different states
-//
-
-const LLUUID SND_CHIRP ("00000000-0000-0000-0000-000000000106"); // Flying random chirp
-const LLUUID SND_CHIRP2 ("828a9526-175b-455d-8af0-0e3c0fb602b2"); // Spooked by user
-const LLUUID SND_CHIRP3 ("f99772d6-1ce6-4a39-a28b-06d26c94c9e3"); // Spooked by object
-const LLUUID SND_CHIRP4 ("54472ca4-7fc9-42cb-b7d5-99ad5b12bd50"); // Chasing other bird
-const LLUUID SND_CHIRP5 ("2929964f-fac5-40d7-9179-2864a8fa9ace"); // Hopping random chirp
-const LLUUID SND_CHIRPDEAD ("9abff1d3-863a-4e04-bd83-3834fd7fcff4"); // Hit by grenade - dead!
-
-
-const LLUUID SND_MUNCH ("00000000-0000-0000-0000-000000000107");
-const LLUUID SND_PUNCH ("00000000-0000-0000-0000-000000000108");
-const LLUUID SND_SPLASH ("00000000-0000-0000-0000-000000000109");
-const LLUUID SND_CLICK ("00000000-0000-0000-0000-000000000110");
-const LLUUID SND_WHISTLE ("ab858f9a-1f44-4d39-9b33-351543d03ccb");
-const LLUUID SND_TYPING ("5e191c7b-8996-9ced-a177-b2ac32bfea06");
+extern const LLUUID SND_NULL;
+extern const LLUUID SND_RIDE;
+extern const LLUUID SND_SHOT;
+extern const LLUUID SND_MORTAR;
+extern const LLUUID SND_HIT;
+extern const LLUUID SND_EXPLOSION;
+extern const LLUUID SND_BOING;
+extern const LLUUID SND_OBJECT_CREATE;
-const LLUUID SND_ARROW_SHOT ("00000000-0000-0000-0000-000000000111");
-const LLUUID SND_ARROW_THUD ("00000000-0000-0000-0000-000000000112");
-const LLUUID SND_LASER_SHOT ("00000000-0000-0000-0000-000000000113");
-const LLUUID SND_JET_THRUST ("67f5e4f0-0534-4d97-bc01-f297648d20e0");
+// Different bird sounds for different states
+extern const LLUUID SND_CHIRP; // Flying random chirp
+extern const LLUUID SND_CHIRP2; // Spooked by user
+extern const LLUUID SND_CHIRP3; // Spooked by object
+extern const LLUUID SND_CHIRP4; // Chasing other bird
+extern const LLUUID SND_CHIRP5; // Hopping random chirp
+extern const LLUUID SND_CHIRPDEAD; // Hit by grenade - dead!
-const LLUUID SND_SILENCE ("00000000-0000-0000-0000-000000000114");
-const LLUUID SND_BUBBLES ("00000000-0000-0000-0000-000000000115");
-const LLUUID SND_WELCOME ("00000000-0000-0000-0000-000000000116");
-const LLUUID SND_SQUISH ("00000000-0000-0000-0000-000000000117");
-const LLUUID SND_SUBPOD ("00000000-0000-0000-0000-000000000118");
-const LLUUID SND_FOOTSTEPS ("00000000-0000-0000-0000-000000000119");
-const LLUUID SND_STEP_LEFT ("00000000-0000-0000-0000-000000000124");
-const LLUUID SND_STEP_RIGHT ("00000000-0000-0000-0000-000000000125");
-const LLUUID SND_BALL_COLLISION ("00000000-0000-0000-0000-000000000120");
+extern const LLUUID SND_MUNCH;
+extern const LLUUID SND_PUNCH;
+extern const LLUUID SND_SPLASH;
+extern const LLUUID SND_CLICK;
+extern const LLUUID SND_WHISTLE;
+extern const LLUUID SND_TYPING;
-const LLUUID SND_OOOH_SCARE_ME ("00000000-0000-0000-0000-000000000121");
-const LLUUID SND_PAYBACK_TIME ("00000000-0000-0000-0000-000000000122");
-const LLUUID SND_READY_FOR_BATTLE ("00000000-0000-0000-0000-000000000123");
+extern const LLUUID SND_ARROW_SHOT;
+extern const LLUUID SND_ARROW_THUD;
+extern const LLUUID SND_LASER_SHOT;
+extern const LLUUID SND_JET_THRUST;
-const LLUUID SND_FLESH_FLESH ("dce5fdd4-afe4-4ea1-822f-dd52cac46b08");
-const LLUUID SND_FLESH_PLASTIC ("51011582-fbca-4580-ae9e-1a5593f094ec");
-const LLUUID SND_FLESH_RUBBER ("68d62208-e257-4d0c-bbe2-20c9ea9760bb");
-const LLUUID SND_GLASS_FLESH ("75872e8c-bc39-451b-9b0b-042d7ba36cba");
-const LLUUID SND_GLASS_GLASS ("6a45ba0b-5775-4ea8-8513-26008a17f873");
-const LLUUID SND_GLASS_PLASTIC ("992a6d1b-8c77-40e0-9495-4098ce539694");
-const LLUUID SND_GLASS_RUBBER ("2de4da5a-faf8-46be-bac6-c4d74f1e5767");
-const LLUUID SND_GLASS_WOOD ("6e3fb0f7-6d9c-42ca-b86b-1122ff562d7d");
-const LLUUID SND_METAL_FLESH ("14209133-4961-4acc-9649-53fc38ee1667");
-const LLUUID SND_METAL_GLASS ("bc4a4348-cfcc-4e5e-908e-8a52a8915fe6");
-const LLUUID SND_METAL_METAL ("9e5c1297-6eed-40c0-825a-d9bcd86e3193");
-const LLUUID SND_METAL_PLASTIC ("e534761c-1894-4b61-b20c-658a6fb68157");
-const LLUUID SND_METAL_RUBBER ("8761f73f-6cf9-4186-8aaa-0948ed002db1");
-const LLUUID SND_METAL_WOOD ("874a26fd-142f-4173-8c5b-890cd846c74d");
-const LLUUID SND_PLASTIC_PLASTIC ("0e24a717-b97e-4b77-9c94-b59a5a88b2da");
-const LLUUID SND_RUBBER_PLASTIC ("75cf3ade-9a5b-4c4d-bb35-f9799bda7fb2");
-const LLUUID SND_RUBBER_RUBBER ("153c8bf7-fb89-4d89-b263-47e58b1b4774");
-const LLUUID SND_STONE_FLESH ("55c3e0ce-275a-46fa-82ff-e0465f5e8703");
-const LLUUID SND_STONE_GLASS ("24babf58-7156-4841-9a3f-761bdbb8e237");
-const LLUUID SND_STONE_METAL ("aca261d8-e145-4610-9e20-9eff990f2c12");
-const LLUUID SND_STONE_PLASTIC ("0642fba6-5dcf-4d62-8e7b-94dbb529d117");
-const LLUUID SND_STONE_RUBBER ("25a863e8-dc42-4e8a-a357-e76422ace9b5");
-const LLUUID SND_STONE_STONE ("9538f37c-456e-4047-81be-6435045608d4");
-const LLUUID SND_STONE_WOOD ("8c0f84c3-9afd-4396-b5f5-9bca2c911c20");
-const LLUUID SND_WOOD_FLESH ("be582e5d-b123-41a2-a150-454c39e961c8");
-const LLUUID SND_WOOD_PLASTIC ("c70141d4-ba06-41ea-bcbc-35ea81cb8335");
-const LLUUID SND_WOOD_RUBBER ("7d1826f4-24c4-4aac-8c2e-eff45df37783");
-const LLUUID SND_WOOD_WOOD ("063c97d3-033a-4e9b-98d8-05c8074922cb");
+extern const LLUUID SND_SILENCE;
+extern const LLUUID SND_BUBBLES;
+extern const LLUUID SND_WELCOME;
+extern const LLUUID SND_SQUISH;
+extern const LLUUID SND_SUBPOD;
+extern const LLUUID SND_FOOTSTEPS;
+extern const LLUUID SND_STEP_LEFT;
+extern const LLUUID SND_STEP_RIGHT;
+extern const LLUUID SND_BALL_COLLISION;
-const LLUUID SND_SLIDE_FLESH_FLESH ("614eec22-f73d-4fdc-8691-a37dc5c58333");
-const LLUUID SND_SLIDE_FLESH_PLASTIC (SND_NULL);
-const LLUUID SND_SLIDE_FLESH_RUBBER (SND_NULL);
-const LLUUID SND_SLIDE_FLESH_FABRIC ("3678b9b9-2a0c-42b5-9c83-80b64ad6e898");
-const LLUUID SND_SLIDE_FLESH_GRAVEL ("02eaa42a-ce1a-4b6b-9c38-cd7ad0e8f4a6");
-const LLUUID SND_SLIDE_FLESH_GRAVEL_02 ("e7d3b501-79f8-4419-b842-ab6843e0f840");
-const LLUUID SND_SLIDE_FLESH_GRAVEL_03 ("4c3e8b52-6244-4e44-85a6-f4ab994418ed");
-const LLUUID SND_SLIDE_GLASS_GRAVEL ("ca491e77-5c47-4ea1-8021-b3ebbf636cab");
-const LLUUID SND_SLIDE_GLASS_GRAVEL_02 ("30794d49-91ce-48e3-a527-c06f67bd6cbe");
-const LLUUID SND_SLIDE_GLASS_GRAVEL_03 ("04c78e54-fd8d-46b6-8ab9-7678b5d6e5cb");
-const LLUUID SND_SLIDE_GLASS_FLESH (SND_NULL);
-const LLUUID SND_SLIDE_GLASS_GLASS (SND_NULL);
-const LLUUID SND_SLIDE_GLASS_PLASTIC (SND_NULL);
-const LLUUID SND_SLIDE_GLASS_RUBBER (SND_NULL);
-const LLUUID SND_SLIDE_GLASS_WOOD (SND_NULL);
-const LLUUID SND_SLIDE_METAL_FABRIC ("18b66e81-2958-42d4-a373-7a5054919adc");
-const LLUUID SND_SLIDE_METAL_FLESH ("dde65837-633c-4841-af2f-62ec471bf61e");
-const LLUUID SND_SLIDE_METAL_FLESH_02 ("f3cc2cbe-1a1a-4db7-a8d2-e9c8f8fa1f4f");
-const LLUUID SND_SLIDE_METAL_GLASS ("4188be39-7b1f-4495-bf2b-83ddd82eea05");
-const LLUUID SND_SLIDE_METAL_GLASS_02 ("336faa2b-9d96-4e14-93ad-b63b60074379");
-const LLUUID SND_SLIDE_METAL_GLASS_03 ("34d912aa-cf73-4462-b7d0-dcba2c66caba");
-const LLUUID SND_SLIDE_METAL_GLASS_04 ("97ffc063-e872-4469-8e95-1450ac6bad2b");
-const LLUUID SND_SLIDE_METAL_GRAVEL ("2bbff37d-009a-4cfc-9a0d-817652c08fbe");
-const LLUUID SND_SLIDE_METAL_GRAVEL_02 ("a906a228-783b-49e7-9f0a-e20a41d0e39f");
-const LLUUID SND_SLIDE_METAL_METAL ("09461277-c691-45de-b2c5-89dfd3712f79");
-const LLUUID SND_SLIDE_METAL_METAL_02 ("e00a5d97-8fdc-46c1-bd53-7e312727466c");
-const LLUUID SND_SLIDE_METAL_METAL_03 ("8ebfa780-c440-4b52-ab65-5edf3bc15bf1");
-const LLUUID SND_SLIDE_METAL_METAL_04 ("d6d03cb2-5b16-4e31-b7d4-2a81d2a0909b");
-const LLUUID SND_SLIDE_METAL_METAL_05 ("3a46f447-916e-47de-a1e5-95d1af46bd0f");
-const LLUUID SND_SLIDE_METAL_METAL_06 ("cd423231-e70d-4fd2-ad26-f1c6cf5f0610");
-const LLUUID SND_SLIDE_METAL_PLASTIC (SND_NULL);
-const LLUUID SND_SLIDE_METAL_RUBBER ("12d97bc0-3c15-4744-b6bd-77d1316eb4f0");
-const LLUUID SND_SLIDE_METAL_WOOD ("4afb6926-a73f-4cb7-85d5-0f9a40107434");
-const LLUUID SND_SLIDE_METAL_WOOD_02 ("349970bf-187d-4bcb-b2cf-e7bb6581590f");
-const LLUUID SND_SLIDE_METAL_WOOD_03 ("64bf6e87-73d4-4cb4-84f7-55cecfd97cd3");
-const LLUUID SND_SLIDE_METAL_WOOD_04 ("0dc670a9-dbe8-41bc-b8ee-4d96d99219d5");
-const LLUUID SND_SLIDE_METAL_WOOD_05 ("6e3cc57b-c9aa-4829-86a1-8e82aeaccb47");
-const LLUUID SND_SLIDE_METAL_WOOD_06 ("c1237f4c-8c88-4da1-bfbc-2af26a8d9e5a");
-const LLUUID SND_SLIDE_METAL_WOOD_07 ("0e1ec243-063b-4dcb-a903-52b8dffed3d2");
-const LLUUID SND_SLIDE_METAL_WOOD_08 ("66736d0f-533d-4007-a8ee-0f27c2034126");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL ("35092c21-5c48-4b4d-a818-3cf240af2348");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL_02("c37f5776-0020-47e8-89a0-c74cc6f5742d");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL_03("d2fc8db6-2e66-464a-8ccb-f99b61ee4987");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL_04("93cbdb10-6e82-4c0b-a547-7b3b79ac25f6");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL_05("2f6d0542-fcd1-4264-a17b-f57bf5ebf402");
-const LLUUID SND_SLIDE_PLASTIC_GRAVEL_06("5b8887d4-3be2-45a0-b25d-85af3b1e6392");
-const LLUUID SND_SLIDE_PLASTIC_PLASTIC (SND_NULL);
-const LLUUID SND_SLIDE_PLASTIC_PLASTIC_02 (SND_NULL);
-const LLUUID SND_SLIDE_PLASTIC_PLASTIC_03 (SND_NULL);
-const LLUUID SND_SLIDE_PLASTIC_FABRIC ("7294d9ad-3e41-4373-992c-a9f21d5d66ad");
-const LLUUID SND_SLIDE_PLASTIC_FABRIC_02("58608ce1-f524-472f-b447-bbe6ce4a46e0");
-const LLUUID SND_SLIDE_PLASTIC_FABRIC_03("06ae285e-0b34-4ea6-84ab-9c6c31b414fc");
-const LLUUID SND_SLIDE_PLASTIC_FABRIC_04("211613db-0461-49bd-9554-5c14ad8b31f6");
-const LLUUID SND_SLIDE_RUBBER_PLASTIC ("a98ffa5a-e48e-4f9d-9242-b9a3210ad84a");
-const LLUUID SND_SLIDE_RUBBER_PLASTIC_02 ("d4136c40-eeaa-49c6-a982-8e5a16f5d93a");
-const LLUUID SND_SLIDE_RUBBER_PLASTIC_03 ("29ec0fb2-0b23-47b2-835b-c83cc7cf9fb0");
-const LLUUID SND_SLIDE_RUBBER_RUBBER (SND_NULL);
-const LLUUID SND_SLIDE_STONE_FLESH (SND_NULL);
-const LLUUID SND_SLIDE_STONE_GLASS (SND_NULL);
-const LLUUID SND_SLIDE_STONE_METAL (SND_NULL);
-const LLUUID SND_SLIDE_STONE_PLASTIC ("afd0bcc3-d41a-4572-9e7f-08a29eeb0b8a");
-const LLUUID SND_SLIDE_STONE_PLASTIC_02 ("881b720a-96cf-4128-bb98-5d87e03e93c7");
-const LLUUID SND_SLIDE_STONE_PLASTIC_03 ("293dac42-658a-4c5a-a7a2-6d4c5e5658b0");
-const LLUUID SND_SLIDE_STONE_RUBBER ("0724b946-6a3f-4eeb-bb50-0a3b33120974");
-const LLUUID SND_SLIDE_STONE_RUBBER_02 ("ada93d00-76e2-4bf1-9ad9-493727630717");
-const LLUUID SND_SLIDE_STONE_STONE ("ade766dc-2e75-4699-9b41-7c8e53d2b3f2");
-const LLUUID SND_SLIDE_STONE_STONE_02 ("66698375-6594-47b0-8046-c3973de1291d");
-const LLUUID SND_SLIDE_STONE_WOOD ("174ef324-ed50-4f65-9479-b4da580aeb3c");
-const LLUUID SND_SLIDE_STONE_WOOD_02 ("33d517fd-ff11-4d01-a7b5-0e3abf818dcf");
-const LLUUID SND_SLIDE_STONE_WOOD_03 ("1bac4b63-e6fd-4659-9761-991284cf4582");
-const LLUUID SND_SLIDE_STONE_WOOD_04 ("a7d28564-6821-4c01-a378-cde98fba7ba9");
-const LLUUID SND_SLIDE_WOOD_FABRIC ("22c58e74-22cd-4960-9ab7-5bf08ab824e5");
-const LLUUID SND_SLIDE_WOOD_FABRIC_02 ("0b0ed22e-4a0f-4617-a4cf-20d0f2b78ccc");
-const LLUUID SND_SLIDE_WOOD_FABRIC_03 ("42b80abb-9823-4b74-a210-326ccf23636a");
-const LLUUID SND_SLIDE_WOOD_FABRIC_04 ("8538298a-1e6b-4b69-a9ee-5e01e4a02b35");
-const LLUUID SND_SLIDE_WOOD_FLESH ("84b026f3-a11c-4366-aa7c-07edcd89b2bb");
-const LLUUID SND_SLIDE_WOOD_FLESH_02 ("2644191f-4848-47ba-8ba7-bddc0bfcb3da");
-const LLUUID SND_SLIDE_WOOD_FLESH_03 ("edb978e4-9be9-456f-b2fc-e8502bfe25be");
-const LLUUID SND_SLIDE_WOOD_FLESH_04 ("bf2b972e-f42a-46d7-b53e-5fca38f5bc61");
-const LLUUID SND_SLIDE_WOOD_GRAVEL ("d063bb4d-0eff-4403-a6cc-c6c6c073e624");
-const LLUUID SND_SLIDE_WOOD_GRAVEL_02 ("511eb679-6d93-47fa-9141-c3ef9261c919");
-const LLUUID SND_SLIDE_WOOD_GRAVEL_03 ("4ed1fd43-4707-4e5c-b7b7-21ec4e72c1ac");
-const LLUUID SND_SLIDE_WOOD_GRAVEL_04 ("99ea89b3-aa76-4b87-99c8-670365c6d8c3");
-const LLUUID SND_SLIDE_WOOD_PLASTIC ("505ca3c4-94a0-4e28-8fc1-ea72a428396b");
-const LLUUID SND_SLIDE_WOOD_PLASTIC_02 ("fc404011-df71-4ed0-8f22-b72bdd18f63c");
-const LLUUID SND_SLIDE_WOOD_PLASTIC_03 ("67dbe225-26df-4efa-8c8b-f1ef669fec45");
-const LLUUID SND_SLIDE_WOOD_RUBBER (SND_NULL);
-const LLUUID SND_SLIDE_WOOD_WOOD ("3079d569-b3e8-4df4-9e09-f0d4611213ef");
-const LLUUID SND_SLIDE_WOOD_WOOD_02 ("276b093d-dbcb-4279-a89e-a54b0b416af6");
-const LLUUID SND_SLIDE_WOOD_WOOD_03 ("c3f3ca5e-2768-4081-847f-247139310fdb");
-const LLUUID SND_SLIDE_WOOD_WOOD_04 ("f08d44b8-ff87-4a98-9561-c72f1f2fec81");
-const LLUUID SND_SLIDE_WOOD_WOOD_05 ("2d8a58cf-f139-4238-8503-27d334d05c85");
-const LLUUID SND_SLIDE_WOOD_WOOD_06 ("e157ebbd-b12d-4225-aa7c-d47b026a7687");
-const LLUUID SND_SLIDE_WOOD_WOOD_07 ("35e17956-e7b4-478c-b274-e37db8a166b2");
-const LLUUID SND_SLIDE_WOOD_WOOD_08 ("e606fc65-0643-4964-9979-ff964fa6a62c");
+extern const LLUUID SND_OOOH_SCARE_ME;
+extern const LLUUID SND_PAYBACK_TIME;
+extern const LLUUID SND_READY_FOR_BATTLE;
+extern const LLUUID SND_FLESH_FLESH;
+extern const LLUUID SND_FLESH_PLASTIC;
+extern const LLUUID SND_FLESH_RUBBER;
+extern const LLUUID SND_GLASS_FLESH;
+extern const LLUUID SND_GLASS_GLASS;
+extern const LLUUID SND_GLASS_PLASTIC;
+extern const LLUUID SND_GLASS_RUBBER;
+extern const LLUUID SND_GLASS_WOOD;
+extern const LLUUID SND_METAL_FLESH;
+extern const LLUUID SND_METAL_GLASS;
+extern const LLUUID SND_METAL_METAL;
+extern const LLUUID SND_METAL_PLASTIC;
+extern const LLUUID SND_METAL_RUBBER;
+extern const LLUUID SND_METAL_WOOD;
+extern const LLUUID SND_PLASTIC_PLASTIC;
+extern const LLUUID SND_RUBBER_PLASTIC;
+extern const LLUUID SND_RUBBER_RUBBER;
+extern const LLUUID SND_STONE_FLESH;
+extern const LLUUID SND_STONE_GLASS;
+extern const LLUUID SND_STONE_METAL;
+extern const LLUUID SND_STONE_PLASTIC;
+extern const LLUUID SND_STONE_RUBBER;
+extern const LLUUID SND_STONE_STONE;
+extern const LLUUID SND_STONE_WOOD;
+extern const LLUUID SND_WOOD_FLESH;
+extern const LLUUID SND_WOOD_PLASTIC;
+extern const LLUUID SND_WOOD_RUBBER;
+extern const LLUUID SND_WOOD_WOOD;
-const LLUUID SND_ROLL_FLESH_FLESH (SND_NULL);
-const LLUUID SND_ROLL_FLESH_PLASTIC ("89a0be4c-848d-4a6e-8886-298f56c2cff4");
-const LLUUID SND_ROLL_FLESH_PLASTIC_02 ("beb06343-1aa1-4af2-b320-5d2ec31c53b1");
-const LLUUID SND_ROLL_FLESH_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_GLASS_GRAVEL ("ba795c74-7e09-4572-b495-e09886a46b86");
-const LLUUID SND_ROLL_GLASS_GRAVEL_02 ("4c93c3b7-14cb-4d9b-a7df-628ad935f1f2");
-const LLUUID SND_ROLL_GLASS_FLESH (SND_NULL);
-const LLUUID SND_ROLL_GLASS_GLASS (SND_NULL);
-const LLUUID SND_ROLL_GLASS_PLASTIC (SND_NULL);
-const LLUUID SND_ROLL_GLASS_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_GLASS_WOOD ("d40b1f48-a061-4f6e-b18f-4326a3dd5c29");
-const LLUUID SND_ROLL_GLASS_WOOD_02 ("78cd407a-bb36-4163-ba09-20f2e6d9d44b");
-const LLUUID SND_ROLL_GRAVEL_GRAVEL ("c7354cc3-6df5-4738-8dbb-b28a6ac46a05");
-const LLUUID SND_ROLL_GRAVEL_GRAVEL_02 ("01d194c4-72a6-47df-81a5-8db430faff87");
-const LLUUID SND_ROLL_METAL_FABRIC ("ce6e6564-20fd-48e4-81e2-cd3f81c00a3e");
-const LLUUID SND_ROLL_METAL_FABRIC_02 ("fc4d0065-32f6-4bb0-9f3f-f4737eb27163");
-const LLUUID SND_ROLL_METAL_FLESH (SND_NULL);
-const LLUUID SND_ROLL_METAL_GLASS ("63d530bb-a41f-402b-aa1f-be6b11959809");
-const LLUUID SND_ROLL_METAL_GLASS_02 ("f62642c2-6db5-4faa-8b77-939067d837c3");
-const LLUUID SND_ROLL_METAL_GLASS_03 ("db5b5a15-2817-4cd7-9f0b-9ad49b5e52c8");
-const LLUUID SND_ROLL_METAL_GRAVEL ("447164e3-9646-4c1a-a16d-606892891466");
-const LLUUID SND_ROLL_METAL_METAL ("c3c22cf3-5d1f-4cc3-b4b5-708b9f65979c");
-const LLUUID SND_ROLL_METAL_METAL_02 ("d8386277-a1ea-460e-b6fd-bb285c323bf1");
-const LLUUID SND_ROLL_METAL_METAL_03 ("69ee1f02-f9cd-4c8b-aedd-39a2d6705680");
-const LLUUID SND_ROLL_METAL_METAL_04 ("5cc6b5fd-26ce-47ad-b21d-3a7c190dd375");
-const LLUUID SND_ROLL_METAL_PLASTIC ("c6a9bbf6-df15-4713-9f84-7237fce4051e");
-const LLUUID SND_ROLL_METAL_PLASTIC_01 ("0fedb59b-2dbb-4cec-b6cc-8559ec027749");
-const LLUUID SND_ROLL_METAL_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_METAL_WOOD ("1d76af57-01b1-4c73-9a1d-69523bfa50ea");
-const LLUUID SND_ROLL_METAL_WOOD_02 ("78aa4e71-8e7c-4b90-a561-3ebdc639f99b");
-const LLUUID SND_ROLL_METAL_WOOD_03 ("777d95bf-962f-48fa-93bf-8c1806557d72");
-const LLUUID SND_ROLL_METAL_WOOD_04 ("1833da76-45e2-4a8b-97da-d17413e056c9");
-const LLUUID SND_ROLL_METAL_WOOD_05 ("b13e1232-3d8d-42e9-92ec-b30f9f823962");
-const LLUUID SND_ROLL_PLASTIC_FABRIC ("616a1f03-209f-4c55-b264-83a000b6ef0a");
-const LLUUID SND_ROLL_PLASTIC_PLASTIC ("873f3d82-00b2-4082-9c69-7aef3461dba1");
-const LLUUID SND_ROLL_PLASTIC_PLASTIC_02 ("cc39879f-ebc8-4405-a4fc-8342f5bed31e");
-const LLUUID SND_ROLL_RUBBER_PLASTIC (SND_NULL);
-const LLUUID SND_ROLL_RUBBER_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_STONE_FLESH (SND_NULL);
-const LLUUID SND_ROLL_STONE_GLASS (SND_NULL);
-const LLUUID SND_ROLL_STONE_METAL (SND_NULL);
-const LLUUID SND_ROLL_STONE_PLASTIC ("155f65a8-cae7-476e-a58b-fd362be7fd0e");
-const LLUUID SND_ROLL_STONE_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_STONE_STONE ("67d56e3f-6ed5-4658-9418-14f020c38b11");
-const LLUUID SND_ROLL_STONE_STONE_02 ("43d99d10-d75b-4246-accf-4ceb2c909aa7");
-const LLUUID SND_ROLL_STONE_STONE_03 ("f04e83ff-eed7-4e99-8f45-eb97e4e1d3b7");
-const LLUUID SND_ROLL_STONE_STONE_04 ("10fcc5ad-fa89-48d6-b774-986b580c1efc");
-const LLUUID SND_ROLL_STONE_STONE_05 ("3d86f5a3-1a91-49d9-b99f-8521a7422497");
-const LLUUID SND_ROLL_STONE_WOOD ("53e46fb7-6c21-4fe1-bffe-0567475d48fa");
-const LLUUID SND_ROLL_STONE_WOOD_02 ("5eba8c9a-a014-4299-87f1-315c45ec795b");
-const LLUUID SND_ROLL_STONE_WOOD_03 ("ea6c05fc-6e9c-4526-8a20-bc47810bb549");
-const LLUUID SND_ROLL_STONE_WOOD_04 ("64618cbf-3f42-4728-8094-e77807545efb");
-const LLUUID SND_ROLL_WOOD_FLESH ("26ee185d-6fc3-49f8-89ba-51cab04cfc42");
-const LLUUID SND_ROLL_WOOD_FLESH_02 ("334faa25-1e80-4c99-b29f-4c9c2a3d079d");
-const LLUUID SND_ROLL_WOOD_FLESH_03 ("2f876626-4dce-4f71-a91e-a25302edfab7");
-const LLUUID SND_ROLL_WOOD_FLESH_04 ("d6877aac-07fc-4931-bcde-585f223802ad");
-const LLUUID SND_ROLL_WOOD_GRAVEL ("2a23ebb5-a4a2-4f1f-8d75-7384239354aa");
-const LLUUID SND_ROLL_WOOD_GRAVEL_02 ("208bf26d-f097-450c-95c4-9d26317c613c");
-const LLUUID SND_ROLL_WOOD_GRAVEL_03 ("a26ecaf4-92c6-4e32-9864-56b7c70cab8e");
-const LLUUID SND_ROLL_WOOD_PLASTIC ("71c1000a-9f16-4cc3-8ede-ec4aa3bf5723");
-const LLUUID SND_ROLL_WOOD_PLASTIC_02 ("7bc20ba6-1e6d-4eea-83ad-c5cc3ae0e409");
-const LLUUID SND_ROLL_WOOD_RUBBER (SND_NULL);
-const LLUUID SND_ROLL_WOOD_WOOD ("2cc8eec4-bb4a-4ba8-b783-71526ec708e8");
-const LLUUID SND_ROLL_WOOD_WOOD_02 ("0a1f8070-a11a-4b4c-b260-5ffb6acb0a5d");
-const LLUUID SND_ROLL_WOOD_WOOD_03 ("160bef64-da9c-4be8-b07b-a5060b501700");
-const LLUUID SND_ROLL_WOOD_WOOD_04 ("1c62ea16-cc60-48ed-829a-68b8f4cf0c1c");
-const LLUUID SND_ROLL_WOOD_WOOD_05 ("be9cc8fe-b920-4bf5-8924-453088cbc03f");
-const LLUUID SND_ROLL_WOOD_WOOD_06 ("a76cfe60-56b0-43b1-8f31-93e56947d78b");
-const LLUUID SND_ROLL_WOOD_WOOD_07 ("0c6aa481-b5bc-4573-ae83-8e16ff27e750");
-const LLUUID SND_ROLL_WOOD_WOOD_08 ("214ab2c7-871a-451b-b0db-4c5677199011");
-const LLUUID SND_ROLL_WOOD_WOOD_09 ("0086e4db-3ac6-4545-b414-6f359bedd9a5");
-const LLUUID SND_SLIDE_STONE_STONE_01 ("2a7dcbd1-d3e6-4767-8432-8322648e7b9d");
+extern const LLUUID SND_SLIDE_FLESH_FLESH;
+extern const LLUUID SND_SLIDE_FLESH_PLASTIC;
+extern const LLUUID SND_SLIDE_FLESH_RUBBER;
+extern const LLUUID SND_SLIDE_FLESH_FABRIC;
+extern const LLUUID SND_SLIDE_FLESH_GRAVEL;
+extern const LLUUID SND_SLIDE_FLESH_GRAVEL_02;
+extern const LLUUID SND_SLIDE_FLESH_GRAVEL_03;
+extern const LLUUID SND_SLIDE_GLASS_GRAVEL;
+extern const LLUUID SND_SLIDE_GLASS_GRAVEL_02;
+extern const LLUUID SND_SLIDE_GLASS_GRAVEL_03;
+extern const LLUUID SND_SLIDE_GLASS_FLESH;
+extern const LLUUID SND_SLIDE_GLASS_GLASS;
+extern const LLUUID SND_SLIDE_GLASS_PLASTIC;
+extern const LLUUID SND_SLIDE_GLASS_RUBBER;
+extern const LLUUID SND_SLIDE_GLASS_WOOD;
+extern const LLUUID SND_SLIDE_METAL_FABRIC;
+extern const LLUUID SND_SLIDE_METAL_FLESH;
+extern const LLUUID SND_SLIDE_METAL_FLESH_02;
+extern const LLUUID SND_SLIDE_METAL_GLASS;
+extern const LLUUID SND_SLIDE_METAL_GLASS_02;
+extern const LLUUID SND_SLIDE_METAL_GLASS_03;
+extern const LLUUID SND_SLIDE_METAL_GLASS_04;
+extern const LLUUID SND_SLIDE_METAL_GRAVEL;
+extern const LLUUID SND_SLIDE_METAL_GRAVEL_02;
+extern const LLUUID SND_SLIDE_METAL_METAL;
+extern const LLUUID SND_SLIDE_METAL_METAL_02;
+extern const LLUUID SND_SLIDE_METAL_METAL_03;
+extern const LLUUID SND_SLIDE_METAL_METAL_04;
+extern const LLUUID SND_SLIDE_METAL_METAL_05;
+extern const LLUUID SND_SLIDE_METAL_METAL_06;
+extern const LLUUID SND_SLIDE_METAL_PLASTIC;
+extern const LLUUID SND_SLIDE_METAL_RUBBER;
+extern const LLUUID SND_SLIDE_METAL_WOOD;
+extern const LLUUID SND_SLIDE_METAL_WOOD_02;
+extern const LLUUID SND_SLIDE_METAL_WOOD_03;
+extern const LLUUID SND_SLIDE_METAL_WOOD_04;
+extern const LLUUID SND_SLIDE_METAL_WOOD_05;
+extern const LLUUID SND_SLIDE_METAL_WOOD_06;
+extern const LLUUID SND_SLIDE_METAL_WOOD_07;
+extern const LLUUID SND_SLIDE_METAL_WOOD_08;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL_02;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL_03;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL_04;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL_05;
+extern const LLUUID SND_SLIDE_PLASTIC_GRAVEL_06;
+extern const LLUUID SND_SLIDE_PLASTIC_PLASTIC;
+extern const LLUUID SND_SLIDE_PLASTIC_PLASTIC_02;
+extern const LLUUID SND_SLIDE_PLASTIC_PLASTIC_03;
+extern const LLUUID SND_SLIDE_PLASTIC_FABRIC;
+extern const LLUUID SND_SLIDE_PLASTIC_FABRIC_02;
+extern const LLUUID SND_SLIDE_PLASTIC_FABRIC_03;
+extern const LLUUID SND_SLIDE_PLASTIC_FABRIC_04;
+extern const LLUUID SND_SLIDE_RUBBER_PLASTIC;
+extern const LLUUID SND_SLIDE_RUBBER_PLASTIC_02;
+extern const LLUUID SND_SLIDE_RUBBER_PLASTIC_03;
+extern const LLUUID SND_SLIDE_RUBBER_RUBBER;
+extern const LLUUID SND_SLIDE_STONE_FLESH;
+extern const LLUUID SND_SLIDE_STONE_GLASS;
+extern const LLUUID SND_SLIDE_STONE_METAL;
+extern const LLUUID SND_SLIDE_STONE_PLASTIC;
+extern const LLUUID SND_SLIDE_STONE_PLASTIC_02;
+extern const LLUUID SND_SLIDE_STONE_PLASTIC_03;
+extern const LLUUID SND_SLIDE_STONE_RUBBER;
+extern const LLUUID SND_SLIDE_STONE_RUBBER_02;
+extern const LLUUID SND_SLIDE_STONE_STONE;
+extern const LLUUID SND_SLIDE_STONE_STONE_02;
+extern const LLUUID SND_SLIDE_STONE_WOOD;
+extern const LLUUID SND_SLIDE_STONE_WOOD_02;
+extern const LLUUID SND_SLIDE_STONE_WOOD_03;
+extern const LLUUID SND_SLIDE_STONE_WOOD_04;
+extern const LLUUID SND_SLIDE_WOOD_FABRIC;
+extern const LLUUID SND_SLIDE_WOOD_FABRIC_02;
+extern const LLUUID SND_SLIDE_WOOD_FABRIC_03;
+extern const LLUUID SND_SLIDE_WOOD_FABRIC_04;
+extern const LLUUID SND_SLIDE_WOOD_FLESH;
+extern const LLUUID SND_SLIDE_WOOD_FLESH_02;
+extern const LLUUID SND_SLIDE_WOOD_FLESH_03;
+extern const LLUUID SND_SLIDE_WOOD_FLESH_04;
+extern const LLUUID SND_SLIDE_WOOD_GRAVEL;
+extern const LLUUID SND_SLIDE_WOOD_GRAVEL_02;
+extern const LLUUID SND_SLIDE_WOOD_GRAVEL_03;
+extern const LLUUID SND_SLIDE_WOOD_GRAVEL_04;
+extern const LLUUID SND_SLIDE_WOOD_PLASTIC;
+extern const LLUUID SND_SLIDE_WOOD_PLASTIC_02;
+extern const LLUUID SND_SLIDE_WOOD_PLASTIC_03;
+extern const LLUUID SND_SLIDE_WOOD_RUBBER;
+extern const LLUUID SND_SLIDE_WOOD_WOOD;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_02;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_03;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_04;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_05;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_06;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_07;
+extern const LLUUID SND_SLIDE_WOOD_WOOD_08;
-const LLUUID SND_STONE_DIRT_01 ("97727335-392c-4338-ac4b-23a7883279c2");
-const LLUUID SND_STONE_DIRT_02 ("cbe75eb2-3375-41d8-9e3f-2ae46b4164ed");
-const LLUUID SND_STONE_DIRT_03 ("31e236ee-001b-4c8e-ad6c-c2074cb64357");
-const LLUUID SND_STONE_DIRT_04 ("c8091652-e04b-4a11-84ba-15dba06e7a1b");
-const LLUUID SND_STONE_STONE_02 ("ba4ef5ac-7435-4240-b826-c24ba8fa5a78");
-const LLUUID SND_STONE_STONE_04 ("ea296329-0f09-4993-af1b-e6784bab1dc9");
+extern const LLUUID SND_ROLL_FLESH_FLESH;
+extern const LLUUID SND_ROLL_FLESH_PLASTIC;
+extern const LLUUID SND_ROLL_FLESH_PLASTIC_02;
+extern const LLUUID SND_ROLL_FLESH_RUBBER;
+extern const LLUUID SND_ROLL_GLASS_GRAVEL;
+extern const LLUUID SND_ROLL_GLASS_GRAVEL_02;
+extern const LLUUID SND_ROLL_GLASS_FLESH;
+extern const LLUUID SND_ROLL_GLASS_GLASS;
+extern const LLUUID SND_ROLL_GLASS_PLASTIC;
+extern const LLUUID SND_ROLL_GLASS_RUBBER;
+extern const LLUUID SND_ROLL_GLASS_WOOD;
+extern const LLUUID SND_ROLL_GLASS_WOOD_02;
+extern const LLUUID SND_ROLL_GRAVEL_GRAVEL;
+extern const LLUUID SND_ROLL_GRAVEL_GRAVEL_02;
+extern const LLUUID SND_ROLL_METAL_FABRIC;
+extern const LLUUID SND_ROLL_METAL_FABRIC_02;
+extern const LLUUID SND_ROLL_METAL_FLESH;
+extern const LLUUID SND_ROLL_METAL_GLASS;
+extern const LLUUID SND_ROLL_METAL_GLASS_02;
+extern const LLUUID SND_ROLL_METAL_GLASS_03;
+extern const LLUUID SND_ROLL_METAL_GRAVEL;
+extern const LLUUID SND_ROLL_METAL_METAL;
+extern const LLUUID SND_ROLL_METAL_METAL_02;
+extern const LLUUID SND_ROLL_METAL_METAL_03;
+extern const LLUUID SND_ROLL_METAL_METAL_04;
+extern const LLUUID SND_ROLL_METAL_PLASTIC;
+extern const LLUUID SND_ROLL_METAL_PLASTIC_01;
+extern const LLUUID SND_ROLL_METAL_RUBBER;
+extern const LLUUID SND_ROLL_METAL_WOOD;
+extern const LLUUID SND_ROLL_METAL_WOOD_02;
+extern const LLUUID SND_ROLL_METAL_WOOD_03;
+extern const LLUUID SND_ROLL_METAL_WOOD_04;
+extern const LLUUID SND_ROLL_METAL_WOOD_05;
+extern const LLUUID SND_ROLL_PLASTIC_FABRIC;
+extern const LLUUID SND_ROLL_PLASTIC_PLASTIC;
+extern const LLUUID SND_ROLL_PLASTIC_PLASTIC_02;
+extern const LLUUID SND_ROLL_RUBBER_PLASTIC;
+extern const LLUUID SND_ROLL_RUBBER_RUBBER;
+extern const LLUUID SND_ROLL_STONE_FLESH;
+extern const LLUUID SND_ROLL_STONE_GLASS;
+extern const LLUUID SND_ROLL_STONE_METAL;
+extern const LLUUID SND_ROLL_STONE_PLASTIC;
+extern const LLUUID SND_ROLL_STONE_RUBBER;
+extern const LLUUID SND_ROLL_STONE_STONE;
+extern const LLUUID SND_ROLL_STONE_STONE_02;
+extern const LLUUID SND_ROLL_STONE_STONE_03;
+extern const LLUUID SND_ROLL_STONE_STONE_04;
+extern const LLUUID SND_ROLL_STONE_STONE_05;
+extern const LLUUID SND_ROLL_STONE_WOOD;
+extern const LLUUID SND_ROLL_STONE_WOOD_02;
+extern const LLUUID SND_ROLL_STONE_WOOD_03;
+extern const LLUUID SND_ROLL_STONE_WOOD_04;
+extern const LLUUID SND_ROLL_WOOD_FLESH;
+extern const LLUUID SND_ROLL_WOOD_FLESH_02;
+extern const LLUUID SND_ROLL_WOOD_FLESH_03;
+extern const LLUUID SND_ROLL_WOOD_FLESH_04;
+extern const LLUUID SND_ROLL_WOOD_GRAVEL;
+extern const LLUUID SND_ROLL_WOOD_GRAVEL_02;
+extern const LLUUID SND_ROLL_WOOD_GRAVEL_03;
+extern const LLUUID SND_ROLL_WOOD_PLASTIC;
+extern const LLUUID SND_ROLL_WOOD_PLASTIC_02;
+extern const LLUUID SND_ROLL_WOOD_RUBBER;
+extern const LLUUID SND_ROLL_WOOD_WOOD;
+extern const LLUUID SND_ROLL_WOOD_WOOD_02;
+extern const LLUUID SND_ROLL_WOOD_WOOD_03;
+extern const LLUUID SND_ROLL_WOOD_WOOD_04;
+extern const LLUUID SND_ROLL_WOOD_WOOD_05;
+extern const LLUUID SND_ROLL_WOOD_WOOD_06;
+extern const LLUUID SND_ROLL_WOOD_WOOD_07;
+extern const LLUUID SND_ROLL_WOOD_WOOD_08;
+extern const LLUUID SND_ROLL_WOOD_WOOD_09;
+extern const LLUUID SND_SLIDE_STONE_STONE_01;
+extern const LLUUID SND_STONE_DIRT_01;
+extern const LLUUID SND_STONE_DIRT_02;
+extern const LLUUID SND_STONE_DIRT_03;
+extern const LLUUID SND_STONE_DIRT_04;
-// extra guids
-#if 0
-const LLUUID SND_ ("a839b8ac-b0af-4ba9-9fde-188754744e02");
-const LLUUID SND_ ("20165fa8-836f-4993-85dc-1529172dcd14");
-const LLUUID SND_ ("fba8e17b-a4b3-4693-9fce-c14800f8a349");
-const LLUUID SND_ ("2d48db8b-7260-4b02-ad2a-b2c6bee60e94");
-const LLUUID SND_ ("956d344b-1808-4d8b-88b1-cbc82b7a96a1");
-const LLUUID SND_ ("b8303cc6-f0b4-4c6f-a199-81f87aba342e");
-const LLUUID SND_ ("fbf7cd0c-bc8f-4cba-9c19-11f4dd03a06b");
-const LLUUID SND_ ("85047f7d-933a-4ce5-a7b5-34670243e1ab");
-const LLUUID SND_ ("0f81acf7-6a2e-4490-957f-c7b0eda00559");
-const LLUUID SND_ ("5631a6a1-79b4-4de8-bccf-1880b6882da1");
-const LLUUID SND_ ("43c87a6b-ffb2-437b-89a0-9deba890a4fc");
-const LLUUID SND_ ("58878d1d-3156-4d01-ac3c-0c4fb99f4d53");
-const LLUUID SND_ ("9a83f321-44bf-40f6-b006-46c085515345");
-const LLUUID SND_ ("ff144533-33ab-40f2-bac8-39c34699ecc4");
-const LLUUID SND_ ("09018e87-d52c-4cd5-9805-015f413319e7");
-const LLUUID SND_ ("17d4c057-7edd-401e-9589-d5b9fe981bf2");
-#endif
+extern const LLUUID SND_STONE_STONE_02;
+extern const LLUUID SND_STONE_STONE_04;
#endif
diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp
index ac4886ccf4..6ee74c8e7a 100644
--- a/indra/llmessage/tests/llareslistener_test.cpp
+++ b/indra/llmessage/tests/llareslistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-02-26
* @brief Tests of llareslistener.h.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/llmessage/tests/llcurl_stub.cpp b/indra/llmessage/tests/llcurl_stub.cpp
index e6a5ad9946..ffbe7bd202 100644
--- a/indra/llmessage/tests/llcurl_stub.cpp
+++ b/indra/llmessage/tests/llcurl_stub.cpp
@@ -20,6 +20,7 @@
*/
#include "linden_common.h"
+#include "llcurl.h"
LLCurl::Responder::Responder()
: mReferenceCount(0)
diff --git a/indra/llmessage/tests/llhttpclientadapter_test.cpp b/indra/llmessage/tests/llhttpclientadapter_test.cpp
index 250fa100b6..7065c9d7e4 100644
--- a/indra/llmessage/tests/llhttpclientadapter_test.cpp
+++ b/indra/llmessage/tests/llhttpclientadapter_test.cpp
@@ -50,7 +50,7 @@ std::vector<std::string> put_urls;
std::vector<LLSD> put_body;
std::vector<boost::intrusive_ptr<LLCurl::Responder> > put_responders;
-void LLHTTPClient::put(std::string const &url, LLSD const &body, boost::intrusive_ptr<LLCurl::Responder> responder,float)
+void LLHTTPClient::put(const std::string& url, const LLSD& body, boost::intrusive_ptr<LLCurl::Responder> responder, const LLSD& headers, const F32 timeout)
{
put_urls.push_back(url);
put_responders.push_back(responder);
diff --git a/indra/llmessage/tests/llsdmessage_test.cpp b/indra/llmessage/tests/llsdmessage_test.cpp
index 9b018d685b..de2c7e00c8 100644
--- a/indra/llmessage/tests/llsdmessage_test.cpp
+++ b/indra/llmessage/tests/llsdmessage_test.cpp
@@ -21,6 +21,7 @@
#include <iostream>
// std headers
#include <stdexcept>
+#include <typeinfo>
// external library headers
// other Linden headers
#include "../test/lltut.h"
@@ -63,6 +64,32 @@ namespace tut
{
threw = true;
}
+ catch (const std::runtime_error& ex)
+ {
+ // This clause is because on Linux, on the viewer side, for this
+ // one test program (though not others!), the
+ // LLEventPump::DupPumpName exception isn't caught by the clause
+ // above. Warn the user...
+ std::cerr << "Failed to catch " << typeid(ex).name() << std::endl;
+ // But if the expected exception was thrown, allow the test to
+ // succeed anyway. Not sure how else to handle this odd case.
+ if (std::string(typeid(ex).name()) == typeid(LLEventPump::DupPumpName).name())
+ {
+ threw = true;
+ }
+ else
+ {
+ // We don't even recognize this exception. Let it propagate
+ // out to TUT to fail the test.
+ throw;
+ }
+ }
+ catch (...)
+ {
+ std::cerr << "Utterly failed to catch expected exception!" << std::endl;
+ // This case is full of fail. We HAVE to address it.
+ throw;
+ }
ensure("second LLSDMessage should throw", threw);
}
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 457c074ef1..6a2449cf4b 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.cpp
* @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -35,6 +37,8 @@
#include "llpluginclassmedia.h"
#include "llpluginmessageclasses.h"
+#include "llqtwebkit.h"
+
static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
static int nextPowerOf2( int value )
@@ -61,14 +65,15 @@ LLPluginClassMedia::~LLPluginClassMedia()
reset();
}
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
{
LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
+ LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL;
mPlugin = new LLPluginProcessParent(this);
mPlugin->setSleepTime(mSleepTime);
- mPlugin->init(launcher_filename, plugin_filename);
+ mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path);
return true;
}
@@ -99,6 +104,8 @@ void LLPluginClassMedia::reset()
mSetMediaHeight = -1;
mRequestedMediaWidth = 0;
mRequestedMediaHeight = 0;
+ mRequestedTextureWidth = 0;
+ mRequestedTextureHeight = 0;
mFullMediaWidth = 0;
mFullMediaHeight = 0;
mTextureWidth = 0;
@@ -121,7 +128,8 @@ void LLPluginClassMedia::reset()
mCanPaste = false;
mMediaName.clear();
mMediaDescription.clear();
-
+ mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f);
+
// media_browser class
mNavigateURI.clear();
mNavigateResultCode = -1;
@@ -130,6 +138,9 @@ void LLPluginClassMedia::reset()
mHistoryForwardAvailable = false;
mStatusText.clear();
mProgressPercent = 0;
+ mClickURL.clear();
+ mClickTarget.clear();
+ mClickTargetType = TARGET_NONE;
// media_time class
mCurrentTime = 0.0f;
@@ -231,6 +242,10 @@ void LLPluginClassMedia::idle(void)
message.setValueS32("height", mRequestedMediaHeight);
message.setValueS32("texture_width", mRequestedTextureWidth);
message.setValueS32("texture_height", mRequestedTextureHeight);
+ message.setValueReal("background_r", mBackgroundColor.mV[VX]);
+ message.setValueReal("background_g", mBackgroundColor.mV[VY]);
+ message.setValueReal("background_b", mBackgroundColor.mV[VZ]);
+ message.setValueReal("background_a", mBackgroundColor.mV[VW]);
mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue.
LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;
@@ -456,7 +471,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int
sendMessage(message);
}
-bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers)
+bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
{
bool result = true;
@@ -513,6 +528,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
message.setValueS32("key", key_code);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
}
@@ -531,12 +547,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
sendMessage(message);
}
-bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers)
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
message.setValue("text", text);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
@@ -593,10 +610,10 @@ void LLPluginClassMedia::setPriority(EPriority priority)
mSleepTime = 1.0f;
break;
case PRIORITY_LOW:
- mSleepTime = 1.0f / 50.0f;
+ mSleepTime = 1.0f / 25.0f;
break;
case PRIORITY_NORMAL:
- mSleepTime = 1.0f / 100.0f;
+ mSleepTime = 1.0f / 50.0f;
break;
case PRIORITY_HIGH:
mSleepTime = 1.0f / 100.0f;
@@ -661,6 +678,26 @@ void LLPluginClassMedia::paste()
sendMessage(message);
}
+LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type)
+{
+ // convert a LinkTargetType value from llqtwebkit to an ETargetType
+ // so that we don't expose the llqtwebkit header in viewer code
+ switch (target_type)
+ {
+ case LLQtWebKit::LTT_TARGET_NONE:
+ return LLPluginClassMedia::TARGET_NONE;
+
+ case LLQtWebKit::LTT_TARGET_BLANK:
+ return LLPluginClassMedia::TARGET_BLANK;
+
+ case LLQtWebKit::LTT_TARGET_EXTERNAL:
+ return LLPluginClassMedia::TARGET_EXTERNAL;
+
+ default:
+ return LLPluginClassMedia::TARGET_OTHER;
+ }
+}
+
/* virtual */
void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
{
@@ -913,12 +950,15 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
{
mClickURL = message.getValue("uri");
mClickTarget = message.getValue("target");
+ U32 target_type = message.getValueU32("target_type");
+ mClickTargetType = ::getTargetTypeFromLLQtWebkit(target_type);
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);
}
else if(message_name == "click_nofollow")
{
mClickURL = message.getValue("uri");
mClickTarget.clear();
+ mClickTargetType = TARGET_NONE;
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
}
else
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 90ecd1e073..58e91fa0b4 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIA_H
@@ -37,7 +39,7 @@
#include "llrect.h"
#include "llpluginclassmediaowner.h"
#include <queue>
-
+#include "v4color.h"
class LLPluginClassMedia : public LLPluginProcessParentOwner
{
@@ -47,7 +49,7 @@ public:
virtual ~LLPluginClassMedia();
// local initialization, called by the media manager when creating a source
- virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename);
+ virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
// undoes everything init() didm called by the media manager when destroying a source
virtual void reset();
@@ -84,6 +86,8 @@ public:
void setSize(int width, int height);
void setAutoScale(bool auto_scale);
+ void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
+
// Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
// This will initially be false, and will also be false for some time after setSize while the resize is processed.
// Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
@@ -110,12 +114,12 @@ public:
KEY_EVENT_REPEAT
}EKeyEventType;
- bool keyEvent(EKeyEventType type, int key_code, MASK modifiers);
+ bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
void scrollEvent(int x, int y, MASK modifiers);
// Text may be unicode (utf8 encoded)
- bool textInput(const std::string &text, MASK modifiers);
+ bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
void loadURI(const std::string &uri);
@@ -210,6 +214,17 @@ public:
// This is valid after MEDIA_EVENT_CLICK_LINK_HREF
std::string getClickTarget() const { return mClickTarget; };
+ typedef enum
+ {
+ TARGET_NONE, // empty href target string
+ TARGET_BLANK, // target to open link in user's preferred browser
+ TARGET_EXTERNAL, // target to open link in external browser
+ TARGET_OTHER // nonempty and unsupported target type
+ }ETargetType;
+
+ // This is valid after MEDIA_EVENT_CLICK_LINK_HREF
+ ETargetType getClickTargetType() const { return mClickTargetType; };
+
std::string getMediaName() const { return mMediaName; };
std::string getMediaDescription() const { return mMediaDescription; };
@@ -326,6 +341,8 @@ protected:
std::string mMediaName;
std::string mMediaDescription;
+ LLColor4 mBackgroundColor;
+
/////////////////////////////////////////
// media_browser class
std::string mNavigateURI;
@@ -338,6 +355,7 @@ protected:
std::string mLocation;
std::string mClickURL;
std::string mClickTarget;
+ ETargetType mClickTargetType;
/////////////////////////////////////////
// media_time class
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index c798af29ca..6d369cd51a 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -2,6 +2,7 @@
* @file llpluginclassmediaowner.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index 58fb792d0d..44e3b4950f 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -2,6 +2,7 @@
* @file llplugininstance.cpp
* @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -35,13 +37,21 @@
#include "llapr.h"
-//virtual
+/** Virtual destructor. */
LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener()
{
}
+/**
+ * TODO:DOC describe how it's used
+ */
const char *LLPluginInstance::PLUGIN_INIT_FUNCTION_NAME = "LLPluginInitEntryPoint";
+/**
+ * Constructor.
+ *
+ * @param[in] owner Plugin instance. TODO:DOC is this a good description of what "owner" is?
+ */
LLPluginInstance::LLPluginInstance(LLPluginInstanceMessageListener *owner) :
mDSOHandle(NULL),
mPluginUserData(NULL),
@@ -50,6 +60,9 @@ LLPluginInstance::LLPluginInstance(LLPluginInstanceMessageListener *owner) :
mOwner = owner;
}
+/**
+ * Destructor.
+ */
LLPluginInstance::~LLPluginInstance()
{
if(mDSOHandle != NULL)
@@ -59,6 +72,12 @@ LLPluginInstance::~LLPluginInstance()
}
}
+/**
+ * Dynamically loads the plugin and runs the plugin's init function.
+ *
+ * @param[in] plugin_file Name of plugin dll/dylib/so. TODO:DOC is this correct? see .h
+ * @return 0 if successful, APR error code or error code from the plugin's init function on failure.
+ */
int LLPluginInstance::load(std::string &plugin_file)
{
pluginInitFunction init_function = NULL;
@@ -100,6 +119,11 @@ int LLPluginInstance::load(std::string &plugin_file)
return (int)result;
}
+/**
+ * Sends a message to the plugin.
+ *
+ * @param[in] message Message
+ */
void LLPluginInstance::sendMessage(const std::string &message)
{
if(mPluginSendMessageFunction)
@@ -113,6 +137,10 @@ void LLPluginInstance::sendMessage(const std::string &message)
}
}
+/**
+ * Idle. TODO:DOC what's the purpose of this?
+ *
+ */
void LLPluginInstance::idle(void)
{
}
@@ -126,6 +154,11 @@ void LLPluginInstance::staticReceiveMessage(const char *message_string, void **u
self->receiveMessage(message_string);
}
+/**
+ * Plugin receives message from plugin loader shell.
+ *
+ * @param[in] message_string Message
+ */
void LLPluginInstance::receiveMessage(const char *message_string)
{
if(mOwner)
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index ba569df10c..c11d5ab5d4 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -1,7 +1,7 @@
/**
* @file llplugininstance.h
- * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +27,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGININSTANCE_H
@@ -37,13 +38,20 @@
#include "apr_dso.h"
+/**
+ * @brief LLPluginInstanceMessageListener receives messages sent from the plugin loader shell to the plugin.
+ */
class LLPluginInstanceMessageListener
{
public:
virtual ~LLPluginInstanceMessageListener();
+ /** Plugin receives message from plugin loader shell. */
virtual void receivePluginMessage(const std::string &message) = 0;
};
+/**
+ * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
+ */
class LLPluginInstance
{
LOG_CLASS(LLPluginInstance);
@@ -58,19 +66,27 @@ public:
// Sends a message to the plugin.
void sendMessage(const std::string &message);
+ // TODO:DOC is this comment obsolete? can't find "send_count" anywhere in indra tree.
// send_count is the maximum number of message to process from the send queue. If negative, it will drain the queue completely.
// The receive queue is always drained completely.
// Returns the total number of messages processed from both queues.
void idle(void);
- // this is the signature of the "send a message" function.
- // message_string is a null-terminated C string
- // user_data is the opaque reference that the callee supplied during setup.
+ /** The signature of the function for sending a message from plugin to plugin loader shell.
+ *
+ * @param[in] message_string Null-terminated C string
+ * @param[in] user_data The opaque reference that the callee supplied during setup.
+ */
typedef void (*sendMessageFunction) (const char *message_string, void **user_data);
- // signature of the plugin init function
+ /** The signature of the plugin init function. TODO:DOC check direction (pluging loader shell to plugin?)
+ *
+ * @param[in] host_user_data Data from plugin loader shell.
+ * @param[in] plugin_send_function Function for sending from the plugin loader shell to plugin.
+ */
typedef int (*pluginInitFunction) (sendMessageFunction host_send_func, void *host_user_data, sendMessageFunction *plugin_send_func, void **plugin_user_data);
+ /** Name of plugin init function */
static const char *PLUGIN_INIT_FUNCTION_NAME;
private:
diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp
index e7412a1d8f..f76d848a70 100644
--- a/indra/llplugin/llpluginmessage.cpp
+++ b/indra/llplugin/llpluginmessage.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessage.cpp
* @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -35,26 +37,57 @@
#include "llsdserialize.h"
#include "u64.h"
+/**
+ * Constructor.
+ */
LLPluginMessage::LLPluginMessage()
{
}
+/**
+ * Constructor.
+ *
+ * @param[in] p Existing message
+ */
+LLPluginMessage::LLPluginMessage(const LLPluginMessage &p)
+{
+ mMessage = p.mMessage;
+}
+
+/**
+ * Constructor.
+ *
+ * @param[in] message_class Message class
+ * @param[in] message_name Message name
+ */
LLPluginMessage::LLPluginMessage(const std::string &message_class, const std::string &message_name)
{
setMessage(message_class, message_name);
}
+/**
+ * Destructor.
+ */
LLPluginMessage::~LLPluginMessage()
{
}
+/**
+ * Reset all internal state.
+ */
void LLPluginMessage::clear()
{
mMessage = LLSD::emptyMap();
mMessage["params"] = LLSD::emptyMap();
}
+/**
+ * Sets the message class and name. Also has the side-effect of clearing any key-value pairs in the message.
+ *
+ * @param[in] message_class Message class
+ * @param[in] message_name Message name
+ */
void LLPluginMessage::setMessage(const std::string &message_class, const std::string &message_name)
{
clear();
@@ -62,21 +95,45 @@ void LLPluginMessage::setMessage(const std::string &message_class, const std::st
mMessage["name"] = message_name;
}
+/**
+ * Sets a key/value pair in the message, where the value is a string.
+ *
+ * @param[in] key Key
+ * @param[in] value String value
+ */
void LLPluginMessage::setValue(const std::string &key, const std::string &value)
{
mMessage["params"][key] = value;
}
+/**
+ * Sets a key/value pair in the message, where the value is LLSD.
+ *
+ * @param[in] key Key
+ * @param[in] value LLSD value
+ */
void LLPluginMessage::setValueLLSD(const std::string &key, const LLSD &value)
{
mMessage["params"][key] = value;
}
+/**
+ * Sets a key/value pair in the message, where the value is signed 32-bit.
+ *
+ * @param[in] key Key
+ * @param[in] value 32-bit signed value
+ */
void LLPluginMessage::setValueS32(const std::string &key, S32 value)
{
mMessage["params"][key] = value;
}
+/**
+ * Sets a key/value pair in the message, where the value is unsigned 32-bit. The value is stored as a string beginning with "0x".
+ *
+ * @param[in] key Key
+ * @param[in] value 32-bit unsigned value
+ */
void LLPluginMessage::setValueU32(const std::string &key, U32 value)
{
std::stringstream temp;
@@ -84,16 +141,34 @@ void LLPluginMessage::setValueU32(const std::string &key, U32 value)
setValue(key, temp.str());
}
+/**
+ * Sets a key/value pair in the message, where the value is a bool.
+ *
+ * @param[in] key Key
+ * @param[in] value Boolean value
+ */
void LLPluginMessage::setValueBoolean(const std::string &key, bool value)
{
mMessage["params"][key] = value;
}
+/**
+ * Sets a key/value pair in the message, where the value is a double.
+ *
+ * @param[in] key Key
+ * @param[in] value Boolean value
+ */
void LLPluginMessage::setValueReal(const std::string &key, F64 value)
{
mMessage["params"][key] = value;
}
+/**
+ * Sets a key/value pair in the message, where the value is a pointer. The pointer is stored as a string.
+ *
+ * @param[in] key Key
+ * @param[in] value Pointer value
+ */
void LLPluginMessage::setValuePointer(const std::string &key, void* value)
{
std::stringstream temp;
@@ -102,16 +177,33 @@ void LLPluginMessage::setValuePointer(const std::string &key, void* value)
setValue(key, temp.str());
}
+/**
+ * Gets the message class.
+ *
+ * @return Message class
+ */
std::string LLPluginMessage::getClass(void) const
{
return mMessage["class"];
}
+/**
+ * Gets the message name.
+ *
+ * @return Message name
+ */
std::string LLPluginMessage::getName(void) const
{
return mMessage["name"];
}
+/**
+ * Returns true if the specified key exists in this message (useful for optional parameters).
+ *
+ * @param[in] key Key
+ *
+ * @return True if key exists, false otherwise.
+ */
bool LLPluginMessage::hasValue(const std::string &key) const
{
bool result = false;
@@ -124,6 +216,13 @@ bool LLPluginMessage::hasValue(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as a string. If the key does not exist, an empty string will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return String value of key if key exists, empty string if key does not exist.
+ */
std::string LLPluginMessage::getValue(const std::string &key) const
{
std::string result;
@@ -136,6 +235,13 @@ std::string LLPluginMessage::getValue(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as LLSD. If the key does not exist, a null LLSD will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return LLSD value of key if key exists, null LLSD if key does not exist.
+ */
LLSD LLPluginMessage::getValueLLSD(const std::string &key) const
{
LLSD result;
@@ -148,6 +254,13 @@ LLSD LLPluginMessage::getValueLLSD(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as signed 32-bit int. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Signed 32-bit int value of key if key exists, 0 if key does not exist.
+ */
S32 LLPluginMessage::getValueS32(const std::string &key) const
{
S32 result = 0;
@@ -160,6 +273,13 @@ S32 LLPluginMessage::getValueS32(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as unsigned 32-bit int. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Unsigned 32-bit int value of key if key exists, 0 if key does not exist.
+ */
U32 LLPluginMessage::getValueU32(const std::string &key) const
{
U32 result = 0;
@@ -174,6 +294,13 @@ U32 LLPluginMessage::getValueU32(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as a bool. If the key does not exist, false will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Boolean value of key if it exists, false otherwise.
+ */
bool LLPluginMessage::getValueBoolean(const std::string &key) const
{
bool result = false;
@@ -186,6 +313,13 @@ bool LLPluginMessage::getValueBoolean(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as a double. If the key does not exist, 0 will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Value as a double if key exists, 0 otherwise.
+ */
F64 LLPluginMessage::getValueReal(const std::string &key) const
{
F64 result = 0.0f;
@@ -198,6 +332,13 @@ F64 LLPluginMessage::getValueReal(const std::string &key) const
return result;
}
+/**
+ * Gets the value of a key as a pointer. If the key does not exist, NULL will be returned.
+ *
+ * @param[in] key Key
+ *
+ * @return Pointer value if key exists, NULL otherwise.
+ */
void* LLPluginMessage::getValuePointer(const std::string &key) const
{
void* result = NULL;
@@ -212,6 +353,11 @@ void* LLPluginMessage::getValuePointer(const std::string &key) const
return result;
}
+/**
+ * Flatten the message into a string.
+ *
+ * @return Message as a string.
+ */
std::string LLPluginMessage::generate(void) const
{
std::ostringstream result;
@@ -223,7 +369,11 @@ std::string LLPluginMessage::generate(void) const
return result.str();
}
-
+/**
+ * Parse an incoming message into component parts. Clears all existing state before starting the parse.
+ *
+ * @return Returns -1 on failure, otherwise returns the number of key/value pairs in the incoming message.
+ */
int LLPluginMessage::parse(const std::string &message)
{
// clear any previous state
@@ -237,27 +387,48 @@ int LLPluginMessage::parse(const std::string &message)
}
+/**
+ * Destructor
+ */
LLPluginMessageListener::~LLPluginMessageListener()
{
// TODO: should listeners have a way to ensure they're removed from dispatcher lists when deleted?
}
+/**
+ * Destructor
+ */
LLPluginMessageDispatcher::~LLPluginMessageDispatcher()
{
}
+/**
+ * Add a message listener. TODO:DOC need more info on what uses this. when are multiple listeners needed?
+ *
+ * @param[in] listener Message listener
+ */
void LLPluginMessageDispatcher::addPluginMessageListener(LLPluginMessageListener *listener)
{
mListeners.insert(listener);
}
+/**
+ * Remove a message listener.
+ *
+ * @param[in] listener Message listener
+ */
void LLPluginMessageDispatcher::removePluginMessageListener(LLPluginMessageListener *listener)
{
mListeners.erase(listener);
}
+/**
+ * Distribute a message to all message listeners.
+ *
+ * @param[in] message Message
+ */
void LLPluginMessageDispatcher::dispatchPluginMessage(const LLPluginMessage &message)
{
for (listener_set_t::iterator it = mListeners.begin();
diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h
index f1a0e7c624..cbd31e0964 100644
--- a/indra/llplugin/llpluginmessage.h
+++ b/indra/llplugin/llpluginmessage.h
@@ -1,7 +1,7 @@
/**
* @file llpluginmessage.h
- * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +27,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGE_H
@@ -34,12 +35,15 @@
#include "llsd.h"
-
+/**
+ * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
+ */
class LLPluginMessage
{
LOG_CLASS(LLPluginMessage);
public:
LLPluginMessage();
+ LLPluginMessage(const LLPluginMessage &p);
LLPluginMessage(const std::string &message_class, const std::string &message_name);
~LLPluginMessage();
@@ -101,14 +105,23 @@ private:
};
+/**
+ * @brief Listener for plugin messages.
+ */
class LLPluginMessageListener
{
public:
virtual ~LLPluginMessageListener();
+ /** Plugin receives message from plugin loader shell. */
virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
};
+/**
+ * @brief Dispatcher for plugin messages.
+ *
+ * Manages the set of plugin message listeners and distributes messages to plugin message listeners.
+ */
class LLPluginMessageDispatcher
{
public:
@@ -119,7 +132,9 @@ public:
protected:
void dispatchPluginMessage(const LLPluginMessage &message);
+ /** A set of message listeners. */
typedef std::set<LLPluginMessageListener*> listener_set_t;
+ /** The set of message listeners. */
listener_set_t mListeners;
};
diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h
index 927fcf2eb2..01fddb92c5 100644
--- a/indra/llplugin/llpluginmessageclasses.h
+++ b/indra/llplugin/llpluginmessageclasses.h
@@ -2,6 +2,7 @@
* @file llpluginmessageclasses.h
* @brief This file defines the versions of existing message classes for LLPluginMessage.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGECLASSES_H
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 31ea138912..1d7ddc5592 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.cpp
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -302,7 +304,14 @@ void LLPluginMessagePipe::processInput(void)
while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos)
{
// Let the owner process this message
- mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+ if (mOwner)
+ {
+ mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "!mOwner" << LL_ENDL;
+ }
start = delim + 1;
}
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 4eb6575bd4..1ddb38de68 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.h
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGEPIPE_H
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 450dcb3c78..52b5a319ec 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.cpp
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -37,12 +39,14 @@
#include "llpluginmessageclasses.h"
static const F32 HEARTBEAT_SECONDS = 1.0f;
+static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will give the plugin this much time.
LLPluginProcessChild::LLPluginProcessChild()
{
+ mState = STATE_UNINITIALIZED;
mInstance = NULL;
mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
- mSleepTime = 1.0f / 100.0f; // default: send idle messages at 100Hz
+ mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
mCPUElapsed = 0.0f;
}
@@ -51,8 +55,14 @@ LLPluginProcessChild::~LLPluginProcessChild()
if(mInstance != NULL)
{
sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
- delete mInstance;
- mInstance = NULL;
+
+ // IMPORTANT: under some (unknown) circumstances the apr_dso_unload() triggered when mInstance is deleted
+ // appears to fail and lock up which means that a given instance of the slplugin process never exits.
+ // This is bad, especially when users try to update their version of SL - it fails because the slplugin
+ // process as well as a bunch of plugin specific files are locked and cannot be overwritten.
+ exit( 0 );
+ //delete mInstance;
+ //mInstance = NULL;
}
}
@@ -142,8 +152,12 @@ void LLPluginProcessChild::idle(void)
break;
case STATE_PLUGIN_LOADED:
- setState(STATE_PLUGIN_INITIALIZING);
- sendMessageToPlugin(LLPluginMessage("base", "init"));
+ {
+ setState(STATE_PLUGIN_INITIALIZING);
+ LLPluginMessage message("base", "init");
+ message.setValue("user_data_path", mUserDataPath);
+ sendMessageToPlugin(message);
+ }
break;
case STATE_PLUGIN_INITIALIZING:
@@ -155,7 +169,7 @@ void LLPluginProcessChild::idle(void)
{
// Provide some time to the plugin
LLPluginMessage message("base", "idle");
- message.setValueReal("time", mSleepTime);
+ message.setValueReal("time", PLUGIN_IDLE_SECONDS);
sendMessageToPlugin(message);
mInstance->idle();
@@ -264,14 +278,21 @@ bool LLPluginProcessChild::isDone(void)
void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
{
- std::string buffer = message.generate();
-
- LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
- LLTimer elapsed;
-
- mInstance->sendMessage(buffer);
-
- mCPUElapsed += elapsed.getElapsedTimeF64();
+ if (mInstance)
+ {
+ std::string buffer = message.generate();
+
+ LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
+ LLTimer elapsed;
+
+ mInstance->sendMessage(buffer);
+
+ mCPUElapsed += elapsed.getElapsedTimeF64();
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL;
+ }
}
void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
@@ -307,6 +328,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
if(message_name == "load_plugin")
{
mPluginFile = parsed.getValue("file");
+ mUserDataPath = parsed.getValue("user_data_path");
}
else if(message_name == "shm_add")
{
@@ -345,6 +367,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
else
{
LL_WARNS("Plugin") << "Couldn't create a shared memory segment!" << LL_ENDL;
+ delete region;
}
}
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 75860bdf0a..58f8935ed1 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.h
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSCHILD_H
@@ -87,13 +89,16 @@ private:
STATE_ERROR, // generic bailout state
STATE_DONE // state machine will sit in this state after either error or normal termination.
};
- EState mState;
void setState(EState state);
+
+ EState mState;
LLHost mLauncherHost;
LLSocket::ptr_t mSocket;
std::string mPluginFile;
+
+ std::string mUserDataPath;
LLPluginInstance *mInstance;
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 39f9438fb3..efd5df687e 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.cpp
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -37,12 +39,6 @@
#include "llapr.h"
-// If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
-static const F32 PLUGIN_LOCKED_UP_SECONDS = 15.0f;
-
-// Somewhat longer timeout for initial launch.
-static const F32 PLUGIN_LAUNCH_SECONDS = 20.0f;
-
//virtual
LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
{
@@ -54,12 +50,16 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
mOwner = owner;
mBoundPort = 0;
mState = STATE_UNINITIALIZED;
+ mSleepTime = 0.0;
+ mCPUUsage = 0.0;
mDisableTimeout = false;
+ mDebug = false;
- // initialize timer - heartbeat test (mHeartbeat.hasExpired())
- // can sometimes return true immediately otherwise and plugins
- // fail immediately because it looks like
- mHeartbeat.setTimerExpirySec(PLUGIN_LOCKED_UP_SECONDS);
+ mPluginLaunchTimeout = 60.0f;
+ mPluginLockupTimeout = 15.0f;
+
+ // Don't start the timer here -- start it when we actually launch the plugin process.
+ mHeartbeat.stop();
}
LLPluginProcessParent::~LLPluginProcessParent()
@@ -76,8 +76,10 @@ LLPluginProcessParent::~LLPluginProcessParent()
// and remove it from our map
mSharedMemoryRegions.erase(iter);
}
-
- mProcess.kill();
+
+ // orphaning the process means it won't be killed when the LLProcessLauncher is destructed.
+ // This is what we want -- it should exit cleanly once it notices the sockets have been closed.
+ mProcess.orphan();
killSockets();
}
@@ -96,11 +98,13 @@ void LLPluginProcessParent::errorState(void)
setState(STATE_ERROR);
}
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
{
mProcess.setExecutable(launcher_filename);
mPluginFile = plugin_filename;
mCPUUsage = 0.0f;
+ mDebug = debug;
+ mUserDataPath = user_data_path;
setState(STATE_INITIALIZED);
}
@@ -291,9 +295,34 @@ void LLPluginProcessParent::idle(void)
}
else
{
+ if(mDebug)
+ {
+ #if LL_DARWIN
+ // If we're set to debug, start up a gdb instance in a new terminal window and have it attach to the plugin process and continue.
+
+ // The command we're constructing would look like this on the command line:
+ // osascript -e 'tell application "Terminal"' -e 'set win to do script "gdb -pid 12345"' -e 'do script "continue" in win' -e 'end tell'
+
+ std::stringstream cmd;
+
+ mDebugger.setExecutable("/usr/bin/osascript");
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("tell application \"Terminal\"");
+ mDebugger.addArgument("-e");
+ cmd << "set win to do script \"gdb -pid " << mProcess.getProcessID() << "\"";
+ mDebugger.addArgument(cmd.str());
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("do script \"continue\" in win");
+ mDebugger.addArgument("-e");
+ mDebugger.addArgument("end tell");
+ mDebugger.launch();
+
+ #endif
+ }
+
// This will allow us to time out if the process never starts.
mHeartbeat.start();
- mHeartbeat.setTimerExpirySec(PLUGIN_LAUNCH_SECONDS);
+ mHeartbeat.setTimerExpirySec(mPluginLaunchTimeout);
setState(STATE_LAUNCHED);
}
}
@@ -333,6 +362,7 @@ void LLPluginProcessParent::idle(void)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
message.setValue("file", mPluginFile);
+ message.setValue("user_data_path", mUserDataPath);
sendMessage(message);
}
@@ -383,7 +413,8 @@ void LLPluginProcessParent::idle(void)
break;
case STATE_CLEANUP:
- mProcess.kill();
+ // Don't do a kill here anymore -- closing the sockets is the new 'kill'.
+ mProcess.orphan();
killSockets();
setState(STATE_DONE);
break;
@@ -525,7 +556,7 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
else if(message_name == "heartbeat")
{
// this resets our timer.
- mHeartbeat.setTimerExpirySec(PLUGIN_LOCKED_UP_SECONDS);
+ mHeartbeat.setTimerExpirySec(mPluginLockupTimeout);
mCPUUsage = message.getValueReal("cpu_usage");
@@ -661,7 +692,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
{
bool result = false;
- if(!mDisableTimeout)
+ if(!mDisableTimeout && !mDebug)
{
if(!mProcess.isRunning())
{
@@ -680,7 +711,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
bool LLPluginProcessParent::pluginLockedUp()
{
- // If the timer has expired, the plugin has locked up.
- return mHeartbeat.hasExpired();
+ // If the timer is running and has expired, the plugin has locked up.
+ return (mHeartbeat.getStarted() && mHeartbeat.hasExpired());
}
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 754ebeb946..524cd9923f 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.h
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,11 +28,13 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSPARENT_H
#define LL_LLPLUGINPROCESSPARENT_H
+#include "llapr.h"
#include "llprocesslauncher.h"
#include "llpluginmessage.h"
#include "llpluginmessagepipe.h"
@@ -56,7 +59,7 @@ public:
LLPluginProcessParent(LLPluginProcessParentOwner *owner);
~LLPluginProcessParent();
- void init(const std::string &launcher_filename, const std::string &plugin_filename);
+ void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
void idle(void);
// returns true if the plugin is on its way to steady state
@@ -99,6 +102,9 @@ public:
bool getDisableTimeout() { return mDisableTimeout; };
void setDisableTimeout(bool disable) { mDisableTimeout = disable; };
+
+ void setLaunchTimeout(F32 timeout) { mPluginLaunchTimeout = timeout; };
+ void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; };
F64 getCPUUsage() { return mCPUUsage; };
@@ -137,6 +143,8 @@ private:
std::string mPluginFile;
+ std::string mUserDataPath;
+
LLPluginProcessParentOwner *mOwner;
typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
@@ -150,6 +158,13 @@ private:
F64 mCPUUsage;
bool mDisableTimeout;
+ bool mDebug;
+
+ LLProcessLauncher mDebugger;
+
+ F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch.
+ F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
+
};
#endif // LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp
index ce8b8e3e09..9c18b410c7 100644
--- a/indra/llplugin/llpluginsharedmemory.cpp
+++ b/indra/llplugin/llpluginsharedmemory.cpp
@@ -1,7 +1,8 @@
/**
* @file llpluginsharedmemory.cpp
- * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
+ * LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -94,6 +96,10 @@ std::string LLPluginSharedMemory::createName(void)
return newname.str();
}
+/**
+ * @brief LLPluginSharedMemoryImpl is the platform-dependent implementation of LLPluginSharedMemory. TODO:DOC is this necessary/sufficient? kinda obvious.
+ *
+ */
class LLPluginSharedMemoryPlatformImpl
{
public:
@@ -110,6 +116,9 @@ public:
};
+/**
+ * Constructor. Creates a shared memory segment.
+ */
LLPluginSharedMemory::LLPluginSharedMemory()
{
mSize = 0;
@@ -119,6 +128,9 @@ LLPluginSharedMemory::LLPluginSharedMemory()
mImpl = new LLPluginSharedMemoryPlatformImpl;
}
+/**
+ * Destructor. Uses destroy() and detach() to ensure shared memory segment is cleaned up.
+ */
LLPluginSharedMemory::~LLPluginSharedMemory()
{
if(mNeedsDestroy)
diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h
index a4613b9a54..00c54ef08c 100644
--- a/indra/llplugin/llpluginsharedmemory.h
+++ b/indra/llplugin/llpluginsharedmemory.h
@@ -1,7 +1,7 @@
/**
* @file llpluginsharedmemory.h
- * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +27,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINSHAREDMEMORY_H
@@ -34,6 +35,10 @@
class LLPluginSharedMemoryPlatformImpl;
+/**
+ * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
+ *
+ */
class LLPluginSharedMemory
{
LOG_CLASS(LLPluginSharedMemory);
@@ -44,16 +49,62 @@ public:
// Parent will use create/destroy, child will use attach/detach.
// Message transactions will ensure child attaches after parent creates and detaches before parent destroys.
- // create() implicitly creates a name for the segment which is guaranteed to be unique on the host at the current time.
+ /**
+ * Creates a shared memory segment, with a name which is guaranteed to be unique on the host at the current time. Used by parent.
+ * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys.
+ *
+ * @param[in] size Shared memory size in TODO:DOC units = bytes?.
+ *
+ * @return False for failure, true for success.
+ */
bool create(size_t size);
+ /**
+ * Destroys a shared memory segment. Used by parent.
+ * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys.
+ *
+ * @return True. TODO:DOC - always returns true. Is this the intended behavior?
+ */
bool destroy(void);
+ /**
+ * Creates and attaches a name to a shared memory segment. TODO:DOC what's the difference between attach() and create()?
+ *
+ * @param[in] name Name to attach to memory segment
+ * @param[in] size Size of memory segment TODO:DOC in bytes?
+ *
+ * @return False on failure, true otherwise.
+ */
bool attach(const std::string &name, size_t size);
+ /**
+ * Detaches shared memory segment.
+ *
+ * @return False on failure, true otherwise.
+ */
bool detach(void);
+ /**
+ * Checks if shared memory is mapped to a non-null address.
+ *
+ * @return True if memory address is non-null, false otherwise.
+ */
bool isMapped(void) const { return (mMappedAddress != NULL); };
+ /**
+ * Get pointer to shared memory.
+ *
+ * @return Pointer to shared memory.
+ */
void *getMappedAddress(void) const { return mMappedAddress; };
+ /**
+ * Get size of shared memory.
+ *
+ * @return Size of shared memory in bytes. TODO:DOC are bytes the correct unit?
+ */
size_t getSize(void) const { return mSize; };
+ /**
+ * Get name of shared memory.
+ *
+ * @return Name of shared memory.
+ */
std::string getName() const { return mName; };
private:
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 005e427572..77240ce546 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -1,11 +1,13 @@
-/**
+/**
* @file slplugin.cpp
* @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
*
+ * @cond
+ *
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
- *
+ *
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
@@ -13,20 +15,22 @@
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
- *
+ *
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at http://secondlife.com/developers/opensource/flossexception
- *
+ *
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
- *
+ *
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ *
+ * @endcond
*/
@@ -48,15 +52,15 @@
/*
On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
-
+
Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
-
+
-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
-
+
which means adding this to the gcc flags:
-
+
-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-
+
*/
#if LL_DARWIN || LL_LINUX
@@ -67,7 +71,7 @@ static void crash_handler(int sig)
// TODO: add our own crash reporting
_exit(1);
}
-#endif
+#endif
#if LL_WINDOWS
#include <windows.h>
@@ -80,7 +84,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
// TODO: replace exception handler before we exit?
- return EXCEPTION_EXECUTE_HANDLER;
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+ return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+// It should work for any flavor of 32-bit Windows we care about.
+// If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+ HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+ if ( NULL == hKernel32 )
+ return FALSE;
+
+ void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+ if( NULL == pOrgEntry )
+ return FALSE;
+
+ unsigned char newJump[ 100 ];
+ DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+ dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+ void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+ DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+ DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+ newJump[ 0 ] = 0xE9; // JMP absolute
+ memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+ SIZE_T bytesWritten;
+ BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+ return bRet;
+#else
+ return FALSE;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
@@ -91,6 +136,7 @@ void initExceptionHandler()
// save old exception handler in case we need to restore it at the end
prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+ PreventSetUnhandledExceptionFilter();
}
bool checkExceptionHandler()
@@ -99,6 +145,8 @@ bool checkExceptionHandler()
LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
+ PreventSetUnhandledExceptionFilter();
+
if (prev_filter != myWin32ExceptionHandler)
{
LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
@@ -108,7 +156,7 @@ bool checkExceptionHandler()
if (prev_filter == NULL)
{
ok = FALSE;
- if (myWin32ExceptionHandler == NULL)
+ if (NULL == myWin32ExceptionHandler)
{
LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL;
}
@@ -122,7 +170,7 @@ bool checkExceptionHandler()
}
#endif
-// If this application on Windows platform is a console application, a console is always
+// If this application on Windows platform is a console application, a console is always
// created which is bad. Making it a Windows "application" via CMake settings but not
// adding any code to explicitly create windows does the right thing.
#if LL_WINDOWS
@@ -133,7 +181,7 @@ int main(int argc, char **argv)
{
ll_init_apr();
- // Set up llerror logging
+ // Set up llerror logging
{
LLError::initForApplication(".");
LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -146,14 +194,14 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
};
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(lpCmdLine, port))
{
LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
};
- // Insert our exception handler into the system so this plugin doesn't
+ // Insert our exception handler into the system so this plugin doesn't
// display a crash message if something bad happens. The host app will
// see the missing heartbeat and log appropriately.
initExceptionHandler();
@@ -162,7 +210,7 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
}
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(argv[1], port))
{
@@ -183,17 +231,17 @@ int main(int argc, char **argv)
LLPluginProcessChild *plugin = new LLPluginProcessChild();
plugin->init(port);
-
+
LLTimer timer;
timer.start();
#if LL_WINDOWS
checkExceptionHandler();
#endif
-
+
while(!plugin->isDone())
{
- timer.reset();
+ timer.reset();
plugin->idle();
#if LL_DARWIN
{
@@ -204,7 +252,7 @@ int main(int argc, char **argv)
#endif
F64 elapsed = timer.getElapsedTimeF64();
F64 remaining = plugin->getSleepTime() - elapsed;
-
+
if(remaining <= 0.0f)
{
// We've already used our full allotment.
@@ -217,26 +265,26 @@ int main(int argc, char **argv)
{
// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
-// timer.reset();
-
+// timer.reset();
+
// This also services the network as needed.
plugin->sleep(remaining);
-
+
// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL;
}
#if LL_WINDOWS
// More agressive checking of interfering exception handlers.
- // Doesn't appear to be required so far - even for plugins
- // that do crash with a single call to the intercept
+ // Doesn't appear to be required so far - even for plugins
+ // that do crash with a single call to the intercept
// exception handler such as QuickTime.
//checkExceptionHandler();
#endif
}
delete plugin;
-
- ll_cleanup_apr();
+
+ ll_cleanup_apr();
return 0;
}
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index d130513637..68a3d54597 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -25,6 +25,7 @@ set(llprimitive_SOURCE_FILES
lltreeparams.cpp
llvolumemessage.cpp
llvolumexml.cpp
+ material_codes.cpp
)
set(llprimitive_HEADER_FILES
diff --git a/indra/llprimitive/llmaterialtable.cpp b/indra/llprimitive/llmaterialtable.cpp
index 18787c47c5..774a58c8ac 100644
--- a/indra/llprimitive/llmaterialtable.cpp
+++ b/indra/llprimitive/llmaterialtable.cpp
@@ -92,6 +92,9 @@ F32 const LLMaterialTable::DEFAULT_FRICTION = 0.5f;
F32 const LLMaterialTable::DEFAULT_RESTITUTION = 0.4f;
LLMaterialTable::LLMaterialTable()
+ : mCollisionSoundMatrix(NULL),
+ mSlidingSoundMatrix(NULL),
+ mRollingSoundMatrix(NULL)
{
}
diff --git a/indra/llprimitive/llmaterialtable.h b/indra/llprimitive/llmaterialtable.h
index 2c0b046fa7..77f29a8e06 100644
--- a/indra/llprimitive/llmaterialtable.h
+++ b/indra/llprimitive/llmaterialtable.h
@@ -38,6 +38,8 @@
#include <list>
+class LLMaterialInfo;
+
const U32 LLMATERIAL_INFO_NAME_LENGTH = 256;
// We've moved toward more reasonable mass values for the Havok4 engine.
@@ -64,45 +66,6 @@ const F32 LEGACY_DEFAULT_OBJECT_DENSITY = 10.0f;
const F32 DEFAULT_AVATAR_DENSITY = 445.3f; // was 444.24f;
-class LLMaterialInfo
-{
-public:
- U8 mMCode;
- std::string mName;
- LLUUID mDefaultTextureID;
- LLUUID mShatterSoundID;
- F32 mDensity; // kg/m^3
- F32 mFriction;
- F32 mRestitution;
-
- // damage and energy constants
- F32 mHPModifier; // modifier on mass based HP total
- F32 mDamageModifier; // modifier on KE based damage
- F32 mEPModifier; // modifier on mass based EP total
-
- LLMaterialInfo(U8 mcode, const std::string& name, const LLUUID &uuid)
- {
- init(mcode,name,uuid);
- };
-
- void init(U8 mcode, const std::string& name, const LLUUID &uuid)
- {
- mDensity = 1000.f; // default to 1000.0 (water)
- mHPModifier = 1.f;
- mDamageModifier = 1.f;
- mEPModifier = 1.f;
-
- mMCode = mcode;
- mName = name;
- mDefaultTextureID = uuid;
- };
-
- ~LLMaterialInfo()
- {
- };
-
-};
-
class LLMaterialTable
{
public:
@@ -185,5 +148,47 @@ public:
static LLMaterialTable basic;
};
+
+class LLMaterialInfo
+{
+public:
+ U8 mMCode;
+ std::string mName;
+ LLUUID mDefaultTextureID;
+ LLUUID mShatterSoundID;
+ F32 mDensity; // kg/m^3
+ F32 mFriction;
+ F32 mRestitution;
+
+ // damage and energy constants
+ F32 mHPModifier; // modifier on mass based HP total
+ F32 mDamageModifier; // modifier on KE based damage
+ F32 mEPModifier; // modifier on mass based EP total
+
+ LLMaterialInfo(U8 mcode, const std::string& name, const LLUUID &uuid)
+ {
+ init(mcode,name,uuid);
+ };
+
+ void init(U8 mcode, const std::string& name, const LLUUID &uuid)
+ {
+ mDensity = 1000.f; // default to 1000.0 (water)
+ mFriction = LLMaterialTable::DEFAULT_FRICTION;
+ mRestitution = LLMaterialTable::DEFAULT_RESTITUTION;
+ mHPModifier = 1.f;
+ mDamageModifier = 1.f;
+ mEPModifier = 1.f;
+
+ mMCode = mcode;
+ mName = name;
+ mDefaultTextureID = uuid;
+ };
+
+ ~LLMaterialInfo()
+ {
+ };
+
+};
+
#endif
diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp
index fa04bf80e7..2fc1e5e60c 100644
--- a/indra/llprimitive/llmediaentry.cpp
+++ b/indra/llprimitive/llmediaentry.cpp
@@ -164,6 +164,7 @@ void LLMediaEntry::asLLSD(LLSD& sd) const
// "security" fields
sd[WHITELIST_ENABLE_KEY] = mWhiteListEnable;
+ sd.erase(WHITELIST_KEY);
for (U32 i=0; i<mWhiteList.size(); i++)
{
sd[WHITELIST_KEY].append(mWhiteList[i]);
@@ -388,8 +389,12 @@ U32 LLMediaEntry::setWhiteList( const std::vector<std::string> &whitelist )
U32 LLMediaEntry::setWhiteList( const LLSD &whitelist )
{
- // If whitelist is undef, this is a no-op.
- if (whitelist.isUndefined()) return LSL_STATUS_OK;
+ // If whitelist is undef, the whitelist is cleared
+ if (whitelist.isUndefined())
+ {
+ mWhiteList.clear();
+ return LSL_STATUS_OK;
+ }
// However, if the whitelist is an empty array, erase it.
if (whitelist.isArray())
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 5ad758072c..b75d1b0f67 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -154,6 +154,7 @@ bool LLPrimitive::cleanupVolumeManager()
//===============================================================
LLPrimitive::LLPrimitive()
: mTextureList(),
+ mNumTEs(0),
mMiscFlags(0)
{
mPrimitiveCode = 0;
diff --git a/indra/llprimitive/material_codes.cpp b/indra/llprimitive/material_codes.cpp
new file mode 100644
index 0000000000..ce146dad8a
--- /dev/null
+++ b/indra/llprimitive/material_codes.cpp
@@ -0,0 +1,46 @@
+/**
+ * @file material_codes.cpp
+ * @brief Material_codes definitions
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "material_codes.h"
+
+#include "lluuid.h"
+
+const LLUUID LL_DEFAULT_STONE_UUID("87c5765b-aa26-43eb-b8c6-c09a1ca6208e");
+const LLUUID LL_DEFAULT_METAL_UUID("6f3c53e9-ba60-4010-8f3e-30f51a762476");
+const LLUUID LL_DEFAULT_GLASS_UUID("b4ba225c-373f-446d-9f7e-6cb7b5cf9b3d");
+const LLUUID LL_DEFAULT_WOOD_UUID("89556747-24cb-43ed-920b-47caed15465f");
+const LLUUID LL_DEFAULT_FLESH_UUID("80736669-e4b9-450e-8890-d5169f988a50");
+const LLUUID LL_DEFAULT_PLASTIC_UUID("304fcb4e-7d33-4339-ba80-76d3d22dc11a");
+const LLUUID LL_DEFAULT_RUBBER_UUID("9fae0bc5-666d-477e-9f70-84e8556ec867");
+const LLUUID LL_DEFAULT_LIGHT_UUID("00000000-0000-0000-0000-000000000000");
diff --git a/indra/llprimitive/material_codes.h b/indra/llprimitive/material_codes.h
index e5a59a2789..ba3faba39f 100644
--- a/indra/llprimitive/material_codes.h
+++ b/indra/llprimitive/material_codes.h
@@ -33,7 +33,7 @@
#ifndef LL_MATERIAL_CODES_H
#define LL_MATERIAL_CODES_H
-#include "lluuid.h"
+class LLUUID;
// material types
const U8 LL_MCODE_STONE = 0;
@@ -47,13 +47,14 @@ const U8 LL_MCODE_LIGHT = 7;
const U8 LL_MCODE_END = 8;
const U8 LL_MCODE_MASK = 0x0F;
-const LLUUID LL_DEFAULT_STONE_UUID("87c5765b-aa26-43eb-b8c6-c09a1ca6208e");
-const LLUUID LL_DEFAULT_METAL_UUID("6f3c53e9-ba60-4010-8f3e-30f51a762476");
-const LLUUID LL_DEFAULT_GLASS_UUID("b4ba225c-373f-446d-9f7e-6cb7b5cf9b3d");
-const LLUUID LL_DEFAULT_WOOD_UUID("89556747-24cb-43ed-920b-47caed15465f");
-const LLUUID LL_DEFAULT_FLESH_UUID("80736669-e4b9-450e-8890-d5169f988a50");
-const LLUUID LL_DEFAULT_PLASTIC_UUID("304fcb4e-7d33-4339-ba80-76d3d22dc11a");
-const LLUUID LL_DEFAULT_RUBBER_UUID("9fae0bc5-666d-477e-9f70-84e8556ec867");
-const LLUUID LL_DEFAULT_LIGHT_UUID("00000000-0000-0000-0000-000000000000");
+// *NOTE: Define these in .cpp file to reduce duplicate instances
+extern const LLUUID LL_DEFAULT_STONE_UUID;
+extern const LLUUID LL_DEFAULT_METAL_UUID;
+extern const LLUUID LL_DEFAULT_GLASS_UUID;
+extern const LLUUID LL_DEFAULT_WOOD_UUID;
+extern const LLUUID LL_DEFAULT_FLESH_UUID;
+extern const LLUUID LL_DEFAULT_PLASTIC_UUID;
+extern const LLUUID LL_DEFAULT_RUBBER_UUID;
+extern const LLUUID LL_DEFAULT_LIGHT_UUID;
#endif
diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp
index 9ce6560923..88cd96ebe4 100644
--- a/indra/llprimitive/tests/llmediaentry_test.cpp
+++ b/indra/llprimitive/tests/llmediaentry_test.cpp
@@ -9,7 +9,14 @@
#include "linden_common.h"
#include "lltut.h"
-#include "boost/lexical_cast.hpp"
+#if LL_WINDOWS
+#pragma warning (push)
+#pragma warning (disable : 4702) // boost::lexical_cast generates this warning
+#endif
+#include <boost/lexical_cast.hpp>
+#if LL_WINDOWS
+#pragma warning (pop)
+#endif
#include "llstring.h"
#include "llsdutil.h"
#include "llsdserialize.h"
@@ -150,14 +157,9 @@ namespace
namespace tut
{
- bool llsd_equals(const LLSD& a, const LLSD& b) {
- // cheesy, brute force, but it works
- return std::string(ll_pretty_print_sd(a)) == std::string(ll_pretty_print_sd(b));
- }
-
void ensure_llsd_equals(const std::string& msg, const LLSD& expected, const LLSD& actual)
{
- if (!tut::llsd_equals(expected, actual))
+ if (!llsd_equals(expected, actual))
{
std::string message = msg;
message += ": actual: ";
@@ -190,9 +192,9 @@ namespace tut
entry.setWhiteList(tokens);
}
- void whitelist_test(bool enable, const char *whitelist, const char *candidate_url, bool expected_pass)
+ void whitelist_test(int num, bool enable, const char *whitelist, const char *candidate_url, bool expected_pass)
{
- std::string message = "Whitelist test";
+ std::string message = "Whitelist test " + boost::lexical_cast<std::string>(num);
LLMediaEntry entry;
entry.setWhiteListEnable(enable);
set_whitelist(entry, whitelist);
@@ -209,13 +211,13 @@ namespace tut
ensure(message, expected_pass == passed_whitelist);
}
- void whitelist_test(const char *whitelist, const char *candidate_url, bool expected_pass)
+ void whitelist_test(int num, const char *whitelist, const char *candidate_url, bool expected_pass)
{
- whitelist_test(true, whitelist, candidate_url, expected_pass);
+ whitelist_test(num, true, whitelist, candidate_url, expected_pass);
}
- void whitelist_test(const char *whitelist, const char *candidate_url)
+ void whitelist_test(int num, const char *whitelist, const char *candidate_url)
{
- whitelist_test(true, whitelist, candidate_url, true);
+ whitelist_test(num, true, whitelist, candidate_url, true);
}
template<> template<>
@@ -223,8 +225,7 @@ namespace tut
{
set_test_name("Test LLMediaEntry Instantiation");
LLMediaEntry entry;
- ensure_llsd_equals(get_test_name(), defaultMediaEntryLLSD, entry.asLLSD());
-
+ ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry.asLLSD());
}
template<> template<>
@@ -251,12 +252,45 @@ namespace tut
ensure_llsd_equals(get_test_name() + " failed", golden, entry.asLLSD());
}
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("Test LLMediaEntry::asLLSD()");
+ LLMediaEntry entry;
+ LLSD sd;
+ // Put some cruft in the LLSD
+ sd[LLMediaEntry::CURRENT_URL_KEY] = "http://www.example.com";
+ LLSD whitelist;
+ whitelist.append("*.example.com");
+ sd[LLMediaEntry::WHITELIST_KEY] = whitelist;
+ entry.asLLSD(sd);
+ ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd);
+ }
+
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("Test LLMediaEntry::asLLSD() -> LLMediaEntry::fromLLSD()");
+ LLMediaEntry entry1, entry2;
+ // Add a whitelist to entry2
+ std::vector<std::string> whitelist;
+ whitelist.push_back("*.example.com");
+ entry2.setWhiteList(whitelist);
+ // Render entry1 (which has no whitelist) as an LLSD
+ LLSD sd;
+ entry1.asLLSD(sd);
+ // "read" that LLSD into entry 2
+ entry2.fromLLSD(sd);
+ ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry2.asLLSD());
+ }
+
// limit tests
const char *URL_OK = "http://www.example.com";
const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
template<> template<>
- void object::test<4>()
+ void object::test<6>()
{
set_test_name("Test Limits on setting current URL");
LLMediaEntry entry;
@@ -267,7 +301,7 @@ namespace tut
}
template<> template<>
- void object::test<5>()
+ void object::test<7>()
{
set_test_name("Test Limits on setting home URL");
LLMediaEntry entry;
@@ -278,7 +312,7 @@ namespace tut
}
template<> template<>
- void object::test<6>()
+ void object::test<8>()
{
set_test_name("Test Limits on setting whitelist");
@@ -292,7 +326,7 @@ namespace tut
}
template<> template<>
- void object::test<7>()
+ void object::test<9>()
{
set_test_name("Test Limits on setting whitelist too big");
@@ -307,7 +341,7 @@ namespace tut
}
template<> template<>
- void object::test<8>()
+ void object::test<10>()
{
set_test_name("Test Limits on setting whitelist too many");
@@ -323,7 +357,7 @@ namespace tut
}
template<> template<>
- void object::test<9>()
+ void object::test<11>()
{
set_test_name("Test to make sure both setWhiteList() functions behave the same");
@@ -341,7 +375,7 @@ namespace tut
}
template<> template<>
- void object::test<10>()
+ void object::test<12>()
{
set_test_name("Test to make sure both setWhiteList() functions behave the same");
@@ -362,7 +396,7 @@ namespace tut
}
template<> template<>
- void object::test<11>()
+ void object::test<13>()
{
set_test_name("Test to make sure both setWhiteList() functions behave the same");
@@ -382,103 +416,70 @@ namespace tut
empty == entry2.getWhiteList());
}
- // Whitelist check tests
-
- // Check the "empty whitelist" case
template<> template<>
- void object::test<12>() { whitelist_test("", "http://www.example.com", true); }
+ void object::test<14>()
+ {
+ // Whitelist check tests
+ int n=0;
+
+ // Check the "empty whitelist" case
+ whitelist_test(++n, "", "http://www.example.com", true);
- // Check the "missing scheme" case
- template<> template<>
- void object::test<13>() { whitelist_test("www.example.com", "http://www.example.com", true); }
+ // Check the "missing scheme" case
+ whitelist_test(++n, "www.example.com", "http://www.example.com", true);
- // Check the "exactly the same" case
- template<> template<>
- void object::test<14>() { whitelist_test("http://example.com", "http://example.com", true); }
+ // Check the "exactly the same" case
+ whitelist_test(++n, "http://example.com", "http://example.com", true);
- // Check the enable flag
- template<> template<>
- void object::test<15>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); }
- template<> template<>
- void object::test<16>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); }
+ // Check the enable flag
+ whitelist_test(++n, false, "www.example.com", "http://www.secondlife.com", true);
+ whitelist_test(++n, true, "www.example.com", "http://www.secondlife.com", false);
- // Check permutations of trailing slash:
- template<> template<>
- void object::test<17>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); }
- template<> template<>
- void object::test<18>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); }
- template<> template<>
- void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); }
- template<> template<>
- void object::test<20>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); }
- template<> template<>
- void object::test<21>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); }
+ // Check permutations of trailing slash:
+ whitelist_test(++n, "http://www.example.com", "http://www.example.com/", true);
+ whitelist_test(++n, "http://www.example.com/", "http://www.example.com/", true);
+ whitelist_test(++n, "http://www.example.com/", "http://www.example.com", false);
+ whitelist_test(++n, "http://www.example.com", "http://www.example.com/foobar", true);
+ whitelist_test(++n, "http://www.example.com/", "http://www.example.com/foobar", false);
- // More cases...
- template<> template<>
- void object::test<22>() { whitelist_test("http://example.com", "http://example.com/wiki", true); }
- template<> template<>
- void object::test<23>() { whitelist_test("www.example.com", "http://www.example.com/help", true); }
- template<> template<>
- void object::test<24>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); }
- template<> template<>
- void object::test<25>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); }
- template<> template<>
- void object::test<26>() { whitelist_test("example.com", "http://wwwexample.com", false); }
- template<> template<>
- void object::test<27>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); }
- template<> template<>
- void object::test<28>() { whitelist_test("www.example.com", "http://www.amazon.com", false); }
-
- // regexp cases
- template<> template<>
- void object::test<29>() { whitelist_test("*.example.com", "http://www.example.com", true); }
- template<> template<>
- void object::test<30>() { whitelist_test("*.example.com", "http://www.amazon.com", false); }
- template<> template<>
- void object::test<31>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); }
- template<> template<>
- void object::test<32>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); }
- template<> template<>
- void object::test<33>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); }
- template<> template<>
- void object::test<34>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); }
- template<> template<>
- void object::test<35>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); }
- template<> template<>
- void object::test<36>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); }
- template<> template<>
- void object::test<37>() { whitelist_test("http://*example.com", "http://www.example.com", true); }
- template<> template<>
- void object::test<38>() { whitelist_test("http://*.example.com", "http://www.example.com", true); }
- template<> template<>
- void object::test<39>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); }
- template<> template<>
- void object::test<40>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); }
- template<> template<>
- void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); }
- template<> template<>
- void object::test<42>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); }
- template<> template<>
- void object::test<43>() { whitelist_test("http://*.example.com", "https://www.example.com", false); }
- template<> template<>
- void object::test<44>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); }
- template<> template<>
- void object::test<45>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); }
- template<> template<>
- void object::test<46>() { whitelist_test("example.com", "http://www.example.com", false); }
- template<> template<>
- void object::test<47>() { whitelist_test("www.example.com", "http://www.example.com:80", false); }
- template<> template<>
- void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com", true); }
- template<> template<>
- void object::test<49>() { whitelist_test("www.example.com/", "http://www.example.com", false); }
- template<> template<>
- void object::test<50>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); }
- // Path only
- template<> template<>
- void object::test<51>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); }
- template<> template<>
- void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); }
+ // More cases...
+ whitelist_test(++n, "http://example.com", "http://example.com/wiki", true);
+ whitelist_test(++n, "www.example.com", "http://www.example.com/help", true);
+ whitelist_test(++n, "http://www.example.com", "http://wwwexample.com", false);
+ whitelist_test(++n, "http://www.example.com", "http://www.example.com/wiki", true);
+ whitelist_test(++n, "example.com", "http://wwwexample.com", false);
+ whitelist_test(++n, "http://www.example.com/", "http://www.amazon.com/wiki", false);
+ whitelist_test(++n, "www.example.com", "http://www.amazon.com", false);
+
+ // regexp cases
+ whitelist_test(++n, "*.example.com", "http://www.example.com", true);
+ whitelist_test(++n, "*.example.com", "http://www.amazon.com", false);
+ whitelist_test(++n, "*.example.com", "http://www.example.com/foo/bar", true);
+ whitelist_test(++n, "*.example.com", "http:/example.com/foo/bar", false);
+ whitelist_test(++n, "*example.com", "http://example.com/foo/bar", true);
+ whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?example.com", false);
+ whitelist_test(++n, "example.com", "http://my.virus.com/foo/bar?example.com", false);
+ whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?*example.com", false);
+ whitelist_test(++n, "http://*example.com", "http://www.example.com", true);
+ whitelist_test(++n, "http://*.example.com", "http://www.example.com", true);
+ whitelist_test(++n, "http://*.e$?^.com", "http://www.e$?^.com", true);
+ whitelist_test(++n, "*.example.com/foo/bar", "http://www.example.com/", false);
+ whitelist_test(++n, "*.example.com/foo/bar", "http://example.com/foo/bar", false);
+ whitelist_test(++n, "http://*.example.com/foo/bar", "http://www.example.com", false);
+ whitelist_test(++n, "http://*.example.com", "https://www.example.com", false);
+ whitelist_test(++n, "http*://*.example.com", "rtsp://www.example.com", false);
+ whitelist_test(++n, "http*://*.example.com", "https://www.example.com", true);
+ whitelist_test(++n, "example.com", "http://www.example.com", false);
+ whitelist_test(++n, "www.example.com", "http://www.example.com:80", false);
+ whitelist_test(++n, "www.example.com", "http://www.example.com", true);
+ whitelist_test(++n, "www.example.com/", "http://www.example.com", false);
+ whitelist_test(++n, "www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true);
+
+ // Path only
+ whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/baz", true);
+ whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/", false);
+ }
+
}
+
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 08a96b4e31..036714e5cb 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -63,6 +63,12 @@ LLCubeMap::LLCubeMap()
mTextureCoordStage(0),
mMatrixStage(0)
{
+ mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB;
+ mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB;
+ mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB;
+ mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB;
+ mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB;
+ mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB;
}
LLCubeMap::~LLCubeMap()
@@ -75,13 +81,6 @@ void LLCubeMap::initGL()
if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
{
- mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB;
- mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB;
- mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB;
- mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB;
- mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB;
- mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB;
-
// Not initialized, do stuff.
if (mImages[0].isNull())
{
diff --git a/indra/llrender/llfontbitmapcache.cpp b/indra/llrender/llfontbitmapcache.cpp
index f01878642a..fa231c9e6a 100644
--- a/indra/llrender/llfontbitmapcache.cpp
+++ b/indra/llrender/llfontbitmapcache.cpp
@@ -64,7 +64,7 @@ void LLFontBitmapCache::init(S32 num_components,
LLImageRaw *LLFontBitmapCache::getImageRaw(U32 bitmap_num) const
{
- if ((bitmap_num < 0) || (bitmap_num >= mImageRawVec.size()))
+ if (bitmap_num >= mImageRawVec.size())
return NULL;
return mImageRawVec[bitmap_num];
@@ -72,7 +72,7 @@ LLImageRaw *LLFontBitmapCache::getImageRaw(U32 bitmap_num) const
LLImageGL *LLFontBitmapCache::getImageGL(U32 bitmap_num) const
{
- if ((bitmap_num < 0) || (bitmap_num >= mImageGLVec.size()))
+ if (bitmap_num >= mImageGLVec.size())
return NULL;
return mImageGLVec[bitmap_num];
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 786dc64452..a86bbbffff 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -91,14 +91,15 @@ LLFontManager::~LLFontManager()
LLFontGlyphInfo::LLFontGlyphInfo(U32 index)
: mGlyphIndex(index),
+ mWidth(0), // In pixels
+ mHeight(0), // In pixels
+ mXAdvance(0.f), // In pixels
+ mYAdvance(0.f), // In pixels
mXBitmapOffset(0), // Offset to the origin in the bitmap
mYBitmapOffset(0), // Offset to the origin in the bitmap
mXBearing(0), // Distance from baseline to left in pixels
mYBearing(0), // Distance from baseline to top in pixels
- mWidth(0), // In pixels
- mHeight(0), // In pixels
- mXAdvance(0.f), // In pixels
- mYAdvance(0.f) // In pixels
+ mBitmapNum(0) // Which bitmap in the bitmap cache contains this glyph
{
}
@@ -112,6 +113,7 @@ LLFontFreetype::LLFontFreetype()
mFTFace(NULL),
mRenderGlyphCount(0),
mAddGlyphCount(0),
+ mStyle(0),
mPointSize(0)
{
}
@@ -268,6 +270,14 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const
return (F32)mFontBitmapCachep->getMaxCharWidth();
}
+F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const
+{
+ if (mFTFace == NULL)
+ return 0.0;
+
+ return glyph->mXAdvance;
+}
+
F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
{
if (mFTFace == NULL)
@@ -287,6 +297,21 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
return delta.x*(1.f/64.f);
}
+F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const
+{
+ if (mFTFace == NULL)
+ return 0.0;
+
+ U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0;
+ U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0;
+
+ FT_Vector delta;
+
+ llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta));
+
+ return delta.x*(1.f/64.f);
+}
+
BOOL LLFontFreetype::hasGlyph(llwchar wch) const
{
llassert(!mIsFallback);
@@ -502,8 +527,13 @@ void LLFontFreetype::resetBitmapCache()
mCharGlyphInfoMap.clear();
mFontBitmapCachep->reset();
- // Add the empty glyph
- addGlyphFromFont(this, 0, 0);
+ // Adding default glyph is skipped for fallback fonts here as well as in loadFace().
+ // This if was added as fix for EXT-4971.
+ if(!mIsFallback)
+ {
+ // Add the empty glyph
+ addGlyphFromFont(this, 0, 0);
+ }
}
void LLFontFreetype::destroyGL()
diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h
index 1325b4995b..f60d09316d 100644
--- a/indra/llrender/llfontfreetype.h
+++ b/indra/llrender/llfontfreetype.h
@@ -58,9 +58,8 @@ private:
~LLFontManager();
};
-class LLFontGlyphInfo
+struct LLFontGlyphInfo
{
-public:
LLFontGlyphInfo(U32 index);
U32 mGlyphIndex;
@@ -129,7 +128,9 @@ public:
};
F32 getXAdvance(llwchar wc) const;
+ F32 getXAdvance(const LLFontGlyphInfo* glyph) const;
F32 getXKerning(llwchar char_left, llwchar char_right) const; // Get the kerning between the two characters
+ F32 getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const; // Get the kerning between the two characters
LLFontGlyphInfo* getGlyphInfo(llwchar wch) const;
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 793a526c26..f1f86fd638 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -135,7 +135,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32 scaled_max_pixels = max_pixels == S32_MAX ? S32_MAX : llceil((F32)max_pixels * sScaleX);
- // determine which style flags need to be added programmatically by striping off the
+ // determine which style flags need to be added programmatically by stripping off the
// style bits that are drawn by the underlying Freetype font
U8 style_to_add = (style | mFontDescriptor.getStyle()) & ~mFontFreetype->getStyle();
@@ -195,7 +195,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
cur_y += mFontFreetype->getDescenderHeight();
break;
case VCENTER:
- cur_y -= ((mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight())/2.f);
+ cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f;
break;
case BASELINE:
// Baseline, do nothing.
@@ -221,7 +221,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
cur_render_y = cur_y;
cur_render_x = cur_x;
- F32 start_x = cur_x;
+ F32 start_x = llround(cur_x);
const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache();
@@ -235,7 +235,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
if (use_ellipses)
{
// check for too long of a string
- if (getWidthF32(wstr.c_str(), begin_offset, max_chars) * sScaleX > scaled_max_pixels)
+ S32 string_width = llround(getWidthF32(wstr.c_str(), begin_offset, max_chars) * sScaleX);
+ if (string_width > scaled_max_pixels)
{
// use four dots for ellipsis width to generate padding
const LLWString dots(utf8str_to_wstring(std::string("....")));
@@ -248,11 +249,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
// Remember last-used texture to avoid unnecesssary bind calls.
LLImageGL *last_bound_texture = NULL;
+ const LLFontGlyphInfo* next_glyph = NULL;
+
for (i = begin_offset; i < begin_offset + length; i++)
{
llwchar wch = wstr[i];
- const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch);
+ const LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
if (!fgi)
{
llerrs << "Missing Glyph Info" << llendl;
@@ -294,15 +302,16 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
if (next_char && (next_char < LAST_CHARACTER))
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(next_char);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
// Must do this to cur_x, not just to cur_render_x, otherwise you
// will squish sub-pixel kerned characters too close together.
// For example, "CCCCC" looks bad.
- cur_x = (F32)llfloor(cur_x + 0.5f);
- //cur_y = (F32)llfloor(cur_y + 0.5f);
+ cur_x = (F32)llround(cur_x);
+ //cur_y = (F32)llround(cur_y);
cur_render_x = cur_x;
cur_render_y = cur_y;
@@ -434,19 +443,28 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
F32 cur_x = 0;
const S32 max_index = begin_offset + max_chars;
+ const LLFontGlyphInfo* next_glyph = NULL;
+
F32 width_padding = 0.f;
for (S32 i = begin_offset; i < max_index && wchars[i] != 0; i++)
{
llwchar wch = wchars[i];
- const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch);
+ const LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
- F32 advance = mFontFreetype->getXAdvance(wch);
+ F32 advance = mFontFreetype->getXAdvance(fgi);
// for the last character we want to measure the greater of its width and xadvance values
// so keep track of the difference between these values for the each character we measure
// so we can fix things up at the end
- width_padding = llmax(0.f, (F32)fgi->mWidth - advance);
+ width_padding = llmax( 0.f, // always use positive padding amount
+ width_padding - advance, // previous padding left over after advance of current character
+ (F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character
cur_x += advance;
llwchar next_char = wchars[i+1];
@@ -456,10 +474,11 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
&& (next_char < LAST_CHARACTER))
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(next_char);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
- cur_x = (F32)llfloor(cur_x + 0.5f);
+ cur_x = (F32)llround(cur_x);
}
// add in extra pixels for last character's width past its xadvance
@@ -469,7 +488,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
}
// Returns the max number of complete characters from text (up to max_chars) that can be drawn in max_pixels
-S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars, BOOL end_on_word_boundary) const
+S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars, EWordWrapStyle end_on_word_boundary) const
{
if (!wchars || !wchars[0] || max_chars == 0)
{
@@ -488,6 +507,9 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
F32 scaled_max_pixels = ceil(max_pixels * sScaleX);
+ F32 width_padding = 0.f;
+
+ LLFontGlyphInfo* next_glyph = NULL;
S32 i;
for (i=0; (i < max_chars); i++)
@@ -530,10 +552,23 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
in_word = TRUE;
}
}
+
+ LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
+
+ // account for glyphs that run beyond the starting point for the next glyphs
+ width_padding = llmax( 0.f, // always use positive padding amount
+ width_padding - fgi->mXAdvance, // previous padding left over after advance of current character
+ (F32)(fgi->mWidth + fgi->mXBearing) - fgi->mXAdvance); // difference between width of this character and advance to next character
- cur_x += mFontFreetype->getXAdvance(wch);
+ cur_x += fgi->mXAdvance;
- if (scaled_max_pixels < cur_x)
+ // clip if current character runs past scaled_max_pixels (using width_padding)
+ if (scaled_max_pixels < cur_x + width_padding)
{
clip = TRUE;
break;
@@ -542,17 +577,33 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
if (((i+1) < max_chars) && wchars[i+1])
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, wchars[i+1]);
+ next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1]);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
- cur_x = (F32)llfloor(cur_x + 0.5f);
+ cur_x = llround(cur_x);
drawn_x = cur_x;
}
- if( clip && end_on_word_boundary && (start_of_last_word != 0) )
+ if( clip )
{
- i = start_of_last_word;
+ switch (end_on_word_boundary)
+ {
+ case ONLY_WORD_BOUNDARIES:
+ i = start_of_last_word;
+ break;
+ case WORD_BOUNDARY_IF_POSSIBLE:
+ if (start_of_last_word != 0)
+ {
+ i = start_of_last_word;
+ }
+ break;
+ default:
+ case ANYWHERE:
+ // do nothing
+ break;
+ }
}
return i;
}
@@ -574,14 +625,20 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_
{
llwchar wch = wchars[i];
- F32 char_width = mFontFreetype->getXAdvance(wch);
+ const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch);
+
+ // last character uses character width, since the whole character needs to be visible
+ // other characters just use advance
+ F32 width = (i == start)
+ ? (F32)(fgi->mWidth + fgi->mXBearing) // use actual width for last character
+ : fgi->mXAdvance; // use advance for all other characters
- if( scaled_max_pixels < (total_width + char_width) )
+ if( scaled_max_pixels < (total_width + width) )
{
break;
}
- total_width += char_width;
+ total_width += width;
drawable_chars++;
if( max_chars >= 0 && drawable_chars >= max_chars )
@@ -599,7 +656,17 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_
total_width = llround(total_width);
}
- return start_pos - drawable_chars;
+ if (drawable_chars == 0)
+ {
+ return start_pos; // just draw last character
+ }
+ else
+ {
+ // if only 1 character is drawable, we want to return start_pos as the first character to draw
+ // if 2 are drawable, return start_pos and character before start_pos, etc.
+ return start_pos + 1 - drawable_chars;
+ }
+
}
S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 target_x, F32 max_pixels, S32 max_chars, BOOL round) const
@@ -617,6 +684,8 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars);
F32 scaled_max_pixels = max_pixels * sScaleX;
+
+ const LLFontGlyphInfo* next_glyph = NULL;
S32 pos;
for (pos = begin_offset; pos < max_index; pos++)
@@ -626,7 +695,15 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
{
break; // done
}
- F32 char_width = mFontFreetype->getXAdvance(wch);
+
+ const LLFontGlyphInfo* glyph = next_glyph;
+ next_glyph = NULL;
+ if(!glyph)
+ {
+ glyph = mFontFreetype->getGlyphInfo(wch);
+ }
+
+ F32 char_width = mFontFreetype->getXAdvance(glyph);
if (round)
{
@@ -652,13 +729,14 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
if (((pos + 1) < max_index)
&& (wchars[(pos + 1)]))
{
- llwchar next_char = wchars[pos + 1];
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1]);
+ cur_x += mFontFreetype->getXKerning(glyph, next_glyph);
}
+
// Round after kerning.
- cur_x = (F32)llfloor(cur_x + 0.5f);
+ cur_x = llround(cur_x);
}
return llmin(max_chars, pos - begin_offset);
@@ -749,11 +827,41 @@ U8 LLFontGL::getStyleFromString(const std::string &style)
}
// static
+std::string LLFontGL::getStringFromStyle(U8 style)
+{
+ std::string style_string;
+ if (style & NORMAL)
+ {
+ style_string += "|NORMAL";
+ }
+ if (style & BOLD)
+ {
+ style_string += "|BOLD";
+ }
+ if (style & ITALIC)
+ {
+ style_string += "|ITALIC";
+ }
+ if (style & UNDERLINE)
+ {
+ style_string += "|UNDERLINE";
+ }
+ return style_string;
+}
+
+// static
std::string LLFontGL::nameFromFont(const LLFontGL* fontp)
{
return fontp->mFontDescriptor.getName();
}
+
+// static
+std::string LLFontGL::sizeFromFont(const LLFontGL* fontp)
+{
+ return fontp->mFontDescriptor.getSize();
+}
+
// static
std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align)
{
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 5f2c86c6c1..dfa4cf8ce5 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -122,7 +122,13 @@ public:
// The following are called often, frequently with large buffers, so do not use a string interface
// Returns the max number of complete characters from text (up to max_chars) that can be drawn in max_pixels
- S32 maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars = S32_MAX, BOOL end_on_word_boundary = FALSE) const;
+ typedef enum e_word_wrap_style
+ {
+ ONLY_WORD_BOUNDARIES,
+ WORD_BOUNDARY_IF_POSSIBLE,
+ ANYWHERE
+ } EWordWrapStyle ;
+ S32 maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars = S32_MAX, EWordWrapStyle end_on_word_boundary = ANYWHERE) const;
// Returns the index of the first complete characters from text that can be drawn in max_pixels
// given that the character at start_pos should be the last character (or as close to last as possible).
@@ -144,8 +150,10 @@ public:
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
static U8 getStyleFromString(const std::string &style);
+ static std::string getStringFromStyle(U8 style);
static std::string nameFromFont(const LLFontGL* fontp);
+ static std::string sizeFromFont(const LLFontGL* fontp);
static std::string nameFromHAlign(LLFontGL::HAlign align);
static LLFontGL::HAlign hAlignFromName(const std::string& name);
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 3400a72385..a3f7a946ec 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -332,6 +332,8 @@ LLGLManager::LLGLManager() :
mHasFragmentShader(FALSE),
mHasOcclusionQuery(FALSE),
mHasPointParameters(FALSE),
+ mHasDrawBuffers(FALSE),
+ mHasTextureRectangle(FALSE),
mHasAnisotropic(FALSE),
mHasARBEnvCombine(FALSE),
@@ -671,7 +673,7 @@ void LLGLManager::initExtensions()
llinfos << "initExtensions() checking shell variables to adjust features..." << llendl;
// Our extension support for the Linux Client is very young with some
// potential driver gotchas, so offer a semi-secret way to turn it off.
- if (getenv("LL_GL_NOEXT")) /* Flawfinder: ignore */
+ if (getenv("LL_GL_NOEXT"))
{
//mHasMultitexture = FALSE; // NEEDED!
mHasARBEnvCombine = FALSE;
@@ -1919,6 +1921,16 @@ LLGLDepthTest::LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled, G
: mPrevDepthEnabled(sDepthEnabled), mPrevDepthFunc(sDepthFunc), mPrevWriteEnabled(sWriteEnabled)
{
stop_glerror();
+
+ checkState();
+
+ if (!depth_enabled)
+ { // always disable depth writes if depth testing is disabled
+ // GL spec defines this as a requirement, but some implementations allow depth writes with testing disabled
+ // The proper way to write to depth buffer with testing disabled is to enable testing and use a depth_func of GL_ALWAYS
+ write_enabled = FALSE;
+ }
+
if (depth_enabled != sDepthEnabled)
{
gGL.flush();
@@ -1942,6 +1954,7 @@ LLGLDepthTest::LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled, G
LLGLDepthTest::~LLGLDepthTest()
{
+ checkState();
if (sDepthEnabled != mPrevDepthEnabled )
{
gGL.flush();
@@ -1963,6 +1976,32 @@ LLGLDepthTest::~LLGLDepthTest()
}
}
+void LLGLDepthTest::checkState()
+{
+ if (gDebugGL)
+ {
+ GLint func = 0;
+ GLboolean mask = FALSE;
+
+ glGetIntegerv(GL_DEPTH_FUNC, &func);
+ glGetBooleanv(GL_DEPTH_WRITEMASK, &mask);
+
+ if (glIsEnabled(GL_DEPTH_TEST) != sDepthEnabled ||
+ sWriteEnabled != mask ||
+ sDepthFunc != func)
+ {
+ if (gDebugSession)
+ {
+ gFailLog << "Unexpected depth testing state." << std::endl;
+ }
+ else
+ {
+ LL_GL_ERRS << "Unexpected depth testing state." << LL_ENDL;
+ }
+ }
+ }
+}
+
LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P)
{
for (U32 i = 0; i < 4; i++)
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 830617063b..ca92cb6580 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -70,7 +70,7 @@ hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
// LLGLSL Shader implementation
//===============================
LLGLSLShader::LLGLSLShader()
-: mProgramObject(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT)
+ : mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE)
{
}
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index 4a51cac438..968a37cab0 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -46,6 +46,8 @@ public:
~LLGLDepthTest();
+ void checkState();
+
GLboolean mPrevDepthEnabled;
GLenum mPrevDepthFunc;
GLboolean mPrevWriteEnabled;
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index e5fea5b995..36ac3ff119 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -43,7 +43,6 @@
#include "llmath.h"
#include "llgl.h"
#include "llrender.h"
-
//----------------------------------------------------------------------------
const F32 MIN_TEXTURE_LIFETIME = 10.f;
@@ -60,21 +59,34 @@ std::list<U32> LLImageGL::sDeadTextureList;
BOOL LLImageGL::sGlobalUseAnisotropic = FALSE;
F32 LLImageGL::sLastFrameTime = 0.f;
+BOOL LLImageGL::sAllowReadBackRaw = FALSE ;
LLImageGL* LLImageGL::sDefaultGLTexture = NULL ;
+
std::set<LLImageGL*> LLImageGL::sImageList;
-#if !LL_RELEASE_FOR_DOWNLOAD
+//****************************************************************************************************
+//The below for texture auditing use only
+//****************************************************************************************************
//-----------------------
//debug use
+BOOL gAuditTexture = FALSE ;
#define MAX_TEXTURE_LOG_SIZE 22 //2048 * 2048
std::vector<S32> LLImageGL::sTextureLoadedCounter(MAX_TEXTURE_LOG_SIZE + 1) ;
std::vector<S32> LLImageGL::sTextureBoundCounter(MAX_TEXTURE_LOG_SIZE + 1) ;
std::vector<S32> LLImageGL::sTextureCurBoundCounter(MAX_TEXTURE_LOG_SIZE + 1) ;
S32 LLImageGL::sCurTexSizeBar = -1 ;
S32 LLImageGL::sCurTexPickSize = -1 ;
-LLPointer<LLImageGL> LLImageGL::sDefaultTexturep = NULL;
+LLPointer<LLImageGL> LLImageGL::sHighlightTexturep = NULL;
+S32 LLImageGL::sMaxCatagories = 1 ;
+
+std::vector<S32> LLImageGL::sTextureMemByCategory;
+std::vector<S32> LLImageGL::sTextureMemByCategoryBound ;
+std::vector<S32> LLImageGL::sTextureCurMemByCategoryBound ;
//------------------------
-#endif
+//****************************************************************************************************
+//End for texture auditing use only
+//****************************************************************************************************
+
//**************************************************************************************
//below are functions for debug use
//do not delete them even though they are not currently being used.
@@ -144,6 +156,60 @@ void LLImageGL::checkTexSize() const
//**************************************************************************************
//----------------------------------------------------------------------------
+BOOL is_little_endian()
+{
+ S32 a = 0x12345678;
+ U8 *c = (U8*)(&a);
+
+ return (*c == 0x78) ;
+}
+//static
+void LLImageGL::initClass(S32 num_catagories)
+{
+ sMaxCatagories = num_catagories ;
+
+ sTextureMemByCategory.resize(sMaxCatagories);
+ sTextureMemByCategoryBound.resize(sMaxCatagories) ;
+ sTextureCurMemByCategoryBound.resize(sMaxCatagories) ;
+}
+
+//static
+void LLImageGL::cleanupClass()
+{
+ sTextureMemByCategory.clear() ;
+ sTextureMemByCategoryBound.clear() ;
+ sTextureCurMemByCategoryBound.clear() ;
+}
+
+//static
+void LLImageGL::setHighlightTexture(S32 category)
+{
+ const S32 dim = 128;
+ sHighlightTexturep = new LLImageGL() ;
+ LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3);
+ U8* data = image_raw->getData();
+ for (S32 i = 0; i<dim; i++)
+ {
+ for (S32 j = 0; j<dim; j++)
+ {
+ const S32 border = 2;
+ if (i<border || j<border || i>=(dim-border) || j>=(dim-border))
+ {
+ *data++ = 0xff;
+ *data++ = 0xff;
+ *data++ = 0xff;
+ }
+ else
+ {
+ *data++ = 0xff;
+ *data++ = 0xff;
+ *data++ = 0x00;
+ }
+ }
+ }
+ sHighlightTexturep->createGLTexture(0, image_raw, 0, TRUE, category);
+ image_raw = NULL;
+}
//static
S32 LLImageGL::dataFormatBits(S32 dataformat)
@@ -211,19 +277,31 @@ void LLImageGL::updateStats(F32 current_time)
sBoundTextureMemoryInBytes = sCurBoundTextureMemory;
sCurBoundTextureMemory = 0;
-#if !LL_RELEASE_FOR_DOWNLOAD
- for(U32 i = 0 ; i < sTextureCurBoundCounter.size() ; i++)
+ if(gAuditTexture)
{
- sTextureBoundCounter[i] = sTextureCurBoundCounter[i] ;
- sTextureCurBoundCounter[i] = 0 ;
+ for(U32 i = 0 ; i < sTextureCurBoundCounter.size() ; i++)
+ {
+ sTextureBoundCounter[i] = sTextureCurBoundCounter[i] ;
+ sTextureCurBoundCounter[i] = 0 ;
+ }
+ for(U32 i = 0 ; i < sTextureCurMemByCategoryBound.size() ; i++)
+ {
+ sTextureMemByCategoryBound[i] = sTextureCurMemByCategoryBound[i] ;
+ sTextureCurMemByCategoryBound[i] = 0 ;
+ }
}
-#endif
}
//static
-S32 LLImageGL::updateBoundTexMem(const S32 delta)
+S32 LLImageGL::updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category)
{
- LLImageGL::sCurBoundTextureMemory += delta;
+ if(gAuditTexture && ncomponents > 0 && category > -1)
+ {
+ sTextureCurBoundCounter[getTextureCounterIndex(mem / ncomponents)]++ ;
+ sTextureCurMemByCategoryBound[category] += mem ;
+ }
+
+ LLImageGL::sCurBoundTextureMemory += mem ;
return LLImageGL::sCurBoundTextureMemory;
}
@@ -237,6 +315,7 @@ void LLImageGL::destroyGL(BOOL save_state)
gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
}
+ sAllowReadBackRaw = true ;
for (std::set<LLImageGL*>::iterator iter = sImageList.begin();
iter != sImageList.end(); iter++)
{
@@ -246,7 +325,7 @@ void LLImageGL::destroyGL(BOOL save_state)
if (save_state && glimage->isGLTextureCreated() && glimage->mComponents)
{
glimage->mSaveData = new LLImageRaw;
- if(!glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false))
+ if(!glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false)) //necessary, keep it.
{
glimage->mSaveData = NULL ;
}
@@ -256,6 +335,7 @@ void LLImageGL::destroyGL(BOOL save_state)
stop_glerror();
}
}
+ sAllowReadBackRaw = false ;
}
//static
@@ -273,7 +353,7 @@ void LLImageGL::restoreGL()
{
if (glimage->getComponents() && glimage->mSaveData->getComponents())
{
- glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData);
+ glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData, 0, TRUE, glimage->getCategory());
stop_glerror();
}
glimage->mSaveData = NULL; // deletes data
@@ -348,45 +428,58 @@ LLImageGL::~LLImageGL()
void LLImageGL::init(BOOL usemipmaps)
{
-#ifdef DEBUG_MISS
- mMissed = FALSE;
-#endif
+ // keep these members in the same order as declared in llimagehl.h
+ // so that it is obvious by visual inspection if we forgot to
+ // init a field.
+
+ mTextureMemory = 0;
+ mLastBindTime = 0.f;
+
+ mPickMask = NULL;
+ mPickMaskWidth = 0;
+ mPickMaskHeight = 0;
+ mUseMipMaps = usemipmaps;
+ mHasExplicitFormat = FALSE;
+ mAutoGenMips = FALSE;
+
+ mIsMask = FALSE;
+ mNeedsAlphaAndPickMask = TRUE ;
+ mAlphaStride = 0 ;
+ mAlphaOffset = 0 ;
+
+ mGLTextureCreated = FALSE ;
+ mTexName = 0;
+ mWidth = 0;
+ mHeight = 0;
+ mCurrentDiscardLevel = -1;
+
+ mDiscardLevelInAtlas = -1 ;
+ mTexelsInAtlas = 0 ;
+ mTexelsInGLTexture = 0 ;
+
+ mTarget = GL_TEXTURE_2D;
+ mBindTarget = LLTexUnit::TT_TEXTURE;
+ mHasMipMaps = false;
- mPickMask = NULL;
- mTextureMemory = 0;
- mLastBindTime = 0.f;
+ mIsResident = 0;
- mTarget = GL_TEXTURE_2D;
- mBindTarget = LLTexUnit::TT_TEXTURE;
- mUseMipMaps = usemipmaps;
- mHasMipMaps = false;
- mAutoGenMips = FALSE;
- mTexName = 0;
- mIsResident = 0;
+ mComponents = 0;
+ mMaxDiscardLevel = MAX_DISCARD_LEVEL;
mTexOptionsDirty = true;
mAddressMode = LLTexUnit::TAM_WRAP;
mFilterOption = LLTexUnit::TFO_ANISOTROPIC;
- mWidth = 0;
- mHeight = 0;
- mComponents = 0;
-
- mMaxDiscardLevel = MAX_DISCARD_LEVEL;
- mCurrentDiscardLevel = -1;
mFormatInternal = -1;
mFormatPrimary = (LLGLenum) 0;
mFormatType = GL_UNSIGNED_BYTE;
mFormatSwapBytes = FALSE;
- mHasExplicitFormat = FALSE;
- mGLTextureCreated = FALSE ;
- mIsMask = FALSE;
- mNeedsAlphaAndPickMask = TRUE ;
+#ifdef DEBUG_MISS
+ mMissed = FALSE;
+#endif
- mDiscardLevelInAtlas = -1 ;
- mTexelsInAtlas = 0 ;
- mTexelsInGLTexture = 0 ;
+ mCategory = -1;
}
void LLImageGL::cleanup()
@@ -436,7 +529,12 @@ void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents)
// llwarns << "Setting Size of LLImageGL with existing mTexName = " << mTexName << llendl;
destroyGLTexture();
}
-
+
+ // pickmask validity depends on old image size, delete it
+ delete [] mPickMask;
+ mPickMask = NULL;
+ mPickMaskWidth = mPickMaskHeight = 0;
+
mWidth = width;
mHeight = height;
mComponents = ncomponents;
@@ -486,6 +584,10 @@ void LLImageGL::dump()
}
//----------------------------------------------------------------------------
+void LLImageGL::forceUpdateBindStats(void) const
+{
+ mLastBindTime = sLastFrameTime;
+}
BOOL LLImageGL::updateBindStats(S32 tex_mem) const
{
@@ -499,7 +601,7 @@ BOOL LLImageGL::updateBindStats(S32 tex_mem) const
{
// we haven't accounted for this texture yet this frame
sUniqueCount++;
- updateBoundTexMem(tex_mem);
+ updateBoundTexMem(tex_mem, mComponents, mCategory);
mLastBindTime = sLastFrameTime;
return TRUE ;
@@ -525,6 +627,8 @@ void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_for
else
mFormatType = type_format;
mFormatSwapBytes = swap_bytes;
+
+ calcAlphaChannelOffsetAndStride() ;
}
//----------------------------------------------------------------------------
@@ -540,7 +644,6 @@ void LLImageGL::setImage(const LLImageRaw* imageraw)
void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
{
- llpushcallstacks ;
bool is_compressed = false;
if (mFormatPrimary >= GL_COMPRESSED_RGBA_S3TC_DXT1_EXT && mFormatPrimary <= GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
{
@@ -749,7 +852,6 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
}
stop_glerror();
mGLTextureCreated = true;
- llpushcallstacks ;
}
BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
@@ -840,7 +942,6 @@ void LLImageGL::postAddToAtlas()
BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update)
{
- llpushcallstacks ;
if (!width || !height)
{
return TRUE;
@@ -930,7 +1031,6 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
stop_glerror();
mGLTextureCreated = true;
}
- llpushcallstacks ;
return TRUE;
}
@@ -942,8 +1042,9 @@ BOOL LLImageGL::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S3
// Copy sub image from frame buffer
BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- if (gGL.getTexUnit(0)->bind(this))
+ if (gGL.getTexUnit(0)->bind(this, false, true))
{
+ //checkTexSize() ;
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
mGLTextureCreated = true;
stop_glerror();
@@ -1007,7 +1108,7 @@ BOOL LLImageGL::createGLTexture()
return TRUE ;
}
-BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/)
+BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/, BOOL to_create, S32 category)
{
if (gGLManager.mIsDisabled)
{
@@ -1027,8 +1128,10 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel);
// Actual image width/height = raw image width/height * 2^discard_level
- S32 w = imageraw->getWidth() << discard_level;
- S32 h = imageraw->getHeight() << discard_level;
+ S32 raw_w = imageraw->getWidth() ;
+ S32 raw_h = imageraw->getHeight() ;
+ S32 w = raw_w << discard_level;
+ S32 h = raw_h << discard_level;
// setSize may call destroyGLTexture if the size does not match
setSize(w, h, imageraw->getComponents());
@@ -1062,15 +1165,25 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
default:
llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl;
}
+
+ calcAlphaChannelOffsetAndStride() ;
+ }
+
+ if(!to_create) //not create a gl texture
+ {
+ destroyGLTexture();
+ mCurrentDiscardLevel = discard_level;
+ mLastBindTime = sLastFrameTime;
+ return TRUE ;
}
+ setCategory(category) ;
const U8* rawdata = imageraw->getData();
return createGLTexture(discard_level, rawdata, FALSE, usename);
}
BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_hasmips, S32 usename)
{
- llpushcallstacks ;
llassert(data_in);
if (discard_level < 0)
@@ -1137,11 +1250,14 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
if (old_name != 0)
{
sGlobalTextureMemoryInBytes -= mTextureMemory;
-#if !LL_RELEASE_FOR_DOWNLOAD
- decTextureCounter(mTextureMemory / mComponents) ;
-#endif
+
+ if(gAuditTexture)
+ {
+ decTextureCounter(mTextureMemory, mComponents, mCategory) ;
+ }
LLImageGL::deleteTextures(1, &old_name);
+
stop_glerror();
}
@@ -1149,82 +1265,20 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
sGlobalTextureMemoryInBytes += mTextureMemory;
mTexelsInGLTexture = getWidth() * getHeight() ;
-#if !LL_RELEASE_FOR_DOWNLOAD
- incTextureCounter(mTextureMemory / mComponents) ;
-#endif
-
+ if(gAuditTexture)
+ {
+ incTextureCounter(mTextureMemory, mComponents, mCategory) ;
+ }
// mark this as bound at this point, so we don't throw it out immediately
mLastBindTime = sLastFrameTime;
-
- llpushcallstacks ;
return TRUE;
}
-BOOL LLImageGL::setDiscardLevel(S32 discard_level)
-{
- llassert(discard_level >= 0);
- llassert(mCurrentDiscardLevel >= 0);
-
- discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel);
-
- if (discard_level == mCurrentDiscardLevel)
- {
- // nothing to do
- return FALSE;
- }
- else if (discard_level < mCurrentDiscardLevel)
- {
- // larger image
- dump();
- llerrs << "LLImageGL::setDiscardLevel() called with larger discard level; use createGLTexture()" << llendl;
- return FALSE;
- }
- else if (mUseMipMaps)
- {
- LLPointer<LLImageRaw> imageraw = new LLImageRaw;
- while(discard_level > mCurrentDiscardLevel)
- {
- if (readBackRaw(discard_level, imageraw, false))
- {
- break;
- }
- discard_level--;
- }
- if (discard_level == mCurrentDiscardLevel)
- {
- // unable to increase the discard level
- return FALSE;
- }
- return createGLTexture(discard_level, imageraw);
- }
- else
- {
-#if !LL_LINUX && !LL_SOLARIS
- // *FIX: This should not be skipped for the linux client.
- llerrs << "LLImageGL::setDiscardLevel() called on image without mipmaps" << llendl;
-#endif
- return FALSE;
- }
-}
-
-BOOL LLImageGL::isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents)
-{
- assert_glerror();
- S32 gl_discard = discard_level - mCurrentDiscardLevel;
- LLGLint glwidth = 0;
- glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth);
- LLGLint glheight = 0;
- glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_HEIGHT, (GLint*)&glheight);
- LLGLint glcomponents = 0 ;
- glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&glcomponents);
- assert_glerror();
-
- return glwidth >= image_width && glheight >= image_height && (GL_RGB8 == glcomponents || GL_RGBA8 == glcomponents) ;
-}
-
BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const
{
- llpushcallstacks ;
+ llassert_always(sAllowReadBackRaw) ;
+ //llerrs << "should not call this function!" << llendl ;
+
if (discard_level < 0)
{
discard_level = mCurrentDiscardLevel;
@@ -1327,7 +1381,7 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
return FALSE ;
}
//-----------------------------------------------------------------------------------------------
- llpushcallstacks ;
+
return TRUE ;
}
@@ -1345,25 +1399,26 @@ void LLImageGL::deleteDeadTextures()
stop_glerror();
}
}
-
+
glDeleteTextures(1, &tex);
stop_glerror();
}
}
-
+
void LLImageGL::destroyGLTexture()
{
if (mTexName != 0)
{
if(mTextureMemory)
{
-#if !LL_RELEASE_FOR_DOWNLOAD
- decTextureCounter(mTextureMemory / mComponents) ;
-#endif
+ if(gAuditTexture)
+ {
+ decTextureCounter(mTextureMemory, mComponents, mCategory) ;
+ }
sGlobalTextureMemoryInBytes -= mTextureMemory;
mTextureMemory = 0;
}
-
+
LLImageGL::deleteTextures(1, &mTexName);
mTexName = 0;
mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
@@ -1479,6 +1534,11 @@ S32 LLImageGL::getMipBytes(S32 discard_level) const
return res;
}
+BOOL LLImageGL::isJustBound() const
+{
+ return (BOOL)(sLastFrameTime - mLastBindTime < 0.5f);
+}
+
BOOL LLImageGL::getBoundRecently() const
{
return (BOOL)(sLastFrameTime - mLastBindTime < MIN_TEXTURE_LIFETIME);
@@ -1490,44 +1550,104 @@ void LLImageGL::setTarget(const LLGLenum target, const LLTexUnit::eTextureType b
mBindTarget = bind_target;
}
-void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h)
+const S8 INVALID_OFFSET = -99 ;
+void LLImageGL::setNeedsAlphaAndPickMask(BOOL need_mask)
{
- if(!mNeedsAlphaAndPickMask)
+ if(mNeedsAlphaAndPickMask != need_mask)
{
- return ;
+ mNeedsAlphaAndPickMask = need_mask;
+
+ if(mNeedsAlphaAndPickMask)
+ {
+ mAlphaOffset = 0 ;
+ }
+ else //do not need alpha mask
+ {
+ mAlphaOffset = INVALID_OFFSET ;
+ mIsMask = FALSE;
+ }
}
+}
- if (mFormatType != GL_UNSIGNED_BYTE)
+void LLImageGL::calcAlphaChannelOffsetAndStride()
+{
+ if(mAlphaOffset == INVALID_OFFSET)//do not need alpha mask
{
- llwarns << "Cannot analyze alpha for image with format type " << std::hex << mFormatType << std::dec << llendl;
+ return ;
}
- U32 stride = 0;
+ mAlphaStride = -1 ;
switch (mFormatPrimary)
{
case GL_LUMINANCE:
case GL_ALPHA:
- stride = 1;
+ mAlphaStride = 1;
break;
case GL_LUMINANCE_ALPHA:
- stride = 2;
+ mAlphaStride = 2;
break;
case GL_RGB:
- //no alpha
+ mNeedsAlphaAndPickMask = FALSE ;
mIsMask = FALSE;
- return;
+ return ; //no alpha channel.
case GL_RGBA:
- stride = 4;
+ mAlphaStride = 4;
break;
case GL_BGRA_EXT:
- stride = 4;
+ mAlphaStride = 4;
break;
default:
- return;
+ break;
+ }
+
+ mAlphaOffset = -1 ;
+ if (mFormatType == GL_UNSIGNED_BYTE)
+ {
+ mAlphaOffset = mAlphaStride - 1 ;
+ }
+ else if(is_little_endian())
+ {
+ if (mFormatType == GL_UNSIGNED_INT_8_8_8_8)
+ {
+ mAlphaOffset = 0 ;
+ }
+ else if (mFormatType == GL_UNSIGNED_INT_8_8_8_8_REV)
+ {
+ mAlphaOffset = 3 ;
+ }
+ }
+ else //big endian
+ {
+ if (mFormatType == GL_UNSIGNED_INT_8_8_8_8)
+ {
+ mAlphaOffset = 3 ;
+ }
+ else if (mFormatType == GL_UNSIGNED_INT_8_8_8_8_REV)
+ {
+ mAlphaOffset = 0 ;
+ }
+ }
+
+ if( mAlphaStride < 1 || //unsupported format
+ mAlphaOffset < 0 || //unsupported type
+ (mFormatPrimary == GL_BGRA_EXT && mFormatType != GL_UNSIGNED_BYTE)) //unknown situation
+ {
+ llwarns << "Cannot analyze alpha for image with format type " << std::hex << mFormatType << std::dec << llendl;
+
+ mNeedsAlphaAndPickMask = FALSE ;
+ mIsMask = FALSE;
+ }
+}
+
+void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h)
+{
+ if(!mNeedsAlphaAndPickMask)
+ {
+ return ;
}
U32 length = w * h;
- const GLubyte* current = ((const GLubyte*) data_in)+stride-1;
+ const GLubyte* current = ((const GLubyte*) data_in) + mAlphaOffset ;
S32 sample[16];
memset(sample, 0, sizeof(S32)*16);
@@ -1535,7 +1655,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h)
for (U32 i = 0; i < length; i++)
{
++sample[*current/16];
- current += stride;
+ current += mAlphaStride ;
}
U32 total = 0;
@@ -1562,24 +1682,25 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
return ;
}
+ delete [] mPickMask;
+ mPickMask = NULL;
+ mPickMaskWidth = mPickMaskHeight = 0;
+
if (mFormatType != GL_UNSIGNED_BYTE ||
- mFormatPrimary != GL_RGBA)
+ mFormatPrimary != GL_RGBA)
{
//cannot generate a pick mask for this texture
- delete [] mPickMask;
- mPickMask = NULL;
return;
}
- U32 pick_width = width/2;
- U32 pick_height = height/2;
-
- U32 size = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1);
+ U32 pick_width = width/2 + 1;
+ U32 pick_height = height/2 + 1;
- size = size/8 + 1;
-
- delete[] mPickMask;
+ U32 size = pick_width * pick_height;
+ size = (size + 7) / 8; // pixelcount-to-bits
mPickMask = new U8[size];
+ mPickMaskWidth = pick_width;
+ mPickMaskHeight = pick_height;
memset(mPickMask, 0, sizeof(U8) * size);
@@ -1595,10 +1716,7 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
{
U32 pick_idx = pick_bit/8;
U32 pick_offset = pick_bit%8;
- if (pick_idx >= size)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(pick_idx < size);
mPickMask[pick_idx] |= 1 << pick_offset;
}
@@ -1614,22 +1732,34 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
if (mPickMask)
{
- S32 width = getWidth()/2;
- S32 height = getHeight()/2;
-
F32 u = tc.mV[0] - floorf(tc.mV[0]);
F32 v = tc.mV[1] - floorf(tc.mV[1]);
- if (u < 0.f || u > 1.f ||
- v < 0.f || v > 1.f)
+ if (LL_UNLIKELY(u < 0.f || u > 1.f ||
+ v < 0.f || v > 1.f))
{
- llerrs << "WTF?" << llendl;
+ LL_WARNS_ONCE("render") << "Ugh, u/v out of range in image mask pick" << LL_ENDL;
+ u = v = 0.f;
+ llassert(false);
}
+
+ llassert(mPickMaskWidth > 0 && mPickMaskHeight > 0);
- S32 x = (S32)(u * width);
- S32 y = (S32)(v * height);
+ S32 x = llfloor(u * mPickMaskWidth);
+ S32 y = llfloor(v * mPickMaskHeight);
- S32 idx = y*width+x;
+ if (LL_UNLIKELY(x >= mPickMaskWidth))
+ {
+ LL_WARNS_ONCE("render") << "Ooh, width overrun on pick mask read, that coulda been bad." << LL_ENDL;
+ x = llmax(0, mPickMaskWidth-1);
+ }
+ if (LL_UNLIKELY(y >= mPickMaskHeight))
+ {
+ LL_WARNS_ONCE("render") << "Ooh, height overrun on pick mask read, that woulda been bad." << LL_ENDL;
+ y = llmax(0, mPickMaskHeight-1);
+ }
+
+ S32 idx = y*mPickMaskWidth+x;
S32 offset = idx%8;
res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE;
@@ -1638,8 +1768,30 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
return res;
}
-//----------------------------------------------------------------------------
-#if !LL_RELEASE_FOR_DOWNLOAD
+void LLImageGL::setCategory(S32 category)
+{
+ if(!gAuditTexture)
+ {
+ return ;
+ }
+ if(mCategory != category)
+ {
+ if(mCategory > -1)
+ {
+ sTextureMemByCategory[mCategory] -= mTextureMemory ;
+ }
+ if(category > -1 && category < sMaxCatagories)
+ {
+ sTextureMemByCategory[category] += mTextureMemory ;
+ mCategory = category;
+ }
+ else
+ {
+ mCategory = -1 ;
+ }
+ }
+}
+
//for debug use
//val is a "power of two" number
S32 LLImageGL::getTextureCounterIndex(U32 val)
@@ -1663,18 +1815,33 @@ S32 LLImageGL::getTextureCounterIndex(U32 val)
return ret ;
}
}
-void LLImageGL::incTextureCounter(U32 val)
+
+//static
+void LLImageGL::incTextureCounter(U32 val, S32 ncomponents, S32 category)
{
sTextureLoadedCounter[getTextureCounterIndex(val)]++ ;
+ sTextureMemByCategory[category] += (S32)val * ncomponents ;
}
-void LLImageGL::decTextureCounter(U32 val)
+
+//static
+void LLImageGL::decTextureCounter(U32 val, S32 ncomponents, S32 category)
{
sTextureLoadedCounter[getTextureCounterIndex(val)]-- ;
+ sTextureMemByCategory[category] += (S32)val * ncomponents ;
}
-void LLImageGL::setCurTexSizebar(S32 index)
+
+void LLImageGL::setCurTexSizebar(S32 index, BOOL set_pick_size)
{
sCurTexSizeBar = index ;
- sCurTexPickSize = (1 << index) ;
+
+ if(set_pick_size)
+ {
+ sCurTexPickSize = (1 << index) ;
+ }
+ else
+ {
+ sCurTexPickSize = -1 ;
+ }
}
void LLImageGL::resetCurTexSizebar()
{
@@ -1682,7 +1849,9 @@ void LLImageGL::resetCurTexSizebar()
sCurTexPickSize = -1 ;
}
//----------------------------------------------------------------------------
-#endif
+
+//----------------------------------------------------------------------------
+
// Manual Mip Generation
/*
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index a094605607..f0870c3fc4 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -47,7 +47,6 @@ class LLTextureAtlas ;
#define MEGA_BYTES_TO_BYTES(x) ((x) << 20)
//============================================================================
-
class LLImageGL : public LLRefCount
{
friend class LLTexUnit;
@@ -63,6 +62,7 @@ public:
BOOL updateBindStats(S32 tex_mem) const ;
F32 getTimePassedSinceLastBound();
+ void forceUpdateBindStats(void) const;
// needs to be called every frame
static void updateStats(F32 current_time);
@@ -71,8 +71,9 @@ public:
static void destroyGL(BOOL save_state = TRUE);
static void restoreGL();
- // Sometimes called externally for textures not using LLImageGL (should go away...)
- static S32 updateBoundTexMem(const S32 delta);
+ // Sometimes called externally for textures not using LLImageGL (should go away...)
+ static S32 updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) ;
+
static bool checkSize(S32 width, S32 height);
//for server side use only.
@@ -91,6 +92,7 @@ protected:
virtual ~LLImageGL();
void analyzeAlpha(const void* data_in, S32 w, S32 h);
+ void calcAlphaChannelOffsetAndStride();
public:
virtual void dump(); // debugging info to llinfos
@@ -105,14 +107,15 @@ public:
static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels);
BOOL createGLTexture() ;
- BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0);
+ BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE,
+ S32 category = sMaxCatagories - 1);
BOOL createGLTexture(S32 discard_level, const U8* data, BOOL data_hasmips = FALSE, S32 usename = 0);
void setImage(const LLImageRaw* imageraw);
void setImage(const U8* data_in, BOOL data_hasmips = FALSE);
BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update = FALSE);
BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update = FALSE);
BOOL setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height);
- BOOL setDiscardLevel(S32 discard_level);
+
// Read back a raw image for this discard level, if it exists
BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const;
void destroyGLTexture();
@@ -131,6 +134,7 @@ public:
S32 getBytes(S32 discard_level = -1) const;
S32 getMipBytes(S32 discard_level = -1) const;
BOOL getBoundRecently() const;
+ BOOL isJustBound() const;
LLGLenum getPrimaryFormat() const { return mFormatPrimary; }
LLGLenum getFormatType() const { return mFormatType; }
@@ -150,8 +154,6 @@ public:
BOOL getUseMipMaps() const { return mUseMipMaps; }
void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; }
- BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ;
-
void updatePickMask(S32 width, S32 height, const U8* data_in);
BOOL getMask(const LLVector2 &tc);
@@ -178,7 +180,7 @@ public:
void init(BOOL usemipmaps);
virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors
- void setNeedsAlphaAndPickMask(BOOL need_mask) {mNeedsAlphaAndPickMask = need_mask;}
+ void setNeedsAlphaAndPickMask(BOOL need_mask);
BOOL preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image);
void postAddToAtlas() ;
@@ -187,23 +189,27 @@ public:
// Various GL/Rendering options
S32 mTextureMemory;
mutable F32 mLastBindTime; // last time this was bound, by discard level
-
+
private:
LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL
U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel
+ U16 mPickMaskWidth;
+ U16 mPickMaskHeight;
S8 mUseMipMaps;
S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents)
S8 mAutoGenMips;
BOOL mIsMask;
BOOL mNeedsAlphaAndPickMask;
-
+ S8 mAlphaStride ;
+ S8 mAlphaOffset ;
+
bool mGLTextureCreated ;
LLGLuint mTexName;
U16 mWidth;
U16 mHeight;
S8 mCurrentDiscardLevel;
-
+
S8 mDiscardLevelInAtlas;
U32 mTexelsInAtlas ;
U32 mTexelsInGLTexture;
@@ -220,7 +226,7 @@ protected:
bool mTexOptionsDirty;
LLTexUnit::eTextureAddressMode mAddressMode; // Defaults to TAM_WRAP
- LLTexUnit::eTextureFilterOptions mFilterOption; // Defaults to TFO_TRILINEAR
+ LLTexUnit::eTextureFilterOptions mFilterOption; // Defaults to TFO_ANISOTROPIC
LLGLint mFormatInternal; // = GL internalformat
LLGLenum mFormatPrimary; // = GL format (pixel data format)
@@ -233,7 +239,7 @@ public:
static S32 sCount;
static F32 sLastFrameTime;
-
+
static LLGLuint sCurrentBoundTextures[MAX_GL_TEXTURE_UNITS]; // Currently bound texture ID
// Global memory statistics
@@ -246,30 +252,61 @@ public:
static LLImageGL* sDefaultGLTexture ;
static BOOL sAutomatedTest;
-#if !LL_RELEASE_FOR_DOWNLOAD
+#if DEBUG_MISS
+ BOOL mMissed; // Missed on last bind?
+ BOOL getMissed() const { return mMissed; };
+#else
+ BOOL getMissed() const { return FALSE; };
+#endif
+
+public:
+ static void initClass(S32 num_catagories) ;
+ static void cleanupClass() ;
+private:
+ static S32 sMaxCatagories ;
+
+ //the flag to allow to call readBackRaw(...).
+ //can be removed if we do not use that function at all.
+ static BOOL sAllowReadBackRaw ;
+//
+//****************************************************************************************************
+//The below for texture auditing use only
+//****************************************************************************************************
+private:
+ S32 mCategory ;
+public:
+ void setCategory(S32 category) ;
+ S32 getCategory()const {return mCategory ;}
+
//for debug use: show texture size distribution
//----------------------------------------
- static LLPointer<LLImageGL> sDefaultTexturep; //default texture to replace normal textures
+ static LLPointer<LLImageGL> sHighlightTexturep; //default texture to replace normal textures
static std::vector<S32> sTextureLoadedCounter ;
static std::vector<S32> sTextureBoundCounter ;
static std::vector<S32> sTextureCurBoundCounter ;
static S32 sCurTexSizeBar ;
static S32 sCurTexPickSize ;
-
+
+ static void setHighlightTexture(S32 category) ;
static S32 getTextureCounterIndex(U32 val) ;
- static void incTextureCounter(U32 val) ;
- static void decTextureCounter(U32 val) ;
- static void setCurTexSizebar(S32 index) ;
+ static void incTextureCounter(U32 val, S32 ncomponents, S32 category) ;
+ static void decTextureCounter(U32 val, S32 ncomponents, S32 category) ;
+ static void setCurTexSizebar(S32 index, BOOL set_pick_size = TRUE) ;
static void resetCurTexSizebar();
//----------------------------------------
-#endif
-#if DEBUG_MISS
- BOOL mMissed; // Missed on last bind?
- BOOL getMissed() const { return mMissed; };
-#else
- BOOL getMissed() const { return FALSE; };
-#endif
+ //for debug use: show texture category distribution
+ //----------------------------------------
+
+ static std::vector<S32> sTextureMemByCategory;
+ static std::vector<S32> sTextureMemByCategoryBound ;
+ static std::vector<S32> sTextureCurMemByCategoryBound ;
+ //----------------------------------------
+//****************************************************************************************************
+//End of definitions for texture auditing use only
+//****************************************************************************************************
+
};
+extern BOOL gAuditTexture;
#endif // LL_LLIMAGEGL_H
diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp
index 7f4be6a866..bc7f30cdef 100644
--- a/indra/llrender/llpostprocess.cpp
+++ b/indra/llrender/llpostprocess.cpp
@@ -59,6 +59,8 @@ LLPostProcess::LLPostProcess(void) :
mSceneRenderTexture = NULL ;
mNoiseTexture = NULL ;
mTempBloomTexture = NULL ;
+
+ noiseTextureScale = 1.0f;
/* Do nothing. Needs to be updated to use our current shader system, and to work with the move into llrender.
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", XML_FILENAME));
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index b74d824c9e..595b8577ff 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -162,6 +162,8 @@ void LLTexUnit::enable(eTextureType type)
disable(); // Force a disable of a previous texture type if it's enabled.
}
mCurrTexType = type;
+
+ gGL.flush();
glEnable(sGLTextureType[type]);
}
}
@@ -179,7 +181,7 @@ void LLTexUnit::disable(void)
}
}
-bool LLTexUnit::bind(LLTexture* texture, bool forceBind)
+bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind)
{
stop_glerror();
if (mIndex < 0) return false;
@@ -198,9 +200,19 @@ bool LLTexUnit::bind(LLTexture* texture, bool forceBind)
//if deleted, will re-generate it immediately
texture->forceImmediateUpdate() ;
+ gl_tex->forceUpdateBindStats() ;
return texture->bindDefaultImage(mIndex);
}
+ //in audit, replace the selected texture by the default one.
+ if(gAuditTexture && for_rendering && LLImageGL::sCurTexPickSize > 0)
+ {
+ if(texture->getWidth() * texture->getHeight() == LLImageGL::sCurTexPickSize)
+ {
+ gl_tex->updateBindStats(gl_tex->mTextureMemory);
+ return bind(LLImageGL::sHighlightTexturep.get());
+ }
+ }
if ((mCurrTexture != gl_tex->getTexName()) || forceBind)
{
activate();
@@ -223,7 +235,7 @@ bool LLTexUnit::bind(LLTexture* texture, bool forceBind)
return true;
}
-bool LLTexUnit::bind(LLImageGL* texture, bool forceBind)
+bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
{
stop_glerror();
if (mIndex < 0) return false;
@@ -260,6 +272,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool forceBind)
setTextureFilteringOption(texture->mFilterOption);
}
}
+
return true;
}
@@ -720,8 +733,11 @@ void LLTexUnit::debugTextureUnit(void)
LLRender::LLRender()
-: mDirty(false), mCount(0), mMode(LLRender::TRIANGLES),
- mMaxAnisotropy(0.f)
+ : mDirty(false),
+ mCount(0),
+ mMode(LLRender::TRIANGLES),
+ mCurrTextureUnitIndex(0),
+ mMaxAnisotropy(0.f)
{
mBuffer = new LLVertexBuffer(immediate_mask, 0);
mBuffer->allocateBuffer(4096, 0, TRUE);
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index cb2a4d4450..0121a190ee 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -149,8 +149,8 @@ public:
// Binds the LLImageGL to this texture unit
// (automatically enables the unit for the LLImageGL's texture type)
- bool bind(LLImageGL* texture, bool forceBind = false);
- bool bind(LLTexture* texture, bool forceBind = false);
+ bool bind(LLImageGL* texture, bool for_rendering = false, bool forceBind = false);
+ bool bind(LLTexture* texture, bool for_rendering = false, bool forceBind = false);
// Binds a cubemap to this texture unit
// (automatically enables the texture unit for cubemaps)
diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h
index c18917b663..7034e9199d 100644
--- a/indra/llrender/lltexture.h
+++ b/indra/llrender/lltexture.h
@@ -61,7 +61,9 @@ public:
//
//interfaces to access LLViewerTexture
//
- virtual bool bindDefaultImage(const S32 stage = 0) const = 0 ;
+ virtual S8 getType() const = 0 ;
+ virtual void setKnownDrawSize(S32 width, S32 height) = 0 ;
+ virtual bool bindDefaultImage(const S32 stage = 0) = 0 ;
virtual void forceImmediateUpdate() = 0 ;
virtual void setActive() = 0 ;
virtual S32 getWidth(S32 discard_level = -1) const = 0 ;
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index db4189dfea..bf5eda21eb 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -215,14 +215,18 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
{
+ llassert(mRequestedNumVerts >= 0);
+
if (start >= (U32) mRequestedNumVerts ||
- end >= (U32) mRequestedNumVerts)
+ end >= (U32) mRequestedNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl;
}
+ llassert(mRequestedNumIndices >= 0);
+
if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ indices_offset + count > (U32) mRequestedNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
@@ -237,7 +241,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
llerrs << "Wrong vertex buffer bound." << llendl;
}
- if (mode > LLRender::NUM_MODES)
+ if (mode >= LLRender::NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
return;
@@ -251,8 +255,9 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
+ llassert(mRequestedNumIndices >= 0);
if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ indices_offset + count > (U32) mRequestedNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
@@ -267,7 +272,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
llerrs << "Wrong vertex buffer bound." << llendl;
}
- if (mode > LLRender::NUM_MODES)
+ if (mode >= LLRender::NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
return;
@@ -281,8 +286,9 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
+ llassert(mRequestedNumVerts >= 0);
if (first >= (U32) mRequestedNumVerts ||
- first + count > (U32) mRequestedNumVerts)
+ first + count > (U32) mRequestedNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << llendl;
}
@@ -292,7 +298,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
llerrs << "Wrong vertex buffer bound." << llendl;
}
- if (mode > LLRender::NUM_MODES)
+ if (mode >= LLRender::NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
return;
@@ -354,7 +360,14 @@ void LLVertexBuffer::clientCopy(F64 max_time)
LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
LLRefCount(),
- mNumVerts(0), mNumIndices(0), mUsage(usage), mGLBuffer(0), mGLIndices(0),
+
+ mNumVerts(0),
+ mNumIndices(0),
+ mRequestedNumVerts(-1),
+ mRequestedNumIndices(-1),
+ mUsage(usage),
+ mGLBuffer(0),
+ mGLIndices(0),
mMappedData(NULL),
mMappedIndexData(NULL), mLocked(FALSE),
mFinal(FALSE),
@@ -600,6 +613,8 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_VERTS);
+ llassert(nverts >= 0);
+
if (nverts >= 65535)
{
llwarns << "Vertex buffer overflow!" << llendl;
@@ -628,6 +643,9 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
void LLVertexBuffer::updateNumIndices(S32 nindices)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_INDICES);
+
+ llassert(nindices >= 0);
+
mRequestedNumIndices = nindices;
if (!mDynamicSize)
{
@@ -668,6 +686,9 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
{
+ llassert(newnverts >= 0);
+ llassert(newnindices >= 0);
+
mRequestedNumVerts = newnverts;
mRequestedNumIndices = newnindices;
@@ -1061,17 +1082,20 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
}
}
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLIndices)
+ if (mGLIndices)
{
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL index buffer bound: " << buff << std::endl;
- }
- else
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
+ if ((GLuint)buff != mGLIndices)
{
- llerrs << "Invalid GL index buffer bound: " << buff << llendl;
+ if (gDebugSession)
+ {
+ error = TRUE;
+ gFailLog << "Invalid GL index buffer bound: " << buff << std::endl;
+ }
+ else
+ {
+ llerrs << "Invalid GL index buffer bound: " << buff << llendl;
+ }
}
}
}
@@ -1095,17 +1119,20 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
}
}
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLIndices)
+ if (mGLIndices != 0)
{
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL index buffer bound: "<< std::endl;
- }
- else
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
+ if ((GLuint)buff != mGLIndices)
{
- llerrs << "Invalid GL index buffer bound: " << buff << llendl;
+ if (gDebugSession)
+ {
+ error = TRUE;
+ gFailLog << "Invalid GL index buffer bound: "<< std::endl;
+ }
+ else
+ {
+ llerrs << "Invalid GL index buffer bound: " << buff << llendl;
+ }
}
}
}
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index f0b4436df5..853f6f173d 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -26,7 +26,8 @@ include_directories(
)
set(llui_SOURCE_FILES
- llalertdialog.cpp
+ llaccordionctrl.cpp
+ llaccordionctrltab.cpp
llbutton.cpp
llcheckboxctrl.cpp
llclipboard.cpp
@@ -60,6 +61,7 @@ set(llui_SOURCE_FILES
llmultisliderctrl.cpp
llnotifications.cpp
llnotificationslistener.cpp
+ llnotificationsutil.cpp
llpanel.cpp
llprogressbar.cpp
llradiogroup.cpp
@@ -88,6 +90,7 @@ set(llui_SOURCE_FILES
lltextbox.cpp
lltexteditor.cpp
lltextparser.cpp
+ lltextvalidate.cpp
lltransutil.cpp
lltoggleablemenu.cpp
lltooltip.cpp
@@ -111,7 +114,8 @@ set(llui_SOURCE_FILES
set(llui_HEADER_FILES
CMakeLists.txt
- llalertdialog.h
+ llaccordionctrl.h
+ llaccordionctrltab.h
llbutton.h
llcallbackmap.h
llcheckboxctrl.h
@@ -147,8 +151,10 @@ set(llui_HEADER_FILES
llmultifloater.h
llmultisliderctrl.h
llmultislider.h
+ llnotificationptr.h
llnotifications.h
llnotificationslistener.h
+ llnotificationsutil.h
llpanel.h
llprogressbar.h
llradiogroup.h
@@ -177,6 +183,7 @@ set(llui_HEADER_FILES
lltextbox.h
lltexteditor.h
lltextparser.h
+ lltextvalidate.h
lltoggleablemenu.h
lltooltip.h
lltransutil.h
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
new file mode 100644
index 0000000000..d0c73fbfbc
--- /dev/null
+++ b/indra/llui/llaccordionctrl.cpp
@@ -0,0 +1,653 @@
+/**
+ * @file llaccordionctrl.cpp
+ * @brief Accordion panel implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+
+#include "lluictrlfactory.h" // builds floaters from XML
+
+#include "llwindow.h"
+#include "llfocusmgr.h"
+#include "lllocalcliprect.h"
+
+#include "boost/bind.hpp"
+
+static const S32 DRAGGER_BAR_MARGIN = 4;
+static const S32 DRAGGER_BAR_HEIGHT = 5;
+static const S32 BORDER_MARGIN = 2;
+static const S32 PARENT_BORDER_MARGIN = 5;
+
+static const S32 panel_delta = DRAGGER_BAR_MARGIN; // Distanse between two panels
+
+static const S32 HORIZONTAL_MULTIPLE = 8;
+static const S32 VERTICAL_MULTIPLE = 16;
+static const F32 MIN_AUTO_SCROLL_RATE = 120.f;
+static const F32 MAX_AUTO_SCROLL_RATE = 500.f;
+static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
+
+
+// LLAccordionCtrl =================================================================|
+
+static LLDefaultChildRegistry::Register<LLAccordionCtrl> t2("accordion");
+
+
+LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
+ , mFitParent(params.fit_parent)
+ , mAutoScrolling( false )
+ , mAutoScrollRate( 0.f )
+{
+ mSingleExpansion = params.single_expansion;
+ if(mFitParent && !mSingleExpansion)
+ {
+ llinfos << "fit_parent works best when combined with single_expansion" << llendl;
+ }
+}
+
+LLAccordionCtrl::LLAccordionCtrl() : LLPanel()
+ , mAutoScrolling( false )
+ , mAutoScrollRate( 0.f )
+{
+ mSingleExpansion = false;
+ mFitParent = false;
+ LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml");
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::draw()
+{
+ if (mAutoScrolling)
+ {
+ // add acceleration to autoscroll
+ mAutoScrollRate = llmin(mAutoScrollRate + (LLFrameTimer::getFrameDeltaTimeF32() * AUTO_SCROLL_RATE_ACCEL), MAX_AUTO_SCROLL_RATE);
+ }
+ else
+ {
+ // reset to minimum for next time
+ mAutoScrollRate = MIN_AUTO_SCROLL_RATE;
+ }
+ // clear this flag to be set on next call to autoScroll
+ mAutoScrolling = false;
+
+ LLRect local_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
+
+ LLLocalClipRect clip(local_rect);
+
+ LLPanel::draw();
+}
+
+
+//---------------------------------------------------------------------------------
+BOOL LLAccordionCtrl::postBuild()
+{
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ LLRect scroll_rect;
+ scroll_rect.setOriginAndSize(
+ getRect().getWidth() - scrollbar_size,
+ 1,
+ scrollbar_size,
+ getRect().getHeight() - 1);
+
+
+ LLScrollbar::Params sbparams;
+ sbparams.name("scrollable vertical");
+ sbparams.rect(scroll_rect);
+ sbparams.orientation(LLScrollbar::VERTICAL);
+ sbparams.doc_size(mInnerRect.getHeight());
+ sbparams.doc_pos(0);
+ sbparams.page_size(mInnerRect.getHeight());
+ sbparams.step_size(VERTICAL_MULTIPLE);
+ sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
+ sbparams.change_callback(boost::bind(&LLAccordionCtrl::onScrollPosChangeCallback, this, _1, _2));
+
+ mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams);
+ LLView::addChild( mScrollbar );
+ mScrollbar->setVisible( false );
+ mScrollbar->setFollowsRight();
+ mScrollbar->setFollowsTop();
+ mScrollbar->setFollowsBottom();
+
+ //if it was created from xml...
+ std::vector<LLUICtrl*> accordion_tabs;
+ for(child_list_const_iter_t it = getChildList()->begin();
+ getChildList()->end() != it; ++it)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(*it);
+ if(accordion_tab == NULL)
+ continue;
+ if(std::find(mAccordionTabs.begin(),mAccordionTabs.end(),accordion_tab) == mAccordionTabs.end())
+ {
+ accordion_tabs.push_back(accordion_tab);
+ }
+ }
+
+ for(std::vector<LLUICtrl*>::reverse_iterator it = accordion_tabs.rbegin();it!=accordion_tabs.rend();++it)
+ addCollapsibleCtrl(*it);
+
+ arrange ();
+
+ if(mSingleExpansion)
+ {
+ if(!mAccordionTabs[0]->getDisplayChildren())
+ mAccordionTabs[0]->setDisplayChildren(true);
+ for(size_t i=1;i<mAccordionTabs.size();++i)
+ {
+ if(mAccordionTabs[i]->getDisplayChildren())
+ mAccordionTabs[i]->setDisplayChildren(false);
+ }
+ }
+
+ return TRUE;
+}
+
+
+//---------------------------------------------------------------------------------
+LLAccordionCtrl::~LLAccordionCtrl()
+{
+ mAccordionTabs.clear();
+}
+
+//---------------------------------------------------------------------------------
+
+void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ // adjust our rectangle
+ LLRect rcLocal = getRect();
+ rcLocal.mRight = rcLocal.mLeft + width;
+ rcLocal.mTop = rcLocal.mBottom + height;
+
+ setRect(rcLocal);
+
+ arrange();
+}
+
+//---------------------------------------------------------------------------------
+BOOL LLAccordionCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ return LLPanel::handleRightMouseDown(x, y, mask);
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::shiftAccordionTabs(S16 panel_num, S32 delta)
+{
+ for(size_t i = panel_num; i < mAccordionTabs.size(); i++ )
+ {
+ ctrlShiftVertical(mAccordionTabs[i],delta);
+ }
+}
+
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::onCollapseCtrlCloseOpen(S16 panel_num)
+{
+ if(mSingleExpansion)
+ {
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ if(i==panel_num)
+ continue;
+ if(mAccordionTabs[i]->getDisplayChildren())
+ mAccordionTabs[i]->setDisplayChildren(false);
+ }
+
+ }
+ arrange();
+}
+
+void LLAccordionCtrl::show_hide_scrollbar(S32 width, S32 height)
+{
+ calcRecuiredHeight();
+ if(getRecuiredHeight() > height )
+ showScrollbar(width,height);
+ else
+ hideScrollbar(width,height);
+}
+
+void LLAccordionCtrl::showScrollbar(S32 width, S32 height)
+{
+ bool was_visible = mScrollbar->getVisible();
+
+ mScrollbar->setVisible(true);
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ ctrlSetLeftTopAndSize(mScrollbar
+ ,width-scrollbar_size - PARENT_BORDER_MARGIN/2
+ ,height-PARENT_BORDER_MARGIN
+ ,scrollbar_size
+ ,height-2*PARENT_BORDER_MARGIN);
+
+ mScrollbar->setPageSize(height);
+ mScrollbar->setDocParams(mInnerRect.getHeight(),mScrollbar->getDocPos());
+
+ if(was_visible)
+ {
+ S32 scroll_pos = llmin(mScrollbar->getDocPos(), getRecuiredHeight() - height - 1);
+ mScrollbar->setDocPos(scroll_pos);
+ }
+}
+
+void LLAccordionCtrl::hideScrollbar( S32 width, S32 height )
+{
+ if(mScrollbar->getVisible() == false)
+ return;
+ mScrollbar->setVisible(false);
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ S32 panel_width = width - 2*BORDER_MARGIN;
+
+ //reshape all accordeons and shift all draggers
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ LLRect panel_rect = mAccordionTabs[i]->getRect();
+ ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_rect.mTop,panel_width,panel_rect.getHeight());
+ }
+
+ mScrollbar->setDocPos(0);
+
+ if(mAccordionTabs.size()>0)
+ {
+ S32 panel_top = height - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 diff = panel_top - mAccordionTabs[0]->getRect().mTop;
+ shiftAccordionTabs(0,diff);
+ }
+}
+
+
+//---------------------------------------------------------------------------------
+S32 LLAccordionCtrl::calcRecuiredHeight()
+{
+ S32 rec_height = 0;
+
+ std::vector<LLAccordionCtrlTab*>::iterator panel;
+ for(panel=mAccordionTabs.begin(); panel!=mAccordionTabs.end(); ++panel)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(*panel);
+ if(accordion_tab && accordion_tab->getVisible())
+ {
+ rec_height += accordion_tab->getRect().getHeight();
+ }
+ }
+
+ mInnerRect.setLeftTopAndSize(0,rec_height + BORDER_MARGIN*2,getRect().getWidth(),rec_height + BORDER_MARGIN);
+
+ return mInnerRect.getHeight();
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height)
+{
+ if(!panel)
+ return;
+ LLRect panel_rect = panel->getRect();
+ panel_rect.setLeftTopAndSize( left, top, width, height);
+ panel->reshape( width, height, 1);
+ panel->setRect(panel_rect);
+}
+
+void LLAccordionCtrl::ctrlShiftVertical(LLView* panel,S32 delta)
+{
+ if(!panel)
+ return;
+ panel->translate(0,delta);
+}
+
+//---------------------------------------------------------------------------------
+
+void LLAccordionCtrl::addCollapsibleCtrl(LLView* view)
+{
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view);
+ if(!accordion_tab)
+ return;
+ if(std::find(getChildList()->begin(),getChildList()->end(),accordion_tab) == getChildList()->end())
+ addChild(accordion_tab);
+ mAccordionTabs.push_back(accordion_tab);
+
+ accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, mAccordionTabs.size() - 1) );
+
+}
+
+
+void LLAccordionCtrl::arrange()
+{
+ if( mAccordionTabs.size() == 0)
+ {
+ //We do not arrange if we do not have what should be arranged
+ return;
+ }
+
+ //Calculate params
+ S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+
+
+ if(mAccordionTabs.size() == 1)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]);
+
+ LLRect panel_rect = accordion_tab->getRect();
+
+ S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN;
+
+ ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height);
+
+ show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+ return;
+
+ }
+
+ for(size_t i = 0; i < mAccordionTabs.size(); i++ )
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+
+ if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ continue;
+
+ if(!accordion_tab->isExpanded() )
+ {
+ ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, accordion_tab->getRect().getHeight());
+ panel_top-=mAccordionTabs[i]->getRect().getHeight();
+ }
+ else
+ {
+ S32 panel_height = accordion_tab->getRect().getHeight();
+
+ if(mFitParent)
+ {
+ // all expanded tabs will have equal height
+ panel_height = calcExpandedTabHeight(i, panel_top);
+ ctrlSetLeftTopAndSize(accordion_tab, panel_left, panel_top, panel_width, panel_height);
+
+ // try to make accordion tab fit accordion view height.
+ // Accordion View should implement getRequiredRect() and provide valid height
+ S32 optimal_height = accordion_tab->getAccordionView()->getRequiredRect().getHeight();
+ optimal_height += accordion_tab->getHeaderHeight() + 2 * BORDER_MARGIN;
+ if(optimal_height < panel_height)
+ {
+ panel_height = optimal_height;
+ }
+
+ // minimum tab height is equal to header height
+ if(mAccordionTabs[i]->getHeaderHeight() > panel_height)
+ {
+ panel_height = mAccordionTabs[i]->getHeaderHeight();
+ }
+ }
+
+ ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height);
+ panel_top-=panel_height;
+
+ }
+ }
+
+ show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+
+ updateLayout(getRect().getWidth(),getRect().getHeight());
+
+}
+
+//---------------------------------------------------------------------------------
+
+BOOL LLAccordionCtrl::handleScrollWheel ( S32 x, S32 y, S32 clicks )
+{
+ if(LLPanel::handleScrollWheel(x,y,clicks))
+ return TRUE;
+ if( mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) )
+ return TRUE;
+ return false;
+
+}
+
+BOOL LLAccordionCtrl::handleKeyHere (KEY key, MASK mask)
+{
+ if( mScrollbar->getVisible() && mScrollbar->handleKeyHere( key,mask ) )
+ return TRUE;
+ return LLPanel::handleKeyHere(key,mask);
+}
+
+BOOL LLAccordionCtrl::handleDragAndDrop (S32 x, S32 y, MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // Scroll folder view if needed. Never accepts a drag or drop.
+ *accept = ACCEPT_NO;
+ BOOL handled = autoScroll(x, y);
+
+ if( !handled )
+ {
+ handled = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type,
+ cargo_data, accept, tooltip_msg) != NULL;
+ }
+ return TRUE;
+}
+
+BOOL LLAccordionCtrl::autoScroll (S32 x, S32 y)
+{
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ bool scrolling = false;
+ if( mScrollbar->getVisible() )
+ {
+ LLRect rect_local( 0, getRect().getHeight(), getRect().getWidth() - scrollbar_size, 0 );
+ LLRect screen_local_extents;
+
+ // clip rect against root view
+ screenRectToLocal(getRootView()->getLocalRect(), &screen_local_extents);
+ rect_local.intersectWith(screen_local_extents);
+
+ // autoscroll region should take up no more than one third of visible scroller area
+ S32 auto_scroll_region_height = llmin(rect_local.getHeight() / 3, 10);
+ S32 auto_scroll_speed = llround(mAutoScrollRate * LLFrameTimer::getFrameDeltaTimeF32());
+
+ LLRect bottom_scroll_rect = screen_local_extents;
+ bottom_scroll_rect.mTop = rect_local.mBottom + auto_scroll_region_height;
+ if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar->getDocPos() < mScrollbar->getDocPosMax()) )
+ {
+ mScrollbar->setDocPos( mScrollbar->getDocPos() + auto_scroll_speed );
+ mAutoScrolling = true;
+ scrolling = true;
+ }
+
+ LLRect top_scroll_rect = screen_local_extents;
+ top_scroll_rect.mBottom = rect_local.mTop - auto_scroll_region_height;
+ if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar->getDocPos() > 0) )
+ {
+ mScrollbar->setDocPos( mScrollbar->getDocPos() - auto_scroll_speed );
+ mAutoScrolling = true;
+ scrolling = true;
+ }
+ }
+ return scrolling;
+}
+
+void LLAccordionCtrl::updateLayout (S32 width, S32 height)
+{
+ S32 panel_top = height - BORDER_MARGIN ;
+ if(mScrollbar->getVisible())
+ panel_top+=mScrollbar->getDocPos();
+
+ S32 panel_width = width - 2*BORDER_MARGIN;
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+ if(mScrollbar->getVisible())
+ panel_width-=scrollbar_size;
+
+ //set sizes for first panels and dragbars
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ if(!mAccordionTabs[i]->getVisible())
+ continue;
+ LLRect panel_rect = mAccordionTabs[i]->getRect();
+ ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_top,panel_width,panel_rect.getHeight());
+ panel_top-=panel_rect.getHeight();
+ }
+}
+
+void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
+{
+ updateLayout(getRect().getWidth(),getRect().getHeight());
+}
+void LLAccordionCtrl::onOpen (const LLSD& key)
+{
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ LLPanel* panel = dynamic_cast<LLPanel*>(accordion_tab->getAccordionView());
+ if(panel!=NULL)
+ {
+ panel->onOpen(key);
+ }
+ }
+}
+S32 LLAccordionCtrl::notifyParent(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "size_changes")
+ {
+ //
+ arrange();
+ return 1;
+ }
+ else if(str_action == "select_next")
+ {
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ if(accordion_tab->hasFocus())
+ {
+ while(++i<mAccordionTabs.size())
+ {
+ if(mAccordionTabs[i]->getVisible())
+ break;
+ }
+ if(i<mAccordionTabs.size())
+ {
+ accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ accordion_tab->notify(LLSD().with("action","select_first"));
+ return 1;
+ }
+ break;
+ }
+ }
+ return 0;
+ }
+ else if(str_action == "select_prev")
+ {
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ if(accordion_tab->hasFocus() && i>0)
+ {
+ while(i>0)
+ {
+ if(mAccordionTabs[--i]->getVisible())
+ break;
+ }
+
+ accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ accordion_tab->notify(LLSD().with("action","select_last"));
+ return 1;
+ }
+ }
+ return 0;
+ }
+ }
+ else if (info.has("scrollToShowRect"))
+ {
+ LLRect screen_rc, local_rc;
+ screen_rc.setValue(info["scrollToShowRect"]);
+ screenRectToLocal(screen_rc, &local_rc);
+
+ // Translate to parent coordinatess to check if we are in visible rectangle
+ local_rc.translate( getRect().mLeft, getRect().mBottom );
+
+ if ( !getRect().contains (local_rc) )
+ {
+ // Back to local coords and calculate position for scroller
+ S32 bottom = mScrollbar->getDocPos() - local_rc.mBottom + getRect().mBottom;
+ S32 top = mScrollbar->getDocPos() - local_rc.mTop + getRect().mTop;
+
+ S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
+ bottom, // min vertical scroll
+ top); // max vertical scroll
+
+ mScrollbar->setDocPos( scroll_pos );
+ }
+ return 1;
+ }
+ return LLPanel::notifyParent(info);
+}
+void LLAccordionCtrl::reset ()
+{
+ if(mScrollbar)
+ mScrollbar->setDocPos(0);
+}
+
+S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)
+{
+ if(tab_index < 0)
+ {
+ return available_height;
+ }
+
+ S32 collapsed_tabs_height = 0;
+ S32 num_expanded = 0;
+
+ for(size_t n = tab_index; n < mAccordionTabs.size(); ++n)
+ {
+ if(!mAccordionTabs[n]->isExpanded())
+ {
+ collapsed_tabs_height += mAccordionTabs[n]->getHeaderHeight();
+ }
+ else
+ {
+ ++num_expanded;
+ }
+ }
+
+ if(0 == num_expanded)
+ {
+ return available_height;
+ }
+
+ S32 expanded_tab_height = available_height - collapsed_tabs_height - BORDER_MARGIN; // top BORDER_MARGIN is added in arrange(), here we add bottom BORDER_MARGIN
+ expanded_tab_height /= num_expanded;
+ return expanded_tab_height;
+}
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
new file mode 100644
index 0000000000..d57a42df32
--- /dev/null
+++ b/indra/llui/llaccordionctrl.h
@@ -0,0 +1,132 @@
+/**
+ * @file LLAccordionCtrl.h
+ * @brief Accordion Panel implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCORDIONCTRL_H
+#define LL_ACCORDIONCTRL_H
+
+#include "llpanel.h"
+#include "llscrollbar.h"
+
+#include <vector>
+#include <algorithm>
+#include <string>
+
+class LLAccordionCtrlTab;
+
+class LLAccordionCtrl: public LLPanel
+{
+private:
+
+ std::vector<LLAccordionCtrlTab*> mAccordionTabs;
+
+ void ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height);
+ void ctrlShiftVertical(LLView* panel,S32 delta);
+
+ void onCollapseCtrlCloseOpen(S16 panel_num);
+ void shiftAccordionTabs(S16 panel_num, S32 delta);
+
+
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Optional<bool> single_expansion,
+ fit_parent; /* Accordion will fit its parent size, controls that are placed into
+ accordion tabs are responsible for scrolling their content.
+ *NOTE fit_parent works best when combined with single_expansion.
+ Accordion view should implement getRequiredRect() and provide valid height*/
+
+ Params()
+ : single_expansion("single_expansion",false)
+ , fit_parent("fit_parent", false)
+ {};
+ };
+
+ LLAccordionCtrl(const Params& params);
+
+ LLAccordionCtrl();
+ virtual ~LLAccordionCtrl();
+
+ virtual BOOL postBuild();
+
+ virtual BOOL handleRightMouseDown ( S32 x, S32 y, MASK mask);
+ virtual BOOL handleScrollWheel ( S32 x, S32 y, S32 clicks );
+ virtual BOOL handleKeyHere (KEY key, MASK mask);
+ virtual BOOL handleDragAndDrop (S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+ //
+
+ // Call reshape after changing splitter's size
+ virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+ void addCollapsibleCtrl(LLView* view);
+ void arrange();
+
+
+ void draw();
+
+ void onScrollPosChangeCallback(S32, LLScrollbar*);
+
+ void onOpen (const LLSD& key);
+ S32 notifyParent(const LLSD& info);
+
+ void reset ();
+
+private:
+ // Calc Splitter's height that is necessary to display all child content
+ S32 calcRecuiredHeight();
+ S32 getRecuiredHeight() const { return mInnerRect.getHeight(); }
+ S32 calcExpandedTabHeight(S32 tab_index = 0, S32 available_height = 0);
+
+ void updateLayout (S32 width, S32 height);
+
+ void show_hide_scrollbar (S32 width, S32 height);
+
+ void showScrollbar (S32 width, S32 height);
+ void hideScrollbar (S32 width, S32 height);
+
+ BOOL autoScroll (S32 x, S32 y);
+
+private:
+ LLRect mInnerRect;
+ LLScrollbar* mScrollbar;
+ bool mSingleExpansion;
+ bool mFitParent;
+ bool mAutoScrolling;
+ F32 mAutoScrollRate;
+};
+
+
+#endif // LL_LLSPLITTER_H
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
new file mode 100644
index 0000000000..daa9e08f14
--- /dev/null
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -0,0 +1,634 @@
+/**
+ * @file LLAccordionCtrlTab.cpp
+ * @brief Collapsible control implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lluictrl.h"
+
+#include "llaccordionctrltab.h"
+
+#include "lltextbox.h"
+
+static const std::string DD_BUTTON_NAME = "dd_button";
+static const std::string DD_TEXTBOX_NAME = "dd_textbox";
+static const std::string DD_HEADER_NAME = "dd_header";
+
+static const S32 HEADER_HEIGHT = 20;
+static const S32 HEADER_IMAGE_LEFT_OFFSET = 5;
+static const S32 HEADER_TEXT_LEFT_OFFSET = 30;
+static const F32 AUTO_OPEN_TIME = 1.f;
+
+static LLDefaultChildRegistry::Register<LLAccordionCtrlTab> t1("accordion_tab");
+
+class LLAccordionCtrlTab::LLAccordionCtrlTabHeader : public LLUICtrl
+{
+public:
+ friend class LLUICtrlFactory;
+
+ struct Params : public LLInitParam::Block<Params, LLAccordionCtrlTab::Params>
+ {
+ Params();
+ };
+
+ LLAccordionCtrlTabHeader(const LLAccordionCtrlTabHeader::Params& p);
+
+ virtual ~LLAccordionCtrlTabHeader();
+
+ virtual void draw();
+
+ virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+ virtual BOOL postBuild();
+
+ void setTitle(const std::string& title);
+
+ virtual void onMouseEnter(S32 x, S32 y, MASK mask);
+ virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+ virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+private:
+
+ LLTextBox* mHeaderTextbox;
+
+ // Overlay images (arrows)
+ LLPointer<LLUIImage> mImageCollapsed;
+ LLPointer<LLUIImage> mImageExpanded;
+ LLPointer<LLUIImage> mImageCollapsedPressed;
+ LLPointer<LLUIImage> mImageExpandedPressed;
+
+ // Background images
+ LLPointer<LLUIImage> mImageHeader;
+ LLPointer<LLUIImage> mImageHeaderOver;
+ LLPointer<LLUIImage> mImageHeaderPressed;
+ LLPointer<LLUIImage> mImageHeaderFocused;
+
+ LLUIColor mHeaderBGColor;
+
+ bool mNeedsHighlight;
+
+ LLFrameTimer mAutoOpenTimer;
+};
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::Params::Params()
+{
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader(
+ const LLAccordionCtrlTabHeader::Params& p)
+: LLUICtrl(p)
+, mHeaderBGColor(p.header_bg_color())
+,mNeedsHighlight(false),
+ mImageCollapsed(p.header_collapse_img),
+ mImageCollapsedPressed(p.header_collapse_img_pressed),
+ mImageExpanded(p.header_expand_img),
+ mImageExpandedPressed(p.header_expand_img_pressed),
+ mImageHeader(p.header_image),
+ mImageHeaderOver(p.header_image_over),
+ mImageHeaderPressed(p.header_image_pressed),
+ mImageHeaderFocused(p.header_image_focused)
+{
+ LLTextBox::Params textboxParams;
+ textboxParams.name(DD_TEXTBOX_NAME);
+ textboxParams.initial_value(p.title());
+ textboxParams.text_color(p.header_text_color());
+ textboxParams.follows.flags(FOLLOWS_NONE);
+ textboxParams.font( p.font() );
+ textboxParams.font_shadow(LLFontGL::NO_SHADOW);
+ textboxParams.use_ellipses = true;
+ textboxParams.bg_visible = false;
+ textboxParams.mouse_opaque = false;
+ mHeaderTextbox = LLUICtrlFactory::create<LLTextBox>(textboxParams);
+ addChild(mHeaderTextbox);
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::~LLAccordionCtrlTabHeader()
+{
+}
+
+BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild()
+{
+ return TRUE;
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title)
+{
+ if(mHeaderTextbox)
+ mHeaderTextbox->setText(title);
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
+{
+ S32 width = getRect().getWidth();
+ S32 height = getRect().getHeight();
+
+ gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get(),true);
+
+ LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
+ bool collapsible = (parent && parent->getCollapsible());
+ bool expanded = (parent && parent->getDisplayChildren());
+
+ // Handle overlay images, if needed
+ // Only show green "focus" background image if the accordion is open,
+ // because the user's mental model of focus is that it goes away after
+ // the accordion is closed.
+ if (getParent()->hasFocus()
+ /*&& !(collapsible && !expanded)*/ // WHY??
+ )
+ {
+ mImageHeaderFocused->draw(0,0,width,height);
+ }
+ else
+ {
+ mImageHeader->draw(0,0,width,height);
+ }
+
+ if(mNeedsHighlight)
+ {
+ mImageHeaderOver->draw(0,0,width,height);
+ }
+
+
+ if(collapsible)
+ {
+ LLPointer<LLUIImage> overlay_image;
+ if(expanded)
+ {
+ overlay_image = mImageExpanded;
+ }
+ else
+ {
+ overlay_image = mImageCollapsed;
+ }
+ overlay_image->draw(HEADER_IMAGE_LEFT_OFFSET,
+ (height - overlay_image->getHeight()) / 2);
+ }
+
+ LLUICtrl::draw();
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+ S32 header_height = mHeaderTextbox->getTextPixelHeight();
+
+ LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET,(height+header_height)/2 ,width,(height-header_height)/2);
+ mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
+ mHeaderTextbox->setRect(textboxRect);
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ LLUICtrl::onMouseEnter(x, y, mask);
+ mNeedsHighlight = true;
+}
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLUICtrl::onMouseLeave(x, y, mask);
+ mNeedsHighlight = false;
+ mAutoOpenTimer.stop();
+}
+BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+ if ( ( key == KEY_LEFT || key == KEY_RIGHT) && mask == MASK_NONE)
+ {
+ return getParent()->handleKey(key, mask, called_from_parent);
+ }
+ return LLUICtrl::handleKey(key, mask, called_from_parent);
+}
+BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
+
+ if ( parent && !parent->getDisplayChildren() && parent->getCollapsible() && parent->canOpenClose() )
+ {
+ if (mAutoOpenTimer.getStarted())
+ {
+ if (mAutoOpenTimer.getElapsedTimeF32() > AUTO_OPEN_TIME)
+ {
+ parent->changeOpenClose(false);
+ mAutoOpenTimer.stop();
+ return TRUE;
+ }
+ }
+ else
+ mAutoOpenTimer.start();
+ }
+
+ return LLUICtrl::handleDragAndDrop(x, y, mask, drop, cargo_type,
+ cargo_data, accept, tooltip_msg);
+}
+LLAccordionCtrlTab::Params::Params()
+ : title("title")
+ ,display_children("expanded", true)
+ ,header_height("header_height", HEADER_HEIGHT),
+ min_width("min_width", 0),
+ min_height("min_height", 0)
+ ,collapsible("collapsible", true)
+ ,header_bg_color("header_bg_color")
+ ,dropdown_bg_color("dropdown_bg_color")
+ ,header_visible("header_visible",true)
+ ,padding_left("padding_left",2)
+ ,padding_right("padding_right",2)
+ ,padding_top("padding_top",2)
+ ,padding_bottom("padding_bottom",2)
+ ,header_expand_img("header_expand_img")
+ ,header_expand_img_pressed("header_expand_img_pressed")
+ ,header_collapse_img("header_collapse_img")
+ ,header_collapse_img_pressed("header_collapse_img_pressed")
+ ,header_image("header_image")
+ ,header_image_over("header_image_over")
+ ,header_image_pressed("header_image_pressed")
+ ,header_image_focused("header_image_focused")
+ ,header_text_color("header_text_color")
+{
+ mouse_opaque(false);
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
+ : LLUICtrl(p)
+ ,mDisplayChildren(p.display_children)
+ ,mCollapsible(p.collapsible)
+ ,mExpandedHeight(0)
+ ,mDropdownBGColor(p.dropdown_bg_color())
+ ,mHeaderVisible(p.header_visible)
+ ,mPaddingLeft(p.padding_left)
+ ,mPaddingRight(p.padding_right)
+ ,mPaddingTop(p.padding_top)
+ ,mPaddingBottom(p.padding_bottom)
+ ,mCanOpenClose(true)
+{
+ mStoredOpenCloseState = false;
+ mWasStateStored = false;
+
+ mDropdownBGColor = LLColor4::white;
+ LLAccordionCtrlTabHeader::Params headerParams;
+ headerParams.name(DD_HEADER_NAME);
+ headerParams.title(p.title);
+ mHeader = LLUICtrlFactory::create<LLAccordionCtrlTabHeader>(headerParams);
+ addChild(mHeader, 1);
+
+ reshape(100, 200,FALSE);
+}
+
+LLAccordionCtrlTab::~LLAccordionCtrlTab()
+{
+}
+
+
+void LLAccordionCtrlTab::setDisplayChildren(bool display)
+{
+ mDisplayChildren = display;
+ LLRect rect = getRect();
+
+ rect.mBottom = rect.mTop - (getDisplayChildren() ?
+ mExpandedHeight : HEADER_HEIGHT);
+ setRect(rect);
+
+ for(child_list_const_iter_t it = getChildList()->begin();
+ getChildList()->end() != it; ++it)
+ {
+ LLView* child = *it;
+ if(DD_HEADER_NAME == child->getName())
+ continue;
+
+ child->setVisible(getDisplayChildren());
+ }
+}
+
+void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+ LLRect headerRect;
+
+ LLUICtrl::reshape(width, height, TRUE);
+
+ headerRect.setLeftTopAndSize(
+ 0,height,width,HEADER_HEIGHT);
+ mHeader->setRect(headerRect);
+ mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
+
+ for(child_list_const_iter_t it = getChildList()->begin();
+ getChildList()->end() != it; ++it)
+ {
+ LLView* child = *it;
+ if(DD_HEADER_NAME == child->getName())
+ continue;
+ if(!child->getVisible())
+ continue;
+
+ LLRect childRect = child->getRect();
+ S32 childWidth = width - getPaddingLeft() - getPaddingRight();
+ S32 childHeight = height - getHeaderHeight() - getPaddingTop() - getPaddingBottom();
+
+ child->reshape(childWidth,childHeight);
+
+ childRect.setLeftTopAndSize(
+ getPaddingLeft(),
+ childHeight + getPaddingBottom(),
+ childWidth,
+ childHeight);
+
+ child->setRect(childRect);
+
+ break;//suppose that there is only one panel
+ }
+
+}
+
+void LLAccordionCtrlTab::changeOpenClose(bool is_open)
+{
+ if(is_open)
+ mExpandedHeight = getRect().getHeight();
+
+ setDisplayChildren(!is_open);
+ reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+ if (mCommitSignal)
+ {
+ (*mCommitSignal)(this, getDisplayChildren());
+ }
+}
+
+BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if(mCollapsible && mHeaderVisible && mCanOpenClose)
+ {
+ if(y >= (getRect().getHeight() - HEADER_HEIGHT) )
+ {
+ LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ header->setFocus(true);
+ changeOpenClose(getDisplayChildren());
+
+ //reset stored state
+ mWasStateStored = false;
+ return TRUE;
+ }
+ }
+ return LLUICtrl::handleMouseDown(x,y,mask);
+}
+
+BOOL LLAccordionCtrlTab::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ return LLUICtrl::handleMouseUp(x,y,mask);
+}
+
+boost::signals2::connection LLAccordionCtrlTab::setDropDownStateChangedCallback(commit_callback_t cb)
+{
+ return setCommitCallback(cb);
+}
+
+bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
+{
+ if(DD_HEADER_NAME != child->getName())
+ {
+ reshape(child->getRect().getWidth() , child->getRect().getHeight() + HEADER_HEIGHT );
+ mExpandedHeight = getRect().getHeight();
+ }
+
+ bool res = LLUICtrl::addChild(child, tab_group);
+
+ if(DD_HEADER_NAME != child->getName())
+ {
+ if(!mCollapsible)
+ setDisplayChildren(true);
+ else
+ setDisplayChildren(getDisplayChildren());
+ }
+
+ return res;
+}
+
+void LLAccordionCtrlTab::setAccordionView(LLView* panel)
+{
+ addChild(panel,0);
+}
+
+
+LLView* LLAccordionCtrlTab::getAccordionView()
+{
+ for(child_list_const_iter_t it = getChildList()->begin();
+ getChildList()->end() != it; ++it)
+ {
+ LLView* child = *it;
+ if(DD_HEADER_NAME == child->getName())
+ continue;
+ if(!child->getVisible())
+ continue;
+ return child;
+ }
+ return NULL;
+}
+
+
+S32 LLAccordionCtrlTab::getHeaderHeight()
+{
+ return mHeaderVisible?HEADER_HEIGHT:0;
+}
+
+void LLAccordionCtrlTab::setHeaderVisible(bool value)
+{
+ if(mHeaderVisible == value)
+ return;
+ mHeaderVisible = value;
+ if(mHeader)
+ mHeader->setVisible(value);
+ reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+};
+
+//vurtual
+BOOL LLAccordionCtrlTab::postBuild()
+{
+ mHeader->setVisible(mHeaderVisible);
+ return LLUICtrl::postBuild();
+}
+bool LLAccordionCtrlTab::notifyChildren (const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "store_state")
+ {
+ storeOpenCloseState();
+ return true;
+ }
+ if(str_action == "restore_state")
+ {
+ restoreOpenCloseState();
+ return true;
+ }
+ }
+ return LLUICtrl::notifyChildren(info);
+}
+
+S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "size_changes")
+ {
+ //
+ S32 height = info["height"];
+ height = llmax(height,10) + HEADER_HEIGHT + getPaddingTop() + getPaddingBottom();
+
+ mExpandedHeight = height;
+
+ if(isExpanded())
+ {
+ LLRect panel_rect = getRect();
+ panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), height);
+ reshape(getRect().getWidth(),height);
+ setRect(panel_rect);
+ }
+
+ //LLAccordionCtrl should rearrange accodion tab if one of accordion change its size
+ getParent()->notifyParent(info);
+ return 1;
+ }
+ else if(str_action == "select_prev")
+ {
+ showAndFocusHeader();
+ return 1;
+ }
+ }
+ return LLUICtrl::notifyParent(info);
+}
+
+S32 LLAccordionCtrlTab::notify(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "select_first")
+ {
+ showAndFocusHeader();
+ return 1;
+ }
+ else if( str_action == "select_last" )
+ {
+ if(getDisplayChildren() == false)
+ {
+ showAndFocusHeader();
+ }
+ else
+ {
+ LLView* view = getAccordionView();
+ if(view)
+ view->notify(LLSD().with("action","select_last"));
+ }
+ }
+ }
+ return 0;
+}
+
+BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+ LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if( !header->hasFocus() )
+ return LLUICtrl::handleKey(key, mask, called_from_parent);
+
+ if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE)
+ {
+ if(getDisplayChildren() == false)
+ {
+ changeOpenClose(getDisplayChildren());
+ return TRUE;
+ }
+ }
+ if ( (key == KEY_SUBTRACT || key == KEY_LEFT)&& mask == MASK_NONE)
+ {
+ if(getDisplayChildren() == true)
+ {
+ changeOpenClose(getDisplayChildren());
+ return TRUE;
+ }
+ }
+
+ if ( key == KEY_DOWN && mask == MASK_NONE)
+ {
+ //if collapsed go to the next accordion
+ if(getDisplayChildren() == false)
+ //we processing notifyParent so let call parent directly
+ getParent()->notifyParent(LLSD().with("action","select_next"));
+ else
+ {
+ getAccordionView()->notify(LLSD().with("action","select_first"));
+ }
+ return TRUE;
+ }
+
+ if ( key == KEY_UP && mask == MASK_NONE)
+ {
+ //go to the previous accordion
+
+ //we processing notifyParent so let call parent directly
+ getParent()->notifyParent(LLSD().with("action","select_prev"));
+ return TRUE;
+ }
+
+ return LLUICtrl::handleKey(key, mask, called_from_parent);
+}
+
+void LLAccordionCtrlTab::showAndFocusHeader()
+{
+ LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ header->setFocus(true);
+
+ LLRect screen_rc;
+ LLRect selected_rc = header->getRect();
+ localRectToScreen(selected_rc, &screen_rc);
+ notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));
+
+}
+void LLAccordionCtrlTab::storeOpenCloseState()
+{
+ if(mWasStateStored)
+ return;
+ mStoredOpenCloseState = getDisplayChildren();
+ mWasStateStored = true;
+}
+void LLAccordionCtrlTab::restoreOpenCloseState()
+{
+ if(!mWasStateStored)
+ return;
+ if(getDisplayChildren() != mStoredOpenCloseState)
+ {
+ changeOpenClose(getDisplayChildren());
+ }
+ mWasStateStored = false;
+}
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
new file mode 100644
index 0000000000..2e0260ab16
--- /dev/null
+++ b/indra/llui/llaccordionctrltab.h
@@ -0,0 +1,192 @@
+/**
+ * @file LLAccordionCtrlTab.h
+ * @brief Collapsible box control implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCORDIONCTRLTAB_H_
+#define LL_ACCORDIONCTRLTAB_H_
+
+#include <string>
+#include "llrect.h"
+
+class LLUICtrl;
+class LLUICtrlFactory;
+class LLUIImage;
+class LLButton;
+class LLTextBox;
+
+
+
+// LLAccordionCtrlTab is a container for other controls.
+// It has a Header, by clicking on which hosted controls are shown or hidden.
+// When hosted controls are show - LLAccordionCtrlTab is expanded.
+// When hosted controls are hidden - LLAccordionCtrlTab is collapsed.
+
+class LLAccordionCtrlTab : public LLUICtrl
+{
+// Interface
+public:
+
+ struct Params
+ : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<bool> display_children, //expanded or collapsed after initialization
+ collapsible;
+
+ Optional<std::string> title;
+
+ Optional<S32> header_height,
+ min_width,
+ min_height;
+
+ // Overlay images (arrows on the left)
+ Mandatory<LLUIImage*> header_expand_img,
+ header_expand_img_pressed,
+ header_collapse_img,
+ header_collapse_img_pressed;
+
+ // Background images for the accordion tabs
+ Mandatory<LLUIImage*> header_image,
+ header_image_over,
+ header_image_pressed,
+ header_image_focused;
+
+ Optional<LLUIColor> header_bg_color,
+ header_text_color,
+ dropdown_bg_color;
+
+ Optional<bool> header_visible;
+
+ Optional<S32> padding_left;
+ Optional<S32> padding_right;
+ Optional<S32> padding_top;
+ Optional<S32> padding_bottom;
+
+ Params();
+ };
+
+ typedef LLDefaultChildRegistry child_registry_t;
+
+ virtual ~LLAccordionCtrlTab();
+
+ // Registers callback for expand/collapse events.
+ boost::signals2::connection setDropDownStateChangedCallback(commit_callback_t cb);
+
+ // Changes expand/collapse state
+ virtual void setDisplayChildren(bool display);
+
+ // Returns expand/collapse state
+ virtual bool getDisplayChildren() const {return mDisplayChildren;};
+
+ //set LLAccordionCtrlTab panel
+ void setAccordionView(LLView* panel);
+ LLView* getAccordionView();
+
+ bool getCollapsible() {return mCollapsible;};
+
+ void setCollapsible(bool collapsible) {mCollapsible = collapsible;};
+ void changeOpenClose(bool is_open);
+
+ void canOpenClose(bool can_open_close) { mCanOpenClose = can_open_close;};
+ bool canOpenClose() const { return mCanOpenClose; };
+
+ virtual BOOL postBuild();
+
+ S32 notifyParent(const LLSD& info);
+ S32 notify(const LLSD& info);
+ bool notifyChildren(const LLSD& info);
+
+ void storeOpenCloseState ();
+ void restoreOpenCloseState ();
+
+protected:
+ LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&);
+ friend class LLUICtrlFactory;
+
+// Overrides
+public:
+
+ // Call reshape after changing size
+ virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+ // Changes expand/collapse state and triggers expand/collapse callbacks
+ virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+ virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+
+ virtual bool addChild(LLView* child, S32 tab_group);
+
+ bool isExpanded() { return mDisplayChildren; }
+
+ S32 getHeaderHeight();
+
+ // Min size functions
+
+ void setHeaderVisible(bool value);
+
+ bool getHeaderVisible() { return mHeaderVisible;}
+
+ S32 mExpandedHeight; // Height of expanded ctrl.
+ // Used to restore height after expand.
+
+ S32 getPaddingLeft() const { return mPaddingLeft;}
+ S32 getPaddingRight() const { return mPaddingRight;}
+ S32 getPaddingTop() const { return mPaddingTop;}
+ S32 getPaddingBottom() const { return mPaddingBottom;}
+
+ void showAndFocusHeader();
+
+private:
+
+
+
+ class LLAccordionCtrlTabHeader;
+ LLAccordionCtrlTabHeader* mHeader; //Header
+
+ bool mDisplayChildren; //Expanded/collapsed
+ bool mCollapsible;
+ bool mHeaderVisible;
+
+ bool mCanOpenClose;
+
+ S32 mPaddingLeft;
+ S32 mPaddingRight;
+ S32 mPaddingTop;
+ S32 mPaddingBottom;
+
+ bool mStoredOpenCloseState;
+ bool mWasStateStored;
+
+
+ LLUIColor mDropdownBGColor;
+};
+
+#endif
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index fd369730d6..1d4dc35cee 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -32,6 +32,7 @@
#include "linden_common.h"
+#define LLBUTTON_CPP
#include "llbutton.h"
// Linden library includes
@@ -48,7 +49,7 @@
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llwindow.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llrender.h"
#include "lluictrlfactory.h"
#include "llhelp.h"
@@ -56,9 +57,12 @@
static LLDefaultChildRegistry::Register<LLButton> r("button");
+// Compiler optimization, generate extern template
+template class LLButton* LLView::getChild<class LLButton>(
+ const std::string& name, BOOL recurse) const;
+
// globals loaded from settings.xml
S32 LLBUTTON_H_PAD = 0;
-S32 LLBUTTON_V_PAD = 0;
S32 BTN_HEIGHT_SMALL= 0;
S32 BTN_HEIGHT = 0;
@@ -77,6 +81,9 @@ LLButton::Params::Params()
image_pressed_selected("image_pressed_selected"),
image_overlay("image_overlay"),
image_overlay_alignment("image_overlay_alignment", std::string("center")),
+ image_top_pad("image_top_pad"),
+ image_bottom_pad("image_bottom_pad"),
+ imgoverlay_label_space("imgoverlay_label_space", 1),
label_color("label_color"),
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
@@ -88,6 +95,7 @@ LLButton::Params::Params()
flash_color("flash_color"),
pad_right("pad_right", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
pad_left("pad_left", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
+ pad_bottom("pad_bottom"),
click_callback("click_callback"),
mouse_down_callback("mouse_down_callback"),
mouse_up_callback("mouse_up_callback"),
@@ -95,8 +103,7 @@ LLButton::Params::Params()
is_toggle("is_toggle", false),
scale_image("scale_image", true),
hover_glow_amount("hover_glow_amount"),
- commit_on_return("commit_on_return", true),
- picture_style("picture_style", false)
+ commit_on_return("commit_on_return", true)
{
addSynonym(is_toggle, "toggle");
held_down_delay.seconds = 0.5f;
@@ -136,6 +143,9 @@ LLButton::LLButton(const LLButton::Params& p)
mImageOverlay(p.image_overlay()),
mImageOverlayColor(p.image_overlay_color()),
mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
+ mImageOverlayTopPad(p.image_top_pad),
+ mImageOverlayBottomPad(p.image_bottom_pad),
+ mImgOverlayLabelSpace(p.imgoverlay_label_space),
mIsToggle(p.is_toggle),
mScaleImage(p.scale_image),
mDropShadowedText(p.label_shadow),
@@ -144,26 +154,23 @@ LLButton::LLButton(const LLButton::Params& p)
mHAlign(p.font_halign),
mLeftHPad(p.pad_left),
mRightHPad(p.pad_right),
+ mBottomVPad(p.pad_bottom),
mHoverGlowStrength(p.hover_glow_amount),
mCommitOnReturn(p.commit_on_return),
mFadeWhenDisabled(FALSE),
- mForcePressedState(FALSE),
- mLastDrawCharsCount(0)
+ mForcePressedState(false),
+ mLastDrawCharsCount(0),
+ mMouseDownSignal(NULL),
+ mMouseUpSignal(NULL),
+ mHeldDownSignal(NULL)
+
{
static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
- //if we aren't a picture_style button set label as name if not provided
- if (!p.picture_style.isProvided() || !p.picture_style)
+ if (!p.label_selected.isProvided())
{
- if (!p.label.isProvided())
- {
- mUnselectedLabel = p.name();
- }
- if (!p.label_selected.isProvided())
- {
- mSelectedLabel = mUnselectedLabel.getString();
- }
+ mSelectedLabel = mUnselectedLabel;
}
// Hack to make sure there is space for at least one character
@@ -224,13 +231,28 @@ LLButton::LLButton(const LLButton::Params& p)
}
if (p.click_callback.isProvided())
- initCommitCallback(p.click_callback, mCommitSignal); // alias -> commit_callback
+ {
+ setCommitCallback(initCommitCallback(p.click_callback)); // alias -> commit_callback
+ }
if (p.mouse_down_callback.isProvided())
- initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+ {
+ setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+ }
if (p.mouse_up_callback.isProvided())
- initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+ {
+ setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+ }
if (p.mouse_held_callback.isProvided())
- initCommitCallback(p.mouse_held_callback, mHeldDownSignal);
+ {
+ setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
+ }
+}
+
+LLButton::~LLButton()
+{
+ delete mMouseDownSignal;
+ delete mMouseUpSignal;
+ delete mHeldDownSignal;
}
// HACK: Committing a button is the same as instantly clicking it.
@@ -241,9 +263,9 @@ void LLButton::onCommit()
// panel containing it. Therefore we need to call LLUICtrl::onCommit()
// LAST, otherwise this becomes deleted memory.
- mMouseDownSignal(this, LLSD());
+ if (mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
- mMouseUpSignal(this, LLSD());
+ if (mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
if (getSoundFlags() & MOUSE_DOWN)
{
@@ -266,19 +288,23 @@ void LLButton::onCommit()
boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
{
- return mCommitSignal.connect(cb);
+ if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+ return mCommitSignal->connect(cb);
}
boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb )
{
- return mMouseDownSignal.connect(cb);
+ if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+ return mMouseDownSignal->connect(cb);
}
boost::signals2::connection LLButton::setMouseUpCallback( const commit_signal_t::slot_type& cb )
{
- return mMouseUpSignal.connect(cb);
+ if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+ return mMouseUpSignal->connect(cb);
}
boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t::slot_type& cb )
{
- return mHeldDownSignal.connect(cb);
+ if (!mHeldDownSignal) mHeldDownSignal = new commit_signal_t();
+ return mHeldDownSignal->connect(cb);
}
@@ -360,7 +386,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
*/
LLUICtrl::handleMouseDown(x, y, mask);
- mMouseDownSignal(this, LLSD());
+ if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
mMouseDownTimer.start();
mMouseDownFrame = (S32) LLFrameTimer::getFrameCount();
@@ -392,7 +418,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
LLUICtrl::handleMouseUp(x, y, mask);
// Regardless of where mouseup occurs, handle callback
- mMouseUpSignal(this, LLSD());
+ if(mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
resetMouseDownTimer();
@@ -486,6 +512,11 @@ void LLButton::onMouseLeave(S32 x, S32 y, MASK mask)
mNeedsHighlight = FALSE;
}
+void LLButton::setHighlight(bool b)
+{
+ mNeedsHighlight = b;
+}
+
BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
{
if (!childrenHandleHover(x, y, mask))
@@ -497,7 +528,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
{
LLSD param;
param["count"] = mMouseHeldDownCount++;
- mHeldDownSignal(this, param);
+ if (mHeldDownSignal) (*mHeldDownSignal)(this, param);
}
}
@@ -738,6 +769,7 @@ void LLButton::draw()
center_x++;
}
+ center_y += (mImageOverlayBottomPad - mImageOverlayTopPad);
// fade out overlay images on disabled buttons
LLColor4 overlay_color = mImageOverlayColor.get();
if (!enabled)
@@ -749,10 +781,9 @@ void LLButton::draw()
switch(mImageOverlayAlignment)
{
case LLFontGL::LEFT:
- text_left += overlay_width + 1;
- text_width -= overlay_width + 1;
+ text_left += overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- mLeftHPad,
+ mLeftHPad,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
@@ -767,10 +798,9 @@ void LLButton::draw()
overlay_color);
break;
case LLFontGL::RIGHT:
- text_right -= overlay_width + 1;
- text_width -= overlay_width + 1;
+ text_right -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- getRect().getWidth() - mRightHPad - overlay_width,
+ getRect().getWidth() - mRightHPad - overlay_width,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
@@ -815,7 +845,9 @@ void LLButton::draw()
// LLFontGL::render expects S32 max_chars variable but process in a separate way -1 value.
// Due to U32_MAX is equal to S32 -1 value I have rest this value for non-ellipses mode.
// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.
- mLastDrawCharsCount = mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset),
+ mLastDrawCharsCount = mGLFont->render(label, 0,
+ (F32)x,
+ (F32)(mBottomVPad + y_offset),
label_color % alpha,
mHAlign, LLFontGL::BOTTOM,
LLFontGL::NORMAL,
@@ -995,6 +1027,20 @@ void LLButton::setImageOverlay(const std::string& image_name, LLFontGL::HAlign a
}
}
+void LLButton::setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment, const LLColor4& color)
+{
+ if (image_id.isNull())
+ {
+ mImageOverlay = NULL;
+ }
+ else
+ {
+ mImageOverlay = LLUI::getUIImageByID(image_id);
+ mImageOverlayAlignment = alignment;
+ mImageOverlayColor = color;
+ }
+}
+
void LLButton::onMouseCaptureLost()
{
resetMouseDownTimer();
@@ -1087,7 +1133,7 @@ void LLButton::showHelp(LLUICtrl* ctrl, const LLSD& sdname)
// display an error if we can't find a help_topic string.
// fix this by adding a help_topic attribute to the xui file
- LLNotifications::instance().add("UnableToFindHelpTopic");
+ LLNotificationsUtil::add("UnableToFindHelpTopic");
}
void LLButton::resetMouseDownTimer()
@@ -1095,18 +1141,3 @@ void LLButton::resetMouseDownTimer()
mMouseDownTimer.stop();
mMouseDownTimer.reset();
}
-
-
-// *TODO: Remove this function after the initial XUI XML re-export pass.
-// static
-void LLButton::setupParamsForExport(Params& p, LLView* parent)
-{
- std::string label = p.label;
- if (label.empty())
- {
- //if our label is empty this is a picture style button
- p.picture_style = true;
- }
-
- LLUICtrl::setupParamsForExport(p, parent);
-}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 5e2aea2b74..6a0d8ef3d6 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -49,7 +49,6 @@
// PLEASE please use these "constants" when building your own buttons.
// They are loaded from settings.xml at run time.
extern S32 LLBUTTON_H_PAD;
-extern S32 LLBUTTON_V_PAD;
extern S32 BTN_HEIGHT_SMALL;
extern S32 BTN_HEIGHT;
@@ -105,7 +104,17 @@ public:
// layout
Optional<S32> pad_right;
Optional<S32> pad_left;
+ Optional<S32> pad_bottom; // under text label
+ //image overlay paddings
+ Optional<S32> image_top_pad;
+ Optional<S32> image_bottom_pad;
+
+ /**
+ * Space between image_overlay and label
+ */
+ Optional<S32> imgoverlay_label_space;
+
// callbacks
Optional<CommitCallbackParam> click_callback, // alias -> commit_callback
mouse_down_callback,
@@ -115,8 +124,7 @@ public:
// misc
Optional<bool> is_toggle,
scale_image,
- commit_on_return,
- picture_style; //if true, don't display label
+ commit_on_return;
Optional<F32> hover_glow_amount;
Optional<TimeIntervalParam> held_down_delay;
@@ -129,6 +137,8 @@ protected:
LLButton(const Params&);
public:
+
+ ~LLButton();
// For backward compatability only
typedef boost::function<void(void*)> button_callback_t;
@@ -176,6 +186,7 @@ public:
BOOL getToggleState() const;
void setToggleState(BOOL b);
+ void setHighlight(bool b);
void setFlashing( BOOL b );
BOOL getFlashing() const { return mFlashing; }
@@ -184,6 +195,11 @@ public:
void setLeftHPad( S32 pad ) { mLeftHPad = pad; }
void setRightHPad( S32 pad ) { mRightHPad = pad; }
+ void setImageOverlayTopPad( S32 pad ) { mImageOverlayTopPad = pad; }
+ S32 getImageOverlayTopPad() const { return mImageOverlayTopPad; }
+ void setImageOverlayBottomPad( S32 pad ) { mImageOverlayBottomPad = pad; }
+ S32 getImageOverlayBottomPad() const { return mImageOverlayBottomPad; }
+
const std::string getLabelUnselected() const { return wstring_to_utf8str(mUnselectedLabel); }
const std::string getLabelSelected() const { return wstring_to_utf8str(mSelectedLabel); }
@@ -198,6 +214,7 @@ public:
void setDisabledSelectedLabelColor( const LLColor4& c ) { mDisabledSelectedLabelColor = c; }
void setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
+ void setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
LLPointer<LLUIImage> getImageOverlay() { return mImageOverlay; }
void autoResize(); // resize with label of current btn state
@@ -238,24 +255,24 @@ public:
static void setDockableFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname);
static void showHelp(LLUICtrl* ctrl, const LLSD& sdname);
- void setForcePressedState(BOOL b) { mForcePressedState = b; }
+ void setForcePressedState(bool b) { mForcePressedState = b; }
+ void setAutoResize(bool auto_resize) { mAutoResize = auto_resize; }
+
protected:
LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; }
LLPointer<LLUIImage> getImageSelected() const { return mImageSelected; }
LLFrameTimer mMouseDownTimer;
- // If the label is empty, set the picture_style attribute
- static void setupParamsForExport(Params& p, LLView* parent);
private:
void drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size);
void resetMouseDownTimer();
private:
- commit_signal_t mMouseDownSignal;
- commit_signal_t mMouseUpSignal;
- commit_signal_t mHeldDownSignal;
+ commit_signal_t* mMouseDownSignal;
+ commit_signal_t* mMouseUpSignal;
+ commit_signal_t* mHeldDownSignal;
const LLFontGL* mGLFont;
@@ -310,6 +327,15 @@ private:
LLFontGL::HAlign mHAlign;
S32 mLeftHPad;
S32 mRightHPad;
+ S32 mBottomVPad; // under text label
+
+ S32 mImageOverlayTopPad;
+ S32 mImageOverlayBottomPad;
+
+ /*
+ * Space between image_overlay and label
+ */
+ S32 mImgOverlayLabelSpace;
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
@@ -317,10 +343,15 @@ private:
BOOL mNeedsHighlight;
BOOL mCommitOnReturn;
BOOL mFadeWhenDisabled;
- BOOL mForcePressedState;
+ bool mForcePressedState;
LLFrameTimer mFlashingTimer;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLBUTTON_CPP
+extern template class LLButton* LLView::getChild<class LLButton>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LLBUTTON_H
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index 7f0f9751db..3d32157406 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -33,6 +33,7 @@
// The mutants are coming!
#include "linden_common.h"
+#define LLCHECKBOXCTRL_CPP
#include "llcheckboxctrl.h"
#include "llgl.h"
@@ -50,6 +51,10 @@ const U32 MAX_STRING_LENGTH = 10;
static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
+// Compiler optimization, generate extern template
+template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
+ const std::string& name, BOOL recurse) const;
+
LLCheckBoxCtrl::Params::Params()
: text_enabled_color("text_enabled_color"),
text_disabled_color("text_disabled_color"),
@@ -102,8 +107,8 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
{
tbparams.font(p.font);
}
+ tbparams.text_color( p.enabled() ? p.text_enabled_color() : p.text_disabled_color() );
mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
-
addChild(mLabel);
// Button
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 2f8e8fdd23..28d50f957d 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -107,6 +107,7 @@ public:
std::string getLabel() const;
void setFont( const LLFontGL* font ) { mFont = font; }
+ const LLFontGL* getFont() { return mFont; }
virtual void setControlName(const std::string& control_name, LLView* context);
@@ -125,5 +126,10 @@ protected:
LLUIColor mTextDisabledColor;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLCHECKBOXCTRL_CPP
+extern template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LLCHECKBOXCTRL_H
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 36e309d639..9d23daf56d 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -102,14 +102,15 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
mMaxChars(p.max_chars),
mPrearrangeCallback(p.prearrange_callback()),
mTextEntryCallback(p.text_entry_callback()),
- mSelectionCallback(p.selection_callback()),
mListPosition(p.list_position),
- mLastSelectedIndex(-1)
+ mLastSelectedIndex(-1),
+ mLabel(p.label)
{
// Text label button
LLButton::Params button_params = (mAllowTextEntry ? p.combo_button : p.drop_down_button);
- button_params.mouse_down_callback.function(boost::bind(&LLComboBox::onButtonDown, this));
+ button_params.mouse_down_callback.function(
+ boost::bind(&LLComboBox::onButtonMouseDown, this));
button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
button_params.rect(p.rect);
@@ -140,6 +141,10 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
mList = LLUICtrlFactory::create<LLScrollListCtrl>(params);
addChild(mList);
+ // Mouse-down on button will transfer mouse focus to the list
+ // Grab the mouse-up event and make sure the button state is correct
+ mList->setMouseUpCallback(boost::bind(&LLComboBox::onListMouseUp, this));
+
for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin();
it != p.items().end();
++it)
@@ -486,6 +491,7 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p)
params.handle_edit_keys_directly(true);
params.commit_on_focus_lost(false);
params.follows.flags(FOLLOWS_ALL);
+ params.label(mLabel);
mTextEntry = LLUICtrlFactory::create<LLLineEditor> (params);
mTextEntry->setText(cur_label);
mTextEntry->setIgnoreTab(TRUE);
@@ -501,7 +507,8 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p)
mButton->setRect(rect);
mButton->setTabStop(TRUE);
mButton->setHAlign(LLFontGL::LEFT);
-
+ mButton->setLabel(mLabel.getString());
+
if (mTextEntry)
{
mTextEntry->setVisible(FALSE);
@@ -629,7 +636,7 @@ void LLComboBox::hideList()
if(mLastSelectedIndex >= 0)
mList->selectNthItem(mLastSelectedIndex);
}
- else
+ else if(mLastSelectedIndex >= 0)
mList->selectNthItem(mLastSelectedIndex);
mButton->setToggleState(FALSE);
@@ -644,7 +651,7 @@ void LLComboBox::hideList()
}
}
-void LLComboBox::onButtonDown()
+void LLComboBox::onButtonMouseDown()
{
if (!mList->getVisible())
{
@@ -670,6 +677,10 @@ void LLComboBox::onButtonDown()
if (mButton->hasMouseCapture())
{
gFocusMgr.setMouseCapture(mList);
+
+ // But keep the "pressed" look, which buttons normally lose when they
+ // lose focus
+ mButton->setForcePressedState(true);
}
}
else
@@ -679,6 +690,12 @@ void LLComboBox::onButtonDown()
}
+void LLComboBox::onListMouseUp()
+{
+ // In some cases this is the termination of a mouse click that started on
+ // the button, so clear its pressed state
+ mButton->setForcePressedState(false);
+}
//------------------------------------------------------------------
// static functions
@@ -706,12 +723,6 @@ void LLComboBox::onItemSelected(const LLSD& data)
// commit does the reverse, asserting the value in the list
onCommit();
-
- // call the callback if it exists
- if(mSelectionCallback)
- {
- mSelectionCallback(this, data);
- }
}
BOOL LLComboBox::handleToolTip(S32 x, S32 y, MASK mask)
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 6285ca5170..4f27588467 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -82,8 +82,7 @@ public:
allow_new_values;
Optional<S32> max_chars;
Optional<commit_callback_t> prearrange_callback,
- text_entry_callback,
- selection_callback;
+ text_entry_callback;
Optional<EPreferredPosition, PreferredPositionValues> list_position;
@@ -200,11 +199,11 @@ public:
void setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; }
void setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; }
- void setSelectionCallback( commit_callback_t cb ) { mSelectionCallback = cb; }
void setButtonVisible(BOOL visible);
- void onButtonDown();
+ void onButtonMouseDown();
+ void onListMouseUp();
void onItemSelected(const LLSD& data);
void onTextCommit(const LLSD& data);
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index e0053b4cc7..badbddc3cc 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -60,11 +60,15 @@ LLConsole* gConsole = NULL; // Created and destroyed in LLViewerWindow.
const F32 FADE_DURATION = 2.f;
const S32 MIN_CONSOLE_WIDTH = 200;
+static LLDefaultChildRegistry::Register<LLConsole> r("console");
+
LLConsole::LLConsole(const LLConsole::Params& p)
: LLUICtrl(p),
LLFixedBuffer(p.max_lines),
mLinePersistTime(p.persist_time), // seconds
- mFont(p.font)
+ mFont(p.font),
+ mConsoleWidth(0),
+ mConsoleHeight(0)
{
if (p.font_size_index.isProvided())
{
@@ -178,7 +182,7 @@ void LLConsole::draw()
// draw remaining lines
F32 y_pos = 0.f;
- LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+ LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
// F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
@@ -240,23 +244,6 @@ void LLConsole::draw()
}
}
-void LLConsole::addLine(const std::string& utf8line)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const LLWString& wline)
-{
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, size, color);
-}
-
//Generate highlight color segments for this paragraph. Pass in default color of paragraph.
void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color)
{
@@ -313,7 +300,8 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
S32 paragraph_offset = 0; //Offset into the paragraph text.
// Wrap lines that are longer than the view is wide.
- while( paragraph_offset < (S32)mParagraphText.length() )
+ while( paragraph_offset < (S32)mParagraphText.length() &&
+ mParagraphText[paragraph_offset] != 0)
{
S32 skip_chars; // skip '\n'
// Figure out if a word-wrapped line fits here.
@@ -328,7 +316,7 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
skip_chars = 0;
}
- U32 drawable = font->maxDrawableChars(mParagraphText.c_str()+paragraph_offset, screen_width, line_end - paragraph_offset, TRUE);
+ U32 drawable = font->maxDrawableChars(mParagraphText.c_str()+paragraph_offset, screen_width, line_end - paragraph_offset, LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
if (drawable != 0)
{
@@ -379,20 +367,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
//Pass in the string and the default color for this block of text.
LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width)
- : mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
+: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
{
makeParagraphColorSegments(color);
updateLines( screen_width, font );
}
-void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color)
+// called once per frame regardless of console visibility
+// static
+void LLConsole::updateClass()
{
- Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() );
-
- mParagraphs.push_back ( paragraph );
-
-#if LL_WINDOWS && LL_LCD_COMPILE
- // add to LCD screen
- AddNewDebugConsoleToLCD(wline);
-#endif
+ LLInstanceTrackerScopedGuard guard;
+
+ for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it)
+ {
+ it->update();
+ }
}
+
+void LLConsole::update()
+{
+ {
+ LLMutexLock lock(&mMutex);
+
+ while (!mLines.empty())
+ {
+ mParagraphs.push_back(
+ Paragraph( mLines.front(),
+ LLColor4::white,
+ mTimer.getElapsedTimeF32(),
+ mFont,
+ (F32)getRect().getWidth()));
+ mLines.pop_front();
+ }
+ }
+
+ // remove old paragraphs which can't possibly be visible any more. ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called! (i.e. the console isn't visible)
+ while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines)))
+ {
+ mParagraphs.pop_front();
+ }
+}
+
diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h
index 5800a82922..f38e2bc9c2 100644
--- a/indra/llui/llconsole.h
+++ b/indra/llui/llconsole.h
@@ -40,7 +40,7 @@
class LLSD;
-class LLConsole : public LLFixedBuffer, public LLUICtrl
+class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole>
{
public:
typedef enum e_font_size
@@ -68,6 +68,9 @@ protected:
friend class LLUICtrlFactory;
public:
+ // call once per frame to pull data out of LLFixedBuffer
+ static void updateClass();
+
//A paragraph color segment defines the color of text in a line
//of text that was received for console display. It has no
//notion of line wraps, screen position, or the text it contains.
@@ -139,19 +142,15 @@ public:
// -1 = monospace, 0 means small, font size = 1 means big
void setFontSize(S32 size_index);
- void addLine(const std::string& utf8line, F32 size, const LLColor4 &color);
- void addLine(const LLWString& wline, F32 size, const LLColor4 &color);
// Overrides
/*virtual*/ void draw();
- /*virtual*/ void addLine(const std::string& utf8line);
- /*virtual*/ void addLine(const LLWString& line);
private:
+ void update();
+
F32 mLinePersistTime; // Age at which to stop drawing.
F32 mFadeTime; // Age at which to start fading
const LLFontGL* mFont;
- S32 mLastBoxHeight;
- S32 mLastBoxWidth;
S32 mConsoleWidth;
S32 mConsoleHeight;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index f56cb2eee7..0492ab0f25 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -54,8 +54,10 @@ void LLDockableFloater::init(LLDockableFloater* thiz)
LLDockableFloater::LLDockableFloater(LLDockControl* dockControl,
const LLSD& key, const Params& params) :
LLFloater(key, params), mDockControl(dockControl), mUniqueDocking(true)
+ , mOverlapsScreenChannel(false)
{
init(this);
+ mUseTongue = true;
}
LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
@@ -63,6 +65,14 @@ LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDock
LLFloater(key, params), mDockControl(dockControl), mUniqueDocking(uniqueDocking)
{
init(this);
+ mUseTongue = true;
+}
+
+LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+ bool useTongue, const LLSD& key, const Params& params) :
+ LLFloater(key, params), mDockControl(dockControl), mUseTongue(useTongue), mUniqueDocking(uniqueDocking)
+{
+ init(this);
}
LLDockableFloater::~LLDockableFloater()
@@ -85,7 +95,7 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
LLDockableFloater* instance =
dynamic_cast<LLDockableFloater*> (LLFloaterReg::findInstance(name));
// if floater closed or docked
- if (instance == NULL || instance != NULL && instance->isDocked())
+ if (instance == NULL || (instance && instance->isDocked()))
{
LLFloaterReg::toggleInstance(name, key);
// restore button toggle state
@@ -98,8 +108,15 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
else if (instance != NULL)
{
instance->setMinimized(FALSE);
- instance->setVisible(TRUE);
- gFloaterView->bringToFront(instance);
+ if (instance->getVisible())
+ {
+ instance->setVisible(FALSE);
+ }
+ else
+ {
+ instance->setVisible(TRUE);
+ gFloaterView->bringToFront(instance);
+ }
}
}
@@ -127,26 +144,19 @@ void LLDockableFloater::setVisible(BOOL visible)
mDockControl.get()->repositionDockable();
}
+ if (visible)
+ {
+ LLFloater::setFrontmost(getAutoFocus());
+ }
LLFloater::setVisible(visible);
}
void LLDockableFloater::setMinimized(BOOL minimize)
{
- if(minimize && isDocked())
+ if(minimize)
{
setVisible(FALSE);
}
-
- if (minimize)
- {
- setCanDock(false);
- }
- else if (!minimize && mDockControl.get() != NULL && mDockControl.get()->isDockVisible())
- {
- setCanDock(true);
- }
-
- LLFloater::setMinimized(minimize);
}
LLView * LLDockableFloater::getDockWidget()
@@ -213,10 +223,10 @@ void LLDockableFloater::draw()
LLFloater::draw();
}
-void LLDockableFloater::setDockControl(LLDockControl* dockControl)
+void LLDockableFloater::setDockControl(LLDockControl* dockControl, bool docked /* = true */)
{
mDockControl.reset(dockControl);
- setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
+ setDocked(docked && mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
}
const LLUIImagePtr& LLDockableFloater::getDockTongue()
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 46491d8a29..4d747390af 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -50,8 +50,32 @@ public:
LOG_CLASS(LLDockableFloater);
LLDockableFloater(LLDockControl* dockControl, const LLSD& key,
const Params& params = getDefaultParams());
+
+ /**
+ * Constructor.
+ * @param dockControl a pointer to the doc control instance
+ * @param uniqueDocking - a flag defines is docking should work as tab(at one
+ * moment only one docked floater can be shown), also this flag defines is dock
+ * tongue should be used.
+ * @params key a floater key.
+ * @params params a floater parameters
+ */
LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
const LLSD& key, const Params& params = getDefaultParams());
+
+ /**
+ * Constructor.
+ * @param dockControl a pointer to the doc control instance
+ * @param uniqueDocking - a flag defines is docking should work as tab(at one
+ * moment only one docked floater can be shown).
+ * @praram useTongue - a flag defines is dock tongue should be used.
+ * @params key a floater key.
+ * @params params a floater parameters
+ */
+ LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+ bool useTongue, const LLSD& key,
+ const Params& params = getDefaultParams());
+
virtual ~LLDockableFloater();
static LLHandle<LLFloater> getInstanceHandle() { return sInstanceHandle; }
@@ -83,6 +107,18 @@ public:
virtual void onDockHidden();
virtual void onDockShown();
+ LLDockControl* getDockControl();
+
+ /**
+ * Returns true if screen channel should consider floater's size when drawing toasts.
+ *
+ * By default returns false.
+ */
+ virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
+ virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
+
+ bool getUniqueDocking() { return mUniqueDocking; }
+ bool getUseTongue() { return mUseTongue; }
private:
/**
* Provides unique of dockable floater.
@@ -91,8 +127,7 @@ private:
void resetInstance();
protected:
- void setDockControl(LLDockControl* dockControl);
- LLDockControl* getDockControl();
+ void setDockControl(LLDockControl* dockControl, bool docked = true);
const LLUIImagePtr& getDockTongue();
private:
@@ -104,6 +139,10 @@ private:
* non exclusively.
*/
bool mUniqueDocking;
+
+ bool mUseTongue;
+
+ bool mOverlapsScreenChannel;
};
#endif /* LL_DOCKABLEFLOATER_H */
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 35a854267a..d738b10130 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -37,7 +37,11 @@
LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
- mDockWidget(dockWidget), mDockableFloater(dockableFloater), mDockTongue(dockTongue)
+ mDockWidget(dockWidget),
+ mDockableFloater(dockableFloater),
+ mDockTongue(dockTongue),
+ mDockTongueX(0),
+ mDockTongueY(0)
{
mDockAt = dockAt;
@@ -158,7 +162,9 @@ bool LLDockControl::isDockVisible()
{
case LEFT: // to keep compiler happy
break;
+ case BOTTOM:
case TOP:
+ {
// check is dock inside parent rect
LLRect dockParentRect =
mDockWidget->getParent()->calcScreenRect();
@@ -169,6 +175,9 @@ bool LLDockControl::isDockVisible()
}
break;
}
+ default:
+ break;
+ }
}
}
@@ -182,6 +191,14 @@ void LLDockControl::moveDockable()
LLRect rootRect;
mGetAllowedRectCallback(rootRect);
+ bool use_tongue = false;
+ LLDockableFloater* dockable_floater =
+ dynamic_cast<LLDockableFloater*> (mDockableFloater);
+ if (dockable_floater != NULL)
+ {
+ use_tongue = dockable_floater->getUseTongue();
+ }
+
LLRect dockableRect = mDockableFloater->calcScreenRect();
S32 x = 0;
S32 y = 0;
@@ -208,7 +225,13 @@ void LLDockControl::moveDockable()
case TOP:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
- y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
+ y = dockRect.mTop + dockableRect.getHeight();
+ // unique docking used with dock tongue, so add tongue height o the Y coordinate
+ if (use_tongue)
+ {
+ y += mDockTongue->getHeight();
+ }
+
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
@@ -237,6 +260,42 @@ void LLDockControl::moveDockable()
mDockTongueY = dockRect.mTop;
break;
+ case BOTTOM:
+ x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
+ y = dockRect.mBottom;
+ // unique docking used with dock tongue, so add tongue height o the Y coordinate
+ if (use_tongue)
+ {
+ y -= mDockTongue->getHeight();
+ }
+
+ // check is dockable inside root view rect
+ if (x < rootRect.mLeft)
+ {
+ x = rootRect.mLeft;
+ }
+ if (x + dockableRect.getWidth() > rootRect.mRight)
+ {
+ x = rootRect.mRight - dockableRect.getWidth();
+ }
+
+ // calculate dock tongue position
+ dockParentRect = mDockWidget->getParent()->calcScreenRect();
+ if (dockRect.getCenterX() < dockParentRect.mLeft)
+ {
+ mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
+ }
+ else if (dockRect.getCenterX() > dockParentRect.mRight)
+ {
+ mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
+ }
+ else
+ {
+ mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
+ }
+ mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
+
+ break;
}
// move dockable
@@ -256,7 +315,6 @@ void LLDockControl::on()
{
if (isDockVisible())
{
- mDockableFloater->setCanDrag(false);
mEnabled = true;
mRecalculateDocablePosition = true;
}
@@ -264,13 +322,25 @@ void LLDockControl::on()
void LLDockControl::off()
{
- mDockableFloater->setCanDrag(true);
mEnabled = false;
}
+void LLDockControl::forceRecalculatePosition()
+{
+ mRecalculateDocablePosition = true;
+}
+
void LLDockControl::drawToungue()
{
- if (mEnabled)
+ bool use_tongue = false;
+ LLDockableFloater* dockable_floater =
+ dynamic_cast<LLDockableFloater*> (mDockableFloater);
+ if (dockable_floater != NULL)
+ {
+ use_tongue = dockable_floater->getUseTongue();
+ }
+
+ if (mEnabled && use_tongue)
{
mDockTongue->draw(mDockTongueX, mDockTongueY);
}
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index eaedb4c307..a5caf68001 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -47,8 +47,9 @@ class LLDockControl
public:
enum DocAt
{
- TOP
- ,LEFT
+ TOP,
+ LEFT,
+ BOTTOM
};
public:
@@ -63,6 +64,7 @@ public:
public:
void on();
void off();
+ void forceRecalculatePosition();
void setDock(LLView* dockWidget);
LLView* getDock()
{
@@ -75,6 +77,9 @@ public:
// gets a rect that bounds possible positions for a dockable control (EXT-1111)
void getAllowedRect(LLRect& rect);
+ S32 getTongueWidth() { return mDockTongue->getWidth(); }
+ S32 getTongueHeight() { return mDockTongue->getHeight(); }
+
private:
virtual void moveDockable();
private:
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index d9b98b1c28..832f148902 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -112,6 +112,8 @@ void LLDragHandleTop::setTitle(const std::string& title)
params.font(font);
params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT | FOLLOWS_RIGHT);
params.font_shadow(LLFontGL::DROP_SHADOW_SOFT);
+ params.use_ellipses = true;
+ params.allow_html = false; //cancel URL replacement in floater title
mTitleBox = LLUICtrlFactory::create<LLTextBox> (params);
addChild( mTitleBox );
}
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 19f203b80c..2481249f91 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -39,10 +39,8 @@
static const LLDefaultChildRegistry::Register<LLFlatListView> flat_list_view("flat_list_view");
-const LLSD SELECTED_EVENT = LLSD().insert("selected", true);
-const LLSD UNSELECTED_EVENT = LLSD().insert("selected", false);
-
-static const std::string COMMENT_TEXTBOX = "comment_text";
+const LLSD SELECTED_EVENT = LLSD().with("selected", true);
+const LLSD UNSELECTED_EVENT = LLSD().with("selected", false);
//forward declaration
bool llsds_are_equal(const LLSD& llsd_1, const LLSD& llsd_2);
@@ -51,7 +49,8 @@ LLFlatListView::Params::Params()
: item_pad("item_pad"),
allow_select("allow_select"),
multi_select("multi_select"),
- keep_one_selected("keep_one_selected")
+ keep_one_selected("keep_one_selected"),
+ no_items_text("no_items_text")
{};
void LLFlatListView::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
@@ -66,7 +65,7 @@ const LLRect& LLFlatListView::getItemsRect() const
return mItemsPanel->getRect();
}
-bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*/, EAddPosition pos /*= ADD_BOTTOM*/)
+bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*/, EAddPosition pos /*= ADD_BOTTOM*/,bool rearrange /*= true*/)
{
if (!item) return false;
if (value.isUndefined()) return false;
@@ -94,8 +93,14 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
- rearrangeItems();
- notifyParentItemsRectChanged();
+ // Children don't accept the focus
+ item->setTabStop(false);
+
+ if (rearrange)
+ {
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ }
return true;
}
@@ -282,23 +287,13 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)
{
onCommit();
}
+
+ // Stretch selected item rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
}
void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
{
- if (NULL == mNoItemsCommentTextbox)
- {
- LLRect comment_rect = getRect();
- comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight());
- comment_rect.stretch(-getBorderWidth());
- LLTextBox::Params text_p;
- text_p.name(COMMENT_TEXTBOX);
- text_p.border_visible(false);
- text_p.rect(comment_rect);
- text_p.follows.flags(FOLLOWS_ALL);
- mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this);
- }
-
mNoItemsCommentTextbox->setValue(comment_text);
}
@@ -352,7 +347,6 @@ bool LLFlatListView::updateValue(const LLSD& old_value, const LLSD& new_value)
// PROTECTED STUFF
//////////////////////////////////////////////////////////////////////////
-
LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
: LLScrollContainer(p)
, mItemComparator(NULL)
@@ -381,8 +375,53 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
//we don't need to stretch in vertical direction on reshaping by a parent
//no bottom following!
mItemsPanel->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
+
+ LLViewBorder::Params params;
+ params.name("scroll border");
+ params.rect(getLastSelectedItemRect());
+ params.visible(false);
+ params.bevel_style(LLViewBorder::BEVEL_IN);
+ mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params);
+ mItemsPanel->addChild( mSelectedItemsBorder );
+
+ {
+ // create textbox for "No Items" comment text
+ LLTextBox::Params text_p = p.no_items_text;
+ if (!text_p.rect.isProvided())
+ {
+ LLRect comment_rect = getRect();
+ comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight());
+ comment_rect.stretch(-getBorderWidth());
+ text_p.rect(comment_rect);
+ }
+ text_p.border_visible(false);
+
+ if (!text_p.follows.isProvided())
+ {
+ text_p.follows.flags(FOLLOWS_ALL);
+ }
+ mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this);
+ }
};
+// virtual
+void LLFlatListView::draw()
+{
+ // Highlight border if a child of this container has keyboard focus
+ if( mSelectedItemsBorder->getVisible() )
+ {
+ mSelectedItemsBorder->setKeyboardFocusHighlight( hasFocus() );
+ }
+ LLScrollContainer::draw();
+}
+
+// virtual
+BOOL LLFlatListView::postBuild()
+{
+ setTabStop(true);
+ return LLScrollContainer::postBuild();
+}
+
void LLFlatListView::rearrangeItems()
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
@@ -444,11 +483,16 @@ void LLFlatListView::rearrangeItems()
// move top for next item in list
item_new_top -= (rc.getHeight() + mItemPad);
}
+
+ // Stretch selected item rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
}
void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
{
if (!item_pair) return;
+
+ setFocus(TRUE);
bool select_item = !isSelected(item_pair);
@@ -473,6 +517,78 @@ void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask)
onItemMouseClick(item_pair, mask);
}
+BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
+{
+ BOOL reset_selection = (mask != MASK_SHIFT);
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ {
+ if (mSelectedItemPairs.size() && mask == MASK_NONE)
+ {
+ mOnReturnSignal(this, getValue());
+ handled = TRUE;
+ }
+ break;
+ }
+ case KEY_UP:
+ {
+ if ( !selectNextItemPair(true, reset_selection) && reset_selection)
+ {
+ // If case we are in accordion tab notify parent to go to the previous accordion
+ if(notifyParent(LLSD().with("action","select_prev")) > 0 )//message was processed
+ resetSelection();
+ }
+ break;
+ }
+ case KEY_DOWN:
+ {
+ if ( !selectNextItemPair(false, reset_selection) && reset_selection)
+ {
+ // If case we are in accordion tab notify parent to go to the next accordion
+ if( notifyParent(LLSD().with("action","select_next")) > 0 ) //message was processed
+ resetSelection();
+ }
+ break;
+ }
+ case 'A':
+ {
+ if(MASK_CONTROL & mask)
+ {
+ selectAll();
+ handled = TRUE;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ if ( ( key == KEY_UP || key == KEY_DOWN ) && mSelectedItemPairs.size() )
+ {
+ ensureSelectedVisible();
+ /*
+ LLRect visible_rc = getVisibleContentRect();
+ LLRect selected_rc = getLastSelectedItemRect();
+
+ if ( !visible_rc.contains (selected_rc) )
+ {
+ // But scroll in Items panel coordinates
+ scrollToShowRect(selected_rc);
+ }
+
+ // In case we are in accordion tab notify parent to show selected rectangle
+ LLRect screen_rc;
+ localRectToScreen(selected_rc, &screen_rc);
+ notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));*/
+
+ handled = TRUE;
+ }
+
+ return handled ? handled : LLScrollContainer::handleKeyHere(key, mask);
+}
+
LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const
{
llassert(item);
@@ -552,6 +668,147 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
onCommit();
}
+ // Stretch selected item rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
+
+ return true;
+}
+
+LLRect LLFlatListView::getLastSelectedItemRect()
+{
+ if (!mSelectedItemPairs.size())
+ {
+ return LLRect::null;
+ }
+
+ return mSelectedItemPairs.back()->first->getRect();
+}
+
+void LLFlatListView::selectFirstItem ()
+{
+ selectItemPair(mItemPairs.front(), true);
+ ensureSelectedVisible();
+}
+
+void LLFlatListView::selectLastItem ()
+{
+ selectItemPair(mItemPairs.back(), true);
+ ensureSelectedVisible();
+}
+
+void LLFlatListView::ensureSelectedVisible()
+{
+ LLRect selected_rc = getLastSelectedItemRect();
+
+ if ( selected_rc.isValid() )
+ {
+ scrollToShowRect(selected_rc);
+ }
+}
+
+
+// virtual
+bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
+{
+ // No items - no actions!
+ if ( !mItemPairs.size() )
+ return false;
+
+
+ item_pair_t* to_sel_pair = NULL;
+ item_pair_t* cur_sel_pair = NULL;
+ if ( mSelectedItemPairs.size() )
+ {
+ // Take the last selected pair
+ cur_sel_pair = mSelectedItemPairs.back();
+ // Bases on given direction choose next item to select
+ if ( is_up_direction )
+ {
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.rend();)
+ {
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
+ }
+ }
+ else
+ {
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.end();)
+ {
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ // If there weren't selected items then choose the first one bases on given direction
+ cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
+ // Force selection to first item
+ to_sel_pair = cur_sel_pair;
+ }
+
+
+ if ( to_sel_pair )
+ {
+ bool select = true;
+
+ if ( reset_selection )
+ {
+ // Reset current selection if we were asked about it
+ resetSelection();
+ }
+ else
+ {
+ // If item already selected and no reset request than we should deselect last selected item.
+ select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
+ }
+
+ // Select/Deselect next item
+ selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
+
+ return true;
+ }
+ return false;
+}
+
+bool LLFlatListView::selectAll()
+{
+ if (!mAllowSelection)
+ return false;
+
+ mSelectedItemPairs.clear();
+
+ for (pairs_const_iterator_t it= mItemPairs.begin(); it != mItemPairs.end(); ++it)
+ {
+ item_pair_t* item_pair = *it;
+ mSelectedItemPairs.push_back(item_pair);
+ //a way of notifying panel of selection state changes
+ LLPanel* item = item_pair->first;
+ item->setValue(SELECTED_EVENT);
+ }
+
+ if (mCommitOnSelectionChange)
+ {
+ onCommit();
+ }
+
+ // Stretch selected item rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
+
return true;
}
@@ -608,7 +865,11 @@ void LLFlatListView::notifyParentItemsRectChanged()
// take into account comment text height if exists
if (mNoItemsCommentTextbox && mNoItemsCommentTextbox->getVisible())
{
+ // top text padding inside the textbox is included into the height
comment_height = mNoItemsCommentTextbox->getTextPixelHeight();
+
+ // take into account a distance from parent's top border to textbox's top
+ comment_height += getRect().getHeight() - mNoItemsCommentTextbox->getRect().mTop;
}
LLRect req_rect = getItemsRect();
@@ -629,7 +890,8 @@ void LLFlatListView::notifyParentItemsRectChanged()
params["width"] = req_rect.getWidth();
params["height"] = req_rect.getHeight();
- getParent()->notifyParent(params);
+ if (getParent()) // dummy widgets don't have a parent
+ getParent()->notifyParent(params);
}
void LLFlatListView::setNoItemsCommentVisible(bool visible) const
@@ -638,11 +900,22 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const
{
if (visible)
{
+/*
+// *NOTE: MA 2010-02-04
+// Deprecated after params of the comment text box were moved into widget (flat_list_view.xml)
+// can be removed later if nothing happened.
// We have to update child rect here because of issues with rect after reshaping while creating LLTextbox
// It is possible to have invalid LLRect if Flat List is in LLAccordionTab
LLRect comment_rect = getLocalRect();
- comment_rect.stretch(-getBorderWidth());
+
+ // To see comment correctly (EXT - 3244) in mNoItemsCommentTextbox we must get border width
+ // of LLFlatListView (@see getBorderWidth()) and stretch mNoItemsCommentTextbox to this width
+ // But getBorderWidth() returns 0 if LLFlatListView not visible. So we have to get border width
+ // from 'scroll_border'
+ LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border");
+ comment_rect.stretch(-scroll_border->getBorderWidth());
mNoItemsCommentTextbox->setRect(comment_rect);
+*/
}
mNoItemsCommentTextbox->setVisible(visible);
}
@@ -670,4 +943,116 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const
}
}
+// virtual
+void LLFlatListView::onFocusReceived()
+{
+ mSelectedItemsBorder->setVisible(TRUE);
+}
+// virtual
+void LLFlatListView::onFocusLost()
+{
+ mSelectedItemsBorder->setVisible(FALSE);
+}
+
+//virtual
+S32 LLFlatListView::notify(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "select_first")
+ {
+ setFocus(true);
+ selectFirstItem();
+ return 1;
+ }
+ else if(str_action == "select_last")
+ {
+ setFocus(true);
+ selectLastItem();
+ return 1;
+ }
+ }
+ else if (info.has("rearrange"))
+ {
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ return 1;
+ }
+ return 0;
+}
+
+void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
+{
+ LLSD action;
+ action.with("detach", LLSD());
+ // Clear detached_items list
+ detached_items.clear();
+ // Go through items and detach valid items, remove them from items panel
+ // and add to detached_items.
+ for (pairs_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ LLPanel* pItem = (*iter)->first;
+ if (1 == pItem->notify(action))
+ {
+ selectItemPair((*iter), false);
+ mItemsPanel->removeChild(pItem);
+ detached_items.push_back(pItem);
+ }
+ }
+ if (!detached_items.empty())
+ {
+ // Some items were detached, clean ourself from unusable memory
+ if (detached_items.size() == mItemPairs.size())
+ {
+ // This way will be faster if all items were disconnected
+ for (pairs_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ (*iter)->first = NULL;
+ delete *iter;
+ }
+ mItemPairs.clear();
+ // Also set items panel height to zero.
+ // Reshape it to allow reshaping of non-item children.
+ LLRect rc = mItemsPanel->getRect();
+ rc.mBottom = rc.mTop;
+ mItemsPanel->reshape(rc.getWidth(), rc.getHeight());
+ mItemsPanel->setRect(rc);
+ setNoItemsCommentVisible(true);
+ }
+ else
+ {
+ for (std::vector<LLPanel*>::const_iterator
+ detached_iter = detached_items.begin(),
+ detached_iter_end = detached_items.end();
+ detached_iter != detached_iter_end; ++detached_iter)
+ {
+ LLPanel* pDetachedItem = *detached_iter;
+ for (pairs_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ item_pair_t* item_pair = *iter;
+ if (item_pair->first == pDetachedItem)
+ {
+ mItemPairs.erase(iter);
+ item_pair->first = NULL;
+ delete item_pair;
+ break;
+ }
+ }
+ }
+ rearrangeItems();
+ }
+ notifyParentItemsRectChanged();
+ }
+}
+
//EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 97772bc677..92cb40332e 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -35,8 +35,8 @@
#include "llpanel.h"
#include "llscrollcontainer.h"
+#include "lltextbox.h"
-class LLTextBox;
/**
* LLFlatListView represents a flat list ui control that operates on items in a form of LLPanel's.
@@ -50,7 +50,7 @@ class LLTextBox;
* is ignored. The option "keep_one_selected" forces at least one item to be selected at any time (only for mouse events on items)
* since any item of the list was selected.
*
- * Examples of using this control are presented in Picks panel (Me Profile and Profile View), where this control is used to
+ * Examples of using this control are presented in Picks panel (My Profile and Profile View), where this control is used to
* manage the list of pick items.
*
* ASSUMPTIONS AND STUFF
@@ -108,11 +108,18 @@ public:
/** padding between items */
Optional<U32> item_pad;
+ /** textbox with info message when list is empty*/
+ Optional<LLTextBox::Params> no_items_text;
+
Params();
};
virtual ~LLFlatListView() { clear(); };
+ /**
+ * Connects callback to signal called when Return key is pressed.
+ */
+ boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
/** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
@@ -120,6 +127,8 @@ public:
/** Returns full rect of child panel */
const LLRect& getItemsRect() const;
+ LLRect getRequiredRect() { return getItemsRect(); }
+
/** Returns distance between items */
const S32 getItemsPad() { return mItemPad; }
@@ -127,7 +136,7 @@ public:
* Adds and item and LLSD value associated with it to the list at specified position
* @return true if the item was added, false otherwise
*/
- virtual bool addItem(LLPanel * item, const LLSD& value = LLUUID::null, EAddPosition pos = ADD_BOTTOM);
+ virtual bool addItem(LLPanel * item, const LLSD& value = LLUUID::null, EAddPosition pos = ADD_BOTTOM, bool rearrange = true);
/**
* Insert item_to_add along with associated value to the list right after the after_item.
@@ -265,6 +274,15 @@ public:
virtual void clear();
/**
+ * Removes all items that can be detached from the list but doesn't destroy
+ * them, caller responsible to manage items after they are detached.
+ * Detachable item should accept "detach" action via notify() method,
+ * where it disconnect all callbacks, does other valuable routines and
+ * return 1.
+ */
+ void detachItems(std::vector<LLPanel*>& detached_items);
+
+ /**
* Set comparator to use for future sorts.
*
* This class does NOT manage lifetime of the comparator
@@ -275,6 +293,12 @@ public:
bool updateValue(const LLSD& old_value, const LLSD& new_value);
+
+ void selectFirstItem ();
+ void selectLastItem ();
+
+ virtual S32 notify(const LLSD& info) ;
+
protected:
/** Pairs LLpanel representing a single item LLPanel and LLSD associated with it */
@@ -318,6 +342,10 @@ protected:
virtual bool selectItemPair(item_pair_t* item_pair, bool select);
+ virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
+
+ virtual bool selectAll();
+
virtual bool isSelected(item_pair_t* item_pair) const;
virtual bool removeItemPair(item_pair_t* item_pair);
@@ -331,6 +359,19 @@ protected:
*/
void notifyParentItemsRectChanged();
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ virtual BOOL postBuild();
+
+ virtual void onFocusReceived();
+
+ virtual void onFocusLost();
+
+ virtual void draw();
+
+ LLRect getLastSelectedItemRect();
+
+ void ensureSelectedVisible();
private:
@@ -381,6 +422,10 @@ private:
LLRect mPrevNotifyParentRect;
LLTextBox* mNoItemsCommentTextbox;
+
+ LLViewBorder* mSelectedItemsBorder;
+
+ commit_signal_t mOnReturnSignal;
};
#endif
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index c8e26ecaea..b6d73cda3c 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -66,27 +66,6 @@
// use this to control "jumping" behavior when Ctrl-Tabbing
const S32 TABBED_FLOATER_OFFSET = 0;
-std::string LLFloater::sButtonActiveImageNames[BUTTON_COUNT] =
-{
- "Icon_Close_Foreground", //BUTTON_CLOSE
- "Icon_Restore_Foreground", //BUTTON_RESTORE
- "Icon_Minimize_Foreground", //BUTTON_MINIMIZE
- "tearoffbox.tga", //BUTTON_TEAR_OFF
- "Icon_Dock_Foreground", //BUTTON_DOCK
- "Icon_Undock_Foreground", //BUTTON_UNDOCK
- "Icon_Help_Foreground" //BUTTON_HELP
-};
-
-std::string LLFloater::sButtonPressedImageNames[BUTTON_COUNT] =
-{
- "Icon_Close_Press", //BUTTON_CLOSE
- "Icon_Restore_Press", //BUTTON_RESTORE
- "Icon_Minimize_Press", //BUTTON_MINIMIZE
- "tearoff_pressed.tga", //BUTTON_TEAR_OFF
- "Icon_Dock_Press", //BUTTON_DOCK
- "Icon_Undock_Press", //BUTTON_UNDOCK
- "Icon_Help_Press" //BUTTON_HELP
-};
std::string LLFloater::sButtonNames[BUTTON_COUNT] =
{
@@ -95,7 +74,6 @@ std::string LLFloater::sButtonNames[BUTTON_COUNT] =
"llfloater_minimize_btn", //BUTTON_MINIMIZE
"llfloater_tear_off_btn", //BUTTON_TEAR_OFF
"llfloater_dock_btn", //BUTTON_DOCK
- "llfloater_undock_btn", //BUTTON_UNDOCK
"llfloater_help_btn" //BUTTON_HELP
};
@@ -112,7 +90,6 @@ std::string LLFloater::sButtonToolTipsIndex[BUTTON_COUNT]=
"BUTTON_MINIMIZE", //"Minimize", //BUTTON_MINIMIZE
"BUTTON_TEAR_OFF", //"Tear Off", //BUTTON_TEAR_OFF
"BUTTON_DOCK",
- "BUTTON_UNDOCK",
"BUTTON_HELP"
};
@@ -123,7 +100,6 @@ LLFloater::click_callback LLFloater::sButtonCallbacks[BUTTON_COUNT] =
LLFloater::onClickMinimize, //BUTTON_MINIMIZE
LLFloater::onClickTearOff, //BUTTON_TEAR_OFF
LLFloater::onClickDock, //BUTTON_DOCK
- LLFloater::onClickDock, //BUTTON_UNDOCK
LLFloater::onClickHelp //BUTTON_HELP
};
@@ -189,11 +165,24 @@ LLFloater::Params::Params()
can_close("can_close", true),
can_drag_on_left("can_drag_on_left", false),
can_tear_off("can_tear_off", true),
+ save_dock_state("save_dock_state", false),
save_rect("save_rect", false),
save_visibility("save_visibility", false),
can_dock("can_dock", false),
header_height("header_height", 0),
legacy_header_height("legacy_header_height", 0),
+ close_image("close_image"),
+ restore_image("restore_image"),
+ minimize_image("minimize_image"),
+ tear_off_image("tear_off_image"),
+ dock_image("dock_image"),
+ help_image("help_image"),
+ close_pressed_image("close_pressed_image"),
+ restore_pressed_image("restore_pressed_image"),
+ minimize_pressed_image("minimize_pressed_image"),
+ tear_off_pressed_image("tear_off_pressed_image"),
+ dock_pressed_image("dock_pressed_image"),
+ help_pressed_image("help_pressed_image"),
open_callback("open_callback"),
close_callback("close_callback")
{
@@ -244,13 +233,14 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
mAutoFocus(TRUE), // automatically take focus when opened
mCanDock(false),
mDocked(false),
+ mTornOff(false),
mHasBeenDraggedWhileMinimized(FALSE),
mPreviousMinimizedBottom(0),
- mPreviousMinimizedLeft(0),
- mNotificationContext(NULL)
+ mPreviousMinimizedLeft(0)
+// mNotificationContext(NULL)
{
mHandle.bind(this);
- mNotificationContext = new LLFloaterNotificationContext(getHandle());
+// mNotificationContext = new LLFloaterNotificationContext(getHandle());
// Clicks stop here.
setMouseOpaque(TRUE);
@@ -262,31 +252,22 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
// prior rectangle to be used on restore.
mExpandedRect.set(0,0,0,0);
- for (S32 i = 0; i < BUTTON_COUNT; i++)
- {
- mButtonsEnabled[i] = FALSE;
- mButtons[i] = NULL;
- }
- for (S32 i = 0; i < 4; i++)
- {
- mResizeBar[i] = NULL;
- mResizeHandle[i] = NULL;
- }
+ memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool));
+ memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*));
+
+ addDragHandle();
+ addResizeCtrls();
initFromParams(p);
// chrome floaters don't take focus at all
setFocusRoot(!getIsChrome());
- addDragHandle();
- addResizeCtrls();
- enableResizeCtrls(mResizable);
-
- initFloater();
+ initFloater(p);
}
// Note: Floaters constructed from XML call init() twice!
-void LLFloater::initFloater()
+void LLFloater::initFloater(const Params& p)
{
// Close button.
if (mCanClose)
@@ -311,7 +292,7 @@ void LLFloater::initFloater()
mButtonsEnabled[BUTTON_DOCK] = TRUE;
}
- buildButtons();
+ buildButtons(p);
// Floaters are created in the invisible state
setVisible(FALSE);
@@ -474,8 +455,8 @@ LLFloater::~LLFloater()
{
LLFloaterReg::removeInstance(mInstanceName, mKey);
- delete mNotificationContext;
- mNotificationContext = NULL;
+// delete mNotificationContext;
+// mNotificationContext = NULL;
//// am I not hosted by another floater?
//if (mHostHandle.isDead())
@@ -508,6 +489,7 @@ LLFloater::~LLFloater()
storeRectControl();
setVisible(false); // We're not visible if we're destroyed
storeVisibilityControl();
+ storeDockStateControl();
}
void LLFloater::storeRectControl()
@@ -526,6 +508,15 @@ void LLFloater::storeVisibilityControl()
}
}
+void LLFloater::storeDockStateControl()
+{
+ if( !sQuitting && mDocStateControl.size() > 1 )
+ {
+ LLUI::sSettingGroups["floater"]->setBOOL( mDocStateControl, isDocked() );
+ }
+}
+
+
void LLFloater::setVisible( BOOL visible )
{
LLPanel::setVisible(visible); // calls handleVisibilityChange()
@@ -768,6 +759,12 @@ LLMultiFloater* LLFloater::getHost()
return (LLMultiFloater*)mHostHandle.get();
}
+void LLFloater::applySavedVariables()
+{
+ applyRectControl();
+ applyDockState();
+}
+
void LLFloater::applyRectControl()
{
if (mRectControl.size() > 1)
@@ -784,6 +781,16 @@ void LLFloater::applyRectControl()
}
}
+void LLFloater::applyDockState()
+{
+ if (mDocStateControl.size() > 1)
+ {
+ bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl);
+ setDocked(dockState);
+ }
+
+}
+
void LLFloater::applyTitle()
{
if (!mDragHandle)
@@ -872,9 +879,11 @@ void LLFloater::setSnappedTo(const LLView* snap_view)
else
{
//RN: assume it's a floater as it must be a sibling to our parent floater
- LLFloater* floaterp = (LLFloater*)snap_view;
-
- setSnapTarget(floaterp->getHandle());
+ const LLFloater* floaterp = dynamic_cast<const LLFloater*>(snap_view);
+ if (floaterp)
+ {
+ setSnapTarget(floaterp->getHandle());
+ }
}
}
@@ -1059,10 +1068,6 @@ void LLFloater::setMinimized(BOOL minimize)
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
}
- // don't show the help button while minimized - it's
- // not very useful when minimized and uses up space
- mButtonsEnabled[BUTTON_HELP] = !minimize;
-
applyTitle ();
make_ui_sound("UISndWindowClose");
@@ -1260,7 +1265,7 @@ void LLFloater::removeDependentFloater(LLFloater* floaterp)
floaterp->mDependeeHandle = LLHandle<LLFloater>();
}
-BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index)
+BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index)
{
if( mButtonsEnabled[index] )
{
@@ -1355,6 +1360,7 @@ void LLFloater::bringToFront( S32 x, S32 y )
// virtual
void LLFloater::setVisibleAndFrontmost(BOOL take_focus)
{
+ gFocusMgr.setTopCtrl(NULL);
setVisible(TRUE);
setFrontmost(take_focus);
}
@@ -1384,12 +1390,10 @@ void LLFloater::setCanDock(bool b)
if(mCanDock)
{
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
- mButtonsEnabled[BUTTON_UNDOCK] = mDocked;
}
else
{
mButtonsEnabled[BUTTON_DOCK] = FALSE;
- mButtonsEnabled[BUTTON_UNDOCK] = FALSE;
}
}
updateButtons();
@@ -1401,9 +1405,11 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
- mButtonsEnabled[BUTTON_UNDOCK] = mDocked;
updateButtons();
+
+ storeDockStateControl();
}
+
}
// static
@@ -1438,6 +1444,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
gFloaterView->adjustToFitScreen(self, FALSE);
// give focus to new window to keep continuity for the user
self->setFocus(TRUE);
+ self->setTornOff(true);
}
else //Attach to parent.
{
@@ -1449,7 +1456,9 @@ void LLFloater::onClickTearOff(LLFloater* self)
// make sure host is visible
new_host->openFloater(new_host->getKey());
}
+ self->setTornOff(false);
}
+ self->updateButtons();
}
// static
@@ -1556,43 +1565,34 @@ void LLFloater::draw()
// draw background
if( isBackgroundVisible() )
{
+ drawShadow(this);
+
S32 left = LLPANEL_BORDER_WIDTH;
S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH;
S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH;
S32 bottom = LLPANEL_BORDER_WIDTH;
- static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
- static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
- LLColor4 shadow_color = shadow_color_cached;
- F32 shadow_offset = (F32)shadow_offset_S32;
-
- if (!isBackgroundOpaque())
- {
- shadow_offset *= 0.2f;
- shadow_color.mV[VALPHA] *= 0.5f;
- }
- gl_drop_shadow(left, top, right, bottom,
- shadow_color % alpha,
- llround(shadow_offset));
-
LLUIImage* image = NULL;
LLColor4 color;
+ LLColor4 overlay_color;
if (isBackgroundOpaque())
{
// NOTE: image may not be set
image = getBackgroundImage();
color = getBackgroundColor();
+ overlay_color = getBackgroundImageOverlay();
}
else
{
image = getTransparentImage();
color = getTransparentColor();
+ overlay_color = getTransparentImageOverlay();
}
if (image)
{
// We're using images for this floater's backgrounds
- image->draw(getLocalRect(), UI_VERTEX_COLOR % alpha);
+ image->draw(getLocalRect(), overlay_color % alpha);
}
else
{
@@ -1641,23 +1641,8 @@ void LLFloater::draw()
}
else
{
- // draw children
- LLView* focused_child = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
- BOOL focused_child_visible = FALSE;
- if (focused_child && focused_child->getParent() == this)
- {
- focused_child_visible = focused_child->getVisible();
- focused_child->setVisible(FALSE);
- }
-
// don't call LLPanel::draw() since we've implemented custom background rendering
LLView::draw();
-
- if (focused_child_visible)
- {
- focused_child->setVisible(TRUE);
- }
- drawChild(focused_child);
}
// update tearoff button for torn off floaters
@@ -1672,6 +1657,29 @@ void LLFloater::draw()
}
}
+void LLFloater::drawShadow(LLPanel* panel)
+{
+ F32 alpha = panel->getDrawContext().mAlpha;
+ S32 left = LLPANEL_BORDER_WIDTH;
+ S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH;
+ S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH;
+ S32 bottom = LLPANEL_BORDER_WIDTH;
+
+ static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
+ static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
+ LLColor4 shadow_color = shadow_color_cached;
+ F32 shadow_offset = (F32)shadow_offset_S32;
+
+ if (!panel->isBackgroundOpaque())
+ {
+ shadow_offset *= 0.2f;
+ shadow_color.mV[VALPHA] *= 0.5f;
+ }
+ gl_drop_shadow(left, top, right, bottom,
+ shadow_color % alpha,
+ llround(shadow_offset));
+}
+
void LLFloater::setCanMinimize(BOOL can_minimize)
{
// if removing minimize/restore button programmatically,
@@ -1732,14 +1740,32 @@ void LLFloater::updateButtons()
S32 button_count = 0;
for (S32 i = 0; i < BUTTON_COUNT; i++)
{
- if(!mButtons[i]) continue;
- mButtons[i]->setEnabled(mButtonsEnabled[i]);
+ if (!mButtons[i])
+ {
+ continue;
+ }
- if (mButtonsEnabled[i]
- //*HACK: always render close button for hosted floaters
- // so that users don't accidentally hit the button when closing multiple windows
- // in the chatterbox
- || (i == BUTTON_CLOSE && mButtonScale != 1.f))
+ bool enabled = mButtonsEnabled[i];
+ if (i == BUTTON_HELP)
+ {
+ // don't show the help button if the floater is minimized
+ // or if it is a docked tear-off floater
+ if (isMinimized() || (mButtonsEnabled[BUTTON_TEAR_OFF] && ! mTornOff))
+ {
+ enabled = false;
+ }
+ }
+ if (i == BUTTON_CLOSE && mButtonScale != 1.f)
+ {
+ //*HACK: always render close button for hosted floaters so
+ //that users don't accidentally hit the button when
+ //closing multiple windows in the chatterbox
+ enabled = true;
+ }
+
+ mButtons[i]->setEnabled(enabled);
+
+ if (enabled)
{
button_count++;
@@ -1766,7 +1792,7 @@ void LLFloater::updateButtons()
// the restore button should have a tab stop so that it takes action when you Ctrl-Tab to a minimized floater
mButtons[i]->setTabStop(i == BUTTON_RESTORE);
}
- else if (mButtons[i])
+ else
{
mButtons[i]->setVisible(FALSE);
}
@@ -1775,7 +1801,7 @@ void LLFloater::updateButtons()
mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));
}
-void LLFloater::buildButtons()
+void LLFloater::buildButtons(const Params& floater_params)
{
static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0);
@@ -1809,19 +1835,20 @@ void LLFloater::buildButtons()
LLButton::Params p;
p.name(sButtonNames[i]);
p.rect(btn_rect);
- p.label("");
- p.image_unselected.name(sButtonActiveImageNames[i]);
+ p.image_unselected = getButtonImage(floater_params, (EFloaterButton)i);
// Selected, no matter if hovered or not, is "pressed"
- p.image_selected.name(sButtonPressedImageNames[i]);
- p.image_hover_selected.name(sButtonPressedImageNames[i]);
+ LLUIImage* pressed_image = getButtonPressedImage(floater_params, (EFloaterButton)i);
+ p.image_selected = pressed_image;
+ p.image_hover_selected = pressed_image;
// Use a glow effect when the user hovers over the button
// These icons are really small, need glow amount increased
p.hover_glow_amount( 0.33f );
p.click_callback.function(boost::bind(sButtonCallbacks[i], this));
p.tab_stop(false);
p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
- p.tool_tip(sButtonToolTips[i]);
+ p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);
p.scale_image(true);
+ p.chrome(true);
LLButton* buttonp = LLUICtrlFactory::create<LLButton>(p);
addChild(buttonp);
@@ -1831,14 +1858,66 @@ void LLFloater::buildButtons()
updateButtons();
}
+// static
+LLUIImage* LLFloater::getButtonImage(const Params& p, EFloaterButton e)
+{
+ switch(e)
+ {
+ default:
+ case BUTTON_CLOSE:
+ return p.close_image;
+ case BUTTON_RESTORE:
+ return p.restore_image;
+ case BUTTON_MINIMIZE:
+ return p.minimize_image;
+ case BUTTON_TEAR_OFF:
+ return p.tear_off_image;
+ case BUTTON_DOCK:
+ return p.dock_image;
+ case BUTTON_HELP:
+ return p.help_image;
+ }
+}
+
+// static
+LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)
+{
+ switch(e)
+ {
+ default:
+ case BUTTON_CLOSE:
+ return p.close_pressed_image;
+ case BUTTON_RESTORE:
+ return p.restore_pressed_image;
+ case BUTTON_MINIMIZE:
+ return p.minimize_pressed_image;
+ case BUTTON_TEAR_OFF:
+ return p.tear_off_pressed_image;
+ case BUTTON_DOCK:
+ return p.dock_pressed_image;
+ case BUTTON_HELP:
+ return p.help_pressed_image;
+ }
+}
+
+// static
+std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e)
+{
+ // TODO: per-floater localizable tooltips set in XML
+ return sButtonToolTips[e];
+}
+
/////////////////////////////////////////////////////
// LLFloaterView
+static LLDefaultChildRegistry::Register<LLFloaterView> r("floater_view");
+
LLFloaterView::LLFloaterView (const Params& p)
: LLUICtrl (p),
+
mFocusCycleMode(FALSE),
- mSnapOffsetBottom(0)
- ,mSnapOffsetRight(0)
+ mSnapOffsetBottom(0),
+ mSnapOffsetRight(0)
{
}
@@ -1863,41 +1942,50 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren
// dependents use same follow flags as their "dependee"
continue;
}
- LLRect r = floaterp->getRect();
-
- // Compute absolute distance from each edge of screen
- S32 left_offset = llabs(r.mLeft - 0);
- S32 right_offset = llabs(old_width - r.mRight);
-
- S32 top_offset = llabs(old_height - r.mTop);
- S32 bottom_offset = llabs(r.mBottom - 0);
// Make if follow the edge it is closest to
U32 follow_flags = 0x0;
- if (left_offset < right_offset)
+ if (floaterp->isMinimized())
{
- follow_flags |= FOLLOWS_LEFT;
+ follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);
}
else
{
- follow_flags |= FOLLOWS_RIGHT;
- }
+ LLRect r = floaterp->getRect();
- // "No vertical adjustment" usually means that the bottom of the view
- // has been pushed up or down. Hence we want the floaters to follow
- // the top.
- if (!adjust_vertical)
- {
- follow_flags |= FOLLOWS_TOP;
- }
- else if (top_offset < bottom_offset)
- {
- follow_flags |= FOLLOWS_TOP;
- }
- else
- {
- follow_flags |= FOLLOWS_BOTTOM;
+ // Compute absolute distance from each edge of screen
+ S32 left_offset = llabs(r.mLeft - 0);
+ S32 right_offset = llabs(old_width - r.mRight);
+
+ S32 top_offset = llabs(old_height - r.mTop);
+ S32 bottom_offset = llabs(r.mBottom - 0);
+
+
+ if (left_offset < right_offset)
+ {
+ follow_flags |= FOLLOWS_LEFT;
+ }
+ else
+ {
+ follow_flags |= FOLLOWS_RIGHT;
+ }
+
+ // "No vertical adjustment" usually means that the bottom of the view
+ // has been pushed up or down. Hence we want the floaters to follow
+ // the top.
+ if (!adjust_vertical)
+ {
+ follow_flags |= FOLLOWS_TOP;
+ }
+ else if (top_offset < bottom_offset)
+ {
+ follow_flags |= FOLLOWS_TOP;
+ }
+ else
+ {
+ follow_flags |= FOLLOWS_BOTTOM;
+ }
}
floaterp->setFollows(follow_flags);
@@ -2078,6 +2166,11 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))
{
child->setFocus(TRUE);
+ // floater did not take focus, so relinquish focus to world
+ if (!child->hasFocus())
+ {
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
}
}
@@ -2147,16 +2240,16 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
const LLFloater::Params& default_params = LLFloater::getDefaultParams();
S32 floater_header_size = default_params.header_height;
static LLUICachedControl<S32> minimized_width ("UIMinimizedWidth", 0);
- S32 col = 0;
LLRect snap_rect_local = getLocalSnapRect();
- for(S32 row = snap_rect_local.mBottom;
- row < snap_rect_local.getHeight() - floater_header_size;
- row += floater_header_size ) //loop rows
- {
- for(col = snap_rect_local.mLeft;
- col < snap_rect_local.getWidth() - minimized_width;
- col += minimized_width)
+ for(S32 col = snap_rect_local.mLeft;
+ col < snap_rect_local.getWidth() - minimized_width;
+ col += minimized_width)
+ {
+ for(S32 row = snap_rect_local.mTop - floater_header_size;
+ row > floater_header_size;
+ row -= floater_header_size ) //loop rows
{
+
bool foundGap = TRUE;
for(child_list_const_iter_t child_it = getChildList()->begin();
child_it != getChildList()->end();
@@ -2268,9 +2361,8 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
}
LLRect::tCoordType screen_width = getSnapRect().getWidth();
LLRect::tCoordType screen_height = getSnapRect().getHeight();
- // convert to local coordinate frame
- LLRect snap_rect_local = getLocalSnapRect();
+
// only automatically resize non-minimized, resizable floaters
if( floater->isResizable() && !floater->isMinimized() )
{
@@ -2295,7 +2387,11 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
new_width = llmax(new_width, min_width);
new_height = llmax(new_height, min_height);
- floater->reshape( new_width, new_height, TRUE );
+ LLRect new_rect;
+ new_rect.setLeftTopAndSize(view_rect.mLeft,view_rect.mTop,new_width, new_height);
+
+ floater->setShape(new_rect);
+
if (floater->followsRight())
{
floater->translate(old_width - new_width, 0);
@@ -2309,7 +2405,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
}
// move window fully onscreen
- if (floater->translateIntoRect( snap_rect_local, allow_partial_outside ))
+ if (floater->translateIntoRect( getLocalRect(), allow_partial_outside ))
{
floater->clearSnapTarget();
}
@@ -2488,12 +2584,18 @@ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list)
view->pushVisible(visible);
}
}
+
+ LLFloaterReg::blockShowFloaters(true);
}
void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)
{
- for (child_list_const_iter_t child_iter = getChildList()->begin();
- child_iter != getChildList()->end(); ++child_iter)
+ // make a copy of the list since some floaters change their
+ // order in the childList when changing visibility.
+ child_list_t child_list_copy = *getChildList();
+
+ for (child_list_const_iter_t child_iter = child_list_copy.begin();
+ child_iter != child_list_copy.end(); ++child_iter)
{
LLView *view = *child_iter;
if (skip_list.find(view) == skip_list.end())
@@ -2501,6 +2603,8 @@ void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)
view->popVisible();
}
}
+
+ LLFloaterReg::blockShowFloaters(false);
}
void LLFloater::setInstanceName(const std::string& name)
@@ -2520,6 +2624,11 @@ void LLFloater::setInstanceName(const std::string& name)
{
mVisibilityControl = LLFloaterReg::declareVisibilityControl(mInstanceName);
}
+ if(!mDocStateControl.empty())
+ {
+ mDocStateControl = LLFloaterReg::declareDockStateControl(mInstanceName);
+ }
+
}
}
@@ -2560,7 +2669,7 @@ void LLFloater::setupParamsForExport(Params& p, LLView* parent)
void LLFloater::initFromParams(const LLFloater::Params& p)
{
- // *NOTE: We have too many classes derived from LLPanel to retrofit them
+ // *NOTE: We have too many classes derived from LLFloater to retrofit them
// all to pass in params via constructors. So we use this method.
// control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
@@ -2574,11 +2683,10 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
setCanMinimize(p.can_minimize);
setCanClose(p.can_close);
setCanDock(p.can_dock);
+ setCanResize(p.can_resize);
+ setResizeLimits(p.min_width, p.min_height);
mDragOnLeft = p.can_drag_on_left;
- mResizable = p.can_resize;
- mMinWidth = p.min_width;
- mMinHeight = p.min_height;
mHeaderHeight = p.header_height;
mLegacyHeaderHeight = p.legacy_header_height;
mSingleInstance = p.single_instance;
@@ -2592,13 +2700,22 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
{
mVisibilityControl = "t"; // flag to build mVisibilityControl name once mInstanceName is set
}
+
+ if(p.save_dock_state)
+ {
+ mDocStateControl = "t"; // flag to build mDocStateControl name once mInstanceName is set
+ }
// open callback
if (p.open_callback.isProvided())
- initCommitCallback(p.open_callback, mOpenSignal);
+ {
+ mOpenSignal.connect(initCommitCallback(p.open_callback));
+ }
// close callback
if (p.close_callback.isProvided())
- initCommitCallback(p.close_callback, mCloseSignal);
+ {
+ mCloseSignal.connect(initCommitCallback(p.close_callback));
+ }
}
LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
@@ -2618,10 +2735,23 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
output_node, output_params, &default_params);
}
- setupParams(params, parent);
+ // Default floater position to top-left corner of screen
+ // However, some legacy floaters have explicit top or bottom
+ // coordinates set, so respect their wishes.
+ if (!params.rect.top.isProvided() && !params.rect.bottom.isProvided())
+ {
+ params.rect.top.set(0);
+ }
+ if (!params.rect.left.isProvided() && !params.rect.right.isProvided())
+ {
+ params.rect.left.set(0);
+ }
+
+ params.from_xui = true;
+ applyXUILayout(params, parent);
initFromParams(params);
- initFloater();
+ initFloater(params);
LLMultiFloater* last_host = LLFloater::getFloaterHost();
if (node->hasName("multi_floater"))
@@ -2670,6 +2800,8 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
moveResizeHandlesToFront();
+ applyDockState();
+
return true; // *TODO: Error checking
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index afdc4ccf00..19e8288807 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -39,7 +39,7 @@
#include "llpanel.h"
#include "lluuid.h"
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
#include <set>
class LLDragHandle;
@@ -65,20 +65,6 @@ const BOOL CLOSE_NO = FALSE;
const BOOL ADJUST_VERTICAL_YES = TRUE;
const BOOL ADJUST_VERTICAL_NO = FALSE;
-// associates a given notification instance with a particular floater
-class LLFloaterNotificationContext :
- public LLNotificationContext
-{
-public:
- LLFloaterNotificationContext(LLHandle<LLFloater> floater_handle) :
- mFloaterHandle(floater_handle)
- {}
-
- LLFloater* getFloater() { return mFloaterHandle.get(); }
-private:
- LLHandle<LLFloater> mFloaterHandle;
-};
-
class LLFloater : public LLPanel
{
friend class LLFloaterView;
@@ -97,14 +83,13 @@ public:
|*==========================================================================*/
};
- enum EFloaterButtons
+ enum EFloaterButton
{
BUTTON_CLOSE = 0,
BUTTON_RESTORE,
BUTTON_MINIMIZE,
BUTTON_TEAR_OFF,
BUTTON_DOCK,
- BUTTON_UNDOCK,
BUTTON_HELP,
BUTTON_COUNT
};
@@ -124,9 +109,24 @@ public:
can_tear_off,
save_rect,
save_visibility,
+ save_dock_state,
can_dock;
Optional<S32> header_height,
legacy_header_height; // HACK see initFromXML()
+
+ // Images for top-right controls
+ Optional<LLUIImage*> close_image,
+ restore_image,
+ minimize_image,
+ tear_off_image,
+ dock_image,
+ help_image;
+ Optional<LLUIImage*> close_pressed_image,
+ restore_pressed_image,
+ minimize_pressed_image,
+ tear_off_pressed_image,
+ dock_pressed_image,
+ help_pressed_image;
Optional<CommitCallbackParam> open_callback,
close_callback;
@@ -157,7 +157,7 @@ public:
/*virtual*/ void setIsChrome(BOOL is_chrome);
/*virtual*/ void setRect(const LLRect &rect);
- void initFloater();
+ void initFloater(const Params& p);
void openFloater(const LLSD& key = LLSD());
@@ -194,6 +194,7 @@ public:
/// The static isShown() can accept a NULL pointer (which of course
/// returns false). When non-NULL, it calls the non-static isShown().
static bool isShown(const LLFloater* floater);
+ BOOL isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
BOOL isFrontmost();
BOOL isDependent() { return !mDependeeHandle.isDead(); }
void setCanMinimize(BOOL can_minimize);
@@ -221,6 +222,7 @@ public:
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask);
virtual void draw();
+ virtual void drawShadow(LLPanel* panel);
virtual void onOpen(const LLSD& key) {}
virtual void onClose(bool app_quitting) {}
@@ -255,6 +257,8 @@ public:
bool isDocked() const { return mDocked; }
virtual void setDocked(bool docked, bool pop_on_undock = true);
+ virtual void setTornOff(bool torn_off) { mTornOff = torn_off; }
+
// Return a closeable floater, if any, given the current focus.
static LLFloater* getClosableFloaterFromFocus();
@@ -262,10 +266,10 @@ public:
// handle refocusing.
static void closeFocusedFloater();
- LLNotification::Params contextualNotification(const std::string& name)
- {
- return LLNotification::Params(name).context(mNotificationContext);
- }
+// LLNotification::Params contextualNotification(const std::string& name)
+// {
+// return LLNotification::Params(name).context(mNotificationContext);
+// }
static void onClickClose(LLFloater* floater);
static void onClickMinimize(LLFloater* floater);
@@ -279,9 +283,14 @@ public:
protected:
void setRectControl(const std::string& rectname) { mRectControl = rectname; };
+
+ virtual void applySavedVariables();
+
void applyRectControl();
+ void applyDockState();
void storeRectControl();
void storeVisibilityControl();
+ void storeDockStateControl();
void setKey(const LLSD& key);
void setInstanceName(const std::string& name);
@@ -293,6 +302,7 @@ protected:
const LLRect& getExpandedRect() const { return mExpandedRect; }
void setAutoFocus(BOOL focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
+ BOOL getAutoFocus() const { return mAutoFocus; }
LLDragHandle* getDragHandle() const { return mDragHandle; }
void destroy() { die(); } // Don't call this directly. You probably want to call closeFloater()
@@ -302,8 +312,15 @@ private:
void cleanupHandles(); // remove handles to dead floaters
void createMinimizeButton();
void updateButtons();
- void buildButtons();
- BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index);
+ void buildButtons(const Params& p);
+
+ // Images and tooltips are named in the XML, but we want to look them
+ // up by index.
+ static LLUIImage* getButtonImage(const Params& p, EFloaterButton e);
+ static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e);
+ static std::string getButtonTooltip(const Params& p, EFloaterButton e);
+
+ BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
void enableResizeCtrls(bool enable);
@@ -322,6 +339,7 @@ public:
protected:
std::string mRectControl;
std::string mVisibilityControl;
+ std::string mDocStateControl;
LLSD mKey; // Key used for retrieving instances; set (for now) by LLFLoaterReg
LLDragHandle* mDragHandle;
@@ -360,7 +378,7 @@ private:
typedef std::set<LLHandle<LLFloater> >::iterator handle_set_iter_t;
handle_set_t mDependents;
- BOOL mButtonsEnabled[BUTTON_COUNT];
+ bool mButtonsEnabled[BUTTON_COUNT];
LLButton* mButtons[BUTTON_COUNT];
F32 mButtonScale;
BOOL mAutoFocus;
@@ -371,11 +389,10 @@ private:
bool mCanDock;
bool mDocked;
+ bool mTornOff;
static LLMultiFloater* sHostp;
static BOOL sQuitting;
- static std::string sButtonActiveImageNames[BUTTON_COUNT];
- static std::string sButtonPressedImageNames[BUTTON_COUNT];
static std::string sButtonNames[BUTTON_COUNT];
static std::string sButtonToolTips[BUTTON_COUNT];
static std::string sButtonToolTipsIndex[BUTTON_COUNT];
@@ -393,7 +410,7 @@ private:
S32 mPreviousMinimizedBottom;
S32 mPreviousMinimizedLeft;
- LLFloaterNotificationContext* mNotificationContext;
+// LLFloaterNotificationContext* mNotificationContext;
LLRootHandle<LLFloater> mHandle;
};
@@ -453,9 +470,6 @@ public:
void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
private:
- S32 mColumn;
- S32 mNextLeft;
- S32 mNextTop;
BOOL mFocusCycleMode;
S32 mSnapOffsetBottom;
S32 mSnapOffsetRight;
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 3c5a8a6921..5de3934c8a 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -34,6 +34,7 @@
#include "llfloaterreg.h"
+//#include "llagent.h"
#include "llfloater.h"
#include "llmultifloater.h"
#include "llfloaterreglistener.h"
@@ -45,8 +46,9 @@ LLFloaterReg::instance_list_t LLFloaterReg::sNullInstanceList;
LLFloaterReg::instance_map_t LLFloaterReg::sInstanceMap;
LLFloaterReg::build_map_t LLFloaterReg::sBuildMap;
std::map<std::string,std::string> LLFloaterReg::sGroupMap;
+bool LLFloaterReg::sBlockShowFloaters = false;
-static LLFloaterRegListener sFloaterRegListener("LLFloaterReg");
+static LLFloaterRegListener sFloaterRegListener;
//*******************************************************
@@ -127,14 +129,14 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
bool success = LLUICtrlFactory::getInstance()->buildFloater(res, xui_file, NULL);
if (!success)
{
- llwarns << "Failed to buid floater type: '" << name << "'." << llendl;
+ llwarns << "Failed to build floater type: '" << name << "'." << llendl;
return NULL;
}
// Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe
res->mKey = key;
res->setInstanceName(name);
- res->applyRectControl(); // Can't apply rect control until setting instance name
+ res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
if (res->mAutoTile && !res->getHost() && index > 0)
{
const LLRect& cur_rect = res->getRect();
@@ -217,6 +219,8 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str
//static
LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
{
+ if( sBlockShowFloaters )
+ return 0;//
LLFloater* instance = getInstance(name, key);
if (instance)
{
@@ -364,6 +368,26 @@ std::string LLFloaterReg::declareVisibilityControl(const std::string& name)
}
//static
+std::string LLFloaterReg::declareDockStateControl(const std::string& name)
+{
+ std::string controlname = getDockStateControlName(name);
+ LLUI::sSettingGroups["floater"]->declareBOOL(controlname, TRUE,
+ llformat("Window Docking state for %s", name.c_str()),
+ TRUE);
+ return controlname;
+
+}
+
+//static
+std::string LLFloaterReg::getDockStateControlName(const std::string& name)
+{
+ std::string res = std::string("floater_dock_") + name;
+ LLStringUtil::replaceChar( res, ' ', '_' );
+ return res;
+}
+
+
+//static
void LLFloaterReg::registerControlVariables()
{
// Iterate through alll registered instance names and register rect and visibility control variables
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 451bd1dbe3..8a11d5c3f2 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -75,6 +75,7 @@ private:
static instance_map_t sInstanceMap;
static build_map_t sBuildMap;
static std::map<std::string,std::string> sGroupMap;
+ static bool sBlockShowFloaters;
public:
// Registration
@@ -121,6 +122,10 @@ public:
static std::string declareRectControl(const std::string& name);
static std::string getVisibilityControlName(const std::string& name);
static std::string declareVisibilityControl(const std::string& name);
+
+ static std::string declareDockStateControl(const std::string& name);
+ static std::string getDockStateControlName(const std::string& name);
+
static void registerControlVariables();
// Callback wrappers
@@ -148,6 +153,8 @@ public:
{
return dynamic_cast<T*>(showInstance(name, key, focus));
}
+
+ static void blockShowFloaters(bool value) { sBlockShowFloaters = value;}
};
diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp
index 57d148b5af..082d7c1573 100644
--- a/indra/llui/llfloaterreglistener.cpp
+++ b/indra/llui/llfloaterreglistener.cpp
@@ -21,19 +21,35 @@
#include "llfloater.h"
#include "llbutton.h"
-LLFloaterRegListener::LLFloaterRegListener(const std::string& pumpName):
- LLDispatchListener(pumpName, "op")
+LLFloaterRegListener::LLFloaterRegListener():
+ LLEventAPI("LLFloaterReg",
+ "LLFloaterReg listener to (e.g.) show/hide LLFloater instances")
{
- add("getBuildMap", &LLFloaterRegListener::getBuildMap, LLSD().insert("reply", LLSD()));
+ add("getBuildMap",
+ "Return on [\"reply\"] data about all registered LLFloaterReg floater names",
+ &LLFloaterRegListener::getBuildMap,
+ LLSD().with("reply", LLSD()));
LLSD requiredName;
requiredName["name"] = LLSD();
- add("showInstance", &LLFloaterRegListener::showInstance, requiredName);
- add("hideInstance", &LLFloaterRegListener::hideInstance, requiredName);
- add("toggleInstance", &LLFloaterRegListener::toggleInstance, requiredName);
+ add("showInstance",
+ "Ask to display the floater specified in [\"name\"]",
+ &LLFloaterRegListener::showInstance,
+ requiredName);
+ add("hideInstance",
+ "Ask to hide the floater specified in [\"name\"]",
+ &LLFloaterRegListener::hideInstance,
+ requiredName);
+ add("toggleInstance",
+ "Ask to toggle the state of the floater specified in [\"name\"]",
+ &LLFloaterRegListener::toggleInstance,
+ requiredName);
LLSD requiredNameButton;
requiredNameButton["name"] = LLSD();
requiredNameButton["button"] = LLSD();
- add("clickButton", &LLFloaterRegListener::clickButton, requiredNameButton);
+ add("clickButton",
+ "Simulate clicking the named [\"button\"] in the visible floater named in [\"name\"]",
+ &LLFloaterRegListener::clickButton,
+ requiredNameButton);
}
void LLFloaterRegListener::getBuildMap(const LLSD& event) const
diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h
index 304ecd1090..a38117f6b0 100644
--- a/indra/llui/llfloaterreglistener.h
+++ b/indra/llui/llfloaterreglistener.h
@@ -12,18 +12,18 @@
#if ! defined(LL_LLFLOATERREGLISTENER_H)
#define LL_LLFLOATERREGLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
#include <string>
class LLSD;
/// Event API wrapper for LLFloaterReg
-class LLFloaterRegListener: public LLDispatchListener
+class LLFloaterRegListener: public LLEventAPI
{
public:
/// As all public LLFloaterReg methods are static, there's no point in
/// binding an LLFloaterReg instance.
- LLFloaterRegListener(const std::string& pumpName);
+ LLFloaterRegListener();
private:
void getBuildMap(const LLSD& event) const;
diff --git a/indra/llui/llflyoutbutton.cpp b/indra/llui/llflyoutbutton.cpp
index 3483bac782..abb0b869eb 100644
--- a/indra/llui/llflyoutbutton.cpp
+++ b/indra/llui/llflyoutbutton.cpp
@@ -48,6 +48,7 @@ LLFlyoutButton::LLFlyoutButton(const Params& p)
// Text label button
LLButton::Params bp(p.action_button);
bp.name(p.label);
+ bp.label(p.label);
bp.rect.left(0).bottom(0).width(getRect().getWidth() - FLYOUT_BUTTON_ARROW_WIDTH).height(getRect().getHeight());
bp.click_callback.function(boost::bind(&LLFlyoutButton::onActionButtonClick, this, _2));
bp.follows.flags(FOLLOWS_ALL);
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 00a80478cf..35fbc7b0a8 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -41,6 +41,10 @@ const F32 FOCUS_FADE_TIME = 0.3f;
// NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp.
LLFocusableElement::LLFocusableElement()
+: mFocusLostCallback(NULL),
+ mFocusReceivedCallback(NULL),
+ mFocusChangedCallback(NULL),
+ mTopLostCallback(NULL)
{
}
@@ -59,23 +63,27 @@ BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_pa
// virtual
LLFocusableElement::~LLFocusableElement()
{
+ delete mFocusLostCallback;
+ delete mFocusReceivedCallback;
+ delete mFocusChangedCallback;
+ delete mTopLostCallback;
}
void LLFocusableElement::onFocusReceived()
{
- mFocusReceivedCallback(this);
- mFocusChangedCallback(this);
+ if (mFocusReceivedCallback) (*mFocusReceivedCallback)(this);
+ if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
}
void LLFocusableElement::onFocusLost()
{
- mFocusLostCallback(this);
- mFocusChangedCallback(this);
+ if (mFocusLostCallback) (*mFocusLostCallback)(this);
+ if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
}
void LLFocusableElement::onTopLost()
{
- mTopLostCallback(this);
+ if (mTopLostCallback) (*mTopLostCallback)(this);
}
BOOL LLFocusableElement::hasFocus() const
@@ -87,6 +95,31 @@ void LLFocusableElement::setFocus(BOOL b)
{
}
+boost::signals2::connection LLFocusableElement::setFocusLostCallback( const focus_signal_t::slot_type& cb)
+{
+ if (!mFocusLostCallback) mFocusLostCallback = new focus_signal_t();
+ return mFocusLostCallback->connect(cb);
+}
+
+boost::signals2::connection LLFocusableElement::setFocusReceivedCallback(const focus_signal_t::slot_type& cb)
+{
+ if (!mFocusReceivedCallback) mFocusReceivedCallback = new focus_signal_t();
+ return mFocusReceivedCallback->connect(cb);
+}
+
+boost::signals2::connection LLFocusableElement::setFocusChangedCallback(const focus_signal_t::slot_type& cb)
+{
+ if (!mFocusChangedCallback) mFocusChangedCallback = new focus_signal_t();
+ return mFocusChangedCallback->connect(cb);
+}
+
+boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_signal_t::slot_type& cb)
+{
+ if (!mTopLostCallback) mTopLostCallback = new focus_signal_t();
+ return mTopLostCallback->connect(cb);
+}
+
+
LLFocusMgr gFocusMgr;
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 2fa4e124fb..83ecd1d301 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -56,10 +56,10 @@ public:
typedef boost::signals2::signal<void(LLFocusableElement*)> focus_signal_t;
- boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb) { return mFocusLostCallback.connect(cb);}
- boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb) { return mFocusReceivedCallback.connect(cb);}
- boost::signals2::connection setFocusChangedCallback(const focus_signal_t::slot_type& cb) { return mFocusChangedCallback.connect(cb);}
- void setTopLostCallback(const focus_signal_t::slot_type& cb) { mTopLostCallback.connect(cb);}
+ boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb);
+ boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
+ boost::signals2::connection setFocusChangedCallback(const focus_signal_t::slot_type& cb);
+ boost::signals2::connection setTopLostCallback(const focus_signal_t::slot_type& cb);
// These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus.
virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
@@ -69,10 +69,10 @@ protected:
virtual void onFocusReceived();
virtual void onFocusLost();
virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere
- focus_signal_t mFocusLostCallback;
- focus_signal_t mFocusReceivedCallback;
- focus_signal_t mFocusChangedCallback;
- focus_signal_t mTopLostCallback;
+ focus_signal_t* mFocusLostCallback;
+ focus_signal_t* mFocusReceivedCallback;
+ focus_signal_t* mFocusChangedCallback;
+ focus_signal_t* mTopLostCallback;
};
diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h
index c06d29a4bd..938419d374 100644
--- a/indra/llui/llhelp.h
+++ b/indra/llui/llhelp.h
@@ -40,6 +40,10 @@ class LLHelp
virtual void showTopic(const std::string &topic) = 0;
// return default (fallback) topic name suitable for showTopic()
virtual std::string defaultTopic() = 0;
+ // return topic to use before the user logs in
+ virtual std::string preLoginTopic() = 0;
+ // return topic to use for the top-level help, invoked by F1
+ virtual std::string f1HelpTopic() = 0;
};
#endif // headerguard
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 66c2ba682f..b1bd2b89a9 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -57,7 +57,9 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
: LLUICtrl(p),
mColor(p.color()),
mImagep(p.image),
- mPriority(0)
+ mPriority(0),
+ mDrawWidth(0),
+ mDrawHeight(0)
{
if (mImagep.notNull())
{
@@ -100,6 +102,8 @@ void LLIconCtrl::setValue(const LLSD& value )
{
mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
}
+
+ setIconImageDrawSize();
}
std::string LLIconCtrl::getImageName() const
@@ -109,3 +113,15 @@ std::string LLIconCtrl::getImageName() const
else
return std::string();
}
+
+void LLIconCtrl::setIconImageDrawSize()
+{
+ if(mImagep.notNull() && mDrawWidth && mDrawHeight)
+ {
+ if(mImagep->getImage().notNull())
+ {
+ mImagep->getImage()->setKnownDrawSize(mDrawWidth, mDrawHeight) ;
+ }
+ }
+}
+
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 90f1693060..66368f979b 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -60,6 +60,7 @@ public:
protected:
LLIconCtrl(const Params&);
friend class LLUICtrlFactory;
+
public:
virtual ~LLIconCtrl();
@@ -73,9 +74,16 @@ public:
void setColor(const LLColor4& color) { mColor = color; }
+private:
+ void setIconImageDrawSize() ;
+
protected:
S32 mPriority;
+ //the output size of the icon image if set.
+ S32 mDrawWidth ;
+ S32 mDrawHeight ;
+
private:
LLUIColor mColor;
LLPointer<LLUIImage> mImagep;
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index ede32084d0..75342afbe2 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -218,6 +218,86 @@ void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type,
llassert(0);
}
}
+LLKeywords::WStringMapIndex::WStringMapIndex(const WStringMapIndex& other)
+{
+ if(other.mOwner)
+ {
+ copyData(other.mData, other.mLength);
+ }
+ else
+ {
+ mOwner = false;
+ mLength = other.mLength;
+ mData = other.mData;
+ }
+}
+
+LLKeywords::WStringMapIndex::WStringMapIndex(const LLWString& str)
+{
+ copyData(str.data(), str.size());
+}
+
+LLKeywords::WStringMapIndex::WStringMapIndex(const llwchar *start, size_t length):
+mData(start), mLength(length), mOwner(false)
+{
+}
+
+LLKeywords::WStringMapIndex::~WStringMapIndex()
+{
+ if(mOwner)
+ delete[] mData;
+}
+
+void LLKeywords::WStringMapIndex::copyData(const llwchar *start, size_t length)
+{
+ llwchar *data = new llwchar[length];
+ memcpy((void*)data, (const void*)start, length * sizeof(llwchar));
+
+ mOwner = true;
+ mLength = length;
+ mData = data;
+}
+
+bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &other) const
+{
+ // NOTE: Since this is only used to organize a std::map, it doesn't matter if it uses correct collate order or not.
+ // The comparison only needs to strictly order all possible strings, and be stable.
+
+ bool result = false;
+ const llwchar* self_iter = mData;
+ const llwchar* self_end = mData + mLength;
+ const llwchar* other_iter = other.mData;
+ const llwchar* other_end = other.mData + other.mLength;
+
+ while(true)
+ {
+ if(other_iter >= other_end)
+ {
+ // We've hit the end of other.
+ // This covers two cases: other being shorter than self, or the strings being equal.
+ // In either case, we want to return false.
+ result = false;
+ break;
+ }
+ else if(self_iter >= self_end)
+ {
+ // self is shorter than other.
+ result = true;
+ break;
+ }
+ else if(*self_iter != *other_iter)
+ {
+ // The current character differs. The strings are not equal.
+ result = *self_iter < *other_iter;
+ break;
+ }
+
+ self_iter++;
+ other_iter++;
+ }
+
+ return result;
+}
LLColor3 LLKeywords::readColor( const std::string& s )
{
@@ -429,7 +509,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_len = p - cur;
if( seg_len > 0 )
{
- LLWString word( cur, 0, seg_len );
+ WStringMapIndex word( cur, seg_len );
word_token_map_t::iterator map_iter = mWordTokenMap.find(word);
if( map_iter != mWordTokenMap.end() )
{
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index 53377869ca..e5b66dfa56 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -92,8 +92,33 @@ public:
const std::string& key,
const LLColor3& color,
const std::string& tool_tip = LLStringUtil::null);
-
- typedef std::map<LLWString, LLKeywordToken*> word_token_map_t;
+
+ // This class is here as a performance optimization.
+ // The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
+ // This worked, but caused a performance bottleneck due to memory allocation and string copies
+ // because it's not possible to search such a map without creating an LLWString.
+ // Using this class as the map index instead allows us to search using segments of an existing
+ // text run without copying them first, which greatly reduces overhead in LLKeywords::findSegments().
+ class WStringMapIndex
+ {
+ public:
+ // copy constructor
+ WStringMapIndex(const WStringMapIndex& other);
+ // constructor from a string (copies the string's data into the new object)
+ WStringMapIndex(const LLWString& str);
+ // constructor from pointer and length
+ // NOTE: does NOT copy data, caller must ensure that the lifetime of the pointer exceeds that of the new object!
+ WStringMapIndex(const llwchar *start, size_t length);
+ ~WStringMapIndex();
+ bool operator<(const WStringMapIndex &other) const;
+ private:
+ void copyData(const llwchar *start, size_t length);
+ const llwchar *mData;
+ size_t mLength;
+ bool mOwner;
+ };
+
+ typedef std::map<WStringMapIndex, LLKeywordToken*> word_token_map_t;
typedef word_token_map_t::const_iterator keyword_iterator_t;
keyword_iterator_t begin() const { return mWordTokenMap.begin(); }
keyword_iterator_t end() const { return mWordTokenMap.end(); }
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index bac5491943..dc79550eb4 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -137,6 +137,7 @@ LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p)
mPanelSpacing(p.border_size),
mOrientation((p.orientation() == "vertical") ? VERTICAL : HORIZONTAL),
mAnimate(p.animate),
+ mAnimatedThisFrame(false),
mClip(p.clip)
{}
@@ -172,6 +173,7 @@ void LLLayoutStack::draw()
// only force drawing invisible children if visible amount is non-zero
drawChild(panelp, 0, 0, !clip_rect.isEmpty());
}
+ mAnimatedThisFrame = false;
}
void LLLayoutStack::removeChild(LLView* view)
@@ -244,7 +246,8 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
output_node, output_params, &default_params);
}
- setupParams(p, parent);
+ p.from_xui = true;
+ applyXUILayout(p, parent);
LLLayoutStack* layout_stackp = LLUICtrlFactory::create<LLLayoutStack>(p);
if (parent && layout_stackp)
@@ -411,8 +414,33 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au
}
}
+void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize)
+{
+ LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+ if (panel)
+ {
+ panel->mUserResize = user_resize;
+ }
+}
+
+bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp)
+{
+ LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+ if (panel)
+ {
+ if (min_widthp) *min_widthp = panel->mMinWidth;
+ if (min_heightp) *min_heightp = panel->mMinHeight;
+ }
+
+ return NULL != panel;
+}
+
+static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
void LLLayoutStack::updateLayout(BOOL force_resize)
{
+ LLFastTimer ft(FTM_UPDATE_LAYOUT);
static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0);
calcMinExtents();
@@ -431,10 +459,13 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
{
if (mAnimate)
{
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME));
- if ((*panel_it)->mVisibleAmt > 0.99f)
+ if (!mAnimatedThisFrame)
{
- (*panel_it)->mVisibleAmt = 1.f;
+ (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME));
+ if ((*panel_it)->mVisibleAmt > 0.99f)
+ {
+ (*panel_it)->mVisibleAmt = 1.f;
+ }
}
}
else
@@ -446,10 +477,13 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
{
if (mAnimate)
{
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME));
- if ((*panel_it)->mVisibleAmt < 0.001f)
+ if (!mAnimatedThisFrame)
{
- (*panel_it)->mVisibleAmt = 0.f;
+ (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME));
+ if ((*panel_it)->mVisibleAmt < 0.001f)
+ {
+ (*panel_it)->mVisibleAmt = 0.f;
+ }
}
}
else
@@ -631,10 +665,10 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
// adjust running headroom count based on new sizes
shrink_headroom_total += delta_size;
- panelp->reshape(new_width, new_height);
- panelp->setOrigin(cur_x, cur_y - new_height);
+ LLRect panel_rect;
+ panel_rect.setLeftTopAndSize(cur_x, cur_y, new_width, new_height);
+ panelp->setShape(panel_rect);
- LLRect panel_rect = panelp->getRect();
LLRect resize_bar_rect = panel_rect;
if (mOrientation == HORIZONTAL)
{
@@ -705,6 +739,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
llassert_always(force_resize == FALSE);
updateLayout(TRUE);
}
+
+ mAnimatedThisFrame = true;
} // end LLLayoutStack::updateLayout
@@ -772,3 +808,19 @@ void LLLayoutStack::calcMinExtents()
}
}
}
+
+// update layout stack animations, etc. once per frame
+// NOTE: we use this to size world view based on animating UI, *before* we draw the UI
+// we might still need to call updateLayout during UI draw phase, in case UI elements
+// are resizing themselves dynamically
+//static
+void LLLayoutStack::updateClass()
+{
+ LLInstanceTrackerScopedGuard guard;
+ for (LLLayoutStack::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ it->updateLayout();
+ }
+}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 9ded48ef6a..c4f10038f8 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -38,16 +38,15 @@
class LLPanel;
-class LLLayoutStack : public LLView
+class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
{
public:
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
Optional<std::string> orientation;
Optional<S32> border_size;
- Optional<bool> animate;
- Optional<bool> clip;
- // mMinWidth and mMinHeight are calculated, not set in XML
+ Optional<bool> animate,
+ clip;
Params();
};
@@ -81,6 +80,24 @@ public:
S32 getNumPanels() { return mPanels.size(); }
void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
+ void setPanelUserResize(const std::string& panel_name, BOOL user_resize);
+
+ /**
+ * Gets minimal width and/or height of the specified by name panel.
+ *
+ * If it is necessary to get only the one dimension pass NULL for another one.
+ * @returns true if specified by panel_name internal panel exists, false otherwise.
+ */
+ bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp);
+
+ void updateLayout(BOOL force_resize = FALSE);
+
+ S32 getPanelSpacing() const { return mPanelSpacing; }
+ BOOL getAnimate () const { return mAnimate; }
+ void setAnimate (BOOL animate) { mAnimate = animate; }
+
+ static void updateClass();
+
protected:
LLLayoutStack(const Params&);
friend class LLUICtrlFactory;
@@ -88,7 +105,6 @@ protected:
private:
struct LayoutPanel;
- void updateLayout(BOOL force_resize = FALSE);
void calcMinExtents();
S32 getDefaultHeight(S32 cur_height);
S32 getDefaultWidth(S32 cur_width);
@@ -105,6 +121,8 @@ private:
S32 mMinHeight; // calculated by calcMinExtents
S32 mPanelSpacing;
+ // true if we already applied animation this frame
+ bool mAnimatedThisFrame;
bool mAnimate;
bool mClip;
}; // end class LLLayoutStack
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 75905d0927..483a394bbd 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -34,6 +34,7 @@
#include "linden_common.h"
+#define LLLINEEDITOR_CPP
#include "lllineeditor.h"
#include "lltexteditor.h"
@@ -54,6 +55,7 @@
#include "llui.h"
#include "lluictrlfactory.h"
#include "llclipboard.h"
+#include "llmenugl.h"
//
// Imported globals
@@ -69,25 +71,18 @@ const S32 SCROLL_INCREMENT_DEL = 4; // make space for baskspacing
const F32 AUTO_SCROLL_TIME = 0.05f;
const F32 TRIPLE_CLICK_INTERVAL = 0.3f; // delay between double and triple click. *TODO: make this equal to the double click interval?
+const std::string PASSWORD_ASTERISK( "\xE2\x80\xA2" ); // U+2022 BULLET
+
static LLDefaultChildRegistry::Register<LLLineEditor> r1("line_editor");
+// Compiler optimization, generate extern template
+template class LLLineEditor* LLView::getChild<class LLLineEditor>(
+ const std::string& name, BOOL recurse) const;
+
//
// Member functions
//
-void LLLineEditor::PrevalidateNamedFuncs::declareValues()
-{
- declare("ascii", LLLineEditor::prevalidateASCII);
- declare("float", LLLineEditor::prevalidateFloat);
- declare("int", LLLineEditor::prevalidateInt);
- declare("positive_s32", LLLineEditor::prevalidatePositiveS32);
- declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32);
- declare("alpha_num", LLLineEditor::prevalidateAlphaNum);
- declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace);
- declare("printable_not_pipe", LLLineEditor::prevalidatePrintableNotPipe);
- declare("printable_no_space", LLLineEditor::prevalidatePrintableNoSpace);
-}
-
LLLineEditor::Params::Params()
: max_length_bytes("max_length", 254),
keystroke_callback("keystroke_callback"),
@@ -125,8 +120,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mScrollHPos( 0 ),
mTextPadLeft(p.text_pad_left),
mTextPadRight(p.text_pad_right),
- mMinHPixels(0), // computed in updateTextPadding() below
- mMaxHPixels(0), // computed in updateTextPadding() below
+ mTextLeftEdge(0), // computed in updateTextPadding() below
+ mTextRightEdge(0), // computed in updateTextPadding() below
mCommitOnFocusLost( p.commit_on_focus_lost ),
mRevertOnEsc( p.revert_on_esc ),
mKeystrokeCallback( p.keystroke_callback() ),
@@ -157,7 +152,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mTentativeFgColor(p.text_tentative_color()),
mHighlightColor(p.highlight_color()),
mPreeditBgColor(p.preedit_bg_color()),
- mGLFont(p.font)
+ mGLFont(p.font),
+ mContextMenuHandle()
{
llassert( mMaxLengthBytes > 0 );
@@ -184,6 +180,12 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
setCursor(mText.length());
setPrevalidate(p.prevalidate_callback());
+
+ LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>
+ ("menu_text_editor.xml",
+ LLMenuGL::sMenuContainer,
+ LLMenuHolderGL::child_registry_t::instance());
+ setContextMenu(menu);
}
LLLineEditor::~LLLineEditor()
@@ -323,11 +325,23 @@ void LLLineEditor::setMaxTextLength(S32 max_text_length)
mMaxLengthBytes = max_len;
}
+void LLLineEditor::getTextPadding(S32 *left, S32 *right)
+{
+ *left = mTextPadLeft;
+ *right = mTextPadRight;
+}
+
+void LLLineEditor::setTextPadding(S32 left, S32 right)
+{
+ mTextPadLeft = left;
+ mTextPadRight = right;
+ updateTextPadding();
+}
+
void LLLineEditor::updateTextPadding()
{
- static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0);
- mMinHPixels = line_editor_hpad + llclamp(mTextPadLeft, 0, getRect().getWidth());;
- mMaxHPixels = getRect().getWidth() - mMinHPixels - llclamp(mTextPadRight, 0, getRect().getWidth());
+ mTextLeftEdge = llclamp(mTextPadLeft, 0, getRect().getWidth());
+ mTextRightEdge = getRect().getWidth() - llclamp(mTextPadRight, 0, getRect().getWidth());
}
@@ -384,7 +398,7 @@ void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
{
for (S32 i = 0; i < mText.length(); i++)
{
- asterix_text += '*';
+ asterix_text += utf8str_to_wstring(PASSWORD_ASTERISK);
}
wtext = asterix_text.c_str();
}
@@ -393,8 +407,8 @@ void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
mScrollHPos +
mGLFont->charFromPixelOffset(
wtext, mScrollHPos,
- (F32)(local_mouse_x - mMinHPixels),
- (F32)(mMaxHPixels - mMinHPixels + 1)); // min-max range is inclusive
+ (F32)(local_mouse_x - mTextLeftEdge),
+ (F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
setCursor(cursor_pos);
}
@@ -403,12 +417,16 @@ void LLLineEditor::setCursor( S32 pos )
S32 old_cursor_pos = getCursor();
mCursorPos = llclamp( pos, 0, mText.length());
+ // position of end of next character after cursor
S32 pixels_after_scroll = findPixelNearestPos();
- if( pixels_after_scroll > mMaxHPixels )
+ if( pixels_after_scroll > mTextRightEdge )
{
S32 width_chars_to_left = mGLFont->getWidth(mText.getWString().c_str(), 0, mScrollHPos);
- S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mMaxHPixels - mMinHPixels + width_chars_to_left)));
- S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mMaxHPixels - mMinHPixels), mText.length(), getCursor());
+ S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mTextRightEdge - mTextLeftEdge + width_chars_to_left)));
+ // character immediately to left of cursor should be last one visible (SCROLL_INCREMENT_ADD will scroll in more characters)
+ // or first character if cursor is at beginning
+ S32 new_last_visible_char = llmax(0, getCursor() - 1);
+ S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), new_last_visible_char);
if (old_cursor_pos == last_visible_char)
{
mScrollHPos = llmin(mText.length(), llmax(min_scroll, mScrollHPos + SCROLL_INCREMENT_ADD));
@@ -626,7 +644,8 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
// delay cursor flashing
mKeystrokeTimer.reset();
- mMouseDownSignal(this,x,y,mask);
+ if (mMouseDownSignal)
+ (*mMouseDownSignal)(this,x,y,mask);
return TRUE;
}
@@ -643,6 +662,16 @@ BOOL LLLineEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
return TRUE;
}
+BOOL LLLineEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ setFocus(TRUE);
+ if (!LLUICtrl::handleRightMouseDown(x, y, mask))
+ {
+ showContextMenu(x, y);
+ }
+ return TRUE;
+}
+
BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
@@ -668,17 +697,17 @@ BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)
S32 increment = llround(mScrollTimer.getElapsedTimeF32() / AUTO_SCROLL_TIME);
mScrollTimer.reset();
mScrollTimer.setTimerExpirySec(AUTO_SCROLL_TIME);
- if( (x < mMinHPixels) && (mScrollHPos > 0 ) )
+ if( (x < mTextLeftEdge) && (mScrollHPos > 0 ) )
{
// Scroll to the left
mScrollHPos = llclamp(mScrollHPos - increment, 0, mText.length());
}
else
- if( (x > mMaxHPixels) && (mCursorPos < (S32)mText.length()) )
+ if( (x > mTextRightEdge) && (mCursorPos < (S32)mText.length()) )
{
// If scrolling one pixel would make a difference...
S32 pixels_after_scrolling_one_char = findPixelNearestPos(1);
- if( pixels_after_scrolling_one_char >= mMaxHPixels )
+ if( pixels_after_scrolling_one_char >= mTextRightEdge )
{
// ...scroll to the right
mScrollHPos = llclamp(mScrollHPos + increment, 0, mText.length());
@@ -742,7 +771,8 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask)
}
// We won't call LLUICtrl::handleMouseUp to avoid double calls of childrenHandleMouseUp().Just invoke the signal manually.
- mMouseUpSignal(this,x,y, mask);
+ if (mMouseUpSignal)
+ (*mMouseUpSignal)(this,x,y, mask);
return handled;
}
@@ -1564,7 +1594,6 @@ void LLLineEditor::draw()
F32 alpha = getDrawContext().mAlpha;
S32 text_len = mText.length();
static LLUICachedControl<S32> lineeditor_cursor_thickness ("UILineEditorCursorThickness", 0);
- static LLUICachedControl<S32> lineeditor_v_pad ("UILineEditorVPad", 0);
static LLUICachedControl<F32> preedit_marker_brightness ("UIPreeditMarkerBrightness", 0);
static LLUICachedControl<S32> preedit_marker_gap ("UIPreeditMarkerGap", 0);
static LLUICachedControl<S32> preedit_marker_position ("UIPreeditMarkerPosition", 0);
@@ -1581,7 +1610,7 @@ void LLLineEditor::draw()
std::string text;
for (S32 i = 0; i < mText.length(); i++)
{
- text += '*';
+ text += PASSWORD_ASTERISK;
}
mText = text;
}
@@ -1590,6 +1619,8 @@ void LLLineEditor::draw()
LLRect background( 0, getRect().getHeight(), getRect().getWidth(), 0 );
background.stretch( -mBorderThickness );
+ S32 lineeditor_v_pad = llround((background.getHeight() - mGLFont->getLineHeight())/2);
+
drawBackground();
// draw text
@@ -1656,7 +1687,7 @@ void LLLineEditor::draw()
}
S32 rendered_text = 0;
- F32 rendered_pixels_right = (F32)mMinHPixels;
+ F32 rendered_pixels_right = (F32)mTextLeftEdge;
F32 text_bottom = (F32)background.mBottom + (F32)lineeditor_v_pad;
if( (gFocusMgr.getKeyboardFocus() == this) && hasSelection() )
@@ -1685,17 +1716,17 @@ void LLLineEditor::draw()
0,
LLFontGL::NO_SHADOW,
select_left - mScrollHPos,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right);
}
- if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) )
+ if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
{
LLColor4 color = mHighlightColor;
color.setAlpha(alpha);
// selected middle
S32 width = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos + rendered_text, select_right - mScrollHPos - rendered_text);
- width = llmin(width, mMaxHPixels - llround(rendered_pixels_right));
+ width = llmin(width, mTextRightEdge - llround(rendered_pixels_right));
gl_rect_2d(llround(rendered_pixels_right), cursor_top, llround(rendered_pixels_right)+width, cursor_bottom, color);
LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha );
@@ -1707,11 +1738,11 @@ void LLLineEditor::draw()
0,
LLFontGL::NO_SHADOW,
select_right - mScrollHPos - rendered_text,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right);
}
- if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) )
+ if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
{
// unselected, right side
mGLFont->render(
@@ -1722,7 +1753,7 @@ void LLLineEditor::draw()
0,
LLFontGL::NO_SHADOW,
S32_MAX,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right);
}
}
@@ -1736,7 +1767,7 @@ void LLLineEditor::draw()
0,
LLFontGL::NO_SHADOW,
S32_MAX,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right);
}
#if 1 // for when we're ready for image art.
@@ -1794,14 +1825,14 @@ void LLLineEditor::draw()
if (0 == mText.length() && mReadOnly)
{
mGLFont->render(mLabel.getWString(), 0,
- mMinHPixels, (F32)text_bottom,
+ mTextLeftEdge, (F32)text_bottom,
label_color,
LLFontGL::LEFT,
LLFontGL::BOTTOM,
0,
LLFontGL::NO_SHADOW,
S32_MAX,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right, FALSE);
}
@@ -1819,14 +1850,14 @@ void LLLineEditor::draw()
if (0 == mText.length())
{
mGLFont->render(mLabel.getWString(), 0,
- mMinHPixels, (F32)text_bottom,
+ mTextLeftEdge, (F32)text_bottom,
label_color,
LLFontGL::LEFT,
LLFontGL::BOTTOM,
0,
LLFontGL::NO_SHADOW,
S32_MAX,
- mMaxHPixels - llround(rendered_pixels_right),
+ mTextRightEdge - llround(rendered_pixels_right),
&rendered_pixels_right, FALSE);
}
// Draw children (border)
@@ -1844,7 +1875,7 @@ void LLLineEditor::draw()
S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
{
S32 dpos = getCursor() - mScrollHPos + cursor_offset;
- S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mMinHPixels;
+ S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mTextLeftEdge;
return result;
}
@@ -1940,51 +1971,12 @@ void LLLineEditor::setRect(const LLRect& rect)
}
}
-void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func)
+void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
{
mPrevalidateFunc = func;
updateAllowingLanguageInput();
}
-// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- // May be a comma or period, depending on the locale
- llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
-
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
// static
BOOL LLLineEditor::postvalidateFloat(const std::string &str)
{
@@ -2044,210 +2036,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
-// Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateInt(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
-// static
-BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if(('-' == trimmed[0]) || ('0' == trimmed[0]))
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val <= 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if('-' == trimmed[0])
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val < 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if( !LLStringOps::isAlnum((char)str[len]) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if('|' == str[len])
- {
- rv = FALSE;
- break;
- }
- if(!((' ' == str[len]) || LLStringOps::isAlnum((char)str[len]) || LLStringOps::isPunct((char)str[len])))
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-
-// static
-BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if(LLStringOps::isSpace(str[len]))
- {
- rv = FALSE;
- break;
- }
- if( !(LLStringOps::isAlnum((char)str[len]) ||
- LLStringOps::isPunct((char)str[len]) ) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- while(len--)
- {
- if (str[len] < 0x20 || str[len] > 0x7f)
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
@@ -2525,3 +2313,25 @@ LLWString LLLineEditor::getConvertedText() const
}
return text;
}
+
+void LLLineEditor::showContextMenu(S32 x, S32 y)
+{
+ LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
+
+ if (menu)
+ {
+ gEditMenuHandler = this;
+
+ S32 screen_x, screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+ menu->show(screen_x, screen_y);
+ }
+}
+
+void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu)
+{
+ if (new_context_menu)
+ mContextMenuHandle = new_context_menu->getHandle();
+ else
+ mContextMenuHandle.markDead();
+}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 3d7bbdff89..b62138426b 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -51,26 +51,18 @@
#include "llviewborder.h"
#include "llpreeditor.h"
-#include <boost/function.hpp>
+#include "lltextvalidate.h"
class LLFontGL;
class LLLineEditorRollback;
class LLButton;
-
-typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc;
+class LLContextMenu;
class LLLineEditor
: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
{
public:
- struct PrevalidateNamedFuncs
- : public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs>
-
- {
- static void declareValues();
- };
-
typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
@@ -80,7 +72,7 @@ public:
Optional<keystroke_callback_t> keystroke_callback;
- Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs> prevalidate_callback;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<LLViewBorder::Params> border;
@@ -113,6 +105,7 @@ protected:
LLLineEditor(const Params&);
friend class LLUICtrlFactory;
friend class LLFloaterEditUI;
+ void showContextMenu(S32 x, S32 y);
public:
virtual ~LLLineEditor();
@@ -122,6 +115,7 @@ public:
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask);
/*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
/*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
/*virtual*/ void onMouseCaptureLost();
@@ -172,6 +166,8 @@ public:
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
+ const std::string& getLabel() { return mLabel.getString(); }
+
void setText(const LLStringExplicit &new_text);
const std::string& getText() const { return mText.getString(); }
@@ -202,6 +198,8 @@ public:
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); }
const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
+ const LLFontGL* getFont() const { return mGLFont; }
+
void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; }
void setIgnoreTab(BOOL b) { mIgnoreTab = b; }
void setPassDelete(BOOL b) { mPassDelete = b; }
@@ -224,19 +222,12 @@ public:
void setKeystrokeCallback(callback_t callback, void* user_data);
void setMaxTextLength(S32 max_text_length);
+ // Manipulate left and right padding for text
+ void getTextPadding(S32 *left, S32 *right);
+ void setTextPadding(S32 left, S32 right);
// Prevalidation controls which keystrokes can affect the editor
- void setPrevalidate( LLLinePrevalidateFunc func );
- static BOOL prevalidateFloat(const LLWString &str );
- static BOOL prevalidateInt(const LLWString &str );
- static BOOL prevalidatePositiveS32(const LLWString &str);
- static BOOL prevalidateNonNegativeS32(const LLWString &str);
- static BOOL prevalidateAlphaNum(const LLWString &str );
- static BOOL prevalidateAlphaNumSpace(const LLWString &str );
- static BOOL prevalidatePrintableNotPipe(const LLWString &str);
- static BOOL prevalidatePrintableNoSpace(const LLWString &str);
- static BOOL prevalidateASCII(const LLWString &str);
-
+ void setPrevalidate( LLTextValidate::validate_func_t func );
static BOOL postvalidateFloat(const std::string &str);
// line history support:
@@ -244,7 +235,9 @@ public:
void updateHistory(); // stores current line in history
void setReplaceNewlinesWithSpaces(BOOL replace);
-
+
+ void setContextMenu(LLContextMenu* new_context_menu);
+
private:
// private helper methods
@@ -298,8 +291,8 @@ protected:
LLFrameTimer mScrollTimer;
S32 mTextPadLeft; // Used to reserve space before the beginning of the text for children.
S32 mTextPadRight; // Used to reserve space after the end of the text for children.
- S32 mMinHPixels;
- S32 mMaxHPixels;
+ S32 mTextLeftEdge; // Pixels, cached left edge of text based on left padding and width
+ S32 mTextRightEdge; // Pixels, cached right edge of text based on right padding and width
BOOL mCommitOnFocusLost;
BOOL mRevertOnEsc;
@@ -314,7 +307,7 @@ protected:
S32 mLastSelectionStart;
S32 mLastSelectionEnd;
- LLLinePrevalidateFunc mPrevalidateFunc;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLFrameTimer mKeystrokeTimer;
LLTimer mTripleClickTimer;
@@ -343,6 +336,8 @@ protected:
std::vector<S32> mPreeditPositions;
LLPreeditor::standouts_t mPreeditStandouts;
+ LLHandle<LLView> mContextMenuHandle;
+
private:
// Instances that by default point to the statics but can be overidden in XML.
LLPointer<LLUIImage> mBgImage;
@@ -390,5 +385,10 @@ private:
}; // end class LLLineEditor
+// Build time optimization, generate once in .cpp file
+#ifndef LLLINEEDITOR_CPP
+extern template class LLLineEditor* LLView::getChild<class LLLineEditor>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LINEEDITOR_
diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp
index 058b6ae178..43c21e250c 100644
--- a/indra/llui/lllocalcliprect.cpp
+++ b/indra/llui/lllocalcliprect.cpp
@@ -113,6 +113,9 @@ void LLScreenClipRect::updateScissorRegion()
{
if (sClipRectStack.empty()) return;
+ // finish any deferred calls in the old clipping region
+ gGL.flush();
+
LLRect rect = sClipRectStack.top();
stop_glerror();
S32 x,y,w,h;
diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp
index 8dbcd6e229..cdbd17e4dc 100644
--- a/indra/llui/llmenubutton.cpp
+++ b/indra/llui/llmenubutton.cpp
@@ -85,6 +85,8 @@ void LLMenuButton::toggleMenu()
void LLMenuButton::hideMenu()
{
+ if(!mMenu)
+ return;
mMenu->setVisible(FALSE);
}
@@ -131,11 +133,11 @@ void LLMenuButton::draw()
if (mMenuVisibleLastFrame)
{
- setForcePressedState(TRUE);
+ setForcePressedState(true);
}
LLButton::draw();
- setForcePressedState(FALSE);
+ setForcePressedState(false);
}
diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h
index 02eb9d3806..d0e99d9f40 100644
--- a/indra/llui/llmenubutton.h
+++ b/indra/llui/llmenubutton.h
@@ -55,6 +55,7 @@ public:
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
void hideMenu();
+ LLMenuGL* getMenu() { return mMenu; }
protected:
friend class LLUICtrlFactory;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6e058e4c62..0d56c5ed31 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -23,7 +23,7 @@
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
- *
+ *
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
@@ -46,6 +46,7 @@
#include "llmenugl.h"
+#include "llgl.h"
#include "llmath.h"
#include "llrender.h"
#include "llfocusmgr.h"
@@ -97,8 +98,8 @@ const U32 SEPARATOR_HEIGHT_PIXELS = 8;
const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10;
const S32 MENU_ITEM_PADDING = 4;
-const std::string BOOLEAN_TRUE_PREFIX( "X" );
-const std::string BRANCH_SUFFIX( ">" );
+const std::string BOOLEAN_TRUE_PREFIX( "\xE2\x9C\x94" ); // U+2714 HEAVY CHECK MARK
+const std::string BRANCH_SUFFIX( "\xE2\x96\xB6" ); // U+25B6 BLACK RIGHT-POINTING TRIANGLE
const std::string ARROW_UP ("^^^^^^^");
const std::string ARROW_DOWN("vvvvvvv");
@@ -118,6 +119,7 @@ const F32 PIE_SHRINK_TIME = 0.2f; // time of transition between unbounded and bo
const F32 ACTIVATE_HIGHLIGHT_TIME = 0.3f;
+static MenuRegistry::Register<LLMenuItemGL> register_menu_item("menu_item");
static MenuRegistry::Register<LLMenuItemSeparatorGL> register_separator("menu_item_separator");
static MenuRegistry::Register<LLMenuItemCallGL> register_menu_item_call("menu_item_call");
static MenuRegistry::Register<LLMenuItemCheckGL> register_menu_item_check("menu_item_check");
@@ -132,6 +134,28 @@ static LLDefaultChildRegistry::Register<LLMenuGL> register_menu_default("menu");
///============================================================================
/// Class LLMenuItemGL
///============================================================================
+
+LLMenuItemGL::Params::Params()
+: shortcut("shortcut"),
+ jump_key("jump_key", KEY_NONE),
+ use_mac_ctrl("use_mac_ctrl", false),
+ rect("rect"),
+ left("left"),
+ top("top"),
+ right("right"),
+ bottom("bottom"),
+ width("width"),
+ height("height"),
+ bottom_delta("bottom_delta"),
+ left_delta("left_delta"),
+ enabled_color("enabled_color"),
+ disabled_color("disabled_color"),
+ highlight_bg_color("highlight_bg_color"),
+ highlight_fg_color("highlight_fg_color")
+{
+ mouse_opaque = true;
+}
+
// Default constructor
LLMenuItemGL::LLMenuItemGL(const LLMenuItemGL::Params& p)
: LLUICtrl(p),
@@ -454,17 +478,12 @@ void LLMenuItemGL::draw( void )
if (dynamic_cast<LLMenuItemCallGL*>(this))
debug_count++;
gGL.color4fv( mHighlightBackground.get().mV );
+
gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 );
}
LLColor4 color;
- LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW;
- if (getEnabled() && !mDrawTextDisabled )
- {
- shadow_style = LLFontGL::DROP_SHADOW_SOFT;
- }
-
if ( getEnabled() && getHighlight() )
{
color = mHighlightForeground.get();
@@ -482,26 +501,26 @@ void LLMenuItemGL::draw( void )
if (mBriefItem)
{
mFont->render( mLabel, 0, BRIEF_PAD_PIXELS / 2, 0, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style );
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL);
}
else
{
if( !mDrawBoolLabel.empty() )
{
mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
if( !mDrawAccelLabel.empty() )
{
mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
- LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+ LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
if( !mDrawBranchLabel.empty() )
{
mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
- LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+ LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
}
@@ -573,12 +592,13 @@ BOOL LLMenuItemSeparatorGL::handleMouseDown(S32 x, S32 y, MASK mask)
LLMenuGL* parent_menu = getMenu();
if (y > getRect().getHeight() / 2)
{
- LLView* prev_menu_item = parent_menu->findPrevSibling(this);
+ // the menu items are in the child list in bottom up order
+ LLView* prev_menu_item = parent_menu->findNextSibling(this);
return prev_menu_item ? prev_menu_item->handleMouseDown(x, prev_menu_item->getRect().getHeight(), mask) : FALSE;
}
else
{
- LLView* next_menu_item = parent_menu->findNextSibling(this);
+ LLView* next_menu_item = parent_menu->findPrevSibling(this);
return next_menu_item ? next_menu_item->handleMouseDown(x, 0, mask) : FALSE;
}
}
@@ -588,12 +608,12 @@ BOOL LLMenuItemSeparatorGL::handleMouseUp(S32 x, S32 y, MASK mask)
LLMenuGL* parent_menu = getMenu();
if (y > getRect().getHeight() / 2)
{
- LLView* prev_menu_item = parent_menu->findPrevSibling(this);
+ LLView* prev_menu_item = parent_menu->findNextSibling(this);
return prev_menu_item ? prev_menu_item->handleMouseUp(x, prev_menu_item->getRect().getHeight(), mask) : FALSE;
}
else
{
- LLView* next_menu_item = parent_menu->findNextSibling(this);
+ LLView* next_menu_item = parent_menu->findPrevSibling(this);
return next_menu_item ? next_menu_item->handleMouseUp(x, 0, mask) : FALSE;
}
}
@@ -637,11 +657,38 @@ LLMenuItemVerticalSeparatorGL::LLMenuItemVerticalSeparatorGL( void )
// Class LLMenuItemTearOffGL
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LLMenuItemTearOffGL::LLMenuItemTearOffGL(const LLMenuItemTearOffGL::Params& p)
-: LLMenuItemGL(p),
- mParentHandle(p.parent_floater_handle)
+: LLMenuItemGL(p)
{
}
+// Returns the first floater ancestor if there is one
+LLFloater* LLMenuItemTearOffGL::getParentFloater()
+{
+ LLView* parent_view = getMenu();
+
+ while (parent_view)
+ {
+ if (dynamic_cast<LLFloater*>(parent_view))
+ {
+ return dynamic_cast<LLFloater*>(parent_view);
+ }
+
+ bool parent_is_menu = dynamic_cast<LLMenuGL*>(parent_view) && !dynamic_cast<LLMenuBarGL*>(parent_view);
+
+ if (parent_is_menu)
+ {
+ // use menu parent
+ parent_view = dynamic_cast<LLMenuGL*>(parent_view)->getParentMenuItem();
+ }
+ else
+ {
+ // just use regular view parent
+ parent_view = parent_view->getParent();
+ }
+ }
+
+ return NULL;
+}
void LLMenuItemTearOffGL::onCommit()
{
@@ -660,7 +707,7 @@ void LLMenuItemTearOffGL::onCommit()
getMenu()->needsArrange();
- LLFloater* parent_floater = mParentHandle.get();
+ LLFloater* parent_floater = getParentFloater();
LLFloater* tear_off_menu = LLTearOffMenu::create(getMenu());
if (tear_off_menu)
@@ -743,21 +790,25 @@ void LLMenuItemCallGL::initFromParams(const Params& p)
{
if (p.on_visible.isProvided())
{
- initVisibleCallback(p.on_visible, mVisibleSignal);
+ mVisibleSignal.connect(initEnableCallback(p.on_visible));
}
if (p.on_enable.isProvided())
{
- initEnableCallback(p.on_enable, mEnableSignal);
+ setEnableCallback(initEnableCallback(p.on_enable));
// Set the enabled control variable (for backwards compatability)
if (p.on_enable.control_name.isProvided() && !p.on_enable.control_name().empty())
{
LLControlVariable* control = findControl(p.on_enable.control_name());
if (control)
+ {
setEnabledControlVariable(control);
+ }
}
}
if (p.on_click.isProvided())
- initCommitCallback(p.on_click, mCommitSignal);
+ {
+ setCommitCallback(initCommitCallback(p.on_click));
+ }
LLUICtrl::initFromParams(p);
}
@@ -778,7 +829,10 @@ void LLMenuItemCallGL::updateEnabled( void )
if (mEnabledControlVariable)
{
if (!enabled)
- mEnabledControlVariable->set(false); // callback overrides control variable; this will call setEnabled()
+ {
+ // callback overrides control variable; this will call setEnabled()
+ mEnabledControlVariable->set(false);
+ }
}
else
{
@@ -837,7 +891,7 @@ void LLMenuItemCheckGL::initFromParams(const Params& p)
{
if (p.on_check.isProvided())
{
- initEnableCallback(p.on_check, mCheckSignal);
+ setCheckCallback(initEnableCallback(p.on_check));
// Set the control name (for backwards compatability)
if (p.on_check.control_name.isProvided() && !p.on_check.control_name().empty())
{
@@ -1118,37 +1172,41 @@ BOOL LLMenuItemBranchGL::handleKeyHere( KEY key, MASK mask )
if (!branch)
return LLMenuItemGL::handleKeyHere(key, mask);
- if (getMenu()->getVisible() && branch->getVisible() && key == KEY_LEFT)
+ // an item is highlighted, my menu is open, and I have an active sub menu or we are in
+ // keyboard navigation mode
+ if (getHighlight()
+ && getMenu()->isOpen()
+ && (isActive() || LLMenuGL::getKeyboardMode()))
{
- // switch to keyboard navigation mode
- LLMenuGL::setKeyboardMode(TRUE);
-
- BOOL handled = branch->clearHoverItem();
- if (branch->getTornOff())
- {
- ((LLFloater*)branch->getParent())->setFocus(FALSE);
- }
- if (handled && getMenu()->getTornOff())
+ if (branch->getVisible() && key == KEY_LEFT)
{
- ((LLFloater*)getMenu()->getParent())->setFocus(TRUE);
- }
- return handled;
- }
+ // switch to keyboard navigation mode
+ LLMenuGL::setKeyboardMode(TRUE);
- if (getHighlight() &&
- getMenu()->isOpen() &&
- key == KEY_RIGHT && !branch->getHighlightedItem())
- {
- // switch to keyboard navigation mode
- LLMenuGL::setKeyboardMode(TRUE);
+ BOOL handled = branch->clearHoverItem();
+ if (branch->getTornOff())
+ {
+ ((LLFloater*)branch->getParent())->setFocus(FALSE);
+ }
+ if (handled && getMenu()->getTornOff())
+ {
+ ((LLFloater*)getMenu()->getParent())->setFocus(TRUE);
+ }
+ return handled;
+ }
- LLMenuItemGL* itemp = branch->highlightNextItem(NULL);
- if (itemp)
+ if (key == KEY_RIGHT && !branch->getHighlightedItem())
{
- return TRUE;
+ // switch to keyboard navigation mode
+ LLMenuGL::setKeyboardMode(TRUE);
+
+ LLMenuItemGL* itemp = branch->highlightNextItem(NULL);
+ if (itemp)
+ {
+ return TRUE;
+ }
}
}
-
return LLMenuItemGL::handleKeyHere(key, mask);
}
@@ -1183,22 +1241,41 @@ void LLMenuItemBranchGL::openMenu()
branch->arrange();
- LLRect rect = branch->getRect();
+ LLRect branch_rect = branch->getRect();
// calculate root-view relative position for branch menu
S32 left = getRect().mRight;
S32 top = getRect().mTop - getRect().mBottom;
localPointToOtherView(left, top, &left, &top, branch->getParent());
- rect.setLeftTopAndSize( left, top,
- rect.getWidth(), rect.getHeight() );
+ branch_rect.setLeftTopAndSize( left, top,
+ branch_rect.getWidth(), branch_rect.getHeight() );
if (branch->getCanTearOff())
{
- rect.translate(0, TEAROFF_SEPARATOR_HEIGHT_PIXELS);
+ branch_rect.translate(0, TEAROFF_SEPARATOR_HEIGHT_PIXELS);
+ }
+ branch->setRect( branch_rect );
+
+ // if branch extends outside of menu region change the direction it opens in
+ S32 x, y;
+ S32 delta_x = 0;
+ S32 delta_y = 0;
+ branch->localPointToOtherView( 0, 0, &x, &y, branch->getParent() );
+ if( y < menu_region_rect.mBottom )
+ {
+ // open upwards if menu extends past bottom
+ // adjust by the height of the menu item branch since it is a submenu
+ delta_y = branch_rect.getHeight() - getRect().getHeight();
+ }
+
+ if( x + branch_rect.getWidth() > menu_region_rect.mRight )
+ {
+ // move sub-menu over to left side
+ delta_x = llmax(-x, ( -(branch_rect.getWidth() + getRect().getWidth())));
}
- branch->setRect( rect );
- branch->translateIntoRectWithExclusion( menu_region_rect, getMenu()->getRect(), FALSE );
+ branch->translate( delta_x, delta_y );
+
branch->setVisible( TRUE );
branch->getParent()->sendChildToFront(branch);
@@ -1387,7 +1464,7 @@ BOOL LLMenuItemBranchDownGL::handleKeyHere(KEY key, MASK mask)
{
BOOL menu_open = getBranch()->getVisible();
// don't do keyboard navigation of top-level menus unless in keyboard mode, or menu expanded
- if (getHighlight() && getMenu()->getVisible() && (isActive() || LLMenuGL::getKeyboardMode()))
+ if (getHighlight() && getMenu()->isOpen() && (isActive() || LLMenuGL::getKeyboardMode()))
{
if (key == KEY_LEFT)
{
@@ -1460,12 +1537,6 @@ void LLMenuItemBranchDownGL::draw( void )
gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 );
}
- LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW;
- if (getEnabled() && !getDrawTextDisabled() )
- {
- shadow_style = LLFontGL::DROP_SHADOW_SOFT;
- }
-
LLColor4 color;
if (getHighlight())
{
@@ -1480,7 +1551,7 @@ void LLMenuItemBranchDownGL::draw( void )
color = mDisabledColor.get();
}
getFont()->render( mLabel.getWString(), 0, (F32)getRect().getWidth() / 2.f, (F32)LABEL_BOTTOM_PAD_PIXELS, color,
- LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style );
+ LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL);
// underline navigation key only when keyboard navigation has been initiated
@@ -1555,8 +1626,6 @@ LLMenuScrollItem::LLMenuScrollItem(const Params& p)
}
LLButton::Params bparams;
- bparams.label("");
- bparams.label_selected("");
bparams.mouse_opaque(true);
bparams.scale_image(false);
bparams.click_callback(p.scroll_callback);
@@ -1609,6 +1678,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mBackgroundColor( p.bg_color() ),
mBgVisible( p.bg_visible ),
mDropShadowed( p.drop_shadow ),
+ mHasSelection(false),
mHorizontalLayout( p.horizontal_layout ),
mScrollable(mHorizontalLayout ? FALSE : p.scrollable), // Scrolling is supported only for vertical layout
mMaxScrollableItems(p.max_scrollable_items),
@@ -1628,7 +1698,6 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mSpilloverMenu(NULL),
mJumpKey(p.jump_key),
mCreateJumpKeys(p.create_jump_keys),
- mParentFloaterHandle(p.parent_floater),
mNeedsArrange(FALSE),
mShortcutPad(p.shortcut_pad)
{
@@ -1656,7 +1725,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
void LLMenuGL::initFromParams(const LLMenuGL::Params& p)
{
LLUICtrl::initFromParams(p);
- setCanTearOff(p.can_tear_off, p.parent_floater);
+ setCanTearOff(p.can_tear_off);
}
// Destroys the object
@@ -1668,12 +1737,11 @@ LLMenuGL::~LLMenuGL( void )
mJumpKeys.clear();
}
-void LLMenuGL::setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle )
+void LLMenuGL::setCanTearOff(BOOL tear_off)
{
if (tear_off && mTearOffItem == NULL)
{
LLMenuItemTearOffGL::Params p;
- p.parent_floater_handle = parent_floater_handle;
mTearOffItem = LLUICtrlFactory::create<LLMenuItemTearOffGL>(p);
addChildInBack(mTearOffItem);
}
@@ -1833,17 +1901,21 @@ void LLMenuGL::scrollItemsDown()
item_list_t::iterator next_item_iter;
- for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++)
+ if (cur_item_iter != mItems.end())
{
- if( (*next_item_iter)->getVisible())
+ for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++)
{
- break;
+ if( (*next_item_iter)->getVisible())
+ {
+ break;
+ }
+ }
+
+ if (next_item_iter != mItems.end() &&
+ (*next_item_iter)->getVisible())
+ {
+ mFirstVisibleItem = *next_item_iter;
}
- }
-
- if ((*next_item_iter)->getVisible())
- {
- mFirstVisibleItem = *next_item_iter;
}
mNeedsArrange = TRUE;
@@ -2186,7 +2258,6 @@ void LLMenuGL::createSpilloverBranch()
LLMenuGL::Params p;
p.name("More");
p.label("More"); // *TODO: Translate
- p.parent_floater(mParentFloaterHandle);
p.bg_color(mBackgroundColor);
p.bg_visible(true);
p.can_tear_off(false);
@@ -2767,7 +2838,7 @@ BOOL LLMenuGL::handleHover( S32 x, S32 y, MASK mask )
((LLMenuItemGL*)viewp)->setHighlight(TRUE);
LLMenuGL::setKeyboardMode(FALSE);
}
- mHasSelection = TRUE;
+ mHasSelection = true;
}
}
}
@@ -2800,6 +2871,7 @@ BOOL LLMenuGL::handleScrollWheel( S32 x, S32 y, S32 clicks )
return TRUE;
}
+
void LLMenuGL::draw( void )
{
if (mNeedsArrange)
@@ -2845,7 +2917,7 @@ void LLMenuGL::setVisible(BOOL visible)
}
else
{
- mHasSelection = FALSE;
+ mHasSelection = true;
mFadeTimer.stop();
}
@@ -2894,8 +2966,8 @@ void hide_top_view( LLView* view )
}
-// x and y are the desired location for the popup, NOT necessarily the
-// mouse location
+// x and y are the desired location for the popup, in the spawning_view's
+// coordinate frame, NOT necessarily the mouse location
// static
void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
{
@@ -2923,7 +2995,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
LLUI::getMousePositionLocal(menu->getParent(), &mouse_x, &mouse_y);
LLMenuHolderGL::sContextMenuSpawnPos.set(mouse_x,mouse_y);
- const LLRect menu_region_rect = LLMenuGL::sMenuContainer->getMenuRect();
+ const LLRect menu_region_rect = LLMenuGL::sMenuContainer->getRect();
const S32 HPAD = 2;
LLRect rect = menu->getRect();
@@ -3261,11 +3333,9 @@ BOOL LLMenuBarGL::handleHover( S32 x, S32 y, MASK mask )
///============================================================================
LLCoordGL LLMenuHolderGL::sContextMenuSpawnPos(S32_MAX, S32_MAX);
-LLMenuHolderGL::LLMenuHolderGL()
- : LLPanel()
+LLMenuHolderGL::LLMenuHolderGL(const LLMenuHolderGL::Params& p)
+ : LLPanel(p)
{
- setName("Menu Holder");
- setMouseOpaque(FALSE);
sItemActivationTimer.stop();
mCanHide = TRUE;
}
@@ -3595,6 +3665,11 @@ public:
LLContextMenuBranch(const Params&);
+ virtual ~LLContextMenuBranch()
+ {
+ delete mBranch;
+ }
+
// called to rebuild the draw label
virtual void buildDrawLabel( void );
@@ -3890,7 +3965,6 @@ BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu)
item = LLUICtrlFactory::create<LLContextMenuBranch>(p);
LLMenuGL::sMenuContainer->addChild(item->getBranch());
- item->setFont( LLFontGL::getFontSansSerifSmall() );
return append( item );
}
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 48887ec352..39d1986461 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -79,26 +79,7 @@ public:
highlight_fg_color;
- Params()
- : shortcut("shortcut"),
- jump_key("jump_key", KEY_NONE),
- use_mac_ctrl("use_mac_ctrl", false),
- rect("rect"),
- left("left"),
- top("top"),
- right("right"),
- bottom("bottom"),
- width("width"),
- height("height"),
- bottom_delta("bottom_delta"),
- left_delta("left_delta"),
- enabled_color("enabled_color"),
- disabled_color("disabled_color"),
- highlight_bg_color("highlight_bg_color"),
- highlight_fg_color("highlight_fg_color")
- {
- mouse_opaque = true;
- }
+ Params();
};
protected:
@@ -194,9 +175,7 @@ protected:
// This function appends the character string representation of
// the current accelerator key and mask to the provided string.
void appendAcceleratorString( std::string& st ) const;
-
- void initMenuEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig);
-
+
protected:
KEY mAcceleratorKey;
MASK mAcceleratorMask;
@@ -268,7 +247,7 @@ public:
{
Optional<EnableCallbackParam > on_enable;
Optional<CommitCallbackParam > on_click;
- Optional<VisibleCallbackParam > on_visible;
+ Optional<EnableCallbackParam > on_visible;
Params()
: on_enable("on_enable"),
on_click("on_click"),
@@ -303,15 +282,10 @@ public:
{
return mEnableSignal.connect(cb);
}
-
- boost::signals2::connection setVisibleCallback( const visible_signal_t::slot_type& cb )
- {
- return mVisibleSignal.connect(cb);
- }
-
+
private:
enable_signal_t mEnableSignal;
- visible_signal_t mVisibleSignal;
+ enable_signal_t mVisibleSignal;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -381,7 +355,6 @@ class LLMenuGL
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLHandle<LLFloater> > parent_floater;
Optional<KEY> jump_key;
Optional<bool> horizontal_layout,
can_tear_off,
@@ -456,7 +429,7 @@ public:
void setBackgroundColor( const LLUIColor& color ) { mBackgroundColor = color; }
const LLUIColor& getBackgroundColor() const { return mBackgroundColor; }
void setBackgroundVisible( BOOL b ) { mBgVisible = b; }
- void setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle = LLHandle<LLFloater>());
+ void setCanTearOff(BOOL tear_off);
// add a separator to this menu
virtual BOOL addSeparator();
@@ -505,7 +478,7 @@ public:
void buildDrawLabels();
void createJumpKeys();
- // Show popup at a specific location.
+ // Show popup at a specific location, in the spawn_view's coordinate frame
static void showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y);
// Whether to drop shadow menu bar
@@ -572,14 +545,13 @@ private:
LLHandle<LLView> mParentMenuItem;
LLUIString mLabel;
BOOL mDropShadowed; // Whether to drop shadow
- BOOL mHasSelection;
+ bool mHasSelection;
LLFrameTimer mFadeTimer;
LLTimer mScrollItemsTimer;
BOOL mTornOff;
class LLMenuItemTearOffGL* mTearOffItem;
class LLMenuItemBranchGL* mSpilloverBranch;
LLMenuGL* mSpilloverMenu;
- LLHandle<LLFloater> mParentFloaterHandle;
KEY mJumpKey;
BOOL mCreateJumpKeys;
S32 mShortcutPad;
@@ -765,7 +737,9 @@ private:
class LLMenuHolderGL : public LLPanel
{
public:
- LLMenuHolderGL();
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {};
+ LLMenuHolderGL(const Params& p);
virtual ~LLMenuHolderGL() {}
virtual BOOL hideMenus();
@@ -838,7 +812,6 @@ class LLMenuItemTearOffGL : public LLMenuItemGL
public:
struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
{
- Optional<LLHandle<LLFloater> > parent_floater_handle;
Params()
{
name = "tear off";
@@ -847,13 +820,12 @@ public:
};
LLMenuItemTearOffGL( const Params& );
-
+
virtual void onCommit(void);
virtual void draw(void);
virtual U32 getNominalHeight() const;
-private:
- LLHandle<LLFloater> mParentHandle;
+ LLFloater* getParentFloater();
};
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 7d21c7e0c1..33d47a3f0e 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -92,14 +92,6 @@ void LLMultiFloater::draw()
}
else
{
- for (S32 i = 0; i < mTabContainer->getTabCount(); i++)
- {
- LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(i);
- if (floaterp->getShortTitle() != mTabContainer->getPanelTitle(i))
- {
- mTabContainer->setPanelTitle(i, floaterp->getShortTitle());
- }
- }
LLFloater::draw();
}
}
@@ -434,6 +426,7 @@ void LLMultiFloater::onTabSelected()
void LLMultiFloater::setCanResize(BOOL can_resize)
{
LLFloater::setCanResize(can_resize);
+ if (!mTabContainer) return;
if (isResizable() && mTabContainer->getTabPosition() == LLTabContainer::BOTTOM)
{
mTabContainer->setRightTabBtnOffset(RESIZE_HANDLE_WIDTH);
@@ -457,6 +450,8 @@ BOOL LLMultiFloater::postBuild()
}
mTabContainer = getChild<LLTabContainer>("Preview Tabs");
+
+ setCanResize(mResizable);
return TRUE;
}
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 68e496aed1..27a727fdf5 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -50,6 +50,12 @@ const F32 FLOAT_THRESHOLD = 0.00001f;
S32 LLMultiSlider::mNameCounter = 0;
+LLMultiSlider::SliderParams::SliderParams()
+: name("name"),
+ value("value", 0.f)
+{
+}
+
LLMultiSlider::Params::Params()
: max_sliders("max_sliders", 1),
allow_overlap("allow_overlap", false),
@@ -63,7 +69,8 @@ LLMultiSlider::Params::Params()
triangle_color("triangle_color"),
mouse_down_callback("mouse_down_callback"),
mouse_up_callback("mouse_up_callback"),
- thumb_width("thumb_width")
+ thumb_width("thumb_width"),
+ sliders("slider")
{
name = "multi_slider_bar";
mouse_opaque(true);
@@ -84,17 +91,44 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
mThumbCenterSelectedColor(p.thumb_center_selected_color()),
mDisabledThumbColor(p.thumb_disabled_color()),
mTriangleColor(p.triangle_color()),
- mThumbWidth(p.thumb_width)
+ mThumbWidth(p.thumb_width),
+ mMouseDownSignal(NULL),
+ mMouseUpSignal(NULL)
{
mValue.emptyMap();
mCurSlider = LLStringUtil::null;
if (p.mouse_down_callback.isProvided())
- initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+ {
+ setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+ }
if (p.mouse_up_callback.isProvided())
- initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+ {
+ setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+ }
+
+ for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders().begin();
+ it != p.sliders().end();
+ ++it)
+ {
+ if (it->name.isProvided())
+ {
+ addSlider(it->value, it->name);
+ }
+ else
+ {
+ addSlider(it->value);
+ }
+ }
+}
+
+LLMultiSlider::~LLMultiSlider()
+{
+ delete mMouseDownSignal;
+ delete mMouseUpSignal;
}
+
void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from_event)
{
// exit if not there
@@ -217,6 +251,30 @@ const std::string& LLMultiSlider::addSlider(F32 val)
return mCurSlider;
}
+void LLMultiSlider::addSlider(F32 val, const std::string& name)
+{
+ F32 initVal = val;
+
+ if(mValue.size() >= mMaxNumSliders) {
+ return;
+ }
+
+ bool foundOne = findUnusedValue(initVal);
+ if(!foundOne) {
+ return;
+ }
+
+ // add a new thumb rect
+ mThumbRects[name] = LLRect( 0, getRect().getHeight(), mThumbWidth, 0 );
+
+ // add the value and set the current slider to this one
+ mValue.insert(name, initVal);
+ mCurSlider = name;
+
+ // move the slider
+ setSliderValue(mCurSlider, initVal, TRUE);
+}
+
bool LLMultiSlider::findUnusedValue(F32& initVal)
{
bool firstTry = true;
@@ -325,7 +383,8 @@ BOOL LLMultiSlider::handleMouseUp(S32 x, S32 y, MASK mask)
{
gFocusMgr.setMouseCapture( NULL );
- mMouseUpSignal( this, LLSD() );
+ if (mMouseUpSignal)
+ (*mMouseUpSignal)( this, LLSD() );
handled = TRUE;
make_ui_sound("UISndClickRelease");
@@ -345,7 +404,8 @@ BOOL LLMultiSlider::handleMouseDown(S32 x, S32 y, MASK mask)
{
setFocus(TRUE);
}
- mMouseDownSignal( this, LLSD() );
+ if (mMouseDownSignal)
+ (*mMouseDownSignal)( this, LLSD() );
if (MASK_CONTROL & mask) // if CTRL is modifying
{
@@ -430,7 +490,7 @@ void LLMultiSlider::draw()
F32 opacity = getEnabled() ? 1.f : 0.3f;
// Track
- LLUIImagePtr thumb_imagep = LLUI::getUIImage("rounded_square.tga");
+ LLUIImagePtr thumb_imagep = LLUI::getUIImage("Rounded_Square");
static LLUICachedControl<S32> multi_track_height ("UIMultiTrackHeight", 0);
S32 height_offset = (getRect().getHeight() - multi_track_height) / 2;
@@ -557,3 +617,14 @@ void LLMultiSlider::draw()
LLF32UICtrl::draw();
}
+boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+ return mMouseDownSignal->connect(cb);
+}
+
+boost::signals2::connection LLMultiSlider::setMouseUpCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+ return mMouseUpSignal->connect(cb);
+}
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index da633cc1cd..88576da85b 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -41,6 +41,13 @@ class LLUICtrlFactory;
class LLMultiSlider : public LLF32UICtrl
{
public:
+ struct SliderParams : public LLInitParam::Block<SliderParams>
+ {
+ Optional<std::string> name;
+ Mandatory<F32> value;
+ SliderParams();
+ };
+
struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
{
Optional<S32> max_sliders;
@@ -60,6 +67,7 @@ public:
mouse_up_callback;
Optional<S32> thumb_width;
+ Multiple<SliderParams> sliders;
Params();
};
@@ -67,26 +75,28 @@ protected:
LLMultiSlider(const Params&);
friend class LLUICtrlFactory;
public:
- void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
- F32 getSliderValue(const std::string& name) const;
+ virtual ~LLMultiSlider();
+ void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
+ F32 getSliderValue(const std::string& name) const;
- const std::string& getCurSlider() const { return mCurSlider; }
- F32 getCurSliderValue() const { return getSliderValue(mCurSlider); }
- void setCurSlider(const std::string& name);
- void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
+ const std::string& getCurSlider() const { return mCurSlider; }
+ F32 getCurSliderValue() const { return getSliderValue(mCurSlider); }
+ void setCurSlider(const std::string& name);
+ void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
/*virtual*/ void setValue(const LLSD& value);
/*virtual*/ LLSD getValue() const { return mValue; }
- boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
- boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); }
+ boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb );
- bool findUnusedValue(F32& initVal);
+ bool findUnusedValue(F32& initVal);
const std::string& addSlider();
const std::string& addSlider(F32 val);
- void deleteSlider(const std::string& name);
- void deleteCurSlider() { deleteSlider(mCurSlider); }
- void clear();
+ void addSlider(F32 val, const std::string& name);
+ void deleteSlider(const std::string& name);
+ void deleteCurSlider() { deleteSlider(mCurSlider); }
+ void clear();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -108,7 +118,8 @@ protected:
LLRect mDragStartThumbRect;
S32 mThumbWidth;
- std::map<std::string, LLRect> mThumbRects;
+ std::map<std::string, LLRect>
+ mThumbRects;
LLUIColor mTrackColor;
LLUIColor mThumbOutlineColor;
LLUIColor mThumbCenterColor;
@@ -116,8 +127,8 @@ protected:
LLUIColor mDisabledThumbColor;
LLUIColor mTriangleColor;
- commit_signal_t mMouseDownSignal;
- commit_signal_t mMouseUpSignal;
+ commit_signal_t* mMouseDownSignal;
+ commit_signal_t* mMouseUpSignal;
};
#endif // LL_MULTI_SLIDER_H
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index a9f462173d..cc26c00a3e 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -65,7 +65,8 @@ LLMultiSliderCtrl::Params::Params()
text_color("text_color"),
text_disabled_color("text_disabled_color"),
mouse_down_callback("mouse_down_callback"),
- mouse_up_callback("mouse_up_callback")
+ mouse_up_callback("mouse_up_callback"),
+ sliders("slider")
{
mouse_opaque = true;
}
@@ -137,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
params.font(p.font);
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit);
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) );
@@ -161,6 +162,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
S32 slider_left = label_width ? label_width + multi_sliderctrl_spacing : 0;
LLRect slider_rect( slider_left, top, slider_right, bottom );
LLMultiSlider::Params params;
+ params.sliders = p.sliders;
params.rect(slider_rect);
params.commit_callback.function( LLMultiSliderCtrl::onSliderCommit );
params.mouse_down_callback( p.mouse_down_callback );
@@ -328,9 +330,14 @@ void LLMultiSliderCtrl::updateText()
// static
void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
{
- LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl);
+ llassert(ctrl);
if (!ctrl)
return;
+
+ LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
+ llassert(self);
+ if (!self) // cast failed - wrong type! :O
+ return;
BOOL success = FALSE;
F32 val = self->mCurValue;
@@ -344,7 +351,7 @@ void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
if( self->mMultiSlider->getMinValue() <= val && val <= self->mMultiSlider->getMaxValue() )
{
self->setCurSliderValue( val ); // set the value temporarily so that the callback can retrieve it.
- if( self->mValidateSignal( self, val ) )
+ if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
{
success = TRUE;
}
@@ -369,7 +376,7 @@ void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
// static
void LLMultiSliderCtrl::onSliderCommit(LLUICtrl* ctrl, const LLSD& userdata)
{
- LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl);
+ LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
if (!self)
return;
@@ -378,7 +385,7 @@ void LLMultiSliderCtrl::onSliderCommit(LLUICtrl* ctrl, const LLSD& userdata)
F32 new_val = self->mMultiSlider->getCurSliderValue();
self->mCurValue = new_val; // set the value temporarily so that the callback can retrieve it.
- if( self->mValidateSignal( self, new_val ) )
+ if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
{
success = TRUE;
}
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index 16d07541f2..e8366d09c2 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -69,6 +69,8 @@ public:
Optional<CommitCallbackParam> mouse_down_callback,
mouse_up_callback;
+ Multiple<LLMultiSlider::SliderParams> sliders;
+
Params();
};
diff --git a/indra/llui/llnotificationptr.h b/indra/llui/llnotificationptr.h
new file mode 100644
index 0000000000..0718f7d182
--- /dev/null
+++ b/indra/llui/llnotificationptr.h
@@ -0,0 +1,41 @@
+/**
+ * @file llnotificationptr.h
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLNOTIFICATIONPTR_H
+#define LLNOTIFICATIONPTR_H
+
+// Many classes just store a single LLNotificationPtr
+// and llnotifications.h is very large, so define this ligher header.
+#include <boost/shared_ptr.hpp>
+
+class LLNotification;
+typedef boost::shared_ptr<LLNotification> LLNotificationPtr;
+
+#endif
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index ef222bad60..5816cef6af 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -81,6 +81,11 @@ private:
void savePersistentNotifications()
{
+ /* NOTE: As of 2009-11-09 the reload of notifications on startup does not
+ work, and has not worked for months. Skip saving notifications until the
+ read can be fixed, because this hits the disk once per notification and
+ causes log spam. James
+
llinfos << "Saving open notifications to " << mFileName << llendl;
llofstream notify_file(mFileName.c_str());
@@ -107,6 +112,7 @@ private:
LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
+ */
}
void loadPersistentNotifications()
@@ -277,6 +283,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodeP
}
LLNotificationForm::LLNotificationForm(const LLSD& sd)
+ : mIgnore(IGNORE_NO)
{
if (sd.isArray())
{
@@ -378,7 +385,8 @@ LLNotificationTemplate::LLNotificationTemplate() :
mExpireSeconds(0),
mExpireOption(-1),
mURLOption(-1),
- mURLOpenExternally(-1),
+ mURLOpenExternally(-1),
+ mPersist(false),
mUnique(false),
mPriority(NOTIFICATION_PRIORITY_NORMAL)
{
@@ -705,7 +713,7 @@ LLBoundListener LLNotificationChannelBase::connectChangedImpl(const LLEventListe
// only about new notifications
for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
{
- slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
+ slot(LLSD().with("sigtype", "load").with("id", (*it)->id()));
}
// and then connect the signal so that all future notifications will also be
// forwarded.
@@ -716,7 +724,7 @@ LLBoundListener LLNotificationChannelBase::connectAtFrontChangedImpl(const LLEve
{
for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
{
- slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
+ slot(LLSD().with("sigtype", "load").with("id", (*it)->id()));
}
return mChanged.connect(slot, boost::signals2::at_front);
}
@@ -901,7 +909,7 @@ void LLNotificationChannel::setComparator(LLNotificationComparator comparator)
mItems.swap(s2);
// notify clients that we've been resorted
- mChanged(LLSD().insert("sigtype", "sort"));
+ mChanged(LLSD().with("sigtype", "sort"));
}
bool LLNotificationChannel::isEmpty() const
@@ -1052,6 +1060,7 @@ LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelN
if(p == mChannels.end())
{
llerrs << "Did not find channel named " << channelName << llendl;
+ return LLNotificationChannelPtr();
}
return p->second;
}
@@ -1389,10 +1398,9 @@ void LLNotifications::addFromCallback(const LLSD& name)
add(LLNotification::Params().name(name.asString()));
}
-// we provide a couple of simple add notification functions so that it's reasonable to create notifications in one line
LLNotificationPtr LLNotifications::add(const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload)
+ const LLSD& substitutions,
+ const LLSD& payload)
{
LLNotification::Params::Functor functor_p;
functor_p.name = name;
@@ -1400,15 +1408,16 @@ LLNotificationPtr LLNotifications::add(const std::string& name,
}
LLNotificationPtr LLNotifications::add(const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload,
- const std::string& functor_name)
+ const LLSD& substitutions,
+ const LLSD& payload,
+ const std::string& functor_name)
{
LLNotification::Params::Functor functor_p;
functor_p.name = functor_name;
return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
}
-
+
+//virtual
LLNotificationPtr LLNotifications::add(const std::string& name,
const LLSD& substitutions,
const LLSD& payload,
@@ -1437,7 +1446,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
llerrs << "Notification added a second time to the master notification channel." << llendl;
}
- updateItem(LLSD().insert("sigtype", "add").insert("id", pNotif->id()), pNotif);
+ updateItem(LLSD().with("sigtype", "add").with("id", pNotif->id()), pNotif);
}
void LLNotifications::cancel(LLNotificationPtr pNotif)
@@ -1448,7 +1457,7 @@ void LLNotifications::cancel(LLNotificationPtr pNotif)
llerrs << "Attempted to delete nonexistent notification " << pNotif->getName() << llendl;
}
pNotif->cancel();
- updateItem(LLSD().insert("sigtype", "delete").insert("id", pNotif->id()), pNotif);
+ updateItem(LLSD().with("sigtype", "delete").with("id", pNotif->id()), pNotif);
}
void LLNotifications::update(const LLNotificationPtr pNotif)
@@ -1456,7 +1465,7 @@ void LLNotifications::update(const LLNotificationPtr pNotif)
LLNotificationSet::iterator it=mItems.find(pNotif);
if (it != mItems.end())
{
- updateItem(LLSD().insert("sigtype", "change").insert("id", pNotif->id()), pNotif);
+ updateItem(LLSD().with("sigtype", "change").with("id", pNotif->id()), pNotif);
}
}
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 0d7cb74f70..8d993b71d7 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -103,9 +103,7 @@
#include "llpointer.h"
#include "llinitparam.h"
#include "llnotificationslistener.h"
-
-class LLNotification;
-typedef boost::shared_ptr<LLNotification> LLNotificationPtr;
+#include "llnotificationptr.h"
typedef enum e_notification_priority
@@ -373,7 +371,7 @@ private:
// this is just for making it easy to look things up in a set organized by UUID -- DON'T USE IT
// for anything real!
- LLNotification(LLUUID uuid) : mId(uuid) {}
+ LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mPriority(NOTIFICATION_PRIORITY_UNSPECIFIED), mTemporaryResponder(false) {}
void cancel();
@@ -623,7 +621,7 @@ namespace LLNotificationComparators
struct orderBy
{
typedef boost::function<T (LLNotificationPtr)> field_t;
- orderBy(field_t field, EDirection = ORDER_INCREASING) : mField(field) {}
+ orderBy(field_t field, EDirection direction = ORDER_INCREASING) : mField(field), mDirection(direction) {}
bool operator()(LLNotificationPtr lhs, LLNotificationPtr rhs)
{
if (mDirection == ORDER_DECREASING)
@@ -841,10 +839,11 @@ public:
// Add a simple notification (from XUI)
void addFromCallback(const LLSD& name);
- // we provide a collection of simple add notification functions so that it's reasonable to create notifications in one line
+ // *NOTE: To add simple notifications, #include "llnotificationsutil.h"
+ // and use LLNotificationsUtil::add("MyNote") or add("MyNote", args)
LLNotificationPtr add(const std::string& name,
- const LLSD& substitutions = LLSD(),
- const LLSD& payload = LLSD());
+ const LLSD& substitutions,
+ const LLSD& payload);
LLNotificationPtr add(const std::string& name,
const LLSD& substitutions,
const LLSD& payload,
diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 75f4d6177d..ee6ec0f88f 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -10,16 +10,61 @@
*/
#include "linden_common.h"
-
#include "llnotificationslistener.h"
-
#include "llnotifications.h"
+#include "llsd.h"
+#include "llui.h"
LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) :
- LLDispatchListener("LLNotifications", "op"),
+ LLEventAPI("LLNotifications",
+ "LLNotifications listener to (e.g.) pop up a notification"),
mNotifications(notifications)
{
- add("requestAdd", &LLNotificationsListener::requestAdd);
+ add("requestAdd",
+ "Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n"
+ "If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.",
+ &LLNotificationsListener::requestAdd);
+ add("listChannels",
+ "Post to [\"reply\"] a map of info on existing channels",
+ &LLNotificationsListener::listChannels,
+ LLSD().with("reply", LLSD()));
+ add("listChannelNotifications",
+ "Post to [\"reply\"] an array of info on notifications in channel [\"channel\"]",
+ &LLNotificationsListener::listChannelNotifications,
+ LLSD().with("reply", LLSD()).with("channel", LLSD()));
+ add("respond",
+ "Respond to notification [\"uuid\"] with data in [\"response\"]",
+ &LLNotificationsListener::respond,
+ LLSD().with("uuid", LLSD()));
+ add("cancel",
+ "Cancel notification [\"uuid\"]",
+ &LLNotificationsListener::cancel,
+ LLSD().with("uuid", LLSD()));
+ add("ignore",
+ "Ignore future notification [\"name\"]\n"
+ "(from <notification name= > in notifications.xml)\n"
+ "according to boolean [\"ignore\"].\n"
+ "If [\"name\"] is omitted or undefined, [un]ignore all future notifications.\n"
+ "Note that ignored notifications are not forwarded unless intercepted before\n"
+ "the \"Ignore\" channel.",
+ &LLNotificationsListener::ignore);
+ add("forward",
+ "Forward to [\"pump\"] future notifications on channel [\"channel\"]\n"
+ "according to boolean [\"forward\"]. When enabled, only types matching\n"
+ "[\"types\"] are forwarded, as follows:\n"
+ "omitted or undefined: forward all notifications\n"
+ "string: forward only the specific named [sig]type\n"
+ "array of string: forward any notification matching any named [sig]type.\n"
+ "When boolean [\"respond\"] is true, we auto-respond to each forwarded\n"
+ "notification.",
+ &LLNotificationsListener::forward,
+ LLSD().with("channel", LLSD()));
+}
+
+// This is here in the .cpp file so we don't need the definition of class
+// Forwarder in the header file.
+LLNotificationsListener::~LLNotificationsListener()
+{
}
void LLNotificationsListener::requestAdd(const LLSD& event_data) const
@@ -53,3 +98,235 @@ void LLNotificationsListener::NotificationResponder(const std::string& reply_pum
reponse_event["response"] = response;
LLEventPumps::getInstance()->obtain(reply_pump).post(reponse_event);
}
+
+void LLNotificationsListener::listChannels(const LLSD& params) const
+{
+ LLReqID reqID(params);
+ LLSD response(reqID.makeResponse());
+ for (LLNotifications::ChannelMap::const_iterator cmi(mNotifications.mChannels.begin()),
+ cmend(mNotifications.mChannels.end());
+ cmi != cmend; ++cmi)
+ {
+ LLSD channelInfo;
+ channelInfo["parent"] = cmi->second->getParentChannelName();
+ response[cmi->first] = channelInfo;
+ }
+ LLEventPumps::instance().obtain(params["reply"]).post(response);
+}
+
+void LLNotificationsListener::listChannelNotifications(const LLSD& params) const
+{
+ LLReqID reqID(params);
+ LLSD response(reqID.makeResponse());
+ LLNotificationChannelPtr channel(mNotifications.getChannel(params["channel"]));
+ if (channel)
+ {
+ LLSD notifications(LLSD::emptyArray());
+ for (LLNotificationChannel::Iterator ni(channel->begin()), nend(channel->end());
+ ni != nend; ++ni)
+ {
+ notifications.append(asLLSD(*ni));
+ }
+ response["notifications"] = notifications;
+ }
+ LLEventPumps::instance().obtain(params["reply"]).post(response);
+}
+
+void LLNotificationsListener::respond(const LLSD& params) const
+{
+ LLNotificationPtr notification(mNotifications.find(params["uuid"]));
+ if (notification)
+ {
+ notification->respond(params["response"]);
+ }
+}
+
+void LLNotificationsListener::cancel(const LLSD& params) const
+{
+ LLNotificationPtr notification(mNotifications.find(params["uuid"]));
+ if (notification)
+ {
+ mNotifications.cancel(notification);
+ }
+}
+
+void LLNotificationsListener::ignore(const LLSD& params) const
+{
+ // Calling a method named "ignore", but omitting its "ignore" Boolean
+ // argument, should by default cause something to be ignored. Explicitly
+ // pass ["ignore"] = false to cancel ignore.
+ bool ignore = true;
+ if (params.has("ignore"))
+ {
+ ignore = params["ignore"].asBoolean();
+ }
+ // This method can be used to affect either a single notification name or
+ // all future notifications. The two use substantially different mechanisms.
+ if (params["name"].isDefined())
+ {
+ // ["name"] was passed: ignore just that notification
+ LLUI::sSettingGroups["ignores"]->setBOOL(params["name"], ignore);
+ }
+ else
+ {
+ // no ["name"]: ignore all future notifications
+ mNotifications.setIgnoreAllNotifications(ignore);
+ }
+}
+
+class LLNotificationsListener::Forwarder: public LLEventTrackable
+{
+ LOG_CLASS(LLNotificationsListener::Forwarder);
+public:
+ Forwarder(LLNotifications& llnotifications, const std::string& channel):
+ mNotifications(llnotifications),
+ mRespond(false)
+ {
+ // Connect to the specified channel on construction. Because
+ // LLEventTrackable is a base, we should automatically disconnect when
+ // destroyed.
+ LLNotificationChannelPtr channelptr(llnotifications.getChannel(channel));
+ if (channelptr)
+ {
+ // Insert our processing as a "passed filter" listener. This way
+ // we get to run before all the "changed" listeners, and we get to
+ // swipe it (hide it from the other listeners) if desired.
+ channelptr->connectPassedFilter(boost::bind(&Forwarder::handle, this, _1));
+ }
+ }
+
+ void setPumpName(const std::string& name) { mPumpName = name; }
+ void setTypes(const LLSD& types) { mTypes = types; }
+ void setRespond(bool respond) { mRespond = respond; }
+
+private:
+ bool handle(const LLSD& notification) const;
+ bool matchType(const LLSD& filter, const std::string& type) const;
+
+ LLNotifications& mNotifications;
+ std::string mPumpName;
+ LLSD mTypes;
+ bool mRespond;
+};
+
+void LLNotificationsListener::forward(const LLSD& params)
+{
+ std::string channel(params["channel"]);
+ // First decide whether we're supposed to start forwarding or stop it.
+ // Default to true.
+ bool forward = true;
+ if (params.has("forward"))
+ {
+ forward = params["forward"].asBoolean();
+ }
+ if (! forward)
+ {
+ // This is a request to stop forwarding notifications on the specified
+ // channel. The rest of the params don't matter.
+ // Because mForwarders contains scoped_ptrs, erasing the map entry
+ // DOES delete the heap Forwarder object. Because Forwarder derives
+ // from LLEventTrackable, destroying it disconnects it from the
+ // channel.
+ mForwarders.erase(channel);
+ return;
+ }
+ // From here on, we know we're being asked to start (or modify) forwarding
+ // on the specified channel. Find or create an appropriate Forwarder.
+ ForwarderMap::iterator
+ entry(mForwarders.insert(ForwarderMap::value_type(channel, ForwarderMap::mapped_type())).first);
+ if (! entry->second)
+ {
+ entry->second.reset(new Forwarder(mNotifications, channel));
+ }
+ // Now, whether this Forwarder is brand-new or not, update it with the new
+ // request info.
+ Forwarder& fwd(*entry->second);
+ fwd.setPumpName(params["pump"]);
+ fwd.setTypes(params["types"]);
+ fwd.setRespond(params["respond"]);
+}
+
+bool LLNotificationsListener::Forwarder::handle(const LLSD& notification) const
+{
+ LL_INFOS("LLNotificationsListener") << "handle(" << notification << ")" << LL_ENDL;
+ if (notification["sigtype"].asString() == "delete")
+ {
+ LL_INFOS("LLNotificationsListener") << "ignoring delete" << LL_ENDL;
+ // let other listeners see the "delete" operation
+ return false;
+ }
+ LLNotificationPtr note(mNotifications.find(notification["id"]));
+ if (! note)
+ {
+ LL_INFOS("LLNotificationsListener") << notification["id"] << " not found" << LL_ENDL;
+ return false;
+ }
+ if (! matchType(mTypes, note->getType()))
+ {
+ LL_INFOS("LLNotificationsListener") << "didn't match types " << mTypes << LL_ENDL;
+ // We're not supposed to intercept this particular notification. Let
+ // other listeners process it.
+ return false;
+ }
+ LL_INFOS("LLNotificationsListener") << "sending via '" << mPumpName << "'" << LL_ENDL;
+ // This is a notification we care about. Forward it through specified
+ // LLEventPump.
+ LLEventPumps::instance().obtain(mPumpName).post(asLLSD(note));
+ // Are we also being asked to auto-respond?
+ if (mRespond)
+ {
+ LL_INFOS("LLNotificationsListener") << "should respond" << LL_ENDL;
+ note->respond(LLSD::emptyMap());
+ // Did that succeed in removing the notification? Only cancel() if
+ // it's still around -- otherwise we get an LL_ERRS crash!
+ note = mNotifications.find(notification["id"]);
+ if (note)
+ {
+ LL_INFOS("LLNotificationsListener") << "respond() didn't clear, canceling" << LL_ENDL;
+ mNotifications.cancel(note);
+ }
+ }
+ // If we've auto-responded to this notification, then it's going to be
+ // deleted. Other listeners would get the change operation, try to look it
+ // up and be baffled by lookup failure. So when we auto-respond, suppress
+ // this notification: don't pass it to other listeners.
+ return mRespond;
+}
+
+bool LLNotificationsListener::Forwarder::matchType(const LLSD& filter, const std::string& type) const
+{
+ // Decide whether this notification matches filter:
+ // undefined: forward all notifications
+ if (filter.isUndefined())
+ {
+ return true;
+ }
+ // array of string: forward any notification matching any named type
+ if (filter.isArray())
+ {
+ for (LLSD::array_const_iterator ti(filter.beginArray()), tend(filter.endArray());
+ ti != tend; ++ti)
+ {
+ if (ti->asString() == type)
+ {
+ return true;
+ }
+ }
+ // Didn't match any entry in the array
+ return false;
+ }
+ // string: forward only the specific named type
+ return (filter.asString() == type);
+}
+
+LLSD LLNotificationsListener::asLLSD(LLNotificationPtr note)
+{
+ LLSD notificationInfo(note->asLLSD());
+ // For some reason the following aren't included in LLNotification::asLLSD().
+ notificationInfo["summary"] = note->summarize();
+ notificationInfo["id"] = note->id();
+ notificationInfo["type"] = note->getType();
+ notificationInfo["message"] = note->getMessage();
+ notificationInfo["label"] = note->getLabel();
+ return notificationInfo;
+}
diff --git a/indra/llui/llnotificationslistener.h b/indra/llui/llnotificationslistener.h
index 6f71a7c781..de208b57f0 100644
--- a/indra/llui/llnotificationslistener.h
+++ b/indra/llui/llnotificationslistener.h
@@ -12,22 +12,40 @@
#ifndef LL_LLNOTIFICATIONSLISTENER_H
#define LL_LLNOTIFICATIONSLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
+#include "llnotificationptr.h"
+#include <boost/shared_ptr.hpp>
+#include <map>
+#include <string>
class LLNotifications;
class LLSD;
-class LLNotificationsListener : public LLDispatchListener
+class LLNotificationsListener : public LLEventAPI
{
public:
LLNotificationsListener(LLNotifications & notifications);
+ ~LLNotificationsListener();
+private:
void requestAdd(LLSD const & event_data) const;
-private:
void NotificationResponder(const std::string& replypump,
const LLSD& notification,
const LLSD& response) const;
+
+ void listChannels(const LLSD& params) const;
+ void listChannelNotifications(const LLSD& params) const;
+ void respond(const LLSD& params) const;
+ void cancel(const LLSD& params) const;
+ void ignore(const LLSD& params) const;
+ void forward(const LLSD& params);
+
+ static LLSD asLLSD(LLNotificationPtr);
+
+ class Forwarder;
+ typedef std::map<std::string, boost::shared_ptr<Forwarder> > ForwarderMap;
+ ForwarderMap mForwarders;
LLNotifications & mNotifications;
};
diff --git a/indra/llui/llnotificationsutil.cpp b/indra/llui/llnotificationsutil.cpp
new file mode 100644
index 0000000000..54bdb4bd66
--- /dev/null
+++ b/indra/llui/llnotificationsutil.cpp
@@ -0,0 +1,101 @@
+/**
+ * @file llnotificationsutil.cpp
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "llnotificationsutil.h"
+
+#include "llnotifications.h"
+#include "llsd.h"
+#include "llxmlnode.h" // apparently needed to call LLNotifications::instance()
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name)
+{
+ LLNotification::Params::Functor functor_p;
+ functor_p.name = name;
+ return LLNotifications::instance().add(
+ LLNotification::Params().name(name).substitutions(LLSD()).payload(LLSD()).functor(functor_p));
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions)
+{
+ LLNotification::Params::Functor functor_p;
+ functor_p.name = name;
+ return LLNotifications::instance().add(
+ LLNotification::Params().name(name).substitutions(substitutions).payload(LLSD()).functor(functor_p));
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload)
+{
+ LLNotification::Params::Functor functor_p;
+ functor_p.name = name;
+ return LLNotifications::instance().add(
+ LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ const std::string& functor_name)
+{
+ LLNotification::Params::Functor functor_p;
+ functor_p.name = functor_name;
+ return LLNotifications::instance().add(
+ LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ boost::function<void (const LLSD&, const LLSD&)> functor)
+{
+ LLNotification::Params::Functor functor_p;
+ functor_p.function = functor;
+ return LLNotifications::instance().add(
+ LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
+}
+
+S32 LLNotificationsUtil::getSelectedOption(const LLSD& notification, const LLSD& response)
+{
+ return LLNotification::getSelectedOption(notification, response);
+}
+
+void LLNotificationsUtil::cancel(LLNotificationPtr pNotif)
+{
+ LLNotifications::instance().cancel(pNotif);
+}
+
+LLNotificationPtr LLNotificationsUtil::find(LLUUID uuid)
+{
+ return LLNotifications::instance().find(uuid);
+}
diff --git a/indra/llui/llnotificationsutil.h b/indra/llui/llnotificationsutil.h
new file mode 100644
index 0000000000..338204924a
--- /dev/null
+++ b/indra/llui/llnotificationsutil.h
@@ -0,0 +1,72 @@
+/**
+ * @file llnotificationsutil.h
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLNOTIFICATIONSUTIL_H
+#define LLNOTIFICATIONSUTIL_H
+
+// The vast majority of clients of the notifications system just want to add
+// a notification to the screen, so define this lightweight public interface
+// to avoid including the heavyweight llnotifications.h
+
+#include "llnotificationptr.h"
+
+#include <boost/function.hpp>
+
+class LLSD;
+
+namespace LLNotificationsUtil
+{
+ LLNotificationPtr add(const std::string& name);
+
+ LLNotificationPtr add(const std::string& name,
+ const LLSD& substitutions);
+
+ LLNotificationPtr add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload);
+
+ LLNotificationPtr add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ const std::string& functor_name);
+
+ LLNotificationPtr add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ boost::function<void (const LLSD&, const LLSD&)> functor);
+
+ S32 getSelectedOption(const LLSD& notification, const LLSD& response);
+
+ void cancel(LLNotificationPtr pNotif);
+
+ LLNotificationPtr find(LLUUID uuid);
+}
+
+#endif
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 0d340699c5..0cd052eefa 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -34,15 +34,16 @@
#include "linden_common.h"
+#define LLPANEL_CPP
#include "llpanel.h"
-#include "llalertdialog.h"
#include "llfocusmgr.h"
#include "llfontgl.h"
#include "llrect.h"
#include "llerror.h"
#include "lltimer.h"
+#include "llaccordionctrltab.h"
#include "llbutton.h"
#include "llmenugl.h"
//#include "llstatusbar.h"
@@ -58,6 +59,10 @@
static LLDefaultChildRegistry::Register<LLPanel> r1("panel", &LLPanel::fromXML);
+// Compiler optimization, generate extern template
+template class LLPanel* LLView::getChild<class LLPanel>(
+ const std::string& name, BOOL recurse) const;
+
LLPanel::LocalizedString::LocalizedString()
: name("name"),
value("value")
@@ -75,6 +80,8 @@ LLPanel::Params::Params()
background_opaque("background_opaque", false),
bg_opaque_color("bg_opaque_color"),
bg_alpha_color("bg_alpha_color"),
+ bg_opaque_image_overlay("bg_opaque_image_overlay"),
+ bg_alpha_image_overlay("bg_alpha_image_overlay"),
bg_opaque_image("bg_opaque_image"),
bg_alpha_image("bg_alpha_image"),
min_width("min_width", 100),
@@ -98,6 +105,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
mBgOpaque(p.background_opaque),
mBgOpaqueColor(p.bg_opaque_color()),
mBgAlphaColor(p.bg_alpha_color()),
+ mBgOpaqueImageOverlay(p.bg_opaque_image_overlay),
+ mBgAlphaImageOverlay(p.bg_alpha_image_overlay),
mBgOpaqueImage(p.bg_opaque_image()),
mBgAlphaImage(p.bg_alpha_image()),
mDefaultBtn(NULL),
@@ -106,12 +115,11 @@ LLPanel::LLPanel(const LLPanel::Params& p)
mHelpTopic(p.help_topic),
mCommitCallbackRegistrar(false),
mEnableCallbackRegistrar(false),
- mXMLFilename(p.filename)
+ mXMLFilename(p.filename),
+ mVisibleSignal(NULL)
// *NOTE: Be sure to also change LLPanel::initFromParams(). We have too
// many classes derived from LLPanel to retrofit them all to pass in params.
{
- setIsChrome(FALSE);
-
if (p.has_border)
{
addBorder(p.border);
@@ -120,6 +128,11 @@ LLPanel::LLPanel(const LLPanel::Params& p)
mPanelHandle.bind(this);
}
+LLPanel::~LLPanel()
+{
+ delete mVisibleSignal;
+}
+
// virtual
BOOL LLPanel::isPanel() const
{
@@ -190,7 +203,7 @@ void LLPanel::draw()
// opaque, in-front look
if (mBgOpaqueImage.notNull())
{
- mBgOpaqueImage->draw( local_rect, UI_VERTEX_COLOR % alpha );
+ mBgOpaqueImage->draw( local_rect, mBgOpaqueImageOverlay % alpha );
}
else
{
@@ -203,7 +216,7 @@ void LLPanel::draw()
// transparent, in-back look
if (mBgAlphaImage.notNull())
{
- mBgAlphaImage->draw( local_rect, UI_VERTEX_COLOR % alpha );
+ mBgAlphaImage->draw( local_rect, mBgAlphaImageOverlay % alpha );
}
else
{
@@ -334,7 +347,8 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask )
void LLPanel::handleVisibilityChange ( BOOL new_visibility )
{
LLUICtrl::handleVisibilityChange ( new_visibility );
- mVisibleSignal(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
+ if (mVisibleSignal)
+ (*mVisibleSignal)(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
}
void LLPanel::setFocus(BOOL b)
@@ -387,6 +401,12 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
if (!panelp)
{
panelp = LLUICtrlFactory::getInstance()->createFactoryPanel(name);
+ llassert(panelp);
+
+ if (!panelp)
+ {
+ return NULL; // :(
+ }
}
}
@@ -404,7 +424,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
panelp->mCommitCallbackRegistrar.popScope();
panelp->mEnableCallbackRegistrar.popScope();
- if (panelp && !panelp->getFactoryMap().empty())
+ if (!panelp->getFactoryMap().empty())
{
LLUICtrlFactory::instance().popFactoryFunctions();
}
@@ -426,7 +446,9 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
// visible callback
if (p.visible_callback.isProvided())
- initCommitCallback(p.visible_callback, mVisibleSignal);
+ {
+ setVisibleCallback(initCommitCallback(p.visible_callback));
+ }
for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings().begin();
it != p.strings().end();
@@ -441,7 +463,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
parseFollowsFlags(p);
setToolTip(p.tool_tip());
- setSaveToXML(p.from_xui);
+ setFromXUI(p.from_xui);
mHoverCursor = getCursorFromString(p.hover_cursor);
@@ -463,6 +485,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
setTransparentColor(p.bg_alpha_color().get());
mBgOpaqueImage = p.bg_opaque_image();
mBgAlphaImage = p.bg_alpha_image();
+ mBgOpaqueImageOverlay = p.bg_opaque_image_overlay;
+ mBgAlphaImageOverlay = p.bg_alpha_image_overlay;
}
static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup");
@@ -514,6 +538,8 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
// add children using dimensions from referenced xml for consistent layout
setShape(params.rect);
LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance());
+
+ setXMLFilename(xml_filename);
}
// ask LLUICtrlFactory for filename, since xml_filename might be empty
@@ -528,7 +554,8 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
output_node, output_params, &default_params);
}
- setupParams(params, parent);
+ params.from_xui = true;
+ applyXUILayout(params, parent);
{
LLFastTimer timer(FTM_PANEL_CONSTRUCTION);
initFromParams(params);
@@ -837,14 +864,26 @@ static LLPanel *childGetVisibleTabWithHelp(LLView *parent)
// look through immediate children first for an active tab with help
for (child = parent->getFirstChild(); child; child = parent->findNextSibling(child))
{
+ LLPanel *curTabPanel = NULL;
+
+ // do we have a tab container?
LLTabContainer *tab = dynamic_cast<LLTabContainer *>(child);
if (tab && tab->getVisible())
{
- LLPanel *curTabPanel = tab->getCurrentPanel();
- if (curTabPanel && !curTabPanel->getHelpTopic().empty())
- {
- return curTabPanel;
- }
+ curTabPanel = tab->getCurrentPanel();
+ }
+
+ // do we have an accordion tab?
+ LLAccordionCtrlTab* accordion = dynamic_cast<LLAccordionCtrlTab *>(child);
+ if (accordion && accordion->getDisplayChildren())
+ {
+ curTabPanel = dynamic_cast<LLPanel *>(accordion->getAccordionView());
+ }
+
+ // if we found a valid tab, does it have a help topic?
+ if (curTabPanel && !curTabPanel->getHelpTopic().empty())
+ {
+ return curTabPanel;
}
}
@@ -871,7 +910,45 @@ LLPanel *LLPanel::childGetVisibleTabWithHelp()
return ::childGetVisibleTabWithHelp(this);
}
-void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) )
+static LLPanel *childGetVisiblePanelWithHelp(LLView *parent)
+{
+ LLView *child;
+
+ // look through immediate children first for an active panel with help
+ for (child = parent->getFirstChild(); child; child = parent->findNextSibling(child))
+ {
+ // do we have a panel with a help topic?
+ LLPanel *panel = dynamic_cast<LLPanel *>(child);
+ if (panel && panel->getVisible() && !panel->getHelpTopic().empty())
+ {
+ return panel;
+ }
+ }
+
+ // then try a bit harder and recurse through all children
+ for (child = parent->getFirstChild(); child; child = parent->findNextSibling(child))
+ {
+ if (child->getVisible())
+ {
+ LLPanel* panel = ::childGetVisiblePanelWithHelp(child);
+ if (panel)
+ {
+ return panel;
+ }
+ }
+ }
+
+ // couldn't find any active panels with a help topic string
+ return NULL;
+}
+
+LLPanel *LLPanel::childGetVisiblePanelWithHelp()
+{
+ // find a visible tab with a help topic (to determine help context)
+ return ::childGetVisiblePanelWithHelp(this);
+}
+
+void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) )
{
LLLineEditor* child = findChild<LLLineEditor>(id);
if (child)
@@ -907,3 +984,13 @@ void LLPanel::childSetControlName(const std::string& id, const std::string& cont
view->setControlName(control_name, NULL);
}
}
+
+boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mVisibleSignal)
+ {
+ mVisibleSignal = new commit_signal_t();
+ }
+
+ return mVisibleSignal->connect(cb);
+}
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c213809d68..03e3dc0c0e 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -77,7 +77,9 @@ public:
background_opaque;
Optional<LLUIColor> bg_opaque_color,
- bg_alpha_color;
+ bg_alpha_color,
+ bg_opaque_image_overlay,
+ bg_alpha_image_overlay;
// opaque image is for "panel in foreground" look
Optional<LLUIImage*> bg_opaque_image,
bg_alpha_image;
@@ -109,7 +111,7 @@ protected:
public:
// LLPanel(const std::string& name, const LLRect& rect = LLRect(), BOOL bordered = TRUE);
- /*virtual*/ ~LLPanel() {}
+ /*virtual*/ ~LLPanel();
// LLView interface
/*virtual*/ BOOL isPanel() const;
@@ -137,6 +139,8 @@ public:
const LLColor4& getTransparentColor() const { return mBgAlphaColor; }
LLPointer<LLUIImage> getBackgroundImage() const { return mBgOpaqueImage; }
LLPointer<LLUIImage> getTransparentImage() const { return mBgAlphaImage; }
+ LLColor4 getBackgroundImageOverlay() { return mBgOpaqueImageOverlay; }
+ LLColor4 getTransparentImageOverlay() { return mBgAlphaImageOverlay; }
void setBackgroundVisible( BOOL b ) { mBgVisible = b; }
BOOL isBackgroundVisible() const { return mBgVisible; }
void setBackgroundOpaque(BOOL b) { mBgOpaque = b; }
@@ -214,7 +218,10 @@ public:
// LLTabContainer
void childShowTab(const std::string& id, const std::string& tabname, bool visible = true);
LLPanel *childGetVisibleTab(const std::string& id) const;
+
+ // Find a child with a nonempty Help topic
LLPanel *childGetVisibleTabWithHelp();
+ LLPanel *childGetVisiblePanelWithHelp();
// LLTextBox/LLTextEditor/LLLineEditor
void childSetText(const std::string& id, const LLStringExplicit& text) { childSetValue(id, LLSD(text)); }
@@ -223,7 +230,7 @@ public:
std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); }
// LLLineEditor
- void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) );
+ void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) );
// LLButton
void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
@@ -241,15 +248,16 @@ public:
void setXMLFilename(std::string filename) { mXMLFilename = filename; };
std::string getXMLFilename() { return mXMLFilename; };
+ boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb );
+
protected:
// Override to set not found list
LLButton* getDefaultButton() { return mDefaultBtn; }
LLCallbackMap::map_t mFactoryMap;
CommitCallbackRegistry::ScopedRegistrar mCommitCallbackRegistrar;
EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar;
- VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar;
- commit_signal_t mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD()
+ commit_signal_t* mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD()
std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer
@@ -258,6 +266,8 @@ private:
BOOL mBgOpaque; // use opaque color or image
LLUIColor mBgOpaqueColor;
LLUIColor mBgAlphaColor;
+ LLUIColor mBgOpaqueImageOverlay;
+ LLUIColor mBgAlphaImageOverlay;
LLPointer<LLUIImage> mBgOpaqueImage; // "panel in front" look
LLPointer<LLUIImage> mBgAlphaImage; // "panel in back" look
LLViewBorder* mBorder;
@@ -273,4 +283,10 @@ private:
}; // end class LLPanel
+// Build time optimization, generate once in .cpp file
+#ifndef LLPANEL_CPP
+extern template class LLPanel* LLView::getChild<class LLPanel>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index c8b6e814e1..62ca569e6c 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()
void LLProgressBar::draw()
{
static LLTimer timer;
-
- LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga");
+ F32 alpha = getDrawContext().mAlpha;
- mImageBar->draw(getLocalRect(), mColorBackground.get());
+ LLColor4 image_bar_color = mColorBackground.get();
+ image_bar_color.setAlpha(alpha);
+ mImageBar->draw(getLocalRect(), image_bar_color);
- F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
+ alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
LLColor4 bar_color = mColorBar.get();
bar_color.mV[VALPHA] *= alpha; // modulate alpha
LLRect progress_rect = getLocalRect();
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index f9f0307d17..4087b484aa 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -43,15 +43,43 @@
#include "llui.h"
#include "llfocusmgr.h"
#include "lluictrlfactory.h"
+#include "llsdutil.h"
static LLDefaultChildRegistry::Register<LLRadioGroup> r1("radio_group");
-static RadioGroupRegistry::Register<LLRadioCtrl> register_radio_ctrl("radio_item");
+/*
+ * An invisible view containing multiple mutually exclusive toggling
+ * buttons (usually radio buttons). Automatically handles the mutex
+ * condition by highlighting only one button at a time.
+ */
+class LLRadioCtrl : public LLCheckBoxCtrl
+{
+public:
+ typedef LLRadioGroup::ItemParams Params;
+ /*virtual*/ ~LLRadioCtrl();
+ /*virtual*/ void setValue(const LLSD& value);
+
+ /*virtual*/ BOOL postBuild();
+
+ LLSD getPayload() { return mPayload; }
+ // Ensure label is in an attribute, not the contents
+ static void setupParamsForExport(Params& p, LLView* parent);
+
+protected:
+ LLRadioCtrl(const LLRadioGroup::ItemParams& p);
+ friend class LLUICtrlFactory;
+
+ LLSD mPayload; // stores data that this item represents in the radio group
+};
+static LLWidgetNameRegistry::StaticRegistrar register_radio_item(&typeid(LLRadioGroup::ItemParams), "radio_item");
LLRadioGroup::Params::Params()
-: has_border("draw_border")
+: has_border("draw_border"),
+ items("item")
{
+ addSynonym(items, "radio_item");
+
name = "radio_group";
mouse_opaque = true;
follows.flags = FOLLOWS_LEFT | FOLLOWS_TOP;
@@ -76,6 +104,29 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p)
}
}
+void LLRadioGroup::initFromParams(const Params& p)
+{
+ LLUICtrl::initFromParams(p);
+ for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin();
+ it != p.items().end();
+ ++it)
+ {
+ LLRadioGroup::ItemParams item_params(*it);
+
+ item_params.font.setIfNotProvided(mFont); // apply radio group font by default
+ item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1);
+ item_params.from_xui = p.from_xui;
+ if (p.from_xui)
+ {
+ applyXUILayout(item_params, this);
+ }
+
+ LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this);
+ mRadioButtons.push_back(item);
+ }
+}
+
+
LLRadioGroup::~LLRadioGroup()
{
}
@@ -106,7 +157,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled)
child->setEnabled(enabled);
if (index == mSelectedIndex && enabled == FALSE)
{
- mSelectedIndex = -1;
+ setSelectedIndex(-1);
}
break;
}
@@ -141,7 +192,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled)
BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
{
- if (index < 0 || index >= (S32)mRadioButtons.size())
+ if (index < 0 || (S32)mRadioButtons.size() <= index )
{
return FALSE;
}
@@ -170,7 +221,7 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
if (!from_event)
{
- setControlValue(getSelectedIndex());
+ setControlValue(getValue());
}
return TRUE;
@@ -235,27 +286,6 @@ BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)
return handled;
}
-
-// When adding a child button, we need to ensure that the radio
-// group gets a message when the button is clicked.
-
-/*virtual*/
-bool LLRadioGroup::addChild(LLView* view, S32 tab_group)
-{
- bool res = LLView::addChild(view, tab_group);
- if (res)
- {
- LLRadioCtrl* radio_ctrl = dynamic_cast<LLRadioCtrl*>(view);
- if (radio_ctrl)
- {
- radio_ctrl->setFont(mFont);
- radio_ctrl->setCommitCallback(boost::bind(&LLRadioGroup::onClickButton, this, _1));
- mRadioButtons.push_back(radio_ctrl);
- }
- }
- return res;
-}
-
BOOL LLRadioGroup::handleMouseDown(S32 x, S32 y, MASK mask)
{
// grab focus preemptively, before child button takes mousecapture
@@ -302,13 +332,12 @@ void LLRadioGroup::onClickButton(LLUICtrl* ctrl)
void LLRadioGroup::setValue( const LLSD& value )
{
- std::string value_name = value.asString();
int idx = 0;
for (button_list_t::const_iterator iter = mRadioButtons.begin();
iter != mRadioButtons.end(); ++iter)
{
LLRadioCtrl* radio = *iter;
- if (radio->getName() == value_name)
+ if (radio->getPayload().asString() == value.asString())
{
setSelectedIndex(idx);
idx = -1;
@@ -325,7 +354,7 @@ void LLRadioGroup::setValue( const LLSD& value )
}
else
{
- llwarns << "LLRadioGroup::setValue: value not found: " << value_name << llendl;
+ llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
}
}
}
@@ -337,7 +366,7 @@ LLSD LLRadioGroup::getValue() const
for (button_list_t::const_iterator iter = mRadioButtons.begin();
iter != mRadioButtons.end(); ++iter)
{
- if (idx == index) return LLSD((*iter)->getName());
+ if (idx == index) return LLSD((*iter)->getPayload());
++idx;
}
return LLSD();
@@ -357,11 +386,10 @@ LLUUID LLRadioGroup::getCurrentID() const
BOOL LLRadioGroup::setSelectedByValue(const LLSD& value, BOOL selected)
{
S32 idx = 0;
- std::string value_string = value.asString();
for (button_list_t::const_iterator iter = mRadioButtons.begin();
iter != mRadioButtons.end(); ++iter)
{
- if((*iter)->getName() == value_string)
+ if((*iter)->getPayload().asString() == value.asString())
{
setSelectedIndex(idx);
return TRUE;
@@ -380,11 +408,10 @@ LLSD LLRadioGroup::getSelectedValue()
BOOL LLRadioGroup::isSelected(const LLSD& value) const
{
S32 idx = 0;
- std::string value_string = value.asString();
for (button_list_t::const_iterator iter = mRadioButtons.begin();
iter != mRadioButtons.end(); ++iter)
{
- if((*iter)->getName() == value_string)
+ if((*iter)->getPayload().asString() == value.asString())
{
if (idx == mSelectedIndex)
{
@@ -406,9 +433,21 @@ BOOL LLRadioGroup::operateOnAll(EOperation op)
return FALSE;
}
-LLRadioCtrl::LLRadioCtrl(const LLRadioCtrl::Params& p)
- : LLCheckBoxCtrl(p)
+LLRadioGroup::ItemParams::ItemParams()
+: value("value")
{
+ addSynonym(value, "initial_value");
+}
+
+LLRadioCtrl::LLRadioCtrl(const LLRadioGroup::ItemParams& p)
+: LLCheckBoxCtrl(p),
+ mPayload(p.value)
+{
+ // use name as default "Value" for backwards compatibility
+ if (!p.value.isProvided())
+ {
+ mPayload = p.name();
+ }
}
BOOL LLRadioCtrl::postBuild()
diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h
index 1e9b5115f8..b178bb36ca 100644
--- a/indra/llui/llradiogroup.h
+++ b/indra/llui/llradiogroup.h
@@ -37,35 +37,6 @@
#include "llcheckboxctrl.h"
#include "llctrlselectioninterface.h"
-
-/*
- * An invisible view containing multiple mutually exclusive toggling
- * buttons (usually radio buttons). Automatically handles the mutex
- * condition by highlighting only one button at a time.
- */
-class LLRadioCtrl : public LLCheckBoxCtrl
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLCheckBoxCtrl::Params>
- {};
-
- /*virtual*/ ~LLRadioCtrl();
- /*virtual*/ void setValue(const LLSD& value);
-
- /*virtual*/ BOOL postBuild();
-
- // Ensure label is in an attribute, not the contents
- static void setupParamsForExport(Params& p, LLView* parent);
-
-protected:
- LLRadioCtrl(const Params& p);
- friend class LLUICtrlFactory;
-};
-
-
-struct RadioGroupRegistry : public LLChildRegistry<RadioGroupRegistry>
-{};
-
/*
* An invisible view containing multiple mutually exclusive toggling
* buttons (usually radio buttons). Automatically handles the mutex
@@ -76,25 +47,31 @@ class LLRadioGroup
{
public:
+ struct ItemParams : public LLInitParam::Block<ItemParams, LLCheckBoxCtrl::Params>
+ {
+ Optional<LLSD> value;
+ ItemParams();
+ };
+
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<bool> has_border;
+ Optional<bool> has_border;
+ Multiple<ItemParams, AtLeast<1> > items;
Params();
};
- // my valid children are stored in this registry
- typedef RadioGroupRegistry child_registry_t;
-
protected:
LLRadioGroup(const Params&);
friend class LLUICtrlFactory;
public:
+
+ /*virtual*/ void initFromParams(const Params&);
+
virtual ~LLRadioGroup();
virtual BOOL postBuild();
- virtual bool addChild(LLView* view, S32 tab_group = 0);
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleKeyHere(KEY key, MASK mask);
@@ -134,7 +111,7 @@ public:
private:
const LLFontGL* mFont;
S32 mSelectedIndex;
- typedef std::vector<LLRadioCtrl*> button_list_t;
+ typedef std::vector<class LLRadioCtrl*> button_list_t;
button_list_t mRadioButtons;
BOOL mHasBorder;
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 304ac64f31..0c46edf300 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -143,6 +143,13 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
{
+ // undock floater when user resize it
+ LLFloater* parent = dynamic_cast<LLFloater*>( getParent());
+ if (parent && parent->isDocked())
+ {
+ parent->setDocked( false, false);
+ }
+
// Resize the parent
LLRect orig_rect = mResizingView->getRect();
LLRect scaled_rect = orig_rect;
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 7449c339a0..00214d451c 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -135,6 +135,13 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
LLView* resizing_view = getParent();
if( resizing_view )
{
+ // undock floater when user resize it
+ LLFloater* floater_parent = dynamic_cast<LLFloater*>(getParent());
+ if (floater_parent && floater_parent->isDocked())
+ {
+ floater_parent->setDocked(false, false);
+ }
+
// Resize the parent
LLRect orig_rect = resizing_view->getRect();
LLRect scaled_rect = orig_rect;
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 5e17372fe9..94465a67ce 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -111,7 +111,7 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
LLView::addChild( mBorder );
mInnerRect.set( 0, getRect().getHeight(), getRect().getWidth(), 0 );
- mInnerRect.stretch( -mBorder->getBorderWidth() );
+ mInnerRect.stretch( -getBorderWidth() );
LLRect vertical_scroll_rect = mInnerRect;
vertical_scroll_rect.mLeft = vertical_scroll_rect.mRight - scrollbar_size;
@@ -189,7 +189,7 @@ void LLScrollContainer::reshape(S32 width, S32 height,
LLUICtrl::reshape( width, height, called_from_parent );
mInnerRect = getLocalRect();
- mInnerRect.stretch( -mBorder->getBorderWidth() );
+ mInnerRect.stretch( -getBorderWidth() );
if (mScrolledView)
{
@@ -235,18 +235,37 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask)
BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks )
{
- if(LLUICtrl::handleScrollWheel(x,y,clicks))
+ // Give event to my child views - they may have scroll bars
+ // (Bad UI design, but technically possible.)
+ if (LLUICtrl::handleScrollWheel(x,y,clicks))
return TRUE;
- for( S32 i = 0; i < SCROLLBAR_COUNT; i++ )
- {
- // Note: tries vertical and then horizontal
+ // When the vertical scrollbar is visible, scroll wheel
+ // only affects vertical scrolling. It's confusing to have
+ // scroll wheel perform both vertical and horizontal in a
+ // single container.
+ LLScrollbar* vertical = mScrollbar[VERTICAL];
+ if (vertical->getVisible()
+ && vertical->getEnabled())
+ {
// Pretend the mouse is over the scrollbar
- if( mScrollbar[i]->handleScrollWheel( 0, 0, clicks ) )
+ if (vertical->handleScrollWheel( 0, 0, clicks ) )
{
updateScroll();
- return TRUE;
}
+ // Always eat the event
+ return TRUE;
+ }
+
+ LLScrollbar* horizontal = mScrollbar[HORIZONTAL];
+ // Test enablement and visibility for consistency with
+ // LLView::childrenHandleScrollWheel().
+ if (horizontal->getVisible()
+ && horizontal->getEnabled()
+ && horizontal->handleScrollWheel( 0, 0, clicks ) )
+ {
+ updateScroll();
+ return TRUE;
}
return FALSE;
}
@@ -351,9 +370,9 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height
S32 doc_width = doc_rect.getWidth();
S32 doc_height = doc_rect.getHeight();
- S32 border_width = (mBorder->getVisible() ? 2 * mBorder->getBorderWidth() : 0);
- *visible_width = getRect().getWidth() - border_width;
- *visible_height = getRect().getHeight() - border_width;
+ S32 border_width = getBorderWidth();
+ *visible_width = getRect().getWidth() - 2 * border_width;
+ *visible_height = getRect().getHeight() - 2 * border_width;
*show_v_scrollbar = FALSE;
*show_h_scrollbar = FALSE;
@@ -499,7 +518,7 @@ void LLScrollContainer::updateScroll()
BOOL show_h_scrollbar = FALSE;
calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
- S32 border_width = mBorder->getBorderWidth();
+ S32 border_width = getBorderWidth();
if( show_v_scrollbar )
{
if( doc_rect.mTop < getRect().getHeight() - border_width )
@@ -573,6 +592,9 @@ void LLScrollContainer::updateScroll()
void LLScrollContainer::setBorderVisible(BOOL b)
{
mBorder->setVisible( b );
+ // Recompute inner rect, as border visibility changes it
+ mInnerRect = getLocalRect();
+ mInnerRect.stretch( -getBorderWidth() );
}
LLRect LLScrollContainer::getVisibleContentRect()
@@ -584,15 +606,16 @@ LLRect LLScrollContainer::getVisibleContentRect()
return visible_rect;
}
-LLRect LLScrollContainer::getContentWindowRect() const
+LLRect LLScrollContainer::getContentWindowRect()
{
+ updateScroll();
LLRect scroller_view_rect;
S32 visible_width = 0;
S32 visible_height = 0;
BOOL show_h_scrollbar = FALSE;
BOOL show_v_scrollbar = FALSE;
calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
- S32 border_width = mBorder->getVisible() ? mBorder->getBorderWidth() : 0;
+ S32 border_width = getBorderWidth();
scroller_view_rect.setOriginAndSize(border_width,
show_h_scrollbar ? mScrollbar[HORIZONTAL]->getRect().mTop : border_width,
visible_width,
@@ -645,6 +668,11 @@ void LLScrollContainer::scrollToShowRect(const LLRect& rect, const LLRect& const
// propagate scroll to document
updateScroll();
+
+ // In case we are in accordion tab notify parent to show selected rectangle
+ LLRect screen_rc;
+ localRectToScreen(rect_to_constrain, &screen_rc);
+ notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));
}
void LLScrollContainer::pageUp(S32 overlap)
@@ -673,7 +701,7 @@ void LLScrollContainer::goToBottom()
S32 LLScrollContainer::getBorderWidth() const
{
- if (mBorder)
+ if (mBorder->getVisible())
{
return mBorder->getBorderWidth();
}
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index ac8ffe5258..25dcd071ab 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -96,7 +96,7 @@ public:
void setReserveScrollCorner( BOOL b ) { mReserveScrollCorner = b; }
LLRect getVisibleContentRect();
- LLRect getContentWindowRect() const;
+ LLRect getContentWindowRect();
const LLRect& getScrolledViewRect() const { return mScrolledView ? mScrolledView->getRect() : LLRect::null; }
void pageUp(S32 overlap = 0);
void pageDown(S32 overlap = 0);
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index a7c268758a..3cc92baa8d 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -71,7 +71,8 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p)
-: mWidth(p.width)
+: mWidth(p.width),
+ mToolTip(p.tool_tip)
{}
// virtual
@@ -187,7 +188,7 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
// initialize rounded rect image
if (!mRoundedRectImage)
{
- mRoundedRectImage = LLUI::getUIImage("rounded_square.tga");
+ mRoundedRectImage = LLUI::getUIImage("Rounded_Square");
}
}
@@ -204,13 +205,28 @@ BOOL LLScrollListText::isText() const
return TRUE;
}
+// virtual
+const std::string &LLScrollListText::getToolTip() const
+{
+ // If base class has a tooltip, return that
+ if (! LLScrollListCell::getToolTip().empty())
+ return LLScrollListCell::getToolTip();
+
+ // ...otherwise, return the value itself as the tooltip
+ return mText.getString();
+}
+
+// virtual
BOOL LLScrollListText::needsToolTip() const
{
- // show tooltips for truncated text
+ // If base class has a tooltip, return that
+ if (LLScrollListCell::needsToolTip())
+ return LLScrollListCell::needsToolTip();
+
+ // ...otherwise, show tooltips for truncated text
return mFont->getWidth(mText.getString()) > getWidth();
}
-
//virtual
BOOL LLScrollListText::getVisible() const
{
@@ -337,7 +353,7 @@ LLScrollListCheck::LLScrollListCheck(const LLScrollListCell::Params& p)
{
LLCheckBoxCtrl::Params checkbox_p;
checkbox_p.name("checkbox");
- checkbox_p.rect.left(0).bottom(0).width(p.width).height(p.width);
+ checkbox_p.rect = LLRect(0, p.width, p.width, 0);
checkbox_p.enabled(p.enabled);
checkbox_p.initial_value(p.value());
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index 758623f121..5fecf5aade 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -66,6 +66,7 @@ public:
Optional<void*> userdata;
Optional<LLSD> value;
+ Optional<std::string> tool_tip;
Optional<const LLFontGL*> font;
Optional<LLColor4> font_color;
@@ -80,6 +81,7 @@ public:
enabled("enabled", true),
visible("visible", true),
value("value"),
+ tool_tip("tool_tip", ""),
font("font", LLFontGL::getFontSansSerifSmall()),
font_color("font_color", LLColor4::black),
color("color", LLColor4::white),
@@ -101,11 +103,13 @@ public:
virtual S32 getHeight() const { return 0; }
virtual const LLSD getValue() const;
virtual void setValue(const LLSD& value) { }
+ virtual const std::string &getToolTip() const { return mToolTip; }
+ virtual void setToolTip(const std::string &str) { mToolTip = str; }
virtual BOOL getVisible() const { return TRUE; }
virtual void setWidth(S32 width) { mWidth = width; }
virtual void highlightText(S32 offset, S32 num_chars) {}
virtual BOOL isText() const { return FALSE; }
- virtual BOOL needsToolTip() const { return FALSE; }
+ virtual BOOL needsToolTip() const { return ! mToolTip.empty(); }
virtual void setColor(const LLColor4&) {}
virtual void onCommit() {};
@@ -114,6 +118,7 @@ public:
private:
S32 mWidth;
+ std::string mToolTip;
};
class LLScrollListSpacer : public LLScrollListCell
@@ -143,6 +148,7 @@ public:
/*virtual*/ void setColor(const LLColor4&);
/*virtual*/ BOOL isText() const;
+ /*virtual*/ const std::string & getToolTip() const;
/*virtual*/ BOOL needsToolTip() const;
void setText(const LLStringExplicit& text);
diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp
index 073e14386f..d281341202 100644
--- a/indra/llui/llscrolllistcolumn.cpp
+++ b/indra/llui/llscrolllistcolumn.cpp
@@ -44,9 +44,19 @@
const S32 MIN_COLUMN_WIDTH = 20;
+// defaults for LLScrollColumnHeader param block pulled from widgets/scroll_column_header.xml
+static LLWidgetNameRegistry::StaticRegistrar sRegisterColumnHeaderParams(&typeid(LLScrollColumnHeader::Params), "scroll_column_header");
+
//---------------------------------------------------------------------------
// LLScrollColumnHeader
//---------------------------------------------------------------------------
+LLScrollColumnHeader::Params::Params()
+: column("column")
+{
+ name = "column_header";
+ tab_stop(false);
+}
+
LLScrollColumnHeader::LLScrollColumnHeader(const LLScrollColumnHeader::Params& p)
: LLButton(p), // use combobox params to steal images
diff --git a/indra/llui/llscrolllistcolumn.h b/indra/llui/llscrolllistcolumn.h
index 23318fd7c4..5aef6e8e94 100644
--- a/indra/llui/llscrolllistcolumn.h
+++ b/indra/llui/llscrolllistcolumn.h
@@ -50,20 +50,7 @@ public:
{
Mandatory<LLScrollListColumn*> column;
- Params()
- : column("column")
- {
- name = "column_header";
- image_unselected.name("square_btn_32x128.tga");
- image_selected.name("square_btn_selected_32x128.tga");
- image_disabled.name("square_btn_32x128.tga");
- image_disabled_selected.name("square_btn_selected_32x128.tga");
- image_overlay.name("combobox_arrow.tga");
- image_overlay_alignment("right");
- font_halign = LLFontGL::LEFT;
- tab_stop(false);
- scale_image(true);
- }
+ Params();
};
LLScrollColumnHeader(const Params&);
~LLScrollColumnHeader();
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index a6cd6412e5..ac4811210b 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -142,6 +142,7 @@ LLScrollListCtrl::Params::Params()
contents(""),
scroll_bar_bg_visible("scroll_bar_bg_visible"),
scroll_bar_bg_color("scroll_bar_bg_color")
+ , border("border")
{
name = "scroll_list";
mouse_opaque = true;
@@ -231,10 +232,8 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
if (p.has_border)
{
LLRect border_rect = getLocalRect();
- LLViewBorder::Params params;
- params.name("dig border");
+ LLViewBorder::Params params = p.border;
params.rect(border_rect);
- params.bevel_style(LLViewBorder::BEVEL_IN);
mBorder = LLUICtrlFactory::create<LLViewBorder> (params);
addChild(mBorder);
}
@@ -499,7 +498,7 @@ void LLScrollListCtrl::fitContents(S32 max_width, S32 max_height)
{
S32 height = llmin( getRequiredRect().getHeight(), max_height );
if(mPageLines)
- height = llmin( mPageLines * mLineHeight + (mDisplayColumnHeaders ? mHeadingHeight : 0), height );
+ height = llmin( mPageLines * mLineHeight + 2*mBorderThickness + (mDisplayColumnHeaders ? mHeadingHeight : 0), height );
S32 width = getRect().getWidth();
@@ -1389,6 +1388,8 @@ void LLScrollListCtrl::drawItems()
LLGLSUIDefault gls_ui;
+ F32 alpha = getDrawContext().mAlpha;
+
{
LLLocalClipRect clip(mItemListRect);
@@ -1464,7 +1465,7 @@ void LLScrollListCtrl::drawItems()
bg_color = mBgReadOnlyColor.get();
}
- item->draw(item_rect, fg_color, bg_color, highlight_color, mColumnPadding);
+ item->draw(item_rect, fg_color % alpha, bg_color% alpha, highlight_color % alpha, mColumnPadding);
cur_y -= mLineHeight;
}
@@ -1535,7 +1536,7 @@ LLRect LLScrollListCtrl::getCellRect(S32 row_index, S32 column_index)
S32 rect_bottom = getRowOffsetFromIndex(row_index);
LLScrollListColumn* columnp = getColumn(column_index);
cell_rect.setOriginAndSize(rect_left, rect_bottom,
- rect_left + columnp->getWidth(), mLineHeight);
+ /*rect_left + */columnp->getWidth(), mLineHeight);
return cell_rect;
}
@@ -1565,7 +1566,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
// display tooltip exactly over original cell, in same font
LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(hit_cell->getValue().asString())
+ .message(hit_cell->getToolTip())
.font(LLFontGL::getFontSansSerifSmall())
.pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 6))
.delay_time(0.2f)
@@ -2624,7 +2625,7 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params
LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top);
- LLScrollColumnHeader::Params params;
+ LLScrollColumnHeader::Params params(LLUICtrlFactory::getDefaultParams<LLScrollColumnHeader>());
params.name = "btn_" + name;
params.rect = temp_rect;
params.column = new_column;
@@ -2761,9 +2762,13 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& element, EAddPosition
LLScrollListItem* LLScrollListCtrl::addRow(const LLScrollListItem::Params& item_p, EAddPosition pos)
{
- if (!item_p.validateBlock()) return NULL;
-
LLScrollListItem *new_item = new LLScrollListItem(item_p);
+ return addRow(new_item, item_p, pos);
+}
+
+LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLScrollListItem::Params& item_p, EAddPosition pos)
+{
+ if (!item_p.validateBlock() || !new_item) return NULL;
new_item->setNumColumns(mColumns.size());
// Add any columns we don't already have
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 78bc60db6e..d2d2379328 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -51,6 +51,7 @@
#include "lldate.h"
#include "llscrolllistitem.h"
#include "llscrolllistcolumn.h"
+#include "llviewborder.h"
class LLScrollListCell;
class LLTextBox;
@@ -109,6 +110,8 @@ public:
scroll_bar_bg_color;
Optional<Contents> contents;
+
+ Optional<LLViewBorder::Params> border;
Params();
};
@@ -145,6 +148,7 @@ public:
// "columns" => [ "column" => column name, "value" => value, "type" => type, "font" => font, "font-style" => style ], "id" => uuid
// Creates missing columns automatically.
virtual LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
+ virtual LLScrollListItem* addRow(LLScrollListItem *new_item, const LLScrollListItem::Params& value, EAddPosition pos = ADD_BOTTOM);
virtual LLScrollListItem* addRow(const LLScrollListItem::Params& value, EAddPosition pos = ADD_BOTTOM);
// Simple add element. Takes a single array of:
// [ "value" => value, "font" => font, "font-style" => style ]
diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h
index 15b86cc945..25ce846d90 100644
--- a/indra/llui/llscrolllistitem.h
+++ b/indra/llui/llscrolllistitem.h
@@ -95,7 +95,7 @@ public:
void setUserdata( void* userdata ) { mUserdata = userdata; }
void* getUserdata() const { return mUserdata; }
- LLUUID getUUID() const { return mItemValue.asUUID(); }
+ virtual LLUUID getUUID() const { return mItemValue.asUUID(); }
LLSD getValue() const { return mItemValue; }
void setRect(LLRect rect) { mRectangle = rect; }
diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp
index fad2b7bc99..8075575bab 100644
--- a/indra/llui/llsearcheditor.cpp
+++ b/indra/llui/llsearcheditor.cpp
@@ -60,6 +60,7 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this));
mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params);
+ mSearchEditor->setPassDelete(TRUE);
addChild(mSearchEditor);
if (p.search_button_visible)
@@ -79,10 +80,12 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
if (p.clear_button_visible)
{
// Set up clear button.
- S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor
- LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0);
LLButton::Params clr_btn_params(p.clear_button);
clr_btn_params.name(std::string("clear button"));
+ S32 clr_btn_top = clr_btn_params.rect.bottom + clr_btn_params.rect.height;
+ S32 clr_btn_right = getRect().getWidth() - clr_btn_params.pad_right;
+ S32 clr_btn_left = clr_btn_right - clr_btn_params.rect.width;
+ LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom);
clr_btn_params.rect(clear_btn_rect) ;
clr_btn_params.follows.flags(FOLLOWS_RIGHT|FOLLOWS_TOP);
clr_btn_params.tab_stop(false);
@@ -141,10 +144,19 @@ void LLSearchEditor::clear()
}
}
+//virtual
+void LLSearchEditor::setFocus( BOOL b )
+{
+ if (mSearchEditor)
+ {
+ mSearchEditor->setFocus(b);
+ }
+}
+
void LLSearchEditor::onClearButtonClick(const LLSD& data)
{
setText(LLStringUtil::null);
- mSearchEditor->doDelete(); // force keystroke callback
+ mSearchEditor->onCommit(); // force keystroke callback
}
void LLSearchEditor::handleKeystroke()
diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h
index f395e7e816..714aca9337 100644
--- a/indra/llui/llsearcheditor.h
+++ b/indra/llui/llsearcheditor.h
@@ -50,15 +50,17 @@ class LLSearchEditor : public LLUICtrl
public:
struct Params : public LLInitParam::Block<Params, LLLineEditor::Params>
{
- Optional<LLButton::Params> search_button, clear_button;
- Optional<bool> search_button_visible, clear_button_visible;
+ Optional<LLButton::Params> search_button,
+ clear_button;
+ Optional<bool> search_button_visible,
+ clear_button_visible;
Optional<commit_callback_t> keystroke_callback;
Params()
- : search_button("search_button")
- , search_button_visible("search_button_visible")
- , clear_button("clear_button")
- , clear_button_visible("clear_button_visible")
+ : search_button("search_button"),
+ search_button_visible("search_button_visible"),
+ clear_button("clear_button"),
+ clear_button_visible("clear_button_visible")
{
name = "search_editor";
}
@@ -83,6 +85,7 @@ public:
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
virtual void setLabel( const LLStringExplicit &new_label );
virtual void clear();
+ virtual void setFocus( BOOL b );
void setKeystrokeCallback( commit_callback_t cb ) { mKeystrokeCallback = cb; }
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index f86776384a..a6f729b396 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -47,14 +47,17 @@ static LLDefaultChildRegistry::Register<LLSlider> r1("slider_bar");
// have ambigious template lookup problem
LLSlider::Params::Params()
-: track_color("track_color"),
+: orientation ("orientation", std::string ("horizontal")),
+ track_color("track_color"),
thumb_outline_color("thumb_outline_color"),
thumb_center_color("thumb_center_color"),
thumb_image("thumb_image"),
thumb_image_pressed("thumb_image_pressed"),
thumb_image_disabled("thumb_image_disabled"),
- track_image("track_image"),
- track_highlight_image("track_highlight_image"),
+ track_image_horizontal("track_image_horizontal"),
+ track_image_vertical("track_image_vertical"),
+ track_highlight_horizontal_image("track_highlight_horizontal_image"),
+ track_highlight_vertical_image("track_highlight_vertical_image"),
mouse_down_callback("mouse_down_callback"),
mouse_up_callback("mouse_up_callback")
{
@@ -64,14 +67,19 @@ LLSlider::Params::Params()
LLSlider::LLSlider(const LLSlider::Params& p)
: LLF32UICtrl(p),
mMouseOffset( 0 ),
+ mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL),
mTrackColor(p.track_color()),
mThumbOutlineColor(p.thumb_outline_color()),
mThumbCenterColor(p.thumb_center_color()),
mThumbImage(p.thumb_image),
mThumbImagePressed(p.thumb_image_pressed),
mThumbImageDisabled(p.thumb_image_disabled),
- mTrackImage(p.track_image),
- mTrackHighlightImage(p.track_highlight_image)
+ mTrackImageHorizontal(p.track_image_horizontal),
+ mTrackImageVertical(p.track_image_vertical),
+ mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image),
+ mTrackHighlightVerticalImage(p.track_highlight_vertical_image),
+ mMouseDownSignal(NULL),
+ mMouseUpSignal(NULL)
{
mViewModel->setValue(p.initial_value);
updateThumbRect();
@@ -80,9 +88,19 @@ LLSlider::LLSlider(const LLSlider::Params& p)
setValue(getValueF32());
if (p.mouse_down_callback.isProvided())
- initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+ {
+ setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+ }
if (p.mouse_up_callback.isProvided())
- initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+ {
+ setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+ }
+}
+
+LLSlider::~LLSlider()
+{
+ delete mMouseDownSignal;
+ delete mMouseUpSignal;
}
void LLSlider::setValue(F32 value, BOOL from_event)
@@ -111,14 +129,29 @@ void LLSlider::updateThumbRect()
S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE;
S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE;
- S32 left_edge = (thumb_width / 2);
- S32 right_edge = getRect().getWidth() - (thumb_width / 2);
-
- S32 x = left_edge + S32( t * (right_edge - left_edge) );
- mThumbRect.mLeft = x - (thumb_width / 2);
- mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
- mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
- mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+
+ if ( mOrientation == HORIZONTAL )
+ {
+ S32 left_edge = (thumb_width / 2);
+ S32 right_edge = getRect().getWidth() - (thumb_width / 2);
+
+ S32 x = left_edge + S32( t * (right_edge - left_edge) );
+ mThumbRect.mLeft = x - (thumb_width / 2);
+ mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+ mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
+ mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+ }
+ else
+ {
+ S32 top_edge = (thumb_height / 2);
+ S32 bottom_edge = getRect().getHeight() - (thumb_height / 2);
+
+ S32 y = top_edge + S32( t * (bottom_edge - top_edge) );
+ mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2);
+ mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+ mThumbRect.mBottom = y - (thumb_height / 2);
+ mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+ }
}
@@ -138,18 +171,32 @@ BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask)
{
if( hasMouseCapture() )
{
- S32 thumb_half_width = mThumbImage->getWidth()/2;
- S32 left_edge = thumb_half_width;
- S32 right_edge = getRect().getWidth() - (thumb_half_width);
+ if ( mOrientation == HORIZONTAL )
+ {
+ S32 thumb_half_width = mThumbImage->getWidth()/2;
+ S32 left_edge = thumb_half_width;
+ S32 right_edge = getRect().getWidth() - (thumb_half_width);
+
+ x += mMouseOffset;
+ x = llclamp( x, left_edge, right_edge );
- x += mMouseOffset;
- x = llclamp( x, left_edge, right_edge );
+ F32 t = F32(x - left_edge) / (right_edge - left_edge);
+ setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+ }
+ else // mOrientation == VERTICAL
+ {
+ S32 thumb_half_height = mThumbImage->getHeight()/2;
+ S32 top_edge = thumb_half_height;
+ S32 bottom_edge = getRect().getHeight() - (thumb_half_height);
- F32 t = F32(x - left_edge) / (right_edge - left_edge);
- setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+ y += mMouseOffset;
+ y = llclamp(y, top_edge, bottom_edge);
+ F32 t = F32(y - top_edge) / (bottom_edge - top_edge);
+ setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+ }
getWindow()->setCursor(UI_CURSOR_ARROW);
- lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;
+ lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;
}
else
{
@@ -167,7 +214,8 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask)
{
gFocusMgr.setMouseCapture( NULL );
- mMouseUpSignal( this, getValueF32() );
+ if (mMouseUpSignal)
+ (*mMouseUpSignal)( this, getValueF32() );
handled = TRUE;
make_ui_sound("UISndClickRelease");
@@ -187,7 +235,8 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
{
setFocus(TRUE);
}
- mMouseDownSignal( this, getValueF32() );
+ if (mMouseDownSignal)
+ (*mMouseDownSignal)( this, getValueF32() );
if (MASK_CONTROL & mask) // if CTRL is modifying
{
@@ -198,7 +247,9 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
// Find the offset of the actual mouse location from the center of the thumb.
if (mThumbRect.pointInRect(x,y))
{
- mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x;
+ mMouseOffset = (mOrientation == HORIZONTAL)
+ ? (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x
+ : (mThumbRect.mBottom + mThumbImage->getHeight()/2) - y;
}
else
{
@@ -220,15 +271,12 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
BOOL handled = FALSE;
switch(key)
{
- case KEY_UP:
case KEY_DOWN:
- // eat up and down keys to be consistent
- handled = TRUE;
- break;
case KEY_LEFT:
setValueAndCommit(getValueF32() - getIncrement());
handled = TRUE;
break;
+ case KEY_UP:
case KEY_RIGHT:
setValueAndCommit(getValueF32() + getIncrement());
handled = TRUE;
@@ -239,6 +287,17 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
return handled;
}
+BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ if ( mOrientation == VERTICAL )
+ {
+ F32 new_val = getValueF32() - clicks * getIncrement();
+ setValueAndCommit(new_val);
+ return TRUE;
+ }
+ return LLF32UICtrl::handleScrollWheel(x,y,clicks);
+}
+
void LLSlider::draw()
{
F32 alpha = getDrawContext().mAlpha;
@@ -252,13 +311,36 @@ void LLSlider::draw()
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Track
- LLRect track_rect(mThumbImage->getWidth() / 2,
- getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2),
- getRect().getWidth() - mThumbImage->getWidth() / 2,
- getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) );
- LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
- mTrackImage->draw(track_rect, LLColor4::white % alpha);
- mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
+ LLPointer<LLUIImage>& trackImage = ( mOrientation == HORIZONTAL )
+ ? mTrackImageHorizontal
+ : mTrackImageVertical;
+
+ LLPointer<LLUIImage>& trackHighlightImage = ( mOrientation == HORIZONTAL )
+ ? mTrackHighlightHorizontalImage
+ : mTrackHighlightVerticalImage;
+
+ LLRect track_rect;
+ LLRect highlight_rect;
+
+ if ( mOrientation == HORIZONTAL )
+ {
+ track_rect.set(mThumbImage->getWidth() / 2,
+ getLocalRect().getCenterY() + (trackImage->getHeight() / 2),
+ getRect().getWidth() - mThumbImage->getWidth() / 2,
+ getLocalRect().getCenterY() - (trackImage->getHeight() / 2) );
+ highlight_rect.set(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
+ }
+ else
+ {
+ track_rect.set(getLocalRect().getCenterX() - (trackImage->getWidth() / 2),
+ getRect().getHeight(),
+ getLocalRect().getCenterX() + (trackImage->getWidth() / 2),
+ 0);
+ highlight_rect.set(track_rect.mLeft, track_rect.mTop, track_rect.mRight, track_rect.mBottom);
+ }
+
+ trackImage->draw(track_rect, LLColor4::white % alpha);
+ trackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
// Thumb
if (hasFocus())
@@ -296,3 +378,15 @@ void LLSlider::draw()
LLUICtrl::draw();
}
+
+boost::signals2::connection LLSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+ return mMouseDownSignal->connect(cb);
+}
+
+boost::signals2::connection LLSlider::setMouseUpCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+ return mMouseUpSignal->connect(cb);
+}
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index e2a94e4d8c..45f8f81e40 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -39,8 +39,12 @@
class LLSlider : public LLF32UICtrl
{
public:
+ enum ORIENTATION { HORIZONTAL, VERTICAL };
+
struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
{
+ Optional<std::string> orientation;
+
Optional<LLUIColor> track_color,
thumb_outline_color,
thumb_center_color;
@@ -48,8 +52,10 @@ public:
Optional<LLUIImage*> thumb_image,
thumb_image_pressed,
thumb_image_disabled,
- track_image,
- track_highlight_image;
+ track_image_horizontal,
+ track_image_vertical,
+ track_highlight_horizontal_image,
+ track_highlight_vertical_image;
Optional<CommitCallbackParam> mouse_down_callback,
mouse_up_callback;
@@ -61,6 +67,7 @@ protected:
LLSlider(const Params&);
friend class LLUICtrlFactory;
public:
+ virtual ~LLSlider();
void setValue( F32 value, BOOL from_event = FALSE );
// overrides for LLF32UICtrl methods
virtual void setValue(const LLSD& value ) { setValue((F32)value.asReal(), TRUE); }
@@ -70,13 +77,14 @@ public:
virtual void setMinValue(F32 min_value) { LLF32UICtrl::setMinValue(min_value); updateThumbRect(); }
virtual void setMaxValue(F32 max_value) { LLF32UICtrl::setMaxValue(max_value); updateThumbRect(); }
- boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
- boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); }
+ boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb );
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
virtual void draw();
private:
@@ -90,16 +98,20 @@ private:
LLPointer<LLUIImage> mThumbImage;
LLPointer<LLUIImage> mThumbImagePressed;
LLPointer<LLUIImage> mThumbImageDisabled;
- LLPointer<LLUIImage> mTrackImage;
- LLPointer<LLUIImage> mTrackHighlightImage;
+ LLPointer<LLUIImage> mTrackImageHorizontal;
+ LLPointer<LLUIImage> mTrackImageVertical;
+ LLPointer<LLUIImage> mTrackHighlightHorizontalImage;
+ LLPointer<LLUIImage> mTrackHighlightVerticalImage;
+
+ const ORIENTATION mOrientation;
- LLRect mThumbRect;
+ LLRect mThumbRect;
LLUIColor mTrackColor;
LLUIColor mThumbOutlineColor;
LLUIColor mThumbCenterColor;
- commit_signal_t mMouseDownSignal;
- commit_signal_t mMouseUpSignal;
+ commit_signal_t* mMouseDownSignal;
+ commit_signal_t* mMouseUpSignal;
};
#endif // LL_LLSLIDER_H
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index ed22c0a47f..80ee5d0984 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -122,7 +122,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
slider_p.min_value.setIfNotProvided(p.min_value);
slider_p.max_value.setIfNotProvided(p.max_value);
slider_p.increment.setIfNotProvided(p.increment);
-
+ slider_p.orientation.setIfNotProvided(p.orientation);
+
slider_p.commit_callback.function(&LLSliderCtrl::onSliderCommit);
slider_p.control_name(p.control_name);
slider_p.mouse_down_callback( p.mouse_down_callback );
@@ -140,7 +141,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
line_p.rect.setIfNotProvided(text_rect);
line_p.font.setIfNotProvided(p.font);
line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit);
- line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ line_p.prevalidate_callback(&LLTextValidate::validateFloat);
mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);
mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this ));
@@ -260,7 +261,7 @@ void LLSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata )
if( self->mSlider->getMinValue() <= val && val <= self->mSlider->getMaxValue() )
{
self->setValue( val ); // set the value temporarily so that the callback can retrieve it.
- if( self->mValidateSignal( self, val ) )
+ if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
{
success = TRUE;
}
@@ -294,7 +295,7 @@ void LLSliderCtrl::onSliderCommit( LLUICtrl* ctrl, const LLSD& userdata )
F32 new_val = self->mSlider->getValueF32();
self->mValue = new_val; // set the value temporarily so that the callback can retrieve it.
- if( self->mValidateSignal( self, new_val ) )
+ if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
{
success = TRUE;
}
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index 4a1574d502..c425849782 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -46,6 +46,7 @@ class LLSliderCtrl : public LLF32UICtrl
public:
struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
{
+ Optional<std::string> orientation;
Optional<S32> label_width;
Optional<S32> text_width;
Optional<bool> show_text;
@@ -78,7 +79,8 @@ public:
value_text("value_text"),
slider_label("slider_label"),
mouse_down_callback("mouse_down_callback"),
- mouse_up_callback("mouse_up_callback")
+ mouse_up_callback("mouse_up_callback"),
+ orientation("orientation", std::string ("horizontal"))
{}
};
protected:
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index bedf16a397..491cd7b6f3 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -75,10 +75,8 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);
static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);
static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0);
- S32 top = getRect().getHeight();
- S32 bottom = top - 2 * spinctrl_btn_height;
- S32 centered_top = top;
- S32 centered_bottom = bottom;
+ S32 centered_top = getRect().getHeight();
+ S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;
S32 btn_left = 0;
// reserve space for spinner
S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40));
@@ -105,25 +103,15 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
// Spin buttons
LLButton::Params up_button_params(p.up_button);
- up_button_params.rect
- .left(btn_left)
- .top(top)
- .right(btn_right)
- .height(spinctrl_btn_height);
+ up_button_params.rect = LLRect(btn_left, getRect().getHeight(), btn_right, getRect().getHeight() - spinctrl_btn_height);
up_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
up_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);
addChild(mUpBtn);
- LLRect down_rect( btn_left, top - spinctrl_btn_height, btn_right, bottom );
-
LLButton::Params down_button_params(p.down_button);
- down_button_params.rect
- .left(btn_left)
- .right(btn_right)
- .bottom(bottom)
- .height(spinctrl_btn_height);
+ down_button_params.rect = LLRect(btn_left, getRect().getHeight() - spinctrl_btn_height, btn_right, getRect().getHeight() - 2 * spinctrl_btn_height);
down_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
down_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params);
@@ -139,7 +127,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
}
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
@@ -190,7 +178,7 @@ void LLSpinCtrl::onUpBtn( const LLSD& data )
F32 saved_val = (F32)getValue().asReal();
setValue(val);
- if( !mValidateSignal( this, val ) )
+ if( mValidateSignal && !(*mValidateSignal)( this, val ) )
{
setValue( saved_val );
reportInvalidData();
@@ -224,7 +212,7 @@ void LLSpinCtrl::onDownBtn( const LLSD& data )
F32 saved_val = (F32)getValue().asReal();
setValue(val);
- if( !mValidateSignal( this, val ) )
+ if( mValidateSignal && !(*mValidateSignal)( this, val ) )
{
setValue( saved_val );
reportInvalidData();
@@ -282,13 +270,19 @@ void LLSpinCtrl::clear()
mbHasBeenSet = FALSE;
}
-
+void LLSpinCtrl::updateLabelColor()
+{
+ if( mLabelBox )
+ {
+ mLabelBox->setColor( getEnabled() ? mTextEnabledColor.get() : mTextDisabledColor.get() );
+ }
+}
void LLSpinCtrl::updateEditor()
{
LLLocale locale(LLLocale::USER_LOCALE);
- // Don't display very small negative values as -0.000
+ // Don't display very small negative valu es as -0.000
F32 displayed_value = clamp_precision((F32)getValue().asReal(), mPrecision);
// if( S32( displayed_value * pow( 10, mPrecision ) ) == 0 )
@@ -316,7 +310,7 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
F32 saved_val = getValueF32();
setValue(val);
- if( mValidateSignal( this, val ) )
+ if( !mValidateSignal || (*mValidateSignal)( this, val ) )
{
success = TRUE;
onCommit();
@@ -351,10 +345,7 @@ void LLSpinCtrl::setEnabled(BOOL b)
{
LLView::setEnabled( b );
mEditor->setEnabled( b );
- if( mLabelBox )
- {
- mLabelBox->setColor( b ? mTextEnabledColor.get() : mTextDisabledColor.get() );
- }
+ updateLabelColor();
}
@@ -402,6 +393,7 @@ void LLSpinCtrl::setLabel(const LLStringExplicit& label)
{
llwarns << "Attempting to set label on LLSpinCtrl constructed without one " << getName() << llendl;
}
+ updateLabelColor();
}
void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 0e610b7741..00d6f86f83 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -81,8 +81,8 @@ public:
virtual void setPrecision(S32 precision);
void setLabel(const LLStringExplicit& label);
- void setLabelColor(const LLColor4& c) { mTextEnabledColor = c; }
- void setDisabledLabelColor(const LLColor4& c) { mTextDisabledColor = c; }
+ void setLabelColor(const LLColor4& c) { mTextEnabledColor = c; updateLabelColor(); }
+ void setDisabledLabelColor(const LLColor4& c) { mTextDisabledColor = c; updateLabelColor();}
void setAllowEdit(BOOL allow_edit);
virtual void onTabInto();
@@ -103,6 +103,7 @@ public:
void onDownBtn(const LLSD& data);
private:
+ void updateLabelColor();
void updateEditor();
void reportInvalidData();
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index fd3f88d1f6..b8f93b6a0e 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -49,8 +49,12 @@ LLStyle::Params::Params()
LLStyle::LLStyle(const LLStyle::Params& p)
-: mVisible(p.visible),
+: mItalic(FALSE),
+ mBold(FALSE),
+ mUnderline(FALSE),
+ mVisible(p.visible),
mColor(p.color()),
+ mReadOnlyColor(p.readonly_color()),
mFont(p.font()),
mLink(p.link_href),
mDropShadow(p.drop_shadow),
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index c769964136..2067e8e8be 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -46,7 +46,8 @@ public:
{
Optional<bool> visible;
Optional<LLFontGL::ShadowType> drop_shadow;
- Optional<LLUIColor> color;
+ Optional<LLUIColor> color,
+ readonly_color;
Optional<const LLFontGL*> font;
Optional<LLUIImage*> image;
Optional<std::string> link_href;
@@ -57,10 +58,13 @@ public:
const LLColor4& getColor() const { return mColor; }
void setColor(const LLColor4 &color) { mColor = color; }
+ const LLColor4& getReadOnlyColor() const { return mReadOnlyColor; }
+ void setReadOnlyColor(const LLColor4& color) { mReadOnlyColor = color; }
+
BOOL isVisible() const;
void setVisible(BOOL is_visible);
- LLFontGL::ShadowType getShadowType() { return mDropShadow; }
+ LLFontGL::ShadowType getShadowType() const { return mDropShadow; }
void setFont(const LLFontGL* font);
const LLFontGL* getFont() const;
@@ -81,6 +85,7 @@ public:
return
mVisible == rhs.mVisible
&& mColor == rhs.mColor
+ && mReadOnlyColor == rhs.mReadOnlyColor
&& mFont == rhs.mFont
&& mLink == rhs.mLink
&& mImagep == rhs.mImagep
@@ -104,6 +109,7 @@ protected:
private:
BOOL mVisible;
LLUIColor mColor;
+ LLUIColor mReadOnlyColor;
std::string mFontName;
const LLFontGL* mFont; // cached for performance
std::string mLink;
@@ -111,5 +117,6 @@ private:
};
typedef LLPointer<LLStyle> LLStyleSP;
+typedef LLPointer<const LLStyle> LLStyleConstSP;
#endif // LL_LLSTYLE_H
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index cde4c75518..07e4cc22e0 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -35,7 +35,6 @@
#include "lltabcontainer.h"
#include "llfocusmgr.h"
-#include "llbutton.h"
#include "lllocalcliprect.h"
#include "llrect.h"
#include "llresizehandle.h"
@@ -96,6 +95,91 @@ public:
//----------------------------------------------------------------------------
+//============================================================================
+/*
+ * @file lltabcontainer.cpp
+ * @brief class implements LLButton with LLIconCtrl on it
+ */
+class LLCustomButtonIconCtrl : public LLButton
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ // LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value
+ Optional<S32> icon_ctrl_pad;
+
+ Params():
+ icon_ctrl_pad("icon_ctrl_pad", 1)
+ {}
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLCustomButtonIconCtrl(const Params& p):
+ LLButton(p),
+ mIcon(NULL),
+ mIconAlignment(LLFontGL::HCENTER),
+ mIconCtrlPad(p.icon_ctrl_pad)
+ {}
+
+public:
+
+ void updateLayout()
+ {
+ LLRect button_rect = getRect();
+ LLRect icon_rect = mIcon->getRect();
+
+ S32 icon_size = button_rect.getHeight() - 2*mIconCtrlPad;
+
+ switch(mIconAlignment)
+ {
+ case LLFontGL::LEFT:
+ icon_rect.setLeftTopAndSize(button_rect.mLeft + mIconCtrlPad, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setLeftHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::HCENTER:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - (button_rect.getWidth() + mIconCtrlPad - icon_size)/2, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::RIGHT:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - mIconCtrlPad - icon_size, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ default:
+ break;
+ }
+ mIcon->setRect(icon_rect);
+ }
+
+ void setIcon(LLIconCtrl* icon, LLFontGL::HAlign alignment = LLFontGL::LEFT)
+ {
+ if(icon)
+ {
+ if(mIcon)
+ {
+ removeChild(mIcon);
+ mIcon->die();
+ }
+ mIcon = icon;
+ mIconAlignment = alignment;
+
+ addChild(mIcon);
+ updateLayout();
+ }
+ }
+
+
+private:
+ LLIconCtrl* mIcon;
+ LLFontGL::HAlign mIconAlignment;
+ S32 mIconCtrlPad;
+};
+//============================================================================
+
struct LLPlaceHolderPanel : public LLPanel
{
// create dummy param block to register with "placeholder" nane
@@ -120,12 +204,18 @@ LLTabContainer::Params::Params()
tab_min_width("tab_min_width"),
tab_max_width("tab_max_width"),
tab_height("tab_height"),
+ label_pad_bottom("label_pad_bottom"),
+ label_pad_left("label_pad_left"),
tab_position("tab_position"),
hide_tabs("hide_tabs", false),
tab_padding_right("tab_padding_right"),
first_tab("first_tab"),
middle_tab("middle_tab"),
- last_tab("last_tab")
+ last_tab("last_tab"),
+ use_custom_icon_ctrl("use_custom_icon_ctrl", false),
+ tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
+ use_ellipses("use_ellipses"),
+ font_halign("halign")
{
name(std::string("tab_container"));
mouse_opaque = false;
@@ -145,6 +235,8 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mMinTabWidth(0),
mMaxTabWidth(p.tab_max_width),
mTabHeight(p.tab_height),
+ mLabelPadBottom(p.label_pad_bottom),
+ mLabelPadLeft(p.label_pad_left),
mPrevArrowBtn(NULL),
mNextArrowBtn(NULL),
mIsVertical( p.tab_position == LEFT ),
@@ -155,10 +247,13 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mTotalTabWidth(0),
mTabPosition(p.tab_position),
mFontHalign(p.font_halign),
- mFont(p.font.isProvided() ? p.font() : (mIsVertical ? LLFontGL::getFontSansSerif() : LLFontGL::getFontSansSerifSmall())),
+ mFont(p.font),
mFirstTabParams(p.first_tab),
mMiddleTabParams(p.middle_tab),
- mLastTabParams(p.last_tab)
+ mLastTabParams(p.last_tab),
+ mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
+ mTabIconCtrlPad(p.tab_icon_ctrl_pad),
+ mUseTabEllipses(p.use_ellipses)
{
static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0);
@@ -262,8 +357,6 @@ bool LLTabContainer::addChild(LLView* view, S32 tab_group)
if (panelp)
{
- panelp->setSaveToXML(TRUE);
-
addTabPanel(TabPanelParams().panel(panelp).label(panelp->getLabel()).is_placeholder(dynamic_cast<LLPlaceHolderPanel*>(view) != NULL));
return true;
}
@@ -346,7 +439,13 @@ void LLTabContainer::draw()
}
}
- LLPanel::draw();
+ {
+ LLRect clip_rect = getLocalRect();
+ clip_rect.mLeft+=(LLPANEL_BORDER_WIDTH + 2);
+ clip_rect.mRight-=(LLPANEL_BORDER_WIDTH + 2);
+ LLLocalClipRect clip(clip_rect);
+ LLPanel::draw();
+ }
// if tabs are hidden, don't draw them and leave them in the invisible state
if (!getTabsHidden())
@@ -358,24 +457,6 @@ void LLTabContainer::draw()
tuple->mButton->setVisible( TRUE );
}
- // Draw some of the buttons...
- LLRect clip_rect = getLocalRect();
- if (has_scroll_arrows)
- {
- // ...but clip them.
- if (mIsVertical)
- {
- clip_rect.mBottom = mNextArrowBtn->getRect().mTop + 3*tabcntrv_pad;
- clip_rect.mTop = mPrevArrowBtn->getRect().mBottom - 3*tabcntrv_pad;
- }
- else
- {
- clip_rect.mLeft = mPrevArrowBtn->getRect().mRight;
- clip_rect.mRight = mNextArrowBtn->getRect().mLeft;
- }
- }
- LLLocalClipRect clip(clip_rect);
-
S32 max_scroll_visible = getTabCount() - getMaxScrollPos() + getScrollPos();
S32 idx = 0;
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
@@ -811,6 +892,10 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon
void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
LLPanel* child = panel.panel();
+
+ llassert(child);
+ if (!child) return;
+
const std::string& label = panel.label.isProvided()
? panel.label()
: panel.panel()->getLabel();
@@ -915,10 +1000,15 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
LLTextBox* textbox = NULL;
LLButton* btn = NULL;
+ LLCustomButtonIconCtrl::Params custom_btn_params;
+ {
+ custom_btn_params.icon_ctrl_pad(mTabIconCtrlPad);
+ }
+ LLButton::Params normal_btn_params;
if (placeholder)
{
- btn_rect.translate(0, -LLBUTTON_V_PAD-2);
+ btn_rect.translate(0, -6); // *TODO: make configurable
LLTextBox::Params params;
params.name(trimmed_label);
params.rect(btn_rect);
@@ -927,14 +1017,16 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
textbox = LLUICtrlFactory::create<LLTextBox> (params);
LLButton::Params p;
- p.name("");
+ p.name("placeholder");
btn = LLUICtrlFactory::create<LLButton>(p);
}
else
{
if (mIsVertical)
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
+
p.name(std::string("vert tab button"));
p.rect(btn_rect);
p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
@@ -945,16 +1037,29 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.image_selected(mMiddleTabParams.tab_left_image_selected);
p.scale_image(true);
p.font_halign = mFontHalign;
+ p.pad_bottom( mLabelPadBottom );
p.tab_stop(false);
+ p.label_shadow(false);
if (indent)
{
p.pad_left(indent);
}
- btn = LLUICtrlFactory::create<LLButton>(p);
+
+
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
else
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
p.name(std::string(child->getName()) + " tab");
p.rect(btn_rect);
p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
@@ -965,9 +1070,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.image_unselected(tab_img);
p.image_selected(tab_selected_img);
p.tab_stop(false);
+ p.label_shadow(false);
// Try to squeeze in a bit more text
- p.pad_left(4);
+ p.pad_left( mLabelPadLeft );
p.pad_right(2);
+ p.pad_bottom( mLabelPadBottom );
p.font_halign = mFontHalign;
p.follows.flags = FOLLOWS_LEFT;
p.follows.flags = FOLLOWS_LEFT;
@@ -986,7 +1093,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
}
- btn = LLUICtrlFactory::create<LLButton>(p);
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
}
@@ -1023,12 +1137,10 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
if (textbox)
{
- textbox->setSaveToXML(false);
addChild( textbox, 0 );
}
if (btn)
{
- btn->setSaveToXML(false);
addChild( btn, 0 );
}
}
@@ -1037,6 +1149,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
LLUICtrl::addChild(child, 1);
}
+
+ sendChildToFront(mPrevArrowBtn);
+ sendChildToFront(mNextArrowBtn);
+ sendChildToFront(mJumpPrevArrowBtn);
+ sendChildToFront(mJumpNextArrowBtn);
if( select )
{
@@ -1344,12 +1461,12 @@ BOOL LLTabContainer::selectTab(S32 which)
cbdata = selected_tuple->mTabPanel->getName();
BOOL res = FALSE;
- if( mValidateSignal( this, cbdata ) )
+ if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) )
{
res = setTab(which);
- if (res)
+ if (res && mCommitSignal)
{
- mCommitSignal(this, cbdata);
+ (*mCommitSignal)(this, cbdata);
}
}
@@ -1376,6 +1493,8 @@ BOOL LLTabContainer::setTab(S32 which)
{
LLTabTuple* tuple = *iter;
BOOL is_selected = ( tuple == selected_tuple );
+ tuple->mButton->setUseEllipses(mUseTabEllipses);
+ tuple->mButton->setHAlign(mFontHalign);
tuple->mTabPanel->setVisible( is_selected );
// tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here.
tuple->mButton->setToggleState( is_selected );
@@ -1481,32 +1600,60 @@ void LLTabContainer::setTabPanelFlashing(LLPanel* child, BOOL state )
void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const LLColor4& color)
{
- static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
LLTabTuple* tuple = getTabByPanel(child);
if( tuple )
{
- tuple->mButton->setImageOverlay(image_name, LLFontGL::RIGHT, color);
+ tuple->mButton->setImageOverlay(image_name, LLFontGL::LEFT, color);
+ reshapeTuple(tuple);
+ }
+}
- if (!mIsVertical)
+void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const LLColor4& color)
+{
+ LLTabTuple* tuple = getTabByPanel(child);
+ if( tuple )
+ {
+ tuple->mButton->setImageOverlay(image_id, LLFontGL::LEFT, color);
+ reshapeTuple(tuple);
+ }
+}
+
+void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon)
+{
+ LLTabTuple* tuple = getTabByPanel(child);
+ LLCustomButtonIconCtrl* button;
+
+ if(tuple)
+ {
+ button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton);
+ if(button)
{
- // remove current width from total tab strip width
- mTotalTabWidth -= tuple->mButton->getRect().getWidth();
+ button->setIcon(icon);
+ }
+ }
+}
- S32 image_overlay_width = tuple->mButton->getImageOverlay().notNull() ?
- tuple->mButton->getImageOverlay()->getImage()->getWidth(0) :
- 0;
+void LLTabContainer::reshapeTuple(LLTabTuple* tuple)
+{
+ static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
+
+ if (!mIsVertical)
+ {
+ // remove current width from total tab strip width
+ mTotalTabWidth -= tuple->mButton->getRect().getWidth();
- tuple->mPadding = image_overlay_width;
+ S32 image_overlay_width = tuple->mButton->getImageOverlay().notNull() ?
+ tuple->mButton->getImageOverlay()->getImage()->getWidth(0) : 0;
- tuple->mButton->setRightHPad(6);
- tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),
- tuple->mButton->getRect().getHeight());
- // add back in button width to total tab strip width
- mTotalTabWidth += tuple->mButton->getRect().getWidth();
+ tuple->mPadding = image_overlay_width;
- // tabs have changed size, might need to scroll to see current tab
- updateMaxScrollPos();
- }
+ tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),
+ tuple->mButton->getRect().getHeight());
+ // add back in button width to total tab strip width
+ mTotalTabWidth += tuple->mButton->getRect().getWidth();
+
+ // tabs have changed size, might need to scroll to see current tab
+ updateMaxScrollPos();
}
}
@@ -1569,7 +1716,10 @@ void LLTabContainer::onTabBtn( const LLSD& data, LLPanel* panel )
LLTabTuple* tuple = getTabByPanel(panel);
selectTabPanel( panel );
- tuple->mTabPanel->setFocus(TRUE);
+ if (tuple)
+ {
+ tuple->mTabPanel->setFocus(TRUE);
+ }
}
void LLTabContainer::onNextBtn( const LLSD& data )
@@ -1670,23 +1820,23 @@ void LLTabContainer::initButtons()
S32 btn_top = (getTabPosition() == TOP ) ? getRect().getHeight() - getTopBorderHeight() : tabcntr_arrow_btn_size + 1;
LLRect left_arrow_btn_rect;
- left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+ left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight );
LLRect jump_left_arrow_btn_rect;
- jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+ jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight );
S32 right_pad = tabcntr_arrow_btn_size + LLPANEL_BORDER_WIDTH + 1;
LLRect right_arrow_btn_rect;
right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad - tabcntr_arrow_btn_size,
btn_top + arrow_fudge,
- tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+ tabcntr_arrow_btn_size, mTabHeight );
LLRect jump_right_arrow_btn_rect;
jump_right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad,
btn_top + arrow_fudge,
- tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+ tabcntr_arrow_btn_size, mTabHeight );
LLButton::Params p;
p.name(std::string("Jump Left Arrow"));
@@ -1746,24 +1896,20 @@ void LLTabContainer::initButtons()
}
}
- mPrevArrowBtn->setSaveToXML(false);
mPrevArrowBtn->setTabStop(FALSE);
addChild(mPrevArrowBtn);
- mNextArrowBtn->setSaveToXML(false);
mNextArrowBtn->setTabStop(FALSE);
addChild(mNextArrowBtn);
if (mJumpPrevArrowBtn)
{
- mJumpPrevArrowBtn->setSaveToXML(false);
mJumpPrevArrowBtn->setTabStop(FALSE);
addChild(mJumpPrevArrowBtn);
}
if (mJumpNextArrowBtn)
{
- mJumpNextArrowBtn->setSaveToXML(false);
mJumpNextArrowBtn->setTabStop(FALSE);
addChild(mJumpNextArrowBtn);
}
@@ -1902,6 +2048,3 @@ void LLTabContainer::commitHoveredButton(S32 x, S32 y)
}
}
}
-
-
-
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index be9c6c7d06..50ec2679f6 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -36,6 +36,8 @@
#include "llpanel.h"
#include "lltextbox.h"
#include "llframetimer.h"
+#include "lliconctrl.h"
+#include "llbutton.h"
class LLTabTuple;
@@ -79,7 +81,9 @@ public:
Optional<S32> tab_width,
tab_min_width,
tab_max_width,
- tab_height;
+ tab_height,
+ label_pad_bottom,
+ label_pad_left;
Optional<bool> hide_tabs;
Optional<S32> tab_padding_right;
@@ -88,6 +92,26 @@ public:
middle_tab,
last_tab;
+ /**
+ * Tab label horizontal alignment
+ */
+ Optional<LLFontGL::HAlign> font_halign;
+
+ /**
+ * Tab label ellipses
+ */
+ Optional<bool> use_ellipses;
+
+ /**
+ * Use LLCustomButtonIconCtrl or LLButton in LLTabTuple
+ */
+ Optional<bool> use_custom_icon_ctrl;
+
+ /**
+ * Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
+ */
+ Optional<S32> tab_icon_ctrl_pad;
+
Params();
};
@@ -170,6 +194,8 @@ public:
BOOL getTabPanelFlashing(LLPanel* child);
void setTabPanelFlashing(LLPanel* child, BOOL state);
void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white);
+ void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white);
+ void setTabImage(LLPanel* child, LLIconCtrl* icon);
void setTitle( const std::string& title );
const std::string getPanelTitle(S32 index);
@@ -225,6 +251,7 @@ private:
// updates tab button images given the tuple, tab position and the corresponding params
void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos);
+ void reshapeTuple(LLTabTuple* tuple);
// Variables
@@ -261,6 +288,11 @@ private:
S32 mTotalTabWidth;
S32 mTabHeight;
+ // Padding under the text labels of tab buttons
+ S32 mLabelPadBottom;
+ // Padding to the left of text labels of tab buttons
+ S32 mLabelPadLeft;
+
LLFrameTimer mDragAndDropDelayTimer;
LLFontGL::HAlign mFontHalign;
@@ -269,6 +301,10 @@ private:
TabParams mFirstTabParams;
TabParams mMiddleTabParams;
TabParams mLastTabParams;
+
+ bool mCustomIconCtrlUsed;
+ S32 mTabIconCtrlPad;
+ bool mUseTabEllipses;
};
#endif // LL_TABCONTAINER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2b1d677ffb..851fb966ec 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -60,6 +60,11 @@ LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S3
bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const
{
+ // sort empty spans (e.g. 11-11) after previous non-empty spans (e.g. 5-11)
+ if (a->getEnd() == b->getEnd())
+ {
+ return a->getStart() < b->getStart();
+ }
return a->getEnd() < b->getEnd();
}
@@ -151,6 +156,7 @@ LLTextBase::Params::Params()
read_only("read_only", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
+ clip_partial("clip_partial", true),
line_spacing("line_spacing"),
max_text_length("max_length", 255),
font_shadow("font_shadow"),
@@ -179,7 +185,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mWriteableBgColor(p.bg_writeable_color),
mReadOnlyBgColor(p.bg_readonly_color),
mFocusBgColor(p.bg_focus_color),
- mReflowNeeded(FALSE),
+ mReflowIndex(S32_MAX),
mCursorPos( 0 ),
mScrollNeeded(FALSE),
mDesiredXPixel(-1),
@@ -188,6 +194,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mHAlign(p.font_halign),
mLineSpacingMult(p.line_spacing.multiple),
mLineSpacingPixels(p.line_spacing.pixels),
+ mClipPartial(p.clip_partial && !p.allow_scroll),
mTrackEnd( p.track_end ),
mScrollIndex(-1),
mSelectionStart( 0 ),
@@ -237,7 +244,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
LLTextBase::~LLTextBase()
{
- delete mPopupMenu;
+ // Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder
+
clearSegments();
}
@@ -284,10 +292,13 @@ bool LLTextBase::truncate()
return did_truncate;
}
-LLStyle::Params LLTextBase::getDefaultStyle()
+LLStyle::Params LLTextBase::getDefaultStyleParams()
{
- LLColor4 text_color = ( mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get() );
- return LLStyle::Params().color(text_color).font(mDefaultFont).drop_shadow(mFontShadow);
+ return LLStyle::Params()
+ .color(LLUIColor(&mFgColor))
+ .readonly_color(LLUIColor(&mReadOnlyFgColor))
+ .font(mDefaultFont)
+ .drop_shadow(mFontShadow);
}
void LLTextBase::onValueChange(S32 start, S32 end)
@@ -301,12 +312,11 @@ void LLTextBase::drawSelectionBackground()
// Draw selection even if we don't have keyboard focus for search/replace
if( hasSelection() && !mLineInfoList.empty())
{
- LLWString text = getWText();
std::vector<LLRect> selection_rects;
S32 selection_left = llmin( mSelectionStart, mSelectionEnd );
S32 selection_right = llmax( mSelectionStart, mSelectionEnd );
- LLRect selection_rect = mTextRect;
+ LLRect selection_rect = mVisibleTextRect;
// Skip through the lines we aren't drawing.
LLRect content_display_rect = getVisibleDocumentRect();
@@ -340,7 +350,8 @@ void LLTextBase::drawSelectionBackground()
S32 segment_line_start = segmentp->getStart() + segment_offset;
S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd);
- S32 segment_width, segment_height;
+ S32 segment_width = 0;
+ S32 segment_height = 0;
// if selection after beginning of segment
if(selection_left >= segment_line_start)
@@ -375,18 +386,18 @@ void LLTextBase::drawSelectionBackground()
// Draw the selection box (we're using a box instead of reversing the colors on the selected text).
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- const LLColor4& color = mReadOnly ? mReadOnlyBgColor.get() : mWriteableBgColor.get();
+ const LLColor4& color = mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get();
F32 alpha = hasFocus() ? 0.7f : 0.3f;
alpha *= getDrawContext().mAlpha;
- gGL.color4f( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], alpha );
+ LLColor4 selection_color(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], alpha);
for (std::vector<LLRect>::iterator rect_it = selection_rects.begin();
rect_it != selection_rects.end();
++rect_it)
{
LLRect selection_rect = *rect_it;
- selection_rect.translate(mTextRect.mLeft - content_display_rect.mLeft, mTextRect.mBottom - content_display_rect.mBottom);
- gl_rect_2d(selection_rect);
+ selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom);
+ gl_rect_2d(selection_rect, selection_color);
}
}
}
@@ -399,7 +410,7 @@ void LLTextBase::drawCursor()
&& gFocusMgr.getAppHasFocus()
&& !mReadOnly)
{
- LLWString wtext = getWText();
+ const LLWString &wtext = getWText();
const llwchar* text = wtext.c_str();
LLRect cursor_rect = getLocalRectFromDocIndex(mCursorPos);
@@ -427,7 +438,8 @@ void LLTextBase::drawCursor()
if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode() && !hasSelection())
{
- S32 segment_width, segment_height;
+ S32 segment_width = 0;
+ S32 segment_height = 0;
segmentp->getDimensions(mCursorPos - segmentp->getStart(), 1, segment_width, segment_height);
S32 width = llmax(CURSOR_THICKNESS, segment_width);
cursor_rect.mRight = cursor_rect.mLeft + width;
@@ -484,7 +496,6 @@ void LLTextBase::drawCursor()
void LLTextBase::drawText()
{
- LLWString text = getWText();
const S32 text_len = getLength();
if( text_len <= 0 )
{
@@ -500,7 +511,7 @@ void LLTextBase::drawText()
}
LLRect scrolled_view_rect = getVisibleDocumentRect();
- std::pair<S32, S32> line_range = getVisibleLines();
+ std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
S32 first_line = line_range.first;
S32 last_line = line_range.second;
if (first_line >= last_line)
@@ -520,26 +531,22 @@ void LLTextBase::drawText()
for (S32 cur_line = first_line; cur_line < last_line; cur_line++)
{
+ S32 next_line = cur_line + 1;
line_info& line = mLineInfoList[cur_line];
- if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mTextRect.mBottom)
- {
- break;
- }
-
S32 next_start = -1;
S32 line_end = text_len;
- if ((cur_line + 1) < getLineCount())
+ if (next_line < getLineCount())
{
- next_start = getLineStart(cur_line + 1);
+ next_start = getLineStart(next_line);
line_end = next_start;
}
- LLRect text_rect(line.mRect.mLeft + mTextRect.mLeft - scrolled_view_rect.mLeft,
- line.mRect.mTop - scrolled_view_rect.mBottom + mTextRect.mBottom,
- mDocumentView->getRect().getWidth() - scrolled_view_rect.mLeft,
- line.mRect.mBottom - scrolled_view_rect.mBottom + mTextRect.mBottom);
+ LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
+ line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom,
+ llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft,
+ line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom);
// draw a single line of text
S32 seg_start = line_start;
@@ -558,6 +565,17 @@ void LLTextBase::drawText()
}
S32 clipped_end = llmin( line_end, cur_segment->getEnd() ) - cur_segment->getStart();
+
+ if (mUseEllipses // using ellipses
+ && clipped_end == line_end // last segment on line
+ && next_line == last_line // this is the last visible line
+ && last_line < (S32)mLineInfoList.size()) // and there is more text to display
+ {
+ // more lines of text to go, but we can't fit them
+ // so shrink text rect to force ellipses
+ text_rect.mRight -= 2;
+ }
+
text_rect.mLeft = (S32)(cur_segment->draw(seg_start - cur_segment->getStart(), clipped_end, selection_left, selection_right, text_rect));
seg_start = clipped_end + cur_segment->getStart();
@@ -604,7 +622,8 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
else
{
// create default editable segment to hold new text
- default_segment = new LLNormalTextSegment( new LLStyle(getDefaultStyle()), pos, pos + insert_len, *this);
+ LLStyleConstSP sp(new LLStyle(getDefaultStyleParams()));
+ default_segment = new LLNormalTextSegment( sp, pos, pos + insert_len, *this);
}
// shift remaining segments to right
@@ -637,13 +656,11 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
if ( truncate() )
{
- // The user's not getting everything he's hoping for
- make_ui_sound("UISndBadKeystroke");
insert_len = getLength() - old_len;
}
onValueChange(pos, pos + insert_len);
- needsReflow();
+ needsReflow(pos);
return insert_len;
}
@@ -703,7 +720,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
createDefaultSegment();
onValueChange(pos, pos);
- needsReflow();
+ needsReflow(pos);
return -length; // This will be wrong if someone calls removeStringNoUndo with an excessive length
}
@@ -719,7 +736,7 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc)
getViewModel()->setDisplay(text);
onValueChange(pos, pos + 1);
- needsReflow();
+ needsReflow(pos);
return 1;
}
@@ -730,7 +747,8 @@ void LLTextBase::createDefaultSegment()
// ensures that there is always at least one segment
if (mSegments.empty())
{
- LLTextSegmentPtr default_segment = new LLNormalTextSegment( new LLStyle(getDefaultStyle()), 0, getLength() + 1, *this);
+ LLStyleConstSP sp(new LLStyle(getDefaultStyleParams()));
+ LLTextSegmentPtr default_segment = new LLNormalTextSegment( sp, 0, getLength() + 1, *this);
mSegments.insert(default_segment);
default_segment->linkToDocument(this);
}
@@ -744,15 +762,18 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert)
}
segment_set_t::iterator cur_seg_iter = getSegIterContaining(segment_to_insert->getStart());
+ S32 reflow_start_index = 0;
if (cur_seg_iter == mSegments.end())
{
mSegments.insert(segment_to_insert);
segment_to_insert->linkToDocument(this);
+ reflow_start_index = segment_to_insert->getStart();
}
else
{
LLTextSegmentPtr cur_segmentp = *cur_seg_iter;
+ reflow_start_index = cur_segmentp->getStart();
if (cur_segmentp->getStart() < segment_to_insert->getStart())
{
S32 old_segment_end = cur_segmentp->getEnd();
@@ -760,7 +781,8 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert)
cur_segmentp->setEnd(segment_to_insert->getStart());
// advance to next segment
// insert remainder of old segment
- LLTextSegmentPtr remainder_segment = new LLNormalTextSegment( cur_segmentp->getStyle(), segment_to_insert->getStart(), old_segment_end, *this);
+ LLStyleConstSP sp = cur_segmentp->getStyle();
+ LLTextSegmentPtr remainder_segment = new LLNormalTextSegment( sp, segment_to_insert->getStart(), old_segment_end, *this);
mSegments.insert(cur_seg_iter, remainder_segment);
remainder_segment->linkToDocument(this);
// insert new segment before remainder of old segment
@@ -810,7 +832,7 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert)
}
// layout potentially changed
- needsReflow();
+ needsReflow(reflow_start_index);
}
BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -831,7 +853,7 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
{
// Did we just click on a link?
if (cur_segment->getStyle()
- && cur_segment->getStyle()->isLink())
+ && cur_segment->getStyle()->isLink())
{
// *TODO: send URL here?
mURLClickSignal(this, LLSD() );
@@ -933,13 +955,16 @@ BOOL LLTextBase::handleToolTip(S32 x, S32 y, MASK mask)
void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLUICtrl::reshape( width, height, called_from_parent );
+ if (width != getRect().getWidth() || height != getRect().getHeight())
+ {
+ LLUICtrl::reshape( width, height, called_from_parent );
- // do this first after reshape, because other things depend on
- // up-to-date mTextRect
- updateRects();
-
- needsReflow();
+ // do this first after reshape, because other things depend on
+ // up-to-date mVisibleTextRect
+ updateRects();
+
+ needsReflow();
+ }
}
void LLTextBase::draw()
@@ -948,7 +973,10 @@ void LLTextBase::draw()
reflow();
// then update scroll position, as cursor may have moved
- updateScrollFromCursor();
+ if (!mReadOnly)
+ {
+ updateScrollFromCursor();
+ }
LLRect doc_rect;
if (mScroller)
@@ -970,7 +998,7 @@ void LLTextBase::draw()
: hasFocus()
? mFocusBgColor.get()
: mWriteableBgColor.get();
- gl_rect_2d(mTextRect, bg_color, TRUE);
+ gl_rect_2d(mVisibleTextRect, bg_color, TRUE);
}
// draw document view
@@ -992,6 +1020,22 @@ void LLTextBase::setColor( const LLColor4& c )
mFgColor = c;
}
+//virtual
+void LLTextBase::setReadOnlyColor(const LLColor4 &c)
+{
+ mReadOnlyFgColor = c;
+}
+
+//virtual
+void LLTextBase::handleVisibilityChange( BOOL new_visibility )
+{
+ if(!new_visibility && mPopupMenu)
+ {
+ mPopupMenu->hide();
+ }
+ LLUICtrl::handleVisibilityChange(new_visibility);
+}
+
//virtual
void LLTextBase::setValue(const LLSD& value )
{
@@ -1033,9 +1077,9 @@ S32 LLTextBase::getLeftOffset(S32 width)
case LLFontGL::LEFT:
return mHPad;
case LLFontGL::HCENTER:
- return mHPad + (mTextRect.getWidth() - width - mHPad) / 2;
+ return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2;
case LLFontGL::RIGHT:
- return mTextRect.getWidth() - width;
+ return mVisibleTextRect.getWidth() - width;
default:
return mHPad;
}
@@ -1043,20 +1087,27 @@ S32 LLTextBase::getLeftOffset(S32 width)
static LLFastTimer::DeclareTimer FTM_TEXT_REFLOW ("Text Reflow");
-void LLTextBase::reflow(S32 start_index)
+void LLTextBase::reflow()
{
LLFastTimer ft(FTM_TEXT_REFLOW);
updateSegments();
- while(mReflowNeeded)
+ while(mReflowIndex < S32_MAX)
{
- mReflowNeeded = FALSE;
+ S32 start_index = mReflowIndex;
+ mReflowIndex = S32_MAX;
+
+ // shrink document to minimum size (visible portion of text widget)
+ // to force inlined widgets with follows set to shrink
+ mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false;
LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos);
- bool follow_selection = mTextRect.overlaps(old_cursor_rect); // cursor is visible
+ bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible
+ old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
+
S32 first_line = getFirstVisibleLine();
// if scroll anchor not on first line, update it to first character of first line
@@ -1067,15 +1118,16 @@ void LLTextBase::reflow(S32 start_index)
mScrollIndex = mLineInfoList[first_line].mDocIndexStart;
}
LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex);
+ // subtract off effect of horizontal scrollbar from local position of first char
+ first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
S32 cur_top = 0;
segment_set_t::iterator seg_iter = mSegments.begin();
S32 seg_offset = 0;
S32 line_start_index = 0;
- const S32 text_width = mTextRect.getWidth() - mHPad; // reserve room for margin
- S32 remaining_pixels = text_width;
- LLWString text(getWText());
+ const S32 text_available_width = mVisibleTextRect.getWidth() - mHPad; // reserve room for margin
+ S32 remaining_pixels = text_available_width;
S32 line_count = 0;
// find and erase line info structs starting at start_index and going to end of document
@@ -1085,6 +1137,7 @@ void LLTextBase::reflow(S32 start_index)
line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
line_start_index = iter->mDocIndexStart;
line_count = iter->mLineNum;
+ cur_top = iter->mRect.mTop;
getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
mLineInfoList.erase(iter, mLineInfoList.end());
}
@@ -1105,19 +1158,25 @@ void LLTextBase::reflow(S32 start_index)
S32_MAX);
S32 segment_width, segment_height;
- segment->getDimensions(seg_offset, character_count, segment_width, segment_height);
+ bool force_newline = segment->getDimensions(seg_offset, character_count, segment_width, segment_height);
// grow line height as necessary based on reported height of this segment
line_height = llmax(line_height, segment_height);
remaining_pixels -= segment_width;
+ if (remaining_pixels < 0)
+ {
+ // getNumChars() and getDimensions() should return consistent results
+ remaining_pixels = 0;
+ }
seg_offset += character_count;
S32 last_segment_char_on_line = segment->getStart() + seg_offset;
- S32 text_left = getLeftOffset(text_width - remaining_pixels);
+ S32 text_actual_width = text_available_width - remaining_pixels;
+ S32 text_left = getLeftOffset(text_actual_width);
LLRect line_rect(text_left,
cur_top,
- text_left + (text_width - remaining_pixels),
+ text_left + text_actual_width,
cur_top - line_height);
// if we didn't finish the current segment...
@@ -1132,7 +1191,7 @@ void LLTextBase::reflow(S32 start_index)
line_start_index = segment->getStart() + seg_offset;
cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
- remaining_pixels = text_width;
+ remaining_pixels = text_available_width;
line_height = 0;
}
// ...just consumed last segment..
@@ -1150,9 +1209,25 @@ void LLTextBase::reflow(S32 start_index)
else
{
// subtract pixels used and increment segment
+ if (force_newline)
+ {
+ mLineInfoList.push_back(line_info(
+ line_start_index,
+ last_segment_char_on_line,
+ line_rect,
+ line_count));
+ line_start_index = segment->getStart() + seg_offset;
+ cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
+ line_height = 0;
+ remaining_pixels = text_available_width;
+ }
++seg_iter;
seg_offset = 0;
}
+ if (force_newline)
+ {
+ line_count++;
+ }
}
// calculate visible region for diplaying text
@@ -1170,7 +1245,6 @@ void LLTextBase::reflow(S32 start_index)
// apply scroll constraints after reflowing text
if (!hasMouseCapture() && mScroller)
{
- LLRect visible_content_rect = getVisibleDocumentRect();
if (scrolled_to_bottom && mTrackEnd)
{
// keep bottom of text buffer visible
@@ -1179,31 +1253,26 @@ void LLTextBase::reflow(S32 start_index)
else if (hasSelection() && follow_selection)
{
// keep cursor in same vertical position on screen when selecting text
- LLRect new_cursor_rect_doc = getLocalRectFromDocIndex(mCursorPos);
- new_cursor_rect_doc.translate(visible_content_rect.mLeft, visible_content_rect.mBottom);
+ LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect);
- //llassert_always(getLocalRectFromDocIndex(mCursorPos).mBottom == old_cursor_rect.mBottom);
}
else
{
// keep first line of text visible
- LLRect new_first_char_rect = getLocalRectFromDocIndex(mScrollIndex);
- new_first_char_rect.translate(visible_content_rect.mLeft, visible_content_rect.mBottom);
+ LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex);
mScroller->scrollToShowRect(new_first_char_rect, first_char_rect);
- //llassert_always(getLocalRectFromDocIndex(mScrollIndex).mBottom == first_char_rect.mBottom);
}
}
- }
-
- // reset desired x cursor position
- updateCursorXPos();
+ // reset desired x cursor position
+ updateCursorXPos();
+ }
}
-LLRect LLTextBase::getContentsRect()
+LLRect LLTextBase::getTextBoundingRect()
{
reflow();
- return mContentsRect;
+ return mTextBoundingRect;
}
@@ -1301,13 +1370,11 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
if (fully_visible)
{
- // binary search for line that starts before top of visible buffer and starts before end of visible buffer
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
}
else
{
- // binary search for line that starts before top of visible buffer and starts before end of visible buffer
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
}
@@ -1378,10 +1445,10 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i
}
// Finds the text segment (if any) at the give local screen position
-LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y )
+LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line)
{
// Find the cursor position at the requested local screen position
- S32 offset = getDocIndexFromLocalCoord( x, y, FALSE );
+ S32 offset = getDocIndexFromLocalCoord( x, y, FALSE, hit_past_end_of_line);
segment_set_t::iterator seg_iter = getSegIterContaining(offset);
if (seg_iter != mSegments.end())
{
@@ -1417,6 +1484,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
+ registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
@@ -1431,7 +1499,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
}
}
-void LLTextBase::setText(const LLStringExplicit &utf8str)
+void LLTextBase::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
{
// clear out the existing text and segments
getViewModel()->setDisplay(LLWStringUtil::null);
@@ -1439,18 +1507,18 @@ void LLTextBase::setText(const LLStringExplicit &utf8str)
clearSegments();
// createDefaultSegment();
- startOfDoc();
deselect();
// append the new text (supports Url linking)
std::string text(utf8str);
LLStringUtil::removeCRLF(text);
- appendText(text, false);
+ // appendText modifies mCursorPos...
+ appendText(text, false, input_params);
+ // ...so move cursor to top after appending text
+ startOfDoc();
- //resetDirty();
onValueChange(0, getLength());
- needsReflow();
}
//virtual
@@ -1462,16 +1530,7 @@ std::string LLTextBase::getText() const
void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params)
{
LLStyle::Params style_params(input_params);
- style_params.fillFrom(getDefaultStyle());
-
- if (!style_params.font.isProvided())
- {
- style_params.font = mDefaultFont;
- }
- if (!style_params.drop_shadow.isProvided())
- {
- style_params.drop_shadow = mFontShadow;
- }
+ style_params.fillFrom(getDefaultStyleParams());
S32 part = (S32)LLTextParser::WHOLE;
if(mParseHTML)
@@ -1487,10 +1546,8 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
LLStyle::Params link_params = style_params;
link_params.color = match.getColor();
- // apply font name from requested style_params
- std::string font_name = LLFontGL::nameFromFont(style_params.font());
- link_params.font.name.setIfNotProvided(font_name);
- link_params.font.style = "UNDERLINE";
+ link_params.readonly_color = match.getColor();
+ link_params.font.style("UNDERLINE");
link_params.link_href = match.getUrl();
// output the text before the Url
@@ -1518,25 +1575,35 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
{
LLStyle::Params icon;
icon.image = image;
- // HACK: fix spacing of images and remove the fixed char spacing
- appendAndHighlightText(" ", prepend_newline, part, icon);
+ // Text will be replaced during rendering with the icon,
+ // but string cannot be empty or the segment won't be
+ // added (or drawn).
+ appendAndHighlightText(" ", prepend_newline, part, icon);
prepend_newline = false;
}
}
- // output the styled Url
- appendAndHighlightText(match.getLabel(), prepend_newline, part, link_params);
- prepend_newline = false;
- // set the tooltip for the Url label
- if (! match.getTooltip().empty())
+ // output the styled Url (unless we've been asked to suppress hyperlinking)
+ if (match.isLinkDisabled())
{
- segment_set_t::iterator it = getSegIterContaining(getLength()-1);
- if (it != mSegments.end())
+ appendAndHighlightText(match.getLabel(), prepend_newline, part, style_params);
+ }
+ else
+ {
+ appendAndHighlightText(match.getLabel(), prepend_newline, part, link_params);
+
+ // set the tooltip for the Url label
+ if (! match.getTooltip().empty())
{
- LLTextSegmentPtr segment = *it;
- segment->setToolTip(match.getTooltip());
+ segment_set_t::iterator it = getSegIterContaining(getLength()-1);
+ if (it != mSegments.end())
+ {
+ LLTextSegmentPtr segment = *it;
+ segment->setToolTip(match.getTooltip());
+ }
}
}
+ prepend_newline = false;
// move on to the rest of the text after the Url
if (end < (S32)text.length())
@@ -1559,9 +1626,15 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
}
}
-void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& stylep)
+void LLTextBase::needsReflow(S32 index)
+{
+ lldebugs << "reflow on object " << (void*)this << " index = " << mReflowIndex << ", new index = " << index << llendl;
+ mReflowIndex = llmin(mReflowIndex, index);
+}
+
+void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& style_params)
{
- if (new_text.empty()) return;
+ if (new_text.empty()) return;
// Save old state
S32 selection_start = mSelectionStart;
@@ -1579,7 +1652,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
if (mParseHighlights && highlight)
{
- LLStyle::Params highlight_params = stylep;
+ LLStyle::Params highlight_params(style_params);
LLSD pieces = highlight->parsePartialLineHighlights(new_text, highlight_params.color(), (LLTextParser::EHighlightPosition)highlight_part);
for (S32 i = 0; i < pieces.size(); i++)
@@ -1599,7 +1672,8 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
wide_text = utf8str_to_wstring(pieces[i]["text"].asString());
}
S32 cur_length = getLength();
- LLTextSegmentPtr segmentp = new LLNormalTextSegment(new LLStyle(highlight_params), cur_length, cur_length + wide_text.size(), *this);
+ LLStyleConstSP sp(new LLStyle(highlight_params));
+ LLTextSegmentPtr segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this);
segment_vec_t segments;
segments.push_back(segmentp);
insertStringNoUndo(cur_length, wide_text, &segments);
@@ -1623,13 +1697,12 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
segment_vec_t segments;
S32 segment_start = old_length;
S32 segment_end = old_length + wide_text.size();
- segments.push_back(new LLNormalTextSegment(new LLStyle(stylep), segment_start, segment_end, *this ));
+ LLStyleConstSP sp(new LLStyle(style_params));
+ segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this ));
insertStringNoUndo(getLength(), wide_text, &segments);
}
- needsReflow();
-
// Set the cursor and scroll position
if( selection_start != selection_end )
{
@@ -1669,7 +1742,7 @@ void LLTextBase::replaceUrlLabel(const std::string &url,
for (it = mSegments.begin(); it != mSegments.end(); ++it)
{
LLTextSegment *seg = *it;
- const LLStyleSP style = seg->getStyle();
+ LLStyleConstSP style = seg->getStyle();
// update segment start/end length in case we replaced text earlier
S32 seg_length = seg->getEnd() - seg->getStart();
@@ -1706,7 +1779,7 @@ void LLTextBase::setWText(const LLWString& text)
setText(wstring_to_utf8str(text));
}
-LLWString LLTextBase::getWText() const
+const LLWString& LLTextBase::getWText() const
{
return getViewModel()->getDisplay();
}
@@ -1715,13 +1788,13 @@ LLWString LLTextBase::getWText() const
// will be put to its right. If round is false, the cursor will always be put to the
// character's left.
-S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const
+S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line) const
{
// Figure out which line we're nearest to.
LLRect visible_region = getVisibleDocumentRect();
// binary search for line that starts before local_y
- line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mTextRect.mBottom + visible_region.mBottom, compare_bottom());
+ line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
if (line_iter == mLineInfoList.end())
{
@@ -1729,7 +1802,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
}
S32 pos = getLength();
- S32 start_x = mTextRect.mLeft + line_iter->mRect.mLeft;
+ S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft;
segment_set_t::iterator line_seg_iter;
S32 line_seg_offset;
@@ -1744,7 +1817,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
S32 text_width, text_height;
segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height);
if (local_x < start_x + text_width // cursor to left of right edge of text
- || segmentp->getEnd() >= line_iter->mDocIndexEnd - 1) // or this segment wraps to next line
+ || (hit_past_end_of_line && (segmentp->getEnd() >= line_iter->mDocIndexEnd - 1))) // or this segment wraps to next line
{
// Figure out which character we're nearest to.
S32 offset;
@@ -1840,7 +1913,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
if (mLineInfoList.empty())
{
// return default height rect in upper left
- local_rect = mTextRect;
+ local_rect = mVisibleTextRect;
local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
return local_rect;
}
@@ -1851,8 +1924,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
// compensate for scrolled, inset view of doc
LLRect scrolled_view_rect = getVisibleDocumentRect();
local_rect = doc_rect;
- local_rect.translate(mTextRect.mLeft - scrolled_view_rect.mLeft,
- mTextRect.mBottom - scrolled_view_rect.mBottom);
+ local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
+ mVisibleTextRect.mBottom - scrolled_view_rect.mBottom);
return local_rect;
}
@@ -1887,11 +1960,19 @@ void LLTextBase::endOfLine()
void LLTextBase::startOfDoc()
{
setCursorPos(0);
+ if (mScroller)
+ {
+ mScroller->goToTop();
+ }
}
void LLTextBase::endOfDoc()
{
setCursorPos(getLength());
+ if (mScroller)
+ {
+ mScroller->goToBottom();
+ }
}
void LLTextBase::changePage( S32 delta )
@@ -1952,10 +2033,20 @@ void LLTextBase::changeLine( S32 delta )
LLRect visible_region = getVisibleDocumentRect();
- S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel, mLineInfoList[new_line].mRect.mBottom + mTextRect.mBottom - visible_region.mBottom, TRUE);
+ S32 new_cursor_pos = getDocIndexFromLocalCoord(mDesiredXPixel, mLineInfoList[new_line].mRect.mBottom + mVisibleTextRect.mBottom - visible_region.mBottom, TRUE);
setCursorPos(new_cursor_pos, true);
}
+bool LLTextBase::scrolledToStart()
+{
+ return mScroller->isAtTop();
+}
+
+bool LLTextBase::scrolledToEnd()
+{
+ return mScroller->isAtBottom();
+}
+
bool LLTextBase::setCursor(S32 row, S32 column)
{
@@ -2028,54 +2119,64 @@ void LLTextBase::updateRects()
{
if (mLineInfoList.empty())
{
- mContentsRect = LLRect(0, mVPad, mHPad, 0);
+ mTextBoundingRect = LLRect(0, mVPad, mHPad, 0);
}
else
{
- mContentsRect = mLineInfoList.begin()->mRect;
+ mTextBoundingRect = mLineInfoList.begin()->mRect;
for (line_list_t::const_iterator line_iter = ++mLineInfoList.begin();
line_iter != mLineInfoList.end();
++line_iter)
{
- mContentsRect.unionWith(line_iter->mRect);
+ mTextBoundingRect.unionWith(line_iter->mRect);
}
- mContentsRect.mLeft = 0;
- mContentsRect.mTop += mVPad;
+ mTextBoundingRect.mTop += mVPad;
+ // subtract a pixel off the bottom to deal with rounding errors in measuring font height
+ mTextBoundingRect.mBottom -= 1;
- S32 delta_pos = -mContentsRect.mBottom;
+ S32 delta_pos = -mTextBoundingRect.mBottom;
// move line segments to fit new document rect
for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
{
it->mRect.translate(0, delta_pos);
}
- mContentsRect.translate(0, delta_pos);
+ mTextBoundingRect.translate(0, delta_pos);
}
// update document container dimensions according to text contents
- LLRect doc_rect = mContentsRect;
- // use old mTextRect constraint document to width of viewable region
- doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth();
+ LLRect doc_rect = mTextBoundingRect;
+ // use old mVisibleTextRect constraint document to width of viewable region
+ doc_rect.mLeft = 0;
+
+ // allow horizontal scrolling?
+ // if so, use entire width of text contents
+ // otherwise, stop at width of mVisibleTextRect
+ doc_rect.mRight = mScroller
+ ? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
+ : mVisibleTextRect.getWidth();
mDocumentView->setShape(doc_rect);
- //update mTextRect *after* mDocumentView has been resized
+ //update mVisibleTextRect *after* mDocumentView has been resized
// so that scrollbars are added if document needs to scroll
- // since mTextRect does not include scrollbars
- LLRect old_text_rect = mTextRect;
- mTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
+ // since mVisibleTextRect does not include scrollbars
+ LLRect old_text_rect = mVisibleTextRect;
+ mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
//FIXME: replace border with image?
if (mBorderVisible)
{
- mTextRect.stretch(-1);
+ mVisibleTextRect.stretch(-1);
}
- if (mTextRect != old_text_rect)
+ if (mVisibleTextRect != old_text_rect)
{
needsReflow();
}
- // update document container again, using new mTextRect
- doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth();
+ // update document container again, using new mVisibleTextRect (that has scrollbars enabled as needed)
+ doc_rect.mRight = mScroller
+ ? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
+ : mVisibleTextRect.getWidth();
mDocumentView->setShape(doc_rect);
}
@@ -2108,9 +2209,12 @@ LLRect LLTextBase::getVisibleDocumentRect() const
}
else
{
- // entire document rect when not scrolling
+ // entire document rect is visible when not scrolling
+ // but offset according to height of widget
LLRect doc_rect = mDocumentView->getLocalRect();
- doc_rect.translate(-mDocumentView->getRect().mLeft, -mDocumentView->getRect().mBottom);
+ doc_rect.mLeft -= mDocumentView->getRect().mLeft;
+ // adjust for height of text above widget baseline
+ doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
return doc_rect;
}
}
@@ -2122,7 +2226,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const
LLTextSegment::~LLTextSegment()
{}
-void LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { width = 0; height = 0; }
+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; }
void LLTextSegment::updateLayout(const LLTextBase& editor) {}
@@ -2131,9 +2235,9 @@ bool LLTextSegment::canEdit() const { return false; }
void LLTextSegment::unlinkFromDocument(LLTextBase*) {}
void LLTextSegment::linkToDocument(LLTextBase*) {}
const LLColor4& LLTextSegment::getColor() const { return LLColor4::white; }
-void LLTextSegment::setColor(const LLColor4 &color) {}
-const LLStyleSP LLTextSegment::getStyle() const {static LLStyleSP sp(new LLStyle()); return sp; }
-void LLTextSegment::setStyle(const LLStyleSP &style) {}
+//void LLTextSegment::setColor(const LLColor4 &color) {}
+LLStyleConstSP LLTextSegment::getStyle() const {static LLStyleConstSP sp(new LLStyle()); return sp; }
+void LLTextSegment::setStyle(LLStyleConstSP style) {}
void LLTextSegment::setToken( LLKeywordToken* token ) {}
LLKeywordToken* LLTextSegment::getToken() const { return NULL; }
void LLTextSegment::setToolTip( const std::string &msg ) {}
@@ -2158,13 +2262,19 @@ BOOL LLTextSegment::hasMouseCapture() { return FALSE; }
// LLNormalTextSegment
//
-LLNormalTextSegment::LLNormalTextSegment( const LLStyleSP& style, S32 start, S32 end, LLTextBase& editor )
+LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor )
: LLTextSegment(start, end),
mStyle( style ),
mToken(NULL),
mEditor(editor)
{
mFontHeight = llceil(mStyle->getFont()->getLineHeight());
+
+ LLUIImagePtr image = mStyle->getImage();
+ if (image.notNull())
+ {
+ mImageLoadedConnection = image->addLoadedCallback(boost::bind(&LLTextBase::needsReflow, &mEditor, start));
+ }
}
LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible)
@@ -2177,20 +2287,33 @@ LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32
mFontHeight = llceil(mStyle->getFont()->getLineHeight());
}
+LLNormalTextSegment::~LLNormalTextSegment()
+{
+ mImageLoadedConnection.disconnect();
+}
+
+
F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
{
if( end - start > 0 )
{
if ( mStyle->isImage() && (start >= 0) && (end <= mEnd - mStart))
{
+ // ...for images, only render the image, not the underlying text,
+ // which is only a placeholder space
LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
LLUIImagePtr image = mStyle->getImage();
S32 style_image_height = image->getHeight();
S32 style_image_width = image->getWidth();
- // Center the image vertically
- S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2);
+ // Text is drawn from the top of the draw_rect downward
+ S32 text_center = draw_rect.mTop - (mFontHeight / 2);
+ // Align image to center of text
+ S32 image_bottom = text_center - (style_image_height / 2);
image->draw(draw_rect.mLeft, image_bottom,
- style_image_width, style_image_height);
+ style_image_width, style_image_height, color);
+
+ const S32 IMAGE_HPAD = 3;
+ return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
}
return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect);
@@ -2218,9 +2341,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
const LLFontGL* font = mStyle->getFont();
- LLColor4 color = mStyle->getColor() % alpha;
-
- font = mStyle->getFont();
+ LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha;
if( selection_start > seg_start )
{
@@ -2229,14 +2350,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 end = llmin( selection_start, seg_end );
S32 length = end - start;
font->render(text, start,
- rect.mLeft, rect.mTop,
- color,
- LLFontGL::LEFT, LLFontGL::TOP,
- 0,
- mStyle->getShadowType(),
- length, rect.getWidth(),
- &right_x,
- mEditor.getUseEllipses());
+ rect.mLeft, rect.mTop,
+ color,
+ LLFontGL::LEFT, LLFontGL::TOP,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length, rect.getWidth(),
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
@@ -2248,14 +2369,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 length = end - start;
font->render(text, start,
- rect.mLeft, rect.mTop,
- LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
- LLFontGL::LEFT, LLFontGL::TOP,
- 0,
- LLFontGL::NO_SHADOW,
- length, rect.mRight,
- &right_x,
- mEditor.getUseEllipses());
+ rect.mLeft, rect.mTop,
+ LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
+ LLFontGL::LEFT, LLFontGL::TOP,
+ LLFontGL::NORMAL,
+ LLFontGL::NO_SHADOW,
+ length, rect.getWidth(),
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
if( selection_end < seg_end )
@@ -2265,14 +2386,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 end = seg_end;
S32 length = end - start;
font->render(text, start,
- rect.mLeft, rect.mTop,
- color,
- LLFontGL::LEFT, LLFontGL::TOP,
- 0,
- mStyle->getShadowType(),
- length, rect.mRight,
- &right_x,
- mEditor.getUseEllipses());
+ rect.mLeft, rect.mTop,
+ color,
+ LLFontGL::LEFT, LLFontGL::TOP,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length, rect.getWidth(),
+ &right_x,
+ mEditor.getUseEllipses());
}
return right_x;
}
@@ -2281,8 +2402,12 @@ BOOL LLNormalTextSegment::handleHover(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
+ return TRUE;
+ }
}
return FALSE;
}
@@ -2291,8 +2416,12 @@ BOOL LLNormalTextSegment::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF());
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF());
+ return TRUE;
+ }
}
return FALSE;
}
@@ -2301,8 +2430,12 @@ BOOL LLNormalTextSegment::handleMouseDown(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- // eat mouse down event on hyperlinks, so we get the mouse up
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ // eat mouse down event on hyperlinks, so we get the mouse up
+ return TRUE;
+ }
}
return FALSE;
@@ -2312,8 +2445,12 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- LLUrlAction::clickAction(getStyle()->getLinkHREF());
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ LLUrlAction::clickAction(getStyle()->getLinkHREF());
+ return TRUE;
+ }
}
return FALSE;
@@ -2350,17 +2487,42 @@ void LLNormalTextSegment::setToolTip(const std::string& tooltip)
mTooltip = tooltip;
}
-void LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
- LLWString text = mEditor.getWText();
+ height = 0;
+ width = 0;
+ bool force_newline = false;
+ if (num_chars > 0)
+ {
+ height = mFontHeight;
+ const LLWString &text = mEditor.getWText();
+ // if last character is a newline, then return true, forcing line break
+ llwchar last_char = text[mStart + first_char + num_chars - 1];
+ if (last_char == '\n')
+ {
+ force_newline = true;
+ // don't count newline in font width
+ width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars - 1);
+ }
+ else
+ {
+ width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
+ }
+ }
+
+ LLUIImagePtr image = mStyle->getImage();
+ if( image.notNull())
+ {
+ width += image->getWidth();
+ height = llmax(height, image->getHeight());
+ }
- height = mFontHeight;
- width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
+ return force_newline;
}
S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const
{
- LLWString text = mEditor.getWText();
+ const LLWString &text = mEditor.getWText();
return mStyle->getFont()->charFromPixelOffset(text.c_str(), mStart + start_offset,
(F32)segment_local_x_coord,
F32_MAX,
@@ -2370,7 +2532,13 @@ S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset,
S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
{
- LLWString text = mEditor.getWText();
+ const LLWString &text = mEditor.getWText();
+
+ LLUIImagePtr image = mStyle->getImage();
+ if( image.notNull())
+ {
+ num_pixels = llmax(0, num_pixels - image->getWidth());
+ }
// search for newline and if found, truncate there
S32 last_char = mStart + segment_offset;
@@ -2385,10 +2553,15 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
// set max characters to length of segment, or to first newline
max_chars = llmin(max_chars, last_char - (mStart + segment_offset));
+ // 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::WORD_BOUNDARY_IF_POSSIBLE
+ : LLFontGL::ONLY_WORD_BOUNDARIES;
S32 num_chars = mStyle->getFont()->maxDrawableChars(text.c_str() + segment_offset + mStart,
(F32)num_pixels,
max_chars,
- TRUE);
+ word_wrap_style);
if (num_chars == 0
&& line_offset == 0
@@ -2402,8 +2575,9 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
// but not both
S32 last_char_in_run = mStart + segment_offset + num_chars;
// check length first to avoid indexing off end of string
- if (last_char_in_run >= mEditor.getLength()
- || text[last_char_in_run] == '\n')
+ if (last_char_in_run < mEnd
+ && (last_char_in_run >= mEditor.getLength()
+ || text[last_char_in_run] == '\n'))
{
num_chars++;
}
@@ -2442,7 +2616,7 @@ LLInlineViewSegment::~LLInlineViewSegment()
mView->die();
}
-void LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
if (first_char == 0 && num_chars == 0)
{
@@ -2456,6 +2630,8 @@ void LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
width = mLeftPad + mRightPad + mView->getRect().getWidth();
height = mBottomPad + mTopPad + mView->getRect().getHeight();
}
+
+ return false;
}
S32 LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 14fd786127..5b24c63557 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -41,12 +41,14 @@
#include "llpanel.h"
#include <string>
+#include <vector>
#include <set>
#include <boost/signals2.hpp>
class LLContextMenu;
class LLTextSegment;
+class LLNormalTextSegment;
typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
@@ -60,6 +62,9 @@ class LLTextBase
protected LLEditMenuHandler
{
public:
+ friend class LLTextSegment;
+ friend class LLNormalTextSegment;
+
struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams>
{
Alternative<F32> multiple;
@@ -84,11 +89,13 @@ public:
wrap,
use_ellipses,
allow_html,
- parse_highlights;
+ parse_highlights,
+ clip_partial;
Optional<S32> v_pad,
h_pad;
+
Optional<LineSpacingParams>
line_spacing;
@@ -118,6 +125,9 @@ public:
// LLUICtrl interface
/*virtual*/ BOOL acceptsTextInput() const { return !mReadOnly; }
/*virtual*/ void setColor( const LLColor4& c );
+ virtual void setReadOnlyColor(const LLColor4 &c);
+ virtual void handleVisibilityChange( BOOL new_visibility );
+
/*virtual*/ void setValue(const LLSD& value );
/*virtual*/ LLTextViewModel* getViewModel() const;
@@ -132,17 +142,19 @@ public:
// TODO: move into LLTextSegment?
void createUrlContextMenu(S32 x, S32 y, const std::string &url); // create a popup context menu for the given Url
-
// Text accessors
// TODO: add optional style parameter
- virtual void setText(const LLStringExplicit &utf8str); // uses default style
+ virtual void setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
virtual std::string getText() const;
+ void setMaxTextLength(S32 length) { mMaxTextByteLength = length; }
// wide-char versions
void setWText(const LLWString& text);
- LLWString getWText() const;
+ const LLWString& getWText() const;
void appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params = LLStyle::Params());
+ // force reflow of text
+ void needsReflow(S32 index = 0);
S32 getLength() const { return getWText().length(); }
S32 getLineCount() const { return mLineInfoList.size(); }
@@ -150,12 +162,14 @@ public:
void addDocumentChild(LLView* view);
void removeDocumentChild(LLView* view);
const LLView* getDocumentView() const { return mDocumentView; }
- LLRect getTextRect() { return mTextRect; }
- LLRect getContentsRect();
+ LLRect getVisibleTextRect() { return mVisibleTextRect; }
+ LLRect getTextBoundingRect();
LLRect getVisibleDocumentRect() const;
+ S32 getVPad() { return mVPad; }
+ S32 getHPad() { return mHPad; }
- S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
+ S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
LLRect getLocalRectFromDocIndex(S32 pos) const;
LLRect getDocRectFromDocIndex(S32 pos) const;
@@ -172,6 +186,9 @@ public:
void changePage( S32 delta );
void changeLine( S32 delta );
+ bool scrolledToStart();
+ bool scrolledToEnd();
+
const LLFontGL* getDefaultFont() const { return mDefaultFont; }
public:
@@ -245,7 +262,6 @@ protected:
LLTextBase(const Params &p);
virtual ~LLTextBase();
void initFromParams(const Params& p);
- LLStyle::Params getDefaultStyle();
virtual void onValueChange(S32 start, S32 end);
// draw methods
@@ -263,14 +279,15 @@ protected:
// manage segments
void getSegmentAndOffset( S32 startpos, segment_set_t::const_iterator* seg_iter, S32* offsetp ) const;
void getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg_iter, S32* offsetp );
- LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y );
+ LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line = true);
segment_set_t::iterator getSegIterContaining(S32 index);
segment_set_t::const_iterator getSegIterContaining(S32 index) const;
void clearSegments();
void createDefaultSegment();
virtual void updateSegments();
void insertSegment(LLTextSegmentPtr segment_to_insert);
-
+ LLStyle::Params getDefaultStyleParams();
+
// manage lines
S32 getLineStart( S32 line ) const;
S32 getLineEnd( S32 line ) const;
@@ -279,7 +296,7 @@ protected:
S32 getFirstVisibleLine() const;
std::pair<S32, S32> getVisibleLines(bool fully_visible = false);
S32 getLeftOffset(S32 width);
- void reflow(S32 start_index = 0);
+ void reflow();
// cursor
void updateCursorXPos();
@@ -295,7 +312,6 @@ protected:
// misc
void updateRects();
- void needsReflow() { mReflowNeeded = TRUE; }
void needsScroll() { mScrollNeeded = TRUE; }
void replaceUrlLabel(const std::string &url, const std::string &label);
@@ -303,8 +319,8 @@ protected:
// text segmentation and flow
segment_set_t mSegments;
line_list_t mLineInfoList;
- LLRect mTextRect; // The rect in which text is drawn. Excludes borders.
- LLRect mContentsRect;
+ LLRect mVisibleTextRect; // The rect in which text is drawn. Excludes borders.
+ LLRect mTextBoundingRect;
// colors
LLUIColor mCursorColor;
@@ -341,6 +357,7 @@ protected:
bool mTrackEnd; // if true, keeps scroll position at end of document during resize
bool mReadOnly;
bool mBGVisible; // render background?
+ bool mClipPartial; // false if we show lines that are partially inside bounding rect
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
// support widgets
@@ -349,7 +366,7 @@ protected:
class LLScrollContainer* mScroller;
// transient state
- bool mReflowNeeded; // need to reflow text because of change to text contents or display region
+ S32 mReflowIndex; // index at which to start reflow. S32_MAX indicates no reflow needed.
bool mScrollNeeded; // need to change scroll region because of change to cursor position
S32 mScrollIndex; // index of first character to keep visible in scroll region
@@ -367,7 +384,7 @@ public:
LLTextSegment(S32 start, S32 end) : mStart(start), mEnd(end){};
virtual ~LLTextSegment();
- virtual void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
+ 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 void updateLayout(const class LLTextBase& editor);
@@ -377,9 +394,9 @@ public:
virtual void linkToDocument(class LLTextBase* editor);
virtual const LLColor4& getColor() const;
- virtual void setColor(const LLColor4 &color);
- virtual const LLStyleSP getStyle() const;
- virtual void setStyle(const LLStyleSP &style);
+ //virtual void setColor(const LLColor4 &color);
+ virtual LLStyleConstSP getStyle() const;
+ virtual void setStyle(LLStyleConstSP style);
virtual void setToken( LLKeywordToken* token );
virtual LLKeywordToken* getToken() const;
virtual void setToolTip(const std::string& tooltip);
@@ -415,18 +432,18 @@ protected:
class LLNormalTextSegment : public LLTextSegment
{
public:
- LLNormalTextSegment( const LLStyleSP& style, S32 start, S32 end, LLTextBase& editor );
+ LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor );
LLNormalTextSegment( const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE);
+ ~LLNormalTextSegment();
- /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
+ /*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*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect);
/*virtual*/ bool canEdit() const { return true; }
/*virtual*/ const LLColor4& getColor() const { return mStyle->getColor(); }
- /*virtual*/ void setColor(const LLColor4 &color) { mStyle->setColor(color); }
- /*virtual*/ const LLStyleSP getStyle() const { return mStyle; }
- /*virtual*/ void setStyle(const LLStyleSP &style) { mStyle = style; }
+ /*virtual*/ LLStyleConstSP getStyle() const { return mStyle; }
+ /*virtual*/ void setStyle(LLStyleConstSP style) { mStyle = style; }
/*virtual*/ void setToken( LLKeywordToken* token ) { mToken = token; }
/*virtual*/ LLKeywordToken* getToken() const { return mToken; }
/*virtual*/ BOOL getToolTip( std::string& msg ) const;
@@ -444,10 +461,11 @@ protected:
protected:
class LLTextBase& mEditor;
- LLStyleSP mStyle;
+ LLStyleConstSP mStyle;
S32 mFontHeight;
LLKeywordToken* mToken;
std::string mTooltip;
+ boost::signals2::connection mImageLoadedConnection;
};
class LLIndexSegment : public LLTextSegment
@@ -471,7 +489,7 @@ public:
LLInlineViewSegment(const Params& p, S32 start, S32 end);
~LLInlineViewSegment();
- /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
+ /*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*/ void updateLayout(const class LLTextBase& editor);
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect);
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 20bceb4675..a1f5b5726b 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -31,7 +31,10 @@
*/
#include "linden_common.h"
+
+#define LLTEXTBOX_CPP
#include "lltextbox.h"
+
#include "lluictrlfactory.h"
#include "llfocusmgr.h"
#include "llwindow.h"
@@ -40,11 +43,18 @@
static LLDefaultChildRegistry::Register<LLTextBox> r("text");
+// Compiler optimization, generate extern template
+template class LLTextBox* LLView::getChild<class LLTextBox>(
+ const std::string& name, BOOL recurse) const;
+
LLTextBox::LLTextBox(const LLTextBox::Params& p)
: LLTextBase(p),
mClickedCallback(NULL)
{}
+LLTextBox::~LLTextBox()
+{}
+
BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLTextBase::handleMouseDown(x, y, mask);
@@ -97,22 +107,45 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
return handled;
}
-void LLTextBox::setText(const LLStringExplicit& text)
+BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLTextBase::handleHover(x, y, mask);
+ if (!handled && mClickedCallback)
+ {
+ // Clickable text boxes change the cursor to a hand
+ LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
+ return TRUE;
+ }
+ return handled;
+}
+
+void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params )
{
// does string argument insertion
mText.assign(text);
- LLTextBase::setText(mText.getString());
+ LLTextBase::setText(mText.getString(), input_params );
+}
+
+void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ )
+{
+ mClickedCallback = boost::bind(cb, userdata);
}
S32 LLTextBox::getTextPixelWidth()
{
- return getContentsRect().getWidth();
+ return getTextBoundingRect().getWidth();
}
S32 LLTextBox::getTextPixelHeight()
{
- return getContentsRect().getHeight();
+ return getTextBoundingRect().getHeight();
+}
+
+
+LLSD LLTextBox::getValue() const
+{
+ return LLSD(getText());
}
BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text )
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index da0bcbe972..3a045534d3 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -33,8 +33,6 @@
#ifndef LL_LLTEXTBOX_H
#define LL_LLTEXTBOX_H
-#include "v4color.h"
-#include "llstring.h"
#include "lluistring.h"
#include "lltextbase.h"
@@ -54,28 +52,25 @@ protected:
friend class LLUICtrlFactory;
public:
- virtual ~LLTextBox() {}
+ virtual ~LLTextBox();
- virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ /*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);
- /*virtual*/ void setText( const LLStringExplicit& text );
+ /*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() );
void setRightAlign() { mHAlign = LLFontGL::RIGHT; }
void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; }
- void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ){ mClickedCallback = boost::bind(cb, userdata); } // mouse down and up within button
-
- //const LLFontGL* getFont() const { return mDefaultFont; }
- //void setFont(const LLFontGL* font) { mDefaultFont = font; }
+ void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL );
void reshapeToFitText();
- //const std::string& getText() const { return mText.getString(); }
S32 getTextPixelWidth();
S32 getTextPixelHeight();
- virtual LLSD getValue() const { return LLSD(getText()); }
- virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
+ /*virtual*/ LLSD getValue() const;
+ /*virtual*/ BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
protected:
void onUrlLabelUpdated(const std::string &url, const std::string &label);
@@ -84,4 +79,10 @@ protected:
callback_t mClickedCallback;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLTEXTBOX_CPP
+extern template class LLTextBox* LLView::getChild<class LLTextBox>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index f0238dba49..7d230f7d42 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1,6 +1,5 @@
/**
* @file lltexteditor.cpp
- * @brief LLTextEditor base class
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -34,6 +33,7 @@
#include "linden_common.h"
+#define LLTEXTEDITOR_CPP
#include "lltexteditor.h"
#include "llfontfreetype.h" // for LLFontFreetype::FIRST_CHAR
@@ -73,6 +73,10 @@
//
static LLDefaultChildRegistry::Register<LLTextEditor> r("simple_text_editor");
+// Compiler optimization, generate extern template
+template class LLTextEditor* LLView::getChild<class LLTextEditor>(
+ const std::string& name, BOOL recurse) const;
+
//
// Constants
//
@@ -233,13 +237,17 @@ private:
///////////////////////////////////////////////////////////////////
LLTextEditor::Params::Params()
: default_text("default_text"),
+ prevalidate_callback("prevalidate_callback"),
embedded_items("embedded_items", false),
ignore_tab("ignore_tab", true),
handle_edit_keys_directly("handle_edit_keys_directly", false),
show_line_numbers("show_line_numbers", false),
default_color("default_color"),
- commit_on_focus_lost("commit_on_focus_lost", false)
-{}
+ commit_on_focus_lost("commit_on_focus_lost", false),
+ show_context_menu("show_context_menu")
+{
+ addSynonym(prevalidate_callback, "text_type");
+}
LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
LLTextBase(p),
@@ -254,7 +262,9 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mMouseDownX(0),
mMouseDownY(0),
mTabsToNextField(p.ignore_tab),
- mContextMenu(NULL)
+ mPrevalidateFunc(p.prevalidate_callback()),
+ mContextMenu(NULL),
+ mShowContextMenu(p.show_context_menu)
{
mDefaultFont = p.font;
@@ -304,19 +314,31 @@ LLTextEditor::~LLTextEditor()
// Scrollbar is deleted by LLView
std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer());
- delete mContextMenu;
+ // context menu is owned by menu holder, not us
+ //delete mContextMenu;
}
////////////////////////////////////////////////////////////
// LLTextEditor
// Public methods
-void LLTextEditor::setText(const LLStringExplicit &utf8str)
+void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
{
+ // validate incoming text if necessary
+ if (mPrevalidateFunc)
+ {
+ LLWString test_text = utf8str_to_wstring(utf8str);
+ if (!mPrevalidateFunc(test_text))
+ {
+ // not valid text, nothing to do
+ return;
+ }
+ }
+
blockUndo();
deselect();
- LLTextBase::setText(utf8str);
+ LLTextBase::setText(utf8str, input_params);
resetDirty();
}
@@ -652,6 +674,13 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
+ // set focus first, in case click callbacks want to change it
+ // RN: do we really need to have a tab stop?
+ if (hasTabStop())
+ {
+ setFocus( TRUE );
+ }
+
// Let scrollbar have first dibs
handled = LLTextBase::handleMouseDown(x, y, mask);
@@ -694,12 +723,6 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
handled = TRUE;
}
- if (hasTabStop())
- {
- setFocus( TRUE );
- handled = TRUE;
- }
-
// Delay cursor flashing
resetCursorBlink();
@@ -708,29 +731,35 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- BOOL handled = LLTextBase::handleRightMouseDown(x, y, mask);
- if (!handled && hasTabStop())
+ if (hasTabStop())
{
- setFocus( TRUE );
- showContextMenu(x, y);
- handled = TRUE;
+ setFocus(TRUE);
}
- return handled;
+ if (!LLTextBase::handleRightMouseDown(x, y, mask))
+ {
+ if(getShowContextMenu())
+ {
+ showContextMenu(x, y);
+ }
+ }
+ return TRUE;
}
BOOL LLTextEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
- BOOL handled = FALSE;
- handled = LLTextBase::handleMouseDown(x, y, mask);
+ if (hasTabStop())
+ {
+ setFocus(TRUE);
+ }
- if (!handled)
+ if (!LLTextBase::handleMouseDown(x, y, mask))
{
- setFocus( TRUE );
if( canPastePrimary() )
{
setCursorAtLocalPos( x, y, true );
+ // does not rely on focus being set
pastePrimary();
}
}
@@ -746,10 +775,12 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
{
if( mIsSelecting )
{
- mScroller->autoScroll(x, y);
-
- S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
- S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
+ if(mScroller)
+ {
+ mScroller->autoScroll(x, y);
+ }
+ S32 clamped_x = llclamp(x, mVisibleTextRect.mLeft, mVisibleTextRect.mRight);
+ S32 clamped_y = llclamp(y, mVisibleTextRect.mBottom, mVisibleTextRect.mTop);
setCursorAtLocalPos( clamped_x, clamped_y, true );
mSelectionEnd = mCursorPos;
}
@@ -795,9 +826,12 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
{
if( mIsSelecting )
{
- mScroller->autoScroll(x, y);
- S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
- S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
+ if(mScroller)
+ {
+ mScroller->autoScroll(x, y);
+ }
+ S32 clamped_x = llclamp(x, mVisibleTextRect.mLeft, mVisibleTextRect.mRight);
+ S32 clamped_y = llclamp(y, mVisibleTextRect.mBottom, mVisibleTextRect.mTop);
setCursorAtLocalPos( clamped_x, clamped_y, true );
endSelection();
}
@@ -892,6 +926,21 @@ S32 LLTextEditor::execute( TextCmd* cmd )
// Push the new command is now on the top (front) of the undo stack.
mUndoStack.push_front(cmd);
mLastCmd = cmd;
+
+ bool need_to_rollback = mPrevalidateFunc
+ && !mPrevalidateFunc(getViewModel()->getDisplay());
+ if (need_to_rollback)
+ {
+ // get rid of this last command and clean up undo stack
+ undo();
+
+ // remove any evidence of this command from redo history
+ mUndoStack.pop_front();
+ delete cmd;
+
+ // failure, nothing changed
+ delta = 0;
+ }
}
else
{
@@ -1015,7 +1064,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc)
if (mLastCmd && mLastCmd->canExtend(pos))
{
S32 delta = 0;
+ if (mPrevalidateFunc)
+ {
+ // get a copy of current text contents
+ LLWString test_string(getViewModel()->getDisplay());
+
+ // modify text contents as if this addChar succeeded
+ llassert(pos <= (S32)test_string.size());
+ test_string.insert(pos, 1, wc);
+ if (!mPrevalidateFunc( test_string))
+ {
+ return 0;
+ }
+ }
mLastCmd->extendAndExecute(this, pos, wc, &delta);
+
return delta;
}
else
@@ -1271,8 +1334,6 @@ void LLTextEditor::cut()
gClipboard.copyFromSubstring( getWText(), left_pos, length, mSourceID );
deleteSelection( FALSE );
- needsReflow();
-
onKeyStroke();
}
@@ -1377,8 +1438,6 @@ void LLTextEditor::pasteHelper(bool is_primary)
setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE, LLTextSegmentPtr()));
deselect();
- needsReflow();
-
onKeyStroke();
}
@@ -1692,7 +1751,15 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
*/
if (mReadOnly)
{
- handled = mScroller->handleKeyHere( key, mask );
+ if(mScroller)
+ {
+ handled = mScroller->handleKeyHere( key, mask );
+ }
+ else
+ {
+ handled = handleNavigationKey( key, mask );
+ }
+
}
else
{
@@ -1765,8 +1832,6 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
if(text_may_have_changed)
{
- needsReflow();
-
onKeyStroke();
}
needsScroll();
@@ -1809,8 +1874,6 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char)
// Most keystrokes will make the selection box go away, but not all will.
deselect();
- needsReflow();
-
onKeyStroke();
}
@@ -1866,10 +1929,9 @@ void LLTextEditor::doDelete()
removeChar();
}
- onKeyStroke();
}
- needsReflow();
+ onKeyStroke();
}
//----------------------------------------------------------------------------
@@ -1912,8 +1974,6 @@ void LLTextEditor::undo()
setCursorPos(pos);
- needsReflow();
-
onKeyStroke();
}
@@ -1956,8 +2016,6 @@ void LLTextEditor::redo()
setCursorPos(pos);
- needsReflow();
-
onKeyStroke();
}
@@ -2001,7 +2059,8 @@ void LLTextEditor::setEnabled(BOOL enabled)
bool read_only = !enabled;
if (read_only != mReadOnly)
{
- mReadOnly = read_only;
+ //mReadOnly = read_only;
+ LLTextBase::setReadOnly(read_only);
updateSegments();
updateAllowingLanguageInput();
}
@@ -2016,6 +2075,20 @@ void LLTextEditor::showContextMenu(S32 x, S32 y)
LLMenuHolderGL::child_registry_t::instance());
}
+ // Route menu to this class
+ // previously this was done in ::handleRightMoseDown:
+ //if(hasTabStop())
+ // setFocus(TRUE) - why? weird...
+ // and then inside setFocus
+ // ....
+ // gEditMenuHandler = this;
+ // ....
+ // but this didn't work in all cases and just weird...
+ //why not here?
+ // (all this was done for EXT-4443)
+
+ gEditMenuHandler = this;
+
S32 screen_x, screen_y;
localPointToScreen(x, y, &screen_x, &screen_y);
mContextMenu->show(screen_x, screen_y);
@@ -2052,8 +2125,8 @@ void LLTextEditor::drawPreeditMarker()
const S32 line_height = llround( mDefaultFont->getLineHeight() );
S32 line_start = getLineStart(cur_line);
- S32 line_y = mTextRect.mTop - line_height;
- while((mTextRect.mBottom <= line_y) && (num_lines > cur_line))
+ S32 line_y = mVisibleTextRect.mTop - line_height;
+ while((mVisibleTextRect.mBottom <= line_y) && (num_lines > cur_line))
{
S32 next_start = -1;
S32 line_end = text_len;
@@ -2085,12 +2158,12 @@ void LLTextEditor::drawPreeditMarker()
continue;
}
- S32 preedit_left = mTextRect.mLeft;
+ S32 preedit_left = mVisibleTextRect.mLeft;
if (left > line_start)
{
preedit_left += mDefaultFont->getWidth(text, line_start, left - line_start);
}
- S32 preedit_right = mTextRect.mLeft;
+ S32 preedit_right = mVisibleTextRect.mLeft;
if (right < line_end)
{
preedit_right += mDefaultFont->getWidth(text, line_start, right - line_start);
@@ -2130,9 +2203,8 @@ void LLTextEditor::drawPreeditMarker()
void LLTextEditor::drawLineNumbers()
{
LLGLSUIDefault gls_ui;
-
- LLRect scrolled_view_rect = mScroller->getVisibleContentRect();
- LLRect content_rect = mScroller->getContentWindowRect();
+ LLRect scrolled_view_rect = getVisibleDocumentRect();
+ LLRect content_rect = getVisibleTextRect();
LLLocalClipRect clip(content_rect);
S32 first_line = getFirstVisibleLine();
S32 num_lines = getLineCount();
@@ -2141,7 +2213,7 @@ void LLTextEditor::drawLineNumbers()
return;
}
- S32 cursor_line = getLineNumFromDocIndex(mCursorPos);
+ S32 cursor_line = mLineInfoList[getLineNumFromDocIndex(mCursorPos)].mLineNum;
if (mShowLineNumbers)
{
@@ -2158,12 +2230,12 @@ void LLTextEditor::drawLineNumbers()
{
line_info& line = mLineInfoList[cur_line];
- if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mTextRect.mBottom)
+ if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mVisibleTextRect.mBottom)
{
break;
}
- S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mTextRect.mBottom;
+ S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom;
// draw the line numbers
if(line.mLineNum != last_line_num && line.mRect.mTop <= scrolled_view_rect.mTop)
{
@@ -2194,8 +2266,8 @@ void LLTextEditor::draw()
{
{
// pad clipping rectangle so that cursor can draw at full width
- // when at left edge of mTextRect
- LLRect clip_rect(mTextRect);
+ // when at left edge of mVisibleTextRect
+ LLRect clip_rect(mVisibleTextRect);
clip_rect.stretch(1);
LLLocalClipRect clip(clip_rect);
drawPreeditMarker();
@@ -2302,8 +2374,6 @@ void LLTextEditor::insertText(const std::string &new_text)
setCursorPos(mCursorPos + insert( mCursorPos, utf8str_to_wstring(new_text), FALSE, LLTextSegmentPtr() ));
- needsReflow();
-
setEnabled( enabled );
}
@@ -2326,8 +2396,6 @@ void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const
LLTextSegmentPtr segment = new LLInlineViewSegment(params, old_length, old_length + widget_wide_text.size());
insert(getLength(), widget_wide_text, FALSE, segment);
- needsReflow();
-
// Set the cursor and scroll position
if( selection_start != selection_end )
{
@@ -2352,52 +2420,6 @@ void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const
}
}
-
-void LLTextEditor::replaceUrlLabel(const std::string &url,
- const std::string &label)
-{
- // get the full (wide) text for the editor so we can change it
- LLWString text = getWText();
- LLWString wlabel = utf8str_to_wstring(label);
- bool modified = false;
- S32 seg_start = 0;
-
- // iterate through each segment looking for ones styled as links
- segment_set_t::iterator it;
- for (it = mSegments.begin(); it != mSegments.end(); ++it)
- {
- LLTextSegment *seg = *it;
- const LLStyleSP style = seg->getStyle();
-
- // update segment start/end length in case we replaced text earlier
- S32 seg_length = seg->getEnd() - seg->getStart();
- seg->setStart(seg_start);
- seg->setEnd(seg_start + seg_length);
-
- // if we find a link with our Url, then replace the label
- if (style->isLink() && style->getLinkHREF() == url)
- {
- S32 start = seg->getStart();
- S32 end = seg->getEnd();
- text = text.substr(0, start) + wlabel + text.substr(end, text.size() - end + 1);
- seg->setEnd(start + wlabel.size());
- modified = true;
- }
-
- // work out the character offset for the next segment
- seg_start = seg->getEnd();
- }
-
- // update the editor with the new (wide) text string
- if (modified)
- {
- getViewModel()->setDisplay(text);
- deselect();
- setCursorPos(mCursorPos);
- needsReflow();
- }
-}
-
void LLTextEditor::removeTextFromEnd(S32 num_chars)
{
if (num_chars <= 0) return;
@@ -2409,7 +2431,6 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars)
mSelectionStart = llclamp(mSelectionStart, 0, len);
mSelectionEnd = llclamp(mSelectionEnd, 0, len);
- needsReflow();
needsScroll();
}
@@ -2468,8 +2489,6 @@ BOOL LLTextEditor::tryToRevertToPristineState()
i--;
}
}
-
- needsReflow();
}
return isPristine(); // TRUE => success
@@ -2505,9 +2524,9 @@ void LLTextEditor::loadKeywords(const std::string& filename,
void LLTextEditor::updateSegments()
{
- LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING);
- if (mKeywords.isLoaded())
+ if (mReflowIndex < S32_MAX && mKeywords.isLoaded())
{
+ LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING);
// HACK: No non-ascii keywords for now
segment_vec_t segment_list;
mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
@@ -2536,13 +2555,16 @@ void LLTextEditor::updateLinkSegments()
// if the link's label (what the user can edit) is a valid Url,
// then update the link's HREF to be the same as the label text.
// This lets users edit Urls in-place.
- LLStyleSP style = static_cast<LLStyleSP>(segment->getStyle());
+ LLStyleConstSP style = segment->getStyle();
+ LLStyleSP new_style(new LLStyle(*style));
LLWString url_label = wtext.substr(segment->getStart(), segment->getEnd()-segment->getStart());
if (LLUrlRegistry::instance().hasUrl(url_label))
{
std::string new_url = wstring_to_utf8str(url_label);
LLStringUtil::trim(new_url);
- style->setLinkHREF(new_url);
+ new_style->setLinkHREF(new_url);
+ LLStyleConstSP sp(new_style);
+ segment->setStyle(sp);
}
}
}
@@ -2641,7 +2663,6 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length )
startOfDoc();
deselect();
- needsReflow();
return success;
}
@@ -2745,7 +2766,6 @@ void LLTextEditor::updatePreedit(const LLWString &preedit_string,
mPreeditStandouts = preedit_standouts;
- needsReflow();
setCursorPos(insert_preedit_at + caret_position);
// Update of the preedit should be caused by some key strokes.
@@ -2759,7 +2779,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
if (control)
{
LLRect control_rect_screen;
- localRectToScreen(mTextRect, &control_rect_screen);
+ localRectToScreen(mVisibleTextRect, &control_rect_screen);
LLUI::screenRectToGL(control_rect_screen, control);
}
@@ -2810,8 +2830,8 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
if (coord)
{
- const S32 query_x = mTextRect.mLeft + mDefaultFont->getWidth(text, current_line_start, query - current_line_start);
- const S32 query_y = mTextRect.mTop - (current_line - first_visible_line) * line_height - line_height / 2;
+ const S32 query_x = mVisibleTextRect.mLeft + mDefaultFont->getWidth(text, current_line_start, query - current_line_start);
+ const S32 query_y = mVisibleTextRect.mTop - (current_line - first_visible_line) * line_height - line_height / 2;
S32 query_screen_x, query_screen_y;
localPointToScreen(query_x, query_y, &query_screen_x, &query_screen_y);
LLUI::screenPointToGL(query_screen_x, query_screen_y, &coord->mX, &coord->mY);
@@ -2819,13 +2839,13 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
if (bounds)
{
- S32 preedit_left = mTextRect.mLeft;
+ S32 preedit_left = mVisibleTextRect.mLeft;
if (preedit_left_position > current_line_start)
{
preedit_left += mDefaultFont->getWidth(text, current_line_start, preedit_left_position - current_line_start);
}
- S32 preedit_right = mTextRect.mLeft;
+ S32 preedit_right = mVisibleTextRect.mLeft;
if (preedit_right_position < current_line_end)
{
preedit_right += mDefaultFont->getWidth(text, current_line_start, preedit_right_position - current_line_start);
@@ -2835,7 +2855,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
preedit_right += mDefaultFont->getWidth(text, current_line_start, current_line_end - current_line_start);
}
- const S32 preedit_top = mTextRect.mTop - (current_line - first_visible_line) * line_height;
+ const S32 preedit_top = mVisibleTextRect.mTop - (current_line - first_visible_line) * line_height;
const S32 preedit_bottom = preedit_top - line_height;
const LLRect preedit_rect_local(preedit_left, preedit_top, preedit_right, preedit_bottom);
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 10fc94dedc..71d937b2c4 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -44,6 +44,7 @@
#include "lldarray.h"
#include "llviewborder.h" // for params
#include "lltextbase.h"
+#include "lltextvalidate.h"
#include "llpreeditor.h"
#include "llcontrol.h"
@@ -63,12 +64,14 @@ public:
struct Params : public LLInitParam::Block<Params, LLTextBase::Params>
{
Optional<std::string> default_text;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<bool> embedded_items,
ignore_tab,
handle_edit_keys_directly,
show_line_numbers,
- commit_on_focus_lost;
+ commit_on_focus_lost,
+ show_context_menu;
//colors
Optional<LLUIColor> default_color;
@@ -149,7 +152,6 @@ public:
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive);
- void replaceUrlLabel(const std::string &url, const std::string &label);
// Undo/redo stack
void blockUndo();
@@ -168,7 +170,7 @@ public:
void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
// Non-undoable
- void setText(const LLStringExplicit &utf8str);
+ void setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params());
// Removes text from the end of document
@@ -201,6 +203,9 @@ public:
const LLTextSegmentPtr getPreviousSegment() const;
void getSelectedSegments(segment_vec_t& segments) const;
+ void setShowContextMenu(bool show) { mShowContextMenu = show; }
+ bool getShowContextMenu() const { return mShowContextMenu; }
+
protected:
void showContextMenu(S32 x, S32 y);
void drawPreeditMarker();
@@ -320,6 +325,7 @@ private:
BOOL mTakesFocus;
BOOL mAllowEmbeddedItems;
+ bool mShowContextMenu;
LLUUID mSourceID;
@@ -330,9 +336,15 @@ private:
LLCoordGL mLastIMEPosition; // Last position of the IME editor
keystroke_signal_t mKeystrokeSignal;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLContextMenu* mContextMenu;
}; // end class LLTextEditor
+// Build time optimization, generate once in .cpp file
+#ifndef LLTEXTEDITOR_CPP
+extern template class LLTextEditor* LLView::getChild<class LLTextEditor>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_TEXTEDITOR_
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
new file mode 100644
index 0000000000..8b6bc5bd7d
--- /dev/null
+++ b/indra/llui/lltextvalidate.cpp
@@ -0,0 +1,302 @@
+/**
+ * @file lltextvalidate.cpp
+ * @brief Text validation helper functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Text editor widget to let users enter a single line.
+
+#include "linden_common.h"
+
+#include "lltextvalidate.h"
+#include "llresmgr.h" // for LLLocale
+
+namespace LLTextValidate
+{
+ void ValidateTextNamedFuncs::declareValues()
+ {
+ declare("ascii", validateASCII);
+ declare("float", validateFloat);
+ declare("int", validateInt);
+ declare("positive_s32", validatePositiveS32);
+ declare("non_negative_s32", validateNonNegativeS32);
+ declare("alpha_num", validateAlphaNum);
+ declare("alpha_num_space", validateAlphaNumSpace);
+ declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe);
+ declare("ascii_printable_no_space", validateASCIIPrintableNoSpace);
+ }
+
+ // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateFloat(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ // May be a comma or period, depending on the locale
+ llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
+
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ // Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateInt(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ bool validatePositiveS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if(('-' == trimmed[0]) || ('0' == trimmed[0]))
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val <= 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateNonNegativeS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if('-' == trimmed[0])
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val < 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateAlphaNum(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if( !LLStringOps::isAlnum((char)str[len]) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateAlphaNumSpace(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ // Used for most names of things stored on the server, due to old file-formats
+ // that used the pipe (|) for multiline text storage. Examples include
+ // inventory item names, parcel names, object names, etc.
+ bool validateASCIIPrintableNoPipe(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || wc == '|')
+ {
+ rv = FALSE;
+ break;
+ }
+ if(!(wc == ' '
+ || LLStringOps::isAlnum((char)wc)
+ || LLStringOps::isPunct((char)wc) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+
+ // Used for avatar names
+ bool validateASCIIPrintableNoSpace(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || LLStringOps::isSpace(wc))
+ {
+ rv = FALSE;
+ break;
+ }
+ if( !(LLStringOps::isAlnum((char)str[len]) ||
+ LLStringOps::isPunct((char)str[len]) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateASCII(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ while(len--)
+ {
+ if (str[len] < 0x20 || str[len] > 0x7f)
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+}
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
new file mode 100644
index 0000000000..ffb4e85e7c
--- /dev/null
+++ b/indra/llui/lltextvalidate.h
@@ -0,0 +1,63 @@
+/**
+ * @file lltextbase.h
+ * @author Martin Reddy
+ * @brief The base class of text box/editor, providing Url handling support
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTVALIDATE_H
+#define LL_LLTEXTVALIDATE_H
+
+#include "llstring.h"
+#include "llinitparam.h"
+#include <boost/function.hpp>
+
+namespace LLTextValidate
+{
+ typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t;
+
+ struct ValidateTextNamedFuncs
+ : public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs>
+ {
+ static void declareValues();
+ };
+
+ bool validateFloat(const LLWString &str );
+ bool validateInt(const LLWString &str );
+ bool validatePositiveS32(const LLWString &str);
+ bool validateNonNegativeS32(const LLWString &str);
+ bool validateAlphaNum(const LLWString &str );
+ bool validateAlphaNumSpace(const LLWString &str );
+ bool validateASCIIPrintableNoPipe(const LLWString &str);
+ bool validateASCIIPrintableNoSpace(const LLWString &str);
+ bool validateASCII(const LLWString &str);
+}
+
+
+#endif
diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp
index 717e135412..5df1d35383 100644
--- a/indra/llui/lltoggleablemenu.cpp
+++ b/indra/llui/lltoggleablemenu.cpp
@@ -40,6 +40,7 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu");
LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p)
: LLMenuGL(p),
+ mButtonRect(),
mClosedByButtonClick(false)
{
}
@@ -56,13 +57,19 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
}
}
-void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
+void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
{
LLRect screen;
current_view->localRectToScreen(rect, &screen);
mButtonRect = screen;
}
+void LLToggleableMenu::setButtonRect(LLView* current_view)
+{
+ LLRect rect = current_view->getLocalRect();
+ setButtonRect(rect, current_view);
+}
+
bool LLToggleableMenu::toggleVisibility()
{
if (mClosedByButtonClick)
diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h
index 3cd66e04a8..9d8c5261b9 100644
--- a/indra/llui/lltoggleablemenu.h
+++ b/indra/llui/lltoggleablemenu.h
@@ -49,8 +49,11 @@ protected:
public:
virtual void handleVisibilityChange (BOOL curVisibilityIn);
+ const LLRect& getButtonRect() const { return mButtonRect; }
+
// Converts the given local button rect to a screen rect
void setButtonRect(const LLRect& rect, LLView* current_view);
+ void setButtonRect(LLView* current_view);
// Returns "true" if menu was not closed by button click
// and is not still visible. If menu is visible toggles
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index c8094f9c7c..ed7fd02e14 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -38,10 +38,11 @@
// Library includes
#include "lltextbox.h"
#include "lliconctrl.h"
+#include "llbutton.h"
#include "llmenugl.h" // hideMenus()
#include "llui.h" // positionViewNearMouse()
#include "llwindow.h"
-
+#include "lltrans.h"
//
// Constants
//
@@ -56,6 +57,8 @@ LLToolTipView *gToolTipView = NULL;
// Member functions
//
+static LLDefaultChildRegistry::Register<LLToolTipView> register_tooltip_view("tooltip_view");
+
LLToolTipView::Params::Params()
{
mouse_opaque = false;
@@ -126,22 +129,20 @@ BOOL LLToolTipView::handleScrollWheel( S32 x, S32 y, S32 clicks )
return FALSE;
}
-void LLToolTipView::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- LLToolTipMgr::instance().blockToolTips();
-}
-
-
void LLToolTipView::drawStickyRect()
{
gl_rect_2d(LLToolTipMgr::instance().getMouseNearRect(), LLColor4::white, false);
}
+
+// defaults for floater param block pulled from widgets/floater.xml
+static LLWidgetNameRegistry::StaticRegistrar sRegisterInspectorParams(&typeid(LLInspector::Params), "inspector");
+
//
// LLToolTip
//
-static LLDefaultChildRegistry::Register<LLToolTip> r("tool_tip");
+static LLDefaultChildRegistry::Register<LLToolTip> register_tooltip("tool_tip");
LLToolTip::Params::Params()
@@ -155,30 +156,32 @@ LLToolTip::Params::Params()
visible_time_near("visible_time_near", LLUI::sSettingGroups["config"]->getF32( "ToolTipVisibleTimeNear" )),
visible_time_far("visible_time_far", LLUI::sSettingGroups["config"]->getF32( "ToolTipVisibleTimeFar" )),
sticky_rect("sticky_rect"),
- image("image")
+ image("image"),
+ text_color("text_color"),
+ time_based_media("time_based_media", false),
+ web_based_media("web_based_media", false),
+ media_playing("media_playing", false)
{
- name = "tooltip";
- font = LLFontGL::getFontSansSerif();
- bg_opaque_color = LLUIColorTable::instance().getColor( "ToolTipBgColor" );
- background_visible = true;
+ chrome = true;
}
LLToolTip::LLToolTip(const LLToolTip::Params& p)
: LLPanel(p),
- mMaxWidth(p.max_width),
mHasClickCallback(p.click_callback.isProvided()),
- mPadding(p.padding)
+ mPadding(p.padding),
+ mTextBox(NULL),
+ mInfoButton(NULL),
+ mPlayMediaButton(NULL),
+ mHomePageButton(NULL)
{
LLTextBox::Params params;
- params.initial_value = "tip_text";
params.name = params.initial_value().asString();
// bake textbox padding into initial rect
params.rect = LLRect (mPadding, mPadding + 1, mPadding + 1, mPadding);
- params.follows.flags = FOLLOWS_ALL;
params.h_pad = 0;
params.v_pad = 0;
params.mouse_opaque = false;
- params.text_color = LLUIColorTable::instance().getColor( "ToolTipTextColor" );
+ params.text_color = p.text_color;
params.bg_visible = false;
params.font = p.font;
params.use_ellipses = true;
@@ -186,41 +189,113 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
params.allow_html = false; // disallow hyperlinks in tooltips, as they want to spawn their own explanatory tooltips
mTextBox = LLUICtrlFactory::create<LLTextBox> (params);
addChild(mTextBox);
-
+
+ S32 TOOLTIP_ICON_SIZE = 0;
+ S32 TOOLTIP_PLAYBUTTON_SIZE = 0;
if (p.image.isProvided())
{
- LLIconCtrl::Params icon_params;
- icon_params.name = "tooltip_icon";
+ LLButton::Params icon_params;
+ icon_params.name = "tooltip_info";
+ icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela
LLRect icon_rect;
LLUIImage* imagep = p.image;
- const S32 TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);
+ TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);
icon_rect.setOriginAndSize(mPadding, mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
icon_params.rect = icon_rect;
- icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
- icon_params.image = p.image;
- icon_params.mouse_opaque = false;
- addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
+ icon_params.image_unselected(imagep);
+ icon_params.image_selected(imagep);
+ icon_params.scale_image(true);
+ icon_params.flash_color(icon_params.highlight_color());
+ mInfoButton = LLUICtrlFactory::create<LLButton>(icon_params);
+ if (p.click_callback.isProvided())
+ {
+ mInfoButton->setCommitCallback(boost::bind(p.click_callback()));
+ }
+ addChild(mInfoButton);
+
// move text over to fit image in
mTextBox->translate(TOOLTIP_ICON_SIZE + mPadding, 0);
}
-
+
+ if (p.time_based_media)
+ {
+ LLButton::Params p_button;
+ p_button.name(std::string("play_media"));
+ p_button.label(""); // provide label but set to empty so name does not overwrite it -angela
+ TOOLTIP_PLAYBUTTON_SIZE = 16;
+ LLRect button_rect;
+ button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
+ p_button.rect = button_rect;
+ p_button.image_selected.name("button_anim_pause.tga");
+ p_button.image_unselected.name("button_anim_play.tga");
+ p_button.scale_image(true);
+
+ mPlayMediaButton = LLUICtrlFactory::create<LLButton>(p_button);
+ if(p.click_playmedia_callback.isProvided())
+ {
+ mPlayMediaButton->setCommitCallback(boost::bind(p.click_playmedia_callback()));
+ }
+ mPlayMediaButton->setToggleState(p.media_playing);
+ addChild(mPlayMediaButton);
+
+ // move text over to fit image in
+ mTextBox->translate(TOOLTIP_PLAYBUTTON_SIZE + mPadding, 0);
+ }
+
+ if (p.web_based_media)
+ {
+ LLButton::Params p_w_button;
+ p_w_button.name(std::string("home_page"));
+ p_w_button.label(""); // provid label but set to empty so name does not overwrite it -angela
+ TOOLTIP_PLAYBUTTON_SIZE = 16;
+ LLRect button_rect;
+ button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
+ p_w_button.rect = button_rect;
+ p_w_button.image_unselected.name("map_home.tga");
+ p_w_button.scale_image(true);
+
+ mHomePageButton = LLUICtrlFactory::create<LLButton>(p_w_button);
+ if(p.click_homepage_callback.isProvided())
+ {
+ mHomePageButton->setCommitCallback(boost::bind(p.click_homepage_callback()));
+ }
+ addChild(mHomePageButton);
+
+ // move text over to fit image in
+ mTextBox->translate(TOOLTIP_PLAYBUTTON_SIZE + mPadding, 0);
+ }
+
if (p.click_callback.isProvided())
{
setMouseUpCallback(boost::bind(p.click_callback()));
}
}
-void LLToolTip::setValue(const LLSD& value)
+void LLToolTip::initFromParams(const LLToolTip::Params& p)
{
+ LLPanel::initFromParams(p);
+
+ // do this *after* we've had our size set in LLPanel::initFromParams();
const S32 REALLY_LARGE_HEIGHT = 10000;
- reshape(mMaxWidth, REALLY_LARGE_HEIGHT);
+ mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT);
- mTextBox->setValue(value);
+ if (p.styled_message.isProvided())
+ {
+ for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message().begin();
+ text_it != p.styled_message().end();
+ ++text_it)
+ {
+ mTextBox->appendText(text_it->text(), false, text_it->style);
+ }
+ }
+ else
+ {
+ mTextBox->setText(p.message());
+ }
- LLRect text_contents_rect = mTextBox->getContentsRect();
- S32 text_width = llmin(mMaxWidth, text_contents_rect.getWidth());
- S32 text_height = text_contents_rect.getHeight();
+ S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth());
+ S32 text_height = mTextBox->getTextPixelHeight();
mTextBox->reshape(text_width, text_height);
// reshape tooltip panel to fit text box
@@ -230,7 +305,7 @@ void LLToolTip::setValue(const LLSD& value)
tooltip_rect.mBottom = 0;
tooltip_rect.mLeft = 0;
- setRect(tooltip_rect);
+ setShape(tooltip_rect);
}
void LLToolTip::setVisible(BOOL visible)
@@ -255,6 +330,10 @@ void LLToolTip::setVisible(BOOL visible)
BOOL LLToolTip::handleHover(S32 x, S32 y, MASK mask)
{
+ //mInfoButton->setFlashing(true);
+ if(mInfoButton)
+ mInfoButton->setHighlight(true);
+
LLPanel::handleHover(x, y, mask);
if (mHasClickCallback)
{
@@ -263,6 +342,14 @@ BOOL LLToolTip::handleHover(S32 x, S32 y, MASK mask)
return TRUE;
}
+void LLToolTip::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ //mInfoButton->setFlashing(true);
+ if(mInfoButton)
+ mInfoButton->setHighlight(false);
+ LLUICtrl::onMouseLeave(x, y, mask);
+}
+
void LLToolTip::draw()
{
F32 alpha = 1.f;
@@ -307,7 +394,8 @@ bool LLToolTip::hasClickCallback()
//
LLToolTipMgr::LLToolTipMgr()
-: mToolTip(NULL),
+: mToolTipsBlocked(false),
+ mToolTip(NULL),
mNeedsToolTip(false)
{}
@@ -329,9 +417,8 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)
}
tooltip_params.rect = LLRect (0, 1, 1, 0);
-
mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params);
- mToolTip->setValue(params.message());
+
gToolTipView->addChild(mToolTip);
if (params.pos.isProvided())
@@ -378,7 +465,10 @@ void LLToolTipMgr::show(const std::string& msg)
void LLToolTipMgr::show(const LLToolTip::Params& params)
{
- if (!params.validateBlock())
+ // fill in default tooltip params from tool_tip.xml
+ LLToolTip::Params params_with_defaults(params);
+ params_with_defaults.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLToolTip>());
+ if (!params_with_defaults.validateBlock())
{
llwarns << "Could not display tooltip!" << llendl;
return;
@@ -390,10 +480,12 @@ void LLToolTipMgr::show(const LLToolTip::Params& params)
// are we ready to show the tooltip?
if (!mToolTipsBlocked // we haven't hit a key, moved the mouse, etc.
- && LLUI::getMouseIdleTime() > params.delay_time) // the mouse has been still long enough
+ && LLUI::getMouseIdleTime() > params_with_defaults.delay_time) // the mouse has been still long enough
{
- bool tooltip_changed = mLastToolTipParams.message() != params.message()
- || mLastToolTipParams.pos() != params.pos();
+ bool tooltip_changed = mLastToolTipParams.message() != params_with_defaults.message()
+ || mLastToolTipParams.pos() != params_with_defaults.pos()
+ || mLastToolTipParams.time_based_media() != params_with_defaults.time_based_media()
+ || mLastToolTipParams.web_based_media() != params_with_defaults.web_based_media();
bool tooltip_shown = mToolTip
&& mToolTip->getVisible()
@@ -401,7 +493,7 @@ void LLToolTipMgr::show(const LLToolTip::Params& params)
mNeedsToolTip = tooltip_changed || !tooltip_shown;
// store description of tooltip for later creation
- mNextToolTipParams = params;
+ mNextToolTipParams = params_with_defaults;
}
}
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 63e7249a12..24e32b9b24 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -37,6 +37,7 @@
#include "llsingleton.h"
#include "llinitparam.h"
#include "llpanel.h"
+#include "llstyle.h"
//
// Classes
@@ -55,8 +56,6 @@ public:
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
- /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
-
void drawStickyRect();
/*virtual*/ void draw();
@@ -65,11 +64,19 @@ public:
class LLToolTip : public LLPanel
{
public:
+
+ struct StyledText : public LLInitParam::Block<StyledText>
+ {
+ Mandatory<std::string> text;
+ Optional<LLStyle::Params> style;
+ };
+
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
typedef boost::function<void(void)> click_callback_t;
- Mandatory<std::string> message;
+ Optional<std::string> message;
+ Multiple<StyledText> styled_message;
Optional<LLCoordGL> pos;
Optional<F32> delay_time,
@@ -78,19 +85,23 @@ public:
visible_time_far; // time for which tooltip is visible while mouse moved away
Optional<LLRect> sticky_rect;
Optional<const LLFontGL*> font;
-
- Optional<click_callback_t> click_callback;
Optional<LLUIImage*> image;
- Optional<S32> max_width;
- Optional<S32> padding;
+ Optional<LLUIColor> text_color;
+ Optional<bool> time_based_media,
+ web_based_media,
+ media_playing;
+ Optional<click_callback_t> click_callback,
+ click_playmedia_callback,
+ click_homepage_callback;
+ Optional<S32> max_width,
+ padding;
Optional<bool> wrap;
Params();
};
/*virtual*/ void draw();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
-
- /*virtual*/ void setValue(const LLSD& value);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
/*virtual*/ void setVisible(BOOL visible);
bool isFading();
@@ -98,16 +109,27 @@ public:
bool hasClickCallback();
LLToolTip(const Params& p);
+ void initFromParams(const LLToolTip::Params& params);
private:
class LLTextBox* mTextBox;
+ class LLButton* mInfoButton;
+ class LLButton* mPlayMediaButton;
+ class LLButton* mHomePageButton;
+
LLFrameTimer mFadeTimer;
LLFrameTimer mVisibleTimer;
- S32 mMaxWidth;
bool mHasClickCallback;
S32 mPadding; // pixels
};
+// used for the inspector tooltips which need different background images etc.
+class LLInspector : public LLToolTip
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLToolTip::Params>
+ {};
+};
class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
{
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 48504a1e54..caf04339c2 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -43,7 +43,6 @@
#include "llrender.h"
#include "llrect.h"
#include "lldir.h"
-#include "llfontgl.h"
#include "llgl.h"
// Project includes
@@ -1848,8 +1847,8 @@ LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname)
// spawn_x and spawn_y are top left corner of view in screen GL coordinates
void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
{
- const S32 CURSOR_HEIGHT = 18; // Approximate "normal" cursor size
- const S32 CURSOR_WIDTH = 9;
+ const S32 CURSOR_HEIGHT = 16; // Approximate "normal" cursor size
+ const S32 CURSOR_WIDTH = 8;
LLView* parent = view->getParent();
@@ -1867,7 +1866,7 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
LLRect virtual_window_rect = parent->getLocalRect();
LLRect mouse_rect;
- const S32 MOUSE_CURSOR_PADDING = 5;
+ const S32 MOUSE_CURSOR_PADDING = 1;
mouse_rect.setLeftTopAndSize(mouse_x - MOUSE_CURSOR_PADDING,
mouse_y + MOUSE_CURSOR_PADDING,
CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2,
@@ -1895,19 +1894,31 @@ namespace LLInitParam
blue("blue"),
alpha("alpha"),
control("")
- {}
+ {
+ setBlockFromValue();
+ }
- LLUIColor TypedParam<LLUIColor>::getValueFromBlock() const
+ void TypedParam<LLUIColor>::setValueFromBlock() const
{
if (control.isProvided())
{
- return LLUIColorTable::instance().getColor(control);
+ mData.mValue = LLUIColorTable::instance().getColor(control);
}
else
{
- return LLColor4(red, green, blue, alpha);
+ mData.mValue = LLColor4(red, green, blue, alpha);
}
}
+
+ void TypedParam<LLUIColor>::setBlockFromValue()
+ {
+ LLColor4 color = mData.mValue.get();
+ red.set(color.mV[VRED], false);
+ green.set(color.mV[VGREEN], false);
+ blue.set(color.mV[VBLUE], false);
+ alpha.set(color.mV[VALPHA], false);
+ control.set("", false);
+ }
void TypeValues<LLUIColor>::declareValues()
{
@@ -1930,36 +1941,37 @@ namespace LLInitParam
size("size"),
style("style")
{
+ setBlockFromValue();
addSynonym(name, "");
}
- const LLFontGL* TypedParam<const LLFontGL*>::getValueFromBlock() const
+ void TypedParam<const LLFontGL*>::setValueFromBlock() const
{
- if (name.isProvided())
+ const LLFontGL* res_fontp = LLFontGL::getFontByName(name);
+ if (res_fontp)
{
- const LLFontGL* res_fontp = LLFontGL::getFontByName(name);
- if (res_fontp)
- {
- return res_fontp;
- }
-
- U8 fontstyle = 0;
- fontstyle = LLFontGL::getStyleFromString(style());
- LLFontDescriptor desc(name(), size(), fontstyle);
- const LLFontGL* fontp = LLFontGL::getFont(desc);
- if (fontp)
- {
- return fontp;
- }
+ mData.mValue = res_fontp;
+ return;
}
-
- if (mData.mValue == NULL)
+
+ U8 fontstyle = 0;
+ fontstyle = LLFontGL::getStyleFromString(style());
+ LLFontDescriptor desc(name(), size(), fontstyle);
+ const LLFontGL* fontp = LLFontGL::getFont(desc);
+ if (fontp)
{
- mData.mValue = LLFontGL::getFontDefault();
+ mData.mValue = fontp;
+ }
+ }
+
+ void TypedParam<const LLFontGL*>::setBlockFromValue()
+ {
+ if (mData.mValue)
+ {
+ name.set(LLFontGL::nameFromFont(mData.mValue), false);
+ size.set(LLFontGL::sizeFromFont(mData.mValue), false);
+ style.set(LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle()), false);
}
-
- // default to current value
- return mData.mValue;
}
TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
@@ -1970,9 +1982,11 @@ namespace LLInitParam
bottom("bottom"),
width("width"),
height("height")
- {}
+ {
+ setBlockFromValue();
+ }
- LLRect TypedParam<LLRect>::getValueFromBlock() const
+ void TypedParam<LLRect>::setValueFromBlock() const
{
LLRect rect;
@@ -2033,7 +2047,21 @@ namespace LLInitParam
rect.mBottom = bottom;
rect.mTop = top;
}
- return rect;
+ mData.mValue = rect;
+ }
+
+ void TypedParam<LLRect>::setBlockFromValue()
+ {
+ // because of the ambiguity in specifying a rect by position and/or dimensions
+ // we clear the "provided" flag so that values from xui/etc have priority
+ // over those calculated from the rect object
+
+ left.set(mData.mValue.mLeft, false);
+ right.set(mData.mValue.mRight, false);
+ bottom.set(mData.mValue.mBottom, false);
+ top.set(mData.mValue.mTop, false);
+ width.set(mData.mValue.getWidth(), false);
+ height.set(mData.mValue.getHeight(), false);
}
TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
@@ -2041,11 +2069,18 @@ namespace LLInitParam
x("x"),
y("y")
{
+ setBlockFromValue();
}
- LLCoordGL TypedParam<LLCoordGL>::getValueFromBlock() const
+ void TypedParam<LLCoordGL>::setValueFromBlock() const
+ {
+ mData.mValue.set(x, y);
+ }
+
+ void TypedParam<LLCoordGL>::setBlockFromValue()
{
- return LLCoordGL(x, y);
+ x.set(mData.mValue.mX, false);
+ y.set(mData.mValue.mY, false);
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index efb1b0a36f..af8d4ea03b 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -379,7 +379,8 @@ namespace LLInitParam
TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- LLRect getValueFromBlock() const;
+ void setValueFromBlock() const;
+ void setBlockFromValue();
};
template<>
@@ -401,21 +402,37 @@ namespace LLInitParam
Optional<std::string> control;
TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- LLUIColor getValueFromBlock() const;
+ void setValueFromBlock() const;
+ void setBlockFromValue();
};
+ // provide a better default for Optional<const LLFontGL*> than NULL
+ template <>
+ struct DefaultInitializer<const LLFontGL*>
+ {
+ // return reference to a single default instance of T
+ // built-in types will be initialized to zero, default constructor otherwise
+ static const LLFontGL* get()
+ {
+ static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault();
+ return sDefaultFont;
+ }
+ };
+
+
template<>
class TypedParam<const LLFontGL*>
: public BlockValue<const LLFontGL*>
{
typedef BlockValue<const LLFontGL*> super_t;
public:
- Mandatory<std::string> name;
- Optional<std::string> size,
+ Optional<std::string> name,
+ size,
style;
TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- const LLFontGL* getValueFromBlock() const;
+ void setValueFromBlock() const;
+ void setBlockFromValue();
};
template<>
@@ -453,7 +470,8 @@ namespace LLInitParam
y;
TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- LLCoordGL getValueFromBlock() const;
+ void setValueFromBlock() const;
+ void setBlockFromValue();
};
}
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 851091f0ca..1b64ef3abe 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -56,7 +56,7 @@ LLUIColorTable::Params::Params()
{
}
-void LLUIColorTable::insertFromParams(const Params& p)
+void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table)
{
// this map will contain all color references after the following loop
typedef std::map<std::string, std::string> string_string_map_t;
@@ -69,7 +69,7 @@ void LLUIColorTable::insertFromParams(const Params& p)
ColorEntryParams color_entry = *it;
if(color_entry.color.value.isChosen())
{
- setColor(color_entry.name, color_entry.color.value, mLoadedColors);
+ setColor(color_entry.name, color_entry.color.value, table);
}
else
{
@@ -185,19 +185,27 @@ void LLUIColorTable::clear()
LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const
{
string_color_map_t::const_iterator iter = mUserSetColors.find(name);
+
if(iter != mUserSetColors.end())
{
return LLUIColor(&iter->second);
}
iter = mLoadedColors.find(name);
- return (iter != mLoadedColors.end() ? LLUIColor(&iter->second) : LLUIColor(default_color));
+
+ if(iter != mLoadedColors.end())
+ {
+ return LLUIColor(&iter->second);
+ }
+
+ return LLUIColor(default_color);
}
// update user color, loaded colors are parsed on initialization
void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)
{
setColor(name, color, mUserSetColors);
+ setColor(name, color, mLoadedColors);
}
bool LLUIColorTable::loadFromSettings()
@@ -205,16 +213,16 @@ bool LLUIColorTable::loadFromSettings()
bool result = false;
std::string default_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "colors.xml");
- result |= loadFromFilename(default_filename);
+ result |= loadFromFilename(default_filename, mLoadedColors);
std::string current_filename = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "colors.xml");
if(current_filename != default_filename)
{
- result |= loadFromFilename(current_filename);
+ result |= loadFromFilename(current_filename, mLoadedColors);
}
- std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml");
- loadFromFilename(user_filename);
+ std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
+ loadFromFilename(user_filename, mUserSetColors);
return result;
}
@@ -239,7 +247,7 @@ void LLUIColorTable::saveUserSettings() const
if(!output_node->isNull())
{
- const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml");
+ const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
LLFILE *fp = LLFile::fopen(filename, "w");
if(fp != NULL)
@@ -284,7 +292,7 @@ void LLUIColorTable::setColor(const std::string& name, const LLColor4& color, st
}
}
-bool LLUIColorTable::loadFromFilename(const std::string& filename)
+bool LLUIColorTable::loadFromFilename(const std::string& filename, string_color_map_t& table)
{
LLXMLNodePtr root;
@@ -305,7 +313,7 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
if(params.validateBlock())
{
- insertFromParams(params);
+ insertFromParams(params, table);
}
else
{
@@ -315,3 +323,11 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
return true;
}
+
+void LLUIColorTable::insertFromParams(const Params& p)
+{
+ insertFromParams(p, mUserSetColors);
+}
+
+// EOF
+
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index 59be0c4f9a..d401e5e724 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -45,6 +45,10 @@ class LLUIColor;
class LLUIColorTable : public LLSingleton<LLUIColorTable>
{
LOG_CLASS(LLUIColorTable);
+
+ // consider using sorted vector, can be much faster
+ typedef std::map<std::string, LLUIColor> string_color_map_t;
+
public:
struct ColorParams : LLInitParam::Choice<ColorParams>
{
@@ -91,10 +95,9 @@ public:
void saveUserSettings() const;
private:
- bool loadFromFilename(const std::string& filename);
+ bool loadFromFilename(const std::string& filename, string_color_map_t& table);
- // consider using sorted vector, can be much faster
- typedef std::map<std::string, LLColor4> string_color_map_t;
+ void insertFromParams(const Params& p, string_color_map_t& table);
void clearTable(string_color_map_t& table);
void setColor(const std::string& name, const LLColor4& color, string_color_map_t& table);
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 0faff5eff6..3ade46d367 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -31,17 +31,46 @@
* $/LicenseInfo$
*/
-//#include "llviewerprecompiledheaders.h"
#include "linden_common.h"
+
+#define LLUICTRL_CPP
#include "lluictrl.h"
+
#include "llfocusmgr.h"
#include "llpanel.h"
#include "lluictrlfactory.h"
static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
+// Compiler optimization, generate extern template
+template class LLUICtrl* LLView::getChild<class LLUICtrl>(
+ const std::string& name, BOOL recurse) const;
+
+LLUICtrl::CallbackParam::CallbackParam()
+: name("name"),
+ function_name("function"),
+ parameter("parameter"),
+ control_name("control") // Shortcut to control -> "control_name" for backwards compatability
+{
+ addSynonym(parameter, "userdata");
+}
+
+LLUICtrl::EnableControls::EnableControls()
+: enabled("enabled_control"),
+ disabled("disabled_control")
+{}
+
+LLUICtrl::ControlVisibility::ControlVisibility()
+: visible("visibility_control"),
+ invisible("invisibility_control")
+{
+ addSynonym(visible, "visiblity_control");
+ addSynonym(invisible, "invisiblity_control");
+}
+
LLUICtrl::Params::Params()
: tab_stop("tab_stop", true),
+ chrome("chrome", false),
label("label"),
initial_value("value"),
init_callback("init_callback"),
@@ -77,7 +106,16 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
mEnabledControlVariable(NULL),
mDisabledControlVariable(NULL),
mMakeVisibleControlVariable(NULL),
- mMakeInvisibleControlVariable(NULL)
+ mMakeInvisibleControlVariable(NULL),
+ mCommitSignal(NULL),
+ mValidateSignal(NULL),
+ mMouseEnterSignal(NULL),
+ mMouseLeaveSignal(NULL),
+ mMouseDownSignal(NULL),
+ mMouseUpSignal(NULL),
+ mRightMouseDownSignal(NULL),
+ mRightMouseUpSignal(NULL),
+ mDoubleClickSignal(NULL)
{
mUICtrlHandle.bind(this);
}
@@ -86,6 +124,7 @@ void LLUICtrl::initFromParams(const Params& p)
{
LLView::initFromParams(p);
+ setIsChrome(p.chrome);
setControlName(p.control_name);
if(p.enabled_controls.isProvided())
{
@@ -127,10 +166,14 @@ void LLUICtrl::initFromParams(const Params& p)
}
if (p.commit_callback.isProvided())
- initCommitCallback(p.commit_callback, mCommitSignal);
+ {
+ setCommitCallback(initCommitCallback(p.commit_callback));
+ }
if (p.validate_callback.isProvided())
- initEnableCallback(p.validate_callback, mValidateSignal);
+ {
+ setValidateCallback(initEnableCallback(p.validate_callback));
+ }
if (p.init_callback.isProvided())
{
@@ -149,10 +192,14 @@ void LLUICtrl::initFromParams(const Params& p)
}
if(p.mouseenter_callback.isProvided())
- initCommitCallback(p.mouseenter_callback, mMouseEnterSignal);
+ {
+ setMouseEnterCallback(initCommitCallback(p.mouseenter_callback));
+ }
if(p.mouseleave_callback.isProvided())
- initCommitCallback(p.mouseleave_callback, mMouseLeaveSignal);
+ {
+ setMouseLeaveCallback(initCommitCallback(p.mouseleave_callback));
+ }
}
@@ -165,16 +212,35 @@ LLUICtrl::~LLUICtrl()
llwarns << "UI Control holding top ctrl deleted: " << getName() << ". Top view removed." << llendl;
gFocusMgr.removeTopCtrlWithoutCallback( this );
}
+
+ delete mCommitSignal;
+ delete mValidateSignal;
+ delete mMouseEnterSignal;
+ delete mMouseLeaveSignal;
+ delete mMouseDownSignal;
+ delete mMouseUpSignal;
+ delete mRightMouseDownSignal;
+ delete mRightMouseUpSignal;
+ delete mDoubleClickSignal;
}
-void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig)
+void default_commit_handler(LLUICtrl* ctrl, const LLSD& param)
+{}
+
+bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param)
+{
+ return true;
+}
+
+
+LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb)
{
if (cb.function.isProvided())
{
if (cb.parameter.isProvided())
- sig.connect(boost::bind(cb.function(), _1, cb.parameter));
+ return boost::bind(cb.function(), _1, cb.parameter);
else
- sig.connect(cb.function());
+ return cb.function();
}
else
{
@@ -183,26 +249,27 @@ void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t
if (func)
{
if (cb.parameter.isProvided())
- sig.connect(boost::bind((*func), _1, cb.parameter));
+ return boost::bind((*func), _1, cb.parameter);
else
- sig.connect(*func);
+ return commit_signal_t::slot_type(*func);
}
else if (!function_name.empty())
{
llwarns << "No callback found for: '" << function_name << "' in control: " << getName() << llendl;
}
}
+ return default_commit_handler;
}
-void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig)
+LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCallbackParam& cb)
{
// Set the callback function
if (cb.function.isProvided())
{
if (cb.parameter.isProvided())
- sig.connect(boost::bind(cb.function(), this, cb.parameter));
+ return boost::bind(cb.function(), this, cb.parameter);
else
- sig.connect(cb.function());
+ return cb.function();
}
else
{
@@ -210,53 +277,40 @@ void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t
if (func)
{
if (cb.parameter.isProvided())
- sig.connect(boost::bind((*func), this, cb.parameter));
+ return boost::bind((*func), this, cb.parameter);
else
- sig.connect(*func);
- }
- }
-}
-
-void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig)
-{
- // Set the callback function
- if (cb.function.isProvided())
- {
- if (cb.parameter.isProvided())
- sig.connect(boost::bind(cb.function(), this, cb.parameter));
- else
- sig.connect(cb.function());
- }
- else
- {
- visible_callback_t* func = (VisibleCallbackRegistry::getValue(cb.function_name));
- if (func)
- {
- if (cb.parameter.isProvided())
- sig.connect(boost::bind((*func), this, cb.parameter));
- else
- sig.connect(*func);
+ return enable_signal_t::slot_type(*func);
}
}
+ return default_enable_handler;
}
// virtual
void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask)
{
- mMouseEnterSignal(this, getValue());
+ if (mMouseEnterSignal)
+ {
+ (*mMouseEnterSignal)(this, getValue());
+ }
}
// virtual
void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask)
{
- mMouseLeaveSignal(this, getValue());
+ if(mMouseLeaveSignal)
+ {
+ (*mMouseLeaveSignal)(this, getValue());
+ }
}
//virtual
BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleMouseDown(x,y,mask);
- mMouseDownSignal(this,x,y,mask);
+ if (mMouseDownSignal)
+ {
+ (*mMouseDownSignal)(this,x,y,mask);
+ }
return handled;
}
@@ -264,7 +318,10 @@ BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleMouseUp(x,y,mask);
- mMouseUpSignal(this,x,y,mask);
+ if (mMouseUpSignal)
+ {
+ (*mMouseUpSignal)(this,x,y,mask);
+ }
return handled;
}
@@ -272,7 +329,10 @@ BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleRightMouseDown(x,y,mask);
- mRightMouseDownSignal(this,x,y,mask);
+ if (mRightMouseDownSignal)
+ {
+ (*mRightMouseDownSignal)(this,x,y,mask);
+ }
return handled;
}
@@ -280,14 +340,20 @@ BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLUICtrl::handleRightMouseUp(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleRightMouseUp(x,y,mask);
- mRightMouseUpSignal(this,x,y,mask);
+ if(mRightMouseUpSignal)
+ {
+ (*mRightMouseUpSignal)(this,x,y,mask);
+ }
return handled;
}
BOOL LLUICtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleDoubleClick(x, y, mask);
- mDoubleClickSignal(this, x, y, mask);
+ if (mDoubleClickSignal)
+ {
+ (*mDoubleClickSignal)(this, x, y, mask);
+ }
return handled;
}
@@ -300,7 +366,8 @@ BOOL LLUICtrl::canFocusChildren() const
void LLUICtrl::onCommit()
{
- mCommitSignal(this, getValue());
+ if (mCommitSignal)
+ (*mCommitSignal)(this, getValue());
}
//virtual
@@ -582,7 +649,6 @@ void LLUICtrl::setIsChrome(BOOL is_chrome)
// virtual
BOOL LLUICtrl::getIsChrome() const
{
-
LLView* parent_ctrl = getParent();
while(parent_ctrl)
{
@@ -802,6 +868,14 @@ bool LLUICtrl::findHelpTopic(std::string& help_topic_out)
if (panel)
{
+ // does the panel have a sub-panel with a help topic?
+ LLPanel *subpanel = panel->childGetVisiblePanelWithHelp();
+ if (subpanel)
+ {
+ help_topic_out = subpanel->getHelpTopic();
+ return true; // success (subpanel)
+ }
+
// does the panel have an active tab with a help topic?
LLPanel *tab = panel->childGetVisibleTabWithHelp();
if (tab)
@@ -831,7 +905,8 @@ boost::signals2::connection LLUICtrl::setCommitCallback( boost::function<void (L
}
boost::signals2::connection LLUICtrl::setValidateBeforeCommit( boost::function<bool (const LLSD& data)> cb )
{
- return mValidateSignal.connect(boost::bind(cb, _2));
+ if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+ return mValidateSignal->connect(boost::bind(cb, _2));
}
// virtual
@@ -849,3 +924,57 @@ BOOL LLUICtrl::getTentative() const
// virtual
void LLUICtrl::setColor(const LLColor4& color)
{ }
+
+boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+ return mCommitSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setValidateCallback( const enable_signal_t::slot_type& cb )
+{
+ if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+ return mValidateSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setMouseEnterCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseEnterSignal) mMouseEnterSignal = new commit_signal_t();
+ return mMouseEnterSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setMouseLeaveCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mMouseLeaveSignal) mMouseLeaveSignal = new commit_signal_t();
+ return mMouseLeaveSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setMouseDownCallback( const mouse_signal_t::slot_type& cb )
+{
+ if (!mMouseDownSignal) mMouseDownSignal = new mouse_signal_t();
+ return mMouseDownSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setMouseUpCallback( const mouse_signal_t::slot_type& cb )
+{
+ if (!mMouseUpSignal) mMouseUpSignal = new mouse_signal_t();
+ return mMouseUpSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseDownCallback( const mouse_signal_t::slot_type& cb )
+{
+ if (!mRightMouseDownSignal) mRightMouseDownSignal = new mouse_signal_t();
+ return mRightMouseDownSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseUpCallback( const mouse_signal_t::slot_type& cb )
+{
+ if (!mRightMouseUpSignal) mRightMouseUpSignal = new mouse_signal_t();
+ return mRightMouseUpSignal->connect(cb);
+}
+
+boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal_t::slot_type& cb )
+{
+ if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
+ return mDoubleClickSignal->connect(cb);
+}
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 45fe47772b..b9a4f61e15 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -63,9 +63,6 @@ public:
typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> enable_callback_t;
typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> enable_signal_t;
- typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> visible_callback_t;
- typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> visible_signal_t;
-
struct CallbackParam : public LLInitParam::Block<CallbackParam>
{
Ignored name;
@@ -75,14 +72,7 @@ public:
Optional<std::string> control_name;
- CallbackParam()
- : name("name"),
- function_name("function"),
- parameter("parameter"),
- control_name("control") // Shortcut to control -> "control_name" for backwards compatability
- {
- addSynonym(parameter, "userdata");
- }
+ CallbackParam();
};
struct CommitCallbackParam : public LLInitParam::Block<CommitCallbackParam, CallbackParam >
@@ -90,43 +80,31 @@ public:
Optional<commit_callback_t> function;
};
+ // also used for visible callbacks
struct EnableCallbackParam : public LLInitParam::Block<EnableCallbackParam, CallbackParam >
{
Optional<enable_callback_t> function;
};
-
- struct VisibleCallbackParam : public LLInitParam::Block<VisibleCallbackParam, CallbackParam >
- {
- Optional<visible_callback_t> function;
- };
-
+
struct EnableControls : public LLInitParam::Choice<EnableControls>
{
Alternative<std::string> enabled;
Alternative<std::string> disabled;
- EnableControls()
- : enabled("enabled_control"),
- disabled("disabled_control")
- {}
+ EnableControls();
};
struct ControlVisibility : public LLInitParam::Choice<ControlVisibility>
{
Alternative<std::string> visible;
Alternative<std::string> invisible;
- ControlVisibility()
- : visible("visibility_control"),
- invisible("invisibility_control")
- {
- addSynonym(visible, "visiblity_control");
- addSynonym(invisible, "invisiblity_control");
- }
+ ControlVisibility();
};
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
Optional<std::string> label;
- Optional<bool> tab_stop;
+ Optional<bool> tab_stop,
+ chrome;
Optional<LLSD> initial_value;
Optional<CommitCallbackParam> init_callback,
@@ -161,9 +139,8 @@ protected:
LLUICtrl(const Params& p = getDefaultParams(),
const LLViewModelPtr& viewmodel=LLViewModelPtr(new LLViewModel));
- void initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig);
- void initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig);
- void initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig);
+ commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb);
+ enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb);
// We need this virtual so we can override it with derived versions
virtual LLViewModel* getViewModel() const;
@@ -253,18 +230,18 @@ public:
// topic then put in help_topic_out
bool findHelpTopic(std::string& help_topic_out);
- boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ) { return mCommitSignal.connect(cb); }
- boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ) { return mValidateSignal.connect(cb); }
+ boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb );
- boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); }
- boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); }
+ boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb );
- boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
- boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); }
- boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseDownSignal.connect(cb); }
- boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseUpSignal.connect(cb); }
+ boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
+ boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb );
+ boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb );
+ boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb );
- boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) { return mDoubleClickSignal.connect(cb); }
+ boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb );
// *TODO: Deprecate; for backwards compatability only:
boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data);
@@ -284,26 +261,25 @@ public:
{};
class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>{};
+ // the enable callback registry is also used for visiblity callbacks
class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>{};
- class VisibleCallbackRegistry : public CallbackRegistry<visible_callback_t, VisibleCallbackRegistry>{};
-
-
+
protected:
static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type);
- commit_signal_t mCommitSignal;
- enable_signal_t mValidateSignal;
+ commit_signal_t* mCommitSignal;
+ enable_signal_t* mValidateSignal;
- commit_signal_t mMouseEnterSignal;
- commit_signal_t mMouseLeaveSignal;
+ commit_signal_t* mMouseEnterSignal;
+ commit_signal_t* mMouseLeaveSignal;
- mouse_signal_t mMouseDownSignal;
- mouse_signal_t mMouseUpSignal;
- mouse_signal_t mRightMouseDownSignal;
- mouse_signal_t mRightMouseUpSignal;
+ mouse_signal_t* mMouseDownSignal;
+ mouse_signal_t* mMouseUpSignal;
+ mouse_signal_t* mRightMouseDownSignal;
+ mouse_signal_t* mRightMouseUpSignal;
- mouse_signal_t mDoubleClickSignal;
+ mouse_signal_t* mDoubleClickSignal;
LLViewModelPtr mViewModel;
@@ -327,4 +303,10 @@ private:
class DefaultTabGroupFirstSorter;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLUICTRL_CPP
+extern template class LLUICtrl* LLView::getChild<class LLUICtrl>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif // LL_LLUICTRL_H
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index c3c0daed0f..27237800d4 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -32,6 +32,7 @@
#include "linden_common.h"
+#define LLUICTRLFACTORY_CPP
#include "lluictrlfactory.h"
#include "llxmlnode.h"
@@ -75,6 +76,9 @@ public:
static LLDefaultChildRegistry::Register<LLUICtrlLocate> r1("locate");
+// Build time optimization, generate this once in .cpp file
+template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getInstance();
+
//-----------------------------------------------------------------------------
// LLUICtrlFactory()
//-----------------------------------------------------------------------------
@@ -101,9 +105,12 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa
}
}
+static LLFastTimer::DeclareTimer FTM_CREATE_CHILDREN("Create XUI Children");
+
//static
void LLUICtrlFactory::createChildren(LLView* viewp, LLXMLNodePtr node, const widget_registry_t& registry, LLXMLNodePtr output_node)
{
+ LLFastTimer ft(FTM_CREATE_CHILDREN);
if (node.isNull()) return;
for (LLXMLNodePtr child_node = node->getFirstChild(); child_node.notNull(); child_node = child_node->getNextSibling())
@@ -389,7 +396,7 @@ BOOL LLUICtrlFactory::getAttributeColor(LLXMLNodePtr node, const std::string& na
//static
void LLUICtrlFactory::setCtrlParent(LLView* view, LLView* parent, S32 tab_group)
{
- if (tab_group < 0) tab_group = parent->getLastTabGroup();
+ if (tab_group == S32_MAX) tab_group = parent->getLastTabGroup();
parent->addChild(view, tab_group);
}
@@ -433,8 +440,8 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st
LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);
// associate widget type with factory function
LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func);
- LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
//FIXME: comment this in when working on schema generation
+ //LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>);
}
@@ -449,3 +456,4 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty
{
return LLWidgetNameRegistry::instance().getValue(widget_type);
}
+
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 17e32dc7a9..b1fa6add67 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -108,6 +108,11 @@ extern LLFastTimer::DeclareTimer FTM_WIDGET_SETUP;
extern LLFastTimer::DeclareTimer FTM_WIDGET_CONSTRUCTION;
extern LLFastTimer::DeclareTimer FTM_INIT_FROM_PARAMS;
+// Build time optimization, generate this once in .cpp file
+#ifndef LLUICTRLFACTORY_CPP
+extern template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getInstance();
+#endif
+
class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
{
private:
@@ -175,20 +180,44 @@ public:
void popFactoryFunctions();
template<typename T>
- static T* create(typename T::Params& params, LLView* parent = NULL)
+ static T* createWidget(typename T::Params& params, LLView* parent = NULL)
{
- //#pragma message("Generating LLUICtrlFactory::create")
- params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get());
- //S32 foo = "test";
+ T* widget = NULL;
if (!params.validateBlock())
{
llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl;
+ //return NULL;
+ }
+
+ {
+ LLFastTimer timer(FTM_WIDGET_CONSTRUCTION);
+ widget = new T(params);
}
- T* widget = new T(params);
- widget->initFromParams(params);
+ {
+ LLFastTimer timer(FTM_INIT_FROM_PARAMS);
+ widget->initFromParams(params);
+ }
+
if (parent)
- widget->setParent(parent);
+ {
+ S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : S32_MAX;
+ setCtrlParent(widget, parent, tab_group);
+ }
+ return widget;
+ }
+
+ template<typename T>
+ static T* create(typename T::Params& params, LLView* parent = NULL)
+ {
+ params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get());
+
+ T* widget = createWidget<T>(params, parent);
+ if (widget)
+ {
+ widget->postBuild();
+ }
+
return widget;
}
@@ -197,7 +226,6 @@ public:
template<typename T>
static T* createFromFile(const std::string &filename, LLView *parent, const widget_registry_t& registry, LLXMLNodePtr output_node = NULL)
{
- //#pragma message("Generating LLUICtrlFactory::createFromFile")
T* widget = NULL;
std::string skinned_filename = findSkinnedFilename(filename);
@@ -262,7 +290,6 @@ fail:
{
LLFastTimer timer(FTM_WIDGET_SETUP);
- //#pragma message("Generating LLUICtrlFactory::defaultBuilder")
typename T::Params params(getDefaultParams<T>());
LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName());
@@ -280,36 +307,18 @@ fail:
}
// Apply layout transformations, usually munging rect
- T::setupParams(params, parent);
+ params.from_xui = true;
+ T::applyXUILayout(params, parent);
+ T* widget = createWidget<T>(params, parent);
- if (!params.validateBlock())
- {
- llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl;
- }
- T* widget;
- {
- LLFastTimer timer(FTM_WIDGET_CONSTRUCTION);
- widget = new T(params);
- }
- {
- LLFastTimer timer(FTM_INIT_FROM_PARAMS);
- widget->initFromParams(params);
- }
-
- if (parent)
- {
- S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : -1;
- setCtrlParent(widget, parent, tab_group);
- }
-
typedef typename T::child_registry_t registry_t;
createChildren(widget, node, registry_t::instance(), output_node);
- if (!widget->postBuild())
+ if (widget && !widget->postBuild())
{
delete widget;
- return NULL;
+ widget = NULL;
}
return widget;
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 6c1a32722f..8cd6460b66 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -39,18 +39,20 @@
#include "lluiimage.h"
#include "llui.h"
-LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image) :
- mName(name),
- mImage(image),
- mScaleRegion(0.f, 1.f, 1.f, 0.f),
- mClipRegion(0.f, 1.f, 1.f, 0.f),
- mUniformScaling(TRUE),
- mNoClip(TRUE)
+LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image)
+: mName(name),
+ mImage(image),
+ mScaleRegion(0.f, 1.f, 1.f, 0.f),
+ mClipRegion(0.f, 1.f, 1.f, 0.f),
+ mUniformScaling(TRUE),
+ mNoClip(TRUE),
+ mImageLoaded(NULL)
{
}
LLUIImage::~LLUIImage()
{
+ delete mImageLoaded;
}
void LLUIImage::setClipRegion(const LLRectf& region)
@@ -138,17 +140,54 @@ S32 LLUIImage::getTextureHeight() const
return mImage->getHeight(0);
}
+boost::signals2::connection LLUIImage::addLoadedCallback( const image_loaded_signal_t::slot_type& cb )
+{
+ if (!mImageLoaded)
+ {
+ mImageLoaded = new image_loaded_signal_t();
+ }
+ return mImageLoaded->connect(cb);
+}
+
+
+void LLUIImage::onImageLoaded()
+{
+ if (mImageLoaded)
+ {
+ (*mImageLoaded)();
+ }
+}
+
+
namespace LLInitParam
{
- LLUIImage* TypedParam<LLUIImage*>::getValueFromBlock() const
+ void TypedParam<LLUIImage*>::setValueFromBlock() const
{
+ // The keyword "none" is specifically requesting a null image
+ // do not default to current value. Used to overwrite template images.
+ if (name() == "none")
+ {
+ mData.mValue = NULL;
+ return;
+ }
+
LLUIImage* imagep = LLUI::getUIImage(name());
- if (!imagep)
+ if (imagep)
+ {
+ mData.mValue = imagep;
+ }
+ }
+
+ void TypedParam<LLUIImage*>::setBlockFromValue()
+ {
+ if (mData.mValue == NULL)
+ {
+ name.set("none", false);
+ }
+ else
{
- // default to current value
- imagep = mData.mValue;
+ name.set(mData.mValue->getName(), false);
}
- return imagep;
}
@@ -163,3 +202,4 @@ namespace LLInitParam
return (a == b);
}
}
+
diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h
index 9d734bcfdf..4ea0738026 100644
--- a/indra/llui/lluiimage.h
+++ b/indra/llui/lluiimage.h
@@ -39,6 +39,7 @@
#include "llrefcount.h"
#include "llrect.h"
#include <boost/function.hpp>
+#include <boost/signals2.hpp>
#include "llinitparam.h"
#include "lltexture.h"
@@ -47,6 +48,8 @@ extern const LLColor4 UI_VERTEX_COLOR;
class LLUIImage : public LLRefCount
{
public:
+ typedef boost::signals2::signal<void (void)> image_loaded_signal_t;
+
LLUIImage(const std::string& name, LLPointer<LLTexture> image);
virtual ~LLUIImage();
@@ -77,7 +80,13 @@ public:
S32 getTextureWidth() const;
S32 getTextureHeight() const;
+ boost::signals2::connection addLoadedCallback( const image_loaded_signal_t::slot_type& cb );
+
+ void onImageLoaded();
+
protected:
+ image_loaded_signal_t* mImageLoaded;
+
std::string mName;
LLRectf mScaleRegion;
LLRectf mClipRegion;
@@ -100,9 +109,11 @@ namespace LLInitParam
TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
: super_t(descriptor, name, value, func, min_count, max_count)
{
+ setBlockFromValue();
}
- LLUIImage* getValueFromBlock() const;
+ void setValueFromBlock() const;
+ void setBlockFromValue();
};
// Need custom comparison function for our test app, which only loads
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index 3a1e656364..f7a53e87de 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -39,22 +39,23 @@ LLFastTimer::DeclareTimer FTM_UI_STRING("UI String");
LLUIString::LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args)
- : mOrig(instring),
- mArgs(args)
+: mOrig(instring),
+ mArgs(args)
{
- format();
+ dirty();
}
void LLUIString::assign(const std::string& s)
{
mOrig = s;
- format();
+ dirty();
}
void LLUIString::setArgList(const LLStringUtil::format_map_t& args)
+
{
mArgs = args;
- format();
+ dirty();
}
void LLUIString::setArgs(const LLSD& sd)
@@ -68,40 +69,40 @@ void LLUIString::setArgs(const LLSD& sd)
{
setArg(sd_it->first, sd_it->second.asString());
}
- format();
+ dirty();
}
void LLUIString::setArg(const std::string& key, const std::string& replacement)
{
mArgs[key] = replacement;
- format();
+ dirty();
}
void LLUIString::truncate(S32 maxchars)
{
- if (mWResult.size() > (size_t)maxchars)
+ if (getUpdatedWResult().size() > (size_t)maxchars)
{
- LLWStringUtil::truncate(mWResult, maxchars);
- mResult = wstring_to_utf8str(mWResult);
+ LLWStringUtil::truncate(getUpdatedWResult(), maxchars);
+ mResult = wstring_to_utf8str(getUpdatedWResult());
}
}
void LLUIString::erase(S32 charidx, S32 len)
{
- mWResult.erase(charidx, len);
- mResult = wstring_to_utf8str(mWResult);
+ getUpdatedWResult().erase(charidx, len);
+ mResult = wstring_to_utf8str(getUpdatedWResult());
}
void LLUIString::insert(S32 charidx, const LLWString& wchars)
{
- mWResult.insert(charidx, wchars);
- mResult = wstring_to_utf8str(mWResult);
+ getUpdatedWResult().insert(charidx, wchars);
+ mResult = wstring_to_utf8str(getUpdatedWResult());
}
void LLUIString::replace(S32 charidx, llwchar wc)
{
- mWResult[charidx] = wc;
- mResult = wstring_to_utf8str(mWResult);
+ getUpdatedWResult()[charidx] = wc;
+ mResult = wstring_to_utf8str(getUpdatedWResult());
}
void LLUIString::clear()
@@ -112,8 +113,16 @@ void LLUIString::clear()
mWResult.clear();
}
-void LLUIString::format()
+void LLUIString::dirty()
{
+ mNeedsResult = true;
+ mNeedsWResult = true;
+}
+
+void LLUIString::updateResult() const
+{
+ mNeedsResult = false;
+
LLFastTimer timer(FTM_UI_STRING);
// optimize for empty strings (don't attempt string replacement)
@@ -129,5 +138,11 @@ void LLUIString::format()
LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
combined_args.insert(mArgs.begin(), mArgs.end());
LLStringUtil::format(mResult, combined_args);
- mWResult = utf8str_to_wstring(mResult);
+}
+
+void LLUIString::updateWResult() const
+{
+ mNeedsWResult = false;
+
+ mWResult = utf8str_to_wstring(getUpdatedResult());
}
diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h
index 763de4d6a3..32cfc0d9cd 100644
--- a/indra/llui/lluistring.h
+++ b/indra/llui/lluistring.h
@@ -64,7 +64,7 @@ class LLUIString
public:
// These methods all perform appropriate argument substitution
// and modify mOrig where appropriate
- LLUIString() {}
+ LLUIString() : mNeedsResult(false), mNeedsWResult(false) {}
LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args);
LLUIString(const std::string& instring) { assign(instring); }
@@ -76,19 +76,19 @@ public:
void setArgs(const class LLSD& sd);
void setArg(const std::string& key, const std::string& replacement);
- const std::string& getString() const { return mResult; }
- operator std::string() const { return mResult; }
+ const std::string& getString() const { return getUpdatedResult(); }
+ operator std::string() const { return getUpdatedResult(); }
- const LLWString& getWString() const { return mWResult; }
- operator LLWString() const { return mWResult; }
+ const LLWString& getWString() const { return getUpdatedWResult(); }
+ operator LLWString() const { return getUpdatedWResult(); }
- bool empty() const { return mWResult.empty(); }
- S32 length() const { return mWResult.size(); }
+ bool empty() const { return getUpdatedResult().empty(); }
+ S32 length() const { return getUpdatedWResult().size(); }
void clear();
void clearArgs() { mArgs.clear(); }
- // These utuilty functions are included for text editing.
+ // These utility functions are included for text editing.
// They do not affect mOrig and do not perform argument substitution
void truncate(S32 maxchars);
void erase(S32 charidx, S32 len);
@@ -96,12 +96,24 @@ public:
void replace(S32 charidx, llwchar wc);
private:
- void format();
+ // something changed, requiring reformatting of strings
+ void dirty();
+
+ std::string& getUpdatedResult() const { if (mNeedsResult) { updateResult(); } return mResult; }
+ LLWString& getUpdatedWResult() const{ if (mNeedsWResult) { updateWResult(); } return mWResult; }
+
+ // do actual work of updating strings (non-inlined)
+ void updateResult() const;
+ void updateWResult() const;
std::string mOrig;
- std::string mResult;
- LLWString mWResult; // for displaying
+ mutable std::string mResult;
+ mutable LLWString mWResult; // for displaying
LLStringUtil::format_map_t mArgs;
+
+ // controls lazy evaluation
+ mutable bool mNeedsResult;
+ mutable bool mNeedsWResult;
};
#endif // LL_LLUISTRING_H
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index f3401f91f7..679db5e39b 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -121,6 +121,18 @@ void LLUrlAction::teleportToLocation(std::string url)
}
}
+void LLUrlAction::showLocationOnMap(std::string url)
+{
+ LLUrlMatch match;
+ if (LLUrlRegistry::instance().findUrl(url, match))
+ {
+ if (! match.getLocation().empty())
+ {
+ executeSLURL("secondlife:///app/worldmap/" + match.getLocation());
+ }
+ }
+}
+
void LLUrlAction::copyURLToClipboard(std::string url)
{
LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(url));
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 6b9d565b44..4830cf27ef 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -67,6 +67,9 @@ public:
/// if the Url specifies an SL location, teleport there
static void teleportToLocation(std::string url);
+ /// if the Url specifies an SL location, show it on a map
+ static void showLocationOnMap(std::string url);
+
/// perform the appropriate action for left-clicking on a Url
static void clickAction(std::string url);
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 52e4229fb4..3c73ae9b0c 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -34,12 +34,14 @@
#include "linden_common.h"
#include "llurlentry.h"
#include "lluri.h"
+
#include "llcachename.h"
#include "lltrans.h"
#include "lluicolortable.h"
-LLUrlEntryBase::LLUrlEntryBase()
-: mColor(LLUIColorTable::instance().getColor("HTMLLinkColor"))
+LLUrlEntryBase::LLUrlEntryBase() :
+ mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")),
+ mDisabledLink(false)
{
}
@@ -47,7 +49,7 @@ LLUrlEntryBase::~LLUrlEntryBase()
{
}
-std::string LLUrlEntryBase::getUrl(const std::string &string)
+std::string LLUrlEntryBase::getUrl(const std::string &string) const
{
return escapeUrl(string);
}
@@ -79,7 +81,7 @@ std::string LLUrlEntryBase::escapeUrl(const std::string &url) const
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789"
- "-._~!$?&()*+,@:;=/%";
+ "-._~!$?&()*+,@:;=/%#";
std::sort(no_escape_chars.begin(), no_escape_chars.end());
initialized = true;
@@ -87,7 +89,7 @@ std::string LLUrlEntryBase::escapeUrl(const std::string &url) const
return LLURI::escape(url, no_escape_chars, true);
}
-std::string LLUrlEntryBase::getLabelFromWikiLink(const std::string &url)
+std::string LLUrlEntryBase::getLabelFromWikiLink(const std::string &url) const
{
// return the label part from [http://www.example.org Label]
const char *text = url.c_str();
@@ -100,10 +102,10 @@ std::string LLUrlEntryBase::getLabelFromWikiLink(const std::string &url)
{
start++;
}
- return url.substr(start, url.size()-start-1);
+ return unescapeUrl(url.substr(start, url.size()-start-1));
}
-std::string LLUrlEntryBase::getUrlFromWikiLink(const std::string &string)
+std::string LLUrlEntryBase::getUrlFromWikiLink(const std::string &string) const
{
// return the url part from [http://www.example.org Label]
const char *text = string.c_str();
@@ -145,6 +147,18 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab
}
}
+static std::string getStringAfterToken(const std::string str, const std::string token)
+{
+ size_t pos = str.find(token);
+ if (pos == std::string::npos)
+ {
+ return "";
+ }
+
+ pos += token.size();
+ return str.substr(pos, str.size() - pos);
+}
+
//
// LLUrlEntryHTTP Describes generic http: and https: Urls
//
@@ -154,7 +168,6 @@ LLUrlEntryHTTP::LLUrlEntryHTTP()
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_http.xml";
mTooltip = LLTrans::getString("TooltipHttpUrl");
- //mIcon = "gear.tga";
}
std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -179,18 +192,47 @@ std::string LLUrlEntryHTTPLabel::getLabel(const std::string &url, const LLUrlLab
return getLabelFromWikiLink(url);
}
-std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string)
+std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) const
{
return getUrlFromWikiLink(string);
}
//
+// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com
+//
+LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol()
+{
+ mPattern = boost::regex("("
+ "\\bwww\\.\\S+\\.\\S+" // i.e. www.FOO.BAR
+ "|" // or
+ "(?<!@)\\b[^[:space:]:@/>]+\\.(?:com|net|edu|org)([/:][^[:space:]<]*)?\\b" // i.e. FOO.net
+ ")",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_http.xml";
+ mTooltip = LLTrans::getString("TooltipHttpUrl");
+}
+
+std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ return unescapeUrl(url);
+}
+
+std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const
+{
+ if (string.find("://") == std::string::npos)
+ {
+ return "http://" + escapeUrl(string);
+ }
+ return escapeUrl(string);
+}
+
+//
// LLUrlEntrySLURL Describes generic http: and https: Urls
//
LLUrlEntrySLURL::LLUrlEntrySLURL()
{
// see http://slurl.com/about.php for details on the SLURL format
- mPattern = boost::regex("http://slurl.com/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
+ mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_slurl.xml";
mTooltip = LLTrans::getString("TooltipSLURL");
@@ -245,7 +287,7 @@ std::string LLUrlEntrySLURL::getLabel(const std::string &url, const LLUrlLabelCa
std::string LLUrlEntrySLURL::getLocation(const std::string &url) const
{
// return the part of the Url after slurl.com/secondlife/
- const std::string search_string = "secondlife";
+ const std::string search_string = "/secondlife";
size_t pos = url.find(search_string);
if (pos == std::string::npos)
{
@@ -372,6 +414,26 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa
}
}
+//
+// LLUrlEntryInventory Describes a Second Life inventory Url, e.g.,
+// secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select
+//
+LLUrlEntryInventory::LLUrlEntryInventory()
+{
+ //*TODO: add supporting of inventory item names with whitespaces
+ //this pattern cann't parse for example
+ //secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select?name=name with spaces&param2=value
+ mPattern = boost::regex("secondlife:///app/inventory/[\\da-f-]+/\\w+\\S*",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_inventory.xml";
+}
+
+std::string LLUrlEntryInventory::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ std::string label = getStringAfterToken(url, "name=");
+ return LLURI::unescape(label.empty() ? url : label);
+}
+
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
@@ -390,7 +452,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC
}
//
-// LLUrlEntryPlace Describes secondlife:///<location> URLs
+// LLUrlEntryPlace Describes secondlife://<location> URLs
//
LLUrlEntryPlace::LLUrlEntryPlace()
{
@@ -433,15 +495,7 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa
std::string LLUrlEntryPlace::getLocation(const std::string &url) const
{
// return the part of the Url after secondlife:// part
- const std::string search_string = "://";
- size_t pos = url.find(search_string);
- if (pos == std::string::npos)
- {
- return "";
- }
-
- pos += search_string.size();
- return url.substr(pos, url.size() - pos);
+ return ::getStringAfterToken(url, "://");
}
//
@@ -468,6 +522,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
LLURI uri(url);
LLSD path_array = uri.pathArray();
S32 path_parts = path_array.size();
+ const std::string label = LLTrans::getString("SLurlLabelTeleport");
if (path_parts == 6)
{
// handle teleport url with (X,Y,Z) coordinates
@@ -475,7 +530,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
std::string x = path_array[path_parts-3];
std::string y = path_array[path_parts-2];
std::string z = path_array[path_parts-1];
- return "Teleport to " + location + " (" + x + "," + y + "," + z + ")";
+ return label + " " + location + " (" + x + "," + y + "," + z + ")";
}
else if (path_parts == 5)
{
@@ -483,20 +538,20 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
std::string location = unescapeUrl(path_array[path_parts-3]);
std::string x = path_array[path_parts-2];
std::string y = path_array[path_parts-1];
- return "Teleport to " + location + " (" + x + "," + y + ")";
+ return label + " " + location + " (" + x + "," + y + ")";
}
else if (path_parts == 4)
{
// handle teleport url with (X) coordinate only
std::string location = unescapeUrl(path_array[path_parts-2]);
std::string x = path_array[path_parts-1];
- return "Teleport to " + location + " (" + x + ")";
+ return label + " " + location + " (" + x + ")";
}
else if (path_parts == 3)
{
// handle teleport url with no coordinates
std::string location = unescapeUrl(path_array[path_parts-1]);
- return "Teleport to " + location;
+ return label + " " + location;
}
return url;
@@ -505,59 +560,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
std::string LLUrlEntryTeleport::getLocation(const std::string &url) const
{
// return the part of the Url after ///app/teleport
- const std::string search_string = "teleport";
- size_t pos = url.find(search_string);
- if (pos == std::string::npos)
- {
- return "";
- }
-
- pos += search_string.size() + 1;
- return url.substr(pos, url.size() - pos);
-}
-
-///
-/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g.,
-/// secondlife:///app/objectim/<sessionid>
-///
-LLUrlEntryObjectIM::LLUrlEntryObjectIM()
-{
- mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\\??\\S*",
- boost::regex::perl|boost::regex::icase);
- mMenuName = "menu_url_objectim.xml";
- mTooltip = LLTrans::getString("TooltipObjectIMUrl");
-}
-
-std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
-{
- LLURI uri(url);
- LLSD params = uri.queryMap();
- if (params.has("name"))
- {
- // look for a ?name=<obj-name> param in the url
- // and use that as the label if present.
- std::string name = params.get("name");
- LLStringUtil::trim(name);
- if (name.empty())
- {
- name = LLTrans::getString("Unnamed");
- }
- return name;
- }
-
- return unescapeUrl(url);
-}
-
-std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
-{
- LLURI uri(url);
- LLSD params = uri.queryMap();
- if (params.has("slurl"))
- {
- return params.get("slurl");
- }
-
- return "";
+ return ::getStringAfterToken(url, "app/teleport/");
}
//
@@ -594,8 +597,69 @@ std::string LLUrlEntrySLLabel::getLabel(const std::string &url, const LLUrlLabel
return getLabelFromWikiLink(url);
}
-std::string LLUrlEntrySLLabel::getUrl(const std::string &string)
+std::string LLUrlEntrySLLabel::getUrl(const std::string &string) const
{
return getUrlFromWikiLink(string);
}
+//
+// LLUrlEntryWorldMap Describes secondlife:///<location> URLs
+//
+LLUrlEntryWorldMap::LLUrlEntryWorldMap()
+{
+ mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_map.xml";
+ mTooltip = LLTrans::getString("TooltipMapUrl");
+}
+
+std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ //
+ // we handle SLURLs in the following formats:
+ // - secondlife:///app/worldmap/PLACE/X/Y/Z
+ // - secondlife:///app/worldmap/PLACE/X/Y
+ // - secondlife:///app/worldmap/PLACE/X
+ //
+ LLURI uri(url);
+ LLSD path_array = uri.pathArray();
+ S32 path_parts = path_array.size();
+ if (path_parts < 3)
+ {
+ return url;
+ }
+
+ const std::string label = LLTrans::getString("SLurlLabelShowOnMap");
+ std::string location = path_array[2];
+ std::string x = (path_parts > 3) ? path_array[3] : "128";
+ std::string y = (path_parts > 4) ? path_array[4] : "128";
+ std::string z = (path_parts > 5) ? path_array[5] : "0";
+ return label + " " + location + " (" + x + "," + y + "," + z + ")";
+}
+
+std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
+{
+ // return the part of the Url after secondlife:///app/worldmap/ part
+ return ::getStringAfterToken(url, "app/worldmap/");
+}
+
+//
+// LLUrlEntryNoLink lets us turn of URL detection with <nolink>...</nolink> tags
+//
+LLUrlEntryNoLink::LLUrlEntryNoLink()
+{
+ mPattern = boost::regex("<nolink>[^<]*</nolink>",
+ boost::regex::perl|boost::regex::icase);
+ mDisabledLink = true;
+}
+
+std::string LLUrlEntryNoLink::getUrl(const std::string &url) const
+{
+ // return the text between the <nolink> and </nolink> tags
+ return url.substr(8, url.size()-8-9);
+}
+
+std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ return getUrl(url);
+}
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index afb2fdcde9..3abada0f24 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -71,7 +71,7 @@ public:
boost::regex getPattern() const { return mPattern; }
/// Return the url from a string that matched the regex
- virtual std::string getUrl(const std::string &string);
+ virtual std::string getUrl(const std::string &string) const;
/// Given a matched Url, return a label for the Url
virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; }
@@ -91,12 +91,15 @@ public:
/// Return the name of a SL location described by this Url, if any
virtual std::string getLocation(const std::string &url) const { return ""; }
+ /// is this a match for a URL that should not be hyperlinked?
+ bool isLinkDisabled() const { return mDisabledLink; }
+
protected:
std::string getIDStringFromUrl(const std::string &url) const;
std::string escapeUrl(const std::string &url) const;
std::string unescapeUrl(const std::string &url) const;
- std::string getLabelFromWikiLink(const std::string &url);
- std::string getUrlFromWikiLink(const std::string &string);
+ std::string getLabelFromWikiLink(const std::string &url) const;
+ std::string getUrlFromWikiLink(const std::string &string) const;
void addObserver(const std::string &id, const std::string &url, const LLUrlLabelCallback &cb);
void callObservers(const std::string &id, const std::string &label);
@@ -111,6 +114,7 @@ protected:
std::string mTooltip;
LLUIColor mColor;
std::multimap<std::string, LLUrlEntryObserver> mObservers;
+ bool mDisabledLink;
};
///
@@ -131,7 +135,18 @@ class LLUrlEntryHTTPLabel : public LLUrlEntryBase
public:
LLUrlEntryHTTPLabel();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
- /*virtual*/ std::string getUrl(const std::string &string);
+ /*virtual*/ std::string getUrl(const std::string &string) const;
+};
+
+///
+/// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com
+///
+class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryHTTPNoProtocol();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getUrl(const std::string &string) const;
};
///
@@ -174,6 +189,19 @@ private:
};
///
+/// LLUrlEntryInventory Describes a Second Life inventory Url, e.g.,
+/// secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select
+///
+class LLUrlEntryInventory : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryInventory();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+private:
+};
+
+
+///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
///
@@ -186,7 +214,7 @@ public:
///
/// LLUrlEntryPlace Describes a Second Life location Url, e.g.,
-/// secondlife:///Ahern/50/50/50
+/// secondlife://Ahern/50/50/50
///
class LLUrlEntryPlace : public LLUrlEntryBase
{
@@ -209,18 +237,6 @@ public:
};
///
-/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g.,
-/// secondlife:///app/objectim/<sessionid>?name=Foo
-///
-class LLUrlEntryObjectIM : public LLUrlEntryBase
-{
-public:
- LLUrlEntryObjectIM();
- /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
- /*virtual*/ std::string getLocation(const std::string &url) const;
-};
-
-///
/// LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts
/// with secondlife:// (used as a catch-all for cases not matched above)
///
@@ -240,7 +256,30 @@ class LLUrlEntrySLLabel : public LLUrlEntryBase
public:
LLUrlEntrySLLabel();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
- /*virtual*/ std::string getUrl(const std::string &string);
+ /*virtual*/ std::string getUrl(const std::string &string) const;
+};
+
+///
+/// LLUrlEntryWorldMap Describes a Second Life worldmap Url, e.g.,
+/// secondlife:///app/worldmap/Ahern/50/50/50
+///
+class LLUrlEntryWorldMap : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryWorldMap();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getLocation(const std::string &url) const;
+};
+
+///
+/// LLUrlEntryNoLink lets us turn of URL detection with <nolink>...</nolink> tags
+///
+class LLUrlEntryNoLink : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryNoLink();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getUrl(const std::string &string) const;
};
#endif
diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp
index 3b47145a22..72a199c220 100644
--- a/indra/llui/llurlmatch.cpp
+++ b/indra/llui/llurlmatch.cpp
@@ -41,14 +41,17 @@ LLUrlMatch::LLUrlMatch() :
mLabel(""),
mTooltip(""),
mIcon(""),
- mMenuName("")
+ mMenuName(""),
+ mLocation(""),
+ mDisabledLink(false)
{
}
void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,
const std::string &label, const std::string &tooltip,
const std::string &icon, const LLUIColor& color,
- const std::string &menu, const std::string &location)
+ const std::string &menu, const std::string &location,
+ bool disabled_link)
{
mStart = start;
mEnd = end;
@@ -59,4 +62,5 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,
mColor = color;
mMenuName = menu;
mLocation = location;
+ mDisabledLink = disabled_link;
}
diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h
index 7f5767923a..e86762548b 100644
--- a/indra/llui/llurlmatch.h
+++ b/indra/llui/llurlmatch.h
@@ -83,11 +83,14 @@ public:
/// return the SL location that this Url describes, or "" if none.
std::string getLocation() const { return mLocation; }
+ /// is this a match for a URL that should not be hyperlinked?
+ bool isLinkDisabled() const { return mDisabledLink; }
+
/// Change the contents of this match object (used by LLUrlRegistry)
void setValues(U32 start, U32 end, const std::string &url, const std::string &label,
const std::string &tooltip, const std::string &icon,
const LLUIColor& color, const std::string &menu,
- const std::string &location);
+ const std::string &location, bool disabled_link);
private:
U32 mStart;
@@ -99,6 +102,7 @@ private:
std::string mMenuName;
std::string mLocation;
LLUIColor mColor;
+ bool mDisabledLink;
};
#endif
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 249c7320d6..722dbe41b3 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -44,6 +44,7 @@ void LLUrlRegistryNullCallback(const std::string &url, const std::string &label)
LLUrlRegistry::LLUrlRegistry()
{
// Urls are matched in the order that they were registered
+ registerUrl(new LLUrlEntryNoLink());
registerUrl(new LLUrlEntrySLURL());
registerUrl(new LLUrlEntryHTTP());
registerUrl(new LLUrlEntryHTTPLabel());
@@ -51,10 +52,16 @@ LLUrlRegistry::LLUrlRegistry()
registerUrl(new LLUrlEntryGroup());
registerUrl(new LLUrlEntryParcel());
registerUrl(new LLUrlEntryTeleport());
- registerUrl(new LLUrlEntryObjectIM());
+ registerUrl(new LLUrlEntryWorldMap());
registerUrl(new LLUrlEntryPlace());
+ registerUrl(new LLUrlEntryInventory());
+ //LLUrlEntrySL and LLUrlEntrySLLabel have more common pattern,
+ //so it should be registered in the end of list
registerUrl(new LLUrlEntrySL());
registerUrl(new LLUrlEntrySLLabel());
+ // most common pattern is a URL without any protocol,
+ // e.g., "secondlife.com"
+ registerUrl(new LLUrlEntryHTTPNoProtocol());
}
LLUrlRegistry::~LLUrlRegistry()
@@ -115,10 +122,24 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en
return true;
}
+static bool stringHasUrl(const std::string &text)
+{
+ // fast heuristic test for a URL in a string. This is used
+ // to avoid lots of costly regex calls, BUT it needs to be
+ // kept in sync with the LLUrlEntry regexes we support.
+ return (text.find("://") != std::string::npos ||
+ text.find("www.") != std::string::npos ||
+ text.find(".com") != std::string::npos ||
+ text.find(".net") != std::string::npos ||
+ text.find(".edu") != std::string::npos ||
+ text.find(".org") != std::string::npos ||
+ text.find("<nolink>") != std::string::npos);
+}
+
bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb)
{
// avoid costly regexes if there is clearly no URL in the text
- if (text.find("://") == std::string::npos)
+ if (! stringHasUrl(text))
{
return false;
}
@@ -157,7 +178,8 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
match_entry->getIcon(),
match_entry->getColor(),
match_entry->getMenuName(),
- match_entry->getLocation(url));
+ match_entry->getLocation(url),
+ match_entry->isLinkDisabled());
return true;
}
@@ -185,9 +207,13 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr
S32 end = start + wurl.size() - 1;
match.setValues(start, end, match.getUrl(),
- match.getLabel(), match.getTooltip(),
- match.getIcon(), match.getColor(),
- match.getMenuName(), match.getLocation());
+ match.getLabel(),
+ match.getTooltip(),
+ match.getIcon(),
+ match.getColor(),
+ match.getMenuName(),
+ match.getLocation(),
+ match.isLinkDisabled());
return true;
}
return false;
@@ -204,3 +230,23 @@ bool LLUrlRegistry::hasUrl(const LLWString &text)
LLUrlMatch match;
return findUrl(text, match);
}
+
+bool LLUrlRegistry::isUrl(const std::string &text)
+{
+ LLUrlMatch match;
+ if (findUrl(text, match))
+ {
+ return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+ }
+ return false;
+}
+
+bool LLUrlRegistry::isUrl(const LLWString &text)
+{
+ LLUrlMatch match;
+ if (findUrl(text, match))
+ {
+ return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+ }
+ return false;
+}
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index d7800d8cfc..399ee0a988 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -85,6 +85,10 @@ public:
bool hasUrl(const std::string &text);
bool hasUrl(const LLWString &text);
+ // return true if the given string is a URL that findUrl would match
+ bool isUrl(const std::string &text);
+ bool isUrl(const LLWString &text);
+
private:
LLUrlRegistry();
friend class LLSingleton<LLUrlRegistry>;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index fe7fd59de8..63e627ceb5 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -33,6 +33,7 @@
#include "linden_common.h"
+#define LLVIEW_CPP
#include "llview.h"
#include <cassert>
@@ -40,7 +41,6 @@
#include "llrender.h"
#include "llevent.h"
-#include "llfontgl.h"
#include "llfocusmgr.h"
#include "llrect.h"
#include "llstl.h"
@@ -77,8 +77,17 @@ std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
BOOL LLView::sIsDrawing = FALSE;
#endif
+// Compiler optimization, generate extern template
+template class LLView* LLView::getChild<class LLView>(
+ const std::string& name, BOOL recurse) const;
+
static LLDefaultChildRegistry::Register<LLView> r("view");
+LLView::Follows::Follows()
+: string(""),
+ flags("flags", FOLLOWS_LEFT | FOLLOWS_TOP)
+{}
+
LLView::Params::Params()
: name("name", std::string("unnamed")),
enabled("enabled", true),
@@ -117,7 +126,7 @@ LLView::LLView(const LLView::Params& p)
: mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
- mSaveToXML(p.from_xui),
+ mFromXUI(p.from_xui),
mIsFocusRoot(FALSE),
mLastVisible(FALSE),
mNextInsertionOrdinal(0),
@@ -1698,8 +1707,11 @@ LLView* LLView::getChildView(const std::string& name, BOOL recurse) const
return child;
}
+static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets");
+
LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
{
+ LLFastTimer ft(FTM_FIND_VIEWS);
//richard: should we allow empty names?
//if(name.empty())
// return NULL;
@@ -1708,6 +1720,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
if (childp->getName() == name)
{
return childp;
@@ -1719,6 +1732,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
{
@@ -2467,7 +2481,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
for (;itor != parent->getChildList()->end(); ++itor)
{
LLView *last_view = (*itor);
- if (last_view->getSaveToXML())
+ if (last_view->getFromXUI())
{
*rect = last_view->getRect();
return true;
@@ -2477,13 +2491,11 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
}
//static
-void LLView::setupParams(LLView::Params& p, LLView* parent)
+void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
{
const S32 VPAD = 4;
const S32 MIN_WIDGET_HEIGHT = 10;
- p.from_xui(true);
-
// *NOTE: This will confuse export of floater/panel coordinates unless
// the default is also "topleft". JC
if (p.layout().empty() && parent)
@@ -2491,6 +2503,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
p.layout = parent->getLayout();
}
+
if (parent)
{
LLRect parent_rect = parent->getLocalRect();
@@ -2506,7 +2519,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
}
// convert negative or centered coordinates to parent relative values
- // Note: some of this logic matches the logic in TypedParam<LLRect>::getValueFromBlock()
+ // Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock()
if (p.center_horiz)
{
@@ -2521,12 +2534,13 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
else
{
p.rect.left = p.rect.left + parent_rect.getWidth()/2 - p.rect.width/2;
+ p.rect.right.setProvided(false); // recalculate the right
}
}
else
{
- if (p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
- if (p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
+ if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
+ if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
}
if (p.center_vert)
{
@@ -2541,17 +2555,18 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
else
{
p.rect.bottom = p.rect.bottom + parent_rect.getHeight()/2 - p.rect.height/2;
+ p.rect.top.setProvided(false); // recalculate the top
}
}
else
{
- if (p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
- if (p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
+ if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
+ if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
}
// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
- if (!p.rect.height.isProvided() && !p.rect.top.isProvided())
+ if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
{
p.rect.height = MIN_WIDGET_HEIGHT;
}
@@ -2650,7 +2665,7 @@ static void convert_to_relative_layout(LLView::Params& p, LLView* parent)
// Use setupParams to get the final widget rectangle
// according to our wacky layout rules.
LLView::Params final = p;
- LLView::setupParams(final, parent);
+ LLView::applyXUILayout(final, parent);
// Must actually extract the rectangle to get consistent
// right = left+width, top = bottom+height
LLRect final_rect = final.rect;
@@ -2836,18 +2851,21 @@ LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
return *mDefaultWidgets;
}
-void LLView::notifyParent(const LLSD& info)
+S32 LLView::notifyParent(const LLSD& info)
{
LLView* parent = getParent();
if(parent)
- parent->notifyParent(info);
+ return parent->notifyParent(info);
+ return 0;
}
-void LLView::notifyChildren(const LLSD& info)
+bool LLView::notifyChildren(const LLSD& info)
{
+ bool ret = false;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
- (*child_it)->notifyChildren(info);
+ ret |= (*child_it)->notifyChildren(info);
}
+ return ret;
}
// convenient accessor for draw context
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index c3b442e022..c4d7313743 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -111,10 +111,7 @@ public:
Alternative<std::string> string;
Alternative<U32> flags;
- Follows()
- : string(""),
- flags("flags", FOLLOWS_LEFT | FOLLOWS_TOP)
- {}
+ Follows();
};
struct Params : public LLInitParam::Block<Params>
@@ -267,9 +264,6 @@ public:
// remove the specified child from the view, and set it's parent to NULL.
virtual void removeChild(LLView* view);
- // helper function for lluictrlfactory.h create<> template
- void setParent(LLView* parent) { if (parent) parent->addChild(this); }
-
virtual BOOL postBuild() { return TRUE; }
child_tab_order_t getCtrlOrder() const { return mCtrlOrder; }
@@ -401,8 +395,8 @@ public:
void parseFollowsFlags(const LLView::Params& params);
// Some widgets, like close box buttons, don't need to be saved
- BOOL getSaveToXML() const { return mSaveToXML; }
- void setSaveToXML(BOOL b) { mSaveToXML = b; }
+ BOOL getFromXUI() const { return mFromXUI; }
+ void setFromXUI(BOOL b) { mFromXUI = b; }
typedef enum e_hit_test_type
{
@@ -504,7 +498,7 @@ public:
// Set up params after XML load before calling new(),
// usually to adjust layout.
- static void setupParams(Params& p, LLView* parent);
+ static void applyXUILayout(Params& p, LLView* parent);
// For re-export of floaters and panels, convert the coordinate system
// to be top-left based.
@@ -517,8 +511,15 @@ public:
virtual void handleReshape(const LLRect& rect, bool by_user);
virtual void dirtyRect();
- virtual void notifyParent(const LLSD& info);
- virtual void notifyChildren(const LLSD& info);
+ //send custom notification to LLView parent
+ virtual S32 notifyParent(const LLSD& info);
+
+ //send custom notification to all view childrend
+ // return true if _any_ children return true. otherwise false.
+ virtual bool notifyChildren(const LLSD& info);
+
+ //send custom notification to current view
+ virtual S32 notify(const LLSD& info) { return 0;};
static const LLViewDrawContext& getDrawContext();
@@ -572,7 +573,7 @@ private:
LLUIString mToolTipMsg; // isNull() is true if none.
U8 mSoundFlags;
- BOOL mSaveToXML;
+ BOOL mFromXUI;
BOOL mIsFocusRoot;
BOOL mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
@@ -662,4 +663,11 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
return result;
}
+// Compiler optimization - don't generate these specializations inline,
+// require explicit specialization. See llbutton.cpp for an example.
+#ifndef LLVIEW_CPP
+extern template class LLView* LLView::getChild<class LLView>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif //LL_LLVIEW_H
diff --git a/indra/llui/llviewmodel.h b/indra/llui/llviewmodel.h
index c8a9b52cca..992365d44d 100644
--- a/indra/llui/llviewmodel.h
+++ b/indra/llui/llviewmodel.h
@@ -107,7 +107,8 @@ public:
// New functions
/// Get the stored value in string form
- LLWString getDisplay() const { return mDisplay; }
+ const LLWString& getDisplay() const { return mDisplay; }
+
/**
* Set the display string directly (see LLTextEditor). What the user is
* editing is actually the LLWString value rather than the underlying
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 128cd134c1..cbb303a059 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -33,7 +33,7 @@ LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& defa
return LLUIColor();
}
-LLUIColor::LLUIColor() {}
+LLUIColor::LLUIColor() : mColorPtr(NULL) {}
namespace tut
{
@@ -52,9 +52,10 @@ namespace
namespace tut
{
- void testRegex(const std::string &testname, boost::regex regex,
+ void testRegex(const std::string &testname, LLUrlEntryBase &entry,
const char *text, const std::string &expected)
{
+ boost::regex regex = entry.getPattern();
std::string url = "";
boost::cmatch result;
bool found = boost::regex_search(text, result, regex);
@@ -62,7 +63,7 @@ namespace tut
{
S32 start = static_cast<U32>(result[0].first - text);
S32 end = static_cast<U32>(result[0].second - text);
- url = std::string(text+start, end-start);
+ url = entry.getUrl(std::string(text+start, end-start));
}
ensure_equals(testname, url, expected);
}
@@ -74,74 +75,73 @@ namespace tut
// test LLUrlEntryHTTP - standard http Urls
//
LLUrlEntryHTTP url;
- boost::regex r = url.getPattern();
- testRegex("no valid url", r,
+ testRegex("no valid url", url,
"htp://slurl.com/",
"");
- testRegex("simple http (1)", r,
+ testRegex("simple http (1)", url,
"http://slurl.com/",
"http://slurl.com/");
- testRegex("simple http (2)", r,
+ testRegex("simple http (2)", url,
"http://slurl.com",
"http://slurl.com");
- testRegex("simple http (3)", r,
+ testRegex("simple http (3)", url,
"http://slurl.com/about.php",
"http://slurl.com/about.php");
- testRegex("simple https", r,
+ testRegex("simple https", url,
"https://slurl.com/about.php",
"https://slurl.com/about.php");
- testRegex("http in text (1)", r,
+ testRegex("http in text (1)", url,
"XX http://slurl.com/ XX",
"http://slurl.com/");
- testRegex("http in text (2)", r,
+ testRegex("http in text (2)", url,
"XX http://slurl.com/about.php XX",
"http://slurl.com/about.php");
- testRegex("https in text", r,
+ testRegex("https in text", url,
"XX https://slurl.com/about.php XX",
"https://slurl.com/about.php");
- testRegex("two http urls", r,
+ testRegex("two http urls", url,
"XX http://slurl.com/about.php http://secondlife.com/ XX",
"http://slurl.com/about.php");
- testRegex("http url with port and username", r,
+ testRegex("http url with port and username", url,
"XX http://nobody@slurl.com:80/about.php http://secondlife.com/ XX",
"http://nobody@slurl.com:80/about.php");
- testRegex("http url with port, username, and query string", r,
+ testRegex("http url with port, username, and query string", url,
"XX http://nobody@slurl.com:80/about.php?title=hi%20there http://secondlife.com/ XX",
"http://nobody@slurl.com:80/about.php?title=hi%20there");
// note: terminating commas will be removed by LLUrlRegistry:findUrl()
- testRegex("http url with commas in middle and terminating", r,
+ testRegex("http url with commas in middle and terminating", url,
"XX http://slurl.com/?title=Hi,There, XX",
"http://slurl.com/?title=Hi,There,");
// note: terminating periods will be removed by LLUrlRegistry:findUrl()
- testRegex("http url with periods in middle and terminating", r,
+ testRegex("http url with periods in middle and terminating", url,
"XX http://slurl.com/index.php. XX",
"http://slurl.com/index.php.");
// DEV-19842: Closing parenthesis ")" breaks urls
- testRegex("http url with brackets (1)", r,
+ testRegex("http url with brackets (1)", url,
"XX http://en.wikipedia.org/wiki/JIRA_(software) XX",
"http://en.wikipedia.org/wiki/JIRA_(software)");
// DEV-19842: Closing parenthesis ")" breaks urls
- testRegex("http url with brackets (2)", r,
+ testRegex("http url with brackets (2)", url,
"XX http://jira.secondlife.com/secure/attachment/17990/eggy+avs+in+1.21.0+(93713)+public+nightly.jpg XX",
"http://jira.secondlife.com/secure/attachment/17990/eggy+avs+in+1.21.0+(93713)+public+nightly.jpg");
// DEV-10353: URLs in chat log terminated incorrectly when newline in chat
- testRegex("http url with newlines", r,
+ testRegex("http url with newlines", url,
"XX\nhttp://www.secondlife.com/\nXX",
"http://www.secondlife.com/");
}
@@ -153,39 +153,38 @@ namespace tut
// test LLUrlEntryHTTPLabel - wiki-style http Urls with labels
//
LLUrlEntryHTTPLabel url;
- boost::regex r = url.getPattern();
- testRegex("invalid wiki url [1]", r,
+ testRegex("invalid wiki url [1]", url,
"[http://www.example.org]",
"");
- testRegex("invalid wiki url [2]", r,
+ testRegex("invalid wiki url [2]", url,
"[http://www.example.org",
"");
- testRegex("invalid wiki url [3]", r,
+ testRegex("invalid wiki url [3]", url,
"[http://www.example.org Label",
"");
- testRegex("example.org with label (spaces)", r,
+ testRegex("example.org with label (spaces)", url,
"[http://www.example.org Text]",
- "[http://www.example.org Text]");
+ "http://www.example.org");
- testRegex("example.org with label (tabs)", r,
+ testRegex("example.org with label (tabs)", url,
"[http://www.example.org\t Text]",
- "[http://www.example.org\t Text]");
+ "http://www.example.org");
- testRegex("SL http URL with label", r,
+ testRegex("SL http URL with label", url,
"[http://www.secondlife.com/ Second Life]",
- "[http://www.secondlife.com/ Second Life]");
+ "http://www.secondlife.com/");
- testRegex("SL https URL with label", r,
+ testRegex("SL https URL with label", url,
"XXX [https://www.secondlife.com/ Second Life] YYY",
- "[https://www.secondlife.com/ Second Life]");
+ "https://www.secondlife.com/");
- testRegex("SL http URL with label", r,
+ testRegex("SL http URL with label", url,
"[http://www.secondlife.com/?test=Hi%20There Second Life]",
- "[http://www.secondlife.com/?test=Hi%20There Second Life]");
+ "http://www.secondlife.com/?test=Hi%20There");
}
template<> template<>
@@ -195,69 +194,68 @@ namespace tut
// test LLUrlEntrySLURL - second life URLs
//
LLUrlEntrySLURL url;
- boost::regex r = url.getPattern();
- testRegex("no valid slurl [1]", r,
+ testRegex("no valid slurl [1]", url,
"htp://slurl.com/secondlife/Ahern/50/50/50/",
"");
- testRegex("no valid slurl [2]", r,
+ testRegex("no valid slurl [2]", url,
"http://slurl.com/secondlife/",
"");
- testRegex("no valid slurl [3]", r,
+ testRegex("no valid slurl [3]", url,
"hhtp://slurl.com/secondlife/Ahern/50/FOO/50/",
"");
- testRegex("Ahern (50,50,50) [1]", r,
+ testRegex("Ahern (50,50,50) [1]", url,
"http://slurl.com/secondlife/Ahern/50/50/50/",
"http://slurl.com/secondlife/Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [2]", r,
+ testRegex("Ahern (50,50,50) [2]", url,
"XXX http://slurl.com/secondlife/Ahern/50/50/50/ XXX",
"http://slurl.com/secondlife/Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [3]", r,
+ testRegex("Ahern (50,50,50) [3]", url,
"XXX http://slurl.com/secondlife/Ahern/50/50/50 XXX",
"http://slurl.com/secondlife/Ahern/50/50/50");
- testRegex("Ahern (50,50,50) multicase", r,
+ testRegex("Ahern (50,50,50) multicase", url,
"XXX http://SLUrl.com/SecondLife/Ahern/50/50/50/ XXX",
"http://SLUrl.com/SecondLife/Ahern/50/50/50/");
- testRegex("Ahern (50,50) [1]", r,
+ testRegex("Ahern (50,50) [1]", url,
"XXX http://slurl.com/secondlife/Ahern/50/50/ XXX",
"http://slurl.com/secondlife/Ahern/50/50/");
- testRegex("Ahern (50,50) [2]", r,
+ testRegex("Ahern (50,50) [2]", url,
"XXX http://slurl.com/secondlife/Ahern/50/50 XXX",
"http://slurl.com/secondlife/Ahern/50/50");
- testRegex("Ahern (50)", r,
+ testRegex("Ahern (50)", url,
"XXX http://slurl.com/secondlife/Ahern/50 XXX",
"http://slurl.com/secondlife/Ahern/50");
- testRegex("Ahern", r,
+ testRegex("Ahern", url,
"XXX http://slurl.com/secondlife/Ahern/ XXX",
"http://slurl.com/secondlife/Ahern/");
- testRegex("Ahern SLURL with title", r,
+ testRegex("Ahern SLURL with title", url,
"XXX http://slurl.com/secondlife/Ahern/50/50/50/?title=YOUR%20TITLE%20HERE! XXX",
"http://slurl.com/secondlife/Ahern/50/50/50/?title=YOUR%20TITLE%20HERE!");
- testRegex("Ahern SLURL with msg", r,
+ testRegex("Ahern SLURL with msg", url,
"XXX http://slurl.com/secondlife/Ahern/50/50/50/?msg=Your%20text%20here. XXX",
"http://slurl.com/secondlife/Ahern/50/50/50/?msg=Your%20text%20here.");
// DEV-21577: In-world SLURLs containing "(" or ")" are not treated as a hyperlink in chat
- testRegex("SLURL with brackets", r,
+ testRegex("SLURL with brackets", url,
"XXX http://slurl.com/secondlife/Burning%20Life%20(Hyper)/27/210/30 XXX",
"http://slurl.com/secondlife/Burning%20Life%20(Hyper)/27/210/30");
// DEV-35459: SLURLs and teleport Links not parsed properly
- testRegex("SLURL with quote", r,
+ testRegex("SLURL with quote", url,
"XXX http://slurl.com/secondlife/A'ksha%20Oasis/41/166/701 XXX",
- "http://slurl.com/secondlife/A'ksha%20Oasis/41/166/701");
+ "http://slurl.com/secondlife/A%27ksha%20Oasis/41/166/701");
}
template<> template<>
@@ -267,25 +265,24 @@ namespace tut
// test LLUrlEntryAgent - secondlife://app/agent Urls
//
LLUrlEntryAgent url;
- boost::regex r = url.getPattern();
- testRegex("Invalid Agent Url", r,
+ testRegex("Invalid Agent Url", url,
"secondlife:///app/agent/0e346d8b-4433-4d66-XXXX-fd37083abc4c/about",
"");
- testRegex("Agent Url ", r,
+ testRegex("Agent Url ", url,
"secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about",
"secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
- testRegex("Agent Url in text", r,
+ testRegex("Agent Url in text", url,
"XXX secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about XXX",
"secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
- testRegex("Agent Url multicase", r,
+ testRegex("Agent Url multicase", url,
"XXX secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/About XXX",
"secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/About");
- testRegex("Agent Url alternate command", r,
+ testRegex("Agent Url alternate command", url,
"XXX secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar",
"secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar");
@@ -298,25 +295,24 @@ namespace tut
// test LLUrlEntryGroup - secondlife://app/group Urls
//
LLUrlEntryGroup url;
- boost::regex r = url.getPattern();
- testRegex("Invalid Group Url", r,
+ testRegex("Invalid Group Url", url,
"secondlife:///app/group/00005ff3-4044-c79f-XXXX-fb28ae0df991/about",
"");
- testRegex("Group Url ", r,
+ testRegex("Group Url ", url,
"secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about",
"secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about");
- testRegex("Group Url ", r,
+ testRegex("Group Url ", url,
"secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect",
"secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect");
- testRegex("Group Url in text", r,
+ testRegex("Group Url in text", url,
"XXX secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about XXX",
"secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about");
- testRegex("Group Url multicase", r,
+ testRegex("Group Url multicase", url,
"XXX secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About XXX",
"secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About");
}
@@ -328,45 +324,44 @@ namespace tut
// test LLUrlEntryPlace - secondlife://<location> URLs
//
LLUrlEntryPlace url;
- boost::regex r = url.getPattern();
- testRegex("no valid slurl [1]", r,
+ testRegex("no valid slurl [1]", url,
"secondlife://Ahern/FOO/50/",
"");
- testRegex("Ahern (50,50,50) [1]", r,
+ testRegex("Ahern (50,50,50) [1]", url,
"secondlife://Ahern/50/50/50/",
"secondlife://Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [2]", r,
+ testRegex("Ahern (50,50,50) [2]", url,
"XXX secondlife://Ahern/50/50/50/ XXX",
"secondlife://Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [3]", r,
+ testRegex("Ahern (50,50,50) [3]", url,
"XXX secondlife://Ahern/50/50/50 XXX",
"secondlife://Ahern/50/50/50");
- testRegex("Ahern (50,50,50) multicase", r,
+ testRegex("Ahern (50,50,50) multicase", url,
"XXX SecondLife://Ahern/50/50/50/ XXX",
"SecondLife://Ahern/50/50/50/");
- testRegex("Ahern (50,50) [1]", r,
+ testRegex("Ahern (50,50) [1]", url,
"XXX secondlife://Ahern/50/50/ XXX",
"secondlife://Ahern/50/50/");
- testRegex("Ahern (50,50) [2]", r,
+ testRegex("Ahern (50,50) [2]", url,
"XXX secondlife://Ahern/50/50 XXX",
"secondlife://Ahern/50/50");
// DEV-21577: In-world SLURLs containing "(" or ")" are not treated as a hyperlink in chat
- testRegex("SLURL with brackets", r,
+ testRegex("SLURL with brackets", url,
"XXX secondlife://Burning%20Life%20(Hyper)/27/210/30 XXX",
"secondlife://Burning%20Life%20(Hyper)/27/210/30");
// DEV-35459: SLURLs and teleport Links not parsed properly
- testRegex("SLURL with quote", r,
+ testRegex("SLURL with quote", url,
"XXX secondlife://A'ksha%20Oasis/41/166/701 XXX",
- "secondlife://A'ksha%20Oasis/41/166/701");
+ "secondlife://A%27ksha%20Oasis/41/166/701");
}
template<> template<>
@@ -376,21 +371,20 @@ namespace tut
// test LLUrlEntryParcel - secondlife://app/parcel Urls
//
LLUrlEntryParcel url;
- boost::regex r = url.getPattern();
- testRegex("Invalid Classified Url", r,
+ testRegex("Invalid Classified Url", url,
"secondlife:///app/parcel/0000060e-4b39-e00b-XXXX-d98b1934e3a8/about",
"");
- testRegex("Classified Url ", r,
+ testRegex("Classified Url ", url,
"secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about",
"secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about");
- testRegex("Classified Url in text", r,
+ testRegex("Classified Url in text", url,
"XXX secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about XXX",
"secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about");
- testRegex("Classified Url multicase", r,
+ testRegex("Classified Url multicase", url,
"XXX secondlife:///APP/Parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/About XXX",
"secondlife:///APP/Parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/About");
}
@@ -401,73 +395,72 @@ namespace tut
// test LLUrlEntryTeleport - secondlife://app/teleport URLs
//
LLUrlEntryTeleport url;
- boost::regex r = url.getPattern();
- testRegex("no valid teleport [1]", r,
+ testRegex("no valid teleport [1]", url,
"http://slurl.com/secondlife/Ahern/50/50/50/",
"");
- testRegex("no valid teleport [2]", r,
+ testRegex("no valid teleport [2]", url,
"secondlife:///app/teleport/",
"");
- testRegex("no valid teleport [3]", r,
+ testRegex("no valid teleport [3]", url,
"second-life:///app/teleport/Ahern/50/50/50/",
"");
- testRegex("no valid teleport [3]", r,
+ testRegex("no valid teleport [3]", url,
"hhtp://slurl.com/secondlife/Ahern/50/FOO/50/",
"");
- testRegex("Ahern (50,50,50) [1]", r,
+ testRegex("Ahern (50,50,50) [1]", url,
"secondlife:///app/teleport/Ahern/50/50/50/",
"secondlife:///app/teleport/Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [2]", r,
+ testRegex("Ahern (50,50,50) [2]", url,
"XXX secondlife:///app/teleport/Ahern/50/50/50/ XXX",
"secondlife:///app/teleport/Ahern/50/50/50/");
- testRegex("Ahern (50,50,50) [3]", r,
+ testRegex("Ahern (50,50,50) [3]", url,
"XXX secondlife:///app/teleport/Ahern/50/50/50 XXX",
"secondlife:///app/teleport/Ahern/50/50/50");
- testRegex("Ahern (50,50,50) multicase", r,
+ testRegex("Ahern (50,50,50) multicase", url,
"XXX secondlife:///app/teleport/Ahern/50/50/50/ XXX",
"secondlife:///app/teleport/Ahern/50/50/50/");
- testRegex("Ahern (50,50) [1]", r,
+ testRegex("Ahern (50,50) [1]", url,
"XXX secondlife:///app/teleport/Ahern/50/50/ XXX",
"secondlife:///app/teleport/Ahern/50/50/");
- testRegex("Ahern (50,50) [2]", r,
+ testRegex("Ahern (50,50) [2]", url,
"XXX secondlife:///app/teleport/Ahern/50/50 XXX",
"secondlife:///app/teleport/Ahern/50/50");
- testRegex("Ahern (50)", r,
+ testRegex("Ahern (50)", url,
"XXX secondlife:///app/teleport/Ahern/50 XXX",
"secondlife:///app/teleport/Ahern/50");
- testRegex("Ahern", r,
+ testRegex("Ahern", url,
"XXX secondlife:///app/teleport/Ahern/ XXX",
"secondlife:///app/teleport/Ahern/");
- testRegex("Ahern teleport with title", r,
+ testRegex("Ahern teleport with title", url,
"XXX secondlife:///app/teleport/Ahern/50/50/50/?title=YOUR%20TITLE%20HERE! XXX",
"secondlife:///app/teleport/Ahern/50/50/50/?title=YOUR%20TITLE%20HERE!");
- testRegex("Ahern teleport with msg", r,
+ testRegex("Ahern teleport with msg", url,
"XXX secondlife:///app/teleport/Ahern/50/50/50/?msg=Your%20text%20here. XXX",
"secondlife:///app/teleport/Ahern/50/50/50/?msg=Your%20text%20here.");
// DEV-21577: In-world SLURLs containing "(" or ")" are not treated as a hyperlink in chat
- testRegex("Teleport with brackets", r,
+ testRegex("Teleport with brackets", url,
"XXX secondlife:///app/teleport/Burning%20Life%20(Hyper)/27/210/30 XXX",
"secondlife:///app/teleport/Burning%20Life%20(Hyper)/27/210/30");
// DEV-35459: SLURLs and teleport Links not parsed properly
- testRegex("Teleport url with quote", r,
+ testRegex("Teleport url with quote", url,
"XXX secondlife:///app/teleport/A'ksha%20Oasis/41/166/701 XXX",
- "secondlife:///app/teleport/A'ksha%20Oasis/41/166/701");
+ "secondlife:///app/teleport/A%27ksha%20Oasis/41/166/701");
}
template<> template<>
@@ -477,33 +470,32 @@ namespace tut
// test LLUrlEntrySL - general secondlife:// URLs
//
LLUrlEntrySL url;
- boost::regex r = url.getPattern();
- testRegex("no valid slapp [1]", r,
+ testRegex("no valid slapp [1]", url,
"http:///app/",
"");
- testRegex("valid slapp [1]", r,
+ testRegex("valid slapp [1]", url,
"secondlife:///app/",
"secondlife:///app/");
- testRegex("valid slapp [2]", r,
+ testRegex("valid slapp [2]", url,
"secondlife:///app/teleport/Ahern/50/50/50/",
"secondlife:///app/teleport/Ahern/50/50/50/");
- testRegex("valid slapp [3]", r,
+ testRegex("valid slapp [3]", url,
"secondlife:///app/foo",
"secondlife:///app/foo");
- testRegex("valid slapp [4]", r,
+ testRegex("valid slapp [4]", url,
"secondlife:///APP/foo?title=Hi%20There",
"secondlife:///APP/foo?title=Hi%20There");
- testRegex("valid slapp [5]", r,
+ testRegex("valid slapp [5]", url,
"secondlife://host/app/",
"secondlife://host/app/");
- testRegex("valid slapp [6]", r,
+ testRegex("valid slapp [6]", url,
"secondlife://host:8080/foo/bar",
"secondlife://host:8080/foo/bar");
}
@@ -515,34 +507,135 @@ namespace tut
// test LLUrlEntrySLLabel - general secondlife:// URLs with labels
//
LLUrlEntrySLLabel url;
- boost::regex r = url.getPattern();
- testRegex("invalid wiki url [1]", r,
+ testRegex("invalid wiki url [1]", url,
"[secondlife:///app/]",
"");
- testRegex("invalid wiki url [2]", r,
+ testRegex("invalid wiki url [2]", url,
"[secondlife:///app/",
"");
- testRegex("invalid wiki url [3]", r,
+ testRegex("invalid wiki url [3]", url,
"[secondlife:///app/ Label",
"");
- testRegex("agent slurl with label (spaces)", r,
+ testRegex("agent slurl with label (spaces)", url,
"[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Text]",
- "[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Text]");
+ "secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
- testRegex("agent slurl with label (tabs)", r,
+ testRegex("agent slurl with label (tabs)", url,
"[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about\t Text]",
- "[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about\t Text]");
+ "secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
- testRegex("agent slurl with label", r,
+ testRegex("agent slurl with label", url,
"[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about FirstName LastName]",
- "[secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about FirstName LastName]");
+ "secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
- testRegex("teleport slurl with label", r,
+ testRegex("teleport slurl with label", url,
"XXX [secondlife:///app/teleport/Ahern/50/50/50/ Teleport to Ahern] YYY",
- "[secondlife:///app/teleport/Ahern/50/50/50/ Teleport to Ahern]");
+ "secondlife:///app/teleport/Ahern/50/50/50/");
+ }
+
+ template<> template<>
+ void object::test<11>()
+ {
+ //
+ // test LLUrlEntryHTTPNoProtocol - general URLs without a protocol
+ //
+ LLUrlEntryHTTPNoProtocol url;
+
+ testRegex("naked .com URL", url,
+ "see google.com",
+ "http://google.com");
+
+ testRegex("naked .org URL", url,
+ "see en.wikipedia.org for details",
+ "http://en.wikipedia.org");
+
+ testRegex("naked .net URL", url,
+ "example.net",
+ "http://example.net");
+
+ testRegex("naked .edu URL (2 instances)", url,
+ "MIT web site is at web.mit.edu and also www.mit.edu",
+ "http://web.mit.edu");
+
+ testRegex("don't match e-mail addresses", url,
+ "test@lindenlab.com",
+ "");
+
+ testRegex(".com URL with path", url,
+ "see secondlife.com/status for grid status",
+ "http://secondlife.com/status");
+
+ testRegex(".com URL with port", url,
+ "secondlife.com:80",
+ "http://secondlife.com:80");
+
+ testRegex(".com URL with port and path", url,
+ "see secondlife.com:80/status",
+ "http://secondlife.com:80/status");
+
+ testRegex("www.*.com URL with port and path", url,
+ "see www.secondlife.com:80/status",
+ "http://www.secondlife.com:80/status");
+
+ testRegex("invalid .com URL [1]", url,
+ "..com",
+ "");
+
+ testRegex("invalid .com URL [2]", url,
+ "you.come",
+ "");
+
+ testRegex("invalid .com URL [3]", url,
+ "recommended",
+ "");
+
+ testRegex("invalid .edu URL", url,
+ "hi there scheduled maitenance has begun",
+ "");
+
+ testRegex("invalid .net URL", url,
+ "foo.netty",
+ "");
+
+ testRegex("XML tags around URL [1]", url,
+ "<foo>secondlife.com</foo>",
+ "http://secondlife.com");
+
+ testRegex("XML tags around URL [2]", url,
+ "<foo>secondlife.com/status?bar=1</foo>",
+ "http://secondlife.com/status?bar=1");
+ }
+
+ template<> template<>
+ void object::test<12>()
+ {
+ //
+ // test LLUrlEntryNoLink - turn off hyperlinking
+ //
+ LLUrlEntryNoLink url;
+
+ testRegex("<nolink> [1]", url,
+ "<nolink>google.com</nolink>",
+ "google.com");
+
+ testRegex("<nolink> [2]", url,
+ "<nolink>google.com",
+ "");
+
+ testRegex("<nolink> [3]", url,
+ "google.com</nolink>",
+ "");
+
+ testRegex("<nolink> [4]", url,
+ "<nolink>Hello World</nolink>",
+ "Hello World");
+
+ testRegex("<nolink> [5]", url,
+ "<nolink>My Object</nolink>",
+ "My Object");
}
}
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index e8cf135346..24a32de268 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -25,6 +25,7 @@
// link seam
LLUIColor::LLUIColor()
+ : mColorPtr(NULL)
{}
namespace tut
@@ -53,7 +54,7 @@ namespace tut
LLUrlMatch match;
ensure("empty()", match.empty());
- match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "");
+ match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false);
ensure("! empty()", ! match.empty());
}
@@ -66,7 +67,7 @@ namespace tut
LLUrlMatch match;
ensure_equals("getStart() == 0", match.getStart(), 0);
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getStart() == 10", match.getStart(), 10);
}
@@ -79,7 +80,7 @@ namespace tut
LLUrlMatch match;
ensure_equals("getEnd() == 0", match.getEnd(), 0);
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getEnd() == 20", match.getEnd(), 20);
}
@@ -92,10 +93,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getUrl() == ''", match.getUrl(), "");
- match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getUrl() == '' (2)", match.getUrl(), "");
}
@@ -108,10 +109,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getLabel() == ''", match.getLabel(), "");
- match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false);
ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getLabel() == '' (2)", match.getLabel(), "");
}
@@ -124,10 +125,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getTooltip() == ''", match.getTooltip(), "");
- match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false);
ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getTooltip() == '' (2)", match.getTooltip(), "");
}
@@ -140,10 +141,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getIcon() == ''", match.getIcon(), "");
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false);
ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure_equals("getIcon() == '' (2)", match.getIcon(), "");
}
@@ -156,10 +157,10 @@ namespace tut
LLUrlMatch match;
ensure("getMenuName() empty", match.getMenuName().empty());
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "");
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false);
ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure("getMenuName() empty (2)", match.getMenuName().empty());
}
@@ -172,10 +173,10 @@ namespace tut
LLUrlMatch match;
ensure("getLocation() empty", match.getLocation().empty());
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris");
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false);
ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "");
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
ensure("getLocation() empty (2)", match.getLocation().empty());
}
}
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 781321e5e4..da4abde451 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -200,6 +200,11 @@ const std::string &LLDir::getOSUserAppDir() const
const std::string &LLDir::getLindenUserDir() const
{
+ if (mLindenUserDir.empty())
+ {
+ lldebugs << "getLindenUserDir() called early, we don't have the user name yet - returning empty string to caller" << llendl;
+ }
+
return mLindenUserDir;
}
@@ -337,7 +342,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
break;
case LL_PATH_CACHE:
- prefix = getCacheDir();
+ prefix = getCacheDir();
break;
case LL_PATH_USER_SETTINGS:
@@ -348,6 +353,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
case LL_PATH_PER_SL_ACCOUNT:
prefix = getLindenUserDir();
+ if (prefix.empty())
+ {
+ // if we're asking for the per-SL-account directory but we haven't logged in yet (or otherwise don't know the account name from which to build this string), then intentionally return a blank string to the caller and skip the below warning about a blank prefix.
+ return std::string();
+ }
break;
case LL_PATH_CHAT_LOGS:
@@ -394,12 +404,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
prefix += "local_assets";
break;
- case LL_PATH_MOZILLA_PROFILE:
- prefix = getOSUserAppDir();
- prefix += mDirDelimiter;
- prefix += "browser_profile";
- break;
-
case LL_PATH_EXECUTABLE:
prefix = getExecutableDir();
break;
@@ -563,7 +567,7 @@ std::string LLDir::getForbiddenFileChars()
void LLDir::setLindenUserDir(const std::string &first, const std::string &last)
{
- // if both first and last aren't set, assume we're grabbing the cached dir
+ // if both first and last aren't set, that's bad.
if (!first.empty() && !last.empty())
{
// some platforms have case-sensitive filesystems, so be
@@ -577,10 +581,11 @@ void LLDir::setLindenUserDir(const std::string &first, const std::string &last)
mLindenUserDir += firstlower;
mLindenUserDir += "_";
mLindenUserDir += lastlower;
+ llinfos << "Got name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl;
}
else
{
- llerrs << "Invalid name for LLDir::setLindenUserDir" << llendl;
+ llerrs << "Invalid name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl;
}
dumpCurrentDirectories();
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 07c814769e..9067d75bac 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -38,13 +38,13 @@
#define MAX_PATH MAXPATHLEN
#endif
-// these numbers *may* get serialized, so we need to be explicit
+// these numbers *may* get serialized (really??), so we need to be explicit
typedef enum ELLPath
{
LL_PATH_NONE = 0,
LL_PATH_USER_SETTINGS = 1,
LL_PATH_APP_SETTINGS = 2,
- LL_PATH_PER_SL_ACCOUNT = 3,
+ LL_PATH_PER_SL_ACCOUNT = 3, // returns/expands to blank string if we don't know the account name yet
LL_PATH_CACHE = 4,
LL_PATH_CHARACTER = 5,
LL_PATH_HELP = 6,
@@ -54,10 +54,8 @@ typedef enum ELLPath
LL_PATH_TOP_SKIN = 10,
LL_PATH_CHAT_LOGS = 11,
LL_PATH_PER_ACCOUNT_CHAT_LOGS = 12,
- LL_PATH_MOZILLA_PROFILE = 13,
LL_PATH_USER_SKIN = 14,
LL_PATH_LOCAL_ASSETS = 15,
-// LL_PATH_HTML = 16,
LL_PATH_EXECUTABLE = 16,
LL_PATH_DEFAULT_SKIN = 17,
LL_PATH_FONTS = 18,
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 08c993ed2a..a9736560ec 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -112,9 +112,10 @@ LLDir_Linux::LLDir_Linux()
// ...normal installation running
mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins";
}
+
mOSUserDir = getCurrentUserHome(tmp_str);
mOSUserAppDir = "";
- mLindenUserDir = tmp_str;
+ mLindenUserDir = "";
char path [32]; /* Flawfinder: ignore */
@@ -225,15 +226,6 @@ void LLDir_Linux::initAppDirs(const std::string &app_name,
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
- if (res == -1)
- {
- if (errno != EEXIST)
- {
- llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
- }
- }
-
mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
}
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index a21f3ca0ab..8ac5a41e93 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -100,7 +100,7 @@ LLDir_Solaris::LLDir_Solaris()
mAppRODataDir = strdup(tmp_str);
mOSUserDir = getCurrentUserHome(tmp_str);
mOSUserAppDir = "";
- mLindenUserDir = tmp_str;
+ mLindenUserDir = "";
char path [LL_MAX_PATH]; /* Flawfinder: ignore */
@@ -244,15 +244,6 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name,
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
- if (res == -1)
- {
- if (errno != EEXIST)
- {
- llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
- }
- }
-
mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
}
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4c376f11a5..4eb10c842b 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -212,14 +212,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name,
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
- if (res == -1)
- {
- if (errno != EEXIST)
- {
- llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
- }
- }
res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,""));
if (res == -1)
{
diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp
index 704e1ab142..e85cc437f4 100644
--- a/indra/llvfs/lllfsthread.cpp
+++ b/indra/llvfs/lllfsthread.cpp
@@ -189,7 +189,7 @@ bool LLLFSThread::Request::processRequest()
{
llassert(mOffset >= 0);
LLAPRFile infile ;
- infile.open(mThread->getLocalAPRFilePool(), mFileName, LL_APR_RB);
+ infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool());
if (!infile.getFileHandle())
{
llwarns << "LLLFS: Unable to read file: " << mFileName << llendl;
@@ -213,7 +213,7 @@ bool LLLFSThread::Request::processRequest()
if (mOffset < 0)
flags |= APR_APPEND;
LLAPRFile outfile ;
- outfile.open(mThread->getLocalAPRFilePool(), mFileName, flags);
+ outfile.open(mFileName, flags, mThread->getLocalAPRFilePool());
if (!outfile.getFileHandle())
{
llwarns << "LLLFS: Unable to write file: " << mFileName << llendl;
diff --git a/indra/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp
index 315baa001d..28cee29405 100755
--- a/indra/llvfs/llpidlock.cpp
+++ b/indra/llvfs/llpidlock.cpp
@@ -41,6 +41,15 @@
#include "llframetimer.h"
#if LL_WINDOWS //For windows platform.
+
+#include <windows.h>
+
+namespace {
+ inline DWORD getpid() {
+ return GetCurrentProcessId();
+ }
+}
+
bool isProcessAlive(U32 pid)
{
return (bool) GetProcessVersion((DWORD)pid);
@@ -59,8 +68,12 @@ class LLPidLockFile
{
public:
LLPidLockFile( ) :
- mSaving(FALSE), mWaiting(FALSE),
- mClean(TRUE), mPID(getpid())
+ mAutosave(false),
+ mSaving(false),
+ mWaiting(false),
+ mPID(getpid()),
+ mNameTable(NULL),
+ mClean(true)
{
mLockName = gDirUtilp->getTempDir() + gDirUtilp->getDirDelimiter() + "savelock";
}
diff --git a/indra/llvfs/llpidlock.h b/indra/llvfs/llpidlock.h
index 42aee4dc4f..496e99cf5a 100755
--- a/indra/llvfs/llpidlock.h
+++ b/indra/llvfs/llpidlock.h
@@ -37,17 +37,9 @@
class LLSD;
class LLFrameTimer;
-#if LL_WINDOWS //For windows platform.
-
-#include <windows.h>
-
-#define getpid GetCurrentProcessId
-
-#else //Everyone Else
-
+#if !LL_WINDOWS //For non-windows platforms.
#include <signal.h>
-
-#endif //Everyone else.
+#endif
namespace LLPidLock
{
diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h
index 5f69a41040..c3bca8c737 100644
--- a/indra/llvfs/llvfile.h
+++ b/indra/llvfs/llvfile.h
@@ -88,7 +88,6 @@ protected:
S32 mMode;
LLVFS *mVFS;
F32 mPriority;
- BOOL mOnReadQueue;
S32 mBytesRead;
LLVFSThread::handle_t mHandle;
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 7b1cab696f..bf3233f386 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -12,6 +12,7 @@ project(llwindow)
include(00-Common)
include(DirectX)
+include(DragDrop)
include(LLCommon)
include(LLImage)
include(LLMath)
@@ -102,14 +103,17 @@ if (WINDOWS)
llwindowwin32.cpp
lldxhardware.cpp
llkeyboardwin32.cpp
+ lldragdropwin32.cpp
)
list(APPEND llwindow_HEADER_FILES
llwindowwin32.h
lldxhardware.h
llkeyboardwin32.h
+ lldragdropwin32.h
)
list(APPEND llwindow_LINK_LIBRARIES
comdlg32 # Common Dialogs for ChooseColor
+ ole32
)
endif (WINDOWS)
diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp
new file mode 100644
index 0000000000..b85960be10
--- /dev/null
+++ b/indra/llwindow/lldragdropwin32.cpp
@@ -0,0 +1,371 @@
+/**
+ * @file lldragdrop32.cpp
+ * @brief Handler for Windows specific drag and drop (OS to client) code
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if LL_WINDOWS
+
+#if LL_OS_DRAGDROP_ENABLED
+
+#include "linden_common.h"
+
+#include "llwindowwin32.h"
+#include "llkeyboardwin32.h"
+#include "llwindowcallbacks.h"
+#include "lldragdropwin32.h"
+
+class LLDragDropWin32Target:
+ public IDropTarget
+{
+ public:
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ LLDragDropWin32Target( HWND hWnd ) :
+ mRefCount( 1 ),
+ mAppWindowHandle( hWnd ),
+ mAllowDrop(false),
+ mIsSlurl(false)
+ {
+ };
+
+ virtual ~LLDragDropWin32Target()
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ ULONG __stdcall AddRef( void )
+ {
+ return InterlockedIncrement( &mRefCount );
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ ULONG __stdcall Release( void )
+ {
+ LONG count = InterlockedDecrement( &mRefCount );
+
+ if ( count == 0 )
+ {
+ delete this;
+ return 0;
+ }
+ else
+ {
+ return count;
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ HRESULT __stdcall QueryInterface( REFIID iid, void** ppvObject )
+ {
+ if ( iid == IID_IUnknown || iid == IID_IDropTarget )
+ {
+ AddRef();
+ *ppvObject = this;
+ return S_OK;
+ }
+ else
+ {
+ *ppvObject = 0;
+ return E_NOINTERFACE;
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ HRESULT __stdcall DragEnter( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
+ {
+ FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+
+ // support CF_TEXT using a HGLOBAL?
+ if ( S_OK == pDataObject->QueryGetData( &fmtetc ) )
+ {
+ mAllowDrop = true;
+ mDropUrl = std::string();
+ mIsSlurl = false;
+
+ STGMEDIUM stgmed;
+ if( S_OK == pDataObject->GetData( &fmtetc, &stgmed ) )
+ {
+ PVOID data = GlobalLock( stgmed.hGlobal );
+ mDropUrl = std::string( (char*)data );
+ // XXX MAJOR MAJOR HACK!
+ LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+ if (NULL != window_imp)
+ {
+ LLCoordGL gl_coord( 0, 0 );
+
+ POINT pt2;
+ pt2.x = pt.x;
+ pt2.y = pt.y;
+ ScreenToClient( mAppWindowHandle, &pt2 );
+
+ LLCoordWindow cursor_coord_window( pt2.x, pt2.y );
+ window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ MASK mask = gKeyboard->currentMask(TRUE);
+
+ LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,
+ LLWindowCallbacks::DNDA_START_TRACKING, mDropUrl );
+
+ switch (result)
+ {
+ case LLWindowCallbacks::DND_COPY:
+ *pdwEffect = DROPEFFECT_COPY;
+ break;
+ case LLWindowCallbacks::DND_LINK:
+ *pdwEffect = DROPEFFECT_LINK;
+ break;
+ case LLWindowCallbacks::DND_MOVE:
+ *pdwEffect = DROPEFFECT_MOVE;
+ break;
+ case LLWindowCallbacks::DND_NONE:
+ default:
+ *pdwEffect = DROPEFFECT_NONE;
+ break;
+ }
+ };
+
+ GlobalUnlock( stgmed.hGlobal );
+ ReleaseStgMedium( &stgmed );
+ };
+ SetFocus( mAppWindowHandle );
+ }
+ else
+ {
+ mAllowDrop = false;
+ *pdwEffect = DROPEFFECT_NONE;
+ };
+
+ return S_OK;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ HRESULT __stdcall DragOver( DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
+ {
+ if ( mAllowDrop )
+ {
+ // XXX MAJOR MAJOR HACK!
+ LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+ if (NULL != window_imp)
+ {
+ LLCoordGL gl_coord( 0, 0 );
+
+ POINT pt2;
+ pt2.x = pt.x;
+ pt2.y = pt.y;
+ ScreenToClient( mAppWindowHandle, &pt2 );
+
+ LLCoordWindow cursor_coord_window( pt2.x, pt2.y );
+ window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ MASK mask = gKeyboard->currentMask(TRUE);
+
+ LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,
+ LLWindowCallbacks::DNDA_TRACK, mDropUrl );
+
+ switch (result)
+ {
+ case LLWindowCallbacks::DND_COPY:
+ *pdwEffect = DROPEFFECT_COPY;
+ break;
+ case LLWindowCallbacks::DND_LINK:
+ *pdwEffect = DROPEFFECT_LINK;
+ break;
+ case LLWindowCallbacks::DND_MOVE:
+ *pdwEffect = DROPEFFECT_MOVE;
+ break;
+ case LLWindowCallbacks::DND_NONE:
+ default:
+ *pdwEffect = DROPEFFECT_NONE;
+ break;
+ }
+ };
+ }
+ else
+ {
+ *pdwEffect = DROPEFFECT_NONE;
+ };
+
+ return S_OK;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ HRESULT __stdcall DragLeave( void )
+ {
+ // XXX MAJOR MAJOR HACK!
+ LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+ if (NULL != window_imp)
+ {
+ LLCoordGL gl_coord( 0, 0 );
+ MASK mask = gKeyboard->currentMask(TRUE);
+ window_imp->completeDragNDropRequest( gl_coord, mask, LLWindowCallbacks::DNDA_STOP_TRACKING, mDropUrl );
+ };
+ return S_OK;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ HRESULT __stdcall Drop( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )
+ {
+ if ( mAllowDrop )
+ {
+ // window impl stored in Window data (neat!)
+ LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong( mAppWindowHandle, GWL_USERDATA );
+ if ( NULL != window_imp )
+ {
+ LLCoordGL gl_coord( 0, 0 );
+
+ POINT pt_client;
+ pt_client.x = pt.x;
+ pt_client.y = pt.y;
+ ScreenToClient( mAppWindowHandle, &pt_client );
+
+ LLCoordWindow cursor_coord_window( pt_client.x, pt_client.y );
+ window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ llinfos << "### (Drop) URL is: " << mDropUrl << llendl;
+ llinfos << "### raw coords are: " << pt.x << " x " << pt.y << llendl;
+ llinfos << "### client coords are: " << pt_client.x << " x " << pt_client.y << llendl;
+ llinfos << "### GL coords are: " << gl_coord.mX << " x " << gl_coord.mY << llendl;
+ llinfos << llendl;
+
+ // no keyboard modifier option yet but we could one day
+ MASK mask = gKeyboard->currentMask( TRUE );
+
+ // actually do the drop
+ LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,
+ LLWindowCallbacks::DNDA_DROPPED, mDropUrl );
+
+ switch (result)
+ {
+ case LLWindowCallbacks::DND_COPY:
+ *pdwEffect = DROPEFFECT_COPY;
+ break;
+ case LLWindowCallbacks::DND_LINK:
+ *pdwEffect = DROPEFFECT_LINK;
+ break;
+ case LLWindowCallbacks::DND_MOVE:
+ *pdwEffect = DROPEFFECT_MOVE;
+ break;
+ case LLWindowCallbacks::DND_NONE:
+ default:
+ *pdwEffect = DROPEFFECT_NONE;
+ break;
+ }
+ };
+ }
+ else
+ {
+ *pdwEffect = DROPEFFECT_NONE;
+ };
+
+ return S_OK;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ private:
+ LONG mRefCount;
+ HWND mAppWindowHandle;
+ bool mAllowDrop;
+ std::string mDropUrl;
+ bool mIsSlurl;
+ friend class LLWindowWin32;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLDragDropWin32::LLDragDropWin32() :
+ mDropTarget( NULL ),
+ mDropWindowHandle( NULL )
+
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLDragDropWin32::~LLDragDropWin32()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLDragDropWin32::init( HWND hWnd )
+{
+ if ( NOERROR != OleInitialize( NULL ) )
+ return FALSE;
+
+ mDropTarget = new LLDragDropWin32Target( hWnd );
+ if ( mDropTarget )
+ {
+ HRESULT result = CoLockObjectExternal( mDropTarget, TRUE, FALSE );
+ if ( S_OK == result )
+ {
+ result = RegisterDragDrop( hWnd, mDropTarget );
+ if ( S_OK != result )
+ {
+ // RegisterDragDrop failed
+ return false;
+ };
+
+ // all ok
+ mDropWindowHandle = hWnd;
+ }
+ else
+ {
+ // Unable to lock OLE object
+ return false;
+ };
+ };
+
+ // success
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLDragDropWin32::reset()
+{
+ if ( mDropTarget )
+ {
+ RevokeDragDrop( mDropWindowHandle );
+ CoLockObjectExternal( mDropTarget, FALSE, TRUE );
+ mDropTarget->Release();
+ };
+
+ OleUninitialize();
+}
+
+#endif // LL_OS_DRAGDROP_ENABLED
+
+#endif // LL_WINDOWS
+
diff --git a/indra/llwindow/lldragdropwin32.h b/indra/llwindow/lldragdropwin32.h
new file mode 100644
index 0000000000..9686626d7c
--- /dev/null
+++ b/indra/llwindow/lldragdropwin32.h
@@ -0,0 +1,80 @@
+/**
+ * @file lldragdrop32.cpp
+ * @brief Handler for Windows specific drag and drop (OS to client) code
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if LL_WINDOWS
+
+#if LL_OS_DRAGDROP_ENABLED
+
+#ifndef LL_LLDRAGDROP32_H
+#define LL_LLDRAGDROP32_H
+
+#include <windows.h>
+#include <ole2.h>
+
+class LLDragDropWin32
+{
+ public:
+ LLDragDropWin32();
+ ~LLDragDropWin32();
+
+ bool init( HWND hWnd );
+ void reset();
+
+ private:
+ IDropTarget* mDropTarget;
+ HWND mDropWindowHandle;
+};
+#endif // LL_LLDRAGDROP32_H
+
+#else // LL_OS_DRAGDROP_ENABLED
+
+#ifndef LL_LLDRAGDROP32_H
+#define LL_LLDRAGDROP32_H
+
+#include <windows.h>
+#include <ole2.h>
+
+// imposter class that does nothing
+class LLDragDropWin32
+{
+ public:
+ LLDragDropWin32() {};
+ ~LLDragDropWin32() {};
+
+ bool init( HWND hWnd ) { return false; };
+ void reset() { };
+};
+#endif // LL_LLDRAGDROP32_H
+
+#endif // LL_OS_DRAGDROP_ENABLED
+
+#endif // LL_WINDOWS
diff --git a/indra/llwindow/llkeyboardwin32.cpp b/indra/llwindow/llkeyboardwin32.cpp
index 35a3e7621a..ab5ecb4e63 100644
--- a/indra/llwindow/llkeyboardwin32.cpp
+++ b/indra/llwindow/llkeyboardwin32.cpp
@@ -80,7 +80,7 @@ LLKeyboardWin32::LLKeyboardWin32()
mTranslateKeyMap[VK_OEM_COMMA] = ',';
mTranslateKeyMap[VK_OEM_MINUS] = '-';
mTranslateKeyMap[VK_OEM_PERIOD] = '.';
- mTranslateKeyMap[VK_OEM_2] = KEY_PAD_DIVIDE;
+ mTranslateKeyMap[VK_OEM_2] = '/';//This used to be KEY_PAD_DIVIDE, but that breaks typing into text fields in media prims
mTranslateKeyMap[VK_OEM_3] = '`';
mTranslateKeyMap[VK_OEM_4] = '[';
mTranslateKeyMap[VK_OEM_5] = '\\';
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 8602225108..55b221e716 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -37,6 +37,7 @@
#include "llcoord.h"
#include "llstring.h"
#include "llcursortypes.h"
+#include "llsd.h"
class LLSplashScreen;
class LLPreeditor;
@@ -70,6 +71,8 @@ public:
virtual BOOL getMinimized() = 0;
virtual BOOL getMaximized() = 0;
virtual BOOL maximize() = 0;
+ virtual void minimize() = 0;
+ virtual void restore() = 0;
BOOL getFullscreen() { return mFullscreen; };
virtual BOOL getPosition(LLCoordScreen *position) = 0;
virtual BOOL getSize(LLCoordScreen *size) = 0;
@@ -160,6 +163,9 @@ public:
virtual void spawnWebBrowser(const std::string& escaped_url) {};
static std::vector<std::string> getDynamicFallbackFontList();
+
+ // Provide native key event data
+ virtual LLSD getNativeKeyData() { return LLSD::emptyMap(); }
protected:
LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index 72f9997149..6d9f012cc3 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -163,6 +163,11 @@ void LLWindowCallbacks::handleDataCopy(LLWindow *window, S32 data_type, void *da
{
}
+LLWindowCallbacks::DragNDropResult LLWindowCallbacks::handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, DragNDropAction action, std::string data )
+{
+ return LLWindowCallbacks::DND_NONE;
+}
+
BOOL LLWindowCallbacks::handleTimerEvent(LLWindow *window)
{
return FALSE;
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index abc66c42a2..42add8dde0 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -71,6 +71,21 @@ public:
virtual BOOL handleTimerEvent(LLWindow *window);
virtual BOOL handleDeviceChange(LLWindow *window);
+ enum DragNDropAction {
+ DNDA_START_TRACKING = 0,// Start tracking an incoming drag
+ DNDA_TRACK, // User is dragging an incoming drag around the window
+ DNDA_STOP_TRACKING, // User is no longer dragging an incoming drag around the window (may have either cancelled or dropped on the window)
+ DNDA_DROPPED // User dropped an incoming drag on the window (this is the "commit" event)
+ };
+
+ enum DragNDropResult {
+ DND_NONE = 0, // No drop allowed
+ DND_MOVE, // Drop accepted would result in a "move" operation
+ DND_COPY, // Drop accepted would result in a "copy" operation
+ DND_LINK // Drop accepted would result in a "link" operation
+ };
+ virtual DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, DragNDropAction action, std::string data);
+
virtual void handlePingWatchdog(LLWindow *window, const char * msg);
virtual void handlePauseWatchdog(LLWindow *window);
virtual void handleResumeWatchdog(LLWindow *window);
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index 3cffd2bbf6..59fc2ec657 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -45,6 +45,8 @@ public:
/*virtual*/ BOOL getMinimized() {return FALSE;};
/*virtual*/ BOOL getMaximized() {return FALSE;};
/*virtual*/ BOOL maximize() {return FALSE;};
+ /*virtual*/ void minimize() {};
+ /*virtual*/ void restore() {};
/*virtual*/ BOOL getFullscreen() {return FALSE;};
/*virtual*/ BOOL getPosition(LLCoordScreen *position) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 96e5a1b7ca..ad97bc45fc 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -260,6 +260,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mTSMScriptCode = 0;
mTSMLangCode = 0;
mPreeditor = NULL;
+ mRawKeyEvent = NULL;
mFSAASamples = fsaa_samples;
mForceRebuild = FALSE;
@@ -278,6 +279,8 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mMoveEventCampartorUPP = NewEventComparatorUPP(staticMoveEventComparator);
mGlobalHandlerRef = NULL;
mWindowHandlerRef = NULL;
+
+ mDragOverrideCursor = -1;
// We're not clipping yet
SetRect( &mOldMouseClip, 0, 0, 0, 0 );
@@ -499,8 +502,11 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
// Set up window event handlers (some window-related events ONLY go to window handlers.)
InstallStandardEventHandler(GetWindowEventTarget(mWindow));
- InstallWindowEventHandler (mWindow, mEventHandlerUPP, GetEventTypeCount (WindowHandlerEventList), WindowHandlerEventList, (void*)this, &mWindowHandlerRef); // add event handler
-
+ InstallWindowEventHandler(mWindow, mEventHandlerUPP, GetEventTypeCount (WindowHandlerEventList), WindowHandlerEventList, (void*)this, &mWindowHandlerRef); // add event handler
+#if LL_OS_DRAGDROP_ENABLED
+ InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this );
+ InstallReceiveHandler( dragReceiveHandler, mWindow, (void*)this );
+#endif // LL_OS_DRAGDROP_ENABLED
}
{
@@ -522,7 +528,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
if (mTSMDocument)
{
ActivateTSMDocument(mTSMDocument);
- UseInputWindow(mTSMDocument, FALSE);
allowLanguageTextInput(NULL, FALSE);
}
}
@@ -1034,6 +1039,7 @@ void LLWindowMacOSX::hide()
HideWindow(mWindow);
}
+//virtual
void LLWindowMacOSX::minimize()
{
setMouseClipping(FALSE);
@@ -1041,6 +1047,7 @@ void LLWindowMacOSX::minimize()
CollapseWindow(mWindow, true);
}
+//virtual
void LLWindowMacOSX::restore()
{
show();
@@ -1442,7 +1449,7 @@ static void fixOrigin(void)
::GetPortBounds(port, &portrect);
if((portrect.left != 0) || (portrect.top != 0))
{
- // Mozilla sometimes changes our port origin. Fuckers.
+ // Mozilla sometimes changes our port origin.
::SetOrigin(0,0);
}
}
@@ -2134,10 +2141,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
UInt32 modifiers = 0;
+
// First, process the raw event.
{
- EventRef rawEvent;
-
+ EventRef rawEvent = NULL;
+
// Get the original event and extract the modifier keys, so we can ignore command-key events.
if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr)
{
@@ -2146,6 +2154,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// and call this function recursively to handle the raw key event.
eventHandler (myHandler, rawEvent);
+
+ // save the raw event until we're done processing the unicode input as well.
+ mRawKeyEvent = rawEvent;
}
}
@@ -2173,11 +2184,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
else
{
- MASK mask = 0;
- if(modifiers & shiftKey) { mask |= MASK_SHIFT; }
- if(modifiers & (cmdKey | controlKey)) { mask |= MASK_CONTROL; }
- if(modifiers & optionKey) { mask |= MASK_ALT; }
-
+ MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
+
llassert( actualType == typeUnicodeText );
// The result is a UTF16 buffer. Pass the characters in turn to handleUnicodeChar.
@@ -2199,6 +2207,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
delete[] buffer;
}
+ mRawKeyEvent = NULL;
result = err;
}
break;
@@ -2273,6 +2282,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode);
GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ // save the raw event so getNativeKeyData can use it.
+ mRawKeyEvent = event;
+
// printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers);
// fflush(stdout);
@@ -2368,6 +2380,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
result = eventNotHandledErr;
break;
}
+
+ mRawKeyEvent = NULL;
}
break;
@@ -2794,6 +2808,14 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
{
OSStatus result = noErr;
+ if (mDragOverrideCursor != -1)
+ {
+ // A drag is in progress...remember the requested cursor and we'll
+ // restore it when it is done
+ mCurrentCursor = cursor;
+ return;
+ }
+
if (cursor == UI_CURSOR_ARROW
&& mBusyCount > 0)
{
@@ -3200,6 +3222,60 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
}
}
+LLSD LLWindowMacOSX::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ if(mRawKeyEvent)
+ {
+ char char_code = 0;
+ UInt32 key_code = 0;
+ UInt32 modifiers = 0;
+ UInt32 keyboard_type = 0;
+
+ GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyboardType, typeUInt32, NULL, sizeof(UInt32), NULL, &keyboard_type);
+
+ result["char_code"] = (S32)char_code;
+ result["key_code"] = (S32)key_code;
+ result["modifiers"] = (S32)modifiers;
+ result["keyboard_type"] = (S32)keyboard_type;
+
+#if 0
+ // This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)
+ // cause llsd serialization to create XML that the llsd deserializer won't parse!
+ std::string unicode;
+ OSStatus err = noErr;
+ EventParamType actualType = typeUTF8Text;
+ UInt32 actualSize = 0;
+ char *buffer = NULL;
+
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL);
+ if(err == noErr)
+ {
+ // allocate a buffer and get the actual data.
+ buffer = new char[actualSize];
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, actualSize, &actualSize, buffer);
+ if(err == noErr)
+ {
+ unicode.assign(buffer, actualSize);
+ }
+ delete[] buffer;
+ }
+
+ result["unicode"] = unicode;
+#endif
+
+ }
+
+
+ lldebugs << "native key data is: " << result << llendl;
+
+ return result;
+}
+
BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
@@ -3317,6 +3393,8 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
return;
}
+ UseInputWindow(mTSMDocument, !b);
+
// Take care of old and new preeditors.
if (preeditor != mPreeditor || !b)
{
@@ -3376,3 +3454,174 @@ std::vector<std::string> LLWindowMacOSX::getDynamicFallbackFontList()
return std::vector<std::string>();
}
+// static
+MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers)
+{
+ MASK mask = 0;
+ if(modifiers & shiftKey) { mask |= MASK_SHIFT; }
+ if(modifiers & (cmdKey | controlKey)) { mask |= MASK_CONTROL; }
+ if(modifiers & optionKey) { mask |= MASK_ALT; }
+ return mask;
+}
+
+#if LL_OS_DRAGDROP_ENABLED
+
+OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow,
+ void * handlerRefCon, DragRef drag)
+{
+ OSErr result = noErr;
+ LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
+
+ lldebugs << "drag tracking handler, message = " << message << llendl;
+
+ switch(message)
+ {
+ case kDragTrackingInWindow:
+ result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_TRACK);
+ break;
+
+ case kDragTrackingEnterHandler:
+ result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_START_TRACKING);
+ break;
+
+ case kDragTrackingLeaveHandler:
+ result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_STOP_TRACKING);
+ break;
+
+ default:
+ break;
+ }
+
+ return result;
+}
+
+OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,
+ DragRef drag)
+{
+ LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
+ return self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_DROPPED);
+
+}
+
+OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDropAction action)
+{
+ OSErr result = dragNotAcceptedErr; // overall function result
+ OSErr err = noErr; // for local error handling
+
+ // Get the mouse position and modifiers of this drag.
+ SInt16 modifiers, mouseDownModifiers, mouseUpModifiers;
+ ::GetDragModifiers(drag, &modifiers, &mouseDownModifiers, &mouseUpModifiers);
+ MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
+
+ Point mouse_point;
+ // This will return the mouse point in global screen coords
+ ::GetDragMouse(drag, &mouse_point, NULL);
+ LLCoordScreen screen_coords(mouse_point.h, mouse_point.v);
+ LLCoordGL gl_pos;
+ convertCoords(screen_coords, &gl_pos);
+
+ // Look at the pasteboard and try to extract an URL from it
+ PasteboardRef pasteboard;
+ if(GetDragPasteboard(drag, &pasteboard) == noErr)
+ {
+ ItemCount num_items = 0;
+ // Treat an error here as an item count of 0
+ (void)PasteboardGetItemCount(pasteboard, &num_items);
+
+ // Only deal with single-item drags.
+ if(num_items == 1)
+ {
+ PasteboardItemID item_id = NULL;
+ CFArrayRef flavors = NULL;
+ CFDataRef data = NULL;
+
+ err = PasteboardGetItemIdentifier(pasteboard, 1, &item_id); // Yes, this really is 1-based.
+
+ // Try to extract an URL from the pasteboard
+ if(err == noErr)
+ {
+ err = PasteboardCopyItemFlavors( pasteboard, item_id, &flavors);
+ }
+
+ if(err == noErr)
+ {
+ if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeURL))
+ {
+ // This is an URL.
+ err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeURL, &data);
+ }
+ else if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeUTF8PlainText))
+ {
+ // This is a string that might be an URL.
+ err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeUTF8PlainText, &data);
+ }
+
+ }
+
+ if(flavors != NULL)
+ {
+ CFRelease(flavors);
+ }
+
+ if(data != NULL)
+ {
+ std::string url;
+ url.assign((char*)CFDataGetBytePtr(data), CFDataGetLength(data));
+ CFRelease(data);
+
+ if(!url.empty())
+ {
+ LLWindowCallbacks::DragNDropResult res =
+ mCallbacks->handleDragNDrop(this, gl_pos, mask, action, url);
+
+ switch (res) {
+ case LLWindowCallbacks::DND_NONE: // No drop allowed
+ if (action == LLWindowCallbacks::DNDA_TRACK)
+ {
+ mDragOverrideCursor = kThemeNotAllowedCursor;
+ }
+ else {
+ mDragOverrideCursor = -1;
+ }
+ break;
+ case LLWindowCallbacks::DND_MOVE: // Drop accepted would result in a "move" operation
+ mDragOverrideCursor = kThemePointingHandCursor;
+ result = noErr;
+ break;
+ case LLWindowCallbacks::DND_COPY: // Drop accepted would result in a "copy" operation
+ mDragOverrideCursor = kThemeCopyArrowCursor;
+ result = noErr;
+ break;
+ case LLWindowCallbacks::DND_LINK: // Drop accepted would result in a "link" operation:
+ mDragOverrideCursor = kThemeAliasArrowCursor;
+ result = noErr;
+ break;
+ default:
+ mDragOverrideCursor = -1;
+ break;
+ }
+ // This overrides the cursor being set by setCursor.
+ // This is a bit of a hack workaround because lots of areas
+ // within the viewer just blindly set the cursor.
+ if (mDragOverrideCursor == -1)
+ {
+ // Restore the cursor
+ ECursorType temp_cursor = mCurrentCursor;
+ // get around the "setting the same cursor" code in setCursor()
+ mCurrentCursor = UI_CURSOR_COUNT;
+ setCursor(temp_cursor);
+ }
+ else {
+ // Override the cursor
+ SetThemeCursor(mDragOverrideCursor);
+ }
+
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+#endif // LL_OS_DRAGDROP_ENABLED
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 17074080eb..7c6b324029 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -34,6 +34,7 @@
#define LL_LLWINDOWMACOSX_H
#include "llwindow.h"
+#include "llwindowcallbacks.h"
#include "lltimer.h"
@@ -56,6 +57,8 @@ public:
/*virtual*/ BOOL getMinimized();
/*virtual*/ BOOL getMaximized();
/*virtual*/ BOOL maximize();
+ /*virtual*/ void minimize();
+ /*virtual*/ void restore();
/*virtual*/ BOOL getFullscreen();
/*virtual*/ BOOL getPosition(LLCoordScreen *position);
/*virtual*/ BOOL getSize(LLCoordScreen *size);
@@ -117,6 +120,10 @@ public:
static std::vector<std::string> getDynamicFallbackFontList();
+ // Provide native key event data
+ /*virtual*/ LLSD getNativeKeyData();
+
+
protected:
LLWindowMacOSX(LLWindowCallbacks* callbacks,
const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
@@ -139,9 +146,6 @@ protected:
// Restore the display resolution to its value before we ran the app.
BOOL resetDisplayResolution();
- void minimize();
- void restore();
-
BOOL shouldPostQuit() { return mPostQuit; }
@@ -160,8 +164,15 @@ protected:
void adjustCursorDecouple(bool warpingMouse = false);
void fixWindowSize(void);
void stopDockTileBounce();
-
-
+ static MASK modifiersToMask(SInt16 modifiers);
+
+#if LL_OS_DRAGDROP_ENABLED
+ static OSErr dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow,
+ void * handlerRefCon, DragRef theDrag);
+ static OSErr dragReceiveHandler(WindowRef theWindow, void * handlerRefCon, DragRef theDrag);
+ OSErr handleDragNDrop(DragRef theDrag, LLWindowCallbacks::DragNDropAction action);
+#endif // LL_OS_DRAGDROP_ENABLED
+
//
// Platform specific variables
//
@@ -194,11 +205,13 @@ protected:
U32 mFSAASamples;
BOOL mForceRebuild;
+ S32 mDragOverrideCursor;
+
F32 mBounceTime;
NMRec mBounceRec;
LLTimer mBounceTimer;
- // Imput method management through Text Service Manager.
+ // Input method management through Text Service Manager.
TSMDocumentID mTSMDocument;
BOOL mLanguageTextInputAllowed;
ScriptCode mTSMScriptCode;
@@ -209,6 +222,7 @@ protected:
friend class LLWindowManager;
static WindowRef sMediaWindow;
+ EventRef mRawKeyEvent;
};
diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h
index 46b62b914c..06146afde7 100644
--- a/indra/llwindow/llwindowmesaheadless.h
+++ b/indra/llwindow/llwindowmesaheadless.h
@@ -49,6 +49,8 @@ public:
/*virtual*/ BOOL getMinimized() {return FALSE;};
/*virtual*/ BOOL getMaximized() {return FALSE;};
/*virtual*/ BOOL maximize() {return FALSE;};
+ /*virtual*/ void minimize() {};
+ /*virtual*/ void restore() {};
/*virtual*/ BOOL getFullscreen() {return FALSE;};
/*virtual*/ BOOL getPosition(LLCoordScreen *position) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 9f03c8f695..1f705f9e60 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -251,6 +251,10 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
#if LL_X11
mFlashing = FALSE;
#endif // LL_X11
+
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
+ mKeyModifiers = KMOD_NONE;
}
static SDL_Surface *Load_BMP_Resource(const char *basename)
@@ -418,7 +422,6 @@ static int x11_detect_VRAM_kb()
BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync)
{
//bool glneedsinit = false;
-// const char *gllibname = null;
llinfos << "createContext, fullscreen=" << fullscreen <<
" size=" << width << "x" << height << llendl;
@@ -840,11 +843,13 @@ void LLWindowSDL::hide()
// *FIX: What to do with SDL?
}
+//virtual
void LLWindowSDL::minimize()
{
// *FIX: What to do with SDL?
}
+//virtual
void LLWindowSDL::restore()
{
// *FIX: What to do with SDL?
@@ -1592,12 +1597,83 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain)
return mGrabbyKeyFlags;
}
+
+void check_vm_bloat()
+{
+#if LL_LINUX
+ // watch our own VM and RSS sizes, warn if we bloated rapidly
+ FILE *fp = fopen("/proc/self/stat", "r");
+ if (fp)
+ {
+ static long long last_vm_size = 0;
+ static long long last_rss_size = 0;
+ const long long significant_vm_difference = 250 * 1024*1024;
+ const long long significant_rss_difference = 50 * 1024*1024;
+
+ ssize_t res;
+ size_t dummy;
+ char *ptr;
+ for (int i=0; i<22; ++i) // parse past the values we don't want
+ {
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ free(ptr);
+ }
+ // 23rd space-delimited entry is vsize
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ llassert(ptr);
+ long long this_vm_size = atoll(ptr);
+ free(ptr);
+ // 24th space-delimited entry is RSS
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ llassert(ptr);
+ long long this_rss_size = getpagesize() * atoll(ptr);
+ free(ptr);
+
+ llinfos << "VM SIZE IS NOW " << (this_vm_size/(1024*1024)) << " MB, RSS SIZE IS NOW " << (this_rss_size/(1024*1024)) << " MB" << llendl;
+
+ if (llabs(last_vm_size - this_vm_size) >
+ significant_vm_difference)
+ {
+ if (this_vm_size > last_vm_size)
+ {
+ llwarns << "VM size grew by " << (this_vm_size - last_vm_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ else
+ {
+ llinfos << "VM size shrank by " << (last_vm_size - this_vm_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ }
+
+ if (llabs(last_rss_size - this_rss_size) >
+ significant_rss_difference)
+ {
+ if (this_rss_size > last_rss_size)
+ {
+ llwarns << "RSS size grew by " << (this_rss_size - last_rss_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ else
+ {
+ llinfos << "RSS size shrank by " << (last_rss_size - this_rss_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ }
+
+ last_rss_size = this_rss_size;
+ last_vm_size = this_vm_size;
+
+ fclose(fp);
+ }
+#endif // LL_LINUX
+}
+
+
// virtual
void LLWindowSDL::processMiscNativeEvents()
{
#if LL_GTK
// Pump GTK events to avoid starvation for:
- // * Embedded Gecko
// * DBUS servicing
// * Anything else which quietly hooks into the default glib/GTK loop
if (ll_try_gtk_init())
@@ -1616,13 +1692,19 @@ void LLWindowSDL::processMiscNativeEvents()
pump_timer.setTimerExpirySec(1.0f / 15.0f);
do {
// Always do at least one non-blocking pump
- gtk_main_iteration_do(0);
+ gtk_main_iteration_do(FALSE);
} while (gtk_events_pending() &&
!pump_timer.hasExpired());
setlocale(LC_ALL, saved_locale.c_str() );
}
#endif // LL_GTK
+
+ // hack - doesn't belong here - but this is just for debugging
+ if (getenv("LL_DEBUG_BLOAT"))
+ {
+ check_vm_bloat();
+ }
}
void LLWindowSDL::gatherInput()
@@ -1650,24 +1732,32 @@ void LLWindowSDL::gatherInput()
}
case SDL_KEYDOWN:
- gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
- // part of the fix for SL-13243
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
- SDLReallyCaptureInput(TRUE);
-
- if (event.key.keysym.unicode)
- {
- handleUnicodeUTF16(event.key.keysym.unicode,
- gKeyboard->currentMask(FALSE));
- }
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
+
+ gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
+ // part of the fix for SL-13243
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
+ SDLReallyCaptureInput(TRUE);
+
+ if (event.key.keysym.unicode)
+ {
+ handleUnicodeUTF16(event.key.keysym.unicode,
+ gKeyboard->currentMask(FALSE));
+ }
break;
case SDL_KEYUP:
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
- SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
- gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
- break;
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
+ SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+
+ gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
+ break;
case SDL_MOUSEBUTTONDOWN:
{
@@ -2223,6 +2313,39 @@ static void color_changed_callback(GtkWidget *widget,
gtk_color_selection_get_current_color(colorsel, colorp);
}
+
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowSDL::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ U32 modifiers = 0; // pretend-native modifiers... oh what a tangled web we weave!
+
+ // we go through so many levels of device abstraction that I can't really guess
+ // what a plugin under GDK under Qt under SL under SDL under X11 considers
+ // a 'native' modifier mask. this has been sort of reverse-engineered... they *appear*
+ // to match GDK consts, but that may be co-incidence.
+ modifiers |= (mKeyModifiers & KMOD_LSHIFT) ? 0x0001 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RSHIFT) ? 0x0001 : 0;// munge these into the same shift
+ modifiers |= (mKeyModifiers & KMOD_CAPS) ? 0x0002 : 0;
+ modifiers |= (mKeyModifiers & KMOD_LCTRL) ? 0x0004 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RCTRL) ? 0x0004 : 0;// munge these into the same ctrl
+ modifiers |= (mKeyModifiers & KMOD_LALT) ? 0x0008 : 0;// untested
+ modifiers |= (mKeyModifiers & KMOD_RALT) ? 0x0008 : 0;// untested
+ // *todo: test ALTs - I don't have a case for testing these. Do you?
+ // *todo: NUM? - I don't care enough right now (and it's not a GDK modifier).
+
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
+ result["modifiers"] = (S32)modifiers;
+
+ return result;
+}
+
+
BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
BOOL rtn = FALSE;
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index dcf41291ec..e6bdd46a77 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -62,6 +62,8 @@ public:
/*virtual*/ BOOL getMinimized();
/*virtual*/ BOOL getMaximized();
/*virtual*/ BOOL maximize();
+ /*virtual*/ void minimize();
+ /*virtual*/ void restore();
/*virtual*/ BOOL getFullscreen();
/*virtual*/ BOOL getPosition(LLCoordScreen *position);
/*virtual*/ BOOL getSize(LLCoordScreen *size);
@@ -100,7 +102,7 @@ public:
/*virtual*/ void gatherInput();
/*virtual*/ void swapBuffers();
- /*virtual*/ void delayInputProcessing() { };
+ /*virtual*/ void delayInputProcessing() { };
// handy coordinate space conversion routines
/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to);
@@ -153,21 +155,19 @@ protected:
BOOL ignore_pixel_depth, U32 fsaa_samples);
~LLWindowSDL();
+ /*virtual*/ BOOL isValid();
+ /*virtual*/ LLSD getNativeKeyData();
+
void initCursors();
void quitCursors();
- BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
// Go back to last fullscreen display resolution.
BOOL setFullscreenResolution();
- void minimize();
- void restore();
-
BOOL shouldPostQuit() { return mPostQuit; }
protected:
@@ -205,12 +205,16 @@ protected:
friend class LLWindowManager;
-#if LL_X11
private:
+#if LL_X11
void x11_set_urgent(BOOL urgent);
BOOL mFlashing;
LLTimer mFlashTimer;
#endif //LL_X11
+
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+ SDLMod mKeyModifiers;
};
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index c608c21d05..c80392ad45 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -38,6 +38,7 @@
// LLWindow library includes
#include "llkeyboardwin32.h"
+#include "lldragdropwin32.h"
#include "llpreeditor.h"
#include "llwindowcallbacks.h"
@@ -52,6 +53,7 @@
#include <mapi.h>
#include <process.h> // for _spawn
#include <shellapi.h>
+#include <fstream>
#include <Imm.h>
// Require DirectInput version 8
@@ -376,6 +378,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mMousePositionModified = FALSE;
mInputProcessingPaused = FALSE;
mPreeditor = NULL;
+ mKeyCharCode = 0;
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
mhDC = NULL;
mhRC = NULL;
@@ -383,6 +388,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
gKeyboard = new LLKeyboardWin32();
gKeyboard->setCallbacks(callbacks);
+ // Initialize the Drag and Drop functionality
+ mDragDrop = new LLDragDropWin32;
+
// Initialize (boot strap) the Language text input management,
// based on the system's (user's) default settings.
allowLanguageTextInput(mPreeditor, FALSE);
@@ -620,6 +628,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
LLWindowWin32::~LLWindowWin32()
{
+ delete mDragDrop;
+
delete [] mWindowTitle;
mWindowTitle = NULL;
@@ -643,6 +653,7 @@ void LLWindowWin32::hide()
ShowWindow(mWindowHandle, SW_HIDE);
}
+//virtual
void LLWindowWin32::minimize()
{
setMouseClipping(FALSE);
@@ -650,7 +661,7 @@ void LLWindowWin32::minimize()
ShowWindow(mWindowHandle, SW_MINIMIZE);
}
-
+//virtual
void LLWindowWin32::restore()
{
ShowWindow(mWindowHandle, SW_RESTORE);
@@ -670,6 +681,8 @@ void LLWindowWin32::close()
return;
}
+ mDragDrop->reset();
+
// Make sure cursor is visible and we haven't mangled the clipping state.
setMouseClipping(FALSE);
showCursor();
@@ -1348,6 +1361,11 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
}
SetWindowLong(mWindowHandle, GWL_USERDATA, (U32)this);
+
+ // register this window as handling drag/drop events from the OS
+ DragAcceptFiles( mWindowHandle, TRUE );
+
+ mDragDrop->init( mWindowHandle );
//register joystick timer callback
SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer
@@ -1857,6 +1875,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// allow system keys, such as ALT-F4 to be processed by Windows
eat_keystroke = FALSE;
case WM_KEYDOWN:
+ window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN");
{
if (gDebugWindowProc)
@@ -1876,6 +1898,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
eat_keystroke = FALSE;
case WM_KEYUP:
{
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP");
LLFastTimer t2(FTM_KEYHANDLER);
@@ -1961,6 +1986,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
case WM_CHAR:
+ window_imp->mKeyCharCode = w_param;
+
// Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need
// to figure out how that works. - Doug
//
@@ -2183,7 +2210,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MBUTTONUP");
LLFastTimer t2(FTM_MOUSEHANDLER);
- // Because we move the cursor position in tllviewerhe app, we need to query
+ // Because we move the cursor position in the llviewer app, we need to query
// to find out where the cursor at the time the event is handled.
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
@@ -2213,7 +2240,27 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MOUSEWHEEL");
static short z_delta = 0;
- z_delta += HIWORD(w_param);
+ RECT client_rect;
+
+ // eat scroll events that occur outside our window, since we use mouse position to direct scroll
+ // instead of keyboard focus
+ // NOTE: mouse_coord is in *window* coordinates for scroll events
+ POINT mouse_coord = {(S32)(S16)LOWORD(l_param), (S32)(S16)HIWORD(l_param)};
+
+ if (ScreenToClient(window_imp->mWindowHandle, &mouse_coord)
+ && GetClientRect(window_imp->mWindowHandle, &client_rect))
+ {
+ // we have a valid mouse point and client rect
+ if (mouse_coord.x < client_rect.left || client_rect.right < mouse_coord.x
+ || mouse_coord.y < client_rect.top || client_rect.bottom < mouse_coord.y)
+ {
+ // mouse is outside of client rect, so don't do anything
+ return 0;
+ }
+ }
+
+ S16 incoming_z_delta = HIWORD(w_param);
+ z_delta += incoming_z_delta;
// cout << "z_delta " << z_delta << endl;
// current mouse wheels report changes in increments of zDelta (+120, -120)
@@ -2333,11 +2380,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
return 0;
case WM_COPYDATA:
- window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_COPYDATA");
- // received a URL
- PCOPYDATASTRUCT myCDS = (PCOPYDATASTRUCT) l_param;
- window_imp->mCallbacks->handleDataCopy(window_imp, myCDS->dwData, myCDS->lpData);
+ {
+ window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_COPYDATA");
+ // received a URL
+ PCOPYDATASTRUCT myCDS = (PCOPYDATASTRUCT) l_param;
+ window_imp->mCallbacks->handleDataCopy(window_imp, myCDS->dwData, myCDS->lpData);
+ };
return 0;
+
+ break;
}
window_imp->mCallbacks->handlePauseWatchdog(window_imp);
@@ -3012,6 +3063,19 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
*/
}
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowWin32::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
+
+ return result;
+}
BOOL LLWindowWin32::dialogColorPicker( F32 *r, F32 *g, F32 *b )
{
@@ -3507,6 +3571,13 @@ static LLWString find_context(const LLWString & wtext, S32 focus, S32 focus_leng
return wtext.substr(start, end - start);
}
+// final stage of handling drop requests - both from WM_DROPFILES message
+// for files and via IDropTarget interface requests.
+LLWindowCallbacks::DragNDropResult LLWindowWin32::completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url )
+{
+ return mCallbacks->handleDragNDrop( this, gl_coord, mask, action, url );
+}
+
// Handle WM_IME_REQUEST message.
// If it handled the message, returns TRUE. Otherwise, FALSE.
// When it handled the message, the value to be returned from
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index e14324c9f1..9d57735772 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -39,6 +39,8 @@
#include <windows.h>
#include "llwindow.h"
+#include "llwindowcallbacks.h"
+#include "lldragdropwin32.h"
// Hack for async host by name
#define LL_WM_HOST_RESOLVED (WM_APP + 1)
@@ -54,6 +56,8 @@ public:
/*virtual*/ BOOL getMinimized();
/*virtual*/ BOOL getMaximized();
/*virtual*/ BOOL maximize();
+ /*virtual*/ void minimize();
+ /*virtual*/ void restore();
/*virtual*/ BOOL getFullscreen();
/*virtual*/ BOOL getPosition(LLCoordScreen *position);
/*virtual*/ BOOL getSize(LLCoordScreen *size);
@@ -112,6 +116,8 @@ public:
/*virtual*/ void interruptLanguageTextInput();
/*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
+ LLWindowCallbacks::DragNDropResult completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url );
+
static std::vector<std::string> getDynamicFallbackFontList();
protected:
@@ -126,7 +132,7 @@ protected:
HCURSOR loadColorCursor(LPCTSTR name);
BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
+ LLSD getNativeKeyData();
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
@@ -137,9 +143,6 @@ protected:
// Restore the display resolution to its value before we ran the app.
BOOL resetDisplayResolution();
- void minimize();
- void restore();
-
BOOL shouldPostQuit() { return mPostQuit; }
void fillCompositionForm(const LLRect& bounds, COMPOSITIONFORM *form);
@@ -206,6 +209,12 @@ protected:
LLPreeditor *mPreeditor;
+ LLDragDropWin32* mDragDrop;
+
+ U32 mKeyCharCode;
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+
friend class LLWindowManager;
};
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 07cc612a0a..e4f6482fae 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -131,6 +131,8 @@ LLXMLNode::LLXMLNode(const LLXMLNode& rhs) :
mPrecision(rhs.mPrecision),
mType(rhs.mType),
mEncoding(rhs.mEncoding),
+ mLineNumber(0),
+ mParser(NULL),
mParent(NULL),
mChildren(NULL),
mAttributes(),
diff --git a/indra/llxml/llxmltree.cpp b/indra/llxml/llxmltree.cpp
index 1bce5d29f7..bc2690deff 100644
--- a/indra/llxml/llxmltree.cpp
+++ b/indra/llxml/llxmltree.cpp
@@ -510,7 +510,8 @@ LLXmlTreeParser::LLXmlTreeParser(LLXmlTree* tree)
: mTree(tree),
mRoot( NULL ),
mCurrent( NULL ),
- mDump( FALSE )
+ mDump( FALSE ),
+ mKeepContents(FALSE)
{
}
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 318a0348a2..2ead5a4a57 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -46,7 +46,7 @@ namespace LLInitParam
{
const U8* my_addr = reinterpret_cast<const U8*>(this);
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = (S16)(block_addr - my_addr);
+ mEnclosingBlockOffset = (U16)(my_addr - block_addr);
}
//
@@ -84,8 +84,8 @@ namespace LLInitParam
// BaseBlock
//
BaseBlock::BaseBlock()
- : mLastChangedParam(0),
- mChangeVersion(0)
+ : mChangeVersion(0),
+ mBlockDescriptor(NULL)
{}
BaseBlock::~BaseBlock()
@@ -137,7 +137,7 @@ namespace LLInitParam
}
- bool BaseBlock::validateBlock(bool silent) const
+ bool BaseBlock::validateBlock(bool emit_errors) const
{
const BlockDescriptor& block_data = getBlockDescriptor();
for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it)
@@ -145,7 +145,7 @@ namespace LLInitParam
const Param* param = getParamFromHandle(it->first);
if (!it->second(param))
{
- if (!silent)
+ if (emit_errors)
{
llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl;
}
@@ -347,7 +347,6 @@ namespace LLInitParam
if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second))
{
- mLastChangedParam = (*it)->mParamHandle;
return true;
}
}
@@ -416,9 +415,11 @@ namespace LLInitParam
void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided)
{
- mLastChangedParam = getHandleFromParam(&last_param);
+ if (user_provided)
+ {
mChangeVersion++;
}
+ }
const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const
{
@@ -457,28 +458,7 @@ namespace LLInitParam
// take all provided params from other and apply to self
// NOTE: this requires that "other" is of the same derived type as this
- bool BaseBlock::overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
- {
- bool param_changed = false;
- BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
- for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
- it != end_it;
- ++it)
- {
- const Param* other_paramp = other.getParamFromHandle(it->mParamHandle);
- ParamDescriptor::merge_func_t merge_func = it->mMergeFunc;
- if (merge_func)
- {
- Param* paramp = getParamFromHandle(it->mParamHandle);
- param_changed |= merge_func(*paramp, *other_paramp, true);
- mLastChangedParam = it->mParamHandle;
- }
- }
- return param_changed;
- }
-
- // take all provided params that are not already provided, and apply to self
- bool BaseBlock::fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
+ bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
bool param_changed = false;
BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
@@ -491,8 +471,7 @@ namespace LLInitParam
if (merge_func)
{
Param* paramp = getParamFromHandle(it->mParamHandle);
- param_changed |= merge_func(*paramp, *other_paramp, false);
- mLastChangedParam = it->mParamHandle;
+ param_changed |= merge_func(*paramp, *other_paramp, overwrite);
}
}
return param_changed;
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 9fb464ca7b..c9c1d4af90 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -1,5 +1,5 @@
/**
- * @file llinitparam.h
+f * @file llinitparam.h
* @brief parameter block abstraction for creating complex objects and
* parsing construction parameters from xml and LLSD
*
@@ -300,14 +300,14 @@ namespace LLInitParam
const U8* my_addr = reinterpret_cast<const U8*>(this);
// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
return *const_cast<BaseBlock*>(
- reinterpret_cast<const BaseBlock*>(my_addr + (ptrdiff_t)mEnclosingBlockOffset));
+ reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
}
private:
friend class BaseBlock;
bool mIsProvided;
- S16 mEnclosingBlockOffset;
+ U16 mEnclosingBlockOffset;
};
// various callbacks and constraints associated with an individual param
@@ -321,13 +321,13 @@ namespace LLInitParam
typedef bool(*validation_func_t)(const Param*);
ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count)
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count)
: mParamHandle(p),
mMergeFunc(merge_func),
mDeserializeFunc(deserialize_func),
@@ -336,6 +336,7 @@ namespace LLInitParam
mInspectFunc(inspect_func),
mMinCount(min_count),
mMaxCount(max_count),
+ mGeneration(0),
mNumRefs(0)
{}
@@ -371,7 +372,8 @@ namespace LLInitParam
public:
BlockDescriptor()
: mMaxParamOffset(0),
- mInitializationState(UNINITIALIZED)
+ mInitializationState(UNINITIALIZED),
+ mCurrentBlockPtr(NULL)
{}
typedef enum e_initialization_state
@@ -405,6 +407,41 @@ namespace LLInitParam
class BaseBlock
{
public:
+ // "Multiple" constraint types, put here in root class to avoid ambiguity during use
+ struct AnyAmount
+ {
+ static U32 minCount() { return 0; }
+ static U32 maxCount() { return U32_MAX; }
+ };
+
+ template<U32 MIN_AMOUNT>
+ struct AtLeast
+ {
+ static U32 minCount() { return MIN_AMOUNT; }
+ static U32 maxCount() { return U32_MAX; }
+ };
+
+ template<U32 MAX_AMOUNT>
+ struct AtMost
+ {
+ static U32 minCount() { return 0; }
+ static U32 maxCount() { return MAX_AMOUNT; }
+ };
+
+ template<U32 MIN_AMOUNT, U32 MAX_AMOUNT>
+ struct Between
+ {
+ static U32 minCount() { return MIN_AMOUNT; }
+ static U32 maxCount() { return MAX_AMOUNT; }
+ };
+
+ template<U32 EXACT_COUNT>
+ struct Exactly
+ {
+ static U32 minCount() { return EXACT_COUNT; }
+ static U32 maxCount() { return EXACT_COUNT; }
+ };
+
// this typedef identifies derived classes as being blocks
typedef void baseblock_base_class_t;
LOG_CLASS(BaseBlock);
@@ -415,7 +452,7 @@ namespace LLInitParam
bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
param_handle_t getHandleFromParam(const Param* param) const;
- bool validateBlock(bool silent = false) const;
+ bool validateBlock(bool emit_errors = true) const;
Param* getParamFromHandle(const param_handle_t param_handle)
{
@@ -435,7 +472,6 @@ namespace LLInitParam
// Blocks can override this to do custom tracking of changes
virtual void setLastChangedParam(const Param& last_param, bool user_provided);
- const Param* getLastChangedParam() const { return mLastChangedParam ? getParamFromHandle(mLastChangedParam) : NULL; }
S32 getLastChangeVersion() const { return mChangeVersion; }
bool isDefault() const { return mChangeVersion == 0; }
@@ -464,13 +500,9 @@ namespace LLInitParam
// take all provided params from other and apply to self
- bool overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
-
- // take all provided params that are not already provided, and apply to self
- bool fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
+ bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
// can be updated in getters
- mutable param_handle_t mLastChangedParam;
mutable S32 mChangeVersion;
BlockDescriptor* mBlockDescriptor; // most derived block descriptor
@@ -770,7 +802,7 @@ namespace LLInitParam
if (Param::getProvided() && mData.mValidatedVersion < T::getLastChangeVersion())
{
// a sub-block is "provided" when it has been filled in enough to be valid
- mData.mValidated = T::validateBlock(true);
+ mData.mValidated = T::validateBlock(false);
mData.mValidatedVersion = T::getLastChangeVersion();
}
return Param::getProvided() && mData.mValidated;
@@ -1201,7 +1233,7 @@ namespace LLInitParam
it != mValues.end();
++it)
{
- if(it->validateBlock(true)) count++;
+ if(it->validateBlock(false)) count++;
}
return count;
}
@@ -1251,7 +1283,7 @@ namespace LLInitParam
bool overwriteFrom(const self_t& other)
{
mCurChoice = other.mCurChoice;
- return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+ return BaseBlock::merge(blockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
@@ -1365,40 +1397,6 @@ namespace LLInitParam
}
};
- struct AnyAmount
- {
- static U32 minCount() { return 0; }
- static U32 maxCount() { return U32_MAX; }
- };
-
- template<U32 MIN_AMOUNT>
- struct AtLeast
- {
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return U32_MAX; }
- };
-
- template<U32 MAX_AMOUNT>
- struct AtMost
- {
- static U32 minCount() { return 0; }
- static U32 maxCount() { return MAX_AMOUNT; }
- };
-
- template<U32 MIN_AMOUNT, U32 MAX_AMOUNT>
- struct Between
- {
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return MAX_AMOUNT; }
- };
-
- template<U32 EXACT_COUNT>
- struct Exactly
- {
- static U32 minCount() { return EXACT_COUNT; }
- static U32 maxCount() { return EXACT_COUNT; }
- };
-
template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
class Block
: public BASE_BLOCK
@@ -1412,13 +1410,13 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+ return BaseBlock::merge(blockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return BaseBlock::fillFromImpl(blockDescriptor(), other);
+ return BaseBlock::merge(blockDescriptor(), other, false);
}
protected:
Block()
@@ -1491,7 +1489,7 @@ namespace LLInitParam
};
- template <typename T, typename RANGE = AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >
class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
{
public:
@@ -1709,9 +1707,9 @@ namespace LLInitParam
// if cached value is stale, regenerate from params
if (Param::getProvided() && mData.mLastParamVersion < BaseBlock::getLastChangeVersion())
{
- if (block_t::validateBlock(true))
+ if (block_t::validateBlock(false))
{
- mData.mValue = static_cast<const DERIVED*>(this)->getValueFromBlock();
+ static_cast<const DERIVED*>(this)->setValueFromBlock();
// clear stale keyword associated with old value
mData.clearKey();
mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
@@ -1731,12 +1729,14 @@ namespace LLInitParam
void set(value_assignment_t val, bool flag_as_provided = true)
{
Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
+
// set param version number to be up to date, so we ignore block contents
mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
mData.mValue = val;
mData.clearKey();
setProvided(flag_as_provided);
+ static_cast<DERIVED*>(this)->setBlockFromValue();
}
void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
@@ -1766,9 +1766,9 @@ namespace LLInitParam
if (Param::getProvided() && (mData.mLastParamVersion < BaseBlock::getLastChangeVersion()))
{
// go ahead and issue warnings at this point if any param is invalid
- if(block_t::validateBlock(false))
+ if(block_t::validateBlock(true))
{
- mData.mValue = static_cast<const DERIVED*>(this)->getValueFromBlock();
+ static_cast<const DERIVED*>(this)->setValueFromBlock();
mData.clearKey();
mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
}
@@ -1794,25 +1794,23 @@ namespace LLInitParam
private:
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
- const self_t& src_param = static_cast<const self_t&>(src);
+ const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (src_param.isProvided()
+ if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
// assign individual parameters
- if (overwrite)
- {
- dst_typed_param.BaseBlock::overwriteFromImpl(block_t::blockDescriptor(), src_param);
- }
- else
- {
- dst_typed_param.BaseBlock::fillFromImpl(block_t::blockDescriptor(), src_param);
- }
+ dst_typed_param.BaseBlock::merge(block_t::blockDescriptor(), src_typed_param, overwrite);
+
// then copy actual value
- dst_typed_param.mData.mValue = src_param.get();
+ dst_typed_param.mData.mValue = src_typed_param.get();
dst_typed_param.mData.clearKey();
dst_typed_param.setProvided(true);
+
+ // Propagate value back to block params since the value was updated during this merge.
+ // This will result in mData.mValue and the block params being in sync.
+ static_cast<DERIVED&>(dst_typed_param).setBlockFromValue();
return true;
}
return false;
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index 4c800a502d..d6f17dbb08 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -162,7 +162,7 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
args["STRING_NAME"] = xml_desc;
LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
- //LLNotifications::instance().add("MissingString", args); // *TODO: resurrect
+ //LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect
//return xml_desc;
return "MissingString("+xml_desc+")";
@@ -189,7 +189,7 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const
LLSD args;
args["STRING_NAME"] = xml_desc;
LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
- //LLNotifications::instance().add("MissingString", args);
+ //LLNotificationsUtil::add("MissingString", args);
return false;
}
diff --git a/indra/llxuixml/lluicolor.cpp b/indra/llxuixml/lluicolor.cpp
index 424d878a6b..0049ec055c 100644
--- a/indra/llxuixml/lluicolor.cpp
+++ b/indra/llxuixml/lluicolor.cpp
@@ -16,13 +16,15 @@ LLUIColor::LLUIColor()
{
}
-LLUIColor::LLUIColor(const LLColor4* color)
- :mColorPtr(color)
+
+LLUIColor::LLUIColor(const LLColor4& color)
+: mColor(color),
+ mColorPtr(NULL)
{
}
-LLUIColor::LLUIColor(const LLColor4& color)
- :mColor(color), mColorPtr(NULL)
+LLUIColor::LLUIColor(const LLUIColor* color)
+: mColorPtr(color)
{
}
@@ -32,14 +34,14 @@ void LLUIColor::set(const LLColor4& color)
mColorPtr = NULL;
}
-void LLUIColor::set(const LLColor4* color)
+void LLUIColor::set(const LLUIColor* color)
{
mColorPtr = color;
}
const LLColor4& LLUIColor::get() const
{
- return (mColorPtr == NULL ? mColor : *mColorPtr);
+ return (mColorPtr == NULL ? mColor : mColorPtr->get());
}
LLUIColor::operator const LLColor4& () const
diff --git a/indra/llxuixml/lluicolor.h b/indra/llxuixml/lluicolor.h
index bb0f786326..0ef2f78b24 100644
--- a/indra/llxuixml/lluicolor.h
+++ b/indra/llxuixml/lluicolor.h
@@ -22,11 +22,11 @@ class LLUIColor
{
public:
LLUIColor();
- LLUIColor(const LLColor4* color);
LLUIColor(const LLColor4& color);
+ LLUIColor(const LLUIColor* color);
void set(const LLColor4& color);
- void set(const LLColor4* color);
+ void set(const LLUIColor* color);
const LLColor4& get() const;
@@ -38,7 +38,7 @@ public:
private:
friend struct LLInitParam::ParamCompare<LLUIColor, false>;
- const LLColor4* mColorPtr;
+ const LLUIColor* mColorPtr;
LLColor4 mColor;
};
@@ -47,7 +47,7 @@ namespace LLInitParam
template<>
struct ParamCompare<LLUIColor, false>
{
- static bool equals(const class LLUIColor& a, const class LLUIColor& b);
+ static bool equals(const LLUIColor& a, const LLUIColor& b);
};
}
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index 17399865e5..dbc20a5a1e 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -324,33 +324,33 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p
// add includes for all possible children
const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name);
const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type);
-
- // add include declarations for all valid children
- for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
- it != widget_registryp->currentRegistrar().endItems();
- ++it)
- {
- std::string widget_name = it->first;
- if (widget_name == type_name)
- {
- continue;
- }
- LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
- nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
-
- // add to front of schema
- mSchemaNode->addChild(nodep, mSchemaNode);
- }
// add choices for valid children
if (widget_registryp)
{
+ // add include declarations for all valid children
+ for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
+ it != widget_registryp->currentRegistrar().endItems();
+ ++it)
+ {
+ std::string widget_name = it->first;
+ if (widget_name == type_name)
+ {
+ continue;
+ }
+ LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
+ nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
+
+ // add to front of schema
+ mSchemaNode->addChild(nodep, mSchemaNode);
+ }
+
for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
it != widget_registryp->currentRegistrar().endItems();
++it)
{
std::string widget_name = it->first;
- //<xs:element name="widget_name" type="widget_name">
+ //<xs:element name="widget_name" type="widget_name">
LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false);
widget_node->createChild("name", true)->setStringValue(widget_name);
widget_node->createChild("type", true)->setStringValue(widget_name);
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 8c891b3e8f..8fe9f5ed29 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -613,6 +613,7 @@ extern "C" { int yyerror(const char *fmt, ...); }
"CLICK_ACTION_OPEN" { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
"CLICK_ACTION_PLAY" { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
"CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM" { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
"TEXTURE_BLANK" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); }
"TEXTURE_DEFAULT" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); }
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 3b8bbbe805..3d19de193a 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -9805,6 +9805,9 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
break;
case LSCP_EMIT_BYTE_CODE:
{
+ llassert(mEventp);
+ if (!mEventp) return;
+
// order for event handler
// set jump table value
S32 jumpoffset;
@@ -9818,13 +9821,11 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
chunk->addBytes(4);
// null terminated event name and null terminated parameters
- if (mEventp)
- {
- LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
- mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
- chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
- delete event;
- }
+ LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
+ mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
+ chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
+ delete event;
+
chunk->addBytes(1);
// now we're at the first opcode
@@ -10626,6 +10627,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,
}
temp = temp->mNextp;
}
+
+ mClassName[0] = '\0';
}
void LLScriptScript::setBytecodeDest(const char* dst_filename)
diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h
index a667e1eb5b..7de9606dfc 100644
--- a/indra/lscript/lscript_compile/lscript_tree.h
+++ b/indra/lscript/lscript_compile/lscript_tree.h
@@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement
{
public:
LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier)
- : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier)
+ : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)
{
}
@@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition
{
public:
LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event)
- : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL)
+ : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)
{
}
diff --git a/indra/lscript/lscript_export.h b/indra/lscript/lscript_export.h
index d4626a8cd2..4c883582e2 100644
--- a/indra/lscript/lscript_export.h
+++ b/indra/lscript/lscript_export.h
@@ -35,6 +35,6 @@
#include "lscript_library.h"
-extern LLScriptLibrary gScriptLibrary;
+
#endif
diff --git a/indra/lscript/lscript_library.h b/indra/lscript/lscript_library.h
index 6728d70d0a..363d11f3aa 100644
--- a/indra/lscript/lscript_library.h
+++ b/indra/lscript/lscript_library.h
@@ -70,7 +70,7 @@ public:
std::vector<LLScriptLibraryFunction> mFunctions;
};
-extern LLScriptLibrary gScriptLibrary;
+
class LLScriptLibData
{
@@ -428,4 +428,6 @@ public:
};
+extern LLScriptLibrary gScriptLibrary;
+
#endif
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index daf3e10857..420e836e36 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -10,6 +10,7 @@ include(LLMessage)
include(LLVFS)
include(LLXML)
include(Linking)
+include(LLSharedLibs)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -74,3 +75,6 @@ add_custom_command(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib
)
+ll_deploy_sharedlibs_command(mac-crash-logger)
+
+
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index 0eac76fa69..57d426aa24 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -77,3 +77,4 @@ add_custom_command(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
)
+ll_deploy_sharedlibs_command(mac-updater)
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index d35afd8cbd..cc03d9cb72 100644
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -9,3 +9,5 @@ add_subdirectory(gstreamer010)
if (WINDOWS OR DARWIN)
add_subdirectory(quicktime)
endif (WINDOWS OR DARWIN)
+
+add_subdirectory(example)
diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp
index 6acac07423..658783e064 100644
--- a/indra/media_plugins/base/media_plugin_base.cpp
+++ b/indra/media_plugins/base/media_plugin_base.cpp
@@ -2,6 +2,9 @@
* @file media_plugin_base.cpp
* @brief Media plugin base class for LLMedia API plugin system
*
+ * All plugins should be a subclass of MediaPluginBase.
+ *
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +30,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -35,7 +39,10 @@
// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
////////////////////////////////////////////////////////////////////////////////
-//
+/// Media plugin constructor.
+///
+/// @param[in] host_send_func Function for sending messages from plugin to plugin loader shell
+/// @param[in] host_user_data Message data for messages from plugin to plugin loader shell
MediaPluginBase::MediaPluginBase(
LLPluginInstance::sendMessageFunction host_send_func,
@@ -53,6 +60,12 @@ MediaPluginBase::MediaPluginBase(
mStatus = STATUS_NONE;
}
+/**
+ * Converts current media status enum value into string (STATUS_LOADING into "loading", etc.)
+ *
+ * @return Media status string ("loading", "playing", "paused", etc)
+ *
+ */
std::string MediaPluginBase::statusString()
{
std::string result;
@@ -73,6 +86,12 @@ std::string MediaPluginBase::statusString()
return result;
}
+/**
+ * Set media status.
+ *
+ * @param[in] status Media status (STATUS_LOADING, STATUS_PLAYING, STATUS_PAUSED, etc)
+ *
+ */
void MediaPluginBase::setStatus(EStatus status)
{
if(mStatus != status)
@@ -83,6 +102,13 @@ void MediaPluginBase::setStatus(EStatus status)
}
+/**
+ * Receive message from plugin loader shell.
+ *
+ * @param[in] message_string Message string
+ * @param[in] user_data Message data
+ *
+ */
void MediaPluginBase::staticReceiveMessage(const char *message_string, void **user_data)
{
MediaPluginBase *self = (MediaPluginBase*)*user_data;
@@ -100,12 +126,27 @@ void MediaPluginBase::staticReceiveMessage(const char *message_string, void **us
}
}
+/**
+ * Send message to plugin loader shell.
+ *
+ * @param[in] message Message data being sent to plugin loader shell
+ *
+ */
void MediaPluginBase::sendMessage(const LLPluginMessage &message)
{
std::string output = message.generate();
mHostSendFunction(output.c_str(), &mHostUserData);
}
+/**
+ * Notifies plugin loader shell that part of display area needs to be redrawn.
+ *
+ * @param[in] left Left X coordinate of area to redraw (0,0 is at top left corner)
+ * @param[in] top Top Y coordinate of area to redraw (0,0 is at top left corner)
+ * @param[in] right Right X-coordinate of area to redraw (0,0 is at top left corner)
+ * @param[in] bottom Bottom Y-coordinate of area to redraw (0,0 is at top left corner)
+ *
+ */
void MediaPluginBase::setDirty(int left, int top, int right, int bottom)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
@@ -118,6 +159,10 @@ void MediaPluginBase::setDirty(int left, int top, int right, int bottom)
sendMessage(message);
}
+/**
+ * Sends "media_status" message to plugin loader shell ("loading", "playing", "paused", etc.)
+ *
+ */
void MediaPluginBase::sendStatus()
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "media_status");
@@ -141,6 +186,17 @@ extern "C"
LLSYMEXPORT int LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data);
}
+/**
+ * Plugin initialization and entry point. Establishes communication channel for messages between plugin and plugin loader shell. TODO:DOC - Please check!
+ *
+ * @param[in] host_send_func Function for sending messages from plugin to plugin loader shell
+ * @param[in] host_user_data Message data for messages from plugin to plugin loader shell
+ * @param[out] plugin_send_func Function for plugin to receive messages from plugin loader shell
+ * @param[out] plugin_user_data Pointer to plugin instance
+ *
+ * @return int, where 0=success
+ *
+ */
LLSYMEXPORT int
LLPluginInitEntryPoint(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
{
diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h
index f1e96335f9..ed4dc0cfa9 100644
--- a/indra/media_plugins/base/media_plugin_base.h
+++ b/indra/media_plugins/base/media_plugin_base.h
@@ -2,6 +2,7 @@
* @file media_plugin_base.h
* @brief Media plugin base class for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -40,14 +42,17 @@ class MediaPluginBase
{
public:
MediaPluginBase(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ /** Media plugin destructor. */
virtual ~MediaPluginBase() {}
+ /** Handle received message from plugin loader shell. */
virtual void receiveMessage(const char *message_string) = 0;
static void staticReceiveMessage(const char *message_string, void **user_data);
protected:
+ /** Plugin status. */
typedef enum
{
STATUS_NONE,
@@ -59,10 +64,13 @@ protected:
STATUS_DONE
} EStatus;
+ /** Plugin shared memory. */
class SharedSegmentInfo
{
public:
+ /** Shared memory address. */
void *mAddress;
+ /** Shared memory size. */
size_t mSize;
};
@@ -71,42 +79,56 @@ protected:
std::string statusString();
void setStatus(EStatus status);
- // The quicktime plugin overrides this to add current time and duration to the message...
+ /// Note: The quicktime plugin overrides this to add current time and duration to the message.
virtual void setDirty(int left, int top, int right, int bottom);
+ /** Map of shared memory names to shared memory. */
typedef std::map<std::string, SharedSegmentInfo> SharedSegmentMap;
+ /** Function to send message from plugin to plugin loader shell. */
LLPluginInstance::sendMessageFunction mHostSendFunction;
+ /** Message data being sent to plugin loader shell by mHostSendFunction. */
void *mHostUserData;
+ /** Flag to delete plugin instance (self). */
bool mDeleteMe;
+ /** Pixel array to display. TODO:DOC are pixels always 24-bit RGB format, aligned on 32-bit boundary? Also: calling this a pixel array may be misleading since 1 pixel > 1 char. */
unsigned char* mPixels;
+ /** TODO:DOC what's this for -- does a texture have its own piece of shared memory? updated on size_change_request, cleared on shm_remove */
std::string mTextureSegmentName;
+ /** Width of plugin display in pixels. */
int mWidth;
+ /** Height of plugin display in pixels. */
int mHeight;
+ /** Width of plugin texture. */
int mTextureWidth;
+ /** Height of plugin texture. */
int mTextureHeight;
+ /** Pixel depth (pixel size in bytes). */
int mDepth;
+ /** Current status of plugin. */
EStatus mStatus;
+ /** Map of shared memory segments. */
SharedSegmentMap mSharedSegments;
};
-// The plugin must define this function to create its instance.
+/** The plugin <b>must</b> define this function to create its instance.
+ * It should look something like this:
+ * @code
+ * {
+ * MediaPluginFoo *self = new MediaPluginFoo(host_send_func, host_user_data);
+ * *plugin_send_func = MediaPluginFoo::staticReceiveMessage;
+ * *plugin_user_data = (void*)self;
+ *
+ * return 0;
+ * }
+ * @endcode
+ */
int init_media_plugin(
LLPluginInstance::sendMessageFunction host_send_func,
void *host_user_data,
LLPluginInstance::sendMessageFunction *plugin_send_func,
void **plugin_user_data);
-// It should look something like this:
-/*
-{
- MediaPluginFoo *self = new MediaPluginFoo(host_send_func, host_user_data);
- *plugin_send_func = MediaPluginFoo::staticReceiveMessage;
- *plugin_user_data = (void*)self;
-
- return 0;
-}
-*/
diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt
new file mode 100644
index 0000000000..4d82f2747c
--- /dev/null
+++ b/indra/media_plugins/example/CMakeLists.txt
@@ -0,0 +1,74 @@
+# -*- cmake -*-
+
+project(media_plugin_example)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLPlugin)
+include(LLMath)
+include(LLRender)
+include(LLWindow)
+include(Linking)
+include(PluginAPI)
+include(MediaPluginBase)
+include(FindOpenGL)
+
+include(ExamplePlugin)
+
+include_directories(
+ ${LLPLUGIN_INCLUDE_DIRS}
+ ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${LLRENDER_INCLUDE_DIRS}
+ ${LLWINDOW_INCLUDE_DIRS}
+)
+
+
+### media_plugin_example
+
+set(media_plugin_example_SOURCE_FILES
+ media_plugin_example.cpp
+ )
+
+add_library(media_plugin_example
+ SHARED
+ ${media_plugin_example_SOURCE_FILES}
+)
+
+target_link_libraries(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${EXAMPLE_PLUGIN_LIBRARIES}
+ ${PLUGIN_API_WINDOWS_LIBRARIES}
+)
+
+add_dependencies(media_plugin_example
+ ${LLPLUGIN_LIBRARIES}
+ ${MEDIA_PLUGIN_BASE_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+)
+
+if (WINDOWS)
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO"
+ )
+endif (WINDOWS)
+
+if (DARWIN)
+ # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
+ set_target_properties(
+ media_plugin_example
+ PROPERTIES
+ PREFIX ""
+ BUILD_WITH_INSTALL_RPATH 1
+ INSTALL_NAME_DIR "@executable_path"
+ LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
+ )
+
+endif (DARWIN) \ No newline at end of file
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
new file mode 100644
index 0000000000..f5b077fea0
--- /dev/null
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -0,0 +1,490 @@
+/**
+ * @file media_plugin_example.cpp
+ * @brief Example plugin for LLMedia API plugin system
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#include <time.h>
+
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginExample :
+ public MediaPluginBase
+{
+ public:
+ MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
+ ~MediaPluginExample();
+
+ /*virtual*/ void receiveMessage( const char* message_string );
+
+ private:
+ bool init();
+ void update( F64 milliseconds );
+ void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
+ bool mFirstTime;
+
+ time_t mLastUpdateTime;
+ enum Constants { ENumObjects = 10 };
+ unsigned char* mBackgroundPixels;
+ int mColorR[ ENumObjects ];
+ int mColorG[ ENumObjects ];
+ int mColorB[ ENumObjects ];
+ int mXpos[ ENumObjects ];
+ int mYpos[ ENumObjects ];
+ int mXInc[ ENumObjects ];
+ int mYInc[ ENumObjects ];
+ int mBlockSize[ ENumObjects ];
+ bool mMouseButtonDown;
+ bool mStopAction;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) :
+ MediaPluginBase( host_send_func, host_user_data )
+{
+ mFirstTime = true;
+ mWidth = 0;
+ mHeight = 0;
+ mDepth = 4;
+ mPixels = 0;
+ mMouseButtonDown = false;
+ mStopAction = false;
+ mLastUpdateTime = 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+MediaPluginExample::~MediaPluginExample()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::receiveMessage( const char* message_string )
+{
+ LLPluginMessage message_in;
+
+ if ( message_in.parse( message_string ) >= 0 )
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_BASE )
+ {
+ if ( message_name == "init" )
+ {
+ LLPluginMessage message( "base", "init_response" );
+ LLSD versions = LLSD::emptyMap();
+ versions[ LLPLUGIN_MESSAGE_CLASS_BASE ] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ message.setValueLLSD( "versions", versions );
+
+ std::string plugin_version = "Example media plugin, Example Version 1.0.0.0";
+ message.setValue( "plugin_version", plugin_version );
+ sendMessage( message );
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
+ message.setValueS32( "default_width", mWidth );
+ message.setValueS32( "default_height", mHeight );
+ message.setValueS32( "depth", mDepth );
+ message.setValueU32( "internalformat", GL_RGBA );
+ message.setValueU32( "format", GL_RGBA );
+ message.setValueU32( "type", GL_UNSIGNED_BYTE );
+ message.setValueBoolean( "coords_opengl", false );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "idle" )
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal( "time" );
+
+ // Convert time to milliseconds for update()
+ update( time );
+ }
+ else
+ if ( message_name == "cleanup" )
+ {
+ // clean up here
+ }
+ else
+ if ( message_name == "shm_added" )
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer( "address" );
+ info.mSize = ( size_t )message_in.getValueS32( "size" );
+ std::string name = message_in.getValue( "name" );
+
+ mSharedSegments.insert( SharedSegmentMap::value_type( name, info ) );
+
+ }
+ else
+ if ( message_name == "shm_remove" )
+ {
+ std::string name = message_in.getValue( "name" );
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if( iter != mSharedSegments.end() )
+ {
+ if ( mPixels == iter->second.mAddress )
+ {
+ // This is the currently active pixel buffer.
+ // Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ };
+ mSharedSegments.erase( iter );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown shared memory region!" << std::endl;
+ };
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message( "base", "shm_remove_response" );
+ message.setValue( "name", name );
+ sendMessage( message );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown base message: " << message_name << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA )
+ {
+ if ( message_name == "size_change" )
+ {
+ std::string name = message_in.getValue( "name" );
+ S32 width = message_in.getValueS32( "width" );
+ S32 height = message_in.getValueS32( "height" );
+ S32 texture_width = message_in.getValueS32( "texture_width" );
+ S32 texture_height = message_in.getValueS32( "texture_height" );
+
+ if ( ! name.empty() )
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find( name );
+ if ( iter != mSharedSegments.end() )
+ {
+ mPixels = ( unsigned char* )iter->second.mAddress;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ init();
+ };
+ };
+
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response" );
+ message.setValue( "name", name );
+ message.setValueS32( "width", width );
+ message.setValueS32( "height", height );
+ message.setValueS32( "texture_width", texture_width );
+ message.setValueS32( "texture_height", texture_height );
+ sendMessage( message );
+ }
+ else
+ if ( message_name == "load_uri" )
+ {
+ std::string uri = message_in.getValue( "uri" );
+ if ( ! uri.empty() )
+ {
+ };
+ }
+ else
+ if ( message_name == "mouse_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 button = message_in.getValueS32( "button" );
+
+ // left mouse button
+ if ( button == 0 )
+ {
+ int mouse_x = message_in.getValueS32( "x" );
+ int mouse_y = message_in.getValueS32( "y" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "move" )
+ {
+ if ( mMouseButtonDown )
+ write_pixel( mouse_x, mouse_y, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80 );
+ }
+ else
+ if ( event == "down" )
+ {
+ mMouseButtonDown = true;
+ }
+ else
+ if ( event == "up" )
+ {
+ mMouseButtonDown = false;
+ }
+ else
+ if ( event == "double_click" )
+ {
+ };
+ };
+ }
+ else
+ if ( message_name == "key_event" )
+ {
+ std::string event = message_in.getValue( "event" );
+ S32 key = message_in.getValueS32( "key" );
+ std::string modifiers = message_in.getValue( "modifiers" );
+
+ if ( event == "down" )
+ {
+ if ( key == ' ')
+ {
+ mLastUpdateTime = 0;
+ update( 0.0f );
+ };
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media message: " << message_string << std::endl;
+ };
+ }
+ else
+ if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER )
+ {
+ if ( message_name == "browse_reload" )
+ {
+ mLastUpdateTime = 0;
+ mFirstTime = true;
+ mStopAction = false;
+ update( 0.0f );
+ }
+ else
+ if ( message_name == "browse_stop" )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ mXInc[ n ] = mYInc[ n ] = 0;
+
+ mStopAction = true;
+ update( 0.0f );
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown media_browser message: " << message_string << std::endl;
+ };
+ }
+ else
+ {
+ //std::cerr << "MediaPluginExample::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
+{
+ // make sure we don't write outside the buffer
+ if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
+ return;
+
+ if ( mBackgroundPixels != NULL )
+ {
+ unsigned char *pixel = mBackgroundPixels;
+ pixel += y * mWidth * mDepth;
+ pixel += ( x * mDepth );
+ pixel[ 0 ] = b;
+ pixel[ 1 ] = g;
+ pixel[ 2 ] = r;
+
+ setDirty( x, y, x + 1, y + 1 );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void MediaPluginExample::update( F64 milliseconds )
+{
+ if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
+ return;
+
+ if ( mPixels == 0 )
+ return;
+
+ if ( mFirstTime )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
+ mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
+
+ mColorR[ n ] = rand() % 0x60 + 0x60;
+ mColorG[ n ] = rand() % 0x60 + 0x60;
+ mColorB[ n ] = rand() % 0x60 + 0x60;
+
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+
+ mBlockSize[ n ] = rand() % 0x30 + 0x10;
+ };
+
+ delete [] mBackgroundPixels;
+
+ mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
+
+ mFirstTime = false;
+ };
+
+ if ( mStopAction )
+ return;
+
+ if ( time( NULL ) > mLastUpdateTime + 3 )
+ {
+ const int num_squares = rand() % 20 + 4;
+ int sqr1_r = rand() % 0x80 + 0x20;
+ int sqr1_g = rand() % 0x80 + 0x20;
+ int sqr1_b = rand() % 0x80 + 0x20;
+ int sqr2_r = rand() % 0x80 + 0x20;
+ int sqr2_g = rand() % 0x80 + 0x20;
+ int sqr2_b = rand() % 0x80 + 0x20;
+
+ for ( int y1 = 0; y1 < num_squares; ++y1 )
+ {
+ for ( int x1 = 0; x1 < num_squares; ++x1 )
+ {
+ int px_start = mWidth * x1 / num_squares;
+ int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
+ int py_start = mHeight * y1 / num_squares;
+ int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
+
+ for( int y2 = py_start; y2 < py_end; ++y2 )
+ {
+ for( int x2 = px_start; x2 < px_end; ++x2 )
+ {
+ int rowspan = mWidth * mDepth;
+
+ if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
+ }
+ else
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
+ };
+ };
+ };
+ };
+ };
+
+ time( &mLastUpdateTime );
+ };
+
+ memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
+
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ if ( rand() % 50 == 0 )
+ {
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+ };
+
+ if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
+ mXInc[ n ] =- mXInc[ n ];
+
+ if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
+ mYInc[ n ] =- mYInc[ n ];
+
+ mXpos[ n ] += mXInc[ n ];
+ mYpos[ n ] += mYInc[ n ];
+
+ for( int y = 0; y < mBlockSize[ n ]; ++y )
+ {
+ for( int x = 0; x < mBlockSize[ n ]; ++x )
+ {
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
+ };
+ };
+ };
+
+ setDirty( 0, 0, mWidth, mHeight );
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool MediaPluginExample::init()
+{
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
+ message.setValue( "name", "Example Plugin" );
+ sendMessage( message );
+
+ return true;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func,
+ void* host_user_data,
+ LLPluginInstance::sendMessageFunction *plugin_send_func,
+ void **plugin_user_data )
+{
+ MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
+ *plugin_send_func = MediaPluginExample::staticReceiveMessage;
+ *plugin_user_data = ( void* )self;
+
+ return 0;
+}
diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt
index a9f7938b41..3b73e04786 100644
--- a/indra/media_plugins/gstreamer010/CMakeLists.txt
+++ b/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -42,12 +42,12 @@ set(media_plugin_gstreamer010_HEADER_FILES
llmediaimplgstreamertriviallogging.h
)
-if (${CXX_VERSION} MATCHES "4[23].")
+if (${CXX_VERSION_NUMBER} MATCHES "4[23].")
# Work around a bad interaction between broken gstreamer headers and
# g++ 4.3's increased strictness.
set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES
COMPILE_FLAGS -Wno-write-strings)
-endif (${CXX_VERSION} MATCHES "4[23].")
+endif (${CXX_VERSION_NUMBER} MATCHES "4[23].")
add_library(media_plugin_gstreamer010
SHARED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
index ef41736c18..48accd3e66 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -3,6 +3,7 @@
* @author Tofu Linden
* @brief implementation that supports media playback via GStreamer.
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -29,6 +30,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
// header guard
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
index cc52232496..52cea46d46 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.cpp
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
index ee7473d6d1..88f100af6e 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.h
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index e31d4a3282..799808aa8b 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamertriviallogging.h
* @brief minimal logging utilities.
*
+ * @cond
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
@@ -35,10 +37,16 @@
#include <cstdio>
+extern "C" {
+#include <sys/types.h>
+#include <unistd.h>
+}
+
/////////////////////////////////////////////////////////////////////////
// Debug/Info/Warning macros.
#define MSGMODULEFOO "(media plugin)"
#define STDERRMSG(...) do{\
+ fprintf(stderr, " pid:%d: ", (int)getpid());\
fprintf(stderr, MSGMODULEFOO " %s:%d: ", __FUNCTION__, __LINE__);\
fprintf(stderr, __VA_ARGS__);\
fputc('\n',stderr);\
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
index d8ccfaa702..484948bd9f 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
@@ -106,11 +108,10 @@ gst_slvideo_show_frame (GstBaseSink * bsink, GstBuffer * buf)
slvideo = GST_SLVIDEO(bsink);
-#if 0
- fprintf(stderr, "\n\ntransferring a frame of %dx%d <- %p (%d)\n\n",
- slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
- slvideo->format);
-#endif
+ DEBUGMSG("transferring a frame of %dx%d <- %p (%d)",
+ slvideo->width, slvideo->height, GST_BUFFER_DATA(buf),
+ slvideo->format);
+
if (GST_BUFFER_DATA(buf))
{
// copy frame and frame info into neutral territory
@@ -335,7 +336,7 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
#define MAXDEPTHHACK 4
GST_OBJECT_LOCK(slvideo);
- if (slvideo->resize_forced)
+ if (slvideo->resize_forced_always) // app is giving us a fixed size to work with
{
gint slwantwidth, slwantheight;
slwantwidth = slvideo->resize_try_width;
@@ -384,6 +385,8 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
}
}
+ GST_OBJECT_UNLOCK(slvideo);
+
if (!made_bufferdata_ptr) // need to fallback to malloc at original size
{
GST_BUFFER_SIZE(newbuf) = width * height * MAXDEPTHHACK;
@@ -392,8 +395,6 @@ gst_slvideo_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
llgst_buffer_set_caps (GST_BUFFER_CAST(newbuf), caps);
}
- GST_OBJECT_UNLOCK(slvideo);
-
*buf = GST_BUFFER_CAST(newbuf);
return GST_FLOW_OK;
@@ -457,7 +458,7 @@ gst_slvideo_init (GstSLVideo * filter,
filter->retained_frame_format = SLV_PF_UNKNOWN;
GstCaps *caps = llgst_caps_from_string (SLV_ALLCAPS);
llgst_caps_replace (&filter->caps, caps);
- filter->resize_forced = false;
+ filter->resize_forced_always = false;
filter->resize_try_width = -1;
filter->resize_try_height = -1;
GST_OBJECT_UNLOCK(filter);
@@ -498,7 +499,7 @@ gst_slvideo_get_property (GObject * object, guint prop_id,
static gboolean
plugin_init (GstPlugin * plugin)
{
- DEBUGMSG("\n\n\nPLUGIN INIT\n\n\n");
+ DEBUGMSG("PLUGIN INIT");
GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, (gchar*)"private-slvideo-plugin",
0, (gchar*)"Second Life Video Sink");
@@ -526,7 +527,7 @@ void gst_slvideo_init_class (void)
"http://www.secondlife.com/");
#undef PACKAGE
ll_gst_plugin_register_static (&gst_plugin_desc);
- DEBUGMSG(stderr, "\n\n\nCLASS INIT\n\n\n");
+ DEBUGMSG("CLASS INIT");
}
#endif // LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
index f6d55b8758..8f1cf84978 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __GST_SLVIDEO_H__
@@ -88,7 +90,7 @@ struct _GstSLVideo
int retained_frame_width, retained_frame_height;
SLVPixelFormat retained_frame_format;
// sticky resize info
- bool resize_forced;
+ bool resize_forced_always;
int resize_try_width;
int resize_try_height;
};
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index a4c43988ba..26173314a7 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_gstreamer010.cpp
* @brief GStreamer-0.10 plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
@@ -103,7 +105,7 @@ private:
void mouseUp( int x, int y );
void mouseMove( int x, int y );
- bool sizeChanged();
+ void sizeChanged();
static bool mDoneInit;
@@ -113,13 +115,16 @@ private:
int mDepth;
- // media natural size
+ // media NATURAL size
int mNaturalWidth;
int mNaturalHeight;
- int mNaturalRowbytes;
- // previous media natural size so we can detect changes
- int mPreviousNaturalWidth;
- int mPreviousNaturalHeight;
+ // media current size
+ int mCurrentWidth;
+ int mCurrentHeight;
+ int mCurrentRowbytes;
+ // previous media size so we can detect changes
+ int mPreviousWidth;
+ int mPreviousHeight;
// desired render size from host
int mWidth;
int mHeight;
@@ -147,7 +152,7 @@ MediaPluginGStreamer010::MediaPluginGStreamer010(
void *host_user_data ) :
MediaPluginBase(host_send_func, host_user_data),
mBusWatchID ( 0 ),
- mNaturalRowbytes ( 4 ),
+ mCurrentRowbytes ( 4 ),
mTextureFormatPrimary ( GL_RGBA ),
mTextureFormatType ( GL_UNSIGNED_INT_8_8_8_8_REV ),
mSeekWanted(false),
@@ -193,6 +198,7 @@ MediaPluginGStreamer010::processGSTEvents(GstBus *bus,
}
else
{
+ // TODO: grok 'duration' message type
DEBUGMSG("Got GST message type: %s",
LLGST_MESSAGE_TYPE_NAME (message));
}
@@ -427,8 +433,8 @@ MediaPluginGStreamer010::update(int milliseconds)
{
DEBUGMSG("NEW FRAME READY");
- if (mVideoSink->retained_frame_width != mNaturalWidth ||
- mVideoSink->retained_frame_height != mNaturalHeight)
+ if (mVideoSink->retained_frame_width != mCurrentWidth ||
+ mVideoSink->retained_frame_height != mCurrentHeight)
// *TODO: also check for change in format
{
// just resize container, don't consume frame
@@ -455,39 +461,38 @@ MediaPluginGStreamer010::update(int milliseconds)
GST_OBJECT_UNLOCK(mVideoSink);
- mNaturalRowbytes = neww * newd;
+ mCurrentRowbytes = neww * newd;
DEBUGMSG("video container resized to %dx%d",
neww, newh);
mDepth = newd;
- mNaturalWidth = neww;
- mNaturalHeight = newh;
+ mCurrentWidth = neww;
+ mCurrentHeight = newh;
sizeChanged();
return true;
}
if (mPixels &&
- mNaturalHeight <= mHeight &&
- mNaturalWidth <= mWidth &&
+ mCurrentHeight <= mHeight &&
+ mCurrentWidth <= mWidth &&
!mTextureSegmentName.empty())
{
-
// we're gonna totally consume this frame - reset 'ready' flag
- mVideoSink->retained_frame_ready = FALSE;
+ mVideoSink->retained_frame_ready = FALSE;
int destination_rowbytes = mWidth * mDepth;
- for (int row=0; row<mNaturalHeight; ++row)
+ for (int row=0; row<mCurrentHeight; ++row)
{
memcpy(&mPixels
[destination_rowbytes * row],
&mVideoSink->retained_frame_data
- [mNaturalRowbytes * row],
- mNaturalRowbytes);
+ [mCurrentRowbytes * row],
+ mCurrentRowbytes);
}
GST_OBJECT_UNLOCK(mVideoSink);
DEBUGMSG("NEW FRAME REALLY TRULY CONSUMED, TELLING HOST");
- setDirty(0,0,mNaturalWidth,mNaturalHeight);
+ setDirty(0,0,mCurrentWidth,mCurrentHeight);
}
else
{
@@ -834,27 +839,35 @@ MediaPluginGStreamer010::startup()
}
-bool
+void
MediaPluginGStreamer010::sizeChanged()
{
// the shared writing space has possibly changed size/location/whatever
- // Check to see whether the movie's natural size has updated
- if (mNaturalWidth != mPreviousNaturalWidth ||
- mNaturalHeight != mPreviousNaturalHeight)
+ // Check to see whether the movie's NATURAL size has been set yet
+ if (1 == mNaturalWidth &&
+ 1 == mNaturalHeight)
{
- mPreviousNaturalWidth = mNaturalWidth;
- mPreviousNaturalHeight = mNaturalHeight;
+ mNaturalWidth = mCurrentWidth;
+ mNaturalHeight = mCurrentHeight;
+ DEBUGMSG("Media NATURAL size better detected as %dx%d",
+ mNaturalWidth, mNaturalHeight);
+ }
+
+ // if the size has changed then the shm has changed and the app needs telling
+ if (mCurrentWidth != mPreviousWidth ||
+ mCurrentHeight != mPreviousHeight)
+ {
+ mPreviousWidth = mCurrentWidth;
+ mPreviousHeight = mCurrentHeight;
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
message.setValue("name", mTextureSegmentName);
message.setValueS32("width", mNaturalWidth);
message.setValueS32("height", mNaturalHeight);
- DEBUGMSG("<--- Sending size change request to application with name: '%s' - size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
+ DEBUGMSG("<--- Sending size change request to application with name: '%s' - natural size is %d x %d", mTextureSegmentName.c_str(), mNaturalWidth, mNaturalHeight);
sendMessage(message);
}
-
- return true;
}
@@ -939,10 +952,12 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
// lame to have to decide this now, it depends on the movie. Oh well.
mDepth = 4;
+ mCurrentWidth = 1;
+ mCurrentHeight = 1;
+ mPreviousWidth = 1;
+ mPreviousHeight = 1;
mNaturalWidth = 1;
mNaturalHeight = 1;
- mPreviousNaturalWidth = 1;
- mPreviousNaturalHeight = 1;
mWidth = 1;
mHeight = 1;
mTextureWidth = 1;
@@ -983,7 +998,6 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
INFOMSG("MediaPluginGStreamer010::receiveMessage: shared memory added, name: %s, size: %d, address: %p", name.c_str(), int(info.mSize), info.mAddress);
mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
}
else if(message_name == "shm_remove")
{
@@ -1062,7 +1076,7 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
INFOMSG("**** = REAL RESIZE REQUEST FROM APP");
GST_OBJECT_LOCK(mVideoSink);
- mVideoSink->resize_forced = true;
+ mVideoSink->resize_forced_always = true;
mVideoSink->resize_try_width = texture_width;
mVideoSink->resize_try_height = texture_height;
GST_OBJECT_UNLOCK(mVideoSink);
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index fb6d5b2905..e230fcc280 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -1,1098 +1,1112 @@
-/**
- * @file media_plugin_quicktime.cpp
- * @brief QuickTime plugin for LLMedia API plugin system
- *
- * $LicenseInfo:firstyear=2008&license=viewergpl$
- *
- * Copyright (c) 2008, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlife.com/developers/opensource/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlife.com/developers/opensource/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llgl.h"
-
-#include "llplugininstance.h"
-#include "llpluginmessage.h"
-#include "llpluginmessageclasses.h"
-#include "media_plugin_base.h"
-
-#if LL_QUICKTIME_ENABLED
-
-#if defined(LL_DARWIN)
- #include <QuickTime/QuickTime.h>
-#elif defined(LL_WINDOWS)
- #include "MacTypes.h"
- #include "QTML.h"
- #include "Movies.h"
- #include "QDoffscreen.h"
- #include "FixMath.h"
- #include "QTLoadLibraryUtils.h"
-#endif
-
-// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
-////////////////////////////////////////////////////////////////////////////////
-//
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
- MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
- ~MediaPluginQuickTime();
-
- /* virtual */ void receiveMessage(const char *message_string);
-
-private:
-
- int mNaturalWidth;
- int mNaturalHeight;
- Movie mMovieHandle;
- GWorldPtr mGWorldHandle;
- ComponentInstance mMovieController;
- int mCurVolume;
- bool mMediaSizeChanging;
- bool mIsLooping;
- std::string mMovieTitle;
- bool mReceivedTitle;
- const int mMinWidth;
- const int mMaxWidth;
- const int mMinHeight;
- const int mMaxHeight;
- F64 mPlayRate;
- std::string mNavigateURL;
-
- enum ECommand {
- COMMAND_NONE,
- COMMAND_STOP,
- COMMAND_PLAY,
- COMMAND_FAST_FORWARD,
- COMMAND_FAST_REWIND,
- COMMAND_PAUSE,
- COMMAND_SEEK,
- };
- ECommand mCommand;
-
- // Override this to add current time and duration to the message
- /*virtual*/ void setDirty(int left, int top, int right, int bottom)
- {
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
-
- message.setValueS32("left", left);
- message.setValueS32("top", top);
- message.setValueS32("right", right);
- message.setValueS32("bottom", bottom);
-
- if(mMovieHandle)
- {
- message.setValueReal("current_time", getCurrentTime());
- message.setValueReal("duration", getDuration());
- message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
- }
-
- sendMessage(message);
- }
-
-
- static Rect rectFromSize(int width, int height)
- {
- Rect result;
-
-
- result.left = 0;
- result.top = 0;
- result.right = width;
- result.bottom = height;
-
- return result;
- }
-
- Fixed getPlayRate(void)
- {
- Fixed result;
- if(mPlayRate == 0.0f)
- {
- // Default to the movie's preferred rate
- result = GetMoviePreferredRate(mMovieHandle);
- if(result == 0)
- {
- // Don't return a 0 play rate, ever.
- std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
- result = X2Fix(1.0f);
- }
- }
- else
- {
- result = X2Fix(mPlayRate);
- }
-
- return result;
- }
-
- void load( const std::string url )
- {
-
- if ( url.empty() )
- return;
-
- // Stop and unload any existing movie before starting another one.
- unload();
-
- setStatus(STATUS_LOADING);
-
- //In case std::string::c_str() makes a copy of the url data,
- //make sure there is memory to hold it before allocating memory for handle.
- //if fails, NewHandleClear(...) should return NULL.
- const char* url_string = url.c_str() ;
- Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
-
- if ( NULL == handle || noErr != MemError() || NULL == *handle )
- {
- setStatus(STATUS_ERROR);
- return;
- }
-
- BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
-
- OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
- DisposeHandle( handle );
- if ( noErr != err )
- {
- setStatus(STATUS_ERROR);
- return;
- };
-
- mNavigateURL = url;
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
- message.setValue("uri", mNavigateURL);
- sendMessage(message);
-
- // do pre-roll actions (typically fired for streaming movies but not always)
- PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
-
- Rect movie_rect = rectFromSize(mWidth, mHeight);
-
- // make a new movie controller
- mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
-
- // movie controller
- MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
-
- SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
-
- // function that gets called when a frame is drawn
- SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
-
- setStatus(STATUS_LOADED);
-
- sizeChanged();
- };
-
- bool unload()
- {
- // new movie and have to get title again
- mReceivedTitle = false;
-
- if ( mMovieHandle )
- {
- StopMovie( mMovieHandle );
- if ( mMovieController )
- {
- MCMovieChanged( mMovieController, mMovieHandle );
- };
- };
-
- if ( mMovieController )
- {
- MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
- DisposeMovieController( mMovieController );
- mMovieController = NULL;
- };
-
- if ( mMovieHandle )
- {
- SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
- DisposeMovie( mMovieHandle );
- mMovieHandle = NULL;
- };
-
- if ( mGWorldHandle )
- {
- DisposeGWorld( mGWorldHandle );
- mGWorldHandle = NULL;
- };
-
- setStatus(STATUS_NONE);
-
- return true;
- }
-
- bool navigateTo( const std::string url )
- {
- unload();
- load( url );
-
- return true;
- };
-
- bool sizeChanged()
- {
- if ( ! mMovieHandle )
- return false;
-
- // Check to see whether the movie's natural size has updated
- {
- int width, height;
- getMovieNaturalSize(&width, &height);
- if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
- {
- mNaturalWidth = width;
- mNaturalHeight = height;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
- message.setValue("name", mTextureSegmentName);
- message.setValueS32("width", width);
- message.setValueS32("height", height);
- sendMessage(message);
- //std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
- }
- }
-
- // sanitize destination size
- Rect dest_rect = rectFromSize(mWidth, mHeight);
-
- // media depth won't change
- int depth_bits = mDepth * 8;
- long rowbytes = mDepth * mTextureWidth;
-
- GWorldPtr old_gworld_handle = mGWorldHandle;
-
- if(mPixels != NULL)
- {
- // We have pixels. Set up a GWorld pointing at the texture.
- OSErr result = NewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
- if ( noErr != result )
- {
- // TODO: unrecoverable?? throw exception? return something?
- return false;
- }
- }
- else
- {
- // We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
- Rect tempRect = rectFromSize(1, 1);
- OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
- if ( noErr != result )
- {
- // TODO: unrecoverable?? throw exception? return something?
- return false;
- }
- }
-
- SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice( mGWorldHandle ) );
-
- // If the GWorld was already set up, delete it.
- if(old_gworld_handle != NULL)
- {
- DisposeGWorld( old_gworld_handle );
- }
-
- // Set up the movie display matrix
- {
- // scale movie to fit rect and invert vertically to match opengl image format
- MatrixRecord transform;
- SetIdentityMatrix( &transform ); // transforms are additive so start from identify matrix
- double scaleX = (double) mWidth / mNaturalWidth;
- double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
- double centerX = mWidth / 2.0;
- double centerY = mHeight / 2.0;
- ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
- SetMovieMatrix( mMovieHandle, &transform );
- }
-
- // update movie controller
- if ( mMovieController )
- {
- MCSetControllerPort( mMovieController, mGWorldHandle );
- MCPositionController( mMovieController, &dest_rect, &dest_rect,
- mcTopLeftMovie | mcPositionDontInvalidate );
- MCMovieChanged( mMovieController, mMovieHandle );
- }
-
-
- // Emit event with size change so the calling app knows about it too
- // TODO:
- //LLMediaEvent event( this );
- //mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
- return true;
- }
- static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
- {
- Boolean result = false;
-
- MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
- switch( action )
- {
- // handle window resizing
- case mcActionControllerSizeChanged:
- // Ensure that the movie draws correctly at the new size
- self->sizeChanged();
- break;
-
- // Block any movie controller actions that open URLs.
- case mcActionLinkToURL:
- case mcActionGetNextURL:
- case mcActionLinkToURLExtended:
- // Prevent the movie controller from handling the message
- result = true;
- break;
-
- default:
- break;
- };
-
- return result;
- };
-
- static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
- {
- MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
- // IMPORTANT: typically, a consumer who is observing this event will set a flag
- // when this event is fired then render later. Be aware that the media stream
- // can change during this period - dimensions, depth, format etc.
- //LLMediaEvent event( self );
-// self->updateQuickTime();
- // TODO ^^^
-
-
- if ( self->mWidth > 0 && self->mHeight > 0 )
- self->setDirty( 0, 0, self->mWidth, self->mHeight );
-
- return noErr;
- };
-
- static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
- {
- MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
- // TODO:
- //LLMediaEvent event( self );
- //self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
-
- // Send a "navigate complete" event.
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
- message.setValue("uri", self->mNavigateURL);
- message.setValueS32("result_code", 200);
- message.setValue("result_string", "OK");
- self->sendMessage(message);
- };
-
-
- void rewind()
- {
- GoToBeginningOfMovie( mMovieHandle );
- MCMovieChanged( mMovieController, mMovieHandle );
- };
-
- bool processState()
- {
- if ( mCommand == COMMAND_PLAY )
- {
- if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
- {
- long state = GetMovieLoadState( mMovieHandle );
-
- if ( state >= kMovieLoadStatePlaythroughOK )
- {
- // if the movie is at the end (generally because it reached it naturally)
- // and we play is requested, jump back to the start of the movie.
- // note: this is different from having loop flag set.
- if ( IsMovieDone( mMovieHandle ) )
- {
- Fixed rate = X2Fix( 0.0 );
- MCDoAction( mMovieController, mcActionPlay, (void*)rate );
- rewind();
- };
-
- MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
- setStatus(STATUS_PLAYING);
- mCommand = COMMAND_NONE;
- };
- };
- }
- else
- if ( mCommand == COMMAND_STOP )
- {
- if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
- {
- if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
- {
- Fixed rate = X2Fix( 0.0 );
- MCDoAction( mMovieController, mcActionPlay, (void*)rate );
- rewind();
-
- setStatus(STATUS_LOADED);
- mCommand = COMMAND_NONE;
- };
- };
- }
- else
- if ( mCommand == COMMAND_PAUSE )
- {
- if ( mStatus == STATUS_PLAYING )
- {
- if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
- {
- Fixed rate = X2Fix( 0.0 );
- MCDoAction( mMovieController, mcActionPlay, (void*)rate );
- setStatus(STATUS_PAUSED);
- mCommand = COMMAND_NONE;
- };
- };
- };
-
- return true;
- };
-
- void play(F64 rate)
- {
- mPlayRate = rate;
- mCommand = COMMAND_PLAY;
- };
-
- void stop()
- {
- mCommand = COMMAND_STOP;
- };
-
- void pause()
- {
- mCommand = COMMAND_PAUSE;
- };
-
- void getMovieNaturalSize(int *movie_width, int *movie_height)
- {
- Rect rect;
-
- GetMovieNaturalBoundsRect( mMovieHandle, &rect );
-
- int width = ( rect.right - rect.left );
- int height = ( rect.bottom - rect.top );
-
- // make sure width and height fall in valid range
- if ( width < mMinWidth )
- width = mMinWidth;
-
- if ( width > mMaxWidth )
- width = mMaxWidth;
-
- if ( height < mMinHeight )
- height = mMinHeight;
-
- if ( height > mMaxHeight )
- height = mMaxHeight;
-
- // return the new rect
- *movie_width = width;
- *movie_height = height;
- }
-
- void updateQuickTime(int milliseconds)
- {
- if ( ! mMovieHandle )
- return;
-
- if ( ! mMovieController )
- return;
-
- // service QuickTime
- // Calling it this way doesn't have good behavior on Windows...
-// MoviesTask( mMovieHandle, milliseconds );
- // This was the original, but I think using both MoviesTask and MCIdle is redundant. Trying with only MCIdle.
-// MoviesTask( mMovieHandle, 0 );
-
- MCIdle( mMovieController );
-
- if ( ! mGWorldHandle )
- return;
-
- if ( mMediaSizeChanging )
- return;
-
- // update state machine
- processState();
-
- // see if title arrived and if so, update member variable with contents
- checkTitle();
-
- // QT call to see if we are at the end - can't do with controller
- if ( IsMovieDone( mMovieHandle ) )
- {
- // special code for looping - need to rewind at the end of the movie
- if ( mIsLooping )
- {
- // go back to start
- rewind();
-
- if ( mMovieController )
- {
- // kick off new play
- MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
-
- // set the volume
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
- };
- }
- else
- {
- if(mStatus == STATUS_PLAYING)
- {
- setStatus(STATUS_DONE);
- }
- }
- }
-
- };
-
- int getDataWidth() const
- {
- if ( mGWorldHandle )
- {
- int depth = mDepth;
-
- if (depth < 1)
- depth = 1;
-
- // ALWAYS use the row bytes from the PixMap if we have a GWorld because
- // sometimes it's not the same as mMediaDepth * mMediaWidth !
- PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
- return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
- }
- else
- {
- // TODO : return LLMediaImplCommon::getaDataWidth();
- return 0;
- }
- };
-
- void seek( F64 time )
- {
- if ( mMovieController )
- {
- TimeRecord when;
- when.scale = GetMovieTimeScale( mMovieHandle );
- when.base = 0;
-
- // 'time' is in (floating point) seconds. The timebase time will be in 'units', where
- // there are 'scale' units per second.
- SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
-
- when.value.hi = ( SInt32 )( raw_time >> 32 );
- when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
-
- MCDoAction( mMovieController, mcActionGoToTime, &when );
- };
- };
-
- F64 getLoadedDuration()
- {
- TimeValue duration;
- if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr)
- {
- // If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie.
- duration = GetMovieDuration( mMovieHandle );
- }
- TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
- return (F64)duration / (F64)scale;
- };
-
- F64 getDuration()
- {
- TimeValue duration = GetMovieDuration( mMovieHandle );
- TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
- return (F64)duration / (F64)scale;
- };
-
- F64 getCurrentTime()
- {
- TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
- TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
- return (F64)curr_time / (F64)scale;
- };
-
- void setVolume( F64 volume )
- {
- mCurVolume = (short)(volume * ( double ) 0x100 );
-
- if ( mMovieController )
- {
- MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
- };
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void update(int milliseconds = 0)
- {
- updateQuickTime(milliseconds);
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void mouseDown( int x, int y )
- {
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void mouseUp( int x, int y )
- {
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void mouseMove( int x, int y )
- {
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- //
- void keyPress( unsigned char key )
- {
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- // Grab movie title into mMovieTitle - should be called repeatedly
- // until it returns true since movie title takes a while to become
- // available.
- const bool getMovieTitle()
- {
- // grab meta data from movie
- QTMetaDataRef media_data_ref;
- OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref );
- if ( noErr != result )
- return false;
-
- // look up "Display Name" in meta data
- OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
- QTMetaDataItem item = kQTMetaDataItemUninitialized;
- result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,
- 0, kQTMetaDataKeyFormatCommon,
- (const UInt8 *)&meta_data_key,
- sizeof( meta_data_key ), &item );
- if ( noErr != result )
- return false;
-
- // find the size of the title
- ByteCount size;
- result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
- if ( noErr != result || size <= 0 )
- return false;
-
- // allocate some space and grab it
- UInt8* item_data = new UInt8( size );
- memset( item_data, 0, size * sizeof( UInt8* ) );
- result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
- if ( noErr != result )
- return false;
-
- // save it
- mMovieTitle = std::string( (char* )item_data );
-
- // clean up
- delete [] item_data;
-
- return true;
- };
-
- // called regularly to see if title changed
- void checkTitle()
- {
- // we did already receive title so keep checking
- if ( ! mReceivedTitle )
- {
- // grab title from movie meta data
- if ( getMovieTitle() )
- {
- // pass back to host application
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
- message.setValue("name", mMovieTitle );
- sendMessage( message );
-
- // stop looking once we find a title for this movie.
- // TODO: this may to be reset if movie title changes
- // during playback but this is okay for now
- mReceivedTitle = true;
- };
- };
- };
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
- LLPluginInstance::sendMessageFunction host_send_func,
- void *host_user_data ) :
- MediaPluginBase(host_send_func, host_user_data),
- mMinWidth( 0 ),
- mMaxWidth( 2048 ),
- mMinHeight( 0 ),
- mMaxHeight( 2048 )
-{
-// std::cerr << "MediaPluginQuickTime constructor" << std::endl;
-
- mNaturalWidth = -1;
- mNaturalHeight = -1;
- mMovieHandle = 0;
- mGWorldHandle = 0;
- mMovieController = 0;
- mCurVolume = 0x99;
- mMediaSizeChanging = false;
- mIsLooping = false;
- mMovieTitle = std::string();
- mReceivedTitle = false;
- mCommand = COMMAND_NONE;
- mPlayRate = 0.0f;
- mStatus = STATUS_NONE;
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
-// std::cerr << "MediaPluginQuickTime destructor" << std::endl;
-
- ExitMovies();
-
-#ifdef LL_WINDOWS
- TerminateQTML();
-// std::cerr << "QuickTime closing down" << std::endl;
-#endif
-}
-
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
-// std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
- LLPluginMessage message_in;
-
- if(message_in.parse(message_string) >= 0)
- {
- std::string message_class = message_in.getClass();
- std::string message_name = message_in.getName();
- if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
- {
- if(message_name == "init")
- {
- LLPluginMessage message("base", "init_response");
- LLSD versions = LLSD::emptyMap();
- versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
- versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
- // Normally a plugin would only specify one of these two subclasses, but this is a demo...
- versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
- message.setValueLLSD("versions", versions);
-
- #ifdef LL_WINDOWS
-
- // QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime
- // according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html
- // The solution presented there appears to work.
- QTLoadLibrary("qtcf.dll");
-
- // main initialization for QuickTime - only required on Windows
- OSErr result = InitializeQTML( 0L );
- if ( result != noErr )
- {
- //TODO: If no QT on Windows, this fails - respond accordingly.
- }
- else
- {
- //std::cerr << "QuickTime initialized" << std::endl;
- };
- #endif
-
- // required for both Windows and Mac
- EnterMovies();
-
- std::string plugin_version = "QuickTime media plugin, QuickTime version ";
-
- long version = 0;
- Gestalt( gestaltQuickTimeVersion, &version );
- std::ostringstream codec( "" );
- codec << std::hex << version << std::dec;
- plugin_version += codec.str();
- message.setValue("plugin_version", plugin_version);
- sendMessage(message);
-
- // Plugin gets to decide the texture parameters to use.
- message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
- #if defined(LL_WINDOWS)
- // Values for Windows
- mDepth = 3;
- message.setValueU32("format", GL_RGB);
- message.setValueU32("type", GL_UNSIGNED_BYTE);
-
- // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
- // Padding to a multiple of 3*32 guarantees it'll divide out properly.
- message.setValueU32("padding", 32 * 3);
- #else
- // Values for Mac
- mDepth = 4;
- message.setValueU32("format", GL_BGRA_EXT);
- #ifdef __BIG_ENDIAN__
- message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
- #else
- message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
- #endif
-
- // Pad texture width to a multiple of 32 bytes, to line up with cache lines.
- message.setValueU32("padding", 32);
- #endif
- message.setValueS32("depth", mDepth);
- message.setValueU32("internalformat", GL_RGB);
- message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
- message.setValueBoolean("allow_downsample", true);
- sendMessage(message);
- }
- else if(message_name == "idle")
- {
- // no response is necessary here.
- F64 time = message_in.getValueReal("time");
-
- // Convert time to milliseconds for update()
- update((int)(time * 1000.0f));
- }
- else if(message_name == "cleanup")
- {
- // TODO: clean up here
- }
- else if(message_name == "shm_added")
- {
- SharedSegmentInfo info;
- info.mAddress = message_in.getValuePointer("address");
- info.mSize = (size_t)message_in.getValueS32("size");
- std::string name = message_in.getValue("name");
-// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
-// << ", size: " << info.mSize
-// << ", address: " << info.mAddress
-// << std::endl;
-
- mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
- }
- else if(message_name == "shm_remove")
- {
- std::string name = message_in.getValue("name");
-
-// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
-
- SharedSegmentMap::iterator iter = mSharedSegments.find(name);
- if(iter != mSharedSegments.end())
- {
- if(mPixels == iter->second.mAddress)
- {
- // This is the currently active pixel buffer. Make sure we stop drawing to it.
- mPixels = NULL;
- mTextureSegmentName.clear();
-
- // Make sure the movie GWorld is no longer pointed at the shared segment.
- sizeChanged();
- }
- mSharedSegments.erase(iter);
- }
- else
- {
-// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
- }
-
- // Send the response so it can be cleaned up.
- LLPluginMessage message("base", "shm_remove_response");
- message.setValue("name", name);
- sendMessage(message);
- }
- else
- {
-// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
- }
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
- {
- if(message_name == "size_change")
- {
- std::string name = message_in.getValue("name");
- S32 width = message_in.getValueS32("width");
- S32 height = message_in.getValueS32("height");
- S32 texture_width = message_in.getValueS32("texture_width");
- S32 texture_height = message_in.getValueS32("texture_height");
-
- //std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
-
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
- message.setValue("name", name);
- message.setValueS32("width", width);
- message.setValueS32("height", height);
- message.setValueS32("texture_width", texture_width);
- message.setValueS32("texture_height", texture_height);
- sendMessage(message);
-
- if(!name.empty())
- {
- // Find the shared memory region with this name
- SharedSegmentMap::iterator iter = mSharedSegments.find(name);
- if(iter != mSharedSegments.end())
- {
-// std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
-// std::cerr << "%%%% texture size is " << texture_width << " by " << texture_height << std::endl;
-
- mPixels = (unsigned char*)iter->second.mAddress;
- mTextureSegmentName = name;
- mWidth = width;
- mHeight = height;
-
- mTextureWidth = texture_width;
- mTextureHeight = texture_height;
-
- mMediaSizeChanging = false;
-
- sizeChanged();
-
- update();
- };
- };
- }
- else if(message_name == "load_uri")
- {
- std::string uri = message_in.getValue("uri");
- load( uri );
- sendStatus();
- }
- else if(message_name == "mouse_event")
- {
- std::string event = message_in.getValue("event");
- S32 x = message_in.getValueS32("x");
- S32 y = message_in.getValueS32("y");
-
- if(event == "down")
- {
- mouseDown(x, y);
- }
- else if(event == "up")
- {
- mouseUp(x, y);
- }
- else if(event == "move")
- {
- mouseMove(x, y);
- };
- };
- }
- else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
- {
- if(message_name == "stop")
- {
- stop();
- }
- else if(message_name == "start")
- {
- F64 rate = 0.0;
- if(message_in.hasValue("rate"))
- {
- rate = message_in.getValueReal("rate");
- }
- play(rate);
- }
- else if(message_name == "pause")
- {
- pause();
- }
- else if(message_name == "seek")
- {
- F64 time = message_in.getValueReal("time");
- seek(time);
- }
- else if(message_name == "set_loop")
- {
- bool loop = message_in.getValueBoolean("loop");
- mIsLooping = loop;
- }
- else if(message_name == "set_volume")
- {
- F64 volume = message_in.getValueReal("volume");
- setVolume(volume);
- }
- }
- else
- {
-// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
- };
- };
-}
-
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
- MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
- *plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
- *plugin_user_data = (void*)self;
-
- return 0;
-}
-
-#else // LL_QUICKTIME_ENABLED
-
-// Stubbed-out class with constructor/destructor (necessary or windows linker
-// will just think its dead code and optimize it all out)
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
- MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
- ~MediaPluginQuickTime();
- /* virtual */ void receiveMessage(const char *message_string);
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
- LLPluginInstance::sendMessageFunction host_send_func,
- void *host_user_data ) :
- MediaPluginBase(host_send_func, host_user_data)
-{
- // no-op
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
- // no-op
-}
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
- // no-op
-}
-
-// We're building without quicktime enabled. Just refuse to initialize.
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
- return -1;
-}
-
-#endif // LL_QUICKTIME_ENABLED
+/**
+ * @file media_plugin_quicktime.cpp
+ * @brief QuickTime plugin for LLMedia API plugin system
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_QUICKTIME_ENABLED
+
+#if defined(LL_DARWIN)
+ #include <QuickTime/QuickTime.h>
+#elif defined(LL_WINDOWS)
+ #include "MacTypes.h"
+ #include "QTML.h"
+ #include "Movies.h"
+ #include "QDoffscreen.h"
+ #include "FixMath.h"
+ #include "QTLoadLibraryUtils.h"
+#endif
+
+// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+ MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginQuickTime();
+
+ /* virtual */ void receiveMessage(const char *message_string);
+
+private:
+
+ int mNaturalWidth;
+ int mNaturalHeight;
+ Movie mMovieHandle;
+ GWorldPtr mGWorldHandle;
+ ComponentInstance mMovieController;
+ int mCurVolume;
+ bool mMediaSizeChanging;
+ bool mIsLooping;
+ std::string mMovieTitle;
+ bool mReceivedTitle;
+ const int mMinWidth;
+ const int mMaxWidth;
+ const int mMinHeight;
+ const int mMaxHeight;
+ F64 mPlayRate;
+ std::string mNavigateURL;
+
+ enum ECommand {
+ COMMAND_NONE,
+ COMMAND_STOP,
+ COMMAND_PLAY,
+ COMMAND_FAST_FORWARD,
+ COMMAND_FAST_REWIND,
+ COMMAND_PAUSE,
+ COMMAND_SEEK,
+ };
+ ECommand mCommand;
+
+ // Override this to add current time and duration to the message
+ /*virtual*/ void setDirty(int left, int top, int right, int bottom)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
+
+ message.setValueS32("left", left);
+ message.setValueS32("top", top);
+ message.setValueS32("right", right);
+ message.setValueS32("bottom", bottom);
+
+ if(mMovieHandle)
+ {
+ message.setValueReal("current_time", getCurrentTime());
+ message.setValueReal("duration", getDuration());
+ message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
+ }
+
+ sendMessage(message);
+ }
+
+
+ static Rect rectFromSize(int width, int height)
+ {
+ Rect result;
+
+
+ result.left = 0;
+ result.top = 0;
+ result.right = width;
+ result.bottom = height;
+
+ return result;
+ }
+
+ Fixed getPlayRate(void)
+ {
+ Fixed result;
+ if(mPlayRate == 0.0f)
+ {
+ // Default to the movie's preferred rate
+ result = GetMoviePreferredRate(mMovieHandle);
+ if(result == 0)
+ {
+ // Don't return a 0 play rate, ever.
+ std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
+ result = X2Fix(1.0f);
+ }
+ }
+ else
+ {
+ result = X2Fix(mPlayRate);
+ }
+
+ return result;
+ }
+
+ void load( const std::string url )
+ {
+
+ if ( url.empty() )
+ return;
+
+ // Stop and unload any existing movie before starting another one.
+ unload();
+
+ setStatus(STATUS_LOADING);
+
+ //In case std::string::c_str() makes a copy of the url data,
+ //make sure there is memory to hold it before allocating memory for handle.
+ //if fails, NewHandleClear(...) should return NULL.
+ const char* url_string = url.c_str() ;
+ Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
+
+ if ( NULL == handle || noErr != MemError() || NULL == *handle )
+ {
+ setStatus(STATUS_ERROR);
+ return;
+ }
+
+ BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
+
+ OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
+ DisposeHandle( handle );
+ if ( noErr != err )
+ {
+ setStatus(STATUS_ERROR);
+ return;
+ };
+
+ mNavigateURL = url;
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+ message.setValue("uri", mNavigateURL);
+ sendMessage(message);
+
+ // do pre-roll actions (typically fired for streaming movies but not always)
+ PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
+
+ Rect movie_rect = rectFromSize(mWidth, mHeight);
+
+ // make a new movie controller
+ mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
+
+ // movie controller
+ MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
+
+ SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
+
+ // function that gets called when a frame is drawn
+ SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
+
+ setStatus(STATUS_LOADED);
+
+ sizeChanged();
+ };
+
+ bool unload()
+ {
+ // new movie and have to get title again
+ mReceivedTitle = false;
+
+ if ( mMovieHandle )
+ {
+ StopMovie( mMovieHandle );
+ if ( mMovieController )
+ {
+ MCMovieChanged( mMovieController, mMovieHandle );
+ };
+ };
+
+ if ( mMovieController )
+ {
+ MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
+ DisposeMovieController( mMovieController );
+ mMovieController = NULL;
+ };
+
+ if ( mMovieHandle )
+ {
+ SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
+ DisposeMovie( mMovieHandle );
+ mMovieHandle = NULL;
+ };
+
+ if ( mGWorldHandle )
+ {
+ DisposeGWorld( mGWorldHandle );
+ mGWorldHandle = NULL;
+ };
+
+ setStatus(STATUS_NONE);
+
+ return true;
+ }
+
+ bool navigateTo( const std::string url )
+ {
+ unload();
+ load( url );
+
+ return true;
+ };
+
+ bool sizeChanged()
+ {
+ if ( ! mMovieHandle )
+ return false;
+
+ // Check to see whether the movie's natural size has updated
+ {
+ int width, height;
+ getMovieNaturalSize(&width, &height);
+ if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
+ {
+ mNaturalWidth = width;
+ mNaturalHeight = height;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
+ message.setValue("name", mTextureSegmentName);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ sendMessage(message);
+ //std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
+ }
+ }
+
+ // sanitize destination size
+ Rect dest_rect = rectFromSize(mWidth, mHeight);
+
+ // media depth won't change
+ int depth_bits = mDepth * 8;
+ long rowbytes = mDepth * mTextureWidth;
+
+ GWorldPtr old_gworld_handle = mGWorldHandle;
+
+ if(mPixels != NULL)
+ {
+ // We have pixels. Set up a GWorld pointing at the texture.
+ OSErr result = NewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
+ if ( noErr != result )
+ {
+ // TODO: unrecoverable?? throw exception? return something?
+ return false;
+ }
+ }
+ else
+ {
+ // We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
+ Rect tempRect = rectFromSize(1, 1);
+ OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
+ if ( noErr != result )
+ {
+ // TODO: unrecoverable?? throw exception? return something?
+ return false;
+ }
+ }
+
+ SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice( mGWorldHandle ) );
+
+ // If the GWorld was already set up, delete it.
+ if(old_gworld_handle != NULL)
+ {
+ DisposeGWorld( old_gworld_handle );
+ }
+
+ // Set up the movie display matrix
+ {
+ // scale movie to fit rect and invert vertically to match opengl image format
+ MatrixRecord transform;
+ SetIdentityMatrix( &transform ); // transforms are additive so start from identify matrix
+ double scaleX = (double) mWidth / mNaturalWidth;
+ double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
+ double centerX = mWidth / 2.0;
+ double centerY = mHeight / 2.0;
+ ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
+ SetMovieMatrix( mMovieHandle, &transform );
+ }
+
+ // update movie controller
+ if ( mMovieController )
+ {
+ MCSetControllerPort( mMovieController, mGWorldHandle );
+ MCPositionController( mMovieController, &dest_rect, &dest_rect,
+ mcTopLeftMovie | mcPositionDontInvalidate );
+ MCMovieChanged( mMovieController, mMovieHandle );
+ }
+
+
+ // Emit event with size change so the calling app knows about it too
+ // TODO:
+ //LLMediaEvent event( this );
+ //mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
+
+ return true;
+ }
+ static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
+ {
+ Boolean result = false;
+
+ MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ switch( action )
+ {
+ // handle window resizing
+ case mcActionControllerSizeChanged:
+ // Ensure that the movie draws correctly at the new size
+ self->sizeChanged();
+ break;
+
+ // Block any movie controller actions that open URLs.
+ case mcActionLinkToURL:
+ case mcActionGetNextURL:
+ case mcActionLinkToURLExtended:
+ // Prevent the movie controller from handling the message
+ result = true;
+ break;
+
+ default:
+ break;
+ };
+
+ return result;
+ };
+
+ static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
+ {
+ MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ // IMPORTANT: typically, a consumer who is observing this event will set a flag
+ // when this event is fired then render later. Be aware that the media stream
+ // can change during this period - dimensions, depth, format etc.
+ //LLMediaEvent event( self );
+// self->updateQuickTime();
+ // TODO ^^^
+
+
+ if ( self->mWidth > 0 && self->mHeight > 0 )
+ self->setDirty( 0, 0, self->mWidth, self->mHeight );
+
+ return noErr;
+ };
+
+ static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
+ {
+ MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+ // TODO:
+ //LLMediaEvent event( self );
+ //self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
+
+ // Send a "navigate complete" event.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+ message.setValue("uri", self->mNavigateURL);
+ message.setValueS32("result_code", 200);
+ message.setValue("result_string", "OK");
+ self->sendMessage(message);
+ };
+
+
+ void rewind()
+ {
+ GoToBeginningOfMovie( mMovieHandle );
+ MCMovieChanged( mMovieController, mMovieHandle );
+ };
+
+ bool processState()
+ {
+ if ( mCommand == COMMAND_PLAY )
+ {
+ if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
+ {
+ long state = GetMovieLoadState( mMovieHandle );
+
+ if ( state >= kMovieLoadStatePlaythroughOK )
+ {
+ // if the movie is at the end (generally because it reached it naturally)
+ // and we play is requested, jump back to the start of the movie.
+ // note: this is different from having loop flag set.
+ if ( IsMovieDone( mMovieHandle ) )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ rewind();
+ };
+
+ MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ setStatus(STATUS_PLAYING);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ }
+ else
+ if ( mCommand == COMMAND_STOP )
+ {
+ if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
+ {
+ if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ rewind();
+
+ setStatus(STATUS_LOADED);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ }
+ else
+ if ( mCommand == COMMAND_PAUSE )
+ {
+ if ( mStatus == STATUS_PLAYING )
+ {
+ if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+ {
+ Fixed rate = X2Fix( 0.0 );
+ MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+ setStatus(STATUS_PAUSED);
+ mCommand = COMMAND_NONE;
+ };
+ };
+ };
+
+ return true;
+ };
+
+ void play(F64 rate)
+ {
+ mPlayRate = rate;
+ mCommand = COMMAND_PLAY;
+ };
+
+ void stop()
+ {
+ mCommand = COMMAND_STOP;
+ };
+
+ void pause()
+ {
+ mCommand = COMMAND_PAUSE;
+ };
+
+ void getMovieNaturalSize(int *movie_width, int *movie_height)
+ {
+ Rect rect;
+
+ GetMovieNaturalBoundsRect( mMovieHandle, &rect );
+
+ int width = ( rect.right - rect.left );
+ int height = ( rect.bottom - rect.top );
+
+ // make sure width and height fall in valid range
+ if ( width < mMinWidth )
+ width = mMinWidth;
+
+ if ( width > mMaxWidth )
+ width = mMaxWidth;
+
+ if ( height < mMinHeight )
+ height = mMinHeight;
+
+ if ( height > mMaxHeight )
+ height = mMaxHeight;
+
+ // return the new rect
+ *movie_width = width;
+ *movie_height = height;
+ }
+
+ void updateQuickTime(int milliseconds)
+ {
+ if ( ! mMovieHandle )
+ return;
+
+ if ( ! mMovieController )
+ return;
+
+ // this wasn't required in 1.xx viewer but we have to manually
+ // work the Windows message pump now
+ #if defined( LL_WINDOWS )
+ MSG msg;
+ while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
+ {
+ GetMessage( &msg, NULL, 0, 0 );
+ TranslateMessage( &msg );
+ DispatchMessage( &msg );
+ };
+ #endif
+
+ MCIdle( mMovieController );
+
+ if ( ! mGWorldHandle )
+ return;
+
+ if ( mMediaSizeChanging )
+ return;
+
+ // update state machine
+ processState();
+
+ // see if title arrived and if so, update member variable with contents
+ checkTitle();
+
+ // QT call to see if we are at the end - can't do with controller
+ if ( IsMovieDone( mMovieHandle ) )
+ {
+ // special code for looping - need to rewind at the end of the movie
+ if ( mIsLooping )
+ {
+ // go back to start
+ rewind();
+
+ if ( mMovieController )
+ {
+ // kick off new play
+ MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+
+ // set the volume
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ };
+ }
+ else
+ {
+ if(mStatus == STATUS_PLAYING)
+ {
+ setStatus(STATUS_DONE);
+ }
+ }
+ }
+
+ };
+
+ int getDataWidth() const
+ {
+ if ( mGWorldHandle )
+ {
+ int depth = mDepth;
+
+ if (depth < 1)
+ depth = 1;
+
+ // ALWAYS use the row bytes from the PixMap if we have a GWorld because
+ // sometimes it's not the same as mMediaDepth * mMediaWidth !
+ PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
+ return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
+ }
+ else
+ {
+ // TODO : return LLMediaImplCommon::getaDataWidth();
+ return 0;
+ }
+ };
+
+ void seek( F64 time )
+ {
+ if ( mMovieController )
+ {
+ TimeRecord when;
+ when.scale = GetMovieTimeScale( mMovieHandle );
+ when.base = 0;
+
+ // 'time' is in (floating point) seconds. The timebase time will be in 'units', where
+ // there are 'scale' units per second.
+ SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
+
+ when.value.hi = ( SInt32 )( raw_time >> 32 );
+ when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
+
+ MCDoAction( mMovieController, mcActionGoToTime, &when );
+ };
+ };
+
+ F64 getLoadedDuration()
+ {
+ TimeValue duration;
+ if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr)
+ {
+ // If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie.
+ duration = GetMovieDuration( mMovieHandle );
+ }
+ TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+ return (F64)duration / (F64)scale;
+ };
+
+ F64 getDuration()
+ {
+ TimeValue duration = GetMovieDuration( mMovieHandle );
+ TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+ return (F64)duration / (F64)scale;
+ };
+
+ F64 getCurrentTime()
+ {
+ TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
+ TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+ return (F64)curr_time / (F64)scale;
+ };
+
+ void setVolume( F64 volume )
+ {
+ mCurVolume = (short)(volume * ( double ) 0x100 );
+
+ if ( mMovieController )
+ {
+ MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void update(int milliseconds = 0)
+ {
+ updateQuickTime(milliseconds);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseDown( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseUp( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void mouseMove( int x, int y )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyPress( unsigned char key )
+ {
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Grab movie title into mMovieTitle - should be called repeatedly
+ // until it returns true since movie title takes a while to become
+ // available.
+ const bool getMovieTitle()
+ {
+ // grab meta data from movie
+ QTMetaDataRef media_data_ref;
+ OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref );
+ if ( noErr != result )
+ return false;
+
+ // look up "Display Name" in meta data
+ OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
+ QTMetaDataItem item = kQTMetaDataItemUninitialized;
+ result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,
+ 0, kQTMetaDataKeyFormatCommon,
+ (const UInt8 *)&meta_data_key,
+ sizeof( meta_data_key ), &item );
+ if ( noErr != result )
+ return false;
+
+ // find the size of the title
+ ByteCount size;
+ result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
+ if ( noErr != result || size <= 0 /*|| size > 1024 FIXME: arbitrary limit */ )
+ return false;
+
+ // allocate some space and grab it
+ UInt8* item_data = new UInt8[ size + 1 ];
+ memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) );
+ result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
+ if ( noErr != result )
+ {
+ delete [] item_data;
+ return false;
+ };
+
+ // save it
+ if ( strlen( (char*)item_data ) )
+ mMovieTitle = std::string( (char* )item_data );
+ else
+ mMovieTitle = "";
+
+ // clean up
+ delete [] item_data;
+
+ return true;
+ };
+
+ // called regularly to see if title changed
+ void checkTitle()
+ {
+ // we did already receive title so keep checking
+ if ( ! mReceivedTitle )
+ {
+ // grab title from movie meta data
+ if ( getMovieTitle() )
+ {
+ // pass back to host application
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+ message.setValue("name", mMovieTitle );
+ sendMessage( message );
+
+ // stop looking once we find a title for this movie.
+ // TODO: this may to be reset if movie title changes
+ // during playback but this is okay for now
+ mReceivedTitle = true;
+ };
+ };
+ };
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data),
+ mMinWidth( 0 ),
+ mMaxWidth( 2048 ),
+ mMinHeight( 0 ),
+ mMaxHeight( 2048 )
+{
+// std::cerr << "MediaPluginQuickTime constructor" << std::endl;
+
+ mNaturalWidth = -1;
+ mNaturalHeight = -1;
+ mMovieHandle = 0;
+ mGWorldHandle = 0;
+ mMovieController = 0;
+ mCurVolume = 0x99;
+ mMediaSizeChanging = false;
+ mIsLooping = false;
+ mMovieTitle = std::string();
+ mReceivedTitle = false;
+ mCommand = COMMAND_NONE;
+ mPlayRate = 0.0f;
+ mStatus = STATUS_NONE;
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+// std::cerr << "MediaPluginQuickTime destructor" << std::endl;
+
+ ExitMovies();
+
+#ifdef LL_WINDOWS
+ TerminateQTML();
+// std::cerr << "QuickTime closing down" << std::endl;
+#endif
+}
+
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+// std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ // Normally a plugin would only specify one of these two subclasses, but this is a demo...
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ #ifdef LL_WINDOWS
+
+ // QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime
+ // according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html
+ // The solution presented there appears to work.
+ QTLoadLibrary("qtcf.dll");
+
+ // main initialization for QuickTime - only required on Windows
+ OSErr result = InitializeQTML( 0L );
+ if ( result != noErr )
+ {
+ //TODO: If no QT on Windows, this fails - respond accordingly.
+ }
+ else
+ {
+ //std::cerr << "QuickTime initialized" << std::endl;
+ };
+ #endif
+
+ // required for both Windows and Mac
+ EnterMovies();
+
+ std::string plugin_version = "QuickTime media plugin, QuickTime version ";
+
+ long version = 0;
+ Gestalt( gestaltQuickTimeVersion, &version );
+ std::ostringstream codec( "" );
+ codec << std::hex << version << std::dec;
+ plugin_version += codec.str();
+ message.setValue("plugin_version", plugin_version);
+ sendMessage(message);
+
+ // Plugin gets to decide the texture parameters to use.
+ message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ #if defined(LL_WINDOWS)
+ // Values for Windows
+ mDepth = 3;
+ message.setValueU32("format", GL_RGB);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+
+ // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
+ // Padding to a multiple of 3*32 guarantees it'll divide out properly.
+ message.setValueU32("padding", 32 * 3);
+ #else
+ // Values for Mac
+ mDepth = 4;
+ message.setValueU32("format", GL_BGRA_EXT);
+ #ifdef __BIG_ENDIAN__
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
+ #else
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
+ #endif
+
+ // Pad texture width to a multiple of 32 bytes, to line up with cache lines.
+ message.setValueU32("padding", 32);
+ #endif
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGB);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true);
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ // TODO: clean up here
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer("address");
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
+// << ", size: " << info.mSize
+// << ", address: " << info.mAddress
+// << std::endl;
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+// std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+
+ // Make sure the movie GWorld is no longer pointed at the shared segment.
+ sizeChanged();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ //std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+// std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
+// std::cerr << "%%%% texture size is " << texture_width << " by " << texture_height << std::endl;
+
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mTextureSegmentName = name;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+
+ mMediaSizeChanging = false;
+
+ sizeChanged();
+
+ update();
+ };
+ };
+ }
+ else if(message_name == "load_uri")
+ {
+ std::string uri = message_in.getValue("uri");
+ load( uri );
+ sendStatus();
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ S32 x = message_in.getValueS32("x");
+ S32 y = message_in.getValueS32("y");
+
+ if(event == "down")
+ {
+ mouseDown(x, y);
+ }
+ else if(event == "up")
+ {
+ mouseUp(x, y);
+ }
+ else if(event == "move")
+ {
+ mouseMove(x, y);
+ };
+ };
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if(message_name == "stop")
+ {
+ stop();
+ }
+ else if(message_name == "start")
+ {
+ F64 rate = 0.0;
+ if(message_in.hasValue("rate"))
+ {
+ rate = message_in.getValueReal("rate");
+ }
+ play(rate);
+ }
+ else if(message_name == "pause")
+ {
+ pause();
+ }
+ else if(message_name == "seek")
+ {
+ F64 time = message_in.getValueReal("time");
+ seek(time);
+ }
+ else if(message_name == "set_loop")
+ {
+ bool loop = message_in.getValueBoolean("loop");
+ mIsLooping = loop;
+ }
+ else if(message_name == "set_volume")
+ {
+ F64 volume = message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
+ else
+ {
+// std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ };
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
+ *plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
+ *plugin_user_data = (void*)self;
+
+ return 0;
+}
+
+#else // LL_QUICKTIME_ENABLED
+
+// Stubbed-out class with constructor/destructor (necessary or windows linker
+// will just think its dead code and optimize it all out)
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+ MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+ ~MediaPluginQuickTime();
+ /* virtual */ void receiveMessage(const char *message_string);
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+ LLPluginInstance::sendMessageFunction host_send_func,
+ void *host_user_data ) :
+ MediaPluginBase(host_send_func, host_user_data)
+{
+ // no-op
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+ // no-op
+}
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+ // no-op
+}
+
+// We're building without quicktime enabled. Just refuse to initialize.
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+ return -1;
+}
+
+#endif // LL_QUICKTIME_ENABLED
diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt
index 5bccd589d8..4512c22b5d 100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/webkit/CMakeLists.txt
@@ -9,6 +9,7 @@ include(LLPlugin)
include(LLMath)
include(LLRender)
include(LLWindow)
+include(UI)
include(Linking)
include(PluginAPI)
include(MediaPluginBase)
@@ -38,7 +39,7 @@ add_library(media_plugin_webkit
${media_plugin_webkit_SOURCE_FILES}
)
-target_link_libraries(media_plugin_webkit
+set(media_plugin_webkit_LINK_LIBRARIES
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
${LLCOMMON_LIBRARIES}
@@ -46,6 +47,14 @@ target_link_libraries(media_plugin_webkit
${PLUGIN_API_WINDOWS_LIBRARIES}
)
+if (LINUX)
+ list(APPEND media_plugin_webkit_LINK_LIBRARIES
+ ${UI_LIBRARIES} # for glib/GTK
+ )
+endif (LINUX)
+
+target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES})
+
add_dependencies(media_plugin_webkit
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
@@ -79,4 +88,5 @@ if (DARWIN)
DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
)
-endif (DARWIN) \ No newline at end of file
+endif (DARWIN)
+
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 3ce8ff3deb..688d3bcd3d 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_webkit.cpp
* @brief Webkit plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "llqtwebkit.h"
@@ -74,8 +76,20 @@ public:
private:
+ std::string mProfileDir;
+
+ enum
+ {
+ INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up yet
+ INIT_STATE_NAVIGATING, // Browser instance has been set up and initial navigate to about:blank has been issued
+ INIT_STATE_NAVIGATE_COMPLETE, // initial navigate to about:blank has completed
+ INIT_STATE_WAIT_REDRAW, // First real navigate begin has been received, waiting for page changed event to start handling redraws
+ INIT_STATE_WAIT_COMPLETE, // Waiting for first real navigate complete event
+ INIT_STATE_RUNNING // All initialization gymnastics are complete.
+ };
int mBrowserWindowId;
- bool mBrowserInitialized;
+ int mInitState;
+ std::string mInitialNavigateURL;
bool mNeedsUpdate;
bool mCanCut;
@@ -84,6 +98,15 @@ private:
int mLastMouseX;
int mLastMouseY;
bool mFirstFocus;
+ F32 mBackgroundR;
+ F32 mBackgroundG;
+ F32 mBackgroundB;
+
+ void setInitState(int state)
+ {
+// std::cerr << "changing init state to " << state << std::endl;
+ mInitState = state;
+ }
////////////////////////////////////////////////////////////////////////////////
//
@@ -93,7 +116,17 @@ private:
checkEditState();
- if ( mNeedsUpdate )
+ if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ if(!mInitialNavigateURL.empty())
+ {
+ // We already have the initial navigate URL -- kick off the navigate.
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL );
+ mInitialNavigateURL.clear();
+ }
+ }
+
+ if ( (mInitState > INIT_STATE_WAIT_REDRAW) && mNeedsUpdate )
{
const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
@@ -123,7 +156,7 @@ private:
bool initBrowser()
{
// already initialized
- if ( mBrowserInitialized )
+ if ( mInitState > INIT_STATE_UNINITIALIZED )
return true;
// not enough information to initialize the browser yet.
@@ -142,6 +175,15 @@ private:
}
std::string application_dir = std::string( cwd );
+#if LL_DARWIN
+ // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on.
+ // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger.
+ // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it
+ // which gets hit when the plugin is probed by webkit.
+ // Unsetting the environment variable here works around this issue.
+ unsetenv("USERBREAK");
+#endif
+
#if LL_WINDOWS
//*NOTE:Mani - On windows, at least, the component path is the
// location of this dll's image file.
@@ -166,7 +208,6 @@ private:
#else
std::string component_dir = application_dir;
#endif
- std::string profileDir = application_dir + "/" + "browser_profile"; // cross platform?
// window handle - needed on Windows and must be app window.
#if LL_WINDOWS
@@ -178,23 +219,24 @@ private:
#endif
// main browser initialization
- bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, profileDir, native_window_handle );
+ bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );
if ( result )
{
// create single browser window
mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );
-
#if LL_WINDOWS
// Enable plugins
LLQtWebKit::getInstance()->enablePlugins(true);
#elif LL_DARWIN
- // Disable plugins
- LLQtWebKit::getInstance()->enablePlugins(false);
+ // Enable plugins
+ LLQtWebKit::getInstance()->enablePlugins(true);
#elif LL_LINUX
- // Disable plugins
- LLQtWebKit::getInstance()->enablePlugins(false);
+ // Enable plugins
+ LLQtWebKit::getInstance()->enablePlugins(true);
#endif
-
+ // Enable cookies
+ LLQtWebKit::getInstance()->enableCookies( true );
+
// tell LLQtWebKit about the size of the browser window
LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
@@ -207,16 +249,31 @@ private:
// don't flip bitmap
LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
- // set background color to be black - mostly for initial login page
- LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, 0x00, 0x00, 0x00 );
+ // set background color
+ // convert background color channels from [0.0, 1.0] to [0, 255];
+ LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) );
+
+ // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
+ setInitState(INIT_STATE_NAVIGATING);
// Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
// FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
// for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
-
- // set flag so we don't do this again
- mBrowserInitialized = true;
+ // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E"
+ // where RRGGBB is the background color in HTML style
+ std::stringstream url;
+
+ url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#";
+ // convert background color channels from [0.0, 1.0] to [0, 255];
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f);
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f);
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);
+ url << "%22%3E%3C/body%3E%3C/html%3E";
+
+ lldebugs << "data url is: " << url.str() << llendl;
+
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
+// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
return true;
};
@@ -224,6 +281,7 @@ private:
return false;
};
+
////////////////////////////////////////////////////////////////////////////////
// virtual
void onCursorChanged(const EventType& event)
@@ -263,6 +321,11 @@ private:
// virtual
void onPageChanged( const EventType& event )
{
+ if(mInitState == INIT_STATE_WAIT_REDRAW)
+ {
+ setInitState(INIT_STATE_WAIT_COMPLETE);
+ }
+
// flag that an update is required
mNeedsUpdate = true;
};
@@ -271,62 +334,101 @@ private:
// virtual
void onNavigateBegin(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
- message.setValue("uri", event.getEventUri());
- sendMessage(message);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+ message.setValue("uri", event.getEventUri());
+ sendMessage(message);
+
+ setStatus(STATUS_LOADING);
+ }
- setStatus(STATUS_LOADING);
+ if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ // Skip the WAIT_REDRAW state now -- with the right background color set, it should no longer be necessary.
+// setInitState(INIT_STATE_WAIT_REDRAW);
+ setInitState(INIT_STATE_WAIT_COMPLETE);
+ }
+
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onNavigateComplete(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
- message.setValue("uri", event.getEventUri());
- message.setValueS32("result_code", event.getIntValue());
- message.setValue("result_string", event.getStringValue());
- message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
- message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
- sendMessage(message);
-
- setStatus(STATUS_LOADED);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ if(mInitState < INIT_STATE_RUNNING)
+ {
+ setInitState(INIT_STATE_RUNNING);
+
+ // Clear the history, so the "back" button doesn't take you back to "about:blank".
+ LLQtWebKit::getInstance()->clearHistory(mBrowserWindowId);
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+ message.setValue("uri", event.getEventUri());
+ message.setValueS32("result_code", event.getIntValue());
+ message.setValue("result_string", event.getStringValue());
+ message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+ message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
+ sendMessage(message);
+
+ setStatus(STATUS_LOADED);
+ }
+ else if(mInitState == INIT_STATE_NAVIGATING)
+ {
+ setInitState(INIT_STATE_NAVIGATE_COMPLETE);
+ }
+
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onUpdateProgress(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
- message.setValueS32("percent", event.getIntValue());
- sendMessage(message);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
+ message.setValueS32("percent", event.getIntValue());
+ sendMessage(message);
+ }
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onStatusTextChange(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
- message.setValue("status", event.getStringValue());
- sendMessage(message);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
+ message.setValue("status", event.getStringValue());
+ sendMessage(message);
+ }
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onTitleChange(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
- message.setValue("name", event.getStringValue());
- sendMessage(message);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+ message.setValue("name", event.getStringValue());
+ sendMessage(message);
+ }
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onLocationChange(const EventType& event)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
- message.setValue("uri", event.getEventUri());
- sendMessage(message);
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
+ message.setValue("uri", event.getEventUri());
+ sendMessage(message);
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -336,6 +438,7 @@ private:
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
message.setValue("uri", event.getStringValue());
message.setValue("target", event.getStringValue2());
+ message.setValueU32("target_type", event.getLinkType());
sendMessage(message);
}
@@ -367,83 +470,96 @@ private:
return (LLQtWebKit::EKeyboardModifier)result;
}
-
////////////////////////////////////////////////////////////////////////////////
//
- void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers)
+ void deserializeKeyboardData( LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers )
{
- int llqt_key;
+ native_scan_code = 0;
+ native_virtual_key = 0;
+ native_modifiers = 0;
+ if( native_key_data.isMap() )
+ {
+#if LL_DARWIN
+ native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#elif LL_WINDOWS
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ // TODO: I don't think we need to do anything with native modifiers here -- please verify
+#elif LL_LINUX
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#else
+ // Add other platforms here as needed
+#endif
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
// The incoming values for 'key' will be the ones from indra_constants.h
- // the outgoing values are the ones from llqtwebkit.h
+ std::string utf8_text;
+ if(key < KEY_SPECIAL)
+ {
+ // Low-ascii characters need to get passed through.
+ utf8_text = (char)key;
+ }
+
+ // Any special-case handling we want to do for particular keys...
switch((KEY)key)
{
- // This is the list that the llqtwebkit implementation actually maps into Qt keys.
-// case KEY_XXX: llqt_key = LL_DOM_VK_CANCEL; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_HELP; break;
- case KEY_BACKSPACE: llqt_key = LL_DOM_VK_BACK_SPACE; break;
- case KEY_TAB: llqt_key = LL_DOM_VK_TAB; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CLEAR; break;
- case KEY_RETURN: llqt_key = LL_DOM_VK_RETURN; break;
- case KEY_PAD_RETURN: llqt_key = LL_DOM_VK_ENTER; break;
- case KEY_SHIFT: llqt_key = LL_DOM_VK_SHIFT; break;
- case KEY_CONTROL: llqt_key = LL_DOM_VK_CONTROL; break;
- case KEY_ALT: llqt_key = LL_DOM_VK_ALT; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PAUSE; break;
- case KEY_CAPSLOCK: llqt_key = LL_DOM_VK_CAPS_LOCK; break;
- case KEY_ESCAPE: llqt_key = LL_DOM_VK_ESCAPE; break;
- case KEY_PAGE_UP: llqt_key = LL_DOM_VK_PAGE_UP; break;
- case KEY_PAGE_DOWN: llqt_key = LL_DOM_VK_PAGE_DOWN; break;
- case KEY_END: llqt_key = LL_DOM_VK_END; break;
- case KEY_HOME: llqt_key = LL_DOM_VK_HOME; break;
- case KEY_LEFT: llqt_key = LL_DOM_VK_LEFT; break;
- case KEY_UP: llqt_key = LL_DOM_VK_UP; break;
- case KEY_RIGHT: llqt_key = LL_DOM_VK_RIGHT; break;
- case KEY_DOWN: llqt_key = LL_DOM_VK_DOWN; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PRINTSCREEN; break;
- case KEY_INSERT: llqt_key = LL_DOM_VK_INSERT; break;
- case KEY_DELETE: llqt_key = LL_DOM_VK_DELETE; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CONTEXT_MENU; break;
+ // ASCII codes for some standard keys
+ case LLQtWebKit::KEY_BACKSPACE: utf8_text = (char)8; break;
+ case LLQtWebKit::KEY_TAB: utf8_text = (char)9; break;
+ case LLQtWebKit::KEY_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_PAD_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_ESCAPE: utf8_text = (char)27; break;
- default:
- if(key < KEY_SPECIAL)
- {
- // Pass the incoming key through -- it should be regular ASCII, which should be correct for webkit.
- llqt_key = key;
- }
- else
- {
- // Don't pass through untranslated special keys -- they'll be all wrong.
- llqt_key = 0;
- }
+ default:
break;
}
-// std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl;
+// std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl;
- if(llqt_key != 0)
- {
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers);
- }
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
checkEditState();
};
////////////////////////////////////////////////////////////////////////////////
//
- void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers)
- {
- LLWString wstr = utf8str_to_wstring(utf8str);
+ void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
+ uint32_t key = LLQtWebKit::KEY_NONE;
- unsigned int i;
- for(i=0; i < wstr.size(); i++)
+// std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl;
+
+ if(utf8str.size() == 1)
{
-// std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl;
-
- LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers);
+ // The only way a utf8 string can be one byte long is if it's actually a single 7-bit ascii character.
+ // In this case, use it as the key value.
+ key = utf8str[0];
}
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+
checkEditState();
};
@@ -488,7 +604,7 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
// std::cerr << "MediaPluginWebKit constructor" << std::endl;
mBrowserWindowId = 0;
- mBrowserInitialized = false;
+ mInitState = INIT_STATE_UNINITIALIZED;
mNeedsUpdate = true;
mCanCut = false;
mCanCopy = false;
@@ -496,6 +612,9 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
mLastMouseX = 0;
mLastMouseY = 0;
mFirstFocus = true;
+ mBackgroundR = 0.0f;
+ mBackgroundG = 0.0f;
+ mBackgroundB = 0.0f;
}
MediaPluginWebKit::~MediaPluginWebKit()
@@ -522,6 +641,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
{
if(message_name == "init")
{
+ std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter
+ mProfileDir = user_data_path + "browser_profile";
+
LLPluginMessage message("base", "init_response");
LLSD versions = LLSD::emptyMap();
versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
@@ -557,7 +679,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
}
else if(message_name == "cleanup")
{
- // TODO: clean up here
+ // DTOR most likely won't be called but the recent change to the way this process
+ // is (not) killed means we see this message and can do what we need to here.
+ // Note: this cleanup is ultimately what writes cookies to the disk
+ LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this );
+ LLQtWebKit::getInstance()->reset();
}
else if(message_name == "shm_added")
{
@@ -566,7 +692,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
info.mSize = (size_t)message_in.getValueS32("size");
std::string name = message_in.getValue("name");
-
// std::cerr << "MediaPluginWebKit::receiveMessage: shared memory added, name: " << name
// << ", size: " << info.mSize
// << ", address: " << info.mAddress
@@ -616,7 +741,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
S32 height = message_in.getValueS32("height");
S32 texture_width = message_in.getValueS32("texture_width");
S32 texture_height = message_in.getValueS32("texture_height");
-
+ mBackgroundR = message_in.getValueReal("background_r");
+ mBackgroundG = message_in.getValueReal("background_g");
+ mBackgroundB = message_in.getValueReal("background_b");
+// mBackgroundA = message_in.setValueReal("background_a"); // Ignore any alpha
+
if(!name.empty())
{
// Find the shared memory region with this name
@@ -674,7 +803,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
if(!uri.empty())
{
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+ }
+ else
+ {
+ mInitialNavigateURL = uri;
+ }
}
}
else if(message_name == "mouse_event")
@@ -723,6 +859,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
std::string event = message_in.getValue("event");
S32 key = message_in.getValueS32("key");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
// Treat unknown events as key-up for safety.
LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
@@ -735,14 +872,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
key_event = LLQtWebKit::KE_KEY_REPEAT;
}
- keyEvent(key_event, key, decodeModifiers(modifiers));
+ keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
}
else if(message_name == "text_event")
{
std::string text = message_in.getValue("text");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
- unicodeInput(text, decodeModifiers(modifiers));
+ unicodeInput(text, decodeModifiers(modifiers), native_key_data);
}
if(message_name == "edit_cut")
{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a7681e4a1d..14eb75e457 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -7,6 +7,7 @@ include(Boost)
include(BuildVersion)
include(DBusGlib)
include(DirectX)
+include(DragDrop)
include(ELFIO)
include(FMOD)
include(OPENAL)
@@ -63,8 +64,6 @@ include_directories(
)
set(viewer_SOURCE_FILES
- llaccordionctrl.cpp
- llaccordionctrltab.cpp
llagent.cpp
llagentaccess.cpp
llagentdata.cpp
@@ -90,6 +89,7 @@ set(viewer_SOURCE_FILES
llbox.cpp
llbreadcrumbview.cpp
llcallbacklist.cpp
+ llcallfloater.cpp
llcallingcard.cpp
llcapabilitylistener.cpp
llcaphttpsender.cpp
@@ -103,6 +103,7 @@ set(viewer_SOURCE_FILES
llclassifiedstatsresponder.cpp
llcloud.cpp
llcolorswatch.cpp
+ llcommanddispatcherlistener.cpp
llcommandhandler.cpp
llcommandlineparser.cpp
llcompilequeue.cpp
@@ -155,16 +156,13 @@ set(viewer_SOURCE_FILES
llfloaterbuycontents.cpp
llfloaterbuycurrency.cpp
llfloaterbuyland.cpp
- llfloatercall.cpp
llfloatercamera.cpp
- llfloaterchat.cpp
- llfloaterchatterbox.cpp
llfloatercolorpicker.cpp
llfloatercustomize.cpp
llfloaterdaycycle.cpp
llfloaterenvsettings.cpp
+ llfloaterevent.cpp
llfloaterfonttest.cpp
- llfloaterfriends.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
llfloatergroupinvite.cpp
@@ -197,6 +195,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterscriptdebug.cpp
+ llfloaterscriptlimits.cpp
llfloatersearch.cpp
llfloatersellland.cpp
llfloatersettingsdebug.cpp
@@ -214,8 +213,8 @@ set(viewer_SOURCE_FILES
llfloaterwater.cpp
llfloaterwhitelistentry.cpp
llfloaterwindlight.cpp
+ llfloaterwindowsize.cpp
llfloaterworldmap.cpp
- llfoldertype.cpp
llfolderview.cpp
llfolderviewitem.cpp
llfollowcam.cpp
@@ -223,9 +222,9 @@ set(viewer_SOURCE_FILES
llgesturemgr.cpp
llglsandbox.cpp
llgroupactions.cpp
+ llgroupiconctrl.cpp
llgrouplist.cpp
llgroupmgr.cpp
- llgroupnotify.cpp
llhomelocationresponder.cpp
llhudeffect.cpp
llhudeffectbeam.cpp
@@ -238,20 +237,23 @@ set(viewer_SOURCE_FILES
llhudrender.cpp
llhudtext.cpp
llhudview.cpp
- llimcontrolpanel.cpp
llimfloater.cpp
+ llimfloatercontainer.cpp
llimhandler.cpp
- llimpanel.cpp
llimview.cpp
llinspect.cpp
llinspectavatar.cpp
llinspectgroup.cpp
llinspectobject.cpp
+ llinspectremoteobject.cpp
+ llinspecttoast.cpp
llinventorybridge.cpp
llinventoryclipboard.cpp
llinventoryfilter.cpp
+ llinventoryfunctions.cpp
llinventorymodel.cpp
- llinventorysubtreepanel.cpp
+ llinventoryobserver.cpp
+ llinventorypanel.cpp
lljoystickbutton.cpp
lllandmarkactions.cpp
lllandmarklist.cpp
@@ -267,10 +269,8 @@ set(viewer_SOURCE_FILES
llmaniprotate.cpp
llmanipscale.cpp
llmaniptranslate.cpp
- llmapresponders.cpp
llmediactrl.cpp
llmediadataclient.cpp
- llmediaremotectrl.cpp
llmemoryview.cpp
llmenucommands.cpp
llmetricperformancetester.cpp
@@ -288,22 +288,18 @@ set(viewer_SOURCE_FILES
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
+ llnotificationhandlerutil.cpp
llnotificationmanager.cpp
+ llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
llnotificationtiphandler.cpp
- llnotify.cpp
lloutputmonitorctrl.cpp
- lloverlaybar.cpp
- llpanelappearance.cpp
- llpanelappearancetab.cpp
llpanelavatar.cpp
- llpanelavatarrow.cpp
llpanelavatartag.cpp
llpanelblockedlist.cpp
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
- llpanelevent.cpp
llpanelface.cpp
llpanelgroup.cpp
llpanelgroupgeneral.cpp
@@ -311,21 +307,25 @@ set(viewer_SOURCE_FILES
llpanelgrouplandmoney.cpp
llpanelgroupnotices.cpp
llpanelgrouproles.cpp
+ llpanelhome.cpp
llpanelimcontrolpanel.cpp
- llpanelinventory.cpp
llpanelland.cpp
llpanellandaudio.cpp
+ llpanellandmarkinfo.cpp
llpanellandmarks.cpp
llpanellandmedia.cpp
llpanellogin.cpp
+ llpanelloginlistener.cpp
llpanellookinfo.cpp
- llpanellooks.cpp
- llpanelmedia.cpp
+ llpanelmaininventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
- llpanelmeprofile.cpp
+ llpanelme.cpp
+ llpanelnearbymedia.cpp
llpanelobject.cpp
+ llpanelobjectinventory.cpp
+ llpaneloutfitsinventory.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
llpanelpermissions.cpp
@@ -333,18 +333,20 @@ set(viewer_SOURCE_FILES
llpanelpicks.cpp
llpanelplace.cpp
llpanelplaceinfo.cpp
+ llpanelplaceprofile.cpp
llpanelplaces.cpp
llpanelplacestab.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
llpanelprofileview.cpp
- llpanelshower.cpp
llpanelteleporthistory.cpp
llpanelvolume.cpp
+ llpanelvolumepulldown.cpp
llparcelselection.cpp
llparticipantlist.cpp
llpatchvertexarray.cpp
llplacesinventorybridge.cpp
+ llplacesinventorypanel.cpp
llpolymesh.cpp
llpolymorph.cpp
llpreview.cpp
@@ -361,19 +363,28 @@ set(viewer_SOURCE_FILES
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
llscreenchannel.cpp
+ llscriptfloater.cpp
llscrollingpanelparam.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
llselectmgr.cpp
+ llsidepanelappearance.cpp
+ llsidepanelinventory.cpp
+ llsidepanelinventorysubpanel.cpp
+ llsidepaneliteminfo.cpp
+ llsidepaneltaskinfo.cpp
llsidetray.cpp
llsidetraypanelcontainer.cpp
llsky.cpp
llslurl.cpp
llspatialpartition.cpp
+ llspeakbutton.cpp
llspeakers.cpp
+ llspeakingindicatormanager.cpp
llsplitbutton.cpp
llsprite.cpp
llstartup.cpp
+ llstartuplistener.cpp
llstatusbar.cpp
llstylemap.cpp
llsurface.cpp
@@ -390,7 +401,12 @@ set(viewer_SOURCE_FILES
lltexturecache.cpp
lltexturectrl.cpp
lltexturefetch.cpp
+ lltextureinfo.cpp
+ lltextureinfodetails.cpp
+ lltexturestats.cpp
+ lltexturestatsuploader.cpp
lltextureview.cpp
+ lltextutil.cpp
lltoast.cpp
lltoastalertpanel.cpp
lltoastgroupnotifypanel.cpp
@@ -398,7 +414,6 @@ set(viewer_SOURCE_FILES
lltoastnotifypanel.cpp
lltoastpanel.cpp
lltool.cpp
- lltoolbar.cpp
lltoolbrush.cpp
lltoolcomp.cpp
lltooldraganddrop.cpp
@@ -423,23 +438,29 @@ set(viewer_SOURCE_FILES
lluploaddialog.cpp
llurl.cpp
llurldispatcher.cpp
+ llurldispatcherlistener.cpp
llurlhistory.cpp
llurllineeditorctrl.cpp
llurlsimstring.cpp
llurlwhitelist.cpp
llvectorperfoptions.cpp
+ llversioninfo.cpp
llviewchildren.cpp
llviewerassetstorage.cpp
+ llviewerassettype.cpp
llvieweraudio.cpp
llviewercamera.cpp
+ llviewerchat.cpp
llviewercontrol.cpp
llviewercontrollistener.cpp
llviewerdisplay.cpp
llviewerfloaterreg.cpp
+ llviewerfoldertype.cpp
llviewergenericmessage.cpp
llviewergesture.cpp
llviewerhelp.cpp
llviewerhelputil.cpp
+ llviewerhome.cpp
llviewerinventory.cpp
llviewerjoint.cpp
llviewerjointattachment.cpp
@@ -487,8 +508,6 @@ set(viewer_SOURCE_FILES
llvoground.cpp
llvoicechannel.cpp
llvoiceclient.cpp
- llvoicecontrolpanel.cpp
- llvoiceremotectrl.cpp
llvoicevisualizer.cpp
llvoinventorylistener.cpp
llvopartgroup.cpp
@@ -513,6 +532,8 @@ set(viewer_SOURCE_FILES
llwlparamset.cpp
llworld.cpp
llworldmap.cpp
+ llworldmapmessage.cpp
+ llworldmipmap.cpp
llworldmapview.cpp
llxmlrpclistener.cpp
llxmlrpctransaction.cpp
@@ -540,8 +561,6 @@ endif (LINUX)
set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
- llaccordionctrl.h
- llaccordionctrltab.h
llagent.h
llagentaccess.h
llagentdata.h
@@ -568,6 +587,7 @@ set(viewer_HEADER_FILES
llbox.h
llbreadcrumbview.h
llcallbacklist.h
+ llcallfloater.h
llcallingcard.h
llcapabilitylistener.h
llcapabilityprovider.h
@@ -582,6 +602,7 @@ set(viewer_HEADER_FILES
llclassifiedstatsresponder.h
llcloud.h
llcolorswatch.h
+ llcommanddispatcherlistener.h
llcommandhandler.h
llcommandlineparser.h
llcompilequeue.h
@@ -635,16 +656,13 @@ set(viewer_HEADER_FILES
llfloaterbuycontents.h
llfloaterbuycurrency.h
llfloaterbuyland.h
- llfloatercall.h
llfloatercamera.h
- llfloaterchat.h
- llfloaterchatterbox.h
llfloatercolorpicker.h
llfloatercustomize.h
llfloaterdaycycle.h
llfloaterenvsettings.h
+ llfloaterevent.h
llfloaterfonttest.h
- llfloaterfriends.h
llfloatergesture.h
llfloatergodtools.h
llfloatergroupinvite.h
@@ -677,6 +695,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterscriptdebug.h
+ llfloaterscriptlimits.h
llfloatersearch.h
llfloatersellland.h
llfloatersettingsdebug.h
@@ -694,8 +713,8 @@ set(viewer_HEADER_FILES
llfloaterwater.h
llfloaterwhitelistentry.h
llfloaterwindlight.h
+ llfloaterwindowsize.h
llfloaterworldmap.h
- llfoldertype.h
llfolderview.h
llfoldervieweventlistener.h
llfolderviewitem.h
@@ -703,9 +722,9 @@ set(viewer_HEADER_FILES
llfriendcard.h
llgesturemgr.h
llgroupactions.h
+ llgroupiconctrl.h
llgrouplist.h
llgroupmgr.h
- llgroupnotify.h
llhomelocationresponder.h
llhudeffect.h
llhudeffectbeam.h
@@ -718,19 +737,22 @@ set(viewer_HEADER_FILES
llhudrender.h
llhudtext.h
llhudview.h
- llimcontrolpanel.h
llimfloater.h
- llimpanel.h
+ llimfloatercontainer.h
llimview.h
llinspect.h
llinspectavatar.h
llinspectgroup.h
llinspectobject.h
+ llinspectremoteobject.h
+ llinspecttoast.h
llinventorybridge.h
llinventoryclipboard.h
llinventoryfilter.h
+ llinventoryfunctions.h
llinventorymodel.h
- llinventorysubtreepanel.h
+ llinventoryobserver.h
+ llinventorypanel.h
lljoystickbutton.h
lllandmarkactions.h
lllandmarklist.h
@@ -747,10 +769,8 @@ set(viewer_HEADER_FILES
llmaniprotate.h
llmanipscale.h
llmaniptranslate.h
- llmapresponders.h
llmediactrl.h
llmediadataclient.h
- llmediaremotectrl.h
llmemoryview.h
llmenucommands.h
llmetricperformancetester.h
@@ -768,19 +788,13 @@ set(viewer_HEADER_FILES
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
- llnotify.h
lloutputmonitorctrl.h
- lloverlaybar.h
- llpanelappearance.h
- llpanelappearancetab.h
llpanelavatar.h
- llpanelavatarrow.h
llpanelavatartag.h
llpanelblockedlist.h
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
- llpanelevent.h
llpanelface.h
llpanelgroup.h
llpanelgroupgeneral.h
@@ -788,21 +802,25 @@ set(viewer_HEADER_FILES
llpanelgrouplandmoney.h
llpanelgroupnotices.h
llpanelgrouproles.h
+ llpanelhome.h
llpanelimcontrolpanel.h
- llpanelinventory.h
llpanelland.h
llpanellandaudio.h
+ llpanellandmarkinfo.h
llpanellandmarks.h
llpanellandmedia.h
llpanellogin.h
+ llpanelloginlistener.h
llpanellookinfo.h
- llpanellooks.h
- llpanelmedia.h
+ llpanelmaininventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
- llpanelmeprofile.h
+ llpanelme.h
+ llpanelnearbymedia.h
llpanelobject.h
+ llpanelobjectinventory.h
+ llpaneloutfitsinventory.h
llpanelpeople.h
llpanelpeoplemenus.h
llpanelpermissions.h
@@ -810,18 +828,20 @@ set(viewer_HEADER_FILES
llpanelpicks.h
llpanelplace.h
llpanelplaceinfo.h
+ llpanelplaceprofile.h
llpanelplaces.h
llpanelplacestab.h
llpanelprimmediacontrols.h
llpanelprofile.h
llpanelprofileview.h
- llpanelshower.h
llpanelteleporthistory.h
llpanelvolume.h
+ llpanelvolumepulldown.h
llparcelselection.h
llparticipantlist.h
llpatchvertexarray.h
llplacesinventorybridge.h
+ llplacesinventorypanel.h
llpolymesh.h
llpolymorph.h
llpreview.h
@@ -840,19 +860,28 @@ set(viewer_HEADER_FILES
llrootview.h
llsavedsettingsglue.h
llscreenchannel.h
+ llscriptfloater.h
llscrollingpanelparam.h
llsearchcombobox.h
llsearchhistory.h
llselectmgr.h
+ llsidepanelappearance.h
+ llsidepanelinventory.h
+ llsidepanelinventorysubpanel.h
+ llsidepaneliteminfo.h
+ llsidepaneltaskinfo.h
llsidetray.h
llsidetraypanelcontainer.h
llsky.h
llslurl.h
llspatialpartition.h
+ llspeakbutton.h
llspeakers.h
+ llspeakingindicatormanager.h
llsplitbutton.h
llsprite.h
llstartup.h
+ llstartuplistener.h
llstatusbar.h
llstylemap.h
llsurface.h
@@ -870,7 +899,12 @@ set(viewer_HEADER_FILES
lltexturecache.h
lltexturectrl.h
lltexturefetch.h
+ lltextureinfo.h
+ lltextureinfodetails.h
+ lltexturestats.h
+ lltexturestatsuploader.h
lltextureview.h
+ lltextutil.h
lltoast.h
lltoastalertpanel.h
lltoastgroupnotifypanel.h
@@ -878,7 +912,6 @@ set(viewer_HEADER_FILES
lltoastnotifypanel.h
lltoastpanel.h
lltool.h
- lltoolbar.h
lltoolbrush.h
lltoolcomp.h
lltooldraganddrop.h
@@ -904,23 +937,28 @@ set(viewer_HEADER_FILES
lluploaddialog.h
llurl.h
llurldispatcher.h
+ llurldispatcherlistener.h
llurlhistory.h
llurllineeditorctrl.h
llurlsimstring.h
llurlwhitelist.h
llvectorperfoptions.h
+ llversioninfo.h
llviewchildren.h
llviewerassetstorage.h
+ llviewerassettype.h
llvieweraudio.h
- llviewerbuild.h
llviewercamera.h
+ llviewerchat.h
llviewercontrol.h
llviewercontrollistener.h
llviewerdisplay.h
llviewerfloaterreg.h
+ llviewerfoldertype.h
llviewergenericmessage.h
llviewergesture.h
llviewerhelp.h
+ llviewerhome.h
llviewerinventory.h
llviewerjoint.h
llviewerjointattachment.h
@@ -966,8 +1004,6 @@ set(viewer_HEADER_FILES
llvoground.h
llvoicechannel.h
llvoiceclient.h
- llvoicecontrolpanel.h
- llvoiceremotectrl.h
llvoicevisualizer.h
llvoinventorylistener.h
llvopartgroup.h
@@ -994,13 +1030,14 @@ set(viewer_HEADER_FILES
llwlparamset.h
llworld.h
llworldmap.h
+ llworldmapmessage.h
+ llworldmipmap.h
llworldmapview.h
llxmlrpclistener.h
llxmlrpctransaction.h
macmain.h
noise.h
pipeline.h
- randgauss.h
VertexCache.h
VorbisFramework.h
)
@@ -1014,11 +1051,13 @@ if (DARWIN)
find_library(APPKIT_LIBRARY AppKit)
find_library(COCOA_LIBRARY Cocoa)
find_library(IOKIT_LIBRARY IOKit)
+ find_library(COREAUDIO_LIBRARY CoreAudio)
set(viewer_LIBRARIES
${COCOA_LIBRARY}
${AGL_LIBRARY}
${IOKIT_LIBRARY}
+ ${COREAUDIO_LIBRARY}
)
# Add resource files to the project.
@@ -1071,22 +1110,13 @@ if (WINDOWS)
# the .pch file.
# All sources added to viewer_SOURCE_FILES
# at this point use it.
- set_source_files_properties(llviewerprecompiledheaders.cpp
- PROPERTIES
- COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h"
- )
- foreach( src_file ${viewer_SOURCE_FILES} )
- set_source_files_properties(
- ${src_file}
+ if(USE_PRECOMPILED_HEADERS)
+ set_source_files_properties(llviewerprecompiledheaders.cpp
PROPERTIES
- COMPILE_FLAGS "/Yullviewerprecompiledheaders.h"
- )
- endforeach( src_file ${viewer_SOURCE_FILES} )
- list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp)
- # llstartup.cpp needs special symbols for audio libraries, so it resets
- # COMPILE_FLAGS below. Make sure it maintains precompiled header settings.
- set(LLSTARTUP_COMPILE_FLAGS
- "${LLSTARTUP_COMPILE_FLAGS} /Yullviewerprecompiledheaders.h")
+ COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h"
+ )
+ set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp)
+ endif(USE_PRECOMPILED_HEADERS)
# Add resource files to the project.
# viewerRes.rc is the only buildable file, but
@@ -1138,7 +1168,7 @@ if (WINDOWS)
if (NOT STANDALONE)
list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
- endif (NOT STANDALONE)
+ endif (NOT STANDALONE)
find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR})
find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})
@@ -1309,7 +1339,6 @@ add_executable(${VIEWER_BINARY_NAME}
MACOSX_BUNDLE
${viewer_SOURCE_FILES}
)
-check_message_template(${VIEWER_BINARY_NAME})
if (LLKDU_LIBRARY)
add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
@@ -1320,7 +1349,7 @@ file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST
${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py)
list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST})
-set(PACKAGE OFF CACHE BOOL
+set(PACKAGE ON CACHE BOOL
"Add a package target that builds an installer package.")
if (WINDOWS)
@@ -1338,113 +1367,215 @@ if (WINDOWS)
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
LINK_FLAGS_RELEASE ${release_flags}
)
+ if(USE_PRECOMPILED_HEADERS)
+ set_target_properties(
+ ${VIEWER_BINARY_NAME}
+ PROPERTIES
+ COMPILE_FLAGS "/Yullviewerprecompiledheaders.h"
+ )
+ endif(USE_PRECOMPILED_HEADERS)
+
+ # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency
+ # here.
+ # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action
+ # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
+ # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
+ # and have the build deps get tracked *please* tell me about it.
+
+ if(LLKDU_LIBRARY)
+ # Configure a var for llkdu which may not exist for all builds.
+ set(LLKDU_DLL_SOURCE ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llkdu.dll)
+ endif(LLKDU_LIBRARY)
+
+ if(USE_GOOGLE_PERFTOOLS)
+ # Configure a var for tcmalloc location, if used.
+ # Note the need to specify multiple names explicitly.
+ set(GOOGLE_PERF_TOOLS_SOURCE
+ ${SHARED_LIB_STAGING_DIR}/Release/libtcmalloc_minimal.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
+ )
+ endif(USE_GOOGLE_PERFTOOLS)
+
+
+ set(COPY_INPUT_DEPENDECIES
+ # The following commented dependencies are determined at variably at build time. Can't do this here.
+ #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
+ ${CMAKE_SOURCE_DIR}/../etc/message.xml
+ ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
+ ${LLKDU_DLL_SOURCE}
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
+ ${GOOGLE_PERF_TOOLS_SOURCE}
+ ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
+ ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
+ ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll
+ ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll
+ SLPlugin
+ media_plugin_quicktime
+ media_plugin_webkit
+ windows-crash-logger
+ windows-updater
+ )
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
+ COMMAND ${PYTHON_EXECUTABLE}
+ ARGS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ --actions=copy
+ --artwork=${ARTWORK_DIR}
+ --build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
+ --grid=${GRID}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
+ --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ stage_third_party_libs
+ ${COPY_INPUT_DEPENDECIES}
+ COMMENT "Performing viewer_manifest copy"
+ )
+
+ add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
+
+ add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
+
+ if(LLKDU_LIBRARY)
+ # kdu may not exist!
+ add_dependencies(copy_w_viewer_manifest llkdu)
+ endif(LLKDU_LIBRARY)
+
+ if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
+ add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
+ endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
+
+ add_dependencies(${VIEWER_BINARY_NAME}
+ SLPlugin
+ media_plugin_quicktime
+ media_plugin_webkit
+ windows-updater
+ windows-crash-logger
+ )
# sets the 'working directory' for debugging from visual studio.
if (NOT UNATTENDED)
add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS
--solution
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
--workingdir
${VIEWER_BINARY_NAME}
- ${CMAKE_CURRENT_SOURCE_DIR}
+ "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
)
endif (NOT UNATTENDED)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg
- COMMENT "Copying message_template.msg to the runtime folder."
- )
-
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
- COMMENT "Copying message.xml to the runtime folder."
- )
-
- if(WINDOWS)
- # Copy Win Libs...
- # This happens at build time, not config time. We can't glob files in this cmake.
- # *FIX:Mani Write a sub script to glob the files...
- # *FIX:Mani Use actually dependencies rather than bulk copy.
+ if (PACKAGE)
add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
- COMMAND ${CMAKE_COMMAND}
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
+ COMMAND ${PYTHON_EXECUTABLE}
ARGS
- -E
- copy_directory
- ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
- COMMENT "Copying staged dlls."
+ ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
+ ${CMAKE_CURRENT_SOURCE_DIR}/..
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CFG_INTDIR}
+ DEPENDS
+ lleventhost
+ ${EVENT_HOST_SCRIPTS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
)
-
- add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
- if(LLKDU_LIBRARY)
- # kdu may not exist!
- add_dependencies(${VIEWER_BINARY_NAME} llkdu)
- endif(LLKDU_LIBRARY)
- endif(WINDOWS)
-
- if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
- add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
- endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
-
- add_custom_command(
+
+ add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
COMMAND ${PYTHON_EXECUTABLE}
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --configuration=${CMAKE_CFG_INTDIR}
+ --artwork=${ARTWORK_DIR}
+ --build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
--channel=${VIEWER_CHANNEL}
- --login_channel=${VIEWER_LOGIN_CHANNEL}
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
--grid=${GRID}
+ --login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
- --artwork=${ARTWORK_DIR}
- --build=${CMAKE_CURRENT_BINARY_DIR}
- --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
- --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
+ --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
- add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)
-
- if (PACKAGE)
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
- COMMAND ${PYTHON_EXECUTABLE}
- ARGS
- ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
- ${CMAKE_CURRENT_SOURCE_DIR}/..
- ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_CFG_INTDIR}
-
- DEPENDS
- lleventhost
- ${EVENT_HOST_SCRIPTS}
- ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py)
-
- add_custom_target(package ALL
- DEPENDS
- ${CMAKE_CFG_INTDIR}/touched.bat)
- # temporarily disable packaging of event_host until hg subrepos get
- # sorted out on the parabuild cluster...
- #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
- add_dependencies(package windows-updater windows-crash-logger)
+ add_custom_target(package ALL DEPENDS
+ ${CMAKE_CFG_INTDIR}/touched.bat
+ windows-setup-build-all
+ )
+ # temporarily disable packaging of event_host until hg subrepos get
+ # sorted out on the parabuild cluster...
+ #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
+ check_message_template(package)
endif (PACKAGE)
endif (WINDOWS)
@@ -1474,7 +1605,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${BOOST_REGEX_LIBRARY}
${DBUSGLIB_LIBRARIES}
${OPENGL_LIBRARIES}
- ${FMODWRAPPER_LIBRARY}
+ ${FMODWRAPPER_LIBRARY} # must come after LLAudio
${OPENGL_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
@@ -1493,13 +1624,6 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
if (LINUX)
- add_custom_command(
- OUTPUT secondlife-stripped
- COMMAND strip
- ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME}
- DEPENDS ${VIEWER_BINARY_NAME}
- )
-
set(product SecondLife-${ARCH}-${viewer_VERSION})
add_custom_command(
@@ -1507,25 +1631,28 @@ if (LINUX)
COMMAND ${PYTHON_EXECUTABLE}
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --grid=${GRID}
- --channel=${VIEWER_CHANNEL}
- --login_channel=${VIEWER_LOGIN_CHANNEL}
- --installer_name=${product}
--arch=${ARCH}
- --source=${CMAKE_CURRENT_SOURCE_DIR}
--artwork=${ARTWORK_DIR}
--build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ --channel=${VIEWER_CHANNEL}
+ --configuration=${CMAKE_CFG_INTDIR}
--dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
+ --grid=${GRID}
+ --installer_name=${product}
+ --login_channel=${VIEWER_LOGIN_CHANNEL}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
- DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit)
if (NOT INSTALL)
add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
- add_dependencies(package linux-crash-logger-strip-target)
- add_dependencies(package linux-updater-strip-target)
+ add_dependencies(package linux-crash-logger-target)
+ add_dependencies(package linux-updater-target)
+ check_message_template(package)
endif (NOT INSTALL)
endif (LINUX)
@@ -1550,13 +1677,14 @@ if (DARWIN)
COMMAND ${PYTHON_EXECUTABLE}
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --grid=${GRID}
--actions=copy
- --configuration=${CMAKE_CFG_INTDIR}
- --source=${CMAKE_CURRENT_SOURCE_DIR}
--artwork=${ARTWORK_DIR}
--build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ --configuration=${CMAKE_CFG_INTDIR}
--dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
+ --grid=${GRID}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
@@ -1564,6 +1692,7 @@ if (DARWIN)
if (PACKAGE)
add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
+ check_message_template(package)
add_dependencies(package mac-updater mac-crash-logger)
add_custom_command(
@@ -1572,6 +1701,7 @@ if (DARWIN)
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
--grid=${GRID}
+ --buildtype=${CMAKE_BUILD_TYPE}
--configuration=${CMAKE_CFG_INTDIR}
--channel=${VIEWER_CHANNEL}
--login_channel=${VIEWER_LOGIN_CHANNEL}
@@ -1591,6 +1721,7 @@ if (DARWIN)
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
--grid=${GRID}
+ --buildtype=${CMAKE_BUILD_TYPE}
--configuration=${CMAKE_CFG_INTDIR}
--channel=${VIEWER_CHANNEL}
--login_channel=${VIEWER_LOGIN_CHANNEL}
@@ -1610,157 +1741,61 @@ if (INSTALL)
include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)
endif (INSTALL)
-# To add a viewer unit test, just add the test .cpp file below
-# This creates a separate test project per file listed.
-include(LLAddBuildTest)
-SET(viewer_TEST_SOURCE_FILES
- llagentaccess.cpp
- lldateutil.cpp
- llmediadataclient.cpp
- llviewerhelputil.cpp
- lllogininstance.cpp
- )
-set_source_files_properties(
- ${viewer_TEST_SOURCE_FILES}
- PROPERTIES
- LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp
- )
-LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}")
-
-#set(TEST_DEBUG on)
-set(test_sources llcapabilitylistener.cpp llviewerprecompiledheaders.cpp)
-set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
- ${LLVFS_LIBRARIES}
- ${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
- ${GOOGLEMOCK_LIBRARIES}
- )
-
-LL_ADD_INTEGRATION_TEST(llcapabilitylistener
- "${test_sources}"
- "${test_libs}"
- ${PYTHON_EXECUTABLE}
- "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py"
+if (LL_TESTS)
+ # To add a viewer unit test, just add the test .cpp file below
+ # This creates a separate test project per file listed.
+ include(LLAddBuildTest)
+ SET(viewer_TEST_SOURCE_FILES
+ llagentaccess.cpp
+ lldateutil.cpp
+ llmediadataclient.cpp
+ lllogininstance.cpp
+ llviewerhelputil.cpp
)
-#ADD_VIEWER_BUILD_TEST(llmemoryview viewer)
-
-
-# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py
-if (WINDOWS)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- make_directory
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Creating llplugin dir."
- )
-
- get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_SLPLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
- COMMENT "Copying SLPlugin executable to the runtime folder."
- )
-
- get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_WEBKIT_PLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Copying WebKit Plugin to the runtime folder."
- )
-
- get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_QUICKTIME_PLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Copying Quicktime Plugin to the runtime folder."
- )
-
- #*******************************
- # Copy media plugin support dlls
- # Debug config runtime files required for the plugins
- set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
- set(plugins_debug_files
- libeay32.dll
- qtcored4.dll
- qtguid4.dll
- qtnetworkd4.dll
- qtopengld4.dll
- qtwebkitd4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${plugins_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin"
- out_targets
- ${plugins_debug_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the plugins
- set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
- set(plugins_release_files
- libeay32.dll
- qtcore4.dll
- qtgui4.dll
- qtnetwork4.dll
- qtopengl4.dll
- qtwebkit4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${plugins_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin"
- out_targets
- ${plugins_release_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- copy_if_different(
- ${plugins_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin"
- out_targets
- ${plugins_release_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- add_custom_target(copy_media_plugin_libs ALL
- DEPENDS
- ${media_plugin_targets}
+ ##################################################
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ ##################################################
+ # if(USE_PRECOMPILED_HEADERS)
+ # set_source_files_properties(
+ # ${viewer_TEST_SOURCE_FILES}
+ # PROPERTIES
+ # LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp
+ # )
+ # endif(USE_PRECOMPILED_HEADERS)
+ LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}")
+
+ #set(TEST_DEBUG on)
+ set(test_sources llcapabilitylistener.cpp)
+ ##################################################
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ ##################################################
+ # if(USE_PRECOMPILED_HEADERS)
+ # set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp)
+ # endif(USE_PRECOMPILED_HEADERS)
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
+ ${LLVFS_LIBRARIES}
+ ${LLMATH_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${GOOGLEMOCK_LIBRARIES}
)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_directory
- ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats
- COMMENT "Copying llpluging imageformat libs."
+ LL_ADD_INTEGRATION_TEST(llcapabilitylistener
+ "${test_sources}"
+ "${test_libs}"
+ ${PYTHON_EXECUTABLE}
+ "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py"
)
- add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs)
+ #ADD_VIEWER_BUILD_TEST(llmemoryview viewer)
+ #ADD_VIEWER_BUILD_TEST(llagentaccess viewer)
+ #ADD_VIEWER_BUILD_TEST(llworldmap viewer)
+ #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer)
+ #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer)
+ #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer)
+ #ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer)
+endif (LL_TESTS)
-endif (WINDOWS)
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index dceaba9a43..879408d6e4 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 2.0.0.3256";
-CFBundleGetInfoString = "Second Life version 2.0.0.3256, Copyright 2004-2009 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.0.0.200030";
+CFBundleGetInfoString = "Second Life version 2.0.0.200030, Copyright 2004-2009 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 7aec8a343d..38ebb22b84 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
- <string>2.0.0.3256</string>
+ <string>2.0.0.200030</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml
index 2038779c4f..0d539177f3 100644
--- a/indra/newview/app_settings/foldertypes.xml
+++ b/indra/newview/app_settings/foldertypes.xml
@@ -1,66 +1,61 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ensemble_defs>
<ensemble
- asset_num="-1"
- xui_name="default"
- icon_name="inv_plain_closed.tga"
- />
- <ensemble
- asset_num="27"
+ foldertype_num="27"
xui_name="head"
icon_name="inv_folder_outfit_head.tga"
allowed="hair,eyes"
/>
<ensemble
- asset_num="28"
+ foldertype_num="28"
xui_name="gloves"
icon_name="inv_folder_outfit_gloves.tga"
allowed="gloves"
/>
<ensemble
- asset_num="29"
+ foldertype_num="29"
xui_name="jacket"
icon_name="inv_folder_outfit_jacket.tga"
allowed="jacket"
/>
<ensemble
- asset_num="30"
+ foldertype_num="30"
xui_name="pants"
icon_name="inv_folder_outfit_pants.tga"
allowed="pants,underpants"
/>
<ensemble
- asset_num="31"
+ foldertype_num="31"
xui_name="shape"
icon_name="inv_folder_outfit_shape.tga"
allowed="shape,skin,hair,eyes"
/>
<ensemble
- asset_num="32"
+ foldertype_num="32"
xui_name="shoes"
icon_name="inv_folder_outfit_shoes.tga"
allowed="shoes,socks"
/>
<ensemble
- asset_num="33"
+ foldertype_num="33"
xui_name="shirt"
icon_name="inv_folder_outfit_shirt.tga"
allowed="shirt,undershirt"
/>
<ensemble
- asset_num="34"
+ foldertype_num="34"
xui_name="skirt"
icon_name="inv_folder_outfit_skirt.tga"
allowed=""
/>
<ensemble
- asset_num="35"
+ foldertype_num="35"
xui_name="underpants"
icon_name="inv_folder_outfit_underpants.tga"
allowed="underpants"
/>
<ensemble
- asset_num="36"
+ foldertype_num="36"
xui_name="undershirt"
icon_name="inv_folder_outfit_undershirt.tga"
allowed="undershirt"
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index 669235af1b..d0e1f62a84 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -1,291 +1,269 @@
-<?xml version="1.0" ?>
-<llsd>
-<map>
- <key>FirstAppearance</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstAppearance warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstAttach</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstAttach warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstBalanceDecrease</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstBalanceDecrease warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstBalanceIncrease</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstBalanceIncrease warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstBuild</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstBuild warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstDebugMenus</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstDebugMenus warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstFlexible</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstFlexible warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstGoTo</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstGoTo warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstInventory</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstInventory warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstLeftClickNoHit</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstLeftClickNoHit warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstMap</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstMap warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstMedia</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstMedia warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstOverrideKeys</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstOverrideKeys warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstSandbox</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstSandbox warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstSculptedPrim</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstSculptedPrim warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstSit</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstSit warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstStreamingMusic</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstStreamingMusic warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstStreamingVideo</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstStreamingVideo warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstTeleport</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstTeleport warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>FirstVoice</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstVoice warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>AboutDirectX9</key>
- <map>
- <key>Comment</key>
- <string>Enables AboutDirectX9 warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>BrowserLaunch</key>
- <map>
- <key>Comment</key>
- <string>Enables BrowserLaunch warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>DeedObject</key>
- <map>
- <key>Comment</key>
- <string>Enables DeedObject warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>NewClassified</key>
- <map>
- <key>Comment</key>
- <string>Enables NewClassified warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>QuickTimeInstalled</key>
- <map>
- <key>Comment</key>
- <string>Enables QuickTimeInstalled warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>ReturnToOwner</key>
- <map>
- <key>Comment</key>
- <string>Enables ReturnToOwner warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- </map>
-</llsd>
+<?xml version="1.0" ?>
+<llsd>
+<map>
+ <key>FirstAppearance</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstAppearance warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstAttach</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstAttach warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstBalanceDecrease</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBalanceDecrease warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstBalanceIncrease</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBalanceIncrease warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstBuild</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBuild warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstDebugMenus</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstDebugMenus warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstFlexible</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstFlexible warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstGoTo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstGoTo warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstInventory warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstLeftClickNoHit</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstLeftClickNoHit warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstMap warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstMedia</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstMedia warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstOverrideKeys</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstOverrideKeys warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstSandbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSandbox warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstSculptedPrim</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSculptedPrim warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstSit</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSit warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstTeleport</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstTeleport warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstVoice warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AboutDirectX9</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables AboutDirectX9 warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>BrowserLaunch</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables BrowserLaunch warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DeedObject</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables DeedObject warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NewClassified</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables NewClassified warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>QuickTimeInstalled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables QuickTimeInstalled warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ReturnToOwner</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables ReturnToOwner warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 544f1c598e..0805e94b10 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -268,8 +268,8 @@ ATTACH_LHIP Passed to llAttachToAvatar to attach task to left hip
ATTACH_LULEG Passed to llAttachToAvatar to attach task to left upper leg
ATTACH_LLLEG Passed to llAttachToAvatar to attach task to left lower leg
ATTACH_BELLY Passed to llAttachToAvatar to attach task to belly
-ATTACH_RPEC Passed to llAttachToAvatar to attach task to right pectoral
-ATTACH_LPEC Passed to llAttachToAvatar to attach task to left pectoral
+ATTACH_LEFT_PEC Passed to llAttachToAvatar to attach task to left pectoral
+ATTACH_RIGHT_PEC Passed to llAttachToAvatar to attach task to right pectoral
LAND_LEVEL Passed to llModifyLand to level terrain
LAND_RAISE Passed to llModifyLand to raise terrain
@@ -510,6 +510,7 @@ CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default act
CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked
CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked
CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked
TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
@@ -560,7 +561,8 @@ STATUS_WHITELIST_FAILED URL failed to pass whitelist
NULL_KEY Indicates an empty key
EOF Indicates the last line of a notecard was read
TEXTURE_BLANK UUID for the "Blank" texture
-TEXTURE_DEFAULT UUID for the "Default Media" texture
+TEXTURE_DEFAULT Alias for TEXTURE_PLYWOOD
+TEXTURE_MEDIA UUID for the "Default Media" texture
TEXTURE_PLYWOOD UUID for the default "Plywood" texture
TEXTURE_TRANSPARENT UUID for the "White - Transparent" texture
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f9d4a06de8..73c08c4867 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4,13 +4,13 @@
<key>AFKTimeout</key>
<map>
<key>Comment</key>
- <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string>
+ <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>S32</string>
<key>Value</key>
- <real>300.0</real>
+ <real>0</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@@ -45,17 +45,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>AllowIdleAFK</key>
- <map>
- <key>Comment</key>
- <string>Automatically set AFK (away from keyboard) mode when idle</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>AllowMultipleViewers</key>
<map>
<key>Comment</key>
@@ -133,7 +122,7 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ArrowKeysMoveAvatar</key>
+ <key>ArrowKeysAlwaysMove</key>
<map>
<key>Comment</key>
<string>While cursor is in chat entry box, arrow keys still control your avatar</string>
@@ -142,7 +131,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>AskedAboutCrashReports</key>
<map>
@@ -208,7 +197,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelMic</key>
<map>
@@ -230,7 +219,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelRolloff</key>
<map>
@@ -252,7 +241,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelUI</key>
<map>
@@ -276,40 +265,51 @@
<key>Value</key>
<real>0.5</real>
</map>
- <key>AudioSteamingMedia</key>
+ <key>AudioLevelWind</key>
<map>
<key>Comment</key>
- <string>Enable streaming</string>
+ <string>Audio level of wind noise when standing still</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>F32</string>
<key>Value</key>
- <integer>0</integer>
+ <real>0.5</real>
</map>
- <key>AudioStreamingMusic</key>
+ <key>AudioStreamingMedia</key>
<map>
<key>Comment</key>
- <string>Enable streaming audio</string>
+ <string>Enable streaming</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>AudioStreamingVideo</key>
+ <key>AudioStreamingMusic</key>
<map>
<key>Comment</key>
- <string>Enable streaming video</string>
+ <string>Enable streaming audio</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>AutoAcceptNewInventory</key>
+ <key>AuditTexture</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable texture auditting.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoAcceptNewInventory</key>
<map>
<key>Comment</key>
<string>Automatically accept new notecards/textures/landmarks</string>
@@ -375,38 +375,38 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>AutoPlayMedia</key>
+ <key>AutoSnapshot</key>
<map>
<key>Comment</key>
- <string>Allow media objects to automatically play or navigate?</string>
+ <string>Update snapshot when camera stops moving, or any parameter changes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
- <key>AutoSnapshot</key>
+ <key>AutomaticFly</key>
<map>
<key>Comment</key>
- <string>Update snapshot when camera stops moving, or any parameter changes</string>
+ <string>Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>AutomaticFly</key>
+ <key>AvalinePhoneSeparator</key>
<map>
<key>Comment</key>
- <string>Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only)</string>
+ <string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>String</string>
<key>Value</key>
- <integer>1</integer>
+ <string>-</string>
</map>
<key>AvatarAxisDeadZone0</key>
<map>
@@ -1044,7 +1044,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>10</integer>
+ <integer>4</integer>
</map>
<key>ButtonHeight</key>
<map>
@@ -1055,7 +1055,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>20</integer>
+ <integer>23</integer>
</map>
<key>ButtonHeightSmall</key>
<map>
@@ -1066,18 +1066,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>16</integer>
- </map>
- <key>ButtonVPad</key>
- <map>
- <key>Comment</key>
- <string>Default vertical spacing between buttons (pixels)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>1</integer>
+ <integer>23</integer>
</map>
<key>CacheLocation</key>
<map>
@@ -1121,7 +1110,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>500</integer>
+ <integer>512</integer>
</map>
<key>CacheValidateCounter</key>
<map>
@@ -1141,9 +1130,9 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>5</integer>
</map>
<key>CameraAngle</key>
<map>
@@ -1374,6 +1363,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>ChatWindow</key>
+ <map>
+ <key>Comment</key>
+ <string>Show chat in multiple windows(by default) or in one multi-tabbed window(requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>CheesyBeacon</key>
<map>
<key>Comment</key>
@@ -2355,6 +2355,17 @@
<key>Value</key>
<string>89556747-24cb-43ed-920b-47caed15465f</string>
</map>
+ <key>DefaultUploadCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Default sound/image/file upload cost(in case economy data is not available).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
<key>DisableCameraConstraints</key>
<map>
<key>Comment</key>
@@ -2366,6 +2377,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DisableMouseWarp</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DisableRendering</key>
<map>
<key>Comment</key>
@@ -3552,7 +3574,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>400</integer>
+ <integer>305</integer>
</map>
<key>HelpUseLocal</key>
<map>
@@ -3574,51 +3596,62 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://www.google.com/search?q=site%3Awiki.secondlife.com+[TOPIC]&amp;ignore_channel=[CHANNEL]&amp;ignore_version=[VERSION]&amp;ignore_os=[OS]&amp;ignore_language=[LANGUAGE]&amp;ignore_version_major=[VERSION_MAJOR]&amp;ignore_version_minor=[VERSION_MINOR]&amp;ignore_version_patch=[VERSION_PATCH]&amp;ignore_version_build=[VERSION_BUILD]</string>
+ <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string>
</map>
- <key>HighResSnapshot</key>
+ <key>HomeSidePanelURL</key>
<map>
<key>Comment</key>
- <string>Double resolution of snapshot from current window resolution</string>
+ <string>URL for the web page to display in the Home side panel</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>String</string>
<key>Value</key>
- <integer>0</integer>
+ <string>https://viewer-sidebar.secondlife.com/sidebar.html?p=[AUTH_TOKEN]&amp;lang=[LANGUAGE]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;firstlogin=[FIRST_LOGIN]</string>
</map>
- <key>HtmlHelpLastPage</key>
+ <key>SearchURL</key>
<map>
<key>Comment</key>
- <string>Last URL visited via help system</string>
+ <string>URL for Search website, displayed in the Find floater</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string />
+ <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]</string>
</map>
- <key>IMInChatConsole</key>
+ <key>HighResSnapshot</key>
<map>
<key>Comment</key>
- <string>Copy IM into chat console</string>
+ <string>Double resolution of snapshot from current window resolution</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
- <key>IMInChatHistory</key>
+ <key>HideSelectedObjects</key>
<map>
<key>Comment</key>
- <string>Copy IM into chat history</string>
+ <string>Hide Selected Objects</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
+ </map>
+ <key>HtmlHelpLastPage</key>
+ <map>
+ <key>Comment</key>
+ <string>Last URL visited via help system</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
</map>
<key>IMShowTimestamps</key>
<map>
@@ -3631,6 +3664,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>IMShowControlPanel</key>
+ <map>
+ <key>Comment</key>
+ <string>Show IM Control Panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>IgnoreAllNotifications</key>
<map>
<key>Comment</key>
@@ -3684,7 +3728,18 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.15</real>
+ <real>0.5</real>
+ </map>
+ <key>InspectorShowTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Stay timing for inspectors</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>3.0</real>
</map>
<key>InstallLanguage</key>
<map>
@@ -4226,7 +4281,29 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>LogMessages</key>
+ <key>LoginSRVTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Duration in seconds of the login SRV request timeout</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
+ <key>LoginSRVPump</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of the message pump that handles SRV request</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>LLAres</string>
+ </map>
+ <key>LogMessages</key>
<map>
<key>Comment</key>
<string>Log network traffic</string>
@@ -4251,13 +4328,13 @@
<key>LoginLocation</key>
<map>
<key>Comment</key>
- <string>Login at same location you last logged out</string>
+ <string>Login location ('last', 'home')</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>last</string>
+ <string>home</string>
</map>
<key>LoginPage</key>
<map>
@@ -4490,6 +4567,61 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MediaPerformanceManagerDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to show debug data for the media performance manager in the nearby media list.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MediaShowOnOthers</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media on other avatars</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaShowOutsideParcel</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media from outside the current parcel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaShowWithinParcel</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media within the current parcel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaTentativeAutoPlay</key>
+ <map>
+ <key>Comment</key>
+ <string>This is a tentative flag that may be temporarily set off by the user, until she teleports</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>MemoryLogFrequency</key>
<map>
<key>Comment</key>
@@ -4545,6 +4677,17 @@
<key>Value</key>
<integer>410</integer>
</map>
+ <key>MePanelOpened</key>
+ <map>
+ <key>Comment</key>
+ <string>Indicates that Me Panel was opened at least once after Viewer was installed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
<key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
@@ -4556,6 +4699,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MiniMapPrimMaxRadius</key>
+ <map>
+ <key>Comment</key>
+ <string>Radius of the largest prim to show on the MiniMap. Increasing beyond 256 may cause client lag.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>256.0</real>
+ </map>
<key>MiniMapRotate</key>
<map>
<key>Comment</key>
@@ -4570,7 +4724,7 @@
<key>MiniMapScale</key>
<map>
<key>Comment</key>
- <string>Miniature world map zoom levle (pixels per region)</string>
+ <string>Miniature world map zoom level (pixels per region)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -4699,6 +4853,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MyOutfitsAutofill</key>
+ <map>
+ <key>Comment</key>
+ <string>Always autofill My Outfits from library when empty (else happens just once).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>NearMeRange</key>
<map>
<key>Comment</key>
@@ -4851,7 +5016,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>350</integer>
+ <integer>305</integer>
</map>
<key>NotificationToastLifeTime</key>
<map>
@@ -4875,7 +5040,7 @@
<key>Value</key>
<integer>10</integer>
</map>
- <key>ToastOpaqueTime</key>
+ <key>ToastFadingTime</key>
<map>
<key>Comment</key>
<string>Number of seconds while a toast is fading </string>
@@ -4886,6 +5051,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>NearbyToastFadingTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of seconds while a nearby chat toast is fading </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3</integer>
+ </map>
+ <key>NearbyToastLifeTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of seconds while a nearby chat toast exists</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>23</integer>
+ </map>
<key>StartUpToastLifeTime</key>
<map>
<key>Comment</key>
@@ -4908,6 +5095,20 @@
<key>Value</key>
<integer>5</integer>
</map>
+ <key>ToastButtonWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Default width of buttons in the toast.
+ Notes:
+ If required width will be less then this one, a button will be reshaped to default size , otherwise to required
+ Change of this parameter will affect the layout of buttons in notification toast.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>90</integer>
+ </map>
<key>ChannelBottomPanelMargin</key>
<map>
<key>Comment</key>
@@ -4928,7 +5129,18 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>35</integer>
+ <integer>5</integer>
+ </map>
+ <key>NotificationChannelHeightRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
</map>
<key>OverflowToastHeight</key>
<map>
@@ -5148,7 +5360,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>PerAccountSettingsFile</key>
<map>
@@ -5260,7 +5472,17 @@
<key>Value</key>
<integer>1</integer>
</map>
-
+ <key>PluginAttachDebuggerToPlugins</key>
+ <map>
+ <key>Comment</key>
+ <string>If true, attach a debugger session to each plugin process as it's launched.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>PluginInstancesCPULimit</key>
<map>
<key>Comment</key>
@@ -5270,8 +5492,21 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.0</real>
+ <real>1.0</real>
+ </map>
+
+ <key>PlainTextChatHistory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable/Disable plain text chat history style</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
</map>
+
<key>PluginInstancesLow</key>
<map>
<key>Comment</key>
@@ -5286,24 +5521,24 @@
<key>PluginInstancesNormal</key>
<map>
<key>Comment</key>
- <string>Limit on the number of inworld media plugins that will run at "normal" priority</string>
+ <string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>4</integer>
+ <integer>2</integer>
</map>
<key>PluginInstancesTotal</key>
<map>
<key>Comment</key>
- <string>Hard limit on the number of plugins that will be instantiated at once</string>
+ <string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>16</integer>
+ <integer>8</integer>
</map>
<key>PrecachingDelay</key>
<map>
@@ -5319,7 +5554,7 @@
<key>PreferredMaturity</key>
<map>
<key>Comment</key>
- <string>Setting for the user's preferred maturity level.</string>
+ <string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -5327,6 +5562,39 @@
<key>Value</key>
<integer>13</integer>
</map>
+ <key>PrimMediaMasterEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not Media on a Prim is enabled.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PrimMediaControlsUseHoverControlSet</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>PrimMediaDragNDrop</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable drag and drop of URLs onto prim faces</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>PrimMediaMaxRetries</key>
<map>
<key>Comment</key>
@@ -5360,6 +5628,28 @@
<key>Value</key>
<real>5.0</real>
</map>
+ <key>PrimMediaMaxSortedQueueSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of objects the viewer will load media for initially</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>100000</integer>
+ </map>
+ <key>PrimMediaMaxRoundRobinQueueSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of objects the viewer will continuously update media for</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>100000</integer>
+ </map>
<key>ProbeHardwareOnStartup</key>
<map>
<key>Comment</key>
@@ -5413,7 +5703,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>QAMode</key>
<map>
@@ -5429,7 +5719,18 @@
<key>QAModeEventHostPort</key>
<map>
<key>Comment</key>
- <string>Enable Testing Features.</string>
+ <string>Port on which lleventhost should listen</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>QAModeTermCode</key>
+ <map>
+ <key>Comment</key>
+ <string>On LL_ERRS, terminate with this code instead of OS message box</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
@@ -5514,6 +5815,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RegInClient</key>
+ <map>
+ <key>Comment</key>
+ <string>Experimental: Embed registration in login screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RegionTextureSize</key>
<map>
<key>Comment</key>
@@ -5624,17 +5936,6 @@
<key>Value</key>
<integer>35</integer>
</map>
- <key>RenderAvatarInvisible</key>
- <map>
- <key>Comment</key>
- <string>Set your avatar as Invisible</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>RenderAvatarVP</key>
<map>
<key>Comment</key>
@@ -6172,7 +6473,7 @@
<real>1.0</real>
</map>
- <key>RenderHighlightEnable</key>
+ <key>RenderHoverGlowEnable</key>
<map>
<key>Comment</key>
<string>Show glow effect when hovering on interactive objects.</string>
@@ -7351,45 +7652,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SearchURLDefault</key>
- <map>
- <key>Comment</key>
- <string>URL to load for empty searches</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>HideFromEditor</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://search.secondlife.com/client_search.php?</string>
- </map>
- <key>SearchURLQuery</key>
- <map>
- <key>Comment</key>
- <string>URL to use for searches</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>HideFromEditor</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://search.secondlife.com/client_search.php?q=[QUERY]&amp;s=[COLLECTION]&amp;</string>
- </map>
- <key>SearchURLSuffix2</key>
- <map>
- <key>Comment</key>
- <string>Parameters added to end of search queries</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>HideFromEditor</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>lang=[LANG]&amp;mat=[MATURITY]&amp;t=[TEEN]&amp;region=[REGION]&amp;x=[X]&amp;y=[Y]&amp;z=[Z]&amp;session=[SESSION]</string>
- </map>
<key>SelectMovableOnly</key>
<map>
<key>Comment</key>
@@ -7577,10 +7839,21 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowCoordinatesOption</key>
+ <key>NavBarShowCoordinates</key>
+ <map>
+ <key>Comment</key>
+ <string>Show coordinates in navigation bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NavBarShowParcelProperties</key>
<map>
<key>Comment</key>
- <string>Show Coordinates in Location Input Field</string>
+ <string>Show parcel property icons in navigation bar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7610,6 +7883,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowDebugAppearanceEditor</key>
+ <map>
+ <key>Comment</key>
+ <string>Show debugging appearance editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowEmptyFoldersWhenSearching</key>
<map>
<key>Comment</key>
@@ -7708,7 +7992,18 @@
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
- </map>
+ </map>
+ <key>ShowObjectRenderingCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Show the object rendering cost in build tools</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
@@ -7811,7 +8106,7 @@
<key>ShowPGSearchAll</key>
<map>
<key>Comment</key>
- <string>Display results of search All that are flagged as PG</string>
+ <string>Display results of search All that are flagged as general</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7824,7 +8119,7 @@
<key>ShowMatureSearchAll</key>
<map>
<key>Comment</key>
- <string>Display results of search All that are flagged as mature</string>
+ <string>Display results of search All that are flagged as moderate</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7850,7 +8145,7 @@
<key>ShowPGGroups</key>
<map>
<key>Comment</key>
- <string>Display results of find groups that are flagged as PG</string>
+ <string>Display results of find groups that are flagged as general</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7863,7 +8158,7 @@
<key>ShowMatureGroups</key>
<map>
<key>Comment</key>
- <string>Display results of find groups that are flagged as mature</string>
+ <string>Display results of find groups that are flagged as moderate</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7889,7 +8184,7 @@
<key>ShowPGClassifieds</key>
<map>
<key>Comment</key>
- <string>Display results of find classifieds that are flagged as PG</string>
+ <string>Display results of find classifieds that are flagged as general</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7902,7 +8197,7 @@
<key>ShowMatureClassifieds</key>
<map>
<key>Comment</key>
- <string>Display results of find classifieds that are flagged as mature</string>
+ <string>Display results of find classifieds that are flagged as moderate</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7928,7 +8223,7 @@
<key>ShowPGEvents</key>
<map>
<key>Comment</key>
- <string>Display results of find events that are flagged as PG</string>
+ <string>Display results of find events that are flagged as general</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7941,7 +8236,7 @@
<key>ShowMatureEvents</key>
<map>
<key>Comment</key>
- <string>Display results of find events that are flagged as mature</string>
+ <string>Display results of find events that are flagged as moderate</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7967,7 +8262,7 @@
<key>ShowPGLand</key>
<map>
<key>Comment</key>
- <string>Display results of find land sales that are flagged as PG</string>
+ <string>Display results of find land sales that are flagged as general</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -7980,7 +8275,7 @@
<key>ShowMatureLand</key>
<map>
<key>Comment</key>
- <string>Display results of find land sales that are flagged as mature</string>
+ <string>Display results of find land sales that are flagged as moderate</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -8006,7 +8301,7 @@
<key>ShowPGSims</key>
<map>
<key>Comment</key>
- <string>Display results of find places or find popular that are in PG sims</string>
+ <string>Display results of find places or find popular that are in general sims</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -8019,7 +8314,7 @@
<key>ShowMatureSims</key>
<map>
<key>Comment</key>
- <string>Display results of find places or find popular that are in mature sims</string>
+ <string>Display results of find places or find popular that are in moderate sims</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
@@ -8161,7 +8456,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>ShowTangentBasis</key>
<map>
@@ -8207,6 +8502,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowVoiceVisualizersInCalls</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowVolumeSettingsPopup</key>
<map>
<key>Comment</key>
@@ -8545,6 +8851,39 @@
<key>Value</key>
<real>20.0</real>
</map>
+ <key>TextureDecodeDisabled</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE, do not fetch and decode any textures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TextureDisable</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE, do not load textures for in-world content</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TextureLoadFullRes</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE, always load textures at full resolution (discard = 0)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>TextureMemory</key>
<map>
<key>Comment</key>
@@ -8996,17 +9335,6 @@
<key>Value</key>
<string>5748decc-f629-461c-9a36-a35a221fe21f</string>
</map>
- <key>UIImgDefaultTattooUUID</key>
- <map>
- <key>Comment</key>
- <string />
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
- </map>
<key>UIImgDefaultUnderwearUUID</key>
<map>
<key>Comment</key>
@@ -9083,29 +9411,7 @@
<string>S32</string>
<key>Value</key>
<integer>2</integer>
- </map>
- <key>UILineEditorHPad</key>
- <map>
- <key>Comment</key>
- <string>UI Line Editor Horizontal Pad</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
- <key>UILineEditorVPad</key>
- <map>
- <key>Comment</key>
- <string>UI Line Editor Vertical Pad</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>3</integer>
- </map>
+ </map>
<key>UIMaxComboWidth</key>
<map>
<key>Comment</key>
@@ -9491,116 +9797,6 @@
<key>Value</key>
<string>00000000-0000-0000-0000-000000000000</string>
</map>
- <key>UISndPieMenuAppear</key>
- <map>
- <key>Comment</key>
- <string>Sound file for opening pie menu (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string>
- </map>
- <key>UISndPieMenuHide</key>
- <map>
- <key>Comment</key>
- <string>Sound file for closing pie menu (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>00000000-0000-0000-0000-000000000000</string>
- </map>
- <key>UISndPieMenuSliceHighlight0</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string>
- </map>
- <key>UISndPieMenuSliceHighlight1</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string>
- </map>
- <key>UISndPieMenuSliceHighlight2</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string>
- </map>
- <key>UISndPieMenuSliceHighlight3</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string>
- </map>
- <key>UISndPieMenuSliceHighlight4</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string>
- </map>
- <key>UISndPieMenuSliceHighlight5</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string>
- </map>
- <key>UISndPieMenuSliceHighlight6</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string>
- </map>
- <key>UISndPieMenuSliceHighlight7</key>
- <map>
- <key>Comment</key>
- <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string>
- </map>
<key>UISndSnapshot</key>
<map>
<key>Comment</key>
@@ -9676,7 +9872,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>8</integer>
+ <integer>11</integer>
</map>
<key>UISpinctrlBtnWidth</key>
<map>
@@ -9843,6 +10039,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>UseCircuitCodeMaxRetries</key>
+ <map>
+ <key>Comment</key>
+ <string>Max timeout count for the initial UseCircuitCode message</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>3</real>
+ </map>
+ <key>UseCircuitCodeTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Timeout duration in seconds for the initial UseCircuitCode message</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>5.0</real>
+ </map>
<key>UseDebugLogin</key>
<map>
<key>Comment</key>
@@ -9896,7 +10114,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>UseFreezeFrame</key>
<map>
@@ -9931,6 +10149,18 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>SpeakerParticipantRemoveDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Timeout to remove participants who is not in channel before removed from list of active speakers (text/voice chat)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
+
<key>UseStartScreen</key>
<map>
<key>Comment</key>
@@ -10284,6 +10514,17 @@
<key>Value</key>
<string>Default</string>
</map>
+ <key>VoiceParticipantLeftRemoveDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Timeout to remove participants who has left Voice chat from the list in Voice Controls Panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
<key>VoicePort</key>
<map>
<key>Comment</key>
@@ -10469,7 +10710,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <real>150000.0</real>
+ <string />
</map>
<key>YawFromMousePosition</key>
<map>
@@ -10603,6 +10844,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>SLURLDragNDrop</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable drag and drop of SLURLs onto the viewer</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>soundsbeacon</key>
<map>
<key>Comment</key>
@@ -10614,5 +10866,38 @@
<key>Value</key>
<integer>0</integer>
</map>
- </map>
+ <key>LogTextureDownloadsToViewerLog</key>
+ <map>
+ <key>Comment</key>
+ <string>Send texture download details to the viewer log</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogTextureDownloadsToSimulator</key>
+ <map>
+ <key>Comment</key>
+ <string>Send a digest of texture info to the sim</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TextureLoggingThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies the byte threshold at which texture download data should be sent to the sim.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 893e7acd7a..af5fa4f388 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -22,17 +22,6 @@
<key>Value</key>
<string>|TOKEN COPY BusyModeResponse|</string>
</map>
- <key>IMLogOptions</key>
- <map>
- <key>Comment</key>
- <string>Log options for Instant Messages</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
<key>InstantMessageLogFolder</key>
<map>
<key>Comment</key>
@@ -75,18 +64,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
- </map>
- <key>LogChatIM</key>
- <map>
- <key>Comment</key>
- <string>Log Incoming Instant Messages with Chat</string>
- <key>Persist</key>
<integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
</map>
<key>LogTimestamp</key>
<map>
@@ -97,7 +75,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>LogInstantMessages</key>
<map>
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
index 28908a311d..0fad5b4b50 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
@@ -10,7 +10,6 @@
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
-uniform sampler2DRect edgeMap;
uniform float dist_factor;
uniform float blur_size;
@@ -46,53 +45,36 @@ void main()
dlt /= max(-pos.z*dist_factor, 1.0);
- vec2 defined_weight = kern[0].xy; // special case the kern[0] (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+ vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
vec4 col = defined_weight.xyxx * ccol;
-
- float center_e = 1.0 - (texture2DRect(edgeMap, vary_fragcoord.xy).a+
- texture2DRect(edgeMap, vary_fragcoord.xy+dlt*0.333).a+
- texture2DRect(edgeMap, vary_fragcoord.xy-dlt*0.333).a);
- float e = center_e;
for (int i = 1; i < 4; i++)
{
vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
-
- e = max(e, 0.0);
-
- vec2 wght = kern[i].xy*e;
-
- col += texture2DRect(lightMap, tc)*wght.xyxx;
- defined_weight += wght;
-
- e *= e;
- e -= texture2DRect(edgeMap, tc.xy).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
- texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+ vec3 samppos = getPosition(tc).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= 0.003)
+ {
+ col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
}
-
- e = center_e;
for (int i = 1; i < 4; i++)
{
vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
-
- e = max(e, 0.0);
-
- vec2 wght = kern[i].xy*e;
-
- col += texture2DRect(lightMap, tc)*wght.xyxx;
- defined_weight += wght;
-
- e *= e;
- e -= texture2DRect(edgeMap, tc.xy).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
- texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+ vec3 samppos = getPosition(tc).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= 0.003)
+ {
+ col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
}
+
col /= defined_weight.xyxx;
gl_FragColor = col;
-
- //gl_FragColor = ccol;
}
+
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index c43ba27984..448e20b382 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<linden_avatar
- version="1.0" wearable_definition_version="23">
+ version="1.0" wearable_definition_version="22">
<!-- The wearable_definition_version is checked during asset upload. -->
<!-- If you increment it, check indra/lib/python/indra/assetutil.py. -->
<skeleton
@@ -5608,9 +5608,7 @@
<layer_set
body_region="head"
width="512"
- height="512"
- clear_alpha="false"
- alpha_tga_file="head_alpha.tga">
+ height="512">
<layer
name="head bump base"
fixed_color = "128,128,128,255"
@@ -6609,6 +6607,13 @@ render_pass="bump">
local_texture="head_bodypaint" />
</layer>
<layer
+ name="eyelash alpha"
+ visibility_mask="TRUE">
+ <texture
+ tga_file="head_alpha.tga"
+ file_is_mask="TRUE" />
+ </layer>
+ <layer
name="head alpha"
visibility_mask="TRUE">
<texture
@@ -6620,6 +6625,7 @@ render_pass="bump">
local_texture="head_tattoo" />
</layer>
+
</layer_set>
<!-- =========================================================== -->
@@ -8985,7 +8991,7 @@ render_pass="bump">
id="1017" />
<driven
- id="1033" />
+ id="1035" />
<driven
id="914"
@@ -9283,7 +9289,7 @@ render_pass="bump">
wearable="skin"
edit_group="skin_facedetail"
edit_group_order="3"
- name="wrinkles"
+ name="Wrinkles"
label_min="Less"
label_max="More"
value_min="0"
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index d557df3d92..4029bf95a0 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 1
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
@@ -245,7 +246,6 @@ RenderVBOEnable 1 0
list Intel
RenderAnisotropic 1 0
RenderLightingDetail 1 0
-RenderUseImpostors 0 0
list GeForce2
RenderAnisotropic 1 0
@@ -261,51 +261,63 @@ UseOcclusion 0 0
list Intel_830M
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_845G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_855GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_865G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_900
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_915GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_915G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_945G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_950
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_965
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
UseOcclusion 0 0
+RenderUseImpostors 0 0
list Intel_G33
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+RenderUseImpostors 0 0
list Intel_G45
WindLightUseAtmosShaders 0 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 57d712ede7..61a8e51c50 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 1
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 15974c0691..12d47a904c 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 0
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 5c5c4e5b3c..887dab66d1 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -157,7 +157,7 @@ Intel Bear Lake .*Intel.*Bear Lake.* 0 0
Intel Broadwater .*Intel.*Broadwater.* 0 0
Intel Brookdale .*Intel.*Brookdale.* 0 0
Intel Cantiga .*Intel.*Cantiga.* 0 0
-Intel Eaglelake .*Intel.*Eaglelake.* 0 0
+Intel Eaglelake .*Intel.*Eaglelake.* 0 1
Intel Montara .*Intel.*Montara.* 0 0
Intel Springdale .*Intel.*Springdale.* 0 0
Matrox .*Matrox.* 0 0
@@ -192,9 +192,9 @@ NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1
NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
-NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1
-NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 2 1
-NVIDIA GeForce 7900 .*NVIDIA.*GeForce.*79.* 2 1
+NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 3 1
+NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 3 1
+NVIDIA GeForce 7900 .*NVIDIA.*GeForce.*79.* 3 1
NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
@@ -207,8 +207,8 @@ NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
-NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 2 1
-NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1
+NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1
+NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 3 1
NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
NVIDIA GeForce 9400 .*GeForce 94.* 1 1
NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
diff --git a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
index 408a4d4992..495ec37f53 100644
--- a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh
new file mode 100644
index 0000000000..c6b92589db
--- /dev/null
+++ b/indra/newview/installers/darwin/fix_application_icon_position.sh
@@ -0,0 +1,17 @@
+# just run this script each time after you change the installer's name to fix the icon misalignment
+#!/bin/bash
+cp -r ./../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg
+hdid ~/Desktop/TempBuild.dmg
+open -a finder /Volumes/Second\ Life\ Installer
+osascript dmg-cleanup.applescript
+umount /Volumes/Second\ Life\ Installer/
+hdid ~/Desktop/TempBuild.dmg
+open -a finder /Volumes/Second\ Life\ Installer
+#cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store
+#chflags nohidden ~/Desktop/_DS_Store
+#cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store
+#cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store
+#cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store
+#cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store
+#umount /Volumes/Second\ Life\ Installer/
+#rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg
diff --git a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
index b901e46b65..495ec37f53 100644
--- a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store
index 2c179b11a4..495ec37f53 100644
--- a/indra/newview/installers/darwin/release-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/release-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
index 309c8adaaa..495ec37f53 100644
--- a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt
index 23a42f484b..bfefdf3471 100644
--- a/indra/newview/linux_tools/client-readme-voice.txt
+++ b/indra/newview/linux_tools/client-readme-voice.txt
@@ -4,36 +4,31 @@ Second Life - Linux Voice Support README
WHAT IS IT?
-=-=-=-=-=-
-Linux Voice Support is a new feature in testing which allows users
-of the Linux Second Life client to participate in voice-chat with other
-residents and groups inside Second Life, with an appropriate
-headset/microphone.
-
-Linux Voice Support is currently EXPERIMENTAL and is known to still
-have some compatibility issues.
+Linux Voice Support is a feature in testing which allows users of the Linux
+Second Life client to participate in voice-chat with other residents and
+groups inside Second Life, with an appropriate headset/microphone.
REQUIREMENTS
-=-=-=-=-=-=
* A headset/microphone supported by your chosen version of Linux
-* The ALSA sound system (you probably already have this -
- i.e. the alsa-base and alsa-utils packages on Ubuntu)
+* At this time, the PulseAudio audio system is recommended; this software
+ is already part of most modern (2009+) Linux desktop systems. Alternatively,
+ the ALSA audio system may be used on systems installed from around
+ 2007 onwards (again this is likely already installed on your system).
+
+TESTING YOUR SETTINGS
+-=-=-=-=-=-=-=-=-=-=-
-Success with Linux Voice support has been reported on the following
-systems:
-* Ubuntu 6.06 (Dapper) with Intel ICH5/CMI9761A+ audio chipset
-* Ubuntu 6.06 (Dapper) with SigmaTel STAC2997 audio chipset
-* Ubuntu 6.06 (Dapper) with Creative EMU10K1 audio chipset
-* Ubuntu 7.04 (Feisty) with USB Plantronics headset
-* Ubuntu 7.04 (Feisty) with Intel HDA audio chipset
-* Fedora Core 6 with (unknown) audio chipset
-* Ubuntu 8.04 (Hardy) with (unknown) audio chipset
+* The Second Life region 'Voice Echo Canyon' is a great place for testing
+your hardware settings and quality - it will 'echo' your voice back to you
+when you speak.
KNOWN PROBLEMS
-=-=-=-=-=-=-=
-* The 'Input Level' meter in the Voice Chat Device Settings dialog
- does not respond to audio input.
+* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper
+ from 2006) is poor.
TROUBLESHOOTING
-=-=-=-=-=-=-=-
@@ -41,12 +36,11 @@ TROUBLESHOOTING
PROBLEM 1: I don't see a white dot over the head of my avatar or other
Voice-using avatars.
SOLUTION:
-a. Ensure that 'Enable voice chat' is enabled in the Voice Chat
- preferences window and that you are in a voice-enabled area (you
- will see a blue headphone icon in the SL menu-bar).
+a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the
+ Preferences window, and that you are in a voice-enabled area.
b. If the above does not help, exit Second Life and ensure that any
remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar)
- are killed.
+ are killed before restarting.
PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone
except myself listed in the Active Speakers dialog when I'm sure that other
@@ -65,12 +59,13 @@ c. Update to the latest version of ALSA manually. For a guide, see the
PROBLEM 3: I can hear other people, but they cannot hear me.
SOLUTION:
-a. Ensure that you have the 'Talk' button activated while you are trying to
- speak.
+a. Ensure that you have the 'Speak' button (at the bottom of the Second Life
+ window) activated while you are trying to speak.
b. Ensure that your microphone jack is inserted into the correct socket of your
sound card, where appropriate.
-c. Use your system mixer-setting program or the 'alsamixer' program to ensure
- that microphone input is set as the active input source and is not muted.
+c. Use your system mixer-setting program (such as the PulseAudio 'volume
+ control' applet or the ALSA 'alsamixer' program) to ensure that microphone
+ input is set as the active input source and is not muted.
d. Verify that audio input works in other applications, i.e. Audacity
PROBLEM 4: Other people just hear bursts of loud noise when I speak.
diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt
index 07a8f951ee..92d321d8c0 100644
--- a/indra/newview/linux_tools/client-readme.txt
+++ b/indra/newview/linux_tools/client-readme.txt
@@ -55,10 +55,13 @@ Minimum requirements:
is required. If you are running a 64-bit Linux distribution then
you will need its 32-bit compatibility environment installed, but
this configuration is not currently supported.
+ * PulseAudio or ALSA Linux system sound software. A recent PulseAudio
+ is the recommended configuration; see README-linux-voice.txt for more
+ information.
* Video/Graphics Card:
o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the
following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600,
- 8800, Go 7400, Go 7600, Go 7800, Go 7900)
+ 8800, Go 7400, Go 7600, Go 7800, Go 7900, +)
o OR ATI Radeon 8500, 9250, or better
(nVidia cards are recommended for the Linux client)
diff --git a/indra/newview/linux_tools/register_secondlifeprotocol.sh b/indra/newview/linux_tools/register_secondlifeprotocol.sh
index c7b4d55461..16e73cb854 100755
--- a/indra/newview/linux_tools/register_secondlifeprotocol.sh
+++ b/indra/newview/linux_tools/register_secondlifeprotocol.sh
@@ -22,13 +22,12 @@ else
fi
# Register handler for KDE-aware apps
-if [ -z "$KDEHOME" ]; then
- KDEHOME=~/.kde
-fi
-LLKDEPROTDIR=${KDEHOME}/share/services
-if [ -d "$LLKDEPROTDIR" ]; then
- LLKDEPROTFILE=${LLKDEPROTDIR}/secondlife.protocol
- cat > ${LLKDEPROTFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTFILE}
+for LLKDECONFIG in kde-config kde4-config; do
+ if [ `which $LLKDECONFIG` ]; then
+ LLKDEPROTODIR=`$LLKDECONFIG --path services | cut -d ':' -f 1`
+ if [ -d "$LLKDEPROTODIR" ]; then
+ LLKDEPROTOFILE=${LLKDEPROTODIR}/secondlife.protocol
+ cat > ${LLKDEPROTOFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTOFILE}
[Protocol]
exec=${HANDLER} '%u'
protocol=secondlife
@@ -41,6 +40,9 @@ writing=false
makedir=false
deleting=false
EOF
-else
- echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTDIR does not exist.
-fi
+ else
+ echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTODIR does not exist.
+ fi
+ fi
+done
+
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 3209654498..f84102e1fb 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then
fi
fi
-export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"'
+export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
export SL_OPT="`cat etc/gridargs.dat` $@"
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 75a72e5b17..3675be16e9 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -31,81 +31,55 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llagent.h"
-#include "llagentwearables.h"
+
+#include "pipeline.h"
#include "llagentlistener.h"
+#include "llagentwearables.h"
+#include "llagentui.h"
#include "llanimationstates.h"
+#include "llbottomtray.h"
#include "llcallingcard.h"
+#include "llchannelmanager.h"
#include "llconsole.h"
-#include "lldrawable.h"
-#include "llfirstuse.h"
-#include "llfloaterreg.h"
-#include "llspeakers.h"
+//#include "llfirstuse.h"
#include "llfloatercamera.h"
#include "llfloatercustomize.h"
-
-#include "llfloaterland.h"
-#include "llfloatersnapshot.h"
+#include "llfloaterreg.h"
#include "llfloatertools.h"
-#include "llfloaterworldmap.h"
-
#include "llgroupactions.h"
-
-#include "llfocusmgr.h"
#include "llgroupmgr.h"
#include "llhomelocationresponder.h"
-#include "llimview.h"
#include "llhudmanager.h"
#include "lljoystickbutton.h"
-#include "llmenugl.h"
#include "llmorphview.h"
#include "llmoveview.h"
+#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
+#include "llnearbychatbar.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
-#include "llquantize.h"
-#include "llrand.h"
-#include "llregionhandle.h"
#include "llsdutil.h"
-#include "llselectmgr.h"
+#include "llsidetray.h"
#include "llsky.h"
-#include "llslurl.h"
#include "llsmoothstep.h"
-#include "llsidetray.h"
#include "llstatusbar.h"
#include "llteleportflags.h"
-#include "llteleporthistory.h"
#include "lltool.h"
-#include "lltoolcomp.h"
#include "lltoolmgr.h"
-#include "lluictrlfactory.h"
-#include "llurldispatcher.h"
-
-#include "llviewercamera.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
#include "llviewerdisplay.h"
+#include "llviewerjoystick.h"
#include "llviewermediafocus.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerjoystick.h"
-
#include "llvoavatarself.h"
#include "llwindow.h"
#include "llworld.h"
#include "llworldmap.h"
-#include "pipeline.h"
-#include "lltrans.h"
-#include "llbottomtray.h"
-#include "llnearbychatbar.h"
-#include "stringize.h"
-#include "llcapabilitylistener.h"
-
-#include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state
-#include "llagentui.h"
-
using namespace LLVOAvatarDefines;
extern LLMenuBarGL* gMenuBarView;
@@ -540,6 +514,8 @@ void LLAgent::resetView(BOOL reset_camera, BOOL change_camera)
}
setFocusOnAvatar(TRUE, ANIMATE);
+
+ mCameraFOVZoomFactor = 0.f;
}
mHUDTargetZoom = 1.f;
@@ -761,6 +737,10 @@ BOOL LLAgent::canFly()
return parcel->getAllowFly();
}
+BOOL LLAgent::getFlying() const
+{
+ return mControlFlags & AGENT_CONTROL_FLY;
+}
//-----------------------------------------------------------------------------
// setFlying()
@@ -769,7 +749,12 @@ void LLAgent::setFlying(BOOL fly)
{
if (mAvatarObject.notNull())
{
- if(mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != mAvatarObject->mSignaledAnimations.end())
+ // *HACK: Don't allow to start the flying mode if we got ANIM_AGENT_STANDUP signal
+ // because in this case we won't get a signal to start avatar flying animation and
+ // it will be walking with flying mode "ON" indication. However we allow to switch
+ // the flying mode off if we get ANIM_AGENT_STANDUP signal. See process_avatar_animation().
+ // See EXT-2781.
+ if(fly && mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != mAvatarObject->mSignaledAnimations.end())
{
return;
}
@@ -818,7 +803,7 @@ void LLAgent::setFlying(BOOL fly)
// static
void LLAgent::toggleFlying()
{
- BOOL fly = !(gAgent.mControlFlags & AGENT_CONTROL_FLY);
+ BOOL fly = !gAgent.getFlying();
gAgent.setFlying( fly );
gAgent.resetView();
@@ -971,6 +956,7 @@ void LLAgent::sendMessage()
if (!mRegionp)
{
llerrs << "No region for agent yet!" << llendl;
+ return;
}
gMessageSystem->sendMessage(mRegionp->getHost());
}
@@ -2164,6 +2150,7 @@ void LLAgent::setBusy()
{
gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy"));
}
+ LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true);
}
//-----------------------------------------------------------------------------
@@ -2177,6 +2164,7 @@ void LLAgent::clearBusy()
{
gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy"));
}
+ LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false);
}
//-----------------------------------------------------------------------------
@@ -2325,11 +2313,11 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
if (user_cancel && !mAutoPilotBehaviorName.empty())
{
if (mAutoPilotBehaviorName == "Sit")
- LLNotifications::instance().add("CancelledSit");
+ LLNotificationsUtil::add("CancelledSit");
else if (mAutoPilotBehaviorName == "Attach")
- LLNotifications::instance().add("CancelledAttach");
+ LLNotificationsUtil::add("CancelledAttach");
else
- LLNotifications::instance().add("Cancelled");
+ LLNotificationsUtil::add("Cancelled");
}
}
}
@@ -2617,9 +2605,9 @@ void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y)
{
// range from -.5 to .5
F32 x_from_center =
- ((F32) mouse_x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f;
+ ((F32) mouse_x / (F32) gViewerWindow->getWindowWidthScaled() ) - 0.5f;
F32 y_from_center =
- ((F32) mouse_y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f;
+ ((F32) mouse_y / (F32) gViewerWindow->getWindowHeightScaled() ) - 0.5f;
frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
@@ -2818,15 +2806,16 @@ void LLAgent::endAnimationUpdateUI()
LLNavigationBar::getInstance()->setVisible(TRUE);
gStatusBar->setVisibleForMouselook(true);
- LLBottomTray::getInstance()->setVisible(TRUE);
+ LLBottomTray::getInstance()->onMouselookModeOut();
- LLSideTray::getInstance()->setVisible(TRUE);
+ LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE);
+ LLSideTray::getInstance()->updateSidetrayVisibility();
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
- LLFloaterCamera::toPrevModeIfInAvatarViewMode();
+ LLFloaterCamera::onLeavingMouseLook();
// Only pop if we have pushed...
if (TRUE == mViewsPushed)
@@ -2835,7 +2824,11 @@ void LLAgent::endAnimationUpdateUI()
LLFloaterReg::restoreVisibleInstances();
#else // Use this for now
LLFloaterView::skip_list_t skip_list;
- skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+ if (LLFloaterReg::findInstance("mini_map"))
+ {
+ skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+ }
+
gFloaterView->popVisibleAll(skip_list);
#endif
mViewsPushed = FALSE;
@@ -2912,9 +2905,10 @@ void LLAgent::endAnimationUpdateUI()
LLNavigationBar::getInstance()->setVisible(FALSE);
gStatusBar->setVisibleForMouselook(false);
- LLBottomTray::getInstance()->setVisible(FALSE);
+ LLBottomTray::getInstance()->onMouselookModeIn();
- LLSideTray::getInstance()->setVisible(FALSE);
+ LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE);
+ LLSideTray::getInstance()->updateSidetrayVisibility();
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
@@ -2924,10 +2918,6 @@ void LLAgent::endAnimationUpdateUI()
// JC - Added for always chat in third person option
gFocusMgr.setKeyboardFocus(NULL);
- //Making sure Camera Controls floater is in the right state
- //when entering Mouse Look using wheel scrolling
- LLFloaterCamera::updateIfNotInAvatarViewMode();
-
LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset);
mViewsPushed = TRUE;
@@ -3078,10 +3068,6 @@ void LLAgent::updateCamera()
mOrbitLeftKey > 0.f, // right
mOrbitDownKey > 0.f); // bottom
- camera_floater->mZoom->setToggleState(
- mOrbitInKey > 0.f, // top
- mOrbitOutKey > 0.f); // bottom
-
camera_floater->mTrack->setToggleState(
mPanLeftKey > 0.f, // left
mPanUpKey > 0.f, // top
@@ -3434,11 +3420,11 @@ F32 LLAgent::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global )
const LLRect& rect = gFloaterCustomize->getRect();
// Move the camera so that the avatar isn't covered up by this floater.
- F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidth()))));
+ F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidthScaled()))));
F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect(); // radians
F32 offset = tan(apparent_angle);
- if( rect.mLeft < (gViewerWindow->getWindowWidth() - rect.mRight) )
+ if( rect.mLeft < (gViewerWindow->getWindowWidthScaled() - rect.mRight) )
{
// Move the avatar to the right (camera to the left)
ui_offset = offset;
@@ -3601,7 +3587,7 @@ F32 LLAgent::calcCameraFOVZoomFactor()
{
return 0.f;
}
- else if (mFocusObject.notNull() && !mFocusObject->isAvatar())
+ else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar)
{
// don't FOV zoom on mostly transparent objects
LLVector3 focus_offset = mFocusObjectOffset;
@@ -4497,7 +4483,9 @@ void LLAgent::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLV
{
const F64 ANIM_METERS_PER_SECOND = 10.0;
const F64 MIN_ANIM_SECONDS = 0.5;
+ const F64 MAX_ANIM_SECONDS = 10.0;
F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND );
+ anim_duration = llmin( anim_duration, MAX_ANIM_SECONDS );
setAnimationDuration( (F32)anim_duration );
}
@@ -5039,9 +5027,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
}
}
-BOOL LLAgent::isInGroup(const LLUUID& group_id) const
+BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const
{
- if (isGodlike())
+ if (!ignore_god_mode && isGodlike())
return true;
S32 count = mGroups.count();
@@ -5174,6 +5162,11 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO
return FALSE;
}
+BOOL LLAgent::canJoinGroups() const
+{
+ return mGroups.count() < MAX_AGENT_GROUPS;
+}
+
LLQuaternion LLAgent::getHeadRotation()
{
if (mAvatarObject.isNull() || !mAvatarObject->mPelvisp || !mAvatarObject->mHeadp)
@@ -5707,10 +5700,10 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **)
}
// Any control taken? If so, might be first time.
- if (total_count > 0)
- {
- LLFirstUse::useOverrideKeys();
- }
+ //if (total_count > 0)
+ //{
+ //LLFirstUse::useOverrideKeys();
+ //}
}
else
{
@@ -6085,17 +6078,16 @@ void LLAgent::teleportCancel()
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
{
LLViewerRegion* regionp = getRegion();
- LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
+ U64 handle = to_region_handle(pos_global);
+ LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
if(regionp && info)
{
- U32 x_pos;
- U32 y_pos;
- from_region_handle(info->mHandle, &x_pos, &y_pos);
+ LLVector3d region_origin = info->getGlobalOrigin();
LLVector3 pos_local(
- (F32)(pos_global.mdV[VX] - x_pos),
- (F32)(pos_global.mdV[VY] - y_pos),
+ (F32)(pos_global.mdV[VX] - region_origin.mdV[VX]),
+ (F32)(pos_global.mdV[VY] - region_origin.mdV[VY]),
(F32)(pos_global.mdV[VZ]));
- teleportRequest(info->mHandle, pos_local);
+ teleportRequest(handle, pos_local);
}
else if(regionp &&
teleportCore(regionp->getHandle() == to_region_handle_global((F32)pos_global.mdV[VX], (F32)pos_global.mdV[VY])))
@@ -6356,7 +6348,7 @@ void LLAgent::sendAgentSetAppearance()
msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index);
}
msg->nextBlockFast(_PREHASH_ObjectData);
- mAvatarObject->packTEMessage( gMessageSystem );
+ mAvatarObject->sendAppearanceMessage( gMessageSystem );
}
else
{
@@ -6512,3 +6504,4 @@ LLAgentQueryManager::~LLAgentQueryManager()
}
// EOF
+
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 99a9bdd8e6..1573fd7131 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -36,14 +36,13 @@
#include "indra_constants.h"
#include "llevent.h" // LLObservable base class
#include "llagentaccess.h"
-#include "llagentaccess.h"
#include "llagentconstants.h"
-#include "llhudeffectpointat.h" // ELookAtType
-#include "llhudeffectlookat.h" // EPointAtType
-#include "llpointer.h"
+#include "llagentdata.h" // gAgentID, gAgentSessionID
#include "llcharacter.h" // LLAnimPauseRequest
#include "llfollowcam.h" // Ventrella
-#include "llagentdata.h" // gAgentID, gAgentSessionID
+#include "llhudeffectlookat.h" // EPointAtType
+#include "llhudeffectpointat.h" // ELookAtType
+#include "llpointer.h"
#include "lluicolor.h"
#include "llvoavatardefines.h"
@@ -311,7 +310,7 @@ private:
// Fly
//--------------------------------------------------------------------
public:
- BOOL getFlying() const { return mControlFlags & AGENT_CONTROL_FLY; }
+ BOOL getFlying() const;
void setFlying(BOOL fly);
static void toggleFlying();
static bool enableFlying();
@@ -973,6 +972,7 @@ public:
BOOL setGroupContribution(const LLUUID& group_id, S32 contribution);
BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile);
const std::string &getGroupName() const { return mGroupName; }
+ BOOL canJoinGroups() const;
private:
std::string mGroupName;
LLUUID mGroupID;
@@ -982,7 +982,7 @@ private:
//--------------------------------------------------------------------
public:
// Checks against all groups in the entire agent group list.
- BOOL isInGroup(const LLUUID& group_id) const;
+ BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;
protected:
// Only used for building titles.
BOOL isGroupMember() const { return !mGroupID.isNull(); }
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 0f00078b33..b3ed7c353e 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -22,12 +22,20 @@
#include "llviewerregion.h"
LLAgentListener::LLAgentListener(LLAgent &agent)
- : LLDispatchListener("LLAgent", "op"),
+ : LLEventAPI("LLAgent",
+ "LLAgent listener to (e.g.) teleport, sit, stand, etc."),
mAgent(agent)
{
- add("requestTeleport", &LLAgentListener::requestTeleport);
- add("requestSit", &LLAgentListener::requestSit);
- add("requestStand", &LLAgentListener::requestStand);
+ add("requestTeleport",
+ "Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
+ "If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
+ &LLAgentListener::requestTeleport);
+ add("requestSit",
+ "Ask to sit on the object specified in [\"obj_uuid\"]",
+ &LLAgentListener::requestSit);
+ add("requestStand",
+ "Ask to stand up",
+ &LLAgentListener::requestStand);
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
@@ -40,7 +48,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
params.append(event_data["y"]);
params.append(event_data["z"]);
LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true);
- // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "objectim", "parcel", "login", login_refresh", "balance", "chat"
+ // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
// should we just compose LLCommandHandler and LLDispatchListener?
}
else
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 6f0b5a54c5..eed6922b3e 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -13,12 +13,12 @@
#ifndef LL_LLAGENTLISTENER_H
#define LL_LLAGENTLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
class LLAgent;
class LLSD;
-class LLAgentListener : public LLDispatchListener
+class LLAgentListener : public LLEventAPI
{
public:
LLAgentListener(LLAgent &agent);
diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp
index 6e5835bace..3c8d0dac42 100644
--- a/indra/newview/llagentpicksinfo.cpp
+++ b/indra/newview/llagentpicksinfo.cpp
@@ -47,7 +47,8 @@ public:
~LLAgentPicksObserver()
{
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
+ if (LLAvatarPropertiesProcessor::instanceExists())
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
}
void sendAgentPicksRequest()
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 09f7c49f23..72ab9235cf 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
//static
BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius)
{
- return (gAgent.getPositionAgent() - pole).length() < radius;
+ F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX];
+ F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY];
+
+ return sqrt( delta_x* delta_x + delta_y* delta_y ) < radius;
}
BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region)
{
@@ -127,6 +130,7 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
// create a default name and description for the landmark
std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
std::string region_name = region->getName();
+ std::string sim_access_string = region->getSimAccessString();
std::string buffer;
if( parcel_name.empty() )
{
@@ -139,12 +143,24 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
case LOCATION_FORMAT_NORMAL:
buffer = llformat("%s", region_name.c_str());
break;
- case LOCATION_FORMAT_WITHOUT_SIM:
- case LOCATION_FORMAT_FULL:
+ case LOCATION_FORMAT_NO_COORDS:
+ buffer = llformat("%s%s%s",
+ region_name.c_str(),
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
+ case LOCATION_FORMAT_NO_MATURITY:
buffer = llformat("%s (%d, %d, %d)",
region_name.c_str(),
pos_x, pos_y, pos_z);
break;
+ case LOCATION_FORMAT_FULL:
+ buffer = llformat("%s (%d, %d, %d)%s%s",
+ region_name.c_str(),
+ pos_x, pos_y, pos_z,
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
}
}
else
@@ -156,19 +172,25 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
buffer = llformat("%.100s", parcel_name.c_str());
break;
case LOCATION_FORMAT_NORMAL:
- buffer = llformat("%s, %s", region_name.c_str(), parcel_name.c_str());
+ buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str());
break;
- case LOCATION_FORMAT_WITHOUT_SIM:
+ case LOCATION_FORMAT_NO_MATURITY:
buffer = llformat("%s, %s (%d, %d, %d)",
- region_name.c_str(),
parcel_name.c_str(),
+ region_name.c_str(),
pos_x, pos_y, pos_z);
break;
+ case LOCATION_FORMAT_NO_COORDS:
+ buffer = llformat("%s, %s%s%s",
+ parcel_name.c_str(),
+ region_name.c_str(),
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
case LOCATION_FORMAT_FULL:
- std::string sim_access_string = region->getSimAccessString();
buffer = llformat("%s, %s (%d, %d, %d)%s%s",
- region_name.c_str(),
parcel_name.c_str(),
+ region_name.c_str(),
pos_x, pos_y, pos_z,
sim_access_string.empty() ? "" : " - ",
sim_access_string.c_str());
diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h
index c7aafb71e7..3478793e38 100644
--- a/indra/newview/llagentui.h
+++ b/indra/newview/llagentui.h
@@ -38,10 +38,11 @@ class LLAgentUI
public:
enum ELocationFormat
{
- LOCATION_FORMAT_NORMAL,
- LOCATION_FORMAT_LANDMARK,
- LOCATION_FORMAT_WITHOUT_SIM,
- LOCATION_FORMAT_FULL,
+ LOCATION_FORMAT_NORMAL, // Parcel
+ LOCATION_FORMAT_LANDMARK, // Parcel, Region
+ LOCATION_FORMAT_NO_MATURITY, // Parcel, Region (x, y, z)
+ LOCATION_FORMAT_NO_COORDS, // Parcel, Region - Maturity
+ LOCATION_FORMAT_FULL, // Parcel, Region (x, y, z) - Maturity
};
static void buildName(std::string& name);
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 380469f5b3..f4bc35002b 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -35,11 +35,12 @@
#include "llagent.h"
#include "llagentwearables.h"
+#include "llcallbacklist.h"
#include "llfloatercustomize.h"
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
-#include "llnotify.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llnotificationsutil.h"
#include "llviewerregion.h"
#include "llvoavatarself.h"
#include "llwearable.h"
@@ -47,6 +48,10 @@
#include "llgesturemgr.h"
#include "llappearancemgr.h"
#include "lltexlayer.h"
+#include "llsidetray.h"
+#include "llpaneloutfitsinventory.h"
+#include "llfolderview.h"
+#include "llaccordionctrltab.h"
#include <boost/scoped_ptr.hpp>
@@ -60,7 +65,7 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
{
public:
LLInitialWearablesFetch() {}
- ~LLInitialWearablesFetch() {}
+ ~LLInitialWearablesFetch();
virtual void done();
struct InitialWearableData
@@ -81,6 +86,47 @@ public:
protected:
void processWearablesMessage();
+ void processContents();
+};
+
+class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+ enum ELibraryOutfitFetchStep {
+ LOFS_FOLDER = 0,
+ LOFS_OUTFITS,
+ LOFS_LIBRARY,
+ LOFS_IMPORTED,
+ LOFS_CONTENTS
+ };
+ LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false)
+ {
+ mMyOutfitsID = LLUUID::null;
+ mClothingID = LLUUID::null;
+ mLibraryClothingID = LLUUID::null;
+ mImportedClothingID = LLUUID::null;
+ mImportedClothingName = "Imported Library Clothing";
+ }
+ ~LLLibraryOutfitsFetch() {}
+ virtual void done();
+ void doneIdle();
+ LLUUID mMyOutfitsID;
+ void importedFolderFetch();
+protected:
+ void folderDone(void);
+ void outfitsDone(void);
+ void libraryDone(void);
+ void importedFolderDone(void);
+ void contentsDone(void);
+ enum ELibraryOutfitFetchStep mCurrFetchStep;
+ typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t;
+ cloth_folder_vec_t mLibraryClothingFolders;
+ cloth_folder_vec_t mImportedClothingFolders;
+ bool mOutfitsPopulated;
+ LLUUID mClothingID;
+ LLUUID mLibraryClothingID;
+ LLUUID mImportedClothingID;
+ std::string mImportedClothingName;
};
LLAgentWearables gAgentWearables;
@@ -89,6 +135,39 @@ BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
using namespace LLVOAvatarDefines;
+// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
+// Some db items are corrupted, have inventory flags = 0, implying wearable type = shape, even though
+// wearable type stored in asset is some other value.
+// Calling this function whenever a wearable is added to increase visibility if this problem
+// turns up in other inventories.
+void checkWearableAgainstInventory(LLWearable *wearable)
+{
+ if (wearable->getItemID().isNull())
+ return;
+
+ // Check for wearable type consistent with inventory item wearable type.
+ LLViewerInventoryItem *item = gInventory.getItem(wearable->getItemID());
+ if (item)
+ {
+ if (!item->isWearableType())
+ {
+ llwarns << "wearable associated with non-wearable item" << llendl;
+ }
+ if (item->getWearableType() != wearable->getType())
+ {
+ llwarns << "type mismatch: wearable " << wearable->getName()
+ << " has type " << wearable->getType()
+ << " but inventory item " << item->getName()
+ << " has type " << item->getWearableType() << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "wearable inventory item not found" << wearable->getName()
+ << " itemID " << wearable->getItemID().asString() << llendl;
+ }
+}
+
void LLAgentWearables::dump()
{
llinfos << "LLAgentWearablesDump" << llendl;
@@ -220,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
{
gAgentWearables.makeNewOutfitDone(mType, mIndex);
}
+ if (mTodo & CALL_WEARITEM)
+ {
+ LLAppearanceManager::instance().addCOFItemLink(inv_item, true);
+ }
}
void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
@@ -231,21 +314,24 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
return;
LLUUID old_item_id = getWearableItemID((EWearableType)type,index);
+
if (wearable)
{
wearable->setItemID(item_id);
- }
- if (old_item_id.notNull())
- {
- gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
- setWearable((EWearableType)type,index,wearable);
- }
- else
- {
- pushWearable((EWearableType)type,wearable);
+ if (old_item_id.notNull())
+ {
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
+ setWearable((EWearableType)type,index,wearable);
+ }
+ else
+ {
+ pushWearable((EWearableType)type,wearable);
+ }
}
+
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (item && wearable)
{
@@ -385,7 +471,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
return;
}
- gAgent.getAvatarObject()->wearableUpdated( type );
+ gAgent.getAvatarObject()->wearableUpdated( type, TRUE );
if (send_update)
{
@@ -428,12 +514,12 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
type,
index,
new_wearable,
- addWearableToAgentInventoryCallback::CALL_UPDATE);
+ addWearableToAgentInventoryCallback::CALL_WEARITEM);
LLUUID category_id;
if (save_in_lost_and_found)
{
category_id = gInventory.findCategoryUUIDForType(
- LLAssetType::AT_LOST_AND_FOUND);
+ LLFolderType::FT_LOST_AND_FOUND);
}
else
{
@@ -630,11 +716,14 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)
{
- if (!getWearable(type,index))
+
+ LLWearable *old_wearable = getWearable(type,index);
+ if (!old_wearable)
{
pushWearable(type,wearable);
return;
}
+
wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
{
@@ -649,7 +738,9 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
else
{
wearable_vec[index] = wearable;
- mAvatarObject->wearableUpdated(wearable->getType());
+ old_wearable->setLabelUpdated();
+ wearableUpdated(wearable);
+ checkWearableAgainstInventory(wearable);
}
}
@@ -664,12 +755,36 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
if (type < WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE)
{
mWearableDatas[type].push_back(wearable);
- mAvatarObject->wearableUpdated(wearable->getType());
+ wearableUpdated(wearable);
+ checkWearableAgainstInventory(wearable);
return mWearableDatas[type].size()-1;
}
return MAX_WEARABLES_PER_TYPE;
}
+void LLAgentWearables::wearableUpdated(LLWearable *wearable)
+{
+ mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ wearable->refreshName();
+ wearable->setLabelUpdated();
+
+ wearable->pullCrossWearableValues();
+
+ // Hack pt 2. If the wearable we just loaded has definition version 24,
+ // then force a re-save of this wearable after slamming the version number to 22.
+ // This number was incorrectly incremented for internal builds before release, and
+ // this fix will ensure that the affected wearables are re-saved with the right version number.
+ // the versions themselves are compatible. This code can be removed before release.
+ if( wearable->getDefinitionVersion() == 24 )
+ {
+ wearable->setDefinitionVersion(22);
+ U32 index = getWearableIndex(wearable);
+ llinfos << "forcing werable type " << wearable->getType() << " to version 22 from 24" << llendl;
+ saveWearable(wearable->getType(),index,TRUE);
+ }
+
+}
+
void LLAgentWearables::popWearable(LLWearable *wearable)
{
if (wearable == NULL)
@@ -693,7 +808,8 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index)
if (wearable)
{
mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
- mAvatarObject->wearableUpdated(wearable->getType());
+ mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ wearable->setLabelUpdated();
}
}
@@ -829,17 +945,20 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
{
gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum);
+ const S32 NUM_BODY_PARTS = 4;
S32 num_wearables = gMessageSystem->getNumberOfBlocksFast(_PREHASH_WearableData);
- if (num_wearables < 4)
+ if (num_wearables < NUM_BODY_PARTS)
{
// Transitional state. Avatars should always have at least their body parts (hair, eyes, shape and skin).
- // The fact that they don't have any here (only a dummy is sent) implies that this account existed
- // before we had wearables, or that the database has gotten messed up.
+ // The fact that they don't have any here (only a dummy is sent) implies that either:
+ // 1. This account existed before we had wearables
+ // 2. The database has gotten messed up
+ // 3. This is the account's first login (i.e. the wearables haven't been generated yet).
return;
}
// Get the UUID of the current outfit folder (will be created if it doesn't exist)
- LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+ const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch();
@@ -886,9 +1005,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
lldebugs << " " << LLWearableDictionary::getTypeLabel(type) << llendl;
}
- // What we do here is get the complete information on the items in
- // the inventory, and set up an observer that will wait for that to
- // happen.
+ // Get the complete information on the items in the inventory and set up an observer
+ // that will trigger when the complete information is fetched.
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
folders.push_back(current_outfit_id);
outfit->fetchDescendents(folders);
@@ -903,6 +1021,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
// will call done for us when everything is here.
gInventory.addObserver(outfit);
}
+
}
}
@@ -969,7 +1088,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*
void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 index)
{
// Try to recover by replacing missing wearable with a new one.
- LLNotifications::instance().add("ReplacedMissingWearable");
+ LLNotificationsUtil::add("ReplacedMissingWearable");
lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl;
LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type);
@@ -980,8 +1099,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde
// Add a new one in the lost and found folder.
// (We used to overwrite the "not found" one, but that could potentially
// destory content.) JC
- LLUUID lost_and_found_id =
- gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
@@ -1014,8 +1132,9 @@ void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type,
if (!wearable)
{
llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl;
+ return;
}
- LLLocalTextureObject* lto = new LLLocalTextureObject();
+ LLLocalTextureObject lto;
wearable->setLocalTextureObject(texture_type, lto);
}
@@ -1122,8 +1241,8 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
// First, make a folder in the Clothes directory.
LLUUID folder_id = gInventory.createNewCategory(
- gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING),
- LLAssetType::AT_NONE,
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING),
+ LLFolderType::FT_NONE,
new_folder_name);
bool found_first_item = false;
@@ -1175,25 +1294,29 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
j,
new_wearable,
todo);
- if (isWearableCopyable((EWearableType)type, j))
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
- }
- else
+ llassert(item);
+ if (item)
{
- move_inventory_item(
- gAgent.getID(),
- gAgent.getSessionID(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
+ if (isWearableCopyable((EWearableType)type, j))
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
+ else
+ {
+ move_inventory_item(
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
}
}
}
@@ -1248,6 +1371,43 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
}
}
+class LLShowCreatedOutfit: public LLInventoryCallback
+{
+public:
+ LLShowCreatedOutfit(LLUUID& folder_id):
+ mFolderID(folder_id)
+ {
+ }
+
+ virtual ~LLShowCreatedOutfit()
+ {
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (outfit_panel)
+ {
+ outfit_panel->getRootFolder()->clearSelection();
+ outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
+ }
+ LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0;
+ if (tab_outfits && !tab_outfits->getDisplayChildren())
+ {
+ tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());
+ }
+
+ LLAppearanceManager::instance().updateIsDirty();
+ LLAppearanceManager::instance().updatePanelOutfitName("");
+ }
+
+ virtual void fire(const LLUUID&)
+ {
+ }
+
+private:
+ LLUUID mFolderID;
+};
+
LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
{
if (mAvatarObject.isNull())
@@ -1256,22 +1416,15 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
}
// First, make a folder in the My Outfits directory.
- LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS);
+ const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
LLUUID folder_id = gInventory.createNewCategory(
parent_id,
- LLAssetType::AT_OUTFIT,
+ LLFolderType::FT_OUTFIT,
new_folder_name);
- LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL);
-
-#if 0 // BAP - fix to go into rename state automatically after outfit is created.
- LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id);
- if (parent_category)
- {
- parent_category->setSelectionByID(folder_id,TRUE);
- parent_category->setNeedsAutoRename(TRUE);
- }
-#endif
+ LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
+ LLAppearanceManager::instance().shallowCopyCategoryContents(LLAppearanceManager::instance().getCOF(),folder_id, cb);
+ LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb);
return folder_id;
}
@@ -1282,10 +1435,10 @@ void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)
// Open the inventory and select the first item we added.
if (first_item_id.notNull())
{
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if (view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(first_item_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(first_item_id, TAKE_FOCUS_NO);
}
}
}
@@ -1339,7 +1492,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
LLSD payload;
payload["wearable_type"] = (S32)type;
// Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotifications::instance().add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);
+ LLNotificationsUtil::add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);
return;
}
else
@@ -1356,7 +1509,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
// static
bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
EWearableType type = (EWearableType)notification["payload"]["wearable_type"].asInteger();
switch(option)
{
@@ -1389,13 +1542,10 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
for (S32 i=max_entry; i>=0; i--)
{
LLWearable* old_wearable = getWearable(type,i);
- const LLUUID &item_id = getWearableItemID(type,i);
- popWearable(type,i);
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-
//queryWearableCache(); // moved below
if (old_wearable)
{
+ popWearable(old_wearable);
old_wearable->removeFromAvatar(TRUE);
}
}
@@ -1404,15 +1554,11 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
else
{
LLWearable* old_wearable = getWearable(type, index);
-
- const LLUUID &item_id = getWearableItemID(type,index);
- popWearable(type, index);
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-
//queryWearableCache(); // moved below
if (old_wearable)
{
+ popWearable(old_wearable);
old_wearable->removeFromAvatar(TRUE);
}
}
@@ -1459,33 +1605,35 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* new_wearable = wearables[i];
LLPointer<LLInventoryItem> new_item = items[i];
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
-
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ llassert(new_wearable);
+ if (new_wearable)
{
- const LLUUID& old_item_id = getWearableItemID(type, 0);
- if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
- (old_item_id == new_item->getUUID()))
- {
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
- continue;
- }
+ const EWearableType type = new_wearable->getType();
+ wearables_to_remove[type] = FALSE;
- gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
+ // MULTI_WEARABLE: using 0th
+ LLWearable* old_wearable = getWearable(type, 0);
+ if (old_wearable)
{
- llassert(0);
- continue;
+ const LLUUID& old_item_id = getWearableItemID(type, 0);
+ if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
+ (old_item_id == new_item->getUUID()))
+ {
+ lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
+ continue;
+ }
+
+ // Assumes existing wearables are not dirty.
+ if (old_wearable->isDirty())
+ {
+ llassert(0);
+ continue;
+ }
}
- }
- setWearable(type,0,new_wearable);
- if (new_wearable)
new_wearable->setItemID(new_item->getUUID());
+ setWearable(type,0,new_wearable);
+ }
}
std::vector<LLWearable*> wearables_being_removed;
@@ -1508,7 +1656,6 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
gInventory.notifyObservers();
- queryWearableCache();
std::vector<LLWearable*>::iterator wearable_iter;
@@ -1526,11 +1673,13 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
if (mAvatarObject)
{
mAvatarObject->updateVisualParams();
+ mAvatarObject->invalidateAll();
}
// Start rendering & update the server
mWearablesLoaded = TRUE;
checkWearablesLoaded();
+ queryWearableCache();
updateServer();
lldebugs << "setWearableOutfit() end" << llendl;
@@ -1569,7 +1718,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
// Bring up modal dialog: Save changes? Yes, No, Cancel
LLSD payload;
payload["item_id"] = new_item->getUUID();
- LLNotifications::instance().add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable));
+ LLNotificationsUtil::add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable));
return;
}
}
@@ -1581,7 +1730,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
// static
bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
if (!new_item)
{
@@ -1625,6 +1774,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n
mWearableDatas[type].push_back(new_wearable);
llinfos << "Added additional wearable for type " << type
<< " size is now " << mWearableDatas[type].size() << llendl;
+ checkWearableAgainstInventory(new_wearable);
}
else
{
@@ -1721,10 +1871,8 @@ void LLAgentWearables::queryWearableCache()
// MULTI_WEARABLE: need a way to specify by wearable rather than by type.
// User has picked "remove from avatar" from a menu.
// static
-void LLAgentWearables::userRemoveWearable(void* userdata)
+void LLAgentWearables::userRemoveWearable(EWearableType& type)
{
- EWearableType type = (EWearableType)(intptr_t)userdata;
-
if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR)) //&&
//!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT)))
{
@@ -1734,7 +1882,7 @@ void LLAgentWearables::userRemoveWearable(void* userdata)
}
// static
-void LLAgentWearables::userRemoveAllClothes(void* userdata)
+void LLAgentWearables::userRemoveAllClothes()
{
// We have to do this up front to avoid having to deal with the case of multiple wearables being dirty.
if (gFloaterCustomize)
@@ -1985,14 +2133,14 @@ bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const
return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES))
&& (getWearableCount(type) <= 1) );
}
-void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL set_by_user)
+void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)
{
for( S32 type = 0; type < WT_COUNT; ++type )
{
for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count)
{
LLWearable *wearable = getWearable((EWearableType)type,count);
- wearable->animateParams(delta, set_by_user);
+ wearable->animateParams(delta, upload_bake);
}
}
}
@@ -2003,34 +2151,375 @@ void LLAgentWearables::updateServer()
gAgent.sendAgentSetAppearance();
}
+void LLAgentWearables::populateMyOutfitsFolder(void)
+{
+ llinfos << "starting outfit populate" << llendl;
+
+ LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
+
+ // Get the complete information on the items in the inventory and
+ // setup an observer that will wait for that to happen.
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ outfits->mMyOutfitsID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ folders.push_back(outfits->mMyOutfitsID);
+ gInventory.addObserver(outfits);
+ outfits->fetchDescendents(folders);
+ if (outfits->isEverythingComplete())
+ {
+ outfits->done();
+ }
+}
+
+void LLLibraryOutfitsFetch::done()
+{
+ // Delay this until idle() routine, since it's a heavy operation and
+ // we also can't have it run within notifyObservers.
+ doOnIdle(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this));
+ gInventory.removeObserver(this); // Prevent doOnIdle from being added twice.
+}
+
+void LLLibraryOutfitsFetch::doneIdle()
+{
+ gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
+
+ switch (mCurrFetchStep)
+ {
+ case LOFS_FOLDER:
+ folderDone();
+ mCurrFetchStep = LOFS_OUTFITS;
+ break;
+ case LOFS_OUTFITS:
+ outfitsDone();
+ mCurrFetchStep = LOFS_LIBRARY;
+ break;
+ case LOFS_LIBRARY:
+ libraryDone();
+ mCurrFetchStep = LOFS_IMPORTED;
+ break;
+ case LOFS_IMPORTED:
+ importedFolderDone();
+ mCurrFetchStep = LOFS_CONTENTS;
+ break;
+ case LOFS_CONTENTS:
+ contentsDone();
+ break;
+ default:
+ llwarns << "Got invalid state for outfit fetch: " << mCurrFetchStep << llendl;
+ mOutfitsPopulated = TRUE;
+ break;
+ }
+
+ // We're completely done. Cleanup.
+ if (mOutfitsPopulated)
+ {
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+}
+
+void LLLibraryOutfitsFetch::folderDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ // Early out if we already have items in My Outfits.
+ if (cat_array.count() > 0 || wearable_array.count() > 0)
+ {
+ mOutfitsPopulated = true;
+ return;
+ }
+
+ mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
+ mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+
+ mCompleteFolders.clear();
+
+ // Get the complete information on the items in the inventory.
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(mClothingID);
+ folders.push_back(mLibraryClothingID);
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::outfitsDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+
+ // Collect the contents of the Library's Clothing folder
+ gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ llassert(cat_array.count() > 0);
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits.
+ if (cat->getName() != "More Outfits" && cat->getName() != "Ruth")
+ {
+ // Get the name of every outfit in the library
+ folders.push_back(cat->getUUID());
+ mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+ }
+ }
+
+ // Collect the contents of your Inventory Clothing folder
+ cat_array.clear();
+ wearable_array.clear();
+ gInventory.collectDescendents(mClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ // Check if you already have an "Imported Library Clothing" folder
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+ if (cat->getName() == mImportedClothingName)
+ {
+ mImportedClothingID = cat->getUUID();
+ }
+ }
+
+ mCompleteFolders.clear();
+
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+{
+public:
+ LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher):
+ mFireCount(0), mLibraryOutfitsFetcher(fetcher)
+ {
+ }
+
+ virtual ~LLLibraryOutfitsCopyDone()
+ {
+ if (!LLApp::isExiting() && mLibraryOutfitsFetcher)
+ {
+ gInventory.addObserver(mLibraryOutfitsFetcher);
+ mLibraryOutfitsFetcher->done();
+ }
+ }
+
+ /* virtual */ void fire(const LLUUID& inv_item)
+ {
+ mFireCount++;
+ }
+private:
+ U32 mFireCount;
+ LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;
+};
+
+void LLLibraryOutfitsFetch::libraryDone(void)
+{
+ // Copy the clothing folders from the library into the imported clothing folder if necessary.
+ if (mImportedClothingID == LLUUID::null)
+ {
+ gInventory.removeObserver(this);
+ LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this);
+ mImportedClothingID = gInventory.createNewCategory(mClothingID,
+ LLFolderType::FT_NONE,
+ mImportedClothingName);
+
+ for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin();
+ iter != mLibraryClothingFolders.end();
+ ++iter)
+ {
+ LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
+ LLFolderType::FT_NONE,
+ iter->second);
+ LLAppearanceManager::getInstance()->shallowCopyCategoryContents(iter->first, folder_id, copy_waiter);
+ }
+ }
+ else
+ {
+ // Skip straight to fetching the contents of the imported folder
+ importedFolderFetch();
+ }
+}
+
+void LLLibraryOutfitsFetch::importedFolderFetch(void)
+{
+ // Fetch the contents of the Imported Clothing Folder
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(mImportedClothingID);
+
+ mCompleteFolders.clear();
+
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::importedFolderDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+
+ // Collect the contents of the Imported Clothing folder
+ gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the name of every imported outfit
+ folders.push_back(cat->getUUID());
+ mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+ }
+
+ mCompleteFolders.clear();
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::contentsDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+
+ for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();
+ folder_iter != mImportedClothingFolders.end();
+ ++folder_iter)
+ {
+ // First, make a folder in the My Outfits directory.
+ LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second);
+
+ cat_array.clear();
+ wearable_array.clear();
+ // Collect the contents of each imported clothing folder, so we can create new outfit links for it
+ gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin();
+ wearable_iter != wearable_array.end();
+ ++wearable_iter)
+ {
+ const LLViewerInventoryItem *item = wearable_iter->get();
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ new_outfit_folder_id,
+ item->getName(),
+ LLAssetType::AT_LINK,
+ NULL);
+ }
+ }
+
+ mOutfitsPopulated = true;
+}
+
+//--------------------------------------------------------------------
+// InitialWearablesFetch
+//
+// This grabs contents from the COF and processes them.
+// The processing is handled in idle(), i.e. outside of done(),
+// to avoid gInventory.notifyObservers recursion.
+//--------------------------------------------------------------------
+
+LLInitialWearablesFetch::~LLInitialWearablesFetch()
+{
+}
+
+// virtual
void LLInitialWearablesFetch::done()
{
- // No longer need this observer hanging around.
+ // Delay processing the actual results of this so it's not handled within
+ // gInventory.notifyObservers. The results will be handled in the next
+ // idle tick instead.
gInventory.removeObserver(this);
+ doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this));
+}
+void LLInitialWearablesFetch::processContents()
+{
// Fetch the wearable items from the Current Outfit Folder
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
LLFindWearables is_wearable;
gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array,
LLInventoryModel::EXCLUDE_TRASH, is_wearable);
-
+
+ LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
if (wearable_array.count() > 0)
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
}
else
{
+ // if we're constructing the COF from the wearables message, we don't have a proper outfit link
+ LLAppearanceManager::instance().setOutfitDirty(true);
processWearablesMessage();
}
delete this;
}
+class LLFetchAndLinkObserver: public LLInventoryFetchObserver
+{
+public:
+ LLFetchAndLinkObserver(LLInventoryFetchObserver::item_ref_t& ids):
+ m_ids(ids),
+ LLInventoryFetchObserver(true)
+ {
+ }
+ ~LLFetchAndLinkObserver()
+ {
+ }
+ virtual void done()
+ {
+ gInventory.removeObserver(this);
+ // Link to all fetched items in COF.
+ for (LLInventoryFetchObserver::item_ref_t::iterator it = m_ids.begin();
+ it != m_ids.end();
+ ++it)
+ {
+ LLUUID id = *it;
+ LLViewerInventoryItem *item = gInventory.getItem(*it);
+ if (!item)
+ {
+ llwarns << "fetch failed!" << llendl;
+ continue;
+ }
+ link_inventory_item(gAgent.getID(), item->getLinkedUUID(), LLAppearanceManager::instance().getCOF(), item->getName(),
+ LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
+ }
+ }
+private:
+ LLInventoryFetchObserver::item_ref_t m_ids;
+};
+
void LLInitialWearablesFetch::processWearablesMessage()
{
if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead.
{
- LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+ const LLUUID current_outfit_id = LLAppearanceManager::instance().getCOF();
+ LLInventoryFetchObserver::item_ref_t ids;
for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
{
// Populate the current outfit folder with links to the wearables passed in the message
@@ -2039,9 +2528,7 @@ void LLInitialWearablesFetch::processWearablesMessage()
if (wearable_data->mAssetID.notNull())
{
#ifdef USE_CURRENT_OUTFIT_FOLDER
- const std::string link_name = "WearableLink"; // Unimportant what this is named, it isn't exposed.
- link_inventory_item(gAgent.getID(), wearable_data->mItemID, current_outfit_id, link_name,
- LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
+ ids.push_back(wearable_data->mItemID);
#endif
// Fetch the wearables
LLWearableList::instance().getAsset(wearable_data->mAssetID,
@@ -2053,8 +2540,45 @@ void LLInitialWearablesFetch::processWearablesMessage()
{
llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID "
<< wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl;
+ delete wearable_data;
+ }
+ }
+
+ // Add all current attachments to the requested items as well.
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+ if( avatar )
+ {
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin();
+ iter != avatar->mAttachmentPoints.end(); ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+ if (!attachment) continue;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+ if (!attached_object) continue;
+ const LLUUID& item_id = attached_object->getItemID();
+ if (item_id.isNull()) continue;
+ ids.push_back(item_id);
+ }
}
}
+
+ // Need to fetch the inventory items for ids, then create links to them after they arrive.
+ LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids);
+ fetcher->fetchItems(ids);
+ // If no items to be fetched, done will never be triggered.
+ // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
+ if (fetcher->isEverythingComplete())
+ {
+ fetcher->done();
+ }
+ else
+ {
+ gInventory.addObserver(fetcher);
+ }
}
else
{
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 97de785c87..858540a5f5 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -80,7 +80,7 @@ public:
// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.
bool canWearableBeRemoved(const LLWearable* wearable) const;
- void animateAllWearableParams(F32 delta, BOOL set_by_user);
+ void animateAllWearableParams(F32 delta, BOOL upload_bake);
//--------------------------------------------------------------------
// Accessors
@@ -107,6 +107,7 @@ private:
// Low-level data structure setter - public access is via setWearableItem, etc.
void setWearable(const EWearableType type, U32 index, LLWearable *wearable);
U32 pushWearable(const EWearableType type, LLWearable *wearable);
+ void wearableUpdated(LLWearable *wearable);
void popWearable(LLWearable *wearable);
void popWearable(const EWearableType type, U32 index);
@@ -169,9 +170,11 @@ public:
const LLDynamicArray<S32>& attachments_to_include,
BOOL rename_clothing);
- // Note: wearables_to_include should be a list of EWearableType types
- // attachments_to_include should be a list of attachment points
LLUUID makeNewOutfitLinks(const std::string& new_folder_name);
+
+ // Should only be called if we *know* we've never done so before, since users may
+ // not want the Library outfits to stay in their quick outfit selector and can delete them.
+ void populateMyOutfitsFolder(void);
private:
void makeNewOutfitDone(S32 type, U32 index);
@@ -191,9 +194,9 @@ public:
//--------------------------------------------------------------------
public:
// MULTI-WEARABLE: assuming one wearable per type. Need upstream changes.
- static void userRemoveWearable(void* userdata); // userdata is EWearableType
- static void userRemoveAllClothes(void* userdata); // userdata is NULL
-
+ static void userRemoveWearable(EWearableType& type);
+ static void userRemoveAllClothes();
+
typedef std::vector<LLViewerObject*> llvo_vec_t;
static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);
@@ -241,7 +244,8 @@ private:
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
- CALL_MAKENEWOUTFITDONE = 8
+ CALL_MAKENEWOUTFITDONE = 8,
+ CALL_WEARITEM = 16
};
// MULTI-WEARABLE: index is an EWearableType - more confusing usage.
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4e022aeb29..eb4a47664b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,18 +32,63 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
+#include "llagentwearables.h"
#include "llappearancemgr.h"
-#include "llinventorymodel.h"
-#include "llnotifications.h"
+#include "llcommandhandler.h"
+#include "llfloatercustomize.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
-#include "llwearablelist.h"
-#include "llagentwearables.h"
-#include "llagent.h"
+#include "llinventoryobserver.h"
+#include "llnotificationsutil.h"
+#include "llsidepanelappearance.h"
+#include "llsidetray.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "llviewerregion.h"
-#include "llfloatercustomize.h"
+#include "llwearablelist.h"
+
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLNameCategoryCollector has_name(name);
+ gInventory.collectDescendentsIf(parent_id,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ has_name);
+ if (0 == cat_array.count())
+ return LLUUID();
+ else
+ {
+ LLViewerInventoryCategory *cat = cat_array.get(0);
+ if (cat)
+ return cat->getUUID();
+ else
+ {
+ llwarns << "null cat" << llendl;
+ return LLUUID();
+ }
+ }
+}
+
+// support for secondlife:///app/appearance SLapps
+class LLAppearanceHandler : public LLCommandHandler
+{
+public:
+ // requests will be throttled from a non-trusted browser
+ LLAppearanceHandler() : LLCommandHandler("appearance", UNTRUSTED_THROTTLE) {}
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // support secondlife:///app/appearance/show, but for now we just
+ // make all secondlife:///app/appearance SLapps behave this way
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
+ return true;
+ }
+};
+LLAppearanceHandler gAppearanceHandler;
class LLWearInventoryCategoryCallback : public LLInventoryCallback
{
@@ -68,11 +113,13 @@ public:
protected:
~LLWearInventoryCategoryCallback()
{
+ llinfos << "done all inventory callbacks" << llendl;
+
// Is the destructor called by ordinary dereference, or because the app's shutting down?
// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
if( LLInventoryCallbackManager::is_instantiated() )
{
- LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+ LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
}
else
{
@@ -94,7 +141,8 @@ public:
mAppend(append)
{}
~LLOutfitObserver() {}
- virtual void done(); //public
+ virtual void done();
+ void doWearCategory();
protected:
LLUUID mCatID;
@@ -104,6 +152,15 @@ protected:
void LLOutfitObserver::done()
{
+ llinfos << "done 2nd stage fetch" << llendl;
+ gInventory.removeObserver(this);
+ doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
+}
+
+void LLOutfitObserver::doWearCategory()
+{
+ llinfos << "starting" << llendl;
+
// We now have an outfit ready to be copied to agent inventory. Do
// it, and wear that outfit normally.
if(mCopyItems)
@@ -130,11 +187,11 @@ void LLOutfitObserver::done()
{
if(LLInventoryType::IT_GESTURE == item->getInventoryType())
{
- pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE);
+ pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
}
else
{
- pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+ pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
}
break;
}
@@ -146,7 +203,7 @@ void LLOutfitObserver::done()
LLUUID cat_id = gInventory.createNewCategory(
pid,
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
name);
mCatID = cat_id;
LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend);
@@ -171,8 +228,9 @@ void LLOutfitObserver::done()
else
{
// Wear the inventory category.
- LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+ LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
}
+ delete this;
}
class LLOutfitFetch : public LLInventoryFetchDescendentsObserver
@@ -191,6 +249,8 @@ void LLOutfitFetch::done()
// What we do here is get the complete information on the items in
// the library, and set up an observer that will wait for that to
// happen.
+ llinfos << "done first stage fetch" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
gInventory.collectDescendents(mCompleteFolders.front(),
@@ -220,7 +280,6 @@ void LLOutfitFetch::done()
// loop.
//dec_busy_count();
gInventory.removeObserver(this);
- delete this;
// increment busy count and either tell the inventory to check &
// call done, or add this object to the inventory for observation.
@@ -239,6 +298,7 @@ void LLOutfitFetch::done()
// will call done for us when everything is here.
gInventory.addObserver(outfit_observer);
}
+ delete this;
}
class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
@@ -251,11 +311,17 @@ public:
virtual ~LLUpdateAppearanceOnDestroy()
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ llinfos << "done update appearance on destroy" << llendl;
+
+ if (!LLApp::isExiting())
+ {
+ LLAppearanceManager::instance().updateAppearanceFromCOF();
+ }
}
/* virtual */ void fire(const LLUUID& inv_item)
{
+ llinfos << "callback fired" << llendl;
mFireCount++;
}
private:
@@ -264,10 +330,11 @@ private:
struct LLFoundData
{
+ LLFoundData() : mAssetType(LLAssetType::AT_NONE), mWearable(NULL) {}
LLFoundData(const LLUUID& item_id,
- const LLUUID& asset_id,
- const std::string& name,
- LLAssetType::EType asset_type) :
+ const LLUUID& asset_id,
+ const std::string& name,
+ LLAssetType::EType asset_type) :
mItemID(item_id),
mAssetID(asset_id),
mName(name),
@@ -282,204 +349,238 @@ struct LLFoundData
};
-struct LLWearableHoldingPattern
+class LLWearableHoldingPattern
{
- LLWearableHoldingPattern() : mResolved(0) {}
- ~LLWearableHoldingPattern()
- {
- for_each(mFoundList.begin(), mFoundList.end(), DeletePointer());
- mFoundList.clear();
- }
- typedef std::list<LLFoundData*> found_list_t;
+public:
+ LLWearableHoldingPattern();
+ ~LLWearableHoldingPattern();
+
+ bool pollCompletion();
+ bool isFetchCompleted();
+ bool isTimedOut();
+
+ typedef std::list<LLFoundData> found_list_t;
found_list_t mFoundList;
+ LLInventoryModel::item_array_t mObjItems;
+ LLInventoryModel::item_array_t mGestItems;
S32 mResolved;
- bool append;
+ LLTimer mWaitTime;
+ bool mFired;
};
+LLWearableHoldingPattern::LLWearableHoldingPattern():
+ mResolved(0),
+ mFired(false)
+{
+}
+
+LLWearableHoldingPattern::~LLWearableHoldingPattern()
+{
+}
-void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
+bool LLWearableHoldingPattern::isFetchCompleted()
{
- LLInventoryModel::item_array_t new_dst;
- std::set<LLUUID> mark_inventory;
- std::set<LLUUID> mark_asset;
+ return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for?
+}
- S32 inventory_dups = 0;
- S32 asset_dups = 0;
+bool LLWearableHoldingPattern::isTimedOut()
+{
+ static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
+ return mWaitTime.getElapsedTimeF32() > max_wait_time;
+}
+
+bool LLWearableHoldingPattern::pollCompletion()
+{
+ bool completed = isFetchCompleted();
+ bool timed_out = isTimedOut();
+ bool done = completed || timed_out;
- for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin();
- src_pos != src.end();
- ++src_pos)
- {
- LLUUID src_item_id = (*src_pos)->getLinkedUUID();
- mark_inventory.insert(src_item_id);
- LLUUID src_asset_id = (*src_pos)->getAssetUUID();
- mark_asset.insert(src_asset_id);
- }
+ llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
- for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin();
- dst_pos != dst.end();
- ++dst_pos)
+ if (done)
{
- LLUUID dst_item_id = (*dst_pos)->getLinkedUUID();
-
- if (mark_inventory.find(dst_item_id) == mark_inventory.end())
+ mFired = true;
+
+ if (timed_out)
{
+ llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl;
}
- else
+
+ // Activate all gestures in this folder
+ if (mGestItems.count() > 0)
{
- inventory_dups++;
+ llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
+
+ LLGestureManager::instance().activateGestures(mGestItems);
+
+ // Update the inventory item labels to reflect the fact
+ // they are active.
+ LLViewerInventoryCategory* catp =
+ gInventory.getCategory(LLAppearanceManager::instance().getCOF());
+
+ if (catp)
+ {
+ gInventory.updateCategory(catp);
+ gInventory.notifyObservers();
+ }
}
- LLUUID dst_asset_id = (*dst_pos)->getAssetUUID();
-
- if (mark_asset.find(dst_asset_id) == mark_asset.end())
+ // Update wearables.
+ llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
+ LLAppearanceManager::instance().updateAgentWearables(this, false);
+
+ // Update attachments to match those requested.
+ LLVOAvatar* avatar = gAgent.getAvatarObject();
+ if( avatar )
{
- // Item is not already present in COF.
- new_dst.put(*dst_pos);
- mark_asset.insert(dst_item_id);
+ llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
+ LLAgentWearables::userUpdateAttachments(mObjItems);
}
- else
+
+ if (completed)
{
- asset_dups++;
+ // Only safe to delete if all wearable callbacks completed.
+ delete this;
}
}
- llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count()
- << " inventory dups " << inventory_dups << " asset_dups " << asset_dups << llendl;
-
- dst = new_dst;
+ return done;
}
-
-/* static */
-LLUUID LLAppearanceManager::getCOF()
+static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
{
- return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
-}
-
-// Update appearance from outfit folder.
-/* static */
-void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
-{
- if (!proceed)
- return;
-
- if (append)
+ LLInventoryModel::item_array_t new_items;
+ std::set<LLUUID> items_seen;
+ std::deque<LLViewerInventoryItem*> tmp_list;
+ // Traverse from the front and keep the first of each item
+ // encountered, so we actually keep the *last* of each duplicate
+ // item. This is needed to give the right priority when adding
+ // duplicate items to an existing outfit.
+ for (S32 i=items.count()-1; i>=0; i--)
{
- updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
+ LLViewerInventoryItem *item = items.get(i);
+ LLUUID item_id = item->getLinkedUUID();
+ if (items_seen.find(item_id)!=items_seen.end())
+ continue;
+ items_seen.insert(item_id);
+ tmp_list.push_front(item);
}
- else
+ for (std::deque<LLViewerInventoryItem*>::iterator it = tmp_list.begin();
+ it != tmp_list.end();
+ ++it)
{
- LLViewerInventoryCategory* catp = gInventory.getCategory(category);
- if (catp->getPreferredType() == LLAssetType::AT_NONE ||
- LLAssetType::lookupIsEnsembleCategoryType(catp->getPreferredType()))
- {
- updateCOFFromCategory(category, append); // append is false - rebuild COF.
- }
- else if (catp->getPreferredType() == LLAssetType::AT_OUTFIT)
- {
- rebuildCOFFromOutfit(category);
- }
+ new_items.put(*it);
}
+ items = new_items;
}
-// Append to current COF contents by recursively traversing a folder.
-/* static */
-void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
+static void onWearableAssetFetch(LLWearable* wearable, void* data)
{
- // BAP consolidate into one "get all 3 types of descendents" function, use both places.
- LLInventoryModel::item_array_t wear_items;
- LLInventoryModel::item_array_t obj_items;
- LLInventoryModel::item_array_t gest_items;
- bool follow_folder_links = false;
- getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links);
-
- // Find all the wearables that are in the category's subtree.
- lldebugs << "appendCOFFromCategory()" << llendl;
- if( !wear_items.count() && !obj_items.count() && !gest_items.count())
- {
- LLNotifications::instance().add("CouldNotPutOnOutfit");
- return;
- }
-
- const LLUUID &current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
- // Processes that take time should show the busy cursor
- //inc_busy_count();
-
- LLInventoryModel::cat_array_t cof_cats;
- LLInventoryModel::item_array_t cof_items;
- gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items,
- LLInventoryModel::EXCLUDE_TRASH);
- // Remove duplicates
- if (append)
- {
- removeDuplicateItems(wear_items, cof_items);
- removeDuplicateItems(obj_items, cof_items);
- removeDuplicateItems(gest_items, cof_items);
- }
-
- S32 total_links = gest_items.count() + wear_items.count() + obj_items.count();
-
- if (!append && total_links > 0)
+ LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
+ if (holder->mFired)
{
- purgeCOFBeforeRebuild(category);
+ llwarns << "called after holder fired" << llendl;
}
- LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy;
-
- // Link all gestures in this folder
- if (gest_items.count() > 0)
+ if(wearable)
{
- llinfos << "Linking " << gest_items.count() << " gestures" << llendl;
- for (S32 i = 0; i < gest_items.count(); ++i)
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
+ iter != holder->mFoundList.end(); ++iter)
{
- const LLInventoryItem* gest_item = gest_items.get(i).get();
- link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id,
- gest_item->getName(),
- LLAssetType::AT_LINK, link_waiter);
+ LLFoundData& data = *iter;
+ if(wearable->getAssetID() == data.mAssetID)
+ {
+ data.mWearable = wearable;
+ break;
+ }
}
}
+ holder->mResolved += 1;
+}
+
+const LLUUID LLAppearanceManager::getCOF() const
+{
+ return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+}
+
- // Link all wearables
- if(wear_items.count() > 0)
+const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()
+{
+ const LLUUID& current_outfit_cat = getCOF();
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ // Can't search on FT_OUTFIT since links to categories return FT_CATEGORY for type since they don't
+ // return preferred type.
+ LLIsType is_category( LLAssetType::AT_CATEGORY );
+ gInventory.collectDescendentsIf(current_outfit_cat,
+ cat_array,
+ item_array,
+ false,
+ is_category,
+ false);
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+ iter != item_array.end();
+ iter++)
{
- llinfos << "Linking " << wear_items.count() << " wearables" << llendl;
- for(S32 i = 0; i < wear_items.count(); ++i)
+ const LLViewerInventoryItem *item = (*iter);
+ const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+ if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
{
- // Populate the current outfit folder with links to the newly added wearables
- const LLInventoryItem* wear_item = wear_items.get(i).get();
- link_inventory_item(gAgent.getID(),
- wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
- current_outfit_id,
- wear_item->getName(),
- LLAssetType::AT_LINK,
- link_waiter);
+ return item;
}
}
+ return NULL;
+}
- // Link all attachments.
- if( obj_items.count() > 0 )
+bool LLAppearanceManager::getBaseOutfitName(std::string& name)
+{
+ const LLViewerInventoryItem* outfit_link = getBaseOutfitLink();
+ if(outfit_link)
{
- llinfos << "Linking " << obj_items.count() << " attachments" << llendl;
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( avatar )
+ const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory();
+ if (cat)
{
- for(S32 i = 0; i < obj_items.count(); ++i)
- {
- const LLInventoryItem* obj_item = obj_items.get(i).get();
- link_inventory_item(gAgent.getID(),
- obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
- current_outfit_id,
- obj_item->getName(),
- LLAssetType::AT_LINK, link_waiter);
- }
+ name = cat->getName();
+ return true;
}
}
+ return false;
+}
+
+// Update appearance from outfit folder.
+void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
+{
+ if (!proceed)
+ return;
+ LLAppearanceManager::instance().updateCOF(category,append);
}
-/* static */
+// Create a copy of src_id + contents as a subfolder of dst_id.
void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb)
{
+ LLInventoryCategory *src_cat = gInventory.getCategory(src_id);
+ if (!src_cat)
+ {
+ llwarns << "folder not found for src " << src_id.asString() << llendl;
+ return;
+ }
+ LLUUID parent_id = dst_id;
+ if(parent_id.isNull())
+ {
+ parent_id = gInventory.getRootFolderID();
+ }
+ LLUUID subfolder_id = gInventory.createNewCategory( parent_id,
+ LLFolderType::FT_NONE,
+ src_cat->getName());
+ shallowCopyCategoryContents(src_id, subfolder_id, cb);
+
+ gInventory.notifyObservers();
+}
+
+// Copy contents of src_id to dst_id.
+void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb)
+{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(src_id, cats, items,
@@ -499,7 +600,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
{
LLViewerInventoryCategory *catp = item->getLinkedCategory();
// Skip copying outfit links.
- if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT)
+ if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)
{
link_inventory_item(gAgent.getID(),
item->getLinkedUUID(),
@@ -521,141 +622,205 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
}
}
-/* static */
-bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
-{
- return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES);
-}
-
-// For mandatory body parts.
-/* static */
-void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
+void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)
{
- LLInventoryModel::cat_array_t new_cats;
- LLInventoryModel::item_array_t new_items;
- gInventory.collectDescendents(category, new_cats, new_items,
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(category, cats, items,
LLInventoryModel::EXCLUDE_TRASH);
- std::set<EWearableType> wt_types_found;
- for (S32 i = 0; i < new_items.count(); ++i)
+ for (S32 i = 0; i < items.count(); ++i)
{
- LLViewerInventoryItem *itemp = new_items.get(i);
- if (itemp->isWearableType())
+ LLViewerInventoryItem *item = items.get(i);
+ if (item->getActualType() != LLAssetType::AT_LINK_FOLDER)
+ continue;
+ if (item->getIsLinkType())
{
- EWearableType type = itemp->getWearableType();
- if (isMandatoryWearableType(type))
+ LLViewerInventoryCategory* catp = item->getLinkedCategory();
+ if(catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
{
- types_found.insert(type);
+ gInventory.purgeObject(item->getUUID());
}
}
}
}
-// Remove everything from the COF that we safely can before replacing
-// with contents of new category. This means preserving any mandatory
-// body parts that aren't present in the new category, and getting rid
-// of everything else.
-/* static */
-void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
+void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
{
- // See which mandatory body types are present in the new category.
- std::set<EWearableType> wt_types_found;
- checkMandatoryWearableTypes(category,wt_types_found);
-
- LLInventoryModel::cat_array_t cof_cats;
- LLInventoryModel::item_array_t cof_items;
- gInventory.collectDescendents(getCOF(), cof_cats, cof_items,
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(category, cats, items,
LLInventoryModel::EXCLUDE_TRASH);
- for (S32 i = 0; i < cof_items.count(); ++i)
+ for (S32 i = 0; i < items.count(); ++i)
{
- LLViewerInventoryItem *itemp = cof_items.get(i);
- if (itemp->isWearableType())
+ LLViewerInventoryItem *item = items.get(i);
+ if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER))
+ continue;
+ if (item->getIsLinkType())
{
- EWearableType type = itemp->getWearableType();
- if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end()))
- {
- // Not mandatory or supplied by the new category - OK to delete
- gInventory.purgeObject(cof_items.get(i)->getUUID());
- }
+ gInventory.purgeObject(item->getUUID());
}
- else
+ }
+}
+
+// Keep the last N wearables of each type. For viewer 2.0, N is 1 for
+// both body parts and clothing items.
+void LLAppearanceManager::filterWearableItems(
+ LLInventoryModel::item_array_t& items, S32 max_per_type)
+{
+ // Divvy items into arrays by wearable type.
+ std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT);
+ for (S32 i=0; i<items.count(); i++)
+ {
+ LLViewerInventoryItem *item = items.get(i);
+ // Ignore non-wearables.
+ if (!item->isWearableType())
+ continue;
+ EWearableType type = item->getWearableType();
+ if(type < 0 || type >= WT_COUNT)
{
- // Not a wearable - always purge
- gInventory.purgeObject(cof_items.get(i)->getUUID());
+ LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
+ continue;
+ }
+ items_by_type[type].push_back(item);
+ }
+
+ // rebuild items list, retaining the last max_per_type of each array
+ items.clear();
+ for (S32 i=0; i<WT_COUNT; i++)
+ {
+ S32 size = items_by_type[i].size();
+ if (size <= 0)
+ continue;
+ S32 start_index = llmax(0,size-max_per_type);
+ for (S32 j = start_index; j<size; j++)
+ {
+ items.push_back(items_by_type[i][j]);
}
}
- gInventory.notifyObservers();
}
-// Replace COF contents from a given outfit folder.
-/* static */
-void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
+// Create links to all listed items.
+void LLAppearanceManager::linkAll(const LLUUID& category,
+ LLInventoryModel::item_array_t& items,
+ LLPointer<LLInventoryCallback> cb)
{
- lldebugs << "rebuildCOFFromOutfit()" << llendl;
+ for (S32 i=0; i<items.count(); i++)
+ {
+ const LLInventoryItem* item = items.get(i).get();
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ category,
+ item->getName(),
+ LLAssetType::AT_LINK,
+ cb);
+ }
+}
- dumpCat(category,"start, source outfit");
- dumpCat(getCOF(),"start, COF");
+void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
+{
+ llinfos << "starting" << llendl;
- // Find all the wearables that are in the category's subtree.
- LLInventoryModel::item_array_t items;
- getCOFValidDescendents(category, items);
+ const LLUUID cof = getCOF();
- if( items.count() == 0)
+ // Deactivate currently active gestures in the COF, if replacing outfit
+ if (!append)
{
- LLNotifications::instance().add("CouldNotPutOnOutfit");
- return;
+ LLInventoryModel::item_array_t gest_items;
+ getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE, false);
+ for(S32 i = 0; i < gest_items.count(); ++i)
+ {
+ LLViewerInventoryItem *gest_item = gest_items.get(i);
+ if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
+ {
+ LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
+ }
+ }
}
-
- // Processes that take time should show the busy cursor
- //inc_busy_count();
-
- //dumpCat(current_outfit_id,"COF before remove:");
+
+ // Collect and filter descendents to determine new COF contents.
+
+ // - Body parts: always include COF contents as a fallback in case any
+ // required parts are missing.
+ LLInventoryModel::item_array_t body_items;
+ getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false);
+ getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false);
+ // Reduce body items to max of one per type.
+ removeDuplicateItems(body_items);
+ filterWearableItems(body_items, 1);
+
+ // - Wearables: include COF contents only if appending.
+ LLInventoryModel::item_array_t wear_items;
+ if (append)
+ getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING, false);
+ getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false);
+ // Reduce wearables to max of one per type.
+ removeDuplicateItems(wear_items);
+ filterWearableItems(wear_items, 1);
- //dumpCat(current_outfit_id,"COF after remove:");
+ // - Attachments: include COF contents only if appending.
+ LLInventoryModel::item_array_t obj_items;
+ if (append)
+ getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT, false);
+ getDescendentsOfAssetType(category, obj_items, LLAssetType::AT_OBJECT, false);
+ removeDuplicateItems(obj_items);
- purgeCOFBeforeRebuild(category);
+ // - Gestures: include COF contents only if appending.
+ LLInventoryModel::item_array_t gest_items;
+ if (append)
+ getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE, false);
+ getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false);
+ removeDuplicateItems(gest_items);
+ // Remove current COF contents.
+ bool keep_outfit_links = append;
+ purgeCategory(cof, keep_outfit_links);
+ gInventory.notifyObservers();
+
+ // Create links to new COF contents.
+ llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
- LLUUID current_outfit_id = getCOF();
- LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter);
- //dumpCat(current_outfit_id,"COF after shallow copy:");
+ linkAll(cof, body_items, link_waiter);
+ linkAll(cof, wear_items, link_waiter);
+ linkAll(cof, obj_items, link_waiter);
+ linkAll(cof, gest_items, link_waiter);
- // Create a link to the outfit that we wore.
- LLViewerInventoryCategory* catp = gInventory.getCategory(category);
- if (catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT)
+ // Add link to outfit if category is an outfit.
+ if (!append)
{
- link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(),
- LLAssetType::AT_LINK_FOLDER, link_waiter);
+ createBaseOutfitLink(category, link_waiter);
}
+ llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;
}
-/* static */
-void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data)
+void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
{
- LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
- bool append = holder->append;
-
- if(wearable)
+ LLSidepanelAppearance* panel_appearance =
+ dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ if (panel_appearance)
{
- for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
- iter != holder->mFoundList.end(); ++iter)
- {
- LLFoundData* data = *iter;
- if(wearable->getAssetID() == data->mAssetID)
- {
- data->mWearable = wearable;
- break;
- }
- }
+ panel_appearance->refreshCurrentOutfitName(name);
}
- holder->mResolved += 1;
- if(holder->mResolved >= (S32)holder->mFoundList.size())
+}
+
+void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter)
+{
+ const LLUUID cof = getCOF();
+ LLViewerInventoryCategory* catp = gInventory.getCategory(category);
+ std::string new_outfit_name = "";
+
+ purgeBaseOutfitLink(cof);
+
+ if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
{
- LLAppearanceManager::updateAgentWearables(holder, append);
+ link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+ LLAssetType::AT_LINK_FOLDER, link_waiter);
+ new_outfit_name = catp->getName();
}
+
+ updatePanelOutfitName(new_outfit_name);
}
-/* static */
void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
{
lldebugs << "updateAgentWearables()" << llendl;
@@ -669,12 +834,12 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
iter != holder->mFoundList.end(); ++iter)
{
- LLFoundData* data = *iter;
- LLWearable* wearable = data->mWearable;
+ LLFoundData& data = *iter;
+ LLWearable* wearable = data.mWearable;
if( wearable && ((S32)wearable->getType() == i) )
{
LLViewerInventoryItem* item;
- item = (LLViewerInventoryItem*)gInventory.getItem(data->mItemID);
+ item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
if( item && (item->getAssetUUID() == wearable->getAssetID()) )
{
items.put(item);
@@ -688,17 +853,19 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
if(wearables.count() > 0)
{
gAgentWearables.setWearableOutfit(items, wearables, !append);
- gInventory.notifyObservers();
}
- delete holder;
-
// dec_busy_count();
}
-/* static */
void LLAppearanceManager::updateAppearanceFromCOF()
{
+ // update dirty flag to see if the state of the COF matches
+ // the saved outfit stored as a folder link
+ llinfos << "starting" << llendl;
+
+ updateIsDirty();
+
dumpCat(getCOF(),"COF, start");
bool follow_folder_links = true;
@@ -711,88 +878,83 @@ void LLAppearanceManager::updateAppearanceFromCOF()
LLInventoryModel::item_array_t gest_items;
getUserDescendents(current_outfit_id, wear_items, obj_items, gest_items, follow_folder_links);
- if( !wear_items.count() && !obj_items.count() && !gest_items.count())
+ if(!wear_items.count())
{
- LLNotifications::instance().add("CouldNotPutOnOutfit");
+ LLNotificationsUtil::add("CouldNotPutOnOutfit");
return;
}
-
- // Processes that take time should show the busy cursor
- //inc_busy_count(); // BAP this is currently a no-op in llinventorybridge.cpp - do we need it?
-
- // Activate all gestures in this folder
- if (gest_items.count() > 0)
- {
- llinfos << "Activating " << gest_items.count() << " gestures" << llendl;
-
- LLGestureManager::instance().activateGestures(gest_items);
- // Update the inventory item labels to reflect the fact
- // they are active.
- LLViewerInventoryCategory* catp = gInventory.getCategory(current_outfit_id);
- if (catp)
- {
- gInventory.updateCategory(catp);
- gInventory.notifyObservers();
- }
- }
+ LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
- if(wear_items.count() > 0)
+ holder->mObjItems = obj_items;
+ holder->mGestItems = gest_items;
+
+ // Note: can't do normal iteration, because if all the
+ // wearables can be resolved immediately, then the
+ // callback will be called (and this object deleted)
+ // before the final getNextData().
+ LLDynamicArray<LLFoundData> found_container;
+ for(S32 i = 0; i < wear_items.count(); ++i)
{
- // Note: can't do normal iteration, because if all the
- // wearables can be resolved immediately, then the
- // callback will be called (and this object deleted)
- // before the final getNextData().
- LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
- LLFoundData* found;
- LLDynamicArray<LLFoundData*> found_container;
- for(S32 i = 0; i < wear_items.count(); ++i)
+ LLViewerInventoryItem *item = wear_items.get(i);
+ LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
+ if (item && linked_item)
{
- found = new LLFoundData(wear_items.get(i)->getLinkedUUID(), // Wear the base item, not the link
- wear_items.get(i)->getAssetUUID(),
- wear_items.get(i)->getName(),
- wear_items.get(i)->getType());
+ LLFoundData found(linked_item->getUUID(),
+ linked_item->getAssetUUID(),
+ linked_item->getName(),
+ linked_item->getType());
holder->mFoundList.push_front(found);
found_container.put(found);
}
- for(S32 i = 0; i < wear_items.count(); ++i)
+ else
{
- holder->append = false;
- found = found_container.get(i);
-
- // Fetch the wearables about to be worn.
- LLWearableList::instance().getAsset(found->mAssetID,
- found->mName,
- found->mAssetType,
- LLAppearanceManager::onWearableAssetFetch,
- (void*)holder);
+ if (!item)
+ {
+ llwarns << "attempt to wear a null item " << llendl;
+ }
+ else if (!linked_item)
+ {
+ llwarns << "attempt to wear a broken link " << item->getName() << llendl;
+ }
}
}
- // Update attachments to match those requested.
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( avatar )
+ for(S32 i = 0; i < found_container.count(); ++i)
{
- LLAgentWearables::userUpdateAttachments(obj_items);
+ LLFoundData& found = found_container.get(i);
+
+ // Fetch the wearables about to be worn.
+ LLWearableList::instance().getAsset(found.mAssetID,
+ found.mName,
+ found.mAssetType,
+ onWearableAssetFetch,
+ (void*)holder);
+
+ }
+
+ if (!holder->pollCompletion())
+ {
+ doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder));
}
+
}
-/* static */
-void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
- LLInventoryModel::item_array_t& items)
+void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
+ LLInventoryModel::item_array_t& items,
+ LLAssetType::EType type,
+ bool follow_folder_links)
{
LLInventoryModel::cat_array_t cats;
- LLFindCOFValidItems is_cof_valid;
- bool follow_folder_links = false;
+ LLIsType is_of_type(type);
gInventory.collectDescendentsIf(category,
- cats,
- items,
+ cats,
+ items,
LLInventoryModel::EXCLUDE_TRASH,
- is_cof_valid,
+ is_of_type,
follow_folder_links);
}
-/* static */
void LLAppearanceManager::getUserDescendents(const LLUUID& category,
LLInventoryModel::item_array_t& wear_items,
LLInventoryModel::item_array_t& obj_items,
@@ -832,8 +994,9 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
{
if(!category) return;
- lldebugs << "wearInventoryCategory( " << category->getName()
+ llinfos << "wearInventoryCategory( " << category->getName()
<< " )" << llendl;
+
// What we do here is get the complete information on the items in
// the inventory, and set up an observer that will wait for that to
// happen.
@@ -856,19 +1019,21 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
}
// *NOTE: hack to get from avatar inventory to avatar
-/* static */
void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )
{
// Avoid unintentionally overwriting old wearables. We have to do
// this up front to avoid having to deal with the case of multiple
// wearables being dirty.
if(!category) return;
- lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName()
+
+ llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()
<< " )" << llendl;
if( gFloaterCustomize )
{
- gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append));
+ gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit,
+ &LLAppearanceManager::instance(),
+ _1, category->getUUID(), append));
}
else
{
@@ -876,7 +1041,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
}
}
-/* static */
void LLAppearanceManager::wearOutfitByName(const std::string& name)
{
llinfos << "Wearing category " << name << llendl;
@@ -924,9 +1088,67 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name)
//dec_busy_count();
}
-/* static */
-void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
+bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventoryItem *b)
+{
+ return (a->isWearableType() && b->isWearableType() &&
+ (a->getWearableType() == b->getWearableType()));
+}
+
+class LLDeferredCOFLinkObserver: public LLInventoryObserver
{
+public:
+ LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update):
+ mItemID(item_id),
+ mDoUpdate(do_update)
+ {
+ }
+
+ ~LLDeferredCOFLinkObserver()
+ {
+ }
+
+ /* virtual */ void changed(U32 mask)
+ {
+ const LLInventoryItem *item = gInventory.getItem(mItemID);
+ if (item)
+ {
+ gInventory.removeObserver(this);
+ LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
+ delete this;
+ }
+ }
+
+private:
+ const LLUUID mItemID;
+ bool mDoUpdate;
+};
+
+
+void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
+{
+ const LLInventoryItem *item = gInventory.getItem(item_id);
+ if (!item)
+ {
+ LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update);
+ gInventory.addObserver(observer);
+ }
+ else
+ {
+ addCOFItemLink(item, do_update);
+ }
+}
+
+void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
+{
+ const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item);
+ if (!vitem)
+ {
+ llwarns << "not an llviewerinventoryitem, failed" << llendl;
+ return;
+ }
+
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, vitem->getLinkedUUID());
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
gInventory.collectDescendents(LLAppearanceManager::getCOF(),
@@ -936,32 +1158,45 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
bool linked_already = false;
for (S32 i=0; i<item_array.count(); i++)
{
- const LLInventoryItem* inv_item = item_array.get(i).get();
- if (inv_item->getLinkedUUID() == item->getLinkedUUID())
+ // Are these links to the same object?
+ const LLViewerInventoryItem* inv_item = item_array.get(i).get();
+ if (inv_item->getLinkedUUID() == vitem->getLinkedUUID())
{
linked_already = true;
- break;
+ }
+ // Are these links to different items of the same wearable
+ // type? If so, new item will replace old.
+ // MULTI-WEARABLES: revisit if more than one per type is allowed.
+ else if (areMatchingWearables(vitem,inv_item))
+ {
+ if (inv_item->getIsLinkType())
+ {
+ gInventory.purgeObject(inv_item->getUUID());
+ }
}
}
if (linked_already)
{
if (do_update)
+ {
LLAppearanceManager::updateAppearanceFromCOF();
+ }
+ return;
}
else
{
LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0;
link_inventory_item( gAgent.getID(),
- item->getLinkedUUID(),
+ vitem->getLinkedUUID(),
getCOF(),
- item->getName(),
+ vitem->getName(),
LLAssetType::AT_LINK,
cb);
}
+ return;
}
-/* static */
-void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update )
+void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )
{
#if SUPPORT_ENSEMBLES
// BAP add check for already in COF.
@@ -975,9 +1210,10 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update
#endif
}
-/* static */
-void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
+void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_update)
{
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
gInventory.collectDescendents(LLAppearanceManager::getCOF(),
@@ -987,9 +1223,9 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
for (S32 i=0; i<item_array.count(); i++)
{
const LLInventoryItem* item = item_array.get(i).get();
- if (item->getLinkedUUID() == item_id)
+ if (item->getIsLinkType() && item->getLinkedUUID() == item_id)
{
- gInventory.purgeObject(item_array.get(i)->getUUID());
+ gInventory.purgeObject(item->getUUID());
}
}
if (do_update)
@@ -998,14 +1234,101 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
}
}
-/* static */
-void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str)
+void LLAppearanceManager::updateIsDirty()
+{
+ LLUUID cof = getCOF();
+ LLUUID base_outfit;
+
+ // find base outfit link
+ const LLViewerInventoryItem* base_outfit_item = getBaseOutfitLink();
+ LLViewerInventoryCategory* catp = NULL;
+ if (base_outfit_item && base_outfit_item->getIsLinkType())
+ {
+ catp = base_outfit_item->getLinkedCategory();
+ }
+ if(catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ base_outfit = catp->getUUID();
+ }
+
+ if(base_outfit.isNull())
+ {
+ // no outfit link found, display "unsaved outfit"
+ mOutfitIsDirty = true;
+ }
+ else
+ {
+ LLInventoryModel::cat_array_t cof_cats;
+ LLInventoryModel::item_array_t cof_items;
+ gInventory.collectDescendents(cof, cof_cats, cof_items,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ LLInventoryModel::cat_array_t outfit_cats;
+ LLInventoryModel::item_array_t outfit_items;
+ gInventory.collectDescendents(base_outfit, outfit_cats, outfit_items,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ if(outfit_items.count() != cof_items.count() -1)
+ {
+ // Current outfit folder should have one more item than the outfit folder.
+ // this one item is the link back to the outfit folder itself.
+ mOutfitIsDirty = true;
+ }
+ else
+ {
+ typedef std::set<LLUUID> item_set_t;
+ item_set_t cof_set;
+ item_set_t outfit_set;
+
+ // sort COF items by UUID
+ for (S32 i = 0; i < cof_items.count(); ++i)
+ {
+ LLViewerInventoryItem *item = cof_items.get(i);
+ // don't add the base outfit link to the list of objects we're comparing
+ if(item != base_outfit_item)
+ {
+ cof_set.insert(item->getLinkedUUID());
+ }
+ }
+
+ // sort outfit folder by UUID
+ for (S32 i = 0; i < outfit_items.count(); ++i)
+ {
+ LLViewerInventoryItem *item = outfit_items.get(i);
+ outfit_set.insert(item->getLinkedUUID());
+ }
+
+ mOutfitIsDirty = (outfit_set != cof_set);
+ }
+ }
+}
+
+void LLAppearanceManager::onFirstFullyVisible()
+{
+ // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+ // then auto-populate outfits from the library into the My Outfits folder.
+
+ llinfos << "avatar fully visible" << llendl;
+
+ static bool check_populate_my_outfits = true;
+ if (check_populate_my_outfits &&
+ (LLInventoryModel::getIsFirstTimeInViewer2()
+ || gSavedSettings.getBOOL("MyOutfitsAutofill")))
+ {
+ gAgentWearables.populateMyOutfitsFolder();
+ }
+ check_populate_my_outfits = false;
+}
+
+//#define DUMP_CAT_VERBOSE
+
+void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
-#if 0
+#ifdef DUMP_CAT_VERBOSE
llinfos << llendl;
llinfos << str << llendl;
S32 hitcount = 0;
@@ -1017,6 +1340,122 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str)
llinfos << i <<" "<< item->getName() <<llendl;
}
#endif
- llinfos << str << " count " << items.count() << llendl;
+ llinfos << msg << " count " << items.count() << llendl;
+}
+
+void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,
+ const std::string& msg)
+{
+ llinfos << msg << llendl;
+ for (S32 i=0; i<items.count(); i++)
+ {
+ LLViewerInventoryItem *item = items.get(i);
+ llinfos << i <<" " << item->getName() << llendl;
+ }
+ llinfos << llendl;
+}
+
+LLAppearanceManager::LLAppearanceManager():
+ mAttachmentInvLinkEnabled(false),
+ mOutfitIsDirty(false)
+{
+}
+
+LLAppearanceManager::~LLAppearanceManager()
+{
+}
+
+void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)
+{
+ llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
+ mAttachmentInvLinkEnabled = val;
}
+void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
+{
+ llinfos << msg << llendl;
+ for (std::set<LLUUID>::const_iterator it = atts.begin();
+ it != atts.end();
+ ++it)
+ {
+ LLUUID item_id = *it;
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item)
+ llinfos << "atts " << item->getName() << llendl;
+ else
+ llinfos << "atts " << "UNKNOWN[" << item_id.asString() << "]" << llendl;
+ }
+ llinfos << llendl;
+}
+
+void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
+{
+ mRegisteredAttachments.insert(item_id);
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+ //dumpAttachmentSet(mRegisteredAttachments,"after register:");
+
+ if (mAttachmentInvLinkEnabled)
+ {
+ LLAppearanceManager::addCOFItemLink(item_id, false); // Add COF link for item.
+ }
+ else
+ {
+ //llinfos << "no link changes, inv link not enabled" << llendl;
+ }
+}
+
+void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
+{
+ mRegisteredAttachments.erase(item_id);
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
+ //dumpAttachmentSet(mRegisteredAttachments,"after unregister:");
+
+ if (mAttachmentInvLinkEnabled)
+ {
+ //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
+ LLAppearanceManager::removeCOFItemLinks(item_id, false);
+ }
+ else
+ {
+ //llinfos << "no link changes, inv link not enabled" << llendl;
+ }
+}
+
+void LLAppearanceManager::linkRegisteredAttachments()
+{
+ for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin();
+ it != mRegisteredAttachments.end();
+ ++it)
+ {
+ LLUUID item_id = *it;
+ addCOFItemLink(item_id, false);
+ }
+ mRegisteredAttachments.clear();
+}
+
+BOOL LLAppearanceManager::getIsInCOF(const LLUUID& obj_id) const
+{
+ return gInventory.isObjectDescendentOf(obj_id, getCOF());
+}
+
+BOOL LLAppearanceManager::getIsProtectedCOFItem(const LLUUID& obj_id) const
+{
+ if (!getIsInCOF(obj_id)) return FALSE;
+
+ // For now, don't allow direct deletion from the COF. Instead, force users
+ // to choose "Detach" or "Take Off".
+ return TRUE;
+ /*
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (!obj) return FALSE;
+
+ // Can't delete bodyparts, since this would be equivalent to removing the item.
+ if (obj->getType() == LLAssetType::AT_BODYPART) return TRUE;
+
+ // Can't delete the folder link, since this is saved for bookkeeping.
+ if (obj->getActualType() == LLAssetType::AT_LINK_FOLDER) return TRUE;
+
+ return FALSE;
+ */
+}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 828af32101..28b51ee0f6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -35,54 +35,291 @@
#include "llsingleton.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llviewerinventory.h"
+#include "llcallbacklist.h"
class LLWearable;
-struct LLWearableHoldingPattern;
+class LLWearableHoldingPattern;
+class LLInventoryCallback;
class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
{
+ friend class LLSingleton<LLAppearanceManager>;
+
public:
- static void updateAppearanceFromCOF();
- static bool needToSaveCOF();
- static void changeOutfit(bool proceed, const LLUUID& category, bool append);
- static void updateCOFFromCategory(const LLUUID& category, bool append);
- static void rebuildCOFFromOutfit(const LLUUID& category);
- static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
- static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
- static void wearOutfitByName(const std::string& name);
- static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
- LLPointer<LLInventoryCallback> cb);
+ void updateAppearanceFromCOF();
+ bool needToSaveCOF();
+ void updateCOF(const LLUUID& category, bool append = false);
+ void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
+ void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
+ void wearOutfitByName(const std::string& name);
+ void changeOutfit(bool proceed, const LLUUID& category, bool append);
+
+ // Copy all items and the src category itself.
+ void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb);
+
+ // Copy all items in a category.
+ void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb);
+
+ // Find the Current Outfit folder.
+ const LLUUID getCOF() const;
+
+ // Finds the folder link to the currently worn outfit
+ const LLViewerInventoryItem *getBaseOutfitLink();
+ bool getBaseOutfitName(std::string &name);
+
+ // Update the displayed outfit name in UI.
+ void updatePanelOutfitName(const std::string& name);
+
+ void createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter);
+
+ void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
+
+ // For debugging - could be moved elsewhere.
+ void dumpCat(const LLUUID& cat_id, const std::string& msg);
+ void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
+
+ // Attachment link management
+ void unregisterAttachment(const LLUUID& item_id);
+ void registerAttachment(const LLUUID& item_id);
+ void setAttachmentInvLinkEnable(bool val);
+ void linkRegisteredAttachments();
+
+ // utility function for bulk linking.
+ void linkAll(const LLUUID& category,
+ LLInventoryModel::item_array_t& items,
+ LLPointer<LLInventoryCallback> cb);
// Add COF link to individual item.
- static void wearItem(LLInventoryItem* item, bool do_update = true);
+ void addCOFItemLink(const LLUUID& item_id, bool do_update = true);
+ void addCOFItemLink(const LLInventoryItem *item, bool do_update = true);
+
+ // Remove COF entries
+ void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true);
// Add COF link to ensemble folder.
- static void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
- static LLUUID getCOF();
+ void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
- // Remove COF entries
- static void removeItemLinks(const LLUUID& item_id, bool do_update = true);
+ //has the current outfit changed since it was loaded?
+ bool isOutfitDirty() { return mOutfitIsDirty; }
- // For debugging - could be moved elsewhere.
- static void dumpCat(const LLUUID& cat_id, std::string str);
+ // set false if you just loaded the outfit, true otherwise
+ void setOutfitDirty(bool isDirty) { mOutfitIsDirty = isDirty; }
+
+ // manually compare ouftit folder link to COF to see if outfit has changed.
+ // should only be necessary to do on initial login.
+ void updateIsDirty();
+
+ // Called when self avatar is first fully visible.
+ void onFirstFullyVisible();
+
+protected:
+ LLAppearanceManager();
+ ~LLAppearanceManager();
private:
- static void getCOFValidDescendents(const LLUUID& category,
- LLInventoryModel::item_array_t& items);
-
- static void getUserDescendents(const LLUUID& category,
+
+ void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
+
+ void getDescendentsOfAssetType(const LLUUID& category,
+ LLInventoryModel::item_array_t& items,
+ LLAssetType::EType type,
+ bool follow_folder_links);
+
+ void getUserDescendents(const LLUUID& category,
LLInventoryModel::item_array_t& wear_items,
LLInventoryModel::item_array_t& obj_items,
LLInventoryModel::item_array_t& gest_items,
bool follow_folder_links);
- static void onWearableAssetFetch(LLWearable* wearable, void* data);
- static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
- static bool isMandatoryWearableType(EWearableType type);
- static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
- static void purgeCOFBeforeRebuild(const LLUUID& category);
+
+ void purgeCategory(const LLUUID& category, bool keep_outfit_links);
+ void purgeBaseOutfitLink(const LLUUID& category);
+
+ std::set<LLUUID> mRegisteredAttachments;
+ bool mAttachmentInvLinkEnabled;
+ bool mOutfitIsDirty;
+
+ //////////////////////////////////////////////////////////////////////////////////
+ // Item-specific convenience functions
+public:
+ // Is this in the COF?
+ BOOL getIsInCOF(const LLUUID& obj_id) const;
+ // Is this in the COF and can the user delete it from the COF?
+ BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;
};
#define SUPPORT_ENSEMBLES 0
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
+
+// Shim class and template function to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+template <typename T>
+class OnIdleCallback
+{
+public:
+ OnIdleCallback(T callable):
+ mCallable(callable)
+ {
+ }
+ static void onIdle(void *data)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ OnIdleCallback<T>* self = reinterpret_cast<OnIdleCallback<T>*>(data);
+ self->call();
+ delete self;
+ }
+ void call()
+ {
+ mCallable();
+ }
+private:
+ T mCallable;
+};
+
+template <typename T>
+void doOnIdle(T callable)
+{
+ OnIdleCallback<T>* cb_functor = new OnIdleCallback<T>(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor);
+}
+
+// Shim class and template function to allow arbitrary boost::bind
+// expressions to be run as recurring idle callbacks.
+template <typename T>
+class OnIdleCallbackRepeating
+{
+public:
+ OnIdleCallbackRepeating(T callable):
+ mCallable(callable)
+ {
+ }
+ // Will keep getting called until the callable returns false.
+ static void onIdle(void *data)
+ {
+ OnIdleCallbackRepeating<T>* self = reinterpret_cast<OnIdleCallbackRepeating<T>*>(data);
+ bool done = self->call();
+ if (done)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ delete self;
+ }
+ }
+ bool call()
+ {
+ return mCallable();
+ }
+private:
+ T mCallable;
+};
+
+template <typename T>
+void doOnIdleRepeating(T callable)
+{
+ OnIdleCallbackRepeating<T>* cb_functor = new OnIdleCallbackRepeating<T>(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
+}
+
+template <class T>
+class CallAfterCategoryFetchStage2: public LLInventoryFetchObserver
+{
+public:
+ CallAfterCategoryFetchStage2(T callable):
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage2()
+ {
+ }
+ virtual void done()
+ {
+ gInventory.removeObserver(this);
+ doOnIdle(mCallable);
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver
+{
+public:
+ CallAfterCategoryFetchStage1(T callable):
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage1()
+ {
+ }
+ virtual void done()
+ {
+ // What we do here is get the complete information on the items in
+ // the library, and set up an observer that will wait for that to
+ // happen.
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(mCompleteFolders.front(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ S32 count = item_array.count();
+ if(!count)
+ {
+ llwarns << "Nothing fetched in category " << mCompleteFolders.front()
+ << llendl;
+ //dec_busy_count();
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+
+ CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(mCallable);
+ LLInventoryFetchObserver::item_ref_t ids;
+ for(S32 i = 0; i < count; ++i)
+ {
+ ids.push_back(item_array.get(i)->getUUID());
+ }
+
+ gInventory.removeObserver(this);
+
+ // do the fetch
+ stage2->fetchItems(ids);
+ if(stage2->isEverythingComplete())
+ {
+ // everything is already here - call done.
+ stage2->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(stage2);
+ }
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+void callAfterCategoryFetch(const LLUUID& cat_id, T callable)
+{
+ CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(callable);
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(cat_id);
+ stage1->fetchDescendents(folders);
+ if (stage1->isEverythingComplete())
+ {
+ stage1->done();
+ }
+ else
+ {
+ gInventory.addObserver(stage1);
+ }
+}
+
#endif
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 06c9171d67..00a9e4d745 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -35,12 +35,12 @@
#include "llappviewer.h"
// Viewer includes
-#include "llversionviewer.h"
+#include "llversioninfo.h"
#include "llfeaturemanager.h"
#include "lluictrlfactory.h"
#include "lltexteditor.h"
-#include "llalertdialog.h"
#include "llerrorcontrol.h"
+#include "lleventtimer.h"
#include "llviewertexturelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
@@ -57,6 +57,8 @@
#include "llallocator.h"
#include "llares.h"
#include "llcurl.h"
+#include "lltexturestats.h"
+#include "lltexturestats.h"
#include "llviewerwindow.h"
#include "llviewerdisplay.h"
#include "llviewermedia.h"
@@ -70,22 +72,31 @@
#include "lluicolortable.h"
#include "llurldispatcher.h"
#include "llurlhistory.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llrender.h"
#include "llteleporthistory.h"
#include "lllocationhistory.h"
#include "llfasttimerview.h"
#include "llvoicechannel.h"
+#include "llsidetray.h"
+
#include "llweb.h"
#include "llsecondlifeurls.h"
// Linden library includes
+#include "llimagej2c.h"
#include "llmemory.h"
#include "llprimitive.h"
#include "llurlaction.h"
+#include "llvfile.h"
#include "llvfsthread.h"
#include "llvolumemgr.h"
+#include "llxfermanager.h"
+
+#include "llnotificationmanager.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
// Third party library includes
#include <boost/bind.hpp>
@@ -101,7 +112,6 @@
#include "apr_dso.h"
#include <boost/lexical_cast.hpp>
-#include "llnotify.h"
#include "llviewerkeyboard.h"
#include "lllfsthread.h"
#include "llworkerthread.h"
@@ -154,7 +164,6 @@
#include "llvotree.h"
#include "llvoavatar.h"
#include "llfolderview.h"
-#include "lltoolbar.h"
#include "llagentpilot.h"
#include "llvovolume.h"
#include "llflexibleobject.h"
@@ -205,7 +214,7 @@
#pragma warning (disable:4702)
#endif
-static LLAppViewerListener sAppViewerListener("LLAppViewer", LLAppViewer::instance);
+static LLAppViewerListener sAppViewerListener(LLAppViewer::instance);
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
//
@@ -238,8 +247,6 @@ U32 gFrameCount = 0;
U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground
LLPumpIO* gServicePump = NULL;
-BOOL gPacificDaylightTime = FALSE;
-
U64 gFrameTime = 0;
F32 gFrameTimeSeconds = 0.f;
F32 gFrameIntervalSeconds = 0.f;
@@ -257,9 +264,6 @@ F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
BOOL gDisconnected = FALSE;
-// Map scale in pixels per region
-F32 gMapScale = 128.f;
-
// used to restore texture state after a mode switch
LLFrameTimer gRestoreGLTimer;
BOOL gRestoreGL = FALSE;
@@ -309,6 +313,7 @@ void init_default_trans_args()
{
default_trans_args.insert("SECOND_LIFE"); // World
default_trans_args.insert("APP_NAME");
+ default_trans_args.insert("CAPITALIZED_APP_NAME");
default_trans_args.insert("SECOND_LIFE_GRID");
default_trans_args.insert("SUPPORT_SITE");
}
@@ -329,7 +334,7 @@ LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
void idle_afk_check()
{
// check idle timers
- if (gSavedSettings.getBOOL("AllowIdleAFK") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getF32("AFKTimeout")))
+ if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
{
gAgent.setAFK();
}
@@ -388,7 +393,6 @@ bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
static void settings_to_globals()
{
LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad");
- LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad");
BTN_HEIGHT_SMALL = gSavedSettings.getS32("ButtonHeightSmall");
BTN_HEIGHT = gSavedSettings.getS32("ButtonHeight");
@@ -410,7 +414,6 @@ static void settings_to_globals()
LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
// clamp auto-open time to some minimum usable value
LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
- LLToolBar::sInventoryAutoOpenTime = gSavedSettings.getF32("InventoryAutoOpenDelay");
LLSelectMgr::sRectSelectInclusive = gSavedSettings.getBOOL("RectangleSelectInclusive");
LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
@@ -421,7 +424,7 @@ static void settings_to_globals()
gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
- gMapScale = gSavedSettings.getF32("MapScale");
+ LLWorldMapView::sMapScale = gSavedSettings.getF32("MapScale");
LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
}
@@ -434,7 +437,7 @@ static void settings_modify()
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
-
+ gAuditTexture = gSavedSettings.getBOOL("AuditTexture");
#if LL_VECTORIZE
if (gSysCPU.hasAltivec())
{
@@ -555,7 +558,7 @@ LLAppViewer* LLAppViewer::sInstance = NULL;
const std::string LLAppViewer::sGlobalSettingsName = "Global";
LLTextureCache* LLAppViewer::sTextureCache = NULL;
-LLWorkerThread* LLAppViewer::sImageDecodeThread = NULL;
+LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
LLAppViewer::LLAppViewer() :
@@ -622,7 +625,19 @@ bool LLAppViewer::init()
if (!initConfiguration())
return false;
-
+
+ // Although initLogging() is the right place to mess with
+ // setFatalFunction(), we can't query gSavedSettings until after
+ // initConfiguration().
+ S32 rc(gSavedSettings.getS32("QAModeTermCode"));
+ if (rc >= 0)
+ {
+ // QAModeTermCode set, terminate with that rc on LL_ERRS. Use _exit()
+ // rather than exit() because normal cleanup depends too much on
+ // successful startup!
+ LLError::setFatalFunction(boost::bind(_exit, rc));
+ }
+
mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
// *NOTE:Mani - LLCurl::initClass is not thread safe.
@@ -634,12 +649,9 @@ bool LLAppViewer::init()
writeSystemInfo();
// Build a string representing the current version number.
- gCurrentVersion = llformat("%s %d.%d.%d.%d",
- gSavedSettings.getString("VersionChannelName").c_str(),
- LL_VERSION_MAJOR,
- LL_VERSION_MINOR,
- LL_VERSION_PATCH,
- LL_VERSION_BUILD );
+ gCurrentVersion = llformat("%s %s",
+ gSavedSettings.getString("VersionChannelName").c_str(),
+ LLVersionInfo::getVersion().c_str());
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -647,6 +659,9 @@ bool LLAppViewer::init()
//////////////////////////////////////////////////////////////////////////////
// *FIX: The following code isn't grouped into functions yet.
+ // Statistics / debug timer initialization
+ init_statistics();
+
//
// Various introspection concerning the libs we're using - particularly
// the libs involved in getting to a full login screen.
@@ -731,7 +746,15 @@ bool LLAppViewer::init()
LLViewerJointMesh::updateVectorize();
// load MIME type -> media impl mappings
- LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") );
+ std::string mime_types_name;
+#if LL_DARWIN
+ mime_types_name = "mime_types_mac.xml";
+#elif LL_LINUX
+ mime_types_name = "mime_types_linux.xml";
+#else
+ mime_types_name = "mime_types.xml";
+#endif
+ LLMIMETypes::parseMIMETypes( mime_types_name );
// Copy settings to globals. *TODO: Remove or move to appropriage class initializers
settings_to_globals();
@@ -785,13 +808,6 @@ bool LLAppViewer::init()
// call all self-registered classes
LLInitClassList::instance().fireCallbacks();
- #if LL_LCD_COMPILE
- // start up an LCD window on a logitech keyboard, if there is one
- HINSTANCE hInstance = GetModuleHandle(NULL);
- gLcdScreen = new LLLCD(hInstance);
- CreateLCDDebugWindows();
-#endif
-
LLFolderViewItem::initClass(); // SJB: Needs to happen after initWindow(), not sure why but related to fonts
gGLManager.getGLInfo(gDebugInfo);
@@ -859,7 +875,7 @@ bool LLAppViewer::init()
if (LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_UNKNOWN)
{
- LLNotifications::instance().add("UnknownGPU");
+ LLNotificationsUtil::add("UnknownGPU");
}
if(unsupported)
@@ -868,7 +884,7 @@ bool LLAppViewer::init()
|| gSavedSettings.getBOOL("WarnUnsupportedHardware"))
{
args["MINSPECS"] = minSpecs;
- LLNotifications::instance().add("UnsupportedHardware", args );
+ LLNotificationsUtil::add("UnsupportedHardware", args );
}
}
@@ -890,6 +906,8 @@ bool LLAppViewer::init()
loadEventHostModule(gSavedSettings.getS32("QAModeEventHostPort"));
}
+ LLViewerMedia::initClass();
+
return true;
}
@@ -898,6 +916,7 @@ static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");
static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread");
+static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");
static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");
static LLFastTimer::DeclareTimer FTM_IDLE("Idle");
static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
@@ -906,7 +925,6 @@ bool LLAppViewer::mainLoop()
{
LLMemType mt1(LLMemType::MTYPE_MAIN);
mMainloopTimeout = new LLWatchdogTimeout();
- // *FIX:Mani - Make this a setting, once new settings exist in this branch.
//-------------------------------------------
// Run main loop until time to quit
@@ -916,12 +934,13 @@ bool LLAppViewer::mainLoop()
gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
+ LLCurl::setSSLVerify(! gSavedSettings.getBOOL("NoVerifySSLCert"));
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
LLVoiceChannel::initClass();
LLVoiceClient::init(gServicePump);
-
+
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
@@ -971,7 +990,8 @@ bool LLAppViewer::mainLoop()
#endif
//memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->idle() ;
@@ -1113,6 +1133,10 @@ bool LLAppViewer::mainLoop()
LLFastTimer ftm(FTM_VFS);
io_pending += LLVFSThread::updateClass(1);
}
+ {
+ LLFastTimer ftm(FTM_LFS);
+ io_pending += LLLFSThread::updateClass(1);
+ }
if (io_pending > 1000)
{
@@ -1157,7 +1181,8 @@ bool LLAppViewer::mainLoop()
catch(std::bad_alloc)
{
//stop memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->stop() ;
@@ -1185,7 +1210,8 @@ bool LLAppViewer::mainLoop()
llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
//stop memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->stop() ;
@@ -1328,9 +1354,6 @@ bool LLAppViewer::cleanup()
llinfos << "Cache files removed" << llendflush;
-
- cleanup_menus();
-
// Wait for any pending VFS IO
while (1)
{
@@ -1343,19 +1366,25 @@ bool LLAppViewer::cleanup()
llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
ms_sleep(100);
}
- llinfos << "Shutting down." << llendflush;
+ llinfos << "Shutting down Views" << llendflush;
// Destroy the UI
if( gViewerWindow)
gViewerWindow->shutdownViews();
+
+ llinfos << "Cleaning up Inventory" << llendflush;
// Cleanup Inventory after the UI since it will delete any remaining observers
// (Deleted observers should have already removed themselves)
gInventory.cleanupInventory();
+
+ llinfos << "Cleaning up Selections" << llendflush;
// Clean up selection managers after UI is destroyed, as UI may be observing them.
// Clean up before GL is shut down because we might be holding on to objects with texture references
LLSelectMgr::cleanupGlobals();
+
+ llinfos << "Shutting down OpenGL" << llendflush;
// Shut down OpenGL
if( gViewerWindow)
@@ -1369,11 +1398,18 @@ bool LLAppViewer::cleanup()
gViewerWindow = NULL;
llinfos << "ViewerWindow deleted" << llendflush;
}
+
+ llinfos << "Cleaning up Keyboard & Joystick" << llendflush;
// viewer UI relies on keyboard so keep it aound until viewer UI isa gone
delete gKeyboard;
gKeyboard = NULL;
+ // Turn off Space Navigator and similar devices
+ LLViewerJoystick::getInstance()->terminate();
+
+ llinfos << "Cleaning up Objects" << llendflush;
+
LLViewerObject::cleanupVOClasses();
LLWaterParamManager::cleanupClass();
@@ -1396,6 +1432,8 @@ bool LLAppViewer::cleanup()
}
LLPrimitive::cleanupVolumeManager();
+ llinfos << "Additional Cleanup..." << llendflush;
+
LLViewerParcelMgr::cleanupGlobals();
// *Note: this is where gViewerStats used to be deleted.
@@ -1415,9 +1453,11 @@ bool LLAppViewer::cleanup()
// Also after shutting down the messaging system since it has VFS dependencies
//
+ llinfos << "Cleaning up VFS" << llendflush;
LLVFile::cleanupClass();
- llinfos << "VFS cleaned up" << llendflush;
+ llinfos << "Saving Data" << llendflush;
+
// Quitting with "Remember Password" turned off should always stomp your
// saved password, whether or not you successfully logged in. JC
if (!gSavedSettings.getBOOL("RememberPassword"))
@@ -1434,10 +1474,17 @@ bool LLAppViewer::cleanup()
LLUIColorTable::instance().saveUserSettings();
- // PerAccountSettingsFile should be empty if no use has been logged on.
+ // PerAccountSettingsFile should be empty if no user has been logged on.
// *FIX:Mani This should get really saved in a "logoff" mode.
- gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
- llinfos << "Saved settings" << llendflush;
+ if (gSavedSettings.getString("PerAccountSettingsFile").empty())
+ {
+ llinfos << "Not saving per-account settings; don't know the account name yet." << llendl;
+ }
+ else
+ {
+ gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
+ llinfos << "Saved settings" << llendflush;
+ }
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
// save all settings, even if equals defaults
@@ -1459,13 +1506,16 @@ bool LLAppViewer::cleanup()
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
}
- // Turn off Space Navigator and similar devices
- LLViewerJoystick::getInstance()->terminate();
-
removeMarkerFile(); // Any crashes from here on we'll just have to ignore
writeDebugInfo();
+ LLLocationHistory::getInstance()->save();
+
+ LLAvatarIconIDCache::getInstance()->save();
+
+ llinfos << "Shutting down Threads" << llendflush;
+
// Let threads finish
LLTimer idleTimer;
idleTimer.reset();
@@ -1498,14 +1548,9 @@ bool LLAppViewer::cleanup()
sTextureFetch = NULL;
delete sImageDecodeThread;
sImageDecodeThread = NULL;
-
- LLLocationHistory::getInstance()->save();
-
- LLAvatarIconIDCache::getInstance()->save();
-
delete mFastTimerLogThread;
mFastTimerLogThread = NULL;
-
+
if (LLFastTimerView::sAnalyzePerformance)
{
llinfos << "Analyzing performance" << llendl;
@@ -1527,6 +1572,8 @@ bool LLAppViewer::cleanup()
}
LLMetricPerformanceTester::cleanClass() ;
+ llinfos << "Cleaning up Media and Textures" << llendflush;
+
//Note:
//LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown()
//because some new image might be generated during cleaning up media. --bao
@@ -1540,13 +1587,13 @@ bool LLAppViewer::cleanup()
LLVFSThread::cleanupClass();
LLLFSThread::cleanupClass();
- llinfos << "VFS Thread finished" << llendflush;
-
#ifndef LL_RELEASE_FOR_DOWNLOAD
llinfos << "Auditing VFS" << llendl;
gVFS->audit();
#endif
+ llinfos << "Misc Cleanup" << llendflush;
+
// For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
// (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
delete gStaticVFS;
@@ -1560,12 +1607,11 @@ bool LLAppViewer::cleanup()
LLWatchdog::getInstance()->cleanup();
+ llinfos << "Shutting down message system" << llendflush;
end_messaging_system();
- llinfos << "Message system deleted." << llendflush;
// *NOTE:Mani - The following call is not thread safe.
LLCurl::cleanupClass();
- llinfos << "LLCurl cleaned up." << llendflush;
// If we're exiting to launch an URL, do that here so the screen
// is at the right resolution before we launch IE.
@@ -1586,7 +1632,7 @@ bool LLAppViewer::cleanup()
ll_close_fail_log();
- llinfos << "Goodbye" << llendflush;
+ llinfos << "Goodbye!" << llendflush;
// return 0;
return true;
@@ -1627,14 +1673,14 @@ bool LLAppViewer::initThreads()
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
- LLVFSThread::initClass(enable_threads && true);
- LLLFSThread::initClass(enable_threads && true);
+ LLVFSThread::initClass(enable_threads && false);
+ LLLFSThread::initClass(enable_threads && false);
// Image decoding
- LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
+ LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
- LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
- LLImage::initClass(LLAppViewer::getImageDecodeThread());
+ LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
+ LLImage::initClass();
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
{
@@ -1667,7 +1713,7 @@ bool LLAppViewer::initLogging()
LLError::initForApplication(
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
LLError::setFatalFunction(errorCallback);
-
+
// Remove the last ".old" log file.
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
"SecondLife.old");
@@ -1838,7 +1884,7 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setString("ClientSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global")));
- gSavedSettings.setString("VersionChannelName", LL_CHANNEL);
+ gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel());
#ifndef LL_RELEASE_FOR_DOWNLOAD
// provide developer build only overrides for these control variables that are not
@@ -1872,26 +1918,24 @@ bool LLAppViewer::initConfiguration()
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
// for disable/reset ability
- LLFirstUse::addConfigVariable("FirstBalanceIncrease");
- LLFirstUse::addConfigVariable("FirstBalanceDecrease");
- LLFirstUse::addConfigVariable("FirstSit");
- LLFirstUse::addConfigVariable("FirstMap");
- LLFirstUse::addConfigVariable("FirstGoTo");
- LLFirstUse::addConfigVariable("FirstBuild");
+// LLFirstUse::addConfigVariable("FirstBalanceIncrease");
+// LLFirstUse::addConfigVariable("FirstBalanceDecrease");
+// LLFirstUse::addConfigVariable("FirstSit");
+// LLFirstUse::addConfigVariable("FirstMap");
+// LLFirstUse::addConfigVariable("FirstGoTo");
+// LLFirstUse::addConfigVariable("FirstBuild");
// LLFirstUse::addConfigVariable("FirstLeftClickNoHit");
- LLFirstUse::addConfigVariable("FirstTeleport");
- LLFirstUse::addConfigVariable("FirstOverrideKeys");
- LLFirstUse::addConfigVariable("FirstAttach");
- LLFirstUse::addConfigVariable("FirstAppearance");
- LLFirstUse::addConfigVariable("FirstInventory");
- LLFirstUse::addConfigVariable("FirstSandbox");
- LLFirstUse::addConfigVariable("FirstFlexible");
- LLFirstUse::addConfigVariable("FirstDebugMenus");
- LLFirstUse::addConfigVariable("FirstStreamingMusic");
- LLFirstUse::addConfigVariable("FirstStreamingVideo");
- LLFirstUse::addConfigVariable("FirstSculptedPrim");
- LLFirstUse::addConfigVariable("FirstVoice");
- LLFirstUse::addConfigVariable("FirstMedia");
+// LLFirstUse::addConfigVariable("FirstTeleport");
+// LLFirstUse::addConfigVariable("FirstOverrideKeys");
+// LLFirstUse::addConfigVariable("FirstAttach");
+// LLFirstUse::addConfigVariable("FirstAppearance");
+// LLFirstUse::addConfigVariable("FirstInventory");
+// LLFirstUse::addConfigVariable("FirstSandbox");
+// LLFirstUse::addConfigVariable("FirstFlexible");
+// LLFirstUse::addConfigVariable("FirstDebugMenus");
+// LLFirstUse::addConfigVariable("FirstSculptedPrim");
+// LLFirstUse::addConfigVariable("FirstVoice");
+// LLFirstUse::addConfigVariable("FirstMedia");
// - read command line settings.
LLControlGroupCLP clp;
@@ -2318,9 +2362,6 @@ bool LLAppViewer::initWindow()
// store setting in a global for easy access and modification
gNoRender = gSavedSettings.getBOOL("DisableRendering");
- // Hide the splash screen
- LLSplashScreen::hide();
-
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
gViewerWindow = new LLViewerWindow(gWindowTitle,
@@ -2328,6 +2369,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
FALSE, ignorePixelDepth);
+
+ LLNotificationsUI::LLNotificationManager::getInstance();
if (gSavedSettings.getBOOL("WindowFullScreen"))
{
@@ -2427,7 +2470,7 @@ void LLAppViewer::cleanupSavedSettings()
}
}
- gSavedSettings.setF32("MapScale", gMapScale );
+ gSavedSettings.setF32("MapScale", LLWorldMapView::sMapScale );
// Some things are cached in LLAgent.
if (gAgent.mInitialized)
@@ -2447,10 +2490,10 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["SLLog"] = LLError::logFileName();
gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
- gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
- gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
- gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
- gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
+ gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();
+ gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor();
+ gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch();
+ gDebugInfo["ClientInfo"]["BuildVersion"] = LLVersionInfo::getBuild();
gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
@@ -2484,8 +2527,7 @@ void LLAppViewer::writeSystemInfo()
// Dump some debugging info
LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME")
- << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
- << LL_ENDL;
+ << " version " << LLVersionInfo::getShortVersion() << LL_ENDL;
// Dump the local time and time zone
time_t now;
@@ -2539,10 +2581,10 @@ void LLAppViewer::handleViewerCrash()
//to check against no matter what
gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
- gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
- gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
- gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
- gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
+ gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();
+ gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor();
+ gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch();
+ gDebugInfo["ClientInfo"]["BuildVersion"] = LLVersionInfo::getBuild();
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if ( parcel && parcel->getMusicURL()[0])
@@ -2635,7 +2677,7 @@ void LLAppViewer::handleViewerCrash()
gMessageSystem->stopLogging();
}
- LLWorld::getInstance()->getInfo(gDebugInfo);
+ if (LLWorld::instanceExists()) LLWorld::getInstance()->getInfo(gDebugInfo);
// Close the debug file
pApp->writeDebugInfo();
@@ -2753,7 +2795,7 @@ void LLAppViewer::initMarkerFile()
// Create the marker file for this execution & lock it
apr_status_t s;
- s = mMarkerFile.open(mMarkerFileName, LL_APR_W, gAPRPoolp);
+ s = mMarkerFile.open(mMarkerFileName, LL_APR_W, TRUE);
if (s == APR_SUCCESS && mMarkerFile.getFileHandle())
{
@@ -2821,6 +2863,8 @@ void LLAppViewer::requestQuit()
gFloaterView->closeAllChildren(true);
}
+ LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit"));
+
send_stats();
gLogoutTimer.reset();
@@ -2829,7 +2873,7 @@ void LLAppViewer::requestQuit()
static bool finish_quit(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
@@ -2841,7 +2885,14 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
void LLAppViewer::userQuit()
{
- LLNotifications::instance().add("ConfirmQuit");
+ if (gDisconnected)
+ {
+ requestQuit();
+ }
+ else
+ {
+ LLNotificationsUtil::add("ConfirmQuit");
+ }
}
static bool finish_early_exit(const LLSD& notification, const LLSD& response)
@@ -2854,7 +2905,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)
{
llwarns << "app_early_exit: " << name << llendl;
gDoDisconnect = TRUE;
- LLNotifications::instance().add(name, substitutions, LLSD(), finish_early_exit);
+ LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit);
}
void LLAppViewer::forceExit(S32 arg)
@@ -2953,7 +3004,7 @@ bool LLAppViewer::initCache()
// Purge cache if it belongs to an old version
else
{
- static const S32 cache_version = 5;
+ static const S32 cache_version = 6;
if (gSavedSettings.getS32("LocalCacheVersion") != cache_version)
{
mPurgeCache = true;
@@ -3172,7 +3223,7 @@ std::string LLAppViewer::getWindowTitle() const
// Callback from a dialog indicating user was logged out.
bool finish_disconnect(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (1 == option)
{
@@ -3212,12 +3263,12 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)
{
// Tell users what happened
args["ERROR_MESSAGE"] = big_reason;
- LLNotifications::instance().add("ErrorMessage", args, LLSD(), &finish_forced_disconnect);
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), &finish_forced_disconnect);
}
else
{
args["MESSAGE"] = big_reason;
- LLNotifications::instance().add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
+ LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
}
}
@@ -3270,7 +3321,7 @@ void LLAppViewer::saveFinalSnapshot()
snap_filename += gDirUtilp->getDirDelimiter();
snap_filename += SCREEN_LAST_FILENAME;
// use full pixel dimensions of viewer window (not post-scale dimensions)
- gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, TRUE);
+ gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, TRUE);
mSavedFinalSnapshot = TRUE;
}
}
@@ -3518,6 +3569,7 @@ void LLAppViewer::idle()
gEventNotifier.update();
gIdleCallbacks.callFunctions();
+ gInventory.idleNotifyObservers();
}
if (gDisconnected)
@@ -3724,6 +3776,13 @@ void LLAppViewer::idleShutdown()
{
return;
}
+
+ if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit")))
+ {
+ return;
+ }
+
+
// ProductEngine: Try moving this code to where we shut down sTextureCache in cleanup()
// *TODO: ugly
@@ -4115,10 +4174,10 @@ void LLAppViewer::handleLoginComplete()
// Store some data to DebugInfo in case of a freeze.
gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
- gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
- gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
- gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
- gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
+ gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();
+ gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor();
+ gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch();
+ gDebugInfo["ClientInfo"]["BuildVersion"] = LLVersionInfo::getBuild();
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if ( parcel && parcel->getMusicURL()[0])
@@ -4169,7 +4228,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
if(dso_path == "")
{
- llwarns << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl;
+ llerrs << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl;
return;
}
@@ -4197,7 +4256,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
if(status != 0)
{
- llwarns << "problem loading eventhost plugin, status: " << status << llendl;
+ llerrs << "problem loading eventhost plugin, status: " << status << llendl;
}
mPlugins.insert(eventhost_dso_handle);
@@ -4345,3 +4404,15 @@ void LLAppViewer::launchUpdater()
// LLAppViewer::instance()->forceQuit();
}
+
+//virtual
+void LLAppViewer::setMasterSystemAudioMute(bool mute)
+{
+ gSavedSettings.setBOOL("MuteAudio", mute);
+}
+
+//virtual
+bool LLAppViewer::getMasterSystemAudioMute()
+{
+ return gSavedSettings.getBOOL("MuteAudio");
+}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index d970aa6ae1..a915b7fa50 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -36,20 +36,19 @@
#include "llallocator.h"
#include "llcontrol.h"
#include "llsys.h" // for LLOSInfo
+#include "lltimer.h"
class LLCommandLineParser;
class LLFrameTimer;
class LLPumpIO;
class LLTextureCache;
+class LLImageDecodeThread;
class LLTextureFetch;
-class LLTimer;
-class LLVFS;
class LLWatchdogTimeout;
-class LLWorkerThread;
+class LLCommandLineParser;
struct apr_dso_handle_t;
-
class LLAppViewer : public LLApp
{
public:
@@ -100,7 +99,7 @@ public:
// Thread accessors
static LLTextureCache* getTextureCache() { return sTextureCache; }
- static LLWorkerThread* getImageDecodeThread() { return sImageDecodeThread; }
+ static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
const std::string& getSerialNumber() { return mSerialNumber; }
@@ -170,6 +169,10 @@ public:
void purgeCache(); // Clear the local cache.
+ // mute/unmute the system's master audio
+ virtual void setMasterSystemAudioMute(bool mute);
+ virtual bool getMasterSystemAudioMute();
+
protected:
virtual bool initWindow(); // Initialize the viewer's window.
virtual bool initLogging(); // Initialize log files, logging system, return false on failure.
@@ -232,7 +235,7 @@ private:
// Thread objects.
static LLTextureCache* sTextureCache;
- static LLWorkerThread* sImageDecodeThread;
+ static LLImageDecodeThread* sImageDecodeThread;
static LLTextureFetch* sTextureFetch;
S32 mNumSessions;
@@ -301,10 +304,6 @@ extern U32 gForegroundFrameCount;
extern LLPumpIO* gServicePump;
-// Is the Pacific time zone (aka server time zone)
-// currently in daylight savings time?
-extern BOOL gPacificDaylightTime;
-
extern U64 gFrameTime; // The timestamp of the most-recently-processed frame
extern F32 gFrameTimeSeconds; // Loses msec precision after ~4.5 hours...
extern F32 gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds
@@ -324,9 +323,6 @@ extern F32 gSimFrames;
extern BOOL gDisconnected;
-// Map scale in pixels per region
-extern F32 gMapScale;
-
extern LLFrameTimer gRestoreGLTimer;
extern BOOL gRestoreGL;
extern BOOL gUseWireframe;
@@ -334,6 +330,7 @@ extern BOOL gUseWireframe;
// VFS globals - gVFS is for general use
// gStaticVFS is read-only and is shipped w/ the viewer
// it has pre-cache data like the UI .TGAs
+class LLVFS;
extern LLVFS *gStaticVFS;
extern LLMemoryInfo gSysMemory;
diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp
index 3259309eee..adb5f43c1a 100644
--- a/indra/newview/llappviewerlistener.cpp
+++ b/indra/newview/llappviewerlistener.cpp
@@ -19,14 +19,18 @@
// other Linden headers
#include "llappviewer.h"
-LLAppViewerListener::LLAppViewerListener(const std::string& pumpname,
- const LLAppViewerGetter& getter):
- LLDispatchListener(pumpname, "op"),
+LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
+ LLEventAPI("LLAppViewer",
+ "LLAppViewer listener to (e.g.) request shutdown"),
mAppViewerGetter(getter)
{
// add() every method we want to be able to invoke via this event API.
- add("requestQuit", &LLAppViewerListener::requestQuit);
- add("forceQuit", &LLAppViewerListener::forceQuit);
+ add("requestQuit",
+ "Ask to quit nicely",
+ &LLAppViewerListener::requestQuit);
+ add("forceQuit",
+ "Quit abruptly",
+ &LLAppViewerListener::forceQuit);
}
void LLAppViewerListener::requestQuit(const LLSD& event)
diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h
index 73227cb95a..deedcbc179 100644
--- a/indra/newview/llappviewerlistener.h
+++ b/indra/newview/llappviewerlistener.h
@@ -12,20 +12,19 @@
#if ! defined(LL_LLAPPVIEWERLISTENER_H)
#define LL_LLAPPVIEWERLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
#include <boost/function.hpp>
class LLAppViewer;
class LLSD;
/// Listen on an LLEventPump with specified name for LLAppViewer request events.
-class LLAppViewerListener: public LLDispatchListener
+class LLAppViewerListener: public LLEventAPI
{
public:
typedef boost::function<LLAppViewer*(void)> LLAppViewerGetter;
- /// Specify the pump name on which to listen, and bind the LLAppViewer
- /// instance to use (e.g. LLAppViewer::instance()).
- LLAppViewerListener(const std::string& pumpname, const LLAppViewerGetter& getter);
+ /// Bind the LLAppViewer instance to use (e.g. LLAppViewer::instance()).
+ LLAppViewerListener(const LLAppViewerGetter& getter);
private:
void requestQuit(const LLSD& event);
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 1282e437f2..f8f8f50cd6 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -50,6 +50,7 @@
#include <Carbon/Carbon.h>
#include "lldir.h"
#include <signal.h>
+#include <CoreAudio/CoreAudio.h> // for systemwide mute
class LLMediaCtrl; // for LLURLDispatcher
namespace
@@ -444,6 +445,59 @@ std::string LLAppViewerMacOSX::generateSerialNumber()
return serial_md5;
}
+static AudioDeviceID get_default_audio_output_device(void)
+{
+ AudioDeviceID device = 0;
+ UInt32 size;
+ OSStatus err;
+
+ size = sizeof(device);
+ err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device);
+ if(err != noErr)
+ {
+ LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL;
+ }
+
+ return device;
+}
+
+//virtual
+void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute)
+{
+ AudioDeviceID device = get_default_audio_output_device();
+
+ if(device != 0)
+ {
+ UInt32 mute = new_mute;
+ OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute);
+ if(err != noErr)
+ {
+ LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
+ }
+ }
+}
+
+//virtual
+bool LLAppViewerMacOSX::getMasterSystemAudioMute()
+{
+ // Assume the system isn't muted
+ UInt32 mute = 0;
+
+ AudioDeviceID device = get_default_audio_output_device();
+
+ if(device != 0)
+ {
+ UInt32 size = sizeof(mute);
+ OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute);
+ if(err != noErr)
+ {
+ LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
+ }
+ }
+
+ return (mute != 0);
+}
+
OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
{
OSErr result = noErr;
diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h
index bc841fc3a7..cbf7e6c209 100644
--- a/indra/newview/llappviewermacosx.h
+++ b/indra/newview/llappviewermacosx.h
@@ -48,6 +48,9 @@ public:
//
virtual bool init(); // Override to do application initialization
+ // mute/unmute the system's master audio
+ virtual void setMasterSystemAudioMute(bool mute);
+ virtual bool getMasterSystemAudioMute();
protected:
virtual bool restoreErrorTrap();
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index cd3963050f..a2322e28b4 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -39,9 +39,8 @@
#include "llcompilequeue.h"
#include "llfloaterbuycurrency.h"
#include "llfilepicker.h"
-#include "llnotify.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "llpermissionsflags.h"
#include "llpreviewnotecard.h"
#include "llpreviewscript.h"
@@ -62,6 +61,7 @@
#include "lleconomy.h"
#include "llfloaterreg.h"
#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llsdserialize.h"
#include "llvfs.h"
@@ -119,14 +119,14 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = "Error in upload request. Please visit "
"http://secondlife.com/support for help fixing this problem.";
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
break;
case 500:
default:
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = "The server is experiencing unexpected "
"difficulties.";
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
break;
}
LLUploadDialog::modalUploadFinished();
@@ -188,7 +188,7 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
LLSD args;
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = content["message"].asString();
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
}
}
@@ -231,7 +231,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLSD args;
args["AMOUNT"] = llformat("%d", expected_upload_cost);
- LLNotifications::instance().add("UploadPayment", args);
+ LLNotificationsUtil::add("UploadPayment", args);
}
// Actually add the upload to viewer inventory
@@ -285,19 +285,18 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Show the preview panel for textures and sounds to let
// user know that the image (or snapshot) arrived intact.
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
-
- view->getPanel()->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
+ active_panel->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
&& LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
{
- view->getPanel()->openSelected();
+ active_panel->openSelected();
}
//LLFloaterInventory::dumpSelectionInformation((void*)view);
// restore keyboard focus
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
gFocusMgr.setKeyboardFocus(focus);
}
}
@@ -333,7 +332,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
upload_new_resource(next_file, asset_name, asset_name,
- 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+ 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
next_owner_perms, group_perms,
everyone_perms, display_name,
callback, expected_upload_cost, userdata);
@@ -368,7 +367,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
- llinfos << "LLSendTexLayerResponder::result from capabilities: " << result << llendl;
+ llinfos << "result: " << result << "new_id:" << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
@@ -382,6 +381,14 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
}
}
+void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
+{
+ llinfos << "status: " << statusNum << " reason: " << reason << llendl;
+
+ // Invoke the original callback with an error result
+ LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
+ mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
+}
LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
const LLUUID& vfile_id,
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index a08d70213c..e656351305 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -84,6 +84,7 @@ public:
~LLSendTexLayerResponder();
virtual void uploadComplete(const LLSD& content);
+ virtual void error(U32 statusNum, const std::string& reason);
LLBakedUploadData * mBakedUploadData;
};
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 2f67401301..1d75374930 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -38,6 +38,7 @@
#include "llsd.h"
#include "lldarray.h"
#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "roles_constants.h" // for GP_MEMBER_INVITE
@@ -54,17 +55,20 @@
#include "llmutelist.h"
#include "llrecentpeople.h"
#include "llsidetray.h"
+#include "lltrans.h"
#include "llviewerobjectlist.h"
#include "llviewermessage.h" // for handle_lure
#include "llviewerregion.h"
-
+#include "llimfloater.h"
+#include "lltrans.h"
+#include "llcallingcard.h"
// static
void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
{
if(id == gAgentID)
{
- LLNotifications::instance().add("AddSelfFriend");
+ LLNotificationsUtil::add("AddSelfFriend");
return;
}
@@ -78,11 +82,11 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin
{
// Old and busted server version, doesn't support friend
// requests with messages.
- LLNotifications::instance().add("AddFriend", args, payload, &callbackAddFriend);
+ LLNotificationsUtil::add("AddFriend", args, payload, &callbackAddFriend);
}
else
{
- LLNotifications::instance().add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);
+ LLNotificationsUtil::add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);
}
// add friend to recent people list
@@ -144,7 +148,7 @@ void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)
payload["ids"].append(*it);
}
- LLNotifications::instance().add(msgType,
+ LLNotificationsUtil::add(msgType,
args,
payload,
&handleRemove);
@@ -164,8 +168,10 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)
// static
void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids)
{
- if (ids.size() > 0)
- handle_lure(ids);
+ if (ids.size() == 0)
+ return;
+
+ handle_lure(ids);
}
// static
@@ -175,11 +181,101 @@ void LLAvatarActions::startIM(const LLUUID& id)
return;
std::string name;
+ if (!gCacheName->getFullName(id, name))
+ {
+ gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id));
+ return;
+ }
+
+ LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
+ if (session_id != LLUUID::null)
+ {
+ LLIMFloater::show(session_id);
+ }
+ make_ui_sound("UISndStartIM");
+}
+
+// static
+void LLAvatarActions::endIM(const LLUUID& id)
+{
+ if (id.isNull())
+ return;
+
+ LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
+ if (session_id != LLUUID::null)
+ {
+ gIMMgr->leaveSession(session_id);
+ }
+}
+
+// static
+void LLAvatarActions::startCall(const LLUUID& id)
+{
+ if (id.isNull())
+ {
+ return;
+ }
+
+ std::string name;
gCacheName->getFullName(id, name);
- gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
+ LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
+ if (session_id != LLUUID::null)
+ {
+ gIMMgr->startCall(session_id);
+ }
+ make_ui_sound("UISndStartIM");
+}
+
+// static
+void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
+{
+ if (ids.size() == 0)
+ {
+ return;
+ }
+
+ // convert vector into LLDynamicArray for addSession
+ LLDynamicArray<LLUUID> id_array;
+ for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ id_array.push_back(*it);
+ }
+
+ // create the new ad hoc voice session
+ const std::string title = LLTrans::getString("conference-title");
+ LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
+ ids[0], id_array, true);
+ if (session_id == LLUUID::null)
+ {
+ return;
+ }
+
+ gIMMgr->autoStartCallOnStartup(session_id);
+
make_ui_sound("UISndStartIM");
}
+/* AD *TODO: Is this function needed any more?
+ I fixed it a bit(added check for canCall), but it appears that it is not used
+ anywhere. Maybe it should be removed?
+// static
+bool LLAvatarActions::isCalling(const LLUUID &id)
+{
+ if (id.isNull() || !canCall())
+ {
+ return false;
+ }
+
+ LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
+ return (LLIMModel::getInstance()->findIMSession(session_id) != NULL);
+}*/
+
+//static
+bool LLAvatarActions::canCall()
+{
+ return LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+}
+
// static
void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
{
@@ -189,7 +285,12 @@ void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
{
id_array.push_back(*it);
}
- gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array);
+ const std::string title = LLTrans::getString("conference-title");
+ LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, ids[0], id_array);
+ if (session_id != LLUUID::null)
+ {
+ LLIMFloater::show(session_id);
+ }
make_ui_sound("UISndStartIM");
}
@@ -205,7 +306,7 @@ void LLAvatarActions::showProfile(const LLUUID& id)
//Show own profile
if(gAgent.getID() == id)
{
- LLSideTray::getInstance()->showPanel("panel_me_profile", params);
+ LLSideTray::getInstance()->showPanel("panel_me", params);
}
//Show other user profile
else
@@ -233,6 +334,75 @@ void LLAvatarActions::pay(const LLUUID& id)
}
// static
+void LLAvatarActions::kick(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
+}
+
+// static
+void LLAvatarActions::freeze(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
+}
+
+// static
+void LLAvatarActions::unfreeze(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, handleUnfreeze);
+}
+
+//static
+void LLAvatarActions::csr(const LLUUID& id, std::string name)
+{
+ if (name.empty()) return;
+
+ std::string url = "http://csr.lindenlab.com/agent/";
+
+ // slow and stupid, but it's late
+ S32 len = name.length();
+ for (S32 i = 0; i < len; i++)
+ {
+ if (name[i] == ' ')
+ {
+ url += "%20";
+ }
+ else
+ {
+ url += name[i];
+ }
+ }
+
+ LLWeb::loadURL(url);
+}
+
+//static
+void LLAvatarActions::share(const LLUUID& id)
+{
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+
+ LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id);
+
+ if (!gIMMgr->hasSession(session_id))
+ {
+ startIM(id);
+ }
+
+ if (gIMMgr->hasSession(session_id))
+ {
+ // we should always get here, but check to verify anyways
+ LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false);
+ }
+}
+
+// static
void LLAvatarActions::toggleBlock(const LLUUID& id)
{
std::string name;
@@ -255,9 +425,9 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
if (widget)
{
- widget->removeNoneOption();
widget->center();
widget->setPowersMask(GP_MEMBER_INVITE);
+ widget->removeNoneOption();
widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id));
}
}
@@ -267,7 +437,7 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
// static
bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
const LLSD& ids = notification["payload"]["ids"];
for (LLSD::array_const_iterator itr = ids.beginArray(); itr != ids.endArray(); ++itr)
@@ -301,7 +471,7 @@ bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& respons
// static
bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
gAgent.clearBusy();
@@ -324,7 +494,7 @@ void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id)
// static
bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
requestFriendship(notification["payload"]["id"].asUUID(),
@@ -335,15 +505,76 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con
}
// static
-bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
+bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_GodKickUser);
+ msg->nextBlockFast(_PREHASH_UserInfo);
+ msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_AgentID, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
+ msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_GodKickUser);
+ msg->nextBlockFast(_PREHASH_UserInfo);
+ msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_AgentID, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_FREEZE );
+ msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ std::string text = response["message"].asString();
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_GodKickUser);
+ msg->nextBlockFast(_PREHASH_UserInfo);
+ msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_AgentID, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE );
+ msg->addStringFast(_PREHASH_Reason, text );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+// static
+bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
// Servers older than 1.25 require the text of the message to be the
// calling card folder ID for the offering user. JC
LLUUID calling_card_folder_id =
- gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
std::string message = calling_card_folder_id.asString();
requestFriendship(notification["payload"]["id"].asUUID(),
notification["payload"]["name"].asString(),
@@ -355,13 +586,22 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
// static
void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
{
- LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+ const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
send_improved_im(target_id,
target_name,
message,
IM_ONLINE,
IM_FRIENDSHIP_OFFERED,
calling_card_folder_id);
+
+ LLSD args;
+ args["TO_NAME"] = target_name;
+
+ LLSD payload;
+ payload["from_id"] = target_id;
+ payload["SESSION_NAME"] = target_name;
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("FriendshipOffered", args, payload);
}
//static
@@ -377,3 +617,13 @@ bool LLAvatarActions::isBlocked(const LLUUID& id)
gCacheName->getFullName(id, name);
return LLMuteList::getInstance()->isMuted(id, name);
}
+
+// static
+bool LLAvatarActions::canBlock(const LLUUID& id)
+{
+ std::string firstname, lastname;
+ gCacheName->getName(id, firstname, lastname);
+ bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
+ bool is_self = id == gAgentID;
+ return !is_self && !is_linden;
+}
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 512f673b43..16a58718a2 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -33,6 +33,13 @@
#ifndef LL_LLAVATARACTIONS_H
#define LL_LLAVATARACTIONS_H
+#include "lldarray.h"
+#include "llsd.h"
+#include "lluuid.h"
+
+#include <string>
+#include <vector>
+
/**
* Friend-related actions (add, remove, offer teleport, etc)
*/
@@ -67,6 +74,21 @@ public:
static void startIM(const LLUUID& id);
/**
+ * End instant messaging session.
+ */
+ static void endIM(const LLUUID& id);
+
+ /**
+ * Start an avatar-to-avatar voice call with another user
+ */
+ static void startCall(const LLUUID& id);
+
+ /**
+ * Start an ad-hoc conference voice call with multiple users
+ */
+ static void startAdhocCall(const std::vector<LLUUID>& ids);
+
+ /**
* Start conference chat with the given avatars.
*/
static void startConference(const std::vector<LLUUID>& ids);
@@ -82,6 +104,11 @@ public:
static void pay(const LLUUID& id);
/**
+ * Share items with the avatar.
+ */
+ static void share(const LLUUID& id);
+
+ /**
* Block/unblock the avatar.
*/
static void toggleBlock(const LLUUID& id);
@@ -97,15 +124,57 @@ public:
static bool isBlocked(const LLUUID& id);
/**
+ * @return true if you can block the avatar
+ */
+ static bool canBlock(const LLUUID& id);
+
+ /**
+ * Return true if the avatar is in a P2P voice call with a given user
+ */
+ /* AD *TODO: Is this function needed any more?
+ I fixed it a bit(added check for canCall), but it appears that it is not used
+ anywhere. Maybe it should be removed?
+ static bool isCalling(const LLUUID &id);*/
+
+ /**
+ * @return true if call to the resident can be made
+ */
+
+ static bool canCall();
+ /**
* Invite avatar to a group.
*/
static void inviteToGroup(const LLUUID& id);
+ /**
+ * Kick avatar off grid
+ */
+ static void kick(const LLUUID& id);
+
+ /**
+ * Freeze avatar
+ */
+ static void freeze(const LLUUID& id);
+
+ /**
+ * Unfreeze avatar
+ */
+ static void unfreeze(const LLUUID& id);
+
+ /**
+ * Open csr page for avatar
+ */
+ static void csr(const LLUUID& id, std::string name);
+
+
private:
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
static bool handleRemove(const LLSD& notification, const LLSD& response);
static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
+ static bool handleKick(const LLSD& notification, const LLSD& response);
+ static bool handleFreeze(const LLSD& notification, const LLSD& response);
+ static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
static void callback_invite_to_group(LLUUID group_id, LLUUID id);
// Just request friendship, no dialog.
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index ebcda13dd4..87b8d807c4 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -38,12 +38,12 @@
#include "llavatarconstants.h"
#include "llcallingcard.h" // for LLAvatarTracker
#include "llavataractions.h"
-#include "llimview.h"
#include "llmenugl.h"
#include "lluictrlfactory.h"
#include "llcachename.h"
#include "llagentdata.h"
+#include "llimfloater.h"
#define MENU_ITEM_VIEW_PROFILE 0
#define MENU_ITEM_SEND_IM 1
@@ -64,7 +64,7 @@ void LLAvatarIconIDCache::load ()
llinfos << "Loading avatar icon id cache." << llendl;
// build filename for each user
- std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
+ std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);
llifstream file(resolved_filename);
if (!file.is_open())
@@ -97,7 +97,7 @@ void LLAvatarIconIDCache::load ()
void LLAvatarIconIDCache::save ()
{
- std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
+ std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);
// open a file for writing
llofstream file (resolved_filename);
@@ -142,7 +142,8 @@ void LLAvatarIconIDCache::remove (const LLUUID& avatar_id)
LLAvatarIconCtrl::Params::Params()
: avatar_id("avatar_id"),
- draw_tooltip("draw_tooltip", true)
+ draw_tooltip("draw_tooltip", true),
+ default_icon_name("default_icon_name")
{
name = "avatar_icon";
}
@@ -150,11 +151,14 @@ LLAvatarIconCtrl::Params::Params()
LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
: LLIconCtrl(p),
- mDrawTooltip(p.draw_tooltip)
+ mDrawTooltip(p.draw_tooltip),
+ mDefaultIconName(p.default_icon_name)
{
mPriority = LLViewerFetchedTexture::BOOST_ICON;
LLRect rect = p.rect;
+ mDrawWidth = llmax(32, rect.getWidth()) ;
+ mDrawHeight = llmax(32, rect.getHeight()) ;
static LLUICachedControl<S32> llavatariconctrl_symbol_hpad("UIAvatariconctrlSymbolHPad", 2);
static LLUICachedControl<S32> llavatariconctrl_symbol_vpad("UIAvatariconctrlSymbolVPad", 2);
@@ -190,17 +194,8 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
}
else
{
- LLIconCtrl::setValue("default_profile_picture.j2c");
+ LLIconCtrl::setValue(mDefaultIconName);
}
-
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-
- registrar.add("AvatarIcon.Action", boost::bind(&LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked, this, _2));
-
- LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
- mPopupMenuHandle = menu->getHandle();
}
LLAvatarIconCtrl::~LLAvatarIconCtrl()
@@ -210,8 +205,6 @@ LLAvatarIconCtrl::~LLAvatarIconCtrl()
LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this);
// Name callbacks will be automatically disconnected since LLUICtrl is trackable
}
-
- LLView::deleteViewByHandle(mPopupMenuHandle);
}
//virtual
@@ -240,6 +233,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
// Check if cache already contains image_id for that avatar
if (!updateFromCache())
{
+ LLIconCtrl::setValue(mDefaultIconName);
app->addObserver(mAvatarId, this);
app->sendAvatarPropertiesRequest(mAvatarId);
}
@@ -268,7 +262,7 @@ bool LLAvatarIconCtrl::updateFromCache()
}
else
{
- LLIconCtrl::setValue("default_profile_picture.j2c");
+ LLIconCtrl::setValue(mDefaultIconName);
}
return true;
@@ -293,32 +287,6 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
}
}
-BOOL LLAvatarIconCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
-
- if(menu)
- {
- bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarId) != NULL;
-
- menu->setItemEnabled("Add Friend", !is_friend);
- menu->setItemEnabled("Remove Friend", is_friend);
-
- if(gAgentID == mAvatarId)
- {
- menu->setItemEnabled("Add Friend", false);
- menu->setItemEnabled("Send IM", false);
- menu->setItemEnabled("Remove Friend", false);
- }
-
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
- LLMenuGL::showPopup(this, menu, x, y);
- }
-
- return TRUE;
-}
-
void LLAvatarIconCtrl::nameUpdatedCallback(
const LLUUID& id,
const std::string& first,
@@ -334,38 +302,9 @@ void LLAvatarIconCtrl::nameUpdatedCallback(
{
setToolTip(mFirstName + " " + mLastName);
}
- }
-}
-
-void LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked(const LLSD& userdata)
-{
- std::string level = userdata.asString();
- LLUUID id = getAvatarId();
-
- if (level == "profile")
- {
- LLAvatarActions::showProfile(id);
- }
- else if (level == "im")
- {
- std::string name;
- name.assign(getFirstName());
- name.append(" ");
- name.append(getLastName());
-
- gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
- }
- else if (level == "add")
- {
- std::string name;
- name.assign(getFirstName());
- name.append(" ");
- name.append(getLastName());
-
- LLAvatarActions::requestFriendshipDialog(id, name);
- }
- else if (level == "remove")
- {
- LLAvatarActions::removeFriendDialog(id);
+ else
+ {
+ setToolTip(std::string(""));
+ }
}
}
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 65b5c86ed5..38616b7852 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -74,6 +74,7 @@ public:
{
Optional <LLUUID> avatar_id;
Optional <bool> draw_tooltip;
+ Optional <std::string> default_icon_name;
Params();
};
@@ -81,8 +82,6 @@ protected:
LLAvatarIconCtrl(const Params&);
friend class LLUICtrlFactory;
- void onAvatarIconContextMenuItemClicked(const LLSD& userdata);
-
public:
virtual ~LLAvatarIconCtrl();
@@ -91,8 +90,6 @@ public:
// LLAvatarPropertiesProcessor observer trigger
virtual void processProperties(void* data, EAvatarProcessorType type);
- BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-
void nameUpdatedCallback(
const LLUUID& id,
const std::string& first,
@@ -109,9 +106,8 @@ protected:
LLUUID mAvatarId;
std::string mFirstName;
std::string mLastName;
- LLHandle<LLView> mPopupMenuHandle;
bool mDrawTooltip;
-
+ std::string mDefaultIconName;
bool updateFromCache();
};
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 65a2b8b5e6..6784e6693b 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llavatarlist.h"
+#include "llagentdata.h" // for comparator
// newview
#include "llcallingcard.h" // for LLAvatarTracker
@@ -50,6 +51,12 @@ static const F32 LIT_UPDATE_PERIOD = 5;
// Used to limit time spent for avatar list update per frame.
static const unsigned ADD_LIMIT = 50;
+bool LLAvatarList::contains(const LLUUID& id)
+{
+ const uuid_vector_t& ids = getIDs();
+ return std::find(ids.begin(), ids.end(), id) != ids.end();
+}
+
void LLAvatarList::toggleIcons()
{
// Save the new value for new items to use.
@@ -65,6 +72,20 @@ void LLAvatarList::toggleIcons()
}
}
+void LLAvatarList::setSpeakingIndicatorsVisible(bool visible)
+{
+ // Save the new value for new items to use.
+ mShowSpeakingIndicator = visible;
+
+ // Show/hide icons for all existing items.
+ std::vector<LLPanel*> items;
+ getItems(items);
+ for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)
+ {
+ static_cast<LLAvatarListItem*>(*it)->showSpeakingIndicator(mShowSpeakingIndicator);
+ }
+}
+
static bool findInsensitive(std::string haystack, const std::string& needle_upper)
{
LLStringUtil::toUpper(haystack);
@@ -79,6 +100,9 @@ static const LLFlatListView::ItemReverseComparator REVERSE_NAME_COMPARATOR(NAME_
LLAvatarList::Params::Params()
: ignore_online_status("ignore_online_status", false)
, show_last_interaction_time("show_last_interaction_time", false)
+, show_info_btn("show_info_btn", true)
+, show_profile_btn("show_profile_btn", true)
+, show_speaking_indicator("show_speaking_indicator", true)
{
}
@@ -89,6 +113,10 @@ LLAvatarList::LLAvatarList(const Params& p)
, mContextMenu(NULL)
, mDirty(true) // to force initial update
, mLITUpdateTimer(NULL)
+, mShowIcons(true)
+, mShowInfoBtn(p.show_info_btn)
+, mShowProfileBtn(p.show_profile_btn)
+, mShowSpeakingIndicator(p.show_speaking_indicator)
{
setCommitOnSelectionChange(true);
@@ -132,6 +160,14 @@ void LLAvatarList::draw()
}
}
+//virtual
+void LLAvatarList::clear()
+{
+ getIDs().clear();
+ setDirty(true);
+ LLFlatListView::clear();
+}
+
void LLAvatarList::setNameFilter(const std::string& filter)
{
if (mNameFilter != filter)
@@ -234,25 +270,75 @@ void LLAvatarList::refresh()
bool dirty = add_limit_exceeded || (have_filter && !have_names);
setDirty(dirty);
+ // Refreshed all items.
+ if(!dirty)
+ {
+ // Highlight items matching the filter.
+ std::vector<LLPanel*> items;
+ getItems(items);
+ for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)
+ {
+ static_cast<LLAvatarListItem*>(*it)->setHighlight(mNameFilter);
+ }
+
+ // Send refresh_complete signal.
+ std::vector<LLSD> cur_values;
+ getValues(cur_values);
+ mRefreshCompleteSignal(this, LLSD((S32)cur_values.size()));
+ }
+
// Commit if we've added/removed items.
if (modified)
onCommit();
}
+bool LLAvatarList::filterHasMatches()
+{
+ uuid_vector_t values = getIDs();
+
+ for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++)
+ {
+ std::string name;
+ const LLUUID& buddy_id = *it;
+ BOOL have_name = gCacheName->getFullName(buddy_id, name);
+
+ // If name has not been loaded yet we consider it as a match.
+ // When the name will be loaded the filter will be applied again(in refresh()).
+
+ if (have_name && !findInsensitive(name, mNameFilter))
+ {
+ continue;
+ }
+
+ return true;
+ }
+ return false;
+}
+
+boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
+{
+ return mRefreshCompleteSignal.connect(cb);
+}
+
+boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb)
+{
+ return mItemDoubleClickSignal.connect(cb);
+}
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
{
LLAvatarListItem* item = new LLAvatarListItem();
- item->showInfoBtn(true);
- item->showSpeakingIndicator(true);
item->setName(name);
item->setAvatarId(id, mIgnoreOnlineStatus);
item->setOnline(mIgnoreOnlineStatus ? true : is_online);
item->showLastInteractionTime(mShowLastInteractionTime);
- item->setContextMenu(mContextMenu);
- item->childSetVisible("info_btn", false);
item->setAvatarIconVisible(mShowIcons);
+ item->setShowInfoBtn(mShowInfoBtn);
+ item->setShowProfileBtn(mShowProfileBtn);
+ item->showSpeakingIndicator(mShowSpeakingIndicator);
+
+ item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoucleClicked, this, _1, _2, _3, _4));
addItem(item, id, pos);
}
@@ -304,37 +390,6 @@ void LLAvatarList::computeDifference(
vadded.erase(it, vadded.end());
}
-static std::string format_secs(S32 secs)
-{
- // *TODO: reinventing the wheel?
- // *TODO: i18n
- static const int LL_AL_MIN = 60;
- static const int LL_AL_HOUR = LL_AL_MIN * 60;
- static const int LL_AL_DAY = LL_AL_HOUR * 24;
- static const int LL_AL_WEEK = LL_AL_DAY * 7;
- static const int LL_AL_MONTH = LL_AL_DAY * 31;
- static const int LL_AL_YEAR = LL_AL_DAY * 365;
-
- std::string s;
-
- if (secs >= LL_AL_YEAR)
- s = llformat("%dy", secs / LL_AL_YEAR);
- else if (secs >= LL_AL_MONTH)
- s = llformat("%dmon", secs / LL_AL_MONTH);
- else if (secs >= LL_AL_WEEK)
- s = llformat("%dw", secs / LL_AL_WEEK);
- else if (secs >= LL_AL_DAY)
- s = llformat("%dd", secs / LL_AL_DAY);
- else if (secs >= LL_AL_HOUR)
- s = llformat("%dh", secs / LL_AL_HOUR);
- else if (secs >= LL_AL_MIN)
- s = llformat("%dm", secs / LL_AL_MIN);
- else
- s = llformat("%ds", secs);
-
- return s;
-}
-
// Refresh shown time of our last interaction with all listed avatars.
void LLAvatarList::updateLastInteractionTimes()
{
@@ -348,10 +403,15 @@ void LLAvatarList::updateLastInteractionTimes()
LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
S32 secs_since = now - (S32) LLRecentPeople::instance().getDate(item->getAvatarId()).secondsSinceEpoch();
if (secs_since >= 0)
- item->setLastInteractionTime(format_secs(secs_since));
+ item->setLastInteractionTime(secs_since);
}
}
+void LLAvatarList::onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+{
+ mItemDoubleClickSignal(ctrl, x, y, mask);
+}
+
bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
{
const LLAvatarListItem* avatar_item1 = dynamic_cast<const LLAvatarListItem*>(item1);
@@ -376,3 +436,17 @@ bool LLAvatarItemNameComparator::doCompare(const LLAvatarListItem* avatar_item1,
return name1 < name2;
}
+bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const
+{
+ //keep agent on top, if first is agent,
+ //then we need to return true to elevate this id, otherwise false.
+ if(avatar_item1->getAvatarId() == gAgentID)
+ {
+ return true;
+ }
+ else if (avatar_item2->getAvatarId() == gAgentID)
+ {
+ return false;
+ }
+ return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
+}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 8f2f0249a6..aeed4fee08 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -57,8 +57,11 @@ public:
struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
{
- Optional<bool> ignore_online_status; // show all items as online
- Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class
+ Optional<bool> ignore_online_status, // show all items as online
+ show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class
+ show_info_btn,
+ show_profile_btn,
+ show_speaking_indicator;
Params();
};
@@ -67,19 +70,30 @@ public:
virtual void draw(); // from LLView
+ virtual void clear();
+
void setNameFilter(const std::string& filter);
void setDirty(bool val = true) { mDirty = val; }
uuid_vector_t& getIDs() { return mIDs; }
+ bool contains(const LLUUID& id);
void setContextMenu(LLAvatarListItem::ContextMenu* menu) { mContextMenu = menu; }
void toggleIcons();
+ void setSpeakingIndicatorsVisible(bool visible);
void sortByName();
void setShowIcons(std::string param_name);
bool getIconsVisible() const { return mShowIcons; }
const std::string getIconParamName() const{return mIconParamName;}
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ // Return true if filter has at least one match.
+ bool filterHasMatches();
+
+ boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
+
+ boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
+
protected:
void refresh();
@@ -89,6 +103,7 @@ protected:
std::vector<LLUUID>& vadded,
std::vector<LLUUID>& vremoved);
void updateLastInteractionTimes();
+ void onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);
private:
@@ -96,6 +111,9 @@ private:
bool mShowLastInteractionTime;
bool mDirty;
bool mShowIcons;
+ bool mShowInfoBtn;
+ bool mShowProfileBtn;
+ bool mShowSpeakingIndicator;
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;
@@ -103,6 +121,9 @@ private:
uuid_vector_t mIDs;
LLAvatarListItem::ContextMenu* mContextMenu;
+
+ commit_signal_t mRefreshCompleteSignal;
+ mouse_signal_t mItemDoubleClickSignal;
};
/** Abstract comparator for avatar items */
@@ -139,4 +160,16 @@ protected:
virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
};
+class LLAvatarItemAgentOnTopComparator : public LLAvatarItemNameComparator
+{
+ LOG_CLASS(LLAvatarItemAgentOnTopComparator);
+
+public:
+ LLAvatarItemAgentOnTopComparator() {};
+ virtual ~LLAvatarItemAgentOnTopComparator() {};
+
+protected:
+ virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
+};
+
#endif // LL_LLAVATARLIST_H
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 8464430501..5011b191f4 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -40,11 +40,27 @@
#include "llagent.h"
#include "lloutputmonitorctrl.h"
#include "llavatariconctrl.h"
+#include "lltextutil.h"
#include "llbutton.h"
-S32 LLAvatarListItem::sIconWidth = 0;
+bool LLAvatarListItem::sStaticInitialized = false;
+S32 LLAvatarListItem::sLeftPadding = 0;
+S32 LLAvatarListItem::sRightNamePadding = 0;
+S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
-LLAvatarListItem::LLAvatarListItem()
+static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item");
+
+LLAvatarListItem::Params::Params()
+: default_style("default_style"),
+ voice_call_invited_style("voice_call_invited_style"),
+ voice_call_joined_style("voice_call_joined_style"),
+ voice_call_left_style("voice_call_left_style"),
+ online_style("online_style"),
+ offline_style("offline_style")
+{};
+
+
+LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
: LLPanel(),
mAvatarIcon(NULL),
mAvatarName(NULL),
@@ -52,16 +68,16 @@ LLAvatarListItem::LLAvatarListItem()
mSpeakingIndicator(NULL),
mInfoBtn(NULL),
mProfileBtn(NULL),
- mContextMenu(NULL),
- mOnlineStatus(E_UNKNOWN)
+ mOnlineStatus(E_UNKNOWN),
+ mShowInfoBtn(true),
+ mShowProfileBtn(true)
{
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
- // Remember avatar icon width including its padding from the name text box,
- // so that we can hide and show the icon again later.
- if (!sIconWidth)
+ if (not_from_ui_factory)
{
- sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
}
+ // *NOTE: mantipov: do not use any member here. They can be uninitialized here in case instance
+ // is created from the UICtrlFactory
}
LLAvatarListItem::~LLAvatarListItem()
@@ -86,40 +102,36 @@ BOOL LLAvatarListItem::postBuild()
mProfileBtn->setVisible(false);
mProfileBtn->setClickedCallback(boost::bind(&LLAvatarListItem::onProfileBtnClick, this));
-/*
- if(!p.buttons.profile)
+ if (!sStaticInitialized)
{
- delete mProfile;
- mProfile = NULL;
+ // Remember children widths including their padding from the next sibling,
+ // so that we can hide and show them again later.
+ initChildrenWidths(this);
- LLRect rect;
-
- rect.setLeftTopAndSize(mName->getRect().mLeft, mName->getRect().mTop, mName->getRect().getWidth() + 30, mName->getRect().getHeight());
- mName->setRect(rect);
+ sStaticInitialized = true;
+ }
- if(mLocator)
- {
- rect.setLeftTopAndSize(mLocator->getRect().mLeft + 30, mLocator->getRect().mTop, mLocator->getRect().getWidth(), mLocator->getRect().getHeight());
- mLocator->setRect(rect);
- }
+ return TRUE;
+}
- if(mInfo)
- {
- rect.setLeftTopAndSize(mInfo->getRect().mLeft + 30, mInfo->getRect().mTop, mInfo->getRect().getWidth(), mInfo->getRect().getHeight());
- mInfo->setRect(rect);
- }
+S32 LLAvatarListItem::notifyParent(const LLSD& info)
+{
+ if (info.has("visibility_changed"))
+ {
+ updateChildren();
}
-*/
- return TRUE;
+ return 0;
}
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", true);
- mInfoBtn->setVisible(true);
- mProfileBtn->setVisible(true);
+ mInfoBtn->setVisible(mShowInfoBtn);
+ mProfileBtn->setVisible(mShowProfileBtn);
LLPanel::onMouseEnter(x, y, mask);
+
+ updateChildren();
}
void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
@@ -129,6 +141,8 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
mProfileBtn->setVisible(false);
LLPanel::onMouseLeave(x, y, mask);
+
+ updateChildren();
}
// virtual, called by LLAvatarTracker
@@ -141,7 +155,6 @@ void LLAvatarListItem::changed(U32 mask)
void LLAvatarListItem::setOnline(bool online)
{
// *FIX: setName() overrides font style set by setOnline(). Not an issue ATM.
- // *TODO: Make the colors configurable via XUI.
if (mOnlineStatus != E_UNKNOWN && (bool) mOnlineStatus == online)
return;
@@ -149,22 +162,53 @@ void LLAvatarListItem::setOnline(bool online)
mOnlineStatus = (EOnlineStatus) online;
// Change avatar name font style depending on the new online status.
- LLStyle::Params style_params;
- style_params.color = online ? LLColor4::white : LLColor4::grey;
+ setState(online ? IS_ONLINE : IS_OFFLINE);
+}
- // Rebuild the text to change its style.
- std::string text = mAvatarName->getText();
- mAvatarName->setText(LLStringUtil::null);
- mAvatarName->appendText(text, false, style_params);
+void LLAvatarListItem::setName(const std::string& name)
+{
+ setNameInternal(name, mHighlihtSubstring);
+}
- // Make the icon fade if the avatar goes offline.
- mAvatarIcon->setColor(online ? LLColor4::white : LLColor4::smoke);
+void LLAvatarListItem::setHighlight(const std::string& highlight)
+{
+ setNameInternal(mAvatarName->getText(), mHighlihtSubstring = highlight);
}
-void LLAvatarListItem::setName(const std::string& name)
+void LLAvatarListItem::setState(EItemState item_style)
{
- mAvatarName->setValue(name);
- mAvatarName->setToolTip(name);
+ const LLAvatarListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLAvatarListItem>();
+
+ switch(item_style)
+ {
+ default:
+ case IS_DEFAULT:
+ mAvatarNameStyle = params.default_style();
+ break;
+ case IS_VOICE_INVITED:
+ mAvatarNameStyle = params.voice_call_invited_style();
+ break;
+ case IS_VOICE_JOINED:
+ mAvatarNameStyle = params.voice_call_joined_style();
+ break;
+ case IS_VOICE_LEFT:
+ mAvatarNameStyle = params.voice_call_left_style();
+ break;
+ case IS_ONLINE:
+ mAvatarNameStyle = params.online_style();
+ break;
+ case IS_OFFLINE:
+ mAvatarNameStyle = params.offline_style();
+ break;
+ }
+
+ // *NOTE: You cannot set the style on a text box anymore, you must
+ // rebuild the text. This will cause problems if the text contains
+ // hyperlinks, as their styles will be wrong.
+ setNameInternal(mAvatarName->getText(), mHighlihtSubstring);
+
+ icon_color_map_t& item_icon_color_map = getItemIconColorMap();
+ mAvatarIcon->setColor(item_icon_color_map[item_style]);
}
void LLAvatarListItem::setAvatarId(const LLUUID& id, bool ignore_status_changes)
@@ -189,17 +233,40 @@ void LLAvatarListItem::showLastInteractionTime(bool show)
if (show)
return;
- LLRect name_rect = mAvatarName->getRect();
- LLRect time_rect = mLastInteractionTime->getRect();
-
mLastInteractionTime->setVisible(false);
- name_rect.mRight += (time_rect.mRight - name_rect.mRight);
- mAvatarName->setRect(name_rect);
+ updateChildren();
+}
+
+void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
+{
+ mLastInteractionTime->setValue(formatSeconds(secs_since));
+}
+
+void LLAvatarListItem::setShowInfoBtn(bool show)
+{
+ // Already done? Then do nothing.
+ if(mShowInfoBtn == show)
+ return;
+ mShowInfoBtn = show;
}
-void LLAvatarListItem::setLastInteractionTime(const std::string& val)
+void LLAvatarListItem::setShowProfileBtn(bool show)
{
- mLastInteractionTime->setValue(val);
+ // Already done? Then do nothing.
+ if(mShowProfileBtn == show)
+ return;
+ mShowProfileBtn = show;
+}
+
+void LLAvatarListItem::showSpeakingIndicator(bool visible)
+{
+ // Already done? Then do nothing.
+ if (mSpeakingIndicator->getVisible() == (BOOL)visible)
+ return;
+// Disabled to not contradict with SpeakingIndicatorManager functionality. EXT-3976
+// probably this method should be totally removed.
+// mSpeakingIndicator->setVisible(visible);
+// updateChildren();
}
void LLAvatarListItem::setAvatarIconVisible(bool visible)
@@ -210,36 +277,12 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
// Show/hide avatar icon.
mAvatarIcon->setVisible(visible);
-
- // Move the avatar name horizontally by icon size + its distance from the avatar name.
- LLRect name_rect = mAvatarName->getRect();
- name_rect.mLeft += visible ? sIconWidth : -sIconWidth;
- mAvatarName->setRect(name_rect);
+ updateChildren();
}
void LLAvatarListItem::onInfoBtnClick()
{
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarId));
-
- /* TODO fix positioning of inspector
- localPointToScreen(mXPos, mYPos, &mXPos, &mYPos);
-
-
- LLRect rect;
-
- // *TODO Vadim: rewrite this. "+= -" looks weird.
- S32 delta = mYPos - inspector->getRect().getHeight();
- if(delta < 0)
- {
- mYPos += -delta;
- }
-
- rect.setLeftTopAndSize(mXPos, mYPos,
- inspector->getRect().getWidth(), inspector->getRect().getHeight());
- inspector->setRect(rect);
- inspector->setFrontmost(true);
- inspector->setVisible(true);
- */
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarId));
}
void LLAvatarListItem::onProfileBtnClick()
@@ -247,6 +290,21 @@ void LLAvatarListItem::onProfileBtnClick()
LLAvatarActions::showProfile(mAvatarId);
}
+BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ if(mInfoBtn->getRect().pointInRect(x, y))
+ {
+ onInfoBtnClick();
+ return TRUE;
+ }
+ if(mProfileBtn->getRect().pointInRect(x, y))
+ {
+ onProfileBtnClick();
+ return TRUE;
+ }
+ return LLPanel::handleDoubleClick(x, y, mask);
+}
+
void LLAvatarListItem::setValue( const LLSD& value )
{
if (!value.isMap()) return;;
@@ -264,9 +322,237 @@ const std::string LLAvatarListItem::getAvatarName() const
return mAvatarName->getValue();
}
+//== PRIVATE SECITON ==========================================================
+
+void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight)
+{
+ LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight);
+ mAvatarName->setToolTip(name);
+}
+
void LLAvatarListItem::onNameCache(const std::string& first_name, const std::string& last_name)
{
std::string name = first_name + " " + last_name;
- mAvatarName->setValue(name);
- mAvatarName->setToolTip(name);
+ setName(name);
+}
+
+// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
+// taking i18n into account. The format string to use is taken from the panel XML.
+std::string LLAvatarListItem::formatSeconds(U32 secs)
+{
+ static const U32 LL_ALI_MIN = 60;
+ static const U32 LL_ALI_HOUR = LL_ALI_MIN * 60;
+ static const U32 LL_ALI_DAY = LL_ALI_HOUR * 24;
+ static const U32 LL_ALI_WEEK = LL_ALI_DAY * 7;
+ static const U32 LL_ALI_MONTH = LL_ALI_DAY * 30;
+ static const U32 LL_ALI_YEAR = LL_ALI_DAY * 365;
+
+ std::string fmt;
+ U32 count = 0;
+
+ if (secs >= LL_ALI_YEAR)
+ {
+ fmt = "FormatYears"; count = secs / LL_ALI_YEAR;
+ }
+ else if (secs >= LL_ALI_MONTH)
+ {
+ fmt = "FormatMonths"; count = secs / LL_ALI_MONTH;
+ }
+ else if (secs >= LL_ALI_WEEK)
+ {
+ fmt = "FormatWeeks"; count = secs / LL_ALI_WEEK;
+ }
+ else if (secs >= LL_ALI_DAY)
+ {
+ fmt = "FormatDays"; count = secs / LL_ALI_DAY;
+ }
+ else if (secs >= LL_ALI_HOUR)
+ {
+ fmt = "FormatHours"; count = secs / LL_ALI_HOUR;
+ }
+ else if (secs >= LL_ALI_MIN)
+ {
+ fmt = "FormatMinutes"; count = secs / LL_ALI_MIN;
+ }
+ else
+ {
+ fmt = "FormatSeconds"; count = secs;
+ }
+
+ LLStringUtil::format_map_t args;
+ args["[COUNT]"] = llformat("%u", count);
+ return getString(fmt, args);
+}
+
+// static
+LLAvatarListItem::icon_color_map_t& LLAvatarListItem::getItemIconColorMap()
+{
+ static icon_color_map_t item_icon_color_map;
+ if (!item_icon_color_map.empty()) return item_icon_color_map;
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_DEFAULT,
+ LLUIColorTable::instance().getColor("AvatarListItemIconDefaultColor", LLColor4::white)));
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_VOICE_INVITED,
+ LLUIColorTable::instance().getColor("AvatarListItemIconVoiceInvitedColor", LLColor4::white)));
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_VOICE_JOINED,
+ LLUIColorTable::instance().getColor("AvatarListItemIconVoiceJoinedColor", LLColor4::white)));
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_VOICE_LEFT,
+ LLUIColorTable::instance().getColor("AvatarListItemIconVoiceLeftColor", LLColor4::white)));
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_ONLINE,
+ LLUIColorTable::instance().getColor("AvatarListItemIconOnlineColor", LLColor4::white)));
+
+ item_icon_color_map.insert(
+ std::make_pair(IS_OFFLINE,
+ LLUIColorTable::instance().getColor("AvatarListItemIconOfflineColor", LLColor4::white)));
+
+ return item_icon_color_map;
+}
+
+// static
+void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
+{
+ //speaking indicator width + padding
+ S32 speaking_indicator_width = avatar_item->getRect().getWidth() - avatar_item->mSpeakingIndicator->getRect().mLeft;
+
+ //profile btn width + padding
+ S32 profile_btn_width = avatar_item->mSpeakingIndicator->getRect().mLeft - avatar_item->mProfileBtn->getRect().mLeft;
+
+ //info btn width + padding
+ S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft;
+
+ // last interaction time textbox width + padding
+ S32 last_interaction_time_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
+
+ // icon width + padding
+ S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
+
+ sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft;
+ sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight;
+
+ S32 index = ALIC_COUNT;
+ sChildrenWidths[--index] = icon_width;
+ sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
+ sChildrenWidths[--index] = last_interaction_time_width;
+ sChildrenWidths[--index] = info_btn_width;
+ sChildrenWidths[--index] = profile_btn_width;
+ sChildrenWidths[--index] = speaking_indicator_width;
+}
+
+void LLAvatarListItem::updateChildren()
+{
+ LL_DEBUGS("AvatarItemReshape") << LL_ENDL;
+ LL_DEBUGS("AvatarItemReshape") << "Updating for: " << getAvatarName() << LL_ENDL;
+
+ S32 name_new_width = getRect().getWidth();
+ S32 ctrl_new_left = name_new_width;
+ S32 name_new_left = sLeftPadding;
+
+ // iterate through all children and set them into correct position depend on each child visibility
+ // assume that child indexes are in back order: the first in Enum is the last (right) in the item
+ // iterate & set child views starting from right to left
+ for (S32 i = 0; i < ALIC_COUNT; ++i)
+ {
+ // skip "name" textbox, it will be processed out of loop later
+ if (ALIC_NAME == i) continue;
+
+ LLView* control = getItemChildView((EAvatarListItemChildIndex)i);
+
+ LL_DEBUGS("AvatarItemReshape") << "Processing control: " << control->getName() << LL_ENDL;
+ // skip invisible views
+ if (!control->getVisible()) continue;
+
+ S32 ctrl_width = sChildrenWidths[i]; // including space between current & left controls
+
+ // decrease available for
+ name_new_width -= ctrl_width;
+ LL_DEBUGS("AvatarItemReshape") << "width: " << ctrl_width << ", name_new_width: " << name_new_width << LL_ENDL;
+
+ LLRect control_rect = control->getRect();
+ LL_DEBUGS("AvatarItemReshape") << "rect before: " << control_rect << LL_ENDL;
+
+ if (ALIC_ICON == i)
+ {
+ // assume that this is the last iteration,
+ // so it is not necessary to save "ctrl_new_left" value calculated on previous iterations
+ ctrl_new_left = sLeftPadding;
+ name_new_left = ctrl_new_left + ctrl_width;
+ }
+ else
+ {
+ ctrl_new_left -= ctrl_width;
+ }
+
+ LL_DEBUGS("AvatarItemReshape") << "ctrl_new_left: " << ctrl_new_left << LL_ENDL;
+
+ control_rect.setLeftTopAndSize(
+ ctrl_new_left,
+ control_rect.mTop,
+ control_rect.getWidth(),
+ control_rect.getHeight());
+
+ LL_DEBUGS("AvatarItemReshape") << "rect after: " << control_rect << LL_ENDL;
+ control->setShape(control_rect);
+ }
+
+ // set size and position of the "name" child
+ LLView* name_view = getItemChildView(ALIC_NAME);
+ LLRect name_view_rect = name_view->getRect();
+ LL_DEBUGS("AvatarItemReshape") << "name rect before: " << name_view_rect << LL_ENDL;
+
+ // apply paddings
+ name_new_width -= sLeftPadding;
+ name_new_width -= sRightNamePadding;
+
+ name_view_rect.setLeftTopAndSize(
+ name_new_left,
+ name_view_rect.mTop,
+ name_new_width,
+ name_view_rect.getHeight());
+
+ name_view->setShape(name_view_rect);
+
+ LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL;
}
+
+LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index)
+{
+ LLView* child_view = mAvatarName;
+
+ switch (child_view_index)
+ {
+ case ALIC_ICON:
+ child_view = mAvatarIcon;
+ break;
+ case ALIC_NAME:
+ child_view = mAvatarName;
+ break;
+ case ALIC_INTERACTION_TIME:
+ child_view = mLastInteractionTime;
+ break;
+ case ALIC_SPEAKER_INDICATOR:
+ child_view = mSpeakingIndicator;
+ break;
+ case ALIC_INFO_BUTTON:
+ child_view = mInfoBtn;
+ break;
+ case ALIC_PROFILE_BUTTON:
+ child_view = mProfileBtn;
+ break;
+ default:
+ LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL;
+ // leave child_view untouched
+ }
+
+ return child_view;
+}
+
+// EOF
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 10c0b17005..426d80e0a8 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -37,6 +37,7 @@
#include "lloutputmonitorctrl.h"
#include "llbutton.h"
#include "lltextbox.h"
+#include "llstyle.h"
#include "llcallingcard.h" // for LLFriendObserver
@@ -45,16 +46,51 @@ class LLAvatarIconCtrl;
class LLAvatarListItem : public LLPanel, public LLFriendObserver
{
public:
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Optional<LLStyle::Params> default_style,
+ voice_call_invited_style,
+ voice_call_joined_style,
+ voice_call_left_style,
+ online_style,
+ offline_style;
+
+ Params();
+ };
+
+ typedef enum e_item_state_type {
+ IS_DEFAULT,
+ IS_VOICE_INVITED,
+ IS_VOICE_JOINED,
+ IS_VOICE_LEFT,
+ IS_ONLINE,
+ IS_OFFLINE,
+ } EItemState;
+
class ContextMenu
{
public:
virtual void show(LLView* spawning_view, const std::vector<LLUUID>& selected_uuids, S32 x, S32 y) = 0;
};
- LLAvatarListItem();
+ /**
+ * Creates an instance of LLAvatarListItem.
+ *
+ * It is not registered with LLDefaultChildRegistry. It is built via LLUICtrlFactory::buildPanel
+ * or via registered LLCallbackMap depend on passed parameter.
+ *
+ * @param not_from_ui_factory if true instance will be build with LLUICtrlFactory::buildPanel
+ * otherwise it should be registered via LLCallbackMap before creating.
+ */
+ LLAvatarListItem(bool not_from_ui_factory = true);
virtual ~LLAvatarListItem();
virtual BOOL postBuild();
+
+ /**
+ * Processes notification from speaker indicator to update children when indicator's visibility is changed.
+ */
+ virtual S32 notifyParent(const LLSD& info);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void setValue(const LLSD& value);
@@ -62,8 +98,15 @@ public:
void setOnline(bool online);
void setName(const std::string& name);
+ void setHighlight(const std::string& highlight);
+ void setState(EItemState item_style);
void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
- void setLastInteractionTime(const std::string& val);
+ void setLastInteractionTime(U32 secs_since);
+ //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
+ void setShowProfileBtn(bool show);
+ void setShowInfoBtn(bool show);
+ void showSpeakingIndicator(bool show);
+ void showLastInteractionTime(bool show);
void setAvatarIconVisible(bool visible);
const LLUUID& getAvatarId() const;
@@ -72,11 +115,15 @@ public:
void onInfoBtnClick();
void onProfileBtnClick();
- void showSpeakingIndicator(bool show) { mSpeakingIndicator->setVisible(show); }
- void showInfoBtn(bool show_info_btn) {mInfoBtn->setVisible(show_info_btn); }
- void showLastInteractionTime(bool show);
+ /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+protected:
+ /**
+ * Contains indicator to show voice activity.
+ */
+ LLOutputMonitorCtrl* mSpeakingIndicator;
- void setContextMenu(ContextMenu* menu) { mContextMenu = menu; }
+ LLAvatarIconCtrl* mAvatarIcon;
private:
@@ -86,20 +133,78 @@ private:
E_UNKNOWN,
} EOnlineStatus;
+ /**
+ * Enumeration of item elements in order from right to left.
+ *
+ * updateChildren() assumes that indexes are in the such order to process avatar icon easier.
+ *
+ * @see updateChildren()
+ */
+ typedef enum e_avatar_item_child {
+ ALIC_SPEAKER_INDICATOR,
+ ALIC_PROFILE_BUTTON,
+ ALIC_INFO_BUTTON,
+ ALIC_INTERACTION_TIME,
+ ALIC_NAME,
+ ALIC_ICON,
+ ALIC_COUNT,
+ } EAvatarListItemChildIndex;
+
+ void setNameInternal(const std::string& name, const std::string& highlight);
void onNameCache(const std::string& first_name, const std::string& last_name);
- LLAvatarIconCtrl* mAvatarIcon;
+ std::string formatSeconds(U32 secs);
+
+ typedef std::map<EItemState, LLColor4> icon_color_map_t;
+ static icon_color_map_t& getItemIconColorMap();
+
+ /**
+ * Initializes widths of all children to use them while changing visibility of any of them.
+ *
+ * @see updateChildren()
+ */
+ static void initChildrenWidths(LLAvatarListItem* self);
+
+ /**
+ * Updates position and rectangle of visible children to fit all available item's width.
+ */
+ void updateChildren();
+
+ /**
+ * Gets child view specified by index.
+ *
+ * This method implemented via switch by all EAvatarListItemChildIndex values.
+ * It is used to not store children in array or vector to avoid of increasing memory usage.
+ */
+ LLView* getItemChildView(EAvatarListItemChildIndex child_index);
+
LLTextBox* mAvatarName;
LLTextBox* mLastInteractionTime;
+ LLStyle::Params mAvatarNameStyle;
- LLOutputMonitorCtrl* mSpeakingIndicator;
LLButton* mInfoBtn;
LLButton* mProfileBtn;
- ContextMenu* mContextMenu;
LLUUID mAvatarId;
+ std::string mHighlihtSubstring; // substring to highlight
EOnlineStatus mOnlineStatus;
- static S32 sIconWidth; // icon width + padding
+ //Flag indicating that info/profile button shouldn't be shown at all.
+ //Speaker indicator and avatar name coords are translated accordingly
+ bool mShowInfoBtn;
+ bool mShowProfileBtn;
+
+ static bool sStaticInitialized; // this variable is introduced to improve code readability
+ static S32 sLeftPadding; // padding to first left visible child (icon or name)
+ static S32 sRightNamePadding; // right padding from name to next visible child
+
+ /**
+ * Contains widths of each child specified by EAvatarListItemChildIndex
+ * including padding to the next right one.
+ *
+ * @see initChildrenWidths()
+ */
+ static S32 sChildrenWidths[ALIC_COUNT];
+
};
#endif //LL_LLAVATARLISTITEM_H
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 73e24ca8e7..33e5046f50 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -158,6 +158,11 @@ void LLAvatarPropertiesProcessor::sendAvatarTexturesRequest(const LLUUID& avatar
removePendingRequest(avatar_id, APT_TEXTURES);
}
+void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& avatar_id)
+{
+ sendGenericRequest(avatar_id, APT_CLASSIFIEDS, "avatarclassifiedsrequest");
+}
+
void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)
{
llinfos << "Sending avatarinfo update" << llendl;
@@ -284,12 +289,60 @@ void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* m
*/
}
-void LLAvatarPropertiesProcessor::processAvatarClassifiedReply(LLMessageSystem* msg, void**)
+void LLAvatarPropertiesProcessor::processAvatarClassifiedsReply(LLMessageSystem* msg, void**)
+{
+ LLAvatarClassifieds classifieds;
+
+ msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, classifieds.agent_id);
+ msg->getUUID(_PREHASH_AgentData, _PREHASH_TargetID, classifieds.target_id);
+
+ S32 block_count = msg->getNumberOfBlocks(_PREHASH_Data);
+
+ for(int n = 0; n < block_count; ++n)
+ {
+ LLAvatarClassifieds::classified_data data;
+
+ msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, data.classified_id, n);
+ msg->getString(_PREHASH_Data, _PREHASH_Name, data.name, n);
+
+ classifieds.classifieds_list.push_back(data);
+ }
+
+ LLAvatarPropertiesProcessor* self = getInstance();
+ // Request processed, no longer pending
+ self->removePendingRequest(classifieds.target_id, APT_CLASSIFIEDS);
+ self->notifyObservers(classifieds.target_id,&classifieds,APT_CLASSIFIEDS);
+}
+
+void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* msg, void**)
{
- // avatarclassifiedsrequest is not sent according to new UI design but
- // keep this method according to resolved issues.
+ LLAvatarClassifiedInfo c_info;
+
+ msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, c_info.agent_id);
+
+ msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, c_info.classified_id);
+ msg->getUUID(_PREHASH_Data, _PREHASH_CreatorID, c_info.creator_id);
+ msg->getU32(_PREHASH_Data, _PREHASH_CreationDate, c_info.creation_date);
+ msg->getU32(_PREHASH_Data, _PREHASH_ExpirationDate, c_info.expiration_date);
+ msg->getU32(_PREHASH_Data, _PREHASH_Category, c_info.category);
+ msg->getString(_PREHASH_Data, _PREHASH_Name, c_info.name);
+ msg->getString(_PREHASH_Data, _PREHASH_Desc, c_info.description);
+ msg->getUUID(_PREHASH_Data, _PREHASH_ParcelID, c_info.parcel_id);
+ msg->getU32(_PREHASH_Data, _PREHASH_ParentEstate, c_info.parent_estate);
+ msg->getUUID(_PREHASH_Data, _PREHASH_SnapshotID, c_info.snapshot_id);
+ msg->getString(_PREHASH_Data, _PREHASH_SimName, c_info.sim_name);
+ msg->getVector3d(_PREHASH_Data, _PREHASH_PosGlobal, c_info.pos_global);
+ msg->getString(_PREHASH_Data, _PREHASH_ParcelName, c_info.parcel_name);
+ msg->getU8(_PREHASH_Data, _PREHASH_ClassifiedFlags, c_info.flags);
+ msg->getS32(_PREHASH_Data, _PREHASH_PriceForListing, c_info.price_for_listing);
+
+ LLAvatarPropertiesProcessor* self = getInstance();
+ // Request processed, no longer pending
+ self->removePendingRequest(c_info.creator_id, APT_CLASSIFIED_INFO);
+ self->notifyObservers(c_info.creator_id, &c_info, APT_CLASSIFIED_INFO);
}
+
void LLAvatarPropertiesProcessor::processAvatarNotesReply(LLMessageSystem* msg, void**)
{
LLAvatarNotes avatar_notes;
@@ -387,11 +440,17 @@ void LLAvatarPropertiesProcessor::notifyObservers(const LLUUID& id,void* data, E
// Copy the map (because observers may delete themselves when updated?)
LLAvatarPropertiesProcessor::observer_multimap_t observers = mObservers;
- observer_multimap_t::iterator oi = observers.lower_bound(id);
- observer_multimap_t::iterator end = observers.upper_bound(id);
+ observer_multimap_t::iterator oi = observers.begin();
+ observer_multimap_t::iterator end = observers.end();
for (; oi != end; ++oi)
{
- oi->second->processProperties(data,type);
+ // only notify observers for the same agent, or if the observer
+ // didn't know the agent ID and passed a NULL id.
+ const LLUUID &agent_id = oi->first;
+ if (agent_id == id || agent_id.isNull())
+ {
+ oi->second->processProperties(data,type);
+ }
}
}
@@ -451,6 +510,22 @@ void LLAvatarPropertiesProcessor::sendPickDelete( const LLUUID& pick_id )
LLAgentPicksInfo::getInstance()->decrementNumberOfPicks();
}
+void LLAvatarPropertiesProcessor::sendClassifiedDelete(const LLUUID& classified_id)
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessage(_PREHASH_ClassifiedDelete);
+
+ msg->nextBlock(_PREHASH_AgentData);
+ msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlock(_PREHASH_Data);
+ msg->addUUID(_PREHASH_ClassifiedID, classified_id);
+
+ gAgent.sendReliableMessage();
+}
+
void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
{
if (!new_pick) return;
@@ -485,6 +560,36 @@ void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
}
+void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data)
+{
+ if(!c_data)
+ {
+ return;
+ }
+
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessage(_PREHASH_ClassifiedInfoUpdate);
+
+ msg->nextBlock(_PREHASH_AgentData);
+ msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlock(_PREHASH_Data);
+ msg->addUUID(_PREHASH_ClassifiedID, c_data->classified_id);
+ msg->addU32(_PREHASH_Category, c_data->category);
+ msg->addString(_PREHASH_Name, c_data->name);
+ msg->addString(_PREHASH_Desc, c_data->description);
+ msg->addUUID(_PREHASH_ParcelID, c_data->parcel_id);
+ msg->addU32(_PREHASH_ParentEstate, 0);
+ msg->addUUID(_PREHASH_SnapshotID, c_data->snapshot_id);
+ msg->addVector3d(_PREHASH_PosGlobal, c_data->pos_global);
+ msg->addU8(_PREHASH_ClassifiedFlags, c_data->flags);
+ msg->addS32(_PREHASH_PriceForListing, c_data->price_for_listing);
+
+ gAgent.sendReliableMessage();
+}
+
void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id)
{
// Must ask for a pick based on the creator id because
@@ -495,6 +600,21 @@ void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id,
send_generic_message("pickinforequest", request_params);
}
+void LLAvatarPropertiesProcessor::sendClassifiedInfoRequest(const LLUUID& classified_id)
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessage(_PREHASH_ClassifiedInfoRequest);
+ msg->nextBlock(_PREHASH_AgentData);
+
+ msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlock(_PREHASH_Data);
+ msg->addUUID(_PREHASH_ClassifiedID, classified_id);
+
+ gAgent.sendReliableMessage();
+}
bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
{
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index e6563024b2..716c1b8065 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -53,7 +53,9 @@ enum EAvatarProcessorType
APT_GROUPS,
APT_PICKS,
APT_PICK_INFO,
- APT_TEXTURES
+ APT_TEXTURES,
+ APT_CLASSIFIEDS,
+ APT_CLASSIFIED_INFO
};
struct LLAvatarData
@@ -136,6 +138,43 @@ struct LLAvatarGroups
};
};
+struct LLAvatarClassifieds
+{
+ LLUUID agent_id;
+ LLUUID target_id;
+
+ struct classified_data;
+ typedef std::list<classified_data> classifieds_list_t;
+
+ classifieds_list_t classifieds_list;
+
+ struct classified_data
+ {
+ LLUUID classified_id;
+ std::string name;
+ };
+};
+
+struct LLAvatarClassifiedInfo
+{
+ LLUUID agent_id;
+ LLUUID classified_id;
+ LLUUID creator_id;
+ U32 creation_date;
+ U32 expiration_date;
+ U32 category;
+ std::string name;
+ std::string description;
+ LLUUID parcel_id;
+ U32 parent_estate;
+ LLUUID snapshot_id;
+ std::string sim_name;
+ LLVector3d pos_global;
+ std::string parcel_name;
+ U8 flags;
+ S32 price_for_listing;
+};
+
class LLAvatarPropertiesObserver
{
public:
@@ -162,20 +201,27 @@ public:
void sendAvatarNotesRequest(const LLUUID& avatar_id);
void sendAvatarGroupsRequest(const LLUUID& avatar_id);
void sendAvatarTexturesRequest(const LLUUID& avatar_id);
+ void sendAvatarClassifiedsRequest(const LLUUID& avatar_id);
// Duplicate pick info requests are not suppressed.
void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
+ void sendClassifiedInfoRequest(const LLUUID& classified_id);
+
void sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props);
void sendPickInfoUpdate(const LLPickData* new_pick);
+ void sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data);
+
void sendFriendRights(const LLUUID& avatar_id, S32 rights);
void sendNotes(const LLUUID& avatar_id, const std::string notes);
void sendPickDelete(const LLUUID& pick_id);
+ void sendClassifiedDelete(const LLUUID& classified_id);
+
// Returns translated, human readable string for account type, such
// as "Resident" or "Linden Employee". Used for profiles, inspectors.
static std::string accountType(const LLAvatarData* avatar_data);
@@ -189,7 +235,9 @@ public:
static void processAvatarInterestsReply(LLMessageSystem* msg, void**);
- static void processAvatarClassifiedReply(LLMessageSystem* msg, void**);
+ static void processAvatarClassifiedsReply(LLMessageSystem* msg, void**);
+
+ static void processClassifiedInfoReply(LLMessageSystem* msg, void**);
static void processAvatarGroupsReply(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index ddcee5f453..24b8ef3320 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -31,6 +31,8 @@
*/
#include "llviewerprecompiledheaders.h" // must be first include
+
+#define LLBOTTOMTRAY_CPP
#include "llbottomtray.h"
#include "llagent.h"
@@ -40,41 +42,134 @@
#include "llimfloater.h" // for LLIMFloater
#include "lllayoutstack.h"
#include "llnearbychatbar.h"
+#include "llnotificationsutil.h"
+#include "llspeakbutton.h"
#include "llsplitbutton.h"
#include "llsyswellwindow.h"
#include "llfloatercamera.h"
+#include "lltexteditor.h"
+#include "llnotifications.h"
+
+// Build time optimization, generate extern template once in .cpp file
+template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
+
+namespace
+{
+ const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
+ const std::string& PANEL_CHATBAR_NAME = "chat_bar";
+ const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
+ const std::string& PANEL_CAMERA_NAME = "cam_panel";
+ const std::string& PANEL_GESTURE_NAME = "gesture_panel";
+
+ S32 get_panel_min_width(LLLayoutStack* stack, LLPanel* panel)
+ {
+ S32 minimal_width = 0;
+ llassert(stack);
+ if ( stack && panel && panel->getVisible() )
+ {
+ stack->getPanelMinSize(panel->getName(), &minimal_width, NULL);
+ }
+ return minimal_width;
+ }
+
+ S32 get_curr_width(LLUICtrl* ctrl)
+ {
+ S32 cur_width = 0;
+ if ( ctrl && ctrl->getVisible() )
+ {
+ cur_width = ctrl->getRect().getWidth();
+ }
+ return cur_width;
+ }
+}
+
+class LLBottomTrayLite
+ : public LLPanel
+{
+public:
+ LLBottomTrayLite()
+ : mNearbyChatBar(NULL),
+ mGesturePanel(NULL)
+ {
+ mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_bottomtray_lite.xml");
+ // Necessary for focus movement among child controls
+ setFocusRoot(TRUE);
+ }
+
+ BOOL postBuild()
+ {
+ mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
+ mGesturePanel = getChild<LLPanel>("gesture_panel");
+
+ // Hide "show_nearby_chat" button
+ LLLineEditor* chat_box = mNearbyChatBar->getChatBox();
+ LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat");
+ S32 delta_width = show_btn->getRect().getWidth();
+ show_btn->setVisible(FALSE);
+ chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight());
+
+ return TRUE;
+ }
+
+ void onFocusLost()
+ {
+ if (gAgent.cameraMouselook())
+ {
+ LLBottomTray::getInstance()->setVisible(FALSE);
+ }
+ }
+
+ LLNearbyChatBar* mNearbyChatBar;
+ LLPanel* mGesturePanel;
+};
LLBottomTray::LLBottomTray(const LLSD&)
: mChicletPanel(NULL),
- mSysWell(NULL),
- mTalkBtn(NULL),
+ mSpeakPanel(NULL),
+ mSpeakBtn(NULL),
mNearbyChatBar(NULL),
mToolbarStack(NULL)
-
+, mMovementButton(NULL)
+, mResizeState(RS_NORESIZE)
+, mBottomTrayContextMenu(NULL)
+, mMovementPanel(NULL)
+, mCamPanel(NULL)
+, mSnapshotPanel(NULL)
+, mGesturePanel(NULL)
+, mCamButton(NULL)
+, mBottomTrayLite(NULL)
+, mIsInLiteMode(false)
{
+ // Firstly add ourself to IMSession observers, so we catch session events
+ // before chiclets do that.
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml");
mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
- mSysWell = getChild<LLNotificationChiclet>("sys_well");
-
- // init mSysWell
- // set handler for a Click operation
- mSysWell->setClickCallback(boost::bind(&LLSysWellWindow::onChicletClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window")));
mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
- LLIMMgr::getInstance()->addSessionObserver(this);
//this is to fix a crash that occurs because LLBottomTray is a singleton
//and thus is deleted at the end of the viewers lifetime, but to be cleanly
//destroyed LLBottomTray requires some subsystems that are long gone
- LLUI::getRootView()->addChild(this);
+ //LLUI::getRootView()->addChild(this);
+
+ initStateProcessedObjectMap();
// Necessary for focus movement among child controls
setFocusRoot(TRUE);
+
+ {
+ mBottomTrayLite = new LLBottomTrayLite();
+ mBottomTrayLite->setFollowsAll();
+ mBottomTrayLite->setVisible(FALSE);
+ }
}
LLBottomTray::~LLBottomTray()
@@ -109,6 +204,11 @@ void* LLBottomTray::createNearbyChatBar(void* userdata)
return new LLNearbyChatBar();
}
+LLNearbyChatBar* LLBottomTray::getNearbyChatBar()
+{
+ return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar;
+}
+
LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
{
LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
@@ -131,25 +231,28 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
//virtual
void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
{
- if(getChicletPanel())
+ if (!getChicletPanel()) return;
+
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!session) return;
+
+ // no need to spawn chiclets for participants in P2P calls called through Avaline
+ if (session->isP2P() && session->isOtherParticipantAvaline()) return;
+
+ if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+ LLIMChiclet* chiclet = createIMChiclet(session_id);
+ if(chiclet)
{
- if(getChicletPanel()->findChiclet<LLChiclet>(session_id))
- {
+ chiclet->setIMSessionName(name);
+ chiclet->setOtherParticipantId(other_participant_id);
+
+ LLIMFloater::onIMChicletCreated(session_id);
- }
- else
- {
- LLIMChiclet* chiclet = createIMChiclet(session_id);
- if(chiclet)
- {
- chiclet->setIMSessionName(name);
- chiclet->setOtherParticipantId(other_participant_id);
- }
- else
- {
- llerrs << "Could not create chiclet" << llendl;
- }
- }
+ }
+ else
+ {
+ llerrs << "Could not create chiclet" << llendl;
}
}
@@ -182,42 +285,79 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
}
}
-//virtual
-void LLBottomTray::onFocusLost()
+S32 LLBottomTray::getTotalUnreadIMCount()
+{
+ return getChicletPanel()->getTotalUnreadIMCount();
+}
+
+// virtual
+void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
- if (gAgent.cameraMouselook())
+ // Time it takes to connect to voice channel might be pretty long,
+ // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
+ BOOL enable = FALSE;
+
+ switch (status)
+ {
+ // Do not add STATUS_VOICE_ENABLED because voice chat is
+ // inactive until STATUS_JOINED
+ case STATUS_JOINED:
+ enable = TRUE;
+ break;
+ default:
+ enable = FALSE;
+ break;
+ }
+
+ // We have to enable/disable right and left parts of speak button separately (EXT-4648)
+ mSpeakBtn->setSpeakBtnEnabled(enable);
+ // skipped to avoid button blinking
+ if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
- setVisible(FALSE);
+ mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
}
}
+void LLBottomTray::onMouselookModeOut()
+{
+ mIsInLiteMode = false;
+ mBottomTrayLite->setVisible(FALSE);
+ mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText());
+ setVisible(TRUE);
+}
+
+void LLBottomTray::onMouselookModeIn()
+{
+ setVisible(FALSE);
+
+ // Attach the lite bottom tray
+ if (getParent() && mBottomTrayLite->getParent() != getParent())
+ getParent()->addChild(mBottomTrayLite);
+
+ mBottomTrayLite->setShape(getLocalRect());
+ mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText());
+ mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton"));
+
+ mIsInLiteMode = true;
+}
+
//virtual
// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode.
// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true),
void LLBottomTray::setVisible(BOOL visible)
{
- LLPanel::setVisible(visible);
-
- // *NOTE: we must check mToolbarStack against NULL because setVisible is called from the
- // LLPanel::initFromParams BEFORE postBuild is called and child controls are not exist yet
- if (NULL != mToolbarStack)
+ if (mIsInLiteMode)
{
- BOOL visibility = gAgent.cameraMouselook() ? false : true;
-
- for ( child_list_const_iter_t child_it = mToolbarStack->getChildList()->begin();
- child_it != mToolbarStack->getChildList()->end(); child_it++)
- {
- LLView* viewp = *child_it;
- std::string name = viewp->getName();
-
- if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name)
- continue;
- else
- {
- viewp->setVisible(visibility);
- }
- }
+ mBottomTrayLite->setVisible(visible);
+ }
+ else
+ {
+ LLPanel::setVisible(visible);
}
+ if(visible)
+ gFloaterView->setSnapOffsetBottom(getRect().getHeight());
+ else
+ gFloaterView->setSnapOffsetBottom(0);
}
void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
@@ -225,7 +365,9 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
// We should show BottomTrayContextMenu in last turn
if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu())
{
- //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu
+ //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu
+
+ updateContextMenu(x, y, mask);
mBottomTrayContextMenu->buildDrawLabels();
mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y);
@@ -233,39 +375,75 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
}
}
+void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask)
+{
+ LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box");
+
+ S32 local_x = x - mNearbyChatBar->getRect().mLeft - edit_box->getRect().mLeft;
+ S32 local_y = y - mNearbyChatBar->getRect().mBottom - edit_box->getRect().mBottom;
+
+ bool in_edit_box = edit_box->pointInView(local_x, local_y);
+
+ LLMenuItemGL* menu_item;
+ menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Cut");
+ if(menu_item)
+ menu_item->setVisible(in_edit_box);
+ menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Copy");
+ if(menu_item)
+ menu_item->setVisible(in_edit_box);
+ menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Paste");
+ if(menu_item)
+ menu_item->setVisible(in_edit_box);
+ menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Delete");
+ if(menu_item)
+ menu_item->setVisible(in_edit_box);
+ menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Select_All");
+ if(menu_item)
+ menu_item->setVisible(in_edit_box);
+}
+
void LLBottomTray::showGestureButton(BOOL visible)
{
- mGesturePanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
}
void LLBottomTray::showMoveButton(BOOL visible)
{
- mMovementPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
}
void LLBottomTray::showCameraButton(BOOL visible)
{
- mCamPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
}
void LLBottomTray::showSnapshotButton(BOOL visible)
{
- mSnapshotPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
-namespace
+void LLBottomTray::toggleMovementControls()
+{
+ if (mMovementButton)
+ mMovementButton->onCommit();
+}
+
+void LLBottomTray::toggleCameraControls()
{
- const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
- const std::string& PANEL_CHATBAR_NAME = "chat_bar";
- const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
- const std::string& PANEL_CAMERA_NAME = "cam_panel";
+ if (mCamButton)
+ mCamButton->onCommit();
}
BOOL LLBottomTray::postBuild()
{
+
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2));
+
mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
gMenuHolder->addChild(mBottomTrayContextMenu);
+
mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
mMovementPanel = getChild<LLPanel>("movement_panel");
@@ -276,167 +454,803 @@ BOOL LLBottomTray::postBuild()
mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
- if (mChicletPanel && mToolbarStack && mNearbyChatBar)
- {
- verifyChildControlsSizes();
- }
+ mSpeakPanel = getChild<LLPanel>("speak_panel");
+ mSpeakBtn = getChild<LLSpeakButton>("talk");
+
+ // Both parts of speak button should be initially disabled because
+ // it takes some time between logging in to world and connecting to voice channel.
+ mSpeakBtn->setSpeakBtnEnabled(false);
+ mSpeakBtn->setFlyoutBtnEnabled(false);
+
+ // Localization tool doesn't understand custom buttons like <talk_button>
+ mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+ mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+
+ // Registering Chat Bar to receive Voice client status change notifications.
+ gVoiceClient->addObserver(this);
+
+ mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
+ mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
+ mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth();
+ mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
+
+ mNearbyChatBar->getChatBox()->setContextMenu(NULL);
return TRUE;
}
-void LLBottomTray::verifyChildControlsSizes()
+bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
{
- LLRect rect = mChicletPanel->getRect();
- if (rect.getWidth() < mChicletPanel->getMinWidth())
+ std::string item = userdata.asString();
+ LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
+
+ if (item == "can_cut")
{
- mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
+ return edit_box->canCut();
}
+ else if (item == "can_copy")
+ {
+ return edit_box->canCopy();
+ }
+ else if (item == "can_paste")
+ {
+ return edit_box->canPaste();
+ }
+ else if (item == "can_delete")
+ {
+ return edit_box->canDoDelete();
+ }
+ else if (item == "can_select_all")
+ {
+ return edit_box->canSelectAll() && (edit_box->getLength()>0);
+ }
+ return true;
+}
+
- rect = mNearbyChatBar->getRect();
- if (rect.getWidth() < mNearbyChatBar->getMinWidth())
+void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
+
+ if (item == "cut")
{
- mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
+ edit_box->cut();
}
- else if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
+ else if (item == "copy")
{
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
- mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
- mNearbyChatBar->setRect(rect);
+ edit_box->copy();
}
+ else if (item == "paste")
+ {
+ edit_box->paste();
+ edit_box->setFocus(TRUE);
+ }
+ else if (item == "delete")
+ {
+ edit_box->doDelete();
+ }
+ else if (item == "select_all")
+ {
+ edit_box->selectAll();
+ }
+}
+
+void LLBottomTray::log(LLView* panel, const std::string& descr)
+{
+ if (NULL == panel) return;
+ LLView* layout = panel->getParent();
+ lldebugs << descr << ": "
+ << "panel: " << panel->getName()
+ << ", rect: " << panel->getRect()
+
+
+ << "layout: " << layout->getName()
+ << ", rect: " << layout->getRect()
+ << llendl
+ ;
}
void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
{
+ static S32 debug_calling_number = 0;
+ lldebugs << "**************************************** " << ++debug_calling_number << llendl;
+
+ S32 current_width = getRect().getWidth();
+ S32 delta_width = width - current_width;
+ lldebugs << "Reshaping: "
+ << ", width: " << width
+ << ", cur width: " << current_width
+ << ", delta_width: " << delta_width
+ << ", called_from_parent: " << called_from_parent
+ << llendl;
+
+ if (mNearbyChatBar) log(mNearbyChatBar, "before");
+ if (mChicletPanel) log(mChicletPanel, "before");
+
+ // stores width size on which bottom tray is less than width required by its children. EXT-991
+ static S32 extra_shrink_width = 0;
+ bool should_be_reshaped = true;
if (mChicletPanel && mToolbarStack && mNearbyChatBar)
{
-#ifdef __FEATURE_EXT_991__
- BOOL shrink = width < getRect().getWidth();
- const S32 MIN_RENDERED_CHARS = 3;
-#endif
+ // Firstly, update layout stack to ensure we deal with correct panel sizes.
+ {
+ BOOL saved_anim = mToolbarStack->getAnimate();
+ // Set chiclet panel to be autoresized by default.
+ mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+ // Disable animation to prevent layout updating in several frames.
+ mToolbarStack->setAnimate(FALSE);
+ // Force the updating of layout to reset panels collapse factor.
+ mToolbarStack->updateLayout();
+ // Restore animate state.
+ mToolbarStack->setAnimate(saved_anim);
+ }
- verifyChildControlsSizes();
- updateResizeState(width, height);
+ // bottom tray is narrowed
+ if (delta_width < 0)
+ {
+ if (extra_shrink_width > 0)
+ {
+ // is world rect was extra shrunk and decreasing again only update this value
+ // to delta_width negative
+ extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+ should_be_reshaped = false;
+ }
+ else
+ {
+ extra_shrink_width = processWidthDecreased(delta_width);
- switch (mResizeState)
+ // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
+ width += extra_shrink_width;
+ }
+ }
+ // bottom tray is widen
+ else
{
- case STATE_CHICLET_PANEL:
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+ if (extra_shrink_width > delta_width)
+ {
+ // Less than minimum width is more than increasing (delta_width)
+ // only reduce it value and make no reshape
+ extra_shrink_width -= delta_width;
+ should_be_reshaped = false;
+ }
+ else
+ {
+ if (extra_shrink_width > 0)
+ {
+ // If we have some extra shrink width let's reduce delta_width & width
+ delta_width -= extra_shrink_width;
+ width -= extra_shrink_width;
+ extra_shrink_width = 0;
+ }
+ processWidthIncreased(delta_width);
+ }
+ }
+ }
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+ if (should_be_reshaped)
+ {
+ lldebugs << "Reshape all children with width: " << width << llendl;
+ LLPanel::reshape(width, height, called_from_parent);
+ }
- break;
- case STATE_CHATBAR_INPUT:
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
+ if (mNearbyChatBar) log(mNearbyChatBar, "after");
+ if (mChicletPanel) log(mChicletPanel, "after");
+}
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+S32 LLBottomTray::processWidthDecreased(S32 delta_width)
+{
+ bool still_should_be_processed = true;
- break;
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+ const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
-#ifdef __FEATURE_EXT_991__
+ if (chiclet_panel_width > chiclet_panel_min_width)
+ {
+ // we have some space to decrease chiclet panel
+ S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
- case STATE_BUTTONS:
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE);
+ S32 delta_panel = llmin(-delta_width, panel_delta_min);
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
+ lldebugs << "delta_width: " << delta_width
+ << ", panel_delta_min: " << panel_delta_min
+ << ", delta_panel: " << delta_panel
+ << llendl;
- if (shrink)
- {
+ // is chiclet panel width enough to process resizing?
+ delta_width += panel_delta_min;
- if (mSnapshotPanel->getVisible())
- {
- showSnapshotButton(FALSE);
- }
+ still_should_be_processed = delta_width < 0;
- if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
- {
- showCameraButton(FALSE);
- }
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after processing panel decreasing via chiclet panel");
- if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
- {
- showMoveButton(FALSE);
- }
+ lldebugs << "RS_CHICLET_PANEL"
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
- }
- else
- {
- showMoveButton(TRUE);
- mMovementPanel->draw();
+ const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+ const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+ if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
+ {
+ // we have some space to decrease chatbar panel
+ S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
- if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS)
- {
- showMoveButton(TRUE);
- }
- else
- {
- showMoveButton(FALSE);
- }
- }
- break;
-#endif
+ S32 delta_panel = llmin(-delta_width, panel_delta_min);
- default:
- break;
+ // whether chatbar panel width is enough to process resizing?
+ delta_width += panel_delta_min;
+
+ still_should_be_processed = delta_width < 0;
+
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
+
+ log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel");
+
+ lldebugs << "RS_CHATBAR_INPUT"
+ << ", delta_panel: " << delta_panel
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
+
+ S32 extra_shrink_width = 0;
+ S32 buttons_freed_width = 0;
+ if (still_should_be_processed)
+ {
+ processShrinkButtons(&delta_width, &buttons_freed_width);
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ extra_shrink_width = -delta_width;
+ llwarns << "There is no enough width to reshape all children: "
+ << extra_shrink_width << llendl;
+ }
+
+ if (buttons_freed_width > 0)
+ {
+ log(mNearbyChatBar, "before applying compensative width");
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() );
+ log(mNearbyChatBar, "after applying compensative width");
+ lldebugs << buttons_freed_width << llendl;
}
}
- LLPanel::reshape(width, height, called_from_parent);
+ return extra_shrink_width;
}
-void LLBottomTray::updateResizeState(S32 width, S32 height)
+void LLBottomTray::processWidthIncreased(S32 delta_width)
{
- mResizeState = STATE_BUTTONS;
+ if (delta_width <= 0) return;
- const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth();
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
- // bottom tray is narrowed
- if (width < getRect().getWidth())
+ const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
+ const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
+
+ // how many room we have to show hidden buttons
+ S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
+
+ lldebugs << "Processing extending, available width:"
+ << ", chatbar - " << chatbar_available_shrink_width
+ << ", chiclets - " << available_width_chiclet
+ << ", total - " << total_available_width
+ << llendl;
+
+ S32 available_width = total_available_width;
+ if (available_width > 0)
+ {
+ processShowButton(RS_BUTTON_GESTURES, &available_width);
+ }
+
+ if (available_width > 0)
+ {
+ processShowButton(RS_BUTTON_MOVEMENT, &available_width);
+ }
+
+ if (available_width > 0)
+ {
+ processShowButton(RS_BUTTON_CAMERA, &available_width);
+ }
+
+ if (available_width > 0)
{
- if (chiclet_panel_width > chiclet_panel_min_width)
+ processShowButton(RS_BUTTON_SNAPSHOT, &available_width);
+ }
+
+ processExtendButtons(&available_width);
+
+ // if we have to show/extend some buttons but resized delta width is not enough...
+ S32 processed_width = total_available_width - available_width;
+ if (processed_width > delta_width)
+ {
+ // ... let's shrink nearby chat & chiclet panels
+ S32 required_to_process_width = processed_width;
+
+ // 1. use delta width of resizing
+ required_to_process_width -= delta_width;
+
+ // 2. use width available via decreasing of nearby chat panel
+ S32 chatbar_shrink_width = required_to_process_width;
+ if (chatbar_available_shrink_width < chatbar_shrink_width)
{
- mResizeState = STATE_CHICLET_PANEL;
+ chatbar_shrink_width = chatbar_available_shrink_width;
}
- else if (chatbar_panel_width > chatbar_panel_min_width)
+
+ log(mNearbyChatBar, "increase width: before applying compensative width");
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() );
+ if (mNearbyChatBar) log(mNearbyChatBar, "after applying compensative width");
+ lldebugs << chatbar_shrink_width << llendl;
+
+ // 3. use width available via decreasing of chiclet panel
+ required_to_process_width -= chatbar_shrink_width;
+
+ if (required_to_process_width > 0)
{
- mResizeState = STATE_CHATBAR_INPUT;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after applying compensative width for chiclets: ");
+ lldebugs << required_to_process_width << llendl;
}
- else
+
+ }
+
+ // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
+ delta_width -= processed_width;
+
+
+ // how many space can nearby chatbar take?
+ S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
+ if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
+ {
+ S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
+ S32 delta_panel = llmin(delta_width, delta_panel_max);
+ lldebugs << "Unprocesed delta width: " << delta_width
+ << ", can be applied to chatbar: " << delta_panel_max
+ << ", will be applied: " << delta_panel
+ << llendl;
+
+ delta_width -= delta_panel_max;
+ mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+ log(mNearbyChatBar, "applied unprocessed delta width");
+ }
+}
+
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width)
+{
+ lldebugs << "Trying to show object type: " << shown_object_type << llendl;
+
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+ return false;
+ }
+ bool can_be_shown = canButtonBeShown(shown_object_type);
+ if (can_be_shown)
+ {
+ //validate if we have enough room to show this button
+ const S32 required_width = panel->getRect().getWidth();
+ can_be_shown = *available_width >= required_width;
+ if (can_be_shown)
+ {
+ *available_width -= required_width;
+
+ setTrayButtonVisible(shown_object_type, true);
+
+ lldebugs << "processed object type: " << shown_object_type
+ << ", rest available width: " << *available_width
+ << llendl;
+ mResizeState &= ~shown_object_type;
+ }
+ }
+ return can_be_shown;
+}
+
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
+{
+ lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
+
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (panel->getVisible())
+ {
+ *required_width += panel->getRect().getWidth();
+
+ if (*required_width > 0)
{
- mResizeState = STATE_BUTTONS;
+ *buttons_freed_width += *required_width;
}
+
+ setTrayButtonVisible(processed_object_type, false);
+
+ mResizeState |= processed_object_type;
+
+ lldebugs << "processing object type: " << processed_object_type
+ << ", buttons_freed_width: " << *buttons_freed_width
+ << llendl;
}
- // bottom tray is widen
- else
+}
+
+void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width)
+{
+ processShrinkButton(RS_BUTTON_CAMERA, required_width);
+
+ if (*required_width < 0)
+ {
+ processShrinkButton(RS_BUTTON_MOVEMENT, required_width);
+ }
+ if (*required_width < 0)
+ {
+ processShrinkButton(RS_BUTTON_GESTURES, required_width);
+ }
+ if (*required_width < 0)
{
-#ifdef __FEATURE_EXT_991__
- if (!mMovementPanel->getVisible())
+
+ S32 panel_min_width = 0;
+ std::string panel_name = mSpeakPanel->getName();
+ bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+ if (!success)
{
- mResizeState = STATE_BUTTONS;
+ lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
}
else
-#endif
- if (chatbar_panel_width < chatbar_panel_max_width)
{
- mResizeState = STATE_CHATBAR_INPUT;
+ S32 panel_width = mSpeakPanel->getRect().getWidth();
+ S32 possible_shrink_width = panel_width - panel_min_width;
+
+ if (possible_shrink_width > 0)
+ {
+ mSpeakBtn->setLabelVisible(false);
+ mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
+
+ *required_width += possible_shrink_width;
+
+ if (*required_width > 0)
+ {
+ *buttons_freed_width += *required_width;
+ }
+
+ lldebugs << "Shrunk panel: " << panel_name
+ << ", shrunk width: " << possible_shrink_width
+ << ", rest width to process: " << *required_width
+ << llendl;
+ }
+ }
+ }
+}
+
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (panel->getVisible())
+ {
+ S32 panel_width = panel->getRect().getWidth();
+ S32 panel_min_width = 0;
+ std::string panel_name = panel->getName();
+ bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+ S32 possible_shrink_width = panel_width - panel_min_width;
+
+ if (!success)
+ {
+ lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
+ }
+ // we have some space to free by shrinking the button
+ else if (possible_shrink_width > 0)
+ {
+ // let calculate real width to shrink
+
+ // 1. apply all possible width
+ *required_width += possible_shrink_width;
+
+ // 2. it it is too much...
+ if (*required_width > 0)
+ {
+ // reduce applied shrunk width to the excessive value.
+ possible_shrink_width -= *required_width;
+ *required_width = 0;
+ }
+ panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
+
+ lldebugs << "Shrunk panel: " << panel_name
+ << ", shrunk width: " << possible_shrink_width
+ << ", rest width to process: " << *required_width
+ << llendl;
+ }
+ }
+}
+
+
+void LLBottomTray::processExtendButtons(S32* available_width)
+{
+ // do not allow extending any buttons if we have some buttons hidden
+ if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
+
+ processExtendButton(RS_BUTTON_GESTURES, available_width);
+
+ if (*available_width > 0)
+ {
+ processExtendButton(RS_BUTTON_MOVEMENT, available_width);
+ }
+ if (*available_width > 0)
+ {
+ processExtendButton(RS_BUTTON_CAMERA, available_width);
+ }
+ if (*available_width > 0)
+ {
+ S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
+ S32 panel_width = mSpeakPanel->getRect().getWidth();
+ S32 possible_extend_width = panel_max_width - panel_width;
+ if (possible_extend_width >= 0 && possible_extend_width <= *available_width) // HACK: this button doesn't change size so possible_extend_width will be 0
+ {
+ mSpeakBtn->setLabelVisible(true);
+ mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
+ log(mSpeakBtn, "speak button is extended");
+
+ *available_width -= possible_extend_width;
+
+ lldebugs << "Extending panel: " << mSpeakPanel->getName()
+ << ", extended width: " << possible_extend_width
+ << ", rest width to process: " << *available_width
+ << llendl;
+ }
+ }
+}
+
+void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (!panel->getVisible()) return;
+
+ S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
+ S32 panel_width = panel->getRect().getWidth();
+ S32 possible_extend_width = panel_max_width - panel_width;
+
+ if (possible_extend_width > 0)
+ {
+ // let calculate real width to extend
+
+ // 1. apply all possible width
+ *available_width -= possible_extend_width;
+
+ // 2. it it is too much...
+ if (*available_width < 0)
+ {
+ // reduce applied extended width to the excessive value.
+ possible_extend_width += *available_width;
+ *available_width = 0;
+ }
+ panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
+
+ lldebugs << "Extending panel: " << panel->getName()
+ << ", extended width: " << possible_extend_width
+ << ", rest width to process: " << *available_width
+ << llendl;
+ }
+}
+
+bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
+{
+ bool can_be_shown = mResizeState & processed_object_type;
+ if (can_be_shown)
+ {
+ static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
+ static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
+ static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+
+ switch(processed_object_type)
+ {
+ case RS_BUTTON_GESTURES: // Gestures should be shown first
+ break;
+ case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
+ can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_CAMERA:
+ can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_SNAPSHOT:
+ can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ default: // nothing to do here
+ break;
+ }
+ }
+ return can_be_shown;
+}
+
+void LLBottomTray::initStateProcessedObjectMap()
+{
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
+
+ mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel")));
+ mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel")));
+ mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLUICtrl>("after_cam_panel")));
+ mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLUICtrl>("after_speak_panel")));
+}
+
+void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
+{
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
+ return;
+ }
+
+ panel->setVisible(visible);
+
+ if (mDummiesMap.count(shown_object_type))
+ {
+ // Hide/show layout panel for dummy icon.
+ mDummiesMap[shown_object_type]->getParent()->setVisible(visible);
+ }
+}
+
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
+{
+ if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification)
+ {
+ LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown",
+ LLSD(),
+ LLSD(),
+ LLNotificationFunctorRegistry::instance().DONOTHING);
+ }
+}
+
+bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
+{
+ LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
+ if (NULL == cur_panel)
+ {
+ lldebugs << "There is no object to process for state: " << object_type << llendl;
+ return false;
+ }
+
+ const S32 dummy_width = mDummiesMap.count(object_type)
+ ? mDummiesMap[object_type]->getParent()->getRect().getWidth()
+ : 0;
+
+ bool is_set = true;
+
+ if (visible)
+ {
+ // Assume that only chiclet panel can be auto-resized and
+ // don't take into account width of dummy widgets
+ const S32 available_width =
+ mChicletPanel->getParent()->getRect().getWidth() -
+ mChicletPanel->getMinWidth() -
+ dummy_width;
+
+ S32 preferred_width = mObjectDefaultWidthMap[object_type];
+ S32 current_width = cur_panel->getRect().getWidth();
+ S32 result_width = 0;
+ bool decrease_width = false;
+
+ // Mark this button to be shown
+ mResizeState |= object_type;
+
+ if (preferred_width > 0 && available_width >= preferred_width)
+ {
+ result_width = preferred_width;
+ }
+ else if (available_width >= current_width)
+ {
+ result_width = current_width;
}
else
{
- mResizeState = STATE_CHICLET_PANEL;
+ // Calculate the possible shrunk width as difference between current and minimal widths
+ const S32 chatbar_shrunk_width =
+ mNearbyChatBar->getRect().getWidth() - mNearbyChatBar->getMinWidth();
+
+ const S32 sum_of_min_widths =
+ get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_CAMERA]) +
+ get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_MOVEMENT]) +
+ get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_GESTURES]) +
+ get_panel_min_width(mToolbarStack, mSpeakPanel);
+
+ const S32 sum_of_curr_widths =
+ get_curr_width(mStateProcessedObjectMap[RS_BUTTON_CAMERA]) +
+ get_curr_width(mStateProcessedObjectMap[RS_BUTTON_MOVEMENT]) +
+ get_curr_width(mStateProcessedObjectMap[RS_BUTTON_GESTURES]) +
+ get_curr_width(mSpeakPanel);
+
+ const S32 possible_shrunk_width =
+ chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths);
+
+ // Minimal width of current panel
+ S32 minimal_width = 0;
+ mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width, NULL);
+
+ if ( (available_width + possible_shrunk_width) >= minimal_width)
+ {
+ // There is enough space for minimal width, but set the result_width
+ // to preferred_width so buttons widths decreasing will be done in predefined order
+ result_width = (preferred_width > 0) ? preferred_width : current_width;
+ decrease_width = true;
+ }
+ else
+ {
+ // Nothing can be done, give up...
+ return false;
+ }
+ }
+
+ if (result_width != current_width)
+ {
+ cur_panel->reshape(result_width, cur_panel->getRect().getHeight());
+ current_width = result_width;
+ }
+
+ is_set = processShowButton(object_type, &current_width);
+
+ // Shrink buttons if needed
+ if (is_set && decrease_width)
+ {
+ processWidthDecreased( -result_width - dummy_width );
}
}
+ else
+ {
+ const S32 delta_width = get_curr_width(cur_panel);
+
+ setTrayButtonVisible(object_type, false);
+ // Mark button NOT to show while future bottom tray extending
+ mResizeState &= ~object_type;
- // TODO: finish implementation
+ // Extend other buttons if need
+ if (delta_width)
+ {
+ processWidthIncreased(delta_width + dummy_width);
+ }
+ }
+ return is_set;
}
+
+//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index a28f1e42ec..18c14e5e19 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -33,7 +33,7 @@
#ifndef LL_LLBOTTOMPANEL_H
#define LL_LLBOTTOMPANEL_H
-#include <llmenugl.h>
+#include "llmenugl.h"
#include "llpanel.h"
#include "llimview.h"
@@ -43,24 +43,32 @@ class LLChicletPanel;
class LLLineEditor;
class LLLayoutStack;
class LLNotificationChiclet;
-class LLTalkButton;
+class LLSpeakButton;
class LLNearbyChatBar;
class LLIMChiclet;
+class LLBottomTrayLite;
+
+// Build time optimization, generate once in .cpp file
+#ifndef LLBOTTOMTRAY_CPP
+extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
+#endif
class LLBottomTray
: public LLSingleton<LLBottomTray>
, public LLPanel
, public LLIMSessionObserver
+ , public LLVoiceClientStatusObserver
{
+ LOG_CLASS(LLBottomTray);
friend class LLSingleton<LLBottomTray>;
+ friend class LLBottomTrayLite;
public:
~LLBottomTray();
BOOL postBuild();
LLChicletPanel* getChicletPanel() {return mChicletPanel;}
- LLNotificationChiclet* getSysWell() {return mSysWell;}
- LLNearbyChatBar* getNearbyChatBar() {return mNearbyChatBar;}
+ LLNearbyChatBar* getNearbyChatBar();
void onCommitGesture(LLUICtrl* ctrl);
@@ -69,11 +77,16 @@ public:
virtual void sessionRemoved(const LLUUID& session_id);
void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ S32 getTotalUnreadIMCount();
+
virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
- virtual void onFocusLost();
virtual void setVisible(BOOL visible);
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the speak
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
void showGestureButton(BOOL visible);
@@ -81,19 +94,106 @@ public:
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
-private:
+ void toggleMovementControls();
+ void toggleCameraControls();
+
+ void onMouselookModeIn();
+ void onMouselookModeOut();
+
+ /**
+ * Creates IM Chiclet based on session type (IM chat or Group chat)
+ */
+ LLIMChiclet* createIMChiclet(const LLUUID& session_id);
- enum EResizeState
+private:
+ typedef enum e_resize_status_type
{
- STATE_CHICLET_PANEL = 1,
- STATE_CHATBAR_INPUT,
- STATE_BUTTONS
- };
+ RS_NORESIZE = 0x0000
+ , RS_CHICLET_PANEL = 0x0001
+ , RS_CHATBAR_INPUT = 0x0002
+ , RS_BUTTON_SNAPSHOT = 0x0004
+ , RS_BUTTON_CAMERA = 0x0008
+ , RS_BUTTON_MOVEMENT = 0x0010
+ , RS_BUTTON_GESTURES = 0x0020
+ , RS_BUTTON_SPEAK = 0x0040
+
+ /**
+ * Specifies buttons which can be hidden when bottom tray is shrunk.
+ * They are: Gestures, Movement (Move), Camera (View), Snapshot
+ */
+ , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+ }EResizeState;
+
+ S32 processWidthDecreased(S32 delta_width);
+ void processWidthIncreased(S32 delta_width);
+ void log(LLView* panel, const std::string& descr);
+ bool processShowButton(EResizeState shown_object_type, S32* available_width);
+ void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
- void updateResizeState(S32 width, S32 height);
- void verifyChildControlsSizes();
+ /**
+ * Shrinks shown buttons to reduce total taken space.
+ *
+ * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
+ * It is increased on the value processed by buttons.
+ */
+ void processShrinkButtons(S32* required_width, S32* buttons_freed_width);
+ void processShrinkButton(EResizeState processed_object_type, S32* required_width);
- EResizeState mResizeState;
+ /**
+ * Extends shown buttons to increase total taken space.
+ *
+ * @param - available_width - width which buttons can use to be extended. It is a positive value.
+ * It is decreased on the value processed by buttons.
+ */
+ void processExtendButtons(S32* available_width);
+ void processExtendButton(EResizeState processed_object_type, S32* available_width);
+
+ /**
+ * Determines if specified by type object can be shown. It should be hidden by shrink before.
+ *
+ * Processes buttons a such way to show buttons in constant order:
+ * - Gestures, Move, View, Snapshot
+ */
+ bool canButtonBeShown(EResizeState processed_object_type) const;
+ void initStateProcessedObjectMap();
+
+ /**
+ * Sets passed visibility to object specified by resize type.
+ */
+ void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
+
+ /**
+ * Sets passed visibility to object specified by resize type if it is possible.
+ *
+ * If it is impossible to show required button due to there is no enough room in bottom tray
+ * it will no be shown. Is called via context menu commands.
+ * In this case Alert Dialog will be shown to notify user about that.
+ *
+ * Method also stores resize state to be processed while future bottom tray extending:
+ * - if hidden while resizing button should be hidden it will not be shown while extending;
+ * - if hidden via context menu button should be shown but there is no enough room for now
+ * it will be shown while extending.
+ */
+ void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true);
+
+ /**
+ * Sets passed visibility to required button and fit widths of shown
+ * buttons(notice that method can shrink widths to
+ * allocate needed room in bottom tray).
+ * Returns true if visibility of required button was set.
+ */
+ bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
+
+ MASK mResizeState;
+
+ typedef std::map<EResizeState, LLPanel*> state_object_map_t;
+ state_object_map_t mStateProcessedObjectMap;
+
+ typedef std::map<EResizeState, S32> state_object_width_map_t;
+ state_object_width_map_t mObjectDefaultWidthMap;
+
+ typedef std::map<EResizeState, LLUICtrl*> dummies_map_t;
+ dummies_map_t mDummiesMap;
protected:
@@ -103,14 +203,13 @@ protected:
static void* createNearbyChatBar(void* userdata);
- /**
- * Creates IM Chiclet based on session type (IM chat or Group chat)
- */
- LLIMChiclet* createIMChiclet(const LLUUID& session_id);
+ void updateContextMenu(S32 x, S32 y, MASK mask);
+ void onContextMenuItemClicked(const LLSD& userdata);
+ bool onContextMenuItemEnabled(const LLSD& userdata);
LLChicletPanel* mChicletPanel;
- LLNotificationChiclet* mSysWell;
- LLTalkButton* mTalkBtn;
+ LLPanel* mSpeakPanel;
+ LLSpeakButton* mSpeakBtn;
LLNearbyChatBar* mNearbyChatBar;
LLLayoutStack* mToolbarStack;
LLMenuGL* mBottomTrayContextMenu;
@@ -120,6 +219,8 @@ protected:
LLPanel* mGesturePanel;
LLButton* mCamButton;
LLButton* mMovementButton;
+ LLBottomTrayLite* mBottomTrayLite;
+ bool mIsInLiteMode;
};
#endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
new file mode 100644
index 0000000000..76e058a1c3
--- /dev/null
+++ b/indra/newview/llcallfloater.cpp
@@ -0,0 +1,789 @@
+/**
+ * @file llcallfloater.cpp
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llnotificationsutil.h"
+#include "lltrans.h"
+
+#include "llcallfloater.h"
+
+#include "llagent.h"
+#include "llagentdata.h" // for gAgentID
+#include "llavatariconctrl.h"
+#include "llavatarlist.h"
+#include "llbottomtray.h"
+#include "lldraghandle.h"
+#include "llimfloater.h"
+#include "llfloaterreg.h"
+#include "llparticipantlist.h"
+#include "llspeakers.h"
+#include "lltextutil.h"
+#include "lltransientfloatermgr.h"
+#include "llviewerwindow.h"
+#include "llvoicechannel.h"
+#include "llviewerparcelmgr.h"
+
+static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids);
+void reshape_floater(LLCallFloater* floater, S32 delta_height);
+
+class LLNonAvatarCaller : public LLAvatarListItem
+{
+public:
+ LLNonAvatarCaller() : LLAvatarListItem(false)
+ {
+
+ }
+ BOOL postBuild()
+ {
+ BOOL rv = LLAvatarListItem::postBuild();
+
+ if (rv)
+ {
+ setOnline(true);
+ showLastInteractionTime(false);
+ setShowProfileBtn(false);
+ setShowInfoBtn(false);
+ mAvatarIcon->setValue("Avaline_Icon");
+ mAvatarIcon->setToolTip(std::string(""));
+ }
+ return rv;
+ }
+
+ void setName(const std::string& name)
+ {
+ const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
+ LLAvatarListItem::setName(formatted_phone);
+ }
+
+ void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); }
+};
+
+
+static void* create_non_avatar_caller(void*)
+{
+ return new LLNonAvatarCaller;
+}
+
+LLVoiceChannel* LLCallFloater::sCurrentVoiceCanel = NULL;
+
+LLCallFloater::LLCallFloater(const LLSD& key)
+: LLTransientDockableFloater(NULL, false, key)
+, mSpeakerManager(NULL)
+, mParticipants(NULL)
+, mAvatarList(NULL)
+, mNonAvatarCaller(NULL)
+, mVoiceType(VC_LOCAL_CHAT)
+, mAgentPanel(NULL)
+, mSpeakingIndicator(NULL)
+, mIsModeratorMutedVoice(false)
+, mInitParticipantsVoiceState(false)
+{
+ static LLUICachedControl<S32> voice_left_remove_delay ("VoiceParticipantLeftRemoveDelay", 10);
+ mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), voice_left_remove_delay);
+
+ mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
+ LLVoiceClient::getInstance()->addObserver(this);
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
+}
+
+LLCallFloater::~LLCallFloater()
+{
+ resetVoiceRemoveTimers();
+ delete mSpeakerDelayRemover;
+
+ delete mParticipants;
+ mParticipants = NULL;
+
+ mAvatarListRefreshConnection.disconnect();
+ mVoiceChannelStateChangeConnection.disconnect();
+
+ // Don't use LLVoiceClient::getInstance() here
+ // singleton MAY have already been destroyed.
+ if(gVoiceClient)
+ {
+ gVoiceClient->removeObserver(this);
+ }
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+// virtual
+BOOL LLCallFloater::postBuild()
+{
+ LLTransientDockableFloater::postBuild();
+ mAvatarList = getChild<LLAvatarList>("speakers_list");
+ mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this));
+
+ childSetAction("leave_call_btn", boost::bind(&LLCallFloater::leaveCall, this));
+
+ mNonAvatarCaller = getChild<LLNonAvatarCaller>("non_avatar_caller");
+ mNonAvatarCaller->setVisible(FALSE);
+
+ LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn");
+
+ setDockControl(new LLDockControl(
+ anchor_panel, this,
+ getDockTongue(), LLDockControl::TOP));
+
+ initAgentData();
+
+
+ connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
+
+ setIsChrome(true);
+ //chrome="true" hides floater caption
+ if (mDragHandle)
+ mDragHandle->setTitleVisible(TRUE);
+
+ updateSession();
+
+ return TRUE;
+}
+
+// virtual
+void LLCallFloater::onOpen(const LLSD& /*key*/)
+{
+}
+
+// virtual
+void LLCallFloater::draw()
+{
+ // we have to refresh participants to display ones not in voice as disabled.
+ // It should be done only when she joins or leaves voice chat.
+ // But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.
+ // *TODO: mantipov: remove from draw()
+
+ // NOTE: it looks like calling onChange() here is not necessary,
+ // but sometime it is not called properly from the observable object.
+ // Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent)
+// onChange();
+
+ bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
+
+ if (mIsModeratorMutedVoice != is_moderator_muted)
+ {
+ setModeratorMutedVoice(is_moderator_muted);
+ }
+
+ // Need to resort the participant list if it's in sort by recent speaker order.
+ if (mParticipants)
+ mParticipants->updateRecentSpeakersOrder();
+
+ LLTransientDockableFloater::draw();
+}
+
+// virtual
+void LLCallFloater::onChange()
+{
+ if (NULL == mParticipants) return;
+
+ updateParticipantsVoiceState();
+
+ // Add newly joined participants.
+ std::vector<LLUUID> speakers_uuids;
+ get_voice_participants_uuids(speakers_uuids);
+ for (std::vector<LLUUID>::const_iterator it = speakers_uuids.begin(); it != speakers_uuids.end(); it++)
+ {
+ mParticipants->addAvatarIDExceptAgent(*it);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+
+void LLCallFloater::leaveCall()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice_channel)
+ {
+ voice_channel->deactivate();
+ }
+}
+
+void LLCallFloater::updateSession()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice_channel)
+ {
+ lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl;
+
+ if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID())
+ {
+ lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl;
+ return;
+ }
+ else
+ {
+ mSpeakerManager = NULL;
+ }
+ }
+
+ const LLUUID& session_id = voice_channel ? voice_channel->getSessionID() : LLUUID::null;
+ lldebugs << "Set speaker manager for session: " << session_id << llendl;
+
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (im_session)
+ {
+ mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ switch (im_session->mType)
+ {
+ case IM_NOTHING_SPECIAL:
+ case IM_SESSION_P2P_INVITE:
+ mVoiceType = VC_PEER_TO_PEER;
+
+ if (!im_session->mOtherParticipantIsAvatar)
+ {
+ mVoiceType = VC_PEER_TO_PEER_AVALINE;
+ }
+ break;
+ case IM_SESSION_CONFERENCE_START:
+ case IM_SESSION_GROUP_START:
+ case IM_SESSION_INVITE:
+ if (gAgent.isInGroup(session_id))
+ {
+ mVoiceType = VC_GROUP_CHAT;
+ }
+ else
+ {
+ mVoiceType = VC_AD_HOC_CHAT;
+ }
+ break;
+ default:
+ llwarning("Failed to determine voice call IM type", 0);
+ mVoiceType = VC_GROUP_CHAT;
+ break;
+ }
+ }
+
+ if (NULL == mSpeakerManager)
+ {
+ // by default let show nearby chat participants
+ mSpeakerManager = LLLocalSpeakerMgr::getInstance();
+ lldebugs << "Set DEFAULT speaker manager" << llendl;
+ mVoiceType = VC_LOCAL_CHAT;
+ }
+
+ updateTitle();
+
+ //hide "Leave Call" button for nearby chat
+ bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
+ childSetVisible("leave_call_btn_panel", !is_local_chat);
+
+ refreshParticipantList();
+ updateAgentModeratorState();
+
+ //show floater for voice calls & only in CONNECTED to voice channel state
+ if (!is_local_chat &&
+ voice_channel &&
+ LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
+ {
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ bool show_me = !(im_floater && im_floater->getVisible());
+ if (show_me)
+ {
+ setVisible(true);
+ }
+ }
+}
+
+void LLCallFloater::refreshParticipantList()
+{
+ bool non_avatar_caller = VC_PEER_TO_PEER_AVALINE == mVoiceType;
+
+ if (non_avatar_caller)
+ {
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSpeakerManager->getSessionID());
+ mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID);
+ mNonAvatarCaller->setName(session->mName);
+ }
+
+ mNonAvatarCaller->setVisible(non_avatar_caller);
+ mAvatarList->setVisible(!non_avatar_caller);
+
+ if (!non_avatar_caller)
+ {
+ mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);
+ mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
+ mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);
+
+ if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
+ {
+ mAvatarList->setNoItemsCommentText(getString("no_one_near"));
+ }
+
+ // we have to made delayed initialization of voice state of participant list.
+ // it will be performed after first LLAvatarList refreshing in the onAvatarListRefreshed().
+ mInitParticipantsVoiceState = true;
+ }
+}
+
+void LLCallFloater::onAvatarListRefreshed()
+{
+ if (mInitParticipantsVoiceState)
+ {
+ initParticipantsVoiceState();
+ mInitParticipantsVoiceState = false;
+ }
+ else
+ {
+ updateParticipantsVoiceState();
+ }
+}
+
+// static
+void LLCallFloater::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
+{
+ LLVoiceChannel* channel = LLVoiceChannel::getCurrentVoiceChannel();
+
+ // *NOTE: if signal was sent for voice channel with LLVoiceChannel::STATE_NO_CHANNEL_INFO
+ // it sill be sent for the same channel again (when state is changed).
+ // So, lets ignore this call.
+ if (channel == sCurrentVoiceCanel) return;
+
+ LLCallFloater* call_floater = LLFloaterReg::getTypedInstance<LLCallFloater>("voice_controls");
+
+ call_floater->connectToChannel(channel);
+}
+
+void LLCallFloater::updateTitle()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ std::string title;
+ switch (mVoiceType)
+ {
+ case VC_LOCAL_CHAT:
+ title = getString("title_nearby");
+ break;
+ case VC_PEER_TO_PEER:
+ case VC_PEER_TO_PEER_AVALINE:
+ {
+ title = voice_channel->getSessionName();
+
+ if (VC_PEER_TO_PEER_AVALINE == mVoiceType)
+ {
+ title = LLTextUtil::formatPhoneNumber(title);
+ }
+
+ LLStringUtil::format_map_t args;
+ args["[NAME]"] = title;
+ title = getString("title_peer_2_peer", args);
+ }
+ break;
+ case VC_AD_HOC_CHAT:
+ title = getString("title_adhoc");
+ break;
+ case VC_GROUP_CHAT:
+ {
+ LLStringUtil::format_map_t args;
+ args["[GROUP]"] = voice_channel->getSessionName();
+ title = getString("title_group", args);
+ }
+ break;
+ }
+
+ setTitle(title);
+}
+
+void LLCallFloater::initAgentData()
+{
+ mAgentPanel = getChild<LLPanel> ("my_panel");
+
+ if ( mAgentPanel )
+ {
+ mAgentPanel->childSetValue("user_icon", gAgentID);
+
+ std::string name;
+ gCacheName->getFullName(gAgentID, name);
+ mAgentPanel->childSetValue("user_text", name);
+
+ mSpeakingIndicator = mAgentPanel->getChild<LLOutputMonitorCtrl>("speaking_indicator");
+ mSpeakingIndicator->setSpeakerId(gAgentID);
+ }
+}
+
+void LLCallFloater::setModeratorMutedVoice(bool moderator_muted)
+{
+ mIsModeratorMutedVoice = moderator_muted;
+
+ if (moderator_muted)
+ {
+ LLNotificationsUtil::add("VoiceIsMutedByModerator");
+ }
+ mSpeakingIndicator->setIsMuted(moderator_muted);
+}
+
+void LLCallFloater::updateAgentModeratorState()
+{
+ std::string name;
+ gCacheName->getFullName(gAgentID, name);
+
+ if(gAgent.isInGroup(mSpeakerManager->getSessionID()))
+ {
+ // This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO
+ // in this case there are no any speakers yet.
+ if (mSpeakerManager->findSpeaker(gAgentID))
+ {
+ // Agent is Moderator
+ if (mSpeakerManager->findSpeaker(gAgentID)->mIsModerator)
+
+ {
+ const std::string moderator_indicator(LLTrans::getString("IM_moderator_label"));
+ name += " " + moderator_indicator;
+ }
+ }
+ }
+ mAgentPanel->childSetValue("user_text", name);
+}
+
+static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids)
+{
+ // Get a list of participants from VoiceClient
+ LLVoiceClient::participantMap *voice_map = gVoiceClient->getParticipantList();
+ if (voice_map)
+ {
+ for (LLVoiceClient::participantMap::const_iterator iter = voice_map->begin();
+ iter != voice_map->end(); ++iter)
+ {
+ LLUUID id = (*iter).second->mAvatarID;
+ speakers_uuids.push_back(id);
+ }
+ }
+}
+
+void LLCallFloater::initParticipantsVoiceState()
+{
+ // Set initial status for each participant in the list.
+ std::vector<LLPanel*> items;
+ mAvatarList->getItems(items);
+ std::vector<LLPanel*>::const_iterator
+ it = items.begin(),
+ it_end = items.end();
+
+
+ std::vector<LLUUID> speakers_uuids;
+ get_voice_participants_uuids(speakers_uuids);
+
+ for(; it != it_end; ++it)
+ {
+ LLAvatarListItem *item = dynamic_cast<LLAvatarListItem*>(*it);
+
+ if (!item) continue;
+
+ LLUUID speaker_id = item->getAvatarId();
+
+ std::vector<LLUUID>::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id);
+
+ // If an avatarID assigned to a panel is found in a speakers list
+ // obtained from VoiceClient we assign the JOINED status to the owner
+ // of this avatarID.
+ if (speaker_iter != speakers_uuids.end())
+ {
+ setState(item, STATE_JOINED);
+ }
+ else
+ {
+ LLPointer<LLSpeaker> speakerp = mSpeakerManager->findSpeaker(speaker_id);
+ // If someone has already left the call before, we create his
+ // avatar row panel with HAS_LEFT status and remove it after
+ // the timeout, otherwise we create a panel with INVITED status
+ if (speakerp.notNull() && speakerp.get()->mHasLeftCurrentCall)
+ {
+ setState(item, STATE_LEFT);
+ }
+ else
+ {
+ setState(item, STATE_INVITED);
+ }
+ }
+ }
+}
+
+void LLCallFloater::updateParticipantsVoiceState()
+{
+ std::vector<LLUUID> speakers_list;
+
+ // Get a list of participants from VoiceClient
+ std::vector<LLUUID> speakers_uuids;
+ get_voice_participants_uuids(speakers_uuids);
+
+ // Updating the status for each participant already in list.
+ std::vector<LLPanel*> items;
+ mAvatarList->getItems(items);
+ std::vector<LLPanel*>::const_iterator
+ it = items.begin(),
+ it_end = items.end();
+
+ for(; it != it_end; ++it)
+ {
+ LLAvatarListItem *item = dynamic_cast<LLAvatarListItem*>(*it);
+ if (!item) continue;
+
+ const LLUUID participant_id = item->getAvatarId();
+ bool found = false;
+
+ std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);
+
+ lldebugs << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << llendl;
+
+ // If an avatarID assigned to a panel is found in a speakers list
+ // obtained from VoiceClient we assign the JOINED status to the owner
+ // of this avatarID.
+ if (speakers_iter != speakers_uuids.end())
+ {
+ setState(item, STATE_JOINED);
+
+ LLPointer<LLSpeaker> speaker = mSpeakerManager->findSpeaker(participant_id);
+ if (speaker.isNull())
+ continue;
+ speaker->mHasLeftCurrentCall = FALSE;
+
+ speakers_uuids.erase(speakers_iter);
+ found = true;
+ }
+
+ if (!found)
+ {
+ updateNotInVoiceParticipantState(item);
+ }
+ }
+}
+
+void LLCallFloater::updateNotInVoiceParticipantState(LLAvatarListItem* item)
+{
+ LLUUID participant_id = item->getAvatarId();
+ ESpeakerState current_state = getState(participant_id);
+
+ switch (current_state)
+ {
+ case STATE_JOINED:
+ // If an avatarID is not found in a speakers list from VoiceClient and
+ // a panel with this ID has a JOINED status this means that this person
+ // HAS LEFT the call.
+ setState(item, STATE_LEFT);
+
+ {
+ LLPointer<LLSpeaker> speaker = mSpeakerManager->findSpeaker(participant_id);
+ if (speaker.notNull())
+ {
+ speaker->mHasLeftCurrentCall = TRUE;
+ }
+ }
+ break;
+ case STATE_INVITED:
+ case STATE_LEFT:
+ // nothing to do. These states should not be changed.
+ break;
+ case STATE_UNKNOWN:
+ // If an avatarID is not found in a speakers list from VoiceClient and
+ // a panel with this ID has an UNKNOWN status this means that this person
+ // HAS ENTERED session but it is not in voice chat yet. So, set INVITED status
+ setState(item, STATE_INVITED);
+ break;
+ default:
+ // for possible new future states.
+ llwarns << "Unsupported (" << getState(participant_id) << ") state for: " << item->getAvatarName() << llendl;
+ break;
+ }
+}
+
+void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)
+{
+ // *HACK: mantipov: sometimes such situation is possible while switching to voice channel:
+/*
+ - voice channel is switched to the one user is joining
+ - participant list is initialized with voice states: agent is in voice
+ - than such log messages were found (with agent UUID)
+ - LLVivoxProtocolParser::process_impl: parsing: <Response requestId="22" action="Session.MediaDisconnect.1"><ReturnCode>0</ReturnCode><Results><StatusCode>0</StatusCode><StatusString /></Results><InputXml><Request requestId="22" action="Session.MediaDisconnect.1"><SessionGroupHandle>9</SessionGroupHandle><SessionHandle>12</SessionHandle><Media>Audio</Media></Request></InputXml></Response>
+ - LLVoiceClient::sessionState::removeParticipant: participant "sip:x2pwNkMbpR_mK4rtB_awASA==@bhr.vivox.com" (da9c0d90-c6e9-47f9-8ae2-bb41fdac0048) removed.
+ - and than while updating participants voice states agent is marked as HAS LEFT
+ - next updating of LLVoiceClient state makes agent JOINED
+ So, lets skip HAS LEFT state for agent's avatar
+*/
+ if (STATE_LEFT == state && item->getAvatarId() == gAgentID) return;
+
+ setState(item->getAvatarId(), state);
+
+ switch (state)
+ {
+ case STATE_INVITED:
+ item->setState(LLAvatarListItem::IS_VOICE_INVITED);
+ break;
+ case STATE_JOINED:
+ removeVoiceRemoveTimer(item->getAvatarId());
+ item->setState(LLAvatarListItem::IS_VOICE_JOINED);
+ break;
+ case STATE_LEFT:
+ {
+ setVoiceRemoveTimer(item->getAvatarId());
+ item->setState(LLAvatarListItem::IS_VOICE_LEFT);
+ }
+ break;
+ default:
+ llwarns << "Unrecognized avatar panel state (" << state << ")" << llendl;
+ break;
+ }
+}
+
+void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id)
+{
+ mSpeakerDelayRemover->setActionTimer(voice_speaker_id);
+}
+
+bool LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
+{
+ LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs();
+ LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
+ if(pos != speaker_uuids.end())
+ {
+ speaker_uuids.erase(pos);
+ mAvatarList->setDirty();
+ }
+
+ return false;
+}
+
+
+void LLCallFloater::resetVoiceRemoveTimers()
+{
+ mSpeakerDelayRemover->removeAllTimers();
+}
+
+void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
+{
+ mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
+}
+
+bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
+{
+ bool is_valid = true;
+ switch (mVoiceType)
+ {
+ case VC_LOCAL_CHAT:
+ {
+ // A nearby chat speaker is considered valid it it's known to LLVoiceClient (i.e. has enabled voice).
+ std::vector<LLUUID> speakers;
+ get_voice_participants_uuids(speakers);
+ is_valid = std::find(speakers.begin(), speakers.end(), speaker_id) != speakers.end();
+ }
+ break;
+ case VC_GROUP_CHAT:
+ // if participant had left this call before do not allow add her again. See EXT-4216.
+ // but if she Join she will be added into the list from the LLCallFloater::onChange()
+ is_valid = STATE_LEFT != getState(speaker_id);
+ break;
+ default:
+ // do nothing. required for Linux build
+ break;
+ }
+
+ return is_valid;
+}
+
+void LLCallFloater::connectToChannel(LLVoiceChannel* channel)
+{
+ mVoiceChannelStateChangeConnection.disconnect();
+
+ sCurrentVoiceCanel = channel;
+
+ mVoiceChannelStateChangeConnection = sCurrentVoiceCanel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2));
+
+ updateState(channel->getState());
+}
+
+void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+ // check is voice operational and if it doesn't work hide VCP (EXT-4397)
+ if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking())
+ {
+ updateState(new_state);
+ }
+ else
+ {
+ closeFloater();
+ }
+}
+
+void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state)
+{
+ LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceCanel->getSessionName() << LL_ENDL;
+ if (LLVoiceChannel::STATE_CONNECTED == new_state)
+ {
+ updateSession();
+ }
+ else
+ {
+ reset(new_state);
+ }
+}
+
+void LLCallFloater::reset(const LLVoiceChannel::EState& new_state)
+{
+ // lets forget states from the previous session
+ // for timers...
+ resetVoiceRemoveTimers();
+
+ // ...and for speaker state
+ mSpeakerStateMap.clear();
+
+ delete mParticipants;
+ mParticipants = NULL;
+ mAvatarList->clear();
+
+ // These ifs were added instead of simply showing "loading" to make VCP work correctly in parcels
+ // with disabled voice (EXT-4648 and EXT-4649)
+ if (!LLViewerParcelMgr::getInstance()->allowAgentVoice() && LLVoiceChannel::STATE_HUNG_UP == new_state)
+ {
+ // hides "Leave Call" when call is ended in parcel with disabled voice- hiding usually happens in
+ // updateSession() which won't be called here because connect to nearby voice never happens
+ childSetVisible("leave_call_btn_panel", false);
+ // setting title to nearby chat an "no one near..." text- because in region with disabled
+ // voice we won't have chance to really connect to nearby, so VCP is changed here manually
+ setTitle(getString("title_nearby"));
+ mAvatarList->setNoItemsCommentText(getString("no_one_near"));
+ }
+ // "loading" is shown only when state is "ringing" to avoid showing it in nearby chat vcp
+ // of parcels with disabled voice all the time- "no_one_near" is now shown there (EXT-4648)
+ else if (new_state == LLVoiceChannel::STATE_RINGING)
+ {
+ // update floater to show Loading while waiting for data.
+ mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
+ }
+
+ mAvatarList->setVisible(TRUE);
+ mNonAvatarCaller->setVisible(FALSE);
+
+ mSpeakerManager = NULL;
+}
+
+//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
new file mode 100644
index 0000000000..0a8ea7de39
--- /dev/null
+++ b/indra/newview/llcallfloater.h
@@ -0,0 +1,272 @@
+/**
+ * @file llcallfloater.h
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCALLFLOATER_H
+#define LL_LLCALLFLOATER_H
+
+#include "lltransientdockablefloater.h"
+#include "llvoicechannel.h"
+#include "llvoiceclient.h"
+
+class LLAvatarList;
+class LLAvatarListItem;
+class LLNonAvatarCaller;
+class LLOutputMonitorCtrl;
+class LLParticipantList;
+class LLSpeakerMgr;
+class LLSpeakersDelayActionsStorage;
+
+/**
+ * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
+ * It can be torn-off and freely positioned onscreen.
+ *
+ * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over
+ * the Resident's own microphone input volume, the audible volume of each of the other participants,
+ * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
+ *
+ * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an
+ * 'Leave Call' button to allow the Resident to leave that voice channel.
+ */
+class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
+{
+public:
+
+ LOG_CLASS(LLCallFloater);
+
+ LLCallFloater(const LLSD& key);
+ ~LLCallFloater();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void draw();
+
+ /**
+ * Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
+ *
+ * Refreshes list to display participants not in voice as disabled.
+ */
+ /*virtual*/ void onChange();
+
+ static void sOnCurrentChannelChanged(const LLUUID& session_id);
+
+private:
+ typedef enum e_voice_controls_type
+ {
+ VC_LOCAL_CHAT,
+ VC_GROUP_CHAT,
+ VC_AD_HOC_CHAT,
+ VC_PEER_TO_PEER,
+ VC_PEER_TO_PEER_AVALINE
+ }EVoiceControls;
+
+ typedef enum e_speaker_state
+ {
+ STATE_UNKNOWN,
+ STATE_INVITED,
+ STATE_JOINED,
+ STATE_LEFT,
+ } ESpeakerState;
+
+ typedef std::map<LLUUID, ESpeakerState> speaker_state_map_t;
+
+ void leaveCall();
+
+ /**
+ * Updates mSpeakerManager and list according to current Voice Channel
+ *
+ * It compares mSpeakerManager & current Voice Channel session IDs.
+ * If they are different gets Speaker manager related to current channel and updates channel participant list.
+ */
+ void updateSession();
+
+ /**
+ * Refreshes participant list according to current Voice Channel
+ */
+ void refreshParticipantList();
+
+ /**
+ * Handles event on avatar list is refreshed after it was marked dirty.
+ *
+ * It sets initial participants voice states (once after the first refreshing)
+ * and updates voice states each time anybody is joined/left voice chat in session.
+ */
+ void onAvatarListRefreshed();
+
+
+ void updateTitle();
+ void initAgentData();
+ void setModeratorMutedVoice(bool moderator_muted);
+ void updateAgentModeratorState();
+
+ /**
+ * Sets initial participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see refreshParticipantList()
+ * @see onAvatarListRefreshed()
+ * @see mInitParticipantsVoiceState
+ */
+ void initParticipantsVoiceState();
+
+ /**
+ * Updates participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see onAvatarListRefreshed()
+ * @see onChanged()
+ */
+ void updateParticipantsVoiceState();
+
+ /**
+ * Updates voice state of participant not in current voice channel depend on its current state.
+ */
+ void updateNotInVoiceParticipantState(LLAvatarListItem* item);
+ void setState(LLAvatarListItem* item, ESpeakerState state);
+ void setState(const LLUUID& speaker_id, ESpeakerState state)
+ {
+ lldebugs << "Storing state: " << speaker_id << ", " << state << llendl;
+ mSpeakerStateMap[speaker_id] = state;
+ }
+
+ ESpeakerState getState(const LLUUID& speaker_id)
+ {
+ lldebugs << "Getting state: " << speaker_id << ", " << mSpeakerStateMap[speaker_id] << llendl;
+
+ return mSpeakerStateMap[speaker_id];
+ }
+
+ /**
+ * Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires.
+ */
+ void setVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
+ /**
+ * Removes specified by UUID Avatar List item.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
+ */
+ bool removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
+
+ /**
+ * Deletes all timers from the list to prevent started timers from ticking after destruction
+ * and after switching on another voice channel.
+ */
+ void resetVoiceRemoveTimers();
+
+ /**
+ * Removes specified by UUID timer from the map.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map.
+ */
+ void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
+ /**
+ * Called by LLParticipantList before adding a speaker to the participant list.
+ *
+ * If false is returned, the speaker will not be added to the list.
+ *
+ * @param speaker_id Speaker to validate.
+ * @return true if this is a valid speaker, false otherwise.
+ */
+ bool validateSpeaker(const LLUUID& speaker_id);
+
+ /**
+ * Connects to passed channel to be updated according to channel's voice states.
+ */
+ void connectToChannel(LLVoiceChannel* channel);
+
+ /**
+ * Callback to process changing of voice channel's states.
+ */
+ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
+
+ /**
+ * Updates floater according to passed channel's voice state.
+ */
+ void updateState(const LLVoiceChannel::EState& new_state);
+
+ /**
+ * Resets floater to be ready to show voice participants.
+ *
+ * Clears all data from the latest voice session.
+ */
+ void reset(const LLVoiceChannel::EState& new_state);
+
+private:
+ speaker_state_map_t mSpeakerStateMap;
+ LLSpeakerMgr* mSpeakerManager;
+ LLParticipantList* mParticipants;
+ LLAvatarList* mAvatarList;
+ LLNonAvatarCaller* mNonAvatarCaller;
+ EVoiceControls mVoiceType;
+ LLPanel* mAgentPanel;
+ LLOutputMonitorCtrl* mSpeakingIndicator;
+ bool mIsModeratorMutedVoice;
+
+ /**
+ * Flag indicated that participants voice states should be initialized.
+ *
+ * It is used due to Avatar List has delayed refreshing after it content is changed.
+ * Real initializing is performed when Avatar List is first time refreshed.
+ *
+ * @see onAvatarListRefreshed()
+ * @see initParticipantsVoiceState()
+ */
+ bool mInitParticipantsVoiceState;
+
+ boost::signals2::connection mAvatarListRefreshConnection;
+
+
+ /**
+ * time out speakers when they are not part of current session
+ */
+ LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
+
+ /**
+ * Stores reference to current voice channel.
+ *
+ * Is used to ignore voice channel changed callback for the same channel.
+ *
+ * @see sOnCurrentChannelChanged()
+ */
+ static LLVoiceChannel* sCurrentVoiceCanel;
+
+ /* virtual */
+ LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
+};
+
+
+#endif //LL_LLCALLFLOATER_H
+
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 7a81d0c4a1..79a2631c31 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -51,18 +51,19 @@
#include "llagent.h"
#include "llbutton.h"
-//#include "llinventory.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
-#include "llnotify.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llresmgr.h"
+#include "llslurl.h"
#include "llimview.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
-#include "llimview.h"
-#include "llimpanel.h"
+#include "llavataractions.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -632,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
{
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
{
- std::string first, last;
+ std::string name;
LLSD args;
- if(gCacheName->getName(agent_id, first, last))
+ if(gCacheName->getFullName(agent_id, name))
{
- args["FIRST_NAME"] = first;
- args["LAST_NAME"] = last;
+ args["NAME"] = name;
}
+ LLSD payload;
+ payload["from_id"] = agent_id;
if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
{
- LLNotifications::instance().add("GrantedModifyRights",args);
+ LLNotificationsUtil::add("GrantedModifyRights",args, payload);
}
else
{
- LLNotifications::instance().add("RevokedModifyRights",args);
+ LLNotificationsUtil::add("RevokedModifyRights",args, payload);
}
}
(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
@@ -680,9 +682,11 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
}
BOOL notify = FALSE;
LLSD args;
+ LLSD payload;
for(S32 i = 0; i < count; ++i)
{
msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_AgentID, agent_id, i);
+ payload["FROM_ID"] = agent_id;
info = getBuddyInfo(agent_id);
if(info)
{
@@ -715,22 +719,26 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(notify)
{
// Popup a notify box with online status of this agent
- LLNotificationPtr notification = LLNotifications::instance().add(online ? "FriendOnline" : "FriendOffline", args);
+ LLNotificationPtr notification;
- // If there's an open IM session with this agent, send a notification there too.
- LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
- LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
- if (floater)
+ if (online)
{
- std::string notifyMsg = notification->getMessage();
- if (!notifyMsg.empty())
- {
- floater->addHistoryLine(notifyMsg,LLUIColorTable::instance().getColor("SystemChatColor"));
- }
+ notification =
+ LLNotificationsUtil::add("FriendOnline",
+ args,
+ payload.with("respond_on_mousedown", TRUE),
+ boost::bind(&LLAvatarActions::startIM, agent_id));
+ }
+ else
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOffline", args, payload);
}
- //*TODO instead of adding IM message about online/offline status
- //do something like graying avatar icon on messages from a user that went offline, and make it colored when online.
+ // If there's an open IM session with this agent, send a notification there too.
+ LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
+ std::string notify_msg = notification->getMessage();
+ LLIMModel::instance().proccessOnlineOfflineNotification(session_id, notify_msg);
}
mModifyMask |= LLFriendObserver::ONLINE;
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index bd58b2fbe6..47b0dcb903 100644
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -45,6 +45,7 @@
//class LLInventoryObserver;
class LLMessageSystem;
class LLTrackingData;
+
class LLFriendObserver
{
public:
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 6427422572..769387c26c 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -36,8 +36,6 @@
#include "llappviewer.h"
#include "llviewercontrol.h"
-#include "llimview.h"
-#include "llbottomtray.h"
#include "llviewerwindow.h"
#include "llrootview.h"
#include "llsyswellwindow.h"
@@ -127,10 +125,10 @@ void LLChannelManager::onLoginCompleted()
gViewerWindow->getRootView()->addChild(mStartUpChannel);
// init channel's position and size
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
- mStartUpChannel->setMouseDownCallback(boost::bind(&LLSysWellWindow::onStartUpToastClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window"), _2, _3, _4));
+ mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
@@ -220,5 +218,23 @@ void LLChannelManager::removeChannelByID(const LLUUID id)
}
//--------------------------------------------------------------------------
+void LLChannelManager::muteAllChannels(bool mute)
+{
+ for (std::vector<ChannelElem>::iterator it = mChannelList.begin();
+ it != mChannelList.end(); it++)
+ {
+ it->channel->setShowToasts(!mute);
+ }
+}
+void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher)
+{
+ LLScreenChannel
+ * screen_channel =
+ dynamic_cast<LLScreenChannel*> (findChannelByID(channel_id));
+ if (screen_channel != NULL)
+ {
+ screen_channel->killMatchedToasts(matcher);
+ }
+}
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index b927d369cd..c2be39122f 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -102,6 +102,18 @@ public:
// remove channel methods
void removeChannelByID(const LLUUID id);
+ /**
+ * Manages toasts showing for all channels.
+ *
+ * @param mute Flag to disable/enable toasts showing.
+ */
+ void muteAllChannels(bool mute);
+
+ /**
+ * Kills matched toasts from specified toast screen channel.
+ */
+ void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher);
+
private:
LLScreenChannel* createChannel(LLChannelManager::Params& p);
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 4523267edd..b32a955038 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -48,7 +48,6 @@
#include "llcombobox.h"
#include "llcommandhandler.h" // secondlife:///app/chat/ support
#include "llviewercontrol.h"
-#include "llfloaterchat.h"
#include "llgesturemgr.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
@@ -210,8 +209,9 @@ void LLChatBar::refreshGestures()
// collect list of unique gestures
std::map <std::string, BOOL> unique;
- LLGestureManager::item_map_t::iterator it;
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
LLMultiGesture* gesture = (*it).second;
if (gesture)
@@ -547,7 +547,7 @@ void LLChatBar::onInputEditorFocusLost()
// static
void LLChatBar::onInputEditorGainFocus()
{
- LLFloaterChat::setHistoryCursorAndScrollToEnd();
+ //LLFloaterChat::setHistoryCursorAndScrollToEnd();
}
void LLChatBar::onClickSay( LLUICtrl* ctrl )
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index e561507e69..6180b880b5 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -31,38 +31,75 @@
*/
#include "llviewerprecompiledheaders.h"
+
+#include "llinstantmessage.h"
+
+#include "llimview.h"
#include "llchathistory.h"
+#include "llcommandhandler.h"
#include "llpanel.h"
-#include "lltextbox.h"
#include "lluictrlfactory.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
-
-#include "llimview.h"
#include "llcallingcard.h" //for LLAvatarTracker
#include "llagentdata.h"
#include "llavataractions.h"
#include "lltrans.h"
#include "llfloaterreg.h"
#include "llmutelist.h"
+#include "llstylemap.h"
+#include "llslurl.h"
+#include "lllayoutstack.h"
+#include "llagent.h"
+#include "llnotificationsutil.h"
+#include "lltoastnotifypanel.h"
+#include "lltooltip.h"
+#include "llviewerregion.h"
+#include "llviewertexteditor.h"
+#include "llworld.h"
+#include "lluiconstants.h"
+
+
+#include "llsidetray.h"//for blocked objects panel
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
-static const std::string MESSAGE_USERNAME_DATE_SEPARATOR(" ----- ");
-std::string formatCurrentTime()
+const static std::string NEW_LINE(rawstr_to_utf8("\n"));
+
+const static std::string SLURL_APP_AGENT = "secondlife:///app/agent/";
+const static std::string SLURL_ABOUT = "/about";
+
+// support for secondlife:///app/objectim/{UUID}/ SLapps
+class LLObjectIMHandler : public LLCommandHandler
{
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
+public:
+ // requests will be throttled from a non-trusted browser
+ LLObjectIMHandler() : LLCommandHandler("objectim", UNTRUSTED_THROTTLE) {}
- LLSD substitution;
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
+ LLUUID object_id;
+ if (!object_id.set(params[0], FALSE))
+ {
+ return false;
+ }
- return timeStr;
-}
+ LLSD payload;
+ payload["object_id"] = object_id;
+ payload["owner_id"] = query_map["owner"];
+ payload["name"] = query_map["name"];
+ payload["slurl"] = query_map["slurl"];
+ payload["group_owned"] = query_map["groupowned"];
+ LLFloaterReg::showInstance("inspect_remote_object", payload);
+ return true;
+ }
+};
+LLObjectIMHandler gObjectIMHandler;
class LLChatHistoryHeader: public LLPanel
{
@@ -79,16 +116,50 @@ public:
return LLPanel::handleMouseUp(x,y,mask);
}
+ //*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child
+ BOOL handleToolTip(S32 x, S32 y, MASK mask)
+ {
+ LLTextBase* name = getChild<LLTextBase>("user_name");
+ if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && mFrom.size() && SYSTEM_FROM != mFrom)
+ {
+
+ // Spawn at right side of the name textbox.
+ LLRect sticky_rect = name->calcScreenRect();
+ S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3);
+
+ LLToolTip::Params params;
+ params.background_visible(false);
+ params.click_callback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, 0, 0, 0));
+ params.delay_time(0.0f); // spawn instantly on hover
+ params.image(LLUI::getUIImage("Info_Small"));
+ params.message("");
+ params.padding(0);
+ params.pos(LLCoordGL(icon_x, sticky_rect.mTop - 2));
+ params.sticky_rect(sticky_rect);
+
+ LLToolTipMgr::getInstance()->show(params);
+ return TRUE;
+ }
+
+ return LLPanel::handleToolTip(x, y, mask);
+ }
+
void onObjectIconContextMenuItemClicked(const LLSD& userdata)
{
std::string level = userdata.asString();
if (level == "profile")
{
+ LLSD params;
+ params["object_id"] = getAvatarId();
+
+ LLFloaterReg::showInstance("inspect_object", params);
}
else if (level == "block")
{
LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
+
+ LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
}
}
@@ -106,12 +177,7 @@ public:
}
else if (level == "add")
{
- std::string name;
- name.assign(getFirstName());
- name.append(" ");
- name.append(getLastName());
-
- LLAvatarActions::requestFriendshipDialog(getAvatarId(), name);
+ LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom);
}
else if (level == "remove")
{
@@ -132,8 +198,7 @@ public:
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mPopupMenuHandleObject = menu->getHandle();
- LLPanel* visible_panel = getChild<LLPanel>("im_header");
- visible_panel->setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
+ setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
return LLPanel::postBuild();
}
@@ -169,67 +234,114 @@ public:
void onHeaderPanelClick(S32 x, S32 y, MASK mask)
{
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+ if (mSourceType == CHAT_SOURCE_OBJECT)
+ {
+ LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
+ }
+ else if (mSourceType == CHAT_SOURCE_AGENT)
+ {
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID));
+ }
+ //if chat source is system, you may add "else" here to define behaviour.
}
const LLUUID& getAvatarId () const { return mAvatarID;}
- const std::string& getFirstName() const { return mFirstName; }
- const std::string& getLastName () const { return mLastName; }
- void setup(const LLChat& chat)
+ void setup(const LLChat& chat,const LLStyle::Params& style_params)
{
mAvatarID = chat.mFromID;
+ mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
- if(chat.mFromID.isNull())
+
+ //*TODO overly defensive thing, source type should be maintained out there
+ if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM)
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
-
LLTextBox* userName = getChild<LLTextBox>("user_name");
+
+ userName->setReadOnlyColor(style_params.readonly_color());
+ userName->setColor(style_params.color());
- if(!chat.mFromName.empty())
- {
- userName->setValue(chat.mFromName);
- mFrom = chat.mFromName;
- }
- else
+ userName->setValue(chat.mFromName);
+ mFrom = chat.mFromName;
+ if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
{
- std::string SL = LLTrans::getString("SECOND_LIFE");
- userName->setValue(SL);
+ mFrom = LLTrans::getString("SECOND_LIFE");
+ userName->setValue(mFrom);
}
-
- LLTextBox* timeBox = getChild<LLTextBox>("time_box");
- timeBox->setValue(formatCurrentTime());
+
+ mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
+
+ setTimeField(chat);
+
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
if(mSourceType != CHAT_SOURCE_AGENT)
icon->setDrawTooltip(false);
- if(!chat.mFromID.isNull())
+ switch (mSourceType)
+ {
+ case CHAT_SOURCE_AGENT:
+ icon->setValue(chat.mFromID);
+ break;
+ case CHAT_SOURCE_OBJECT:
+ icon->setValue(LLSD("OBJECT_Icon"));
+ break;
+ case CHAT_SOURCE_SYSTEM:
+ icon->setValue(LLSD("SL_Logo"));
+ }
+ }
+
+ /*virtual*/ void draw()
+ {
+ LLTextBox* user_name = getChild<LLTextBox>("user_name");
+ LLTextBox* time_box = getChild<LLTextBox>("time_box");
+
+ LLRect user_name_rect = user_name->getRect();
+ S32 user_name_width = user_name_rect.getWidth();
+ S32 time_box_width = time_box->getRect().getWidth();
+
+ if (time_box->getVisible() && user_name_width <= mMinUserNameWidth)
+ {
+ time_box->setVisible(FALSE);
+
+ user_name_rect.mRight += time_box_width;
+ user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
+ user_name->setRect(user_name_rect);
+ }
+
+ if (!time_box->getVisible() && user_name_width > mMinUserNameWidth + time_box_width)
{
- icon->setValue(chat.mFromID);
+ user_name_rect.mRight -= time_box_width;
+ user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
+ user_name->setRect(user_name_rect);
+
+ time_box->setVisible(TRUE);
}
- }
+ LLPanel::draw();
+ }
void nameUpdatedCallback(const LLUUID& id,const std::string& first,const std::string& last,BOOL is_group)
{
if (id != mAvatarID)
return;
- mFirstName = first;
- mLastName = last;
+ mFrom = first + " " + last;
}
protected:
+ static const S32 PADDING = 20;
+
void showContextMenu(S32 x,S32 y)
{
if(mSourceType == CHAT_SOURCE_SYSTEM)
showSystemContextMenu(x,y);
if(mSourceType == CHAT_SOURCE_AGENT)
showAvatarContextMenu(x,y);
- if(mSourceType == CHAT_SOURCE_OBJECT)
+ if(mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom)
showObjectContextMenu(x,y);
}
@@ -262,13 +374,40 @@ protected:
menu->setItemEnabled("Remove Friend", false);
}
+ if (mSessionID == LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, mAvatarID))
+ {
+ menu->setItemVisible("Send IM", false);
+ }
+
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, menu, x, y);
}
}
-
+private:
+ void setTimeField(const LLChat& chat)
+ {
+ LLTextBox* time_box = getChild<LLTextBox>("time_box");
+
+ LLRect rect_before = time_box->getRect();
+
+ time_box->setValue(chat.mTimeStr);
+
+ // set necessary textbox width to fit all text
+ time_box->reshapeToFitText();
+ LLRect rect_after = time_box->getRect();
+
+ // move rect to the left to correct position...
+ S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth();
+ S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight();
+ time_box->translate(delta_pos_x, delta_pos_y);
+
+ //... & change width of the name control
+ LLView* user_name = getChild<LLView>("user_name");
+ const LLRect& user_rect = user_name->getRect();
+ user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
+ }
protected:
LLHandle<LLView> mPopupMenuHandleAvatar;
@@ -276,22 +415,33 @@ protected:
LLUUID mAvatarID;
EChatSourceType mSourceType;
- std::string mFirstName;
- std::string mLastName;
std::string mFrom;
+ LLUUID mSessionID;
+ S32 mMinUserNameWidth;
};
LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
-: LLTextEditor(p),
-mMessageHeaderFilename(p.message_header),
-mMessageSeparatorFilename(p.message_separator),
-mLeftTextPad(p.left_text_pad),
-mRightTextPad(p.right_text_pad),
-mLeftWidgetPad(p.left_widget_pad),
-mRightWidgetPad(p.right_widget_pad)
+: LLUICtrl(p),
+ mMessageHeaderFilename(p.message_header),
+ mMessageSeparatorFilename(p.message_separator),
+ mLeftTextPad(p.left_text_pad),
+ mRightTextPad(p.right_text_pad),
+ mLeftWidgetPad(p.left_widget_pad),
+ mRightWidgetPad(p.right_widget_pad),
+ mTopSeparatorPad(p.top_separator_pad),
+ mBottomSeparatorPad(p.bottom_separator_pad),
+ mTopHeaderPad(p.top_header_pad),
+ mBottomHeaderPad(p.bottom_header_pad),
+ mIsLastMessageFromLog(false)
{
+ LLTextEditor::Params editor_params(p);
+ editor_params.rect = getLocalRect();
+ editor_params.follows.flags = FOLLOWS_ALL;
+ editor_params.enabled = false; // read only
+ editor_params.show_context_menu = "true";
+ mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
}
LLChatHistory::~LLChatHistory()
@@ -299,16 +449,59 @@ LLChatHistory::~LLChatHistory()
this->clear();
}
+void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
+{
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ LLRect stack_rect = getLocalRect();
+ stack_rect.mRight -= scrollbar_size;
+ LLLayoutStack::Params layout_p;
+ layout_p.rect = stack_rect;
+ layout_p.follows.flags = FOLLOWS_ALL;
+ layout_p.orientation = "vertical";
+ layout_p.mouse_opaque = false;
+
+ LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this);
+
+ const S32 NEW_TEXT_NOTICE_HEIGHT = 20;
+
+ LLPanel::Params panel_p;
+ panel_p.name = "spacer";
+ panel_p.background_visible = false;
+ panel_p.has_border = false;
+ panel_p.mouse_opaque = false;
+ stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE);
+
+ panel_p.name = "new_text_notice_holder";
+ LLRect new_text_notice_rect = getLocalRect();
+ new_text_notice_rect.mTop = new_text_notice_rect.mBottom + NEW_TEXT_NOTICE_HEIGHT;
+ panel_p.rect = new_text_notice_rect;
+ panel_p.background_opaque = true;
+ panel_p.background_visible = true;
+ panel_p.visible = false;
+ mMoreChatPanel = LLUICtrlFactory::create<LLPanel>(panel_p);
+
+ LLTextBox::Params text_p(p.more_chat_text);
+ text_p.rect = mMoreChatPanel->getLocalRect();
+ text_p.follows.flags = FOLLOWS_ALL;
+ text_p.name = "more_chat_text";
+ mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel);
+ mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this));
+
+ stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE);
+}
+
+
/*void LLChatHistory::updateTextRect()
{
static LLUICachedControl<S32> texteditor_border ("UITextEditorBorder", 0);
- LLRect old_text_rect = mTextRect;
- mTextRect = mScroller->getContentWindowRect();
- mTextRect.stretch(-texteditor_border);
- mTextRect.mLeft += mLeftTextPad;
- mTextRect.mRight -= mRightTextPad;
- if (mTextRect != old_text_rect)
+ LLRect old_text_rect = mVisibleTextRect;
+ mVisibleTextRect = mScroller->getContentWindowRect();
+ mVisibleTextRect.stretch(-texteditor_border);
+ mVisibleTextRect.mLeft += mLeftTextPad;
+ mVisibleTextRect.mRight -= mRightTextPad;
+ if (mVisibleTextRect != old_text_rect)
{
needsReflow();
}
@@ -320,49 +513,317 @@ LLView* LLChatHistory::getSeparator()
return separator;
}
-LLView* LLChatHistory::getHeader(const LLChat& chat)
+LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
{
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
- header->setup(chat);
+ header->setup(chat,style_params);
return header;
}
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
+void LLChatHistory::onClickMoreText()
+{
+ mEditor->endOfDoc();
+}
+
+void LLChatHistory::clear()
{
- LLView* view = NULL;
- std::string view_text;
+ mLastFromName.clear();
+ mEditor->clear();
+ mLastFromID = LLUUID::null;
+}
+
+void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
+{
+ bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
- if (mLastFromName == chat.mFromName)
+ if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
{
- view = getSeparator();
- view_text = "\n";
+ mUnreadChatSources.insert(chat.mFromName);
+ mMoreChatPanel->setVisible(TRUE);
+ std::string chatters;
+ for (unread_chat_source_t::iterator it = mUnreadChatSources.begin();
+ it != mUnreadChatSources.end();)
+ {
+ chatters += *it;
+ if (++it != mUnreadChatSources.end())
+ {
+ chatters += ", ";
+ }
+ }
+ LLStringUtil::format_map_t args;
+ args["SOURCES"] = chatters;
+
+ if (mUnreadChatSources.size() == 1)
+ {
+ mMoreChatText->setValue(LLTrans::getString("unread_chat_single", args));
+ }
+ else
+ {
+ mMoreChatText->setValue(LLTrans::getString("unread_chat_multiple", args));
+ }
+ S32 height = mMoreChatText->getTextPixelHeight() + 5;
+ mMoreChatPanel->reshape(mMoreChatPanel->getRect().getWidth(), height);
+ }
+
+ LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+ LLViewerChat::getChatColor(chat,txt_color);
+ LLFontGL* fontp = LLViewerChat::getChatFont();
+ std::string font_name = LLFontGL::nameFromFont(fontp);
+ std::string font_size = LLFontGL::sizeFromFont(fontp);
+ LLStyle::Params style_params;
+ style_params.color(txt_color);
+ style_params.readonly_color(txt_color);
+ style_params.font.name(font_name);
+ style_params.font.size(font_size);
+ style_params.font.style(input_append_params.font.style);
+
+ std::string prefix = chat.mText.substr(0, 4);
+
+ //IRC styled /me messages.
+ bool irc_me = prefix == "/me " || prefix == "/me'";
+
+ // Delimiter after a name in header copy/past and in plain text mode
+ std::string delimiter = ": ";
+ std::string shout = LLTrans::getString("shout");
+ std::string whisper = LLTrans::getString("whisper");
+ if (chat.mChatType == CHAT_TYPE_SHOUT ||
+ chat.mChatType == CHAT_TYPE_WHISPER ||
+ chat.mText.compare(0, shout.length(), shout) == 0 ||
+ chat.mText.compare(0, whisper.length(), whisper) == 0)
+ {
+ delimiter = " ";
+ }
+
+ // Don't add any delimiter after name in irc styled messages
+ if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC)
+ {
+ delimiter = LLStringUtil::null;
+ style_params.font.style = "ITALIC";
+ }
+
+ bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
+ // We graying out chat history by graying out messages that contains full date in a time string
+ if (message_from_log)
+ {
+ style_params.color(LLColor4::grey);
+ style_params.readonly_color(LLColor4::grey);
+ }
+
+ if (use_plain_text_chat_history)
+ {
+ mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
+
+ if (utf8str_trim(chat.mFromName).size() != 0)
+ {
+ // Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text.
+ if ( chat.mSourceType == CHAT_SOURCE_OBJECT )
+ {
+ // for object IMs, create a secondlife:///app/objectim SLapp
+ std::string url = LLSLURL::buildCommand("objectim", chat.mFromID, "");
+ url += "?name=" + chat.mFromName;
+ url += "&owner=" + args["owner_id"].asString();
+
+ std::string slurl = args["slurl"].asString();
+ if (slurl.empty())
+ {
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+ if (region)
+ {
+ S32 x, y, z;
+ LLSLURL::globalPosToXYZ(LLVector3d(chat.mPosAgent), x, y, z);
+ slurl = region->getName() + llformat("/%d/%d/%d", x, y, z);
+ }
+ }
+ url += "&slurl=" + slurl;
+
+ // set the link for the object name to be the objectim SLapp
+ // (don't let object names with hyperlinks override our objectim Url)
+ LLStyle::Params link_params(style_params);
+ link_params.color.control = "HTMLLinkColor";
+ link_params.link_href = url;
+ mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
+ false, link_params);
+ }
+ else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
+ {
+ LLStyle::Params link_params(style_params);
+ link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
+ // Convert the name to a hotlink and add to message.
+ mEditor->appendText(chat.mFromName + delimiter, false, link_params);
+ }
+ else
+ {
+ mEditor->appendText(chat.mFromName + delimiter, false, style_params);
+ }
+ }
}
else
{
- view = getHeader(chat);
- view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n';
+ LLView* view = NULL;
+ LLInlineViewSegment::Params p;
+ p.force_newline = true;
+ p.left_pad = mLeftWidgetPad;
+ p.right_pad = mRightWidgetPad;
+
+ LLDate new_message_time = LLDate::now();
+
+ if (mLastFromName == chat.mFromName
+ && mLastFromID == chat.mFromID
+ && mLastMessageTime.notNull()
+ && (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0
+ && mIsLastMessageFromLog == message_from_log) //distinguish between current and previous chat session's histories
+ {
+ view = getSeparator();
+ p.top_pad = mTopSeparatorPad;
+ p.bottom_pad = mBottomSeparatorPad;
+ }
+ else
+ {
+ view = getHeader(chat, style_params);
+ if (mEditor->getText().size() == 0)
+ p.top_pad = 0;
+ else
+ p.top_pad = mTopHeaderPad;
+ p.bottom_pad = mBottomHeaderPad;
+
+ }
+ p.view = view;
+
+ //Prepare the rect for the view
+ LLRect target_rect = mEditor->getDocumentView()->getRect();
+ // squeeze down the widget by subtracting padding off left and right
+ target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();
+ target_rect.mRight -= mRightWidgetPad;
+ view->reshape(target_rect.getWidth(), view->getRect().getHeight());
+ view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
+
+ std::string widget_associated_text = "\n[" + chat.mTimeStr + "] ";
+ if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+ widget_associated_text += chat.mFromName + delimiter;
+
+ mEditor->appendWidget(p, widget_associated_text, false);
+ mLastFromName = chat.mFromName;
+ mLastFromID = chat.mFromID;
+ mLastMessageTime = new_message_time;
+ mIsLastMessageFromLog = message_from_log;
}
- //Prepare the rect for the view
- LLRect target_rect = getDocumentView()->getRect();
- // squeeze down the widget by subtracting padding off left and right
- target_rect.mLeft += mLeftWidgetPad + mHPad;
- target_rect.mRight -= mRightWidgetPad;
- view->reshape(target_rect.getWidth(), view->getRect().getHeight());
- view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
-
- LLInlineViewSegment::Params p;
- p.view = view;
- p.force_newline = true;
- p.left_pad = mLeftWidgetPad;
- p.right_pad = mRightWidgetPad;
-
- appendWidget(p, view_text, false);
-
- //Append the text message
- std::string message = chat.mText + '\n';
- appendText(message, FALSE, style_params);
-
- mLastFromName = chat.mFromName;
- blockUndo();
- setCursorAndScrollToEnd();
+
+ if (chat.mNotifId.notNull())
+ {
+ LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId);
+ if (notification != NULL)
+ {
+ LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(
+ notification);
+ //we can't set follows in xml since it broke toasts behavior
+ notify_box->setFollowsLeft();
+ notify_box->setFollowsRight();
+ notify_box->setFollowsTop();
+
+ ctrl_list_t ctrls = notify_box->getControlPanel()->getCtrlList();
+ S32 offset = 0;
+ for (ctrl_list_t::iterator it = ctrls.begin(); it != ctrls.end(); it++)
+ {
+ LLButton * button = dynamic_cast<LLButton*> (*it);
+ if (button != NULL)
+ {
+ button->setOrigin( offset,
+ button->getRect().mBottom);
+ button->setLeftHPad(2 * HPAD);
+ button->setRightHPad(2 * HPAD);
+ // set zero width before perform autoResize()
+ button->setRect(LLRect(button->getRect().mLeft,
+ button->getRect().mTop, button->getRect().mLeft,
+ button->getRect().mBottom));
+ button->setAutoResize(true);
+ button->autoResize();
+ offset += 2 * HPAD + button->getRect().getWidth();
+ button->setFollowsNone();
+ }
+ }
+
+ LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE);
+ S32 text_heigth = 0;
+ if(text_editor != NULL)
+ {
+ text_heigth = text_editor->getTextBoundingRect().getHeight();
+ }
+
+ //Prepare the rect for the view
+ LLRect target_rect = mEditor->getDocumentView()->getRect();
+ // squeeze down the widget by subtracting padding off left and right
+ target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();
+ target_rect.mRight -= mRightWidgetPad;
+ notify_box->reshape(target_rect.getWidth(),
+ notify_box->getRect().getHeight());
+ notify_box->setOrigin(target_rect.mLeft, notify_box->getRect().mBottom);
+
+ if (text_editor != NULL)
+ {
+ S32 text_heigth_delta =
+ text_editor->getTextBoundingRect().getHeight()
+ - text_heigth;
+ notify_box->reshape(target_rect.getWidth(),
+ notify_box->getRect().getHeight() + text_heigth_delta);
+ }
+
+ LLInlineViewSegment::Params params;
+ params.view = notify_box;
+ params.left_pad = mLeftWidgetPad;
+ params.right_pad = mRightWidgetPad;
+ mEditor->appendWidget(params, "\n", false);
+ }
+ }
+ else
+ {
+ std::string message = irc_me ? chat.mText.substr(3) : chat.mText;
+
+
+ //MESSAGE TEXT PROCESSING
+ //*HACK getting rid of redundant sender names in system notifications sent using sender name (see EXT-5010)
+ if (use_plain_text_chat_history && gAgentID != chat.mFromID && chat.mFromID.notNull())
+ {
+ std::string slurl_about = SLURL_APP_AGENT + chat.mFromID.asString() + SLURL_ABOUT;
+ if (message.length() > slurl_about.length() &&
+ message.compare(0, slurl_about.length(), slurl_about) == 0)
+ {
+ message = message.substr(slurl_about.length(), message.length()-1);
+ }
+ }
+
+ if (irc_me && !use_plain_text_chat_history)
+ {
+ message = chat.mFromName + message;
+ }
+
+
+ mEditor->appendText(message, FALSE, style_params);
+ }
+ mEditor->blockUndo();
+
+ // automatically scroll to end when receiving chat from myself
+ if (chat.mFromID == gAgentID)
+ {
+ mEditor->setCursorAndScrollToEnd();
+ }
+}
+
+void LLChatHistory::draw()
+{
+ if (mEditor->scrolledToEnd())
+ {
+ mUnreadChatSources.clear();
+ mMoreChatPanel->setVisible(FALSE);
+ }
+
+ LLUICtrl::draw();
+}
+
+void LLChatHistory::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ bool is_scrolled_to_end = mEditor->scrolledToEnd();
+ LLUICtrl::reshape( width, height, called_from_parent );
+ // update scroll
+ if (is_scrolled_to_end)
+ mEditor->setCursorAndScrollToEnd();
}
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 92dcfdd958..950b32861b 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,10 +34,11 @@
#define LLCHATHISTORY_H_
#include "lltexteditor.h"
-#include "llchat.h"
+#include "lltextbox.h"
+#include "llviewerchat.h"
//Chat log widget allowing addition of a message as a widget
-class LLChatHistory : public LLTextEditor
+class LLChatHistory : public LLUICtrl
{
public:
struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
@@ -54,6 +55,16 @@ class LLChatHistory : public LLTextEditor
Optional<S32> left_widget_pad;
//Widget right padding from the scroll rect
Optional<S32> right_widget_pad;
+ //Separator top padding
+ Optional<S32> top_separator_pad;
+ //Separator bottom padding
+ Optional<S32> bottom_separator_pad;
+ //Header top padding
+ Optional<S32> top_header_pad;
+ //Header bottom padding
+ Optional<S32> bottom_header_pad;
+
+ Optional<LLTextBox::Params> more_chat_text;
Params()
: message_header("message_header"),
@@ -61,15 +72,20 @@ class LLChatHistory : public LLTextEditor
left_text_pad("left_text_pad"),
right_text_pad("right_text_pad"),
left_widget_pad("left_widget_pad"),
- right_widget_pad("right_widget_pad")
- {
- }
+ right_widget_pad("right_widget_pad"),
+ top_separator_pad("top_separator_pad"),
+ bottom_separator_pad("bottom_separator_pad"),
+ top_header_pad("top_header_pad"),
+ bottom_header_pad("bottom_header_pad"),
+ more_chat_text("more_chat_text")
+ {}
};
protected:
LLChatHistory(const Params&);
friend class LLUICtrlFactory;
+ /*virtual*/ void draw();
/**
* Redefinition of LLTextEditor::updateTextRect() to considerate text
* left/right padding params.
@@ -82,32 +98,57 @@ class LLChatHistory : public LLTextEditor
LLView* getSeparator();
/**
* Builds a message header.
- * @param from owner of a message.
- * @param time time of a message.
* @return pointer to LLView header object.
*/
- LLView* getHeader(const LLChat& chat);
+ LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
+
+ void onClickMoreText();
public:
~LLChatHistory();
+ void initFromParams(const Params&);
+
/**
* Appends a widget message.
* If last user appended message, concurs with current user,
* separator is added before the message, otherwise header is added.
+ * The args LLSD contains:
+ * - use_plain_text_chat_history (bool) - whether to add message as plain text.
+ * - owner_id (LLUUID) - the owner ID for object chat
* @param chat - base chat message.
- * @param time time of a message.
- * @param message message itself.
+ * @param args - additional arguments
+ * @param input_append_params - font style.
*/
- void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params);
+ void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params());
+ /*virtual*/ void clear();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
private:
std::string mLastFromName;
+ LLUUID mLastFromID;
+ LLDate mLastMessageTime;
+ bool mIsLastMessageFromLog;
+ //std::string mLastMessageTimeStr;
+
std::string mMessageHeaderFilename;
std::string mMessageSeparatorFilename;
+
S32 mLeftTextPad;
S32 mRightTextPad;
+
S32 mLeftWidgetPad;
S32 mRightWidgetPad;
+
+ S32 mTopSeparatorPad;
+ S32 mBottomSeparatorPad;
+ S32 mTopHeaderPad;
+ S32 mBottomHeaderPad;
+
+ LLPanel* mMoreChatPanel;
+ LLTextBox* mMoreChatText;
+ LLTextEditor* mEditor;
+ typedef std::set<std::string> unread_chat_source_t;
+ unread_chat_source_t mUnreadChatSources;
};
#endif /* LLCHATHISTORY_H_ */
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 63b9fd8e66..e164aa8fc4 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -44,27 +44,12 @@
#include "llviewercontrol.h"
#include "llagentdata.h"
-/*
-static const S32 BORDER_MARGIN = 2;
-static const S32 PARENT_BORDER_MARGIN = 0;
-
-static const S32 HORIZONTAL_MULTIPLE = 8;
-static const S32 VERTICAL_MULTIPLE = 16;
-static const F32 MIN_AUTO_SCROLL_RATE = 120.f;
-static const F32 MAX_AUTO_SCROLL_RATE = 500.f;
-static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
-
-#define MAX_CHAT_HISTORY 100
-*/
-
-static const S32 msg_left_offset = 30;
+static const S32 msg_left_offset = 10;
static const S32 msg_right_offset = 10;
-static const S32 msg_height_pad = 2;
-
-//static LLDefaultChildRegistry::Register<LLChatItemsContainerCtrl> t2("chat_items_container");
+static const S32 msg_height_pad = 5;
//*******************************************************************************************************************
-//LLChatItemCtrl
+//LLNearbyChatToastPanel
//*******************************************************************************************************************
LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
@@ -79,22 +64,22 @@ void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_p
{
LLPanel::reshape(width, height,called_from_parent);
- // *NOTE: we must check if child items exist because reshape is called from the
- // LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet
- LLPanel* caption = findChild<LLPanel>("msg_caption", false);
- LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text" ,false);
- if(caption && msg_text)
- {
- LLRect caption_rect = caption->getRect();
- caption_rect.setLeftTopAndSize( 2, height, width - 4, caption_rect.getHeight());
- caption->reshape( width - 4, caption_rect.getHeight(), 1);
- caption->setRect(caption_rect);
-
- LLRect msg_text_rect = msg_text->getRect();
- msg_text_rect.setLeftTopAndSize( msg_left_offset, height - caption_rect.getHeight() , width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight());
- msg_text->reshape( width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight(), 1);
- msg_text->setRect(msg_text_rect);
- }
+ LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
+ LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+
+ LLRect msg_text_rect = msg_text->getRect();
+ LLRect avatar_rect = icon->getRect();
+
+ avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight());
+ icon->setRect(avatar_rect);
+
+
+ msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset,
+ height - msg_height_pad,
+ width - avatar_rect.mRight - msg_left_offset - msg_right_offset,
+ height - 2*msg_height_pad);
+ msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1);
+ msg_text->setRect(msg_text_rect);
}
BOOL LLNearbyChatToastPanel::postBuild()
@@ -102,159 +87,209 @@ BOOL LLNearbyChatToastPanel::postBuild()
return LLPanel::postBuild();
}
-
-std::string LLNearbyChatToastPanel::appendTime()
+void LLNearbyChatToastPanel::addMessage(LLSD& notification)
{
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
+ std::string messageText = notification["message"].asString(); // UTF-8 line of text
- LLSD substitution;
+ LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
+ std::string color_name = notification["text_color"].asString();
+
+ LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+ textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+
+ S32 font_size = notification["font_size"].asInteger();
- return timeStr;
-}
+ LLFontGL* messageFont;
+ switch(font_size)
+ {
+ case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
+ default:
+ case 1: messageFont = LLFontGL::getFontSansSerif(); break;
+ case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
+ }
+ //append text
+ {
+ LLStyle::Params style_params;
+ style_params.color(textColor);
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params.font.name(font_name);
+ style_params.font.size(font_style_size);
+
+ int chat_type = notification["chat_type"].asInteger();
+
+ if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ else if( chat_type == CHAT_TYPE_SHOUT)
+ {
+ style_params.font.style = "BOLD";
+ }
+ else if( chat_type == CHAT_TYPE_WHISPER)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ msg_text->appendText(messageText, TRUE, style_params);
+ }
+ snapToMessageHeight();
-void LLNearbyChatToastPanel::addText (const std::string& message)
-{
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- msg_text->addText(message);
- mMessages.push_back(message);
}
void LLNearbyChatToastPanel::init(LLSD& notification)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
- mText = notification["message"].asString(); // UTF-8 line of text
- mFromName = notification["from"].asString(); // agent or object name
+ std::string messageText = notification["message"].asString(); // UTF-8 line of text
+ std::string fromName = notification["from"].asString(); // agent or object name
mFromID = notification["from_id"].asUUID(); // agent id or object id
+
int sType = notification["source"].asInteger();
mSourceType = (EChatSourceType)sType;
+
+ std::string color_name = notification["text_color"].asString();
+
+ LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+ textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+
+ S32 font_size = notification["font_size"].asInteger();
- std::string str_sender;
+ LLFontGL* messageFont;
+ switch(font_size)
+ {
+ case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
+ default:
+ case 1: messageFont = LLFontGL::getFontSansSerif(); break;
+ case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
+ }
+
+ LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- if(gAgentID != mFromID)
- str_sender = mFromName;
- else
- str_sender = LLTrans::getString("You");;
+ msg_text->setText(std::string(""));
- caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender);
-
- caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime());
+ if ( notification["chat_style"].asInteger() != CHAT_STYLE_IRC )
+ {
+ std::string str_sender;
+ str_sender = fromName;
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- msg_text->setText(mText);
+ str_sender+=" ";
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- if(mSourceType != CHAT_SOURCE_AGENT)
- msg_inspector->setVisible(false);
+ //append user name
+ {
+ LLStyle::Params style_params_name;
- mMessages.clear();
+ LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor");
- snapToMessageHeight ();
+ style_params_name.color(userNameColor);
- mIsDirty = true;//will set Avatar Icon in draw
-}
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params_name.font.name(font_name);
+ style_params_name.font.size(font_style_size);
+
+ msg_text->appendText(str_sender, FALSE, style_params_name);
+
+ }
+ }
+
+ //append text
+ {
+ LLStyle::Params style_params;
+ style_params.color(textColor);
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params.font.name(font_name);
+ style_params.font.size(font_style_size);
+
+ int chat_type = notification["chat_type"].asInteger();
+
+ if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ else if( chat_type == CHAT_TYPE_SHOUT)
+ {
+ style_params.font.style = "BOLD";
+ }
+ else if( chat_type == CHAT_TYPE_WHISPER)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ msg_text->appendText(messageText, FALSE, style_params);
+ }
-void LLNearbyChatToastPanel::setMessage (const LLChat& chat_msg)
-{
- LLSD notification;
- notification["message"] = chat_msg.mText;
- notification["from"] = chat_msg.mFromName;
- notification["from_id"] = chat_msg.mFromID;
- notification["time"] = chat_msg.mTime;
- notification["source"] = (S32)chat_msg.mSourceType;
- init(notification);
+ snapToMessageHeight();
+ mIsDirty = true;//will set Avatar Icon in draw
}
void LLNearbyChatToastPanel::snapToMessageHeight ()
{
LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
- S32 new_height = text_box->getTextPixelHeight() + msg_height_pad;
+ S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
+
LLRect panel_rect = getRect();
- S32 caption_height = 0;
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- caption_height = caption->getRect().getHeight();
-
- panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), caption_height + new_height);
+ panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height);
- reshape( getRect().getWidth(), caption_height + new_height, 1);
+ reshape( getRect().getWidth(), getRect().getHeight(), 1);
setRect(panel_rect);
}
-
-void LLNearbyChatToastPanel::setWidth(S32 width)
-{
- LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
- text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);
-
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- if(mText.length())
- msg_text->setText(mText);
-
- for(size_t i=0;i<mMessages.size();++i)
- msg_text->addText(mMessages[i]);
-
- setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width , getRect().mBottom));
- snapToMessageHeight ();
-}
-
void LLNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- msg_inspector->setVisible(false);
}
void LLNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
{
if(mSourceType != CHAT_SOURCE_AGENT)
return;
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- msg_inspector->setVisible(true);
}
BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
{
+ return LLPanel::handleMouseDown(x,y,mask);
+}
+
+BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
+{
+ /*
+ fix for request EXT-4780
+ leaving this commented since I don't remember why ew block those messages...
if(mSourceType != CHAT_SOURCE_AGENT)
- return LLPanel::handleMouseDown(x,y,mask);
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft;
- S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom;
- if(msg_inspector->pointInView(local_x, local_y))
- {
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mFromID));
- }
- else
+ return LLPanel::handleMouseUp(x,y,mask);
+ */
+
+ LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
+ S32 local_x = x - text_box->getRect().mLeft;
+ S32 local_y = y - text_box->getRect().mBottom;
+
+ //if text_box process mouse up (ussually this is click on url) - we didn't show nearby_chat.
+ if (text_box->pointInView(local_x, local_y) )
{
- LLFloaterReg::showInstance("nearby_chat",LLSD());
+ if (text_box->handleMouseUp(local_x,local_y,mask) == TRUE)
+ return TRUE;
+ else
+ {
+ LLFloaterReg::showInstance("nearby_chat",LLSD());
+ return FALSE;
+ }
}
- return LLPanel::handleMouseDown(x,y,mask);
+
+ LLFloaterReg::showInstance("nearby_chat",LLSD());
+ return LLPanel::handleMouseUp(x,y,mask);
}
void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
- LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon", false);
- LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name", false);
-
- icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
- name->setVisible(e == CHATITEMHEADER_SHOW_ONLY_NAME || e==CHATITEMHEADER_SHOW_BOTH);
+ LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+ if(icon)
+ icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
}
@@ -268,11 +303,10 @@ bool LLNearbyChatToastPanel::canAddText ()
BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon", false);
+ LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
- S32 local_x = x - avatar_icon->getRect().mLeft - caption->getRect().mLeft;
- S32 local_y = y - avatar_icon->getRect().mBottom - caption->getRect().mBottom;
+ S32 local_x = x - avatar_icon->getRect().mLeft;
+ S32 local_y = y - avatar_icon->getRect().mBottom;
//eat message for avatar icon if msg was from object
if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT)
@@ -283,9 +317,15 @@ void LLNearbyChatToastPanel::draw()
{
if(mIsDirty)
{
- LLPanel* caption = findChild<LLPanel>("msg_caption", false);
- if(caption)
- caption->getChild<LLAvatarIconCtrl>("avatar_icon", false)->setValue(mFromID);
+ LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
+ if(icon)
+ {
+ icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
+ if(mSourceType == CHAT_SOURCE_AGENT)
+ icon->setValue(mFromID);
+ else
+ icon->setValue(LLSD("OBJECT_Icon"));
+ }
mIsDirty = false;
}
LLToastPanelBase::draw();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 8fb045b6d9..4d730573d9 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -1,5 +1,5 @@
/**
- * @file llchatitemscontainer.h
+ * @file llchatitemscontainerctrl.h
* @brief chat history scrolling panel implementation
*
* $LicenseInfo:firstyear=2004&license=viewergpl$
@@ -30,13 +30,13 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLCHATITEMSCONTAINER_H_
-#define LL_LLCHATITEMSCONTAINER_H_
+#ifndef LL_LLCHATITEMSCONTAINERCTRL_H_
+#define LL_LLCHATITEMSCONTAINERCTRL_H_
+#include "llchat.h"
#include "llpanel.h"
#include "llscrollbar.h"
-#include "string"
-#include "llchat.h"
+#include "llviewerchat.h"
#include "lltoastpanel.h"
typedef enum e_show_item_header
@@ -49,19 +49,20 @@ typedef enum e_show_item_header
class LLNearbyChatToastPanel: public LLToastPanelBase
{
protected:
- LLNearbyChatToastPanel():mIsDirty(false){};
+ LLNearbyChatToastPanel()
+ :
+ mIsDirty(false),
+ mSourceType(CHAT_SOURCE_OBJECT)
+ {};
public:
-
-
~LLNearbyChatToastPanel(){}
static LLNearbyChatToastPanel* createInstance();
const LLUUID& getFromID() const { return mFromID;}
- void addText (const std::string& message);
- void setMessage (const LLChat& msg);
- void setWidth (S32 width);
+ //void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params());
+ //void setMessage (const LLChat& msg);
void snapToMessageHeight ();
bool canAddText ();
@@ -69,6 +70,7 @@ public:
void onMouseLeave (S32 x, S32 y, MASK mask);
void onMouseEnter (S32 x, S32 y, MASK mask);
BOOL handleMouseDown (S32 x, S32 y, MASK mask);
+ BOOL handleMouseUp (S32 x, S32 y, MASK mask);
virtual BOOL postBuild();
@@ -78,21 +80,17 @@ public:
BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
virtual void init(LLSD& data);
+ virtual void addMessage(LLSD& data);
virtual void draw();
-private:
-
- std::string appendTime ();
+ const LLUUID& messageID() const { return mFromID;}
private:
- std::string mText; // UTF-8 line of text
- std::string mFromName; // agent or object name
LLUUID mFromID; // agent id or object id
EChatSourceType mSourceType;
+
- std::vector<std::string> mMessages;
-
bool mIsDirty;
};
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp
index 12626e3b43..bb0ec2db27 100644
--- a/indra/newview/llchatmsgbox.cpp
+++ b/indra/newview/llchatmsgbox.cpp
@@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :
mBlockSpacing(p.block_spacing)
{}
-void LLChatMsgBox::addText( const LLStringExplicit& text )
+void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )
{
S32 length = getLength();
// if there is existing text, add a separator
@@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )
insertSegment(new ChatSeparator(length - 1, length - 1));
}
// prepend newline only if there is some existing text
- appendText(text, length > 0);
+ appendText(text, length > 0, input_params);
}
diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h
index df29db58c3..9e16616729 100644
--- a/indra/newview/llchatmsgbox.h
+++ b/indra/newview/llchatmsgbox.h
@@ -61,7 +61,7 @@ protected:
friend class LLUICtrlFactory;
public:
- void addText(const LLStringExplicit &text);
+ void addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());
private:
S32 mBlockSpacing;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 670f8717a2..8efa814a2e 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1,40 +1,42 @@
/**
-* @file llchiclet.cpp
-* @brief LLChiclet class implementation
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-*
-* Copyright (c) 2002-2009, Linden Research, Inc.
-*
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab. Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-*
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-*
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-*
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.cpp
+ * @brief LLChiclet class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
#include "llviewerprecompiledheaders.h" // must be first include
#include "llchiclet.h"
+
#include "llagent.h"
#include "llavataractions.h"
#include "llbottomtray.h"
+#include "lleventtimer.h"
#include "llgroupactions.h"
#include "lliconctrl.h"
#include "llimfloater.h"
@@ -42,23 +44,26 @@
#include "llfloaterreg.h"
#include "lllocalcliprect.h"
#include "llmenugl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "lloutputmonitorctrl.h"
+#include "llscriptfloater.h"
+#include "llspeakers.h"
#include "lltextbox.h"
#include "llvoiceclient.h"
-#include "llvoicecontrolpanel.h"
#include "llgroupmgr.h"
#include "llnotificationmanager.h"
#include "lltransientfloatermgr.h"
+#include "llsyswellwindow.h"
static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
-static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk");
-static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification");
-static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p");
-static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group");
-
-S32 LLNotificationChiclet::mUreadSystemNotifications = 0;
-S32 LLNotificationChiclet::mUreadIMNotifications = 0;
-
+static LLDefaultChildRegistry::Register<LLIMWellChiclet> t2_0("chiclet_im_well");
+static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");
+static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
+static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
+static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
+static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
+static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer");
boost::signals2::signal<LLChiclet* (const LLUUID&),
LLIMChiclet::CollectChicletCombiner<std::list<LLChiclet*> > >
@@ -67,100 +72,328 @@ boost::signals2::signal<LLChiclet* (const LLUUID&),
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-LLNotificationChiclet::Params::Params()
+/**
+ * Updates the Well's 'Lit' state to flash it when "new messages" are come.
+ *
+ * It gets callback which will be called 2*N times with passed period. See EXT-3147
+ */
+class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer
+{
+public:
+ typedef boost::function<void()> callback_t;
+
+ /**
+ * Constructor.
+ *
+ * @param count - how many times callback should be called (twice to not change original state)
+ * @param period - how frequently callback should be called
+ * @param cb - callback to be called each tick
+ */
+ FlashToLitTimer(S32 count, F32 period, callback_t cb)
+ : LLEventTimer(period)
+ , mCallback(cb)
+ , mFlashCount(2 * count)
+ , mCurrentFlashCount(0)
+ {
+ mEventTimer.stop();
+ }
+
+ BOOL tick()
+ {
+ mCallback();
+
+ if (++mCurrentFlashCount == mFlashCount) mEventTimer.stop();
+ return FALSE;
+ }
+
+ void flash()
+ {
+ mCurrentFlashCount = 0;
+ mEventTimer.start();
+ }
+
+ void stopFlashing()
+ {
+ mEventTimer.stop();
+ }
+
+private:
+ callback_t mCallback;
+
+ /**
+ * How many times Well will blink.
+ */
+ S32 mFlashCount;
+ S32 mCurrentFlashCount;
+};
+
+LLSysWellChiclet::Params::Params()
: button("button")
, unread_notifications("unread_notifications")
+, max_displayed_count("max_displayed_count", 99)
+, flash_to_lit_count("flash_to_lit_count", 3)
+, flash_period("flash_period", 0.5F)
{
button.name("button");
button.tab_stop(FALSE);
button.label(LLStringUtil::null);
-
- unread_notifications.name("unread");
- unread_notifications.font(LLFontGL::getFontSansSerif());
- unread_notifications.text_color=(LLColor4::white);
- unread_notifications.font_halign(LLFontGL::HCENTER);
- unread_notifications.mouse_opaque(FALSE);
}
-LLNotificationChiclet::LLNotificationChiclet(const Params& p)
+LLSysWellChiclet::LLSysWellChiclet(const Params& p)
: LLChiclet(p)
, mButton(NULL)
-, mCounterCtrl(NULL)
+, mCounter(0)
+, mMaxDisplayedCount(p.max_displayed_count)
+, mIsNewMessagesState(false)
+, mFlashToLitTimer(NULL)
+, mContextMenu(NULL)
{
LLButton::Params button_params = p.button;
- button_params.rect(p.rect());
mButton = LLUICtrlFactory::create<LLButton>(button_params);
addChild(mButton);
- LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
- mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
- addChild(mCounterCtrl);
+ mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
+}
- // connect counter handlers to the signals
- connectCounterUpdatersToSignal("notify");
- connectCounterUpdatersToSignal("groupnotify");
- connectCounterUpdatersToSignal("notifytoast");
+LLSysWellChiclet::~LLSysWellChiclet()
+{
+ delete mFlashToLitTimer;
+}
+
+void LLSysWellChiclet::setCounter(S32 counter)
+{
+ // do nothing if the same counter is coming. EXT-3678.
+ if (counter == mCounter) return;
+
+ // note same code in LLChicletNotificationCounterCtrl::setCounter(S32 counter)
+ std::string s_count;
+ if(counter != 0)
+ {
+ static std::string more_messages_exist("+");
+ std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
+ s_count = llformat("%d%s"
+ , llmin(counter, mMaxDisplayedCount)
+ , more_messages.c_str()
+ );
+ }
+
+ mButton->setLabel(s_count);
+
+ setNewMessagesState(counter > mCounter);
+
+ // we have to flash to 'Lit' state each time new unread message is coming.
+ if (counter > mCounter)
+ {
+ mFlashToLitTimer->flash();
+ }
+ else if (counter == 0)
+ {
+ // if notification is resolved while well is flashing it can leave in the 'Lit' state
+ // when flashing finishes itself. Let break flashing here.
+ mFlashToLitTimer->stopFlashing();
+ }
+
+ mCounter = counter;
+}
+
+boost::signals2::connection LLSysWellChiclet::setClickCallback(
+ const commit_callback_t& cb)
+{
+ return mButton->setClickedCallback(cb);
+}
+
+void LLSysWellChiclet::setToggleState(BOOL toggled) {
+ mButton->setToggleState(toggled);
+}
+
+void LLSysWellChiclet::changeLitState()
+{
+ setNewMessagesState(!mIsNewMessagesState);
+}
+
+void LLSysWellChiclet::setNewMessagesState(bool new_messages)
+{
+ /*
+ Emulate 4 states of button by background images, see detains in EXT-3147
+ xml attribute Description
+ image_unselected "Unlit" - there are no new messages
+ image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+ image_pressed "Lit" - there are new messages
+ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ */
+ mButton->setForcePressedState(new_messages);
+
+ mIsNewMessagesState = new_messages;
+}
+
+void LLSysWellChiclet::updateWidget(bool is_window_empty)
+{
+ mButton->setEnabled(!is_window_empty);
+}
+// virtual
+BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if(!mContextMenu)
+ {
+ createMenu();
+ }
+ if (mContextMenu)
+ {
+ mContextMenu->show(x, y);
+ LLMenuGL::showPopup(this, mContextMenu, x, y);
+ }
+ return TRUE;
+}
+
+/************************************************************************/
+/* LLIMWellChiclet implementation */
+/************************************************************************/
+LLIMWellChiclet::LLIMWellChiclet(const Params& p)
+: LLSysWellChiclet(p)
+{
+ LLIMModel::instance().addNewMsgCallback(boost::bind(&LLIMWellChiclet::messageCountChanged, this, _1));
+ LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(&LLIMWellChiclet::messageCountChanged, this, _1));
+
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
+ LLIMWellWindow::getInstance()->setSysWellChiclet(this);
}
-LLNotificationChiclet::~LLNotificationChiclet()
+LLIMWellChiclet::~LLIMWellChiclet()
{
+ LLIMMgr::getInstance()->removeSessionObserver(this);
+}
+
+void LLIMWellChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string action = user_data.asString();
+ if("close all" == action)
+ {
+ LLIMWellWindow::getInstance()->closeAll();
+ }
+}
+bool LLIMWellChiclet::enableMenuItem(const LLSD& user_data)
+{
+ std::string item = user_data.asString();
+ if (item == "can close all")
+ {
+ return !LLIMWellWindow::getInstance()->isWindowEmpty();
+ }
+ return true;
}
-void LLNotificationChiclet::connectCounterUpdatersToSignal(std::string notification_type)
+void LLIMWellChiclet::createMenu()
+{
+ if(mContextMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return;
+ }
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("IMWellChicletMenu.Action",
+ boost::bind(&LLIMWellChiclet::onMenuItemClicked, this, _2));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ enable_registrar.add("IMWellChicletMenu.EnableItem",
+ boost::bind(&LLIMWellChiclet::enableMenuItem, this, _2));
+
+ mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
+ ("menu_im_well_button.xml",
+ LLMenuGL::sMenuContainer,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
+{
+ setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount());
+}
+
+/************************************************************************/
+/* LLNotificationChiclet implementation */
+/************************************************************************/
+LLNotificationChiclet::LLNotificationChiclet(const Params& p)
+: LLSysWellChiclet(p)
+, mUreadSystemNotifications(0)
+{
+ // connect counter handlers to the signals
+ connectCounterUpdatersToSignal("notify");
+ connectCounterUpdatersToSignal("groupnotify");
+ connectCounterUpdatersToSignal("offer");
+
+ // ensure that notification well window exists, to synchronously
+ // handle toast add/delete events.
+ LLNotificationWellWindow::getInstance()->setSysWellChiclet(this);
+}
+
+void LLNotificationChiclet::connectCounterUpdatersToSignal(const std::string& notification_type)
{
LLNotificationsUI::LLNotificationManager* manager = LLNotificationsUI::LLNotificationManager::getInstance();
LLNotificationsUI::LLEventHandler* n_handler = manager->getHandlerForNotification(notification_type);
if(n_handler)
{
- if(notification_type == "notifytoast")
- {
- n_handler->setNewNotificationCallback(boost::bind(&LLNotificationChiclet::updateUreadIMNotifications, this));
- n_handler->setDelNotification(boost::bind(&LLNotificationChiclet::updateUreadIMNotifications, this));
- }
- else
- {
- n_handler->setNewNotificationCallback(boost::bind(&LLNotificationChiclet::incUreadSystemNotifications, this));
- n_handler->setDelNotification(boost::bind(&LLNotificationChiclet::decUreadSystemNotifications, this));
- }
+ n_handler->setNewNotificationCallback(boost::bind(&LLNotificationChiclet::incUreadSystemNotifications, this));
+ n_handler->setDelNotification(boost::bind(&LLNotificationChiclet::decUreadSystemNotifications, this));
}
}
-void LLNotificationChiclet::setCounter(S32 counter)
+void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
{
- mCounterCtrl->setCounter(counter);
+ std::string action = user_data.asString();
+ if("close all" == action)
+ {
+ LLNotificationWellWindow::getInstance()->closeAll();
+ }
}
-void LLNotificationChiclet::setShowCounter(bool show)
+bool LLNotificationChiclet::enableMenuItem(const LLSD& user_data)
{
- LLChiclet::setShowCounter(show);
- mCounterCtrl->setVisible(getShowCounter());
+ std::string item = user_data.asString();
+ if (item == "can close all")
+ {
+ return mUreadSystemNotifications != 0;
+ }
+ return true;
}
-boost::signals2::connection LLNotificationChiclet::setClickCallback(
- const commit_callback_t& cb)
+void LLNotificationChiclet::createMenu()
{
- return mButton->setClickedCallback(cb);
-}
+ if(mContextMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return;
+ }
-void LLNotificationChiclet::setToggleState(BOOL toggled) {
- mButton->setToggleState(toggled);
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("NotificationWellChicletMenu.Action",
+ boost::bind(&LLNotificationChiclet::onMenuItemClicked, this, _2));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ enable_registrar.add("NotificationWellChicletMenu.EnableItem",
+ boost::bind(&LLNotificationChiclet::enableMenuItem, this, _2));
+
+ mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
+ ("menu_notification_well_button.xml",
+ LLMenuGL::sMenuContainer,
+ LLViewerMenuHolderGL::child_registry_t::instance());
}
-void LLNotificationChiclet::updateUreadIMNotifications()
+/*virtual*/
+void LLNotificationChiclet::setCounter(S32 counter)
{
- mUreadIMNotifications = gIMMgr->getNumberOfUnreadIM();
- setCounter(mUreadSystemNotifications + mUreadIMNotifications);
+ LLSysWellChiclet::setCounter(counter);
+ updateWidget(getCounter() == 0);
+
}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
LLChiclet::Params::Params()
- : show_counter("show_counter")
+ : show_counter("show_counter", true)
+ , enable_counter("enable_counter", false)
{
- show_counter = true;
}
LLChiclet::LLChiclet(const Params& p)
@@ -179,7 +412,7 @@ LLChiclet::~LLChiclet()
boost::signals2::connection LLChiclet::setLeftButtonClickCallback(
const commit_callback_t& cb)
{
- return mCommitSignal.connect(cb);
+ return setCommitCallback(cb);
}
BOOL LLChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -215,9 +448,138 @@ void LLChiclet::setValue(const LLSD& value)
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-LLIMChiclet::LLIMChiclet(const LLChiclet::Params& p)
+LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
: LLChiclet(p)
+, mShowSpeaker(false)
+, mDefaultWidth(p.rect().getWidth())
+, mNewMessagesIcon(NULL)
+, mSpeakerCtrl(NULL)
+, mCounterCtrl(NULL)
+, mChicletButton(NULL)
+{
+ enableCounterControl(p.enable_counter);
+}
+
+/* virtual*/
+BOOL LLIMChiclet::postBuild()
+{
+ mChicletButton = getChild<LLButton>("chiclet_button");
+ mChicletButton->setCommitCallback(boost::bind(&LLIMChiclet::onMouseDown, this));
+ mChicletButton->setDoubleClickCallback(boost::bind(&LLIMChiclet::onMouseDown, this));
+ return TRUE;
+}
+void LLIMChiclet::setShowSpeaker(bool show)
+{
+ bool needs_resize = getShowSpeaker() != show;
+ if(needs_resize)
+ {
+ mShowSpeaker = show;
+ toggleSpeakerControl();
+ }
+}
+
+void LLIMChiclet::enableCounterControl(bool enable)
+{
+ mCounterEnabled = enable;
+ if(!enable)
+ {
+ LLChiclet::setShowCounter(false);
+ }
+}
+
+void LLIMChiclet::setShowCounter(bool show)
{
+ if(!mCounterEnabled)
+ {
+ return;
+ }
+
+ bool needs_resize = getShowCounter() != show;
+ if(needs_resize)
+ {
+ LLChiclet::setShowCounter(show);
+ toggleCounterControl();
+ }
+}
+
+void LLIMChiclet::initSpeakerControl()
+{
+ // virtual
+}
+
+void LLIMChiclet::setRequiredWidth()
+{
+ bool show_speaker = getShowSpeaker();
+ bool show_counter = getShowCounter();
+ S32 required_width = mDefaultWidth;
+
+ if (show_counter)
+ {
+ required_width += mCounterCtrl->getRect().getWidth();
+ }
+ if (show_speaker)
+ {
+ required_width += mSpeakerCtrl->getRect().getWidth();
+ }
+
+ reshape(required_width, getRect().getHeight());
+
+ onChicletSizeChanged();
+}
+
+void LLIMChiclet::toggleSpeakerControl()
+{
+ if(getShowSpeaker())
+ {
+ // move speaker to the right of chiclet icon
+ LLRect speaker_rc = mSpeakerCtrl->getRect();
+ speaker_rc.setLeftTopAndSize(mDefaultWidth, speaker_rc.mTop, speaker_rc.getWidth(), speaker_rc.getHeight());
+ mSpeakerCtrl->setRect(speaker_rc);
+
+ if(getShowCounter())
+ {
+ // move speaker to the right of counter
+ mSpeakerCtrl->translate(mCounterCtrl->getRect().getWidth(), 0);
+ }
+
+ initSpeakerControl();
+ }
+
+ setRequiredWidth();
+ mSpeakerCtrl->setSpeakerId(LLUUID::null);
+ mSpeakerCtrl->setVisible(getShowSpeaker());
+}
+
+void LLIMChiclet::setCounter(S32 counter)
+{
+ if (mCounterCtrl->getCounter() == counter)
+ {
+ return;
+ }
+
+ mCounterCtrl->setCounter(counter);
+ setShowCounter(counter);
+ setShowNewMessagesIcon(counter);
+}
+
+void LLIMChiclet::toggleCounterControl()
+{
+ setRequiredWidth();
+ mCounterCtrl->setVisible(getShowCounter());
+}
+
+void LLIMChiclet::setShowNewMessagesIcon(bool show)
+{
+ if(mNewMessagesIcon)
+ {
+ mNewMessagesIcon->setVisible(show);
+ }
+ setRequiredWidth();
+}
+
+bool LLIMChiclet::getShowNewMessagesIcon()
+{
+ return mNewMessagesIcon->getVisible();
}
void LLIMChiclet::onMouseDown()
@@ -226,17 +588,14 @@ void LLIMChiclet::onMouseDown()
setCounter(0);
}
-BOOL LLIMChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
+void LLIMChiclet::setToggleState(bool toggle)
{
- onMouseDown();
- return LLChiclet::handleMouseDown(x, y, mask);
+ mChicletButton->setToggleState(toggle);
}
void LLIMChiclet::draw()
{
LLUICtrl::draw();
-
- gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.0f,0.0f,0.0f,1.f), FALSE);
}
// static
@@ -286,44 +645,27 @@ LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id)
LLIMP2PChiclet::Params::Params()
: avatar_icon("avatar_icon")
+, chiclet_button("chiclet_button")
, unread_notifications("unread_notifications")
, speaker("speaker")
+, new_message_icon("new_message_icon")
, show_speaker("show_speaker")
{
- // *TODO Vadim: Get rid of hardcoded values.
- rect(LLRect(0, 25, 45, 0));
-
- avatar_icon.name("avatar_icon");
- avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
-
- // *NOTE dzaporozhan
- // Changed icon height from 25 to 24 to fix ticket EXT-794.
- // In some cases(after changing UI scale) 25 pixel height icon was
- // drawn incorrectly, i'm not sure why.
- avatar_icon.rect(LLRect(0, 24, 25, 0));
- avatar_icon.mouse_opaque(false);
-
- unread_notifications.name("unread");
- unread_notifications.rect(LLRect(25, 25, 45, 0));
- unread_notifications.font(LLFontGL::getFontSansSerif());
- unread_notifications.font_halign(LLFontGL::HCENTER);
- unread_notifications.v_pad(5);
- unread_notifications.text_color(LLColor4::white);
- unread_notifications.mouse_opaque(false);
-
- speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
-
- show_speaker = false;
}
LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mCounterCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
+ LLButton::Params button_params = p.chiclet_button;
+ mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
+ addChild(mChicletButton);
+
+ LLIconCtrl::Params new_msg_params = p.new_message_icon;
+ mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);
+ addChild(mNewMessagesIcon);
+
LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
mChicletIconCtrl = LLUICtrlFactory::create<LLChicletAvatarIconCtrl>(avatar_params);
addChild(mChicletIconCtrl);
@@ -339,42 +681,13 @@ LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
addChild(mSpeakerCtrl);
+ sendChildToFront(mNewMessagesIcon);
setShowSpeaker(p.show_speaker);
}
-void LLIMP2PChiclet::setCounter(S32 counter)
-{
- mCounterCtrl->setCounter(counter);
-
- if(getShowCounter())
- {
- LLRect counter_rect = mCounterCtrl->getRect();
- LLRect required_rect = mCounterCtrl->getRequiredRect();
- bool needs_resize = required_rect.getWidth() != counter_rect.getWidth();
-
- if(needs_resize)
- {
- counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth();
- mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight());
- mCounterCtrl->setRect(counter_rect);
-
- onChicletSizeChanged();
- }
- }
-}
-
-LLRect LLIMP2PChiclet::getRequiredRect()
+void LLIMP2PChiclet::initSpeakerControl()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
- {
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
- }
- if(getShowSpeaker())
- {
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
- }
- return rect;
+ mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
}
void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id)
@@ -390,10 +703,12 @@ void LLIMP2PChiclet::updateMenuItems()
if(getSessionId().isNull())
return;
+ LLIMFloater* open_im_floater = LLIMFloater::findInstance(getSessionId());
+ bool open_window_exists = open_im_floater && open_im_floater->getVisible();
+ mPopupMenu->getChild<LLUICtrl>("Send IM")->setEnabled(!open_window_exists);
+
bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());
-
mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
- mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);
}
BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -449,17 +764,9 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
{
LLAvatarActions::requestFriendshipDialog(other_participant_id);
}
-}
-
-void LLIMP2PChiclet::setShowSpeaker(bool show)
-{
- LLIMChiclet::setShowSpeaker(show);
-
- bool needs_resize = getShowSpeaker() != show;
- mSpeakerCtrl->setVisible(getShowSpeaker());
- if(needs_resize)
+ else if("end" == level)
{
- onChicletSizeChanged();
+ LLAvatarActions::endIM(other_participant_id);
}
}
@@ -469,46 +776,32 @@ void LLIMP2PChiclet::setShowSpeaker(bool show)
LLAdHocChiclet::Params::Params()
: avatar_icon("avatar_icon")
+, chiclet_button("chiclet_button")
, unread_notifications("unread_notifications")
, speaker("speaker")
+, new_message_icon("new_message_icon")
, show_speaker("show_speaker")
+, avatar_icon_color("avatar_icon_color", LLColor4::green)
{
- // *TODO Vadim: Get rid of hardcoded values.
- rect(LLRect(0, 25, 45, 0));
-
- avatar_icon.name("avatar_icon");
- avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
-
- // *NOTE dzaporozhan
- // Changed icon height from 25 to 24 to fix ticket EXT-794.
- // In some cases(after changing UI scale) 25 pixel height icon was
- // drawn incorrectly, i'm not sure why.
- avatar_icon.rect(LLRect(0, 24, 25, 0));
- avatar_icon.mouse_opaque(false);
-
- unread_notifications.name("unread");
- unread_notifications.rect(LLRect(25, 25, 45, 0));
- unread_notifications.font(LLFontGL::getFontSansSerif());
- unread_notifications.font_halign(LLFontGL::HCENTER);
- unread_notifications.v_pad(5);
- unread_notifications.text_color(LLColor4::white);
- unread_notifications.mouse_opaque(false);
-
- speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
-
- show_speaker = false;
}
LLAdHocChiclet::LLAdHocChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mCounterCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
+ LLButton::Params button_params = p.chiclet_button;
+ mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
+ addChild(mChicletButton);
+
+ LLIconCtrl::Params new_msg_params = p.new_message_icon;
+ mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);
+ addChild(mNewMessagesIcon);
+
LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
mChicletIconCtrl = LLUICtrlFactory::create<LLChicletAvatarIconCtrl>(avatar_params);
+ //Make the avatar modified
+ mChicletIconCtrl->setColor(p.avatar_icon_color);
addChild(mChicletIconCtrl);
LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
@@ -522,6 +815,7 @@ LLAdHocChiclet::LLAdHocChiclet(const Params& p)
mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
addChild(mSpeakerCtrl);
+ sendChildToFront(mNewMessagesIcon);
setShowSpeaker(p.show_speaker);
}
@@ -532,43 +826,79 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id)
mChicletIconCtrl->setValue(im_session->mOtherParticipantID);
}
-void LLAdHocChiclet::setCounter(S32 counter)
+void LLAdHocChiclet::draw()
{
- mCounterCtrl->setCounter(counter);
+ switchToCurrentSpeaker();
+ LLIMChiclet::draw();
+}
- if(getShowCounter())
- {
- LLRect counter_rect = mCounterCtrl->getRect();
- LLRect required_rect = mCounterCtrl->getRequiredRect();
- bool needs_resize = required_rect.getWidth() != counter_rect.getWidth();
+void LLAdHocChiclet::initSpeakerControl()
+{
+ switchToCurrentSpeaker();
+}
- if(needs_resize)
- {
- counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth();
- mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight());
- mCounterCtrl->setRect(counter_rect);
+void LLAdHocChiclet::switchToCurrentSpeaker()
+{
+ LLUUID speaker_id;
+ LLSpeakerMgr::speaker_list_t speaker_list;
- onChicletSizeChanged();
+ LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE);
+ for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
+ {
+ LLPointer<LLSpeaker> s = *i;
+ if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+ {
+ speaker_id = s->mID;
+ break;
}
}
+
+ mSpeakerCtrl->setSpeakerId(speaker_id);
}
-LLRect LLAdHocChiclet::getRequiredRect()
+void LLAdHocChiclet::createPopupMenu()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
+ if(mPopupMenu)
{
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
+ llwarns << "Menu already exists" << llendl;
+ return;
}
- if(getShowSpeaker())
+ if(getSessionId().isNull())
+ {
+ return;
+ }
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
+ ("menu_imchiclet_adhoc.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string level = user_data.asString();
+ LLUUID group_id = getSessionId();
+
+ if("end" == level)
{
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
+ LLGroupActions::endIM(group_id);
}
- return rect;
}
BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
+ if(!mPopupMenu)
+ {
+ createPopupMenu();
+ }
+
+ if (mPopupMenu)
+ {
+ mPopupMenu->arrangeAndClear();
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+
return TRUE;
}
@@ -578,38 +908,28 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
LLIMGroupChiclet::Params::Params()
: group_icon("group_icon")
+, chiclet_button("chiclet_button")
+, unread_notifications("unread_notifications")
+, speaker("speaker")
+, new_message_icon("new_message_icon")
+, show_speaker("show_speaker")
{
- rect(LLRect(0, 25, 45, 0));
-
- group_icon.name("group_icon");
-
- // *NOTE dzaporozhan
- // Changed icon height from 25 to 24 to fix ticket EXT-794.
- // In some cases(after changing UI scale) 25 pixel height icon was
- // drawn incorrectly, i'm not sure why.
- group_icon.rect(LLRect(0, 24, 25, 0));
-
- unread_notifications.name("unread");
- unread_notifications.rect(LLRect(25, 25, 45, 0));
- unread_notifications.font(LLFontGL::getFontSansSerif());
- unread_notifications.font_halign(LLFontGL::HCENTER);
- unread_notifications.v_pad(5);
- unread_notifications.text_color(LLColor4::white);
-
- speaker.name("speaker");
- speaker.rect(LLRect(45, 25, 65, 0));
-
- show_speaker = false;
}
LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
: LLIMChiclet(p)
, LLGroupMgrObserver(LLUUID::null)
, mChicletIconCtrl(NULL)
-, mCounterCtrl(NULL)
-, mSpeakerCtrl(NULL)
, mPopupMenu(NULL)
{
+ LLButton::Params button_params = p.chiclet_button;
+ mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
+ addChild(mChicletButton);
+
+ LLIconCtrl::Params new_msg_params = p.new_message_icon;
+ mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);
+ addChild(mNewMessagesIcon);
+
LLChicletGroupIconCtrl::Params avatar_params = p.group_icon;
mChicletIconCtrl = LLUICtrlFactory::create<LLChicletGroupIconCtrl>(avatar_params);
addChild(mChicletIconCtrl);
@@ -625,6 +945,7 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
addChild(mSpeakerCtrl);
+ sendChildToFront(mNewMessagesIcon);
setShowSpeaker(p.show_speaker);
}
@@ -633,39 +954,37 @@ LLIMGroupChiclet::~LLIMGroupChiclet()
LLGroupMgr::getInstance()->removeObserver(this);
}
-void LLIMGroupChiclet::setCounter(S32 counter)
+void LLIMGroupChiclet::draw()
{
- mCounterCtrl->setCounter(counter);
-
- if(getShowCounter())
+ if(getShowSpeaker())
{
- LLRect counter_rect = mCounterCtrl->getRect();
- LLRect required_rect = mCounterCtrl->getRequiredRect();
- bool needs_resize = required_rect.getWidth() != counter_rect.getWidth();
-
- if(needs_resize)
- {
- counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth();
- mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight());
- mCounterCtrl->setRect(counter_rect);
-
- onChicletSizeChanged();
- }
+ switchToCurrentSpeaker();
}
+ LLIMChiclet::draw();
}
-LLRect LLIMGroupChiclet::getRequiredRect()
+void LLIMGroupChiclet::initSpeakerControl()
{
- LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
- if(getShowCounter())
- {
- rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
- }
- if(getShowSpeaker())
+ switchToCurrentSpeaker();
+}
+
+void LLIMGroupChiclet::switchToCurrentSpeaker()
+{
+ LLUUID speaker_id;
+ LLSpeakerMgr::speaker_list_t speaker_list;
+
+ LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE);
+ for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
{
- rect.mRight += mSpeakerCtrl->getRect().getWidth();
+ LLPointer<LLSpeaker> s = *i;
+ if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+ {
+ speaker_id = s->mID;
+ break;
+ }
}
- return rect;
+
+ mSpeakerCtrl->setSpeakerId(speaker_id);
}
void LLIMGroupChiclet::setSessionId(const LLUUID& session_id)
@@ -702,6 +1021,18 @@ void LLIMGroupChiclet::changed(LLGroupChange gc)
}
}
+void LLIMGroupChiclet::updateMenuItems()
+{
+ if(!mPopupMenu)
+ return;
+ if(getSessionId().isNull())
+ return;
+
+ LLIMFloater* open_im_floater = LLIMFloater::findInstance(getSessionId());
+ bool open_window_exists = open_im_floater && open_im_floater->getVisible();
+ mPopupMenu->getChild<LLUICtrl>("Chat")->setEnabled(!open_window_exists);
+}
+
BOOL LLIMGroupChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if(!mPopupMenu)
@@ -711,6 +1042,7 @@ BOOL LLIMGroupChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
if (mPopupMenu)
{
+ updateMenuItems();
mPopupMenu->arrangeAndClear();
LLMenuGL::showPopup(this, mPopupMenu, x, y);
}
@@ -744,26 +1076,19 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
if("group chat" == level)
{
- LLGroupActions::startChat(group_id);
+ LLGroupActions::startIM(group_id);
}
else if("info" == level)
{
LLGroupActions::show(group_id);
}
-}
-
-void LLIMGroupChiclet::setShowSpeaker(bool show)
-{
- LLIMChiclet::setShowSpeaker(show);
-
- bool needs_resize = getShowSpeaker() != show;
- mSpeakerCtrl->setVisible(getShowSpeaker());
- if(needs_resize)
+ else if("end" == level)
{
- onChicletSizeChanged();
+ LLGroupActions::endIM(group_id);
}
}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -771,36 +1096,10 @@ void LLIMGroupChiclet::setShowSpeaker(bool show)
LLChicletPanel::Params::Params()
: chiclet_padding("chiclet_padding")
, scrolling_offset("scrolling_offset")
-, left_scroll_button("left_scroll_button")
-, right_scroll_button("right_scroll_button")
+, scroll_button_hpad("scroll_button_hpad")
+, scroll_ratio("scroll_ratio")
, min_width("min_width")
{
- chiclet_padding = 3;
- scrolling_offset = 40;
-
- if (!min_width.isProvided())
- {
- // min_width = 4 chiclets + 3 paddings
- min_width = 179 + 3*chiclet_padding;
- }
-
- LLRect scroll_button_rect(0, 25, 19, 5);
-
- left_scroll_button.name("left_scroll");
- left_scroll_button.label(LLStringUtil::null);
- left_scroll_button.rect(scroll_button_rect);
- left_scroll_button.tab_stop(false);
- left_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
- left_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
- left_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
-
- right_scroll_button.name("right_scroll");
- right_scroll_button.label(LLStringUtil::null);
- right_scroll_button.rect(scroll_button_rect);
- right_scroll_button.tab_stop(false);
- right_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
- right_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
- right_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
};
LLChicletPanel::LLChicletPanel(const Params&p)
@@ -810,27 +1109,13 @@ LLChicletPanel::LLChicletPanel(const Params&p)
, mRightScrollButton(NULL)
, mChicletPadding(p.chiclet_padding)
, mScrollingOffset(p.scrolling_offset)
+, mScrollButtonHPad(p.scroll_button_hpad)
+, mScrollRatio(p.scroll_ratio)
, mMinWidth(p.min_width)
, mShowControls(true)
{
- LLButton::Params scroll_button_params = p.left_scroll_button;
-
- mLeftScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
- addChild(mLeftScrollButton);
- LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
-
- mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
- mLeftScrollButton->setEnabled(false);
-
- scroll_button_params = p.right_scroll_button;
- mRightScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
- addChild(mRightScrollButton);
- LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
-
- mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
- mRightScrollButton->setEnabled(false);
-
LLPanel::Params panel_params;
+ panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);
mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);
// important for Show/Hide Camera and Move controls menu in bottom tray to work properly
@@ -841,73 +1126,160 @@ LLChicletPanel::LLChicletPanel(const Params&p)
LLChicletPanel::~LLChicletPanel()
{
+ LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton);
+ LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton);
}
void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
LLUUID session_id = data["session_id"].asUUID();
+ S32 unread = data["participant_unread"].asInteger();
+
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ if (im_floater && im_floater->getVisible())
+ {
+ unread = 0;
+ }
+
std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
std::list<LLChiclet *>::iterator iter;
for (iter = chiclets.begin(); iter != chiclets.end(); iter++) {
LLChiclet* chiclet = *iter;
if (chiclet != NULL)
{
- chiclet->setCounter(data["num_unread"].asInteger());
+ chiclet->setCounter(unread);
}
else
{
llwarns << "Unable to set counter for chiclet " << session_id << llendl;
}
}
-
}
+void object_chiclet_callback(const LLSD& data)
+{
+ LLUUID notification_id = data["notification_id"];
+ bool new_message = data["new_message"];
+
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(notification_id);
+ std::list<LLChiclet *>::iterator iter;
+ for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*iter);
+ if (chiclet != NULL)
+ {
+ if(data.has("unread"))
+ {
+ chiclet->setCounter(data["unread"]);
+ }
+ chiclet->setShowNewMessagesIcon(new_message);
+ }
+ }
+}
BOOL LLChicletPanel::postBuild()
{
LLPanel::postBuild();
LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
+ LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(object_chiclet_callback, _1));
+ LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(object_chiclet_callback, _1));
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
+
+ mLeftScrollButton=getChild<LLButton>("chicklet_left_scroll_button");
+ LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
+ mLeftScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
+ mLeftScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onLeftScrollHeldDown,this));
+ mLeftScrollButton->setEnabled(false);
+
+ mRightScrollButton=getChild<LLButton>("chicklet_right_scroll_button");
+ LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
+ mRightScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
+ mRightScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onRightScrollHeldDown,this));
+ mRightScrollButton->setEnabled(false);
return TRUE;
}
-S32 LLChicletPanel::calcChickletPanleWidth()
+void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
{
- S32 res = 0;
+ static LLUUID s_previous_active_voice_session_id;
- for (chiclet_list_t::iterator it = mChicletList.begin(); it
- != mChicletList.end(); it++)
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
+
+ for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
{
- res = (*it)->getRect().getWidth() + getChicletPadding();
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
+ {
+ chiclet->setShowSpeaker(true);
+ }
}
- return res;
+
+ if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id)
+ {
+ chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id);
+
+ for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
+ {
+ chiclet->setShowSpeaker(false);
+ }
+ }
+ }
+
+ s_previous_active_voice_session_id = session_id;
}
bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
{
if(mScrollArea->addChild(chiclet))
{
- // chicklets should be aligned to right edge of scroll panel
- S32 offset = 0;
+ // chiclets should be aligned to right edge of scroll panel
+ S32 left_shift = 0;
if (!canScrollLeft())
{
- offset = mScrollArea->getRect().getWidth()
- - chiclet->getRect().getWidth() - calcChickletPanleWidth();
+ // init left shift for the first chiclet in the list...
+ if (mChicletList.empty())
+ {
+ // ...start from the right border of the scroll area for the first added chiclet
+ left_shift = mScrollArea->getRect().getWidth();
+ }
+ else
+ {
+ // ... start from the left border of the first chiclet minus padding
+ left_shift = getChiclet(0)->getRect().mLeft - getChicletPadding();
+ }
+
+ // take into account width of the being added chiclet
+ left_shift -= chiclet->getRequiredRect().getWidth();
+
+ // if we overflow the scroll area we do not need to shift chiclets
+ if (left_shift < 0)
+ {
+ left_shift = 0;
+ }
}
mChicletList.insert(mChicletList.begin() + index, chiclet);
- getChiclet(0)->translate(offset, 0);
+ // shift first chiclet to place it in correct position.
+ // rest ones will be placed in arrange()
+ if (!canScrollLeft())
+ {
+ getChiclet(0)->translate(left_shift - getChiclet(0)->getRect().mLeft, 0);
+ }
chiclet->setLeftButtonClickCallback(boost::bind(&LLChicletPanel::onChicletClick, this, _1, _2));
chiclet->setChicletSizeChangedCallback(boost::bind(&LLChicletPanel::onChicletSizeChanged, this, _1, index));
arrange();
- showScrollButtonsIfNeeded();
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, chiclet);
return true;
}
@@ -917,40 +1289,26 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
{
- S32 chiclet_width = ctrl->getRect().getWidth();
- S32 chiclet_new_width = ctrl->getRequiredRect().getWidth();
-
- if(chiclet_new_width == chiclet_width)
- {
- return;
- }
-
- LLRect chiclet_rect = ctrl->getRect();
- chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width;
-
- ctrl->setRect(chiclet_rect);
-
- S32 offset = chiclet_new_width - chiclet_width;
- S32 index = getChicletIndex(ctrl);
-
- shiftChiclets(offset, index + 1);
- trimChiclets();
- showScrollButtonsIfNeeded();
+ arrange();
}
void LLChicletPanel::onChicletClick(LLUICtrl*ctrl,const LLSD&param)
{
- mCommitSignal(ctrl,param);
+ if (mCommitSignal)
+ {
+ (*mCommitSignal)(ctrl,param);
+ }
}
void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it)
{
- mScrollArea->removeChild(*it);
+ LLChiclet* chiclet = *it;
+ mScrollArea->removeChild(chiclet);
mChicletList.erase(it);
arrange();
- trimChiclets();
- showScrollButtonsIfNeeded();
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, chiclet);
+ chiclet->die();
}
void LLChicletPanel::removeChiclet(S32 index)
@@ -1043,25 +1401,76 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
{
LLPanel::reshape(width,height,called_from_parent);
- static const S32 SCROLL_BUTTON_PAD = 5;
-
+ //Needed once- to avoid error at first call of reshape() before postBuild()
+ if(!mLeftScrollButton||!mRightScrollButton)
+ return;
+
LLRect scroll_button_rect = mLeftScrollButton->getRect();
- mLeftScrollButton->setRect(LLRect(0,height,scroll_button_rect.getWidth(),
- height - scroll_button_rect.getHeight()));
-
+ mLeftScrollButton->setRect(LLRect(0,scroll_button_rect.mTop,scroll_button_rect.getWidth(),
+ scroll_button_rect.mBottom));
scroll_button_rect = mRightScrollButton->getRect();
- mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),height,
- width, height - scroll_button_rect.getHeight()));
-
- mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
- height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
+ mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),scroll_button_rect.mTop,
+ width, scroll_button_rect.mBottom));
+
- mShowControls = width > mMinWidth;
+ bool need_show_scroll = needShowScroll();
+ if(need_show_scroll)
+ {
+ mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + mScrollButtonHPad,
+ height, width - scroll_button_rect.getWidth() - mScrollButtonHPad, 0));
+ }
+ else
+ {
+ mScrollArea->setRect(LLRect(0,height, width, 0));
+ }
+
+ mShowControls = width >= mMinWidth;
+
mScrollArea->setVisible(mShowControls);
trimChiclets();
-
showScrollButtonsIfNeeded();
+
+}
+
+S32 LLChicletPanel::notifyParent(const LLSD& info)
+{
+ if(info.has("notification"))
+ {
+ std::string str_notification = info["notification"];
+ if(str_notification == "size_changes")
+ {
+ arrange();
+ return 1;
+ }
+ }
+ return LLPanel::notifyParent(info);
+}
+
+void LLChicletPanel::setChicletToggleState(const LLUUID& session_id, bool toggle)
+{
+ if(session_id.isNull())
+ {
+ llwarns << "Null Session ID" << llendl;
+ }
+
+ // toggle off all chiclets, except specified
+ S32 size = getChicletCount();
+ for(int n = 0; n < size; ++n)
+ {
+ LLIMChiclet* chiclet = getChiclet<LLIMChiclet>(n);
+ if(chiclet && chiclet->getSessionId() != session_id)
+ {
+ chiclet->setToggleState(false);
+ }
+ }
+
+ // toggle specified chiclet
+ LLIMChiclet* chiclet = findChiclet<LLIMChiclet>(session_id);
+ if(chiclet)
+ {
+ chiclet->setToggleState(toggle);
+ }
}
void LLChicletPanel::arrange()
@@ -1069,8 +1478,8 @@ void LLChicletPanel::arrange()
if(mChicletList.empty())
return;
+ //initial arrange of chicklets positions
S32 chiclet_left = getChiclet(0)->getRect().mLeft;
-
S32 size = getChicletCount();
for( int n = 0; n < size; ++n)
{
@@ -1084,6 +1493,24 @@ void LLChicletPanel::arrange()
chiclet_left += chiclet_width + getChicletPadding();
}
+
+ //reset size and pos on mScrollArea
+ LLRect rect = getRect();
+ LLRect scroll_button_rect = mLeftScrollButton->getRect();
+
+ bool need_show_scroll = needShowScroll();
+ if(need_show_scroll)
+ {
+ mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + mScrollButtonHPad,
+ rect.getHeight(), rect.getWidth() - scroll_button_rect.getWidth() - mScrollButtonHPad, 0));
+ }
+ else
+ {
+ mScrollArea->setRect(LLRect(0,rect.getHeight(), rect.getWidth(), 0));
+ }
+
+ trimChiclets();
+ showScrollButtonsIfNeeded();
}
void LLChicletPanel::trimChiclets()
@@ -1101,6 +1528,17 @@ void LLChicletPanel::trimChiclets()
}
}
+bool LLChicletPanel::needShowScroll()
+{
+ if(mChicletList.empty())
+ return false;
+
+ S32 chicklet_width = (*mChicletList.rbegin())->getRect().mRight - (*mChicletList.begin())->getRect().mLeft;
+
+ return chicklet_width>getRect().getWidth();
+}
+
+
void LLChicletPanel::showScrollButtonsIfNeeded()
{
bool can_scroll_left = canScrollLeft();
@@ -1225,10 +1663,26 @@ void LLChicletPanel::onRightScrollClick()
scrollRight();
}
+void LLChicletPanel::onLeftScrollHeldDown()
+{
+ S32 offset = mScrollingOffset;
+ mScrollingOffset = mScrollingOffset / mScrollRatio;
+ scrollLeft();
+ mScrollingOffset = offset;
+}
+
+void LLChicletPanel::onRightScrollHeldDown()
+{
+ S32 offset = mScrollingOffset;
+ mScrollingOffset = mScrollingOffset / mScrollRatio;
+ scrollRight();
+ mScrollingOffset = offset;
+}
+
boost::signals2::connection LLChicletPanel::setChicletClickedCallback(
const commit_callback_t& cb)
{
- return mCommitSignal.connect(cb);
+ return setCommitCallback(cb);
}
BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks)
@@ -1263,160 +1717,34 @@ bool LLChicletPanel::isAnyIMFloaterDoked()
return res;
}
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-// *TODO Vadim: Move this out of llchiclet.cpp.
-
-LLTalkButton::Params::Params()
- : speak_button("speak_button")
- , show_button("show_button")
- , monitor("monitor")
-{
- // *TODO Vadim: move hardcoded labels (!) and other params to XUI.
- speak_button.name("left");
- speak_button.label("Speak");
- speak_button.label_selected("Speak");
- speak_button.font(LLFontGL::getFontSansSerifSmall());
- speak_button.tab_stop(false);
- speak_button.is_toggle(true);
- speak_button.picture_style(true);
- // Use default button art. JC
- //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected"));
- //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off"));
-
- show_button.name("right");
- show_button.label(LLStringUtil::null);
- show_button.rect(LLRect(0, 0, 20, 0));
- show_button.tab_stop(false);
- show_button.is_toggle(true);
- show_button.picture_style(true);
- show_button.image_selected(LLUI::getUIImage("ComboButton_Selected"));
- show_button.image_unselected(LLUI::getUIImage("ComboButton_Off"));
-
- monitor.name("monitor");
- // *TODO: Make this data driven.
- monitor.rect(LLRect(0, 18, 18, 0));
-}
-
-LLTalkButton::LLTalkButton(const Params& p)
-: LLUICtrl(p)
-, mPrivateCallPanel(NULL)
-, mOutputMonitor(NULL)
-, mSpeakBtn(NULL)
-, mShowBtn(NULL)
+S32 LLChicletPanel::getTotalUnreadIMCount()
{
- LLRect rect = p.rect();
- LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0);
- LLRect show_rect = p.show_button.rect();
- show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0);
-
- speak_rect.mRight -= show_rect.getWidth();
- show_rect.mLeft = speak_rect.getWidth();
- show_rect.mRight = rect.getWidth();
-
- LLButton::Params speak_params = p.speak_button;
- speak_params.rect(speak_rect);
- mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params);
- addChild(mSpeakBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn);
-
- mSpeakBtn->setClickedCallback(boost::bind(&LLTalkButton::onClick_SpeakBtn, this));
- mSpeakBtn->setToggleState(FALSE);
-
- LLButton::Params show_params = p.show_button;
- show_params.rect(show_rect);
- mShowBtn = LLUICtrlFactory::create<LLButton>(show_params);
- addChild(mShowBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
-
- mShowBtn->setClickedCallback(boost::bind(&LLTalkButton::onClick_ShowBtn, this));
- mShowBtn->setToggleState(FALSE);
-
- static const S32 MONITOR_RIGHT_PAD = 2;
-
- LLRect monitor_rect = p.monitor.rect();
- S32 monitor_height = monitor_rect.getHeight();
- monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2);
- monitor_rect.mTop = monitor_rect.mBottom + monitor_height;
-
- LLOutputMonitorCtrl::Params monitor_params = p.monitor;
- monitor_params.draw_border(false);
- monitor_params.rect(monitor_rect);
- monitor_params.auto_update(true);
- monitor_params.speaker_id(gAgentID);
- mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params);
- mSpeakBtn->addChild(mOutputMonitor);
-
- // never show "muted" because you can't mute yourself
- mOutputMonitor->setIsMuted(false);
-}
-
-LLTalkButton::~LLTalkButton()
-{
-}
-
-void LLTalkButton::setSpeakBtnToggleState(bool state)
-{
- mSpeakBtn->setToggleState(state);
-}
-
-void LLTalkButton::onClick_SpeakBtn()
-{
- bool speaking = mSpeakBtn->getToggleState();
- gVoiceClient->setUserPTTState(speaking);
-}
-
-void LLTalkButton::onClick_ShowBtn()
-{
- if(!mShowBtn->getToggleState())
+ S32 count = 0;
+ chiclet_list_t::const_iterator it = mChicletList.begin();
+ for( ; mChicletList.end() != it; ++it)
{
- mPrivateCallPanel->onClickClose(mPrivateCallPanel);
- delete mPrivateCallPanel;
- mPrivateCallPanel = NULL;
- mShowBtn->setToggleState(FALSE);
- return;
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
+ {
+ count += chiclet->getCounter();
+ }
}
-
- S32 x = mSpeakBtn->getRect().mLeft;
- S32 y = 0;
-
- localPointToScreen(x, y, &x, &y);
-
- mPrivateCallPanel = new LLVoiceControlPanel;
- getRootView()->addChild(mPrivateCallPanel);
-
- y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight();
-
- LLRect rect;
- rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight());
- mPrivateCallPanel->setRect(rect);
-
-
- LLAvatarListItem* item = new LLAvatarListItem();
- item->showLastInteractionTime(false);
- item->showInfoBtn(true);
- item->showSpeakingIndicator(true);
- item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE);
-
- mPrivateCallPanel->addItem(item);
- mPrivateCallPanel->setVisible(TRUE);
- mPrivateCallPanel->setFrontmost(TRUE);
-
- mShowBtn->setToggleState(TRUE);
+ return count;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+LLChicletNotificationCounterCtrl::Params::Params()
+: max_displayed_count("max_displayed_count", 99)
+{
+}
LLChicletNotificationCounterCtrl::LLChicletNotificationCounterCtrl(const Params& p)
: LLTextBox(p)
, mCounter(0)
, mInitialWidth(0)
+ , mMaxDisplayedCount(p.max_displayed_count)
{
mInitialWidth = getRect().getWidth();
}
@@ -1425,11 +1753,21 @@ void LLChicletNotificationCounterCtrl::setCounter(S32 counter)
{
mCounter = counter;
- std::stringstream stream;
- stream << getCounter();
+ // note same code in LLSysWellChiclet::setCounter(S32 counter)
+ std::string s_count;
+ if(counter != 0)
+ {
+ static std::string more_messages_exist("+");
+ std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
+ s_count = llformat("%d%s"
+ , llmin(counter, mMaxDisplayedCount)
+ , more_messages.c_str()
+ );
+ }
+
if(mCounter != 0)
{
- setText(stream.str());
+ setText(s_count);
}
else
{
@@ -1440,7 +1778,7 @@ void LLChicletNotificationCounterCtrl::setCounter(S32 counter)
LLRect LLChicletNotificationCounterCtrl::getRequiredRect()
{
LLRect rc;
- S32 text_width = getContentsRect().getWidth();
+ S32 text_width = getTextPixelWidth();
rc.mRight = rc.mLeft + llmax(text_width, mInitialWidth);
@@ -1475,6 +1813,7 @@ LLChicletGroupIconCtrl::LLChicletGroupIconCtrl(const Params& p)
: LLIconCtrl(p)
, mDefaultIcon(p.default_icon)
{
+ setValue(LLUUID::null);
}
void LLChicletGroupIconCtrl::setValue(const LLSD& value )
@@ -1493,7 +1832,141 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value )
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+LLChicletInvOfferIconCtrl::LLChicletInvOfferIconCtrl(const Params& p)
+: LLChicletAvatarIconCtrl(p)
+ , mDefaultIcon(p.default_icon)
+{
+}
+
+void LLChicletInvOfferIconCtrl::setValue(const LLSD& value )
+{
+ if(value.asUUID().isNull())
+ {
+ LLIconCtrl::setValue(mDefaultIcon);
+ }
+ else
+ {
+ LLChicletAvatarIconCtrl::setValue(value);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
- : LLIconCtrl(p)
+ : LLOutputMonitorCtrl(p)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptChiclet::Params::Params()
+ : icon("icon")
+ , chiclet_button("chiclet_button")
+ , new_message_icon("new_message_icon")
+{
+}
+
+LLScriptChiclet::LLScriptChiclet(const Params&p)
+ : LLIMChiclet(p)
+ , mChicletIconCtrl(NULL)
+{
+ LLButton::Params button_params = p.chiclet_button;
+ mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
+ addChild(mChicletButton);
+
+ LLIconCtrl::Params new_msg_params = p.new_message_icon;
+ mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);
+ addChild(mNewMessagesIcon);
+
+ LLIconCtrl::Params icon_params = p.icon;
+ mChicletIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mChicletIconCtrl);
+
+ sendChildToFront(mNewMessagesIcon);
+}
+
+void LLScriptChiclet::setSessionId(const LLUUID& session_id)
+{
+ setShowNewMessagesIcon( getSessionId() != session_id );
+
+ LLIMChiclet::setSessionId(session_id);
+
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
+}
+
+void LLScriptChiclet::setCounter(S32 counter)
{
+ setShowNewMessagesIcon( counter > 0 );
}
+
+void LLScriptChiclet::onMouseDown()
+{
+ LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+static const std::string INVENTORY_USER_OFFER ("UserGiveItem");
+
+LLInvOfferChiclet::Params::Params()
+ : icon("icon")
+ , chiclet_button("chiclet_button")
+ , new_message_icon("new_message_icon")
+{
+}
+
+LLInvOfferChiclet::LLInvOfferChiclet(const Params&p)
+ : LLIMChiclet(p)
+ , mChicletIconCtrl(NULL)
+{
+ LLButton::Params button_params = p.chiclet_button;
+ mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
+ addChild(mChicletButton);
+
+ LLIconCtrl::Params new_msg_params = p.new_message_icon;
+ mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(new_msg_params);
+ addChild(mNewMessagesIcon);
+
+ LLChicletInvOfferIconCtrl::Params icon_params = p.icon;
+ mChicletIconCtrl = LLUICtrlFactory::create<LLChicletInvOfferIconCtrl>(icon_params);
+ addChild(mChicletIconCtrl);
+
+ sendChildToFront(mNewMessagesIcon);
+}
+
+void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
+{
+ setShowNewMessagesIcon( getSessionId() != session_id );
+
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
+
+ LLIMChiclet::setSessionId(session_id);
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(session_id);
+
+ if ( notification && notification->getName() == INVENTORY_USER_OFFER )
+ {
+ mChicletIconCtrl->setValue(notification->getPayload()["from_id"]);
+ }
+ else
+ {
+ mChicletIconCtrl->setValue(LLUUID::null);
+ }
+}
+
+void LLInvOfferChiclet::setCounter(S32 counter)
+{
+ setShowNewMessagesIcon( counter > 0 );
+}
+
+void LLInvOfferChiclet::onMouseDown()
+{
+ LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId());
+}
+
+// EOF
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index d1153a075d..ba17c5970e 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -1,34 +1,34 @@
/**
-* @file llchiclet.h
-* @brief LLChiclet class header file
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-*
-* Copyright (c) 2002-2009, Linden Research, Inc.
-*
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab. Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-*
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-*
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-*
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.h
+ * @brief LLChiclet class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
#ifndef LL_LLCHICLET_H
#define LL_LLCHICLET_H
@@ -39,48 +39,55 @@
#include "lltextbox.h"
#include "lloutputmonitorctrl.h"
#include "llgroupmgr.h"
+#include "llimview.h"
-class LLVoiceControlPanel;
class LLMenuGL;
class LLIMFloater;
-/*
+/**
* Class for displaying amount of messages/notifications(unread).
-*/
+ */
class LLChicletNotificationCounterCtrl : public LLTextBox
{
public:
struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
{
- Params()
- {};
+ /**
+ * Contains maximum displayed count of unread messages. Default value is 9.
+ *
+ * If count is less than "max_unread_count" will be displayed as is.
+ * Otherwise 9+ will be shown (for default value).
+ */
+ Optional<S32> max_displayed_count;
+
+ Params();
};
- /*
+ /**
* Sets number of notifications
- */
+ */
virtual void setCounter(S32 counter);
- /*
+ /**
* Returns number of notifications
- */
+ */
virtual S32 getCounter() const { return mCounter; }
- /*
+ /**
* Returns width, required to display amount of notifications in text form.
* Width is the only valid value.
- */
+ */
/*virtual*/ LLRect getRequiredRect();
- /*
+ /**
* Sets number of notifications using LLSD
- */
+ */
/*virtual*/ void setValue(const LLSD& value);
- /*
+ /**
* Returns number of notifications wrapped in LLSD
- */
+ */
/*virtual*/ LLSD getValue() const;
protected:
@@ -92,11 +99,12 @@ private:
S32 mCounter;
S32 mInitialWidth;
+ S32 mMaxDisplayedCount;
};
-/*
+/**
* Class for displaying avatar's icon in P2P chiclet.
-*/
+ */
class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl
{
public:
@@ -107,6 +115,7 @@ public:
{
draw_tooltip(FALSE);
mouse_opaque(FALSE);
+ default_icon_name("Generic_Person");
};
};
@@ -128,7 +137,7 @@ public:
Optional<std::string> default_icon;
Params()
- : default_icon("default_icon", "default_land_picture.j2c")
+ : default_icon("default_icon", "Generic_Group")
{
};
};
@@ -146,14 +155,47 @@ protected:
std::string mDefaultIcon;
};
-/*
- * Class for displaying status of Voice Chat
-*/
-class LLChicletSpeakerCtrl : public LLIconCtrl
+/**
+ * Class for displaying icon in inventory offer chiclet.
+ */
+class LLChicletInvOfferIconCtrl : public LLChicletAvatarIconCtrl
{
public:
- struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
+ struct Params :
+ public LLInitParam::Block<Params, LLChicletAvatarIconCtrl::Params>
+ {
+ Optional<std::string> default_icon;
+
+ Params()
+ : default_icon("default_icon", "Generic_Object_Small")
+ {
+ avatar_id = LLUUID::null;
+ };
+ };
+
+ /**
+ * Sets icon, if value is LLUUID::null - default icon will be set.
+ */
+ virtual void setValue(const LLSD& value );
+
+protected:
+
+ LLChicletInvOfferIconCtrl(const Params& p);
+ friend class LLUICtrlFactory;
+
+private:
+ std::string mDefaultIcon;
+};
+
+/**
+ * Class for displaying of speaker's voice indicator
+ */
+class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params>
{
Params(){};
};
@@ -163,7 +205,7 @@ protected:
friend class LLUICtrlFactory;
};
-/*
+/**
* Base class for all chiclets.
*/
class LLChiclet : public LLUICtrl
@@ -172,66 +214,67 @@ public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<bool> show_counter;
+ Optional<bool> show_counter,
+ enable_counter;
Params();
};
/*virtual*/ ~LLChiclet();
- /*
+ /**
* Associates chat session id with chiclet.
- */
+ */
virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }
- /*
+ /**
* Returns associated chat session.
- */
+ */
virtual const LLUUID& getSessionId() const { return mSessionId; }
- /*
+ /**
* Sets number of unread notifications.
- */
+ */
virtual void setCounter(S32 counter) = 0;
- /*
+ /**
* Returns number of unread notifications.
- */
+ */
virtual S32 getCounter() = 0;
- /*
+ /**
* Sets show counter state.
- */
+ */
virtual void setShowCounter(bool show) { mShowCounter = show; }
- /*
+ /**
* Returns show counter state.
- */
+ */
virtual bool getShowCounter() {return mShowCounter;};
- /*
+ /**
* Connects chiclet clicked event with callback.
- */
+ */
/*virtual*/ boost::signals2::connection setLeftButtonClickCallback(
const commit_callback_t& cb);
typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)>
chiclet_size_changed_callback_t;
- /*
+ /**
* Connects chiclets size changed event with callback.
- */
+ */
virtual boost::signals2::connection setChicletSizeChangedCallback(
const chiclet_size_changed_callback_t& cb);
- /*
+ /**
* Sets IM Session id using LLSD
- */
+ */
/*virtual*/ LLSD getValue() const;
- /*
+ /**
* Returns IM Session id using LLSD
- */
+ */
/*virtual*/ void setValue(const LLSD& value);
protected:
@@ -239,14 +282,14 @@ protected:
friend class LLUICtrlFactory;
LLChiclet(const Params& p);
- /*
+ /**
* Notifies subscribers about click on chiclet.
- */
+ */
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- /*
+ /**
* Notifies subscribers about chiclet size changed event.
- */
+ */
virtual void onChicletSizeChanged();
private:
@@ -262,13 +305,11 @@ private:
};
-/*
-* Base class for Instant Message chiclets.
-* IMChiclet displays icon, number of unread messages(optional)
-* and voice chat status(optional).
-* Every chiclet should override LLUICtrl::getRequiredRect and return
-* desired width.
-*/
+/**
+ * Base class for Instant Message chiclets.
+ * IMChiclet displays icon, number of unread messages(optional)
+ * and voice chat status(optional).
+ */
class LLIMChiclet : public LLChiclet
{
public:
@@ -278,39 +319,91 @@ public:
TYPE_GROUP,
TYPE_AD_HOC
};
+ struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
+ {
+ Params(){}
+ };
+
- /*virtual*/ ~LLIMChiclet() {};
+ virtual ~LLIMChiclet() {};
- /*
+ /**
+ * It is used for default setting up of chicklet:click handler, etc.
+ */
+ BOOL postBuild();
+ /**
* Sets IM session name. This name will be displayed in chiclet tooltip.
- */
+ */
virtual void setIMSessionName(const std::string& name) { setToolTip(name); }
- /*
+ /**
* Sets id of person/group user is chatting with.
* Session id should be set before calling this
- */
+ */
virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; }
- /*
+ /**
* Gets id of person/group user is chatting with.
*/
virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
- /*
- * Shows/hides voice chat status control.
- */
- virtual void setShowSpeaker(bool show) { mShowSpeaker = show; }
+ /**
+ * Init Speaker Control with speaker's ID
+ */
+ virtual void initSpeakerControl();
- /*
+ /**
+ * set status (Shows/Hide) for voice control.
+ */
+ virtual void setShowSpeaker(bool show);
+
+ /**
* Returns voice chat status control visibility.
- */
+ */
virtual bool getShowSpeaker() {return mShowSpeaker;};
- /*
- * Draws border around chiclet.
+ /**
+ * Shows/Hides for voice control for a chiclet.
+ */
+ virtual void toggleSpeakerControl();
+
+ /**
+ * Sets number of unread messages. Will update chiclet's width if number text
+ * exceeds size of counter and notify it's parent about size change.
*/
- /*virtual*/ void draw();
+ virtual void setCounter(S32);
+
+ /**
+ * Enables/disables the counter control for a chiclet.
+ */
+ virtual void enableCounterControl(bool enable);
+
+ /**
+ * Sets show counter state.
+ */
+ virtual void setShowCounter(bool show);
+
+ /**
+ * Shows/Hides for counter control for a chiclet.
+ */
+ virtual void toggleCounterControl();
+
+ /**
+ * Sets required width for a chiclet according to visible controls.
+ */
+ virtual void setRequiredWidth();
+
+ /**
+ * Shows/hides overlay icon concerning new unread messages.
+ */
+ virtual void setShowNewMessagesIcon(bool show);
+
+ /**
+ * Returns visibility of overlay icon concerning new unread messages.
+ */
+ virtual bool getShowNewMessagesIcon();
+
+ virtual void draw();
/**
* Determine whether given ID refers to a group or an IM chat session.
@@ -331,17 +424,25 @@ public:
* Made public so that it can be triggered from outside
* (more specifically, from the Active IM window).
*/
- void onMouseDown();
+ virtual void onMouseDown();
-protected:
+ virtual void setToggleState(bool toggle);
- LLIMChiclet(const LLChiclet::Params& p);
+protected:
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ LLIMChiclet(const LLIMChiclet::Params& p);
protected:
bool mShowSpeaker;
+ bool mCounterEnabled;
+ /* initial width of chiclet, should not include counter or speaker width */
+ S32 mDefaultWidth;
+
+ LLIconCtrl* mNewMessagesIcon;
+ LLChicletNotificationCounterCtrl* mCounterCtrl;
+ LLChicletSpeakerCtrl* mSpeakerCtrl;
+ LLButton* mChicletButton;
/** the id of another participant, either an avatar id or a group id*/
LLUUID mOtherParticipantId;
@@ -374,14 +475,18 @@ public:
class LLIMP2PChiclet : public LLIMChiclet
{
public:
- struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
{
+ Optional<LLButton::Params> chiclet_button;
+
Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
Optional<LLChicletSpeakerCtrl::Params> speaker;
+ Optional<LLIconCtrl::Params> new_message_icon;
+
Optional<bool> show_speaker;
Params();
@@ -389,55 +494,45 @@ public:
/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
- /*virtual*/ void setShowSpeaker(bool show);
-
- /*
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
+ /**
+ * Init Speaker Control with speaker's ID
+ */
+ /*virtual*/ void initSpeakerControl();
- /*
- * Returns number of unread messages.
- */
+ /**
+ * Returns number of unread messages.
+ */
/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
- /*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
- */
- /*virtual*/ LLRect getRequiredRect();
-
protected:
LLIMP2PChiclet(const Params& p);
friend class LLUICtrlFactory;
- /*
- * Creates chiclet popup menu. Will create P2P or Group IM Chat menu
- * based on other participant's id.
- */
+ /**
+ * Creates chiclet popup menu. Will create P2P or Group IM Chat menu
+ * based on other participant's id.
+ */
virtual void createPopupMenu();
- /*
- * Processes clicks on chiclet popup menu.
- */
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
virtual void onMenuItemClicked(const LLSD& user_data);
- /*
- * Displays popup menu.
- */
+ /**
+ * Displays popup menu.
+ */
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
- /*
- * Enables/disables menus based on relationship with other participant.
- */
+ /**
+ * Enables/disables menus based on relationship with other participant.
+ * Enables/disables "show session" menu item depending on visible IM floater existence.
+ */
virtual void updateMenuItems();
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLChicletNotificationCounterCtrl* mCounterCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
@@ -447,16 +542,22 @@ private:
class LLAdHocChiclet : public LLIMChiclet
{
public:
- struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
{
+ Optional<LLButton::Params> chiclet_button;
+
Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
Optional<LLChicletSpeakerCtrl::Params> speaker;
+ Optional<LLIconCtrl::Params> new_message_icon;
+
Optional<bool> show_speaker;
+ Optional<LLColor4> avatar_icon_color;
+
Params();
};
@@ -466,55 +567,147 @@ public:
*/
/*virtual*/ void setSessionId(const LLUUID& session_id);
- /*
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
+ /**
+ * Keep Speaker Control with actual speaker's ID
+ */
+ /*virtual*/ void draw();
- /*
- * Returns number of unread messages.
- */
- /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+ /**
+ * Init Speaker Control with speaker's ID
+ */
+ /*virtual*/ void initSpeakerControl();
- /*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
- */
- /*virtual*/ LLRect getRequiredRect();
+ /**
+ * Returns number of unread messages.
+ */
+ /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
protected:
LLAdHocChiclet(const Params& p);
friend class LLUICtrlFactory;
- /*
- * Displays popup menu.
- */
+ /**
+ * Creates chiclet popup menu. Will create AdHoc Chat menu
+ * based on other participant's id.
+ */
+ virtual void createPopupMenu();
+
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
+ /**
+ * Displays popup menu.
+ */
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ /**
+ * Finds a current speaker and resets the SpeakerControl with speaker's ID
+ */
+ /*virtual*/ void switchToCurrentSpeaker();
+
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLChicletNotificationCounterCtrl* mCounterCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
/**
+ * Chiclet for script floaters.
+ */
+class LLScriptChiclet : public LLIMChiclet
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
+ {
+ Optional<LLButton::Params> chiclet_button;
+
+ Optional<LLIconCtrl::Params> icon;
+
+ Optional<LLIconCtrl::Params> new_message_icon;
+
+ Params();
+ };
+
+ /*virtual*/ void setSessionId(const LLUUID& session_id);
+
+ /*virtual*/ void setCounter(S32 counter);
+
+ /*virtual*/ S32 getCounter() { return 0; }
+
+ /**
+ * Toggle script floater
+ */
+ /*virtual*/ void onMouseDown();
+
+protected:
+
+ LLScriptChiclet(const Params&);
+ friend class LLUICtrlFactory;
+
+private:
+
+ LLIconCtrl* mChicletIconCtrl;
+};
+
+/**
+ * Chiclet for inventory offer script floaters.
+ */
+class LLInvOfferChiclet: public LLIMChiclet
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
+ {
+ Optional<LLButton::Params> chiclet_button;
+
+ Optional<LLChicletInvOfferIconCtrl::Params> icon;
+
+ Optional<LLIconCtrl::Params> new_message_icon;
+
+ Params();
+ };
+
+ /*virtual*/ void setSessionId(const LLUUID& session_id);
+
+ /*virtual*/ void setCounter(S32 counter);
+
+ /*virtual*/ S32 getCounter() { return 0; }
+
+ /**
+ * Toggle script floater
+ */
+ /*virtual*/ void onMouseDown();
+
+protected:
+ LLInvOfferChiclet(const Params&);
+ friend class LLUICtrlFactory;
+
+private:
+ LLChicletInvOfferIconCtrl* mChicletIconCtrl;
+};
+
+/**
* Implements Group chat chiclet.
*/
class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
{
public:
- struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
{
+ Optional<LLButton::Params> chiclet_button;
+
Optional<LLChicletGroupIconCtrl::Params> group_icon;
Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
Optional<LLChicletSpeakerCtrl::Params> speaker;
+ Optional<LLIconCtrl::Params> new_message_icon;
+
Optional<bool> show_speaker;
Params();
@@ -527,65 +720,69 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
/**
+ * Keep Speaker Control with actual speaker's ID
+ */
+ /*virtual*/ void draw();
+
+ /**
* Callback for LLGroupMgrObserver, we get this when group data is available or changed.
* Sets group icon.
*/
/*virtual*/ void changed(LLGroupChange gc);
- /*virtual*/ void setShowSpeaker(bool show);
-
- /*
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
+ /**
+ * Init Speaker Control with speaker's ID
+ */
+ /*virtual*/ void initSpeakerControl();
- /*
- * Returns number of unread messages.
- */
+ /**
+ * Returns number of unread messages.
+ */
/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
- /*
- * Returns rect, required to display chiclet.
- * Width is the only valid value.
- */
- /*virtual*/ LLRect getRequiredRect();
-
~LLIMGroupChiclet();
protected:
LLIMGroupChiclet(const Params& p);
friend class LLUICtrlFactory;
- /*
- * Creates chiclet popup menu. Will create P2P or Group IM Chat menu
- * based on other participant's id.
- */
+ /**
+ * Finds a current speaker and resets the SpeakerControl with speaker's ID
+ */
+ /*virtual*/ void switchToCurrentSpeaker();
+
+ /**
+ * Creates chiclet popup menu. Will create P2P or Group IM Chat menu
+ * based on other participant's id.
+ */
virtual void createPopupMenu();
- /*
- * Processes clicks on chiclet popup menu.
- */
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
virtual void onMenuItemClicked(const LLSD& user_data);
- /*
- * Displays popup menu.
- */
+ /**
+ * Enables/disables "show session" menu item depending on visible IM floater existence.
+ */
+ virtual void updateMenuItems();
+
+ /**
+ * Displays popup menu.
+ */
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
private:
LLChicletGroupIconCtrl* mChicletIconCtrl;
- LLChicletNotificationCounterCtrl* mCounterCtrl;
- LLChicletSpeakerCtrl* mSpeakerCtrl;
LLMenuGL* mPopupMenu;
};
-/*
+/**
* Implements notification chiclet. Used to display total amount of unread messages
- * across all IM sessions, total amount of system notifications.
-*/
-class LLNotificationChiclet : public LLChiclet
+ * across all IM sessions, total amount of system notifications. See EXT-3147 for details
+ */
+class LLSysWellChiclet : public LLChiclet
{
public:
@@ -595,44 +792,156 @@ public:
Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
+ /**
+ * Contains maximum displayed count of unread messages. Default value is 9.
+ *
+ * If count is less than "max_unread_count" will be displayed as is.
+ * Otherwise 9+ will be shown (for default value).
+ */
+ Optional<S32> max_displayed_count;
+
+ /**
+ * How many time chiclet should flash before set "Lit" state. Default value is 3.
+ */
+ Optional<S32> flash_to_lit_count;
+
+ /**
+ * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5.
+ */
+ Optional<F32> flash_period;
+
Params();
};
/*virtual*/ void setCounter(S32 counter);
- /*virtual*/S32 getCounter() { return mCounterCtrl->getCounter(); }
-
- /*virtual*/ void setShowCounter(bool show);
+ // *TODO: mantipov: seems getCounter is not necessary for LLNotificationChiclet
+ // but inherited interface requires it to implement.
+ // Probably it can be safe removed.
+ /*virtual*/S32 getCounter() { return mCounter; }
boost::signals2::connection setClickCallback(const commit_callback_t& cb);
- /*virtual*/ ~ LLNotificationChiclet();
+ /*virtual*/ ~LLSysWellChiclet();
- // methods for updating a number of unread System or IM notifications
- void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications + mUreadIMNotifications); }
- void decUreadSystemNotifications() { setCounter(--mUreadSystemNotifications + mUreadIMNotifications); }
- void updateUreadIMNotifications();
void setToggleState(BOOL toggled);
+ void setNewMessagesState(bool new_messages);
+ //this method should change a widget according to state of the SysWellWindow
+ virtual void updateWidget(bool is_window_empty);
+
protected:
- // connect counter updaters to the corresponding signals
- void connectCounterUpdatersToSignal(std::string notification_type);
- LLNotificationChiclet(const Params& p);
+ LLSysWellChiclet(const Params& p);
friend class LLUICtrlFactory;
- static S32 mUreadSystemNotifications;
- static S32 mUreadIMNotifications;
+ /**
+ * Change Well 'Lit' state from 'Lit' to 'Unlit' and vice-versa.
+ *
+ * There is an assumption that it will be called 2*N times to do not change its start state.
+ * @see FlashToLitTimer
+ */
+ void changeLitState();
+
+ /**
+ * Displays menu.
+ */
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+ virtual void createMenu() = 0;
protected:
+ class FlashToLitTimer;
LLButton* mButton;
- LLChicletNotificationCounterCtrl* mCounterCtrl;
+ S32 mCounter;
+ S32 mMaxDisplayedCount;
+ bool mIsNewMessagesState;
+
+ FlashToLitTimer* mFlashToLitTimer;
+ LLContextMenu* mContextMenu;
+};
+
+/**
+ * Class represented a chiclet for IM Well Icon.
+ *
+ * It displays a count of unread messages from other participants in all IM sessions.
+ */
+class LLIMWellChiclet : public LLSysWellChiclet, LLIMSessionObserver
+{
+ friend class LLUICtrlFactory;
+public:
+ virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}
+ virtual void sessionRemoved(const LLUUID& session_id) { messageCountChanged(LLSD()); }
+ virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) {}
+
+ ~LLIMWellChiclet();
+protected:
+ LLIMWellChiclet(const Params& p);
+
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
+ /**
+ * Enables chiclet menu items.
+ */
+ bool enableMenuItem(const LLSD& user_data);
+
+ /**
+ * Creates menu.
+ */
+ /*virtual*/ void createMenu();
+
+ /**
+ * Handles changes in a session (message was added, messages were read, etc.)
+ *
+ * It get total count of unread messages from a LLIMMgr in all opened sessions and display it.
+ *
+ * @param[in] session_data contains session related data, is not used now
+ * ["session_id"] - id of an appropriate session
+ * ["participant_unread"] - count of unread messages from "real" participants.
+ *
+ * @see LLIMMgr::getNumberOfUnreadParticipantMessages()
+ */
+ void messageCountChanged(const LLSD& session_data);
+};
+
+class LLNotificationChiclet : public LLSysWellChiclet
+{
+ friend class LLUICtrlFactory;
+protected:
+ LLNotificationChiclet(const Params& p);
+
+ /**
+ * Processes clicks on chiclet menu.
+ */
+ void onMenuItemClicked(const LLSD& user_data);
+
+ /**
+ * Enables chiclet menu items.
+ */
+ bool enableMenuItem(const LLSD& user_data);
+
+ /**
+ * Creates menu.
+ */
+ /*virtual*/ void createMenu();
+
+ // connect counter updaters to the corresponding signals
+ void connectCounterUpdatersToSignal(const std::string& notification_type);
+
+ // methods for updating a number of unread System notifications
+ void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications); }
+ void decUreadSystemNotifications() { setCounter(--mUreadSystemNotifications); }
+ /*virtual*/ void setCounter(S32 counter);
+ S32 mUreadSystemNotifications;
};
-/*
+/**
* Storage class for all IM chiclets. Provides mechanism to display,
* scroll, create, remove chiclets.
-*/
+ */
class LLChicletPanel : public LLPanel
{
public:
@@ -640,10 +949,9 @@ public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
Optional<S32> chiclet_padding,
- scrolling_offset;
-
- Optional<LLButton::Params> left_scroll_button,
- right_scroll_button;
+ scrolling_offset,
+ scroll_button_hpad,
+ scroll_ratio;
Optional<S32> min_width;
@@ -652,62 +960,62 @@ public:
virtual ~LLChicletPanel();
- /*
+ /**
* Creates chiclet and adds it to chiclet list at specified index.
- */
+ */
template<class T> T* createChiclet(const LLUUID& session_id, S32 index);
- /*
+ /**
* Creates chiclet and adds it to chiclet list at right.
- */
+ */
template<class T> T* createChiclet(const LLUUID& session_id);
- /*
+ /**
* Returns pointer to chiclet of specified type at specified index.
- */
+ */
template<class T> T* getChiclet(S32 index);
- /*
+ /**
* Returns pointer to LLChiclet at specified index.
- */
+ */
LLChiclet* getChiclet(S32 index) { return getChiclet<LLChiclet>(index); }
- /*
+ /**
* Searches a chiclet using IM session id.
- */
+ */
template<class T> T* findChiclet(const LLUUID& im_session_id);
- /*
+ /**
* Returns number of hosted chiclets.
- */
+ */
S32 getChicletCount() {return mChicletList.size();};
- /*
+ /**
* Returns index of chiclet in list.
- */
+ */
S32 getChicletIndex(const LLChiclet* chiclet);
- /*
+ /**
* Removes chiclet by index.
- */
+ */
void removeChiclet(S32 index);
- /*
+ /**
* Removes chiclet by pointer.
- */
+ */
void removeChiclet(LLChiclet* chiclet);
- /*
+ /**
* Removes chiclet by IM session id.
- */
+ */
void removeChiclet(const LLUUID& im_session_id);
- /*
+ /**
* Removes all chiclets.
- */
+ */
void removeAll();
- /*
+ /**
* Scrolls the panel to the specified chiclet
*/
void scrollToChiclet(const LLChiclet* chiclet);
@@ -717,103 +1025,139 @@ public:
/*virtual*/ BOOL postBuild();
- /*
+ /**
+ * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
+ */
+ void onCurrentVoiceChannelChanged(const LLUUID& session_id);
+
+ /**
* Reshapes controls and rearranges chiclets if needed.
- */
+ */
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE );
/*virtual*/ void draw();
S32 getMinWidth() const { return mMinWidth; }
+ S32 getTotalUnreadIMCount();
+
+ S32 notifyParent(const LLSD& info);
+
+ /**
+ * Toggle chiclet by session id ON and toggle OFF all other chiclets.
+ */
+ void setChicletToggleState(const LLUUID& session_id, bool toggle);
+
protected:
LLChicletPanel(const Params&p);
friend class LLUICtrlFactory;
- S32 calcChickletPanleWidth();
-
- /*
- * Adds chiclet to list and rearranges all chiclets.
- */
+ /**
+ * Adds chiclet to list and rearranges all chiclets.
+ * They should be right aligned, most recent right. See EXT-1293
+ *
+ * It calculates position of the first chiclet in the list. Other chiclets are placed in arrange().
+ *
+ * @see arrange()
+ */
bool addChiclet(LLChiclet*, S32 index);
- /*
- * Arranges chiclets.
- */
+ /**
+ * Arranges chiclets to have them in correct positions.
+ *
+ * Method bases on assumption that first chiclet has correct rect and starts from the its position.
+ *
+ * @see addChiclet()
+ */
void arrange();
- /*
+ /**
* Returns true if chiclets can be scrolled right.
- */
+ */
bool canScrollRight();
- /*
- * Returns true if chiclets can be scrolled left.
- */
+ /**
+ * Returns true if we need to show scroll buttons
+ */
+ bool needShowScroll();
+
+ /**
+ * Returns true if chiclets can be scrolled left.
+ */
bool canScrollLeft();
- /*
- * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
- */
+ /**
+ * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
+ */
void showScrollButtonsIfNeeded();
- /*
+ /**
* Shifts chiclets left or right.
- */
+ */
void shiftChiclets(S32 offset, S32 start_index = 0);
- /*
+ /**
* Removes gaps between first chiclet and scroll area left side,
* last chiclet and scroll area right side.
- */
+ */
void trimChiclets();
- /*
+ /**
* Scrolls chiclets to right or left.
- */
+ */
void scroll(S32 offset);
- /*
+ /**
* Verifies that chiclets can be scrolled left, then calls scroll()
- */
+ */
void scrollLeft();
- /*
+ /**
* Verifies that chiclets can be scrolled right, then calls scroll()
- */
+ */
void scrollRight();
- /*
+ /**
* Callback for left scroll button clicked
- */
+ */
void onLeftScrollClick();
- /*
- * Callback for right scroll button clicked
- */
+ /**
+ * Callback for right scroll button clicked
+ */
void onRightScrollClick();
- /*
+ /**
+ * Callback for right scroll button held down event
+ */
+ void onLeftScrollHeldDown();
+
+ /**
+ * Callback for left scroll button held down event
+ */
+ void onRightScrollHeldDown();
+
+ /**
* Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft()
- */
+ */
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
- /*
+ /**
* Notifies subscribers about click on chiclet.
* Do not place any code here, instead subscribe on event (see setChicletClickedCallback).
- */
+ */
void onChicletClick(LLUICtrl*ctrl,const LLSD&param);
- /*
+ /**
* Callback for chiclet size changed event, rearranges chiclets.
- */
+ */
void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
typedef std::vector<LLChiclet*> chiclet_list_t;
- /*
+ /**
* Removes chiclet from scroll area and chiclet list.
- */
+ */
void removeChiclet(chiclet_list_t::iterator it);
S32 getChicletPadding() { return mChicletPadding; }
@@ -831,44 +1175,11 @@ protected:
S32 mChicletPadding;
S32 mScrollingOffset;
+ S32 mScrollButtonHPad;
+ S32 mScrollRatio;
S32 mMinWidth;
bool mShowControls;
-};
-
-/*
- * Button displaying voice chat status. Displays voice chat options When clicked.
-*/
-class LLTalkButton : public LLUICtrl
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Optional<LLButton::Params> speak_button,
- show_button;
-
- Optional<LLOutputMonitorCtrl::Params> monitor;
-
- Params();
- };
-
- /*virtual*/ ~LLTalkButton();
-
- void setSpeakBtnToggleState(bool state);
-
-protected:
- friend class LLUICtrlFactory;
- LLTalkButton(const Params& p);
-
- void onClick_SpeakBtn();
-
- void onClick_ShowBtn();
-
-private:
- LLButton* mSpeakBtn;
- LLButton* mShowBtn;
- LLVoiceControlPanel* mPrivateCallPanel;
- LLOutputMonitorCtrl* mOutputMonitor;
+ static const S32 s_scroll_ratio;
};
template<class T>
@@ -917,12 +1228,15 @@ T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)
{
LLChiclet* chiclet = *it;
+ llassert(chiclet);
+ if (!chiclet) continue;
if(chiclet->getSessionId() == im_session_id)
{
T* result = dynamic_cast<T*>(chiclet);
- if(!result && chiclet)
+ if(!result)
{
llwarns << "Found chiclet but of wrong type " << llendl;
+ continue;
}
return result;
}
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 7b75c77a1e..dc6847f236 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -228,7 +228,8 @@ void LLColorSwatchCtrl::draw()
{
if (!mFallbackImageName.empty())
{
- LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE,
+ LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
if( fallback_image->getComponents() == 4 )
{
gl_rect_2d_checkerboard( interior );
@@ -305,6 +306,21 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
}
}
+// This is called when the main floatercustomize panel is closed.
+// Since this class has pointers up to its parents, we need to cleanup
+// this class first in order to avoid a crash.
+void LLColorSwatchCtrl::onParentFloaterClosed()
+{
+ LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
+ if (pickerp)
+ {
+ pickerp->setSwatch(NULL);
+ pickerp->closeFloater();
+ }
+
+ mPickerHandle.markDead();
+}
+
void LLColorSwatchCtrl::setValid(BOOL valid )
{
mValid = valid;
@@ -322,7 +338,7 @@ void LLColorSwatchCtrl::showPicker(BOOL take_focus)
if (!pickerp)
{
pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately);
- gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
+ //gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
mPickerHandle = pickerp->getHandle();
}
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index e3e267f831..4bb7d837cb 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -105,6 +105,7 @@ public:
/*virtual*/ void setEnabled( BOOL enabled );
static void onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE );
+ void onParentFloaterClosed();
protected:
BOOL mValid;
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
new file mode 100644
index 0000000000..91baeaf989
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -0,0 +1,60 @@
+/**
+ * @file llcommanddispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llcommanddispatcherlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llcommanddispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llcommandhandler.h"
+
+LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher* instance */):
+ LLEventAPI("LLCommandDispatcher", "Access to LLCommandHandler commands") /* ,
+ mDispatcher(instance) */
+{
+ add("dispatch",
+ "Execute a command registered as an LLCommandHandler,\n"
+ "passing any required parameters:\n"
+ "[\"cmd\"] string command name\n"
+ "[\"params\"] array of parameters, as if from components of URL path\n"
+ "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
+ "[\"trusted\"] boolean indicating trusted browser [default true]",
+ &LLCommandDispatcherListener::dispatch);
+ add("enumerate",
+ "Post to [\"reply\"] a map of registered LLCommandHandler instances, containing\n"
+ "name key and (e.g.) untrusted flag",
+ &LLCommandDispatcherListener::enumerate,
+ LLSD().with("reply", LLSD()));
+}
+
+void LLCommandDispatcherListener::dispatch(const LLSD& params) const
+{
+ // For most purposes, we expect callers to want to be trusted.
+ bool trusted_browser = true;
+ if (params.has("trusted"))
+ {
+ // But for testing, allow a caller to specify untrusted.
+ trusted_browser = params["trusted"].asBoolean();
+ }
+ LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
+ trusted_browser);
+}
+
+void LLCommandDispatcherListener::enumerate(const LLSD& params) const
+{
+ LLReqID reqID(params);
+ LLSD response(LLCommandDispatcher::enumerate());
+ reqID.stamp(response);
+ LLEventPumps::instance().obtain(params["reply"]).post(response);
+}
diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h
new file mode 100644
index 0000000000..9bcddebcc1
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.h
@@ -0,0 +1,31 @@
+/**
+ * @file llcommanddispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLCommandDispatcher
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H)
+#define LL_LLCOMMANDDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLCommandDispatcher;
+class LLSD;
+
+class LLCommandDispatcherListener: public LLEventAPI
+{
+public:
+ LLCommandDispatcherListener(/* LLCommandDispatcher* instance */); // all static members
+
+private:
+ void dispatch(const LLSD& params) const;
+ void enumerate(const LLSD& params) const;
+
+ //LLCommandDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index af6488388a..dc506a1692 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -34,12 +34,17 @@
#include "llviewerprecompiledheaders.h"
#include "llcommandhandler.h"
+#include "llnotificationsutil.h"
+#include "llcommanddispatcherlistener.h"
+#include "stringize.h"
// system includes
#include <boost/tokenizer.hpp>
#define THROTTLE_PERIOD 15 // required secs between throttled commands
+static LLCommandDispatcherListener sCommandDispatcherListener;
+
//---------------------------------------------------------------------------
// Underlying registry for command handlers, not directly accessible.
//---------------------------------------------------------------------------
@@ -63,6 +68,7 @@ public:
bool trusted_browser);
private:
+ friend LLSD LLCommandDispatcher::enumerate();
std::map<std::string, LLCommandHandlerInfo> mMap;
};
@@ -93,6 +99,8 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LLMediaCtrl* web,
bool trusted_browser)
{
+ static bool slurl_blocked = false;
+ static bool slurl_throttled = false;
static F64 last_throttle_time = 0.0;
F64 cur_time = 0.0;
std::map<std::string, LLCommandHandlerInfo>::iterator it = mMap.find(cmd);
@@ -110,6 +118,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
// block request from external browser, but report as
// "handled" because it was well formatted.
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
+ if (! slurl_blocked)
+ {
+ LLNotificationsUtil::add("BlockedSLURL");
+ slurl_blocked = true;
+ }
return true;
case LLCommandHandler::UNTRUSTED_THROTTLE:
@@ -119,6 +132,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
// block request from external browser if it happened
// within THROTTLE_PERIOD secs of the last command
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
+ if (! slurl_throttled)
+ {
+ LLNotificationsUtil::add("ThrottledSLURL");
+ slurl_throttled = true;
+ }
return true;
}
last_throttle_time = cur_time;
@@ -159,3 +177,56 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,
return LLCommandHandlerRegistry::instance().dispatch(
cmd, params, query_map, web, trusted_browser);
}
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value);
+
+LLSD LLCommandDispatcher::enumerate()
+{
+ LLSD response;
+ LLCommandHandlerRegistry& registry(LLCommandHandlerRegistry::instance());
+ for (std::map<std::string, LLCommandHandlerInfo>::const_iterator chi(registry.mMap.begin()),
+ chend(registry.mMap.end());
+ chi != chend; ++chi)
+ {
+ LLSD info;
+ info["untrusted"] = chi->second.mUntrustedBrowserAccess;
+ info["untrusted_str"] = lookup(chi->second.mUntrustedBrowserAccess);
+ response[chi->first] = info;
+ }
+ return response;
+}
+
+/*------------------------------ lookup stuff ------------------------------*/
+struct symbol_info
+{
+ const char* name;
+ LLCommandHandler::EUntrustedAccess value;
+};
+
+#define ent(SYMBOL) \
+ { \
+ #SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */ \
+ SYMBOL \
+ }
+
+symbol_info symbols[] =
+{
+ ent(LLCommandHandler::UNTRUSTED_ALLOW), // allow commands from untrusted browsers
+ ent(LLCommandHandler::UNTRUSTED_BLOCK), // ignore commands from untrusted browsers
+ ent(LLCommandHandler::UNTRUSTED_THROTTLE) // allow untrusted, but only a few per min.
+};
+
+#undef ent
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value)
+{
+ for (symbol_info *sii(symbols), *siend(symbols + (sizeof(symbols)/sizeof(symbols[0])));
+ sii != siend; ++sii)
+ {
+ if (sii->value == value)
+ {
+ return sii->name;
+ }
+ }
+ return STRINGIZE("UNTRUSTED_" << value);
+}
diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h
index 1bae6d9414..a1d4c880f5 100644
--- a/indra/newview/llcommandhandler.h
+++ b/indra/newview/llcommandhandler.h
@@ -34,6 +34,8 @@
#ifndef LLCOMMANDHANDLER_H
#define LLCOMMANDHANDLER_H
+#include "llsd.h"
+
/* Example: secondlife:///app/foo/<uuid>
Command "foo" that takes one parameter, a UUID.
@@ -103,6 +105,9 @@ public:
// Execute a command registered via the above mechanism,
// passing string parameters.
// Returns true if command was found and executed correctly.
+ /// Return an LLSD::Map of registered LLCommandHandlers and associated
+ /// info (e.g. EUntrustedAccess).
+ static LLSD enumerate();
};
#endif
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 9d3b92d937..a96981a108 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -59,7 +59,7 @@
#include "llbutton.h"
#include "lldir.h"
-#include "llfloaterchat.h"
+#include "llnotificationsutil.h"
#include "llviewerstats.h"
#include "llvfile.h"
#include "lluictrlfactory.h"
@@ -92,7 +92,8 @@ struct LLScriptQueueData
// Default constructor
LLFloaterScriptQueue::LLFloaterScriptQueue(const LLSD& key) :
LLFloater(key),
- mDone(FALSE)
+ mDone(false),
+ mMono(false)
{
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_queue.xml", FALSE);
}
@@ -216,7 +217,7 @@ BOOL LLFloaterScriptQueue::nextObject()
} while((mObjectIDs.count() > 0) && !successful_start);
if(isDone() && !mDone)
{
- mDone = TRUE;
+ mDone = true;
getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("Done"));
childSetEnabled("close",TRUE);
}
@@ -446,14 +447,18 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )
{
- LLChat chat(LLTrans::getString("CompileQueueScriptNotFound"));
- LLFloaterChat::addChat(chat);
+ LLSD args;
+ args["MESSAGE"] = LLTrans::getString("CompileQueueScriptNotFound");
+ LLNotificationsUtil::add("SystemMessage", args);
+
buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mScriptName;
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
- LLChat chat(LLTrans::getString("CompileQueueInsufficientPermDownload"));
- LLFloaterChat::addChat(chat);
+ LLSD args;
+ args["MESSAGE"] = LLTrans::getString("CompileQueueInsufficientPermDownload");
+ LLNotificationsUtil::add("SystemMessage", args);
+
buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mScriptName;
}
else
@@ -480,7 +485,7 @@ void LLFloaterCompileQueue::onSaveTextComplete(const LLUUID& asset_id, void* use
llwarns << "Unable to save text for script." << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("CompileQueueSaveText", args);
+ LLNotificationsUtil::add("CompileQueueSaveText", args);
}
}
@@ -500,7 +505,7 @@ void LLFloaterCompileQueue::onSaveBytecodeComplete(const LLUUID& asset_id, void*
llwarns << "Unable to save bytecode for script." << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("CompileQueueSaveBytecode", args);
+ LLNotificationsUtil::add("CompileQueueSaveBytecode", args);
}
delete data;
data = NULL;
diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h
index 063d573239..2d061f5d8a 100644
--- a/indra/newview/llcompilequeue.h
+++ b/indra/newview/llcompilequeue.h
@@ -104,10 +104,10 @@ protected:
// Object Queue
LLDynamicArray<LLUUID> mObjectIDs;
LLUUID mCurrentObjectID;
- BOOL mDone;
+ bool mDone;
std::string mStartString;
- BOOL mMono;
+ bool mMono;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llconfirmationmanager.cpp b/indra/newview/llconfirmationmanager.cpp
index 5813943ad3..4b73339957 100644
--- a/indra/newview/llconfirmationmanager.cpp
+++ b/indra/newview/llconfirmationmanager.cpp
@@ -37,7 +37,7 @@
#include "lluictrlfactory.h"
// viewer includes
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llstring.h"
#include "llxmlnode.h"
@@ -48,7 +48,7 @@ LLConfirmationManager::ListenerBase::~ListenerBase()
static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
listener->confirmed("");
@@ -61,7 +61,7 @@ static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLCon
static bool onConfirmAlertPassword(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)
{
std::string text = response["message"].asString();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
@@ -83,11 +83,11 @@ void LLConfirmationManager::confirm(Type type,
switch (type)
{
case TYPE_CLICK:
- LLNotifications::instance().add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener));
+ LLNotificationsUtil::add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener));
break;
case TYPE_PASSWORD:
- LLNotifications::instance().add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener));
+ LLNotificationsUtil::add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener));
break;
case TYPE_NONE:
default:
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 979a1a9a60..be6c15eab4 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -35,6 +35,8 @@
#include "lluictrlfactory.h"
#include "lltextbox.h"
#include "lllineeditor.h"
+#include "llviewercontrol.h"
+#include "llversioninfo.h"
#include "llcurrencyuimanager.h"
@@ -74,8 +76,16 @@ public:
bool mUserEnteredCurrencyBuy;
// from website
- bool mSiteCurrencyEstimated;
- S32 mSiteCurrencyEstimatedCost;
+
+ // pre-viewer 2.0, the server returned estimates as an
+ // integer US cents value, e.g., "1000" for $10.00
+ // post-viewer 2.0, the server may also return estimates
+ // as a string with currency embedded, e.g., "10.00 Euros"
+ bool mUSDCurrencyEstimated;
+ S32 mUSDCurrencyEstimatedCost;
+ bool mLocalCurrencyEstimated;
+ std::string mLocalCurrencyEstimatedCost;
+ bool mSupportsInternationalBilling;
std::string mSiteConfirm;
bool mBought;
@@ -99,6 +109,10 @@ public:
void startCurrencyBuy(const std::string& password);
void finishCurrencyBuy();
+
+ void clearEstimate();
+ bool hasEstimate() const;
+ std::string getLocalEstimate() const;
void startTransaction(TransactionType type,
const char* method, LLXMLRPCValue params);
@@ -124,12 +138,12 @@ LLCurrencyUIManager::Impl::Impl(LLPanel& dialog)
mError(false),
mUserCurrencyBuy(2000), // note, this is a default, real value set in llfloaterbuycurrency.cpp
mUserEnteredCurrencyBuy(false),
- mSiteCurrencyEstimated(false),
- mSiteCurrencyEstimatedCost(0),
+ mSupportsInternationalBilling(false),
mBought(false),
mTransactionType(TransactionNone), mTransaction(0),
mCurrencyChanged(false)
{
+ clearEstimate();
}
LLCurrencyUIManager::Impl::~Impl()
@@ -139,14 +153,13 @@ LLCurrencyUIManager::Impl::~Impl()
void LLCurrencyUIManager::Impl::updateCurrencyInfo()
{
- mSiteCurrencyEstimated = false;
- mSiteCurrencyEstimatedCost = 0;
+ clearEstimate();
mBought = false;
mCurrencyChanged = false;
if (mUserCurrencyBuy == 0)
{
- mSiteCurrencyEstimated = true;
+ mLocalCurrencyEstimated = true;
return;
}
@@ -156,6 +169,11 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()
"secureSessionId",
gAgent.getSecureSessionID().asString());
keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
+ keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName"));
+ keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor());
+ keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor());
+ keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch());
+ keywordArgs.appendInt("viewerBuildVersion", LLVersionInfo::getBuild());
LLXMLRPCValue params = LLXMLRPCValue::createArray();
params.append(keywordArgs);
@@ -178,9 +196,22 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo()
}
LLXMLRPCValue currency = result["currency"];
- mSiteCurrencyEstimated = true;
- mSiteCurrencyEstimatedCost = currency["estimatedCost"].asInt();
-
+
+ // old XML-RPC server: estimatedCost = value in US cents
+ mUSDCurrencyEstimated = currency["estimatedCost"].isValid();
+ if (mUSDCurrencyEstimated)
+ {
+ mUSDCurrencyEstimatedCost = currency["estimatedCost"].asInt();
+ }
+
+ // newer XML-RPC server: estimatedLocalCost = local currency string
+ mLocalCurrencyEstimated = currency["estimatedLocalCost"].isValid();
+ if (mLocalCurrencyEstimated)
+ {
+ mLocalCurrencyEstimatedCost = currency["estimatedLocalCost"].asString();
+ mSupportsInternationalBilling = true;
+ }
+
S32 newCurrencyBuy = currency["currencyBuy"].asInt();
if (newCurrencyBuy != mUserCurrencyBuy)
{
@@ -193,27 +224,38 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo()
void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)
{
- mSiteCurrencyEstimated = false;
- mSiteCurrencyEstimatedCost = 0;
- mCurrencyChanged = false;
-
LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
keywordArgs.appendString("agentId", gAgent.getID().asString());
keywordArgs.appendString(
"secureSessionId",
gAgent.getSecureSessionID().asString());
keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
- keywordArgs.appendInt("estimatedCost", mSiteCurrencyEstimatedCost);
+ if (mUSDCurrencyEstimated)
+ {
+ keywordArgs.appendInt("estimatedCost", mUSDCurrencyEstimatedCost);
+ }
+ if (mLocalCurrencyEstimated)
+ {
+ keywordArgs.appendString("estimatedLocalCost", mLocalCurrencyEstimatedCost);
+ }
keywordArgs.appendString("confirm", mSiteConfirm);
if (!password.empty())
{
keywordArgs.appendString("password", password);
}
-
+ keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName"));
+ keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor());
+ keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor());
+ keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch());
+ keywordArgs.appendInt("viewerBuildVersion", LLVersionInfo::getBuild());
+
LLXMLRPCValue params = LLXMLRPCValue::createArray();
params.append(keywordArgs);
startTransaction(TransactionBuy, "buyCurrency", params);
+
+ clearEstimate();
+ mCurrencyChanged = false;
}
void LLCurrencyUIManager::Impl::finishCurrencyBuy()
@@ -258,6 +300,34 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,
clearError();
}
+void LLCurrencyUIManager::Impl::clearEstimate()
+{
+ mUSDCurrencyEstimated = false;
+ mUSDCurrencyEstimatedCost = 0;
+ mLocalCurrencyEstimated = false;
+ mLocalCurrencyEstimatedCost = "0";
+}
+
+bool LLCurrencyUIManager::Impl::hasEstimate() const
+{
+ return (mUSDCurrencyEstimated || mLocalCurrencyEstimated);
+}
+
+std::string LLCurrencyUIManager::Impl::getLocalEstimate() const
+{
+ if (mLocalCurrencyEstimated)
+ {
+ // we have the new-style local currency string
+ return mLocalCurrencyEstimatedCost;
+ }
+ if (mUSDCurrencyEstimated)
+ {
+ // we have the old-style USD-specific value
+ return "US$ " + llformat("%#.2f", mUSDCurrencyEstimatedCost / 100.0);
+ }
+ return "";
+}
+
bool LLCurrencyUIManager::Impl::checkTransaction()
{
if (!mTransaction)
@@ -330,8 +400,8 @@ void LLCurrencyUIManager::Impl::currencyKey(S32 value)
mUserCurrencyBuy = value;
- if (mSiteCurrencyEstimated) {
- mSiteCurrencyEstimated = false;
+ if (hasEstimate()) {
+ clearEstimate();
//cannot just simply refresh the whole UI, as the edit field will
// get reset and the cursor will change...
@@ -356,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare()
LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt");
if (lindenAmount)
{
- lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32);
lindenAmount->setKeystrokeCallback(onCurrencyKey, this);
}
}
@@ -394,8 +464,11 @@ void LLCurrencyUIManager::Impl::updateUI()
}
}
- mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", "US$ " + llformat("%#.2f", mSiteCurrencyEstimatedCost / 100.0));
- mPanel.childSetVisible("currency_est", mSiteCurrencyEstimated && mUserCurrencyBuy > 0);
+ mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", getLocalEstimate());
+ mPanel.childSetVisible("currency_est", hasEstimate() && mUserCurrencyBuy > 0);
+
+ mPanel.childSetVisible("currency_links", mSupportsInternationalBilling);
+ mPanel.childSetVisible("exchange_rate_note", mSupportsInternationalBilling);
if (mPanel.childIsEnabled("buy_btn")
||mPanel.childIsVisible("currency_est")
@@ -436,18 +509,32 @@ void LLCurrencyUIManager::setZeroMessage(const std::string& message)
impl.mZeroMessage = message;
}
-void LLCurrencyUIManager::setEstimate(int amount)
+void LLCurrencyUIManager::setUSDEstimate(int amount)
+{
+ impl.mUSDCurrencyEstimatedCost = amount;
+ impl.mUSDCurrencyEstimated = true;
+ impl.updateUI();
+
+ impl.mCurrencyChanged = false;
+}
+
+int LLCurrencyUIManager::getUSDEstimate()
+{
+ return impl.mUSDCurrencyEstimated ? impl.mUSDCurrencyEstimatedCost : 0;
+}
+
+void LLCurrencyUIManager::setLocalEstimate(const std::string &amount)
{
- impl.mSiteCurrencyEstimatedCost = amount;
- impl.mSiteCurrencyEstimated = true;
+ impl.mLocalCurrencyEstimatedCost = amount;
+ impl.mLocalCurrencyEstimated = true;
impl.updateUI();
impl.mCurrencyChanged = false;
}
-int LLCurrencyUIManager::getEstimate()
+std::string LLCurrencyUIManager::getLocalEstimate() const
{
- return impl.mSiteCurrencyEstimated ? impl.mSiteCurrencyEstimatedCost : 0;
+ return impl.getLocalEstimate();
}
void LLCurrencyUIManager::prepare()
@@ -478,7 +565,7 @@ void LLCurrencyUIManager::buy(const std::string& buy_msg)
LLUIString msg = buy_msg;
msg.setArg("[LINDENS]", llformat("%d", impl.mUserCurrencyBuy));
- msg.setArg("[LOCALAMOUNT]", "US$ " + llformat("%#.2f", impl.mSiteCurrencyEstimatedCost / 100.0));
+ msg.setArg("[LOCALAMOUNT]", getLocalEstimate());
LLConfirmationManager::confirm(impl.mSiteConfirm,
msg,
impl,
@@ -499,7 +586,7 @@ bool LLCurrencyUIManager::canCancel()
bool LLCurrencyUIManager::canBuy()
{
return impl.mTransactionType == Impl::TransactionNone
- && impl.mSiteCurrencyEstimated
+ && impl.hasEstimate()
&& impl.mUserCurrencyBuy > 0;
}
diff --git a/indra/newview/llcurrencyuimanager.h b/indra/newview/llcurrencyuimanager.h
index 93427aed7f..dfe027098d 100644
--- a/indra/newview/llcurrencyuimanager.h
+++ b/indra/newview/llcurrencyuimanager.h
@@ -57,11 +57,16 @@ public:
void setZeroMessage(const std::string& message);
// sets the gray message to show when zero
- void setEstimate(int);
- int getEstimate();
+ void setUSDEstimate(int); // deprecated in 2.0
+ int getUSDEstimate(); // deprecated in 2.0
// the amount in US$ * 100 (in otherwords, in cents)
// use set when you get this information from elsewhere
+ void setLocalEstimate(const std::string &local_est);
+ std::string getLocalEstimate() const;
+ // the estimated cost in the user's local currency
+ // for example, "US$ 10.00" or "10.00 Euros"
+
void prepare();
// call once after dialog is built, from postBuild()
void updateUI(bool show = true);
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 040fad3c4a..abb2fdeb9a 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -37,52 +37,73 @@
#include "lltrans.h"
#include "llui.h"
-static S32 age_days_from_date(const std::string& date_string,
- const LLDate& now)
-{
- // Convert string date to malleable representation
- S32 month, day, year;
- S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year);
- if (matched != 3) return S32_MIN;
-
- // Create ISO-8601 date string
- std::string iso8601_date_string =
- llformat("%04d-%02d-%02dT00:00:00Z", year, month, day);
- LLDate date(iso8601_date_string);
-
- // Correct for the fact that account creation dates are in Pacific time,
- // == UTC - 8
- F64 date_secs_since_epoch = date.secondsSinceEpoch();
- date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+static S32 DAYS_PER_MONTH_NOLEAP[] =
+ { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static S32 DAYS_PER_MONTH_LEAP[] =
+ { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- // Convert seconds from epoch to seconds from now
- F64 now_secs_since_epoch = now.secondsSinceEpoch();
- F64 age_secs = now_secs_since_epoch - date_secs_since_epoch;
-
- // We don't care about sub-day times
- const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0;
- S32 age_days = lltrunc(age_secs / SEC_PER_DAY);
+static S32 days_from_month(S32 year, S32 month)
+{
+ llassert_always(1 <= month);
+ llassert_always(month <= 12);
- return age_days;
+ if (year % 4 == 0
+ && year % 100 != 0)
+ {
+ // leap year
+ return DAYS_PER_MONTH_LEAP[month - 1];
+ }
+ else
+ {
+ return DAYS_PER_MONTH_NOLEAP[month - 1];
+ }
}
std::string LLDateUtil::ageFromDate(const std::string& date_string,
const LLDate& now)
{
- S32 age_days = age_days_from_date(date_string, now);
- if (age_days == S32_MIN) return "???";
+ S32 born_month, born_day, born_year;
+ S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
+ if (matched != 3) return "???";
+ LLDate born_date;
+ born_date.fromYMDHMS(born_year, born_month, born_day);
+ F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch();
+ // Correct for the fact that account creation dates are in Pacific time,
+ // == UTC - 8
+ born_date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+ born_date.secondsSinceEpoch(born_date_secs_since_epoch);
+ // explode out to month/day/year again
+ born_date.split(&born_year, &born_month, &born_day);
+
+ S32 now_year, now_month, now_day;
+ now.split(&now_year, &now_month, &now_day);
+
+ // Do grade-school subtraction, from right-to-left, borrowing from the left
+ // when things go negative
+ S32 age_days = (now_day - born_day);
+ if (age_days < 0)
+ {
+ now_month -= 1;
+ if (now_month == 0)
+ {
+ now_year -= 1;
+ now_month = 12;
+ }
+ age_days += days_from_month(now_year, now_month);
+ }
+ S32 age_months = (now_month - born_month);
+ if (age_months < 0)
+ {
+ now_year -= 1;
+ age_months += 12;
+ }
+ S32 age_years = (now_year - born_year);
// Noun pluralization depends on language
std::string lang = LLUI::getLanguage();
// Try for age in round number of years
LLStringUtil::format_map_t args;
- S32 age_years = age_days / 365;
- age_days = age_days % 365;
- // *NOTE: This is wrong. Not all months have 30 days, but we don't have a library
- // for relative date arithmetic. :-( JC
- S32 age_months = age_days / 30;
- age_days = age_days % 30;
if (age_months > 0 || age_years > 0)
{
diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp
index 29e375c9fa..7814e94dfd 100644
--- a/indra/newview/lldebugmessagebox.cpp
+++ b/indra/newview/lldebugmessagebox.cpp
@@ -124,6 +124,7 @@ LLDebugVarMessageBox::LLDebugVarMessageBox(const std::string& title, EDebugVarTy
LLButton::Params p;
p.name(std::string("Animate"));
+ p.label(std::string("Animate"));
p.rect(LLRect(20, 45, 180, 25));
p.click_callback.function(boost::bind(&LLDebugVarMessageBox::onAnimateClicked, this, _2));
mAnimateButton = LLUICtrlFactory::create<LLButton>(p);
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 24a57cb0c1..169a963d0d 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -45,7 +45,7 @@
#include "llviewerwindow.h"
#include "llappviewer.h"
#include "llmemoryview.h"
-
+#include "llviewertexture.h"
//
// Globals
//
@@ -55,12 +55,16 @@ LLDebugView* gDebugView = NULL;
//
// Methods
//
+static LLDefaultChildRegistry::Register<LLDebugView> r("debug_view");
LLDebugView::LLDebugView(const LLDebugView::Params& p)
: LLView(p)
+{}
+
+void LLDebugView::init()
{
LLRect r;
- LLRect rect(p.rect);
+ LLRect rect = getLocalRect();
r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100);
LLConsole::Params cp;
@@ -75,16 +79,16 @@ LLDebugView::LLDebugView(const LLDebugView::Params& p)
r.set(150 - 25, rect.getHeight() - 50, rect.getWidth()/2 - 25, rect.getHeight() - 450);
- r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f),
- (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f));
+ r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
+ (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
mFastTimerView = new LLFastTimerView(r);
mFastTimerView->setFollowsTop();
mFastTimerView->setFollowsLeft();
mFastTimerView->setVisible(FALSE); // start invisible
addChild(mFastTimerView);
- r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f),
- (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f));
+ r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
+ (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
LLMemoryView::Params mp;
mp.name("memory");
mp.rect(r);
@@ -102,17 +106,29 @@ LLDebugView::LLDebugView(const LLDebugView::Params& p)
gTextureView = LLUICtrlFactory::create<LLTextureView>(tvp);
addChild(gTextureView);
//gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE);
-#if !LL_RELEASE_FOR_DOWNLOAD
- r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100);
- LLTextureSizeView::Params tsvp;
- tsvp.name("gTextureSizeView");
- tsvp.rect(r);
- tsvp.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT);
- tsvp.visible(false);
- gTextureSizeView = LLUICtrlFactory::create<LLTextureSizeView>(tsvp);
- addChild(gTextureSizeView);
-#endif
+ if(gAuditTexture)
+ {
+ r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100);
+ LLTextureSizeView::Params tsv ;
+ tsv.name("gTextureSizeView");
+ tsv.rect(r);
+ tsv.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT);
+ tsv.visible(false);
+ gTextureSizeView = LLUICtrlFactory::create<LLTextureSizeView>(tsv);
+ addChild(gTextureSizeView);
+ gTextureSizeView->setType(LLTextureSizeView::TEXTURE_MEM_OVER_SIZE) ;
+
+ r.set(150, rect.getHeight() - 50, 900 + LLViewerTexture::getTotalNumOfCategories() * 30, 100);
+ LLTextureSizeView::Params tcv ;
+ tcv.name("gTextureCategoryView");
+ tcv.rect(r);
+ tcv.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT);
+ tcv.visible(false);
+ gTextureCategoryView = LLUICtrlFactory::create<LLTextureSizeView>(tcv);
+ gTextureCategoryView->setType(LLTextureSizeView::TEXTURE_MEM_OVER_CATEGORY);
+ addChild(gTextureCategoryView);
+ }
}
@@ -122,5 +138,6 @@ LLDebugView::~LLDebugView()
gDebugView = NULL;
gTextureView = NULL;
gTextureSizeView = NULL;
+ gTextureCategoryView = NULL;
}
diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h
index 9cf2a59a0a..b17cdb43cd 100644
--- a/indra/newview/lldebugview.h
+++ b/indra/newview/lldebugview.h
@@ -60,6 +60,8 @@ public:
LLDebugView(const Params&);
~LLDebugView();
+ void init();
+
void setStatsVisible(BOOL visible);
LLFastTimerView* mFastTimerView;
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index 1af94b3503..ead377deb0 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -33,8 +33,9 @@
#include "llviewerprecompiledheaders.h"
#include "lldelayedgestureerror.h"
+
#include <list>
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llcallbacklist.h"
#include "llinventory.h"
#include "llviewerinventory.h"
@@ -119,7 +120,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
}
- LLNotifications::instance().add(ent.mNotifyName, args);
+ LLNotificationsUtil::add(ent.mNotifyName, args);
return true;
}
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index a720dc46b5..d1abbb0f51 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -61,7 +61,9 @@ LLDirPicker LLDirPicker::sInstance;
//
#if LL_WINDOWS
-LLDirPicker::LLDirPicker()
+LLDirPicker::LLDirPicker() :
+ mFileName(NULL),
+ mLocked(false)
{
}
@@ -125,7 +127,9 @@ std::string LLDirPicker::getDirName()
/////////////////////////////////////////////DARWIN
#elif LL_DARWIN
-LLDirPicker::LLDirPicker()
+LLDirPicker::LLDirPicker() :
+ mFileName(NULL),
+ mLocked(false)
{
reset();
@@ -262,13 +266,15 @@ std::string LLDirPicker::getDirName()
void LLDirPicker::reset()
{
- mLocked = FALSE;
+ mLocked = false;
mDir.clear();
}
#elif LL_LINUX || LL_SOLARIS
-LLDirPicker::LLDirPicker()
+LLDirPicker::LLDirPicker() :
+ mFileName(NULL),
+ mLocked(false)
{
mFilePicker = new LLFilePicker();
reset();
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index 26f76915ae..b48d2c66c4 100644
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -97,7 +97,7 @@ private:
std::string* mFileName;
std::string mDir;
- BOOL mLocked;
+ bool mLocked;
static LLDirPicker sInstance;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 069155c255..9fbc3408d7 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -89,7 +89,7 @@ LLDynamicArrayPtr<LLPointer<LLDrawable> > LLDrawable::sDeadList;
void LLDrawable::incrementVisible()
{
sCurVisible++;
- sCurPixelAngle = (F32) gViewerWindow->getWindowDisplayHeight()/LLViewerCamera::getInstance()->getView();
+ sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
}
void LLDrawable::init()
{
@@ -105,7 +105,7 @@ void LLDrawable::init()
mVObjp = NULL;
// mFaces
mSpatialGroupp = NULL;
- mVisible = 0;
+ mVisible = sCurVisible - 2;//invisible for the current frame and the last frame.
mRadius = 0.f;
mGeneration = -1;
@@ -1049,9 +1049,13 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat
llassert(mDrawable);
llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ LLSpatialPartition *part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert(part);
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->put(this);
+ if (part)
+ {
+ part->put(this);
+ }
}
LLSpatialBridge::~LLSpatialBridge()
@@ -1367,10 +1371,14 @@ BOOL LLSpatialBridge::updateMove()
{
llassert(mDrawable);
llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert(part);
mOctree->balance();
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->move(this, getSpatialGroup(), TRUE);
+ if (part)
+ {
+ part->move(this, getSpatialGroup(), TRUE);
+ }
return TRUE;
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 5a10b688da..651dabff9e 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -44,7 +44,6 @@
#include "llquaternion.h"
#include "xform.h"
#include "llmemtype.h"
-#include "llprimitive.h"
#include "lldarray.h"
#include "llviewerobject.h"
#include "llrect.h"
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index d8c34581d5..95ddacb722 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -279,7 +279,7 @@ S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
iter != face_list.end(); iter++)
{
LLFace *facep = *iter;
- gGL.getTexUnit(stage)->bind(facep->getTexture());
+ gGL.getTexUnit(stage)->bind(facep->getTexture(), TRUE) ;
gGL.getTexUnit(0)->activate();
res += facep->renderIndexed();
}
@@ -475,17 +475,13 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
{
if (params.mTexture.notNull())
{
- gGL.getTexUnit(0)->bind(params.mTexture.get());
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
if (params.mTextureMatrix)
{
glMatrixMode(GL_TEXTURE);
glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
- if(params.mTexture.notNull())//will be removed.
- {
- params.mTexture->addTextureStats(params.mVSize);
- }
}
else
{
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index a5a29dea7b..7be6e82251 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -180,6 +180,7 @@ void LLDrawPoolAlpha::render(S32 pass)
if (LLPipeline::sFastAlpha && !deferred_render)
{
+ LLGLDisable blend_disable(GL_BLEND);
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
if (mVertexShaderLevel > 0)
{
@@ -219,7 +220,7 @@ void LLDrawPoolAlpha::render(S32 pass)
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
glColor4f(1,0,0,1);
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
- gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep) ;
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
}
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 6a2b7fc218..b947943619 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -39,8 +39,6 @@ class LLVOAvatar;
class LLDrawPoolAvatar : public LLFacePool
{
-protected:
- S32 mNumFaces;
public:
enum
{
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index e087feeaec..03a8b108e2 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -144,7 +144,7 @@ void LLStandardBumpmap::restoreGL()
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage =
LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id),
TRUE,
- FALSE,
+ LLViewerTexture::BOOST_NONE,
LLViewerTexture::LOD_TEXTURE,
0,
0);
@@ -1149,14 +1149,14 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
if (!LLPipeline::sRenderDeferred)
{
bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
- bump->createGLTexture(bump->getDiscardLevel(), dst_image);
+ bump->createGLTexture(0, dst_image);
}
else
{
LLPointer<LLImageRaw> nrm_image = new LLImageRaw(src->getWidth(), src->getHeight(), 4);
generateNormalMapFromAlpha(src, nrm_image);
bump->setExplicitFormat(GL_RGBA, GL_RGBA);
- bump->createGLTexture(bump->getDiscardLevel(), nrm_image);
+ bump->createGLTexture(0, nrm_image);
}
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 8428be194f..0f76165053 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -48,8 +48,11 @@
#include "pipeline.h"
#include "llviewershadermgr.h"
-LLDrawPoolSky::LLDrawPoolSky() :
- LLFacePool(POOL_SKY), mShader(NULL)
+LLDrawPoolSky::LLDrawPoolSky()
+: LLFacePool(POOL_SKY),
+
+ mSkyTex(NULL),
+ mShader(NULL)
{
}
@@ -132,6 +135,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
return;
}
+ llassert(mSkyTex);
mSkyTex[side].bindTexture(TRUE);
face.renderIndexed();
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 790e75cfaa..9dc22cddcd 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -72,7 +72,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",
- TRUE, TRUE,
+ TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
GL_ALPHA8, GL_ALPHA,
LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
@@ -81,7 +81,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",
- TRUE, TRUE,
+ TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
GL_ALPHA8, GL_ALPHA,
LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 8d2cbc583c..5521fb05a8 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -253,7 +253,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
LLGLState normalize(GL_NORMALIZE, TRUE);
// Bind the texture for this tree.
- gGL.getTexUnit(sDiffTex)->bind(mTexturep.get());
+ gGL.getTexUnit(sDiffTex)->bind(mTexturep.get(), TRUE);
U32 indices_drawn = 0;
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 21e17cc207..107de934df 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -69,11 +69,11 @@ LLVector3 LLDrawPoolWater::sLightDir;
LLDrawPoolWater::LLDrawPoolWater() :
LLFacePool(POOL_WATER)
{
- mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+ mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
gGL.getTexUnit(0)->bind(mHBTex[0]) ;
mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP);
- mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+ mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
gGL.getTexUnit(0)->bind(mHBTex[1]);
mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h
index 68a8172dd0..614f645243 100644
--- a/indra/newview/lldrawpoolwater.h
+++ b/indra/newview/lldrawpoolwater.h
@@ -47,7 +47,6 @@ protected:
LLPointer<LLViewerTexture> mWaterImagep;
LLPointer<LLViewerTexture> mWaterNormp;
- const LLWaterSurface *mWaterSurface;
public:
static BOOL sSkipScreenCopy;
static BOOL sNeedsReflectionUpdate;
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index c14ca2473b..c7cd77cb65 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -159,15 +159,10 @@ void LLDrawPoolWLSky::renderStars(void) const
// *NOTE: have to have bound the cloud noise texture already since register
// combiners blending below requires something to be bound
// and we might as well only bind once.
- //gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
gPipeline.disableLights();
-
- if (!LLPipeline::sReflectionRender)
- {
- glPointSize(2.f);
- }
-
+
// *NOTE: we divide by two here and GL_ALPHA_SCALE by two below to avoid
// clamping and allow the star_alpha param to brighten the stars.
bool error;
@@ -175,16 +170,20 @@ void LLDrawPoolWLSky::renderStars(void) const
star_alpha.mV[3] = LLWLParamManager::instance()->mCurParams.getFloat("star_brightness", error) / 2.f;
llassert_always(!error);
+ gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
+
+ gGL.pushMatrix();
+ glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
// gl_FragColor.rgb = gl_Color.rgb;
// gl_FragColor.a = gl_Color.a * star_alpha.a;
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_PREV_ALPHA, LLTexUnit::TBS_CONST_ALPHA);
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);
gSky.mVOWLSkyp->drawStars();
- glPointSize(1.f);
-
+ gGL.popMatrix();
+
// and disable the combiner states
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index 7ff760ac39..9059f6382f 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -43,7 +43,7 @@ public:
static const U32 SKY_VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0;
static const U32 STAR_VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_COLOR;
+ LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXCOORD0;
LLDrawPoolWLSky(void);
/*virtual*/ ~LLDrawPoolWLSky();
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 527656ab6b..830e975e8a 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -39,6 +39,7 @@
#include "llvoavatarself.h"
#include "llagent.h"
#include "llwearable.h"
+#include "llagentwearables.h"
//-----------------------------------------------------------------------------
// LLDriverParamInfo
@@ -224,7 +225,6 @@ void LLDriverParam::setAvatar(LLVOAvatar *avatarp)
}
}
*new_param = *this;
- new_param->setIsDummy(FALSE);
return new_param;
}
@@ -243,7 +243,7 @@ BOOL LLDriverParam::parseData(LLXmlTreeNode* node)
}
#endif
-void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
+void LLDriverParam::setWeight(F32 weight, BOOL upload_bake)
{
F32 min_weight = getMinWeight();
F32 max_weight = getMaxWeight();
@@ -302,7 +302,7 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
driven_weight = driven_min;
}
- setDrivenWeight(driven,driven_weight,set_by_user);
+ setDrivenWeight(driven,driven_weight,upload_bake);
continue;
}
else
@@ -326,13 +326,13 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
driven_weight = driven_min;
}
- setDrivenWeight(driven,driven_weight,set_by_user);
+ setDrivenWeight(driven,driven_weight,upload_bake);
continue;
}
}
driven_weight = getDrivenWeight(driven, mCurWeight);
- setDrivenWeight(driven,driven_weight,set_by_user);
+ setDrivenWeight(driven,driven_weight,upload_bake);
}
}
@@ -432,6 +432,12 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
}
}
+ llassert(driven);
+ if (!driven)
+ {
+ return NULL; // shouldn't happen, but...
+ }
+
// We're already in the middle of a param's distortions, so get the next one.
const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
if( (!v) && (iter != mDriven.end()) )
@@ -456,9 +462,9 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
//-----------------------------------------------------------------------------
// setAnimationTarget()
//-----------------------------------------------------------------------------
-void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user )
+void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake )
{
- LLVisualParam::setAnimationTarget(target_value, set_by_user);
+ LLVisualParam::setAnimationTarget(target_value, upload_bake);
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
{
@@ -467,16 +473,16 @@ void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user )
// this isn't normally necessary, as driver params handle interpolation of their driven params
// but texture params need to know to assume their final value at beginning of interpolation
- driven->mParam->setAnimationTarget(driven_weight, set_by_user);
+ driven->mParam->setAnimationTarget(driven_weight, upload_bake);
}
}
//-----------------------------------------------------------------------------
// stopAnimating()
//-----------------------------------------------------------------------------
-void LLDriverParam::stopAnimating(BOOL set_by_user)
+void LLDriverParam::stopAnimating(BOOL upload_bake)
{
- LLVisualParam::stopAnimating(set_by_user);
+ LLVisualParam::stopAnimating(upload_bake);
for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
{
@@ -529,6 +535,38 @@ void LLDriverParam::resetDrivenParams()
mDriven.reserve(getInfo()->mDrivenInfoList.size());
}
+void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type)
+{
+ bool needs_update = (getWearableType()==driven_type);
+
+ // if the driver has a driven entry for the passed-in wearable type, we need to refresh the value
+ for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
+ {
+ LLDrivenEntry* driven = &(*iter);
+ if (driven && driven->mParam && driven->mParam->getCrossWearable() && driven->mParam->getWearableType() == driven_type)
+ {
+ needs_update = true;
+ }
+ }
+
+
+ if (needs_update)
+ {
+ EWearableType driver_type = (EWearableType)getWearableType();
+
+ // If we've gotten here, we've added a new wearable of type "type"
+ // Thus this wearable needs to get updates from the driver wearable.
+ // The call to setVisualParamWeight seems redundant, but is necessary
+ // as the number of driven wearables has changed since the last update. -Nyx
+ LLWearable *wearable = gAgentWearables.getTopWearable(driver_type);
+ if (wearable)
+ {
+ wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false);
+ }
+ }
+}
+
+
//-----------------------------------------------------------------------------
// getDrivenWeight()
//-----------------------------------------------------------------------------
@@ -586,7 +624,7 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight
return driven_weight;
}
-void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user)
+void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)
{
LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
if(mWearablep &&
@@ -594,10 +632,10 @@ void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bo
mWearablep->isOnTop())
{
// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
- avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, set_by_user );
+ avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );
}
else
{
- driven->mParam->setWeight( driven_weight, set_by_user );
+ driven->mParam->setWeight( driven_weight, upload_bake );
}
}
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index 069e71a2cb..e963a2d55a 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -34,6 +34,7 @@
#define LL_LLDRIVERPARAM_H
#include "llviewervisualparam.h"
+#include "llwearabledictionary.h"
class LLVOAvatar;
class LLWearable;
@@ -93,15 +94,16 @@ public:
void setWearable(LLWearable *wearablep);
void setAvatar(LLVOAvatar *avatarp);
+ void updateCrossDrivenParams(EWearableType driven_type);
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex sex ) {} // apply is called separately for each driven param.
- /*virtual*/ void setWeight(F32 weight, BOOL set_by_user);
- /*virtual*/ void setAnimationTarget( F32 target_value, BOOL set_by_user );
- /*virtual*/ void stopAnimating(BOOL set_by_user);
+ /*virtual*/ void setWeight(F32 weight, BOOL upload_bake);
+ /*virtual*/ void setAnimationTarget( F32 target_value, BOOL upload_bake );
+ /*virtual*/ void stopAnimating(BOOL upload_bake);
/*virtual*/ BOOL linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
/*virtual*/ void resetDrivenParams();
@@ -112,9 +114,10 @@ public:
/*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh);
/*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh);
/*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
+
protected:
F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);
- void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user);
+ void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);
LLVector3 mDefaultVec; // temp holder
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index 0bb5edf3f9..c7c79401a0 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -104,7 +104,7 @@ void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum
{
setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);
}
- createGLTexture(0, raw_image);
+ createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX);
setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP);
mGLTexturep->setGLTextureCreated(false);
}
@@ -126,7 +126,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
// force rendering to on-screen portion of frame buffer
LLCoordScreen window_pos;
gViewerWindow->getWindow()->getPosition( &window_pos );
- mOrigin.set(0, gViewerWindow->getWindowDisplayHeight() - mFullHeight); // top left corner
+ mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight); // top left corner
if (window_pos.mX < 0)
{
@@ -141,11 +141,12 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
// Set up camera
- mCamera.setOrigin(*LLViewerCamera::getInstance());
- mCamera.setAxes(*LLViewerCamera::getInstance());
- mCamera.setAspect(LLViewerCamera::getInstance()->getAspect());
- mCamera.setView(LLViewerCamera::getInstance()->getView());
- mCamera.setNear(LLViewerCamera::getInstance()->getNear());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ mCamera.setOrigin(*camera);
+ mCamera.setAxes(*camera);
+ mCamera.setAspect(camera->getAspect());
+ mCamera.setView(camera->getView());
+ mCamera.setNear(camera->getNear());
glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
if (clear_depth)
@@ -174,11 +175,12 @@ void LLViewerDynamicTexture::postRender(BOOL success)
gViewerWindow->setup2DViewport();
// restore camera
- LLViewerCamera::getInstance()->setOrigin(mCamera);
- LLViewerCamera::getInstance()->setAxes(mCamera);
- LLViewerCamera::getInstance()->setAspect(mCamera.getAspect());
- LLViewerCamera::getInstance()->setView(mCamera.getView());
- LLViewerCamera::getInstance()->setNear(mCamera.getNear());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ camera->setOrigin(mCamera);
+ camera->setAxes(mCamera);
+ camera->setAspect(mCamera.getAspect());
+ camera->setView(mCamera.getView());
+ camera->setNear(mCamera.getNear());
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/lleventinfo.cpp b/indra/newview/lleventinfo.cpp
index 9be45d18fb..aabd7ed997 100644
--- a/indra/newview/lleventinfo.cpp
+++ b/indra/newview/lleventinfo.cpp
@@ -33,7 +33,6 @@
#include "llviewerprecompiledheaders.h"
#include "lleventinfo.h"
-#include "llappviewer.h" // for gPacificDaylightTime
#include "lluuid.h"
#include "message.h"
diff --git a/indra/newview/lleventinfo.h b/indra/newview/lleventinfo.h
index 493c659983..4f33a7925a 100644
--- a/indra/newview/lleventinfo.h
+++ b/indra/newview/lleventinfo.h
@@ -43,7 +43,15 @@ class LLMessageSystem;
class LLEventInfo
{
public:
- LLEventInfo() {}
+ LLEventInfo() :
+ mID(0),
+ mDuration(0),
+ mUnixTime(0),
+ mHasCover(FALSE),
+ mCover(0),
+ mEventFlags(0),
+ mSelected(FALSE)
+ {}
void unpack(LLMessageSystem *msg);
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index da20766e7e..f096ba604f 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -34,9 +34,9 @@
#include "lleventnotifier.h"
+#include "llnotificationsutil.h"
#include "message.h"
-#include "llnotify.h"
#include "lleventinfo.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
@@ -81,7 +81,7 @@ void LLEventNotifier::update()
LLSD args;
args["NAME"] = np->getEventName();
args["DATE"] = np->getEventDateStr();
- LLNotifications::instance().add("EventNotification", args, LLSD(),
+ LLNotificationsUtil::add("EventNotification", args, LLSD(),
boost::bind(&LLEventNotification::handleResponse, np, _1, _2));
mEventNotifications.erase(iter++);
}
@@ -174,6 +174,7 @@ void LLEventNotifier::remove(const U32 event_id)
LLEventNotification::LLEventNotification() :
mEventID(0),
+ mEventDate(0),
mEventName("")
{
}
@@ -185,7 +186,7 @@ LLEventNotification::~LLEventNotification()
bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch (option)
{
case 0:
@@ -196,7 +197,7 @@ bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& r
break;
}
case 1:
- LLFloaterReg::showInstance("search", LLSD().insert("category", "events").insert("id", S32(getEventID())));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", S32(getEventID())));
break;
case 2:
break;
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index eca9f8aba2..cc4e1a1868 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -39,7 +39,7 @@
#include "llhttpclient.h"
#include "llhttpstatuscodes.h"
#include "llsdserialize.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "llviewerregion.h"
#include "message.h"
#include "lltrans.h"
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 48b5fc11b7..3818ee6f78 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -48,11 +48,20 @@ public:
mExpanderLabel(more_text)
{}
- /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+ /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
// more label always spans width of text box
- width = mEditor.getTextRect().getWidth();
- height = llceil(mStyle->getFont()->getLineHeight());
+ if (num_chars == 0)
+ {
+ width = 0;
+ height = 0;
+ }
+ else
+ {
+ width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad();
+ height = llceil(mStyle->getFont()->getLineHeight());
+ }
+ return true;
}
/*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const
{
@@ -103,10 +112,11 @@ private:
LLExpandableTextBox::LLTextBoxEx::Params::Params()
: more_label("more_label")
-{}
+{
+}
LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
-: LLTextBox(p),
+: LLTextEditor(p),
mExpanderLabel(p.more_label),
mExpanderVisible(false)
{
@@ -116,24 +126,21 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLTextBox::reshape(width, height, called_from_parent);
+ hideExpandText();
+ LLTextEditor::reshape(width, height, called_from_parent);
if (getTextPixelHeight() > getRect().getHeight())
{
showExpandText();
}
- else
- {
- hideExpandText();
- }
}
-void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text)
+void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
{
// LLTextBox::setText will obliterate the expander segment, so make sure
// we generate it again by clearing mExpanderVisible
mExpanderVisible = false;
- LLTextBox::setText(text);
+ LLTextEditor::setText(text, input_params);
// text contents have changed, segments are cleared out
// so hide the expander and determine if we need it
@@ -153,12 +160,16 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText()
{
if (!mExpanderVisible)
{
+ // make sure we're scrolled to top when collapsing
+ if (mScroller)
+ {
+ mScroller->goToTop();
+ }
// get fully visible lines
std::pair<S32, S32> visible_lines = getVisibleLines(true);
S32 last_line = visible_lines.second - 1;
- LLStyle::Params expander_style = getDefaultStyle();
- expander_style.font.name.setIfNotProvided(LLFontGL::nameFromFont(expander_style.font));
+ LLStyle::Params expander_style(getDefaultStyleParams());
expander_style.font.style = "UNDERLINE";
expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this);
@@ -174,8 +185,8 @@ void LLExpandableTextBox::LLTextBoxEx::hideExpandText()
if (mExpanderVisible)
{
// this will overwrite the expander segment and all text styling with a single style
- LLNormalTextSegment* segmentp = new LLNormalTextSegment(
- new LLStyle(getDefaultStyle()), 0, getLength() + 1, *this);
+ LLStyleConstSP sp(new LLStyle(getDefaultStyleParams()));
+ LLNormalTextSegment* segmentp = new LLNormalTextSegment(sp, 0, getLength() + 1, *this);
insertSegment(segmentp);
mExpanderVisible = false;
@@ -190,6 +201,11 @@ S32 LLExpandableTextBox::LLTextBoxEx::getVerticalTextDelta()
return text_height - textbox_height;
}
+S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight()
+{
+ return getTextBoundingRect().getHeight();
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -310,8 +326,16 @@ void LLExpandableTextBox::expandTextBox()
// hide "more" link, and show full text contents
mTextBox->hideExpandText();
+ // *HACK dz
+ // hideExpandText brakes text styles (replaces hyper-links with plain text), see ticket EXT-3290
+ // Set text again to make text box re-apply styles.
+ // *TODO Find proper solution to fix this issue.
+ // Maybe add removeSegment to LLTextBase
+ mTextBox->setTextBase(mText);
+
S32 text_delta = mTextBox->getVerticalTextDelta();
- text_delta += mTextBox->getVPad() * 2 + mScroll->getBorderWidth() * 2;
+ text_delta += mTextBox->getVPad() * 2;
+ text_delta += mScroll->getBorderWidth() * 2;
// no need to expand
if(text_delta <= 0)
{
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index d45527aabb..58316ddb98 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -33,7 +33,7 @@
#ifndef LL_LLEXPANDABLETEXTBOX_H
#define LL_LLEXPANDABLETEXTBOX_H
-#include "lltextbox.h"
+#include "lltexteditor.h"
#include "llscrollcontainer.h"
/**
@@ -49,10 +49,10 @@ protected:
* Extended text box. "More" link will appear at end of text if
* text is too long to fit into text box size.
*/
- class LLTextBoxEx : public LLTextBox
+ class LLTextBoxEx : public LLTextEditor
{
public:
- struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
+ struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
{
Mandatory<std::string> more_label;
Params();
@@ -60,7 +60,8 @@ protected:
// adds or removes "More" link as needed
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- /*virtual*/ void setText(const LLStringExplicit& text);
+ /*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());
+ void setTextBase(const std::string& text) { LLTextBase::setText(text); }
/**
* Returns difference between text box height and text height.
@@ -69,14 +70,9 @@ protected:
virtual S32 getVerticalTextDelta();
/**
- * Returns text vertical padding
+ * Returns the height of text rect.
*/
- virtual S32 getVPad() { return mVPad; }
-
- /**
- * Returns text horizontal padding
- */
- virtual S32 getHPad() { return mHPad; }
+ S32 getTextPixelHeight();
/**
* Shows "More" link
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 09b3ce1e86..80acc71a41 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -52,6 +52,7 @@
#include "llvovolume.h"
#include "pipeline.h"
#include "llviewerregion.h"
+#include "llviewerwindow.h"
#define LL_MAX_INDICES_COUNT 1000000
@@ -156,6 +157,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mGeomIndex = 0;
mIndicesCount = 0;
mIndicesIndex = 0;
+ mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
@@ -175,8 +177,12 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mLastIndicesCount = mIndicesCount;
mLastIndicesIndex = mIndicesIndex;
+ mImportanceToCamera = 0.f ;
+ mBoundingSphereRadius = 0.0f ;
+
mAtlasInfop = NULL ;
mUsingAtlas = FALSE ;
+ mHasMedia = FALSE ;
}
@@ -186,6 +192,7 @@ void LLFace::destroy()
{
mTexture->removeFace(this) ;
}
+
if (mDrawPoolp)
{
mDrawPoolp->removeFace(this);
@@ -207,7 +214,7 @@ void LLFace::destroy()
}
}
}
-
+
setDrawInfo(NULL);
removeAtlas();
@@ -256,6 +263,7 @@ void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
}
mDrawPoolp = new_pool;
}
+
setTexture(texturep) ;
}
@@ -294,7 +302,8 @@ void LLFace::switchTexture(LLViewerTexture* new_texture)
if(!new_texture)
{
- llerrs << "Can not switch to a null texture." << llendl ;
+ llerrs << "Can not switch to a null texture." << llendl;
+ return;
}
new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ;
@@ -515,8 +524,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
/* removed in lieu of raycast uv detection
void LLFace::renderSelectedUV()
{
- LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, TRUE);
- LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, TRUE);
+ LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLViewerTexture::BOOST_UI);
+ LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLViewerTexture::BOOST_UI);
LLGLSUVSelect object_select;
@@ -750,7 +759,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
}
mCenterLocal = (newMin+newMax)*0.5f;
-
+ LLVector3 tmp = (newMin - newMax) ;
+ mBoundingSphereRadius = tmp.length() * 0.5f ;
+
updateCenterAgent();
}
@@ -1031,17 +1042,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_color)
{
- GLfloat alpha[4] =
- {
- 0.00f,
- 0.25f,
- 0.5f,
- 0.75f
- };
-
- if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ if (tep)
{
- color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ GLfloat alpha[4] =
+ {
+ 0.00f,
+ 0.25f,
+ 0.5f,
+ 0.75f
+ };
+
+ if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ {
+ color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ }
}
}
@@ -1314,6 +1328,193 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
return TRUE;
}
+//check if the face has a media
+BOOL LLFace::hasMedia() const
+{
+ if(mHasMedia)
+ {
+ return TRUE ;
+ }
+ if(mTexture.notNull())
+ {
+ return mTexture->hasParcelMedia() ; //if has a parcel media
+ }
+
+ return FALSE ; //no media.
+}
+
+const F32 LEAST_IMPORTANCE = 0.05f ;
+const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
+
+F32 LLFace::getTextureVirtualSize()
+{
+ F32 radius;
+ F32 cos_angle_to_view_dir;
+ BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
+
+ if (mPixelArea < 0.0001f || !in_frustum)
+ {
+ setVirtualSize(0.f) ;
+ return 0.f;
+ }
+
+ //get area of circle in texture space
+ LLVector2 tdim = mTexExtents[1] - mTexExtents[0];
+ F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f;
+ if (texel_area <= 0)
+ {
+ // Probably animated, use default
+ texel_area = 1.f;
+ }
+
+ //apply texel area to face area to get accurate ratio
+ //face_area /= llclamp(texel_area, 1.f/64.f, 16.f);
+ F32 face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f);
+
+ if(face_area > LLViewerTexture::sMaxSmallImageSize)
+ {
+ if(mImportanceToCamera < LEAST_IMPORTANCE) //if the face is not important, do not load hi-res.
+ {
+ static const F32 MAX_LEAST_IMPORTANCE_IMAGE_SIZE = 128.0f * 128.0f ;
+ face_area = llmin(face_area * 0.5f, MAX_LEAST_IMPORTANCE_IMAGE_SIZE) ;
+ }
+ else if(face_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping.
+ {
+ if(mImportanceToCamera < LEAST_IMPORTANCE_FOR_LARGE_IMAGE)//if the face is not important, do not load hi-res.
+ {
+ face_area = LLViewerTexture::sMinLargeImageSize ;
+ }
+ else if(mTexture.notNull() && mTexture->isLargeImage())
+ {
+ face_area *= adjustPartialOverlapPixelArea(cos_angle_to_view_dir, radius );
+ }
+ }
+ }
+
+ setVirtualSize(face_area) ;
+
+ return face_area;
+}
+
+BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
+{
+ //get area of circle around face
+ LLVector3 center = getPositionAgent();
+ LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+
+ F32 size_squared = size.lengthSquared() ;
+ LLVector3 lookAt = center - camera->getOrigin();
+ F32 dist = lookAt.normVec() ;
+
+ //get area of circle around node
+ F32 app_angle = atanf(fsqrtf(size_squared) / dist);
+ radius = app_angle*LLDrawable::sCurPixelAngle;
+ mPixelArea = radius*radius * 3.14159f;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+
+ //if has media, check if the face is out of the view frustum.
+ if(hasMedia())
+ {
+ if(!camera->AABBInFrustum(center, size))
+ {
+ mImportanceToCamera = 0.f ;
+ return false ;
+ }
+ if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ else
+ {
+ if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ }
+ }
+
+ if(dist < mBoundingSphereRadius) //camera is very close
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ mImportanceToCamera = 1.0f ;
+ }
+ else
+ {
+ mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
+ }
+
+ return true ;
+}
+
+//the projection of the face partially overlaps with the screen
+F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius )
+{
+ F32 screen_radius = (F32)llmax(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()) ;
+ F32 center_angle = acosf(cos_angle_to_view_dir) ;
+ F32 d = center_angle * LLDrawable::sCurPixelAngle ;
+
+ if(d + radius > screen_radius + 5.f)
+ {
+ //----------------------------------------------
+ //calculate the intersection area of two circles
+ //F32 radius_square = radius * radius ;
+ //F32 d_square = d * d ;
+ //F32 screen_radius_square = screen_radius * screen_radius ;
+ //face_area =
+ // radius_square * acosf((d_square + radius_square - screen_radius_square)/(2 * d * radius)) +
+ // screen_radius_square * acosf((d_square + screen_radius_square - radius_square)/(2 * d * screen_radius)) -
+ // 0.5f * sqrtf((-d + radius + screen_radius) * (d + radius - screen_radius) * (d - radius + screen_radius) * (d + radius + screen_radius)) ;
+ //----------------------------------------------
+
+ //the above calculation is too expensive
+ //the below is a good estimation: bounding box of the bounding sphere:
+ F32 alpha = 0.5f * (radius + screen_radius - d) / radius ;
+ alpha = llclamp(alpha, 0.f, 1.f) ;
+ return alpha * alpha ;
+ }
+ return 1.0f ;
+}
+
+const S8 FACE_IMPORTANCE_LEVEL = 4 ;
+const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL][2] = //{distance, importance_weight}
+ {{16.1f, 1.0f}, {32.1f, 0.5f}, {48.1f, 0.2f}, {96.1f, 0.05f} } ;
+const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[FACE_IMPORTANCE_LEVEL][2] = //{cos(angle), importance_weight}
+ {{0.985f /*cos(10 degrees)*/, 1.0f}, {0.94f /*cos(20 degrees)*/, 0.8f}, {0.866f /*cos(30 degrees)*/, 0.64f}, {0.0f, 0.36f}} ;
+
+//static
+F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist)
+{
+ F32 importance = 0.f ;
+
+ if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() &&
+ dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0])
+ {
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ F32 camera_moving_speed = camera->getAverageSpeed() ;
+ F32 camera_angular_speed = camera->getAverageAngularSpeed();
+
+ if(camera_moving_speed > 10.0f || camera_angular_speed > 1.0f)
+ {
+ //if camera moves or rotates too fast, ignore the importance factor
+ return 0.f ;
+ }
+
+ //F32 camera_relative_speed = camera_moving_speed * (lookAt * LLViewerCamera::getInstance()->getVelocityDir()) ;
+
+ S32 i = 0 ;
+ for(i = 0; i < FACE_IMPORTANCE_LEVEL && dist > FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][0]; ++i);
+ i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ;
+ F32 dist_factor = FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][1] ;
+
+ for(i = 0; i < FACE_IMPORTANCE_LEVEL && cos_angle_to_view_dir < FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[i][0] ; ++i) ;
+ i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ;
+ importance = dist_factor * FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[i][1] ;
+ }
+
+ return importance ;
+}
+
BOOL LLFace::verify(const U32* indices_array) const
{
BOOL ok = TRUE;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index d734b327d9..67dd97e6f7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -105,6 +105,9 @@ public:
F32 getVirtualSize() const { return mVSize; }
F32 getPixelArea() const { return mPixelArea; }
+ S32 getIndexInTex() const {return mIndexInTex ;}
+ void setIndexInTex(S32 index) { mIndexInTex = index ;}
+
void renderSetColor() const;
S32 renderElements(const U16 *index_array) const;
S32 renderIndexed ();
@@ -188,6 +191,12 @@ public:
void setIndicesIndex(S32 idx) { mIndicesIndex = idx; }
void setDrawInfo(LLDrawInfo* draw_info);
+ F32 getTextureVirtualSize() ;
+ F32 getImportanceToCamera()const {return mImportanceToCamera ;}
+
+ void setHasMedia(bool has_media) { mHasMedia = has_media ;}
+ BOOL hasMedia() const ;
+
//for atlas
LLTextureAtlasSlot* getAtlasInfo() ;
void setAtlasInUse(BOOL flag);
@@ -200,6 +209,12 @@ public:
void removeAtlas() ;
BOOL switchTexture() ;
+private:
+ F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
+ BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
+public:
+ static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist);
+
public:
LLVector3 mCenterLocal;
@@ -214,7 +229,7 @@ public:
LLMatrix4* mTextureMatrix;
LLDrawInfo* mDrawInfo;
-protected:
+private:
friend class LLGeometryManager;
friend class LLVolumeGeometryManager;
@@ -227,6 +242,7 @@ protected:
U16 mGeomIndex; // index into draw pool
U32 mIndicesCount;
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
+ S32 mIndexInTex ;
//previous rebuild's geometry info
U16 mLastGeomCount;
@@ -244,9 +260,16 @@ protected:
F32 mVSize;
F32 mPixelArea;
+ //importance factor, in the range [0, 1.0].
+ //1.0: the most important.
+ //based on the distance from the face to the view point and the angle from the face center to the view direction.
+ F32 mImportanceToCamera ;
+ F32 mBoundingSphereRadius ;
+ bool mHasMedia ;
+
//atlas
LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
- BOOL mUsingAtlas ;
+ BOOL mUsingAtlas ;
protected:
static BOOL sSafeRenderSelect;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 2ab17d6220..4fa97e789b 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -98,6 +98,7 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)
mHoverBarIndex = -1;
FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
mPrintStats = -1;
+ mAverageCyclesPerTimer = 0;
}
@@ -256,7 +257,8 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask)
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(mHoverTimer->getToolTip(LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - mHoverBarIndex))
- .sticky_rect(screen_rect));
+ .sticky_rect(screen_rect)
+ .delay_time(0.f));
return TRUE;
}
@@ -302,16 +304,17 @@ void LLFastTimerView::draw()
F64 iclock_freq = 1000.0 / clock_freq;
S32 margin = 10;
- S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f);
- S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f);
+ S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+ S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
- // HACK: casting away const. Should use setRect or some helper function instead.
- const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ LLRect new_rect;
+ new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ setRect(new_rect);
S32 left, top, right, bottom;
S32 x, y, barw, barh, dx, dy;
S32 texth, textw;
- LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("rounded_square.tga");
+ LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("Rounded_Square");
// Draw the window background
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -320,6 +323,12 @@ void LLFastTimerView::draw()
S32 xleft = margin;
S32 ytop = margin;
+ mAverageCyclesPerTimer = LLFastTimer::sTimerCalls == 0
+ ? 0
+ : llround(lerp((F32)mAverageCyclesPerTimer, (F32)(LLFastTimer::sTimerCycles / (U64)LLFastTimer::sTimerCalls), 0.1f));
+ LLFastTimer::sTimerCycles = 0;
+ LLFastTimer::sTimerCalls = 0;
+
// Draw some help
{
@@ -327,6 +336,10 @@ void LLFastTimerView::draw()
y = height - ytop;
texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
+#if TIME_FAST_TIMERS
+ tdesc = llformat("Cycles per timer call: %d", mAverageCyclesPerTimer);
+ LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#else
char modedesc[][32] = {
"2 x Average ",
"Max ",
@@ -341,7 +354,6 @@ void LLFastTimerView::draw()
tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]);
LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-
textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
x = xleft, y -= (texth + 2);
@@ -351,6 +363,7 @@ void LLFastTimerView::draw()
LLFontGL::getFontMonospace()->renderUTF8(std::string("[Right-Click log selected] [ALT-Click toggle counts] [ALT-SHIFT-Click sub hidden]"),
0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#endif
y -= (texth + 2);
}
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index 2bb023ab14..f5c8f23818 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -91,6 +91,7 @@ private:
S32 mHoverBarIndex;
LLFrameTimer mHighlightTimer;
S32 mPrintStats;
+ S32 mAverageCyclesPerTimer;
};
#endif
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index a6afbc05be..bf7c735488 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -34,7 +34,6 @@
#include "llfavoritesbar.h"
-#include "llbutton.h"
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llinventory.h"
@@ -48,9 +47,9 @@
#include "llclipboard.h"
#include "llinventoryclipboard.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
+#include "llnotificationsutil.h"
#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
@@ -74,6 +73,7 @@ public:
mName("(Loading...)"),
mPosX(0),
mPosY(0),
+ mPosZ(0),
mLoaded(false)
{}
@@ -101,6 +101,14 @@ public:
requestNameAndPos();
return mPosY;
}
+
+ S32 getPosZ()
+ {
+ if (!mLoaded)
+ requestNameAndPos();
+ return mPosZ;
+ }
+
private:
/**
* Requests landmark data from server.
@@ -114,14 +122,15 @@ private:
if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))
{
LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos,
- boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3));
+ boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4));
}
}
- void landmarkNameCallback(const std::string& name, S32 x, S32 y)
+ void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z)
{
mPosX = x;
mPosY = y;
+ mPosZ = z;
mName = name;
mLoaded = true;
}
@@ -130,6 +139,7 @@ private:
std::string mName;
S32 mPosX;
S32 mPosY;
+ S32 mPosZ;
bool mLoaded;
};
@@ -151,8 +161,22 @@ public:
if (!region_name.empty())
{
LLToolTip::Params params;
- params.message = llformat("%s\n%s (%d, %d)", getLabelSelected().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY());
- params.sticky_rect = calcScreenRect();
+ std::string extra_message = llformat("%s (%d, %d, %d)", region_name.c_str(),
+ mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ());
+
+ params.message = llformat("%s\n%s", getLabelSelected().c_str(), extra_message.c_str());
+
+ LLRect rect = calcScreenRect();
+ LLFontGL* standart_font = LLFontGL::getFontSansSerif();
+ if(standart_font)
+ {
+ S32 w = llmax((S32)(standart_font->getWidthF32(getLabelSelected())+0.5),(S32)(standart_font->getWidthF32(extra_message)+0.5));
+ rect.mRight = rect.mLeft + w;
+ params.max_width = w;
+ }
+
+ params.sticky_rect = rect;
+
LLToolTipMgr::instance().show(params);
}
return TRUE;
@@ -220,13 +244,15 @@ public:
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask)
{
- mMouseDownSignal(this, x, y, mask);
+ if (mMouseDownSignal)
+ (*mMouseDownSignal)(this, x, y, mask);
return LLMenuItemCallGL::handleMouseDown(x, y, mask);
}
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask)
{
- mMouseUpSignal(this, x, y, mask);
+ if (mMouseUpSignal)
+ (*mMouseUpSignal)(this, x, y, mask);
return LLMenuItemCallGL::handleMouseUp(x, y, mask);
}
@@ -272,6 +298,20 @@ public:
return TRUE;
}
+ void setVisible(BOOL b)
+ {
+ // Overflow menu shouldn't hide when it still has focus. See EXT-4217.
+ if (!b && hasFocus())
+ return;
+ LLToggleableMenu::setVisible(b);
+ setFocus(b);
+ }
+
+ void onFocusLost()
+ {
+ setVisible(FALSE);
+ }
+
protected:
LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p):
LLToggleableMenu(p)
@@ -341,8 +381,9 @@ struct LLFavoritesSort
};
LLFavoritesBarCtrl::Params::Params()
-: chevron_button_tool_tip("chevron_button_tool_tip"),
- image_drag_indication("image_drag_indication")
+: image_drag_indication("image_drag_indication"),
+ chevron_button("chevron_button"),
+ label("label")
{
}
@@ -351,12 +392,12 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()),
mPopupMenuHandle(),
mInventoryItemsPopupMenuHandle(),
- mChevronButtonToolTip(p.chevron_button_tool_tip),
mImageDragIndication(p.image_drag_indication),
mShowDragMarker(FALSE),
mLandingTab(NULL),
mLastTab(NULL),
mTabsHighlightEnabled(TRUE)
+ , mUpdateDropDownItems(true)
{
// Register callback for menus with current registrar (will be parent panel's registrar)
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected",
@@ -367,6 +408,16 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
boost::bind(&LLFavoritesBarCtrl::enableSelected, this, _2));
gInventory.addObserver(this);
+
+ //make chevron button
+ LLButton::Params chevron_button_params(p.chevron_button);
+ chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
+ mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params);
+ addChild(mChevronButton);
+
+ LLTextBox::Params label_param(p.label);
+ mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param);
+ addChild(mBarLabel);
}
LLFavoritesBarCtrl::~LLFavoritesBarCtrl()
@@ -437,7 +488,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
}
else
{
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if (item->getParentUUID() == favorites_id)
{
llwarns << "Attemt to copy a favorite item into the same folder." << llendl;
@@ -450,6 +501,10 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
if (drop)
{
+ if (mItems.empty())
+ {
+ setLandingTab(NULL);
+ }
handleNewFavoriteDragAndDrop(item, favorites_id, x, y);
showDragMarker(FALSE);
}
@@ -475,14 +530,14 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
if (dest)
{
- updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId());
+ LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId());
}
else
{
mItems.push_back(gInventory.getItem(mDragItemId));
}
- saveItemsOrder(mItems);
+ gInventory.saveItemsOrder(mItems);
LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get();
@@ -539,7 +594,7 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance();
if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)
{
- viewer_item->setType(LLAssetType::AT_FAVORITE);
+ viewer_item->setType(LLAssetType::AT_LANDMARK);
copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb));
}
else
@@ -561,7 +616,7 @@ void LLFavoritesBarCtrl::changed(U32 mask)
{
if (mFavoriteFolderId.isNull())
{
- mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
if (mFavoriteFolderId.notNull())
{
@@ -570,16 +625,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)
}
else
{
- updateButtons(getRect().getWidth());
+ updateButtons();
}
}
//virtual
void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- updateButtons(width);
-
LLUICtrl::reshape(width, height, called_from_parent);
+ updateButtons();
}
void LLFavoritesBarCtrl::draw()
@@ -588,8 +642,8 @@ void LLFavoritesBarCtrl::draw()
if (mShowDragMarker)
{
- S32 w = mImageDragIndication->getWidth() / 2;
- S32 h = mImageDragIndication->getHeight() / 2;
+ S32 w = mImageDragIndication->getWidth();
+ S32 h = mImageDragIndication->getHeight();
if (mLandingTab)
{
@@ -612,13 +666,13 @@ LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode()
bool success = LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", buttonXMLNode);
if (!success)
{
- llwarns << "Unable to read xml file with button for Favorites Bar: favorites_bar_button.xml" << llendl;
+ llwarns << "Failed to create Favorites Bar button from favorites_bar_button.xml" << llendl;
buttonXMLNode = NULL;
}
return buttonXMLNode;
}
-void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
+void LLFavoritesBarCtrl::updateButtons()
{
mItems.clear();
@@ -632,183 +686,174 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
{
return;
}
-
- S32 buttonWidth = 120; //default value
- buttonXMLNode->getAttributeS32("width", buttonWidth);
- S32 buttonHGap = 2; // default value
- buttonXMLNode->getAttributeS32("left", buttonHGap);
-
- S32 count = mItems.count();
-
- const S32 buttonHPad = LLUI::sSettingGroups["config"]->getS32("ButtonHPad");
- const S32 chevron_button_width = mFont->getWidth(">>") + buttonHPad * 2;
-
- S32 buttons_space = bar_width - buttonHGap;
-
- S32 first_drop_down_item = count;
-
- // Calculating, how much buttons can fit in the bar
- S32 buttons_width = 0;
- for (S32 i = 0; i < count; ++i)
+ if(mItems.empty())
{
- buttons_width += buttonWidth + buttonHGap;
- if (buttons_width > buttons_space)
- {
- // There is no space for all buttons.
- // Calculating the number of buttons, that are fit with chevron button
- buttons_space -= chevron_button_width + buttonHGap;
- while (i >= 0 && buttons_width > buttons_space)
- {
- buttons_width -= buttonWidth + buttonHGap;
- i--;
- }
- first_drop_down_item = i + 1; // First item behind visible items
-
- break;
- }
+ mBarLabel->setVisible(TRUE);
}
-
- bool recreate_buttons = true;
-
- // If inventory items are not changed up to mFirstDropDownItem, no need to recreate them
- if (mFirstDropDownItem == first_drop_down_item && (mItemNamesCache.size() == count || mItemNamesCache.size() == mFirstDropDownItem))
+ else
+ {
+ mBarLabel->setVisible(FALSE);
+ }
+ const child_list_t* childs = getChildList();
+ child_list_const_iter_t child_it = childs->begin();
+ int first_changed_item_index = 0;
+ int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth();
+ //lets find first changed button
+ while (child_it != childs->end() && first_changed_item_index < mItems.count())
{
- S32 i;
- for (i = 0; i < mFirstDropDownItem; ++i)
+ LLFavoriteLandmarkButton* button = dynamic_cast<LLFavoriteLandmarkButton*> (*child_it);
+ if (button)
{
- if (mItemNamesCache.get(i) != mItems.get(i)->getName())
+ const LLViewerInventoryItem *item = mItems[first_changed_item_index].get();
+ if (item)
{
- break;
+ // an child's order and mItems should be same
+ if (button->getLandmarkId() != item->getUUID() // sort order has been changed
+ || button->getLabelSelected() != item->getName() // favorite's name has been changed
+ || button->getRect().mRight < rightest_point) // favbar's width has been changed
+ {
+ break;
+ }
}
+ first_changed_item_index++;
}
- if (i == mFirstDropDownItem)
- {
- recreate_buttons = false;
- }
+ child_it++;
}
+ // now first_changed_item_index should contains a number of button that need to change
- if (recreate_buttons)
+ if (first_changed_item_index <= mItems.count())
{
- mFirstDropDownItem = first_drop_down_item;
-
- mItemNamesCache.clear();
- for (S32 i = 0; i < mFirstDropDownItem; i++)
- {
- mItemNamesCache.put(mItems.get(i)->getName());
- }
-
// Rebuild the buttons only
// child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
- for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); )
+
+ while (child_it != childs->end())
{
+ //lets remove other landmarks button and rebuild it
child_list_const_iter_t cur_it = child_it++;
- LLView* viewp = *cur_it;
- LLButton* button = dynamic_cast<LLButton*>(viewp);
+ LLFavoriteLandmarkButton* button =
+ dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it);
if (button)
{
removeChild(button);
delete button;
}
}
-
- createButtons(mItems, buttonXMLNode, buttonWidth, buttonHGap);
- }
-
- // Chevron button
- if (mFirstDropDownItem != count)
- {
- // Chevron button should stay right aligned
- LLView *chevron_button = findChildView(std::string(">>"), FALSE);
- if (chevron_button)
+ // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
+ // keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton
+ if (mChevronButton->getParent() == this)
{
- LLRect rect;
- rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
- chevron_button->setRect(rect);
- chevron_button->setVisible(TRUE);
- mChevronRect = rect;
+ removeChild(mChevronButton);
}
- else
+ int last_right_edge = 0;
+ //calculate new buttons offset
+ if (getChildList()->size() > 0)
{
- static LLButton::Params default_button_params(LLUICtrlFactory::getDefaultParams<LLButton>());
- std::string flat_icon = "transparent.j2c";
- std::string hover_icon = default_button_params.image_unselected.name;
- std::string hover_icon_selected = default_button_params.image_selected.name;
-
- LLButton::Params bparams;
+ //find last visible child to get the rightest button offset
+ child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(),
+ std::mem_fun(&LLView::getVisible));
+ if(last_visible_it != childs->rend())
+ {
+ last_right_edge = (*last_visible_it)->getRect().mRight;
+ }
+ }
+ //last_right_edge is saving coordinates
+ LLButton* last_new_button = NULL;
+ int j = first_changed_item_index;
+ for (; j < mItems.count(); j++)
+ {
+ last_new_button = createButton(mItems[j], buttonXMLNode, last_right_edge);
+ if (!last_new_button)
+ {
+ break;
+ }
+ sendChildToBack(last_new_button);
+ last_right_edge = last_new_button->getRect().mRight;
+ mLastTab = last_new_button;
+ }
+ mFirstDropDownItem = j;
+ // Chevron button
+ if (mFirstDropDownItem < mItems.count())
+ {
+ // if updateButton had been called it means:
+ //or there are some new favorites, or width had been changed
+ // so if we need to display chevron button, we must update dropdown items too.
+ mUpdateDropDownItems = true;
+ S32 buttonHGap = 2; // default value
+ buttonXMLNode->getAttributeS32("left", buttonHGap);
LLRect rect;
- rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
-
- bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM);
- bparams.image_unselected.name(flat_icon);
- bparams.image_disabled.name(flat_icon);
- bparams.image_selected.name(hover_icon_selected);
- bparams.image_hover_selected.name(hover_icon_selected);
- bparams.image_disabled_selected.name(hover_icon_selected);
- bparams.image_hover_unselected.name(hover_icon);
- bparams.rect (rect);
- bparams.tab_stop(false);
- bparams.font(mFont);
- bparams.name(">>");
- bparams.tool_tip(mChevronButtonToolTip);
- bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
-
- addChildInBack(LLUICtrlFactory::create<LLButton> (bparams));
-
- mChevronRect = rect;
+ // Chevron button should stay right aligned
+ rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0,
+ mChevronButton->getRect().getWidth(),
+ mChevronButton->getRect().getHeight());
+
+ addChild(mChevronButton);
+ mChevronButton->setRect(rect);
+ mChevronButton->setVisible(TRUE);
+ }
+ // Update overflow menu
+ LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get());
+ if (overflow_menu && overflow_menu->getVisible())
+ {
+ overflow_menu->setFocus(FALSE);
+ overflow_menu->setVisible(FALSE);
+ if (mUpdateDropDownItems)
+ showDropDownMenu();
}
}
else
{
- // Hide chevron button if all items are visible on bar
- LLView *chevron_button = findChildView(std::string(">>"), FALSE);
- if (chevron_button)
- {
- chevron_button->setVisible(FALSE);
- }
+ mUpdateDropDownItems = false;
}
}
-
-void LLFavoritesBarCtrl::createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &buttonXMLNode, S32 buttonWidth, S32 buttonHGap)
+LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &buttonXMLNode, S32 x_offset)
{
- S32 curr_x = buttonHGap;
- // Adding buttons
+ S32 def_button_width = 120;
+ buttonXMLNode->getAttributeS32("width", def_button_width);
+ S32 button_x_delta = 2; // default value
+ buttonXMLNode->getAttributeS32("left", button_x_delta);
+ S32 curr_x = x_offset;
+ /**
+ * WORKAROUND:
+ * there are some problem with displaying of fonts in buttons.
+ * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.
+ * Problem will gone, if we stretch out the button. For that reason I have to put additional 20 pixels.
+ */
+ int required_width = mFont->getWidth(item->getName()) + 20;
+ int width = required_width > def_button_width? def_button_width : required_width;
LLFavoriteLandmarkButton* fav_btn = NULL;
- mLandingTab = mLastTab = NULL;
- for(S32 i = mFirstDropDownItem -1, j = 0; i >= 0; i--)
+ // do we have a place for next button + double buttonHGap + mChevronButton ?
+ if(curr_x + width + 2*button_x_delta + mChevronButton->getRect().getWidth() > getRect().mRight )
{
- LLViewerInventoryItem* item = items.get(j++);
-
- fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
- if (NULL == fav_btn)
- {
- llwarns << "Unable to create button for landmark: " << item->getName() << llendl;
- continue;
- }
-
- fav_btn->setLandmarkID(item->getUUID());
-
- // change only left and save bottom
- fav_btn->setOrigin(curr_x, fav_btn->getRect().mBottom);
- fav_btn->setFont(mFont);
- fav_btn->setName(item->getName());
- fav_btn->setLabel(item->getName());
- fav_btn->setToolTip(item->getName());
- fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
- fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
-
- fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
-
- sendChildToBack(fav_btn);
-
- curr_x += buttonWidth + buttonHGap;
+ return NULL;
}
-
- mLastTab = fav_btn;
+ fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
+ if (NULL == fav_btn)
+ {
+ llwarns << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << llendl;
+ return NULL;
+ }
+
+ LLRect butt_rect (fav_btn->getRect());
+ fav_btn->setLandmarkID(item->getUUID());
+ butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight());
+
+ fav_btn->setRect(butt_rect);
+ // change only left and save bottom
+ fav_btn->setFont(mFont);
+ fav_btn->setName(item->getName());
+ fav_btn->setLabel(item->getName());
+ fav_btn->setToolTip(item->getName());
+ fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
+ fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
+
+ fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+
+ return fav_btn;
}
@@ -868,105 +913,71 @@ void LLFavoritesBarCtrl::showDropDownMenu()
LLToggleableMenu* menu = (LLToggleableMenu*)mPopupMenuHandle.get();
- if(menu)
+ if (menu)
{
+ // Release focus to allow changing of visibility.
+ menu->setFocus(FALSE);
if (!menu->toggleVisibility())
return;
- mItems.clear();
-
- if (!collectFavoriteItems(mItems))
- {
- return;
- }
-
- S32 count = mItems.count();
-
- // Check it there are changed items, since last call
- if (mItemNamesCache.size() == count)
- {
- S32 i;
- for (i = mFirstDropDownItem; i < count; i++)
- {
- if (mItemNamesCache.get(i) != mItems.get(i)->getName())
- {
- break;
- }
- }
-
- // Check passed, just show the menu
- if (i == count)
- {
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
-
- menu->setButtonRect(mChevronRect, this);
-
- LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
- return;
- }
- }
-
- // Add menu items to cache, if there is only names of buttons
- if (mItemNamesCache.size() == mFirstDropDownItem)
- {
- for (S32 i = mFirstDropDownItem; i < count; i++)
- {
- mItemNamesCache.put(mItems.get(i)->getName());
- }
- }
-
- menu->empty();
-
U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- U32 widest_item = 0;
-
- for(S32 i = mFirstDropDownItem; i < count; i++)
+ if (mUpdateDropDownItems)
{
- LLViewerInventoryItem* item = mItems.get(i);
- const std::string& item_name = item->getName();
+ menu->empty();
- LLFavoriteLandmarkMenuItem::Params item_params;
- item_params.name(item_name);
- item_params.label(item_name);
-
- item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
- LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
- menu_item->initFavoritesBarPointer(this);
- menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this,item->getUUID(),_1,_2,_3,_4));
- menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->setLandmarkID(item->getUUID());
-
- // Check whether item name wider than menu
- if (menu_item->getNominalWidth() > max_width)
- {
- S32 chars_total = item_name.length();
- S32 chars_fitted = 1;
- menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
- menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
+ U32 widest_item = 0;
- while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+ for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
+ {
+ LLViewerInventoryItem* item = mItems.get(i);
+ const std::string& item_name = item->getName();
+
+ LLFavoriteLandmarkMenuItem::Params item_params;
+ item_params.name(item_name);
+ item_params.label(item_name);
+
+ item_params.on_click.function(boost::bind(
+ &LLFavoritesBarCtrl::onButtonClick, this,
+ item->getUUID()));
+ LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
+ menu_item->initFavoritesBarPointer(this);
+ menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->setLandmarkID(item->getUUID());
+
+ // Check whether item name wider than menu
+ if (menu_item->getNominalWidth() > max_width)
{
- chars_fitted++;
+ S32 chars_total = item_name.length();
+ S32 chars_fitted = 1;
+ menu_item->setLabel(LLStringExplicit(""));
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
+ menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
+
+ while (chars_fitted < chars_total
+ && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+ {
+ chars_fitted++;
+ }
+ chars_fitted--; // Rolling back one char, that doesn't fit
+
+ menu_item->setLabel(item_name.substr(0, chars_fitted)
+ + "...");
}
- chars_fitted--; // Rolling back one char, that doesn't fit
+ widest_item = llmax(widest_item, menu_item->getNominalWidth());
- menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
+ menu->addChild(menu_item);
}
- widest_item = llmax(widest_item, menu_item->getNominalWidth());
-
- menu->addChild(menu_item);
+ mUpdateDropDownItems = false;
}
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
- menu->setButtonRect(mChevronRect, this);
+ menu->setButtonRect(mChevronButton->getRect(), this);
LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
-
}
}
@@ -1008,6 +1019,10 @@ BOOL LLFavoritesBarCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
void copy_slurl_to_clipboard_cb(std::string& slurl)
{
gClipboard.copyFromString(utf8str_to_wstring(slurl));
+
+ LLSD args;
+ args["SLURL"] = slurl;
+ LLNotificationsUtil::add("CopySLURL", args);
}
@@ -1034,7 +1049,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
if (action == "open")
{
- teleport_via_landmark(item->getAssetUUID());
+ onButtonClick(item->getUUID());
}
else if (action == "about")
{
@@ -1230,25 +1245,6 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array
return result;
}
-void LLFavoritesBarCtrl::saveItemsOrder(LLInventoryModel::item_array_t& items)
-{
- int sortField = 0;
-
- // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
- {
- LLViewerInventoryItem* item = *i;
-
- item->setSortField(++sortField);
- item->setComplete(TRUE);
- item->updateServer(FALSE);
-
- gInventory.updateItem(item);
- }
-
- gInventory.notifyObservers();
-}
-
LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
{
LLInventoryModel::item_array_t::iterator result = items.end();
@@ -1265,20 +1261,14 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn
return result;
}
-void LLFavoritesBarCtrl::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
-{
- LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
- LLViewerInventoryItem* destItem = gInventory.getItem(destItemId);
-
- items.erase(findItemByUUID(items, srcItem->getUUID()));
- items.insert(findItemByUUID(items, destItem->getUUID()), srcItem);
-}
-
void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
{
LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
-
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ llassert(beforeItem);
+ if (beforeItem)
+ {
+ items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ }
}
// EOF
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index e90d13f9d5..2c6d8d1580 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -33,8 +33,11 @@
#ifndef LL_LLFAVORITESBARCTRL_H
#define LL_LLFAVORITESBARCTRL_H
+#include "llbutton.h"
#include "lluictrl.h"
+#include "lltextbox.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
@@ -42,8 +45,9 @@ class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<std::string> chevron_button_tool_tip;
Optional<LLUIImage*> image_drag_indication;
+ Optional<LLButton::Params> chevron_button;
+ Optional<LLTextBox::Params> label;
Params();
};
@@ -72,8 +76,8 @@ public:
void setLandingTab(LLUICtrl* tab) { mLandingTab = tab; }
protected:
- void updateButtons(U32 bar_width);
- void createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &root, S32 buttonWidth, S32 buttonHGap);
+ void updateButtons();
+ LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &root, S32 x_offset );
LLXMLNodePtr getButtonXMLNode();
BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items);
@@ -99,14 +103,10 @@ protected:
LLUUID mFavoriteFolderId;
const LLFontGL *mFont;
S32 mFirstDropDownItem;
-
- typedef LLDynamicArray<std::string> item_names_array_t;
- item_names_array_t mItemNamesCache;
+ bool mUpdateDropDownItems;
LLUUID mSelectedItemID;
- LLRect mChevronRect;
- std::string mChevronButtonToolTip;
LLUIImage* mImageDragIndication;
private:
@@ -128,16 +128,7 @@ private:
// checks if the current order of the favorites items must be saved
BOOL needToSaveItemsOrder(const LLInventoryModel::item_array_t& items);
- // saves current order of the favorites items
- void saveItemsOrder(LLInventoryModel::item_array_t& items);
-
- /*
- * changes favorites items order by insertion of the item identified by srcItemId
- * BEFORE the item identified by destItemId. both items must exist in items array.
- */
- void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId);
-
- /*
+ /**
* inserts an item identified by insertedItemId BEFORE an item identified by beforeItemId.
* this function assumes that an item identified by insertedItemId doesn't exist in items array.
*/
@@ -149,6 +140,8 @@ private:
BOOL mShowDragMarker;
LLUICtrl* mLandingTab;
LLUICtrl* mLastTab;
+ LLButton* mChevronButton;
+ LLTextBox* mBarLabel;
LLUUID mDragItemId;
BOOL mStartDrag;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index fb724f30e0..fbb90c69f3 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -287,6 +287,7 @@ BOOL LLFeatureManager::loadFeatureTables()
if (!flp)
{
LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
}
S32 available;
F32 recommended;
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 383963a41d..dd218d428f 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -99,8 +99,14 @@ protected:
class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManager>
{
public:
- LLFeatureManager() :
- LLFeatureList("default"), mInited(FALSE), mTableVersion(0), mSafe(FALSE), mGPUClass(GPU_CLASS_UNKNOWN)
+ LLFeatureManager()
+ : LLFeatureList("default"),
+
+ mInited(FALSE),
+ mTableVersion(0),
+ mSafe(FALSE),
+ mGPUClass(GPU_CLASS_UNKNOWN),
+ mGPUSupported(FALSE)
{
}
~LLFeatureManager() {cleanupFeatureTables();}
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 028e1cc098..2873057c19 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -68,7 +68,7 @@ LLFilePicker LLFilePicker::sInstance;
//
LLFilePicker::LLFilePicker()
: mCurrentFile(0),
- mLocked(FALSE)
+ mLocked(false)
{
reset();
@@ -92,6 +92,7 @@ LLFilePicker::LLFilePicker()
mOFN.lCustData = 0L;
mOFN.lpfnHook = NULL;
mOFN.lpTemplateName = NULL;
+ mFilesW[0] = '\0';
#endif
#if LL_DARWIN
@@ -120,7 +121,7 @@ const std::string LLFilePicker::getNextFile()
{
if (mCurrentFile >= getFileCount())
{
- mLocked = FALSE;
+ mLocked = false;
return std::string();
}
else
@@ -133,7 +134,7 @@ const std::string LLFilePicker::getCurFile()
{
if (mCurrentFile >= getFileCount())
{
- mLocked = FALSE;
+ mLocked = false;
return std::string();
}
else
@@ -144,7 +145,7 @@ const std::string LLFilePicker::getCurFile()
void LLFilePicker::reset()
{
- mLocked = FALSE;
+ mLocked = false;
mFiles.clear();
mCurrentFile = 0;
}
@@ -276,7 +277,7 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
}
else
{
- mLocked = TRUE;
+ mLocked = true;
WCHAR* tptrw = mFilesW;
std::string dirname;
while(1)
@@ -866,7 +867,7 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
if (getFileCount())
success = true;
if (getFileCount() > 1)
- mLocked = TRUE;
+ mLocked = true;
}
// Account for the fact that the app has been stalled.
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index ab2455620f..4f254ff67e 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -64,11 +64,6 @@ extern "C" {
#if LL_GTK
# include "gtk/gtk.h"
#endif // LL_GTK
-
-// also mostly for Linux, for some X11-specific filepicker usability tweaks
-#if LL_X11
-#include "SDL/SDL_syswm.h"
-#endif
}
class LLFilePicker
@@ -181,8 +176,7 @@ private:
std::vector<std::string> mFiles;
S32 mCurrentFile;
- BOOL mLocked;
- BOOL mMultiFile;
+ bool mLocked;
static LLFilePicker sInstance;
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 893b12ec35..b3fdf60b11 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -36,15 +36,16 @@
// library includes
#include "indra_constants.h"
+#include "llnotificationsutil.h"
// viewer includes
#include "llagent.h" // for gAgent.inPrelude()
-#include "llnotify.h"
#include "llviewercontrol.h"
#include "llui.h"
#include "llappviewer.h"
#include "lltracker.h"
+/*
// static
std::set<std::string> LLFirstUse::sConfigVariables;
@@ -75,7 +76,8 @@ void LLFirstUse::resetFirstUse()
gWarningSettings.setBOOL(*iter, TRUE);
}
}
-
+*/
+/*
// Called whenever the viewer detects that your balance went up
void LLFirstUse::useBalanceIncrease(S32 delta)
@@ -86,7 +88,7 @@ void LLFirstUse::useBalanceIncrease(S32 delta)
LLSD args;
args["AMOUNT"] = llformat("%d",delta);
- LLNotifications::instance().add("FirstBalanceIncrease", args);
+ LLNotificationsUtil::add("FirstBalanceIncrease", args);
}
}
@@ -100,7 +102,7 @@ void LLFirstUse::useBalanceDecrease(S32 delta)
LLSD args;
args["AMOUNT"] = llformat("%d",-delta);
- LLNotifications::instance().add("FirstBalanceDecrease", args);
+ LLNotificationsUtil::add("FirstBalanceDecrease", args);
}
}
@@ -114,7 +116,7 @@ void LLFirstUse::useSit()
//{
// gWarningSettings.setBOOL("FirstSit", FALSE);
//
- // LLNotifications::instance().add("FirstSit");
+ // LLNotificationsUtil::add("FirstSit");
//}
}
@@ -125,7 +127,7 @@ void LLFirstUse::useMap()
{
gWarningSettings.setBOOL("FirstMap", FALSE);
- LLNotifications::instance().add("FirstMap");
+ LLNotificationsUtil::add("FirstMap");
}
}
@@ -142,9 +144,11 @@ void LLFirstUse::useBuild()
{
gWarningSettings.setBOOL("FirstBuild", FALSE);
- LLNotifications::instance().add("FirstBuild");
+ LLNotificationsUtil::add("FirstBuild");
}
}
+
+ */
/*
// static
void LLFirstUse::useLeftClickNoHit()
@@ -153,10 +157,11 @@ void LLFirstUse::useLeftClickNoHit()
{
gWarningSettings.setBOOL("FirstLeftClickNoHit", FALSE);
- LLNotifications::instance().add("FirstLeftClickNoHit");
+ LLNotificationsUtil::add("FirstLeftClickNoHit");
}
}
*/
+/*
// static
void LLFirstUse::useTeleport()
{
@@ -167,11 +172,11 @@ void LLFirstUse::useTeleport()
{
gWarningSettings.setBOOL("FirstTeleport", FALSE);
- LLNotifications::instance().add("FirstTeleport");
+ LLNotificationsUtil::add("FirstTeleport");
}
}
}
-
+*/
// static
void LLFirstUse::useOverrideKeys()
{
@@ -183,11 +188,11 @@ void LLFirstUse::useOverrideKeys()
{
gWarningSettings.setBOOL("FirstOverrideKeys", FALSE);
- LLNotifications::instance().add("FirstOverrideKeys");
+ LLNotificationsUtil::add("FirstOverrideKeys");
}
}
}
-
+/*
// static
void LLFirstUse::useAttach()
{
@@ -201,7 +206,7 @@ void LLFirstUse::useAppearance()
{
gWarningSettings.setBOOL("FirstAppearance", FALSE);
- LLNotifications::instance().add("FirstAppearance");
+ LLNotificationsUtil::add("FirstAppearance");
}
}
@@ -212,10 +217,11 @@ void LLFirstUse::useInventory()
{
gWarningSettings.setBOOL("FirstInventory", FALSE);
- LLNotifications::instance().add("FirstInventory");
+ LLNotificationsUtil::add("FirstInventory");
}
}
+*/
// static
void LLFirstUse::useSandbox()
@@ -227,10 +233,10 @@ void LLFirstUse::useSandbox()
LLSD args;
args["HOURS"] = llformat("%d",SANDBOX_CLEAN_FREQ);
args["TIME"] = llformat("%d",SANDBOX_FIRST_CLEAN_HOUR);
- LLNotifications::instance().add("FirstSandbox", args);
+ LLNotificationsUtil::add("FirstSandbox", args);
}
}
-
+/*
// static
void LLFirstUse::useFlexible()
{
@@ -238,7 +244,7 @@ void LLFirstUse::useFlexible()
{
gWarningSettings.setBOOL("FirstFlexible", FALSE);
- LLNotifications::instance().add("FirstFlexible");
+ LLNotificationsUtil::add("FirstFlexible");
}
}
@@ -249,7 +255,7 @@ void LLFirstUse::useDebugMenus()
{
gWarningSettings.setBOOL("FirstDebugMenus", FALSE);
- LLNotifications::instance().add("FirstDebugMenus");
+ LLNotificationsUtil::add("FirstDebugMenus");
}
}
@@ -260,7 +266,7 @@ void LLFirstUse::useSculptedPrim()
{
gWarningSettings.setBOOL("FirstSculptedPrim", FALSE);
- LLNotifications::instance().add("FirstSculptedPrim");
+ LLNotificationsUtil::add("FirstSculptedPrim");
}
}
@@ -274,6 +280,7 @@ void LLFirstUse::useMedia()
// Popup removed as a short-term fix for EXT-1643.
// Ultimately, the plan is to kill all First Use dialogs
- //LLNotifications::instance().add("FirstMedia");
+ //LLNotificationsUtil::add("FirstMedia");
}
}
+*/
diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h
index 7b4f9f516f..3c7551f6cb 100644
--- a/indra/newview/llfirstuse.h
+++ b/indra/newview/llfirstuse.h
@@ -79,6 +79,7 @@ object or from inventory.
class LLFirstUse
{
public:
+/*
// Add a config variable to be reset on resetFirstUse()
static void addConfigVariable(const std::string& var);
@@ -97,11 +98,16 @@ public:
static void useBuild();
// static void useLeftClickNoHit();
static void useTeleport();
+*/
static void useOverrideKeys();
+/*
static void useAttach();
static void useAppearance();
static void useInventory();
+ */
static void useSandbox();
+
+/*
static void useFlexible();
static void useDebugMenus();
static void useSculptedPrim();
@@ -109,6 +115,7 @@ public:
protected:
static std::set<std::string> sConfigVariables;
+*/
};
#endif
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 216bca8262..aea2de8e92 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -66,6 +66,7 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
mInitializedRes = -1;
mSimulateRes = 0;
mFrameNum = 0;
+ mCollisionSphereRadius = 0.f;
mRenderRes = 1;
if(mVO->mDrawable.notNull())
@@ -704,7 +705,7 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
}
if (volume->mLODChanged || volume->mFaceMappingChanged ||
- volume->mVolumeChanged)
+ volume->mVolumeChanged || drawable->isState(LLDrawable::REBUILD_MATERIAL))
{
volume->regenFaces();
volume->mDrawable->setState(LLDrawable::REBUILD_VOLUME);
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 63ea990d14..ef69f39ad2 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -1,341 +1,338 @@
-/**
- * @file llfloaterabout.cpp
- * @author James Cook
- * @brief The about box from Help->About
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterabout.h"
-
-// Viewer includes
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llsecondlifeurls.h"
-#include "lluictrlfactory.h"
-#include "llviewertexteditor.h"
-#include "llviewercontrol.h"
-#include "llviewerstats.h"
-#include "llviewerregion.h"
-#include "llversionviewer.h"
-#include "llviewerbuild.h"
-#include "llweb.h"
-
-// Linden library includes
-#include "llaudioengine.h"
-#include "llbutton.h"
-#include "llcurl.h"
-#include "llglheaders.h"
-#include "llfloater.h"
-#include "llfloaterreg.h"
-#include "llimagej2c.h"
-#include "llsys.h"
-#include "lltrans.h"
-#include "lluri.h"
-#include "v3dmath.h"
-#include "llwindow.h"
-#include "stringize.h"
-#include "llsdutil_math.h"
-#include "lleventdispatcher.h"
-
-#if LL_WINDOWS
-#include "lldxhardware.h"
-#endif
-
-extern LLMemoryInfo gSysMemory;
-extern U32 gPacketsIn;
-
-static std::string get_viewer_release_notes_url();
-
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterAbout
-///----------------------------------------------------------------------------
-class LLFloaterAbout
- : public LLFloater
-{
- friend class LLFloaterReg;
-private:
- LLFloaterAbout(const LLSD& key);
- virtual ~LLFloaterAbout();
-
-public:
- /*virtual*/ BOOL postBuild();
-
- /// Obtain the data used to fill out the contents string. This is
- /// separated so that we can programmatically access the same info.
- static LLSD getInfo();
- void onClickCopyToClipboard();
-};
-
-
-// Default constructor
-LLFloaterAbout::LLFloaterAbout(const LLSD& key)
-: LLFloater(key)
-{
- //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml");
-
-}
-
-// Destroys the object
-LLFloaterAbout::~LLFloaterAbout()
-{
-}
-
-BOOL LLFloaterAbout::postBuild()
-{
- center();
- LLViewerTextEditor *support_widget =
- getChild<LLViewerTextEditor>("support_editor", true);
-
- LLViewerTextEditor *credits_widget =
- getChild<LLViewerTextEditor>("credits_editor", true);
-
- getChild<LLUICtrl>("copy_btn")->setCommitCallback(
- boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
-
-#if LL_WINDOWS
- getWindow()->incBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
- LLSD info(getInfo());
-#if LL_WINDOWS
- getWindow()->decBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
-
- std::ostringstream support;
-
- // Render the LLSD from getInfo() as a format_map_t
- LLStringUtil::format_map_t args;
- // For reasons I don't yet understand, [ReleaseNotes] is not part of the
- // default substitution strings whereas [APP_NAME] is. But it works to
- // simply copy it into these specific args.
- args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
- for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
- ii != iend; ++ii)
- {
- if (! ii->second.isArray())
- {
- // Scalar value
- if (ii->second.isUndefined())
- {
- args[ii->first] = getString("none");
- }
- else
- {
- // don't forget to render value asString()
- args[ii->first] = ii->second.asString();
- }
- }
- else
- {
- // array value: build KEY_0, KEY_1 etc. entries
- for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
- {
- args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
- }
- }
- }
-
- // Now build the various pieces
- support << getString("AboutHeader", args);
- if (info.has("COMPILER"))
- {
- support << "\n\n" << getString("AboutCompiler", args);
- }
- if (info.has("REGION"))
- {
- support << "\n\n" << getString("AboutPosition", args);
- }
- support << "\n\n" << getString("AboutSystem", args);
- if (info.has("GRAPHICS_DRIVER_VERSION"))
- {
- support << "\n\n" << getString("AboutDriver", args);
- }
- support << "\n\n" << getString("AboutLibs", args);
- if (info.has("PACKETS_IN"))
- {
- support << '\n' << getString("AboutTraffic", args);
- }
-
- support_widget->appendText(support.str(),
- FALSE,
- LLStyle::Params()
- .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
- support_widget->blockUndo();
-
- // Fix views
- support_widget->setCursorPos(0);
- support_widget->setEnabled(FALSE);
-
- credits_widget->setCursorPos(0);
- credits_widget->setEnabled(FALSE);
-
- return TRUE;
-}
-
-// static
-LLSD LLFloaterAbout::getInfo()
-{
- // The point of having one method build an LLSD info block and the other
- // construct the user-visible About string is to ensure that the same info
- // is available to a getInfo() caller as to the user opening
- // LLFloaterAbout.
- LLSD info;
- LLSD version;
- version.append(LL_VERSION_MAJOR);
- version.append(LL_VERSION_MINOR);
- version.append(LL_VERSION_PATCH);
- version.append(LL_VERSION_BUILD);
- info["VIEWER_VERSION"] = version;
- info["VIEWER_VERSION_STR"] = STRINGIZE(version[0].asInteger() << '.' <<
- version[1].asInteger() << '.' <<
- version[2].asInteger() << '.' <<
- version[3].asInteger());
- info["BUILD_DATE"] = __DATE__;
- info["BUILD_TIME"] = __TIME__;
- info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
-
- info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
-
-#if LL_MSVC
- info["COMPILER"] = "MSVC";
- info["COMPILER_VERSION"] = _MSC_VER;
-#elif LL_GNUC
- info["COMPILER"] = "GCC";
- info["COMPILER_VERSION"] = GCC_VERSION;
-#endif
-
- // Position
- LLViewerRegion* region = gAgent.getRegion();
- if (region)
- {
- const LLVector3d &pos = gAgent.getPositionGlobal();
- info["POSITION"] = ll_sd_from_vector3d(pos);
- info["REGION"] = gAgent.getRegion()->getName();
- info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
- info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
- info["SERVER_VERSION"] = gLastVersionChannel;
- info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
- }
-
- // CPU
- info["CPU"] = gSysCPU.getCPUString();
- info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
- // Moved hack adjustment to Windows memory size into llsys.cpp
- info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
- info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
- info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
-
-#if LL_WINDOWS
- LLSD driver_info = gDXHardware.getDisplayInfo();
- if (driver_info.has("DriverVersion"))
- {
- info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
- }
-#endif
-
- info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
- info["LIBCURL_VERSION"] = LLCurl::getVersionString();
- info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
- bool want_fullname = true;
- info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
-
- // TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.5.2";
-
- if (gPacketsIn > 0)
- {
- info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
- info["PACKETS_IN"] = F32(gPacketsIn);
- info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
- }
-
- return info;
-}
-
-static std::string get_viewer_release_notes_url()
-{
- std::ostringstream version;
- version << LL_VERSION_MAJOR << "."
- << LL_VERSION_MINOR << "."
- << LL_VERSION_PATCH << "."
- << LL_VERSION_BUILD;
-
- LLSD query;
- query["channel"] = gSavedSettings.getString("VersionChannelName");
- query["version"] = version.str();
-
- std::ostringstream url;
- url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
-
- return LLWeb::escapeURL(url.str());
-}
-
-class LLFloaterAboutListener: public LLDispatchListener
-{
-public:
- LLFloaterAboutListener():
- LLDispatchListener("LLFloaterAbout", "op")
- {
- add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD()));
- }
-
-private:
- void getInfo(const LLSD& request) const
- {
- LLReqID reqid(request);
- LLSD reply(LLFloaterAbout::getInfo());
- reqid.stamp(reply);
- LLEventPumps::instance().obtain(request["reply"]).post(reply);
- }
-};
-
-static LLFloaterAboutListener floaterAboutListener;
-
-void LLFloaterAbout::onClickCopyToClipboard()
-{
- LLViewerTextEditor *support_widget =
- getChild<LLViewerTextEditor>("support_editor", true);
- support_widget->selectAll();
- support_widget->copy();
- support_widget->deselect();
-}
-
-///----------------------------------------------------------------------------
-/// LLFloaterAboutUtil
-///----------------------------------------------------------------------------
-void LLFloaterAboutUtil::registerFloater()
-{
- LLFloaterReg::add("sl_about", "floater_about.xml",
- &LLFloaterReg::build<LLFloaterAbout>);
-
-}
+/**
+ * @file llfloaterabout.cpp
+ * @author James Cook
+ * @brief The about box from Help->About
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterabout.h"
+
+// Viewer includes
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llsecondlifeurls.h"
+#include "llvoiceclient.h"
+#include "lluictrlfactory.h"
+#include "llviewertexteditor.h"
+#include "llviewercontrol.h"
+#include "llviewerstats.h"
+#include "llviewerregion.h"
+#include "llversioninfo.h"
+#include "llweb.h"
+
+// Linden library includes
+#include "llaudioengine.h"
+#include "llbutton.h"
+#include "llcurl.h"
+#include "llglheaders.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llimagej2c.h"
+#include "llsys.h"
+#include "lltrans.h"
+#include "lluri.h"
+#include "v3dmath.h"
+#include "llwindow.h"
+#include "stringize.h"
+#include "llsdutil_math.h"
+#include "lleventapi.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+extern LLMemoryInfo gSysMemory;
+extern U32 gPacketsIn;
+
+static std::string get_viewer_release_notes_url();
+
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterAbout
+///----------------------------------------------------------------------------
+class LLFloaterAbout
+ : public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterAbout(const LLSD& key);
+ virtual ~LLFloaterAbout();
+
+public:
+ /*virtual*/ BOOL postBuild();
+
+ /// Obtain the data used to fill out the contents string. This is
+ /// separated so that we can programmatically access the same info.
+ static LLSD getInfo();
+ void onClickCopyToClipboard();
+};
+
+
+// Default constructor
+LLFloaterAbout::LLFloaterAbout(const LLSD& key)
+: LLFloater(key)
+{
+ //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml");
+
+}
+
+// Destroys the object
+LLFloaterAbout::~LLFloaterAbout()
+{
+}
+
+BOOL LLFloaterAbout::postBuild()
+{
+ center();
+ LLViewerTextEditor *support_widget =
+ getChild<LLViewerTextEditor>("support_editor", true);
+
+ LLViewerTextEditor *credits_widget =
+ getChild<LLViewerTextEditor>("credits_editor", true);
+
+ getChild<LLUICtrl>("copy_btn")->setCommitCallback(
+ boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
+
+#if LL_WINDOWS
+ getWindow()->incBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+ LLSD info(getInfo());
+#if LL_WINDOWS
+ getWindow()->decBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+
+ std::ostringstream support;
+
+ // Render the LLSD from getInfo() as a format_map_t
+ LLStringUtil::format_map_t args;
+ // For reasons I don't yet understand, [ReleaseNotes] is not part of the
+ // default substitution strings whereas [APP_NAME] is. But it works to
+ // simply copy it into these specific args.
+ args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+ for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
+ ii != iend; ++ii)
+ {
+ if (! ii->second.isArray())
+ {
+ // Scalar value
+ if (ii->second.isUndefined())
+ {
+ args[ii->first] = getString("none");
+ }
+ else
+ {
+ // don't forget to render value asString()
+ args[ii->first] = ii->second.asString();
+ }
+ }
+ else
+ {
+ // array value: build KEY_0, KEY_1 etc. entries
+ for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
+ {
+ args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
+ }
+ }
+ }
+
+ // Now build the various pieces
+ support << getString("AboutHeader", args);
+ if (info.has("REGION"))
+ {
+ support << "\n\n" << getString("AboutPosition", args);
+ }
+ support << "\n\n" << getString("AboutSystem", args);
+ support << "\n";
+ if (info.has("GRAPHICS_DRIVER_VERSION"))
+ {
+ support << "\n" << getString("AboutDriver", args);
+ }
+ support << "\n" << getString("AboutLibs", args);
+ if (info.has("COMPILER"))
+ {
+ support << "\n" << getString("AboutCompiler", args);
+ }
+ if (info.has("PACKETS_IN"))
+ {
+ support << '\n' << getString("AboutTraffic", args);
+ }
+
+ support_widget->appendText(support.str(),
+ FALSE,
+ LLStyle::Params()
+ .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
+ support_widget->blockUndo();
+
+ // Fix views
+ support_widget->setEnabled(FALSE);
+ support_widget->startOfDoc();
+
+ credits_widget->setEnabled(FALSE);
+ credits_widget->startOfDoc();
+
+ return TRUE;
+}
+
+// static
+LLSD LLFloaterAbout::getInfo()
+{
+ // The point of having one method build an LLSD info block and the other
+ // construct the user-visible About string is to ensure that the same info
+ // is available to a getInfo() caller as to the user opening
+ // LLFloaterAbout.
+ LLSD info;
+ LLSD version;
+ version.append(LLVersionInfo::getMajor());
+ version.append(LLVersionInfo::getMinor());
+ version.append(LLVersionInfo::getPatch());
+ version.append(LLVersionInfo::getBuild());
+ info["VIEWER_VERSION"] = version;
+ info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion();
+ info["BUILD_DATE"] = __DATE__;
+ info["BUILD_TIME"] = __TIME__;
+ info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
+
+ info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
+
+#if LL_MSVC
+ info["COMPILER"] = "MSVC";
+ info["COMPILER_VERSION"] = _MSC_VER;
+#elif LL_GNUC
+ info["COMPILER"] = "GCC";
+ info["COMPILER_VERSION"] = GCC_VERSION;
+#endif
+
+ // Position
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ const LLVector3d &pos = gAgent.getPositionGlobal();
+ info["POSITION"] = ll_sd_from_vector3d(pos);
+ info["REGION"] = gAgent.getRegion()->getName();
+ info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
+ info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
+ info["SERVER_VERSION"] = gLastVersionChannel;
+ info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
+ }
+
+ // CPU
+ info["CPU"] = gSysCPU.getCPUString();
+ info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
+ // Moved hack adjustment to Windows memory size into llsys.cpp
+ info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
+ info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
+ info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
+
+#if LL_WINDOWS
+ LLSD driver_info = gDXHardware.getDisplayInfo();
+ if (driver_info.has("DriverVersion"))
+ {
+ info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
+ }
+#endif
+
+ info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
+ info["LIBCURL_VERSION"] = LLCurl::getVersionString();
+ info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
+ bool want_fullname = true;
+ info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
+ info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
+
+ // TODO: Implement media plugin version query
+ info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)";
+
+ if (gPacketsIn > 0)
+ {
+ info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
+ info["PACKETS_IN"] = F32(gPacketsIn);
+ info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
+ }
+
+ return info;
+}
+
+static std::string get_viewer_release_notes_url()
+{
+ LLSD query;
+ query["channel"] = gSavedSettings.getString("VersionChannelName");
+ query["version"] = LLVersionInfo::getVersion();
+
+ std::ostringstream url;
+ url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
+
+ return LLWeb::escapeURL(url.str());
+}
+
+class LLFloaterAboutListener: public LLEventAPI
+{
+public:
+ LLFloaterAboutListener():
+ LLEventAPI("LLFloaterAbout",
+ "LLFloaterAbout listener to retrieve About box info")
+ {
+ add("getInfo",
+ "Request an LLSD::Map containing information used to populate About box",
+ &LLFloaterAboutListener::getInfo,
+ LLSD().with("reply", LLSD()));
+ }
+
+private:
+ void getInfo(const LLSD& request) const
+ {
+ LLReqID reqid(request);
+ LLSD reply(LLFloaterAbout::getInfo());
+ reqid.stamp(reply);
+ LLEventPumps::instance().obtain(request["reply"]).post(reply);
+ }
+};
+
+static LLFloaterAboutListener floaterAboutListener;
+
+void LLFloaterAbout::onClickCopyToClipboard()
+{
+ LLViewerTextEditor *support_widget =
+ getChild<LLViewerTextEditor>("support_editor", true);
+ support_widget->selectAll();
+ support_widget->copy();
+ support_widget->deselect();
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterAboutUtil
+///----------------------------------------------------------------------------
+void LLFloaterAboutUtil::registerFloater()
+{
+ LLFloaterReg::add("sl_about", "floater_about.xml",
+ &LLFloaterReg::build<LLFloaterAbout>);
+
+}
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 55b7ed0c99..5ec58c8dd6 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -38,6 +38,7 @@
#include "lldatapacker.h"
#include "lldir.h"
#include "lleconomy.h"
+#include "llnotificationsutil.h"
#include "llvfile.h"
#include "llapr.h"
#include "llstring.h"
@@ -85,38 +86,40 @@ const F32 BASE_ANIM_TIME_OFFSET = 5.f;
std::string STATUS[] =
{
- "E_ST_OK",
- "E_ST_EOF",
- "E_ST_NO_CONSTRAINT",
- "E_ST_NO_FILE",
-"E_ST_NO_HIER",
-"E_ST_NO_JOINT",
-"E_ST_NO_NAME",
-"E_ST_NO_OFFSET",
-"E_ST_NO_CHANNELS",
-"E_ST_NO_ROTATION",
-"E_ST_NO_AXIS",
-"E_ST_NO_MOTION",
-"E_ST_NO_FRAMES",
-"E_ST_NO_FRAME_TIME",
-"E_ST_NO_POS",
-"E_ST_NO_ROT",
-"E_ST_NO_XLT_FILE",
-"E_ST_NO_XLT_HEADER",
-"E_ST_NO_XLT_NAME",
-"E_ST_NO_XLT_IGNORE",
-"E_ST_NO_XLT_RELATIVE",
-"E_ST_NO_XLT_OUTNAME",
-"E_ST_NO_XLT_MATRIX",
-"E_ST_NO_XLT_MERGECHILD",
-"E_ST_NO_XLT_MERGEPARENT",
-"E_ST_NO_XLT_PRIORITY",
-"E_ST_NO_XLT_LOOP",
-"E_ST_NO_XLT_EASEIN",
-"E_ST_NO_XLT_EASEOUT",
-"E_ST_NO_XLT_HAND",
-"E_ST_NO_XLT_EMOTE",
+ "E_ST_OK",
+ "E_ST_EOF",
+ "E_ST_NO_CONSTRAINT",
+ "E_ST_NO_FILE",
+ "E_ST_NO_HIER",
+ "E_ST_NO_JOINT",
+ "E_ST_NO_NAME",
+ "E_ST_NO_OFFSET",
+ "E_ST_NO_CHANNELS",
+ "E_ST_NO_ROTATION",
+ "E_ST_NO_AXIS",
+ "E_ST_NO_MOTION",
+ "E_ST_NO_FRAMES",
+ "E_ST_NO_FRAME_TIME",
+ "E_ST_NO_POS",
+ "E_ST_NO_ROT",
+ "E_ST_NO_XLT_FILE",
+ "E_ST_NO_XLT_HEADER",
+ "E_ST_NO_XLT_NAME",
+ "E_ST_NO_XLT_IGNORE",
+ "E_ST_NO_XLT_RELATIVE",
+ "E_ST_NO_XLT_OUTNAME",
+ "E_ST_NO_XLT_MATRIX",
+ "E_ST_NO_XLT_MERGECHILD",
+ "E_ST_NO_XLT_MERGEPARENT",
+ "E_ST_NO_XLT_PRIORITY",
+ "E_ST_NO_XLT_LOOP",
+ "E_ST_NO_XLT_EASEIN",
+ "E_ST_NO_XLT_EASEOUT",
+ "E_ST_NO_XLT_HAND",
+ "E_ST_NO_XLT_EMOTE",
+"E_ST_BAD_ROOT"
};
+
//-----------------------------------------------------------------------------
// LLFloaterAnimPreview()
//-----------------------------------------------------------------------------
@@ -207,7 +210,12 @@ BOOL LLFloaterAnimPreview::postBuild()
mPlayButton = getChild<LLButton>( "play_btn");
mPlayButton->setClickedCallback(onBtnPlay, this);
+ mPlayButton->setVisible(true);
+ mPauseButton = getChild<LLButton>( "pause_btn");
+ mPauseButton->setClickedCallback(onBtnPause, this);
+ mPauseButton->setVisible(false);
+
mStopButton = getChild<LLButton>( "stop_btn");
mStopButton->setClickedCallback(onBtnStop, this);
@@ -559,19 +567,35 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data)
if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
{
LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
-
+
if(!avatarp->isMotionActive(previewp->mMotionID))
{
previewp->resetMotion();
previewp->mPauseRequest = NULL;
}
- else
+ else if (avatarp->areAnimationsPaused())
+ {
+ previewp->mPauseRequest = NULL;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onBtnPause()
+//-----------------------------------------------------------------------------
+void LLFloaterAnimPreview::onBtnPause(void* user_data)
+{
+ LLFloaterAnimPreview* previewp = (LLFloaterAnimPreview*)user_data;
+ if (!previewp->getEnabled())
+ return;
+
+ if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
+ {
+ LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+
+ if(avatarp->isMotionActive(previewp->mMotionID))
{
- if (avatarp->areAnimationsPaused())
- {
- previewp->mPauseRequest = NULL;
- }
- else
+ if (!avatarp->areAnimationsPaused())
{
previewp->mPauseRequest = avatarp->requestPause();
}
@@ -907,9 +931,12 @@ bool LLFloaterAnimPreview::validateLoopOut(const LLSD& data)
//-----------------------------------------------------------------------------
void LLFloaterAnimPreview::refresh()
{
+ // Are we showing the play button (default) or the pause button?
+ bool show_play = true;
if (!mAnimPreview)
{
childShow("bad_animation_text");
+ // play button visible but disabled
mPlayButton->setEnabled(FALSE);
mStopButton->setEnabled(FALSE);
childDisable("ok_btn");
@@ -917,42 +944,35 @@ void LLFloaterAnimPreview::refresh()
else
{
childHide("bad_animation_text");
+ // re-enabled in case previous animation was bad
mPlayButton->setEnabled(TRUE);
+ mStopButton->setEnabled(TRUE);
LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
if (avatarp->isMotionActive(mMotionID))
{
mStopButton->setEnabled(TRUE);
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
- if (avatarp->areAnimationsPaused())
- {
-
- mPlayButton->setImages(std::string("button_anim_play.tga"),
- std::string("button_anim_play_selected.tga"));
-
- }
- else
+ if (!avatarp->areAnimationsPaused())
{
+ // animation is playing
if (motionp)
{
F32 fraction_complete = motionp->getLastUpdateTime() / motionp->getDuration();
childSetValue("playback_slider", fraction_complete);
}
- mPlayButton->setImages(std::string("button_anim_pause.tga"),
- std::string("button_anim_pause_selected.tga"));
-
+ show_play = false;
}
}
else
{
+ // Motion just finished playing
mPauseRequest = avatarp->requestPause();
- mPlayButton->setImages(std::string("button_anim_play.tga"),
- std::string("button_anim_play_selected.tga"));
-
- mStopButton->setEnabled(TRUE); // stop also resets, leave enabled.
}
childEnable("ok_btn");
mAnimPreview->requestUpdate();
}
+ mPlayButton->setVisible(show_play);
+ mPauseButton->setVisible(!show_play);
}
//-----------------------------------------------------------------------------
@@ -989,7 +1009,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
name,
desc,
0,
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
LLInventoryType::IT_ANIMATION,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
name,
@@ -998,7 +1018,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
else
{
llwarns << "Failure writing animation data." << llendl;
- LLNotifications::instance().add("WriteAnimationFail");
+ LLNotificationsUtil::add("WriteAnimationFail");
}
}
diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h
index f1c4a6b0d0..3ee1f419ab 100644
--- a/indra/newview/llfloateranimpreview.h
+++ b/indra/newview/llfloateranimpreview.h
@@ -33,6 +33,7 @@
#ifndef LL_LLFLOATERANIMPREVIEW_H
#define LL_LLFLOATERANIMPREVIEW_H
+#include "llassettype.h"
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "llcharacter.h"
@@ -87,6 +88,7 @@ public:
void refresh();
static void onBtnPlay(void*);
+ static void onBtnPause(void*);
static void onBtnStop(void*);
static void onSliderMove(LLUICtrl*, void*);
static void onCommitBaseAnim(LLUICtrl*, void*);
@@ -119,12 +121,12 @@ protected:
S32 mLastMouseX;
S32 mLastMouseY;
LLButton* mPlayButton;
+ LLButton* mPauseButton;
LLButton* mStopButton;
LLRect mPreviewRect;
LLRectf mPreviewImageRect;
LLAssetID mMotionID;
LLTransactionID mTransactionID;
- BOOL mEnabled;
LLAnimPauseRequest mPauseRequest;
std::map<std::string, LLUUID> mIDList;
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 262dc1804d..698ccec9c1 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -35,7 +35,6 @@
#include "llfloaterauction.h"
#include "llfloaterregioninfo.h"
-#include "lldir.h"
#include "llgl.h"
#include "llimagej2c.h"
#include "llimagetga.h"
@@ -43,10 +42,12 @@
#include "llvfile.h"
#include "llvfs.h"
#include "llwindow.h"
+#include "message.h"
#include "llagent.h"
#include "llcombobox.h"
-#include "llnotify.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llsavedsettingsglue.h"
#include "llviewertexturelist.h"
#include "llviewerparcelmgr.h"
@@ -188,8 +189,8 @@ void LLFloaterAuction::onClickSnapshot(void* data)
gForceRenderLandFence = self->childGetValue("fence_check").asBoolean();
BOOL success = gViewerWindow->rawSnapshot(raw,
- gViewerWindow->getWindowWidth(),
- gViewerWindow->getWindowHeight(),
+ gViewerWindow->getWindowWidthScaled(),
+ gViewerWindow->getWindowHeightScaled(),
TRUE, FALSE,
FALSE, FALSE);
gForceRenderLandFence = FALSE;
@@ -251,7 +252,7 @@ void LLFloaterAuction::onClickStartAuction(void* data)
FALSE);
self->getWindow()->incBusyCount();
- LLNotifications::instance().add("UploadingAuctionSnapshot");
+ LLNotificationsUtil::add("UploadingAuctionSnapshot");
}
LLMessageSystem* msg = gMessageSystem;
@@ -478,7 +479,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)
// Sell confirmation clicked
bool LLFloaterAuction::onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
doSellToAnyone();
@@ -543,13 +544,13 @@ void auction_tga_upload_done(const LLUUID& asset_id, void* user_data, S32 status
if (0 == status)
{
- LLNotifications::instance().add("UploadWebSnapshotDone");
+ LLNotificationsUtil::add("UploadWebSnapshotDone");
}
else
{
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("UploadAuctionSnapshotFail", args);
+ LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
}
}
@@ -564,12 +565,12 @@ void auction_j2c_upload_done(const LLUUID& asset_id, void* user_data, S32 status
if (0 == status)
{
- LLNotifications::instance().add("UploadSnapshotDone");
+ LLNotificationsUtil::add("UploadSnapshotDone");
}
else
{
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("UploadAuctionSnapshotFail", args);
+ LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
}
}
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index ccfe7d4b64..a0b2de85f0 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -35,12 +35,14 @@
// Viewer includes
#include "llagent.h"
+#include "llcallingcard.h"
#include "llfocusmgr.h"
#include "llfloaterreg.h"
#include "llviewercontrol.h"
#include "llworld.h"
// Linden libraries
+#include "llbutton.h"
#include "lllineeditor.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -49,20 +51,28 @@
#include "lluictrlfactory.h"
#include "message.h"
-LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
- void* userdata,
+LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,
BOOL allow_multiple,
BOOL closeOnSelect)
{
// *TODO: Use a key to allow this not to be an effective singleton
- LLFloaterAvatarPicker* floater = LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+ LLFloaterAvatarPicker* floater =
+ LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
- floater->mCallback = callback;
- floater->mCallbackUserdata = userdata;
+ floater->mSelectionCallback = callback;
floater->setAllowMultiple(allow_multiple);
floater->mNearMeListComplete = FALSE;
floater->mCloseOnSelect = closeOnSelect;
+ if (!closeOnSelect)
+ {
+ // Use Select/Close
+ std::string select_string = floater->getString("Select");
+ std::string close_string = floater->getString("Close");
+ floater->getChild<LLButton>("ok_btn")->setLabel(select_string);
+ floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);
+ }
+
return floater;
}
@@ -70,36 +80,38 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)
: LLFloater(key),
mNumResultsReturned(0),
- mCallback(NULL),
- mCallbackUserdata(NULL),
mNearMeListComplete(FALSE),
mCloseOnSelect(FALSE)
{
// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_avatar_picker.xml");
+ mCommitCallbackRegistrar.add("Refresh.FriendList", boost::bind(&LLFloaterAvatarPicker::populateFriend, this));
}
BOOL LLFloaterAvatarPicker::postBuild()
{
- getChild<LLLineEditor>("Edit")->setKeystrokeCallback(editKeystroke, this);
+ getChild<LLLineEditor>("Edit")->setKeystrokeCallback( boost::bind(&LLFloaterAvatarPicker::editKeystroke, this, _1, _2),NULL);
- childSetAction("Find", onBtnFind, this);
+ childSetAction("Find", boost::bind(&LLFloaterAvatarPicker::onBtnFind, this));
childDisable("Find");
- childSetAction("Refresh", onBtnRefresh, this);
- childSetCommitCallback("near_me_range", onRangeAdjust, this);
+ childSetAction("Refresh", boost::bind(&LLFloaterAvatarPicker::onBtnRefresh, this));
+ getChild<LLUICtrl>("near_me_range")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onRangeAdjust, this));
LLScrollListCtrl* searchresults = getChild<LLScrollListCtrl>("SearchResults");
- searchresults->setDoubleClickCallback(onBtnSelect, this);
- childSetCommitCallback("SearchResults", onList, this);
+ searchresults->setDoubleClickCallback( boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
+ searchresults->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
childDisable("SearchResults");
LLScrollListCtrl* nearme = getChild<LLScrollListCtrl>("NearMe");
- nearme->setDoubleClickCallback(onBtnSelect, this);
- childSetCommitCallback("NearMe", onList, this);
-
- childSetAction("Select", onBtnSelect, this);
- childDisable("Select");
+ nearme->setDoubleClickCallback(boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
+ nearme->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
- childSetAction("Cancel", onBtnClose, this);
+ LLScrollListCtrl* friends = getChild<LLScrollListCtrl>("Friends");
+ friends->setDoubleClickCallback(boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
+ getChild<LLUICtrl>("Friends")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
+
+ childSetAction("ok_btn", boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
+ childDisable("ok_btn");
+ childSetAction("cancel_btn", boost::bind(&LLFloaterAvatarPicker::onBtnClose, this));
childSetFocus("Edit");
@@ -119,12 +131,19 @@ BOOL LLFloaterAvatarPicker::postBuild()
center();
+ populateFriend();
+
return TRUE;
}
+void LLFloaterAvatarPicker::setOkBtnEnableCb(validate_callback_t cb)
+{
+ mOkButtonValidateSignal.connect(cb);
+}
+
void LLFloaterAvatarPicker::onTabChanged()
{
- childSetEnabled("Select", visibleItemsSelected());
+ childSetEnabled("ok_btn", isSelectBtnEnabled());
}
// Destroys the object
@@ -133,10 +152,9 @@ LLFloaterAvatarPicker::~LLFloaterAvatarPicker()
gFocusMgr.releaseFocusIfNeeded( this );
}
-void LLFloaterAvatarPicker::onBtnFind(void* userdata)
+void LLFloaterAvatarPicker::onBtnFind()
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
- if(self) self->find();
+ find();
}
static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, std::vector<LLUUID>& avatar_ids)
@@ -153,69 +171,73 @@ static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std:
}
}
-void LLFloaterAvatarPicker::onBtnSelect(void* userdata)
+void LLFloaterAvatarPicker::onBtnSelect()
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
- if(self->mCallback)
- {
- LLPanel* active_panel = self->childGetVisibleTab("ResidentChooserTabs");
+ // If select btn not enabled then do not callback
+ if (!isSelectBtnEnabled())
+ return;
- if(active_panel == self->getChild<LLPanel>("SearchPanel"))
+ if(mSelectionCallback)
+ {
+ std::string acvtive_panel_name;
+ LLScrollListCtrl* list = NULL;
+ LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs");
+ if(active_panel)
{
- std::vector<std::string> avatar_names;
- std::vector<LLUUID> avatar_ids;
- getSelectedAvatarData(self->getChild<LLScrollListCtrl>("SearchResults"), avatar_names, avatar_ids);
- self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata);
+ acvtive_panel_name = active_panel->getName();
}
- else if(active_panel == self->getChild<LLPanel>("NearMePanel"))
+ if(acvtive_panel_name == "SearchPanel")
+ {
+ list = getChild<LLScrollListCtrl>("SearchResults");
+ }
+ else if(acvtive_panel_name == "NearMePanel")
+ {
+ list = getChild<LLScrollListCtrl>("NearMe");
+ }
+ else if (acvtive_panel_name == "FriendsPanel")
+ {
+ list = getChild<LLScrollListCtrl>("Friends");
+ }
+
+ if(list)
{
std::vector<std::string> avatar_names;
std::vector<LLUUID> avatar_ids;
- getSelectedAvatarData(self->getChild<LLScrollListCtrl>("NearMe"), avatar_names, avatar_ids);
- self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata);
+ getSelectedAvatarData(list, avatar_names, avatar_ids);
+ mSelectionCallback(avatar_names, avatar_ids);
}
}
- self->getChild<LLScrollListCtrl>("SearchResults")->deselectAllItems(TRUE);
- self->getChild<LLScrollListCtrl>("NearMe")->deselectAllItems(TRUE);
- if(self->mCloseOnSelect)
+ getChild<LLScrollListCtrl>("SearchResults")->deselectAllItems(TRUE);
+ getChild<LLScrollListCtrl>("NearMe")->deselectAllItems(TRUE);
+ getChild<LLScrollListCtrl>("Friends")->deselectAllItems(TRUE);
+ if(mCloseOnSelect)
{
- self->mCloseOnSelect = FALSE;
- self->closeFloater();
+ mCloseOnSelect = FALSE;
+ closeFloater();
}
}
-void LLFloaterAvatarPicker::onBtnRefresh(void* userdata)
+void LLFloaterAvatarPicker::onBtnRefresh()
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
- if (!self)
- {
- return;
- }
-
- self->getChild<LLScrollListCtrl>("NearMe")->deleteAllItems();
- self->getChild<LLScrollListCtrl>("NearMe")->setCommentText(self->getString("searching"));
- self->mNearMeListComplete = FALSE;
+ getChild<LLScrollListCtrl>("NearMe")->deleteAllItems();
+ getChild<LLScrollListCtrl>("NearMe")->setCommentText(getString("searching"));
+ mNearMeListComplete = FALSE;
}
-void LLFloaterAvatarPicker::onBtnClose(void* userdata)
+void LLFloaterAvatarPicker::onBtnClose()
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
- if(self) self->closeFloater();
+ closeFloater();
}
-void LLFloaterAvatarPicker::onRangeAdjust(LLUICtrl* source, void* data)
+void LLFloaterAvatarPicker::onRangeAdjust()
{
- LLFloaterAvatarPicker::onBtnRefresh(data);
+ onBtnRefresh();
}
-void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata)
+void LLFloaterAvatarPicker::onList()
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
- if (self)
- {
- self->childSetEnabled("Select", self->visibleItemsSelected());
- }
+ childSetEnabled("ok_btn", isSelectBtnEnabled());
}
void LLFloaterAvatarPicker::populateNearMe()
@@ -250,15 +272,15 @@ void LLFloaterAvatarPicker::populateNearMe()
if (empty)
{
childDisable("NearMe");
- childDisable("Select");
+ childDisable("ok_btn");
near_me_scroller->setCommentText(getString("no_one_near"));
}
else
{
childEnable("NearMe");
- childEnable("Select");
+ childEnable("ok_btn");
near_me_scroller->selectFirstItem();
- onList(near_me_scroller, this);
+ onList();
near_me_scroller->setFocus(TRUE);
}
@@ -268,6 +290,26 @@ void LLFloaterAvatarPicker::populateNearMe()
}
}
+void LLFloaterAvatarPicker::populateFriend()
+{
+ LLScrollListCtrl* friends_scroller = getChild<LLScrollListCtrl>("Friends");
+ friends_scroller->deleteAllItems();
+ LLCollectAllBuddies collector;
+ LLAvatarTracker::instance().applyFunctor(collector);
+ LLCollectAllBuddies::buddy_map_t::iterator it;
+
+
+ for(it = collector.mOnline.begin(); it!=collector.mOnline.end(); it++)
+ {
+ friends_scroller->addStringUUIDItem(it->first, it->second);
+ }
+ for(it = collector.mOffline.begin(); it!=collector.mOffline.end(); it++)
+ {
+ friends_scroller->addStringUUIDItem(it->first, it->second);
+ }
+ friends_scroller->sortByColumnIndex(0, TRUE);
+}
+
void LLFloaterAvatarPicker::draw()
{
LLFloater::draw();
@@ -289,6 +331,10 @@ BOOL LLFloaterAvatarPicker::visibleItemsSelected() const
{
return getChild<LLScrollListCtrl>("NearMe")->getFirstSelectedIndex() >= 0;
}
+ else if(active_panel == getChild<LLPanel>("FriendsPanel"))
+ {
+ return getChild<LLScrollListCtrl>("Friends")->getFirstSelectedIndex() >= 0;
+ }
return FALSE;
}
@@ -313,7 +359,7 @@ void LLFloaterAvatarPicker::find()
getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems();
getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching"));
- childSetEnabled("Select", FALSE);
+ childSetEnabled("ok_btn", FALSE);
mNumResultsReturned = 0;
}
@@ -321,6 +367,7 @@ void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple)
{
getChild<LLScrollListCtrl>("SearchResults")->setAllowMultipleSelection(allow_multiple);
getChild<LLScrollListCtrl>("NearMe")->setAllowMultipleSelection(allow_multiple);
+ getChild<LLScrollListCtrl>("Friends")->setAllowMultipleSelection(allow_multiple);
}
// static
@@ -369,7 +416,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
map["[TEXT]"] = floater->childGetText("Edit");
avatar_name = floater->getString("not_found", map);
search_results->setEnabled(FALSE);
- floater->childDisable("Select");
+ floater->childDisable("ok_btn");
}
else
{
@@ -385,9 +432,9 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
if (found_one)
{
- floater->childEnable("Select");
+ floater->childEnable("ok_btn");
search_results->selectFirstItem();
- floater->onList(search_results, floater);
+ floater->onList();
search_results->setFocus(TRUE);
}
}
@@ -395,8 +442,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
//static
void LLFloaterAvatarPicker::editKeystroke(LLLineEditor* caller, void* user_data)
{
- LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)user_data;
- self->childSetEnabled("Find", caller->getText().size() >= 3);
+ childSetEnabled("Find", caller->getText().size() >= 3);
}
// virtual
@@ -406,11 +452,11 @@ BOOL LLFloaterAvatarPicker::handleKeyHere(KEY key, MASK mask)
{
if (childHasFocus("Edit"))
{
- onBtnFind(this);
+ onBtnFind();
}
else
{
- onBtnSelect(this);
+ onBtnSelect();
}
return TRUE;
}
@@ -422,3 +468,43 @@ BOOL LLFloaterAvatarPicker::handleKeyHere(KEY key, MASK mask)
return LLFloater::handleKeyHere(key, mask);
}
+
+bool LLFloaterAvatarPicker::isSelectBtnEnabled()
+{
+ bool ret_val = visibleItemsSelected();
+
+ if ( ret_val && mOkButtonValidateSignal.num_slots() )
+ {
+ std::string acvtive_panel_name;
+ LLScrollListCtrl* list = NULL;
+ LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs");
+
+ if(active_panel)
+ {
+ acvtive_panel_name = active_panel->getName();
+ }
+
+ if(acvtive_panel_name == "SearchPanel")
+ {
+ list = getChild<LLScrollListCtrl>("SearchResults");
+ }
+ else if(acvtive_panel_name == "NearMePanel")
+ {
+ list = getChild<LLScrollListCtrl>("NearMe");
+ }
+ else if (acvtive_panel_name == "FriendsPanel")
+ {
+ list = getChild<LLScrollListCtrl>("Friends");
+ }
+
+ if(list)
+ {
+ std::vector<LLUUID> avatar_ids;
+ std::vector<std::string> avatar_names;
+ getSelectedAvatarData(list, avatar_names, avatar_ids);
+ return mOkButtonValidateSignal(avatar_ids);
+ }
+ }
+
+ return ret_val;
+}
diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h
index 85aacb68a5..e35466cec8 100644
--- a/indra/newview/llfloateravatarpicker.h
+++ b/indra/newview/llfloateravatarpicker.h
@@ -40,11 +40,13 @@
class LLFloaterAvatarPicker : public LLFloater
{
public:
- // Call this to select an avatar.
+ typedef boost::signals2::signal<bool(const std::vector<LLUUID>&), boost_boolean_combiner> validate_signal_t;
+ typedef validate_signal_t::slot_type validate_callback_t;
+
// The callback function will be called with an avatar name and UUID.
- typedef void(*callback_t)(const std::vector<std::string>&, const std::vector<LLUUID>&, void*);
- static LLFloaterAvatarPicker* show(callback_t callback,
- void* userdata,
+ typedef boost::function<void (const std::vector<std::string>&, const std::vector<LLUUID>&)> select_callback_t;
+ // Call this to select an avatar.
+ static LLFloaterAvatarPicker* show(select_callback_t callback,
BOOL allow_multiple = FALSE,
BOOL closeOnSelect = FALSE);
@@ -53,20 +55,24 @@ public:
virtual BOOL postBuild();
+ void setOkBtnEnableCb(validate_callback_t cb);
+
static void processAvatarPickerReply(class LLMessageSystem* msg, void**);
private:
- static void editKeystroke(class LLLineEditor* caller, void* user_data);
-
- static void onBtnFind(void* userdata);
- static void onBtnSelect(void* userdata);
- static void onBtnRefresh(void* userdata);
- static void onRangeAdjust(LLUICtrl* source, void* data);
- static void onBtnClose(void* userdata);
- static void onList(class LLUICtrl* ctrl, void* userdata);
- void onTabChanged();
-
+ void editKeystroke(class LLLineEditor* caller, void* user_data);
+
+ void onBtnFind();
+ void onBtnSelect();
+ void onBtnRefresh();
+ void onRangeAdjust();
+ void onBtnClose();
+ void onList();
+ void onTabChanged();
+ bool isSelectBtnEnabled();
+
void populateNearMe();
+ void populateFriend();
BOOL visibleItemsSelected() const; // Returns true if any items in the current tab are selected.
void find();
@@ -80,8 +86,8 @@ private:
BOOL mNearMeListComplete;
BOOL mCloseOnSelect;
- void (*mCallback)(const std::vector<std::string>& name, const std::vector<LLUUID>& id, void* userdata);
- void* mCallbackUserdata;
+ validate_signal_t mOkButtonValidateSignal;
+ select_callback_t mSelectionCallback;
};
#endif
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index a73ebf4e06..b2f700069f 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -43,12 +43,12 @@
#include "llviewerregion.h"
#include "lscript_rt_interface.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
#include "llresmgr.h"
#include "llbutton.h"
#include "lldir.h"
-#include "llfloaterchat.h"
#include "llviewerstats.h"
#include "lluictrlfactory.h"
#include "llselectmgr.h"
@@ -72,8 +72,6 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)
BOOL LLFloaterBulkPermission::postBuild()
{
-// childSetAction("help", onHelpBtn, this); // this is not in use
-
return TRUE;
}
@@ -157,12 +155,6 @@ void LLFloaterBulkPermission::onApplyBtn()
doApply();
}
-// angela -- this is not in use
-//void LLFloaterBulkPermission::onHelpBtn(void* user_data)
-//{
-// LLNotifications::instance().add("HelpBulkPermission");
-//}
-
void LLFloaterBulkPermission::onCloseBtn()
{
closeFloater();
@@ -272,7 +264,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent
( asstype == LLAssetType::AT_BODYPART && gSavedSettings.getBOOL("BulkChangeIncludeBodyParts" )) ||
( asstype == LLAssetType::AT_CLOTHING && gSavedSettings.getBOOL("BulkChangeIncludeClothing" )) ||
( asstype == LLAssetType::AT_GESTURE && gSavedSettings.getBOOL("BulkChangeIncludeGestures" )) ||
- ( asstype == LLAssetType::AT_FAVORITE && gSavedSettings.getBOOL("BulkChangeIncludeFavourite" )) ||
( asstype == LLAssetType::AT_NOTECARD && gSavedSettings.getBOOL("BulkChangeIncludeNotecards" )) ||
( asstype == LLAssetType::AT_OBJECT && gSavedSettings.getBOOL("BulkChangeIncludeObjects" )) ||
( asstype == LLAssetType::AT_LSL_TEXT && gSavedSettings.getBOOL("BulkChangeIncludeScripts" )) ||
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index c34e4413cc..bffcff7059 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -44,8 +44,6 @@
#include "llfloater.h"
#include "llscrolllistctrl.h"
-#include "llviewerinventory.h"
-
class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener
{
friend class LLFloaterReg;
@@ -79,7 +77,6 @@ private:
U8 key,
bool is_new);
-// static void onHelpBtn(void* user_data);
void onCloseBtn();
void onApplyBtn();
void onCommitCopy();
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 8b64f913e0..e925796526 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -33,14 +33,13 @@
#include "llviewerprecompiledheaders.h"
-#include "llfloaterbump.h"
+#include "llsd.h"
+#include "mean_collision_data.h"
+#include "llfloaterbump.h"
#include "llscrolllistctrl.h"
-
-#include "llsd.h"
#include "lluictrlfactory.h"
#include "llviewermessage.h"
-#include "llappviewer.h" // gPacificDaylightTime
///----------------------------------------------------------------------------
/// Class LLFloaterBump
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 9d07362edc..fba557c656 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -41,10 +41,11 @@
#include "llfloaterbuy.h"
#include "llagent.h" // for agent id
-#include "llalertdialog.h"
#include "llinventorymodel.h" // for gInventory
#include "llfloaterreg.h"
#include "llfloaterinventory.h" // for get_item_icon
+#include "llinventoryfunctions.h"
+#include "llnotificationsutil.h"
#include "llselectmgr.h"
#include "llscrolllistctrl.h"
#include "llviewerobject.h"
@@ -98,7 +99,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
if (selection->getRootObjectCount() != 1)
{
- LLNotifications::instance().add("BuyOneObjectOnly");
+ LLNotificationsUtil::add("BuyOneObjectOnly");
return;
}
@@ -135,7 +136,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
if (!owners_identical)
{
- LLNotifications::instance().add("BuyObjectOneOwner");
+ LLNotificationsUtil::add("BuyObjectOneOwner");
return;
}
@@ -229,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
if (obj->getType() == LLAssetType::AT_CATEGORY)
continue;
- // Skip root folders, so we know we have inventory items only
- if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY)
- continue;
-
// Skip the mysterious blank InventoryObject
if (obj->getType() == LLAssetType::AT_NONE)
continue;
@@ -292,7 +289,7 @@ void LLFloaterBuy::onClickBuy()
{
// Put the items where we put new folders.
LLUUID category_id;
- category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+ category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
// *NOTE: doesn't work for multiple object buy, which UI does not
// currently support sale info is used for verification only, if
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 3a4171c6be..0daef27af2 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -43,11 +43,12 @@
#include "llcachename.h"
#include "llagent.h" // for agent id
-#include "llalertdialog.h"
#include "llcheckboxctrl.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h" // for gInventory
#include "llfloaterreg.h"
#include "llfloaterinventory.h" // for get_item_icon
+#include "llnotificationsutil.h"
#include "llselectmgr.h"
#include "llscrolllistctrl.h"
#include "llviewerobject.h"
@@ -94,7 +95,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
if (selection->getRootObjectCount() != 1)
{
- LLNotifications::instance().add("BuyContentsOneOnly");
+ LLNotificationsUtil::add("BuyContentsOneOnly");
return;
}
@@ -113,7 +114,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
if (!owners_identical)
{
- LLNotifications::instance().add("BuyContentsOneOwner");
+ LLNotificationsUtil::add("BuyContentsOneOwner");
return;
}
@@ -186,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
if (asset_type == LLAssetType::AT_CATEGORY)
continue;
- // Skip root folders, so we know we have inventory items only
- if (asset_type == LLAssetType::AT_ROOT_CATEGORY)
- continue;
-
LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));
inv_type = inv_item->getInventoryType();
@@ -280,12 +277,12 @@ void LLFloaterBuyContents::onClickBuy()
// We may want to wear this item
if (childGetValue("wear_check"))
{
- LLFloaterInventory::sWearNewClothing = TRUE;
+ LLInventoryState::sWearNewClothing = TRUE;
}
// Put the items where we put new folders.
LLUUID category_id;
- category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY);
+ category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);
// *NOTE: doesn't work for multiple object buy, which UI does not
// currently support sale info is used for verification only, if
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 651122f20a..1642e6725e 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -38,6 +38,7 @@
#include "llcurrencyuimanager.h"
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
#include "llstatusbar.h"
#include "lltextbox.h"
#include "llviewchildren.h"
@@ -152,7 +153,7 @@ void LLFloaterBuyCurrencyUI::draw()
{
if (mManager.bought())
{
- LLNotifications::instance().add("BuyLindenDollarSuccess");
+ LLNotificationsUtil::add("BuyLindenDollarSuccess");
closeFloater();
return;
}
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 36f0315790..d37bc01885 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -48,7 +48,7 @@
#include "llframetimer.h"
#include "lliconctrl.h"
#include "lllineeditor.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llslurl.h"
#include "llstatusbar.h"
@@ -82,7 +82,10 @@ public:
virtual ~LLFloaterBuyLandUI();
/*virtual*/ void onClose(bool app_quitting);
-
+
+ // Left padding for maturity rating icon.
+ static const S32 ICON_PAD = 2;
+
private:
class SelectionObserver : public LLParcelObserver
{
@@ -215,7 +218,7 @@ void LLFloaterBuyLand::buyLand(
{
if(is_for_group && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED))
{
- LLNotifications::instance().add("OnlyOfficerCanBuyLand");
+ LLNotificationsUtil::add("OnlyOfficerCanBuyLand");
return;
}
@@ -493,10 +496,33 @@ void LLFloaterBuyLandUI::updateCovenantInfo()
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if(!region) return;
+ U8 sim_access = region->getSimAccess();
+ std::string rating = LLViewerRegion::accessToString(sim_access);
+
LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
if (region_name)
{
- region_name->setText(region->getName());
+ std::string region_name_txt = region->getName() + " ("+rating +")";
+ region_name->setText(region_name_txt);
+
+ LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");
+ LLRect rect = rating_icon->getRect();
+ S32 icon_left_pad = region_name->getRect().mLeft + region_name->getTextBoundingRect().getWidth() + ICON_PAD;
+ rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ rating_icon->setValue(getString("icon_PG"));
+ break;
+
+ case SIM_ACCESS_ADULT:
+ rating_icon->setValue(getString("icon_R"));
+ break;
+
+ default:
+ rating_icon->setValue(getString("icon_M"));
+ }
}
LLTextBox* region_type = getChild<LLTextBox>("region_type_text");
@@ -685,7 +711,14 @@ void LLFloaterBuyLandUI::finishWebSiteInfo()
mSiteLandUseAction = landUse["action"].asString();
LLXMLRPCValue currency = result["currency"];
- mCurrency.setEstimate(currency["estimatedCost"].asInt());
+ if (currency["estimatedCost"].isValid())
+ {
+ mCurrency.setUSDEstimate(currency["estimatedCost"].asInt());
+ }
+ if (currency["estimatedLocalCost"].isValid())
+ {
+ mCurrency.setLocalEstimate(currency["estimatedLocalCost"].asString());
+ }
mSiteConfirm = result["confirm"].asString();
}
@@ -733,7 +766,8 @@ void LLFloaterBuyLandUI::runWebSitePrep(const std::string& password)
keywordArgs.appendInt("billableArea",
mIsForGroup ? 0 : mParcelBillableArea);
keywordArgs.appendInt("currencyBuy", mCurrency.getAmount());
- keywordArgs.appendInt("estimatedCost", mCurrency.getEstimate());
+ keywordArgs.appendInt("estimatedCost", mCurrency.getUSDEstimate());
+ keywordArgs.appendString("estimatedLocalCost", mCurrency.getLocalEstimate());
keywordArgs.appendString("confirm", mSiteConfirm);
if (!password.empty())
{
@@ -895,7 +929,7 @@ void LLFloaterBuyLandUI::tellUserError(
// virtual
BOOL LLFloaterBuyLandUI::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
mCurrency.prepare();
@@ -964,7 +998,7 @@ BOOL LLFloaterBuyLandUI::canClose()
if (!can_close)
{
// explain to user why they can't do this, see DEV-9605
- LLNotifications::instance().add("CannotCloseFloaterBuyLand");
+ LLNotificationsUtil::add("CannotCloseFloaterBuyLand");
}
return can_close;
}
@@ -1217,7 +1251,7 @@ void LLFloaterBuyLandUI::refreshUI()
childSetText("currency_reason", getString("not_enough_lindens", string_args));
- childSetTextArg("currency_est", "[AMOUNT2]", llformat("%#.2f", mCurrency.getEstimate() / 100.0));
+ childSetTextArg("currency_est", "[LOCAL_AMOUNT]", mCurrency.getLocalEstimate());
}
if (willHaveEnough)
@@ -1297,7 +1331,7 @@ void LLFloaterBuyLandUI::startBuyPreConfirm()
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d", mCurrency.getAmount());
- string_args["[AMOUNT2]"] = llformat("%#.2f", mCurrency.getEstimate() / 100.0);
+ string_args["[LOCAL_AMOUNT]"] = mCurrency.getLocalEstimate();
action += getString("buy_for_US", string_args);
}
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index d1317f7c36..ecb6254f8a 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -40,10 +40,12 @@
// Viewer includes
#include "lljoystickbutton.h"
#include "llviewercontrol.h"
+#include "llviewercamera.h"
#include "llbottomtray.h"
#include "llagent.h"
#include "lltoolmgr.h"
#include "lltoolfocus.h"
+#include "llslider.h"
// Constants
const F32 CAMERA_BUTTON_DELAY = 0.0f;
@@ -54,6 +56,88 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
#define PRESETS "camera_presets"
#define CONTROLS "controls"
+// Zoom the camera in and out
+class LLPanelCameraZoom
+: public LLPanel
+{
+ LOG_CLASS(LLPanelCameraZoom);
+public:
+ LLPanelCameraZoom();
+
+ /* virtual */ BOOL postBuild();
+ /* virtual */ void draw();
+
+protected:
+ void onZoomPlusHeldDown();
+ void onZoomMinusHeldDown();
+ void onSliderValueChanged();
+
+private:
+ LLButton* mPlusBtn;
+ LLButton* mMinusBtn;
+ LLSlider* mSlider;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
+
+//-------------------------------------------------------------------------------
+// LLPanelCameraZoom
+//-------------------------------------------------------------------------------
+
+LLPanelCameraZoom::LLPanelCameraZoom()
+: mPlusBtn( NULL ),
+ mMinusBtn( NULL ),
+ mSlider( NULL )
+{
+ mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
+ mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+ mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
+}
+
+BOOL LLPanelCameraZoom::postBuild()
+{
+ mPlusBtn = getChild <LLButton> ("zoom_plus_btn");
+ mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
+ mSlider = getChild <LLSlider> ("zoom_slider");
+ return LLPanel::postBuild();
+}
+
+void LLPanelCameraZoom::draw()
+{
+ mSlider->setValue(gAgent.getCameraZoomFraction());
+ LLPanel::draw();
+}
+
+void LLPanelCameraZoom::onZoomPlusHeldDown()
+{
+ F32 val = mSlider->getValueF32();
+ F32 inc = mSlider->getIncrement();
+ mSlider->setValue(val - inc);
+ // commit only if value changed
+ if (val != mSlider->getValueF32())
+ mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onZoomMinusHeldDown()
+{
+ F32 val = mSlider->getValueF32();
+ F32 inc = mSlider->getIncrement();
+ mSlider->setValue(val + inc);
+ // commit only if value changed
+ if (val != mSlider->getValueF32())
+ mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onSliderValueChanged()
+{
+ F32 zoom_level = mSlider->getValueF32();
+ gAgent.setCameraZoomFraction(zoom_level);
+}
+
+void activate_camera_tool()
+{
+ LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
+};
//
// Member functions
@@ -62,7 +146,7 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
/*static*/ bool LLFloaterCamera::inFreeCameraMode()
{
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA)
+ if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
{
return true;
}
@@ -88,27 +172,17 @@ void LLFloaterCamera::update()
}
-/*static*/ void LLFloaterCamera::updateIfNotInAvatarViewMode()
-{
- LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && !floater_camera->inAvatarViewMode())
- {
- floater_camera->update();
- }
-}
-
-
void LLFloaterCamera::toPrevMode()
{
switchMode(mPrevMode);
}
-/*static*/ void LLFloaterCamera::toPrevModeIfInAvatarViewMode()
+/*static*/ void LLFloaterCamera::onLeavingMouseLook()
{
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && floater_camera->inAvatarViewMode())
+ if (floater_camera && floater_camera->inFreeCameraMode())
{
- floater_camera->toPrevMode();
+ activate_camera_tool();
}
}
@@ -125,17 +199,39 @@ void LLFloaterCamera::onOpen(const LLSD& key)
anchor_panel, this,
getDockTongue(), LLDockControl::TOP));
+ mZoom->onOpen(key);
+
+ // Returns to previous mode, see EXT-2727(View tool should remember state).
+ // In case floater was just hidden and it isn't reset the mode
+ // just update state to current one. Else go to previous.
+ if ( !mClosed )
+ updateState();
+ else
+ toPrevMode();
+ mClosed = FALSE;
}
void LLFloaterCamera::onClose(bool app_quitting)
{
//We don't care of camera mode if app is quitting
- if(!app_quitting)
- switchMode(CAMERA_CTRL_MODE_ORBIT);
+ if(app_quitting)
+ return;
+ // When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+ // switchMode won't modify mPrevMode, so force it here.
+ // It is needed to correctly return to previous mode on open, see EXT-2727.
+ if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
+ mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+
+ // HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
+ if ( !isDocked() )
+ setDocked(true);
+ switchMode(CAMERA_CTRL_MODE_ORBIT);
+ mClosed = TRUE;
}
LLFloaterCamera::LLFloaterCamera(const LLSD& val)
: LLTransientDockableFloater(NULL, true, val),
+ mClosed(FALSE),
mCurrMode(CAMERA_CTRL_MODE_ORBIT),
mPrevMode(CAMERA_CTRL_MODE_ORBIT)
{
@@ -147,7 +243,7 @@ BOOL LLFloaterCamera::postBuild()
setIsChrome(TRUE);
mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
- mZoom = getChild<LLJoystickCameraZoom>(ZOOM);
+ mZoom = getChild<LLPanelCameraZoom>(ZOOM);
mTrack = getChild<LLJoystickCameraTrack>(PAN);
assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn");
@@ -214,7 +310,7 @@ void LLFloaterCamera::switchMode(ECameraControlMode mode)
break;
case CAMERA_CTRL_MODE_FREE_CAMERA:
- LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
+ activate_camera_tool();
break;
case CAMERA_CTRL_MODE_AVATAR_VIEW:
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 583f279e62..45d5e9a845 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -39,6 +39,7 @@ class LLJoystickCameraRotate;
class LLJoystickCameraZoom;
class LLJoystickCameraTrack;
class LLFloaterReg;
+class LLPanelCameraZoom;
enum ECameraControlMode
{
@@ -60,7 +61,7 @@ public:
/* callback for camera presets changing */
static void onClickCameraPresets(const LLSD& param);
- static void toPrevModeIfInAvatarViewMode();
+ static void onLeavingMouseLook();
/** resets current camera mode to orbit mode */
static void resetCameraMode();
@@ -68,13 +69,11 @@ public:
/* determines actual mode and updates ui */
void update();
- static void updateIfNotInAvatarViewMode();
-
virtual void onOpen(const LLSD& key);
virtual void onClose(bool app_quitting);
LLJoystickCameraRotate* mRotate;
- LLJoystickCameraZoom* mZoom;
+ LLPanelCameraZoom* mZoom;
LLJoystickCameraTrack* mTrack;
private:
@@ -108,6 +107,7 @@ private:
void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
+ BOOL mClosed;
ECameraControlMode mPrevMode;
ECameraControlMode mCurrMode;
std::map<ECameraControlMode, LLButton*> mMode2Button;
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index ed14079ae9..cdb9b8edb8 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -37,10 +37,9 @@
#include "llviewerprecompiledheaders.h"
-#include "llfloaterchat.h"
-
// project include
#include "llagent.h"
+#include "llappviewer.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
@@ -129,7 +128,7 @@ void LLFloaterChat::draw()
BOOL LLFloaterChat::postBuild()
{
// Hide the chat overlay when our history is visible.
- mVisibleSignal.connect(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
+ setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel");
@@ -142,6 +141,10 @@ BOOL LLFloaterChat::postBuild()
void LLFloaterChat::updateConsoleVisibility()
{
+ if(gDisconnected)
+ {
+ return;
+ }
// determine whether we should show console due to not being visible
gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn?
|| isMinimized() // are we minimized?
@@ -180,16 +183,19 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4&
edit->blockUndo();
}
-void log_chat_text(const LLChat& chat)
-{
- LLLogChat::saveHistory(std::string("chat"), chat.mFromName, chat.mFromID, chat.mText);
-}
// static
void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file)
{
- if ( (gSavedPerAccountSettings.getS32("IMLogOptions")!=LOG_IM) && log_to_file)
+ if (log_to_file && (gSavedPerAccountSettings.getBOOL("LogChat")))
{
- log_chat_text(chat);
+ if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT)
+ {
+ LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
+ }
+ else
+ {
+ LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText);
+ }
}
LLColor4 color = get_text_color(chat);
@@ -305,55 +311,17 @@ void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data)
}
// Put a line of chat in all the right places
-void LLFloaterChat::addChat(const LLChat& chat,
- BOOL from_instant_message,
- BOOL local_agent)
+void LLFloaterChat::addChat(const LLChat& chat, BOOL local_agent)
{
- LLColor4 text_color = get_text_color(chat);
-
- BOOL invisible_script_debug_chat = ((gSavedSettings.getBOOL("ShowScriptErrors") == FALSE) ||
- (chat.mChatType == CHAT_TYPE_DEBUG_MSG
- && (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1)));
-
- if (!invisible_script_debug_chat
- && !chat.mMuted
- && gConsole
- && !local_agent)
- {
- F32 size = CHAT_MSG_SIZE;
- if (chat.mSourceType == CHAT_SOURCE_SYSTEM)
- {
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- }
- else if(from_instant_message)
- {
- text_color = LLUIColorTable::instance().getColor("IMChatColor");
- size = INSTANT_MSG_SIZE;
- }
- // Disabling the console for 2.0 - SJB
-#if 0
- // We display anything if it's not an IM. If it's an IM, check pref...
- if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") )
- {
- gConsole->addLine(chat.mText, size, text_color);
- }
-#endif
- }
-
- if(from_instant_message && (gSavedPerAccountSettings.getS32("IMLogOptions")== LOG_BOTH_TOGETHER))
- log_chat_text(chat);
-
- if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory"))
- addChatHistory(chat,false);
-
triggerAlerts(chat.mText);
// Add the sender to the list of people with which we've recently interacted.
- if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull())
- LLRecentPeople::instance().add(chat.mFromID);
-
- if(!from_instant_message)
- addChatHistory(chat);
+ // this is not the best place to add _all_ messages to recent list
+ // comment this for now, may remove later on code cleanup
+ //if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull())
+ // LLRecentPeople::instance().add(chat.mFromID);
+
+ addChatHistory(chat, true);
}
// Moved from lltextparser.cpp to break llui/llaudio library dependency.
diff --git a/indra/newview/llfloaterchat.h b/indra/newview/llfloaterchat.h
index aed82a6781..4437a0a5c2 100644
--- a/indra/newview/llfloaterchat.h
+++ b/indra/newview/llfloaterchat.h
@@ -45,14 +45,6 @@ class LLChat;
class LLPanelActiveSpeakers;
class LLLogChat;
-enum ELogOptions
-{
- LOG_CHAT = 0,
- LOG_IM = 1,
- LOG_BOTH_TOGETHER = 2,
- LOG_BOTH_SEPARATE = 3
-};
-
class LLFloaterChat : public LLFloater
{
public:
@@ -69,7 +61,7 @@ public:
// *TODO:Skinning - move these to LLChat (or LLViewerChat?)
// Add chat to console and history list.
// Color based on source, type, distance.
- static void addChat(const LLChat& chat, BOOL from_im = FALSE, BOOL local_agent = FALSE);
+ static void addChat(const LLChat& chat, BOOL local_agent = FALSE);
// Add chat to history alone.
static void addChatHistory(const LLChat& chat, bool log_to_file = true);
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
index fbf09207fe..774caaec90 100644
--- a/indra/newview/llfloaterchatterbox.cpp
+++ b/indra/newview/llfloaterchatterbox.cpp
@@ -38,12 +38,12 @@
#include "llfloaterreg.h"
#include "llfloaterchatterbox.h"
#include "lluictrlfactory.h"
-#include "llfloaterchat.h"
#include "llfloaterfriends.h"
#include "llfloatergroups.h"
#include "llviewercontrol.h"
#include "llvoicechannel.h"
#include "llimpanel.h"
+#include "llimview.h"
//
// LLFloaterMyFriends
@@ -114,7 +114,7 @@ LLFloaterChatterBox::~LLFloaterChatterBox()
BOOL LLFloaterChatterBox::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
if (gSavedSettings.getBOOL("ContactsTornOff"))
{
@@ -133,22 +133,6 @@ BOOL LLFloaterChatterBox::postBuild()
addFloater(LLFloaterMyFriends::getInstance(), TRUE);
}
- if (gSavedSettings.getBOOL("ChatHistoryTornOff"))
- {
- LLFloaterChat* floater_chat = LLFloaterChat::getInstance();
- if(floater_chat)
- {
- // add then remove to set up relationship for re-attach
- addFloater(floater_chat, FALSE);
- removeFloater(floater_chat);
- // reparent to floater view
- gFloaterView->addChild(floater_chat);
- }
- }
- else
- {
- addFloater(LLFloaterChat::getInstance(), FALSE);
- }
mTabContainer->lockTabs();
return TRUE;
}
@@ -229,27 +213,19 @@ void LLFloaterChatterBox::onOpen(const LLSD& key)
//*TODO:Skinning show the session id associated with key
if (key.asString() == "local")
{
- LLFloaterChat* chat = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat");
- chat->openFloater();
}
else if (key.isDefined())
{
- LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
+ /*LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
if (impanel)
{
impanel->openFloater();
- }
+ }*/
}
}
void LLFloaterChatterBox::onVisibilityChange ( const LLSD& new_visibility )
{
- // HACK: potentially need to toggle console
- LLFloaterChat* instance = LLFloaterChat::getInstance();
- if(instance)
- {
- instance->updateConsoleVisibility();
- }
}
void LLFloaterChatterBox::removeFloater(LLFloater* floaterp)
@@ -348,8 +324,7 @@ LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()
}
if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
{
- // show near me tab if in proximal channel
- return LLFloaterChat::getInstance();
+ return NULL;
}
else
{
diff --git a/indra/newview/llfloaterchatterbox.h b/indra/newview/llfloaterchatterbox.h
index 3929e6e36c..ab44281d81 100644
--- a/indra/newview/llfloaterchatterbox.h
+++ b/indra/newview/llfloaterchatterbox.h
@@ -36,8 +36,8 @@
#define LL_LLFLOATERCHATTERBOX_H
#include "llfloater.h"
+#include "llmultifloater.h"
#include "llstring.h"
-#include "llimview.h"
#include "llimpanel.h"
class LLTabContainer;
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 73b79d8e13..b65457c4eb 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -586,7 +586,7 @@ void LLFloaterColorPicker::draw()
gl_triangle_2d ( startX, startY,
startX + mLumMarkerSize, startY - mLumMarkerSize,
startX + mLumMarkerSize, startY + mLumMarkerSize,
- LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), TRUE );
+ LLColor4 ( 0.75f, 0.75f, 0.75f, 1.0f ), TRUE );
// draw luminance slider outline
gl_rect_2d ( mLumRegionLeft,
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index a16cde7f10..0bbbe2051c 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -69,6 +69,7 @@ class LLFloaterColorPicker
void destroyUI ();
void cancelSelection ();
LLColorSwatchCtrl* getSwatch () { return mSwatch; };
+ void setSwatch( LLColorSwatchCtrl* swatch) { mSwatch = swatch; }
// mutator / accessor for original RGB value
void setOrigRgb ( F32 origRIn, F32 origGIn, F32 origBIn );
diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp
index 7f3b988dfe..48d552022f 100644
--- a/indra/newview/llfloaterdaycycle.cpp
+++ b/indra/newview/llfloaterdaycycle.cpp
@@ -105,20 +105,8 @@ LLFloaterDayCycle::~LLFloaterDayCycle()
{
}
-void LLFloaterDayCycle::onClickHelp(std::string xml_alert)
-{
- LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterDayCycle::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
- getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterDayCycle::onClickHelp, this, xml_alert));
-}
-
void LLFloaterDayCycle::initCallbacks(void)
{
- initHelpBtn("WLDayCycleHelp", "HelpDayCycle");
-
// WL Day Cycle
getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1));
getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1));
diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h
index 43c347d4f2..c250902b65 100644
--- a/indra/newview/llfloaterdaycycle.h
+++ b/indra/newview/llfloaterdaycycle.h
@@ -59,9 +59,6 @@ public:
LLFloaterDayCycle(const LLSD& key);
virtual ~LLFloaterDayCycle();
/*virtual*/ BOOL postBuild();
- /// help button stuff
- void onClickHelp(std::string xml_alert);
- void initHelpBtn(const std::string& name, const std::string& xml_alert);
/// initialize all
void initCallbacks(void);
diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp
index a520df36de..2fffa6eece 100644
--- a/indra/newview/llfloaterenvsettings.cpp
+++ b/indra/newview/llfloaterenvsettings.cpp
@@ -70,10 +70,6 @@ BOOL LLFloaterEnvSettings::postBuild()
syncMenu();
return TRUE;
}
-void LLFloaterEnvSettings::onClickHelp()
-{
- LLNotifications::instance().add(contextualNotification("EnvSettingsHelpButton"));
-}
void LLFloaterEnvSettings::initCallbacks(void)
{
@@ -89,10 +85,8 @@ void LLFloaterEnvSettings::initCallbacks(void)
getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this));
getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this));
getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this));
- getChild<LLUICtrl>("EnvSettingsHelpButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onClickHelp, this));
}
-
// menu maintenance functions
void LLFloaterEnvSettings::syncMenu()
diff --git a/indra/newview/llfloaterenvsettings.h b/indra/newview/llfloaterenvsettings.h
index 083e3636d1..02bc502120 100644
--- a/indra/newview/llfloaterenvsettings.h
+++ b/indra/newview/llfloaterenvsettings.h
@@ -53,9 +53,6 @@ public:
/// initialize all the callbacks for the menu
void initCallbacks(void);
- /// callback for the menus help button
- void onClickHelp();
-
/// handle if time of day is changed
void onChangeDayTime(LLUICtrl* ctrl);
diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp
new file mode 100644
index 0000000000..64efa10ef9
--- /dev/null
+++ b/indra/newview/llfloaterevent.cpp
@@ -0,0 +1,324 @@
+/**
+ * @file llfloaterevent.cpp
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterevent.h"
+
+#include "message.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+#include "llagent.h"
+#include "llviewerwindow.h"
+#include "llbutton.h"
+#include "llcachename.h"
+#include "llcommandhandler.h" // secondlife:///app/chat/ support
+#include "lleventflags.h"
+#include "lleventnotifier.h"
+#include "llexpandabletextbox.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llinventorymodel.h"
+#include "llsecondlifeurls.h"
+#include "llslurl.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lluiconstants.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+#include "llworldmap.h"
+#include "lluictrlfactory.h"
+#include "lltrans.h"
+
+
+class LLEventHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+ if (floater)
+ {
+ floater->setEventID(params[0].asInteger());
+ LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+ return true;
+ }
+
+ return false;
+ }
+};
+LLEventHandler gEventHandler;
+
+LLFloaterEvent::LLFloaterEvent(const LLSD& key)
+ : LLFloater(key),
+
+ mEventID(0)
+{
+}
+
+
+LLFloaterEvent::~LLFloaterEvent()
+{
+}
+
+
+BOOL LLFloaterEvent::postBuild()
+{
+ mTBName = getChild<LLTextBox>("event_name");
+
+ mTBCategory = getChild<LLTextBox>("event_category");
+
+ mTBDate = getChild<LLTextBox>("event_date");
+
+ mTBDuration = getChild<LLTextBox>("event_duration");
+
+ mTBDesc = getChild<LLExpandableTextBox>("event_desc");
+ mTBDesc->setEnabled(FALSE);
+
+ mTBRunBy = getChild<LLTextBox>("event_runby");
+ mTBLocation = getChild<LLTextBox>("event_location");
+ mTBCover = getChild<LLTextBox>("event_cover");
+
+ mTeleportBtn = getChild<LLButton>( "teleport_btn");
+ mTeleportBtn->setClickedCallback(onClickTeleport, this);
+
+ mMapBtn = getChild<LLButton>( "map_btn");
+ mMapBtn->setClickedCallback(onClickMap, this);
+
+ mNotifyBtn = getChild<LLButton>( "notify_btn");
+ mNotifyBtn->setClickedCallback(onClickNotify, this);
+
+ mCreateEventBtn = getChild<LLButton>( "create_event_btn");
+ mCreateEventBtn->setClickedCallback(onClickCreateEvent, this);
+
+ mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn");
+ mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this));
+
+ return TRUE;
+}
+
+void LLFloaterEvent::setEventID(const U32 event_id)
+{
+ mEventID = event_id;
+ // Should reset all of the panel state here
+ resetInfo();
+
+ if (event_id != 0)
+ {
+ sendEventInfoRequest();
+ }
+}
+
+void LLFloaterEvent::onClickDeleteEvent()
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventGodDelete);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+
+ gAgent.sendReliableMessage();
+}
+
+void LLFloaterEvent::sendEventInfoRequest()
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventInfoRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+ gAgent.sendReliableMessage();
+}
+
+//static
+void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
+{
+ // extract the agent id
+ LLUUID agent_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+
+ if(floater)
+ {
+ floater->mEventInfo.unpack(msg);
+ floater->mTBName->setText(floater->mEventInfo.mName);
+ floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
+ floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
+ floater->mTBDesc->setText(floater->mEventInfo.mDesc);
+ floater->mTBRunBy->setText(LLSLURL::buildCommand("agent", floater->mEventInfo.mRunByID, "inspect"));
+
+ floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
+
+ if (!floater->mEventInfo.mHasCover)
+ {
+ floater->mTBCover->setText(floater->getString("none"));
+ }
+ else
+ {
+ floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover));
+ }
+
+ F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX];
+ F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY];
+
+ S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
+ S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
+ S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]);
+
+ std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z);
+ floater->mTBLocation->setText(desc);
+
+ if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE)
+ {
+ floater->childSetVisible("event_mature_yes", TRUE);
+ floater->childSetVisible("event_mature_no", FALSE);
+ }
+ else
+ {
+ floater->childSetVisible("event_mature_yes", FALSE);
+ floater->childSetVisible("event_mature_no", TRUE);
+ }
+
+ if (floater->mEventInfo.mUnixTime < time_corrected())
+ {
+ floater->mNotifyBtn->setEnabled(FALSE);
+ }
+ else
+ {
+ floater->mNotifyBtn->setEnabled(TRUE);
+ }
+
+ if (gEventNotifier.hasNotification(floater->mEventInfo.mID))
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("dont_notify"));
+ }
+ else
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("notify"));
+ }
+
+ floater->mMapBtn->setEnabled(TRUE);
+ floater->mTeleportBtn->setEnabled(TRUE);
+ }
+}
+
+
+void LLFloaterEvent::draw()
+{
+ mGodDeleteEventBtn->setVisible(gAgent.isGodlike());
+
+ LLPanel::draw();
+}
+
+void LLFloaterEvent::resetInfo()
+{
+ mTBName->setText(LLStringUtil::null);
+ mTBCategory->setText(LLStringUtil::null);
+ mTBDate->setText(LLStringUtil::null);
+ mTBDesc->setText(LLStringUtil::null);
+ mTBDuration->setText(LLStringUtil::null);
+ mTBCover->setText(LLStringUtil::null);
+ mTBLocation->setText(LLStringUtil::null);
+ mTBRunBy->setText(LLStringUtil::null);
+ mNotifyBtn->setEnabled(FALSE);
+ mMapBtn->setEnabled(FALSE);
+ mTeleportBtn->setEnabled(FALSE);
+}
+
+// static
+void LLFloaterEvent::onClickTeleport(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal);
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickMap(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickCreateEvent(void* data)
+{
+ LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage);
+}
+
+
+// static
+void LLFloaterEvent::onClickNotify(void *data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+
+ if (!gEventNotifier.hasNotification(self->mEventID))
+ {
+ gEventNotifier.add(self->mEventInfo);
+ self->mNotifyBtn->setLabel(self->getString("dont_notify"));
+ }
+ else
+ {
+ gEventNotifier.remove(self->mEventInfo.mID);
+ self->mNotifyBtn->setLabel(self->getString("notify"));
+ }
+}
diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h
new file mode 100644
index 0000000000..54aaaf6a0f
--- /dev/null
+++ b/indra/newview/llfloaterevent.h
@@ -0,0 +1,96 @@
+/**
+ * @file llfloaterevent.h
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREVENT_H
+#define LL_LLFLOATEREVENT_H
+
+#include "llfloater.h"
+#include "lleventinfo.h"
+#include "lluuid.h"
+#include "v3dmath.h"
+
+class LLTextBox;
+class LLTextEditor;
+class LLButton;
+class LLExpandableTextBox;
+class LLMessageSystem;
+
+class LLFloaterEvent : public LLFloater
+{
+public:
+ LLFloaterEvent(const LLSD& key);
+ /*virtual*/ ~LLFloaterEvent();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+
+ void setEventID(const U32 event_id);
+ void sendEventInfoRequest();
+
+ static void processEventInfoReply(LLMessageSystem *msg, void **);
+
+ U32 getEventID() { return mEventID; }
+
+protected:
+ void resetInfo();
+
+ static void onClickTeleport(void*);
+ static void onClickMap(void*);
+ //static void onClickLandmark(void*);
+ static void onClickCreateEvent(void*);
+ static void onClickNotify(void*);
+ void onClickDeleteEvent();
+
+// static bool callbackCreateEventWebPage(const LLSD& notification, const LLSD& response);
+
+protected:
+ U32 mEventID;
+ LLEventInfo mEventInfo;
+
+ LLTextBox* mTBName;
+ LLTextBox* mTBCategory;
+ LLTextBox* mTBDate;
+ LLTextBox* mTBDuration;
+ LLExpandableTextBox* mTBDesc;
+
+ LLTextBox* mTBRunBy;
+ LLTextBox* mTBLocation;
+ LLTextBox* mTBCover;
+
+ LLButton* mTeleportBtn;
+ LLButton* mMapBtn;
+ LLButton* mCreateEventBtn;
+ LLButton* mGodDeleteEventBtn;
+ LLButton* mNotifyBtn;
+};
+
+#endif // LL_LLFLOATEREVENT_H
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 2c66ab502d..4e2633d750 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -49,7 +49,7 @@
#include "llavataractions.h"
#include "llinventorymodel.h"
#include "llnamelistctrl.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llresmgr.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -58,7 +58,7 @@
#include "llmenucommands.h"
#include "llviewercontrol.h"
#include "llviewermessage.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "lltextbox.h"
#include "llvoiceclient.h"
@@ -535,7 +535,7 @@ void LLPanelFriends::onMaximumSelect()
{
LLSD args;
args["MAX_SELECT"] = llformat("%d", MAX_FRIEND_SELECT);
- LLNotifications::instance().add("MaxListSelectMessage", args);
+ LLNotificationsUtil::add("MaxListSelectMessage", args);
};
// static
@@ -572,8 +572,7 @@ void LLPanelFriends::onClickIM(void* user_data)
// static
void LLPanelFriends::onPickAvatar(const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids,
- void* )
+ const std::vector<LLUUID>& ids)
{
if (names.empty()) return;
if (ids.empty()) return;
@@ -585,7 +584,7 @@ void LLPanelFriends::onClickAddFriend(void* user_data)
{
LLPanelFriends* panelp = (LLPanelFriends*)user_data;
LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(onPickAvatar, user_data, FALSE, TRUE);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelFriends::onPickAvatar, _1,_2), FALSE, TRUE);
if (root_floater)
{
root_floater->addDependentFloater(picker);
@@ -639,14 +638,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
}
if (command == GRANT)
{
- LLNotifications::instance().add("GrantModifyRights",
+ LLNotificationsUtil::add("GrantModifyRights",
args,
LLSD(),
boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
}
else
{
- LLNotifications::instance().add("RevokeModifyRights",
+ LLNotificationsUtil::add("RevokeModifyRights",
args,
LLSD(),
boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
@@ -656,14 +655,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
{
if (command == GRANT)
{
- LLNotifications::instance().add("GrantModifyRightsMultiple",
+ LLNotificationsUtil::add("GrantModifyRightsMultiple",
args,
LLSD(),
boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
}
else
{
- LLNotifications::instance().add("RevokeModifyRightsMultiple",
+ LLNotificationsUtil::add("RevokeModifyRightsMultiple",
args,
LLSD(),
boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
@@ -674,7 +673,7 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
bool LLPanelFriends::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(0 == option)
{
sendRightsGrant(*rights);
diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h
index 9c6660c0dc..0042da48d3 100644
--- a/indra/newview/llfloaterfriends.h
+++ b/indra/newview/llfloaterfriends.h
@@ -116,7 +116,7 @@ private:
static void onSelectName(LLUICtrl* ctrl, void* user_data);
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
- static void onPickAvatar(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* user_data);
+ static void onPickAvatar(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
static void onMaximumSelect();
static void onClickIM(void* user_data);
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 1300103423..9c1ac2631d 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -34,31 +34,24 @@
#include "llfloatergesture.h"
-#include "lldir.h"
#include "llinventory.h"
-#include "llmultigesture.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "llinventoryclipboard.h"
#include "llagent.h"
-#include "llviewerwindow.h"
-#include "llbutton.h"
-#include "llcombobox.h"
+#include "llappearancemgr.h"
+#include "llclipboard.h"
#include "llgesturemgr.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
#include "llkeyboard.h"
-#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llmultigesture.h"
#include "llpreviewgesture.h"
-#include "llresizehandle.h"
-#include "llscrollbar.h"
-#include "llscrollcontainer.h"
#include "llscrolllistctrl.h"
-#include "lltextbox.h"
#include "lltrans.h"
-#include "lluictrlfactory.h"
#include "llviewergesture.h"
-#include "llviewertexturelist.h"
+#include "llviewermenu.h"
#include "llviewerinventory.h"
-#include "llvoavatar.h"
#include "llviewercontrol.h"
BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
@@ -76,6 +69,35 @@ public:
private:
LLFloaterGesture* mFloater;
};
+//-----------------------------
+// GestureCallback
+//-----------------------------
+
+class GestureShowCallback : public LLInventoryCallback
+{
+public:
+ void fire(const LLUUID &inv_item)
+ {
+ LLPreviewGesture::show(inv_item, LLUUID::null);
+ }
+};
+
+class GestureCopiedCallback : public LLInventoryCallback
+{
+private:
+ LLFloaterGesture* mFloater;
+
+public:
+ GestureCopiedCallback(LLFloaterGesture* floater): mFloater(floater)
+ {}
+ void fire(const LLUUID &inv_item)
+ {
+ if(mFloater)
+ {
+ mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list"));
+ }
+ }
+};
//---------------------------------------------------------------------------
// LLFloaterGesture
@@ -85,7 +107,59 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
{
mObserver = new LLFloaterGestureObserver(this);
LLGestureManager::instance().addObserver(mObserver);
- //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
+
+ mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
+ mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
+ mCommitCallbackRegistrar.add("Gesture.Action.CopyPaste", boost::bind(&LLFloaterGesture::onCopyPasteAction, this, _2));
+ mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));
+
+ mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2));
+}
+
+void LLFloaterGesture::done()
+{
+ //this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder
+ if (gInventory.isCategoryComplete(mGestureFolderID))
+ {
+ LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL;
+ // we load only gesture folder without childred.
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;
+ LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
+ gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
+ if (categories->empty())
+ {
+ gInventory.removeObserver(this);
+ LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL;
+ return;
+ }
+ LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL;
+ for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++)
+ {
+ if (!gInventory.isCategoryComplete(it->get()->getUUID()))
+ {
+ unloaded_folders.push_back(it->get()->getUUID());
+ LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL;
+ }
+
+ }
+ if (!unloaded_folders.empty())
+ {
+ LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
+ fetchDescendents(unloaded_folders);
+ }
+ else
+ {
+ LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL;
+ gInventory.removeObserver(this);
+ buildGestureList();
+ }
+ }
+ else
+ {
+ LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL;
+ }
}
// virtual
@@ -94,6 +168,7 @@ LLFloaterGesture::~LLFloaterGesture()
LLGestureManager::instance().removeObserver(mObserver);
delete mObserver;
mObserver = NULL;
+ gInventory.removeObserver(this);
}
// virtual
@@ -104,33 +179,39 @@ BOOL LLFloaterGesture::postBuild()
label = getTitle();
setTitle(label);
-
- getChild<LLUICtrl>("gesture_list")->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
- getChild<LLScrollListCtrl>("gesture_list")->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
-
- getChild<LLUICtrl>("inventory_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickInventory, this));
+ mGestureList = getChild<LLScrollListCtrl>("gesture_list");
+ mGestureList->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
+ mGestureList->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
getChild<LLUICtrl>("edit_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickEdit, this));
getChild<LLUICtrl>("play_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
getChild<LLUICtrl>("stop_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
-
+ getChild<LLButton>("activate_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
+
getChild<LLUICtrl>("new_gesture_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickNew, this));
+ getChild<LLButton>("del_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onDeleteSelected, this));
childSetVisible("play_btn", true);
childSetVisible("stop_btn", false);
setDefaultBtn("play_btn");
-
- buildGestureList();
-
- childSetFocus("gesture_list");
+ mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
+
+ folder_ref_t folders;
+ folders.push_back(mGestureFolderID);
+ //perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details.
+ gInventory.addObserver(this);
+ fetchDescendents(folders);
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- if (list)
+ if (mGestureList)
{
+ buildGestureList();
+
+ mGestureList->setFocus(TRUE);
+
const BOOL ascending = TRUE;
- list->sortByColumn(std::string("name"), ascending);
- list->selectFirstItem();
+ mGestureList->sortByColumn(std::string("name"), ascending);
+ mGestureList->selectFirstItem();
}
// Update button labels
@@ -142,20 +223,19 @@ BOOL LLFloaterGesture::postBuild()
void LLFloaterGesture::refreshAll()
{
- buildGestureList();
+ if (!mGestureList) return;
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- if (!list) return;
+ buildGestureList();
if (mSelectedID.isNull())
{
- list->selectFirstItem();
+ mGestureList->selectFirstItem();
}
else
{
- if (! list->setCurrentByID(mSelectedID))
+ if (! mGestureList->setCurrentByID(mSelectedID))
{
- list->selectFirstItem();
+ mGestureList->selectFirstItem();
}
}
@@ -165,143 +245,201 @@ void LLFloaterGesture::refreshAll()
void LLFloaterGesture::buildGestureList()
{
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- LLCtrlScrollInterface *scroll = childGetScrollInterface("gesture_list");
+ S32 scroll_pos = mGestureList->getScrollPos();
+ std::vector<LLUUID> selected_items;
+ getSelectedIds(selected_items);
+ LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
+ mGestureList->deleteAllItems();
+
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
+ {
+ addGesture(it->first,it->second, mGestureList);
+ }
+ if (gInventory.isCategoryComplete(mGestureFolderID))
+ {
+ LLIsType is_gesture(LLAssetType::AT_GESTURE);
+ LLInventoryModel::cat_array_t categories;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendentsIf(mGestureFolderID, categories, items,
+ LLInventoryModel::EXCLUDE_TRASH, is_gesture);
- if (! (list && scroll)) return;
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)
+ {
+ LLInventoryItem* item = it->get();
+ if (active_gestures.find(item->getUUID()) == active_gestures.end())
+ {
+ // if gesture wasn't loaded yet, we can display only name
+ addGesture(item->getUUID(), NULL, mGestureList);
+ }
+ }
+ }
// attempt to preserve scroll position through re-builds
- // since we do re-build any time anything dirties
- S32 current_scroll_pos = scroll->getScrollPos();
-
- list->operateOnAll(LLCtrlListInterface::OP_DELETE);
-
- LLGestureManager::item_map_t::iterator it;
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ // since we do re-build whenever something gets dirty
+ for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++)
{
- const LLUUID& item_id = (*it).first;
- LLMultiGesture* gesture = (*it).second;
+ mGestureList->selectByID(*it);
+ }
+ mGestureList->setScrollPos(scroll_pos);
+}
- // Note: Can have NULL item if inventory hasn't arrived yet.
- std::string item_name = getString("loading");
- LLInventoryItem* item = gInventory.getItem(item_id);
- if (item)
- {
- item_name = item->getName();
- }
+void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
+{
+ // Note: Can have NULL item if inventory hasn't arrived yet.
+ static std::string item_name = getString("loading");
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
+ {
+ item_name = item->getName();
+ }
- std::string font_style = "NORMAL";
- // If gesture is playing, bold it
+ static std::string font_style = "NORMAL";
+ // If gesture is playing, bold it
- LLSD element;
- element["id"] = item_id;
+ LLSD element;
+ element["id"] = item_id;
- if (gesture)
+ if (gesture)
+ {
+ if (gesture->mPlaying)
{
- if (gesture->mPlaying)
- {
- font_style = "BOLD";
- }
-
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = gesture->mTrigger;
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
+ font_style = "BOLD";
+ }
+ item_name = gesture->mName;
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = gesture->mTrigger;
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
- std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
- std::string buffer;
+ std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
+ std::string buffer;
- if (gesture->mKey == KEY_NONE)
- {
- buffer = "---";
- key_string = "~~~"; // alphabetize to end
- }
- else
- {
- buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey );
- }
+ if (gesture->mKey == KEY_NONE)
+ {
+ buffer = "---";
+ key_string = "~~~"; // alphabetize to end
+ }
+ else
+ {
+ buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,
+ gesture->mKey);
+ }
- element["columns"][1]["column"] = "shortcut";
- element["columns"][1]["value"] = buffer;
- element["columns"][1]["font"]["name"] = "SANSSERIF";
- element["columns"][1]["font"]["style"] = font_style;
+ element["columns"][1]["column"] = "shortcut";
+ element["columns"][1]["value"] = buffer;
+ element["columns"][1]["font"]["name"] = "SANSSERIF";
+ element["columns"][1]["font"]["style"] = font_style;
- // hidden column for sorting
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = key_string;
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
+ // hidden column for sorting
+ element["columns"][2]["column"] = "key";
+ element["columns"][2]["value"] = key_string;
+ element["columns"][2]["font"]["name"] = "SANSSERIF";
+ element["columns"][2]["font"]["style"] = font_style;
- // Only add "playing" if we've got the name, less confusing. JC
- if (item && gesture->mPlaying)
- {
- item_name += " " + getString("playing");
- }
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
- }
- else
+ // Only add "playing" if we've got the name, less confusing. JC
+ if (item && gesture->mPlaying)
{
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "---";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = "~~~";
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
+ item_name += " " + getString("playing");
}
- list->addElement(element, ADD_BOTTOM);
+ element["columns"][3]["column"] = "name";
+ element["columns"][3]["value"] = item_name;
+ element["columns"][3]["font"]["name"] = "SANSSERIF";
+ element["columns"][3]["font"]["style"] = font_style;
+ }
+ else
+ {
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = "";
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = "---";
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][2]["column"] = "key";
+ element["columns"][2]["value"] = "~~~";
+ element["columns"][2]["font"]["name"] = "SANSSERIF";
+ element["columns"][2]["font"]["style"] = font_style;
+ element["columns"][3]["column"] = "name";
+ element["columns"][3]["value"] = item_name;
+ element["columns"][3]["font"]["name"] = "SANSSERIF";
+ element["columns"][3]["font"]["style"] = font_style;
+ }
+
+ LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM);
+ if(sl_item)
+ {
+ LLFontGL::StyleFlags style = LLGestureManager::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL;
+ // *TODO find out why ["font"]["style"] does not affect font style
+ ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style);
}
-
- scroll->setScrollPos(current_scroll_pos);
}
-void LLFloaterGesture::onClickInventory()
+void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids)
{
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- if (!list) return;
- const LLUUID& item_id = list->getCurrentID();
-
- LLFloaterInventory* inv = LLFloaterInventory::showAgentInventory();
- if (!inv) return;
- inv->getPanel()->setSelection(item_id, TRUE);
+ std::vector<LLScrollListItem*> items = mGestureList->getAllSelected();
+ for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
+ {
+ ids.push_back((*it)->getUUID());
+ }
}
-void LLFloaterGesture::onClickPlay()
+bool LLFloaterGesture::isActionEnabled(const LLSD& command)
{
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- if (!list) return;
- const LLUUID& item_id = list->getCurrentID();
-
- if (LLGestureManager::instance().isGesturePlaying(item_id))
+ // paste copy_uuid edit_gesture
+ std::string command_name = command.asString();
+ if("paste" == command_name)
{
- LLGestureManager::instance().stopGesture(item_id);
+ if(!LLInventoryClipboard::instance().hasContents())
+ return false;
+
+ LLDynamicArray<LLUUID> ids;
+ LLInventoryClipboard::instance().retrieve(ids);
+ for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ LLInventoryItem* item = gInventory.getItem(*it);
+
+ if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ {
+ return true;
+ }
+ }
+ return false;
}
- else
+ else if("copy_uuid" == command_name || "edit_gesture" == command_name)
{
- LLGestureManager::instance().playGesture(item_id);
+ return mGestureList->getAllSelected().size() == 1;
}
+ return true;
}
-class GestureShowCallback : public LLInventoryCallback
+void LLFloaterGesture::onClickPlay()
{
-public:
- void fire(const LLUUID &inv_item)
+ const LLUUID& item_id = mGestureList->getCurrentID();
+ if(item_id.isNull()) return;
+
+ LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
+ if(!LLGestureManager::instance().isGestureActive(item_id))
{
- LLPreviewGesture::show(inv_item, LLUUID::null);
+ // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList.
+ BOOL inform_server = TRUE;
+ BOOL deactivate_similar = FALSE;
+ LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ llassert(item);
+ if (item)
+ {
+ LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
+ LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ }
}
-};
+ else
+ {
+ playGesture(item_id);
+ }
+}
void LLFloaterGesture::onClickNew()
{
@@ -311,12 +449,99 @@ void LLFloaterGesture::onClickNew()
LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
}
+void LLFloaterGesture::onActivateBtnClick()
+{
+ std::vector<LLUUID> ids;
+ getSelectedIds(ids);
+ if(ids.empty())
+ return;
+
+ LLGestureManager* gm = LLGestureManager::getInstance();
+ std::vector<LLUUID>::const_iterator it = ids.begin();
+ BOOL first_gesture_state = gm->isGestureActive(*it);
+ BOOL is_mixed = FALSE;
+ while( ++it != ids.end() )
+ {
+ if(first_gesture_state != gm->isGestureActive(*it))
+ {
+ is_mixed = TRUE;
+ break;
+ }
+ }
+ for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ if(is_mixed)
+ {
+ gm->activateGesture(*it);
+ }
+ else
+ {
+ if(first_gesture_state)
+ {
+ gm->deactivateGesture(*it);
+ }
+ else
+ {
+ gm->activateGesture(*it);
+ }
+ }
+ }
+}
+
+void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
+{
+ std::string command_name = command.asString();
+ // since we select this comman inventory item had already arrived .
+ if("copy_gesture" == command_name)
+ {
+ std::vector<LLUUID> ids;
+ getSelectedIds(ids);
+ // make sure that clopboard is empty
+ LLInventoryClipboard::instance().reset();
+ for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ LLInventoryItem* item = gInventory.getItem(*it);
+ if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ {
+ LLInventoryClipboard::instance().add(item->getUUID());
+ }
+ }
+ }
+ else if ("paste" == command_name)
+ {
+ LLInventoryClipboard& clipbord = LLInventoryClipboard::instance();
+ LLDynamicArray<LLUUID> ids;
+ clipbord.retrieve(ids);
+ if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
+ return;
+ LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+ llassert(gesture_dir);
+ LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
+
+ for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ LLInventoryItem* item = gInventory.getItem(*it);
+ if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ {
+ LLStringUtil::format_map_t string_args;
+ string_args["[COPY_NAME]"] = item->getName();
+ LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into "
+ << gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL;
+ copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),
+ gesture_dir->getUUID(), getString("copy_name", string_args), cb);
+ }
+ }
+ clipbord.reset();
+ }
+ else if ("copy_uuid" == command_name)
+ {
+ gClipboard.copyFromString(utf8str_to_wstring(mGestureList->getCurrentID().asString()), mGestureList->getCurrentID());
+ }
+}
void LLFloaterGesture::onClickEdit()
{
- LLCtrlListInterface *list = childGetListInterface("gesture_list");
- if (!list) return;
- const LLUUID& item_id = list->getCurrentID();
+ const LLUUID& item_id = mGestureList->getCurrentID();
LLInventoryItem* item = gInventory.getItem(item_id);
if (!item) return;
@@ -330,7 +555,7 @@ void LLFloaterGesture::onClickEdit()
void LLFloaterGesture::onCommitList()
{
- const LLUUID& item_id = childGetValue("gesture_list").asUUID();
+ const LLUUID& item_id = mGestureList->getCurrentID();
mSelectedID = item_id;
if (LLGestureManager::instance().isGesturePlaying(item_id))
@@ -344,3 +569,66 @@ void LLFloaterGesture::onCommitList()
childSetVisible("stop_btn", false);
}
}
+
+void LLFloaterGesture::onDeleteSelected()
+{
+ std::vector<LLUUID> ids;
+ getSelectedIds(ids);
+ if(ids.empty())
+ return;
+
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ LLGestureManager* gm = LLGestureManager::getInstance();
+ for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ const LLUUID& selected_item = *it;
+ LLInventoryItem* inv_item = gInventory.getItem(selected_item);
+ if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ {
+ if(gm->isGestureActive(selected_item))
+ {
+ gm->deactivateGesture(selected_item);
+ }
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
+ new_item->setParent(trash_id);
+ // no need to restamp it though it's a move into trash because
+ // it's a brand new item already.
+ new_item->updateParentOnServer(FALSE);
+ gInventory.updateItem(new_item);
+ }
+ }
+ gInventory.notifyObservers();
+ buildGestureList();
+}
+
+void LLFloaterGesture::addToCurrentOutFit()
+{
+ std::vector<LLUUID> ids;
+ getSelectedIds(ids);
+ LLAppearanceManager* am = LLAppearanceManager::getInstance();
+ for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ {
+ am->addCOFItemLink(*it);
+ }
+}
+
+void LLFloaterGesture::playGesture(LLUUID item_id)
+{
+ LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL;
+
+ if (LLGestureManager::instance().isGesturePlaying(item_id))
+ {
+ LLGestureManager::instance().stopGesture(item_id);
+ }
+ else
+ {
+ LLGestureManager::instance().playGesture(item_id);
+ }
+}
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 9c1ab27cb0..629d77b949 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -36,10 +36,10 @@
#ifndef LL_LLFLOATERGESTURE_H
#define LL_LLFLOATERGESTURE_H
+#include <vector>
#include "llfloater.h"
-
-#include "lldarray.h"
+#include "llinventoryobserver.h"
class LLScrollContainer;
class LLView;
@@ -51,31 +51,60 @@ class LLGestureOptions;
class LLScrollListCtrl;
class LLFloaterGestureObserver;
class LLFloaterGestureInventoryObserver;
+class LLMultiGesture;
+class LLMenuGL;
class LLFloaterGesture
-: public LLFloater
+: public LLFloater, LLInventoryFetchDescendentsObserver
{
+ LOG_CLASS(LLFloaterGesture);
public:
LLFloaterGesture(const LLSD& key);
virtual ~LLFloaterGesture();
virtual BOOL postBuild();
-
+ virtual void done ();
void refreshAll();
+ /**
+ * @brief Add new scrolllistitem into gesture_list.
+ * @param item_id inventory id of gesture
+ * @param gesture can be NULL , if item was not loaded yet
+ */
+ void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
protected:
// Reads from the gesture manager's list of active gestures
// and puts them in this list.
void buildGestureList();
-
- void onClickInventory();
+ void playGesture(LLUUID item_id);
+private:
+ void addToCurrentOutFit();
+ /**
+ * @brief This method is using to collect selected items.
+ * In some places gesture_list can be rebuilt by gestureObservers during iterating data from LLScrollListCtrl::getAllSelected().
+ * Therefore we have to copy these items to avoid viewer crash.
+ * @see LLFloaterGesture::onActivateBtnClick
+ */
+ void getSelectedIds(std::vector<LLUUID>& ids);
+ bool isActionEnabled(const LLSD& command);
+ /**
+ * @brief Activation rules:
+ * According to Gesture Spec:
+ * 1. If all selected gestures are active: set to inactive
+ * 2. If all selected gestures are inactive: set to active
+ * 3. If selected gestures are in a mixed state: set all to active
+ */
+ void onActivateBtnClick();
void onClickEdit();
void onClickPlay();
void onClickNew();
void onCommitList();
+ void onCopyPasteAction(const LLSD& command);
+ void onDeleteSelected();
-protected:
LLUUID mSelectedID;
+ LLUUID mGestureFolderID;
+ LLScrollListCtrl* mGestureList;
LLFloaterGestureObserver* mObserver;
};
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 886f5ec924..eb56f387cd 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -39,12 +39,12 @@
#include "llframetimer.h"
#include "llgl.h"
#include "llhost.h"
+#include "llnotificationsutil.h"
#include "llregionflags.h"
#include "llstring.h"
#include "message.h"
#include "llagent.h"
-#include "llalertdialog.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
@@ -68,7 +68,6 @@
#include "llviewerwindow.h"
#include "llworld.h"
#include "llfloateravatarpicker.h"
-#include "llnotify.h"
#include "llxfermanager.h"
#include "llvlcomposition.h"
#include "llsurface.h"
@@ -214,6 +213,9 @@ void LLFloaterGodTools::showPanel(const std::string& panel_name)
// static
void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
{
+ llassert(msg);
+ if (!msg) return;
+
LLHost host = msg->getSender();
if (host != gAgent.getRegionHost())
{
@@ -271,8 +273,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
if ( gAgent.isGodlike()
&& LLFloaterReg::instanceVisible("god_tools")
&& god_tools->mPanelRegionTools
- && god_tools->mPanelObjectTools
- && msg )
+ && god_tools->mPanelObjectTools)
{
LLPanelRegionTools* rtool = god_tools->mPanelRegionTools;
god_tools->mCurrentHost = host;
@@ -415,17 +416,17 @@ LLPanelRegionTools::LLPanelRegionTools()
BOOL LLPanelRegionTools::postBuild()
{
getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this);
- childSetPrevalidate("region name", &LLLineEditor::prevalidatePrintableNotPipe);
- childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe);
+ childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32);
childDisable("parentestate");
- childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32);
childDisable("gridposx");
- childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32);
childDisable("gridposy");
- childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32);
return TRUE;
}
@@ -847,17 +848,17 @@ void LLPanelGridTools::refresh()
void LLPanelGridTools::onClickKickAll()
{
- LLNotifications::instance().add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
+ LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
}
bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)
{
- if (LLNotification::getSelectedOption(notification, response) == 0)
+ if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
{
LLSD payload;
payload["kick_message"] = response["message"].asString();
- LLNotifications::instance().add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
+ LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
}
return false;
}
@@ -866,7 +867,7 @@ bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& respons
// static
bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
@@ -887,13 +888,13 @@ bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response
void LLPanelGridTools::onClickFlushMapVisibilityCaches()
{
- LLNotifications::instance().add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
+ LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
}
// static
bool LLPanelGridTools::flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return false;
// HACK: Send this as an EstateOwnerRequest so it gets routed
@@ -1101,7 +1102,7 @@ void LLPanelObjectTools::onClickDeletePublicOwnedBy()
payload["avatar_id"] = mTargetAvatar;
payload["flags"] = (S32)mSimWideDeletesFlags;
- LLNotifications::instance().add( "GodDeleteAllScriptedPublicObjectsByUser",
+ LLNotificationsUtil::add( "GodDeleteAllScriptedPublicObjectsByUser",
args,
payload,
callbackSimWideDeletes);
@@ -1121,7 +1122,7 @@ void LLPanelObjectTools::onClickDeleteAllScriptedOwnedBy()
payload["avatar_id"] = mTargetAvatar;
payload["flags"] = (S32)mSimWideDeletesFlags;
- LLNotifications::instance().add( "GodDeleteAllScriptedObjectsByUser",
+ LLNotificationsUtil::add( "GodDeleteAllScriptedObjectsByUser",
args,
payload,
callbackSimWideDeletes);
@@ -1141,7 +1142,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()
payload["avatar_id"] = mTargetAvatar;
payload["flags"] = (S32)mSimWideDeletesFlags;
- LLNotifications::instance().add( "GodDeleteAllObjectsByUser",
+ LLNotificationsUtil::add( "GodDeleteAllObjectsByUser",
args,
payload,
callbackSimWideDeletes);
@@ -1151,7 +1152,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()
// static
bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const LLSD& response )
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
if (!notification["payload"]["avatar_id"].asUUID().isNull())
@@ -1166,7 +1167,7 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const
void LLPanelObjectTools::onClickSet()
{
// grandparent is a floater, which can have a dependent
- gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, this));
+ gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2)));
}
void LLPanelObjectTools::onClickSetBySelection(void* data)
@@ -1190,14 +1191,12 @@ void LLPanelObjectTools::onClickSetBySelection(void* data)
panelp->childSetValue("target_avatar_name", name);
}
-// static
-void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
+void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLPanelObjectTools* object_tools = (LLPanelObjectTools*) data;
if (ids.empty() || names.empty()) return;
- object_tools->mTargetAvatar = ids[0];
- object_tools->childSetValue("target_avatar_name", names[0]);
- object_tools->refresh();
+ mTargetAvatar = ids[0];
+ childSetValue("target_avatar_name", names[0]);
+ refresh();
}
void LLPanelObjectTools::onChangeAnything()
@@ -1334,7 +1333,7 @@ void LLPanelRequestTools::onClickRequest()
void terrain_download_done(void** data, S32 status, LLExtStat ext_status)
{
- LLNotifications::instance().add("TerrainDownloaded");
+ LLNotificationsUtil::add("TerrainDownloaded");
}
diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h
index ebab1fde11..ef5ce02749 100644
--- a/indra/newview/llfloatergodtools.h
+++ b/indra/newview/llfloatergodtools.h
@@ -234,7 +234,7 @@ public:
void onChangeAnything();
void onApplyChanges();
void onClickSet();
- static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
void onClickDeletePublicOwnedBy();
void onClickDeleteAllScriptedOwnedBy();
void onClickDeleteAllOwnedBy();
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index 45af515a86..c71764c2e5 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -75,7 +75,7 @@ LLFloaterGroupPicker::~LLFloaterGroupPicker()
void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
{
mPowersMask = powers_mask;
- postBuild();
+ init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), mPowersMask);
}
@@ -247,14 +247,7 @@ void LLPanelGroups::enableButtons()
childDisable("IM");
childDisable("Leave");
}
- if(gAgent.mGroups.count() < MAX_AGENT_GROUPS)
- {
- childEnable("Create");
- }
- else
- {
- childDisable("Create");
- }
+ childSetEnabled("Create", gAgent.canJoinGroups());
}
@@ -327,7 +320,7 @@ void LLPanelGroups::startIM()
if (group_list && (group_id = group_list->getCurrentID()).notNull())
{
- LLGroupActions::startChat(group_id);
+ LLGroupActions::startIM(group_id);
}
}
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 9947cdc217..b2564eb2b6 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -50,7 +50,17 @@
#include "llsliderctrl.h"
LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key)
- : LLFloater(key)
+ : LLFloater(key),
+
+ // these should be set on imminent refresh() call,
+ // but init them anyway
+ mUseVBO(0),
+ mUseAniso(0),
+ mFSAASamples(0),
+ mGamma(0.0),
+ mVideoCardMem(0),
+ mFogRatio(0.0),
+ mProbeHardwareOnStartup(FALSE)
{
//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hardware_settings.xml");
}
@@ -59,12 +69,6 @@ LLFloaterHardwareSettings::~LLFloaterHardwareSettings()
{
}
-void LLFloaterHardwareSettings::onClickHelp(void* data)
-{
- const char* xml_alert = "HardwareSettingsHelpButton";
- LLNotifications::instance().add(xml_alert);
-}
-
void LLFloaterHardwareSettings::initCallbacks(void)
{
}
diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h
index 3f19d89cbb..ef0b0c905e 100644
--- a/indra/newview/llfloaterhardwaresettings.h
+++ b/indra/newview/llfloaterhardwaresettings.h
@@ -50,9 +50,6 @@ public:
/// initialize all the callbacks for the menu
void initCallbacks(void);
- /// callback for the menus help button
- static void onClickHelp(void* data);
-
/// OK button
static void onBtnOK( void* userdata );
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index 2e0ae3265e..f3c6b286ab 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -85,13 +85,22 @@ void LLFloaterHelpBrowser::onClose(bool app_quitting)
void LLFloaterHelpBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
{
- if(event == MEDIA_EVENT_LOCATION_CHANGED)
+ switch (event)
{
+ case MEDIA_EVENT_LOCATION_CHANGED:
setCurrentURL(self->getLocation());
- }
- else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
- {
- // nothing yet
+ break;
+
+ case MEDIA_EVENT_NAVIGATE_BEGIN:
+ childSetText("status_text", getString("loading_text"));
+ break;
+
+ case MEDIA_EVENT_NAVIGATE_COMPLETE:
+ childSetText("status_text", getString("done_text"));
+ break;
+
+ default:
+ break;
}
}
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 047dc2fa92..d2ee3e44c5 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -37,9 +37,9 @@
// Viewer libs
#include "llviewercontrol.h"
#include "llmediactrl.h"
-#include "llalertdialog.h"
// Linden libs
+#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
@@ -56,7 +56,7 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)
// do not build the floater if there the url is empty
if (gSavedSettings.getString("TutorialURL") == "")
{
- LLNotifications::instance().add("TutorialNotFound");
+ LLNotificationsUtil::add("TutorialNotFound");
return;
}
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index e26937e93f..13ca7638c5 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -88,32 +88,7 @@ LLFloaterInspect::~LLFloaterInspect(void)
}
//sInstance = NULL;
}
-/*
-BOOL LLFloaterInspect::isVisible()
-{
- return (!!sInstance);
-}*/
-/*
-void LLFloaterInspect::show(void* ignored)
-{
- // setForceSelection ensures that the pie menu does not deselect things when it
- // looses the focus (this can happen with "select own objects only" enabled
- // VWR-1471
- BOOL forcesel = LLSelectMgr::getInstance()->setForceSelection(TRUE);
-
- if (!sInstance) // first use
- {
- sInstance = new LLFloaterInspect;
- }
- sInstance->openFloater();
- LLToolMgr::getInstance()->setTransientTool(LLToolCompInspect::getInstance());
- LLSelectMgr::getInstance()->setForceSelection(forcesel); // restore previouis value
-
- sInstance->mObjectSelection = LLSelectMgr::getInstance()->getSelection();
- sInstance->refresh();
-}
-*/
void LLFloaterInspect::onOpen(const LLSD& key)
{
BOOL forcesel = LLSelectMgr::getInstance()->setForceSelection(TRUE);
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index a47916b7d7..844f0ac509 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -32,656 +32,45 @@
#include "llviewerprecompiledheaders.h"
-#include <utility> // for std::pair<>
-
#include "llfloaterinventory.h"
-// library includes
#include "llagent.h"
-#include "llagentwearables.h"
-#include "llcallingcard.h"
+//#include "llfirstuse.h"
#include "llfloaterreg.h"
-#include "llsdserialize.h"
-#include "llfiltereditor.h"
-#include "llspinctrl.h"
-#include "llui.h"
-#include "message.h"
-
-// newview includes
-#include "llappearancemgr.h"
-#include "llappviewer.h"
-#include "llfirstuse.h"
-#include "llfloaterchat.h"
-#include "llfloatercustomize.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
-#include "llgesturemgr.h"
-#include "lliconctrl.h"
-#include "llimview.h"
-#include "llinventorybridge.h"
-#include "llinventoryclipboard.h"
#include "llinventorymodel.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
-#include "llpreviewanim.h"
-#include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
-#include "llpreviewtexture.h"
+#include "llpanelmaininventory.h"
#include "llresmgr.h"
-#include "llscrollbar.h"
-#include "llscrollcontainer.h"
-#include "llselectmgr.h"
-#include "lltabcontainer.h"
-#include "lltooldraganddrop.h"
-#include "lluictrlfactory.h"
-#include "llviewerinventory.h"
-#include "llviewermessage.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewerwindow.h"
-#include "llvoavatarself.h"
-#include "llwearablelist.h"
-
-static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
-
-//BOOL LLFloaterInventory::sOpenNextNewItem = FALSE;
-BOOL LLFloaterInventory::sWearNewClothing = FALSE;
-LLUUID LLFloaterInventory::sWearNewClothingTransactionID;
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLFloaterInventory* inventory_view)
-: LLFloater(LLSD()),
- mFloaterInventory(inventory_view),
- mFilter(inventory_view->mActivePanel->getFilter())
-{
- LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
- updateElementsFromFilter();
-}
-
-
-void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
-
- bool since_logoff= self->childGetValue("check_since_logoff");
-
- if (!since_logoff &&
- !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) )
- {
- self->mSpinSinceHours->set(1.0f);
- }
-}
-BOOL LLFloaterInventoryFinder::postBuild()
-{
- const LLRect& viewrect = mFloaterInventory->getRect();
- setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
-
- childSetAction("All", selectAllTypes, this);
- childSetAction("None", selectNoTypes, this);
-
- mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
- childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
-
- mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
- childSetCommitCallback("spin_days_ago", onTimeAgo, this);
-
- // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff");
- childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
-
- childSetAction("Close", onCloseBtn, this);
-
- updateElementsFromFilter();
- return TRUE;
-}
-void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
-
- bool since_logoff=true;
- if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
- {
- since_logoff = false;
- }
- self->childSetValue("check_since_logoff", since_logoff);
-}
-
-void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
-{
- mFilter = filter;
- updateElementsFromFilter();
-}
-
-void LLFloaterInventoryFinder::updateElementsFromFilter()
-{
- if (!mFilter)
- return;
-
- // Get data needed for filter display
- U32 filter_types = mFilter->getFilterTypes();
- std::string filter_string = mFilter->getFilterSubString();
- LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
- U32 hours = mFilter->getHoursAgo();
-
- // update the ui elements
- LLFloater::setTitle(mFilter->getName());
- childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
-
- childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
- childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
- childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
- childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
- childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
- childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
- childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
- childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
- childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
- childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
- childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
- childSetValue("check_since_logoff", mFilter->isSinceLogoff());
- mSpinSinceHours->set((F32)(hours % 24));
- mSpinSinceDays->set((F32)(hours / 24));
-}
-
-void LLFloaterInventoryFinder::draw()
-{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
- U32 filter = 0xffffffff;
- BOOL filtered_by_all_types = TRUE;
-
- if (!childGetValue("check_animation"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
- filtered_by_all_types = FALSE;
- }
-
-
- if (!childGetValue("check_calling_card"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_clothing"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_gesture"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_landmark"))
-
-
- {
- filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_notecard"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_object"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
- filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_script"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_LSL);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_sound"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_SOUND);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_texture"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
- filtered_by_all_types = FALSE;
- }
-
- if (!childGetValue("check_snapshot"))
- {
- filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
- filtered_by_all_types = FALSE;
- }
-
- if (!filtered_by_all_types)
- {
- // don't include folders in filter, unless I've selected everything
- filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
- }
-
- // update the panel, panel will update the filter
- mFloaterInventory->mActivePanel->setShowFolderState(getCheckShowEmpty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mFloaterInventory->mActivePanel->setFilterTypes(filter);
- if (getCheckSinceLogoff())
- {
- mSpinSinceDays->set(0);
- mSpinSinceHours->set(0);
- }
- U32 days = (U32)mSpinSinceDays->get();
- U32 hours = (U32)mSpinSinceHours->get();
- if (hours > 24)
- {
- days += hours / 24;
- hours = (U32)hours % 24;
- mSpinSinceDays->set((F32)days);
- mSpinSinceHours->set((F32)hours);
- }
- hours += days * 24;
- mFloaterInventory->mActivePanel->setHoursAgo(hours);
- mFloaterInventory->mActivePanel->setSinceLogoff(getCheckSinceLogoff());
- mFloaterInventory->setFilterTextFromFilter();
-
- LLFloater::draw();
-}
-
-BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
-{
- return childGetValue("check_show_empty");
-}
-
-BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
-{
- return childGetValue("check_since_logoff");
-}
-
-void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
-{
- LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
- finderp->closeFloater();
-}
-
-// static
-void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- self->childSetValue("check_animation", TRUE);
- self->childSetValue("check_calling_card", TRUE);
- self->childSetValue("check_clothing", TRUE);
- self->childSetValue("check_gesture", TRUE);
- self->childSetValue("check_landmark", TRUE);
- self->childSetValue("check_notecard", TRUE);
- self->childSetValue("check_object", TRUE);
- self->childSetValue("check_script", TRUE);
- self->childSetValue("check_sound", TRUE);
- self->childSetValue("check_texture", TRUE);
- self->childSetValue("check_snapshot", TRUE);
-
-/*
- self->mCheckCallingCard->set(TRUE);
- self->mCheckClothing->set(TRUE);
- self->mCheckGesture->set(TRUE);
- self->mCheckLandmark->set(TRUE);
- self->mCheckNotecard->set(TRUE);
- self->mCheckObject->set(TRUE);
- self->mCheckScript->set(TRUE);
- self->mCheckSound->set(TRUE);
- self->mCheckTexture->set(TRUE);
- self->mCheckSnapshot->set(TRUE);*/
-}
-
-//static
-void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- /*
- self->childSetValue("check_animation", FALSE);
- self->mCheckCallingCard->set(FALSE);
- self->mCheckClothing->set(FALSE);
- self->mCheckGesture->set(FALSE);
- self->mCheckLandmark->set(FALSE);
- self->mCheckNotecard->set(FALSE);
- self->mCheckObject->set(FALSE);
- self->mCheckScript->set(FALSE);
- self->mCheckSound->set(FALSE);
- self->mCheckTexture->set(FALSE);
- self->mCheckSnapshot->set(FALSE);*/
-
-
- self->childSetValue("check_animation", FALSE);
- self->childSetValue("check_calling_card", FALSE);
- self->childSetValue("check_clothing", FALSE);
- self->childSetValue("check_gesture", FALSE);
- self->childSetValue("check_landmark", FALSE);
- self->childSetValue("check_notecard", FALSE);
- self->childSetValue("check_object", FALSE);
- self->childSetValue("check_script", FALSE);
- self->childSetValue("check_sound", FALSE);
- self->childSetValue("check_texture", FALSE);
- self->childSetValue("check_snapshot", FALSE);
-}
-
+#include "llviewerfoldertype.h"
+#include "lltransientfloatermgr.h"
///----------------------------------------------------------------------------
/// LLFloaterInventory
///----------------------------------------------------------------------------
-void LLSaveFolderState::setApply(BOOL apply)
-{
- mApply = apply;
- // before generating new list of open folders, clear the old one
- if(!apply)
- {
- clearOpenFolders();
- }
-}
-
-void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
-{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
- if(mApply)
- {
- // we're applying the open state
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
- LLUUID id(bridge->getUUID());
- if(mOpenFolders.find(id) != mOpenFolders.end())
- {
- folder->setOpen(TRUE);
- }
- else
- {
- // keep selected filter in its current state, this is less jarring to user
- if (!folder->isSelected())
- {
- folder->setOpen(FALSE);
- }
- }
- }
- else
- {
- // we're recording state at this point
- if(folder->isOpen())
- {
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
- mOpenFolders.insert(bridge->getUUID());
- }
- }
-}
LLFloaterInventory::LLFloaterInventory(const LLSD& key)
: LLFloater(key)
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
- // Menu Callbacks (non contex menus)
- mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLFloaterInventory::doToSelected, this, _2));
- mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLFloaterInventory::closeAllFolders, this));
- mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH));
- mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND));
- mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLFloaterInventory::doCreate, this, _2));
-// mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::newWindow, this));
- mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLFloaterInventory::toggleFindOptions, this));
- mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLFloaterInventory::resetFilters, this));
- mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLFloaterInventory::setSortBy, this, _2));
-
- // Controls
- // *TODO: Just use persistant settings for each of these
- U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
- BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
- BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
- BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
-
- gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
-
- mSavedFolderState = new LLSaveFolderState();
- mSavedFolderState->setApply(FALSE);
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
+}
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory.xml");
+LLFloaterInventory::~LLFloaterInventory()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
BOOL LLFloaterInventory::postBuild()
{
- gInventory.addObserver(this);
-
- mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
- mFilterTabs->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterSelected, this));
-
- //panel->getFilter()->markDefault();
-
- // Set up the default inv. panel/filter settings.
- mActivePanel = getChild<LLInventoryPanel>("All Items");
- if (mActivePanel)
- {
- // "All Items" is the previous only view, so it gets the InventorySortOrder
- mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
- mActivePanel->getFilter()->markDefault();
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2));
- }
- LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
- if (recent_items_panel)
- {
- recent_items_panel->setSinceLogoff(TRUE);
- recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
- recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- recent_items_panel->getFilter()->markDefault();
- recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2));
- }
-
- // Now load the stored settings from disk, if available.
- std::ostringstream filterSaveName;
- filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
- llinfos << "LLFloaterInventory::init: reading from " << filterSaveName << llendl;
- llifstream file(filterSaveName.str());
- LLSD savedFilterState;
- if (file.is_open())
- {
- LLSDSerialize::fromXML(savedFilterState, file);
- file.close();
-
- // Load the persistent "Recent Items" settings.
- // Note that the "All Items" settings do not persist.
- if(recent_items_panel)
- {
- if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
- {
- LLSD recent_items = savedFilterState.get(
- recent_items_panel->getFilter()->getName());
- recent_items_panel->getFilter()->fromLLSD(recent_items);
- }
- }
-
- }
-
-
- mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
- if (mFilterEditor)
- {
- mFilterEditor->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterEdit, this, _2));
- }
-
- // *TODO:Get the cost info from the server
- const std::string upload_cost("10");
- childSetLabelArg("Upload Image", "[COST]", upload_cost);
- childSetLabelArg("Upload Sound", "[COST]", upload_cost);
- childSetLabelArg("Upload Animation", "[COST]", upload_cost);
- childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-
+ mPanelMainInventory = getChild<LLPanelMainInventory>("Inventory Panel");
return TRUE;
}
-// Destroys the object
-LLFloaterInventory::~LLFloaterInventory( void )
-{
- // Save the filters state.
- LLSD filterRoot;
- LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
- if (all_items_panel)
- {
- LLInventoryFilter* filter = all_items_panel->getFilter();
- LLSD filterState;
- filter->toLLSD(filterState);
- filterRoot[filter->getName()] = filterState;
- }
-
- LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
- if (recent_items_panel)
- {
- LLInventoryFilter* filter = recent_items_panel->getFilter();
- LLSD filterState;
- filter->toLLSD(filterState);
- filterRoot[filter->getName()] = filterState;
- }
-
- std::ostringstream filterSaveName;
- filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
- llofstream filtersFile(filterSaveName.str());
- if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
- {
- llwarns << "Could not write to filters save file " << filterSaveName << llendl;
- }
- else
- filtersFile.close();
-
- gInventory.removeObserver(this);
- delete mSavedFolderState;
-}
void LLFloaterInventory::draw()
{
- if (LLInventoryModel::isEverythingFetched())
- {
- updateTitle();
- }
+ updateTitle();
LLFloater::draw();
}
-void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
-{
- if (item->getFiltered())
- {
- item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
-}
-
-void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
-{
- if (folder->getFiltered() && folder->getParentFolder())
- {
- folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- // if this folder didn't pass the filter, and none of its descendants did
- else if (!folder->getFiltered() && !folder->hasFilteredDescendants())
- {
- folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
- }
-}
-
-void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
-{
- if (item->getFiltered() && !mItemSelected)
- {
- item->getRoot()->setSelection(item, FALSE, FALSE);
- if (item->getParentFolder())
- {
- item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- item->getRoot()->scrollToShowSelection();
- mItemSelected = TRUE;
- }
-}
-
-void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
-{
- if (folder->getFiltered() && !mItemSelected)
- {
- folder->getRoot()->setSelection(folder, FALSE, FALSE);
- if (folder->getParentFolder())
- {
- folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- folder->getRoot()->scrollToShowSelection();
- mItemSelected = TRUE;
- }
-}
-
-void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item)
-{
- if (item->getParentFolder() && item->isSelected())
- {
- item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
-}
-
-void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
-{
- if (folder->getParentFolder() && folder->isSelected())
- {
- folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
-}
-
-void LLFloaterInventory::startSearch()
-{
- // this forces focus to line editor portion of search editor
- if (mFilterEditor)
- {
- mFilterEditor->focusFirstItem(TRUE);
- }
-}
-
-void LLFloaterInventory::onOpen(const LLSD& key)
-{
- LLFirstUse::useInventory();
-}
-
-BOOL LLFloaterInventory::handleKeyHere(KEY key, MASK mask)
-{
- LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
- if (root_folder)
- {
- // first check for user accepting current search results
- if (mFilterEditor
- && mFilterEditor->hasFocus()
- && (key == KEY_RETURN
- || key == KEY_DOWN)
- && mask == MASK_NONE)
- {
- // move focus to inventory proper
- mActivePanel->setFocus(TRUE);
- root_folder->scrollToShowSelection();
- return TRUE;
- }
-
- if (mActivePanel->hasFocus() && key == KEY_UP)
- {
- startSearch();
- }
- }
-
- return LLFloater::handleKeyHere(key, mask);
-
-}
-
void LLFloaterInventory::updateTitle()
{
LLLocale locale(LLLocale::USER_LOCALE);
@@ -690,145 +79,50 @@ void LLFloaterInventory::updateTitle()
LLStringUtil::format_map_t string_args;
string_args["[ITEM_COUNT]"] = item_count_string;
- string_args["[FILTER]"] = mFilterText;
+ string_args["[FILTER]"] = mPanelMainInventory->getFilterText();
if (LLInventoryModel::backgroundFetchActive())
{
setTitle(getString("TitleFetching", string_args));
}
- else
+ else if (LLInventoryModel::isEverythingFetched())
{
setTitle(getString("TitleCompleted", string_args));
- }
+ }
+ else
+ {
+ setTitle(getString("Title"));
+ }
}
-
void LLFloaterInventory::changed(U32 mask)
{
updateTitle();
}
-//----------------------------------------------------------------------------
-// menu callbacks
-
-void LLFloaterInventory::doToSelected(const LLSD& userdata)
-{
- getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
-}
-
-void LLFloaterInventory::closeAllFolders()
-{
- getPanel()->getRootFolder()->closeAllFolders();
-}
-
-void LLFloaterInventory::doCreate(const LLSD& userdata)
+LLInventoryPanel* LLFloaterInventory::getPanel()
{
- menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+ if (mPanelMainInventory)
+ return mPanelMainInventory->getPanel();
+ return NULL;
}
-void LLFloaterInventory::resetFilters()
-{
- LLFloaterInventoryFinder *finder = getFinder();
- getActivePanel()->getFilter()->resetDefault();
- if (finder)
- {
- finder->updateElementsFromFilter();
- }
-
- setFilterTextFromFilter();
-}
-
-void LLFloaterInventory::setSortBy(const LLSD& userdata)
-{
- std::string sort_field = userdata.asString();
- if (sort_field == "name")
- {
- U32 order = getActivePanel()->getSortOrder();
- getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
-
- gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
- gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
- }
- else if (sort_field == "date")
- {
- U32 order = getActivePanel()->getSortOrder();
- getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
-
- gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
- gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
- }
- else if (sort_field == "foldersalwaysbyname")
- {
- U32 order = getActivePanel()->getSortOrder();
- if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
- {
- order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
- gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
- }
- else
- {
- order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
- gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
- }
- getActivePanel()->setSortOrder( order );
- }
- else if (sort_field == "systemfolderstotop")
- {
- U32 order = getActivePanel()->getSortOrder();
- if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
- {
- order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
- gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
- }
- else
- {
- order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
- gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
- }
- getActivePanel()->setSortOrder( order );
- }
-}
-
-//----------------------------------------------------------------------------
-
// 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 (!gAgent.cameraMouselook())
{
- iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD());
+ iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num));
}
return iv;
}
// static
-LLFloaterInventory* LLFloaterInventory::getActiveInventory()
-{
- LLFloaterInventory* res = NULL;
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- S32 z_min = S32_MAX;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
- if (iv)
- {
- S32 z_order = gFloaterView->getZOrder(iv);
- if (z_order < z_min)
- {
- res = iv;
- z_min = z_order;
- }
- }
- }
- return res;
-}
-
-// static
void LLFloaterInventory::cleanup()
{
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
@@ -842,1112 +136,7 @@ void LLFloaterInventory::cleanup()
}
}
-void LLFloaterInventory::toggleFindOptions()
-{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
- LLFloater *floater = getFinder();
- if (!floater)
- {
- LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
- mFinderHandle = finder->getHandle();
- finder->openFloater();
- addDependentFloater(mFinderHandle);
-
- // start background fetch of folders
- gInventory.startBackgroundFetch();
- }
- else
- {
- floater->closeFloater();
- }
-}
-
-// static
-BOOL LLFloaterInventory::filtersVisible(void* user_data)
-{
- LLFloaterInventory* self = (LLFloaterInventory*)user_data;
- if(!self) return FALSE;
-
- return self->getFinder() != NULL;
-}
-
-void LLFloaterInventory::onClearSearch()
-{
- LLFloater *finder = getFinder();
- if (mActivePanel)
- {
- mActivePanel->setFilterSubString(LLStringUtil::null);
- mActivePanel->setFilterTypes(0xffffffff);
- }
-
- if (finder)
- {
- LLFloaterInventoryFinder::selectAllTypes(finder);
- }
-
- // re-open folders that were initially open
- if (mActivePanel)
- {
- mSavedFolderState->setApply(TRUE);
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- LLOpenFoldersWithSelection opener;
- mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
- mActivePanel->getRootFolder()->scrollToShowSelection();
- }
-}
-
-void LLFloaterInventory::onFilterEdit(const std::string& search_string )
-{
- if (search_string == "")
- {
- onClearSearch();
- }
- if (!mActivePanel)
- {
- return;
- }
-
- gInventory.startBackgroundFetch();
-
- std::string uppercase_search_string = search_string;
- LLStringUtil::toUpper(uppercase_search_string);
- if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
- {
- // current filter and new filter empty, do nothing
- return;
- }
-
- // save current folder open state if no filter currently applied
- if (!mActivePanel->getRootFolder()->isFilterModified())
- {
- mSavedFolderState->setApply(FALSE);
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- }
-
- // set new filter string
- mActivePanel->setFilterSubString(uppercase_search_string);
-}
-
-
- //static
- BOOL LLFloaterInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
- {
- LLFloaterInventory* active_view = NULL;
-
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
- if (iv)
- {
- if (gFocusMgr.childHasKeyboardFocus(iv))
- {
- active_view = iv;
- break;
- }
- }
- }
-
- if (!active_view)
- {
- return FALSE;
- }
-
- std::string search_string(find_text);
-
- if (search_string.empty())
- {
- return FALSE;
- }
-
- if (active_view->mActivePanel &&
- active_view->mActivePanel->getRootFolder()->search(first_item, search_string, backward))
- {
- return TRUE;
- }
-
- return FALSE;
- }
-
-void LLFloaterInventory::onFilterSelected()
-{
- // Find my index
- mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
-
- if (!mActivePanel)
- {
- return;
- }
- LLInventoryFilter* filter = mActivePanel->getFilter();
- LLFloaterInventoryFinder *finder = getFinder();
- if (finder)
- {
- finder->changeFilter(filter);
- }
- if (filter->isActive())
- {
- // If our filter is active we may be the first thing requiring a fetch so we better start it here.
- gInventory.startBackgroundFetch();
- }
- setFilterTextFromFilter();
-}
-
-BOOL LLFloaterInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- // Check to see if we are auto scrolling from the last frame
- LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
- BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
- if(mFilterTabs)
- {
- if(needsToScroll)
- {
- mFilterTabs->startDragAndDropDelayTimer();
- }
- }
-
- BOOL handled = LLFloater::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
- return handled;
-}
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi )
-{
- EInventoryIcon idx = OBJECT_ICON_NAME;
- if ( item_is_multi )
- {
- idx = OBJECT_MULTI_ICON_NAME;
- }
-
- switch(asset_type)
- {
- case LLAssetType::AT_TEXTURE:
- if(LLInventoryType::IT_SNAPSHOT == inventory_type)
- {
- idx = SNAPSHOT_ICON_NAME;
- }
- else
- {
- idx = TEXTURE_ICON_NAME;
- }
- break;
-
- case LLAssetType::AT_SOUND:
- idx = SOUND_ICON_NAME;
- break;
- case LLAssetType::AT_CALLINGCARD:
- if(attachment_point!= 0)
- {
- idx = CALLINGCARD_ONLINE_ICON_NAME;
- }
- else
- {
- idx = CALLINGCARD_OFFLINE_ICON_NAME;
- }
- break;
- case LLAssetType::AT_LANDMARK:
- if(attachment_point!= 0)
- {
- idx = LANDMARK_VISITED_ICON_NAME;
- }
- else
- {
- idx = LANDMARK_ICON_NAME;
- }
- break;
- case LLAssetType::AT_SCRIPT:
- case LLAssetType::AT_LSL_TEXT:
- case LLAssetType::AT_LSL_BYTECODE:
- idx = SCRIPT_ICON_NAME;
- break;
- case LLAssetType::AT_CLOTHING:
- idx = CLOTHING_ICON_NAME;
- case LLAssetType::AT_BODYPART :
- if(LLAssetType::AT_BODYPART == asset_type)
- {
- idx = BODYPART_ICON_NAME;
- }
- switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
- {
- case WT_SHAPE:
- idx = BODYPART_SHAPE_ICON_NAME;
- break;
- case WT_SKIN:
- idx = BODYPART_SKIN_ICON_NAME;
- break;
- case WT_HAIR:
- idx = BODYPART_HAIR_ICON_NAME;
- break;
- case WT_EYES:
- idx = BODYPART_EYES_ICON_NAME;
- break;
- case WT_SHIRT:
- idx = CLOTHING_SHIRT_ICON_NAME;
- break;
- case WT_PANTS:
- idx = CLOTHING_PANTS_ICON_NAME;
- break;
- case WT_SHOES:
- idx = CLOTHING_SHOES_ICON_NAME;
- break;
- case WT_SOCKS:
- idx = CLOTHING_SOCKS_ICON_NAME;
- break;
- case WT_JACKET:
- idx = CLOTHING_JACKET_ICON_NAME;
- break;
- case WT_GLOVES:
- idx = CLOTHING_GLOVES_ICON_NAME;
- break;
- case WT_UNDERSHIRT:
- idx = CLOTHING_UNDERSHIRT_ICON_NAME;
- break;
- case WT_UNDERPANTS:
- idx = CLOTHING_UNDERPANTS_ICON_NAME;
- break;
- case WT_SKIRT:
- idx = CLOTHING_SKIRT_ICON_NAME;
- break;
- case WT_ALPHA:
- idx = CLOTHING_ALPHA_ICON_NAME;
- break;
- case WT_TATTOO:
- idx = CLOTHING_TATTOO_ICON_NAME;
- break;
- default:
- // no-op, go with choice above
- break;
- }
- break;
- case LLAssetType::AT_NOTECARD:
- idx = NOTECARD_ICON_NAME;
- break;
- case LLAssetType::AT_ANIMATION:
- idx = ANIMATION_ICON_NAME;
- break;
- case LLAssetType::AT_GESTURE:
- idx = GESTURE_ICON_NAME;
- break;
- case LLAssetType::AT_FAVORITE:
- //TODO - need bette idx
- idx = LANDMARK_ICON_NAME;
- break;
- case LLAssetType::AT_LINK:
- idx = LINKITEM_ICON_NAME;
- break;
- case LLAssetType::AT_LINK_FOLDER:
- idx = LINKFOLDER_ICON_NAME;
- break;
- default:
- break;
- }
-
- return ICON_NAME[idx];
-}
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi)
-{
- const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
- return LLUI::getUIImage(icon_name);
-}
-
-const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
-const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
-const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
-static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
-
-LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p)
-: LLPanel(p),
- mInventoryObserver(NULL),
- mFolders(NULL),
- mScroller(NULL),
- mSortOrderSetting(p.sort_order_setting),
- mInventory(p.inventory),
- mAllowMultiSelect(p.allow_multi_select),
- mHasInventoryConnection(false),
- mStartFolderString(p.start_folder)
-, mBuildDefaultHierarchy(true)
-, mInvFVBridgeBuilder(NULL)
-{
- mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
-
- // contex menu callbacks
- mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
- mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH));
- mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND));
- mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
- mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
- mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
-
- setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
- setBackgroundVisible(TRUE);
- setBackgroundOpaque(TRUE);
-}
-
-BOOL LLInventoryPanel::postBuild()
-{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
-
- mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
-
- // create root folder
- {
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLFolderView::Params p;
- p.name = getName();
- p.rect = folder_rect;
- p.parent_panel = this;
- mFolders = LLUICtrlFactory::create<LLFolderView>(p);
- mFolders->setAllowMultiSelect(mAllowMultiSelect);
- }
-
- mCommitCallbackRegistrar.popScope();
-
- mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
-
- // scroller
- {
- LLRect scroller_view_rect = getRect();
- scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params p;
- p.name("Inventory Scroller");
- p.rect(scroller_view_rect);
- p.follows.flags(FOLLOWS_ALL);
- p.reserve_scroll_corner(true);
- p.tab_stop(true);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
- }
- addChild(mScroller);
- mScroller->addChild(mFolders);
-
- mFolders->setScrollContainer(mScroller);
-
- // set up the callbacks from the inventory we're viewing, and then
- // build everything.
- mInventoryObserver = new LLInventoryPanelObserver(this);
- mInventory->addObserver(mInventoryObserver);
-
- // determine the root folder, if any, so inventory contents show just the children
- // of that folder (i.e. not including the folder itself).
- const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString);
-
- if ("inventory" == mStartFolderString)
- {
- mStartFolderID = gInventory.getRootFolderID();
- }
- else if ("library" == mStartFolderString)
- {
- mStartFolderID = gInventory.getLibraryRootFolderID();
- }
- else
- {
- mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
- }
-
- // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
- if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
- {
- rebuildViewsFor(mStartFolderID);
- mHasInventoryConnection = true;
- }
-
- // bit of a hack to make sure the inventory is open.
- mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory");
-
- if (mSortOrderSetting != INHERIT_SORT_ORDER)
- {
- setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
- }
- else
- {
- setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
- }
- mFolders->setSortOrder(mFolders->getFilter()->getSortOrder());
-
- return TRUE;
-}
-
-LLInventoryPanel::~LLInventoryPanel()
-{
- // should this be a global setting?
- if (mFolders)
- {
- U32 sort_order = mFolders->getSortOrder();
- if (mSortOrderSetting != INHERIT_SORT_ORDER)
- {
- gSavedSettings.setU32(mSortOrderSetting, sort_order);
- }
- }
-
- // LLView destructor will take care of the sub-views.
- mInventory->removeObserver(mInventoryObserver);
- delete mInventoryObserver;
- mScroller = NULL;
-}
-
-LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
-void LLInventoryPanel::draw()
-{
- // select the desired item (in case it wasn't loaded when the selection was requested)
- mFolders->updateSelection();
- LLPanel::draw();
-}
-
-void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)
-{
- mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);
-}
-
-void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
-{
- mFolders->getFilter()->setFilterPermissions(filter_perm_mask);
-}
-
-void LLInventoryPanel::setFilterSubString(const std::string& string)
-{
- mFolders->getFilter()->setFilterSubString(string);
-}
-
-void LLInventoryPanel::setSortOrder(U32 order)
-{
- mFolders->getFilter()->setSortOrder(order);
- if (mFolders->getFilter()->isModified())
- {
- mFolders->setSortOrder(order);
- // try to keep selection onscreen, even if it wasn't to start with
- mFolders->scrollToShowSelection();
- }
-}
-
-void LLInventoryPanel::setSinceLogoff(BOOL sl)
-{
- mFolders->getFilter()->setDateRangeLastLogoff(sl);
-}
-
-void LLInventoryPanel::setHoursAgo(U32 hours)
-{
- mFolders->getFilter()->setHoursAgo(hours);
-}
-
-void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
-{
- mFolders->getFilter()->setShowFolderState(show);
-}
-
-LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
-{
- return mFolders->getFilter()->getShowFolderState();
-}
-
-static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
-
-void LLInventoryPanel::modelChanged(U32 mask)
-{
- LLFastTimer t2(FTM_REFRESH);
-
- bool handled = false;
-
- // inventory just initialized, do complete build
- if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
- {
- rebuildViewsFor(mStartFolderID);
- mHasInventoryConnection = true;
- return;
- }
-
- if(mask & LLInventoryObserver::LABEL)
- {
- handled = true;
- // label change - empty out the display name for each object
- // in this change set.
- const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
- std::set<LLUUID>::const_iterator id_it = changed_items.begin();
- std::set<LLUUID>::const_iterator id_end = changed_items.end();
- LLFolderViewItem* view = NULL;
- LLInvFVBridge* bridge = NULL;
- for (;id_it != id_end; ++id_it)
- {
- view = mFolders->getItemByID(*id_it);
- if(view)
- {
- // request refresh on this item (also flags for filtering)
- bridge = (LLInvFVBridge*)view->getListener();
- if(bridge)
- { // Clear the display name first, so it gets properly re-built during refresh()
- bridge->clearDisplayName();
- }
- view->refresh();
- }
- }
- }
- if((mask & (LLInventoryObserver::STRUCTURE
- | LLInventoryObserver::ADD
- | LLInventoryObserver::REMOVE)) != 0)
- {
- handled = true;
- // Record which folders are open by uuid.
- LLInventoryModel* model = getModel();
- if (model)
- {
- const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-
- std::set<LLUUID>::const_iterator id_it = changed_items.begin();
- std::set<LLUUID>::const_iterator id_end = changed_items.end();
- for (;id_it != id_end; ++id_it)
- {
- // sync view with model
- LLInventoryObject* model_item = model->getObject(*id_it);
- LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
-
- if (model_item)
- {
- if (!view_item)
- {
- // this object was just created, need to build a view for it
- if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
- {
- llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
- }
- buildNewViews(*id_it);
-
- // select any newly created object
- // that has the auto rename at top of folder
- // root set
- if(mFolders->getRoot()->needsAutoRename())
- {
- setSelection(*id_it, FALSE);
- }
- }
- else
- {
- // this object was probably moved, check its parent
- if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
- {
- llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl;
- }
-
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-
- // added check against NULL for cases when Inventory panel contains startFolder.
- // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
- // this check is a fix for bug EXT-1859.
- if (NULL != new_parent && view_item->getParentFolder() != new_parent)
- {
- view_item->getParentFolder()->extractItem(view_item);
- view_item->addToFolder(new_parent, mFolders);
- }
- }
- }
- else
- {
- if (view_item)
- {
- if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
- {
- llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
- }
- // item in view but not model, need to delete view
- view_item->destroyView();
- }
- else
- {
- llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
- }
- }
- }
- }
- }
-
- if (!handled)
- {
- // it's a small change that only requires a refresh.
- // *TODO: figure out a more efficient way to do the refresh
- // since it is expensive on large inventories
- mFolders->refresh();
- }
-}
-
-
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
-{
- LLFolderViewItem* old_view = NULL;
-
- // get old LLFolderViewItem
- old_view = mFolders->getItemByID(id);
- if (old_view && id.notNull())
- {
- old_view->destroyView();
- }
-
- buildNewViews(id);
-}
-
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
-{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
- LLFolderViewItem* itemp = NULL;
- LLInventoryObject* objectp = NULL;
-
- // Don't add the start folder (the inventory panel will show contents
- // beginning with the children of the starting folder, excluding the starting folder itself).
- if (id != mStartFolderID)
- {
- objectp = gInventory.getObject(id);
- if (objectp)
- {
- const LLUUID &parent_id = objectp->getParentUUID();
- // If this item's parent is the starting folder, then just add it to the top level (recall that
- // the starting folder isn't actually represented in the view, parent_folder would be NULL in
- // this case otherwise).
- LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ?
- mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id));
-
- // This item exists outside the inventory's hierarchy, so don't add it.
- if (!parent_folder)
- {
- return;
- }
-
- if (objectp->getType() <= LLAssetType::AT_NONE ||
- objectp->getType() >= LLAssetType::AT_COUNT)
- {
- llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " <<
- ((S32) objectp->getType()) << llendl;
- return;
- }
-
- if (objectp->getType() == LLAssetType::AT_CATEGORY &&
- objectp->getActualType() != LLAssetType::AT_LINK_FOLDER)
- {
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
- objectp->getType(),
- LLInventoryType::IT_CATEGORY,
- this,
- objectp->getUUID());
-
- if (new_listener)
- {
- LLFolderViewFolder::Params p;
- p.name = new_listener->getDisplayName();
- p.icon = new_listener->getIcon();
- p.root = mFolders;
- p.listener = new_listener;
- LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
-
- folderp->setItemSortOrder(mFolders->getSortOrder());
- itemp = folderp;
- }
- }
- else
- {
- // Build new view for item
- LLInventoryItem* item = (LLInventoryItem*)objectp;
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
- item->getActualType(),
- item->getInventoryType(),
- this,
- item->getUUID(),
- item->getFlags());
-
- if (new_listener)
- {
- LLFolderViewItem::Params params;
- params.name(new_listener->getDisplayName());
- params.icon(new_listener->getIcon());
- params.creation_date(new_listener->getCreationDate());
- params.root(mFolders);
- params.listener(new_listener);
- params.rect(LLRect (0, 0, 0, 0));
- itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
- }
- }
-
- if (itemp)
- {
- itemp->addToFolder(parent_folder, mFolders);
- }
- }
- }
-
- // If this is a folder, add the children of the folder and recursively add any
- // child folders.
- if ((id == mStartFolderID) ||
- (objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
- {
- LLViewerInventoryCategory::cat_array_t* categories;
- LLViewerInventoryItem::item_array_t* items;
-
- mInventory->lockDirectDescendentArrays(id, categories, items);
- if(categories)
- {
- S32 count = categories->count();
- for(S32 i = 0; i < count; ++i)
- {
- LLInventoryCategory* cat = categories->get(i);
- buildNewViews(cat->getUUID());
- }
- }
- if(items)
- {
- S32 count = items->count();
- for(S32 i = 0; i < count; ++i)
- {
- LLInventoryItem* item = items->get(i);
- buildNewViews(item->getUUID());
- }
- }
- mInventory->unlockDirectDescendentArrays(id);
- }
-}
-
-struct LLConfirmPurgeData
-{
- LLUUID mID;
- LLInventoryModel* mModel;
-};
-
-class LLIsNotWorn : public LLInventoryCollectFunctor
-{
-public:
- LLIsNotWorn() {}
- virtual ~LLIsNotWorn() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
- {
- return !gAgentWearables.isWearingItem(item->getUUID());
- }
-};
-
-class LLOpenFolderByID : public LLFolderViewFunctor
-{
-public:
- LLOpenFolderByID(const LLUUID& id) : mID(id) {}
- virtual ~LLOpenFolderByID() {}
- virtual void doFolder(LLFolderViewFolder* folder)
- {
- if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- virtual void doItem(LLFolderViewItem* item) {}
-protected:
- const LLUUID& mID;
-};
-
-
-void LLInventoryPanel::openSelected()
-{
- LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
- if(!folder_item) return;
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
- if(!bridge) return;
- bridge->openItem();
-}
-
-BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
-{
- BOOL handled = LLView::handleHover(x, y, mask);
- if(handled)
- {
- ECursorType cursor = getWindow()->getCursor();
- if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
- {
- // replace arrow cursor with arrow and hourglass cursor
- getWindow()->setCursor(UI_CURSOR_WORKING);
- }
- }
- else
- {
- getWindow()->setCursor(UI_CURSOR_ARROW);
- }
- return TRUE;
-}
-
-BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
-
- BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
- if (handled)
- {
- mFolders->setDragAndDropThisFrame();
- }
-
- return handled;
-}
-
-void LLInventoryPanel::onFocusLost()
-{
- // inventory no longer handles cut/copy/paste/delete
- if (LLEditMenuHandler::gEditMenuHandler == mFolders)
- {
- LLEditMenuHandler::gEditMenuHandler = NULL;
- }
-
- LLPanel::onFocusLost();
-}
-
-void LLInventoryPanel::onFocusReceived()
-{
- // inventory now handles cut/copy/paste/delete
- LLEditMenuHandler::gEditMenuHandler = mFolders;
-
- LLPanel::onFocusReceived();
-}
-
-
-void LLInventoryPanel::openAllFolders()
-{
- mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
- mFolders->arrangeAll();
-}
-
-void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type)
-{
- LLUUID category_id = mInventory->findCategoryUUIDForType(type);
- LLOpenFolderByID opener(category_id);
- mFolders->applyFunctorRecursively(opener);
-}
-
-void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
-{
- // Don't select objects in COF (e.g. to prevent refocus when items are worn).
- const LLInventoryObject *obj = gInventory.getObject(obj_id);
- if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
- {
- return;
- }
- mFolders->setSelectionByID(obj_id, take_keyboard_focus);
-}
-
-void LLInventoryPanel::clearSelection()
-{
- mFolders->clearSelection();
-}
-
-void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
-{
- LLFolderView* fv = getRootFolder();
- if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
- {
- fv->setNeedsAutoRename(FALSE);
- if (items.size()) // new asset is visible and selected
- {
- fv->startRenamingSelectedItem();
- }
- }
- // Seraph - Put determineFolderType in here for ensemble typing?
-}
-
-//----------------------------------------------------------------------------
-
-void LLInventoryPanel::doToSelected(const LLSD& userdata)
-{
- mFolders->doToSelected(&gInventory, userdata);
-}
-
-void LLInventoryPanel::doCreate(const LLSD& userdata)
-{
- menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
-}
-
-bool LLInventoryPanel::beginIMSession()
-{
- std::set<LLUUID> selected_items;
- mFolders->getSelectionList(selected_items);
-
- std::string name;
- static int session_num = 1;
-
- LLDynamicArray<LLUUID> members;
- EInstantMessage type = IM_SESSION_CONFERENCE_START;
-
- std::set<LLUUID>::const_iterator iter;
- for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
- {
-
- LLUUID item = *iter;
- LLFolderViewItem* folder_item = mFolders->getItemByID(item);
-
- if(folder_item)
- {
- LLFolderViewEventListener* fve_listener = folder_item->getListener();
- if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
- {
-
- LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
- if(!bridge) return true;
- LLViewerInventoryCategory* cat = bridge->getCategory();
- if(!cat) return true;
- name = cat->getName();
- LLUniqueBuddyCollector is_buddy;
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendentsIf(bridge->getUUID(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- is_buddy);
- S32 count = item_array.count();
- if(count > 0)
- {
- LLFloaterReg::showInstance("communicate");
- // create the session
- LLAvatarTracker& at = LLAvatarTracker::instance();
- LLUUID id;
- for(S32 i = 0; i < count; ++i)
- {
- id = item_array.get(i)->getCreatorUUID();
- if(at.isBuddyOnline(id))
- {
- members.put(id);
- }
- }
- }
- }
- else
- {
- LLFolderViewItem* folder_item = mFolders->getItemByID(item);
- if(!folder_item) return true;
- LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
-
- if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
- {
- LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
-
- if (inv_item)
- {
- LLAvatarTracker& at = LLAvatarTracker::instance();
- LLUUID id = inv_item->getCreatorUUID();
-
- if(at.isBuddyOnline(id))
- {
- members.put(id);
- }
- }
- } //if IT_CALLINGCARD
- } //if !IT_CATEGORY
- }
- } //for selected_items
-
- // the session_id is randomly generated UUID which will be replaced later
- // with a server side generated number
-
- if (name.empty())
- {
- name = llformat("Session %d", session_num++);
- }
-
- gIMMgr->addSession(name, type, members[0], members);
-
- return true;
-}
-
-bool LLInventoryPanel::attachObject(const LLSD& userdata)
-{
- std::set<LLUUID> selected_items;
- mFolders->getSelectionList(selected_items);
-
- std::string joint_name = userdata.asString();
- LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
- LLViewerJointAttachment* attachmentp = NULL;
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
- {
- LLVOAvatar::attachment_map_t::iterator curiter = iter++;
- LLViewerJointAttachment* attachment = curiter->second;
- if (attachment->getName() == joint_name)
- {
- attachmentp = attachment;
- break;
- }
- }
- if (attachmentp == NULL)
- {
- return true;
- }
-
- for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin();
- set_iter != selected_items.end();
- ++set_iter)
- {
- const LLUUID &id = *set_iter;
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
- if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
- {
- rez_attachment(item, attachmentp);
- }
- else if(item && item->isComplete())
- {
- // must be in library. copy it to our inventory and put it on.
- LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
- copy_inventory_item(gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- }
- gFocusMgr.setKeyboardFocus(NULL);
-
- return true;
-}
-
-
-//----------------------------------------------------------------------------
-
-// static DEBUG ONLY:
-void LLInventoryPanel::dumpSelectionInformation(void* user_data)
-{
- LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
- iv->mFolders->dumpSelectionInformation();
-}
-
-BOOL LLInventoryPanel::getSinceLogoff()
-{
- return mFolders->getFilter()->isSinceLogoff();
-}
-
-void example_param_block_usage()
+void LLFloaterInventory::onOpen(const LLSD& key)
{
- LLInventoryPanel::Params param_block;
- param_block.name(std::string("inventory"));
-
- param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
- param_block.allow_multi_select(true);
- param_block.filter(LLInventoryPanel::Filter()
- .sort_order(1)
- .types(0xffff0000));
- param_block.inventory(&gInventory);
- param_block.has_border(true);
-
- LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-
- param_block = LLInventoryPanel::Params();
- param_block.name(std::string("inventory"));
-
- //LLSD param_block_sd;
- //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
- //param_block_sd["allow_multi_select"] = true;
- //param_block_sd["filter"]["sort_order"] = 1;
- //param_block_sd["filter"]["types"] = (S32)0xffff0000;
- //param_block_sd["has_border"] = true;
-
- //LLInitParam::LLSDParser(param_block_sd).parse(param_block);
-
- LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+ //LLFirstUse::useInventory();
}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index 4c9ac5d4c6..b661c391a7 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -31,366 +31,50 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLINVENTORYVIEW_H
-#define LL_LLINVENTORYVIEW_H
+#ifndef LL_LLFLOATERINVENTORY_H
+#define LL_LLFLOATERINVENTORY_H
-#include "llassetstorage.h"
-#include "lldarray.h"
#include "llfloater.h"
-#include "llinventory.h"
-#include "llinventoryfilter.h"
-#include "llfolderview.h"
-#include "llinventorymodel.h"
-#include "lluictrlfactory.h"
-#include <set>
+#include "llfoldertype.h"
+class LLInventoryPanel;
+class LLPanelMainInventory;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFloaterInventory
//
-// This is the agent inventory _floater_.
-// It deals with the buttons and views used to navigate as
-// well as controls the behavior of the overall object.
+// This deals with the buttons and views used to navigate as
+// well as controlling the behavior of the overall object.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFolderViewItem;
-class LLInventoryFilter;
-class LLInventoryModel;
-class LLInvFVBridge;
-class LLInventoryFVBridgeBuilder;
-class LLMenuBarGL;
-class LLCheckBoxCtrl;
-class LLSpinCtrl;
-class LLScrollContainer;
-class LLTextBox;
-class LLIconCtrl;
-class LLSaveFolderState;
-class LLFilterEditor;
-class LLTabContainer;
-
-class LLInventoryPanel : public LLPanel
+class LLFloaterInventory : public LLFloater
{
public:
- static const std::string DEFAULT_SORT_ORDER;
- static const std::string RECENTITEMS_SORT_ORDER;
- static const std::string INHERIT_SORT_ORDER;
-
- struct Filter : public LLInitParam::Block<Filter>
- {
- Optional<U32> sort_order;
- Optional<U32> types;
- Optional<std::string> search_string;
-
- Filter()
- : sort_order("sort_order"),
- types("types", 0xffffffff),
- search_string("search_string")
- {}
- };
-
- struct Params
- : public LLInitParam::Block<Params, LLPanel::Params>
- {
- Optional<std::string> sort_order_setting;
- Optional<LLInventoryModel*> inventory;
- Optional<bool> allow_multi_select;
- Optional<Filter> filter;
- Optional<std::string> start_folder;
-
- Params()
- : sort_order_setting("sort_order_setting"),
- inventory("", &gInventory),
- allow_multi_select("allow_multi_select", true),
- filter("filter"),
- start_folder("start_folder")
- {}
- };
-
-protected:
- LLInventoryPanel(const Params&);
- friend class LLUICtrlFactory;
-
-public:
- virtual ~LLInventoryPanel();
-
- LLInventoryModel* getModel() { return mInventory; }
-
- BOOL postBuild();
-
- // LLView methods
- void draw();
- BOOL handleHover(S32 x, S32 y, MASK mask);
- BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
- // LLUICtrl methods
- /*virtual*/ void onFocusLost();
- /*virtual*/ void onFocusReceived();
-
- // Call this method to set the selection.
- void openAllFolders();
- void openDefaultFolderForType(LLAssetType::EType);
- void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
- void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }
- void clearSelection();
- LLInventoryFilter* getFilter() { return mFolders->getFilter(); }
- void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type
- U32 getFilterTypes() const { return mFolders->getFilterTypes(); }
- void setFilterPermMask(PermissionMask filter_perm_mask);
- U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }
- void setFilterSubString(const std::string& string);
- const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
- void setSortOrder(U32 order);
- U32 getSortOrder() { return mFolders->getSortOrder(); }
- void setSinceLogoff(BOOL sl);
- void setHoursAgo(U32 hours);
- BOOL getSinceLogoff();
-
- void setShowFolderState(LLInventoryFilter::EFolderShow show);
- LLInventoryFilter::EFolderShow getShowFolderState();
- void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); }
- // This method is called when something has changed about the inventory.
- void modelChanged(U32 mask);
- LLFolderView* getRootFolder() { return mFolders; }
- LLScrollContainer* getScrollableContainer() { return mScroller; }
-
- void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
-
- // Callbacks
- void doToSelected(const LLSD& userdata);
- void doCreate(const LLSD& userdata);
- bool beginIMSession();
- bool attachObject(const LLSD& userdata);
-
- // DEBUG ONLY:
- static void dumpSelectionInformation(void* user_data);
-
- void openSelected();
- void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); }
-
-protected:
- // Given the id and the parent, build all of the folder views.
- void rebuildViewsFor(const LLUUID& id);
- virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
-
-protected:
- LLInventoryModel* mInventory;
- LLInventoryObserver* mInventoryObserver;
- BOOL mAllowMultiSelect;
- std::string mSortOrderSetting;
-
-//private: // Can not make these private - needed by llinventorysubtreepanel
- LLFolderView* mFolders;
- std::string mStartFolderString;
-
- /**
- * Contains UUID of Inventory item from which hierarchy should be built.
- * Can be set with the "start_folder" xml property.
- * Default is LLUUID::null that means total Inventory hierarchy.
- */
- LLUUID mStartFolderID;
- LLScrollContainer* mScroller;
- bool mHasInventoryConnection;
-
- /**
- * Flag specified if default inventory hierarchy should be created in postBuild()
- */
- bool mBuildDefaultHierarchy;
-
- LLUUID mRootInventoryItemUUID;
-
- /**
- * Pointer to LLInventoryFVBridgeBuilder.
- *
- * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with
- * another implementation.
- * Take into account it will not be deleted by LLInventoryPanel itself.
- */
- const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
-
-};
-
-class LLFloaterInventory;
-
-class LLFloaterInventoryFinder : public LLFloater
-{
-public:
- LLFloaterInventoryFinder( LLFloaterInventory* inventory_view);
- virtual void draw();
- /*virtual*/ BOOL postBuild();
- void changeFilter(LLInventoryFilter* filter);
- void updateElementsFromFilter();
- BOOL getCheckShowEmpty();
- BOOL getCheckSinceLogoff();
-
- static void onTimeAgo(LLUICtrl*, void *);
- static void onCheckSinceLogoff(LLUICtrl*, void *);
- static void onCloseBtn(void* user_data);
- static void selectAllTypes(void* user_data);
- static void selectNoTypes(void* user_data);
-
-protected:
- LLFloaterInventory* mFloaterInventory;
- LLSpinCtrl* mSpinSinceDays;
- LLSpinCtrl* mSpinSinceHours;
- LLInventoryFilter* mFilter;
-};
-
-class LLFloaterInventory : public LLFloater, LLInventoryObserver
-{
-friend class LLFloaterInventoryFinder;
-
-public:
LLFloaterInventory(const LLSD& key);
~LLFloaterInventory();
- /*virtual*/ void changed(U32 mask);
-
- BOOL postBuild();
+ BOOL postBuild();
- //
- // Misc functions
- //
- void setFilterTextFromFilter() { mFilterText = mActivePanel->getFilter()->getFilterText(); }
- void startSearch();
-
// This method makes sure that an inventory view exists, is
// visible, and has focus. The view chosen is returned.
static LLFloaterInventory* showAgentInventory();
- // Return the active inventory view if there is one. Active is
- // defined as the inventory that is the closest to the front, and
- // is visible.
- static LLFloaterInventory* getActiveInventory();
-
- // This method calls showAgentInventory() if no views are visible,
- // or hides/destroyes them all if any are visible.
- static void toggleVisibility();
- static void toggleVisibility(void*) { toggleVisibility(); }
-
// Final cleanup, destroy all open inventory views.
static void cleanup();
- // LLView & LLFloater functionality
- virtual void onOpen(const LLSD& key);
- virtual void draw();
- virtual BOOL handleKeyHere(KEY key, MASK mask);
-
- BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
-
- LLInventoryPanel* getPanel() { return mActivePanel; }
- LLInventoryPanel* getActivePanel() { return mActivePanel; }
-
- static BOOL filtersVisible(void* user_data);
- void onClearSearch();
- static void onFoldersByName(void *user_data);
- static BOOL checkFoldersByName(void *user_data);
- void onFilterEdit(const std::string& search_string );
- static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
- void onFilterSelected();
-
- const std::string getFilterSubString() { return mActivePanel->getFilterSubString(); }
- void setFilterSubString(const std::string& string) { mActivePanel->setFilterSubString(string); }
-
- // menu callbacks
- void doToSelected(const LLSD& userdata);
- void closeAllFolders();
- void doCreate(const LLSD& userdata);
- void resetFilters();
- void setSortBy(const LLSD& userdata);
-
- // HACK: Until we can route this info through the instant message hierarchy
- static BOOL sWearNewClothing;
- static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction
-
- void toggleFindOptions();
-
- LLFloaterInventoryFinder* getFinder() { return (LLFloaterInventoryFinder*)mFinderHandle.get(); }
+ // Inherited functionality
+ /*virtual*/ void changed(U32 mask);
+ /*virtual*/ void draw();
+ /*virtual*/ void onOpen(const LLSD& key);
+ LLInventoryPanel* getPanel();
protected:
- LLFilterEditor* mFilterEditor;
- LLTabContainer* mFilterTabs;
- LLHandle<LLFloater> mFinderHandle;
- LLInventoryPanel* mActivePanel;
- LLSaveFolderState* mSavedFolderState;
-
- std::string mFilterText;
-
-private:
void updateTitle();
+private:
+ LLPanelMainInventory* mPanelMainInventory;
};
-class LLSelectFirstFilteredItem : public LLFolderViewFunctor
-{
-public:
- LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
- virtual ~LLSelectFirstFilteredItem() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
- BOOL wasItemSelected() { return mItemSelected; }
-protected:
- BOOL mItemSelected;
-};
-
-class LLOpenFilteredFolders : public LLFolderViewFunctor
-{
-public:
- LLOpenFilteredFolders() {}
- virtual ~LLOpenFilteredFolders() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
-};
-
-class LLSaveFolderState : public LLFolderViewFunctor
-{
-public:
- LLSaveFolderState() : mApply(FALSE) {}
- virtual ~LLSaveFolderState() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item) {}
- void setApply(BOOL apply);
- void clearOpenFolders() { mOpenFolders.clear(); }
-protected:
- std::set<LLUUID> mOpenFolders;
- BOOL mApply;
-};
-
-class LLOpenFoldersWithSelection : public LLFolderViewFunctor
-{
-public:
- LLOpenFoldersWithSelection() {}
- virtual ~LLOpenFoldersWithSelection() {}
- virtual void doFolder(LLFolderViewFolder* folder);
- virtual void doItem(LLFolderViewItem* item);
-};
-
-///----------------------------------------------------------------------------
-/// Function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-// useful functions with the inventory view
-
-class LLInventoryCategory;
-class LLInventoryItem;
-
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
-
-#endif // LL_LLINVENTORYVIEW_H
+#endif // LL_LLFLOATERINVENTORY_H
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index 06fe2a84c8..78bc63ac8c 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -52,6 +52,7 @@ LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)
{
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_joystick.xml");
+ initFromSettings();
}
void LLFloaterJoystick::draw()
@@ -123,10 +124,8 @@ void LLFloaterJoystick::apply()
{
}
-void LLFloaterJoystick::refresh()
+void LLFloaterJoystick::initFromSettings()
{
- LLFloater::refresh();
-
mJoystickEnabled = gSavedSettings.getBOOL("JoystickEnabled");
mJoystickAxis[0] = gSavedSettings.getS32("JoystickAxis0");
@@ -194,6 +193,12 @@ void LLFloaterJoystick::refresh()
mFlycamFeathering = gSavedSettings.getF32("FlycamFeathering");
}
+void LLFloaterJoystick::refresh()
+{
+ LLFloater::refresh();
+ initFromSettings();
+}
+
void LLFloaterJoystick::cancel()
{
gSavedSettings.setBOOL("JoystickEnabled", mJoystickEnabled);
diff --git a/indra/newview/llfloaterjoystick.h b/indra/newview/llfloaterjoystick.h
index f3559c28e9..7a2f497c69 100644
--- a/indra/newview/llfloaterjoystick.h
+++ b/indra/newview/llfloaterjoystick.h
@@ -55,6 +55,8 @@ private:
LLFloaterJoystick(const LLSD& data);
virtual ~LLFloaterJoystick();
+
+ void initFromSettings();
static void onCommitJoystickEnabled(LLUICtrl*, void*);
static void onClickRestoreSNDefaults(void*);
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp
index 3753dcaaa8..85186cee6b 100644
--- a/indra/newview/llfloaterlagmeter.cpp
+++ b/indra/newview/llfloaterlagmeter.cpp
@@ -64,7 +64,7 @@ BOOL LLFloaterLagMeter::postBuild()
setIsChrome(TRUE);
// were we shrunk last time?
- if (gSavedSettings.getBOOL("LagMeterShrunk"))
+ if (isShrunk())
{
onClickShrink();
}
@@ -122,6 +122,7 @@ BOOL LLFloaterLagMeter::postBuild()
mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps");
// childSetAction("minimize", onClickShrink, this);
+ updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079)
return TRUE;
}
@@ -130,7 +131,7 @@ LLFloaterLagMeter::~LLFloaterLagMeter()
// save shrunk status for next time
// gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);
// expand so we save the large window rectangle
- if (gSavedSettings.getBOOL("LagMeterShrunk"))
+ if (isShrunk())
{
onClickShrink();
}
@@ -312,17 +313,15 @@ void LLFloaterLagMeter::determineServer()
}
}
-
-void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
+void LLFloaterLagMeter::updateControls(bool shrink)
{
// LLFloaterLagMeter * self = (LLFloaterLagMeter*)data;
LLButton * button = getChild<LLButton>("minimize");
S32 delta_width = mMaxWidth -mMinWidth;
LLRect r = getRect();
- bool shrunk = gSavedSettings.getBOOL("LagMeterShrunk");
- if(shrunk)
+ if(!shrink)
{
setTitle(getString("max_title_msg", mStringArgs) );
// make left edge appear to expand
@@ -368,5 +367,16 @@ void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
// self->childSetVisible("server_help", self->mShrunk);
// self->mShrunk = !self->mShrunk;
- gSavedSettings.setBOOL("LagMeterShrunk", !gSavedSettings.getBOOL("LagMeterShrunk"));
+}
+
+BOOL LLFloaterLagMeter::isShrunk()
+{
+ return gSavedSettings.getBOOL("LagMeterShrunk");
+}
+
+void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
+{
+ bool shrunk = isShrunk();
+ updateControls(!shrunk);
+ gSavedSettings.setBOOL("LagMeterShrunk", !shrunk);
}
diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h
index 592630636a..5416bca790 100644
--- a/indra/newview/llfloaterlagmeter.h
+++ b/indra/newview/llfloaterlagmeter.h
@@ -51,6 +51,8 @@ private:
void determineClient();
void determineNetwork();
void determineServer();
+ void updateControls(bool shrink);
+ BOOL isShrunk();
void onClickShrink();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index bdf9842b01..26c6db9652 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -39,6 +39,7 @@
#include "llcachename.h"
#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "message.h"
#include "lluserauth.h"
@@ -51,10 +52,10 @@
#include "llfloateravatarpicker.h"
#include "llfloaterauction.h"
#include "llfloatergroups.h"
+#include "llfloaterscriptlimits.h"
#include "llavataractions.h"
#include "lllineeditor.h"
#include "llnamelistctrl.h"
-#include "llnotify.h"
#include "llpanellandaudio.h"
#include "llpanellandmedia.h"
#include "llradiogroup.h"
@@ -148,6 +149,10 @@ void send_parcel_select_objects(S32 parcel_local_id, U32 return_type,
msg->sendReliable(region->getHost());
}
+LLParcel* LLFloaterLand::getCurrentSelectedParcel()
+{
+ return mParcel->getParcel();
+};
//static
LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
@@ -239,7 +244,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed)
BOOL LLFloaterLand::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
LLTabContainer* tab = getChild<LLTabContainer>("landtab");
@@ -271,6 +276,7 @@ void LLFloaterLand::refresh()
mPanelAudio->refresh();
mPanelMedia->refresh();
mPanelAccess->refresh();
+ mPanelCovenant->refresh();
}
@@ -347,13 +353,14 @@ BOOL LLPanelLandGeneral::postBuild()
{
mEditName = getChild<LLLineEditor>("Name");
mEditName->setCommitCallback(onCommitAny, this);
- childSetPrevalidate("Name", LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe);
mEditDesc = getChild<LLTextEditor>("Description");
mEditDesc->setCommitOnFocusLost(TRUE);
mEditDesc->setCommitCallback(onCommitAny, this);
- childSetPrevalidate("Description", LLLineEditor::prevalidatePrintableNotPipe);
-
+ // No prevalidate function - historically the prevalidate function was broken,
+ // allowing residents to put in characters like U+2661 WHITE HEART SUIT, so
+ // preserve that ability.
mTextSalePending = getChild<LLTextBox>("SalePending");
mTextOwnerLabel = getChild<LLTextBox>("Owner:");
@@ -420,6 +427,27 @@ BOOL LLPanelLandGeneral::postBuild()
mBtnBuyLand = getChild<LLButton>("Buy Land...");
mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
+ // note: on region change this will not be re checked, should not matter on Agni as
+ // 99% of the time all regions will return the same caps. In case of an erroneous setting
+ // to enabled the floater will just throw an error when trying to get it's cap
+ std::string url = gAgent.getRegion()->getCapability("LandResources");
+ if (!url.empty())
+ {
+ mBtnScriptLimits = getChild<LLButton>("Scripts...");
+ if(mBtnScriptLimits)
+ {
+ mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this);
+ }
+ }
+ else
+ {
+ mBtnScriptLimits = getChild<LLButton>("Scripts...");
+ if(mBtnScriptLimits)
+ {
+ mBtnScriptLimits->setVisible(false);
+ }
+ }
+
mBtnBuyGroupLand = getChild<LLButton>("Buy For Group...");
mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND);
@@ -507,6 +535,7 @@ void LLPanelLandGeneral::refresh()
mTextDwell->setText(LLStringUtil::null);
mBtnBuyLand->setEnabled(FALSE);
+ mBtnScriptLimits->setEnabled(FALSE);
mBtnBuyGroupLand->setEnabled(FALSE);
mBtnReleaseLand->setEnabled(FALSE);
mBtnReclaimLand->setEnabled(FALSE);
@@ -714,6 +743,8 @@ void LLPanelLandGeneral::refresh()
mBtnBuyLand->setEnabled(
LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false));
+ mBtnScriptLimits->setEnabled(true);
+// LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false));
mBtnBuyGroupLand->setEnabled(
LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, true));
@@ -853,6 +884,17 @@ void LLPanelLandGeneral::onClickBuyLand(void* data)
LLViewerParcelMgr::getInstance()->startBuyLand(*for_group);
}
+// static
+void LLPanelLandGeneral::onClickScriptLimits(void* data)
+{
+ LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
+ LLParcel* parcel = panelp->mParcel->getParcel();
+ if(parcel != NULL)
+ {
+ LLFloaterReg::showInstance("script_limits");
+ }
+}
+
BOOL LLPanelLandGeneral::enableDeedToGroup(void* data)
{
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
@@ -913,7 +955,7 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
args["PARCEL_NAME"] = parcel_name;
args["TIME"] = time;
- LLNotifications::instance().add("LandBuyPass", args, LLSD(), cbBuyPass);
+ LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);
}
// static
@@ -925,7 +967,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)
{
if(parcelp->getForSale())
{
- LLNotifications::instance().add("CannotStartAuctionAlreadyForSale");
+ LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
}
else
{
@@ -938,7 +980,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)
// static
bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// User clicked OK
@@ -1005,7 +1047,30 @@ void LLPanelLandGeneral::onClickStopSellLand(void* data)
//---------------------------------------------------------------------------
LLPanelLandObjects::LLPanelLandObjects(LLParcelSelectionHandle& parcel)
: LLPanel(),
- mParcel(parcel)
+
+ mParcel(parcel),
+ mParcelObjectBonus(NULL),
+ mSWTotalObjects(NULL),
+ mObjectContribution(NULL),
+ mTotalObjects(NULL),
+ mOwnerObjects(NULL),
+ mBtnShowOwnerObjects(NULL),
+ mBtnReturnOwnerObjects(NULL),
+ mGroupObjects(NULL),
+ mBtnShowGroupObjects(NULL),
+ mBtnReturnGroupObjects(NULL),
+ mOtherObjects(NULL),
+ mBtnShowOtherObjects(NULL),
+ mBtnReturnOtherObjects(NULL),
+ mSelectedObjects(NULL),
+ mCleanOtherObjectsTime(NULL),
+ mOtherTime(0),
+ mBtnRefresh(NULL),
+ mBtnReturnOwnerList(NULL),
+ mOwnerList(NULL),
+ mFirstReply(TRUE),
+ mSelectedCount(0),
+ mSelectedIsGroup(FALSE)
{
}
@@ -1046,7 +1111,7 @@ BOOL LLPanelLandObjects::postBuild()
mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));
mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this);
- childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32);
mBtnRefresh = getChild<LLButton>("Refresh List");
mBtnRefresh->setClickedCallback(onClickRefresh, this);
@@ -1284,7 +1349,7 @@ void send_return_objects_message(S32 parcel_local_id, S32 return_type,
bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLParcel *parcel = mParcel->getParcel();
if (0 == option)
{
@@ -1294,7 +1359,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
LLSD args;
if (owner_id == gAgentID)
{
- LLNotifications::instance().add("OwnedObjectsReturned");
+ LLNotificationsUtil::add("OwnedObjectsReturned");
}
else
{
@@ -1302,7 +1367,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
gCacheName->getName(owner_id, first, last);
args["FIRST"] = first;
args["LAST"] = last;
- LLNotifications::instance().add("OtherObjectsReturned", args);
+ LLNotificationsUtil::add("OtherObjectsReturned", args);
}
send_return_objects_message(parcel->getLocalID(), RT_OWNER);
}
@@ -1316,7 +1381,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLParcel *parcel = mParcel->getParcel();
if (0 == option)
{
@@ -1326,7 +1391,7 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co
gCacheName->getGroupName(parcel->getGroupID(), group_name);
LLSD args;
args["GROUPNAME"] = group_name;
- LLNotifications::instance().add("GroupObjectsReturned", args);
+ LLNotificationsUtil::add("GroupObjectsReturned", args);
send_return_objects_message(parcel->getLocalID(), RT_GROUP);
}
}
@@ -1338,13 +1403,13 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co
bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLParcel *parcel = mParcel->getParcel();
if (0 == option)
{
if (parcel)
{
- LLNotifications::instance().add("UnOwnedObjectsReturned");
+ LLNotificationsUtil::add("UnOwnedObjectsReturned");
send_return_objects_message(parcel->getLocalID(), RT_OTHER);
}
}
@@ -1356,7 +1421,7 @@ bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, co
bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLParcel *parcel = mParcel->getParcel();
if (0 == option)
{
@@ -1370,12 +1435,12 @@ bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const
if (mSelectedIsGroup)
{
args["GROUPNAME"] = mSelectedName;
- LLNotifications::instance().add("GroupObjectsReturned", args);
+ LLNotificationsUtil::add("GroupObjectsReturned", args);
}
else
{
args["NAME"] = mSelectedName;
- LLNotifications::instance().add("OtherObjectsReturned2", args);
+ LLNotificationsUtil::add("OtherObjectsReturned2", args);
}
send_return_objects_message(parcel->getLocalID(), RT_LIST, &(mSelectedOwners));
@@ -1412,11 +1477,11 @@ void LLPanelLandObjects::onClickReturnOwnerList(void* userdata)
args["N"] = llformat("%d",self->mSelectedCount);
if (self->mSelectedIsGroup)
{
- LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
}
else
{
- LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));
}
}
@@ -1519,11 +1584,13 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
}
// Placeholder for name.
- item_params.columns.add().font(FONT).column("name");
+ std::string name;
+ gCacheName->getFullName(owner_id, name);
+ item_params.columns.add().value(name).font(FONT).column("name");
object_count_str = llformat("%d", object_count);
item_params.columns.add().value(object_count_str).font(FONT).column("count");
- item_params.columns.add().value(formatted_time((time_t)most_recent_time)).font(FONT).column("mostrecent");
+ item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
self->mOwnerList->addRow(item_params);
@@ -1624,14 +1691,14 @@ void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata)
if (owner_id == gAgent.getID())
{
- LLNotifications::instance().add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
}
else
{
std::string name;
gCacheName->getFullName(owner_id, name);
args["NAME"] = name;
- LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
}
}
@@ -1652,7 +1719,7 @@ void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata)
args["N"] = llformat("%d", parcel->getGroupPrimCount());
// create and show confirmation textbox
- LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));
}
// static
@@ -1677,7 +1744,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
gCacheName->getGroupName(parcel->getGroupID(), group_name);
args["NAME"] = group_name;
- LLNotifications::instance().add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
}
else
{
@@ -1685,7 +1752,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
if (owner_id == gAgent.getID())
{
- LLNotifications::instance().add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
}
else
{
@@ -1693,7 +1760,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
gCacheName->getFullName(owner_id, name);
args["NAME"] = name;
- LLNotifications::instance().add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+ LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
}
}
}
@@ -1743,7 +1810,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mClearBtn(NULL),
mMatureCtrl(NULL),
mPushRestrictionCtrl(NULL),
- mPublishHelpButton(NULL),
mParcel(parcel)
{
}
@@ -1812,14 +1878,9 @@ BOOL LLPanelLandOptions::postBuild()
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
childSetCommitCallback("MatureCheck", onCommitAny, this);
- mPublishHelpButton = getChild<LLButton>("?");
- mPublishHelpButton->setClickedCallback(onClickPublishHelp, this);
-
if (gAgent.wantsPGOnly())
{
// Disable these buttons if they are PG (Teen) users
- mPublishHelpButton->setVisible(FALSE);
- mPublishHelpButton->setEnabled(FALSE);
mMatureCtrl->setVisible(FALSE);
mMatureCtrl->setEnabled(FALSE);
}
@@ -1912,7 +1973,6 @@ void LLPanelLandOptions::refresh()
mClearBtn->setEnabled(FALSE);
mMatureCtrl->setEnabled(FALSE);
- mPublishHelpButton->setEnabled(FALSE);
}
else
{
@@ -1988,13 +2048,9 @@ void LLPanelLandOptions::refresh()
mSetBtn->setEnabled( can_change_landing_point );
mClearBtn->setEnabled( can_change_landing_point );
- mPublishHelpButton->setEnabled( can_change_identity );
-
if (gAgent.wantsPGOnly())
{
// Disable these buttons if they are PG (Teen) users
- mPublishHelpButton->setVisible(FALSE);
- mPublishHelpButton->setEnabled(FALSE);
mMatureCtrl->setVisible(FALSE);
mMatureCtrl->setEnabled(FALSE);
}
@@ -2173,7 +2229,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
if (!allow_other_scripts && region && region->getAllowDamage())
{
- LLNotifications::instance().add("UnableToDisableOutsideScripts");
+ LLNotificationsUtil::add("UnableToDisableOutsideScripts");
return;
}
@@ -2217,7 +2273,7 @@ void LLPanelLandOptions::onClickSet(void* userdata)
if (agent_parcel->getLocalID() != selected_parcel->getLocalID())
{
- LLNotifications::instance().add("MustBeInParcel");
+ LLNotificationsUtil::add("MustBeInParcel");
return;
}
@@ -2247,28 +2303,6 @@ void LLPanelLandOptions::onClickClear(void* userdata)
self->refresh();
}
-// static
-void LLPanelLandOptions::onClickPublishHelp(void*)
-{
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel();
- llassert(region); // Region should never be null.
-
- bool can_change_identity = region && parcel ?
- LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY) &&
- ! (region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH) : false;
-
- if(! can_change_identity)
- {
- LLNotifications::instance().add("ClickPublishHelpLandDisabled");
- }
- else
- {
- LLNotifications::instance().add("ClickPublishHelpLand");
- }
-}
-
-
//---------------------------------------------------------------------------
// LLPanelLandAccess
@@ -2292,9 +2326,9 @@ BOOL LLPanelLandAccess::postBuild()
childSetCommitCallback("PriceSpin", onCommitAny, this);
childSetCommitCallback("HoursSpin", onCommitAny, this);
- childSetAction("add_allowed", onClickAddAccess, this);
+ childSetAction("add_allowed", boost::bind(&LLPanelLandAccess::onClickAddAccess, this));
childSetAction("remove_allowed", onClickRemoveAccess, this);
- childSetAction("add_banned", onClickAddBanned, this);
+ childSetAction("add_banned", boost::bind(&LLPanelLandAccess::onClickAddBanned, this));
childSetAction("remove_banned", onClickRemoveBanned, this);
mListAccess = getChild<LLNameListCtrl>("AccessList");
@@ -2329,7 +2363,7 @@ void LLPanelLandAccess::refresh()
mListBanned->deleteAllItems();
LLParcel *parcel = mParcel->getParcel();
-
+
// Display options
if (parcel)
{
@@ -2425,22 +2459,40 @@ void LLPanelLandAccess::refresh()
mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
}
}
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if(region)
+ {
+ std::string region_access = "(";
+ region_access += region->getSimAccessString();
+ region_access += ")";
+ childSetLabelArg( "public_access", "[MATURITY]", region_access );
+ }
+ else
+ {
+ childSetLabelArg( "public_access", "[MATURITY]", std::string() );
+ }
+
if(parcel->getRegionDenyAnonymousOverride())
{
childSetValue("limit_payment", TRUE);
+ childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
}
else
{
childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
+ childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", std::string() );
}
if(parcel->getRegionDenyAgeUnverifiedOverride())
{
childSetValue("limit_age_verified", TRUE);
+ childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
}
else
{
childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
+ childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", std::string() );
}
BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
@@ -2684,29 +2736,22 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
self->refresh();
}
-// static
-void LLPanelLandAccess::onClickAddAccess(void* data)
+void LLPanelLandAccess::onClickAddAccess()
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
- if (panelp)
- {
- gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBAccess, data) );
- }
+ gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1,_2)) );
}
-// static
-void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
+void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata;
if (!names.empty() && !ids.empty())
{
LLUUID id = ids[0];
- LLParcel* parcel = panelp->mParcel->getParcel();
+ LLParcel* parcel = mParcel->getParcel();
if (parcel)
{
parcel->addToAccessList(id, 0);
LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS);
- panelp->refresh();
+ refresh();
}
}
}
@@ -2735,25 +2780,23 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)
}
// static
-void LLPanelLandAccess::onClickAddBanned(void* data)
+void LLPanelLandAccess::onClickAddBanned()
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
- gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBBanned, data) );
+ gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1,_2)));
}
// static
-void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
+void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata;
if (!names.empty() && !ids.empty())
{
LLUUID id = ids[0];
- LLParcel* parcel = panelp->mParcel->getParcel();
+ LLParcel* parcel = mParcel->getParcel();
if (parcel)
{
parcel->addToBanList(id, 0);
LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN);
- panelp->refresh();
+ refresh();
}
}
}
@@ -2794,12 +2837,6 @@ LLPanelLandCovenant::~LLPanelLandCovenant()
{
}
-BOOL LLPanelLandCovenant::postBuild()
-{
- refresh();
- return TRUE;
-}
-
// virtual
void LLPanelLandCovenant::refresh()
{
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 749c395147..a4785e8f5b 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -70,6 +70,7 @@ class LLPanelLandAccess;
class LLPanelLandBan;
class LLPanelLandRenters;
class LLPanelLandCovenant;
+class LLParcel;
class LLFloaterLand
: public LLFloater
@@ -80,7 +81,9 @@ public:
static LLPanelLandObjects* getCurrentPanelLandObjects();
static LLPanelLandCovenant* getCurrentPanelLandCovenant();
-
+
+ LLParcel* getCurrentSelectedParcel();
+
virtual void onOpen(const LLSD& key);
virtual BOOL postBuild();
@@ -146,6 +149,7 @@ public:
static BOOL enableDeedToGroup(void*);
static void onClickDeed(void*);
static void onClickBuyLand(void* data);
+ static void onClickScriptLimits(void* data);
static void onClickRelease(void*);
static void onClickReclaim(void*);
static void onClickBuyPass(void* deselect_when_done);
@@ -215,6 +219,7 @@ protected:
LLTextBox* mTextDwell;
LLButton* mBtnBuyLand;
+ LLButton* mBtnScriptLimits;
LLButton* mBtnBuyGroupLand;
// these buttons share the same location, but
@@ -320,7 +325,6 @@ private:
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
static void onClickSet(void* userdata);
static void onClickClear(void* userdata);
- static void onClickPublishHelp(void*);
private:
LLCheckBoxCtrl* mCheckEditObjects;
@@ -345,7 +349,6 @@ private:
LLCheckBoxCtrl *mMatureCtrl;
LLCheckBoxCtrl *mPushRestrictionCtrl;
- LLButton *mPublishHelpButton;
LLSafeHandle<LLParcelSelection>& mParcel;
};
@@ -364,14 +367,15 @@ public:
static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
- static void onClickAddAccess(void*);
- static void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
static void onClickRemoveAccess(void*);
- static void onClickAddBanned(void*);
- static void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
static void onClickRemoveBanned(void*);
virtual BOOL postBuild();
+
+ void onClickAddAccess();
+ void onClickAddBanned();
+ void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
protected:
LLNameListCtrl* mListAccess;
@@ -387,7 +391,6 @@ class LLPanelLandCovenant
public:
LLPanelLandCovenant(LLSafeHandle<LLParcelSelection>& parcelp);
virtual ~LLPanelLandCovenant();
- virtual BOOL postBuild();
void refresh();
static void updateCovenantText(const std::string& string);
static void updateEstateName(const std::string& name);
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 0c9a759f32..051ab585e2 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -51,11 +51,26 @@
#include "llviewermenu.h"
//
+// Constants
+//
+const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
+
+//
// Member functions
//
LLFloaterMap::LLFloaterMap(const LLSD& key)
- : LLFloater(key)
+ : LLFloater(key),
+ mPopupMenu(NULL),
+ mTextBoxEast(NULL),
+ mTextBoxNorth(NULL),
+ mTextBoxWest(NULL),
+ mTextBoxSouth(NULL),
+ mTextBoxSouthEast(NULL),
+ mTextBoxNorthEast(NULL),
+ mTextBoxNorthWest(NULL),
+ mTextBoxSouthWest(NULL),
+ mMap(NULL)
{
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_map.xml", FALSE);
}
@@ -68,7 +83,6 @@ BOOL LLFloaterMap::postBuild()
{
mMap = getChild<LLNetMap>("Net Map");
mMap->setScale(gSavedSettings.getF32("MiniMapScale"));
- mMap->setRotateMap(gSavedSettings.getBOOL( "MiniMapRotate" ));
mMap->setToolTipMsg(getString("ToolTipMsg"));
sendChildToBack(mMap);
@@ -92,10 +106,13 @@ BOOL LLFloaterMap::postBuild()
mPopupMenu->setItemEnabled ("Stop Tracking", false);
}
+ updateMinorDirections();
+
// Get the drag handle all the way in back
sendChildToBack(getDragHandle());
setIsChrome(TRUE);
+ getDragHandle()->setTitleVisible(TRUE);
// keep onscreen
gFloaterView->adjustToFitScreen(this, FALSE);
@@ -125,8 +142,8 @@ void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
// Rotation is in radians.
// Rotation of 0 means x = 1, y = 0 on the unit circle.
- F32 map_half_height = (F32)(getRect().getHeight() / 2);
- F32 map_half_width = (F32)(getRect().getWidth() / 2);
+ F32 map_half_height = (F32)(getRect().getHeight() / 2) - getHeaderHeight()/2;
+ F32 map_half_width = (F32)(getRect().getWidth() / 2) ;
F32 text_half_height = (F32)(text_box->getRect().getHeight() / 2);
F32 text_half_width = (F32)(text_box->getRect().getWidth() / 2);
F32 radius = llmin( map_half_height - text_half_height, map_half_width - text_half_width );
@@ -139,12 +156,30 @@ void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
llround(map_half_height - text_half_height + radius * sin( rotation )) );
}
+void LLFloaterMap::updateMinorDirections()
+{
+ if (mTextBoxNorthEast == NULL)
+ {
+ return;
+ }
+
+ // Hide minor directions if they cover too much of the map
+ bool show_minors = mTextBoxNorthEast->getRect().getHeight() < MAP_MINOR_DIR_THRESHOLD *
+ llmin(getRect().getWidth(), getRect().getHeight());
+
+ mTextBoxNorthEast->setVisible(show_minors);
+ mTextBoxNorthWest->setVisible(show_minors);
+ mTextBoxSouthWest->setVisible(show_minors);
+ mTextBoxSouthEast->setVisible(show_minors);
+}
+
// virtual
void LLFloaterMap::draw()
{
F32 rotation = 0;
- if( mMap->getRotateMap() )
+ static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+ if( rotate_map )
{
// rotate subsequent draws to agent rotation
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
@@ -180,17 +215,23 @@ void LLFloaterMap::draw()
LLFloater::draw();
}
+void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLFloater::reshape(width, height, called_from_parent);
+ updateMinorDirections();
+}
+
void LLFloaterMap::handleZoom(const LLSD& userdata)
{
std::string level = userdata.asString();
F32 scale = 0.0f;
if (level == std::string("close"))
- scale = MAP_SCALE_MAX;
+ scale = LLNetMap::MAP_SCALE_MAX;
else if (level == std::string("medium"))
- scale = MAP_SCALE_MID;
+ scale = LLNetMap::MAP_SCALE_MID;
else if (level == std::string("far"))
- scale = MAP_SCALE_MIN;
+ scale = LLNetMap::MAP_SCALE_MIN;
if (scale != 0.0f)
{
gSavedSettings.setF32("MiniMapScale", scale );
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 501777ed07..6c9138c6a7 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -51,12 +51,14 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
private:
void handleZoom(const LLSD& userdata);
void handleStopTracking (const LLSD& userdata);
void setDirectionPos( LLTextBox* text_box, F32 rotation );
+ void updateMinorDirections();
LLMenuGL* mPopupMenu;
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index d941f24f49..62ec17f89a 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -41,6 +41,7 @@
#include "lluictrlfactory.h"
#include "llbutton.h"
#include "llselectmgr.h"
+#include "llsdutil.h"
LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
@@ -57,7 +58,6 @@ LLFloaterMediaSettings::LLFloaterMediaSettings(const LLSD& key)
mMultipleMedia(false),
mMultipleValidMedia(false)
{
-// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_settings.xml");
}
////////////////////////////////////////////////////////////////////////////////
@@ -145,13 +145,22 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
//static
void LLFloaterMediaSettings::apply()
{
-
- LLSD settings;
- sInstance->mPanelMediaSettingsGeneral->getValues( settings );
- sInstance->mPanelMediaSettingsSecurity->getValues( settings );
- sInstance->mPanelMediaSettingsPermissions->getValues( settings );
- LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
- LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+ if (sInstance->haveValuesChanged())
+ {
+ LLSD settings;
+ sInstance->mPanelMediaSettingsGeneral->preApply();
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings, false );
+ sInstance->mPanelMediaSettingsSecurity->preApply();
+ sInstance->mPanelMediaSettingsSecurity->getValues( settings, false );
+ sInstance->mPanelMediaSettingsPermissions->preApply();
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings, false );
+
+ LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA, settings );
+
+ sInstance->mPanelMediaSettingsGeneral->postApply();
+ sInstance->mPanelMediaSettingsSecurity->postApply();
+ sInstance->mPanelMediaSettingsPermissions->postApply();
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -168,6 +177,8 @@ void LLFloaterMediaSettings::onClose(bool app_quitting)
//static
void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable )
{
+ if (sInstance->hasFocus()) return;
+
sInstance->clearValues(editable);
// update all panels with values from simulator
sInstance->mPanelMediaSettingsGeneral->
@@ -178,7 +189,15 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab
sInstance->mPanelMediaSettingsPermissions->
initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
-
+
+ // Squirrel away initial values
+ sInstance->mInitialValues.clear();
+ sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
+
+ sInstance->mApplyBtn->setEnabled(editable);
+ sInstance->mOKBtn->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
@@ -188,7 +207,7 @@ void LLFloaterMediaSettings::commitFields()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
};
@@ -201,11 +220,10 @@ void LLFloaterMediaSettings::clearValues( bool editable)
{
// clean up all panels before updating
sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
- sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
}
-
////////////////////////////////////////////////////////////////////////////////
// static
void LLFloaterMediaSettings::onBtnOK( void* userdata )
@@ -230,7 +248,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
// static
void LLFloaterMediaSettings::onBtnCancel( void* userdata )
{
- sInstance->closeFloater();
+ sInstance->closeFloater();
}
////////////////////////////////////////////////////////////////////////////////
@@ -240,16 +258,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
LLTabContainer* self = (LLTabContainer*)user_data;
gSavedSettings.setS32("LastMediaSettingsTab", self->getCurrentPanelIndex());
}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
-{
- setCtrlsEnabled( enable );
- childSetEnabled( "OK", enable );
- childSetEnabled( "Apply", enable );
-}
-
////////////////////////////////////////////////////////////////////////////////
//
const std::string LLFloaterMediaSettings::getHomeUrl()
@@ -260,17 +268,44 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
return std::string( "" );
}
-
////////////////////////////////////////////////////////////////////////////////
-//
-bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
+// virtual
+void LLFloaterMediaSettings::draw()
{
- // sanity check - don't think this can happen
- if ( mPanelMediaSettingsSecurity )
- // version in security dialog code is specialized so we pass in
- // empty string for first parameter since it's not used
- return mPanelMediaSettingsSecurity->passesWhiteList( "", test_url );
- else
- // this is all we can do
- return false;
+ if (NULL != mApplyBtn)
+ {
+ // Set the enabled state of the "Apply" button if values changed
+ mApplyBtn->setEnabled( haveValuesChanged() );
+ }
+
+ LLFloater::draw();
}
+
+
+//private
+bool LLFloaterMediaSettings::haveValuesChanged() const
+{
+ bool values_changed = false;
+ // *NOTE: The code below is very inefficient. Better to do this
+ // only when data change.
+ // Every frame, check to see what the values are. If they are not
+ // the same as the initial media data, enable the OK/Apply buttons
+ LLSD settings;
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+ LLSD::map_const_iterator iter = settings.beginMap();
+ LLSD::map_const_iterator end = settings.endMap();
+ for ( ; iter != end; ++iter )
+ {
+ const std::string &current_key = iter->first;
+ const LLSD &current_value = iter->second;
+ if ( ! llsd_equals(current_value, mInitialValues[current_key]))
+ {
+ values_changed = true;
+ break;
+ }
+ }
+ return values_changed;
+}
+
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 17a47cb0f5..cdfd5aa8ae 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -54,10 +54,12 @@ public:
static void apply();
static void initValues( const LLSD& media_settings , bool editable);
static void clearValues( bool editable);
- void enableOkApplyBtns( bool enable );
- LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
- const std::string getHomeUrl();
- bool passesWhiteList( const std::string& test_url );
+
+ LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
+ const std::string getHomeUrl();
+ //bool passesWhiteList( const std::string& test_url );
+
+ virtual void draw();
bool mIdenticalHasMediaInfo;
bool mMultipleMedia;
@@ -73,7 +75,6 @@ protected:
LLPanelMediaSettingsSecurity* mPanelMediaSettingsSecurity;
LLPanelMediaSettingsPermissions* mPanelMediaSettingsPermissions;
-
static void onBtnOK(void*);
static void onBtnCancel(void*);
static void onBtnApply(void*);
@@ -83,6 +84,10 @@ protected:
static LLFloaterMediaSettings* sInstance;
private:
+
+ bool haveValuesChanged() const;
+
+ LLSD mInitialValues;
bool mWaitingToClose;
};
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index ed7d2c71ea..159ce41b79 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (NameEditor)
{
NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN);
- NameEditor->setPrevalidate(&LLLineEditor::prevalidatePrintableNotPipe);
+ NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (DescEditor)
{
DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN);
- DescEditor->setPrevalidate(&LLLineEditor::prevalidatePrintableNotPipe);
+ DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -176,7 +176,7 @@ void LLFloaterNameDesc::onBtnOK( )
upload_new_resource(mFilenameAndPath, // file
childGetValue("name_form").asString(),
childGetValue("description_form").asString(),
- 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+ 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
display_name, callback, expected_upload_cost, nruserdata);
closeFloater(false);
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index f20fca1258..94b5ebba00 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -233,7 +243,7 @@ void LLFloaterNotificationConsole::onClickAdd()
std::string message_name = getChild<LLComboBox>("notification_types")->getValue().asString();
if (!message_name.empty())
{
- LLNotifications::instance().add(message_name, LLSD());
+ LLNotifications::instance().add(message_name, LLSD(), LLSD());
}
}
diff --git a/indra/newview/llfloaternotificationsconsole.h b/indra/newview/llfloaternotificationsconsole.h
index 7349ff1d8f..a05d559eb4 100644
--- a/indra/newview/llfloaternotificationsconsole.h
+++ b/indra/newview/llfloaternotificationsconsole.h
@@ -35,7 +35,9 @@
#include "llfloater.h"
#include "lllayoutstack.h"
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
+
+class LLNotification;
class LLFloaterNotificationConsole :
public LLFloater
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index aa82dc34b7..ec50ed596c 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -32,7 +32,7 @@
/*
* Shows the contents of an object.
- * A floater wrapper for llpanelinventory
+ * A floater wrapper for LLPanelObjectInventory
*/
#include "llviewerprecompiledheaders.h"
@@ -41,13 +41,14 @@
#include "llcachename.h"
#include "llbutton.h"
+#include "llnotificationsutil.h"
#include "lltextbox.h"
-#include "llalertdialog.h"
#include "llinventorybridge.h"
#include "llfloaterinventory.h"
#include "llinventorymodel.h"
-#include "llpanelinventory.h"
+#include "llinventorypanel.h"
+#include "llpanelobjectinventory.h"
#include "llfloaterreg.h"
#include "llselectmgr.h"
#include "lluiconstants.h"
@@ -58,7 +59,7 @@
LLFloaterOpenObject::LLFloaterOpenObject(const LLSD& key)
: LLFloater(key),
- mPanelInventory(NULL),
+ mPanelInventoryObject(NULL),
mDirty(TRUE)
{
// LLUICtrlFactory::getInstance()->buildFloater(this,"floater_openobject.xml");
@@ -70,11 +71,14 @@ LLFloaterOpenObject::~LLFloaterOpenObject()
{
// sInstance = NULL;
}
+
// virtual
BOOL LLFloaterOpenObject::postBuild()
{
childSetTextArg("object_name", "[DESC]", std::string("Object") ); // *Note: probably do not want to translate this
- mPanelInventory = getChild<LLPanelInventory>("object_contents");
+ mPanelInventoryObject = getChild<LLPanelObjectInventory>("object_contents");
+
+ refresh();
return TRUE;
}
@@ -83,7 +87,7 @@ void LLFloaterOpenObject::onOpen(const LLSD& key)
LLObjectSelectionHandle object_selection = LLSelectMgr::getInstance()->getSelection();
if (object_selection->getRootObjectCount() != 1)
{
- LLNotifications::instance().add("UnableToViewContentsMoreThanOne");
+ LLNotificationsUtil::add("UnableToViewContentsMoreThanOne");
closeFloater();
return;
}
@@ -93,29 +97,57 @@ void LLFloaterOpenObject::onOpen(const LLSD& key)
return;
}
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+ refresh();
}
+
void LLFloaterOpenObject::refresh()
{
- mPanelInventory->refresh();
+ mPanelInventoryObject->refresh();
- std::string name;
- BOOL enabled;
+ std::string name = "";
+
+ // Enable the copy || copy & wear buttons only if we have something we can copy or copy & wear (respectively).
+ bool copy_enabled = false;
+ bool wear_enabled = false;
LLSelectNode* node = mObjectSelection->getFirstRootNode();
- if (node)
+ if (node)
{
name = node->mName;
- enabled = TRUE;
- }
- else
- {
- name = "";
- enabled = FALSE;
+ copy_enabled = true;
+
+ LLViewerObject* object = node->getObject();
+ if (object)
+ {
+ // this folder is coming from an object, as there is only one folder in an object, the root,
+ // we need to collect the entire contents and handle them as a group
+ InventoryObjectList inventory_objects;
+ object->getInventoryContents(inventory_objects);
+
+ if (!inventory_objects.empty())
+ {
+ for (InventoryObjectList::iterator it = inventory_objects.begin();
+ it != inventory_objects.end();
+ ++it)
+ {
+ LLInventoryItem* item = static_cast<LLInventoryItem*> ((LLInventoryObject*)(*it));
+ LLInventoryType::EType type = item->getInventoryType();
+ if (type == LLInventoryType::IT_OBJECT
+ || type == LLInventoryType::IT_ATTACHMENT
+ || type == LLInventoryType::IT_WEARABLE
+ || type == LLInventoryType::IT_GESTURE)
+ {
+ wear_enabled = true;
+ break;
+ }
+ }
+ }
+ }
}
childSetTextArg("object_name", "[DESC]", name);
- childSetEnabled("copy_to_inventory_button", enabled);
- childSetEnabled("copy_and_wear_button", enabled);
+ childSetEnabled("copy_to_inventory_button", copy_enabled);
+ childSetEnabled("copy_and_wear_button", wear_enabled);
}
@@ -140,7 +172,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
{
if (mObjectSelection->getRootObjectCount() != 1)
{
- LLNotifications::instance().add("OnlyCopyContentsOfSingleItem");
+ LLNotificationsUtil::add("OnlyCopyContentsOfSingleItem");
return;
}
@@ -157,14 +189,14 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
if (wear)
{
parent_category_id = gInventory.findCategoryUUIDForType(
- LLAssetType::AT_CLOTHING);
+ LLFolderType::FT_CLOTHING);
}
else
{
parent_category_id = gInventory.getRootFolderID();
}
LLUUID category_id = gInventory.createNewCategory(parent_category_id,
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
name);
LLCatAndWear* data = new LLCatAndWear;
@@ -181,7 +213,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
delete data;
data = NULL;
- LLNotifications::instance().add("OpenObjectCannotCopy");
+ LLNotificationsUtil::add("OpenObjectCannotCopy");
}
}
@@ -192,11 +224,10 @@ void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
if (result == 0)
{
- LLFloaterInventory::showAgentInventory();
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if (view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(cat->mCatID, TAKE_FOCUS_NO);
+ active_panel->setSelection(cat->mCatID, TAKE_FOCUS_NO);
}
}
diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h
index a61cc04941..10d96b7ea3 100644
--- a/indra/newview/llfloateropenobject.h
+++ b/indra/newview/llfloateropenobject.h
@@ -41,7 +41,7 @@
#include "llfloater.h"
class LLObjectSelection;
-class LLPanelInventory;
+class LLPanelObjectInventory;
class LLFloaterOpenObject
: public LLFloater
@@ -77,7 +77,7 @@ private:
protected:
- LLPanelInventory* mPanelInventory;
+ LLPanelObjectInventory* mPanelInventoryObject;
LLSafeHandle<LLObjectSelection> mObjectSelection;
BOOL mDirty;
};
diff --git a/indra/newview/llfloaterparcel.cpp b/indra/newview/llfloaterparcel.cpp
index 88a39a495f..e2be784116 100644
--- a/indra/newview/llfloaterparcel.cpp
+++ b/indra/newview/llfloaterparcel.cpp
@@ -40,6 +40,7 @@
// viewer project includes
#include "llcommandhandler.h"
#include "llpanelplace.h"
+#include "llsidetray.h"
// linden library includes
#include "lluuid.h"
@@ -70,7 +71,10 @@ public:
{
if (parcel_id.notNull())
{
- LLFloaterReg::showInstance("parcel_info", LLSD(parcel_id));
+ LLSD key;
+ key["type"] = "remote_place";
+ key["id"] = parcel_id;
+ LLSideTray::getInstance()->showPanel("panel_places", key);
return true;
}
}
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index 88811d06fe..51364594e4 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -135,7 +135,8 @@ LLFloaterPay::LLFloaterPay(const LLSD& key)
mCallback(NULL),
mObjectNameText(NULL),
mTargetUUID(key.asUUID()),
- mTargetIsGroup(FALSE)
+ mTargetIsGroup(FALSE),
+ mHaveName(FALSE)
{
}
@@ -203,7 +204,7 @@ BOOL LLFloaterPay::postBuild()
getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);
childSetText("amount", last_amount);
- childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32);
info = new LLGiveMoneyInfo(this, 0);
mCallbackData.push_back(info);
@@ -444,13 +445,11 @@ void LLFloaterPay::onCacheOwnerName(const LLUUID& owner_id,
{
if (is_group)
{
- childSetVisible("payee_group",true);
- childSetVisible("payee_resident",false);
+ setTitle(getString("payee_group"));
}
else
{
- childSetVisible("payee_group",false);
- childSetVisible("payee_resident",true);
+ setTitle(getString("payee_resident"));
}
childSetTextArg("payee_name", "[FIRST]", firstname);
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 17bb8221ad..7edc27d4c3 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -32,7 +32,6 @@
*/
#include "llviewerprecompiledheaders.h"
-#include "llalertdialog.h"
#include "llcheckboxctrl.h"
#include "llfloaterperms.h"
#include "llviewercontrol.h"
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index 938370b732..8da44e2035 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -46,6 +46,7 @@
#include "llbutton.h"
#include "lltexteditor.h"
#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "lluictrlfactory.h"
@@ -55,9 +56,8 @@
#include "llstatusbar.h"
#include "llviewerregion.h"
#include "lleconomy.h"
+#include "message.h"
-#include "llgl.h"
-#include "llglheaders.h"
#include "llimagejpeg.h"
#include "llimagej2c.h"
#include "llvfile.h"
@@ -222,20 +222,20 @@ void LLFloaterPostcard::onClickSend(void* data)
if (to.empty() || !boost::regex_match(to, emailFormat))
{
- LLNotifications::instance().add("PromptRecipientEmail");
+ LLNotificationsUtil::add("PromptRecipientEmail");
return;
}
if (from.empty() || !boost::regex_match(from, emailFormat))
{
- LLNotifications::instance().add("PromptSelfEmail");
+ LLNotificationsUtil::add("PromptSelfEmail");
return;
}
std::string subject(self->childGetValue("subject_form").asString());
if(subject.empty() || !self->mHasFirstMsgFocus)
{
- LLNotifications::instance().add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
+ LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
return;
}
@@ -245,7 +245,7 @@ void LLFloaterPostcard::onClickSend(void* data)
}
else
{
- LLNotifications::instance().add("ErrorProcessingSnapshot");
+ LLNotificationsUtil::add("ErrorProcessingSnapshot");
}
}
}
@@ -261,7 +261,7 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,
{
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotifications::instance().add("ErrorUploadingPostcard", args);
+ LLNotificationsUtil::add("ErrorUploadingPostcard", args);
}
else
{
@@ -291,7 +291,7 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,
// static
void LLFloaterPostcard::updateUserInfo(const std::string& email)
{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard");
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
iter != inst_list.end(); ++iter)
{
@@ -321,7 +321,7 @@ void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, voi
bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(0 == option)
{
// User clicked OK
diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h
index 49cce53106..0a44b50779 100644
--- a/indra/newview/llfloaterpostcard.h
+++ b/indra/newview/llfloaterpostcard.h
@@ -70,7 +70,7 @@ public:
void sendPostcard();
-protected:
+private:
LLPointer<LLImageJPEG> mJPEGImage;
LLPointer<LLViewerTexture> mViewerImage;
@@ -78,7 +78,7 @@ protected:
LLAssetID mAssetID;
LLVector2 mImageScale;
LLVector3d mPosTakenGlobal;
- boolean mHasFirstMsgFocus;
+ bool mHasFirstMsgFocus;
};
diff --git a/indra/newview/llfloaterpostprocess.cpp b/indra/newview/llfloaterpostprocess.cpp
index 2ab54d6e46..87a12d3d66 100644
--- a/indra/newview/llfloaterpostprocess.cpp
+++ b/indra/newview/llfloaterpostprocess.cpp
@@ -36,7 +36,7 @@
#include "llsliderctrl.h"
#include "llcheckboxctrl.h"
-#include "llcombobox.h"
+#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
#include "llviewerdisplay.h"
#include "llpostprocess.h"
@@ -161,7 +161,7 @@ void LLFloaterPostProcess::onSaveEffect(LLLineEditor* editBox)
{
LLSD payload;
payload["effect_name"] = effectName;
- LLNotifications::instance().add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2));
+ LLNotificationsUtil::add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2));
}
else
{
@@ -181,7 +181,7 @@ void LLFloaterPostProcess::onChangeEffectName(LLUICtrl* ctrl)
bool LLFloaterPostProcess::saveAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if they choose save, do it. Otherwise, don't do anything
if (option == 0)
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 8b3391726a..853693b927 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -51,14 +51,18 @@
#include "lldirpicker.h"
#include "llfeaturemanager.h"
#include "llfocusmgr.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloaterabout.h"
#include "llfloaterhardwaresettings.h"
#include "llfloatervoicedevicesettings.h"
+#include "llimfloater.h"
#include "llkeyboard.h"
#include "llmodaldialog.h"
#include "llnavigationbar.h"
+#include "llnearbychat.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llpanellogin.h"
#include "llradiogroup.h"
#include "llsearchcombobox.h"
@@ -99,20 +103,13 @@
#include "llworld.h"
#include "pipeline.h"
#include "lluictrlfactory.h"
-#include "llboost.h"
#include "llviewermedia.h"
#include "llpluginclassmedia.h"
#include "llteleporthistorystorage.h"
-#include <boost/regex.hpp>
-
-//RN temporary includes for resolution switching
-#include "llglheaders.h"
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
-const S32 ASPECT_RATIO_STR_LEN = 100;
-
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
@@ -164,7 +161,6 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
{
mParent->setKey(key);
}
-
closeFloater();
return result;
}
@@ -187,10 +183,9 @@ void handleNameTagOptionChanged(const LLSD& newvalue);
viewer_media_t get_web_media();
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
-bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
-bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
+//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
+//bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
-bool extractWindowSizeFromString(const std::string& instr, U32 &width, U32 &height);
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
viewer_media_t get_web_media()
@@ -203,7 +198,7 @@ viewer_media_t get_web_media()
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// clean web
@@ -216,7 +211,7 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response
// flag client texture cache for clearing next time the client runs
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
- LLNotifications::instance().add("CacheWillClear");
+ LLNotificationsUtil::add("CacheWillClear");
LLSearchHistory::getInstance()->clearHistory();
LLSearchHistory::getInstance()->save();
@@ -239,16 +234,16 @@ void handleNameTagOptionChanged(const LLSD& newvalue)
}
}
-bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
+/*bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option && floater )
{
if ( floater )
{
floater->setAllIgnored();
- LLFirstUse::disableFirstUse();
- LLFloaterPreference::buildLists(floater);
+ // LLFirstUse::disableFirstUse();
+ floater->buildPopupLists();
}
}
return false;
@@ -256,36 +251,19 @@ bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFlo
bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( 0 == option && floater )
{
if ( floater )
{
floater->resetAllIgnored();
- LLFirstUse::resetFirstUse();
- LLFloaterPreference::buildLists(floater);
+ //LLFirstUse::resetFirstUse();
+ floater->buildPopupLists();
}
}
return false;
}
-
-
-// Extract from strings of the form "<width> x <height>", e.g. "640 x 480".
-bool extractWindowSizeFromString(const std::string& instr, U32 &width, U32 &height)
-{
- using namespace boost;
- cmatch what;
- const regex expression("([0-9]+) x ([0-9]+)");
- if (regex_match(instr.c_str(), what, expression))
- {
- width = atoi(what[1].first);
- height = atoi(what[2].first);
- return true;
- }
-
- width = height = 0;
- return false;
-}
+*/
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
{
@@ -303,7 +281,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
}
// static
std::string LLFloaterPreference::sSkin = "";
-F32 LLFloaterPreference::sAspectRatio = 0.0;
//////////////////////////////////////////////
// LLFloaterPreference
@@ -333,22 +310,19 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
- mCommitCallbackRegistrar.add("Pref.ClickSkipDialogs", boost::bind(&LLFloaterPreference::onClickSkipDialogs, this));
- mCommitCallbackRegistrar.add("Pref.ClickResetDialogs", boost::bind(&LLFloaterPreference::onClickResetDialogs, this));
+// mCommitCallbackRegistrar.add("Pref.ClickSkipDialogs", boost::bind(&LLFloaterPreference::onClickSkipDialogs, this));
+// mCommitCallbackRegistrar.add("Pref.ClickResetDialogs", boost::bind(&LLFloaterPreference::onClickResetDialogs, this));
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
- mCommitCallbackRegistrar.add("Pref.Logging", boost::bind(&LLFloaterPreference::onCommitLogging, this));
- mCommitCallbackRegistrar.add("Pref.OpenHelp", boost::bind(&LLFloaterPreference::onOpenHelp, this));
- mCommitCallbackRegistrar.add("Pref.UpdateMeterText", boost::bind(&LLFloaterPreference::updateMeterText, this, _1));
mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
- mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));
- mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
+ mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
+ mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
sSkin = gSavedSettings.getString("SkinCurrent");
@@ -357,28 +331,32 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
BOOL LLFloaterPreference::postBuild()
{
+ gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
+ gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
S32 show_avatar_nametag_options = gSavedSettings.getS32("AvatarNameTagMode");
handleNameTagOptionChanged(LLSD(show_avatar_nametag_options));
+
+ std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
+ childSetText("cache_location", cache_location);
+
return TRUE;
}
LLFloaterPreference::~LLFloaterPreference()
{
// clean up user data
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo");
- for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++)
- {
- ctrl_aspect_ratio->setCurrentByIndex(i);
- }
for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++)
{
ctrl_window_size->setCurrentByIndex(i);
}
}
+
void LLFloaterPreference::draw()
{
BOOL has_first_selected = (getChildRef<LLScrollListCtrl>("disabled_popups").getFirstSelected()!=NULL);
@@ -390,12 +368,26 @@ void LLFloaterPreference::draw()
LLFloater::draw();
}
+void LLFloaterPreference::saveSettings()
+{
+ LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
+ child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
+ child_list_t::const_iterator end = tabcontainer->getChildList()->end();
+ for ( ; iter != end; ++iter)
+ {
+ LLView* view = *iter;
+ LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
+ if (panel)
+ panel->saveSettings();
+ }
+}
+
void LLFloaterPreference::apply()
{
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (sSkin != gSavedSettings.getString("SkinCurrent"))
{
- LLNotifications::instance().add("ChangeSkin");
+ LLNotificationsUtil::add("ChangeSkin");
refreshSkin(this);
}
// Call apply() on all panels that derive from LLPanelPreference
@@ -444,6 +436,8 @@ void LLFloaterPreference::apply()
// LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
// LLWStringUtil::replaceTabsWithSpaces(busy_response, 4);
+
+ gSavedSettings.setBOOL("PlainTextChatHistory", childGetValue("plain_text_chat_history").asBoolean());
if(mGotPersonalInfo)
{
@@ -471,13 +465,6 @@ void LLFloaterPreference::apply()
}
applyResolution();
-
- // Only set window size if we're not in fullscreen mode
- if(!gSavedSettings.getBOOL("WindowFullScreen"))
- {
- applyWindowSize();
- }
-
}
void LLFloaterPreference::cancel()
@@ -513,24 +500,23 @@ void LLFloaterPreference::cancel()
LLFloaterReg::hideInstance("pref_voicedevicesettings");
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
-
}
void LLFloaterPreference::onOpen(const LLSD& key)
{
gAgent.sendAgentUserInfoRequest();
+
/////////////////////////// From LLPanelGeneral //////////////////////////
// if we have no agent, we can't let them choose anything
// if we have an agent, then we only let them choose if they have a choice
- bool canChoose = gAgent.getID().notNull() &&
- (gAgent.isMature() || gAgent.isGodlike());
+ bool can_choose_maturity =
+ gAgent.getID().notNull() &&
+ (gAgent.isMature() || gAgent.isGodlike());
LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox");
- if (canChoose)
- {
-
+ if (can_choose_maturity)
+ {
// if they're not adult or a god, they shouldn't see the adult selection, so delete it
if (!gAgent.isAdult() && !gAgent.isGodlike())
{
@@ -540,8 +526,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)
maturity_combo->remove(0);
}
childSetVisible("maturity_desired_combobox", true);
- childSetVisible("maturity_desired_textbox", false);
-
+ childSetVisible("maturity_desired_textbox", false);
}
else
{
@@ -549,8 +534,17 @@ void LLFloaterPreference::onOpen(const LLSD& key)
childSetVisible("maturity_desired_combobox", false);
}
+ // Enabled/disabled popups, might have been changed by user actions
+ // while preferences floater was closed.
+ buildPopupLists();
+
LLPanelLogin::setAlwaysRefresh(true);
refresh();
+
+ // Make sure the current state of prefs are saved away when
+ // when the floater is opened. That will make cancel do its
+ // job
+ saveSettings();
}
void LLFloaterPreference::onVertexShaderEnable()
@@ -562,6 +556,16 @@ void LLFloaterPreference::setHardwareDefaults()
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
refreshEnabledGraphics();
+ LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
+ child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
+ child_list_t::const_iterator end = tabcontainer->getChildList()->end();
+ for ( ; iter != end; ++iter)
+ {
+ LLView* view = *iter;
+ LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
+ if (panel)
+ panel->setHardwareDefaults();
+ }
}
//virtual
@@ -569,7 +573,7 @@ void LLFloaterPreference::onClose(bool app_quitting)
{
gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
LLPanelLogin::setAlwaysRefresh(false);
- cancel(); // will be a no-op if OK or apply was performed just prior.
+ cancel();
}
void LLFloaterPreference::onOpenHardwareSettings()
@@ -583,7 +587,7 @@ void LLFloaterPreference::onBtnOK()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -591,10 +595,12 @@ void LLFloaterPreference::onBtnOK()
if (canClose())
{
+ saveSettings();
apply();
closeFloater(false);
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+
LLUIColorTable::instance().saveUserSettings();
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
// save all settings, even if equals defaults
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
@@ -608,24 +614,19 @@ void LLFloaterPreference::onBtnOK()
LLPanelLogin::refreshLocation( false );
}
-void LLFloaterPreference::onOpenHelp()
-{
- const char* xml_alert = "GraphicsPreferencesHelp";
- LLNotifications::instance().add(this->contextualNotification(xml_alert));
-}
-
// static
void LLFloaterPreference::onBtnApply( )
{
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
}
apply();
+ saveSettings();
LLPanelLogin::refreshLocation( false );
}
@@ -636,13 +637,14 @@ void LLFloaterPreference::onBtnCancel()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
refresh();
}
- closeFloater(); // side effect will also cancel any unsaved changes.
+ cancel();
+ closeFloater();
}
// static
@@ -661,7 +663,8 @@ void LLFloaterPreference::refreshEnabledGraphics()
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if(instance)
{
- instance->refreshEnabledState();
+ instance->refresh();
+ //instance->refreshEnabledState();
}
LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
if (hardware_settings)
@@ -670,32 +673,9 @@ void LLFloaterPreference::refreshEnabledGraphics()
}
}
-void LLFloaterPreference::updateMeterText(LLUICtrl* ctrl)
-{
- // get our UI widgets
- LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
-
- LLTextBox* m1 = getChild<LLTextBox>("DrawDistanceMeterText1");
- LLTextBox* m2 = getChild<LLTextBox>("DrawDistanceMeterText2");
-
- // toggle the two text boxes based on whether we have 1 or two digits
- F32 val = slider->getValueF32();
- bool two_digits = val < 100;
- m1->setVisible(two_digits);
- m2->setVisible(!two_digits);
-}
-/*
-void LLFloaterPreference::onClickClearCache()
-{
- // flag client cache for clearing next time the client runs
- gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
- LLNotifications::instance().add("CacheWillClear");
-}
-*/
-
void LLFloaterPreference::onClickBrowserClearCache()
{
- LLNotifications::instance().add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
+ LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
}
void LLFloaterPreference::onClickSetCache()
@@ -715,7 +695,7 @@ void LLFloaterPreference::onClickSetCache()
if (!dir_name.empty() && dir_name != cur_name)
{
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
- LLNotifications::instance().add("CacheWillBeMoved");
+ LLNotificationsUtil::add("CacheWillBeMoved");
gSavedSettings.setString("NewCacheLocation", dir_name);
gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
}
@@ -734,8 +714,9 @@ void LLFloaterPreference::onClickResetCache()
{
gSavedSettings.setString("NewCacheLocation", "");
gSavedSettings.setString("NewCacheLocationTopFolder", "");
- LLNotifications::instance().add("CacheWillBeMoved");
}
+
+ LLNotificationsUtil::add("CacheWillBeMoved");
std::string cache_location = gDirUtilp->getCacheDir(true);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
@@ -761,12 +742,13 @@ void LLFloaterPreference::refreshSkin(void* data)
self->getChild<LLRadioGroup>("skin_selection", true)->setValue(sSkin);
}
-// static
-void LLFloaterPreference::buildLists(void* data)
+
+void LLFloaterPreference::buildPopupLists()
{
- LLPanel*self = (LLPanel*)data;
- LLScrollListCtrl& disabled_popups = self->getChildRef<LLScrollListCtrl>("disabled_popups");
- LLScrollListCtrl& enabled_popups = self->getChildRef<LLScrollListCtrl>("enabled_popups");
+ LLScrollListCtrl& disabled_popups =
+ getChildRef<LLScrollListCtrl>("disabled_popups");
+ LLScrollListCtrl& enabled_popups =
+ getChildRef<LLScrollListCtrl>("enabled_popups");
disabled_popups.deleteAllItems();
enabled_popups.deleteAllItems();
@@ -828,8 +810,7 @@ void LLFloaterPreference::buildLists(void* data)
}
void LLFloaterPreference::refreshEnabledState()
-{
-
+{
LLCheckBoxCtrl* ctrl_reflections = getChild<LLCheckBoxCtrl>("Reflections");
LLRadioGroup* radio_reflection_detail = getChild<LLRadioGroup>("ReflectionDetailRadio");
@@ -958,37 +939,6 @@ void LLFloaterPreference::disableUnavailableSettings()
}
}
-void LLFloaterPreference::onCommitAutoDetectAspect()
-{
- BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get();
- F32 ratio;
-
- if (auto_detect)
- {
- S32 numerator = 0;
- S32 denominator = 0;
-
- // clear any aspect ratio override
- gViewerWindow->mWindow->setNativeAspectRatio(0.f);
- fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator);
-
- std::string aspect;
- if (numerator != 0)
- {
- aspect = llformat("%d:%d", numerator, denominator);
- }
- else
- {
- aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio());
- }
-
- getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect);
-
- ratio = gViewerWindow->mWindow->getNativeAspectRatio();
- gSavedSettings.setF32("FullScreenAspectRatio", ratio);
- }
-}
-
void LLFloaterPreference::refresh()
{
LLPanel::refresh();
@@ -1043,22 +993,27 @@ void LLFloaterPreference::onClickSetKey()
void LLFloaterPreference::setKey(KEY key)
{
childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
+ // update the control right away since we no longer wait for apply
+ getChild<LLUICtrl>("modifier_combo")->onCommit();
}
void LLFloaterPreference::onClickSetMiddleMouse()
{
childSetValue("modifier_combo", "MiddleMouse");
+ // update the control right away since we no longer wait for apply
+ getChild<LLUICtrl>("modifier_combo")->onCommit();
}
-
+/*
void LLFloaterPreference::onClickSkipDialogs()
{
- LLNotifications::instance().add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));
+ LLNotificationsUtil::add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));
}
void LLFloaterPreference::onClickResetDialogs()
{
- LLNotifications::instance().add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));
+ LLNotificationsUtil::add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));
}
+ */
void LLFloaterPreference::onClickEnablePopup()
{
@@ -1074,7 +1029,7 @@ void LLFloaterPreference::onClickEnablePopup()
LLUI::sSettingGroups["ignores"]->setBOOL(notification_name, TRUE);
}
- buildLists(this);
+ buildPopupLists();
}
void LLFloaterPreference::onClickDisablePopup()
@@ -1091,8 +1046,9 @@ void LLFloaterPreference::onClickDisablePopup()
LLUI::sSettingGroups["ignores"]->setBOOL(notification_name, FALSE);
}
- buildLists(this);
+ buildPopupLists();
}
+
void LLFloaterPreference::resetAllIgnored()
{
for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin();
@@ -1134,27 +1090,6 @@ void LLFloaterPreference::onClickLogPath()
gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder);
}
-void LLFloaterPreference::onCommitLogging()
-{
- enableHistory();
-}
-
-void LLFloaterPreference::enableHistory()
-{
- if (childGetValue("log_instant_messages").asBoolean())
- {
- childEnable("ChatIMLogs");
- childEnable("log_path_button");
- childEnable("show_timestamps_check_im");
- }
- else
- {
- childDisable("ChatIMLogs");
- childDisable("log_path_button");
- childDisable("show_timestamps_check_im");
- }
-}
-
void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
{
mGotPersonalInfo = true;
@@ -1184,6 +1119,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
childEnable("send_im_to_email");
childSetValue("send_im_to_email", im_via_email);
+ childEnable("plain_text_chat_history");
+ childSetValue("plain_text_chat_history", gSavedSettings.getBOOL("PlainTextChatHistory"));
childEnable("log_instant_messages");
// childEnable("log_chat");
// childEnable("busy_response");
@@ -1194,7 +1131,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
// childSetText("busy_response", gSavedSettings.getString("BusyModeResponse2"));
- enableHistory();
+ childEnable("log_nearby_chat");
+ childEnable("log_instant_messages");
+ childEnable("show_timestamps_check_im");
+ childDisable("log_path_string");// LineEditor becomes readonly in this case.
+ childEnable("log_path_button");
+
std::string display_email(email);
childSetText("email_address",display_email);
@@ -1241,70 +1183,9 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
}
}
-void LLFloaterPreference::onKeystrokeAspectRatio()
-{
- getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE);
-}
-
-void LLFloaterPreference::applyWindowSize()
-{
- LLComboBox* ctrl_windowSize = getChild<LLComboBox>("windowsize combo");
- if (ctrl_windowSize->getVisible() && (ctrl_windowSize->getCurrentIndex() != -1))
- {
- U32 width = 0;
- U32 height = 0;
- if (extractWindowSizeFromString(ctrl_windowSize->getValue().asString().c_str(), width,height))
- {
- LLViewerWindow::movieSize(width, height);
- }
- }
-}
-
void LLFloaterPreference::applyResolution()
{
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
gGL.flush();
- char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/
- if (ctrl_aspect_ratio->getCurrentIndex() == -1)
- {
- // *Can't pass const char* from c_str() into strtok
- strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/
- aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0';
- char *element = strtok(aspect_ratio_text, ":/\\");
- if (!element)
- {
- sAspectRatio = 0.f; // will be clamped later
- }
- else
- {
- LLLocale locale(LLLocale::USER_LOCALE);
- sAspectRatio = (F32)atof(element);
- }
-
- // look for denominator
- element = strtok(NULL, ":/\\");
- if (element)
- {
- LLLocale locale(LLLocale::USER_LOCALE);
-
- F32 denominator = (F32)atof(element);
- if (denominator != 0.f)
- {
- sAspectRatio /= denominator;
- }
- }
- }
- else
- {
- sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal();
- }
-
- // presumably, user entered a non-numeric value if aspect_ratio == 0.f
- if (sAspectRatio != 0.f)
- {
- sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f);
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
- }
// Screen resolution
S32 num_resolutions;
@@ -1327,37 +1208,19 @@ void LLFloaterPreference::applyResolution()
refresh();
}
-void LLFloaterPreference::initWindowSizeControls(LLPanel* panelp)
+
+
+
+void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
{
- // Window size
- // mWindowSizeLabel = getChild<LLTextBox>("WindowSizeLabel");
- LLComboBox* ctrl_window_size = panelp->getChild<LLComboBox>("windowsize combo");
-
- // Look to see if current window size matches existing window sizes, if so then
- // just set the selection value...
- const U32 height = gViewerWindow->getWindowDisplayHeight();
- const U32 width = gViewerWindow->getWindowDisplayWidth();
- for (S32 i=0; i < ctrl_window_size->getItemCount(); i++)
- {
- U32 height_test = 0;
- U32 width_test = 0;
- ctrl_window_size->setCurrentByIndex(i);
- if (extractWindowSizeFromString(ctrl_window_size->getValue().asString(), width_test, height_test))
- {
- if ((height_test == height) && (width_test == width))
- {
- return;
- }
- }
- }
- // ...otherwise, add a new entry with the current window height/width.
- LLUIString resolution_label = panelp->getString("resolution_format");
- resolution_label.setArg("[RES_X]", llformat("%d", width));
- resolution_label.setArg("[RES_Y]", llformat("%d", height));
- ctrl_window_size->add(resolution_label, ADD_TOP);
- ctrl_window_size->setCurrentByIndex(0);
+ LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
}
+void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*) ctrl;
+ color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString()));
+}
//----------------------------------------------------------------------------
@@ -1365,12 +1228,7 @@ static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference
LLPanelPreference::LLPanelPreference()
: LLPanel()
{
- mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
-}
-
-static void applyUIColor(const std::string& color_name, LLUICtrl* ctrl, const LLSD& param)
-{
- LLUIColorTable::instance().setColor(color_name, LLColor4(param));
+ mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
}
//virtual
@@ -1399,161 +1257,37 @@ BOOL LLPanelPreference::postBuild()
}
}
- ////////////////////////Panel Popups/////////////////
- if(hasChild("disabled_popups") && hasChild("enabled_popups"))
- {
- LLFloaterPreference::buildLists(this);
- }
- //////
+
if(hasChild("online_visibility") && hasChild("send_im_to_email"))
{
childSetText("email_address",getString("log_in_to_change") );
-// childSetText("busy_response", getString("log_in_to_change"));
-
- }
-
-
- if(hasChild("aspect_ratio"))
- {
- //============================================================================
- // Resolution
-/*
- S32 num_resolutions = 0;
- LLWindow::LLWindowResolution* supported_resolutions = gViewerWindow->getWindow()->getSupportedResolutions(num_resolutions);
-
- S32 fullscreen_mode = num_resolutions - 1;
-
- LLComboBox*ctrl_full_screen = getChild<LLComboBox>( "fullscreen combo");
- LLUIString resolution_label = getString("resolution_format");
-
- for (S32 i = 0; i < num_resolutions; i++)
- {
- resolution_label.setArg("[RES_X]", llformat("%d", supported_resolutions[i].mWidth));
- resolution_label.setArg("[RES_Y]", llformat("%d", supported_resolutions[i].mHeight));
- ctrl_full_screen->add( resolution_label, ADD_BOTTOM );
- }
-
- {
- BOOL targetFullscreen;
- S32 targetWidth;
- S32 targetHeight;
-
- gViewerWindow->getTargetWindow(targetFullscreen, targetWidth, targetHeight);
-
- if (targetFullscreen)
- {
- fullscreen_mode = 0; // default to 800x600
- for (S32 i = 0; i < num_resolutions; i++)
- {
- if (targetWidth == supported_resolutions[i].mWidth
- && targetHeight == supported_resolutions[i].mHeight)
- {
- fullscreen_mode = i;
- }
- }
- ctrl_full_screen->setCurrentByIndex(fullscreen_mode);
- }
- else
- {
- // set to windowed mode
- //fullscreen_mode = mCtrlFullScreen->getItemCount() - 1;
- ctrl_full_screen->setCurrentByIndex(0);
- }
- }
- */
- LLFloaterPreference::initWindowSizeControls(this);
-
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio();
- }
- else
- {
- LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio");
- }
-
- getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") ));
-
-
- S32 numerator = 0;
- S32 denominator = 0;
- fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator);
-
- LLUIString aspect_ratio_text = getString("aspect_ratio_text");
- if (numerator != 0)
- {
- aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator));
- aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator));
- }
- else
- {
- aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio);
- }
-
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
- //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this);
- // add default aspect ratios
- ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP);
- ctrl_aspect_ratio->setCurrentByIndex(0);
-
- refresh();
+// childSetText("busy_response", getString("log_in_to_change"));
}
-
- if(hasChild("user") && hasChild("agent") && hasChild("im")
- && hasChild("system") && hasChild("script_error") && hasChild("objects")
- && hasChild("owner") && hasChild("background") && hasChild("links"))
+ //////////////////////PanelPrivacy ///////////////////
+ if (hasChild("media_enabled"))
{
- LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("user");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "UserChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("UserChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("agent");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "AgentChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("AgentChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("im");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "IMChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("IMChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("system");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "SystemChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("SystemChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("script_error");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ScriptErrorColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("ScriptErrorColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("objects");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ObjectChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("ObjectChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("owner");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "llOwnerSayChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("llOwnerSayChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("background");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "BackgroundChatColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("BackgroundChatColor"));
-
- color_swatch = getChild<LLColorSwatchCtrl>("links");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "HTMLLinkColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("HTMLLinkColor"));
+ bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
+ getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
+ getChild<LLCheckBoxCtrl>("media_enabled")->set(media_enabled);
+ getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(media_enabled);
}
-
- if(hasChild("effect_color_swatch"))
+ if (hasChild("music_enabled"))
{
- LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("effect_color_swatch");
- color_swatch->setCommitCallback(boost::bind(&applyUIColor, "EffectColor", _1, _2));
- color_swatch->setOriginal(LLUIColorTable::instance().getColor("EffectColor"));
+ getChild<LLCheckBoxCtrl>("music_enabled")->set(gSavedSettings.getBOOL("AudioStreamingMusic"));
}
-
+
apply();
return true;
}
void LLPanelPreference::apply()
{
+ // no-op
+}
+
+void LLPanelPreference::saveSettings()
+{
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list<LLView*> view_stack;
@@ -1588,8 +1322,15 @@ void LLPanelPreference::apply()
{
view_stack.push_back(*iter);
}
+ }
+}
+
+void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value)
+{
+ if (checkbox && checkbox->getValue())
+ {
+ LLNotificationsUtil::add("FriendsAndGroupsOnly");
}
-
}
void LLPanelPreference::cancel()
@@ -1623,3 +1364,92 @@ void LLPanelPreference::setControlFalse(const LLSD& user_data)
control->set(LLSD(FALSE));
}
+static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics");
+
+BOOL LLPanelPreferenceGraphics::postBuild()
+{
+ return LLPanelPreference::postBuild();
+}
+void LLPanelPreferenceGraphics::draw()
+{
+ LLPanelPreference::draw();
+
+ LLButton* button_apply = findChild<LLButton>("Apply");
+
+ if(button_apply && button_apply->getVisible())
+ {
+ bool enable = hasDirtyChilds();
+
+ button_apply->setEnabled(enable);
+
+ }
+}
+bool LLPanelPreferenceGraphics::hasDirtyChilds()
+{
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ if(ctrl->isDirty())
+ return true;
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+ return false;
+}
+
+void LLPanelPreferenceGraphics::resetDirtyChilds()
+{
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ ctrl->resetDirty();
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+}
+void LLPanelPreferenceGraphics::apply()
+{
+ resetDirtyChilds();
+ LLPanelPreference::apply();
+}
+void LLPanelPreferenceGraphics::cancel()
+{
+ resetDirtyChilds();
+ LLPanelPreference::cancel();
+}
+void LLPanelPreferenceGraphics::saveSettings()
+{
+ resetDirtyChilds();
+ LLPanelPreference::saveSettings();
+}
+void LLPanelPreferenceGraphics::setHardwareDefaults()
+{
+ resetDirtyChilds();
+ LLPanelPreference::setHardwareDefaults();
+}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 34723b8c7e..93b39d72bc 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -84,9 +84,7 @@ protected:
void onBtnOK();
void onBtnCancel();
void onBtnApply();
- void onOpenHelp();
-// void onClickClearCache();
void onClickBrowserClearCache();
// if the custom settings box is clicked
@@ -98,6 +96,10 @@ protected:
// callback for when client turns on shaders
void onVertexShaderEnable();
+ // This function squirrels away the current values of the controls so that
+ // cancel() can restore them.
+ void saveSettings();
+
public:
@@ -108,15 +110,14 @@ public:
void onClickSetKey();
void setKey(KEY key);
void onClickSetMiddleMouse();
- void onClickSkipDialogs();
- void onClickResetDialogs();
+// void onClickSkipDialogs();
+// void onClickResetDialogs();
void onClickEnablePopup();
void onClickDisablePopup();
void resetAllIgnored();
void setAllIgnored();
void onClickLogPath();
void enableHistory();
- void onCommitLogging();
void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
void refreshEnabledState();
void disableUnavailableSettings();
@@ -127,20 +128,18 @@ public:
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name);
- void onKeystrokeAspectRatio();
// void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
-// bool extractWindowSizeFromString(const std::string& instr, U32 &width, U32 &height);
- void onCommitAutoDetectAspect();
+ void onCommitParcelMediaAutoPlayEnable();
+ void onCommitMediaEnabled();
+ void onCommitMusicEnabled();
void applyResolution();
- void applyWindowSize();
-
- static void initWindowSizeControls(LLPanel* panelp);
+ void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
+ void getUIColor(LLUICtrl* ctrl, const LLSD& param);
- static void buildLists(void* data);
+ void buildPopupLists();
static void refreshSkin(void* data);
static void cleanupBadSetting();
- static F32 sAspectRatio;
private:
static std::string sSkin;
bool mGotPersonalInfo;
@@ -148,7 +147,6 @@ private:
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
-
};
class LLPanelPreference : public LLPanel
@@ -160,7 +158,16 @@ public:
virtual void apply();
virtual void cancel();
void setControlFalse(const LLSD& user_data);
+ virtual void setHardwareDefaults(){};
+
+ // This function squirrels away the current values of the controls so that
+ // cancel() can restore them.
+ virtual void saveSettings();
+
private:
+ //for "Only friends and groups can call or IM me"
+ static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
+
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
@@ -168,4 +175,19 @@ private:
string_color_map_t mSavedColors;
};
+class LLPanelPreferenceGraphics : public LLPanelPreference
+{
+public:
+ BOOL postBuild();
+ void draw();
+ void apply();
+ void cancel();
+ void saveSettings();
+ void setHardwareDefaults();
+protected:
+ bool hasDirtyChilds();
+ void resetDirtyChilds();
+
+};
+
#endif // LL_LLPREFERENCEFLOATER_H
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 4375787ea2..5c0593ad29 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -44,6 +44,7 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llavataractions.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
//#include "llspinctrl.h"
@@ -129,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()
{
// build the UI
// item name & description
- childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
- childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
@@ -879,7 +880,11 @@ void LLFloaterProperties::dirtyAll()
iter != inst_list.end(); ++iter)
{
LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter);
- floater->dirty();
+ llassert(floater); // else cast failed - wrong type D:
+ if (floater)
+ {
+ floater->dirty();
+ }
}
}
@@ -900,7 +905,7 @@ LLMultiProperties::LLMultiProperties()
{
// start with a small rect in the top-left corner ; will get resized
LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 20, 20);
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
setRect(rect);
}
setTitle(LLTrans::getString("MultiPropertiesTitle"));
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 11544f5b7b..d54736e942 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -42,18 +42,18 @@
#include "llglheaders.h"
#include "llregionflags.h"
#include "llstl.h"
+#include "llvfile.h"
+#include "llxfermanager.h"
#include "indra_constants.h"
#include "message.h"
#include "llagent.h"
-#include "llalertdialog.h"
#include "llappviewer.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "llfilepicker.h"
-#include "llfloaterdaycycle.h"
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
#include "llfloatertopobjects.h" // added to fix SL-32336
#include "llfloatergroups.h"
@@ -62,8 +62,9 @@
#include "llfloaterwindlight.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
-#include "llalertdialog.h"
#include "llnamelistctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
#include "llslurl.h"
@@ -86,8 +87,6 @@
#include "lltrans.h"
#include "llagentui.h"
-#define ELAR_ENABLED 0 // Enable when server support is implemented
-
const S32 TERRAIN_TEXTURE_COUNT = 4;
const S32 CORNER_COUNT = 4;
@@ -179,6 +178,8 @@ BOOL LLFloaterRegionInfo::postBuild()
LLPanelRegionInfo* panel;
panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
+ panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+
LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml");
mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
@@ -405,6 +406,11 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
{
+ if (!region)
+ {
+ return;
+ }
+
// call refresh from region on all panels
std::for_each(
mInfoPanels.begin(),
@@ -544,14 +550,10 @@ void LLPanelRegionInfo::initCtrl(const std::string& name)
getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this));
}
-void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
- getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert));
-}
-
-void LLPanelRegionInfo::onClickHelp(std::string xml_alert)
+void LLPanelRegionInfo::onClickManageTelehub()
{
- LLNotifications::instance().add(xml_alert);
+ LLFloaterReg::hideInstance("region_info");
+ LLFloaterReg::showInstance("telehubs");
}
/////////////////////////////////////////////////////////////////////////////
@@ -589,47 +591,30 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
initCtrl("restrict_pushobject");
initCtrl("block_parcel_search_check");
- initHelpBtn("terraform_help", "HelpRegionBlockTerraform");
- initHelpBtn("fly_help", "HelpRegionBlockFly");
- initHelpBtn("damage_help", "HelpRegionAllowDamage");
- initHelpBtn("agent_limit_help", "HelpRegionAgentLimit");
- initHelpBtn("object_bonus_help", "HelpRegionObjectBonus");
- initHelpBtn("access_help", "HelpRegionMaturity");
- initHelpBtn("restrict_pushobject_help", "HelpRegionRestrictPushObject");
- initHelpBtn("land_resell_help", "HelpRegionLandResell");
- initHelpBtn("parcel_changes_help", "HelpParcelChanges");
- initHelpBtn("parcel_search_help", "HelpRegionSearch");
-
- childSetAction("kick_btn", onClickKick, this);
+ childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this));
childSetAction("kick_all_btn", onClickKickAll, this);
childSetAction("im_btn", onClickMessage, this);
// childSetAction("manage_telehub_btn", onClickManageTelehub, this);
- mCommitCallbackRegistrar.add("RegionInfo.Cancel", boost::bind(&LLPanelRegionGeneralInfo::onClickManageTelehub, this));
return LLPanelRegionInfo::postBuild();
}
-// static
-void LLPanelRegionGeneralInfo::onClickKick(void* userdata)
+void LLPanelRegionGeneralInfo::onClickKick()
{
llinfos << "LLPanelRegionGeneralInfo::onClickKick" << llendl;
- LLPanelRegionGeneralInfo* panelp = (LLPanelRegionGeneralInfo*)userdata;
// this depends on the grandparent view being a floater
// in order to set up floater dependency
- LLFloater* parent_floater = gFloaterView->getParentFloater(panelp);
- LLFloater* child_floater = LLFloaterAvatarPicker::show(onKickCommit, userdata, FALSE, TRUE);
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1,_2), FALSE, TRUE);
parent_floater->addDependentFloater(child_floater);
}
-// static
-void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
+void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
if (names.empty() || ids.empty()) return;
if(ids[0].notNull())
{
- LLPanelRegionGeneralInfo* self = (LLPanelRegionGeneralInfo*)userdata;
- if(!self) return;
strings_t strings;
// [0] = our agent id
// [1] = target agent id
@@ -641,7 +626,7 @@ void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& name
strings.push_back(strings_t::value_type(buffer));
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
- self->sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", invoice, strings);
+ sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", invoice, strings);
}
}
@@ -649,7 +634,7 @@ void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& name
void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
{
llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl;
- LLNotifications::instance().add("KickUsersFromRegion",
+ LLNotificationsUtil::add("KickUsersFromRegion",
LLSD(),
LLSD(),
boost::bind(&LLPanelRegionGeneralInfo::onKickAllCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
@@ -657,7 +642,7 @@ void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
strings_t strings;
@@ -677,7 +662,7 @@ bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const L
void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
{
llinfos << "LLPanelRegionGeneralInfo::onClickMessage" << llendl;
- LLNotifications::instance().add("MessageRegion",
+ LLNotificationsUtil::add("MessageRegion",
LLSD(),
LLSD(),
boost::bind(&LLPanelRegionGeneralInfo::onMessageCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
@@ -686,7 +671,7 @@ void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
// static
bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
{
- if(LLNotification::getSelectedOption(notification, response) != 0) return false;
+ if(LLNotificationsUtil::getSelectedOption(notification, response) != 0) return false;
std::string text = response["message"].asString();
if (text.empty()) return false;
@@ -712,11 +697,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
-void LLPanelRegionGeneralInfo::onClickManageTelehub()
-{
- LLFloaterReg::hideInstance("region_info");
- LLFloaterReg::showInstance("telehubs");
-}
+
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
@@ -793,7 +774,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
LLViewerRegion* region = gAgent.getRegion();
if (region && (childGetValue("access_combo").asInteger() != region->getSimAccess()) )
{
- LLNotifications::instance().add("RegionMaturityChange");
+ LLNotificationsUtil::add("RegionMaturityChange");
}
return TRUE;
@@ -809,14 +790,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()
initCtrl("disable_collisions_check");
initCtrl("disable_physics_check");
- initHelpBtn("disable_scripts_help", "HelpRegionDisableScripts");
- initHelpBtn("disable_collisions_help", "HelpRegionDisableCollisions");
- initHelpBtn("disable_physics_help", "HelpRegionDisablePhysics");
- initHelpBtn("top_colliders_help", "HelpRegionTopColliders");
- initHelpBtn("top_scripts_help", "HelpRegionTopScripts");
- initHelpBtn("restart_help", "HelpRegionRestart");
-
- childSetAction("choose_avatar_btn", onClickChooseAvatar, this);
+ childSetAction("choose_avatar_btn", boost::bind(&LLPanelRegionDebugInfo::onClickChooseAvatar, this));
childSetAction("return_btn", onClickReturn, this);
childSetAction("top_colliders_btn", onClickTopColliders, this);
childSetAction("top_scripts_btn", onClickTopScripts, this);
@@ -868,19 +842,18 @@ BOOL LLPanelRegionDebugInfo::sendUpdate()
return TRUE;
}
-void LLPanelRegionDebugInfo::onClickChooseAvatar(void* data)
+void LLPanelRegionDebugInfo::onClickChooseAvatar()
{
- LLFloaterAvatarPicker::show(callbackAvatarID, data, FALSE, TRUE);
+ LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2), FALSE, TRUE);
}
-// static
-void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
+
+void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*) data;
if (ids.empty() || names.empty()) return;
- self->mTargetAvatar = ids[0];
- self->childSetValue("target_avatar_name", LLSD(names[0]));
- self->refreshFromRegion( gAgent.getRegion() );
+ mTargetAvatar = ids[0];
+ childSetValue("target_avatar_name", LLSD(names[0]));
+ refreshFromRegion( gAgent.getRegion() );
}
// static
@@ -907,13 +880,13 @@ void LLPanelRegionDebugInfo::onClickReturn(void* data)
}
payload["flags"] = int(flags);
payload["return_estate_wide"] = panelp->childGetValue("return_estate_wide").asBoolean();
- LLNotifications::instance().add("EstateObjectReturn", args, payload,
+ LLNotificationsUtil::add("EstateObjectReturn", args, payload,
boost::bind(&LLPanelRegionDebugInfo::callbackReturn, panelp, _1, _2));
}
bool LLPanelRegionDebugInfo::callbackReturn(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return false;
LLUUID target_avatar = notification["payload"]["avatar_id"].asUUID();
@@ -973,13 +946,13 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
// static
void LLPanelRegionDebugInfo::onClickRestart(void* data)
{
- LLNotifications::instance().add("ConfirmRestart", LLSD(), LLSD(),
+ LLNotificationsUtil::add("ConfirmRestart", LLSD(), LLSD(),
boost::bind(&LLPanelRegionDebugInfo::callbackRestart, (LLPanelRegionDebugInfo*)data, _1, _2));
}
bool LLPanelRegionDebugInfo::callbackRestart(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return false;
strings_t strings;
@@ -1147,7 +1120,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
LLSD args;
args["TEXTURE_NUM"] = i+1;
args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
- LLNotifications::instance().add("InvalidTerrainBitDepth", args);
+ LLNotificationsUtil::add("InvalidTerrainBitDepth", args);
return FALSE;
}
@@ -1158,7 +1131,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
args["TEXTURE_NUM"] = i+1;
args["TEXTURE_SIZE_X"] = width;
args["TEXTURE_SIZE_Y"] = height;
- LLNotifications::instance().add("InvalidTerrainSize", args);
+ LLNotificationsUtil::add("InvalidTerrainSize", args);
return FALSE;
}
@@ -1182,15 +1155,6 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
{
LLPanelRegionInfo::postBuild();
- initHelpBtn("water_height_help", "HelpRegionWaterHeight");
- initHelpBtn("terrain_raise_help", "HelpRegionTerrainRaise");
- initHelpBtn("terrain_lower_help", "HelpRegionTerrainLower");
- initHelpBtn("upload_raw_help", "HelpRegionUploadRaw");
- initHelpBtn("download_raw_help", "HelpRegionDownloadRaw");
- initHelpBtn("use_estate_sun_help", "HelpRegionUseEstateSun");
- initHelpBtn("fixed_sun_help", "HelpRegionFixedSun");
- initHelpBtn("bake_terrain_help", "HelpRegionBakeTerrain");
-
initCtrl("water_height_spin");
initCtrl("terrain_raise_spin");
initCtrl("terrain_lower_spin");
@@ -1345,21 +1309,18 @@ void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data)
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
- LLNotifications::instance().add("RawUploadStarted");
+ LLNotificationsUtil::add("RawUploadStarted");
}
// static
void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)
{
- LLNotification::Params::Functor functor_params;
- functor_params.function(boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));
-
- LLNotifications::instance().add(LLNotification::Params("ConfirmBakeTerrain").functor(functor_params));
+ LLNotificationsUtil::add("ConfirmBakeTerrain", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));
}
bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return false;
strings_t strings;
@@ -1446,7 +1407,7 @@ void LLPanelEstateInfo::onClickAddAllowedAgent(void* user_data)
LLSD args;
args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
- LLNotifications::instance().add("MaxAllowedAgentOnRegion", args);
+ LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args);
return;
}
accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd");
@@ -1466,7 +1427,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()
{
LLSD args;
args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
- LLNotifications::instance().add("MaxAllowedGroupsOnRegion", args);
+ LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args);
return;
}
@@ -1484,7 +1445,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()
bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0) return false;
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
@@ -1521,7 +1482,7 @@ void LLPanelEstateInfo::onClickAddBannedAgent(void* user_data)
{
LLSD args;
args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
- LLNotifications::instance().add("MaxBannedAgentsOnRegion", args);
+ LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);
return;
}
accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd");
@@ -1543,7 +1504,7 @@ void LLPanelEstateInfo::onClickAddEstateManager(void* user_data)
{ // Tell user they can't add more managers
LLSD args;
args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS);
- LLNotifications::instance().add("MaxManagersOnRegion", args);
+ LLNotificationsUtil::add("MaxManagersOnRegion", args);
}
else
{ // Go pick managers to add
@@ -1560,24 +1521,17 @@ void LLPanelEstateInfo::onClickRemoveEstateManager(void* user_data)
//---------------------------------------------------------------------------
// Kick from estate methods
//---------------------------------------------------------------------------
-struct LLKickFromEstateInfo
-{
- LLPanelEstateInfo *mEstatePanelp;
- LLUUID mAgentID;
-};
-void LLPanelEstateInfo::onClickKickUser(void *user_data)
+void LLPanelEstateInfo::onClickKickUser()
{
- LLPanelEstateInfo* panelp = (LLPanelEstateInfo*)user_data;
-
// this depends on the grandparent view being a floater
// in order to set up floater dependency
- LLFloater* parent_floater = gFloaterView->getParentFloater(panelp);
- LLFloater* child_floater = LLFloaterAvatarPicker::show(LLPanelEstateInfo::onKickUserCommit, user_data, FALSE, TRUE);
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1, _2), FALSE, TRUE);
parent_floater->addDependentFloater(child_floater);
}
-void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
+void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
if (names.empty() || ids.empty()) return;
@@ -1588,26 +1542,18 @@ void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names,
return;
}
- LLPanelEstateInfo* self = (LLPanelEstateInfo*)userdata;
- if(!self) return;
-
- //keep track of what user they want to kick and other misc info
- LLKickFromEstateInfo *kick_info = new LLKickFromEstateInfo();
- kick_info->mEstatePanelp = self;
- kick_info->mAgentID = ids[0];
-
//Bring up a confirmation dialog
LLSD args;
args["EVIL_USER"] = names[0];
LLSD payload;
payload["agent_id"] = ids[0];
- LLNotifications::instance().add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, self, _1, _2));
+ LLNotificationsUtil::add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, this, _1, _2));
}
bool LLPanelEstateInfo::kickUserConfirm(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0:
@@ -1647,7 +1593,7 @@ std::string all_estates_text()
}
else if (region && region->getOwner() == gAgent.getID())
{
- return LLTrans::getString("AllEstatesYouOwn");
+ return LLTrans::getString("RegionInfoAllEstatesYouOwn");
}
else if (region && region->isEstateManager())
{
@@ -1756,7 +1702,7 @@ void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dia
// static
bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0)
{
// abort change
@@ -1765,7 +1711,7 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res
LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]);
// avatar picker yes multi-select, yes close-on-select
- LLFloaterAvatarPicker::show(accessAddCore3, (void*)change_info, TRUE, TRUE);
+ LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, _2, (void*)change_info), TRUE, TRUE);
return false;
}
@@ -1800,7 +1746,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co
args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
args["LIST_TYPE"] = "Allowed Residents";
args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
- LLNotifications::instance().add("MaxAgentOnRegionBatch", args);
+ LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
delete change_info;
return;
}
@@ -1816,7 +1762,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co
args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
args["LIST_TYPE"] = "Banned Residents";
args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
- LLNotifications::instance().add("MaxAgentOnRegionBatch", args);
+ LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
delete change_info;
return;
}
@@ -1885,7 +1831,7 @@ void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string&
// static
bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0)
{
// abort
@@ -1902,7 +1848,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&
{
LLSD args;
args["ALL_ESTATES"] = all_estates_text();
- LLNotifications::instance().add(notification["payload"]["dialog_name"],
+ LLNotificationsUtil::add(notification["payload"]["dialog_name"],
args,
notification["payload"],
accessCoreConfirm);
@@ -1915,7 +1861,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&
// static
bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger();
LLViewerRegion* region = gAgent.getRegion();
@@ -1934,7 +1880,7 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD&
if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD)
&& region && (region->getOwner() == id))
{
- LLNotifications::instance().add("OwnerCanNotBeDenied");
+ LLNotificationsUtil::add("OwnerCanNotBeDenied");
break;
}
switch(option)
@@ -2030,11 +1976,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
childSetEnabled("remove_banned_avatar_btn", god || owner || manager);
childSetEnabled("message_estate_btn", god || owner || manager);
childSetEnabled("kick_user_from_estate_btn", god || owner || manager);
-#if ELAR_ENABLED
- childSetEnabled("abuse_email_address", god || owner || manager);
-#else
- childSetEnabled("abuse_email_address", false);
-#endif
// estate managers can't add estate managers
childSetEnabled("add_estate_manager_btn", god || owner);
@@ -2100,22 +2041,6 @@ BOOL LLPanelEstateInfo::postBuild()
initCtrl("limit_payment");
initCtrl("limit_age_verified");
initCtrl("voice_chat_check");
- getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
- getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
-
- initHelpBtn("estate_manager_help", "HelpEstateEstateManager");
- initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime");
- initHelpBtn("fixed_sun_help", "HelpEstateFixedSun");
- initHelpBtn("WLEditSkyHelp", "HelpEditSky");
- initHelpBtn("WLEditDayCycleHelp", "HelpEditDayCycle");
-
- initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible");
- initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport");
- initHelpBtn("allow_resident_help", "HelpEstateAllowResident");
- initHelpBtn("allow_group_help", "HelpEstateAllowGroup");
- initHelpBtn("ban_resident_help", "HelpEstateBanResident");
- initHelpBtn("abuse_email_address_help", "HelpEstateAbuseEmailAddress");
- initHelpBtn("voice_chat_help", "HelpEstateVoiceChat");
// set up the use global time checkbox
getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
@@ -2166,7 +2091,7 @@ BOOL LLPanelEstateInfo::postBuild()
childSetAction("add_estate_manager_btn", onClickAddEstateManager, this);
childSetAction("remove_estate_manager_btn", onClickRemoveEstateManager, this);
childSetAction("message_estate_btn", onClickMessageEstate, this);
- childSetAction("kick_user_from_estate_btn", onClickKickUser, this);
+ childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this));
childSetAction("WLEditSky", onClickEditSky, this);
childSetAction("WLEditDayCycle", onClickEditDayCycle, this);
@@ -2210,7 +2135,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0:
@@ -2325,8 +2250,6 @@ bool LLPanelEstateInfo::commitEstateInfoCaps()
}
body["sun_hour"] = sun_hour;
- body["owner_abuse_email"] = childGetValue("abuse_email_address").asString();
-
// we use a responder so that we can re-get the data after committing to the database
LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
return true;
@@ -2485,16 +2408,6 @@ void LLPanelEstateInfo::setOwnerName(const std::string& name)
childSetValue("estate_owner", LLSD(name));
}
-const std::string LLPanelEstateInfo::getAbuseEmailAddress() const
-{
- return childGetValue("abuse_email_address").asString();
-}
-
-void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address)
-{
- childSetValue("abuse_email_address", LLSD(address));
-}
-
void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
bool enable_group,
bool enable_ban)
@@ -2599,12 +2512,12 @@ BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
{
llinfos << "LLPanelEstateInfo::onClickMessageEstate" << llendl;
- LLNotifications::instance().add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));
+ LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));
}
bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
std::string text = response["message"].asString();
if(option != 0) return false;
if(text.empty()) return false;
@@ -2621,7 +2534,9 @@ bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& re
}
LLPanelEstateCovenant::LLPanelEstateCovenant()
-: mCovenantID(LLUUID::null)
+ :
+ mCovenantID(LLUUID::null),
+ mAssetStatus(ASSET_ERROR)
{
}
@@ -2694,7 +2609,6 @@ bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
// virtual
BOOL LLPanelEstateCovenant::postBuild()
{
- initHelpBtn("covenant_help", "HelpEstateCovenant");
mEstateNameText = getChild<LLTextBox>("estate_name_text");
mEstateOwnerText = getChild<LLTextBox>("estate_owner_text");
mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text");
@@ -2734,7 +2648,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop
{
LLSD payload;
payload["item_id"] = item->getUUID();
- LLNotifications::instance().add("EstateChangeCovenant", LLSD(), payload,
+ LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload,
LLPanelEstateCovenant::confirmChangeCovenantCallback);
}
break;
@@ -2749,7 +2663,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop
// static
bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
@@ -2769,7 +2683,7 @@ bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notificati
// static
void LLPanelEstateCovenant::resetCovenantID(void* userdata)
{
- LLNotifications::instance().add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);
+ LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);
}
// static
@@ -2778,7 +2692,7 @@ bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notificatio
LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
if (!self) return false;
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0:
@@ -2842,7 +2756,7 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) )
{
llwarns << "Problem importing estate covenant." << llendl;
- LLNotifications::instance().add("ProblemImportingEstateCovenant");
+ LLNotificationsUtil::add("ProblemImportingEstateCovenant");
}
else
{
@@ -2862,15 +2776,15 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
LL_ERR_FILE_EMPTY == status)
{
- LLNotifications::instance().add("MissingNotecardAssetID");
+ LLNotificationsUtil::add("MissingNotecardAssetID");
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
- LLNotifications::instance().add("NotAllowedToViewNotecard");
+ LLNotificationsUtil::add("NotAllowedToViewNotecard");
}
else
{
- LLNotifications::instance().add("UnableToLoadNotecardAsset");
+ LLNotificationsUtil::add("UnableToLoadNotecardAsset");
}
llwarns << "Problem loading notecard: " << status << llendl;
@@ -3004,18 +2918,6 @@ bool LLDispatchEstateUpdateInfo::operator()(
std::string estate_name = strings[0].c_str(); // preserve c_str() call!
panel->setEstateName(estate_name);
-#if ELAR_ENABLED
- if (strings.size() > 9)
- {
- std::string abuse_email = strings[9].c_str(); // preserve c_str() call!
- panel->setAbuseEmailAddress(abuse_email);
- }
- else
-#endif
- {
- panel->setAbuseEmailAddress(panel->getString("email_unsupported"));
- }
-
LLViewerRegion* regionp = gAgent.getRegion();
LLUUID owner_id(strings[1]);
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 95833af8a1..8d315bdb78 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -35,9 +35,12 @@
#define LL_LLFLOATERREGIONINFO_H
#include <vector>
+#include "llassettype.h"
#include "llfloater.h"
+#include "llhost.h"
#include "llpanel.h"
+class LLDispatcher;
class LLLineEditor;
class LLMessageSystem;
class LLPanelRegionInfo;
@@ -51,6 +54,7 @@ class LLNameListCtrl;
class LLSliderCtrl;
class LLSpinCtrl;
class LLTextBox;
+class LLVFS;
class LLPanelRegionGeneralInfo;
class LLPanelRegionDebugInfo;
@@ -123,12 +127,10 @@ public:
void enableButton(const std::string& btn_name, BOOL enable = TRUE);
void disableButton(const std::string& btn_name);
+ void onClickManageTelehub();
+
protected:
void initCtrl(const std::string& name);
- void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
- // Callback for all help buttons, data is name of XML alert to show.
- void onClickHelp(std::string xml_alert);
// Returns TRUE if update sent and apply button should be
// disabled.
@@ -152,6 +154,7 @@ protected:
class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
{
+
public:
LLPanelRegionGeneralInfo()
: LLPanelRegionInfo() {}
@@ -161,16 +164,16 @@ public:
// LLPanel
virtual BOOL postBuild();
+
protected:
virtual BOOL sendUpdate();
-
- static void onClickKick(void* userdata);
- static void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
+ void onClickKick();
+ void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
static void onClickKickAll(void* userdata);
bool onKickAllCommit(const LLSD& notification, const LLSD& response);
static void onClickMessage(void* userdata);
bool onMessageCommit(const LLSD& notification, const LLSD& response);
- void onClickManageTelehub();
+
};
/////////////////////////////////////////////////////////////////////////////
@@ -189,8 +192,8 @@ public:
protected:
virtual BOOL sendUpdate();
- static void onClickChooseAvatar(void*);
- static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ void onClickChooseAvatar();
+ void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
static void onClickReturn(void *);
bool callbackReturn(const LLSD& notification, const LLSD& response);
static void onClickTopColliders(void*);
@@ -272,7 +275,7 @@ public:
static void onClickRemoveBannedAgent(void* user_data);
static void onClickAddEstateManager(void* user_data);
static void onClickRemoveEstateManager(void* user_data);
- static void onClickKickUser(void* userdata);
+ void onClickKickUser();
// Group picker callback is different, can't use core methods below
bool addAllowedGroup(const LLSD& notification, const LLSD& response);
@@ -293,7 +296,7 @@ public:
// Send the actual EstateOwnerRequest "estateaccessdelta" message
static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id);
- static void onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
+ void onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
static void onClickMessageEstate(void* data);
bool onMessageCommit(const LLSD& notification, const LLSD& response);
@@ -331,9 +334,6 @@ public:
const std::string getOwnerName() const;
void setOwnerName(const std::string& name);
- const std::string getAbuseEmailAddress() const;
- void setAbuseEmailAddress(const std::string& address);
-
// If visible from mainland, allowed agent and allowed groups
// are ignored, so must disable UI.
void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 70a3ad5252..0f3c176cea 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -40,11 +40,14 @@
// linden library includes
#include "llassetstorage.h"
#include "llfontgl.h"
-#include "llgl.h" // for renderer
+#include "llimagej2c.h"
#include "llinventory.h"
+#include "llnotificationsutil.h"
#include "llstring.h"
#include "llsys.h"
-#include "llversionviewer.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "mean_collision_data.h"
#include "message.h"
#include "v3math.h"
@@ -54,7 +57,6 @@
#include "llfloaterreg.h"
#include "lltexturectrl.h"
#include "llscrolllistctrl.h"
-#include "llimview.h"
#include "lldispatcher.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -75,7 +77,7 @@
#include "llfloateravatarpicker.h"
#include "lldir.h"
#include "llselectmgr.h"
-#include "llviewerbuild.h"
+#include "llversioninfo.h"
#include "lluictrlfactory.h"
#include "llviewernetwork.h"
@@ -95,7 +97,6 @@ const U32 INCLUDE_SCREENSHOT = 0x01 << 0;
LLFloaterReporter::LLFloaterReporter(const LLSD& key)
: LLFloater(key),
mReportType(COMPLAINT_REPORT),
- mEmailToEstateOwner(FALSE),
mObjectID(),
mScreenID(),
mAbuserID(),
@@ -117,18 +118,7 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
if ( LLFloaterReg::instanceVisible("reporter") )
{
- LLFloaterReporter *f = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
- BOOL email_to_estate_owner = ( region_flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER );
- f->mEmailToEstateOwner = email_to_estate_owner;
-
- if ( email_to_estate_owner )
- {
- LLNotifications::instance().add("HelpReportAbuseEmailEO");
- }
- else
- {
- LLNotifications::instance().add("HelpReportAbuseEmailLL");
- }
+ LLNotificationsUtil::add("HelpReportAbuseEmailLL");
};
}
// virtual
@@ -182,7 +172,7 @@ BOOL LLFloaterReporter::postBuild()
std::string("tool_face_active.tga") );
childSetAction("pick_btn", onClickObjPicker, this);
- childSetAction("select_abuser", onClickSelectAbuser, this);
+ childSetAction("select_abuser", boost::bind(&LLFloaterReporter::onClickSelectAbuser, this));
childSetAction("send_btn", onClickSend, this);
childSetAction("cancel_btn", onClickCancel, this);
@@ -218,17 +208,7 @@ LLFloaterReporter::~LLFloaterReporter()
// virtual
void LLFloaterReporter::draw()
{
- // this is set by a static callback sometime after the dialog is created.
- // Only disable screenshot for abuse reports to estate owners
- if ( mEmailToEstateOwner )
- {
- childSetValue("screen_check", FALSE );
- childSetEnabled("screen_check", FALSE );
- }
- else
- {
- childSetEnabled("screen_check", TRUE );
- }
+ childSetEnabled("screen_check", TRUE );
LLFloater::draw();
}
@@ -268,6 +248,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
if ( objectp->isAttachment() )
{
objectp = (LLViewerObject*)objectp->getRoot();
+ mObjectID = objectp->getID();
}
// correct the region and position information
@@ -297,13 +278,8 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
{
object_owner.append("Unknown");
}
- childSetText("object_name", object_owner);
- std::string owner_link =
- LLSLURL::buildCommand("agent", mObjectID, "inspect");
- childSetText("owner_name", owner_link);
- childSetText("abuser_name_edit", object_owner);
- mAbuserID = object_id;
- mOwnerName = object_owner;
+
+ setFromAvatar(mObjectID, object_owner);
}
else
{
@@ -325,30 +301,34 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
}
}
-
-// static
-void LLFloaterReporter::onClickSelectAbuser(void *userdata)
+void LLFloaterReporter::onClickSelectAbuser()
{
- LLFloaterReporter *self = (LLFloaterReporter *)userdata;
-
- gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, userdata, FALSE, TRUE ));
+ gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ));
}
-// static
-void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
+void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLFloaterReporter* self = (LLFloaterReporter*) data;
-
if (ids.empty() || names.empty()) return;
- self->childSetText("abuser_name_edit", names[0] );
+ childSetText("abuser_name_edit", names[0] );
- self->mAbuserID = ids[0];
+ mAbuserID = ids[0];
- self->refresh();
+ refresh();
}
+void LLFloaterReporter::setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name)
+{
+ mAbuserID = mObjectID = avatar_id;
+ mOwnerName = avatar_name;
+
+ std::string avatar_link = LLSLURL::buildCommand("agent", mObjectID, "inspect");
+ childSetText("owner_name", avatar_link);
+ childSetText("object_name", avatar_name);
+ childSetText("abuser_name_edit", avatar_name);
+}
+
// static
void LLFloaterReporter::onClickSend(void *userdata)
{
@@ -379,7 +359,7 @@ void LLFloaterReporter::onClickSend(void *userdata)
category_value == IP_CONTENT_REMOVAL ||
category_value == IP_PERMISSONS_EXPLOIT)
{
- LLNotifications::instance().add("HelpReportAbuseContainsCopyright");
+ LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
self->mCopyrightWarningSeen = TRUE;
return;
}
@@ -388,7 +368,7 @@ void LLFloaterReporter::onClickSend(void *userdata)
{
// IP_CONTENT_REMOVAL *always* shows the dialog -
// ergo you can never send that abuse report type.
- LLNotifications::instance().add("HelpReportAbuseContainsCopyright");
+ LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
return;
}
@@ -484,9 +464,8 @@ void LLFloaterReporter::showFromMenu(EReportType report_type)
}
}
-
// static
-void LLFloaterReporter::showFromObject(const LLUUID& object_id)
+void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name)
{
LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
@@ -495,8 +474,11 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
LLAgentUI::buildFullname(fullname);
f->childSetText("reporter_field", fullname);
- // Request info for this object
- f->getObjectInfo(object_id);
+ if (avatar_name.empty())
+ // Request info for this object
+ f->getObjectInfo(object_id);
+ else
+ f->setFromAvatar(object_id, avatar_name);
// Need to deselect on close
f->mDeselectOnClose = TRUE;
@@ -505,6 +487,18 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
}
+// static
+void LLFloaterReporter::showFromObject(const LLUUID& object_id)
+{
+ show(object_id);
+}
+
+// static
+void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name)
+{
+ show(avatar_id, avatar_name);
+}
+
void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
{
childSetText("object_name", object_name);
@@ -524,39 +518,39 @@ bool LLFloaterReporter::validateReport()
U8 category = (U8)category_sd.asInteger();
if (category == 0)
{
- LLNotifications::instance().add("HelpReportAbuseSelectCategory");
+ LLNotificationsUtil::add("HelpReportAbuseSelectCategory");
return false;
}
if ( childGetText("abuser_name_edit").empty() )
{
- LLNotifications::instance().add("HelpReportAbuseAbuserNameEmpty");
+ LLNotificationsUtil::add("HelpReportAbuseAbuserNameEmpty");
return false;
};
if ( childGetText("abuse_location_edit").empty() )
{
- LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty");
+ LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
return false;
};
if ( childGetText("abuse_location_edit").empty() )
{
- LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty");
+ LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
return false;
};
if ( childGetText("summary_edit").empty() )
{
- LLNotifications::instance().add("HelpReportAbuseSummaryEmpty");
+ LLNotificationsUtil::add("HelpReportAbuseSummaryEmpty");
return false;
};
if ( childGetText("details_edit") == mDefaultSummary )
{
- LLNotifications::instance().add("HelpReportAbuseDetailsEmpty");
+ LLNotificationsUtil::add("HelpReportAbuseDetailsEmpty");
return false;
};
return true;
@@ -608,10 +602,7 @@ LLSD LLFloaterReporter::gatherReport()
std::ostringstream details;
- details << "V" << LL_VERSION_MAJOR << "." // client version moved to body of email for abuse reports
- << LL_VERSION_MINOR << "."
- << LL_VERSION_PATCH << "."
- << LL_VIEWER_BUILD << std::endl << std::endl;
+ details << "V" << LLVersionInfo::getVersion() << std::endl << std::endl; // client version moved to body of email for abuse reports
std::string object_name = childGetText("object_name");
if (!object_name.empty() && !mOwnerName.empty())
@@ -628,10 +619,8 @@ LLSD LLFloaterReporter::gatherReport()
std::string version_string;
version_string = llformat(
- "%d.%d.%d %s %s %s %s",
- LL_VERSION_MAJOR,
- LL_VERSION_MINOR,
- LL_VERSION_PATCH,
+ "%s %s %s %s %s",
+ LLVersionInfo::getShortVersion().c_str(),
platform,
gSysCPU.getFamily().c_str(),
gGLManager.mGLRenderer.c_str(),
@@ -642,11 +631,7 @@ LLSD LLFloaterReporter::gatherReport()
LLUUID screenshot_id = LLUUID::null;
if (childGetValue("screen_check"))
{
-
- if ( mEmailToEstateOwner == FALSE )
- {
- screenshot_id = childGetValue("screenshot");
- }
+ screenshot_id = childGetValue("screenshot");
};
LLSD report = LLSD::emptyMap();
@@ -770,7 +755,7 @@ void LLFloaterReporter::takeScreenshot()
if (COMPLAINT_REPORT == mReportType)
{
mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE;
- mResourceDatap->mPreferredLocation = LLAssetType::EType(-2);
+ mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION);
}
else
{
@@ -789,8 +774,8 @@ 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, TRUE, FALSE, LLViewerTexture::FETCHED_TEXTURE);
- image_in_list->createGLTexture(0, raw);
+ LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE);
+ image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerTexture::OTHER);
// the texture picker then uses that texture
LLTexturePicker* texture = getChild<LLTextureCtrl>("screenshot");
@@ -829,7 +814,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
{
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotifications::instance().add("ErrorUploadingReportScreenshot", args);
+ LLNotificationsUtil::add("ErrorUploadingReportScreenshot", args);
std::string err_msg("There was a problem uploading a report screenshot");
err_msg += " due to the following reason: " + args["REASON"].asString();
@@ -838,7 +823,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
}
EReportType report_type = UNKNOWN_REPORT;
- if (data->mPreferredLocation == -2)
+ if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION)
{
report_type = COMPLAINT_REPORT;
}
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 917f513641..7c6473f975 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -93,11 +93,12 @@ public:
static void showFromMenu(EReportType report_type);
static void showFromObject(const LLUUID& object_id);
+ static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
static void onClickSend (void *userdata);
static void onClickCancel (void *userdata);
static void onClickObjPicker (void *userdata);
- static void onClickSelectAbuser (void *userdata);
+ void onClickSelectAbuser ();
static void closePickTool (void *userdata);
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
@@ -109,6 +110,8 @@ public:
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
private:
+ static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null);
+
void takeScreenshot();
void sendReportViaCaps(std::string url);
void uploadImage();
@@ -120,11 +123,11 @@ private:
void setPosBox(const LLVector3d &pos);
void enableControls(BOOL own_avatar);
void getObjectInfo(const LLUUID& object_id);
- static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name = LLStringUtil::null);
private:
EReportType mReportType;
- BOOL mEmailToEstateOwner;
LLUUID mObjectID;
LLUUID mScreenID;
LLUUID mAbuserID;
diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp
index 3bf1848efb..eeea71cc4c 100644
--- a/indra/newview/llfloaterscriptdebug.cpp
+++ b/indra/newview/llfloaterscriptdebug.cpp
@@ -106,7 +106,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
if (objectp)
{
- objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, TRUE));
+ objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI));
floater_label = llformat("%s(%.2f, %.2f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], objectp->getPositionRegion().mV[VY]);
}
else
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
new file mode 100644
index 0000000000..fdf128945e
--- /dev/null
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -0,0 +1,1288 @@
+/**
+ * @file llfloaterscriptlimits.cpp
+ * @author Gabriel Lee
+ * @brief Implementation of the region info and controls floater and panels.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterscriptlimits.h"
+
+#include "llsdutil.h"
+#include "llsdutil_math.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llfloateravatarpicker.h"
+#include "llfloaterland.h"
+#include "llfloaterreg.h"
+#include "llregionhandle.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llparcel.h"
+#include "lltabcontainer.h"
+#include "lltracker.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+
+///----------------------------------------------------------------------------
+/// LLFloaterScriptLimits
+///----------------------------------------------------------------------------
+
+// debug switches, won't work in release
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+
+// dump responder replies to llinfos for debugging
+//#define DUMP_REPLIES_TO_LLINFOS
+
+#ifdef DUMP_REPLIES_TO_LLINFOS
+#include "llsdserialize.h"
+#include "llwindow.h"
+#endif
+
+// use fake LLSD responses to check the viewer side is working correctly
+// I'm syncing this with the server side efforts so hopfully we can keep
+// the to-ing and fro-ing between the two teams to a minimum
+//#define USE_FAKE_RESPONSES
+
+#ifdef USE_FAKE_RESPONSES
+const S32 FAKE_NUMBER_OF_URLS = 329;
+const S32 FAKE_AVAILABLE_URLS = 731;
+const S32 FAKE_AMOUNT_OF_MEMORY = 66741;
+const S32 FAKE_AVAILABLE_MEMORY = 895577;
+#endif
+
+#endif
+
+const S32 SIZE_OF_ONE_KB = 1024;
+
+LLFloaterScriptLimits::LLFloaterScriptLimits(const LLSD& seed)
+ : LLFloater(seed)
+{
+}
+
+BOOL LLFloaterScriptLimits::postBuild()
+{
+ // a little cheap and cheerful - if there's an about land panel open default to showing parcel info,
+ // otherwise default to showing attachments (avatar appearance)
+ bool selectParcelPanel = false;
+
+ LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(instance)
+ {
+ if(instance->isShown())
+ {
+ selectParcelPanel = true;
+ }
+ }
+
+ mTab = getChild<LLTabContainer>("scriptlimits_panels");
+
+ if(!mTab)
+ {
+ llinfos << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl;
+ return FALSE;
+ }
+
+ // contruct the panels
+ std::string land_url = gAgent.getRegion()->getCapability("LandResources");
+ if (!land_url.empty())
+ {
+ LLPanelScriptLimitsRegionMemory* panel_memory;
+ panel_memory = new LLPanelScriptLimitsRegionMemory;
+ mInfoPanels.push_back(panel_memory);
+ LLUICtrlFactory::getInstance()->buildPanel(panel_memory, "panel_script_limits_region_memory.xml");
+ mTab->addTabPanel(panel_memory);
+ }
+
+ std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources");
+ if (!attachment_url.empty())
+ {
+ LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
+ mInfoPanels.push_back(panel_attachments);
+ LLUICtrlFactory::getInstance()->buildPanel(panel_attachments, "panel_script_limits_my_avatar.xml");
+ mTab->addTabPanel(panel_attachments);
+ }
+
+ if(mInfoPanels.size() > 0)
+ {
+ mTab->selectTab(0);
+ }
+
+ if(!selectParcelPanel && (mInfoPanels.size() > 1))
+ {
+ mTab->selectTab(1);
+ }
+
+ return TRUE;
+}
+
+LLFloaterScriptLimits::~LLFloaterScriptLimits()
+{
+}
+
+// public
+void LLFloaterScriptLimits::refresh()
+{
+ for(info_panels_t::iterator iter = mInfoPanels.begin();
+ iter != mInfoPanels.end(); ++iter)
+ {
+ (*iter)->refresh();
+ }
+}
+
+///----------------------------------------------------------------------------
+// Base class for panels
+///----------------------------------------------------------------------------
+
+LLPanelScriptLimitsInfo::LLPanelScriptLimitsInfo()
+ : LLPanel()
+{
+}
+
+
+// virtual
+BOOL LLPanelScriptLimitsInfo::postBuild()
+{
+ refresh();
+ return TRUE;
+}
+
+// virtual
+void LLPanelScriptLimitsInfo::updateChild(LLUICtrl* child_ctr)
+{
+}
+
+///----------------------------------------------------------------------------
+// Responders
+///----------------------------------------------------------------------------
+
+void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content)
+{
+ //we don't need to test with a fake respose here (shouldn't anyway)
+
+#ifdef DUMP_REPLIES_TO_LLINFOS
+
+ LLSDNotationStreamer notation_streamer(content);
+ std::ostringstream nice_llsd;
+ nice_llsd << notation_streamer;
+
+ OSMessageBox(nice_llsd.str(), "main cap response:", 0);
+
+ llinfos << "main cap response:" << content << llendl;
+
+#endif
+
+ // at this point we have an llsd which should contain ether one or two urls to the services we want.
+ // first we look for the details service:
+ if(content.has("ScriptResourceDetails"))
+ {
+ LLHTTPClient::get(content["ScriptResourceDetails"], new fetchScriptLimitsRegionDetailsResponder(mInfo));
+ }
+ else
+ {
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(!instance)
+ {
+ llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ }
+ }
+
+ // then the summary service:
+ if(content.has("ScriptResourceSummary"))
+ {
+ LLHTTPClient::get(content["ScriptResourceSummary"], new fetchScriptLimitsRegionSummaryResponder(mInfo));
+ }
+}
+
+void fetchScriptLimitsRegionInfoResponder::error(U32 status, const std::string& reason)
+{
+ llinfos << "Error from responder " << reason << llendl;
+}
+
+void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref)
+{
+#ifdef USE_FAKE_RESPONSES
+
+ LLSD fake_content;
+ LLSD summary = LLSD::emptyMap();
+ LLSD available = LLSD::emptyArray();
+ LLSD available_urls = LLSD::emptyMap();
+ LLSD available_memory = LLSD::emptyMap();
+ LLSD used = LLSD::emptyArray();
+ LLSD used_urls = LLSD::emptyMap();
+ LLSD used_memory = LLSD::emptyMap();
+
+ used_urls["type"] = "urls";
+ used_urls["amount"] = FAKE_NUMBER_OF_URLS;
+ available_urls["type"] = "urls";
+ available_urls["amount"] = FAKE_AVAILABLE_URLS;
+ used_memory["type"] = "memory";
+ used_memory["amount"] = FAKE_AMOUNT_OF_MEMORY;
+ available_memory["type"] = "memory";
+ available_memory["amount"] = FAKE_AVAILABLE_MEMORY;
+
+//summary response:{'summary':{'available':[{'amount':i731,'type':'urls'},{'amount':i895577,'type':'memory'},{'amount':i731,'type':'urls'},{'amount':i895577,'type':'memory'}],'used':[{'amount':i329,'type':'urls'},{'amount':i66741,'type':'memory'}]}}
+
+ used.append(used_urls);
+ used.append(used_memory);
+ available.append(available_urls);
+ available.append(available_memory);
+
+ summary["available"] = available;
+ summary["used"] = used;
+
+ fake_content["summary"] = summary;
+
+ const LLSD& content = fake_content;
+
+#else
+
+ const LLSD& content = content_ref;
+
+#endif
+
+
+#ifdef DUMP_REPLIES_TO_LLINFOS
+
+ LLSDNotationStreamer notation_streamer(content);
+ std::ostringstream nice_llsd;
+ nice_llsd << notation_streamer;
+
+ OSMessageBox(nice_llsd.str(), "summary response:", 0);
+
+ llinfos << "summary response:" << *content << llendl;
+
+#endif
+
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(!instance)
+ {
+ llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ }
+ else
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ panel_memory->setRegionSummary(content);
+ }
+}
+
+void fetchScriptLimitsRegionSummaryResponder::error(U32 status, const std::string& reason)
+{
+ llinfos << "Error from responder " << reason << llendl;
+}
+
+void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content_ref)
+{
+#ifdef USE_FAKE_RESPONSES
+/*
+Updated detail service, ** denotes field added:
+
+result (map)
++-parcels (array of maps)
+ +-id (uuid)
+ +-local_id (S32)**
+ +-name (string)
+ +-owner_id (uuid) (in ERS as owner, but owner_id in code)
+ +-objects (array of maps)
+ +-id (uuid)
+ +-name (string)
+ +-owner_id (uuid) (in ERS as owner, in code as owner_id)
+ +-owner_name (sting)**
+ +-location (map)**
+ +-x (float)
+ +-y (float)
+ +-z (float)
+ +-resources (map) (this is wrong in the ERS but right in code)
+ +-type (string)
+ +-amount (int)
+*/
+ LLSD fake_content;
+ LLSD resource = LLSD::emptyMap();
+ LLSD location = LLSD::emptyMap();
+ LLSD object = LLSD::emptyMap();
+ LLSD objects = LLSD::emptyArray();
+ LLSD parcel = LLSD::emptyMap();
+ LLSD parcels = LLSD::emptyArray();
+
+ resource["urls"] = FAKE_NUMBER_OF_URLS;
+ resource["memory"] = FAKE_AMOUNT_OF_MEMORY;
+
+ location["x"] = 128.0f;
+ location["y"] = 128.0f;
+ location["z"] = 0.0f;
+
+ object["id"] = LLUUID("d574a375-0c6c-fe3d-5733-da669465afc7");
+ object["name"] = "Gabs fake Object!";
+ object["owner_id"] = LLUUID("8dbf2d41-69a0-4e5e-9787-0c9d297bc570");
+ object["owner_name"] = "Gabs Linden";
+ object["location"] = location;
+ object["resources"] = resource;
+
+ objects.append(object);
+
+ parcel["id"] = LLUUID("da05fb28-0d20-e593-2728-bddb42dd0160");
+ parcel["local_id"] = 42;
+ parcel["name"] = "Gabriel Linden\'s Sub Plot";
+ parcel["objects"] = objects;
+ parcels.append(parcel);
+
+ fake_content["parcels"] = parcels;
+ const LLSD& content = fake_content;
+
+#else
+
+ const LLSD& content = content_ref;
+
+#endif
+
+#ifdef DUMP_REPLIES_TO_LLINFOS
+
+ LLSDNotationStreamer notation_streamer(content);
+ std::ostringstream nice_llsd;
+ nice_llsd << notation_streamer;
+
+ OSMessageBox(nice_llsd.str(), "details response:", 0);
+
+ llinfos << "details response:" << content << llendl;
+
+#endif
+
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+
+ if(!instance)
+ {
+ llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ }
+ else
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ if(tab)
+ {
+ LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ if(panel_memory)
+ {
+ panel_memory->setRegionDetails(content);
+ }
+ else
+ {
+ llinfos << "Failed to get scriptlimits memory panel" << llendl;
+ }
+ }
+ else
+ {
+ llinfos << "Failed to get scriptlimits_panels" << llendl;
+ }
+ }
+}
+
+void fetchScriptLimitsRegionDetailsResponder::error(U32 status, const std::string& reason)
+{
+ llinfos << "Error from responder " << reason << llendl;
+}
+
+void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref)
+{
+
+#ifdef USE_FAKE_RESPONSES
+
+ // just add the summary, as that's all I'm testing currently!
+ LLSD fake_content = LLSD::emptyMap();
+ LLSD summary = LLSD::emptyMap();
+ LLSD available = LLSD::emptyArray();
+ LLSD available_urls = LLSD::emptyMap();
+ LLSD available_memory = LLSD::emptyMap();
+ LLSD used = LLSD::emptyArray();
+ LLSD used_urls = LLSD::emptyMap();
+ LLSD used_memory = LLSD::emptyMap();
+
+ used_urls["type"] = "urls";
+ used_urls["amount"] = FAKE_NUMBER_OF_URLS;
+ available_urls["type"] = "urls";
+ available_urls["amount"] = FAKE_AVAILABLE_URLS;
+ used_memory["type"] = "memory";
+ used_memory["amount"] = FAKE_AMOUNT_OF_MEMORY;
+ available_memory["type"] = "memory";
+ available_memory["amount"] = FAKE_AVAILABLE_MEMORY;
+
+ used.append(used_urls);
+ used.append(used_memory);
+ available.append(available_urls);
+ available.append(available_memory);
+
+ summary["available"] = available;
+ summary["used"] = used;
+
+ fake_content["summary"] = summary;
+ fake_content["attachments"] = content_ref["attachments"];
+
+ const LLSD& content = fake_content;
+
+#else
+
+ const LLSD& content = content_ref;
+
+#endif
+
+#ifdef DUMP_REPLIES_TO_LLINFOS
+
+ LLSDNotationStreamer notation_streamer(content);
+ std::ostringstream nice_llsd;
+ nice_llsd << notation_streamer;
+
+ OSMessageBox(nice_llsd.str(), "attachment response:", 0);
+
+ llinfos << "attachment response:" << content << llendl;
+
+#endif
+
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+
+ if(!instance)
+ {
+ llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ }
+ else
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ if(tab)
+ {
+ LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
+ if(panel)
+ {
+ panel->setAttachmentDetails(content);
+ }
+ else
+ {
+ llinfos << "Failed to get script_limits_my_avatar_panel" << llendl;
+ }
+ }
+ else
+ {
+ llinfos << "Failed to get scriptlimits_panels" << llendl;
+ }
+ }
+}
+
+void fetchScriptLimitsAttachmentInfoResponder::error(U32 status, const std::string& reason)
+{
+ llinfos << "Error from responder " << reason << llendl;
+}
+
+///----------------------------------------------------------------------------
+// Memory Panel
+///----------------------------------------------------------------------------
+
+BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()
+{
+ LLSD body;
+ std::string url = gAgent.getRegion()->getCapability("LandResources");
+ if (!url.empty())
+ {
+ body["parcel_id"] = mParcelId;
+
+ LLSD info;
+ info["parcel_id"] = mParcelId;
+ LLHTTPClient::post(url, body, new fetchScriptLimitsRegionInfoResponder(info));
+
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::processParcelInfo(const LLParcelData& parcel_data)
+{
+ mParcelId = parcel_data.parcel_id;
+
+ if(!getLandScriptResources())
+ {
+ std::string msg_error = LLTrans::getString("ScriptLimitsRequestError");
+ childSetValue("loading_text", LLSD(msg_error));
+ }
+ else
+ {
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+ childSetValue("loading_text", LLSD(msg_waiting));
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id)
+{
+ if (!parcel_id.isNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id);
+ }
+ else
+ {
+ std::string msg_error = LLTrans::getString("ScriptLimitsRequestError");
+ childSetValue("loading_text", LLSD(msg_error));
+ }
+}
+
+// virtual
+void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::string& reason)
+{
+ llerrs << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
+}
+
+// callback from the name cache with an owner name to add to the list
+void LLPanelScriptLimitsRegionMemory::onNameCache(
+ const LLUUID& id,
+ const std::string& first_name,
+ const std::string& last_name)
+{
+ std::string name = first_name + " " + last_name;
+
+ LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
+ if(!list)
+ {
+ return;
+ }
+
+ std::vector<LLSD>::iterator id_itor;
+ for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
+ {
+ LLSD element = *id_itor;
+ if(element["owner_id"].asUUID() == id)
+ {
+ LLScrollListItem* item = list->getItem(element["id"].asUUID());
+
+ if(item)
+ {
+ item->getColumn(3)->setValue(LLSD(name));
+ element["columns"][3]["value"] = name;
+ }
+ }
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
+{
+ LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
+
+ if(!list)
+ {
+ llinfos << "Error getting the scripts_list control" << llendl;
+ return;
+ }
+
+ S32 number_parcels = content["parcels"].size();
+
+ LLStringUtil::format_map_t args_parcels;
+ args_parcels["[PARCELS]"] = llformat ("%d", number_parcels);
+ std::string msg_parcels = LLTrans::getString("ScriptLimitsParcelsOwned", args_parcels);
+ childSetValue("parcels_listed", LLSD(msg_parcels));
+
+ std::vector<LLUUID> names_requested;
+
+ // This makes the assumption that all objects will have the same set
+ // of attributes, ie they will all have, or none will have locations
+ // This is a pretty safe assumption as it's reliant on server version.
+ bool has_locations = false;
+ bool has_local_ids = false;
+
+ for(S32 i = 0; i < number_parcels; i++)
+ {
+ std::string parcel_name = content["parcels"][i]["name"].asString();
+ LLUUID parcel_id = content["parcels"][i]["id"].asUUID();
+ S32 number_objects = content["parcels"][i]["objects"].size();
+
+ S32 local_id = 0;
+ if(content["parcels"][i].has("local_id"))
+ {
+ // if any locations are found flag that we can use them and turn on the highlight button
+ has_local_ids = true;
+ local_id = content["parcels"][i]["local_id"].asInteger();
+ }
+
+ for(S32 j = 0; j < number_objects; j++)
+ {
+ S32 size = content["parcels"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
+
+ S32 urls = content["parcels"][i]["objects"][j]["resources"]["urls"].asInteger();
+
+ std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString();
+ LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID();
+ LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID();
+
+ F32 location_x = 0.0f;
+ F32 location_y = 0.0f;
+ F32 location_z = 0.0f;
+
+ if(content["parcels"][i]["objects"][j].has("location"))
+ {
+ // if any locations are found flag that we can use them and turn on the highlight button
+ LLVector3 vec = ll_vector3_from_sd(content["parcels"][i]["objects"][j]["location"]);
+ has_locations = true;
+ location_x = vec.mV[0];
+ location_y = vec.mV[1];
+ location_z = vec.mV[2];
+ }
+
+ std::string owner_buf;
+
+ // in the future the server will give us owner names, so see if we're there yet:
+ if(content["parcels"][i]["objects"][j].has("owner_name"))
+ {
+ owner_buf = content["parcels"][i]["objects"][j]["owner_name"].asString();
+ }
+ // ...and if not use the slightly more painful method of disovery:
+ else
+ {
+ BOOL name_is_cached = gCacheName->getFullName(owner_id, owner_buf);
+ if(!name_is_cached)
+ {
+ if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end())
+ {
+ names_requested.push_back(owner_id);
+ gCacheName->get(owner_id, TRUE,
+ boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache,
+ this, _1, _2, _3));
+ }
+ }
+ }
+
+ LLSD element;
+
+ element["id"] = task_id;
+ element["columns"][0]["column"] = "size";
+ element["columns"][0]["value"] = llformat("%d", size);
+ element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][1]["column"] = "urls";
+ element["columns"][1]["value"] = llformat("%d", urls);
+ element["columns"][1]["font"] = "SANSSERIF";
+ element["columns"][2]["column"] = "name";
+ element["columns"][2]["value"] = name_buf;
+ element["columns"][2]["font"] = "SANSSERIF";
+ element["columns"][3]["column"] = "owner";
+ element["columns"][3]["value"] = owner_buf;
+ element["columns"][3]["font"] = "SANSSERIF";
+ element["columns"][4]["column"] = "parcel";
+ element["columns"][4]["value"] = parcel_name;
+ element["columns"][4]["font"] = "SANSSERIF";
+ element["columns"][5]["column"] = "location";
+ if(has_locations)
+ {
+ element["columns"][5]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
+ }
+ else
+ {
+ element["columns"][5]["value"] = "";
+ }
+ element["columns"][5]["font"] = "SANSSERIF";
+
+ list->addElement(element, ADD_SORTED);
+
+ element["owner_id"] = owner_id;
+ element["local_id"] = local_id;
+ mObjectListItems.push_back(element);
+ }
+ }
+
+ if (has_locations)
+ {
+ LLButton* btn = getChild<LLButton>("highlight_btn");
+ if(btn)
+ {
+ btn->setVisible(true);
+ }
+ }
+
+ if (has_local_ids)
+ {
+ LLButton* btn = getChild<LLButton>("return_btn");
+ if(btn)
+ {
+ btn->setVisible(true);
+ }
+ }
+
+ // save the structure to make object return easier
+ mContent = content;
+
+ childSetValue("loading_text", LLSD(std::string("")));
+}
+
+void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
+{
+ if(content["summary"]["used"][0]["type"].asString() == std::string("memory"))
+ {
+ mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mGotParcelMemoryUsed = true;
+ }
+ else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
+ {
+ mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mGotParcelMemoryUsed = true;
+ }
+ else
+ {
+ llinfos << "summary doesn't contain memory info" << llendl;
+ return;
+ }
+
+ if(content["summary"]["used"][0]["type"].asString() == std::string("urls"))
+ {
+ mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
+ mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger();
+ mGotParcelURLsUsed = true;
+ }
+ else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
+ {
+ mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
+ mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger();
+ mGotParcelURLsUsed = true;
+ }
+ else
+ {
+ llinfos << "summary doesn't contain urls info" << llendl;
+ return;
+ }
+
+ 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);
+ childSetValue("memory_used", LLSD(msg_parcel_memory));
+ }
+
+ if((mParcelURLsUsed >= 0) && (mParcelURLsMax >= 0))
+ {
+ S32 parcel_urls_available = mParcelURLsMax - mParcelURLsUsed;
+
+ LLStringUtil::format_map_t args_parcel_urls;
+ args_parcel_urls["[COUNT]"] = llformat ("%d", mParcelURLsUsed);
+ args_parcel_urls["[MAX]"] = llformat ("%d", mParcelURLsMax);
+ args_parcel_urls["[AVAILABLE]"] = llformat ("%d", parcel_urls_available);
+ std::string msg_parcel_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_parcel_urls);
+ childSetValue("urls_used", LLSD(msg_parcel_urls));
+ }
+}
+
+BOOL LLPanelScriptLimitsRegionMemory::postBuild()
+{
+ childSetAction("refresh_list_btn", onClickRefresh, this);
+ childSetAction("highlight_btn", onClickHighlight, this);
+ childSetAction("return_btn", onClickReturn, this);
+
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+ childSetValue("loading_text", LLSD(msg_waiting));
+
+ LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
+ if(!list)
+ {
+ return FALSE;
+ }
+
+ //set all columns to resizable mode even if some columns will be empty
+ for(S32 column = 0; column < list->getNumColumns(); column++)
+ {
+ LLScrollListColumn* columnp = list->getColumn(column);
+ columnp->mHeader->setHasResizableElement(TRUE);
+ }
+
+ return StartRequestChain();
+}
+
+BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain()
+{
+ LLUUID region_id;
+
+ LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(!instance)
+ {
+ childSetValue("loading_text", LLSD(std::string("")));
+ //might have to do parent post build here
+ //if not logic below could use early outs
+ return FALSE;
+ }
+ LLParcel* parcel = instance->getCurrentSelectedParcel();
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+
+ LLUUID current_region_id = gAgent.getRegion()->getRegionID();
+
+ if ((region) && (parcel))
+ {
+ LLVector3 parcel_center = parcel->getCenterpoint();
+
+ region_id = region->getRegionID();
+
+ if(region_id != current_region_id)
+ {
+ std::string msg_wrong_region = LLTrans::getString("ScriptLimitsRequestWrongRegion");
+ childSetValue("loading_text", LLSD(msg_wrong_region));
+ return FALSE;
+ }
+
+ LLVector3d pos_global = region->getCenterGlobal();
+
+ LLSD body;
+ std::string url = region->getCapability("RemoteParcelRequest");
+ if (!url.empty())
+ {
+ body["location"] = ll_sd_from_vector3(parcel_center);
+ if (!region_id.isNull())
+ {
+ body["region_id"] = region_id;
+ }
+ if (!pos_global.isExactlyZero())
+ {
+ U64 region_handle = to_region_handle(pos_global);
+ body["region_handle"] = ll_sd_from_U64(region_handle);
+ }
+ LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
+ }
+ else
+ {
+ llwarns << "Can't get parcel info for script information request" << region_id
+ << ". Region: " << region->getName()
+ << " does not support RemoteParcelRequest" << llendl;
+
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError");
+ childSetValue("loading_text", LLSD(msg_waiting));
+ }
+ }
+ else
+ {
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestNoParcelSelected");
+ childSetValue("loading_text", LLSD(msg_waiting));
+ }
+
+ return LLPanelScriptLimitsInfo::postBuild();
+}
+
+void LLPanelScriptLimitsRegionMemory::clearList()
+{
+ LLCtrlListInterface *list = childGetListInterface("scripts_list");
+
+ if (list)
+ {
+ list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ mGotParcelMemoryUsed = false;
+ mGotParcelMemoryMax = false;
+ mGotParcelURLsUsed = false;
+ mGotParcelURLsMax = false;
+
+ LLStringUtil::format_map_t args_parcel_memory;
+ std::string msg_empty_string("");
+ childSetValue("memory_used", LLSD(msg_empty_string));
+ childSetValue("urls_used", LLSD(msg_empty_string));
+ childSetValue("parcels_listed", LLSD(msg_empty_string));
+
+ mObjectListItems.clear();
+}
+
+// static
+void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata)
+{
+ llinfos << "LLPanelRegionGeneralInfo::onClickRefresh" << llendl;
+
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(instance)
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ if(tab)
+ {
+ LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ if(panel_memory)
+ {
+ panel_memory->clearList();
+
+ panel_memory->StartRequestChain();
+ }
+ }
+ return;
+ }
+ else
+ {
+ llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << llendl;
+ return;
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::showBeacon()
+{
+ LLScrollListCtrl* list = getChild<LLScrollListCtrl>("scripts_list");
+ if (!list) return;
+
+ LLScrollListItem* first_selected = list->getFirstSelected();
+ if (!first_selected) return;
+
+ std::string name = first_selected->getColumn(2)->getValue().asString();
+ std::string pos_string = first_selected->getColumn(5)->getValue().asString();
+
+ F32 x, y, z;
+ S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
+ if (matched != 3) return;
+
+ LLVector3 pos_agent(x, y, z);
+ LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
+
+ std::string tooltip("");
+ LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);
+}
+
+// static
+void LLPanelScriptLimitsRegionMemory::onClickHighlight(void* userdata)
+{
+ llinfos << "LLPanelRegionGeneralInfo::onClickHighlight" << llendl;
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(instance)
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ if(tab)
+ {
+ LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ if(panel)
+ {
+ panel->showBeacon();
+ }
+ }
+ return;
+ }
+ else
+ {
+ llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl;
+ return;
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::returnObjectsFromParcel(S32 local_id)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ LLCtrlListInterface *list = childGetListInterface("scripts_list");
+ if (!list || list->getItemCount() == 0) return;
+
+ std::vector<LLSD>::iterator id_itor;
+
+ bool start_message = true;
+
+ for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
+ {
+ LLSD element = *id_itor;
+ if (!list->isSelected(element["id"].asUUID()))
+ {
+ // Selected only
+ continue;
+ }
+
+ if(element["local_id"].asInteger() != local_id)
+ {
+ // Not the parcel we are looking for
+ continue;
+ }
+
+ if (start_message)
+ {
+ msg->newMessageFast(_PREHASH_ParcelReturnObjects);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, element["local_id"].asInteger());
+ msg->addU32Fast(_PREHASH_ReturnType, RT_LIST);
+ start_message = false;
+ }
+
+ msg->nextBlockFast(_PREHASH_TaskIDs);
+ msg->addUUIDFast(_PREHASH_TaskID, element["id"].asUUID());
+
+ if (msg->isSendFullFast(_PREHASH_TaskIDs))
+ {
+ msg->sendReliable(region->getHost());
+ start_message = true;
+ }
+ }
+
+ if (!start_message)
+ {
+ msg->sendReliable(region->getHost());
+ }
+}
+
+void LLPanelScriptLimitsRegionMemory::returnObjects()
+{
+ if(!mContent.has("parcels"))
+ {
+ return;
+ }
+
+ S32 number_parcels = mContent["parcels"].size();
+
+ // a message per parcel containing all objects to be returned from that parcel
+ for(S32 i = 0; i < number_parcels; i++)
+ {
+ S32 local_id = 0;
+ if(mContent["parcels"][i].has("local_id"))
+ {
+ local_id = mContent["parcels"][i]["local_id"].asInteger();
+ returnObjectsFromParcel(local_id);
+ }
+ }
+
+ onClickRefresh(NULL);
+}
+
+
+// static
+void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
+{
+ llinfos << "LLPanelRegionGeneralInfo::onClickReturn" << llendl;
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(instance)
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ if(tab)
+ {
+ LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ if(panel)
+ {
+ panel->returnObjects();
+ }
+ }
+ return;
+ }
+ else
+ {
+ llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl;
+ return;
+ }
+}
+
+///----------------------------------------------------------------------------
+// Attachment Panel
+///----------------------------------------------------------------------------
+
+BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()
+{
+ LLSD body;
+ std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
+ if (!url.empty())
+ {
+ LLHTTPClient::get(url, body, new fetchScriptLimitsAttachmentInfoResponder());
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content)
+{
+ LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
+
+ if(!list)
+ {
+ return;
+ }
+
+ S32 number_attachments = content["attachments"].size();
+
+ for(int i = 0; i < number_attachments; i++)
+ {
+ std::string humanReadableLocation = "";
+ if(content["attachments"][i].has("location"))
+ {
+ std::string actualLocation = content["attachments"][i]["location"];
+ humanReadableLocation = LLTrans::getString(actualLocation.c_str());
+ }
+
+ S32 number_objects = content["attachments"][i]["objects"].size();
+ for(int j = 0; j < number_objects; j++)
+ {
+ LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID();
+ S32 size = 0;
+ if(content["attachments"][i]["objects"][j]["resources"].has("memory"))
+ {
+ size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
+ }
+ S32 urls = 0;
+ if(content["attachments"][i]["objects"][j]["resources"].has("urls"))
+ {
+ urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger();
+ }
+ std::string name = content["attachments"][i]["objects"][j]["name"].asString();
+
+ LLSD element;
+
+ element["id"] = task_id;
+ element["columns"][0]["column"] = "size";
+ element["columns"][0]["value"] = llformat("%d", size);
+ element["columns"][0]["font"] = "SANSSERIF";
+
+ element["columns"][1]["column"] = "urls";
+ element["columns"][1]["value"] = llformat("%d", urls);
+ element["columns"][1]["font"] = "SANSSERIF";
+
+ element["columns"][2]["column"] = "name";
+ element["columns"][2]["value"] = name;
+ element["columns"][2]["font"] = "SANSSERIF";
+
+ element["columns"][3]["column"] = "location";
+ element["columns"][3]["value"] = humanReadableLocation;
+ element["columns"][3]["font"] = "SANSSERIF";
+
+ list->addElement(element);
+ }
+ }
+
+ setAttachmentSummary(content);
+
+ childSetValue("loading_text", LLSD(std::string("")));
+}
+
+BOOL LLPanelScriptLimitsAttachment::postBuild()
+{
+ childSetAction("refresh_list_btn", onClickRefresh, this);
+
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+ childSetValue("loading_text", LLSD(msg_waiting));
+ return requestAttachmentDetails();
+}
+
+void LLPanelScriptLimitsAttachment::clearList()
+{
+ LLCtrlListInterface *list = childGetListInterface("scripts_list");
+
+ if (list)
+ {
+ list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting");
+ childSetValue("loading_text", LLSD(msg_waiting));
+}
+
+void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
+{
+ if(content["summary"]["used"][0]["type"].asString() == std::string("memory"))
+ {
+ mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mGotAttachmentMemoryUsed = true;
+ }
+ else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
+ {
+ mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
+ mGotAttachmentMemoryUsed = true;
+ }
+ else
+ {
+ llinfos << "attachment details don't contain memory summary info" << llendl;
+ return;
+ }
+
+ if(content["summary"]["used"][0]["type"].asString() == std::string("urls"))
+ {
+ mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
+ mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger();
+ mGotAttachmentURLsUsed = true;
+ }
+ else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
+ {
+ mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
+ mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger();
+ mGotAttachmentURLsUsed = true;
+ }
+ else
+ {
+ llinfos << "attachment details don't contain urls summary info" << llendl;
+ return;
+ }
+
+ 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);
+ childSetValue("memory_used", LLSD(msg_attachment_memory));
+ }
+
+ if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0))
+ {
+ S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed;
+
+ LLStringUtil::format_map_t args_attachment_urls;
+ args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed);
+ args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax);
+ args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available);
+ std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls);
+ childSetValue("urls_used", LLSD(msg_attachment_urls));
+ }
+}
+
+// static
+void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata)
+{
+ llinfos << "Refresh clicked" << llendl;
+
+ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+ if(instance)
+ {
+ LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+ LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
+ panel_attachments->clearList();
+ panel_attachments->requestAttachmentDetails();
+ return;
+ }
+ else
+ {
+ llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << llendl;
+ return;
+ }
+}
+
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
new file mode 100644
index 0000000000..0cba4d72f2
--- /dev/null
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -0,0 +1,269 @@
+/**
+ * @file llfloaterscriptlimits.h
+ * @author Gabriel Lee
+ * @brief Declaration of the region info and controls floater and panels.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERSCRIPTLIMITS_H
+#define LL_LLFLOATERSCRIPTLIMITS_H
+
+#include <vector>
+#include "llfloater.h"
+#include "llhost.h"
+#include "llpanel.h"
+#include "llremoteparcelrequest.h"
+
+class LLPanelScriptLimitsInfo;
+class LLTabContainer;
+
+class LLPanelScriptLimitsRegionMemory;
+
+class LLFloaterScriptLimits : public LLFloater
+{
+ friend class LLFloaterReg;
+public:
+
+ /*virtual*/ BOOL postBuild();
+
+ // from LLPanel
+ virtual void refresh();
+
+private:
+
+ LLFloaterScriptLimits(const LLSD& seed);
+ ~LLFloaterScriptLimits();
+
+protected:
+
+ LLTabContainer* mTab;
+ typedef std::vector<LLPanelScriptLimitsInfo*> info_panels_t;
+ info_panels_t mInfoPanels;
+};
+
+
+// Base class for all script limits information panels.
+class LLPanelScriptLimitsInfo : public LLPanel
+{
+public:
+ LLPanelScriptLimitsInfo();
+
+ virtual BOOL postBuild();
+ virtual void updateChild(LLUICtrl* child_ctrl);
+
+protected:
+ void initCtrl(const std::string& name);
+
+ typedef std::vector<std::string> strings_t;
+
+ LLHost mHost;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Responders
+/////////////////////////////////////////////////////////////////////////////
+
+class fetchScriptLimitsRegionInfoResponder: public LLHTTPClient::Responder
+{
+ public:
+ fetchScriptLimitsRegionInfoResponder(const LLSD& info) : mInfo(info) {};
+
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+ public:
+ protected:
+ LLSD mInfo;
+};
+
+class fetchScriptLimitsRegionSummaryResponder: public LLHTTPClient::Responder
+{
+ public:
+ fetchScriptLimitsRegionSummaryResponder(const LLSD& info) : mInfo(info) {};
+
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+ public:
+ protected:
+ LLSD mInfo;
+};
+
+class fetchScriptLimitsRegionDetailsResponder: public LLHTTPClient::Responder
+{
+ public:
+ fetchScriptLimitsRegionDetailsResponder(const LLSD& info) : mInfo(info) {};
+
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+ public:
+ protected:
+ LLSD mInfo;
+};
+
+class fetchScriptLimitsAttachmentInfoResponder: public LLHTTPClient::Responder
+{
+ public:
+ fetchScriptLimitsAttachmentInfoResponder() {};
+
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+ public:
+ protected:
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Memory panel
+/////////////////////////////////////////////////////////////////////////////
+
+class LLPanelScriptLimitsRegionMemory : public LLPanelScriptLimitsInfo, LLRemoteParcelInfoObserver
+{
+
+public:
+ LLPanelScriptLimitsRegionMemory()
+ : LLPanelScriptLimitsInfo(), LLRemoteParcelInfoObserver(),
+
+ mParcelId(LLUUID()),
+ mGotParcelMemoryUsed(false),
+ mGotParcelMemoryMax(false),
+ mParcelMemoryMax(0),
+ mParcelMemoryUsed(0) {};
+
+ ~LLPanelScriptLimitsRegionMemory()
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+ };
+
+ // LLPanel
+ virtual BOOL postBuild();
+
+ void setRegionDetails(LLSD content);
+ void setRegionSummary(LLSD content);
+
+ BOOL StartRequestChain();
+
+ BOOL getLandScriptResources();
+ void clearList();
+ void showBeacon();
+ void returnObjectsFromParcel(S32 local_id);
+ void returnObjects();
+
+private:
+
+ void onNameCache(const LLUUID& id,
+ const std::string& first_name,
+ const std::string& last_name);
+
+ LLSD mContent;
+ LLUUID mParcelId;
+ bool mGotParcelMemoryUsed;
+ bool mGotParcelMemoryUsedDetails;
+ bool mGotParcelMemoryMax;
+ S32 mParcelMemoryMax;
+ S32 mParcelMemoryUsed;
+ S32 mParcelMemoryUsedDetails;
+
+ bool mGotParcelURLsUsed;
+ bool mGotParcelURLsUsedDetails;
+ bool mGotParcelURLsMax;
+ S32 mParcelURLsMax;
+ S32 mParcelURLsUsed;
+ S32 mParcelURLsUsedDetails;
+
+ std::vector<LLSD> mObjectListItems;
+
+protected:
+
+// LLRemoteParcelInfoObserver interface:
+/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+/*virtual*/ void setParcelID(const LLUUID& parcel_id);
+/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
+
+ static void onClickRefresh(void* userdata);
+ static void onClickHighlight(void* userdata);
+ static void onClickReturn(void* userdata);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Attachment panel
+/////////////////////////////////////////////////////////////////////////////
+
+class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo
+{
+
+public:
+ LLPanelScriptLimitsAttachment()
+ : LLPanelScriptLimitsInfo(),
+ mGotAttachmentMemoryUsed(false),
+ mGotAttachmentMemoryUsedDetails(false),
+ mGotAttachmentMemoryMax(false),
+ mAttachmentMemoryMax(0),
+ mAttachmentMemoryUsed(0),
+ mAttachmentMemoryUsedDetails(0),
+ mGotAttachmentURLsUsed(false),
+ mGotAttachmentURLsUsedDetails(false),
+ mGotAttachmentURLsMax(false),
+ mAttachmentURLsMax(0),
+ mAttachmentURLsUsed(0),
+ mAttachmentURLsUsedDetails(0)
+ {};
+
+ ~LLPanelScriptLimitsAttachment()
+ {
+ };
+
+ // LLPanel
+ virtual BOOL postBuild();
+
+ void setAttachmentDetails(LLSD content);
+
+ void setAttachmentSummary(LLSD content);
+ BOOL requestAttachmentDetails();
+ void clearList();
+
+private:
+
+ bool mGotAttachmentMemoryUsed;
+ bool mGotAttachmentMemoryUsedDetails;
+ bool mGotAttachmentMemoryMax;
+ S32 mAttachmentMemoryMax;
+ S32 mAttachmentMemoryUsed;
+ S32 mAttachmentMemoryUsedDetails;
+
+ bool mGotAttachmentURLsUsed;
+ bool mGotAttachmentURLsUsedDetails;
+ bool mGotAttachmentURLsMax;
+ S32 mAttachmentURLsMax;
+ S32 mAttachmentURLsUsed;
+ S32 mAttachmentURLsUsedDetails;
+
+protected:
+
+ static void onClickRefresh(void* userdata);
+};
+
+#endif
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 4c83530f43..76caa0cf91 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -32,13 +32,59 @@
*/
#include "llviewerprecompiledheaders.h"
+
+#include "llcommandhandler.h"
+#include "llfloaterreg.h"
#include "llfloatersearch.h"
#include "llmediactrl.h"
+#include "lllogininstance.h"
+#include "lluri.h"
+#include "llagent.h"
+#include "llui.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+
+// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
+class LLSearchHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
+ bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ const size_t parts = tokens.size();
+ // get the (optional) category for the search
+ std::string category;
+ if (parts > 0)
+ {
+ category = tokens[0].asString();
+ }
+
+ // get the (optional) search string
+ std::string search_text;
+ if (parts > 1)
+ {
+ search_text = tokens[1].asString();
+ }
+
+ // create the LLSD arguments for the search floater
+ LLSD args;
+ args["category"] = category;
+ args["id"] = LLURI::unescape(search_text);
+
+ // open the search floater and perform the requested search
+ LLFloaterReg::showInstance("search", args);
+ return true;
+ }
+};
+LLSearchHandler gSearchHandler;
LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
LLFloater(key),
- mBrowser(NULL)
+ LLViewerMediaObserver(),
+ mBrowser(NULL),
+ mSearchGodLevel(0)
{
// declare a map that transforms a category name into
// the URL suffix that is used to search that category
@@ -60,7 +106,6 @@ BOOL LLFloaterSearch::postBuild()
{
mBrowser->addObserver(this);
mBrowser->setTrusted(true);
- mBrowser->setHomePageUrl(getString("search_url"));
}
return TRUE;
@@ -71,6 +116,13 @@ void LLFloaterSearch::onOpen(const LLSD& key)
search(key);
}
+void LLFloaterSearch::onClose(bool app_quitting)
+{
+ // tear down the web view so we don't show the previous search
+ // result when the floater is opened next time
+ destroy();
+}
+
void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
{
switch (event)
@@ -82,12 +134,21 @@ void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent eve
case MEDIA_EVENT_NAVIGATE_COMPLETE:
childSetText("status_text", getString("done_text"));
break;
-
+
default:
break;
}
}
+void LLFloaterSearch::godLevelChanged(U8 godlevel)
+{
+ // search results can change based upon god level - if the user
+ // changes god level, then give them a warning (we don't refresh
+ // the search as this might undo any page navigation or
+ // AJAX-driven changes since the last search).
+ childSetVisible("refresh_search", (godlevel != mSearchGodLevel));
+}
+
void LLFloaterSearch::search(const LLSD &key)
{
if (! mBrowser)
@@ -95,27 +156,58 @@ void LLFloaterSearch::search(const LLSD &key)
return;
}
- // get the URL for the search page
- std::string url = getString("search_url");
- if (! LLStringUtil::endsWith(url, "/"))
- {
- url += "/";
- }
+ // reset the god level warning as we're sending the latest state
+ childHide("refresh_search");
+ mSearchGodLevel = gAgent.getGodLevel();
// work out the subdir to use based on the requested category
+ LLSD subs;
std::string category = key.has("category") ? key["category"].asString() : "";
if (mCategoryPaths.has(category))
{
- url += mCategoryPaths[category].asString();
+ subs["CATEGORY"] = mCategoryPaths[category].asString();
}
else
{
- url += mCategoryPaths["all"].asString();
+ subs["CATEGORY"] = mCategoryPaths["all"].asString();
}
- // append the search query string
+ // add the search query string
std::string search_text = key.has("id") ? key["id"].asString() : "";
- url += std::string("?q=") + search_text;
+ subs["QUERY"] = LLURI::escape(search_text);
+
+ // add the permissions token that login.cgi gave us
+ // We use "search_token", and fallback to "auth_token" if not present.
+ LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
+ if (search_token.asString().empty())
+ {
+ search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
+ }
+ subs["AUTH_TOKEN"] = search_token.asString();
+
+ // add the user's preferred maturity (can be changed via prefs)
+ std::string maturity;
+ if (gAgent.prefersAdult())
+ {
+ maturity = "42"; // PG,Mature,Adult
+ }
+ else if (gAgent.prefersMature())
+ {
+ maturity = "21"; // PG,Mature
+ }
+ else
+ {
+ maturity = "13"; // PG
+ }
+ subs["MATURITY"] = maturity;
+
+ // add the user's god status
+ subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
+
+ // get the search URL and expand all of the substitutions
+ // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+ std::string url = gSavedSettings.getString("SearchURL");
+ url = LLWeb::expandURLSubstitutions(url, subs);
// and load the URL in the web view
mBrowser->navigateTo(url);
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index 743107484f..0a8d9bbe36 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -59,6 +59,8 @@ public:
/// see search() for details on the key parameter.
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+
/// perform a search with the specific search term.
/// The key should be a map that can contain the following keys:
/// - "id": specifies the text phrase to search for
@@ -66,14 +68,20 @@ public:
/// "events", "groups", "wiki", "destinations", "classifieds"
void search(const LLSD &key);
+ /// changing godmode can affect the search results that are
+ /// returned by the search website - use this method to tell the
+ /// search floater that the user has changed god level.
+ void godLevelChanged(U8 godlevel);
+
private:
/*virtual*/ BOOL postBuild();
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);
-
+
LLMediaCtrl *mBrowser;
LLSD mCategoryPaths;
+ U8 mSearchGodLevel;
};
#endif // LL_LLFLOATERSEARCH_H
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 2d8ccd1aef..eae6121e79 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -37,7 +37,8 @@
#include "llfloaterreg.h"
#include "llfloaterland.h"
#include "lllineeditor.h"
-#include "llnotify.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llselectmgr.h"
#include "lltexturectrl.h"
@@ -88,14 +89,14 @@ private:
void setBadge(const char* id, Badge badge);
static void onChangeValue(LLUICtrl *ctrl, void *userdata);
- static void doSelectAgent(void *userdata);
+ void doSelectAgent();
static void doCancel(void *userdata);
static void doSellLand(void *userdata);
bool onConfirmSale(const LLSD& notification, const LLSD& response);
static void doShowObjects(void *userdata);
static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response);
- static void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
public:
virtual BOOL postBuild();
@@ -162,13 +163,14 @@ BOOL LLFloaterSellLandUI::postBuild()
{
childSetCommitCallback("sell_to", onChangeValue, this);
childSetCommitCallback("price", onChangeValue, this);
- childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32);
childSetCommitCallback("sell_objects", onChangeValue, this);
- childSetAction("sell_to_select_agent", doSelectAgent, this);
+ childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this));
childSetAction("cancel_btn", doCancel, this);
childSetAction("sell_btn", doSellLand, this);
childSetAction("show_objects", doShowObjects, this);
center();
+ getChild<LLUICtrl>("profile_scroll")->setTabStop(true);
return TRUE;
}
@@ -267,7 +269,7 @@ void LLFloaterSellLandUI::refreshUI()
std::string price_str = childGetValue("price").asString();
bool valid_price = false;
- valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str));
+ valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str));
if (valid_price && mParcelActualArea > 0)
{
@@ -360,7 +362,7 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)
self->mSellToBuyer = true;
if (self->mAuthorizedBuyer.isNull())
{
- doSelectAgent(self);
+ self->doSelectAgent();
}
}
else if (sell_to == "anyone")
@@ -383,30 +385,26 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)
self->refreshUI();
}
-// static
-void LLFloaterSellLandUI::doSelectAgent(void *userdata)
+void LLFloaterSellLandUI::doSelectAgent()
{
- LLFloaterSellLandUI* floaterp = (LLFloaterSellLandUI*)userdata;
// grandparent is a floater, in order to set up dependency
- floaterp->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarPick, floaterp, FALSE, TRUE));
+ addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE));
}
-// static
-void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
+void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
- LLFloaterSellLandUI* floaterp = (LLFloaterSellLandUI*)data;
- LLParcel* parcel = floaterp->mParcelSelection->getParcel();
+ LLParcel* parcel = mParcelSelection->getParcel();
if (names.empty() || ids.empty()) return;
LLUUID id = ids[0];
parcel->setAuthorizedBuyerID(id);
- floaterp->mAuthorizedBuyer = ids[0];
+ mAuthorizedBuyer = ids[0];
- floaterp->childSetText("sell_to_agent", names[0]);
+ childSetText("sell_to_agent", names[0]);
- floaterp->refreshUI();
+ refreshUI();
}
// static
@@ -425,7 +423,7 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata)
send_parcel_select_objects(parcel->getLocalID(), RT_SELL);
- LLNotifications::instance().add("TransferObjectsHighlighted",
+ LLNotificationsUtil::add("TransferObjectsHighlighted",
LLSD(), LLSD(),
&LLFloaterSellLandUI::callbackHighlightTransferable);
}
@@ -460,7 +458,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
&& (sale_price == 0)
&& sell_to_anyone)
{
- LLNotifications::instance().add("SalePriceRestriction");
+ LLNotificationsUtil::add("SalePriceRestriction");
return;
}
@@ -493,7 +491,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
bool LLFloaterSellLandUI::onConfirmSale(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0)
{
return false;
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 8979575ef7..a6ffa5ec09 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -34,7 +34,7 @@
#include "llfloatersettingsdebug.h"
#include "llfloater.h"
#include "lluictrlfactory.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llcombobox.h"
#include "llspinctrl.h"
#include "llcolorswatch.h"
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 235e819218..a0031f0193 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -76,6 +76,7 @@
#include "llimagebmp.h"
#include "llimagej2c.h"
#include "lllocalcliprect.h"
+#include "llnotificationsutil.h"
#include "llresmgr.h" // LLLocale
#include "llvfile.h"
#include "llvfs.h"
@@ -101,6 +102,8 @@ S32 BORDER_WIDTH = 6;
const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte
const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
+static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view");
+
///----------------------------------------------------------------------------
/// Class LLSnapshotLivePreview
///----------------------------------------------------------------------------
@@ -243,10 +246,10 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param
// gIdleCallbacks.addFunction( &LLSnapshotLivePreview::onIdle, (void*)this );
sList.insert(this);
setFollowsAll();
- mWidth[0] = gViewerWindow->getWindowDisplayWidth();
- mWidth[1] = gViewerWindow->getWindowDisplayWidth();
- mHeight[0] = gViewerWindow->getWindowDisplayHeight();
- mHeight[1] = gViewerWindow->getWindowDisplayHeight();
+ mWidth[0] = gViewerWindow->getWindowWidthRaw();
+ mWidth[1] = gViewerWindow->getWindowWidthRaw();
+ mHeight[0] = gViewerWindow->getWindowHeightRaw();
+ mHeight[1] = gViewerWindow->getWindowHeightRaw();
mImageScaled[0] = FALSE;
mImageScaled[1] = FALSE;
@@ -375,6 +378,7 @@ void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
{
mSnapshotQuality = quality;
gSavedSettings.setS32("SnapshotQuality", quality);
+ mSnapshotUpToDate = FALSE;
}
}
@@ -492,27 +496,27 @@ void LLSnapshotLivePreview::draw()
LLLocalClipRect clip(getLocalRect());
{
// draw diagonal stripe with gradient that passes over screen
- S32 x1 = gViewerWindow->getWindowWidth() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f)));
- S32 x2 = x1 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH);
- S32 x3 = x2 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH);
+ S32 x1 = gViewerWindow->getWindowWidthScaled() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f)));
+ S32 x2 = x1 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH);
+ S32 x3 = x2 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH);
S32 y1 = 0;
- S32 y2 = gViewerWindow->getWindowHeight();
+ S32 y2 = gViewerWindow->getWindowHeightScaled();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.begin(LLRender::QUADS);
{
gGL.color4f(1.f, 1.f, 1.f, 0.f);
gGL.vertex2i(x1, y1);
- gGL.vertex2i(x1 + gViewerWindow->getWindowWidth(), y2);
+ gGL.vertex2i(x1 + gViewerWindow->getWindowWidthScaled(), y2);
gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY);
- gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2);
+ gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2);
gGL.vertex2i(x2, y1);
gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY);
gGL.vertex2i(x2, y1);
- gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2);
+ gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2);
gGL.color4f(1.f, 1.f, 1.f, 0.f);
- gGL.vertex2i(x3 + gViewerWindow->getWindowWidth(), y2);
+ gGL.vertex2i(x3 + gViewerWindow->getWindowWidthScaled(), y2);
gGL.vertex2i(x3, y1);
}
gGL.end();
@@ -615,8 +619,8 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
{
return FALSE ;
}
- S32 window_width = gViewerWindow->getWindowDisplayWidth() ;
- S32 window_height = gViewerWindow->getWindowDisplayHeight() ;
+ S32 window_width = gViewerWindow->getWindowWidthRaw() ;
+ S32 window_height = gViewerWindow->getWindowHeightRaw() ;
F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);
@@ -980,7 +984,7 @@ void LLSnapshotLivePreview::saveTexture()
"Snapshot : " + pos_string,
"Taken by " + who_took_it + " at " + pos_string,
0,
- LLAssetType::AT_SNAPSHOT_CATEGORY,
+ LLFolderType::FT_SNAPSHOT_CATEGORY,
LLInventoryType::IT_SNAPSHOT,
PERM_ALL, // Note: Snapshots to inventory is a special case of content upload
PERM_NONE, // that ignores the user's premissions preferences and continues to
@@ -991,7 +995,7 @@ void LLSnapshotLivePreview::saveTexture()
}
else
{
- LLNotifications::instance().add("ErrorEncodingSnapshot");
+ LLNotificationsUtil::add("ErrorEncodingSnapshot");
llwarns << "Error encoding snapshot" << llendl;
}
@@ -1025,7 +1029,8 @@ class LLFloaterSnapshot::Impl
public:
Impl()
: mAvatarPauseHandles(),
- mLastToolset(NULL)
+ mLastToolset(NULL),
+ mAspectRatioCheckOff(false)
{
}
~Impl()
@@ -1076,7 +1081,7 @@ public:
LLToolset* mLastToolset;
LLHandle<LLView> mPreviewHandle;
- BOOL mAspectRatioCheckOff ;
+ bool mAspectRatioCheckOff ;
};
// static
@@ -1166,7 +1171,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
- previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+ previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
bool use_freeze_frame = floaterp->childGetValue("freeze_frame_check").asBoolean();
@@ -1373,6 +1378,7 @@ void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp,
void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
{
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+
if (view)
{
view->closeFloater();
@@ -1602,7 +1608,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
if(0 == index) //current window size
{
- view->impl.mAspectRatioCheckOff = TRUE ;
+ view->impl.mAspectRatioCheckOff = true ;
view->childSetEnabled("keep_aspect_check", FALSE) ;
if(previewp)
@@ -1612,7 +1618,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
}
else if(-1 == index) //custom
{
- view->impl.mAspectRatioCheckOff = FALSE ;
+ view->impl.mAspectRatioCheckOff = false ;
//if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
{
view->childSetEnabled("keep_aspect_check", TRUE) ;
@@ -1625,7 +1631,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
}
else
{
- view->impl.mAspectRatioCheckOff = TRUE ;
+ view->impl.mAspectRatioCheckOff = true ;
view->childSetEnabled("keep_aspect_check", FALSE) ;
if(previewp)
@@ -1689,7 +1695,7 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
if (width == 0 || height == 0)
{
// take resolution from current window size
- previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+ previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else if (width == -1 || height == -1)
{
@@ -1842,13 +1848,13 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
#endif
if(previewp && previewp->mKeepAspectRatio)
{
- if(gViewerWindow->getWindowDisplayWidth() < 1 || gViewerWindow->getWindowDisplayHeight() < 1)
+ if(gViewerWindow->getWindowWidthRaw() < 1 || gViewerWindow->getWindowHeightRaw() < 1)
{
return FALSE ;
}
//aspect ratio of the current window
- F32 aspect_ratio = (F32)gViewerWindow->getWindowDisplayWidth() / gViewerWindow->getWindowDisplayHeight() ;
+ F32 aspect_ratio = (F32)gViewerWindow->getWindowWidthRaw() / gViewerWindow->getWindowHeightRaw() ;
//change another value proportionally
if(isWidthChanged)
@@ -2040,10 +2046,12 @@ BOOL LLFloaterSnapshot::postBuild()
LLSnapshotLivePreview::Params p;
p.rect(full_screen_rect);
LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p);
- getRootView()->removeChild(gSnapshotFloaterView);
+ LLView* parent_view = gSnapshotFloaterView->getParent();
+
+ parent_view->removeChild(gSnapshotFloaterView);
// make sure preview is below snapshot floater
- getRootView()->addChild(previewp);
- getRootView()->addChild(gSnapshotFloaterView);
+ parent_view->addChild(previewp);
+ parent_view->addChild(gSnapshotFloaterView);
//move snapshot floater to special purpose snapshotfloaterview
gFloaterView->removeChild(this);
@@ -2072,8 +2080,10 @@ void LLFloaterSnapshot::draw()
{
if(previewp->getThumbnailImage())
{
+ LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect();
+
S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ;
- S32 offset_y = getRect().getHeight() - 205 + (90 - previewp->getThumbnailHeight()) / 2 ;
+ S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;
glMatrixMode(GL_MODELVIEW);
gl_draw_scaled_image(offset_x, offset_y,
@@ -2098,6 +2108,12 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
}
+void LLFloaterSnapshot::onClose(bool app_quitting)
+{
+ getParent()->setMouseOpaque(FALSE);
+}
+
+
//static
void LLFloaterSnapshot::update()
{
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index bd01f6c573..1333497bd2 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -52,6 +52,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
static void update();
diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp
index 9841cd2796..816181643f 100644
--- a/indra/newview/llfloatertelehub.cpp
+++ b/indra/newview/llfloatertelehub.cpp
@@ -84,17 +84,6 @@ void LLFloaterTelehub::onOpen(const LLSD& key)
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompTranslate::getInstance() );
- // Find tools floater, glue to bottom
- if (gFloaterTools)
- {
- LLRect tools_rect = gFloaterTools->getRect();
- S32 our_width = getRect().getWidth();
- S32 our_height = getRect().getHeight();
- LLRect our_rect;
- our_rect.setLeftTopAndSize(tools_rect.mLeft, tools_rect.mBottom, our_width, our_height);
- setRect(our_rect);
- }
-
sendTelehubInfoRequest();
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
index 8af011c17a..58d5197eaa 100644
--- a/indra/newview/llfloatertestinspectors.cpp
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()
BOOL LLFloaterTestInspectors::postBuild()
{
+ // Test the dummy widget construction code
+ getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true);
+
// getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
// boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback(
@@ -79,12 +82,12 @@ void LLFloaterTestInspectors::showAvatarInspector(LLUICtrl*, const LLSD& avatar_
id = avatar_id.asUUID();
}
// spawns off mouse position automatically
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", id));
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", id));
}
void LLFloaterTestInspectors::showObjectInspector(LLUICtrl*, const LLSD& object_id)
{
- LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", object_id));
+ LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id));
}
void LLFloaterTestInspectors::onClickAvatar2D()
diff --git a/indra/newview/llfloatertestlistview.cpp b/indra/newview/llfloatertestlistview.cpp
index 5c942d0ed9..7171449738 100644
--- a/indra/newview/llfloatertestlistview.cpp
+++ b/indra/newview/llfloatertestlistview.cpp
@@ -33,45 +33,9 @@
#include "llfloatertestlistview.h"
-// Viewer includes
-#include "lllistview.h"
-
-// Linden library includes
-//#include "lluictrlfactory.h"
-
LLFloaterTestListView::LLFloaterTestListView(const LLSD& seed)
-: LLFloater(seed),
- mListView(NULL)
-{
- // set up named callback functions for test buttons
- mCommitCallbackRegistrar.add("TestListView.Test1",
- boost::bind(&LLFloaterTestListView::onClickTest1, this));
- mCommitCallbackRegistrar.add("TestListView.Test2",
- boost::bind(&LLFloaterTestListView::onClickTest2, this));
-}
+: LLFloater(seed)
+{}
LLFloaterTestListView::~LLFloaterTestListView()
{}
-
-BOOL LLFloaterTestListView::postBuild()
-{
- mListView = getChild<LLListView>("test_list_view");
- // just set a random property
- mListView->setString("set programmatically");
- return LLFloater::postBuild();
-}
-
-void LLFloaterTestListView::onListViewChanged()
-{
- llinfos << "list view changed" << llendl;
-}
-
-void LLFloaterTestListView::onClickTest1()
-{
- llinfos << "test 1" << llendl;
-}
-
-void LLFloaterTestListView::onClickTest2()
-{
- llinfos << "test 2" << llendl;
-}
diff --git a/indra/newview/llfloatertestlistview.h b/indra/newview/llfloatertestlistview.h
index 053da95def..0c47c2ee31 100644
--- a/indra/newview/llfloatertestlistview.h
+++ b/indra/newview/llfloatertestlistview.h
@@ -34,31 +34,16 @@
#include "llfloater.h"
-class LLListView;
class LLSD;
class LLFloaterTestListView : public LLFloater
{
friend class LLFloaterReg;
-public:
- // nothing yet
private:
// Construction handled by LLFloaterReg
LLFloaterTestListView(const LLSD& seed);
~LLFloaterTestListView();
-
- /*virtual*/ BOOL postBuild();
-
- // Perform some debug action when the list-view sends change notification
- void onListViewChanged();
-
- // Debug function hookups for buttons
- void onClickTest1();
- void onClickTest2();
-
-private:
- LLListView* mListView;
};
#endif
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 5fee84190b..7c42a581ff 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -43,6 +43,7 @@
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldraghandle.h"
+#include "llerror.h"
#include "llfloaterbuildoptions.h"
#include "llfloatermediasettings.h"
#include "llfloateropenobject.h"
@@ -51,10 +52,11 @@
#include "llmediaentry.h"
#include "llmediactrl.h"
#include "llmenugl.h"
+#include "llnotificationsutil.h"
#include "llpanelcontents.h"
#include "llpanelface.h"
#include "llpanelland.h"
-#include "llpanelinventory.h"
+#include "llpanelobjectinventory.h"
#include "llpanelobject.h"
#include "llpanelvolume.h"
#include "llpanelpermissions.h"
@@ -86,11 +88,12 @@
#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
#include "llviewerwindow.h"
+#include "llvovolume.h"
#include "lluictrlfactory.h"
// Globals
LLFloaterTools *gFloaterTools = NULL;
-
+bool LLFloaterTools::sShowObjectCost = true;
const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
{
@@ -283,6 +286,8 @@ BOOL LLFloaterTools::postBuild()
mStatusText["grab"] = getString("status_grab");
mStatusText["place"] = getString("status_place");
mStatusText["selectland"] = getString("status_selectland");
+
+ sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
return TRUE;
}
@@ -421,10 +426,20 @@ void LLFloaterTools::refresh()
LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
childSetTextArg("prim_count", "[COUNT]", prim_count_string);
+ // calculate selection rendering cost
+ if (sShowObjectCost)
+ {
+ std::string prim_cost_string;
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+ childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+ }
+
+
// disable the object and prim counts if nothing selected
bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
childSetEnabled("obj_count", have_selection);
childSetEnabled("prim_count", have_selection);
+ childSetEnabled("RenderingCost", have_selection && sShowObjectCost);
// Refresh child tabs
mPanelPermissions->refresh();
@@ -555,6 +570,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
+ bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
+ childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
if (mCheckSelectIndividual)
{
@@ -649,8 +666,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
- if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
- if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
@@ -963,6 +980,32 @@ void LLFloaterTools::onClickGridOptions()
//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
}
+S32 LLFloaterTools::calcRenderCost()
+{
+ S32 cost = 0;
+ std::set<LLUUID> textures;
+
+ for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
+ selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
+ ++selection_iter)
+ {
+ LLSelectNode *select_node = *selection_iter;
+ if (select_node)
+ {
+ LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
+ if (viewer_volume)
+ {
+ cost += viewer_volume->getRenderCost(textures);
+ cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
+ textures.clear();
+ }
+ }
+ }
+
+
+ return cost;
+}
+
// static
void LLFloaterTools::setEditTool(void* tool_pointer)
{
@@ -1042,7 +1085,7 @@ void LLFloaterTools::getMediaState()
{
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
LLViewerObject* first_object = selected_objects->getFirstObject();
- LLLineEditor* media_info = getChild<LLLineEditor>("media_info");
+ LLTextBox* media_info = getChild<LLTextBox>("media_info");
if( !(first_object
&& first_object->getPCode() == LL_PCODE_VOLUME
@@ -1050,12 +1093,6 @@ void LLFloaterTools::getMediaState()
))
{
childSetEnabled("Add_Media", FALSE);
-/* childSetEnabled("media_tex", FALSE);
- childSetEnabled("add_media", FALSE);
- childSetEnabled("delete_media", FALSE);
- childSetEnabled("edit_media", FALSE);
- childSetEnabled("media_info", FALSE);
- media_info->setEnabled(FALSE);*/
media_info->clear();
clearMediaSettings();
return;
@@ -1067,33 +1104,68 @@ void LLFloaterTools::getMediaState()
if(!has_media_capability)
{
childSetEnabled("Add_Media", FALSE);
- /* childSetEnabled("media_tex", FALSE);
- childSetEnabled("add_media", FALSE);
- childSetEnabled("delete_media", FALSE);
- childSetEnabled("edit_media", FALSE);
- childSetEnabled("media_info", FALSE);
- media_info->setEnabled(FALSE);
- media_info->clear();*/
+ LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
clearMediaSettings();
return;
}
bool editable = (first_object->permModify() || selectedMediaEditable());
-
+
+ // Check modify permissions and whether any selected objects are in
+ // the process of being fetched. If they are, then we're not editable
+ if (editable)
+ {
+ LLObjectSelection::iterator iter = selected_objects->begin();
+ LLObjectSelection::iterator end = selected_objects->end();
+ for ( ; iter != end; ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
+ if (NULL != object)
+ {
+ if (!object->permModify())
+ {
+ LL_INFOS("LLFloaterTools: media")
+ << "Selection not editable due to lack of modify permissions on object id "
+ << object->getID() << LL_ENDL;
+
+ editable = false;
+ break;
+ }
+ // XXX DISABLE this for now, because when the fetch finally
+ // does come in, the state of this floater doesn't properly
+ // update. Re-selecting fixes the problem, but there is
+ // contention as to whether this is a sufficient solution.
+// if (object->isMediaDataBeingFetched())
+// {
+// LL_INFOS("LLFloaterTools: media")
+// << "Selection not editable due to media data being fetched for object id "
+// << object->getID() << LL_ENDL;
+//
+// editable = false;
+// break;
+// }
+ }
+ }
+ }
+
// Media settings
- U8 has_media = (U8)0;
- struct media_functor : public LLSelectedTEGetFunctor<U8>
+ bool bool_has_media = false;
+ struct media_functor : public LLSelectedTEGetFunctor<bool>
{
- U8 get(LLViewerObject* object, S32 face)
+ bool get(LLViewerObject* object, S32 face)
{
- return (object->getTE(face)->getMediaTexGen());
+ LLTextureEntry *te = object->getTE(face);
+ if (te)
+ {
+ return te->hasMedia();
+ }
+ return false;
}
} func;
// check if all faces have media(or, all dont have media)
- LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, has_media );
- bool bool_has_media = (has_media & LLTextureEntry::MF_HAS_MEDIA);
-
+ LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
const LLMediaEntry default_media_data;
@@ -1150,11 +1222,10 @@ void LLFloaterTools::getMediaState()
mNeedMediaTitle = false;
}
- childSetEnabled("media_tex", bool_has_media & editable);
- childSetEnabled( "edit_media", bool_has_media & editable );
- childSetEnabled( "delete_media", bool_has_media & editable );
- childSetEnabled( "add_media", ( ! bool_has_media ) & editable );
- media_info->setEnabled(false);
+ childSetEnabled("media_tex", bool_has_media && editable);
+ childSetEnabled( "edit_media", bool_has_media && LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo && editable );
+ childSetEnabled( "delete_media", bool_has_media && editable );
+ childSetEnabled( "add_media", ( ! bool_has_media ) && editable );
// TODO: display a list of all media on the face - use 'identical' flag
}
else // not all face has media but at least one does.
@@ -1181,10 +1252,8 @@ void LLFloaterTools::getMediaState()
}
}
- media_info->setEnabled(false);
- media_info->setTentative(true);
childSetEnabled("media_tex", TRUE);
- childSetEnabled( "edit_media", TRUE);
+ childSetEnabled( "edit_media", LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo);
childSetEnabled( "delete_media", TRUE);
childSetEnabled( "add_media", FALSE );
}
@@ -1201,24 +1270,21 @@ void LLFloaterTools::getMediaState()
// called when a user wants to add media to a prim or prim face
void LLFloaterTools::onClickBtnAddMedia()
{
- // check for the edit tool and now many faces are selected
- LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
- if((tool != LLToolFace::getInstance()) || LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
+ // check if multiple faces are selected
+ if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
{
- LLNotifications::instance().add("MultipleFacesSelected",LLSD(), LLSD(), multipleFacesSelectedConfirm);
-
+ LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
}
else
{
onClickBtnEditMedia();
}
-
}
// static
bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch( option )
{
case 0: // "Yes"
@@ -1244,18 +1310,18 @@ void LLFloaterTools::onClickBtnEditMedia()
// called when a user wants to delete media from a prim or prim face
void LLFloaterTools::onClickBtnDeleteMedia()
{
- LLNotifications::instance().add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
+ LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
}
// static
bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch( option )
{
case 0: // "Yes"
- LLSelectMgr::getInstance()->selectionSetMedia( 0 );
+ LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() );
if(LLFloaterReg::instanceVisible("media_settings"))
{
LLFloaterReg::hideInstance("media_settings");
@@ -1313,7 +1379,7 @@ void LLFloaterTools::updateMediaTitle()
if ( ! media_title.empty() )
{
// update the UI widget
- LLLineEditor* media_title_field = getChild<LLLineEditor>("media_info");
+ LLTextBox* media_title_field = getChild<LLTextBox>("media_info");
if ( media_title_field )
{
media_title_field->setText( media_title );
@@ -1355,7 +1421,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getControls();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_controls(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
@@ -1378,7 +1444,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getFirstClickInteract();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_first_click(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
@@ -1401,7 +1467,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getHomeURL();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_home_url(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
@@ -1424,7 +1490,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getCurrentURL();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_current_url(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
@@ -1448,7 +1514,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getAutoZoom();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_auto_zoom(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
@@ -1457,7 +1523,9 @@ void LLFloaterTools::updateMediaSettings()
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
// Auto play
- value_bool = default_media_data.getAutoPlay();
+ //value_bool = default_media_data.getAutoPlay();
+ // set default to auto play TRUE -- angela EXT-5172
+ value_bool = true;
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
{
functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
@@ -1468,10 +1536,11 @@ void LLFloaterTools::updateMediaSettings()
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoPlay();
- return mMediaEntry.getAutoPlay();
+ //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172
+ return true;
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_auto_play(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
@@ -1481,7 +1550,9 @@ void LLFloaterTools::updateMediaSettings()
// Auto scale
- value_bool = default_media_data.getAutoScale();
+ // set default to auto scale TRUE -- angela EXT-5172
+ //value_bool = default_media_data.getAutoScale();
+ value_bool = true;
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
{
functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
@@ -1492,10 +1563,11 @@ void LLFloaterTools::updateMediaSettings()
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoScale();
- return mMediaEntry.getAutoScale();;
- };
+ // return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172
+ return true;
+ };
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_auto_scale(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
@@ -1518,7 +1590,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getAutoLoop();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_auto_loop(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
@@ -1541,7 +1613,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getWidthPixels();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_width_pixels(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
@@ -1564,7 +1636,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getHeightPixels();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_height_pixels(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
@@ -1587,7 +1659,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getAltImageEnable();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_enable_alt_image(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
@@ -1610,7 +1682,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_owner_interact(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
@@ -1633,7 +1705,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_owner_control(default_media_data);
identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
@@ -1656,7 +1728,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_group_interact(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
@@ -1679,7 +1751,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_group_control(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
@@ -1702,7 +1774,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_anyone_interact(default_media_data);
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
@@ -1725,7 +1797,7 @@ void LLFloaterTools::updateMediaSettings()
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_perms_anyone_control(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
@@ -1748,7 +1820,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getWhiteListEnable();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_whitelist_enable(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
@@ -1771,7 +1843,7 @@ void LLFloaterTools::updateMediaSettings()
return mMediaEntry.getWhiteList();
};
- const LLMediaEntry & mMediaEntry;
+ const LLMediaEntry &mMediaEntry;
} func_whitelist_urls(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index a3e0cac034..e1f3c9b78c 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -46,7 +46,6 @@ class LLPanelVolume;
class LLPanelContents;
class LLPanelFace;
class LLPanelLandInfo;
-class LLRadioCtrl;
class LLRadioGroup;
class LLSlider;
class LLTabContainer;
@@ -121,6 +120,7 @@ private:
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
static void setObjectType( LLPCode pcode );
void onClickGridOptions();
+ S32 calcRenderCost();
public:
LLButton *mBtnFocus;
@@ -195,6 +195,9 @@ private:
protected:
LLSD mMediaSettings;
+
+public:
+ static bool sShowObjectCost;
};
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index bf5a1141a6..8ab050beaa 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -41,6 +41,7 @@
#include "llbutton.h"
#include "llfloatergodtools.h"
#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -161,7 +162,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ReportType, mCurrentMode);
LLScrollListCtrl *list = getChild<LLScrollListCtrl>("objects_list");
-
+
S32 block_count = msg->getNumberOfBlocks("ReportData");
for (S32 block = 0; block < block_count; ++block)
{
@@ -282,8 +283,13 @@ void LLFloaterTopObjects::updateSelectionInfo()
std::string object_id_string = object_id.asString();
childSetValue("id_editor", LLSD(object_id_string));
- childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getValue().asString());
- childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getValue().asString());
+ LLScrollListItem* sli = list->getFirstSelected();
+ llassert(sli);
+ if (sli)
+ {
+ childSetValue("object_name_editor", sli->getColumn(1)->getValue().asString());
+ childSetValue("owner_name_editor", sli->getColumn(2)->getValue().asString());
+ }
}
// static
@@ -359,7 +365,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)
//static
bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
if(!instance) return false;
if (option == 0)
@@ -371,7 +377,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD
void LLFloaterTopObjects::onReturnAll()
{
- LLNotifications::instance().add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
+ LLNotificationsUtil::add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
}
@@ -384,7 +390,7 @@ void LLFloaterTopObjects::onReturnSelected()
//static
bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
if(!instance) return false;
if (option == 0)
@@ -396,7 +402,7 @@ bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLS
void LLFloaterTopObjects::onDisableAll()
{
- LLNotifications::instance().add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
+ LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
}
void LLFloaterTopObjects::onDisableSelected()
@@ -431,7 +437,6 @@ void LLFloaterTopObjects::onRefresh()
filter = mFilter;
clearList();
-
LLMessageSystem *msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LandStatRequest);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -464,7 +469,7 @@ void LLFloaterTopObjects::onGetByOwnerName()
}
void LLFloaterTopObjects::showBeacon()
-{
+{
LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
if (!list) return;
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index 8d2d48f1af..69ee8cd547 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -40,8 +40,10 @@
// linden library includes
#include "llbutton.h"
+#include "llevents.h"
#include "llhttpclient.h"
#include "llhttpstatuscodes.h" // for HTTP_FOUND
+#include "llnotificationsutil.h"
#include "llradiogroup.h"
#include "lltextbox.h"
#include "llui.h"
@@ -207,7 +209,7 @@ void LLFloaterTOS::onCancel( void* userdata )
{
LLFloaterTOS* self = (LLFloaterTOS*) userdata;
llinfos << "User disagrees with TOS." << llendl;
- LLNotifications::instance().add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
+ LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
if(self->mReplyPumpName != "")
{
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 2fe21f28de..f61c86db14 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -41,15 +41,16 @@
#include "llfloateruipreview.h" // Own header
// Internal utility
+#include "lleventtimer.h"
#include "llrender.h"
#include "llsdutil.h"
#include "llxmltree.h"
#include "llviewerwindow.h"
-#include "lllivefile.h"
// XUI
#include "lluictrlfactory.h"
#include "llcombobox.h"
+#include "llnotificationsutil.h"
#include "llresizebar.h"
#include "llscrolllistitem.h"
#include "llscrolllistctrl.h"
@@ -91,7 +92,6 @@ static std::string get_xui_dir()
}
// Forward declarations to avoid header dependencies
-class LLEventTimer;
class LLColor;
class LLScrollListCtrl;
class LLComboBox;
@@ -362,8 +362,7 @@ BOOL LLFadeEventTimer::tick()
if(NULL == mParent) // no more need to tick, so suicide
{
- delete this;
- return FALSE;
+ return TRUE;
}
// Set up colors
@@ -431,9 +430,9 @@ BOOL LLFloaterUIPreview::postBuild()
// get pointers to buttons and link to callbacks
mLanguageSelection = main_panel_tmp->getChild<LLComboBox>("language_select_combo");
- mLanguageSelection->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
+ mLanguageSelection->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
mLanguageSelection_2 = main_panel_tmp->getChild<LLComboBox>("language_select_combo_2");
- mLanguageSelection_2->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
+ mLanguageSelection_2->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
LLPanel* editor_panel_tmp = main_panel_tmp->getChild<LLPanel>("editor_panel");
mDisplayFloaterBtn = main_panel_tmp->getChild<LLButton>("display_floater");
mDisplayFloaterBtn->setClickedCallback(boost::bind(&LLFloaterUIPreview::onClickDisplayFloater, this, PRIMARY_FLOATER));
@@ -608,7 +607,7 @@ void LLFloaterUIPreview::popupAndPrintWarning(std::string& warning)
llwarns << warning << llendl;
LLSD args;
args["MESSAGE"] = warning;
- LLNotifications::instance().add("GenericAlert", args);
+ LLNotificationsUtil::add("GenericAlert", args);
}
// Get localization string from drop-down menu
@@ -670,6 +669,15 @@ void LLFloaterUIPreview::refreshList()
}
}
+ found = TRUE;
+ while(found) // for every sidepanel file that matches the pattern
+ {
+ if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name, FALSE))) // get next file matching pattern
+ {
+ addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
+ }
+ }
+
if(!mFileList->isEmpty()) // if there were any matching files, just select the first one (so we don't have to worry about disabling buttons when no entry is selected)
{
mFileList->selectFirstItem();
@@ -840,6 +848,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
{
LLUICtrlFactory::getInstance()->buildFloater(*floaterp, path, NULL); // just build it
(*floaterp)->openFloater((*floaterp)->getKey());
+ (*floaterp)->setCanResize((*floaterp)->isResizable());
}
}
@@ -1041,6 +1050,7 @@ void LLFloaterUIPreview::onClickEditFloater()
if(!LLFile::stat(exe_path.c_str(), &s)) // If the executable exists
{
// build paths and arguments
+ std::string quote = std::string("\"");
std::string args;
std::string custom_args = mEditorArgsTextBox->getText();
int position_of_file = custom_args.find(std::string("%FILE%"), 0); // prepare to replace %FILE% with actual file path
@@ -1048,7 +1058,7 @@ void LLFloaterUIPreview::onClickEditFloater()
std::string second_part_of_args = "";
if(-1 == position_of_file) // default: Executable.exe File.xml
{
- args = std::string("\"") + path + std::string("\""); // execute the command Program.exe "File.xml"
+ args = quote + path + quote; // execute the command Program.exe "File.xml"
}
else // use advanced command-line arguments, e.g. "Program.exe -safe File.xml" -windowed for "-safe %FILE% -windowed"
{
@@ -1075,12 +1085,14 @@ void LLFloaterUIPreview::onClickEditFloater()
memset(&pinfo, 0, sizeof(pinfo));
std::string exe_name = exe_path.substr(last_slash_position+1);
- args = exe_name + std::string(" ") + args; // and prepend the executable name, so we get 'Program.exe "Arg1"'
+ args = quote + exe_name + quote + std::string(" ") + args; // and prepend the executable name, so we get 'Program.exe "Arg1"'
char *args2 = new char[args.size() + 1]; // Windows requires that the second parameter to CreateProcessA be a writable (non-const) string...
strcpy(args2, args.c_str());
- if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo))
+ // we don't want the current directory to be the executable directory, since the file path is now relative. By using
+ // NULL for the current directory instead of exe_dir.c_str(), the path to the target file will work.
+ if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo))
{
// DWORD dwErr = GetLastError();
std::string warning = "Creating editor process failed!";
diff --git a/indra/newview/llfloaterurldisplay.cpp b/indra/newview/llfloaterurldisplay.cpp
index 3b9321a876..4b67cbb308 100644
--- a/indra/newview/llfloaterurldisplay.cpp
+++ b/indra/newview/llfloaterurldisplay.cpp
@@ -33,13 +33,14 @@
#include "llviewerprecompiledheaders.h"
+#include "llregionhandle.h"
+#include "v3dmath.h"
+
#include "llfloaterurldisplay.h"
#include "llpanelplace.h"
#include "lluictrlfactory.h"
-#include "v3dmath.h"
-
////////////////////////////////////////////////////////////////////////////
// LLFloaterURLDisplay
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 2b01a56373..91d0f0e370 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -32,13 +32,15 @@
#include "llviewerprecompiledheaders.h"
+#include "llhttpclient.h"
+
#include "llfloaterurlentry.h"
#include "llpanellandmedia.h"
#include "llpanelface.h"
-// project includes
#include "llcombobox.h"
+#include "llnotificationsutil.h"
#include "llurlhistory.h"
#include "lluictrlfactory.h"
#include "llwindow.h"
@@ -263,13 +265,13 @@ void LLFloaterURLEntry::onBtnCancel( void* userdata )
//-----------------------------------------------------------------------------
void LLFloaterURLEntry::onBtnClear( void* userdata )
{
- LLNotifications::instance().add( "ConfirmClearMediaUrlList", LLSD(), LLSD(),
+ LLNotificationsUtil::add( "ConfirmClearMediaUrlList", LLSD(), LLSD(),
boost::bind(&LLFloaterURLEntry::callback_clear_url_list, (LLFloaterURLEntry*)userdata, _1, _2) );
}
bool LLFloaterURLEntry::callback_clear_url_list(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// clear saved list
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index aca9198f59..638c9f1b8c 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -49,6 +49,9 @@
#include "lluictrlfactory.h"
+static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
+
+
LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
: LLPanel()
{
@@ -82,40 +85,58 @@ BOOL LLPanelVoiceDeviceSettings::postBuild()
return TRUE;
}
+// virtual
+void LLPanelVoiceDeviceSettings::handleVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ initialize();
+ }
+ else
+ {
+ cleanup();
+ // when closing this window, turn of visiblity control so that
+ // next time preferences is opened we don't suspend voice
+ gSavedSettings.setBOOL("ShowDeviceSettings", FALSE);
+ }
+}
void LLPanelVoiceDeviceSettings::draw()
{
+ refresh();
+
// let user know that volume indicator is not yet available
bool is_in_tuning_mode = gVoiceClient->inTuningMode();
childSetVisible("wait_text", !is_in_tuning_mode);
LLPanel::draw();
- F32 voice_power = gVoiceClient->tuningGetEnergy();
- S32 discrete_power = 0;
-
- if (!is_in_tuning_mode)
- {
- discrete_power = 0;
- }
- else
- {
- discrete_power = llmin(4, llfloor((voice_power / LLVoiceClient::OVERDRIVEN_POWER_LEVEL) * 4.f));
- }
-
if (is_in_tuning_mode)
{
- for(S32 power_bar_idx = 0; power_bar_idx < 5; power_bar_idx++)
+ const S32 num_bars = 5;
+ F32 voice_power = gVoiceClient->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
+ S32 discrete_power = llmin(num_bars, llfloor(voice_power * (F32)num_bars + 0.1f));
+
+ for(S32 power_bar_idx = 0; power_bar_idx < num_bars; power_bar_idx++)
{
std::string view_name = llformat("%s%d", "bar", power_bar_idx);
LLView* bar_view = getChild<LLView>(view_name);
if (bar_view)
{
+ gl_rect_2d(bar_view->getRect(), LLColor4::grey, TRUE);
+
+ LLColor4 color;
if (power_bar_idx < discrete_power)
{
- LLColor4 color = (power_bar_idx >= 3) ? LLUIColorTable::instance().getColor("OverdrivenColor") : LLUIColorTable::instance().getColor("SpeakingColor");
- gl_rect_2d(bar_view->getRect(), color, TRUE);
+ color = (power_bar_idx >= 3) ? LLUIColorTable::instance().getColor("OverdrivenColor") : LLUIColorTable::instance().getColor("SpeakingColor");
+ }
+ else
+ {
+ color = LLUIColorTable::instance().getColor("PanelFocusBackgroundColor");
}
- gl_rect_2d(bar_view->getRect(), LLColor4::grey, FALSE);
+
+ LLRect color_rect = bar_view->getRect();
+ color_rect.stretch(-1);
+ gl_rect_2d(color_rect, color, TRUE);
}
}
}
@@ -256,7 +277,10 @@ void LLPanelVoiceDeviceSettings::initialize()
void LLPanelVoiceDeviceSettings::cleanup()
{
- gVoiceClient->tuningStop();
+ if (gVoiceClient)
+ {
+ gVoiceClient->tuningStop();
+ }
LLVoiceChannel::resume();
}
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index f1603dc414..d67283d0a2 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -50,6 +50,8 @@ public:
void initialize();
void cleanup();
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+
protected:
static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 72c82c178b..1bbee2625c 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -47,6 +47,7 @@
#include "llviewercamera.h"
#include "llcombobox.h"
#include "lllineeditor.h"
+#include "llnotificationsutil.h"
#include "llfloaterdaycycle.h"
#include "llboost.h"
#include "llmultisliderctrl.h"
@@ -110,23 +111,6 @@ BOOL LLFloaterWater::postBuild()
}
void LLFloaterWater::initCallbacks(void) {
- // help buttons
- initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor");
- initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity");
- initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod");
- initHelpBtn("WaterGlowHelp", "HelpWaterGlow");
- initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale");
- initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale");
- initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset");
-
- initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier");
- initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow");
- initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove");
-
- initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap");
- initHelpBtn("WaterWave1Help", "HelpWaterWave1");
- initHelpBtn("WaterWave2Help", "HelpWaterWave2");
-
LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &param_mgr->mFogColor));
@@ -173,20 +157,10 @@ void LLFloaterWater::initCallbacks(void) {
getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1));
}
-void LLFloaterWater::onClickHelp(std::string xml_alert)
-{
- LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterWater::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
- getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWater::onClickHelp, this, xml_alert));
-}
-
bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(text == "")
{
@@ -218,7 +192,7 @@ bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& res
}
else
{
- LLNotifications::instance().add("ExistsWaterPresetAlert");
+ LLNotificationsUtil::add("ExistsWaterPresetAlert");
}
}
return false;
@@ -530,7 +504,7 @@ void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl)
void LLFloaterWater::onNewPreset()
{
- LLNotifications::instance().add("NewWaterPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
+ LLNotificationsUtil::add("NewWaterPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
}
void LLFloaterWater::onSavePreset()
@@ -552,16 +526,16 @@ void LLFloaterWater::onSavePreset()
comboBox->getSelectedItemLabel());
if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
{
- LLNotifications::instance().add("WLNoEditDefault");
+ LLNotificationsUtil::add("WLNoEditDefault");
return;
}
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
}
bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if they choose save, do it. Otherwise, don't do anything
if(option == 0)
{
@@ -588,24 +562,22 @@ void LLFloaterWater::onDeletePreset()
LLSD args;
args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
+ LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
}
bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if they choose delete, do it. Otherwise, don't do anything
if(option == 0)
{
LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
}
std::string name = combo_box->getSelectedValue().asString();
@@ -614,7 +586,7 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
if(sIt != sDefaultPresets.end())
{
- LLNotifications::instance().add("WaterNoEditDefault");
+ LLNotificationsUtil::add("WaterNoEditDefault");
return false;
}
diff --git a/indra/newview/llfloaterwater.h b/indra/newview/llfloaterwater.h
index 08c630c69e..0ea2436dbe 100644
--- a/indra/newview/llfloaterwater.h
+++ b/indra/newview/llfloaterwater.h
@@ -59,10 +59,6 @@ public:
/// initialize all
void initCallbacks(void);
- // help button stuff
- void onClickHelp(std::string xml_alert);
- void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
bool newPromptCallback(const LLSD& notification, const LLSD& response);
/// general purpose callbacks for dealing with color controllers
diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp
index 551a5191fc..705c8afd00 100644
--- a/indra/newview/llfloaterwhitelistentry.cpp
+++ b/indra/newview/llfloaterwhitelistentry.cpp
@@ -81,7 +81,8 @@ void LLFloaterWhiteListEntry::onBtnOK( void* userdata )
{
std::string white_list_item = self->mWhiteListEdit->getText();
- panel->addWhiteListItem( white_list_item );
+ panel->addWhiteListEntry( white_list_item );
+ panel->updateWhitelistEnableStatus();
};
self->closeFloater();
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index 02979acdd7..c1b15c578c 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -41,6 +41,7 @@
#include "llsliderctrl.h"
#include "llmultislider.h"
#include "llmultisliderctrl.h"
+#include "llnotificationsutil.h"
#include "llspinctrl.h"
#include "llcheckboxctrl.h"
#include "lluictrlfactory.h"
@@ -119,36 +120,6 @@ BOOL LLFloaterWindLight::postBuild()
}
void LLFloaterWindLight::initCallbacks(void) {
- // help buttons
- initHelpBtn("WLBlueHorizonHelp", "HelpBlueHorizon");
- initHelpBtn("WLHazeHorizonHelp", "HelpHazeHorizon");
- initHelpBtn("WLBlueDensityHelp", "HelpBlueDensity");
- initHelpBtn("WLHazeDensityHelp", "HelpHazeDensity");
-
- initHelpBtn("WLDensityMultHelp", "HelpDensityMult");
- initHelpBtn("WLDistanceMultHelp", "HelpDistanceMult");
- initHelpBtn("WLMaxAltitudeHelp", "HelpMaxAltitude");
-
- initHelpBtn("WLSunlightColorHelp", "HelpSunlightColor");
- initHelpBtn("WLAmbientHelp", "HelpSunAmbient");
- initHelpBtn("WLSunGlowHelp", "HelpSunGlow");
- initHelpBtn("WLTimeOfDayHelp", "HelpTimeOfDay");
- initHelpBtn("WLEastAngleHelp", "HelpEastAngle");
-
- initHelpBtn("WLSceneGammaHelp", "HelpSceneGamma");
- initHelpBtn("WLStarBrightnessHelp", "HelpStarBrightness");
-
- initHelpBtn("WLCloudColorHelp", "HelpCloudColor");
- initHelpBtn("WLCloudDetailHelp", "HelpCloudDetail");
- initHelpBtn("WLCloudDensityHelp", "HelpCloudDensity");
- initHelpBtn("WLCloudCoverageHelp", "HelpCloudCoverage");
-
- initHelpBtn("WLCloudScaleHelp", "HelpCloudScale");
- initHelpBtn("WLCloudScrollXHelp", "HelpCloudScrollX");
- initHelpBtn("WLCloudScrollYHelp", "HelpCloudScrollY");
-
- initHelpBtn("WLClassicCloudsHelp", "HelpClassicClouds");
-
LLWLParamManager * param_mgr = LLWLParamManager::instance();
// blue horizon
@@ -237,20 +208,10 @@ void LLFloaterWindLight::initCallbacks(void) {
getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1));
}
-void LLFloaterWindLight::onClickHelp(std::string xml_alert)
-{
- LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterWindLight::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
- getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWindLight::onClickHelp, this, xml_alert));
-}
-
bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(text == "")
{
@@ -300,7 +261,7 @@ bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD&
}
else
{
- LLNotifications::instance().add("ExistsSkyPresetAlert");
+ LLNotificationsUtil::add("ExistsSkyPresetAlert");
}
}
return false;
@@ -716,7 +677,7 @@ void LLFloaterWindLight::onStarAlphaMoved(LLUICtrl* ctrl)
void LLFloaterWindLight::onNewPreset()
{
- LLNotifications::instance().add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
+ LLNotificationsUtil::add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
}
void LLFloaterWindLight::onSavePreset()
@@ -736,19 +697,19 @@ void LLFloaterWindLight::onSavePreset()
comboBox->getSelectedItemLabel());
if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
{
- LLNotifications::instance().add("WLNoEditDefault");
+ LLNotificationsUtil::add("WLNoEditDefault");
return;
}
LLWLParamManager::instance()->mCurParams.mName =
comboBox->getSelectedItemLabel();
- LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
}
bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if they choose save, do it. Otherwise, don't do anything
if(option == 0)
{
@@ -774,13 +735,13 @@ void LLFloaterWindLight::onDeletePreset()
LLSD args;
args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(),
+ LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(),
boost::bind(&LLFloaterWindLight::deleteAlertCallback, this, _1, _2));
}
bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if they choose delete, do it. Otherwise, don't do anything
if(option == 0)
@@ -788,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
}
std::string name(combo_box->getSelectedValue().asString());
@@ -802,7 +761,7 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
if(sIt != sDefaultPresets.end())
{
- LLNotifications::instance().add("WLNoEditDefault");
+ LLNotificationsUtil::add("WLNoEditDefault");
return false;
}
diff --git a/indra/newview/llfloaterwindlight.h b/indra/newview/llfloaterwindlight.h
index 56c2c6623b..ed9322c450 100644
--- a/indra/newview/llfloaterwindlight.h
+++ b/indra/newview/llfloaterwindlight.h
@@ -57,10 +57,6 @@ public:
/// initialize all
void initCallbacks(void);
- // help button stuff
- void onClickHelp(std::string alert);
- void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
bool newPromptCallback(const LLSD& notification, const LLSD& response);
/// general purpose callbacks for dealing with color controllers
diff --git a/indra/newview/llfloaterwindowsize.cpp b/indra/newview/llfloaterwindowsize.cpp
new file mode 100644
index 0000000000..5519be6f08
--- /dev/null
+++ b/indra/newview/llfloaterwindowsize.cpp
@@ -0,0 +1,164 @@
+/**
+ * @file llfloaterwindowsize.cpp
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterwindowsize.h"
+
+// Viewer includes
+#include "llviewerwindow.h"
+
+// Linden library includes
+#include "llcombobox.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "lluictrl.h"
+
+// System libraries
+#include <boost/regex.hpp>
+
+// Extract from strings of the form "<width> x <height>", e.g. "640 x 480".
+bool extractWindowSizeFromString(const std::string& instr, U32 *width, U32 *height)
+{
+ boost::cmatch what;
+ // matches (any number)(any non-number)(any number)
+ const boost::regex expression("([0-9]+)[^0-9]+([0-9]+)");
+ if (boost::regex_match(instr.c_str(), what, expression))
+ {
+ *width = atoi(what[1].first);
+ *height = atoi(what[2].first);
+ return true;
+ }
+
+ *width = 0;
+ *height = 0;
+ return false;
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterWindowSize
+///----------------------------------------------------------------------------
+class LLFloaterWindowSize
+: public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterWindowSize(const LLSD& key);
+ virtual ~LLFloaterWindowSize();
+
+public:
+ /*virtual*/ BOOL postBuild();
+ void initWindowSizeControls();
+ void onClickSet();
+ void onClickCancel();
+};
+
+
+LLFloaterWindowSize::LLFloaterWindowSize(const LLSD& key)
+: LLFloater(key)
+{
+ //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_window_size.xml");
+}
+
+LLFloaterWindowSize::~LLFloaterWindowSize()
+{
+}
+
+BOOL LLFloaterWindowSize::postBuild()
+{
+ center();
+ initWindowSizeControls();
+ getChild<LLUICtrl>("set_btn")->setCommitCallback(
+ boost::bind(&LLFloaterWindowSize::onClickSet, this));
+ getChild<LLUICtrl>("cancel_btn")->setCommitCallback(
+ boost::bind(&LLFloaterWindowSize::onClickCancel, this));
+ setDefaultBtn("set_btn");
+ return TRUE;
+}
+
+void LLFloaterWindowSize::initWindowSizeControls()
+{
+ LLComboBox* ctrl_window_size = getChild<LLComboBox>("window_size_combo");
+
+ // Look to see if current window size matches existing window sizes, if so then
+ // just set the selection value...
+ const U32 height = gViewerWindow->getWindowHeightRaw();
+ const U32 width = gViewerWindow->getWindowWidthRaw();
+ for (S32 i=0; i < ctrl_window_size->getItemCount(); i++)
+ {
+ U32 height_test = 0;
+ U32 width_test = 0;
+ ctrl_window_size->setCurrentByIndex(i);
+ std::string resolution = ctrl_window_size->getValue().asString();
+ if (extractWindowSizeFromString(resolution, &width_test, &height_test))
+ {
+ if ((height_test == height) && (width_test == width))
+ {
+ return;
+ }
+ }
+ }
+ // ...otherwise, add a new entry with the current window height/width.
+ LLUIString resolution_label = getString("resolution_format");
+ resolution_label.setArg("[RES_X]", llformat("%d", width));
+ resolution_label.setArg("[RES_Y]", llformat("%d", height));
+ ctrl_window_size->add(resolution_label, ADD_TOP);
+ ctrl_window_size->setCurrentByIndex(0);
+}
+
+void LLFloaterWindowSize::onClickSet()
+{
+ LLComboBox* ctrl_window_size = getChild<LLComboBox>("window_size_combo");
+ U32 width = 0;
+ U32 height = 0;
+ std::string resolution = ctrl_window_size->getValue().asString();
+ if (extractWindowSizeFromString(resolution, &width, &height))
+ {
+ LLViewerWindow::movieSize(width, height);
+ }
+ closeFloater();
+}
+
+void LLFloaterWindowSize::onClickCancel()
+{
+ closeFloater();
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterWindowSizeUtil
+///----------------------------------------------------------------------------
+void LLFloaterWindowSizeUtil::registerFloater()
+{
+ LLFloaterReg::add("window_size", "floater_window_size.xml",
+ &LLFloaterReg::build<LLFloaterWindowSize>);
+
+}
diff --git a/indra/newview/llfloaterwindowsize.h b/indra/newview/llfloaterwindowsize.h
new file mode 100644
index 0000000000..fd9d17323a
--- /dev/null
+++ b/indra/newview/llfloaterwindowsize.h
@@ -0,0 +1,41 @@
+/**
+ * @file llfloaterwindowsize.h
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERWINDOWSIZE_H
+#define LLFLOATERWINDOWSIZE_H
+
+// Allow user to set the window size for filming tutorials, machinima, etc
+namespace LLFloaterWindowSizeUtil
+{
+ void registerFloater();
+}
+
+#endif
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index b7e8835fb8..b6de409611 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -45,17 +45,19 @@
#include "llcallingcard.h"
#include "llcombobox.h"
#include "llviewercontrol.h"
+#include "llcommandhandler.h"
#include "lldraghandle.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloaterreg.h" // getTypedInstance()
#include "llfocusmgr.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllandmarklist.h"
#include "lllineeditor.h"
+#include "llnotificationsutil.h"
#include "llregionhandle.h"
#include "llscrolllistctrl.h"
#include "llslurl.h"
-#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltracker.h"
#include "lltrans.h"
@@ -63,15 +65,17 @@
#include "llviewermenu.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
+#include "llviewertexture.h"
#include "llworldmap.h"
+#include "llworldmapmessage.h"
#include "llworldmapview.h"
#include "lluictrlfactory.h"
#include "llappviewer.h"
#include "llmapimagetype.h"
#include "llweb.h"
#include "llslider.h"
+#include "message.h"
-#include "llglheaders.h"
#include "llwindow.h" // copyTextToClipboard()
//---------------------------------------------------------------------------
@@ -79,6 +83,12 @@
//---------------------------------------------------------------------------
static const F32 MAP_ZOOM_TIME = 0.2f;
+// Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed
+// width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across
+// sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit.
+// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
+static const S32 MAX_VISIBLE_REGIONS = 512;
+
enum EPanDirection
{
PAN_UP,
@@ -90,12 +100,42 @@ enum EPanDirection
// Values in pixels per region
static const F32 ZOOM_MAX = 128.f;
-static const F32 SIM_COORD_DEFAULT = 128.f;
-
//---------------------------------------------------------------------------
// Globals
//---------------------------------------------------------------------------
+// handle secondlife:///app/worldmap/{NAME}/{COORDS} URLs
+class LLWorldMapHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() == 0)
+ {
+ // support the secondlife:///app/worldmap SLapp
+ LLFloaterReg::showInstance("world_map", "center");
+ return true;
+ }
+
+ // support the secondlife:///app/worldmap/{LOCATION}/{COORDS} SLapp
+ const std::string region_name = params[0].asString();
+ S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
+ S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
+ S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
+
+ LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
+ LLFloaterReg::showInstance("world_map", "center");
+
+ return true;
+ }
+};
+LLWorldMapHandler gWorldMapHandler;
+
+
LLFloaterWorldMap* gFloaterWorldMap = NULL;
class LLMapInventoryObserver : public LLInventoryObserver
@@ -150,7 +190,8 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mInventory(NULL),
mInventoryObserver(NULL),
mFriendObserver(NULL),
- mCompletingRegionName(""),
+ mCompletingRegionName(),
+ mCompletingRegionPos(),
mWaitingForTracker(FALSE),
mIsClosing(FALSE),
mSetToUserPosition(TRUE),
@@ -160,13 +201,12 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
gFloaterWorldMap = this;
mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL);
- mFactoryMap["terrain_mapview"] = LLCallbackMap(createWorldMapView, NULL);
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_world_map.xml", FALSE);
mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this));
mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this));
+ mCommitCallbackRegistrar.add("WMap.Landmark", boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this));
mCommitCallbackRegistrar.add("WMap.SearchResult", boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this));
- mCommitCallbackRegistrar.add("WMap.CommitLocation", boost::bind(&LLFloaterWorldMap::onCommitLocation, this));
mCommitCallbackRegistrar.add("WMap.GoHome", boost::bind(&LLFloaterWorldMap::onGoHome, this));
mCommitCallbackRegistrar.add("WMap.Teleport", boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
mCommitCallbackRegistrar.add("WMap.ShowTarget", boost::bind(&LLFloaterWorldMap::onShowTargetBtn, this));
@@ -183,17 +223,7 @@ void* LLFloaterWorldMap::createWorldMapView(void* data)
BOOL LLFloaterWorldMap::postBuild()
{
- mTabs = getChild<LLTabContainer>("maptab");
- if (!mTabs) return FALSE;
-
- mTabs->setCommitCallback(boost::bind(&LLFloaterWorldMap::onCommitBackground, this));
-
- // The following callback syncs the worlmap tabs with the images.
- // Commented out since it was crashing when LLWorldMap became a singleton.
- // We should be fine without it but override the onOpen method and put it
- // there if it turns out to be needed. -MG
- //
- //onCommitBackground();
+ mPanel = getChild<LLPanel>("objects_mapview");
LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo");
if (avatar_combo)
@@ -221,8 +251,8 @@ BOOL LLFloaterWorldMap::postBuild()
landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
}
- mCurZoomVal = log(gMapScale)/log(2.f);
- childSetValue("zoom slider", gMapScale);
+ mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
+ childSetValue("zoom slider", LLWorldMapView::sMapScale);
setDefaultBtn(NULL);
@@ -235,7 +265,7 @@ BOOL LLFloaterWorldMap::postBuild()
LLFloaterWorldMap::~LLFloaterWorldMap()
{
// All cleaned up by LLView destructor
- mTabs = NULL;
+ mPanel = NULL;
// Inventory deletes all observers on shutdown
mInventory = NULL;
@@ -268,7 +298,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
mIsClosing = FALSE;
LLWorldMapView* map_panel;
- map_panel = (LLWorldMapView*)mTabs->getCurrentPanel();
+ map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
map_panel->clearLastClick();
{
@@ -279,25 +309,18 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
}
map_panel->updateVisibleBlocks();
- // Reload the agent positions when we show the window
- LLWorldMap::getInstance()->eraseItems();
-
- // Reload any maps that may have changed
- LLWorldMap::getInstance()->clearSimFlags();
-
- const S32 panel_num = mTabs->getCurrentPanelIndex();
- const bool request_from_sim = true;
- LLWorldMap::getInstance()->setCurrentLayer(panel_num, request_from_sim);
+ // Reload items as they may have changed
+ LLWorldMap::getInstance()->reloadItems();
// We may already have a bounding box for the regions of the world,
// so use that to adjust the view.
adjustZoomSliderBounds();
// Could be first show
- LLFirstUse::useMap();
+ //LLFirstUse::useMap();
// Start speculative download of landmarks
- LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
gInventory.startBackgroundFetch(landmark_folder_id);
childSetFocus("location", TRUE);
@@ -321,12 +344,9 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
// static
void LLFloaterWorldMap::reloadIcons(void*)
{
- LLWorldMap::getInstance()->eraseItems();
-
- LLWorldMap::getInstance()->sendMapLayerRequest();
+ LLWorldMap::getInstance()->reloadItems();
}
-
// virtual
BOOL LLFloaterWorldMap::handleHover(S32 x, S32 y, MASK mask)
{
@@ -358,12 +378,6 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
void LLFloaterWorldMap::reshape( S32 width, S32 height, BOOL called_from_parent )
{
LLFloater::reshape( width, height, called_from_parent );
-
- // Might have changed size of world display area
- // JC: Technically, this is correct, but it makes the slider "pop"
- // if you resize the window, then draw the slider. Just leaving it
- // the way it was when you opened the window seems better.
- // adjustZoomSliderBounds();
}
@@ -427,7 +441,7 @@ void LLFloaterWorldMap::draw()
{
F64 seconds = LLTimer::getElapsedSeconds();
double value = fmod(seconds, 2);
- value = 0.5 + 0.5*cos(value * 3.14159f);
+ value = 0.5 + 0.5*cos(value * F_PI);
LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0);
childSetColor("location_icon", loading_color);
}
@@ -445,7 +459,7 @@ void LLFloaterWorldMap::draw()
childSetEnabled("Teleport", (BOOL)tracking_status);
// childSetEnabled("Clear", (BOOL)tracking_status);
- childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->mIsTrackingUnknownLocation);
+ childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking());
childSetEnabled("copy_slurl", (mSLURL.size() > 0) );
setMouseOpaque(TRUE);
@@ -465,6 +479,18 @@ void LLFloaterWorldMap::draw()
mCurZoomVal = lerp(mCurZoomVal, (F32)childGetValue("zoom slider").asReal(), interp);
F32 map_scale = 256.f*pow(2.f, mCurZoomVal);
LLWorldMapView::setScale( map_scale );
+
+ // Enable/disable checkboxes depending on the zoom level
+ // If above threshold level (i.e. low res) -> Disable all checkboxes
+ // If under threshold level (i.e. high res) -> Enable all checkboxes
+ bool enable = LLWorldMapView::showRegionInfo();
+ childSetEnabled("people_chk", enable);
+ childSetEnabled("infohub_chk", enable);
+ childSetEnabled("telehub_chk", enable);
+ childSetEnabled("land_for_sale_chk", enable);
+ childSetEnabled("event_chk", enable);
+ childSetEnabled("event_mature_chk", enable);
+ childSetEnabled("event_adult_chk", enable);
LLFloater::draw();
}
@@ -553,14 +579,14 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
{
mTrackedStatus = LLTracker::TRACKING_LOCATION;
- LLTracker::trackLocation(event_info.mPosGlobal, event_info.mName, event_info.mToolTip, LLTracker::LOCATION_EVENT);
+ LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT);
setDefaultBtn("Teleport");
}
void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item)
{
mTrackedStatus = LLTracker::TRACKING_LOCATION;
- LLTracker::trackLocation(item.mPosGlobal, item.mName, item.mToolTip, LLTracker::LOCATION_ITEM);
+ LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM);
setDefaultBtn("Teleport");
}
@@ -569,29 +595,27 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
if (!sim_info)
{
- LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE;
- LLWorldMap::getInstance()->mInvalidLocation = FALSE;
- LLWorldMap::getInstance()->mUnknownLocation = pos_global;
+ // We haven't found a region for that point yet, leave the tracking to the world map
+ LLWorldMap::getInstance()->setTracking(pos_global);
LLTracker::stopTracking(NULL);
S32 world_x = S32(pos_global.mdV[0] / 256);
S32 world_y = S32(pos_global.mdV[1] / 256);
- LLWorldMap::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
+ LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
setDefaultBtn("");
return;
}
- if (sim_info->mAccess == SIM_ACCESS_DOWN)
+ if (sim_info->isDown())
{
- // Down sim. Show the blue circle of death!
- LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE;
- LLWorldMap::getInstance()->mUnknownLocation = pos_global;
- LLWorldMap::getInstance()->mInvalidLocation = TRUE;
+ // Down region. Show the blue circle of death!
+ // i.e. let the world map that this and tell it it's invalid
+ LLWorldMap::getInstance()->setTracking(pos_global);
+ LLWorldMap::getInstance()->setTrackingInvalid();
LLTracker::stopTracking(NULL);
setDefaultBtn("");
return;
}
- std::string sim_name;
- LLWorldMap::getInstance()->simNameFromPosGlobal( pos_global, sim_name );
+ std::string sim_name = sim_info->getName();
F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
std::string full_name = llformat("%s (%d, %d, %d)",
@@ -603,9 +627,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
std::string tooltip("");
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(pos_global, full_name, tooltip);
- LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE;
- LLWorldMap::getInstance()->mIsTrackingDoubleClick = FALSE;
- LLWorldMap::getInstance()->mIsTrackingCommit = FALSE;
+ LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
setDefaultBtn("Teleport");
}
@@ -643,10 +665,6 @@ void LLFloaterWorldMap::updateLocation()
S32 agent_y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) );
S32 agent_z = llround( (F32)agentPos.mdV[VZ] );
- childSetValue("spin x", LLSD(agent_x) );
- childSetValue("spin y", LLSD(agent_y) );
- childSetValue("spin z", LLSD(agent_z) );
-
// Set the current SLURL
mSLURL = LLSLURL::buildSLURL(agent_sim_name, agent_x, agent_y, agent_z);
}
@@ -678,9 +696,6 @@ void LLFloaterWorldMap::updateLocation()
F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
- childSetValue("spin x", LLSD(region_x) );
- childSetValue("spin y", LLSD(region_y) );
- childSetValue("spin z", LLSD((F32)pos_global.mdV[VZ]) );
// simNameFromPosGlobal can fail, so don't give the user an invalid SLURL
if ( gotSimName )
@@ -712,15 +727,17 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3
{
// fill in UI based on URL
gFloaterWorldMap->childSetValue("location", region_name);
- childSetValue("spin x", LLSD((F32)x_coord));
- childSetValue("spin y", LLSD((F32)y_coord));
- childSetValue("spin z", LLSD((F32)z_coord));
+
+ // Save local coords to highlight position after region global
+ // position is returned.
+ gFloaterWorldMap->mCompletingRegionPos.set(
+ (F32)x_coord, (F32)y_coord, (F32)z_coord);
// pass sim name to combo box
gFloaterWorldMap->mCompletingRegionName = region_name;
- LLWorldMap::getInstance()->sendNamedRegionRequest(region_name);
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name);
LLStringUtil::toLower(gFloaterWorldMap->mCompletingRegionName);
- LLWorldMap::getInstance()->mIsTrackingCommit = TRUE;
+ LLWorldMap::getInstance()->setTrackingCommit();
}
}
@@ -771,8 +788,11 @@ void LLFloaterWorldMap::friendsChanged()
if(avatar_id.notNull())
{
LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
- if(!iface || !iface->setCurrentByID(avatar_id) ||
- !t.getBuddyInfo(avatar_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) || gAgent.isGodlike())
+ const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id);
+ if(!iface ||
+ !iface->setCurrentByID(avatar_id) ||
+ (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) ||
+ gAgent.isGodlike())
{
LLTracker::stopTracking(NULL);
}
@@ -787,19 +807,12 @@ void LLFloaterWorldMap::buildAvatarIDList()
// Delete all but the "None" entry
S32 list_size = list->getItemCount();
- while (list_size > 1)
+ if (list_size > 1)
{
- list->selectNthItem(1);
+ list->selectItemRange(1, -1);
list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
- --list_size;
}
- LLSD default_column;
- default_column["name"] = "friend name";
- default_column["label"] = "Friend Name";
- default_column["width"] = 500;
- list->addColumn(default_column);
-
// Get all of the calling cards for avatar that are currently online
LLCollectMappableBuddies collector;
LLAvatarTracker::instance().applyFunctor(collector);
@@ -820,10 +833,7 @@ void LLFloaterWorldMap::buildAvatarIDList()
void LLFloaterWorldMap::buildLandmarkIDLists()
{
LLCtrlListInterface *list = childGetListInterface("landmark combo");
- if (!list)
- {
- return;
- }
+ if (!list) return;
// Delete all but the "None" entry
S32 list_size = list->getItemCount();
@@ -864,7 +874,6 @@ void LLFloaterWorldMap::buildLandmarkIDLists()
mLandmarkAssetIDList.put( item->getAssetUUID() );
mLandmarkItemIDList.put( item->getUUID() );
}
- list->sortByColumn(std::string("landmark name"), TRUE);
list->selectFirstItem();
}
@@ -889,19 +898,7 @@ void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
{
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
}
- if (!childHasKeyboardFocus("spin x"))
- {
- childSetValue("spin x", SIM_COORD_DEFAULT);
- }
- if (!childHasKeyboardFocus("spin y"))
- {
- childSetValue("spin y", SIM_COORD_DEFAULT);
- }
- if (!childHasKeyboardFocus("spin z"))
- {
- childSetValue("spin z", 0);
- }
- LLWorldMap::getInstance()->mIsTrackingCommit = FALSE;
+ LLWorldMap::getInstance()->cancelTracking();
mCompletingRegionName = "";
}
@@ -937,18 +934,16 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)
// can see the whole world, plus a little.
void LLFloaterWorldMap::adjustZoomSliderBounds()
{
- // World size in regions
- S32 world_width_regions = LLWorldMap::getInstance()->getWorldWidth() / REGION_WIDTH_UNITS;
- S32 world_height_regions = LLWorldMap::getInstance()->getWorldHeight() / REGION_WIDTH_UNITS;
-
- // Pad the world size a little bit, so we have a nice border on
- // the edge
- world_width_regions++;
- world_height_regions++;
+ // Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed
+ // width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across
+ // sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit.
+ // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
+ S32 world_width_regions = MAX_VISIBLE_REGIONS;
+ S32 world_height_regions = MAX_VISIBLE_REGIONS;
// Find how much space we have to display the world
LLWorldMapView* map_panel;
- map_panel = (LLWorldMapView*)mTabs->getCurrentPanel();
+ map_panel = (LLWorldMapView*)mPanel;
LLRect view_rect = map_panel->getRect();
// View size in pixels
@@ -1161,15 +1156,15 @@ void LLFloaterWorldMap::onLocationCommit()
LLStringUtil::toLower(str);
mCompletingRegionName = str;
- LLWorldMap::getInstance()->mIsTrackingCommit = TRUE;
+ LLWorldMap::getInstance()->setTrackingCommit();
if (str.length() >= 3)
{
- LLWorldMap::getInstance()->sendNamedRegionRequest(str);
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str);
}
else
{
str += "#";
- LLWorldMap::getInstance()->sendNamedRegionRequest(str);
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str);
}
}
@@ -1177,8 +1172,8 @@ void LLFloaterWorldMap::onClearBtn()
{
mTrackedStatus = LLTracker::TRACKING_NOTHING;
LLTracker::stopTracking((void *)(intptr_t)TRUE);
- LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE;
- mSLURL = ""; // Clear the SLURL since it's invalid
+ LLWorldMap::getInstance()->cancelTracking();
+ mSLURL = ""; // Clear the SLURL since it's invalid
mSetToUserPosition = TRUE; // Revert back to the current user position
}
@@ -1206,7 +1201,7 @@ void LLFloaterWorldMap::onCopySLURL()
LLSD args;
args["SLURL"] = mSLURL;
- LLNotifications::instance().add("CopySLURL", args);
+ LLNotificationsUtil::add("CopySLURL", args);
}
// protected
@@ -1230,9 +1225,9 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
pos_global = LLTracker::getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();
}
}
- else if(LLWorldMap::getInstance()->mIsTrackingUnknownLocation)
+ else if(LLWorldMap::getInstance()->isTracking())
{
- pos_global = LLWorldMap::getInstance()->mUnknownLocation - gAgent.getCameraPositionGlobal();;
+ pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();;
}
else
{
@@ -1240,8 +1235,8 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
pos_global.clearVec();
}
- LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sPixelsPerMeter)),
- -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sPixelsPerMeter)),
+ LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
+ -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
!animate);
mWaitingForTracker = FALSE;
}
@@ -1399,13 +1394,6 @@ void LLFloaterWorldMap::flyToAvatar()
}
}
-void LLFloaterWorldMap::onCommitBackground()
-{
- // Find my index
- S32 index = mTabs->getCurrentPanelIndex();
- LLWorldMap::getInstance()->setCurrentLayer(index);
-}
-
void LLFloaterWorldMap::updateSims(bool found_null_sim)
{
if (mCompletingRegionName == "")
@@ -1422,24 +1410,23 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
S32 num_results = 0;
std::map<U64, LLSimInfo*>::const_iterator it;
- for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
+ for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
{
- LLSimInfo* info = (*it).second;
- std::string sim_name = info->mName;
- std::string sim_name_lower = sim_name;
+ LLSimInfo* info = it->second;
+ std::string sim_name_lower = info->getName();
LLStringUtil::toLower(sim_name_lower);
if (sim_name_lower.substr(0, name_length) == mCompletingRegionName)
{
if (sim_name_lower == mCompletingRegionName)
{
- match = sim_name;
+ match = info->getName();
}
LLSD value;
- value["id"] = sim_name;
+ value["id"] = info->getName();
value["columns"][0]["column"] = "sim_name";
- value["columns"][0]["value"] = sim_name;
+ value["columns"][0]["value"] = info->getName();
list->addElement(value);
num_results++;
}
@@ -1466,21 +1453,6 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
}
}
-void LLFloaterWorldMap::onCommitLocation()
-{
- LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
- if ( LLTracker::TRACKING_LOCATION == tracking_status)
- {
- LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
- F64 local_x = childGetValue("spin x");
- F64 local_y = childGetValue("spin y");
- F64 local_z = childGetValue("spin z");
- pos_global.mdV[VX] += -fmod(pos_global.mdV[VX], 256.0) + local_x;
- pos_global.mdV[VY] += -fmod(pos_global.mdV[VY], 256.0) + local_y;
- pos_global.mdV[VZ] = local_z;
- trackLocation(pos_global);
- }
-}
void LLFloaterWorldMap::onCommitSearchResult()
{
@@ -1496,21 +1468,26 @@ void LLFloaterWorldMap::onCommitSearchResult()
LLStringUtil::toLower(sim_name);
std::map<U64, LLSimInfo*>::const_iterator it;
- for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
+ for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
{
- LLSimInfo* info = (*it).second;
- std::string info_sim_name = info->mName;
- LLStringUtil::toLower(info_sim_name);
+ LLSimInfo* info = it->second;
- if (sim_name == info_sim_name)
+ if (info->isName(sim_name))
{
- LLVector3d pos_global = from_region_handle( info->mHandle );
- F64 local_x = childGetValue("spin x");
- F64 local_y = childGetValue("spin y");
- F64 local_z = childGetValue("spin z");
- pos_global.mdV[VX] += local_x;
- pos_global.mdV[VY] += local_y;
- pos_global.mdV[VZ] = local_z;
+ LLVector3d pos_global = info->getGlobalOrigin();
+
+ const F64 SIM_COORD_DEFAULT = 128.0;
+ LLVector3 pos_local(SIM_COORD_DEFAULT, SIM_COORD_DEFAULT, 0.0f);
+
+ // Did this value come from a trackURL() request?
+ if (!mCompletingRegionPos.isExactlyZero())
+ {
+ pos_local = mCompletingRegionPos;
+ mCompletingRegionPos.clear();
+ }
+ pos_global.mdV[VX] += (F64)pos_local.mV[VX];
+ pos_global.mdV[VY] += (F64)pos_local.mV[VY];
+ pos_global.mdV[VZ] = (F64)pos_local.mV[VZ];
childSetValue("location", sim_name);
trackLocation(pos_global);
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 20a8e6d321..00f5e788fb 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -96,7 +96,7 @@ public:
static const LLUUID& getHomeID() { return sHomeID; }
// A z_attenuation of 0.0f collapses the distance into the X-Y plane
- F32 getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const;
+ F32 getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const;
void clearLocationSelection(BOOL clear_ui = FALSE);
void clearAvatarSelection(BOOL clear_ui = FALSE);
@@ -121,8 +121,6 @@ protected:
void onAvatarComboPrearrange();
void onAvatarComboCommit();
- void onCommitBackground();
-
void onComboTextEntry( );
void onSearchTextEntry( LLLineEditor* ctrl );
@@ -150,15 +148,14 @@ protected:
void updateSearchEnabled();
void onLocationFocusChanged( LLFocusableElement* ctrl );
void onLocationCommit();
- void onCommitLocation();
void onCommitSearchResult();
void cacheLandmarkPosition();
-protected:
- LLTabContainer* mTabs;
+private:
+ LLPanel* mPanel; // Panel displaying the map
- // Sets gMapScale, in pixels per region
+ // Ties to LLWorldMapView::sMapScale, in pixels per region
F32 mCurZoomVal;
LLFrameTimer mZoomTimer;
@@ -172,6 +169,10 @@ protected:
LLFriendObserver* mFriendObserver;
std::string mCompletingRegionName;
+ // Local position from trackURL() request, used to select final
+ // position once region lookup complete.
+ LLVector3 mCompletingRegionPos;
+
std::string mLastRegionName;
BOOL mWaitingForTracker;
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index de18e74752..7d527fa98a 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -38,11 +38,14 @@
#include "llinventorybridge.h"
#include "llinventoryclipboard.h" // *TODO: remove this once hack below gone.
#include "llinventoryfilter.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
#include "llfoldertype.h"
#include "llfloaterinventory.h"// hacked in for the bonus context menu items.
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
+#include "llpanel.h"
#include "llpreview.h"
#include "llscrollcontainer.h" // hack to allow scrolling
#include "lltooldraganddrop.h"
@@ -54,6 +57,7 @@
#include "llviewermenu.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
+#include "llviewerfoldertype.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llfloaterproperties.h"
@@ -74,7 +78,7 @@
///----------------------------------------------------------------------------
const S32 RENAME_WIDTH_PAD = 4;
-const S32 RENAME_HEIGHT_PAD = 2;
+const S32 RENAME_HEIGHT_PAD = 1;
const S32 AUTO_OPEN_STACK_DEPTH = 16;
const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH
+ LLFolderViewItem::ICON_PAD
@@ -191,7 +195,8 @@ LLFolderView::LLFolderView(const Params& p)
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
mUseEllipses(false),
- mDraggingOverItem(NULL)
+ mDraggingOverItem(NULL),
+ mStatusTextBox(NULL)
{
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
@@ -202,7 +207,10 @@ LLFolderView::LLFolderView(const Params& p)
mAutoOpenCandidate = NULL;
mAutoOpenTimer.stop();
mKeyboardSelection = FALSE;
- mIndentation = -LEFT_INDENTATION; // children start at indentation 0
+ const LLFolderViewItem::Params& item_params =
+ LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+ S32 indentation = item_params.folder_indentation();
+ mIndentation = -indentation; // children start at indentation 0
gIdleCallbacks.addFunction(idle, this);
//clear label
@@ -214,16 +222,34 @@ LLFolderView::LLFolderView(const Params& p)
// Escape is handled by reverting the rename, not commiting it (default behavior)
LLLineEditor::Params params;
params.name("ren");
- params.rect(getRect());
+ params.rect(rect);
params.font(getLabelFontForStyle(LLFontGL::NORMAL));
params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);
params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2));
- params.prevalidate_callback(&LLLineEditor::prevalidatePrintableNotPipe);
+ params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe);
params.commit_on_focus_lost(true);
params.visible(false);
mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
addChild(mRenamer);
+ // Textbox
+ LLTextBox::Params text_p;
+ LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ LLRect new_r = LLRect(rect.mLeft + ICON_PAD,
+ rect.mTop - TEXT_PAD,
+ rect.mRight,
+ rect.mTop - TEXT_PAD - llfloor(font->getLineHeight()));
+ text_p.rect(new_r);
+ text_p.name(std::string(p.name));
+ text_p.font(font);
+ text_p.visible(false);
+ text_p.allow_html(true);
+ mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);
+ mStatusTextBox->setFollowsLeft();
+ mStatusTextBox->setFollowsTop();
+ //addChild(mStatusTextBox);
+
+
// make the popup menu available
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (!menu)
@@ -246,6 +272,7 @@ LLFolderView::~LLFolderView( void )
mScrollContainer = NULL;
mRenameItem = NULL;
mRenamer = NULL;
+ mStatusTextBox = NULL;
if( gEditMenuHandler == this )
{
@@ -327,6 +354,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
mFolders.insert(mFolders.begin(), folder);
}
+ folder->setShowLoadStatus(true);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -353,6 +381,16 @@ void LLFolderView::openFolder(const std::string& foldername)
}
}
+void LLFolderView::openTopLevelFolders()
+{
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ folders_t::iterator fit = iter++;
+ (*fit)->setOpen(TRUE);
+ }
+}
+
void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse)
{
// call base class to do proper recursion
@@ -379,8 +417,13 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
getRoot()->getFilter()->getShowFolderState();
S32 total_width = LEFT_PAD;
- S32 running_height = mDebugFilters ? llceil(sSmallFont->getLineHeight()) : 0;
+ S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0;
S32 target_height = running_height;
+ if(!mHasVisibleChildren)// is there any filtered items ?
+ {
+ //Nope. We need to display status textbox, let's reserve some place for it
+ target_height += mStatusTextBox->getTextPixelHeight();
+ }
S32 parent_item_height = getRect().getHeight();
for (folders_t::iterator iter = mFolders.begin();
@@ -397,7 +440,12 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
(folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
}
- if (folderp->getVisible())
+
+ // Need to call arrange regardless of visibility, since children's visibility
+ // might need to be changed too (e.g. even though a folder is invisible, its
+ // children also need to be set invisible for state-tracking purposes, e.g.
+ // llfolderviewitem::filter).
+ // if (folderp->getVisible())
{
S32 child_height = 0;
S32 child_width = 0;
@@ -465,13 +513,13 @@ void LLFolderView::filter( LLInventoryFilter& filter )
if (getCompletedFilterGeneration() < filter.getCurrentGeneration())
{
- mFiltered = FALSE;
+ mPassedFilter = FALSE;
mMinWidth = 0;
LLFolderViewFolder::filter(filter);
}
else
{
- mFiltered = TRUE;
+ mPassedFilter = TRUE;
}
}
@@ -548,6 +596,8 @@ LLFolderViewItem* LLFolderView::getCurSelectedItem( void )
BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL openitem,
BOOL take_keyboard_focus)
{
+ mSignalSelectCallback = take_keyboard_focus ? SIGNAL_KEYBOARD_FOCUS : SIGNAL_NO_KEYBOARD_FOCUS;
+
if( selection == this )
{
return FALSE;
@@ -575,8 +625,6 @@ BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL openitem,
llassert(mSelectedItems.size() <= 1);
- mSignalSelectCallback = take_keyboard_focus ? SIGNAL_KEYBOARD_FOCUS : SIGNAL_NO_KEYBOARD_FOCUS;
-
return rv;
}
@@ -729,6 +777,12 @@ void LLFolderView::sanitizeSelection()
}
}
}
+
+ // Don't allow invisible items (such as root folders) to be selected.
+ if (item->getHidden())
+ {
+ items_to_remove.push_back(item);
+ }
}
std::vector<LLFolderViewItem*>::iterator item_it;
@@ -748,7 +802,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible())
+ if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -769,6 +823,11 @@ void LLFolderView::sanitizeSelection()
{
// nothing selected to start with, so pick "My Inventory" as best guess
new_selection = getItemByID(gInventory.getRootFolderID());
+ // ... except if it's hidden from the UI.
+ if (new_selection && new_selection->getHidden())
+ {
+ new_selection = NULL;
+ }
}
if (new_selection)
@@ -788,10 +847,11 @@ void LLFolderView::clearSelection()
mSelectThisID.setNull();
}
-BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection)
+BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection) const
{
- selected_items_t::iterator item_it;
- for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+ for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
+ item_it != mSelectedItems.end();
+ ++item_it)
{
selection.insert((*item_it)->getListener()->getUUID());
}
@@ -834,12 +894,12 @@ void LLFolderView::draw()
{
std::string current_filter_string = llformat("Current Filter: %d, Least Filter: %d, Auto-accept Filter: %d",
mFilter->getCurrentGeneration(), mFilter->getMinRequiredGeneration(), mFilter->getMustPassGeneration());
- sSmallFont->renderUTF8(current_filter_string, 0, 2,
- getRect().getHeight() - sSmallFont->getLineHeight(), LLColor4(0.5f, 0.5f, 0.8f, 1.f),
+ LLFontGL::getFontMonospace()->renderUTF8(current_filter_string, 0, 2,
+ getRect().getHeight() - LLFontGL::getFontMonospace()->getLineHeight(), LLColor4(0.5f, 0.5f, 0.8f, 1.f),
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ //LLFontGL* font = getLabelFontForStyle(mLabelStyle);
// if cursor has moved off of me during drag and drop
// close all auto opened folders
@@ -876,19 +936,23 @@ void LLFolderView::draw()
|| mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
{
mStatusText.clear();
+ mStatusTextBox->setVisible( FALSE );
}
else
{
if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
- mStatusText = LLTrans::getString("InventoryNoMatchingItems");
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
+ mStatusTextBox->setValue(mStatusText);
+ mStatusTextBox->setVisible( TRUE );
+
}
LLFolderViewFolder::draw();
@@ -907,11 +971,7 @@ void LLFolderView::finishRenamingItem( void )
mRenameItem->rename( mRenamer->getText() );
}
- mRenamer->setCommitOnFocusLost( FALSE );
- mRenamer->setFocus( FALSE );
- mRenamer->setVisible( FALSE );
- mRenamer->setCommitOnFocusLost( TRUE );
- gFocusMgr.setTopCtrl( NULL );
+ gFocusMgr.setTopCtrl( NULL );
if( mRenameItem )
{
@@ -1107,7 +1167,7 @@ void LLFolderView::propertiesSelectedItems( void )
}
}
-void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type)
+void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type)
{
LLFolderBridge *folder_bridge = LLFolderBridge::sSelf;
@@ -1241,8 +1301,7 @@ BOOL LLFolderView::canCut() const
const LLFolderViewItem* item = *selected_it;
const LLFolderViewEventListener* listener = item->getListener();
- // *WARKAROUND: it is too many places where the "isItemRemovable" method should be changed with "const" modifier
- if (!listener || !(const_cast<LLFolderViewEventListener*>(listener))->isItemRemovable())
+ if (!listener || !listener->isItemRemovable())
{
return FALSE;
}
@@ -1360,6 +1419,7 @@ void LLFolderView::startRenamingSelectedItem( void )
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
mRenamer->setTopLostCallback(boost::bind(onRenamerLost, _1));
+ mRenamer->setFocusLostCallback(boost::bind(onRenamerLost, _1));
gFocusMgr.setTopCtrl( mRenamer );
}
}
@@ -1476,10 +1536,26 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
{
if (next == last_selected)
{
+ //special case for LLAccordionCtrl
+ if(notifyParent(LLSD().with("action","select_next")) > 0 )//message was processed
+ {
+ clearSelection();
+ return TRUE;
+ }
return FALSE;
}
setSelection( next, FALSE, TRUE );
}
+ else
+ {
+ //special case for LLAccordionCtrl
+ if(notifyParent(LLSD().with("action","select_next")) > 0 )//message was processed
+ {
+ clearSelection();
+ return TRUE;
+ }
+ return FALSE;
+ }
}
scrollToShowSelection();
mSearchString.clear();
@@ -1524,6 +1600,13 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
{
if (prev == this)
{
+ // If case we are in accordion tab notify parent to go to the previous accordion
+ if(notifyParent(LLSD().with("action","select_prev")) > 0 )//message was processed
+ {
+ clearSelection();
+ return TRUE;
+ }
+
return FALSE;
}
setSelection( prev, FALSE, TRUE );
@@ -1553,7 +1636,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
LLFolderViewItem* parent_folder = last_selected->getParentFolder();
if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
{
- setSelection(parent_folder, FALSE, TRUE);
+ // Don't change selectin to hidden folder. See EXT-5328.
+ if (!parent_folder->getHidden())
+ {
+ setSelection(parent_folder, FALSE, TRUE);
+ }
}
else
{
@@ -1795,6 +1882,13 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
BOOL handled = LLView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data,
accept, tooltip_msg);
+ // When there are no visible children drag and drop is handled
+ // by the folder which is the hierarchy root.
+ if (!handled && !hasVisibleChildren())
+ {
+ handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ }
+
if (handled)
{
lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderView" << llendl;
@@ -1803,15 +1897,6 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return handled;
}
-BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks)
-{
- if (mScrollContainer)
- {
- return mScrollContainer->handleScrollWheel(x, y, clicks);
- }
- return FALSE;
-}
-
void LLFolderView::deleteAllChildren()
{
if(mRenamer == gFocusMgr.getTopCtrl())
@@ -1856,8 +1941,8 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr
S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();
S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
- // when navigating with keyboard, only move top of folders on screen, otherwise show whole folder
- S32 max_height_to_show = mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();
+ // when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder
+ S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();
// get portion of item that we want to see...
LLRect item_local_rect = LLRect(item->getIndentation(),
@@ -1933,6 +2018,26 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
return NULL;
}
+LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
+{
+ if (id.isNull())
+ {
+ return this;
+ }
+
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();
+ ++iter)
+ {
+ LLFolderViewFolder *folder = (*iter);
+ if (folder->getListener()->getUUID() == id)
+ {
+ return folder;
+ }
+ }
+ return NULL;
+}
+
bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
{
std::string action = userdata.asString();
@@ -1957,7 +2062,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
if (action.length() > change_folder_string.length() &&
(action.compare(0,change_folder_string.length(),"change_folder_type_") == 0))
{
- LLAssetType::EType new_folder_type = LLFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
+ LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
changeType(model, new_folder_type);
return true;
}
@@ -2016,6 +2121,14 @@ static LLFastTimer::DeclareTimer FTM_INVENTORY("Inventory");
// Main idle routine
void LLFolderView::doIdle()
{
+ // If this is associated with the user's inventory, don't do anything
+ // until that inventory is loaded up.
+ const LLInventoryPanel *inventory_panel = dynamic_cast<LLInventoryPanel*>(mParentPanel);
+ if (inventory_panel && !inventory_panel->getIsViewsInitialized())
+ {
+ return;
+ }
+
LLFastTimer t2(FTM_INVENTORY);
BOOL debug_filters = gSavedSettings.getBOOL("DebugInventoryFilters");
@@ -2164,26 +2277,102 @@ void LLFolderView::updateRenamerPosition()
{
if(mRenameItem)
{
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
-
- S32 x = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD - 1 + mRenameItem->getIndentation();
- S32 y = llfloor(mRenameItem->getRect().getHeight() - font->getLineHeight()-2);
+ // See also LLFolderViewItem::draw()
+ S32 x = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mRenameItem->getIndentation();
+ S32 y = mRenameItem->getRect().getHeight() - mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;
mRenameItem->localPointToScreen( x, y, &x, &y );
screenPointToLocal( x, y, &x, &y );
mRenamer->setOrigin( x, y );
- LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidth(), 0);
+ LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidthScaled(), 0);
if (mScrollContainer)
{
scroller_rect = mScrollContainer->getContentWindowRect();
}
S32 width = llmax(llmin(mRenameItem->getRect().getWidth() - x, scroller_rect.getWidth() - x - getRect().mLeft), MINIMUM_RENAMER_WIDTH);
- S32 height = llfloor(font->getLineHeight() + RENAME_HEIGHT_PAD);
+ S32 height = mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;
mRenamer->reshape( width, height, TRUE );
}
}
+bool LLFolderView::selectFirstItem()
+{
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ LLFolderViewFolder* folder = (*iter );
+ if (folder->getVisible())
+ {
+ LLFolderViewItem* itemp = folder->getNextFromChild(0,true);
+ if(itemp)
+ setSelection(itemp,FALSE,TRUE);
+ return true;
+ }
+
+ }
+ for(items_t::iterator iit = mItems.begin();
+ iit != mItems.end(); ++iit)
+ {
+ LLFolderViewItem* itemp = (*iit);
+ if (itemp->getVisible())
+ {
+ setSelection(itemp,FALSE,TRUE);
+ return true;
+ }
+ }
+ return false;
+}
+bool LLFolderView::selectLastItem()
+{
+ for(items_t::reverse_iterator iit = mItems.rbegin();
+ iit != mItems.rend(); ++iit)
+ {
+ LLFolderViewItem* itemp = (*iit);
+ if (itemp->getVisible())
+ {
+ setSelection(itemp,FALSE,TRUE);
+ return true;
+ }
+ }
+ for (folders_t::reverse_iterator iter = mFolders.rbegin();
+ iter != mFolders.rend();)
+ {
+ LLFolderViewFolder* folder = (*iter);
+ if (folder->getVisible())
+ {
+ LLFolderViewItem* itemp = folder->getPreviousFromChild(0,true);
+ if(itemp)
+ setSelection(itemp,FALSE,TRUE);
+ return true;
+ }
+ }
+ return false;
+}
+
+
+S32 LLFolderView::notify(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "select_first")
+ {
+ setFocus(true);
+ selectFirstItem();
+ return 1;
+
+ }
+ else if(str_action == "select_last")
+ {
+ setFocus(true);
+ selectLastItem();
+ return 1;
+ }
+ }
+ return 0;
+}
+
///----------------------------------------------------------------------------
/// Local function definitions
@@ -2209,9 +2398,9 @@ void LLFolderView::setFilterPermMask( PermissionMask filter_perm_mask )
mFilter->setFilterPermissions(filter_perm_mask);
}
-U32 LLFolderView::getFilterTypes() const
+U32 LLFolderView::getFilterObjectTypes() const
{
- return mFilter->getFilterTypes();
+ return mFilter->getFilterObjectTypes();
}
PermissionMask LLFolderView::getFilterPermissions() const
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index ebfb4efde2..faf6a9cf23 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -41,25 +41,28 @@
#ifndef LL_LLFOLDERVIEW_H
#define LL_LLFOLDERVIEW_H
-// JAMESDEBUG - trim this list
-#include <vector>
-#include <map>
-#include <deque>
-#include <boost/function.hpp>
-#include <boost/signals2.hpp>
+#include "llfolderviewitem.h" // because LLFolderView is-a LLFolderViewFolder
#include "lluictrl.h"
#include "v4color.h"
#include "lldarray.h"
-//#include "llviewermenu.h"
#include "stdenums.h"
-#include "llfontgl.h"
-#include "lleditmenuhandler.h"
-#include "llviewertexture.h"
#include "lldepthstack.h"
+#include "lleditmenuhandler.h"
+#include "llfontgl.h"
#include "lltooldraganddrop.h"
-// JAMESDEBUG - move this up
-#include "llfolderviewitem.h" // because LLFolderView is-a LLFolderViewFolder
+#include "llviewertexture.h"
+
+class LLFolderViewEventListener;
+class LLFolderViewFolder;
+class LLFolderViewItem;
+class LLInventoryModel;
+class LLPanel;
+class LLLineEditor;
+class LLMenuGL;
+class LLScrollContainer;
+class LLUICtrl;
+class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFunctor
@@ -69,10 +72,6 @@
// that only work folders or only work on items, but I'll worry about
// that later when it's determined to be too slow.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFolderViewItem;
-class LLFolderViewFolder;
-
class LLFolderViewFunctor
{
public:
@@ -89,13 +88,6 @@ public:
// manages the screen region of the folder view.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFolderViewEventListener;
-class LLInventoryModel;
-class LLLineEditor;
-class LLMenuGL;
-class LLScrollContainer;
-class LLUICtrl;
-
class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
{
public:
@@ -125,7 +117,7 @@ public:
// filter is never null
LLInventoryFilter* getFilter();
const std::string getFilterSubString(BOOL trim = FALSE);
- U32 getFilterTypes() const;
+ U32 getFilterObjectTypes() const;
PermissionMask getFilterPermissions() const;
// JAMESDEBUG use getFilter()->getShowFolderState();
//LLInventoryFilter::EFolderShow getShowFolderState();
@@ -136,6 +128,7 @@ public:
// Close all folders in the view
void closeAllFolders();
void openFolder(const std::string& foldername);
+ void openTopLevelFolders();
virtual void toggleOpen() {};
virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse);
@@ -170,7 +163,7 @@ public:
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
- virtual BOOL getSelectionList(std::set<LLUUID> &selection);
+ virtual BOOL getSelectionList(std::set<LLUUID> &selection) const;
// make sure if ancestor is selected, descendents are not
void sanitizeSelection();
@@ -192,7 +185,7 @@ public:
void propertiesSelectedItems( void );
// change the folder type
- void changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type);
+ void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);
void autoOpenItem(LLFolderViewFolder* item);
void closeAutoOpenedFolders();
@@ -236,7 +229,6 @@ public:
EAcceptance* accept,
std::string& tooltip_msg);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
virtual void draw();
virtual void deleteAllChildren();
@@ -257,6 +249,7 @@ public:
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
void removeItemID(const LLUUID& id);
LLFolderViewItem* getItemByID(const LLUUID& id);
+ LLFolderViewFolder* getFolderByID(const LLUUID& id);
bool doToSelected(LLInventoryModel* model, const LLSD& userdata);
@@ -274,6 +267,8 @@ public:
LLPanel* getParentPanel() { return mParentPanel; }
// DEBUG only
void dumpSelectionInformation();
+
+ virtual S32 notify(const LLSD& info) ;
private:
void updateRenamerPosition();
@@ -286,6 +281,9 @@ protected:
void finishRenamingItem( void );
void closeRenamer( void );
+
+ bool selectFirstItem();
+ bool selectLastItem();
protected:
LLHandle<LLView> mPopupMenuHandle;
@@ -347,6 +345,8 @@ protected:
public:
static F32 sAutoOpenTime;
+ LLTextBox* mStatusTextBox;
+
};
bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index ff38da279a..12e100caf4 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -32,7 +32,10 @@
#define LLFOLDERVIEWEVENTLISTENER_H
#include "lldarray.h" // JAMESDEBUG convert to std::vector
+#include "llfoldertype.h"
#include "llfontgl.h" // just for StyleFlags enum
+#include "llinventorytype.h"
+#include "llpermissionsflags.h"
#include "llpointer.h"
@@ -57,8 +60,9 @@ public:
virtual const LLUUID& getUUID() const = 0;
virtual time_t getCreationDate() const = 0; // UTC seconds
virtual PermissionMask getPermissionMask() const = 0;
- virtual LLAssetType::EType getPreferredType() const = 0;
+ virtual LLFolderType::EType getPreferredType() const = 0;
virtual LLPointer<LLUIImage> getIcon() const = 0;
+ virtual LLPointer<LLUIImage> getOpenIcon() const { return getIcon(); }
virtual LLFontGL::StyleFlags getLabelStyle() const = 0;
virtual std::string getLabelSuffix() const = 0;
virtual void openItem( void ) = 0;
@@ -69,7 +73,8 @@ public:
virtual BOOL isItemRenameable() const = 0;
virtual BOOL renameItem(const std::string& new_name) = 0;
virtual BOOL isItemMovable( void ) const = 0; // Can be moved to another folder
- virtual BOOL isItemRemovable( void ) = 0; // Can be destroyed
+ virtual BOOL isItemRemovable( void ) const = 0; // Can be destroyed
+ virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual.
virtual BOOL removeItem() = 0;
virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) = 0;
virtual void move( LLFolderViewEventListener* parent_listener ) = 0;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index f83a426cda..76607e4874 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -38,24 +38,22 @@
#include "llfoldervieweventlistener.h"
#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
#include "llinventoryfilter.h"
-#include "llinventorymodel.h" // *TODO: make it take a pointer to an inventory-model interface
+#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerwindow.h" // Argh, only for setCursor()
// linden library includes
#include "llfocusmgr.h" // gFocusMgr
-#include "llpanel.h" // panel->hasFocus()
#include "lltrans.h"
///----------------------------------------------------------------------------
/// Class LLFolderViewItem
///----------------------------------------------------------------------------
+static LLDefaultChildRegistry::Register<LLFolderViewItem> r("folder_view_item");
+
// statics
std::map<U8, LLFontGL*> LLFolderViewItem::sFonts; // map of styles to fonts
-const LLFontGL* LLFolderViewItem::sSmallFont = NULL;
-LLUIImagePtr LLFolderViewItem::sArrowImage;
-LLUIImagePtr LLFolderViewItem::sBoxImage;
// only integers can be initialized in header
const F32 LLFolderViewItem::FOLDER_CLOSE_TIME_CONSTANT = 0.02f;
@@ -63,6 +61,7 @@ const F32 LLFolderViewItem::FOLDER_OPEN_TIME_CONSTANT = 0.03f;
const LLColor4U DEFAULT_WHITE(255, 255, 255);
+
//static
LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style)
{
@@ -83,33 +82,34 @@ LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style)
//static
void LLFolderViewItem::initClass()
{
- sSmallFont = LLFontGL::getFontMonospace();
- sArrowImage = LLUI::getUIImage("folder_arrow.tga");
- sBoxImage = LLUI::getUIImage("rounded_square.tga");
}
//static
void LLFolderViewItem::cleanupClass()
{
sFonts.clear();
- sArrowImage = NULL;
- sBoxImage = NULL;
}
// NOTE: Optimize this, we call it a *lot* when opening a large inventory
LLFolderViewItem::Params::Params()
-: icon("icon"),
- folder_arrow_image("folder_arrow_image", LLUI::getUIImage("folder_arrow.tga")),
- selection_image("selection_image", LLUI::getUIImage("rounded_square.tga"))
+: icon(),
+ icon_open(),
+ root(),
+ listener(),
+ folder_arrow_image("folder_arrow_image"),
+ folder_indentation("folder_indentation"),
+ selection_image("selection_image"),
+ item_height("item_height"),
+ item_top_pad("item_top_pad"),
+ creation_date()
{
mouse_opaque(true);
follows.flags(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_RIGHT);
- // JAMESDEBUG tab_stop(false);
}
// Default constructor
-LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
+LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
: LLView(p),
mLabelWidth(0),
mLabelWidthDirty(false),
@@ -120,8 +120,9 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
mLabelStyle( LLFontGL::NORMAL ),
mHasVisibleChildren(FALSE),
mIndentation(0),
+ mItemHeight(p.item_height),
mNumDescendantsSelected(0),
- mFiltered(FALSE),
+ mPassedFilter(FALSE),
mLastFilterGeneration(-1),
mStringMatchOffset(std::string::npos),
mControlLabelRotation(0.f),
@@ -133,9 +134,8 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
mIcon(p.icon),
mIconOpen(p.icon_open),
mListener(p.listener),
- mArrowImage(p.folder_arrow_image),
- mBoxImage(p.selection_image)
-, mDontShowInHierarhy(false)
+ mHidden(false),
+ mShowLoadStatus(false)
{
refresh();
}
@@ -197,7 +197,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
}
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
- while(itemp && !itemp->getVisible())
+
+ // Skip over items that are invisible or are hidden from the UI.
+ while(itemp && (!itemp->getVisible() || itemp->getHidden()))
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
@@ -223,17 +225,17 @@ BOOL LLFolderViewItem::potentiallyVisible()
BOOL LLFolderViewItem::getFiltered()
{
- return mFiltered && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
+ return mPassedFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
}
BOOL LLFolderViewItem::getFiltered(S32 filter_generation)
{
- return mFiltered && mLastFilterGeneration >= filter_generation;
+ return mPassedFilter && mLastFilterGeneration >= filter_generation;
}
void LLFolderViewItem::setFiltered(BOOL filtered, S32 filter_generation)
{
- mFiltered = filtered;
+ mPassedFilter = filtered;
mLastFilterGeneration = filter_generation;
}
@@ -248,13 +250,13 @@ void LLFolderViewItem::refreshFromListener()
if(mListener)
{
mLabel = mListener->getDisplayName();
- LLAssetType::EType preferred_type = mListener->getPreferredType();
+ LLFolderType::EType preferred_type = mListener->getPreferredType();
// *TODO: to be removed when database supports multi language. This is a
// temporary attempt to display the inventory folder in the user locale.
// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID
// it uses the same way to find localized string
- if (LLAssetType::lookupIsProtectedCategoryType(preferred_type))
+ if (LLFolderType::lookupIsProtectedType(preferred_type))
{
LLTrans::findString(mLabel, "InvFolder " + mLabel);
};
@@ -388,7 +390,13 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
// makes sure that this view and it's children are the right size.
S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
{
- mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0;
+ const Params& p = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+ S32 indentation = p.folder_indentation();
+ // Only indent deeper items in hierarchy
+ mIndentation = (getParentFolder()
+ && getParentFolder()->getParentFolder() )
+ ? mParentFolder->getIndentation() + indentation
+ : 0;
if (mLabelWidthDirty)
{
mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);
@@ -410,28 +418,30 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
S32 LLFolderViewItem::getItemHeight()
{
- if (mDontShowInHierarhy) return 0;
+ if (mHidden) return 0;
- S32 icon_height = mIcon->getHeight();
- S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
- return llmax( icon_height, label_height ) + ICON_PAD;
+ //S32 icon_height = mIcon->getHeight();
+ //S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
+ //return llmax( icon_height, label_height ) + ICON_PAD;
+ return mItemHeight;
}
void LLFolderViewItem::filter( LLInventoryFilter& filter)
{
- BOOL filtered = mListener && filter.check(this);
+ const BOOL previous_passed_filter = mPassedFilter;
+ const BOOL passed_filter = mListener && filter.check(this);
- // if our visibility will change as a result of this filter, then
+ // If our visibility will change as a result of this filter, then
// we need to be rearranged in our parent folder
- if (getVisible() != filtered)
+ if (mParentFolder)
{
- if (mParentFolder)
- {
+ if (getVisible() != passed_filter)
+ mParentFolder->requestArrange();
+ if (passed_filter != previous_passed_filter)
mParentFolder->requestArrange();
- }
}
- setFiltered(filtered, filter.getCurrentGeneration());
+ setFiltered(passed_filter, filter.getCurrentGeneration());
mStringMatchOffset = filter.getStringMatchOffset();
filter.decrementFilterCount();
@@ -599,6 +609,11 @@ const std::string& LLFolderViewItem::getSearchableLabel() const
return mSearchableLabel;
}
+LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
+{
+ return gInventory.getItem(getListener()->getUUID());
+}
+
std::string LLFolderViewItem::getName( void ) const
{
if(mListener)
@@ -734,15 +749,6 @@ BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask )
return TRUE;
}
-BOOL LLFolderViewItem::handleScrollWheel(S32 x, S32 y, S32 clicks)
-{
- if (getParent())
- {
- return getParent()->handleScrollWheel(x, y, clicks);
- }
- return FALSE;
-}
-
BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
{
if (LLView::childrenHandleMouseUp(x, y, mask))
@@ -818,16 +824,21 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderViewItem::draw()
{
- if (mDontShowInHierarhy) return;
+ if (mHidden) return;
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+ static LLUIColor sFocusOutlineColor =
+ LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemSuffixColor", DEFAULT_WHITE);
static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
+ const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+ const S32 TOP_PAD = default_params.item_top_pad;
+
bool possibly_has_children = false;
bool up_to_date = mListener && mListener->isUpToDate();
if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter...
@@ -837,13 +848,13 @@ void LLFolderViewItem::draw()
}
if(/*mControlLabel[0] != '\0' && */possibly_has_children)
{
- if (sArrowImage)
- {
- gl_draw_scaled_rotated_image(mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD,
- ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, sArrowImage->getImage(), sFgColor);
- }
+ LLUIImage* arrow_image = default_params.folder_arrow_image;
+ gl_draw_scaled_rotated_image(
+ mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD,
+ ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
}
+ // See also LLFolderView::updateRenamerPosition()
F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
LLFontGL* font = getLabelFontForStyle(mLabelStyle);
@@ -851,6 +862,10 @@ void LLFolderViewItem::draw()
// If we have keyboard focus, draw selection filled
BOOL show_context = getRoot()->getShowSelectionContext();
BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus());
+ const S32 FOCUS_LEFT = 1;
+ S32 focus_top = getRect().getHeight();
+ S32 focus_bottom = getRect().getHeight() - mItemHeight;
+ bool folder_open = (getRect().getHeight() > mItemHeight + 4);
// always render "current" item, only render other selected items if
// mShowSingleSelection is FALSE
@@ -858,7 +873,6 @@ void LLFolderViewItem::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLColor4 bg_color = sHighlightBgColor;
- //const S32 TRAILING_PAD = 5; // It just looks better with this.
if (!mIsCurSelection)
{
// do time-based fade of extra objects
@@ -876,35 +890,35 @@ void LLFolderViewItem::draw()
}
gl_rect_2d(
- 0,
- getRect().getHeight(),
+ FOCUS_LEFT,
+ focus_top,
getRect().getWidth() - 2,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
+ focus_bottom,
bg_color, filled);
if (mIsCurSelection)
{
gl_rect_2d(
- 0,
- getRect().getHeight(),
+ FOCUS_LEFT,
+ focus_top,
getRect().getWidth() - 2,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
- sHighlightFgColor, FALSE);
+ focus_bottom,
+ sFocusOutlineColor, FALSE);
}
- if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 4)
+ if (folder_open)
{
gl_rect_2d(
- 0,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4,
+ FOCUS_LEFT,
+ focus_bottom + 1, // overlap with bottom edge of above rect
getRect().getWidth() - 2,
- 2,
- sHighlightFgColor, FALSE);
+ 0,
+ sFocusOutlineColor, FALSE);
if (show_context)
{
gl_rect_2d(
- 0,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4,
+ FOCUS_LEFT,
+ focus_bottom + 1,
getRect().getWidth() - 2,
- 2,
+ 0,
sHighlightBgColor, TRUE);
}
}
@@ -913,32 +927,32 @@ void LLFolderViewItem::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gl_rect_2d(
- 0,
- getRect().getHeight(),
+ FOCUS_LEFT,
+ focus_top,
getRect().getWidth() - 2,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
+ focus_bottom,
sHighlightBgColor, FALSE);
-
- if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 2)
+ if (folder_open)
{
gl_rect_2d(
- 0,
- llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 2,
+ FOCUS_LEFT,
+ focus_bottom + 1, // overlap with bottom edge of above rect
getRect().getWidth() - 2,
- 2,
+ 0,
sHighlightBgColor, FALSE);
}
mDragAndDropTarget = FALSE;
}
+ S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
// First case is used for open folders
if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80))
{
- mIconOpen->draw(mIndentation + ARROW_SIZE + TEXT_PAD, getRect().getHeight() - mIcon->getHeight());
+ mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
}
else if(mIcon)
{
- mIcon->draw(mIndentation + ARROW_SIZE + TEXT_PAD, getRect().getHeight() - mIcon->getHeight());
+ mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
}
if (!mLabel.empty())
@@ -947,7 +961,7 @@ void LLFolderViewItem::draw()
BOOL debug_filters = getRoot()->getDebugFilters();
LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
F32 right_x;
- F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD;
+ F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
if (debug_filters)
{
@@ -957,25 +971,41 @@ void LLFolderViewItem::draw()
}
LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
- sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color,
+ LLFontGL::getFontMonospace()->renderUTF8(
+ mStatusText, 0, text_left, y, filter_color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
S32_MAX, S32_MAX, &right_x, FALSE );
text_left = right_x;
}
- if ( mIsLoading
- && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime") )
+ font->renderUTF8( mLabel, 0, text_left, y, color,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+
+// LLViewerInventoryCategory *item = 0;
+// if (getListener())
+// item = gInventory.getCategory(getListener()->getUUID());
+ bool root_is_loading = false;
+ if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID()))
+ {
+ // Descendent of my inventory.
+ root_is_loading = gInventory.myInventoryFetchInProgress();
+ }
+ if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID()))
+ {
+ // Descendent of library
+ root_is_loading = gInventory.libraryFetchInProgress();
+ }
+
+ if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+ || (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) )
{
- font->renderUTF8(LLTrans::getString("LoadingData"), 0, text_left, y, sSearchStatusColor,
+ std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
+ font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE);
- text_left = right_x;
}
- font->renderUTF8( mLabel, 0, text_left, y, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
-
if (!mLabelSuffix.empty())
{
font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
@@ -983,7 +1013,7 @@ void LLFolderViewItem::draw()
S32_MAX, S32_MAX, &right_x, FALSE );
}
- if (sBoxImage.notNull() && mStringMatchOffset != std::string::npos)
+ if (mStringMatchOffset != std::string::npos)
{
// don't draw backgrounds for zero-length strings
S32 filter_string_length = getRoot()->getFilterSubString().size();
@@ -992,16 +1022,17 @@ void LLFolderViewItem::draw()
std::string combined_string = mLabel + mLabelSuffix;
S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
- S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3);
- S32 top = getRect().getHeight();
-
+ S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
+ S32 top = getRect().getHeight() - TOP_PAD;
+
+ LLUIImage* box_image = default_params.selection_image;
LLRect box_rect(left, top, right, bottom);
- sBoxImage->draw(box_rect, sFilterBGColor);
+ box_image->draw(box_rect, sFilterBGColor);
F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
- F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD;
- font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y,
- sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- filter_string_length, S32_MAX, &right_x, FALSE );
+ F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+ font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
+ sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ filter_string_length, S32_MAX, &right_x, FALSE );
}
}
}
@@ -1242,7 +1273,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (getLastFilterGeneration() < filter_generation)
{
if (getLastFilterGeneration() >= must_pass_generation && // folder has been compared to a valid precursor filter
- !mFiltered) // and did not pass the filter
+ !mPassedFilter) // and did not pass the filter
{
// go ahead and flag this folder as done
mLastFilterGeneration = filter_generation;
@@ -1252,6 +1283,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// filter self only on first pass through
LLFolderViewItem::filter( filter );
}
+ if (mHidden)
+ {
+ setOpen();
+ }
}
if (getRoot()->getDebugFilters())
@@ -1285,9 +1320,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// now query children
for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ iter != mFolders.end();
+ ++iter)
{
- folders_t::iterator fit = iter++;
+ LLFolderViewFolder* folder = (*iter);
// have we run out of iterations this frame?
if (filter.getFilterCount() < 0)
{
@@ -1297,64 +1333,61 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// mMostFilteredDescendantGeneration might have been reset
// in which case we need to update it even for folders that
// don't need to be filtered anymore
- if ((*fit)->getCompletedFilterGeneration() >= filter_generation)
+ if (folder->getCompletedFilterGeneration() >= filter_generation)
{
// track latest generation to pass any child items
- if ((*fit)->getFiltered() || (*fit)->hasFilteredDescendants(filter.getMinRequiredGeneration()))
+ if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
- if (getRoot()->needsAutoSelect() && autoopen_folders)
- {
- (*fit)->setOpenArrangeRecursively(TRUE);
- }
}
// just skip it, it has already been filtered
continue;
}
// update this folders filter status (and children)
- (*fit)->filter( filter );
+ folder->filter( filter );
// track latest generation to pass any child items
- if ((*fit)->getFiltered() || (*fit)->hasFilteredDescendants(filter_generation))
+ if (folder->getFiltered() || folder->hasFilteredDescendants(filter_generation))
{
mMostFilteredDescendantGeneration = filter_generation;
if (getRoot()->needsAutoSelect() && autoopen_folders)
{
- (*fit)->setOpenArrangeRecursively(TRUE);
+ folder->setOpenArrangeRecursively(TRUE);
}
}
}
for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
+ iter != mItems.end();
+ ++iter)
{
- items_t::iterator iit = iter++;
+ LLFolderViewItem* item = (*iter);
if (filter.getFilterCount() < 0)
{
break;
}
- if ((*iit)->getLastFilterGeneration() >= filter_generation)
+ if (item->getLastFilterGeneration() >= filter_generation)
{
- if ((*iit)->getFiltered())
+ if (item->getFiltered())
{
mMostFilteredDescendantGeneration = filter_generation;
}
continue;
}
- if ((*iit)->getLastFilterGeneration() >= must_pass_generation &&
- !(*iit)->getFiltered(must_pass_generation))
+ if (item->getLastFilterGeneration() >= must_pass_generation &&
+ !item->getFiltered(must_pass_generation))
{
// failed to pass an earlier filter that was a subset of the current one
// go ahead and flag this item as done
- (*iit)->setFiltered(FALSE, filter_generation);
+ item->setFiltered(FALSE, filter_generation);
continue;
}
- (*iit)->filter( filter );
+ item->filter( filter );
- if ((*iit)->getFiltered(filter.getMinRequiredGeneration()))
+ if (item->getFiltered(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
}
@@ -1374,7 +1407,7 @@ void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
{
// if this folder is now filtered, but wasn't before
// (it just passed)
- if (filtered && !mFiltered)
+ if (filtered && !mPassedFilter)
{
// reset current height, because last time we drew it
// it might have had more visible items than now
@@ -1753,7 +1786,7 @@ bool LLFolderViewFolder::isTrash() const
{
if (mAmTrash == LLFolderViewFolder::UNKNOWN)
{
- mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;
+ mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;
}
return mAmTrash == LLFolderViewFolder::TRASH;
}
@@ -1822,10 +1855,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const
return SG_TRASH_FOLDER;
}
- // Folders that can't be moved are 'system' folders.
if( mListener )
{
- if( !(mListener->isItemMovable()) )
+ if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))
{
return SG_SYSTEM_FOLDER;
}
@@ -2023,6 +2055,22 @@ void LLFolderViewFolder::openItem( void )
toggleOpen();
}
+void LLFolderViewFolder::applyFunctorToChildren(LLFolderViewFunctor& functor)
+{
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ folders_t::iterator fit = iter++;
+ functor.doItem((*fit));
+ }
+ for (items_t::iterator iter = mItems.begin();
+ iter != mItems.end();)
+ {
+ items_t::iterator iit = iter++;
+ functor.doItem((*iit));
+ }
+}
+
void LLFolderViewFolder::applyFunctorRecursively(LLFolderViewFunctor& functor)
{
functor.doFolder(this);
@@ -2130,12 +2178,6 @@ BOOL LLFolderViewFolder::handleHover(S32 x, S32 y, MASK mask)
handled = LLFolderViewItem::handleHover(x, y, mask);
}
- //if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD && y > getRect().getHeight() - )
- //{
- // gViewerWindow->setCursor(UI_CURSOR_ARROW);
- // mExpanderHighlighted = TRUE;
- // handled = TRUE;
- //}
return handled;
}
@@ -2148,7 +2190,7 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
}
if( !handled )
{
- if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD)
+ if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD)
{
toggleOpen();
handled = TRUE;
@@ -2165,13 +2207,15 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
{
+ /* Disable outfit double click to wear
const LLUUID &cat_uuid = getListener()->getUUID();
const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);
- if (cat && cat->getPreferredType() == LLAssetType::AT_OUTFIT)
+ if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
{
getListener()->performAction(NULL, NULL,"replaceoutfit");
return TRUE;
}
+ */
BOOL handled = FALSE;
if( mIsOpen )
@@ -2180,7 +2224,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
}
if( !handled )
{
- if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD)
+ if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD)
{
// don't select when user double-clicks plus sign
// so as not to contradict single-click behavior
@@ -2490,17 +2534,21 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
&& b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
- static LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID();
LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID();
- if (a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)
+ if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id))
{
// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
// or to LLInvFVBridge
- S32 a_sort = (static_cast<const LLItemBridge*>(a->getListener()))->getItem()->getSortField();
- S32 b_sort = (static_cast<const LLItemBridge*>(b->getListener()))->getItem()->getSortField();
+ LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a->getListener()))->getItem();
+ LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b->getListener()))->getItem();
+ if (!aitem || !bitem)
+ return false;
+ S32 a_sort = aitem->getSortField();
+ S32 b_sort = bitem->getSortField();
return a_sort < b_sort;
}
}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 62a4b9a187..be8e73a5a9 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -45,6 +45,7 @@ class LLFolderViewListenerFunctor;
class LLInventoryFilter;
class LLMenuGL;
class LLUIImage;
+class LLViewerInventoryItem;
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.
@@ -92,7 +93,6 @@ public:
static void initClass();
static void cleanupClass();
- // jamesdebug was LLUICtrl::Params
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
Optional<LLUIImage*> icon;
@@ -101,7 +101,10 @@ public:
Optional<LLFolderViewEventListener*> listener;
Optional<LLUIImage*> folder_arrow_image;
+ Optional<S32> folder_indentation; // pixels
Optional<LLUIImage*> selection_image;
+ Optional<S32> item_height; // pixels
+ Optional<S32> item_top_pad; // pixels
Optional<S32> creation_date; //UTC seconds
@@ -110,7 +113,7 @@ public:
// layout constants
static const S32 LEFT_PAD = 5;
- static const S32 LEFT_INDENTATION = 13;
+ // LEFT_INDENTATION is set via folder_indentation above
static const S32 ICON_PAD = 2;
static const S32 ICON_WIDTH = 16;
static const S32 TEXT_PAD = 1;
@@ -120,15 +123,14 @@ public:
static const F32 FOLDER_CLOSE_TIME_CONSTANT;
static const F32 FOLDER_OPEN_TIME_CONSTANT;
+ // Mostly for debugging printout purposes.
+ const std::string& getSearchableLabel() { return mSearchableLabel; }
+
protected:
friend class LLUICtrlFactory;
friend class LLFolderViewEventListener;
- LLFolderViewItem(Params p = LLFolderViewItem::Params());
-
- static const LLFontGL* sSmallFont;
- static LLUIImagePtr sArrowImage;
- static LLUIImagePtr sBoxImage;
+ LLFolderViewItem(const Params& p);
std::string mLabel;
std::string mSearchableLabel;
@@ -147,18 +149,18 @@ protected:
LLUIImagePtr mIconOpen;
BOOL mHasVisibleChildren;
S32 mIndentation;
+ S32 mItemHeight;
S32 mNumDescendantsSelected;
- BOOL mFiltered;
+ BOOL mPassedFilter;
S32 mLastFilterGeneration;
std::string::size_type mStringMatchOffset;
F32 mControlLabelRotation;
LLFolderView* mRoot;
BOOL mDragAndDropTarget;
- LLUIImagePtr mArrowImage;
- LLUIImagePtr mBoxImage;
- BOOL mIsLoading;
- LLTimer mTimeSinceRequestStart;
- bool mDontShowInHierarhy;
+ BOOL mIsLoading;
+ LLTimer mTimeSinceRequestStart;
+ bool mHidden;
+ bool mShowLoadStatus;
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
@@ -201,8 +203,11 @@ public:
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
- void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarhy = dont_show; }
- bool getDontShowInHierarchy() { return mDontShowInHierarhy; }
+
+ // Hide the folder from the UI, such as if you want to hide the root
+ // folder in an inventory panel.
+ void setHidden(bool hidden) { mHidden = hidden; }
+ bool getHidden() const { return mHidden; }
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
@@ -230,7 +235,7 @@ public:
virtual void recursiveDeselect(BOOL deselect_self);
// gets multiple-element selection
- virtual BOOL getSelectionList(std::set<LLUUID> &selection){return TRUE;}
+ virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;}
// Returns true is this object and all of its children can be removed (deleted by user)
virtual BOOL isRemovable();
@@ -250,6 +255,8 @@ public:
BOOL getIsCurSelection() { return mIsCurSelection; }
BOOL hasVisibleChildren() { return mHasVisibleChildren; }
+
+ void setShowLoadStatus(bool status) { mShowLoadStatus = status; }
// Call through to the viewed object and return true if it can be
// removed. Returns true if it's removed.
@@ -281,6 +288,9 @@ public:
const LLFolderViewEventListener* getListener( void ) const { return mListener; }
LLFolderViewEventListener* getListener( void ) { return mListener; }
+
+ // Gets the inventory item if it exists (null otherwise)
+ LLViewerInventoryItem * getInventoryItem(void);
// just rename the object.
void rename(const std::string& new_name);
@@ -292,7 +302,7 @@ public:
// Show children (unfortunate that this is called "open")
virtual void setOpen(BOOL open = TRUE) {};
- virtual BOOL isOpen() { return FALSE; }
+ virtual BOOL isOpen() const { return FALSE; }
virtual LLFolderView* getRoot();
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
@@ -319,7 +329,6 @@ public:
virtual BOOL handleHover( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
- virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
// virtual void handleDropped();
virtual void draw();
@@ -329,7 +338,7 @@ public:
EAcceptance* accept,
std::string& tooltip_msg);
- private:
+private:
static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts
};
@@ -343,7 +352,7 @@ typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
//
// An instance of an LLFolderViewFolder represents a collection of
// more folders and items. This is used to build the hierarchy of
-// items found in the folder view. :)
+// items found in the folder view.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewFolder : public LLFolderViewItem
@@ -488,7 +497,7 @@ public:
virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
// Get the current state of the folder.
- virtual BOOL isOpen() { return mIsOpen; }
+ virtual BOOL isOpen() const { return mIsOpen; }
// special case if an object is dropped on the child.
BOOL handleDragAndDropFromChild(MASK mask,
@@ -501,6 +510,9 @@ public:
void applyFunctorRecursively(LLFolderViewFunctor& functor);
virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
+ // Just apply this functor to the folder's immediate children.
+ void applyFunctorToChildren(LLFolderViewFunctor& functor);
+
virtual void openItem( void );
virtual BOOL addItem(LLFolderViewItem* item);
virtual BOOL addFolder( LLFolderViewFolder* folder);
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index fbcaeee01f..ac060cef15 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llinventory.h"
+#include "llinventoryobserver.h"
#include "lltrans.h"
#include "llfriendcard.h"
@@ -43,27 +44,24 @@
// Constants;
-static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends";
-static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";
+static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends";
+static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All";
// helper functions
-/*
-mantipov *NOTE: unable to use
-LLTrans::getString("InvFolder Friends"); or
-LLTrans::getString("InvFolder FriendsAll");
-in next two functions to set localized folders' names because of there is a hack in the
-LLFolderViewItem::refreshFromListener() method for protected asset types.
-So, localized names will be got from the strings with "InvFolder LABEL_NAME" in the strings.xml
-*/
-inline const std::string& get_friend_folder_name()
+// NOTE: Usage of LLTrans::getString(); in next two functions to set localized
+// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener()
+// method for protected asset types.
+// So, localized names will be got from the strings with "InvFolder LABEL_NAME"
+// in the strings.xml
+inline const std::string get_friend_folder_name()
{
- return INVENTORY_STRING_FRIENDS_SUBFOLDER;
+ return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER);
}
-inline const std::string& get_friend_all_subfolder_name()
+inline const std::string get_friend_all_subfolder_name()
{
- return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER;
+ return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER);
}
void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to)
@@ -80,15 +78,51 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf(parentFolderUUID, cats, items,
+ gInventory.collectDescendentsIf(parentFolderUUID, cats, items,
LLInventoryModel::EXCLUDE_TRASH, matchFunctor);
- if (cats.count() == 1)
+ S32 cats_count = cats.count();
+
+ if (cats_count > 1)
{
- return cats.get(0)->getUUID();
+ LL_WARNS("LLFriendCardsManager")
+ << "There is more than one Friend card folder."
+ << "The first folder will be used."
+ << LL_ENDL;
}
- return LLUUID::null;
+ return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;
+}
+
+/**
+ * Class for fetching initial friend cards data
+ *
+ * Implemented to fix an issue when Inventory folders are in incomplete state.
+ * See EXT-2320, EXT-2061, EXT-1935, EXT-813.
+ * Uses a callback to sync Inventory Friends/All folder with agent's Friends List.
+ */
+class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+ typedef boost::function<void()> callback_t;
+
+ LLInitialFriendCardsFetch(callback_t cb)
+ : mCheckFolderCallback(cb) {}
+
+ /* virtual */ void done();
+
+private:
+ callback_t mCheckFolderCallback;
+};
+
+void LLInitialFriendCardsFetch::done()
+{
+ // This observer is no longer needed.
+ gInventory.removeObserver(this);
+
+ mCheckFolderCallback();
+
+ delete this;
}
// LLFriendCardsManager Constructor / Destructor
@@ -131,30 +165,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)
return rv;
}
-// be sure LLInventoryModel::buildParentChildMap() has been called before it.
-// and this method must be called before any actions with friend list
-void LLFriendCardsManager::ensureFriendFoldersExist()
-{
- LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
-
- LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
-
- if (friendFolderUUID.isNull())
- {
- friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID,
- LLAssetType::AT_CALLINGCARD, get_friend_folder_name());
- }
-
- LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl();
-
- if (friendAllSubfolderUUID.isNull())
- {
- friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID,
- LLAssetType::AT_CALLINGCARD, get_friend_all_subfolder_name());
- }
-}
-
-
bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item)
{
if (item->getType() != LLAssetType::AT_CALLINGCARD)
@@ -269,39 +279,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const
return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID);
}
-void LLFriendCardsManager::syncFriendsFolder()
+void LLFriendCardsManager::syncFriendCardsFolders()
{
- //lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent
- LLFriendCardsManager::instance().ensureFriendFoldersExist();
+ const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
- LLAvatarTracker::buddy_map_t all_buddies;
- LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- // 1. Remove Friend Cards for non-friends
- LLInventoryModel::cat_array_t cats;
- LLInventoryModel::item_array_t items;
-
- gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-
- LLInventoryModel::item_array_t::const_iterator it;
- for (it = items.begin(); it != items.end(); ++it)
- {
- lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
- if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
- {
- lldebugs << "NONEXISTS, so remove it" << llendl;
- removeFriendCardFromInventory((*it)->getCreatorUUID());
- }
- }
-
- // 2. Add missing Friend Cards for friends
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
- llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
- for(; buddy_it != all_buddies.end(); ++buddy_it)
- {
- const LLUUID& buddy_id = (*buddy_it).first;
- addFriendCardToInventory(buddy_id);
- }
+ fetchAndCheckFolderDescendents(callingCardsFolderID,
+ boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
}
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
@@ -351,7 +334,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud
/************************************************************************/
const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const
{
- LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+ const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
std::string friendFolderName = get_friend_folder_name();
@@ -367,13 +350,8 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
}
-const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const
+const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const
{
- // mantipov *HACK: get localaized name in the same way like in the LLFolderViewItem::refreshFromListener() method.
- // be sure these both methods are synchronized.
- // see also get_friend_folder_name() and get_friend_all_subfolder_name() functions
- std::string localizedName = LLTrans::getString("InvFolder " + folderLabel);
-
LLNameCategoryCollector matchFolderFunctor(localizedName);
return get_folder_uuid(parentFolderUUID, matchFolderFunctor);
@@ -422,6 +400,122 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve
}
}
+void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb)
+{
+ // This instance will be deleted in LLInitialFriendCardsFetch::done().
+ LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb);
+
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(folder_id);
+
+ fetch->fetchDescendents(folders);
+ if(fetch->isEverythingComplete())
+ {
+ // everything is already here - call done.
+ fetch->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(fetch);
+ }
+}
+
+// Make sure LLInventoryModel::buildParentChildMap() has been called before it.
+// This method must be called before any actions with friends list.
+void LLFriendCardsManager::ensureFriendsFolderExists()
+{
+ const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+ // If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder
+ // exists in "Friends", otherwise we create it.
+ LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+ if (friends_folder_ID.notNull())
+ {
+ fetchAndCheckFolderDescendents(friends_folder_ID,
+ boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
+ }
+ else
+ {
+ if (!gInventory.isCategoryComplete(calling_cards_folder_ID))
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID);
+ std::string cat_name = cat ? cat->getName() : "unknown";
+ llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+ }
+
+ friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
+
+ gInventory.createNewCategory(friends_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ syncFriendsFolder();
+ }
+}
+
+// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it.
+void LLFriendCardsManager::ensureFriendsAllFolderExists()
+{
+ LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
+ if (friends_all_folder_ID.notNull())
+ {
+ fetchAndCheckFolderDescendents(friends_all_folder_ID,
+ boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
+ }
+ else
+ {
+ LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+
+ if (!gInventory.isCategoryComplete(friends_folder_ID))
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
+ std::string cat_name = cat ? cat->getName() : "unknown";
+ llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+ }
+
+ friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ syncFriendsFolder();
+ }
+}
+
+void LLFriendCardsManager::syncFriendsFolder()
+{
+ LLAvatarTracker::buddy_map_t all_buddies;
+ LLAvatarTracker::instance().copyBuddyList(all_buddies);
+
+ // 1. Remove Friend Cards for non-friends
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+
+ gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+ LLInventoryModel::item_array_t::const_iterator it;
+ for (it = items.begin(); it != items.end(); ++it)
+ {
+ lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
+ if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
+ {
+ lldebugs << "NONEXISTS, so remove it" << llendl;
+ removeFriendCardFromInventory((*it)->getCreatorUUID());
+ }
+ }
+
+ // 2. Add missing Friend Cards for friends
+ LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+ llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
+ for(; buddy_it != all_buddies.end(); ++buddy_it)
+ {
+ const LLUUID& buddy_id = (*buddy_it).first;
+ addFriendCardToInventory(buddy_id);
+ }
+}
+
class CreateFriendCardCallback : public LLInventoryCallback
{
public:
@@ -434,9 +528,8 @@ public:
}
};
-bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
+void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
{
- LLInventoryModel* invModel = &gInventory;
bool shouldBeAdded = true;
std::string name;
@@ -458,11 +551,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
lldebugs << "is found in sentRequests: " << name << llendl;
}
- LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl();
- if (shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID))
- {
- shouldBeAdded = false;
- }
if (shouldBeAdded)
{
putAvatarData(avatarID);
@@ -471,10 +559,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
// TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not
LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback();
- create_inventory_callingcard(avatarID, friendListFolderID, cb);
+ create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb);
}
-
- return shouldBeAdded;
}
void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID)
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index 6ada342831..b94d5ec2c0 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -58,14 +58,6 @@ public:
}
/**
- * Ensures that all necessary folders are created in Inventory.
- *
- * For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders
- */
- void ensureFriendFoldersExist();
-
-
- /**
* Determines if specified Inventory Calling Card exists in any of lists
* in the Calling Card/Friends/ folder (Default, or Custom)
*/
@@ -88,9 +80,10 @@ public:
bool isAnyFriendCategory(const LLUUID& catID) const;
/**
- * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
+ * Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
+ * (creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.
*/
- void syncFriendsFolder();
+ void syncFriendCardsFolders();
/*!
* \brief
@@ -106,6 +99,8 @@ public:
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
private:
+ typedef boost::function<void()> callback_t;
+
LLFriendCardsManager();
~LLFriendCardsManager();
@@ -125,16 +120,35 @@ private:
return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));
}
- const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const;
+ const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const;
const LLUUID& findFriendFolderUUIDImpl() const;
const LLUUID& findFriendAllSubfolderUUIDImpl() const;
const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const;
+ void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb);
+
+ /**
+ * Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All"
+ * sub-folder and synchronizes its contents with buddies list.
+ */
+ void ensureFriendsFolderExists();
+
+ /**
+ * Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and
+ * synchronizes its contents with buddies list.
+ */
+ void ensureFriendsAllFolderExists();
+
+ /**
+ * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
+ */
+ void syncFriendsFolder();
+
/**
* Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder
*/
- bool addFriendCardToInventory(const LLUUID& avatarID);
+ void addFriendCardToInventory(const LLUUID& avatarID);
/**
* Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 59274c8638..0ba7bdf613 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -37,12 +37,12 @@
// system
#include <functional>
#include <algorithm>
-#include <boost/tokenizer.hpp>
// library
#include "lldatapacker.h"
#include "llinventory.h"
#include "llmultigesture.h"
+#include "llnotificationsutil.h"
#include "llstl.h"
#include "llstring.h" // todo: remove
#include "llvfile.h"
@@ -52,15 +52,18 @@
#include "llagent.h"
#include "lldelayedgestureerror.h"
#include "llinventorymodel.h"
-#include "llnotify.h"
#include "llviewermessage.h"
#include "llvoavatarself.h"
#include "llviewerstats.h"
#include "llnearbychatbar.h"
+#include "llappearancemgr.h"
// Longest time, in seconds, to wait for all animations to stop playing
const F32 MAX_WAIT_ANIM_SECS = 30.f;
+// If this gesture is a link, get the base gesture that this link points to,
+// otherwise just return this id.
+static const LLUUID& get_linked_uuid(const LLUUID& item_id);
// Lightweight constructor.
// init() does the heavy lifting.
@@ -70,6 +73,7 @@ LLGestureManager::LLGestureManager()
mActive(),
mLoadingCount(0)
{
+ mRetryIfMissing = true;
gInventory.addObserver(this);
}
@@ -94,6 +98,41 @@ void LLGestureManager::init()
// TODO
}
+void LLGestureManager::changed(U32 mask)
+{
+ LLInventoryFetchObserver::changed(mask);
+
+ if (mask & LLInventoryObserver::GESTURE)
+ {
+ // If there was a gesture label changed, update all the names in the
+ // active gestures and then notify observers
+ if (mask & LLInventoryObserver::LABEL)
+ {
+ for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)
+ {
+ if(it->second)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(it->first);
+ if(item)
+ {
+ it->second->mName = item->getName();
+ }
+ }
+ }
+ notifyObservers();
+ }
+ // If there was a gesture added or removed notify observers
+ // STRUCTURE denotes that the inventory item has been moved
+ // In the case of deleting gesture, it is moved to the trash
+ else if(mask & LLInventoryObserver::ADD ||
+ mask & LLInventoryObserver::REMOVE ||
+ mask & LLInventoryObserver::STRUCTURE)
+ {
+ notifyObservers();
+ }
+ }
+}
+
// Use this version when you have the item_id but not the asset_id,
// and you KNOW the inventory is loaded.
@@ -206,11 +245,16 @@ struct LLLoadInfo
// If inform_server is true, will send a message upstream to update
// the user_gesture_active table.
+/**
+ * It will load a gesture from remote storage
+ */
void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
const LLUUID& asset_id,
BOOL inform_server,
BOOL deactivate_similar)
{
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
if( !gAssetStorage )
{
llwarns << "LLGestureManager::activateGestureWithAsset without valid gAssetStorage" << llendl;
@@ -231,13 +275,13 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
// For now, put NULL into the item map. We'll build a gesture
// class object when the asset data arrives.
- mActive[item_id] = NULL;
+ mActive[base_item_id] = NULL;
// Copy the UUID
if (asset_id.notNull())
{
LLLoadInfo* info = new LLLoadInfo;
- info->mItemID = item_id;
+ info->mItemID = base_item_id;
info->mInformServer = inform_server;
info->mDeactivateSimilar = deactivate_similar;
@@ -257,7 +301,8 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
void LLGestureManager::deactivateGesture(const LLUUID& item_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+ item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end())
{
llwarns << "deactivateGesture for inactive gesture " << item_id << llendl;
@@ -277,7 +322,7 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id)
}
mActive.erase(it);
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, base_item_id);
// Inform the database of this change
LLMessageSystem* msg = gMessageSystem;
@@ -293,12 +338,15 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id)
gAgent.sendReliableMessage();
+ LLAppearanceManager::instance().removeCOFItemLinks(base_item_id, false);
+
notifyObservers();
}
void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id)
{
+ const LLUUID& base_in_item_id = get_linked_uuid(in_item_id);
std::vector<LLUUID> gest_item_ids;
// Deactivate all gestures that match
@@ -310,7 +358,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
// Don't deactivate the gesture we are looking for duplicates of
// (for replaceGesture)
- if (!gest || item_id == in_item_id)
+ if (!gest || item_id == base_in_item_id)
{
// legal, can have null pointers in list
++it;
@@ -385,14 +433,17 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
BOOL LLGestureManager::isGestureActive(const LLUUID& item_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+ item_map_t::iterator it = mActive.find(base_item_id);
return (it != mActive.end());
}
BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+ item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return FALSE;
LLMultiGesture* gesture = (*it).second;
@@ -401,21 +452,33 @@ BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
return gesture->mPlaying;
}
+BOOL LLGestureManager::isGesturePlaying(LLMultiGesture* gesture)
+{
+ if(!gesture)
+ {
+ return FALSE;
+ }
+
+ return gesture->mPlaying;
+}
+
void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+ item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end())
{
- llwarns << "replaceGesture for inactive gesture " << item_id << llendl;
+ llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl;
return;
}
LLMultiGesture* old_gesture = (*it).second;
stopGesture(old_gesture);
- mActive.erase(item_id);
+ mActive.erase(base_item_id);
- mActive[item_id] = new_gesture;
+ mActive[base_item_id] = new_gesture;
delete old_gesture;
old_gesture = NULL;
@@ -426,7 +489,7 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new
mDeactivateSimilarNames.clear();
LLLoadInfo* info = new LLLoadInfo;
- info->mItemID = item_id;
+ info->mItemID = base_item_id;
info->mInformServer = TRUE;
info->mDeactivateSimilar = FALSE;
@@ -443,16 +506,18 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new
void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
{
- item_map_t::iterator it = LLGestureManager::instance().mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+ item_map_t::iterator it = LLGestureManager::instance().mActive.find(base_item_id);
if (it == mActive.end())
{
- llwarns << "replaceGesture for inactive gesture " << item_id << llendl;
+ llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl;
return;
}
// mActive owns this gesture pointer, so clean up memory.
LLMultiGesture* gesture = (*it).second;
- LLGestureManager::instance().replaceGesture(item_id, gesture, new_asset_id);
+ LLGestureManager::instance().replaceGesture(base_item_id, gesture, new_asset_id);
}
void LLGestureManager::playGesture(LLMultiGesture* gesture)
@@ -476,7 +541,9 @@ void LLGestureManager::playGesture(LLMultiGesture* gesture)
// Convenience function that looks up the item_id for you.
void LLGestureManager::playGesture(const LLUUID& item_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+ item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return;
LLMultiGesture* gesture = (*it).second;
@@ -921,8 +988,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
delete info;
info = NULL;
-
- LLGestureManager::instance().mLoadingCount--;
+ LLGestureManager& self = LLGestureManager::instance();
+ self.mLoadingCount--;
if (0 == status)
{
@@ -944,16 +1011,16 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
{
if (deactivate_similar)
{
- LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id);
+ self.deactivateSimilarGestures(gesture, item_id);
// Display deactivation message if this was the last of the bunch.
- if (LLGestureManager::instance().mLoadingCount == 0
- && LLGestureManager::instance().mDeactivateSimilarNames.length() > 0)
+ if (self.mLoadingCount == 0
+ && self.mDeactivateSimilarNames.length() > 0)
{
// we're done with this set of deactivations
LLSD args;
- args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames;
- LLNotifications::instance().add("DeactivatedGesturesTrigger", args);
+ args["NAMES"] = self.mDeactivateSimilarNames;
+ LLNotificationsUtil::add("DeactivatedGesturesTrigger", args);
}
}
@@ -965,9 +1032,11 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
else
{
// Watch this item and set gesture name when item exists in inventory
- LLGestureManager::instance().watchItem(item_id);
+ item_ref_t ids;
+ ids.push_back(item_id);
+ self.fetchItems(ids);
}
- LLGestureManager::instance().mActive[item_id] = gesture;
+ self.mActive[item_id] = gesture;
// Everything has been successful. Add to the active list.
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
@@ -989,14 +1058,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
gAgent.sendReliableMessage();
}
+ callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id);
+
+ if(i_cb != self.mCallbackMap.end())
+ {
+ i_cb->second(gesture);
+ self.mCallbackMap.erase(i_cb);
+ }
- LLGestureManager::instance().notifyObservers();
+ self.notifyObservers();
}
else
{
llwarns << "Unable to load gesture" << llendl;
- LLGestureManager::instance().mActive.erase(item_id);
+ self.mActive.erase(item_id);
delete gesture;
gesture = NULL;
@@ -1065,7 +1141,9 @@ void LLGestureManager::stopGesture(LLMultiGesture* gesture)
void LLGestureManager::stopGesture(const LLUUID& item_id)
{
- item_map_t::iterator it = mActive.find(item_id);
+ const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+ item_map_t::iterator it = mActive.find(base_item_id);
if (it == mActive.end()) return;
LLMultiGesture* gesture = (*it).second;
@@ -1149,6 +1227,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)
void LLGestureManager::done()
{
+ bool notify = false;
for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)
{
if(it->second && it->second->mName.empty())
@@ -1157,8 +1236,24 @@ void LLGestureManager::done()
if(item)
{
it->second->mName = item->getName();
+ notify = true;
}
}
}
- notifyObservers();
+ if(notify)
+ {
+ notifyObservers();
+ }
}
+
+// static
+const LLUUID& get_linked_uuid(const LLUUID &item_id)
+{
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item && item->getIsLinkType())
+ {
+ return item->getLinkedUUID();
+ }
+ return item_id;
+}
+
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 947773d66d..3dd184ddc7 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -38,7 +38,7 @@
#include <vector>
#include "llassetstorage.h" // LLAssetType
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llsingleton.h"
#include "llviewerinventory.h"
@@ -54,9 +54,15 @@ public:
virtual void changed() = 0;
};
-class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
+class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver
{
public:
+
+ typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
+ // Maps inventory item_id to gesture
+ typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
+ typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
+
LLGestureManager();
~LLGestureManager();
@@ -97,6 +103,9 @@ public:
BOOL isGesturePlaying(const LLUUID& item_id);
+ BOOL isGesturePlaying(LLMultiGesture* gesture);
+
+ const item_map_t& getActiveGestures() const { return mActive; }
// Force a gesture to be played, for example, if it is being
// previewed.
void playGesture(LLMultiGesture* gesture);
@@ -106,7 +115,15 @@ public:
// Also remove from playing list
void stopGesture(LLMultiGesture* gesture);
void stopGesture(const LLUUID& item_id);
-
+ /**
+ * Add cb into callbackMap.
+ * Note:
+ * Manager will call cb after gesture will be loaded and will remove cb automatically.
+ */
+ void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb)
+ {
+ mCallbackMap[inv_item_id] = cb;
+ }
// Trigger the first gesture that matches this key.
// Returns TRUE if it finds a gesture bound to that key.
BOOL triggerGesture(KEY key, MASK mask);
@@ -123,6 +140,9 @@ public:
void removeObserver(LLGestureManagerObserver* observer);
void notifyObservers();
+ // Overriding so we can update active gesture names and notify observers
+ void changed(U32 mask);
+
BOOL matchPrefix(const std::string& in_str, std::string* out_str);
// Copy item ids into the vector
@@ -144,13 +164,7 @@ protected:
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
-public:
- BOOL mValid;
- std::vector<LLMultiGesture*> mPlaying;
-
- // Maps inventory item_id to gesture
- typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
-
+private:
// Active gestures.
// NOTE: The gesture pointer CAN BE NULL. This means that
// there is a gesture with that item_id, but the asset data
@@ -159,8 +173,11 @@ public:
S32 mLoadingCount;
std::string mDeactivateSimilarNames;
-
+
std::vector<LLGestureManagerObserver*> mObservers;
+ callback_map_t mCallbackMap;
+ std::vector<LLMultiGesture*> mPlaying;
+ BOOL mValid;
};
#endif
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 43fbe362d5..750a9d478f 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -67,7 +67,10 @@
#include "llresmgr.h"
#include "pipeline.h"
#include "llspatialpartition.h"
-
+
+// Height of the yellow selection highlight posts for land
+const F32 PARCEL_POST_HEIGHT = 0.666f;
+
BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
{
if(object && object->isAttachment())
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index c46eedbef2..00e2365ffd 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -35,14 +35,17 @@
#include "llgroupactions.h"
-// Viewer includes
+#include "message.h"
+
#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
#include "llgroupmgr.h"
#include "llimview.h" // for gIMMgr
+#include "llnotificationsutil.h"
#include "llsidetray.h"
#include "llstatusbar.h" // can_afford_transaction()
+#include "llimfloater.h"
//
// Globals
@@ -72,11 +75,12 @@ public:
return false;
}
+ //*TODO by what to replace showing groups floater?
if (tokens[0].asString() == "list")
{
if (tokens[1].asString() == "show")
{
- LLFloaterReg::showInstance("contacts", "groups");
+ //LLFloaterReg::showInstance("contacts", "groups");
return true;
}
return false;
@@ -99,9 +103,9 @@ public:
}
if (tokens[1].asString() == "inspect")
{
- LLSD key;
- key["group_id"] = group_id;
- LLFloaterReg::showInstance("inspect_group", key);
+ if (group_id.isNull())
+ return true;
+ LLGroupActions::show(group_id);
return true;
}
return false;
@@ -112,12 +116,43 @@ LLGroupHandler gGroupHandler;
// static
void LLGroupActions::search()
{
- LLFloaterReg::showInstance("search", LLSD().insert("category", "groups"));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "groups"));
+}
+
+// static
+void LLGroupActions::startCall(const LLUUID& group_id)
+{
+ // create a new group voice session
+ LLGroupData gdata;
+
+ if (!gAgent.getGroupData(group_id, gdata))
+ {
+ llwarns << "Error getting group data" << llendl;
+ return;
+ }
+
+ LLUUID session_id = gIMMgr->addSession(gdata.mName, IM_SESSION_GROUP_START, group_id, true);
+ if (session_id == LLUUID::null)
+ {
+ llwarns << "Error adding session" << llendl;
+ return;
+ }
+
+ // start the call
+ gIMMgr->autoStartCallOnStartup(session_id);
+
+ make_ui_sound("UISndStartIM");
}
// static
void LLGroupActions::join(const LLUUID& group_id)
{
+ if (!gAgent.canJoinGroups())
+ {
+ LLNotificationsUtil::add("JoinedTooManyGroups");
+ return;
+ }
+
LLGroupMgrGroupData* gdatap =
LLGroupMgr::getInstance()->getGroupData(group_id);
@@ -126,16 +161,21 @@ void LLGroupActions::join(const LLUUID& group_id)
S32 cost = gdatap->mMembershipFee;
LLSD args;
args["COST"] = llformat("%d", cost);
+ args["NAME"] = gdatap->mName;
LLSD payload;
payload["group_id"] = group_id;
if (can_afford_transaction(cost))
{
- LLNotifications::instance().add("JoinGroupCanAfford", args, payload, onJoinGroup);
+ if(cost > 0)
+ LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup);
+ else
+ LLNotificationsUtil::add("JoinGroupNoCost", args, payload, onJoinGroup);
+
}
else
{
- LLNotifications::instance().add("JoinGroupCannotAfford", args, payload);
+ LLNotificationsUtil::add("JoinGroupCannotAfford", args, payload);
}
}
else
@@ -148,7 +188,7 @@ void LLGroupActions::join(const LLUUID& group_id)
// static
bool LLGroupActions::onJoinGroup(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 1)
{
@@ -180,7 +220,7 @@ void LLGroupActions::leave(const LLUUID& group_id)
args["GROUP"] = gAgent.mGroups.get(i).mName;
LLSD payload;
payload["group_id"] = group_id;
- LLNotifications::instance().add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
+ LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
}
}
@@ -196,12 +236,14 @@ void LLGroupActions::activate(const LLUUID& group_id)
gAgent.sendReliableMessage();
}
-bool isGroupUIVisible()
+static bool isGroupUIVisible()
{
- LLPanel* panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray");
+ static LLPanel* panel = 0;
+ if(!panel)
+ panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray");
if(!panel)
return false;
- return panel->getVisible();
+ return panel->isInVisibleChain();
}
// static
@@ -271,7 +313,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
// static
-void LLGroupActions::startChat(const LLUUID& group_id)
+void LLGroupActions::startIM(const LLUUID& group_id)
{
if (group_id.isNull())
return;
@@ -279,10 +321,14 @@ void LLGroupActions::startChat(const LLUUID& group_id)
LLGroupData group_data;
if (gAgent.getGroupData(group_id, group_data))
{
- gIMMgr->addSession(
+ LLUUID session_id = gIMMgr->addSession(
group_data.mName,
IM_SESSION_GROUP_START,
group_id);
+ if (session_id != LLUUID::null)
+ {
+ LLIMFloater::show(session_id);
+ }
make_ui_sound("UISndStartIM");
}
else
@@ -294,6 +340,19 @@ void LLGroupActions::startChat(const LLUUID& group_id)
}
// static
+void LLGroupActions::endIM(const LLUUID& group_id)
+{
+ if (group_id.isNull())
+ return;
+
+ LLUUID session_id = gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id);
+ if (session_id != LLUUID::null)
+ {
+ gIMMgr->leaveSession(session_id);
+ }
+}
+
+// static
bool LLGroupActions::isInGroup(const LLUUID& group_id)
{
// *TODO: Move all the LLAgent group stuff into another class, such as
@@ -328,7 +387,7 @@ bool LLGroupActions::isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID&
// static
bool LLGroupActions::onLeaveGroup(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLUUID group_id = notification["payload"]["group_id"].asUUID();
if(option == 0)
{
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index 74c84d1561..e99df86cd9 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -88,12 +88,22 @@ public:
/**
* Start group instant messaging session.
*/
- static void startChat(const LLUUID& group_id);
+ static void startIM(const LLUUID& group_id);
+
+ /**
+ * End group instant messaging session.
+ */
+ static void endIM(const LLUUID& group_id);
/// Returns if the current user is a member of the group
static bool isInGroup(const LLUUID& group_id);
/**
+ * Start a group voice call.
+ */
+ static void startCall(const LLUUID& group_id);
+
+ /**
* Returns true if avatar is in group.
*
* Note that data about group members is loaded from server.
diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp
new file mode 100644
index 0000000000..5760242bc8
--- /dev/null
+++ b/indra/newview/llgroupiconctrl.cpp
@@ -0,0 +1,146 @@
+/**
+ * @file llgroupiconctrl.cpp
+ * @brief LLGroupIconCtrl class implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llgroupiconctrl.h"
+
+#include "llagent.h"
+/*
+#include "llavatarconstants.h"
+#include "llcallingcard.h" // for LLAvatarTracker
+#include "llavataractions.h"
+#include "llmenugl.h"
+#include "lluictrlfactory.h"
+
+#include "llcachename.h"
+#include "llagentdata.h"
+#include "llimfloater.h"
+*/
+
+static LLDefaultChildRegistry::Register<LLGroupIconCtrl> g_i("group_icon");
+
+LLGroupIconCtrl::Params::Params()
+: group_id("group_id")
+, draw_tooltip("draw_tooltip", true)
+, default_icon_name("default_icon_name")
+{
+}
+
+
+LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)
+: LLIconCtrl(p)
+, mGroupId(LLUUID::null)
+, mDrawTooltip(p.draw_tooltip)
+, mDefaultIconName(p.default_icon_name)
+{
+ mPriority = LLViewerFetchedTexture::BOOST_ICON;
+
+ if (p.group_id.isProvided())
+ {
+ LLSD value(p.group_id);
+ setValue(value);
+ }
+ else
+ {
+ LLIconCtrl::setValue(mDefaultIconName);
+ }
+}
+
+LLGroupIconCtrl::~LLGroupIconCtrl()
+{
+ LLGroupMgr::getInstance()->removeObserver(this);
+}
+
+void LLGroupIconCtrl::setValue(const LLSD& value)
+{
+ if (value.isUUID())
+ {
+ LLGroupMgr* gm = LLGroupMgr::getInstance();
+ if (mGroupId.notNull())
+ {
+ gm->removeObserver(this);
+ }
+
+ if (mGroupId != value.asUUID())
+ {
+ mGroupId = value.asUUID();
+ mID = mGroupId; // set LLGroupMgrObserver::mID to make callbacks work
+
+ // Check if cache already contains image_id for that group
+ if (!updateFromCache())
+ {
+ LLIconCtrl::setValue(mDefaultIconName);
+ gm->addObserver(this);
+ gm->sendGroupPropertiesRequest(mGroupId);
+ }
+ }
+ }
+ else
+ {
+ LLIconCtrl::setValue(value);
+ }
+}
+
+void LLGroupIconCtrl::changed(LLGroupChange gc)
+{
+ if (GC_PROPERTIES == gc)
+ {
+ updateFromCache();
+ }
+}
+
+bool LLGroupIconCtrl::updateFromCache()
+{
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mGroupId);
+ if (!group_data) return false;
+
+ if (group_data->mInsigniaID.notNull())
+ {
+ LLIconCtrl::setValue(group_data->mInsigniaID);
+ }
+ else
+ {
+ LLIconCtrl::setValue(mDefaultIconName);
+ }
+
+ if (mDrawTooltip && !group_data->mName.empty())
+ {
+ setToolTip(group_data->mName);
+ }
+ else
+ {
+ setToolTip(LLStringUtil::null);
+ }
+ return true;
+}
+
diff --git a/indra/newview/llgroupiconctrl.h b/indra/newview/llgroupiconctrl.h
new file mode 100644
index 0000000000..7ac2ca0219
--- /dev/null
+++ b/indra/newview/llgroupiconctrl.h
@@ -0,0 +1,92 @@
+/**
+ * @file llgroupiconctrl.h
+ * @brief LLGroupIconCtrl class declaration
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLGROUPICONCTRL_H
+#define LL_LLGROUPICONCTRL_H
+
+#include "lliconctrl.h"
+
+#include "llgroupmgr.h"
+
+/**
+ * Extends IconCtrl to show group icon wherever it is needed.
+ *
+ * It gets icon id by group id from the LLGroupMgr.
+ * If group data is not loaded yet it subscribes as LLGroupMgr observer and requests necessary data.
+ */
+class LLGroupIconCtrl
+ : public LLIconCtrl, public LLGroupMgrObserver
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
+ {
+ Optional <LLUUID> group_id;
+ Optional <bool> draw_tooltip;
+ Optional <std::string> default_icon_name;
+ Params();
+ };
+
+protected:
+ LLGroupIconCtrl(const Params&);
+ friend class LLUICtrlFactory;
+
+public:
+ virtual ~LLGroupIconCtrl();
+
+ /**
+ * Determines group icon id by group id and sets it as icon value.
+ *
+ * Icon id is got from the appropriate LLGroupMgrGroupData specified by group UUID.
+ * If necessary it requests necessary data from the LLGroupMgr.
+ *
+ * @params value - if LLUUID - it is processed as group id otherwise base method is called.
+ */
+ virtual void setValue(const LLSD& value);
+
+ // LLGroupMgrObserver observer trigger
+ virtual void changed(LLGroupChange gc);
+
+ const std::string& getGroupName() const { return mGroupName; }
+ void setDrawTooltip(bool value) { mDrawTooltip = value;}
+
+ const LLUUID& getGroupId() const { return mGroupId; }
+
+protected:
+ LLUUID mGroupId;
+ std::string mGroupName;
+ bool mDrawTooltip;
+ std::string mDefaultIconName;
+
+ bool updateFromCache();
+};
+
+#endif // LL_LLGROUPICONCTRL_H
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 2e2b2d5101..bcfb516b81 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -37,6 +37,7 @@
// libs
#include "llbutton.h"
#include "lliconctrl.h"
+#include "llmenugl.h"
#include "lltextbox.h"
#include "lltrans.h"
@@ -44,7 +45,10 @@
#include "llagent.h"
#include "llgroupactions.h"
#include "llfloaterreg.h"
+#include "lltextutil.h"
#include "llviewercontrol.h" // for gSavedSettings
+#include "llviewermenu.h" // for gMenuHolder
+#include "llvoiceclient.h"
static LLDefaultChildRegistry::Register<LLGroupList> r("group_list");
S32 LLGroupListItem::sIconWidth = 0;
@@ -68,6 +72,8 @@ public:
static const LLGroupComparator GROUP_COMPARATOR;
LLGroupList::Params::Params()
+: no_groups_msg("no_groups_msg")
+, no_filtered_groups_msg("no_filtered_groups_msg")
{
}
@@ -75,23 +81,35 @@ LLGroupList::Params::Params()
LLGroupList::LLGroupList(const Params& p)
: LLFlatListView(p)
, mDirty(true) // to force initial update
+ , mNoFilteredGroupsMsg(p.no_filtered_groups_msg)
+ , mNoGroupsMsg(p.no_groups_msg)
{
// Listen for agent group changes.
gAgent.addListener(this, "new group");
mShowIcons = gSavedSettings.getBOOL("GroupListShowIcons");
setCommitOnSelectionChange(true);
- // TODO: implement context menu
- // display a context menu appropriate for a list of group names
-// setContextMenu(LLScrollListCtrl::MENU_GROUP);
// Set default sort order.
setComparator(&GROUP_COMPARATOR);
+
+ // Set up context menu.
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("People.Groups.Action", boost::bind(&LLGroupList::onContextMenuItemClick, this, _2));
+ enable_registrar.add("People.Groups.Enable", boost::bind(&LLGroupList::onContextMenuItemEnable, this, _2));
+
+ LLMenuGL* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups.xml",
+ gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ if(context_menu)
+ mContextMenuHandle = context_menu->getHandle();
}
LLGroupList::~LLGroupList()
{
gAgent.removeListener(this);
+ LLView::deleteViewByHandle(mContextMenuHandle);
}
// virtual
@@ -103,6 +121,22 @@ void LLGroupList::draw()
LLFlatListView::draw();
}
+// virtual
+BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
+
+ LLMenuGL* context_menu = (LLMenuGL*)mContextMenuHandle.get();
+ if (context_menu)
+ {
+ context_menu->buildDrawLabels();
+ context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, context_menu, x, y);
+ }
+
+ return handled;
+}
+
void LLGroupList::setNameFilter(const std::string& filter)
{
if (mNameFilter != filter)
@@ -125,6 +159,18 @@ void LLGroupList::refresh()
LLUUID id;
bool have_filter = !mNameFilter.empty();
+ // set no items message depend on filter state & total count of groups
+ if (have_filter)
+ {
+ // groups were filtered
+ setNoItemsCommentText(mNoFilteredGroupsMsg);
+ }
+ else if (0 == count)
+ {
+ // user is not a member of any group
+ setNoItemsCommentText(mNoGroupsMsg);
+ }
+
clear();
for(S32 i = 0; i < count; ++i)
@@ -133,17 +179,18 @@ void LLGroupList::refresh()
const LLGroupData& group_data = gAgent.mGroups.get(i);
if (have_filter && !findInsensitive(group_data.mName, mNameFilter))
continue;
- addNewItem(id, group_data.mName, group_data.mInsigniaID, highlight_id == id, ADD_BOTTOM);
+ addNewItem(id, group_data.mName, group_data.mInsigniaID, ADD_BOTTOM);
}
// Sort the list.
sort();
- // add "none" to list at top
+ // Add "none" to list at top if filter not set (what's the point of filtering "none"?).
+ // but only if some real groups exists. EXT-4838
+ if (!have_filter && count > 0)
{
std::string loc_none = LLTrans::getString("GroupsNone");
- if (have_filter || findInsensitive(loc_none, mNameFilter))
- addNewItem(LLUUID::null, loc_none, LLUUID::null, highlight_id.isNull(), ADD_TOP);
+ addNewItem(LLUUID::null, loc_none, LLUUID::null, ADD_TOP);
}
selectItemByUUID(highlight_id);
@@ -171,16 +218,16 @@ void LLGroupList::toggleIcons()
// PRIVATE Section
//////////////////////////////////////////////////////////////////////////
-void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, BOOL is_bold, EAddPosition pos)
+void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, EAddPosition pos)
{
LLGroupListItem* item = new LLGroupListItem();
- item->setName(name);
item->setGroupID(id);
+ item->setName(name, mNameFilter);
item->setGroupIconID(icon_id);
-// item->setContextMenu(mContextMenu);
item->childSetVisible("info_btn", false);
+ item->childSetVisible("profile_btn", false);
item->setGroupIconVisible(mShowIcons);
addItem(item, id, pos);
@@ -201,6 +248,50 @@ bool LLGroupList::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD&
return false;
}
+bool LLGroupList::onContextMenuItemClick(const LLSD& userdata)
+{
+ std::string action = userdata.asString();
+ LLUUID selected_group = getSelectedUUID();
+
+ if (action == "view_info")
+ {
+ LLGroupActions::show(selected_group);
+ }
+ else if (action == "chat")
+ {
+ LLGroupActions::startIM(selected_group);
+ }
+ else if (action == "call")
+ {
+ LLGroupActions::startCall(selected_group);
+ }
+ else if (action == "activate")
+ {
+ LLGroupActions::activate(selected_group);
+ }
+ else if (action == "leave")
+ {
+ LLGroupActions::leave(selected_group);
+ }
+
+ return true;
+}
+
+bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)
+{
+ LLUUID selected_group_id = getSelectedUUID();
+ bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected
+
+ // each group including "none" can be activated
+ if (userdata.asString() == "activate")
+ return gAgent.getGroupID() != selected_group_id;
+
+ if (userdata.asString() == "call")
+ return real_group_selected && LLVoiceClient::voiceEnabled()&&gVoiceClient->voiceWorking();
+
+ return real_group_selected;
+}
+
/************************************************************************/
/* LLGroupListItem implementation */
/************************************************************************/
@@ -210,7 +301,6 @@ LLGroupListItem::LLGroupListItem()
mGroupIcon(NULL),
mGroupNameBox(NULL),
mInfoBtn(NULL),
-//mContextMenu(NULL), //TODO:
mGroupID(LLUUID::null)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_list_item.xml");
@@ -223,6 +313,11 @@ mGroupID(LLUUID::null)
}
}
+LLGroupListItem::~LLGroupListItem()
+{
+ LLGroupMgr::getInstance()->removeObserver(this);
+}
+
//virtual
BOOL LLGroupListItem::postBuild()
{
@@ -249,7 +344,10 @@ void LLGroupListItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", true);
if (mGroupID.notNull()) // don't show the info button for the "none" group
+ {
mInfoBtn->setVisible(true);
+ childSetVisible("profile_btn", true);
+ }
LLPanel::onMouseEnter(x, y, mask);
}
@@ -258,21 +356,27 @@ void LLGroupListItem::onMouseLeave(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", false);
mInfoBtn->setVisible(false);
+ childSetVisible("profile_btn", false);
LLPanel::onMouseLeave(x, y, mask);
}
-void LLGroupListItem::setName(const std::string& name)
+void LLGroupListItem::setName(const std::string& name, const std::string& highlight)
{
mGroupName = name;
- mGroupNameBox->setValue(name);
+ LLTextUtil::textboxSetHighlightedVal(mGroupNameBox, mGroupNameStyle, name, highlight);
mGroupNameBox->setToolTip(name);
}
void LLGroupListItem::setGroupID(const LLUUID& group_id)
{
+ LLGroupMgr::getInstance()->removeObserver(this);
+
+ mID = group_id;
mGroupID = group_id;
setActive(group_id == gAgent.getGroupID());
+
+ LLGroupMgr::getInstance()->addObserver(this);
}
void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)
@@ -303,6 +407,8 @@ void LLGroupListItem::setGroupIconVisible(bool visible)
//////////////////////////////////////////////////////////////////////////
void LLGroupListItem::setActive(bool active)
{
+ // *BUG: setName() overrides the style params.
+
// Active group should be bold.
LLFontDescriptor new_desc(mGroupNameBox->getDefaultFont()->getFontDesc());
@@ -311,20 +417,17 @@ void LLGroupListItem::setActive(bool active)
// is predefined as bold (SansSerifSmallBold, for example)
new_desc.setStyle(active ? LLFontGL::BOLD : LLFontGL::NORMAL);
LLFontGL* new_font = LLFontGL::getFont(new_desc);
- LLStyle::Params style_params;
- style_params.font = new_font;
+ mGroupNameStyle.font = new_font;
// *NOTE: You cannot set the style on a text box anymore, you must
// rebuild the text. This will cause problems if the text contains
// hyperlinks, as their styles will be wrong.
- std::string text = mGroupNameBox->getText();
- mGroupNameBox->setText(LLStringUtil::null);
- mGroupNameBox->appendText(text, false, style_params);
+ mGroupNameBox->setText(mGroupName, mGroupNameStyle);
}
void LLGroupListItem::onInfoBtnClick()
{
- LLFloaterReg::showInstance("inspect_group", LLSD().insert("group_id", mGroupID));
+ LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mGroupID));
}
void LLGroupListItem::onProfileBtnClick()
@@ -332,4 +435,11 @@ void LLGroupListItem::onProfileBtnClick()
LLGroupActions::show(mGroupID);
}
+void LLGroupListItem::changed(LLGroupChange gc)
+{
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID);
+ if(group_data)
+ setGroupIconID(group_data->mInsigniaID);
+}
+
//EOF
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index 8dbc13997c..f3ac676edd 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -37,6 +37,8 @@
#include "llflatlistview.h"
#include "llpanel.h"
#include "llpointer.h"
+#include "llstyle.h"
+#include "llgroupmgr.h"
/**
* Auto-updating list of agent groups.
@@ -51,6 +53,15 @@ class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener
public:
struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
{
+ /**
+ * Contains a message for empty list when user is not a member of any group
+ */
+ Optional<std::string> no_groups_msg;
+
+ /**
+ * Contains a message for empty list when all groups don't match passed filter
+ */
+ Optional<std::string> no_filtered_groups_msg;
Params();
};
@@ -58,6 +69,7 @@ public:
virtual ~LLGroupList();
virtual void draw(); // from LLView
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); // from LLView
void setNameFilter(const std::string& filter);
void toggleIcons();
@@ -66,12 +78,19 @@ public:
private:
void setDirty(bool val = true) { mDirty = val; }
void refresh();
- void addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, BOOL is_bold, EAddPosition pos = ADD_BOTTOM);
+ void addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, EAddPosition pos = ADD_BOTTOM);
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); // called on agent group list changes
+ bool onContextMenuItemClick(const LLSD& userdata);
+ bool onContextMenuItemEnable(const LLSD& userdata);
+
+ LLHandle<LLView> mContextMenuHandle;
+
bool mShowIcons;
bool mDirty;
std::string mNameFilter;
+ std::string mNoFilteredGroupsMsg;
+ std::string mNoGroupsMsg;
};
class LLButton;
@@ -79,9 +98,11 @@ class LLIconCtrl;
class LLTextBox;
class LLGroupListItem : public LLPanel
+ , public LLGroupMgrObserver
{
public:
LLGroupListItem();
+ ~LLGroupListItem();
/*virtual*/ BOOL postBuild();
/*virtual*/ void setValue(const LLSD& value);
void onMouseEnter(S32 x, S32 y, MASK mask);
@@ -90,11 +111,12 @@ public:
const LLUUID& getGroupID() const { return mGroupID; }
const std::string& getGroupName() const { return mGroupName; }
- void setName(const std::string& name);
+ void setName(const std::string& name, const std::string& highlight = LLStringUtil::null);
void setGroupID(const LLUUID& group_id);
void setGroupIconID(const LLUUID& group_icon_id);
void setGroupIconVisible(bool visible);
+ virtual void changed(LLGroupChange gc);
private:
void setActive(bool active);
void onInfoBtnClick();
@@ -106,6 +128,7 @@ private:
LLButton* mInfoBtn;
std::string mGroupName;
+ LLStyle::Params mGroupNameStyle;
static S32 sIconWidth; // icon width + padding
};
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 0626a5c3d3..6e7321f739 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -52,6 +52,7 @@
#include "llviewerwindow.h"
#include "llpanelgroup.h"
#include "llgroupactions.h"
+#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
#include <boost/regex.hpp>
@@ -676,9 +677,12 @@ void LLGroupMgrGroupData::sendRoleChanges()
break;
}
case RC_UPDATE_ALL:
+ // fall through
case RC_UPDATE_POWERS:
need_power_recalc = true;
+ // fall through
case RC_UPDATE_DATA:
+ // fall through
default:
{
LLGroupRoleData* group_role_data = (*role_it).second;
@@ -757,7 +761,16 @@ void LLGroupMgr::clearGroupData(const LLUUID& group_id)
void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)
{
- mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
+ if( observer->getID() != LLUUID::null )
+ mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
+}
+
+void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
+{
+ if(group_id.notNull() && observer)
+ {
+ mParticularObservers[group_id].insert(observer);
+ }
}
void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
@@ -782,6 +795,23 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
}
}
+void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
+{
+ if(group_id.isNull() || !observer)
+ {
+ return;
+ }
+
+ observer_map_t::iterator obs_it = mParticularObservers.find(group_id);
+ if(obs_it == mParticularObservers.end())
+ return;
+
+ obs_it->second.erase(observer);
+
+ if (obs_it->second.size() == 0)
+ mParticularObservers.erase(obs_it);
+}
+
LLGroupMgrGroupData* LLGroupMgr::getGroupData(const LLUUID& id)
{
group_map_t::iterator gi = mGroups.find(id);
@@ -1294,7 +1324,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
// *TODO: Translate
LLSD args;
args["MESSAGE"] = message;
- LLNotifications::instance().add("UnableToCreateGroup", args);
+ LLNotificationsUtil::add("UnableToCreateGroup", args);
}
}
@@ -1323,6 +1353,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
LLUUID group_id = gi->first;
if (gi->second->mChanged)
{
+ // notify LLGroupMgrObserver
// Copy the map because observers may remove themselves on update
observer_multimap_t observers = mObservers;
@@ -1334,6 +1365,18 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
oi->second->changed(gc);
}
gi->second->mChanged = FALSE;
+
+
+ // notify LLParticularGroupObserver
+ observer_map_t::iterator obs_it = mParticularObservers.find(group_id);
+ if(obs_it == mParticularObservers.end())
+ return;
+
+ observer_set_t& obs = obs_it->second;
+ for (observer_set_t::iterator ob_it = obs.begin(); ob_it != obs.end(); ++ob_it)
+ {
+ (*ob_it)->changed(group_id, gc);
+ }
}
}
}
@@ -1668,17 +1711,21 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
bool start_message = true;
LLMessageSystem* msg = gMessageSystem;
+
+
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!group_datap) return;
for (std::vector<LLUUID>::iterator it = member_ids.begin();
it != member_ids.end(); ++it)
{
+ LLUUID& ejected_member_id = (*it);
+
// Can't use 'eject' to leave a group.
- if ((*it) == gAgent.getID()) continue;
+ if (ejected_member_id == gAgent.getID()) continue;
// Make sure they are in the group, and we need the member data
- LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(*it);
+ LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(ejected_member_id);
if (mit != group_datap->mMembers.end())
{
// Add them to the message
@@ -1694,7 +1741,7 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
}
msg->nextBlock("EjectData");
- msg->addUUID("EjecteeID",(*it));
+ msg->addUUID("EjecteeID",ejected_member_id);
if (msg->isSendFull())
{
@@ -1702,17 +1749,23 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
start_message = true;
}
+ LLGroupMemberData* member_data = (*mit).second;
+
// Clean up groupmgr
- for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin();
- rit != (*mit).second->roleEnd(); ++rit)
+ for (LLGroupMemberData::role_list_t::iterator rit = member_data->roleBegin();
+ rit != member_data->roleEnd(); ++rit)
{
- if ((*rit).first.notNull())
+ if ((*rit).first.notNull() && (*rit).second!=0)
{
- (*rit).second->removeMember(*it);
+ (*rit).second->removeMember(ejected_member_id);
}
}
- delete (*mit).second;
- group_datap->mMembers.erase(*it);
+
+ group_datap->mMembers.erase(ejected_member_id);
+
+ // member_data was introduced and is used here instead of (*mit).second to avoid crash because of invalid iterator
+ // It becomes invalid after line with erase above. EXT-4778
+ delete member_data;
}
}
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index a0604be57e..2c86de8b97 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -45,6 +45,7 @@ class LLGroupMgrObserver
{
public:
LLGroupMgrObserver(const LLUUID& id) : mID(id){};
+ LLGroupMgrObserver() : mID(LLUUID::null){};
virtual ~LLGroupMgrObserver(){};
virtual void changed(LLGroupChange gc) = 0;
const LLUUID& getID() { return mID; }
@@ -52,6 +53,13 @@ protected:
LLUUID mID;
};
+class LLParticularGroupObserver
+{
+public:
+ virtual ~LLParticularGroupObserver(){}
+ virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
+};
+
class LLGroupRoleData;
class LLGroupMemberData
@@ -305,7 +313,9 @@ public:
~LLGroupMgr();
void addObserver(LLGroupMgrObserver* observer);
+ void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
void removeObserver(LLGroupMgrObserver* observer);
+ void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
LLGroupMgrGroupData* getGroupData(const LLUUID& id);
void sendGroupPropertiesRequest(const LLUUID& group_id);
@@ -354,13 +364,19 @@ public:
private:
void notifyObservers(LLGroupChange gc);
+ void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
void addGroup(LLGroupMgrGroupData* group_datap);
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
observer_multimap_t mObservers;
+
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
+
+ typedef std::set<LLParticularGroupObserver*> observer_set_t;
+ typedef std::map<LLUUID,observer_set_t> observer_map_t;
+ observer_map_t mParticularObservers;
};
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index eda1d3fc55..28b0e7356a 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -103,28 +103,29 @@ void LLHUDIcon::renderIcon(BOOL for_select)
// put icon above object, and in front
// RN: don't use drawable radius, it's fricking HUGE
- LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation());
icon_relative_pos.abs();
F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX],
mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY],
mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]);
F32 up_distance = 0.5f * distance_scale;
- LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f;
+ LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f;
LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position;
icon_to_cam.normVec();
icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f;
- mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin());
+ mDistance = dist_vec(icon_position, camera->getOrigin());
F32 alpha_factor = for_select ? 1.f : clamp_rescale(mDistance, DIST_START_FADE, DIST_END_FADE, 1.f, 0.f);
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
+ camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
F32 scale_factor = 1.f;
if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME)
@@ -145,8 +146,8 @@ void LLHUDIcon::renderIcon(BOOL for_select)
}
F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ;
- LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec;
- LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec;
+ LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
+ LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
LLVector3 lower_left = icon_position - (x_scale * 0.5f);
LLVector3 lower_right = icon_position + (x_scale * 0.5f);
@@ -226,26 +227,27 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
// put icon above object, and in front
// RN: don't use drawable radius, it's fricking HUGE
- LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation());
icon_relative_pos.abs();
F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX],
mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY],
mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]);
F32 up_distance = 0.5f * distance_scale;
- LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f;
+ LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f;
LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position;
icon_to_cam.normVec();
icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f;
- mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin());
+ mDistance = dist_vec(icon_position, camera->getOrigin());
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
+ camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
F32 scale_factor = 1.f;
if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME)
@@ -261,8 +263,8 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
}
F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ;
- LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec;
- LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec;
+ LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
+ LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
LLVector3 lower_left = icon_position - (x_scale * 0.5f);
LLVector3 lower_right = icon_position + (x_scale * 0.5f);
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index 886fe3da07..a02dc3355b 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -64,11 +64,12 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
const LLColor4& color,
const BOOL orthographic)
{
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
// Do cheap plane culling
- LLVector3 dir_vec = pos_agent - LLViewerCamera::getInstance()->getOrigin();
+ LLVector3 dir_vec = pos_agent - camera->getOrigin();
dir_vec /= dir_vec.magVec();
- if (wstr.empty() || (!orthographic && dir_vec * LLViewerCamera::getInstance()->getAtAxis() <= 0.f))
+ if (wstr.empty() || (!orthographic && dir_vec * camera->getAtAxis() <= 0.f))
{
return;
}
@@ -77,20 +78,20 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
LLVector3 up_axis;
if (orthographic)
{
- right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidth(), 0.f);
- up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeight());
+ right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f);
+ up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw());
}
else
{
- LLViewerCamera::getInstance()->getPixelVectors(pos_agent, up_axis, right_axis);
+ camera->getPixelVectors(pos_agent, up_axis, right_axis);
}
- LLCoordFrame render_frame = *LLViewerCamera::getInstance();
+ LLCoordFrame render_frame = *camera;
LLQuaternion rot;
if (!orthographic)
{
rot = render_frame.getQuaternion();
- rot = rot * LLQuaternion(-F_PI_BY_TWO, LLViewerCamera::getInstance()->getYAxis());
- rot = rot * LLQuaternion(F_PI_BY_TWO, LLViewerCamera::getInstance()->getXAxis());
+ rot = rot * LLQuaternion(-F_PI_BY_TWO, camera->getYAxis());
+ rot = rot * LLQuaternion(F_PI_BY_TWO, camera->getXAxis());
}
else
{
@@ -106,7 +107,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
//get the render_pos in screen space
F64 winX, winY, winZ;
- LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+ LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
S32 viewport[4];
viewport[0] = world_view_rect.mLeft;
viewport[1] = world_view_rect.mBottom;
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 55019f91f8..8ad94b957d 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -156,8 +156,8 @@ BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
if (mOnHUDAttachment)
{
- x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidth();
- y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeight();
+ x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidthScaled();
+ y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeightScaled();
}
else
{
@@ -287,7 +287,7 @@ void LLHUDText::renderText(BOOL for_select)
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
// *TODO: cache this image
- LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+ LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
// *TODO: make this a per-text setting
LLColor4 bg_color = LLUIColorTable::instance().getColor("BackgroundChatColor");
@@ -316,8 +316,8 @@ void LLHUDText::renderText(BOOL for_select)
if (mOnHUDAttachment)
{
- x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidth();
- y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeight();
+ x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidthRaw();
+ y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeightRaw();
}
else
{
@@ -351,8 +351,8 @@ void LLHUDText::renderText(BOOL for_select)
//if (mOnHUD)
//{
- // render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidth());
- // render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeight());
+ // render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidthScaled());
+ // render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeightScaled());
//}
//else
//{
@@ -606,7 +606,7 @@ void LLHUDText::addLine(const LLWString &wstr, const LLColor4& color, const LLFo
U32 line_length = 0;
do
{
- S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wline.length(), TRUE);
+ S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
mTextSegments.push_back(LLHUDTextSegment(iter->substr(line_length, segment_length), style, color));
line_length += segment_length;
}
@@ -642,7 +642,7 @@ void LLHUDText::setLabel(const LLWString &wlabel)
U32 line_length = 0;
do
{
- S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wstr.length(), TRUE);
+ S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
mLabelSegments.push_back(LLHUDTextSegment(iter->substr(line_length, segment_length), LLFontGL::NORMAL, mColor));
line_length += segment_length;
}
@@ -800,7 +800,7 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset)
screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY);
- LLRect world_rect = gViewerWindow->getVirtualWorldViewRect();
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT;
LLVector2 screen_center;
@@ -897,7 +897,7 @@ void LLHUDText::updateAll()
std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away());
// iterate from front to back, and set LOD based on current screen coverage
- F32 screen_area = (F32)(gViewerWindow->getWindowWidth() * gViewerWindow->getWindowHeight());
+ F32 screen_area = (F32)(gViewerWindow->getWindowWidthScaled() * gViewerWindow->getWindowHeightScaled());
F32 current_screen_area = 0.f;
std::vector<LLPointer<LLHUDText> >::reverse_iterator r_it;
for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it)
diff --git a/indra/newview/llhudview.cpp b/indra/newview/llhudview.cpp
index 027cd2ab07..261d9f1df7 100644
--- a/indra/newview/llhudview.cpp
+++ b/indra/newview/llhudview.cpp
@@ -71,20 +71,6 @@ void LLHUDView::draw()
LLView::draw();
}
-
-// public
-const LLColor4& LLHUDView::colorFromType(S32 type)
-{
- switch (type)
- {
- case 0:
- return LLColor4::green;
- default:
- return LLColor4::black;
- }
-}
-
-
/*virtual*/
BOOL LLHUDView::handleMouseDown(S32 x, S32 y, MASK mask)
{
diff --git a/indra/newview/llhudview.h b/indra/newview/llhudview.h
index 05ff9c8596..0946e2c5c8 100644
--- a/indra/newview/llhudview.h
+++ b/indra/newview/llhudview.h
@@ -47,8 +47,6 @@ public:
virtual void draw();
- const LLColor4& colorFromType(S32 type);
-
protected:
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
};
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index f3fec70ac9..9c0e7a158d 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,24 +34,31 @@
#include "llimfloater.h"
+#include "llnotificationsutil.h"
+
#include "llagent.h"
#include "llappviewer.h"
#include "llbutton.h"
#include "llbottomtray.h"
#include "llchannelmanager.h"
#include "llchiclet.h"
-#include "llfloaterchat.h"
#include "llfloaterreg.h"
+#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#include "lllayoutstack.h"
#include "lllineeditor.h"
#include "lllogchat.h"
#include "llpanelimcontrolpanel.h"
#include "llscreenchannel.h"
+#include "llsyswellwindow.h"
#include "lltrans.h"
#include "llchathistory.h"
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
+#include "llinventorymodel.h"
+#include "llrootview.h"
+#include "llspeakers.h"
LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -86,42 +93,69 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
case IM_SESSION_CONFERENCE_START:
mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
break;
- default:
+ case IM_SESSION_GROUP_START:
mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+ break;
+ case IM_SESSION_INVITE:
+ if (gAgent.isInGroup(mSessionID))
+ {
+ mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+ }
+ else
+ {
+ mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
+ }
+ break;
+ default: break;
}
}
+ setOverlapsScreenChannel(true);
+
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
}
void LLIMFloater::onFocusLost()
{
LLIMModel::getInstance()->resetActiveSessionID();
+
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
}
void LLIMFloater::onFocusReceived()
{
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
+
+ // return focus to the input field when active tab in the multitab container is clicked.
+ if (isChatMultiTab() && mInputEditor)
+ {
+ mInputEditor->setFocus(TRUE);
+ }
+
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
}
// virtual
void LLIMFloater::onClose(bool app_quitting)
{
setTyping(false);
+
+ // The source of much argument and design thrashing
+ // Should the window hide or the session close when the X is clicked?
+ //
+ // Last change:
+ // EXT-3516 X Button should end IM session, _ button should hide
gIMMgr->leaveSession(mSessionID);
}
/* static */
void LLIMFloater::newIMCallback(const LLSD& data){
- if (data["num_unread"].asInteger() > 0)
+ if (data["num_unread"].asInteger() > 0 || data["from_id"].asUUID().isNull())
{
LLUUID session_id = data["session_id"].asUUID();
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (floater == NULL)
- {
- llwarns << "new_im_callback for non-existent session_id " << session_id << llendl;
- return;
- }
+ if (floater == NULL) return;
// update if visible, otherwise will be updated when opened
if (floater->getVisible())
@@ -196,11 +230,18 @@ void LLIMFloater::sendMsg()
LLIMFloater::~LLIMFloater()
{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
}
//virtual
BOOL LLIMFloater::postBuild()
{
+ // User-resizable control panels in P2P sessions look ugly (EXT-3470).
+ if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE)
+ {
+ getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE);
+ }
+
const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
if (other_party_id.notNull())
{
@@ -208,6 +249,7 @@ BOOL LLIMFloater::postBuild()
}
mControlPanel->setSessionId(mSessionID);
+ mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
LLButton* slide_left = getChild<LLButton>("slide_left_btn");
slide_left->setVisible(mControlPanel->getVisible());
@@ -222,18 +264,25 @@ BOOL LLIMFloater::postBuild()
// enable line history support for instant message bar
mInputEditor->setEnableLineHistory(TRUE);
+
mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) );
mInputEditor->setKeystrokeCallback( onInputEditorKeystroke, this );
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setRevertOnEsc( FALSE );
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
+ mInputEditor->setPassDelete( TRUE );
+
+ std::string session_name(LLIMModel::instance().getName(mSessionID));
+
+ mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + session_name);
+
+ setTitle(session_name);
childSetCommitCallback("chat_editor", onSendMsg, this);
mChatHistory = getChild<LLChatHistory>("chat_history");
-
- setTitle(LLIMModel::instance().getName(mSessionID));
+
setDocked(true);
mTypingStart = LLTrans::getString("IM_typing_start_string");
@@ -250,7 +299,14 @@ BOOL LLIMFloater::postBuild()
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
//see LLFloaterIMPanel for how it is done (IB)
- return LLDockableFloater::postBuild();
+ if(isChatMultiTab())
+ {
+ return LLFloater::postBuild();
+ }
+ else
+ {
+ return LLDockableFloater::postBuild();
+ }
}
// virtual
@@ -265,7 +321,7 @@ void LLIMFloater::draw()
}
}
- LLFloater::draw();
+ LLTransientDockableFloater::draw();
}
@@ -299,57 +355,104 @@ void* LLIMFloater::createPanelAdHocControl(void* userdata)
void LLIMFloater::onSlide()
{
- LLPanel* im_control_panel = getChild<LLPanel>("panel_im_control_panel");
- im_control_panel->setVisible(!im_control_panel->getVisible());
+ mControlPanel->setVisible(!mControlPanel->getVisible());
+
+ gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getVisible());
- getChild<LLButton>("slide_left_btn")->setVisible(im_control_panel->getVisible());
- getChild<LLButton>("slide_right_btn")->setVisible(!im_control_panel->getVisible());
+ getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getVisible());
+ getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getVisible());
+
+ LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels");
+ if (stack) stack->setAnimate(true);
}
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
- //hide all
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
- iter != inst_list.end(); ++iter)
+ if (!gIMMgr->hasSession(session_id)) return NULL;
+
+ if(!isChatMultiTab())
{
- LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
- if (floater && floater->isDocked())
+ //hide all
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+ iter != inst_list.end(); ++iter)
{
- floater->setVisible(false);
+ LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+ if (floater && floater->isDocked())
+ {
+ floater->setVisible(false);
+ }
}
}
- LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
+ bool exist = findInstance(session_id);
- floater->updateMessages();
- floater->mInputEditor->setFocus(TRUE);
+ LLIMFloater* floater = getInstance(session_id);
+ if (!floater) return NULL;
- if (floater->getDockControl() == NULL)
+ if(isChatMultiTab())
{
- LLChiclet* chiclet =
- LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
- session_id);
- if (chiclet == NULL)
+ LLIMFloaterContainer* floater_container = LLIMFloaterContainer::getInstance();
+
+ // do not add existed floaters to avoid adding torn off instances
+ if (!exist)
{
- llerror("Dock chiclet for LLIMFloater doesn't exists", 0);
+ // LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+ // TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+ LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+
+ if (floater_container)
+ {
+ floater_container->addFloater(floater, TRUE, i_pt);
+ }
}
- else
+
+ floater->openFloater(floater->getKey());
+ }
+ else
+ {
+ // Docking may move chat window, hide it before moving, or user will see how window "jumps"
+ floater->setVisible(false);
+
+ if (floater->getDockControl() == NULL)
{
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ LLChiclet* chiclet =
+ LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
+ session_id);
+ if (chiclet == NULL)
+ {
+ llerror("Dock chiclet for LLIMFloater doesn't exists", 0);
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
}
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
+ // window is positioned, now we can show it.
}
+ floater->setVisible(TRUE);
return floater;
}
void LLIMFloater::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRect();
+ rect = gViewerWindow->getWorldViewRectRaw();
+ static S32 right_padding = 0;
+ if (right_padding == 0)
+ {
+ LLPanel* side_bar_tabs =
+ gViewerWindow->getRootView()->getChild<LLPanel> (
+ "side_bar_tabs");
+ right_padding = side_bar_tabs->getRect().getWidth();
+ LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+ }
+ rect.mRight -= right_padding;
}
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
@@ -358,15 +461,17 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-
- setCanResize(!docked);
- LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+ if(!isChatMultiTab())
+ {
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+ }
// update notification channel state
if(channel)
{
channel->updateShowToastsState();
+ channel->redrawToasts();
}
}
@@ -381,34 +486,82 @@ void LLIMFloater::setVisible(BOOL visible)
if(channel)
{
channel->updateShowToastsState();
+ channel->redrawToasts();
+ }
+
+ BOOL is_minimized = visible && isChatMultiTab()
+ ? LLIMFloaterContainer::getInstance()->isMinimized()
+ : !visible;
+
+ if (!is_minimized && mChatHistory && mInputEditor)
+ {
+ //only if floater was construced and initialized from xml
+ updateMessages();
+ //prevent steal focus when IM opened in multitab mode
+ if (!isChatMultiTab())
+ {
+ mInputEditor->setFocus(TRUE);
+ }
+ }
+
+ if(!visible)
+ {
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
+ if(chiclet)
+ {
+ chiclet->setToggleState(false);
+ }
}
}
-//static
-bool LLIMFloater::toggle(const LLUUID& session_id)
+BOOL LLIMFloater::getVisible()
{
- LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (floater && floater->getVisible() && floater->isDocked())
+ if(isChatMultiTab())
{
- // clicking on chiclet to close floater just hides it to maintain existing
- // scroll/text entry state
- floater->setVisible(false);
- return false;
+ LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance();
+
+ // Treat inactive floater as invisible.
+ bool is_active = im_container->getActiveFloater() == this;
+
+ //torn off floater is always inactive
+ if (!is_active && getHost() != im_container)
+ {
+ return LLTransientDockableFloater::getVisible();
+ }
+
+ // getVisible() returns TRUE when Tabbed IM window is minimized.
+ return is_active && !im_container->isMinimized() && im_container->getVisible();
}
- else if(floater && !floater->isDocked())
+ else
{
- floater->setVisible(TRUE);
- floater->setFocus(TRUE);
- return true;
+ return LLTransientDockableFloater::getVisible();
}
- else
+}
+
+//static
+bool LLIMFloater::toggle(const LLUUID& session_id)
+{
+ if(!isChatMultiTab())
{
- // ensure the list of messages is updated when floater is made visible
- show(session_id);
- // update number of unread notifications in the SysWell
- LLBottomTray::getInstance()->getSysWell()->updateUreadIMNotifications();
- return true;
+ LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+ if (floater && floater->getVisible() && floater->hasFocus())
+ {
+ // clicking on chiclet to close floater just hides it to maintain existing
+ // scroll/text entry state
+ floater->setVisible(false);
+ return false;
+ }
+ else if(floater && (!floater->isDocked() || floater->getVisible() && !floater->hasFocus()))
+ {
+ floater->setVisible(TRUE);
+ floater->setFocus(TRUE);
+ return true;
+ }
}
+
+ // ensure the list of messages is updated when floater is made visible
+ show(session_id);
+ return true;
}
//static
@@ -417,6 +570,11 @@ LLIMFloater* LLIMFloater::findInstance(const LLUUID& session_id)
return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
}
+LLIMFloater* LLIMFloater::getInstance(const LLUUID& session_id)
+{
+ return LLFloaterReg::getTypedInstance<LLIMFloater>("impanel", session_id);
+}
+
void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
{
mSessionInitialized = true;
@@ -428,6 +586,12 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
setKey(im_session_id);
mControlPanel->setSessionId(im_session_id);
}
+
+ // updating "Call" button from group control panel here to enable it without placing into draw() (EXT-4796)
+ if(gAgent.isInGroup(im_session_id))
+ {
+ mControlPanel->updateCallButton();
+ }
//*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
@@ -446,12 +610,17 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
void LLIMFloater::updateMessages()
{
+ bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
+
std::list<LLSD> messages;
LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
if (messages.size())
{
- LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
+// LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
+
+ LLSD chat_args;
+ chat_args["use_plain_text_chat_history"] = use_plain_text_chat_history;
std::ostringstream message;
std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
@@ -462,22 +631,41 @@ void LLIMFloater::updateMessages()
std::string time = msg["time"].asString();
LLUUID from_id = msg["from_id"].asUUID();
- std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
+ std::string from = msg["from"].asString();
std::string message = msg["message"].asString();
- LLStyle::Params style_params;
- style_params.color(chat_color);
+ bool is_history = msg["is_history"].asBoolean();
- LLChat chat(message);
+ LLChat chat;
chat.mFromID = from_id;
+ chat.mSessionID = mSessionID;
chat.mFromName = from;
+ chat.mTimeStr = time;
+ chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
- mChatHistory->appendWidgetMessage(chat, style_params);
-
+ // process offer notification
+ if (msg.has("notification_id"))
+ {
+ chat.mNotifId = msg["notification_id"].asUUID();
+ }
+ //process text message
+ else
+ {
+ chat.mText = message;
+ }
+
+ mChatHistory->appendMessage(chat, chat_args);
mLastMessageIndex = msg["index"].asInteger();
}
}
}
+void LLIMFloater::reloadMessages()
+{
+ mChatHistory->clear();
+ mLastMessageIndex = -1;
+ updateMessages();
+}
+
// static
void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata )
{
@@ -486,12 +674,21 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
// Allow enabling the LLIMFloater input editor only if session can accept text
LLIMModel::LLIMSession* im_session =
LLIMModel::instance().findIMSession(self->mSessionID);
- if( im_session && im_session->mTextIMPossible )
+ //TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK)
+ if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled())
{
//in disconnected state IM input editor should be disabled
self->mInputEditor->setEnabled(!gDisconnected);
}
- self->mChatHistory->setCursorAndScrollToEnd();
+
+ // when IM Floater is a part of the multitab container LLTabContainer set focus to the first
+ // child on tab button's mouse up. This leads input field lost focus. See EXT-3852.
+ if (isChatMultiTab())
+ {
+ // So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child.
+ // do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is.
+ gFocusMgr.setMouseCapture(NULL);
+ }
}
// static
@@ -576,6 +773,57 @@ void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
}
}
+void LLIMFloater::processAgentListUpdates(const LLSD& body)
+{
+ if ( !body.isMap() ) return;
+
+ if ( body.has("agent_updates") && body["agent_updates"].isMap() )
+ {
+ LLSD agent_data = body["agent_updates"].get(gAgentID.asString());
+ if (agent_data.isMap() && agent_data.has("info"))
+ {
+ LLSD agent_info = agent_data["info"];
+
+ if (agent_info.has("mutes"))
+ {
+ BOOL moderator_muted_text = agent_info["mutes"]["text"].asBoolean();
+ mInputEditor->setEnabled(!moderator_muted_text);
+ std::string label;
+ if (moderator_muted_text)
+ label = LLTrans::getString("IM_muted_text_label");
+ else
+ label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
+ mInputEditor->setLabel(label);
+
+ if (moderator_muted_text)
+ LLNotificationsUtil::add("TextChatIsMutedByModerator");
+ }
+ }
+ }
+}
+
+void LLIMFloater::updateChatHistoryStyle()
+{
+ mChatHistory->clear();
+ mLastMessageIndex = -1;
+ updateMessages();
+}
+
+void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+ iter != inst_list.end(); ++iter)
+ {
+ LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+ if (floater)
+ {
+ floater->updateChatHistoryStyle();
+ }
+ }
+
+}
+
void LLIMFloater::processSessionUpdate(const LLSD& session_update)
{
// *TODO : verify following code when moderated mode will be implemented
@@ -600,6 +848,162 @@ void LLIMFloater::processSessionUpdate(const LLSD& session_update)
}
}
+BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
+{
+
+ if (mDialog == IM_NOTHING_SPECIAL)
+ {
+ LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop,
+ cargo_type, cargo_data, accept);
+ }
+
+ // handle case for dropping calling cards (and folders of calling cards) onto invitation panel for invites
+ else if (isInviteAllowed())
+ {
+ *accept = ACCEPT_NO;
+
+ if (cargo_type == DAD_CALLINGCARD)
+ {
+ if (dropCallingCard((LLInventoryItem*)cargo_data, drop))
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ }
+ else if (cargo_type == DAD_CATEGORY)
+ {
+ if (dropCategory((LLInventoryCategory*)cargo_data, drop))
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ }
+ }
+ return TRUE;
+}
+
+BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
+{
+ BOOL rv = isInviteAllowed();
+ if(rv && item && item->getCreatorUUID().notNull())
+ {
+ if(drop)
+ {
+ std::vector<LLUUID> ids;
+ ids.push_back(item->getCreatorUUID());
+ inviteToSession(ids);
+ }
+ }
+ else
+ {
+ // set to false if creator uuid is null.
+ rv = FALSE;
+ }
+ return rv;
+}
+
+BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
+{
+ BOOL rv = isInviteAllowed();
+ if(rv && category)
+ {
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLUniqueBuddyCollector buddies;
+ gInventory.collectDescendentsIf(category->getUUID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ buddies);
+ S32 count = items.count();
+ if(count == 0)
+ {
+ rv = FALSE;
+ }
+ else if(drop)
+ {
+ std::vector<LLUUID> ids;
+ ids.reserve(count);
+ for(S32 i = 0; i < count; ++i)
+ {
+ ids.push_back(items.get(i)->getCreatorUUID());
+ }
+ inviteToSession(ids);
+ }
+ }
+ return rv;
+}
+
+BOOL LLIMFloater::isInviteAllowed() const
+{
+
+ return ( (IM_SESSION_CONFERENCE_START == mDialog)
+ || (IM_SESSION_INVITE == mDialog) );
+}
+
+class LLSessionInviteResponder : public LLHTTPClient::Responder
+{
+public:
+ LLSessionInviteResponder(const LLUUID& session_id)
+ {
+ mSessionID = session_id;
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llinfos << "Error inviting all agents to session" << llendl;
+ //throw something back to the viewer here?
+ }
+
+private:
+ LLUUID mSessionID;
+};
+
+BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ return FALSE;
+ }
+
+ S32 count = ids.size();
+
+ if( isInviteAllowed() && (count > 0) )
+ {
+ llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl;
+
+ std::string url = region->getCapability("ChatSessionRequest");
+
+ LLSD data;
+
+ data["params"] = LLSD::emptyArray();
+ for (int i = 0; i < count; i++)
+ {
+ data["params"].append(ids[i]);
+ }
+
+ data["method"] = "invite";
+ data["session-id"] = mSessionID;
+ LLHTTPClient::post(
+ url,
+ data,
+ new LLSessionInviteResponder(
+ mSessionID));
+ }
+ else
+ {
+ llinfos << "LLIMFloater::inviteToSession -"
+ << " no need to invite agents for "
+ << mDialog << llendl;
+ // successful add, because everyone that needed to get added
+ // was added.
+ }
+
+ return TRUE;
+}
+
void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
{
// We may have lost a "stop-typing" packet, don't add it twice
@@ -646,3 +1050,52 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
}
}
+// static
+bool LLIMFloater::isChatMultiTab()
+{
+ // Restart is required in order to change chat window type.
+ static bool is_single_window = gSavedSettings.getS32("ChatWindow") == 1;
+ return is_single_window;
+}
+
+// static
+void LLIMFloater::initIMFloater()
+{
+ // This is called on viewer start up
+ // init chat window type before user changed it in preferences
+ isChatMultiTab();
+}
+
+//static
+void LLIMFloater::sRemoveTypingIndicator(const LLSD& data)
+{
+ LLUUID session_id = data["session_id"];
+ if (session_id.isNull()) return;
+
+ LLUUID from_id = data["from_id"];
+ if (gAgentID == from_id || LLUUID::null == from_id) return;
+
+ LLIMFloater* floater = LLIMFloater::findInstance(session_id);
+ if (!floater) return;
+
+ if (IM_NOTHING_SPECIAL != floater->mDialog) return;
+
+ floater->removeTypingIndicator();
+}
+
+void LLIMFloater::onIMChicletCreated( const LLUUID& session_id )
+{
+
+ if (isChatMultiTab())
+ {
+ LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
+ if (!im_box) return;
+
+ if (LLIMFloater::findInstance(session_id)) return;
+
+ LLIMFloater* new_tab = LLIMFloater::getInstance(session_id);
+
+ im_box->addFloater(new_tab, FALSE, LLTabContainer::END);
+ }
+
+}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index d2aac57ee2..2f034d02b8 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,13 +33,16 @@
#ifndef LL_IMFLOATER_H
#define LL_IMFLOATER_H
-#include "lltransientdockablefloater.h"
+#include "llinstantmessage.h"
#include "lllogchat.h"
+#include "lltooldraganddrop.h"
+#include "lltransientdockablefloater.h"
class LLLineEditor;
class LLPanelChatControlPanel;
class LLChatHistory;
-
+class LLInventoryItem;
+class LLInventoryCategory;
/**
* Individual IM window that appears at the bottom of the screen,
@@ -55,13 +58,13 @@ public:
// LLView overrides
/*virtual*/ BOOL postBuild();
/*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ BOOL getVisible();
// Check typing timeout timer.
/*virtual*/ void draw();
// LLFloater overrides
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
- // override LLFloater's minimization according to EXT-1216
// Make IM conversion visible and update the message history
static LLIMFloater* show(const LLUUID& session_id);
@@ -72,10 +75,13 @@ public:
static LLIMFloater* findInstance(const LLUUID& session_id);
+ static LLIMFloater* getInstance(const LLUUID& session_id);
+
void sessionInitReplyReceived(const LLUUID& im_session_id);
// get new messages from LLIMModel
void updateMessages();
+ void reloadMessages();
static void onSendMsg( LLUICtrl*, void*);
void sendMsg();
@@ -88,12 +94,42 @@ public:
void onVisibilityChange(const LLSD& new_visibility);
void processIMTyping(const LLIMInfo* im_info, BOOL typing);
+ void processAgentListUpdates(const LLSD& body);
void processSessionUpdate(const LLSD& session_update);
+ void updateChatHistoryStyle();
+ static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg);
+
+ /**
+ * Returns true if chat is displayed in multi tabbed floater
+ * false if chat is displayed in multiple windows
+ */
+ static bool isChatMultiTab();
+
+ static void initIMFloater();
+
+ //used as a callback on receiving new IM message
+ static void sRemoveTypingIndicator(const LLSD& data);
+
+ static void onIMChicletCreated(const LLUUID& session_id);
+
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+
private:
// process focus events to set a currently active session
/* virtual */ void onFocusLost();
/* virtual */ void onFocusReceived();
+
+ BOOL dropCallingCard(LLInventoryItem* item, BOOL drop);
+ BOOL dropCategory(LLInventoryCategory* category, BOOL drop);
+
+ BOOL isInviteAllowed() const;
+ BOOL inviteToSession(const std::vector<LLUUID>& agent_ids);
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
new file mode 100644
index 0000000000..db7998fe6e
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -0,0 +1,167 @@
+/**
+ * @file llimfloatercontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimfloatercontainer.h"
+#include "llfloaterreg.h"
+#include "llimview.h"
+#include "llavatariconctrl.h"
+#include "llgroupiconctrl.h"
+#include "llagent.h"
+#include "lltransientfloatermgr.h"
+
+//
+// LLIMFloaterContainer
+//
+LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
+: LLMultiFloater(seed)
+{
+ mAutoResize = FALSE;
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
+}
+
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+}
+
+BOOL LLIMFloaterContainer::postBuild()
+{
+ LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
+ // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
+ // mTabContainer will be initialized in LLMultiFloater::addChild()
+ return TRUE;
+}
+
+void LLIMFloaterContainer::onOpen(const LLSD& key)
+{
+ LLMultiFloater::onOpen(key);
+/*
+ if (key.isDefined())
+ {
+ LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
+ if (im_floater)
+ {
+ im_floater->openFloater();
+ }
+ }
+*/
+}
+
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point)
+{
+ if(!floaterp) return;
+
+ // already here
+ if (floaterp->getHost() == this)
+ {
+ openFloater(floaterp->getKey());
+ return;
+ }
+
+ LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+ LLUUID session_id = floaterp->getKey();
+
+ LLIconCtrl* icon = 0;
+
+ if(gAgent.isInGroup(session_id, TRUE))
+ {
+ LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
+ icon_params.group_id = session_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params);
+
+ mSessions[session_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
+ }
+ else
+ {
+ LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id);
+
+ LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>();
+ icon_params.avatar_id = avatar_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params);
+
+ mSessions[session_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
+ }
+ mTabContainer->setTabImage(floaterp, icon);
+}
+
+void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
+{
+ mSessions.erase(id);
+}
+
+void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
+{
+ LLUUID session_id = data["session_id"].asUUID();
+ LLFloater* floaterp = get_ptr_in_map(mSessions, session_id);
+ LLFloater* current_floater = LLMultiFloater::getActiveFloater();
+
+ if(floaterp && current_floater && floaterp != current_floater)
+ {
+ if(LLMultiFloater::isFloaterFlashing(floaterp))
+ LLMultiFloater::setFloaterFlashing(floaterp, FALSE);
+ LLMultiFloater::setFloaterFlashing(floaterp, TRUE);
+ }
+}
+
+LLIMFloaterContainer* LLIMFloaterContainer::findInstance()
+{
+ return LLFloaterReg::findTypedInstance<LLIMFloaterContainer>("im_container");
+}
+
+LLIMFloaterContainer* LLIMFloaterContainer::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container");
+}
+
+void LLIMFloaterContainer::setMinimized(BOOL b)
+{
+ if (isMinimized() == b) return;
+
+ LLMultiFloater::setMinimized(b);
+
+ if (isMinimized()) return;
+
+ if (getActiveFloater())
+ {
+ getActiveFloater()->setVisible(TRUE);
+ }
+}
+
+// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
new file mode 100644
index 0000000000..f6cdc25ebd
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.h
@@ -0,0 +1,76 @@
+/**
+ * @file llimfloatercontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLIMFLOATERCONTAINER_H
+#define LL_LLIMFLOATERCONTAINER_H
+
+#include <map>
+#include <vector>
+
+#include "llfloater.h"
+#include "llmultifloater.h"
+#include "llavatarpropertiesprocessor.h"
+#include "llgroupmgr.h"
+
+class LLTabContainer;
+
+class LLIMFloaterContainer : public LLMultiFloater
+{
+public:
+ LLIMFloaterContainer(const LLSD& seed);
+ virtual ~LLIMFloaterContainer();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ void onCloseFloater(LLUUID& id);
+
+ /*virtual*/ void addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+
+ static LLFloater* getCurrentVoiceFloater();
+
+ static LLIMFloaterContainer* findInstance();
+
+ static LLIMFloaterContainer* getInstance();
+
+ virtual void setMinimized(BOOL b);
+
+private:
+ typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
+ avatarID_panel_map_t mSessions;
+
+
+ void onNewMessageReceived(const LLSD& data);
+};
+
+#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index 74971f3fd8..1cbd273e96 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -36,6 +36,7 @@
#include "llnotificationhandler.h"
#include "llagentdata.h"
+#include "llnotifications.h"
#include "lltoastimpanel.h"
#include "llviewerwindow.h"
@@ -58,7 +59,7 @@ LLIMHandler::~LLIMHandler()
//--------------------------------------------------------------------------
void LLIMHandler::initChannel()
{
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index c4beb666ea..4bdf5f42dc 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -40,6 +40,7 @@
#include "llfontgl.h"
#include "llrect.h"
#include "llerror.h"
+#include "llmultifloater.h"
#include "llstring.h"
#include "message.h"
#include "lltextbox.h"
@@ -55,21 +56,17 @@
#include "llgroupactions.h"
#include "llfloater.h"
#include "llfloateractivespeakers.h"
-#include "llfloatercall.h"
#include "llavataractions.h"
-#include "llimview.h"
#include "llinventory.h"
#include "llinventorymodel.h"
#include "llfloaterinventory.h"
-#include "llfloaterchat.h"
#include "lliconctrl.h"
-#include "llimview.h" // for LLIMModel to get other avatar id in chat
#include "llkeyboard.h"
#include "lllineeditor.h"
-#include "llnotify.h"
#include "llpanelimcontrolpanel.h"
#include "llrecentpeople.h"
#include "llresmgr.h"
+#include "lltooldraganddrop.h"
#include "lltrans.h"
#include "lltabcontainer.h"
#include "llviewertexteditor.h"
@@ -215,7 +212,7 @@ LLFloaterIMPanel::~LLFloaterIMPanel()
BOOL LLFloaterIMPanel::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
mInputEditor = getChild<LLLineEditor>("chat_editor");
mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
@@ -320,6 +317,9 @@ void LLFloaterIMPanel::draw()
// hide/show start call and end call buttons
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionUUID);
+ if (!voice_channel)
+ return;
+
childSetVisible("end_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
childSetVisible("start_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED);
childSetEnabled("start_call_btn", enable_connect);
@@ -769,10 +769,13 @@ void LLFloaterIMPanel::onVisibilityChange(const LLSD& new_visibility)
}
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionUUID);
- if (new_visibility.asBoolean() && voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED)
- LLFloaterReg::showInstance("voice_call", mSessionUUID);
- else
- LLFloaterReg::hideInstance("voice_call", mSessionUUID);
+ if (voice_channel && voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED)
+ {
+ if (new_visibility.asBoolean())
+ LLFloaterReg::showInstance("voice_call", mSessionUUID);
+ else
+ LLFloaterReg::hideInstance("voice_call", mSessionUUID);
+ }
}
void LLFloaterIMPanel::sendMsg()
@@ -841,8 +844,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)
}
- //update the speakers dropdown too
- mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+ //update the speakers dropdown too, if it's available
+ if (mSpeakerPanel)
+ {
+ mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+ }
}
}
diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h
index b8f99d45c9..abbf1e68ab 100644
--- a/indra/newview/llimpanel.h
+++ b/indra/newview/llimpanel.h
@@ -33,7 +33,6 @@
#ifndef LL_IMPANEL_H
#define LL_IMPANEL_H
-#include "llimview.h" //for LLIMModel
#include "lldockablefloater.h"
#include "lllogchat.h"
#include "lluuid.h"
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 49fc9d8055..faddffe0fc 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -42,57 +42,55 @@
#include "llhttpclient.h"
#include "llsdutil_math.h"
#include "llstring.h"
+#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llagent.h"
+#include "llagentui.h"
+#include "llappviewer.h"
#include "llavatariconctrl.h"
+#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchat.h"
-#include "llresmgr.h"
-#include "llfloaterchat.h"
-#include "llfloaterchatterbox.h"
-#include "llavataractions.h"
-#include "llhttpnode.h"
#include "llimfloater.h"
-#include "llimpanel.h"
-#include "llresizebar.h"
-#include "lltabcontainer.h"
-#include "llviewercontrol.h"
-#include "llfloater.h"
+#include "llgroupiconctrl.h"
+#include "llmd5.h"
#include "llmutelist.h"
-#include "llresizehandle.h"
-#include "llkeyboard.h"
-#include "llui.h"
-#include "llviewermenu.h"
-#include "llcallingcard.h"
-#include "lltoolbar.h"
+#include "llrecentpeople.h"
#include "llviewermessage.h"
#include "llviewerwindow.h"
-#include "llnotify.h"
-#include "llviewerregion.h"
-#include "llvoicechannel.h"
-#include "lltrans.h"
-#include "llrecentpeople.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llnearbychat.h"
+#include "llspeakers.h" //for LLIMSpeakerMgr
+#include "lltextbox.h"
+#include "lltextutil.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
-#include "llfirstuse.h"
-#include "llagentui.h"
+const static std::string IM_TIME("time");
+const static std::string IM_TEXT("message");
+const static std::string IM_FROM("from");
+const static std::string IM_FROM_ID("from_id");
+
+const static std::string NO_SESSION("(IM Session Doesn't Exist)");
+const static std::string ADHOC_NAME_SUFFIX(" Conference");
+
+const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
+const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
+
+std::string LLCallDialogManager::sPreviousSessionlName = "";
+LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
+std::string LLCallDialogManager::sCurrentSessionlName = "";
+LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
+LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY;
+const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-1417BF03DDB4");
//
// Globals
//
LLIMMgr* gIMMgr = NULL;
-//
-// Statics
-//
-// *FIXME: make these all either UIStrings or Strings
-
-const static std::string IM_SEPARATOR(": ");
-
-std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap;
-
-
-
void toast_callback(const LLSD& msg){
// do not show toast in busy mode or it goes from agent
if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
@@ -101,11 +99,25 @@ void toast_callback(const LLSD& msg){
}
// check whether incoming IM belongs to an active session or not
- if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
+ if (LLIMModel::getInstance()->getActiveSessionID().notNull()
+ && LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
{
return;
}
-
+
+ // Skip toasting for system messages
+ if (msg["from_id"].asUUID() == LLUUID::null)
+ {
+ return;
+ }
+
+ // Skip toasting if we have open window of IM with this session id
+ LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]);
+ if (open_im_floater && open_im_floater->getVisible())
+ {
+ return;
+ }
+
LLSD args;
args["MESSAGE"] = msg["message"];
args["TIME"] = msg["time"];
@@ -113,7 +125,7 @@ void toast_callback(const LLSD& msg){
args["FROM_ID"] = msg["from_id"];
args["SESSION_ID"] = msg["session_id"];
- LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+ LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
}
void LLIMModel::setActiveSessionID(const LLUUID& session_id)
@@ -131,14 +143,14 @@ void LLIMModel::setActiveSessionID(const LLUUID& session_id)
LLIMModel::LLIMModel()
{
addNewMsgCallback(LLIMFloater::newIMCallback);
- addNoUnreadMsgsCallback(LLIMFloater::newIMCallback);
addNewMsgCallback(toast_callback);
}
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
: mSessionID(session_id),
mName(name),
mType(type),
+ mParticipantUnreadMessageCount(0),
mNumUnread(0),
mOtherParticipantID(other_participant_id),
mInitialTargetIDs(ids),
@@ -147,20 +159,51 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mSessionInitialized(false),
mCallBackEnabled(true),
mTextIMPossible(true),
- mOtherParticipantIsAvatar(true)
+ mOtherParticipantIsAvatar(true),
+ mStartCallOnInitialize(false),
+ mStartedAsIMCall(voice)
{
+ // set P2P type by default
+ mSessionType = P2P_SESSION;
+
if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
{
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
+ mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
+
+ // check if it was AVALINE call
+ if (!mOtherParticipantIsAvatar)
+ {
+ mSessionType = AVALINE_SESSION;
+ }
}
else
{
mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
+
+ // determine whether it is group or conference session
+ if (gAgent.isInGroup(mSessionID))
+ {
+ mSessionType = GROUP_SESSION;
+ }
+ else
+ {
+ mSessionType = ADHOC_SESSION;
+ }
+ }
+
+ if(mVoiceChannel)
+ {
+ mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2, _3));
}
+
mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
// All participants will be added to the list of people we've recently interacted with.
- mSpeakers->addListener(&LLRecentPeople::instance(), "add");
+
+ // we need to add only _active_ speakers...so comment this.
+ // may delete this later on cleanup
+ //mSpeakers->addListener(&LLRecentPeople::instance(), "add");
//we need to wait for session initialization for outgoing ad-hoc and group chat session
//correct session id for initiated ad-hoc chat will be received from the server
@@ -176,11 +219,101 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
{
mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
- mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
}
+ buildHistoryFileName();
+
if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
- LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
+ {
+ std::list<LLSD> chat_history;
+
+ //involves parsing of a chat history
+ LLLogChat::loadAllHistory(mHistoryFileName, chat_history);
+ addMessagesFromHistory(chat_history);
+ }
+}
+
+void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
+{
+ std::string you = LLTrans::getString("You");
+ std::string started_call = LLTrans::getString("started_call");
+ std::string joined_call = LLTrans::getString("joined_call");
+ std::string other_avatar_name = "";
+
+ std::string message;
+
+ switch(mSessionType)
+ {
+ case AVALINE_SESSION:
+ // no text notifications
+ break;
+ case P2P_SESSION:
+ gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
+
+ if(direction == LLVoiceChannel::INCOMING_CALL)
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ message = other_avatar_name + " " + started_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+
+ break;
+ case LLVoiceChannel::STATE_CONNECTED :
+ message = you + " " + joined_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ default:
+ break;
+ }
+ }
+ else // outgoing call
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ message = you + " " + started_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ break;
+ case LLVoiceChannel::STATE_CONNECTED :
+ message = other_avatar_name + " " + joined_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ default:
+ break;
+ }
+ }
+ break;
+
+ case GROUP_SESSION:
+ case ADHOC_SESSION:
+ if(direction == LLVoiceChannel::INCOMING_CALL)
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CONNECTED :
+ message = you + " " + joined_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ default:
+ break;
+ }
+ }
+ else // outgoing call
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ message = you + " " + started_call;
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ // Update speakers list when connected
+ if (LLVoiceChannel::STATE_CONNECTED == new_state)
+ {
+ mSpeakers->update(true);
+ }
}
LLIMModel::LLIMSession::~LLIMSession()
@@ -204,9 +337,11 @@ LLIMModel::LLIMSession::~LLIMSession()
}
}
+ mVoiceChannelStateChangeConnection.disconnect();
+
// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
mVoiceChannel->deactivate();
-
+
delete mVoiceChannel;
mVoiceChannel = NULL;
}
@@ -222,7 +357,7 @@ void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_
}
}
-void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
+void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history)
{
LLSD message;
message["from"] = from;
@@ -230,8 +365,39 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f
message["message"] = utf8_text;
message["time"] = time;
message["index"] = (LLSD::Integer)mMsgs.size();
+ message["is_history"] = is_history;
mMsgs.push_front(message);
+
+ if (mSpeakers && from_id.notNull())
+ {
+ mSpeakers->speakerChatted(from_id);
+ mSpeakers->setSpeakerTyping(from_id, FALSE);
+ }
+}
+
+void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history)
+{
+ std::list<LLSD>::const_iterator it = history.begin();
+ while (it != history.end())
+ {
+ const LLSD& msg = *it;
+
+ std::string from = msg[IM_FROM];
+ LLUUID from_id = LLUUID::null;
+ if (msg[IM_FROM_ID].isUndefined())
+ {
+ gCacheName->getUUID(from, from_id);
+ }
+
+
+ std::string timestamp = msg[IM_TIME];
+ std::string text = msg[IM_TEXT];
+
+ addMessage(from, from_id, text, timestamp, true);
+
+ it++;
+ }
}
void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
@@ -242,22 +408,114 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
if (type == LLLogChat::LOG_LINE)
{
- self->addMessage("", LLSD(), msg["message"].asString(), "");
+ self->addMessage("", LLSD(), msg["message"].asString(), "", true);
}
else if (type == LLLogChat::LOG_LLSD)
{
- self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
+ self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true);
}
}
LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
{
- return get_if_there(LLIMModel::instance().sSessionsMap, session_id,
+ return get_if_there(mId2SessionMap, session_id,
(LLIMModel::LLIMSession*) NULL);
}
-//*TODO change name to represent session initialization aspect (IB)
-void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id)
+//*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code
+LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& ids)
+{
+ S32 num = ids.size();
+ if (!num) return NULL;
+
+ if (mId2SessionMap.empty()) return NULL;
+
+ std::map<LLUUID, LLIMSession*>::const_iterator it = mId2SessionMap.begin();
+ for (; it != mId2SessionMap.end(); ++it)
+ {
+ LLIMSession* session = (*it).second;
+
+ if (!session->isAdHoc()) continue;
+ if (session->mInitialTargetIDs.size() != num) continue;
+
+ std::list<LLUUID> tmp_list(session->mInitialTargetIDs.begin(), session->mInitialTargetIDs.end());
+
+ std::vector<LLUUID>::const_iterator iter = ids.begin();
+ while (iter != ids.end())
+ {
+ tmp_list.remove(*iter);
+ ++iter;
+
+ if (tmp_list.empty())
+ {
+ break;
+ }
+ }
+
+ if (tmp_list.empty() && iter == ids.end())
+ {
+ return session;
+ }
+ }
+
+ return NULL;
+}
+
+bool LLIMModel::LLIMSession::isAdHoc()
+{
+ return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID));
+}
+
+bool LLIMModel::LLIMSession::isP2P()
+{
+ return IM_NOTHING_SPECIAL == mType;
+}
+
+bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
+{
+ return !mOtherParticipantIsAvatar;
+}
+
+void LLIMModel::LLIMSession::buildHistoryFileName()
+{
+ mHistoryFileName = mName;
+
+ //ad-hoc requires sophisticated chat history saving schemes
+ if (isAdHoc())
+ {
+ //in case of outgoing ad-hoc sessions
+ if (mInitialTargetIDs.size())
+ {
+ std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
+ mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
+ return;
+ }
+
+ //in case of incoming ad-hoc sessions
+ mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+ }
+}
+
+//static
+std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_uuids)
+{
+ LLMD5 md5_uuid;
+
+ std::set<LLUUID>::const_iterator it = sorted_uuids.begin();
+ while (it != sorted_uuids.end())
+ {
+ md5_uuid.update((unsigned char*)(*it).mData, 16);
+ it++;
+ }
+ md5_uuid.finalize();
+
+ LLUUID participants_md5_hash;
+ md5_uuid.raw_digest((unsigned char*) participants_md5_hash.mData);
+ return participants_md5_hash.asString();
+}
+
+
+void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
LLIMSession* session = findIMSession(old_session_id);
if (session)
@@ -266,8 +524,8 @@ void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_
if (old_session_id != new_session_id)
{
- sSessionsMap.erase(old_session_id);
- sSessionsMap[new_session_id] = session;
+ mId2SessionMap.erase(old_session_id);
+ mId2SessionMap[new_session_id] = session;
gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
}
@@ -277,13 +535,12 @@ void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_
{
im_floater->sessionInitReplyReceived(new_session_id);
}
- }
- //*TODO remove this "floater" stuff when Communicate Floater is gone
- LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
- if (floater)
- {
- floater->sessionInitReplyReceived(new_session_id);
+ // auto-start the call on session initialization?
+ if (session->mStartCallOnInitialize)
+ {
+ gIMMgr->startCall(new_session_id);
+ }
}
}
@@ -308,22 +565,28 @@ void LLIMModel::testMessages()
bot2_id.generate(from);
LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
- addMessage(bot2_session_id, from, bot2_id, "Test Message: Can I haz bear? ");
+ addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? ");
addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
}
-
+//session name should not be empty
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
- const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+ const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
{
- if (is_in_map(sSessionsMap, session_id))
+ if (name.empty())
+ {
+ llwarns << "Attempt to create a new session with empty name; id = " << session_id << llendl;
+ return false;
+ }
+
+ if (findIMSession(session_id))
{
llwarns << "IM Session " << session_id << " already exists" << llendl;
return false;
}
- LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
- sSessionsMap[session_id] = session;
+ LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
+ mId2SessionMap[session_id] = session;
LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
@@ -331,11 +594,17 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
}
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
+{
+ std::vector<LLUUID> no_ids;
+ return newSession(session_id, name, type, other_participant_id, no_ids, voice);
+}
+
bool LLIMModel::clearSession(const LLUUID& session_id)
{
- if (sSessionsMap.find(session_id) == sSessionsMap.end()) return false;
- delete (sSessionsMap[session_id]);
- sSessionsMap.erase(session_id);
+ if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
+ delete (mId2SessionMap[session_id]);
+ mId2SessionMap.erase(session_id);
return true;
}
@@ -361,10 +630,12 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,
}
session->mNumUnread = 0;
+ session->mParticipantUnreadMessageCount = 0;
LLSD arg;
arg["session_id"] = session_id;
arg["num_unread"] = 0;
+ arg["participant_unread"] = session->mParticipantUnreadMessageCount;
mNoUnreadMsgsSignal(arg);
}
@@ -383,45 +654,49 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
return true;
}
-//*TODO rewrite chat history persistence using LLSD serialization (IB)
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
- S32 im_log_option = gSavedPerAccountSettings.getS32("IMLogOptions");
- if (im_log_option != LOG_CHAT)
+ if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
{
- if(im_log_option == LOG_BOTH_TOGETHER)
- {
- LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
- return true;
- }
- else
- {
- LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
- return true;
- }
+ LLLogChat::saveHistory(file_name, from, from_id, utf8_text);
+ return true;
+ }
+ else
+ {
+ return false;
}
- return false;
+}
+
+bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+ return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text);
+}
+
+bool LLIMModel::proccessOnlineOfflineNotification(
+ const LLUUID& session_id,
+ const std::string& utf8_text)
+{
+ // Add system message to history
+ return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
}
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
const std::string& utf8_text, bool log2file /* = true */) {
- LLIMSession* session = findIMSession(session_id);
- if (!session)
- {
- llwarns << "session " << session_id << "does not exist " << llendl;
- return false;
- }
-
- addToHistory(session_id, from, from_id, utf8_text);
- if (log2file) logToFile(session_id, from, from_id, utf8_text);
+ LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file);
+ if (!session) return false;
- session->mNumUnread++;
+ //good place to add some1 to recent list
+ //other places may be called from message history.
+ if( !from_id.isNull() &&
+ ( session->isP2PSessionType() || session->isAdHocSessionType() ) )
+ LLRecentPeople::instance().add(from_id);
// notify listeners
LLSD arg;
arg["session_id"] = session_id;
arg["num_unread"] = session->mNumUnread;
+ arg["participant_unread"] = session->mParticipantUnreadMessageCount;
arg["message"] = utf8_text;
arg["from"] = from;
arg["from_id"] = from_id;
@@ -431,6 +706,31 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
return true;
}
+LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
+ const std::string& utf8_text, bool log2file /* = true */)
+{
+ LLIMSession* session = findIMSession(session_id);
+
+ if (!session)
+ {
+ llwarns << "session " << session_id << "does not exist " << llendl;
+ return NULL;
+ }
+
+ addToHistory(session_id, from, from_id, utf8_text);
+ if (log2file) logToFile(session_id, from, from_id, utf8_text);
+
+ session->mNumUnread++;
+
+ //update count of unread messages from real participant
+ if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
+ {
+ ++(session->mParticipantUnreadMessageCount);
+ }
+
+ return session;
+}
+
const std::string& LLIMModel::getName(const LLUUID& session_id) const
{
@@ -439,7 +739,7 @@ const std::string& LLIMModel::getName(const LLUUID& session_id) const
if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
- return LLStringUtil::null;
+ return NO_SESSION;
}
return session->mName;
@@ -498,13 +798,25 @@ LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
LLIMSession* session = findIMSession(session_id);
if (!session)
{
- llwarns << "session " << session_id << "does not exist " << llendl;
+ llwarns << "session " << session_id << " does not exist " << llendl;
return NULL;
}
return session->mSpeakers;
}
+const std::string& LLIMModel::getHistoryFileName(const LLUUID& session_id) const
+{
+ LLIMSession* session = findIMSession(session_id);
+ if (!session)
+ {
+ llwarns << "session " << session_id << " does not exist " << llendl;
+ return LLStringUtil::null;
+ }
+
+ return session->mHistoryFileName;
+}
+
// TODO get rid of other participant ID
void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing)
@@ -547,8 +859,7 @@ void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_p
}
}
-
-//*TODO update list of messages in a LLIMSession (IB)
+//*TODO this method is better be moved to the LLIMMgr
void LLIMModel::sendMessage(const std::string& utf8_text,
const LLUUID& im_session_id,
const LLUUID& other_participant_id,
@@ -628,24 +939,9 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
//local echo for the legacy communicate panel
std::string history_echo;
- std::string utf8_copy = utf8_text;
LLAgentUI::buildFullname(history_echo);
- // Look for IRC-style emotes here.
-
- std::string prefix = utf8_copy.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- utf8_copy.replace(0,3,"");
- }
- else
- {
- history_echo += ": ";
- }
- history_echo += utf8_copy;
-
- LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
- if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
+ history_echo += ": " + utf8_text;
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
if (speaker_mgr)
@@ -839,8 +1135,6 @@ bool LLIMModel::sendStartSession(
return false;
}
-
-
//
// Helper Functions
//
@@ -887,15 +1181,15 @@ public:
if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
{
- gIMMgr->startCall(mSessionID);
+ gIMMgr->startCall(mSessionID, LLVoiceChannel::INCOMING_CALL);
}
if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE
|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
&& LLIMModel::getInstance()->findIMSession(mSessionID))
{
- // always open IM window when connecting to voice
- LLIMFloater::show(mSessionID);
+ // TODO remove in 2010, for voice calls we do not open an IM window
+ //LLIMFloater::show(mSessionID);
}
gIMMgr->clearPendingAgentListUpdates(mSessionID);
@@ -913,7 +1207,7 @@ public:
if ( 404 == statusNum )
{
std::string error_string;
- error_string = "does not exist";
+ error_string = "session_does_not_exist_error";
gIMMgr->showSessionStartError(error_string, mSessionID);
}
}
@@ -966,38 +1260,21 @@ LLUUID LLIMMgr::computeSessionID(
return session_id;
}
-inline LLFloater* getFloaterBySessionID(const LLUUID session_id)
-{
- LLFloater* floater = NULL;
- if ( gIMMgr )
- {
- floater = dynamic_cast < LLFloater* >
- ( gIMMgr->findFloaterBySession(session_id) );
- }
- if ( !floater )
- {
- floater = dynamic_cast < LLFloater* >
- ( LLIMFloater::findInstance(session_id) );
- }
- return floater;
-}
-
void
LLIMMgr::showSessionStartError(
const std::string& error_string,
const LLUUID session_id)
{
- const LLFloater* floater = getFloaterBySessionID (session_id);
- if (!floater) return;
+ if (!hasSession(session_id)) return;
LLSD args;
args["REASON"] = LLTrans::getString(error_string);
- args["RECIPIENT"] = floater->getTitle();
+ args["RECIPIENT"] = LLIMModel::getInstance()->getName(session_id);
LLSD payload;
payload["session_id"] = session_id;
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"ChatterBoxSessionStartError",
args,
payload,
@@ -1010,17 +1287,17 @@ LLIMMgr::showSessionEventError(
const std::string& error_string,
const LLUUID session_id)
{
- const LLFloater* floater = getFloaterBySessionID (session_id);
- if (!floater) return;
-
LLSD args;
+ LLStringUtil::format_map_t event_args;
+
+ event_args["RECIPIENT"] = LLIMModel::getInstance()->getName(session_id);
+
args["REASON"] =
LLTrans::getString(error_string);
args["EVENT"] =
- LLTrans::getString(event_string);
- args["RECIPIENT"] = floater->getTitle();
+ LLTrans::getString(event_string, event_args);
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"ChatterBoxSessionEventError",
args);
}
@@ -1030,18 +1307,17 @@ LLIMMgr::showSessionForceClose(
const std::string& reason_string,
const LLUUID session_id)
{
- const LLFloater* floater = getFloaterBySessionID (session_id);
- if (!floater) return;
+ if (!hasSession(session_id)) return;
LLSD args;
- args["NAME"] = floater->getTitle();
+ args["NAME"] = LLIMModel::getInstance()->getName(session_id);
args["REASON"] = LLTrans::getString(reason_string);
LLSD payload;
payload["session_id"] = session_id;
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"ForceCloseChatterBoxSession",
args,
payload,
@@ -1057,7 +1333,7 @@ LLIMMgr::onConfirmForceCloseError(
//only 1 option really
LLUUID session_id = notification["payload"]["session_id"];
- LLFloater* floater = getFloaterBySessionID (session_id);
+ LLFloater* floater = LLIMFloater::findInstance(session_id);
if ( floater )
{
floater->closeFloater(FALSE);
@@ -1067,47 +1343,521 @@ LLIMMgr::onConfirmForceCloseError(
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLCallDialogManager
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+LLCallDialogManager::LLCallDialogManager()
+{
+}
+
+LLCallDialogManager::~LLCallDialogManager()
+{
+}
+
+void LLCallDialogManager::initClass()
+{
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(LLCallDialogManager::onVoiceChannelChanged);
+}
+
+void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
+{
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if(!session)
+ {
+ sPreviousSessionlName = sCurrentSessionlName;
+ sCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution
+ return;
+ }
+
+ if (sSession)
+ {
+ // store previous session type to process Avaline calls in dialogs
+ sPreviousSessionType = sSession->mSessionType;
+ }
+
+ sSession = session;
+ sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));
+ if(sCurrentSessionlName != session->mName)
+ {
+ sPreviousSessionlName = sCurrentSessionlName;
+ sCurrentSessionlName = session->mName;
+ }
+
+ if (LLVoiceChannel::getCurrentVoiceChannel()->getState() == LLVoiceChannel::STATE_CALL_STARTED &&
+ LLVoiceChannel::getCurrentVoiceChannel()->getCallDirection() == LLVoiceChannel::OUTGOING_CALL)
+ {
+
+ //*TODO get rid of duplicated code
+ LLSD mCallDialogPayload;
+ mCallDialogPayload["session_id"] = sSession->mSessionID;
+ mCallDialogPayload["session_name"] = sSession->mName;
+ mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
+ mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+ mCallDialogPayload["old_session_type"] = sPreviousSessionType;
+ mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
+ mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+ mCallDialogPayload["session_type"] = sSession->mSessionType;
+
+ LLOutgoingCallDialog* ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(ocd)
+ {
+ ocd->show(mCallDialogPayload);
+ }
+ }
+
+}
+
+void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent)
+{
+ LLSD mCallDialogPayload;
+ LLOutgoingCallDialog* ocd = NULL;
+
+ if(sOldState == new_state)
+ {
+ return;
+ }
+
+ sOldState = new_state;
+
+ mCallDialogPayload["session_id"] = sSession->mSessionID;
+ mCallDialogPayload["session_name"] = sSession->mName;
+ mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
+ mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+ mCallDialogPayload["old_session_type"] = sPreviousSessionType;
+ mCallDialogPayload["state"] = new_state;
+ mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+ mCallDialogPayload["session_type"] = sSession->mSessionType;
+ mCallDialogPayload["ended_by_agent"] = ended_by_agent;
+
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ // do not show "Calling to..." if it is incoming call
+ if(direction == LLVoiceChannel::INCOMING_CALL)
+ {
+ return;
+ }
+ break;
+
+ case LLVoiceChannel::STATE_HUNG_UP:
+ // this state is coming before session is changed, so, put it into payload map
+ mCallDialogPayload["old_session_type"] = sSession->mSessionType;
+ break;
+
+ case LLVoiceChannel::STATE_CONNECTED :
+ ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if (ocd)
+ {
+ ocd->closeFloater();
+ }
+ return;
+
+ default:
+ break;
+ }
+
+ ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(ocd)
+ {
+ ocd->show(mCallDialogPayload);
+ }
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLCallDialog::LLCallDialog(const LLSD& payload)
+ : LLDockableFloater(NULL, false, payload),
+
+ mPayload(payload),
+ mLifetime(DEFAULT_LIFETIME)
+{
+ setAutoFocus(FALSE);
+}
+
+void LLCallDialog::getAllowedRect(LLRect& rect)
+{
+ rect = gViewerWindow->getWorldViewRectScaled();
+}
+
+BOOL LLCallDialog::postBuild()
+{
+ if (!LLDockableFloater::postBuild())
+ return FALSE;
+
+ // dock the dialog to the Speak Button, where other sys messages appear
+ LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+
+ setDockControl(new LLDockControl(
+ anchor_panel, this,
+ getDockTongue(), LLDockControl::TOP,
+ boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+
+ return TRUE;
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLOutgoingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
+LLCallDialog(payload)
+{
+ LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(instance && instance->getVisible())
+ {
+ instance->onCancel(instance);
+ }
+}
+
+void LLCallDialog::draw()
+{
+ if (lifetimeHasExpired())
+ {
+ onLifetimeExpired();
+ }
+
+ if (getDockControl() != NULL)
+ {
+ LLDockableFloater::draw();
+ }
+}
+
+// virtual
+void LLCallDialog::onOpen(const LLSD& key)
+{
+ LLDockableFloater::onOpen(key);
+
+ // it should be over the all floaters. EXT-5116
+ gFloaterView->bringToFront(this);
+}
+
+void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
+{
+ // *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
+ bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+
+ bool is_group = participant_is_avatar && gAgent.isInGroup(session_id);
+
+ LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ LLGroupIconCtrl* group_icon = getChild<LLGroupIconCtrl>("group_icon");
+
+ avatar_icon->setVisible(!is_group);
+ group_icon->setVisible(is_group);
+
+ if (is_group)
+ {
+ group_icon->setValue(session_id);
+ }
+ else if (participant_is_avatar)
+ {
+ avatar_icon->setValue(participant_id);
+ }
+ else
+ {
+ avatar_icon->setValue("Avaline_Icon");
+ avatar_icon->setToolTip(std::string(""));
+ }
+}
+
+bool LLCallDialog::lifetimeHasExpired()
+{
+ if (mLifetimeTimer.getStarted())
+ {
+ F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32();
+ if (elapsed_time > mLifetime)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void LLCallDialog::onLifetimeExpired()
+{
+ mLifetimeTimer.stop();
+ closeFloater();
+}
+
+void LLOutgoingCallDialog::show(const LLSD& key)
+{
+ mPayload = key;
+
+ //will be false only if voice in parcel is disabled and channel we leave is nearby(checked further)
+ bool show_oldchannel = LLViewerParcelMgr::getInstance()->allowAgentVoice();
+
+ // hide all text at first
+ hideAllText();
+
+ // init notification's lifetime
+ std::istringstream ss( getString("lifetime") );
+ if (!(ss >> mLifetime))
+ {
+ mLifetime = DEFAULT_LIFETIME;
+ }
+
+ // customize text strings
+ // tell the user which voice channel they are leaving
+ if (!mPayload["old_channel_name"].asString().empty())
+ {
+ bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger();
+
+ std::string old_caller_name = mPayload["old_channel_name"].asString();
+ if (was_avaline_call)
+ {
+ old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name);
+ }
+
+ childSetTextArg("leaving", "[CURRENT_CHAT]", old_caller_name);
+ show_oldchannel = true;
+ }
+ else
+ {
+ childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
+ }
+
+ if (!mPayload["disconnected_channel_name"].asString().empty())
+ {
+ std::string channel_name = mPayload["disconnected_channel_name"].asString();
+ if (LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["session_type"].asInteger())
+ {
+ channel_name = LLTextUtil::formatPhoneNumber(channel_name);
+ }
+ childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name);
+ childSetTextArg("nearby_P2P_by_other", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+
+ // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
+ // so no reconnection to nearby chat happens (EXT-4397)
+ bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string();
+ childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby);
+
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby);
+ }
+
+ std::string callee_name = mPayload["session_name"].asString();
+
+ LLUUID session_id = mPayload["session_id"].asUUID();
+ bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+
+ if (callee_name == "anonymous")
+ {
+ callee_name = getString("anonymous");
+ }
+ else if (!is_avatar)
+ {
+ callee_name = LLTextUtil::formatPhoneNumber(callee_name);
+ }
+
+ setTitle(callee_name);
+
+ LLSD callee_id = mPayload["other_user_id"];
+ childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+ childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
+
+ // for outgoing group calls callee_id == group id == session id
+ setIcon(callee_id, callee_id);
+
+ // stop timer by default
+ mLifetimeTimer.stop();
+
+ // show only necessary strings and controls
+ switch(mPayload["state"].asInteger())
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ getChild<LLTextBox>("calling")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(true);
+ if(show_oldchannel)
+ {
+ getChild<LLTextBox>("leaving")->setVisible(true);
+ }
+ break;
+ case LLVoiceChannel::STATE_RINGING :
+ if(show_oldchannel)
+ {
+ getChild<LLTextBox>("leaving")->setVisible(true);
+ }
+ getChild<LLTextBox>("connecting")->setVisible(true);
+ break;
+ case LLVoiceChannel::STATE_ERROR :
+ getChild<LLTextBox>("noanswer")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(false);
+ setCanClose(true);
+ mLifetimeTimer.start();
+ break;
+ case LLVoiceChannel::STATE_HUNG_UP :
+ if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
+ {
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ getChild<LLTextBox>(nearby_str)->setVisible(true);
+ }
+ else
+ {
+ getChild<LLTextBox>("nearby")->setVisible(true);
+ }
+ getChild<LLButton>("Cancel")->setVisible(false);
+ setCanClose(true);
+ mLifetimeTimer.start();
+ }
+
+ openFloater(LLOutgoingCallDialog::OCD_KEY);
+}
+
+void LLOutgoingCallDialog::hideAllText()
+{
+ getChild<LLTextBox>("calling")->setVisible(false);
+ getChild<LLTextBox>("leaving")->setVisible(false);
+ getChild<LLTextBox>("connecting")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false);
+ getChild<LLTextBox>("nearby")->setVisible(false);
+ getChild<LLTextBox>("noanswer")->setVisible(false);
+}
+
+//static
+void LLOutgoingCallDialog::onCancel(void* user_data)
+{
+ LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
+
+ if (!gIMMgr)
+ return;
+
+ LLUUID session_id = self->mPayload["session_id"].asUUID();
+ gIMMgr->endCall(session_id);
+
+ self->closeFloater();
+}
+
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+ BOOL success = LLCallDialog::postBuild();
+
+ childSetAction("Cancel", onCancel, this);
+
+ setCanDrag(FALSE);
+
+ return success;
+}
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLIncomingCallDialog
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
- LLModalDialog(payload),
- mPayload(payload)
+LLCallDialog(payload)
{
}
+void LLIncomingCallDialog::onLifetimeExpired()
+{
+ // check whether a call is valid or not
+ if (LLVoiceClient::getInstance()->findSession(mPayload["caller_id"].asUUID()))
+ {
+ // restart notification's timer if call is still valid
+ mLifetimeTimer.start();
+ }
+ else
+ {
+ // close invitation if call is already not valid
+ mLifetimeTimer.stop();
+ LLUUID session_id = mPayload["session_id"].asUUID();
+ gIMMgr->clearPendingAgentListUpdates(session_id);
+ gIMMgr->clearPendingInvitation(session_id);
+ closeFloater();
+ }
+}
+
BOOL LLIncomingCallDialog::postBuild()
{
- LLSD caller_id = mPayload["caller_id"];
- EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+ LLCallDialog::postBuild();
- std::string call_type = getString("VoiceInviteP2P");
+ LLUUID session_id = mPayload["session_id"].asUUID();
+ LLSD caller_id = mPayload["caller_id"];
std::string caller_name = mPayload["caller_name"].asString();
+
+ // init notification's lifetime
+ std::istringstream ss( getString("lifetime") );
+ if (!(ss >> mLifetime))
+ {
+ mLifetime = DEFAULT_LIFETIME;
+ }
+
+ std::string call_type;
+ if (gAgent.isInGroup(session_id))
+ {
+ LLStringUtil::format_map_t args;
+ LLGroupData data;
+ if (gAgent.getGroupData(session_id, data))
+ {
+ args["[GROUP]"] = data.mName;
+ call_type = getString(mPayload["notify_box_type"], args);
+ }
+ }
+ else
+ {
+ call_type = getString(mPayload["notify_box_type"]);
+ }
+
+
+ // check to see if this is an Avaline call
+ bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+ childSetVisible("Start IM", is_avatar); // no IM for avaline
+
if (caller_name == "anonymous")
{
caller_name = getString("anonymous");
}
-
- setTitle(caller_name + " " + call_type);
-
- // If it is not a P2P invite, then it's an AdHoc invite
- if ( type != IM_SESSION_P2P_INVITE )
+ else if (!is_avatar)
{
- call_type = getString("VoiceInviteAdHoc");
+ caller_name = LLTextUtil::formatPhoneNumber(caller_name);
}
+ setTitle(caller_name + " " + call_type);
+
LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
caller_name_widget->setValue(caller_name + " " + call_type);
- LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
- icon->setValue(caller_id);
+ setIcon(session_id, caller_id);
childSetAction("Accept", onAccept, this);
childSetAction("Reject", onReject, this);
childSetAction("Start IM", onStartIM, this);
- childSetFocus("Accept");
+ setDefaultBtn("Accept");
+
+ std::string notify_box_type = mPayload["notify_box_type"].asString();
+ if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc")
+ {
+ // starting notification's timer for P2P and AVALINE invitations
+ mLifetimeTimer.start();
+ }
+ else
+ {
+ mLifetimeTimer.stop();
+ }
+
+ setCanDrag(FALSE);
return TRUE;
}
+
+void LLIncomingCallDialog::onOpen(const LLSD& key)
+{
+ LLCallDialog::onOpen(key);
+
+ // tell the user which voice channel they would be leaving
+ LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice && !voice->getSessionName().empty())
+ {
+ childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+ }
+ else
+ {
+ childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+ }
+}
+
//static
void LLIncomingCallDialog::onAccept(void* user_data)
{
@@ -1134,7 +1884,12 @@ void LLIncomingCallDialog::onStartIM(void* user_data)
void LLIncomingCallDialog::processCallResponse(S32 response)
{
+ if (!gIMMgr || gDisconnected)
+ return;
+
LLUUID session_id = mPayload["session_id"].asUUID();
+ LLUUID caller_id = mPayload["caller_id"].asUUID();
+ std::string session_name = mPayload["session_name"].asString();
EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
bool voice = true;
@@ -1151,17 +1906,14 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
{
// create a normal IM session
session_id = gIMMgr->addP2PSession(
- mPayload["session_name"].asString(),
- mPayload["caller_id"].asUUID(),
- mPayload["session_handle"].asString());
+ session_name,
+ caller_id,
+ mPayload["session_handle"].asString(),
+ mPayload["session_uri"].asString());
if (voice)
{
- if (gIMMgr->startCall(session_id))
- {
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
- }
+ gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
}
gIMMgr->clearPendingAgentListUpdates(session_id);
@@ -1169,10 +1921,38 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
}
else
{
- gIMMgr->addSession(
- mPayload["session_name"].asString(),
- type,
- session_id);
+ //session name should not be empty, but it can contain spaces so we don't trim
+ std::string correct_session_name = session_name;
+ if (session_name.empty())
+ {
+ llwarns << "Received an empty session name from a server" << llendl;
+
+ switch(type){
+ case IM_SESSION_CONFERENCE_START:
+ case IM_SESSION_GROUP_START:
+ case IM_SESSION_INVITE:
+ if (gAgent.isInGroup(session_id))
+ {
+ LLGroupData data;
+ if (!gAgent.getGroupData(session_id, data)) break;
+ correct_session_name = data.mName;
+ }
+ else
+ {
+ if (gCacheName->getFullName(caller_id, correct_session_name))
+ {
+ correct_session_name.append(ADHOC_NAME_SUFFIX);
+ }
+ }
+ llinfos << "Corrected session name is " << correct_session_name << llendl;
+ break;
+ default:
+ llwarning("Received an empty session name from a server and failed to generate a new proper session name", 0);
+ break;
+ }
+ }
+
+ LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
@@ -1188,6 +1968,14 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
new LLViewerChatterBoxInvitationAcceptResponder(
session_id,
inv_type));
+
+ // send notification message to the corresponding chat
+ if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc")
+ {
+ std::string started_call = LLTrans::getString("started_call");
+ std::string message = mPayload["caller_name"].asString() + " " + started_call;
+ LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message);
+ }
}
}
if (voice)
@@ -1227,11 +2015,14 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
bool inviteUserResponse(const LLSD& notification, const LLSD& response)
{
+ if (!gIMMgr)
+ return false;
+
const LLSD& payload = notification["payload"];
LLUUID session_id = payload["session_id"].asUUID();
EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0: // accept
@@ -1245,21 +2036,17 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
payload["session_handle"].asString(),
payload["session_uri"].asString());
- if (gIMMgr->startCall(session_id))
- {
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
- }
+ gIMMgr->startCall(session_id);
gIMMgr->clearPendingAgentListUpdates(session_id);
gIMMgr->clearPendingInvitation(session_id);
}
else
{
- gIMMgr->addSession(
+ LLUUID new_session_id = gIMMgr->addSession(
payload["session_name"].asString(),
type,
- session_id);
+ session_id, true);
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
@@ -1324,18 +2111,12 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
// Member Functions
//
-LLIMMgr::LLIMMgr() :
- mIMReceived(FALSE)
+LLIMMgr::LLIMMgr()
{
- static bool registered_dialog = false;
- if (!registered_dialog)
- {
- LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
- registered_dialog = true;
- }
-
mPendingInvitations = LLSD::emptyMap();
mPendingAgentListUpdates = LLSD::emptyMap();
+
+ LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLIMFloater::sRemoveTypingIndicator, _1));
}
// Add a message to a session.
@@ -1361,7 +2142,6 @@ void LLIMMgr::addMessage(
return;
}
- LLFloaterIMPanel* floater;
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
{
@@ -1380,32 +2160,7 @@ void LLIMMgr::addMessage(
if (new_session)
{
LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
- }
- floater = findFloaterBySession(new_session_id);
- if (!floater)
- {
- floater = findFloaterBySession(other_participant_id);
- if (floater)
- {
- llinfos << "found the IM session " << session_id
- << " by participant " << other_participant_id << llendl;
- }
- }
-
- // create IM window as necessary
- if(!floater)
- {
- floater = createFloater(
- new_session_id,
- other_participant_id,
- fixed_session_name,
- dialog,
- FALSE);
- }
-
- if (new_session)
- {
// When we get a new IM, and if you are a god, display a bit
// of information about the source. This is to help liaisons
// when answering questions.
@@ -1424,58 +2179,13 @@ void LLIMMgr::addMessage(
//<< "*** region_id: " << region_id << std::endl
//<< "*** position: " << position << std::endl;
- floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
}
make_ui_sound("UISndNewIncomingIMSession");
}
- // now add message to floater
- bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
- const LLColor4& color = ( is_from_system ?
- LLUIColorTable::instance().getColor("SystemChatColor") :
- LLUIColorTable::instance().getColor("IMChatColor"));
- if ( !link_name )
- {
- floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
- }
- else
- {
- floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
-
- //*TODO consider moving that speaker management stuff into model (IB)
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(new_session_id);
- if (speaker_mgr)
- {
- speaker_mgr->speakerChatted(gAgentID);
- speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
- }
- }
-
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
-
- if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
- {
- LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance();
-
- //if the IM window is not open and the floater is not visible (i.e. not torn off)
- LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater();
-
- // select the newly added floater (or the floater with the new line added to it).
- // it should be there.
- chat_floater->selectFloater(floater);
-
- //there was a previously unseen IM, make that old tab flashing
- //it is assumed that the most recently unseen IM tab is the one current selected/active
- if ( previouslyActiveFloater && getIMReceived() )
- {
- chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE);
- }
-
- //notify of a new IM
- notifyNewIM();
- }
}
void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
@@ -1490,7 +2200,12 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
LLChat chat(message);
chat.mSourceType = CHAT_SOURCE_SYSTEM;
- LLFloaterChat::addChatHistory(chat);
+
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ nearby_chat->addMessage(chat);
+ }
}
else // going to IM session
{
@@ -1503,20 +2218,12 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
}
}
-void LLIMMgr::notifyNewIM()
-{
- if(!LLFloaterReg::instanceVisible("communicate"))
- {
- mIMReceived = TRUE;
- }
-}
-
S32 LLIMMgr::getNumberOfUnreadIM()
{
std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
S32 num = 0;
- for(it = LLIMModel::sSessionsMap.begin(); it != LLIMModel::sSessionsMap.end(); ++it)
+ for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
{
num += (*it).second->mNumUnread;
}
@@ -1524,14 +2231,32 @@ S32 LLIMMgr::getNumberOfUnreadIM()
return num;
}
-void LLIMMgr::clearNewIMNotification()
+S32 LLIMMgr::getNumberOfUnreadParticipantMessages()
{
- mIMReceived = FALSE;
+ std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
+
+ S32 num = 0;
+ for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
+ {
+ num += (*it).second->mParticipantUnreadMessageCount;
+ }
+
+ return num;
}
-BOOL LLIMMgr::getIMReceived() const
+void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)
{
- return mIMReceived;
+ LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!session) return;
+
+ if (session->mSessionInitialized)
+ {
+ startCall(session_id);
+ }
+ else
+ {
+ session->mStartCallOnInitialize = true;
+ }
}
LLUUID LLIMMgr::addP2PSession(const std::string& name,
@@ -1539,7 +2264,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
const std::string& voice_session_handle,
const std::string& caller_uri)
{
- LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
+ LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
if (speaker_mgr)
@@ -1560,11 +2285,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
LLUUID LLIMMgr::addSession(
const std::string& name,
EInstantMessage dialog,
- const LLUUID& other_participant_id)
+ const LLUUID& other_participant_id, bool voice)
{
LLDynamicArray<LLUUID> ids;
ids.put(other_participant_id);
- return addSession(name, dialog, other_participant_id, ids);
+ return addSession(name, dialog, other_participant_id, ids, voice);
}
// Adds a session using the given session_id. If the session already exists
@@ -1573,47 +2298,52 @@ LLUUID LLIMMgr::addSession(
const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids)
+ const LLDynamicArray<LLUUID>& ids, bool voice)
{
if (0 == ids.getLength())
{
return LLUUID::null;
}
+ if (name.empty())
+ {
+ llwarning("Session name cannot be null!", 0);
+ return LLUUID::null;
+ }
+
LLUUID session_id = computeSessionID(dialog,other_participant_id);
- if (!LLIMModel::getInstance()->findIMSession(session_id))
+ bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+
+ //works only for outgoing ad-hoc sessions
+ if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size())
{
- LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
+ LLIMModel::LLIMSession* ad_hoc_found = LLIMModel::getInstance()->findAdHocIMSession(ids);
+ if (ad_hoc_found)
+ {
+ new_session = false;
+ session_id = ad_hoc_found->mSessionID;
+ }
}
- LLIMFloater::show(session_id);
-
- //*TODO remove this "floater" thing when Communicate Floater's gone
- LLFloaterIMPanel* floater = findFloaterBySession(session_id);
- if(!floater)
+ if (new_session)
{
- // On creation, use the first element of ids as the
- // "other_participant_id"
- floater = createFloater(
- session_id,
- other_participant_id,
- name,
- dialog,
- TRUE,
- ids);
+ LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
}
- noteOfflineUsers(session_id, floater, ids);
+ //we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
+ if (!new_session) return session_id;
+
+ //Per Plan's suggestion commented "explicit offline status warning" out to make Dessie happier (see EXT-3609)
+ //*TODO After February 2010 remove this commented out line if no one will be missing that warning
+ //noteOfflineUsers(session_id, floater, ids);
// Only warn for regular IMs - not group IMs
if( dialog == IM_NOTHING_SPECIAL )
{
- noteMutedUsers(session_id, floater, ids);
+ noteMutedUsers(session_id, ids);
}
-
-
return session_id;
}
@@ -1632,14 +2362,6 @@ void LLIMMgr::removeSession(const LLUUID& session_id)
{
llassert_always(hasSession(session_id));
- //*TODO remove this floater thing when Communicate Floater is being deleted (IB)
- LLFloaterIMPanel* floater = findFloaterBySession(session_id);
- if(floater)
- {
- mFloaters.erase(floater->getHandle());
- LLFloaterChatterBox::getInstance()->removeFloater(floater);
- }
-
clearPendingInvitation(session_id);
clearPendingAgentListUpdates(session_id);
@@ -1733,18 +2455,7 @@ void LLIMMgr::inviteToSession(
}
else
{
- if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
- {
- LLFloaterReg::showInstance("incoming_call", payload, TRUE);
- }
- else
- {
- LLSD args;
- args["NAME"] = caller_name;
- args["GROUP"] = session_name;
-
- LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
- }
+ LLFloaterReg::showInstance("incoming_call", payload, FALSE);
}
mPendingInvitations[session_id.asString()] = LLSD();
}
@@ -1757,67 +2468,15 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri
std::string notify_box_type = payload["notify_box_type"].asString();
- if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
- {
- LLFloaterReg::showInstance("incoming_call", payload, TRUE);
- }
- else
- {
- LLSD args;
- args["NAME"] = payload["caller_name"].asString();
-
- LLNotifications::instance().add(
- payload["notify_box_type"].asString(),
- args,
- payload,
- &inviteUserResponse);
- }
+ LLFloaterReg::showInstance("incoming_call", payload, FALSE);
}
+//*TODO disconnects all sessions
void LLIMMgr::disconnectAllSessions()
{
- LLFloaterIMPanel* floater = NULL;
- std::set<LLHandle<LLFloater> >::iterator handle_it;
- for(handle_it = mFloaters.begin();
- handle_it != mFloaters.end();
- )
- {
- floater = (LLFloaterIMPanel*)handle_it->get();
-
- // MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash.
- ++handle_it;
-
- if (floater)
- {
- floater->setEnabled(FALSE);
- floater->closeFloater(TRUE);
- }
- }
+ //*TODO disconnects all IM sessions
}
-
-// This method returns the im panel corresponding to the uuid
-// provided. The uuid can either be a session id or an agent
-// id. Returns NULL if there is no matching panel.
-LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
-{
- LLFloaterIMPanel* rv = NULL;
- std::set<LLHandle<LLFloater> >::iterator handle_it;
- for(handle_it = mFloaters.begin();
- handle_it != mFloaters.end();
- ++handle_it)
- {
- rv = (LLFloaterIMPanel*)handle_it->get();
- if(rv && session_id == rv->getSessionID())
- {
- break;
- }
- rv = NULL;
- }
- return rv;
-}
-
-
BOOL LLIMMgr::hasSession(const LLUUID& session_id)
{
return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
@@ -1831,6 +2490,34 @@ void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
}
}
+void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
+{
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ if ( im_floater )
+ {
+ im_floater->processAgentListUpdates(body);
+ }
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ if (speaker_mgr)
+ {
+ speaker_mgr->updateSpeakers(body);
+
+ // also the same call is added into LLVoiceClient::participantUpdatedEvent because
+ // sometimes it is called AFTER LLViewerChatterBoxSessionAgentListUpdates::post()
+ // when moderation state changed too late. See EXT-3544.
+ speaker_mgr->update(true);
+ }
+ else
+ {
+ //we don't have a speaker manager yet..something went wrong
+ //we are probably receiving an update here before
+ //a start or an acceptance of an invitation. Race condition.
+ gIMMgr->addPendingAgentListUpdates(
+ session_id,
+ body);
+ }
+}
+
LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id)
{
if ( mPendingAgentListUpdates.has(session_id.asString()) )
@@ -1946,11 +2633,12 @@ void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
mSessionObservers.remove(observer);
}
-bool LLIMMgr::startCall(const LLUUID& session_id)
+bool LLIMMgr::startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction)
{
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
if (!voice_channel) return false;
+ voice_channel->setCallDirection(direction);
voice_channel->activate();
return true;
}
@@ -1964,56 +2652,29 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
return true;
}
-// create a floater and update internal representation for
-// consistency. Returns the pointer, caller (the class instance since
-// it is a private method) is not responsible for deleting the
-// pointer. Add the floater to this but do not select it.
-LLFloaterIMPanel* LLIMMgr::createFloater(
- const LLUUID& session_id,
- const LLUUID& other_participant_id,
- const std::string& session_label,
- EInstantMessage dialog,
- BOOL user_initiated,
- const LLDynamicArray<LLUUID>& ids)
+bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
{
- if (session_id.isNull())
- {
- llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
- }
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!im_session) return false;
- llinfos << "LLIMMgr::createFloater: from " << other_participant_id
- << " in session " << session_id << llendl;
- LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
- session_id,
- other_participant_id,
- ids,
- dialog);
- LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
- LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
- mFloaters.insert(floater->getHandle());
- return floater;
+ return im_session->mStartedAsIMCall;
}
void LLIMMgr::noteOfflineUsers(
const LLUUID& session_id,
- LLFloaterIMPanel* floater,
const LLDynamicArray<LLUUID>& ids)
{
S32 count = ids.count();
if(count == 0)
{
const std::string& only_user = LLTrans::getString("only_user_message");
- if (floater)
- {
- floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
- }
LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
}
else
{
const LLRelationship* info = NULL;
LLAvatarTracker& at = LLAvatarTracker::instance();
- LLIMModel* im_model = LLIMModel::getInstance();
+ LLIMModel& im_model = LLIMModel::instance();
for(S32 i = 0; i < count; ++i)
{
info = at.getBuddyInfo(ids.get(i));
@@ -2024,19 +2685,13 @@ void LLIMMgr::noteOfflineUsers(
LLUIString offline = LLTrans::getString("offline_message");
offline.setArg("[FIRST]", first);
offline.setArg("[LAST]", last);
-
- if (floater)
- {
- floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor"));
- }
-
- im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, offline);
+ im_model.proccessOnlineOfflineNotification(session_id, offline);
}
}
}
}
-void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
+void LLIMMgr::noteMutedUsers(const LLUUID& session_id,
const LLDynamicArray<LLUUID>& ids)
{
// Don't do this if we don't have a mute list.
@@ -2057,9 +2712,6 @@ void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater
{
LLUIString muted = LLTrans::getString("muted_message");
- //*TODO remove this "floater" thing when Communicate Floater's gone
- floater->addHistoryLine(muted);
-
im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
break;
}
@@ -2080,12 +2732,6 @@ void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
{
LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
- LLFloaterIMPanel* floater = findFloaterBySession(session_id);
- if (floater)
- {
- floater->processIMTyping(im_info, typing);
- }
-
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
if ( im_floater )
{
@@ -2122,7 +2768,7 @@ public:
{
session_id = body["session_id"].asUUID();
- LLIMModel::getInstance()->updateSessionID(temp_session_id, session_id);
+ LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
if (speaker_mgr)
@@ -2131,15 +2777,6 @@ public:
speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
}
- LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
- if (floaterp)
- {
- if ( body.has("session_info") )
- {
- floaterp->processSessionUpdate(body["session_info"]);
- }
- }
-
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
if ( im_floater )
{
@@ -2221,20 +2858,7 @@ public:
const LLSD& input) const
{
const LLUUID& session_id = input["body"]["session_id"].asUUID();
- LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
- if (speaker_mgr)
- {
- speaker_mgr->updateSpeakers(input["body"]);
- }
- else
- {
- //we don't have a speaker manager yet..something went wrong
- //we are probably receiving an update here before
- //a start or an acceptance of an invitation. Race condition.
- gIMMgr->addPendingAgentListUpdates(
- input["body"]["session_id"].asUUID(),
- input["body"]);
- }
+ gIMMgr->processAgentListUpdates(session_id, input["body"]);
}
};
@@ -2247,16 +2871,16 @@ public:
const LLSD& input) const
{
LLUUID session_id = input["body"]["session_id"].asUUID();
- LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
- if (floaterp)
- {
- floaterp->processSessionUpdate(input["body"]["info"]);
- }
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
if ( im_floater )
{
im_floater->processSessionUpdate(input["body"]["info"]);
}
+ LLIMSpeakerMgr* im_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ if (im_mgr)
+ {
+ im_mgr->processSessionUpdate(input["body"]["info"]);
+ }
}
};
@@ -2305,15 +2929,6 @@ public:
BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
std::string separator_string(": ");
- int message_offset=0;
-
- //Handle IRC styled /me messages.
- std::string prefix = message.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- separator_string = "";
- message_offset = 3;
- }
chat.mMuted = is_muted && !is_linden;
chat.mFromID = from_id;
@@ -2330,7 +2945,7 @@ public:
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- std::string buffer = saved + message.substr(message_offset);
+ std::string buffer = saved + message;
BOOL is_this_agent = FALSE;
if(from_id == gAgentID)
@@ -2349,9 +2964,6 @@ public:
ll_vector3_from_sd(message_params["position"]),
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
- LLFloaterChat::addChat(chat, TRUE, is_this_agent);
-
//K now we want to accept the invitation
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index d0bd594df1..e7404074e0 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -33,19 +33,18 @@
#ifndef LL_LLIMVIEW_H
#define LL_LLIMVIEW_H
-#include "lldarray.h"
-#include "llspeakers.h" //for LLIMSpeakerMgr
-#include "llimpanel.h" //for voice channels
-#include "llmodaldialog.h"
+#include "lldockablefloater.h"
#include "llinstantmessage.h"
-#include "lluuid.h"
-#include "llmultifloater.h"
+
#include "lllogchat.h"
+#include "llvoicechannel.h"
+
+
-class LLFloaterChatterBox;
-class LLUUID;
-class LLFloaterIMPanel;
class LLFriendObserver;
+class LLCallDialogManager;
+class LLIMSpeakerMgr;
+
class LLIMModel : public LLSingleton<LLIMModel>
{
@@ -53,20 +52,59 @@ public:
struct LLIMSession
{
+ typedef enum e_session_type
+ { // for now we have 4 predefined types for a session
+ P2P_SESSION,
+ GROUP_SESSION,
+ ADHOC_SESSION,
+ AVALINE_SESSION,
+ } SType;
+
LLIMSession(const LLUUID& session_id, const std::string& name,
- const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
+ const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
virtual ~LLIMSession();
void sessionInitReplyReceived(const LLUUID& new_session_id);
- void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
+ void addMessagesFromHistory(const std::list<LLSD>& history);
+ void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history = false);
+ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
+
+ /** @deprecated */
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
+ bool isAdHoc();
+ bool isP2P();
+ bool isOtherParticipantAvaline();
+
+ bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
+ bool isAdHocSessionType() const { return mSessionType == ADHOC_SESSION;}
+ bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
+ bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
+
+ //*TODO make private
+ /** ad-hoc sessions involve sophisticated chat history file naming schemes */
+ void buildHistoryFileName();
+
+ //*TODO make private
+ static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
+
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
+ SType mSessionType;
LLUUID mOtherParticipantID;
std::vector<LLUUID> mInitialTargetIDs;
+ std::string mHistoryFileName;
+
+ // connection to voice channel state change signal
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
+
+ //does NOT include system messages and agent's messages
+ S32 mParticipantUnreadMessageCount;
+
+ // does include all incoming messages
S32 mNumUnread;
+
std::list<LLSD> mMsgs;
LLVoiceChannel* mVoiceChannel;
@@ -80,6 +118,10 @@ public:
bool mTextIMPossible;
bool mOtherParticipantIsAvatar;
+ bool mStartCallOnInitialize;
+
+ //if IM session is created for a voice call
+ bool mStartedAsIMCall;
};
@@ -92,8 +134,8 @@ public:
void resetActiveSessionID() { mActiveSessionID.setNull(); }
LLUUID getActiveSessionID() { return mActiveSessionID; }
- //*TODO make it non-static as LLIMMOdel is a singleton (IB)
- static std::map<LLUUID, LLIMSession*> sSessionsMap; //mapping session_id to session
+ /** Session id to session object */
+ std::map<LLUUID, LLIMSession*> mId2SessionMap;
typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;
typedef boost::function<void(const LLSD&)> session_callback_t;
@@ -106,19 +148,29 @@ public:
*/
LLIMSession* findIMSession(const LLUUID& session_id) const;
+ /**
+ * Find an Ad-Hoc IM Session with specified participants
+ * @return first found Ad-Hoc session or NULL if the session does not exist
+ */
+ LLIMSession* findAdHocIMSession(const std::vector<LLUUID>& ids);
+
/**
* Rebind session data to a new session id.
*/
- void updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ void processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id);
boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
/**
* Create new session object in a model
+ * @param name session name should not be empty, will return false if empty
*/
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
- const std::vector<LLUUID>& ids = std::vector<LLUUID>());
+ const std::vector<LLUUID>& ids, bool voice = false);
+
+ bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
+ const LLUUID& other_participant_id, bool voice = false);
/**
* Remove all session data associated with a session specified by session_id
@@ -136,7 +188,18 @@ public:
* It sends new message signal for each added message.
*/
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
-
+
+ /**
+ * Similar to addMessage(...) above but won't send a signal about a new message added
+ */
+ LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
+ const std::string& utf8_text, bool log2file = true);
+
+ /**
+ * Add a system message to an IM Model
+ */
+ bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text);
+
/**
* Get a session's name.
* For a P2P chat - it's an avatar's name,
@@ -177,6 +240,8 @@ public:
*/
LLIMSpeakerMgr* getSpeakerManager(const LLUUID& session_id) const;
+ const std::string& getHistoryFileName(const LLUUID& session_id) const;
+
static void sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id);
static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
const std::vector<LLUUID>& ids, EInstantMessage dialog);
@@ -186,6 +251,11 @@ public:
void testMessages();
+ /**
+ * Saves an IM message into a file
+ */
+ bool logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+
private:
/**
@@ -249,20 +319,26 @@ public:
// session.
LLUUID addSession(const std::string& name,
EInstantMessage dialog,
- const LLUUID& other_participant_id);
+ const LLUUID& other_participant_id, bool voice = false);
// Adds a session using a specific group of starting agents
// the dialog type is assumed correct. Returns the uuid of the session.
LLUUID addSession(const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids);
+ const LLDynamicArray<LLUUID>& ids, bool voice = false);
- // Creates a P2P session with the requisite handle for responding to voice calls
+ /**
+ * Creates a P2P session with the requisite handle for responding to voice calls.
+ *
+ * @param name session name, cannot be null
+ * @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid
+ * incorrect working of LLVoiceChannel instances. See EXT-2985.
+ */
LLUUID addP2PSession(const std::string& name,
const LLUUID& other_participant_id,
const std::string& voice_session_handle,
- const std::string& caller_uri = LLStringUtil::null);
+ const std::string& caller_uri);
/**
* Leave the session with session id. Send leave session notification
@@ -284,15 +360,17 @@ public:
void processIMTypingStart(const LLIMInfo* im_info);
void processIMTypingStop(const LLIMInfo* im_info);
- void notifyNewIM();
- void clearNewIMNotification();
+ // automatically start a call once the session has initialized
+ void autoStartCallOnStartup(const LLUUID& session_id);
- // IM received that you haven't seen yet
- BOOL getIMReceived() const;
-
- // Calc number of unread IMs
+ // Calc number of all unread IMs
S32 getNumberOfUnreadIM();
+ /**
+ * Calculates number of unread IMs from real participants in all stored sessions
+ */
+ S32 getNumberOfUnreadParticipantMessages();
+
// This method is used to go through all active sessions and
// disable all of them. This method is usally called when you are
// forced to log out or similar situations where you do not have a
@@ -301,25 +379,17 @@ public:
BOOL hasSession(const LLUUID& session_id);
- // This method returns the im panel corresponding to the uuid
- // provided. The uuid must be a session id. Returns NULL if there
- // is no matching panel.
- LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id);
-
static LLUUID computeSessionID(EInstantMessage dialog, const LLUUID& other_participant_id);
void clearPendingInvitation(const LLUUID& session_id);
+ void processAgentListUpdates(const LLUUID& session_id, const LLSD& body);
LLSD getPendingAgentListUpdates(const LLUUID& session_id);
void addPendingAgentListUpdates(
const LLUUID& sessioN_id,
const LLSD& updates);
void clearPendingAgentListUpdates(const LLUUID& session_id);
- //HACK: need a better way of enumerating existing session, or listening to session create/destroy events
- //@deprecated, is used only by LLToolBox, which is not used anywhere, right? (IB)
- const std::set<LLHandle<LLFloater> >& getIMFloaterHandles() { return mFloaters; }
-
void addSessionObserver(LLIMSessionObserver *);
void removeSessionObserver(LLIMSessionObserver *);
@@ -333,7 +403,7 @@ public:
* Start call in a session
* @return false if voice channel doesn't exist
**/
- bool startCall(const LLUUID& session_id);
+ bool startCall(const LLUUID& session_id, LLVoiceChannel::EDirection direction = LLVoiceChannel::OUTGOING_CALL);
/**
* End call in a session
@@ -341,6 +411,8 @@ public:
**/
bool endCall(const LLUUID& session_id);
+ bool isVoiceCall(const LLUUID& session_id);
+
private:
/**
@@ -348,23 +420,12 @@ private:
*/
void removeSession(const LLUUID& session_id);
- // create a panel and update internal representation for
- // consistency. Returns the pointer, caller (the class instance
- // since it is a private method) is not responsible for deleting
- // the pointer.
- LLFloaterIMPanel* createFloater(const LLUUID& session_id,
- const LLUUID& target_id,
- const std::string& name,
- EInstantMessage dialog,
- BOOL user_initiated = FALSE,
- const LLDynamicArray<LLUUID>& ids = LLDynamicArray<LLUUID>());
-
// This simple method just iterates through all of the ids, and
// prints a simple message if they are not online. Used to help
// reduce 'hello' messages to the linden employees unlucky enough
// to have their calling card in the default inventory.
- void noteOfflineUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
- void noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids);
+ void noteOfflineUsers(const LLUUID& session_id, const LLDynamicArray<LLUUID>& ids);
+ void noteMutedUsers(const LLUUID& session_id, const LLDynamicArray<LLUUID>& ids);
void processIMTypingCore(const LLIMInfo* im_info, BOOL typing);
@@ -376,34 +437,98 @@ private:
private:
- //*TODO should be deleted when Communicate Floater is being deleted
- std::set<LLHandle<LLFloater> > mFloaters;
-
typedef std::list <LLIMSessionObserver *> session_observers_list_t;
session_observers_list_t mSessionObservers;
- // An IM has been received that you haven't seen yet.
- BOOL mIMReceived;
-
LLSD mPendingInvitations;
LLSD mPendingAgentListUpdates;
};
-class LLIncomingCallDialog : public LLModalDialog
+class LLCallDialogManager : public LLInitClass<LLCallDialogManager>
+{
+public:
+ LLCallDialogManager();
+ ~LLCallDialogManager();
+
+ static void initClass();
+ static void onVoiceChannelChanged(const LLUUID &session_id);
+ static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent);
+
+protected:
+ static std::string sPreviousSessionlName;
+ static LLIMModel::LLIMSession::SType sPreviousSessionType;
+ static std::string sCurrentSessionlName;
+ static LLIMModel::LLIMSession* sSession;
+ static LLVoiceChannel::EState sOldState;
+};
+
+class LLCallDialog : public LLDockableFloater
+{
+public:
+ LLCallDialog(const LLSD& payload);
+ ~LLCallDialog() {}
+
+ virtual BOOL postBuild();
+
+ // check timer state
+ /*virtual*/ void draw();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+protected:
+ // lifetime timer for a notification
+ LLTimer mLifetimeTimer;
+ // notification's lifetime in seconds
+ S32 mLifetime;
+ static const S32 DEFAULT_LIFETIME = 5;
+ virtual bool lifetimeHasExpired();
+ virtual void onLifetimeExpired();
+
+ virtual void getAllowedRect(LLRect& rect);
+
+ /**
+ * Sets icon depend on session.
+ *
+ * If passed session_id is a group id group icon will be shown, otherwise avatar icon for participant_id
+ *
+ * @param session_id - UUID of session
+ * @param participant_id - UUID of other participant
+ */
+ void setIcon(const LLSD& session_id, const LLSD& participant_id);
+
+ LLSD mPayload;
+};
+
+class LLIncomingCallDialog : public LLCallDialog
{
public:
LLIncomingCallDialog(const LLSD& payload);
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
static void onAccept(void* user_data);
static void onReject(void* user_data);
static void onStartIM(void* user_data);
private:
+ /*virtual*/ void onLifetimeExpired();
void processCallResponse(S32 response);
+};
- LLSD mPayload;
+class LLOutgoingCallDialog : public LLCallDialog
+{
+public:
+ LLOutgoingCallDialog(const LLSD& payload);
+
+ /*virtual*/ BOOL postBuild();
+ void show(const LLSD& key);
+
+ static void onCancel(void* user_data);
+ static const LLUUID OCD_KEY;
+
+private:
+ // hide all text boxes
+ void hideAllText();
};
// Globals
diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp
index aa299014ee..81cfce53b1 100644
--- a/indra/newview/llinspect.cpp
+++ b/indra/newview/llinspect.cpp
@@ -32,8 +32,10 @@
#include "llinspect.h"
+#include "lltooltip.h"
#include "llcontrol.h" // LLCachedControl
#include "llui.h" // LLUI::sSettingsGroups
+#include "llviewermenu.h"
LLInspect::LLInspect(const LLSD& key)
: LLFloater(key),
@@ -50,16 +52,16 @@ LLInspect::~LLInspect()
void LLInspect::draw()
{
static LLCachedControl<F32> FADE_TIME(*LLUI::sSettingGroups["config"], "InspectorFadeTime", 1.f);
+ static LLCachedControl<F32> STAY_TIME(*LLUI::sSettingGroups["config"], "InspectorShowTime", 1.f);
if (mOpenTimer.getStarted())
{
- F32 alpha = clamp_rescale(mOpenTimer.getElapsedTimeF32(), 0.f, FADE_TIME, 0.f, 1.f);
- LLViewDrawContext context(alpha);
LLFloater::draw();
- if (alpha == 1.f)
+ if (mOpenTimer.getElapsedTimeF32() > STAY_TIME)
{
mOpenTimer.stop();
+ mCloseTimer.start();
}
-
+
}
else if (mCloseTimer.getStarted())
{
@@ -95,3 +97,59 @@ void LLInspect::onFocusLost()
mCloseTimer.start();
mOpenTimer.stop();
}
+
+// virtual
+BOOL LLInspect::handleHover(S32 x, S32 y, MASK mask)
+{
+ mOpenTimer.pause();
+ return LLView::handleHover(x, y, mask);
+}
+
+BOOL LLInspect::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+
+
+ //delegate handling of tooltip to the hovered child
+ LLView* child_handler = childFromPoint(x,y);
+ if (child_handler && !child_handler->getToolTip().empty())// show tooltip if a view has non-empty tooltip message
+ {
+ //build LLInspector params to get correct tooltip setting, etc. background image
+ LLInspector::Params params;
+ params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ params.message = child_handler->getToolTip();
+ //set up delay if there is no visible tooltip at this moment
+ params.delay_time = LLToolTipMgr::instance().toolTipVisible() ? 0.f : LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
+ LLToolTipMgr::instance().show(params);
+ handled = TRUE;
+ }
+ return handled;
+}
+// virtual
+void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mOpenTimer.unpause();
+}
+
+bool LLInspect::childHasVisiblePopupMenu()
+{
+ // Child text-box may spawn a pop-up menu, if mouse is over the menu, Inspector
+ // will hide(which is not expected).
+ // This is an attempt to find out if child control has spawned a menu.
+
+ LLView* child_menu = gMenuHolder->getVisibleMenu();
+ if(child_menu)
+ {
+ LLRect floater_rc = calcScreenRect();
+ LLRect menu_screen_rc = child_menu->calcScreenRect();
+ S32 mx, my;
+ LLUI::getMousePositionScreen(&mx, &my);
+
+ // This works wrong if we spawn a menu near Inspector and menu overlaps Inspector.
+ if(floater_rc.overlaps(menu_screen_rc) && menu_screen_rc.pointInRect(mx, my))
+ {
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h
index a461c2fa16..6d994a8d7c 100644
--- a/indra/newview/llinspect.h
+++ b/indra/newview/llinspect.h
@@ -46,13 +46,20 @@ public:
/// Inspectors have a custom fade-in/fade-out animation
/*virtual*/ void draw();
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+
/// Start open animation
/*virtual*/ void onOpen(const LLSD& avatar_id);
/// Inspectors close themselves when they lose focus
/*virtual*/ void onFocusLost();
-private:
+protected:
+
+ virtual bool childHasVisiblePopupMenu();
+
LLFrameTimer mCloseTimer;
LLFrameTimer mOpenTimer;
};
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 99580d0918..14bc4376fe 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -39,14 +39,19 @@
#include "llavataractions.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
+#include "lldateutil.h"
#include "llfloaterreporter.h"
#include "llfloaterworldmap.h"
+#include "llimview.h"
#include "llinspect.h"
#include "llmutelist.h"
#include "llpanelblockedlist.h"
#include "llstartup.h"
+#include "llspeakers.h"
#include "llviewermenu.h"
#include "llvoiceclient.h"
+#include "llviewerobjectlist.h"
+#include "lltransientfloatermgr.h"
// Linden libraries
#include "llfloater.h"
@@ -67,7 +72,7 @@ class LLFetchAvatarData;
// Avatar Inspector, a small information window used when clicking
// on avatar names in the 2D UI and in the ambient inspector widget for
// the 3D world.
-class LLInspectAvatar : public LLInspect
+class LLInspectAvatar : public LLInspect, LLTransientFloater
{
friend class LLFloaterReg;
@@ -89,6 +94,12 @@ public:
// Update view based on information from avatar properties processor
void processAvatarData(LLAvatarData* data);
+ // override the inspector mouse leave so timer is only paused if
+ // gear menu is not open
+ /* virtual */ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
+
private:
// Make network requests for all the data to display in this view.
// Used on construction and if avatar id changes.
@@ -97,21 +108,38 @@ private:
// Set the volume slider to this user's current client-side volume setting,
// hiding/disabling if the user is not nearby.
void updateVolumeSlider();
+
+ // Shows/hides moderator panel depending on voice state
+ void updateModeratorPanel();
+
+ // Moderator ability to enable/disable voice chat for avatar
+ void toggleSelectedVoice(bool enabled);
// Button callbacks
void onClickAddFriend();
void onClickViewProfile();
void onClickIM();
+ void onClickCall();
void onClickTeleport();
void onClickInviteToGroup();
void onClickPay();
- void onClickBlock();
+ void onClickShare();
+ void onToggleMute();
void onClickReport();
+ void onClickFreeze();
+ void onClickEject();
void onClickZoomIn();
void onClickFindOnMap();
bool onVisibleFindOnMap();
+ bool onVisibleFreezeEject();
+ bool onVisibleZoomIn();
void onClickMuteVolume();
void onVolumeChange(const LLSD& data);
+ bool enableMute();
+ bool enableUnmute();
+
+ // Is used to determine if "Add friend" option should be enabled in gear menu
+ bool isNotFriend();
// Callback for gCacheName to look up avatar name
void nameUpdatedCallback(
@@ -124,7 +152,6 @@ private:
LLUUID mAvatarID;
// Need avatar name information to spawn friend add request
std::string mAvatarName;
- LLUUID mPartnerID;
// an in-flight request for avatar properties from LLAvatarPropertiesProcessor
// is represented by this object
LLFetchAvatarData* mPropertiesRequest;
@@ -178,26 +205,44 @@ public:
LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
: LLInspect( LLSD() ), // single_instance, doesn't really need key
- mAvatarID(), // set in onOpen()
- mPartnerID(),
+ mAvatarID(), // set in onOpen() *Note: we used to show partner's name but we dont anymore --angela 3rd Dec*
mAvatarName(),
mPropertiesRequest(NULL)
{
mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile", boost::bind(&LLInspectAvatar::onClickViewProfile, this));
mCommitCallbackRegistrar.add("InspectAvatar.AddFriend", boost::bind(&LLInspectAvatar::onClickAddFriend, this));
- mCommitCallbackRegistrar.add("InspectAvatar.IM", boost::bind(&LLInspectAvatar::onClickIM, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.IM",
+ boost::bind(&LLInspectAvatar::onClickIM, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Call", boost::bind(&LLInspectAvatar::onClickCall, this));
mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this));
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
- mCommitCallbackRegistrar.add("InspectAvatar.Block", boost::bind(&LLInspectAvatar::onClickBlock, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
+ boost::bind(&LLInspectAvatar::onClickFreeze, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Eject",
+ boost::bind(&LLInspectAvatar::onClickEject, this));
mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this));
mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this));
mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
- mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
-
+ mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
+ mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",
+ boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn",
+ boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
+ mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
// can't make the properties request until the widgets are constructed
// as it might return immediately, so do it in postBuild.
+
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+ LLTransientFloater::init(this);
}
LLInspectAvatar::~LLInspectAvatar()
@@ -206,6 +251,8 @@ LLInspectAvatar::~LLInspectAvatar()
// view
delete mPropertiesRequest;
mPropertiesRequest = NULL;
+
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
/*virtual*/
@@ -227,8 +274,6 @@ BOOL LLInspectAvatar::postBuild(void)
}
-
-
// Multiple calls to showInstance("inspect_avatar", foo) will provide different
// LLSD for foo, which we will catch here.
//virtual
@@ -239,13 +284,12 @@ void LLInspectAvatar::onOpen(const LLSD& data)
// Extract appropriate avatar id
mAvatarID = data["avatar_id"];
- mPartnerID = LLUUID::null;
BOOL self = mAvatarID == gAgent.getID();
getChild<LLUICtrl>("gear_self_btn")->setVisible(self);
getChild<LLUICtrl>("gear_btn")->setVisible(!self);
-
+
// Position the inspector relative to the mouse cursor
// Similar to how tooltips are positioned
// See LLToolTipMgr::createToolTip
@@ -262,6 +306,8 @@ void LLInspectAvatar::onOpen(const LLSD& data)
requestUpdate();
updateVolumeSlider();
+
+ updateModeratorPanel();
}
// virtual
@@ -289,7 +335,6 @@ void LLInspectAvatar::requestUpdate()
getChild<LLUICtrl>("user_name")->setValue("");
getChild<LLUICtrl>("user_subtitle")->setValue("");
getChild<LLUICtrl>("user_details")->setValue("");
- getChild<LLUICtrl>("user_partner")->setValue("");
// Make a new request for properties
delete mPropertiesRequest;
@@ -298,7 +343,21 @@ void LLInspectAvatar::requestUpdate()
// You can't re-add someone as a friend if they are already your friend
bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
bool is_self = (mAvatarID == gAgentID);
- childSetEnabled("add_friend_btn", !is_friend && !is_self);
+ if (is_self)
+ {
+ getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
+ getChild<LLUICtrl>("im_btn")->setVisible(false);
+ }
+ else if (is_friend)
+ {
+ getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
+ getChild<LLUICtrl>("im_btn")->setVisible(true);
+ }
+ else
+ {
+ getChild<LLUICtrl>("add_friend_btn")->setVisible(true);
+ getChild<LLUICtrl>("im_btn")->setVisible(false);
+ }
// Use an avatar_icon even though the image id will come down with the
// avatar properties because the avatar_icon code maintains a cache of icons
@@ -320,7 +379,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
{
LLStringUtil::format_map_t args;
args["[BORN_ON]"] = data->born_on;
- args["[AGE]"] = data->born_on;
+ args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
args["[SL_PROFILE]"] = data->about_text;
args["[RW_PROFILE"] = data->fl_about_text;
args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
@@ -333,58 +392,200 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
std::string details = getString("Details", args);
getChild<LLUICtrl>("user_details")->setValue( LLSD(details) );
- // Look up partner name, if there is one
- mPartnerID = data->partner_id;
- if (mPartnerID.notNull())
- {
- gCacheName->get(mPartnerID, FALSE,
- boost::bind(&LLInspectAvatar::nameUpdatedCallback,
- this, _1, _2, _3, _4));
- }
-
// Delete the request object as it has been satisfied
delete mPropertiesRequest;
mPropertiesRequest = NULL;
}
-void LLInspectAvatar::updateVolumeSlider()
+// For the avatar inspector, we only want to unpause the fade timer
+// if neither the gear menu or self gear menu are open
+void LLInspectAvatar::onMouseLeave(S32 x, S32 y, MASK mask)
{
- // By convention, we only display and toggle voice mutes, not all mutes
- bool is_muted = LLMuteList::getInstance()->
- isMuted(mAvatarID, LLMute::flagVoiceChat);
- bool voice_enabled = gVoiceClient->getVoiceEnabled(mAvatarID);
+ LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
+ LLMenuGL* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu();
+ if ( gear_menu && gear_menu->getVisible() &&
+ gear_menu_self && gear_menu_self->getVisible() )
+ {
+ return;
+ }
- LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
- mute_btn->setEnabled( voice_enabled );
- mute_btn->setValue( is_muted );
+ if(childHasVisiblePopupMenu())
+ {
+ return;
+ }
- LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
- volume_slider->setEnabled( voice_enabled && !is_muted );
- const F32 DEFAULT_VOLUME = 0.5f;
- F32 volume;
- if (is_muted)
+ mOpenTimer.unpause();
+}
+
+void LLInspectAvatar::updateModeratorPanel()
+{
+ bool enable_moderator_panel = false;
+
+ if (LLVoiceChannel::getCurrentVoiceChannel() &&
+ mAvatarID != gAgent.getID())
+ {
+ LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
+
+ if (session_id != LLUUID::null)
+ {
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+
+ if (speaker_mgr)
+ {
+ LLPointer<LLSpeaker> self_speakerp = speaker_mgr->findSpeaker(gAgent.getID());
+ LLPointer<LLSpeaker> selected_speakerp = speaker_mgr->findSpeaker(mAvatarID);
+
+ if(speaker_mgr->isVoiceActive() && selected_speakerp &&
+ selected_speakerp->isInVoiceChannel() &&
+ ((self_speakerp && self_speakerp->mIsModerator) || gAgent.isGodlike()))
+ {
+ getChild<LLUICtrl>("enable_voice")->setVisible(selected_speakerp->mModeratorMutedVoice);
+ getChild<LLUICtrl>("disable_voice")->setVisible(!selected_speakerp->mModeratorMutedVoice);
+
+ enable_moderator_panel = true;
+ }
+ }
+ }
+ }
+
+ if (enable_moderator_panel)
{
- // it's clearer to display their volume as zero
- volume = 0.f;
+ if (!getChild<LLUICtrl>("moderator_panel")->getVisible())
+ {
+ getChild<LLUICtrl>("moderator_panel")->setVisible(true);
+ // stretch the floater so it can accommodate the moderator panel
+ reshape(getRect().getWidth(), getRect().getHeight() + getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());
+ }
}
- else if (!voice_enabled)
+ else if (getChild<LLUICtrl>("moderator_panel")->getVisible())
{
- // use nominal value rather than 0
- volume = DEFAULT_VOLUME;
+ getChild<LLUICtrl>("moderator_panel")->setVisible(false);
+ // shrink the inspector floater back to original size
+ reshape(getRect().getWidth(), getRect().getHeight() - getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());
}
- else
+}
+
+void LLInspectAvatar::toggleSelectedVoice(bool enabled)
+{
+ LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+
+ if (speaker_mgr)
{
- // actual volume
- volume = gVoiceClient->getUserVolume(mAvatarID);
+ if (!gAgent.getRegion())
+ return;
+
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "mute update";
+ data["session-id"] = session_id;
+ data["params"] = LLSD::emptyMap();
+ data["params"]["agent_id"] = mAvatarID;
+ data["params"]["mute_info"] = LLSD::emptyMap();
+ // ctrl value represents ability to type, so invert
+ data["params"]["mute_info"]["voice"] = !enabled;
+
+ class MuteVoiceResponder : public LLHTTPClient::Responder
+ {
+ public:
+ MuteVoiceResponder(const LLUUID& session_id)
+ {
+ mSessionID = session_id;
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if ( gIMMgr )
+ {
+ //403 == you're not a mod
+ //should be disabled if you're not a moderator
+ if ( 403 == status )
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "not_a_moderator",
+ mSessionID);
+ }
+ else
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "generic",
+ mSessionID);
+ }
+ }
+ }
+
+ private:
+ LLUUID mSessionID;
+ };
+
+ LLHTTPClient::post(
+ url,
+ data,
+ new MuteVoiceResponder(speaker_mgr->getSessionID()));
+ }
+
+ closeFloater();
+
+}
+
+void LLInspectAvatar::updateVolumeSlider()
+{
+
+ bool voice_enabled = gVoiceClient->getVoiceEnabled(mAvatarID);
+
+ // Do not display volume slider and mute button if it
+ // is ourself or we are not in a voice channel together
+ if (!voice_enabled || (mAvatarID == gAgent.getID()))
+ {
+ getChild<LLUICtrl>("mute_btn")->setVisible(false);
+ getChild<LLUICtrl>("volume_slider")->setVisible(false);
+ }
+
+ else
+ {
+ getChild<LLUICtrl>("mute_btn")->setVisible(true);
+ getChild<LLUICtrl>("volume_slider")->setVisible(true);
+
+ // By convention, we only display and toggle voice mutes, not all mutes
+ bool is_muted = LLMuteList::getInstance()->
+ isMuted(mAvatarID, LLMute::flagVoiceChat);
+
+ LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
- // *HACK: Voice client doesn't have any data until user actually
- // says something.
- if (volume == 0.f)
+ bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
+
+ mute_btn->setEnabled( !is_linden);
+ mute_btn->setValue( is_muted );
+
+ LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
+ volume_slider->setEnabled( !is_muted );
+
+ const F32 DEFAULT_VOLUME = 0.5f;
+ F32 volume;
+ if (is_muted)
+ {
+ // it's clearer to display their volume as zero
+ volume = 0.f;
+ }
+ else
{
- volume = DEFAULT_VOLUME;
+ // actual volume
+ volume = gVoiceClient->getUserVolume(mAvatarID);
+
+ // *HACK: Voice client doesn't have any data until user actually
+ // says something.
+ if (volume == 0.f)
+ {
+ volume = DEFAULT_VOLUME;
+ }
}
+ volume_slider->setValue( (F64)volume );
}
- volume_slider->setValue( (F64)volume );
+
}
void LLInspectAvatar::onClickMuteVolume()
@@ -423,27 +624,23 @@ void LLInspectAvatar::nameUpdatedCallback(
mAvatarName = first + " " + last;
childSetValue("user_name", LLSD(mAvatarName) );
}
-
- if (id == mPartnerID)
- {
- LLStringUtil::format_map_t args;
- args["[PARTNER]"] = first + " " + last;
- std::string partner = getString("Partner", args);
- getChild<LLUICtrl>("user_partner")->setValue(partner);
- }
- // Otherwise possibly a request for an older inspector, ignore it
}
void LLInspectAvatar::onClickAddFriend()
{
LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName);
+ closeFloater();
}
void LLInspectAvatar::onClickViewProfile()
{
- // hide inspector when showing profile
- setFocus(FALSE);
LLAvatarActions::showProfile(mAvatarID);
+ closeFloater();
+}
+
+bool LLInspectAvatar::isNotFriend()
+{
+ return !LLAvatarActions::isFriend(mAvatarID);
}
bool LLInspectAvatar::onVisibleFindOnMap()
@@ -451,36 +648,85 @@ bool LLInspectAvatar::onVisibleFindOnMap()
return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
}
+bool LLInspectAvatar::onVisibleFreezeEject()
+{
+ return enable_freeze_eject( LLSD(mAvatarID) );
+}
+
+bool LLInspectAvatar::onVisibleZoomIn()
+{
+ return gObjectList.findObject(mAvatarID);
+}
+
void LLInspectAvatar::onClickIM()
{
LLAvatarActions::startIM(mAvatarID);
+ closeFloater();
+}
+
+void LLInspectAvatar::onClickCall()
+{
+ LLAvatarActions::startCall(mAvatarID);
+ closeFloater();
}
void LLInspectAvatar::onClickTeleport()
{
LLAvatarActions::offerTeleport(mAvatarID);
+ closeFloater();
}
void LLInspectAvatar::onClickInviteToGroup()
{
LLAvatarActions::inviteToGroup(mAvatarID);
+ closeFloater();
}
void LLInspectAvatar::onClickPay()
{
LLAvatarActions::pay(mAvatarID);
+ closeFloater();
+}
+
+void LLInspectAvatar::onClickShare()
+{
+ LLAvatarActions::share(mAvatarID);
+ closeFloater();
}
-void LLInspectAvatar::onClickBlock()
+void LLInspectAvatar::onToggleMute()
{
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
- LLMuteList::getInstance()->add(mute);
+
+ if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
+ {
+ LLMuteList::getInstance()->remove(mute);
+ }
+ else
+ {
+ LLMuteList::getInstance()->add(mute);
+ }
+
LLPanelBlockedList::showPanelAndSelect(mute.mID);
+ closeFloater();
}
void LLInspectAvatar::onClickReport()
{
- LLFloaterReporter::showFromObject(mAvatarID);
+ LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName);
+ closeFloater();
+}
+
+void LLInspectAvatar::onClickFreeze()
+{
+ handle_avatar_freeze( LLSD(mAvatarID) );
+ closeFloater();
+}
+
+void LLInspectAvatar::onClickEject()
+{
+ handle_avatar_eject( LLSD(mAvatarID) );
+ closeFloater();
}
void LLInspectAvatar::onClickZoomIn()
@@ -495,6 +741,37 @@ void LLInspectAvatar::onClickFindOnMap()
LLFloaterReg::showInstance("world_map");
}
+
+bool LLInspectAvatar::enableMute()
+{
+ bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
+ bool is_self = mAvatarID == gAgent.getID();
+
+ if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool LLInspectAvatar::enableUnmute()
+{
+ bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
+ bool is_self = mAvatarID == gAgent.getID();
+
+ if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index c78bcd6afe..7fd7b69021 100644
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()
getChild<LLUICtrl>("group_details")->setValue("");
getChild<LLUICtrl>("group_cost")->setValue("");
// Must have a visible button so the inspector can take focus
- getChild<LLUICtrl>("leave_btn")->setVisible(true);
+ getChild<LLUICtrl>("view_profile_btn")->setVisible(true);
+ getChild<LLUICtrl>("leave_btn")->setVisible(false);
getChild<LLUICtrl>("join_btn")->setVisible(false);
// Make a new request for properties
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 29cca14a7b..91cbbbf430 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -35,10 +35,13 @@
// Viewer
#include "llinspect.h"
-#include "llnotifications.h" // *TODO: Eliminate, add LLNotificationsUtil wrapper
+#include "llmediaentry.h"
+#include "llnotificationsutil.h" // *TODO: Eliminate, add LLNotificationsUtil wrapper
#include "llselectmgr.h"
#include "llslurl.h"
#include "llviewermenu.h" // handle_object_touch(), handle_buy()
+#include "llviewermedia.h"
+#include "llviewermediafocus.h"
#include "llviewerobjectlist.h" // to select the requested object
// Linden libraries
@@ -48,6 +51,7 @@
#include "llmenubutton.h"
#include "llresmgr.h" // getMonetaryString
#include "llsafehandle.h"
+#include "llsidetray.h"
#include "lltextbox.h" // for description truncation
#include "lltrans.h"
#include "llui.h" // positionViewNearMouse()
@@ -80,6 +84,10 @@ public:
// Release the selection and do other cleanup
/*virtual*/ void onClose(bool app_quitting);
+ // override the inspector mouse leave so timer is only paused if
+ // gear menu is not open
+ /* virtual */ void onMouseLeave(S32 x, S32 y, MASK mask);
+
private:
// Refresh displayed data with information from selection manager
void update();
@@ -92,8 +100,10 @@ private:
void updateName(LLSelectNode* nodep);
void updateDescription(LLSelectNode* nodep);
void updatePrice(LLSelectNode* nodep);
-
void updateCreator(LLSelectNode* nodep);
+
+ void updateMediaCurrentURL();
+ void updateSecureBrowsing();
void onClickBuy();
void onClickPay();
@@ -106,13 +116,19 @@ private:
private:
LLUUID mObjectID;
+ S32 mObjectFace;
+ viewer_media_t mMediaImpl;
+ LLMediaEntry* mMediaEntry;
LLSafeHandle<LLObjectSelection> mObjectSelection;
};
LLInspectObject::LLInspectObject(const LLSD& sd)
: LLInspect( LLSD() ), // single_instance, doesn't really need key
- mObjectID(), // set in onOpen()
- mObjectSelection()
+ mObjectID(NULL), // set in onOpen()
+ mObjectFace(0),
+ mObjectSelection(NULL),
+ mMediaImpl(NULL),
+ mMediaEntry(NULL)
{
// can't make the properties request until the widgets are constructed
// as it might return immediately, so do it in postBuild.
@@ -139,7 +155,7 @@ BOOL LLInspectObject::postBuild(void)
getChild<LLUICtrl>("object_name")->setValue("");
getChild<LLUICtrl>("object_creator")->setValue("");
getChild<LLUICtrl>("object_description")->setValue("");
-
+ getChild<LLUICtrl>("object_media_url")->setValue("");
// Set buttons invisible until we know what this object can do
hideButtons();
@@ -171,7 +187,6 @@ BOOL LLInspectObject::postBuild(void)
return TRUE;
}
-
// Multiple calls to showInstance("inspect_avatar", foo) will provide different
// LLSD for foo, which we will catch here.
//virtual
@@ -182,7 +197,11 @@ void LLInspectObject::onOpen(const LLSD& data)
// Extract appropriate avatar id
mObjectID = data["object_id"];
-
+
+ if(data.has("object_face"))
+ {
+ mObjectFace = data["object_face"];
+ }
// Position the inspector relative to the mouse cursor
// Similar to how tooltips are positioned
// See LLToolTipMgr::createToolTip
@@ -200,6 +219,10 @@ void LLInspectObject::onOpen(const LLSD& data)
LLViewerObject* obj = gObjectList.findObject( mObjectID );
if (obj)
{
+ // Media focus and this code fight over the select manager.
+ // Make sure any media is unfocused before changing the selection here.
+ LLViewerMediaFocus::getInstance()->clearFocus();
+
LLSelectMgr::instance().deselectAll();
mObjectSelection = LLSelectMgr::instance().selectObjectAndFamily(obj);
@@ -213,6 +236,17 @@ void LLInspectObject::onOpen(const LLSD& data)
}
} functor;
mObjectSelection->applyToNodes(&functor);
+
+ // Does this face have media?
+ const LLTextureEntry* tep = obj->getTE(mObjectFace);
+ if (!tep)
+ return;
+
+ mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL;
+ if(!mMediaEntry)
+ return;
+
+ mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID());
}
}
@@ -243,6 +277,30 @@ void LLInspectObject::update()
updateDescription(nodep);
updateCreator(nodep);
updatePrice(nodep);
+
+ LLViewerObject* obj = nodep->getObject();
+ if(!obj)
+ return;
+
+ if ( mObjectFace < 0
+ || mObjectFace >= obj->getNumTEs() )
+ {
+ return;
+ }
+
+ // Does this face have media?
+ const LLTextureEntry* tep = obj->getTE(mObjectFace);
+ if (!tep)
+ return;
+
+ mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL;
+ if(!mMediaEntry)
+ return;
+
+ mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID());
+
+ updateMediaCurrentURL();
+ updateSecureBrowsing();
}
void LLInspectObject::hideButtons()
@@ -367,18 +425,45 @@ void LLInspectObject::updateDescription(LLSelectNode* nodep)
LLTextBox* textbox = getChild<LLTextBox>("object_description");
textbox->setValue(desc);
+}
- // Truncate description text to fit in widget
- // *HACK: OMG, use lower-left corner to truncate text
- // Don't round the position, we want the left of the character
- S32 corner_index = textbox->getDocIndexFromLocalCoord( 0, 0, FALSE);
- LLWString desc_wide = textbox->getWText();
- // index == length if position is past last character
- if (corner_index < (S32)desc_wide.length())
+void LLInspectObject::updateMediaCurrentURL()
+{
+ if(!mMediaEntry)
+ return;
+ LLTextBox* textbox = getChild<LLTextBox>("object_media_url");
+ std::string media_url = "";
+ textbox->setValue(media_url);
+ textbox->setToolTip(media_url);
+ LLStringUtil::format_map_t args;
+
+ if(mMediaImpl.notNull() && mMediaImpl->hasMedia())
{
- desc_wide = desc_wide.substr(0, corner_index);
- textbox->setWText(desc_wide);
+
+ LLPluginClassMedia* media_plugin = NULL;
+ media_plugin = mMediaImpl->getMediaPlugin();
+ if(media_plugin)
+ {
+ if(media_plugin->pluginSupportsMediaTime())
+ {
+ args["[CurrentURL]"] = mMediaImpl->getMediaURL();
+ }
+ else
+ {
+ args["[CurrentURL]"] = media_plugin->getLocation();
+ }
+ media_url = LLTrans::getString("CurrentURL", args);
+
+ }
+ }
+ else if(mMediaEntry->getCurrentURL() != "")
+ {
+ args["[CurrentURL]"] = mMediaEntry->getCurrentURL();
+ media_url = LLTrans::getString("CurrentURL", args);
}
+
+ textbox->setText(media_url);
+ textbox->setToolTip(media_url);
}
void LLInspectObject::updateCreator(LLSelectNode* nodep)
@@ -453,6 +538,57 @@ void LLInspectObject::updatePrice(LLSelectNode* nodep)
getChild<LLUICtrl>("price_icon")->setVisible(show_price_icon);
}
+void LLInspectObject::updateSecureBrowsing()
+{
+ bool is_secure_browsing = false;
+
+ if(mMediaImpl.notNull()
+ && mMediaImpl->hasMedia())
+ {
+ LLPluginClassMedia* media_plugin = NULL;
+ std::string current_url = "";
+ media_plugin = mMediaImpl->getMediaPlugin();
+ if(media_plugin)
+ {
+ if(media_plugin->pluginSupportsMediaTime())
+ {
+ current_url = mMediaImpl->getMediaURL();
+ }
+ else
+ {
+ current_url = media_plugin->getLocation();
+ }
+ }
+
+ std::string prefix = std::string("https://");
+ std::string test_prefix = current_url.substr(0, prefix.length());
+ LLStringUtil::toLower(test_prefix);
+ if(test_prefix == prefix)
+ {
+ is_secure_browsing = true;
+ }
+ }
+ getChild<LLUICtrl>("secure_browsing")->setVisible(is_secure_browsing);
+}
+
+// For the object inspector, only unpause the fade timer
+// if the gear menu is not open
+void LLInspectObject::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
+ if ( gear_menu && gear_menu->getVisible() )
+ {
+ return;
+ }
+
+ if(childHasVisiblePopupMenu())
+ {
+ return;
+ }
+
+ mOpenTimer.unpause();
+}
+
void LLInspectObject::onClickBuy()
{
handle_buy();
@@ -508,8 +644,9 @@ void LLInspectObject::onClickOpen()
void LLInspectObject::onClickMoreInfo()
{
- // *TODO: Show object info side panel, once that is implemented.
- LLNotifications::instance().add("ClickUnimplemented");
+ LLSD key;
+ key["task"] = "task";
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
closeFloater();
}
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
new file mode 100644
index 0000000000..66e4a1bf66
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -0,0 +1,214 @@
+/**
+ * @file llinspectremoteobject.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterreg.h"
+#include "llinspectremoteobject.h"
+#include "llinspect.h"
+#include "llmutelist.h"
+#include "llpanelblockedlist.h"
+#include "llslurl.h"
+#include "lltrans.h"
+#include "llui.h"
+#include "lluictrl.h"
+#include "llurlaction.h"
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObject
+//////////////////////////////////////////////////////////////////////////////
+
+// Remote Object Inspector, a small information window used to
+// display information about potentially-remote objects. Used
+// to display details about objects sending messages to the user.
+class LLInspectRemoteObject : public LLInspect
+{
+ friend class LLFloaterReg;
+
+public:
+ LLInspectRemoteObject(const LLSD& object_id);
+ virtual ~LLInspectRemoteObject() {};
+
+ /*virtual*/ BOOL postBuild(void);
+ /*virtual*/ void onOpen(const LLSD& avatar_id);
+
+ void onClickMap();
+ void onClickBlock();
+ void onClickClose();
+
+private:
+ void update();
+ static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
+
+private:
+ LLUUID mObjectID;
+ LLUUID mOwnerID;
+ std::string mOwner;
+ std::string mSLurl;
+ std::string mName;
+ bool mGroupOwned;
+};
+
+LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
+ LLInspect(LLSD()),
+ mObjectID(NULL),
+ mOwnerID(NULL),
+ mOwner(""),
+ mSLurl(""),
+ mName(""),
+ mGroupOwned(false)
+{
+}
+
+/*virtual*/
+BOOL LLInspectRemoteObject::postBuild(void)
+{
+ // hook up the inspector's buttons
+ getChild<LLUICtrl>("map_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickMap, this));
+ getChild<LLUICtrl>("block_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickBlock, this));
+ getChild<LLUICtrl>("close_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickClose, this));
+
+ return TRUE;
+}
+
+/*virtual*/
+void LLInspectRemoteObject::onOpen(const LLSD& data)
+{
+ // Start animation
+ LLInspect::onOpen(data);
+
+ // Extract appropriate object information from input LLSD
+ // (Eventually, it might be nice to query server for details
+ // rather than require caller to pass in the information.)
+ mObjectID = data["object_id"].asUUID();
+ mName = data["name"].asString();
+ mOwnerID = data["owner_id"].asUUID();
+ mGroupOwned = data["group_owned"].asBoolean();
+ mSLurl = data["slurl"].asString();
+
+ // work out the owner's name
+ mOwner = "";
+ if (gCacheName)
+ {
+ gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this);
+ }
+
+ // update the inspector with the current object state
+ update();
+
+ // Position the inspector relative to the mouse cursor
+ LLUI::positionViewNearMouse(this);
+}
+
+void LLInspectRemoteObject::onClickMap()
+{
+ std::string url = "secondlife://" + mSLurl;
+ LLUrlAction::showLocationOnMap(url);
+ closeFloater();
+}
+
+void LLInspectRemoteObject::onClickBlock()
+{
+ LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
+ LLMute mute(mOwnerID, mOwner, mute_type);
+ LLMuteList::getInstance()->add(mute);
+ LLPanelBlockedList::showPanelAndSelect(mute.mID);
+ closeFloater();
+}
+
+void LLInspectRemoteObject::onClickClose()
+{
+ closeFloater();
+}
+
+//static
+void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
+{
+ LLInspectRemoteObject *self = (LLInspectRemoteObject*)data;
+ self->mOwner = first;
+ if (!last.empty())
+ {
+ self->mOwner += " " + last;
+ }
+ self->update();
+}
+
+void LLInspectRemoteObject::update()
+{
+ // show the object name as the inspector's title
+ // (don't hyperlink URLs in object names)
+ getChild<LLUICtrl>("object_name")->setValue("<nolink>" + mName + "</nolink>");
+
+ // show the object's owner - click it to show profile
+ std::string owner = mOwner;
+ if (! mOwnerID.isNull())
+ {
+ if (mGroupOwned)
+ {
+ owner = LLSLURL::buildCommand("group", mOwnerID, "about");
+ }
+ else
+ {
+ owner = LLSLURL::buildCommand("agent", mOwnerID, "about");
+ }
+ }
+ else
+ {
+ owner = LLTrans::getString("Unknown");
+ }
+ getChild<LLUICtrl>("object_owner")->setValue(owner);
+
+ // display the object's SLurl - click it to teleport
+ std::string url;
+ if (! mSLurl.empty())
+ {
+ url = "secondlife:///app/teleport/" + mSLurl;
+ }
+ getChild<LLUICtrl>("object_slurl")->setValue(url);
+
+ // disable the Map button if we don't have a SLurl
+ getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
+
+ // disable the Block button if we don't have the owner ID
+ getChild<LLUICtrl>("block_btn")->setEnabled(! mOwnerID.isNull());
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObjectUtil
+//////////////////////////////////////////////////////////////////////////////
+void LLInspectRemoteObjectUtil::registerFloater()
+{
+ LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml",
+ &LLFloaterReg::build<LLInspectRemoteObject>);
+}
diff --git a/indra/newview/llinspectremoteobject.h b/indra/newview/llinspectremoteobject.h
new file mode 100644
index 0000000000..e756f1caf4
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.h
@@ -0,0 +1,40 @@
+/**
+ * @file llinspectremoteobject.h
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLINSPECTREMOTEOBJECT_H
+#define LLINSPECTREMOTEOBJECT_H
+
+namespace LLInspectRemoteObjectUtil
+{
+ void registerFloater();
+}
+
+#endif
diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp
new file mode 100644
index 0000000000..3ca8fa2f56
--- /dev/null
+++ b/indra/newview/llinspecttoast.cpp
@@ -0,0 +1,122 @@
+/**
+ * @file llinspecttoast.cpp
+ * @brief Toast inspector implementation.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llinspecttoast.h"
+#include "llinspect.h"
+#include "llfloaterreg.h"
+#include "llscreenchannel.h"
+#include "llchannelmanager.h"
+#include "lltransientfloatermgr.h"
+
+using namespace LLNotificationsUI;
+
+/**
+ * Represents inspectable toast .
+ */
+class LLInspectToast: public LLInspect
+{
+public:
+
+ LLInspectToast(const LLSD& notification_idl);
+ virtual ~LLInspectToast();
+
+ /*virtual*/ void onOpen(const LLSD& notification_id);
+private:
+ void onToastDestroy(LLToast * toast);
+
+private:
+ LLPanel* mPanel;
+ LLScreenChannel* mScreenChannel;
+};
+
+LLInspectToast::LLInspectToast(const LLSD& notification_id) :
+ LLInspect(LLSD()), mPanel(NULL)
+{
+ LLScreenChannelBase* channel = LLChannelManager::getInstance()->findChannelByID(
+ LLUUID(gSavedSettings.getString("NotificationChannelUUID")));
+ mScreenChannel = dynamic_cast<LLScreenChannel*>(channel);
+ if(NULL == mScreenChannel)
+ {
+ llwarns << "Could not get requested screen channel." << llendl;
+ return;
+ }
+
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
+}
+LLInspectToast::~LLInspectToast()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+void LLInspectToast::onOpen(const LLSD& notification_id)
+{
+ LLInspect::onOpen(notification_id);
+ LLToast* toast = mScreenChannel->getToastByNotificationID(notification_id);
+ if (toast == NULL)
+ {
+ llwarns << "Could not get requested toast from screen channel." << llendl;
+ return;
+ }
+ toast->setOnToastDestroyedCallback(boost::bind(&LLInspectToast::onToastDestroy, this, _1));
+
+ LLPanel * panel = toast->getPanel();
+ panel->setVisible(TRUE);
+ panel->setMouseOpaque(FALSE);
+ if(mPanel != NULL && mPanel->getParent() == this)
+ {
+ removeChild(mPanel);
+ }
+ addChild(panel);
+ panel->setFocus(TRUE);
+ mPanel = panel;
+
+
+ LLRect panel_rect;
+ panel_rect = panel->getRect();
+ reshape(panel_rect.getWidth(), panel_rect.getHeight());
+
+ LLUI::positionViewNearMouse(this);
+}
+
+void LLInspectToast::onToastDestroy(LLToast * toast)
+{
+ closeFloater(false);
+}
+
+void LLNotificationsUI::registerFloater()
+{
+ LLFloaterReg::add("inspect_toast", "inspect_toast.xml",
+ &LLFloaterReg::build<LLInspectToast>);
+}
+
diff --git a/indra/newview/llinspecttoast.h b/indra/newview/llinspecttoast.h
new file mode 100644
index 0000000000..ff547154b8
--- /dev/null
+++ b/indra/newview/llinspecttoast.h
@@ -0,0 +1,40 @@
+/**
+ * @file llinspecttoast.h
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINSPECTTOAST_H
+#define LL_LLINSPECTTOAST_H
+
+namespace LLNotificationsUI
+{
+void registerFloater();
+}
+
+#endif
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 59f70ea1bd..5b59f52fa5 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -31,68 +31,39 @@
*/
#include "llviewerprecompiledheaders.h"
-
-#include <utility> // for std::pair<>
-
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
-#include "message.h"
-
#include "llagent.h"
#include "llagentwearables.h"
-#include "llcallingcard.h"
-#include "llcheckboxctrl.h" // for radio buttons
-#include "llfloaterreg.h"
-#include "llradiogroup.h"
-#include "llspinctrl.h"
-#include "lltextbox.h"
-#include "llui.h"
-
-#include "llviewercontrol.h"
-#include "llfirstuse.h"
-#include "llfoldertype.h"
-#include "llfloaterchat.h"
+#include "llappearancemgr.h"
+#include "llavataractions.h"
#include "llfloatercustomize.h"
-#include "llfloaterproperties.h"
+#include "llfloateropenobject.h"
+#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
#include "llfriendcard.h"
-#include "llavataractions.h"
#include "llgesturemgr.h"
-#include "lliconctrl.h"
-#include "llinventorymodel.h"
+#include "llimfloater.h"
+#include "llimview.h"
#include "llinventoryclipboard.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llinventorypanel.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llpreviewanim.h"
#include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
#include "llpreviewtexture.h"
-#include "llresmgr.h"
-#include "llscrollcontainer.h"
-#include "llimview.h"
-#include "lltooldraganddrop.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
-#include "llwearable.h"
-#include "llwearablelist.h"
-#include "llviewermessage.h"
-#include "llviewerregion.h"
-#include "llvoavatarself.h"
-#include "lltabcontainer.h"
-#include "lluictrlfactory.h"
#include "llselectmgr.h"
#include "llsidetray.h"
-#include "llfloateropenobject.h"
#include "lltrans.h"
-#include "llappearancemgr.h"
+#include "llviewerassettype.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
+#include "llpaneloutfitsinventory.h"
using namespace LLOldEvents;
@@ -153,20 +124,10 @@ std::string ICON_NAME[ICON_NAME_COUNT] =
"Inv_Animation",
"Inv_Gesture",
- "inv_item_linkitem.tga",
- "inv_item_linkfolder.tga"
+ "Inv_LinkItem",
+ "Inv_LinkFolder"
};
-
-// +=================================================+
-// | LLInventoryPanelObserver |
-// +=================================================+
-void LLInventoryPanelObserver::changed(U32 mask)
-{
- mIP->modelChanged(mask);
-}
-
-
// +=================================================+
// | LLInvFVBridge |
// +=================================================+
@@ -200,9 +161,9 @@ PermissionMask LLInvFVBridge::getPermissionMask() const
}
// virtual
-LLAssetType::EType LLInvFVBridge::getPreferredType() const
+LLFolderType::EType LLInvFVBridge::getPreferredType() const
{
- return LLAssetType::AT_NONE;
+ return LLFolderType::FT_NONE;
}
@@ -212,47 +173,37 @@ time_t LLInvFVBridge::getCreationDate() const
return 0;
}
-// Can be destoryed (or moved to trash)
-BOOL LLInvFVBridge::isItemRemovable()
+// Can be destroyed (or moved to trash)
+BOOL LLInvFVBridge::isItemRemovable() const
{
- LLInventoryModel* model = getInventoryModel();
- if(!model) return FALSE;
- if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model)
{
- return TRUE;
+ return FALSE;
}
- return FALSE;
-}
-// Sends an update to all link items that point to the base item.
-void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name)
-{
- LLInventoryModel* model = getInventoryModel();
- if(!model) return;
-
- LLInventoryItem* itemp = model->getItem(mUUID);
- if (!itemp) return;
-
- if (itemp->getIsLinkType())
+ // Can't delete an item that's in the library.
+ if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
{
- return;
+ return FALSE;
}
- LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id);
- for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
- iter != item_array.end();
- iter++)
+ // Disable delete from COF folder; have users explicitly choose "detach/take off".
+ if (LLAppearanceManager::instance().getIsProtectedCOFItem(mUUID))
{
- LLViewerInventoryItem *linked_item = (*iter);
- if (linked_item->getUUID() == item_id) continue;
+ return FALSE;
+ }
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item);
- new_item->rename(new_name);
- new_item->updateServer(FALSE);
- model->updateItem(new_item);
- // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID());
+ const LLInventoryObject *obj = model->getItem(mUUID);
+ if (obj && obj->getIsLinkType())
+ {
+ return TRUE;
}
- model->notifyObservers();
+ if (get_is_item_worn(mUUID))
+ {
+ return FALSE;
+ }
+ return TRUE;
}
// Can be moved to another folder
@@ -275,7 +226,14 @@ void LLInvFVBridge::cutToClipboard()
// *TODO: make sure this does the right thing
void LLInvFVBridge::showProperties()
{
+ LLSD key;
+ key["id"] = mUUID;
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+ // Disable old properties floater; this is replaced by the sidepanel.
+ /*
LLFloaterReg::showInstance("properties", mUUID);
+ */
}
void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
@@ -333,14 +291,29 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
LLInventoryModel* model = getInventoryModel();
if(!model) return;
LLMessageSystem* msg = gMessageSystem;
- LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLViewerInventoryItem* item = NULL;
- LLViewerInventoryCategory* cat = NULL;
std::vector<LLUUID> move_ids;
LLInventoryModel::update_map_t update;
bool start_new_message = true;
S32 count = batch.count();
S32 i;
+
+ // first, hide any 'preview' floaters that correspond to the items
+ // being deleted.
+ for(i = 0; i < count; ++i)
+ {
+ bridge = (LLInvFVBridge*)(batch.get(i));
+ if(!bridge || !bridge->isItemRemovable()) continue;
+ item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
+ if(item)
+ {
+ LLPreview::hide(item->getUUID());
+ }
+ }
+
+ // do the inventory move to trash
+
for(i = 0; i < count; ++i)
{
bridge = (LLInvFVBridge*)(batch.get(i));
@@ -350,7 +323,6 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
{
if(item->getParentUUID() == trash_id) continue;
move_ids.push_back(item->getUUID());
- LLPreview::hide(item->getUUID());
--update[item->getParentUUID()];
++update[trash_id];
if(start_new_message)
@@ -382,11 +354,12 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
gInventory.accountForUpdate(update);
update.clear();
}
+
for(i = 0; i < count; ++i)
{
bridge = (LLInvFVBridge*)(batch.get(i));
if(!bridge || !bridge->isItemRemovable()) continue;
- cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
+ LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
if(cat)
{
if(cat->getParentUUID() == trash_id) continue;
@@ -498,7 +471,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
}
}
const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
- if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType()))
+ if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
return FALSE;
}
@@ -506,12 +479,16 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
return TRUE;
}
-void hideContextEntries(LLMenuGL& menu,
- const std::vector<std::string> &entries_to_show,
- const std::vector<std::string> &disabled_entries)
+void hide_context_entries(LLMenuGL& menu,
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries)
{
const LLView::child_list_t *list = menu.getChildList();
+ // For removing double separators or leading separator. Start at true so that
+ // if the first element is a separator, it will not be shown.
+ BOOL is_previous_entry_separator = TRUE;
+
LLView::child_list_t::const_iterator itor;
for (itor = list->begin(); itor != list->end(); ++itor)
{
@@ -521,12 +498,12 @@ void hideContextEntries(LLMenuGL& menu,
LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor);
if ((name == "More") && branchp)
{
- hideContextEntries(*branchp->getBranch(), entries_to_show, disabled_entries);
+ hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
}
bool found = false;
- std::vector<std::string>::const_iterator itor2;
+ menuentry_vec_t::const_iterator itor2;
for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
{
if (*itor2 == name)
@@ -534,12 +511,24 @@ void hideContextEntries(LLMenuGL& menu,
found = true;
}
}
+
+ // Don't allow multiple separators in a row (e.g. such as if there are no items
+ // between two separators).
+ if (found)
+ {
+ const BOOL is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(*itor) != NULL);
+ if (is_entry_separator && is_previous_entry_separator)
+ found = false;
+ is_previous_entry_separator = is_entry_separator;
+ }
+
if (!found)
{
(*itor)->setVisible(FALSE);
}
else
{
+ (*itor)->setVisible(TRUE);
for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
{
if (*itor2 == name)
@@ -553,66 +542,101 @@ void hideContextEntries(LLMenuGL& menu,
// Helper for commonly-used entries
void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
- std::vector<std::string> &items,
- std::vector<std::string> &disabled_items, U32 flags)
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items, U32 flags)
{
- items.push_back(std::string("Rename"));
- if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ const LLInventoryObject *obj = getInventoryObject();
+
+ bool is_sidepanel = isInOutfitsSidePanel();
+ if (is_sidepanel)
{
- disabled_items.push_back(std::string("Rename"));
+ // Sidepanel includes restricted menu.
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
+ {
+ items.push_back(std::string("Remove Link"));
+ }
+ return;
}
- if (show_asset_id)
+ if (obj)
{
- items.push_back(std::string("Copy Asset UUID"));
- if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
- || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (obj->getIsLinkType())
+ {
+ items.push_back(std::string("Find Original"));
+ if (isLinkedObjectMissing())
+ {
+ disabled_items.push_back(std::string("Find Original"));
+ }
+ }
+ else
{
- disabled_items.push_back(std::string("Copy Asset UUID"));
+ if (LLAssetType::lookupCanLink(obj->getType()))
+ {
+ items.push_back(std::string("Find Links"));
+ }
+ items.push_back(std::string("Rename"));
+ if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Rename"));
+ }
+
+ if (show_asset_id)
+ {
+ items.push_back(std::string("Copy Asset UUID"));
+ if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
+ || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Copy Asset UUID"));
+ }
+ }
+ items.push_back(std::string("Copy Separator"));
+
+ items.push_back(std::string("Copy"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Copy"));
+ }
}
}
- items.push_back(std::string("Copy Separator"));
-
- items.push_back(std::string("Copy"));
- if (!isItemCopyable())
+ // Don't allow items to be pasted directly into the COF.
+ if (!isCOFFolder())
{
- disabled_items.push_back(std::string("Copy"));
+ items.push_back(std::string("Paste"));
}
-
- items.push_back(std::string("Paste"));
- if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (!isClipboardPasteable() || ((flags & FIRST_SELECTED_ITEM) == 0))
{
disabled_items.push_back(std::string("Paste"));
}
- items.push_back(std::string("Paste As Link"));
- if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (gAgent.isGodlike())
{
- disabled_items.push_back(std::string("Paste As Link"));
+ items.push_back(std::string("Paste As Link"));
+ if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
}
+
items.push_back(std::string("Paste Separator"));
- items.push_back(std::string("Delete"));
- if (!isItemRemovable())
+ addDeleteContextMenuOptions(items, disabled_items);
+
+ // If multiple items are selected, disable properties (if it exists).
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
{
- disabled_items.push_back(std::string("Delete"));
+ disabled_items.push_back(std::string("Properties"));
}
}
void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
- if(isInTrash())
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ if(isItemInTrash())
{
- items.push_back(std::string("PurgeItem"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("PurgeItem"));
- }
- items.push_back(std::string("RestoreItem"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
@@ -621,7 +645,54 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
getClipboardEntries(true, items, disabled_items, flags);
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
+}
+
+void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items)
+{
+ const LLInventoryObject *obj = getInventoryObject();
+ if (obj && obj->getIsLinkType())
+ {
+ items.push_back(std::string("Find Original"));
+ if (isLinkedObjectMissing())
+ {
+ disabled_items.push_back(std::string("Find Original"));
+ }
+ }
+ items.push_back(std::string("Purge Item"));
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Purge Item"));
+ }
+ items.push_back(std::string("Restore Item"));
+}
+
+void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items)
+{
+ // Don't allow delete as a direct option from COF folder.
+ if (isCOFFolder())
+ {
+ return;
+ }
+
+ const LLInventoryObject *obj = getInventoryObject();
+
+ // "Remove link" and "Delete" are the same operation.
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
+ {
+ items.push_back(std::string("Remove Link"));
+ }
+ else
+ {
+ items.push_back(std::string("Delete"));
+ }
+
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Delete"));
+ }
}
// *TODO: remove this
@@ -633,7 +704,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
if(obj)
{
- *type = LLAssetType::lookupDragAndDropType(obj->getActualType());
+ *type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
if(*type == DAD_NONE)
{
return FALSE;
@@ -670,29 +741,43 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const
return panel ? panel->getModel() : NULL;
}
-BOOL LLInvFVBridge::isInTrash() const
+BOOL LLInvFVBridge::isItemInTrash() const
{
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
- const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
return model->isObjectDescendentOf(mUUID, trash_id);
}
BOOL LLInvFVBridge::isLinkedObjectInTrash() const
{
- if (isInTrash()) return TRUE;
+ if (isItemInTrash()) return TRUE;
const LLInventoryObject *obj = getInventoryObject();
if (obj && obj->getIsLinkType())
{
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
- const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);
}
return FALSE;
}
+BOOL LLInvFVBridge::isLinkedObjectMissing() const
+{
+ const LLInventoryObject *obj = getInventoryObject();
+ if (!obj)
+ {
+ return TRUE;
+ }
+ if (obj->getIsLinkType() && LLAssetType::lookupIsLinkType(obj->getType()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
BOOL LLInvFVBridge::isAgentInventory() const
{
const LLInventoryModel* model = getInventoryModel();
@@ -703,14 +788,7 @@ BOOL LLInvFVBridge::isAgentInventory() const
BOOL LLInvFVBridge::isCOFFolder() const
{
- const LLInventoryModel* model = getInventoryModel();
- if(!model) return TRUE;
- const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
- if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))
- {
- return TRUE;
- }
- return FALSE;
+ return LLAppearanceManager::instance().getIsInCOF(mUUID);
}
BOOL LLInvFVBridge::isItemPermissive() const
@@ -721,20 +799,20 @@ BOOL LLInvFVBridge::isItemPermissive() const
// static
void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
LLViewerInventoryItem* item,
- const LLUUID& new_parent,
+ const LLUUID& new_parent_id,
BOOL restamp)
{
- if(item->getParentUUID() != new_parent)
+ if (item->getParentUUID() != new_parent_id)
{
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
update.push_back(new_folder);
gInventory.accountForUpdate(update);
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setParent(new_parent);
+ new_item->setParent(new_parent_id);
new_item->updateParentOnServer(restamp);
model->updateItem(new_item);
model->notifyObservers();
@@ -744,24 +822,27 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
// static
void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
LLViewerInventoryCategory* cat,
- const LLUUID& new_parent,
+ const LLUUID& new_parent_id,
BOOL restamp)
{
- if(cat->getParentUUID() != new_parent)
+ // Can't move a folder into a child of itself.
+ if (model->isObjectDescendentOf(new_parent_id, cat->getUUID()))
{
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
- new_cat->setParent(new_parent);
- new_cat->updateParentOnServer(restamp);
- model->updateCategory(new_cat);
- model->notifyObservers();
+ return;
}
+
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
+ update.push_back(new_folder);
+ model->accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+ new_cat->setParent(new_parent_id);
+ new_cat->updateParentOnServer(restamp);
+ model->updateCategory(new_cat);
+ model->notifyObservers();
}
@@ -874,7 +955,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
break;
case LLAssetType::AT_CATEGORY:
- case LLAssetType::AT_ROOT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
{
// Create a link folder handler instead.
@@ -884,9 +964,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
new_listener = new LLFolderBridge(inventory, uuid);
break;
case LLAssetType::AT_LINK:
- // Only should happen for broken links.
- new_listener = new LLLinkItemBridge(inventory, uuid);
- break;
case LLAssetType::AT_LINK_FOLDER:
// Only should happen for broken links.
new_listener = new LLLinkItemBridge(inventory, uuid);
@@ -921,6 +998,16 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
}
}
+bool LLInvFVBridge::isInOutfitsSidePanel() const
+{
+ LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (!outfit_panel)
+ return false;
+ return outfit_panel->isTabPanel(my_panel);
+}
+
// +=================================================+
// | InventoryFVBridgeBuilder |
// +=================================================+
@@ -949,6 +1036,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
{
gotoItem(folder);
}
+
if ("open" == action)
{
openItem();
@@ -1032,7 +1120,7 @@ void LLItemBridge::restoreItem()
if(item)
{
LLInventoryModel* model = getInventoryModel();
- const LLUUID new_parent = model->findCategoryUUIDForType(item->getType());
+ const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
// do not restamp on restore.
LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
}
@@ -1040,6 +1128,9 @@ void LLItemBridge::restoreItem()
void LLItemBridge::restoreToWorld()
{
+ //Similar functionality to the drag and drop rez logic
+ bool remove_from_inventory = false;
+
LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
if (itemp)
{
@@ -1052,23 +1143,20 @@ void LLItemBridge::restoreToWorld()
msg->nextBlockFast(_PREHASH_InventoryData);
itemp->packMessage(msg);
msg->sendReliable(gAgent.getRegion()->getHost());
- }
-
- //Similar functionality to the drag and drop rez logic
- BOOL remove_from_inventory = FALSE;
-
- //remove local inventory copy, sim will deal with permissions and removing the item
- //from the actual inventory if its a no-copy etc
- if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
- {
- remove_from_inventory = TRUE;
- }
- // Check if it's in the trash. (again similar to the normal rez logic)
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
- if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
- {
- remove_from_inventory = TRUE;
+ //remove local inventory copy, sim will deal with permissions and removing the item
+ //from the actual inventory if its a no-copy etc
+ if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ remove_from_inventory = true;
+ }
+
+ // Check if it's in the trash. (again similar to the normal rez logic)
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
+ {
+ remove_from_inventory = true;
+ }
}
if(remove_from_inventory)
@@ -1083,7 +1171,7 @@ void LLItemBridge::gotoItem(LLFolderView *folder)
LLInventoryObject *obj = getInventoryObject();
if (obj && obj->getIsLinkType())
{
- LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (active_panel)
{
active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
@@ -1140,7 +1228,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
// llinfos << "BOLD" << llendl;
font |= LLFontGL::BOLD;
@@ -1260,7 +1348,7 @@ BOOL LLItemBridge::removeItem()
LLPreview::hide(mUUID, TRUE);
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
- LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLViewerInventoryItem* item = getItem();
// if item is not already in trash
@@ -1283,29 +1371,33 @@ BOOL LLItemBridge::isItemCopyable() const
LLViewerInventoryItem* item = getItem();
if (item)
{
- // can't copy worn objects. DEV-15183
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if( !avatarp )
+ // Can't copy worn objects. DEV-15183
+ if(get_is_item_worn(mUUID))
{
return FALSE;
}
- if(avatarp->isWearingAttachment(mUUID))
+ // You can never copy a link.
+ if (item->getIsLinkType())
{
return FALSE;
}
- // All items can be copied, not all can be pasted.
- // The only time an item can't be copied is if it's a link
- // return (item->getPermissions().allowCopyBy(gAgent.getID()));
- if (item->getIsLinkType())
+ if (gAgent.isGodlike())
{
- return FALSE;
+ // All items can be copied in god mode since you can
+ // at least paste-as-link the item, though you
+ // still may not be able paste the item.
+ return TRUE;
+ }
+ else
+ {
+ return (item->getPermissions().allowCopyBy(gAgent.getID()));
}
- return TRUE;
}
return FALSE;
}
+
BOOL LLItemBridge::copyToClipboard() const
{
if(isItemCopyable())
@@ -1341,6 +1433,16 @@ BOOL LLItemBridge::isItemPermissive() const
return FALSE;
}
+bool LLItemBridge::isAddAction(std::string action) const
+{
+ return ("wear" == action || "attach" == action || "activate" == action);
+}
+
+bool LLItemBridge::isRemoveAction(std::string action) const
+{
+ return ("take_off" == action || "detach" == action || "deactivate" == action);
+}
+
// +=================================================+
// | LLFolderBridge |
// +=================================================+
@@ -1353,7 +1455,7 @@ BOOL LLFolderBridge::isItemMovable() const
LLInventoryObject* obj = getInventoryObject();
if(obj)
{
- return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType()));
+ return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
}
return FALSE;
}
@@ -1363,8 +1465,25 @@ void LLFolderBridge::selectItem()
}
+// Iterate through a folder's children to determine if
+// all the children are removable.
+class LLIsItemRemovable : public LLFolderViewFunctor
+{
+public:
+ LLIsItemRemovable() : mPassed(TRUE) {}
+ virtual void doFolder(LLFolderViewFolder* folder)
+ {
+ mPassed &= folder->getListener()->isItemRemovable();
+ }
+ virtual void doItem(LLFolderViewItem* item)
+ {
+ mPassed &= item->getListener()->isItemRemovable();
+ }
+ BOOL mPassed;
+};
+
// Can be destroyed (or moved to trash)
-BOOL LLFolderBridge::isItemRemovable()
+BOOL LLFolderBridge::isItemRemovable() const
{
LLInventoryModel* model = getInventoryModel();
if(!model)
@@ -1389,46 +1508,22 @@ BOOL LLFolderBridge::isItemRemovable()
return FALSE;
}
- if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
{
return FALSE;
}
- LLInventoryModel::cat_array_t descendent_categories;
- LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
-
- S32 i;
- for( i = 0; i < descendent_categories.count(); i++ )
+ LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);
+ if (folderp)
{
- LLInventoryCategory* category = descendent_categories[i];
- if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+ LLIsItemRemovable folder_test;
+ folderp->applyFunctorToChildren(folder_test);
+ if (!folder_test.mPassed)
{
return FALSE;
}
}
-
- for( i = 0; i < descendent_items.count(); i++ )
- {
- LLInventoryItem* item = descendent_items[i];
- if( (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART) )
- {
- if(gAgentWearables.isWearingItem(item->getUUID()))
- {
- return FALSE;
- }
- }
- else
- if( item->getType() == LLAssetType::AT_OBJECT )
- {
- if(avatar->isWearingAttachment(item->getUUID()))
- {
- return FALSE;
- }
- }
- }
-
return TRUE;
}
@@ -1447,7 +1542,7 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
- return TRUE;
+ return FALSE;
}
BOOL LLFolderBridge::copyToClipboard() const
@@ -1579,20 +1674,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
const LLUUID& cat_id = inv_cat->getUUID();
// Is the destination the trash?
- const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
BOOL move_is_into_trash = (mUUID == trash_id)
|| model->isObjectDescendentOf(mUUID, trash_id);
- BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType()));
- LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+ BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
+ const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
- BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT);
+ BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
if (move_is_into_current_outfit || move_is_into_outfit)
{
// BAP - restrictions?
is_movable = true;
}
- if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE))
+ if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
{
is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
}
@@ -1604,7 +1699,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
for( i = 0; i < descendent_categories.count(); i++ )
{
LLInventoryCategory* category = descendent_categories[i];
- if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
{
// ...can't move "special folders" like Textures
is_movable = FALSE;
@@ -1619,23 +1714,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
for( i = 0; i < descendent_items.count(); i++ )
{
LLInventoryItem* item = descendent_items[i];
- if( (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART) )
- {
- if( gAgentWearables.isWearingItem( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
- }
- else
- if( item->getType() == LLAssetType::AT_OBJECT )
+ if (get_is_item_worn(item->getUUID()))
{
- if( avatar->isWearingAttachment( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
+ is_movable = FALSE;
+ break; // It's generally movable, but not into the trash!
}
}
}
@@ -1665,11 +1747,30 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// if target is an outfit or current outfit folder we use link
if (move_is_into_current_outfit || move_is_into_outfit)
{
+ if (inv_cat->getPreferredType() == LLFolderType::FT_NONE)
+ {
+ if (move_is_into_current_outfit)
+ {
+ // traverse category and add all contents to currently worn.
+ BOOL append = true;
+ LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
+ }
+ else
+ {
+ // Recursively create links in target outfit.
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
+ }
+ }
+ else
+ {
#if SUPPORT_ENSEMBLES
// BAP - should skip if dup.
if (move_is_into_current_outfit)
{
- LLAppearanceManager::wearEnsemble(inv_cat);
+ LLAppearanceManager::instance().addEnsembleLink(inv_cat);
}
else
{
@@ -1683,6 +1784,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
cb);
}
#endif
+ }
}
else
{
@@ -1718,7 +1820,7 @@ void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv)
{
dialog = "MoveInventoryFromObject";
}
- LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+ LLNotificationsUtil::add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
}
// Move/copy all inventory items from the Contents folder of an in-world
@@ -1837,8 +1939,8 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
// BAP remove AT_NONE support after ensembles are fully working?
return (linked_category &&
- ((linked_category->getPreferredType() == LLAssetType::AT_NONE) ||
- (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType()))));
+ ((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
+ (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
}
}
@@ -2026,7 +2128,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
mContentsCount)
{
gInventory.removeObserver(this);
- LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE);
+ LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
delete this;
}
}
@@ -2041,7 +2143,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
{
if ("open" == action)
{
- openItem();
+ LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(folder->getItemByID(mUUID));
+ if (f)
+ {
+ f->setOpen(TRUE);
+ }
+
return;
}
else if ("paste" == action)
@@ -2071,7 +2178,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
if(!model) return;
LLViewerInventoryCategory* cat = getCategory();
if(!cat) return;
- LLAppearanceManager::wearEnsemble(cat,true);
+ LLAppearanceManager::instance().addEnsembleLink(cat,true);
return;
}
#endif
@@ -2105,6 +2212,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
restoreItem();
return;
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ else if ("delete_system_folder" == action)
+ {
+ removeSystemFolder();
+ }
+#endif
}
void LLFolderBridge::openItem()
@@ -2112,6 +2225,7 @@ void LLFolderBridge::openItem()
lldebugs << "LLFolderBridge::openItem()" << llendl;
LLInventoryModel* model = getInventoryModel();
if(!model) return;
+ if(mUUID.isNull()) return;
bool fetching_inventory = model->fetchDescendentsOf(mUUID);
// Only change folder type if we have the folder contents.
if (!fetching_inventory)
@@ -2133,14 +2247,17 @@ void LLFolderBridge::determineFolderType()
{
LLInventoryModel* model = getInventoryModel();
LLViewerInventoryCategory* category = model->getCategory(mUUID);
- category->determineFolderType();
+ if (category)
+ {
+ category->determineFolderType();
+ }
}
}
BOOL LLFolderBridge::isItemRenameable() const
{
LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
- if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())
+ if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
&& (cat->getOwnerID() == gAgent.getID()))
{
return TRUE;
@@ -2155,15 +2272,15 @@ void LLFolderBridge::restoreItem()
if(cat)
{
LLInventoryModel* model = getInventoryModel();
- LLUUID new_parent = model->findCategoryUUIDForType(cat->getType());
+ const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
// do not restamp children on restore
LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);
}
}
-LLAssetType::EType LLFolderBridge::getPreferredType() const
+LLFolderType::EType LLFolderBridge::getPreferredType() const
{
- LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+ LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
LLViewerInventoryCategory* cat = getCategory();
if(cat)
{
@@ -2176,7 +2293,7 @@ LLAssetType::EType LLFolderBridge::getPreferredType() const
// Icons for folders are based on the preferred type
LLUIImagePtr LLFolderBridge::getIcon() const
{
- LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+ LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
LLViewerInventoryCategory* cat = getCategory();
if(cat)
{
@@ -2185,12 +2302,25 @@ LLUIImagePtr LLFolderBridge::getIcon() const
return getIcon(preferred_type);
}
-LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type)
+LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
{
// we only have one folder image now
+ if (preferred_type == LLFolderType::FT_OUTFIT)
+ {
+ return LLUI::getUIImage("Inv_LookFolderClosed");
+ }
return LLUI::getUIImage("Inv_FolderClosed");
}
+LLUIImagePtr LLFolderBridge::getOpenIcon() const
+{
+ if (getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ return LLUI::getUIImage("Inv_LookFolderOpen");
+ }
+ return LLUI::getUIImage("Inv_FolderOpen");
+}
+
BOOL LLFolderBridge::renameItem(const std::string& new_name)
{
if(!isItemRenameable())
@@ -2219,60 +2349,110 @@ BOOL LLFolderBridge::removeItem()
{
return FALSE;
}
- // move it to the trash
- LLPreview::hide(mUUID);
- LLInventoryModel* model = getInventoryModel();
- if(!model) return FALSE;
+ const LLViewerInventoryCategory *cat = getCategory();
+
+ LLSD payload;
+ LLSD args;
+ args["FOLDERNAME"] = cat->getName();
- LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ LLNotification::Params params("ConfirmDeleteProtectedCategory");
+ params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
+ LLNotifications::instance().forceResponse(params, 0);
+ return TRUE;
+}
- // Look for any gestures and deactivate them
- LLInventoryModel::cat_array_t descendent_categories;
- LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
- S32 i;
- for (i = 0; i < descendent_items.count(); i++)
+BOOL LLFolderBridge::removeSystemFolder()
+{
+ const LLViewerInventoryCategory *cat = getCategory();
+ if (!LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
- LLInventoryItem* item = descendent_items[i];
- if (item->getType() == LLAssetType::AT_GESTURE
- && LLGestureManager::instance().isGestureActive(item->getUUID()))
- {
- LLGestureManager::instance().deactivateGesture(item->getUUID());
- }
+ return FALSE;
}
- // go ahead and do the normal remove if no 'last calling
- // cards' are being removed.
- LLViewerInventoryCategory* cat = getCategory();
- if(cat)
+ LLSD payload;
+ LLSD args;
+ args["FOLDERNAME"] = cat->getName();
+
+ LLNotification::Params params("ConfirmDeleteProtectedCategory");
+ params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
{
- LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
+ LLNotifications::instance().add(params);
}
-
return TRUE;
}
+bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+
+ // if they choose delete, do it. Otherwise, don't do anything
+ if(option == 0)
+ {
+ // move it to the trash
+ LLPreview::hide(mUUID);
+ LLInventoryModel* model = getInventoryModel();
+ if(!model) return FALSE;
+
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+
+ // Look for any gestures and deactivate them
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
+
+ for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin();
+ iter != descendent_items.end();
+ ++iter)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ const LLUUID& item_id = item->getUUID();
+ if (item->getType() == LLAssetType::AT_GESTURE
+ && LLGestureManager::instance().isGestureActive(item_id))
+ {
+ LLGestureManager::instance().deactivateGesture(item_id);
+ }
+ }
+
+ // go ahead and do the normal remove if no 'last calling
+ // cards' are being removed.
+ LLViewerInventoryCategory* cat = getCategory();
+ if(cat)
+ {
+ LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
void LLFolderBridge::pasteFromClipboard()
{
LLInventoryModel* model = getInventoryModel();
if(model && isClipboardPasteable())
{
- LLInventoryItem* item = NULL;
+ const LLUUID parent_id(mUUID);
+
LLDynamicArray<LLUUID> objects;
LLInventoryClipboard::instance().retrieve(objects);
- S32 count = objects.count();
- const LLUUID parent_id(mUUID);
- for(S32 i = 0; i < count; i++)
+ for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
+ iter != objects.end();
+ ++iter)
{
- item = model->getItem(objects.get(i));
+ const LLUUID& item_id = (*iter);
+ LLInventoryItem *item = model->getItem(item_id);
if (item)
{
if(LLInventoryClipboard::instance().isCutMode())
{
// move_inventory_item() is not enough,
//we have to update inventory locally too
- changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
+ {
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
}
else
{
@@ -2294,13 +2474,15 @@ void LLFolderBridge::pasteLinkFromClipboard()
const LLInventoryModel* model = getInventoryModel();
if(model)
{
+ const LLUUID parent_id(mUUID);
+
LLDynamicArray<LLUUID> objects;
LLInventoryClipboard::instance().retrieve(objects);
- S32 count = objects.count();
- LLUUID parent_id(mUUID);
- for(S32 i = 0; i < count; i++)
+ for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
+ iter != objects.end();
+ ++iter)
{
- const LLUUID &object_id = objects.get(i);
+ const LLUUID &object_id = (*iter);
#if SUPPORT_ENSEMBLES
if (LLInventoryCategory *cat = model->getCategory(object_id))
{
@@ -2318,7 +2500,7 @@ void LLFolderBridge::pasteLinkFromClipboard()
{
link_inventory_item(
gAgent.getID(),
- item->getUUID(),
+ item->getLinkedUUID(),
parent_id,
item->getName(),
LLAssetType::AT_LINK,
@@ -2336,22 +2518,31 @@ void LLFolderBridge::staticFolderOptionsMenu()
void LLFolderBridge::folderOptionsMenu()
{
- std::vector<std::string> disabled_items;
+ menuentry_vec_t disabled_items;
LLInventoryModel* model = getInventoryModel();
if(!model) return;
const LLInventoryCategory* category = model->getCategory(mUUID);
- LLAssetType::EType type = category->getPreferredType();
- const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type);
+ if(!category) return;
+
+ LLFolderType::EType type = category->getPreferredType();
+ const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
// BAP change once we're no longer treating regular categories as ensembles.
- const bool is_ensemble = category && (type == LLAssetType::AT_NONE ||
- LLAssetType::lookupIsEnsembleCategoryType(type));
+ const bool is_ensemble = (type == LLFolderType::FT_NONE ||
+ LLFolderType::lookupIsEnsembleType(type));
// calling card related functionality for folders.
- // Only enable calling-card related options for non-default folders.
- if (!is_default_folder)
+ const bool is_sidepanel = isInOutfitsSidePanel();
+ if (is_sidepanel)
+ {
+ mItems.push_back("Rename");
+ addDeleteContextMenuOptions(mItems, disabled_items);
+ }
+
+ // Only enable calling-card related options for non-system folders.
+ if (!is_sidepanel && !is_system_folder)
{
LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
@@ -2362,6 +2553,13 @@ void LLFolderBridge::folderOptionsMenu()
}
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (LLFolderType::lookupIsProtectedType(type))
+ {
+ mItems.push_back(std::string("Delete System Folder"));
+ }
+#endif
+
// wearables related functionality for folders.
//is_wearable
LLFindWearables is_wearable;
@@ -2373,21 +2571,37 @@ void LLFolderBridge::folderOptionsMenu()
checkFolderForContentsOfType(model, is_object) ||
checkFolderForContentsOfType(model, is_gesture) )
{
- mItems.push_back(std::string("Folder Wearables Separator"));
+ if (!is_sidepanel)
+ {
+ mItems.push_back(std::string("Folder Wearables Separator"));
+ }
- // Only enable add/replace outfit for non-default folders.
- if (!is_default_folder)
+ // Only enable add/replace outfit for non-system folders.
+ if (!is_system_folder)
{
- mItems.push_back(std::string("Add To Outfit"));
+ // Adding an outfit onto another (versus replacing) doesn't make sense.
+ if (type != LLFolderType::FT_OUTFIT)
+ {
+ mItems.push_back(std::string("Add To Outfit"));
+ }
mItems.push_back(std::string("Replace Outfit"));
}
if (is_ensemble)
{
mItems.push_back(std::string("Wear As Ensemble"));
}
- mItems.push_back(std::string("Take Off Items"));
+ mItems.push_back(std::string("Remove From Outfit"));
+ if (!areAnyContentsWorn(model))
+ {
+ disabled_items.push_back(std::string("Remove From Outfit"));
+ }
+ mItems.push_back(std::string("Outfit Separator"));
}
- hideContextEntries(*mMenu, mItems, disabled_items);
+ hide_context_entries(*mMenu, mItems, disabled_items);
+
+ // Reposition the menu, in case we're adding items to an existing menu.
+ mMenu->needsArrange();
+ mMenu->arrangeAndClear();
}
BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type)
@@ -2402,6 +2616,35 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
+class LLFindWorn : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWorn() {}
+ virtual ~LLFindWorn() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+ {
+ if (item && get_is_item_worn(item->getUUID()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+};
+
+BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLFindWorn is_worn;
+ model->collectDescendentsIf(mUUID,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return (item_array.size() > 0);
+}
+
// Flags unused
void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
@@ -2409,14 +2652,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mDisabledItems.clear();
lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
-// std::vector<std::string> disabled_items;
+
+// menuentry_vec_t disabled_items;
LLInventoryModel* model = getInventoryModel();
if(!model) return;
- LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
- LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
- mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)
- mDisabledItems.clear(); //adding code to clear out disabled members from previous
if (lost_and_found_id == mUUID)
{
// This is the lost+found folder.
@@ -2428,25 +2670,18 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// This is the trash.
mItems.push_back(std::string("Empty Trash"));
}
- else if(model->isObjectDescendentOf(mUUID, trash_id))
+ else if(isItemInTrash())
{
// This is a folder in the trash.
mItems.clear(); // clear any items that used to exist
- mItems.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- mDisabledItems.push_back(std::string("Purge Item"));
- }
-
- mItems.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(mItems, mDisabledItems);
}
else if(isAgentInventory()) // do not allow creating in library
{
LLViewerInventoryCategory *cat = getCategory();
-
// BAP removed protected check to re-enable standard ops in untyped folders.
// Not sure what the right thing is to do here.
- if (!isCOFFolder() && cat /*&&
+ if (!isCOFFolder() && cat && cat->getPreferredType()!=LLFolderType::FT_OUTFIT /*&&
LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/)
{
// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
@@ -2457,23 +2692,33 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("New Gesture"));
mItems.push_back(std::string("New Clothes"));
mItems.push_back(std::string("New Body Parts"));
- mItems.push_back(std::string("Change Type"));
- LLViewerInventoryCategory *cat = getCategory();
- if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()))
+ // Changing folder types is just a debug feature; this is fairly unsupported
+ // and can lead to unexpected behavior if enabled.
+#if !LL_RELEASE_FOR_DOWNLOAD
+ mItems.push_back(std::string("Change Type"));
+ const LLViewerInventoryCategory *cat = getCategory();
+ if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
mDisabledItems.push_back(std::string("Change Type"));
}
-
+#endif
getClipboardEntries(false, mItems, mDisabledItems, flags);
}
else
{
// Want some but not all of the items from getClipboardEntries for outfits.
- if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT)
+ if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
mItems.push_back(std::string("Rename"));
- mItems.push_back(std::string("Delete"));
+
+ addDeleteContextMenuOptions(mItems, mDisabledItems);
+ // EXT-4030: disallow deletion of currently worn outfit
+ const LLViewerInventoryItem *base_outfit_link = LLAppearanceManager::instance().getBaseOutfitLink();
+ if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory()))
+ {
+ mDisabledItems.push_back(std::string("Delete"));
+ }
}
}
@@ -2526,7 +2771,14 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("--no options--"));
mDisabledItems.push_back(std::string("--no options--"));
}
- hideContextEntries(menu, mItems, mDisabledItems);
+
+ // Preemptively disable system folder removal if more than one item selected.
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ mDisabledItems.push_back(std::string("Delete System Folder"));
+ }
+
+ hide_context_entries(menu, mItems, mDisabledItems);
}
BOOL LLFolderBridge::hasChildren() const
@@ -2606,7 +2858,7 @@ void LLFolderBridge::createNewCategory(void* user_data)
if(!model) return;
LLUUID id;
id = model->createNewCategory(bridge->getUUID(),
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
LLStringUtil::null);
model->notifyObservers();
@@ -2691,7 +2943,7 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
// Separate function so can be called by global menu as well as right-click
// menu.
// static
-void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type)
+void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
{
LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
LLAssetType::EType asset_type = wearable->getAssetType();
@@ -2712,7 +2964,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)
// BAP - was:
// wear_inventory_category_on_avatar( cat, append );
- LLAppearanceManager::wearInventoryCategory( cat, FALSE, append );
+ LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
}
// helper stuff
@@ -2720,7 +2972,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
{
LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData;
LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID);
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(option == 0 && object)
{
@@ -2755,61 +3007,11 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
return false;
}
-/*
-Next functions intended to reorder items in the inventory folder and save order on server
-Is now used for Favorites folder.
-
-*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel
-*/
-void saveItemsOrder(LLInventoryModel::item_array_t& items)
-{
- int sortField = 0;
-
- // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
- {
- LLViewerInventoryItem* item = *i;
-
- item->setSortField(++sortField);
- item->setComplete(TRUE);
- item->updateServer(FALSE);
-
- gInventory.updateItem(item);
- }
-
- gInventory.notifyObservers();
-}
-
-LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
-{
- LLInventoryModel::item_array_t::iterator result = items.end();
-
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
- {
- if ((*i)->getUUID() == id)
- {
- result = i;
- break;
- }
- }
-
- return result;
-}
-
-void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
-{
- LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
- LLViewerInventoryItem* destItem = gInventory.getItem(destItemId);
-
- items.erase(findItemByUUID(items, srcItem->getUUID()));
- items.insert(findItemByUUID(items, destItem->getUUID()), srcItem);
-}
-
BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
BOOL drop)
{
LLInventoryModel* model = getInventoryModel();
- if(!model) return FALSE;
+ if(!model || !inv_item) return FALSE;
// cannot drag into library
if(!isAgentInventory())
@@ -2825,42 +3027,32 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLViewerObject* object = NULL;
if(LLToolDragAndDrop::SOURCE_AGENT == source)
{
-
BOOL is_movable = TRUE;
switch( inv_item->getActualType() )
{
- case LLAssetType::AT_ROOT_CATEGORY:
- is_movable = FALSE;
- break;
-
case LLAssetType::AT_CATEGORY:
- is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType());
+ is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
break;
default:
break;
}
- LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
- BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
- LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
- BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
- BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT);
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
+ const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_outof_current_outfit = LLAppearanceManager::instance().getIsInCOF(inv_item->getUUID());
+ // Can't explicitly drag things out of the COF.
+ if (move_is_outof_current_outfit)
+ {
+ is_movable = FALSE;
+ }
+
if(is_movable && move_is_into_trash)
{
- switch(inv_item->getType())
- {
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_BODYPART:
- is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
- break;
-
- case LLAssetType::AT_OBJECT:
- is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
- break;
- default:
- break;
- }
+ is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
}
if ( is_movable )
@@ -2874,10 +3066,11 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
.isObjDirectDescendentOfCategory (inv_item, getCategory());
}
- LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
-
+ const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ const BOOL folder_allows_reorder = (mUUID == favorites_id);
+
// we can move item inside a folder only if this folder is Favorites. See EXT-719
- accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id));
+ accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
if(accept && drop)
{
if (inv_item->getType() == LLAssetType::AT_GESTURE
@@ -2889,9 +3082,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// everything in the active window so that we don't follow
// the selection to its new location (which is very
// annoying).
- if (LLFloaterInventory::getActiveInventory())
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (active_panel)
{
- LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
if (active_panel && (panel != active_panel))
{
@@ -2900,51 +3093,52 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
// if dragging from/into favorites folder only reorder items
- if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID))
+ if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)
{
- LLInventoryModel::cat_array_t cats;
- LLInventoryModel::item_array_t items;
- LLIsType is_type(LLAssetType::AT_LANDMARK);
- model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
-
LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
if (itemp)
{
LLUUID srcItemId = inv_item->getUUID();
LLUUID destItemId = itemp->getListener()->getUUID();
-
- // update order
- updateItemsOrder(items, srcItemId, destItemId);
-
- saveItemsOrder(items);
+ gInventory.rearrangeFavoriteLandmarks(srcItemId, destItemId);
}
}
else if (favorites_id == mUUID) // if target is the favorites folder we use copy
{
+ // use callback to rearrange favorite landmarks after adding
+ // to have new one placed before target (on which it was dropped). See EXT-4312.
+ LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback();
+ LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
+ if (drag_over_item && drag_over_item->getListener())
+ {
+ cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID());
+ }
+
copy_inventory_item(
gAgent.getID(),
inv_item->getPermissions().getOwner(),
inv_item->getUUID(),
mUUID,
std::string(),
- LLPointer<LLInventoryCallback>(NULL));
+ cb);
}
else if (move_is_into_current_outfit || move_is_into_outfit)
{
// BAP - should skip if dup.
if (move_is_into_current_outfit)
{
- LLAppearanceManager::wearItem(inv_item);
+ LLAppearanceManager::instance().addCOFItemLink(inv_item);
}
else
{
LLPointer<LLInventoryCallback> cb = NULL;
link_inventory_item(
gAgent.getID(),
- inv_item->getUUID(),
+ inv_item->getLinkedUUID(),
mUUID,
- std::string(),
+ inv_item->getName(),
LLAssetType::AT_LINK,
cb);
}
@@ -3074,6 +3268,63 @@ void LLTextureBridge::openItem()
}
}
+bool LLTextureBridge::canSaveTexture(void)
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model)
+ {
+ return false;
+ }
+
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ return item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ }
+ return false;
+}
+
+void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ if(isItemInTrash())
+ {
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Open"));
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
+
+ items.push_back(std::string("Texture Separator"));
+ items.push_back(std::string("Save As"));
+ if (!canSaveTexture())
+ {
+ disabled_items.push_back(std::string("Save As"));
+ }
+ }
+ hide_context_entries(menu, items, disabled_items);
+}
+
+// virtual
+void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+ if ("save_as" == action)
+ {
+ LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+ LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID);
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ }
+ }
+ else LLItemBridge::performAction(folder, model, action);
+}
+
// +=================================================+
// | LLSoundBridge |
// +=================================================+
@@ -3122,19 +3373,13 @@ void LLSoundBridge::openSoundPreview(void* which)
void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ lldebugs << "LLSoundBridge::buildContextMenu()" << llendl;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- if(isInTrash())
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
@@ -3147,7 +3392,7 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Sound Separator"));
items.push_back(std::string("Sound Play"));
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
// +=================================================+
@@ -3171,19 +3416,13 @@ LLUIImagePtr LLLandmarkBridge::getIcon() const
void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
- if(isInTrash())
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
@@ -3204,7 +3443,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
disabled_items.push_back(std::string("About Landmark"));
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
// Convenience function for the two functions below.
@@ -3252,7 +3491,7 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
static bool open_landmark_callback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLUUID asset_id = notification["payload"]["asset_id"].asUUID();
if (option == 0)
@@ -3282,7 +3521,7 @@ void LLLandmarkBridge::openItem()
// open_landmark(item);
LLSD payload;
payload["asset_id"] = item->getAssetUUID();
- LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+ LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
}
*/
}
@@ -3334,7 +3573,11 @@ void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel*
{
std::string callingcard_name;
gCacheName->getFullName(item->getCreatorUUID(), callingcard_name);
- gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
+ LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
+ if (session_id != LLUUID::null)
+ {
+ LLIMFloater::show(session_id);
+ }
}
}
else if ("lure" == action)
@@ -3393,18 +3636,12 @@ void LLCallingCardBridge::openItem()
void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- if(isInTrash())
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
@@ -3415,9 +3652,13 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
LLInventoryItem* item = getItem();
BOOL good_card = (item
- && (LLUUID::null != item->getCreatorUUID())
- && (item->getCreatorUUID() != gAgent.getID()));
- BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ && (LLUUID::null != item->getCreatorUUID())
+ && (item->getCreatorUUID() != gAgent.getID()));
+ BOOL user_online = FALSE;
+ if (item)
+ {
+ user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ }
items.push_back(std::string("Send Instant Message Separator"));
items.push_back(std::string("Send Instant Message"));
items.push_back(std::string("Offer Teleport..."));
@@ -3433,7 +3674,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
disabled_items.push_back(std::string("Conference Chat"));
}
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
@@ -3508,18 +3749,6 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
return rv;
}
-BOOL LLCallingCardBridge::removeItem()
-{
- if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem()))
- {
- LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID());
- return FALSE;
- }
- else
- {
- return LLItemBridge::removeItem();
- }
-}
// +=================================================+
// | LLNotecardBridge |
// +=================================================+
@@ -3584,7 +3813,7 @@ std::string LLGestureBridge::getLabelSuffix() const
// virtual
void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
{
- if ("activate" == action)
+ if (isAddAction(action))
{
LLGestureManager::instance().activateGesture(mUUID);
@@ -3596,7 +3825,7 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
gInventory.updateItem(item);
gInventory.notifyObservers();
}
- else if ("deactivate" == action)
+ else if (isRemoveAction(action))
{
LLGestureManager::instance().deactivateGesture(mUUID);
@@ -3608,6 +3837,26 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
gInventory.updateItem(item);
gInventory.notifyObservers();
}
+ else if("play" == action)
+ {
+ if(!LLGestureManager::instance().isGestureActive(mUUID))
+ {
+ // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList.
+ BOOL inform_server = TRUE;
+ BOOL deactivate_similar = FALSE;
+ LLGestureManager::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID));
+ LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+ llassert(item);
+ if (item)
+ {
+ LLGestureManager::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar);
+ }
+ }
+ else
+ {
+ playGesture(mUUID);
+ }
+ }
else LLItemBridge::performAction(folder, model, action);
}
@@ -3631,40 +3880,76 @@ void LLGestureBridge::openItem()
BOOL LLGestureBridge::removeItem()
{
- // Force close the preview window, if it exists
- LLGestureManager::instance().deactivateGesture(mUUID);
+ // Grab class information locally since *this may be deleted
+ // within this function. Not a great pattern...
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model)
+ {
+ return FALSE;
+ }
+ const LLUUID item_id = mUUID;
+
+ // This will also force close the preview window, if it exists.
+ // This may actually delete *this, if mUUID is in the COF.
+ LLGestureManager::instance().deactivateGesture(item_id);
+
+ // If deactivateGesture deleted *this, then return out immediately.
+ if (!model->getObject(item_id))
+ {
+ return TRUE;
+ }
+
return LLItemBridge::removeItem();
}
void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLGestureBridge::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
- if(isInTrash())
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
- items.push_back(std::string("Open"));
- items.push_back(std::string("Properties"));
+ bool is_sidepanel = isInOutfitsSidePanel();
+
+ if (!is_sidepanel)
+ {
+ items.push_back(std::string("Open"));
+ items.push_back(std::string("Properties"));
+ }
getClipboardEntries(true, items, disabled_items, flags);
items.push_back(std::string("Gesture Separator"));
- items.push_back(std::string("Activate"));
- items.push_back(std::string("Deactivate"));
+ if (LLGestureManager::instance().isGestureActive(getUUID()))
+ {
+ items.push_back(std::string("Deactivate"));
+ }
+ else
+ {
+ items.push_back(std::string("Activate"));
+ }
+ }
+ hide_context_entries(menu, items, disabled_items);
+}
+
+// static
+void LLGestureBridge::playGesture(const LLUUID& item_id)
+{
+ if (LLGestureManager::instance().isGesturePlaying(item_id))
+ {
+ LLGestureManager::instance().stopGesture(item_id);
+ }
+ else
+ {
+ LLGestureManager::instance().playGesture(item_id);
}
- hideContextEntries(menu, items, disabled_items);
}
+
// +=================================================+
// | LLAnimationBridge |
// +=================================================+
@@ -3676,19 +3961,13 @@ LLUIImagePtr LLAnimationBridge::getIcon() const
void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
- if(isInTrash())
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
@@ -3702,7 +3981,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Animation Play"));
items.push_back(std::string("Animation Audition"));
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
@@ -3762,14 +4041,6 @@ LLItemBridge(inventory, uuid), mInvType(type)
mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE;
}
-BOOL LLObjectBridge::isItemRemovable()
-{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if(!avatar) return FALSE;
- if(avatar->isWearingAttachment(mUUID)) return FALSE;
- return LLInvFVBridge::isItemRemovable();
-}
-
LLUIImagePtr LLObjectBridge::getIcon() const
{
return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject );
@@ -3789,7 +4060,7 @@ LLInventoryObject* LLObjectBridge::getObject() const
// virtual
void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
{
- if ("attach" == action)
+ if (isAddAction(action))
{
LLUUID object_id = mUUID;
LLViewerInventoryItem* item;
@@ -3812,7 +4083,7 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
}
gFocusMgr.setKeyboardFocus(NULL);
}
- else if ("detach" == action)
+ else if (isRemoveAction(action))
{
LLInventoryItem* item = gInventory.getItem(mUUID);
if(item)
@@ -3822,17 +4093,13 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
- }
- // this object might have been selected, so let the selection manager know it's gone now
- LLViewerObject *found_obj =
- gObjectList.findObject(item->getUUID());
- if (found_obj)
- {
- LLSelectMgr::getInstance()->remove(found_obj);
- }
- else
- {
- llwarns << "object not found - ignoring" << llendl;
+
+ // this object might have been selected, so let the selection manager know it's gone now
+ LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
else LLItemBridge::performAction(folder, model, action);
@@ -3847,6 +4114,11 @@ void LLObjectBridge::openItem()
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
+ LLSD key;
+ key["id"] = mUUID;
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+ // Disable old properties floater; this is replaced by the sidepanel.
/*
LLFloaterReg::showInstance("properties", mUUID);
*/
@@ -3856,8 +4128,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if(get_is_item_worn( mUUID ) )
{
font |= LLFontGL::BOLD;
}
@@ -3873,12 +4144,12 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
std::string LLObjectBridge::getLabelSuffix() const
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
- LLStringUtil::toLower(attachment_point_name);
+ // e.g. "(worn on ...)" / "(attached to ...)"
LLStringUtil::format_map_t args;
args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str();
return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
@@ -3913,7 +4184,7 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
#if !ENABLE_MULTIATTACHMENTS
if (attachment && attachment->getNumObjects() > 0)
{
- LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
+ LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
}
else
#endif
@@ -3930,11 +4201,11 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon
{
LLSD args;
args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
- LLNotifications::instance().add("MaxAttachmentsOnOutfit", args);
+ LLNotificationsUtil::add("MaxAttachmentsOnOutfit", args);
return false;
}
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0/*YES*/)
{
LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID());
@@ -3966,32 +4237,26 @@ static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("Rep
void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
- if(isInTrash())
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
- LLInventoryItem* item = getItem();
- if (item && item->getIsLinkType())
+ bool is_sidepanel = isInOutfitsSidePanel();
+
+ if (!is_sidepanel)
{
- items.push_back(std::string("Goto Link"));
+ items.push_back(std::string("Properties"));
}
- items.push_back(std::string("Properties"));
-
getClipboardEntries(true, items, disabled_items, flags);
LLObjectBridge::sContextMenuItemID = mUUID;
+ LLInventoryItem *item = getItem();
if(item)
{
LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
@@ -4000,12 +4265,12 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
return;
}
- if( avatarp->isWearingAttachment( mUUID ) )
+ if( get_is_item_worn( mUUID ) )
{
+ items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Detach From Yourself"));
}
- else
- if( !isInTrash() && !isLinkedObjectInTrash() )
+ else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
@@ -4058,7 +4323,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
}
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
BOOL LLObjectBridge::renameItem(const std::string& new_name)
@@ -4136,7 +4401,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
<< " )" << llendl;
- LLAppearanceManager::wearItem(item);
+ LLAppearanceManager::instance().addCOFItemLink(item);
}
}
@@ -4225,39 +4490,43 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
{
for(i = 0; i < wearable_count; ++i)
{
- if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) )
+ LLViewerInventoryItem *item = item_array.get(i);
+ if (item->getType() == LLAssetType::AT_BODYPART)
+ continue;
+ if (gAgent.isTeen() && item->isWearableType() &&
+ (item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
+ continue;
+ if (get_is_item_worn(item->getUUID()))
{
- LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(),
- item_array.get(i)->getName(),
- item_array.get(i)->getType(),
+ LLWearableList::instance().getAsset(item->getAssetUUID(),
+ item->getName(),
+ item->getType(),
LLWearableBridge::onRemoveFromAvatarArrived,
- new OnRemoveStruct(item_array.get(i)->getUUID()));
-
+ new OnRemoveStruct(item->getLinkedUUID()));
}
}
}
-
if (obj_count > 0)
{
for(i = 0; i < obj_count; ++i)
{
- gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
- gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() );
-
- gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
-
- // this object might have been selected, so let the selection manager know it's gone now
- LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID());
- if (found_obj)
- {
- LLSelectMgr::getInstance()->remove(found_obj);
- }
- else
+ LLViewerInventoryItem *obj_item = obj_item_array.get(i);
+ if (get_is_item_worn(obj_item->getUUID()))
{
- llwarns << "object not found, ignoring" << llendl;
+ gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
+
+ gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
+
+ // this object might have been selected, so let the selection manager know it's gone now
+ LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
}
@@ -4266,10 +4535,11 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
{
for(i = 0; i < gest_count; ++i)
{
- if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) )
+ LLViewerInventoryItem *gest_item = gest_item_array.get(i);
+ if (get_is_item_worn(gest_item->getUUID()))
{
- LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() );
- gInventory.updateItem( gest_item_array.get(i) );
+ LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
+ gInventory.updateItem( gest_item );
gInventory.notifyObservers();
}
@@ -4280,23 +4550,18 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
BOOL LLWearableBridge::renameItem(const std::string& new_name)
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
gAgentWearables.setWearableName( mUUID, new_name );
}
return LLItemBridge::renameItem(new_name);
}
-BOOL LLWearableBridge::isItemRemovable()
-{
- if (gAgentWearables.isWearingItem(mUUID)) return FALSE;
- return LLInvFVBridge::isItemRemovable();
-}
-
std::string LLWearableBridge::getLabelSuffix() const
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
+ // e.g. "(worn)"
return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
}
else
@@ -4313,7 +4578,7 @@ LLUIImagePtr LLWearableBridge::getIcon() const
// virtual
void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
{
- if ("wear" == action)
+ if (isAddAction(action))
{
wearOnAvatar();
}
@@ -4326,20 +4591,10 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
editOnAvatar();
return;
}
- else if ("take_off" == action)
+ else if (isRemoveAction(action))
{
- if(gAgentWearables.isWearingItem(mUUID))
- {
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLWearableList::instance().getAsset(item->getAssetUUID(),
- item->getName(),
- item->getType(),
- LLWearableBridge::onRemoveFromAvatarArrived,
- new OnRemoveStruct(mUUID));
- }
- }
+ removeFromAvatar();
+ return;
}
else LLItemBridge::performAction(folder, model, action);
}
@@ -4353,13 +4608,13 @@ void LLWearableBridge::openItem()
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
/*
- if( isInTrash() )
+ if( isItemInTrash() )
{
- LLNotifications::instance().add("CannotWearTrash");
+ LLNotificationsUtil::add("CannotWearTrash");
}
else if(isAgentInventory())
{
- if( !gAgentWearables.isWearingItem( mUUID ) )
+ if( !get_is_item_worn( mUUID ) )
{
wearOnAvatar();
}
@@ -4384,7 +4639,7 @@ void LLWearableBridge::openItem()
{
// *TODO: We should fetch the item details, and then do
// the operation above.
- LLNotifications::instance().add("CannotWearInfoNotComplete");
+ LLNotificationsUtil::add("CannotWearInfoNotComplete");
}
}
*/
@@ -4393,47 +4648,47 @@ void LLWearableBridge::openItem()
void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLWearableBridge::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
- if(isInTrash())
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{ // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
- BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM);
+ BOOL can_open = ((flags & SUPPRESS_OPEN_ITEM) != SUPPRESS_OPEN_ITEM);
// If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976
LLViewerInventoryItem* item = getItem();
- if( !no_open && item )
+ if (can_open && item)
{
- no_open = (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART);
+ can_open = (item->getType() != LLAssetType::AT_CLOTHING) &&
+ (item->getType() != LLAssetType::AT_BODYPART);
}
- if (!no_open)
+ if (isLinkedObjectMissing())
{
- items.push_back(std::string("Open"));
+ can_open = FALSE;
}
- if (item && item->getIsLinkType())
+ bool is_sidepanel = isInOutfitsSidePanel();
+
+ if (can_open && !is_sidepanel)
{
- items.push_back(std::string("Goto Link"));
+ items.push_back(std::string("Open"));
}
- items.push_back(std::string("Properties"));
+ if (!is_sidepanel)
+ {
+ items.push_back(std::string("Properties"));
+ }
getClipboardEntries(true, items, disabled_items, flags);
- items.push_back(std::string("Wearable Separator"));
+ if (!is_sidepanel)
+ {
+ items.push_back(std::string("Wearable Separator"));
+ }
- items.push_back(std::string("Wearable Wear"));
- items.push_back(std::string("Wearable Add"));
items.push_back(std::string("Wearable Edit"));
if ((flags & FIRST_SELECTED_ITEM) == 0)
@@ -4441,7 +4696,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
disabled_items.push_back(std::string("Wearable Edit"));
}
// Don't allow items to be worn if their baseobj is in the trash.
- if (isLinkedObjectInTrash())
+ if (isLinkedObjectInTrash() || isLinkedObjectMissing())
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
@@ -4455,14 +4710,17 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
case LLAssetType::AT_CLOTHING:
items.push_back(std::string("Take Off"));
+ // Fallthrough since clothing and bodypart share wear options
case LLAssetType::AT_BODYPART:
- if (gAgentWearables.isWearingItem(item->getUUID()))
+ if (get_is_item_worn(item->getUUID()))
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
}
else
{
+ items.push_back(std::string("Wearable Wear"));
+ items.push_back(std::string("Wearable Add"));
disabled_items.push_back(std::string("Take Off"));
}
break;
@@ -4471,7 +4729,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
}
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
// Called from menus
@@ -4485,7 +4743,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
if(!item || !item->isComplete()) return FALSE;
}
- return (!gAgentWearables.isWearingItem(self->mUUID));
+ return (!get_is_item_worn(self->mUUID));
}
// Called from menus
@@ -4503,7 +4761,7 @@ void LLWearableBridge::wearOnAvatar()
// destroy clothing items.
if (!gAgentWearables.areWearablesLoaded())
{
- LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return;
}
@@ -4534,7 +4792,7 @@ void LLWearableBridge::wearAddOnAvatar()
// destroy clothing items.
if (!gAgentWearables.areWearablesLoaded())
{
- LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return;
}
@@ -4617,7 +4875,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return FALSE;
- return (gAgentWearables.isWearingItem(self->mUUID));
+ return (get_is_item_worn(self->mUUID));
}
// static
@@ -4632,7 +4890,8 @@ void LLWearableBridge::onEditOnAvatar(void* user_data)
void LLWearableBridge::editOnAvatar()
{
- const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);
+ LLUUID linked_id = gInventory.getLinkedItemID(mUUID);
+ const LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id);
if( wearable )
{
// Set the tab to the right wearable.
@@ -4653,7 +4912,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
{
- return gAgentWearables.isWearingItem( self->mUUID );
+ return get_is_item_worn( self->mUUID );
}
return FALSE;
}
@@ -4663,7 +4922,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
{
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return;
- if(gAgentWearables.isWearingItem(self->mUUID))
+ if(get_is_item_worn(self->mUUID))
{
LLViewerInventoryItem* item = self->getItem();
if (item)
@@ -4686,7 +4945,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
if(wearable)
{
- if( gAgentWearables.isWearingItem( item_id ) )
+ if( get_is_item_worn( item_id ) )
{
EWearableType type = wearable->getType();
@@ -4701,8 +4960,12 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
}
// Find and remove this item from the COF.
- LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
- llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
+ // FIXME 2.1 - call removeCOFItemLinks in llappearancemgr instead.
+ LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
+ if (items.size() != 1)
+ {
+ llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl;
+ }
for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
iter != items.end();
++iter)
@@ -4716,6 +4979,69 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
delete on_remove_struct;
}
+/* static */
+void LLWearableBridge::removeAllClothesFromAvatar()
+{
+ // Remove COF links.
+ for (S32 itype = WT_SHAPE; itype < WT_COUNT; ++itype)
+ {
+ if (itype == WT_SHAPE || itype == WT_SKIN || itype == WT_HAIR || itype == WT_EYES)
+ continue;
+
+ // MULTI-WEARABLES: fixed to index 0
+ LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
+ gAgentWearables.getWearableInventoryItem((EWearableType)itype, 0));
+ if (!item)
+ continue;
+ const LLUUID &item_id = gInventory.getLinkedItemID(item->getUUID());
+ const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id);
+ if (!wearable)
+ continue;
+
+ // Find and remove this item from the COF.
+ LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(
+ item_id, LLAppearanceManager::instance().getCOF());
+ if (items.size() != 1)
+ {
+ llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl;
+ }
+ for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
+ iter != items.end();
+ ++iter)
+ {
+ const LLViewerInventoryItem *linked_item = (*iter);
+ const LLUUID &item_id = linked_item->getUUID();
+ gInventory.purgeObject(item_id);
+ }
+ }
+ gInventory.notifyObservers();
+
+ // Remove wearables from gAgentWearables
+ LLAgentWearables::userRemoveAllClothes();
+}
+
+/* static */
+void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item)
+{
+ if (item)
+ {
+ LLWearableList::instance().getAsset(item->getAssetUUID(),
+ item->getName(),
+ item->getType(),
+ LLWearableBridge::onRemoveFromAvatarArrived,
+ new OnRemoveStruct(item->getUUID()));
+ }
+}
+
+void LLWearableBridge::removeFromAvatar()
+{
+ if (get_is_item_worn(mUUID))
+ {
+ LLViewerInventoryItem* item = getItem();
+ removeItemFromAvatar(item);
+ }
+}
+
LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
const LLUUID& uuid,LLInventoryModel* model)
{
@@ -4785,12 +5111,18 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
//static
void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
{
- LLAssetType::EType asset_type = model->getItem(uuid)->getType();
- LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
- if(action)
+ llassert(model);
+ LLViewerInventoryItem* item = model->getItem(uuid);
+ llassert(item);
+ if (item)
{
- action->doIt();
- delete action;
+ LLAssetType::EType asset_type = item->getType();
+ LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+ if(action)
+ {
+ action->doIt();
+ delete action;
+ }
}
}
@@ -4834,8 +5166,12 @@ void LLLandmarkBridgeAction::doIt()
// Opening (double-clicking) a landmark immediately teleports,
// but warns you the first time.
LLSD payload;
- payload["asset_id"] = item->getAssetUUID();
- LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+ payload["asset_id"] = item->getAssetUUID();
+
+ LLSD args;
+ args["LOCATION"] = item->getName();
+
+ LLNotificationsUtil::add("TeleportFromLandmark", args, payload);
}
LLInvFVBridgeAction::doIt();
@@ -4896,8 +5232,9 @@ void LLAnimationBridgeAction::doIt()
//virtual
void LLObjectBridgeAction::doIt()
{
+ /*
LLFloaterReg::showInstance("properties", mUUID);
-
+ */
LLInvFVBridgeAction::doIt();
}
@@ -4915,10 +5252,10 @@ void LLLSLTextBridgeAction::doIt()
}
-BOOL LLWearableBridgeAction::isInTrash() const
+BOOL LLWearableBridgeAction::isItemInTrash() const
{
if(!mModel) return FALSE;
- LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);
return mModel->isObjectDescendentOf(mUUID, trash_id);
}
@@ -4935,7 +5272,7 @@ void LLWearableBridgeAction::wearOnAvatar()
// destroy clothing items.
if (!gAgentWearables.areWearablesLoaded())
{
- LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return;
}
@@ -4963,13 +5300,13 @@ void LLWearableBridgeAction::wearOnAvatar()
//virtual
void LLWearableBridgeAction::doIt()
{
- if(isInTrash())
+ if(isItemInTrash())
{
- LLNotifications::instance().add("CannotWearTrash");
+ LLNotificationsUtil::add("CannotWearTrash");
}
else if(isAgentInventory())
{
- if(!gAgentWearables.isWearingItem(mUUID))
+ if(!get_is_item_worn(mUUID))
{
wearOnAvatar();
}
@@ -4994,7 +5331,7 @@ void LLWearableBridgeAction::doIt()
{
// *TODO: We should fetch the item details, and then do
// the operation above.
- LLNotifications::instance().add("CannotWearInfoNotComplete");
+ LLNotificationsUtil::add("CannotWearInfoNotComplete");
}
}
@@ -5013,7 +5350,7 @@ LLUIImagePtr LLLinkItemBridge::getIcon() const
{
if (LLViewerInventoryItem *item = getItem())
{
- return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE);
+ return get_item_icon(item->getActualType(), item->getInventoryType(), 0, FALSE);
}
return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
}
@@ -5022,28 +5359,22 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
// *TODO: Translate
lldebugs << "LLLink::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- if(isInTrash())
+ items.push_back(std::string("Find Original"));
+ disabled_items.push_back(std::string("Find Original"));
+
+ if(isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
- items.push_back(std::string("Delete"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Delete"));
- }
+ items.push_back(std::string("Properties"));
+ addDeleteContextMenuOptions(items, disabled_items);
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
@@ -5057,7 +5388,7 @@ std::string LLLinkFolderBridge::sPrefix("Link: ");
LLUIImagePtr LLLinkFolderBridge::getIcon() const
{
- LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+ LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
if (LLViewerInventoryItem *item = getItem())
{
if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
@@ -5072,29 +5403,19 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
// *TODO: Translate
lldebugs << "LLLink::buildContextMenu()" << llendl;
- std::vector<std::string> items;
- std::vector<std::string> disabled_items;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- if(isInTrash())
+ if (isItemInTrash())
{
- items.push_back(std::string("Purge Item"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Purge Item"));
- }
-
- items.push_back(std::string("Restore Item"));
+ addTrashContextMenuOptions(items, disabled_items);
}
else
{
- items.push_back(std::string("Goto Link"));
- items.push_back(std::string("Delete"));
- if (!isItemRemovable())
- {
- disabled_items.push_back(std::string("Delete"));
- }
+ items.push_back(std::string("Find Original"));
+ addDeleteContextMenuOptions(items, disabled_items);
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 6b2a2d32de..32504091cb 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -33,14 +33,17 @@
#ifndef LL_LLINVENTORYBRIDGE_H
#define LL_LLINVENTORYBRIDGE_H
-#include "llfloaterproperties.h"
-#include "llwearable.h"
-#include "llviewercontrol.h"
#include "llcallingcard.h"
-#include "llinventorymodel.h"
+#include "llfloaterproperties.h"
#include "llfoldervieweventlistener.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewercontrol.h"
+#include "llwearable.h"
class LLInventoryPanel;
+class LLInventoryModel;
+class LLMenuGL;
enum EInventoryIcon
{
@@ -104,29 +107,15 @@ struct LLAttachmentRezAction
S32 mAttachPt;
};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryPanelObserver
-//
-// Bridge to support knowing when the inventory has changed.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryPanelObserver : public LLInventoryObserver
-{
-public:
- LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
- virtual ~LLInventoryPanelObserver() {}
- virtual void changed(U32 mask);
-protected:
- LLInventoryPanel* mIP;
-};
+typedef std::vector<std::string> menuentry_vec_t;
const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type);
-void hideContextEntries(LLMenuGL& menu,
- const std::vector<std::string> &entries_to_show,
- const std::vector<std::string> &disabled_entries);
+void hide_context_entries(LLMenuGL& menu,
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInvFVBridge (& it's derived classes)
+// Class LLInvFVBridge (& its derived classes)
//
// Short for Inventory-Folder-View-Bridge. This is an
// implementation class to be able to view inventory items.
@@ -158,7 +147,7 @@ public:
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
virtual PermissionMask getPermissionMask() const;
- virtual LLAssetType::EType getPreferredType() const;
+ virtual LLFolderType::EType getPreferredType() const;
virtual time_t getCreationDate() const;
virtual LLFontGL::StyleFlags getLabelStyle() const
{
@@ -167,13 +156,14 @@ public:
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
virtual void openItem() {}
virtual void closeItem() {}
- virtual void gotoItem(LLFolderView *folder) {} // for links
virtual void previewItem() {openItem();}
virtual void showProperties();
virtual BOOL isItemRenameable() const { return TRUE; }
//virtual BOOL renameItem(const std::string& new_name) {}
- virtual BOOL isItemRemovable();
+ virtual BOOL isItemRemovable() const;
virtual BOOL isItemMovable() const;
+ virtual BOOL isItemInTrash() const;
+
//virtual BOOL removeItem() = 0;
virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
virtual void move(LLFolderViewEventListener* new_parent_bridge) {}
@@ -184,8 +174,8 @@ public:
virtual BOOL isClipboardPasteableAsLink() const;
virtual void pasteFromClipboard() {}
virtual void pasteLinkFromClipboard() {}
- void getClipboardEntries(bool show_asset_id, std::vector<std::string> &items,
- std::vector<std::string> &disabled_items, U32 flags);
+ void getClipboardEntries(bool show_asset_id, menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items, U32 flags);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
@@ -196,14 +186,26 @@ public:
// LLInvFVBridge functionality
virtual void clearDisplayName() {}
+ // Allow context menus to be customized for side panel.
+ bool isInOutfitsSidePanel() const;
+
+ //--------------------------------------------------------------------
+ // Convenience functions for adding various common menu options.
+ //--------------------------------------------------------------------
+protected:
+ virtual void addTrashContextMenuOptions(menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items);
+ virtual void addDeleteContextMenuOptions(menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items);
+
protected:
LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid);
LLInventoryObject* getInventoryObject() const;
LLInventoryModel* getInventoryModel() const;
- BOOL isInTrash() const;
BOOL isLinkedObjectInTrash() const; // Is this obj or its baseobj in the trash?
+ BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory?
BOOL isAgentInventory() const; // false if lost or in the inventory library
BOOL isCOFFolder() const; // true if COF or descendent of.
@@ -217,8 +219,6 @@ protected:
const LLUUID& new_parent,
BOOL restamp);
void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);
- void renameLinkedItems(const LLUUID &item_id, const std::string& new_name);
-
protected:
LLHandle<LLPanel> mInventoryPanel;
const LLUUID mUUID; // item id
@@ -255,7 +255,6 @@ public:
virtual void restoreItem();
virtual void restoreToWorld();
virtual void gotoItem(LLFolderView *folder);
-
virtual LLUIImagePtr getIcon() const;
virtual const std::string& getDisplayName() const;
virtual std::string getLabelSuffix() const;
@@ -274,6 +273,9 @@ public:
virtual void clearDisplayName() { mDisplayName.clear(); }
LLViewerInventoryItem* getItem() const;
+
+ bool isAddAction(std::string action) const;
+ bool isRemoveAction(std::string action) const;
protected:
virtual BOOL isItemPermissive() const;
@@ -297,12 +299,17 @@ public:
virtual void selectItem();
virtual void restoreItem();
- virtual LLAssetType::EType getPreferredType() const;
+ virtual LLFolderType::EType getPreferredType() const;
virtual LLUIImagePtr getIcon() const;
- static LLUIImagePtr getIcon(LLAssetType::EType asset_type);
+ virtual LLUIImagePtr getOpenIcon() const;
+ static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual BOOL renameItem(const std::string& new_name);
+
virtual BOOL removeItem();
+ BOOL removeSystemFolder();
+ bool removeItemResponse(const LLSD& notification, const LLSD& response);
+
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
@@ -311,7 +318,7 @@ public:
EDragAndDropType cargo_type,
void* cargo_data);
- virtual BOOL isItemRemovable();
+ virtual BOOL isItemRemovable() const;
virtual BOOL isItemMovable() const ;
virtual BOOL isUpToDate() const;
virtual BOOL isItemCopyable() const;
@@ -320,13 +327,17 @@ public:
virtual BOOL copyToClipboard() const;
static void createWearable(LLFolderBridge* bridge, EWearableType type);
- static void createWearable(LLUUID parent_folder_id, EWearableType type);
+ static void createWearable(const LLUUID &parent_folder_id, EWearableType type);
LLViewerInventoryCategory* getCategory() const;
protected:
- LLFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLInvFVBridge(inventory, uuid), mCallingCards(FALSE), mWearables(FALSE) {}
+ LLFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid)
+ : LLInvFVBridge(inventory, uuid),
+
+ mCallingCards(FALSE),
+ mWearables(FALSE),
+ mMenu(NULL) {}
// menu callbacks
static void pasteClipboard(void* user_data);
@@ -347,6 +358,7 @@ protected:
static void createNewEyes(void* user_data);
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
+ BOOL areAnyContentsWorn(LLInventoryModel* model) const;
void modifyOutfit(BOOL append);
void determineFolderType();
@@ -359,8 +371,8 @@ private:
BOOL mCallingCards;
BOOL mWearables;
LLMenuGL* mMenu;
- std::vector<std::string> mItems;
- std::vector<std::string> mDisabledItems;
+ menuentry_vec_t mItems;
+ menuentry_vec_t mDisabledItems;
};
// DEPRECATED
@@ -382,10 +394,13 @@ class LLTextureBridge : public LLItemBridge
public:
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
protected:
LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) :
LLItemBridge(inventory, uuid), mInvType(type) {}
+ bool canSaveTexture(void);
LLInventoryType::EType mInvType;
};
@@ -449,7 +464,6 @@ public:
EDragAndDropType cargo_type,
void* cargo_data);
void refreshFolderViewItem();
- BOOL removeItem();
protected:
LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid );
@@ -489,6 +503,8 @@ public:
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ static void playGesture(const LLUUID& item_id);
+
protected:
LLGestureBridge(LLInventoryPanel* inventory, const LLUUID& uuid)
: LLItemBridge(inventory, uuid) {}
@@ -521,7 +537,6 @@ public:
virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual std::string getLabelSuffix() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- virtual BOOL isItemRemovable();
virtual BOOL renameItem(const std::string& new_name);
LLInventoryObject* getObject() const;
@@ -559,7 +574,6 @@ public:
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual std::string getLabelSuffix() const;
- virtual BOOL isItemRemovable();
virtual BOOL renameItem(const std::string& new_name);
static void onWearOnAvatar( void* userdata ); // Access to wearOnAvatar() from menu
@@ -576,7 +590,10 @@ public:
static BOOL canRemoveFromAvatar( void* userdata );
static void onRemoveFromAvatar( void* userdata );
- static void onRemoveFromAvatarArrived( LLWearable* wearable, void* userdata );
+ static void onRemoveFromAvatarArrived( LLWearable* wearable, void* userdata );
+ static void removeItemFromAvatar(LLViewerInventoryItem *item);
+ static void removeAllClothesFromAvatar();
+ void removeFromAvatar();
protected:
LLWearableBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLAssetType::EType asset_type, LLInventoryType::EType inv_type, EWearableType wearable_type) :
@@ -781,7 +798,7 @@ protected:
LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
- BOOL isInTrash() const;
+ BOOL isItemInTrash() const;
// return true if the item is in agent inventory. if false, it
// must be lost or in the inventory library.
BOOL isAgentInventory() const;
@@ -807,5 +824,9 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
void teleport_via_landmark(const LLUUID& asset_id);
+// Utility function to hide all entries except those in the list
+void hide_context_entries(LLMenuGL& menu,
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries);
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 7ec8d3d003..cd20d64ca8 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -39,27 +39,33 @@
#include "llfolderviewitem.h"
#include "llinventorymodel.h" // gInventory.backgroundFetchActive()
#include "llviewercontrol.h"
-#include "llviewerinventory.h"
+#include "llfolderview.h"
// linden library includes
#include "lltrans.h"
+LLInventoryFilter::FilterOps::FilterOps() :
+ mFilterObjectTypes(0xffffffffffffffffULL),
+ mFilterCategoryTypes(0xffffffffffffffffULL),
+ mMinDate(time_min()),
+ mMaxDate(time_max()),
+ mHoursAgo(0),
+ mShowFolderState(SHOW_NON_EMPTY_FOLDERS),
+ mPermissions(PERM_NONE),
+ mFilterTypes(FILTERTYPE_OBJECT),
+ mFilterUUID(LLUUID::null)
+{
+}
+
///----------------------------------------------------------------------------
/// Class LLInventoryFilter
///----------------------------------------------------------------------------
LLInventoryFilter::LLInventoryFilter(const std::string& name)
: mName(name),
mModified(FALSE),
- mNeedTextRebuild(TRUE)
+ mNeedTextRebuild(TRUE),
+ mEmptyLookupMessage("InventoryNoMatchingItems")
{
- mFilterOps.mFilterTypes = 0xffffffffffffffffULL;
- mFilterOps.mMinDate = time_min();
- mFilterOps.mMaxDate = time_max();
- mFilterOps.mHoursAgo = 0;
- mFilterOps.mShowFolderState = SHOW_NON_EMPTY_FOLDERS;
- mFilterOps.mPermissions = PERM_NONE;
- mFilterOps.mFilterForCategories = FALSE;
-
mOrder = SO_FOLDERS_BY_NAME; // This gets overridden by a pref immediately
mSubStringMatchOffset = 0;
@@ -81,67 +87,123 @@ LLInventoryFilter::~LLInventoryFilter()
{
}
-BOOL LLInventoryFilter::check(LLFolderViewItem* item)
+BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
{
- time_t earliest;
-
- earliest = time_corrected() - mFilterOps.mHoursAgo * 3600;
- if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest)
- {
- earliest = mFilterOps.mMinDate;
- }
- else if (!mFilterOps.mHoursAgo)
+ // If it's a folder and we're showing all folders, return TRUE automatically.
+ const BOOL is_folder = (dynamic_cast<const LLFolderViewFolder*>(item) != NULL);
+ if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))
{
- earliest = 0;
+ return TRUE;
}
- LLFolderViewEventListener* listener = item->getListener();
+
+ const LLFolderViewEventListener* listener = item->getListener();
mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
- bool passed_type = false;
- if (mFilterOps.mFilterForCategories)
+ const BOOL passed_filtertype = checkAgainstFilterType(item);
+ const BOOL passed = passed_filtertype &&
+ (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) &&
+ ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions);
+
+ return passed;
+}
+
+BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
+{
+ const LLFolderViewEventListener* listener = item->getListener();
+ if (!listener) return FALSE;
+
+ const LLInventoryType::EType object_type = listener->getInventoryType();
+ const LLUUID object_id = listener->getUUID();
+ const LLInventoryObject *object = gInventory.getObject(object_id);
+
+ const U32 filterTypes = mFilterOps.mFilterTypes;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_OBJECT
+ // Pass if this item's type is of the correct filter type
+ if (filterTypes & FILTERTYPE_OBJECT)
{
- if (listener->getInventoryType() == LLInventoryType::IT_CATEGORY)
+ // If it has no type, pass it, unless it's a link.
+ if (object_type == LLInventoryType::IT_NONE)
{
- LLViewerInventoryCategory *cat = gInventory.getCategory(listener->getUUID());
- if (cat)
- {
- passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0));
- }
+ if (object && object->getIsLinkType())
+ return FALSE;
+ }
+ else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
+ {
+ return FALSE;
}
}
- else
- {
- LLInventoryType::EType type = listener->getInventoryType();
- passed_type |= ((1LL << type & mFilterOps.mFilterTypes) != U64(0));
- if (type == LLInventoryType::IT_NONE)
+ //
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_CATEGORY
+ // Pass if this item is a category of the filter type, or
+ // if its parent is a category of the filter type.
+ if (filterTypes & FILTERTYPE_CATEGORY)
+ {
+ // Can only filter categories for items in your inventory
+ // (e.g. versus in-world object contents).
+ if (!object) return FALSE;
+
+ LLUUID cat_id = object_id;
+ if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)
{
- const LLInventoryObject *obj = gInventory.getObject(listener->getUUID());
- if (obj && obj->getIsLinkType())
- {
- passed_type = FALSE;
- }
- else
- {
- passed_type = TRUE;
- }
+ cat_id = object->getParentUUID();
}
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ if (!cat)
+ return FALSE;
+ if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0))
+ return FALSE;
}
+ //
+ ////////////////////////////////////////////////////////////////////////////////
- BOOL passed = passed_type
- && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)
- && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)
- && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate);
- BOOL is_folder = (dynamic_cast<LLFolderViewFolder*>(item) != NULL);
- if (is_folder && mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_UUID
+ // Pass if this item is the target UUID or if it links to the target UUID
+ if (filterTypes & FILTERTYPE_UUID)
{
- passed = TRUE;
+ if (!object) return FALSE;
+
+ if (object->getLinkedUUID() != mFilterOps.mFilterUUID)
+ return FALSE;
}
+ //
+ ////////////////////////////////////////////////////////////////////////////////
- return passed;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_DATE
+ // Pass if this item is within the date range.
+ if (filterTypes & FILTERTYPE_DATE)
+ {
+ const U16 HOURS_TO_SECONDS = 3600;
+ time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS;
+ if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest)
+ {
+ earliest = mFilterOps.mMinDate;
+ }
+ else if (!mFilterOps.mHoursAgo)
+ {
+ earliest = 0;
+ }
+ if (listener->getCreationDate() < earliest ||
+ listener->getCreationDate() > mFilterOps.mMaxDate)
+ return FALSE;
+ }
+ //
+ ////////////////////////////////////////////////////////////////////////////////
+
+ return TRUE;
}
-const std::string LLInventoryFilter::getFilterSubString(BOOL trim)
+
+const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
{
return mFilterSubString;
}
@@ -152,9 +214,10 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
}
// has user modified default filter params?
-BOOL LLInventoryFilter::isNotDefault()
+BOOL LLInventoryFilter::isNotDefault() const
{
- return mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes
+ return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes
+ || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != mDefaultFilterOps.mPermissions
|| mFilterOps.mMinDate != mDefaultFilterOps.mMinDate
@@ -162,9 +225,10 @@ BOOL LLInventoryFilter::isNotDefault()
|| mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo;
}
-BOOL LLInventoryFilter::isActive()
+BOOL LLInventoryFilter::isActive() const
{
- return mFilterOps.mFilterTypes != 0xffffffffffffffffULL
+ return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL
+ || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != PERM_NONE
|| mFilterOps.mMinDate != time_min()
@@ -172,7 +236,7 @@ BOOL LLInventoryFilter::isActive()
|| mFilterOps.mHoursAgo != 0;
}
-BOOL LLInventoryFilter::isModified()
+BOOL LLInventoryFilter::isModified() const
{
return mModified;
}
@@ -184,15 +248,15 @@ BOOL LLInventoryFilter::isModifiedAndClear()
return ret;
}
-void LLInventoryFilter::setFilterTypes(U64 types, BOOL filter_for_categories)
+void LLInventoryFilter::setFilterObjectTypes(U64 types)
{
- if (mFilterOps.mFilterTypes != types)
+ if (mFilterOps.mFilterObjectTypes != types)
{
// keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterTypes & types);
+ BOOL fewer_bits_set = (mFilterOps.mFilterObjectTypes & ~types);
+ BOOL more_bits_set = (~mFilterOps.mFilterObjectTypes & types);
- mFilterOps.mFilterTypes = types;
+ mFilterOps.mFilterObjectTypes = types;
if (more_bits_set && fewer_bits_set)
{
// neither less or more restrive, both simultaneously
@@ -209,7 +273,49 @@ void LLInventoryFilter::setFilterTypes(U64 types, BOOL filter_for_categories)
setModified(FILTER_MORE_RESTRICTIVE);
}
}
- mFilterOps.mFilterForCategories = filter_for_categories;
+ mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
+}
+
+void LLInventoryFilter::setFilterCategoryTypes(U64 types)
+{
+ if (mFilterOps.mFilterCategoryTypes != types)
+ {
+ // keep current items only if no type bits getting turned off
+ BOOL fewer_bits_set = (mFilterOps.mFilterCategoryTypes & ~types);
+ BOOL more_bits_set = (~mFilterOps.mFilterCategoryTypes & types);
+
+ mFilterOps.mFilterCategoryTypes = types;
+ if (more_bits_set && fewer_bits_set)
+ {
+ // neither less or more restrive, both simultaneously
+ // so we need to filter from scratch
+ setModified(FILTER_RESTART);
+ }
+ else if (more_bits_set)
+ {
+ // target is only one of all requested types so more type bits == less restrictive
+ setModified(FILTER_LESS_RESTRICTIVE);
+ }
+ else if (fewer_bits_set)
+ {
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ }
+ mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY;
+}
+
+void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
+{
+ if (mFilterOps.mFilterUUID == LLUUID::null)
+ {
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ else
+ {
+ setModified(FILTER_RESTART);
+ }
+ mFilterOps.mFilterUUID = object_id;
+ mFilterOps.mFilterTypes = FILTERTYPE_UUID;
}
void LLInventoryFilter::setFilterSubString(const std::string& string)
@@ -217,13 +323,14 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
if (mFilterSubString != string)
{
// hitting BACKSPACE, for example
- BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string);
+ const BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string);
+
// appending new characters
- BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
+ const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
+
mFilterSubString = string;
LLStringUtil::toUpper(mFilterSubString);
LLStringUtil::trimHead(mFilterSubString);
-
if (less_restrictive)
{
setModified(FILTER_LESS_RESTRICTIVE);
@@ -236,6 +343,14 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
{
setModified(FILTER_RESTART);
}
+
+ // Cancel out UUID once the search string is modified
+ if (mFilterOps.mFilterTypes == FILTERTYPE_UUID)
+ {
+ mFilterOps.mFilterTypes &= ~FILTERTYPE_UUID;
+ mFilterOps.mFilterUUID == LLUUID::null;
+ setModified(FILTER_RESTART);
+ }
}
}
@@ -277,6 +392,7 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)
mFilterOps.mMaxDate = llmax(mFilterOps.mMinDate, max_date);
setModified();
}
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
}
void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
@@ -291,12 +407,20 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
setDateRange(0, time_max());
setModified();
}
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
}
-BOOL LLInventoryFilter::isSinceLogoff()
+BOOL LLInventoryFilter::isSinceLogoff() const
{
return (mFilterOps.mMinDate == (time_t)mLastLogoff) &&
- (mFilterOps.mMaxDate == time_max());
+ (mFilterOps.mMaxDate == time_max()) &&
+ (mFilterOps.mFilterTypes & FILTERTYPE_DATE);
+}
+
+void LLInventoryFilter::clearModified()
+{
+ mModified = FALSE;
+ mFilterBehavior = FILTER_NONE;
}
void LLInventoryFilter::setHoursAgo(U32 hours)
@@ -322,7 +446,9 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
setModified(FILTER_RESTART);
}
}
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
}
+
void LLInventoryFilter::setShowFolderState(EFolderShow state)
{
if (mFilterOps.mShowFolderState != state)
@@ -387,21 +513,21 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)
// if not keeping current filter results, update last valid as well
switch(mFilterBehavior)
{
- case FILTER_RESTART:
- mMustPassGeneration = mFilterGeneration;
- mMinRequiredGeneration = mFilterGeneration;
- break;
- case FILTER_LESS_RESTRICTIVE:
- mMustPassGeneration = mFilterGeneration;
- break;
- case FILTER_MORE_RESTRICTIVE:
- mMinRequiredGeneration = mFilterGeneration;
- // must have passed either current filter generation (meaningless, as it hasn't been run yet)
- // or some older generation, so keep the value
- mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration);
- break;
- default:
- llerrs << "Bad filter behavior specified" << llendl;
+ case FILTER_RESTART:
+ mMustPassGeneration = mFilterGeneration;
+ mMinRequiredGeneration = mFilterGeneration;
+ break;
+ case FILTER_LESS_RESTRICTIVE:
+ mMustPassGeneration = mFilterGeneration;
+ break;
+ case FILTER_MORE_RESTRICTIVE:
+ mMinRequiredGeneration = mFilterGeneration;
+ // must have passed either current filter generation (meaningless, as it hasn't been run yet)
+ // or some older generation, so keep the value
+ mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration);
+ break;
+ default:
+ llerrs << "Bad filter behavior specified" << llendl;
}
}
else
@@ -412,12 +538,12 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)
}
}
-BOOL LLInventoryFilter::isFilterWith(LLInventoryType::EType t)
+BOOL LLInventoryFilter::isFilterObjectTypesWith(LLInventoryType::EType t) const
{
- return mFilterOps.mFilterTypes & (1LL << t);
+ return mFilterOps.mFilterObjectTypes & (1LL << t);
}
-std::string LLInventoryFilter::getFilterText()
+const std::string& LLInventoryFilter::getFilterText()
{
if (!mNeedTextRebuild)
{
@@ -432,7 +558,7 @@ std::string LLInventoryFilter::getFilterText()
S32 num_filter_types = 0;
mFilterText.clear();
- if (isFilterWith(LLInventoryType::IT_ANIMATION))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_ANIMATION))
{
//filtered_types += " Animations,";
filtered_types += LLTrans::getString("Animations");
@@ -447,7 +573,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_CALLINGCARD))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_CALLINGCARD))
{
//filtered_types += " Calling Cards,";
filtered_types += LLTrans::getString("Calling Cards");
@@ -461,7 +587,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_WEARABLE))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_WEARABLE))
{
//filtered_types += " Clothing,";
filtered_types += LLTrans::getString("Clothing");
@@ -475,7 +601,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_GESTURE))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_GESTURE))
{
//filtered_types += " Gestures,";
filtered_types += LLTrans::getString("Gestures");
@@ -489,7 +615,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_LANDMARK))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_LANDMARK))
{
//filtered_types += " Landmarks,";
filtered_types += LLTrans::getString("Landmarks");
@@ -503,7 +629,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_NOTECARD))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_NOTECARD))
{
//filtered_types += " Notecards,";
filtered_types += LLTrans::getString("Notecards");
@@ -517,7 +643,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_OBJECT) && isFilterWith(LLInventoryType::IT_ATTACHMENT))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_OBJECT) && isFilterObjectTypesWith(LLInventoryType::IT_ATTACHMENT))
{
//filtered_types += " Objects,";
filtered_types += LLTrans::getString("Objects");
@@ -531,7 +657,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_LSL))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_LSL))
{
//filtered_types += " Scripts,";
filtered_types += LLTrans::getString("Scripts");
@@ -545,7 +671,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_SOUND))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_SOUND))
{
//filtered_types += " Sounds,";
filtered_types += LLTrans::getString("Sounds");
@@ -559,7 +685,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_TEXTURE))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_TEXTURE))
{
//filtered_types += " Textures,";
filtered_types += LLTrans::getString("Textures");
@@ -573,7 +699,7 @@ std::string LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (isFilterWith(LLInventoryType::IT_SNAPSHOT))
+ if (isFilterObjectTypesWith(LLInventoryType::IT_SNAPSHOT))
{
//filtered_types += " Snapshots,";
filtered_types += LLTrans::getString("Snapshots");
@@ -614,9 +740,9 @@ std::string LLInventoryFilter::getFilterText()
return mFilterText;
}
-void LLInventoryFilter::toLLSD(LLSD& data)
+void LLInventoryFilter::toLLSD(LLSD& data) const
{
- data["filter_types"] = (LLSD::Integer)getFilterTypes();
+ data["filter_types"] = (LLSD::Integer)getFilterObjectTypes();
data["min_date"] = (LLSD::Integer)getMinDate();
data["max_date"] = (LLSD::Integer)getMaxDate();
data["hours_ago"] = (LLSD::Integer)getHoursAgo();
@@ -631,7 +757,7 @@ void LLInventoryFilter::fromLLSD(LLSD& data)
{
if(data.has("filter_types"))
{
- setFilterTypes((U32)data["filter_types"].asInteger());
+ setFilterObjectTypes((U32)data["filter_types"].asInteger());
}
if(data.has("min_date") && data.has("max_date"))
@@ -669,3 +795,82 @@ void LLInventoryFilter::fromLLSD(LLSD& data)
setDateRangeLastLogoff((bool)data["since_logoff"].asBoolean());
}
}
+
+U32 LLInventoryFilter::getFilterObjectTypes() const
+{
+ return mFilterOps.mFilterObjectTypes;
+}
+
+BOOL LLInventoryFilter::hasFilterString() const
+{
+ return mFilterSubString.size() > 0;
+}
+
+PermissionMask LLInventoryFilter::getFilterPermissions() const
+{
+ return mFilterOps.mPermissions;
+}
+
+time_t LLInventoryFilter::getMinDate() const
+{
+ return mFilterOps.mMinDate;
+}
+
+time_t LLInventoryFilter::getMaxDate() const
+{
+ return mFilterOps.mMaxDate;
+}
+U32 LLInventoryFilter::getHoursAgo() const
+{
+ return mFilterOps.mHoursAgo;
+}
+LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const
+{
+ return mFilterOps.mShowFolderState;
+}
+U32 LLInventoryFilter::getSortOrder() const
+{
+ return mOrder;
+}
+const std::string& LLInventoryFilter::getName() const
+{
+ return mName;
+}
+
+void LLInventoryFilter::setFilterCount(S32 count)
+{
+ mFilterCount = count;
+}
+S32 LLInventoryFilter::getFilterCount() const
+{
+ return mFilterCount;
+}
+
+void LLInventoryFilter::decrementFilterCount()
+{
+ mFilterCount--;
+}
+
+S32 LLInventoryFilter::getCurrentGeneration() const
+{
+ return mFilterGeneration;
+}
+S32 LLInventoryFilter::getMinRequiredGeneration() const
+{
+ return mMinRequiredGeneration;
+}
+S32 LLInventoryFilter::getMustPassGeneration() const
+{
+ return mMustPassGeneration;
+}
+
+void LLInventoryFilter::setEmptyLookupMessage(const std::string& message)
+{
+ mEmptyLookupMessage = message;
+}
+
+const std::string& LLInventoryFilter::getEmptyLookupMessage() const
+{
+ return mEmptyLookupMessage;
+
+}
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index b803df110b..b01554edc8 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -33,30 +33,39 @@
#ifndef LLINVENTORYFILTER_H
#define LLINVENTORYFILTER_H
-// lots of includes here
#include "llinventorytype.h"
-#include "llpermissionsflags.h" // PermissionsMask
+#include "llpermissionsflags.h"
class LLFolderViewItem;
class LLInventoryFilter
{
public:
- typedef enum e_folder_show
+ enum EFolderShow
{
SHOW_ALL_FOLDERS,
SHOW_NON_EMPTY_FOLDERS,
SHOW_NO_FOLDERS
- } EFolderShow;
+ };
- typedef enum e_filter_behavior
+ enum EFilterBehavior
{
FILTER_NONE, // nothing to do, already filtered
FILTER_RESTART, // restart filtering from scratch
FILTER_LESS_RESTRICTIVE, // existing filtered items will certainly pass this filter
FILTER_MORE_RESTRICTIVE // if you didn't pass the previous filter, you definitely won't pass this one
- } EFilterBehavior;
+ };
+
+ enum EFilterType
+ {
+ FILTERTYPE_NONE = 0,
+ FILTERTYPE_OBJECT = 1, // normal default search-by-object-type
+ FILTERTYPE_CATEGORY = 2, // search by folder type
+ FILTERTYPE_UUID = 4, // find the object with UUID and any links to it
+ FILTERTYPE_DATE = 8 // search by date range
+ };
+ // REFACTOR: Change this to an enum.
static const U32 SO_DATE = 1;
static const U32 SO_FOLDERS_BY_NAME = 2;
static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
@@ -64,89 +73,128 @@ public:
LLInventoryFilter(const std::string& name);
virtual ~LLInventoryFilter();
- void setFilterTypes(U64 types, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type
- U32 getFilterTypes() const { return mFilterOps.mFilterTypes; }
-
- void setFilterSubString(const std::string& string);
- const std::string getFilterSubString(BOOL trim = FALSE);
-
- void setFilterPermissions(PermissionMask perms);
- PermissionMask getFilterPermissions() const { return mFilterOps.mPermissions; }
-
- void setDateRange(time_t min_date, time_t max_date);
- void setDateRangeLastLogoff(BOOL sl);
- time_t getMinDate() const { return mFilterOps.mMinDate; }
- time_t getMaxDate() const { return mFilterOps.mMaxDate; }
-
- void setHoursAgo(U32 hours);
- U32 getHoursAgo() const { return mFilterOps.mHoursAgo; }
-
- void setShowFolderState( EFolderShow state);
- EFolderShow getShowFolderState() { return mFilterOps.mShowFolderState; }
-
- void setSortOrder(U32 order);
- U32 getSortOrder() { return mOrder; }
-
- BOOL check(LLFolderViewItem* item);
+ // +-------------------------------------------------------------------+
+ // + Parameters
+ // +-------------------------------------------------------------------+
+ void setFilterObjectTypes(U64 types);
+ U32 getFilterObjectTypes() const;
+ BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
+ void setFilterCategoryTypes(U64 types);
+ void setFilterUUID(const LLUUID &object_id);
+
+ void setFilterSubString(const std::string& string);
+ const std::string& getFilterSubString(BOOL trim = FALSE) const;
+ BOOL hasFilterString() const;
+
+ void setFilterPermissions(PermissionMask perms);
+ PermissionMask getFilterPermissions() const;
+
+ void setDateRange(time_t min_date, time_t max_date);
+ void setDateRangeLastLogoff(BOOL sl);
+ time_t getMinDate() const;
+ time_t getMaxDate() const;
+
+ void setHoursAgo(U32 hours);
+ U32 getHoursAgo() const;
+
+ // +-------------------------------------------------------------------+
+ // + Execution And Results
+ // +-------------------------------------------------------------------+
+ BOOL check(const LLFolderViewItem* item);
+ BOOL checkAgainstFilterType(const LLFolderViewItem* item);
std::string::size_type getStringMatchOffset() const;
- BOOL isActive();
- BOOL isNotDefault();
- BOOL isModified();
- BOOL isModifiedAndClear();
- BOOL isSinceLogoff();
- bool hasFilterString() { return mFilterSubString.size() > 0; }
- void clearModified() { mModified = FALSE; mFilterBehavior = FILTER_NONE; }
- const std::string getName() const { return mName; }
- std::string getFilterText();
- void setFilterCount(S32 count) { mFilterCount = count; }
- S32 getFilterCount() { return mFilterCount; }
- void decrementFilterCount() { mFilterCount--; }
+ // +-------------------------------------------------------------------+
+ // + Presentation
+ // +-------------------------------------------------------------------+
+ void setShowFolderState( EFolderShow state);
+ EFolderShow getShowFolderState() const;
+
+ void setSortOrder(U32 order);
+ U32 getSortOrder() const;
+
+ void setEmptyLookupMessage(const std::string& message);
+ const std::string& getEmptyLookupMessage() const;
+
+ // +-------------------------------------------------------------------+
+ // + Status
+ // +-------------------------------------------------------------------+
+ BOOL isActive() const;
+ BOOL isModified() const;
+ BOOL isModifiedAndClear();
+ BOOL isSinceLogoff() const;
+ void clearModified();
+ const std::string& getName() const;
+ const std::string& getFilterText();
+ //RN: this is public to allow system to externally force a global refilter
+ void setModified(EFilterBehavior behavior = FILTER_RESTART);
+
+ // +-------------------------------------------------------------------+
+ // + Count
+ // +-------------------------------------------------------------------+
+ void setFilterCount(S32 count);
+ S32 getFilterCount() const;
+ void decrementFilterCount();
+
+ // +-------------------------------------------------------------------+
+ // + Default
+ // +-------------------------------------------------------------------+
+ BOOL isNotDefault() const;
+ void markDefault();
+ void resetDefault();
+
+ // +-------------------------------------------------------------------+
+ // + Generation
+ // +-------------------------------------------------------------------+
+ S32 getCurrentGeneration() const;
+ S32 getMinRequiredGeneration() const;
+ S32 getMustPassGeneration() const;
+
+ // +-------------------------------------------------------------------+
+ // + Conversion
+ // +-------------------------------------------------------------------+
+ void toLLSD(LLSD& data) const;
+ void fromLLSD(LLSD& data);
- void markDefault();
- void resetDefault();
+private:
+ struct FilterOps
+ {
+ FilterOps();
+ U32 mFilterTypes;
- BOOL isFilterWith(LLInventoryType::EType t);
+ U64 mFilterObjectTypes; // For _OBJECT
+ U64 mFilterCategoryTypes; // For _CATEGORY
+ LLUUID mFilterUUID; // for UUID
- S32 getCurrentGeneration() const { return mFilterGeneration; }
- S32 getMinRequiredGeneration() const { return mMinRequiredGeneration; }
- S32 getMustPassGeneration() const { return mMustPassGeneration; }
+ time_t mMinDate;
+ time_t mMaxDate;
+ U32 mHoursAgo;
+ EFolderShow mShowFolderState;
+ PermissionMask mPermissions;
+ };
- //RN: this is public to allow system to externally force a global refilter
- void setModified(EFilterBehavior behavior = FILTER_RESTART);
+ U32 mOrder;
+ U32 mLastLogoff;
- void toLLSD(LLSD& data);
- void fromLLSD(LLSD& data);
+ FilterOps mFilterOps;
+ FilterOps mDefaultFilterOps;
-protected:
- struct filter_ops
- {
- U64 mFilterTypes;
- BOOL mFilterForCategories;
- time_t mMinDate;
- time_t mMaxDate;
- U32 mHoursAgo;
- EFolderShow mShowFolderState;
- PermissionMask mPermissions;
- };
- filter_ops mFilterOps;
- filter_ops mDefaultFilterOps;
std::string::size_type mSubStringMatchOffset;
- std::string mFilterSubString;
- U32 mOrder;
- const std::string mName;
- S32 mFilterGeneration;
- S32 mMustPassGeneration;
- S32 mMinRequiredGeneration;
- S32 mFilterCount;
- S32 mNextFilterGeneration;
- EFilterBehavior mFilterBehavior;
+ std::string mFilterSubString;
+ const std::string mName;
-private:
- U32 mLastLogoff;
- BOOL mModified;
- BOOL mNeedTextRebuild;
- std::string mFilterText;
+ S32 mFilterGeneration;
+ S32 mMustPassGeneration;
+ S32 mMinRequiredGeneration;
+ S32 mNextFilterGeneration;
+
+ S32 mFilterCount;
+ EFilterBehavior mFilterBehavior;
+
+ BOOL mModified;
+ BOOL mNeedTextRebuild;
+ std::string mFilterText;
+ std::string mEmptyLookupMessage;
};
#endif
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
new file mode 100644
index 0000000000..3553137f53
--- /dev/null
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -0,0 +1,373 @@
+/**
+ * @file llfloaterinventory.cpp
+ * @brief Implementation of the inventory view and associated stuff.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <utility> // for std::pair<>
+
+#include "llinventoryfunctions.h"
+
+// library includes
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llcallingcard.h"
+#include "llfloaterreg.h"
+#include "llsdserialize.h"
+#include "llfiltereditor.h"
+#include "llspinctrl.h"
+#include "llui.h"
+#include "message.h"
+
+// newview includes
+#include "llappearancemgr.h"
+#include "llappviewer.h"
+//#include "llfirstuse.h"
+#include "llfloatercustomize.h"
+#include "llfocusmgr.h"
+#include "llfolderview.h"
+#include "llgesturemgr.h"
+#include "lliconctrl.h"
+#include "llimview.h"
+#include "llinventorybridge.h"
+#include "llinventoryclipboard.h"
+#include "llinventorymodel.h"
+#include "llinventorypanel.h"
+#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewnotecard.h"
+#include "llpreviewscript.h"
+#include "llpreviewsound.h"
+#include "llpreviewtexture.h"
+#include "llresmgr.h"
+#include "llscrollbar.h"
+#include "llscrollcontainer.h"
+#include "llselectmgr.h"
+#include "lltabcontainer.h"
+#include "lltooldraganddrop.h"
+#include "lluictrlfactory.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
+
+BOOL LLInventoryState::sWearNewClothing = FALSE;
+LLUUID LLInventoryState::sWearNewClothingTransactionID;
+
+void LLSaveFolderState::setApply(BOOL apply)
+{
+ mApply = apply;
+ // before generating new list of open folders, clear the old one
+ if(!apply)
+ {
+ clearOpenFolders();
+ }
+}
+
+void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
+ if(mApply)
+ {
+ // we're applying the open state
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+ if(!bridge) return;
+ LLUUID id(bridge->getUUID());
+ if(mOpenFolders.find(id) != mOpenFolders.end())
+ {
+ folder->setOpen(TRUE);
+ }
+ else
+ {
+ // keep selected filter in its current state, this is less jarring to user
+ if (!folder->isSelected())
+ {
+ folder->setOpen(FALSE);
+ }
+ }
+ }
+ else
+ {
+ // we're recording state at this point
+ if(folder->isOpen())
+ {
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+ if(!bridge) return;
+ mOpenFolders.insert(bridge->getUUID());
+ }
+ }
+}
+
+void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
+{
+ if (item->getFiltered())
+ {
+ item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+}
+
+void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getFiltered() && folder->getParentFolder())
+ {
+ folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+ // if this folder didn't pass the filter, and none of its descendants did
+ else if (!folder->getFiltered() && !folder->hasFilteredDescendants())
+ {
+ folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
+ }
+}
+
+void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
+{
+ if (item->getFiltered() && !mItemSelected)
+ {
+ item->getRoot()->setSelection(item, FALSE, FALSE);
+ if (item->getParentFolder())
+ {
+ item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+ item->getRoot()->scrollToShowSelection();
+ mItemSelected = TRUE;
+ }
+}
+
+void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getFiltered() && !mItemSelected)
+ {
+ folder->getRoot()->setSelection(folder, FALSE, FALSE);
+ if (folder->getParentFolder())
+ {
+ folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+ folder->getRoot()->scrollToShowSelection();
+ mItemSelected = TRUE;
+ }
+}
+
+void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item)
+{
+ if (item->getParentFolder() && item->isSelected())
+ {
+ item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+}
+
+void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getParentFolder() && folder->isSelected())
+ {
+ folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+ }
+}
+
+static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point)
+{
+ const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point);
+ switch(wearable_type)
+ {
+ case WT_SHAPE:
+ idx = BODYPART_SHAPE_ICON_NAME;
+ break;
+ case WT_SKIN:
+ idx = BODYPART_SKIN_ICON_NAME;
+ break;
+ case WT_HAIR:
+ idx = BODYPART_HAIR_ICON_NAME;
+ break;
+ case WT_EYES:
+ idx = BODYPART_EYES_ICON_NAME;
+ break;
+ case WT_SHIRT:
+ idx = CLOTHING_SHIRT_ICON_NAME;
+ break;
+ case WT_PANTS:
+ idx = CLOTHING_PANTS_ICON_NAME;
+ break;
+ case WT_SHOES:
+ idx = CLOTHING_SHOES_ICON_NAME;
+ break;
+ case WT_SOCKS:
+ idx = CLOTHING_SOCKS_ICON_NAME;
+ break;
+ case WT_JACKET:
+ idx = CLOTHING_JACKET_ICON_NAME;
+ break;
+ case WT_GLOVES:
+ idx = CLOTHING_GLOVES_ICON_NAME;
+ break;
+ case WT_UNDERSHIRT:
+ idx = CLOTHING_UNDERSHIRT_ICON_NAME;
+ break;
+ case WT_UNDERPANTS:
+ idx = CLOTHING_UNDERPANTS_ICON_NAME;
+ break;
+ case WT_SKIRT:
+ idx = CLOTHING_SKIRT_ICON_NAME;
+ break;
+ case WT_ALPHA:
+ idx = CLOTHING_ALPHA_ICON_NAME;
+ break;
+ case WT_TATTOO:
+ idx = CLOTHING_TATTOO_ICON_NAME;
+ break;
+ default:
+ break;
+ }
+}
+
+
+const std::string& get_item_icon_name(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi )
+{
+ EInventoryIcon idx = OBJECT_ICON_NAME;
+ if ( item_is_multi )
+ {
+ idx = OBJECT_MULTI_ICON_NAME;
+ }
+
+ switch(asset_type)
+ {
+ case LLAssetType::AT_TEXTURE:
+ if(LLInventoryType::IT_SNAPSHOT == inventory_type)
+ {
+ idx = SNAPSHOT_ICON_NAME;
+ }
+ else
+ {
+ idx = TEXTURE_ICON_NAME;
+ }
+ break;
+
+ case LLAssetType::AT_SOUND:
+ idx = SOUND_ICON_NAME;
+ break;
+ case LLAssetType::AT_CALLINGCARD:
+ if(attachment_point!= 0)
+ {
+ idx = CALLINGCARD_ONLINE_ICON_NAME;
+ }
+ else
+ {
+ idx = CALLINGCARD_OFFLINE_ICON_NAME;
+ }
+ break;
+ case LLAssetType::AT_LANDMARK:
+ if(attachment_point!= 0)
+ {
+ idx = LANDMARK_VISITED_ICON_NAME;
+ }
+ else
+ {
+ idx = LANDMARK_ICON_NAME;
+ }
+ break;
+ case LLAssetType::AT_SCRIPT:
+ case LLAssetType::AT_LSL_TEXT:
+ case LLAssetType::AT_LSL_BYTECODE:
+ idx = SCRIPT_ICON_NAME;
+ break;
+ case LLAssetType::AT_CLOTHING:
+ idx = CLOTHING_ICON_NAME;
+ assign_clothing_bodypart_icon(idx, attachment_point);
+ break;
+ case LLAssetType::AT_BODYPART:
+ idx = BODYPART_ICON_NAME;
+ assign_clothing_bodypart_icon(idx, attachment_point);
+ break;
+ case LLAssetType::AT_NOTECARD:
+ idx = NOTECARD_ICON_NAME;
+ break;
+ case LLAssetType::AT_ANIMATION:
+ idx = ANIMATION_ICON_NAME;
+ break;
+ case LLAssetType::AT_GESTURE:
+ idx = GESTURE_ICON_NAME;
+ break;
+ case LLAssetType::AT_LINK:
+ idx = LINKITEM_ICON_NAME;
+ break;
+ case LLAssetType::AT_LINK_FOLDER:
+ idx = LINKFOLDER_ICON_NAME;
+ break;
+ default:
+ break;
+ }
+
+ return ICON_NAME[idx];
+}
+
+LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi)
+{
+ const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
+ return LLUI::getUIImage(icon_name);
+}
+
+BOOL get_is_item_worn(const LLUUID& id)
+{
+ const LLViewerInventoryItem* item = gInventory.getItem(id);
+ if (!item)
+ return FALSE;
+
+ switch(item->getType())
+ {
+ case LLAssetType::AT_OBJECT:
+ {
+ const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
+ if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ }
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ if(gAgentWearables.isWearingItem(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ case LLAssetType::AT_GESTURE:
+ if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
new file mode 100644
index 0000000000..968db84819
--- /dev/null
+++ b/indra/newview/llinventoryfunctions.h
@@ -0,0 +1,118 @@
+/**
+ * @file llinventoryfunctions.h
+ * @brief Miscellaneous inventory-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYFUNCTIONS_H
+#define LL_LLINVENTORYFUNCTIONS_H
+
+#include "llinventorytype.h"
+#include "llfolderview.h"
+#include "llfolderviewitem.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// This is a collection of miscellaneous functions and classes
+// that don't fit cleanly into any other class header. Eventually,
+// we should figure out where to put these functions so that we can
+// get rid of this generic file.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryState
+{
+public:
+ // HACK: Until we can route this info through the instant message hierarchy
+ static BOOL sWearNewClothing;
+ static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction
+};
+
+class LLSelectFirstFilteredItem : public LLFolderViewFunctor
+{
+public:
+ LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
+ virtual ~LLSelectFirstFilteredItem() {}
+ virtual void doFolder(LLFolderViewFolder* folder);
+ virtual void doItem(LLFolderViewItem* item);
+ BOOL wasItemSelected() { return mItemSelected; }
+protected:
+ BOOL mItemSelected;
+};
+
+class LLOpenFilteredFolders : public LLFolderViewFunctor
+{
+public:
+ LLOpenFilteredFolders() {}
+ virtual ~LLOpenFilteredFolders() {}
+ virtual void doFolder(LLFolderViewFolder* folder);
+ virtual void doItem(LLFolderViewItem* item);
+};
+
+class LLSaveFolderState : public LLFolderViewFunctor
+{
+public:
+ LLSaveFolderState() : mApply(FALSE) {}
+ virtual ~LLSaveFolderState() {}
+ virtual void doFolder(LLFolderViewFolder* folder);
+ virtual void doItem(LLFolderViewItem* item) {}
+ void setApply(BOOL apply);
+ void clearOpenFolders() { mOpenFolders.clear(); }
+protected:
+ std::set<LLUUID> mOpenFolders;
+ BOOL mApply;
+};
+
+class LLOpenFoldersWithSelection : public LLFolderViewFunctor
+{
+public:
+ LLOpenFoldersWithSelection() {}
+ virtual ~LLOpenFoldersWithSelection() {}
+ virtual void doFolder(LLFolderViewFolder* folder);
+ virtual void doItem(LLFolderViewItem* item);
+};
+
+const std::string& get_item_icon_name(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
+
+LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
+
+// Is this item or its baseitem is worn, attached, etc...
+BOOL get_is_item_worn(const LLUUID& id);
+
+#endif // LL_LLINVENTORYFUNCTIONS_H
+
+
+
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 1d7cbde0d5..326f2a5577 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -31,37 +31,26 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llinventorymodel.h"
-#include "llassetstorage.h"
-#include "llcrc.h"
-#include "lldir.h"
-#include "llsys.h"
-#include "llxfermanager.h"
-#include "message.h"
-
#include "llagent.h"
#include "llagentwearables.h"
-#include "llfloater.h"
-#include "llfocusmgr.h"
+#include "llinventorypanel.h"
#include "llinventorybridge.h"
-#include "llfloaterinventory.h"
-#include "llviewerinventory.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llnotificationsutil.h"
+#include "llwindow.h"
+#include "llviewercontrol.h"
+#include "llpreview.h"
#include "llviewermessage.h"
+#include "llviewerfoldertype.h"
#include "llviewerwindow.h"
-#include "llviewerregion.h"
#include "llappviewer.h"
-#include "lldbstrings.h"
-#include "llviewerstats.h"
-#include "llmutelist.h"
-#include "llnotifications.h"
+#include "llviewerregion.h"
#include "llcallbacklist.h"
-#include "llpreview.h"
-#include "llviewercontrol.h"
#include "llvoavatarself.h"
-#include "llsdutil.h"
-#include <deque>
//#define DIFF_INVENTORY_FILES
#ifdef DIFF_INVENTORY_FILES
@@ -70,13 +59,19 @@
BOOL LLInventoryModel::sBackgroundFetchActive = FALSE;
BOOL LLInventoryModel::sAllFoldersFetched = FALSE;
-BOOL LLInventoryModel::sFullFetchStarted = FALSE;
+BOOL LLInventoryModel::sMyInventoryFetchStarted = FALSE;
+BOOL LLInventoryModel::sLibraryFetchStarted = FALSE;
S32 LLInventoryModel::sNumFetchRetries = 0;
F32 LLInventoryModel::sMinTimeBetweenFetches = 0.3f;
F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
LLFrameTimer LLInventoryModel::sFetchTimer;
S16 LLInventoryModel::sBulkFetchCount = 0;
+BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
+
+// Increment this if the inventory contents change in a non-backwards-compatible way.
+// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
+const S32 LLInventoryModel::sCurrentInvCacheVersion = 2;
// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue
static std::deque<LLUUID> sFetchQueue;
@@ -169,6 +164,7 @@ LLInventoryModel::LLInventoryModel()
mRootFolderID(),
mLibraryRootFolderID(),
mLibraryOwnerID(),
+ mIsNotifyObservers(FALSE),
mIsAgentInvUsable(false)
{
}
@@ -198,6 +194,8 @@ void LLInventoryModel::cleanupInventory()
BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id,
const LLUUID& cat_id) const
{
+ if (obj_id == cat_id) return TRUE;
+
const LLInventoryObject* obj = getObject(obj_id);
while(obj)
{
@@ -217,6 +215,29 @@ BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id,
return FALSE;
}
+const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(const LLUUID& obj_id) const
+{
+ const LLInventoryObject* obj = getObject(obj_id);
+
+ // Search up the parent chain until we get to root or an acceptable folder.
+ // This assumes there are no cycles in the tree else we'll get a hang.
+ LLUUID parent_id = obj->getParentUUID();
+ while (!parent_id.isNull())
+ {
+ const LLViewerInventoryCategory *cat = getCategory(parent_id);
+ if (!cat) break;
+ const LLFolderType::EType folder_type = cat->getPreferredType();
+ if (folder_type != LLFolderType::FT_NONE &&
+ folder_type != LLFolderType::FT_ROOT_INVENTORY &&
+ !LLFolderType::lookupIsEnsembleType(folder_type))
+ {
+ return cat;
+ }
+ parent_id = cat->getParentUUID();
+ }
+ return NULL;
+}
+
// Get the object by id. Returns NULL if not found.
LLInventoryObject* LLInventoryModel::getObject(const LLUUID& id) const
{
@@ -314,10 +335,10 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
// specifies 'type' as what it defaults to containing. The category is
// not necessarily only for that type. *NOTE: This will create a new
// inventory category on the fly if one does not exist.
-LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library)
{
- const LLUUID &rv = findCatUUID(t);
- if(rv.isNull() && isInventoryUsable() && create_folder)
+ const LLUUID &rv = findCatUUID(t, find_in_library);
+ if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
{
const LLUUID &root_id = gInventory.getRootFolderID();
if(root_id.notNull())
@@ -330,10 +351,10 @@ LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool crea
// Internal method which looks for a category with the specified
// preferred type. Returns LLUUID::null if not found.
-const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) const
+const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const
{
- const LLUUID &root_id = gInventory.getRootFolderID();
- if(LLAssetType::AT_CATEGORY == preferred_type)
+ const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID();
+ if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
{
return root_id;
}
@@ -361,7 +382,7 @@ const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) c
// version will take care of details like what the name should be
// based on preferred type. Returns the UUID of the new category.
LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
- LLAssetType::EType preferred_type,
+ LLFolderType::EType preferred_type,
const std::string& pname)
{
LLUUID id;
@@ -371,9 +392,9 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
return id;
}
- if(preferred_type == LLAssetType::AT_SIMSTATE)
+ if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup())
{
- lldebugs << "Attempt to create simstate category." << llendl;
+ lldebugs << "Attempt to create undefined category." << llendl;
return id;
}
@@ -385,7 +406,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
}
else
{
- name.assign(LLAssetType::lookupCategoryName(preferred_type));
+ name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
}
// Add the category to the internal representation
@@ -449,7 +470,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
// Start with categories
if(!include_trash)
{
- const LLUUID trash_id = findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
if(trash_id.notNull() && (trash_id == id))
return;
}
@@ -483,7 +504,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)
{
LLViewerInventoryCategory *linked_cat = item->getLinkedCategory();
- if (linked_cat && linked_cat->getPreferredType() != LLAssetType::AT_OUTFIT)
+ if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
// BAP - was
// LLAssetType::lookupIsEnsembleCategoryType(linked_cat->getPreferredType()))
// Change back once ensemble typing is in place.
@@ -516,7 +537,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
}
}
-void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
+void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask)
{
const LLInventoryObject *obj = getObject(object_id);
if (!obj || obj->getIsLinkType())
@@ -530,13 +551,16 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
item_array,
LLInventoryModel::INCLUDE_TRASH,
is_linked_item_match);
-
+ if (cat_array.empty() && item_array.empty())
+ {
+ return;
+ }
for (LLInventoryModel::cat_array_t::iterator cat_iter = cat_array.begin();
cat_iter != cat_array.end();
cat_iter++)
{
LLViewerInventoryCategory *linked_cat = (*cat_iter);
- addChangedMask(LLInventoryObserver::LABEL, linked_cat->getUUID());
+ addChangedMask(mask, linked_cat->getUUID());
};
for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
@@ -544,9 +568,8 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
iter++)
{
LLViewerInventoryItem *linked_item = (*iter);
- addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID());
+ addChangedMask(mask, linked_item->getUUID());
};
- notifyObservers();
}
const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const
@@ -632,6 +655,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
new_item = old_item;
LLUUID old_parent_id = old_item->getParentUUID();
LLUUID new_parent_id = item->getParentUUID();
+
if(old_parent_id != new_parent_id)
{
// need to update the parent-child tree
@@ -663,7 +687,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
if(item->getParentUUID().isNull())
{
- LLUUID category_id = findCategoryUUIDForType(new_item->getType());
+ const LLUUID category_id = findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(new_item->getType()));
new_item->setParent(category_id);
item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id);
if( item_array )
@@ -687,7 +711,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
LLUUID parent_id = item->getParentUUID();
if(parent_id == CATEGORIZE_LOST_AND_FOUND_ID)
{
- parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
new_item->setParent(parent_id);
}
item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id);
@@ -700,7 +724,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
// Whoops! No such parent, make one.
llinfos << "Lost item: " << new_item->getUUID() << " - "
<< new_item->getName() << llendl;
- parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
new_item->setParent(parent_id);
item_array = get_ptr_in_map(mParentChildItemTree, parent_id);
if(item_array)
@@ -735,6 +759,10 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
gCacheName->get(id, FALSE, boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3));
}
}
+ else if (new_item->getType() == LLAssetType::AT_GESTURE)
+ {
+ mask |= LLInventoryObserver::GESTURE;
+ }
addChangedMask(mask, new_item->getUUID());
return mask;
}
@@ -874,50 +902,54 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
// Delete a particular inventory object by ID.
void LLInventoryModel::deleteObject(const LLUUID& id)
{
- purgeLinkedObjects(id);
lldebugs << "LLInventoryModel::deleteObject()" << llendl;
LLPointer<LLInventoryObject> obj = getObject(id);
- if(obj)
+ if (!obj)
{
- lldebugs << "Deleting inventory object " << id << llendl;
- mLastItem = NULL;
- LLUUID parent_id = obj->getParentUUID();
- mCategoryMap.erase(id);
- mItemMap.erase(id);
- //mInventory.erase(id);
- item_array_t* item_list = getUnlockedItemArray(parent_id);
- if(item_list)
- {
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)((LLInventoryObject*)obj);
- item_list->removeObj(item);
- }
- cat_array_t* cat_list = getUnlockedCatArray(parent_id);
- if(cat_list)
- {
- LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
- cat_list->removeObj(cat);
- }
- item_list = getUnlockedItemArray(id);
- if(item_list)
- {
- delete item_list;
- mParentChildItemTree.erase(id);
- }
- cat_list = getUnlockedCatArray(id);
- if(cat_list)
- {
- delete cat_list;
- mParentChildCategoryTree.erase(id);
- }
- addChangedMask(LLInventoryObserver::REMOVE, id);
- obj = NULL; // delete obj
+ llwarns << "Deleting non-existent object [ id: " << id << " ] " << llendl;
+ return;
+ }
+
+ lldebugs << "Deleting inventory object " << id << llendl;
+ mLastItem = NULL;
+ LLUUID parent_id = obj->getParentUUID();
+ mCategoryMap.erase(id);
+ mItemMap.erase(id);
+ //mInventory.erase(id);
+ item_array_t* item_list = getUnlockedItemArray(parent_id);
+ if(item_list)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)((LLInventoryObject*)obj);
+ item_list->removeObj(item);
+ }
+ cat_array_t* cat_list = getUnlockedCatArray(parent_id);
+ if(cat_list)
+ {
+ LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
+ cat_list->removeObj(cat);
+ }
+ item_list = getUnlockedItemArray(id);
+ if(item_list)
+ {
+ delete item_list;
+ mParentChildItemTree.erase(id);
+ }
+ cat_list = getUnlockedCatArray(id);
+ if(cat_list)
+ {
+ delete cat_list;
+ mParentChildCategoryTree.erase(id);
}
+ addChangedMask(LLInventoryObserver::REMOVE, id);
+ obj = NULL; // delete obj
+ updateLinkedObjectsFromPurge(id);
+ gInventory.notifyObservers();
}
// Delete a particular inventory item by ID, and remove it from the server.
void LLInventoryModel::purgeObject(const LLUUID &id)
{
- lldebugs << "LLInventoryModel::purgeObject()" << llendl;
+ lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl;
LLPointer<LLInventoryObject> obj = getObject(id);
if(obj)
{
@@ -927,26 +959,23 @@ void LLInventoryModel::purgeObject(const LLUUID &id)
}
}
-void LLInventoryModel::purgeLinkedObjects(const LLUUID &id)
+void LLInventoryModel::updateLinkedObjectsFromPurge(const LLUUID &baseobj_id)
{
- LLInventoryObject* objectp = getObject(id);
- if (!objectp) return;
-
- if (objectp->getIsLinkType())
- {
- return;
- }
+ LLInventoryModel::item_array_t item_array = collectLinkedItems(baseobj_id);
- LLInventoryModel::item_array_t item_array = collectLinkedItems(id);
-
- for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
+ // REBUILD is expensive, so clear the current change list first else
+ // everything else on the changelist will also get rebuilt.
+ gInventory.notifyObservers();
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
iter != item_array.end();
iter++)
{
- LLViewerInventoryItem *linked_item = (*iter);
- if (linked_item->getUUID() == id) continue;
- purgeObject(linked_item->getUUID());
+ const LLViewerInventoryItem *linked_item = (*iter);
+ const LLUUID &item_id = linked_item->getUUID();
+ if (item_id == baseobj_id) continue;
+ addChangedMask(LLInventoryObserver::REBUILD, item_id);
}
+ gInventory.notifyObservers();
}
// This is a method which collects the descendents of the id
@@ -1120,12 +1149,29 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const
return mObservers.find(observer) != mObservers.end();
}
-// Call this method when it's time to update everyone on a new state,
-// by default, the inventory model will not update observers
-// automatically.
+void LLInventoryModel::idleNotifyObservers()
+{
+ if (mModifyMask == LLInventoryObserver::NONE && (mChangedItemIDs.size() == 0))
+ {
+ return;
+ }
+ notifyObservers("");
+}
+
+// Call this method when it's time to update everyone on a new state.
// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
void LLInventoryModel::notifyObservers(const std::string service_name)
{
+ if (mIsNotifyObservers)
+ {
+ // Within notifyObservers, something called notifyObservers
+ // again. This type of recursion is unsafe because it causes items to be
+ // processed twice, and this can easily lead to infinite loops.
+ llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl;
+ return;
+ }
+
+ mIsNotifyObservers = TRUE;
for (observer_list_t::iterator iter = mObservers.begin();
iter != mObservers.end(); )
{
@@ -1147,12 +1193,21 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
mModifyMask = LLInventoryObserver::NONE;
mChangedItemIDs.clear();
+ mIsNotifyObservers = FALSE;
}
// store flag for change
// and id of object change applies to
void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
{
+ if (mIsNotifyObservers)
+ {
+ // Something marked an item for change within a call to notifyObservers
+ // (which is in the process of processing the list of items marked for change).
+ // This means the change may fail to be processed.
+ llwarns << "Adding changed mask within notify observers! Change will likely be lost." << llendl;
+ }
+
mModifyMask |= mask;
if (referent.notNull())
{
@@ -1163,7 +1218,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
// not sure what else might need to be accounted for this.
if (mModifyMask & LLInventoryObserver::LABEL)
{
- updateLinkedItems(referent);
+ addChangedMaskForLinks(referent, LLInventoryObserver::LABEL);
}
}
@@ -1182,7 +1237,7 @@ void LLInventoryModel::mock(const LLUUID& root_id)
root_id,
LLUUID::null,
LLAssetType::AT_CATEGORY,
- LLAssetType::lookupCategoryName(LLAssetType::AT_ROOT_CATEGORY),
+ LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY),
gAgent.getID());
addCategory(cat);
gInventory.buildParentChildMap();
@@ -1264,6 +1319,11 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
{
+ if(folder_id.isNull())
+ {
+ llwarns << "Calling fetch descendents on NULL folder id!" << llendl;
+ return false;
+ }
LLViewerInventoryCategory* cat = getCategory(folder_id);
if(!cat)
{
@@ -1288,15 +1348,14 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
//Initialize statics.
bool LLInventoryModel::isBulkFetchProcessingComplete()
{
- return ( (sFetchQueue.empty()
- && sBulkFetchCount<=0) ? TRUE : FALSE ) ;
+ return sFetchQueue.empty() && sBulkFetchCount<=0;
}
-class fetchDescendentsResponder: public LLHTTPClient::Responder
+class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
{
public:
- fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
- //fetchDescendentsResponder() {};
+ LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
+ //LLInventoryModelFetchDescendentsResponder() {};
void result(const LLSD& content);
void error(U32 status, const std::string& reason);
public:
@@ -1306,7 +1365,7 @@ class fetchDescendentsResponder: public LLHTTPClient::Responder
};
//If we get back a normal response, handle it here
-void fetchDescendentsResponder::result(const LLSD& content)
+void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
{
if (content.has("folders"))
{
@@ -1340,7 +1399,7 @@ void fetchDescendentsResponder::result(const LLSD& content)
item_it != folder_sd["items"].endArray();
++item_it)
{
- LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
if (lost_uuid.notNull())
{
LLSD item = *item_it;
@@ -1373,7 +1432,8 @@ void fetchDescendentsResponder::result(const LLSD& content)
LLSD category = *category_it;
tcategory->fromLLSD(category);
- if (LLInventoryModel::sFullFetchStarted)
+ if (LLInventoryModel::sMyInventoryFetchStarted ||
+ LLInventoryModel::sLibraryFetchStarted)
{
sFetchQueue.push_back(tcategory->getUUID());
}
@@ -1425,20 +1485,16 @@ void fetchDescendentsResponder::result(const LLSD& content)
if (LLInventoryModel::isBulkFetchProcessingComplete())
{
llinfos << "Inventory fetch completed" << llendl;
- if (LLInventoryModel::sFullFetchStarted)
- {
- LLInventoryModel::sAllFoldersFetched = TRUE;
- }
- LLInventoryModel::stopBackgroundFetch();
+ LLInventoryModel::setAllFoldersFetched();
}
gInventory.notifyObservers("fetchDescendents");
}
//If we get back an error (not found, etc...), handle it here
-void fetchDescendentsResponder::error(U32 status, const std::string& reason)
+void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason)
{
- llinfos << "fetchDescendentsResponder::error "
+ llinfos << "LLInventoryModelFetchDescendentsResponder::error "
<< status << ": " << reason << llendl;
LLInventoryModel::incrBulkFetch(-1);
@@ -1458,11 +1514,7 @@ void fetchDescendentsResponder::error(U32 status, const std::string& reason)
{
if (LLInventoryModel::isBulkFetchProcessingComplete())
{
- if (LLInventoryModel::sFullFetchStarted)
- {
- LLInventoryModel::sAllFoldersFetched = TRUE;
- }
- LLInventoryModel::stopBackgroundFetch();
+ LLInventoryModel::setAllFoldersFetched();
}
}
gInventory.notifyObservers("fetchDescendents");
@@ -1530,7 +1582,8 @@ void LLInventoryModel::bulkFetch(std::string url)
body["folders"].append(folder_sd);
folder_count++;
}
- if (sFullFetchStarted)
+ if (sMyInventoryFetchStarted ||
+ sLibraryFetchStarted)
{ //Already have this folder but append child folders to list.
// add all children to queue
parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
@@ -1555,29 +1608,73 @@ void LLInventoryModel::bulkFetch(std::string url)
sBulkFetchCount++;
if (body["folders"].size())
{
- LLHTTPClient::post(url, body, new fetchDescendentsResponder(body),300.0);
+ LLHTTPClient::post(url, body, new LLInventoryModelFetchDescendentsResponder(body),300.0);
}
if (body_lib["folders"].size())
{
std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
- LLHTTPClient::post(url_lib, body_lib, new fetchDescendentsResponder(body_lib),300.0);
+ LLHTTPClient::post(url_lib, body_lib, new LLInventoryModelFetchDescendentsResponder(body_lib),300.0);
}
sFetchTimer.reset();
}
else if (isBulkFetchProcessingComplete())
{
- if (sFullFetchStarted)
- {
- sAllFoldersFetched = TRUE;
- }
- stopBackgroundFetch();
+ setAllFoldersFetched();
}
}
+bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id)
+{
+ for (std::deque<LLUUID>::iterator it = sFetchQueue.begin();
+ it != sFetchQueue.end(); ++it)
+ {
+ const LLUUID& fetch_id = *it;
+ if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
+ return false;
+ }
+ return true;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchStarted()
+{
+ return sLibraryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchCompleted()
+{
+ return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchInProgress()
+{
+ return libraryFetchStarted() && !libraryFetchCompleted();
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchStarted()
+{
+ return sMyInventoryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchCompleted()
+{
+ return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchInProgress()
+{
+ return myInventoryFetchStarted() && !myInventoryFetchCompleted();
+}
+
// static
bool LLInventoryModel::isEverythingFetched()
{
- return (sAllFoldersFetched ? true : false);
+ return sAllFoldersFetched;
}
//static
@@ -1586,7 +1683,6 @@ BOOL LLInventoryModel::backgroundFetchActive()
return sBackgroundFetchActive;
}
-//static
void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
{
if (!sAllFoldersFetched)
@@ -1594,13 +1690,18 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
sBackgroundFetchActive = TRUE;
if (cat_id.isNull())
{
- if (!sFullFetchStarted)
+ if (!sMyInventoryFetchStarted)
{
- sFullFetchStarted = TRUE;
- sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
+ sMyInventoryFetchStarted = TRUE;
sFetchQueue.push_back(gInventory.getRootFolderID());
gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
}
+ if (!sLibraryFetchStarted)
+ {
+ sLibraryFetchStarted = TRUE;
+ sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
+ gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
+ }
}
else
{
@@ -1610,6 +1711,14 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
sFetchQueue.push_front(cat_id);
gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
}
+ if (cat_id == gInventory.getLibraryRootFolderID())
+ {
+ sLibraryFetchStarted = TRUE;
+ }
+ if (cat_id == gInventory.getRootFolderID())
+ {
+ sMyInventoryFetchStarted = TRUE;
+ }
}
}
}
@@ -1631,10 +1740,20 @@ void LLInventoryModel::stopBackgroundFetch()
gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL);
sBulkFetchCount=0;
sMinTimeBetweenFetches=0.0f;
-// sFullFetchStarted=FALSE;
}
}
+// static
+void LLInventoryModel::setAllFoldersFetched()
+{
+ if (sMyInventoryFetchStarted &&
+ sLibraryFetchStarted)
+ {
+ sAllFoldersFetched = TRUE;
+ }
+ stopBackgroundFetch();
+}
+
//static
void LLInventoryModel::backgroundFetch(void*)
{
@@ -1653,11 +1772,8 @@ void LLInventoryModel::backgroundFetch(void*)
if (sFetchQueue.empty())
{
llinfos << "Inventory fetch completed" << llendl;
- if (sFullFetchStarted)
- {
- sAllFoldersFetched = TRUE;
- }
- stopBackgroundFetch();
+
+ setAllFoldersFetched();
return;
}
@@ -1820,17 +1936,28 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
void LLInventoryModel::addItem(LLViewerInventoryItem* item)
{
//llinfos << "LLInventoryModel::addItem()" << llendl;
+
+ llassert(item);
if(item)
{
+ // This can happen if assettype enums from llassettype.h ever change.
+ // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
+ // the AT_LINK enum changed from 23 to 24.
+ if ((item->getType() == LLAssetType::AT_NONE)
+ || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
+ {
+ llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
+ return;
+ }
+
// This condition means that we tried to add a link without the baseobj being in memory.
// The item will show up as a broken link.
if (item->getIsBrokenLink())
{
- llwarns << "Add link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
-// llassert_always(FALSE); // DO NOT MERGE THIS IN. This is an AVP debugging line. If this line triggers, it means that you just loaded in a broken link. Unless that happens because you actually deleted a baseobj without deleting the link, it's indicative of a serious problem (likely with your inventory) and should be diagnosed.
+ llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
}
+
mItemMap[item->getUUID()] = item;
- //mInventory[item->getUUID()] = item;
}
}
@@ -1878,21 +2005,23 @@ void LLInventoryModel::accountForUpdate(const LLCategoryUpdate& update) const
descendents_actual += update.mDescendentDelta;
cat->setDescendentCount(descendents_actual);
cat->setVersion(++version);
- llinfos << "accounted: '" << cat->getName() << "' "
- << version << " with " << descendents_actual
- << " descendents." << llendl;
+ lldebugs << "accounted: '" << cat->getName() << "' "
+ << version << " with " << descendents_actual
+ << " descendents." << llendl;
}
}
if(!accounted)
{
- lldebugs << "No accounting for: '" << cat->getName() << "' "
+ // Error condition, this means that the category did not register that
+ // it got new descendents (perhaps because it is still being loaded)
+ // which means its descendent count will be wrong.
+ llwarns << "Accounting failed for '" << cat->getName() << "' version:"
<< version << llendl;
}
}
else
{
- llwarns << "No category found for update " << update.mCategoryID
- << llendl;
+ llwarns << "No category found for update " << update.mCategoryID << llendl;
}
}
@@ -2047,11 +2176,11 @@ bool LLInventoryModel::loadSkeleton(
cat->setUUID(folder_id.asUUID());
cat->setParent(parent_id.asUUID());
- LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+ LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
LLSD type_default = (*it)["type_default"];
if(type_default.isDefined())
{
- preferred_type = (LLAssetType::EType)type_default.asInteger();
+ preferred_type = (LLFolderType::EType)type_default.asInteger();
}
cat->setPreferredType(preferred_type);
cat->setVersion(version.asInteger());
@@ -2098,7 +2227,8 @@ bool LLInventoryModel::loadSkeleton(
llinfos << "Unable to gunzip " << gzip_filename << llendl;
}
}
- if(loadFromFile(inventory_filename, categories, items))
+ bool is_cache_obsolete = false;
+ if(loadFromFile(inventory_filename, categories, items, is_cache_obsolete))
{
// We were able to find a cache of files. So, use what we
// found to generate a set of categories we should add. We
@@ -2155,7 +2285,7 @@ bool LLInventoryModel::loadSkeleton(
// Add all the items loaded which are parented to a
// category with a correctly cached parent
- count = items.count();
+ S32 bad_link_count = 0;
cat_map_t::iterator unparented = mCategoryMap.end();
for(item_array_t::const_iterator item_iter = items.begin();
item_iter != items.end();
@@ -2172,7 +2302,11 @@ bool LLInventoryModel::loadSkeleton(
// This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache.
if (item->getIsBrokenLink())
{
- llinfos << "Attempted to cached link item without baseobj present ( itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) " << llendl;
+ bad_link_count++;
+ lldebugs << "Attempted to add cached link item without baseobj present ( name: "
+ << item->getName() << " itemID: " << item->getUUID()
+ << " assetID: " << item->getAssetUUID()
+ << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl;
invalid_categories.insert(cit->second);
continue;
}
@@ -2182,6 +2316,12 @@ bool LLInventoryModel::loadSkeleton(
}
}
}
+ if (bad_link_count > 0)
+ {
+ llinfos << "Attempted to add " << bad_link_count
+ << " cached link items without baseobj present. "
+ << "The corresponding categories were invalidated." << llendl;
+ }
}
else
{
@@ -2233,6 +2373,12 @@ bool LLInventoryModel::loadSkeleton(
// clean up the gunzipped file.
LLFile::remove(inventory_filename);
}
+ if(is_cache_obsolete)
+ {
+ // If out of date, remove the gzipped file too.
+ llwarns << "Inv cache out of date, removing" << llendl;
+ LLFile::remove(gzip_filename);
+ }
categories.clear(); // will unref and delete entries
}
@@ -2398,12 +2544,12 @@ void LLInventoryModel::buildParentChildMap()
<< cat->getName() << llendl;
++lost;
// plop it into the lost & found.
- LLAssetType::EType pref = cat->getPreferredType();
- if(LLAssetType::AT_NONE == pref)
+ LLFolderType::EType pref = cat->getPreferredType();
+ if(LLFolderType::FT_NONE == pref)
{
- cat->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND));
+ cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
}
- else if(LLAssetType::AT_CATEGORY == pref)
+ else if(LLFolderType::FT_ROOT_INVENTORY == pref)
{
// it's the root
cat->setParent(LLUUID::null);
@@ -2430,6 +2576,10 @@ void LLInventoryModel::buildParentChildMap()
llwarns << "Found " << lost << " lost categories." << llendl;
}
+ const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) != LLUUID::null);
+ sFirstTimeInViewer2 = !COF_exists || gAgent.isFirstLogin();
+
+
// Now the items. We allocated in the last step, so now all we
// have to do is iterate over the items and put them in the right
// place.
@@ -2462,7 +2612,7 @@ void LLInventoryModel::buildParentChildMap()
++lost;
// plop it into the lost & found.
//
- item->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND));
+ item->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
// move it later using a special message to move items. If
// we update server here, the client might crash.
//item->updateServer();
@@ -2483,7 +2633,7 @@ void LLInventoryModel::buildParentChildMap()
llwarns << "Found " << lost << " lost items." << llendl;
LLMessageSystem* msg = gMessageSystem;
BOOL start_new_message = TRUE;
- LLUUID lnf = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+ const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it)
{
if(start_new_message)
@@ -2517,6 +2667,33 @@ void LLInventoryModel::buildParentChildMap()
cat_array_t* catsp = get_ptr_in_map(mParentChildCategoryTree, agent_inv_root_id);
if(catsp)
{
+ // *HACK - fix root inventory folder
+ // some accounts has pbroken inventory root folders
+
+ std::string name = "My Inventory";
+ LLUUID prev_root_id = mRootFolderID;
+ for (parent_cat_map_t::const_iterator it = mParentChildCategoryTree.begin(),
+ it_end = mParentChildCategoryTree.end(); it != it_end; ++it)
+ {
+ cat_array_t* cat_array = it->second;
+ for (cat_array_t::const_iterator cat_it = cat_array->begin(),
+ cat_it_end = cat_array->end(); cat_it != cat_it_end; ++cat_it)
+ {
+ LLPointer<LLViewerInventoryCategory> category = *cat_it;
+
+ if(category && category->getPreferredType() != LLFolderType::FT_ROOT_INVENTORY)
+ continue;
+ if ( category && 0 == LLStringUtil::compareInsensitive(name, category->getName()) )
+ {
+ if(category->getUUID()!=mRootFolderID)
+ {
+ LLUUID& new_inv_root_folder_id = const_cast<LLUUID&>(mRootFolderID);
+ new_inv_root_folder_id = category->getUUID();
+ }
+ }
+ }
+ }
+
// 'My Inventory',
// root of the agent's inv found.
// The inv tree is built.
@@ -2631,7 +2808,8 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const
// static
bool LLInventoryModel::loadFromFile(const std::string& filename,
LLInventoryModel::cat_array_t& categories,
- LLInventoryModel::item_array_t& items)
+ LLInventoryModel::item_array_t& items,
+ bool &is_cache_obsolete)
{
if(filename.empty())
{
@@ -2648,11 +2826,32 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
// *NOTE: This buffer size is hard coded into scanf() below.
char buffer[MAX_STRING]; /*Flawfinder: ignore*/
char keyword[MAX_STRING]; /*Flawfinder: ignore*/
+ char value[MAX_STRING]; /*Flawfinder: ignore*/
+ is_cache_obsolete = true; // Obsolete until proven current
while(!feof(file) && fgets(buffer, MAX_STRING, file))
{
- sscanf(buffer, " %254s", keyword); /* Flawfinder: ignore */
- if(0 == strcmp("inv_category", keyword))
+ sscanf(buffer, " %126s %126s", keyword, value); /* Flawfinder: ignore */
+ if(0 == strcmp("inv_cache_version", keyword))
+ {
+ S32 version;
+ int succ = sscanf(value,"%d",&version);
+ if ((1 == succ) && (version == sCurrentInvCacheVersion))
+ {
+ // Cache is up to date
+ is_cache_obsolete = false;
+ continue;
+ }
+ else
+ {
+ // Cache is out of date
+ break;
+ }
+ }
+ else if(0 == strcmp("inv_category", keyword))
{
+ if (is_cache_obsolete)
+ break;
+
LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null);
if(inv_cat->importFileLocal(file))
{
@@ -2666,6 +2865,9 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
else if(0 == strcmp("inv_item", keyword))
{
+ if (is_cache_obsolete)
+ break;
+
LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem;
if( inv_item->importFileLocal(file) )
{
@@ -2697,6 +2899,8 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
}
fclose(file);
+ if (is_cache_obsolete)
+ return false;
return true;
}
@@ -2718,6 +2922,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
return false;
}
+ fprintf(file, "\tinv_cache_version\t%d\n",sCurrentInvCacheVersion);
S32 count = categories.count();
S32 i;
for(i = 0; i < count; ++i)
@@ -2936,7 +3141,7 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
lastfolder = tfolder;
tfolder->unpackMessage(msg, _PREHASH_FolderData, i);
// make sure it's not a protected folder
- tfolder->setPreferredType(LLAssetType::AT_NONE);
+ tfolder->setPreferredType(LLFolderType::FT_NONE);
folders.push_back(tfolder);
// examine update for changes.
LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
@@ -2965,10 +3170,10 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
gInventory.notifyObservers();
// *HACK: Do the 'show' logic for a new item in the inventory.
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(lastfolder->getUUID(), TAKE_FOCUS_NO);
+ active_panel->setSelection(lastfolder->getUUID(), TAKE_FOCUS_NO);
}
}
@@ -3174,13 +3379,13 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
// The incoming inventory could span more than one BulkInventoryUpdate packet,
// so record the transaction ID for this purchase, then wear all clothing
// that comes in as part of that transaction ID. JC
- if (LLFloaterInventory::sWearNewClothing)
+ if (LLInventoryState::sWearNewClothing)
{
- LLFloaterInventory::sWearNewClothingTransactionID = tid;
- LLFloaterInventory::sWearNewClothing = FALSE;
+ LLInventoryState::sWearNewClothingTransactionID = tid;
+ LLInventoryState::sWearNewClothing = FALSE;
}
- if (tid == LLFloaterInventory::sWearNewClothingTransactionID)
+ if (tid == LLInventoryState::sWearNewClothingTransactionID)
{
count = wearable_ids.size();
for (i = 0; i < count; ++i)
@@ -3226,8 +3431,7 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
if(agent_id != gAgent.getID())
{
- llwarns << "Got a UpdateInventoryItem for the wrong agent."
- << llendl;
+ llwarns << "Got a UpdateInventoryItem for the wrong agent." << llendl;
return;
}
LLUUID parent_id;
@@ -3238,6 +3442,7 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
msg->getS32("AgentData", "Version", version);
S32 descendents;
msg->getS32("AgentData", "Descendents", descendents);
+
S32 i;
S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id);
@@ -3252,6 +3457,12 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
for(i = 0; i < count; ++i)
{
titem->unpackMessage(msg, _PREHASH_ItemData, i);
+ // If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.
+ if (gInventory.getItem(titem->getUUID()))
+ {
+ lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;
+ continue;
+ }
gInventory.updateItem(titem);
}
@@ -3261,6 +3472,9 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
{
cat->setVersion(version);
cat->setDescendentCount(descendents);
+ // Get this UUID on the changed list so that whatever's listening for it
+ // will get triggered.
+ gInventory.addChangedMask(LLInventoryObserver::INTERNAL, cat->getUUID());
}
gInventory.notifyObservers();
}
@@ -3323,31 +3537,31 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
//----------------------------------------------------------------------------
-// Trash: LLAssetType::AT_TRASH, "ConfirmEmptyTrash"
-// Lost&Found: LLAssetType::AT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
+// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash"
+// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
-bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type)
+bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0) // YES
{
- LLUUID folder_id = findCategoryUUIDForType(folder_type);
+ const LLUUID folder_id = findCategoryUUIDForType(preferred_type);
purgeDescendentsOf(folder_id);
notifyObservers();
}
return false;
}
-void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetType::EType folder_type)
+void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderType::EType preferred_type)
{
if (!notification.empty())
{
- LLNotifications::instance().add(notification, LLSD(), LLSD(),
- boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, folder_type));
+ LLNotificationsUtil::add(notification, LLSD(), LLSD(),
+ boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));
}
else
{
- LLUUID folder_id = findCategoryUUIDForType(folder_type);
+ const LLUUID folder_id = findCategoryUUIDForType(preferred_type);
purgeDescendentsOf(folder_id);
notifyObservers();
}
@@ -3358,7 +3572,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetTy
void LLInventoryModel::removeItem(const LLUUID& item_id)
{
LLViewerInventoryItem* item = getItem(item_id);
- const LLUUID new_parent = findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH);
if (item && item->getParentUUID() != new_parent)
{
LLInventoryModel::update_list_t update;
@@ -3406,6 +3620,111 @@ void LLInventoryModel::setLibraryOwnerID(const LLUUID& val)
mLibraryOwnerID = val;
}
+// static
+BOOL LLInventoryModel::getIsFirstTimeInViewer2()
+{
+ // Do not call this before parentchild map is built.
+ if (!gInventory.mIsAgentInvUsable)
+ {
+ llwarns << "Parent Child Map not yet built; guessing as first time in viewer2." << llendl;
+ return TRUE;
+ }
+
+ return sFirstTimeInViewer2;
+}
+
+static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInventoryModel::item_array_t& items, const LLUUID& id)
+{
+ LLInventoryModel::item_array_t::iterator result = items.end();
+
+ for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ {
+ if ((*i)->getUUID() == id)
+ {
+ result = i;
+ break;
+ }
+ }
+
+ return result;
+}
+
+// static
+void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id)
+{
+ LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id);
+ LLInventoryModel::item_array_t::iterator it_dest = find_item_iter_by_uuid(items, dest_item_id);
+
+ if (it_src == items.end() || it_dest == items.end()) return;
+
+ LLViewerInventoryItem* src_item = *it_src;
+ items.erase(it_src);
+
+ // target iterator can not be valid because the container was changed, so update it.
+ it_dest = find_item_iter_by_uuid(items, dest_item_id);
+ items.insert(it_dest, src_item);
+}
+
+void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items)
+{
+ int sortField = 0;
+
+ // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
+ for (item_array_t::const_iterator i = items.begin(); i != items.end(); ++i)
+ {
+ LLViewerInventoryItem* item = *i;
+
+ item->setSortField(++sortField);
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+
+ updateItem(item);
+
+ // Tell the parent folder to refresh its sort order.
+ addChangedMask(LLInventoryObserver::SORT, item->getParentUUID());
+ }
+
+ notifyObservers();
+}
+
+// See also LLInventorySort where landmarks in the Favorites folder are sorted.
+class LLViewerInventoryItemSort
+{
+public:
+ bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b)
+ {
+ return a->getSortField() < b->getSortField();
+ }
+};
+
+/**
+ * Sorts passed items by LLViewerInventoryItem sort field.
+ *
+ * @param[in, out] items - array of items, not sorted.
+ */
+static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items)
+{
+ static LLViewerInventoryItemSort sort_functor;
+ std::sort(items.begin(), items.end(), sort_functor);
+}
+
+void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id)
+{
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLIsType is_type(LLAssetType::AT_LANDMARK);
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+
+ // ensure items are sorted properly before changing order. EXT-3498
+ rearrange_item_order_by_sort_field(items);
+
+ // update order
+ updateItemsOrder(items, source_item_id, target_item_id);
+
+ saveItemsOrder(items);
+}
+
//----------------------------------------------------------------------------
// *NOTE: DEBUG functionality
@@ -3627,513 +3946,6 @@ bool LLNameCategoryCollector::operator()(
return false;
}
-
-
-///----------------------------------------------------------------------------
-/// Observers
-///----------------------------------------------------------------------------
-
-void LLInventoryCompletionObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mIncomplete.empty())
- {
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- it = mIncomplete.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mComplete.push_back(*it);
- it = mIncomplete.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncomplete.empty())
- {
- done();
- }
- }
-}
-
-void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
-{
- if(id.notNull())
- {
- mIncomplete.push_back(id);
- }
-}
-
-
-void LLInventoryFetchObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mIncomplete.empty())
- {
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- // BUG: This can cause done() to get called prematurely below.
- // This happens with the LLGestureInventoryFetchObserver that
- // loads gestures at startup. JC
- it = mIncomplete.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mComplete.push_back(*it);
- it = mIncomplete.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncomplete.empty())
- {
- done();
- }
- }
- //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
- //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
-}
-
-bool LLInventoryFetchObserver::isEverythingComplete() const
-{
- return mIncomplete.empty();
-}
-
-void fetch_items_from_llsd(const LLSD& items_llsd)
-{
- if (!items_llsd.size()) return;
- LLSD body;
- body[0]["cap_name"] = "FetchInventory";
- body[1]["cap_name"] = "FetchLib";
- for (S32 i=0; i<items_llsd.size();i++)
- {
- if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
- {
- body[0]["items"].append(items_llsd[i]);
- continue;
- }
- if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
- {
- body[1]["items"].append(items_llsd[i]);
- continue;
- }
- }
-
- for (S32 i=0; i<body.size(); i++)
- {
- if (0 >= body[i].size()) continue;
- std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
-
- if (!url.empty())
- {
- body[i]["agent_id"] = gAgent.getID();
- LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
- break;
- }
-
- LLMessageSystem* msg = gMessageSystem;
- BOOL start_new_message = TRUE;
- for (S32 j=0; j<body[i]["items"].size(); j++)
- {
- LLSD item_entry = body[i]["items"][j];
- if(start_new_message)
- {
- start_new_message = FALSE;
- msg->newMessageFast(_PREHASH_FetchInventory);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- }
- msg->nextBlockFast(_PREHASH_InventoryData);
- msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
- msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
- if(msg->isSendFull(NULL))
- {
- start_new_message = TRUE;
- gAgent.sendReliableMessage();
- }
- }
- if(!start_new_message)
- {
- gAgent.sendReliableMessage();
- }
- }
-}
-
-void LLInventoryFetchObserver::fetchItems(
- const LLInventoryFetchObserver::item_ref_t& ids)
-{
- LLUUID owner_id;
- LLSD items_llsd;
- for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(item)
- {
- if(item->isComplete())
- {
- // It's complete, so put it on the complete container.
- mComplete.push_back(*it);
- continue;
- }
- else
- {
- owner_id = item->getPermissions().getOwner();
- }
- }
- else
- {
- // assume it's agent inventory.
- owner_id = gAgent.getID();
- }
-
- // It's incomplete, so put it on the incomplete container, and
- // pack this on the message.
- mIncomplete.push_back(*it);
-
- // Prepare the data to fetch
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*it);
- items_llsd.append(item_entry);
- }
- fetch_items_from_llsd(items_llsd);
-}
-
-// virtual
-void LLInventoryFetchDescendentsObserver::changed(U32 mask)
-{
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
- {
- it = mIncompleteFolders.erase(it);
- continue;
- }
- if(isComplete(cat))
- {
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncompleteFolders.empty())
- {
- done();
- }
-}
-
-void LLInventoryFetchDescendentsObserver::fetchDescendents(
- const folder_ref_t& ids)
-{
- for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat) continue;
- if(!isComplete(cat))
- {
- cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it.
- mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer.
- }
- else
- {
- mCompleteFolders.push_back(*it);
- }
- }
-}
-
-bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
-{
- return mIncompleteFolders.empty();
-}
-
-bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
-{
- S32 version = cat->getVersion();
- S32 descendents = cat->getDescendentCount();
- if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
- || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
- {
- return false;
- }
- // it might be complete - check known descendents against
- // currently available.
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
- if(!cats || !items)
- {
- // bit of a hack - pretend we're done if they are gone or
- // incomplete. should never know, but it would suck if this
- // kept tight looping because of a corrupt memory state.
- return true;
- }
- S32 known = cats->count() + items->count();
- if(descendents == known)
- {
- // hey - we're done.
- return true;
- }
- return false;
-}
-
-void LLInventoryFetchComboObserver::changed(U32 mask)
-{
- if(!mIncompleteItems.empty())
- {
- for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- it = mIncompleteItems.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mCompleteItems.push_back(*it);
- it = mIncompleteItems.erase(it);
- continue;
- }
- ++it;
- }
- }
- if(!mIncompleteFolders.empty())
- {
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
- {
- it = mIncompleteFolders.erase(it);
- continue;
- }
- if(gInventory.isCategoryComplete(*it))
- {
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
- continue;
- }
- ++it;
- }
- }
- if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
- {
- mDone = true;
- done();
- }
-}
-
-void LLInventoryFetchComboObserver::fetch(
- const folder_ref_t& folder_ids,
- const item_ref_t& item_ids)
-{
- lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
- for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
- if(!cat) continue;
- if(!gInventory.isCategoryComplete(*fit))
- {
- cat->fetchDescendents();
- lldebugs << "fetching folder " << *fit <<llendl;
- mIncompleteFolders.push_back(*fit);
- }
- else
- {
- mCompleteFolders.push_back(*fit);
- lldebugs << "completing folder " << *fit <<llendl;
- }
- }
-
- // Now for the items - we fetch everything which is not a direct
- // descendent of an incomplete folder because the item will show
- // up in an inventory descendents message soon enough so we do not
- // have to fetch it individually.
- LLSD items_llsd;
- LLUUID owner_id;
- for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*iit);
- if(!item)
- {
- lldebugs << "uanble to find item " << *iit << llendl;
- continue;
- }
- if(item->isComplete())
- {
- // It's complete, so put it on the complete container.
- mCompleteItems.push_back(*iit);
- lldebugs << "completing item " << *iit << llendl;
- continue;
- }
- else
- {
- mIncompleteItems.push_back(*iit);
- owner_id = item->getPermissions().getOwner();
- }
- if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
- {
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*iit);
- items_llsd.append(item_entry);
- }
- else
- {
- lldebugs << "not worrying about " << *iit << llendl;
- }
- }
- fetch_items_from_llsd(items_llsd);
-}
-
-void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
-{
- if(id.notNull())
- {
- mMIA.push_back(id);
- }
-}
-
-void LLInventoryExistenceObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mMIA.empty())
- {
- for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- ++it;
- continue;
- }
- mExist.push_back(*it);
- it = mMIA.erase(it);
- }
- if(mMIA.empty())
- {
- done();
- }
- }
-}
-
-void LLInventoryAddedObserver::changed(U32 mask)
-{
- if(!(mask & LLInventoryObserver::ADD))
- {
- return;
- }
-
- // *HACK: If this was in response to a packet off
- // the network, figure out which item was updated.
- LLMessageSystem* msg = gMessageSystem;
-
- std::string msg_name;
- if (mMessageName.empty())
- {
- msg_name = msg->getMessageName();
- }
- else
- {
- msg_name = mMessageName;
- }
-
- if (msg_name.empty())
- {
- return;
- }
-
- // We only want newly created inventory items. JC
- if ( msg_name != "UpdateCreateInventoryItem")
- {
- return;
- }
-
- LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
- S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
- for(S32 i = 0; i < num_blocks; ++i)
- {
- titem->unpackMessage(msg, _PREHASH_InventoryData, i);
- if (!(titem->getUUID().isNull()))
- {
- //we don't do anything with null keys
- mAdded.push_back(titem->getUUID());
- }
- }
- if (!mAdded.empty())
- {
- done();
- }
-}
-
-LLInventoryTransactionObserver::LLInventoryTransactionObserver(
- const LLTransactionID& transaction_id) :
- mTransactionID(transaction_id)
-{
-}
-
-void LLInventoryTransactionObserver::changed(U32 mask)
-{
- if(mask & LLInventoryObserver::ADD)
- {
- // This could be it - see if we are processing a bulk update
- LLMessageSystem* msg = gMessageSystem;
- if(msg->getMessageName()
- && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
- {
- // we have a match for the message - now check the
- // transaction id.
- LLUUID id;
- msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
- if(id == mTransactionID)
- {
- // woo hoo, we found it
- folder_ref_t folders;
- item_ref_t items;
- S32 count;
- count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
- S32 i;
- for(i = 0; i < count; ++i)
- {
- msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
- if(id.notNull())
- {
- folders.push_back(id);
- }
- }
- count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
- for(i = 0; i < count; ++i)
- {
- msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
- if(id.notNull())
- {
- items.push_back(id);
- }
- }
-
- // call the derived class the implements this method.
- done(folders, items);
- }
- }
- }
-}
-
-
///----------------------------------------------------------------------------
/// LLAssetIDMatches
///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index d51460b374..2a2b48ce3c 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -34,46 +34,29 @@
#define LL_LLINVENTORYMODEL_H
#include "llassettype.h"
+#include "llfoldertype.h"
#include "lldarray.h"
#include "llframetimer.h"
#include "llhttpclient.h"
#include "lluuid.h"
#include "llpermissionsflags.h"
#include "llstring.h"
-
#include <map>
#include <set>
#include <string>
#include <vector>
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryObserver
-//
-// This class is designed to be a simple abstract base class which can
-// relay messages when the inventory changes.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryObserver;
+class LLInventoryObject;
+class LLInventoryItem;
+class LLInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLMessageSystem;
+class LLInventoryCollectFunctor;
-class LLInventoryObserver
-{
-public:
- // This enumeration is a way to refer to what changed in a more
- // human readable format. You can mask the value provided by
- // chaged() to see if the observer is interested in the change.
- enum
- {
- NONE = 0,
- LABEL = 1, // name changed
- INTERNAL = 2, // internal change, eg, asset uuid different
- ADD = 4, // something added
- REMOVE = 8, // something deleted
- STRUCTURE = 16, // structural change, eg, item or folder moved
- CALLING_CARD = 32, // online, grant status, cancel, etc change
- ALL = 0xffffffff
- };
- virtual ~LLInventoryObserver() {};
- virtual void changed(U32 mask) = 0;
- std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
-};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryModel
@@ -86,19 +69,11 @@ public:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryObject;
-class LLInventoryItem;
-class LLInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLMessageSystem;
-class LLInventoryCollectFunctor;
-
class LLInventoryModel
{
public:
+ friend class LLInventoryModelFetchDescendentsResponder;
+
enum EHasChildren
{
CHILDREN_NO,
@@ -109,6 +84,8 @@ public:
// These are used a lot...
typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t;
typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t;
+ typedef std::set<LLUUID> changed_items_t;
+
// construction & destruction
LLInventoryModel();
~LLInventoryModel();
@@ -133,10 +110,12 @@ public:
// Accessors
//
- // This is a convenience function to check if one object has a
- // parent chain up to the category specified by UUID.
+ // Check if one object has a parent chain up to the category specified by UUID.
BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
+ // Get whatever special folder this object is a child of, if any.
+ const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
+
// Get the object by id. Returns NULL if not found.
// * WARNING: use the pointer returned for read operations - do
// not modify the object values in place or you will break stuff.
@@ -194,8 +173,6 @@ public:
// Assumes item_id is itself not a linked item.
item_array_t collectLinkedItems(const LLUUID& item_id,
const LLUUID& start_folder_id = LLUUID::null);
- // Updates all linked items pointing to this id.
- void updateLinkedItems(const LLUUID& object_id);
// Get the inventoryID that this item points to, else just return item_id
const LLUUID& getLinkedItemID(const LLUUID& object_id) const;
@@ -243,9 +220,9 @@ public:
void deleteObject(const LLUUID& id);
// delete a particular inventory object by ID, and delete it from
- // the server. Also purges linked items via purgeLinkedObjects.
+ // the server. Also updates linked items.
void purgeObject(const LLUUID& id);
- void purgeLinkedObjects(const LLUUID& id);
+ void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);
// This is a method which collects the descendants of the id
// provided. If the category is not found, no action is
@@ -274,17 +251,19 @@ public:
// findCategoryUUIDForType() returns the uuid of the category that
// specifies 'type' as what it defaults to containing. The
- // category is not necessarily only for that type. *NOTE: This
- // will create a new inventory category on the fly if one does not
- // exist.
-
+ // category is not necessarily only for that type. *NOTE: If create_folder is true, this
+ // will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is
+ // true it will search in the user's library folder instead of "My Inventory"
// SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible
// multiple trash can bug.
- LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true);
+ const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false);
- // Call this method when it's time to update everyone on a new
- // state, by default, the inventory model will not update
- // observers automatically.
+ // This gets called by the idle loop. It only updates if new
+ // state is detected. Call notifyObservers() manually to update
+ // regardless of whether state change has been indicated.
+ void idleNotifyObservers();
+
+ // Call this method to explicitly update everyone on a new state.
// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
void notifyObservers(const std::string service_name="");
@@ -296,7 +275,7 @@ public:
// that the next notify will include that notification.
void addChangedMask(U32 mask, const LLUUID& referent);
- const std::set<LLUUID>& getChangedIDs() { return mChangedItemIDs; }
+ const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
// This method to prepares a set of mock inventory which provides
// minimal functionality before the actual arrival of inventory.
@@ -305,9 +284,6 @@ public:
// Make sure we have the descendents in the structure. Returns true
// if a fetch was performed.
bool fetchDescendentsOf(const LLUUID& folder_id);
-
- // Add categories to a list to be fetched in bulk.
- static void bulkFetch(std::string url);
// call this method to request the inventory.
//void requestFromServer(const LLUUID& agent_id);
@@ -329,7 +305,7 @@ public:
// category. If you want to use the default name based on type,
// pass in a NULL to the 'name parameter.
LLUUID createNewCategory(const LLUUID& parent_id,
- LLAssetType::EType preferred_type,
+ LLFolderType::EType preferred_type,
const std::string& name);
// methods to load up inventory skeleton & meat. These are used
@@ -385,22 +361,14 @@ public:
bool isCategoryComplete(const LLUUID& cat_id) const;
// callbacks
- // Trigger a notification and empty the folder type (AT_TRASH or AT_LOST_AND_FOUND) if confirmed
- void emptyFolderType(const std::string notification, LLAssetType::EType folder_type);
- bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type);
+ // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed
+ void emptyFolderType(const std::string notification, LLFolderType::EType folder_type);
+ bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);
// Utility Functions
void removeItem(const LLUUID& item_id);
- // start and stop background breadth-first fetching of inventory contents
- // this gets triggered when performing a filter-search
- static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process
static void findLostItems();
- static BOOL backgroundFetchActive();
- static bool isEverythingFetched();
- static void backgroundFetch(void*); // background fetch idle function
- static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; }
-
// Data about the agent's root folder and root library folder
// are stored here, rather than in LLAgent where it used to be, because
@@ -416,6 +384,39 @@ public:
void setLibraryOwnerID(const LLUUID& id);
void setLibraryRootFolderID(const LLUUID& id);
+
+ /**
+ * Changes items order by insertion of the item identified by src_item_id
+ * BEFORE the item identified by dest_item_id. Both items must exist in items array.
+ *
+ * Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id.
+ *
+ * @param[in, out] items - vector with items to be updated. It should be sorted in a right way
+ * before calling this method.
+ * @param src_item_id - LLUUID of inventory item to be moved in new position
+ * @param dest_item_id - LLUUID of inventory item before which source item should be placed.
+ */
+ static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id);
+
+ /**
+ * Saves current order of the passed items using inventory item sort field.
+ *
+ * It reset items' sort fields and saves them on server.
+ * Is used to save order for Favorites folder.
+ *
+ * @param[in] items vector of items in order to be saved.
+ */
+ void saveItemsOrder(const LLInventoryModel::item_array_t& items);
+
+ /**
+ * Rearranges Landmarks inside Favorites folder.
+ * Moves source landmark before target one.
+ *
+ * @param source_item_id - LLUUID of the source item to be moved into new position
+ * @param target_item_id - LLUUID of the target item before which source item should be placed.
+ */
+ void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);
+
protected:
// Internal methods which add inventory and make sure that all of
@@ -431,7 +432,7 @@ protected:
//
// Internal method which looks for a category with the specified
// preferred type. Returns LLUUID::null if not found
- const LLUUID &findCatUUID(LLAssetType::EType preferred_type) const;
+ const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const;
// Empty the entire contents
void empty();
@@ -445,7 +446,8 @@ protected:
// file import/export.
static bool loadFromFile(const std::string& filename,
cat_array_t& categories,
- item_array_t& items);
+ item_array_t& items,
+ bool& is_cache_obsolete);
static bool saveToFile(const std::string& filename,
const cat_array_t& categories,
const item_array_t& items);
@@ -467,27 +469,18 @@ protected:
bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
+ // Updates all linked items pointing to this id.
+ void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
+
protected:
cat_array_t* getUnlockedCatArray(const LLUUID& id);
item_array_t* getUnlockedItemArray(const LLUUID& id);
-protected:
+private:
// Variables used to track what has changed since the last notify.
U32 mModifyMask;
- typedef std::set<LLUUID> changed_items_t;
changed_items_t mChangedItemIDs;
- // Information for tracking the actual inventory. We index this
- // information in a lot of different ways so we can access
- // the inventory using several different identifiers.
- // mInventory member data is the 'master' list of inventory, and
- // mCategoryMap and mItemMap store uuid->object mappings.
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
- //inv_map_t mInventory;
- cat_map_t mCategoryMap;
- item_map_t mItemMap;
-
std::map<LLUUID, bool> mCategoryLock;
std::map<LLUUID, bool> mItemLock;
@@ -508,26 +501,78 @@ protected:
LLUUID mLibraryRootFolderID;
LLUUID mLibraryOwnerID;
- // completing the fetch once per session should be sufficient
- static BOOL sBackgroundFetchActive;
static BOOL sTimelyFetchPending;
static S32 sNumFetchRetries;
static LLFrameTimer sFetchTimer;
static F32 sMinTimeBetweenFetches;
static F32 sMaxTimeBetweenFetches;
- static S16 sBulkFetchCount;
+ // Expected inventory cache version
+ const static S32 sCurrentInvCacheVersion;
+
// This flag is used to handle an invalid inventory state.
bool mIsAgentInvUsable;
+private:
+ // Information for tracking the actual inventory. We index this
+ // information in a lot of different ways so we can access
+ // the inventory using several different identifiers.
+ // mInventory member data is the 'master' list of inventory, and
+ // mCategoryMap and mItemMap store uuid->object mappings.
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
+ //inv_map_t mInventory;
+ cat_map_t mCategoryMap;
+ item_map_t mItemMap;
+
+ // Flag set when notifyObservers is being called, to look for bugs
+ // where it's called recursively.
+ BOOL mIsNotifyObservers;
public:
// *NOTE: DEBUG functionality
void dumpInventory() const;
- static bool isBulkFetchProcessingComplete();
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Bulk fetch
+public:
+ // Start and stop background breadth-first fetching of inventory contents.
+ // This gets triggered when performing a filter-search
+ void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null);
+ static BOOL backgroundFetchActive();
+ static bool isEverythingFetched();
+ static void backgroundFetch(void*); // background fetch idle function
+ static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; }
static void stopBackgroundFetch(); // stop fetch process
+ static bool isBulkFetchProcessingComplete();
- static BOOL sFullFetchStarted;
+ // Add categories to a list to be fetched in bulk.
+ static void bulkFetch(std::string url);
+
+ static bool libraryFetchStarted();
+ static bool libraryFetchCompleted();
+ static bool libraryFetchInProgress();
+
+ static bool myInventoryFetchStarted();
+ static bool myInventoryFetchCompleted();
+ static bool myInventoryFetchInProgress();
+
+private:
+ static BOOL sMyInventoryFetchStarted;
+ static BOOL sLibraryFetchStarted;
static BOOL sAllFoldersFetched;
+ static void setAllFoldersFetched();
+
+ // completing the fetch once per session should be sufficient
+ static BOOL sBackgroundFetchActive;
+ static S16 sBulkFetchCount;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Login status
+public:
+ static BOOL getIsFirstTimeInViewer2();
+private:
+ static BOOL sFirstTimeInViewer2;
};
// a special inventory model for the agent
@@ -762,183 +807,5 @@ public:
LLInventoryItem* item);
};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCompletionObserver
-//
-// Class which can be used as a base class for doing something when
-// when all observed items are locally complete. This class implements
-// the changed() method of LLInventoryObserver and declares a new
-// method named done() which is called when all watched items have
-// complete information in the inventory model.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCompletionObserver : public LLInventoryObserver
-{
-public:
- LLInventoryCompletionObserver() {}
- virtual void changed(U32 mask);
-
- void watchItem(const LLUUID& id);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles all the the fetching necessary. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryFetchObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchObserver() {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> item_ref_t;
-
- bool isEverythingComplete() const;
- void fetchItems(const item_ref_t& ids);
- virtual void done() = 0;
-
-protected:
- item_ref_t mComplete;
- item_ref_t mIncomplete;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchDescendentsObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles fetching based on category. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchDescendentsObserver() {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- void fetchDescendents(const folder_ref_t& ids);
- bool isEverythingComplete() const;
- virtual void done() = 0;
-
-protected:
- bool isComplete(LLViewerInventoryCategory* cat);
- folder_ref_t mIncompleteFolders;
- folder_ref_t mCompleteFolders;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchComboObserver
-//
-// This class does an appropriate combination of fetch descendents and
-// item fetches based on completion of categories and items. Much like
-// the fetch and fetch descendents, this will call done() when everything
-// has arrived.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchComboObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchComboObserver() : mDone(false) {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
-
- virtual void done() = 0;
-
-protected:
- bool mDone;
- folder_ref_t mCompleteFolders;
- folder_ref_t mIncompleteFolders;
- item_ref_t mCompleteItems;
- item_ref_t mIncompleteItems;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryExistenceObserver
-//
-// This class is used as a base class for doing somethign when all the
-// observed item ids exist in the inventory somewhere. You can derive
-// a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryExistenceObserver : public LLInventoryObserver
-{
-public:
- LLInventoryExistenceObserver() {}
- virtual void changed(U32 mask);
-
- void watchItem(const LLUUID& id);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mExist;
- item_ref_t mMIA;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryAddedObserver
-//
-// This class is used as a base class for doing something when
-// a new item arrives in inventory.
-// It does not watch for a certain UUID, rather it acts when anything is added
-// Derive a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryAddedObserver : public LLInventoryObserver
-{
-public:
- LLInventoryAddedObserver() : mAdded() {}
- virtual void changed(U32 mask);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mAdded;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryTransactionObserver
-//
-// Class which can be used as a base class for doing something when an
-// inventory transaction completes.
-//
-// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
-// functionality gaps.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryTransactionObserver : public LLInventoryObserver
-{
-public:
- LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
- virtual void changed(U32 mask);
-
-protected:
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
-
- LLTransactionID mTransactionID;
-};
-
-
#endif // LL_LLINVENTORYMODEL_H
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
new file mode 100644
index 0000000000..2fb8aea4e9
--- /dev/null
+++ b/indra/newview/llinventoryobserver.cpp
@@ -0,0 +1,596 @@
+/**
+ * @file llinventoryobserver.cpp
+ * @brief Implementation of the inventory observers used to track agent inventory.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llinventoryobserver.h"
+
+#include "llassetstorage.h"
+#include "llcrc.h"
+#include "lldir.h"
+#include "llsys.h"
+#include "llxfermanager.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llfloater.h"
+#include "llfocusmgr.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llviewerregion.h"
+#include "llappviewer.h"
+#include "lldbstrings.h"
+#include "llviewerstats.h"
+#include "llmutelist.h"
+#include "llnotificationsutil.h"
+#include "llcallbacklist.h"
+#include "llpreview.h"
+#include "llviewercontrol.h"
+#include "llvoavatarself.h"
+#include "llsdutil.h"
+#include <deque>
+
+LLInventoryObserver::LLInventoryObserver()
+{
+}
+
+// virtual
+LLInventoryObserver::~LLInventoryObserver()
+{
+}
+
+void LLInventoryCompletionObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mIncomplete.empty())
+ {
+ for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mComplete.push_back(*it);
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncomplete.empty())
+ {
+ done();
+ }
+ }
+}
+
+void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ mIncomplete.push_back(id);
+ }
+}
+
+
+void LLInventoryFetchObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mIncomplete.empty())
+ {
+ for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ if (mRetryIfMissing)
+ {
+ // BAP changed to skip these items, so we should keep retrying until they arrive.
+ // Did not make this the default behavior because of uncertainty about impact -
+ // could cause some observers that currently complete to wait forever.
+ ++it;
+ }
+ else
+ {
+ // BUG: This can cause done() to get called prematurely below.
+ // This happens with the LLGestureInventoryFetchObserver that
+ // loads gestures at startup. JC
+ it = mIncomplete.erase(it);
+ }
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mComplete.push_back(*it);
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncomplete.empty())
+ {
+ done();
+ }
+ }
+ //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
+ //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
+}
+
+bool LLInventoryFetchObserver::isEverythingComplete() const
+{
+ return mIncomplete.empty();
+}
+
+void fetch_items_from_llsd(const LLSD& items_llsd)
+{
+ if (!items_llsd.size()) return;
+ LLSD body;
+ body[0]["cap_name"] = "FetchInventory";
+ body[1]["cap_name"] = "FetchLib";
+ for (S32 i=0; i<items_llsd.size();i++)
+ {
+ if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
+ {
+ body[0]["items"].append(items_llsd[i]);
+ continue;
+ }
+ if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+ {
+ body[1]["items"].append(items_llsd[i]);
+ continue;
+ }
+ }
+
+ for (S32 i=0; i<body.size(); i++)
+ {
+ if (0 >= body[i].size()) continue;
+ std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+
+ if (!url.empty())
+ {
+ body[i]["agent_id"] = gAgent.getID();
+ LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
+ break;
+ }
+
+ LLMessageSystem* msg = gMessageSystem;
+ BOOL start_new_message = TRUE;
+ for (S32 j=0; j<body[i]["items"].size(); j++)
+ {
+ LLSD item_entry = body[i]["items"][j];
+ if(start_new_message)
+ {
+ start_new_message = FALSE;
+ msg->newMessageFast(_PREHASH_FetchInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ }
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
+ msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
+ if(msg->isSendFull(NULL))
+ {
+ start_new_message = TRUE;
+ gAgent.sendReliableMessage();
+ }
+ }
+ if(!start_new_message)
+ {
+ gAgent.sendReliableMessage();
+ }
+ }
+}
+
+void LLInventoryFetchObserver::fetchItems(
+ const LLInventoryFetchObserver::item_ref_t& ids)
+{
+ LLUUID owner_id;
+ LLSD items_llsd;
+ for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(item)
+ {
+ if(item->isComplete())
+ {
+ // It's complete, so put it on the complete container.
+ mComplete.push_back(*it);
+ continue;
+ }
+ else
+ {
+ owner_id = item->getPermissions().getOwner();
+ }
+ }
+ else
+ {
+ // assume it's agent inventory.
+ owner_id = gAgent.getID();
+ }
+
+ // It's incomplete, so put it on the incomplete container, and
+ // pack this on the message.
+ mIncomplete.push_back(*it);
+
+ // Prepare the data to fetch
+ LLSD item_entry;
+ item_entry["owner_id"] = owner_id;
+ item_entry["item_id"] = (*it);
+ items_llsd.append(item_entry);
+ }
+ fetch_items_from_llsd(items_llsd);
+}
+
+// virtual
+void LLInventoryFetchDescendentsObserver::changed(U32 mask)
+{
+ for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat)
+ {
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ if(isComplete(cat))
+ {
+ mCompleteFolders.push_back(*it);
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncompleteFolders.empty())
+ {
+ done();
+ }
+}
+
+void LLInventoryFetchDescendentsObserver::fetchDescendents(
+ const folder_ref_t& ids)
+{
+ for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat) continue;
+ if(!isComplete(cat))
+ {
+ cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it.
+ mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer.
+ }
+ else
+ {
+ mCompleteFolders.push_back(*it);
+ }
+ }
+}
+
+bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
+{
+ return mIncompleteFolders.empty();
+}
+
+bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
+{
+ const S32 version = cat->getVersion();
+ const S32 expected_num_descendents = cat->getDescendentCount();
+ if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) ||
+ (expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN))
+ {
+ return false;
+ }
+ // it might be complete - check known descendents against
+ // currently available.
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
+ if(!cats || !items)
+ {
+ llwarns << "Category '" << cat->getName() << "' descendents corrupted, fetch failed." << llendl;
+ // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
+ // that the cat just doesn't have any items or subfolders).
+ // Unrecoverable, so just return done so that this observer can be cleared
+ // from memory.
+ return true;
+ }
+ const S32 current_num_known_descendents = cats->count() + items->count();
+
+ // Got the number of descendents that we were expecting, so we're done.
+ if (current_num_known_descendents == expected_num_descendents)
+ {
+ return true;
+ }
+
+ // Error condition, but recoverable. This happens if something was added to the
+ // category before it was initialized, so accountForUpdate didn't update descendent
+ // count and thus the category thinks it has fewer descendents than it actually has.
+ if (current_num_known_descendents >= expected_num_descendents)
+ {
+ llwarns << "Category '" << cat->getName() << "' expected descendentcount:" << expected_num_descendents << " descendents but got descendentcount:" << current_num_known_descendents << llendl;
+ cat->setDescendentCount(current_num_known_descendents);
+ return true;
+ }
+ return false;
+}
+
+void LLInventoryFetchComboObserver::changed(U32 mask)
+{
+ if(!mIncompleteItems.empty())
+ {
+ for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ it = mIncompleteItems.erase(it);
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mCompleteItems.push_back(*it);
+ it = mIncompleteItems.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ }
+ if(!mIncompleteFolders.empty())
+ {
+ for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat)
+ {
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ if(gInventory.isCategoryComplete(*it))
+ {
+ mCompleteFolders.push_back(*it);
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ }
+ if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
+ {
+ mDone = true;
+ done();
+ }
+}
+
+void LLInventoryFetchComboObserver::fetch(
+ const folder_ref_t& folder_ids,
+ const item_ref_t& item_ids)
+{
+ lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
+ for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
+ if(!cat) continue;
+ if(!gInventory.isCategoryComplete(*fit))
+ {
+ cat->fetchDescendents();
+ lldebugs << "fetching folder " << *fit <<llendl;
+ mIncompleteFolders.push_back(*fit);
+ }
+ else
+ {
+ mCompleteFolders.push_back(*fit);
+ lldebugs << "completing folder " << *fit <<llendl;
+ }
+ }
+
+ // Now for the items - we fetch everything which is not a direct
+ // descendent of an incomplete folder because the item will show
+ // up in an inventory descendents message soon enough so we do not
+ // have to fetch it individually.
+ LLSD items_llsd;
+ LLUUID owner_id;
+ for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*iit);
+ if(!item)
+ {
+ lldebugs << "uanble to find item " << *iit << llendl;
+ continue;
+ }
+ if(item->isComplete())
+ {
+ // It's complete, so put it on the complete container.
+ mCompleteItems.push_back(*iit);
+ lldebugs << "completing item " << *iit << llendl;
+ continue;
+ }
+ else
+ {
+ mIncompleteItems.push_back(*iit);
+ owner_id = item->getPermissions().getOwner();
+ }
+ if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
+ {
+ LLSD item_entry;
+ item_entry["owner_id"] = owner_id;
+ item_entry["item_id"] = (*iit);
+ items_llsd.append(item_entry);
+ }
+ else
+ {
+ lldebugs << "not worrying about " << *iit << llendl;
+ }
+ }
+ fetch_items_from_llsd(items_llsd);
+}
+
+void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ mMIA.push_back(id);
+ }
+}
+
+void LLInventoryExistenceObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mMIA.empty())
+ {
+ for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ ++it;
+ continue;
+ }
+ mExist.push_back(*it);
+ it = mMIA.erase(it);
+ }
+ if(mMIA.empty())
+ {
+ done();
+ }
+ }
+}
+
+void LLInventoryAddedObserver::changed(U32 mask)
+{
+ if(!(mask & LLInventoryObserver::ADD))
+ {
+ return;
+ }
+
+ // *HACK: If this was in response to a packet off
+ // the network, figure out which item was updated.
+ LLMessageSystem* msg = gMessageSystem;
+
+ std::string msg_name;
+ if (mMessageName.empty())
+ {
+ msg_name = msg->getMessageName();
+ }
+ else
+ {
+ msg_name = mMessageName;
+ }
+
+ if (msg_name.empty())
+ {
+ return;
+ }
+
+ // We only want newly created inventory items. JC
+ if ( msg_name != "UpdateCreateInventoryItem")
+ {
+ return;
+ }
+
+ LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+ for(S32 i = 0; i < num_blocks; ++i)
+ {
+ titem->unpackMessage(msg, _PREHASH_InventoryData, i);
+ if (!(titem->getUUID().isNull()))
+ {
+ //we don't do anything with null keys
+ mAdded.push_back(titem->getUUID());
+ }
+ }
+ if (!mAdded.empty())
+ {
+ done();
+ }
+}
+
+LLInventoryTransactionObserver::LLInventoryTransactionObserver(
+ const LLTransactionID& transaction_id) :
+ mTransactionID(transaction_id)
+{
+}
+
+void LLInventoryTransactionObserver::changed(U32 mask)
+{
+ if(mask & LLInventoryObserver::ADD)
+ {
+ // This could be it - see if we are processing a bulk update
+ LLMessageSystem* msg = gMessageSystem;
+ if(msg->getMessageName()
+ && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
+ {
+ // we have a match for the message - now check the
+ // transaction id.
+ LLUUID id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
+ if(id == mTransactionID)
+ {
+ // woo hoo, we found it
+ folder_ref_t folders;
+ item_ref_t items;
+ S32 count;
+ count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
+ S32 i;
+ for(i = 0; i < count; ++i)
+ {
+ msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
+ if(id.notNull())
+ {
+ folders.push_back(id);
+ }
+ }
+ count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
+ for(i = 0; i < count; ++i)
+ {
+ msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
+ if(id.notNull())
+ {
+ items.push_back(id);
+ }
+ }
+
+ // call the derived class the implements this method.
+ done(folders, items);
+ }
+ }
+ }
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
new file mode 100644
index 0000000000..d6dded52d4
--- /dev/null
+++ b/indra/newview/llinventoryobserver.h
@@ -0,0 +1,254 @@
+/**
+ * @file llinventoryobserver.h
+ * @brief LLInventoryObserver class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYOBSERVERS_H
+#define LL_LLINVENTORYOBSERVERS_H
+
+#include "lluuid.h"
+#include <string>
+#include <vector>
+
+class LLViewerInventoryCategory;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryObserver
+//
+// This class is designed to be a simple abstract base class which can
+// relay messages when the inventory changes.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryObserver
+{
+public:
+ // This enumeration is a way to refer to what changed in a more
+ // human readable format. You can mask the value provided by
+ // chaged() to see if the observer is interested in the change.
+ enum
+ {
+ NONE = 0,
+ LABEL = 1, // name changed
+ INTERNAL = 2, // internal change (e.g. asset uuid different)
+ ADD = 4, // something added
+ REMOVE = 8, // something deleted
+ STRUCTURE = 16, // structural change (eg item or folder moved)
+ CALLING_CARD = 32, // (eg online, grant status, cancel)
+ GESTURE = 64,
+ REBUILD = 128, // item UI changed (eg item type different)
+ SORT = 256, // folder needs to be resorted.
+ ALL = 0xffffffff
+ };
+ LLInventoryObserver();
+ virtual ~LLInventoryObserver();
+ virtual void changed(U32 mask) = 0;
+ std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCompletionObserver
+//
+// Class which can be used as a base class for doing something when
+// when all observed items are locally complete. This class implements
+// the changed() method of LLInventoryObserver and declares a new
+// method named done() which is called when all watched items have
+// complete information in the inventory model.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryCompletionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryCompletionObserver() {}
+ virtual void changed(U32 mask);
+
+ void watchItem(const LLUUID& id);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mComplete;
+ item_ref_t mIncomplete;
+};
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles all the the fetching necessary. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryFetchObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchObserver(bool retry_if_missing = false): mRetryIfMissing(retry_if_missing) {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> item_ref_t;
+
+ bool isEverythingComplete() const;
+ void fetchItems(const item_ref_t& ids);
+ virtual void done() {};
+
+protected:
+ bool mRetryIfMissing;
+ item_ref_t mComplete;
+ item_ref_t mIncomplete;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchDescendentsObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles fetching based on category. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchDescendentsObserver() {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> folder_ref_t;
+ void fetchDescendents(const folder_ref_t& ids);
+ bool isEverythingComplete() const;
+ virtual void done() = 0;
+
+protected:
+ bool isComplete(LLViewerInventoryCategory* cat);
+ folder_ref_t mIncompleteFolders;
+ folder_ref_t mCompleteFolders;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchComboObserver
+//
+// This class does an appropriate combination of fetch descendents and
+// item fetches based on completion of categories and items. Much like
+// the fetch and fetch descendents, this will call done() when everything
+// has arrived.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchComboObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchComboObserver() : mDone(false) {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> folder_ref_t;
+ typedef std::vector<LLUUID> item_ref_t;
+ void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
+
+ virtual void done() = 0;
+
+protected:
+ bool mDone;
+ folder_ref_t mCompleteFolders;
+ folder_ref_t mIncompleteFolders;
+ item_ref_t mCompleteItems;
+ item_ref_t mIncompleteItems;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryExistenceObserver
+//
+// This class is used as a base class for doing somethign when all the
+// observed item ids exist in the inventory somewhere. You can derive
+// a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryExistenceObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryExistenceObserver() {}
+ virtual void changed(U32 mask);
+
+ void watchItem(const LLUUID& id);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mExist;
+ item_ref_t mMIA;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryAddedObserver
+//
+// This class is used as a base class for doing something when
+// a new item arrives in inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+// Derive a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryAddedObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryAddedObserver() : mAdded() {}
+ virtual void changed(U32 mask);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mAdded;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryTransactionObserver
+//
+// Class which can be used as a base class for doing something when an
+// inventory transaction completes.
+//
+// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
+// functionality gaps.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryTransactionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
+ virtual void changed(U32 mask);
+
+protected:
+ typedef std::vector<LLUUID> folder_ref_t;
+ typedef std::vector<LLUUID> item_ref_t;
+ virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
+
+ LLTransactionID mTransactionID;
+};
+
+
+#endif // LL_LLINVENTORYOBSERVERS_H
+
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
new file mode 100644
index 0000000000..048ed10886
--- /dev/null
+++ b/indra/newview/llinventorypanel.cpp
@@ -0,0 +1,985 @@
+/*
+ * @file llinventorypanel.cpp
+ * @brief Implementation of the inventory panel and associated stuff.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llinventorypanel.h"
+
+#include <utility> // for std::pair<>
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llfloaterinventory.h"
+#include "llfloaterreg.h"
+#include "llimfloater.h"
+#include "llimview.h"
+#include "llinventorybridge.h"
+#include "llsidepanelinventory.h"
+#include "llsidetray.h"
+#include "llscrollcontainer.h"
+#include "llviewerfoldertype.h"
+#include "llvoavatarself.h"
+
+static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
+
+const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
+const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
+const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
+static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryPanelObserver
+//
+// Bridge to support knowing when the inventory has changed.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryPanelObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
+ virtual ~LLInventoryPanelObserver() {}
+ virtual void changed(U32 mask)
+ {
+ mIP->modelChanged(mask);
+ }
+protected:
+ LLInventoryPanel* mIP;
+};
+
+LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
+ LLPanel(p),
+ mInventoryObserver(NULL),
+ mFolders(NULL),
+ mScroller(NULL),
+ mSortOrderSetting(p.sort_order_setting),
+ mInventory(p.inventory),
+ mAllowMultiSelect(p.allow_multi_select),
+ mViewsInitialized(false),
+ mStartFolderString(p.start_folder),
+ mBuildDefaultHierarchy(true),
+ mInvFVBridgeBuilder(NULL)
+{
+ mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
+
+ // contex menu callbacks
+ mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
+ 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(&LLInventoryPanel::doCreate, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
+
+ if (mStartFolderString != "")
+ {
+ mBuildDefaultHierarchy = false;
+ }
+}
+
+BOOL LLInventoryPanel::postBuild()
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
+
+ mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+
+ // Create root folder
+ {
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+ LLFolderView::Params p;
+ p.name = getName();
+ p.rect = folder_rect;
+ p.parent_panel = this;
+ p.tool_tip = p.name;
+ mFolders = LLUICtrlFactory::create<LLFolderView>(p);
+ mFolders->setAllowMultiSelect(mAllowMultiSelect);
+ }
+
+ mCommitCallbackRegistrar.popScope();
+
+ mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+ // Scroller
+ {
+ LLRect scroller_view_rect = getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params p;
+ p.name("Inventory Scroller");
+ p.rect(scroller_view_rect);
+ p.follows.flags(FOLLOWS_ALL);
+ p.reserve_scroll_corner(true);
+ p.tab_stop(true);
+ mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ addChild(mScroller);
+ mScroller->addChild(mFolders);
+ mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
+ }
+
+ // Set up the callbacks from the inventory we're viewing, and then build everything.
+ mInventoryObserver = new LLInventoryPanelObserver(this);
+ mInventory->addObserver(mInventoryObserver);
+
+ // Build view of inventory if we need default full hierarchy and inventory ready,
+ // otherwise wait for idle callback.
+ if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mViewsInitialized)
+ {
+ initializeViews();
+ }
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
+
+ if (mSortOrderSetting != INHERIT_SORT_ORDER)
+ {
+ setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
+ }
+ else
+ {
+ setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
+ }
+ mFolders->setSortOrder(getFilter()->getSortOrder());
+
+ return TRUE;
+}
+
+LLInventoryPanel::~LLInventoryPanel()
+{
+ if (mFolders)
+ {
+ U32 sort_order = mFolders->getSortOrder();
+ if (mSortOrderSetting != INHERIT_SORT_ORDER)
+ {
+ gSavedSettings.setU32(mSortOrderSetting, sort_order);
+ }
+ }
+
+ // LLView destructor will take care of the sub-views.
+ mInventory->removeObserver(mInventoryObserver);
+ delete mInventoryObserver;
+ mScroller = NULL;
+}
+
+void LLInventoryPanel::draw()
+{
+ // Select the desired item (in case it wasn't loaded when the selection was requested)
+ mFolders->updateSelection();
+ LLPanel::draw();
+}
+
+LLInventoryFilter* LLInventoryPanel::getFilter()
+{
+ if (mFolders)
+ {
+ return mFolders->getFilter();
+ }
+ return NULL;
+}
+
+void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)
+{
+ if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT)
+ getFilter()->setFilterObjectTypes(types);
+ if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY)
+ getFilter()->setFilterCategoryTypes(types);
+}
+
+void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
+{
+ getFilter()->setFilterPermissions(filter_perm_mask);
+}
+
+void LLInventoryPanel::setFilterSubString(const std::string& string)
+{
+ getFilter()->setFilterSubString(string);
+}
+
+void LLInventoryPanel::setSortOrder(U32 order)
+{
+ getFilter()->setSortOrder(order);
+ if (getFilter()->isModified())
+ {
+ mFolders->setSortOrder(order);
+ // try to keep selection onscreen, even if it wasn't to start with
+ mFolders->scrollToShowSelection();
+ }
+}
+
+void LLInventoryPanel::setSinceLogoff(BOOL sl)
+{
+ getFilter()->setDateRangeLastLogoff(sl);
+}
+
+void LLInventoryPanel::setHoursAgo(U32 hours)
+{
+ getFilter()->setHoursAgo(hours);
+}
+
+void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
+{
+ getFilter()->setShowFolderState(show);
+}
+
+LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
+{
+ return getFilter()->getShowFolderState();
+}
+
+void LLInventoryPanel::modelChanged(U32 mask)
+{
+ static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
+ LLFastTimer t2(FTM_REFRESH);
+
+ bool handled = false;
+
+ if (!mViewsInitialized) return;
+
+ const LLInventoryModel* model = getModel();
+ if (!model) return;
+
+ const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
+ if (changed_items.empty()) return;
+
+ for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+ items_iter != changed_items.end();
+ ++items_iter)
+ {
+ const LLUUID& item_id = (*items_iter);
+ const LLInventoryObject* model_item = model->getObject(item_id);
+ LLFolderViewItem* view_item = mFolders->getItemByID(item_id);
+ LLFolderViewFolder* view_folder = mFolders->getFolderByID(item_id);
+
+ //////////////////////////////
+ // LABEL Operation
+ // Empty out the display name for relabel.
+ if (mask & LLInventoryObserver::LABEL)
+ {
+ handled = true;
+ if (view_item)
+ {
+ // Request refresh on this item (also flags for filtering)
+ LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getListener();
+ if(bridge)
+ { // Clear the display name first, so it gets properly re-built during refresh()
+ bridge->clearDisplayName();
+
+ view_item->refresh();
+
+ // Set the new tooltip with the new display name.
+ view_item->setToolTip(bridge->getDisplayName());
+ }
+ }
+ }
+
+ //////////////////////////////
+ // REBUILD Operation
+ // Destroy and regenerate the UI.
+ if (mask & LLInventoryObserver::REBUILD)
+ {
+ handled = true;
+ if (model_item && view_item)
+ {
+ view_item->destroyView();
+ }
+ buildNewViews(item_id);
+ }
+
+ //////////////////////////////
+ // INTERNAL Operation
+ // This could be anything. For now, just refresh the item.
+ if (mask & LLInventoryObserver::INTERNAL)
+ {
+ if (view_item)
+ {
+ view_item->refresh();
+ }
+ }
+
+ //////////////////////////////
+ // SORT Operation
+ // Sort the folder.
+ if (mask & LLInventoryObserver::SORT)
+ {
+ if (view_folder)
+ {
+ view_folder->requestSort();
+ }
+ }
+
+ // We don't typically care which of these masks the item is actually flagged with, since the masks
+ // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+ // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+ // panel). What's relevant is that the item and UI are probably out of sync and thus need to be
+ // resynchronized.
+ if (mask & (LLInventoryObserver::STRUCTURE |
+ LLInventoryObserver::ADD |
+ LLInventoryObserver::REMOVE))
+ {
+ handled = true;
+
+ //////////////////////////////
+ // ADD Operation
+ // Item exists in memory but a UI element hasn't been created for it.
+ if (model_item && !view_item)
+ {
+ // Add the UI element for this item.
+ buildNewViews(item_id);
+ // Select any newly created object that has the auto rename at top of folder root set.
+ if(mFolders->getRoot()->needsAutoRename())
+ {
+ setSelection(item_id, FALSE);
+ }
+ }
+
+ //////////////////////////////
+ // STRUCTURE Operation
+ // This item already exists in both memory and UI. It was probably reparented.
+ if (model_item && view_item)
+ {
+ // Don't process the item if it's hanging from the root, since its
+ // model_item's parent will be NULL.
+ if (view_item->getRoot() != view_item->getParent())
+ {
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+ // Item has been moved.
+ if (view_item->getParentFolder() != new_parent)
+ {
+ if (new_parent != NULL)
+ {
+ // Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+ view_item->getParentFolder()->extractItem(view_item);
+ view_item->addToFolder(new_parent, mFolders);
+ }
+ else
+ {
+ // Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that
+ // doesn't include trash). Just remove the item's UI.
+ view_item->destroyView();
+ }
+ }
+ }
+ }
+
+ //////////////////////////////
+ // REMOVE Operation
+ // This item has been removed from memory, but its associated UI element still exists.
+ if (!model_item && view_item)
+ {
+ // Remove the item's UI.
+ view_item->destroyView();
+ }
+ }
+ }
+}
+
+// static
+void LLInventoryPanel::onIdle(void *userdata)
+{
+ if (!gInventory.isInventoryUsable())
+ return;
+
+ LLInventoryPanel *self = (LLInventoryPanel*)userdata;
+ // Inventory just initialized, do complete build
+ if (!self->mViewsInitialized)
+ {
+ self->initializeViews();
+ }
+ if (self->mViewsInitialized)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, (void*)self);
+ }
+}
+
+void LLInventoryPanel::initializeViews()
+{
+ if (!gInventory.isInventoryUsable()) return;
+
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+
+ if ("LIBRARY" == mStartFolderString)
+ {
+ mStartFolderID = gInventory.getLibraryRootFolderID();
+ }
+ else
+ {
+ mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+ }
+ rebuildViewsFor(mStartFolderID);
+
+ mViewsInitialized = true;
+
+ openStartFolderOrMyInventory();
+
+ // Special case for new user login
+ if (gAgent.isFirstLogin())
+ {
+ // Auto open the user's library
+ LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID());
+ if (lib_folder)
+ {
+ lib_folder->setOpen(TRUE);
+ }
+
+ // Auto close the user's my inventory folder
+ LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID());
+ if (my_inv_folder)
+ {
+ my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
+ }
+ }
+}
+
+void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+{
+ // Destroy the old view for this ID so we can rebuild it.
+ LLFolderViewItem* old_view = mFolders->getItemByID(id);
+ if (old_view && id.notNull())
+ {
+ old_view->destroyView();
+ }
+
+ buildNewViews(id);
+}
+
+void LLInventoryPanel::buildNewViews(const LLUUID& id)
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
+ LLFolderViewItem* itemp = NULL;
+ LLInventoryObject* objectp = gInventory.getObject(id);
+ if (objectp)
+ {
+ const LLUUID &parent_id = objectp->getParentUUID();
+ LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
+ if (id == mStartFolderID)
+ {
+ parent_folder = mFolders;
+ }
+ else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID)))
+ {
+ // This item exists outside the inventory's hierarchy, so don't add it.
+ return;
+ }
+
+ if (objectp->getType() <= LLAssetType::AT_NONE ||
+ objectp->getType() >= LLAssetType::AT_COUNT)
+ {
+ llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
+ << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
+ << llendl;
+ return;
+ }
+
+ if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
+ (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
+ {
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+ objectp->getType(),
+ LLInventoryType::IT_CATEGORY,
+ this,
+ objectp->getUUID());
+
+ if (new_listener)
+ {
+ LLFolderViewFolder::Params params;
+ params.name = new_listener->getDisplayName();
+ params.icon = new_listener->getIcon();
+ params.icon_open = new_listener->getOpenIcon();
+ params.root = mFolders;
+ params.listener = new_listener;
+ params.tool_tip = params.name;
+ LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(params);
+ folderp->setItemSortOrder(mFolders->getSortOrder());
+ itemp = folderp;
+
+ // Hide the root folder, so we can show the contents of a folder flat
+ // but still have the parent folder present for listener-related operations.
+ if (id == mStartFolderID)
+ {
+ folderp->setHidden(TRUE);
+ }
+ const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp);
+ if (cat && getIsHiddenFolderType(cat->getPreferredType()))
+ {
+ folderp->setHidden(TRUE);
+ }
+ }
+ }
+ else
+ {
+ // Build new view for item.
+ LLInventoryItem* item = (LLInventoryItem*)objectp;
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+ item->getActualType(),
+ item->getInventoryType(),
+ this,
+ item->getUUID(),
+ item->getFlags());
+
+ if (new_listener)
+ {
+ LLFolderViewItem::Params params;
+ params.name = new_listener->getDisplayName();
+ params.icon = new_listener->getIcon();
+ params.icon_open = new_listener->getOpenIcon();
+ params.creation_date = new_listener->getCreationDate();
+ params.root = mFolders;
+ params.listener = new_listener;
+ params.rect = LLRect (0, 0, 0, 0);
+ params.tool_tip = params.name;
+ itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
+ }
+ }
+
+ if (itemp)
+ {
+ itemp->addToFolder(parent_folder, mFolders);
+
+ // Don't add children of hidden folders unless this is the panel's root folder.
+ if (itemp->getHidden() && (id != mStartFolderID))
+ {
+ return;
+ }
+ }
+ }
+
+ // If this is a folder, add the children of the folder and recursively add any
+ // child folders.
+ if ((id == mStartFolderID) ||
+ (objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
+ {
+ LLViewerInventoryCategory::cat_array_t* categories;
+ LLViewerInventoryItem::item_array_t* items;
+ mInventory->lockDirectDescendentArrays(id, categories, items);
+
+ if(categories)
+ {
+ for (LLViewerInventoryCategory::cat_array_t::const_iterator cat_iter = categories->begin();
+ cat_iter != categories->end();
+ ++cat_iter)
+ {
+ const LLViewerInventoryCategory* cat = (*cat_iter);
+ buildNewViews(cat->getUUID());
+ }
+ }
+
+ if(items)
+ {
+ for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
+ item_iter != items->end();
+ ++item_iter)
+ {
+ const LLViewerInventoryItem* item = (*item_iter);
+ buildNewViews(item->getUUID());
+ }
+ }
+ mInventory->unlockDirectDescendentArrays(id);
+ }
+}
+
+// bit of a hack to make sure the inventory is open.
+void LLInventoryPanel::openStartFolderOrMyInventory()
+{
+ if (mStartFolderString != "")
+ {
+ mFolders->openFolder(mStartFolderString);
+ }
+ else
+ {
+ // Find My Inventory folder and open it up by name
+ for (LLView *child = mFolders->getFirstChild(); child; child = mFolders->findNextSibling(child))
+ {
+ LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
+ if (fchild && fchild->getListener() &&
+ (fchild->getListener()->getUUID() == gInventory.getRootFolderID()))
+ {
+ const std::string& child_name = child->getName();
+ mFolders->openFolder(child_name);
+ break;
+ }
+ }
+ }
+}
+
+void LLInventoryPanel::openSelected()
+{
+ LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
+ if(!folder_item) return;
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
+ if(!bridge) return;
+ bridge->openItem();
+}
+
+BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLView::handleHover(x, y, mask);
+ if(handled)
+ {
+ ECursorType cursor = getWindow()->getCursor();
+ if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
+ {
+ // replace arrow cursor with arrow and hourglass cursor
+ getWindow()->setCursor(UI_CURSOR_WORKING);
+ }
+ }
+ else
+ {
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+ }
+ return TRUE;
+}
+
+BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+ // If folder view is empty the (x, y) point won't be in its rect
+ // so the handler must be called explicitly.
+ if (!mFolders->hasVisibleChildren())
+ {
+ handled = mFolders->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ if (handled)
+ {
+ mFolders->setDragAndDropThisFrame();
+ }
+
+ return handled;
+}
+
+void LLInventoryPanel::onFocusLost()
+{
+ // inventory no longer handles cut/copy/paste/delete
+ if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+
+ LLPanel::onFocusLost();
+}
+
+void LLInventoryPanel::onFocusReceived()
+{
+ // inventory now handles cut/copy/paste/delete
+ LLEditMenuHandler::gEditMenuHandler = mFolders;
+
+ LLPanel::onFocusReceived();
+}
+
+void LLInventoryPanel::openAllFolders()
+{
+ mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+ mFolders->arrangeAll();
+}
+
+void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
+{
+ // Don't select objects in COF (e.g. to prevent refocus when items are worn).
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
+ {
+ return;
+ }
+ mFolders->setSelectionByID(obj_id, take_keyboard_focus);
+}
+
+void LLInventoryPanel::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+{
+ if (mFolders)
+ {
+ mFolders->setSelectCallback(cb);
+ }
+}
+
+void LLInventoryPanel::clearSelection()
+{
+ mFolders->clearSelection();
+}
+
+void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+ LLFolderView* fv = getRootFolder();
+ if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
+ {
+ fv->setNeedsAutoRename(FALSE);
+ if (items.size()) // new asset is visible and selected
+ {
+ fv->startRenamingSelectedItem();
+ }
+ }
+ // Seraph - Put determineFolderType in here for ensemble typing?
+}
+
+void LLInventoryPanel::doToSelected(const LLSD& userdata)
+{
+ mFolders->doToSelected(&gInventory, userdata);
+}
+
+void LLInventoryPanel::doCreate(const LLSD& userdata)
+{
+ menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
+}
+
+bool LLInventoryPanel::beginIMSession()
+{
+ std::set<LLUUID> selected_items;
+ mFolders->getSelectionList(selected_items);
+
+ std::string name;
+ static int session_num = 1;
+
+ LLDynamicArray<LLUUID> members;
+ EInstantMessage type = IM_SESSION_CONFERENCE_START;
+
+ std::set<LLUUID>::const_iterator iter;
+ for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
+ {
+
+ LLUUID item = *iter;
+ LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+
+ if(folder_item)
+ {
+ LLFolderViewEventListener* fve_listener = folder_item->getListener();
+ if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
+ {
+
+ LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
+ if(!bridge) return true;
+ LLViewerInventoryCategory* cat = bridge->getCategory();
+ if(!cat) return true;
+ name = cat->getName();
+ LLUniqueBuddyCollector is_buddy;
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendentsIf(bridge->getUUID(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_buddy);
+ S32 count = item_array.count();
+ if(count > 0)
+ {
+ //*TODO by what to replace that?
+ //LLFloaterReg::showInstance("communicate");
+
+ // create the session
+ LLAvatarTracker& at = LLAvatarTracker::instance();
+ LLUUID id;
+ for(S32 i = 0; i < count; ++i)
+ {
+ id = item_array.get(i)->getCreatorUUID();
+ if(at.isBuddyOnline(id))
+ {
+ members.put(id);
+ }
+ }
+ }
+ }
+ else
+ {
+ LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+ if(!folder_item) return true;
+ LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
+
+ if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
+ {
+ LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
+
+ if (inv_item)
+ {
+ LLAvatarTracker& at = LLAvatarTracker::instance();
+ LLUUID id = inv_item->getCreatorUUID();
+
+ if(at.isBuddyOnline(id))
+ {
+ members.put(id);
+ }
+ }
+ } //if IT_CALLINGCARD
+ } //if !IT_CATEGORY
+ }
+ } //for selected_items
+
+ // the session_id is randomly generated UUID which will be replaced later
+ // with a server side generated number
+
+ if (name.empty())
+ {
+ name = llformat("Session %d", session_num++);
+ }
+
+ LLUUID session_id = gIMMgr->addSession(name, type, members[0], members);
+ if (session_id != LLUUID::null)
+ {
+ LLIMFloater::show(session_id);
+ }
+
+ return true;
+}
+
+bool LLInventoryPanel::attachObject(const LLSD& userdata)
+{
+ std::set<LLUUID> selected_items;
+ mFolders->getSelectionList(selected_items);
+
+ std::string joint_name = userdata.asString();
+ LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
+ LLViewerJointAttachment* attachmentp = NULL;
+ for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
+ iter != avatarp->mAttachmentPoints.end(); )
+ {
+ LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+ LLViewerJointAttachment* attachment = curiter->second;
+ if (attachment->getName() == joint_name)
+ {
+ attachmentp = attachment;
+ break;
+ }
+ }
+ if (attachmentp == NULL)
+ {
+ return true;
+ }
+
+ for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin();
+ set_iter != selected_items.end();
+ ++set_iter)
+ {
+ const LLUUID &id = *set_iter;
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
+ if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
+ {
+ rez_attachment(item, attachmentp);
+ }
+ else if(item && item->isComplete())
+ {
+ // must be in library. copy it to our inventory and put it on.
+ LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
+ copy_inventory_item(gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ LLUUID::null,
+ std::string(),
+ cb);
+ }
+ }
+ gFocusMgr.setKeyboardFocus(NULL);
+
+ return true;
+}
+
+BOOL LLInventoryPanel::getSinceLogoff()
+{
+ return getFilter()->isSinceLogoff();
+}
+
+// DEBUG ONLY
+// static
+void LLInventoryPanel::dumpSelectionInformation(void* user_data)
+{
+ LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
+ iv->mFolders->dumpSelectionInformation();
+}
+
+BOOL is_inventorysp_active()
+{
+ if (!LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")) return FALSE;
+ LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ if (!inventorySP) return FALSE;
+ return inventorySP->isMainInventoryPanelActive();
+}
+
+// static
+LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
+{
+ // A. If the inventory side panel is open, use that preferably.
+ if (is_inventorysp_active())
+ {
+ LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ if (inventorySP)
+ {
+ return inventorySP->getActivePanel();
+ }
+ }
+
+ // B. Iterate through the inventory floaters and return whichever is on top.
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ S32 z_min = S32_MAX;
+ LLInventoryPanel* res = NULL;
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
+ if (iv && iv->getVisible())
+ {
+ S32 z_order = gFloaterView->getZOrder(iv);
+ if (z_order < z_min)
+ {
+ res = iv->getPanel();
+ z_min = z_order;
+ }
+ }
+ }
+ if (res) return res;
+
+ // C. If no panels are open and we don't want to force open a panel, then just abort out.
+ if (!auto_open) return NULL;
+
+ // D. Open the inventory side panel and use that.
+ LLSD key;
+ LLSidepanelInventory *sidepanel_inventory =
+ dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
+ if (sidepanel_inventory)
+ {
+ return sidepanel_inventory->getActivePanel();
+ }
+
+ return NULL;
+}
+
+void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
+{
+ if (!getIsHiddenFolderType(folder_type))
+ {
+ mHiddenFolderTypes.push_back(folder_type);
+ }
+}
+
+BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
+{
+ return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end());
+}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
new file mode 100644
index 0000000000..f312b588b9
--- /dev/null
+++ b/indra/newview/llinventorypanel.h
@@ -0,0 +1,226 @@
+/**
+ * @file llinventorypanel.h
+ * @brief LLInventoryPanel
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYPANEL_H
+#define LL_LLINVENTORYPANEL_H
+
+#include "llassetstorage.h"
+#include "lldarray.h"
+#include "llfloater.h"
+#include "llinventory.h"
+#include "llinventoryfilter.h"
+#include "llfolderview.h"
+#include "llinventorymodel.h"
+#include "lluictrlfactory.h"
+#include <set>
+
+class LLFolderViewItem;
+class LLInventoryFilter;
+class LLInventoryModel;
+class LLInvFVBridge;
+class LLInventoryFVBridgeBuilder;
+class LLMenuBarGL;
+class LLCheckBoxCtrl;
+class LLSpinCtrl;
+class LLScrollContainer;
+class LLTextBox;
+class LLIconCtrl;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+
+class LLInventoryPanel : public LLPanel
+{
+ //--------------------------------------------------------------------
+ // Data
+ //--------------------------------------------------------------------
+public:
+ static const std::string DEFAULT_SORT_ORDER;
+ static const std::string RECENTITEMS_SORT_ORDER;
+ static const std::string INHERIT_SORT_ORDER;
+
+ struct Filter : public LLInitParam::Block<Filter>
+ {
+ Optional<U32> sort_order;
+ Optional<U32> types;
+ Optional<std::string> search_string;
+
+ Filter()
+ : sort_order("sort_order"),
+ types("types", 0xffffffff),
+ search_string("search_string")
+ {}
+ };
+
+ struct Params
+ : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Optional<std::string> sort_order_setting;
+ Optional<LLInventoryModel*> inventory;
+ Optional<bool> allow_multi_select;
+ Optional<Filter> filter;
+ Optional<std::string> start_folder;
+
+ Params()
+ : sort_order_setting("sort_order_setting"),
+ inventory("", &gInventory),
+ allow_multi_select("allow_multi_select", true),
+ filter("filter"),
+ start_folder("start_folder")
+ {}
+ };
+
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
+protected:
+ LLInventoryPanel(const Params&);
+ friend class LLUICtrlFactory;
+public:
+ virtual ~LLInventoryPanel();
+
+public:
+ LLInventoryModel* getModel() { return mInventory; }
+
+ BOOL postBuild();
+
+ // LLView methods
+ void draw();
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+ // LLUICtrl methods
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
+ // Call this method to set the selection.
+ void openAllFolders();
+ void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
+ void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+ void clearSelection();
+ LLInventoryFilter* getFilter();
+ void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
+ U32 getFilterObjectTypes() const { return mFolders->getFilterObjectTypes(); }
+ void setFilterPermMask(PermissionMask filter_perm_mask);
+ U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }
+ void setFilterSubString(const std::string& string);
+ const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
+ void setSortOrder(U32 order);
+ U32 getSortOrder() { return mFolders->getSortOrder(); }
+ void setSinceLogoff(BOOL sl);
+ void setHoursAgo(U32 hours);
+ BOOL getSinceLogoff();
+
+ void setShowFolderState(LLInventoryFilter::EFolderShow show);
+ LLInventoryFilter::EFolderShow getShowFolderState();
+ void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); }
+ // This method is called when something has changed about the inventory.
+ void modelChanged(U32 mask);
+ LLFolderView* getRootFolder() { return mFolders; }
+ LLScrollContainer* getScrollableContainer() { return mScroller; }
+
+ void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+
+ // Callbacks
+ void doToSelected(const LLSD& userdata);
+ void doCreate(const LLSD& userdata);
+ bool beginIMSession();
+ bool attachObject(const LLSD& userdata);
+
+ // DEBUG ONLY:
+ static void dumpSelectionInformation(void* user_data);
+
+ void openSelected();
+ void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); }
+
+ static void onIdle(void* user_data);
+
+ // Find whichever inventory panel is active / on top.
+ // "Auto_open" determines if we open an inventory panel if none are open.
+ static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE);
+
+protected:
+ void openStartFolderOrMyInventory(); // open the first level of inventory
+
+ LLInventoryModel* mInventory;
+ LLInventoryObserver* mInventoryObserver;
+ BOOL mAllowMultiSelect;
+ std::string mSortOrderSetting;
+
+ LLFolderView* mFolders;
+ LLScrollContainer* mScroller;
+
+ /**
+ * Pointer to LLInventoryFVBridgeBuilder.
+ *
+ * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with
+ * another implementation.
+ * Take into account it will not be deleted by LLInventoryPanel itself.
+ */
+ const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
+
+ //--------------------------------------------------------------------
+ // Hidden folders
+ //--------------------------------------------------------------------
+public:
+ void addHideFolderType(LLFolderType::EType folder_type);
+protected:
+ BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
+private:
+ std::vector<LLFolderType::EType> mHiddenFolderTypes;
+
+ //--------------------------------------------------------------------
+ // Initialization routines for building up the UI ("views")
+ //--------------------------------------------------------------------
+public:
+ BOOL getIsViewsInitialized() const { return mViewsInitialized; }
+ const LLUUID& getStartFolderID() const { return mStartFolderID; }
+ const std::string& getStartFolderString() { return mStartFolderString; }
+protected:
+ // Builds the UI. Call this once the inventory is usable.
+ void initializeViews();
+ void rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
+ virtual void buildNewViews(const LLUUID& id);
+private:
+ BOOL mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
+ BOOL mViewsInitialized; // Views have been generated
+ // UUID of category from which hierarchy should be built. Set with the
+ // "start_folder" xml property. Default is LLUUID::null that means total Inventory hierarchy.
+ std::string mStartFolderString;
+ LLUUID mStartFolderID;
+};
+
+#endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 4fd3b7bddc..2cc5c8335d 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -134,16 +134,33 @@ void LLJoystick::updateSlop()
return;
}
+bool LLJoystick::pointInCircle(S32 x, S32 y) const
+{
+ if(this->getLocalRect().getHeight() != this->getLocalRect().getWidth())
+ {
+ llwarns << "Joystick shape is not square"<<llendl;
+ return true;
+ }
+ //center is x and y coordinates of center of joystick circle, and also its radius
+ int center = this->getLocalRect().getHeight()/2;
+ bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
+ return in_circle;
+}
BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
{
//llinfos << "joystick mouse down " << x << ", " << y << llendl;
+ bool handles = false;
- mLastMouse.set(x, y);
- mFirstMouse.set(x, y);
+ if(pointInCircle(x, y))
+ {
+ mLastMouse.set(x, y);
+ mFirstMouse.set(x, y);
+ mMouseDownTimer.reset();
+ handles = LLButton::handleMouseDown(x, y, mask);
+ }
- mMouseDownTimer.reset();
- return LLButton::handleMouseDown(x, y, mask);
+ return handles;
}
@@ -517,43 +534,52 @@ void LLJoystickCameraRotate::draw()
LLGLSUIDefault gls_ui;
getImageUnselected()->draw( 0, 0 );
+ LLPointer<LLUIImage> image = getImageSelected();
if( mInTop )
{
- drawRotatedImage( getImageSelected()->getImage(), 0 );
+ drawRotatedImage( getImageSelected(), 0 );
}
if( mInRight )
{
- drawRotatedImage( getImageSelected()->getImage(), 1 );
+ drawRotatedImage( getImageSelected(), 1 );
}
if( mInBottom )
{
- drawRotatedImage( getImageSelected()->getImage(), 2 );
+ drawRotatedImage( getImageSelected(), 2 );
}
if( mInLeft )
{
- drawRotatedImage( getImageSelected()->getImage(), 3 );
+ drawRotatedImage( getImageSelected(), 3 );
}
}
// Draws image rotated by multiples of 90 degrees
-void LLJoystickCameraRotate::drawRotatedImage( LLTexture* image, S32 rotations )
+void LLJoystickCameraRotate::drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations )
{
S32 width = image->getWidth();
S32 height = image->getHeight();
-
+ LLTexture* texture = image->getImage();
+
+ /*
+ * Scale texture coordinate system
+ * to handle the different between image size and size of texture.
+ * If we will use default matrix,
+ * it may break texture mapping after rotation.
+ * see EXT-2023 Camera floater: arrows became shifted when pressed.
+ */
F32 uv[][2] =
{
- { 1.f, 1.f },
- { 0.f, 1.f },
+ { (F32)width/texture->getWidth(), (F32)height/texture->getHeight() },
+ { 0.f, (F32)height/texture->getHeight() },
{ 0.f, 0.f },
- { 1.f, 0.f }
+ { (F32)width/texture->getWidth(), 0.f }
};
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(texture);
gGL.color4fv(UI_VERTEX_COLOR.mV);
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 8caef30fa4..2b071a8999 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -78,6 +78,14 @@ public:
static void onBtnHeldDown(void *userdata); // called by llbutton callback handler
void setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; };
+
+ /**
+ * Checks if click location is inside joystick circle.
+ *
+ * Image containing circle is square and this square has adherent points with joystick
+ * circle. Make sure to change method according to shape other than square.
+ */
+ bool pointInCircle(S32 x, S32 y) const;
static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
static EJoystickQuadrant quadrantFromName(const std::string& name);
@@ -150,7 +158,7 @@ public:
protected:
F32 getOrbitRate();
virtual void updateSlop();
- void drawRotatedImage( LLTexture* image, S32 rotations );
+ void drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations );
protected:
BOOL mInLeft;
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 091346d3b4..f25d2ef574 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -38,8 +38,9 @@
#include "llinventory.h"
#include "lllandmark.h"
#include "llparcel.h"
+#include "llregionhandle.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llagent.h"
#include "llagentui.h"
@@ -49,6 +50,7 @@
#include "llstring.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
+#include "llworldmapmessage.h"
#include "llviewerwindow.h"
#include "llwindow.h"
#include "llworldmap.h"
@@ -133,13 +135,39 @@ public:
}
};
+// Returns true if the given inventory item is a landmark pointing to the current parcel.
+// Used to find out if there is at least one landmark from current parcel.
+class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor
+{
+private:
+ bool mFounded;// to avoid unnecessary check
+
+public:
+ LLFirstAgentParcelLandmark(): mFounded(false){}
+
+ /*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if (mFounded || !item || item->getType() != LLAssetType::AT_LANDMARK)
+ return false;
+
+ LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID());
+ if (!landmark) // the landmark not been loaded yet
+ return false;
+
+ LLVector3d landmark_global_pos;
+ if (!landmark->getGlobalPos(landmark_global_pos))
+ return false;
+ mFounded = LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos);
+ return mFounded;
+ }
+};
+
static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
LLInventoryModel::item_array_t& items,
LLInventoryCollectFunctor& add)
{
// Look in "My Favorites"
- LLUUID favorites_folder_id =
- gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ const LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
gInventory.collectDescendentsIf(favorites_folder_id,
cats,
items,
@@ -147,8 +175,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
add);
// Look in "Landmarks"
- LLUUID landmarks_folder_id =
- gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLUUID landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
gInventory.collectDescendentsIf(landmarks_folder_id,
cats,
items,
@@ -172,6 +199,16 @@ bool LLLandmarkActions::landmarkAlreadyExists()
return findLandmarkForAgentPos() != NULL;
}
+//static
+bool LLLandmarkActions::hasParcelLandmark()
+{
+ LLFirstAgentParcelLandmark get_first_agent_landmark;
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ fetch_landmarks(cats, items, get_first_agent_landmark);
+ return !items.empty();
+
+}
// *TODO: This could be made more efficient by only fetching the FIRST
// landmark that meets the criteria
@@ -231,7 +268,7 @@ void LLLandmarkActions::createLandmarkHere(
}
if (!canCreateLandmarkHere())
{
- LLNotifications::instance().add("CannotCreateLandmarkNotOwner");
+ LLNotificationsUtil::add("CannotCreateLandmarkNotOwner");
return;
}
@@ -250,7 +287,7 @@ void LLLandmarkActions::createLandmarkHere()
LLAgentUI::buildLocationString(landmark_name, LLAgentUI::LOCATION_FORMAT_LANDMARK);
LLAgentUI::buildLocationString(landmark_desc, LLAgentUI::LOCATION_FORMAT_FULL);
- LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
createLandmarkHere(landmark_name, landmark_desc, folder_id);
}
@@ -270,13 +307,13 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur
{
U64 new_region_handle = to_region_handle(global_pos);
- LLWorldMap::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL,
+ LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL,
cb,
global_pos,
escaped,
_2);
- LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
+ LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
}
}
@@ -287,18 +324,19 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl
if (sim_infop)
{
LLVector3 pos = sim_infop->getLocalPos(global_pos);
- cb(sim_infop->mName, llround(pos.mV[VX]), llround(pos.mV[VY]));
+ std::string name = sim_infop->getName() ;
+ cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]),llround(pos.mV[VZ]));
}
else
{
U64 new_region_handle = to_region_handle(global_pos);
- LLWorldMap::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseNameAndCoords,
+ LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseNameAndCoords,
cb,
global_pos,
_1);
- LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
+ LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
}
}
@@ -330,28 +368,41 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal
if (sim_infop)
{
LLVector3 local_pos = sim_infop->getLocalPos(global_pos);
- cb(sim_infop->mName, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]));
+ std::string name = sim_infop->getName() ;
+ cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]), llround(local_pos.mV[VZ]));
}
}
bool LLLandmarkActions::getLandmarkGlobalPos(const LLUUID& landmarkInventoryItemID, LLVector3d& posGlobal)
{
- LLLandmark* landmark = LLLandmarkActions::getLandmark(landmarkInventoryItemID);
+ LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
+ if (NULL == item)
+ return false;
+
+ const LLUUID& asset_id = item->getAssetUUID();
+ LLLandmark* landmark = gLandmarkList.getAsset(asset_id, NULL);
if (NULL == landmark)
return false;
return landmark->getGlobalPos(posGlobal);
}
-LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID)
+LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb)
{
LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
if (NULL == item)
return NULL;
const LLUUID& asset_id = item->getAssetUUID();
- return gLandmarkList.getAsset(asset_id, NULL);
+
+ LLLandmark* landmark = gLandmarkList.getAsset(asset_id, cb);
+ if (landmark)
+ {
+ return landmark;
+ }
+
+ return NULL;
}
void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItemID)
@@ -370,5 +421,5 @@ void copy_slurl_to_clipboard_callback(const std::string& slurl)
gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl));
LLSD args;
args["SLURL"] = slurl;
- LLNotifications::instance().add("CopySLURL", args);
+ LLNotificationsUtil::add("CopySLURL", args);
}
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 32f05e702b..987caf0936 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -35,7 +35,10 @@
#include "llinventorymodel.h"
+#include "lllandmarklist.h"
+
class LLLandmark;
+
/**
* @brief Provides helper functions to manage landmarks
*/
@@ -43,16 +46,21 @@ class LLLandmarkActions
{
public:
typedef boost::function<void(std::string& slurl)> slurl_callback_t;
- typedef boost::function<void(std::string& slurl, S32 x, S32 y)> region_name_and_coords_callback_t;
+ typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t;
/**
* @brief Fetches landmark LLViewerInventoryItems for the given landmark name.
*/
static LLInventoryModel::item_array_t fetchLandmarksByName(std::string& name, BOOL if_use_substring);
/**
- * @brief Checks whether landmark exists for current parcel.
+ * @brief Checks whether landmark exists for current agent position.
*/
static bool landmarkAlreadyExists();
+
+ /**
+ * @brief Checks whether landmark exists for current agent parcel.
+ */
+ static bool hasParcelLandmark();
/**
* @brief Searches landmark for global position.
@@ -107,10 +115,11 @@ public:
/**
* @brief Retrieve a landmark from gLandmarkList by inventory item's id
+ * If a landmark is not currently in the gLandmarkList a callback "cb" is called when it is loaded.
*
* @return pointer to loaded landmark from gLandmarkList or NULL if landmark does not exist or wasn't loaded.
*/
- static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID);
+ static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = NULL);
/**
* @brief Performs standard action of copying of SLURL from landmark to user's clipboard.
diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index 83e694951b..ce84474c05 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -39,7 +39,6 @@
#include "llappviewer.h"
#include "llagent.h"
-#include "llnotify.h"
#include "llvfile.h"
#include "llviewerstats.h"
@@ -60,6 +59,13 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t
LLLandmark* landmark = get_ptr_in_map(mList, asset_uuid);
if(landmark)
{
+ LLVector3d dummy;
+ if(cb && !landmark->getGlobalPos(dummy))
+ {
+ // landmark is not completely loaded yet
+ loaded_callback_map_t::value_type vt(asset_uuid, cb);
+ mLoadedCallbackMap.insert(vt);
+ }
return landmark;
}
else
@@ -146,12 +152,12 @@ void LLLandmarkList::processGetAssetReply(
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )
{
LL_WARNS("Landmarks") << "Missing Landmark" << LL_ENDL;
- //LLNotifications::instance().add("LandmarkMissing");
+ //LLNotificationsUtil::add("LandmarkMissing");
}
else
{
LL_WARNS("Landmarks") << "Unable to load Landmark" << LL_ENDL;
- //LLNotifications::instance().add("UnableToLoadLandmark");
+ //LLNotificationsUtil::add("UnableToLoadLandmark");
}
gLandmarkList.mBadList.insert(uuid);
diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp
index 6bcbe6f58c..116d9bc446 100644
--- a/indra/newview/lllocaltextureobject.cpp
+++ b/indra/newview/lllocaltextureobject.cpp
@@ -47,7 +47,9 @@ LLLocalTextureObject::LLLocalTextureObject() :
mImage = NULL;
}
-LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id)
+LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id) :
+ mIsBakedReady(FALSE),
+ mDiscard(MAX_DISCARD_LEVEL+1)
{
mImage = image;
gGL.getTexUnit(0)->bind(mImage);
@@ -68,6 +70,7 @@ LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) :
if (!original_layer)
{
llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl;
+ continue;
}
LLTexLayer* new_layer = new LLTexLayer(*original_layer);
diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp
index d910dbf718..df93930d33 100644
--- a/indra/newview/lllocationhistory.cpp
+++ b/indra/newview/lllocationhistory.cpp
@@ -50,18 +50,19 @@ void LLLocationHistory::addItem(const LLLocationHistoryItem& item) {
// check if this item doesn't duplicate any existing one
location_list_t::iterator item_iter = std::find(mItems.begin(), mItems.end(),item);
- if(item_iter != mItems.end()){
+ if(item_iter != mItems.end()) // if it already exists, erase the old one
+ {
mItems.erase(item_iter);
}
mItems.push_back(item);
- // If the vector size exceeds the maximum, purge the oldest items.
- if ((S32)mItems.size() > max_items) {
- for(location_list_t::iterator i = mItems.begin(); i != mItems.end()-max_items; ++i) {
- mItems.erase(i);
- }
+ // If the vector size exceeds the maximum, purge the oldest items (at the start of the mItems vector).
+ if ((S32)mItems.size() > max_items)
+ {
+ mItems.erase(mItems.begin(), mItems.end()-max_items);
}
+ llassert((S32)mItems.size() <= max_items);
}
/*
@@ -123,6 +124,12 @@ void LLLocationHistory::save() const
// build filename for each user
std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
+ if (resolved_filename.empty())
+ {
+ llinfos << "can't get path to location history filename - probably not logged in yet." << llendl;
+ return;
+ }
+
// open a file for writing
llofstream file (resolved_filename);
if (!file.is_open())
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 5f9976f87a..65f0dd2e1b 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -41,11 +41,13 @@
#include <boost/function.hpp>
class LLSD;
-
+/**
+ * This enum is responsible for identifying of history item.
+ */
enum ELocationType {
- TYPED_REGION_SURL//region name or surl
- ,LANDMARK // name of landmark
- ,TELEPORT_HISTORY
+ TYPED_REGION_SLURL//item added after the user had typed a region name or slurl
+ ,LANDMARK // item has been loaded from landmark folder
+ ,TELEPORT_HISTORY // item from session teleport history
};
class LLLocationHistoryItem {
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 00f12ae2eb..04c684b240 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -39,22 +39,28 @@
#include "llbutton.h"
#include "llfocusmgr.h"
#include "llmenugl.h"
+#include "llparcel.h"
#include "llstring.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "lltooltip.h"
+#include "llnotificationsutil.h"
+#include "llregionflags.h"
// newview includes
-#include "llinventorymodel.h"
+#include "llagent.h"
+#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
#include "lllocationhistory.h"
#include "llteleporthistory.h"
#include "llsidetray.h"
#include "llslurl.h"
+#include "llstatusbar.h" // getHealth()
#include "lltrans.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llurllineeditorctrl.h"
@@ -147,30 +153,63 @@ private:
LLLocationInputCtrl* mInput;
};
+class LLParcelChangeObserver : public LLParcelObserver
+{
+public:
+ LLParcelChangeObserver(LLLocationInputCtrl* input) : mInput(input) {}
+
+private:
+ /*virtual*/ void changed()
+ {
+ if (mInput)
+ {
+ mInput->refreshParcelIcons();
+ }
+ }
+
+ LLLocationInputCtrl* mInput;
+};
+
//============================================================================
static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input");
LLLocationInputCtrl::Params::Params()
-: add_landmark_image_enabled("add_landmark_image_enabled"),
+: icon_maturity_general("icon_maturity_general"),
+ icon_maturity_adult("icon_maturity_adult"),
+ add_landmark_image_enabled("add_landmark_image_enabled"),
add_landmark_image_disabled("add_landmark_image_disabled"),
add_landmark_image_hover("add_landmark_image_hover"),
add_landmark_image_selected("add_landmark_image_selected"),
- add_landmark_button("add_landmark_button"),
add_landmark_hpad("add_landmark_hpad", 0),
- info_button("info_button")
+ icon_hpad("icon_hpad", 0),
+ add_landmark_button("add_landmark_button"),
+ for_sale_button("for_sale_button"),
+ info_button("info_button"),
+ maturity_icon("maturity_icon"),
+ voice_icon("voice_icon"),
+ fly_icon("fly_icon"),
+ push_icon("push_icon"),
+ build_icon("build_icon"),
+ scripts_icon("scripts_icon"),
+ damage_icon("damage_icon"),
+ damage_text("damage_text")
{
}
LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
: LLComboBox(p),
+ mIconHPad(p.icon_hpad),
mAddLandmarkHPad(p.add_landmark_hpad),
- mInfoBtn(NULL),
mLocationContextMenu(NULL),
mAddLandmarkBtn(NULL),
+ mForSaleBtn(NULL),
+ mInfoBtn(NULL),
mLandmarkImageOn(NULL),
- mLandmarkImageOff(NULL)
+ mLandmarkImageOff(NULL),
+ mIconMaturityGeneral(NULL),
+ mIconMaturityAdult(NULL)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
@@ -188,13 +227,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
params.rect(text_entry_rect);
params.default_text(LLStringUtil::null);
params.max_length_bytes(p.max_chars);
- params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2));
params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
params.handle_edit_keys_directly(true);
params.commit_on_focus_lost(false);
params.follows.flags(FOLLOWS_ALL);
mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params);
- this->addChild(mTextEntry);
+ mTextEntry->setContextMenu(NULL);
+ addChild(mTextEntry);
// LLLineEditor is replaced with LLLocationLineEditor
// "Place information" button.
@@ -230,6 +269,77 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
enableAddLandmarkButton(true);
addChild(mAddLandmarkBtn);
+
+ if (p.icon_maturity_general())
+ {
+ mIconMaturityGeneral = p.icon_maturity_general;
+ }
+ if (p.icon_maturity_adult())
+ {
+ mIconMaturityAdult = p.icon_maturity_adult;
+ }
+
+ LLIconCtrl::Params maturity_icon = p.maturity_icon;
+ mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon);
+ addChild(mMaturityIcon);
+
+ LLButton::Params for_sale_button = p.for_sale_button;
+ for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip");
+ for_sale_button.click_callback.function(
+ boost::bind(&LLLocationInputCtrl::onForSaleButtonClicked, this));
+ mForSaleBtn = LLUICtrlFactory::create<LLButton>( for_sale_button );
+ addChild(mForSaleBtn);
+
+ // Parcel property icons
+ // Must be mouse-opaque so cursor stays as an arrow when hovering to
+ // see tooltip.
+ LLIconCtrl::Params voice_icon = p.voice_icon;
+ voice_icon.tool_tip = LLTrans::getString("LocationCtrlVoiceTooltip");
+ voice_icon.mouse_opaque = true;
+ mParcelIcon[VOICE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(voice_icon);
+ mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, VOICE_ICON));
+ addChild(mParcelIcon[VOICE_ICON]);
+
+ LLIconCtrl::Params fly_icon = p.fly_icon;
+ fly_icon.tool_tip = LLTrans::getString("LocationCtrlFlyTooltip");
+ fly_icon.mouse_opaque = true;
+ mParcelIcon[FLY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(fly_icon);
+ mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, FLY_ICON));
+ addChild(mParcelIcon[FLY_ICON]);
+
+ LLIconCtrl::Params push_icon = p.push_icon;
+ push_icon.tool_tip = LLTrans::getString("LocationCtrlPushTooltip");
+ push_icon.mouse_opaque = true;
+ mParcelIcon[PUSH_ICON] = LLUICtrlFactory::create<LLIconCtrl>(push_icon);
+ mParcelIcon[PUSH_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, PUSH_ICON));
+ addChild(mParcelIcon[PUSH_ICON]);
+
+ LLIconCtrl::Params build_icon = p.build_icon;
+ build_icon.tool_tip = LLTrans::getString("LocationCtrlBuildTooltip");
+ build_icon.mouse_opaque = true;
+ mParcelIcon[BUILD_ICON] = LLUICtrlFactory::create<LLIconCtrl>(build_icon);
+ mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, BUILD_ICON));
+ addChild(mParcelIcon[BUILD_ICON]);
+
+ LLIconCtrl::Params scripts_icon = p.scripts_icon;
+ scripts_icon.tool_tip = LLTrans::getString("LocationCtrlScriptsTooltip");
+ scripts_icon.mouse_opaque = true;
+ mParcelIcon[SCRIPTS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(scripts_icon);
+ mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SCRIPTS_ICON));
+ addChild(mParcelIcon[SCRIPTS_ICON]);
+
+ LLIconCtrl::Params damage_icon = p.damage_icon;
+ damage_icon.tool_tip = LLTrans::getString("LocationCtrlDamageTooltip");
+ damage_icon.mouse_opaque = true;
+ mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
+ mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, DAMAGE_ICON));
+ addChild(mParcelIcon[DAMAGE_ICON]);
+
+ LLTextBox::Params damage_text = p.damage_text;
+ damage_text.tool_tip = LLTrans::getString("LocationCtrlDamageTooltip");
+ damage_text.mouse_opaque = true;
+ mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
+ addChild(mDamageText);
// Register callbacks and load the location field context menu (NB: the order matters).
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
@@ -248,6 +358,20 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
getTextEntry()->setRightMouseUpCallback(boost::bind(&LLLocationInputCtrl::onTextEditorRightClicked,this,_2,_3,_4));
updateWidgetlayout();
+ // Connecting signal for updating location on "Show Coordinates" setting change.
+ LLControlVariable* coordinates_control = gSavedSettings.getControl("NavBarShowCoordinates").get();
+ if (coordinates_control)
+ {
+ mCoordinatesControlConnection = coordinates_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshLocation, this));
+ }
+
+ // Connecting signal for updating parcel icons on "Show Parcel Properties" setting change.
+ LLControlVariable* parcel_properties_control = gSavedSettings.getControl("NavBarShowParcelProperties").get();
+ if (parcel_properties_control)
+ {
+ mParcelPropertiesControlConnection = parcel_properties_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshParcelIcons, this));
+ }
+
// - Make the "Add landmark" button updated when either current parcel gets changed
// or a landmark gets created or removed from the inventory.
// - Update the location string on parcel change.
@@ -261,7 +385,10 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkObserver = new LLAddLandmarkObserver(this);
gInventory.addObserver(mRemoveLandmarkObserver);
gInventory.addObserver(mAddLandmarkObserver);
-
+
+ mParcelChangeObserver = new LLParcelChangeObserver(this);
+ LLViewerParcelMgr::getInstance()->addObserver(mParcelChangeObserver);
+
mAddLandmarkTooltip = LLTrans::getString("LocationCtrlAddLandmarkTooltip");
mEditLandmarkTooltip = LLTrans::getString("LocationCtrlEditLandmarkTooltip");
getChild<LLView>("Location History")->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip"));
@@ -275,6 +402,11 @@ LLLocationInputCtrl::~LLLocationInputCtrl()
delete mRemoveLandmarkObserver;
delete mAddLandmarkObserver;
+ LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver);
+ delete mParcelChangeObserver;
+
+ mCoordinatesControlConnection.disconnect();
+ mParcelPropertiesControlConnection.disconnect();
mParcelMgrConnection.disconnect();
mLocationHistoryConnection.disconnect();
}
@@ -294,6 +426,11 @@ void LLLocationInputCtrl::hideList()
BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, MASK mask)
{
+
+ if(mAddLandmarkBtn->parentPointInView(x,y))
+ {
+ updateAddLandmarkTooltip();
+ }
// Let the buttons show their tooltips.
if (LLUICtrl::handleToolTip(x, y, mask))
{
@@ -371,8 +508,8 @@ void LLLocationInputCtrl::setText(const LLStringExplicit& text)
if (mTextEntry)
{
mTextEntry->setText(text);
- mHasAutocompletedText = FALSE;
}
+ mHasAutocompletedText = FALSE;
}
void LLLocationInputCtrl::setFocus(BOOL b)
@@ -380,7 +517,9 @@ void LLLocationInputCtrl::setFocus(BOOL b)
LLComboBox::setFocus(b);
if (mTextEntry && b && !mList->getVisible())
+ {
mTextEntry->setFocus(TRUE);
+ }
}
void LLLocationInputCtrl::handleLoginComplete()
@@ -405,17 +544,50 @@ void LLLocationInputCtrl::onFocusLost()
mTextEntry->deselect();
}
}
-void LLLocationInputCtrl::draw(){
-
- if(!hasFocus() && gSavedSettings.getBOOL("ShowCoordinatesOption")){
+
+void LLLocationInputCtrl::draw()
+{
+ static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false);
+ if(!hasFocus() && show_coords)
+ {
refreshLocation();
}
+
+ static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false);
+ if (show_icons)
+ {
+ refreshHealth();
+ }
LLComboBox::draw();
}
+void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLComboBox::reshape(width, height, called_from_parent);
+
+ // Setting cursor to 0 to show the left edge of the text. See EXT-4967.
+ mTextEntry->setCursor(0);
+ if (mTextEntry->hasSelection())
+ {
+ // Deselecting because selection position is changed together with
+ // cursor position change.
+ mTextEntry->deselect();
+ }
+
+ if (isHumanReadableLocationVisible)
+ {
+ positionMaturityIcon();
+ }
+}
+
void LLLocationInputCtrl::onInfoButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "agent"));
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+}
+
+void LLLocationInputCtrl::onForSaleButtonClicked()
+{
+ handle_buy_land();
}
void LLLocationInputCtrl::onAddLandmarkButtonClicked()
@@ -432,7 +604,7 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked()
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
}
}
@@ -492,7 +664,7 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
value["item_type"] = TELEPORT_HISTORY;
value["global_pos"] = result->mGlobalPos.getValue();
std::string region_name = result->mTitle.substr(0, result->mTitle.find(','));
- //TODO*: add Surl to teleportitem or parse region name from title
+ //TODO*: add slurl to teleportitem or parse region name from title
value["tooltip"] = LLSLURL::buildSLURLfromPosGlobal(region_name,
result->mGlobalPos, false);
add(result->getTitle(), value);
@@ -506,10 +678,12 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
mList->mouseOverHighlightNthItem(-1); // Clear highlight on the last selected item.
}
+
bool LLLocationInputCtrl::findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter)
{
return item.mTitle.find(filter) != std::string::npos;
}
+
void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask)
{
if (mLocationContextMenu)
@@ -527,6 +701,7 @@ void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask)
void LLLocationInputCtrl::refresh()
{
refreshLocation(); // update location string
+ refreshParcelIcons();
updateAddLandmarkButton(); // indicate whether current parcel has been landmarked
}
@@ -534,8 +709,8 @@ void LLLocationInputCtrl::refreshLocation()
{
// Is one of our children focused?
if (LLUICtrl::hasFocus() || mButton->hasFocus() || mList->hasFocus() ||
- (mTextEntry && mTextEntry->hasFocus()) || (mAddLandmarkBtn->hasFocus()))
-
+ (mTextEntry && mTextEntry->hasFocus()) ||
+ (mAddLandmarkBtn->hasFocus()))
{
llwarns << "Location input should not be refreshed when having focus" << llendl;
return;
@@ -543,11 +718,178 @@ void LLLocationInputCtrl::refreshLocation()
// Update location field.
std::string location_name;
- LLAgentUI::ELocationFormat format = (gSavedSettings.getBOOL("ShowCoordinatesOption") ?
- LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM: LLAgentUI::LOCATION_FORMAT_NORMAL);
+ LLAgentUI::ELocationFormat format =
+ (gSavedSettings.getBOOL("NavBarShowCoordinates")
+ ? LLAgentUI::LOCATION_FORMAT_FULL
+ : LLAgentUI::LOCATION_FORMAT_NO_COORDS);
- if (!LLAgentUI::buildLocationString(location_name, format)) location_name = "Unknown";
+ if (!LLAgentUI::buildLocationString(location_name, format))
+ {
+ location_name = "???";
+ }
+ // store human-readable location to compare it in changeLocationPresentation()
+ mHumanReadableLocation = location_name;
setText(location_name);
+ isHumanReadableLocationVisible = true;
+
+ // Updating maturity rating icon.
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ U8 sim_access = region->getSimAccess();
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ mMaturityIcon->setValue(mIconMaturityGeneral->getName());
+ mMaturityIcon->setVisible(TRUE);
+ break;
+
+ case SIM_ACCESS_ADULT:
+ mMaturityIcon->setValue(mIconMaturityAdult->getName());
+ mMaturityIcon->setVisible(TRUE);
+ break;
+
+ default:
+ mMaturityIcon->setVisible(FALSE);
+ }
+
+ if (mMaturityIcon->getVisible())
+ {
+ positionMaturityIcon();
+ }
+}
+
+// returns new right edge
+static S32 layout_widget(LLUICtrl* widget, S32 right)
+{
+ if (widget->getVisible())
+ {
+ LLRect rect = widget->getRect();
+ rect.mLeft = right - rect.getWidth();
+ rect.mRight = right;
+ widget->setRect( rect );
+ right -= rect.getWidth();
+ }
+ return right;
+}
+
+void LLLocationInputCtrl::refreshParcelIcons()
+{
+ // Our "cursor" moving right to left
+ S32 x = mAddLandmarkBtn->getRect().mLeft;
+
+ if (gSavedSettings.getBOOL("NavBarShowParcelProperties"))
+ {
+ LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+
+ LLViewerRegion* agent_region = gAgent.getRegion();
+ LLParcel* agent_parcel = vpm->getAgentParcel();
+ if (!agent_region || !agent_parcel)
+ return;
+
+ LLParcel* current_parcel;
+ LLViewerRegion* selection_region = vpm->getSelectionRegion();
+ LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel();
+
+ // If agent is in selected parcel we use its properties because
+ // they are updated more often by LLViewerParcelMgr than agent parcel properties.
+ // See LLViewerParcelMgr::processParcelProperties().
+ // This is needed to reflect parcel restrictions changes without having to leave
+ // the parcel and then enter it again. See EXT-2987
+ if (selected_parcel && selected_parcel->getLocalID() == agent_parcel->getLocalID()
+ && selection_region == agent_region)
+ {
+ current_parcel = selected_parcel;
+ }
+ else
+ {
+ current_parcel = agent_parcel;
+ }
+
+ bool allow_buy = vpm->canAgentBuyParcel(current_parcel, false);
+ bool allow_voice = vpm->allowAgentVoice(agent_region, current_parcel);
+ bool allow_fly = vpm->allowAgentFly(agent_region, current_parcel);
+ bool allow_push = vpm->allowAgentPush(agent_region, current_parcel);
+ bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
+ bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
+ bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+
+ // Most icons are "block this ability"
+ mForSaleBtn->setVisible(allow_buy);
+ mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
+ mParcelIcon[FLY_ICON]->setVisible( !allow_fly );
+ mParcelIcon[PUSH_ICON]->setVisible( !allow_push );
+ mParcelIcon[BUILD_ICON]->setVisible( !allow_build );
+ mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+ mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
+ mDamageText->setVisible(allow_damage);
+
+ x = layout_widget(mForSaleBtn, x);
+ // Padding goes to left of both landmark star and for sale btn
+ x -= mAddLandmarkHPad;
+
+ // Slide the parcel icons rect from right to left, adjusting rectangles
+ for (S32 i = 0; i < ICON_COUNT; ++i)
+ {
+ x = layout_widget(mParcelIcon[i], x);
+ x -= mIconHPad;
+ }
+ x = layout_widget(mDamageText, x);
+ x -= mIconHPad;
+ }
+ else
+ {
+ mForSaleBtn->setVisible(false);
+ for (S32 i = 0; i < ICON_COUNT; ++i)
+ {
+ mParcelIcon[i]->setVisible(false);
+ }
+ mDamageText->setVisible(false);
+ }
+
+ if (mTextEntry)
+ {
+ S32 left_pad, right_pad;
+ mTextEntry->getTextPadding(&left_pad, &right_pad);
+ right_pad = mTextEntry->getRect().mRight - x;
+ mTextEntry->setTextPadding(left_pad, right_pad);
+ }
+}
+
+void LLLocationInputCtrl::refreshHealth()
+{
+ // *FIXME: Status bar owns health information, should be in agent
+ if (gStatusBar)
+ {
+ static S32 last_health = -1;
+ S32 health = gStatusBar->getHealth();
+ if (health != last_health)
+ {
+ std::string text = llformat("%d%%", health);
+ mDamageText->setText(text);
+ last_health = health;
+ }
+ }
+}
+
+void LLLocationInputCtrl::positionMaturityIcon()
+{
+ const LLFontGL* font = mTextEntry->getFont();
+ if (!font)
+ return;
+
+ S32 left_pad, right_pad;
+ mTextEntry->getTextPadding(&left_pad, &right_pad);
+
+ // Calculate the right edge of rendered text + a whitespace.
+ left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" ");
+
+ LLRect rect = mMaturityIcon->getRect();
+ mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+
+ // Hide icon if it text area is not width enough to display it, show otherwise.
+ mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
}
void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
@@ -572,7 +914,7 @@ void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
LLSD value;
value["tooltip"] = it->getToolTip();
//location history can contain only typed locations
- value["item_type"] = TYPED_REGION_SURL;
+ value["item_type"] = TYPED_REGION_SLURL;
value["global_pos"] = it->mGlobalPos.getValue();
add(it->getLocation(), value);
}
@@ -602,11 +944,12 @@ void LLLocationInputCtrl::enableAddLandmarkButton(bool val)
// depending on whether current parcel has been landmarked.
void LLLocationInputCtrl::updateAddLandmarkButton()
{
- bool landmark_exists = LLLandmarkActions::landmarkAlreadyExists();
- enableAddLandmarkButton(!landmark_exists);
-
+ enableAddLandmarkButton(LLLandmarkActions::hasParcelLandmark());
+}
+void LLLocationInputCtrl::updateAddLandmarkTooltip()
+{
std::string tooltip;
- if(landmark_exists)
+ if(LLLandmarkActions::landmarkAlreadyExists())
{
tooltip = mEditLandmarkTooltip;
}
@@ -636,77 +979,82 @@ void LLLocationInputCtrl::updateWidgetlayout()
{
const LLRect& rect = getLocalRect();
const LLRect& hist_btn_rect = mButton->getRect();
- LLRect info_btn_rect = mInfoBtn->getRect();
- // info button
- info_btn_rect.setOriginAndSize(
- 2, (rect.getHeight() - info_btn_rect.getHeight()) / 2,
- info_btn_rect.getWidth(), info_btn_rect.getHeight());
- mInfoBtn->setRect(info_btn_rect);
+ // Info button is set in the XUI XML location_input.xml
// "Add Landmark" button
- {
- LLRect al_btn_rect = mAddLandmarkBtn->getRect();
- al_btn_rect.translate(
- hist_btn_rect.mLeft - mAddLandmarkHPad - al_btn_rect.getWidth(),
- (rect.getHeight() - al_btn_rect.getHeight()) / 2);
- mAddLandmarkBtn->setRect(al_btn_rect);
- }
+ LLRect al_btn_rect = mAddLandmarkBtn->getRect();
+ al_btn_rect.translate(
+ hist_btn_rect.mLeft - mIconHPad - al_btn_rect.getWidth(),
+ (rect.getHeight() - al_btn_rect.getHeight()) / 2);
+ mAddLandmarkBtn->setRect(al_btn_rect);
}
void LLLocationInputCtrl::changeLocationPresentation()
{
- //change location presentation only if user does not select anything and
- //human-readable region name is being displayed
+ if (!mTextEntry)
+ return;
+
+ //change location presentation only if user does not select/paste anything and
+ //human-readable region name is being displayed
std::string text = mTextEntry->getText();
LLStringUtil::trim(text);
- if(mTextEntry && !mTextEntry->hasSelection() && !LLSLURL::isSLURL(text))
+ if(!mTextEntry->hasSelection() && text == mHumanReadableLocation)
{
//needs unescaped one
mTextEntry->setText(LLAgentUI::buildSLURL(false));
mTextEntry->selectAll();
- }
+
+ mMaturityIcon->setVisible(FALSE);
+
+ isHumanReadableLocationVisible = false;
+ }
}
void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
{
std::string item = userdata.asString();
- if (item == std::string("show_coordinates"))
+ if (item == "show_coordinates")
{
- gSavedSettings.setBOOL("ShowCoordinatesOption",!gSavedSettings.getBOOL("ShowCoordinatesOption"));
+ gSavedSettings.setBOOL("NavBarShowCoordinates",!gSavedSettings.getBOOL("NavBarShowCoordinates"));
}
- else if (item == std::string("landmark"))
+ else if (item == "show_properties")
+ {
+ gSavedSettings.setBOOL("NavBarShowParcelProperties",
+ !gSavedSettings.getBOOL("NavBarShowParcelProperties"));
+ }
+ else if (item == "landmark")
{
LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
if(!landmark)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
}
else
{
LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().insert("type", "landmark").insert("id",landmark->getUUID()));
+ LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
}
- else if (item == std::string("cut"))
+ else if (item == "cut")
{
mTextEntry->cut();
}
- else if (item == std::string("copy"))
+ else if (item == "copy")
{
mTextEntry->copy();
}
- else if (item == std::string("paste"))
+ else if (item == "paste")
{
mTextEntry->paste();
}
- else if (item == std::string("delete"))
+ else if (item == "delete")
{
mTextEntry->deleteSelection();
}
- else if (item == std::string("select_all"))
+ else if (item == "select_all")
{
mTextEntry->selectAll();
}
@@ -716,30 +1064,72 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
{
std::string item = userdata.asString();
- if (item == std::string("can_cut"))
+ if (item == "can_cut")
{
return mTextEntry->canCut();
}
- else if (item == std::string("can_copy"))
+ else if (item == "can_copy")
{
return mTextEntry->canCopy();
}
- else if (item == std::string("can_paste"))
+ else if (item == "can_paste")
{
return mTextEntry->canPaste();
}
- else if (item == std::string("can_delete"))
+ else if (item == "can_delete")
{
return mTextEntry->canDeselect();
}
- else if (item == std::string("can_select_all"))
+ else if (item == "can_select_all")
{
- return mTextEntry->canSelectAll();
+ return mTextEntry->canSelectAll() && (mTextEntry->getLength() > 0);
}
- else if(item == std::string("show_coordinates")){
-
- return gSavedSettings.getBOOL("ShowCoordinatesOption");
+ else if(item == "show_coordinates")
+ {
+ return gSavedSettings.getBOOL("NavBarShowCoordinates");
}
return false;
}
+
+void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
+{
+ switch (icon)
+ {
+ case VOICE_ICON:
+ LLNotificationsUtil::add("NoVoice");
+ break;
+ case FLY_ICON:
+ LLNotificationsUtil::add("NoFly");
+ break;
+ case PUSH_ICON:
+ LLNotificationsUtil::add("PushRestricted");
+ break;
+ case BUILD_ICON:
+ LLNotificationsUtil::add("NoBuild");
+ break;
+ case SCRIPTS_ICON:
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+ {
+ LLNotificationsUtil::add("ScriptsStopped");
+ }
+ else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+ {
+ LLNotificationsUtil::add("ScriptsNotRunning");
+ }
+ else
+ {
+ LLNotificationsUtil::add("NoOutsideScripts");
+ }
+ break;
+ }
+ case DAMAGE_ICON:
+ LLNotificationsUtil::add("NotSafe");
+ break;
+ case ICON_COUNT:
+ break;
+ // no default to get compiler warning when a new icon gets added
+ }
+}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index c74a294ca3..4bb41f3bf4 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -33,13 +33,16 @@
#ifndef LL_LLLOCATIONINPUTCTRL_H
#define LL_LLLOCATIONINPUTCTRL_H
-#include <llcombobox.h>
+#include "llcombobox.h"
+#include "lliconctrl.h" // Params
+#include "lltextbox.h" // Params
class LLLandmark;
// internals
class LLAddLandmarkObserver;
class LLRemoveLandmarkObserver;
+class LLParcelChangeObserver;
class LLMenuGL;
class LLTeleportHistoryItem;
@@ -54,18 +57,31 @@ class LLLocationInputCtrl
LOG_CLASS(LLLocationInputCtrl);
friend class LLAddLandmarkObserver;
friend class LLRemoveLandmarkObserver;
+ friend class LLParcelChangeObserver;
public:
struct Params
: public LLInitParam::Block<Params, LLComboBox::Params>
{
- Optional<LLUIImage*> add_landmark_image_enabled,
+ Optional<LLUIImage*> icon_maturity_general,
+ icon_maturity_adult,
+ add_landmark_image_enabled,
add_landmark_image_disabled,
add_landmark_image_hover,
add_landmark_image_selected;
- Optional<S32> add_landmark_hpad;
+ Optional<S32> icon_hpad,
+ add_landmark_hpad;
Optional<LLButton::Params> add_landmark_button,
+ for_sale_button,
info_button;
+ Optional<LLIconCtrl::Params> maturity_icon,
+ voice_icon,
+ fly_icon,
+ push_icon,
+ build_icon,
+ scripts_icon,
+ damage_icon;
+ Optional<LLTextBox::Params> damage_text;
Params();
};
@@ -76,6 +92,7 @@ public:
/*virtual*/ void onFocusReceived();
/*virtual*/ void onFocusLost();
/*virtual*/ void draw();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
//========================================================================
// LLUICtrl interface
@@ -91,6 +108,18 @@ public:
void handleLoginComplete();
private:
+
+ enum EParcelIcon
+ {
+ VOICE_ICON = 0,
+ FLY_ICON,
+ PUSH_ICON,
+ BUILD_ICON,
+ SCRIPTS_ICON,
+ DAMAGE_ICON,
+ ICON_COUNT
+ };
+
friend class LLUICtrlFactory;
LLLocationInputCtrl(const Params&);
virtual ~LLLocationInputCtrl();
@@ -103,10 +132,16 @@ private:
void enableAddLandmarkButton(bool val);
void refresh();
void refreshLocation();
+ void refreshParcelIcons();
+ // Refresh the value in the health percentage text field
+ void refreshHealth();
+ void positionMaturityIcon();
+
void rebuildLocationHistory(std::string filter = "");
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
void setText(const LLStringExplicit& text);
void updateAddLandmarkButton();
+ void updateAddLandmarkTooltip();
void updateContextMenu();
void updateWidgetlayout();
void changeLocationPresentation();
@@ -116,27 +151,43 @@ private:
void onLocationPrearrange(const LLSD& data);
void onTextEditorRightClicked(S32 x, S32 y, MASK mask);
void onLandmarkLoaded(LLLandmark* lm);
+ void onForSaleButtonClicked();
void onAddLandmarkButtonClicked();
void onAgentParcelChange();
// callbacks
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
void onLocationContextMenuItemClicked(const LLSD& userdata);
+ void onParcelIconClick(EParcelIcon icon);
LLMenuGL* mLocationContextMenu;
LLButton* mAddLandmarkBtn;
+ LLButton* mForSaleBtn;
LLButton* mInfoBtn;
- S32 mAddLandmarkHPad;
+ S32 mIconHPad; // pad between all icons
+ S32 mAddLandmarkHPad; // pad to left of landmark star
+
+ LLIconCtrl* mMaturityIcon;
+ LLIconCtrl* mParcelIcon[ICON_COUNT];
+ LLTextBox* mDamageText;
LLAddLandmarkObserver* mAddLandmarkObserver;
LLRemoveLandmarkObserver* mRemoveLandmarkObserver;
+ LLParcelChangeObserver* mParcelChangeObserver;
+ boost::signals2::connection mCoordinatesControlConnection;
+ boost::signals2::connection mParcelPropertiesControlConnection;
boost::signals2::connection mParcelMgrConnection;
boost::signals2::connection mLocationHistoryConnection;
LLUIImage* mLandmarkImageOn;
LLUIImage* mLandmarkImageOff;
+ LLUIImage* mIconMaturityGeneral;
+ LLUIImage* mIconMaturityAdult;
std::string mAddLandmarkTooltip;
std::string mEditLandmarkTooltip;
+ // this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location
+ std::string mHumanReadableLocation;
+ bool isHumanReadableLocationVisible;
};
#endif
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index a16ffe19c6..16b13d9218 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,15 +32,149 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
+#include "llagentui.h"
#include "lllogchat.h"
-#include "llappviewer.h"
-#include "llfloaterchat.h"
#include "lltrans.h"
#include "llviewercontrol.h"
-#include "llsdserialize.h"
+
+#include "llinstantmessage.h"
+#include "llsingleton.h" // for LLSingleton
+
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/regex.hpp>
+#include <boost/regex/v4/match_results.hpp>
+
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/local_time_adjustor.hpp>
const S32 LOG_RECALL_SIZE = 2048;
+const static std::string IM_TIME("time");
+const static std::string IM_TEXT("message");
+const static std::string IM_FROM("from");
+const static std::string IM_FROM_ID("from_id");
+const static std::string IM_SEPARATOR(": ");
+
+const static std::string NEW_LINE("\n");
+const static std::string NEW_LINE_SPACE_PREFIX("\n ");
+const static std::string TWO_SPACES(" ");
+const static std::string MULTI_LINE_PREFIX(" ");
+
+/**
+ * Chat log lines - timestamp and name are optional but message text is mandatory.
+ *
+ * Typical plain text chat log lines:
+ *
+ * SuperCar: You aren't the owner
+ * [2:59] SuperCar: You aren't the owner
+ * [2009/11/20 3:00] SuperCar: You aren't the owner
+ * Katar Ivercourt is Offline
+ * [3:00] Katar Ivercourt is Offline
+ * [2009/11/20 3:01] Corba ProductEngine is Offline
+ *
+ * Note: "You" was used as an avatar names in viewers of previous versions
+ */
+const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
+
+/**
+ * Regular expression suitable to match names like
+ * "You", "Second Life", "Igor ProductEngine", "Object", "Mega House"
+ */
+const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
+
+//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
+const static std::string NAME_TEXT_DIVIDER(": ");
+
+// is used for timestamps adjusting
+const static char* DATE_FORMAT("%Y/%m/%d %H:%M");
+const static char* TIME_FORMAT("%H:%M");
+
+const static int IDX_TIMESTAMP = 1;
+const static int IDX_STUFF = 2;
+const static int IDX_NAME = 1;
+const static int IDX_TEXT = 3;
+
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
+{
+public:
+ LLLogChatTimeScanner()
+ {
+ // Note, date/time facets will be destroyed by string streams
+ mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
+ }
+
+ date getTodayPacificDate()
+ {
+ typedef boost::date_time::local_adjustor<ptime, -8, no_dst> pst;
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> pdt;
+ time_t t_time = time(NULL);
+ ptime p_time = LLStringOps::getPacificDaylightTime()
+ ? pdt::utc_to_local(from_time_t(t_time))
+ : pst::utc_to_local(from_time_t(t_time));
+ struct tm s_tm = to_tm(p_time);
+ return date_from_tm(s_tm);
+ }
+
+ void checkAndCutOffDate(std::string& time_str)
+ {
+ // Cuts off the "%Y/%m/%d" from string for todays timestamps.
+ // Assume that passed string has at least "%H:%M" time format.
+ date log_date(not_a_date_time);
+ date today(getTodayPacificDate());
+
+ // Parse the passed date
+ mDateStream.str(LLStringUtil::null);
+ mDateStream << time_str;
+ mDateStream >> log_date;
+ mDateStream.clear();
+
+ days zero_days(0);
+ days days_alive = today - log_date;
+
+ if ( days_alive == zero_days )
+ {
+ // Yep, today's so strip "%Y/%m/%d" info
+ ptime stripped_time(not_a_date_time);
+
+ mTimeStream.str(LLStringUtil::null);
+ mTimeStream << time_str;
+ mTimeStream >> stripped_time;
+ mTimeStream.clear();
+
+ time_str.clear();
+
+ mTimeStream.str(LLStringUtil::null);
+ mTimeStream << stripped_time;
+ mTimeStream >> time_str;
+ mTimeStream.clear();
+ }
+
+ LL_DEBUGS("LLChatLogParser")
+ << " log_date: "
+ << log_date
+ << " today: "
+ << today
+ << " days alive: "
+ << days_alive
+ << " new time: "
+ << time_str
+ << LL_ENDL;
+ }
+
+
+private:
+ std::stringstream mDateStream;
+ std::stringstream mTimeStream;
+};
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
@@ -77,12 +211,12 @@ std::string LLLogChat::timestamp(bool withdate)
+LLTrans::getString ("TimeMonth")+"]/["
+LLTrans::getString ("TimeDay")+"] ["
+LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"] ";
+ +LLTrans::getString ("TimeMin")+"]";
}
else
{
timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
- + LLTrans::getString ("TimeMin")+"] ";
+ + LLTrans::getString ("TimeMin")+"]";
}
LLStringUtil::format (timeStr, substitution);
@@ -96,19 +230,20 @@ void LLLogChat::saveHistory(const std::string& filename,
const LLUUID& from_id,
const std::string& line)
{
- if (!gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
- return;
-
- if(!filename.size())
+ std::string tmp_filename = filename;
+ LLStringUtil::trim(tmp_filename);
+ if (tmp_filename.empty())
{
- llinfos << "Filename is Empty!" << llendl;
+ std::string warn = "Chat history filename [" + filename + "] is empty!";
+ llwarning(warn, 666);
+ llassert(tmp_filename.size());
return;
}
-
+
llofstream file (LLLogChat::makeLogFileName(filename), std::ios_base::app);
if (!file.is_open())
{
- llinfos << "Couldn't open chat history log!" << llendl;
+ llwarns << "Couldn't open chat history log! - " + filename << llendl;
return;
}
@@ -117,11 +252,20 @@ void LLLogChat::saveHistory(const std::string& filename,
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
- item["from"] = from;
item["from_id"] = from_id;
item["message"] = line;
- file << LLSDOStreamer <LLSDNotationFormatter>(item) << std::endl;
+ //adding "Second Life:" for all system messages to make chat log history parsing more reliable
+ if (from.empty() && from_id.isNull())
+ {
+ item["from"] = SYSTEM_FROM;
+ }
+ else
+ {
+ item["from"] = from;
+ }
+
+ file << LLChatLogFormatter(item) << std::endl;
file.close();
}
@@ -157,9 +301,6 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
}
}
- // the parser's destructor is protected so we cannot create in the stack.
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
while ( fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr) )
{
len = strlen(buffer) - 1; /*Flawfinder: ignore*/
@@ -170,7 +311,8 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
LLSD item;
std::string line(buffer);
std::istringstream iss(line);
- if (parser->parse(iss, item, line.length()) == LLSDParser::PARSE_FAILURE)
+
+ if (!LLChatLogParser::parse(line, item))
{
item["message"] = line;
callback(LOG_LINE, item, userdata);
@@ -190,3 +332,210 @@ void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLi
fclose(fptr);
}
}
+
+void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
+{
+ if (!messages.size()) return;
+
+ std::string im_text = messages.back()[IM_TEXT].asString();
+ im_text.append(line);
+ messages.back()[IM_TEXT] = im_text;
+}
+
+void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& messages)
+{
+ if (file_name.empty())
+ {
+ llwarns << "Session name is Empty!" << llendl;
+ return ;
+ }
+
+ LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r"); /*Flawfinder: ignore*/
+ if (!fptr) return; //No previous conversation with this name.
+
+ char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+ char *bptr;
+ S32 len;
+ bool firstline = TRUE;
+
+ if (fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //File is smaller than recall size. Get it all.
+ firstline = FALSE;
+ if (fseek(fptr, 0, SEEK_SET))
+ {
+ fclose(fptr);
+ return;
+ }
+ }
+
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+ {
+ len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+ for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
+ if (firstline)
+ {
+ firstline = FALSE;
+ continue;
+ }
+
+ std::string line(buffer);
+
+ //updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
+ if (' ' == line[0])
+ {
+ line.erase(0, MULTI_LINE_PREFIX.length());
+ append_to_last_message(messages, '\n' + line);
+ }
+ else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+ {
+ //to support old format's multilined messages with new lines used to divide paragraphs
+ append_to_last_message(messages, line);
+ }
+ else
+ {
+ LLSD item;
+ if (!LLChatLogParser::parse(line, item))
+ {
+ item[IM_TEXT] = line;
+ }
+ messages.push_back(item);
+ }
+ }
+ fclose(fptr);
+}
+
+//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
+//which are more strict by its nature (only firstname and secondname)
+//Example, an object's name can be writen like "Object <actual_object's_name>"
+void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
+{
+ if (!im.isMap())
+ {
+ llwarning("invalid LLSD type of an instant message", 0);
+ return;
+ }
+
+ if (im[IM_TIME].isDefined())
+ {
+ std::string timestamp = im[IM_TIME].asString();
+ boost::trim(timestamp);
+ ostr << '[' << timestamp << ']' << TWO_SPACES;
+ }
+
+ //*TODO mark object's names in a special way so that they will be distinguishable form avatar name
+ //which are more strict by its nature (only firstname and secondname)
+ //Example, an object's name can be writen like "Object <actual_object's_name>"
+ if (im[IM_FROM].isDefined())
+ {
+ std::string from = im[IM_FROM].asString();
+ boost::trim(from);
+ if (from.size())
+ {
+ ostr << from << IM_SEPARATOR;
+ }
+ }
+
+ if (im[IM_TEXT].isDefined())
+ {
+ std::string im_text = im[IM_TEXT].asString();
+
+ //multilined text will be saved with prepended spaces
+ boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX);
+ ostr << im_text;
+ }
+}
+
+bool LLChatLogParser::parse(std::string& raw, LLSD& im)
+{
+ if (!raw.length()) return false;
+
+ im = LLSD::emptyMap();
+
+ //matching a timestamp
+ boost::match_results<std::string::const_iterator> matches;
+ if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
+
+ bool has_timestamp = matches[IDX_TIMESTAMP].matched;
+ if (has_timestamp)
+ {
+ //timestamp was successfully parsed
+ std::string timestamp = matches[IDX_TIMESTAMP];
+ boost::trim(timestamp);
+ timestamp.erase(0, 1);
+ timestamp.erase(timestamp.length()-1, 1);
+ LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
+ im[IM_TIME] = timestamp;
+ }
+ else
+ {
+ //timestamp is optional
+ im[IM_TIME] = "";
+ }
+
+ bool has_stuff = matches[IDX_STUFF].matched;
+ if (!has_stuff)
+ {
+ return false; //*TODO should return false or not?
+ }
+
+ //matching a name and a text
+ std::string stuff = matches[IDX_STUFF];
+ boost::match_results<std::string::const_iterator> name_and_text;
+ if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
+
+ bool has_name = name_and_text[IDX_NAME].matched;
+ std::string name = name_and_text[IDX_NAME];
+
+ //we don't need a name/text separator
+ if (has_name && name.length() && name[name.length()-1] == ':')
+ {
+ name.erase(name.length()-1, 1);
+ }
+
+ if (!has_name || name == SYSTEM_FROM)
+ {
+ //name is optional too
+ im[IM_FROM] = SYSTEM_FROM;
+ im[IM_FROM_ID] = LLUUID::null;
+ }
+
+ //possibly a case of complex object names consisting of 3+ words
+ if (!has_name)
+ {
+ U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER);
+ if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length()))
+ {
+ im[IM_FROM] = stuff.substr(0, divider_pos);
+ im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length());
+ return true;
+ }
+ }
+
+ if (!has_name)
+ {
+ //text is mandatory
+ im[IM_TEXT] = stuff;
+ return true; //parse as a message from Second Life
+ }
+
+ bool has_text = name_and_text[IDX_TEXT].matched;
+ if (!has_text) return false;
+
+ //for parsing logs created in very old versions of a viewer
+ if (name == "You")
+ {
+ std::string agent_name;
+ LLAgentUI::buildFullname(agent_name);
+ im[IM_FROM] = agent_name;
+ im[IM_FROM_ID] = gAgentID;
+ }
+ else
+ {
+ im[IM_FROM] = name;
+ }
+
+
+ im[IM_TEXT] = name_and_text[IDX_TEXT];
+ return true; //parsed name and message text, maybe have a timestamp too
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index e252cd7d41..4290e4bbc0 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -51,11 +51,66 @@ public:
const LLUUID& from_id,
const std::string& line);
+ /** @deprecated @see loadAllHistory() */
static void loadHistory(const std::string& filename,
void (*callback)(ELogLineType, const LLSD&, void*),
void* userdata);
+
+ static void loadAllHistory(const std::string& file_name, std::list<LLSD>& messages);
private:
static std::string cleanFileName(std::string filename);
};
+/**
+ * Formatter for the plain text chat log files
+ */
+class LLChatLogFormatter
+{
+public:
+ LLChatLogFormatter(const LLSD& im) : mIM(im) {}
+ virtual ~LLChatLogFormatter() {};
+
+ friend std::ostream& operator<<(std::ostream& str, const LLChatLogFormatter& formatter)
+ {
+ formatter.format(formatter.mIM, str);
+ return str;
+ }
+
+protected:
+
+ /**
+ * Format an instant message to a stream
+ * Timestamps and sender names are required
+ * New lines of multilined messages are prepended with a space
+ */
+ void format(const LLSD& im, std::ostream& ostr) const;
+
+ LLSD mIM;
+};
+
+/**
+ * Parser for the plain text chat log files
+ */
+class LLChatLogParser
+{
+public:
+
+ /**
+ * Parse a line from the plain text chat log file
+ * General plain text log format is like: "[timestamp] [name]: [message]"
+ * [timestamp] and [name] are optional
+ * Examples of plain text chat log lines:
+ * "[2009/11/20 2:53] Igor ProductEngine: howdy"
+ * "Igor ProductEngine: howdy"
+ * "Dserduk ProductEngine is Online"
+ *
+ * @return false if failed to parse mandatory data - message text
+ */
+ static bool parse(std::string& raw, LLSD& im);
+
+protected:
+ LLChatLogParser();
+ virtual ~LLChatLogParser() {};
+};
+
#endif
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 6f0b8a3c1e..1be3430e07 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -40,9 +40,12 @@
#include "llurlsimstring.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewernetwork.h" // EGridInfo
+#include "llviewerwindow.h" // getWindow()
// library includes
#include "llmd5.h"
+#include "llweb.h"
+#include "llwindow.h"
// Must have instance to auto-register with LLCommandDispatcher
@@ -56,7 +59,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url)
LLURI uri(url);
parse(uri.queryMap());
- if (mWebLoginKey.isNull() ||
+ if (/*mWebLoginKey.isNull() ||*/
mFirstName.empty() ||
mLastName.empty())
{
@@ -71,7 +74,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url)
void LLLoginHandler::parse(const LLSD& queryMap)
{
- mWebLoginKey = queryMap["web_login_key"].asUUID();
+ //mWebLoginKey = queryMap["web_login_key"].asUUID();
mFirstName = queryMap["first_name"].asString();
mLastName = queryMap["last_name"].asString();
@@ -165,7 +168,41 @@ void LLLoginHandler::parse(const LLSD& queryMap)
bool LLLoginHandler::handle(const LLSD& tokens,
const LLSD& query_map,
LLMediaCtrl* web)
-{
+{
+ if (tokens.size() == 1
+ && tokens[0].asString() == "show")
+ {
+ // We're using reg-in-client, so show the XUI login widgets
+ LLPanelLogin::showLoginWidgets();
+ return true;
+ }
+
+ if (tokens.size() == 1
+ && tokens[0].asString() == "reg")
+ {
+ LLWindow* window = gViewerWindow->getWindow();
+ window->incBusyCount();
+ window->setCursor(UI_CURSOR_ARROW);
+
+ // Do this first, as it may be slow and we want to keep something
+ // on the user's screen as long as possible
+ LLWeb::loadURLExternal( "http://join.eniac15.lindenlab.com/" );
+
+ window->decBusyCount();
+ window->setCursor(UI_CURSOR_ARROW);
+
+ // Then hide the window
+ window->minimize();
+ return true;
+ }
+
+ // Make sure window is visible
+ LLWindow* window = gViewerWindow->getWindow();
+ if (window->getMinimized())
+ {
+ window->restore();
+ }
+
parse(query_map);
//if we haven't initialized stuff yet, this is
@@ -200,14 +237,15 @@ bool LLLoginHandler::handle(const LLSD& tokens,
LLPanelLogin::setFields(mFirstName, mLastName, password);
}
- if (mWebLoginKey.isNull())
- {
- LLPanelLogin::loadLoginPage();
- }
- else
- {
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- }
+ //if (mWebLoginKey.isNull())
+ //{
+ // LLPanelLogin::loadLoginPage();
+ //}
+ //else
+ //{
+ // LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ //}
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
return true;
}
diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h
index d36ceaf3cc..ac4648761b 100644
--- a/indra/newview/llloginhandler.h
+++ b/indra/newview/llloginhandler.h
@@ -48,7 +48,9 @@ class LLLoginHandler : public LLCommandHandler
std::string getFirstName() const { return mFirstName; }
std::string getLastName() const { return mLastName; }
- LLUUID getWebLoginKey() const { return mWebLoginKey; }
+
+ // Web-based login unsupported
+ //LLUUID getWebLoginKey() const { return mWebLoginKey; }
private:
void parse(const LLSD& queryMap);
@@ -56,7 +58,7 @@ private:
private:
std::string mFirstName;
std::string mLastName;
- LLUUID mWebLoginKey;
+ //LLUUID mWebLoginKey;
};
extern LLLoginHandler gLoginHandler;
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index e5f347ddc4..24c72c65ce 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -76,6 +76,7 @@ LLLoginInstance::LLLoginInstance() :
mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
mDispatcher.add("connect", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+ mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));
}
LLLoginInstance::~LLLoginInstance()
@@ -182,12 +183,14 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
mRequestData["method"] = "login_to_simulator";
mRequestData["params"] = request_params;
mRequestData["options"] = requested_options;
+
+ mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+ mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
}
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
{
- std::cout << "LoginListener called!: \n";
- std::cout << event << "\n";
+ LL_DEBUGS("LLLogin") << "LoginListener called!: \n" << event << LL_ENDL;
if(!(event.has("state") && event.has("change") && event.has("progress")))
{
@@ -202,6 +205,8 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)
mTransferRate = event["transfer_rate"].asReal();
}
+
+
// Call the method registered in constructor, if any, for more specific
// handling
LLEventDispatcher::Callable method(mDispatcher.get(event["change"]));
@@ -293,6 +298,22 @@ void LLLoginInstance::handleDisconnect(const LLSD& event)
// placeholder
}
+void LLLoginInstance::handleIndeterminate(const LLSD& event)
+{
+ // The indeterminate response means that the server
+ // gave the viewer a new url and params to try.
+ // The login module handles the retry, but it gives us the
+ // server response so that we may show
+ // the user some status.
+ LLSD message = event.get("data").get("message");
+ if(message.isDefined())
+ {
+ LLSD progress_update;
+ progress_update["desc"] = message;
+ LLEventPumps::getInstance()->obtain("LLProgressView").post(progress_update);
+ }
+}
+
bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
{
if(accepted)
@@ -372,28 +393,6 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)
mNotifications->add(notification_name, args, payload,
boost::bind(&LLLoginInstance::updateDialogCallback, this, _1, _2));
}
-
- /* *NOTE:Mani Experiment with Event API interface.
- if(!mUpdateAppResponse)
- {
- bool make_unique = true;
- mUpdateAppResponse.reset(new LLEventStream("logininstance_updateapp", make_unique));
- mUpdateAppResponse->listen("diaupdateDialogCallback",
- boost::bind(&LLLoginInstance::updateDialogCallback,
- this, _1
- )
- );
- }
-
- LLSD event;
- event["op"] = "requestAdd";
- event["name"] = notification_name;
- event["substitutions"] = args;
- event["payload"] = payload;
- event["reply"] = mUpdateAppResponse->getName();
-
- LLEventPumps::getInstance()->obtain("LLNotifications").post(event);
- */
}
bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD& response)
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 19d7449bc1..c8704eddb4 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -89,6 +89,7 @@ private:
void handleLoginFailure(const LLSD& event);
void handleLoginSuccess(const LLSD& event);
void handleDisconnect(const LLSD& event);
+ void handleIndeterminate(const LLSD& event);
bool handleTOSResponse(bool v, const std::string& key);
@@ -107,7 +108,6 @@ private:
std::string mSerialNumber;
int mLastExecEvent;
UpdaterLauncherCallback mUpdaterLauncher;
- boost::scoped_ptr<LLEventStream> mUpdateAppResponse;
LLEventDispatcher mDispatcher;
};
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index f62d7229a3..a96240e31c 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -265,8 +265,8 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
BOOL result = FALSE;
- F32 mouse_x = ((F32)x / gViewerWindow->getWindowWidth() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
- F32 mouse_y = ((F32)y / gViewerWindow->getWindowHeight() - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
+ F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgent.mHUDCurZoom;
LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin);
LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y);
@@ -304,8 +304,8 @@ BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, co
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidth()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
- F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeight()) - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
+ F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgent.mHUDCurZoom;
a1 = LLVector3(llmin(b1.mV[VX] - 0.1f, b2.mV[VX] - 0.1f, 0.f), -mouse_x, mouse_y);
a2 = a1 + LLVector3(1.f, 0.f, 0.f);
}
@@ -429,13 +429,14 @@ void LLManip::renderXYZ(const LLVector3 &vec)
const S32 PAD = 10;
std::string feedback_string;
LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis();
- S32 vertical_offset = gViewerWindow->getWindowHeight() / 2 - VERTICAL_OFFSET;
- S32 window_center_x = gViewerWindow->getWindowWidth() / 2;
- S32 window_center_y = gViewerWindow->getWindowHeight() / 2;
+ S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
+ S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2;
+ S32 vertical_offset = window_center_y - VERTICAL_OFFSET;
+
glPushMatrix();
{
- LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+ LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
gViewerWindow->setup2DRender();
const LLVector2& display_scale = gViewerWindow->getDisplayScale();
glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index c99e67be3f..8535d52015 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1107,8 +1107,11 @@ BOOL LLManipRotate::updateVisiblity()
mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
- mCenterScreen.set((S32)((0.5f - mRotationCenter.mdV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewWidth()),
- (S32)((mRotationCenter.mdV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeight()));
+ // x axis range is (-aspect * 0.5f, +aspect * 0.5)
+ // y axis range is (-0.5, 0.5)
+ // so use getWorldViewHeightRaw as scale factor when converting to pixel coordinates
+ mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()),
+ (S32)((center.mV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()));
visible = TRUE;
}
else
@@ -1624,8 +1627,8 @@ void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_
{
if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
{
- F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewWidth()) - 0.5f) / gAgent.mHUDCurZoom;
- F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewHeight()) - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgent.mHUDCurZoom;
*ray_pt = LLVector3(-1.f, -mouse_x, mouse_y);
*ray_dir = LLVector3(1.f, 0.f, 0.f);
@@ -1699,7 +1702,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y )
F32 dist_y = mouse_dir_y.normVec();
F32 dist_z = mouse_dir_z.normVec();
- F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeight();
+ F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeightScaled();
if (llabs(dist_x - mRadiusMeters) * llmax(0.05f, proj_rot_x_axis) < distance_threshold)
{
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 72596e850a..ee3ffa2450 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -180,6 +180,7 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
mScaleSnapUnit2(1.f),
mSnapRegimeOffset(0.f),
mSnapGuideLength(0.f),
+ mInSnapRegime(FALSE),
mScaleSnapValue(0.f)
{
mManipulatorScales = new F32[NUM_MANIPULATORS];
@@ -493,8 +494,9 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
mProjectedManipulators.insert(projManipulator);
}
- F32 half_width = (F32)gViewerWindow->getWorldViewWidth() / 2.f;
- F32 half_height = (F32)gViewerWindow->getWorldViewHeight() / 2.f;
+ LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
+ F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
+ F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
LLVector2 manip2d;
LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
LLVector2 delta;
@@ -1368,7 +1370,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
else
{
F32 object_distance = dist_vec(mScaleCenter, LLViewerCamera::getInstance()->getOrigin());
- mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidth() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
+ mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidthRaw() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
}
LLVector3 cam_at_axis;
F32 snap_guide_length;
@@ -1381,7 +1383,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
{
cam_at_axis = LLViewerCamera::getInstance()->getAtAxis();
F32 manipulator_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin());
- snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidth() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
+ snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidthRaw() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
}
mSnapGuideLength = snap_guide_length / llmax(0.1f, (llmin(mSnapGuideDir1 * cam_at_axis, mSnapGuideDir2 * cam_at_axis)));
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 2153f77336..52fe31fbba 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -101,6 +101,16 @@ const U32 ARROW_TO_AXIS[4] =
VZ
};
+// Sort manipulator handles by their screen-space projection
+struct ClosestToCamera
+{
+ bool operator()(const LLManipTranslate::ManipulatorHandle& a,
+ const LLManipTranslate::ManipulatorHandle& b) const
+ {
+ return a.mEndPosition.mV[VZ] < b.mEndPosition.mV[VZ];
+ }
+};
+
LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
: LLManip( std::string("Move"), composite ),
mLastHoverMouseX(-1),
@@ -113,9 +123,13 @@ LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
mAxisArrowLength(50),
mConeSize(0),
mArrowLengthMeters(0.f),
+ mGridSizeMeters(1.f),
mPlaneManipOffsetMeters(0.f),
mUpdateTimer(),
mSnapOffsetMeters(0.f),
+ mSubdivisions(10.f),
+ mInSnapRegime(FALSE),
+ mSnapped(FALSE),
mArrowScales(1.f, 1.f, 1.f),
mPlaneScales(1.f, 1.f, 1.f),
mPlaneManipPositions(1.f, 1.f, 1.f, 1.f)
@@ -163,7 +177,7 @@ void LLManipTranslate::restoreGL()
GLuint* d = new GLuint[rez*rez];
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName());
+ gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName(), true);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
while (rez >= 1)
@@ -273,7 +287,6 @@ void LLManipTranslate::restoreGL()
LLManipTranslate::~LLManipTranslate()
{
- for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
}
@@ -413,8 +426,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
}
// Handle auto-rotation if necessary.
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
- const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20;
+ const S32 ROTATE_H_MARGIN = world_rect.getWidth() / 20;
const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
BOOL rotated = FALSE;
@@ -426,7 +440,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
gAgent.cameraOrbitAround(rotate_angle);
rotated = TRUE;
}
- else if (x > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN)
+ else if (x > world_rect.getWidth() - ROTATE_H_MARGIN)
{
gAgent.cameraOrbitAround(-rotate_angle);
rotated = TRUE;
@@ -887,8 +901,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
planar_manip_xy_visible = TRUE;
}
- for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
- mProjectedManipulators.clear();
+ // Project up to 9 manipulators to screen space 2*X, 2*Y, 2*Z, 3*planes
+ std::vector<ManipulatorHandle> projected_manipulators;
+ projected_manipulators.reserve(9);
for (S32 i = 0; i < num_arrow_manips; i+= 2)
{
@@ -898,12 +913,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
projected_end = projected_end * (1.f / projected_end.mV[VW]);
- ManipulatorHandle* projManipulator =
- new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
+ ManipulatorHandle projected_manip(
+ LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]),
MANIPULATOR_IDS[i / 2],
10.f); // 10 pixel hotspot for arrows
- mProjectedManipulators.insert(projManipulator);
+ projected_manipulators.push_back(projected_manip);
}
if (planar_manip_yz_visible)
@@ -915,12 +930,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
projected_end = projected_end * (1.f / projected_end.mV[VW]);
- ManipulatorHandle* projManipulator =
- new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
+ ManipulatorHandle projected_manip(
+ LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]),
MANIPULATOR_IDS[i / 2],
20.f); // 20 pixels for planar manipulators
- mProjectedManipulators.insert(projManipulator);
+ projected_manipulators.push_back(projected_manip);
}
if (planar_manip_xz_visible)
@@ -932,12 +947,12 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
projected_end = projected_end * (1.f / projected_end.mV[VW]);
- ManipulatorHandle* projManipulator =
- new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
+ ManipulatorHandle projected_manip(
+ LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]),
MANIPULATOR_IDS[i / 2],
20.f); // 20 pixels for planar manipulators
- mProjectedManipulators.insert(projManipulator);
+ projected_manipulators.push_back(projected_manip);
}
if (planar_manip_xy_visible)
@@ -949,29 +964,35 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLVector4 projected_end = mManipulatorVertices[i + 1] * transform;
projected_end = projected_end * (1.f / projected_end.mV[VW]);
- ManipulatorHandle* projManipulator =
- new ManipulatorHandle(LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
+ ManipulatorHandle projected_manip(
+ LLVector3(projected_start.mV[VX], projected_start.mV[VY], projected_start.mV[VZ]),
LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]),
MANIPULATOR_IDS[i / 2],
20.f); // 20 pixels for planar manipulators
- mProjectedManipulators.insert(projManipulator);
+ projected_manipulators.push_back(projected_manip);
}
LLVector2 manip_start_2d;
LLVector2 manip_end_2d;
LLVector2 manip_dir;
- F32 half_width = gViewerWindow->getWorldViewWidth() / 2.f;
- F32 half_height = gViewerWindow->getWorldViewHeight() / 2.f;
+ LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
+ F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
+ F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
LLVector2 mouse_delta;
- for (minpulator_list_t::iterator iter = mProjectedManipulators.begin();
- iter != mProjectedManipulators.end(); ++iter)
+ // Keep order consistent with insertion via stable_sort
+ std::stable_sort( projected_manipulators.begin(),
+ projected_manipulators.end(),
+ ClosestToCamera() );
+
+ std::vector<ManipulatorHandle>::iterator it = projected_manipulators.begin();
+ for ( ; it != projected_manipulators.end(); ++it)
{
- ManipulatorHandle* manipulator = *iter;
+ ManipulatorHandle& manipulator = *it;
{
- manip_start_2d.setVec(manipulator->mStartPosition.mV[VX] * half_width, manipulator->mStartPosition.mV[VY] * half_height);
- manip_end_2d.setVec(manipulator->mEndPosition.mV[VX] * half_width, manipulator->mEndPosition.mV[VY] * half_height);
+ manip_start_2d.setVec(manipulator.mStartPosition.mV[VX] * half_width, manipulator.mStartPosition.mV[VY] * half_height);
+ manip_end_2d.setVec(manipulator.mEndPosition.mV[VX] * half_width, manipulator.mEndPosition.mV[VY] * half_height);
manip_dir = manip_end_2d - manip_start_2d;
mouse_delta = mousePos - manip_start_2d;
@@ -983,9 +1004,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
if (mouse_pos_manip > 0.f &&
mouse_pos_manip < manip_length &&
- mouse_dist_manip_squared < manipulator->mHotSpotRadius * manipulator->mHotSpotRadius)
+ mouse_dist_manip_squared < manipulator.mHotSpotRadius * manipulator.mHotSpotRadius)
{
- mHighlightedPart = manipulator->mManipID;
+ mHighlightedPart = manipulator.mManipID;
break;
}
}
@@ -1225,7 +1246,7 @@ void LLManipTranslate::renderSnapGuides()
{
LLVector3 cam_to_selection = getPivotPoint() - LLViewerCamera::getInstance()->getOrigin();
F32 current_range = cam_to_selection.normVec();
- guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeight() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio();
+ guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeightRaw() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio();
F32 fraction_of_fov = mAxisArrowLength / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
@@ -1438,7 +1459,7 @@ void LLManipTranslate::renderSnapGuides()
LLVector3 help_text_pos = selection_center_start + (snap_offset_meters_up * 3.f * mSnapOffsetAxis);
const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
- std::string help_text = "Move mouse cursor over ruler to snap";
+ std::string help_text = "Move mouse cursor over ruler";
LLColor4 help_text_color = LLColor4::white;
help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, line_alpha, 0.f);
hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
@@ -1800,7 +1821,7 @@ void LLManipTranslate::renderTranslationHandles()
// Drag handles
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeight();
+ mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeightRaw();
mArrowLengthMeters /= gAgent.mHUDCurZoom;
}
else
diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h
index 25ff35cc72..d20b86b2f4 100644
--- a/indra/newview/llmaniptranslate.h
+++ b/indra/newview/llmaniptranslate.h
@@ -89,17 +89,6 @@ protected:
F32 getMinGridScale();
private:
- struct compare_manipulators
- {
- bool operator() (const ManipulatorHandle* const a, const ManipulatorHandle* const b) const
- {
- if (a->mEndPosition.mV[VZ] != b->mEndPosition.mV[VZ])
- return (a->mEndPosition.mV[VZ] < b->mEndPosition.mV[VZ]);
- else
- return a->mManipID < b->mManipID;
- }
- };
-
S32 mLastHoverMouseX;
S32 mLastHoverMouseY;
BOOL mSendUpdateOnMouseUp;
@@ -116,8 +105,6 @@ private:
LLVector3d mDragCursorStartGlobal;
LLVector3d mDragSelectionStartGlobal;
LLTimer mUpdateTimer;
- typedef std::set<ManipulatorHandle*, compare_manipulators> minpulator_list_t;
- minpulator_list_t mProjectedManipulators;
LLVector4 mManipulatorVertices[18];
F32 mSnapOffsetMeters;
LLVector3 mSnapOffsetAxis;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 8f29f908e5..501a137b42 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -39,13 +39,12 @@
#include "llfloaterworldmap.h"
#include "lluictrlfactory.h"
#include "llurldispatcher.h"
-#include "llurlsimstring.h"
#include "llviewborder.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llweb.h"
#include "llrender.h"
#include "llpluginclassmedia.h"
@@ -85,33 +84,34 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mHomePageUrl( "" ),
mIgnoreUIScale( true ),
mAlwaysRefresh( false ),
- mExternalUrl( "" ),
mMediaSource( 0 ),
mTakeFocusOnClick( true ),
mCurrentNavUrl( "" ),
mStretchToFill( true ),
mMaintainAspectRatio ( true ),
mHideLoading (false),
+ mHidingInitialLoad (false),
mDecoupleTextureSize ( false ),
mTextureWidth ( 1024 ),
- mTextureHeight ( 1024 )
+ mTextureHeight ( 1024 ),
+ mClearCache(false)
{
{
LLColor4 color = p.caret_color().get();
setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] );
}
- setIgnoreUIScale(p.ignore_ui_scale());
+ setIgnoreUIScale(p.ignore_ui_scale);
- setHomePageUrl(p.start_url());
+ setHomePageUrl(p.start_url);
- setBorderVisible(p.border_visible());
+ setBorderVisible(p.border_visible);
- mHideLoading = p.hide_loading();
+ mHideLoading = p.hide_loading;
- setDecoupleTextureSize(p.decouple_texture_size());
+ setDecoupleTextureSize(p.decouple_texture_size);
- setTextureSize(p.texture_width(), p.texture_height());
+ setTextureSize(p.texture_width, p.texture_height);
if(!getDecoupleTextureSize())
{
@@ -355,7 +355,7 @@ void LLMediaCtrl::onFocusLost()
//
BOOL LLMediaCtrl::postBuild ()
{
- mVisibleSignal.connect(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
return TRUE;
}
@@ -490,6 +490,21 @@ void LLMediaCtrl::clr404RedirectUrl()
////////////////////////////////////////////////////////////////////////////////
//
+void LLMediaCtrl::clearCache()
+{
+ if(mMediaSource)
+ {
+ mMediaSource->clearCache();
+ }
+ else
+ {
+ mClearCache = true;
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
void LLMediaCtrl::navigateTo( std::string url_in, std::string mime_type)
{
// don't browse to anything that starts with secondlife:// or sl://
@@ -527,9 +542,9 @@ void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::str
if (! gDirUtilp->fileExists(expanded_filename))
{
- if (language != "en-us")
+ if (language != "en")
{
- expanded_filename = gDirUtilp->findSkinnedFilename("html", "en-us", filename);
+ expanded_filename = gDirUtilp->findSkinnedFilename("html", "en", filename);
if (! gDirUtilp->fileExists(expanded_filename))
{
llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;
@@ -616,6 +631,17 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->setHomeURL(mHomePageUrl);
mMediaSource->setVisible( getVisible() );
mMediaSource->addObserver( this );
+ mMediaSource->setBackgroundColor( getBackgroundColor() );
+ if(mClearCache)
+ {
+ mMediaSource->clearCache();
+ mClearCache = false;
+ }
+
+ if(mHideLoading)
+ {
+ mHidingInitialLoad = true;
+ }
}
else
{
@@ -645,34 +671,12 @@ LLPluginClassMedia* LLMediaCtrl::getMediaPlugin()
//
void LLMediaCtrl::draw()
{
- LLPluginClassMedia* media_plugin = NULL;
-
- if(mMediaSource && mMediaSource->hasMedia())
- {
- media_plugin = mMediaSource->getMediaPlugin();
- }
- else
- {
- return;
- }
-
- if(!media_plugin || (!media_plugin->textureValid()))
- {
- // Don't try to draw without a valid texture
- return;
- }
-
- LLViewerMediaTexture* media_texture = LLViewerTextureManager::findMediaTexture(mMediaTextureID);
-
- if (!media_texture )
- return;
-
if ( gRestoreGL == 1 )
{
LLRect r = getRect();
reshape( r.getWidth(), r.getHeight(), FALSE );
return;
- };
+ }
// NOTE: optimization needed here - probably only need to do this once
// unless tearoffs change the parent which they probably do.
@@ -685,112 +689,162 @@ void LLMediaCtrl::draw()
{
setFrequentUpdates( false );
};
-
- // alpha off for this
- LLGLSUIDefault gls_ui;
- LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
-
- gGL.pushMatrix();
+
+ bool draw_media = false;
+
+ LLPluginClassMedia* media_plugin = NULL;
+ LLViewerMediaTexture* media_texture = NULL;
+
+ if(mMediaSource && mMediaSource->hasMedia())
{
- if (mIgnoreUIScale)
+ media_plugin = mMediaSource->getMediaPlugin();
+
+ if(media_plugin && (media_plugin->textureValid()))
{
- glLoadIdentity();
- // font system stores true screen origin, need to scale this by UI scale factor
- // to get render origin for this view (with unit scale)
- gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
- floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
- LLFontGL::sCurOrigin.mZ);
+ media_texture = LLViewerTextureManager::findMediaTexture(mMediaTextureID);
+ if(media_texture)
+ {
+ draw_media = true;
+ }
}
+ }
+
+ if(mHidingInitialLoad)
+ {
+ // If we're hiding loading, don't draw at all.
+ draw_media = false;
+ }
+
+ bool background_visible = isBackgroundVisible();
+ bool background_opaque = isBackgroundOpaque();
+
+ if(draw_media)
+ {
+ // alpha off for this
+ LLGLSUIDefault gls_ui;
+ LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
- // scale texture to fit the space using texture coords
- gGL.getTexUnit(0)->bind(media_texture);
- gGL.color4fv( LLColor4::white.mV );
- F32 max_u = ( F32 )media_plugin->getWidth() / ( F32 )media_plugin->getTextureWidth();
- F32 max_v = ( F32 )media_plugin->getHeight() / ( F32 )media_plugin->getTextureHeight();
-
- LLRect r = getRect();
- S32 width, height;
- S32 x_offset = 0;
- S32 y_offset = 0;
-
- if(mStretchToFill)
+ gGL.pushMatrix();
{
- if(mMaintainAspectRatio)
+ if (mIgnoreUIScale)
{
- F32 media_aspect = (F32)(media_plugin->getWidth()) / (F32)(media_plugin->getHeight());
- F32 view_aspect = (F32)(r.getWidth()) / (F32)(r.getHeight());
- if(media_aspect > view_aspect)
+ glLoadIdentity();
+ // font system stores true screen origin, need to scale this by UI scale factor
+ // to get render origin for this view (with unit scale)
+ gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
+ floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
+ LLFontGL::sCurOrigin.mZ);
+ }
+
+ // scale texture to fit the space using texture coords
+ gGL.getTexUnit(0)->bind(media_texture);
+ gGL.color4fv( LLColor4::white.mV );
+ F32 max_u = ( F32 )media_plugin->getWidth() / ( F32 )media_plugin->getTextureWidth();
+ F32 max_v = ( F32 )media_plugin->getHeight() / ( F32 )media_plugin->getTextureHeight();
+
+ LLRect r = getRect();
+ S32 width, height;
+ S32 x_offset = 0;
+ S32 y_offset = 0;
+
+ if(mStretchToFill)
+ {
+ if(mMaintainAspectRatio)
{
- // max width, adjusted height
- width = r.getWidth();
- height = llmin(llmax(S32(width / media_aspect), 0), r.getHeight());
+ F32 media_aspect = (F32)(media_plugin->getWidth()) / (F32)(media_plugin->getHeight());
+ F32 view_aspect = (F32)(r.getWidth()) / (F32)(r.getHeight());
+ if(media_aspect > view_aspect)
+ {
+ // max width, adjusted height
+ width = r.getWidth();
+ height = llmin(llmax(llround(width / media_aspect), 0), r.getHeight());
+ }
+ else
+ {
+ // max height, adjusted width
+ height = r.getHeight();
+ width = llmin(llmax(llround(height * media_aspect), 0), r.getWidth());
+ }
}
else
{
- // max height, adjusted width
+ width = r.getWidth();
height = r.getHeight();
- width = llmin(llmax(S32(height * media_aspect), 0), r.getWidth());
}
}
else
{
- width = r.getWidth();
- height = r.getHeight();
+ width = llmin(media_plugin->getWidth(), r.getWidth());
+ height = llmin(media_plugin->getHeight(), r.getHeight());
}
- }
- else
- {
- width = llmin(media_plugin->getWidth(), r.getWidth());
- height = llmin(media_plugin->getHeight(), r.getHeight());
- }
-
- x_offset = (r.getWidth() - width) / 2;
- y_offset = (r.getHeight() - height) / 2;
+
+ x_offset = (r.getWidth() - width) / 2;
+ y_offset = (r.getHeight() - height) / 2;
- // draw the browser
- gGL.setSceneBlendType(LLRender::BT_REPLACE);
- gGL.begin( LLRender::QUADS );
- if (! media_plugin->getTextureCoordsOpenGL())
- {
- // render using web browser reported width and height, instead of trying to invert GL scale
- gGL.texCoord2f( max_u, 0.f );
- gGL.vertex2i( x_offset + width, y_offset + height );
+ if(mIgnoreUIScale)
+ {
+ x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]);
+ y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]);
+ width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
+ height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
+ }
- gGL.texCoord2f( 0.f, 0.f );
- gGL.vertex2i( x_offset, y_offset + height );
+ // draw the browser
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ gGL.begin( LLRender::QUADS );
+ if (! media_plugin->getTextureCoordsOpenGL())
+ {
+ // render using web browser reported width and height, instead of trying to invert GL scale
+ gGL.texCoord2f( max_u, 0.f );
+ gGL.vertex2i( x_offset + width, y_offset + height );
- gGL.texCoord2f( 0.f, max_v );
- gGL.vertex2i( x_offset, y_offset );
+ gGL.texCoord2f( 0.f, 0.f );
+ gGL.vertex2i( x_offset, y_offset + height );
- gGL.texCoord2f( max_u, max_v );
- gGL.vertex2i( x_offset + width, y_offset );
- }
- else
- {
- // render using web browser reported width and height, instead of trying to invert GL scale
- gGL.texCoord2f( max_u, max_v );
- gGL.vertex2i( x_offset + width, y_offset + height );
+ gGL.texCoord2f( 0.f, max_v );
+ gGL.vertex2i( x_offset, y_offset );
+
+ gGL.texCoord2f( max_u, max_v );
+ gGL.vertex2i( x_offset + width, y_offset );
+ }
+ else
+ {
+ // render using web browser reported width and height, instead of trying to invert GL scale
+ gGL.texCoord2f( max_u, max_v );
+ gGL.vertex2i( x_offset + width, y_offset + height );
- gGL.texCoord2f( 0.f, max_v );
- gGL.vertex2i( x_offset, y_offset + height );
+ gGL.texCoord2f( 0.f, max_v );
+ gGL.vertex2i( x_offset, y_offset + height );
- gGL.texCoord2f( 0.f, 0.f );
- gGL.vertex2i( x_offset, y_offset );
+ gGL.texCoord2f( 0.f, 0.f );
+ gGL.vertex2i( x_offset, y_offset );
- gGL.texCoord2f( max_u, 0.f );
- gGL.vertex2i( x_offset + width, y_offset );
+ gGL.texCoord2f( max_u, 0.f );
+ gGL.vertex2i( x_offset + width, y_offset );
+ }
+ gGL.end();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
- gGL.end();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ gGL.popMatrix();
+
}
- gGL.popMatrix();
-
+ else
+ {
+ // Setting these will make LLPanel::draw draw the opaque background color.
+ setBackgroundVisible(true);
+ setBackgroundOpaque(true);
+ }
+
// highlight if keyboard focus here. (TODO: this needs some work)
if ( mBorder && mBorder->getVisible() )
mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus( this ) );
LLPanel::draw();
+
+ // Restore the previous values
+ setBackgroundVisible(background_visible);
+ setBackgroundOpaque(background_opaque);
}
////////////////////////////////////////////////////////////////////////////////
@@ -816,20 +870,6 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
}
////////////////////////////////////////////////////////////////////////////////
-// static
-bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )
-{
- S32 option = LLNotification::getSelectedOption(notification, response);
- if ( 0 == option )
- {
- // open in external browser because we don't support
- // creation of our own secondary browser windows
- LLWeb::loadURLExternal( notification["payload"]["external_url"].asString() );
- }
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
// inherited from LLViewerMediaObserver
//virtual
void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
@@ -865,19 +905,15 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
case MEDIA_EVENT_NAVIGATE_BEGIN:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL;
- if(mMediaSource && mHideLoading)
- {
- mMediaSource->suspendUpdates(true);
- }
};
break;
case MEDIA_EVENT_NAVIGATE_COMPLETE:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL;
- if(mMediaSource && mHideLoading)
+ if(mHidingInitialLoad)
{
- mMediaSource->suspendUpdates(false);
+ mHidingInitialLoad = false;
}
};
break;
@@ -942,50 +978,91 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
{
// retrieve the event parameters
- std::string target = self->getClickTarget();
std::string url = self->getClickURL();
+ U32 target_type = self->getClickTargetType();
- // if there is a value for the target
- if ( !target.empty() )
+ // is there is a target specified for the link?
+ if (target_type == LLPluginClassMedia::TARGET_EXTERNAL ||
+ target_type == LLPluginClassMedia::TARGET_BLANK )
{
- if ( target == "_external" )
+ if (gSavedSettings.getBOOL("UseExternalBrowser"))
{
- mExternalUrl = url;
LLSD payload;
- payload["external_url"] = mExternalUrl;
- LLNotifications::instance().add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
- return;
+ payload["url"] = url;
+ payload["target_type"] = LLSD::Integer(target_type);
+ LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+ }
+ else
+ {
+ clickLinkWithTarget(url, target_type);
}
}
-
- const std::string protocol1( "http://" );
- const std::string protocol2( "https://" );
- if( mOpenLinksInExternalBrowser )
- {
- if ( !url.empty() )
+ else {
+ const std::string protocol1( "http://" );
+ const std::string protocol2( "https://" );
+ if( mOpenLinksInExternalBrowser )
{
- if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
- LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ if ( !url.empty() )
{
- LLWeb::loadURLExternal( url );
+ if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
+ LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ {
+ LLWeb::loadURLExternal( url );
+ }
}
}
- }
- else
- if( mOpenLinksInInternalBrowser )
- {
- if ( !url.empty() )
+ else
+ if( mOpenLinksInInternalBrowser )
{
- if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
- LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ if ( !url.empty() )
{
- llwarns << "Dead, unimplemented path that we used to send to the built-in browser long ago." << llendl;
+ if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
+ LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
+ {
+ llwarns << "Dead, unimplemented path that we used to send to the built-in browser long ago." << llendl;
+ }
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if ( 0 == option )
+ {
+ LLSD payload = notification["payload"];
+ std::string url = payload["url"].asString();
+ S32 target_type = payload["target_type"].asInteger();
+ clickLinkWithTarget(url, target_type);
+ }
+ return false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLMediaCtrl::clickLinkWithTarget(const std::string& url, const S32& target_type )
+{
+ if (target_type == LLPluginClassMedia::TARGET_EXTERNAL)
+ {
+ // load target in an external browser
+ LLWeb::loadURLExternal(url);
+ }
+ else if (target_type == LLPluginClassMedia::TARGET_BLANK)
+ {
+ // load target in the user's preferred browser
+ LLWeb::loadURL(url);
+ }
+ else {
+ // unsupported link target - shouldn't happen
+ LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
//
void LLMediaCtrl::onClickLinkNoFollow( LLPluginClassMedia* self )
{
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 76ddc61ebf..60e0c4073b 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -117,6 +117,9 @@ public:
// set/clear URL to visit when a 404 page is reached
void set404RedirectUrl( std::string redirect_url );
void clr404RedirectUrl();
+
+ // Clear the browser cache when the instance gets loaded
+ void clearCache();
// accessor/mutator for flag that indicates if frequent updates to texture happen
bool getFrequentUpdates() { return mFrequentUpdates; };
@@ -169,6 +172,7 @@ public:
private:
void onVisibilityChange ( const LLSD& new_visibility );
static bool onClickLinkExternalTarget( const LLSD&, const LLSD& );
+ static void clickLinkWithTarget(const std::string& url, const S32& target_type );
const S32 mTextureDepthBytes;
LLUUID mMediaTextureID;
@@ -179,7 +183,6 @@ public:
bool mOpenLinksInInternalBrowser;
bool mTrusted;
std::string mHomePageUrl;
- std::string mExternalUrl;
std::string mCurrentNavUrl;
bool mIgnoreUIScale;
bool mAlwaysRefresh;
@@ -188,9 +191,11 @@ public:
bool mStretchToFill;
bool mMaintainAspectRatio;
bool mHideLoading;
+ bool mHidingInitialLoad;
bool mDecoupleTextureSize;
S32 mTextureWidth;
S32 mTextureHeight;
+ bool mClearCache;
};
#endif // LL_LLMediaCtrl_H
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 512104a2f4..b8da368bd7 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -58,112 +58,382 @@
// - Any request that gets a 503 still goes through the retry logic
//
+//
+// Forward decls
+//
const F32 LLMediaDataClient::QUEUE_TIMER_DELAY = 1.0; // seconds(s)
const F32 LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY = 5.0; // secs
const U32 LLMediaDataClient::MAX_RETRIES = 4;
+const U32 LLMediaDataClient::MAX_SORTED_QUEUE_SIZE = 10000;
+const U32 LLMediaDataClient::MAX_ROUND_ROBIN_QUEUE_SIZE = 10000;
+
+// << operators
+std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue_t &q);
+std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &q);
//////////////////////////////////////////////////////////////////////////////////////
//
-// LLMediaDataClient::Request
+// LLMediaDataClient
//
//////////////////////////////////////////////////////////////////////////////////////
-/*static*/U32 LLMediaDataClient::Request::sNum = 0;
-LLMediaDataClient::Request::Request(const std::string &cap_name,
- const LLSD& sd_payload,
- LLMediaDataClientObject *obj,
- LLMediaDataClient *mdc)
- : mCapName(cap_name),
- mPayload(sd_payload),
- mObject(obj),
- mNum(++sNum),
- mRetryCount(0),
- mMDC(mdc)
+LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay,
+ F32 retry_timer_delay,
+ U32 max_retries,
+ U32 max_sorted_queue_size,
+ U32 max_round_robin_queue_size)
+ : mQueueTimerDelay(queue_timer_delay),
+ mRetryTimerDelay(retry_timer_delay),
+ mMaxNumRetries(max_retries),
+ mMaxSortedQueueSize(max_sorted_queue_size),
+ mMaxRoundRobinQueueSize(max_round_robin_queue_size),
+ mQueueTimerIsRunning(false),
+ mCurrentQueueIsTheSortedQueue(true)
{
}
-LLMediaDataClient::Request::~Request()
+LLMediaDataClient::~LLMediaDataClient()
{
- LL_DEBUGS("LLMediaDataClient") << "~Request" << (*this) << LL_ENDL;
- mMDC = NULL;
- mObject = NULL;
+ stopQueueTimer();
+
+ // This should clear the queue, and hopefully call all the destructors.
+ LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClient destructor: queue: " <<
+ (isEmpty() ? "<empty> " : "<not empty> ") << LL_ENDL;
+
+ mSortedQueue.clear();
+ mRoundRobinQueue.clear();
}
-
-std::string LLMediaDataClient::Request::getCapability() const
+bool LLMediaDataClient::isEmpty() const
{
- return getObject()->getCapabilityUrl(getCapName());
+ return mSortedQueue.empty() && mRoundRobinQueue.empty();
}
-// Helper function to get the "type" of request, which just pokes around to
-// discover it.
-LLMediaDataClient::Request::Type LLMediaDataClient::Request::getType() const
+bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object)
+{
+ return (LLMediaDataClient::findOrRemove(mSortedQueue, object, false/*remove*/, LLMediaDataClient::Request::ANY).notNull()
+ || (LLMediaDataClient::findOrRemove(mRoundRobinQueue, object, false/*remove*/, LLMediaDataClient::Request::ANY).notNull()));
+}
+
+bool LLMediaDataClient::removeFromQueue(const LLMediaDataClientObject::ptr_t &object)
+{
+ bool removedFromSortedQueue = LLMediaDataClient::findOrRemove(mSortedQueue, object, true/*remove*/, LLMediaDataClient::Request::ANY).notNull();
+ bool removedFromRoundRobinQueue = LLMediaDataClient::findOrRemove(mRoundRobinQueue, object, true/*remove*/, LLMediaDataClient::Request::ANY).notNull();
+ return removedFromSortedQueue || removedFromRoundRobinQueue;
+}
+
+//static
+LLMediaDataClient::request_ptr_t LLMediaDataClient::findOrRemove(request_queue_t &queue, const LLMediaDataClientObject::ptr_t &obj, bool remove, LLMediaDataClient::Request::Type type)
{
- if (mCapName == "ObjectMediaNavigate")
+ request_ptr_t result;
+ request_queue_t::iterator iter = queue.begin();
+ request_queue_t::iterator end = queue.end();
+ while (iter != end)
{
- return NAVIGATE;
+ if (obj->getID() == (*iter)->getObject()->getID() && (type == LLMediaDataClient::Request::ANY || type == (*iter)->getType()))
+ {
+ result = *iter;
+ if (remove) queue.erase(iter);
+ break;
+ }
+ iter++;
}
- else if (mCapName == "ObjectMedia")
+ return result;
+}
+
+void LLMediaDataClient::request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload)
+{
+ if (object.isNull() || ! object->hasMedia()) return;
+
+ // Push the object on the queue
+ enqueue(new Request(getCapabilityName(), payload, object, this));
+}
+
+void LLMediaDataClient::enqueue(const Request *request)
+{
+ if (request->isNew())
+ {
+ // Add to sorted queue
+ if (LLMediaDataClient::findOrRemove(mSortedQueue, request->getObject(), true/*remove*/, request->getType()).notNull())
+ {
+ LL_DEBUGS("LLMediaDataClient") << "REMOVING OLD request for " << *request << " ALREADY THERE!" << LL_ENDL;
+ }
+
+ LL_DEBUGS("LLMediaDataClient") << "Queuing SORTED request for " << *request << LL_ENDL;
+
+ // Sadly, we have to const-cast because items put into the queue are not const
+ mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request));
+
+ LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mSortedQueue << LL_ENDL;
+ }
+ else {
+ if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize)
+ {
+ LL_INFOS_ONCE("LLMediaDataClient") << "RR QUEUE MAXED OUT!!!" << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClient") << "Not queuing " << *request << LL_ENDL;
+ return;
+ }
+
+ // ROUND ROBIN: if it is there, and it is a GET request, leave it. If not, put at front!
+ request_ptr_t existing_request;
+ if (request->getType() == Request::GET)
+ {
+ existing_request = LLMediaDataClient::findOrRemove(mRoundRobinQueue, request->getObject(), false/*remove*/, request->getType());
+ }
+ if (existing_request.isNull())
+ {
+ LL_DEBUGS("LLMediaDataClient") << "Queuing RR request for " << *request << LL_ENDL;
+ // Push the request on the pending queue
+ // Sadly, we have to const-cast because items put into the queue are not const
+ mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request));
+
+ LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("LLMediaDataClient") << "ALREADY THERE: NOT Queuing request for " << *request << LL_ENDL;
+
+ existing_request->markSent(false);
+ }
+ }
+ // Start the timer if not already running
+ startQueueTimer();
+}
+
+void LLMediaDataClient::startQueueTimer()
+{
+ if (! mQueueTimerIsRunning)
{
- const std::string &verb = mPayload["verb"];
- if (verb == "GET")
+ LL_DEBUGS("LLMediaDataClient") << "starting queue timer (delay=" << mQueueTimerDelay << " seconds)" << LL_ENDL;
+ // LLEventTimer automagically takes care of the lifetime of this object
+ new QueueTimer(mQueueTimerDelay, this);
+ }
+ else {
+ LL_DEBUGS("LLMediaDataClient") << "not starting queue timer (it's already running, right???)" << LL_ENDL;
+ }
+}
+
+void LLMediaDataClient::stopQueueTimer()
+{
+ mQueueTimerIsRunning = false;
+}
+
+bool LLMediaDataClient::processQueueTimer()
+{
+ sortQueue();
+
+ if(!isEmpty())
+ {
+ LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is: " << mSortedQueue.size()
+ << ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, SORTED queue is: " << mSortedQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, RR queue is: " << mRoundRobinQueue << LL_ENDL;
+ }
+
+ serviceQueue();
+
+ LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue size is: " << mSortedQueue.size()
+ << ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, SORTED queue is: " << mSortedQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, RR queue is: " << mRoundRobinQueue << LL_ENDL;
+
+ return isEmpty();
+}
+
+void LLMediaDataClient::sortQueue()
+{
+ if(!mSortedQueue.empty())
+ {
+ // Score all items first
+ request_queue_t::iterator iter = mSortedQueue.begin();
+ request_queue_t::iterator end = mSortedQueue.end();
+ while (iter != end)
{
- return GET;
+ (*iter)->updateScore();
+ iter++;
}
- else if (verb == "UPDATE")
+
+ // Re-sort the list...
+ // NOTE: should this be a stable_sort? If so we need to change to using a vector.
+ mSortedQueue.sort(LLMediaDataClient::compareRequests);
+
+ // ...then cull items over the max
+ U32 size = mSortedQueue.size();
+ if (size > mMaxSortedQueueSize)
{
- return UPDATE;
+ U32 num_to_cull = (size - mMaxSortedQueueSize);
+ LL_INFOS_ONCE("LLMediaDataClient") << "sorted queue MAXED OUT! Culling "
+ << num_to_cull << " items" << LL_ENDL;
+ while (num_to_cull-- > 0)
+ {
+ mSortedQueue.pop_back();
+ }
}
}
- llassert(false);
- return GET;
}
-const char *LLMediaDataClient::Request::getTypeAsString() const
+// static
+bool LLMediaDataClient::compareRequests(const request_ptr_t &o1, const request_ptr_t &o2)
{
- Type t = getType();
- switch (t)
+ if (o2.isNull()) return true;
+ if (o1.isNull()) return false;
+ return ( o1->getScore() > o2->getScore() );
+}
+
+void LLMediaDataClient::serviceQueue()
+{
+ request_queue_t *queue_p = getCurrentQueue();
+
+ // quick retry loop for cases where we shouldn't wait for the next timer tick
+ while(true)
{
- case GET:
- return "GET";
- break;
- case UPDATE:
- return "UPDATE";
+ if (queue_p->empty())
+ {
+ LL_DEBUGS("LLMediaDataClient") << "queue empty: " << (*queue_p) << LL_ENDL;
break;
- case NAVIGATE:
- return "NAVIGATE";
+ }
+
+ // Peel one off of the items from the queue, and execute request
+ request_ptr_t request = queue_p->front();
+ llassert(!request.isNull());
+ const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
+ llassert(NULL != object);
+
+ // Check for conditions that would make us just pop and rapidly loop through
+ // the queue.
+ if(request.isNull() ||
+ request->isMarkedSent() ||
+ NULL == object ||
+ object->isDead() ||
+ !object->hasMedia())
+ {
+ if (request.isNull())
+ {
+ LL_WARNS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL;
+ }
+ else {
+ LL_INFOS("LLMediaDataClient") << "Skipping : " << *request << " "
+ << ((request->isMarkedSent()) ? " request is marked sent" :
+ ((NULL == object) ? " object is NULL " :
+ ((object->isDead()) ? "object is dead" :
+ ((!object->hasMedia()) ? "object has no media!" : "BADNESS!")))) << LL_ENDL;
+ }
+ queue_p->pop_front();
+ continue; // jump back to the start of the quick retry loop
+ }
+
+ // Next, ask if this is "interesting enough" to fetch. If not, just stop
+ // and wait for the next timer go-round. Only do this for the sorted
+ // queue.
+ if (mCurrentQueueIsTheSortedQueue && !object->isInterestingEnough())
+ {
+ LL_DEBUGS("LLMediaDataClient") << "Not fetching " << *request << ": not interesting enough" << LL_ENDL;
break;
+ }
+
+ // Finally, try to send the HTTP message to the cap url
+ std::string url = request->getCapability();
+ bool maybe_retry = false;
+ if (!url.empty())
+ {
+ const LLSD &sd_payload = request->getPayload();
+ LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
+
+ // Call the subclass for creating the responder
+ LLHTTPClient::post(url, sd_payload, createResponder(request));
+ }
+ else {
+ LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
+ maybe_retry = true;
+ }
+
+ bool exceeded_retries = request->getRetryCount() > mMaxNumRetries;
+ if (maybe_retry && ! exceeded_retries) // Try N times before giving up
+ {
+ // We got an empty cap, but in that case we will retry again next
+ // timer fire.
+ request->incRetryCount();
+ }
+ else {
+ if (exceeded_retries)
+ {
+ LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for "
+ << mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL;
+ // XXX Should we bring up a warning dialog??
+ }
+
+ queue_p->pop_front();
+
+ if (! mCurrentQueueIsTheSortedQueue) {
+ // Round robin
+ request->markSent(true);
+ mRoundRobinQueue.push_back(request);
+ }
+ }
+
+ // end of quick loop -- any cases where we want to loop will use 'continue' to jump back to the start.
+ break;
}
- return "";
-}
+ swapCurrentQueue();
+}
-void LLMediaDataClient::Request::reEnqueue() const
+void LLMediaDataClient::swapCurrentQueue()
{
- // I sure hope this doesn't deref a bad pointer:
- mMDC->enqueue(this);
+ // Swap
+ mCurrentQueueIsTheSortedQueue = !mCurrentQueueIsTheSortedQueue;
+ // If its empty, swap back
+ if (getCurrentQueue()->empty())
+ {
+ mCurrentQueueIsTheSortedQueue = !mCurrentQueueIsTheSortedQueue;
+ }
}
-F32 LLMediaDataClient::Request::getRetryTimerDelay() const
+LLMediaDataClient::request_queue_t *LLMediaDataClient::getCurrentQueue()
{
- return (mMDC == NULL) ? LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY :
- mMDC->mRetryTimerDelay;
+ return (mCurrentQueueIsTheSortedQueue) ? &mSortedQueue : &mRoundRobinQueue;
}
-U32 LLMediaDataClient::Request::getMaxNumRetries() const
+// dump the queue
+std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue_t &q)
{
- return (mMDC == NULL) ? LLMediaDataClient::MAX_RETRIES : mMDC->mMaxNumRetries;
+ int i = 0;
+ LLMediaDataClient::request_queue_t::const_iterator iter = q.begin();
+ LLMediaDataClient::request_queue_t::const_iterator end = q.end();
+ while (iter != end)
+ {
+ s << "\t" << i << "]: " << (*iter)->getObject()->getID().asString() << "(" << (*iter)->getObject()->getMediaInterest() << ")";
+ iter++;
+ i++;
+ }
+ return s;
}
-std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &r)
+//////////////////////////////////////////////////////////////////////////////////////
+//
+// LLMediaDataClient::QueueTimer
+// Queue of LLMediaDataClientObject smart pointers to request media for.
+//
+//////////////////////////////////////////////////////////////////////////////////////
+
+LLMediaDataClient::QueueTimer::QueueTimer(F32 time, LLMediaDataClient *mdc)
+: LLEventTimer(time), mMDC(mdc)
{
- s << "<request>"
- << "<num>" << r.getNum() << "</num>"
- << "<type>" << r.getTypeAsString() << "</type>"
- << "<object_id>" << r.getObject()->getID() << "</object_id>"
- << "<num_retries>" << r.getRetryCount() << "</num_retries>"
- << "</request> ";
- return s;
+ mMDC->setIsRunning(true);
+}
+
+LLMediaDataClient::QueueTimer::~QueueTimer()
+{
+ LL_DEBUGS("LLMediaDataClient") << "~QueueTimer" << LL_ENDL;
+ mMDC->setIsRunning(false);
+ mMDC = NULL;
+}
+
+// virtual
+BOOL LLMediaDataClient::QueueTimer::tick()
+{
+ if (mMDC.isNull()) return TRUE;
+ return mMDC->processQueueTimer();
}
@@ -174,7 +444,7 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &r)
//////////////////////////////////////////////////////////////////////////////////////
LLMediaDataClient::Responder::RetryTimer::RetryTimer(F32 time, Responder *mdr)
- : LLEventTimer(time), mResponder(mdr)
+: LLEventTimer(time), mResponder(mdr)
{
}
@@ -182,13 +452,13 @@ LLMediaDataClient::Responder::RetryTimer::RetryTimer(F32 time, Responder *mdr)
LLMediaDataClient::Responder::RetryTimer::~RetryTimer()
{
LL_DEBUGS("LLMediaDataClient") << "~RetryTimer" << *(mResponder->getRequest()) << LL_ENDL;
-
+
// XXX This is weird: Instead of doing the work in tick() (which re-schedules
// a timer, which might be risky), do it here, in the destructor. Yes, it is very odd.
// Instead of retrying, we just put the request back onto the queue
- LL_INFOS("LLMediaDataClient") << "RetryTimer fired for: " << *(mResponder->getRequest()) << "retrying" << LL_ENDL;
+ LL_INFOS("LLMediaDataClient") << "RetryTimer fired for: " << *(mResponder->getRequest()) << " retrying" << LL_ENDL;
mResponder->getRequest()->reEnqueue();
-
+
// Release the ref to the responder.
mResponder = NULL;
}
@@ -203,292 +473,183 @@ BOOL LLMediaDataClient::Responder::RetryTimer::tick()
//////////////////////////////////////////////////////////////////////////////////////
//
-// LLMediaDataClient::Responder
+// LLMediaDataClient::Request
//
//////////////////////////////////////////////////////////////////////////////////////
+/*static*/U32 LLMediaDataClient::Request::sNum = 0;
-LLMediaDataClient::Responder::Responder(const request_ptr_t &request)
- : mRequest(request)
+LLMediaDataClient::Request::Request(const char *cap_name,
+ const LLSD& sd_payload,
+ LLMediaDataClientObject *obj,
+ LLMediaDataClient *mdc)
+: mCapName(cap_name),
+ mPayload(sd_payload),
+ mObject(obj),
+ mNum(++sNum),
+ mRetryCount(0),
+ mMDC(mdc),
+ mMarkedSent(false),
+ mScore((F64)0.0)
{
}
-LLMediaDataClient::Responder::~Responder()
+LLMediaDataClient::Request::~Request()
{
- LL_DEBUGS("LLMediaDataClient") << "~Responder" << *(getRequest()) << LL_ENDL;
- mRequest = NULL;
+ LL_DEBUGS("LLMediaDataClient") << "~Request" << (*this) << LL_ENDL;
+ mMDC = NULL;
+ mObject = NULL;
}
-/*virtual*/
-void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
+
+std::string LLMediaDataClient::Request::getCapability() const
{
- if (status == HTTP_SERVICE_UNAVAILABLE)
- {
- F32 retry_timeout = mRequest->getRetryTimerDelay();
+ return getObject()->getCapabilityUrl(getCapName());
+}
- mRequest->incRetryCount();
-
- if (mRequest->getRetryCount() < mRequest->getMaxNumRetries())
+// Helper function to get the "type" of request, which just pokes around to
+// discover it.
+LLMediaDataClient::Request::Type LLMediaDataClient::Request::getType() const
+{
+ if (0 == strcmp(mCapName, "ObjectMediaNavigate"))
+ {
+ return NAVIGATE;
+ }
+ else if (0 == strcmp(mCapName, "ObjectMedia"))
+ {
+ const std::string &verb = mPayload["verb"];
+ if (verb == "GET")
{
- LL_INFOS("LLMediaDataClient") << *mRequest << "got SERVICE_UNAVAILABLE...retrying in " << retry_timeout << " seconds" << LL_ENDL;
-
- // Start timer (instances are automagically tracked by
- // InstanceTracker<> and LLEventTimer)
- new RetryTimer(F32(retry_timeout/*secs*/), this);
+ return GET;
}
- else {
- LL_INFOS("LLMediaDataClient") << *mRequest << "got SERVICE_UNAVAILABLE...retry count " <<
- mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
+ else if (verb == "UPDATE")
+ {
+ return UPDATE;
}
}
- else {
- std::string msg = boost::lexical_cast<std::string>(status) + ": " + reason;
- LL_WARNS("LLMediaDataClient") << *mRequest << " http error(" << msg << ")" << LL_ENDL;
- }
+ llassert(false);
+ return GET;
}
-
-/*virtual*/
-void LLMediaDataClient::Responder::result(const LLSD& content)
+const char *LLMediaDataClient::Request::getTypeAsString() const
{
- LL_INFOS("LLMediaDataClient") << *mRequest << "result : " << ll_print_sd(content) << LL_ENDL;
+ Type t = getType();
+ switch (t)
+ {
+ case GET:
+ return "GET";
+ break;
+ case UPDATE:
+ return "UPDATE";
+ break;
+ case NAVIGATE:
+ return "NAVIGATE";
+ break;
+ case ANY:
+ return "ANY";
+ break;
+ }
+ return "";
}
-//////////////////////////////////////////////////////////////////////////////////////
-//
-// LLMediaDataClient::Comparator
-//
-//////////////////////////////////////////////////////////////////////////////////////
-
-bool LLMediaDataClient::Comparator::operator() (const request_ptr_t &o1, const request_ptr_t &o2) const
+void LLMediaDataClient::Request::reEnqueue() const
{
- if (o2.isNull()) return true;
- if (o1.isNull()) return false;
-
- // The score is intended to be a measure of how close an object is or
- // how much screen real estate (interest) it takes up
- // Further away = lower score.
- // Lesser interest = lower score
- // For instance, here are some cases:
- // 1: Two items with no impl, closest one wins
- // 2: Two items with an impl: interest should rule, but distance is
- // still taken into account (i.e. something really close might take
- // precedence over a large item far away)
- // 3: One item with an impl, another without: item with impl wins
- // (XXX is that what we want?)
- // Calculate the scores for each.
- F64 o1_score = Comparator::getObjectScore(o1->getObject());
- F64 o2_score = Comparator::getObjectScore(o2->getObject());
-
- // XXX Weird: a higher score should go earlier, but by observation I notice
- // that this causes further-away objects load first. This is counterintuitive
- // to the priority_queue Comparator, which states that this function should
- // return 'true' if o1 should be *before* o2.
- // In other words, I'd have expected that the following should return
- // ( o1_score > o2_score).
- return ( o1_score < o2_score );
+ // I sure hope this doesn't deref a bad pointer:
+ mMDC->enqueue(this);
}
-
-// static
-F64 LLMediaDataClient::Comparator::getObjectScore(const LLMediaDataClientObject::ptr_t &obj)
-{
- // *TODO: make this less expensive?
- F64 dist = obj->getDistanceFromAvatar() + 0.1; // avoids div by 0
- // square the distance so that they are in the same "unit magnitude" as
- // the interest (which is an area)
- dist *= dist;
- F64 interest = obj->getTotalMediaInterest() + 1.0;
-
- return interest/dist;
+
+F32 LLMediaDataClient::Request::getRetryTimerDelay() const
+{
+ return (mMDC == NULL) ? LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY :
+ mMDC->mRetryTimerDelay;
}
-//////////////////////////////////////////////////////////////////////////////////////
-//
-// LLMediaDataClient::PriorityQueue
-// Queue of LLMediaDataClientObject smart pointers to request media for.
-//
-//////////////////////////////////////////////////////////////////////////////////////
+U32 LLMediaDataClient::Request::getMaxNumRetries() const
+{
+ return (mMDC == NULL) ? LLMediaDataClient::MAX_RETRIES : mMDC->mMaxNumRetries;
+}
-// dump the queue
-std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::PriorityQueue &q)
+void LLMediaDataClient::Request::markSent(bool flag)
{
- int i = 0;
- std::vector<LLMediaDataClient::request_ptr_t>::const_iterator iter = q.c.begin();
- std::vector<LLMediaDataClient::request_ptr_t>::const_iterator end = q.c.end();
- while (iter < end)
+ if (mMarkedSent != flag)
+ {
+ mMarkedSent = flag;
+ if (!mMarkedSent)
+ {
+ mNum = ++sNum;
+ }
+ }
+}
+
+void LLMediaDataClient::Request::updateScore()
+{
+ F64 tmp = mObject->getMediaInterest();
+ if (tmp != mScore)
{
- s << "\t" << i << "]: " << (*iter)->getObject()->getID().asString();
- iter++;
- i++;
+ LL_DEBUGS("LLMediaDataClient") << "Score for " << mObject->getID() << " changed from " << mScore << " to " << tmp << LL_ENDL;
+ mScore = tmp;
}
+}
+
+std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &r)
+{
+ s << "request: num=" << r.getNum()
+ << " type=" << r.getTypeAsString()
+ << " ID=" << r.getObject()->getID()
+ << " #retries=" << r.getRetryCount();
return s;
}
+
//////////////////////////////////////////////////////////////////////////////////////
//
-// LLMediaDataClient::QueueTimer
-// Queue of LLMediaDataClientObject smart pointers to request media for.
+// LLMediaDataClient::Responder
//
//////////////////////////////////////////////////////////////////////////////////////
-LLMediaDataClient::QueueTimer::QueueTimer(F32 time, LLMediaDataClient *mdc)
- : LLEventTimer(time), mMDC(mdc)
+LLMediaDataClient::Responder::Responder(const request_ptr_t &request)
+: mRequest(request)
{
- mMDC->setIsRunning(true);
}
-LLMediaDataClient::QueueTimer::~QueueTimer()
+LLMediaDataClient::Responder::~Responder()
{
- LL_DEBUGS("LLMediaDataClient") << "~QueueTimer" << LL_ENDL;
- mMDC->setIsRunning(false);
- mMDC = NULL;
+ LL_DEBUGS("LLMediaDataClient") << "~Responder" << *(getRequest()) << LL_ENDL;
+ mRequest = NULL;
}
-// virtual
-BOOL LLMediaDataClient::QueueTimer::tick()
+/*virtual*/
+void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
{
- if (NULL == mMDC->pRequestQueue)
- {
- // Shutting down? stop.
- LL_DEBUGS("LLMediaDataClient") << "queue gone" << LL_ENDL;
- return TRUE;
- }
-
- LLMediaDataClient::PriorityQueue &queue = *(mMDC->pRequestQueue);
-
- if (queue.empty())
- {
- LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL;
- return TRUE;
- }
-
- LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is: " << queue << LL_ENDL;
-
- // Peel one off of the items from the queue, and execute request
- request_ptr_t request = queue.top();
- llassert(!request.isNull());
- const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
- bool performed_request = false;
- bool error = false;
- llassert(NULL != object);
- if (NULL != object && object->hasMedia())
+ if (status == HTTP_SERVICE_UNAVAILABLE)
{
- std::string url = request->getCapability();
- if (!url.empty())
+ F32 retry_timeout = mRequest->getRetryTimerDelay();
+
+ mRequest->incRetryCount();
+
+ if (mRequest->getRetryCount() < mRequest->getMaxNumRetries())
{
- const LLSD &sd_payload = request->getPayload();
- LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
-
- // Call the subclass for creating the responder
- LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request));
- performed_request = true;
+ LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retrying in " << retry_timeout << " seconds" << LL_ENDL;
+
+ // Start timer (instances are automagically tracked by
+ // InstanceTracker<> and LLEventTimer)
+ new RetryTimer(F32(retry_timeout/*secs*/), this);
}
else {
- LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
- }
- }
- else {
- if (request.isNull())
- {
- LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL;
- }
- else if (NULL == object)
- {
- LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL;
+ LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count "
+ << mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
}
- else if (!object->hasMedia())
- {
- LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL;
- }
- error = true;
- }
- bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries;
- if (performed_request || exceeded_retries || error) // Try N times before giving up
- {
- if (exceeded_retries)
- {
- LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for "
- << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL;
- // XXX Should we bring up a warning dialog??
- }
- queue.pop();
}
else {
- request->incRetryCount();
- }
- LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL;
-
- return queue.empty();
-}
-
-void LLMediaDataClient::startQueueTimer()
-{
- if (! mQueueTimerIsRunning)
- {
- LL_INFOS("LLMediaDataClient") << "starting queue timer (delay=" << mQueueTimerDelay << " seconds)" << LL_ENDL;
- // LLEventTimer automagically takes care of the lifetime of this object
- new QueueTimer(mQueueTimerDelay, this);
- }
- else {
- LL_DEBUGS("LLMediaDataClient") << "not starting queue timer (it's already running, right???)" << LL_ENDL;
+ std::string msg = boost::lexical_cast<std::string>(status) + ": " + reason;
+ LL_WARNS("LLMediaDataClient") << *mRequest << " http error(" << msg << ")" << LL_ENDL;
}
}
-
-void LLMediaDataClient::stopQueueTimer()
-{
- mQueueTimerIsRunning = false;
-}
-
-void LLMediaDataClient::request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload)
-{
- if (object.isNull() || ! object->hasMedia()) return;
- // Push the object on the priority queue
- enqueue(new Request(getCapabilityName(), payload, object, this));
-}
-
-void LLMediaDataClient::enqueue(const Request *request)
-{
- LL_INFOS("LLMediaDataClient") << "Queuing request for " << *request << LL_ENDL;
- // Push the request on the priority queue
- // Sadly, we have to const-cast because items put into the queue are not const
- pRequestQueue->push(const_cast<LLMediaDataClient::Request*>(request));
- LL_DEBUGS("LLMediaDataClient") << "Queue:" << (*pRequestQueue) << LL_ENDL;
- // Start the timer if not already running
- startQueueTimer();
-}
-
-//////////////////////////////////////////////////////////////////////////////////////
-//
-// LLMediaDataClient
-//
-//////////////////////////////////////////////////////////////////////////////////////
-
-LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay,
- F32 retry_timer_delay,
- U32 max_retries)
- : mQueueTimerDelay(queue_timer_delay),
- mRetryTimerDelay(retry_timer_delay),
- mMaxNumRetries(max_retries),
- mQueueTimerIsRunning(false)
-{
- pRequestQueue = new PriorityQueue();
-}
-
-LLMediaDataClient::~LLMediaDataClient()
-{
- stopQueueTimer();
-
- // This should clear the queue, and hopefully call all the destructors.
- LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClient destructor: queue: " <<
- (pRequestQueue->empty() ? "<empty> " : "<not empty> ") << (*pRequestQueue) << LL_ENDL;
- delete pRequestQueue;
- pRequestQueue = NULL;
-}
-
-bool LLMediaDataClient::isEmpty() const
+/*virtual*/
+void LLMediaDataClient::Responder::result(const LLSD& content)
{
- return (NULL == pRequestQueue) ? true : pRequestQueue->empty();
+ LL_DEBUGS("LLMediaDataClientResponse") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;
}
//////////////////////////////////////////////////////////////////////////////////////
@@ -530,7 +691,7 @@ void LLObjectMediaDataClient::updateMedia(LLMediaDataClientObject *object)
}
sd_payload[LLTextureEntry::OBJECT_MEDIA_DATA_KEY] = object_media_data;
- LL_INFOS("LLMediaDataClient") << "update media data: " << object->getID() << " " << ll_print_sd(sd_payload) << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClient") << "update media data: " << object->getID() << " " << ll_print_sd(sd_payload) << LL_ENDL;
request(object, sd_payload);
}
@@ -542,7 +703,7 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content)
llassert(type == LLMediaDataClient::Request::GET || type == LLMediaDataClient::Request::UPDATE)
if (type == LLMediaDataClient::Request::GET)
{
- LL_INFOS("LLMediaDataClient") << *(getRequest()) << "GET returned: " << ll_print_sd(content) << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientResponse") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;
// Look for an error
if (content.has("error"))
@@ -559,12 +720,13 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content)
if (object_id != getRequest()->getObject()->getID())
{
// NOT good, wrong object id!!
- LL_WARNS("LLMediaDataClient") << *(getRequest()) << "DROPPING response with wrong object id (" << object_id << ")" << LL_ENDL;
+ LL_WARNS("LLMediaDataClient") << *(getRequest()) << " DROPPING response with wrong object id (" << object_id << ")" << LL_ENDL;
return;
}
// Otherwise, update with object media data
- getRequest()->getObject()->updateObjectMediaData(content[LLTextureEntry::OBJECT_MEDIA_DATA_KEY]);
+ getRequest()->getObject()->updateObjectMediaData(content[LLTextureEntry::OBJECT_MEDIA_DATA_KEY],
+ content[LLTextureEntry::MEDIA_VERSION_KEY]);
}
}
else if (type == LLMediaDataClient::Request::UPDATE)
@@ -596,6 +758,9 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t
sd_payload[LLTextureEntry::OBJECT_ID_KEY] = object->getID();
sd_payload[LLMediaEntry::CURRENT_URL_KEY] = url;
sd_payload[LLTextureEntry::TEXTURE_INDEX_KEY] = (LLSD::Integer)texture_index;
+
+ LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL;
+
request(object, sd_payload);
}
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 9d0aa0981e..8dd72cb595 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -37,7 +37,7 @@
#include <queue>
#include "llrefcount.h"
#include "llpointer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
// Link seam for LLVOVolume
@@ -55,13 +55,19 @@ public:
// Does this object have media?
virtual bool hasMedia() const = 0;
// Update the object's media data to the given array
- virtual void updateObjectMediaData(LLSD const &media_data_array) = 0;
- // Return the distance from the object to the avatar
- virtual F64 getDistanceFromAvatar() const = 0;
+ virtual void updateObjectMediaData(LLSD const &media_data_array, const std::string &version_string) = 0;
// Return the total "interest" of the media (on-screen area)
- virtual F64 getTotalMediaInterest() const = 0;
+ virtual F64 getMediaInterest() const = 0;
// Return the given cap url
virtual std::string getCapabilityUrl(const std::string &name) const = 0;
+ // Return whether the object has been marked dead
+ virtual bool isDead() const = 0;
+ // Returns a media version number for the object
+ virtual U32 getMediaVersion() const = 0;
+ // Returns whether the object is "interesting enough" to fetch
+ virtual bool isInterestingEnough() const = 0;
+ // Returns whether we've seen this object yet or not
+ virtual bool isNew() const = 0;
// smart pointer
typedef LLPointer<LLMediaDataClientObject> ptr_t;
@@ -77,11 +83,15 @@ public:
const static F32 QUEUE_TIMER_DELAY;// = 1.0; // seconds(s)
const static F32 UNAVAILABLE_RETRY_TIMER_DELAY;// = 5.0; // secs
const static U32 MAX_RETRIES;// = 4;
+ const static U32 MAX_SORTED_QUEUE_SIZE;// = 10000;
+ const static U32 MAX_ROUND_ROBIN_QUEUE_SIZE;// = 10000;
// Constructor
LLMediaDataClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY,
F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY,
- U32 max_retries = MAX_RETRIES);
+ U32 max_retries = MAX_RETRIES,
+ U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE,
+ U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE);
// Make the request
void request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload);
@@ -89,7 +99,16 @@ public:
F32 getRetryTimerDelay() const { return mRetryTimerDelay; }
// Returns true iff the queue is empty
- bool isEmpty() const;
+ bool isEmpty() const;
+
+ // Returns true iff the given object is in the queue
+ bool isInQueue(const LLMediaDataClientObject::ptr_t &object);
+
+ // Remove the given object from the queue. Returns true iff the given object is removed.
+ bool removeFromQueue(const LLMediaDataClientObject::ptr_t &object);
+
+ // Called only by the Queue timer and tests (potentially)
+ bool processQueueTimer();
protected:
// Destructor
@@ -102,11 +121,12 @@ protected:
enum Type {
GET,
UPDATE,
- NAVIGATE
+ NAVIGATE,
+ ANY
};
- Request(const std::string &cap_name, const LLSD& sd_payload, LLMediaDataClientObject *obj, LLMediaDataClient *mdc);
- const std::string &getCapName() const { return mCapName; }
+ Request(const char *cap_name, const LLSD& sd_payload, LLMediaDataClientObject *obj, LLMediaDataClient *mdc);
+ const char *getCapName() const { return mCapName; }
const LLSD &getPayload() const { return mPayload; }
LLMediaDataClientObject *getObject() const { return mObject; }
@@ -127,6 +147,12 @@ protected:
F32 getRetryTimerDelay() const;
U32 getMaxNumRetries() const;
+ bool isNew() const { return mObject.notNull() ? mObject->isNew() : false; }
+ void markSent(bool flag);
+ bool isMarkedSent() const { return mMarkedSent; }
+ void updateScore();
+ F64 getScore() const { return mScore; }
+
public:
friend std::ostream& operator<<(std::ostream &s, const Request &q);
@@ -134,14 +160,16 @@ protected:
virtual ~Request(); // use unref();
private:
- std::string mCapName;
+ const char *mCapName;
LLSD mPayload;
LLMediaDataClientObject::ptr_t mObject;
// Simple tracking
- const U32 mNum;
+ U32 mNum;
static U32 sNum;
U32 mRetryCount;
-
+ F64 mScore;
+ bool mMarkedSent;
+
// Back pointer to the MDC...not a ref!
LLMediaDataClient *mMDC;
};
@@ -179,38 +207,30 @@ protected:
};
protected:
-
- void enqueue(const Request*);
-
+
// Subclasses must override this factory method to return a new responder
virtual Responder *createResponder(const request_ptr_t &request) const = 0;
// Subclasses must override to return a cap name
virtual const char *getCapabilityName() const = 0;
+ virtual void sortQueue();
+ virtual void serviceQueue();
+
private:
+ typedef std::list<request_ptr_t> request_queue_t;
+
+ void enqueue(const Request*);
- // Comparator for PriorityQueue
- class Comparator
- {
- public:
- bool operator() (const request_ptr_t &o1, const request_ptr_t &o2) const;
- private:
- static F64 getObjectScore(const LLMediaDataClientObject::ptr_t &obj);
- };
+ // Return whether the given object is/was in the queue
+ static LLMediaDataClient::request_ptr_t findOrRemove(request_queue_t &queue, const LLMediaDataClientObject::ptr_t &obj, bool remove, Request::Type type);
- // PriorityQueue
- class PriorityQueue : public std::priority_queue<
- request_ptr_t,
- std::vector<request_ptr_t>,
- Comparator >
- {
- public:
- friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q);
- };
+ // Comparator for sorting
+ static bool compareRequests(const request_ptr_t &o1, const request_ptr_t &o2);
+ static F64 getObjectScore(const LLMediaDataClientObject::ptr_t &obj);
friend std::ostream& operator<<(std::ostream &s, const Request &q);
- friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q);
+ friend std::ostream& operator<<(std::ostream &s, const request_queue_t &q);
class QueueTimer : public LLEventTimer
{
@@ -223,31 +243,40 @@ private:
// back-pointer
LLPointer<LLMediaDataClient> mMDC;
};
-
+
void startQueueTimer();
void stopQueueTimer();
void setIsRunning(bool val) { mQueueTimerIsRunning = val; }
-
+
+ void swapCurrentQueue();
+ request_queue_t *getCurrentQueue();
+
const F32 mQueueTimerDelay;
const F32 mRetryTimerDelay;
const U32 mMaxNumRetries;
+ const U32 mMaxSortedQueueSize;
+ const U32 mMaxRoundRobinQueueSize;
bool mQueueTimerIsRunning;
- PriorityQueue *pRequestQueue;
+ request_queue_t mSortedQueue;
+ request_queue_t mRoundRobinQueue;
+ bool mCurrentQueueIsTheSortedQueue;
};
-// MediaDataResponder specific for the ObjectMedia cap
+// MediaDataClient specific for the ObjectMedia cap
class LLObjectMediaDataClient : public LLMediaDataClient
{
public:
LLObjectMediaDataClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY,
F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY,
- U32 max_retries = MAX_RETRIES)
+ U32 max_retries = MAX_RETRIES,
+ U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE,
+ U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE)
: LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries)
{}
- ~LLObjectMediaDataClient() {}
+ virtual ~LLObjectMediaDataClient() {}
void fetchMedia(LLMediaDataClientObject *object);
void updateMedia(LLMediaDataClientObject *object);
@@ -269,7 +298,7 @@ protected:
};
-// MediaDataResponder specific for the ObjectMediaNavigate cap
+// MediaDataClient specific for the ObjectMediaNavigate cap
class LLObjectMediaNavigateClient : public LLMediaDataClient
{
public:
@@ -278,10 +307,12 @@ public:
LLObjectMediaNavigateClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY,
F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY,
- U32 max_retries = MAX_RETRIES)
+ U32 max_retries = MAX_RETRIES,
+ U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE,
+ U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE)
: LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries)
{}
- ~LLObjectMediaNavigateClient() {}
+ virtual ~LLObjectMediaNavigateClient() {}
void navigate(LLMediaDataClientObject *object, U8 texture_index, const std::string &url);
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index b3aa67733b..cbe4cef12f 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -130,8 +130,8 @@ void LLMemoryView::draw()
curUpdate++;
// setup window properly
- S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f);
- S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.9f);
+ S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+ S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.9f);
setRect(LLRect().setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height));
// setup window color
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
index 28ddaa61c4..8d950f072d 100644
--- a/indra/newview/llmenucommands.cpp
+++ b/indra/newview/llmenucommands.cpp
@@ -45,11 +45,9 @@
#include "llagent.h"
#include "llcallingcard.h"
#include "llviewercontrol.h"
-#include "llfirstuse.h"
-#include "llfloaterchat.h"
+//#include "llfirstuse.h"
#include "llfloaterworldmap.h"
#include "lllineeditor.h"
-#include "llnotify.h"
#include "llstatusbar.h"
#include "llimview.h"
#include "lltextbox.h"
diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp
index f562e45770..b95e8bd3a2 100644
--- a/indra/newview/llmorphview.cpp
+++ b/indra/newview/llmorphview.cpp
@@ -40,7 +40,7 @@
#include "lldrawable.h"
#include "lldrawpoolavatar.h"
#include "llface.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloatercustomize.h"
#include "llfloatertools.h"
#include "llresmgr.h"
@@ -143,7 +143,7 @@ void LLMorphView::setVisible(BOOL visible)
initialize();
// First run dialog
- LLFirstUse::useAppearance();
+ //LLFirstUse::useAppearance();
}
else
{
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 14da35594f..97e2b5b86e 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -156,6 +156,34 @@ void LLFloaterMove::setEnabled(BOOL enabled)
showModeButtons(enabled);
}
+// *NOTE: we assume that setVisible() is called on floater close.
+// virtual
+void LLFloaterMove::setVisible(BOOL visible)
+{
+ // Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?).
+ if (getVisible() == visible)
+ {
+ LLTransientDockableFloater::setVisible(visible);
+ return;
+ }
+
+ if (visible)
+ {
+ // Attach the Stand/Stop Flying panel.
+ LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance();
+ ssf_panel->reparent(this);
+ const LLRect& mode_actions_rect = mModeActionsPanel->getRect();
+ ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom);
+ }
+ else
+ {
+ // Detach the Stand/Stop Flying panel.
+ LLPanelStandStopFlying::getInstance()->reparent(NULL);
+ }
+
+ LLTransientDockableFloater::setVisible(visible);
+}
+
// static
F32 LLFloaterMove::getYawRate( F32 time )
{
@@ -222,6 +250,12 @@ void LLFloaterMove::setSittingMode(BOOL bSitting)
else
{
LLPanelStandStopFlying::clearStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STAND);
+
+ // show "Stop Flying" button if needed. EXT-871
+ if (gAgent.getFlying())
+ {
+ LLPanelStandStopFlying::setStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STOP_FLYING);
+ }
}
enableInstance(!bSitting);
}
@@ -424,43 +458,6 @@ void LLFloaterMove::showModeButtons(BOOL bShow)
if (NULL == mModeActionsPanel || mModeActionsPanel->getVisible() == bShow)
return;
mModeActionsPanel->setVisible(bShow);
-
- if (isDocked())
- {
- return;
- }
-
- updateHeight(bShow);
-}
-
-void LLFloaterMove::updateHeight(bool show_mode_buttons)
-{
- static bool size_changed = false;
- static S32 origin_height = getRect().getHeight();
- LLRect rect = getRect();
-
- static S32 mode_panel_height = mModeActionsPanel->getRect().getHeight();
-
- S32 newHeight = getRect().getHeight();
-
- if (!show_mode_buttons && origin_height == newHeight)
- {
- newHeight -= mode_panel_height;
- size_changed = true;
- }
- else if (show_mode_buttons && origin_height > newHeight)
- {
- newHeight += mode_panel_height;
- size_changed = true;
- }
-
- if (!size_changed)
- return;
-
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), newHeight);
- reshape(rect.getWidth(), rect.getHeight());
- setRect(rect);
- size_changed = false;
}
//static
@@ -504,14 +501,6 @@ void LLFloaterMove::onOpen(const LLSD& key)
//virtual
void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/)
{
- LLDockableFloater::setDocked(docked, pop_on_undock);
- bool show_mode_buttons = isDocked() || !gAgent.getFlying();
-
- if (!isMinimized())
- {
- updateHeight(show_mode_buttons);
- }
-
LLTransientDockableFloater::setDocked(docked, pop_on_undock);
}
@@ -535,7 +524,8 @@ void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)
/************************************************************************/
LLPanelStandStopFlying::LLPanelStandStopFlying() :
mStandButton(NULL),
- mStopFlyingButton(NULL)
+ mStopFlyingButton(NULL),
+ mAttached(false)
{
// make sure we have the only instance of this class
static bool b = true;
@@ -587,7 +577,7 @@ BOOL LLPanelStandStopFlying::postBuild()
mStandButton->setVisible(FALSE);
mStopFlyingButton = getChild<LLButton>("stop_fly_btn");
- mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE));
+ //mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE));
mStopFlyingButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStopFlyingButtonClick, this));
mStopFlyingButton->setVisible(FALSE);
@@ -598,16 +588,22 @@ BOOL LLPanelStandStopFlying::postBuild()
void LLPanelStandStopFlying::setVisible(BOOL visible)
{
//we dont need to show the panel if these buttons are not activated
- if (visible && !mStandButton->getVisible() && !mStopFlyingButton->getVisible()) visible = false;
-
if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
if (visible)
{
updatePosition();
- getParent()->sendChildToFront(this);
}
+ // do not change parent visibility in case panel is attached into Move Floater: EXT-3632, EXT-4646
+ if (!mAttached)
+ {
+ //change visibility of parent layout_panel to animate in/out. EXT-2504
+ if (getParent()) getParent()->setVisible(visible);
+ }
+
+ // also change own visibility to avoid displaying the panel in mouselook (broken when EXT-2504 was implemented).
+ // See EXT-4718.
LLPanel::setVisible(visible);
}
@@ -624,7 +620,49 @@ BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask)
LLToolTipMgr::instance().show(mStopFlyingButton->getToolTip());
}
- return TRUE;
+ return LLPanel::handleToolTip(x, y, mask);
+}
+
+void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view)
+{
+ LLPanel* parent = dynamic_cast<LLPanel*>(getParent());
+ if (!parent)
+ {
+ llwarns << "Stand/stop flying panel parent is unset, already attached?: " << mAttached << ", new parent: " << (move_view == NULL ? "NULL" : "Move Floater") << llendl;
+ return;
+ }
+
+ if (move_view != NULL)
+ {
+ llassert(move_view != parent); // sanity check
+
+ // Save our original container.
+ if (!mOriginalParent.get())
+ mOriginalParent = parent->getHandle();
+
+ // Attach to movement controls.
+ parent->removeChild(this);
+ move_view->addChild(this);
+ // Origin must be set by movement controls.
+ mAttached = true;
+ }
+ else
+ {
+ if (!mOriginalParent.get())
+ {
+ llwarns << "Original parent of the stand / stop flying panel not found" << llendl;
+ return;
+ }
+
+ // Detach from movement controls.
+ parent->removeChild(this);
+ mOriginalParent.get()->addChild(this);
+ // update parent with self visibility (it is changed in setVisible()). EXT-4743
+ mOriginalParent.get()->setVisible(getVisible());
+
+ mAttached = false;
+ updatePosition(); // don't defer until next draw() to avoid flicker
+ }
}
//////////////////////////////////////////////////////////////////////////
@@ -638,7 +676,7 @@ LLPanelStandStopFlying* LLPanelStandStopFlying::getStandStopFlyingPanel()
LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_stand_stop_flying.xml");
panel->setVisible(FALSE);
- LLUI::getRootView()->addChild(panel);
+ //LLUI::getRootView()->addChild(panel);
llinfos << "Build LLPanelStandStopFlying panel" << llendl;
@@ -652,10 +690,6 @@ void LLPanelStandStopFlying::onStandButtonClick()
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
setFocus(FALSE); // EXT-482
-
- BOOL fly = gAgent.getFlying();
- mStopFlyingButton->setVisible(fly);
- setVisible(fly);
}
void LLPanelStandStopFlying::onStopFlyingButtonClick()
@@ -671,27 +705,14 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()
*/
void LLPanelStandStopFlying::updatePosition()
{
-
LLBottomTray* tray = LLBottomTray::getInstance();
- if (!tray) return;
+ if (!tray || mAttached) return;
LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
- //align centers of a button and a floater
+ // Align centers of the button and the panel.
S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
-
- S32 y = tray->getRect().getHeight();
-
- LLFloater *move_floater = LLFloaterReg::findInstance("moveview");
- if (move_floater)
- {
- if (move_floater->isDocked())
- {
- y = move_floater->getRect().mBottom + getRect().getHeight();
- }
- }
-
- setOrigin(x, y);
+ setOrigin(x, 0);
}
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index cee6078ee9..06463f02af 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -46,6 +46,7 @@ class LLJoystickAgentSlide;
class LLFloaterMove
: public LLTransientDockableFloater
{
+ LOG_CLASS(LLFloaterMove);
friend class LLFloaterReg;
private:
@@ -55,6 +56,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void setEnabled(BOOL enabled);
+ /*virtual*/ void setVisible(BOOL visible);
static F32 getYawRate(F32 time);
static void setFlyingMode(BOOL fly);
void setFlyingModeImpl(BOOL fly);
@@ -96,7 +98,6 @@ private:
void updateButtonsWithMovementMode(const EMovementMode newMode);
void updatePosition();
void showModeButtons(BOOL bShow);
- void updateHeight(bool show_mode_buttons);
public:
@@ -126,6 +127,7 @@ private:
*/
class LLPanelStandStopFlying : public LLPanel
{
+ LOG_CLASS(LLPanelStandStopFlying);
public:
typedef enum stand_stop_flying_mode_t
{
@@ -133,6 +135,19 @@ public:
SSFM_STOP_FLYING
} EStandStopFlyingMode;
+ /**
+ * Attach or detach the panel to/from the movement controls floater.
+ *
+ * Called when the floater gets opened/closed, user sits, stands up or starts/stops flying.
+ *
+ * @param move_view The floater to attach to (not always accessible via floater registry).
+ * If NULL is passed, the panel gets reparented to its original container.
+ *
+ * @see mAttached
+ * @see mOriginalParent
+ */
+ void reparent(LLFloaterMove* move_view);
+
static LLPanelStandStopFlying* getInstance();
static void setStandStopFlyingMode(EStandStopFlyingMode mode);
static void clearStandStopFlyingMode(EStandStopFlyingMode mode);
@@ -157,6 +172,23 @@ private:
LLButton* mStandButton;
LLButton* mStopFlyingButton;
+
+ /**
+ * The original parent of the panel.
+ *
+ * Makes it possible to move (reparent) the panel to the movement controls floater and back.
+ *
+ * @see reparent()
+ */
+ LLHandle<LLPanel> mOriginalParent;
+
+ /**
+ * True if the panel is currently attached to the movement controls floater.
+ *
+ * @see reparent()
+ * @see updatePosition()
+ */
+ bool mAttached;
};
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 36cf2c1aa8..2d3c4b187e 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -52,23 +52,14 @@
#include <boost/tokenizer.hpp>
-#include "llcrc.h"
-#include "lldir.h"
#include "lldispatcher.h"
-#include "llsdserialize.h"
#include "llxfermanager.h"
-#include "message.h"
#include "llagent.h"
#include "llviewergenericmessage.h" // for gGenericDispatcher
-#include "llviewerwindow.h"
#include "llworld.h" //for particle system banning
-#include "llchat.h"
-#include "llfloaterchat.h"
#include "llimview.h"
#include "llnotifications.h"
-#include "lluistring.h"
-#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "lltrans.h"
@@ -219,61 +210,17 @@ LLMuteList* LLMuteList::getInstance()
// LLMuteList()
//-----------------------------------------------------------------------------
LLMuteList::LLMuteList() :
- mIsLoaded(FALSE),
- mUserVolumesLoaded(FALSE)
+ mIsLoaded(FALSE)
{
gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList);
}
-void LLMuteList::loadUserVolumes()
-{
- // call once, after LLDir::setLindenUserDir() has been called
- if (mUserVolumesLoaded)
- return;
- mUserVolumesLoaded = TRUE;
-
- // load per-resident voice volume information
- // conceptually, this is part of the mute list information, although it is only stored locally
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml");
-
- LLSD settings_llsd;
- llifstream file;
- file.open(filename);
- if (file.is_open())
- {
- LLSDSerialize::fromXML(settings_llsd, file);
- }
-
- for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
- iter != settings_llsd.endMap(); ++iter)
- {
- mUserVolumeSettings.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal()));
- }
-}
-
//-----------------------------------------------------------------------------
// ~LLMuteList()
//-----------------------------------------------------------------------------
LLMuteList::~LLMuteList()
{
- // If we quit from the login screen we will not have an SL account
- // name. Don't try to save, otherwise we'll dump a file in
- // C:\Program Files\SecondLife\ JC
- std::string user_dir = gDirUtilp->getLindenUserDir();
- if (!user_dir.empty())
- {
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml");
- LLSD settings_llsd;
- for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter)
- {
- settings_llsd[iter->first.asString()] = iter->second;
- }
-
- llofstream file;
- file.open(filename);
- LLSDSerialize::toPrettyXML(settings_llsd, file);
- }
}
BOOL LLMuteList::isLinden(const std::string& name) const
@@ -298,7 +245,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
if ((mute.mType == LLMute::AGENT)
&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))
{
- LLNotifications::instance().add("MuteLinden");
+ LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());
return FALSE;
}
@@ -517,24 +464,15 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n
args["FIRST"] = first_name;
args["LAST"] = last_name;
- LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args);
+ LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args, LLSD());
if (notif_ptr)
{
std::string message = notif_ptr->getMessage();
if (reason == LLMuteList::AR_IM)
{
- LLFloaterIMPanel *timp = gIMMgr->findFloaterBySession(agent_id);
- if (timp)
- {
- timp->addHistoryLine(message);
- }
-
LLIMModel::getInstance()->addMessage(agent_id, SYSTEM_FROM, LLUUID::null, message);
}
-
- LLChat auto_chat(message);
- LLFloaterChat::addChat(auto_chat, FALSE, FALSE);
}
}
@@ -718,8 +656,6 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
//-----------------------------------------------------------------------------
void LLMuteList::requestFromServer(const LLUUID& agent_id)
{
- loadUserVolumes();
-
std::string agent_id_string;
std::string filename;
agent_id.toString(agent_id_string);
@@ -754,26 +690,6 @@ void LLMuteList::cache(const LLUUID& agent_id)
}
}
-void LLMuteList::setSavedResidentVolume(const LLUUID& id, F32 volume)
-{
- // store new value in volume settings file
- mUserVolumeSettings[id] = volume;
-}
-
-F32 LLMuteList::getSavedResidentVolume(const LLUUID& id)
-{
- const F32 DEFAULT_VOLUME = 0.5f;
-
- user_volume_map_t::iterator found_it = mUserVolumeSettings.find(id);
- if (found_it != mUserVolumeSettings.end())
- {
- return found_it->second;
- }
- //FIXME: assumes default, should get this from somewhere
- return DEFAULT_VOLUME;
-}
-
-
//-----------------------------------------------------------------------------
// Static message handlers
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 409b637bf2..e1e81a24b4 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -127,12 +127,7 @@ public:
// call this method on logout to save everything.
void cache(const LLUUID& agent_id);
- void setSavedResidentVolume(const LLUUID& id, F32 volume);
- F32 getSavedResidentVolume(const LLUUID& id);
-
private:
- void loadUserVolumes();
-
BOOL loadFromFile(const std::string& filename);
BOOL saveToFile(const std::string& filename);
@@ -179,12 +174,8 @@ private:
observer_set_t mObservers;
BOOL mIsLoaded;
- BOOL mUserVolumesLoaded;
friend class LLDispatchEmptyMuteList;
-
- typedef std::map<LLUUID, F32> user_volume_map_t;
- user_volume_map_t mUserVolumeSettings;
};
class LLMuteListObserver
diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp
index 2f4a266198..cd810b9793 100644
--- a/indra/newview/llnamebox.cpp
+++ b/indra/newview/llnamebox.cpp
@@ -52,6 +52,8 @@ LLNameBox::LLNameBox(const Params& p)
: LLTextBox(p)
{
mNameID = LLUUID::null;
+ mLink = p.link;
+ mInitialValue = p.initial_value().asString();
LLNameBox::sInstances.insert(this);
setText(LLStringUtil::null);
}
@@ -66,17 +68,23 @@ void LLNameBox::setNameID(const LLUUID& name_id, BOOL is_group)
mNameID = name_id;
std::string name;
+ BOOL got_name = FALSE;
if (!is_group)
{
- gCacheName->getFullName(name_id, name);
+ got_name = gCacheName->getFullName(name_id, name);
}
else
{
- gCacheName->getGroupName(name_id, name);
+ got_name = gCacheName->getGroupName(name_id, name);
}
- setText(name);
+ // Got the name already? Set it.
+ // Otherwise it will be set later in refresh().
+ if (got_name)
+ setName(name, is_group);
+ else
+ setText(mInitialValue);
}
void LLNameBox::refresh(const LLUUID& id, const std::string& firstname,
@@ -93,7 +101,7 @@ void LLNameBox::refresh(const LLUUID& id, const std::string& firstname,
{
name = firstname;
}
- setText(name);
+ setName(name, is_group);
}
}
@@ -109,3 +117,22 @@ void LLNameBox::refreshAll(const LLUUID& id, const std::string& firstname,
box->refresh(id, firstname, lastname, is_group);
}
}
+
+void LLNameBox::setName(const std::string& name, BOOL is_group)
+{
+ if (mLink)
+ {
+ std::string url;
+
+ if (is_group)
+ url = "[secondlife:///app/group/" + LLURI::escape(name) + "/about " + name + "]";
+ else
+ url = "[secondlife:///app/agent/" + mNameID.asString() + "/about " + name + "]";
+
+ setText(url);
+ }
+ else
+ {
+ setText(name);
+ }
+}
diff --git a/indra/newview/llnamebox.h b/indra/newview/llnamebox.h
index 3edb36883f..48b54faec8 100644
--- a/indra/newview/llnamebox.h
+++ b/indra/newview/llnamebox.h
@@ -47,9 +47,11 @@ public:
struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
{
Optional<bool> is_group;
+ Optional<bool> link;
Params()
: is_group("is_group", false)
+ , link("link", false)
{}
};
@@ -67,10 +69,14 @@ protected:
friend class LLUICtrlFactory;
private:
+ void setName(const std::string& name, BOOL is_group);
+
static std::set<LLNameBox*> sInstances;
private:
LLUUID mNameID;
+ BOOL mLink;
+ std::string mInitialValue;
};
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 541db0ca6e..114fef8712 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -74,12 +74,12 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
{
//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
- std::string fullname;
- gCacheName->getFullName(agent_id, fullname);
-
- fullname.append(suffix);
+ NameItem item;
+ item.value = agent_id;
+ item.enabled = enabled;
+ item.target = INDIVIDUAL;
- addStringUUIDItem(fullname, agent_id, pos, enabled);
+ addNameItemRow(item, pos);
}
// virtual, public
@@ -130,11 +130,12 @@ BOOL LLNameListCtrl::handleDragAndDrop(
return handled;
}
-void LLNameListCtrl::showAvatarInspector(const LLUUID& avatar_id)
+void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
{
- LLSD key;
- key["avatar_id"] = avatar_id;
- LLFloaterReg::showInstance("inspect_avatar", key);
+ if (is_group)
+ LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", avatar_id));
+ else
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
}
//virtual
@@ -143,11 +144,15 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
BOOL handled = FALSE;
S32 column_index = getColumnIndexFromOffset(x);
LLScrollListItem* hit_item = hitItem(x, y);
- if (hit_item)
+ if (hit_item
+ && column_index == mNameColumnIndex)
{
- if (column_index == mNameColumnIndex)
+ // ...this is the column with the avatar name
+ LLUUID avatar_id = hit_item->getUUID();
+ if (avatar_id.notNull())
{
- // ...this is the column with the avatar name
+ // ...valid avatar id
+
LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
if (hit_cell)
{
@@ -158,13 +163,15 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
localRectToScreen(cell_rect, &sticky_rect);
// Spawn at right side of cell
- LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop );
LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
- LLUUID avatar_id = hit_item->getValue().asUUID();
+ LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
+
+ // Should we show a group or an avatar inspector?
+ bool is_group = hit_item->getValue()["is_group"].asBoolean();
LLToolTip::Params params;
params.background_visible( false );
- params.click_callback( boost::bind(&LLNameListCtrl::showAvatarInspector, this, avatar_id) );
+ params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group) );
params.delay_time(0.0f); // spawn instantly on hover
params.image( icon );
params.message("");
@@ -218,9 +225,23 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p
}
-LLScrollListItem* LLNameListCtrl::addNameItemRow(const LLNameListCtrl::NameItem& name_item, EAddPosition pos)
+LLScrollListItem* LLNameListCtrl::addNameItemRow(
+ const LLNameListCtrl::NameItem& name_item,
+ EAddPosition pos,
+ std::string& suffix)
{
- LLScrollListItem* item = LLScrollListCtrl::addRow(name_item, pos);
+ LLUUID id = name_item.value().asUUID();
+ LLNameListItem* item = NULL;
+
+ // Store item type so that we can invoke the proper inspector.
+ // *TODO Vadim: Is there a more proper way of storing additional item data?
+ {
+ LLNameListCtrl::NameItem item_p(name_item);
+ item_p.value = LLSD().with("uuid", id).with("is_group", name_item.target() == GROUP);
+ item = new LLNameListItem(item_p);
+ LLScrollListCtrl::addRow(item, item_p, pos);
+ }
+
if (!item) return NULL;
// use supplied name by default
@@ -228,7 +249,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(const LLNameListCtrl::NameItem&
switch(name_item.target)
{
case GROUP:
- gCacheName->getGroupName(name_item.value().asUUID(), fullname);
+ gCacheName->getGroupName(id, fullname);
// fullname will be "nobody" if group not found
break;
case SPECIAL:
@@ -237,7 +258,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(const LLNameListCtrl::NameItem&
case INDIVIDUAL:
{
std::string name;
- if (gCacheName->getFullName(name_item.value().asUUID(), name))
+ if (gCacheName->getFullName(id, name))
{
fullname = name;
}
@@ -247,6 +268,12 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(const LLNameListCtrl::NameItem&
break;
}
+ // Append optional suffix.
+ if (!suffix.empty())
+ {
+ fullname.append(suffix);
+ }
+
LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
@@ -268,15 +295,24 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(const LLNameListCtrl::NameItem&
// public
void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
{
- BOOL item_exists = selectByID( agent_id );
- if(item_exists)
+ // Find the item specified with agent_id.
+ S32 idx = -1;
+ for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++)
{
- S32 index = getItemIndex(getFirstSelected());
- if(index >= 0)
+ LLScrollListItem* item = *it;
+ if (item->getUUID() == agent_id)
{
- deleteSingleItem(index);
+ idx = getItemIndex(item);
+ break;
}
}
+
+ // Remove it.
+ if (idx >= 0)
+ {
+ selectNthItem(idx); // not sure whether this is needed, taken from previous implementation
+ deleteSingleItem(idx);
+ }
}
// public
@@ -303,8 +339,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
LLScrollListItem* item = *iter;
if (item->getUUID() == id)
{
- LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(0);
- cell = item->getColumn(mNameColumnIndex);
+ LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
cell->setValue(fullname);
@@ -320,11 +355,12 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
const std::string& last, BOOL is_group)
{
+ LLInstanceTrackerScopedGuard guard;
LLInstanceTracker<LLNameListCtrl>::instance_iter it;
- for (it = beginInstances(); it != endInstances(); ++it)
+ for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
{
- LLNameListCtrl* ctrl = *it;
- ctrl->refresh(id, first, last, is_group);
+ LLNameListCtrl& ctrl = *it;
+ ctrl.refresh(id, first, last, is_group);
}
}
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index d0f0ec4d21..23b1cb6897 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -94,7 +94,7 @@ public:
void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
- LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM);
+ LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null);
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
@@ -121,7 +121,7 @@ public:
/*virtual*/ void updateColumns();
private:
- void showAvatarInspector(const LLUUID& avatar_id);
+ void showInspector(const LLUUID& avatar_id, bool is_group);
private:
S32 mNameColumnIndex;
@@ -129,4 +129,24 @@ private:
BOOL mAllowCallingCardDrop;
};
+/**
+ * LLNameListCtrl item
+ *
+ * We don't use LLScrollListItem to be able to override getUUID(), which is needed
+ * because the name list item value is not simply an UUID but a map (uuid, is_group).
+ */
+class LLNameListItem : public LLScrollListItem
+{
+public:
+ LLUUID getUUID() const { return getValue()["uuid"].asUUID(); }
+
+protected:
+ friend class LLNameListCtrl;
+
+ LLNameListItem( const LLScrollListItem::Params& p )
+ : LLScrollListItem(p)
+ {
+ }
+};
+
#endif
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 9a05812847..d42e4bc250 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -34,10 +34,14 @@
#include "llnavigationbar.h"
-#include <llfloaterreg.h>
-#include <llfocusmgr.h>
-#include <lliconctrl.h>
-#include <llmenugl.h>
+#include "v2math.h"
+
+#include "llregionhandle.h"
+
+#include "llfloaterreg.h"
+#include "llfocusmgr.h"
+#include "lliconctrl.h"
+#include "llmenugl.h"
#include "llagent.h"
#include "llviewerregion.h"
@@ -49,12 +53,16 @@
#include "llsidetray.h"
#include "llslurl.h"
#include "llurlsimstring.h"
+#include "llurlregistry.h"
+#include "llurldispatcher.h"
#include "llviewerinventory.h"
+#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
-#include "llworldmap.h"
+#include "llworldmapmessage.h"
#include "llappviewer.h"
#include "llviewercontrol.h"
#include "llfloatermediabrowser.h"
+#include "llweb.h"
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
@@ -81,9 +89,24 @@ public:
struct Params : public LLInitParam::Block<Params, LLMenuItemCallGL::Params>
{
- Mandatory<EType> item_type;
-
- Params() {}
+ Mandatory<EType> item_type;
+ Optional<const LLFontGL*> back_item_font,
+ current_item_font,
+ forward_item_font;
+ Optional<std::string> back_item_image,
+ forward_item_image;
+ Optional<S32> image_hpad,
+ image_vpad;
+ Params()
+ : item_type(),
+ back_item_font("back_item_font"),
+ current_item_font("current_item_font"),
+ forward_item_font("forward_item_font"),
+ back_item_image("back_item_image"),
+ forward_item_image("forward_item_image"),
+ image_hpad("image_hpad"),
+ image_vpad("image_vpad")
+ {}
};
/*virtual*/ void draw();
@@ -96,33 +119,36 @@ private:
static const S32 ICON_WIDTH = 16;
static const S32 ICON_HEIGHT = 16;
- static const std::string ICON_IMG_BACKWARD;
- static const std::string ICON_IMG_FORWARD;
LLIconCtrl* mArrowIcon;
};
-const std::string LLTeleportHistoryMenuItem::ICON_IMG_BACKWARD("teleport_history_backward.tga");
-const std::string LLTeleportHistoryMenuItem::ICON_IMG_FORWARD("teleport_history_forward.tga");
+static LLDefaultChildRegistry::Register<LLTeleportHistoryMenuItem> r("teleport_history_menu_item");
+
LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p)
: LLMenuItemCallGL(p),
mArrowIcon(NULL)
{
// Set appearance depending on the item type.
- if (p.item_type == TYPE_CURRENT)
+ if (p.item_type == TYPE_BACKWARD)
+ {
+ setFont( p.back_item_font );
+ }
+ else if (p.item_type == TYPE_CURRENT)
{
- setFont(LLFontGL::getFontSansSerifBold());
+ setFont( p.current_item_font );
}
else
{
- setFont(LLFontGL::getFontSansSerif());
- setLabel(std::string(" ") + std::string(p.label));
+ setFont( p.forward_item_font );
}
LLIconCtrl::Params icon_params;
icon_params.name("icon");
- icon_params.rect(LLRect(0, ICON_HEIGHT, ICON_WIDTH, 0));
+ LLRect rect(0, ICON_HEIGHT, ICON_WIDTH, 0);
+ rect.translate( p.image_hpad, p.image_vpad );
+ icon_params.rect( rect );
icon_params.mouse_opaque(false);
icon_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
icon_params.visible(false);
@@ -131,9 +157,9 @@ LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p)
// no image for the current item
if (p.item_type == TYPE_BACKWARD)
- mArrowIcon->setValue(ICON_IMG_BACKWARD);
+ mArrowIcon->setValue( p.back_item_image() );
else if (p.item_type == TYPE_FORWARD)
- mArrowIcon->setValue(ICON_IMG_FORWARD);
+ mArrowIcon->setValue( p.forward_item_image() );
addChild(mArrowIcon);
}
@@ -157,6 +183,84 @@ void LLTeleportHistoryMenuItem::onMouseLeave(S32 x, S32 y, MASK mask)
mArrowIcon->setVisible(FALSE);
}
+static LLDefaultChildRegistry::Register<LLPullButton> menu_button("pull_button");
+
+LLPullButton::LLPullButton(const LLPullButton::Params& params) :
+ LLButton(params)
+{
+ setDirectionFromName(params.direction);
+}
+boost::signals2::connection LLPullButton::setClickDraggingCallback(const commit_signal_t::slot_type& cb)
+{
+ return mClickDraggingSignal.connect(cb);
+}
+
+/*virtual*/
+void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLButton::onMouseLeave(x, y, mask);
+
+ if (mMouseDownTimer.getStarted()) //an user have done a mouse down, if the timer started. see LLButton::handleMouseDown for details
+ {
+ const LLVector2 cursor_direction = LLVector2(F32(x), F32(y)) - mLastMouseDown;
+ /* For now cursor_direction points to the direction of mouse movement
+ * Need to decide whether should we fire a signal.
+ * We fire if angle between mDraggingDirection and cursor_direction is less that 45 degree
+ * Note:
+ * 0.5 * F_PI_BY_TWO equals to PI/4 radian that equals to angle of 45 degrees
+ */
+ if (angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4
+ {
+ mClickDraggingSignal(this, LLSD());
+ }
+ }
+
+}
+
+/*virtual*/
+BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLButton::handleMouseDown(x, y, mask);
+ if (handled)
+ {
+ //if mouse down was handled by button,
+ //capture mouse position to calculate the direction of mouse move after mouseLeave event
+ mLastMouseDown.set(F32(x), F32(y));
+ }
+ return handled;
+}
+
+/*virtual*/
+BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ // reset data to get ready for next circle
+ mLastMouseDown.clear();
+ return LLButton::handleMouseUp(x, y, mask);
+}
+/**
+ * this function is setting up dragging direction vector.
+ * Last one is just unit vector. It points to direction of mouse drag that we need to handle
+ */
+void LLPullButton::setDirectionFromName(const std::string& name)
+{
+ if (name == "left")
+ {
+ mDraggingDirection.set(F32(-1), F32(0));
+ }
+ else if (name == "right")
+ {
+ mDraggingDirection.set(F32(0), F32(1));
+ }
+ else if (name == "down")
+ {
+ mDraggingDirection.set(F32(0), F32(-1));
+ }
+ else if (name == "up")
+ {
+ mDraggingDirection.set(F32(0), F32(1));
+ }
+}
+
//-- LNavigationBar ----------------------------------------------------------
/*
@@ -171,10 +275,9 @@ LLNavigationBar::LLNavigationBar()
mBtnHome(NULL),
mCmbLocation(NULL),
mSearchComboBox(NULL),
- mPurgeTPHistoryItems(false)
+ mPurgeTPHistoryItems(false),
+ mSaveToLocationHistory(false)
{
- setIsChrome(TRUE);
-
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
// set a listener function for LoginComplete event
@@ -187,13 +290,13 @@ LLNavigationBar::LLNavigationBar()
LLNavigationBar::~LLNavigationBar()
{
mTeleportFinishConnection.disconnect();
- LLSearchHistory::getInstance()->save();
+ mTeleportFailedConnection.disconnect();
}
BOOL LLNavigationBar::postBuild()
{
- mBtnBack = getChild<LLButton>("back_btn");
- mBtnForward = getChild<LLButton>("forward_btn");
+ mBtnBack = getChild<LLPullButton>("back_btn");
+ mBtnForward = getChild<LLPullButton>("forward_btn");
mBtnHome = getChild<LLButton>("home_btn");
mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
@@ -201,27 +304,28 @@ BOOL LLNavigationBar::postBuild()
fillSearchComboBox();
- if (!mBtnBack || !mBtnForward || !mBtnHome ||
- !mCmbLocation || !mSearchComboBox)
- {
- llwarns << "Malformed navigation bar" << llendl;
- return FALSE;
- }
-
mBtnBack->setEnabled(FALSE);
mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this));
- mBtnBack->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _2));
-
+ mBtnBack->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this,_1, _2));
+ mBtnBack->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1));
+
mBtnForward->setEnabled(FALSE);
mBtnForward->setClickedCallback(boost::bind(&LLNavigationBar::onForwardButtonClicked, this));
- mBtnForward->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _2));
+ mBtnForward->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _1, _2));
+ mBtnForward->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1));
mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));
- mCmbLocation->setSelectionCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
+ mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
+ mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
+
+ mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this));
+
mDefaultNbRect = getRect();
mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect();
@@ -232,6 +336,21 @@ BOOL LLNavigationBar::postBuild()
return TRUE;
}
+void LLNavigationBar::setVisible(BOOL visible)
+{
+ // change visibility of grandparent layout_panel to animate in and out
+ if (getParent())
+ {
+ //to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping about a problem.
+ if(getParent()->getName() != "nav_bar_container")
+ {
+ LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL;
+ }
+ getParent()->setVisible(visible);
+ }
+}
+
+
void LLNavigationBar::fillSearchComboBox()
{
if(!mSearchComboBox)
@@ -271,15 +390,27 @@ void LLNavigationBar::draw()
LLPanel::draw();
}
+BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = childrenHandleRightMouseDown( x, y, mask) != NULL;
+ if(!handled && !gMenuHolder->hasVisibleMenu())
+ {
+ show_navbar_context_menu(this,x,y);
+ handled = true;
+ }
+
+ return handled;
+}
+
void LLNavigationBar::onBackButtonClicked()
{
LLTeleportHistory::getInstance()->goBack();
}
-void LLNavigationBar::onBackOrForwardButtonHeldDown(const LLSD& param)
+void LLNavigationBar::onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param)
{
if (param["count"].asInteger() == 0)
- showTeleportHistoryMenu();
+ showTeleportHistoryMenu(ctrl);
}
void LLNavigationBar::onForwardButtonClicked()
@@ -318,8 +449,14 @@ void LLNavigationBar::onLocationSelection()
// Will not teleport to empty location.
if (typed_location.empty())
return;
-
+ //get selected item from combobox item
LLSD value = mCmbLocation->getSelectedValue();
+ /* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item,
+ * typed by user slurl or region name. Let's find out which type of item the user has selected
+ * to make decision about adding this location into typed history. see mSaveToLocationHistory
+ * Note:
+ * Only TYPED_REGION_SLURL item will be added into LLLocationHistory
+ */
if(value.has("item_type"))
{
@@ -349,7 +486,7 @@ void LLNavigationBar::onLocationSelection()
case TELEPORT_HISTORY:
//in case of teleport item was selected, teleport by position too.
- case TYPED_REGION_SURL:
+ case TYPED_REGION_SLURL:
if(value.has("global_pos"))
{
gAgent.teleportViaLocation(LLVector3d(value["global_pos"]));
@@ -361,7 +498,7 @@ void LLNavigationBar::onLocationSelection()
break;
}
}
- //Let's parse surl or region name
+ //Let's parse slurl or region name
std::string region_name;
LLVector3 local_coords(128, 128, 0);
@@ -374,7 +511,17 @@ void LLNavigationBar::onLocationSelection()
local_coords.set(x, y, z);
else
return;
- }else
+ }
+ // we have to do this check after previous, because LLUrlRegistry contains handlers for slurl too
+ //but we need to know whether typed_location is a simple http url.
+ else if (LLUrlRegistry::instance().isUrl(typed_location))
+ {
+ // display http:// URLs in the media browser, or
+ // anything else is sent to the search floater
+ LLWeb::loadURL(typed_location);
+ return;
+ }
+ else
{
// assume that an user has typed the {region name} or possible {region_name, parcel}
region_name = typed_location.substr(0,typed_location.find(','));
@@ -382,34 +529,37 @@ void LLNavigationBar::onLocationSelection()
// Resolve the region name to its global coordinates.
// If resolution succeeds we'll teleport.
- LLWorldMap::url_callback_t cb = boost::bind(
+ LLWorldMapMessage::url_callback_t cb = boost::bind(
&LLNavigationBar::onRegionNameResponse, this,
typed_location, region_name, local_coords, _1, _2, _3, _4);
- // connect the callback each time, when user enter new location to get real location of agent after teleport
- mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
- setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location));
-
- LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
+ mSaveToLocationHistory = true;
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
+}
+
+void LLNavigationBar::onTeleportFailed()
+{
+ mSaveToLocationHistory = false;
}
-void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location)
+void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
{
- // Location is valid. Add it to the typed locations history.
+ if (!mSaveToLocationHistory)
+ return;
LLLocationHistory* lh = LLLocationHistory::getInstance();
- //TODO*: do we need convert surl into readable format?
+ //TODO*: do we need convert slurl into readable format?
std::string location;
/*NOTE:
* We can't use gAgent.getPositionAgent() in case of local teleport to build location.
* At this moment gAgent.getPositionAgent() contains previous coordinates.
* according to EXT-65 agent position is being reseted on each frame.
*/
- LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM,
+ LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
gAgent.getPosAgentFromGlobal(global_agent_pos));
std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));
LLLocationHistoryItem item (location,
- global_agent_pos, tooltip,TYPED_REGION_SURL);// we can add into history only TYPED location
+ global_agent_pos, tooltip,TYPED_REGION_SLURL);// we can add into history only TYPED location
//Touch it, if it is at list already, add new location otherwise
if ( !lh->touchItem(item) ) {
lh->addItem(item);
@@ -417,8 +567,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
lh->save();
- if(mTeleportFinishConnection.connected())
- mTeleportFinishConnection.disconnect();
+ mSaveToLocationHistory = false;
}
@@ -470,7 +619,7 @@ void LLNavigationBar::rebuildTeleportHistoryMenu()
type = LLTeleportHistoryMenuItem::TYPE_CURRENT;
LLTeleportHistoryMenuItem::Params item_params;
- item_params.label = item_params.name = hist_items[i].getTitle();
+ item_params.label = item_params.name = hist_items[i].mTitle;
item_params.item_type = type;
item_params.on_click.function(boost::bind(&LLNavigationBar::onTeleportHistoryMenuItemClicked, this, i));
LLTeleportHistoryMenuItem* new_itemp = LLUICtrlFactory::create<LLTeleportHistoryMenuItem>(item_params);
@@ -500,7 +649,7 @@ void LLNavigationBar::onRegionNameResponse(
gAgent.teleportViaLocation(global_pos);
}
-void LLNavigationBar::showTeleportHistoryMenu()
+void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
{
// Don't show the popup if teleport history is empty.
if (LLTeleportHistory::getInstance()->isEmpty())
@@ -514,14 +663,43 @@ void LLNavigationBar::showTeleportHistoryMenu()
if (mTeleportHistoryMenu == NULL)
return;
- // *TODO: why to draw/update anything before showing the menu?
- mTeleportHistoryMenu->buildDrawLabels();
mTeleportHistoryMenu->updateParent(LLMenuGL::sMenuContainer);
- LLRect btnBackRect = mBtnBack->getRect();
- LLMenuGL::showPopup(this, mTeleportHistoryMenu, btnBackRect.mLeft, btnBackRect.mBottom);
-
+ const S32 MENU_SPAWN_PAD = -1;
+ LLMenuGL::showPopup(btn_ctrl, mTeleportHistoryMenu, 0, MENU_SPAWN_PAD);
+ LLButton* nav_button = dynamic_cast<LLButton*>(btn_ctrl);
+ if(nav_button)
+ {
+ if(mHistoryMenuConnection.connected())
+ {
+ LL_WARNS("Navgationbar")<<"mHistoryMenuConnection should be disconnected at this moment."<<LL_ENDL;
+ mHistoryMenuConnection.disconnect();
+ }
+ mHistoryMenuConnection = gMenuHolder->setMouseUpCallback(boost::bind(&LLNavigationBar::onNavigationButtonHeldUp, this, nav_button));
+ // pressed state will be update after mouseUp in onBackOrForwardButtonHeldUp();
+ nav_button->setForcePressedState(true);
+ }
// *HACK pass the mouse capturing to the drop-down menu
- gFocusMgr.setMouseCapture( NULL );
+ // it need to let menu handle mouseup event
+ gFocusMgr.setMouseCapture(gMenuHolder);
+}
+/**
+ * Taking into account the HACK above, this callback-function is responsible for correct handling of mouseUp event in case of holding-down the navigation buttons..
+ * We need to process this case separately to update a pressed state of navigation button.
+ */
+void LLNavigationBar::onNavigationButtonHeldUp(LLButton* nav_button)
+{
+ if(nav_button)
+ {
+ nav_button->setForcePressedState(false);
+ }
+ if(gFocusMgr.getMouseCapture() == gMenuHolder)
+ {
+ // we had passed mouseCapture in showTeleportHistoryMenu()
+ // now we MUST release mouseCapture to continue a proper mouseevent workflow.
+ gFocusMgr.setMouseCapture(NULL);
+ }
+ //gMenuHolder is using to display bunch of menus. Disconnect signal to avoid unnecessary calls.
+ mHistoryMenuConnection.disconnect();
}
void LLNavigationBar::handleLoginComplete()
@@ -531,7 +709,7 @@ void LLNavigationBar::handleLoginComplete()
void LLNavigationBar::invokeSearch(std::string search_text)
{
- LLFloaterReg::showInstance("search", LLSD().insert("category", "all").insert("id", LLSD(search_text)));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text)));
}
void LLNavigationBar::clearHistoryCache()
@@ -576,6 +754,8 @@ void LLNavigationBar::showNavigationPanel(BOOL visible)
// this is duplicated in 'else' section because it should be called BEFORE fb->reshape
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ // propagate size to parent container
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
fb->reshape(fbRect.getWidth(), fbRect.getHeight());
fb->setRect(fbRect);
@@ -589,6 +769,7 @@ void LLNavigationBar::showNavigationPanel(BOOL visible)
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
}
}
else
@@ -603,6 +784,7 @@ void LLNavigationBar::showNavigationPanel(BOOL visible)
// this is duplicated in 'else' section because it should be called BEFORE fb->reshape
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
fb->reshape(fbRect.getWidth(), fbRect.getHeight());
fb->setRect(fbRect);
@@ -615,16 +797,12 @@ void LLNavigationBar::showNavigationPanel(BOOL visible)
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
}
}
childSetVisible("bg_icon", fpVisible);
childSetVisible("bg_icon_no_fav", !fpVisible);
-
- if(LLSideTray::instanceCreated())
- {
- LLSideTray::getInstance()->resetPanelRect();
- }
}
void LLNavigationBar::showFavoritesPanel(BOOL visible)
@@ -659,6 +837,7 @@ void LLNavigationBar::showFavoritesPanel(BOOL visible)
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
fb->reshape(fbRect.getWidth(), fbRect.getHeight());
fb->setRect(fbRect);
@@ -683,14 +862,11 @@ void LLNavigationBar::showFavoritesPanel(BOOL visible)
reshape(nbRect.getWidth(), nbRect.getHeight());
setRect(nbRect);
+ getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
}
childSetVisible("bg_icon", visible);
childSetVisible("bg_icon_no_fav", !visible);
fb->setVisible(visible);
- if(LLSideTray::instanceCreated())
- {
- LLSideTray::getInstance()->resetPanelRect();
- }
}
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 8b625e7fa6..b512f2a79c 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -34,14 +34,56 @@
#define LL_LLNAVIGATIONBAR_H
#include "llpanel.h"
+#include "llbutton.h"
-class LLButton;
class LLLocationInputCtrl;
class LLMenuGL;
class LLSearchEditor;
class LLSearchComboBox;
/**
+ * This button is able to handle click-dragging mouse event.
+ * It has appropriated signal for this event.
+ * Dragging direction can be set from xml attribute called 'direction'
+ *
+ * *TODO: move to llui?
+ */
+
+class LLPullButton: public LLButton
+{
+ LOG_CLASS(LLPullButton);
+
+public:
+ struct Params: public LLInitParam::Block<Params, LLButton::Params>
+ {
+ Optional<std::string> direction; // left, right, down, up
+
+ Params()
+ : direction("direction", "down")
+ {
+ }
+ };
+
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ boost::signals2::connection setClickDraggingCallback(const commit_signal_t::slot_type& cb);
+
+protected:
+ friend class LLUICtrlFactory;
+ // convert string name into direction vector
+ void setDirectionFromName(const std::string& name);
+ LLPullButton(const LLPullButton::Params& params);
+
+ commit_signal_t mClickDraggingSignal;
+ LLVector2 mLastMouseDown;
+ LLVector2 mDraggingDirection;
+};
+
+/**
* Web browser-like navigation bar.
*/
class LLNavigationBar
@@ -54,7 +96,9 @@ public:
virtual ~LLNavigationBar();
/*virtual*/ void draw();
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void setVisible(BOOL visible);
void handleLoginComplete();
void clearHistoryCache();
@@ -68,20 +112,21 @@ public:
private:
void rebuildTeleportHistoryMenu();
- void showTeleportHistoryMenu();
+ void showTeleportHistoryMenu(LLUICtrl* btn_ctrl);
void invokeSearch(std::string search_text);
// callbacks
void onTeleportHistoryMenuItemClicked(const LLSD& userdata);
void onTeleportHistoryChanged();
void onBackButtonClicked();
- void onBackOrForwardButtonHeldDown(const LLSD& param);
+ void onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param);
+ void onNavigationButtonHeldUp(LLButton* nav_button);
void onForwardButtonClicked();
void onHomeButtonClicked();
- void onHelpButtonClicked();
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
void onSearchCommit();
- void onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location);
+ void onTeleportFinished(const LLVector3d& global_agent_pos);
+ void onTeleportFailed();
void onRegionNameResponse(
std::string typed_location,
std::string region_name,
@@ -92,15 +137,19 @@ private:
void fillSearchComboBox();
LLMenuGL* mTeleportHistoryMenu;
- LLButton* mBtnBack;
- LLButton* mBtnForward;
+ LLPullButton* mBtnBack;
+ LLPullButton* mBtnForward;
LLButton* mBtnHome;
LLSearchComboBox* mSearchComboBox;
LLLocationInputCtrl* mCmbLocation;
LLRect mDefaultNbRect;
LLRect mDefaultFpRect;
+ boost::signals2::connection mTeleportFailedConnection;
boost::signals2::connection mTeleportFinishConnection;
+ boost::signals2::connection mHistoryMenuConnection;
bool mPurgeTPHistoryItems;
+ // if true, save location to location history when teleport finishes
+ bool mSaveToLocationHistory;
};
#endif
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 12638ab855..16384ef6e0 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -54,14 +54,22 @@
#include "llstylemap.h"
#include "lldraghandle.h"
-#include "lltrans.h"
+
#include "llbottomtray.h"
#include "llnearbychatbar.h"
+#include "llfloaterreg.h"
+#include "lltrans.h"
static const S32 RESIZE_BAR_THICKNESS = 3;
+const static std::string IM_TIME("time");
+const static std::string IM_TEXT("message");
+const static std::string IM_FROM("from");
+const static std::string IM_FROM_ID("from_id");
+
+
LLNearbyChat::LLNearbyChat(const LLSD& key)
- : LLDockableFloater(NULL, key)
+ : LLDockableFloater(NULL, false, false, key)
,mChatHistory(NULL)
{
@@ -89,136 +97,120 @@ BOOL LLNearbyChat::postBuild()
mChatHistory = getChild<LLChatHistory>("chat_history");
- setCanResize(true);
-
if(!LLDockableFloater::postBuild())
return false;
if (getDockControl() == NULL)
{
setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getNearbyChatBar(), this,
- getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
+ LLBottomTray::getInstance()->getNearbyChatBar(), this,
+ getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
}
+ setIsChrome(true);
+ //chrome="true" hides floater caption
+ if (mDragHandle)
+ mDragHandle->setTitleVisible(TRUE);
+
return true;
}
-LLColor4 nearbychat_get_text_color(const LLChat& chat)
+void LLNearbyChat::applySavedVariables()
{
- LLColor4 text_color;
+ if (mRectControl.size() > 1)
+ {
+ const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
+ if(!rect.isEmpty() && rect.isValid())
+ {
+ reshape(rect.getWidth(), rect.getHeight());
+ setRect(rect);
+ }
+ }
+
- if(chat.mMuted)
+ if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl))
{
- text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
+ setDocked(true);
}
else
{
- switch(chat.mSourceType)
+ if (mDocStateControl.size() > 1)
{
- case CHAT_SOURCE_SYSTEM:
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- break;
- case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
- {
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- }
- else
- {
- if(gAgentID == chat.mFromID)
- {
- text_color = LLUIColorTable::instance().getColor("UserChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("AgentChatColor");
- }
- }
- break;
- case CHAT_SOURCE_OBJECT:
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
- }
- else if ( chat.mChatType == CHAT_TYPE_OWNER )
- {
- text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
- }
- break;
- default:
- text_color.setToWhite();
- }
-
- if (!chat.mPosAgent.isExactlyZero())
- {
- LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
- {
- // diminish far-off chat
- text_color.mV[VALPHA] = 0.8f;
- }
+ bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl);
+ setDocked(dockState);
}
}
-
- return text_color;
}
-void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color)
+std::string appendTime()
{
- S32 font_size = gSavedSettings.getS32("ChatFontSize");
+ time_t utc_time;
+ utc_time = time_corrected();
+ std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"]";
- const LLFontGL* fontp = NULL;
- switch(font_size)
- {
- case 0:
- fontp = LLFontGL::getFontSansSerifSmall();
- break;
- default:
- case 1:
- fontp = LLFontGL::getFontSansSerif();
- break;
- case 2:
- fontp = LLFontGL::getFontSansSerifBig();
- break;
- }
+ LLSD substitution;
- LLStyle::Params style_params;
- style_params.color(color);
- style_params.font(fontp);
- LLUUID uuid = chat.mFromID;
- std::string from = chat.mFromName;
- std::string message = chat.mText;
- mChatHistory->appendWidgetMessage(chat, style_params);
+ substitution["datetime"] = (S32) utc_time;
+ LLStringUtil::format (timeStr, substitution);
+
+ return timeStr;
}
-void LLNearbyChat::addMessage(const LLChat& chat)
+
+void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
{
- LLColor4 color = nearbychat_get_text_color(chat);
-
if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
{
if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
return;
if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
{
+
+ LLColor4 txt_color;
+
+ LLViewerChat::getChatColor(chat,txt_color);
+
LLFloaterScriptDebug::addScriptLine(chat.mText,
chat.mFromName,
- color,
+ txt_color,
chat.mFromID);
return;
}
}
+
+ LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+ if(tmp_chat.mTimeStr.empty())
+ tmp_chat.mTimeStr = appendTime();
+
+ bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
- // could flash the chat button in the status bar here. JC
if (!chat.mMuted)
- add_timestamped_line(chat, color);
+ {
+ tmp_chat.mFromName = chat.mFromName;
+ LLSD chat_args = args;
+ chat_args["use_plain_text_chat_history"] = use_plain_text_chat_history;
+ mChatHistory->appendMessage(chat, chat_args);
+ }
+
+ if(archive)
+ {
+ mMessageArchive.push_back(chat);
+ if(mMessageArchive.size()>200)
+ mMessageArchive.erase(mMessageArchive.begin());
+ }
+
+ if (args["do_not_log"].asBoolean())
+ {
+ return;
+ }
+
+ if (gSavedPerAccountSettings.getBOOL("LogChat"))
+ {
+ LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
+ }
}
void LLNearbyChat::onNearbySpeakers()
@@ -240,20 +232,23 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
return false;
}
-void LLNearbyChat::onOpen(const LLSD& key )
+void LLNearbyChat::setVisible(BOOL visible)
{
- LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
- if(chat_channel)
+ if(visible)
{
- chat_channel->removeToastsFromChannel();
+ LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ if(chat_channel)
+ {
+ chat_channel->removeToastsFromChannel();
+ }
}
+
+ LLDockableFloater::setVisible(visible);
}
-void LLNearbyChat::setDocked (bool docked, bool pop_on_undock)
+void LLNearbyChat::onOpen(const LLSD& key )
{
- LLDockableFloater::setDocked(docked, pop_on_undock);
-
- setCanResize(!docked);
+ LLDockableFloater::onOpen(key);
}
void LLNearbyChat::setRect (const LLRect &rect)
@@ -263,13 +258,77 @@ void LLNearbyChat::setRect (const LLRect &rect)
void LLNearbyChat::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRect();
+ rect = gViewerWindow->getWorldViewRectScaled();
}
-void LLNearbyChat::setVisible (BOOL visible)
+
+void LLNearbyChat::updateChatHistoryStyle()
{
- LLDockableFloater::setVisible(visible);
+ mChatHistory->clear();
+ for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
+ {
+ addMessage(*it,false);
+ }
}
-void LLNearbyChat::toggleWindow()
+
+//static
+void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ nearby_chat->updateChatHistoryStyle();
+}
+
+void LLNearbyChat::loadHistory()
+{
+ LLSD do_not_log;
+ do_not_log["do_not_log"] = true;
+
+ std::list<LLSD> history;
+ LLLogChat::loadAllHistory("chat", history);
+
+ std::list<LLSD>::const_iterator it = history.begin();
+ while (it != history.end())
+ {
+ const LLSD& msg = *it;
+
+ std::string from = msg[IM_FROM];
+ LLUUID from_id = LLUUID::null;
+ if (msg[IM_FROM_ID].isUndefined())
+ {
+ gCacheName->getUUID(from, from_id);
+ }
+
+ LLChat chat;
+ chat.mFromName = from;
+ chat.mFromID = from_id;
+ chat.mText = msg[IM_TEXT].asString();
+ chat.mTimeStr = msg[IM_TIME].asString();
+ chat.mChatStyle = CHAT_STYLE_HISTORY;
+ addMessage(chat, true, do_not_log);
+
+ it++;
+ }
+}
+
+//static
+LLNearbyChat* LLNearbyChat::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLNearbyChat::onFocusReceived()
+{
+ setBackgroundOpaque(true);
+ LLPanel::onFocusReceived();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLNearbyChat::onFocusLost()
{
+ setBackgroundOpaque(false);
+ LLPanel::onFocusLost();
}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 20cbf7537d..6ef2a1fee3 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -35,7 +35,7 @@
#include "lldockablefloater.h"
#include "llscrollbar.h"
-#include "llchat.h"
+#include "llviewerchat.h"
class LLResizeBar;
class LLChatHistory;
@@ -47,30 +47,43 @@ public:
~LLNearbyChat();
BOOL postBuild ();
- void addMessage (const LLChat& message);
-
+
+ /** @param archive true - to save a message to the chat history log */
+ void addMessage (const LLChat& message,bool archive = true, const LLSD &args = LLSD());
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
- void setDocked (bool docked, bool pop_on_undock);
- void toggleWindow ();
-
+ // focus overrides
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
/*virtual*/ void onOpen (const LLSD& key);
- virtual void setVisible (BOOL visible);
+ /*virtual*/ void setVisible(BOOL visible);
virtual void setRect (const LLRect &rect);
+ virtual void updateChatHistoryStyle();
+
+ static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
+ void loadHistory();
+
+ static LLNearbyChat* getInstance();
+
private:
+ virtual void applySavedVariables();
+
void getAllowedRect (LLRect& rect);
void onNearbySpeakers ();
- void add_timestamped_line(const LLChat& chat, const LLColor4& color);
private:
LLHandle<LLView> mPopupMenuHandle;
LLChatHistory* mChatHistory;
+
+ std::vector<LLChat> mMessageArchive;
};
#endif
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 217007fb15..ad98a29fb2 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
+#include "message.h"
+
#include "llfloaterreg.h"
#include "lltrans.h"
@@ -46,13 +48,16 @@
#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llnavigationbar.h"
+#include "llwindow.h"
+#include "llviewerwindow.h"
+#include "llrootview.h"
S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
// legacy callback glue
void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
-static LLDefaultChildRegistry::Register<LLGestureComboBox> r("gesture_combo_box");
+static LLDefaultChildRegistry::Register<LLGestureComboList> r("gesture_combo_list");
struct LLChatTypeTrigger {
std::string name;
@@ -64,43 +69,193 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
{ "/shout" , CHAT_TYPE_SHOUT}
};
-LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p)
- : LLComboBox(p)
- , mGestureLabelTimer()
+LLGestureComboList::Params::Params()
+: combo_button("combo_button"),
+ combo_list("combo_list")
+{
+}
+
+LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
+: LLUICtrl(p)
, mLabel(p.label)
, mViewAllItemIndex(0)
{
- setCommitCallback(boost::bind(&LLGestureComboBox::onCommitGesture, this));
+ LLButton::Params button_params = p.combo_button;
+ button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
+
+ mButton = LLUICtrlFactory::create<LLButton>(button_params);
+ mButton->reshape(getRect().getWidth(),getRect().getHeight());
+ mButton->setCommitCallback(boost::bind(&LLGestureComboList::onButtonCommit, this));
+
+ addChild(mButton);
+
+ LLScrollListCtrl::Params params = p.combo_list;
+ params.name("GestureComboList");
+ params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2));
+ params.visible(false);
+ params.commit_on_keyboard_movement(false);
+
+ mList = LLUICtrlFactory::create<LLScrollListCtrl>(params);
+
+ // *HACK: adding list as a child to FloaterViewHolder to make it fully visible without
+ // making it top control (because it would cause problems).
+ gViewerWindow->getFloaterViewHolder()->addChild(mList);
+ mList->setVisible(FALSE);
+
+ //****************************Gesture Part********************************/
+
+ setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this));
// now register us as observer since we have a place to put the results
LLGestureManager::instance().addObserver(this);
// refresh list from current active gestures
refreshGestures();
+
+ setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this));
}
-LLGestureComboBox::~LLGestureComboBox()
+BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
- LLGestureManager::instance().removeObserver(this);
+ BOOL handled = FALSE;
+
+ if (key == KEY_ESCAPE && mask == MASK_NONE )
+ {
+ hideList();
+ handled = TRUE;
+ }
+ else
+ {
+ handled = mList->handleKey(key, mask, called_from_parent);
+ }
+
+ return handled;
+}
+
+void LLGestureComboList::showList()
+{
+ LLRect rect = mList->getRect();
+ LLRect screen;
+ mButton->localRectToScreen(getRect(), &screen);
+
+ // Calculating amount of space between the navigation bar and gestures combo
+ LLNavigationBar* nb = LLNavigationBar::getInstance();
+
+ S32 x, nb_bottom;
+ nb->localPointToScreen(0, 0, &x, &nb_bottom);
+
+ S32 max_height = nb_bottom - screen.mTop;
+ mList->calcColumnWidths();
+ rect.setOriginAndSize(screen.mLeft, screen.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
+
+ mList->setRect(rect);
+ mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
+
+ gFocusMgr.setKeyboardFocus(this);
+
+ // Show the list and push the button down
+ mButton->setToggleState(TRUE);
+ mList->setVisible(TRUE);
+}
+
+void LLGestureComboList::onButtonCommit()
+{
+ if (!mList->getVisible())
+ {
+ // highlight the last selected item from the original selection before potentially selecting a new item
+ // as visual cue to original value of combo box
+ LLScrollListItem* last_selected_item = mList->getLastSelectedItem();
+ if (last_selected_item)
+ {
+ mList->mouseOverHighlightNthItem(mList->getItemIndex(last_selected_item));
+ }
+
+ if (mList->getItemCount() != 0)
+ {
+ showList();
+ }
+ }
+ else
+ {
+ hideList();
+ }
+}
+
+void LLGestureComboList::hideList()
+{
+ if (mList->getVisible())
+ {
+ mButton->setToggleState(FALSE);
+ mList->setVisible(FALSE);
+ mList->mouseOverHighlightNthItem(-1);
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
+}
+
+S32 LLGestureComboList::getCurrentIndex() const
+{
+ LLScrollListItem* item = mList->getFirstSelected();
+ if( item )
+ {
+ return mList->getItemIndex( item );
+ }
+ return -1;
+}
+
+void LLGestureComboList::onItemSelected(const LLSD& data)
+{
+ const std::string name = mList->getSelectedItemLabel();
+
+ S32 cur_id = getCurrentIndex();
+ mLastSelectedIndex = cur_id;
+ if (cur_id != mList->getItemCount()-1 && cur_id != -1)
+ {
+ mButton->setLabel(name);
+ }
+
+ // hiding the list reasserts the old value stored in the text editor/dropdown button
+ hideList();
+
+ // commit does the reverse, asserting the value in the list
+ onCommit();
+}
+
+void LLGestureComboList::sortByName(bool ascending)
+{
+ mList->sortOnce(0, ascending);
+}
+
+LLSD LLGestureComboList::getValue() const
+{
+ LLScrollListItem* item = mList->getFirstSelected();
+ if( item )
+ {
+ return item->getValue();
+ }
+ else
+ {
+ return LLSD();
+ }
}
-void LLGestureComboBox::refreshGestures()
+void LLGestureComboList::refreshGestures()
{
//store current selection so we can maintain it
LLSD cur_gesture = getValue();
- selectFirstItem();
- // clear
- clearRows();
+
+ mList->selectFirstItem();
+ mList->clearRows();
mGestures.clear();
- LLGestureManager::item_map_t::iterator it;
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
LLSD::Integer idx(0);
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
LLMultiGesture* gesture = (*it).second;
if (gesture)
{
- addSimpleElement(gesture->mName, ADD_BOTTOM, LLSD(idx));
+ mList->addSimpleElement(gesture->mName, ADD_BOTTOM, LLSD(idx));
mGestures.push_back(gesture);
idx++;
}
@@ -110,23 +265,42 @@ void LLGestureComboBox::refreshGestures()
// store index followed by the last added Gesture and add View All item at bottom
mViewAllItemIndex = idx;
- addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
+
+ mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
// Insert label after sorting, at top, with separator below it
- addSeparator(ADD_TOP);
- addSimpleElement(mLabel, ADD_TOP);
+ mList->addSeparator(ADD_TOP);
+ mList->addSimpleElement(mLabel, ADD_TOP);
if (cur_gesture.isDefined())
{
- selectByValue(cur_gesture);
+ mList->selectByValue(cur_gesture);
+
}
else
{
- selectFirstItem();
+ mList->selectFirstItem();
}
+
+ LLCtrlListInterface* gestures = getListInterface();
+ LLMultiGesture* gesture = NULL;
+
+ if (gestures)
+ {
+ S32 index = gestures->getSelectedValue().asInteger();
+ if(index > 0)
+ gesture = mGestures.at(index);
+ }
+
+ if(gesture && LLGestureManager::instance().isGesturePlaying(gesture))
+ {
+ return;
+ }
+
+ mButton->setLabel(mLabel);
}
-void LLGestureComboBox::onCommitGesture()
+void LLGestureComboList::onCommitGesture()
{
LLCtrlListInterface* gestures = getListInterface();
if (gestures)
@@ -157,56 +331,18 @@ void LLGestureComboBox::onCommitGesture()
}
}
}
-
- mGestureLabelTimer.start();
- // free focus back to chat bar
- setFocus(FALSE);
-}
-
-//virtual
-void LLGestureComboBox::draw()
-{
- // HACK: Leave the name of the gesture in place for a few seconds.
- const F32 SHOW_GESTURE_NAME_TIME = 2.f;
- if (mGestureLabelTimer.getStarted() && mGestureLabelTimer.getElapsedTimeF32() > SHOW_GESTURE_NAME_TIME)
- {
- LLCtrlListInterface* gestures = getListInterface();
- if (gestures) gestures->selectFirstItem();
- mGestureLabelTimer.stop();
- }
-
- LLComboBox::draw();
}
-//virtual
-void LLGestureComboBox::showList()
+LLGestureComboList::~LLGestureComboList()
{
- LLComboBox::showList();
-
- // Calculating amount of space between the navigation bar and gestures combo
- LLNavigationBar* nb = LLNavigationBar::getInstance();
- S32 x, nb_bottom;
- nb->localPointToScreen(0, 0, &x, &nb_bottom);
-
- S32 list_bottom;
- mList->localPointToScreen(0, 0, &x, &list_bottom);
-
- S32 max_height = nb_bottom - list_bottom;
-
- LLRect rect = mList->getRect();
- // List overlapped navigation bar, downsize it
- if (rect.getHeight() > max_height)
- {
- rect.setOriginAndSize(rect.mLeft, rect.mBottom, rect.getWidth(), max_height);
- mList->setRect(rect);
- mList->reshape(rect.getWidth(), rect.getHeight());
- }
+ LLGestureManager::instance().removeObserver(this);
}
LLNearbyChatBar::LLNearbyChatBar()
: LLPanel()
, mChatBox(NULL)
{
+ mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
}
//virtual
@@ -224,19 +360,10 @@ BOOL LLNearbyChatBar::postBuild()
mChatBox->setIgnoreTab(TRUE);
mChatBox->setPassDelete(TRUE);
mChatBox->setReplaceNewlinesWithSpaces(FALSE);
- mChatBox->setMaxTextLength(1023);
mChatBox->setEnableLineHistory(TRUE);
mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
mOutputMonitor->setVisible(FALSE);
- mTalkBtn = getParent()->getChild<LLTalkButton>("talk");
-
- // Speak button should be initially disabled because
- // it takes some time between logging in to world and connecting to voice channel.
- mTalkBtn->setEnabled(FALSE);
-
- // Registering Chat Bar to receive Voice client status change notifications.
- gVoiceClient->addObserver(this);
return TRUE;
}
@@ -255,16 +382,6 @@ bool LLNearbyChatBar::instanceExists()
void LLNearbyChatBar::draw()
{
- LLRect rect = getRect();
- S32 max_width = getMaxWidth();
-
- if (rect.getWidth() > max_width)
- {
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight());
- reshape(rect.getWidth(), rect.getHeight(), FALSE);
- setRect(rect);
- }
-
displaySpeakingIndicator();
LLPanel::draw();
}
@@ -517,8 +634,8 @@ void LLNearbyChatBar::displaySpeakingIndicator()
LLUUID id;
id.setNull();
- mSpeakerMgr.update(TRUE);
- mSpeakerMgr.getSpeakerList(&speaker_list, FALSE);
+ mSpeakerMgr->update(TRUE);
+ mSpeakerMgr->getSpeakerList(&speaker_list, FALSE);
for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
{
@@ -690,11 +807,6 @@ LLWString LLNearbyChatBar::stripChannelNumber(const LLWString &mesg, S32* channe
}
}
-void LLNearbyChatBar::setPTTState(bool state)
-{
- mTalkBtn->setSpeakBtnToggleState(state);
-}
-
void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
{
LLMessageSystem* msg = gMessageSystem;
@@ -730,27 +842,6 @@ public:
}
};
-void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- // Time it takes to connect to voice channel might be pretty long,
- // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
- BOOL enable = FALSE;
-
- switch (status)
- {
- // Do not add STATUS_VOICE_ENABLED because voice chat is
- // inactive until STATUS_JOINED
- case STATUS_JOINED:
- enable = TRUE;
- break;
- default:
- enable = FALSE;
- break;
- }
-
- mTalkBtn->setEnabled(enable);
-}
-
// Creating the object registers with the dispatcher.
LLChatHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 06204e6367..d9a7403611 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -37,43 +37,61 @@
#include "llcombobox.h"
#include "llgesturemgr.h"
#include "llchat.h"
-#include "llchiclet.h"
#include "llvoiceclient.h"
#include "lloutputmonitorctrl.h"
#include "llspeakers.h"
-class LLGestureComboBox
- : public LLComboBox
- , public LLGestureManagerObserver
+
+class LLGestureComboList
+ : public LLGestureManagerObserver
+ , public LLUICtrl
{
public:
- struct Params : public LLInitParam::Block<Params, LLComboBox::Params> { };
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<LLButton::Params> combo_button;
+ Optional<LLScrollListCtrl::Params> combo_list;
+
+ Params();
+ };
+
protected:
- LLGestureComboBox(const Params&);
+
friend class LLUICtrlFactory;
+ LLGestureComboList(const Params&);
+ std::vector<LLMultiGesture*> mGestures;
+ std::string mLabel;
+ LLSD::Integer mViewAllItemIndex;
+
public:
- ~LLGestureComboBox();
+ ~LLGestureComboList();
+
+ LLCtrlListInterface* getListInterface() { return (LLCtrlListInterface*)mList; };
+ virtual void showList();
+ virtual void hideList();
+ virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+
+ S32 getCurrentIndex() const;
+ void onItemSelected(const LLSD& data);
+ void sortByName(bool ascending = true);
void refreshGestures();
void onCommitGesture();
- virtual void draw();
+ void onButtonCommit();
+ virtual LLSD getValue() const;
// LLGestureManagerObserver trigger
virtual void changed() { refreshGestures(); }
-protected:
-
- virtual void showList();
+private:
- LLFrameTimer mGestureLabelTimer;
- std::vector<LLMultiGesture*> mGestures;
- std::string mLabel;
- LLSD::Integer mViewAllItemIndex;
+ LLButton* mButton;
+ LLScrollListCtrl* mList;
+ S32 mLastSelectedIndex;
};
class LLNearbyChatBar
: public LLPanel
-, public LLVoiceClientStatusObserver
{
public:
// constructor for inline chat-bars (e.g. hosted in chat history window)
@@ -93,7 +111,6 @@ public:
std::string getCurrentChat();
virtual BOOL handleKeyHere( KEY key, MASK mask );
- void setPTTState(bool state);
static void startChat(const char* line);
static void stopChat();
@@ -103,11 +120,6 @@ public:
S32 getMinWidth() const;
S32 getMaxWidth() const;
- /**
- * Implements LLVoiceClientStatusObserver::onChange()
- */
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
@@ -125,9 +137,8 @@ protected:
static S32 sLastSpecialChatChannel;
LLLineEditor* mChatBox;
- LLTalkButton* mTalkBtn;
LLOutputMonitorCtrl* mOutputMonitor;
- LLActiveSpeakerMgr mSpeakerMgr;
+ LLLocalSpeakerMgr* mSpeakerMgr;
};
#endif
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 6b0d6d61e0..3c390c0281 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -52,8 +52,6 @@ using namespace LLNotificationsUI;
LLToastPanelBase* createToastPanel()
{
LLNearbyChatToastPanel* item = LLNearbyChatToastPanel::createInstance();
- static S32 chat_item_width = 304;
- item->setWidth(chat_item_width);
return item;
}
@@ -63,8 +61,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
public:
LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;};
- void init (S32 channel_left, S32 channel_right);
-
void addNotification (LLSD& notification);
void arrangeToasts ();
void showToastsBottom ();
@@ -120,15 +116,6 @@ protected:
bool mStopProcessing;
};
-void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right)
-{
- S32 channel_top = gViewerWindow->getWorldViewRect().getHeight();
- S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom;
- setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
- setVisible(TRUE);
-}
-
-
void LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
{
//we don't need overflow toast in nearby chat
@@ -162,6 +149,8 @@ bool LLNearbyChatScreenChannel::createPoolToast()
LLToast::Params p;
p.panel = panel;
+ p.lifetime_secs = gSavedSettings.getS32("NearbyToastLifeTime");
+ p.fading_time_secs = gSavedSettings.getS32("NearbyToastFadingTime");
LLToast* toast = new LLToast(p);
@@ -178,6 +167,29 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
//look in pool. if there is any message
if(mStopProcessing)
return;
+
+ /*
+ find last toast and check ID
+ */
+
+ if(m_active_toasts.size())
+ {
+ LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id
+ LLToast* toast = m_active_toasts[0];
+ LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel());
+
+ if(panel && panel->messageID() == fromID && panel->canAddText())
+ {
+ panel->addMessage(notification);
+ toast->reshapeToPanel();
+ toast->resetTimer();
+
+ arrangeToasts();
+ return;
+ }
+ }
+
+
if(m_toast_pool.empty())
{
@@ -221,7 +233,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
void LLNearbyChatScreenChannel::arrangeToasts()
{
- if(m_active_toasts.size() == 0 || mIsHovering)
+ if(m_active_toasts.size() == 0 || isHovering())
return;
hideToastsFromScreen();
@@ -260,9 +272,17 @@ void LLNearbyChatScreenChannel::showToastsBottom()
toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight());
toast->setRect(toast_rect);
-
+ toast->setIsHidden(false);
toast->setVisible(TRUE);
- bottom = toast->getRect().mTop;
+
+ if(!toast->hasFocus())
+ {
+ // Fixing Z-order of toasts (EXT-4862)
+ // Next toast will be positioned under this one.
+ gFloaterView->sendChildToBack(toast);
+ }
+
+ bottom = toast->getRect().mTop - toast->getTopPad();
}
}
}
@@ -289,7 +309,6 @@ LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& i
channel->setCreatePanelCallback(callback);
mChannel = LLChannelManager::getInstance()->addChannel(channel);
- mChannel->setOverflowFormatString("You have %d unread nearby chat messages");
}
LLNearbyChatHandler::~LLNearbyChatHandler()
@@ -305,7 +324,9 @@ void LLNearbyChatHandler::initChannel()
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
+
+
+void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
{
if(chat_msg.mMuted == TRUE)
return;
@@ -314,18 +335,48 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
if(chat_msg.mText.empty())
return;//don't process empty messages
-
+
+ LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
+
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- nearby_chat->addMessage(chat_msg);
- if(nearby_chat->getVisible())
- return;//no need in toast if chat is visible
-
+ {
+ //sometimes its usefull to have no name at all...
+ //if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null)
+ // tmp_chat.mFromName = tmp_chat.mFromID.asString();
+ }
+ nearby_chat->addMessage(chat_msg, true, args);
+ if( nearby_chat->getVisible()
+ || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
+ && gSavedSettings.getBOOL("UseChatBubbles") ) )
+ return;//no need in toast if chat is visible or if bubble chat is enabled
+
+ // Handle irc styled messages for toast panel
+ if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
+ {
+ if(!tmp_chat.mFromName.empty())
+ tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3);
+ else
+ tmp_chat.mText = tmp_chat.mText.substr(3);
+ }
+
// arrange a channel on a screen
if(!mChannel->getVisible())
{
initChannel();
}
+ /*
+ //comment all this due to EXT-4432
+ ..may clean up after some time...
+
+ //only messages from AGENTS
+ if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType)
+ {
+ if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG)
+ return;//ok for now we don't skip messeges from object, so skip only debug messages
+ }
+ */
+
LLUUID id;
id.generate();
@@ -342,7 +393,15 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
notification["time"] = chat_msg.mTime;
notification["source"] = (S32)chat_msg.mSourceType;
notification["chat_type"] = (S32)chat_msg.mChatType;
-
+ notification["chat_style"] = (S32)chat_msg.mChatStyle;
+
+ std::string r_color_name = "White";
+ F32 r_color_alpha = 1.0f;
+ LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+
+ notification["text_color"] = r_color_name;
+ notification["color_alpha"] = r_color_alpha;
+ notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
channel->addNotification(notification);
}
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llnearbychathandler.h
index fb2abac6a4..01a6de5610 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llnearbychathandler.h
@@ -45,7 +45,7 @@ public:
virtual ~LLNearbyChatHandler();
- virtual void processChat(const LLChat& chat_msg);
+ virtual void processChat(const LLChat& chat_msg, const LLSD &args);
protected:
virtual void onDeleteToast(LLToast* toast);
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index b6b433c28f..234fe13217 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -65,9 +65,15 @@
static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map");
+const F32 LLNetMap::MAP_SCALE_MIN = 32;
+const F32 LLNetMap::MAP_SCALE_MID = 1024;
+const F32 LLNetMap::MAP_SCALE_MAX = 4096;
+
const F32 MAP_SCALE_INCREMENT = 16;
-const F32 MAP_MIN_PICK_DIST = 4;
-const F32 MAX_PRIM_RADIUS = 256.0f; // Don't try to draw giant mega-prims on the mini map
+const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of scroll wheel (4%)
+const F32 MIN_DOT_RADIUS = 3.5f;
+const F32 DOT_SCALE = 0.75f;
+const F32 MIN_PICK_SCALE = 2.f;
LLNetMap::LLNetMap (const Params & p)
: LLUICtrl (p),
@@ -86,9 +92,9 @@ LLNetMap::LLNetMap (const Params & p)
mObjectImagep(),
mClosestAgentToCursor(),
mClosestAgentAtLastRightClick(),
- mRotateMap(FALSE),
mToolTipMsg()
{
+ mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
}
LLNetMap::~LLNetMap()
@@ -101,17 +107,18 @@ void LLNetMap::setScale( F32 scale )
if (mObjectImagep.notNull())
{
- F32 half_width = (F32)(getRect().getWidth() / 2);
- F32 half_height = (F32)(getRect().getHeight() / 2);
- F32 radius = sqrt( half_width * half_width + half_height * half_height );
- F32 region_widths = (2.f*radius)/mScale;
+ F32 width = (F32)(getRect().getWidth());
+ F32 height = (F32)(getRect().getHeight());
+ F32 diameter = sqrt(width * width + height * height);
+ F32 region_widths = diameter / mScale;
F32 meters = region_widths * LLWorld::getInstance()->getRegionWidthInMeters();
F32 num_pixels = (F32)mObjectImagep->getWidth();
- mObjectMapTPM = num_pixels/meters;
- mObjectMapPixels = 2.f*radius;
+ mObjectMapTPM = num_pixels / meters;
+ mObjectMapPixels = diameter;
}
mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
+ mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
mUpdateNow = TRUE;
}
@@ -147,11 +154,9 @@ void LLNetMap::draw()
F32 rotation = 0;
{
- LLGLEnable scissor(GL_SCISSOR_TEST);
-
+ LLLocalClipRect clip(getLocalRect());
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLLocalClipRect clip(getLocalRect());
glMatrixMode(GL_MODELVIEW);
@@ -169,7 +174,8 @@ void LLNetMap::draw()
gGL.translatef( (F32) center_sw_left, (F32) center_sw_bottom, 0.f);
- if( mRotateMap )
+ static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+ if( rotate_map )
{
// rotate subsequent draws to agent rotation
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
@@ -302,6 +308,7 @@ void LLNetMap::draw()
LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
mClosestAgentToCursor.setNull();
F32 closest_dist = F32_MAX;
+ F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE;
// Draw avatars
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
@@ -345,10 +352,10 @@ void LLNetMap::draw()
LLWorldMapView::drawAvatar(
pos_map.mV[VX], pos_map.mV[VY],
show_as_friend ? map_avatar_friend_color : map_avatar_color,
- pos_map.mV[VZ]);
+ pos_map.mV[VZ], mDotRadius);
F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y));
- if(dist_to_cursor < MAP_MIN_PICK_DIST && dist_to_cursor < closest_dist)
+ if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
{
closest_dist = dist_to_cursor;
mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i);
@@ -378,10 +385,12 @@ void LLNetMap::draw()
// Draw dot for self avatar position
pos_global = gAgent.getPositionGlobal();
pos_map = globalPosToView(pos_global);
- LLUIImagePtr you = LLWorldMapView::sAvatarYouSmallImage;
- you->draw(
- llround(pos_map.mV[VX]) - you->getWidth()/2,
- llround(pos_map.mV[VY]) - you->getHeight()/2);
+ LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
+ S32 dot_width = llround(mDotRadius * 2.f);
+ you->draw(llround(pos_map.mV[VX] - mDotRadius),
+ llround(pos_map.mV[VY] - mDotRadius),
+ dot_width,
+ dot_width);
// Draw frustum
F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters();
@@ -399,7 +408,7 @@ void LLNetMap::draw()
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if( mRotateMap )
+ if( rotate_map )
{
gGL.color4fv((map_frustum_color()).mV);
@@ -429,6 +438,12 @@ void LLNetMap::draw()
LLUICtrl::draw();
}
+void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLUICtrl::reshape(width, height, called_from_parent);
+ createObjectImage();
+}
+
LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
{
LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal();
@@ -439,7 +454,8 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
pos_local.mV[VY] *= mPixelsPerMeter;
// leave Z component in meters
- if( mRotateMap )
+ static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+ if( rotate_map )
{
F32 radians = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f));
@@ -487,7 +503,8 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
F32 radians = - atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
- if( mRotateMap )
+ static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+ if( rotate_map )
{
LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f));
pos_local.rotVec( rot );
@@ -504,8 +521,12 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- // note that clicks are reversed from what you'd think
- setScale(llclamp(mScale - clicks*MAP_SCALE_INCREMENT, MAP_SCALE_MIN, MAP_SCALE_MAX));
+ // note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in
+ F32 scale = mScale;
+
+ scale *= pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
+ setScale(llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX));
+
return TRUE;
}
@@ -567,9 +588,7 @@ void LLNetMap::renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &
LLVector3 local_pos;
local_pos.setVec( pos - mObjectImageCenterGlobal );
- F32 radius_clamped = llmin(radius_meters, MAX_PRIM_RADIUS);
-
- S32 diameter_pixels = llround(2 * radius_clamped * mObjectMapTPM);
+ S32 diameter_pixels = llround(2 * radius_meters * mObjectMapTPM);
renderPoint( local_pos, color, diameter_pixels );
}
@@ -662,13 +681,13 @@ void LLNetMap::renderPoint(const LLVector3 &pos_local, const LLColor4U &color,
void LLNetMap::createObjectImage()
{
// Find the size of the side of a square that surrounds the circle that surrounds getRect().
- F32 half_width = (F32)(getRect().getWidth() / 2);
- F32 half_height = (F32)(getRect().getHeight() / 2);
- F32 radius = sqrt( half_width * half_width + half_height * half_height );
- S32 square_size = S32( 2 * radius );
+ // ... which is, the diagonal of the rect.
+ F32 width = (F32)getRect().getWidth();
+ F32 height = (F32)getRect().getHeight();
+ S32 square_size = llround( sqrt(width*width + height*height) );
// Find the least power of two >= the minimum size.
- const S32 MIN_SIZE = 32;
+ const S32 MIN_SIZE = 64;
const S32 MAX_SIZE = 256;
S32 img_size = MIN_SIZE;
while( (img_size*2 < square_size ) && (img_size < MAX_SIZE) )
@@ -684,7 +703,7 @@ void LLNetMap::createObjectImage()
U8* data = mObjectRawImagep->getData();
memset( data, 0, img_size * img_size * 4 );
mObjectImagep = LLViewerTextureManager::getLocalTexture( mObjectRawImagep.get(), FALSE);
- setScale(mScale);
}
+ setScale(mScale);
mUpdateNow = TRUE;
}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index 5ebdd13384..3d7f3233ac 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -70,14 +70,17 @@ protected:
public:
virtual ~LLNetMap();
+ static const F32 MAP_SCALE_MIN;
+ static const F32 MAP_SCALE_MID;
+ static const F32 MAP_SCALE_MAX;
+
/*virtual*/ void draw();
/*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask);
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void setScale( F32 scale );
- void setRotateMap( BOOL b ) { mRotateMap = b; }
void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
- BOOL getRotateMap( ) { return mRotateMap; }
void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
private:
@@ -94,16 +97,17 @@ private:
void drawTracking( const LLVector3d& pos_global,
const LLColor4& color,
BOOL draw_arrow = TRUE);
-
- void createObjectImage();
+ void createObjectImage();
+
private:
LLUIColor mBackgroundColor;
F32 mScale; // Size of a region in pixels
F32 mPixelsPerMeter; // world meters to map pixels
F32 mObjectMapTPM; // texels per meter on map
- F32 mObjectMapPixels; // Width of object map in pixels;
+ F32 mObjectMapPixels; // Width of object map in pixels
+ F32 mDotRadius; // Size of avatar markers
F32 mTargetPanX;
F32 mTargetPanY;
F32 mCurPanX;
@@ -116,7 +120,6 @@ private:
LLUUID mClosestAgentToCursor;
LLUUID mClosestAgentAtLastRightClick;
- BOOL mRotateMap;
std::string mToolTipMsg;
};
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 1be03cef0b..60e41b64ac 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -34,6 +34,9 @@
#include "llviewerprecompiledheaders.h" // must be first include
#include "llnotificationhandler.h"
+
+#include "llnotifications.h"
+#include "llprogressview.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -66,7 +69,7 @@ LLAlertHandler::~LLAlertHandler()
//--------------------------------------------------------------------------
void LLAlertHandler::initChannel()
{
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().getWidth() / 2;
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
mChannel->init(channel_right_bound, channel_right_bound);
}
@@ -91,6 +94,19 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
if (notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "load")
{
+ if (LLHandlerUtil::canSpawnSessionAndLogToIM(notification))
+ {
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ // firstly create session...
+ LLHandlerUtil::spawnIMSession(name, from_id);
+
+ // ...then log message to have IM Well notified about new message
+ LLHandlerUtil::logToIMP2P(notification);
+ }
+
LLToastAlertPanel* alert_dialog = new LLToastAlertPanel(notification, mIsModal);
LLToast::Params p;
p.notif_id = notification->getID();
@@ -101,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
p.is_modal = mIsModal;
p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1);
+ // Show alert in middle of progress view (during teleport) (EXT-1093)
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
+ mChannel->updatePositionAndSize(rc, rc);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index ffa92b543c..6889931956 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -37,6 +37,8 @@
#include "llgroupactions.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
+#include "llnotificationmanager.h"
+#include "llnotifications.h"
using namespace LLNotificationsUI;
@@ -47,6 +49,9 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
// Getting a Channel for our notifications
mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));
}
//--------------------------------------------------------------------------
@@ -57,7 +62,7 @@ LLGroupHandler::~LLGroupHandler()
//--------------------------------------------------------------------------
void LLGroupHandler::initChannel()
{
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
@@ -83,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
+ LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+
LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
LLToast::Params p;
p.notif_id = notification->getID();
@@ -118,5 +125,15 @@ void LLGroupHandler::onDeleteToast(LLToast* toast)
}
//--------------------------------------------------------------------------
+void LLGroupHandler::onRejectToast(LLUUID& id)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(id);
+ if (notification && LLNotificationManager::getInstance()->getHandlerForNotification(notification->getType()) == this)
+ {
+ LLNotifications::instance().cancel(notification);
+ }
+}
+
+//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index cd4e640ec4..0d5c431d75 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -36,9 +36,11 @@
#include "llwindow.h"
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
#include "llchannelmanager.h"
#include "llchat.h"
+#include "llinstantmessage.h"
+#include "llnotificationptr.h"
namespace LLNotificationsUI
{
@@ -53,7 +55,8 @@ typedef enum e_notification_type
NT_GROUPCHAT,
NT_NEARBYCHAT,
NT_ALERT,
- NT_ALERTMODAL
+ NT_ALERTMODAL,
+ NT_OFFER
} ENotificationType;
/**
@@ -132,7 +135,7 @@ class LLChatHandler : public LLEventHandler
public:
virtual ~LLChatHandler() {};
- virtual void processChat(const LLChat& chat_msg)=0;
+ virtual void processChat(const LLChat& chat_msg, const LLSD &args)=0;
};
/**
@@ -208,6 +211,9 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
+
+ // own handlers
+ void onRejectToast(LLUUID& id);
};
/**
@@ -231,6 +237,105 @@ protected:
bool mIsModal;
};
+/**
+ * Handler for offers notices.
+ * It manages life time of offer notices.
+ */
+class LLOfferHandler : public LLSysHandler
+{
+public:
+ LLOfferHandler(e_notification_type type, const LLSD& id);
+ virtual ~LLOfferHandler();
+
+ // base interface functions
+ virtual bool processNotification(const LLSD& notify);
+
+protected:
+ virtual void onDeleteToast(LLToast* toast);
+ virtual void initChannel();
+
+ // own handlers
+ void onRejectToast(LLUUID& id);
+};
+
+class LLHandlerUtil
+{
+public:
+ /**
+ * Checks sufficient conditions to log notification message to IM session.
+ */
+ static bool canLogToIM(const LLNotificationPtr& notification);
+
+ /**
+ * Checks sufficient conditions to log notification message to nearby chat session.
+ */
+ static bool canLogToNearbyChat(const LLNotificationPtr& notification);
+
+ /**
+ * Checks sufficient conditions to spawn IM session.
+ */
+ static bool canSpawnIMSession(const LLNotificationPtr& notification);
+
+ /**
+ * Checks sufficient conditions to add notification toast panel IM floater.
+ */
+ static bool canAddNotifPanelToIM(const LLNotificationPtr& notification);
+
+ /**
+ * Checks if passed notification can create IM session and be written into it.
+ *
+ * This method uses canLogToIM() & canSpawnIMSession().
+ */
+ static bool canSpawnSessionAndLogToIM(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to IM session.
+ */
+ static void logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id);
+
+ /**
+ * Writes notification message to IM p2p session.
+ */
+ static void logToIMP2P(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to IM p2p session.
+ */
+ static void logToIMP2P(const LLNotificationPtr& notification, bool to_file_only);
+
+ /**
+ * Writes group notice notification message to IM group session.
+ */
+ static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to nearby chat.
+ */
+ static void logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type);
+
+ /**
+ * Spawns IM session.
+ */
+ static LLUUID spawnIMSession(const std::string& name, const LLUUID& from_id);
+
+ /**
+ * Returns name from the notification's substitution.
+ *
+ * Methods gets "NAME" or "[NAME]" from the substitution map.
+ *
+ * @param notification - Notification which substitution's name will be returned.
+ */
+ static std::string getSubstitutionName(const LLNotificationPtr& notification);
+
+ /**
+ * Adds notification panel to the IM floater.
+ */
+ static void addNotifPanelToIM(const LLNotificationPtr& notification);
+};
+
}
#endif
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
new file mode 100644
index 0000000000..9de9998cbd
--- /dev/null
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -0,0 +1,278 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Provides set of utility methods for notifications processing.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "llnotifications.h"
+#include "llimview.h"
+#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llnearbychat.h"
+#include "llimfloater.h"
+
+using namespace LLNotificationsUI;
+
+const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
+ REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
+ "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
+ "ObjectGiveItemUnknownUser"), PAYMENT_RECIVED("PaymentRecived"),
+ ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"),
+ USER_GIVE_ITEM("UserGiveItem"),
+ INVENTORY_ACCEPTED("InventoryAccepted"),
+ INVENTORY_DECLINED("InventoryDeclined"),
+ OFFER_FRIENDSHIP("OfferFriendship"),
+ FRIENDSHIP_ACCEPTED("FriendshipAccepted"),
+ FRIENDSHIP_OFFERED("FriendshipOffered"),
+ FRIENDSHIP_ACCEPTED_BYME("FriendshipAcceptedByMe"),
+ FRIENDSHIP_DECLINED_BYME("FriendshipDeclinedByMe"),
+ FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
+ SERVER_OBJECT_MESSAGE("ServerObjectMessage"),
+ TELEPORT_OFFERED("TeleportOffered");
+
+// static
+bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
+{
+ return GRANTED_MODIFY_RIGHTS == notification->getName()
+ || REVOKED_MODIFY_RIGHTS == notification->getName()
+ || PAYMENT_RECIVED == notification->getName()
+ || OFFER_FRIENDSHIP == notification->getName()
+ || FRIENDSHIP_OFFERED == notification->getName()
+ || FRIENDSHIP_ACCEPTED_BYME == notification->getName()
+ || FRIENDSHIP_DECLINED_BYME == notification->getName()
+ || SERVER_OBJECT_MESSAGE == notification->getName()
+ || INVENTORY_ACCEPTED == notification->getName()
+ || INVENTORY_DECLINED == notification->getName();
+}
+
+// static
+bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
+{
+ return notification->getType() == "notifytip"
+ && FRIEND_ONLINE != notification->getName()
+ && FRIEND_OFFLINE != notification->getName()
+ && INVENTORY_ACCEPTED != notification->getName()
+ && INVENTORY_DECLINED != notification->getName();
+}
+
+// static
+bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)
+{
+ return OFFER_FRIENDSHIP == notification->getName()
+ || FRIENDSHIP_ACCEPTED == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || INVENTORY_ACCEPTED == notification->getName()
+ || INVENTORY_DECLINED == notification->getName();
+}
+
+// static
+bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)
+{
+ return OFFER_FRIENDSHIP == notification->getName()
+ || USER_GIVE_ITEM == notification->getName();
+}
+
+
+// static
+bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification)
+{
+ return canLogToIM(notification) && canSpawnIMSession(notification);
+}
+
+// static
+void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id)
+{
+ LLUUID session_id = LLIMMgr::computeSessionID(session_type,
+ session_owner_id);
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+ session_id);
+ if (session == NULL)
+ {
+ LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+ }
+ else
+ {
+ // store active session id
+ const LLUUID & active_session_id =
+ LLIMModel::instance().getActiveSessionID();
+
+ // set searched session as active to avoid IM toast popup
+ LLIMModel::instance().setActiveSessionID(session_id);
+
+ LLIMModel::instance().addMessage(session_id, from_name, from_id,
+ message);
+
+ // restore active session id
+ if (active_session_id.isNull())
+ {
+ LLIMModel::instance().resetActiveSessionID();
+ }
+ else
+ {
+ LLIMModel::instance().setActiveSessionID(active_session_id);
+ }
+ }
+}
+
+// static
+void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)
+{
+ logToIMP2P(notification, false);
+}
+
+// static
+void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_file_only)
+{
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+
+ std::string session_name = notification->getPayload().has(
+ "SESSION_NAME") ? notification->getPayload()["SESSION_NAME"].asString() : name;
+
+ // don't create IM p2p session with objects, it's necessary condition to log
+ if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
+ != OBJECT_GIVE_ITEM_UNKNOWN_USER)
+ {
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ //*HACK for ServerObjectMessage the sesson name is really weird, see EXT-4779
+ if (SERVER_OBJECT_MESSAGE == notification->getName())
+ {
+ session_name = "chat";
+ }
+
+ //there still appears a log history file with weird name " .txt"
+ if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name)
+ {
+ llwarning("Weird session name (" + session_name + ") for notification " + notification->getName(), 666)
+ }
+
+ if(to_file_only)
+ {
+ logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(),
+ LLUUID(), LLUUID());
+ }
+ else
+ {
+ logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(),
+ from_id, from_id);
+ }
+ }
+}
+
+// static
+void LLHandlerUtil::logGroupNoticeToIMGroup(
+ const LLNotificationPtr& notification)
+{
+
+ const LLSD& payload = notification->getPayload();
+ LLGroupData groupData;
+ if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
+ {
+ llwarns
+ << "Group notice for unkown group: "
+ << payload["group_id"].asUUID() << llendl;
+ return;
+ }
+
+ const std::string group_name = groupData.mName;
+ const std::string sender_name = payload["sender_name"].asString();
+
+ // we can't retrieve sender id from group notice system message, so try to lookup it from cache
+ LLUUID sender_id;
+ gCacheName->getUUID(sender_name, sender_id);
+
+ logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"],
+ payload["group_id"], sender_id);
+}
+
+// static
+void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
+{
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ LLChat chat_msg(notification->getMessage());
+ chat_msg.mSourceType = type;
+ chat_msg.mFromName = SYSTEM_FROM;
+ nearby_chat->addMessage(chat_msg);
+ }
+}
+
+// static
+LLUUID LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from_id)
+{
+ LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
+
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+ session_id);
+ if (session == NULL)
+ {
+ session_id = LLIMMgr::instance().addSession(name, IM_NOTHING_SPECIAL, from_id);
+ }
+
+ return session_id;
+}
+
+// static
+std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notification)
+{
+ return notification->getSubstitutions().has("NAME")
+ ? notification->getSubstitutions()["NAME"]
+ : notification->getSubstitutions()["[NAME]"];
+}
+
+// static
+void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
+{
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ LLUUID session_id = spawnIMSession(name, from_id);
+ // add offer to session
+ LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(
+ session_id);
+ llassert_always(session != NULL);
+
+ LLSD offer;
+ offer["notification_id"] = notification->getID();
+ offer["from_id"] = notification->getPayload()["from_id"];
+ offer["from"] = name;
+ offer["time"] = LLLogChat::timestamp(true);
+ offer["index"] = (LLSD::Integer)session->mMsgs.size();
+ session->mMsgs.push_front(offer);
+
+ LLIMFloater::show(session_id);
+}
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index 81a6b32917..4401bb953f 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -36,9 +36,11 @@
#include "llnotificationmanager.h"
+
#include "llnearbychathandler.h"
+#include "llnotifications.h"
-#include "boost/bind.hpp"
+#include <boost/bind.hpp>
using namespace LLNotificationsUI;
@@ -63,6 +65,7 @@ void LLNotificationManager::init()
LLNotificationChannel::buildChannel("Alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytoast"));
+ LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer"));
LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
@@ -70,6 +73,7 @@ void LLNotificationManager::init()
LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));
mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD()));
@@ -80,6 +84,7 @@ void LLNotificationManager::init()
mNotifyHandlers["notifytoast"] = boost::shared_ptr<LLEventHandler>(new LLIMHandler(NT_IMCHAT, LLSD()));
mNotifyHandlers["nearbychat"] = boost::shared_ptr<LLEventHandler>(new LLNearbyChatHandler(NT_NEARBYCHAT, LLSD()));
+ mNotifyHandlers["offer"] = boost::shared_ptr<LLEventHandler>(new LLOfferHandler(NT_OFFER, LLSD()));
}
//--------------------------------------------------------------------------
@@ -102,16 +107,17 @@ bool LLNotificationManager::onNotification(const LLSD& notify)
}
//--------------------------------------------------------------------------
-void LLNotificationManager::onChat(const LLChat& msg,ENotificationType type)
+void LLNotificationManager::onChat(const LLChat& msg, const LLSD &args)
{
- switch(type)
+ // check ENotificationType argument
+ switch(args["type"].asInteger())
{
case NT_NEARBYCHAT:
{
LLNearbyChatHandler* handle = dynamic_cast<LLNearbyChatHandler*>(mNotifyHandlers["nearbychat"].get());
if(handle)
- handle->processChat(msg);
+ handle->processChat(msg, args);
}
break;
default: //no need to handle all enum types
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index 072fc6f24c..575aa69c4d 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -66,7 +66,7 @@ public:
bool onNotification(const LLSD& notification);
// this method reacts on chat notifications and calls an appropriate handler
- void onChat(const LLChat& msg,ENotificationType type);
+ void onChat(const LLChat& msg, const LLSD &args);
// get a handler for a certain type of notification
LLEventHandler* getHandlerForNotification(std::string notification_type);
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
new file mode 100644
index 0000000000..8ebd5de258
--- /dev/null
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -0,0 +1,188 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Notification Handler Class for Simple Notifications and Notification Tips
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "lltoastnotifypanel.h"
+#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "llnotificationmanager.h"
+#include "llnotifications.h"
+#include "llscriptfloater.h"
+#include "llimview.h"
+#include "llnotificationsutil.h"
+
+using namespace LLNotificationsUI;
+
+//--------------------------------------------------------------------------
+LLOfferHandler::LLOfferHandler(e_notification_type type, const LLSD& id)
+{
+ mType = type;
+
+ // Getting a Channel for our notifications
+ mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+ mChannel->setControlHovering(true);
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ channel->setOnRejectToastCallback(boost::bind(&LLOfferHandler::onRejectToast, this, _1));
+}
+
+//--------------------------------------------------------------------------
+LLOfferHandler::~LLOfferHandler()
+{
+}
+
+//--------------------------------------------------------------------------
+void LLOfferHandler::initChannel()
+{
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
+ mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+}
+
+//--------------------------------------------------------------------------
+bool LLOfferHandler::processNotification(const LLSD& notify)
+{
+ if(!mChannel)
+ {
+ return false;
+ }
+
+ LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
+
+ if(!notification)
+ return false;
+
+ // arrange a channel on a screen
+ if(!mChannel->getVisible())
+ {
+ initChannel();
+ }
+
+ if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
+ {
+
+
+ if( notification->getPayload().has("give_inventory_notification")
+ && !notification->getPayload()["give_inventory_notification"] )
+ {
+ // This is an original inventory offer, so add a script floater
+ LLScriptFloaterManager::instance().onAddNotification(notification->getID());
+ }
+ else
+ {
+ LLUUID session_id;
+ if (LLHandlerUtil::canSpawnIMSession(notification))
+ {
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ session_id = LLHandlerUtil::spawnIMSession(name, from_id);
+ }
+
+ if (LLHandlerUtil::canAddNotifPanelToIM(notification))
+ {
+ LLHandlerUtil::addNotifPanelToIM(notification);
+ LLHandlerUtil::logToIMP2P(notification, true);
+ }
+ else if (notification->getPayload().has("SUPPRESS_TOAST")
+ && notification->getPayload()["SUPPRESS_TOAST"])
+ {
+ LLHandlerUtil::logToIMP2P(notification);
+ LLNotificationsUtil::cancel(notification);
+ }
+ else
+ {
+ LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.panel = notify_box;
+ p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1);
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ channel->addToast(p);
+
+ LLHandlerUtil::logToIMP2P(notification);
+
+ // send a signal to the counter manager
+ mNewNotificationSignal();
+ }
+ }
+ }
+ else if (notify["sigtype"].asString() == "delete")
+ {
+ if( notification->getPayload().has("give_inventory_notification")
+ && !notification->getPayload()["give_inventory_notification"] )
+ {
+ // Remove original inventory offer script floater
+ LLScriptFloaterManager::instance().onRemoveNotification(notification->getID());
+ }
+ else
+ {
+ mChannel->killToastByNotificationID(notification->getID());
+ }
+ }
+
+ return true;
+}
+
+//--------------------------------------------------------------------------
+
+void LLOfferHandler::onDeleteToast(LLToast* toast)
+{
+ // send a signal to the counter manager
+ mDelNotificationSignal();
+
+ // send a signal to a listener to let him perform some action
+ // in this case listener is a SysWellWindow and it will remove a corresponding item from its list
+ mNotificationIDSignal(toast->getNotificationID());
+}
+
+//--------------------------------------------------------------------------
+void LLOfferHandler::onRejectToast(LLUUID& id)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(id);
+
+ if (notification
+ && LLNotificationManager::getInstance()->getHandlerForNotification(
+ notification->getType()) == this)
+ {
+ LLNotifications::instance().cancel(notification);
+ }
+}
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 070af432d6..c7261199e3 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -37,9 +37,16 @@
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
+#include "llnotificationmanager.h"
+#include "llnotifications.h"
+#include "llscriptfloater.h"
using namespace LLNotificationsUI;
+static const std::string SCRIPT_DIALOG ("ScriptDialog");
+static const std::string SCRIPT_DIALOG_GROUP ("ScriptDialogGroup");
+static const std::string SCRIPT_LOAD_URL ("LoadWebPage");
+
//--------------------------------------------------------------------------
LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
{
@@ -63,7 +70,7 @@ LLScriptHandler::~LLScriptHandler()
//--------------------------------------------------------------------------
void LLScriptHandler::initChannel()
{
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
@@ -89,25 +96,45 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
-
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.notification = notification;
- p.panel = notify_box;
- p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
- if(channel)
- channel->addToast(p);
-
- // send a signal to the counter manager
- mNewNotificationSignal();
-
+ if (LLHandlerUtil::canLogToIM(notification))
+ {
+ LLHandlerUtil::logToIMP2P(notification);
+ }
+
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
+ {
+ LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+ }
+ else
+ {
+ LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.panel = notify_box;
+ p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ {
+ channel->addToast(p);
+ }
+
+ // send a signal to the counter manager
+ mNewNotificationSignal();
+ }
}
else if (notify["sigtype"].asString() == "delete")
{
- mChannel->killToastByNotificationID(notification->getID());
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+ }
+ else
+ {
+ mChannel->killToastByNotificationID(notification->getID());
+ }
}
return true;
}
@@ -122,6 +149,14 @@ void LLScriptHandler::onDeleteToast(LLToast* toast)
// send a signal to a listener to let him perform some action
// in this case listener is a SysWellWindow and it will remove a corresponding item from its list
mNotificationIDSignal(toast->getNotificationID());
+
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
+
+ if( notification &&
+ (SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) )
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+ }
}
//--------------------------------------------------------------------------
@@ -129,7 +164,9 @@ void LLScriptHandler::onRejectToast(LLUUID& id)
{
LLNotificationPtr notification = LLNotifications::instance().find(id);
- if(notification)
+ if (notification
+ && LLNotificationManager::getInstance()->getHandlerForNotification(
+ notification->getType()) == this)
{
LLNotifications::instance().cancel(notification);
}
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 543198c1d2..be76959d07 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -36,12 +36,44 @@
#include "llfloaterreg.h"
#include "llnearbychat.h"
#include "llnotificationhandler.h"
+#include "llnotifications.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
using namespace LLNotificationsUI;
+class LLOnlineStatusToast : public LLToastPanel
+{
+public:
+
+ struct Params
+ {
+ LLNotificationPtr notification;
+ LLUUID avatar_id;
+ std::string message;
+
+ Params() {}
+ };
+
+ LLOnlineStatusToast(Params& p) : LLToastPanel(p.notification)
+ {
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status_toast.xml");
+
+ childSetValue("avatar_icon", p.avatar_id);
+ childSetValue("message", p.message);
+
+ if (p.notification->getPayload().has("respond_on_mousedown")
+ && p.notification->getPayload()["respond_on_mousedown"] )
+ {
+ setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification,
+ p.notification->getResponseTemplate()));
+ }
+
+ // set line max count to 2 in case of a very long name
+ snapToMessageHeight(getChild<LLTextBox>("message"), 2);
+ }
+};
//--------------------------------------------------------------------------
LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
@@ -60,7 +92,7 @@ LLTipHandler::~LLTipHandler()
//--------------------------------------------------------------------------
void LLTipHandler::initChannel()
{
- S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
@@ -87,20 +119,45 @@ bool LLTipHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
// archive message in nearby chat
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- if(nearby_chat)
+ if (LLHandlerUtil::canLogToNearbyChat(notification))
{
- LLChat chat_msg(notification->getMessage());
- nearby_chat->addMessage(chat_msg);
+ LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
// don't show toast if Nearby Chat is opened
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<
+ LLNearbyChat>("nearby_chat", LLSD());
if (nearby_chat->getVisible())
{
return true;
- }
+ }
+ }
+
+ const std::string name = notification->getSubstitutions()["NAME"];
+ LLUUID from_id = notification->getPayload()["from_id"];
+ if (LLHandlerUtil::canLogToIM(notification))
+ {
+ LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, name, name,
+ notification->getMessage(), from_id, from_id);
}
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+ if (LLHandlerUtil::canSpawnIMSession(notification))
+ {
+ LLHandlerUtil::spawnIMSession(name, from_id);
+ }
+
+ LLToastPanel* notify_box = NULL;
+ if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
+ {
+ LLOnlineStatusToast::Params p;
+ p.notification = notification;
+ p.message = notification->getMessage();
+ p.avatar_id = notification->getPayload()["FROM_ID"];
+ notify_box = new LLOnlineStatusToast(p);
+ }
+ else
+ {
+ notify_box = new LLToastNotifyPanel(notification);
+ }
LLToast::Params p;
p.notif_id = notification->getID();
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 8bac9937f0..9857e37bc3 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -64,10 +64,6 @@ LLOutputMonitorCtrl::Params::Params()
auto_update("auto_update"),
speaker_id("speaker_id")
{
- draw_border = true;
- name = "output_monitor";
- follows.flags(FOLLOWS_LEFT|FOLLOWS_TOP);
- mouse_opaque = false;
};
LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
@@ -80,7 +76,10 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
mImageLevel2(p.image_level_2),
mImageLevel3(p.image_level_3),
mAutoUpdate(p.auto_update),
- mSpeakerId(p.speaker_id)
+ mSpeakerId(p.speaker_id),
+ mIsAgentControl(false),
+ mIsSwitchDirty(false),
+ mShouldSwitchOn(false)
{
//static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange);
//static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red);
@@ -111,6 +110,7 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
LLOutputMonitorCtrl::~LLOutputMonitorCtrl()
{
LLMuteList::getInstance()->removeObserver(this);
+ LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
}
void LLOutputMonitorCtrl::setPower(F32 val)
@@ -120,6 +120,26 @@ void LLOutputMonitorCtrl::setPower(F32 val)
void LLOutputMonitorCtrl::draw()
{
+ // see also switchIndicator()
+ if (mIsSwitchDirty)
+ {
+ mIsSwitchDirty = false;
+ if (mShouldSwitchOn)
+ {
+ // just notify parent visibility may have changed
+ notifyParentVisibilityChanged();
+ }
+ else
+ {
+ // make itself invisible and notify parent about this
+ setVisible(FALSE);
+ notifyParentVisibilityChanged();
+
+ // no needs to render for invisible element
+ return;
+ }
+ }
+
// Copied from llmediaremotectrl.cpp
// *TODO: Give the LLOutputMonitorCtrl an agent-id to monitor, then
// call directly into gVoiceClient to ask if that agent-id is muted, is
@@ -132,7 +152,14 @@ void LLOutputMonitorCtrl::draw()
if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
{
setPower(gVoiceClient->getCurrentPower(mSpeakerId));
- setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+ if(mIsAgentControl)
+ {
+ setIsTalking(gVoiceClient->getUserPTTState());
+ }
+ else
+ {
+ setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+ }
}
LLPointer<LLUIImage> icon;
@@ -222,9 +249,21 @@ void LLOutputMonitorCtrl::draw()
void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
{
+ if (speaker_id.isNull() && mSpeakerId.notNull())
+ {
+ LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
+ }
+
if (speaker_id.isNull() || speaker_id == mSpeakerId) return;
+ if (mSpeakerId.notNull())
+ {
+ // Unregister previous registration to avoid crash. EXT-4782.
+ LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
+ }
+
mSpeakerId = speaker_id;
+ LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this);
//mute management
if (mAutoUpdate)
@@ -235,7 +274,8 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
}
else
{
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+ // check only blocking on voice. EXT-3542
+ setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
LLMuteList::getInstance()->addObserver(this);
}
}
@@ -243,5 +283,45 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
void LLOutputMonitorCtrl::onChange()
{
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+ // check only blocking on voice. EXT-3542
+ setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
+}
+
+// virtual
+void LLOutputMonitorCtrl::switchIndicator(bool switch_on)
+{
+ // ensure indicator is visible in case it is not in visible chain
+ // to be called when parent became visible next time to notify parent that visibility is changed.
+ setVisible(TRUE);
+
+ // if parent is in visible chain apply switch_on state and notify it immediately
+ if (getParent() && getParent()->isInVisibleChain())
+ {
+ LL_DEBUGS("SpeakingIndicator") << "Indicator is in visible chain, notifying parent: " << mSpeakerId << LL_ENDL;
+ setVisible((BOOL)switch_on);
+ notifyParentVisibilityChanged();
+ }
+
+ // otherwise remember necessary state and mark itself as dirty.
+ // State will be applied i next draw when parents chain became visible.
+ else
+ {
+ LL_DEBUGS("SpeakingIndicator") << "Indicator is not in visible chain, parent won't be notified: " << mSpeakerId << LL_ENDL;
+ mIsSwitchDirty = true;
+ mShouldSwitchOn = switch_on;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+void LLOutputMonitorCtrl::notifyParentVisibilityChanged()
+{
+ LL_DEBUGS("SpeakingIndicator") << "Notify parent that visibility was changed: " << mSpeakerId << " ,new_visibility: " << getVisible() << LL_ENDL;
+
+ LLSD params = LLSD().with("visibility_changed", getVisible());
+
+ notifyParent(params);
}
+
+// EOF
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 7a7b8bc3a1..2bbfa251e9 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -36,6 +36,7 @@
#include "v4color.h"
#include "llview.h"
#include "llmutelist.h"
+#include "llspeakingindicatormanager.h"
class LLTextBox;
class LLUICtrlFactory;
@@ -45,7 +46,7 @@ class LLUICtrlFactory;
//
class LLOutputMonitorCtrl
-: public LLView, LLMuteListObserver
+: public LLView, public LLSpeakingIndicator, LLMuteListObserver
{
public:
struct Params : public LLInitParam::Block<Params, LLView::Params>
@@ -81,6 +82,8 @@ public:
// For the current user, need to know the PTT state to show
// correct button image.
+ void setIsAgentControl(bool val) { mIsAgentControl = val; }
+
void setIsTalking(bool val) { mIsTalking = val; }
void setSpeakerId(const LLUUID& speaker_id);
@@ -88,7 +91,29 @@ public:
//called by mute list
virtual void onChange();
+ /**
+ * Implementation of LLSpeakingIndicator interface.
+ * Behavior is implemented via changing visibility.
+ *
+ * If instance is in visible chain now (all parents are visible) it changes visibility
+ * and notify parent about this.
+ *
+ * Otherwise it marks an instance as dirty and stores necessary visibility.
+ * It will be applied in next draw and parent will be notified.
+ */
+ virtual void switchIndicator(bool switch_on);
+
private:
+
+ /**
+ * Notifies parent about changed visibility.
+ *
+ * Passes LLSD with "visibility_changed" => <current visibility> value.
+ * For now it is processed by LLAvatarListItem to update (reshape) its children.
+ * Implemented fo complete EXT-3976
+ */
+ void notifyParentVisibilityChanged();
+
//static LLColor4 sColorMuted;
//static LLColor4 sColorNormal;
//static LLColor4 sColorOverdriven;
@@ -100,6 +125,7 @@ private:
F32 mPower;
+ bool mIsAgentControl;
bool mIsMuted;
bool mIsTalking;
LLPointer<LLUIImage> mImageMute;
@@ -114,6 +140,10 @@ private:
/** uuid of a speaker being monitored */
LLUUID mSpeakerId;
+
+ /** indicates if the instance is dirty and should notify parent */
+ bool mIsSwitchDirty;
+ bool mShouldSwitchOn;
};
#endif
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
index ea24638b6d..67e048885f 100644
--- a/indra/newview/lloverlaybar.cpp
+++ b/indra/newview/lloverlaybar.cpp
@@ -349,14 +349,8 @@ void LLOverlayBar::toggleMediaPlay(void*)
//static
void LLOverlayBar::toggleMusicPlay(void*)
{
- if (!gOverlayBar)
- {
- return;
- }
-
- if (gOverlayBar->mMusicState != PLAYING)
+ if (gAudiop->isInternetStreamPlaying() != 1)
{
- gOverlayBar->mMusicState = PLAYING; // desired state
if (gAudiop)
{
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
@@ -381,7 +375,6 @@ void LLOverlayBar::toggleMusicPlay(void*)
//}
else
{
- gOverlayBar->mMusicState = STOPPED; // desired state
if (gAudiop)
{
gAudiop->stopInternetStream();
diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h
index 8a9ba66ec0..c2f8dbd074 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -53,12 +53,8 @@ public:
bool isTabVisible(); // Check if parent TabContainer is visible.
- void setPanelAppearanceButtons(LLPanelAppearance* panel);
-
protected:
- LLButton* mWearBtn;
- LLButton* mEditBtn;
LLPanelAppearance* mParent;
};
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 6413d939f0..6b07409676 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -38,13 +38,21 @@
#include "llavatarconstants.h" // AVATAR_ONLINE
#include "llcallingcard.h"
#include "llcombobox.h"
+#include "lldateutil.h" // ageFromDate()
#include "llimview.h"
+#include "llnotificationsutil.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
+#include "lltoggleablemenu.h"
#include "lltooldraganddrop.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
#include "llweb.h"
+#include "llfloaterworldmap.h"
+#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
+#include "llvoiceclient.h"
+#include "llnamebox.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -118,7 +126,7 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target");
static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile");
-static LLRegisterPanelClassWrapper<LLPanelAvatarMeProfile> t_panel_me_profile("panel_me_profile");
+static LLRegisterPanelClassWrapper<LLPanelMyProfile> t_panel_my_profile("panel_my_profile");
static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes");
//-----------------------------------------------------------------------------
@@ -147,6 +155,8 @@ BOOL LLPanelAvatarNotes::postBuild()
childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);
childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);
childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL);
+ childSetCommitCallback("show_on_map_btn", (boost::bind(
+ &LLPanelAvatarNotes::onMapButtonClick, this)), NULL);
LLTextEditor* te = getChild<LLTextEditor>("notes_edit");
te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this));
@@ -155,6 +165,8 @@ BOOL LLPanelAvatarNotes::postBuild()
resetControls();
resetData();
+ gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this);
+
return TRUE;
}
@@ -170,6 +182,10 @@ void LLPanelAvatarNotes::onOpen(const LLSD& key)
void LLPanelAvatarNotes::fillRightsData()
{
+ childSetValue("status_check", FALSE);
+ childSetValue("map_check", FALSE);
+ childSetValue("objects_check", FALSE);
+
const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
// If true - we are viewing friend's profile, enable check boxes and set values.
if(relation)
@@ -180,10 +196,9 @@ void LLPanelAvatarNotes::fillRightsData()
childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE);
childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE);
- childSetEnabled("status_check",TRUE);
- childSetEnabled("map_check",TRUE);
- childSetEnabled("objects_check",TRUE);
}
+
+ enableCheckboxes(NULL != relation);
}
void LLPanelAvatarNotes::onCommitNotes()
@@ -192,8 +207,59 @@ void LLPanelAvatarNotes::onCommitNotes()
LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);
}
+void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
+ const LLSD& response, S32 rights)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
+ getAvatarId(), rights);
+ }
+ else
+ {
+ childSetValue("objects_check",
+ childGetValue("objects_check").asBoolean() ? FALSE : TRUE);
+ }
+}
+
+void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
+{
+ std::string first, last;
+ LLSD args;
+ if (gCacheName->getName(getAvatarId(), first, last))
+ {
+ args["FIRST_NAME"] = first;
+ args["LAST_NAME"] = last;
+ }
+
+ if (grant)
+ {
+ LLNotificationsUtil::add("GrantModifyRights", args, LLSD(),
+ boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+ _1, _2, rights));
+ }
+ else
+ {
+ LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
+ boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+ _1, _2, rights));
+ }
+}
+
void LLPanelAvatarNotes::onCommitRights()
{
+ const LLRelationship* buddy_relationship =
+ LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+
+ if (NULL == buddy_relationship)
+ {
+ // Lets have a warning log message instead of having a crash. EXT-4947.
+ llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl;
+ return;
+ }
+
+
S32 rights = 0;
if(childGetValue("status_check").asBoolean())
@@ -203,7 +269,20 @@ void LLPanelAvatarNotes::onCommitRights()
if(childGetValue("objects_check").asBoolean())
rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights);
+ bool allow_modify_objects = childGetValue("objects_check").asBoolean();
+
+ // if modify objects checkbox clicked
+ if (buddy_relationship->isRightGrantedTo(
+ LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
+ {
+ confirmModifyRights(allow_modify_objects, rights);
+ }
+ // only one checkbox can trigger commit, so store the rest of rights
+ else
+ {
+ LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
+ getAvatarId(), rights);
+ }
}
void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
@@ -233,9 +312,7 @@ void LLPanelAvatarNotes::resetControls()
//Disable "Add Friend" button for friends.
childSetEnabled("add_friend", TRUE);
- childSetEnabled("status_check",FALSE);
- childSetEnabled("map_check",FALSE);
- childSetEnabled("objects_check",FALSE);
+ enableCheckboxes(false);
}
void LLPanelAvatarNotes::onAddFriendButtonClick()
@@ -255,7 +332,7 @@ void LLPanelAvatarNotes::onTeleportButtonClick()
void LLPanelAvatarNotes::onCallButtonClick()
{
- //*TODO not implemented.
+ LLAvatarActions::startCall(getAvatarId());
}
void LLPanelAvatarNotes::onShareButtonClick()
@@ -263,6 +340,58 @@ void LLPanelAvatarNotes::onShareButtonClick()
//*TODO not implemented.
}
+void LLPanelAvatarNotes::enableCheckboxes(bool enable)
+{
+ childSetEnabled("status_check", enable);
+ childSetEnabled("map_check", enable);
+ childSetEnabled("objects_check", enable);
+}
+
+LLPanelAvatarNotes::~LLPanelAvatarNotes()
+{
+ if(getAvatarId().notNull())
+ {
+ LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
+ }
+ }
+}
+
+// virtual, called by LLAvatarTracker
+void LLPanelAvatarNotes::changed(U32 mask)
+{
+ childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
+
+ // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947.
+ fillRightsData();
+}
+
+// virtual
+void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
+ {
+ return;
+ }
+
+ childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+}
+
+void LLPanelAvatarNotes::setAvatarId(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ if(getAvatarId().notNull())
+ {
+ LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
+ }
+ LLPanelProfileTab::setAvatarId(id);
+ LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -308,6 +437,7 @@ void LLPanelProfileTab::onOpen(const LLSD& key)
// Update data even if we are viewing same avatar profile as some data might been changed.
setAvatarId(key.asUUID());
updateData();
+ updateButtons();
}
void LLPanelProfileTab::scrollToTop()
@@ -317,10 +447,42 @@ void LLPanelProfileTab::scrollToTop()
scrollContainer->goToTop();
}
+void LLPanelProfileTab::onMapButtonClick()
+{
+ std::string name;
+ gCacheName->getFullName(getAvatarId(), name);
+ gFloaterWorldMap->trackAvatar(getAvatarId(), name);
+ LLFloaterReg::showInstance("world_map");
+}
+
+void LLPanelProfileTab::updateButtons()
+{
+ bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
+
+ if(LLAvatarActions::isFriend(getAvatarId()))
+ {
+ childSetEnabled("teleport", is_buddy_online);
+ }
+ else
+ {
+ childSetEnabled("teleport", true);
+ }
+
+ bool enable_map_btn = (is_buddy_online &&
+ is_agent_mappable(getAvatarId()))
+ || gAgent.isGodlike();
+ childSetEnabled("show_on_map_btn", enable_map_btn);
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+bool enable_god()
+{
+ return gAgent.isGodlike();
+}
+
LLPanelAvatarProfile::LLPanelAvatarProfile()
: LLPanelProfileTab()
{
@@ -333,7 +495,26 @@ BOOL LLPanelAvatarProfile::postBuild()
childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
+ childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
+ childSetCommitCallback("show_on_map_btn", (boost::bind(
+ &LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
+ registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
+ registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this));
+ registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
+ registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
+ registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
+ registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
+ enable.add("Profile.EnableGod", boost::bind(&enable_god));
+ enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this));
+ enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this));
+
+ mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic");
pic->setFallbackImageName("default_profile_picture.j2c");
@@ -341,6 +522,8 @@ BOOL LLPanelAvatarProfile::postBuild()
pic = getChild<LLTextureCtrl>("real_world_pic");
pic->setFallbackImageName("default_profile_picture.j2c");
+ gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this);
+
resetControls();
resetData();
@@ -351,7 +534,7 @@ void LLPanelAvatarProfile::onOpen(const LLSD& key)
{
LLPanelProfileTab::onOpen(key);
- mGroups.erase();
+ mGroups.clear();
//Disable "Add Friend" button for friends.
childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId()));
@@ -383,7 +566,7 @@ void LLPanelAvatarProfile::resetControls()
void LLPanelAvatarProfile::resetData()
{
- mGroups.erase();
+ mGroups.clear();
childSetValue("2nd_life_pic",LLUUID::null);
childSetValue("real_world_pic",LLUUID::null);
childSetValue("online_status",LLStringUtil::null);
@@ -424,8 +607,6 @@ void LLPanelAvatarProfile::processProfileProperties(const LLAvatarData* avatar_d
fillPartnerData(avatar_data);
- fillOnlineStatus(avatar_data);
-
fillAccountStatus(avatar_data);
}
@@ -435,23 +616,31 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
// Group properties may arrive in two callbacks, we need to save them across
// different calls. We can't do that in textbox as textbox may change the text.
- std::string groups = mGroups;
LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
- if(groups.empty() && it_end != it)
- {
- groups = (*it).group_name;
- ++it;
- }
for(; it_end != it; ++it)
{
LLAvatarGroups::LLGroupData group_data = *it;
- groups += ", ";
- groups += group_data.group_name;
+ mGroups[group_data.group_name] = group_data.group_id;
}
- mGroups = groups;
- childSetValue("sl_groups",mGroups);
+
+ // Creating string, containing group list
+ std::string groups = "";
+ for (group_map_t::iterator it = mGroups.begin(); it != mGroups.end(); ++it)
+ {
+ if (it != mGroups.begin())
+ groups += ", ";
+
+ std::string group_name = LLURI::escape(it->first);
+ std::string group_url= it->second.notNull()
+ ? "[secondlife:///app/group/" + it->second.asString() + "/about " + group_name + "]"
+ : getString("no_group_text");
+
+ groups += group_url;
+ }
+
+ childSetValue("sl_groups", groups);
}
void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
@@ -459,46 +648,33 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
//remove avatar id from cache to get fresh info
LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
-
- childSetValue("register_date", avatar_data->born_on );
+ LLStringUtil::format_map_t args;
+ args["[REG_DATE]"] = avatar_data->born_on;
+ args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
+ std::string register_date = getString("RegisterDateFormat", args);
+ childSetValue("register_date", register_date );
childSetValue("sl_description_edit", avatar_data->about_text);
childSetValue("fl_description_edit",avatar_data->fl_about_text);
childSetValue("2nd_life_pic", avatar_data->image_id);
childSetValue("real_world_pic", avatar_data->fl_image_id);
childSetValue("homepage_edit", avatar_data->profile_url);
+
+ // Hide home page textbox if no page was set to fix "homepage URL appears clickable without URL - EXT-4734"
+ childSetVisible("homepage_edit", !avatar_data->profile_url.empty());
}
void LLPanelAvatarProfile::fillPartnerData(const LLAvatarData* avatar_data)
{
+ LLNameBox* name_box = getChild<LLNameBox>("partner_text");
if (avatar_data->partner_id.notNull())
{
- std::string first, last;
- BOOL found = gCacheName->getName(avatar_data->partner_id, first, last);
- if (found)
- {
- childSetTextArg("partner_text", "[FIRST]", first);
- childSetTextArg("partner_text", "[LAST]", last);
- }
+ name_box->setNameID(avatar_data->partner_id, FALSE);
}
else
{
- childSetTextArg("partner_text", "[FIRST]", getString("no_partner_text"));
- }
-}
-
-void LLPanelAvatarProfile::fillOnlineStatus(const LLAvatarData* avatar_data)
-{
- bool online = avatar_data->flags & AVATAR_ONLINE;
- if(LLAvatarActions::isFriend(avatar_data->avatar_id))
- {
- // Online status NO could be because they are hidden
- // If they are a friend, we may know the truth!
- online = LLAvatarTracker::instance().isBuddyOnline(avatar_data->avatar_id);
+ name_box->setNameID(LLUUID::null, FALSE);
+ name_box->setText(getString("no_partner_text"));
}
- childSetValue("online_status", online ?
- "Online" : "Offline");
- childSetColor("online_status", online ?
- LLColor4::green : LLColor4::red);
}
void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
@@ -513,6 +689,53 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
childSetValue("acc_status_text", caption_text);
}
+void LLPanelAvatarProfile::pay()
+{
+ LLAvatarActions::pay(getAvatarId());
+}
+
+void LLPanelAvatarProfile::share()
+{
+ LLAvatarActions::share(getAvatarId());
+}
+
+void LLPanelAvatarProfile::toggleBlock()
+{
+ LLAvatarActions::toggleBlock(getAvatarId());
+}
+
+bool LLPanelAvatarProfile::enableBlock()
+{
+ return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId());
+}
+
+bool LLPanelAvatarProfile::enableUnblock()
+{
+ return LLAvatarActions::isBlocked(getAvatarId());
+}
+
+void LLPanelAvatarProfile::kick()
+{
+ LLAvatarActions::kick(getAvatarId());
+}
+
+void LLPanelAvatarProfile::freeze()
+{
+ LLAvatarActions::freeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::unfreeze()
+{
+ LLAvatarActions::unfreeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::csr()
+{
+ std::string name;
+ gCacheName->getFullName(getAvatarId(), name);
+ LLAvatarActions::csr(getAvatarId(), name);
+}
+
void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
{
LLWeb::loadURL(url);
@@ -544,7 +767,7 @@ void LLPanelAvatarProfile::onTeleportButtonClick()
void LLPanelAvatarProfile::onCallButtonClick()
{
- //*TODO not implemented
+ LLAvatarActions::startCall(getAvatarId());
}
void LLPanelAvatarProfile::onShareButtonClick()
@@ -552,23 +775,82 @@ void LLPanelAvatarProfile::onShareButtonClick()
//*TODO not implemented
}
+void LLPanelAvatarProfile::onOverflowButtonClicked()
+{
+ if (!mProfileMenu->toggleVisibility())
+ return;
+
+ LLView* btn = getChild<LLView>("overflow_btn");
+
+ if (mProfileMenu->getButtonRect().isEmpty())
+ {
+ mProfileMenu->setButtonRect(btn);
+ }
+ mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
+
+ LLRect rect = btn->getRect();
+ LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
+}
+
+LLPanelAvatarProfile::~LLPanelAvatarProfile()
+{
+ if(getAvatarId().notNull())
+ {
+ LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
+ }
+ }
+}
+
+// virtual, called by LLAvatarTracker
+void LLPanelAvatarProfile::changed(U32 mask)
+{
+ childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
+}
+
+// virtual
+void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
+ {
+ return;
+ }
+
+ childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+}
+
+void LLPanelAvatarProfile::setAvatarId(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ if(getAvatarId().notNull())
+ {
+ LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
+ }
+ LLPanelProfileTab::setAvatarId(id);
+ LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
-LLPanelAvatarMeProfile::LLPanelAvatarMeProfile()
+LLPanelMyProfile::LLPanelMyProfile()
: LLPanelAvatarProfile()
{
}
-BOOL LLPanelAvatarMeProfile::postBuild()
+BOOL LLPanelMyProfile::postBuild()
{
LLPanelAvatarProfile::postBuild();
mStatusCombobox = getChild<LLComboBox>("status_combo");
- childSetCommitCallback("status_combo", boost::bind(&LLPanelAvatarMeProfile::onStatusChanged, this), NULL);
- childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelAvatarMeProfile::onStatusMessageChanged, this), NULL);
+ childSetCommitCallback("status_combo", boost::bind(&LLPanelMyProfile::onStatusChanged, this), NULL);
+ childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelMyProfile::onStatusMessageChanged, this), NULL);
resetControls();
resetData();
@@ -576,12 +858,12 @@ BOOL LLPanelAvatarMeProfile::postBuild()
return TRUE;
}
-void LLPanelAvatarMeProfile::onOpen(const LLSD& key)
+void LLPanelMyProfile::onOpen(const LLSD& key)
{
LLPanelProfileTab::onOpen(key);
}
-void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar_data)
+void LLPanelMyProfile::processProfileProperties(const LLAvatarData* avatar_data)
{
fillCommonData(avatar_data);
@@ -592,7 +874,7 @@ void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar
fillAccountStatus(avatar_data);
}
-void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data)
+void LLPanelMyProfile::fillStatusData(const LLAvatarData* avatar_data)
{
std::string status;
if (gAgent.getAFK())
@@ -611,7 +893,7 @@ void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data)
mStatusCombobox->setValue(status);
}
-void LLPanelAvatarMeProfile::resetControls()
+void LLPanelMyProfile::resetControls()
{
childSetVisible("status_panel", false);
childSetVisible("profile_buttons_panel", false);
@@ -621,7 +903,7 @@ void LLPanelAvatarMeProfile::resetControls()
childSetVisible("profile_me_buttons_panel", true);
}
-void LLPanelAvatarMeProfile::onStatusChanged()
+void LLPanelMyProfile::onStatusChanged()
{
LLSD::String status = mStatusCombobox->getValue().asString();
@@ -639,11 +921,11 @@ void LLPanelAvatarMeProfile::onStatusChanged()
{
gAgent.clearAFK();
gAgent.setBusy();
- LLNotifications::instance().add("BusyModeSet");
+ LLNotificationsUtil::add("BusyModeSet");
}
}
-void LLPanelAvatarMeProfile::onStatusMessageChanged()
+void LLPanelMyProfile::onStatusMessageChanged()
{
updateData();
}
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index ae0b8e9844..babbe534b4 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -35,9 +35,12 @@
#include "llpanel.h"
#include "llavatarpropertiesprocessor.h"
+#include "llcallingcard.h"
+#include "llvoiceclient.h"
class LLComboBox;
class LLLineEditor;
+class LLToggleableMenu;
enum EOnlineStatus
{
@@ -46,7 +49,7 @@ enum EOnlineStatus
};
/**
-* Base class for any Profile View or Me Profile Panel.
+* Base class for any Profile View or My Profile Panel.
*/
class LLPanelProfileTab
: public LLPanel
@@ -105,6 +108,10 @@ protected:
*/
void scrollToTop();
+ virtual void onMapButtonClick();
+
+ virtual void updateButtons();
+
private:
LLUUID mAvatarId;
@@ -115,13 +122,27 @@ private:
*/
class LLPanelAvatarProfile
: public LLPanelProfileTab
+ , public LLFriendObserver
+ , public LLVoiceClientStatusObserver
{
public:
LLPanelAvatarProfile();
+ /*virtual*/ ~LLPanelAvatarProfile();
/*virtual*/ void onOpen(const LLSD& key);
/**
+ * LLFriendObserver trigger
+ */
+ virtual void changed(U32 mask);
+
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the call
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
+ /*virtual*/ void setAvatarId(const LLUUID& id);
+
+ /**
* Processes data received from server.
*/
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
@@ -147,7 +168,7 @@ protected:
virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
/**
- * Fills common for Avatar profile and Me Profile fields.
+ * Fills common for Avatar profile and My Profile fields.
*/
virtual void fillCommonData(const LLAvatarData* avatar_data);
@@ -157,15 +178,35 @@ protected:
virtual void fillPartnerData(const LLAvatarData* avatar_data);
/**
- * Fills Avatar's online status.
- */
- virtual void fillOnlineStatus(const LLAvatarData* avatar_data);
-
- /**
* Fills account status.
*/
virtual void fillAccountStatus(const LLAvatarData* avatar_data);
+ /**
+ * Opens "Pay Resident" dialog.
+ */
+ void pay();
+
+ /**
+ * opens inventory and IM for sharing items
+ */
+ void share();
+
+ /**
+ * Add/remove resident to/from your block list.
+ */
+ void toggleBlock();
+
+ void kick();
+ void freeze();
+ void unfreeze();
+ void csr();
+
+ bool enableBlock();
+ bool enableUnblock();
+ bool enableGod();
+
+
void onUrlTextboxClicked(const std::string& url);
void onHomepageTextboxClicked();
void onAddFriendButtonClick();
@@ -173,20 +214,24 @@ protected:
void onCallButtonClick();
void onTeleportButtonClick();
void onShareButtonClick();
+ void onOverflowButtonClicked();
private:
- std::string mGroups;
+ typedef std::map< std::string,LLUUID> group_map_t;
+ group_map_t mGroups;
+
+ LLToggleableMenu* mProfileMenu;
};
/**
* Panel for displaying own first and second life related info.
*/
-class LLPanelAvatarMeProfile
+class LLPanelMyProfile
: public LLPanelAvatarProfile
{
public:
- LLPanelAvatarMeProfile();
+ LLPanelMyProfile();
/*virtual*/ BOOL postBuild();
@@ -214,13 +259,27 @@ private:
};
/**
-* Panel for displaying Avatar's notes and modifying friend's rights.
-*/
+ * Panel for displaying Avatar's notes and modifying friend's rights.
+ */
class LLPanelAvatarNotes
: public LLPanelProfileTab
+ , public LLFriendObserver
+ , public LLVoiceClientStatusObserver
{
public:
LLPanelAvatarNotes();
+ /*virtual*/ ~LLPanelAvatarNotes();
+
+ virtual void setAvatarId(const LLUUID& id);
+
+ /**
+ * LLFriendObserver trigger
+ */
+ virtual void changed(U32 mask);
+
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the call
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
/*virtual*/ void onOpen(const LLSD& key);
@@ -241,6 +300,9 @@ protected:
*/
void fillRightsData();
+ void rightsConfirmationCallback(const LLSD& notification,
+ const LLSD& response, S32 rights);
+ void confirmModifyRights(bool grant, S32 rights);
void onCommitRights();
void onCommitNotes();
@@ -249,6 +311,7 @@ protected:
void onCallButtonClick();
void onTeleportButtonClick();
void onShareButtonClick();
+ void enableCheckboxes(bool enable);
};
#endif // LL_LLPANELAVATAR_H
diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp
index 03ad19f911..7563cc7f61 100644
--- a/indra/newview/llpanelavatartag.cpp
+++ b/indra/newview/llpanelavatartag.cpp
@@ -92,7 +92,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id)
boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback(
const commit_callback_t& cb)
{
- return mCommitSignal.connect(cb);
+ return setCommitCallback(cb);
}
BOOL LLPanelAvatarTag::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 60d0f07285..362657a458 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -32,12 +32,14 @@
#include "llviewerprecompiledheaders.h"
+#include "llpanelblockedlist.h"
+
+// library include
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
-#include "llpanelblockedlist.h"
-
// project include
#include "llfloateravatarpicker.h"
#include "llsidetray.h"
@@ -102,7 +104,7 @@ void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id)
void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)
{
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().insert(BLOCKED_PARAM_NAME, idToSelect));
+ LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
}
@@ -169,7 +171,7 @@ void LLPanelBlockedList::onPickBtnClick()
{
const BOOL allow_multiple = FALSE;
const BOOL close_on_select = TRUE;
- /*LLFloaterAvatarPicker* picker = */LLFloaterAvatarPicker::show(callbackBlockPicked, this, allow_multiple, close_on_select);
+ /*LLFloaterAvatarPicker* picker = */LLFloaterAvatarPicker::show(boost::bind(&LLPanelBlockedList::callbackBlockPicked, this, _1, _2), allow_multiple, close_on_select);
// *TODO: mantipov: should LLFloaterAvatarPicker be closed when panel is closed?
// old Floater dependency is not enable in panel
@@ -181,8 +183,7 @@ void LLPanelBlockedList::onBlockByNameClick()
LLFloaterGetBlockedObjectName::show(&LLPanelBlockedList::callbackBlockByName);
}
-//static
-void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* user_data)
+void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
{
if (names.empty() || ids.empty()) return;
LLMute mute(ids[0], names[0], LLMute::AGENT);
@@ -199,7 +200,7 @@ void LLPanelBlockedList::callbackBlockByName(const std::string& text)
BOOL success = LLMuteList::getInstance()->add(mute);
if (!success)
{
- LLNotifications::instance().add("MuteByNameFailed");
+ LLNotificationsUtil::add("MuteByNameFailed");
}
}
diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h
index 0993f46f79..1ef16a02f4 100644
--- a/indra/newview/llpanelblockedlist.h
+++ b/indra/newview/llpanelblockedlist.h
@@ -78,7 +78,7 @@ private:
void onPickBtnClick();
void onBlockByNameClick();
- static void callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* user_data);
+ void callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
static void callbackBlockByName(const std::string& text);
private:
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index a29c9752e6..2a794a06b5 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -41,12 +41,13 @@
#include "lldir.h"
#include "lldispatcher.h"
#include "llfloaterreg.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "lltabcontainer.h"
#include "message.h"
#include "llagent.h"
-#include "llalertdialog.h"
#include "llavataractions.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
@@ -71,6 +72,8 @@
#include "llviewerwindow.h" // for window width, height
#include "llappviewer.h" // abortQuit()
#include "lltrans.h"
+#include "llscrollcontainer.h"
+#include "llstatusbar.h"
const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
const S32 MATURE_UNDEFINED = -1;
@@ -240,7 +243,7 @@ BOOL LLPanelClassified::postBuild()
mNameEditor->setCommitOnFocusLost(TRUE);
mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this));
mNameEditor->setCommitCallback(onCommitAny, this);
- mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+ mNameEditor->setPrevalidate( LLTextValidate::validateASCII );
mDescEditor = getChild<LLTextEditor>("desc_editor");
mDescEditor->setCommitOnFocusLost(TRUE);
@@ -310,12 +313,12 @@ BOOL LLPanelClassified::titleIsValid()
const std::string& name = mNameEditor->getText();
if (name.empty())
{
- LLNotifications::instance().add("BlankClassifiedName");
+ LLNotificationsUtil::add("BlankClassifiedName");
return FALSE;
}
if (!isalnum(name[0]))
{
- LLNotifications::instance().add("ClassifiedMustBeAlphanumeric");
+ LLNotificationsUtil::add("ClassifiedMustBeAlphanumeric");
return FALSE;
}
@@ -334,7 +337,7 @@ void LLPanelClassified::apply()
bool LLPanelClassified::saveCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
@@ -370,7 +373,7 @@ BOOL LLPanelClassified::canClose()
LLSD args;
args["NAME"] = mNameEditor->getText();
- LLNotifications::instance().add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2));
+ LLNotificationsUtil::add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2));
return FALSE;
}
@@ -795,7 +798,7 @@ void LLPanelClassified::onClickUpdate(void* data)
if(self->mMatureCombo->getCurrentIndex() == DECLINE_TO_STATE)
{
// Tell user about it
- LLNotifications::instance().add("SetClassifiedMature",
+ LLNotificationsUtil::add("SetClassifiedMature",
LLSD(),
LLSD(),
boost::bind(&LLPanelClassified::confirmMature, self, _1, _2));
@@ -809,7 +812,7 @@ void LLPanelClassified::onClickUpdate(void* data)
// Callback from a dialog indicating response to mature notification
bool LLPanelClassified::confirmMature(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// 0 == Yes
// 1 == No
@@ -864,7 +867,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,
std::string price_text = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
args["MIN_PRICE"] = price_text;
- LLNotifications::instance().add("MinClassifiedPrice", args);
+ LLNotificationsUtil::add("MinClassifiedPrice", args);
return;
}
@@ -874,7 +877,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,
LLSD args;
args["AMOUNT"] = llformat("%d", price_for_listing);
- LLNotifications::instance().add("PublishClassified", args, LLSD(),
+ LLNotificationsUtil::add("PublishClassified", args, LLSD(),
boost::bind(&LLPanelClassified::confirmPublish, self, _1, _2));
}
@@ -901,7 +904,7 @@ void LLPanelClassified::resetDirty()
// invoked from callbackConfirmPublish
bool LLPanelClassified::confirmPublish(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// Option 0 = publish
if (option != 0) return false;
@@ -1070,7 +1073,7 @@ BOOL LLFloaterPriceForListing::postBuild()
LLLineEditor* edit = getChild<LLLineEditor>("price_edit");
if (edit)
{
- edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ edit->setPrevalidate(LLTextValidate::validateNonNegativeS32);
std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
edit->setText(min_price);
edit->selectAll();
@@ -1142,3 +1145,631 @@ void LLPanelClassified::setDefaultAccessCombo()
break;
}
}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelClassifiedInfo::LLPanelClassifiedInfo()
+ : LLPanel()
+ , mInfoLoaded(false)
+{
+}
+
+LLPanelClassifiedInfo::~LLPanelClassifiedInfo()
+{
+}
+
+// static
+LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()
+{
+ LLPanelClassifiedInfo* panel = new LLPanelClassifiedInfo();
+ LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_classified_info.xml");
+ return panel;
+}
+
+BOOL LLPanelClassifiedInfo::postBuild()
+{
+ childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this));
+ childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this));
+ childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this));
+
+ mScrollingPanel = getChild<LLPanel>("scroll_content_panel");
+ mScrollContainer = getChild<LLScrollContainer>("profile_scroll");
+
+ mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
+ mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
+
+ return TRUE;
+}
+
+void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)
+{
+ getChild<LLButton>("back_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& cb)
+{
+ getChild<LLButton>("edit_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedInfo::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+ LLPanel::reshape(width, height, called_from_parent);
+
+ if (!mScrollContainer || !mScrollingPanel)
+ return;
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ S32 scroll_height = mScrollContainer->getRect().getHeight();
+ if (mScrollingPanelMinHeight >= scroll_height)
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
+ }
+ else
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
+ }
+}
+
+void LLPanelClassifiedInfo::onOpen(const LLSD& key)
+{
+ LLUUID avatar_id = key["avatar_id"];
+ if(avatar_id.isNull())
+ {
+ return;
+ }
+
+ if(getAvatarId().notNull())
+ {
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+ }
+
+ setAvatarId(avatar_id);
+
+ resetData();
+ resetControls();
+
+ setClassifiedId(key["classified_id"]);
+ setClassifiedName(key["name"]);
+ setDescription(key["desc"]);
+ setSnapshotId(key["snapshot_id"]);
+
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+ LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+ setInfoLoaded(false);
+}
+
+void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType type)
+{
+ if(APT_CLASSIFIED_INFO == type)
+ {
+ LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+ if(c_info && getClassifiedId() == c_info->classified_id)
+ {
+ setClassifiedName(c_info->name);
+ setDescription(c_info->description);
+ setSnapshotId(c_info->snapshot_id);
+ setParcelId(c_info->parcel_id);
+ setPosGlobal(c_info->pos_global);
+ setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+ childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
+
+ static std::string mature_str = getString("type_mature");
+ static std::string pg_str = getString("type_pg");
+ static LLUIString price_str = getString("l$_price");
+
+ bool mature = is_cf_mature(c_info->flags);
+ childSetValue("content_type", mature ? mature_str : pg_str);
+ childSetValue("auto_renew", is_cf_auto_renew(c_info->flags));
+
+ price_str.setArg("[PRICE]", llformat("%d", c_info->price_for_listing));
+ childSetValue("price_for_listing", LLSD(price_str));
+
+ setInfoLoaded(true);
+ }
+ }
+}
+
+void LLPanelClassifiedInfo::resetData()
+{
+ setClassifiedName(LLStringUtil::null);
+ setDescription(LLStringUtil::null);
+ setClassifiedLocation(LLStringUtil::null);
+ setClassifiedId(LLUUID::null);
+ setSnapshotId(LLUUID::null);
+ mPosGlobal.clearVec();
+ childSetValue("category", LLStringUtil::null);
+ childSetValue("content_type", LLStringUtil::null);
+}
+
+void LLPanelClassifiedInfo::resetControls()
+{
+ if(getAvatarId() == gAgent.getID())
+ {
+ childSetEnabled("edit_btn", TRUE);
+ childSetVisible("edit_btn", TRUE);
+ }
+ else
+ {
+ childSetEnabled("edit_btn", FALSE);
+ childSetVisible("edit_btn", FALSE);
+ }
+}
+
+void LLPanelClassifiedInfo::setClassifiedName(const std::string& name)
+{
+ childSetValue("classified_name", name);
+}
+
+std::string LLPanelClassifiedInfo::getClassifiedName()
+{
+ return childGetValue("classified_name").asString();
+}
+
+void LLPanelClassifiedInfo::setDescription(const std::string& desc)
+{
+ childSetValue("classified_desc", desc);
+}
+
+std::string LLPanelClassifiedInfo::getDescription()
+{
+ return childGetValue("classified_desc").asString();
+}
+
+void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location)
+{
+ childSetValue("classified_location", location);
+}
+
+void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id)
+{
+ childSetValue("classified_snapshot", id);
+}
+
+LLUUID LLPanelClassifiedInfo::getSnapshotId()
+{
+ return childGetValue("classified_snapshot").asUUID();
+}
+
+// static
+std::string LLPanelClassifiedInfo::createLocationText(
+ const std::string& original_name,
+ const std::string& sim_name,
+ const LLVector3d& pos_global)
+{
+ std::string location_text;
+
+ location_text.append(original_name);
+
+ if (!sim_name.empty())
+ {
+ if (!location_text.empty())
+ location_text.append(", ");
+ location_text.append(sim_name);
+ }
+
+ if (!location_text.empty())
+ location_text.append(" ");
+
+ if (!pos_global.isNull())
+ {
+ S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS;
+ S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;
+ S32 region_z = llround((F32)pos_global.mdV[VZ]);
+ location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z));
+ }
+
+ return location_text;
+}
+
+void LLPanelClassifiedInfo::onMapClick()
+{
+ LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+ LLFloaterReg::showInstance("world_map", "center");
+}
+
+void LLPanelClassifiedInfo::onTeleportClick()
+{
+ if (!getPosGlobal().isExactlyZero())
+ {
+ gAgent.teleportViaLocation(getPosGlobal());
+ LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+ }
+}
+
+void LLPanelClassifiedInfo::onExit()
+{
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+static const S32 CB_ITEM_MATURE = 0;
+static const S32 CB_ITEM_PG = 1;
+
+LLPanelClassifiedEdit::LLPanelClassifiedEdit()
+ : LLPanelClassifiedInfo()
+ , mIsNew(false)
+ , mCanClose(false)
+{
+}
+
+LLPanelClassifiedEdit::~LLPanelClassifiedEdit()
+{
+}
+
+//static
+LLPanelClassifiedEdit* LLPanelClassifiedEdit::create()
+{
+ LLPanelClassifiedEdit* panel = new LLPanelClassifiedEdit();
+ LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_edit_classified.xml");
+ return panel;
+}
+
+BOOL LLPanelClassifiedEdit::postBuild()
+{
+ LLPanelClassifiedInfo::postBuild();
+
+ LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot");
+ snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
+
+ LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon");
+ snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon));
+ snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon));
+ edit_icon->setVisible(false);
+
+ LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
+ line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+
+ LLTextEditor* text_edit = getChild<LLTextEditor>("classified_desc");
+ text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
+
+ LLComboBox* combobox = getChild<LLComboBox>( "category");
+ LLClassifiedInfo::cat_map::iterator iter;
+ for (iter = LLClassifiedInfo::sCategories.begin();
+ iter != LLClassifiedInfo::sCategories.end();
+ iter++)
+ {
+ combobox->add(LLTrans::getString(iter->second));
+ }
+
+ combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
+
+ childSetCommitCallback("content_type", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+ childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+ childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+
+ childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onSaveClick, this));
+ childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onSetLocationClick, this));
+
+ return TRUE;
+}
+
+void LLPanelClassifiedEdit::onOpen(const LLSD& key)
+{
+ LLUUID classified_id = key["classified_id"];
+
+ mIsNew = classified_id.isNull();
+
+ if(mIsNew)
+ {
+ setAvatarId(gAgent.getID());
+
+ resetData();
+ resetControls();
+
+ setPosGlobal(gAgent.getPositionGlobal());
+
+ LLUUID snapshot_id = LLUUID::null;
+ std::string desc;
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+ if(parcel)
+ {
+ desc = parcel->getDesc();
+ snapshot_id = parcel->getSnapshotID();
+ }
+
+ std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ region_name = region->getName();
+ }
+
+ childSetValue("classified_name", makeClassifiedName());
+ childSetValue("classified_desc", desc);
+ setSnapshotId(snapshot_id);
+
+ setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal()));
+
+ // server will set valid parcel id
+ setParcelId(LLUUID::null);
+
+ enableVerbs(true);
+ enableEditing(true);
+ }
+ else
+ {
+ LLPanelClassifiedInfo::onOpen(key);
+ enableVerbs(false);
+ enableEditing(false);
+ }
+
+ resetDirty();
+ setInfoLoaded(false);
+}
+
+void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType type)
+{
+ if(APT_CLASSIFIED_INFO == type)
+ {
+ LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+ if(c_info && getClassifiedId() == c_info->classified_id)
+ {
+ enableEditing(true);
+
+ setClassifiedName(c_info->name);
+ setDescription(c_info->description);
+ setSnapshotId(c_info->snapshot_id);
+ setPosGlobal(c_info->pos_global);
+
+ setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+ getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1);
+ getChild<LLComboBox>("category")->resetDirty();
+
+ bool mature = is_cf_mature(c_info->flags);
+ bool auto_renew = is_cf_auto_renew(c_info->flags);
+
+ getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? CB_ITEM_MATURE : CB_ITEM_PG);
+ childSetValue("auto_renew", auto_renew);
+ childSetValue("price_for_listing", c_info->price_for_listing);
+
+ resetDirty();
+ setInfoLoaded(true);
+ }
+ }
+}
+
+BOOL LLPanelClassifiedEdit::isDirty() const
+{
+ if(mIsNew)
+ {
+ return TRUE;
+ }
+
+ BOOL dirty = false;
+
+ dirty |= LLPanelClassifiedInfo::isDirty();
+ dirty |= getChild<LLUICtrl>("classified_snapshot")->isDirty();
+ dirty |= getChild<LLUICtrl>("classified_name")->isDirty();
+ dirty |= getChild<LLUICtrl>("classified_desc")->isDirty();
+ dirty |= getChild<LLUICtrl>("category")->isDirty();
+ dirty |= getChild<LLUICtrl>("content_type")->isDirty();
+ dirty |= getChild<LLUICtrl>("auto_renew")->isDirty();
+ dirty |= getChild<LLUICtrl>("price_for_listing")->isDirty();
+
+ return dirty;
+}
+
+void LLPanelClassifiedEdit::resetDirty()
+{
+ LLPanelClassifiedInfo::resetDirty();
+ getChild<LLUICtrl>("classified_snapshot")->resetDirty();
+ getChild<LLUICtrl>("classified_name")->resetDirty();
+ getChild<LLUICtrl>("classified_desc")->resetDirty();
+ getChild<LLUICtrl>("category")->resetDirty();
+ getChild<LLUICtrl>("content_type")->resetDirty();
+ getChild<LLUICtrl>("auto_renew")->resetDirty();
+ getChild<LLUICtrl>("price_for_listing")->resetDirty();
+}
+
+void LLPanelClassifiedEdit::setSaveCallback(const commit_callback_t& cb)
+{
+ getChild<LLButton>("save_changes_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb)
+{
+ getChild<LLButton>("cancel_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::resetControls()
+{
+ LLPanelClassifiedInfo::resetControls();
+
+ getChild<LLComboBox>("category")->setCurrentByIndex(0);
+ getChild<LLComboBox>("content_type")->setCurrentByIndex(0);
+ childSetValue("auto_renew", false);
+ childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING);
+}
+
+bool LLPanelClassifiedEdit::canClose()
+{
+ return mCanClose;
+}
+
+void LLPanelClassifiedEdit::sendUpdate()
+{
+ LLAvatarClassifiedInfo c_data;
+
+ if(getClassifiedId().isNull())
+ {
+ LLUUID id;
+ id.generate();
+ setClassifiedId(id);
+ }
+
+ c_data.agent_id = gAgent.getID();
+ c_data.classified_id = getClassifiedId();
+ c_data.category = getCategory();
+ c_data.name = getClassifiedName();
+ c_data.description = getDescription();
+ c_data.parcel_id = getParcelId();
+ c_data.snapshot_id = getSnapshotId();
+ c_data.pos_global = getPosGlobal();
+ c_data.flags = getFlags();
+ c_data.price_for_listing = getPriceForListing();
+
+ LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data);
+}
+
+U32 LLPanelClassifiedEdit::getCategory()
+{
+ LLComboBox* cat_cb = getChild<LLComboBox>("category");
+ return cat_cb->getCurrentIndex() + 1;
+}
+
+U8 LLPanelClassifiedEdit::getFlags()
+{
+ bool auto_renew = childGetValue("auto_renew").asBoolean();
+
+ LLComboBox* content_cb = getChild<LLComboBox>("content_type");
+ bool mature = content_cb->getCurrentIndex() == CB_ITEM_MATURE;
+
+ return pack_classified_flags_request(auto_renew, false, mature, false);
+}
+
+void LLPanelClassifiedEdit::enableVerbs(bool enable)
+{
+ childSetEnabled("save_changes_btn", enable);
+}
+
+void LLPanelClassifiedEdit::enableEditing(bool enable)
+{
+ childSetEnabled("classified_snapshot", enable);
+ childSetEnabled("classified_name", enable);
+ childSetEnabled("classified_desc", enable);
+ childSetEnabled("set_to_curr_location_btn", enable);
+ childSetEnabled("category", enable);
+ childSetEnabled("content_type", enable);
+ childSetEnabled("price_for_listing", enable);
+ childSetEnabled("auto_renew", enable);
+}
+
+std::string LLPanelClassifiedEdit::makeClassifiedName()
+{
+ std::string name;
+
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if(parcel)
+ {
+ name = parcel->getName();
+ }
+
+ if(!name.empty())
+ {
+ return name;
+ }
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region)
+ {
+ name = region->getName();
+ }
+
+ return name;
+}
+
+S32 LLPanelClassifiedEdit::getPriceForListing()
+{
+ return childGetValue("price_for_listing").asInteger();
+}
+
+void LLPanelClassifiedEdit::onSetLocationClick()
+{
+ setPosGlobal(gAgent.getPositionGlobal());
+ setParcelId(LLUUID::null);
+
+ std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ region_name = region->getName();
+ }
+
+ setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal()));
+
+ // mark classified as dirty
+ setValue(LLSD());
+
+ onChange();
+}
+
+void LLPanelClassifiedEdit::onChange()
+{
+ enableVerbs(isDirty());
+}
+
+void LLPanelClassifiedEdit::onSaveClick()
+{
+ mCanClose = false;
+
+ if(!isValidName())
+ {
+ notifyInvalidName();
+ return;
+ }
+ if(isNew())
+ {
+ if(gStatusBar->getBalance() < getPriceForListing())
+ {
+ LLNotificationsUtil::add("ClassifiedInsufficientFunds");
+ return;
+ }
+ }
+
+ mCanClose = true;
+ sendUpdate();
+ resetDirty();
+}
+
+std::string LLPanelClassifiedEdit::getLocationNotice()
+{
+ static std::string location_notice = getString("location_notice");
+ return location_notice;
+}
+
+bool LLPanelClassifiedEdit::isValidName()
+{
+ std::string name = getClassifiedName();
+ if (name.empty())
+ {
+ return false;
+ }
+ if (!isalnum(name[0]))
+ {
+ return false;
+ }
+
+ return true;
+}
+
+void LLPanelClassifiedEdit::notifyInvalidName()
+{
+ std::string name = getClassifiedName();
+ if (name.empty())
+ {
+ LLNotificationsUtil::add("BlankClassifiedName");
+ }
+ else if (!isalnum(name[0]))
+ {
+ LLNotificationsUtil::add("ClassifiedMustBeAlphanumeric");
+ }
+}
+
+void LLPanelClassifiedEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
+{
+ ctrl->setVisible(TRUE);
+}
+
+void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
+{
+ ctrl->setVisible(FALSE);
+}
+
+//EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 417eddf460..9e33e55b88 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -37,6 +37,7 @@
#ifndef LL_LLPANELCLASSIFIED_H
#define LL_LLPANELCLASSIFIED_H
+#include "llavatarpropertiesprocessor.h"
#include "llpanel.h"
#include "llclassifiedinfo.h"
#include "v3dmath.h"
@@ -54,7 +55,10 @@ class LLTextEditor;
class LLTextureCtrl;
class LLUICtrl;
class LLMessageSystem;
+class LLScrollContainer;
+// *TODO deprecated, should be removed.
+// New class implemented in ticket EXT-2095
class LLPanelClassified : public LLPanel
{
public:
@@ -198,5 +202,154 @@ private:
void* mUserData;
};
+class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
+{
+public:
+
+ static LLPanelClassifiedInfo* create();
+
+ virtual ~LLPanelClassifiedInfo();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+ void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
+
+ LLUUID& getAvatarId() { return mAvatarId; }
+
+ void setSnapshotId(const LLUUID& id);
+
+ LLUUID getSnapshotId();
+
+ void setClassifiedId(const LLUUID& id) { mClassifiedId = id; }
+
+ LLUUID& getClassifiedId() { return mClassifiedId; }
+
+ void setClassifiedName(const std::string& name);
+
+ std::string getClassifiedName();
+
+ void setDescription(const std::string& desc);
+
+ std::string getDescription();
+
+ void setClassifiedLocation(const std::string& location);
+
+ void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+
+ LLVector3d& getPosGlobal() { return mPosGlobal; }
+
+ void setParcelId(const LLUUID& id) { mParcelId = id; }
+
+ LLUUID getParcelId() { return mParcelId; }
+
+ bool getInfoLoaded() { return mInfoLoaded; }
+
+ void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
+
+ void setExitCallback(const commit_callback_t& cb);
+
+ void setEditClassifiedCallback(const commit_callback_t& cb);
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+protected:
+
+ LLPanelClassifiedInfo();
+
+ virtual void resetData();
+
+ virtual void resetControls();
+
+ static std::string createLocationText(
+ const std::string& original_name,
+ const std::string& sim_name,
+ const LLVector3d& pos_global);
+
+ void onMapClick();
+ void onTeleportClick();
+ void onExit();
+
+private:
+
+ LLUUID mAvatarId;
+ LLUUID mClassifiedId;
+ LLVector3d mPosGlobal;
+ LLUUID mParcelId;
+ bool mInfoLoaded;
+
+ LLScrollContainer* mScrollContainer;
+ LLPanel* mScrollingPanel;
+
+ S32 mScrollingPanelMinHeight;
+ S32 mScrollingPanelWidth;
+};
+
+class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
+{
+public:
+
+ static LLPanelClassifiedEdit* create();
+
+ virtual ~LLPanelClassifiedEdit();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+ /*virtual*/ BOOL isDirty() const;
+
+ /*virtual*/ void resetDirty();
+
+ void setSaveCallback(const commit_callback_t& cb);
+
+ void setCancelCallback(const commit_callback_t& cb);
+
+ /*virtual*/ void resetControls();
+
+ bool isNew() { return mIsNew; }
+
+ bool canClose();
+
+protected:
+
+ LLPanelClassifiedEdit();
+
+ void sendUpdate();
+
+ U32 getCategory();
+
+ void enableVerbs(bool enable);
+
+ void enableEditing(bool enable);
+
+ std::string makeClassifiedName();
+
+ S32 getPriceForListing();
+
+ U8 getFlags();
+
+ std::string getLocationNotice();
+
+ bool isValidName();
+
+ void notifyInvalidName();
+
+ void onSetLocationClick();
+ void onChange();
+ void onSaveClick();
+
+ void onTexturePickerMouseEnter(LLUICtrl* ctrl);
+ void onTexturePickerMouseLeave(LLUICtrl* ctrl);
+
+private:
+ bool mIsNew;
+ bool mCanClose;
+};
#endif // LL_LLPANELCLASSIFIED_H
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index ea528a1df8..2a7d097f94 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -50,8 +50,7 @@
// project includes
#include "llagent.h"
-#include "llfloaterbulkpermission.h"
-#include "llpanelinventory.h"
+#include "llpanelobjectinventory.h"
#include "llpreviewscript.h"
#include "llresmgr.h"
#include "llselectmgr.h"
@@ -59,6 +58,8 @@
#include "lltoolcomp.h"
#include "lltoolmgr.h"
#include "lltrans.h"
+#include "llviewerassettype.h"
+#include "llviewerinventory.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
@@ -89,14 +90,14 @@ BOOL LLPanelContents::postBuild()
childSetAction("button new script",&LLPanelContents::onClickNewScript, this);
childSetAction("button permissions",&LLPanelContents::onClickPermissions, this);
- mPanelInventory = getChild<LLPanelInventory>("contents_inventory");
+ mPanelInventoryObject = getChild<LLPanelObjectInventory>("contents_inventory");
return TRUE;
}
LLPanelContents::LLPanelContents()
: LLPanel(),
- mPanelInventory(NULL)
+ mPanelInventoryObject(NULL)
{
}
@@ -139,9 +140,9 @@ void LLPanelContents::refresh()
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok);
getState(object);
- if (mPanelInventory)
+ if (mPanelInventoryObject)
{
- mPanelInventory->refresh();
+ mPanelInventoryObject->refresh();
}
}
@@ -167,7 +168,7 @@ void LLPanelContents::onClickNewScript(void *userdata)
PERM_NONE,
PERM_MOVE | PERM_TRANSFER);
std::string desc;
- LLAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
+ LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
LLPointer<LLViewerInventoryItem> new_item =
new LLViewerInventoryItem(
LLUUID::null,
diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h
index bab980b524..14256845a6 100644
--- a/indra/newview/llpanelcontents.h
+++ b/indra/newview/llpanelcontents.h
@@ -35,9 +35,14 @@
#include "v3math.h"
#include "llpanel.h"
+#include "llinventory.h"
+#include "lluuid.h"
+#include "llmap.h"
+#include "llviewerobject.h"
+#include "llvoinventorylistener.h"
class LLButton;
-class LLPanelInventory;
+class LLPanelObjectInventory;
class LLViewerObject;
class LLCheckBoxCtrl;
class LLSpinCtrl;
@@ -70,7 +75,7 @@ protected:
void getState(LLViewerObject *object);
public:
- LLPanelInventory* mPanelInventory;
+ LLPanelObjectInventory* mPanelInventoryObject;
};
-#endif
+#endif // LL_LLPANELCONTENTS_H
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index ee0426c7df..b50c6442e1 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -65,6 +65,7 @@
#include "llvovolume.h"
#include "lluictrlfactory.h"
#include "llpluginclassmedia.h"
+#include "llviewertexturelist.h"
//
// Methods
@@ -264,10 +265,13 @@ void LLPanelFace::sendAlpha()
void LLPanelFace::sendGlow()
{
- LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
- F32 glow = mCtrlGlow->get();
-
- LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
+ llassert(mCtrlGlow);
+ if (mCtrlGlow)
+ {
+ F32 glow = mCtrlGlow->get();
+ LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ }
}
struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
@@ -285,6 +289,9 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
LLCheckBoxCtrl* checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s");
LLCheckBoxCtrl* checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t");
LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen");
+ llassert(comboTexGen);
+ llassert(object);
+
if (ctrlTexScaleS)
{
valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative();
@@ -295,7 +302,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
@@ -313,7 +321,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
@@ -406,14 +415,40 @@ void LLPanelFace::getState()
LLUUID id;
struct f1 : public LLSelectedTEGetFunctor<LLUUID>
{
- LLUUID get(LLViewerObject* object, S32 te)
+ LLUUID get(LLViewerObject* object, S32 te_index)
{
- LLViewerTexture* image = object->getTEImage(te);
- return image ? image->getID() : LLUUID::null;
+ LLUUID id;
+
+ LLViewerTexture* image = object->getTEImage(te_index);
+ if (image) id = image->getID();
+
+ if (!id.isNull() && LLViewerMedia::textureHasMedia(id))
+ {
+ LLTextureEntry *te = object->getTE(te_index);
+ if (te)
+ {
+ LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ;
+ if(!tex)
+ {
+ tex = LLViewerFetchedTexture::sDefaultImagep;
+ }
+ if (tex)
+ {
+ id = tex->getID();
+ }
+ }
+ }
+ return id;
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
+ if(LLViewerMedia::textureHasMedia(id))
+ {
+ childSetEnabled("textbox autofix",editable);
+ childSetEnabled("button align",editable);
+ }
+
if (identical)
{
// All selected have the same texture
@@ -444,13 +479,6 @@ void LLPanelFace::getState()
}
}
}
-
- if(LLViewerMedia::textureHasMedia(id))
- {
- childSetEnabled("textbox autofix",editable);
- childSetEnabled("button align",editable);
- }
-
}
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 4708d7ba36..61463ed843 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -43,7 +43,7 @@
#include "llviewermessage.h"
#include "llviewerwindow.h"
#include "llappviewer.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llfloaterreg.h"
#include "llfloater.h"
#include "llgroupactions.h"
@@ -86,27 +86,12 @@ BOOL LLPanelGroupTab::postBuild()
return TRUE;
}
-
-
-void LLPanelGroupTab::handleClickHelp()
-{
- // Display the help text.
- std::string help_text( getHelpText() );
- if ( !help_text.empty() )
- {
- LLSD args;
- args["MESSAGE"] = help_text;
- LLFloater* parent_floater = gFloaterView->getParentFloater(this);
- LLNotification::Params params(parent_floater->contextualNotification("GenericAlert"));
- params.substitutions(args);
- LLNotifications::instance().add(params);
- }
-}
-
LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
- mAllowEdit( TRUE )
+ mSkipRefresh(FALSE),
+ mButtonJoin(NULL),
+ mShowingNotifyDialog(false)
{
// Set up the factory callbacks.
// Roles sub tabs
@@ -117,6 +102,10 @@ LLPanelGroup::LLPanelGroup()
LLPanelGroup::~LLPanelGroup()
{
LLGroupMgr::getInstance()->removeObserver(this);
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
}
void LLPanelGroup::onOpen(const LLSD& key)
@@ -167,24 +156,24 @@ BOOL LLPanelGroup::postBuild()
button->setVisible(true);
button->setEnabled(false);
+ button = getChild<LLButton>("btn_call");
+ button->setClickedCallback(onBtnGroupCallClicked, this);
- button = getChild<LLButton>("btn_join");
- button->setVisible(false);
- button->setEnabled(true);
+ button = getChild<LLButton>("btn_chat");
+ button->setClickedCallback(onBtnGroupChatClicked, this);
button = getChild<LLButton>("btn_cancel");
button->setVisible(false); button->setEnabled(true);
button = getChild<LLButton>("btn_refresh");
button->setClickedCallback(onBtnRefresh, this);
- button->setVisible(mAllowEdit);
getChild<LLButton>("btn_create")->setVisible(false);
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL);
- childSetCommitCallback("btn_join",boost::bind(&LLPanelGroup::onBtnJoin,this),NULL);
+
childSetCommitCallback("btn_cancel",boost::bind(&LLPanelGroup::onBtnCancel,this),NULL);
LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel");
@@ -198,7 +187,19 @@ BOOL LLPanelGroup::postBuild()
if(panel_land) mTabs.push_back(panel_land);
if(panel_general)
+ {
panel_general->setupCtrls(this);
+ button = panel_general->getChild<LLButton>("btn_join");
+ button->setVisible(false);
+ button->setEnabled(true);
+
+ mButtonJoin = button;
+ mButtonJoin->setCommitCallback(boost::bind(&LLPanelGroup::onBtnJoin,this));
+
+ mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text");
+ }
+
+ gVoiceClient->addObserver(this);
return TRUE;
}
@@ -231,6 +232,8 @@ void LLPanelGroup::reposButtons()
reposButton("btn_create");
reposButton("btn_refresh");
reposButton("btn_cancel");
+ reposButton("btn_chat");
+ reposButton("btn_call");
}
void LLPanelGroup::reshape(S32 width, S32 height, BOOL called_from_parent )
@@ -262,7 +265,7 @@ void LLPanelGroup::onBtnCreate()
{
LLSD args;
args["MESSAGE"] = apply_mesg;
- LLNotifications::instance().add("GenericAlert", args);
+ LLNotificationsUtil::add("GenericAlert", args);
}
}
@@ -278,6 +281,18 @@ void LLPanelGroup::onBtnApply(void* user_data)
self->apply();
}
+void LLPanelGroup::onBtnGroupCallClicked(void* user_data)
+{
+ LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
+ self->callGroup();
+}
+
+void LLPanelGroup::onBtnGroupChatClicked(void* user_data)
+{
+ LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
+ self->chatGroup();
+}
+
void LLPanelGroup::onBtnJoin()
{
lldebugs << "joining group: " << mID << llendl;
@@ -297,6 +312,17 @@ void LLPanelGroup::changed(LLGroupChange gc)
update(gc);
}
+// virtual
+void LLPanelGroup::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
+ {
+ return;
+ }
+
+ childSetEnabled("btn_call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+}
+
void LLPanelGroup::notifyObservers()
{
changed(GC_ALL);
@@ -308,16 +334,14 @@ void LLPanelGroup::update(LLGroupChange gc)
if(gdatap)
{
childSetValue("group_name", gdatap->mName);
-
- LLButton* btn_join = getChild<LLButton>("btn_join");
- LLUICtrl* join_text = getChild<LLUICtrl>("join_cost_text");
-
+ childSetToolTip("group_name",gdatap->mName);
+
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(mID,agent_gdatap);
bool join_btn_visible = !is_member && gdatap->mOpenEnrollment;
- btn_join->setVisible(join_btn_visible);
- join_text->setVisible(join_btn_visible);
+ mButtonJoin->setVisible(join_btn_visible);
+ mJoinText->setVisible(join_btn_visible);
if(join_btn_visible)
{
@@ -333,7 +357,7 @@ void LLPanelGroup::update(LLGroupChange gc)
{
fee_buff = getString("group_join_free", string_args);
}
- childSetValue("join_cost_text",fee_buff);
+ mJoinText->setValue(fee_buff);
}
}
}
@@ -354,13 +378,18 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
if(gdatap)
+ {
childSetValue("group_name", gdatap->mName);
+ childSetToolTip("group_name",gdatap->mName);
+ }
LLButton* button_apply = findChild<LLButton>("btn_apply");
LLButton* button_refresh = findChild<LLButton>("btn_refresh");
LLButton* button_create = findChild<LLButton>("btn_create");
- LLButton* button_join = findChild<LLButton>("btn_join");
+
LLButton* button_cancel = findChild<LLButton>("btn_cancel");
+ LLButton* button_call = findChild<LLButton>("btn_call");
+ LLButton* button_chat = findChild<LLButton>("btn_chat");
bool is_null_group_id = group_id == LLUUID::null;
@@ -374,6 +403,11 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(button_cancel)
button_cancel->setVisible(!is_null_group_id);
+ if(button_call)
+ button_call->setVisible(!is_null_group_id);
+ if(button_chat)
+ button_chat->setVisible(!is_null_group_id);
+
getChild<LLUICtrl>("prepend_founded_by")->setVisible(!is_null_group_id);
LLAccordionCtrl* tab_ctrl = findChild<LLAccordionCtrl>("group_accordion");
@@ -389,8 +423,8 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(!tab_general || !tab_roles || !tab_notices || !tab_land)
return;
- if(button_join)
- button_join->setVisible(false);
+ if(mButtonJoin)
+ mButtonJoin->setVisible(false);
if(is_null_group_id)//creating new group
@@ -405,12 +439,17 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(tab_land->getDisplayChildren())
tab_land->changeOpenClose(tab_land->getDisplayChildren());
- tab_roles->canOpenClose(false);
- tab_notices->canOpenClose(false);
- tab_land->canOpenClose(false);
+ tab_roles->setVisible(false);
+ tab_notices->setVisible(false);
+ tab_land->setVisible(false);
getChild<LLUICtrl>("group_name")->setVisible(false);
getChild<LLUICtrl>("group_name_editor")->setVisible(true);
+
+ if(button_call)
+ button_call->setVisible(false);
+ if(button_chat)
+ button_chat->setVisible(false);
}
else
{
@@ -425,19 +464,30 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(tab_land->getDisplayChildren())
tab_land->changeOpenClose(tab_land->getDisplayChildren());
}
+
+ LLGroupData agent_gdatap;
+ bool is_member = gAgent.getGroupData(mID,agent_gdatap);
- tab_roles->canOpenClose(true);
- tab_notices->canOpenClose(true);
- tab_land->canOpenClose(true);
+ tab_roles->setVisible(is_member);
+ tab_notices->setVisible(is_member);
+ tab_land->setVisible(is_member);
getChild<LLUICtrl>("group_name")->setVisible(true);
getChild<LLUICtrl>("group_name_editor")->setVisible(false);
+
+ if(button_apply)
+ button_apply->setVisible(is_member);
+ if(button_call)
+ button_call->setVisible(is_member);
+ if(button_chat)
+ button_chat->setVisible(is_member);
}
reposButtons();
+ update(GC_ALL);//show/hide "join" button if data is already ready
}
-bool LLPanelGroup::apply(LLPanelGroupTab* tab)
+bool LLPanelGroup::apply(LLPanelGroupTab* tab)
{
if(!tab)
return false;
@@ -448,13 +498,18 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)
std::string apply_mesg;
if(tab->apply( apply_mesg ) )
+ {
+ //we skip refreshing group after ew manually apply changes since its very annoying
+ //for those who are editing group
+ mSkipRefresh = TRUE;
return true;
+ }
if ( !apply_mesg.empty() )
{
LLSD args;
args["MESSAGE"] = apply_mesg;
- LLNotifications::instance().add("GenericAlert", args);
+ LLNotificationsUtil::add("GenericAlert", args);
}
return false;
}
@@ -480,16 +535,26 @@ void LLPanelGroup::draw()
childEnable("btn_refresh");
}
- bool enable = false;
- std::string mesg;
- for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
- enable = enable || (*it)->needsApply(mesg);
+ LLButton* button_apply = findChild<LLButton>("btn_apply");
+
+ if(button_apply && button_apply->getVisible())
+ {
+ bool enable = false;
+ std::string mesg;
+ for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
+ enable = enable || (*it)->needsApply(mesg);
- childSetEnabled("btn_apply", enable);
+ childSetEnabled("btn_apply", enable);
+ }
}
void LLPanelGroup::refreshData()
{
+ if(mSkipRefresh)
+ {
+ mSkipRefresh = FALSE;
+ return;
+ }
LLGroupMgr::getInstance()->clearGroupData(getID());
setGroupID(getID());
@@ -500,12 +565,21 @@ void LLPanelGroup::refreshData()
mRefreshTimer.setTimerExpirySec(5);
}
+void LLPanelGroup::callGroup()
+{
+ LLGroupActions::startCall(getID());
+}
+
+void LLPanelGroup::chatGroup()
+{
+ LLGroupActions::startIM(getID());
+}
void LLPanelGroup::showNotice(const std::string& subject,
- const std::string& message,
- const bool& has_inventory,
- const std::string& inventory_name,
- LLOfferInfo* inventory_offer)
+ const std::string& message,
+ const bool& has_inventory,
+ const std::string& inventory_name,
+ LLOfferInfo* inventory_offer)
{
LLPanelGroupNotices* panel_notices = findChild<LLPanelGroupNotices>("group_notices_tab_panel");
if(!panel_notices)
@@ -551,3 +625,69 @@ void LLPanelGroup::showNotice(const std::string& subject,
}
+bool LLPanelGroup::canClose()
+{
+ if(getVisible() == false)
+ return true;
+
+ bool need_save = false;
+ std::string mesg;
+ for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
+ if(need_save|=(*it)->needsApply(mesg))
+ break;
+ if(!need_save)
+ return false;
+ // If no message was provided, give a generic one.
+ if (mesg.empty())
+ {
+ mesg = mDefaultNeedsApplyMesg;
+ }
+ // Create a notify box, telling the user about the unapplied tab.
+ LLSD args;
+ args["NEEDS_APPLY_MESSAGE"] = mesg;
+ args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
+
+ LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2));
+
+ mShowingNotifyDialog = true;
+
+ return false;
+}
+
+bool LLPanelGroup::notifyChildren(const LLSD& info)
+{
+ if(info.has("request") && mID.isNull() )
+ {
+ std::string str_action = info["request"];
+
+ if (str_action == "quit" )
+ {
+ canClose();
+ return true;
+ }
+ if(str_action == "wait_quit")
+ return mShowingNotifyDialog;
+ }
+ return false;
+}
+bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ mShowingNotifyDialog = false;
+ switch (option)
+ {
+ case 0: // "Apply Changes"
+ apply();
+ break;
+ case 1: // "Ignore Changes"
+ break;
+ case 2: // "Cancel"
+ default:
+ // Do nothing. The user is canceling the action.
+ // If we were quitting, we didn't really mean it.
+ LLAppViewer::instance()->abortQuit();
+ break;
+ }
+ return false;
+}
+
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 5c7b0ddd06..136868a60d 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -35,6 +35,7 @@
#include "llgroupmgr.h"
#include "llpanel.h"
#include "lltimer.h"
+#include "llvoiceclient.h"
struct LLOfferInfo;
@@ -47,7 +48,8 @@ class LLAgent;
class LLPanelGroup : public LLPanel,
- public LLGroupMgrObserver
+ public LLGroupMgrObserver,
+ public LLVoiceClientStatusObserver
{
public:
LLPanelGroup();
@@ -64,6 +66,10 @@ public:
// Group manager observer trigger.
virtual void changed(LLGroupChange gc);
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the call
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
void showNotice(const std::string& subject,
const std::string& message,
const bool& has_inventory,
@@ -74,12 +80,11 @@ public:
bool apply();
void refreshData();
+ void callGroup();
+ void chatGroup();
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- void setAllowEdit(BOOL v) { mAllowEdit = v; }
-
-
static void refreshCreatedGroup(const LLUUID& group_id);
static void showNotice(const std::string& subject,
@@ -89,7 +94,10 @@ public:
const std::string& inventory_name,
LLOfferInfo* inventory_offer);
-
+
+ bool notifyChildren (const LLSD& info);
+ bool handleNotifyCallback(const LLSD&, const LLSD&);
+
protected:
virtual void update(LLGroupChange gc);
@@ -100,6 +108,8 @@ protected:
static void onBtnApply(void*);
static void onBtnRefresh(void*);
+ static void onBtnGroupCallClicked(void*);
+ static void onBtnGroupChatClicked(void*);
void reposButton(const std::string& name);
void reposButtons();
@@ -107,16 +117,22 @@ protected:
protected:
bool apply(LLPanelGroupTab* tab);
+ bool canClose();
+
+ bool mShowingNotifyDialog;
LLTimer mRefreshTimer;
- BOOL mAllowEdit;
+ BOOL mSkipRefresh;
std::string mDefaultNeedsApplyMesg;
std::string mWantApplyMesg;
std::vector<LLPanelGroupTab* > mTabs;
+ LLButton* mButtonJoin;
+ LLUICtrl* mJoinText;
+
};
class LLPanelGroupTab : public LLPanel
@@ -148,19 +164,11 @@ public:
// Triggered when group information changes in the group manager.
virtual void update(LLGroupChange gc) { }
- // This is the text to be displayed when a help button is pressed.
- virtual std::string getHelpText() const { return mHelpText; }
-
- // Display anything returned by getHelpText
- void handleClickHelp();
-
// This just connects the help button callback.
virtual BOOL postBuild();
virtual BOOL isVisibleByAgent(LLAgent* agentp);
- void setAllowEdit(BOOL v) { mAllowEdit = v; }
-
virtual void setGroupID(const LLUUID& id) {mGroupID = id;};
void notifyObservers() {};
@@ -171,11 +179,8 @@ public:
protected:
LLUUID mGroupID;
- std::string mHelpText;
-
BOOL mAllowEdit;
BOOL mHasModal;
-
};
#endif // LL_LLPANELGROUP_H
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 1c2875bf46..555e277ce5 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -48,6 +48,7 @@
#include "lllineeditor.h"
#include "llnamebox.h"
#include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
#include "llscrolllistitem.h"
#include "llspinctrl.h"
#include "lltextbox.h"
@@ -205,14 +206,19 @@ BOOL LLPanelGroupGeneral::postBuild()
void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
{
- mInsignia = panel_group->getChild<LLTextureCtrl>("insignia");
+ mInsignia = getChild<LLTextureCtrl>("insignia");
if (mInsignia)
{
mInsignia->setCommitCallback(onCommitAny, this);
mDefaultIconID = mInsignia->getImageAssetID();
}
- mFounderName = panel_group->getChild<LLNameBox>("founder_name");
+ mFounderName = getChild<LLNameBox>("founder_name");
+
+
mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
+ mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII );
+
+
}
// static
@@ -359,7 +365,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
if(mComboMature &&
mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
{
- LLNotifications::instance().add("SetGroupMature", LLSD(), LLSD(),
+ LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(),
boost::bind(&LLPanelGroupGeneral::confirmMatureApply, this, _1, _2));
return false;
}
@@ -378,7 +384,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
return false;
}
- LLNotifications::instance().add("CreateGroupCost", LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
+ LLNotificationsUtil::add("CreateGroupCost", LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
return false;
}
@@ -458,7 +464,7 @@ void LLPanelGroupGeneral::cancel()
// invoked from callbackConfirmMature
bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// 0 == Yes
// 1 == No
// 2 == Cancel
@@ -481,7 +487,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
{
LLSD args;
args["MESSAGE"] = mesg;
- LLNotifications::instance().add("GenericAlert", args);
+ LLNotificationsUtil::add("GenericAlert", args);
}
return ret;
@@ -490,7 +496,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
// static
bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0:
@@ -578,7 +584,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
}
}
- mComboActiveTitle->resetDirty();
}
// If this was just a titles update, we are done.
@@ -593,8 +598,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
{
mCtrlShowInGroupList->set(gdatap->mShowInList);
mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident);
- mCtrlShowInGroupList->resetDirty();
-
}
if (mComboMature)
{
@@ -608,19 +611,16 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
}
mComboMature->setEnabled(mAllowEdit && can_change_ident);
mComboMature->setVisible( !gAgent.isTeen() );
- mComboMature->resetDirty();
}
if (mCtrlOpenEnrollment)
{
mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment);
mCtrlOpenEnrollment->setEnabled(mAllowEdit && can_change_member_opts);
- mCtrlOpenEnrollment->resetDirty();
}
if (mCtrlEnrollmentFee)
{
mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0);
mCtrlEnrollmentFee->setEnabled(mAllowEdit && can_change_member_opts);
- mCtrlEnrollmentFee->resetDirty();
}
if (mSpinEnrollmentFee)
@@ -630,7 +630,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
mSpinEnrollmentFee->setEnabled( mAllowEdit &&
(fee > 0) &&
can_change_member_opts);
- mSpinEnrollmentFee->resetDirty();
}
if (mCtrlReceiveNotices)
{
@@ -639,7 +638,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
{
mCtrlReceiveNotices->setEnabled(mAllowEdit);
}
- mCtrlReceiveNotices->resetDirty();
}
@@ -663,7 +661,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
if (mEditCharter)
{
mEditCharter->setText(gdatap->mCharter);
- mEditCharter->resetDirty();
}
if (mListVisibleMembers)
@@ -686,11 +683,14 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
LLSD row;
row["columns"][0]["value"] = pending.str();
+ row["columns"][0]["column"] = "name";
mListVisibleMembers->setEnabled(FALSE);
mListVisibleMembers->addElement(row);
}
}
+
+ resetDirty();
}
void LLPanelGroupGeneral::updateMembers()
@@ -736,9 +736,11 @@ void LLPanelGroupGeneral::updateMembers()
row["columns"][1]["value"] = member->getTitle();
row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL";
row["columns"][1]["font"]["style"] = style;
+
+ std::string status = member->getOnlineStatus();
- row["columns"][2]["column"] = "online";
- row["columns"][2]["value"] = member->getOnlineStatus();
+ row["columns"][2]["column"] = "status";
+ row["columns"][2]["value"] = status;
row["columns"][2]["font"]["name"] = "SANSSERIF_SMALL";
row["columns"][2]["font"]["style"] = style;
@@ -851,6 +853,7 @@ void LLPanelGroupGeneral::reset()
{
LLSD row;
row["columns"][0]["value"] = "no members yet";
+ row["columns"][0]["column"] = "name";
mListVisibleMembers->deleteAllItems();
mListVisibleMembers->setEnabled(FALSE);
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index c5eaa34204..05261a65de 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,10 +36,12 @@
#include "llagent.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
+#include "llcallingcard.h"
#include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
#include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
#include "llscrolllistitem.h"
#include "llspinctrl.h"
#include "lltextbox.h"
@@ -164,7 +166,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
{
LLSD args;
args["MESSAGE"] = mOwnerWarning;
- LLNotifications::instance().add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2));
+ LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2));
return; // we'll be called again if user confirms
}
}
@@ -190,7 +192,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
{
LLSD msg;
msg["MESSAGE"] = mAlreadyInGroup;
- LLNotifications::instance().add("GenericAlert", msg);
+ LLNotificationsUtil::add("GenericAlert", msg);
}
//then close
@@ -199,7 +201,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
bool LLPanelGroupInvite::impl::inviteOwnerCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
@@ -291,8 +293,8 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)
LLFloater* parentp;
parentp = gFloaterView->getParentFloater(panelp);
- parentp->addDependentFloater(LLFloaterAvatarPicker::show(callbackAddUsers,
- panelp->mImplementation,
+ parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1, _2,
+ panelp->mImplementation),
TRUE));
}
}
@@ -404,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
{
LLUUID agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
+ std::string fullname;
if(dest && dest->isAvatar())
{
- std::string fullname;
- LLSD args;
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
if(nvfirst && nvlast)
{
- args["FIRST"] = std::string(nvfirst->getString());
- args["LAST"] = std::string(nvlast->getString());
fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
}
if (!fullname.empty())
@@ -426,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
names.push_back("(Unknown)");
}
}
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ if (!gCacheName->getFullName(agent_id, fullname))
+ {
+ // actually it should happen, just in case
+ gCacheName->get(LLUUID(agent_id), false, boost::bind(
+ &LLPanelGroupInvite::addUserCallback, this, _1, _2,
+ _3));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(fullname);
+ }
+ }
+ }
}
mImplementation->addUsers(names, agent_ids);
}
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+ std::vector<std::string> names;
+ std::vector<LLUUID> agent_ids;
+ std::string full_name = first_name + " " + last_name;
+ agent_ids.push_back(id);
+ names.push_back(first_name + " " + last_name);
+
+ mImplementation->addUsers(names, agent_ids);
+}
void LLPanelGroupInvite::draw()
{
LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488a..b095dd2395 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -43,6 +43,10 @@ public:
~LLPanelGroupInvite();
void addUsers(std::vector<LLUUID>& agent_ids);
+ /**
+ * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ */
+ void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
void clear();
void update();
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 0ce85818dd..6210973dae 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -38,6 +38,7 @@
#include "llinventory.h"
#include "llviewerinventory.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llfloaterinventory.h"
#include "llagent.h"
@@ -57,7 +58,7 @@
#include "roles_constants.h"
#include "llviewerwindow.h"
#include "llviewermessage.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices");
@@ -303,6 +304,9 @@ BOOL LLPanelGroupNotices::postBuild()
void LLPanelGroupNotices::activate()
{
+ if(mNoticesList)
+ mNoticesList->deleteAllItems();
+
BOOL can_send = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_SEND);
BOOL can_receive = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_RECEIVE);
@@ -371,7 +375,7 @@ void LLPanelGroupNotices::onClickSendMessage(void* data)
if (self->mCreateSubject->getText().empty())
{
// Must supply a subject
- LLNotifications::instance().add("MustSpecifyGroupNoticeSubject");
+ LLNotificationsUtil::add("MustSpecifyGroupNoticeSubject");
return;
}
send_group_notice(
@@ -509,6 +513,9 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
S32 i=0;
S32 count = msg->getNumberOfBlocks("Data");
+
+ mNoticesList->setEnabled(TRUE);
+
for (;i<count;++i)
{
msg->getUUID("Data","NoticeID",id,i);
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 71486c908c..c6287472fe 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,7 +42,8 @@
#include "lliconctrl.h"
#include "lllineeditor.h"
#include "llnamelistctrl.h"
-#include "llnotify.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llpanelgrouproles.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -231,7 +232,7 @@ BOOL LLPanelGroupRoles::attemptTransition()
LLSD args;
args["NEEDS_APPLY_MESSAGE"] = mesg;
args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
- LLNotifications::instance().add("PanelGroupApply", args, LLSD(),
+ LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),
boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));
mHasModal = TRUE;
// We need to reselect the current tab, since it isn't finished.
@@ -275,7 +276,7 @@ void LLPanelGroupRoles::transitionToTab()
bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
mHasModal = FALSE;
switch (option)
{
@@ -291,7 +292,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
mHasModal = TRUE;
LLSD args;
args["MESSAGE"] = apply_mesg;
- LLNotifications::instance().add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2));
+ LLNotificationsUtil::add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2));
}
// Skip switching tabs.
break;
@@ -361,20 +362,6 @@ void LLPanelGroupRoles::cancel()
panelp->cancel();
}
-// Pass all of these messages to the currently visible sub tab.
-std::string LLPanelGroupRoles::getHelpText() const
-{
- LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
- if (panelp)
- {
- return panelp->getHelpText();
- }
- else
- {
- return mHelpText;
- }
-}
-
void LLPanelGroupRoles::update(LLGroupChange gc)
{
if (mGroupID.isNull()) return;
@@ -465,6 +452,7 @@ LLPanelGroupSubTab::LLPanelGroupSubTab()
: LLPanelGroupTab(),
mHeader(NULL),
mFooter(NULL),
+ mActivated(false),
mSearchEditor(NULL)
{
}
@@ -473,17 +461,8 @@ LLPanelGroupSubTab::~LLPanelGroupSubTab()
{
}
-BOOL LLPanelGroupSubTab::postBuild()
-{
- // Hook up the search widgets.
- bool recurse = true;
- mSearchEditor = getChild<LLFilterEditor>("filter_input", recurse);
-
- if (!mSearchEditor)
- return FALSE;
-
- mSearchEditor->setCommitCallback(boost::bind(&LLPanelGroupSubTab::setSearchFilter, this, _2));
-
+BOOL LLPanelGroupSubTab::postBuildSubTab(LLView* root)
+{
// Get icons for later use.
mActionIcons.clear();
@@ -501,6 +480,19 @@ BOOL LLPanelGroupSubTab::postBuild()
{
mActionIcons["partial"] = getString("power_partial_icon");
}
+ return TRUE;
+}
+
+BOOL LLPanelGroupSubTab::postBuild()
+{
+ // Hook up the search widgets.
+ bool recurse = true;
+ mSearchEditor = getChild<LLFilterEditor>("filter_input", recurse);
+
+ if (!mSearchEditor)
+ return FALSE;
+
+ mSearchEditor->setCommitCallback(boost::bind(&LLPanelGroupSubTab::setSearchFilter, this, _2));
return LLPanelGroupTab::postBuild();
}
@@ -513,13 +505,14 @@ void LLPanelGroupSubTab::setGroupID(const LLUUID& id)
mSearchEditor->clear();
setSearchFilter("");
}
+
+ mActivated = false;
}
void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
{
if(mSearchFilter == filter)
return;
- lldebugs << "LLPanelGroupSubTab::setSearchFilter() ==> '" << filter << "'" << llendl;
mSearchFilter = filter;
LLStringUtil::toLower(mSearchFilter);
update(GC_ALL);
@@ -527,13 +520,11 @@ void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
void LLPanelGroupSubTab::activate()
{
- lldebugs << "LLPanelGroupSubTab::activate()" << llendl;
setOthersVisible(TRUE);
}
void LLPanelGroupSubTab::deactivate()
{
- lldebugs << "LLPanelGroupSubTab::deactivate()" << llendl;
setOthersVisible(FALSE);
}
@@ -543,19 +534,11 @@ void LLPanelGroupSubTab::setOthersVisible(BOOL b)
{
mHeader->setVisible( b );
}
- else
- {
- llwarns << "LLPanelGroupSubTab missing header!" << llendl;
- }
if (mFooter)
{
mFooter->setVisible( b );
}
- else
- {
- llwarns << "LLPanelGroupSubTab missing footer!" << llendl;
- }
}
bool LLPanelGroupSubTab::matchesActionSearchFilter(std::string action)
@@ -580,7 +563,6 @@ bool LLPanelGroupSubTab::matchesActionSearchFilter(std::string action)
void LLPanelGroupSubTab::buildActionsList(LLScrollListCtrl* ctrl,
U64 allowed_by_some,
U64 allowed_by_all,
- icon_map_t& icons,
LLUICtrl::commit_callback_t commit_callback,
BOOL show_all,
BOOL filter,
@@ -601,7 +583,6 @@ void LLPanelGroupSubTab::buildActionsList(LLScrollListCtrl* ctrl,
allowed_by_some,
allowed_by_all,
(*ras_it),
- icons,
commit_callback,
show_all,
filter,
@@ -613,7 +594,6 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
U64 allowed_by_some,
U64 allowed_by_all,
LLRoleActionSet* action_set,
- icon_map_t& icons,
LLUICtrl::commit_callback_t commit_callback,
BOOL show_all,
BOOL filter,
@@ -627,26 +607,26 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
LLSD row;
row["columns"][0]["column"] = "icon";
- icon_map_t::iterator iter = icons.find("folder");
- if (iter != icons.end())
+ row["columns"][0]["type"] = "icon";
+
+ icon_map_t::iterator iter = mActionIcons.find("folder");
+ if (iter != mActionIcons.end())
{
- row["columns"][0]["type"] = "icon";
row["columns"][0]["value"] = (*iter).second;
}
row["columns"][1]["column"] = "action";
+ row["columns"][1]["type"] = "text";
row["columns"][1]["value"] = action_set->mActionSetData->mName;
row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][1]["font"]["style"] = "BOLD";
+
LLScrollListItem* title_row = ctrl->addElement(row, ADD_BOTTOM, action_set->mActionSetData);
- LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(title_row->getColumn(1));
+ LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(title_row->getColumn(2)); //?? I have no idea fix getColumn(1) return column spacer...
if (name_textp)
name_textp->setFontStyle(LLFontGL::BOLD);
-
-
bool category_matches_filter = (filter) ? matchesActionSearchFilter(action_set->mActionSetData->mName) : true;
std::vector<LLRoleAction*>::iterator ra_it = action_set->mActions.begin();
@@ -699,8 +679,8 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
{
if (show_full_strength)
{
- icon_map_t::iterator iter = icons.find("full");
- if (iter != icons.end())
+ icon_map_t::iterator iter = mActionIcons.find("full");
+ if (iter != mActionIcons.end())
{
row["columns"][column_index]["column"] = "checkbox";
row["columns"][column_index]["type"] = "icon";
@@ -710,8 +690,8 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
}
else
{
- icon_map_t::iterator iter = icons.find("partial");
- if (iter != icons.end())
+ icon_map_t::iterator iter = mActionIcons.find("partial");
+ if (iter != mActionIcons.end())
{
row["columns"][column_index]["column"] = "checkbox";
row["columns"][column_index]["type"] = "icon";
@@ -805,6 +785,8 @@ LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()
BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
{
+ LLPanelGroupSubTab::postBuildSubTab(root);
+
// Upcast parent so we can ask it for sibling controls.
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
@@ -885,10 +867,12 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
for (itor = selection.begin();
itor != selection.end(); ++itor)
{
- selected_members.push_back( (*itor)->getUUID() );
+ LLUUID member_id = (*itor)->getUUID();
+
+ selected_members.push_back( member_id );
// Get this member's power mask including any unsaved changes
- U64 powers = getAgentPowersBasedOnRoleChanges((*itor)->getUUID());
+ U64 powers = getAgentPowersBasedOnRoleChanges( member_id );
allowed_by_all &= powers;
allowed_by_some |= powers;
@@ -901,7 +885,6 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
buildActionsList(mAllowedActionsList,
allowed_by_some,
allowed_by_all,
- mActionIcons,
NULL,
FALSE,
FALSE,
@@ -1033,6 +1016,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
//last owner. We should check for this special case
// -jwolk
check->setEnabled(cb_enable);
+ item->setEnabled(cb_enable);
}
}
else
@@ -1109,15 +1093,39 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
for (itor = selection.begin() ;
itor != selection.end(); ++itor)
{
- selected_members.push_back((*itor)->getUUID());
+ LLUUID member_id = (*itor)->getUUID();
+ selected_members.push_back( member_id );
}
mMembersList->deleteSelectedItems();
+ sendEjectNotifications(mGroupID, selected_members);
+
LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID,
selected_members);
}
+void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members)
+{
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
+
+ if (group_data)
+ {
+ for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i)
+ {
+ LLSD args;
+ std::string name;
+
+ gCacheName->getFullName(*i, name);
+
+ args["AVATAR_NAME"] = name;
+ args["GROUP_NAME"] = group_data->mName;
+
+ LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+ }
+ }
+}
+
void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
LLRoleMemberChangeType type)
{
@@ -1142,6 +1150,7 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
for (std::vector<LLScrollListItem*>::iterator itor = selection.begin() ;
itor != selection.end(); ++itor)
{
+
member_id = (*itor)->getUUID();
//see if we requested a change for this member before
@@ -1201,7 +1210,6 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
buildActionsList(mAllowedActionsList,
powers_some_have,
powers_all_have,
- mActionIcons,
NULL,
FALSE,
FALSE,
@@ -1234,15 +1242,19 @@ void LLPanelGroupMembersSubTab::handleMemberDoubleClick()
LLScrollListItem* selected = mMembersList->getFirstSelected();
if (selected)
{
- LLAvatarActions::showProfile(selected->getUUID());
+ LLUUID member_id = selected->getUUID();
+ LLAvatarActions::showProfile( member_id );
}
}
void LLPanelGroupMembersSubTab::activate()
{
LLPanelGroupSubTab::activate();
-
- update(GC_ALL);
+ if(!mActivated)
+ {
+ update(GC_ALL);
+ mActivated = true;
+ }
}
void LLPanelGroupMembersSubTab::deactivate()
@@ -1293,7 +1305,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)
{
mHasModal = TRUE;
args["ROLE_NAME"] = rd.mRoleName;
- LLNotifications::instance().add("AddGroupOwnerWarning",
+ LLNotificationsUtil::add("AddGroupOwnerWarning",
args,
LLSD(),
boost::bind(&LLPanelGroupMembersSubTab::addOwnerCB, this, _1, _2));
@@ -1318,7 +1330,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)
bool LLPanelGroupMembersSubTab::addOwnerCB(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
mHasModal = FALSE;
if (0 == option)
@@ -1557,9 +1569,6 @@ void LLPanelGroupMembersSubTab::updateMembers()
mPendingMemberUpdate = FALSE;
// Rebuild the members list.
- mMembersList->deleteAllItems();
-
- lldebugs << "LLPanelGroupMembersSubTab::updateMembers()" << llendl;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
@@ -1576,7 +1585,12 @@ void LLPanelGroupMembersSubTab::updateMembers()
{
return;
}
-
+
+ //cleanup list only for first iretation
+ if(mMemberProgress == gdatap->mMembers.begin())
+ mMembersList->deleteAllItems();
+
+
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
S32 i = 0;
@@ -1616,7 +1630,9 @@ void LLPanelGroupMembersSubTab::updateMembers()
row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus();
row["columns"][2]["font"] = "SANSSERIF_SMALL";
- mMembersList->addElement(row);//, ADD_SORTED);
+ LLScrollListItem* member = mMembersList->addElement(row);//, ADD_SORTED);
+
+ LLUUID id = member->getUUID();
mHasMatch = TRUE;
}
}
@@ -1672,6 +1688,8 @@ LLPanelGroupRolesSubTab::~LLPanelGroupRolesSubTab()
BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
{
+ LLPanelGroupSubTab::postBuildSubTab(root);
+
// Upcast parent so we can ask it for sibling controls.
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
@@ -1982,7 +2000,6 @@ void LLPanelGroupRolesSubTab::handleRoleSelect()
buildActionsList(mAllowedActionsList,
rd.mRolePowers,
0LL,
- mActionIcons,
boost::bind(&LLPanelGroupRolesSubTab::handleActionCheck, this, _1, false),
TRUE,
FALSE,
@@ -2140,7 +2157,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
{
warning = "AssignDangerousAbilityWarning";
}
- LLNotifications::instance().add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
+ LLNotificationsUtil::add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
}
else
{
@@ -2168,7 +2185,7 @@ bool LLPanelGroupRolesSubTab::addActionCB(const LLSD& notification, const LLSD&
mHasModal = FALSE;
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// User clicked "Yes"
@@ -2314,7 +2331,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()
{
LLSD args;
args["MESSAGE"] = mRemoveEveryoneTxt;
- LLNotifications::instance().add("GenericAlert", args);
+ LLNotificationsUtil::add("GenericAlert", args);
return;
}
@@ -2369,6 +2386,8 @@ LLPanelGroupActionsSubTab::~LLPanelGroupActionsSubTab()
BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)
{
+ LLPanelGroupSubTab::postBuildSubTab(root);
+
// Upcast parent so we can ask it for sibling controls.
LLPanelGroupRoles* parent = (LLPanelGroupRoles*) root;
@@ -2397,12 +2416,8 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)
void LLPanelGroupActionsSubTab::activate()
{
LLPanelGroupSubTab::activate();
- lldebugs << "LLPanelGroupActionsSubTab::activate()" << llendl;
- mActionList->deselectAllItems();
- mActionMembers->deleteAllItems();
- mActionRoles->deleteAllItems();
- mActionDescription->clear();
+ update(GC_ALL);
}
void LLPanelGroupActionsSubTab::deactivate()
@@ -2440,7 +2455,6 @@ void LLPanelGroupActionsSubTab::update(LLGroupChange gc)
buildActionsList(mActionList,
GP_ALL_POWERS,
GP_ALL_POWERS,
- mActionIcons,
NULL,
FALSE,
TRUE,
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index bd5fc1d235..eac22a6338 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -78,7 +78,6 @@ public:
bool onModalClose(const LLSD& notification, const LLSD& response);
// Most of these messages are just passed on to the current sub-tab.
- virtual std::string getHelpText() const;
virtual void activate();
virtual void deactivate();
virtual bool needsApply(std::string& mesg);
@@ -109,7 +108,7 @@ public:
virtual BOOL postBuild();
// This allows sub-tabs to collect child widgets from a higher level in the view hierarchy.
- virtual BOOL postBuildSubTab(LLView* root) { return TRUE; }
+ virtual BOOL postBuildSubTab(LLView* root);
virtual void setSearchFilter( const std::string& filter );
@@ -118,10 +117,15 @@ public:
// Helper functions
bool matchesActionSearchFilter(std::string action);
+
+
+ void setFooterEnabled(BOOL enable);
+
+ virtual void setGroupID(const LLUUID& id);
+protected:
void buildActionsList(LLScrollListCtrl* ctrl,
U64 allowed_by_some,
U64 allowed_by_all,
- icon_map_t& icons,
LLUICtrl::commit_callback_t commit_callback,
BOOL show_all,
BOOL filter,
@@ -130,15 +134,11 @@ public:
U64 allowed_by_some,
U64 allowed_by_all,
LLRoleActionSet* action_set,
- icon_map_t& icons,
LLUICtrl::commit_callback_t commit_callback,
BOOL show_all,
BOOL filter,
BOOL is_owner_role);
- void setFooterEnabled(BOOL enable);
-
- virtual void setGroupID(const LLUUID& id);
protected:
LLPanel* mHeader;
LLPanel* mFooter;
@@ -149,6 +149,8 @@ protected:
icon_map_t mActionIcons;
+ bool mActivated;
+
void setOthersVisible(BOOL b);
};
@@ -171,6 +173,7 @@ public:
static void onEjectMembers(void*);
void handleEjectMembers();
+ void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members);
static void onRoleCheck(LLUICtrl* check, void* user_data);
void handleRoleCheck(const LLUUID& role_id,
diff --git a/indra/newview/llpanelhome.cpp b/indra/newview/llpanelhome.cpp
new file mode 100644
index 0000000000..713d2d79b4
--- /dev/null
+++ b/indra/newview/llpanelhome.cpp
@@ -0,0 +1,79 @@
+/**
+* @file llpanelhome.cpp
+* @author Martin Reddy
+* @brief The Home side tray panel
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelhome.h"
+
+#include "llmediactrl.h"
+#include "llviewerhome.h"
+
+static LLRegisterPanelClassWrapper<LLPanelHome> t_home("panel_sidetray_home");
+
+LLPanelHome::LLPanelHome() :
+ LLPanel(),
+ LLViewerMediaObserver(),
+ mBrowser(NULL),
+ mFirstView(true)
+{
+}
+
+void LLPanelHome::onOpen(const LLSD& key)
+{
+ // display the home page the first time we open the panel
+ // *NOTE: this seems to happen during login. Can we avoid that?
+ if (mFirstView && mBrowser)
+ {
+ mBrowser->navigateHome();
+ }
+ mFirstView = false;
+}
+
+BOOL LLPanelHome::postBuild()
+{
+ mBrowser = getChild<LLMediaCtrl>("browser");
+ if (mBrowser)
+ {
+ // read the URL to display from settings.xml
+ std::string url = LLViewerHome::getHomeURL();
+
+ mBrowser->addObserver(this);
+ mBrowser->setTrusted(true);
+ mBrowser->setHomePageUrl(url);
+ }
+
+ return TRUE;
+}
+
+void LLPanelHome::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
+{
+}
diff --git a/indra/newview/llpanelhome.h b/indra/newview/llpanelhome.h
new file mode 100644
index 0000000000..dfeca45b29
--- /dev/null
+++ b/indra/newview/llpanelhome.h
@@ -0,0 +1,64 @@
+/**
+* @file llpanelhome.h
+* @author Martin Reddy
+* @brief The Home side tray panel
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLPANELHOME_H
+#define LL_LLPANELHOME_H
+
+#include "llpanel.h"
+#include "llsd.h"
+#include "llviewermediaobserver.h"
+
+class LLMediaCtrl;
+
+/**
+ * Base class for web-based Home side tray
+ */
+class LLPanelHome :
+ public LLPanel,
+ public LLViewerMediaObserver
+{
+public:
+ LLPanelHome();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);
+
+ LLMediaCtrl *mBrowser;
+ bool mFirstView;
+};
+
+#endif //LL_LLPANELHOME_H
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index f9eeaf1e9e..c34f0633b9 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
+#include "llfloaterreg.h"
+
#include "llpanelimcontrolpanel.h"
#include "llagent.h"
@@ -43,6 +45,9 @@
#include "llparticipantlist.h"
#include "llimview.h"
#include "llvoicechannel.h"
+#include "llsidetray.h"
+#include "llspeakers.h"
+#include "lltrans.h"
void LLPanelChatControlPanel::onCallButtonClicked()
{
@@ -54,40 +59,88 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()
gIMMgr->endCall(mSessionId);
}
-BOOL LLPanelChatControlPanel::postBuild()
+void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
{
- childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
- childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
+ LLFloaterReg::showInstance("voice_controls");
+}
- return TRUE;
+void LLPanelChatControlPanel::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
+ {
+ return;
+ }
+
+ updateCallButton();
}
-void LLPanelChatControlPanel::draw()
+void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
- // hide/show start call and end call buttons
- bool voice_enabled = LLVoiceClient::voiceEnabled();
+ updateButtons(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+}
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
- if (!session) return;
+void LLPanelChatControlPanel::updateCallButton()
+{
+ bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
- LLVoiceChannel* voice_channel = session->mVoiceChannel;
- if (voice_channel && voice_enabled)
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
+
+ if (!session)
{
- childSetVisible("end_call_btn", voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
- childSetVisible("call_btn", voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED);
+ childSetEnabled("call_btn", false);
+ return;
}
bool session_initialized = session->mSessionInitialized;
bool callback_enabled = session->mCallBackEnabled;
- LLViewerRegion* region = gAgent.getRegion();
- BOOL enable_connect = (region && region->getCapability("ChatSessionRequest") != "")
- && session_initialized
+ BOOL enable_connect = session_initialized
&& voice_enabled
&& callback_enabled;
childSetEnabled("call_btn", enable_connect);
+}
- LLPanel::draw();
+void LLPanelChatControlPanel::updateButtons(bool is_call_started)
+{
+ childSetVisible("end_call_btn_panel", is_call_started);
+ childSetVisible("voice_ctrls_btn_panel", is_call_started);
+ childSetVisible("call_btn_panel", ! is_call_started);
+ updateCallButton();
+
+}
+
+LLPanelChatControlPanel::~LLPanelChatControlPanel()
+{
+ mVoiceChannelStateChangeConnection.disconnect();
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+}
+
+BOOL LLPanelChatControlPanel::postBuild()
+{
+ childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
+ childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
+ childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));
+
+ gVoiceClient->addObserver(this);
+
+ return TRUE;
+}
+
+void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
+{
+ //Method is called twice for AdHoc and Group chat. Second time when server init reply received
+ mSessionId = session_id;
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionId);
+ if(voice_channel)
+ {
+ mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
+
+ //call (either p2p, group or ad-hoc) can be already in started state
+ updateButtons(voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
+ }
}
LLPanelIMControlPanel::LLPanelIMControlPanel()
@@ -96,6 +149,7 @@ LLPanelIMControlPanel::LLPanelIMControlPanel()
LLPanelIMControlPanel::~LLPanelIMControlPanel()
{
+ LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
}
BOOL LLPanelIMControlPanel::postBuild()
@@ -104,26 +158,39 @@ BOOL LLPanelIMControlPanel::postBuild()
childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this));
childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this));
+ childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this));
+ childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));
childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
+
+
return LLPanelChatControlPanel::postBuild();
}
+void LLPanelIMControlPanel::onTeleportButtonClicked()
+{
+ LLAvatarActions::offerTeleport(mAvatarID);
+}
+void LLPanelIMControlPanel::onPayButtonClicked()
+{
+ LLAvatarActions::pay(mAvatarID);
+}
+
void LLPanelIMControlPanel::onViewProfileButtonClicked()
{
- LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId());
+ LLAvatarActions::showProfile(mAvatarID);
}
void LLPanelIMControlPanel::onAddFriendButtonClicked()
{
LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName();
- LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name);
+ LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);
}
void LLPanelIMControlPanel::onShareButtonClicked()
{
- // *TODO: Implement
+ LLAvatarActions::share(mAvatarID);
}
void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
@@ -132,33 +199,57 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
LLIMModel& im_model = LLIMModel::instance();
- LLUUID avatar_id = im_model.getOtherParticipantID(session_id);
+ LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
+ mAvatarID = im_model.getOtherParticipantID(session_id);
+ LLAvatarTracker::instance().addParticularFriendObserver(mAvatarID, this);
// Disable "Add friend" button for friends.
- childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id));
+ childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
+
+ // Disable "Teleport" button if friend is offline
+ if(LLAvatarActions::isFriend(mAvatarID))
+ {
+ childSetEnabled("teleport_btn", LLAvatarTracker::instance().isBuddyOnline(mAvatarID));
+ }
- getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id);
+ getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
- // Disable profile button if participant is not realy SL avatar
+ // Disable most profile buttons if the participant is
+ // not really an SL avatar (e.g., an Avaline caller).
LLIMModel::LLIMSession* im_session =
im_model.findIMSession(session_id);
if( im_session && !im_session->mOtherParticipantIsAvatar )
+ {
childSetEnabled("view_profile_btn", FALSE);
+ childSetEnabled("add_friend_btn", FALSE);
+
+ childSetEnabled("share_btn", FALSE);
+ childSetEnabled("teleport_btn", FALSE);
+ childSetEnabled("pay_btn", FALSE);
+ }
}
+//virtual
+void LLPanelIMControlPanel::changed(U32 mask)
+{
+ childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
+
+ // Disable "Teleport" button if friend is offline
+ if(LLAvatarActions::isFriend(mAvatarID))
+ {
+ childSetEnabled("teleport_btn", LLAvatarTracker::instance().isBuddyOnline(mAvatarID));
+ }
+}
-LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id)
+LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
+mParticipantList(NULL)
{
- mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
}
BOOL LLPanelGroupControlPanel::postBuild()
{
childSetAction("group_info_btn", boost::bind(&LLPanelGroupControlPanel::onGroupInfoButtonClicked, this));
- mAvatarList = getChild<LLAvatarList>("speakers_list");
- mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList);
-
return LLPanelChatControlPanel::postBuild();
}
@@ -171,7 +262,9 @@ LLPanelGroupControlPanel::~LLPanelGroupControlPanel()
// virtual
void LLPanelGroupControlPanel::draw()
{
- mSpeakerManager->update(true);
+ // Need to resort the participant list if it's in sort by recent speaker order.
+ if (mParticipantList)
+ mParticipantList->updateRecentSpeakersOrder();
LLPanelChatControlPanel::draw();
}
@@ -180,12 +273,39 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked()
LLGroupActions::show(mGroupID);
}
+void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata)
+{
+ // TODO: Check this code when when sort order menu will be added. (EM)
+ if (false && !mParticipantList)
+ return;
+
+ std::string chosen_item = userdata.asString();
+
+ if (chosen_item == "sort_name")
+ {
+ mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME);
+ }
+
+}
+
+void LLPanelGroupControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+ LLPanelChatControlPanel::onVoiceChannelStateChanged(old_state, new_state);
+ mParticipantList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+}
void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
{
LLPanelChatControlPanel::setSessionId(session_id);
- mGroupID = LLIMModel::getInstance()->getOtherParticipantID(session_id);
+ mGroupID = session_id;
+
+ // for group and Ad-hoc chat we need to include agent into list
+ if(!mParticipantList)
+ {
+ LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ mParticipantList = new LLParticipantList(speaker_manager, getChild<LLAvatarList>("speakers_list"), true,false);
+ }
}
@@ -195,9 +315,7 @@ LLPanelAdHocControlPanel::LLPanelAdHocControlPanel(const LLUUID& session_id):LLP
BOOL LLPanelAdHocControlPanel::postBuild()
{
- mAvatarList = getChild<LLAvatarList>("speakers_list");
- mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList);
-
+ //We don't need LLPanelGroupControlPanel::postBuild() to be executed as there is no group_info_btn at AdHoc chat
return LLPanelChatControlPanel::postBuild();
}
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 220b7b14ba..ce8fc58e56 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -34,31 +34,49 @@
#define LL_LLPANELIMCONTROLPANEL_H
#include "llpanel.h"
+#include "llvoicechannel.h"
+#include "llcallingcard.h"
-class LLSpeakerMgr;
-class LLAvatarList;
class LLParticipantList;
-class LLPanelChatControlPanel : public LLPanel
+class LLPanelChatControlPanel
+ : public LLPanel
+ , public LLVoiceClientStatusObserver
{
public:
- LLPanelChatControlPanel() {};
- ~LLPanelChatControlPanel() {};
+ LLPanelChatControlPanel() :
+ mSessionId(LLUUID()) {};
+ ~LLPanelChatControlPanel();
virtual BOOL postBuild();
- virtual void draw();
void onCallButtonClicked();
void onEndCallButtonClicked();
+ void onOpenVoiceControlsClicked();
- virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the call
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
+ virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
+
+ void updateButtons(bool is_call_started);
+
+ // Enables/disables call button depending on voice availability
+ void updateCallButton();
+
+ virtual void setSessionId(const LLUUID& session_id);
+ const LLUUID& getSessionId() { return mSessionId; }
private:
LLUUID mSessionId;
+
+ // connection to voice channel state change signal
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
};
-class LLPanelIMControlPanel : public LLPanelChatControlPanel
+class LLPanelIMControlPanel : public LLPanelChatControlPanel, LLFriendObserver
{
public:
LLPanelIMControlPanel();
@@ -68,10 +86,15 @@ public:
void setSessionId(const LLUUID& session_id);
+ // LLFriendObserver trigger
+ virtual void changed(U32 mask);
+
private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
void onShareButtonClicked();
+ void onTeleportButtonClicked();
+ void onPayButtonClicked();
LLUUID mAvatarID;
};
@@ -90,12 +113,13 @@ public:
protected:
LLUUID mGroupID;
- LLSpeakerMgr* mSpeakerManager;
- LLAvatarList* mAvatarList;
+
LLParticipantList* mParticipantList;
private:
void onGroupInfoButtonClicked();
+ void onSortMenuItemClicked(const LLSD& userdata);
+ /*virtual*/ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
};
class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp
index bce5525a40..417a804834 100644
--- a/indra/newview/llpanelland.cpp
+++ b/indra/newview/llpanelland.cpp
@@ -70,7 +70,6 @@ BOOL LLPanelLandInfo::postBuild()
childSetAction("button subdivide land",onClickDivide,this);
childSetAction("button join land",onClickJoin,this);
childSetAction("button about land",onClickAbout,this);
- childSetAction("button show owners help", onShowOwnersHelp, this);
mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners");
childSetValue("checkbox show owners", gSavedSettings.getBOOL("ShowParcelOwners"));
@@ -265,8 +264,3 @@ void LLPanelLandInfo::onClickAbout(void*)
LLFloaterReg::showInstance("about_land");
}
-
-void LLPanelLandInfo::onShowOwnersHelp(void* user_data)
-{
- LLNotifications::instance().add("ShowOwnersHelp");
-}
diff --git a/indra/newview/llpanelland.h b/indra/newview/llpanelland.h
index 92fe313405..02e7e7bf38 100644
--- a/indra/newview/llpanelland.h
+++ b/indra/newview/llpanelland.h
@@ -60,7 +60,6 @@ protected:
static void onClickDivide(void*);
static void onClickJoin(void*);
static void onClickAbout(void*);
- static void onShowOwnersHelp(void*);
protected:
//LLTextBox* mTextPriceLabel;
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 920fca66f2..a92b4357ed 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -37,6 +37,7 @@
// viewer includes
#include "llmimetypes.h"
#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
#include "lluictrlfactory.h"
// library includes
@@ -83,8 +84,14 @@ BOOL LLPanelLandAudio::postBuild()
mCheckSoundLocal = getChild<LLCheckBoxCtrl>("check sound local");
childSetCommitCallback("check sound local", onCommitAny, this);
- mRadioVoiceChat = getChild<LLRadioGroup>("parcel_voice_channel");
- childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
+ mCheckParcelEnableVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel");
+ childSetCommitCallback("parcel_enable_voice_channel", onCommitAny, this);
+
+ // This one is always disabled so no need for a commit callback
+ mCheckEstateDisabledVoice = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_is_estate_disabled");
+
+ mCheckParcelVoiceLocal = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_local");
+ childSetCommitCallback("parcel_enable_voice_channel_local", onCommitAny, this);
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
@@ -118,20 +125,41 @@ void LLPanelLandAudio::refresh()
mMusicUrlCheck->set( parcel->getObscureMusic() );
mMusicUrlCheck->setEnabled( can_change_media );
- if(parcel->getParcelFlagAllowVoice())
+ bool allow_voice = parcel->getParcelFlagAllowVoice();
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (region && region->isVoiceEnabled())
{
- if(parcel->getParcelFlagUseEstateVoiceChannel())
- mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
- else
- mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
+ mCheckEstateDisabledVoice->setVisible(false);
+
+ mCheckParcelEnableVoice->setVisible(true);
+ mCheckParcelEnableVoice->setEnabled( can_change_media );
+ mCheckParcelEnableVoice->set(allow_voice);
+
+ mCheckParcelVoiceLocal->setEnabled( can_change_media && allow_voice );
}
else
{
- mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
+ // Voice disabled at estate level, overrides parcel settings
+ // Replace the parcel voice checkbox with a disabled one
+ // labelled with an explanatory message
+ mCheckEstateDisabledVoice->setVisible(true);
+
+ mCheckParcelEnableVoice->setVisible(false);
+ mCheckParcelEnableVoice->setEnabled(false);
+ mCheckParcelVoiceLocal->setEnabled(false);
}
- mRadioVoiceChat->setEnabled( can_change_media );
+ mCheckParcelEnableVoice->set(allow_voice);
+ mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
+ // don't display urls if you're not able to change it
+ // much requested change in forums so people can't 'steal' urls
+ // NOTE: bug#2009 means this is still vunerable - however, bug
+ // should be closed since this bug opens up major security issues elsewhere.
+ bool obscure_music = ! can_change_media && parcel->getObscureMusic();
+
+ mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
}
@@ -149,30 +177,11 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
- int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
std::string music_url = self->mMusicURLEdit->getText();
U8 obscure_music = self->mMusicUrlCheck->get();
-
- BOOL voice_enabled;
- BOOL voice_estate_chan;
-
- switch(voice_setting)
- {
- default:
- case kRadioVoiceChatEstate:
- voice_enabled = TRUE;
- voice_estate_chan = TRUE;
- break;
- case kRadioVoiceChatPrivate:
- voice_enabled = TRUE;
- voice_estate_chan = FALSE;
- break;
- case kRadioVoiceChatDisable:
- voice_enabled = FALSE;
- voice_estate_chan = FALSE;
- break;
- }
+ BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
+ BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index de5da95fa4..19766a40b6 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -52,7 +52,9 @@ private:
private:
LLCheckBoxCtrl* mCheckSoundLocal;
- LLRadioGroup* mRadioVoiceChat;
+ LLCheckBoxCtrl* mCheckParcelEnableVoice;
+ LLCheckBoxCtrl* mCheckEstateDisabledVoice;
+ LLCheckBoxCtrl* mCheckParcelVoiceLocal;
LLLineEditor* mMusicURLEdit;
LLCheckBoxCtrl* mMusicUrlCheck;
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
new file mode 100644
index 0000000000..56d52ccc65
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -0,0 +1,476 @@
+/**
+ * @file llpanellandmarkinfo.cpp
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanellandmarkinfo.h"
+
+#include "llcombobox.h"
+#include "lliconctrl.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lltrans.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "lllandmarkactions.h"
+#include "llviewerinventory.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+//----------------------------------------------------------------------------
+// Aux types and methods
+//----------------------------------------------------------------------------
+
+typedef std::pair<LLUUID, std::string> folder_pair_t;
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
+
+static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info");
+
+// Statics for textures filenames
+static std::string icon_pg;
+static std::string icon_m;
+static std::string icon_r;
+
+LLPanelLandmarkInfo::LLPanelLandmarkInfo()
+: LLPanelPlaceInfo()
+{}
+
+// virtual
+LLPanelLandmarkInfo::~LLPanelLandmarkInfo()
+{}
+
+// virtual
+BOOL LLPanelLandmarkInfo::postBuild()
+{
+ LLPanelPlaceInfo::postBuild();
+
+ mOwner = getChild<LLTextBox>("owner");
+ mCreator = getChild<LLTextBox>("creator");
+ mCreated = getChild<LLTextBox>("created");
+
+ mLandmarkTitle = getChild<LLTextBox>("title_value");
+ mLandmarkTitleEditor = getChild<LLLineEditor>("title_editor");
+ mNotesEditor = getChild<LLTextEditor>("notes_editor");
+ mFolderCombo = getChild<LLComboBox>("folder_combo");
+
+ icon_pg = getString("icon_PG");
+ icon_m = getString("icon_M");
+ icon_r = getString("icon_R");
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelLandmarkInfo::resetLocation()
+{
+ LLPanelPlaceInfo::resetLocation();
+
+ std::string loading = LLTrans::getString("LoadingData");
+ mCreator->setText(loading);
+ mOwner->setText(loading);
+ mCreated->setText(loading);
+ mLandmarkTitle->setText(LLStringUtil::null);
+ mLandmarkTitleEditor->setText(LLStringUtil::null);
+ mNotesEditor->setText(LLStringUtil::null);
+}
+
+// virtual
+void LLPanelLandmarkInfo::setInfoType(EInfoType type)
+{
+ LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
+
+ bool is_info_type_create_landmark = type == CREATE_LANDMARK;
+
+ landmark_info_panel->setVisible(type == LANDMARK);
+
+ getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark);
+ mFolderCombo->setVisible(is_info_type_create_landmark);
+
+ switch(type)
+ {
+ case CREATE_LANDMARK:
+ mCurrentTitle = getString("title_create_landmark");
+
+ mLandmarkTitle->setVisible(FALSE);
+ mLandmarkTitleEditor->setVisible(TRUE);
+ mNotesEditor->setEnabled(TRUE);
+ break;
+
+ case LANDMARK:
+ default:
+ mCurrentTitle = getString("title_landmark");
+
+ mLandmarkTitle->setVisible(TRUE);
+ mLandmarkTitleEditor->setVisible(FALSE);
+ mNotesEditor->setEnabled(FALSE);
+ break;
+ }
+
+ populateFoldersList();
+
+ LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)
+{
+ LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+ // HACK: Flag 0x2 == adult region,
+ // Flag 0x1 == mature region, otherwise assume PG
+ if (parcel_data.flags & 0x2)
+ {
+ mMaturityRatingIcon->setValue(icon_r);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT));
+ }
+ else if (parcel_data.flags & 0x1)
+ {
+ mMaturityRatingIcon->setValue(icon_m);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE));
+ }
+ else
+ {
+ mMaturityRatingIcon->setValue(icon_pg);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));
+ }
+
+ S32 region_x;
+ S32 region_y;
+ S32 region_z;
+
+ // If the region position is zero, grab position from the global
+ if(mPosRegion.isExactlyZero())
+ {
+ region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS;
+ region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS;
+ region_z = llround(parcel_data.global_z);
+ }
+ else
+ {
+ region_x = llround(mPosRegion.mV[VX]);
+ region_y = llround(mPosRegion.mV[VY]);
+ region_z = llround(mPosRegion.mV[VZ]);
+ }
+
+ LLSD info;
+ info["update_verbs"] = true;
+ info["global_x"] = parcel_data.global_x;
+ info["global_y"] = parcel_data.global_y;
+ info["global_z"] = parcel_data.global_z;
+ notifyParent(info);
+
+ if (mInfoType == CREATE_LANDMARK)
+ {
+ if (parcel_data.name.empty())
+ {
+ mLandmarkTitleEditor->setText(llformat("%s (%d, %d, %d)",
+ parcel_data.sim_name.c_str(), region_x, region_y, region_z));
+ }
+ else
+ {
+ mLandmarkTitleEditor->setText(parcel_data.name);
+ }
+
+ std::string desc;
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
+ mNotesEditor->setText(desc);
+
+ if (!LLLandmarkActions::landmarkAlreadyExists())
+ {
+ createLandmark(mFolderCombo->getValue().asUUID());
+ }
+ }
+}
+
+void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)
+{
+ if (!pItem)
+ return;
+
+ if(!gCacheName)
+ return;
+
+ const LLPermissions& perm = pItem->getPermissions();
+
+ //////////////////
+ // CREATOR NAME //
+ //////////////////
+ if (pItem->getCreatorUUID().notNull())
+ {
+ std::string name;
+ LLUUID creator_id = pItem->getCreatorUUID();
+ if (!gCacheName->getFullName(creator_id, name))
+ {
+ gCacheName->get(creator_id, FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3));
+ }
+ mCreator->setText(name);
+ }
+ else
+ {
+ mCreator->setText(getString("unknown"));
+ }
+
+ ////////////////
+ // OWNER NAME //
+ ////////////////
+ if(perm.isOwned())
+ {
+ std::string name;
+ if (perm.isGroupOwned())
+ {
+ LLUUID group_id = perm.getGroup();
+ if (!gCacheName->getGroupName(group_id, name))
+ {
+ gCacheName->get(group_id, TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+ }
+ }
+ else
+ {
+ LLUUID owner_id = perm.getOwner();
+ if (!gCacheName->getFullName(owner_id, name))
+ {
+ gCacheName->get(owner_id, FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+ }
+ }
+ mOwner->setText(name);
+ }
+ else
+ {
+ mOwner->setText(getString("public"));
+ }
+
+ //////////////////
+ // ACQUIRE DATE //
+ //////////////////
+ time_t time_utc = pItem->getCreationDate();
+ if (0 == time_utc)
+ {
+ mCreated->setText(getString("unknown"));
+ }
+ else
+ {
+ std::string timeStr = getString("acquired_date");
+ LLSD substitution;
+ substitution["datetime"] = (S32) time_utc;
+ LLStringUtil::format (timeStr, substitution);
+ mCreated->setText(timeStr);
+ }
+
+ mLandmarkTitle->setText(pItem->getName());
+ mLandmarkTitleEditor->setText(pItem->getName());
+ mNotesEditor->setText(pItem->getDescription());
+}
+
+void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled)
+{
+ // If switching to edit mode while creating landmark
+ // the "Create Landmark" title remains.
+ if (enabled && mInfoType != CREATE_LANDMARK)
+ {
+ mTitle->setText(getString("title_edit_landmark"));
+ }
+ else
+ {
+ mTitle->setText(mCurrentTitle);
+
+ mLandmarkTitle->setText(mLandmarkTitleEditor->getText());
+ }
+
+ if (mNotesEditor->getReadOnly() == (enabled == TRUE))
+ {
+ mLandmarkTitle->setVisible(!enabled);
+ mLandmarkTitleEditor->setVisible(enabled);
+ mNotesEditor->setReadOnly(!enabled);
+ mFolderCombo->setVisible(enabled);
+ getChild<LLTextBox>("folder_label")->setVisible(enabled);
+
+ // HACK: To change the text color in a text editor
+ // when it was enabled/disabled we set the text once again.
+ mNotesEditor->setText(mNotesEditor->getText());
+ }
+}
+
+const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const
+{
+ return mLandmarkTitleEditor->getText();
+}
+
+const std::string LLPanelLandmarkInfo::getLandmarkNotes() const
+{
+ return mNotesEditor->getText();
+}
+
+const LLUUID LLPanelLandmarkInfo::getLandmarkFolder() const
+{
+ return mFolderCombo->getValue().asUUID();
+}
+
+BOOL LLPanelLandmarkInfo::setLandmarkFolder(const LLUUID& id)
+{
+ return mFolderCombo->setCurrentByID(id);
+}
+
+void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
+{
+ std::string name = mLandmarkTitleEditor->getText();
+ std::string desc = mNotesEditor->getText();
+
+ LLStringUtil::trim(name);
+ LLStringUtil::trim(desc);
+
+ // If typed name is empty use the parcel name instead.
+ if (name.empty())
+ {
+ name = mParcelName->getText();
+
+ // If no parcel exists use the region name instead.
+ if (name.empty())
+ {
+ name = mRegionName->getText();
+ }
+ }
+
+ LLStringUtil::replaceChar(desc, '\n', ' ');
+
+ // If no folder chosen use the "Landmarks" folder.
+ LLLandmarkActions::createLandmarkHere(name, desc,
+ folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
+}
+
+// static
+std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
+{
+ std::string name;
+ LLUUID parent_id;
+
+ llassert(cat);
+ if (cat)
+ {
+ name = cat->getName();
+
+ // translate category name, if it's right below the root
+ // FIXME: it can throw notification about non existent string in strings.xml
+ if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ {
+ LLTrans::findString(name, "InvFolder " + name);
+ }
+
+ // we don't want "My Inventory" to appear in the name
+ while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
+ {
+ cat = gInventory.getCategory(parent_id);
+ llassert(cat);
+ if (cat)
+ {
+ name = cat->getName() + "/" + name;
+ }
+ }
+ }
+
+ return name;
+}
+
+void LLPanelLandmarkInfo::populateFoldersList()
+{
+ // Collect all folders that can contain landmarks.
+ LLInventoryModel::cat_array_t cats;
+ collectLandmarkFolders(cats);
+
+ mFolderCombo->removeall();
+
+ // Put the "Landmarks" folder first in list.
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+ const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id);
+ if (!lmcat)
+ {
+ llwarns << "Cannot find the landmarks folder" << llendl;
+ }
+ else
+ {
+ std::string cat_full_name = getFullFolderName(lmcat);
+ mFolderCombo->add(cat_full_name, lmcat->getUUID());
+ }
+
+ typedef std::vector<folder_pair_t> folder_vec_t;
+ folder_vec_t folders;
+ // Sort the folders by their full name.
+ for (S32 i = 0; i < cats.count(); i++)
+ {
+ const LLViewerInventoryCategory* cat = cats.get(i);
+ std::string cat_full_name = getFullFolderName(cat);
+ folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
+ }
+ sort(folders.begin(), folders.end(), cmp_folders);
+
+ // Finally, populate the combobox.
+ for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
+ mFolderCombo->add(it->second, LLSD(it->first));
+}
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
+{
+ return left.second < right.second;
+}
+
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
+{
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+
+ // Add descendent folders of the "Landmarks" category.
+ LLInventoryModel::item_array_t items; // unused
+ LLIsType is_category(LLAssetType::AT_CATEGORY);
+ gInventory.collectDescendentsIf(
+ landmarks_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_category);
+
+ // Add the "My Favorites" category.
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
+ if (!favorites_cat)
+ {
+ llwarns << "Cannot find the favorites folder" << llendl;
+ }
+ else
+ {
+ cats.put(favorites_cat);
+ }
+}
diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h
new file mode 100644
index 0000000000..b3dc3f5ad9
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.h
@@ -0,0 +1,86 @@
+/**
+ * @file llpanellandmarkinfo.h
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELLANDMARKINFO_H
+#define LL_LLPANELLANDMARKINFO_H
+
+#include "llpanelplaceinfo.h"
+
+class LLComboBox;
+class LLLineEditor;
+class LLTextEditor;
+
+class LLPanelLandmarkInfo : public LLPanelPlaceInfo
+{
+public:
+ LLPanelLandmarkInfo();
+ /*virtual*/ ~LLPanelLandmarkInfo();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void resetLocation();
+
+ /*virtual*/ void setInfoType(EInfoType type);
+
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+ // Displays landmark owner, creator and creation date info.
+ void displayItemInfo(const LLInventoryItem* pItem);
+
+ void toggleLandmarkEditMode(BOOL enabled);
+
+ const std::string& getLandmarkTitle() const;
+ const std::string getLandmarkNotes() const;
+ const LLUUID getLandmarkFolder() const;
+
+ // Select current landmark folder in combobox.
+ BOOL setLandmarkFolder(const LLUUID& id);
+
+ // Create a landmark for the current location
+ // in a folder specified by folder_id.
+ void createLandmark(const LLUUID& folder_id);
+
+ static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
+
+private:
+ void populateFoldersList();
+
+ LLTextBox* mOwner;
+ LLTextBox* mCreator;
+ LLTextBox* mCreated;
+ LLTextBox* mLandmarkTitle;
+ LLLineEditor* mLandmarkTitleEditor;
+ LLTextEditor* mNotesEditor;
+ LLComboBox* mFolderCombo;
+};
+
+#endif // LL_LLPANELLANDMARKINFO_H
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 3d0db71045..40ea75ea7a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2001-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -35,8 +35,10 @@
#include "llbutton.h"
#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "llregionhandle.h"
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
@@ -47,9 +49,10 @@
#include "lldndbutton.h"
#include "llfloaterworldmap.h"
#include "llfolderviewitem.h"
-#include "llinventorysubtreepanel.h"
+#include "llinventorypanel.h"
#include "lllandmarkactions.h"
#include "llplacesinventorybridge.h"
+#include "llplacesinventorypanel.h"
#include "llsidetray.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
@@ -64,8 +67,121 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
// helper functions
-static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
+static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::string& string);
+static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list);
+/**
+ * Functor counting expanded and collapsed folders in folder view tree to know
+ * when to enable or disable "Expand all folders" and "Collapse all folders" commands.
+ */
+class LLCheckFolderState : public LLFolderViewFunctor
+{
+public:
+ LLCheckFolderState()
+ : mCollapsedFolders(0),
+ mExpandedFolders(0)
+ {}
+ virtual ~LLCheckFolderState() {}
+ virtual void doFolder(LLFolderViewFolder* folder);
+ virtual void doItem(LLFolderViewItem* item) {}
+ S32 getCollapsedFolders() { return mCollapsedFolders; }
+ S32 getExpandedFolders() { return mExpandedFolders; }
+
+private:
+ S32 mCollapsedFolders;
+ S32 mExpandedFolders;
+};
+
+// virtual
+void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)
+{
+ // Counting only folders that pass the filter.
+ // The listener check allow us to avoid counting the folder view
+ // object itself because it has no listener assigned.
+ if (folder->hasFilteredDescendants() && folder->getListener())
+ {
+ if (folder->isOpen())
+ {
+ ++mExpandedFolders;
+ }
+ else
+ {
+ ++mCollapsedFolders;
+ }
+ }
+}
+
+// Functor searching and opening a folder specified by UUID
+// in a folder view tree.
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+ LLOpenFolderByID(const LLUUID& folder_id)
+ : mFolderID(folder_id)
+ , mIsFolderOpen(false)
+ {}
+ virtual ~LLOpenFolderByID() {}
+ /*virtual*/ void doFolder(LLFolderViewFolder* folder);
+ /*virtual*/ void doItem(LLFolderViewItem* item) {}
+
+ bool isFolderOpen() { return mIsFolderOpen; }
+
+private:
+ bool mIsFolderOpen;
+ LLUUID mFolderID;
+};
+
+// virtual
+void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getListener() && folder->getListener()->getUUID() == mFolderID)
+ {
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ mIsFolderOpen = true;
+ }
+ }
+}
+
+/**
+ * Bridge to support knowing when the inventory has changed to update Landmarks tab
+ * ShowFolderState filter setting to show all folders when the filter string is empty and
+ * empty folder message when Landmarks inventory category has no children.
+ * Ensures that "Landmarks" folder in the Library is open on strart up.
+ */
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp)
+ : mLP(lp),
+ mIsLibraryLandmarksOpen(false)
+ {}
+ virtual ~LLLandmarksPanelObserver() {}
+ /*virtual*/ void changed(U32 mask);
+
+private:
+ LLLandmarksPanel* mLP;
+ bool mIsLibraryLandmarksOpen;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+ mLP->updateShowFolderState();
+
+ LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel();
+ if (!mIsLibraryLandmarksOpen && library)
+ {
+ // Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827.
+ const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ if (landmarks_cat.notNull())
+ {
+ LLOpenFolderByID opener(landmarks_cat);
+ library->getRootFolder()->applyFunctorRecursively(opener);
+ mIsLibraryLandmarksOpen = opener.isFolderOpen();
+ }
+ }
+}
LLLandmarksPanel::LLLandmarksPanel()
: LLPanelPlacesTab()
@@ -77,13 +193,19 @@ LLLandmarksPanel::LLLandmarksPanel()
, mListCommands(NULL)
, mGearFolderMenu(NULL)
, mGearLandmarkMenu(NULL)
- , mDirtyFilter(false)
{
+ mInventoryObserver = new LLLandmarksPanelObserver(this);
+ gInventory.addObserver(mInventoryObserver);
+
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
}
LLLandmarksPanel::~LLLandmarksPanel()
{
+ if (gInventory.containsObserver(mInventoryObserver))
+ {
+ gInventory.removeObserver(mInventoryObserver);
+ }
}
BOOL LLLandmarksPanel::postBuild()
@@ -96,42 +218,44 @@ BOOL LLLandmarksPanel::postBuild()
U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER);
mSortByDate = sort_order & LLInventoryFilter::SO_DATE;
- initFavoritesInventroyPanel();
- initLandmarksInventroyPanel();
- initMyInventroyPanel();
- initLibraryInventroyPanel();
+ initFavoritesInventoryPanel();
+ initLandmarksInventoryPanel();
+ initMyInventoryPanel();
+ initLibraryInventoryPanel();
- gIdleCallbacks.addFunction(LLLandmarksPanel::doIdle, this);
return TRUE;
}
// virtual
void LLLandmarksPanel::onSearchEdit(const std::string& string)
{
- static std::string prev_string("");
-
- if (prev_string == string) return;
-
- // show all folders in Landmarks Accordion for empty filter
- mLandmarksInventoryPanel->setShowFolderState(string.empty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS :
- LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS
- );
-
- filter_list(mFavoritesInventoryPanel, string);
- filter_list(mLandmarksInventoryPanel, string);
- filter_list(mMyInventoryPanel, string);
- filter_list(mLibraryInventoryPanel, string);
-
- prev_string = string;
- mDirtyFilter = true;
-
// give FolderView a chance to be refreshed. So, made all accordions visible
for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
{
LLAccordionCtrlTab* tab = *iter;
- tab->setVisible(true);
+ tab->setVisible(TRUE);
+
+ // expand accordion to see matched items in each one. See EXT-2014.
+ if (string != "")
+ {
+ tab->changeOpenClose(false);
+ }
+
+ LLPlacesInventoryPanel* inventory_list = dynamic_cast<LLPlacesInventoryPanel*>(tab->getAccordionView());
+ if (NULL == inventory_list) continue;
+
+ if (inventory_list->getFilter())
+ {
+ filter_list(inventory_list, string);
+ }
}
+
+ if (sFilterSubString != string)
+ sFilterSubString = string;
+
+ // show all folders in Landmarks Accordion for empty filter
+ // only if Landmarks inventory folder is not empty
+ updateShowFolderState();
}
// virtual
@@ -142,20 +266,13 @@ void LLLandmarksPanel::onShowOnMap()
llwarns << "There are no selected list. No actions are performed." << llendl;
return;
}
- LLLandmark* landmark = getCurSelectedLandmark();
- if (!landmark)
- return;
- LLVector3d landmark_global_pos;
- if (!landmark->getGlobalPos(landmark_global_pos))
- return;
-
- LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
- if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
- {
- worldmap_instance->trackLocation(landmark_global_pos);
- LLFloaterReg::showInstance("world_map", "center");
- }
+ // Disable the "Map" button because loading landmark can take some time.
+ // During this time the button is useless. It will be enabled on callback finish
+ // or upon switching to other item.
+ mShowOnMapBtn->setEnabled(FALSE);
+
+ doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1));
}
// virtual
@@ -181,9 +298,9 @@ void LLLandmarksPanel::updateVerbs()
if (!isTabVisible())
return;
- BOOL enabled = isLandmarkSelected();
- mTeleportBtn->setEnabled(enabled);
- mShowOnMapBtn->setEnabled(enabled);
+ bool landmark_selected = isLandmarkSelected();
+ mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport"));
+ mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));
// TODO: mantipov: Uncomment when mShareBtn is supported
// Share button should be enabled when neither a folder nor a landmark is selected
@@ -192,18 +309,13 @@ void LLLandmarksPanel::updateVerbs()
updateListCommands();
}
-void LLLandmarksPanel::onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+void LLLandmarksPanel::onSelectionChange(LLPlacesInventoryPanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
if (user_action && (items.size() > 0))
{
deselectOtherThan(inventory_list);
mCurrentSelectedList = inventory_list;
}
-
- LLFolderViewItem* current_item = inventory_list->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- return;
-
updateVerbs();
}
@@ -212,6 +324,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
// TODO: mantipov: update getting of selected item
// TODO: bind to "i" button
LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem();
+ if (!cur_item) return;
LLFolderViewEventListener* listenerp = cur_item->getListener();
if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
@@ -224,6 +337,46 @@ void LLLandmarksPanel::onSelectorButtonClicked()
}
}
+void LLLandmarksPanel::updateShowFolderState()
+{
+ if (!mLandmarksInventoryPanel->getFilter())
+ return;
+
+ bool show_all_folders = mLandmarksInventoryPanel->getRootFolder()->getFilterSubString().empty();
+ if (show_all_folders)
+ {
+ show_all_folders = category_has_descendents(mLandmarksInventoryPanel);
+ }
+
+ mLandmarksInventoryPanel->setShowFolderState(show_all_folders ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS :
+ LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS
+ );
+}
+
+void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus)
+{
+ if (selectItemInAccordionTab(mFavoritesInventoryPanel, "tab_favorites", obj_id, take_keyboard_focus))
+ {
+ return;
+ }
+
+ if (selectItemInAccordionTab(mLandmarksInventoryPanel, "tab_landmarks", obj_id, take_keyboard_focus))
+ {
+ return;
+ }
+
+ if (selectItemInAccordionTab(mMyInventoryPanel, "tab_inventory", obj_id, take_keyboard_focus))
+ {
+ return;
+ }
+
+ if (selectItemInAccordionTab(mLibraryInventoryPanel, "tab_library", obj_id, take_keyboard_focus))
+ {
+ return;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
// PROTECTED METHODS
//////////////////////////////////////////////////////////////////////////
@@ -250,22 +403,55 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const
return false;
}
-LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const
-{
+void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)
+{
LLFolderViewItem* cur_item = getCurSelectedItem();
if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
- return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID());
+ LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb);
+ if (landmark)
+ {
+ cb(landmark);
+ }
}
- return NULL;
}
-LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem () const
+LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const
{
return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL;
}
+LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPanel* inventory_list,
+ const std::string& tab_name,
+ const LLUUID& obj_id,
+ BOOL take_keyboard_focus) const
+{
+ if (!inventory_list)
+ return NULL;
+
+ LLFolderView* folder_view = inventory_list->getRootFolder();
+
+ LLFolderViewItem* item = folder_view->getItemByID(obj_id);
+ if (!item)
+ return NULL;
+
+ LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(tab_name);
+ if (!tab->isExpanded())
+ {
+ tab->changeOpenClose(false);
+ }
+
+ folder_view->setSelection(item, FALSE, take_keyboard_focus);
+
+ LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
+ LLRect screen_rc;
+ localRectToScreen(item->getRect(), &screen_rc);
+ accordion->notifyParent(LLSD().with("scrollToShowRect", screen_rc.getValue()));
+
+ return item;
+}
+
void LLLandmarksPanel::updateSortOrder(LLInventoryPanel* panel, bool byDate)
{
if(!panel) return;
@@ -288,45 +474,12 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
// We have to make request to sever to get parcel_id and snaption_id.
if(isLandmarkSelected())
{
- LLLandmark* landmark = getCurSelectedLandmark();
LLFolderViewItem* cur_item = getCurSelectedItem();
+ if (!cur_item) return;
LLUUID id = cur_item->getListener()->getUUID();
- LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
- if(landmark)
- {
- LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
- LLVector3d landmark_global_pos;
- landmark->getGlobalPos(landmark_global_pos);
-
- // let's toggle pick panel into panel places
- LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
- panel_places->addChild(panel_pick);
- LLRect paren_rect(panel_places->getRect());
- panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
- panel_pick->setRect(paren_rect);
- panel_pick->onOpen(LLSD());
-
- LLPickData data;
- data.pos_global = landmark_global_pos;
- data.name = cur_item->getName();
- data.desc = inv_item->getDescription();
- data.snapshot_id = parcel_data.snapshot_id;
- data.parcel_id = parcel_data.parcel_id;
- panel_pick->setPickData(&data);
-
- LLSD params;
- params["parcel_id"] =parcel_data.parcel_id;
- /* set exit callback to get back onto panel places
- in callback we will make cleaning up( delete pick_panel instance,
- remove landmark panel from observer list
- */
- panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
- panel_pick, panel_places,params));
- panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
- panel_pick, panel_places,params));
- panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
- panel_pick, panel_places,params));
- }
+ LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
+ doActionOnCurSelectedLandmark(boost::bind(
+ &LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data));
}
}
@@ -351,49 +504,68 @@ void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason)
// PRIVATE METHODS
//////////////////////////////////////////////////////////////////////////
-void LLLandmarksPanel::initFavoritesInventroyPanel()
+void LLLandmarksPanel::initFavoritesInventoryPanel()
{
- mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list");
+ mFavoritesInventoryPanel = getChild<LLPlacesInventoryPanel>("favorites_list");
initLandmarksPanel(mFavoritesInventoryPanel);
+ mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems");
- initAccordion("tab_favorites", mFavoritesInventoryPanel);
+ initAccordion("tab_favorites", mFavoritesInventoryPanel, true);
}
-void LLLandmarksPanel::initLandmarksInventroyPanel()
+void LLLandmarksPanel::initLandmarksInventoryPanel()
{
- mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list");
+ mLandmarksInventoryPanel = getChild<LLPlacesInventoryPanel>("landmarks_list");
initLandmarksPanel(mLandmarksInventoryPanel);
- mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ // Check if mLandmarksInventoryPanel is properly initialized and has a Filter created.
+ // In case of a dummy widget getFilter() will return NULL.
+ if (mLandmarksInventoryPanel->getFilter())
+ {
+ mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ }
// subscribe to have auto-rename functionality while creating New Folder
mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2));
- initAccordion("tab_landmarks", mLandmarksInventoryPanel);
+ initAccordion("tab_landmarks", mLandmarksInventoryPanel, true);
}
-void LLLandmarksPanel::initMyInventroyPanel()
+void LLLandmarksPanel::initMyInventoryPanel()
{
- mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list");
+ mMyInventoryPanel= getChild<LLPlacesInventoryPanel>("my_inventory_list");
initLandmarksPanel(mMyInventoryPanel);
- initAccordion("tab_inventory", mMyInventoryPanel);
+ initAccordion("tab_inventory", mMyInventoryPanel, false);
}
-void LLLandmarksPanel::initLibraryInventroyPanel()
+void LLLandmarksPanel::initLibraryInventoryPanel()
{
- mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list");
+ mLibraryInventoryPanel = getChild<LLPlacesInventoryPanel>("library_list");
initLandmarksPanel(mLibraryInventoryPanel);
- initAccordion("tab_library", mLibraryInventoryPanel);
+ // We want to fetch only "Landmarks" category from the library.
+ const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ if (landmarks_cat.notNull())
+ {
+ gInventory.startBackgroundFetch(landmarks_cat);
+ }
+
+ // Expanding "Library" tab for new users who have no landmarks in "My Inventory".
+ initAccordion("tab_library", mLibraryInventoryPanel, true);
}
-void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list)
+void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list)
{
+ // In case of a dummy widget further we have no Folder View widget and no Filter,
+ // so further initialization leads to crash.
+ if (!inventory_list->getFilter())
+ return;
+
inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);
inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2));
@@ -405,22 +577,24 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis
{
root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle());
root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle());
+
+ root_folder->setParentLandmarksPanel(this);
}
- // save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs
- // See EXT-1609.
inventory_list->saveFolderState();
}
-void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list)
+void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab)
{
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name);
+
mAccordionTabs.push_back(accordion_tab);
accordion_tab->setDropDownStateChangedCallback(
boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list));
+ accordion_tab->setDisplayChildren(expand_tab);
}
-void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list)
+void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list)
{
bool expanded = param.asBoolean();
@@ -431,9 +605,26 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInvento
mCurrentSelectedList = NULL;
updateVerbs();
}
+
+ // Start background fetch, mostly for My Inventory and Library
+ if (expanded)
+ {
+ const LLUUID &cat_id = inventory_list->getStartFolderID();
+ // Just because the category itself has been fetched, doesn't mean its child folders have.
+ /*
+ if (!gInventory.isCategoryComplete(cat_id))
+ */
+ {
+ gInventory.startBackgroundFetch(cat_id);
+ }
+
+ // Apply filter substring because it might have been changed
+ // while accordion was closed. See EXT-3714.
+ filter_list(inventory_list, sFilterSubString);
+ }
}
-void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list)
+void LLLandmarksPanel::deselectOtherThan(const LLPlacesInventoryPanel* inventory_list)
{
if (inventory_list != mFavoritesInventoryPanel)
{
@@ -492,6 +683,7 @@ void LLLandmarksPanel::updateListCommands()
// keep Options & Add Landmark buttons always enabled
mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled);
mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled);
+ mListCommands->childSetEnabled(OPTIONS_BUTTON_NAME,getCurSelectedItem() != NULL);
}
void LLLandmarksPanel::onActionsButtonClick()
@@ -549,14 +741,15 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
std::string command_name = userdata.asString();
if("add_landmark" == command_name)
{
- if(LLLandmarkActions::landmarkAlreadyExists())
+ LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
+ if(landmark)
{
- std::string location;
- LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL);
- llwarns<<" Landmark already exists at location: "<< location<<llendl;
- return;
+ LLNotificationsUtil::add("LandmarkAlreadyExists");
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
}
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
}
else if ("category" == command_name)
{
@@ -580,7 +773,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
menu_create_inventory_item(mCurrentSelectedList->getRootFolder(),
dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD(
"category"), gInventory.findCategoryUUIDForType(
- LLAssetType::AT_LANDMARK));
+ LLFolderType::FT_LANDMARK));
}
}
}
@@ -624,7 +817,12 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
}
else if ("collapse_all" == command_name)
{
- root_folder->closeAllFolders();
+ root_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
+
+ // The top level folder is invisible, it must be open to
+ // display its sub-folders.
+ root_folder->openTopLevelFolders();
+ root_folder->arrangeAll();
}
else if ( "sort_by_date" == command_name)
{
@@ -686,6 +884,20 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
return false;
}
+ LLCheckFolderState checker;
+ rootFolderView->applyFunctorRecursively(checker);
+
+ // We assume that the root folder is always expanded so we enable "collapse_all"
+ // command when we have at least one more expanded folder.
+ if (checker.getExpandedFolders() < 2 && "collapse_all" == command_name)
+ {
+ return false;
+ }
+
+ if (checker.getCollapsedFolders() < 1 && "expand_all" == command_name)
+ {
+ return false;
+ }
if("category" == command_name)
{
@@ -701,13 +913,14 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
return canSelectedBeModified(command_name);
}
- else if ( "sort_by_date" == command_name)
- {
- return mSortByDate;
- }
else if("create_pick" == command_name)
{
- return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
+ std::set<LLUUID> selection;
+ if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) )
+ {
+ return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
+ }
+ return false;
}
else
{
@@ -721,7 +934,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
{
LLFolderViewItem* cur_item = getCurSelectedItem();
if(!cur_item)
- return ;
+ return;
std::string command_name = userdata.asString();
if("more_info" == command_name)
{
@@ -737,42 +950,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
}
else if ("create_pick" == command_name)
{
- LLLandmark* landmark = getCurSelectedLandmark();
- if(!landmark) return;
-
- LLViewerRegion* region = gAgent.getRegion();
- if (!region) return;
-
- LLGlobalVec pos_global;
- LLUUID region_id;
- landmark->getGlobalPos(pos_global);
- landmark->getRegionID(region_id);
- LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
- (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
- (F32)pos_global.mdV[VZ]);
-
- LLSD body;
- std::string url = region->getCapability("RemoteParcelRequest");
- if (!url.empty())
- {
- body["location"] = ll_sd_from_vector3(region_pos);
- if (!region_id.isNull())
- {
- body["region_id"] = region_id;
- }
- if (!pos_global.isExactlyZero())
- {
- U64 region_handle = to_region_handle(pos_global);
- body["region_handle"] = ll_sd_from_U64(region_handle);
- }
- LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
- }
- else
- {
- llwarns << "Can't create pick for landmark for region" << region_id
- << ". Region: " << region->getName()
- << " does not support RemoteParcelRequest" << llendl;
- }
+ doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));
}
}
@@ -820,17 +998,18 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
// then ask LLFolderView permissions
if (can_be_modified)
{
+ LLFolderViewItem* selected = getCurSelectedItem();
if ("cut" == command_name)
{
can_be_modified = mCurrentSelectedList->getRootFolder()->canCut();
}
else if ("rename" == command_name)
{
- can_be_modified = getCurSelectedItem()->getListener()->isItemRenameable();
+ can_be_modified = selected ? selected->getListener()->isItemRenameable() : false;
}
else if ("delete" == command_name)
{
- can_be_modified = getCurSelectedItem()->getListener()->isItemRemovable();
+ can_be_modified = selected ? selected->getListener()->isItemRemovable(): false;
}
else if("paste" == command_name)
{
@@ -883,58 +1062,114 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg
return true;
}
-
-void LLLandmarksPanel::doIdle(void* landmarks_panel)
+void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
{
- LLLandmarksPanel* panel = (LLLandmarksPanel* ) landmarks_panel;
+ LLVector3d landmark_global_pos;
+ if (!landmark->getGlobalPos(landmark_global_pos))
+ return;
- if (panel->mDirtyFilter)
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
{
- panel->updateFilteredAccordions();
+ worldmap_instance->trackLocation(landmark_global_pos);
+ LLFloaterReg::showInstance("world_map", "center");
}
+ mShowOnMapBtn->setEnabled(TRUE);
}
-void LLLandmarksPanel::updateFilteredAccordions()
+void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
+ LLFolderViewItem* cur_item,
+ LLInventoryItem* inv_item,
+ const LLParcelData& parcel_data)
{
- LLInventoryPanel* inventory_list = NULL;
- LLAccordionCtrlTab* accordion_tab = NULL;
- for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
- {
- accordion_tab = *iter;
- inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
- if (NULL == inventory_list) continue;
- LLFolderView* fv = inventory_list->getRootFolder();
-
- bool has_visible_children = fv->hasVisibleChildren();
+ LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
+ LLVector3d landmark_global_pos;
+ landmark->getGlobalPos(landmark_global_pos);
+
+ // let's toggle pick panel into panel places
+ LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
+ panel_places->addChild(panel_pick);
+ LLRect paren_rect(panel_places->getRect());
+ panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
+ panel_pick->setRect(paren_rect);
+ panel_pick->onOpen(LLSD());
+
+ LLPickData data;
+ data.pos_global = landmark_global_pos;
+ data.name = cur_item->getName();
+ data.desc = inv_item->getDescription();
+ data.snapshot_id = parcel_data.snapshot_id;
+ data.parcel_id = parcel_data.parcel_id;
+ panel_pick->setPickData(&data);
+
+ LLSD params;
+ params["parcel_id"] = parcel_data.parcel_id;
+ /* set exit callback to get back onto panel places
+ in callback we will make cleaning up( delete pick_panel instance,
+ remove landmark panel from observer list
+ */
+ panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+ panel_pick, panel_places,params));
+ panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+ panel_pick, panel_places,params));
+ panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+ panel_pick, panel_places,params));
+}
- accordion_tab->setVisible(has_visible_children);
+void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ LLGlobalVec pos_global;
+ LLUUID region_id;
+ landmark->getGlobalPos(pos_global);
+ landmark->getRegionID(region_id);
+ LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+ (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+ (F32)pos_global.mdV[VZ]);
+
+ LLSD body;
+ std::string url = region->getCapability("RemoteParcelRequest");
+ if (!url.empty())
+ {
+ body["location"] = ll_sd_from_vector3(region_pos);
+ if (!region_id.isNull())
+ {
+ body["region_id"] = region_id;
+ }
+ if (!pos_global.isExactlyZero())
+ {
+ U64 region_handle = to_region_handle(pos_global);
+ body["region_handle"] = ll_sd_from_U64(region_handle);
+ }
+ LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
+ }
+ else
+ {
+ llwarns << "Can't create pick for landmark for region" << region_id
+ << ". Region: " << region->getName()
+ << " does not support RemoteParcelRequest" << llendl;
}
-
- // we have to arrange accordion tabs for cases when filter string is less restrictive but
- // all items are still filtered.
- static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
- accordion->arrange();
-
- // now filter state is applied to accordion tabs
- mDirtyFilter = false;
}
-
//////////////////////////////////////////////////////////////////////////
// HELPER FUNCTIONS
//////////////////////////////////////////////////////////////////////////
-static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string)
+static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::string& string)
{
- if (string == "")
+ // When search is cleared, restore the old folder state.
+ if (!inventory_list->getRootFolder()->getFilterSubString().empty() && string == "")
{
inventory_list->setFilterSubString(LLStringUtil::null);
-
- // re-open folders that were initially open
+ // Re-open folders that were open before
inventory_list->restoreFolderState();
}
- gInventory.startBackgroundFetch();
+ // Open the immediate children of the root folder, since those
+ // are invisible in the UI and thus must always be open.
+ inventory_list->getRootFolder()->openTopLevelFolders();
if (inventory_list->getFilterSubString().empty() && string.empty())
{
@@ -948,7 +1183,18 @@ static void filter_list(LLInventorySubTreePanel* inventory_list, const std::stri
inventory_list->saveFolderState();
}
- // set new filter string
+ // Set new filter string
inventory_list->setFilterSubString(string);
}
+
+static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list)
+{
+ LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getStartFolderID());
+ if (category)
+ {
+ return category->getDescendentCount() > 0;
+ }
+
+ return false;
+}
// EOF
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 0e7abb4865..6358bd6f23 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2001-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -37,6 +37,7 @@
// newview
#include "llinventorymodel.h"
+#include "lllandmarklist.h"
#include "llpanelplacestab.h"
#include "llpanelpick.h"
#include "llremoteparcelrequest.h"
@@ -45,7 +46,7 @@ class LLAccordionCtrlTab;
class LLFolderViewItem;
class LLMenuGL;
class LLInventoryPanel;
-class LLInventorySubTreePanel;
+class LLPlacesInventoryPanel;
class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
{
@@ -59,17 +60,45 @@ public:
/*virtual*/ void onTeleport();
/*virtual*/ void updateVerbs();
- void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onSelectionChange(LLPlacesInventoryPanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onSelectorButtonClicked();
-
+ void setCurrentSelectedList(LLPlacesInventoryPanel* inventory_list)
+ {
+ mCurrentSelectedList = inventory_list;
+ }
+
+ /**
+ * Update filter ShowFolderState setting to show empty folder message
+ * if Landmarks inventory folder is empty.
+ */
+ void updateShowFolderState();
+
+ /**
+ * Selects item with "obj_id" in one of accordion tabs.
+ */
+ void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus);
+
+ LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
*/
bool isLandmarkSelected() const;
bool isReceivedFolderSelected() const;
- LLLandmark* getCurSelectedLandmark() const;
- LLFolderViewItem* getCurSelectedItem () const;
+ void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
+ LLFolderViewItem* getCurSelectedItem() const;
+
+ /**
+ * Selects item with "obj_id" in "inventory_list" and scrolls accordion
+ * scrollbar to show the item.
+ * Returns pointer to the item if it is found in "inventory_list", otherwise NULL.
+ */
+ LLFolderViewItem* selectItemInAccordionTab(LLPlacesInventoryPanel* inventory_list,
+ const std::string& tab_name,
+ const LLUUID& obj_id,
+ BOOL take_keyboard_focus) const;
+
void updateSortOrder(LLInventoryPanel* panel, bool byDate);
//LLRemoteParcelInfoObserver interface
@@ -78,14 +107,14 @@ protected:
/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
private:
- void initFavoritesInventroyPanel();
- void initLandmarksInventroyPanel();
- void initMyInventroyPanel();
- void initLibraryInventroyPanel();
- void initLandmarksPanel(LLInventorySubTreePanel* inventory_list);
- void initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list);
- void onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list);
- void deselectOtherThan(const LLInventorySubTreePanel* inventory_list);
+ void initFavoritesInventoryPanel();
+ void initLandmarksInventoryPanel();
+ void initMyInventoryPanel();
+ void initLibraryInventoryPanel();
+ void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list);
+ void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab);
+ void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list);
+ void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list);
// List Commands Handlers
void initListCommandsHandlers();
@@ -116,30 +145,28 @@ private:
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
/**
- * Static callback for gIdleCallbacks to perform actions out of drawing
- */
- static void doIdle(void* landmarks_panel);
-
- /**
- * Updates accordions according to filtered items in lists.
- *
- * It hides accordion for empty lists
+ * Landmark actions callbacks. Fire when a landmark is loaded from the list.
*/
- void updateFilteredAccordions();
+ void doShowOnMap(LLLandmark* landmark);
+ void doProcessParcelInfo(LLLandmark* landmark,
+ LLFolderViewItem* cur_item,
+ LLInventoryItem* inv_item,
+ const LLParcelData& parcel_data);
+ void doCreatePick(LLLandmark* landmark);
private:
- LLInventorySubTreePanel* mFavoritesInventoryPanel;
- LLInventorySubTreePanel* mLandmarksInventoryPanel;
- LLInventorySubTreePanel* mMyInventoryPanel;
- LLInventorySubTreePanel* mLibraryInventoryPanel;
+ LLPlacesInventoryPanel* mFavoritesInventoryPanel;
+ LLPlacesInventoryPanel* mLandmarksInventoryPanel;
+ LLPlacesInventoryPanel* mMyInventoryPanel;
+ LLPlacesInventoryPanel* mLibraryInventoryPanel;
LLMenuGL* mGearLandmarkMenu;
LLMenuGL* mGearFolderMenu;
LLMenuGL* mMenuAdd;
- LLInventorySubTreePanel* mCurrentSelectedList;
+ LLPlacesInventoryPanel* mCurrentSelectedList;
+ LLInventoryObserver* mInventoryObserver;
LLPanel* mListCommands;
bool mSortByDate;
- bool mDirtyFilter;
typedef std::vector<LLAccordionCtrlTab*> accordion_tabs_t;
accordion_tabs_t mAccordionTabs;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 24e76e2c6e..7bd03167fd 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -39,7 +39,6 @@
#include "llfontgl.h"
#include "llmd5.h"
#include "llsecondlifeurls.h"
-#include "llversionviewer.h"
#include "v4color.h"
#include "llbutton.h"
@@ -51,29 +50,32 @@
#include "llfloaterpreference.h"
#include "llfocusmgr.h"
#include "lllineeditor.h"
+#include "llnotificationsutil.h"
#include "llstartup.h"
#include "lltextbox.h"
#include "llui.h"
#include "lluiconstants.h"
#include "llurlsimstring.h"
-#include "llviewerbuild.h"
+#include "llversioninfo.h"
#include "llviewerhelp.h"
#include "llviewertexturelist.h"
#include "llviewermenu.h" // for handle_preferences()
#include "llviewernetwork.h"
#include "llviewerwindow.h" // to link into child list
-#include "llnotify.h"
-#include "llurlsimstring.h"
#include "lluictrlfactory.h"
#include "llhttpclient.h"
#include "llweb.h"
#include "llmediactrl.h"
#include "llrootview.h"
-
#include "llfloatertos.h"
#include "lltrans.h"
#include "llglheaders.h"
+#include "llpanelloginlistener.h"
+
+#if LL_WINDOWS
+#pragma warning(disable: 4355) // 'this' used in initializer list
+#endif // LL_WINDOWS
#define USE_VIEWER_AUTH 0
@@ -167,7 +169,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage(),
mCallback(callback),
mCallbackData(cb_data),
- mHtmlAvailable( TRUE )
+ mHtmlAvailable( TRUE ),
+ mListener(new LLPanelLoginListener(this))
{
setFocusRoot(TRUE);
@@ -190,7 +193,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
gViewerWindow->getRootView()->addChildInBack(this);
// Logo
- mLogoImage = LLUI::getUIImage("startup_logo.j2c");
+ mLogoImage = LLUI::getUIImage("startup_logo");
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_login.xml");
@@ -198,11 +201,20 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
//leave room for the login menu bar
setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0));
#endif
- reshape(rect.getWidth(), rect.getHeight());
+ // Legacy login web page is hidden under the menu bar.
+ // Adjust reg-in-client web browser widget to not be hidden.
+ if (gSavedSettings.getBOOL("RegInClient"))
+ {
+ reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
+ }
+ else
+ {
+ reshape(rect.getWidth(), rect.getHeight());
+ }
#if !USE_VIEWER_AUTH
- childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
- childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
+ childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
+ childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
childSetCommitCallback("password_edit", mungePassword, this);
getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
@@ -217,6 +229,12 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
std::string sim_string = LLURLSimString::sInstance.mSimString;
+ if(sim_string.empty())
+ {
+ LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));
+ sim_string = LLURLSimString::sInstance.mSimString;
+ }
+
if (!sim_string.empty())
{
// Replace "<Type region name>" with this region name
@@ -234,16 +252,12 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
childSetAction("connect_btn", onClickConnect, this);
- setDefaultBtn("connect_btn");
-
- // childSetAction("quit_btn", onClickQuit, this);
+ getChild<LLPanel>("login")->setDefaultBtn("connect_btn");
std::string channel = gSavedSettings.getString("VersionChannelName");
- std::string version = llformat("%d.%d.%d (%d)",
- LL_VERSION_MAJOR,
- LL_VERSION_MINOR,
- LL_VERSION_PATCH,
- LL_VIEWER_BUILD );
+ std::string version = llformat("%s (%d)",
+ LLVersionInfo::getShortVersion().c_str(),
+ LLVersionInfo::getBuild());
LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
channel_text->setTextArg("[VERSION]", version);
@@ -254,11 +268,17 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLTextBox* create_new_account_text = getChild<LLTextBox>("create_new_account_text");
create_new_account_text->setClickedCallback(onClickNewAccount, NULL);
+
+ LLTextBox* need_help_text = getChild<LLTextBox>("login_help");
+ need_help_text->setClickedCallback(onClickHelp, NULL);
#endif
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
+
+ // Clear the browser's cache to avoid any potential for the cache messing up the login screen.
+ web_browser->clearCache();
// Need to handle login secondlife:///app/ URLs
web_browser->setTrusted( true );
@@ -267,19 +287,20 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
web_browser->setTabStop(FALSE);
// web_browser->navigateToLocalPage( "loading", "loading.html" );
- // make links open in external browser
- web_browser->setOpenInExternalBrowser( true );
+ if (gSavedSettings.getBOOL("RegInClient"))
+ {
+ // need to follow links in the internal browser
+ web_browser->setOpenInExternalBrowser( false );
- // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through)
- LLRect htmlRect = getRect();
-#if USE_VIEWER_AUTH
- htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY(), getRect().getWidth() + 6, getRect().getHeight());
-#else
- htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY() + 40, getRect().getWidth() + 6, getRect().getHeight() - 78 );
-#endif
- web_browser->setRect( htmlRect );
- web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE );
- reshape( getRect().getWidth(), getRect().getHeight(), 1 );
+ getChild<LLView>("login_widgets")->setVisible(false);
+ }
+ else
+ {
+ // make links open in external browser
+ web_browser->setOpenInExternalBrowser( true );
+
+ reshapeBrowser();
+ }
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build( this );
@@ -297,6 +318,27 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
+// force the size to be correct (XML doesn't seem to be sufficient to do this)
+// (with some padding so the other login screen doesn't show through)
+void LLPanelLogin::reshapeBrowser()
+{
+ LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
+ LLRect rect = gViewerWindow->getWindowRectScaled();
+ LLRect html_rect;
+#if USE_VIEWER_AUTH
+ html_rect.setCenterAndSize(
+ rect.getCenterX() - 2, rect.getCenterY(),
+ rect.getWidth() + 6, rect.getHeight());
+#else
+ html_rect.setCenterAndSize(
+ rect.getCenterX() - 2, rect.getCenterY() + 40,
+ rect.getWidth() + 6, rect.getHeight() - 78 );
+#endif
+ web_browser->setRect( html_rect );
+ web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
+ reshape( rect.getWidth(), rect.getHeight(), 1 );
+}
+
void LLPanelLogin::setSiteIsAlive( bool alive )
{
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
@@ -362,6 +404,10 @@ LLPanelLogin::~LLPanelLogin()
//// We know we're done with the image, so be rid of it.
//gTextureList.deleteImage( mLogoImage );
+
+ // Controls having keyboard focus by default
+ // must reset it on destroy. (EXT-2748)
+ gFocusMgr.setDefaultKeyboardFocus(NULL);
}
// virtual
@@ -384,10 +430,14 @@ void LLPanelLogin::draw()
if ( mHtmlAvailable )
{
#if !USE_VIEWER_AUTH
- // draw a background box in black
- gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) );
- // draw the bottom part of the background image - just the blue background to the native client UI
- mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
+ if (getChild<LLView>("login_widgets")->getVisible())
+ {
+ // draw a background box in black
+ gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+ // draw the bottom part of the background image
+ // just the blue background to the native client UI
+ mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
+ }
#endif
}
else
@@ -414,16 +464,10 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
if ( KEY_F1 == key )
{
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
- vhelp->showTopic(vhelp->getTopicFromFocus());
+ vhelp->showTopic(vhelp->f1HelpTopic());
return TRUE;
}
- if (KEY_RETURN == key && MASK_NONE == mask)
- {
- // let the panel handle UICtrl processing: calls onClickConnect()
- return LLPanel::handleKeyHere(key, mask);
- }
-
return LLPanel::handleKeyHere(key, mask);
}
@@ -483,6 +527,19 @@ void LLPanelLogin::giveFocus()
#endif
}
+// static
+void LLPanelLogin::showLoginWidgets()
+{
+ sInstance->childSetVisible("login_widgets", true);
+ LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+ web_browser->setOpenInExternalBrowser( true );
+ sInstance->reshapeBrowser();
+ // *TODO: Append all the usual login parameters, like first_login=Y etc.
+ std::string splash_screen_url = sInstance->getString("real_url");
+ web_browser->navigateTo( splash_screen_url, "text/html" );
+ LLUICtrl* first_name_edit = sInstance->getChild<LLUICtrl>("first_name_edit");
+ first_name_edit->setFocus(TRUE);
+}
// static
void LLPanelLogin::show(const LLRect &rect,
@@ -619,31 +676,41 @@ void LLPanelLogin::refreshLocation( bool force_visible )
{
// Don't show on first run after install
// Otherwise ShowStartLocation defaults to true.
- show_start = gSavedSettings.getBOOL("ShowStartLocation")
- && !gSavedSettings.getBOOL("FirstRunThisInstall");
+ show_start = gSavedSettings.getBOOL("ShowStartLocation");
}
sInstance->childSetVisible("start_location_combo", show_start);
sInstance->childSetVisible("start_location_text", show_start);
-#if LL_RELEASE_FOR_DOWNLOAD
BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
sInstance->childSetVisible("server_combo", show_server);
-#else
- sInstance->childSetVisible("server_combo", TRUE);
-#endif
#endif
}
// static
+void LLPanelLogin::updateLocationUI()
+{
+ if (!sInstance) return;
+
+ std::string sim_string = LLURLSimString::sInstance.mSimString;
+ if (!sim_string.empty())
+ {
+ // Replace "<Type region name>" with this region name
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+ combo->remove(2);
+ combo->add( sim_string );
+ combo->setTextEntry(sim_string);
+ combo->setCurrentByIndex( 2 );
+ }
+}
+
+// static
void LLPanelLogin::closePanel()
{
if (sInstance)
{
gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
-
- gFocusMgr.setDefaultKeyboardFocus(NULL);
delete sInstance;
sInstance = NULL;
@@ -697,8 +764,9 @@ void LLPanelLogin::loadLoginPage()
}
// Channel and Version
- std::string version = llformat("%d.%d.%d (%d)",
- LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD);
+ std::string version = llformat("%s (%d)",
+ LLVersionInfo::getShortVersion().c_str(),
+ LLVersionInfo::getBuild());
char* curl_channel = curl_escape(gSavedSettings.getString("VersionChannelName").c_str(), 0);
char* curl_version = curl_escape(version.c_str(), 0);
@@ -778,8 +846,7 @@ void LLPanelLogin::loadLoginPage()
{
oStr << "&auto_login=TRUE";
}
- if (gSavedSettings.getBOOL("ShowStartLocation")
- && !gSavedSettings.getBOOL("FirstRunThisInstall"))
+ if (gSavedSettings.getBOOL("ShowStartLocation"))
{
oStr << "&show_start_location=TRUE";
}
@@ -797,8 +864,17 @@ void LLPanelLogin::loadLoginPage()
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- // navigate to the "real" page
- web_browser->navigateTo( oStr.str(), "text/html" );
+ // navigate to the "real" page
+ if (gSavedSettings.getBOOL("RegInClient"))
+ {
+ web_browser->setFocus(TRUE);
+ login_page = sInstance->getString("reg_in_client_url");
+ web_browser->navigateTo(login_page, "text/html");
+ }
+ else
+ {
+ web_browser->navigateTo( oStr.str(), "text/html" );
+ }
}
void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
@@ -841,14 +917,29 @@ void LLPanelLogin::onClickConnect(void *)
LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
std::string combo_text = combo->getSimple();
- if (first.empty() || last.empty())
+ bool has_first_and_last = !(first.empty() || last.empty());
+ bool has_location = false;
+
+ if(combo_text=="<Type region name>" || combo_text =="")
{
- LLNotifications::instance().add("MustHaveAccountToLogIn");
+ // *NOTE: Mani - Location field is not always committed by this point!
+ // This may be duplicate work, but better than not doing the work!
+ LLURLSimString::sInstance.setString("");
}
- else if( (combo_text=="<Type region name>" || combo_text =="")
- && LLURLSimString::sInstance.mSimString =="")
+ else
+ {
+ // *NOTE: Mani - Location field is not always committed by this point!
+ LLURLSimString::sInstance.setString(combo_text);
+ has_location = true;
+ }
+
+ if(!has_first_and_last)
{
- LLNotifications::instance().add("StartRegionEmpty");
+ LLNotificationsUtil::add("MustHaveAccountToLogIn");
+ }
+ else if(!has_location)
+ {
+ LLNotificationsUtil::add("StartRegionEmpty");
}
else
{
@@ -862,7 +953,7 @@ void LLPanelLogin::onClickConnect(void *)
// static
bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
llinfos << "Going to account creation URL" << llendl;
@@ -883,22 +974,6 @@ void LLPanelLogin::onClickNewAccount(void*)
}
-// *NOTE: This function is dead as of 2008 August. I left it here in case
-// we suddenly decide to put the Quit button back. JC
-// static
-void LLPanelLogin::onClickQuit(void*)
-{
- if (sInstance && sInstance->mCallback)
- {
- // tell the responder we're not here anymore
- if ( gResponsePtr )
- gResponsePtr->setParent( 0 );
-
- sInstance->mCallback(1, sInstance->mCallbackData);
- }
-}
-
-
// static
void LLPanelLogin::onClickVersion(void*)
{
@@ -914,12 +989,22 @@ void LLPanelLogin::onClickForgotPassword(void*)
}
}
+//static
+void LLPanelLogin::onClickHelp(void*)
+{
+ if (sInstance)
+ {
+ LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+ vhelp->showTopic(vhelp->preLoginTopic());
+ }
+}
+
// static
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{
if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
{
- LLNotifications::instance().add("CapsKeyOn");
+ LLNotificationsUtil::add("CapsKeyOn");
sCapslockDidNotification = TRUE;
}
}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 5692b8d345..1fdc3a9361 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -36,10 +36,11 @@
#include "llpanel.h"
#include "llpointer.h" // LLPointer<>
#include "llmediactrl.h" // LLMediaCtrlObserver
+#include <boost/scoped_ptr.hpp>
class LLLineEditor;
class LLUIImage;
-
+class LLPanelLoginListener;
class LLPanelLogin:
public LLPanel,
@@ -56,6 +57,10 @@ public:
virtual void draw();
virtual void setFocus( BOOL b );
+ // Show the XUI first name, last name, and password widgets. They are
+ // hidden on startup for reg-in-client
+ static void showLoginWidgets();
+
static void show(const LLRect &rect, BOOL show_server,
void (*callback)(S32 option, void* user_data),
void* callback_data);
@@ -66,6 +71,7 @@ public:
static void addServer(const std::string& server, S32 domain_name);
static void refreshLocation( bool force_visible );
+ static void updateLocationUI();
static void getFields(std::string *firstname, std::string *lastname,
std::string *password);
@@ -86,18 +92,21 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
private:
+ friend class LLPanelLoginListener;
+ void reshapeBrowser();
static void onClickConnect(void*);
static void onClickNewAccount(void*);
// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
- static void onClickQuit(void*);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
+ static void onClickHelp(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
static void onSelectServer(LLUICtrl*, void*);
static void onServerComboLostFocus(LLFocusableElement*);
-
+
private:
LLPointer<LLUIImage> mLogoImage;
+ boost::scoped_ptr<LLPanelLoginListener> mListener;
void (*mCallback)(S32 option, void *userdata);
void* mCallbackData;
diff --git a/indra/newview/llpanelloginlistener.cpp b/indra/newview/llpanelloginlistener.cpp
new file mode 100644
index 0000000000..f7e59aaf54
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.cpp
@@ -0,0 +1,34 @@
+/**
+ * @file llpanelloginlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llpanelloginlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llpanelloginlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llpanellogin.h"
+
+LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance):
+ LLEventAPI("LLPanelLogin", "Access to LLPanelLogin methods"),
+ mPanel(instance)
+{
+ add("onClickConnect",
+ "Pretend user clicked the \"Log In\" button",
+ &LLPanelLoginListener::onClickConnect);
+}
+
+void LLPanelLoginListener::onClickConnect(const LLSD&) const
+{
+ mPanel->onClickConnect(NULL);
+}
diff --git a/indra/newview/llpanelloginlistener.h b/indra/newview/llpanelloginlistener.h
new file mode 100644
index 0000000000..0a56c75422
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file llpanelloginlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLPanelLogin
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLPANELLOGINLISTENER_H)
+#define LL_LLPANELLOGINLISTENER_H
+
+#include "lleventapi.h"
+class LLPanelLogin;
+class LLSD;
+
+class LLPanelLoginListener: public LLEventAPI
+{
+public:
+ LLPanelLoginListener(LLPanelLogin* instance);
+
+private:
+ void onClickConnect(const LLSD&) const;
+
+ LLPanelLogin* mPanel;
+};
+
+#endif /* ! defined(LL_LLPANELLOGINLISTENER_H) */
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
new file mode 100644
index 0000000000..2d3401966b
--- /dev/null
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -0,0 +1,1182 @@
+/**
+ * @file llsidepanelmaininventory.cpp
+ * @brief Implementation of llsidepanelmaininventory.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelmaininventory.h"
+
+#include "llagent.h"
+#include "lldndbutton.h"
+#include "lleconomy.h"
+#include "llfilepicker.h"
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llfiltereditor.h"
+#include "llfloaterreg.h"
+#include "llpreviewtexture.h"
+#include "llscrollcontainer.h"
+#include "llsdserialize.h"
+#include "llspinctrl.h"
+#include "lltooldraganddrop.h"
+#include "llviewermenu.h"
+#include "llviewertexturelist.h"
+
+const std::string FILTERS_FILENAME("filters.xml");
+
+static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory");
+
+void on_file_loaded_for_save(BOOL success,
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata);
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+class LLFloaterInventoryFinder : public LLFloater
+{
+public:
+ LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
+ virtual void draw();
+ /*virtual*/ BOOL postBuild();
+ void changeFilter(LLInventoryFilter* filter);
+ void updateElementsFromFilter();
+ BOOL getCheckShowEmpty();
+ BOOL getCheckSinceLogoff();
+
+ static void onTimeAgo(LLUICtrl*, void *);
+ static void onCheckSinceLogoff(LLUICtrl*, void *);
+ static void onCloseBtn(void* user_data);
+ static void selectAllTypes(void* user_data);
+ static void selectNoTypes(void* user_data);
+private:
+ LLPanelMainInventory* mPanelMainInventory;
+ LLSpinCtrl* mSpinSinceDays;
+ LLSpinCtrl* mSpinSinceHours;
+ LLInventoryFilter* mFilter;
+};
+
+///----------------------------------------------------------------------------
+/// LLPanelMainInventory
+///----------------------------------------------------------------------------
+
+LLPanelMainInventory::LLPanelMainInventory()
+ : LLPanel(),
+ mActivePanel(NULL),
+ mSavedFolderState(NULL),
+ mFilterText(""),
+ mMenuGearDefault(NULL),
+ mMenuAdd(NULL),
+ mNeedUploadCost(true)
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
+ // Menu Callbacks (non contex menus)
+ mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
+ 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));
+
+ // Controls
+ // *TODO: Just use persistant settings for each of these
+ U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
+ BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
+ BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
+ BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
+
+ gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
+ gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
+ gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
+ gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
+
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+}
+
+BOOL LLPanelMainInventory::postBuild()
+{
+ gInventory.addObserver(this);
+
+ mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
+ mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
+
+ //panel->getFilter()->markDefault();
+
+ // Set up the default inv. panel/filter settings.
+ mActivePanel = getChild<LLInventoryPanel>("All Items");
+ if (mActivePanel)
+ {
+ // "All Items" is the previous only view, so it gets the InventorySortOrder
+ mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
+ mActivePanel->getFilter()->markDefault();
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+ }
+ LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+ if (recent_items_panel)
+ {
+ recent_items_panel->setSinceLogoff(TRUE);
+ recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
+ recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ recent_items_panel->getFilter()->markDefault();
+ recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
+ }
+
+ // Now load the stored settings from disk, if available.
+ std::ostringstream filterSaveName;
+ filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME);
+ llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;
+ llifstream file(filterSaveName.str());
+ LLSD savedFilterState;
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(savedFilterState, file);
+ file.close();
+
+ // Load the persistent "Recent Items" settings.
+ // Note that the "All Items" settings do not persist.
+ if(recent_items_panel)
+ {
+ if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
+ {
+ LLSD recent_items = savedFilterState.get(
+ recent_items_panel->getFilter()->getName());
+ recent_items_panel->getFilter()->fromLLSD(recent_items);
+ }
+ }
+
+ }
+
+ mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
+ if (mFilterEditor)
+ {
+ mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
+ }
+
+ // *TODO:Get the cost info from the server
+ const std::string upload_cost("10");
+ childSetLabelArg("Upload Image", "[COST]", upload_cost);
+ childSetLabelArg("Upload Sound", "[COST]", upload_cost);
+ childSetLabelArg("Upload Animation", "[COST]", upload_cost);
+ childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
+
+ initListCommandsHandlers();
+ return TRUE;
+}
+
+// Destroys the object
+LLPanelMainInventory::~LLPanelMainInventory( void )
+{
+ // Save the filters state.
+ LLSD filterRoot;
+ LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
+ if (all_items_panel)
+ {
+ LLInventoryFilter* filter = all_items_panel->getFilter();
+ if (filter)
+ {
+ LLSD filterState;
+ filter->toLLSD(filterState);
+ filterRoot[filter->getName()] = filterState;
+ }
+ }
+
+ LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+ if (recent_items_panel)
+ {
+ LLInventoryFilter* filter = recent_items_panel->getFilter();
+ if (filter)
+ {
+ LLSD filterState;
+ filter->toLLSD(filterState);
+ filterRoot[filter->getName()] = filterState;
+ }
+ }
+
+ std::ostringstream filterSaveName;
+ filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME);
+ llofstream filtersFile(filterSaveName.str());
+ if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
+ {
+ llwarns << "Could not write to filters save file " << filterSaveName << llendl;
+ }
+ else
+ filtersFile.close();
+
+ gInventory.removeObserver(this);
+ delete mSavedFolderState;
+}
+
+void LLPanelMainInventory::startSearch()
+{
+ // this forces focus to line editor portion of search editor
+ if (mFilterEditor)
+ {
+ mFilterEditor->focusFirstItem(TRUE);
+ }
+}
+
+BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
+{
+ LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
+ if (root_folder)
+ {
+ // first check for user accepting current search results
+ if (mFilterEditor
+ && mFilterEditor->hasFocus()
+ && (key == KEY_RETURN
+ || key == KEY_DOWN)
+ && mask == MASK_NONE)
+ {
+ // move focus to inventory proper
+ mActivePanel->setFocus(TRUE);
+ root_folder->scrollToShowSelection();
+ return TRUE;
+ }
+
+ if (mActivePanel->hasFocus() && key == KEY_UP)
+ {
+ startSearch();
+ }
+ }
+
+ return LLPanel::handleKeyHere(key, mask);
+
+}
+
+//----------------------------------------------------------------------------
+// menu callbacks
+
+void LLPanelMainInventory::doToSelected(const LLSD& userdata)
+{
+ getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
+}
+
+void LLPanelMainInventory::closeAllFolders()
+{
+ getPanel()->getRootFolder()->closeAllFolders();
+}
+
+void LLPanelMainInventory::newWindow()
+{
+ LLFloaterInventory::showAgentInventory();
+}
+
+void LLPanelMainInventory::doCreate(const LLSD& userdata)
+{
+ menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+}
+
+void LLPanelMainInventory::resetFilters()
+{
+ LLFloaterInventoryFinder *finder = getFinder();
+ getActivePanel()->getFilter()->resetDefault();
+ if (finder)
+ {
+ finder->updateElementsFromFilter();
+ }
+
+ setFilterTextFromFilter();
+}
+
+void LLPanelMainInventory::setSortBy(const LLSD& userdata)
+{
+ std::string sort_field = userdata.asString();
+ if (sort_field == "name")
+ {
+ U32 order = getActivePanel()->getSortOrder();
+ getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
+
+ gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
+ gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
+ }
+ else if (sort_field == "date")
+ {
+ U32 order = getActivePanel()->getSortOrder();
+ getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
+
+ gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
+ gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
+ }
+ else if (sort_field == "foldersalwaysbyname")
+ {
+ U32 order = getActivePanel()->getSortOrder();
+ if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
+ {
+ order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+ gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
+ }
+ else
+ {
+ order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+ gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
+ }
+ getActivePanel()->setSortOrder( order );
+ }
+ else if (sort_field == "systemfolderstotop")
+ {
+ U32 order = getActivePanel()->getSortOrder();
+ if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
+ {
+ order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+ gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
+ }
+ else
+ {
+ order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+ gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
+ }
+ getActivePanel()->setSortOrder( order );
+ }
+}
+
+// static
+BOOL LLPanelMainInventory::filtersVisible(void* user_data)
+{
+ LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
+ if(!self) return FALSE;
+
+ return self->getFinder() != NULL;
+}
+
+void LLPanelMainInventory::onClearSearch()
+{
+ LLFloater *finder = getFinder();
+ if (mActivePanel)
+ {
+ mActivePanel->setFilterSubString(LLStringUtil::null);
+ mActivePanel->setFilterTypes(0xffffffff);
+ }
+
+ if (finder)
+ {
+ LLFloaterInventoryFinder::selectAllTypes(finder);
+ }
+
+ // re-open folders that were initially open
+ if (mActivePanel)
+ {
+ mSavedFolderState->setApply(TRUE);
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
+ mActivePanel->getRootFolder()->scrollToShowSelection();
+ }
+ mFilterSubString = "";
+}
+
+void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
+{
+ if (search_string == "")
+ {
+ onClearSearch();
+ }
+ if (!mActivePanel)
+ {
+ return;
+ }
+
+ gInventory.startBackgroundFetch();
+
+ std::string uppercase_search_string = search_string;
+ LLStringUtil::toUpper(uppercase_search_string);
+ mFilterSubString = uppercase_search_string;
+ if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
+ {
+ // current filter and new filter empty, do nothing
+ return;
+ }
+
+ // save current folder open state if no filter currently applied
+ if (!mActivePanel->getRootFolder()->isFilterModified())
+ {
+ mSavedFolderState->setApply(FALSE);
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ }
+
+ // set new filter string
+ mActivePanel->setFilterSubString(mFilterSubString);
+}
+
+
+ //static
+ BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
+ {
+ LLPanelMainInventory* active_view = NULL;
+
+ 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)
+ {
+ LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
+ if (iv)
+ {
+ if (gFocusMgr.childHasKeyboardFocus(iv))
+ {
+ active_view = iv;
+ break;
+ }
+ }
+ }
+
+ if (!active_view)
+ {
+ return FALSE;
+ }
+
+ std::string search_string(find_text);
+
+ if (search_string.empty())
+ {
+ return FALSE;
+ }
+
+ if (active_view->getPanel() &&
+ active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+void LLPanelMainInventory::onFilterSelected()
+{
+ // Find my index
+ mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
+
+ if (!mActivePanel)
+ {
+ return;
+ }
+ setFilterSubString(mFilterSubString);
+ LLInventoryFilter* filter = mActivePanel->getFilter();
+ LLFloaterInventoryFinder *finder = getFinder();
+ if (finder)
+ {
+ finder->changeFilter(filter);
+ }
+ if (filter->isActive())
+ {
+ // If our filter is active we may be the first thing requiring a fetch so we better start it here.
+ gInventory.startBackgroundFetch();
+ }
+ setFilterTextFromFilter();
+}
+
+const std::string LLPanelMainInventory::getFilterSubString()
+{
+ return mActivePanel->getFilterSubString();
+}
+
+void LLPanelMainInventory::setFilterSubString(const std::string& string)
+{
+ mActivePanel->setFilterSubString(string);
+}
+
+BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // Check to see if we are auto scrolling from the last frame
+ LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
+ BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+ if(mFilterTabs)
+ {
+ if(needsToScroll)
+ {
+ mFilterTabs->startDragAndDropDelayTimer();
+ }
+ }
+
+ BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+ return handled;
+}
+
+// virtual
+void LLPanelMainInventory::changed(U32)
+{
+ // empty, but must have this defined for abstract base class.
+}
+
+
+// virtual
+void LLPanelMainInventory::draw()
+{
+ if (mActivePanel && mFilterEditor)
+ {
+ mFilterEditor->setText(mFilterSubString);
+ }
+ LLPanel::draw();
+}
+
+void LLPanelMainInventory::setFilterTextFromFilter()
+{
+ mFilterText = mActivePanel->getFilter()->getFilterText();
+}
+
+void LLPanelMainInventory::toggleFindOptions()
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
+ LLFloater *floater = getFinder();
+ if (!floater)
+ {
+ LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
+ mFinderHandle = finder->getHandle();
+ finder->openFloater();
+
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
+ parent_floater->addDependentFloater(mFinderHandle);
+ // start background fetch of folders
+ gInventory.startBackgroundFetch();
+ }
+ else
+ {
+ floater->closeFloater();
+ }
+}
+
+void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+{
+ getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb);
+ getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb);
+}
+
+void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+ updateListCommands();
+ panel->onSelectionChange(items, user_action);
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+LLFloaterInventoryFinder* LLPanelMainInventory::getFinder()
+{
+ return (LLFloaterInventoryFinder*)mFinderHandle.get();
+}
+
+
+LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :
+ LLFloater(LLSD()),
+ mPanelMainInventory(inventory_view),
+ mFilter(inventory_view->getPanel()->getFilter())
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
+ updateElementsFromFilter();
+}
+
+
+void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
+{
+ LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+ if (!self) return;
+
+ bool since_logoff= self->childGetValue("check_since_logoff");
+
+ if (!since_logoff &&
+ !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) )
+ {
+ self->mSpinSinceHours->set(1.0f);
+ }
+}
+BOOL LLFloaterInventoryFinder::postBuild()
+{
+ const LLRect& viewrect = mPanelMainInventory->getRect();
+ setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
+
+ childSetAction("All", selectAllTypes, this);
+ childSetAction("None", selectNoTypes, this);
+
+ mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
+ childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
+
+ mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
+ childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+
+ // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff");
+ childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
+
+ childSetAction("Close", onCloseBtn, this);
+
+ updateElementsFromFilter();
+ return TRUE;
+}
+void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
+{
+ LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+ if (!self) return;
+
+ bool since_logoff=true;
+ if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
+ {
+ since_logoff = false;
+ }
+ self->childSetValue("check_since_logoff", since_logoff);
+}
+
+void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
+{
+ mFilter = filter;
+ updateElementsFromFilter();
+}
+
+void LLFloaterInventoryFinder::updateElementsFromFilter()
+{
+ if (!mFilter)
+ return;
+
+ // Get data needed for filter display
+ U32 filter_types = mFilter->getFilterObjectTypes();
+ std::string filter_string = mFilter->getFilterSubString();
+ LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
+ U32 hours = mFilter->getHoursAgo();
+
+ // update the ui elements
+ setTitle(mFilter->getName());
+
+ childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
+
+ childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
+ childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
+ childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
+ childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+ childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
+ childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
+ childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
+ childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
+ childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
+ childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
+ childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+ childSetValue("check_since_logoff", mFilter->isSinceLogoff());
+ mSpinSinceHours->set((F32)(hours % 24));
+ mSpinSinceDays->set((F32)(hours / 24));
+}
+
+void LLFloaterInventoryFinder::draw()
+{
+ LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
+ U32 filter = 0xffffffff;
+ BOOL filtered_by_all_types = TRUE;
+
+ if (!childGetValue("check_animation"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
+ filtered_by_all_types = FALSE;
+ }
+
+
+ if (!childGetValue("check_calling_card"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_clothing"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_gesture"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_landmark"))
+
+
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_notecard"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_object"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
+ filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_script"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_LSL);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_sound"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_SOUND);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_texture"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!childGetValue("check_snapshot"))
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
+ filtered_by_all_types = FALSE;
+ }
+
+ if (!filtered_by_all_types)
+ {
+ // don't include folders in filter, unless I've selected everything
+ filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
+ }
+
+ // update the panel, panel will update the filter
+ mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->getPanel()->setFilterTypes(filter);
+ if (getCheckSinceLogoff())
+ {
+ mSpinSinceDays->set(0);
+ mSpinSinceHours->set(0);
+ }
+ U32 days = (U32)mSpinSinceDays->get();
+ U32 hours = (U32)mSpinSinceHours->get();
+ if (hours > 24)
+ {
+ days += hours / 24;
+ hours = (U32)hours % 24;
+ mSpinSinceDays->set((F32)days);
+ mSpinSinceHours->set((F32)hours);
+ }
+ hours += days * 24;
+ mPanelMainInventory->getPanel()->setHoursAgo(hours);
+ mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->setFilterTextFromFilter();
+
+ LLPanel::draw();
+}
+
+BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
+{
+ return childGetValue("check_show_empty");
+}
+
+BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
+{
+ return childGetValue("check_since_logoff");
+}
+
+void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
+{
+ LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
+ finderp->closeFloater();
+}
+
+// static
+void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
+{
+ LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+ if(!self) return;
+
+ self->childSetValue("check_animation", TRUE);
+ self->childSetValue("check_calling_card", TRUE);
+ self->childSetValue("check_clothing", TRUE);
+ self->childSetValue("check_gesture", TRUE);
+ self->childSetValue("check_landmark", TRUE);
+ self->childSetValue("check_notecard", TRUE);
+ self->childSetValue("check_object", TRUE);
+ self->childSetValue("check_script", TRUE);
+ self->childSetValue("check_sound", TRUE);
+ self->childSetValue("check_texture", TRUE);
+ self->childSetValue("check_snapshot", TRUE);
+}
+
+//static
+void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
+{
+ LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+ if(!self) return;
+
+ self->childSetValue("check_animation", FALSE);
+ self->childSetValue("check_calling_card", FALSE);
+ self->childSetValue("check_clothing", FALSE);
+ self->childSetValue("check_gesture", FALSE);
+ self->childSetValue("check_landmark", FALSE);
+ self->childSetValue("check_notecard", FALSE);
+ self->childSetValue("check_object", FALSE);
+ self->childSetValue("check_script", FALSE);
+ self->childSetValue("check_sound", FALSE);
+ self->childSetValue("check_texture", FALSE);
+ self->childSetValue("check_snapshot", FALSE);
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands //
+
+void LLPanelMainInventory::initListCommandsHandlers()
+{
+ mListCommands = getChild<LLPanel>("bottom_panel");
+
+ mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
+ mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
+ mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
+
+ LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+ trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
+ , _4 // BOOL drop
+ , _5 // EDragAndDropType cargo_type
+ , _7 // EAcceptance* accept
+ ));
+
+ mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLPanelMainInventory::updateListCommands()
+{
+ bool trash_enabled = isActionEnabled("delete");
+
+ mListCommands->childSetEnabled("trash_btn", trash_enabled);
+}
+
+void LLPanelMainInventory::onGearButtonClick()
+{
+ showActionMenu(mMenuGearDefault,"options_gear_btn");
+}
+
+void LLPanelMainInventory::onAddButtonClick()
+{
+ setUploadCostIfNeeded();
+
+ showActionMenu(mMenuAdd,"add_btn");
+}
+
+void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
+{
+ if (menu)
+ {
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ LLView* spawning_view = getChild<LLView> (spawning_view_name);
+ S32 menu_x, menu_y;
+ //show menu in co-ordinates of panel
+ spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
+ menu_y += menu->getRect().getHeight();
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+ }
+}
+
+void LLPanelMainInventory::onTrashButtonClick()
+{
+ onClipboardAction("delete");
+}
+
+void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
+{
+ std::string command_name = userdata.asString();
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+}
+
+void LLPanelMainInventory::saveTexture(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ }
+}
+
+void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ return;
+
+ const std::string command_name = userdata.asString();
+ if (command_name == "new_window")
+ {
+ newWindow();
+ }
+ if (command_name == "sort_by_name")
+ {
+ const LLSD arg = "name";
+ setSortBy(arg);
+ }
+ if (command_name == "sort_by_recent")
+ {
+ const LLSD arg = "date";
+ setSortBy(arg);
+ }
+ if (command_name == "show_filters")
+ {
+ toggleFindOptions();
+ }
+ if (command_name == "reset_filters")
+ {
+ resetFilters();
+ }
+ if (command_name == "close_folders")
+ {
+ closeAllFolders();
+ }
+ if (command_name == "empty_trash")
+ {
+ const std::string notification = "ConfirmEmptyTrash";
+ gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH);
+ }
+ if (command_name == "empty_lostnfound")
+ {
+ const std::string notification = "ConfirmEmptyLostAndFound";
+ gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND);
+ }
+ if (command_name == "save_texture")
+ {
+ saveTexture(userdata);
+ }
+ // This doesn't currently work, since the viewer can't change an assetID an item.
+ if (command_name == "regenerate_link")
+ {
+ LLInventoryPanel *active_panel = getActivePanel();
+ LLFolderViewItem* current_item = active_panel->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ const LLUUID item_id = current_item->getListener()->getUUID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item)
+ {
+ item->regenerateLink();
+ }
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ }
+ if (command_name == "find_original")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ current_item->getListener()->performAction(getActivePanel()->getRootFolder(), getActivePanel()->getModel(), "goto");
+ }
+
+ if (command_name == "find_links")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ const std::string &item_name = current_item->getListener()->getName();
+ mFilterSubString = item_name;
+ LLInventoryFilter *filter = mActivePanel->getFilter();
+ filter->setFilterSubString(item_name);
+ mFilterEditor->setText(item_name);
+
+ mFilterEditor->setFocus(TRUE);
+ filter->setFilterUUID(item_id);
+ filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ }
+}
+
+bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ LLViewerInventoryItem *inv_item = current_item->getInventoryItem();
+ if(inv_item)
+ {
+ bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType();
+ return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
+ }
+ }
+ return false;
+}
+
+BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+ if (command_name == "delete")
+ {
+ BOOL can_delete = FALSE;
+ LLFolderView *folder = getActivePanel()->getRootFolder();
+ if (folder)
+ {
+ can_delete = TRUE;
+ std::set<LLUUID> selection_set;
+ folder->getSelectionList(selection_set);
+ if (selection_set.empty()) return FALSE;
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLFolderViewItem *item = folder->getItemByID(item_id);
+ const LLFolderViewEventListener *listener = item->getListener();
+ llassert(listener);
+ if (!listener) return FALSE;
+ can_delete &= listener->isItemRemovable();
+ can_delete &= !listener->isItemInTrash();
+ }
+ return can_delete;
+ }
+ return FALSE;
+ }
+ if (command_name == "save_texture")
+ {
+ return isSaveTextureEnabled(userdata);
+ }
+ if (command_name == "find_original")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return FALSE;
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item && item->getIsLinkType() && !item->getIsBrokenLink())
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ if (command_name == "find_links")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return FALSE;
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLInventoryObject *obj = gInventory.getObject(item_id);
+ if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ // This doesn't currently work, since the viewer can't change an assetID an item.
+ if (command_name == "regenerate_link")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return FALSE;
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ const LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item && item->getIsBrokenLink())
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+ *accept = ACCEPT_NO;
+
+ const bool is_enabled = isActionEnabled("delete");
+ if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+ if (is_enabled && drop)
+ {
+ onClipboardAction("delete");
+ }
+ return true;
+}
+
+void LLPanelMainInventory::setUploadCostIfNeeded()
+{
+ // *NOTE dzaporozhan
+ // Upload cost is set in process_economy_data() (llviewermessage.cpp). But since we
+ // have two instances of Inventory panel at the moment(and two instances of context menu),
+ // call to gMenuHolder->childSetLabelArg() sets upload cost only for one of the instances.
+
+ if(mNeedUploadCost && mMenuAdd)
+ {
+ LLMenuItemBranchGL* upload_menu = mMenuAdd->findChild<LLMenuItemBranchGL>("upload");
+ if(upload_menu)
+ {
+ S32 upload_cost = -1;//LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ std::string cost_str;
+
+ // getPriceUpload() returns -1 if no data available yet.
+ if(upload_cost >= 0)
+ {
+ mNeedUploadCost = false;
+ cost_str = llformat("%d", upload_cost);
+ }
+ else
+ {
+ cost_str = llformat("%d", gSavedSettings.getU32("DefaultUploadCost"));
+ }
+
+ upload_menu->getChild<LLView>("Upload Image")->setLabelArg("[COST]", cost_str);
+ upload_menu->getChild<LLView>("Upload Sound")->setLabelArg("[COST]", cost_str);
+ upload_menu->getChild<LLView>("Upload Animation")->setLabelArg("[COST]", cost_str);
+ upload_menu->getChild<LLView>("Bulk Upload")->setLabelArg("[COST]", cost_str);
+ }
+ }
+}
+
+// List Commands //
+////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
new file mode 100644
index 0000000000..d9ea0da2da
--- /dev/null
+++ b/indra/newview/llpanelmaininventory.h
@@ -0,0 +1,159 @@
+/**
+ * @file llpanelmaininventory.h
+ * @brief llpanelmaininventory.h
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMAININVENTORY_H
+#define LL_LLPANELMAININVENTORY_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+#include "llfolderview.h"
+
+class LLFolderViewItem;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+class LLFloaterInventoryFinder;
+class LLMenuGL;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelMainInventory
+//
+// This is a panel used to view and control an agent's inventory,
+// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters).
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelMainInventory : public LLPanel, LLInventoryObserver
+{
+public:
+ friend class LLFloaterInventoryFinder;
+
+ LLPanelMainInventory();
+ ~LLPanelMainInventory();
+
+ BOOL postBuild();
+
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ // Inherited functionality
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+ /*virtual*/ void changed(U32);
+ /*virtual*/ void draw();
+
+ LLInventoryPanel* getPanel() { return mActivePanel; }
+ LLInventoryPanel* getActivePanel() { return mActivePanel; }
+ const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+
+ const std::string& getFilterText() const { return mFilterText; }
+
+ void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+
+protected:
+ //
+ // Misc functions
+ //
+ void setFilterTextFromFilter();
+ void startSearch();
+
+ void toggleFindOptions();
+ void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
+
+ static BOOL filtersVisible(void* user_data);
+ void onClearSearch();
+ static void onFoldersByName(void *user_data);
+ static BOOL checkFoldersByName(void *user_data);
+ void onFilterEdit(const std::string& search_string );
+ static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
+ void onFilterSelected();
+
+ const std::string getFilterSubString();
+ void setFilterSubString(const std::string& string);
+
+ // menu callbacks
+ void doToSelected(const LLSD& userdata);
+ void closeAllFolders();
+ void newWindow();
+ void doCreate(const LLSD& userdata);
+ void resetFilters();
+ void setSortBy(const LLSD& userdata);
+ void saveTexture(const LLSD& userdata);
+ bool isSaveTextureEnabled(const LLSD& userdata);
+
+private:
+ LLFloaterInventoryFinder* getFinder();
+
+ LLFilterEditor* mFilterEditor;
+ LLTabContainer* mFilterTabs;
+ LLHandle<LLFloater> mFinderHandle;
+ LLInventoryPanel* mActivePanel;
+ LLSaveFolderState* mSavedFolderState;
+ std::string mFilterText;
+ std::string mFilterSubString;
+
+
+ //////////////////////////////////////////////////////////////////////////////////
+ // List Commands //
+protected:
+ void initListCommandsHandlers();
+ void updateListCommands();
+ void onGearButtonClick();
+ void onAddButtonClick();
+ void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
+ void onTrashButtonClick();
+ void onClipboardAction(const LLSD& userdata);
+ BOOL isActionEnabled(const LLSD& command_name);
+ void onCustomAction(const LLSD& command_name);
+ bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+ /**
+ * Set upload cost in "Upload" sub menu.
+ */
+ void setUploadCostIfNeeded();
+private:
+ LLPanel* mListCommands;
+ LLMenuGL* mMenuGearDefault;
+ LLMenuGL* mMenuAdd;
+
+ bool mNeedUploadCost;
+ // List Commands //
+ ////////////////////////////////////////////////////////////////////////////////
+};
+
+#endif // LL_LLPANELMAININVENTORY_H
+
+
+
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
new file mode 100644
index 0000000000..3504cbd1ef
--- /dev/null
+++ b/indra/newview/llpanelme.cpp
@@ -0,0 +1,288 @@
+/**
+ * @file llpanelme.cpp
+ * @brief Side tray "Me" (My Profile) panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelprofile.h"
+#include "llavatarconstants.h"
+#include "llpanelme.h"
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "lliconctrl.h"
+#include "llsidetray.h"
+#include "lltabcontainer.h"
+#include "lltexturectrl.h"
+#include "llviewercontrol.h"
+
+#define PICKER_SECOND_LIFE "2nd_life_pic"
+#define PICKER_FIRST_LIFE "real_world_pic"
+#define PANEL_PROFILE "panel_profile"
+
+static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel");
+static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me");
+
+LLPanelMe::LLPanelMe(void)
+ : LLPanelProfile()
+ , mEditPanel(NULL)
+{
+ setAvatarId(gAgent.getID());
+}
+
+BOOL LLPanelMe::postBuild()
+{
+ LLPanelProfile::postBuild();
+
+ getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this);
+ getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this);
+
+ return TRUE;
+}
+
+void LLPanelMe::onOpen(const LLSD& key)
+{
+ LLPanelProfile::onOpen(key);
+
+ // Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068)
+ bool opened = gSavedSettings.getBOOL("MePanelOpened");
+ // In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this
+ // is the last time onOpen() is called
+ if( !opened && !LLSideTray::getInstance()->getCollapsed() )
+ {
+ buildEditPanel();
+ openPanel(mEditPanel, getAvatarId());
+
+ gSavedSettings.setBOOL("MePanelOpened", true);
+ }
+}
+
+bool LLPanelMe::notifyChildren(const LLSD& info)
+{
+ if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
+ {
+ // Implement task panel tri-state behavior.
+ //
+ // When the button of an active open task panel is clicked, side tray
+ // calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument.
+ // The task panel is supposed to handle this by reverting to the default view,
+ // i.e. closing any dependent panels like "pick info" or "profile edit".
+
+ bool on_default_view = true;
+
+ const LLRect& task_panel_rect = getRect();
+ for (LLView* child = getFirstChild(); child; child = findNextSibling(child))
+ {
+ LLPanel* panel = dynamic_cast<LLPanel*>(child);
+ if (!panel)
+ continue;
+
+ // *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit).
+ if (panel->getRect().getWidth() == task_panel_rect.getWidth() &&
+ panel->getRect().getHeight() == task_panel_rect.getHeight() &&
+ panel->getVisible())
+ {
+ panel->setVisible(FALSE);
+ on_default_view = false;
+ }
+ }
+
+ if (on_default_view)
+ LLSideTray::getInstance()->collapseSideBar();
+
+ return true; // this notification is only supposed to be handled by task panels
+ }
+
+ return LLPanel::notifyChildren(info);
+}
+
+void LLPanelMe::buildEditPanel()
+{
+ if (NULL == mEditPanel)
+ {
+ mEditPanel = new LLPanelMyProfileEdit();
+ mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this);
+ mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);
+ }
+}
+
+
+void LLPanelMe::onEditProfileClicked()
+{
+ buildEditPanel();
+ togglePanel(mEditPanel, getAvatarId()); // open
+}
+
+void LLPanelMe::onEditAppearanceClicked()
+{
+ if (gAgentWearables.areWearablesLoaded())
+ {
+ gAgent.changeCameraToCustomizeAvatar();
+ }
+}
+
+void LLPanelMe::onSaveChangesClicked()
+{
+ LLAvatarData data = LLAvatarData();
+ data.avatar_id = gAgent.getID();
+ data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID();
+ data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID();
+ data.about_text = mEditPanel->childGetValue("sl_description_edit").asString();
+ data.fl_about_text = mEditPanel->childGetValue("fl_description_edit").asString();
+ data.profile_url = mEditPanel->childGetValue("homepage_edit").asString();
+ data.allow_publish = mEditPanel->childGetValue("show_in_search_checkbox");
+
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data);
+ togglePanel(mEditPanel); // close
+ onOpen(getAvatarId());
+}
+
+void LLPanelMe::onCancelClicked()
+{
+ togglePanel(mEditPanel); // close
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelMyProfileEdit::LLPanelMyProfileEdit()
+ : LLPanelMyProfile()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_edit_profile.xml");
+
+ setAvatarId(gAgent.getID());
+}
+
+void LLPanelMyProfileEdit::onOpen(const LLSD& key)
+{
+ resetData();
+
+ // Disable editing until data is loaded, or edited fields will be overwritten when data
+ // is loaded.
+ enableEditing(false);
+ LLPanelMyProfile::onOpen(getAvatarId());
+}
+
+void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type)
+{
+ if(APT_PROPERTIES == type)
+ {
+ const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
+ if(avatar_data && getAvatarId() == avatar_data->avatar_id)
+ {
+ // *TODO dzaporozhan
+ // Workaround for ticket EXT-1099, waiting for fix for ticket EXT-1128
+ enableEditing(true);
+ processProfileProperties(avatar_data);
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
+ }
+ }
+}
+
+void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_data)
+{
+ fillCommonData(avatar_data);
+
+ // 'Home page' was hidden in LLPanelAvatarProfile::fillCommonData() to fix EXT-4734
+ // Show 'Home page' in Edit My Profile (EXT-4873)
+ childSetVisible("homepage_edit", true);
+
+ fillPartnerData(avatar_data);
+
+ fillAccountStatus(avatar_data);
+
+ childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
+
+ std::string first, last;
+ BOOL found = gCacheName->getName(avatar_data->avatar_id, first, last);
+ if (found)
+ {
+ childSetTextArg("name_text", "[FIRST]", first);
+ childSetTextArg("name_text", "[LAST]", last);
+ }
+}
+
+BOOL LLPanelMyProfileEdit::postBuild()
+{
+ initTexturePickerMouseEvents();
+
+ childSetTextArg("partner_edit_link", "[URL]", getString("partner_edit_link_url"));
+ childSetTextArg("my_account_link", "[URL]", getString("my_account_link_url"));
+
+ return LLPanelAvatarProfile::postBuild();
+}
+/**
+ * Inits map with texture picker and appropriate edit icon.
+ * Sets callbacks of Mouse Enter and Mouse Leave signals of Texture Pickers
+ */
+void LLPanelMyProfileEdit::initTexturePickerMouseEvents()
+{
+ LLTextureCtrl* text_pic = getChild<LLTextureCtrl>(PICKER_SECOND_LIFE);
+ LLIconCtrl* text_icon = getChild<LLIconCtrl>("2nd_life_edit_icon");
+ mTextureEditIconMap[text_pic->getName()] = text_icon;
+ text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
+ text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
+ text_icon->setVisible(FALSE);
+
+ text_pic = getChild<LLTextureCtrl>(PICKER_FIRST_LIFE);
+ text_icon = getChild<LLIconCtrl>("real_world_edit_icon");
+ mTextureEditIconMap[text_pic->getName()] = text_icon;
+ text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
+ text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
+ text_icon->setVisible(FALSE);
+}
+
+void LLPanelMyProfileEdit::resetData()
+{
+ LLPanelMyProfile::resetData();
+
+ childSetTextArg("name_text", "[FIRST]", LLStringUtil::null);
+ childSetTextArg("name_text", "[LAST]", LLStringUtil::null);
+}
+
+void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
+{
+ mTextureEditIconMap[ctrl->getName()]->setVisible(TRUE);
+}
+void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
+{
+ mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE);
+}
+
+void LLPanelMyProfileEdit::enableEditing(bool enable)
+{
+ childSetEnabled("2nd_life_pic", enable);
+ childSetEnabled("real_world_pic", enable);
+ childSetEnabled("sl_description_edit", enable);
+ childSetEnabled("fl_description_edit", enable);
+ childSetEnabled("homepage_edit", enable);
+ childSetEnabled("show_in_search_checkbox", enable);
+}
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
new file mode 100644
index 0000000000..1325192bbf
--- /dev/null
+++ b/indra/newview/llpanelme.h
@@ -0,0 +1,111 @@
+/**
+ * @file llpanelme.h
+ * @brief Side tray "Me" (My Profile) panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMEPROFILE_H
+#define LL_LLPANELMEPROFILE_H
+
+#include "llpanel.h"
+#include "llpanelavatar.h"
+
+class LLPanelMyProfileEdit;
+class LLPanelProfile;
+class LLIconCtrl;
+
+/**
+* Panel for displaying Agent's profile, it consists of two sub panels - Profile
+* and Picks.
+* LLPanelMe allows user to edit his profile and picks.
+*/
+class LLPanelMe : public LLPanelProfile
+{
+ LOG_CLASS(LLPanelMe);
+
+public:
+
+ LLPanelMe();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ bool notifyChildren(const LLSD& info);
+
+ /*virtual*/ BOOL postBuild();
+
+private:
+
+ void buildEditPanel();
+
+ void onEditProfileClicked();
+ void onEditAppearanceClicked();
+ void onSaveChangesClicked();
+ void onCancelClicked();
+
+ LLPanelMyProfileEdit * mEditPanel;
+
+};
+
+class LLPanelMyProfileEdit : public LLPanelMyProfile
+{
+ LOG_CLASS(LLPanelMyProfileEdit);
+
+public:
+
+ LLPanelMyProfileEdit();
+
+ /*virtual*/void processProperties(void* data, EAvatarProcessorType type);
+
+ /*virtual*/BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+protected:
+
+ /*virtual*/void resetData();
+
+ void processProfileProperties(const LLAvatarData* avatar_data);
+
+private:
+ void initTexturePickerMouseEvents();
+ void onTexturePickerMouseEnter(LLUICtrl* ctrl);
+ void onTexturePickerMouseLeave(LLUICtrl* ctrl);
+
+ /**
+ * Enabled/disables controls to prevent overwriting edited data upon receiving
+ * current data from server.
+ */
+ void enableEditing(bool enable);
+
+private:
+ // map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker
+ typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t;
+ texture_edit_icon_map_t mTextureEditIconMap;
+};
+
+#endif // LL_LLPANELMEPROFILE_H
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 6a3617f008..f601a8d51c 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -1,448 +1,521 @@
-/**
- * @file llpanelmediasettingsgeneral.cpp
- * @brief LLPanelMediaSettingsGeneral class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llagent.h"
-#include "llpanelmediasettingsgeneral.h"
-#include "llcombobox.h"
-#include "llcheckboxctrl.h"
-#include "llspinctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llviewermedia.h"
-#include "llsdutil.h"
-#include "llselectmgr.h"
-#include "llbutton.h"
-#include "lltexturectrl.h"
-#include "llurl.h"
-#include "llwindow.h"
-#include "llmediaentry.h"
-#include "llmediactrl.h"
-#include "llpanelcontents.h"
-#include "llpermissions.h"
-#include "llpluginclassmedia.h"
-#include "llfloatermediasettings.h"
-#include "llfloatertools.h"
-#include "lltrans.h"
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
- mControls( NULL ),
- mAutoLoop( NULL ),
- mFirstClick( NULL ),
- mAutoZoom( NULL ),
- mAutoPlay( NULL ),
- mAutoScale( NULL ),
- mWidthPixels( NULL ),
- mHeightPixels( NULL ),
- mHomeURL( NULL ),
- mCurrentURL( NULL ),
- mParent( NULL ),
- mMediaEditable(false)
-{
- // build dialog from XML
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-BOOL LLPanelMediaSettingsGeneral::postBuild()
-{
- // connect member vars with UI widgets
- mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
- mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
- mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
- mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
- mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
- mCurrentURL = getChild< LLLineEditor >( LLMediaEntry::CURRENT_URL_KEY );
- mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
- mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
- mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
- mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
- mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
-
- // watch commit action for HOME URL
- childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
- childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
- // interrogates controls and updates widgets as required
- updateMediaPreview();
- updateCurrentURL();
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-LLPanelMediaSettingsGeneral::~LLPanelMediaSettingsGeneral()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::draw()
-{
- // housekeeping
- LLPanel::draw();
-
- // enable/disable pixel values image entry based on auto scale checkbox
- if ( mAutoScale->getValue().asBoolean() == false )
- {
- childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, true );
- childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, true );
- }
- else
- {
- childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, false );
- childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, false );
- };
-
- // enable/disable UI based on type of media
- bool reset_button_is_active = true;
- if( mPreviewMedia )
- {
- LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
- if( media_plugin )
- {
- // some controls are only appropriate for time or browser type plugins
- // so we selectively enable/disable them - need to do it in draw
- // because the information from plugins arrives assynchronously
- bool show_time_controls = media_plugin->pluginSupportsMediaTime();
- if ( show_time_controls )
- {
- childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, false );
- reset_button_is_active = false;
- childSetEnabled( "current_url_label", false );
- childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, true );
- }
- else
- {
- childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, true );
- reset_button_is_active = true;
- childSetEnabled( "current_url_label", true );
- childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, false );
- };
- };
- };
-
- // current URL can change over time.
-// updateCurrentURL();
-
- LLPermissions perm;
- bool user_can_press_reset = mMediaEditable;
-
- // several places modify this widget so we must collect states in one place
- if ( reset_button_is_active )
- {
- // user has perms to press reset button and it is active
- if ( user_can_press_reset )
- {
- childSetEnabled( "current_url_reset_btn", true );
- }
- // user does not has perms to press reset button and it is active
- else
- {
- childSetEnabled( "current_url_reset_btn", false );
- };
- }
- else
- // reset button is inactive so we just slam it to off - other states don't matter
- {
- childSetEnabled( "current_url_reset_btn", false );
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
-{
- LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
- self->mAutoLoop->clear();
- self->mAutoPlay->clear();
- self->mAutoScale->clear();
- self->mAutoZoom ->clear();
- self->mControls->clear();
- self->mCurrentURL->clear();
- self->mFirstClick->clear();
- self->mHeightPixels->clear();
- self->mHomeURL->clear();
- self->mWidthPixels->clear();
- self->mAutoLoop ->setEnabled(editable);
- self->mAutoPlay ->setEnabled(editable);
- self->mAutoScale ->setEnabled(editable);
- self->mAutoZoom ->setEnabled(editable);
- self->mControls ->setEnabled(editable);
- self->mCurrentURL ->setEnabled(editable);
- self->mFirstClick ->setEnabled(editable);
- self->mHeightPixels ->setEnabled(editable);
- self->mHomeURL ->setEnabled(editable);
- self->mWidthPixels ->setEnabled(editable);
- self->updateMediaPreview();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable)
-{
- LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
- self->mMediaEditable = editable;
-
- //llinfos << "---------------" << llendl;
- //llinfos << ll_pretty_print_sd(media_settings) << llendl;
- //llinfos << "---------------" << llendl;
-
- // IF all the faces have media (or all dont have media)
- if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
- {
- self->clearValues(self, self->mMediaEditable);
- // only show multiple
- self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
- return;
- }
-
- }
- else
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
- {
- self->clearValues(self, self->mMediaEditable);
- // only show multiple
- self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
- return;
- }
-
- }
- std::string base_key( "" );
- std::string tentative_key( "" );
-
- struct
- {
- std::string key_name;
- LLUICtrl* ctrl_ptr;
- std::string ctrl_type;
-
- } data_set [] =
- {
- { LLMediaEntry::AUTO_LOOP_KEY, self->mAutoLoop, "LLCheckBoxCtrl" },
- { LLMediaEntry::AUTO_PLAY_KEY, self->mAutoPlay, "LLCheckBoxCtrl" },
- { LLMediaEntry::AUTO_SCALE_KEY, self->mAutoScale, "LLCheckBoxCtrl" },
- { LLMediaEntry::AUTO_ZOOM_KEY, self->mAutoZoom, "LLCheckBoxCtrl" },
- { LLMediaEntry::CONTROLS_KEY, self->mControls, "LLComboBox" },
- { LLMediaEntry::CURRENT_URL_KEY, self->mCurrentURL, "LLLineEditor" },
- { LLMediaEntry::HEIGHT_PIXELS_KEY, self->mHeightPixels, "LLSpinCtrl" },
- { LLMediaEntry::HOME_URL_KEY, self->mHomeURL, "LLLineEditor" },
- { LLMediaEntry::FIRST_CLICK_INTERACT_KEY, self->mFirstClick, "LLCheckBoxCtrl" },
- { LLMediaEntry::WIDTH_PIXELS_KEY, self->mWidthPixels, "LLSpinCtrl" },
- { "", NULL , "" }
- };
-
- for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
- {
- base_key = std::string( data_set[ i ].key_name );
- tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
- // TODO: CP - I bet there is a better way to do this using Boost
- if ( media_settings[ base_key ].isDefined() )
- {
- if ( data_set[ i ].ctrl_type == "LLLineEditor" )
- {
- static_cast< LLLineEditor* >( data_set[ i ].ctrl_ptr )->
- setText( media_settings[ base_key ].asString() );
- }
- else
- if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
- static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
- setValue( media_settings[ base_key ].asBoolean() );
- else
- if ( data_set[ i ].ctrl_type == "LLComboBox" )
- static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
- setCurrentByIndex( media_settings[ base_key ].asInteger() );
- else
- if ( data_set[ i ].ctrl_type == "LLSpinCtrl" )
- static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
- setValue( media_settings[ base_key ].asInteger() );
-
- data_set[ i ].ctrl_ptr->setEnabled(self->mMediaEditable);
- data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
- };
- };
-
- // interrogates controls and updates widgets as required
- self->updateMediaPreview();
- self->updateCurrentURL();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Helper to set media control to media URL as required
-void LLPanelMediaSettingsGeneral::updateMediaPreview()
-{
- if ( mHomeURL->getValue().asString().length() > 0 )
- {
- mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
- }
- else
- // new home URL will be empty if media is deleted so display a
- // "preview goes here" data url page
- {
- mPreviewMedia->navigateTo( "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E" );
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Helper to set current URL
-void LLPanelMediaSettingsGeneral::updateCurrentURL()
-{
- if( mCurrentURL->getText().empty() )
- {
- childSetText( "current_url", mHomeURL->getText() );
- }
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-// virtual
-void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
-{
- if(mPreviewMedia)
- {
- mPreviewMedia->unloadMediaSource();
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
-{
- LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
-
- // check url user is trying to enter for home URL will pass whitelist
- // and decline to accept it if it doesn't.
- std::string home_url = self->mHomeURL->getValue().asString();
- if ( ! self->mParent->passesWhiteList( home_url ) )
- {
- LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
- return;
- };
-
- self->updateMediaPreview();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata)
-{
- LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
- self->navigateHomeSelectedFace();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::apply( void* userdata )
-{
- LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
- self->mHomeURL->onCommit();
- // build LLSD Fragment
- LLSD media_data_general;
- self->getValues(media_data_general);
-
- // this merges contents of LLSD passed in with what's there so this is ok
- LLSelectMgr::getInstance()->selectionSetMediaData( media_data_general );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
-{
- fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
- fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
- fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
- fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
- fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
- fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
- fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
- fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
- fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
- fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent )
-{
- mParent = parent;
-};
-
-bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace()
-{
- // HACK: This is directly referencing an impl name. BAD!
- // This can be removed when we have a truly generic media browser that only
- // builds an impl based on the type of url it is passed.
- struct functor_navigate_media : public LLSelectedTEGetFunctor< bool>
- {
- bool get( LLViewerObject* object, S32 face )
- {
- if ( object )
- if ( object->getTE(face) )
- if ( object->getTE(face)->getMediaData() )
- {
- if(object->permModify())
- {
- viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID());
- if(media_impl)
- {
- media_impl->navigateHome();
- return true;
- }
- }
- }
- return false;
- };
-
- } functor_navigate_media;
-
- bool all_face_media_navigated = false;
- LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
- selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
-
- return all_face_media_navigated;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
-{
- return mHomeURL->getValue().asString();
-}
-
+/**
+ * @file llpanelmediasettingsgeneral.cpp
+ * @brief LLPanelMediaSettingsGeneral class implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmediasettingsgeneral.h"
+
+// library includes
+#include "llcombobox.h"
+#include "llcheckboxctrl.h"
+#include "llnotificationsutil.h"
+#include "llspinctrl.h"
+#include "lluictrlfactory.h"
+
+// project includes
+#include "llagent.h"
+#include "llviewerwindow.h"
+#include "llviewermedia.h"
+#include "llsdutil.h"
+#include "llselectmgr.h"
+#include "llbutton.h"
+#include "lltexturectrl.h"
+#include "llurl.h"
+#include "llwindow.h"
+#include "llmediaentry.h"
+#include "llmediactrl.h"
+#include "llpanelcontents.h"
+#include "llpermissions.h"
+#include "llpluginclassmedia.h"
+#include "llfloatermediasettings.h"
+#include "llfloatertools.h"
+#include "lltrans.h"
+#include "lltextbox.h"
+#include "llpanelmediasettingssecurity.h"
+
+const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E";
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
+ mAutoLoop( NULL ),
+ mFirstClick( NULL ),
+ mAutoZoom( NULL ),
+ mAutoPlay( NULL ),
+ mAutoScale( NULL ),
+ mWidthPixels( NULL ),
+ mHeightPixels( NULL ),
+ mHomeURL( NULL ),
+ mCurrentURL( NULL ),
+ mParent( NULL ),
+ mMediaEditable(false)
+{
+ // build dialog from XML
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLPanelMediaSettingsGeneral::postBuild()
+{
+ // connect member vars with UI widgets
+ mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
+ mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
+ mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
+ mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
+ mCurrentURL = getChild< LLTextBox >( LLMediaEntry::CURRENT_URL_KEY );
+ mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
+ mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
+ mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
+ mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
+ mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
+ mFailWhiteListText = getChild<LLTextBox>( "home_fails_whitelist_label" );
+
+ // watch commit action for HOME URL
+ childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
+ childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
+
+ // interrogates controls and updates widgets as required
+ updateMediaPreview();
+
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+LLPanelMediaSettingsGeneral::~LLPanelMediaSettingsGeneral()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::draw()
+{
+ // housekeeping
+ LLPanel::draw();
+
+ // TODO: we need to call this repeatedly until the floater panels are fully
+ // created but once we have a valid answer, we should stop looking here - the
+ // commit callback will handle it
+ checkHomeUrlPassesWhitelist();
+
+ // enable/disable pixel values image entry based on auto scale checkbox
+ if ( mAutoScale->getValue().asBoolean() == false )
+ {
+ childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, true );
+ childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, true );
+ }
+ else
+ {
+ childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, false );
+ childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, false );
+ };
+
+ // enable/disable UI based on type of media
+ bool reset_button_is_active = true;
+ if( mPreviewMedia )
+ {
+ LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
+ if( media_plugin )
+ {
+ // turn off volume (if we can) for preview. Note: this really only
+ // works for QuickTime movies right now - no way to control the
+ // volume of a flash app embedded in a page for example
+ media_plugin->setVolume( 0 );
+
+ // some controls are only appropriate for time or browser type plugins
+ // so we selectively enable/disable them - need to do it in draw
+ // because the information from plugins arrives assynchronously
+ bool show_time_controls = media_plugin->pluginSupportsMediaTime();
+ if ( show_time_controls )
+ {
+ childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, false );
+ reset_button_is_active = false;
+ childSetEnabled( "current_url_label", false );
+ childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, true );
+ }
+ else
+ {
+ childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, true );
+ reset_button_is_active = true;
+ childSetEnabled( "current_url_label", true );
+ childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, false );
+ };
+ };
+ };
+
+ // current URL can change over time, update it here
+ updateCurrentUrl();
+
+ LLPermissions perm;
+ bool user_can_press_reset = mMediaEditable;
+
+ // several places modify this widget so we must collect states in one place
+ if ( reset_button_is_active )
+ {
+ // user has perms to press reset button and it is active
+ if ( user_can_press_reset )
+ {
+ childSetEnabled( "current_url_reset_btn", true );
+ }
+ // user does not has perms to press reset button and it is active
+ else
+ {
+ childSetEnabled( "current_url_reset_btn", false );
+ };
+ }
+ else
+ // reset button is inactive so we just slam it to off - other states don't matter
+ {
+ childSetEnabled( "current_url_reset_btn", false );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
+{
+ LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
+ self->mAutoLoop->clear();
+ self->mAutoPlay->clear();
+ self->mAutoScale->clear();
+ self->mAutoZoom ->clear();
+ self->mCurrentURL->clear();
+ self->mFirstClick->clear();
+ self->mHeightPixels->clear();
+ self->mHomeURL->clear();
+ self->mWidthPixels->clear();
+ self->mAutoLoop ->setEnabled(editable);
+ self->mAutoPlay ->setEnabled(editable);
+ self->mAutoScale ->setEnabled(editable);
+ self->mAutoZoom ->setEnabled(editable);
+ self->mCurrentURL ->setEnabled(editable);
+ self->mFirstClick ->setEnabled(editable);
+ self->mHeightPixels ->setEnabled(editable);
+ self->mHomeURL ->setEnabled(editable);
+ self->mWidthPixels ->setEnabled(editable);
+ self->updateMediaPreview();
+}
+
+// static
+bool LLPanelMediaSettingsGeneral::isMultiple()
+{
+ // IF all the faces have media (or all dont have media)
+ if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
+ {
+ return true;
+ }
+
+ }
+ else
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media_settings, bool editable)
+{
+ LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
+ self->mMediaEditable = editable;
+
+ LLSD media_settings = _media_settings;
+
+ if ( LLPanelMediaSettingsGeneral::isMultiple() )
+ {
+ // *HACK: "edit" the incoming media_settings
+ media_settings[LLMediaEntry::CURRENT_URL_KEY] = LLTrans::getString("Multiple Media");
+ media_settings[LLMediaEntry::HOME_URL_KEY] = LLTrans::getString("Multiple Media");
+ }
+
+ std::string base_key( "" );
+ std::string tentative_key( "" );
+
+ struct
+ {
+ std::string key_name;
+ LLUICtrl* ctrl_ptr;
+ std::string ctrl_type;
+
+ } data_set [] =
+ {
+ { LLMediaEntry::AUTO_LOOP_KEY, self->mAutoLoop, "LLCheckBoxCtrl" },
+ { LLMediaEntry::AUTO_PLAY_KEY, self->mAutoPlay, "LLCheckBoxCtrl" },
+ { LLMediaEntry::AUTO_SCALE_KEY, self->mAutoScale, "LLCheckBoxCtrl" },
+ { LLMediaEntry::AUTO_ZOOM_KEY, self->mAutoZoom, "LLCheckBoxCtrl" },
+ { LLMediaEntry::CURRENT_URL_KEY, self->mCurrentURL, "LLTextBox" },
+ { LLMediaEntry::HEIGHT_PIXELS_KEY, self->mHeightPixels, "LLSpinCtrl" },
+ { LLMediaEntry::HOME_URL_KEY, self->mHomeURL, "LLLineEditor" },
+ { LLMediaEntry::FIRST_CLICK_INTERACT_KEY, self->mFirstClick, "LLCheckBoxCtrl" },
+ { LLMediaEntry::WIDTH_PIXELS_KEY, self->mWidthPixels, "LLSpinCtrl" },
+ { "", NULL , "" }
+ };
+
+ for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
+ {
+ base_key = std::string( data_set[ i ].key_name );
+ tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
+ // TODO: CP - I bet there is a better way to do this using Boost
+ if ( media_settings[ base_key ].isDefined() )
+ {
+ if ( data_set[ i ].ctrl_type == "LLLineEditor" )
+ {
+ static_cast< LLLineEditor* >( data_set[ i ].ctrl_ptr )->
+ setText( media_settings[ base_key ].asString() );
+ }
+ else
+ if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
+ static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
+ setValue( media_settings[ base_key ].asBoolean() );
+ else
+ if ( data_set[ i ].ctrl_type == "LLComboBox" )
+ static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
+ setCurrentByIndex( media_settings[ base_key ].asInteger() );
+ else
+ if ( data_set[ i ].ctrl_type == "LLSpinCtrl" )
+ static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
+ setValue( media_settings[ base_key ].asInteger() );
+
+ data_set[ i ].ctrl_ptr->setEnabled(self->mMediaEditable);
+ data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
+ };
+ };
+
+ // interrogates controls and updates widgets as required
+ self->updateMediaPreview();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Helper to set media control to media URL as required
+void LLPanelMediaSettingsGeneral::updateMediaPreview()
+{
+ if ( mHomeURL->getValue().asString().length() > 0 )
+ {
+ if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
+ {
+ mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+ }
+ }
+ else
+ // new home URL will be empty if media is deleted so display a
+ // "preview goes here" data url page
+ {
+ if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL)
+ {
+ mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+ }
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+// virtual
+void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
+{
+ if(mPreviewMedia)
+ {
+ mPreviewMedia->unloadMediaSource();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::checkHomeUrlPassesWhitelist()
+{
+ // parent floater has not constructed the security panel yet
+ if ( mParent->getPanelSecurity() == 0 )
+ return;
+
+ std::string home_url = getHomeUrl();
+ if ( home_url.empty() || mParent->getPanelSecurity()->urlPassesWhiteList( home_url ) )
+ {
+ // Home URL is empty or passes the white list so hide the warning message
+ mFailWhiteListText->setVisible( false );
+ }
+ else
+ {
+ // Home URL does not pass the white list so show the warning message
+ mFailWhiteListText->setVisible( true );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
+{
+ LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
+
+ // check home url passes whitelist and display warning if not
+ self->checkHomeUrlPassesWhitelist();
+
+ self->updateMediaPreview();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata)
+{
+ LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
+ self->navigateHomeSelectedFace(false);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::preApply()
+{
+ // Make sure the home URL entry is committed
+ mHomeURL->onCommit();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in, bool include_tentative )
+{
+ if (include_tentative || !mAutoLoop->getTentative()) fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
+ if (include_tentative || !mAutoPlay->getTentative()) fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
+ if (include_tentative || !mAutoScale->getTentative()) fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
+ if (include_tentative || !mAutoZoom->getTentative()) fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
+ //Don't fill in current URL: this is only supposed to get changed via navigate
+ // if (include_tentative || !mCurrentURL->getTentative()) fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
+ if (include_tentative || !mHeightPixels->getTentative()) fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
+ // Don't fill in the home URL if it is the special "Multiple Media" string!
+ if ((include_tentative || !mHomeURL->getTentative())
+ && LLTrans::getString("Multiple Media") != mHomeURL->getValue())
+ fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
+ if (include_tentative || !mFirstClick->getTentative()) fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
+ if (include_tentative || !mWidthPixels->getTentative()) fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::postApply()
+{
+ // Make sure to navigate to the home URL if the current URL is empty and
+ // autoplay is on
+ navigateHomeSelectedFace(true);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent )
+{
+ mParent = parent;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_is_empty)
+{
+ struct functor_navigate_media : public LLSelectedTEGetFunctor< bool>
+ {
+ functor_navigate_media(bool flag) : only_if_current_is_empty(flag) {}
+ bool get( LLViewerObject* object, S32 face )
+ {
+ if ( object && object->getTE(face) && object->permModify() )
+ {
+ const LLMediaEntry *media_data = object->getTE(face)->getMediaData();
+ if ( media_data )
+ {
+ if (!only_if_current_is_empty || (media_data->getCurrentURL().empty() && media_data->getAutoPlay()))
+ {
+ viewer_media_t media_impl =
+ LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID());
+ if(media_impl)
+ {
+ media_impl->navigateHome();
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ };
+ bool only_if_current_is_empty;
+
+ } functor_navigate_media(only_if_current_is_empty);
+
+ bool all_face_media_navigated = false;
+ LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
+ selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
+
+ // Note: we don't update the 'current URL' field until the media data itself changes
+
+ return all_face_media_navigated;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
+{
+ return mHomeURL->getValue().asString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::updateCurrentUrl()
+{
+ // Get the current URL from the selection
+ const LLMediaEntry default_media_data;
+ std::string value_str = default_media_data.getCurrentURL();
+ struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
+ {
+ functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
+ std::string get( LLViewerObject* object, S32 face )
+ {
+ if ( object )
+ if ( object->getTE(face) )
+ if ( object->getTE(face)->getMediaData() )
+ return object->getTE(face)->getMediaData()->getCurrentURL();
+ return mMediaEntry.getCurrentURL();
+ };
+
+ const LLMediaEntry & mMediaEntry;
+
+ } func_current_url(default_media_data);
+ bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_current_url, value_str );
+ mCurrentURL->setText(value_str);
+ mCurrentURL->setTentative(identical);
+
+ if ( LLPanelMediaSettingsGeneral::isMultiple() )
+ {
+ mCurrentURL->setText(LLTrans::getString("Multiple Media"));
+ }
+}
diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h
index e82a31382e..a3f0990f35 100644
--- a/indra/newview/llpanelmediasettingsgeneral.h
+++ b/indra/newview/llpanelmediasettingsgeneral.h
@@ -37,33 +37,42 @@
class LLButton;
class LLCheckBoxCtrl;
-class LLComboBox;
class LLLineEditor;
class LLSpinCtrl;
class LLTextureCtrl;
class LLMediaCtrl;
+class LLTextBox;
class LLFloaterMediaSettings;
class LLPanelMediaSettingsGeneral : public LLPanel
{
public:
+ LLPanelMediaSettingsGeneral();
+ ~LLPanelMediaSettingsGeneral();
+
+ // XXX TODO: put these into a common parent class?
+ // Hook that the floater calls before applying changes from the panel
+ void preApply();
+ // Function that asks the panel to fill in values associated with the panel
+ // 'include_tentative' means fill in tentative values as well, otherwise do not
+ void getValues(LLSD &fill_me_in, bool include_tentative = true);
+ // Hook that the floater calls after applying changes to the panel
+ void postApply();
+
BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void onClose(bool app_quitting);
- static void apply(void*);
- void getValues(LLSD &fill_me_in);
-
- LLPanelMediaSettingsGeneral();
- ~LLPanelMediaSettingsGeneral();
-
void setParent( LLFloaterMediaSettings* parent );
static void initValues( void* userdata, const LLSD& media_settings ,bool editable);
static void clearValues( void* userdata, bool editable);
- bool navigateHomeSelectedFace();
+ // Navigates the current selected face to the Home URL.
+ // If 'only_if_current_is_empty' is "true", it only performs
+ // the operation if: 1) the current URL is empty, and 2) auto play is true.
+ bool navigateHomeSelectedFace(bool only_if_current_is_empty);
+
void updateMediaPreview();
- void updateCurrentURL();
const std::string getHomeUrl();
@@ -72,10 +81,15 @@ protected:
bool mMediaEditable;
private:
+ void updateCurrentUrl();
+
static void onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata);
static void onCommitHomeURL(LLUICtrl* ctrl, void *userdata );
+
+ static bool isMultiple();
+
+ void checkHomeUrlPassesWhitelist();
- LLComboBox* mControls;
LLCheckBoxCtrl* mAutoLoop;
LLCheckBoxCtrl* mFirstClick;
LLCheckBoxCtrl* mAutoZoom;
@@ -84,8 +98,9 @@ private:
LLSpinCtrl* mWidthPixels;
LLSpinCtrl* mHeightPixels;
LLLineEditor* mHomeURL;
- LLLineEditor* mCurrentURL;
+ LLTextBox* mCurrentURL;
LLMediaCtrl* mPreviewMedia;
+ LLTextBox* mFailWhiteListText;
};
#endif // LL_LLPANELMEDIAMEDIASETTINGSGENERAL_H
diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp
index 4d84874e7a..e5caaaaffc 100644
--- a/indra/newview/llpanelmediasettingspermissions.cpp
+++ b/indra/newview/llpanelmediasettingspermissions.cpp
@@ -51,9 +51,11 @@
#include "llnamebox.h"
#include "lltrans.h"
#include "llfloatermediasettings.h"
+
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() :
+ mControls( NULL ),
mPermsOwnerInteract( 0 ),
mPermsOwnerControl( 0 ),
mPermsGroupName( 0 ),
@@ -71,6 +73,7 @@ LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() :
BOOL LLPanelMediaSettingsPermissions::postBuild()
{
// connect member vars with UI widgets
+ mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
mPermsOwnerInteract = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
mPermsOwnerControl = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
mPermsGroupInteract = getChild< LLCheckBoxCtrl >( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
@@ -123,19 +126,22 @@ void LLPanelMediaSettingsPermissions::draw()
void LLPanelMediaSettingsPermissions::clearValues( void* userdata, bool editable)
{
LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
+
+ self->mControls->clear();
self->mPermsOwnerInteract->clear();
self->mPermsOwnerControl->clear();
- self->mPermsGroupInteract ->clear();
+ self->mPermsGroupInteract->clear();
self->mPermsGroupControl->clear();
- self->mPermsWorldInteract ->clear();
- self->mPermsWorldControl ->clear();
+ self->mPermsWorldInteract->clear();
+ self->mPermsWorldControl->clear();
+ self->mControls->setEnabled(editable);
self->mPermsOwnerInteract->setEnabled(editable);
- self->mPermsOwnerControl ->setEnabled(editable);
+ self->mPermsOwnerControl->setEnabled(editable);
self->mPermsGroupInteract->setEnabled(editable);
- self->mPermsGroupControl ->setEnabled(editable);
+ self->mPermsGroupControl->setEnabled(editable);
self->mPermsWorldInteract->setEnabled(editable);
- self->mPermsWorldControl ->setEnabled(editable);
+ self->mPermsWorldControl->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
@@ -143,27 +149,6 @@ void LLPanelMediaSettingsPermissions::clearValues( void* userdata, bool editable
void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& media_settings , bool editable)
{
LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
-
- if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
- {
- self->clearValues(self, editable);
- // only show multiple
- return;
- }
-
- }
- else
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
- {
- self->clearValues(self, editable);
- // only show multiple
- return;
- }
-
- }
std::string base_key( "" );
std::string tentative_key( "" );
@@ -175,6 +160,7 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me
} data_set [] =
{
+ { LLMediaEntry::CONTROLS_KEY, self->mControls, "LLComboBox" },
{ LLPanelContents::PERMS_OWNER_INTERACT_KEY, self->mPermsOwnerInteract, "LLCheckBoxCtrl" },
{ LLPanelContents::PERMS_OWNER_CONTROL_KEY, self->mPermsOwnerControl, "LLCheckBoxCtrl" },
{ LLPanelContents::PERMS_GROUP_INTERACT_KEY, self->mPermsGroupInteract, "LLCheckBoxCtrl" },
@@ -194,63 +180,109 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me
{
if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
{
- // the sense of the checkboxes changed and it made sense
- // to just reverse their sense back again here and avoid
- // changing server code.
+ // Most recent change to the "sense" of these checkboxes
+ // means the value in the checkbox matches that on the server
static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
- setValue( ! media_settings[ base_key ].asBoolean() );
+ setValue( media_settings[ base_key ].asBoolean() );
}
else
if ( data_set[ i ].ctrl_type == "LLComboBox" )
static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
setCurrentByIndex( media_settings[ base_key ].asInteger() );
+
data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
+
+ // *NOTE: If any of a particular flavor is tentative, we have to disable
+ // them all because of an architectural issue: namely that we represent
+ // these as a bit field, and we can't selectively apply only one bit to all selected
+ // faces if they don't match. Also see the *NOTE below.
+ if ( self->mPermsOwnerInteract->getTentative() ||
+ self->mPermsGroupInteract->getTentative() ||
+ self->mPermsWorldInteract->getTentative())
+ {
+ self->mPermsOwnerInteract->setEnabled(false);
+ self->mPermsGroupInteract->setEnabled(false);
+ self->mPermsWorldInteract->setEnabled(false);
+ }
+ if ( self->mPermsOwnerControl->getTentative() ||
+ self->mPermsGroupControl->getTentative() ||
+ self->mPermsWorldControl->getTentative())
+ {
+ self->mPermsOwnerControl->setEnabled(false);
+ self->mPermsGroupControl->setEnabled(false);
+ self->mPermsWorldControl->setEnabled(false);
+ }
+
+
self->childSetEnabled("media_perms_label_owner", editable );
self->childSetText("media_perms_label_owner", LLTrans::getString("Media Perms Owner") );
self->childSetEnabled("media_perms_label_group", editable );
self->childSetText("media_perms_label_group", LLTrans::getString("Media Perms Group") );
self->childSetEnabled("media_perms_label_anyone", editable );
self->childSetText("media_perms_label_anyone", LLTrans::getString("Media Perms Anyone") );
-
}
////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsPermissions::apply( void* userdata )
+//
+void LLPanelMediaSettingsPermissions::preApply()
{
- LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
-
- // build LLSD Fragment
- LLSD media_data_permissions;
- self->getValues(media_data_permissions);
-
- // this merges contents of LLSD passed in with what's there so this is ok
- LLSelectMgr::getInstance()->selectionSetMediaData( media_data_permissions );
+ // no-op
}
////////////////////////////////////////////////////////////////////////////////
//
-void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in )
+void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in, bool include_tentative )
{
- // *NOTE: For some reason, gcc does not like these symbol references in the
- // expressions below (inside the static_casts). I have NO idea why :(.
- // For some reason, assigning them to const temp vars here fixes the link
- // error. Bizarre.
- const U8 none = LLMediaEntry::PERM_NONE;
- const U8 owner = LLMediaEntry::PERM_OWNER;
- const U8 group = LLMediaEntry::PERM_GROUP;
- const U8 anyone = LLMediaEntry::PERM_ANYONE;
- const LLSD::Integer control = static_cast<LLSD::Integer>(
- (mPermsOwnerControl->getValue() ? none : owner ) |
- (mPermsGroupControl->getValue() ? none : group ) |
- (mPermsWorldControl->getValue() ? none : anyone ));
- const LLSD::Integer interact = static_cast<LLSD::Integer>(
- (mPermsOwnerInteract->getValue() ? none : owner ) |
- (mPermsGroupInteract->getValue() ? none : group ) |
- (mPermsWorldInteract->getValue() ? none : anyone ));
- fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control;
- fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact;
+ // moved over from the 'General settings' tab
+ if (include_tentative || !mControls->getTentative()) fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
+
+ // *NOTE: For some reason, gcc does not like these symbol references in the
+ // expressions below (inside the static_casts). I have NO idea why :(.
+ // For some reason, assigning them to const temp vars here fixes the link
+ // error. Bizarre.
+ const U8 none = LLMediaEntry::PERM_NONE;
+ const U8 owner = LLMediaEntry::PERM_OWNER;
+ const U8 group = LLMediaEntry::PERM_GROUP;
+ const U8 anyone = LLMediaEntry::PERM_ANYONE;
+ const LLSD::Integer control = static_cast<LLSD::Integer>(
+ (mPermsOwnerControl->getValue() ? owner : none ) |
+ (mPermsGroupControl->getValue() ? group: none ) |
+ (mPermsWorldControl->getValue() ? anyone : none ));
+ const LLSD::Integer interact = static_cast<LLSD::Integer>(
+ (mPermsOwnerInteract->getValue() ? owner: none ) |
+ (mPermsGroupInteract->getValue() ? group : none ) |
+ (mPermsWorldInteract->getValue() ? anyone : none ));
+
+ // *TODO: This will fill in the values of all permissions values, even if
+ // one or more is tentative. This is not quite the user expectation...what
+ // it should do is only change the bit that was made "untentative", but in
+ // a multiple-selection situation, this isn't possible given the architecture
+ // for how settings are applied.
+ if (include_tentative ||
+ !mPermsOwnerControl->getTentative() ||
+ !mPermsGroupControl->getTentative() ||
+ !mPermsWorldControl->getTentative())
+ {
+ fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control;
+ }
+ if (include_tentative ||
+ !mPermsOwnerInteract->getTentative() ||
+ !mPermsGroupInteract->getTentative() ||
+ !mPermsWorldInteract->getTentative())
+ {
+ fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact;
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsPermissions::postApply()
+{
+ // no-op
}
+
+
diff --git a/indra/newview/llpanelmediasettingspermissions.h b/indra/newview/llpanelmediasettingspermissions.h
index ecc50e3582..858544605c 100644
--- a/indra/newview/llpanelmediasettingspermissions.h
+++ b/indra/newview/llpanelmediasettingspermissions.h
@@ -46,26 +46,34 @@ class LLNameBox;
class LLPanelMediaSettingsPermissions : public LLPanel
{
- public:
- BOOL postBuild();
- virtual void draw();
- static void apply(void*);
- void getValues(LLSD &fill_me_in);
-
- LLPanelMediaSettingsPermissions();
- ~LLPanelMediaSettingsPermissions();
-
- static void initValues( void* userdata, const LLSD& media_settings, bool editable );
- static void clearValues( void* userdata, bool editable);
-
- private:
- LLCheckBoxCtrl* mPermsOwnerInteract;
- LLCheckBoxCtrl* mPermsOwnerControl;
- LLNameBox* mPermsGroupName;
- LLCheckBoxCtrl* mPermsGroupInteract;
- LLCheckBoxCtrl* mPermsGroupControl;
- LLCheckBoxCtrl* mPermsWorldInteract;
- LLCheckBoxCtrl* mPermsWorldControl;
+public:
+ LLPanelMediaSettingsPermissions();
+ ~LLPanelMediaSettingsPermissions();
+
+ BOOL postBuild();
+ virtual void draw();
+
+ // XXX TODO: put these into a common parent class?
+ // Hook that the floater calls before applying changes from the panel
+ void preApply();
+ // Function that asks the panel to fill in values associated with the panel
+ // 'include_tentative' means fill in tentative values as well, otherwise do not
+ void getValues(LLSD &fill_me_in, bool include_tentative = true);
+ // Hook that the floater calls after applying changes to the panel
+ void postApply();
+
+ static void initValues( void* userdata, const LLSD& media_settings, bool editable );
+ static void clearValues( void* userdata, bool editable);
+
+private:
+ LLComboBox* mControls;
+ LLCheckBoxCtrl* mPermsOwnerInteract;
+ LLCheckBoxCtrl* mPermsOwnerControl;
+ LLNameBox* mPermsGroupName;
+ LLCheckBoxCtrl* mPermsGroupInteract;
+ LLCheckBoxCtrl* mPermsGroupControl;
+ LLCheckBoxCtrl* mPermsWorldInteract;
+ LLCheckBoxCtrl* mPermsWorldControl;
};
#endif // LL_LLPANELMEDIAMEDIASETTINGSPERMISSIONS_H
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index f5607aa287..1b1346c41a 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -1,343 +1,362 @@
-/**
- * @file llpanelmediasettingssecurity.cpp
- * @brief LLPanelMediaSettingsSecurity class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llfloaterreg.h"
-#include "llpanelmediasettingssecurity.h"
-#include "llpanelcontents.h"
-#include "llcheckboxctrl.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "lluictrlfactory.h"
-#include "llwindow.h"
-#include "llviewerwindow.h"
-#include "llsdutil.h"
-#include "llselectmgr.h"
-#include "llmediaentry.h"
-#include "llfloaterwhitelistentry.h"
-#include "llfloatermediasettings.h"
-////////////////////////////////////////////////////////////////////////////////
-//
-LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
- mParent( NULL )
-{
- // build dialog from XML
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
- mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
- mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-BOOL LLPanelMediaSettingsSecurity::postBuild()
-{
- mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
- mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
-
- childSetAction("whitelist_add", onBtnAdd, this);
- childSetAction("whitelist_del", onBtnDel, this);
-
- setDefaultBtn("whitelist_add");
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::draw()
-{
- // housekeeping
- LLPanel::draw();
-
- // if list is empty, disable DEL button and checkbox to enable use of list
- if ( mWhiteListList->isEmpty() )
- {
- childSetEnabled( "whitelist_del", false );
- childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
- childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
- }
- else
- {
- childSetEnabled( "whitelist_del", true );
- childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
- childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
- };
-
- // if nothing is selected, disable DEL button
- if ( mWhiteListList->getSelectedValue().asString().empty() )
- {
- childSetEnabled( "whitelist_del", false );
- }
- else
- {
- childSetEnabled( "whitelist_del", true );
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
-{
- LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-
- if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
- {
- self->clearValues(self, editable);
- // only show multiple
- return;
- }
-
- }
- else
- {
- if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
- {
- self->clearValues(self, editable);
- // only show multiple
- return;
- }
-
- }
- std::string base_key( "" );
- std::string tentative_key( "" );
-
- struct
- {
- std::string key_name;
- LLUICtrl* ctrl_ptr;
- std::string ctrl_type;
-
- } data_set [] =
- {
- { LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" },
- { LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" },
- { "", NULL , "" }
- };
-
- for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
- {
- base_key = std::string( data_set[ i ].key_name );
- tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
-
- // TODO: CP - I bet there is a better way to do this using Boost
- if ( media_settings[ base_key ].isDefined() )
- {
- if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
- {
- static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
- setValue( media_settings[ base_key ].asBoolean() );
- }
- else
- if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
- {
- // get control
- LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
- list->deleteAllItems();
-
- // points to list of white list URLs
- LLSD url_list = media_settings[ base_key ];
-
- // iterate over them and add to scroll list
- LLSD::array_iterator iter = url_list.beginArray();
- while( iter != url_list.endArray() )
- {
- // TODO: is iter guaranteed to be valid here?
- std::string url = *iter;
- list->addSimpleElement( url );
- ++iter;
- };
- };
- data_set[ i ].ctrl_ptr->setEnabled(editable);
- data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
- };
- };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
-{
- LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
- self->mEnableWhiteList->clear();
- self->mWhiteListList->deleteAllItems();
- self->mEnableWhiteList->setEnabled(editable);
- self->mWhiteListList->setEnabled(editable);
-}
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::apply( void* userdata )
-{
- LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-
- // build LLSD Fragment
- LLSD media_data_security;
- self->getValues(media_data_security);
- // this merges contents of LLSD passed in with what's there so this is ok
- LLSelectMgr::getInstance()->selectionSetMediaData( media_data_security );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
-{
- fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
-
- // iterate over white list and extract items
- std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
- std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
- fill_me_in[LLMediaEntry::WHITELIST_KEY].clear();
- while( iter != white_list_items.end() )
- {
- std::string white_list_url = (*iter)->getValue().asString();
- fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
- ++iter;
- };
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Try to make a valid URL if a fragment (
-// white list list box widget and build a list to test against. Can also
-const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
-{
- // use LLURI to determine if we have a valid scheme
+/**
+ * @file llpanelmediasettingssecurity.cpp
+ * @brief LLPanelMediaSettingsSecurity class implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmediasettingssecurity.h"
+
+#include "llfloaterreg.h"
+#include "llpanelcontents.h"
+#include "llcheckboxctrl.h"
+#include "llnotificationsutil.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "lluictrlfactory.h"
+#include "llwindow.h"
+#include "llviewerwindow.h"
+#include "llsdutil.h"
+#include "llselectmgr.h"
+#include "llmediaentry.h"
+#include "lltextbox.h"
+#include "llfloaterwhitelistentry.h"
+#include "llfloatermediasettings.h"
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
+ mParent( NULL )
+{
+ mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
+ mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
+
+ // build dialog from XML
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLPanelMediaSettingsSecurity::postBuild()
+{
+ mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
+ mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
+ mHomeUrlFailsWhiteListText = getChild<LLTextBox>( "home_url_fails_whitelist" );
+
+ setDefaultBtn("whitelist_add");
+
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::draw()
+{
+ // housekeeping
+ LLPanel::draw();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
+{
+ LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+ std::string base_key( "" );
+ std::string tentative_key( "" );
+
+ struct
+ {
+ std::string key_name;
+ LLUICtrl* ctrl_ptr;
+ std::string ctrl_type;
+
+ } data_set [] =
+ {
+ { LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" },
+ { LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" },
+ { "", NULL , "" }
+ };
+
+ for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
+ {
+ base_key = std::string( data_set[ i ].key_name );
+ tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
+
+ bool enabled_overridden = false;
+
+ // TODO: CP - I bet there is a better way to do this using Boost
+ if ( media_settings[ base_key ].isDefined() )
+ {
+ if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
+ {
+ static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
+ setValue( media_settings[ base_key ].asBoolean() );
+ }
+ else
+ if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
+ {
+ // get control
+ LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
+ list->deleteAllItems();
+
+ // points to list of white list URLs
+ LLSD url_list = media_settings[ base_key ];
+
+ // better be the whitelist
+ llassert(data_set[ i ].ctrl_ptr == self->mWhiteListList);
+
+ // If tentative, don't add entries
+ if (media_settings[ tentative_key ].asBoolean())
+ {
+ self->mWhiteListList->setEnabled(false);
+ enabled_overridden = true;
+ }
+ else {
+ // iterate over them and add to scroll list
+ LLSD::array_iterator iter = url_list.beginArray();
+ while( iter != url_list.endArray() )
+ {
+ std::string entry = *iter;
+ self->addWhiteListEntry( entry );
+ ++iter;
+ }
+ }
+ };
+ if ( ! enabled_overridden) data_set[ i ].ctrl_ptr->setEnabled(editable);
+ data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
+ };
+ };
+
+ // initial update - hides/shows status messages etc.
+ self->updateWhitelistEnableStatus();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
+{
+ LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+ self->mEnableWhiteList->clear();
+ self->mWhiteListList->deleteAllItems();
+ self->mEnableWhiteList->setEnabled(editable);
+ self->mWhiteListList->setEnabled(editable);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::preApply()
+{
+ // no-op
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in, bool include_tentative )
+{
+ if (include_tentative || !mEnableWhiteList->getTentative())
+ fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
+
+ if (include_tentative || !mWhiteListList->getTentative())
+ {
+ // iterate over white list and extract items
+ std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
+ std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin();
+
+ // *NOTE: need actually set the key to be an emptyArray(), or the merge
+ // we do with this LLSD will think there's nothing to change.
+ fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
+ while( iter != whitelist_items.end() )
+ {
+ LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
+ std::string whitelist_url = cell->getValue().asString();
+
+ fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url );
+ ++iter;
+ };
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::postApply()
+{
+ // no-op
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Try to make a valid URL if a fragment (
+// white list list box widget and build a list to test against. Can also
+const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
+{
+ // use LLURI to determine if we have a valid scheme
LLURI candidate_url( src_url );
if ( candidate_url.scheme().empty() )
{
- // build a URL comprised of default scheme and the original fragment
- const std::string default_scheme( "http://" );
- return default_scheme + src_url;
+ // build a URL comprised of default scheme and the original fragment
+ const std::string default_scheme( "http://" );
+ return default_scheme + src_url;
};
// we *could* test the "default scheme" + "original fragment" URL again
// using LLURI to see if it's valid but I think the outcome is the same
// in either case - our only option is to return the original URL
-
- // we *think* the original url passed in was valid
- return src_url;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// wrapper for testing a URL against the whitelist. We grab entries from
-// white list list box widget and build a list to test against. Can also
-// optionally pass the URL that you are trying to add to the widget since
-// it won't be added until this call returns.
-bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
- const std::string& test_url )
-{
- // the checkUrlAgainstWhitelist(..) function works on a vector
- // of strings for the white list entries - in this panel, the white list
- // is stored in the widgets themselves so we need to build something compatible.
- std::vector< std::string > whitelist_strings;
- whitelist_strings.clear(); // may not be required - I forget what the spec says.
-
- // step through whitelist widget entries and grab them as strings
- std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
- std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
- while( iter != white_list_items.end() )
- {
- const std::string whitelist_url = (*iter)->getValue().asString();
- whitelist_strings.push_back( whitelist_url );
-
- ++iter;
- };
-
- // add in the URL that might be added to the whitelist so we can test that too
- if ( added_url.length() )
- whitelist_strings.push_back( added_url );
-
- // possible the URL is just a fragment so we validize it
- const std::string valid_url = makeValidUrl( test_url );
-
- // indicate if the URL passes whitelist
- return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
-{
- // grab home URL from the general panel (via the parent floater)
- std::string home_url( "" );
- if ( mParent )
- home_url = mParent->getHomeUrl();
-
- // if the home URL is blank (user hasn't entered it yet) then
- // don't bother to check if it passes the white list
- if ( home_url.empty() )
- {
- mWhiteListList->addSimpleElement( url );
- return;
- };
-
- // if the URL passes the white list, add it
- if ( passesWhiteList( url, home_url ) )
- {
- mWhiteListList->addSimpleElement( url );
- }
- else
- // display a message indicating you can't do that
- {
- LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
- };
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
-{
- LLFloaterReg::showInstance("whitelist_entry");
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
-{
- LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-
- self->mWhiteListList->deleteSelectedItems();
-}
-
+
+ // we *think* the original url passed in was valid
+ return src_url;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// wrapper for testing a URL against the whitelist. We grab entries from
+// white list list box widget and build a list to test against.
+bool LLPanelMediaSettingsSecurity::urlPassesWhiteList( const std::string& test_url )
+{
+ // If the whitlelist list is tentative, it means we have multiple settings.
+ // In that case, we have no choice but to return true
+ if ( mWhiteListList->getTentative() ) return true;
+
+ // the checkUrlAgainstWhitelist(..) function works on a vector
+ // of strings for the white list entries - in this panel, the white list
+ // is stored in the widgets themselves so we need to build something compatible.
+ std::vector< std::string > whitelist_strings;
+ whitelist_strings.clear(); // may not be required - I forget what the spec says.
+
+ // step through whitelist widget entries and grab them as strings
+ std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
+ std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin();
+ while( iter != whitelist_items.end() )
+ {
+ LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
+ std::string whitelist_url = cell->getValue().asString();
+
+ whitelist_strings.push_back( whitelist_url );
+
+ ++iter;
+ };
+
+ // possible the URL is just a fragment so we validize it
+ const std::string valid_url = makeValidUrl( test_url );
+
+ // indicate if the URL passes whitelist
+ return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::updateWhitelistEnableStatus()
+{
+ // get the value for home URL and make it a valid URL
+ const std::string valid_url = makeValidUrl( mParent->getHomeUrl() );
+
+ // now check to see if the home url passes the whitelist in its entirity
+ if ( urlPassesWhiteList( valid_url ) )
+ {
+ mEnableWhiteList->setEnabled( true );
+ mHomeUrlFailsWhiteListText->setVisible( false );
+ }
+ else
+ {
+ mEnableWhiteList->set( false );
+ mEnableWhiteList->setEnabled( false );
+ mHomeUrlFailsWhiteListText->setVisible( true );
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Add an entry to the whitelist scrollbox and indicate if the current
+// home URL passes this entry or not using an icon
+void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
+{
+ // grab the home url
+ std::string home_url( "" );
+ if ( mParent )
+ home_url = mParent->getHomeUrl();
+
+ // try to make a valid URL based on what the user entered - missing scheme for example
+ const std::string valid_url = makeValidUrl( home_url );
+
+ // check the home url against this single whitelist entry
+ std::vector< std::string > whitelist_entries;
+ whitelist_entries.push_back( entry );
+ bool home_url_passes_entry = LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_entries );
+
+ // build an icon cell based on whether or not the home url pases it or not
+ LLSD row;
+ if ( home_url_passes_entry || home_url.empty() )
+ {
+ row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
+ row[ "columns" ][ ICON_COLUMN ][ "value" ] = "";
+ row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
+ }
+ else
+ {
+ row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
+ row[ "columns" ][ ICON_COLUMN ][ "value" ] = "Parcel_Exp_Color";
+ row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
+ };
+
+ // always add in the entry itself
+ row[ "columns" ][ ENTRY_COLUMN ][ "type" ] = "text";
+ row[ "columns" ][ ENTRY_COLUMN ][ "value" ] = entry;
+
+ // add to the white list scroll box
+ mWhiteListList->addElement( row );
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
+{
+ LLFloaterReg::showInstance("whitelist_entry");
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
+{
+ LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+
+ self->mWhiteListList->deleteSelectedItems();
+
+ // contents of whitelist changed so recheck it against home url
+ self->updateWhitelistEnableStatus();
+}
+
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )
{
mParent = parent;
};
-
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index b78ee92193..94f2fdc89c 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -37,35 +37,52 @@
class LLCheckBoxCtrl;
class LLScrollListCtrl;
+class LLTextBox;
class LLFloaterMediaSettings;
class LLPanelMediaSettingsSecurity : public LLPanel
{
- public:
- BOOL postBuild();
- virtual void draw();
- static void apply(void*);
- void getValues(LLSD &fill_me_in);
+public:
+ LLPanelMediaSettingsSecurity();
+ ~LLPanelMediaSettingsSecurity();
+
+ BOOL postBuild();
+ virtual void draw();
+
+ // XXX TODO: put these into a common parent class?
+ // Hook that the floater calls before applying changes from the panel
+ void preApply();
+ // Function that asks the panel to fill in values associated with the panel
+ // 'include_tentative' means fill in tentative values as well, otherwise do not
+ void getValues(LLSD &fill_me_in, bool include_tentative = true);
+ // Hook that the floater calls after applying changes to the panel
+ void postApply();
+
+ static void initValues( void* userdata, const LLSD& media_settings, bool editable);
+ static void clearValues( void* userdata, bool editable);
+ void addWhiteListEntry( const std::string& url );
+ void setParent( LLFloaterMediaSettings* parent );
+ bool urlPassesWhiteList( const std::string& test_url );
+ const std::string makeValidUrl( const std::string& src_url );
- LLPanelMediaSettingsSecurity();
- ~LLPanelMediaSettingsSecurity();
+ void updateWhitelistEnableStatus();
- static void initValues( void* userdata, const LLSD& media_settings,bool editable );
- static void clearValues( void* userdata, bool editable);
- void addWhiteListItem(const std::string& url);
- void setParent( LLFloaterMediaSettings* parent );
- const std::string makeValidUrl( const std::string& src_url );
- bool passesWhiteList( const std::string& added_url, const std::string& test_url );
+protected:
+ LLFloaterMediaSettings* mParent;
+
+private:
+ enum ColumnIndex
+ {
+ ICON_COLUMN = 0,
+ ENTRY_COLUMN = 1,
+ };
- protected:
- LLFloaterMediaSettings* mParent;
+ LLCheckBoxCtrl* mEnableWhiteList;
+ LLScrollListCtrl* mWhiteListList;
+ LLTextBox* mHomeUrlFailsWhiteListText;
- private:
- LLCheckBoxCtrl* mEnableWhiteList;
- LLScrollListCtrl* mWhiteListList;
-
- static void onBtnAdd(void*);
- static void onBtnDel(void*);
+ static void onBtnAdd(void*);
+ static void onBtnDel(void*);
};
#endif // LL_LLPANELMEDIAMEDIASETTINGSSECURITY_H
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
new file mode 100644
index 0000000000..8ad5389566
--- /dev/null
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -0,0 +1,1197 @@
+/**
+ * @file llpanelnearbymedia.cpp
+ * @brief Management interface for muting and controlling nearby media
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelnearbymedia.h"
+
+#include "llaudioengine.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llresizebar.h"
+#include "llresizehandle.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llscrolllistcell.h"
+#include "llslider.h"
+#include "llsliderctrl.h"
+#include "llagent.h"
+#include "llagentui.h"
+#include "llbutton.h"
+#include "lltextbox.h"
+#include "llviewermedia.h"
+#include "llviewerparcelmedia.h"
+#include "llviewerregion.h"
+#include "llviewermediafocus.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+#include "llpluginclassmedia.h"
+#include "llvovolume.h"
+#include "llstatusbar.h"
+#include "llsdutil.h"
+
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h" // for the gear icon
+#include "lltabcontainer.h"
+
+#include <stringize.h>
+
+extern LLControlGroup gSavedSettings;
+
+static const LLUUID PARCEL_MEDIA_LIST_ITEM_UUID = LLUUID("CAB5920F-E484-4233-8621-384CF373A321");
+static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5D-CA970D694822");
+
+//
+// LLPanelNearByMedia
+//
+
+LLPanelNearByMedia::LLPanelNearByMedia()
+: mMediaList(NULL),
+ mEnableAllCtrl(NULL),
+ mAllMediaDisabled(false),
+ mDebugInfoVisible(false),
+ mParcelMediaItem(NULL),
+ mParcelAudioItem(NULL)
+{
+ mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+
+ mCommitCallbackRegistrar.add("MediaListCtrl.EnableAll", boost::bind(&LLPanelNearByMedia::onClickEnableAll, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.DisableAll", boost::bind(&LLPanelNearByMedia::onClickDisableAll, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.GoMediaPrefs", boost::bind(&LLPanelNearByMedia::onAdvancedButtonClick, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.MoreLess", boost::bind(&LLPanelNearByMedia::onMoreLess, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Stop", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaStop, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Play", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPlay, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Pause", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPause, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Mute", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaMute, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Volume", boost::bind(&LLPanelNearByMedia::onCommitSelectedMediaVolume, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Zoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaZoom, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Unzoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaUnzoom, this));
+
+ LLUICtrlFactory::instance().buildPanel(this, "panel_nearby_media.xml");
+}
+
+LLPanelNearByMedia::~LLPanelNearByMedia()
+{
+}
+
+BOOL LLPanelNearByMedia::postBuild()
+{
+ LLPanel::postBuild();
+
+ const S32 RESIZE_BAR_THICKNESS = 6;
+ LLResizeBar::Params p;
+ p.rect = LLRect(0, RESIZE_BAR_THICKNESS, getRect().getWidth(), 0);
+ p.name = "resizebar_bottom";
+ p.min_size = getRect().getHeight();
+ p.side = LLResizeBar::BOTTOM;
+ p.resizing_view = this;
+ addChild( LLUICtrlFactory::create<LLResizeBar>(p) );
+
+ p.rect = LLRect( 0, getRect().getHeight(), RESIZE_BAR_THICKNESS, 0);
+ p.name = "resizebar_left";
+ p.min_size = getRect().getWidth();
+ p.side = LLResizeBar::LEFT;
+ addChild( LLUICtrlFactory::create<LLResizeBar>(p) );
+
+ LLResizeHandle::Params resize_handle_p;
+ resize_handle_p.rect = LLRect( 0, RESIZE_HANDLE_HEIGHT, RESIZE_HANDLE_WIDTH, 0 );
+ resize_handle_p.mouse_opaque(false);
+ resize_handle_p.min_width(getRect().getWidth());
+ resize_handle_p.min_height(getRect().getHeight());
+ resize_handle_p.corner(LLResizeHandle::LEFT_BOTTOM);
+ addChild(LLUICtrlFactory::create<LLResizeHandle>(resize_handle_p));
+
+ mNearbyMediaPanel = getChild<LLUICtrl>("nearby_media_panel");
+ mMediaList = getChild<LLScrollListCtrl>("media_list");
+ mEnableAllCtrl = getChild<LLUICtrl>("all_nearby_media_enable_btn");
+ mDisableAllCtrl = getChild<LLUICtrl>("all_nearby_media_disable_btn");
+ mItemCountText = getChild<LLTextBox>("media_item_count");
+ mShowCtrl = getChild<LLComboBox>("show_combo");
+
+ // Dynamic (selection-dependent) controls
+ mStopCtrl = getChild<LLUICtrl>("stop");
+ mPlayCtrl = getChild<LLUICtrl>("play");
+ mPauseCtrl = getChild<LLUICtrl>("pause");
+ mMuteCtrl = getChild<LLUICtrl>("mute");
+ mVolumeSliderCtrl = getChild<LLUICtrl>("volume_slider_ctrl");
+ mZoomCtrl = getChild<LLUICtrl>("zoom");
+ mUnzoomCtrl = getChild<LLUICtrl>("unzoom");
+ mVolumeSlider = getChild<LLSlider>("volume_slider");
+ mMuteBtn = getChild<LLButton>("mute_btn");
+
+ mEmptyNameString = getString("empty_item_text");
+ mParcelMediaName = getString("parcel_media_name");
+ mParcelAudioName = getString("parcel_audio_name");
+ mPlayingString = getString("playing_suffix");
+
+ mMediaList->setDoubleClickCallback(onZoomMedia, this);
+ mMediaList->sortByColumnIndex(PROXIMITY_COLUMN, TRUE);
+ mMediaList->sortByColumnIndex(VISIBILITY_COLUMN, FALSE);
+
+ refreshList();
+ updateControls();
+ updateColumns();
+
+ LLView* minimized_controls = getChildView("minimized_controls");
+ mMoreRect = getRect();
+ mLessRect = getRect();
+ mLessRect.mBottom = minimized_controls->getRect().mBottom;
+
+ getChild<LLUICtrl>("more_less_btn")->setValue(false);
+ onMoreLess();
+
+ return TRUE;
+}
+
+/*virtual*/
+void LLPanelNearByMedia::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.stop();
+ LLPanel::onMouseEnter(x,y,mask);
+}
+
+
+/*virtual*/
+void LLPanelNearByMedia::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.start();
+ LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelNearByMedia::handleVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+ //gFocusMgr.setTopCtrl(this);
+ }
+ else
+ {
+ mHoverTimer.stop();
+ //if (gFocusMgr.getTopCtrl() == this)
+ //{
+ // gFocusMgr.setTopCtrl(NULL);
+ //}
+ }
+}
+
+/*virtual*/
+void LLPanelNearByMedia::onTopLost ()
+{
+ //LLUICtrl* new_top = gFocusMgr.getTopCtrl();
+ //if (!new_top || !new_top->hasAncestor(this))
+ //{
+ // setVisible(FALSE);
+ //}
+}
+
+/*virtual*/
+void LLPanelNearByMedia::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLPanel::reshape(width, height, called_from_parent);
+
+ LLButton* more_less_btn = getChild<LLButton>("more_less_btn");
+ if (more_less_btn->getValue().asBoolean())
+ {
+ mMoreRect = getRect();
+ }
+
+}
+
+const F32 AUTO_CLOSE_FADE_TIME_START= 4.0f;
+const F32 AUTO_CLOSE_FADE_TIME_END = 5.0f;
+
+void LLPanelNearByMedia::draw()
+{
+ //LLUICtrl* new_top = gFocusMgr.getTopCtrl();
+ //if (new_top != this)
+ //{
+ // // reassert top ctrl
+ // gFocusMgr.setTopCtrl(this);
+ //}
+
+ // keep bottom of panel on screen
+ LLRect screen_rect = calcScreenRect();
+ if (screen_rect.mBottom < 0)
+ {
+ LLRect new_rect = getRect();
+ new_rect.mBottom += 0 - screen_rect.mBottom;
+ setShape(new_rect);
+ }
+
+ mItemCountText->setValue(llformat(getString("media_item_count_format").c_str(), mMediaList->getItemCount()));
+
+ refreshList();
+ updateControls();
+
+ F32 alpha = mHoverTimer.getStarted()
+ ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), AUTO_CLOSE_FADE_TIME_START, AUTO_CLOSE_FADE_TIME_END, 1.f, 0.f)
+ : 1.0f;
+ LLViewDrawContext context(alpha);
+
+ LLPanel::draw();
+
+ if (alpha == 0.f)
+ {
+ setVisible(false);
+ }
+}
+
+bool LLPanelNearByMedia::getParcelAudioAutoStart()
+{
+ return mParcelAudioAutoStart;
+}
+
+LLScrollListItem* LLPanelNearByMedia::addListItem(const LLUUID &id)
+{
+ if (NULL == mMediaList) return NULL;
+
+ // Just set up the columns -- the values will be filled in by updateListItem().
+
+ LLSD row;
+ row["id"] = id;
+
+ LLSD &columns = row["columns"];
+
+ columns[CHECKBOX_COLUMN]["column"] = "media_checkbox_ctrl";
+ columns[CHECKBOX_COLUMN]["type"] = "checkbox";
+ //if(mDebugInfoVisible)
+ {
+ columns[PROXIMITY_COLUMN]["column"] = "media_proximity";
+ columns[PROXIMITY_COLUMN]["value"] = "";
+ columns[VISIBILITY_COLUMN]["column"] = "media_visibility";
+ columns[VISIBILITY_COLUMN]["value"] = "";
+ columns[CLASS_COLUMN]["column"] = "media_class";
+ columns[CLASS_COLUMN]["type"] = "text";
+ columns[CLASS_COLUMN]["value"] = "";
+ }
+ columns[NAME_COLUMN]["column"] = "media_name";
+ columns[NAME_COLUMN]["type"] = "text";
+ columns[NAME_COLUMN]["value"] = "";
+ //if(mDebugInfoVisible)
+ {
+ columns[DEBUG_COLUMN]["column"] = "media_debug";
+ columns[DEBUG_COLUMN]["type"] = "text";
+ columns[DEBUG_COLUMN]["value"] = "";
+ }
+
+ LLScrollListItem* new_item = mMediaList->addElement(row);
+ if (NULL != new_item)
+ {
+ LLScrollListCheck* scroll_list_check = dynamic_cast<LLScrollListCheck*>(new_item->getColumn(CHECKBOX_COLUMN));
+ if (scroll_list_check)
+ {
+ LLCheckBoxCtrl *check = scroll_list_check->getCheckBox();
+ check->setCommitCallback(boost::bind(&LLPanelNearByMedia::onCheckItem, this, _1, id));
+ }
+ }
+ return new_item;
+}
+
+void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl)
+{
+ std::string item_name;
+ std::string item_tooltip;
+ std::string debug_str;
+ LLPanelNearByMedia::MediaClass media_class = MEDIA_CLASS_ALL;
+
+ getNameAndUrlHelper(impl, item_name, item_tooltip, mEmptyNameString);
+ // Focused
+ if (impl->hasFocus())
+ {
+ media_class = MEDIA_CLASS_FOCUSED;
+ }
+ // Is attached to another avatar?
+ else if (impl->isAttachedToAnotherAvatar())
+ {
+ media_class = MEDIA_CLASS_ON_OTHERS;
+ }
+ // Outside agent parcel
+ else if (!impl->isInAgentParcel())
+ {
+ media_class = MEDIA_CLASS_OUTSIDE_PARCEL;
+ }
+ else {
+ // inside parcel
+ media_class = MEDIA_CLASS_WITHIN_PARCEL;
+ }
+
+ if(mDebugInfoVisible)
+ {
+ debug_str += llformat("%g/", (float)impl->getInterest());
+
+ // proximity distance is actually distance squared -- display it as straight distance.
+ debug_str += llformat("%g/", fsqrtf(impl->getProximityDistance()));
+
+ // s += llformat("%g/", (float)impl->getCPUUsage());
+ // s += llformat("%g/", (float)impl->getApproximateTextureInterest());
+ debug_str += llformat("%g/", (float)(NULL == impl->getSomeObject()) ? 0.0 : impl->getSomeObject()->getPixelArea());
+
+ debug_str += LLPluginClassMedia::priorityToString(impl->getPriority());
+
+ if(impl->hasMedia())
+ {
+ debug_str += '@';
+ }
+ else if(impl->isPlayable())
+ {
+ debug_str += '+';
+ }
+ else if(impl->isForcedUnloaded())
+ {
+ debug_str += '!';
+ }
+ }
+
+ updateListItem(item,
+ item_name,
+ item_tooltip,
+ impl->getProximity(),
+ impl->isMediaDisabled(),
+ impl->hasMedia(),
+ impl->isMediaTimeBased() && impl->isMediaPlaying(),
+ media_class,
+ debug_str);
+}
+
+void LLPanelNearByMedia::updateListItem(LLScrollListItem* item,
+ const std::string &item_name,
+ const std::string &item_tooltip,
+ S32 proximity,
+ bool is_disabled,
+ bool has_media,
+ bool is_time_based_and_playing,
+ LLPanelNearByMedia::MediaClass media_class,
+ const std::string &debug_str)
+{
+ LLScrollListCell* cell = item->getColumn(PROXIMITY_COLUMN);
+ if(cell)
+ {
+ // since we are forced to sort by text, encode sort order as string
+ std::string proximity_string = STRINGIZE(proximity);
+ std::string old_proximity_string = cell->getValue().asString();
+ if(proximity_string != old_proximity_string)
+ {
+ cell->setValue(proximity_string);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ cell = item->getColumn(CHECKBOX_COLUMN);
+ if(cell)
+ {
+ cell->setValue(!is_disabled);
+ }
+
+ cell = item->getColumn(VISIBILITY_COLUMN);
+ if(cell)
+ {
+ S32 old_visibility = cell->getValue();
+ // *HACK ALERT: force ordering of Media before Audio before the rest of the list
+ S32 new_visibility =
+ item->getUUID() == PARCEL_MEDIA_LIST_ITEM_UUID ? 3
+ : item->getUUID() == PARCEL_AUDIO_LIST_ITEM_UUID ? 2
+ : (has_media) ? 1
+ : ((is_disabled) ? 0
+ : -1);
+ cell->setValue(STRINGIZE(new_visibility));
+ if (new_visibility != old_visibility)
+ {
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ cell = item->getColumn(NAME_COLUMN);
+ if(cell)
+ {
+ std::string name = item_name;
+ std::string old_name = cell->getValue().asString();
+ if (has_media)
+ {
+ name += " " + mPlayingString;
+ }
+ if (name != old_name)
+ {
+ cell->setValue(name);
+ }
+ cell->setToolTip(item_tooltip);
+
+ // *TODO: Make these font styles/colors configurable via XUI
+ U8 font_style = LLFontGL::NORMAL;
+ LLColor4 cell_color = LLColor4::white;
+
+ // Only colorize by class in debug
+ if (mDebugInfoVisible)
+ {
+ switch (media_class) {
+ case MEDIA_CLASS_FOCUSED:
+ cell_color = LLColor4::yellow;
+ break;
+ case MEDIA_CLASS_ON_OTHERS:
+ cell_color = LLColor4::red;
+ break;
+ case MEDIA_CLASS_OUTSIDE_PARCEL:
+ cell_color = LLColor4::orange;
+ break;
+ case MEDIA_CLASS_WITHIN_PARCEL:
+ default:
+ break;
+ }
+ }
+ if (is_disabled)
+ {
+ if (mDebugInfoVisible)
+ {
+ font_style |= LLFontGL::ITALIC;
+ cell_color = LLColor4::black;
+ }
+ else {
+ // Dim it if it is disabled
+ cell_color.setAlpha(0.25);
+ }
+ }
+ // Dim it if it isn't "showing"
+ else if (!has_media)
+ {
+ cell_color.setAlpha(0.25);
+ }
+ // Bold it if it is time-based media and it is playing
+ else if (is_time_based_and_playing)
+ {
+ if (mDebugInfoVisible) font_style |= LLFontGL::BOLD;
+ }
+ cell->setColor(cell_color);
+ LLScrollListText *text_cell = dynamic_cast<LLScrollListText*> (cell);
+ if (text_cell)
+ {
+ text_cell->setFontStyle(font_style);
+ }
+ }
+
+ cell = item->getColumn(CLASS_COLUMN);
+ if(cell)
+ {
+ // TODO: clean this up!
+ cell->setValue(STRINGIZE(media_class));
+ }
+
+ if(mDebugInfoVisible)
+ {
+ cell = item->getColumn(DEBUG_COLUMN);
+ if(cell)
+ {
+ cell->setValue(debug_str);
+ }
+ }
+}
+
+void LLPanelNearByMedia::removeListItem(const LLUUID &id)
+{
+ if (NULL == mMediaList) return;
+
+ mMediaList->deleteSingleItem(mMediaList->getItemIndex(id));
+}
+
+void LLPanelNearByMedia::refreshParcelItems()
+{
+ //
+ // First add/remove the "fake" items Parcel Media and Parcel Audio.
+ // These items will have special UUIDs
+ // PARCEL_MEDIA_LIST_ITEM_UUID
+ // PARCEL_AUDIO_LIST_ITEM_UUID
+ //
+ // Get the filter choice.
+ const LLSD &choice_llsd = mShowCtrl->getSelectedValue();
+ MediaClass choice = (MediaClass)choice_llsd.asInteger();
+ // Only show "special parcel items" if "All" or "Within" filter
+ bool should_include = choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL;
+
+ // First Parcel Media: add or remove it as necessary
+ if (should_include && LLViewerMedia::hasParcelMedia())
+ {
+ // Yes, there is parcel media.
+ if (NULL == mParcelMediaItem)
+ {
+ mParcelMediaItem = addListItem(PARCEL_MEDIA_LIST_ITEM_UUID);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+ else {
+ if (NULL != mParcelMediaItem) {
+ removeListItem(PARCEL_MEDIA_LIST_ITEM_UUID);
+ mParcelMediaItem = NULL;
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ // ... then update it
+ if (NULL != mParcelMediaItem)
+ {
+ std::string name, url, tooltip;
+ getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
+ if (name.empty() || name == url)
+ {
+ tooltip = url;
+ }
+ else {
+ tooltip = name + " : " + url;
+ }
+ LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
+ updateListItem(mParcelMediaItem,
+ mParcelMediaName,
+ tooltip,
+ -2, // Proximity closer than anything else, before Parcel Audio
+ impl == NULL || impl->isMediaDisabled(),
+ impl != NULL && !LLViewerParcelMedia::getURL().empty(),
+ impl != NULL && impl->isMediaTimeBased() && impl->isMediaPlaying(),
+ MEDIA_CLASS_ALL,
+ "parcel media");
+ }
+
+ // Next Parcel Audio: add or remove it as necessary
+ if (should_include && LLViewerMedia::hasParcelAudio())
+ {
+ // Yes, there is parcel audio.
+ if (NULL == mParcelAudioItem)
+ {
+ mParcelAudioItem = addListItem(PARCEL_AUDIO_LIST_ITEM_UUID);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+ else {
+ if (NULL != mParcelAudioItem) {
+ removeListItem(PARCEL_AUDIO_LIST_ITEM_UUID);
+ mParcelAudioItem = NULL;
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ // ... then update it
+ if (NULL != mParcelAudioItem)
+ {
+ bool is_playing = LLViewerMedia::isParcelAudioPlaying();
+ updateListItem(mParcelAudioItem,
+ mParcelAudioName,
+ LLViewerMedia::getParcelAudioURL(),
+ -1, // Proximity after Parcel Media, but closer than anything else
+ !is_playing,
+ is_playing,
+ is_playing,
+ MEDIA_CLASS_ALL,
+ "parcel audio");
+ }
+}
+
+void LLPanelNearByMedia::refreshList()
+{
+ bool all_items_deleted = false;
+
+ if(!mMediaList)
+ {
+ // None of this makes any sense if the media list isn't there.
+ return;
+ }
+
+ // Check whether the debug column has been shown/hidden.
+ bool debug_info_visible = gSavedSettings.getBOOL("MediaPerformanceManagerDebug");
+ if(debug_info_visible != mDebugInfoVisible)
+ {
+ mDebugInfoVisible = debug_info_visible;
+
+ // Clear all items so the list gets regenerated.
+ mMediaList->deleteAllItems();
+ mParcelAudioItem = NULL;
+ mParcelMediaItem = NULL;
+ all_items_deleted = true;
+
+ updateColumns();
+ }
+
+ refreshParcelItems();
+
+ // Get the canonical list from LLViewerMedia
+ LLViewerMedia::impl_list impls = LLViewerMedia::getPriorityList();
+ LLViewerMedia::impl_list::iterator priority_iter;
+
+ U32 enabled_count = 0;
+ U32 disabled_count = 0;
+
+ // iterate over the impl list, creating rows as necessary.
+ for(priority_iter = impls.begin(); priority_iter != impls.end(); priority_iter++)
+ {
+ LLViewerMediaImpl *impl = *priority_iter;
+
+ // If we just emptied out the list, every flag needs to be reset.
+ if(all_items_deleted)
+ {
+ impl->setInNearbyMediaList(false);
+ }
+
+ if (!impl->isParcelMedia())
+ {
+ LLUUID media_id = impl->getMediaTextureID();
+ S32 proximity = impl->getProximity();
+ // This is expensive (i.e. a linear search) -- don't use it here. We now use mInNearbyMediaList instead.
+ //S32 index = mMediaList->getItemIndex(media_id);
+ if (proximity < 0 || !shouldShow(impl))
+ {
+ if (impl->getInNearbyMediaList())
+ {
+ // There's a row for this impl -- remove it.
+ removeListItem(media_id);
+ impl->setInNearbyMediaList(false);
+ }
+ }
+ else
+ {
+ if (!impl->getInNearbyMediaList())
+ {
+ // We don't have a row for this impl -- add one.
+ addListItem(media_id);
+ impl->setInNearbyMediaList(true);
+ }
+ }
+ // Update counts
+ if (impl->isMediaDisabled())
+ {
+ disabled_count++;
+ }
+ else {
+ enabled_count++;
+ }
+ }
+ }
+ mDisableAllCtrl->setEnabled(LLViewerMedia::isAnyMediaShowing() ||
+ LLViewerMedia::isParcelMediaPlaying() ||
+ LLViewerMedia::isParcelAudioPlaying());
+ mEnableAllCtrl->setEnabled(disabled_count > 0 ||
+ // parcel media (if we have it, and it isn't playing, enable "start")
+ (LLViewerMedia::hasParcelMedia() && ! LLViewerMedia::isParcelMediaPlaying()) ||
+ // parcel audio (if we have it, and it isn't playing, enable "start")
+ (LLViewerMedia::hasParcelAudio() && ! LLViewerMedia::isParcelAudioPlaying()));
+
+ // Iterate over the rows in the control, updating ones whose impl exists, and deleting ones whose impl has gone away.
+ std::vector<LLScrollListItem*> items = mMediaList->getAllData();
+
+ for (std::vector<LLScrollListItem*>::iterator item_it = items.begin();
+ item_it != items.end();
+ ++item_it)
+ {
+ LLScrollListItem* item = (*item_it);
+ LLUUID row_id = item->getUUID();
+
+ if (row_id != PARCEL_MEDIA_LIST_ITEM_UUID &&
+ row_id != PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id);
+ if(impl)
+ {
+ updateListItem(item, impl);
+ }
+ else
+ {
+ // This item's impl has been deleted -- remove the row.
+ // Removing the row won't throw off our iteration, since we have a local copy of the array.
+ // We just need to make sure we don't access this item after the delete.
+ removeListItem(row_id);
+ }
+ }
+ }
+
+ // Set the selection to whatever media impl the media focus/hover is on.
+ // This is an experiment, and can be removed by ifdefing out these 4 lines.
+ LLUUID media_target = LLViewerMediaFocus::getInstance()->getControlsMediaID();
+ if(media_target.notNull())
+ {
+ mMediaList->selectByID(media_target);
+ }
+}
+
+void LLPanelNearByMedia::updateColumns()
+{
+ if (!mDebugInfoVisible)
+ {
+ if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(-1);
+ }
+ else {
+ if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(30);
+ if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(200);
+ }
+}
+
+void LLPanelNearByMedia::onClickEnableAll()
+{
+ LLViewerMedia::setAllMediaEnabled(true);
+}
+
+void LLPanelNearByMedia::onClickDisableAll()
+{
+ LLViewerMedia::setAllMediaEnabled(false);
+}
+
+void LLPanelNearByMedia::onClickEnableParcelMedia()
+{
+ if ( ! LLViewerMedia::isParcelMediaPlaying() )
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+}
+
+void LLPanelNearByMedia::onClickDisableParcelMedia()
+{
+ // This actually unloads the impl, as opposed to "stop"ping the media
+ LLViewerParcelMedia::stop();
+}
+
+void LLPanelNearByMedia::onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id)
+{
+ LLCheckBoxCtrl* check = static_cast<LLCheckBoxCtrl*>(ctrl);
+
+ setDisabled(row_id, ! check->getValue());
+}
+
+bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled)
+{
+ if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ if (disabled) onClickParcelAudioStop();
+ else onClickParcelAudioStart();
+ return true;
+ }
+ else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ if (disabled) onClickDisableParcelMedia();
+ else onClickEnableParcelMedia();
+ return true;
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id);
+ if(impl)
+ {
+ impl->setDisabled(disabled, true);
+ return true;
+ }
+ }
+ return false;
+}
+
+//static
+void LLPanelNearByMedia::onZoomMedia(void* user_data)
+{
+ LLPanelNearByMedia* panelp = (LLPanelNearByMedia*)user_data;
+ LLUUID media_id = panelp->mMediaList->getValue().asUUID();
+
+ LLViewerMediaFocus::getInstance()->focusZoomOnMedia(media_id);
+}
+
+void LLPanelNearByMedia::onClickParcelMediaPlay()
+{
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+}
+
+void LLPanelNearByMedia::onClickParcelMediaStop()
+{
+ if (LLViewerParcelMedia::getParcelMedia())
+ {
+ // This stops the media playing, as opposed to unloading it like
+ // LLViewerParcelMedia::stop() does
+ LLViewerParcelMedia::getParcelMedia()->stop();
+ }
+}
+
+void LLPanelNearByMedia::onClickParcelMediaPause()
+{
+ LLViewerParcelMedia::pause();
+}
+
+void LLPanelNearByMedia::onClickParcelAudioStart()
+{
+ // User *explicitly* started the internet stream, so keep the stream
+ // playing and updated as they cross to other parcels etc.
+ mParcelAudioAutoStart = true;
+
+ if (!gAudiop)
+ return;
+
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+}
+
+void LLPanelNearByMedia::onClickParcelAudioPlay()
+{
+ // User *explicitly* started the internet stream, so keep the stream
+ // playing and updated as they cross to other parcels etc.
+ mParcelAudioAutoStart = true;
+
+ if (!gAudiop)
+ return;
+
+ if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
+ {
+ // 'false' means unpause
+ gAudiop->pauseInternetStream(false);
+ }
+ else {
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ }
+}
+
+void LLPanelNearByMedia::onClickParcelAudioStop()
+{
+ // User *explicitly* stopped the internet stream, so don't
+ // re-start audio when i.e. they move to another parcel, until
+ // they explicitly start it again.
+ mParcelAudioAutoStart = false;
+
+ if (!gAudiop)
+ return;
+
+ gAudiop->stopInternetStream();
+}
+
+void LLPanelNearByMedia::onClickParcelAudioPause()
+{
+ if (!gAudiop)
+ return;
+
+ // 'true' means pause
+ gAudiop->pauseInternetStream(true);
+}
+
+bool LLPanelNearByMedia::shouldShow(LLViewerMediaImpl* impl)
+{
+ const LLSD &choice_llsd = mShowCtrl->getSelectedValue();
+ MediaClass choice = (MediaClass)choice_llsd.asInteger();
+
+ switch (choice)
+ {
+ case MEDIA_CLASS_ALL:
+ return true;
+ break;
+ case MEDIA_CLASS_WITHIN_PARCEL:
+ return impl->isInAgentParcel();
+ break;
+ case MEDIA_CLASS_OUTSIDE_PARCEL:
+ return ! impl->isInAgentParcel();
+ break;
+ case MEDIA_CLASS_ON_OTHERS:
+ return impl->isAttachedToAnotherAvatar();
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+void LLPanelNearByMedia::onAdvancedButtonClick()
+{
+ // bring up the prefs floater
+ LLFloaterPreference* prefsfloater = dynamic_cast<LLFloaterPreference*>(LLFloaterReg::showInstance("preferences"));
+ if (prefsfloater)
+ {
+ // grab the 'audio' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
+ LLPanel* audiopanel = prefsfloater->getChild<LLPanel>("audio");
+ if (tabcontainer && audiopanel)
+ {
+ tabcontainer->selectTabPanel(audiopanel);
+ }
+ }
+}
+
+void LLPanelNearByMedia::onMoreLess()
+{
+ bool is_more = getChild<LLUICtrl>("more_less_btn")->getValue();
+ mNearbyMediaPanel->setVisible(is_more);
+
+ // enable resizing when expanded
+ getChildView("resizebar_bottom")->setEnabled(is_more);
+
+ LLRect new_rect = is_more ? mMoreRect : mLessRect;
+ new_rect.translate(getRect().mRight - new_rect.mRight, getRect().mTop - new_rect.mTop);
+
+ setShape(new_rect);
+}
+
+void LLPanelNearByMedia::updateControls()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ showTimeBasedControls(LLViewerMedia::isParcelAudioPlaying(),
+ false, // include_zoom
+ false, // is_zoomed
+ gSavedSettings.getBOOL("MuteMusic"),
+ gSavedSettings.getF32("AudioLevelMusic") );
+ }
+ else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ if (!LLViewerMedia::hasParcelMedia())
+ {
+ // Shouldn't happen, but do this anyway
+ showDisabledControls();
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerParcelMedia::getParcelMedia();
+ if (NULL == impl)
+ {
+ // Just means it hasn't started yet
+ showBasicControls(false, false, false);
+ }
+ else if (impl->isMediaTimeBased())
+ {
+ showTimeBasedControls(impl->isMediaPlaying(),
+ false, // include_zoom
+ false, // is_zoomed
+ impl->getVolume() == 0.0,
+ impl->getVolume() );
+ }
+ else {
+ // non-time-based parcel media
+ showBasicControls(LLViewerMedia::isParcelMediaPlaying(), false, false);
+ }
+ }
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+
+ if (NULL == impl)
+ {
+ showDisabledControls();
+ }
+ else {
+ if (impl->isMediaTimeBased())
+ {
+ showTimeBasedControls(impl->isMediaPlaying(),
+ ! impl->isParcelMedia(), // include_zoom
+ LLViewerMediaFocus::getInstance()->isZoomed(),
+ impl->getVolume() == 0.0,
+ impl->getVolume());
+ }
+ else {
+ showBasicControls(!impl->isMediaDisabled(),
+ ! impl->isParcelMedia(), // include_zoom
+ LLViewerMediaFocus::getInstance()->isZoomed());
+ }
+ }
+ }
+}
+
+void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool is_zoomed)
+{
+ mStopCtrl->setVisible(playing);
+ mPlayCtrl->setVisible(!playing);
+ mPauseCtrl->setVisible(false);
+ mMuteCtrl->setVisible(false);
+ mVolumeSliderCtrl->setVisible(false);
+ mZoomCtrl->setVisible(include_zoom && !is_zoomed);
+ mUnzoomCtrl->setVisible(include_zoom && is_zoomed);
+ mStopCtrl->setEnabled(true);
+ mZoomCtrl->setEnabled(true);
+}
+
+void LLPanelNearByMedia::showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume)
+{
+ mStopCtrl->setVisible(true);
+ mPlayCtrl->setVisible(!playing);
+ mPauseCtrl->setVisible(playing);
+ mMuteCtrl->setVisible(true);
+ mVolumeSliderCtrl->setVisible(true);
+ mZoomCtrl->setVisible(include_zoom);
+ mZoomCtrl->setVisible(include_zoom && !is_zoomed);
+ mUnzoomCtrl->setVisible(include_zoom && is_zoomed);
+ mStopCtrl->setEnabled(true);
+ mZoomCtrl->setEnabled(true);
+ mMuteBtn->setValue(muted);
+ mVolumeSlider->setValue(volume);
+}
+
+void LLPanelNearByMedia::showDisabledControls()
+{
+ mStopCtrl->setVisible(true);
+ mPlayCtrl->setVisible(false);
+ mPauseCtrl->setVisible(false);
+ mMuteCtrl->setVisible(false);
+ mVolumeSliderCtrl->setVisible(false);
+ mZoomCtrl->setVisible(true);
+ mUnzoomCtrl->setVisible(false);
+ mStopCtrl->setEnabled(false);
+ mZoomCtrl->setEnabled(false);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaStop()
+{
+ setDisabled(mMediaList->getValue().asUUID(), true);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaPlay()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+
+ // First enable it
+ setDisabled(selected_media_id, false);
+
+ // Special code to make play "unpause" if time-based and playing
+ if (selected_media_id != PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ LLViewerMediaImpl *impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl && impl->isMediaTimeBased() && impl->isMediaPaused())
+ {
+ // Aha! It's really time-based media that's paused, so unpause
+ impl->play();
+ return;
+ }
+ else if (impl->isParcelMedia())
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaPause()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ onClickParcelAudioPause();
+ }
+ else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ onClickParcelMediaPause();
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl && impl->isMediaTimeBased() && impl->isMediaPlaying())
+ {
+ impl->pause();
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaMute()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ gSavedSettings.setBOOL("MuteMusic", mMuteBtn->getValue());
+ }
+ else {
+ LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl && impl->isMediaTimeBased())
+ {
+ F32 volume = impl->getVolume();
+ if(volume > 0.0)
+ {
+ impl->setVolume(0.0);
+ }
+ else if (mVolumeSlider->getValueF32() == 0.0)
+ {
+ impl->setVolume(1.0);
+ mVolumeSlider->setValue(1.0);
+ }
+ else
+ {
+ impl->setVolume(mVolumeSlider->getValueF32());
+ }
+ }
+ }
+}
+
+void LLPanelNearByMedia::onCommitSelectedMediaVolume()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ F32 vol = mVolumeSlider->getValueF32();
+ gSavedSettings.setF32("AudioLevelMusic", vol);
+ }
+ else {
+ LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl && impl->isMediaTimeBased())
+ {
+ impl->setVolume(mVolumeSlider->getValueF32());
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaZoom()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID || selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ return;
+ LLViewerMediaFocus::getInstance()->focusZoomOnMedia(selected_media_id);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaUnzoom()
+{
+ LLViewerMediaFocus::getInstance()->unZoom();
+}
+
+
+// static
+void LLPanelNearByMedia::getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName)
+{
+ if (NULL == impl) return;
+
+ name = impl->getName();
+ url = impl->getCurrentMediaURL(); // This is the URL the media impl actually has loaded
+ if (url.empty())
+ {
+ url = impl->getMediaEntryURL(); // This is the current URL from the media data
+ }
+ if (url.empty())
+ {
+ url = impl->getHomeURL(); // This is the home URL from the media data
+ }
+ if (name.empty())
+ {
+ name = url;
+ }
+ if (name.empty())
+ {
+ name = defaultName;
+ }
+}
+
diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h
new file mode 100644
index 0000000000..6fe724266b
--- /dev/null
+++ b/indra/newview/llpanelnearbymedia.h
@@ -0,0 +1,185 @@
+/**
+ * @file llpanelnearbymedia.h
+ * @brief Management interface for muting and controlling nearby media
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELNEARBYMEDIA_H
+#define LL_LLPANELNEARBYMEDIA_H
+
+#include "llpanel.h"
+
+class LLPanelNearbyMedia;
+class LLButton;
+class LLScrollListCtrl;
+class LLSlider;
+class LLSliderCtrl;
+class LLCheckBoxCtrl;
+class LLTextBox;
+class LLComboBox;
+class LLViewerMediaImpl;
+
+class LLPanelNearByMedia : public LLPanel
+{
+public:
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+ /*virtual*/ void onTopLost ();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
+
+ // this is part of the nearby media *dialog* so we can track whether
+ // the user *implicitly* wants audio on or off via their *explicit*
+ // interaction with our buttons.
+ bool getParcelAudioAutoStart();
+
+ LLPanelNearByMedia();
+ virtual ~LLPanelNearByMedia();
+
+private:
+
+ enum ColumnIndex {
+ CHECKBOX_COLUMN = 0,
+ PROXIMITY_COLUMN = 1,
+ VISIBILITY_COLUMN = 2,
+ CLASS_COLUMN = 3,
+ NAME_COLUMN = 4,
+ DEBUG_COLUMN = 5
+ };
+
+ // Media "class" enumeration
+ enum MediaClass {
+ MEDIA_CLASS_ALL = 0,
+ MEDIA_CLASS_FOCUSED = 1,
+ MEDIA_CLASS_WITHIN_PARCEL = 2,
+ MEDIA_CLASS_OUTSIDE_PARCEL = 3,
+ MEDIA_CLASS_ON_OTHERS = 4
+ };
+
+ // Add/remove an LLViewerMediaImpl to/from the list
+ LLScrollListItem* addListItem(const LLUUID &id);
+ void updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl);
+ void updateListItem(LLScrollListItem* item,
+ const std::string &item_name,
+ const std::string &item_tooltip,
+ S32 proximity,
+ bool is_disabled,
+ bool has_media,
+ bool is_time_based_and_playing,
+ MediaClass media_class,
+ const std::string &debug_str);
+ void removeListItem(const LLUUID &id);
+
+ // Refresh the list in the UI
+ void refreshList();
+
+ void refreshParcelItems();
+
+ // UI Callbacks
+ void onClickEnableAll();
+ void onClickDisableAll();
+ void onClickEnableParcelMedia();
+ void onClickDisableParcelMedia();
+ void onClickMuteParcelMedia();
+ void onParcelMediaVolumeSlider();
+ void onClickParcelMediaPlay();
+ void onClickParcelMediaStop();
+ void onClickParcelMediaPause();
+ void onClickParcelAudioPlay();
+ void onClickParcelAudioStop();
+ void onClickParcelAudioStart();
+ void onClickParcelAudioPause();
+ void onCheckAutoPlay();
+ void onAdvancedButtonClick();
+ void onMoreLess();
+
+ void onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id);
+
+ static void onZoomMedia(void* user_data);
+
+private:
+ bool setDisabled(const LLUUID &id, bool disabled);
+
+ static void getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName);
+
+ void updateColumns();
+
+ bool shouldShow(LLViewerMediaImpl* impl);
+
+ void showBasicControls(bool playing, bool include_zoom, bool is_zoomed);
+ void showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume);
+ void showDisabledControls();
+ void updateControls();
+
+ void onClickSelectedMediaStop();
+ void onClickSelectedMediaPlay();
+ void onClickSelectedMediaPause();
+ void onClickSelectedMediaMute();
+ void onCommitSelectedMediaVolume();
+ void onClickSelectedMediaZoom();
+ void onClickSelectedMediaUnzoom();
+
+ LLUICtrl* mNearbyMediaPanel;
+ LLTextBox* mItemCountText;
+ LLScrollListCtrl* mMediaList;
+ LLUICtrl* mEnableAllCtrl;
+ LLUICtrl* mDisableAllCtrl;
+ LLComboBox* mShowCtrl;
+
+ // Dynamic (selection-dependent) controls
+ LLUICtrl* mStopCtrl;
+ LLUICtrl* mPlayCtrl;
+ LLUICtrl* mPauseCtrl;
+ LLUICtrl* mMuteCtrl;
+ LLUICtrl* mVolumeSliderCtrl;
+ LLUICtrl* mZoomCtrl;
+ LLUICtrl* mUnzoomCtrl;
+ LLSlider* mVolumeSlider;
+ LLButton* mMuteBtn;
+
+ bool mAllMediaDisabled;
+ bool mDebugInfoVisible;
+ bool mParcelAudioAutoStart;
+ std::string mEmptyNameString;
+ std::string mPlayingString;
+ std::string mParcelMediaName;
+ std::string mParcelAudioName;
+
+ LLRect mMoreRect;
+ LLRect mLessRect;
+ LLFrameTimer mHoverTimer;
+ LLScrollListItem* mParcelMediaItem;
+ LLScrollListItem* mParcelAudioItem;
+};
+
+
+#endif // LL_LLPANELNEARBYMEDIA_H
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 6a61e0f02f..30221da12a 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -73,7 +73,7 @@
#include "pipeline.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "lldrawpool.h"
@@ -316,11 +316,14 @@ BOOL LLPanelObject::postBuild()
LLPanelObject::LLPanelObject()
: LLPanel(),
+ mComboMaterialItemCount(0),
mIsPhysical(FALSE),
mIsTemporary(FALSE),
mIsPhantom(FALSE),
mCastShadows(TRUE),
- mSelectedType(MI_BOX)
+ mSelectedType(MI_BOX),
+ mSculptTextureRevert(LLUUID::null),
+ mSculptTypeRevert(0)
{
}
@@ -682,7 +685,7 @@ void LLPanelObject::getState( )
if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
{
selected_item = MI_SCULPT;
- LLFirstUse::useSculptedPrim();
+ //LLFirstUse::useSculptedPrim();
}
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 1ab4ff581e..58d9fe9b76 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -45,7 +45,6 @@ class LLUICtrl;
class LLButton;
class LLViewerObject;
class LLComboBox;
-class LLPanelInventory;
class LLColorSwatchCtrl;
class LLTextureCtrl;
class LLInventoryItem;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
new file mode 100644
index 0000000000..5ddbdf7f01
--- /dev/null
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -0,0 +1,1966 @@
+/**
+ * @file llsidepanelinventory.cpp
+ * @brief LLPanelObjectInventory class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+//*****************************************************************************
+//
+// Implementation of the panel inventory - used to view and control a
+// task's inventory.
+//
+//*****************************************************************************
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelobjectinventory.h"
+
+#include "llmenugl.h"
+#include "llnotificationsutil.h"
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llcallbacklist.h"
+#include "llfloaterbuycurrency.h"
+#include "llfloaterreg.h"
+#include "llinventorybridge.h"
+#include "llinventoryfilter.h"
+#include "llinventoryfunctions.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewnotecard.h"
+#include "llpreviewscript.h"
+#include "llpreviewsound.h"
+#include "llpreviewtexture.h"
+#include "llscrollcontainer.h"
+#include "llselectmgr.h"
+#include "llsidetray.h"
+#include "llstatusbar.h"
+#include "lltrans.h"
+#include "llviewerassettype.h"
+#include "llviewerregion.h"
+#include "llviewerobjectlist.h"
+#include "llviewermessage.h"
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskInvFVBridge
+///----------------------------------------------------------------------------
+
+class LLTaskInvFVBridge : public LLFolderViewEventListener
+{
+protected:
+ LLUUID mUUID;
+ std::string mName;
+ mutable std::string mDisplayName;
+ LLPanelObjectInventory* mPanel;
+ U32 mFlags;
+
+ LLInventoryItem* findItem() const;
+
+public:
+ LLTaskInvFVBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ U32 flags=0);
+ virtual ~LLTaskInvFVBridge( void ) {}
+
+ virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
+ virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
+
+ static LLTaskInvFVBridge* createObjectBridge(LLPanelObjectInventory* panel,
+ LLInventoryObject* object);
+ void showProperties();
+ void buyItem();
+ S32 getPrice();
+ static bool commitBuyItem(const LLSD& notification, const LLSD& response);
+
+ // LLFolderViewEventListener functionality
+ virtual const std::string& getName() const;
+ virtual const std::string& getDisplayName() const;
+ virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
+ /*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
+ virtual const LLUUID& getUUID() const { return mUUID; }
+ virtual time_t getCreationDate() const;
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void closeItem() {}
+ virtual void previewItem();
+ virtual void selectItem() {}
+ virtual BOOL isItemRenameable() const;
+ virtual BOOL renameItem(const std::string& new_name);
+ virtual BOOL isItemMovable() const;
+ virtual BOOL isItemRemovable() const;
+ virtual BOOL removeItem();
+ virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
+ virtual void move(LLFolderViewEventListener* parent_listener);
+ virtual BOOL isItemCopyable() const;
+ virtual BOOL copyToClipboard() const;
+ virtual void cutToClipboard();
+ virtual BOOL isClipboardPasteable() const;
+ virtual void pasteFromClipboard();
+ virtual void pasteLinkFromClipboard();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual BOOL isUpToDate() const { return TRUE; }
+ virtual BOOL hasChildren() const { return FALSE; }
+ virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; }
+ // LLDragAndDropBridge functionality
+ virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
+ virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data);
+};
+
+LLTaskInvFVBridge::LLTaskInvFVBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ U32 flags):
+ mUUID(uuid),
+ mName(name),
+ mPanel(panel),
+ mFlags(flags)
+{
+
+}
+
+LLInventoryItem* LLTaskInvFVBridge::findItem() const
+{
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
+ }
+ return NULL;
+}
+
+void LLTaskInvFVBridge::showProperties()
+{
+ LLSD key;
+ key["object"] = mPanel->getTaskUUID();
+ key["id"] = mUUID;
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+
+ // Disable old properties floater; this is replaced by the sidepanel.
+ /*
+ LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID);
+ if (floater)
+ {
+ floater->setObjectID(mPanel->getTaskUUID());
+ }
+ */
+}
+
+struct LLBuyInvItemData
+{
+ LLUUID mTaskID;
+ LLUUID mItemID;
+ LLAssetType::EType mType;
+
+ LLBuyInvItemData(const LLUUID& task,
+ const LLUUID& item,
+ LLAssetType::EType type) :
+ mTaskID(task), mItemID(item), mType(type)
+ {}
+};
+
+void LLTaskInvFVBridge::buyItem()
+{
+ llinfos << "LLTaskInvFVBridge::buyItem()" << llendl;
+ LLInventoryItem* item = findItem();
+ if(!item || !item->getSaleInfo().isForSale()) return;
+ LLBuyInvItemData* inv = new LLBuyInvItemData(mPanel->getTaskUUID(),
+ mUUID,
+ item->getType());
+
+ const LLSaleInfo& sale_info = item->getSaleInfo();
+ const LLPermissions& perm = item->getPermissions();
+ const std::string owner_name; // no owner name currently... FIXME?
+
+ LLViewerObject* obj;
+ if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() )
+ {
+ LLNotificationsUtil::add("Cannot_Purchase_an_Attachment");
+ llinfos << "Attempt to purchase an attachment" << llendl;
+ delete inv;
+ }
+ else
+ {
+ LLSD args;
+ args["PRICE"] = llformat("%d",sale_info.getSalePrice());
+ args["OWNER"] = owner_name;
+ if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
+ {
+ U32 next_owner_mask = perm.getMaskNextOwner();
+ args["MODIFYPERM"] = LLTrans::getString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
+ args["COPYPERM"] = LLTrans::getString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
+ args["RESELLPERM"] = LLTrans::getString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
+ }
+
+ std::string alertdesc;
+ switch(sale_info.getSaleType())
+ {
+ case LLSaleInfo::FS_ORIGINAL:
+ alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal";
+ break;
+ case LLSaleInfo::FS_CONTENTS:
+ alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents";
+ break;
+ case LLSaleInfo::FS_COPY:
+ default:
+ alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy";
+ break;
+ }
+
+ LLSD payload;
+ payload["task_id"] = inv->mTaskID;
+ payload["item_id"] = inv->mItemID;
+ payload["type"] = inv->mType;
+ LLNotificationsUtil::add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem);
+ }
+}
+
+S32 LLTaskInvFVBridge::getPrice()
+{
+ LLInventoryItem* item = findItem();
+ if(item)
+ {
+ return item->getSaleInfo().getSalePrice();
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// static
+bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if(0 == option)
+ {
+ LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
+ if(!object || !object->getRegion()) return false;
+
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_BuyObjectInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_Data);
+ msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID());
+ msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID());
+ msg->addUUIDFast(_PREHASH_FolderID,
+ gInventory.findCategoryUUIDForType((LLFolderType::EType)notification["payload"]["type"].asInteger()));
+ msg->sendReliable(object->getRegion()->getHost());
+ }
+ return false;
+}
+
+const std::string& LLTaskInvFVBridge::getName() const
+{
+ return mName;
+}
+
+const std::string& LLTaskInvFVBridge::getDisplayName() const
+{
+ LLInventoryItem* item = findItem();
+
+ if(item)
+ {
+ if(item->getParentUUID().isNull())
+ {
+ if(item->getName() == "Contents")
+ {
+ mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
+ }
+ else
+ {
+ mDisplayName.assign(item->getName());
+ }
+ }
+ else
+ {
+ mDisplayName.assign(item->getName());
+ }
+ const LLPermissions& perm(item->getPermissions());
+ BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
+ BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
+ BOOL xfer = gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE);
+
+ if(!copy)
+ {
+ mDisplayName.append(LLTrans::getString("no_copy"));
+ }
+ if(!mod)
+ {
+ mDisplayName.append(LLTrans::getString("no_modify"));
+ }
+ if(!xfer)
+ {
+ mDisplayName.append(LLTrans::getString("no_transfer"));
+ }
+ }
+
+ return mDisplayName;
+}
+
+// BUG: No creation dates for task inventory
+time_t LLTaskInvFVBridge::getCreationDate() const
+{
+ return 0;
+}
+
+LLUIImagePtr LLTaskInvFVBridge::getIcon() const
+{
+ BOOL item_is_multi = FALSE;
+ if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
+ {
+ item_is_multi = TRUE;
+ }
+
+ return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi );
+}
+
+void LLTaskInvFVBridge::openItem()
+{
+ // no-op.
+ lldebugs << "LLTaskInvFVBridge::openItem()" << llendl;
+}
+
+void LLTaskInvFVBridge::previewItem()
+{
+ openItem();
+}
+
+BOOL LLTaskInvFVBridge::isItemRenameable() const
+{
+ if(gAgent.isGodlike()) return TRUE;
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ LLInventoryItem* item;
+ item = (LLInventoryItem*)(object->getInventoryObject(mUUID));
+ if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
+ GP_OBJECT_MANIPULATE, GOD_LIKE))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name)
+{
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ LLViewerInventoryItem* item = NULL;
+ item = (LLViewerInventoryItem*)object->getInventoryObject(mUUID);
+ if(item && (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
+ GP_OBJECT_MANIPULATE, GOD_LIKE)))
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->rename(new_name);
+ object->updateInventory(
+ new_item,
+ TASK_INVENTORY_ITEM_KEY,
+ false);
+ }
+ }
+ return TRUE;
+}
+
+BOOL LLTaskInvFVBridge::isItemMovable() const
+{
+ //LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ //if(object && (object->permModify() || gAgent.isGodlike()))
+ //{
+ // return TRUE;
+ //}
+ //return FALSE;
+ return TRUE;
+}
+
+BOOL LLTaskInvFVBridge::isItemRemovable() const
+{
+ const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object
+ && (object->permModify() || object->permYouOwner()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
+ if(option == 0 && object)
+ {
+ // yes
+ LLSD::array_const_iterator list_end = notification["payload"]["inventory_ids"].endArray();
+ for (LLSD::array_const_iterator list_it = notification["payload"]["inventory_ids"].beginArray();
+ list_it != list_end;
+ ++list_it)
+ {
+ object->removeInventory(list_it->asUUID());
+ }
+
+ // refresh the UI.
+ panel->refresh();
+ }
+ return false;
+}
+
+// helper for remove
+// ! REFACTOR ! two_uuids_list_t is also defined in llinventorybridge.h, but differently.
+typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t;
+typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t;
+BOOL LLTaskInvFVBridge::removeItem()
+{
+ if(isItemRemovable() && mPanel)
+ {
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ if(object->permModify())
+ {
+ // just do it.
+ object->removeInventory(mUUID);
+ return TRUE;
+ }
+ else
+ {
+ LLSD payload;
+ payload["task_id"] = mPanel->getTaskUUID();
+ payload["inventory_ids"].append(mUUID);
+ LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+ return FALSE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
+{
+ if (!mPanel)
+ {
+ return;
+ }
+
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if (!object)
+ {
+ return;
+ }
+
+ if (!object->permModify())
+ {
+ LLSD payload;
+ payload["task_id"] = mPanel->getTaskUUID();
+ for (S32 i = 0; i < (S32)batch.size(); i++)
+ {
+ LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];
+ payload["inventory_ids"].append(itemp->getUUID());
+ }
+ LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+
+ }
+ else
+ {
+ for (S32 i = 0; i < (S32)batch.size(); i++)
+ {
+ LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];
+
+ if(itemp->isItemRemovable())
+ {
+ // just do it.
+ object->removeInventory(itemp->getUUID());
+ }
+ }
+ }
+}
+
+void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener)
+{
+}
+
+BOOL LLTaskInvFVBridge::isItemCopyable() const
+{
+ LLInventoryItem* item = findItem();
+ if(!item) return FALSE;
+ return gAgent.allowOperation(PERM_COPY, item->getPermissions(),
+ GP_OBJECT_MANIPULATE);
+}
+
+BOOL LLTaskInvFVBridge::copyToClipboard() const
+{
+ return FALSE;
+}
+
+void LLTaskInvFVBridge::cutToClipboard()
+{
+}
+
+BOOL LLTaskInvFVBridge::isClipboardPasteable() const
+{
+ return FALSE;
+}
+
+void LLTaskInvFVBridge::pasteFromClipboard()
+{
+}
+
+void LLTaskInvFVBridge::pasteLinkFromClipboard()
+{
+}
+
+BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
+{
+ //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
+ if(mPanel)
+ {
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ LLInventoryItem* inv = NULL;
+ if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
+ {
+ const LLPermissions& perm = inv->getPermissions();
+ bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
+ GP_OBJECT_MANIPULATE);
+ if (object->isAttachment() && !can_copy)
+ {
+ //RN: no copy contents of attachments cannot be dragged out
+ // due to a race condition and possible exploit where
+ // attached objects do not update their inventory items
+ // when their contents are manipulated
+ return FALSE;
+ }
+ if((can_copy && perm.allowTransferTo(gAgent.getID()))
+ || object->permYouOwner())
+// || gAgent.isGodlike())
+
+ {
+ *type = LLViewerAssetType::lookupDragAndDropType(inv->getType());
+
+ *id = inv->getUUID();
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data)
+{
+ //llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl;
+ return FALSE;
+}
+
+// virtual
+void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+ if (action == "task_buy")
+ {
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ if (price > 0 && price > gStatusBar->getBalance())
+ {
+ LLFloaterBuyCurrency::buyCurrency("This costs", price);
+ }
+ else
+ {
+ buyItem();
+ }
+ }
+ }
+ else if (action == "task_open")
+ {
+ openItem();
+ }
+ else if (action == "task_properties")
+ {
+ showProperties();
+ }
+}
+
+void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LLInventoryItem* item = findItem();
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if (!item)
+ {
+ hide_context_entries(menu, items, disabled_items);
+ return;
+ }
+
+ if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(),
+ GP_OBJECT_MANIPULATE)
+ && item->getSaleInfo().isForSale())
+ {
+ items.push_back(std::string("Task Buy"));
+
+ std::string label= LLTrans::getString("Buy");
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ std::ostringstream info;
+ info << LLTrans::getString("BuyforL$") << price;
+ label.assign(info.str());
+ }
+
+ const LLView::child_list_t *list = menu.getChildList();
+ LLView::child_list_t::const_iterator itor;
+ for (itor = list->begin(); itor != list->end(); ++itor)
+ {
+ std::string name = (*itor)->getName();
+ LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+ if (name == "Task Buy" && menu_itemp)
+ {
+ menu_itemp->setLabel(label);
+ }
+ }
+ }
+ else
+ {
+ items.push_back(std::string("Task Open"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Task Open"));
+ }
+ }
+ items.push_back(std::string("Task Properties"));
+ if(isItemRenameable())
+ {
+ items.push_back(std::string("Task Rename"));
+ }
+ if(isItemRemovable())
+ {
+ items.push_back(std::string("Task Remove"));
+ }
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskFolderBridge
+///----------------------------------------------------------------------------
+
+class LLTaskCategoryBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskCategoryBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual const std::string& getDisplayName() const { return getName(); }
+ virtual BOOL isItemRenameable() const;
+ // virtual BOOL isItemCopyable() const { return FALSE; }
+ virtual BOOL renameItem(const std::string& new_name);
+ virtual BOOL isItemRemovable() const;
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ virtual BOOL hasChildren() const;
+ virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
+ virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data);
+};
+
+LLTaskCategoryBridge::LLTaskCategoryBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskCategoryBridge::getIcon() const
+{
+ return LLUI::getUIImage("Inv_FolderClosed");
+}
+
+BOOL LLTaskCategoryBridge::isItemRenameable() const
+{
+ return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name)
+{
+ return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::isItemRemovable() const
+{
+ return FALSE;
+}
+
+void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+ items.push_back(std::string("Task Open"));
+ hide_context_entries(menu, items, disabled_items);
+}
+
+BOOL LLTaskCategoryBridge::hasChildren() const
+{
+ // return TRUE if we have or do know know if we have children.
+ // *FIX: For now, return FALSE - we will know for sure soon enough.
+ return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
+{
+ //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
+ if(mPanel)
+ {
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ LLInventoryItem* inv = NULL;
+ if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
+ {
+ const LLPermissions& perm = inv->getPermissions();
+ bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
+ GP_OBJECT_MANIPULATE);
+ if((can_copy && perm.allowTransferTo(gAgent.getID()))
+ || object->permYouOwner())
+// || gAgent.isGodlike())
+
+ {
+ *type = LLViewerAssetType::lookupDragAndDropType(inv->getType());
+
+ *id = inv->getUUID();
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data)
+{
+ //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl;
+ BOOL accept = FALSE;
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(object)
+ {
+ switch(cargo_type)
+ {
+ case DAD_CATEGORY:
+ accept = LLToolDragAndDrop::getInstance()->dadUpdateInventoryCategory(object,drop);
+ break;
+ case DAD_TEXTURE:
+ case DAD_SOUND:
+ case DAD_LANDMARK:
+ case DAD_OBJECT:
+ case DAD_NOTECARD:
+ case DAD_CLOTHING:
+ case DAD_BODYPART:
+ case DAD_ANIMATION:
+ case DAD_GESTURE:
+ case DAD_CALLINGCARD:
+ accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
+ if(accept && drop)
+ {
+ LLToolDragAndDrop::dropInventory(object,
+ (LLViewerInventoryItem*)cargo_data,
+ LLToolDragAndDrop::getInstance()->getSource(),
+ LLToolDragAndDrop::getInstance()->getSourceID());
+ }
+ break;
+ case DAD_SCRIPT:
+ // *HACK: In order to resolve SL-22177, we need to block
+ // drags from notecards and objects onto other
+ // objects. uncomment the simpler version when we have
+ // that right.
+ //accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
+ if(LLToolDragAndDrop::isInventoryDropAcceptable(
+ object, (LLViewerInventoryItem*)cargo_data)
+ && (LLToolDragAndDrop::SOURCE_WORLD != LLToolDragAndDrop::getInstance()->getSource())
+ && (LLToolDragAndDrop::SOURCE_NOTECARD != LLToolDragAndDrop::getInstance()->getSource()))
+ {
+ accept = TRUE;
+ }
+ if(accept && drop)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)cargo_data;
+ // rez in the script active by default, rez in
+ // inactive if the control key is being held down.
+ BOOL active = ((mask & MASK_CONTROL) == 0);
+ LLToolDragAndDrop::dropScript(object, item, active,
+ LLToolDragAndDrop::getInstance()->getSource(),
+ LLToolDragAndDrop::getInstance()->getSourceID());
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return accept;
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskTextureBridge
+///----------------------------------------------------------------------------
+
+class LLTaskTextureBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskTextureBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ LLInventoryType::EType it);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+protected:
+ LLInventoryType::EType mInventoryType;
+};
+
+LLTaskTextureBridge::LLTaskTextureBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ LLInventoryType::EType it) :
+ LLTaskInvFVBridge(panel, uuid, name),
+ mInventoryType(it)
+{
+}
+
+LLUIImagePtr LLTaskTextureBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE);
+}
+
+void LLTaskTextureBridge::openItem()
+{
+ llinfos << "LLTaskTextureBridge::openItem()" << llendl;
+ LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+ if(preview)
+ {
+ preview->setObjectID(mPanel->getTaskUUID());
+ }
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskSoundBridge
+///----------------------------------------------------------------------------
+
+class LLTaskSoundBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskSoundBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+ static void openSoundPreview(void* data);
+};
+
+LLTaskSoundBridge::LLTaskSoundBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskSoundBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
+}
+
+void LLTaskSoundBridge::openItem()
+{
+ openSoundPreview((void*)this);
+}
+
+void LLTaskSoundBridge::openSoundPreview(void* data)
+{
+ LLTaskSoundBridge* self = (LLTaskSoundBridge*)data;
+ if(!self)
+ return;
+
+ LLPreviewSound* preview = LLFloaterReg::showTypedInstance<LLPreviewSound>("preview_sound", LLSD(self->mUUID), TAKE_FOCUS_YES);
+ if (preview)
+ {
+ preview->setObjectID(self->mPanel->getTaskUUID());
+ }
+}
+
+// virtual
+void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+ if (action == "task_play")
+ {
+ LLInventoryItem* item = findItem();
+ if(item)
+ {
+ send_sound_trigger(item->getAssetUUID(), 1.0);
+ }
+ }
+ LLTaskInvFVBridge::performAction(folder, model, action);
+}
+
+void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LLInventoryItem* item = findItem();
+ if(!item) return;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(item->getPermissions().getOwner() != gAgent.getID()
+ && item->getSaleInfo().isForSale())
+ {
+ items.push_back(std::string("Task Buy"));
+
+ std::string label= LLTrans::getString("Buy");
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ std::ostringstream info;
+ info << LLTrans::getString("BuyforL$") << price;
+ label.assign(info.str());
+ }
+
+ const LLView::child_list_t *list = menu.getChildList();
+ LLView::child_list_t::const_iterator itor;
+ for (itor = list->begin(); itor != list->end(); ++itor)
+ {
+ std::string name = (*itor)->getName();
+ LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+ if (name == "Task Buy" && menu_itemp)
+ {
+ menu_itemp->setLabel(label);
+ }
+ }
+ }
+ else
+ {
+ items.push_back(std::string("Task Open"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Task Open"));
+ }
+ }
+ items.push_back(std::string("Task Properties"));
+ if(isItemRenameable())
+ {
+ items.push_back(std::string("Task Rename"));
+ }
+ if(isItemRemovable())
+ {
+ items.push_back(std::string("Task Remove"));
+ }
+
+ items.push_back(std::string("Task Play"));
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskLandmarkBridge
+///----------------------------------------------------------------------------
+
+class LLTaskLandmarkBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskLandmarkBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+};
+
+LLTaskLandmarkBridge::LLTaskLandmarkBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskLandmarkBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE);
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskCallingCardBridge
+///----------------------------------------------------------------------------
+
+class LLTaskCallingCardBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskCallingCardBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual BOOL isItemRenameable() const;
+ virtual BOOL renameItem(const std::string& new_name);
+};
+
+LLTaskCallingCardBridge::LLTaskCallingCardBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskCallingCardBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE);
+}
+
+BOOL LLTaskCallingCardBridge::isItemRenameable() const
+{
+ return FALSE;
+}
+
+BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name)
+{
+ return FALSE;
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskScriptBridge
+///----------------------------------------------------------------------------
+
+class LLTaskScriptBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskScriptBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ //static BOOL enableIfCopyable( void* userdata );
+};
+
+LLTaskScriptBridge::LLTaskScriptBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskScriptBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
+}
+
+
+class LLTaskLSLBridge : public LLTaskScriptBridge
+{
+public:
+ LLTaskLSLBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual void openItem();
+ virtual BOOL removeItem();
+ //virtual void buildContextMenu(LLMenuGL& menu);
+
+ //static void copyToInventory(void* userdata);
+};
+
+LLTaskLSLBridge::LLTaskLSLBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskScriptBridge(panel, uuid, name)
+{
+}
+
+void LLTaskLSLBridge::openItem()
+{
+ llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl;
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(!object || object->isInventoryPending())
+ {
+ return;
+ }
+ if (object->permModify() || gAgent.isGodlike())
+ {
+ LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
+ if (preview)
+ {
+ preview->setObjectID(mPanel->getTaskUUID());
+ }
+ }
+ else
+ {
+ LLNotificationsUtil::add("CannotOpenScriptObjectNoMod");
+ }
+}
+
+BOOL LLTaskLSLBridge::removeItem()
+{
+ LLFloaterReg::hideInstance("preview_scriptedit", LLSD(mUUID));
+ return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskObjectBridge
+///----------------------------------------------------------------------------
+
+class LLTaskObjectBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskObjectBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+};
+
+LLTaskObjectBridge::LLTaskObjectBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskObjectBridge::getIcon() const
+{
+ BOOL item_is_multi = FALSE;
+ if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
+ {
+ item_is_multi = TRUE;
+ }
+
+ return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskNotecardBridge
+///----------------------------------------------------------------------------
+
+class LLTaskNotecardBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskNotecardBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual BOOL removeItem();
+};
+
+LLTaskNotecardBridge::LLTaskNotecardBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskNotecardBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
+}
+
+void LLTaskNotecardBridge::openItem()
+{
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(!object || object->isInventoryPending())
+ {
+ return;
+ }
+ if(object->permModify() || gAgent.isGodlike())
+ {
+ LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES);
+ if (preview)
+ {
+ preview->setObjectID(mPanel->getTaskUUID());
+ }
+ }
+}
+
+BOOL LLTaskNotecardBridge::removeItem()
+{
+ LLFloaterReg::hideInstance("preview_notecard", LLSD(mUUID));
+ return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskGestureBridge
+///----------------------------------------------------------------------------
+
+class LLTaskGestureBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskGestureBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual BOOL removeItem();
+};
+
+LLTaskGestureBridge::LLTaskGestureBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskGestureBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
+}
+
+void LLTaskGestureBridge::openItem()
+{
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(!object || object->isInventoryPending())
+ {
+ return;
+ }
+ LLPreviewGesture::show(mUUID, mPanel->getTaskUUID());
+}
+
+BOOL LLTaskGestureBridge::removeItem()
+{
+ // Don't need to deactivate gesture because gestures inside objects can never be active.
+ LLFloaterReg::hideInstance("preview_gesture", LLSD(mUUID));
+ return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskAnimationBridge
+///----------------------------------------------------------------------------
+
+class LLTaskAnimationBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskAnimationBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual BOOL removeItem();
+};
+
+LLTaskAnimationBridge::LLTaskAnimationBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskAnimationBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
+}
+
+void LLTaskAnimationBridge::openItem()
+{
+ LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+ if(!object || object->isInventoryPending())
+ {
+ return;
+ }
+
+ LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+ if (preview && (object->permModify() || gAgent.isGodlike()))
+ {
+ preview->setObjectID(mPanel->getTaskUUID());
+ }
+}
+
+BOOL LLTaskAnimationBridge::removeItem()
+{
+ LLFloaterReg::hideInstance("preview_anim", LLSD(mUUID));
+ return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskWearableBridge
+///----------------------------------------------------------------------------
+
+class LLTaskWearableBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskWearableBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ LLAssetType::EType asset_type,
+ U32 flags);
+
+ virtual LLUIImagePtr getIcon() const;
+
+protected:
+ LLAssetType::EType mAssetType;
+};
+
+LLTaskWearableBridge::LLTaskWearableBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ LLAssetType::EType asset_type,
+ U32 flags) :
+ LLTaskInvFVBridge(panel, uuid, name, flags),
+ mAssetType( asset_type )
+{
+}
+
+LLUIImagePtr LLTaskWearableBridge::getIcon() const
+{
+ return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE );
+}
+
+
+///----------------------------------------------------------------------------
+/// LLTaskInvFVBridge impl
+//----------------------------------------------------------------------------
+
+LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* panel,
+ LLInventoryObject* object)
+{
+ LLTaskInvFVBridge* new_bridge = NULL;
+ LLAssetType::EType type = object->getType();
+ LLInventoryItem* item = NULL;
+ switch(type)
+ {
+ case LLAssetType::AT_TEXTURE:
+ item = (LLInventoryItem*)object;
+ new_bridge = new LLTaskTextureBridge(panel,
+ object->getUUID(),
+ object->getName(),
+ item->getInventoryType());
+ break;
+ case LLAssetType::AT_SOUND:
+ new_bridge = new LLTaskSoundBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_LANDMARK:
+ new_bridge = new LLTaskLandmarkBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_CALLINGCARD:
+ new_bridge = new LLTaskCallingCardBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_SCRIPT:
+ // OLD SCRIPTS DEPRECATED - JC
+ llwarns << "Old script" << llendl;
+ //new_bridge = new LLTaskOldScriptBridge(panel,
+ // object->getUUID(),
+ // object->getName());
+ break;
+ case LLAssetType::AT_OBJECT:
+ new_bridge = new LLTaskObjectBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_NOTECARD:
+ new_bridge = new LLTaskNotecardBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_ANIMATION:
+ new_bridge = new LLTaskAnimationBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_GESTURE:
+ new_bridge = new LLTaskGestureBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_BODYPART:
+ item = (LLInventoryItem*)object;
+ new_bridge = new LLTaskWearableBridge(panel,
+ object->getUUID(),
+ object->getName(),
+ type,
+ item->getFlags());
+ break;
+ case LLAssetType::AT_CATEGORY:
+ new_bridge = new LLTaskCategoryBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+ case LLAssetType::AT_LSL_TEXT:
+ new_bridge = new LLTaskLSLBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
+
+ break;
+ default:
+ llinfos << "Unhandled inventory type (llassetstorage.h): "
+ << (S32)type << llendl;
+ break;
+ }
+ return new_bridge;
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLPanelObjectInventory
+///----------------------------------------------------------------------------
+
+static LLDefaultChildRegistry::Register<LLPanelObjectInventory> r("panel_inventory_object");
+
+void do_nothing()
+{
+}
+
+// Default constructor
+LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Params& p) :
+ LLPanel(p),
+ mScroller(NULL),
+ mFolders(NULL),
+ mHaveInventory(FALSE),
+ mIsInventoryEmpty(TRUE),
+ mInventoryNeedsUpdate(FALSE)
+{
+ // Setup context menu callbacks
+ mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
+ 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(&do_nothing));
+ mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
+ mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
+}
+
+// Destroys the object
+LLPanelObjectInventory::~LLPanelObjectInventory()
+{
+ if (!gIdleCallbacks.deleteFunction(idle, this))
+ {
+ llwarns << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << llendl;
+ }
+}
+
+BOOL LLPanelObjectInventory::postBuild()
+{
+ // clear contents and initialize menus, sets up mFolders
+ reset();
+
+ // Register an idle update callback
+ gIdleCallbacks.addFunction(idle, this);
+
+ return TRUE;
+}
+
+void LLPanelObjectInventory::doToSelected(const LLSD& userdata)
+{
+ mFolders->doToSelected(&gInventory, userdata);
+}
+
+void LLPanelObjectInventory::clearContents()
+{
+ mHaveInventory = FALSE;
+ mIsInventoryEmpty = TRUE;
+ if (LLToolDragAndDrop::getInstance() && LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_WORLD)
+ {
+ LLToolDragAndDrop::getInstance()->endDrag();
+ }
+
+ if( mScroller )
+ {
+ // removes mFolders
+ removeChild( mScroller ); //*TODO: Really shouldn't do this during draw()/refresh()
+ mScroller->die();
+ mScroller = NULL;
+ mFolders = NULL;
+ }
+}
+
+
+void LLPanelObjectInventory::reset()
+{
+ clearContents();
+
+ //setBorderVisible(FALSE);
+
+ mCommitCallbackRegistrar.pushScope(); // push local callbacks
+
+ LLRect dummy_rect(0, 1, 1, 0);
+ LLFolderView::Params p;
+ p.name = "task inventory";
+ p.task_id = getTaskUUID();
+ p.parent_panel = this;
+ p.tool_tip= p.name;
+ mFolders = LLUICtrlFactory::create<LLFolderView>(p);
+ // this ensures that we never say "searching..." or "no items found"
+ mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+ if (hasFocus())
+ {
+ LLEditMenuHandler::gEditMenuHandler = mFolders;
+ }
+
+ LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
+ LLScrollContainer::Params scroll_p;
+ scroll_p.name("task inventory scroller");
+ scroll_p.rect(scroller_rect);
+ scroll_p.tab_stop(true);
+ scroll_p.follows.flags(FOLLOWS_ALL);
+ mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p);
+ addChild(mScroller);
+ mScroller->addChild(mFolders);
+
+ mFolders->setScrollContainer( mScroller );
+
+ mCommitCallbackRegistrar.popScope();
+}
+
+void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
+ InventoryObjectList* inventory,
+ S32 serial_num,
+ void* data)
+{
+ if(!object) return;
+
+ //llinfos << "invetnory arrived: \n"
+ // << " panel UUID: " << panel->mTaskUUID << "\n"
+ // << " task UUID: " << object->mID << llendl;
+ if(mTaskUUID == object->mID)
+ {
+ mInventoryNeedsUpdate = TRUE;
+ }
+
+ // refresh any properties floaters that are hanging around.
+ if(inventory)
+ {
+ for (InventoryObjectList::const_iterator iter = inventory->begin();
+ iter != inventory->end(); )
+ {
+ LLInventoryObject* item = *iter++;
+ LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID());
+ if(floater)
+ {
+ floater->refresh();
+ }
+ }
+ }
+}
+
+void LLPanelObjectInventory::updateInventory()
+{
+ //llinfos << "inventory arrived: \n"
+ // << " panel UUID: " << panel->mTaskUUID << "\n"
+ // << " task UUID: " << object->mID << llendl;
+ // We're still interested in this task's inventory.
+ std::set<LLUUID> selected_items;
+ BOOL inventory_has_focus = FALSE;
+ if (mHaveInventory && mFolders->getNumSelectedDescendants())
+ {
+ mFolders->getSelectionList(selected_items);
+ inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
+ }
+
+ reset();
+
+ LLViewerObject* objectp = gObjectList.findObject(mTaskUUID);
+ if (objectp)
+ {
+ LLInventoryObject* inventory_root = objectp->getInventoryRoot();
+ InventoryObjectList contents;
+ objectp->getInventoryContents(contents);
+ if (inventory_root)
+ {
+ createFolderViews(inventory_root, contents);
+ mHaveInventory = TRUE;
+ mIsInventoryEmpty = FALSE;
+ mFolders->setEnabled(TRUE);
+ }
+ else
+ {
+ // TODO: create an empty inventory
+ mIsInventoryEmpty = TRUE;
+ mHaveInventory = TRUE;
+ }
+ }
+ else
+ {
+ // TODO: create an empty inventory
+ mIsInventoryEmpty = TRUE;
+ mHaveInventory = TRUE;
+ }
+
+ // restore previous selection
+ std::set<LLUUID>::iterator selection_it;
+ BOOL first_item = TRUE;
+ for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it)
+ {
+ LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it);
+ if (selected_item)
+ {
+ //HACK: "set" first item then "change" each other one to get keyboard focus right
+ if (first_item)
+ {
+ mFolders->setSelection(selected_item, TRUE, inventory_has_focus);
+ first_item = FALSE;
+ }
+ else
+ {
+ mFolders->changeSelection(selected_item, TRUE);
+ }
+ }
+ }
+
+ mFolders->requestArrange();
+ mInventoryNeedsUpdate = FALSE;
+ // Edit menu handler is set in onFocusReceived
+}
+
+// *FIX: This is currently a very expensive operation, because we have
+// to iterate through the inventory one time for each category. This
+// leads to an N^2 based on the category count. This could be greatly
+// speeded with an efficient multimap implementation, but we don't
+// have that in our current arsenal.
+void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents)
+{
+ if (!inventory_root)
+ {
+ return;
+ }
+ // Create a visible root category.
+ LLTaskInvFVBridge* bridge = NULL;
+ bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root);
+ if(bridge)
+ {
+ LLFolderViewFolder* new_folder = NULL;
+ LLFolderViewFolder::Params p;
+ p.name = inventory_root->getName();
+ p.icon = LLUI::getUIImage("Inv_FolderClosed");
+ p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
+ p.root = mFolders;
+ p.listener = bridge;
+ p.tool_tip = p.name;
+ new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+ new_folder->addToFolder(mFolders, mFolders);
+ new_folder->toggleOpen();
+
+ createViewsForCategory(&contents, inventory_root, new_folder);
+ }
+}
+
+typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair;
+
+void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory,
+ LLInventoryObject* parent,
+ LLFolderViewFolder* folder)
+{
+ // Find all in the first pass
+ LLDynamicArray<obj_folder_pair*> child_categories;
+ LLTaskInvFVBridge* bridge;
+ LLFolderViewItem* view;
+
+ InventoryObjectList::iterator it = inventory->begin();
+ InventoryObjectList::iterator end = inventory->end();
+ for( ; it != end; ++it)
+ {
+ LLInventoryObject* obj = *it;
+
+ if(parent->getUUID() == obj->getParentUUID())
+ {
+ bridge = LLTaskInvFVBridge::createObjectBridge(this, obj);
+ if(!bridge)
+ {
+ continue;
+ }
+ if(LLAssetType::AT_CATEGORY == obj->getType())
+ {
+ LLFolderViewFolder::Params p;
+ p.name = obj->getName();
+ p.icon = LLUI::getUIImage("Inv_FolderClosed");
+ p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
+ p.root = mFolders;
+ p.listener = bridge;
+ p.tool_tip = p.name;
+ view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+ child_categories.put(new obj_folder_pair(obj,
+ (LLFolderViewFolder*)view));
+ }
+ else
+ {
+ LLFolderViewItem::Params params;
+ params.name(obj->getName());
+ params.icon(bridge->getIcon());
+ params.creation_date(bridge->getCreationDate());
+ params.root(mFolders);
+ params.listener(bridge);
+ params.rect(LLRect());
+ params.tool_tip = params.name;
+ view = LLUICtrlFactory::create<LLFolderViewItem> (params);
+ }
+ view->addToFolder(folder, mFolders);
+ }
+ }
+
+ // now, for each category, do the second pass
+ for(S32 i = 0; i < child_categories.count(); i++)
+ {
+ createViewsForCategory(inventory, child_categories[i]->first,
+ child_categories[i]->second );
+ delete child_categories[i];
+ }
+}
+
+void LLPanelObjectInventory::refresh()
+{
+ //llinfos << "LLPanelObjectInventory::refresh()" << llendl;
+ BOOL has_inventory = FALSE;
+ const BOOL non_root_ok = TRUE;
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok);
+ if(node)
+ {
+ LLViewerObject* object = node->getObject();
+ if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
+ || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)))
+ {
+ // determine if we need to make a request. Start with a
+ // default based on if we have inventory at all.
+ BOOL make_request = !mHaveInventory;
+
+ // If the task id is different than what we've stored,
+ // then make the request.
+ if(mTaskUUID != object->mID)
+ {
+ mTaskUUID = object->mID;
+ make_request = TRUE;
+
+ // This is a new object so pre-emptively clear the contents
+ // Otherwise we show the old stuff until the update comes in
+ clearContents();
+
+ // Register for updates from this object,
+ registerVOInventoryListener(object,NULL);
+ }
+
+ // Based on the node information, we may need to dirty the
+ // object inventory and get it again.
+ if(node->mValid)
+ {
+ if(node->mInventorySerial != object->getInventorySerial() || object->isInventoryDirty())
+ {
+ make_request = TRUE;
+ }
+ }
+
+ // do the request if necessary.
+ if(make_request)
+ {
+ requestVOInventory();
+ }
+ has_inventory = TRUE;
+ }
+ }
+ if(!has_inventory)
+ {
+ mTaskUUID = LLUUID::null;
+ removeVOInventoryListener();
+ clearContents();
+ }
+ //llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl;
+}
+
+void LLPanelObjectInventory::removeSelectedItem()
+{
+ if(mFolders)
+ {
+ mFolders->removeSelectedItems();
+ }
+}
+
+void LLPanelObjectInventory::startRenamingSelectedItem()
+{
+ if(mFolders)
+ {
+ mFolders->startRenamingSelectedItem();
+ }
+}
+
+void LLPanelObjectInventory::draw()
+{
+ LLPanel::draw();
+
+ if(mIsInventoryEmpty)
+ {
+ if((LLUUID::null != mTaskUUID) && (!mHaveInventory))
+ {
+ LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("LoadingContents"), 0,
+ (S32)(getRect().getWidth() * 0.5f),
+ 10,
+ LLColor4( 1, 1, 1, 1 ),
+ LLFontGL::HCENTER,
+ LLFontGL::BOTTOM);
+ }
+ else if(mHaveInventory)
+ {
+ LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("NoContents"), 0,
+ (S32)(getRect().getWidth() * 0.5f),
+ 10,
+ LLColor4( 1, 1, 1, 1 ),
+ LLFontGL::HCENTER,
+ LLFontGL::BOTTOM);
+ }
+ }
+}
+
+void LLPanelObjectInventory::deleteAllChildren()
+{
+ mScroller = NULL;
+ mFolders = NULL;
+ LLView::deleteAllChildren();
+}
+
+BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
+{
+ if (mFolders && mHaveInventory)
+ {
+ LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL);
+ if (!folderp)
+ {
+ return FALSE;
+ }
+ // Try to pass on unmodified mouse coordinates
+ S32 local_x = x - mFolders->getRect().mLeft;
+ S32 local_y = y - mFolders->getRect().mBottom;
+
+ if (mFolders->pointInView(local_x, local_y))
+ {
+ return mFolders->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+ else
+ {
+ //force mouse coordinates to be inside folder rectangle
+ return mFolders->handleDragAndDrop(5, 1, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+//static
+void LLPanelObjectInventory::idle(void* user_data)
+{
+ LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data;
+
+
+ if (self->mInventoryNeedsUpdate)
+ {
+ self->updateInventory();
+ }
+}
+
+void LLPanelObjectInventory::onFocusLost()
+{
+ // inventory no longer handles cut/copy/paste/delete
+ if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+
+ LLPanel::onFocusLost();
+}
+
+void LLPanelObjectInventory::onFocusReceived()
+{
+ // inventory now handles cut/copy/paste/delete
+ LLEditMenuHandler::gEditMenuHandler = mFolders;
+
+ LLPanel::onFocusReceived();
+}
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
new file mode 100644
index 0000000000..bc339ece35
--- /dev/null
+++ b/indra/newview/llpanelobjectinventory.h
@@ -0,0 +1,105 @@
+/**
+ * @file llpanelobjectinventory.h
+ * @brief LLPanelObjectInventory class definition
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOBJECTINVENTORY_H
+#define LL_LLPANELOBJECTINVENTORY_H
+
+#include "llvoinventorylistener.h"
+#include "llpanel.h"
+
+#include "llinventory.h"
+
+class LLScrollContainer;
+class LLFolderView;
+class LLFolderViewFolder;
+class LLViewerObject;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelObjectInventory
+//
+// This class represents the panel used to view and control a
+// particular task's inventory.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
+{
+public:
+ // dummy param block for template registration purposes
+ struct Params : public LLPanel::Params {};
+
+ LLPanelObjectInventory(const Params&);
+ virtual ~LLPanelObjectInventory();
+
+ virtual BOOL postBuild();
+
+ void doToSelected(const LLSD& userdata);
+
+ void refresh();
+ const LLUUID& getTaskUUID() { return mTaskUUID;}
+ void removeSelectedItem();
+ void startRenamingSelectedItem();
+
+ LLFolderView* getRootFolder() const { return mFolders; }
+
+ virtual void draw();
+ virtual void deleteAllChildren();
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
+
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
+ static void idle(void* user_data);
+
+protected:
+ void reset();
+ /*virtual*/ void inventoryChanged(LLViewerObject* object,
+ InventoryObjectList* inventory,
+ S32 serial_num,
+ void* user_data);
+ void updateInventory();
+ void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents);
+ void createViewsForCategory(InventoryObjectList* inventory,
+ LLInventoryObject* parent,
+ LLFolderViewFolder* folder);
+ void clearContents();
+
+private:
+ LLScrollContainer* mScroller;
+ LLFolderView* mFolders;
+
+ LLUUID mTaskUUID;
+ BOOL mHaveInventory;
+ BOOL mIsInventoryEmpty;
+ BOOL mInventoryNeedsUpdate;
+};
+
+#endif // LL_LLPANELOBJECTINVENTORY_H
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
new file mode 100644
index 0000000000..c2f2d32142
--- /dev/null
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -0,0 +1,654 @@
+/**
+ * @file llpaneloutfitsinventory.cpp
+ * @brief Outfits inventory panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneloutfitsinventory.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llfloaterinventory.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "lllandmark.h"
+#include "lllineeditor.h"
+#include "llmodaldialog.h"
+#include "llsidepanelappearance.h"
+#include "llsidetray.h"
+#include "lltabcontainer.h"
+#include "llviewerfoldertype.h"
+#include "llviewerjointattachment.h"
+#include "llvoavatarself.h"
+
+// List Commands
+#include "lldndbutton.h"
+#include "llmenugl.h"
+#include "llviewermenu.h"
+
+#include "llviewercontrol.h"
+
+static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
+static const std::string COF_TAB_NAME = "cof_tab";
+
+static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
+bool LLPanelOutfitsInventory::sShowDebugEditor = false;
+
+class LLOutfitSaveAsDialog : public LLModalDialog
+{
+private:
+ std::string mItemName;
+ std::string mTempItemName;
+
+ boost::signals2::signal<void (const std::string&)> mSaveAsSignal;
+
+public:
+ LLOutfitSaveAsDialog( const LLSD& key )
+ : LLModalDialog( key ),
+ mTempItemName(key.asString())
+ {
+ }
+
+ BOOL postBuild()
+ {
+ getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onSave, this ));
+ getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onCancel, this ));
+
+ childSetTextArg("name ed", "[DESC]", mTempItemName);
+ return TRUE;
+ }
+
+ void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb )
+ {
+ mSaveAsSignal.connect(cb);
+ }
+
+ virtual void onOpen(const LLSD& key)
+ {
+ LLLineEditor* edit = getChild<LLLineEditor>("name ed");
+ if (edit)
+ {
+ edit->setFocus(TRUE);
+ edit->selectAll();
+ }
+ }
+
+ void onSave()
+ {
+ mItemName = childGetValue("name ed").asString();
+ LLStringUtil::trim(mItemName);
+ if( !mItemName.empty() )
+ {
+ mSaveAsSignal(mItemName);
+ closeFloater(); // destroys this object
+ }
+ }
+
+ void onCancel()
+ {
+ closeFloater(); // destroys this object
+ }
+};
+
+LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
+ mActivePanel(NULL),
+ mParent(NULL)
+{
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+
+ static bool registered_dialog = false;
+ if (!registered_dialog)
+ {
+ LLFloaterReg::add("outfit_save_as", "floater_outfit_save_as.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutfitSaveAsDialog>);
+ registered_dialog = true;
+ }
+}
+
+LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
+{
+ delete mSavedFolderState;
+}
+
+// virtual
+BOOL LLPanelOutfitsInventory::postBuild()
+{
+ sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");
+ initTabPanels();
+ initListCommandsHandlers();
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelOutfitsInventory::onOpen(const LLSD& key)
+{
+ // Make sure we know which tab is selected, update the filter,
+ // and update verbs.
+ onTabChange();
+
+ // Auto open the first outfit newly created so new users can see sample outfit contents
+ static bool should_open_outfit = true;
+ if (should_open_outfit && gAgent.isFirstLogin())
+ {
+ LLInventoryPanel* outfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
+ if (outfits_panel)
+ {
+ LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLFolderViewFolder* my_outfits_folder = outfits_panel->getRootFolder()->getFolderByID(my_outfits_id);
+ if (my_outfits_folder)
+ {
+ LLFolderViewFolder* first_outfit = dynamic_cast<LLFolderViewFolder*>(my_outfits_folder->getFirstChild());
+ if (first_outfit)
+ {
+ first_outfit->setOpen(TRUE);
+ }
+ }
+ }
+ }
+ should_open_outfit = false;
+}
+
+void LLPanelOutfitsInventory::updateVerbs()
+{
+ if (mParent)
+ {
+ mParent->updateVerbs();
+ }
+
+ if (mListCommands)
+ {
+ mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
+ updateListCommands();
+ }
+}
+
+void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
+{
+ mParent = parent;
+}
+
+// virtual
+void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
+{
+ mFilterSubString = string;
+ if (string == "")
+ {
+ mActivePanel->setFilterSubString(LLStringUtil::null);
+
+ // re-open folders that were initially open
+ mSavedFolderState->setApply(TRUE);
+ getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ getRootFolder()->applyFunctorRecursively(opener);
+ getRootFolder()->scrollToShowSelection();
+ }
+
+ gInventory.startBackgroundFetch();
+
+ if (mActivePanel->getFilterSubString().empty() && string.empty())
+ {
+ // current filter and new filter empty, do nothing
+ return;
+ }
+
+ // save current folder open state if no filter currently applied
+ if (getRootFolder()->getFilterSubString().empty())
+ {
+ mSavedFolderState->setApply(FALSE);
+ getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ }
+
+ // set new filter string
+ mActivePanel->setFilterSubString(string);
+}
+
+void LLPanelOutfitsInventory::onWearButtonClick()
+{
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, NULL,"replaceoutfit");
+ }
+}
+
+void LLPanelOutfitsInventory::onAdd()
+{
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, NULL,"addtooutfit");
+ }
+}
+
+void LLPanelOutfitsInventory::onRemove()
+{
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, NULL,"removefromoutfit");
+ }
+}
+
+void LLPanelOutfitsInventory::onEdit()
+{
+}
+
+void LLPanelOutfitsInventory::onSave()
+{
+ std::string outfit_name;
+
+ if (!LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))
+ {
+ outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
+ }
+
+ LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE);
+ if (save_as_dialog)
+ {
+ save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 ));
+ }
+}
+
+void LLPanelOutfitsInventory::onSaveCommit(const std::string& outfit_name)
+{
+ LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+
+ if (mAppearanceTabs)
+ {
+ mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME);
+ }
+}
+
+void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+ updateVerbs();
+ if (getRootFolder()->needsAutoRename() && items.size())
+ {
+ getRootFolder()->startRenamingSelectedItem();
+ getRootFolder()->setNeedsAutoRename(FALSE);
+ }
+}
+
+void LLPanelOutfitsInventory::onSelectorButtonClicked()
+{
+ LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
+
+ LLFolderViewEventListener* listenerp = cur_item->getListener();
+ if (getIsCorrectType(listenerp))
+ {
+ LLSD key;
+ key["type"] = "look";
+ key["id"] = listenerp->getUUID();
+
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
+ }
+}
+
+LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
+{
+ LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ return NULL;
+
+ LLFolderViewEventListener* listenerp = current_item->getListener();
+ if (getIsCorrectType(listenerp))
+ {
+ return listenerp;
+ }
+ return NULL;
+}
+
+bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const
+{
+ if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY)
+ {
+ LLViewerInventoryCategory *cat = gInventory.getCategory(listenerp->getUUID());
+ if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+LLFolderView *LLPanelOutfitsInventory::getRootFolder()
+{
+ return mActivePanel->getRootFolder();
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands //
+
+void LLPanelOutfitsInventory::initListCommandsHandlers()
+{
+ mListCommands = getChild<LLPanel>("bottom_panel");
+
+ mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
+ mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
+ mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+ mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
+
+ mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this));
+
+ LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+ trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
+ , _4 // BOOL drop
+ , _5 // EDragAndDropType cargo_type
+ , _7 // EAcceptance* accept
+ ));
+
+ mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action",
+ boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable",
+ boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2));
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLPanelOutfitsInventory::updateListCommands()
+{
+ bool trash_enabled = isActionEnabled("delete");
+ bool wear_enabled = isActionEnabled("wear");
+ bool make_outfit_enabled = isActionEnabled("make_outfit");
+
+ mListCommands->childSetEnabled("trash_btn", trash_enabled);
+ mListCommands->childSetEnabled("wear_btn", wear_enabled);
+ mListCommands->childSetVisible("wear_btn", wear_enabled);
+ mListCommands->childSetEnabled("make_outfit_btn", make_outfit_enabled);
+}
+
+void LLPanelOutfitsInventory::onGearButtonClick()
+{
+ showActionMenu(mMenuGearDefault,"options_gear_btn");
+}
+
+void LLPanelOutfitsInventory::onAddButtonClick()
+{
+ onSave();
+}
+
+void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
+{
+ if (menu)
+ {
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ LLView* spawning_view = getChild<LLView> (spawning_view_name);
+ S32 menu_x, menu_y;
+ //show menu in co-ordinates of panel
+ spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
+ menu_y += menu->getRect().getHeight();
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+ }
+}
+
+void LLPanelOutfitsInventory::onTrashButtonClick()
+{
+ onClipboardAction("delete");
+}
+
+void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
+{
+ std::string command_name = userdata.asString();
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ updateListCommands();
+ updateVerbs();
+}
+
+void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ return;
+
+ const std::string command_name = userdata.asString();
+ if (command_name == "new")
+ {
+ onSave();
+ }
+ if (command_name == "edit")
+ {
+ onEdit();
+ }
+ if (command_name == "wear")
+ {
+ onWearButtonClick();
+ }
+ // Note: This option has been removed from the gear menu.
+ if (command_name == "add")
+ {
+ onAdd();
+ }
+ if (command_name == "remove")
+ {
+ onRemove();
+ }
+ if (command_name == "rename")
+ {
+ onClipboardAction("rename");
+ }
+ if (command_name == "remove_link")
+ {
+ onClipboardAction("delete");
+ }
+ if (command_name == "delete")
+ {
+ onClipboardAction("delete");
+ }
+ updateListCommands();
+ updateVerbs();
+}
+
+BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+ if (command_name == "delete" || command_name == "remove")
+ {
+ BOOL can_delete = FALSE;
+ LLFolderView *folder = getActivePanel()->getRootFolder();
+ if (folder)
+ {
+ std::set<LLUUID> selection_set;
+ folder->getSelectionList(selection_set);
+ can_delete = (selection_set.size() > 0);
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLFolderViewItem *item = folder->getItemByID(item_id);
+ can_delete &= item->getListener()->isItemRemovable();
+ }
+ return can_delete;
+ }
+ return FALSE;
+ }
+ if (command_name == "remove_link")
+ {
+ BOOL can_delete = FALSE;
+ LLFolderView *folder = getActivePanel()->getRootFolder();
+ if (folder)
+ {
+ std::set<LLUUID> selection_set;
+ folder->getSelectionList(selection_set);
+ can_delete = (selection_set.size() > 0);
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (!item || !item->getIsLinkType())
+ return FALSE;
+ }
+ return can_delete;
+ }
+ return FALSE;
+ }
+ if (command_name == "rename" ||
+ command_name == "delete_outfit")
+ {
+ return (getCorrectListenerForAction() != NULL) && hasItemsSelected();
+ }
+
+ if (command_name == "wear")
+ {
+ if (isCOFPanelActive())
+ {
+ return FALSE;
+ }
+ }
+ if (command_name == "make_outfit")
+ {
+ return TRUE;
+ }
+
+ if (command_name == "edit" ||
+ command_name == "add"
+ )
+ {
+ return (getCorrectListenerForAction() != NULL);
+ }
+ return TRUE;
+}
+
+bool LLPanelOutfitsInventory::hasItemsSelected()
+{
+ bool has_items_selected = false;
+ LLFolderView *folder = getActivePanel()->getRootFolder();
+ if (folder)
+ {
+ std::set<LLUUID> selection_set;
+ folder->getSelectionList(selection_set);
+ has_items_selected = (selection_set.size() > 0);
+ }
+ return has_items_selected;
+}
+
+bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+ *accept = ACCEPT_NO;
+
+ const bool is_enabled = isActionEnabled("delete");
+ if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+ if (is_enabled && drop)
+ {
+ onClipboardAction("delete");
+ }
+ return true;
+}
+
+// List Commands //
+////////////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////////////
+// Tab panels //
+
+void LLPanelOutfitsInventory::initTabPanels()
+{
+ LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME);
+ cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mTabPanels.push_back(cof_panel);
+
+ LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
+ myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
+ myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mTabPanels.push_back(myoutfits_panel);
+
+ for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+ iter != mTabPanels.end();
+ ++iter)
+ {
+ LLInventoryPanel *panel = (*iter);
+ panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
+ }
+
+ mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
+ mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
+ mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel();
+}
+
+void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+ if (user_action && items.size() > 0)
+ {
+ for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+ iter != mTabPanels.end();
+ ++iter)
+ {
+ LLInventoryPanel *panel = (*iter);
+ if (panel == tab_panel)
+ {
+ mActivePanel = panel;
+ }
+ else
+ {
+ panel->getRootFolder()->clearSelection();
+ }
+ }
+ }
+ onSelectionChange(items, user_action);
+}
+
+void LLPanelOutfitsInventory::onTabChange()
+{
+ mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
+ if (!mActivePanel)
+ {
+ return;
+ }
+ mActivePanel->setFilterSubString(mFilterSubString);
+ updateVerbs();
+}
+
+BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const
+{
+ for(tabpanels_vec_t::const_iterator it = mTabPanels.begin();
+ it != mTabPanels.end();
+ ++it)
+ {
+ if (*it == panel)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL LLPanelOutfitsInventory::isCOFPanelActive() const
+{
+ return (getActivePanel()->getName() == COF_TAB_NAME);
+}
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
new file mode 100644
index 0000000000..ab25ef0a49
--- /dev/null
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -0,0 +1,134 @@
+/**
+ * @file llpaneloutfitsinventory.h
+ * @brief Outfits inventory panel
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOUTFITSINVENTORY_H
+#define LL_LLPANELOUTFITSINVENTORY_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+class LLFolderView;
+class LLFolderViewItem;
+class LLFolderViewEventListener;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLButton;
+class LLMenuGL;
+class LLSidepanelAppearance;
+class LLTabContainer;
+
+class LLPanelOutfitsInventory : public LLPanel
+{
+public:
+ LLPanelOutfitsInventory();
+ virtual ~LLPanelOutfitsInventory();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onSearchEdit(const std::string& string);
+ void onAdd();
+ void onRemove();
+ void onEdit();
+ void onSave();
+
+ void onSaveCommit(const std::string& item_name);
+
+ void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onSelectorButtonClicked();
+
+ // If a compatible listener type is selected, then return a pointer to that.
+ // Otherwise, return NULL.
+ LLFolderViewEventListener* getCorrectListenerForAction();
+ void setParent(LLSidepanelAppearance *parent);
+
+ LLFolderView* getRootFolder();
+
+protected:
+ void updateVerbs();
+ bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
+
+private:
+ LLSidepanelAppearance* mParent;
+ LLSaveFolderState* mSavedFolderState;
+ LLTabContainer* mAppearanceTabs;
+ std::string mFilterSubString;
+
+public:
+ //////////////////////////////////////////////////////////////////////////////////
+ // tab panels
+ LLInventoryPanel* getActivePanel() { return mActivePanel; }
+ const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+ BOOL isTabPanel(LLInventoryPanel *panel) const;
+
+protected:
+ void initTabPanels();
+ void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onTabChange();
+ BOOL isCOFPanelActive() const;
+
+private:
+ LLInventoryPanel* mActivePanel;
+ typedef std::vector<LLInventoryPanel *> tabpanels_vec_t;
+ tabpanels_vec_t mTabPanels;
+
+ // tab panels //
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ //////////////////////////////////////////////////////////////////////////////////
+ // List Commands //
+protected:
+ void initListCommandsHandlers();
+ void updateListCommands();
+ void onGearButtonClick();
+ void onWearButtonClick();
+ void onAddButtonClick();
+ void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
+ void onTrashButtonClick();
+ void onClipboardAction(const LLSD& userdata);
+ BOOL isActionEnabled(const LLSD& command_name);
+ void onCustomAction(const LLSD& command_name);
+ bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+ bool hasItemsSelected();
+private:
+ LLPanel* mListCommands;
+ LLMenuGL* mMenuGearDefault;
+ LLMenuGL* mMenuAdd;
+ // List Commands //
+ ////////////////////////////////////////////////////////////////////////////////
+ ///
+public:
+ static bool sShowDebugEditor;
+};
+
+#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4580eeb336..d2a518a06a 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -35,6 +35,8 @@
// libs
#include "llfloaterreg.h"
#include "llmenugl.h"
+#include "llnotificationsutil.h"
+#include "lleventtimer.h"
#include "llfiltereditor.h"
#include "lltabcontainer.h"
#include "lluictrlfactory.h"
@@ -42,6 +44,7 @@
#include "llpanelpeople.h"
// newview
+#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llavataractions.h"
@@ -53,12 +56,16 @@
#include "llfriendcard.h"
#include "llgroupactions.h"
#include "llgrouplist.h"
+#include "llinventoryobserver.h"
#include "llpanelpeoplemenus.h"
+#include "llsidetray.h"
+#include "llsidetraypanelcontainer.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "llvoiceclient.h"
#include "llworld.h"
+#include "llspeakers.h"
#define FRIEND_LIST_UPDATE_TIMEOUT 0.5
#define NEARBY_LIST_UPDATE_INTERVAL 1
@@ -68,6 +75,8 @@ static const std::string FRIENDS_TAB_NAME = "friends_panel";
static const std::string GROUP_TAB_NAME = "groups_panel";
static const std::string RECENT_TAB_NAME = "recent_panel";
+static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+
/** Comparator for comparing avatar items by last interaction date */
class LLAvatarItemRecentComparator : public LLAvatarItemComparator
{
@@ -118,8 +127,84 @@ protected:
}
};
+/** Compares avatar items by distance between you and them */
+class LLAvatarItemDistanceComparator : public LLAvatarItemComparator
+{
+public:
+ typedef std::map < LLUUID, LLVector3d > id_to_pos_map_t;
+ LLAvatarItemDistanceComparator() {};
+
+ void updateAvatarsPositions(std::vector<LLVector3d>& positions, std::vector<LLUUID>& uuids)
+ {
+ std::vector<LLVector3d>::const_iterator
+ pos_it = positions.begin(),
+ pos_end = positions.end();
+
+ std::vector<LLUUID>::const_iterator
+ id_it = uuids.begin(),
+ id_end = uuids.end();
+
+ LLAvatarItemDistanceComparator::id_to_pos_map_t pos_map;
+
+ mAvatarsPositions.clear();
+
+ for (;pos_it != pos_end && id_it != id_end; ++pos_it, ++id_it )
+ {
+ mAvatarsPositions[*id_it] = *pos_it;
+ }
+ };
+
+protected:
+ virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
+ {
+ const LLVector3d& me_pos = gAgent.getPositionGlobal();
+ const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second;
+ const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second;
+ F32 dist1 = dist_vec(item1_pos, me_pos);
+ F32 dist2 = dist_vec(item2_pos, me_pos);
+ return dist1 < dist2;
+ }
+private:
+ id_to_pos_map_t mAvatarsPositions;
+};
+
+/** Comparator for comparing nearby avatar items by last spoken time */
+class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator
+{
+public:
+ LLAvatarItemRecentSpeakerComparator() {};
+ virtual ~LLAvatarItemRecentSpeakerComparator() {};
+
+protected:
+ virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
+ {
+ LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
+ LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
+ if ( lhs.notNull() && rhs.notNull() )
+ {
+ // Compare by last speaking time
+ if( lhs->mLastSpokeTime != rhs->mLastSpokeTime )
+ return ( lhs->mLastSpokeTime > rhs->mLastSpokeTime );
+ }
+ else if ( lhs.notNull() )
+ {
+ // True if only item1 speaker info available
+ return true;
+ }
+ else if ( rhs.notNull() )
+ {
+ // False if only item2 speaker info available
+ return false;
+ }
+ // By default compare by name.
+ return LLAvatarItemNameComparator::doCompare(item1, item2);
+ }
+};
+
static const LLAvatarItemRecentComparator RECENT_COMPARATOR;
static const LLAvatarItemStatusComparator STATUS_COMPARATOR;
+static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR;
+static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR;
static LLRegisterPanelClassWrapper<LLPanelPeople> t_people("panel_people");
@@ -197,7 +282,8 @@ public:
~LLFriendListUpdater()
{
- delete mInvObserver;
+ // will be deleted by ~LLInventoryModel
+ //delete mInvObserver;
LLVoiceClient::getInstance()->removeObserver(this);
LLAvatarTracker::instance().removeObserver(this);
}
@@ -368,6 +454,7 @@ LLPanelPeople::LLPanelPeople()
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this));
+ mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
}
LLPanelPeople::~LLPanelPeople()
@@ -376,6 +463,11 @@ LLPanelPeople::~LLPanelPeople()
delete mFriendListUpdater;
delete mRecentListUpdater;
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+
LLView::deleteViewByHandle(mGroupPlusMenuHandle);
LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
LLView::deleteViewByHandle(mFriendsViewSortMenuHandle);
@@ -384,7 +476,7 @@ LLPanelPeople::~LLPanelPeople()
}
-void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list)
+void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)
{
if(!avatar_list)
{
@@ -394,6 +486,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
bool expanded = param.asBoolean();
+ setAccordionCollapsedByUser(ctrl, !expanded);
if(!expanded)
{
avatar_list->resetSelection();
@@ -402,7 +495,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
BOOL LLPanelPeople::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
mFilterEditor = getChild<LLFilterEditor>("filter_input");
mFilterEditor->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
@@ -426,50 +519,58 @@ BOOL LLPanelPeople::postBuild()
mRecentList->setShowIcons("RecentListShowIcons");
mGroupList = getChild<LLGroupList>("group_list");
- mGroupList->setNoItemsCommentText(getString("no_groups"));
mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+ mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+ mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
setSortOrder(mRecentList, (ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"), false);
setSortOrder(mAllFriendList, (ESortOrder)gSavedSettings.getU32("FriendsSortOrder"), false);
+ setSortOrder(mNearbyList, (ESortOrder)gSavedSettings.getU32("NearbyPeopleSortOrder"), false);
LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked, this));
groups_panel->childSetAction("plus_btn", boost::bind(&LLPanelPeople::onGroupPlusButtonClicked, this));
- groups_panel->childSetAction("minus_btn", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);
friends_panel->childSetAction("add_btn", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this));
friends_panel->childSetAction("del_btn", boost::bind(&LLPanelPeople::onDeleteFriendButtonClicked, this));
- mOnlineFriendList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mOnlineFriendList));
- mAllFriendList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mAllFriendList));
- mNearbyList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mNearbyList));
- mRecentList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, mRecentList));
+ mOnlineFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
+ mAllFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
+ mNearbyList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
+ mRecentList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
mOnlineFriendList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mOnlineFriendList));
mAllFriendList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mAllFriendList));
mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList));
mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList));
- mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this));
+ // Set openning IM as default on return action for avatar lists
+ mOnlineFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mAllFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mNearbyList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mRecentList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+
+ mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this));
+ mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
accordion_tab->setDropDownStateChangedCallback(
- boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mAllFriendList));
+ boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));
accordion_tab = getChild<LLAccordionCtrlTab>("tab_online");
accordion_tab->setDropDownStateChangedCallback(
- boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));
+ boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));
buttonSetAction("view_profile_btn", boost::bind(&LLPanelPeople::onViewProfileButtonClicked, this));
- buttonSetAction("add_friend_btn", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
buttonSetAction("group_info_btn", boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this));
buttonSetAction("chat_btn", boost::bind(&LLPanelPeople::onChatButtonClicked, this));
buttonSetAction("im_btn", boost::bind(&LLPanelPeople::onImButtonClicked, this));
buttonSetAction("call_btn", boost::bind(&LLPanelPeople::onCallButtonClicked, this));
+ buttonSetAction("group_call_btn", boost::bind(&LLPanelPeople::onGroupCallButtonClicked, this));
buttonSetAction("teleport_btn", boost::bind(&LLPanelPeople::onTeleportButtonClicked, this));
buttonSetAction("share_btn", boost::bind(&LLPanelPeople::onShareButtonClicked, this));
@@ -479,21 +580,24 @@ BOOL LLPanelPeople::postBuild()
getChild<LLPanel>(GROUP_TAB_NAME)->childSetAction("groups_viewsort_btn",boost::bind(&LLPanelPeople::onGroupsViewSortButtonClicked, this));
// Must go after setting commit callback and initializing all pointers to children.
- mTabContainer->selectTabByName(FRIENDS_TAB_NAME);
+ mTabContainer->selectTabByName(NEARBY_TAB_NAME);
// Create menus.
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
registrar.add("People.Group.Plus.Action", boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked, this, _2));
+ registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
registrar.add("People.Friends.ViewSort.Action", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked, this, _2));
registrar.add("People.Nearby.ViewSort.Action", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked, this, _2));
registrar.add("People.Groups.ViewSort.Action", boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked, this, _2));
registrar.add("People.Recent.ViewSort.Action", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemClicked, this, _2));
+ enable_registrar.add("People.Group.Minus.Enable", boost::bind(&LLPanelPeople::isRealGroup, this));
enable_registrar.add("People.Friends.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemCheck, this, _2));
enable_registrar.add("People.Recent.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck, this, _2));
-
+ enable_registrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2));
+
LLMenuGL* plus_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mGroupPlusMenuHandle = plus_menu->getHandle();
@@ -513,12 +617,28 @@ BOOL LLPanelPeople::postBuild()
if(recent_view_sort)
mRecentViewSortMenuHandle = recent_view_sort->getHandle();
+ gVoiceClient->addObserver(this);
+
// call this method in case some list is empty and buttons can be in inconsistent state
updateButtons();
+ mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+ mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+
return TRUE;
}
+// virtual
+void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
+ {
+ return;
+ }
+
+ updateButtons();
+}
+
void LLPanelPeople::updateFriendList()
{
if (!mOnlineFriendList || !mAllFriendList)
@@ -550,6 +670,11 @@ void LLPanelPeople::updateFriendList()
lldebugs << "Friends Cards were not found" << llendl;
}
+ // show special help text for just created account to help found friends. EXT-4836
+ static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
+ no_friends_text->setVisible(all_friendsp.size() == 0);
+
+
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
for (; buddy_it != all_buddies.end(); ++buddy_it)
{
@@ -560,6 +685,8 @@ void LLPanelPeople::updateFriendList()
mOnlineFriendList->setDirty();
mAllFriendList->setDirty();
+
+ showFriendsAccordionsIfNeeded();
}
void LLPanelPeople::updateNearbyList()
@@ -567,8 +694,13 @@ void LLPanelPeople::updateNearbyList()
if (!mNearbyList)
return;
- LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
+ std::vector<LLVector3d> positions;
+
+ LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
mNearbyList->setDirty();
+
+ DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
+ LLLocalSpeakerMgr::instance().update(TRUE);
}
void LLPanelPeople::updateRecentList()
@@ -582,14 +714,9 @@ void LLPanelPeople::updateRecentList()
void LLPanelPeople::buttonSetVisible(std::string btn_name, BOOL visible)
{
- // Currently all bottom buttons are wrapped with layout panels.
- // Hiding a button has no effect: the panel still occupies its space.
- // So we have to hide the whole panel (along with its button)
- // to free some space up.
- LLButton* btn = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name);
- LLPanel* btn_parent = dynamic_cast<LLPanel*>(btn->getParent());
- if (btn_parent)
- btn_parent->setVisible(visible);
+ // To make sure we're referencing the right widget (a child of the button bar).
+ LLButton* button = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name);
+ button->setVisible(visible);
}
void LLPanelPeople::buttonSetEnabled(const std::string& btn_name, bool enabled)
@@ -606,26 +733,34 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
button->setClickedCallback(cb);
}
+bool LLPanelPeople::isFriendOnline(const LLUUID& id)
+{
+ LLAvatarList::uuid_vector_t ids = mOnlineFriendList->getIDs();
+ return std::find(ids.begin(), ids.end(), id) != ids.end();
+}
+
void LLPanelPeople::updateButtons()
{
std::string cur_tab = getActiveTabName();
bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
bool group_tab_active = (cur_tab == GROUP_TAB_NAME);
- bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
+ //bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
std::vector<LLUUID> selected_uuids;
getCurrentItemIDs(selected_uuids);
bool item_selected = (selected_uuids.size() == 1);
+ bool multiple_selected = (selected_uuids.size() >= 1);
buttonSetVisible("group_info_btn", group_tab_active);
buttonSetVisible("chat_btn", group_tab_active);
- buttonSetVisible("add_friend_btn", nearby_tab_active || recent_tab_active);
buttonSetVisible("view_profile_btn", !group_tab_active);
buttonSetVisible("im_btn", !group_tab_active);
+ buttonSetVisible("call_btn", !group_tab_active);
+ buttonSetVisible("group_call_btn", group_tab_active);
buttonSetVisible("teleport_btn", friends_tab_active);
- buttonSetVisible("share_btn", !recent_tab_active && false); // not implemented yet
+ buttonSetVisible("share_btn", nearby_tab_active || friends_tab_active);
if (group_tab_active)
{
@@ -639,7 +774,6 @@ void LLPanelPeople::updateButtons()
LLPanel* groups_panel = mTabContainer->getCurrentPanel();
groups_panel->childSetEnabled("activate_btn", item_selected && !cur_group_active); // "none" or a non-active group selected
- groups_panel->childSetEnabled("plus_btn", item_selected);
groups_panel->childSetEnabled("minus_btn", item_selected && selected_id.notNull());
}
else
@@ -653,16 +787,29 @@ void LLPanelPeople::updateButtons()
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
}
- childSetEnabled("add_friend_btn", !is_friend);
+ LLPanel* cur_panel = mTabContainer->getCurrentPanel();
+ if (cur_panel)
+ {
+ cur_panel->childSetEnabled("add_friend_btn", !is_friend);
+ if (friends_tab_active)
+ {
+ cur_panel->childSetEnabled("del_btn", multiple_selected);
+ }
+ }
}
- buttonSetEnabled("teleport_btn", friends_tab_active && item_selected);
+ bool enable_calls = gVoiceClient->voiceWorking() && gVoiceClient->voiceEnabled();
+
+ buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
buttonSetEnabled("view_profile_btn", item_selected);
- buttonSetEnabled("im_btn", (selected_uuids.size() >= 1)); // allow starting the friends conference for multiple selection
- buttonSetEnabled("call_btn", item_selected && false); // not implemented yet
- buttonSetEnabled("share_btn", item_selected && false); // not implemented yet
- buttonSetEnabled("group_info_btn", item_selected);
- buttonSetEnabled("chat_btn", item_selected);
+ buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
+ buttonSetEnabled("call_btn", multiple_selected && enable_calls);
+ buttonSetEnabled("share_btn", item_selected); // not implemented yet
+
+ bool none_group_selected = item_selected && selected_id.isNull();
+ buttonSetEnabled("group_info_btn", !none_group_selected);
+ buttonSetEnabled("group_call_btn", !none_group_selected && enable_calls);
+ buttonSetEnabled("chat_btn", !none_group_selected);
}
std::string LLPanelPeople::getActiveTabName() const
@@ -752,6 +899,14 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
list->setComparator(&RECENT_COMPARATOR);
list->sort();
break;
+ case E_SORT_BY_RECENT_SPEAKERS:
+ list->setComparator(&RECENT_SPEAKER_COMPARATOR);
+ list->sort();
+ break;
+ case E_SORT_BY_DISTANCE:
+ list->setComparator(&DISTANCE_COMPARATOR);
+ list->sort();
+ break;
default:
llwarns << "Unrecognized people sort order for " << list->getName() << llendl;
return;
@@ -766,7 +921,7 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
else if (list == mRecentList)
setting = "RecentPeopleSortOrder";
else if (list == mNearbyList)
- setting = "NearbyPeopleSortOrder"; // *TODO: unused by current implementation
+ setting = "NearbyPeopleSortOrder";
if (!setting.empty())
gSavedSettings.setU32(setting, order);
@@ -795,16 +950,29 @@ void LLPanelPeople::reSelectedCurrentTab()
mTabContainer->selectTab(mTabContainer->getCurrentPanelIndex());
}
+bool LLPanelPeople::isRealGroup()
+{
+ return getCurrentItemID() != LLUUID::null;
+}
+
void LLPanelPeople::onFilterEdit(const std::string& search_string)
{
- if (mFilterSubString == search_string)
+ std::string search_upper = search_string;
+ // Searches are case-insensitive
+ LLStringUtil::toUpper(search_upper);
+ LLStringUtil::trimHead(search_upper);
+
+ if (mFilterSubString == search_upper)
return;
- mFilterSubString = search_string;
+ mFilterSubString = search_upper;
+
+ //store accordion tabs state before any manipulation with accordion tabs
+ if(!mFilterSubString.empty())
+ {
+ notifyChildren(LLSD().with("action","store_state"));
+ }
- // Searches are case-insensitive
- LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
// Apply new filter.
mNearbyList->setNameFilter(mFilterSubString);
@@ -812,6 +980,17 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
mAllFriendList->setNameFilter(mFilterSubString);
mRecentList->setNameFilter(mFilterSubString);
mGroupList->setNameFilter(mFilterSubString);
+
+ setAccordionCollapsedByUser("tab_online", false);
+ setAccordionCollapsedByUser("tab_all", false);
+
+ showFriendsAccordionsIfNeeded();
+
+ //restore accordion tabs state _after_ all manipulations...
+ if(mFilterSubString.empty())
+ {
+ notifyChildren(LLSD().with("action","restore_state"));
+ }
}
void LLPanelPeople::onTabSelected(const LLSD& param)
@@ -820,18 +999,23 @@ void LLPanelPeople::onTabSelected(const LLSD& param)
mNearbyListUpdater->setActive(tab_name == NEARBY_TAB_NAME);
updateButtons();
+ showFriendsAccordionsIfNeeded();
+
if (GROUP_TAB_NAME == tab_name)
mFilterEditor->setLabel(getString("groups_filter_label"));
else
mFilterEditor->setLabel(getString("people_filter_label"));
}
-void LLPanelPeople::onAvatarListDoubleClicked(LLAvatarList* list)
+void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
{
- LLUUID clicked_id = list->getSelectedUUID();
-
- if (clicked_id.isNull())
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl);
+ if(!item)
+ {
return;
+ }
+
+ LLUUID clicked_id = item->getAvatarId();
#if 0 // SJB: Useful for testing, but not currently functional or to spec
LLAvatarActions::showProfile(clicked_id);
@@ -871,10 +1055,28 @@ void LLPanelPeople::onAddFriendButtonClicked()
}
}
+bool LLPanelPeople::isItemsFreeOfFriends(const std::vector<LLUUID>& uuids)
+{
+ const LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
+ for ( std::vector<LLUUID>::const_iterator
+ id = uuids.begin(),
+ id_end = uuids.end();
+ id != id_end; ++id )
+ {
+ if (av_tracker.isBuddy (*id))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
void LLPanelPeople::onAddFriendWizButtonClicked()
{
// Show add friend wizard.
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(onAvatarPicked, NULL, FALSE, TRUE);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE);
+ // Need to disable 'ok' button when friend occurs in selection
+ if (picker) picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));
LLFloater* root_floater = gFloaterView->getParentFloater(this);
if (root_floater)
{
@@ -906,7 +1108,7 @@ void LLPanelPeople::onChatButtonClicked()
{
LLUUID group_id = getCurrentItemID();
if (group_id.notNull())
- LLGroupActions::startChat(group_id);
+ LLGroupActions::startIM(group_id);
}
void LLPanelPeople::onImButtonClicked()
@@ -933,8 +1135,7 @@ void LLPanelPeople::onActivateButtonClicked()
// static
void LLPanelPeople::onAvatarPicked(
const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids,
- void*)
+ const std::vector<LLUUID>& ids)
{
if (!names.empty() && !ids.empty())
LLAvatarActions::requestFriendshipDialog(ids[0], names[0]);
@@ -942,6 +1143,12 @@ void LLPanelPeople::onAvatarPicked(
void LLPanelPeople::onGroupPlusButtonClicked()
{
+ if (!gAgent.canJoinGroups())
+ {
+ LLNotificationsUtil::add("JoinedTooManyGroups");
+ return;
+ }
+
LLMenuGL* plus_menu = (LLMenuGL*)mGroupPlusMenuHandle.get();
if (!plus_menu)
return;
@@ -983,9 +1190,6 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
mAllFriendList->toggleIcons();
mOnlineFriendList->toggleIcons();
}
- else if (chosen_item == "organize_offline")
- {
- }
}
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
@@ -1002,12 +1206,13 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{
std::string chosen_item = userdata.asString();
- if (chosen_item == "sort_recent")
+ if (chosen_item == "sort_by_recent_speakers")
{
+ setSortOrder(mNearbyList, E_SORT_BY_RECENT_SPEAKERS);
}
else if (chosen_item == "sort_name")
{
- mNearbyList->sortByName();
+ setSortOrder(mNearbyList, E_SORT_BY_NAME);
}
else if (chosen_item == "view_icons")
{
@@ -1015,8 +1220,25 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
}
else if (chosen_item == "sort_distance")
{
+ setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
}
}
+
+bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ U32 sort_order = gSavedSettings.getU32("NearbyPeopleSortOrder");
+
+ if (item == "sort_by_recent_speakers")
+ return sort_order == E_SORT_BY_RECENT_SPEAKERS;
+ if (item == "sort_name")
+ return sort_order == E_SORT_BY_NAME;
+ if (item == "sort_distance")
+ return sort_order == E_SORT_BY_DISTANCE;
+
+ return false;
+}
+
void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)
{
std::string chosen_item = userdata.asString();
@@ -1063,7 +1285,24 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata)
void LLPanelPeople::onCallButtonClicked()
{
- // *TODO: not implemented yet
+ std::vector<LLUUID> selected_uuids;
+ getCurrentItemIDs(selected_uuids);
+
+ if (selected_uuids.size() == 1)
+ {
+ // initiate a P2P voice chat with the selected user
+ LLAvatarActions::startCall(getCurrentItemID());
+ }
+ else if (selected_uuids.size() > 1)
+ {
+ // initiate an ad-hoc voice chat with multiple users
+ LLAvatarActions::startAdhocCall(selected_uuids);
+ }
+}
+
+void LLPanelPeople::onGroupCallButtonClicked()
+{
+ LLGroupActions::startCall(getCurrentItemID());
}
void LLPanelPeople::onTeleportButtonClicked()
@@ -1073,7 +1312,7 @@ void LLPanelPeople::onTeleportButtonClicked()
void LLPanelPeople::onShareButtonClicked()
{
- // *TODO: not implemented yet
+ LLAvatarActions::share(getCurrentItemID());
}
void LLPanelPeople::onMoreButtonClicked()
@@ -1124,3 +1363,119 @@ void LLPanelPeople::onOpen(const LLSD& key)
else
reSelectedCurrentTab();
}
+
+bool LLPanelPeople::notifyChildren(const LLSD& info)
+{
+ if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
+ {
+ LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+ if (!container)
+ {
+ llwarns << "Cannot find People panel container" << llendl;
+ return true;
+ }
+
+ if (container->getCurrentPanelIndex() > 0)
+ {
+ // if not on the default panel, switch to it
+ container->onOpen(LLSD().with(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName()));
+ }
+ else
+ LLSideTray::getInstance()->collapseSideBar();
+
+ return true; // this notification is only supposed to be handled by task panels
+ }
+
+ return LLPanel::notifyChildren(info);
+}
+
+void LLPanelPeople::showAccordion(const std::string name, bool show)
+{
+ if(name.empty())
+ {
+ llwarns << "No name provided" << llendl;
+ return;
+ }
+
+ LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
+ tab->setVisible(show);
+ if(show)
+ {
+ // don't expand accordion if it was collapsed by user
+ if(!isAccordionCollapsedByUser(tab))
+ {
+ // expand accordion
+ tab->changeOpenClose(false);
+ }
+ }
+}
+
+void LLPanelPeople::showFriendsAccordionsIfNeeded()
+{
+ if(FRIENDS_TAB_NAME == getActiveTabName())
+ {
+ // Expand and show accordions if needed, else - hide them
+ showAccordion("tab_online", mOnlineFriendList->filterHasMatches());
+ showAccordion("tab_all", mAllFriendList->filterHasMatches());
+
+ // Rearrange accordions
+ LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+ accordion->arrange();
+ }
+}
+
+void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param)
+{
+ if(ctrl == mOnlineFriendList)
+ {
+ showAccordion("tab_online", param.asInteger());
+ }
+ else if(ctrl == mAllFriendList)
+ {
+ showAccordion("tab_all", param.asInteger());
+ }
+
+ LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+ accordion->arrange();
+}
+
+void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+ if(!acc_tab)
+ {
+ llwarns << "Invalid parameter" << llendl;
+ return;
+ }
+
+ LLSD param = acc_tab->getValue();
+ param[COLLAPSED_BY_USER] = collapsed;
+ acc_tab->setValue(param);
+}
+
+void LLPanelPeople::setAccordionCollapsedByUser(const std::string& name, bool collapsed)
+{
+ setAccordionCollapsedByUser(getChild<LLUICtrl>(name), collapsed);
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+ if(!acc_tab)
+ {
+ llwarns << "Invalid parameter" << llendl;
+ return false;
+ }
+
+ LLSD param = acc_tab->getValue();
+ if(!param.has(COLLAPSED_BY_USER))
+ {
+ return false;
+ }
+ return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
+{
+ return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
+}
+
+// EOF
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index dc0aaeb70f..6d3d436156 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -36,13 +36,16 @@
#include <llpanel.h>
#include "llcallingcard.h" // for avatar tracker
+#include "llvoiceclient.h"
class LLFilterEditor;
class LLTabContainer;
class LLAvatarList;
class LLGroupList;
-class LLPanelPeople : public LLPanel
+class LLPanelPeople
+ : public LLPanel
+ , public LLVoiceClientStatusObserver
{
LOG_CLASS(LLPanelPeople);
public:
@@ -50,8 +53,11 @@ public:
virtual ~LLPanelPeople();
/*virtual*/ BOOL postBuild();
-
- virtual void onOpen(const LLSD& key);
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ bool notifyChildren(const LLSD& info);
+ // Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
+ // when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
// internals
class Updater;
@@ -62,6 +68,8 @@ private:
E_SORT_BY_NAME = 0,
E_SORT_BY_STATUS = 1,
E_SORT_BY_MOST_RECENT = 2,
+ E_SORT_BY_DISTANCE = 3,
+ E_SORT_BY_RECENT_SPEAKERS = 4,
} ESortOrder;
// methods indirectly called by the updaters
@@ -69,6 +77,9 @@ private:
void updateNearbyList();
void updateRecentList();
+ bool isFriendOnline(const LLUUID& id);
+ bool isItemsFreeOfFriends(const std::vector<LLUUID>& uuids);
+
void updateButtons();
std::string getActiveTabName() const;
LLUUID getCurrentItemID() const;
@@ -94,6 +105,7 @@ private:
void onChatButtonClicked();
void onImButtonClicked();
void onCallButtonClicked();
+ void onGroupCallButtonClicked();
void onTeleportButtonClicked();
void onShareButtonClicked();
void onMoreButtonClicked();
@@ -102,7 +114,7 @@ private:
void onNearbyViewSortButtonClicked();
void onFriendsViewSortButtonClicked();
void onGroupsViewSortButtonClicked();
- void onAvatarListDoubleClicked(LLAvatarList* list);
+ void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListCommitted(LLAvatarList* list);
void onGroupPlusButtonClicked();
void onGroupMinusButtonClicked();
@@ -113,16 +125,29 @@ private:
void onGroupsViewSortMenuItemClicked(const LLSD& userdata);
void onRecentViewSortMenuItemClicked(const LLSD& userdata);
+ //returns false only if group is "none"
+ bool isRealGroup();
bool onFriendsViewSortMenuItemCheck(const LLSD& userdata);
bool onRecentViewSortMenuItemCheck(const LLSD& userdata);
+ bool onNearbyViewSortMenuItemCheck(const LLSD& userdata);
// misc callbacks
static void onAvatarPicked(
const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids,
- void*);
+ const std::vector<LLUUID>& ids);
+
+ void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
+
+ void showAccordion(const std::string name, bool show);
+
+ void showFriendsAccordionsIfNeeded();
+
+ void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
- void onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list);
+ void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+ void setAccordionCollapsedByUser(const std::string& name, bool collapsed);
+ bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+ bool isAccordionCollapsedByUser(const std::string& name);
LLFilterEditor* mFilterEditor;
LLTabContainer* mTabContainer;
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index aaf6849fe9..900d28adca 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -55,6 +55,22 @@ ContextMenu::ContextMenu()
{
}
+ContextMenu::~ContextMenu()
+{
+ // do not forget delete LLContextMenu* mMenu.
+ // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()
+ // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.
+ // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725
+
+ // menu holder deletes its menus on viewer exit, so we have no way to determine if instance
+ // of mMenu has already been deleted except of using LLHandle. EXT-4762.
+ if (!mMenuHandle.isDead())
+ {
+ mMenu->die();
+ mMenu = NULL;
+ }
+}
+
void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
{
if (mMenu)
@@ -64,7 +80,6 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids,
if (parent)
{
parent->removeChild(mMenu);
- mMenu->setParent(NULL);
}
delete mMenu;
mMenu = NULL;
@@ -78,10 +93,19 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids,
std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
mMenu = createMenu();
+ mMenuHandle = mMenu->getHandle();
mMenu->show(x, y);
LLMenuGL::showPopup(spawning_view, mMenu, x, y);
}
+void ContextMenu::hide()
+{
+ if(mMenu)
+ {
+ mMenu->hide();
+ }
+}
+
//== NearbyMenu ===============================================================
LLContextMenu* NearbyMenu::createMenu()
@@ -97,11 +121,12 @@ LLContextMenu* NearbyMenu::createMenu()
const LLUUID& id = mUUIDs.front();
registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
+ registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id));
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
- registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
+ registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
@@ -118,7 +143,8 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
- // registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startConference, mUUIDs)); // *TODO: unimplemented
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
+ registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
@@ -140,11 +166,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
if (item == std::string("can_block"))
{
const LLUUID& id = mUUIDs.front();
- std::string firstname, lastname;
- gCacheName->getName(id, firstname, lastname);
- bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
- bool is_self = id == gAgentID;
- return !is_self && !is_linden;
+ return LLAvatarActions::canBlock(id);
}
else if (item == std::string("can_add"))
{
@@ -171,10 +193,31 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
}
else if (item == std::string("can_delete"))
{
- const LLUUID& id = mUUIDs.front();
- return LLAvatarActions::isFriend(id);
- }
+ // We can remove friends if:
+ // - there are selected people
+ // - and there are only friends among selection.
+
+ bool result = (mUUIDs.size() > 0);
+ std::vector<LLUUID>::const_iterator
+ id = mUUIDs.begin(),
+ uuids_end = mUUIDs.end();
+
+ for (;id != uuids_end; ++id)
+ {
+ if ( !LLAvatarActions::isFriend(*id) )
+ {
+ result = false;
+ break;
+ }
+ }
+
+ return result;
+ }
+ else if (item == std::string("can_call"))
+ {
+ return LLAvatarActions::canCall();
+ }
return false;
}
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index ed0f8208f6..913638d8c8 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -45,7 +45,7 @@ class ContextMenu : public LLAvatarListItem::ContextMenu
{
public:
ContextMenu();
- virtual ~ContextMenu() {}
+ virtual ~ContextMenu();
/**
* Show the menu at specified coordinates.
@@ -54,12 +54,15 @@ public:
*/
/*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
+ virtual void hide();
+
protected:
virtual LLContextMenu* createMenu() = 0;
std::vector<LLUUID> mUUIDs;
LLContextMenu* mMenu;
+ LLHandle<LLView> mMenuHandle;
};
/**
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 2d3f901370..01b6e8ffad 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -36,13 +36,16 @@
#include "llpanelpermissions.h"
+// library includes
#include "lluuid.h"
#include "llpermissions.h"
#include "llcategory.h"
#include "llclickaction.h"
#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
#include "llstring.h"
+// project includes
#include "llviewerwindow.h"
#include "llresmgr.h"
#include "lltextbox.h"
@@ -66,6 +69,65 @@
#include "roles_constants.h"
#include "llgroupactions.h"
+
+U8 string_value_to_click_action(std::string p_value);
+std::string click_action_to_string_value( U8 action);
+
+U8 string_value_to_click_action(std::string p_value)
+{
+ if(p_value == "Touch")
+ {
+ return CLICK_ACTION_TOUCH;
+ }
+ if(p_value == "Sit")
+ {
+ return CLICK_ACTION_SIT;
+ }
+ if(p_value == "Buy")
+ {
+ return CLICK_ACTION_BUY;
+ }
+ if(p_value == "Pay")
+ {
+ return CLICK_ACTION_PAY;
+ }
+ if(p_value == "Open")
+ {
+ return CLICK_ACTION_OPEN;
+ }
+ if(p_value == "Zoom")
+ {
+ return CLICK_ACTION_ZOOM;
+ }
+ return CLICK_ACTION_TOUCH;
+}
+
+std::string click_action_to_string_value( U8 action)
+{
+ switch (action)
+ {
+ case CLICK_ACTION_TOUCH:
+ default:
+ return "Touch";
+ break;
+ case CLICK_ACTION_SIT:
+ return "Sit";
+ break;
+ case CLICK_ACTION_BUY:
+ return "Buy";
+ break;
+ case CLICK_ACTION_PAY:
+ return "Pay";
+ break;
+ case CLICK_ACTION_OPEN:
+ return "Open";
+ break;
+ case CLICK_ACTION_ZOOM:
+ return "Zoom";
+ break;
+ }
+}
+
///----------------------------------------------------------------------------
/// Class llpanelpermissions
///----------------------------------------------------------------------------
@@ -80,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() :
BOOL LLPanelPermissions::postBuild()
{
childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
- childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);
childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
- childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
@@ -119,6 +181,85 @@ LLPanelPermissions::~LLPanelPermissions()
}
+void LLPanelPermissions::disableAll()
+{
+ childSetEnabled("perm_modify", FALSE);
+ childSetText("perm_modify", LLStringUtil::null);
+
+ childSetEnabled("Creator:", FALSE);
+ childSetText("Creator Name", LLStringUtil::null);
+ childSetEnabled("Creator Name", FALSE);
+
+ childSetEnabled("Owner:", FALSE);
+ childSetText("Owner Name", LLStringUtil::null);
+ childSetEnabled("Owner Name", FALSE);
+
+ childSetEnabled("Group:", FALSE);
+ childSetText("Group Name", LLStringUtil::null);
+ childSetEnabled("Group Name", FALSE);
+ childSetEnabled("button set group", FALSE);
+
+ childSetText("Object Name", LLStringUtil::null);
+ childSetEnabled("Object Name", FALSE);
+ childSetEnabled("Name:", FALSE);
+ childSetText("Group Name", LLStringUtil::null);
+ childSetEnabled("Group Name", FALSE);
+ childSetEnabled("Description:", FALSE);
+ childSetText("Object Description", LLStringUtil::null);
+ childSetEnabled("Object Description", FALSE);
+
+ childSetEnabled("Permissions:", FALSE);
+
+ childSetValue("checkbox share with group", FALSE);
+ childSetEnabled("checkbox share with group", FALSE);
+ childSetEnabled("button deed", FALSE);
+
+ childSetValue("checkbox allow everyone move", FALSE);
+ childSetEnabled("checkbox allow everyone move", FALSE);
+ childSetValue("checkbox allow everyone copy", FALSE);
+ childSetEnabled("checkbox allow everyone copy", FALSE);
+
+ //Next owner can:
+ childSetEnabled("Next owner can:", FALSE);
+ childSetValue("checkbox next owner can modify", FALSE);
+ childSetEnabled("checkbox next owner can modify", FALSE);
+ childSetValue("checkbox next owner can copy", FALSE);
+ childSetEnabled("checkbox next owner can copy", FALSE);
+ childSetValue("checkbox next owner can transfer", FALSE);
+ childSetEnabled("checkbox next owner can transfer", FALSE);
+
+ //checkbox for sale
+ childSetValue("checkbox for sale", FALSE);
+ childSetEnabled("checkbox for sale", FALSE);
+
+ //checkbox include in search
+ childSetValue("search_check", FALSE);
+ childSetEnabled("search_check", FALSE);
+
+ LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
+ combo_sale_type->setValue(LLSaleInfo::FS_COPY);
+ combo_sale_type->setEnabled(FALSE);
+
+ childSetEnabled("Cost", FALSE);
+ childSetText("Cost", getString("Cost Default"));
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
+
+ childSetEnabled("label click action", FALSE);
+ LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
+ if (combo_click_action)
+ {
+ combo_click_action->setEnabled(FALSE);
+ combo_click_action->clear();
+ }
+ childSetVisible("B:", FALSE);
+ childSetVisible("O:", FALSE);
+ childSetVisible("G:", FALSE);
+ childSetVisible("E:", FALSE);
+ childSetVisible("N:", FALSE);
+ childSetVisible("F:", FALSE);
+}
+
void LLPanelPermissions::refresh()
{
LLButton* BtnDeedToGroup = getChild<LLButton>("button deed");
@@ -153,136 +294,58 @@ void LLPanelPermissions::refresh()
if(!nodep || !objectp)// || attachment_selected)
{
// ...nothing selected
- childSetEnabled("perm_modify",false);
- childSetText("perm_modify",LLStringUtil::null);
-
- childSetEnabled("Creator:",false);
- childSetText("Creator Name",LLStringUtil::null);
- childSetEnabled("Creator Name",false);
-
- childSetEnabled("Owner:",false);
- childSetText("Owner Name",LLStringUtil::null);
- childSetEnabled("Owner Name",false);
-
- childSetEnabled("Group:",false);
- childSetText("Group Name",LLStringUtil::null);
- childSetEnabled("Group Name",false);
- childSetEnabled("button set group",false);
-
- childSetText("Object Name",LLStringUtil::null);
- childSetEnabled("Object Name",false);
- childSetEnabled("Name:",false);
- childSetText("Group Name",LLStringUtil::null);
- childSetEnabled("Group Name",false);
- childSetEnabled("Description:",false);
- childSetText("Object Description",LLStringUtil::null);
- childSetEnabled("Object Description",false);
-
- childSetEnabled("Permissions:",false);
-
- childSetValue("checkbox share with group",FALSE);
- childSetEnabled("checkbox share with group",false);
- childSetEnabled("button deed",false);
-
- childSetValue("checkbox allow everyone move",FALSE);
- childSetEnabled("checkbox allow everyone move",false);
- childSetValue("checkbox allow everyone copy",FALSE);
- childSetEnabled("checkbox allow everyone copy",false);
-
- //Next owner can:
- childSetEnabled("Next owner can:",false);
- childSetValue("checkbox next owner can modify",FALSE);
- childSetEnabled("checkbox next owner can modify",false);
- childSetValue("checkbox next owner can copy",FALSE);
- childSetEnabled("checkbox next owner can copy",false);
- childSetValue("checkbox next owner can transfer",FALSE);
- childSetEnabled("checkbox next owner can transfer",false);
-
- //checkbox for sale
- childSetValue("checkbox for sale",FALSE);
- childSetEnabled("checkbox for sale",false);
-
- //checkbox include in search
- childSetValue("search_check", FALSE);
- childSetEnabled("search_check", false);
-
- LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
- combo_sale_type->setValue(LLSaleInfo::FS_COPY);
- combo_sale_type->setEnabled(FALSE);
-
- childSetEnabled("Cost",false);
- childSetText("Cost",getString("Cost Default"));
- childSetText("Edit Cost",LLStringUtil::null);
- childSetEnabled("Edit Cost",false);
-
- childSetEnabled("label click action",false);
- LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction");
- if(ComboClickAction)
- {
- ComboClickAction->setEnabled(FALSE);
- ComboClickAction->clear();
- }
- childSetVisible("B:",false);
- childSetVisible("O:",false);
- childSetVisible("G:",false);
- childSetVisible("E:",false);
- childSetVisible("N:",false);
- childSetVisible("F:",false);
-
+ disableAll();
return;
}
// figure out a few variables
- BOOL is_one_object = (object_count == 1);
-
+ const BOOL is_one_object = (object_count == 1);
+
// BUG: fails if a root and non-root are both single-selected.
BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
- && LLSelectMgr::getInstance()->selectGetRootsModify())
- || LLSelectMgr::getInstance()->selectGetModify();
+ && LLSelectMgr::getInstance()->selectGetRootsModify())
+ || LLSelectMgr::getInstance()->selectGetModify();
const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus();
+
S32 string_index = 0;
std::string MODIFY_INFO_STRINGS[] =
- {
- getString("text modify info 1"),
- getString("text modify info 2"),
- getString("text modify info 3"),
- getString("text modify info 4")
- };
- if(!is_perm_modify)
+ {
+ getString("text modify info 1"),
+ getString("text modify info 2"),
+ getString("text modify info 3"),
+ getString("text modify info 4")
+ };
+ if (!is_perm_modify)
{
string_index += 2;
}
- if(!is_one_object)
+ if (!is_one_object)
{
++string_index;
}
- childSetEnabled("perm_modify",true);
- childSetText("perm_modify",MODIFY_INFO_STRINGS[string_index]);
+ childSetEnabled("perm_modify", TRUE);
+ childSetText("perm_modify", MODIFY_INFO_STRINGS[string_index]);
- childSetEnabled("Permissions:",true);
+ childSetEnabled("Permissions:", TRUE);
// Update creator text field
- childSetEnabled("Creator:",true);
+ childSetEnabled("Creator:", TRUE);
BOOL creators_identical;
std::string creator_name;
creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID,
- creator_name);
+ creator_name);
- childSetText("Creator Name",creator_name);
- childSetEnabled("Creator Name",TRUE);
+ childSetText("Creator Name", creator_name);
+ childSetEnabled("Creator Name", TRUE);
// Update owner text field
- childSetEnabled("Owner:",true);
+ childSetEnabled("Owner:", TRUE);
- BOOL owners_identical;
std::string owner_name;
- owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
-
-// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl;
-
+ const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
if (mOwnerID.isNull())
{
- if(LLSelectMgr::getInstance()->selectIsGroupOwned())
+ if (LLSelectMgr::getInstance()->selectIsGroupOwned())
{
// Group owned already displayed by selectGetOwner
}
@@ -297,61 +360,53 @@ void LLPanelPermissions::refresh()
if (!mLastOwnerID.isNull() && !last_owner_name.empty())
{
owner_name.append(", last ");
- owner_name.append( last_owner_name );
+ owner_name.append(last_owner_name);
}
}
}
-
- childSetText("Owner Name",owner_name);
- childSetEnabled("Owner Name",TRUE);
+ childSetText("Owner Name", owner_name);
+ childSetEnabled("Owner Name", TRUE);
// update group text field
- childSetEnabled("Group:",true);
- childSetText("Group Name",LLStringUtil::null);
+ childSetEnabled("Group:", TRUE);
+ childSetText("Group Name", LLStringUtil::null);
LLUUID group_id;
BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id);
if (groups_identical)
{
- if(mLabelGroupName)
+ if (mLabelGroupName)
{
- mLabelGroupName->setNameID(group_id, TRUE);
+ mLabelGroupName->setNameID(group_id,TRUE);
mLabelGroupName->setEnabled(TRUE);
}
}
else
{
- if(mLabelGroupName)
+ if (mLabelGroupName)
{
mLabelGroupName->setNameID(LLUUID::null, TRUE);
- mLabelGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, TRUE);
+ mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE);
mLabelGroupName->setEnabled(FALSE);
}
}
- childSetEnabled("button set group",owners_identical && (mOwnerID == gAgent.getID()));
+ childSetEnabled("button set group", owners_identical && (mOwnerID == gAgent.getID()));
- // figure out the contents of the name, description, & category
- BOOL edit_name_desc = FALSE;
- if(is_one_object && objectp->permModify())
- {
- edit_name_desc = TRUE;
- }
-
- childSetEnabled("Name:",true);
+ childSetEnabled("Name:", TRUE);
LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
- childSetEnabled("Description:",true);
- LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description");
+ childSetEnabled("Description:", TRUE);
+ LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description");
- if(is_one_object)
+ if (is_one_object)
{
- if(keyboard_focus_view != LineEditorObjectName)
+ if (keyboard_focus_view != LineEditorObjectName)
{
childSetText("Object Name",nodep->mName);
}
- if(LineEditorObjectDesc)
+ if (LineEditorObjectDesc)
{
- if(keyboard_focus_view != LineEditorObjectDesc)
+ if (keyboard_focus_view != LineEditorObjectDesc)
{
LineEditorObjectDesc->setText(nodep->mDescription);
}
@@ -359,19 +414,25 @@ void LLPanelPermissions::refresh()
}
else
{
- childSetText("Object Name",LLStringUtil::null);
+ childSetText("Object Name", LLStringUtil::null);
LineEditorObjectDesc->setText(LLStringUtil::null);
}
- if(edit_name_desc)
+ // figure out the contents of the name, description, & category
+ BOOL edit_name_desc = FALSE;
+ if (is_one_object && objectp->permModify())
{
- childSetEnabled("Object Name",true);
- childSetEnabled("Object Description",true);
+ edit_name_desc = TRUE;
+ }
+ if (edit_name_desc)
+ {
+ childSetEnabled("Object Name", TRUE);
+ childSetEnabled("Object Description", TRUE);
}
else
{
- childSetEnabled("Object Name",false);
- childSetEnabled("Object Description",false);
+ childSetEnabled("Object Name", FALSE);
+ childSetEnabled("Object Description", FALSE);
}
S32 total_sale_price = 0;
@@ -380,10 +441,10 @@ void LLPanelPermissions::refresh()
BOOL is_sale_price_mixed = FALSE;
U32 num_for_sale = FALSE;
LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale,
- is_for_sale_mixed,
- is_sale_price_mixed,
- total_sale_price,
- individual_sale_price);
+ is_for_sale_mixed,
+ is_sale_price_mixed,
+ total_sale_price,
+ individual_sale_price);
const BOOL self_owned = (gAgent.getID() == mOwnerID);
const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ;
@@ -391,35 +452,35 @@ void LLPanelPermissions::refresh()
const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer();
const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy();
- if(!owners_identical)
+ if (!owners_identical)
{
- childSetEnabled("Cost",false);
- childSetText("Edit Cost",LLStringUtil::null);
- childSetEnabled("Edit Cost",false);
+ childSetEnabled("Cost", FALSE);
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
}
// You own these objects.
- else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))
+ else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))
{
// If there are multiple items for sale then set text to PRICE PER UNIT.
if (num_for_sale > 1)
{
- childSetText("Cost",getString("Cost Per Unit"));
+ childSetText("Cost", getString("Cost Per Unit"));
}
else
{
- childSetText("Cost",getString("Cost Default"));
+ childSetText("Cost", getString("Cost Default"));
}
LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
- if(!edit_price->hasFocus())
+ if (!edit_price->hasFocus())
{
// If the sale price is mixed then set the cost to MIXED, otherwise
// set to the actual cost.
- if (num_for_sale > 0 && is_for_sale_mixed)
+ if ((num_for_sale > 0) && is_for_sale_mixed)
{
edit_price->setTentative(TRUE);
}
- else if (num_for_sale > 0 && is_sale_price_mixed)
+ else if ((num_for_sale > 0) && is_sale_price_mixed)
{
edit_price->setTentative(TRUE);
}
@@ -430,303 +491,279 @@ void LLPanelPermissions::refresh()
}
// The edit fields are only enabled if you can sell this object
// and the sale price is not mixed.
- bool enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : false;
- childSetEnabled("Cost",enable_edit);
- childSetEnabled("Edit Cost",enable_edit);
+ BOOL enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : FALSE;
+ childSetEnabled("Cost", enable_edit);
+ childSetEnabled("Edit Cost", enable_edit);
}
// Someone, not you, owns these objects.
- else if(!public_owned)
+ else if (!public_owned)
{
- childSetEnabled("Cost",false);
- childSetEnabled("Edit Cost",false);
+ childSetEnabled("Cost", FALSE);
+ childSetEnabled("Edit Cost", FALSE);
// Don't show a price if none of the items are for sale.
if (num_for_sale)
- childSetText("Edit Cost",llformat("%d",total_sale_price));
+ childSetText("Edit Cost", llformat("%d",total_sale_price));
else
- childSetText("Edit Cost",LLStringUtil::null);
+ childSetText("Edit Cost", LLStringUtil::null);
// If multiple items are for sale, set text to TOTAL PRICE.
if (num_for_sale > 1)
- childSetText("Cost",getString("Cost Total"));
+ childSetText("Cost", getString("Cost Total"));
else
- childSetText("Cost",getString("Cost Default"));
+ childSetText("Cost", getString("Cost Default"));
}
// This is a public object.
else
{
- childSetEnabled("Cost",false);
- childSetText("Cost",getString("Cost Default"));
+ childSetEnabled("Cost", FALSE);
+ childSetText("Cost", getString("Cost Default"));
- childSetText("Edit Cost",LLStringUtil::null);
- childSetEnabled("Edit Cost",false);
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
}
// Enable and disable the permissions checkboxes
// based on who owns the object.
// TODO: Creator permissions
- BOOL valid_base_perms = FALSE;
- BOOL valid_owner_perms = FALSE;
- BOOL valid_group_perms = FALSE;
- BOOL valid_everyone_perms = FALSE;
- BOOL valid_next_perms = FALSE;
-
- U32 base_mask_on;
- U32 base_mask_off;
- U32 owner_mask_on;
- U32 owner_mask_off;
- U32 group_mask_on;
- U32 group_mask_off;
- U32 everyone_mask_on;
- U32 everyone_mask_off;
- U32 next_owner_mask_on = 0;
- U32 next_owner_mask_off = 0;
-
- valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE,
- &base_mask_on,
- &base_mask_off);
-
- valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
- &owner_mask_on,
- &owner_mask_off);
-
- valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
- &group_mask_on,
- &group_mask_off);
+ U32 base_mask_on = 0;
+ U32 base_mask_off = 0;
+ U32 owner_mask_off = 0;
+ U32 owner_mask_on = 0;
+ U32 group_mask_on = 0;
+ U32 group_mask_off = 0;
+ U32 everyone_mask_on = 0;
+ U32 everyone_mask_off = 0;
+ U32 next_owner_mask_on = 0;
+ U32 next_owner_mask_off = 0;
+
+ BOOL valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE,
+ &base_mask_on,
+ &base_mask_off);
+ //BOOL valid_owner_perms =//
+ LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
+ &owner_mask_on,
+ &owner_mask_off);
+ BOOL valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
+ &group_mask_on,
+ &group_mask_off);
- valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
- &everyone_mask_on,
- &everyone_mask_off);
+ BOOL valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
+ &everyone_mask_on,
+ &everyone_mask_off);
- valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER,
- &next_owner_mask_on,
- &next_owner_mask_off);
+ BOOL valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER,
+ &next_owner_mask_on,
+ &next_owner_mask_off);
- if( gSavedSettings.getBOOL("DebugPermissions") )
+ if (gSavedSettings.getBOOL("DebugPermissions") )
{
- std::string perm_string;
if (valid_base_perms)
{
- perm_string = "B: ";
- perm_string += mask_to_string(base_mask_on);
- childSetText("B:",perm_string);
- childSetVisible("B:",true);
+ childSetText("B:", "B: " + mask_to_string(base_mask_on));
+ childSetVisible("B:", TRUE);
- perm_string = "O: ";
- perm_string += mask_to_string(owner_mask_on);
- childSetText("O:",perm_string);
- childSetVisible("O:",true);
+ childSetText("O:", "O: " + mask_to_string(owner_mask_on));
+ childSetVisible("O:", TRUE);
- perm_string = "G: ";
- perm_string += mask_to_string(group_mask_on);
- childSetText("G:",perm_string);
- childSetVisible("G:",true);
+ childSetText("G:", "G: " + mask_to_string(group_mask_on));
+ childSetVisible("G:", TRUE);
- perm_string = "E: ";
- perm_string += mask_to_string(everyone_mask_on);
- childSetText("E:",perm_string);
- childSetVisible("E:",true);
+ childSetText("E:", "E: " + mask_to_string(everyone_mask_on));
+ childSetVisible("E:", TRUE);
- perm_string = "N: ";
- perm_string += mask_to_string(next_owner_mask_on);
- childSetText("N:",perm_string);
- childSetVisible("N:",true);
+ childSetText("N:", "N: " + mask_to_string(next_owner_mask_on));
+ childSetVisible("N:", TRUE);
}
- perm_string = "F: ";
+
U32 flag_mask = 0x0;
- if (objectp->permMove())
- flag_mask |= PERM_MOVE;
- if (objectp->permModify())
- flag_mask |= PERM_MODIFY;
- if (objectp->permCopy())
- flag_mask |= PERM_COPY;
- if (objectp->permTransfer())
- flag_mask |= PERM_TRANSFER;
- perm_string += mask_to_string(flag_mask);
- childSetText("F:",perm_string);
- childSetVisible("F:",true);
+ if (objectp->permMove()) flag_mask |= PERM_MOVE;
+ if (objectp->permModify()) flag_mask |= PERM_MODIFY;
+ if (objectp->permCopy()) flag_mask |= PERM_COPY;
+ if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER;
+
+ childSetText("F:", "F:" + mask_to_string(flag_mask));
+ childSetVisible("F:", TRUE);
}
else
{
- childSetVisible("B:",false);
- childSetVisible("O:",false);
- childSetVisible("G:",false);
- childSetVisible("E:",false);
- childSetVisible("N:",false);
- childSetVisible("F:",false);
+ childSetVisible("B:", FALSE);
+ childSetVisible("O:", FALSE);
+ childSetVisible("G:", FALSE);
+ childSetVisible("E:", FALSE);
+ childSetVisible("N:", FALSE);
+ childSetVisible("F:", FALSE);
}
- bool has_change_perm_ability = false;
- bool has_change_sale_ability = false;
+ BOOL has_change_perm_ability = FALSE;
+ BOOL has_change_sale_ability = FALSE;
- if(valid_base_perms
- && (self_owned
- || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
+ if (valid_base_perms &&
+ (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
{
- has_change_perm_ability = true;
+ has_change_perm_ability = TRUE;
}
- if(valid_base_perms
- && (self_owned
- || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
+ if (valid_base_perms &&
+ (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
{
- has_change_sale_ability = true;
+ has_change_sale_ability = TRUE;
}
if (!has_change_perm_ability && !has_change_sale_ability && !root_selected)
{
// ...must select root to choose permissions
- childSetValue("perm_modify", getString("text modify warning"));
+ childSetValue("perm_modify", getString("text modify warning"));
}
if (has_change_perm_ability)
{
- childSetEnabled("checkbox share with group",true);
- childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE);
- childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER);
+ childSetEnabled("checkbox share with group", TRUE);
+ childSetEnabled("checkbox allow everyone move", owner_mask_on & PERM_MOVE);
+ childSetEnabled("checkbox allow everyone copy", owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER);
}
else
{
- childSetEnabled("checkbox share with group", FALSE);
- childSetEnabled("checkbox allow everyone move", FALSE);
- childSetEnabled("checkbox allow everyone copy", FALSE);
+ childSetEnabled("checkbox share with group", FALSE);
+ childSetEnabled("checkbox allow everyone move", FALSE);
+ childSetEnabled("checkbox allow everyone copy", FALSE);
}
if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER))
{
- childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale));
+ childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale));
// Set the checkbox to tentative if the prices of each object selected
// are not the same.
- childSetTentative("checkbox for sale", is_for_sale_mixed);
- childSetEnabled("sale type",num_for_sale && can_transfer && !is_sale_price_mixed);
+ childSetTentative("checkbox for sale", is_for_sale_mixed);
+ childSetEnabled("sale type", num_for_sale && can_transfer && !is_sale_price_mixed);
- childSetEnabled("Next owner can:", TRUE);
- childSetEnabled("checkbox next owner can modify",base_mask_on & PERM_MODIFY);
- childSetEnabled("checkbox next owner can copy",base_mask_on & PERM_COPY);
- childSetEnabled("checkbox next owner can transfer",next_owner_mask_on & PERM_COPY);
+ childSetEnabled("Next owner can:", TRUE);
+ childSetEnabled("checkbox next owner can modify", base_mask_on & PERM_MODIFY);
+ childSetEnabled("checkbox next owner can copy", base_mask_on & PERM_COPY);
+ childSetEnabled("checkbox next owner can transfer", next_owner_mask_on & PERM_COPY);
}
else
{
- childSetEnabled("checkbox for sale",FALSE);
- childSetEnabled("sale type",FALSE);
+ childSetEnabled("checkbox for sale", FALSE);
+ childSetEnabled("sale type", FALSE);
- childSetEnabled("Next owner can:",FALSE);
- childSetEnabled("checkbox next owner can modify",FALSE);
- childSetEnabled("checkbox next owner can copy",FALSE);
- childSetEnabled("checkbox next owner can transfer",FALSE);
+ childSetEnabled("Next owner can:", FALSE);
+ childSetEnabled("checkbox next owner can modify", FALSE);
+ childSetEnabled("checkbox next owner can copy", FALSE);
+ childSetEnabled("checkbox next owner can transfer", FALSE);
}
- if(valid_group_perms)
+ if (valid_group_perms)
{
- if((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE))
+ if ((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE))
{
- childSetValue("checkbox share with group",TRUE);
- childSetTentative("checkbox share with group",FALSE);
- childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
+ childSetValue("checkbox share with group", TRUE);
+ childSetTentative("checkbox share with group", FALSE);
+ childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
}
- else if((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE))
+ else if ((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE))
{
- childSetValue("checkbox share with group",FALSE);
- childSetTentative("checkbox share with group",false);
- childSetEnabled("button deed",false);
+ childSetValue("checkbox share with group", FALSE);
+ childSetTentative("checkbox share with group", FALSE);
+ childSetEnabled("button deed", FALSE);
}
else
{
- childSetValue("checkbox share with group",TRUE);
- childSetTentative("checkbox share with group",true);
- childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
+ childSetValue("checkbox share with group", TRUE);
+ childSetTentative("checkbox share with group", TRUE);
+ childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
}
}
- if(valid_everyone_perms)
+ if (valid_everyone_perms)
{
// Move
- if(everyone_mask_on & PERM_MOVE)
+ if (everyone_mask_on & PERM_MOVE)
{
- childSetValue("checkbox allow everyone move",TRUE);
- childSetTentative("checkbox allow everyone move",false);
+ childSetValue("checkbox allow everyone move", TRUE);
+ childSetTentative("checkbox allow everyone move", FALSE);
}
- else if(everyone_mask_off & PERM_MOVE)
+ else if (everyone_mask_off & PERM_MOVE)
{
- childSetValue("checkbox allow everyone move",FALSE);
- childSetTentative("checkbox allow everyone move",false);
+ childSetValue("checkbox allow everyone move", FALSE);
+ childSetTentative("checkbox allow everyone move", FALSE);
}
else
{
- childSetValue("checkbox allow everyone move",TRUE);
- childSetTentative("checkbox allow everyone move",true);
+ childSetValue("checkbox allow everyone move", TRUE);
+ childSetTentative("checkbox allow everyone move", TRUE);
}
// Copy == everyone can't copy
- if(everyone_mask_on & PERM_COPY)
+ if (everyone_mask_on & PERM_COPY)
{
- childSetValue("checkbox allow everyone copy",TRUE);
- childSetTentative("checkbox allow everyone copy",!can_copy || !can_transfer);
+ childSetValue("checkbox allow everyone copy", TRUE);
+ childSetTentative("checkbox allow everyone copy", !can_copy || !can_transfer);
}
- else if(everyone_mask_off & PERM_COPY)
+ else if (everyone_mask_off & PERM_COPY)
{
- childSetValue("checkbox allow everyone copy",FALSE);
- childSetTentative("checkbox allow everyone copy",false);
+ childSetValue("checkbox allow everyone copy", FALSE);
+ childSetTentative("checkbox allow everyone copy", FALSE);
}
else
{
- childSetValue("checkbox allow everyone copy",TRUE);
- childSetTentative("checkbox allow everyone copy",true);
+ childSetValue("checkbox allow everyone copy", TRUE);
+ childSetTentative("checkbox allow everyone copy", TRUE);
}
}
- if(valid_next_perms)
+ if (valid_next_perms)
{
// Modify == next owner canot modify
- if(next_owner_mask_on & PERM_MODIFY)
+ if (next_owner_mask_on & PERM_MODIFY)
{
- childSetValue("checkbox next owner can modify",TRUE);
- childSetTentative("checkbox next owner can modify",false);
+ childSetValue("checkbox next owner can modify", TRUE);
+ childSetTentative("checkbox next owner can modify", FALSE);
}
- else if(next_owner_mask_off & PERM_MODIFY)
+ else if (next_owner_mask_off & PERM_MODIFY)
{
- childSetValue("checkbox next owner can modify",FALSE);
- childSetTentative("checkbox next owner can modify",false);
+ childSetValue("checkbox next owner can modify", FALSE);
+ childSetTentative("checkbox next owner can modify", FALSE);
}
else
{
- childSetValue("checkbox next owner can modify",TRUE);
- childSetTentative("checkbox next owner can modify",true);
+ childSetValue("checkbox next owner can modify", TRUE);
+ childSetTentative("checkbox next owner can modify", TRUE);
}
// Copy == next owner cannot copy
- if(next_owner_mask_on & PERM_COPY)
+ if (next_owner_mask_on & PERM_COPY)
{
- childSetValue("checkbox next owner can copy",TRUE);
- childSetTentative("checkbox next owner can copy",!can_copy);
+ childSetValue("checkbox next owner can copy", TRUE);
+ childSetTentative("checkbox next owner can copy", !can_copy);
}
- else if(next_owner_mask_off & PERM_COPY)
+ else if (next_owner_mask_off & PERM_COPY)
{
- childSetValue("checkbox next owner can copy",FALSE);
- childSetTentative("checkbox next owner can copy",FALSE);
+ childSetValue("checkbox next owner can copy", FALSE);
+ childSetTentative("checkbox next owner can copy", FALSE);
}
else
{
- childSetValue("checkbox next owner can copy",TRUE);
- childSetTentative("checkbox next owner can copy",TRUE);
+ childSetValue("checkbox next owner can copy", TRUE);
+ childSetTentative("checkbox next owner can copy", TRUE);
}
// Transfer == next owner cannot transfer
- if(next_owner_mask_on & PERM_TRANSFER)
+ if (next_owner_mask_on & PERM_TRANSFER)
{
- childSetValue("checkbox next owner can transfer",TRUE);
- childSetTentative("checkbox next owner can transfer",!can_transfer);
+ childSetValue("checkbox next owner can transfer", TRUE);
+ childSetTentative("checkbox next owner can transfer", !can_transfer);
}
- else if(next_owner_mask_off & PERM_TRANSFER)
+ else if (next_owner_mask_off & PERM_TRANSFER)
{
- childSetValue("checkbox next owner can transfer",FALSE);
- childSetTentative("checkbox next owner can transfer",FALSE);
+ childSetValue("checkbox next owner can transfer", FALSE);
+ childSetTentative("checkbox next owner can transfer", FALSE);
}
else
{
- childSetValue("checkbox next owner can transfer",TRUE);
- childSetTentative("checkbox next owner can transfer",TRUE);
+ childSetValue("checkbox next owner can transfer", TRUE);
+ childSetTentative("checkbox next owner can transfer", TRUE);
}
}
@@ -738,47 +775,51 @@ void LLPanelPermissions::refresh()
LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
if (valid_sale_info)
{
- combo_sale_type->setValue(sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type);
- combo_sale_type->setTentative(FALSE); // unfortunately this doesn't do anything at the moment.
+ combo_sale_type->setValue( sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type);
+ combo_sale_type->setTentative( FALSE); // unfortunately this doesn't do anything at the moment.
}
else
{
// default option is sell copy, determined to be safest
- combo_sale_type->setValue(LLSaleInfo::FS_COPY);
- combo_sale_type->setTentative(TRUE); // unfortunately this doesn't do anything at the moment.
+ combo_sale_type->setValue( LLSaleInfo::FS_COPY);
+ combo_sale_type->setTentative( TRUE); // unfortunately this doesn't do anything at the moment.
}
- childSetValue("checkbox for sale", num_for_sale != 0);
+ childSetValue("checkbox for sale", (num_for_sale != 0));
// HACK: There are some old objects in world that are set for sale,
// but are no-transfer. We need to let users turn for-sale off, but only
// if for-sale is set.
bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY);
- if (num_for_sale && has_change_sale_ability && cannot_actually_sell)
+ if (cannot_actually_sell)
{
- childSetEnabled("checkbox for sale", true);
+ if (num_for_sale && has_change_sale_ability)
+ {
+ childSetEnabled("checkbox for sale", true);
+ }
}
-
+
// Check search status of objects
- BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
+ const BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
bool include_in_search;
- bool all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search);
- childSetEnabled("search_check", has_change_sale_ability && all_volume);
- childSetValue("search_check", include_in_search);
- childSetTentative("search_check", ! all_include_in_search);
+ const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search);
+ childSetEnabled("search_check", has_change_sale_ability && all_volume);
+ childSetValue("search_check", include_in_search);
+ childSetTentative("search_check", !all_include_in_search);
// Click action (touch, sit, buy)
U8 click_action = 0;
if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action))
{
- LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction");
- if(ComboClickAction)
+ LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
+ if(combo_click_action)
{
- ComboClickAction->setCurrentByIndex((S32)click_action);
+ const std::string combo_value = click_action_to_string_value(click_action);
+ combo_click_action->setValue(LLSD(combo_value));
}
}
- childSetEnabled("label click action",is_perm_modify && all_volume);
- childSetEnabled("clickaction",is_perm_modify && all_volume);
+ childSetEnabled("label click action", is_perm_modify && all_volume);
+ childSetEnabled("clickaction", is_perm_modify && all_volume);
}
@@ -831,7 +872,7 @@ void LLPanelPermissions::cbGroupID(LLUUID group_id)
bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
LLUUID group_id;
@@ -847,7 +888,7 @@ bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
void LLPanelPermissions::onClickDeedToGroup(void* data)
{
- LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
+ LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
}
///----------------------------------------------------------------------------
@@ -970,19 +1011,32 @@ void LLPanelPermissions::setAllSaleInfo()
if (price < 0)
sale_type = LLSaleInfo::FS_NOT;
- LLSaleInfo sale_info(sale_type, price);
- LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info);
+ LLSaleInfo old_sale_info;
+ LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
+
+ LLSaleInfo new_sale_info(sale_type, price);
+ LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
- // If turned off for-sale, make sure click-action buy is turned
- // off as well
- if (sale_type == LLSaleInfo::FS_NOT)
+ U8 old_click_action = 0;
+ LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
+
+ if (old_sale_info.isForSale()
+ && !new_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_BUY)
{
- U8 click_action = 0;
- LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
- if (click_action == CLICK_ACTION_BUY)
- {
- LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH);
- }
+ // If turned off for-sale, make sure click-action buy is turned
+ // off as well
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_TOUCH);
+ }
+ else if (new_sale_info.isForSale()
+ && !old_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_TOUCH)
+ {
+ // If just turning on for-sale, preemptively turn on one-click buy
+ // unless user have a different click action set
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_BUY);
}
}
@@ -1002,21 +1056,22 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
{
LLComboBox* box = (LLComboBox*)ctrl;
if (!box) return;
-
- U8 click_action = (U8)box->getCurrentIndex();
+ std::string value = box->getValue().asString();
+ U8 click_action = string_value_to_click_action(value);
+
if (click_action == CLICK_ACTION_BUY)
{
LLSaleInfo sale_info;
LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
if (!sale_info.isForSale())
{
- LLNotifications::instance().add("CantSetBuyObject");
+ LLNotificationsUtil::add("CantSetBuyObject");
// Set click action back to its old value
U8 click_action = 0;
LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
- box->setCurrentByIndex((S32)click_action);
-
+ std::string item_value = click_action_to_string_value(click_action);
+ box->setValue(LLSD(item_value));
return;
}
}
@@ -1028,7 +1083,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
if (!can_pay)
{
// Warn, but do it anyway.
- LLNotifications::instance().add("ClickActionNotPayable");
+ LLNotificationsUtil::add("ClickActionNotPayable");
}
}
LLSelectMgr::getInstance()->selectionSetClickAction(click_action);
diff --git a/indra/newview/llpanelpermissions.h b/indra/newview/llpanelpermissions.h
index 805a4dbe97..38d3be532f 100644
--- a/indra/newview/llpanelpermissions.h
+++ b/indra/newview/llpanelpermissions.h
@@ -84,6 +84,9 @@ protected:
static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*);
protected:
+ void disableAll();
+
+private:
LLNameBox* mLabelGroupName; // group name
LLUUID mCreatorID;
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index e725479abb..5ac0587550 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -35,23 +35,30 @@
// profile.
#include "llviewerprecompiledheaders.h"
-#include "llpanel.h"
+
+#include "llpanelpick.h"
+
#include "message.h"
-#include "llagent.h"
-#include "llagentpicksinfo.h"
+
+#include "llparcel.h"
+
#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "lliconctrl.h"
#include "lllineeditor.h"
-#include "llparcel.h"
-#include "llviewerparcelmgr.h"
+#include "llpanel.h"
+#include "llscrollcontainer.h"
#include "lltexteditor.h"
+
+#include "llagent.h"
+#include "llagentpicksinfo.h"
+#include "llavatarpropertiesprocessor.h"
+#include "llfloaterworldmap.h"
#include "lltexturectrl.h"
#include "lluiconstants.h"
+#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llworldmap.h"
-#include "llfloaterworldmap.h"
-#include "llfloaterreg.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llpanelpick.h"
#define XML_PANEL_EDIT_PICK "panel_edit_pick.xml"
@@ -62,6 +69,7 @@
#define XML_SNAPSHOT "pick_snapshot"
#define XML_LOCATION "pick_location"
+#define XML_BTN_ON_TXTR "edit_icon"
#define XML_BTN_SAVE "save_changes_btn"
#define SAVE_BTN_LABEL "[WHAT]"
@@ -89,12 +97,23 @@ LLPanelPickInfo::LLPanelPickInfo()
, mAvatarId(LLUUID::null)
, mSnapshotCtrl(NULL)
, mPickId(LLUUID::null)
+ , mParcelId(LLUUID::null)
+ , mRequestedId(LLUUID::null)
+ , mScrollingPanelMinHeight(0)
+ , mScrollingPanelWidth(0)
+ , mScrollingPanel(NULL)
+ , mScrollContainer(NULL)
{
}
LLPanelPickInfo::~LLPanelPickInfo()
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+
+ if (mParcelId.notNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+ }
}
void LLPanelPickInfo::onOpen(const LLSD& key)
@@ -137,9 +156,35 @@ BOOL LLPanelPickInfo::postBuild()
childSetAction("show_on_map_btn", boost::bind(&LLPanelPickInfo::onClickMap, this));
childSetAction("back_btn", boost::bind(&LLPanelPickInfo::onClickBack, this));
+ mScrollingPanel = getChild<LLPanel>("scroll_content_panel");
+ mScrollContainer = getChild<LLScrollContainer>("profile_scroll");
+
+ mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
+ mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
+
return TRUE;
}
+void LLPanelPickInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLPanel::reshape(width, height, called_from_parent);
+
+ if (!mScrollContainer || !mScrollingPanel)
+ return;
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ S32 scroll_height = mScrollContainer->getRect().getHeight();
+ if (mScrollingPanelMinHeight >= scroll_height)
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
+ }
+ else
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
+ }
+}
+
void LLPanelPickInfo::processProperties(void* data, EAvatarProcessorType type)
{
if(APT_PICK_INFO != type)
@@ -154,12 +199,14 @@ void LLPanelPickInfo::processProperties(void* data, EAvatarProcessorType type)
return;
}
+ mParcelId = pick_info->parcel_id;
setSnapshotId(pick_info->snapshot_id);
setPickName(pick_info->name);
setPickDesc(pick_info->desc);
setPosGlobal(pick_info->pos_global);
- setPickLocation(createLocationText(pick_info->user_name, pick_info->original_name,
- pick_info->sim_name, pick_info->pos_global));
+
+ // Send remote parcel info request to get parcel name and sim (region) name.
+ sendParcelInfoRequest();
// *NOTE dzaporozhan
// We want to keep listening to APT_PICK_INFO because user may
@@ -167,6 +214,17 @@ void LLPanelPickInfo::processProperties(void* data, EAvatarProcessorType type)
// revomeObserver is called from onClickBack
}
+void LLPanelPickInfo::sendParcelInfoRequest()
+{
+ if (mParcelId != mRequestedId)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId);
+
+ mRequestedId = mParcelId;
+ }
+}
+
void LLPanelPickInfo::setExitCallback(const commit_callback_t& cb)
{
getChild<LLButton>("back_btn")->setClickedCallback(cb);
@@ -174,21 +232,16 @@ void LLPanelPickInfo::setExitCallback(const commit_callback_t& cb)
void LLPanelPickInfo::processParcelInfo(const LLParcelData& parcel_data)
{
- // HACK: Flag 0x2 == adult region,
- // Flag 0x1 == mature region, otherwise assume PG
- std::string rating_icon = "icon_event.tga";
- if (parcel_data.flags & 0x2)
- {
- rating_icon = "icon_event_adult.tga";
- }
- else if (parcel_data.flags & 0x1)
- {
- rating_icon = "icon_event_mature.tga";
- }
+ setPickLocation(createLocationText(LLStringUtil::null, parcel_data.name,
+ parcel_data.sim_name, getPosGlobal()));
- childSetValue("maturity", rating_icon);
+ // We have received parcel info for the requested ID so clear it now.
+ mRequestedId.setNull();
- //*NOTE we don't removeObserver(...) ourselves cause LLRemoveParcelProcessor does it for us
+ if (mParcelId.notNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+ }
}
void LLPanelPickInfo::setEditPickCallback(const commit_callback_t& cb)
@@ -220,7 +273,8 @@ void LLPanelPickInfo::resetData()
setPickId(LLUUID::null);
setSnapshotId(LLUUID::null);
mPosGlobal.clearVec();
- childSetValue("maturity", LLStringUtil::null);
+ mParcelId.setNull();
+ mRequestedId.setNull();
}
// static
@@ -271,9 +325,6 @@ void LLPanelPickInfo::setPickDesc(const std::string& desc)
void LLPanelPickInfo::setPickLocation(const std::string& location)
{
childSetValue(XML_LOCATION, location);
-
- //preserving non-wrapped text for info/edit modes switching
- mLocation = location;
}
void LLPanelPickInfo::onClickMap()
@@ -338,7 +389,7 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
setPosGlobal(gAgent.getPositionGlobal());
LLUUID parcel_id = LLUUID::null, snapshot_id = LLUUID::null;
- std::string pick_name, pick_desc;
+ std::string pick_name, pick_desc, region_name;
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if(parcel)
@@ -349,21 +400,17 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
snapshot_id = parcel->getSnapshotID();
}
- if(pick_name.empty())
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region)
{
- LLViewerRegion* region = gAgent.getRegion();
- if(region)
- {
- pick_name = region->getName();
- }
+ region_name = region->getName();
}
setParcelID(parcel_id);
- childSetValue("pick_name", pick_name);
+ childSetValue("pick_name", pick_name.empty() ? region_name : pick_name);
childSetValue("pick_desc", pick_desc);
setSnapshotId(snapshot_id);
- setPickLocation(createLocationText(LLStringUtil::null, SET_LOCATION_NOTICE,
- pick_name, getPosGlobal()));
+ setPickLocation(createLocationText(SET_LOCATION_NOTICE, pick_name, region_name, getPosGlobal()));
enableSaveButton(true);
}
@@ -392,17 +439,16 @@ void LLPanelPickEdit::setPickData(const LLPickData* pick_data)
childSetValue("pick_name", pick_data->name);
childSetValue("pick_desc", pick_data->desc);
setSnapshotId(pick_data->snapshot_id);
- setPickLocation(createLocationText(pick_data->user_name, pick_data->original_name, /*pick_data->sim_name,*/
- pick_data->name, pick_data->pos_global));
+ setPosGlobal(pick_data->pos_global);
+ setPickLocation(createLocationText(LLStringUtil::null, pick_data->name,
+ pick_data->sim_name, pick_data->pos_global));
}
BOOL LLPanelPickEdit::postBuild()
{
LLPanelPickInfo::postBuild();
- mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelPickEdit::onPickChanged, this, _1));
- mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPickEdit::childSetVisible, this, "edit_icon", true));
- mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPickEdit::childSetVisible, this, "edit_icon", false));
+ mSnapshotCtrl->setCommitCallback(boost::bind(&LLPanelPickEdit::onSnapshotChanged, this));
LLLineEditor* line_edit = getChild<LLLineEditor>("pick_name");
line_edit->setKeystrokeCallback(boost::bind(&LLPanelPickEdit::onPickChanged, this, _1), NULL);
@@ -413,6 +459,8 @@ BOOL LLPanelPickEdit::postBuild()
childSetAction(XML_BTN_SAVE, boost::bind(&LLPanelPickEdit::onClickSave, this));
childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelPickEdit::onClickSetLocation, this));
+ initTexturePickerMouseEvents();
+
return TRUE;
}
@@ -438,7 +486,8 @@ void LLPanelPickEdit::resetDirty()
BOOL LLPanelPickEdit::isDirty() const
{
- if( LLPanelPickInfo::isDirty()
+ if( mNewPick
+ || LLPanelPickInfo::isDirty()
|| mLocationChanged
|| mSnapshotCtrl->isDirty()
|| getChild<LLLineEditor>("pick_name")->isDirty()
@@ -488,16 +537,14 @@ void LLPanelPickEdit::sendUpdate()
}
}
+void LLPanelPickEdit::onSnapshotChanged()
+{
+ enableSaveButton(true);
+}
+
void LLPanelPickEdit::onPickChanged(LLUICtrl* ctrl)
{
- if(isDirty())
- {
- enableSaveButton(true);
- }
- else
- {
- enableSaveButton(false);
- }
+ enableSaveButton(isDirty());
}
void LLPanelPickEdit::resetData()
@@ -516,14 +563,22 @@ void LLPanelPickEdit::onClickSetLocation()
// Save location for later use.
setPosGlobal(gAgent.getPositionGlobal());
+ std::string parcel_name, region_name;
+
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel)
{
mParcelId = parcel->getID();
- mSimName = parcel->getName();
+ parcel_name = parcel->getName();
}
- setPickLocation(createLocationText(
- LLStringUtil::null, SET_LOCATION_NOTICE, mSimName, getPosGlobal()));
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region)
+ {
+ region_name = region->getName();
+ }
+
+ setPickLocation(createLocationText(SET_LOCATION_NOTICE, parcel_name, region_name, getPosGlobal()));
mLocationChanged = true;
enableSaveButton(TRUE);
@@ -547,3 +602,24 @@ void LLPanelPickEdit::processProperties(void* data, EAvatarProcessorType type)
LLPanelPickInfo::processProperties(data, type);
}
}
+
+// PRIVATE AREA
+
+void LLPanelPickEdit::initTexturePickerMouseEvents()
+{
+ text_icon = getChild<LLIconCtrl>(XML_BTN_ON_TXTR);
+ mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseEnter, this, _1));
+ mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseLeave, this, _1));
+
+ text_icon->setVisible(FALSE);
+}
+
+void LLPanelPickEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
+{
+ text_icon->setVisible(TRUE);
+}
+
+void LLPanelPickEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
+{
+ text_icon->setVisible(FALSE);
+}
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index 9b605cd6b1..4f27760a8d 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -41,7 +41,9 @@
#include "llremoteparcelrequest.h"
#include "llavatarpropertiesprocessor.h"
+class LLIconCtrl;
class LLTextureCtrl;
+class LLScrollContainer;
class LLMessageSystem;
class LLAvatarPropertiesObserver;
@@ -68,9 +70,16 @@ public:
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
/**
+ * Sends remote parcel info request to resolve parcel name from its ID.
+ */
+ void sendParcelInfoRequest();
+
+ /**
* Sets "Back" button click callback
*/
virtual void setExitCallback(const commit_callback_t& cb);
@@ -80,9 +89,9 @@ public:
*/
virtual void setEditPickCallback(const commit_callback_t& cb);
- //This stuff we got from LLRemoteParcelObserver, in the last two we intentionally do nothing
+ //This stuff we got from LLRemoteParcelObserver, in the last one we intentionally do nothing
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
- /*virtual*/ void setParcelID(const LLUUID& parcel_id) {};
+ /*virtual*/ void setParcelID(const LLUUID& parcel_id) { mParcelId = parcel_id; }
/*virtual*/ void setErrorStatus(U32 status, const std::string& reason) {};
protected:
@@ -147,14 +156,17 @@ protected:
protected:
- LLTextureCtrl* mSnapshotCtrl;
+ S32 mScrollingPanelMinHeight;
+ S32 mScrollingPanelWidth;
+ LLScrollContainer* mScrollContainer;
+ LLPanel* mScrollingPanel;
+ LLTextureCtrl* mSnapshotCtrl;
LLUUID mAvatarId;
LLVector3d mPosGlobal;
LLUUID mParcelId;
LLUUID mPickId;
- std::string mSimName;
- std::string mLocation;
+ LLUUID mRequestedId;
};
/**
@@ -210,6 +222,11 @@ protected:
void sendUpdate();
/**
+ * Called when snapshot image changes.
+ */
+ void onSnapshotChanged();
+
+ /**
* Callback for Pick snapshot, name and description changed event.
*/
void onPickChanged(LLUICtrl* ctrl);
@@ -236,6 +253,16 @@ protected:
bool mLocationChanged;
bool mNeedData;
bool mNewPick;
+
+private:
+
+ void initTexturePickerMouseEvents();
+ void onTexturePickerMouseEnter(LLUICtrl* ctrl);
+ void onTexturePickerMouseLeave(LLUICtrl* ctrl);
+
+private:
+
+ LLIconCtrl* text_icon;
};
#endif // LL_LLPANELPICK_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index aa6909560d..2ff2597f08 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -32,39 +32,174 @@
#include "llviewerprecompiledheaders.h"
+#include "llpanelpicks.h"
+
#include "llagent.h"
#include "llagentpicksinfo.h"
#include "llavatarconstants.h"
+#include "llcommandhandler.h"
+#include "lldispatcher.h"
#include "llflatlistview.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
+#include "llnotificationsutil.h"
#include "lltexturectrl.h"
#include "lltoggleablemenu.h"
+#include "lltrans.h"
#include "llviewergenericmessage.h" // send_generic_message
#include "llmenugl.h"
#include "llviewermenu.h"
#include "llregistry.h"
-#include "llpanelpicks.h"
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
#include "llavatarpropertiesprocessor.h"
#include "llpanelavatar.h"
#include "llpanelprofile.h"
#include "llpanelpick.h"
+#include "llpanelclassified.h"
+#include "llsidetray.h"
static const std::string XML_BTN_NEW = "new_btn";
static const std::string XML_BTN_DELETE = "trash_btn";
static const std::string XML_BTN_INFO = "info_btn";
static const std::string XML_BTN_TELEPORT = "teleport_btn";
static const std::string XML_BTN_SHOW_ON_MAP = "show_on_map_btn";
-static const std::string XML_BTN_OVERFLOW = "overflow_btn";
static const std::string PICK_ID("pick_id");
static const std::string PICK_CREATOR_ID("pick_creator_id");
static const std::string PICK_NAME("pick_name");
+static const std::string CLASSIFIED_ID("classified_id");
+static const std::string CLASSIFIED_NAME("classified_name");
+
static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
+class LLClassifiedHandler :
+ public LLCommandHandler,
+ public LLAvatarPropertiesObserver
+{
+public:
+ // throttle calls from untrusted browsers
+ LLClassifiedHandler() : LLCommandHandler("classified", UNTRUSTED_THROTTLE) {}
+
+ std::set<LLUUID> mClassifiedIds;
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // handle app/classified/create urls first
+ if (params.size() == 1 && params[0].asString() == "create")
+ {
+ createClassified();
+ return true;
+ }
+
+ // then handle the general app/classified/{UUID}/{CMD} urls
+ if (params.size() < 2)
+ {
+ return false;
+ }
+
+ // get the ID for the classified
+ LLUUID classified_id;
+ if (!classified_id.set(params[0], FALSE))
+ {
+ return false;
+ }
+
+ // show the classified in the side tray.
+ // need to ask the server for more info first though...
+ const std::string verb = params[1].asString();
+ if (verb == "about")
+ {
+ mClassifiedIds.insert(classified_id);
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(LLUUID(), this);
+ LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(classified_id);
+ return true;
+ }
+
+ return false;
+ }
+
+ void createClassified()
+ {
+ // open the new classified panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = gAgent.getID();
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "create_classified";
+ LLSideTray::getInstance()->showPanel("panel_me", params);
+ }
+
+ void openClassified(LLAvatarClassifiedInfo* c_info)
+ {
+ // open the classified info panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = c_info->creator_id;
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "classified_details";
+ params["classified_id"] = c_info->classified_id;
+ params["classified_avatar_id"] = c_info->creator_id;
+ params["classified_snapshot_id"] = c_info->snapshot_id;
+ params["classified_name"] = c_info->name;
+ params["classified_desc"] = c_info->description;
+ LLSideTray::getInstance()->showPanel("panel_profile_view", params);
+ }
+
+ /*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
+ {
+ if (APT_CLASSIFIED_INFO != type)
+ {
+ return;
+ }
+
+ // is this the classified that we asked for?
+ LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+ if (!c_info || mClassifiedIds.find(c_info->classified_id) == mClassifiedIds.end())
+ {
+ return;
+ }
+
+ // open the detail side tray for this classified
+ openClassified(c_info);
+
+ // remove our observer now that we're done
+ mClassifiedIds.erase(c_info->classified_id);
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(LLUUID(), this);
+ }
+
+};
+LLClassifiedHandler gClassifiedHandler;
+
+//////////////////////////////////////////////////////////////////////////
+
+/**
+ * Copy&Pasted from old LLPanelClassified. This class does nothing at the moment.
+ * Subscribing to "classifiedclickthrough" removes a few warnings.
+ */
+class LLClassifiedClickThrough : public LLDispatchHandler
+{
+public:
+
+ // "classifiedclickthrough"
+ // strings[0] = classified_id
+ // strings[1] = teleport_clicks
+ // strings[2] = map_clicks
+ // strings[3] = profile_clicks
+ virtual bool operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& strings)
+ {
+ if (strings.size() != 4)
+ return false;
+
+ return true;
+ }
+};
+
//-----------------------------------------------------------------------------
// LLPanelPicks
//-----------------------------------------------------------------------------
@@ -73,11 +208,21 @@ LLPanelPicks::LLPanelPicks()
mPopupMenu(NULL),
mProfilePanel(NULL),
mPickPanel(NULL),
- mPicksList(NULL)
- , mPanelPickInfo(NULL)
- , mPanelPickEdit(NULL)
- , mOverflowMenu(NULL)
+ mPicksList(NULL),
+ mClassifiedsList(NULL),
+ mPanelPickInfo(NULL),
+ mPanelPickEdit(NULL),
+ mPlusMenu(NULL),
+ mPicksAccTab(NULL),
+ mClassifiedsAccTab(NULL),
+ mPanelClassifiedInfo(NULL),
+ mPanelClassifiedEdit(NULL),
+ mClickThroughDisp(NULL),
+ mNoClassifieds(false),
+ mNoPicks(false)
{
+ mClickThroughDisp = new LLClassifiedClickThrough();
+ gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp);
}
LLPanelPicks::~LLPanelPicks()
@@ -86,6 +231,8 @@ LLPanelPicks::~LLPanelPicks()
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
}
+
+ delete mClickThroughDisp;
}
void* LLPanelPicks::create(void* data /* = NULL */)
@@ -98,8 +245,16 @@ void LLPanelPicks::updateData()
// Send Picks request only when we need to, not on every onOpen(during tab switch).
if(isDirty())
{
+ mNoPicks = false;
+ mNoClassifieds = false;
+
+ childSetValue("picks_panel_text", LLTrans::getString("PicksClassifiedsLoadingText"));
+
mPicksList->clear();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
+
+ mClassifiedsList->clear();
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
}
}
@@ -113,6 +268,9 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
std::string name, second_name;
gCacheName->getName(getAvatarId(),name,second_name);
childSetTextArg("pick_title", "[NAME]",name);
+
+ // Save selection, to be able to edit same item after saving changes. See EXT-3023.
+ LLUUID selected_id = mPicksList->getSelectedValue()[PICK_ID];
mPicksList->clear();
@@ -138,15 +296,69 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
mPicksList->addItem(picture, pick_value);
- picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickItem, this, _1));
+ // Restore selection by item id.
+ if ( pick_id == selected_id )
+ mPicksList->selectItemByValue(pick_value);
+
+ picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickPickItem, this, _1));
picture->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
picture->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
}
+ showAccordion("tab_picks", mPicksList->size());
+
+ resetDirty();
+ updateButtons();
+ }
+
+ mNoPicks = !mPicksList->size();
+ }
+ else if(APT_CLASSIFIEDS == type)
+ {
+ LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
+ if(c_info && getAvatarId() == c_info->target_id)
+ {
+ mClassifiedsList->clear();
+
+ LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();
+ for(; c_info->classifieds_list.end() != it; ++it)
+ {
+ LLAvatarClassifieds::classified_data c_data = *it;
+
+ LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), c_data.classified_id);
+ c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+ c_item->setClassifiedName(c_data.name);
+
+ LLSD pick_value = LLSD();
+ pick_value.insert(CLASSIFIED_ID, c_data.classified_id);
+ pick_value.insert(CLASSIFIED_NAME, c_data.name);
+
+ mClassifiedsList->addItem(c_item, pick_value);
+
+ c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
+ c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
+ c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
+ }
+
+ showAccordion("tab_classifieds", mClassifiedsList->size());
+
resetDirty();
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
updateButtons();
}
+
+ mNoClassifieds = !mClassifiedsList->size();
+ }
+
+ if (mNoPicks && mNoClassifieds)
+ {
+ if(getAvatarId() == gAgentID)
+ {
+ childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));
+ }
+ else
+ {
+ childSetValue("picks_panel_text", LLTrans::getString("NoAvatarPicksClassifiedsText"));
+ }
}
}
@@ -158,16 +370,43 @@ LLPickItem* LLPanelPicks::getSelectedPickItem()
return dynamic_cast<LLPickItem*>(selected_item);
}
+LLClassifiedItem* LLPanelPicks::getSelectedClassifiedItem()
+{
+ LLPanel* selected_item = mClassifiedsList->getSelectedItem();
+ if (!selected_item)
+ {
+ return NULL;
+ }
+ return dynamic_cast<LLClassifiedItem*>(selected_item);
+}
+
BOOL LLPanelPicks::postBuild()
{
mPicksList = getChild<LLFlatListView>("picks_list");
+ mClassifiedsList = getChild<LLFlatListView>("classifieds_list");
+
+ mPicksList->setCommitOnSelectionChange(true);
+ mClassifiedsList->setCommitOnSelectionChange(true);
- childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickNew, this));
+ mPicksList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mPicksList));
+ mClassifiedsList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mClassifiedsList));
+
+ mPicksList->setNoItemsCommentText(getString("no_picks"));
+ mClassifiedsList->setNoItemsCommentText(getString("no_classifieds"));
+
+ childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickPlusBtn, this));
childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this));
childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this));
childSetAction(XML_BTN_SHOW_ON_MAP, boost::bind(&LLPanelPicks::onClickMap, this));
childSetAction(XML_BTN_INFO, boost::bind(&LLPanelPicks::onClickInfo, this));
- childSetAction(XML_BTN_OVERFLOW, boost::bind(&LLPanelPicks::onOverflowButtonClicked, this));
+
+ mPicksAccTab = getChild<LLAccordionCtrlTab>("tab_picks");
+ mPicksAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mPicksAccTab));
+ mPicksAccTab->setDisplayChildren(true);
+
+ mClassifiedsAccTab = getChild<LLAccordionCtrlTab>("tab_classifieds");
+ mClassifiedsAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mClassifiedsAccTab));
+ mClassifiedsAccTab->setDisplayChildren(false);
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
registar.add("Pick.Info", boost::bind(&LLPanelPicks::onClickInfo, this));
@@ -177,39 +416,52 @@ BOOL LLPanelPicks::postBuild()
registar.add("Pick.Delete", boost::bind(&LLPanelPicks::onClickDelete, this));
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar overflow_registar;
- overflow_registar.add("PicksList.Overflow", boost::bind(&LLPanelPicks::onOverflowMenuItemClicked, this, _2));
- mOverflowMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar;
+ plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2));
+ mEnableCallbackRegistrar.add("Picks.Plus.Enable", boost::bind(&LLPanelPicks::isActionEnabled, this, _2));
+ mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
return TRUE;
}
-void LLPanelPicks::onOverflowMenuItemClicked(const LLSD& param)
+void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param)
{
std::string value = param.asString();
- if("info" == value)
+ if("new_pick" == value)
{
- onClickInfo();
+ createNewPick();
}
- else if("teleport" == value)
+ else if("new_classified" == value)
{
- onClickTeleport();
+ createNewClassified();
}
- else if("map" == value)
+}
+
+bool LLPanelPicks::isActionEnabled(const LLSD& userdata) const
+{
+ std::string command_name = userdata.asString();
+
+ if (command_name == "new_pick" && LLAgentPicksInfo::getInstance()->isPickLimitReached())
{
- onClickMap();
+ return false;
}
+
+ return true;
}
-void LLPanelPicks::onOverflowButtonClicked()
+void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
{
- LLRect rect;
- childGetRect(XML_BTN_OVERFLOW, rect);
+ if(!mPicksAccTab->getDisplayChildren())
+ {
+ mPicksList->resetSelection(true);
+ }
+ if(!mClassifiedsAccTab->getDisplayChildren())
+ {
+ mClassifiedsList->resetSelection(true);
+ }
- mOverflowMenu->updateParent(LLMenuGL::sMenuContainer);
- mOverflowMenu->setButtonRect(rect, this);
- LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);
+ updateButtons();
}
void LLPanelPicks::onOpen(const LLSD& key)
@@ -242,6 +494,9 @@ void LLPanelPicks::onOpen(const LLSD& key)
if(getAvatarId() != id)
{
+ showAccordion("tab_picks", false);
+ showAccordion("tab_classifieds", false);
+
mPicksList->goToTop();
// Set dummy value to make panel dirty and make it reload picks
setValue(LLSD());
@@ -250,21 +505,62 @@ void LLPanelPicks::onOpen(const LLSD& key)
LLPanelProfileTab::onOpen(key);
}
+void LLPanelPicks::onClosePanel()
+{
+ if (mPanelClassifiedInfo)
+ {
+ onPanelClassifiedClose(mPanelClassifiedInfo);
+ }
+ if (mPanelPickInfo)
+ {
+ onPanelPickClose(mPanelPickInfo);
+ }
+}
+
+void LLPanelPicks::onListCommit(const LLFlatListView* f_list)
+{
+ // Make sure only one of the lists has selection.
+ if(f_list == mPicksList)
+ {
+ mClassifiedsList->resetSelection(true);
+ }
+ else if(f_list == mClassifiedsList)
+ {
+ mPicksList->resetSelection(true);
+ }
+ else
+ {
+ llwarns << "Unknown list" << llendl;
+ }
+
+ updateButtons();
+}
+
//static
void LLPanelPicks::onClickDelete()
{
- LLSD pick_value = mPicksList->getSelectedValue();
- if (pick_value.isUndefined()) return;
+ LLSD value = mPicksList->getSelectedValue();
+ if (value.isDefined())
+ {
+ LLSD args;
+ args["PICK"] = value[PICK_NAME];
+ LLNotificationsUtil::add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2));
+ return;
+ }
- LLSD args;
- args["PICK"] = pick_value[PICK_NAME];
- LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDelete, this, _1, _2));
+ value = mClassifiedsList->getSelectedValue();
+ if(value.isDefined())
+ {
+ LLSD args;
+ args["NAME"] = value[CLASSIFIED_NAME];
+ LLNotificationsUtil::add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2));
+ return;
+ }
}
-bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response)
+bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
-
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLSD pick_value = mPicksList->getSelectedValue();
if (0 == option)
@@ -276,9 +572,23 @@ bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response
return false;
}
+bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLSD value = mClassifiedsList->getSelectedValue();
+
+ if (0 == option)
+ {
+ LLAvatarPropertiesProcessor::instance().sendClassifiedDelete(value[CLASSIFIED_ID]);
+ mClassifiedsList->removeItemByValue(value);
+ }
+ updateButtons();
+ return false;
+}
+
bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& response )
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
@@ -291,9 +601,14 @@ bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& respo
void LLPanelPicks::onClickTeleport()
{
LLPickItem* pick_item = getSelectedPickItem();
- if (!pick_item) return;
+ LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+ LLVector3d pos;
+ if(pick_item)
+ pos = pick_item->getPosGlobal();
+ else if(c_item)
+ pos = c_item->getPosGlobal();
- LLVector3d pos = pick_item->getPosGlobal();
if (!pos.isExactlyZero())
{
gAgent.teleportViaLocation(pos);
@@ -305,9 +620,15 @@ void LLPanelPicks::onClickTeleport()
void LLPanelPicks::onClickMap()
{
LLPickItem* pick_item = getSelectedPickItem();
- if (!pick_item) return;
+ LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+ LLVector3d pos;
+ if (pick_item)
+ pos = pick_item->getPosGlobal();
+ else if(c_item)
+ pos = c_item->getPosGlobal();
- LLFloaterWorldMap::getInstance()->trackLocation(pick_item->getPosGlobal());
+ LLFloaterWorldMap::getInstance()->trackLocation(pos);
LLFloaterReg::showInstance("world_map", "center");
}
@@ -325,30 +646,38 @@ void LLPanelPicks::onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask)
}
}
-void LLPanelPicks::onDoubleClickItem(LLUICtrl* item)
+void LLPanelPicks::onDoubleClickPickItem(LLUICtrl* item)
{
LLSD pick_value = mPicksList->getSelectedValue();
if (pick_value.isUndefined()) return;
LLSD args;
args["PICK"] = pick_value[PICK_NAME];
- LLNotifications::instance().add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));
+ LLNotificationsUtil::add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));
+}
+
+void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item)
+{
+ LLSD value = mClassifiedsList->getSelectedValue();
+ if (value.isUndefined()) return;
+
+ LLSD args;
+ args["CLASSIFIED"] = value[CLASSIFIED_NAME];
+ LLNotificationsUtil::add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2));
}
void LLPanelPicks::updateButtons()
{
- bool has_selected = mPicksList->numSelected();
+ bool has_selected = mPicksList->numSelected() > 0 || mClassifiedsList->numSelected() > 0;
if (getAvatarId() == gAgentID)
{
- childSetEnabled(XML_BTN_NEW, !LLAgentPicksInfo::getInstance()->isPickLimitReached());
childSetEnabled(XML_BTN_DELETE, has_selected);
}
childSetEnabled(XML_BTN_INFO, has_selected);
childSetEnabled(XML_BTN_TELEPORT, has_selected);
childSetEnabled(XML_BTN_SHOW_ON_MAP, has_selected);
- childSetEnabled(XML_BTN_OVERFLOW, has_selected);
}
void LLPanelPicks::setProfilePanel(LLPanelProfile* profile_panel)
@@ -366,15 +695,44 @@ void LLPanelPicks::buildPickPanel()
// }
}
-void LLPanelPicks::onClickNew()
+void LLPanelPicks::onClickPlusBtn()
+{
+ LLRect rect;
+ childGetRect(XML_BTN_NEW, rect);
+
+ mPlusMenu->updateParent(LLMenuGL::sMenuContainer);
+ mPlusMenu->setButtonRect(rect, this);
+ LLMenuGL::showPopup(this, mPlusMenu, rect.mLeft, rect.mTop);
+}
+
+void LLPanelPicks::createNewPick()
{
createPickEditPanel();
getProfilePanel()->openPanel(mPanelPickEdit, LLSD());
}
+void LLPanelPicks::createNewClassified()
+{
+ createClassifiedEditPanel();
+
+ getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD());
+}
+
void LLPanelPicks::onClickInfo()
{
+ if(mPicksList->numSelected() > 0)
+ {
+ openPickInfo();
+ }
+ else if(mClassifiedsList->numSelected() > 0)
+ {
+ openClassifiedInfo();
+ }
+}
+
+void LLPanelPicks::openPickInfo()
+{
LLSD selected_value = mPicksList->getSelectedValue();
if (selected_value.isUndefined()) return;
@@ -392,6 +750,43 @@ void LLPanelPicks::onClickInfo()
getProfilePanel()->openPanel(mPanelPickInfo, params);
}
+void LLPanelPicks::openClassifiedInfo()
+{
+ LLSD selected_value = mClassifiedsList->getSelectedValue();
+ if (selected_value.isUndefined()) return;
+
+ LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+ openClassifiedInfo(c_item->getClassifiedId(), c_item->getAvatarId(),
+ c_item->getSnapshotId(), c_item->getClassifiedName(),
+ c_item->getDescription());
+}
+
+void LLPanelPicks::openClassifiedInfo(const LLUUID &classified_id,
+ const LLUUID &avatar_id,
+ const LLUUID &snapshot_id,
+ const std::string &name, const std::string &desc)
+{
+ createClassifiedInfoPanel();
+
+ LLSD params;
+ params["classified_id"] = classified_id;
+ params["avatar_id"] = avatar_id;
+ params["snapshot_id"] = snapshot_id;
+ params["name"] = name;
+ params["desc"] = desc;
+
+ getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
+}
+
+void LLPanelPicks::showAccordion(const std::string& name, bool show)
+{
+ LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
+ tab->setVisible(show);
+ LLAccordionCtrl* acc = getChild<LLAccordionCtrl>("accordion");
+ acc->arrange();
+}
+
void LLPanelPicks::onPanelPickClose(LLPanel* panel)
{
panel->setVisible(FALSE);
@@ -403,6 +798,73 @@ void LLPanelPicks::onPanelPickSave(LLPanel* panel)
updateButtons();
}
+void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
+{
+ if(!panel->canClose())
+ {
+ return;
+ }
+
+ if(panel->isNew())
+ {
+ LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId());
+
+ c_item->setClassifiedName(panel->getClassifiedName());
+ c_item->setDescription(panel->getDescription());
+ c_item->setSnapshotId(panel->getSnapshotId());
+
+ LLSD c_value;
+ c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId());
+ c_value.insert(CLASSIFIED_NAME, c_item->getClassifiedName());
+ mClassifiedsList->addItem(c_item, c_value, ADD_TOP);
+
+ c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
+ c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
+ c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
+ c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+
+ // order does matter, showAccordion will invoke arrange for accordions.
+ mClassifiedsAccTab->changeOpenClose(false);
+ showAccordion("tab_classifieds", true);
+ }
+ else
+ {
+ onPanelClassifiedClose(panel);
+ return;
+ }
+
+ onPanelPickClose(panel);
+ updateButtons();
+}
+
+void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
+{
+ if(panel->getInfoLoaded() && !panel->isDirty())
+ {
+ std::vector<LLSD> values;
+ mClassifiedsList->getValues(values);
+ for(size_t n = 0; n < values.size(); ++n)
+ {
+ LLUUID c_id = values[n][CLASSIFIED_ID].asUUID();
+ if(panel->getClassifiedId() == c_id)
+ {
+ LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
+ mClassifiedsList->getItemByValue(values[n]));
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->setClassifiedName(panel->getClassifiedName());
+ c_item->setDescription(panel->getDescription());
+ c_item->setSnapshotId(panel->getSnapshotId());
+ }
+ }
+ }
+ }
+
+ onPanelPickClose(panel);
+ updateButtons();
+}
+
void LLPanelPicks::createPickInfoPanel()
{
if(!mPanelPickInfo)
@@ -414,6 +876,29 @@ void LLPanelPicks::createPickInfoPanel()
}
}
+void LLPanelPicks::createClassifiedInfoPanel()
+{
+ if(!mPanelClassifiedInfo)
+ {
+ mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
+ mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
+ mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
+ mPanelClassifiedInfo->setVisible(FALSE);
+ }
+}
+
+void LLPanelPicks::createClassifiedEditPanel()
+{
+ if(!mPanelClassifiedEdit)
+ {
+ mPanelClassifiedEdit = LLPanelClassifiedEdit::create();
+ mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
+ mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit));
+ mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
+ mPanelClassifiedEdit->setVisible(FALSE);
+ }
+}
+
void LLPanelPicks::createPickEditPanel()
{
if(!mPanelPickEdit)
@@ -473,9 +958,38 @@ void LLPanelPicks::onPanelPickEdit()
getProfilePanel()->openPanel(mPanelPickEdit, params);
}
+void LLPanelPicks::onPanelClassifiedEdit()
+{
+ LLSD selected_value = mClassifiedsList->getSelectedValue();
+ if (selected_value.isUndefined())
+ {
+ return;
+ }
+
+ LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+
+ createClassifiedEditPanel();
+
+ LLSD params;
+ params["classified_id"] = c_item->getClassifiedId();
+ params["avatar_id"] = c_item->getAvatarId();
+ params["snapshot_id"] = c_item->getSnapshotId();
+ params["name"] = c_item->getClassifiedName();
+ params["desc"] = c_item->getDescription();
+
+ getProfilePanel()->openPanel(mPanelClassifiedEdit, params);
+}
+
void LLPanelPicks::onClickMenuEdit()
{
- onPanelPickEdit();
+ if(getSelectedPickItem())
+ {
+ onPanelPickEdit();
+ }
+ else if(getSelectedClassifiedItem())
+ {
+ onPanelClassifiedEdit();
+ }
}
inline LLPanelProfile* LLPanelPicks::getProfilePanel()
@@ -610,3 +1124,80 @@ void LLPickItem::setValue(const LLSD& value)
if (!value.has("selected")) return;
childSetVisible("selected_icon", value["selected"]);
}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLClassifiedItem::LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id)
+ : LLPanel()
+ , mAvatarId(avatar_id)
+ , mClassifiedId(classified_id)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this,"panel_classifieds_list_item.xml");
+
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+ LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+}
+
+LLClassifiedItem::~LLClassifiedItem()
+{
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+void LLClassifiedItem::processProperties(void* data, EAvatarProcessorType type)
+{
+ if(APT_CLASSIFIED_INFO != type)
+ {
+ return;
+ }
+
+ LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+ if( !c_info || c_info->classified_id != getClassifiedId() )
+ {
+ return;
+ }
+
+ setClassifiedName(c_info->name);
+ setDescription(c_info->description);
+ setSnapshotId(c_info->snapshot_id);
+ setPosGlobal(c_info->pos_global);
+
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+BOOL LLClassifiedItem::postBuild()
+{
+ setMouseEnterCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", true));
+ setMouseLeaveCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", false));
+ return TRUE;
+}
+
+void LLClassifiedItem::setValue(const LLSD& value)
+{
+ if (!value.isMap()) return;;
+ if (!value.has("selected")) return;
+ childSetVisible("selected_icon", value["selected"]);
+}
+
+void LLClassifiedItem::setClassifiedName(const std::string& name)
+{
+ childSetValue("name", name);
+}
+
+void LLClassifiedItem::setDescription(const std::string& desc)
+{
+ childSetValue("description", desc);
+}
+
+void LLClassifiedItem::setSnapshotId(const LLUUID& snapshot_id)
+{
+ childSetValue("picture", snapshot_id);
+}
+
+LLUUID LLClassifiedItem::getSnapshotId()
+{
+ return childGetValue("picture");
+}
+
+//EOF
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 06a0f0a0fd..3f757e482e 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -40,6 +40,7 @@
#include "llpanelavatar.h"
#include "llregistry.h"
+class LLAccordionCtrlTab;
class LLPanelProfile;
class LLMessageSystem;
class LLVector3d;
@@ -47,10 +48,18 @@ class LLPanelProfileTab;
class LLAgent;
class LLMenuGL;
class LLPickItem;
+class LLClassifiedItem;
class LLFlatListView;
class LLPanelPickInfo;
class LLPanelPickEdit;
class LLToggleableMenu;
+class LLPanelClassifiedInfo;
+class LLPanelClassifiedEdit;
+class LLClassifiedClickThrough;
+
+// *TODO
+// Panel Picks has been consolidated with Classifieds (EXT-2095), give LLPanelPicks
+// and corresponding files (cpp, h, xml) a new name. (new name is TBD at the moment)
class LLPanelPicks
: public LLPanelProfileTab
@@ -65,59 +74,97 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClosePanel();
+
void processProperties(void* data, EAvatarProcessorType type);
void updateData();
// returns the selected pick item
LLPickItem* getSelectedPickItem();
+ LLClassifiedItem* getSelectedClassifiedItem();
//*NOTE top down approch when panel toggling is done only by
- // parent panels failed to work (picks related code was in me profile panel)
+ // parent panels failed to work (picks related code was in my profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
+protected:
+ /*virtual*/void updateButtons();
+
private:
void onClickDelete();
void onClickTeleport();
void onClickMap();
- void onOverflowMenuItemClicked(const LLSD& param);
- void onOverflowButtonClicked();
+ void onPlusMenuItemClicked(const LLSD& param);
+ bool isActionEnabled(const LLSD& userdata) const;
+
+ void onListCommit(const LLFlatListView* f_list);
+ void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab);
//------------------------------------------------
// Callbacks which require panel toggling
//------------------------------------------------
- void onClickNew();
+ void onClickPlusBtn();
void onClickInfo();
void onPanelPickClose(LLPanel* panel);
void onPanelPickSave(LLPanel* panel);
+ void onPanelClassifiedSave(LLPanelClassifiedEdit* panel);
+ void onPanelClassifiedClose(LLPanelClassifiedInfo* panel);
void onPanelPickEdit();
+ void onPanelClassifiedEdit();
void onClickMenuEdit();
+ void createNewPick();
+ void createNewClassified();
+
+ void openPickInfo();
+ void openClassifiedInfo();
+ void openClassifiedInfo(const LLUUID &classified_id, const LLUUID &avatar_id,
+ const LLUUID &snapshot_id, const std::string &name,
+ const std::string &desc);
+ friend class LLPanelProfile;
+
+ void showAccordion(const std::string& name, bool show);
+
void buildPickPanel();
- bool callbackDelete(const LLSD& notification, const LLSD& response);
+ bool callbackDeletePick(const LLSD& notification, const LLSD& response);
+ bool callbackDeleteClassified(const LLSD& notification, const LLSD& response);
bool callbackTeleport(const LLSD& notification, const LLSD& response);
- void updateButtons();
- virtual void onDoubleClickItem(LLUICtrl* item);
+ virtual void onDoubleClickPickItem(LLUICtrl* item);
+ virtual void onDoubleClickClassifiedItem(LLUICtrl* item);
virtual void onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask);
LLPanelProfile* getProfilePanel();
void createPickInfoPanel();
void createPickEditPanel();
-// void openPickEditPanel(LLPickItem* pick);
-// void openPickInfoPanel(LLPickItem* pick);
+ void createClassifiedInfoPanel();
+ void createClassifiedEditPanel();
LLMenuGL* mPopupMenu;
LLPanelProfile* mProfilePanel;
LLPanelPickInfo* mPickPanel;
LLFlatListView* mPicksList;
+ LLFlatListView* mClassifiedsList;
LLPanelPickInfo* mPanelPickInfo;
+ LLPanelClassifiedInfo* mPanelClassifiedInfo;
+ LLPanelClassifiedEdit* mPanelClassifiedEdit;
LLPanelPickEdit* mPanelPickEdit;
- LLToggleableMenu* mOverflowMenu;
+ LLToggleableMenu* mPlusMenu;
+
+ LLAccordionCtrlTab* mPicksAccTab;
+ LLAccordionCtrlTab* mClassifiedsAccTab;
+
+ LLClassifiedClickThrough* mClickThroughDisp;
+
+ //true if picks list is empty after processing picks
+ bool mNoPicks;
+ //true if classifieds list is empty after processing classifieds
+ bool mNoClassifieds;
};
class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
@@ -189,4 +236,48 @@ protected:
std::string mSimName;
};
+class LLClassifiedItem : public LLPanel, public LLAvatarPropertiesObserver
+{
+public:
+
+ LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id);
+
+ virtual ~LLClassifiedItem();
+
+ /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void setValue(const LLSD& value);
+
+ LLUUID getAvatarId() {return mAvatarId;}
+
+ void setAvatarId(const LLUUID& avatar_id) {mAvatarId = avatar_id;}
+
+ LLUUID getClassifiedId() {return mClassifiedId;}
+
+ void setClassifiedId(const LLUUID& classified_id) {mClassifiedId = classified_id;}
+
+ void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+
+ const LLVector3d& getPosGlobal() { return mPosGlobal; }
+
+ void setClassifiedName (const std::string& name);
+
+ std::string getClassifiedName() { return childGetValue("name").asString(); }
+
+ void setDescription(const std::string& desc);
+
+ std::string getDescription() { return childGetValue("description").asString(); }
+
+ void setSnapshotId(const LLUUID& snapshot_id);
+
+ LLUUID getSnapshotId();
+
+private:
+ LLUUID mAvatarId;
+ LLUUID mClassifiedId;
+ LLVector3d mPosGlobal;
+};
+
#endif // LL_LLPANELPICKS_H
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 61e18195b8..6985b73200 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -40,12 +40,14 @@
#include "llsecondlifeurls.h"
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "llregionhandle.h"
#include "llagent.h"
#include "llviewerwindow.h"
#include "llbutton.h"
#include "llfloaterworldmap.h"
#include "lllineeditor.h"
+#include "llnotificationsutil.h"
#include "lluiconstants.h"
#include "lltextbox.h"
#include "lltexteditor.h"
@@ -401,13 +403,13 @@ void LLPanelPlace::onClickAuction(void* data)
LLSD args;
args["AUCTION_ID"] = self->mAuctionID;
- LLNotifications::instance().add("GoToAuctionPage", args);
+ LLNotificationsUtil::add("GoToAuctionPage", args);
}
/*
// static
bool LLPanelPlace::callbackAuctionWebPage(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
std::string url;
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 5af27a5ec1..9ebc8ca2b9 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -1,10 +1,10 @@
/**
* @file llpanelplaceinfo.cpp
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -34,70 +34,36 @@
#include "llpanelplaceinfo.h"
-#include "roles_constants.h"
#include "llsdutil.h"
-#include "llsecondlifeurls.h"
-#include "llinventory.h"
-#include "llparcel.h"
+#include "llsdutil_math.h"
-#include "llqueryflags.h"
+#include "llregionhandle.h"
-#include "llbutton.h"
-#include "llcombobox.h"
#include "lliconctrl.h"
-#include "llscrollcontainer.h"
#include "lltextbox.h"
+
#include "lltrans.h"
-#include "llaccordionctrl.h"
-#include "llaccordionctrltab.h"
#include "llagent.h"
-#include "llagentui.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llcallbacklist.h"
#include "llexpandabletextbox.h"
-#include "llfloaterworldmap.h"
-#include "llfloaterbuycurrency.h"
-#include "llinventorymodel.h"
-#include "lllandmarkactions.h"
#include "llpanelpick.h"
#include "lltexturectrl.h"
-#include "llstatusbar.h"
-#include "llviewerinventory.h"
-#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
-#include "llviewercontrol.h"
-#include "llviewertexteditor.h"
-#include "llworldmap.h"
-#include "llsdutil_math.h"
-
-//----------------------------------------------------------------------------
-// Aux types and methods
-//----------------------------------------------------------------------------
-
-typedef std::pair<LLUUID, std::string> folder_pair_t;
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
-
-static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info");
LLPanelPlaceInfo::LLPanelPlaceInfo()
: LLPanel(),
mParcelID(),
mRequestedID(),
mPosRegion(),
- mLandmarkID(),
- mMinHeight(0),
+ mScrollingPanelMinHeight(0),
+ mScrollingPanelWidth(0),
+ mInfoType(UNKNOWN),
mScrollingPanel(NULL),
- mInfoPanel(NULL),
- mMediaPanel(NULL),
- mForSalePanel(NULL),
- mYouAreHerePanel(NULL),
- mSelectedParcelID(-1)
+ mScrollContainer(NULL)
{}
+//virtual
LLPanelPlaceInfo::~LLPanelPlaceInfo()
{
if (mParcelID.notNull())
@@ -106,220 +72,45 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo()
}
}
+//virtual
BOOL LLPanelPlaceInfo::postBuild()
{
- mTitle = getChild<LLTextBox>("panel_title");
+ mTitle = getChild<LLTextBox>("title");
mCurrentTitle = mTitle->getText();
- mForSalePanel = getChild<LLPanel>("for_sale_panel");
- mYouAreHerePanel = getChild<LLPanel>("here_panel");
- gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this);
-
- //Icon value should contain sale price of last selected parcel.
- mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
- setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this));
-
mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
mRegionName = getChild<LLTextBox>("region_title");
mParcelName = getChild<LLTextBox>("parcel_title");
mDescEditor = getChild<LLExpandableTextBox>("description");
+ mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon");
mMaturityRatingText = getChild<LLTextBox>("maturity_value");
- mParcelOwner = getChild<LLTextBox>("owner_value");
- mLastVisited = getChild<LLTextBox>("last_visited_value");
-
- mRatingText = getChild<LLTextBox>("rating_value");
- mVoiceText = getChild<LLTextBox>("voice_value");
- mFlyText = getChild<LLTextBox>("fly_value");
- mPushText = getChild<LLTextBox>("push_value");
- mBuildText = getChild<LLTextBox>("build_value");
- mScriptsText = getChild<LLTextBox>("scripts_value");
- mDamageText = getChild<LLTextBox>("damage_value");
-
- mRegionNameText = getChild<LLTextBox>("region_name");
- mRegionTypeText = getChild<LLTextBox>("region_type");
- mRegionRatingText = getChild<LLTextBox>("region_rating");
- mRegionOwnerText = getChild<LLTextBox>("region_owner");
- mRegionGroupText = getChild<LLTextBox>("region_group");
-
- mEstateNameText = getChild<LLTextBox>("estate_name");
- mEstateRatingText = getChild<LLTextBox>("estate_rating");
- mEstateOwnerText = getChild<LLTextBox>("estate_owner");
- mCovenantText = getChild<LLTextEditor>("covenant");
-
- mSalesPriceText = getChild<LLTextBox>("sales_price");
- mAreaText = getChild<LLTextBox>("area");
- mTrafficText = getChild<LLTextBox>("traffic");
- mPrimitivesText = getChild<LLTextBox>("primitives");
- mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
- mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
- mSubdivideText = getChild<LLTextEditor>("subdivide");
- mResaleText = getChild<LLTextEditor>("resale");
- mSaleToText = getChild<LLTextBox>("sale_to");
-
- mOwner = getChild<LLTextBox>("owner");
- mCreator = getChild<LLTextBox>("creator");
- mCreated = getChild<LLTextBox>("created");
-
- mTitleEditor = getChild<LLLineEditor>("title_editor");
- mNotesEditor = getChild<LLTextEditor>("notes_editor");
- mFolderCombo = getChild<LLComboBox>("folder_combo");
-
- LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container");
- scroll_container->setBorderVisible(FALSE);
- mMinHeight = scroll_container->getScrolledViewRect().getHeight();
mScrollingPanel = getChild<LLPanel>("scrolling_panel");
- mInfoPanel = getChild<LLPanel>("info_panel");
- mMediaPanel = getChild<LLMediaPanel>("media_panel");
- if (!mMediaPanel)
- return FALSE;
-
- return TRUE;
-}
-
-void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem)
-{
- if (!pItem)
- return;
-
- mLandmarkID = pItem->getUUID();
+ mScrollContainer = getChild<LLScrollContainer>("place_scroll");
- if(!gCacheName)
- return;
-
- const LLPermissions& perm = pItem->getPermissions();
-
- //////////////////
- // CREATOR NAME //
- //////////////////
- if (pItem->getCreatorUUID().notNull())
- {
- std::string name;
- LLUUID creator_id = pItem->getCreatorUUID();
- if (!gCacheName->getFullName(creator_id, name))
- {
- gCacheName->get(creator_id, FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3));
- }
- mCreator->setText(name);
- }
- else
- {
- mCreator->setText(getString("unknown"));
- }
+ mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
+ mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
- ////////////////
- // OWNER NAME //
- ////////////////
- if(perm.isOwned())
- {
- std::string name;
- if (perm.isGroupOwned())
- {
- LLUUID group_id = perm.getGroup();
- if (!gCacheName->getGroupName(group_id, name))
- {
- gCacheName->get(group_id, TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
- }
- }
- else
- {
- LLUUID owner_id = perm.getOwner();
- if (!gCacheName->getFullName(owner_id, name))
- {
- gCacheName->get(owner_id, FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
- }
- }
- mOwner->setText(name);
- }
- else
- {
- mOwner->setText(getString("public"));
- }
-
- //////////////////
- // ACQUIRE DATE //
- //////////////////
- time_t time_utc = pItem->getCreationDate();
- if (0 == time_utc)
- {
- mCreated->setText(getString("unknown"));
- }
- else
- {
- std::string timeStr = getString("acquired_date");
- LLSD substitution;
- substitution["datetime"] = (S32) time_utc;
- LLStringUtil::format (timeStr, substitution);
- mCreated->setText(timeStr);
- }
-
- mTitleEditor->setText(pItem->getName());
- mNotesEditor->setText(pItem->getDescription());
-}
-
-void LLPanelPlaceInfo::nameUpdatedCallback(
- LLTextBox* text,
- const std::string& first,
- const std::string& last)
-{
- text->setText(first + " " + last);
+ return TRUE;
}
+//virtual
void LLPanelPlaceInfo::resetLocation()
{
mParcelID.setNull();
mRequestedID.setNull();
- mLandmarkID.setNull();
mPosRegion.clearVec();
- mForSalePanel->setVisible(FALSE);
- mYouAreHerePanel->setVisible(FALSE);
- std::string not_available = getString("not_available");
- mMaturityRatingText->setValue(not_available);
- mParcelOwner->setValue(not_available);
- mLastVisited->setValue(not_available);
- mRegionName->setText(not_available);
- mParcelName->setText(not_available);
- mDescEditor->setText(not_available);
- mCreator->setText(not_available);
- mOwner->setText(not_available);
- mCreated->setText(not_available);
- mTitleEditor->setText(LLStringUtil::null);
- mNotesEditor->setText(LLStringUtil::null);
- mSnapshotCtrl->setImageAssetID(LLUUID::null);
- mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c");
- mRatingText->setText(not_available);
- mVoiceText->setText(not_available);
- mFlyText->setText(not_available);
- mPushText->setText(not_available);
- mBuildText->setText(not_available);
- mParcelScriptsText->setText(not_available);
- mDamageText->setText(not_available);
+ std::string loading = LLTrans::getString("LoadingData");
+ mMaturityRatingIcon->setValue(loading);
+ mMaturityRatingText->setValue(loading);
+ mRegionName->setText(loading);
+ mParcelName->setText(loading);
+ mDescEditor->setText(loading);
- mRegionNameText->setValue(not_available);
- mRegionTypeText->setValue(not_available);
- mRegionRatingText->setValue(not_available);
- mRegionOwnerText->setValue(not_available);
- mRegionGroupText->setValue(not_available);
-
- mEstateNameText->setValue(not_available);
- mEstateRatingText->setValue(not_available);
- mEstateOwnerText->setValue(not_available);
- mCovenantText->setValue(not_available);
-
- mSalesPriceText->setValue(not_available);
- mAreaText->setValue(not_available);
- mTrafficText->setValue(not_available);
- mPrimitivesText->setValue(not_available);
- mParcelScriptsText->setValue(not_available);
- mTerraformLimitsText->setValue(not_available);
- mSubdivideText->setValue(not_available);
- mResaleText->setValue(not_available);
- mSaleToText->setValue(not_available);
+ mSnapshotCtrl->setImageAssetID(LLUUID::null);
+ mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c");
}
//virtual
@@ -329,108 +120,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)
sendParcelInfoRequest();
}
-void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
+//virtual
+void LLPanelPlaceInfo::setInfoType(EInfoType type)
{
- LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
- LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel");
-
- bool is_info_type_agent = type == AGENT;
- bool is_info_type_create_landmark = type == CREATE_LANDMARK;
- bool is_info_type_landmark = type == LANDMARK;
- bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
-
- getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
- mMaturityRatingText->setVisible(!is_info_type_agent);
-
- getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
- mParcelOwner->setVisible(is_info_type_agent);
-
- getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
- mLastVisited->setVisible(is_info_type_teleport_history);
-
- landmark_info_panel->setVisible(is_info_type_landmark);
- landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark);
-
- getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark);
- mFolderCombo->setVisible(is_info_type_create_landmark);
-
- getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
-
- switch(type)
- {
- case CREATE_LANDMARK:
- mCurrentTitle = getString("title_create_landmark");
-
- mTitleEditor->setEnabled(TRUE);
- mNotesEditor->setEnabled(TRUE);
-
- populateFoldersList();
- break;
-
- case AGENT:
- case PLACE:
- mCurrentTitle = getString("title_place");
-
- if (!isMediaPanelVisible())
- {
- mTitle->setText(mCurrentTitle);
- }
- break;
-
- case LANDMARK:
- mCurrentTitle = getString("title_landmark");
-
- mTitleEditor->setEnabled(FALSE);
- mNotesEditor->setEnabled(FALSE);
-
- populateFoldersList();
- break;
-
- case TELEPORT_HISTORY:
- mCurrentTitle = getString("title_teleport_history");
- break;
- }
-
- if (type != AGENT)
- toggleMediaPanel(FALSE);
+ mTitle->setText(mCurrentTitle);
mInfoType = type;
}
-BOOL LLPanelPlaceInfo::isMediaPanelVisible()
+void LLPanelPlaceInfo::sendParcelInfoRequest()
{
- if (!mMediaPanel)
- return FALSE;
+ if (mParcelID != mRequestedID)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
- return mMediaPanel->getVisible();
+ mRequestedID = mParcelID;
+ }
}
-void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible)
+void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
+ const LLVector3d& pos_global)
{
- if (!mMediaPanel)
- return;
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
- if (visible)
+ mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+ (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+ (F32)pos_global.mdV[VZ]);
+
+ LLSD body;
+ std::string url = region->getCapability("RemoteParcelRequest");
+ if (!url.empty())
{
- mTitle->setText(getString("title_media"));
+ body["location"] = ll_sd_from_vector3(mPosRegion);
+ if (!region_id.isNull())
+ {
+ body["region_id"] = region_id;
+ }
+ if (!pos_global.isExactlyZero())
+ {
+ U64 region_handle = to_region_handle(pos_global);
+ body["region_handle"] = ll_sd_from_U64(region_handle);
+ }
+ LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
}
else
{
- mTitle->setText(mCurrentTitle);
- }
-
- mInfoPanel->setVisible(!visible);
- mMediaPanel->setVisible(visible);
-}
-
-void LLPanelPlaceInfo::sendParcelInfoRequest()
-{
- if (mParcelID != mRequestedID)
- {
- LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
- LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
-
- mRequestedID = mParcelID;
+ mDescEditor->setText(getString("server_update_text"));
}
}
@@ -471,28 +209,11 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
{
mDescEditor->setText(parcel_data.desc);
}
-
- // HACK: Flag 0x2 == adult region,
- // Flag 0x1 == mature region, otherwise assume PG
- std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
- if (parcel_data.flags & 0x2)
- {
- rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
- }
- else if (parcel_data.flags & 0x1)
+ else
{
- rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
+ mDescEditor->setText(getString("not_available"));
}
- mMaturityRatingText->setValue(rating);
- mRatingText->setValue(rating);
-
- //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE
- //because we deal with remote parcel response format
- bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
- mInfoType == AGENT ? TRUE : FALSE;
- mForSalePanel->setVisible(is_for_sale);
-
S32 region_x;
S32 region_y;
S32 region_z;
@@ -513,585 +234,56 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
if (!parcel_data.name.empty())
{
+ mParcelTitle = parcel_data.name;
+
mParcelName->setText(llformat("%s (%d, %d, %d)",
- parcel_data.name.c_str(), region_x, region_y, region_z));
+ mParcelTitle.c_str(), region_x, region_y, region_z));
}
else
{
mParcelName->setText(getString("not_available"));
}
-
- if (mInfoType == CREATE_LANDMARK)
- {
- if (parcel_data.name.empty())
- {
- mTitleEditor->setText(llformat("%s (%d, %d, %d)",
- parcel_data.sim_name.c_str(), region_x, region_y, region_z));
- }
- else
- {
- mTitleEditor->setText(parcel_data.name);
- }
-
- // FIXME: Creating landmark works only for current agent location.
- std::string desc;
- LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
- mNotesEditor->setText(desc);
-
- if (!LLLandmarkActions::landmarkAlreadyExists())
- {
- createLandmark(mFolderCombo->getValue().asUUID());
- }
- }
}
-void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
- const LLVector3d& pos_global)
+// virtual
+void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLViewerRegion* region = gAgent.getRegion();
- if (!region)
- return;
+ LLPanel::reshape(width, height, called_from_parent);
- mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
- (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
- (F32)pos_global.mdV[VZ]);
-
- LLSD body;
- std::string url = region->getCapability("RemoteParcelRequest");
- if (!url.empty())
- {
- body["location"] = ll_sd_from_vector3(mPosRegion);
- if (!region_id.isNull())
- {
- body["region_id"] = region_id;
- }
- if (!pos_global.isExactlyZero())
- {
- U64 region_handle = to_region_handle(pos_global);
- body["region_handle"] = ll_sd_from_U64(region_handle);
- }
- LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
- }
- else
- {
- mDescEditor->setText(getString("server_update_text"));
- }
-}
-
-void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel,
- LLViewerRegion* region,
- const LLVector3d& pos_global,
- bool is_current_parcel)
-{
- if (!region || !parcel)
+ if (!mScrollContainer || !mScrollingPanel)
return;
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
-
- LLParcelData parcel_data;
-
- // HACK: Converting sim access flags to the format
- // returned by remote parcel response.
- switch(region->getSimAccess())
- {
- case SIM_ACCESS_MATURE:
- parcel_data.flags = 0x1;
- break;
-
- case SIM_ACCESS_ADULT:
- parcel_data.flags = 0x2;
- break;
-
- default:
- parcel_data.flags = 0;
- }
- parcel_data.desc = parcel->getDesc();
- parcel_data.name = parcel->getName();
- parcel_data.sim_name = region->getName();
- parcel_data.snapshot_id = parcel->getSnapshotID();
- mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
- (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
- (F32)pos_global.mdV[VZ]);
- parcel_data.global_x = pos_global.mdV[VX];
- parcel_data.global_y = pos_global.mdV[VY];
- parcel_data.global_z = pos_global.mdV[VZ];
-
- std::string on = getString("on");
- std::string off = getString("off");
-
- // Processing parcel characteristics
- if (parcel->getParcelFlagAllowVoice())
- {
- mVoiceText->setText(on);
- }
- else
- {
- mVoiceText->setText(off);
- }
-
- if (!region->getBlockFly() && parcel->getAllowFly())
- {
- mFlyText->setText(on);
- }
- else
- {
- mFlyText->setText(off);
- }
-
- if (region->getRestrictPushObject() || parcel->getRestrictPushObject())
- {
- mPushText->setText(off);
- }
- else
- {
- mPushText->setText(on);
- }
-
- if (parcel->getAllowModify())
- {
- mBuildText->setText(on);
- }
- else
- {
- mBuildText->setText(off);
- }
-
- if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
- (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
- !parcel->getAllowOtherScripts())
- {
- mScriptsText->setText(off);
- }
- else
- {
- mScriptsText->setText(on);
- }
-
- if (region->getAllowDamage() || parcel->getAllowDamage())
- {
- mDamageText->setText(on);
- }
- else
- {
- mDamageText->setText(off);
- }
-
- mRegionNameText->setText(region->getName());
- mRegionTypeText->setText(region->getSimProductName());
- mRegionRatingText->setText(region->getSimAccessString());
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- // Determine parcel owner
- if (parcel->isPublic())
+ S32 scroll_height = mScrollContainer->getRect().getHeight();
+ if (mScrollingPanelMinHeight >= scroll_height)
{
- mParcelOwner->setText(getString("public"));
- mRegionOwnerText->setText(getString("public"));
+ mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
}
else
{
- if (parcel->getIsGroupOwned())
- {
- mRegionOwnerText->setText(getString("group_owned_text"));
-
- if(!parcel->getGroupID().isNull())
- {
- // FIXME: Using parcel group as region group.
- gCacheName->get(parcel->getGroupID(), TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3));
-
- gCacheName->get(parcel->getGroupID(), TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
- }
- else
- {
- std::string owner = getString("none_text");
- mRegionGroupText->setText(owner);
- mParcelOwner->setText(owner);
- }
- }
- else
- {
- // Figure out the owner's name
- gCacheName->get(parcel->getOwnerID(), FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
- gCacheName->get(region->getOwner(), FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3));
- }
-
- if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
- {
- mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
- }
+ mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
}
-
- mEstateRatingText->setText(region->getSimAccessString());
-
- S32 area;
- S32 claim_price;
- S32 rent_price;
- F32 dwell;
- BOOL for_sale = parcel->getForSale();
- LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
- &claim_price,
- &rent_price,
- &for_sale,
- &dwell);
- if (for_sale)
- {
- // Adding "For Sale" flag in remote parcel response format.
- parcel_data.flags |= DFQ_FOR_SALE;
-
- const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
- if(auth_buyer_id.notNull())
- {
- gCacheName->get(auth_buyer_id, TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3));
-
- // Show sales info to a specific person or a group he belongs to.
- if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
- {
- for_sale = FALSE;
- }
- }
- else
- {
- mSaleToText->setText(getString("anyone"));
- }
-
- const U8* sign = (U8*)getString("price_text").c_str();
- const U8* sqm = (U8*)getString("area_text").c_str();
-
- mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
- mAreaText->setText(llformat("%d %s", area, sqm));
- mTrafficText->setText(llformat("%.0f", dwell));
-
- // Can't have more than region max tasks, regardless of parcel
- // object bonus factor.
- S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
- (S32)region->getMaxTasks());
-
- const U8* available = (U8*)getString("available").c_str();
- const U8* allocated = (U8*)getString("allocated").c_str();
-
- mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
-
- if (parcel->getAllowOtherScripts())
- {
- mParcelScriptsText->setText(getString("all_residents_text"));
- }
- else if (parcel->getAllowGroupScripts())
- {
- mParcelScriptsText->setText(getString("group_text"));
- }
- else
- {
- mParcelScriptsText->setText(off);
- }
-
- mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
-
- if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
- {
- mSubdivideText->setText(getString("can_change"));
- }
- else
- {
- mSubdivideText->setText(getString("can_not_change"));
- }
- if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
- {
- mResaleText->setText(getString("can_not_resell"));
- }
- else
- {
- mResaleText->setText(getString("can_resell"));
- }
- }
-
- mSelectedParcelID = parcel->getLocalID();
- mLastSelectedRegionID = region->getRegionID();
- processParcelInfo(parcel_data);
-
- mYouAreHerePanel->setVisible(is_current_parcel);
- getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
-}
-
-void LLPanelPlaceInfo::updateEstateName(const std::string& name)
-{
- mEstateNameText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name)
-{
- mEstateOwnerText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateCovenantText(const std::string &text)
-{
- mCovenantText->setText(text);
-}
-
-void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date)
-{
- if (date.isNull())
- {
- mLastVisited->setText(getString("unknown"));
- }
- else
- {
- std::string timeStr = getString("acquired_date");
- LLSD substitution;
- substitution["datetime"] = (S32) date.secondsSinceEpoch();
- LLStringUtil::format (timeStr, substitution);
- mLastVisited->setText(timeStr);
- }
-}
-
-void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled)
-{
- // If switching to edit mode while creating landmark
- // the "Create Landmark" title remains.
- if (enabled && mInfoType != CREATE_LANDMARK)
- {
- mTitle->setText(getString("title_edit_landmark"));
- }
- else
- {
- mTitle->setText(mCurrentTitle);
- }
-
- if (mNotesEditor->getReadOnly() == (enabled == TRUE))
- {
- mTitleEditor->setEnabled(enabled);
- mNotesEditor->setReadOnly(!enabled);
- mFolderCombo->setVisible(enabled);
- getChild<LLTextBox>("folder_lable")->setVisible(enabled);
-
- // HACK: To change the text color in a text editor
- // when it was enabled/disabled we set the text once again.
- mNotesEditor->setText(mNotesEditor->getText());
- }
-}
-
-const std::string& LLPanelPlaceInfo::getLandmarkTitle() const
-{
- return mTitleEditor->getText();
-}
-
-const std::string LLPanelPlaceInfo::getLandmarkNotes() const
-{
- return mNotesEditor->getText();
-}
-
-const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const
-{
- return mFolderCombo->getValue().asUUID();
-}
-
-BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id)
-{
- return mFolderCombo->setCurrentByID(id);
-}
-
-void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)
-{
- std::string name = mTitleEditor->getText();
- std::string desc = mNotesEditor->getText();
-
- LLStringUtil::trim(name);
- LLStringUtil::trim(desc);
-
- // If typed name is empty use the parcel name instead.
- if (name.empty())
- {
- name = mParcelName->getText();
-
- // If no parcel exists use the region name instead.
- if (name.empty())
- {
- name = mRegionName->getText();
- }
- }
-
- LLStringUtil::replaceChar(desc, '\n', ' ');
- // If no folder chosen use the "Landmarks" folder.
- LLLandmarkActions::createLandmarkHere(name, desc,
- folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK));
}
void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
{
- std::string name = mParcelName->getText();
- if (name.empty())
- {
- name = mRegionName->getText();
- }
+ std::string region_name = mRegionName->getText();
LLPickData data;
data.pos_global = pos_global;
- data.name = name;
+ data.name = mParcelTitle.empty() ? region_name : mParcelTitle;
+ data.sim_name = region_name;
data.desc = mDescEditor->getText();
data.snapshot_id = mSnapshotCtrl->getImageAssetID();
data.parcel_id = mParcelID;
pick_panel->setPickData(&data);
}
-// virtual
-void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility)
-{
- LLPanel::handleVisibilityChange(new_visibility);
-
- LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
- if (!parcel_mgr)
- return;
-
- // Remove land selection when panel hides.
- if (!new_visibility)
- {
- if (!parcel_mgr->selectionEmpty())
- {
- parcel_mgr->deselectLand();
- }
- }
-}
-
-void LLPanelPlaceInfo::populateFoldersList()
-{
- // Collect all folders that can contain landmarks.
- LLInventoryModel::cat_array_t cats;
- collectLandmarkFolders(cats);
-
- mFolderCombo->removeall();
-
- // Put the "Landmarks" folder first in list.
- LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
- const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
- if (!cat)
- {
- llwarns << "Cannot find the landmarks folder" << llendl;
- }
- std::string cat_full_name = getFullFolderName(cat);
- mFolderCombo->add(cat_full_name, cat->getUUID());
-
- typedef std::vector<folder_pair_t> folder_vec_t;
- folder_vec_t folders;
- // Sort the folders by their full name.
- for (S32 i = 0; i < cats.count(); i++)
- {
- cat = cats.get(i);
- cat_full_name = getFullFolderName(cat);
- folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
- }
- sort(folders.begin(), folders.end(), cmp_folders);
-
- // Finally, populate the combobox.
- for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
- mFolderCombo->add(it->second, LLSD(it->first));
-}
-
-//static
-void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)
-{
- //YouAreHere Banner should be displayed only for selected places,
- // If you want to display it for landmark or teleport history item, you should check by mParcelId
-
- LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata);
- if(!self->getVisible())
- return;
-
- static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
-
- BOOL display_banner = self->mLastSelectedRegionID == gAgent.getRegion()->getRegionID() &&
- LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
-
- self->mYouAreHerePanel->setVisible(display_banner);
-}
-
-void LLPanelPlaceInfo::onForSaleBannerClick()
+// static
+void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text,
+ const std::string& first,
+ const std::string& last)
{
- LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
- LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
- LLViewerRegion* selected_region = mgr->getSelectionRegion();
- if(!hParcel.isNull() && selected_region)
- {
- if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
- mLastSelectedRegionID ==selected_region->getRegionID())
- {
- if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
- {
- LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
- }
- else
- {
- LLViewerParcelMgr::getInstance()->startBuyLand();
- }
- }
- else
- {
- LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL;
- }
-
- }
-
-
-}
-
-/*static*/
-std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
-{
- std::string name = cat->getName();
- LLUUID parent_id;
-
- // translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
- {
- LLTrans::findString(name, "InvFolder " + name);
- }
-
- // we don't want "My Inventory" to appear in the name
- while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
- {
- cat = gInventory.getCategory(parent_id);
- name = cat->getName() + "/" + name;
- }
-
- return name;
-}
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
-{
- return left.second < right.second;
-}
-
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
-{
- LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
-
- // Add descendent folders of the "Landmarks" category.
- LLInventoryModel::item_array_t items; // unused
- LLIsType is_category(LLAssetType::AT_CATEGORY);
- gInventory.collectDescendentsIf(
- landmarks_id,
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- is_category);
-
- // Add the "My Favorites" category.
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
- LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
- if (!favorites_cat)
- {
- llwarns << "Cannot find the favorites folder" << llendl;
- }
- else
- {
- cats.put(favorites_cat);
- }
+ text->setText(first + " " + last);
}
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 07a2434d59..deedbd2b0f 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -1,10 +1,10 @@
/**
* @file llpanelplaceinfo.h
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -38,19 +38,15 @@
#include "v3dmath.h"
#include "lluuid.h"
-#include "llpanelmedia.h"
#include "llremoteparcelrequest.h"
-class LLButton;
-class LLComboBox;
class LLExpandableTextBox;
+class LLIconCtrl;
class LLInventoryItem;
-class LLLineEditor;
class LLPanelPickEdit;
class LLParcel;
-class LLIconCtrl;
+class LLScrollContainer;
class LLTextBox;
-class LLTextEditor;
class LLTextureCtrl;
class LLViewerRegion;
class LLViewerInventoryCategory;
@@ -58,8 +54,10 @@ class LLViewerInventoryCategory;
class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
{
public:
- enum INFO_TYPE
+ enum EInfoType
{
+ UNKNOWN,
+
AGENT,
CREATE_LANDMARK,
LANDMARK,
@@ -74,30 +72,18 @@ public:
// Ignore all old location information, useful if you are
// recycling an existing dialog and need to clear it.
- void resetLocation();
+ virtual void resetLocation();
// Sends a request for data about the given parcel, which will
// only update the location if there is none already available.
/*virtual*/ void setParcelID(const LLUUID& parcel_id);
- // Depending on how the panel was triggered
- // (from landmark or current location, or other)
+ // Depending on how the panel was triggered
+ // (from landmark or current location, or other)
// sets a corresponding title and contents.
- void setInfoType(INFO_TYPE type);
-
- // Create a landmark for the current location
- // in a folder specified by folder_id.
- void createLandmark(const LLUUID& folder_id);
-
- // Create a pick for the location specified
- // by global_pos.
- void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
-
- BOOL isMediaPanelVisible();
- void toggleMediaPanel(BOOL visible);
- void displayItemInfo(const LLInventoryItem* pItem);
- /*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
+ virtual void setInfoType(EInfoType type);
+ // Requests remote parcel info by parcel ID.
void sendParcelInfoRequest();
// Displays information about a remote parcel.
@@ -105,109 +91,42 @@ public:
void displayParcelInfo(const LLUUID& region_id,
const LLVector3d& pos_global);
- // Displays information about the currently selected parcel
- // without sending a request to the server.
- // If is_current_parcel true shows "You Are Here" banner.
- void displaySelectedParcelInfo(LLParcel* parcel,
- LLViewerRegion* region,
- const LLVector3d& pos_global,
- bool is_current_parcel);
-
- void updateEstateName(const std::string& name);
- void updateEstateOwnerName(const std::string& name);
- void updateCovenantText(const std::string &text);
- void updateLastVisitedText(const LLDate &date);
-
- void nameUpdatedCallback(LLTextBox* text,
- const std::string& first,
- const std::string& last);
-
- void toggleLandmarkEditMode(BOOL enabled);
-
- const std::string& getLandmarkTitle() const;
- const std::string getLandmarkNotes() const;
- const LLUUID getLandmarkFolder() const;
-
- // Select current landmark folder in combobox.
- BOOL setLandmarkFolder(const LLUUID& id);
+ /*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
- /*virtual*/ void handleVisibilityChange (BOOL new_visibility);
-
- static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
-private:
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- void populateFoldersList();
- static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
- void onForSaleBannerClick();
+ // Create a pick for the location specified
+ // by global_pos.
+ void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
- /**
- * mParcelID is valid only for remote places, in other cases it's null. See resetLocation()
- */
- LLUUID mParcelID;
- LLUUID mRequestedID;
- LLUUID mLandmarkID;
- LLVector3 mPosRegion;
- std::string mCurrentTitle;
- S32 mMinHeight;
- INFO_TYPE mInfoType;
+protected:
+ static void nameUpdatedCallback(LLTextBox* text,
+ const std::string& first,
+ const std::string& last);
/**
- * Hold last displayed parcel. Needs for YouAreHere banner.
+ * mParcelID is valid only for remote places, in other cases it's null. See resetLocation()
*/
- S32 mSelectedParcelID;
- LLUUID mLastSelectedRegionID;
-
- LLTextBox* mTitle;
- LLPanel* mForSalePanel;
- LLPanel* mYouAreHerePanel;
- LLTextureCtrl* mSnapshotCtrl;
- LLTextBox* mRegionName;
- LLTextBox* mParcelName;
- LLExpandableTextBox*mDescEditor;
- LLTextBox* mMaturityRatingText;
- LLTextBox* mParcelOwner;
- LLTextBox* mLastVisited;
-
- LLTextBox* mRatingText;
- LLTextBox* mVoiceText;
- LLTextBox* mFlyText;
- LLTextBox* mPushText;
- LLTextBox* mBuildText;
- LLTextBox* mScriptsText;
- LLTextBox* mDamageText;
-
- LLTextBox* mRegionNameText;
- LLTextBox* mRegionTypeText;
- LLTextBox* mRegionRatingText;
- LLTextBox* mRegionOwnerText;
- LLTextBox* mRegionGroupText;
-
- LLTextBox* mEstateNameText;
- LLTextBox* mEstateRatingText;
- LLTextBox* mEstateOwnerText;
- LLTextEditor* mCovenantText;
-
- LLTextBox* mSalesPriceText;
- LLTextBox* mAreaText;
- LLTextBox* mTrafficText;
- LLTextBox* mPrimitivesText;
- LLTextBox* mParcelScriptsText;
- LLTextBox* mTerraformLimitsText;
- LLTextEditor* mSubdivideText;
- LLTextEditor* mResaleText;
- LLTextBox* mSaleToText;
-
- LLTextBox* mOwner;
- LLTextBox* mCreator;
- LLTextBox* mCreated;
- LLLineEditor* mTitleEditor;
- LLTextEditor* mNotesEditor;
- LLComboBox* mFolderCombo;
- LLPanel* mScrollingPanel;
- LLPanel* mInfoPanel;
- LLMediaPanel* mMediaPanel;
+ LLUUID mParcelID;
+ LLUUID mRequestedID;
+ LLVector3 mPosRegion;
+ std::string mParcelTitle; // used for pick title without coordinates
+ std::string mCurrentTitle;
+ S32 mScrollingPanelMinHeight;
+ S32 mScrollingPanelWidth;
+ EInfoType mInfoType;
+
+ LLScrollContainer* mScrollContainer;
+ LLPanel* mScrollingPanel;
+ LLTextBox* mTitle;
+ LLTextureCtrl* mSnapshotCtrl;
+ LLTextBox* mRegionName;
+ LLTextBox* mParcelName;
+ LLExpandableTextBox* mDescEditor;
+ LLIconCtrl* mMaturityRatingIcon;
+ LLTextBox* mMaturityRatingText;
};
#endif // LL_LLPANELPLACEINFO_H
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
new file mode 100644
index 0000000000..9e5f9da0ea
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -0,0 +1,606 @@
+/**
+ * @file llpanelplaceprofile.cpp
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelplaceprofile.h"
+
+#include "llparcel.h"
+#include "message.h"
+
+#include "lliconctrl.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+
+#include "lltrans.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+#include "llagent.h"
+#include "llagentui.h"
+#include "llappviewer.h"
+#include "llcallbacklist.h"
+#include "llfloaterbuycurrency.h"
+#include "llstatusbar.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile");
+
+// Statics for textures filenames
+static std::string icon_pg;
+static std::string icon_m;
+static std::string icon_r;
+static std::string icon_voice;
+static std::string icon_voice_no;
+static std::string icon_fly;
+static std::string icon_fly_no;
+static std::string icon_push;
+static std::string icon_push_no;
+static std::string icon_build;
+static std::string icon_build_no;
+static std::string icon_scripts;
+static std::string icon_scripts_no;
+static std::string icon_damage;
+static std::string icon_damage_no;
+
+LLPanelPlaceProfile::LLPanelPlaceProfile()
+: LLPanelPlaceInfo(),
+ mForSalePanel(NULL),
+ mYouAreHerePanel(NULL),
+ mSelectedParcelID(-1)
+{}
+
+// virtual
+LLPanelPlaceProfile::~LLPanelPlaceProfile()
+{}
+
+// virtual
+BOOL LLPanelPlaceProfile::postBuild()
+{
+ LLPanelPlaceInfo::postBuild();
+
+ mForSalePanel = getChild<LLPanel>("for_sale_panel");
+ mYouAreHerePanel = getChild<LLPanel>("here_panel");
+ gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this);
+
+ //Icon value should contain sale price of last selected parcel.
+ mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
+ setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this));
+
+ mParcelOwner = getChild<LLTextBox>("owner_value");
+
+ mParcelRatingIcon = getChild<LLIconCtrl>("rating_icon");
+ mParcelRatingText = getChild<LLTextBox>("rating_value");
+ mVoiceIcon = getChild<LLIconCtrl>("voice_icon");
+ mVoiceText = getChild<LLTextBox>("voice_value");
+ mFlyIcon = getChild<LLIconCtrl>("fly_icon");
+ mFlyText = getChild<LLTextBox>("fly_value");
+ mPushIcon = getChild<LLIconCtrl>("push_icon");
+ mPushText = getChild<LLTextBox>("push_value");
+ mBuildIcon = getChild<LLIconCtrl>("build_icon");
+ mBuildText = getChild<LLTextBox>("build_value");
+ mScriptsIcon = getChild<LLIconCtrl>("scripts_icon");
+ mScriptsText = getChild<LLTextBox>("scripts_value");
+ mDamageIcon = getChild<LLIconCtrl>("damage_icon");
+ mDamageText = getChild<LLTextBox>("damage_value");
+
+ mRegionNameText = getChild<LLTextBox>("region_name");
+ mRegionTypeText = getChild<LLTextBox>("region_type");
+ mRegionRatingIcon = getChild<LLIconCtrl>("region_rating_icon");
+ mRegionRatingText = getChild<LLTextBox>("region_rating");
+ mRegionOwnerText = getChild<LLTextBox>("region_owner");
+ mRegionGroupText = getChild<LLTextBox>("region_group");
+
+ mEstateNameText = getChild<LLTextBox>("estate_name");
+ mEstateRatingText = getChild<LLTextBox>("estate_rating");
+ mEstateOwnerText = getChild<LLTextBox>("estate_owner");
+ mCovenantText = getChild<LLTextEditor>("covenant");
+
+ mSalesPriceText = getChild<LLTextBox>("sales_price");
+ mAreaText = getChild<LLTextBox>("area");
+ mTrafficText = getChild<LLTextBox>("traffic");
+ mPrimitivesText = getChild<LLTextBox>("primitives");
+ mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
+ mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
+ mSubdivideText = getChild<LLTextEditor>("subdivide");
+ mResaleText = getChild<LLTextEditor>("resale");
+ mSaleToText = getChild<LLTextBox>("sale_to");
+
+ icon_pg = getString("icon_PG");
+ icon_m = getString("icon_M");
+ icon_r = getString("icon_R");
+ icon_voice = getString("icon_Voice");
+ icon_voice_no = getString("icon_VoiceNo");
+ icon_fly = getString("icon_Fly");
+ icon_fly_no = getString("icon_FlyNo");
+ icon_push = getString("icon_Push");
+ icon_push_no = getString("icon_PushNo");
+ icon_build = getString("icon_Build");
+ icon_build_no = getString("icon_BuildNo");
+ icon_scripts = getString("icon_Scripts");
+ icon_scripts_no = getString("icon_ScriptsNo");
+ icon_damage = getString("icon_Damage");
+ icon_damage_no = getString("icon_DamageNo");
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelPlaceProfile::resetLocation()
+{
+ LLPanelPlaceInfo::resetLocation();
+
+ mForSalePanel->setVisible(FALSE);
+ mYouAreHerePanel->setVisible(FALSE);
+
+ std::string loading = LLTrans::getString("LoadingData");
+ mParcelOwner->setValue(loading);
+
+ mParcelRatingIcon->setValue(loading);
+ mParcelRatingText->setText(loading);
+ mVoiceIcon->setValue(loading);
+ mVoiceText->setText(loading);
+ mFlyIcon->setValue(loading);
+ mFlyText->setText(loading);
+ mPushIcon->setValue(loading);
+ mPushText->setText(loading);
+ mBuildIcon->setValue(loading);
+ mBuildText->setText(loading);
+ mScriptsIcon->setValue(loading);
+ mScriptsText->setText(loading);
+ mDamageIcon->setValue(loading);
+ mDamageText->setText(loading);
+
+ mRegionNameText->setValue(loading);
+ mRegionTypeText->setValue(loading);
+ mRegionRatingIcon->setValue(loading);
+ mRegionRatingText->setValue(loading);
+ mRegionOwnerText->setValue(loading);
+ mRegionGroupText->setValue(loading);
+
+ mEstateNameText->setValue(loading);
+ mEstateRatingText->setValue(loading);
+ mEstateOwnerText->setValue(loading);
+ mCovenantText->setValue(loading);
+
+ mSalesPriceText->setValue(loading);
+ mAreaText->setValue(loading);
+ mTrafficText->setValue(loading);
+ mPrimitivesText->setValue(loading);
+ mParcelScriptsText->setValue(loading);
+ mTerraformLimitsText->setValue(loading);
+ mSubdivideText->setValue(loading);
+ mResaleText->setValue(loading);
+ mSaleToText->setValue(loading);
+}
+
+// virtual
+void LLPanelPlaceProfile::setInfoType(EInfoType type)
+{
+ bool is_info_type_agent = type == AGENT;
+
+ mMaturityRatingIcon->setVisible(!is_info_type_agent);
+ mMaturityRatingText->setVisible(!is_info_type_agent);
+
+ getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
+ mParcelOwner->setVisible(is_info_type_agent);
+
+ getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
+
+ switch(type)
+ {
+ case AGENT:
+ case PLACE:
+ default:
+ mCurrentTitle = getString("title_place");
+ break;
+
+ case TELEPORT_HISTORY:
+ mCurrentTitle = getString("title_teleport_history");
+ break;
+ }
+
+ LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data)
+{
+ LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+ // HACK: Flag 0x2 == adult region,
+ // Flag 0x1 == mature region, otherwise assume PG
+ if (parcel_data.flags & 0x2)
+ {
+ mMaturityRatingIcon->setValue(icon_r);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT));
+ }
+ else if (parcel_data.flags & 0x1)
+ {
+ mMaturityRatingIcon->setValue(icon_m);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE));
+ }
+ else
+ {
+ mMaturityRatingIcon->setValue(icon_pg);
+ mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));
+ }
+}
+
+// virtual
+void LLPanelPlaceProfile::handleVisibilityChange(BOOL new_visibility)
+{
+ LLPanel::handleVisibilityChange(new_visibility);
+
+ LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
+ if (!parcel_mgr)
+ return;
+
+ // Remove land selection when panel hides.
+ if (!new_visibility)
+ {
+ if (!parcel_mgr->selectionEmpty())
+ {
+ parcel_mgr->deselectUnused();
+ }
+ }
+}
+
+void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
+ LLViewerRegion* region,
+ const LLVector3d& pos_global,
+ bool is_current_parcel)
+{
+ if (!region || !parcel)
+ return;
+
+ // send EstateCovenantInfo message
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+
+ LLParcelData parcel_data;
+
+ // HACK: Converting sim access flags to the format
+ // returned by remote parcel response.
+ U8 sim_access = region->getSimAccess();
+ switch(sim_access)
+ {
+ case SIM_ACCESS_MATURE:
+ parcel_data.flags = 0x1;
+
+ mParcelRatingIcon->setValue(icon_m);
+ mRegionRatingIcon->setValue(icon_m);
+ break;
+
+ case SIM_ACCESS_ADULT:
+ parcel_data.flags = 0x2;
+
+ mParcelRatingIcon->setValue(icon_r);
+ mRegionRatingIcon->setValue(icon_r);
+ break;
+
+ default:
+ parcel_data.flags = 0;
+
+ mParcelRatingIcon->setValue(icon_pg);
+ mRegionRatingIcon->setValue(icon_pg);
+ }
+
+ std::string rating = LLViewerRegion::accessToString(sim_access);
+ mParcelRatingText->setText(rating);
+ mRegionRatingText->setText(rating);
+
+ parcel_data.desc = parcel->getDesc();
+ parcel_data.name = parcel->getName();
+ parcel_data.sim_name = region->getName();
+ parcel_data.snapshot_id = parcel->getSnapshotID();
+ mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+ (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+ (F32)pos_global.mdV[VZ]);
+ parcel_data.global_x = pos_global.mdV[VX];
+ parcel_data.global_y = pos_global.mdV[VY];
+ parcel_data.global_z = pos_global.mdV[VZ];
+
+ std::string on = getString("on");
+ std::string off = getString("off");
+
+ LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+
+ // Processing parcel characteristics
+ if (vpm->allowAgentVoice(region, parcel))
+ {
+ mVoiceIcon->setValue(icon_voice);
+ mVoiceText->setText(on);
+ }
+ else
+ {
+ mVoiceIcon->setValue(icon_voice_no);
+ mVoiceText->setText(off);
+ }
+
+ if (vpm->allowAgentFly(region, parcel))
+ {
+ mFlyIcon->setValue(icon_fly);
+ mFlyText->setText(on);
+ }
+ else
+ {
+ mFlyIcon->setValue(icon_fly_no);
+ mFlyText->setText(off);
+ }
+
+ if (vpm->allowAgentPush(region, parcel))
+ {
+ mPushIcon->setValue(icon_push);
+ mPushText->setText(on);
+ }
+ else
+ {
+ mPushIcon->setValue(icon_push_no);
+ mPushText->setText(off);
+ }
+
+ if (vpm->allowAgentBuild(parcel))
+ {
+ mBuildIcon->setValue(icon_build);
+ mBuildText->setText(on);
+ }
+ else
+ {
+ mBuildIcon->setValue(icon_build_no);
+ mBuildText->setText(off);
+ }
+
+ if (vpm->allowAgentScripts(region, parcel))
+ {
+ mScriptsIcon->setValue(icon_scripts);
+ mScriptsText->setText(on);
+ }
+ else
+ {
+ mScriptsIcon->setValue(icon_scripts_no);
+ mScriptsText->setText(off);
+ }
+
+ if (vpm->allowAgentDamage(region, parcel))
+ {
+ mDamageIcon->setValue(icon_damage);
+ mDamageText->setText(on);
+ }
+ else
+ {
+ mDamageIcon->setValue(icon_damage_no);
+ mDamageText->setText(off);
+ }
+
+ mRegionNameText->setText(region->getName());
+ mRegionTypeText->setText(region->getSimProductName());
+
+ // Determine parcel owner
+ if (parcel->isPublic())
+ {
+ mParcelOwner->setText(getString("public"));
+ mRegionOwnerText->setText(getString("public"));
+ }
+ else
+ {
+ if (parcel->getIsGroupOwned())
+ {
+ mRegionOwnerText->setText(getString("group_owned_text"));
+
+ if(!parcel->getGroupID().isNull())
+ {
+ // FIXME: Using parcel group as region group.
+ gCacheName->get(parcel->getGroupID(), TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3));
+
+ gCacheName->get(parcel->getGroupID(), TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+ }
+ else
+ {
+ std::string owner = getString("none_text");
+ mRegionGroupText->setText(owner);
+ mParcelOwner->setText(owner);
+ }
+ }
+ else
+ {
+ // Figure out the owner's name
+ gCacheName->get(parcel->getOwnerID(), FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+ gCacheName->get(region->getOwner(), FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3));
+ }
+
+ if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
+ {
+ mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
+ }
+ }
+
+ mEstateRatingText->setText(region->getSimAccessString());
+
+ S32 area;
+ S32 claim_price;
+ S32 rent_price;
+ F32 dwell;
+ BOOL for_sale;
+ vpm->getDisplayInfo(&area, &claim_price, &rent_price, &for_sale, &dwell);
+ if (for_sale)
+ {
+ const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
+ if(auth_buyer_id.notNull())
+ {
+ gCacheName->get(auth_buyer_id, TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3));
+
+ // Show sales info to a specific person or a group he belongs to.
+ if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
+ {
+ for_sale = FALSE;
+ }
+ }
+ else
+ {
+ mSaleToText->setText(getString("anyone"));
+ }
+
+ mForSalePanel->setVisible(for_sale);
+
+ const U8* sign = (U8*)getString("price_text").c_str();
+ const U8* sqm = (U8*)getString("area_text").c_str();
+
+ mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
+ mAreaText->setText(llformat("%d %s", area, sqm));
+ mTrafficText->setText(llformat("%.0f", dwell));
+
+ // Can't have more than region max tasks, regardless of parcel
+ // object bonus factor.
+ S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
+ (S32)region->getMaxTasks());
+
+ const U8* available = (U8*)getString("available").c_str();
+ const U8* allocated = (U8*)getString("allocated").c_str();
+
+ mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
+
+ if (parcel->getAllowOtherScripts())
+ {
+ mParcelScriptsText->setText(getString("all_residents_text"));
+ }
+ else if (parcel->getAllowGroupScripts())
+ {
+ mParcelScriptsText->setText(getString("group_text"));
+ }
+ else
+ {
+ mParcelScriptsText->setText(off);
+ }
+
+ mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
+
+ if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
+ {
+ mSubdivideText->setText(getString("can_change"));
+ }
+ else
+ {
+ mSubdivideText->setText(getString("can_not_change"));
+ }
+ if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
+ {
+ mResaleText->setText(getString("can_not_resell"));
+ }
+ else
+ {
+ mResaleText->setText(getString("can_resell"));
+ }
+ }
+
+ mSelectedParcelID = parcel->getLocalID();
+ mLastSelectedRegionID = region->getRegionID();
+ LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+ mYouAreHerePanel->setVisible(is_current_parcel);
+ getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
+}
+
+void LLPanelPlaceProfile::updateEstateName(const std::string& name)
+{
+ mEstateNameText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name)
+{
+ mEstateOwnerText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
+{
+ mCovenantText->setText(text);
+}
+
+void LLPanelPlaceProfile::onForSaleBannerClick()
+{
+ LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
+ LLParcel* parcel = mgr->getFloatingParcelSelection()->getParcel();
+ LLViewerRegion* selected_region = mgr->getSelectionRegion();
+ if(parcel && selected_region)
+ {
+ if(parcel->getLocalID() == mSelectedParcelID &&
+ mLastSelectedRegionID ==selected_region->getRegionID())
+ {
+ if(parcel->getSalePrice() - gStatusBar->getBalance() > 0)
+ {
+ LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice());
+ }
+ else
+ {
+ LLViewerParcelMgr::getInstance()->startBuyLand();
+ }
+ }
+ else
+ {
+ LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL;
+ }
+
+ }
+}
+
+// static
+void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata)
+{
+ //YouAreHere Banner should be displayed only for selected places,
+ // If you want to display it for landmark or teleport history item, you should check by mParcelId
+
+ LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata);
+ if(!self->getVisible())
+ return;
+
+ if(!gDisconnected && gAgent.getRegion())
+ {
+ static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
+
+ BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
+ LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
+
+ self->mYouAreHerePanel->setVisible(display_banner);
+ }
+}
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
new file mode 100644
index 0000000000..e77b441567
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.h
@@ -0,0 +1,123 @@
+/**
+ * @file llpanelplaceprofile.h
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELPLACEPROFILE_H
+#define LL_LLPANELPLACEPROFILE_H
+
+#include "llpanelplaceinfo.h"
+
+class LLIconCtrl;
+class LLTextEditor;
+
+class LLPanelPlaceProfile : public LLPanelPlaceInfo
+{
+public:
+ LLPanelPlaceProfile();
+ /*virtual*/ ~LLPanelPlaceProfile();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void resetLocation();
+
+ /*virtual*/ void setInfoType(EInfoType type);
+
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+ /*virtual*/ void handleVisibilityChange(BOOL new_visibility);
+
+ // Displays information about the currently selected parcel
+ // without sending a request to the server.
+ // If is_current_parcel true shows "You Are Here" banner.
+ void displaySelectedParcelInfo(LLParcel* parcel,
+ LLViewerRegion* region,
+ const LLVector3d& pos_global,
+ bool is_current_parcel);
+
+ void updateEstateName(const std::string& name);
+ void updateEstateOwnerName(const std::string& name);
+ void updateCovenantText(const std::string &text);
+
+private:
+ void onForSaleBannerClick();
+
+ static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
+
+ /**
+ * Holds last displayed parcel. Needed for YouAreHere banner.
+ */
+ S32 mSelectedParcelID;
+ LLUUID mLastSelectedRegionID;
+
+ LLPanel* mForSalePanel;
+ LLPanel* mYouAreHerePanel;
+
+ LLTextBox* mParcelOwner;
+
+ LLIconCtrl* mParcelRatingIcon;
+ LLTextBox* mParcelRatingText;
+ LLIconCtrl* mVoiceIcon;
+ LLTextBox* mVoiceText;
+ LLIconCtrl* mFlyIcon;
+ LLTextBox* mFlyText;
+ LLIconCtrl* mPushIcon;
+ LLTextBox* mPushText;
+ LLIconCtrl* mBuildIcon;
+ LLTextBox* mBuildText;
+ LLIconCtrl* mScriptsIcon;
+ LLTextBox* mScriptsText;
+ LLIconCtrl* mDamageIcon;
+ LLTextBox* mDamageText;
+
+ LLTextBox* mRegionNameText;
+ LLTextBox* mRegionTypeText;
+ LLIconCtrl* mRegionRatingIcon;
+ LLTextBox* mRegionRatingText;
+ LLTextBox* mRegionOwnerText;
+ LLTextBox* mRegionGroupText;
+
+ LLTextBox* mEstateNameText;
+ LLTextBox* mEstateRatingText;
+ LLTextBox* mEstateOwnerText;
+ LLTextEditor* mCovenantText;
+
+ LLTextBox* mSalesPriceText;
+ LLTextBox* mAreaText;
+ LLTextBox* mTrafficText;
+ LLTextBox* mPrimitivesText;
+ LLTextBox* mParcelScriptsText;
+ LLTextBox* mTerraformLimitsText;
+ LLTextEditor* mSubdivideText;
+ LLTextEditor* mResaleText;
+ LLTextBox* mSaleToText;
+};
+
+#endif // LL_LLPANELPLACEPROFILE_H
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index b2e9110e96..26b57c003b 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -34,7 +34,7 @@
#include "llpanelplaces.h"
#include "llassettype.h"
-#include "llwindow.h"
+#include "lltimer.h"
#include "llinventory.h"
#include "lllandmark.h"
@@ -43,33 +43,40 @@
#include "llcombobox.h"
#include "llfiltereditor.h"
#include "llfloaterreg.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "lltabcontainer.h"
#include "lltexteditor.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
+#include "llwindow.h"
+
#include "llagent.h"
#include "llagentpicksinfo.h"
#include "llavatarpropertiesprocessor.h"
#include "llfloaterworldmap.h"
#include "llinventorybridge.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanellandmarkinfo.h"
#include "llpanellandmarks.h"
#include "llpanelpick.h"
+#include "llpanelplaceprofile.h"
#include "llpanelteleporthistory.h"
+#include "llremoteparcelrequest.h"
#include "llteleporthistorystorage.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
+#include "llviewermessage.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250;
+static const F32 PLACE_INFO_UPDATE_INTERVAL = 3.0;
static const std::string AGENT_INFO_TYPE = "agent";
static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string LANDMARK_INFO_TYPE = "landmark";
@@ -79,14 +86,15 @@ static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
// Helper functions
static bool is_agent_in_selected_parcel(LLParcel* parcel);
static void onSLURLBuilt(std::string& slurl);
-static void setAllChildrenVisible(LLView* view, BOOL visible);
//Observer classes
class LLPlacesParcelObserver : public LLParcelObserver
{
public:
- LLPlacesParcelObserver(LLPanelPlaces* places_panel)
- : mPlaces(places_panel) {}
+ LLPlacesParcelObserver(LLPanelPlaces* places_panel) :
+ LLParcelObserver(),
+ mPlaces(places_panel)
+ {}
/*virtual*/ void changed()
{
@@ -98,30 +106,98 @@ private:
LLPanelPlaces* mPlaces;
};
-class LLPlacesInventoryObserver : public LLInventoryObserver
+class LLPlacesInventoryObserver : public LLInventoryAddedObserver
{
public:
- LLPlacesInventoryObserver(LLPanelPlaces* places_panel)
- : mPlaces(places_panel) {}
+ LLPlacesInventoryObserver(LLPanelPlaces* places_panel) :
+ mPlaces(places_panel),
+ mTabsCreated(false)
+ {}
/*virtual*/ void changed(U32 mask)
{
+ LLInventoryAddedObserver::changed(mask);
+
+ if (!mTabsCreated && mPlaces)
+ {
+ mPlaces->createTabs();
+ mTabsCreated = true;
+ }
+ }
+
+protected:
+ /*virtual*/ void done()
+ {
+ mPlaces->showAddedLandmarkInfo(mAdded);
+ mAdded.clear();
+ }
+
+private:
+ LLPanelPlaces* mPlaces;
+ bool mTabsCreated;
+};
+
+class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver
+{
+public:
+ LLPlacesRemoteParcelInfoObserver(LLPanelPlaces* places_panel) :
+ LLRemoteParcelInfoObserver(),
+ mPlaces(places_panel)
+ {}
+
+ ~LLPlacesRemoteParcelInfoObserver()
+ {
+ // remove any in-flight observers
+ std::set<LLUUID>::iterator it;
+ for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it)
+ {
+ const LLUUID &id = *it;
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this);
+ }
+ mParcelIDs.clear();
+ }
+
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data)
+ {
if (mPlaces)
- mPlaces->changedInventory(mask);
+ {
+ mPlaces->changedGlobalPos(LLVector3d(parcel_data.global_x,
+ parcel_data.global_y,
+ parcel_data.global_z));
+ }
+
+ mParcelIDs.erase(parcel_data.parcel_id);
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this);
+ }
+ /*virtual*/ void setParcelID(const LLUUID& parcel_id)
+ {
+ if (!parcel_id.isNull())
+ {
+ mParcelIDs.insert(parcel_id);
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id);
+ }
+ }
+ /*virtual*/ void setErrorStatus(U32 status, const std::string& reason)
+ {
+ llerrs << "Can't complete remote parcel request. Http Status: "
+ << status << ". Reason : " << reason << llendl;
}
private:
+ std::set<LLUUID> mParcelIDs;
LLPanelPlaces* mPlaces;
};
+
static LLRegisterPanelClassWrapper<LLPanelPlaces> t_places("panel_places");
LLPanelPlaces::LLPanelPlaces()
: LLPanel(),
- mFilterSubString(LLStringUtil::null),
mActivePanel(NULL),
mFilterEditor(NULL),
- mPlaceInfo(NULL),
+ mPlaceProfile(NULL),
+ mLandmarkInfo(NULL),
mPickPanel(NULL),
mItem(NULL),
mPlaceMenu(NULL),
@@ -131,11 +207,12 @@ LLPanelPlaces::LLPanelPlaces()
{
mParcelObserver = new LLPlacesParcelObserver(this);
mInventoryObserver = new LLPlacesInventoryObserver(this);
+ mRemoteParcelObserver = new LLPlacesRemoteParcelInfoObserver(this);
gInventory.addObserver(mInventoryObserver);
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
- boost::bind(&LLPanelPlaces::onAgentParcelChange, this));
+ boost::bind(&LLPanelPlaces::updateVerbs, this));
//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
@@ -149,6 +226,7 @@ LLPanelPlaces::~LLPanelPlaces()
delete mInventoryObserver;
delete mParcelObserver;
+ delete mRemoteParcelObserver;
}
BOOL LLPanelPlaces::postBuild()
@@ -158,9 +236,6 @@ BOOL LLPanelPlaces::postBuild()
mShowOnMapBtn = getChild<LLButton>("map_btn");
mShowOnMapBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShowOnMapButtonClicked, this));
-
- mShareBtn = getChild<LLButton>("share_btn");
- //mShareBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShareButtonClicked, this));
mEditBtn = getChild<LLButton>("edit_btn");
mEditBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
@@ -206,94 +281,118 @@ BOOL LLPanelPlaces::postBuild()
mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false));
}
- mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info");
+ mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile");
+ mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info");
+ if (!mPlaceProfile || !mLandmarkInfo)
+ return FALSE;
+
+ mPlaceProfileBackBtn = mPlaceProfile->getChild<LLButton>("back_btn");
+ mPlaceProfileBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
- LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn");
- back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+ mLandmarkInfoBackBtn = mLandmarkInfo->getChild<LLButton>("back_btn");
+ mLandmarkInfoBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
- LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor");
+ LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor");
title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL);
- LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor");
+ LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor");
notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
- LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo");
- folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+ LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
+ folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+
return TRUE;
}
void LLPanelPlaces::onOpen(const LLSD& key)
{
- if(mPlaceInfo == NULL || key.size() == 0)
+ if (!mPlaceProfile || !mLandmarkInfo)
return;
- mFilterEditor->clear();
- onFilterEdit("", false);
-
- mPlaceInfoType = key["type"].asString();
- mPosGlobal.setZero();
- mItem = NULL;
- isLandmarkEditModeOn = false;
- togglePlaceInfoPanel(TRUE);
- updateVerbs();
-
- if (mPlaceInfoType == AGENT_INFO_TYPE)
+ if (key.size() != 0)
{
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT);
- }
- else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
- {
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+ mFilterEditor->clear();
+ onFilterEdit("", false);
+
+ mPlaceInfoType = key["type"].asString();
+ mPosGlobal.setZero();
+ mItem = NULL;
+ isLandmarkEditModeOn = false;
+ togglePlaceInfoPanel(TRUE);
- if (key.has("x") && key.has("y") && key.has("z"))
+ if (mPlaceInfoType == AGENT_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
- else
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
- mPosGlobal = gAgent.getPositionGlobal();
- }
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
- }
- else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
- {
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+ if (key.has("x") && key.has("y") && key.has("z"))
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ }
+ else
+ {
+ mPosGlobal = gAgent.getPositionGlobal();
+ }
- LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
- if (!item)
- return;
+ mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
- setItem(item);
- }
- else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
- {
- if (mPlaceInfo->isMediaPanelVisible())
+ // Disabling "Save", "Close" and "Back" buttons to prevent closing "Create Landmark"
+ // panel before created landmark is loaded.
+ // These buttons will be enabled when created landmark is added to inventory.
+ mSaveBtn->setEnabled(FALSE);
+ mCloseBtn->setEnabled(FALSE);
+ mLandmarkInfoBackBtn->setEnabled(FALSE);
+ }
+ else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
- toggleMediaPanel();
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+
+ LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
+ if (!item)
+ return;
+
+ setItem(item);
}
+ else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
+ {
+ if (key.has("id"))
+ {
+ LLUUID parcel_id = key["id"].asUUID();
+ mPlaceProfile->setParcelID(parcel_id);
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
+ // query the server to get the global 3D position of this
+ // parcel - we need this for teleport/mapping functions.
+ mRemoteParcelObserver->setParcelID(parcel_id);
+ }
+ else
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE);
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
- }
- else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
- {
- S32 index = key["id"].asInteger();
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
+ }
+ else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+ {
+ S32 index = key["id"].asInteger();
- const LLTeleportHistoryStorage::slurl_list_t& hist_items =
- LLTeleportHistoryStorage::getInstance()->getItems();
+ const LLTeleportHistoryStorage::slurl_list_t& hist_items =
+ LLTeleportHistoryStorage::getInstance()->getItems();
- mPosGlobal = hist_items[index].mGlobalPos;
+ mPosGlobal = hist_items[index].mGlobalPos;
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
- mPlaceInfo->updateLastVisitedText(hist_items[index].mDate);
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
+
+ updateVerbs();
}
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -305,6 +404,10 @@ void LLPanelPlaces::onOpen(const LLSD& key)
// Otherwise stop using land selection and deselect land.
if (mPlaceInfoType == AGENT_INFO_TYPE)
{
+ // We don't know if we are already added to LLViewerParcelMgr observers list
+ // so try to remove observer not to add an extra one.
+ parcel_mgr->removeObserver(mParcelObserver);
+
parcel_mgr->addObserver(mParcelObserver);
parcel_mgr->selectParcelAt(gAgent.getPositionGlobal());
}
@@ -312,16 +415,19 @@ void LLPanelPlaces::onOpen(const LLSD& key)
{
parcel_mgr->removeObserver(mParcelObserver);
+ // Clear the reference to selection to allow its removal in deselectUnused().
+ mParcel.clear();
+
if (!parcel_mgr->selectionEmpty())
{
- parcel_mgr->deselectLand();
+ parcel_mgr->deselectUnused();
}
}
}
void LLPanelPlaces::setItem(LLInventoryItem* item)
{
- if (!mPlaceInfo || !item)
+ if (!mLandmarkInfo || !item)
return;
mItem = item;
@@ -348,22 +454,24 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
mEditBtn->setEnabled(is_landmark_editable);
mSaveBtn->setEnabled(is_landmark_editable);
+ mCloseBtn->setEnabled(TRUE);
+ mLandmarkInfoBackBtn->setEnabled(TRUE);
if (is_landmark_editable)
{
- if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
+ if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
{
const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID());
- if(cat)
+ if (cat)
{
- std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat);
- LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo");
- folderList->add(cat_fullname, cat->getUUID(),ADD_TOP);
+ std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat);
+ LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
+ folderList->add(cat_fullname, cat->getUUID(), ADD_TOP);
}
}
}
- mPlaceInfo->displayItemInfo(mItem);
+ mLandmarkInfo->displayItemInfo(mItem);
LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(),
boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1));
@@ -373,29 +481,49 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
}
}
+S32 LLPanelPlaces::notifyParent(const LLSD& info)
+{
+ if(info.has("update_verbs"))
+ {
+ if(mPosGlobal.isExactlyZero())
+ {
+ mPosGlobal.setVec(info["global_x"], info["global_y"], info["global_z"]);
+ }
+
+ updateVerbs();
+
+ return 1;
+ }
+ return LLPanel::notifyParent(info);
+}
+
void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)
{
- if (!mPlaceInfo)
+ if (!mLandmarkInfo)
return;
LLUUID region_id;
landmark->getRegionID(region_id);
landmark->getGlobalPos(mPosGlobal);
- mPlaceInfo->displayParcelInfo(region_id, mPosGlobal);
+ mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal);
+
+ updateVerbs();
}
void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter)
{
- if (force_filter || mFilterSubString != search_string)
+ if (!mActivePanel)
+ return;
+
+ if (force_filter || mActivePanel->getFilterSubString() != search_string)
{
- mFilterSubString = search_string;
+ std::string string = search_string;
// Searches are case-insensitive
- LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
+ LLStringUtil::toUpper(string);
+ LLStringUtil::trimHead(string);
- if (mActivePanel)
- mActivePanel->onSearchEdit(mFilterSubString);
+ mActivePanel->onSearchEdit(string);
}
}
@@ -405,29 +533,20 @@ void LLPanelPlaces::onTabSelected()
if (!mActivePanel)
return;
- onFilterEdit(mFilterSubString, true);
+ onFilterEdit(mActivePanel->getFilterSubString(), true);
mActivePanel->updateVerbs();
}
-/*
-void LLPanelPlaces::onShareButtonClicked()
-{
- // TODO: Launch the "Things" Share wizard
-}
-*/
-
void LLPanelPlaces::onTeleportButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->getVisible())
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel && panel->getVisible())
{
if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
LLSD payload;
payload["asset_id"] = mItem->getAssetUUID();
- LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+ LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
}
else if (mPlaceInfoType == AGENT_INFO_TYPE ||
mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
@@ -450,10 +569,8 @@ void LLPanelPlaces::onTeleportButtonClicked()
void LLPanelPlaces::onShowOnMapButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->getVisible())
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel && panel->getVisible())
{
LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
if(!worldmap_instance)
@@ -496,31 +613,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
void LLPanelPlaces::onEditButtonClicked()
{
- if (!mPlaceInfo || isLandmarkEditModeOn)
+ if (!mLandmarkInfo || isLandmarkEditModeOn)
return;
isLandmarkEditModeOn = true;
- mPlaceInfo->toggleLandmarkEditMode(TRUE);
+ mLandmarkInfo->toggleLandmarkEditMode(TRUE);
updateVerbs();
}
void LLPanelPlaces::onSaveButtonClicked()
{
- if (!mPlaceInfo || mItem.isNull())
+ if (!mLandmarkInfo || mItem.isNull())
return;
- std::string current_title_value = mPlaceInfo->getLandmarkTitle();
+ std::string current_title_value = mLandmarkInfo->getLandmarkTitle();
std::string item_title_value = mItem->getName();
- std::string current_notes_value = mPlaceInfo->getLandmarkNotes();
+ std::string current_notes_value = mLandmarkInfo->getLandmarkNotes();
std::string item_notes_value = mItem->getDescription();
LLStringUtil::trim(current_title_value);
LLStringUtil::trim(current_notes_value);
LLUUID item_id = mItem->getUUID();
- LLUUID folder_id = mPlaceInfo->getLandmarkFolder();
+ LLUUID folder_id = mLandmarkInfo->getLandmarkFolder();
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem);
@@ -553,7 +670,7 @@ void LLPanelPlaces::onSaveButtonClicked()
void LLPanelPlaces::onCancelButtonClicked()
{
- if (!mPlaceInfo)
+ if (!mLandmarkInfo)
return;
if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
@@ -562,13 +679,13 @@ void LLPanelPlaces::onCancelButtonClicked()
}
else
{
- mPlaceInfo->toggleLandmarkEditMode(FALSE);
+ mLandmarkInfo->toggleLandmarkEditMode(FALSE);
isLandmarkEditModeOn = false;
updateVerbs();
// Reload the landmark properties.
- mPlaceInfo->displayItemInfo(mItem);
+ mLandmarkInfo->displayItemInfo(mItem);
}
}
@@ -597,7 +714,7 @@ void LLPanelPlaces::onOverflowButtonClicked()
if (mItem.notNull())
{
const LLUUID& item_id = mItem->getUUID();
- const LLUUID& trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) &&
!gInventory.isObjectDescendentOf(item_id, trash_id);
}
@@ -612,9 +729,12 @@ void LLPanelPlaces::onOverflowButtonClicked()
if (!menu->toggleVisibility())
return;
+ if (menu->getButtonRect().isEmpty())
+ {
+ menu->setButtonRect(mOverflowBtn);
+ }
menu->updateParent(LLMenuGL::sMenuContainer);
LLRect rect = mOverflowBtn->getRect();
- menu->setButtonRect(rect, this);
LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
}
@@ -652,9 +772,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
}
else if (item == "pick")
{
- if (!mPlaceInfo)
- return;
-
if (mPickPanel == NULL)
{
mPickPanel = LLPanelPickEdit::create();
@@ -667,96 +784,139 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
togglePickPanel(TRUE);
mPickPanel->onOpen(LLSD());
- mPlaceInfo->createPick(mPosGlobal, mPickPanel);
+
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel)
+ {
+ panel->createPick(mPosGlobal, mPickPanel);
+ }
LLRect rect = getRect();
mPickPanel->reshape(rect.getWidth(), rect.getHeight());
mPickPanel->setRect(rect);
}
- else if (item == "add_to_favbar")
- {
- if ( mItem.notNull() )
- {
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
- if ( favorites_id.notNull() )
- {
- copy_inventory_item(gAgent.getID(),
- mItem->getPermissions().getOwner(),
- mItem->getUUID(),
- favorites_id,
- std::string(),
- LLPointer<LLInventoryCallback>(NULL));
- llinfos << "Copied inventory item #" << mItem->getUUID() << " to favorites." << llendl;
- }
- }
- }
+ else if (item == "add_to_favbar")
+ {
+ if ( mItem.notNull() )
+ {
+ const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ if ( favorites_id.notNull() )
+ {
+ copy_inventory_item(gAgent.getID(),
+ mItem->getPermissions().getOwner(),
+ mItem->getUUID(),
+ favorites_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ llinfos << "Copied inventory item #" << mItem->getUUID() << " to favorites." << llendl;
+ }
+ }
+ }
}
void LLPanelPlaces::onBackButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->isMediaPanelVisible())
- {
- toggleMediaPanel();
- }
- else
- {
- togglePlaceInfoPanel(FALSE);
+ togglePlaceInfoPanel(FALSE);
- // Resetting mPlaceInfoType when Place Info panel is closed.
- mPlaceInfoType = LLStringUtil::null;
+ // Resetting mPlaceInfoType when Place Info panel is closed.
+ mPlaceInfoType = LLStringUtil::null;
- isLandmarkEditModeOn = false;
- }
+ isLandmarkEditModeOn = false;
updateVerbs();
}
-void LLPanelPlaces::toggleMediaPanel()
-{
- if (!mPlaceInfo)
- return;
-
- mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible());
-
- // Refresh the current place info because
- // the media panel controls can't refer to
- // the remote parcel media.
- onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
-}
-
void LLPanelPlaces::togglePickPanel(BOOL visible)
{
- setAllChildrenVisible(this, !visible);
-
if (mPickPanel)
mPickPanel->setVisible(visible);
}
void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
{
- if (!mPlaceInfo)
+ if (!mPlaceProfile || !mLandmarkInfo)
return;
- mPlaceInfo->setVisible(visible);
mFilterEditor->setVisible(!visible);
mTabContainer->setVisible(!visible);
- if (visible)
+ if (mPlaceInfoType == AGENT_INFO_TYPE ||
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
- mPlaceInfo->resetLocation();
+ mPlaceProfile->setVisible(visible);
- LLRect rect = getRect();
- LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
- mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
+ if (visible)
+ {
+ mPlaceProfile->resetLocation();
+
+ // Do not reset location info until mResetInfoTimer has expired
+ // to avoid text blinking.
+ mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL);
+
+ LLRect rect = getRect();
+ LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+ mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight());
+
+ mLandmarkInfo->setVisible(FALSE);
+ }
+ else if (mPlaceInfoType == AGENT_INFO_TYPE)
+ {
+ LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver);
+
+ // Clear reference to parcel selection when closing place profile panel.
+ // LLViewerParcelMgr removes the selection if it has 1 reference to it.
+ mParcel.clear();
+ }
+ }
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_INFO_TYPE)
+ {
+ mLandmarkInfo->setVisible(visible);
+
+ if (visible)
+ {
+ mLandmarkInfo->resetLocation();
+
+ 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
+ {
+ LLLandmarksPanel* landmarks_panel =
+ dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks"));
+ if (landmarks_panel && mItem.notNull())
+ {
+ // If a landmark info is being closed we open the landmarks tab
+ // and set this landmark selected.
+ mTabContainer->selectTabPanel(landmarks_panel);
+
+ landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
+ }
+ }
+ }
+}
+
+// virtual
+void LLPanelPlaces::handleVisibilityChange(BOOL new_visibility)
+{
+ LLPanel::handleVisibilityChange(new_visibility);
+
+ if (!new_visibility && mPlaceInfoType == AGENT_INFO_TYPE)
+ {
+ LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver);
+
+ // Clear reference to parcel selection when closing places panel.
+ mParcel.clear();
}
}
void LLPanelPlaces::changedParcelSelection()
{
- if (!mPlaceInfo)
+ if (!mPlaceProfile)
return;
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -766,6 +926,8 @@ void LLPanelPlaces::changedParcelSelection()
if (!region || !parcel)
return;
+ LLVector3d prev_pos_global = mPosGlobal;
+
// If agent is inside the selected parcel show agent's region<X, Y, Z>,
// otherwise show region<X, Y, Z> of agent's selection point.
bool is_current_parcel = is_agent_in_selected_parcel(parcel);
@@ -782,13 +944,20 @@ void LLPanelPlaces::changedParcelSelection()
}
}
- mPlaceInfo->resetLocation();
- mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
+ // Reset location info only if global position has changed
+ // and update timer has expired to reduce unnecessary text and icons updates.
+ if (prev_pos_global != mPosGlobal && mResetInfoTimer.hasExpired())
+ {
+ mPlaceProfile->resetLocation();
+ mResetInfoTimer.setTimerExpirySec(PLACE_INFO_UPDATE_INTERVAL);
+ }
+
+ mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
updateVerbs();
}
-void LLPanelPlaces::changedInventory(U32 mask)
+void LLPanelPlaces::createTabs()
{
if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance()))
return;
@@ -823,48 +992,69 @@ void LLPanelPlaces::changedInventory(U32 mask)
// Filter applied to show all items.
if (mActivePanel)
- mActivePanel->onSearchEdit(mFilterSubString);
-
- // we don't need to monitor inventory changes anymore,
- // so remove the observer
- gInventory.removeObserver(mInventoryObserver);
+ mActivePanel->onSearchEdit(mActivePanel->getFilterSubString());
}
-void LLPanelPlaces::onAgentParcelChange()
+void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos)
{
- if (!mPlaceInfo)
- return;
+ mPosGlobal = global_pos;
+ updateVerbs();
+}
- if (mPlaceInfo->isMediaPanelVisible())
- {
- onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
- }
- else
+void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
+{
+ for (std::vector<LLUUID>::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- updateVerbs();
+ const LLUUID& item_id = (*item_iter);
+ if(!highlight_offered_item(item_id))
+ {
+ continue;
+ }
+
+ LLInventoryItem* item = gInventory.getItem(item_id);
+
+ llassert(item);
+ if (item && (LLAssetType::AT_LANDMARK == item->getType()) )
+ {
+ // Created landmark is passed to Places panel to allow its editing.
+ // If the panel is closed we don't reopen it until created landmark is loaded.
+ if("create_landmark" == getPlaceInfoType() && !getItem())
+ {
+ setItem(item);
+ }
+ }
}
}
void LLPanelPlaces::updateVerbs()
{
- if (!mPlaceInfo)
- return;
+ bool is_place_info_visible;
+
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel)
+ {
+ is_place_info_visible = panel->getVisible();
+ }
+ else
+ {
+ is_place_info_visible = false;
+ }
- bool is_place_info_visible = mPlaceInfo->getVisible();
bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE;
- bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();
+ bool have_3d_pos = ! mPosGlobal.isExactlyZero();
mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mShareBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible);
+ mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
if (is_place_info_visible)
{
@@ -872,16 +1062,20 @@ void LLPanelPlaces::updateVerbs()
{
// We don't need to teleport to the current location
// so check if the location is not within the current parcel.
- mTeleportBtn->setEnabled(!is_media_panel_visible &&
- !mPosGlobal.isExactlyZero() &&
+ mTeleportBtn->setEnabled(have_3d_pos &&
!LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
- mTeleportBtn->setEnabled(TRUE);
+ mTeleportBtn->setEnabled(have_3d_pos);
}
- mShowOnMapBtn->setEnabled(!is_media_panel_visible);
+ // Do not enable landmark info Back button when we are waiting
+ // for newly created landmark to load.
+ if (!is_create_landmark_visible)
+ {
+ mLandmarkInfoBackBtn->setEnabled(TRUE);
+ }
}
else
{
@@ -890,6 +1084,23 @@ void LLPanelPlaces::updateVerbs()
}
}
+LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()
+{
+ if (mPlaceInfoType == AGENT_INFO_TYPE ||
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+ {
+ return mPlaceProfile;
+ }
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_INFO_TYPE)
+ {
+ return mLandmarkInfo;
+ }
+
+ return NULL;
+}
+
static bool is_agent_in_selected_parcel(LLParcel* parcel)
{
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -909,18 +1120,5 @@ static void onSLURLBuilt(std::string& slurl)
LLSD args;
args["SLURL"] = slurl;
- LLNotifications::instance().add("CopySLURL", args);
-}
-
-static void setAllChildrenVisible(LLView* view, BOOL visible)
-{
- const LLView::child_list_t* children = view->getChildList();
- for (LLView::child_list_const_iter_t child_it = children->begin(); child_it != children->end(); ++child_it)
- {
- LLView* child = *child_it;
- if (child->getParent() == view)
- {
- child->setVisible(visible);
- }
- }
+ LLNotificationsUtil::add("CopySLURL", args);
}
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index e2d281dd84..78fcbbb11d 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -32,17 +32,24 @@
#ifndef LL_LLPANELPLACES_H
#define LL_LLPANELPLACES_H
+#include "lltimer.h"
+
#include "llpanel.h"
class LLInventoryItem;
class LLFilterEditor;
class LLLandmark;
+
+class LLPanelLandmarkInfo;
+class LLPanelPlaceProfile;
+
class LLPanelPickEdit;
class LLPanelPlaceInfo;
class LLPanelPlacesTab;
class LLParcelSelection;
class LLPlacesInventoryObserver;
class LLPlacesParcelObserver;
+class LLRemoteParcelInfoObserver;
class LLTabContainer;
class LLToggleableMenu;
@@ -59,17 +66,28 @@ public:
// Called on parcel selection change to update place information.
void changedParcelSelection();
- // Called on agent inventory change to find out when inventory gets usable.
- void changedInventory(U32 mask);
+ // Called once on agent inventory first change to find out when inventory gets usable
+ // and to create "My Landmarks" and "Teleport History" tabs.
+ void createTabs();
+ // Called when we receive the global 3D position of a parcel.
+ void changedGlobalPos(const LLVector3d &global_pos);
+
+ // Opens landmark info panel when agent creates or receives landmark.
+ void showAddedLandmarkInfo(const std::vector<LLUUID>& items);
void setItem(LLInventoryItem* item);
+ LLInventoryItem* getItem() { return mItem; }
+
+ std::string getPlaceInfoType() { return mPlaceInfoType; }
+
+ /*virtual*/ S32 notifyParent(const LLSD& info);
+
private:
void onLandmarkLoaded(LLLandmark* landmark);
void onFilterEdit(const std::string& search_string, bool force_filter);
void onTabSelected();
- //void onShareButtonClicked();
void onTeleportButtonClicked();
void onShowOnMapButtonClicked();
void onEditButtonClicked();
@@ -85,20 +103,26 @@ private:
void togglePickPanel(BOOL visible);
void togglePlaceInfoPanel(BOOL visible);
- void onAgentParcelChange();
+ /*virtual*/ void handleVisibilityChange(BOOL new_visibility);
+
void updateVerbs();
+ LLPanelPlaceInfo* getCurrentInfoPanel();
+
LLFilterEditor* mFilterEditor;
LLPanelPlacesTab* mActivePanel;
LLTabContainer* mTabContainer;
- LLPanelPlaceInfo* mPlaceInfo;
+ LLPanelPlaceProfile* mPlaceProfile;
+ LLPanelLandmarkInfo* mLandmarkInfo;
+
LLPanelPickEdit* mPickPanel;
LLToggleableMenu* mPlaceMenu;
LLToggleableMenu* mLandmarkMenu;
+ LLButton* mPlaceProfileBackBtn;
+ LLButton* mLandmarkInfoBackBtn;
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
- LLButton* mShareBtn;
LLButton* mEditBtn;
LLButton* mSaveBtn;
LLButton* mCancelBtn;
@@ -107,6 +131,7 @@ private:
LLPlacesInventoryObserver* mInventoryObserver;
LLPlacesParcelObserver* mParcelObserver;
+ LLRemoteParcelInfoObserver* mRemoteParcelObserver;
// Pointer to a landmark item or to a linked landmark
LLPointer<LLInventoryItem> mItem;
@@ -115,9 +140,9 @@ private:
// be available (hence zero)
LLVector3d mPosGlobal;
- // Search string for filtering landmarks and teleport
- // history locations
- std::string mFilterSubString;
+ // Sets a period of time during which the requested place information
+ // is expected to be updated and doesn't need to be reset.
+ LLTimer mResetInfoTimer;
// Information type currently shown in Place Information panel
std::string mPlaceInfoType;
diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp
index 7c0a7b0cc4..9806b8c64d 100644
--- a/indra/newview/llpanelplacestab.cpp
+++ b/indra/newview/llpanelplacestab.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -33,14 +33,17 @@
#include "llpanelplacestab.h"
-#include "llwindow.h"
+#include "llbutton.h"
+#include "llnotificationsutil.h"
-#include "llnotifications.h"
+#include "llwindow.h"
-#include "llbutton.h"
+#include "llpanelplaces.h"
#include "llslurl.h"
#include "llworldmap.h"
+std::string LLPanelPlacesTab::sFilterSubString = LLStringUtil::null;
+
bool LLPanelPlacesTab::isTabVisible()
{
LLUICtrl* parent = getParentUICtrl();
@@ -51,7 +54,6 @@ bool LLPanelPlacesTab::isTabVisible()
void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel)
{
- //mShareBtn = panel->getChild<LLButton>("share_btn");
mTeleportBtn = panel->getChild<LLButton>("teleport_btn");
mShowOnMapBtn = panel->getChild<LLButton>("map_btn");
}
@@ -83,5 +85,5 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
LLSD args;
args["SLURL"] = sl_url;
- LLNotifications::instance().add("CopySLURL", args);
+ LLNotificationsUtil::add("CopySLURL", args);
}
diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h
index 1c70869414..ce77a42259 100644
--- a/indra/newview/llpanelplacestab.h
+++ b/indra/newview/llpanelplacestab.h
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2004-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -34,7 +34,7 @@
#include "llpanel.h"
-#include "llpanelplaces.h"
+class LLPanelPlaces;
class LLPanelPlacesTab : public LLPanel
{
@@ -44,10 +44,8 @@ public:
virtual void onSearchEdit(const std::string& string) = 0;
virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel
- //virtual void onShare() = 0;
virtual void onShowOnMap() = 0;
virtual void onTeleport() = 0;
- //virtual void onCopySLURL() = 0;
bool isTabVisible(); // Check if parent TabContainer is visible.
@@ -57,10 +55,16 @@ public:
const std::string& url,
const LLUUID& snapshot_id,
bool teleport);
+
+ const std::string& getFilterSubString() { return sFilterSubString; }
+ void setFilterSubString(const std::string& string) { sFilterSubString = string; }
+
protected:
- //LLButton* mShareBtn;
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
+
+ // Search string for filtering landmarks and teleport history locations
+ static std::string sFilterSubString;
};
#endif //LL_LLPANELPLACESTAB_H
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index e4b32c4820..a53a3ba1ad 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -44,6 +44,7 @@
#include "llbutton.h"
#include "llface.h"
#include "llcombobox.h"
+#include "lllayoutstack.h"
#include "llslider.h"
#include "llhudview.h"
#include "lliconctrl.h"
@@ -53,7 +54,10 @@
#include "llpanelprimmediacontrols.h"
#include "llpluginclassmedia.h"
#include "llprogressbar.h"
+#include "llsliderctrl.h"
+#include "llstring.h"
#include "llviewercontrol.h"
+#include "llviewerdisplay.h"
#include "llviewerparcelmgr.h"
#include "llviewermedia.h"
#include "llviewermediafocus.h"
@@ -61,12 +65,13 @@
#include "llweb.h"
#include "llwindow.h"
+#include "llfloatertools.h" // to enable hide if build tools are up
+
+// Functions pulled from pipeline.cpp
glh::matrix4f glh_get_current_modelview();
glh::matrix4f glh_get_current_projection();
-
-const F32 ZOOM_NEAR_PADDING = 1.0f;
-const F32 ZOOM_MEDIUM_PADDING = 1.15f;
-const F32 ZOOM_FAR_PADDING = 1.5f;
+// Functions pulled from llviewerdisplay.cpp
+bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model);
// Warning: make sure these two match!
const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
@@ -85,13 +90,20 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mClearFaceOnFade(false),
mCurrentRate(0.0),
mMovieDuration(0.0),
- mUpdatePercent(0)
+ mTargetObjectID(LLUUID::null),
+ mTargetObjectFace(0),
+ mTargetImplID(LLUUID::null),
+ mTargetObjectNormal(LLVector3::zero),
+ mZoomObjectID(LLUUID::null),
+ mZoomObjectFace(0),
+ mVolumeSliderVisible(0)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
mCommitCallbackRegistrar.add("MediaCtrl.Forward", boost::bind(&LLPanelPrimMediaControls::onClickForward, this));
mCommitCallbackRegistrar.add("MediaCtrl.Home", boost::bind(&LLPanelPrimMediaControls::onClickHome, this));
mCommitCallbackRegistrar.add("MediaCtrl.Stop", boost::bind(&LLPanelPrimMediaControls::onClickStop, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.MediaStop", boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this));
mCommitCallbackRegistrar.add("MediaCtrl.Reload", boost::bind(&LLPanelPrimMediaControls::onClickReload, this));
mCommitCallbackRegistrar.add("MediaCtrl.Play", boost::bind(&LLPanelPrimMediaControls::onClickPlay, this));
mCommitCallbackRegistrar.add("MediaCtrl.Pause", boost::bind(&LLPanelPrimMediaControls::onClickPause, this));
@@ -101,7 +113,12 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mCommitCallbackRegistrar.add("MediaCtrl.JumpProgress", boost::bind(&LLPanelPrimMediaControls::onCommitSlider, this));
mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.Volume", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this));
mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute", boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.ShowVolumeSlider", boost::bind(&LLPanelPrimMediaControls::showVolumeSlider, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.HideVolumeSlider", boost::bind(&LLPanelPrimMediaControls::hideVolumeSlider, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml");
mInactivityTimer.reset();
@@ -110,37 +127,92 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mScrollState = SCROLL_NONE;
mPanelHandle.bind(this);
+
+ mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
+ mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
}
+
LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
{
}
BOOL LLPanelPrimMediaControls::postBuild()
{
- LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup");
- scroll_up_ctrl->setClickedCallback(onScrollUp, this);
- scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
- scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft");
- scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
- scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
- scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright");
- scroll_right_ctrl->setClickedCallback(onScrollRight, this);
- scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
- scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown");
- scroll_down_ctrl->setClickedCallback(onScrollDown, this);
- scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
- scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+ mMediaRegion = getChild<LLView>("media_region");
+ mBackCtrl = getChild<LLUICtrl>("back");
+ mFwdCtrl = getChild<LLUICtrl>("fwd");
+ mReloadCtrl = getChild<LLUICtrl>("reload");
+ mPlayCtrl = getChild<LLUICtrl>("play");
+ mPauseCtrl = getChild<LLUICtrl>("pause");
+ mStopCtrl = getChild<LLUICtrl>("stop");
+ mMediaStopCtrl = getChild<LLUICtrl>("media_stop");
+ mHomeCtrl = getChild<LLUICtrl>("home");
+ mUnzoomCtrl = getChild<LLUICtrl>("close"); // This is actually "unzoom"
+ mOpenCtrl = getChild<LLUICtrl>("new_window");
+ mZoomCtrl = getChild<LLUICtrl>("zoom_frame");
+ mMediaProgressPanel = getChild<LLPanel>("media_progress_indicator");
+ mMediaProgressBar = getChild<LLProgressBar>("media_progress_bar");
+ mMediaAddressCtrl = getChild<LLUICtrl>("media_address");
+ mMediaAddress = getChild<LLUICtrl>("media_address_url");
+ mMediaPlaySliderPanel = getChild<LLUICtrl>("media_play_position");
+ mMediaPlaySliderCtrl = getChild<LLUICtrl>("media_play_slider");
+ mSkipFwdCtrl = getChild<LLUICtrl>("skip_forward");
+ mSkipBackCtrl = getChild<LLUICtrl>("skip_back");
+ mVolumeCtrl = getChild<LLUICtrl>("media_volume");
+ mMuteBtn = getChild<LLButton>("media_mute_button");
+ mVolumeSliderCtrl = getChild<LLSliderCtrl>("volume_slider");
+ mWhitelistIcon = getChild<LLIconCtrl>("media_whitelist_flag");
+ mSecureLockIcon = getChild<LLIconCtrl>("media_secure_lock_flag");
+ mMediaControlsStack = getChild<LLLayoutStack>("media_controls");
+ mLeftBookend = getChild<LLUICtrl>("left_bookend");
+ mRightBookend = getChild<LLUICtrl>("right_bookend");
+ mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
+ mVolumeSliderBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
+ LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
+ LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
+ LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
+ LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
+ LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
+ LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
+ LLStringUtil::convertToS32(getString("top_world_view_avoid_zone"), mTopWorldViewAvoidZone);
+
+ // These are currently removed...but getChild creates a "dummy" widget.
+ // This class handles them missing.
+ mMediaPanelScroll = findChild<LLUICtrl>("media_panel_scroll");
+ mScrollUpCtrl = findChild<LLButton>("scrollup");
+ mScrollLeftCtrl = findChild<LLButton>("scrollleft");
+ mScrollRightCtrl = findChild<LLButton>("scrollright");
+ mScrollDownCtrl = findChild<LLButton>("scrolldown");
+
+ if (mScrollUpCtrl)
+ {
+ mScrollUpCtrl->setClickedCallback(onScrollUp, this);
+ mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this);
+ mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollLeftCtrl)
+ {
+ mScrollLeftCtrl->setClickedCallback(onScrollLeft, this);
+ mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this);
+ mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollRightCtrl)
+ {
+ mScrollRightCtrl->setClickedCallback(onScrollRight, this);
+ mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this);
+ mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollDownCtrl)
+ {
+ mScrollDownCtrl->setClickedCallback(onScrollDown, this);
+ mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this);
+ mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+
+ mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
- LLUICtrl* media_address = getChild<LLUICtrl>("media_address");
- media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
- mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
- mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
-
mCurrentZoom = ZOOM_NONE;
- // clicks on HUD buttons do not remove keyboard focus from media
+ // clicks on buttons do not remove keyboard focus from media
setIsChrome(TRUE);
return TRUE;
}
@@ -149,11 +221,15 @@ void LLPanelPrimMediaControls::setMediaFace(LLPointer<LLViewerObject> objectp, S
{
if (media_impl.notNull() && objectp.notNull())
{
+ LLUUID prev_id = mTargetImplID;
mTargetImplID = media_impl->getMediaTextureID();
mTargetObjectID = objectp->getID();
mTargetObjectFace = face;
mTargetObjectNormal = pick_normal;
mClearFaceOnFade = false;
+
+ if (prev_id != mTargetImplID)
+ mVolumeSliderCtrl->setValue(media_impl->getVolume());
}
else
{
@@ -206,13 +282,10 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
void LLPanelPrimMediaControls::updateShape()
{
- const S32 MIN_HUD_WIDTH=400;
- const S32 MIN_HUD_HEIGHT=120;
-
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
LLViewerObject* objectp = getTargetObject();
- if(!media_impl)
+ if(!media_impl || gFloaterTools->getVisible())
{
setVisible(FALSE);
return;
@@ -228,7 +301,11 @@ void LLPanelPrimMediaControls::updateShape()
bool can_navigate = parcel->getMediaAllowNavigate();
bool enabled = false;
- bool has_focus = media_impl->hasFocus();
+ bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
+ // There is no such thing as "has_focus" being different from normal controls set
+ // anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus'
+ // to 'true' (or, actually, we use a setting)
+ bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true;
setVisible(enabled);
if (objectp)
@@ -237,95 +314,76 @@ void LLPanelPrimMediaControls::updateShape()
LLMediaEntry *media_data = objectp->getTE(mTargetObjectFace)->getMediaData();
if (media_data && NULL != dynamic_cast<LLVOVolume*>(objectp))
{
- // Don't show the media HUD if we do not have permissions
+ // Don't show the media controls if we do not have permissions
enabled = dynamic_cast<LLVOVolume*>(objectp)->hasMediaPermission(media_data, LLVOVolume::MEDIA_PERM_CONTROL);
mini_controls = (LLMediaEntry::MINI == media_data->getControls());
}
+ const bool is_hud = objectp->isHUDAttachment();
//
// Set the state of the buttons
//
- LLUICtrl* back_ctrl = getChild<LLUICtrl>("back");
- LLUICtrl* fwd_ctrl = getChild<LLUICtrl>("fwd");
- LLUICtrl* reload_ctrl = getChild<LLUICtrl>("reload");
- LLUICtrl* play_ctrl = getChild<LLUICtrl>("play");
- LLUICtrl* pause_ctrl = getChild<LLUICtrl>("pause");
- LLUICtrl* stop_ctrl = getChild<LLUICtrl>("stop");
- LLUICtrl* media_stop_ctrl = getChild<LLUICtrl>("media_stop");
- LLUICtrl* home_ctrl = getChild<LLUICtrl>("home");
- LLUICtrl* close_ctrl = getChild<LLUICtrl>("close");
- LLUICtrl* open_ctrl = getChild<LLUICtrl>("new_window");
- LLUICtrl* zoom_ctrl = getChild<LLUICtrl>("zoom_frame");
- LLPanel* media_loading_panel = getChild<LLPanel>("media_progress_indicator");
- LLUICtrl* media_address_ctrl = getChild<LLUICtrl>("media_address");
- LLUICtrl* media_play_slider_panel = getChild<LLUICtrl>("media_play_position");
- LLUICtrl* media_play_slider_ctrl = getChild<LLUICtrl>("media_play_slider");
- LLUICtrl* volume_ctrl = getChild<LLUICtrl>("media_volume");
- LLButton* volume_btn = getChild<LLButton>("media_volume_button");
- LLUICtrl* volume_up_ctrl = getChild<LLUICtrl>("volume_up");
- LLUICtrl* volume_down_ctrl = getChild<LLUICtrl>("volume_down");
- LLIconCtrl* whitelist_icon = getChild<LLIconCtrl>("media_whitelist_flag");
- LLIconCtrl* secure_lock_icon = getChild<LLIconCtrl>("media_secure_lock_flag");
- LLUICtrl* media_panel_scroll = getChild<LLUICtrl>("media_panel_scroll");
- LLUICtrl* scroll_up_ctrl = getChild<LLUICtrl>("scrollup");
- LLUICtrl* scroll_left_ctrl = getChild<LLUICtrl>("scrollleft");
- LLUICtrl* scroll_right_ctrl = getChild<LLUICtrl>("scrollright");
- LLUICtrl* scroll_down_ctrl = getChild<LLUICtrl>("scrolldown");
-
// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,
// and that only the proper controls get made visible/enabled according to that mode.
- back_ctrl->setVisible(has_focus);
- fwd_ctrl->setVisible(has_focus);
- reload_ctrl->setVisible(has_focus);
- stop_ctrl->setVisible(false);
- home_ctrl->setVisible(has_focus);
- close_ctrl->setVisible(has_focus);
- open_ctrl->setVisible(true);
- media_address_ctrl->setVisible(has_focus && !mini_controls);
- media_play_slider_panel->setVisible(has_focus && !mini_controls);
- volume_ctrl->setVisible(false);
- volume_up_ctrl->setVisible(false);
- volume_down_ctrl->setVisible(false);
+ mBackCtrl->setVisible(has_focus);
+ mFwdCtrl->setVisible(has_focus);
+ mReloadCtrl->setVisible(has_focus);
+ mStopCtrl->setVisible(false);
+ mHomeCtrl->setVisible(has_focus);
+ mZoomCtrl->setVisible(!is_zoomed);
+ mUnzoomCtrl->setVisible(is_zoomed);
+ mOpenCtrl->setVisible(true);
+ mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+ mVolumeCtrl->setVisible(false);
- whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
+ mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
// Disable zoom if HUD
- zoom_ctrl->setEnabled(!objectp->isHUDAttachment());
- secure_lock_icon->setVisible(false);
+ mZoomCtrl->setEnabled(!is_hud);
+ mUnzoomCtrl->setEnabled(!is_hud);
+ mSecureLockIcon->setVisible(false);
mCurrentURL = media_impl->getCurrentMediaURL();
- back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
- fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
- stop_ctrl->setEnabled(has_focus && can_navigate);
- home_ctrl->setEnabled(has_focus && can_navigate);
+ mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
+ mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
+ mStopCtrl->setEnabled(has_focus && can_navigate);
+ mHomeCtrl->setEnabled(has_focus && can_navigate);
LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
-
+
if(media_plugin && media_plugin->pluginSupportsMediaTime())
{
- reload_ctrl->setEnabled(FALSE);
- reload_ctrl->setVisible(FALSE);
- media_stop_ctrl->setVisible(has_focus);
- home_ctrl->setVisible(FALSE);
- back_ctrl->setEnabled(has_focus);
- fwd_ctrl->setEnabled(has_focus);
- media_address_ctrl->setVisible(false);
- media_address_ctrl->setEnabled(false);
- media_play_slider_panel->setVisible(!mini_controls);
- media_play_slider_panel->setEnabled(!mini_controls);
-
- volume_ctrl->setVisible(has_focus);
- volume_up_ctrl->setVisible(has_focus);
- volume_down_ctrl->setVisible(has_focus);
- volume_ctrl->setEnabled(has_focus);
-
- whitelist_icon->setVisible(false);
- secure_lock_icon->setVisible(false);
- scroll_up_ctrl->setVisible(false);
- scroll_left_ctrl->setVisible(false);
- scroll_right_ctrl->setVisible(false);
- scroll_down_ctrl->setVisible(false);
- media_panel_scroll->setVisible(false);
-
+ mReloadCtrl->setEnabled(false);
+ mReloadCtrl->setVisible(false);
+ mMediaStopCtrl->setVisible(has_focus);
+ mHomeCtrl->setVisible(has_focus);
+ mBackCtrl->setVisible(false);
+ mFwdCtrl->setVisible(false);
+ mMediaAddressCtrl->setVisible(false);
+ mMediaAddressCtrl->setEnabled(false);
+ mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
+ mSkipFwdCtrl->setVisible(has_focus && !mini_controls);
+ mSkipFwdCtrl->setEnabled(has_focus && !mini_controls);
+ mSkipBackCtrl->setVisible(has_focus && !mini_controls);
+ mSkipBackCtrl->setEnabled(has_focus && !mini_controls);
+
+ mVolumeCtrl->setVisible(has_focus);
+ mVolumeCtrl->setEnabled(has_focus);
+ mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible());
+ mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible());
+
+ mWhitelistIcon->setVisible(false);
+ mSecureLockIcon->setVisible(false);
+ if (mMediaPanelScroll)
+ {
+ mMediaPanelScroll->setVisible(false);
+ mScrollUpCtrl->setVisible(false);
+ mScrollDownCtrl->setVisible(false);
+ mScrollRightCtrl->setVisible(false);
+ mScrollDownCtrl->setVisible(false);
+ }
+
F32 volume = media_impl->getVolume();
// movie's url changed
if(mCurrentURL!=mPreviousURL)
@@ -333,61 +391,52 @@ void LLPanelPrimMediaControls::updateShape()
mMovieDuration = media_plugin->getDuration();
mPreviousURL = mCurrentURL;
}
-
+
if(mMovieDuration == 0)
{
mMovieDuration = media_plugin->getDuration();
- media_play_slider_ctrl->setValue(0);
- media_play_slider_ctrl->setEnabled(false);
+ mMediaPlaySliderCtrl->setValue(0);
+ mMediaPlaySliderCtrl->setEnabled(false);
}
// TODO: What if it's not fully loaded
-
+
if(mUpdateSlider && mMovieDuration!= 0)
{
F64 current_time = media_plugin->getCurrentTime();
F32 percent = current_time / mMovieDuration;
- media_play_slider_ctrl->setValue(percent);
- media_play_slider_ctrl->setEnabled(true);
+ mMediaPlaySliderCtrl->setValue(percent);
+ mMediaPlaySliderCtrl->setEnabled(true);
}
-
+
// video vloume
if(volume <= 0.0)
{
- volume_up_ctrl->setEnabled(TRUE);
- volume_down_ctrl->setEnabled(FALSE);
- media_impl->setVolume(0.0);
- volume_btn->setToggleState(true);
+ mMuteBtn->setToggleState(true);
}
else if (volume >= 1.0)
{
- volume_up_ctrl->setEnabled(FALSE);
- volume_down_ctrl->setEnabled(TRUE);
- media_impl->setVolume(1.0);
- volume_btn->setToggleState(false);
+ mMuteBtn->setToggleState(false);
}
else
{
- volume_up_ctrl->setEnabled(TRUE);
- volume_down_ctrl->setEnabled(TRUE);
+ mMuteBtn->setToggleState(false);
}
-
+
switch(result)
{
case LLPluginClassMediaOwner::MEDIA_PLAYING:
- play_ctrl->setEnabled(FALSE);
- play_ctrl->setVisible(FALSE);
- pause_ctrl->setEnabled(TRUE);
- pause_ctrl->setVisible(has_focus);
- media_stop_ctrl->setEnabled(TRUE);
+ mPlayCtrl->setEnabled(FALSE);
+ mPlayCtrl->setVisible(FALSE);
+ mPauseCtrl->setEnabled(TRUE);
+ mPauseCtrl->setVisible(has_focus);
break;
case LLPluginClassMediaOwner::MEDIA_PAUSED:
default:
- pause_ctrl->setEnabled(FALSE);
- pause_ctrl->setVisible(FALSE);
- play_ctrl->setEnabled(TRUE);
- play_ctrl->setVisible(has_focus);
- media_stop_ctrl->setEnabled(FALSE);
+ mPauseCtrl->setEnabled(FALSE);
+ mPauseCtrl->setVisible(FALSE);
+ mPlayCtrl->setEnabled(TRUE);
+ mPlayCtrl->setVisible(has_focus);
break;
}
}
@@ -401,78 +450,80 @@ void LLPanelPrimMediaControls::updateShape()
{
mCurrentURL.clear();
}
-
- play_ctrl->setVisible(FALSE);
- pause_ctrl->setVisible(FALSE);
- media_stop_ctrl->setVisible(FALSE);
- media_address_ctrl->setVisible(has_focus && !mini_controls);
- media_address_ctrl->setEnabled(has_focus && !mini_controls);
- media_play_slider_panel->setVisible(FALSE);
- media_play_slider_panel->setEnabled(FALSE);
-
- volume_ctrl->setVisible(FALSE);
- volume_up_ctrl->setVisible(FALSE);
- volume_down_ctrl->setVisible(FALSE);
- volume_ctrl->setEnabled(FALSE);
- volume_up_ctrl->setEnabled(FALSE);
- volume_down_ctrl->setEnabled(FALSE);
-
- scroll_up_ctrl->setVisible(has_focus);
- scroll_left_ctrl->setVisible(has_focus);
- scroll_right_ctrl->setVisible(has_focus);
- scroll_down_ctrl->setVisible(has_focus);
- media_panel_scroll->setVisible(has_focus);
+
+ mPlayCtrl->setVisible(FALSE);
+ mPauseCtrl->setVisible(FALSE);
+ mMediaStopCtrl->setVisible(FALSE);
+ mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+ mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setVisible(FALSE);
+ mMediaPlaySliderPanel->setEnabled(FALSE);
+ mSkipFwdCtrl->setVisible(FALSE);
+ mSkipFwdCtrl->setEnabled(FALSE);
+ mSkipBackCtrl->setVisible(FALSE);
+ mSkipBackCtrl->setEnabled(FALSE);
+
+ mVolumeCtrl->setVisible(FALSE);
+ mVolumeSliderCtrl->setVisible(FALSE);
+ mVolumeCtrl->setEnabled(FALSE);
+ mVolumeSliderCtrl->setEnabled(FALSE);
+
+ if (mMediaPanelScroll)
+ {
+ mMediaPanelScroll->setVisible(has_focus);
+ mScrollUpCtrl->setVisible(has_focus);
+ mScrollDownCtrl->setVisible(has_focus);
+ mScrollRightCtrl->setVisible(has_focus);
+ mScrollDownCtrl->setVisible(has_focus);
+ }
// TODO: get the secure lock bool from media plug in
std::string prefix = std::string("https://");
std::string test_prefix = mCurrentURL.substr(0, prefix.length());
LLStringUtil::toLower(test_prefix);
if(test_prefix == prefix)
{
- secure_lock_icon->setVisible(has_focus);
+ mSecureLockIcon->setVisible(has_focus);
}
-
+
if(mCurrentURL!=mPreviousURL)
{
setCurrentURL();
mPreviousURL = mCurrentURL;
}
-
+
if(result == LLPluginClassMediaOwner::MEDIA_LOADING)
{
- reload_ctrl->setEnabled(FALSE);
- reload_ctrl->setVisible(FALSE);
- stop_ctrl->setEnabled(TRUE);
- stop_ctrl->setVisible(has_focus);
+ mReloadCtrl->setEnabled(FALSE);
+ mReloadCtrl->setVisible(FALSE);
+ mStopCtrl->setEnabled(TRUE);
+ mStopCtrl->setVisible(has_focus);
}
else
{
- reload_ctrl->setEnabled(TRUE);
- reload_ctrl->setVisible(has_focus);
- stop_ctrl->setEnabled(FALSE);
- stop_ctrl->setVisible(FALSE);
+ mReloadCtrl->setEnabled(TRUE);
+ mReloadCtrl->setVisible(has_focus);
+ mStopCtrl->setEnabled(FALSE);
+ mStopCtrl->setVisible(FALSE);
}
}
-
+
if(media_plugin)
{
//
// Handle progress bar
//
- mUpdatePercent = media_plugin->getProgressPercent();
- if(mUpdatePercent<100.0f)
- {
- media_loading_panel->setVisible(true);
- getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent);
- gFocusMgr.setTopCtrl(media_loading_panel);
+ if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
+ {
+ mMediaProgressPanel->setVisible(true);
+ mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
}
else
{
- media_loading_panel->setVisible(false);
- gFocusMgr.setTopCtrl(NULL);
+ mMediaProgressPanel->setVisible(false);
}
}
-
+
if(media_impl)
{
//
@@ -480,44 +531,43 @@ void LLPanelPrimMediaControls::updateShape()
//
switch (mScrollState)
{
- case SCROLL_UP:
- media_impl->scrollWheel(0, -1, MASK_NONE);
- break;
- case SCROLL_DOWN:
- media_impl->scrollWheel(0, 1, MASK_NONE);
- break;
- case SCROLL_LEFT:
- media_impl->scrollWheel(1, 0, MASK_NONE);
-// media_impl->handleKeyHere(KEY_LEFT, MASK_NONE);
- break;
- case SCROLL_RIGHT:
- media_impl->scrollWheel(-1, 0, MASK_NONE);
-// media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
- break;
- case SCROLL_NONE:
- default:
- break;
+ case SCROLL_UP:
+ media_impl->scrollWheel(0, -1, MASK_NONE);
+ break;
+ case SCROLL_DOWN:
+ media_impl->scrollWheel(0, 1, MASK_NONE);
+ break;
+ case SCROLL_LEFT:
+ media_impl->scrollWheel(1, 0, MASK_NONE);
+ // media_impl->handleKeyHere(KEY_LEFT, MASK_NONE);
+ break;
+ case SCROLL_RIGHT:
+ media_impl->scrollWheel(-1, 0, MASK_NONE);
+ // media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
+ break;
+ case SCROLL_NONE:
+ default:
+ break;
}
}
setVisible(enabled);
-
+
//
// Calculate position and shape of the controls
//
- glh::matrix4f mat = glh_get_current_projection()*glh_get_current_modelview();
std::vector<LLVector3>::iterator vert_it;
std::vector<LLVector3>::iterator vert_end;
std::vector<LLVector3> vect_face;
-
+
LLVolume* volume = objectp->getVolume();
-
+
if (volume)
{
const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace);
-
+
const LLVector3* ext = vf.mExtents;
-
+
LLVector3 center = (ext[0]+ext[1])*0.5f;
LLVector3 size = (ext[1]-ext[0])*0.5f;
LLVector3 vert[] =
@@ -531,17 +581,27 @@ void LLPanelPrimMediaControls::updateShape()
center + size.scaledVec(LLVector3(1,-1,-1)),
center + size.scaledVec(LLVector3(-1,-1,-1)),
};
-
+
LLVOVolume* vo = (LLVOVolume*) objectp;
-
+
for (U32 i = 0; i < 8; i++)
{
- vect_face.push_back(vo->volumePositionToAgent(vert[i]));
+ vect_face.push_back(vo->volumePositionToAgent(vert[i]));
}
}
vert_it = vect_face.begin();
vert_end = vect_face.end();
-
+
+ glh::matrix4f mat;
+ if (!is_hud)
+ {
+ mat = glh_get_current_projection() * glh_get_current_modelview();
+ }
+ else {
+ glh::matrix4f proj, modelview;
+ if (get_hud_matrices(proj, modelview))
+ mat = proj * modelview;
+ }
LLVector3 min = LLVector3(1,1,1);
LLVector3 max = LLVector3(-1,-1,-1);
for(; vert_it != vert_end; ++vert_it)
@@ -549,47 +609,60 @@ void LLPanelPrimMediaControls::updateShape()
// project silhouette vertices into screen space
glh::vec3f screen_vert = glh::vec3f(vert_it->mV);
mat.mult_matrix_vec(screen_vert);
-
+
// add to screenspace bounding box
update_min_max(min, max, LLVector3(screen_vert.v));
}
-
- LLCoordGL screen_min;
- screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (min.mV[VX] + 1.f) * 0.5f);
- screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (min.mV[VY] + 1.f) * 0.5f);
-
+
+ // convert screenspace bbox to pixels (in screen coords)
+ LLRect window_rect = gViewerWindow->getWorldViewRectScaled();
+ LLCoordGL screen_min;
+ screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f);
+ screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);
+
LLCoordGL screen_max;
- screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (max.mV[VX] + 1.f) * 0.5f);
- screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (max.mV[VY] + 1.f) * 0.5f);
-
- // grow panel so that screenspace bounding box fits inside "media_region" element of HUD
- LLRect media_controls_rect;
- getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect);
- LLView* media_region = getChild<LLView>("media_region");
- media_controls_rect.mLeft -= media_region->getRect().mLeft;
- media_controls_rect.mBottom -= media_region->getRect().mBottom;
- media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop;
- media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight;
-
- LLRect old_hud_rect = media_controls_rect;
- // keep all parts of HUD on-screen
- media_controls_rect.intersectWith(getParent()->getLocalRect());
-
- // clamp to minimum size, keeping centered
- media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
- llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight()));
-
- setShape(media_controls_rect, true);
-
+ screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f);
+ screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f);
+
+ // grow panel so that screenspace bounding box fits inside "media_region" element of panel
+ LLRect media_panel_rect;
+ // Get the height of the controls (less the volume slider)
+ S32 controls_height = mMediaControlsStack->getRect().getHeight() - mVolumeSliderCtrl->getRect().getHeight();
+ getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_panel_rect);
+ media_panel_rect.mTop += controls_height;
+
+ // keep all parts of panel on-screen
+ // Area of the top of the world view to avoid putting the controls
+ window_rect.mTop -= mTopWorldViewAvoidZone;
+ // Don't include "spacing" bookends on left & right of the media controls
+ window_rect.mLeft -= mLeftBookend->getRect().getWidth();
+ window_rect.mRight += mRightBookend->getRect().getWidth();
+ // Don't include the volume slider
+ window_rect.mBottom -= mVolumeSliderCtrl->getRect().getHeight();
+ media_panel_rect.intersectWith(window_rect);
+
+ // clamp to minimum size, keeping rect inside window
+ S32 centerX = media_panel_rect.getCenterX();
+ S32 centerY = media_panel_rect.getCenterY();
+ // Shrink screen rect by min width and height, to ensure containment
+ window_rect.stretch(-mMinWidth/2, -mMinHeight/2);
+ window_rect.clampPointToRect(centerX, centerY);
+ media_panel_rect.setCenterAndSize(centerX, centerY,
+ llmax(mMinWidth, media_panel_rect.getWidth()),
+ llmax(mMinHeight, media_panel_rect.getHeight()));
+
+ // Finally set the size of the panel
+ setShape(media_panel_rect, true);
+
// Test mouse position to see if the cursor is stationary
LLCoordWindow cursor_pos_window;
getWindow()->getCursorPosition(&cursor_pos_window);
-
+
// If last pos is not equal to current pos, the mouse has moved
// We need to reset the timer, and make sure the panel is visible
if(cursor_pos_window.mX != mLastCursorPos.mX ||
- cursor_pos_window.mY != mLastCursorPos.mY ||
- mScrollState != SCROLL_NONE)
+ cursor_pos_window.mY != mLastCursorPos.mY ||
+ mScrollState != SCROLL_NONE)
{
mInactivityTimer.start();
mLastCursorPos = cursor_pos_window;
@@ -614,7 +687,7 @@ void LLPanelPrimMediaControls::updateShape()
else
{
// I don't think this is correct anymore. This is done in draw() after the fade has completed.
-// setVisible(FALSE);
+ // setVisible(FALSE);
}
}
}
@@ -622,13 +695,13 @@ void LLPanelPrimMediaControls::updateShape()
/*virtual*/
void LLPanelPrimMediaControls::draw()
{
- F32 alpha = 1.f;
+ F32 alpha = getDrawContext().mAlpha;
if(mFadeTimer.getStarted())
{
F32 time = mFadeTimer.getElapsedTimeF32();
- alpha = llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
+ alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
- if(mFadeTimer.getElapsedTimeF32() >= mControlFadeTime)
+ if(time >= mControlFadeTime)
{
if(mClearFaceOnFade)
{
@@ -638,6 +711,7 @@ void LLPanelPrimMediaControls::draw()
setVisible(FALSE);
mClearFaceOnFade = false;
+ mVolumeSliderVisible = 0;
mTargetImplID = LLUUID::null;
mTargetObjectID = LLUUID::null;
mTargetObjectFace = 0;
@@ -645,6 +719,36 @@ void LLPanelPrimMediaControls::draw()
}
}
+ // Build rect for icon area in coord system of this panel
+ // Assumes layout_stack is a direct child of this panel
+ mMediaControlsStack->updateLayout();
+
+ // adjust for layout stack spacing
+ S32 space = mMediaControlsStack->getPanelSpacing() + 2;
+ LLRect controls_bg_area = mMediaControlsStack->getRect();
+
+ controls_bg_area.mTop += space + 2;
+
+ // adjust to ignore space from volume slider
+ controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight();
+
+ // adjust to ignore space from left bookend padding
+ controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space;
+
+ // ignore space from right bookend padding
+ controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space - 2;
+
+ // draw control background UI image
+ mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha);
+
+ // draw volume slider background UI image
+ if (mVolumeSliderCtrl->getVisible())
+ {
+ LLRect volume_slider_rect;
+ screenRectToLocal(mVolumeSliderCtrl->calcScreenRect(), &volume_slider_rect);
+ mVolumeSliderBackgroundImage->draw(volume_slider_rect, UI_VERTEX_COLOR % alpha);
+ }
+
{
LLViewDrawContext context(alpha);
LLPanel::draw();
@@ -687,25 +791,29 @@ bool LLPanelPrimMediaControls::isMouseOver()
S32 x, y;
getWindow()->getCursorPosition(&cursor_pos_window);
getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
-
- LLPanel* controls_panel = NULL;
- controls_panel = getChild<LLPanel>("media_hover_controls");
- if(controls_panel && !controls_panel->getVisible())
- {
- // The hover controls aren't visible -- use the focused controls instead.
- controls_panel = getChild<LLPanel>("media_focused_controls");
- }
-
- if(controls_panel && controls_panel->getVisible())
+
+ if(mMediaControlsStack->getVisible())
{
- controls_panel->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+ mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
- LLView *hit_child = controls_panel->childFromPoint(x, y);
- if(hit_child)
+ LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);
+ if(hit_child && hit_child->getVisible())
{
// This was useful for debugging both coordinate translation and view hieararchy problems...
-// llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl;
- result = true;
+ // llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl;
+
+ // This will be a direct child of the LLLayoutStack, which should be a layout_panel.
+ // These may not shown/hidden by the logic in updateShape(), so we need to do another hit test on the children of the layout panel,
+ // which are the actual controls.
+ hit_child->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+
+ LLView *hit_child_2 = hit_child->childFromPoint(x, y);
+ if(hit_child_2 && hit_child_2->getVisible())
+ {
+ // This was useful for debugging both coordinate translation and view hieararchy problems...
+ // llinfos << " mouse coords: " << x << ", " << y << " hit child 2 " << hit_child_2->getName() << llendl;
+ result = true;
+ }
}
}
}
@@ -721,8 +829,8 @@ void LLPanelPrimMediaControls::onClickClose()
void LLPanelPrimMediaControls::close()
{
+ resetZoomLevel(true);
LLViewerMediaFocus::getInstance()->clearFocus();
- resetZoomLevel();
setVisible(FALSE);
}
@@ -744,7 +852,7 @@ void LLPanelPrimMediaControls::onClickForward()
focusOnTarget();
LLViewerMediaImpl* impl = getTargetMediaImpl();
-
+
if (impl)
{
impl->navigateForward();
@@ -817,16 +925,56 @@ void LLPanelPrimMediaControls::onClickStop()
if(impl)
{
+ impl->navigateStop();
+ }
+}
+
+void LLPanelPrimMediaControls::onClickMediaStop()
+{
+ focusOnTarget();
+
+ LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+ if(impl)
+ {
impl->stop();
}
}
-void LLPanelPrimMediaControls::onClickZoom()
+void LLPanelPrimMediaControls::onClickSkipBack()
{
focusOnTarget();
- nextZoomLevel();
+ LLViewerMediaImpl* impl =getTargetMediaImpl();
+
+ if (impl)
+ {
+ impl->skipBack(mSkipStep);
+ }
}
+
+void LLPanelPrimMediaControls::onClickSkipForward()
+{
+ focusOnTarget();
+
+ LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+ if (impl)
+ {
+ impl->skipForward(mSkipStep);
+ }
+}
+
+void LLPanelPrimMediaControls::onClickZoom()
+{
+ focusOnTarget();
+
+ if(mCurrentZoom == ZOOM_NONE)
+ {
+ nextZoomLevel();
+ }
+}
+
void LLPanelPrimMediaControls::nextZoomLevel()
{
int index = 0;
@@ -843,12 +991,15 @@ void LLPanelPrimMediaControls::nextZoomLevel()
updateZoom();
}
-void LLPanelPrimMediaControls::resetZoomLevel()
+void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
{
if(mCurrentZoom != ZOOM_NONE)
{
mCurrentZoom = ZOOM_NONE;
- updateZoom();
+ if(reset_camera)
+ {
+ updateZoom();
+ }
}
}
@@ -864,17 +1015,17 @@ void LLPanelPrimMediaControls::updateZoom()
}
case ZOOM_FAR:
{
- zoom_padding = ZOOM_FAR_PADDING;
+ zoom_padding = mZoomFarPadding;
break;
}
case ZOOM_MEDIUM:
{
- zoom_padding = ZOOM_MEDIUM_PADDING;
+ zoom_padding = mZoomMediumPadding;
break;
}
case ZOOM_NEAR:
{
- zoom_padding = ZOOM_NEAR_PADDING;
+ zoom_padding = mZoomNearPadding;
break;
}
default:
@@ -884,9 +1035,17 @@ void LLPanelPrimMediaControls::updateZoom()
}
}
- if (zoom_padding > 0.0f)
- LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+ if (zoom_padding > 0.0f)
+ {
+ // since we only zoom into medium for now, always set zoom_in constraint to true
+ LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
+ }
+
+ // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
+ mZoomObjectID = mTargetObjectID;
+ mZoomObjectFace = mTargetObjectFace;
}
+
void LLPanelPrimMediaControls::onScrollUp(void* user_data)
{
LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
@@ -970,8 +1129,7 @@ void LLPanelPrimMediaControls::onCommitURL()
{
focusOnTarget();
- LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url");
- std::string url = media_address_ctrl->getValue().asString();
+ std::string url = mMediaAddress->getValue().asString();
if(getTargetMediaImpl() && !url.empty())
{
getTargetMediaImpl()->navigateTo( url, "", true);
@@ -1000,19 +1158,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user
void LLPanelPrimMediaControls::setCurrentURL()
{
#ifdef USE_COMBO_BOX_FOR_MEDIA_URL
- LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo");
- // redirects will navigate momentarily to about:blank, don't add to history
- if (media_address_combo && mCurrentURL != "about:blank")
- {
- media_address_combo->remove(mCurrentURL);
- media_address_combo->add(mCurrentURL, ADD_SORTED);
- media_address_combo->selectByValue(mCurrentURL);
- }
+// LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo");
+// // redirects will navigate momentarily to about:blank, don't add to history
+// if (media_address_combo && mCurrentURL != "about:blank")
+// {
+// media_address_combo->remove(mCurrentURL);
+// media_address_combo->add(mCurrentURL, ADD_SORTED);
+// media_address_combo->selectByValue(mCurrentURL);
+// }
#else // USE_COMBO_BOX_FOR_MEDIA_URL
- LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url");
- if (media_address_url && mCurrentURL != "about:blank")
+ if (mMediaAddress && mCurrentURL != "about:blank")
{
- media_address_url->setValue(mCurrentURL);
+ mMediaAddress->setValue(mCurrentURL);
}
#endif // USE_COMBO_BOX_FOR_MEDIA_URL
}
@@ -1021,12 +1178,11 @@ void LLPanelPrimMediaControls::onCommitSlider()
{
focusOnTarget();
- LLSlider* media_play_slider_ctrl = getChild<LLSlider>("media_play_slider");
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
if (media_impl)
{
// get slider value
- F64 slider_value = media_play_slider_ctrl->getValue().asReal();
+ F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
if(slider_value <= 0.0)
{
media_impl->stop();
@@ -1055,7 +1211,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp()
}
media_impl->setVolume(volume);
- getChild<LLButton>("media_volume")->setToggleState(false);
+ mMuteBtn->setToggleState(false);
}
}
@@ -1075,10 +1231,20 @@ void LLPanelPrimMediaControls::onCommitVolumeDown()
}
media_impl->setVolume(volume);
- getChild<LLButton>("media_volume")->setToggleState(false);
+ mMuteBtn->setToggleState(false);
}
}
+void LLPanelPrimMediaControls::onCommitVolumeSlider()
+{
+ focusOnTarget();
+
+ LLViewerMediaImpl* media_impl = getTargetMediaImpl();
+ if (media_impl)
+ {
+ media_impl->setVolume(mVolumeSliderCtrl->getValueF32());
+ }
+}
void LLPanelPrimMediaControls::onToggleMute()
{
@@ -1093,10 +1259,29 @@ void LLPanelPrimMediaControls::onToggleMute()
{
media_impl->setVolume(0.0);
}
+ else if (mVolumeSliderCtrl->getValueF32() == 0.0)
+ {
+ media_impl->setVolume(1.0);
+ mVolumeSliderCtrl->setValue(1.0);
+ }
else
{
- media_impl->setVolume(0.5);
+ media_impl->setVolume(mVolumeSliderCtrl->getValueF32());
}
}
}
+void LLPanelPrimMediaControls::showVolumeSlider()
+{
+ mVolumeSliderVisible++;
+}
+
+void LLPanelPrimMediaControls::hideVolumeSlider()
+{
+ mVolumeSliderVisible--;
+}
+
+bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
+{
+ return mVolumeSliderVisible > 0;
+}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 3ec7aa2356..2e0de7866c 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -35,7 +35,12 @@
#include "llpanel.h"
#include "llviewermedia.h"
+class LLButton;
class LLCoordWindow;
+class LLIconCtrl;
+class LLLayoutStack;
+class LLProgressBar;
+class LLSliderCtrl;
class LLViewerMediaImpl;
class LLPanelPrimMediaControls : public LLPanel
@@ -53,14 +58,7 @@ public:
void updateShape();
bool isMouseOver();
- void nextZoomLevel();
- void resetZoomLevel();
- void close();
-
- LLHandle<LLPanelPrimMediaControls> getHandle() const { return mPanelHandle; }
- void setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero);
-
-
+
enum EZoomLevel
{
ZOOM_NONE = 0,
@@ -68,6 +66,16 @@ public:
ZOOM_MEDIUM,
ZOOM_NEAR
};
+
+ EZoomLevel getZoomLevel() const { return mCurrentZoom; }
+ void nextZoomLevel();
+ void resetZoomLevel(bool reset_camera = true);
+ void close();
+
+ LLHandle<LLPanelPrimMediaControls> getHandle() const { return mPanelHandle; }
+ void setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero);
+
+
static const EZoomLevel kZoomLevels[];
static const int kNumZoomLevels;
@@ -91,6 +99,9 @@ private:
void onClickPause();
void onClickStop();
void onClickZoom();
+ void onClickSkipBack();
+ void onClickSkipForward();
+ void onClickMediaStop();
void onCommitURL();
void updateZoom();
@@ -99,7 +110,11 @@ private:
void onCommitVolumeUp();
void onCommitVolumeDown();
+ void onCommitVolumeSlider();
void onToggleMute();
+ void showVolumeSlider();
+ void hideVolumeSlider();
+ bool shouldVolumeSliderBeVisible();
static void onScrollUp(void* user_data);
static void onScrollUpHeld(void* user_data);
@@ -119,6 +134,53 @@ private:
LLViewerMediaImpl* getTargetMediaImpl();
LLViewerObject* getTargetObject();
LLPluginClassMedia* getTargetMediaPlugin();
+
+private:
+
+ LLView *mMediaRegion;
+ LLUICtrl *mBackCtrl;
+ LLUICtrl *mFwdCtrl;
+ LLUICtrl *mReloadCtrl;
+ LLUICtrl *mPlayCtrl;
+ LLUICtrl *mPauseCtrl;
+ LLUICtrl *mStopCtrl;
+ LLUICtrl *mMediaStopCtrl;
+ LLUICtrl *mHomeCtrl;
+ LLUICtrl *mUnzoomCtrl;
+ LLUICtrl *mOpenCtrl;
+ LLUICtrl *mSkipBackCtrl;
+ LLUICtrl *mSkipFwdCtrl;
+ LLUICtrl *mZoomCtrl;
+ LLPanel *mMediaProgressPanel;
+ LLProgressBar *mMediaProgressBar;
+ LLUICtrl *mMediaAddressCtrl;
+ LLUICtrl *mMediaAddress;
+ LLUICtrl *mMediaPlaySliderPanel;
+ LLUICtrl *mMediaPlaySliderCtrl;
+ LLUICtrl *mVolumeCtrl;
+ LLButton *mMuteBtn;
+ LLSliderCtrl *mVolumeSliderCtrl;
+ LLIconCtrl *mWhitelistIcon;
+ LLIconCtrl *mSecureLockIcon;
+ LLLayoutStack *mMediaControlsStack;
+ LLUICtrl *mLeftBookend;
+ LLUICtrl *mRightBookend;
+ LLUIImage* mBackgroundImage;
+ LLUIImage* mVolumeSliderBackgroundImage;
+ F32 mSkipStep;
+ S32 mMinWidth;
+ S32 mMinHeight;
+ F32 mZoomNearPadding;
+ F32 mZoomMediumPadding;
+ F32 mZoomFarPadding;
+ S32 mTopWorldViewAvoidZone;
+
+ LLUICtrl *mMediaPanelScroll;
+ LLButton *mScrollUpCtrl;
+ LLButton *mScrollLeftCtrl;
+ LLButton *mScrollRightCtrl;
+ LLButton *mScrollDownCtrl;
+
bool mPauseFadeout;
bool mUpdateSlider;
bool mClearFaceOnFade;
@@ -137,12 +199,16 @@ private:
std::string mPreviousURL;
F64 mCurrentRate;
F64 mMovieDuration;
- int mUpdatePercent;
-
+
LLUUID mTargetObjectID;
S32 mTargetObjectFace;
LLUUID mTargetImplID;
LLVector3 mTargetObjectNormal;
+
+ LLUUID mZoomObjectID;
+ S32 mZoomObjectFace;
+
+ S32 mVolumeSliderVisible;
};
#endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index bec670cdaa..b5d85dfd4b 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -59,17 +59,61 @@ public:
return false;
}
- if (params[1].asString() == "about")
+ const std::string verb = params[1].asString();
+ if (verb == "about")
{
LLAvatarActions::showProfile(avatar_id);
return true;
}
- if (params[1].asString() == "inspect")
+ if (verb == "inspect")
{
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", avatar_id));
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
return true;
}
+
+ if (verb == "im")
+ {
+ LLAvatarActions::startIM(avatar_id);
+ return true;
+ }
+
+ if (verb == "pay")
+ {
+ LLAvatarActions::pay(avatar_id);
+ return true;
+ }
+
+ if (verb == "offerteleport")
+ {
+ LLAvatarActions::offerTeleport(avatar_id);
+ return true;
+ }
+
+ if (verb == "requestfriend")
+ {
+ LLAvatarActions::requestFriendshipDialog(avatar_id);
+ return true;
+ }
+
+ if (verb == "mute")
+ {
+ if (! LLAvatarActions::isBlocked(avatar_id))
+ {
+ LLAvatarActions::toggleBlock(avatar_id);
+ }
+ return true;
+ }
+
+ if (verb == "unmute")
+ {
+ if (LLAvatarActions::isBlocked(avatar_id))
+ {
+ LLAvatarActions::toggleBlock(avatar_id);
+ }
+ return true;
+ }
+
return false;
}
};
@@ -100,6 +144,7 @@ BOOL LLPanelProfile::postBuild()
void LLPanelProfile::onOpen(const LLSD& key)
{
+ // open the desired panel
if (key.has("open_tab_name"))
{
getTabContainer()[PANEL_PICKS]->onClosePanel();
@@ -111,39 +156,48 @@ void LLPanelProfile::onOpen(const LLSD& key)
{
getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
}
+
+ // support commands to open further pieces of UI
+ if (key.has("show_tab_panel"))
+ {
+ std::string panel = key["show_tab_panel"].asString();
+ if (panel == "create_classified")
+ {
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ picks->createNewClassified();
+ }
+ }
+ else if (panel == "classified_details")
+ {
+ LLUUID classified_id = key["classified_id"].asUUID();
+ LLUUID avatar_id = key["classified_avatar_id"].asUUID();
+ LLUUID snapshot_id = key["classified_snapshot_id"].asUUID();
+ std::string name = key["classified_name"].asString();
+ std::string desc = key["classified_desc"].asString();
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ picks->openClassifiedInfo(classified_id, avatar_id, snapshot_id, name, desc);
+ }
+ }
+ }
}
//*TODO redo panel toggling
-void LLPanelProfile::togglePanel(LLPanel* panel)
+void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)
{
// TRUE - we need to open/expand "panel"
bool expand = getChildList()->front() != panel; // mTabCtrl->getVisible();
if (expand)
{
- if (panel->getParent() != this)
- {
- addChild(panel);
- }
- else
- {
- sendChildToFront(panel);
- }
-
- panel->setVisible(TRUE);
-
- LLRect new_rect = getRect();
- panel->reshape(new_rect.getWidth(), new_rect.getHeight());
- new_rect.setLeftTopAndSize(0, new_rect.getHeight(), new_rect.getWidth(), new_rect.getHeight());
- panel->setRect(new_rect);
+ openPanel(panel, key);
}
else
{
- panel->setVisible(FALSE);
- if (panel->getParent() == this)
- {
- removeChild(panel);
- }
+ closePanel(panel);
getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
}
@@ -190,14 +244,25 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
panel->setRect(new_rect);
}
-void LLPanelProfile::notifyParent(const LLSD& info)
+void LLPanelProfile::closePanel(LLPanel* panel)
+{
+ panel->setVisible(FALSE);
+
+ if (panel->getParent() == this)
+ {
+ removeChild(panel);
+ }
+}
+
+S32 LLPanelProfile::notifyParent(const LLSD& info)
{
std::string action = info["action"];
// lets update Picks list after Pick was saved
if("save_new_pick" == action)
{
onOpen(info);
- return;
+ return 1;
}
- LLPanel::notifyParent(info);
+
+ return LLPanel::notifyParent(info);
}
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index e0b827c986..f1aa3f10f8 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -40,7 +40,7 @@
class LLTabContainer;
/**
-* Base class for Profile View and Me Profile.
+* Base class for Profile View and My Profile.
*/
class LLPanelProfile : public LLPanel
{
@@ -51,11 +51,13 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
- virtual void togglePanel(LLPanel*);
+ virtual void togglePanel(LLPanel*, const LLSD& key = LLSD());
virtual void openPanel(LLPanel* panel, const LLSD& params);
- void notifyParent(const LLSD& info);
+ virtual void closePanel(LLPanel* panel);
+
+ S32 notifyParent(const LLSD& info);
protected:
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index 1d16c4ef5e..044036ea50 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -32,10 +32,12 @@
#include "llviewerprecompiledheaders.h"
+#include "llavatarconstants.h"
#include "lluserrelations.h"
#include "llpanelprofileview.h"
+#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
#include "llpanelavatar.h"
#include "llpanelpicks.h"
@@ -48,14 +50,46 @@ static std::string PANEL_NOTES = "panel_notes";
static const std::string PANEL_PROFILE = "panel_profile";
static const std::string PANEL_PICKS = "panel_picks";
+
+class AvatarStatusObserver : public LLAvatarPropertiesObserver
+{
+public:
+ AvatarStatusObserver(LLPanelProfileView* profile_view)
+ {
+ mProfileView = profile_view;
+ }
+
+ void processProperties(void* data, EAvatarProcessorType type)
+ {
+ if(APT_PROPERTIES != type) return;
+ const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
+ if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id)
+ {
+ mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
+ LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this);
+ }
+ }
+
+ void subscribe()
+ {
+ LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this);
+ }
+
+private:
+ LLPanelProfileView* mProfileView;
+};
+
LLPanelProfileView::LLPanelProfileView()
: LLPanelProfile()
, mStatusText(NULL)
+, mAvatarStatusObserver(NULL)
{
+ mAvatarStatusObserver = new AvatarStatusObserver(this);
}
LLPanelProfileView::~LLPanelProfileView(void)
{
+ delete mAvatarStatusObserver;
}
/*virtual*/
@@ -66,6 +100,7 @@ void LLPanelProfileView::onOpen(const LLSD& key)
{
id = key["id"];
}
+
if(id.notNull() && getAvatarId() != id)
{
setAvatarId(id);
@@ -75,10 +110,9 @@ void LLPanelProfileView::onOpen(const LLSD& key)
gCacheName->get(getAvatarId(), FALSE,
boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4));
- // status should only show if viewer has permission to view online/offline. EXT-453
- mStatusText->setVisible(isGrantedToSeeOnlineStatus());
updateOnlineStatus();
+
LLPanelProfile::onOpen(key);
}
@@ -93,6 +127,7 @@ BOOL LLPanelProfileView::postBuild()
getTabContainer()[PANEL_PROFILE]->childSetVisible("status_combo", FALSE);
mStatusText = getChild<LLTextBox>("status");
+ mStatusText->setVisible(false);
childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
@@ -124,19 +159,40 @@ bool LLPanelProfileView::isGrantedToSeeOnlineStatus()
// *NOTE: GRANT_ONLINE_STATUS is always set to false while changing any other status.
// When avatar disallow me to see her online status processOfflineNotification Message is received by the viewer
// see comments for ChangeUserRights template message. EXT-453.
-// return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
- return true;
+ // If GRANT_ONLINE_STATUS flag is changed it will be applied when viewer restarts. EXT-3880
+ return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
}
+// method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880
void LLPanelProfileView::updateOnlineStatus()
{
+ // set text box visible to show online status for non-friends who has not set in Preferences
+ // "Only Friends & Groups can see when I am online"
+ mStatusText->setVisible(TRUE);
+
const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
if (NULL == relationship)
+ {
+ // this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor.
+ // in LLPanelProfileView::processOnlineStatus()
+
+ // subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself.
+ // do not subscribe for friend avatar because online status can be wrong overridden
+ // via LLAvatarData::flags if Preferences: "Only Friends & Groups can see when I am online" is set.
+ mAvatarStatusObserver->subscribe();
return;
+ }
+ // For friend let check if he allowed me to see his status
+
+ // status should only show if viewer has permission to view online/offline. EXT-453, EXT-3880
+ mStatusText->setVisible(isGrantedToSeeOnlineStatus());
bool online = relationship->isOnline();
-// std::string statusName();
+ processOnlineStatus(online);
+}
+void LLPanelProfileView::processOnlineStatus(bool online)
+{
std::string status = getString(online ? "status_online" : "status_offline");
mStatusText->setValue(status);
@@ -145,18 +201,7 @@ void LLPanelProfileView::updateOnlineStatus()
void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
{
llassert(getAvatarId() == id);
- getChild<LLTextBox>("user_name", FALSE)->setValue(first_name + " " + last_name);
-}
-
-void LLPanelProfileView::togglePanel(LLPanel* panel)
-{
- LLPanelProfile::togglePanel(panel);
- if(FALSE == panel->getVisible())
- {
- // LLPanelProfile::togglePanel shows/hides all children,
- // we don't want to display online status for non friends, so re-hide it here
- mStatusText->setVisible(isGrantedToSeeOnlineStatus());
- }
+ getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name);
}
// EOF
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
index 07a6c3a9a0..9b87e146a8 100644
--- a/indra/newview/llpanelprofileview.h
+++ b/indra/newview/llpanelprofileview.h
@@ -36,10 +36,13 @@
#include "llpanel.h"
#include "llpanelprofile.h"
#include "llavatarpropertiesprocessor.h"
+#include "llagent.h"
+#include "lltooldraganddrop.h"
class LLPanelProfile;
class LLPanelProfileTab;
class LLTextBox;
+class AvatarStatusObserver;
/**
* Panel for displaying Avatar's profile. It consists of three sub panels - Profile,
@@ -49,6 +52,7 @@ class LLPanelProfileView : public LLPanelProfile
{
LOG_CLASS(LLPanelProfileView);
friend class LLUICtrlFactory;
+ friend class AvatarStatusObserver;
public:
@@ -60,13 +64,37 @@ public:
/*virtual*/ BOOL postBuild();
- /*virtual*/ void togglePanel(LLPanel* panel);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
+ {
+ LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop,
+ cargo_type, cargo_data, accept);
+
+ return TRUE;
+ }
+
protected:
void onBackBtnClick();
bool isGrantedToSeeOnlineStatus();
+
+ /**
+ * Displays avatar's online status if possible.
+ *
+ * Requirements from EXT-3880:
+ * For friends:
+ * - Online when online and privacy settings allow to show
+ * - Offline when offline and privacy settings allow to show
+ * - Else: nothing
+ * For other avatars:
+ * - Online when online and was not set in Preferences/"Only Friends & Groups can see when I am online"
+ * - Else: Offline
+ */
void updateOnlineStatus();
+ void processOnlineStatus(bool online);
private:
// LLCacheName will call this function when avatar name is loaded from server.
@@ -78,6 +106,7 @@ private:
BOOL is_group);
LLTextBox* mStatusText;
+ AvatarStatusObserver* mAvatarStatusObserver;
};
#endif //LL_LLPANELPROFILEVIEW_H
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 7dd9df674c..90c8f2551f 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2001-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -38,12 +38,14 @@
#include "llsidetray.h"
#include "llworldmap.h"
#include "llteleporthistorystorage.h"
+#include "lltextutil.h"
+
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llflatlistview.h"
+#include "llnotificationsutil.h"
#include "lltextbox.h"
#include "llviewermenu.h"
-#include "llviewerinventory.h"
#include "lllandmarkactions.h"
#include "llclipboard.h"
@@ -51,17 +53,24 @@
// Used to limit time spent for items list update per frame.
static const U32 ADD_LIMIT = 50;
+static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+
class LLTeleportHistoryFlatItem : public LLPanel
{
public:
- LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name);
- virtual ~LLTeleportHistoryFlatItem() {};
+ LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl);
+ virtual ~LLTeleportHistoryFlatItem();
virtual BOOL postBuild();
+ /*virtual*/ S32 notify(const LLSD& info);
+
S32 getIndex() { return mIndex; }
void setIndex(S32 index) { mIndex = index; }
const std::string& getRegionName() { return mRegionName;}
+ void setRegionName(const std::string& name);
+ void setHighlightedText(const std::string& text);
+ void updateTitle();
/*virtual*/ void setValue(const LLSD& value);
@@ -70,37 +79,92 @@ public:
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
static void showPlaceInfoPanel(S32 index);
+
+ LLHandle<LLTeleportHistoryFlatItem> getItemHandle() { mItemHandle.bind(this); return mItemHandle; }
+
private:
- void onInfoBtnClick();
+ void onProfileBtnClick();
- LLButton* mInfoBtn;
+ LLButton* mProfileBtn;
+ LLTextBox* mTitle;
+
LLTeleportHistoryPanel::ContextMenu *mContextMenu;
S32 mIndex;
std::string mRegionName;
+ std::string mHighlight;
+ LLRootHandle<LLTeleportHistoryFlatItem> mItemHandle;
};
-LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name)
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage> {
+protected:
+ typedef std::vector< LLHandle<LLTeleportHistoryFlatItem> > flat_item_list_t;
+
+public:
+ LLTeleportHistoryFlatItem* getFlatItemForPersistentItem (
+ LLTeleportHistoryPanel::ContextMenu *context_menu,
+ const LLTeleportHistoryPersistentItem& persistent_item,
+ const S32 cur_item_index,
+ const std::string &hl);
+
+ void removeItem(LLTeleportHistoryFlatItem* item);
+
+ void purge();
+
+private:
+
+ flat_item_list_t mItems;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl)
: LLPanel(),
mIndex(index),
mContextMenu(context_menu),
- mRegionName(region_name)
+ mRegionName(region_name),
+ mHighlight(hl)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_teleport_history_item.xml");
}
+LLTeleportHistoryFlatItem::~LLTeleportHistoryFlatItem()
+{
+}
+
//virtual
BOOL LLTeleportHistoryFlatItem::postBuild()
{
- LLTextBox *region = getChild<LLTextBox>("region");
- region->setValue(mRegionName);
+ mTitle = getChild<LLTextBox>("region");
- mInfoBtn = getChild<LLButton>("info_btn");
- mInfoBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onInfoBtnClick, this));
+ mProfileBtn = getChild<LLButton>("profile_btn");
+
+ mProfileBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onProfileBtnClick, this));
+
+ updateTitle();
return true;
}
+S32 LLTeleportHistoryFlatItem::notify(const LLSD& info)
+{
+ if(info.has("detach"))
+ {
+ delete mMouseDownSignal;
+ mMouseDownSignal = NULL;
+ delete mRightMouseDownSignal;
+ mRightMouseDownSignal = NULL;
+ return 1;
+ }
+ return 0;
+}
+
void LLTeleportHistoryFlatItem::setValue(const LLSD& value)
{
if (!value.isMap()) return;;
@@ -108,10 +172,29 @@ void LLTeleportHistoryFlatItem::setValue(const LLSD& value)
childSetVisible("selected_icon", value["selected"]);
}
+void LLTeleportHistoryFlatItem::setHighlightedText(const std::string& text)
+{
+ mHighlight = text;
+}
+
+void LLTeleportHistoryFlatItem::setRegionName(const std::string& name)
+{
+ mRegionName = name;
+}
+
+void LLTeleportHistoryFlatItem::updateTitle()
+{
+ LLTextUtil::textboxSetHighlightedVal(
+ mTitle,
+ LLStyle::Params(),
+ mRegionName,
+ mHighlight);
+}
+
void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", true);
- mInfoBtn->setVisible(true);
+ mProfileBtn->setVisible(true);
LLPanel::onMouseEnter(x, y, mask);
}
@@ -119,7 +202,7 @@ void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask)
void LLTeleportHistoryFlatItem::onMouseLeave(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", false);
- mInfoBtn->setVisible(false);
+ mProfileBtn->setVisible(false);
LLPanel::onMouseLeave(x, y, mask);
}
@@ -142,13 +225,89 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index)
LLSideTray::getInstance()->showPanel("panel_places", params);
}
-void LLTeleportHistoryFlatItem::onInfoBtnClick()
+void LLTeleportHistoryFlatItem::onProfileBtnClick()
{
LLTeleportHistoryFlatItem::showPlaceInfoPanel(mIndex);
}
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+LLTeleportHistoryFlatItem*
+LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (
+ LLTeleportHistoryPanel::ContextMenu *context_menu,
+ const LLTeleportHistoryPersistentItem& persistent_item,
+ const S32 cur_item_index,
+ const std::string &hl)
+{
+ LLTeleportHistoryFlatItem* item = NULL;
+ if ( cur_item_index < (S32) mItems.size() )
+ {
+ item = mItems[cur_item_index].get();
+ if (item->getParent() == NULL)
+ {
+ item->setIndex(cur_item_index);
+ item->setRegionName(persistent_item.mTitle);
+ item->setHighlightedText(hl);
+ item->setVisible(TRUE);
+ item->updateTitle();
+ }
+ else
+ {
+ // Item already added to parent
+ item = NULL;
+ }
+ }
+
+ if ( !item )
+ {
+ item = new LLTeleportHistoryFlatItem(cur_item_index,
+ context_menu,
+ persistent_item.mTitle,
+ hl);
+ mItems.push_back(item->getItemHandle());
+ }
+
+ return item;
+}
+
+void LLTeleportHistoryFlatItemStorage::removeItem(LLTeleportHistoryFlatItem* item)
+{
+ if (item)
+ {
+ flat_item_list_t::iterator item_iter = std::find(mItems.begin(),
+ mItems.end(),
+ item->getItemHandle());
+ if (item_iter != mItems.end())
+ {
+ mItems.erase(item_iter);
+ }
+ }
+}
+
+void LLTeleportHistoryFlatItemStorage::purge()
+{
+ for ( flat_item_list_t::iterator
+ it = mItems.begin(),
+ it_end = mItems.end();
+ it != it_end; ++it )
+ {
+ LLHandle <LLTeleportHistoryFlatItem> item_handle = *it;
+ if ( !item_handle.isDead() && item_handle.get()->getParent() == NULL )
+ {
+ item_handle.get()->die();
+ }
+ }
+ mItems.clear();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
LLTeleportHistoryPanel::ContextMenu::ContextMenu() :
- mMenu(NULL)
+ mMenu(NULL), mIndex(0)
{
}
@@ -161,7 +320,6 @@ void LLTeleportHistoryPanel::ContextMenu::show(LLView* spawning_view, S32 index,
if (parent)
{
parent->removeChild(mMenu);
- mMenu->setParent(NULL);
}
delete mMenu;
}
@@ -216,7 +374,6 @@ void LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard()
LLTeleportHistoryPanel::LLTeleportHistoryPanel()
: LLPanelPlacesTab(),
- mFilterSubString(LLStringUtil::null),
mDirty(true),
mCurrentItem(0),
mTeleportHistory(NULL),
@@ -230,6 +387,7 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
{
+ LLTeleportHistoryFlatItemStorage::instance().purge();
LLView::deleteViewByHandle(mGearMenuHandle);
}
@@ -252,6 +410,10 @@ BOOL LLTeleportHistoryPanel::postBuild()
LLAccordionCtrlTab* tab = (LLAccordionCtrlTab*)*iter;
tab->setRightMouseDownCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionTabRightClick, this, _1, _2, _3, _4));
tab->setDisplayChildren(false);
+ tab->setDropDownStateChangedCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionExpand, this, _1, _2));
+
+ // All accordion tabs are collapsed initially
+ setAccordionCollapsedByUser(tab, true);
mItemContainers.put(tab);
@@ -261,16 +423,25 @@ BOOL LLTeleportHistoryPanel::postBuild()
fl->setCommitOnSelectionChange(true);
fl->setDoubleClickCallback(boost::bind(&LLTeleportHistoryPanel::onDoubleClickItem, this));
fl->setCommitCallback(boost::bind(&LLTeleportHistoryPanel::handleItemSelect, this, fl));
+ fl->setReturnCallback(boost::bind(&LLTeleportHistoryPanel::onReturnKeyPressed, this));
}
}
}
// Open first 2 accordion tabs
if (mItemContainers.size() > 1)
- mItemContainers.get(mItemContainers.size() - 1)->setDisplayChildren(true);
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1);
+ tab->setDisplayChildren(true);
+ setAccordionCollapsedByUser(tab, false);
+ }
if (mItemContainers.size() > 2)
- mItemContainers.get(mItemContainers.size() - 2)->setDisplayChildren(true);
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 2);
+ tab->setDisplayChildren(true);
+ setAccordionCollapsedByUser(tab, false);
+ }
}
getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this));
@@ -280,6 +451,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
registrar.add("TeleportHistory.ExpandAllFolders", boost::bind(&LLTeleportHistoryPanel::onExpandAllFolders, this));
registrar.add("TeleportHistory.CollapseAllFolders", boost::bind(&LLTeleportHistoryPanel::onCollapseAllFolders, this));
registrar.add("TeleportHistory.ClearTeleportHistory", boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistory, this));
+ mEnableCallbackRegistrar.add("TeleportHistory.GearMenu.Enable", boost::bind(&LLTeleportHistoryPanel::isActionEnabled, this, _2));
LLMenuGL* gear_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if(gear_menu)
@@ -300,11 +472,8 @@ void LLTeleportHistoryPanel::draw()
// virtual
void LLTeleportHistoryPanel::onSearchEdit(const std::string& string)
{
- if (mFilterSubString != string)
- {
- mFilterSubString = string;
- showTeleportHistory();
- }
+ sFilterSubString = string;
+ showTeleportHistory();
}
// virtual
@@ -357,7 +526,7 @@ void LLTeleportHistoryPanel::onCopySLURL()
U64 new_region_handle = to_region_handle(global_pos);
- LLWorldMap::url_callback_t cb = boost::bind(
+ LLWorldMapMessage::url_callback_t cb = boost::bind(
&LLPanelPlacesTab::onRegionResponse, this,
global_pos, _1, _2, _3, _4);
@@ -380,7 +549,7 @@ void LLTeleportHistoryPanel::updateVerbs()
LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem());
- mTeleportBtn->setEnabled(NULL != itemp && itemp->getIndex() < (S32)mTeleportHistory->getItems().size() - 1);
+ mTeleportBtn->setEnabled(NULL != itemp);
mShowOnMapBtn->setEnabled(NULL != itemp);
}
@@ -404,6 +573,7 @@ void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, L
if (tab_idx <= tabs_cnt - 4)
{
+ // All tabs, except last three, are tabs for one day, so just push tab_date back by one day
tab_date.secondsSinceEpoch(tab_date.secondsSinceEpoch() - seconds_in_day);
}
else if (tab_idx == tabs_cnt - 3) // 6 day and older, low boundary is 1 month
@@ -440,6 +610,7 @@ void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, L
}
}
+// Called to add items, no more, than ADD_LIMIT at time
void LLTeleportHistoryPanel::refresh()
{
if (!mHistoryAccordion)
@@ -450,42 +621,72 @@ void LLTeleportHistoryPanel::refresh()
const LLTeleportHistoryStorage::slurl_list_t& items = mTeleportHistory->getItems();
+ // Setting tab_boundary_date to "now", so date from any item would be earlier, than boundary.
+ // That leads to call to getNextTab to get right tab_idx in first pass
LLDate tab_boundary_date = LLDate::now();
+
LLFlatListView* curr_flat_view = NULL;
U32 added_items = 0;
while (mCurrentItem >= 0)
{
- std::string landmark_title = items[mCurrentItem].mTitle;
- LLStringUtil::toUpper(landmark_title);
-
- std::string::size_type match_offset = mFilterSubString.size() ? landmark_title.find(mFilterSubString) : std::string::npos;
- bool passed = mFilterSubString.size() == 0 || match_offset != std::string::npos;
-
- if (!passed)
+ // Filtering
+ if (!sFilterSubString.empty())
{
- mCurrentItem--;
- continue;
+ std::string landmark_title(items[mCurrentItem].mTitle);
+ LLStringUtil::toUpper(landmark_title);
+ if( std::string::npos == landmark_title.find(sFilterSubString) )
+ {
+ mCurrentItem--;
+ continue;
+ }
}
+ // Checking whether date of item is earlier, than tab_boundary_date.
+ // In that case, item should be added to another tab
const LLDate &date = items[mCurrentItem].mDate;
if (date < tab_boundary_date)
{
+ // Getting apropriate tab_idx for this and subsequent items,
+ // tab_boundary_date would be earliest possible date for this tab
S32 tab_idx = 0;
getNextTab(date, tab_idx, tab_boundary_date);
LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
tab->setVisible(true);
+ // Expand all accordion tabs when filtering
+ if(!sFilterSubString.empty())
+ {
+ //store accordion tab state when filter is not empty
+ tab->notifyChildren(LLSD().with("action","store_state"));
+
+ tab->setDisplayChildren(true);
+ }
+ // Restore each tab's expand state when not filtering
+ else
+ {
+ bool collapsed = isAccordionCollapsedByUser(tab);
+ tab->setDisplayChildren(!collapsed);
+
+ //restore accordion state after all those accodrion tabmanipulations
+ tab->notifyChildren(LLSD().with("action","restore_state"));
+ }
+
curr_flat_view = getFlatListViewFromTab(tab);
}
if (curr_flat_view)
{
- LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(mCurrentItem, &mContextMenu, items[mCurrentItem].mTitle);
- curr_flat_view->addItem(item);
-
+ LLTeleportHistoryFlatItem* item =
+ LLTeleportHistoryFlatItemStorage::instance()
+ .getFlatItemForPersistentItem(&mContextMenu,
+ items[mCurrentItem],
+ mCurrentItem,
+ sFilterSubString);
+ if ( !curr_flat_view->addItem(item, LLUUID::null, ADD_BOTTOM, false) )
+ llerrs << "Couldn't add flat item to teleport history." << llendl;
if (mLastSelectedItemIndex == mCurrentItem)
curr_flat_view->selectItem(item, true);
}
@@ -496,6 +697,16 @@ void LLTeleportHistoryPanel::refresh()
break;
}
+ for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(n);
+ LLFlatListView* fv = getFlatListViewFromTab(tab);
+ if (fv)
+ {
+ fv->notify(LLSD().with("rearrange", LLSD()));
+ }
+ }
+
mHistoryAccordion->arrange();
updateVerbs();
@@ -511,7 +722,10 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)
if (-1 == removed_index)
showTeleportHistory(); // recreate all items
else
+ {
replaceItem(removed_index); // replace removed item by most recent
+ updateVerbs();
+ }
}
void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
@@ -528,10 +742,12 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
}
const LLTeleportHistoryStorage::slurl_list_t& history_items = mTeleportHistory->getItems();
- LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(history_items.size(), // index will be decremented inside loop below
- &mContextMenu,
- history_items[history_items.size() - 1].mTitle); // Most recent item, it was
- // added instead of removed
+ LLTeleportHistoryFlatItem* item = LLTeleportHistoryFlatItemStorage::instance()
+ .getFlatItemForPersistentItem(&mContextMenu,
+ history_items[history_items.size() - 1], // Most recent item, it was added instead of removed
+ history_items.size(), // index will be decremented inside loop below
+ sFilterSubString);
+
fv->addItem(item, LLUUID::null, ADD_TOP);
// Index of each item, from last to removed item should be decremented
@@ -559,6 +775,8 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
if (item->getIndex() == removed_index)
{
+ LLTeleportHistoryFlatItemStorage::instance().removeItem(item);
+
fv->removeItem(item);
// If flat list becames empty, then accordion tab should be hidden
@@ -578,6 +796,9 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
void LLTeleportHistoryPanel::showTeleportHistory()
{
mDirty = true;
+
+ // Starting to add items from last one, in reverse order,
+ // since TeleportHistory keeps most recent item at the end
mCurrentItem = mTeleportHistory->getItems().size() - 1;
for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
@@ -587,10 +808,12 @@ void LLTeleportHistoryPanel::showTeleportHistory()
LLFlatListView* fv = getFlatListViewFromTab(tab);
if (fv)
- fv->clear();
+ {
+ // Detached panels are managed by LLTeleportHistoryFlatItemStorage
+ std::vector<LLPanel*> detached_items;
+ fv->detachItems(detached_items);
+ }
}
-
- refresh();
}
void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected)
@@ -622,6 +845,12 @@ void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected)
updateVerbs();
}
+void LLTeleportHistoryPanel::onReturnKeyPressed()
+{
+ // Teleport to selected region as default action on return key pressed
+ onTeleport();
+}
+
void LLTeleportHistoryPanel::onDoubleClickItem()
{
// If item got doubleclick, then that item is already selected
@@ -643,7 +872,6 @@ void LLTeleportHistoryPanel::onAccordionTabRightClick(LLView *view, S32 x, S32 y
if (parent)
{
parent->removeChild(mAccordionTabMenu);
- mAccordionTabMenu->setParent(NULL);
}
delete mAccordionTabMenu;
}
@@ -702,16 +930,19 @@ void LLTeleportHistoryPanel::onCollapseAllFolders()
void LLTeleportHistoryPanel::onClearTeleportHistory()
{
- LLNotifications::instance().add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2));
+ LLNotificationsUtil::add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2));
}
bool LLTeleportHistoryPanel::onClearTeleportHistoryDialog(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
+ // order does matter, call this first or teleport history will contain one record(current location)
+ LLTeleportHistory::getInstance()->purgeItems();
+
LLTeleportHistoryStorage *th = LLTeleportHistoryStorage::getInstance();
th->purgeItems();
th->save();
@@ -754,3 +985,76 @@ void LLTeleportHistoryPanel::onGearButtonClicked()
LLMenuGL::showPopup(this, menu, menu_x, menu_y);
}
+bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const
+{
+ S32 tabs_cnt = mItemContainers.size();
+
+ bool has_expanded_tabs = false;
+ bool has_collapsed_tabs = false;
+
+ for (S32 n = 0; n < tabs_cnt; n++)
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(n);
+ if (!tab->getVisible())
+ continue;
+
+ if (tab->getDisplayChildren())
+ {
+ has_expanded_tabs = true;
+ }
+ else
+ {
+ has_collapsed_tabs = true;
+ }
+
+ if (has_expanded_tabs && has_collapsed_tabs)
+ {
+ break;
+ }
+ }
+
+ std::string command_name = userdata.asString();
+
+ if (has_expanded_tabs && command_name == "collapse_all")
+ {
+ return true;
+ }
+
+ if (has_collapsed_tabs && command_name == "expand_all")
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void LLTeleportHistoryPanel::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+ LLSD param = acc_tab->getValue();
+ param[COLLAPSED_BY_USER] = collapsed;
+ acc_tab->setValue(param);
+}
+
+bool LLTeleportHistoryPanel::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+ LLSD param = acc_tab->getValue();
+ if(!param.has(COLLAPSED_BY_USER))
+ {
+ return false;
+ }
+ return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param)
+{
+ bool expanded = param.asBoolean();
+ // Save accordion tab state to restore it in refresh()
+ setAccordionCollapsedByUser(ctrl, !expanded);
+
+ // Reset selection upon accordion being collapsed
+ // to disable "Teleport" and "Map" buttons for hidden item.
+ if (!expanded && mLastSelectedFlatlList)
+ {
+ mLastSelectedFlatlList->resetSelection();
+ }
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 7c1b403432..4eeaec7705 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2001-2009, Linden Research, Inc.
+ * Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -80,6 +80,7 @@ public:
private:
void onDoubleClickItem();
+ void onReturnKeyPressed();
void onAccordionTabRightClick(LLView *view, S32 x, S32 y, MASK mask);
void onAccordionTabOpen(LLAccordionCtrlTab *tab);
void onAccordionTabClose(LLAccordionCtrlTab *tab);
@@ -96,6 +97,11 @@ private:
void handleItemSelect(LLFlatListView* );
LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *);
void onGearButtonClicked();
+ bool isActionEnabled(const LLSD& userdata) const;
+
+ void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+ bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+ void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
LLTeleportHistoryStorage* mTeleportHistory;
LLAccordionCtrl* mHistoryAccordion;
@@ -104,7 +110,6 @@ private:
S32 mLastSelectedItemIndex;
bool mDirty;
S32 mCurrentItem;
- std::string mFilterSubString;
typedef LLDynamicArray<LLAccordionCtrlTab*> item_containers_t;
item_containers_t mItemContainers;
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 4ac109bf3d..fbe68b4d92 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -54,10 +54,9 @@
#include "llcolorswatch.h"
#include "lltexturectrl.h"
#include "llcombobox.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfocusmgr.h"
#include "llmanipscale.h"
-#include "llpanelinventory.h"
#include "llpreviewscript.h"
#include "llresmgr.h"
#include "llselectmgr.h"
@@ -471,7 +470,7 @@ void LLPanelVolume::sendIsFlexible()
if (is_flexible)
{
- LLFirstUse::useFlexible();
+ //LLFirstUse::useFlexible();
if (objectp->getClickAction() == CLICK_ACTION_SIT)
{
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 9d197aafa5..7bc935f986 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -45,7 +45,6 @@ class LLUICtrl;
class LLButton;
class LLViewerObject;
class LLComboBox;
-class LLPanelInventory;
class LLColorSwatchCtrl;
class LLPanelVolume : public LLPanel
diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp
new file mode 100644
index 0000000000..559997254e
--- /dev/null
+++ b/indra/newview/llpanelvolumepulldown.cpp
@@ -0,0 +1,152 @@
+/**
+ * @file llpanelvolumepulldown.cpp
+ * @author Tofu Linden
+ * @brief A floater showing the master volume pull-down
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelvolumepulldown.h"
+
+// Viewer libs
+#include "llviewercontrol.h"
+#include "llstatusbar.h"
+
+// Linden libs
+#include "llbutton.h"
+#include "lltabcontainer.h"
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h"
+#include "llslider.h"
+
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 4.0f;
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 5.0f;
+
+///----------------------------------------------------------------------------
+/// Class LLPanelVolumePulldown
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLPanelVolumePulldown::LLPanelVolumePulldown()
+{
+ mCommitCallbackRegistrar.add("Vol.setControlFalse", boost::bind(&LLPanelVolumePulldown::setControlFalse, this, _2));
+ mCommitCallbackRegistrar.add("Vol.GoAudioPrefs", boost::bind(&LLPanelVolumePulldown::onAdvancedButtonClick, this, _2));
+ LLUICtrlFactory::instance().buildPanel(this, "panel_volume_pulldown.xml");
+}
+
+BOOL LLPanelVolumePulldown::postBuild()
+{
+ // set the initial volume-slider's position to reflect reality
+ LLSlider* volslider = getChild<LLSlider>( "mastervolume" );
+ volslider->setValue(gSavedSettings.getF32("AudioLevelMaster"));
+
+ return LLPanel::postBuild();
+}
+
+/*virtual*/
+void LLPanelVolumePulldown::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.stop();
+ LLPanel::onMouseEnter(x,y,mask);
+}
+
+
+/*virtual*/
+void LLPanelVolumePulldown::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.start();
+ LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelVolumePulldown::handleVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+ }
+ else
+ {
+ mHoverTimer.stop();
+ }
+}
+
+/*virtual*/
+void LLPanelVolumePulldown::onTopLost()
+{
+ setVisible(FALSE);
+}
+
+void LLPanelVolumePulldown::onAdvancedButtonClick(const LLSD& user_data)
+{
+ // close the global volume minicontrol, we're bringing up the big one
+ setVisible(FALSE);
+
+ // bring up the prefs floater
+ LLFloaterPreference* prefsfloater = dynamic_cast<LLFloaterPreference*>
+ (LLFloaterReg::showInstance("preferences"));
+ if (prefsfloater)
+ {
+ // grab the 'audio' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
+ LLPanel* audiopanel = prefsfloater->getChild<LLPanel>("audio");
+ if (tabcontainer && audiopanel)
+ {
+ tabcontainer->selectTabPanel(audiopanel);
+ }
+ }
+}
+
+void LLPanelVolumePulldown::setControlFalse(const LLSD& user_data)
+{
+ std::string control_name = user_data.asString();
+ LLControlVariable* control = findControl(control_name);
+
+ if (control)
+ control->set(LLSD(FALSE));
+}
+
+//virtual
+void LLPanelVolumePulldown::draw()
+{
+ F32 alpha = mHoverTimer.getStarted()
+ ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), sAutoCloseFadeStartTimeSec, sAutoCloseTotalTimeSec, 1.f, 0.f)
+ : 1.0f;
+ LLViewDrawContext context(alpha);
+
+ LLPanel::draw();
+
+ if (alpha == 0.f)
+ {
+ setVisible(FALSE);
+ }
+}
+
diff --git a/indra/newview/llpanelvolumepulldown.h b/indra/newview/llpanelvolumepulldown.h
new file mode 100644
index 0000000000..9f20caa1a8
--- /dev/null
+++ b/indra/newview/llpanelvolumepulldown.h
@@ -0,0 +1,64 @@
+/**
+ * @file llpanelvolumepulldown.h
+ * @author Tofu Linden
+ * @brief A panel showing the master volume pull-down
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELVOLUMEPULLDOWN_H
+#define LL_LLPANELVOLUMEPULLDOWN_H
+
+#include "linden_common.h"
+
+#include "llpanel.h"
+
+class LLFrameTimer;
+
+class LLPanelVolumePulldown : public LLPanel
+{
+ public:
+ LLPanelVolumePulldown();
+ /*virtual*/ void draw();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+ /*virtual*/ void onTopLost();
+ /*virtual*/ BOOL postBuild();
+
+ private:
+ void setControlFalse(const LLSD& user_data);
+ void onAdvancedButtonClick(const LLSD& user_data);
+
+ LLFrameTimer mHoverTimer;
+ static const F32 sAutoCloseFadeStartTimeSec;
+ static const F32 sAutoCloseTotalTimeSec;
+};
+
+
+#endif // LL_LLPANELVOLUMEPULLDOWN_H
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index e97eb1df2b..1c4004c37a 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -32,71 +32,219 @@
#include "llviewerprecompiledheaders.h"
+// common includes
+#include "lltrans.h"
+#include "llavataractions.h"
+#include "llagent.h"
+
#include "llparticipantlist.h"
-#include "llavatarlist.h"
#include "llspeakers.h"
+#include "llviewermenu.h"
+#include "llvoiceclient.h"
//LLParticipantList retrieves add, clear and remove events and updates view accordingly
-LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
+#if LL_MSVC
+#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
+#endif
+
+static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
+
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/,
+ bool exclude_agent /*= true*/):
mSpeakerMgr(data_source),
- mAvatarList(avatar_list)
+ mAvatarList(avatar_list),
+ mSortOrder(E_SORT_BY_NAME)
+, mParticipantListMenu(NULL)
+, mExcludeAgent(exclude_agent)
+, mValidateSpeakerCallback(NULL)
{
- mSpeakerAddListener = new SpeakerAddListener(mAvatarList);
- mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList);
- mSpeakerClearListener = new SpeakerClearListener(mAvatarList);
+ mSpeakerAddListener = new SpeakerAddListener(*this);
+ mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
+ mSpeakerClearListener = new SpeakerClearListener(*this);
+ mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this);
+ mSpeakerMuteListener = new SpeakerMuteListener(*this);
mSpeakerMgr->addListener(mSpeakerAddListener, "add");
mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
+ mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
- //Lets fill avatarList with existing speakers
- LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+ mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
+ mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));
+ mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+ // Set onAvatarListDoubleClicked as default on_return action.
+ mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
+
+ if (use_context_menu)
+ {
+ mParticipantListMenu = new LLParticipantListMenu(*this);
+ mAvatarList->setContextMenu(mParticipantListMenu);
+ }
+ else
+ {
+ mAvatarList->setContextMenu(NULL);
+ }
+ //Lets fill avatarList with existing speakers
LLSpeakerMgr::speaker_list_t speaker_list;
mSpeakerMgr->getSpeakerList(&speaker_list, true);
for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
{
- group_members.push_back((*it)->mID);
+ const LLPointer<LLSpeaker>& speakerp = *it;
+
+ addAvatarIDExceptAgent(speakerp->mID);
+ if ( speakerp->mIsModerator )
+ {
+ mModeratorList.insert(speakerp->mID);
+ }
+ else
+ {
+ mModeratorToRemoveList.insert(speakerp->mID);
+ }
}
- mAvatarList->setDirty();
- mAvatarList->sortByName();
+ // we need to exclude agent id for non group chat
+ sort();
}
LLParticipantList::~LLParticipantList()
{
- delete mSpeakerAddListener;
- delete mSpeakerRemoveListener;
- delete mSpeakerClearListener;
- mSpeakerAddListener = NULL;
- mSpeakerRemoveListener = NULL;
- mSpeakerClearListener = NULL;
+ mAvatarListDoubleClickConnection.disconnect();
+ mAvatarListRefreshConnection.disconnect();
+ mAvatarListReturnConnection.disconnect();
+
+ // It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()
+ // See ticket EXT-3427
+ // hide menu before deleting it to stop enable and check handlers from triggering.
+ if(mParticipantListMenu && !LLApp::isExiting())
+ {
+ mParticipantListMenu->hide();
+ }
+
+ if (mParticipantListMenu)
+ {
+ delete mParticipantListMenu;
+ mParticipantListMenu = NULL;
+ }
+
+ mAvatarList->setContextMenu(NULL);
}
-//
-// LLParticipantList::SpeakerAddListener
-//
-bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
+{
+ mAvatarList->setSpeakingIndicatorsVisible(visible);
+};
+
+void LLParticipantList::onAvatarListDoubleClicked(LLUICtrl* ctrl)
+{
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl);
+ if(!item)
+ {
+ return;
+ }
+
+ LLUUID clicked_id = item->getAvatarId();
+
+ if (clicked_id.isNull() || clicked_id == gAgent.getID())
+ return;
+
+ LLAvatarActions::startIM(clicked_id);
+}
+
+void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLAvatarList* list = dynamic_cast<LLAvatarList*>(ctrl);
+ if (list)
+ {
+ const std::string moderator_indicator(LLTrans::getString("IM_moderator_label"));
+ const std::size_t moderator_indicator_len = moderator_indicator.length();
+
+ // Firstly remove moderators indicator
+ std::set<LLUUID>::const_iterator
+ moderator_list_it = mModeratorToRemoveList.begin(),
+ moderator_list_end = mModeratorToRemoveList.end();
+ for (;moderator_list_it != moderator_list_end; ++moderator_list_it)
+ {
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it));
+ if ( item )
+ {
+ std::string name = item->getAvatarName();
+ size_t found = name.find(moderator_indicator);
+ if (found != std::string::npos)
+ {
+ name.erase(found, moderator_indicator_len);
+ item->setName(name);
+ }
+ }
+ }
+
+ mModeratorToRemoveList.clear();
+
+ // Add moderators indicator
+ moderator_list_it = mModeratorList.begin();
+ moderator_list_end = mModeratorList.end();
+ for (;moderator_list_it != moderator_list_end; ++moderator_list_it)
+ {
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it));
+ if ( item )
+ {
+ std::string name = item->getAvatarName();
+ size_t found = name.find(moderator_indicator);
+ if (found == std::string::npos)
+ {
+ name += " ";
+ name += moderator_indicator;
+ item->setName(name);
+ }
+ }
+ }
+ }
+}
+
+void LLParticipantList::setSortOrder(EParticipantSortOrder order)
+{
+ if ( mSortOrder != order )
+ {
+ mSortOrder = order;
+ sort();
+ }
+}
+
+LLParticipantList::EParticipantSortOrder LLParticipantList::getSortOrder()
+{
+ return mSortOrder;
+}
+
+void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb)
+{
+ mValidateSpeakerCallback = cb;
+}
+
+void LLParticipantList::updateRecentSpeakersOrder()
+{
+ if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())
+ {
+ // Need to update speakers to sort list correctly
+ mSpeakerMgr->update(true);
+ // Resort avatar list
+ sort();
+ }
+}
+
+bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
LLUUID uu_id = event->getValue().asUUID();
- LLAvatarList::uuid_vector_t::iterator found = std::find(group_members.begin(), group_members.end(), uu_id);
- if(found != group_members.end())
+ if (mValidateSpeakerCallback && !mValidateSpeakerCallback(uu_id))
{
- llinfos << "Already got a buddy" << llendl;
return true;
}
- group_members.push_back(uu_id);
- mAvatarList->setDirty();
- mAvatarList->sortByName();
+ addAvatarIDExceptAgent(uu_id);
+ sort();
return true;
}
-//
-// LLParticipantList::SpeakerRemoveListener
-//
-bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
@@ -108,14 +256,448 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents
return true;
}
+bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+ group_members.clear();
+ mAvatarList->setDirty();
+ return true;
+}
+
+bool LLParticipantList::onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ const LLSD& evt_data = event->getValue();
+ if ( evt_data.has("id") && evt_data.has("is_moderator") )
+ {
+ LLUUID id = evt_data["id"];
+ bool is_moderator = evt_data["is_moderator"];
+ if ( id.notNull() )
+ {
+ if ( is_moderator )
+ mModeratorList.insert(id);
+ else
+ {
+ std::set<LLUUID>::iterator it = mModeratorList.find (id);
+ if ( it != mModeratorList.end () )
+ {
+ mModeratorToRemoveList.insert(id);
+ mModeratorList.erase(id);
+ }
+ }
+
+ // apply changes immediately
+ onAvatarListRefreshed(mAvatarList, LLSD());
+ }
+ }
+ return true;
+}
+
+bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ LLPointer<LLSpeaker> speakerp = (LLSpeaker*)event->getSource();
+ if (speakerp.isNull()) return false;
+
+ // update UI on confirmation of moderator mutes
+ if (event->getValue().asString() == "voice")
+ {
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID));
+ if (item)
+ {
+ LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator");
+ indicator->setIsMuted(speakerp->mModeratorMutedVoice);
+ }
+ }
+ return true;
+}
+
+void LLParticipantList::sort()
+{
+ if ( !mAvatarList )
+ return;
+
+ switch ( mSortOrder ) {
+ case E_SORT_BY_NAME :
+ // if mExcludeAgent == true , then no need to keep agent on top of the list
+ if(mExcludeAgent)
+ {
+ mAvatarList->sortByName();
+ }
+ else
+ {
+ mAvatarList->setComparator(&AGENT_ON_TOP_NAME_COMPARATOR);
+ mAvatarList->sort();
+ }
+ break;
+ case E_SORT_BY_RECENT_SPEAKERS:
+ if (mSortByRecentSpeakers.isNull())
+ mSortByRecentSpeakers = new LLAvatarItemRecentSpeakerComparator(*this);
+ mAvatarList->setComparator(mSortByRecentSpeakers.get());
+ mAvatarList->sort();
+ break;
+ default :
+ llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl;
+ return;
+ }
+}
+
+void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
+{
+ if (mExcludeAgent && gAgent.getID() == avatar_id) return;
+ if (mAvatarList->contains(avatar_id)) return;
+
+ mAvatarList->getIDs().push_back(avatar_id);
+ mAvatarList->setDirty();
+ adjustParticipant(avatar_id);
+}
+
+void LLParticipantList::adjustParticipant(const LLUUID& speaker_id)
+{
+ LLPointer<LLSpeaker> speakerp = mSpeakerMgr->findSpeaker(speaker_id);
+ if (speakerp.isNull()) return;
+
+ // add listener to process moderation changes
+ speakerp->addListener(mSpeakerMuteListener);
+}
+
+//
+// LLParticipantList::SpeakerAddListener
+//
+bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ /**
+ * We need to filter speaking objects. These objects shouldn't appear in the list
+ * @see LLFloaterChat::addChat() in llviewermessage.cpp to get detailed call hierarchy
+ */
+ const LLUUID& speaker_id = event->getValue().asUUID();
+ LLPointer<LLSpeaker> speaker = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+ if(speaker.isNull() || speaker->mType == LLSpeaker::SPEAKER_OBJECT)
+ {
+ return false;
+ }
+ return mParent.onAddItemEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerRemoveListener
+//
+bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onRemoveItemEvent(event, userdata);
+}
+
//
// LLParticipantList::SpeakerClearListener
//
bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
- group_members.clear();
- mAvatarList->setDirty();
+ return mParent.onClearListEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerModeratorListener
+//
+bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onModeratorUpdateEvent(event, userdata);
+}
+
+bool LLParticipantList::SpeakerMuteListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onSpeakerMuteEvent(event, userdata);
+}
+
+LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
+{
+ // set up the callbacks for all of the avatar menu items
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("ParticipantList.Sort", boost::bind(&LLParticipantList::LLParticipantListMenu::sortParticipantList, this, _2));
+ registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
+ registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
+
+ registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, mUUIDs.front()));
+ registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, mUUIDs.front()));
+ registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs.front()));
+ registrar.add("Avatar.BlockUnblock", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteVoice, this, _2));
+ registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, mUUIDs.front()));
+ registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs.front()));
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, mUUIDs.front()));
+
+ registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
+
+ enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2));
+ enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2));
+
+ // create the context menu from the XUI
+ LLContextMenu* main_menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+ "menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+
+ // Don't show sort options for P2P chat
+ bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
+ main_menu->setItemVisible("SortByName", is_sort_visible);
+ main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible);
+ main_menu->setItemVisible("Moderator Options", isGroupModerator());
+ main_menu->arrangeAndClear();
+
+ return main_menu;
+}
+
+void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
+{
+ LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y);
+
+ if (uuids.size() == 0) return;
+
+ const LLUUID speaker_id = mUUIDs.front();
+ BOOL is_muted = isMuted(speaker_id);
+
+ if (is_muted)
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false);
+ }
+ else
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::sortParticipantList(const LLSD& userdata)
+{
+ std::string param = userdata.asString();
+ if ("sort_by_name" == param)
+ {
+ mParent.setSortOrder(E_SORT_BY_NAME);
+ }
+ else if ("sort_by_recent_speakers" == param)
+ {
+ mParent.setSortOrder(E_SORT_BY_RECENT_SPEAKERS);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
+{
+
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
+ {
+ const LLUUID speaker_id = mUUIDs.front();
+ mgr->toggleAllowTextChat(speaker_id);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
+{
+ const LLUUID speaker_id = mUUIDs.front();
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, flags);
+ std::string name;
+
+ //fill in name using voice client's copy of name cache
+ LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+ if (speakerp.isNull())
+ {
+ return;
+ }
+
+ name = speakerp->mDisplayName;
+
+ LLMute mute(speaker_id, name, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+
+ if (!is_muted)
+ {
+ LLMuteList::getInstance()->add(mute, flags);
+ }
+ else
+ {
+ LLMuteList::getInstance()->remove(mute, flags);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagTextChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagVoiceChat);
+}
+
+bool LLParticipantList::LLParticipantListMenu::isGroupModerator()
+{
+ // Agent is in Group Call
+ if(gAgent.isInGroup(mParent.mSpeakerMgr->getSessionID()))
+ {
+ // Agent is Moderator
+ return mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
+ }
+ return false;
+}
+
+bool LLParticipantList::LLParticipantListMenu::isMuted(const LLUUID& avatar_id)
+{
+ LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(avatar_id);
+ if (!selected_speakerp) return true;
+
+ return selected_speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
+{
+ if (!gAgent.getRegion()) return;
+
+ bool moderate_selected = userdata.asString() == "selected";
+ const LLUUID& selected_avatar_id = mUUIDs.front();
+ bool is_muted = isMuted(selected_avatar_id);
+
+ if (moderate_selected)
+ {
+ moderateVoiceParticipant(selected_avatar_id, is_muted);
+ }
+ else
+ {
+ moderateVoiceOtherParticipants(selected_avatar_id, is_muted);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
+ {
+ mgr->moderateVoiceParticipant(avatar_id, unmute);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute)
+{
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
+ {
+ mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
+ }
+}
+
+bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item
+ || "can_pay" == item)
+ {
+ return mUUIDs.front() != gAgentID;
+ }
+ else if (item == "can_allow_text_chat")
+ {
+ return isGroupModerator();
+ }
+ else if ("can_moderate_voice" == item)
+ {
+ if (isGroupModerator())
+ {
+ LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(mUUIDs.front());
+ if (speakerp.notNull())
+ {
+ // not in voice participants can not be moderated
+ return speakerp->isInVoiceChannel();
+ }
+ }
+ return false;
+ }
+ else if (item == std::string("can_add"))
+ {
+ // We can add friends if:
+ // - there are selected people
+ // - and there are no friends among selection yet.
+
+ bool result = (mUUIDs.size() > 0);
+
+ std::vector<LLUUID>::const_iterator
+ id = mUUIDs.begin(),
+ uuids_end = mUUIDs.end();
+
+ for (;id != uuids_end; ++id)
+ {
+ if ( *id == gAgentID || LLAvatarActions::isFriend(*id) )
+ {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+ else if (item == "can_call")
+ {
+ bool not_agent = mUUIDs.front() != gAgentID;
+ bool can_call = not_agent && LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ return can_call;
+ }
+
return true;
}
+bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata)
+{
+ std::string item = userdata.asString();
+ const LLUUID& id = mUUIDs.front();
+
+ if (item == "is_muted")
+ {
+ return LLMuteList::getInstance()->isMuted(id, LLMute::flagTextChat);
+ }
+ else if (item == "is_allowed_text_chat")
+ {
+ LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(id);
+
+ if (selected_speakerp.notNull())
+ {
+ return !selected_speakerp->mModeratorMutedText;
+ }
+ }
+ else if(item == "is_blocked")
+ {
+ return LLMuteList::getInstance()->isMuted(id, LLMute::flagVoiceChat);
+ }
+ else if(item == "is_sorted_by_name")
+ {
+ return E_SORT_BY_NAME == mParent.mSortOrder;
+ }
+ else if(item == "is_sorted_by_recent_speakers")
+ {
+ return E_SORT_BY_RECENT_SPEAKERS == mParent.mSortOrder;
+ }
+
+ return false;
+}
+
+bool LLParticipantList::LLAvatarItemRecentSpeakerComparator::doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const
+{
+ if (mParent.mSpeakerMgr)
+ {
+ LLPointer<LLSpeaker> lhs = mParent.mSpeakerMgr->findSpeaker(avatar_item1->getAvatarId());
+ LLPointer<LLSpeaker> rhs = mParent.mSpeakerMgr->findSpeaker(avatar_item2->getAvatarId());
+ if ( lhs.notNull() && rhs.notNull() )
+ {
+ // Compare by last speaking time
+ if( lhs->mLastSpokeTime != rhs->mLastSpokeTime )
+ return ( lhs->mLastSpokeTime > rhs->mLastSpokeTime );
+ else if ( lhs->mSortIndex != rhs->mSortIndex )
+ return ( lhs->mSortIndex < rhs->mSortIndex );
+ }
+ else if ( lhs.notNull() )
+ {
+ // True if only avatar_item1 speaker info available
+ return true;
+ }
+ else if ( rhs.notNull() )
+ {
+ // False if only avatar_item2 speaker info available
+ return false;
+ }
+ }
+ // By default compare by name.
+ return LLAvatarItemNameComparator::doCompare(avatar_item1, avatar_item2);
+}
+
+//EOF
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 68aae0aee5..e1b1b5af00 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -32,52 +32,243 @@
#include "llviewerprecompiledheaders.h"
#include "llevent.h"
+#include "llpanelpeoplemenus.h"
+#include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator
class LLSpeakerMgr;
class LLAvatarList;
+class LLUICtrl;
class LLParticipantList
{
+ LOG_CLASS(LLParticipantList);
public:
- LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
+
+ typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t;
+
+ LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true);
~LLParticipantList();
+ void setSpeakingIndicatorsVisible(BOOL visible);
+
+ typedef enum e_participant_sort_oder {
+ E_SORT_BY_NAME = 0,
+ E_SORT_BY_RECENT_SPEAKERS = 1,
+ } EParticipantSortOrder;
+
+ /**
+ * Adds specified avatar ID to the existing list if it is not Agent's ID
+ *
+ * @param[in] avatar_id - Avatar UUID to be added into the list
+ */
+ void addAvatarIDExceptAgent(const LLUUID& avatar_id);
+
+ /**
+ * Set and sort Avatarlist by given order
+ */
+ void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
+ EParticipantSortOrder getSortOrder();
+
+ /**
+ * Refreshes the participant list if it's in sort by recent speaker order.
+ */
+ void updateRecentSpeakersOrder();
+
+ /**
+ * Set a callback to be called before adding a speaker. Invalid speakers will not be added.
+ *
+ * If the callback is unset all speakers are considered as valid.
+ *
+ * @see onAddItemEvent()
+ */
+ void setValidateSpeakerCallback(validate_speaker_callback_t cb);
protected:
+ /**
+ * LLSpeakerMgr event handlers
+ */
+ bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+
+ /**
+ * Sorts the Avatarlist by stored order
+ */
+ void sort();
//List of listeners implementing LLOldEvents::LLSimpleListener.
//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way
//that one listener can handle only one type of event
- class SpeakerAddListener : public LLOldEvents::LLSimpleListener
+ class BaseSpeakerListner : public LLOldEvents::LLSimpleListener
{
public:
- SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+ BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {}
+ protected:
+ LLParticipantList& mParent;
+ };
+ class SpeakerAddListener : public BaseSpeakerListner
+ {
+ public:
+ SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
- class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener
+ class SpeakerRemoveListener : public BaseSpeakerListner
{
public:
- SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+ SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
+ /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ };
+ class SpeakerClearListener : public BaseSpeakerListner
+ {
+ public:
+ SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
- class SpeakerClearListener : public LLOldEvents::LLSimpleListener
+ class SpeakerModeratorUpdateListener : public BaseSpeakerListner
{
public:
- SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+ SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
+ /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ };
+
+ class SpeakerMuteListener : public BaseSpeakerListner
+ {
+ public:
+ SpeakerMuteListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
+
+ /**
+ * Menu used in the participant list.
+ */
+ class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu
+ {
+ public:
+ LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
+ /*virtual*/ LLContextMenu* createMenu();
+ /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
+ protected:
+ LLParticipantList& mParent;
+ private:
+ bool enableContextMenuItem(const LLSD& userdata);
+ bool checkContextMenuItem(const LLSD& userdata);
+
+ void sortParticipantList(const LLSD& userdata);
+ void toggleAllowTextChat(const LLSD& userdata);
+ void toggleMute(const LLSD& userdata, U32 flags);
+ void toggleMuteText(const LLSD& userdata);
+ void toggleMuteVoice(const LLSD& userdata);
+
+ /**
+ * Return true if Agent is group moderator(and moderator of group call).
+ */
+ bool isGroupModerator();
+
+ // Voice moderation support
+ /**
+ * Check whether specified by argument avatar is muted for group chat or not.
+ */
+ bool isMuted(const LLUUID& avatar_id);
+
+ /**
+ * Processes Voice moderation menu items.
+ *
+ * It calls either moderateVoiceParticipant() or moderateVoiceParticipant() depend on
+ * passed parameter.
+ *
+ * @param userdata can be "selected" or "others".
+ *
+ * @see moderateVoiceParticipant()
+ * @see moderateVoiceOtherParticipants()
+ */
+ void moderateVoice(const LLSD& userdata);
+
+ /**
+ * Mutes/Unmutes avatar for current group voice chat.
+ *
+ * It only marks avatar as muted for session and does not use local Agent's Block list.
+ * It does not mute Agent itself.
+ *
+ * @param[in] avatar_id UUID of avatar to be processed
+ * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceOtherParticipants()
+ */
+ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+
+ /**
+ * Mutes/Unmutes all avatars except specified for current group voice chat.
+ *
+ * It only marks avatars as muted for session and does not use local Agent's Block list.
+ * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
+ *
+ * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
+ * @param[in] unmute if true - avatars will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceParticipant()
+ */
+ void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
+ };
+
+ /**
+ * Comparator for comparing avatar items by last spoken time
+ */
+ class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator, public LLRefCount
+ {
+ LOG_CLASS(LLAvatarItemRecentSpeakerComparator);
+ public:
+ LLAvatarItemRecentSpeakerComparator(LLParticipantList& parent):mParent(parent){};
+ virtual ~LLAvatarItemRecentSpeakerComparator() {};
+ protected:
+ virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
+ private:
+ LLParticipantList& mParent;
+ };
+
private:
+ void onAvatarListDoubleClicked(LLUICtrl* ctrl);
+ void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
+
+ /**
+ * Adjusts passed participant to work properly.
+ *
+ * Adds SpeakerMuteListener to process moderation actions.
+ */
+ void adjustParticipant(const LLUUID& speaker_id);
+
LLSpeakerMgr* mSpeakerMgr;
- LLAvatarList* mAvatarList;
+ LLAvatarList* mAvatarList;
+
+ std::set<LLUUID> mModeratorList;
+ std::set<LLUUID> mModeratorToRemoveList;
+
+ LLPointer<SpeakerAddListener> mSpeakerAddListener;
+ LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener;
+ LLPointer<SpeakerClearListener> mSpeakerClearListener;
+ LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener;
+ LLPointer<SpeakerMuteListener> mSpeakerMuteListener;
+
+ LLParticipantListMenu* mParticipantListMenu;
+
+ EParticipantSortOrder mSortOrder;
+ /*
+ * This field manages an adding a new avatar_id in the mAvatarList
+ * If true, then agent_id wont be added into mAvatarList
+ * Also by default this field is controlling a sort procedure, @c sort()
+ */
+ bool mExcludeAgent;
+
+ // boost::connections
+ boost::signals2::connection mAvatarListDoubleClickConnection;
+ boost::signals2::connection mAvatarListRefreshConnection;
+ boost::signals2::connection mAvatarListReturnConnection;
- SpeakerAddListener* mSpeakerAddListener;
- SpeakerRemoveListener* mSpeakerRemoveListener;
- SpeakerClearListener* mSpeakerClearListener;
+ LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
+ validate_speaker_callback_t mValidateSpeakerCallback;
};
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index b3b4857727..4fe69f295c 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -38,6 +38,7 @@
#include "llfloaterinventory.h" // for LLInventoryPanel
#include "llfolderview.h" // for FIRST_SELECTED_ITEM
+#include "llinventorypanel.h"
static const std::string LANDMARKS_INVENTORY_LIST_NAME("landmarks_list");
@@ -65,7 +66,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
std::vector<std::string> items;
std::vector<std::string> disabled_items;
- if(isInTrash())
+ if(isItemInTrash())
{
items.push_back(std::string("Purge Item"));
if (!isItemRemovable())
@@ -83,7 +84,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601
}
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
@@ -116,7 +117,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// repeat parent functionality
sSelf = this; // necessary for "New Folder" functionality
- hideContextEntries(menu, items, disabled_items);
+ hide_context_entries(menu, items, disabled_items);
}
}
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
new file mode 100644
index 0000000000..f1e450a083
--- /dev/null
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -0,0 +1,218 @@
+/**
+ * @file llplacesinventorypanel.cpp
+ * @brief LLPlacesInventoryPanel class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llscrollcontainer.h"
+
+#include "llplacesinventorypanel.h"
+
+#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpanellandmarks.h"
+#include "llplacesinventorybridge.h"
+
+static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_inventory_panel");
+
+static const LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER;
+
+LLPlacesInventoryPanel::LLPlacesInventoryPanel(const Params& p) :
+ LLInventoryPanel(p),
+ mSavedFolderState(NULL)
+
+{
+ mInvFVBridgeBuilder = &PLACES_INVENTORY_BUILDER;
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+}
+
+
+LLPlacesInventoryPanel::~LLPlacesInventoryPanel()
+{
+ delete mSavedFolderState;
+}
+
+BOOL LLPlacesInventoryPanel::postBuild()
+{
+ LLInventoryPanel::postBuild();
+
+ // clear Contents();
+ {
+ mFolders->destroyView();
+ mFolders->getParent()->removeChild(mFolders);
+ mFolders->die();
+
+ if( mScroller )
+ {
+ removeChild( mScroller );
+ mScroller->die();
+ mScroller = NULL;
+ }
+ mFolders = NULL;
+ }
+
+
+ mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+
+ // create root folder
+ {
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+ LLPlacesFolderView::Params p;
+ p.name = getName();
+ p.rect = folder_rect;
+ p.parent_panel = this;
+ mFolders = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
+ mFolders->setAllowMultiSelect(mAllowMultiSelect);
+ }
+
+ mCommitCallbackRegistrar.popScope();
+
+ mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+ // scroller
+ {
+ LLRect scroller_view_rect = getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params p;
+ p.name("Inventory Scroller");
+ p.rect(scroller_view_rect);
+ p.follows.flags(FOLLOWS_ALL);
+ p.reserve_scroll_corner(true);
+ p.tab_stop(true);
+ mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ }
+ addChild(mScroller);
+ mScroller->addChild(mFolders);
+
+ mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
+
+
+ // cut subitems
+ mFolders->setUseEllipses(true);
+
+ return TRUE;
+}
+
+// save current folder open state
+void LLPlacesInventoryPanel::saveFolderState()
+{
+ mSavedFolderState->setApply(FALSE);
+ getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+}
+
+// re-open folders which state was saved
+void LLPlacesInventoryPanel::restoreFolderState()
+{
+ mSavedFolderState->setApply(TRUE);
+ getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ getRootFolder()->applyFunctorRecursively(opener);
+ getRootFolder()->scrollToShowSelection();
+}
+
+S32 LLPlacesInventoryPanel::notify(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "select_first")
+ {
+ return getRootFolder()->notify(info);
+ }
+ else if(str_action == "select_last")
+ {
+ return getRootFolder()->notify(info);
+ }
+ }
+ return 0;
+}
+
+/************************************************************************/
+/* PROTECTED METHODS */
+/************************************************************************/
+
+
+
+/************************************************************************/
+/* LLPlacesFolderView implementation */
+/************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+// PUBLIC METHODS
+//////////////////////////////////////////////////////////////////////////
+
+LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)
+: LLFolderView(p)
+{
+ // we do not need auto select functionality in places landmarks, so override default behavior.
+ // this disables applying of the LLSelectFirstFilteredItem in LLFolderView::doIdle.
+ // Fixed issues: EXT-1631, EXT-4994.
+ mAutoSelectOverride = TRUE;
+}
+
+BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ // let children to change selection first
+ childrenHandleRightMouseDown(x, y, mask);
+ mParentLandmarksPanel->setCurrentSelectedList((LLPlacesInventoryPanel*)getParentPanel());
+
+ // then determine its type and set necessary menu handle
+ if (getCurSelectedItem())
+ {
+ LLInventoryType::EType inventory_type = getCurSelectedItem()->getListener()->getInventoryType();
+ inventory_type_menu_handle_t::iterator it_handle = mMenuHandlesByInventoryType.find(inventory_type);
+
+ if (it_handle != mMenuHandlesByInventoryType.end())
+ {
+ mPopupMenuHandle = (*it_handle).second;
+ }
+ else
+ {
+ llwarns << "Requested menu handle for non-setup inventory type: " << inventory_type << llendl;
+ }
+
+ }
+
+ return LLFolderView::handleRightMouseDown(x, y, mask);
+}
+
+void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle)
+{
+ mMenuHandlesByInventoryType[asset_type] = menu_handle;
+}
+
+// EOF
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
new file mode 100644
index 0000000000..04c6758eae
--- /dev/null
+++ b/indra/newview/llplacesinventorypanel.h
@@ -0,0 +1,98 @@
+/**
+ * @file llplacesinventorypanel.h
+ * @brief LLPlacesInventoryPanel class declaration
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYSUBTREEPANEL_H
+#define LL_LLINVENTORYSUBTREEPANEL_H
+
+#include "llfloaterinventory.h"
+#include "llinventorypanel.h"
+#include "llfolderview.h"
+
+class LLLandmarksPanel;
+
+class LLPlacesInventoryPanel : public LLInventoryPanel
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {
+ Params()
+ {}
+ };
+
+ LLPlacesInventoryPanel(const Params& p);
+ ~LLPlacesInventoryPanel();
+
+ /*virtual*/ BOOL postBuild();
+
+ void saveFolderState();
+ void restoreFolderState();
+
+ virtual S32 notify(const LLSD& info) ;
+
+private:
+ LLSaveFolderState* mSavedFolderState;
+};
+
+
+class LLPlacesFolderView : public LLFolderView
+{
+public:
+ LLPlacesFolderView(const LLFolderView::Params& p);
+ /**
+ * Handles right mouse down
+ *
+ * Contains workaround for EXT-2786: sets current selected list for landmark
+ * panel using @c mParentLandmarksPanel which is set in @c LLLandmarksPanel::initLandmarksPanel
+ */
+ /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
+
+ void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle);
+
+ void setParentLandmarksPanel(LLLandmarksPanel* panel)
+ {
+ mParentLandmarksPanel = panel;
+ }
+
+ S32 getSelectedCount() { return (S32)mSelectedItems.size(); }
+
+private:
+ /**
+ * holds pointer to landmark panel. This pointer is used in @c LLPlacesFolderView::handleRightMouseDown
+ */
+ LLLandmarksPanel* mParentLandmarksPanel;
+ typedef std::map<LLInventoryType::EType, LLHandle<LLView> > inventory_type_menu_handle_t;
+ inventory_type_menu_handle_t mMenuHandlesByInventoryType;
+
+};
+
+#endif //LL_LLINVENTORYSUBTREEPANEL_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index b06e70c00a..0b0c03e9e9 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -45,6 +45,7 @@
#include "lltooldraganddrop.h"
#include "llradiogroup.h"
#include "llassetstorage.h"
+#include "llviewerassettype.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "lldbstrings.h"
@@ -149,6 +150,13 @@ void LLPreview::onCommit()
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setDescription(childGetText("desc"));
+
+ std::string new_name = childGetText("name");
+ if ( (new_item->getName() != new_name) && !new_name.empty())
+ {
+ new_item->rename(childGetText("name"));
+ }
+
if(mObjectUUID.notNull())
{
// must be in an object
@@ -317,7 +325,7 @@ BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask)
&& LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
{
EDragAndDropType type;
- type = LLAssetType::lookupDragAndDropType(item->getType());
+ type = LLViewerAssetType::lookupDragAndDropType(item->getType());
LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY;
if(!mObjectUUID.isNull())
{
@@ -406,7 +414,7 @@ void LLPreview::onDiscardBtn(void* data)
*/
// Move the item to the trash
- LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if (item->getParentUUID() != trash_id)
{
LLInventoryModel::update_list_t update;
@@ -453,7 +461,7 @@ LLMultiPreview::LLMultiPreview()
{
// start with a rect in the top-left corner ; will get resized
LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 200, 200);
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 200);
setRect(rect);
}
setTitle(LLTrans::getString("MultiPreviewTitle"));
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 506c135ca6..551e247d8c 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -37,7 +37,7 @@
#include "llresizehandle.h"
#include "llpointer.h"
#include "lluuid.h"
-#include "llinventorymodel.h" // LLInventoryObserver
+#include "llinventoryobserver.h"
#include <map>
class LLInventoryItem;
@@ -74,7 +74,7 @@ public:
/*virtual*/ BOOL postBuild();
- void setObjectID(const LLUUID& object_id);
+ virtual void setObjectID(const LLUUID& object_id);
void setItem( LLInventoryItem* item );
void setAssetId(const LLUUID& asset_id);
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 604faf8eb4..0cc747f789 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()
childSetAction("Anim audition btn",auditionAnim, this);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index ab2afb8056..57a8ca3d12 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -43,6 +43,7 @@
#include "lldir.h"
#include "llfloaterreg.h"
#include "llmultigesture.h"
+#include "llnotificationsutil.h"
#include "llvfile.h"
// newview
@@ -58,7 +59,6 @@
#include "llinventorymodel.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
-#include "llnotify.h"
#include "llradiogroup.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -130,10 +130,10 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob
preview->setObjectID(object_id);
// Start speculative download of sounds and animations
- LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_ANIMATION);
+ const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION);
gInventory.startBackgroundFetch(animation_folder_id);
- LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_SOUND);
+ const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND);
gInventory.startBackgroundFetch(sound_folder_id);
// this will call refresh when we have everything.
@@ -155,6 +155,12 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob
return preview;
}
+void LLPreviewGesture::draw()
+{
+ // Skip LLPreview::draw() to avoid description update
+ LLFloater::draw();
+}
+
// virtual
BOOL LLPreviewGesture::handleKeyHere(KEY key, MASK mask)
{
@@ -254,7 +260,7 @@ BOOL LLPreviewGesture::canClose()
else
{
// Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(),
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
return FALSE;
}
@@ -283,7 +289,7 @@ void LLPreviewGesture::onVisibilityChange ( const LLSD& new_visibility )
bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0: // "Yes"
@@ -355,7 +361,7 @@ LLPreviewGesture::~LLPreviewGesture()
BOOL LLPreviewGesture::postBuild()
{
- mVisibleSignal.connect(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
+ setVisibleCallback(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
LLLineEditor* edit;
LLComboBox* combo;
@@ -364,6 +370,12 @@ BOOL LLPreviewGesture::postBuild()
LLTextBox* text;
LLCheckBoxCtrl* check;
+ edit = getChild<LLLineEditor>("name");
+ edit->setKeystrokeCallback(onKeystrokeCommit, this);
+
+ edit = getChild<LLLineEditor>("desc");
+ edit->setKeystrokeCallback(onKeystrokeCommit, this);
+
edit = getChild<LLLineEditor>("trigger_editor");
edit->setKeystrokeCallback(onKeystrokeCommit, this);
edit->setCommitCallback(onCommitSetDirty, this);
@@ -460,7 +472,7 @@ BOOL LLPreviewGesture::postBuild()
edit = getChild<LLLineEditor>("wait_time_editor");
edit->setEnabled(FALSE);
edit->setVisible(FALSE);
- edit->setPrevalidate(LLLineEditor::prevalidateFloat);
+ edit->setPrevalidate(LLTextValidate::validateFloat);
// edit->setKeystrokeCallback(onKeystrokeCommit, this);
edit->setCommitOnFocusLost(TRUE);
edit->setCommitCallback(onCommitWaitTime, this);
@@ -491,9 +503,11 @@ BOOL LLPreviewGesture::postBuild()
if (item)
{
- childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
+
+ childSetText("name", item->getName());
+ childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe);
}
return LLPreview::postBuild();
@@ -1054,19 +1068,21 @@ void LLPreviewGesture::saveIfNeeded()
if (dp.getCurrentSize() > 1000)
{
- LLNotifications::instance().add("GestureSaveFailedTooManySteps");
+ LLNotificationsUtil::add("GestureSaveFailedTooManySteps");
delete gesture;
gesture = NULL;
}
else if (!ok)
{
- LLNotifications::instance().add("GestureSaveFailedTryAgain");
+ LLNotificationsUtil::add("GestureSaveFailedTryAgain");
delete gesture;
gesture = NULL;
}
else
{
+ LLPreview::onCommit();
+
// Every save gets a new UUID. Yup.
LLTransactionID tid;
LLAssetID asset_id;
@@ -1200,7 +1216,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,
}
else
{
- LLNotifications::instance().add("GestureSaveFailedObjectNotFound");
+ LLNotificationsUtil::add("GestureSaveFailedObjectNotFound");
}
}
@@ -1216,7 +1232,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,
llwarns << "Problem saving gesture: " << status << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("GestureSaveFailedReason", args);
+ LLNotificationsUtil::add("GestureSaveFailedReason", args);
}
delete info;
info = NULL;
diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h
index 9d26539453..5968e936ef 100644
--- a/indra/newview/llpreviewgesture.h
+++ b/indra/newview/llpreviewgesture.h
@@ -33,8 +33,9 @@
#ifndef LL_LLPREVIEWGESTURE_H
#define LL_LLPREVIEWGESTURE_H
-#include "llpreview.h"
+#include "llassettype.h"
#include "llmultigesture.h"
+#include "llpreview.h"
class LLMultiGesture;
class LLLineEditor;
@@ -46,6 +47,7 @@ class LLScrollListItem;
class LLButton;
class LLGestureStep;
class LLRadioGroup;
+class LLVFS;
class LLPreviewGesture : public LLPreview
{
@@ -58,6 +60,7 @@ public:
virtual ~LLPreviewGesture();
// LLView
+ /*virtual*/ void draw();
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ab9cfbf850..ee8e3f1db6 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -43,7 +43,7 @@
#include "llfloaterreg.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llresmgr.h"
#include "roles_constants.h"
#include "llscrollbar.h"
@@ -55,7 +55,6 @@
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "lldir.h"
-//#include "llfloaterchat.h"
#include "llviewerstats.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llappviewer.h" // app_abort_quit()
@@ -96,7 +95,7 @@ BOOL LLPreviewNotecard::postBuild()
childSetCommitCallback("desc", LLPreview::onText, this);
if (item)
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -153,7 +152,7 @@ BOOL LLPreviewNotecard::canClose()
else
{
// Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
return FALSE;
}
@@ -330,15 +329,15 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
LL_ERR_FILE_EMPTY == status)
{
- LLNotifications::instance().add("NotecardMissing");
+ LLNotificationsUtil::add("NotecardMissing");
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
- LLNotifications::instance().add("NotecardNoPermissions");
+ LLNotificationsUtil::add("NotecardNoPermissions");
}
else
{
- LLNotifications::instance().add("UnableToLoadNotecard");
+ LLNotificationsUtil::add("UnableToLoadNotecard");
}
llwarns << "Problem loading notecard: " << status << llendl;
@@ -493,7 +492,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
}
else
{
- LLNotifications::instance().add("SaveNotecardFailObjectNotFound");
+ LLNotificationsUtil::add("SaveNotecardFailObjectNotFound");
}
}
// Perform item copy to inventory
@@ -519,7 +518,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
llwarns << "Problem saving notecard: " << status << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("SaveNotecardFailReason", args);
+ LLNotificationsUtil::add("SaveNotecardFailReason", args);
}
std::string uuid_string;
@@ -532,7 +531,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case 0: // "Yes"
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index ac7abf1448..f5a9f82d50 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -45,7 +45,7 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llhelp.h"
-
+#include "llnotificationsutil.h"
#include "llresmgr.h"
#include "llscrollbar.h"
#include "llscrollcontainer.h"
@@ -54,13 +54,13 @@
#include "llscrolllistcell.h"
#include "llslider.h"
#include "lscript_rt_interface.h"
+#include "lscript_library.h"
#include "lscript_export.h"
#include "lltextbox.h"
#include "lltooldraganddrop.h"
#include "llvfile.h"
#include "llagent.h"
-#include "llnotify.h"
#include "llmenugl.h"
#include "roles_constants.h"
#include "llselectmgr.h"
@@ -79,7 +79,6 @@
#include "llslider.h"
#include "lldir.h"
#include "llcombobox.h"
-//#include "llfloaterchat.h"
#include "llviewerstats.h"
#include "llviewertexteditor.h"
#include "llviewerwindow.h"
@@ -89,7 +88,6 @@
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llappviewer.h"
-#include "llpanelinventory.h"
const std::string HELLO_LSL =
"default\n"
@@ -452,7 +450,7 @@ bool LLScriptEdCore::hasChanged()
{
if (!mEditor) return false;
- return !mEditor->isPristine();
+ return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData);
}
void LLScriptEdCore::draw()
@@ -619,14 +617,14 @@ BOOL LLScriptEdCore::canClose()
else
{
// Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
return FALSE;
}
}
bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch( option )
{
case 0: // "Yes"
@@ -663,7 +661,9 @@ void LLScriptEdCore::onBtnDynamicHelp()
live_help_floater = new LLFloater(LLSD());
LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL);
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
- parent->addDependentFloater(live_help_floater, TRUE);
+ llassert(parent);
+ if (parent)
+ parent->addDependentFloater(live_help_floater, TRUE);
live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this);
live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor"));
live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this);
@@ -799,7 +799,7 @@ void LLScriptEdCore::onBtnUndoChanges()
{
if( !mEditor->tryToRevertToPristineState() )
{
- LLNotifications::instance().add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2));
+ LLNotificationsUtil::add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2));
}
}
@@ -828,7 +828,7 @@ void LLScriptEdCore::onErrorList(LLUICtrl*, void* user_data)
bool LLScriptEdCore::handleReloadFromServerDialog(const LLSD& notification, const LLSD& response )
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch( option )
{
case 0: // "Yes"
@@ -955,9 +955,13 @@ BOOL LLPreviewLSL::postBuild()
{
const LLInventoryItem* item = getItem();
+ llassert(item);
+ if (item)
+ {
+ childSetText("desc", item->getDescription());
+ }
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -1282,7 +1286,7 @@ void LLPreviewLSL::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32
llwarns << "Problem saving script: " << status << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("SaveScriptFailReason", args);
+ LLNotificationsUtil::add("SaveScriptFailReason", args);
}
delete info;
}
@@ -1320,7 +1324,7 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d
llwarns << "Problem saving LSL Bytecode (Preview)" << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("SaveBytecodeFailReason", args);
+ LLNotificationsUtil::add("SaveBytecodeFailReason", args);
}
delete instance_uuid;
}
@@ -1365,15 +1369,15 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
LL_ERR_FILE_EMPTY == status)
{
- LLNotifications::instance().add("ScriptMissing");
+ LLNotificationsUtil::add("ScriptMissing");
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
- LLNotifications::instance().add("ScriptNoPermissions");
+ LLNotificationsUtil::add("ScriptNoPermissions");
}
else
{
- LLNotifications::instance().add("UnableToLoadScript");
+ LLNotificationsUtil::add("UnableToLoadScript");
}
preview->mAssetStatus = PREVIEW_ASSET_ERROR;
@@ -1606,15 +1610,15 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,
if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
LL_ERR_FILE_EMPTY == status)
{
- LLNotifications::instance().add("ScriptMissing");
+ LLNotificationsUtil::add("ScriptMissing");
}
else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
{
- LLNotifications::instance().add("ScriptNoPermissions");
+ LLNotificationsUtil::add("ScriptNoPermissions");
}
else
{
- LLNotifications::instance().add("UnableToLoadScript");
+ LLNotificationsUtil::add("UnableToLoadScript");
}
instance->mAssetStatus = PREVIEW_ASSET_ERROR;
}
@@ -1699,7 +1703,7 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata )
else
{
runningCheckbox->set(!running);
- LLNotifications::instance().add("CouldNotStartStopScript");
+ LLNotificationsUtil::add("CouldNotStartStopScript");
}
}
@@ -1722,7 +1726,7 @@ void LLLiveLSLEditor::onReset(void *userdata)
}
else
{
- LLNotifications::instance().add("CouldNotStartStopScript");
+ LLNotificationsUtil::add("CouldNotStartStopScript");
}
}
@@ -1815,7 +1819,7 @@ void LLLiveLSLEditor::saveIfNeeded()
LLViewerObject* object = gObjectList.findObject(mObjectUUID);
if(!object)
{
- LLNotifications::instance().add("SaveScriptFailObjectNotFound");
+ LLNotificationsUtil::add("SaveScriptFailObjectNotFound");
return;
}
@@ -1823,7 +1827,7 @@ void LLLiveLSLEditor::saveIfNeeded()
{
// $NOTE: While the error message may not be exactly correct,
// it's pretty close.
- LLNotifications::instance().add("SaveScriptFailObjectNotFound");
+ LLNotificationsUtil::add("SaveScriptFailObjectNotFound");
return;
}
@@ -1906,7 +1910,7 @@ void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url,
const LLUUID& item_id,
BOOL is_running)
{
- llinfos << "Update Task Inventory via capability" << llendl;
+ llinfos << "Update Task Inventory via capability " << url << llendl;
LLSD body;
body["task_id"] = task_id;
body["item_id"] = item_id;
@@ -2024,7 +2028,7 @@ void LLLiveLSLEditor::onSaveTextComplete(const LLUUID& asset_uuid, void* user_da
llwarns << "Unable to save text for a script." << llendl;
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("CompileQueueSaveText", args);
+ LLNotificationsUtil::add("CompileQueueSaveText", args);
}
else
{
@@ -2083,7 +2087,7 @@ void LLLiveLSLEditor::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* use
LLSD args;
args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
- LLNotifications::instance().add("CompileQueueSaveBytecode", args);
+ LLNotificationsUtil::add("CompileQueueSaveBytecode", args);
}
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_uuid.asString());
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index a00f580e32..9d194c5557 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -41,7 +41,6 @@
#include "lliconctrl.h"
#include "llframetimer.h"
-
class LLMessageSystem;
class LLTextEditor;
class LLButton;
@@ -52,6 +51,8 @@ struct LLEntryAndEdCore;
class LLMenuBarGL;
class LLFloaterScriptSearch;
class LLKeywordToken;
+class LLVFS;
+class LLViewerInventoryItem;
// Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these.
class LLScriptEdCore : public LLPanel
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index 7659c50ed3..44b828854b 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -75,7 +75,7 @@ BOOL LLPreviewSound::postBuild()
button->setSoundFlags(LLView::SILENT);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 9c21faa3be..22a1ef94a7 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -43,11 +43,13 @@
#include "llfloaterreg.h"
#include "llimagetga.h"
#include "llinventory.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"
@@ -63,7 +65,7 @@ const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f;
LLPreviewTexture::LLPreviewTexture(const LLSD& key)
- : LLPreview( key ),
+ : LLPreview(key),
mLoadingFullImage( FALSE ),
mShowKeepDiscard(FALSE),
mCopyToInv(FALSE),
@@ -71,43 +73,18 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
mUpdateDimensions(TRUE),
mLastHeight(0),
mLastWidth(0),
- mAspectRatio(0.f)
+ mAspectRatio(0.f),
+ mPreviewToSave(FALSE),
+ mImage(NULL)
{
- const LLInventoryItem *item = getItem();
- if(item)
+ updateImageID();
+ if (key.has("save_as"))
{
- mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
- mImageID = item->getAssetUUID();
- const LLPermissions& perm = item->getPermissions();
- U32 mask = PERM_NONE;
- if(perm.getOwner() == gAgent.getID())
- {
- mask = perm.getMaskBase();
- }
- else if(gAgent.isInGroup(perm.getGroup()))
- {
- mask = perm.getMaskGroup();
- }
- else
- {
- mask = perm.getMaskEveryone();
- }
- if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
- {
- mIsCopyable = TRUE;
- }
- }
- else // not an item, assume it's an asset id
- {
- mImageID = mItemUUID;
- mCopyToInv = TRUE;
- mIsCopyable = TRUE;
+ mPreviewToSave = TRUE;
}
-
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE);
}
-
LLPreviewTexture::~LLPreviewTexture()
{
if( mLoadingFullImage )
@@ -138,6 +115,10 @@ BOOL LLPreviewTexture::postBuild()
childSetVisible("Discard", false);
}
+ childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
+ childSetVisible("save_tex_btn", true);
+ childSetEnabled("save_tex_btn", canSaveAs());
+
if (!mCopyToInv)
{
const LLInventoryItem* item = getItem();
@@ -146,7 +127,7 @@ BOOL LLPreviewTexture::postBuild()
{
childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
}
}
@@ -157,6 +138,13 @@ BOOL LLPreviewTexture::postBuild()
return LLPreview::postBuild();
}
+// static
+void LLPreviewTexture::onSaveAsBtn(void* data)
+{
+ LLPreviewTexture* self = (LLPreviewTexture*)data;
+ self->saveAs();
+}
+
void LLPreviewTexture::draw()
{
if (mUpdateDimensions)
@@ -181,6 +169,12 @@ void LLPreviewTexture::draw()
if ( mImage.notNull() )
{
+ // Automatically bring up SaveAs dialog if we opened this to save the texture.
+ if (mPreviewToSave)
+ {
+ mPreviewToSave = FALSE;
+ saveAs();
+ }
// Draw the texture
glColor3f( 1.f, 1.f, 1.f );
gl_draw_scaled_image(interior.mLeft,
@@ -209,7 +203,7 @@ void LLPreviewTexture::draw()
if( mLoadingFullImage )
{
- LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving:"), 0,
+ LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving"), 0,
interior.mLeft + 4,
interior.mBottom + 4,
LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM,
@@ -255,6 +249,7 @@ void LLPreviewTexture::draw()
}
}
}
+
}
@@ -289,29 +284,68 @@ void LLPreviewTexture::saveAs()
// virtual
void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent)
{
-// mLastHeight = 0;
-// mLastWidth = 0;
- mUpdateDimensions = TRUE;
LLPreview::reshape(width, height, called_from_parent);
+
+ LLRect dim_rect;
+ childGetRect("dimensions", dim_rect);
+
+ S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
+
+ // add space for dimensions and aspect ratio
+ S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
+
+ LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
+ client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
+ client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
+
+ S32 client_width = client_rect.getWidth();
+ S32 client_height = client_rect.getHeight();
+
+ if (mAspectRatio > 0.f)
+ {
+ if(mAspectRatio > 1.f)
+ {
+ client_height = llceil((F32)client_width / mAspectRatio);
+ if(client_height > client_rect.getHeight())
+ {
+ client_height = client_rect.getHeight();
+ client_width = llceil((F32)client_height * mAspectRatio);
+ }
+ }
+ else//mAspectRatio < 1.f
+ {
+ client_width = llceil((F32)client_height * mAspectRatio);
+ if(client_width > client_rect.getWidth())
+ {
+ client_width = client_rect.getWidth();
+ client_height = llceil((F32)client_width / mAspectRatio);
+ }
+ }
+ }
+
+ mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
+
}
// virtual
void LLPreviewTexture::onFocusReceived()
{
- mLastHeight = 0;
- mLastWidth = 0;
- mUpdateDimensions = TRUE;
LLPreview::onFocusReceived();
}
+void LLPreviewTexture::openToSave()
+{
+ mPreviewToSave = TRUE;
+}
+
// static
void LLPreviewTexture::onFileLoadedForSave(BOOL success,
- LLViewerFetchedTexture *src_vi,
- LLImageRaw* src,
- LLImageRaw* aux_src,
- S32 discard_level,
- BOOL final,
- void* userdata)
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata)
{
LLUUID* item_uuid = (LLUUID*) userdata;
@@ -335,13 +369,13 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
{
LLSD args;
args["FILE"] = self->mSaveFileName;
- LLNotifications::instance().add("CannotEncodeFile", args);
+ LLNotificationsUtil::add("CannotEncodeFile", args);
}
else if( !image_tga->save( self->mSaveFileName ) )
{
LLSD args;
args["FILE"] = self->mSaveFileName;
- LLNotifications::instance().add("CannotWriteFile", args);
+ LLNotificationsUtil::add("CannotWriteFile", args);
}
else
{
@@ -354,8 +388,9 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
if( self && !success )
{
- LLNotifications::instance().add("CannotDownloadFile");
+ LLNotificationsUtil::add("CannotDownloadFile");
}
+
}
@@ -365,143 +400,96 @@ void LLPreviewTexture::updateDimensions()
{
if (!mImage)
return;
-
- mUpdateDimensions = FALSE;
-
- S32 image_height = llmax(1, mImage->getFullHeight());
- S32 image_width = llmax(1, mImage->getFullWidth());
- // Attempt to make the image 1:1 on screen.
- // If that fails, cut width by half.
- S32 client_width = image_width;
- S32 client_height = image_height;
- S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
- S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH;
- S32 max_client_width = gViewerWindow->getWindowWidth() - horiz_pad;
- S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad;
- if (mAspectRatio > 0.f)
+ if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0)
{
- client_height = llceil((F32)client_width / mAspectRatio);
+ return;
}
- while ((client_width > max_client_width) ||
- (client_height > max_client_height ))
- {
- client_width /= 2;
- client_height /= 2;
- }
-
- S32 view_width = client_width + horiz_pad;
- S32 view_height = client_height + vert_pad;
- // set text on dimensions display (should be moved out of here and into a callback of some sort)
+ mUpdateDimensions = FALSE;
+
childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth()));
childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight()));
+
+ LLRect dim_rect;
+ childGetRect("dimensions", dim_rect);
+
+ S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
+
// add space for dimensions and aspect ratio
- S32 info_height = 0;
- LLRect aspect_rect;
- childGetRect("combo_aspect_ratio", aspect_rect);
- S32 aspect_height = aspect_rect.getHeight();
- info_height += aspect_height + CLIENT_RECT_VPAD;
- view_height += info_height;
-
- S32 button_height = 0;
- if (mShowKeepDiscard || mCopyToInv) { //mCopyToInvBtn
+ S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
- // add space for buttons
- view_height += BTN_HEIGHT + CLIENT_RECT_VPAD;
- button_height = BTN_HEIGHT + PREVIEW_PAD;
- }
+ S32 screen_width = gFloaterView->getSnapRect().getWidth();
+ S32 screen_height = gFloaterView->getSnapRect().getHeight();
- view_width = llmax(view_width, getMinWidth());
- view_height = llmax(view_height, getMinHeight());
-
- if (view_height != mLastHeight || view_width != mLastWidth)
+ S32 max_image_width = screen_width - 2*horiz_pad;
+ S32 max_image_height = screen_height - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
+ - (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height);
+
+ S32 client_width = llmin(max_image_width,mImage->getFullWidth());
+ S32 client_height = llmin(max_image_height,mImage->getFullHeight());
+
+ if (mAspectRatio > 0.f)
{
- if (getHost())
+ if(mAspectRatio > 1.f)
{
- getHost()->growToFit(view_width, view_height);
- reshape( view_width, view_height );
- setOrigin( 0, getHost()->getRect().getHeight() - (view_height + PREVIEW_HEADER_SIZE) );
+ client_height = llceil((F32)client_width / mAspectRatio);
+ if(client_height > max_image_height)
+ {
+ client_height = max_image_height;
+ client_width = llceil((F32)client_height * mAspectRatio);
+ }
}
- else
+ else//mAspectRatio < 1.f
{
- S32 old_top = getRect().mTop;
- S32 old_left = getRect().mLeft;
- reshape( view_width, view_height );
- S32 new_bottom = old_top - getRect().getHeight();
- setOrigin( old_left, new_bottom );
- }
-
- // Try to keep whole view onscreen, don't allow partial offscreen.
- if (getHost())
- gFloaterView->adjustToFitScreen(getHost(), FALSE);
- else
- gFloaterView->adjustToFitScreen(this, FALSE);
-
- if (image_height > 1 && image_width > 1)
- {
- // Resize until we know the image's height
- mLastWidth = view_width;
- mLastHeight = view_height;
+ client_width = llceil((F32)client_height * mAspectRatio);
+ if(client_width > max_image_width)
+ {
+ client_width = max_image_width;
+ client_height = llceil((F32)client_width / mAspectRatio);
+ }
}
}
-
- if (!mUserResized)
- {
- // clamp texture size to fit within actual size of floater after attempting resize
- client_width = llmin(client_width, getRect().getWidth() - horiz_pad);
- client_height = llmin(client_height, getRect().getHeight() - PREVIEW_HEADER_SIZE
- - (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height);
-
-
- }
else
{
- client_width = getRect().getWidth() - horiz_pad;
- if (mAspectRatio > 0)
+
+ if(client_height > max_image_height)
{
- client_height = llround(client_width / mAspectRatio);
+ F32 ratio = (F32)max_image_height/client_height;
+ client_height = max_image_height;
+ client_width = llceil((F32)client_height * ratio);
}
- else
+
+ if(client_width > max_image_width)
{
- client_height = getRect().getHeight() - vert_pad;
+ F32 ratio = (F32)max_image_width/client_width;
+ client_width = max_image_width;
+ client_height = llceil((F32)client_width * ratio);
}
}
- S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height
- - CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE;
+ //now back to whole floater
+ S32 floater_width = llmax(getMinWidth(),client_width + 2*horiz_pad);
+ S32 floater_height = llmax(getMinHeight(),client_height + (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
+ + (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height));
- if (mAspectRatio > 0.f)
- {
- max_height = llmax(max_height, 1);
+ //reshape floater
+ reshape( floater_width, floater_height );
+ gFloaterView->adjustToFitScreen(this, FALSE);
- if (client_height > max_height)
- {
- client_height = max_height;
- client_width = llround(client_height * mAspectRatio);
- }
- }
- else
- {
- S32 max_width = getRect().getWidth() - horiz_pad;
+ //setup image rect...
+ LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
+ client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
+ client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
- client_height = llclamp(client_height, 1, max_height);
- client_width = llclamp(client_width, 1, max_width);
- }
-
- LLRect window_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
- window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
- window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD;
+ mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
- mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height);
-
// Hide the aspect ratio label if the window is too narrow
// Assumes the label should be to the right of the dimensions
- LLRect dim_rect, aspect_label_rect;
+ LLRect aspect_label_rect;
childGetRect("aspect_ratio", aspect_label_rect);
- childGetRect("dimensions", dim_rect);
childSetVisible("aspect_ratio", dim_rect.mRight < aspect_label_rect.mLeft);
}
@@ -552,10 +540,13 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata)
void LLPreviewTexture::loadAsset()
{
- mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
+ mImage->forceToSaveRawImage(0) ;
mAssetStatus = PREVIEW_ASSET_LOADING;
+ mUpdateDimensions = TRUE;
updateDimensions();
+ childSetEnabled("save_tex_btn", canSaveAs());
}
LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
@@ -566,3 +557,47 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
}
return mAssetStatus;
}
+
+void LLPreviewTexture::updateImageID()
+{
+ const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
+ if(item)
+ {
+ mImageID = item->getAssetUUID();
+
+ // here's the old logic...
+ //mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
+ // here's the new logic... 'cos we hate disappearing buttons.
+ mShowKeepDiscard = TRUE;
+
+ mCopyToInv = FALSE;
+ mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ }
+ else // not an item, assume it's an asset id
+ {
+ mImageID = mItemUUID;
+ mShowKeepDiscard = FALSE;
+ mCopyToInv = TRUE;
+ mIsCopyable = TRUE;
+ }
+
+}
+
+/* virtual */
+void LLPreviewTexture::setObjectID(const LLUUID& object_id)
+{
+ mObjectUUID = object_id;
+
+ const LLUUID old_image_id = mImageID;
+
+ // Update what image we're pointing to, such as if we just specified the mObjectID
+ // that this mItemID is part of.
+ updateImageID();
+
+ // If the imageID has changed, start over and reload the new image.
+ if (mImageID != old_image_id)
+ {
+ mAssetStatus = PREVIEW_ASSET_UNLOADED;
+ loadAsset();
+ }
+}
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index 520626b49f..7cd2adad56 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -58,7 +58,6 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual void onFocusReceived();
- static void saveToFile(void* userdata);
static void onFileLoadedForSave(
BOOL success,
LLViewerFetchedTexture *src_vi,
@@ -67,8 +66,11 @@ public:
S32 discard_level,
BOOL final,
void* userdata );
+ void openToSave();
+
+ static void onSaveAsBtn(void* data);
-
+ /*virtual*/ void setObjectID(const LLUUID& object_id);
protected:
void init();
/* virtual */ BOOL postBuild();
@@ -76,15 +78,19 @@ protected:
static void onAspectRatioCommit(LLUICtrl*,void* userdata);
private:
+ void updateImageID(); // set what image is being uploaded.
void updateDimensions();
- LLUUID mImageID;
+ LLUUID mImageID;
LLPointer<LLViewerFetchedTexture> mImage;
BOOL mLoadingFullImage;
std::string mSaveFileName;
LLFrameTimer mSavedFileTimer;
BOOL mShowKeepDiscard;
BOOL mCopyToInv;
-
+
+ // Save the image once it's loaded.
+ BOOL mPreviewToSave;
+
// This is stored off in a member variable, because the save-as
// button and drag and drop functionality need to know.
BOOL mIsCopyable;
@@ -94,6 +100,4 @@ private:
F32 mAspectRatio;
BOOL mUpdateDimensions;
};
-
-
#endif // LL_LLPREVIEWTEXTURE_H
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 5f6b210767..0476e785a5 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -72,10 +72,12 @@ const S32 ANIMATION_FRAMES = 1; //13;
LLProgressView::LLProgressView(const LLRect &rect)
: LLPanel(),
mPercentDone( 0.f ),
- mMouseDownInActiveArea( false )
+ mMouseDownInActiveArea( false ),
+ mUpdateEvents("LLProgressView")
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");
reshape(rect.getWidth(), rect.getHeight());
+ mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
}
BOOL LLProgressView::postBuild()
@@ -221,7 +223,10 @@ void LLProgressView::setCancelButtonVisible(BOOL b, const std::string& label)
// static
void LLProgressView::onCancelButtonClicked(void*)
{
- if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
+ // Quitting viewer here should happen only when "Quit" button is pressed while starting up.
+ // Check for startup state is used here instead of teleport state to avoid quitting when
+ // cancel is pressed while teleporting inside region (EXT-4911)
+ if (LLStartUp::getStartupState() < STATE_STARTED)
{
LLAppViewer::instance()->requestQuit();
}
@@ -260,3 +265,26 @@ void LLProgressView::onClickMessage(void* data)
}
}
}
+
+bool LLProgressView::handleUpdate(const LLSD& event_data)
+{
+ LLSD message = event_data.get("message");
+ LLSD desc = event_data.get("desc");
+ LLSD percent = event_data.get("percent");
+
+ if(message.isDefined())
+ {
+ setMessage(message.asString());
+ }
+
+ if(desc.isDefined())
+ {
+ setText(desc.asString());
+ }
+
+ if(percent.isDefined())
+ {
+ setPercent(percent.asReal());
+ }
+ return false;
+}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 865646c85d..6853674d88 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -35,6 +35,7 @@
#include "llpanel.h"
#include "llframetimer.h"
+#include "llevents.h"
class LLImageRaw;
class LLButton;
@@ -75,7 +76,12 @@ protected:
LLRect mOutlineRect;
bool mMouseDownInActiveArea;
+ // The LLEventStream mUpdateEvents depends upon this class being a singleton
+ // to avoid pump name conflicts.
static LLProgressView* sInstance;
+ LLEventStream mUpdateEvents;
+
+ bool handleUpdate(const LLSD& event_data);
};
#endif // LL_LLPROGRESSVIEW_H
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index b491c7e109..bd46b5b56a 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llrecentpeople.h"
+#include "llgroupmgr.h"
#include "llagent.h"
@@ -43,12 +44,18 @@ bool LLRecentPeople::add(const LLUUID& id)
if (id == gAgent.getID())
return false;
- LLDate date_added = LLDate::now();
+ bool is_not_group_id = LLGroupMgr::getInstance()->getGroupData(id) == NULL;
- //[] instead of insert to replace existing id->date with new date value
- mPeople[id] = date_added;
- mChangedSignal();
- return true;
+ if (is_not_group_id)
+ {
+ LLDate date_added = LLDate::now();
+
+ //[] instead of insert to replace existing id->date with new date value
+ mPeople[id] = date_added;
+ mChangedSignal();
+ }
+
+ return is_not_group_id;
}
bool LLRecentPeople::contains(const LLUUID& id) const
diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h
index 3a16e25ef6..c04f6b1858 100644
--- a/indra/newview/llremoteparcelrequest.h
+++ b/indra/newview/llremoteparcelrequest.h
@@ -38,6 +38,7 @@
#include "llhttpclient.h"
#include "llpanel.h"
+class LLMessageSystem;
class LLRemoteParcelInfoObserver;
class LLRemoteParcelRequestResponder : public LLHTTPClient::Responder
diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h
index 46b79150bb..b4b9042689 100644
--- a/indra/newview/llresourcedata.h
+++ b/indra/newview/llresourcedata.h
@@ -39,11 +39,12 @@
struct LLResourceData
{
LLAssetInfo mAssetInfo;
- LLAssetType::EType mPreferredLocation;
+ LLFolderType::EType mPreferredLocation;
LLInventoryType::EType mInventoryType;
U32 mNextOwnerPerm;
S32 mExpectedUploadCost;
void *mUserData;
+ static const S8 INVALID_LOCATION = -2;
};
#endif
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index 760b1a7a4c..38029e3a9d 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -35,6 +35,7 @@
#include "llview.h"
#include "lluictrlfactory.h"
+#include "lltooltip.h"
class LLRootViewRegistry : public LLChildRegistry<LLRootViewRegistry>
{};
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index e4dbcbd219..c75d90be6f 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -46,6 +46,8 @@
#include "lldockablefloater.h"
#include "llsyswellwindow.h"
#include "llimfloater.h"
+#include "llscriptfloater.h"
+#include "llfontgl.h"
#include <algorithm>
@@ -58,17 +60,14 @@ bool LLScreenChannel::mWasStartUpToastShown = false;
// LLScreenChannelBase
//////////////////////
LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
- mOverflowToastPanel(NULL)
- ,mToastAlignment(NA_BOTTOM)
+ mToastAlignment(NA_BOTTOM)
,mCanStoreToasts(true)
,mHiddenToastsNum(0)
- ,mOverflowToastHidden(false)
- ,mIsHovering(false)
+ ,mHoveredToast(NULL)
,mControlHovering(false)
,mShowToasts(true)
{
mID = id;
- mOverflowFormatString = LLTrans::getString("OverflowInfoChannelString");
mWorldViewRectConnection = gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLScreenChannelBase::updatePositionAndSize, this, _1, _2));
setMouseOpaque( false );
setVisible(FALSE);
@@ -77,6 +76,17 @@ LLScreenChannelBase::~LLScreenChannelBase()
{
mWorldViewRectConnection.disconnect();
}
+
+bool LLScreenChannelBase::isHovering()
+{
+ if (!mHoveredToast)
+ {
+ return false;
+ }
+
+ return mHoveredToast->isHovered();
+}
+
void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
{
S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;
@@ -103,8 +113,8 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne
void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
{
- S32 channel_top = gViewerWindow->getWorldViewRect().getHeight();
- S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
+ S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight();
+ S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
setVisible(TRUE);
}
@@ -114,7 +124,9 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
// LLScreenChannel
//////////////////////
//--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(LLUUID& id): LLScreenChannelBase(id)
+LLScreenChannel::LLScreenChannel(LLUUID& id):
+LLScreenChannelBase(id)
+,mStartUpToastPanel(NULL)
{
}
@@ -122,6 +134,8 @@ LLScreenChannel::LLScreenChannel(LLUUID& id): LLScreenChannelBase(id)
void LLScreenChannel::init(S32 channel_left, S32 channel_right)
{
LLScreenChannelBase::init(channel_left, channel_right);
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+ updatePositionAndSize(world_rect, world_rect);
}
//--------------------------------------------------------------------------
@@ -130,10 +144,54 @@ LLScreenChannel::~LLScreenChannel()
}
+std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
+{
+ std::list<LLToast*> res;
+
+ // collect stored toasts
+ for (std::vector<ToastElem>::iterator it = mStoredToastList.begin(); it
+ != mStoredToastList.end(); it++)
+ {
+ if (matcher.matches(it->toast->getNotification()))
+ {
+ res.push_back(it->toast);
+ }
+ }
+
+ // collect displayed toasts
+ for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
+ != mToastList.end(); it++)
+ {
+ if (matcher.matches(it->toast->getNotification()))
+ {
+ res.push_back(it->toast);
+ }
+ }
+
+ return res;
+}
+
//--------------------------------------------------------------------------
void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
{
- LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+ S32 right_delta = old_world_rect.mRight - new_world_rect.mRight;
+ LLRect this_rect = getRect();
+
+ switch(mChannelAlignment)
+ {
+ case CA_LEFT :
+ this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
+ break;
+ case CA_CENTRE :
+ LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+ return;
+ case CA_RIGHT :
+ this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
+ this_rect.mLeft -= right_delta;
+ this_rect.mRight -= right_delta;
+ }
+ setRect(this_rect);
+ redrawToasts();
}
//--------------------------------------------------------------------------
@@ -152,18 +210,24 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
ToastElem new_toast_elem(p);
- mOverflowToastHidden = false;
-
new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));
new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));
if(mControlHovering)
{
new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2));
+ new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopFadingToasts, this));
+ new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startFadingToasts, this));
}
if(show_toast)
{
mToastList.push_back(new_toast_elem);
+ if(p.can_be_stored)
+ {
+ // store toasts immediately - EXT-3762
+ storeToast(new_toast_elem);
+ }
+ updateShowToastsState();
redrawToasts();
}
else // store_toast
@@ -182,6 +246,13 @@ void LLScreenChannel::onToastDestroyed(LLToast* toast)
{
mToastList.erase(it);
}
+
+ it = find(mStoredToastList.begin(), mStoredToastList.end(), static_cast<LLPanel*>(toast));
+
+ if(it != mStoredToastList.end())
+ {
+ mStoredToastList.erase(it);
+ }
}
@@ -211,13 +282,21 @@ void LLScreenChannel::onToastFade(LLToast* toast)
//--------------------------------------------------------------------------
void LLScreenChannel::deleteToast(LLToast* toast)
{
+ if (toast->isDead())
+ {
+ return;
+ }
+
// send signal to observers about destroying of a toast
toast->mOnDeleteToastSignal(toast);
// update channel's Hovering state
// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard
- if(toast->hasFocus())
- setHovering(false);
+ if(mHoveredToast == toast)
+ {
+ mHoveredToast = NULL;
+ startFadingToasts();
+ }
// close the toast
toast->closeFloater();
@@ -232,7 +311,6 @@ void LLScreenChannel::storeToast(ToastElem& toast_elem)
if( it != mStoredToastList.end() )
return;
- toast_elem.toast->stopTimer();
mStoredToastList.push_back(toast_elem);
mOnStoreToast(toast_elem.toast->getPanel(), toast_elem.id);
}
@@ -244,8 +322,6 @@ void LLScreenChannel::loadStoredToastsToChannel()
if(mStoredToastList.size() == 0)
return;
-
- mOverflowToastHidden = false;
for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it)
{
@@ -266,13 +342,17 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)
if( it == mStoredToastList.end() )
return;
- mOverflowToastHidden = false;
-
LLToast* toast = (*it).toast;
+
+ if(toast->getVisible())
+ {
+ // toast is already in channel
+ return;
+ }
+
toast->setIsHidden(false);
toast->resetTimer();
mToastList.push_back((*it));
- mStoredToastList.erase(it);
redrawToasts();
}
@@ -332,6 +412,16 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)
}
}
+void LLScreenChannel::killMatchedToasts(const Matcher& matcher)
+{
+ std::list<LLToast*> to_delete = findToasts(matcher);
+ for (std::list<LLToast*>::iterator it = to_delete.begin(); it
+ != to_delete.end(); it++)
+ {
+ killToastByNotificationID((*it)-> getNotificationID());
+ }
+}
+
//--------------------------------------------------------------------------
void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
{
@@ -352,11 +442,9 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
//--------------------------------------------------------------------------
void LLScreenChannel::redrawToasts()
{
- if(mToastList.size() == 0 || mIsHovering)
+ if(mToastList.size() == 0 || isHovering())
return;
- hideToastsFromScreen();
-
switch(mToastAlignment)
{
case NA_TOP :
@@ -380,11 +468,14 @@ void LLScreenChannel::showToastsBottom()
S32 toast_margin = 0;
std::vector<ToastElem>::reverse_iterator it;
+ LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
+
for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
{
if(it != mToastList.rbegin())
{
- bottom = (*(it-1)).toast->getRect().mTop;
+ LLToast* toast = (*(it-1)).toast;
+ bottom = toast->getRect().mTop - toast->getTopPad();
toast_margin = gSavedSettings.getS32("ToastGap");
}
@@ -392,32 +483,75 @@ void LLScreenChannel::showToastsBottom()
toast_rect.setOriginAndSize(getRect().mLeft, bottom + toast_margin, toast_rect.getWidth() ,toast_rect.getHeight());
(*it).toast->setRect(toast_rect);
+ if(floater && floater->overlapsScreenChannel())
+ {
+ if(it == mToastList.rbegin())
+ {
+ // move first toast above docked floater
+ S32 shift = floater->getRect().getHeight();
+ if(floater->getDockControl())
+ {
+ shift += floater->getDockControl()->getTongueHeight();
+ }
+ (*it).toast->translate(0, shift);
+ }
+
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+ // don't show toasts if there is not enough space
+ if(toast_rect.mTop > world_rect.mTop)
+ {
+ break;
+ }
+ }
+
bool stop_showing_toasts = (*it).toast->getRect().mTop > getRect().mTop;
if(!stop_showing_toasts)
{
if( it != mToastList.rend()-1)
{
- stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastGap")) > getRect().mTop;
+ S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
+ stop_showing_toasts = toast_top > getRect().mTop;
}
}
+ // at least one toast should be visible
+ if(it == mToastList.rbegin())
+ {
+ stop_showing_toasts = false;
+ }
+
if(stop_showing_toasts)
break;
- (*it).toast->setVisible(TRUE);
+ if( !(*it).toast->getVisible() )
+ {
+ // HACK
+ // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+ (*it).toast->setVisible(TRUE);
+ }
+ if(!(*it).toast->hasFocus())
+ {
+ // Fixing Z-order of toasts (EXT-4862)
+ // Next toast will be positioned under this one.
+ gFloaterView->sendChildToBack((*it).toast);
+ }
}
- if(it != mToastList.rend() && !mOverflowToastHidden)
+ if(it != mToastList.rend())
{
mHiddenToastsNum = 0;
for(; it != mToastList.rend(); it++)
{
(*it).toast->stopTimer();
+ (*it).toast->setVisible(FALSE);
mHiddenToastsNum++;
}
- createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
- }
+ }
+ else
+ {
+ closeOverflowToastPanel();
+ }
}
//--------------------------------------------------------------------------
@@ -443,84 +577,10 @@ void LLScreenChannel::showToastsTop()
}
//--------------------------------------------------------------------------
-void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
-{
- LLRect toast_rect;
- LLToast::Params p;
- p.lifetime_secs = timer;
- mOverflowToastPanel = new LLToast(p);
-
- if(!mOverflowToastPanel)
- return;
-
- mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
-
- LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
- LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");
- std::string text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);
- if(mHiddenToastsNum == 1)
- {
- text += ".";
- }
- else
- {
- text += "s.";
- }
-
- toast_rect = mOverflowToastPanel->getRect();
- mOverflowToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
- toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
- mOverflowToastPanel->setRect(toast_rect);
-
- text_box->setValue(text);
- text_box->setVisible(TRUE);
- icon->setVisible(TRUE);
-
- mOverflowToastPanel->setVisible(TRUE);
-}
-
-//--------------------------------------------------------------------------
-void LLScreenChannel::onOverflowToastHide()
-{
- mOverflowToastHidden = true;
-
- // remove all hidden toasts from channel and save interactive notifications
- for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)
- {
- if(!(*it).toast->getVisible())
- {
- if((*it).toast->getCanBeStored())
- {
- storeToast((*it));
- }
- else
- {
- deleteToast((*it).toast);
- }
-
- it = mToastList.erase(it);
- }
- else
- {
- ++it;
- }
- }
-}
-
-//--------------------------------------------------------------------------
-void LLScreenChannel::closeOverflowToastPanel()
-{
- if(mOverflowToastPanel != NULL)
- {
- mOverflowToastPanel->closeFloater();
- mOverflowToastPanel = NULL;
- }
-}
-
-//--------------------------------------------------------------------------
void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
{
LLRect toast_rect;
+ LLRect tbox_rect;
LLToast::Params p;
p.lifetime_secs = timer;
p.enable_hide_btn = false;
@@ -532,36 +592,53 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));
LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
- LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");
- std::string mStartUpFormatString;
+ std::string text = LLTrans::getString("StartUpNotifications");
- if(notif_num == 1)
- {
- mStartUpFormatString = LLTrans::getString("StartUpNotification");
- }
- else
- {
- mStartUpFormatString = LLTrans::getString("StartUpNotifications");
- }
-
+ tbox_rect = text_box->getRect();
+ S32 tbox_width = tbox_rect.getWidth();
+ S32 tbox_vpad = text_box->getVPad();
+ S32 text_width = text_box->getDefaultFont()->getWidth(text);
+ S32 text_height = text_box->getTextPixelHeight();
+
+ // EXT - 3703 (Startup toast message doesn't fit toast width)
+ // Calculating TextBox HEIGHT needed to include the whole string according to the given WIDTH of the TextBox.
+ S32 new_tbox_height = (text_width/tbox_width + 1) * text_height;
+ // Calculating TOP position of TextBox
+ S32 new_tbox_top = new_tbox_height + tbox_vpad + gSavedSettings.getS32("ToastGap");
+ // Calculating toast HEIGHT according to the new TextBox size
+ S32 toast_height = new_tbox_height + tbox_vpad * 2;
- std::string text = llformat(mStartUpFormatString.c_str(), notif_num);
+ tbox_rect.setLeftTopAndSize(tbox_rect.mLeft, new_tbox_top, tbox_rect.getWidth(), new_tbox_height);
+ text_box->setRect(tbox_rect);
toast_rect = mStartUpToastPanel->getRect();
mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
- toast_rect.setLeftTopAndSize(0, toast_rect.getHeight()+gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
+ toast_rect.setLeftTopAndSize(0, toast_height + gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_height);
mStartUpToastPanel->setRect(toast_rect);
text_box->setValue(text);
text_box->setVisible(TRUE);
- icon->setVisible(TRUE);
-
addChild(mStartUpToastPanel);
mStartUpToastPanel->setVisible(TRUE);
}
+// static --------------------------------------------------------------------------
+F32 LLScreenChannel::getHeightRatio()
+{
+ F32 ratio = gSavedSettings.getF32("NotificationChannelHeightRatio");
+ if(0.0f > ratio)
+ {
+ ratio = 0.0f;
+ }
+ else if(1.0f < ratio)
+ {
+ ratio = 1.0f;
+ }
+ return ratio;
+}
+
//--------------------------------------------------------------------------
void LLScreenChannel::updateStartUpString(S32 num)
{
@@ -584,6 +661,37 @@ void LLScreenChannel::closeStartUpToast()
}
}
+void LLNotificationsUI::LLScreenChannel::stopFadingToasts()
+{
+ if (!mToastList.size()) return;
+
+ if (!mHoveredToast) return;
+
+ std::vector<ToastElem>::iterator it = mToastList.begin();
+ while (it != mToastList.end())
+ {
+ ToastElem& elem = *it;
+ elem.toast->stopFading();
+ ++it;
+ }
+}
+
+void LLNotificationsUI::LLScreenChannel::startFadingToasts()
+{
+ if (!mToastList.size()) return;
+
+ //because onMouseLeave is processed after onMouseEnter
+ if (isHovering()) return;
+
+ std::vector<ToastElem>::iterator it = mToastList.begin();
+ while (it != mToastList.end())
+ {
+ ToastElem& elem = *it;
+ elem.toast->startFading();
+ ++it;
+ }
+}
+
//--------------------------------------------------------------------------
void LLScreenChannel::hideToastsFromScreen()
{
@@ -593,6 +701,19 @@ void LLScreenChannel::hideToastsFromScreen()
}
//--------------------------------------------------------------------------
+void LLScreenChannel::hideToast(const LLUUID& notification_id)
+{
+ std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), notification_id);
+ if(mToastList.end() != it)
+ {
+ ToastElem te = *it;
+ te.toast->setVisible(FALSE);
+ te.toast->stopTimer();
+ mToastList.erase(it);
+ }
+}
+
+//--------------------------------------------------------------------------
void LLScreenChannel::removeToastsFromChannel()
{
hideToastsFromScreen();
@@ -650,42 +771,31 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)
//--------------------------------------------------------------------------
void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
{
- // because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave
- // we must check this to prevent incorrect setting for hovering in a channel
- std::map<LLToast*, bool>::iterator it_first, it_second;
- S32 stack_size = mToastEventStack.size();
- mIsHovering = mouse_enter;
-
- switch(stack_size)
+ // because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
+ // we must check hovering directly to prevent incorrect setting for hovering in a channel
+ if (mouse_enter)
{
- case 0:
- mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
- break;
- case 1:
- it_first = mToastEventStack.begin();
- if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
+ if (toast->isHovered())
{
- mToastEventStack.clear();
- mIsHovering = true;
+ mHoveredToast = toast;
}
- else
+ }
+ else if (mHoveredToast != NULL)
+ {
+ if (!mHoveredToast->isHovered())
{
- mToastEventStack.clear();
- mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
+ mHoveredToast = NULL;
}
- break;
- default:
- LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
}
- if(!mIsHovering)
+ if(!isHovering())
redrawToasts();
}
//--------------------------------------------------------------------------
void LLScreenChannel::updateShowToastsState()
{
- LLFloater* floater = LLDockableFloater::getInstanceHandle().get();
+ LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
if(!floater)
{
@@ -693,32 +803,24 @@ void LLScreenChannel::updateShowToastsState()
return;
}
- // for IM floaters showed in a docked state - prohibit showing of ani toast
- if(dynamic_cast<LLIMFloater*>(floater))
- {
- setShowToasts(!(floater->getVisible() && floater->isDocked()));
- if (!getShowToasts())
- {
- removeAndStoreAllStorableToasts();
- }
- }
+ S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
+ LLRect this_rect = getRect();
- // for Message Well floater showed in a docked state - adjust channel's height
- if(dynamic_cast<LLSysWellWindow*>(floater))
+ if(channel_bottom != this_rect.mBottom)
{
- S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
- LLRect this_rect = getRect();
- if(floater->getVisible() && floater->isDocked())
- {
- channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastGap"));
- }
-
- if(channel_bottom != this_rect.mBottom)
- {
- setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom));
- }
+ setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom));
}
}
//--------------------------------------------------------------------------
+LLToast* LLScreenChannel::getToastByNotificationID(LLUUID id)
+{
+ std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(),
+ mStoredToastList.end(), id);
+
+ if (it == mStoredToastList.end())
+ return NULL;
+
+ return it->toast;
+}
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 987bc4b596..88053d87d9 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -72,8 +72,7 @@ public:
virtual void setToastAlignment(EToastAlignment align) {mToastAlignment = align;}
virtual void setChannelAlignment(EChannelAlignment align) {mChannelAlignment = align;}
- virtual void setOverflowFormatString ( const std::string& str) { mOverflowFormatString = str; }
-
+
// kill or modify a toast by its ID
virtual void killToastByNotificationID(LLUUID id) {};
virtual void modifyToastNotificationByID(LLUUID id, LLSD data) {};
@@ -93,9 +92,10 @@ public:
// Channel's behavior-functions
// set whether a channel will control hovering inside itself or not
virtual void setControlHovering(bool control) { mControlHovering = control; }
- // set Hovering flag for a channel
- virtual void setHovering(bool hovering) { mIsHovering = hovering; }
+
+ bool isHovering();
+
void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
@@ -117,20 +117,16 @@ public:
protected:
// Channel's flags
bool mControlHovering;
- bool mIsHovering;
+ LLToast* mHoveredToast;
bool mCanStoreToasts;
bool mDisplayToastsAlways;
- bool mOverflowToastHidden;
// controls whether a channel shows toasts or not
bool mShowToasts;
//
EToastAlignment mToastAlignment;
EChannelAlignment mChannelAlignment;
- // attributes for the Overflow Toast
S32 mHiddenToastsNum;
- LLToast* mOverflowToastPanel;
- std::string mOverflowFormatString;
// channel's ID
LLUUID mID;
@@ -150,6 +146,16 @@ public:
LLScreenChannel(LLUUID& id);
virtual ~LLScreenChannel();
+ class Matcher
+ {
+ public:
+ Matcher(){}
+ virtual ~Matcher() {}
+ virtual bool matches(const LLNotificationPtr) const = 0;
+ };
+
+ std::list<LLToast*> findToasts(const Matcher& matcher);
+
// Channel's outfit-functions
// update channel's size and position in the World View
void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
@@ -161,9 +167,12 @@ public:
void addToast(const LLToast::Params& p);
// kill or modify a toast by its ID
void killToastByNotificationID(LLUUID id);
+ void killMatchedToasts(const Matcher& matcher);
void modifyToastByNotificationID(LLUUID id, LLPanel* panel);
// hide all toasts from screen, but not remove them from a channel
void hideToastsFromScreen();
+ // hide toast by notification id
+ void hideToast(const LLUUID& notification_id);
// removes all toasts from a channel
void removeToastsFromChannel();
// show all toasts in a channel
@@ -178,11 +187,16 @@ public:
void removeToastsBySessionID(LLUUID id);
// remove all storable toasts from screen and store them
void removeAndStoreAllStorableToasts();
- // close the Overflow Toast
- void closeOverflowToastPanel();
// close the StartUp Toast
void closeStartUpToast();
+
+ /** Stop fading all toasts */
+ virtual void stopFadingToasts();
+
+ /** Start fading all toasts */
+ virtual void startFadingToasts();
+
// get StartUp Toast's state
static bool getStartUpToastShown() { return mWasStartUpToastShown; }
// tell all channels that the StartUp toast was shown and allow them showing of toasts
@@ -195,6 +209,8 @@ public:
// update number of notifications in the StartUp Toast
void updateStartUpString(S32 num);
+ LLToast* getToastByNotificationID(LLUUID id);
+
// Channel's signals
// signal on storing of faded toasts event
typedef boost::function<void (LLPanel* info_panel, const LLUUID id)> store_tost_callback_t;
@@ -204,8 +220,7 @@ public:
// signal on rejecting of a toast event
typedef boost::function<void (LLUUID id)> reject_tost_callback_t;
typedef boost::signals2::signal<void (LLUUID id)> reject_tost_signal_t;
- reject_tost_signal_t mRejectToastSignal;
- boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }
+ reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }
private:
struct ToastElem
@@ -239,7 +254,6 @@ private:
void onToastHover(LLToast* toast, bool mouse_enter);
void onToastFade(LLToast* toast);
void onToastDestroyed(LLToast* toast);
- void onOverflowToastHide();
void onStartUpToastHide();
//
@@ -252,12 +266,14 @@ private:
void showToastsCentre();
void showToastsTop();
- // create the Overflow Toast
- void createOverflowToast(S32 bottom, F32 timer);
-
// create the StartUp Toast
void createStartUpToast(S32 notif_num, F32 timer);
+ /**
+ * Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).
+ */
+ static F32 getHeightRatio();
+
// Channel's flags
static bool mWasStartUpToastShown;
@@ -267,7 +283,6 @@ private:
std::vector<ToastElem> mToastList;
std::vector<ToastElem> mStoredToastList;
- std::map<LLToast*, bool> mToastEventStack;
};
}
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
new file mode 100644
index 0000000000..a88a242fbe
--- /dev/null
+++ b/indra/newview/llscriptfloater.cpp
@@ -0,0 +1,537 @@
+/**
+ * @file llscriptfloater.cpp
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llscriptfloater.h"
+
+#include "llbottomtray.h"
+#include "llchannelmanager.h"
+#include "llchiclet.h"
+#include "llfloaterreg.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llscreenchannel.h"
+#include "llsyswellwindow.h"
+#include "lltoastnotifypanel.h"
+#include "lltrans.h"
+#include "llviewerwindow.h"
+#include "llimfloater.h"
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLUUID notification_id_to_object_id(const LLUUID& notification_id)
+{
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(notification)
+ {
+ return notification->getPayload()["object_id"].asUUID();
+ }
+ return LLUUID::null;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptFloater::LLScriptFloater(const LLSD& key)
+: LLDockableFloater(NULL, true, key)
+, mScriptForm(NULL)
+, mSaveFloaterPosition(false)
+{
+ setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
+ setOverlapsScreenChannel(true);
+}
+
+bool LLScriptFloater::toggle(const LLUUID& notification_id)
+{
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
+
+ // show existing floater
+ if(floater)
+ {
+ if(floater->getVisible())
+ {
+ floater->setVisible(false);
+ return false;
+ }
+ else
+ {
+ floater->setVisible(TRUE);
+ floater->setFocus(FALSE);
+ }
+ }
+ // create and show new floater
+ else
+ {
+ show(notification_id);
+ }
+
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ return true;
+}
+
+LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
+{
+ LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
+ floater->setNotificationId(notification_id);
+ floater->createForm(notification_id);
+
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ floater->setAutoFocus(FALSE);
+
+ if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
+ {
+ floater->setSavePosition(true);
+ floater->restorePosition();
+ }
+ else
+ {
+ floater->dockToChiclet(true);
+ }
+
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, FALSE);
+
+ return floater;
+}
+
+void LLScriptFloater::setNotificationId(const LLUUID& id)
+{
+ mNotificationId = id;
+ // Lets save object id now while notification exists
+ mObjectId = notification_id_to_object_id(id);
+}
+
+void LLScriptFloater::getAllowedRect(LLRect& rect)
+{
+ rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLScriptFloater::createForm(const LLUUID& notification_id)
+{
+ // delete old form
+ if(mScriptForm)
+ {
+ removeChild(mScriptForm);
+ mScriptForm->die();
+ }
+
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(NULL == notification)
+ {
+ return;
+ }
+
+ // create new form
+ mScriptForm = new LLToastNotifyPanel(notification);
+ addChild(mScriptForm);
+
+ // position form on floater
+ mScriptForm->setOrigin(0, 0);
+
+ // make floater size fit form size
+ LLRect toast_rect = getRect();
+ LLRect panel_rect = mScriptForm->getRect();
+ toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
+ setShape(toast_rect);
+}
+
+void LLScriptFloater::onClose(bool app_quitting)
+{
+ savePosition();
+
+ if(getNotificationId().notNull())
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
+ }
+}
+
+void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
+{
+ LLDockableFloater::setDocked(docked, pop_on_undock);
+
+ savePosition();
+
+ hideToastsIfNeeded();
+}
+
+void LLScriptFloater::setVisible(BOOL visible)
+{
+ LLDockableFloater::setVisible(visible);
+
+ hideToastsIfNeeded();
+
+ if(!visible)
+ {
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ if(chiclet)
+ {
+ chiclet->setToggleState(false);
+ }
+ }
+}
+
+void LLScriptFloater::onMouseDown()
+{
+ if(getNotificationId().notNull())
+ {
+ // Remove new message icon
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+ }
+ else
+ {
+ chiclet->setShowNewMessagesIcon(false);
+ }
+ }
+}
+
+void LLScriptFloater::savePosition()
+{
+ if(getSavePosition() && mObjectId.notNull())
+ {
+ LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()};
+ LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi);
+ }
+}
+
+void LLScriptFloater::restorePosition()
+{
+ LLScriptFloaterManager::FloaterPositionInfo fpi;
+ if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi))
+ {
+ dockToChiclet(fpi.mDockState);
+ if(!fpi.mDockState)
+ {
+ // Un-docked floater is opened in 0,0, now move it to saved position
+ translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop);
+ }
+ }
+ else
+ {
+ dockToChiclet(true);
+ }
+}
+
+void LLScriptFloater::onFocusLost()
+{
+ if(getNotificationId().notNull())
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ }
+}
+
+void LLScriptFloater::onFocusReceived()
+{
+ // first focus will be received before setObjectId() call - don't toggle chiclet
+ if(getNotificationId().notNull())
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ }
+}
+
+void LLScriptFloater::dockToChiclet(bool dock)
+{
+ if (getDockControl() == NULL)
+ {
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
+
+ setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock);
+
+ // Restore saving
+ setSavePosition(save);
+ }
+}
+
+void LLScriptFloater::hideToastsIfNeeded()
+{
+ using namespace LLNotificationsUI;
+
+ // find channel
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+ LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+ // update notification channel state
+ if(channel)
+ {
+ channel->updateShowToastsState();
+ channel->redrawToasts();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
+{
+ if(notification_id.isNull())
+ {
+ llwarns << "Invalid notification ID" << llendl;
+ return;
+ }
+
+ // get scripted Object's ID
+ LLUUID object_id = notification_id_to_object_id(notification_id);
+
+ // Need to indicate of "new message" for object chiclets according to requirements
+ // specified in the Message Bar design specification. See EXT-3142.
+ bool set_new_message = false;
+ EObjectType obj_type = getObjectType(notification_id);
+
+ // LLDialog can spawn only one instance, LLLoadURL and LLGiveInventory can spawn unlimited number of instances
+ if(OBJ_SCRIPT == obj_type)
+ {
+ // If an Object spawns more-than-one floater, only the newest one is shown.
+ // The previous is automatically closed.
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(it != mNotifications.end())
+ {
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+ if(chiclet)
+ {
+ // Pass the new_message icon state further.
+ set_new_message = chiclet->getShowNewMessagesIcon();
+ }
+
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first);
+ if(floater)
+ {
+ // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
+ set_new_message |= !floater->hasFocus();
+ }
+
+ onRemoveNotification(it->first);
+ }
+ }
+
+ mNotifications.insert(std::make_pair(notification_id, object_id));
+
+ // Create inventory offer chiclet for offer type notifications
+ if( OBJ_GIVE_INVENTORY == obj_type )
+ {
+ LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
+ }
+
+ LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
+
+ LLSD data;
+ data["notification_id"] = notification_id;
+ data["new_message"] = set_new_message;
+ data["unread"] = 1; // each object has got only one floater
+ mNewObjectSignal(data);
+
+ toggleScriptFloater(notification_id, set_new_message);
+}
+
+void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
+{
+ if(notification_id.isNull())
+ {
+ llwarns << "Invalid notification ID" << llendl;
+ return;
+ }
+
+ // remove related chiclet
+ LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+
+ LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
+
+ // close floater
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
+ if(floater)
+ {
+ floater->savePosition();
+ floater->setNotificationId(LLUUID::null);
+ floater->closeFloater();
+ }
+
+ mNotifications.erase(notification_id);
+}
+
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message)
+{
+ LLSD data;
+ data["notification_id"] = notification_id;
+ data["new_message"] = set_new_message;
+ mToggleFloaterSignal(data);
+
+ // toggle floater
+ LLScriptFloater::toggle(notification_id);
+}
+
+LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.find(notification_id);
+ if(mNotifications.end() != it)
+ {
+ return it->second;
+ }
+ return LLUUID::null;
+}
+
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+{
+ if(object_id.notNull())
+ {
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(mNotifications.end() != it)
+ {
+ return it->first;
+ }
+ }
+ return LLUUID::null;
+}
+
+// static
+LLScriptFloaterManager::EObjectType LLScriptFloaterManager::getObjectType(const LLUUID& notification_id)
+{
+ if(notification_id.isNull())
+ {
+ llwarns << "Invalid notification ID" << llendl;
+ return OBJ_UNKNOWN;
+ }
+
+ static const object_type_map TYPE_MAP = initObjectTypeMap();
+
+ LLNotificationPtr notification = LLNotificationsUtil::find(notification_id);
+ object_type_map::const_iterator it = TYPE_MAP.find(notification->getName());
+ if(it != TYPE_MAP.end())
+ {
+ return it->second;
+ }
+
+ llwarns << "Unknown object type" << llendl;
+ return OBJ_UNKNOWN;
+}
+
+// static
+std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
+{
+ using namespace LLNotificationsUI;
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return LLStringUtil::null;
+ }
+
+ std::string text;
+
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
+ {
+ case LLScriptFloaterManager::OBJ_SCRIPT:
+ text = notification->getSubstitutions()["TITLE"].asString();
+ break;
+ case LLScriptFloaterManager::OBJ_LOAD_URL:
+ text = notification->getSubstitutions()["OBJECTNAME"].asString();
+ break;
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
+ text = notification->getSubstitutions()["NAME"].asString();
+ break;
+ default:
+ text = LLTrans::getString("object");
+ break;
+ }
+
+ return text;
+}
+
+//static
+LLScriptFloaterManager::object_type_map LLScriptFloaterManager::initObjectTypeMap()
+{
+ object_type_map type_map;
+ type_map["ScriptDialog"] = OBJ_SCRIPT;
+ type_map["ScriptDialogGroup"] = OBJ_SCRIPT;
+ type_map["LoadWebPage"] = OBJ_LOAD_URL;
+ type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+ return type_map;
+}
+
+LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloaterManager::findUsingObjectId(const LLUUID& object_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.begin();
+ for(; mNotifications.end() != it; ++it)
+ {
+ if(object_id == it->second)
+ {
+ return it;
+ }
+ }
+ return mNotifications.end();
+}
+
+void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi)
+{
+ if(object_id.notNull())
+ {
+ LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi;
+ }
+ else
+ {
+ llwarns << "Invalid object id" << llendl;
+ }
+}
+
+bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi)
+{
+ floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id);
+ if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it)
+ {
+ fpi = it->second;
+ return true;
+ }
+ return false;
+}
+
+// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
new file mode 100644
index 0000000000..ec3ec4b540
--- /dev/null
+++ b/indra/newview/llscriptfloater.h
@@ -0,0 +1,211 @@
+/**
+ * @file llscriptfloater.h
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCRIPTFLOATER_H
+#define LL_SCRIPTFLOATER_H
+
+#include "lltransientdockablefloater.h"
+
+class LLToastNotifyPanel;
+
+/**
+ * Handles script notifications ("ScriptDialog" and "ScriptDialogGroup")
+ * and manages Script Floaters.
+ */
+class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
+{
+ // *TODO
+ // LLScriptFloaterManager and LLScriptFloater will need some refactoring after we
+ // know how script notifications should look like.
+public:
+
+ typedef enum e_object_type
+ {
+ OBJ_SCRIPT,
+ OBJ_GIVE_INVENTORY,
+ OBJ_LOAD_URL,
+
+ OBJ_UNKNOWN
+ }EObjectType;
+
+ /**
+ * Handles new notifications.
+ * Saves notification and object ids, removes old notification if needed, creates script chiclet
+ * Note that one object can spawn one script floater.
+ */
+ void onAddNotification(const LLUUID& notification_id);
+
+ /**
+ * Handles notification removal.
+ * Removes script notification toast, removes script chiclet, closes script floater
+ */
+ void onRemoveNotification(const LLUUID& notification_id);
+
+ /**
+ * Toggles script floater.
+ * Removes "new message" icon from chiclet and removes notification toast.
+ */
+ void toggleScriptFloater(const LLUUID& object_id, bool set_new_message = false);
+
+ LLUUID findObjectId(const LLUUID& notification_id);
+
+ LLUUID findNotificationId(const LLUUID& object_id);
+
+ static EObjectType getObjectType(const LLUUID& notification_id);
+
+ static std::string getObjectName(const LLUUID& notification_id);
+
+ typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
+
+ boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
+ boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
+
+ struct FloaterPositionInfo
+ {
+ LLRect mRect;
+ bool mDockState;
+ };
+
+ void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi);
+
+ bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi);
+
+protected:
+
+ typedef std::map<std::string, EObjectType> object_type_map;
+
+ static object_type_map initObjectTypeMap();
+
+ // <notification_id, object_id>
+ typedef std::map<LLUUID, LLUUID> script_notification_map_t;
+
+ script_notification_map_t::const_iterator findUsingObjectId(const LLUUID& object_id);
+
+private:
+
+ script_notification_map_t mNotifications;
+
+ object_signal_t mNewObjectSignal;
+ object_signal_t mToggleFloaterSignal;
+
+ // <object_id, floater position>
+ typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
+
+ floater_position_map_t mFloaterPositions;
+};
+
+/**
+ * Floater script forms.
+ * LLScriptFloater will create script form based on notification data and
+ * will auto fit the form.
+ */
+class LLScriptFloater : public LLDockableFloater
+{
+public:
+
+ /**
+ * key - UUID of scripted Object
+ */
+ LLScriptFloater(const LLSD& key);
+
+ virtual ~LLScriptFloater(){};
+
+ /**
+ * Toggle existing floater or create and show a new one.
+ */
+ static bool toggle(const LLUUID& object_id);
+
+ /**
+ * Creates and shows floater
+ */
+ static LLScriptFloater* show(const LLUUID& object_id);
+
+ const LLUUID& getNotificationId() { return mNotificationId; }
+
+ void setNotificationId(const LLUUID& id);
+
+ /**
+ * Close notification if script floater is closed.
+ */
+ /*virtual*/ void onClose(bool app_quitting);
+
+ /**
+ * Hide all notification toasts when we show dockable floater
+ */
+ /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+
+ /**
+ * Hide all notification toasts when we show dockable floater
+ */
+ /*virtual*/ void setVisible(BOOL visible);
+
+ bool getSavePosition() { return mSaveFloaterPosition; }
+
+ void setSavePosition(bool save) { mSaveFloaterPosition = save; }
+
+ void savePosition();
+
+ void restorePosition();
+
+protected:
+
+ /**
+ * Creates script form, will delete old form if floater is shown for same object.
+ */
+ void createForm(const LLUUID& object_id);
+
+ /*virtual*/ void getAllowedRect(LLRect& rect);
+
+ /**
+ * Hide all notification toasts.
+ */
+ static void hideToastsIfNeeded();
+
+ /**
+ * Removes chiclets new messages icon
+ */
+ void onMouseDown();
+
+ /*virtual*/ void onFocusLost();
+
+ /*virtual*/ void onFocusReceived();
+
+ void dockToChiclet(bool dock);
+
+private:
+ LLToastNotifyPanel* mScriptForm;
+ LLUUID mNotificationId;
+ LLUUID mObjectId;
+ bool mSaveFloaterPosition;
+};
+
+#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 0a520ff65f..32a915608e 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
F32 min_weight = param->getMinWeight();
F32 max_weight = param->getMaxWeight();
- mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight);
+ mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), min_weight);
pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER;
- mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight );
+ mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), max_weight );
mHintMin->setAllowsUpdates( FALSE );
mHintMax->setAllowsUpdates( FALSE );
@@ -86,9 +86,8 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
childSetEnabled("param slider", mAllowModify);
childSetCommitCallback("param slider", LLScrollingPanelParam::onSliderMoved, this);
- // *TODO: Translate
- std::string min_name = param->getMinDisplayName();
- std::string max_name = param->getMaxDisplayName();
+ std::string min_name = LLTrans::getString(param->getMinDisplayName());
+ std::string max_name = LLTrans::getString(param->getMaxDisplayName());
childSetValue("min param text", min_name);
childSetValue("max param text", max_name);
@@ -209,7 +208,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
if (current_weight != new_weight )
{
- self->mWearable->setVisualParamWeight( param->getID(), new_weight, TRUE );
+ self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE );
gAgent.getAvatarObject()->updateVisualParams();
}
}
@@ -298,7 +297,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )
if (slider->getMinValue() < new_percent
&& new_percent < slider->getMaxValue())
{
- mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, TRUE);
+ mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE);
gAgent.getAvatarObject()->updateVisualParams();
slider->setValue( weightToPercent( new_weight ) );
@@ -330,7 +329,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata )
if (slider->getMinValue() < new_percent
&& new_percent < slider->getMaxValue())
{
- self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+ self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE);
slider->setValue( self->weightToPercent( new_weight ) );
}
}
@@ -364,7 +363,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )
if (slider->getMinValue() < new_percent
&& new_percent < slider->getMaxValue())
{
- self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+ self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE);
slider->setValue( self->weightToPercent( new_weight ) );
}
}
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index f95671685b..a130878176 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -78,11 +78,12 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);
mTextEntry->addChild(mSearchButton);
+ mTextEntry->setPassDelete(TRUE);
setButtonVisible(p.dropdown_button_visible);
mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
mTextEntry->setKeystrokeCallback(boost::bind(&LLComboBox::onTextEntry, this, _1), NULL);
- setSelectionCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
+ setCommitCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
setPrearrangeCallback(boost::bind(&LLSearchComboBox::onSearchPrearrange, this, _2));
mSearchButton->setCommitCallback(boost::bind(&LLSearchComboBox::onTextCommit, this, _2));
}
diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h
index 253ef21e9e..eb6efdb86f 100644
--- a/indra/newview/llsearchhistory.h
+++ b/indra/newview/llsearchhistory.h
@@ -34,12 +34,15 @@
#define LL_LLSEARCHHISTORY_H
#include "llsingleton.h"
+#include "llui.h"
+
/**
* Search history container able to save and load history from file.
* History is stored in chronological order, most recent at the beginning.
*/
-class LLSearchHistory : public LLSingleton<LLSearchHistory>
+class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyClass<LLSearchHistory>
{
+ friend class LLDestroyClass<LLSearchHistory>;
public:
// Forward declaration
@@ -130,6 +133,12 @@ protected:
private:
+ // Implementation of LLDestroyClass<LLSearchHistory>
+ static void destroyClass()
+ {
+ LLSearchHistory::getInstance()->save();
+ }
+
search_history_list_t mSearchHistory;
};
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d68897b64f..9540894646 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
// file include
+#define LLSELECTMGR_CPP
#include "llselectmgr.h"
// library includes
@@ -40,7 +41,9 @@
#include "lldbstrings.h"
#include "lleconomy.h"
#include "llgl.h"
+#include "llmediaentry.h"
#include "llrender.h"
+#include "llnotifications.h"
#include "llpermissions.h"
#include "llpermissionsflags.h"
#include "lltrans.h"
@@ -67,6 +70,7 @@
#include "llinventorymodel.h"
#include "llmenugl.h"
#include "llmutelist.h"
+#include "llsidepaneltaskinfo.h"
#include "llslurl.h"
#include "llstatusbar.h"
#include "llsurface.h"
@@ -101,6 +105,7 @@ const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f;
const S32 MAX_ACTION_QUEUE_SIZE = 20;
const S32 MAX_SILS_PER_FRAME = 50;
const S32 MAX_OBJECTS_PER_PACKET = 254;
+const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF;
//
// Globals
@@ -173,6 +178,8 @@ LLObjectSelection *get_null_object_selection()
return sNullSelection;
}
+// Build time optimization, generate this function once here
+template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
//-----------------------------------------------------------------------------
// LLSelectMgr()
@@ -212,7 +219,8 @@ LLSelectMgr::LLSelectMgr()
mHoverObjects = new LLObjectSelection();
mHighlightedObjects = new LLObjectSelection();
-
+ mForceSelection = FALSE;
+ mShowSelection = FALSE;
}
@@ -801,6 +809,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32
return NULL;
}
+ mHoverObjects->mPrimaryObject = objectp;
+
objectp = objectp->getRootEdit();
// is the requested object the same as the existing hover object root?
@@ -834,6 +844,11 @@ LLSelectNode *LLSelectMgr::getHoverNode()
return mHoverObjects->getFirstRootNode();
}
+LLSelectNode *LLSelectMgr::getPrimaryHoverNode()
+{
+ return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject];
+}
+
void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
{
if (!objectp)
@@ -1441,7 +1456,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
// Texture picker defaults aren't inventory items
// * Don't need to worry about permissions for them
// * Can just apply the texture and be done with it.
- objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+ objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
}
return true;
}
@@ -1597,7 +1612,7 @@ BOOL LLSelectMgr::selectionRevertTextures()
}
else
{
- object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+ object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
}
}
}
@@ -1725,70 +1740,70 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright)
getSelection()->applyToObjects(&sendfunc);
}
-void LLSelectMgr::selectionSetMedia(U8 media_type)
-{
-
- struct f : public LLSelectedTEFunctor
- {
- U8 mMediaFlags;
- f(const U8& t) : mMediaFlags(t) {}
- bool apply(LLViewerObject* object, S32 te)
- {
- if (object->permModify())
- {
- // update viewer has media
- object->setTEMediaFlags(te, mMediaFlags);
- }
- return true;
- }
- } setfunc(media_type);
- getSelection()->applyToTEs(&setfunc);
- struct f2 : public LLSelectedObjectFunctor
- {
- virtual bool apply(LLViewerObject* object)
- {
- if (object->permModify())
- {
- object->sendTEUpdate();
- }
- return true;
- }
- } func2;
- mSelectedObjects->applyToObjects( &func2 );
-}
-
// This function expects media_data to be a map containing relevant
// media data name/value pairs (e.g. home_url, etc.)
-void LLSelectMgr::selectionSetMediaData(const LLSD &media_data)
-{
-
+void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data)
+{
struct f : public LLSelectedTEFunctor
{
+ U8 mMediaFlags;
const LLSD &mMediaData;
- f(const LLSD& t) : mMediaData(t) {}
+ f(const U8& t, const LLSD& d) : mMediaFlags(t), mMediaData(d) {}
bool apply(LLViewerObject* object, S32 te)
{
if (object->permModify())
{
- LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
- if (NULL != vo)
- {
- vo->syncMediaData(te, mMediaData, true/*merge*/, true/*ignore_agent*/);
- }
+ // If we are adding media, then check the current state of the
+ // media data on this face.
+ // - If it does not have media, AND we are NOT setting the HOME URL, then do NOT add media to this
+ // face.
+ // - If it does not have media, and we ARE setting the HOME URL, add media to this face.
+ // - If it does already have media, add/update media to/on this face
+ // If we are removing media, just do it (ignore the passed-in LLSD).
+ if (mMediaFlags & LLTextureEntry::MF_HAS_MEDIA)
+ {
+ llassert(mMediaData.isMap());
+ const LLTextureEntry *texture_entry = object->getTE(te);
+ if (!mMediaData.isMap() ||
+ (NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY))
+ {
+ // skip adding/updating media
+ }
+ else {
+ // Add/update media
+ object->setTEMediaFlags(te, mMediaFlags);
+ LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
+ llassert(NULL != vo);
+ if (NULL != vo)
+ {
+ vo->syncMediaData(te, mMediaData, true/*merge*/, true/*ignore_agent*/);
+ }
+ }
+ }
+ else
+ {
+ // delete media (or just set the flags)
+ object->setTEMediaFlags(te, mMediaFlags);
+ }
}
return true;
}
- } setfunc(media_data);
+ } setfunc(media_type, media_data);
getSelection()->applyToTEs(&setfunc);
-
+
struct f2 : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
if (object->permModify())
{
- LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
- if (NULL != vo)
+ object->sendTEUpdate();
+ LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
+ llassert(NULL != vo);
+ // It's okay to skip this object if hasMedia() is false...
+ // the sendTEUpdate() above would remove all media data if it were
+ // there.
+ if (NULL != vo && vo->hasMedia())
{
// Send updated media data FOR THE ENTIRE OBJECT
vo->sendMediaDataUpdate();
@@ -1797,11 +1812,9 @@ void LLSelectMgr::selectionSetMediaData(const LLSD &media_data)
return true;
}
} func2;
- getSelection()->applyToObjects(&func2);
+ mSelectedObjects->applyToObjects( &func2 );
}
-
-
void LLSelectMgr::selectionSetGlow(F32 glow)
{
struct f1 : public LLSelectedTEFunctor
@@ -2264,6 +2277,26 @@ BOOL LLSelectMgr::selectGetAllValid()
return TRUE;
}
+//-----------------------------------------------------------------------------
+// selectGetAllValidAndObjectsFound() - return TRUE if selections are
+// valid and objects are found.
+//
+// For EXT-3114 - same as selectGetModify() without the modify check.
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetAllValidAndObjectsFound()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
//-----------------------------------------------------------------------------
// selectGetModify() - return TRUE if current agent can modify all
@@ -2820,7 +2853,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,
case 0:
{
// TODO: Make sure you have delete permissions on all of them.
- LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
// attempt to derez into the trash.
LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);
LLSelectMgr::getInstance()->sendListToRegions("DeRezObject",
@@ -3399,7 +3432,7 @@ void LLSelectMgr::deselectAll()
{
return;
}
-
+
// Zap the angular velocity, as the sim will set it to zero
for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
iter != mSelectedObjects->end(); iter++ )
@@ -3481,7 +3514,7 @@ void LLSelectMgr::deselectAllIfTooFar()
// HACK: Don't deselect when we're navigating to rate an object's
// owner or creator. JC
- if (gPieObject->getVisible() || gPieRate->getVisible() )
+ if (gMenuObject->getVisible())
{
return;
}
@@ -3489,6 +3522,7 @@ void LLSelectMgr::deselectAllIfTooFar()
LLVector3d selectionCenter = getSelectionCenterGlobal();
if (gSavedSettings.getBOOL("LimitSelectDistance")
&& (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar())
+ && (mSelectedObjects->getPrimaryObject() != LLViewerMediaFocus::getInstance()->getFocusedObject())
&& !mSelectedObjects->isAttachment()
&& !selectionCenter.isExactlyZero())
{
@@ -4597,7 +4631,7 @@ void LLSelectMgr::updateSilhouettes()
if (!mSilhouetteImagep)
{
- mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, TRUE);
+ mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI);
}
mHighlightedObjects->cleanupNodes();
@@ -4899,12 +4933,21 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
if (mSelectedObjects->getNumNodes())
{
- LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
LLUUID inspect_item_id= LLUUID::null;
+#if 0
+ LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance)
{
inspect_item_id = inspect_instance->getSelectedUUID();
}
+#endif
+ LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
+ if (panel_task_info)
+ {
+ inspect_item_id = panel_task_info->getSelectedUUID();
+ }
+
+ LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID();
for (S32 pass = 0; pass < 2; pass++)
{
for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
@@ -4918,7 +4961,11 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
{
continue;
}
- if(objectp->getID() == inspect_item_id)
+ if (objectp->getID() == focus_item_id)
+ {
+ node->renderOneSilhouette(gFocusMgr.getFocusColor());
+ }
+ else if(objectp->getID() == inspect_item_id)
{
node->renderOneSilhouette(sHighlightInspectColor);
}
@@ -4972,19 +5019,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
}
-#if 0
- // Hilight focused media object
- {
- LLViewerObject* objectp = LLViewerMediaFocus::getInstance()->getFocusedObject();
- if(objectp)
- {
- // FIXME: how do I construct a silhouette for an object that's not selected?
- // Would we need to add another LLObjectSelectionHandle for this purpose?
- node->renderOneSilhouette(gFocusMgr.getFocusColor());
- }
- }
-#endif
-
if (for_hud && avatar)
{
glMatrixMode(GL_PROJECTION);
@@ -5059,6 +5093,7 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
mName = nodep.mName;
mDescription = nodep.mDescription;
mCategory = nodep.mCategory;
+ mInventorySerial = 0;
mSavedPositionLocal = nodep.mSavedPositionLocal;
mSavedPositionGlobal = nodep.mSavedPositionGlobal;
mSavedScale = nodep.mSavedScale;
@@ -5097,7 +5132,7 @@ LLSelectNode::~LLSelectNode()
void LLSelectNode::selectAllTEs(BOOL b)
{
- mTESelectMask = b ? 0xFFFFFFFF : 0x0;
+ mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0;
mLastTESelected = 0;
}
@@ -5479,20 +5514,31 @@ void dialog_refresh_all()
gFloaterTools->dirty();
- gPieObject->needsArrange();
+ gMenuObject->needsArrange();
- if( gPieAttachment->getVisible() )
+ if( gMenuAttachmentSelf->getVisible() )
+ {
+ gMenuAttachmentSelf->arrange();
+ }
+ if( gMenuAttachmentOther->getVisible() )
{
- gPieAttachment->arrange();
+ gMenuAttachmentOther->arrange();
}
LLFloaterProperties::dirtyAll();
-
+
+#if 0
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance)
{
inspect_instance->dirty();
}
+#endif
+ LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
+ if (panel_task_info)
+ {
+ panel_task_info->dirty();
+ }
}
S32 get_family_count(LLViewerObject *parent)
@@ -5733,8 +5779,22 @@ void LLSelectMgr::redo()
//-----------------------------------------------------------------------------
BOOL LLSelectMgr::canDoDelete() const
{
+ bool can_delete = false;
+ // This function is "logically const" - it does not change state in
+ // a way visible outside the selection manager.
+ LLSelectMgr* self = const_cast<LLSelectMgr*>(this);
+ LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject();
// Note: Can only delete root objects (see getFirstDeleteableObject() for more info)
- return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstDeleteableObject() != NULL; // HACK: casting away constness - MG
+ if (obj!= NULL)
+ {
+ // all the faces needs to be selected
+ if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES ))
+ {
+ can_delete = true;
+ }
+ }
+
+ return can_delete;
}
//-----------------------------------------------------------------------------
@@ -6169,8 +6229,14 @@ BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
LLSelectNode* nodep = *iter;
if (nodep->getObject() == object)
{
+ // Optimization
+ if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL)
+ {
+ return TRUE;
+ }
+
BOOL all_selected = TRUE;
- for (S32 i = 0; i < SELECT_MAX_TES; i++)
+ for (S32 i = 0; i < object->getNumTEs(); i++)
{
all_selected = all_selected && nodep->isTESelected(i);
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 6e757ef976..00474827ca 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -323,6 +323,11 @@ private:
typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
+// Build time optimization, generate this once in .cpp file
+#ifndef LLSELECTMGR_CPP
+extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
+#endif
+
class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
{
public:
@@ -404,6 +409,7 @@ public:
LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
LLSelectNode *getHoverNode();
+ LLSelectNode *getPrimaryHoverNode();
void highlightObjectOnly(LLViewerObject *objectp);
void highlightObjectAndFamily(LLViewerObject *objectp);
@@ -496,8 +502,7 @@ public:
void selectionSetTexGen( U8 texgen );
void selectionSetShiny( U8 shiny );
void selectionSetFullbright( U8 fullbright );
- void selectionSetMedia( U8 media_type );
- void selectionSetMediaData(const LLSD &media_data); // NOTE: modifies media_data!!!
+ void selectionSetMedia( U8 media_type, const LLSD &media_data );
void selectionSetClickAction(U8 action);
void selectionSetIncludeInSearch(bool include_in_search);
void selectionSetGlow(const F32 glow);
@@ -529,6 +534,7 @@ public:
// Returns TRUE if the viewer has information on all selected objects
BOOL selectGetAllRootsValid();
BOOL selectGetAllValid();
+ BOOL selectGetAllValidAndObjectsFound();
// returns TRUE if you can modify all selected objects.
BOOL selectGetRootsModify();
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
new file mode 100644
index 0000000000..cd4a821774
--- /dev/null
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -0,0 +1,405 @@
+/**
+ * @file llsidepanelappearance.cpp
+ * @brief Side Bar "Appearance" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelappearance.h"
+
+#include "llaccordionctrltab.h"
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventorypanel.h"
+#include "llfiltereditor.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llfoldervieweventlistener.h"
+#include "llpaneleditwearable.h"
+#include "llpaneloutfitsinventory.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+#include "llviewerregion.h"
+#include "llvoavatarself.h"
+#include "llwearable.h"
+
+static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance");
+
+class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver
+{
+public:
+ LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) :
+ mPanel(panel)
+ {}
+ ~LLCurrentlyWornFetchObserver() {}
+ virtual void done()
+ {
+ mPanel->inventoryFetched();
+ gInventory.removeObserver(this);
+ delete this;
+ }
+private:
+ LLSidepanelAppearance *mPanel;
+};
+
+class LLWatchForOutfitRenameObserver : public LLInventoryObserver
+{
+public:
+ LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) :
+ mPanel(panel)
+ {}
+ virtual void changed(U32 mask);
+
+private:
+ LLSidepanelAppearance *mPanel;
+};
+
+void LLWatchForOutfitRenameObserver::changed(U32 mask)
+{
+ if (mask & LABEL)
+ {
+ mPanel->refreshCurrentOutfitName();
+ }
+}
+
+LLSidepanelAppearance::LLSidepanelAppearance() :
+ LLPanel(),
+ mFilterSubString(LLStringUtil::null),
+ mFilterEditor(NULL),
+ mLookInfo(NULL),
+ mCurrOutfitPanel(NULL)
+{
+}
+
+LLSidepanelAppearance::~LLSidepanelAppearance()
+{
+ gInventory.removeObserver(mOutfitRenameWatcher);
+ delete mOutfitRenameWatcher;
+}
+
+// virtual
+BOOL LLSidepanelAppearance::postBuild()
+{
+ mOpenOutfitBtn = getChild<LLButton>("openoutfit_btn");
+ mOpenOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onOpenOutfitButtonClicked, this));
+
+ mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
+ mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
+
+ mEditBtn = getChild<LLButton>("edit_btn");
+ mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
+
+ mNewOutfitBtn = getChild<LLButton>("newlook_btn");
+ mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
+ mNewOutfitBtn->setEnabled(false);
+
+ mFilterEditor = getChild<LLFilterEditor>("Filter");
+ if (mFilterEditor)
+ {
+ mFilterEditor->setCommitCallback(boost::bind(&LLSidepanelAppearance::onFilterEdit, this, _2));
+ }
+
+ mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
+ mPanelOutfitsInventory->setParent(this);
+
+ mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
+ if (mLookInfo)
+ {
+ LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn");
+ if (back_btn)
+ {
+ back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
+ }
+
+ }
+
+ mEditWearable = dynamic_cast<LLPanelEditWearable*>(getChild<LLPanel>("panel_edit_wearable"));
+ if (mEditWearable)
+ {
+ LLButton* edit_wearable_back_btn = mEditWearable->getChild<LLButton>("back_btn");
+ if (edit_wearable_back_btn)
+ {
+ edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditWearBackClicked, this));
+ }
+ }
+
+ mCurrentLookName = getChild<LLTextBox>("currentlook_name");
+
+ mOutfitDirtyTag = getChild<LLTextBox>("currentlook_title");
+
+ mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
+
+ mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
+ gInventory.addObserver(mOutfitRenameWatcher);
+
+ return TRUE;
+}
+
+// virtual
+void LLSidepanelAppearance::onOpen(const LLSD& key)
+{
+ fetchInventory();
+ refreshCurrentOutfitName();
+ updateVerbs();
+
+ if (mPanelOutfitsInventory)
+ {
+ mPanelOutfitsInventory->onOpen(key);
+ }
+
+ if(key.size() == 0)
+ return;
+
+ toggleLookInfoPanel(TRUE);
+ updateVerbs();
+
+ mLookInfoType = key["type"].asString();
+
+ if (mLookInfoType == "look")
+ {
+ LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
+ if (pLook)
+ mLookInfo->displayLookInfo(pLook);
+ }
+}
+
+void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
+{
+ if (mFilterSubString != search_string)
+ {
+ mFilterSubString = search_string;
+
+ // Searches are case-insensitive
+ LLStringUtil::toUpper(mFilterSubString);
+ LLStringUtil::trimHead(mFilterSubString);
+
+ mPanelOutfitsInventory->onSearchEdit(mFilterSubString);
+ }
+}
+
+void LLSidepanelAppearance::onOpenOutfitButtonClicked()
+{
+ const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();
+ if (!outfit_link)
+ return;
+ if (!outfit_link->getIsLinkType())
+ return;
+
+ LLAccordionCtrlTab* tab_outfits = mPanelOutfitsInventory->findChild<LLAccordionCtrlTab>("tab_outfits");
+ if (tab_outfits)
+ {
+ tab_outfits->changeOpenClose(FALSE);
+ LLInventoryPanel *inventory_panel = tab_outfits->findChild<LLInventoryPanel>("outfitslist_tab");
+ if (inventory_panel)
+ {
+ LLFolderView *folder = inventory_panel->getRootFolder();
+ LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID());
+ if (outfit_folder)
+ {
+ outfit_folder->setOpen(!outfit_folder->isOpen());
+ folder->setSelectionFromRoot(outfit_folder,TRUE);
+ folder->scrollToShowSelection();
+ }
+ }
+ }
+}
+
+void LLSidepanelAppearance::onEditAppearanceButtonClicked()
+{
+ if (gAgentWearables.areWearablesLoaded())
+ {
+ gAgent.changeCameraToCustomizeAvatar();
+ }
+}
+
+void LLSidepanelAppearance::onEditButtonClicked()
+{
+ toggleLookInfoPanel(FALSE);
+ toggleWearableEditPanel(TRUE, NULL);
+ /*if (mLookInfo->getVisible())
+ {
+ }
+ else
+ {
+ mPanelOutfitsInventory->onEdit();
+ }*/
+}
+
+void LLSidepanelAppearance::onNewOutfitButtonClicked()
+{
+ if (!mLookInfo->getVisible())
+ {
+ mPanelOutfitsInventory->onSave();
+ }
+}
+
+
+void LLSidepanelAppearance::onBackButtonClicked()
+{
+ toggleLookInfoPanel(FALSE);
+}
+
+void LLSidepanelAppearance::onEditWearBackClicked()
+{
+ mEditWearable->saveChanges();
+ toggleWearableEditPanel(FALSE, NULL);
+ toggleLookInfoPanel(TRUE);
+}
+
+void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
+{
+ if (!mLookInfo)
+ return;
+
+ mLookInfo->setVisible(visible);
+ if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
+ mFilterEditor->setVisible(!visible);
+ mEditBtn->setVisible(!visible);
+ mNewOutfitBtn->setVisible(!visible);
+ mCurrOutfitPanel->setVisible(!visible);
+}
+
+void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
+{
+ if (!wearable)
+ {
+ wearable = gAgentWearables.getWearable(WT_SHAPE, 0);
+ }
+ if (!mEditWearable || !wearable)
+ {
+ return;
+ }
+
+ mEditWearable->setVisible(visible);
+ mFilterEditor->setVisible(!visible);
+ mPanelOutfitsInventory->setVisible(!visible);
+}
+
+void LLSidepanelAppearance::updateVerbs()
+{
+ bool is_look_info_visible = mLookInfo->getVisible();
+
+ if (mPanelOutfitsInventory && !is_look_info_visible)
+ {
+ const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
+ mEditBtn->setEnabled(is_correct_type);
+ }
+ else
+ {
+ mEditBtn->setEnabled(FALSE);
+ }
+}
+
+void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
+{
+ mOutfitDirtyTag->setVisible(LLAppearanceManager::getInstance()->isOutfitDirty());
+ if (name == "")
+ {
+ std::string outfit_name;
+ if (LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))
+ {
+ mCurrentLookName->setText(outfit_name);
+ return;
+ }
+ mCurrentLookName->setText(getString("No Outfit"));
+ mOpenOutfitBtn->setEnabled(FALSE);
+ }
+ else
+ {
+ mCurrentLookName->setText(name);
+ // Can't just call update verbs since the folder link may not have been created yet.
+ mOpenOutfitBtn->setEnabled(TRUE);
+ }
+}
+
+//static
+void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
+{
+ LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data;
+ panel->toggleLookInfoPanel(FALSE);
+ panel->toggleWearableEditPanel(TRUE, wearable);
+}
+
+// Fetch currently worn items and only enable the New Look button after everything's been
+// fetched. Alternatively, we could stuff this logic into llagentwearables::makeNewOutfitLinks.
+void LLSidepanelAppearance::fetchInventory()
+{
+
+ mNewOutfitBtn->setEnabled(false);
+ LLInventoryFetchObserver::item_ref_t ids;
+ LLUUID item_id;
+ for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
+ {
+ // MULTI_WEARABLE:
+ item_id = gAgentWearables.getWearableItemID((EWearableType)type,0);
+ if(item_id.notNull())
+ {
+ ids.push_back(item_id);
+ }
+ }
+
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+ if( avatar )
+ {
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin();
+ iter != avatar->mAttachmentPoints.end(); ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+ if (!attachment) continue;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+ if (!attached_object) continue;
+ const LLUUID& item_id = attached_object->getItemID();
+ if (item_id.isNull()) continue;
+ ids.push_back(item_id);
+ }
+ }
+ }
+
+ LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(this);
+ fetch_worn->fetchItems(ids);
+ // If no items to be fetched, done will never be triggered.
+ // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
+ if (fetch_worn->isEverythingComplete())
+ {
+ fetch_worn->done();
+ }
+ else
+ {
+ gInventory.addObserver(fetch_worn);
+ }
+}
+
+void LLSidepanelAppearance::inventoryFetched()
+{
+ mNewOutfitBtn->setEnabled(true);
+}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
new file mode 100644
index 0000000000..aa2e67fd16
--- /dev/null
+++ b/indra/newview/llsidepanelappearance.h
@@ -0,0 +1,106 @@
+/**
+ * @file llsidepanelappearance.h
+ * @brief Side Bar "Appearance" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELAPPEARANCE_H
+#define LL_LLSIDEPANELAPPEARANCE_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+#include "llinventory.h"
+#include "llpanellookinfo.h"
+
+class LLFilterEditor;
+class LLCurrentlyWornFetchObserver;
+class LLWatchForOutfitRenameObserver;
+class LLPanelEditWearable;
+class LLWearable;
+class LLPanelOutfitsInventory;
+
+class LLSidepanelAppearance : public LLPanel
+{
+public:
+ LLSidepanelAppearance();
+ virtual ~LLSidepanelAppearance();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void refreshCurrentOutfitName(const std::string& name = "");
+
+ static void editWearable(LLWearable *wearable, void *data);
+
+ void fetchInventory();
+ void inventoryFetched();
+ void updateVerbs();
+ void onNewOutfitButtonClicked();
+
+private:
+ void onFilterEdit(const std::string& search_string);
+
+ void onOpenOutfitButtonClicked();
+ void onEditAppearanceButtonClicked();
+ void onEditButtonClicked();
+ void onBackButtonClicked();
+ void onEditWearBackClicked();
+ void toggleLookInfoPanel(BOOL visible);
+ void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
+
+ LLFilterEditor* mFilterEditor;
+ LLPanelOutfitsInventory* mPanelOutfitsInventory;
+ LLPanelLookInfo* mLookInfo;
+ LLPanelEditWearable* mEditWearable;
+
+ LLButton* mOpenOutfitBtn;
+ LLButton* mEditAppearanceBtn;
+ LLButton* mEditBtn;
+ LLButton* mNewOutfitBtn;
+ LLPanel* mCurrOutfitPanel;
+
+ LLTextBox* mCurrentLookName;
+ LLTextBox* mOutfitDirtyTag;
+
+ // Used to make sure the user's inventory is in memory.
+ LLCurrentlyWornFetchObserver* mFetchWorn;
+
+ // Used to update title when currently worn outfit gets renamed.
+ LLWatchForOutfitRenameObserver* mOutfitRenameWatcher;
+
+ // Search string for filtering landmarks and teleport
+ // history locations
+ std::string mFilterSubString;
+
+ // Information type currently shown in Look Information panel
+ std::string mLookInfoType;
+
+};
+
+#endif //LL_LLSIDEPANELAPPEARANCE_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
new file mode 100644
index 0000000000..73880563d7
--- /dev/null
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -0,0 +1,325 @@
+/**
+ * @file LLSidepanelInventory.cpp
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelinventory.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llinventorybridge.h"
+#include "llinventorypanel.h"
+#include "llpanelmaininventory.h"
+#include "llsidepaneliteminfo.h"
+#include "llsidepaneltaskinfo.h"
+#include "lltabcontainer.h"
+#include "llselectmgr.h"
+
+static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
+
+LLSidepanelInventory::LLSidepanelInventory()
+ : LLPanel(),
+ mItemPanel(NULL),
+ mPanelMainInventory(NULL)
+{
+
+ //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
+}
+
+LLSidepanelInventory::~LLSidepanelInventory()
+{
+}
+
+BOOL LLSidepanelInventory::postBuild()
+{
+ // UI elements from inventory panel
+ {
+ mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
+
+ mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
+ mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
+
+ mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
+ mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
+
+ mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
+ mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
+
+ mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn");
+ mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
+
+ mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn");
+ mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
+
+ mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
+ mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
+
+ mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+ mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+
+ /*
+ EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
+ Deferring this until 2.1.
+ LLInventoryPanel *my_inventory_panel = mPanelMainInventory->getChild<LLInventoryPanel>("All Items");
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK);
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);
+ */
+ }
+
+ // UI elements from item panel
+ {
+ mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
+
+ LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
+ back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
+ }
+
+ // UI elements from task panel
+ {
+ mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel");
+ if (mTaskPanel)
+ {
+ LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn");
+ back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
+ }
+ }
+
+ return TRUE;
+}
+
+void LLSidepanelInventory::onOpen(const LLSD& key)
+{
+ if(key.size() == 0)
+ return;
+
+ mItemPanel->reset();
+
+ if (key.has("id"))
+ {
+ mItemPanel->setItemID(key["id"].asUUID());
+ if (key.has("object"))
+ {
+ mItemPanel->setObjectID(key["object"].asUUID());
+ }
+ showItemInfoPanel();
+ }
+ if (key.has("task"))
+ {
+ if (mTaskPanel)
+ mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
+ showTaskInfoPanel();
+ }
+}
+
+void LLSidepanelInventory::onInfoButtonClicked()
+{
+ LLInventoryItem *item = getSelectedItem();
+ if (item)
+ {
+ mItemPanel->reset();
+ mItemPanel->setItemID(item->getUUID());
+ showItemInfoPanel();
+ }
+}
+
+void LLSidepanelInventory::onShareButtonClicked()
+{
+}
+
+void LLSidepanelInventory::performActionOnSelection(const std::string &action)
+{
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+ LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action);
+}
+
+void LLSidepanelInventory::onWearButtonClicked()
+{
+ performActionOnSelection("wear");
+ performActionOnSelection("attach");
+}
+
+void LLSidepanelInventory::onPlayButtonClicked()
+{
+ const LLInventoryItem *item = getSelectedItem();
+ if (!item)
+ {
+ return;
+ }
+
+ switch(item->getInventoryType())
+ {
+ case LLInventoryType::IT_GESTURE:
+ performActionOnSelection("play");
+ break;
+ default:
+ performActionOnSelection("open");
+ break;
+ }
+}
+
+void LLSidepanelInventory::onTeleportButtonClicked()
+{
+ performActionOnSelection("teleport");
+}
+
+void LLSidepanelInventory::onOverflowButtonClicked()
+{
+}
+
+void LLSidepanelInventory::onBackButtonClicked()
+{
+ showInventoryPanel();
+}
+
+void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+ updateVerbs();
+}
+
+void LLSidepanelInventory::showItemInfoPanel()
+{
+ mItemPanel->setVisible(TRUE);
+ if (mTaskPanel)
+ mTaskPanel->setVisible(FALSE);
+ mInventoryPanel->setVisible(FALSE);
+
+ mItemPanel->dirty();
+ mItemPanel->setIsEditing(FALSE);
+}
+
+void LLSidepanelInventory::showTaskInfoPanel()
+{
+ mItemPanel->setVisible(FALSE);
+ mInventoryPanel->setVisible(FALSE);
+
+ if (mTaskPanel)
+ {
+ mTaskPanel->setVisible(TRUE);
+ mTaskPanel->dirty();
+ mTaskPanel->setIsEditing(FALSE);
+ }
+}
+
+void LLSidepanelInventory::showInventoryPanel()
+{
+ mItemPanel->setVisible(FALSE);
+ if (mTaskPanel)
+ mTaskPanel->setVisible(FALSE);
+ mInventoryPanel->setVisible(TRUE);
+ updateVerbs();
+}
+
+void LLSidepanelInventory::updateVerbs()
+{
+ mInfoBtn->setEnabled(FALSE);
+ mShareBtn->setEnabled(FALSE);
+
+ mWearBtn->setVisible(FALSE);
+ mWearBtn->setEnabled(FALSE);
+ mPlayBtn->setVisible(FALSE);
+ mPlayBtn->setEnabled(FALSE);
+ mTeleportBtn->setVisible(FALSE);
+ mTeleportBtn->setEnabled(FALSE);
+
+ const LLInventoryItem *item = getSelectedItem();
+ if (!item)
+ return;
+
+ bool is_single_selection = getSelectedCount() == 1;
+
+ mInfoBtn->setEnabled(is_single_selection);
+ mShareBtn->setEnabled(is_single_selection);
+
+ switch(item->getInventoryType())
+ {
+ case LLInventoryType::IT_WEARABLE:
+ case LLInventoryType::IT_OBJECT:
+ case LLInventoryType::IT_ATTACHMENT:
+ mWearBtn->setVisible(TRUE);
+ mWearBtn->setEnabled(TRUE);
+ break;
+ case LLInventoryType::IT_SOUND:
+ case LLInventoryType::IT_GESTURE:
+ case LLInventoryType::IT_ANIMATION:
+ mPlayBtn->setVisible(TRUE);
+ mPlayBtn->setEnabled(TRUE);
+ break;
+ case LLInventoryType::IT_LANDMARK:
+ mTeleportBtn->setVisible(TRUE);
+ mTeleportBtn->setEnabled(TRUE);
+ break;
+ default:
+ break;
+ }
+}
+
+LLInventoryItem *LLSidepanelInventory::getSelectedItem()
+{
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+ LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return NULL;
+ }
+ const LLUUID &item_id = current_item->getListener()->getUUID();
+ LLInventoryItem *item = gInventory.getItem(item_id);
+ return item;
+}
+
+U32 LLSidepanelInventory::getSelectedCount()
+{
+ LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+ std::set<LLUUID> selection_list;
+ panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list);
+ return selection_list.size();
+}
+
+LLInventoryPanel *LLSidepanelInventory::getActivePanel()
+{
+ if (!getVisible())
+ {
+ return NULL;
+ }
+ if (mInventoryPanel->getVisible())
+ {
+ return mPanelMainInventory->getActivePanel();
+ }
+ return NULL;
+}
+
+BOOL LLSidepanelInventory::isMainInventoryPanelActive() const
+{
+ return mInventoryPanel->getVisible();
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
new file mode 100644
index 0000000000..ee11fb6b54
--- /dev/null
+++ b/indra/newview/llsidepanelinventory.h
@@ -0,0 +1,96 @@
+/**
+ * @file LLSidepanelInventory.h
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELINVENTORY_H
+#define LL_LLSIDEPANELINVENTORY_H
+
+#include "llpanel.h"
+
+class LLFolderViewItem;
+class LLInventoryItem;
+class LLInventoryPanel;
+class LLPanelMainInventory;
+class LLSidepanelItemInfo;
+class LLSidepanelTaskInfo;
+
+class LLSidepanelInventory : public LLPanel
+{
+public:
+ LLSidepanelInventory();
+ virtual ~LLSidepanelInventory();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+ BOOL isMainInventoryPanelActive() const;
+
+protected:
+ // Tracks highlighted (selected) item in inventory panel.
+ LLInventoryItem *getSelectedItem();
+ U32 getSelectedCount();
+ void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ // "wear", "teleport", etc.
+ void performActionOnSelection(const std::string &action);
+
+ void showItemInfoPanel();
+ void showTaskInfoPanel();
+ void showInventoryPanel();
+ void updateVerbs();
+
+ //
+ // UI Elements
+ //
+private:
+ LLPanel* mInventoryPanel; // Main inventory view
+ LLSidepanelItemInfo* mItemPanel; // Individual item view
+ LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view
+ LLPanelMainInventory* mPanelMainInventory;
+
+protected:
+ void onInfoButtonClicked();
+ void onShareButtonClicked();
+ void onWearButtonClicked();
+ void onPlayButtonClicked();
+ void onTeleportButtonClicked();
+ void onOverflowButtonClicked();
+ void onBackButtonClicked();
+private:
+ LLButton* mInfoBtn;
+ LLButton* mShareBtn;
+ LLButton* mWearBtn;
+ LLButton* mPlayBtn;
+ LLButton* mTeleportBtn;
+ LLButton* mOverflowBtn;
+
+};
+
+#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
new file mode 100644
index 0000000000..f51462dcce
--- /dev/null
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -0,0 +1,151 @@
+/**
+ * @file llsidepanelinventorysubpanel.cpp
+ * @brief A floater which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelinventorysubpanel.h"
+
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "llgroupactions.h"
+#include "llinventorymodel.h"
+#include "lllineeditor.h"
+#include "llradiogroup.h"
+#include "llviewercontrol.h"
+#include "llviewerobjectlist.h"
+
+
+///----------------------------------------------------------------------------
+/// Class LLSidepanelInventorySubpanel
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel()
+ : LLPanel(),
+ mIsDirty(TRUE),
+ mIsEditing(FALSE),
+ mCancelBtn(NULL),
+ mSaveBtn(NULL)
+{
+}
+
+// Destroys the object
+LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel()
+{
+}
+
+// virtual
+BOOL LLSidepanelInventorySubpanel::postBuild()
+{
+ mSaveBtn = getChild<LLButton>("save_btn");
+ mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this));
+
+ mCancelBtn = getChild<LLButton>("cancel_btn");
+ mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this));
+ return TRUE;
+}
+
+void LLSidepanelInventorySubpanel::setVisible(BOOL visible)
+{
+ if (visible)
+ {
+ dirty();
+ }
+ LLPanel::setVisible(visible);
+}
+
+void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit)
+{
+ mIsEditing = edit;
+ mIsDirty = TRUE;
+}
+
+BOOL LLSidepanelInventorySubpanel::getIsEditing() const
+{
+
+ return TRUE; // Default everything to edit mode since we're not using an edit button anymore.
+ // return mIsEditing;
+}
+
+void LLSidepanelInventorySubpanel::reset()
+{
+ mIsDirty = TRUE;
+}
+
+void LLSidepanelInventorySubpanel::draw()
+{
+ if (mIsDirty)
+ {
+ refresh();
+ updateVerbs();
+ mIsDirty = FALSE;
+ }
+
+ LLPanel::draw();
+}
+
+void LLSidepanelInventorySubpanel::dirty()
+{
+ mIsDirty = TRUE;
+ setIsEditing(FALSE);
+}
+
+void LLSidepanelInventorySubpanel::updateVerbs()
+{
+ mSaveBtn->setVisible(mIsEditing);
+ mCancelBtn->setVisible(mIsEditing);
+}
+
+void LLSidepanelInventorySubpanel::onEditButtonClicked()
+{
+ setIsEditing(TRUE);
+ refresh();
+ updateVerbs();
+}
+
+void LLSidepanelInventorySubpanel::onSaveButtonClicked()
+{
+ save();
+ setIsEditing(FALSE);
+ refresh();
+ updateVerbs();
+}
+
+void LLSidepanelInventorySubpanel::onCancelButtonClicked()
+{
+ setIsEditing(FALSE);
+ refresh();
+ updateVerbs();
+}
diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h
new file mode 100644
index 0000000000..b7bee6809f
--- /dev/null
+++ b/indra/newview/llsidepanelinventorysubpanel.h
@@ -0,0 +1,81 @@
+/**
+ * @file llsidepanelinventorysubpanel.h
+ * @brief A panel which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELINVENTORYSUBPANEL_H
+#define LL_LLSIDEPANELINVENTORYSUBPANEL_H
+
+#include "llpanel.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLSidepanelInventorySubpanel
+// Base class for inventory sidepanel panels (e.g. item info, task info).
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLButton;
+class LLInventoryItem;
+
+class LLSidepanelInventorySubpanel : public LLPanel
+{
+public:
+ LLSidepanelInventorySubpanel();
+ virtual ~LLSidepanelInventorySubpanel();
+
+ /*virtual*/ void setVisible(BOOL visible);
+ virtual BOOL postBuild();
+ virtual void draw();
+ virtual void reset();
+
+ void dirty();
+ void setIsEditing(BOOL edit);
+protected:
+ virtual void refresh() = 0;
+ virtual void save() = 0;
+ virtual void updateVerbs();
+
+ BOOL getIsEditing() const;
+
+ //
+ // UI Elements
+ //
+protected:
+ void onEditButtonClicked();
+ void onSaveButtonClicked();
+ void onCancelButtonClicked();
+ LLButton* mSaveBtn;
+ LLButton* mCancelBtn;
+
+private:
+ BOOL mIsDirty; // item properties need to be updated
+ BOOL mIsEditing; // if we're in edit mode
+};
+
+#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
new file mode 100644
index 0000000000..0275736f6d
--- /dev/null
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -0,0 +1,942 @@
+/**
+ * @file llsidepaneliteminfo.cpp
+ * @brief A floater which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepaneliteminfo.h"
+
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "llgroupactions.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "lllineeditor.h"
+#include "llradiogroup.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
+#include "llviewerobjectlist.h"
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLItemPropertiesObserver
+//
+// Helper class to watch for changes to the item.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLItemPropertiesObserver : public LLInventoryObserver
+{
+public:
+ LLItemPropertiesObserver(LLSidepanelItemInfo* floater)
+ : mFloater(floater)
+ {
+ gInventory.addObserver(this);
+ }
+ virtual ~LLItemPropertiesObserver()
+ {
+ gInventory.removeObserver(this);
+ }
+ virtual void changed(U32 mask);
+private:
+ LLSidepanelItemInfo* mFloater;
+};
+
+void LLItemPropertiesObserver::changed(U32 mask)
+{
+ // if there's a change we're interested in.
+ if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
+ {
+ mFloater->dirty();
+ }
+}
+
+
+
+///----------------------------------------------------------------------------
+/// Class LLSidepanelItemInfo
+///----------------------------------------------------------------------------
+
+static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
+
+// Default constructor
+LLSidepanelItemInfo::LLSidepanelItemInfo()
+ : mItemID(LLUUID::null)
+{
+ mPropertiesObserver = new LLItemPropertiesObserver(this);
+
+ //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml");
+}
+
+// Destroys the object
+LLSidepanelItemInfo::~LLSidepanelItemInfo()
+{
+ delete mPropertiesObserver;
+ mPropertiesObserver = NULL;
+}
+
+// virtual
+BOOL LLSidepanelItemInfo::postBuild()
+{
+ LLSidepanelInventorySubpanel::postBuild();
+
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
+ getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
+ getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
+ // Creator information
+ getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
+ // owner information
+ getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
+ // acquired date
+ // owner permissions
+ // Permissions debug text
+ // group permissions
+ getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+ // everyone permissions
+ getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+ // next owner permissions
+ getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+ getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+ getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+ // Mark for sale or not, and sale info
+ getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
+ getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this));
+ // "Price" label for edit
+ getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
+ refresh();
+ return TRUE;
+}
+
+void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
+{
+ mObjectID = object_id;
+}
+
+void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
+{
+ mItemID = item_id;
+}
+
+void LLSidepanelItemInfo::reset()
+{
+ LLSidepanelInventorySubpanel::reset();
+
+ mObjectID = LLUUID::null;
+ mItemID = LLUUID::null;
+}
+
+void LLSidepanelItemInfo::refresh()
+{
+ LLViewerInventoryItem* item = findItem();
+ if(item)
+ {
+ refreshFromItem(item);
+ updateVerbs();
+ return;
+ }
+ else
+ {
+ if (getIsEditing())
+ {
+ setIsEditing(FALSE);
+ }
+ }
+
+ if (!getIsEditing())
+ {
+ const std::string no_item_names[]={
+ "LabelItemName",
+ "LabelItemDesc",
+ "LabelCreatorName",
+ "LabelOwnerName",
+ "CheckOwnerModify",
+ "CheckOwnerCopy",
+ "CheckOwnerTransfer",
+ "CheckShareWithGroup",
+ "CheckEveryoneCopy",
+ "CheckNextOwnerModify",
+ "CheckNextOwnerCopy",
+ "CheckNextOwnerTransfer",
+ "CheckPurchase",
+ "RadioSaleType",
+ "Edit Cost"
+ };
+
+ for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
+ {
+ childSetEnabled(no_item_names[t],false);
+ }
+
+ const std::string hide_names[]={
+ "BaseMaskDebug",
+ "OwnerMaskDebug",
+ "GroupMaskDebug",
+ "EveryoneMaskDebug",
+ "NextMaskDebug"
+ };
+ for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
+ {
+ childSetVisible(hide_names[t],false);
+ }
+ }
+
+ if (!item)
+ {
+ const std::string no_edit_mode_names[]={
+ "BtnCreator",
+ "BtnOwner",
+ };
+ for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t)
+ {
+ childSetEnabled(no_edit_mode_names[t],false);
+ }
+ }
+
+ updateVerbs();
+}
+
+void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
+{
+ ////////////////////////
+ // PERMISSIONS LOOKUP //
+ ////////////////////////
+
+ llassert(item);
+ if (!item) return;
+
+ // do not enable the UI for incomplete items.
+ BOOL is_complete = item->isComplete();
+ const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
+ const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
+ const LLPermissions& perm = item->getPermissions();
+ const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
+ GP_OBJECT_MANIPULATE);
+ const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
+ GP_OBJECT_SET_SALE) &&
+ !cannot_restrict_permissions;
+ const BOOL is_link = item->getIsLinkType();
+
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
+
+ // You need permission to modify the object to modify an inventory
+ // item in it.
+ LLViewerObject* object = NULL;
+ if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID);
+ BOOL is_obj_modify = TRUE;
+ if(object)
+ {
+ is_obj_modify = object->permOwnerModify();
+ }
+
+ //////////////////////
+ // ITEM NAME & DESC //
+ //////////////////////
+ BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
+ GP_OBJECT_MANIPULATE)
+ && is_obj_modify && is_complete && not_in_trash;
+
+ childSetEnabled("LabelItemNameTitle",TRUE);
+ childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
+ childSetText("LabelItemName",item->getName());
+ childSetEnabled("LabelItemDescTitle",TRUE);
+ childSetEnabled("LabelItemDesc",is_modifiable);
+ childSetVisible("IconLocked",!is_modifiable);
+ childSetText("LabelItemDesc",item->getDescription());
+
+ //////////////////
+ // CREATOR NAME //
+ //////////////////
+ if(!gCacheName) return;
+ if(!gAgent.getRegion()) return;
+
+ if (item->getCreatorUUID().notNull())
+ {
+ std::string name;
+ gCacheName->getFullName(item->getCreatorUUID(), name);
+ childSetEnabled("BtnCreator",TRUE);
+ childSetEnabled("LabelCreatorTitle",TRUE);
+ childSetEnabled("LabelCreatorName",TRUE);
+ childSetText("LabelCreatorName",name);
+ }
+ else
+ {
+ childSetEnabled("BtnCreator",FALSE);
+ childSetEnabled("LabelCreatorTitle",FALSE);
+ childSetEnabled("LabelCreatorName",FALSE);
+ childSetText("LabelCreatorName",getString("unknown"));
+ }
+
+ ////////////////
+ // OWNER NAME //
+ ////////////////
+ if(perm.isOwned())
+ {
+ std::string name;
+ if (perm.isGroupOwned())
+ {
+ gCacheName->getGroupName(perm.getGroup(), name);
+ }
+ else
+ {
+ gCacheName->getFullName(perm.getOwner(), name);
+ }
+ childSetEnabled("BtnOwner",TRUE);
+ childSetEnabled("LabelOwnerTitle",TRUE);
+ childSetEnabled("LabelOwnerName",TRUE);
+ childSetText("LabelOwnerName",name);
+ }
+ else
+ {
+ childSetEnabled("BtnOwner",FALSE);
+ childSetEnabled("LabelOwnerTitle",FALSE);
+ childSetEnabled("LabelOwnerName",FALSE);
+ childSetText("LabelOwnerName",getString("public"));
+ }
+
+ //////////////////
+ // ACQUIRE DATE //
+ //////////////////
+
+ time_t time_utc = item->getCreationDate();
+ if (0 == time_utc)
+ {
+ childSetText("LabelAcquiredDate",getString("unknown"));
+ }
+ else
+ {
+ std::string timeStr = getString("acquiredDate");
+ LLSD substitution;
+ substitution["datetime"] = (S32) time_utc;
+ LLStringUtil::format (timeStr, substitution);
+ childSetText ("LabelAcquiredDate", timeStr);
+ }
+
+ /////////////////////////////////////
+ // PERMISSIONS AND SALE ITEM HIDING
+ /////////////////////////////////////
+
+ const std::string perm_and_sale_items[]={
+ "perms_inv",
+ "OwnerLabel",
+ "perm_modify",
+ "CheckOwnerModify",
+ "CheckOwnerCopy",
+ "CheckOwnerTransfer",
+ "GroupLabel",
+ "CheckShareWithGroup",
+ "AnyoneLabel",
+ "CheckEveryoneCopy",
+ "NextOwnerLabel",
+ "CheckNextOwnerModify",
+ "CheckNextOwnerCopy",
+ "CheckNextOwnerTransfer",
+ "CheckPurchase",
+ "SaleLabel",
+ "RadioSaleType",
+ "combobox sale copy",
+ "Edit Cost",
+ "TextPrice"
+ };
+
+ const std::string debug_items[]={
+ "BaseMaskDebug",
+ "OwnerMaskDebug",
+ "GroupMaskDebug",
+ "EveryoneMaskDebug",
+ "NextMaskDebug"
+ };
+
+ // Hide permissions checkboxes and labels and for sale info if in the trash
+ // or ui elements don't apply to these objects and return from function
+ if (!not_in_trash || cannot_restrict_permissions)
+ {
+ for(size_t t=0; t<LL_ARRAY_SIZE(perm_and_sale_items); ++t)
+ {
+ childSetVisible(perm_and_sale_items[t],false);
+ }
+
+ for(size_t t=0; t<LL_ARRAY_SIZE(debug_items); ++t)
+ {
+ childSetVisible(debug_items[t],false);
+ }
+ return;
+ }
+ else // Make sure perms and sale ui elements are visible
+ {
+ for(size_t t=0; t<LL_ARRAY_SIZE(perm_and_sale_items); ++t)
+ {
+ childSetVisible(perm_and_sale_items[t],true);
+ }
+ }
+
+ ///////////////////////
+ // OWNER PERMISSIONS //
+ ///////////////////////
+ if(can_agent_manipulate)
+ {
+ childSetText("OwnerLabel",getString("you_can"));
+ }
+ else
+ {
+ childSetText("OwnerLabel",getString("owner_can"));
+ }
+
+ U32 base_mask = perm.getMaskBase();
+ U32 owner_mask = perm.getMaskOwner();
+ U32 group_mask = perm.getMaskGroup();
+ U32 everyone_mask = perm.getMaskEveryone();
+ U32 next_owner_mask = perm.getMaskNextOwner();
+
+ childSetEnabled("OwnerLabel",TRUE);
+ childSetEnabled("CheckOwnerModify",FALSE);
+ childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY)));
+ childSetEnabled("CheckOwnerCopy",FALSE);
+ childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY)));
+ childSetEnabled("CheckOwnerTransfer",FALSE);
+ childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER)));
+
+ ///////////////////////
+ // DEBUG PERMISSIONS //
+ ///////////////////////
+
+ if( gSavedSettings.getBOOL("DebugPermissions") )
+ {
+ BOOL slam_perm = FALSE;
+ BOOL overwrite_group = FALSE;
+ BOOL overwrite_everyone = FALSE;
+
+ if (item->getType() == LLAssetType::AT_OBJECT)
+ {
+ U32 flags = item->getFlags();
+ slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+ overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ }
+
+ std::string perm_string;
+
+ perm_string = "B: ";
+ perm_string += mask_to_string(base_mask);
+ childSetText("BaseMaskDebug",perm_string);
+ childSetVisible("BaseMaskDebug",TRUE);
+
+ perm_string = "O: ";
+ perm_string += mask_to_string(owner_mask);
+ childSetText("OwnerMaskDebug",perm_string);
+ childSetVisible("OwnerMaskDebug",TRUE);
+
+ perm_string = "G";
+ perm_string += overwrite_group ? "*: " : ": ";
+ perm_string += mask_to_string(group_mask);
+ childSetText("GroupMaskDebug",perm_string);
+ childSetVisible("GroupMaskDebug",TRUE);
+
+ perm_string = "E";
+ perm_string += overwrite_everyone ? "*: " : ": ";
+ perm_string += mask_to_string(everyone_mask);
+ childSetText("EveryoneMaskDebug",perm_string);
+ childSetVisible("EveryoneMaskDebug",TRUE);
+
+ perm_string = "N";
+ perm_string += slam_perm ? "*: " : ": ";
+ perm_string += mask_to_string(next_owner_mask);
+ childSetText("NextMaskDebug",perm_string);
+ childSetVisible("NextMaskDebug",TRUE);
+ }
+ else
+ {
+ childSetVisible("BaseMaskDebug",FALSE);
+ childSetVisible("OwnerMaskDebug",FALSE);
+ childSetVisible("GroupMaskDebug",FALSE);
+ childSetVisible("EveryoneMaskDebug",FALSE);
+ childSetVisible("NextMaskDebug",FALSE);
+ }
+
+ /////////////
+ // SHARING //
+ /////////////
+
+ // Check for ability to change values.
+ if (is_link || cannot_restrict_permissions)
+ {
+ childSetEnabled("CheckShareWithGroup",FALSE);
+ childSetEnabled("CheckEveryoneCopy",FALSE);
+ }
+ else if (is_obj_modify && can_agent_manipulate)
+ {
+ childSetEnabled("CheckShareWithGroup",TRUE);
+ childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER));
+ }
+ else
+ {
+ childSetEnabled("CheckShareWithGroup",FALSE);
+ childSetEnabled("CheckEveryoneCopy",FALSE);
+ }
+
+ // Set values.
+ BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE;
+ BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE;
+ BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE;
+
+ if (is_group_copy && is_group_modify && is_group_move)
+ {
+ childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE));
+
+ LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+ if(ctl)
+ {
+ ctl->setTentative(FALSE);
+ }
+ }
+ else if (!is_group_copy && !is_group_modify && !is_group_move)
+ {
+ childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE));
+ LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+ if(ctl)
+ {
+ ctl->setTentative(FALSE);
+ }
+ }
+ else
+ {
+ LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+ if(ctl)
+ {
+ ctl->setTentative(TRUE);
+ ctl->set(TRUE);
+ }
+ }
+
+ childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY)));
+
+ ///////////////
+ // SALE INFO //
+ ///////////////
+
+ const LLSaleInfo& sale_info = item->getSaleInfo();
+ BOOL is_for_sale = sale_info.isForSale();
+ // Check for ability to change values.
+ if (is_obj_modify && can_agent_sell
+ && gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE))
+ {
+ childSetEnabled("SaleLabel",is_complete);
+ childSetEnabled("CheckPurchase",is_complete);
+
+ childSetEnabled("NextOwnerLabel",TRUE);
+ childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions);
+ childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions);
+ childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);
+
+ childSetEnabled("RadioSaleType",is_complete && is_for_sale);
+ childSetEnabled("TextPrice",is_complete && is_for_sale);
+ childSetEnabled("Edit Cost",is_complete && is_for_sale);
+ }
+ else
+ {
+ childSetEnabled("SaleLabel",FALSE);
+ childSetEnabled("CheckPurchase",FALSE);
+
+ childSetEnabled("NextOwnerLabel",FALSE);
+ childSetEnabled("CheckNextOwnerModify",FALSE);
+ childSetEnabled("CheckNextOwnerCopy",FALSE);
+ childSetEnabled("CheckNextOwnerTransfer",FALSE);
+
+ childSetEnabled("RadioSaleType",FALSE);
+ childSetEnabled("TextPrice",FALSE);
+ childSetEnabled("Edit Cost",FALSE);
+ }
+
+ // Set values.
+ childSetValue("CheckPurchase", is_for_sale);
+ childSetEnabled("combobox sale copy", is_for_sale);
+ childSetEnabled("Edit Cost", is_for_sale);
+ childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY)));
+ childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY)));
+ childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER)));
+
+ LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType");
+ if (is_for_sale)
+ {
+ radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
+ S32 numerical_price;
+ numerical_price = sale_info.getSalePrice();
+ childSetText("Edit Cost",llformat("%d",numerical_price));
+ }
+ else
+ {
+ radioSaleType->setSelectedIndex(-1);
+ childSetText("Edit Cost",llformat("%d",0));
+ }
+}
+
+void LLSidepanelItemInfo::onClickCreator()
+{
+ LLViewerInventoryItem* item = findItem();
+ if(!item) return;
+ if(!item->getCreatorUUID().isNull())
+ {
+ LLAvatarActions::showProfile(item->getCreatorUUID());
+ }
+}
+
+// static
+void LLSidepanelItemInfo::onClickOwner()
+{
+ LLViewerInventoryItem* item = findItem();
+ if(!item) return;
+ if(item->getPermissions().isGroupOwned())
+ {
+ LLGroupActions::show(item->getPermissions().getGroup());
+ }
+ else
+ {
+ LLAvatarActions::showProfile(item->getPermissions().getOwner());
+ }
+}
+
+// static
+void LLSidepanelItemInfo::onCommitName()
+{
+ //llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl;
+ LLViewerInventoryItem* item = findItem();
+ if(!item)
+ {
+ return;
+ }
+ LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName");
+
+ if(labelItemName&&
+ (item->getName() != labelItemName->getText()) &&
+ (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) )
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->rename(labelItemName->getText());
+ if(mObjectID.isNull())
+ {
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if(object)
+ {
+ object->updateInventory(
+ new_item,
+ TASK_INVENTORY_ITEM_KEY,
+ false);
+ }
+ }
+ }
+}
+
+void LLSidepanelItemInfo::onCommitDescription()
+{
+ //llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl;
+ LLViewerInventoryItem* item = findItem();
+ if(!item) return;
+
+ LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
+ if(!labelItemDesc)
+ {
+ return;
+ }
+ if((item->getDescription() != labelItemDesc->getText()) &&
+ (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+
+ new_item->setDescription(labelItemDesc->getText());
+ if(mObjectID.isNull())
+ {
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if(object)
+ {
+ object->updateInventory(
+ new_item,
+ TASK_INVENTORY_ITEM_KEY,
+ false);
+ }
+ }
+ }
+}
+
+// static
+void LLSidepanelItemInfo::onCommitPermissions()
+{
+ //llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl;
+ LLViewerInventoryItem* item = findItem();
+ if(!item) return;
+ LLPermissions perm(item->getPermissions());
+
+
+ LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+
+ if(CheckShareWithGroup)
+ {
+ perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(),
+ CheckShareWithGroup->get(),
+ PERM_MODIFY | PERM_MOVE | PERM_COPY);
+ }
+ LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy");
+ if(CheckEveryoneCopy)
+ {
+ perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(),
+ CheckEveryoneCopy->get(), PERM_COPY);
+ }
+
+ LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify");
+ if(CheckNextOwnerModify)
+ {
+ perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+ CheckNextOwnerModify->get(), PERM_MODIFY);
+ }
+ LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy");
+ if(CheckNextOwnerCopy)
+ {
+ perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+ CheckNextOwnerCopy->get(), PERM_COPY);
+ }
+ LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer");
+ if(CheckNextOwnerTransfer)
+ {
+ perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+ CheckNextOwnerTransfer->get(), PERM_TRANSFER);
+ }
+ if(perm != item->getPermissions()
+ && item->isComplete())
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->setPermissions(perm);
+ U32 flags = new_item->getFlags();
+ // If next owner permissions have changed (and this is an object)
+ // then set the slam permissions flag so that they are applied on rez.
+ if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
+ && (item->getType() == LLAssetType::AT_OBJECT))
+ {
+ flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+ }
+ // If everyone permissions have changed (and this is an object)
+ // then set the overwrite everyone permissions flag so they
+ // are applied on rez.
+ if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
+ && (item->getType() == LLAssetType::AT_OBJECT))
+ {
+ flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ }
+ // If group permissions have changed (and this is an object)
+ // then set the overwrite group permissions flag so they
+ // are applied on rez.
+ if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
+ && (item->getType() == LLAssetType::AT_OBJECT))
+ {
+ flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ }
+ new_item->setFlags(flags);
+ if(mObjectID.isNull())
+ {
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if(object)
+ {
+ object->updateInventory(
+ new_item,
+ TASK_INVENTORY_ITEM_KEY,
+ false);
+ }
+ }
+ }
+ else
+ {
+ // need to make sure we don't just follow the click
+ refresh();
+ }
+}
+
+// static
+void LLSidepanelItemInfo::onCommitSaleInfo()
+{
+ //llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl;
+ updateSaleInfo();
+}
+
+// static
+void LLSidepanelItemInfo::onCommitSaleType()
+{
+ //llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl;
+ updateSaleInfo();
+}
+
+void LLSidepanelItemInfo::updateSaleInfo()
+{
+ LLViewerInventoryItem* item = findItem();
+ if(!item) return;
+ LLSaleInfo sale_info(item->getSaleInfo());
+ if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE))
+ {
+ childSetValue("CheckPurchase",LLSD((BOOL)FALSE));
+ }
+
+ if((BOOL)childGetValue("CheckPurchase"))
+ {
+ // turn on sale info
+ LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY;
+
+ LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType");
+ if(RadioSaleType)
+ {
+ switch (RadioSaleType->getSelectedIndex())
+ {
+ case 0:
+ sale_type = LLSaleInfo::FS_ORIGINAL;
+ break;
+ case 1:
+ sale_type = LLSaleInfo::FS_COPY;
+ break;
+ case 2:
+ sale_type = LLSaleInfo::FS_CONTENTS;
+ break;
+ default:
+ sale_type = LLSaleInfo::FS_COPY;
+ break;
+ }
+ }
+
+ if (sale_type == LLSaleInfo::FS_COPY
+ && !gAgent.allowOperation(PERM_COPY, item->getPermissions(),
+ GP_OBJECT_SET_SALE))
+ {
+ sale_type = LLSaleInfo::FS_ORIGINAL;
+ }
+
+
+
+ S32 price = -1;
+ price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();;
+
+ // Invalid data - turn off the sale
+ if (price < 0)
+ {
+ sale_type = LLSaleInfo::FS_NOT;
+ price = 0;
+ }
+
+ sale_info.setSaleType(sale_type);
+ sale_info.setSalePrice(price);
+ }
+ else
+ {
+ sale_info.setSaleType(LLSaleInfo::FS_NOT);
+ }
+ if(sale_info != item->getSaleInfo()
+ && item->isComplete())
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+
+ // Force an update on the sale price at rez
+ if (item->getType() == LLAssetType::AT_OBJECT)
+ {
+ U32 flags = new_item->getFlags();
+ flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
+ new_item->setFlags(flags);
+ }
+
+ new_item->setSaleInfo(sale_info);
+ if(mObjectID.isNull())
+ {
+ // This is in the agent's inventory.
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ // This is in an object's contents.
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if(object)
+ {
+ object->updateInventory(
+ new_item,
+ TASK_INVENTORY_ITEM_KEY,
+ false);
+ }
+ }
+ }
+ else
+ {
+ // need to make sure we don't just follow the click
+ refresh();
+ }
+}
+
+LLViewerInventoryItem* LLSidepanelItemInfo::findItem() const
+{
+ LLViewerInventoryItem* item = NULL;
+ if(mObjectID.isNull())
+ {
+ // it is in agent inventory
+ item = gInventory.getItem(mItemID);
+ }
+ else
+ {
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if(object)
+ {
+ item = static_cast<LLViewerInventoryItem*>(object->getInventoryObject(mItemID));
+ }
+ }
+ return item;
+}
+
+// virtual
+void LLSidepanelItemInfo::save()
+{
+ onCommitName();
+ onCommitDescription();
+ onCommitPermissions();
+ onCommitSaleInfo();
+ onCommitSaleType();
+}
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
new file mode 100644
index 0000000000..e6dbf400ee
--- /dev/null
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -0,0 +1,90 @@
+/**
+ * @file llsidepaneliteminfo.h
+ * @brief A panel which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELITEMINFO_H
+#define LL_LLSIDEPANELITEMINFO_H
+
+#include "llsidepanelinventorysubpanel.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLSidepanelItemInfo
+// Object properties for inventory side panel.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLButton;
+class LLViewerInventoryItem;
+class LLItemPropertiesObserver;
+class LLViewerObject;
+class LLPermissions;
+
+class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
+{
+public:
+ LLSidepanelItemInfo();
+ virtual ~LLSidepanelItemInfo();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void reset();
+
+ void setObjectID(const LLUUID& object_id);
+ void setItemID(const LLUUID& item_id);
+ void setEditMode(BOOL edit);
+
+protected:
+ /*virtual*/ void refresh();
+ /*virtual*/ void save();
+
+ LLViewerInventoryItem* findItem() const;
+ LLViewerObject* findObject() const;
+
+ void refreshFromItem(LLViewerInventoryItem* item);
+
+private:
+ LLUUID mItemID; // inventory UUID for the inventory item.
+ LLUUID mObjectID; // in-world task UUID, or null if in agent inventory.
+ LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
+
+ //
+ // UI Elements
+ //
+protected:
+ void onClickCreator();
+ void onClickOwner();
+ void onCommitName();
+ void onCommitDescription();
+ void onCommitPermissions();
+ void onCommitSaleInfo();
+ void onCommitSaleType();
+ void updateSaleInfo();
+};
+
+#endif // LL_LLSIDEPANELITEMINFO_H
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
new file mode 100644
index 0000000000..0630981d7e
--- /dev/null
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -0,0 +1,1199 @@
+/**
+ * @file llsidepaneltaskinfo.cpp
+ * @brief LLSidepanelTaskInfo class implementation
+ * This class represents the panel in the build view for
+ * viewing/editing object names, owners, permissions, etc.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsidepaneltaskinfo.h"
+
+#include "lluuid.h"
+#include "llpermissions.h"
+#include "llcategory.h"
+#include "llclickaction.h"
+#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
+#include "llstring.h"
+
+#include "llviewerwindow.h"
+#include "llresmgr.h"
+#include "lltextbox.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llviewerobject.h"
+#include "llselectmgr.h"
+#include "llagent.h"
+#include "llstatusbar.h" // for getBalance()
+#include "lllineeditor.h"
+#include "llcombobox.h"
+#include "lluiconstants.h"
+#include "lldbstrings.h"
+#include "llfloatergroups.h"
+#include "llfloaterreg.h"
+#include "llavataractions.h"
+#include "llnamebox.h"
+#include "llviewercontrol.h"
+#include "llviewermenu.h"
+#include "lluictrlfactory.h"
+#include "llspinctrl.h"
+#include "roles_constants.h"
+#include "llgroupactions.h"
+
+///----------------------------------------------------------------------------
+/// Class llsidepaneltaskinfo
+///----------------------------------------------------------------------------
+
+LLSidepanelTaskInfo* LLSidepanelTaskInfo::sActivePanel = NULL;
+
+static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info");
+
+// Default constructor
+LLSidepanelTaskInfo::LLSidepanelTaskInfo()
+{
+ setMouseOpaque(FALSE);
+}
+
+
+LLSidepanelTaskInfo::~LLSidepanelTaskInfo()
+{
+ if (sActivePanel == this)
+ sActivePanel = NULL;
+}
+
+// virtual
+BOOL LLSidepanelTaskInfo::postBuild()
+{
+ LLSidepanelInventorySubpanel::postBuild();
+
+ mOpenBtn = getChild<LLButton>("open_btn");
+ mOpenBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onOpenButtonClicked, this));
+ mPayBtn = getChild<LLButton>("pay_btn");
+ mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this));
+ mBuyBtn = getChild<LLButton>("buy_btn");
+ mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this));
+
+ mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
+
+ childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this);
+ childSetPrevalidate("Object Name", LLTextValidate::validateASCIIPrintableNoPipe);
+ childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this);
+ childSetPrevalidate("Object Description", LLTextValidate::validateASCIIPrintableNoPipe);
+ getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
+ childSetCommitCallback("checkbox share with group", &LLSidepanelTaskInfo::onCommitGroupShare,this);
+ childSetAction("button deed", &LLSidepanelTaskInfo::onClickDeedToGroup,this);
+ childSetCommitCallback("checkbox allow everyone move", &LLSidepanelTaskInfo::onCommitEveryoneMove,this);
+ childSetCommitCallback("checkbox allow everyone copy", &LLSidepanelTaskInfo::onCommitEveryoneCopy,this);
+ childSetCommitCallback("checkbox for sale", &LLSidepanelTaskInfo::onCommitSaleInfo,this);
+ childSetCommitCallback("sale type", &LLSidepanelTaskInfo::onCommitSaleType,this);
+ childSetCommitCallback("Edit Cost", &LLSidepanelTaskInfo::onCommitSaleInfo, this);
+ childSetCommitCallback("checkbox next owner can modify", &LLSidepanelTaskInfo::onCommitNextOwnerModify,this);
+ childSetCommitCallback("checkbox next owner can copy", &LLSidepanelTaskInfo::onCommitNextOwnerCopy,this);
+ childSetCommitCallback("checkbox next owner can transfer", &LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this);
+ childSetCommitCallback("clickaction", &LLSidepanelTaskInfo::onCommitClickAction,this);
+ childSetCommitCallback("search_check", &LLSidepanelTaskInfo::onCommitIncludeInSearch,this);
+ return TRUE;
+}
+
+// virtual
+void LLSidepanelTaskInfo::setVisible(BOOL visible)
+{
+ LLPanel::setVisible(visible);
+ if (visible)
+ {
+ sActivePanel = this;
+ mObject = getFirstSelectedObject();
+ }
+ else
+ {
+ sActivePanel = NULL;
+ }
+}
+
+void LLSidepanelTaskInfo::disableAll()
+{
+ childSetEnabled("perm_modify", FALSE);
+ childSetText("perm_modify", LLStringUtil::null);
+
+ childSetEnabled("Creator:", FALSE);
+ childSetText("Creator Name", LLStringUtil::null);
+ childSetEnabled("Creator Name", FALSE);
+
+ childSetEnabled("Owner:", FALSE);
+ childSetText("Owner Name", LLStringUtil::null);
+ childSetEnabled("Owner Name", FALSE);
+
+ childSetEnabled("Group:", FALSE);
+ childSetText("Group Name", LLStringUtil::null);
+ childSetEnabled("Group Name", FALSE);
+ childSetEnabled("button set group", FALSE);
+
+ childSetText("Object Name", LLStringUtil::null);
+ childSetEnabled("Object Name", FALSE);
+ childSetEnabled("Name:", FALSE);
+ childSetText("Group Name", LLStringUtil::null);
+ childSetEnabled("Group Name", FALSE);
+ childSetEnabled("Description:", FALSE);
+ childSetText("Object Description", LLStringUtil::null);
+ childSetEnabled("Object Description", FALSE);
+
+ childSetEnabled("Permissions:", FALSE);
+
+ childSetValue("checkbox share with group", FALSE);
+ childSetEnabled("checkbox share with group", FALSE);
+ childSetEnabled("button deed", FALSE);
+
+ childSetValue("checkbox allow everyone move", FALSE);
+ childSetEnabled("checkbox allow everyone move", FALSE);
+ childSetValue("checkbox allow everyone copy", FALSE);
+ childSetEnabled("checkbox allow everyone copy", FALSE);
+
+ //Next owner can:
+ childSetEnabled("Next owner can:", FALSE);
+ childSetValue("checkbox next owner can modify", FALSE);
+ childSetEnabled("checkbox next owner can modify", FALSE);
+ childSetValue("checkbox next owner can copy", FALSE);
+ childSetEnabled("checkbox next owner can copy", FALSE);
+ childSetValue("checkbox next owner can transfer", FALSE);
+ childSetEnabled("checkbox next owner can transfer", FALSE);
+
+ //checkbox for sale
+ childSetValue("checkbox for sale", FALSE);
+ childSetEnabled("checkbox for sale", FALSE);
+
+ //checkbox include in search
+ childSetValue("search_check", FALSE);
+ childSetEnabled("search_check", FALSE);
+
+ LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
+ combo_sale_type->setValue(LLSaleInfo::FS_COPY);
+ combo_sale_type->setEnabled(FALSE);
+
+ childSetEnabled("Cost", FALSE);
+ childSetText("Cost", getString("Cost Default"));
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
+
+ childSetEnabled("label click action", FALSE);
+ LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
+ if (combo_click_action)
+ {
+ combo_click_action->setEnabled(FALSE);
+ combo_click_action->clear();
+ }
+ childSetVisible("B:", FALSE);
+ childSetVisible("O:", FALSE);
+ childSetVisible("G:", FALSE);
+ childSetVisible("E:", FALSE);
+ childSetVisible("N:", FALSE);
+ childSetVisible("F:", FALSE);
+
+ mOpenBtn->setEnabled(FALSE);
+ mPayBtn->setEnabled(FALSE);
+ mBuyBtn->setEnabled(FALSE);
+}
+
+void LLSidepanelTaskInfo::refresh()
+{
+ LLButton* btn_deed_to_group = getChild<LLButton>("button deed");
+ if (btn_deed_to_group)
+ {
+ std::string deedText;
+ if (gWarningSettings.getBOOL("DeedObject"))
+ {
+ deedText = getString("text deed continued");
+ }
+ else
+ {
+ deedText = getString("text deed");
+ }
+ btn_deed_to_group->setLabelSelected(deedText);
+ btn_deed_to_group->setLabelUnselected(deedText);
+ }
+
+ BOOL root_selected = TRUE;
+ LLSelectNode* nodep = mObjectSelection->getFirstRootNode();
+ S32 object_count = mObjectSelection->getRootObjectCount();
+ if (!nodep || (object_count == 0))
+ {
+ nodep = mObjectSelection->getFirstNode();
+ object_count = mObjectSelection->getObjectCount();
+ root_selected = FALSE;
+ }
+
+ LLViewerObject* objectp = NULL;
+ if (nodep)
+ {
+ objectp = nodep->getObject();
+ }
+
+ // ...nothing selected
+ if (!nodep || !objectp)
+ {
+ disableAll();
+ return;
+ }
+
+ // figure out a few variables
+ const BOOL is_one_object = (object_count == 1);
+
+ // BUG: fails if a root and non-root are both single-selected.
+ const BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) ||
+ LLSelectMgr::getInstance()->selectGetModify();
+ const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus();
+
+ S32 string_index = 0;
+ std::string MODIFY_INFO_STRINGS[] =
+ {
+ getString("text modify info 1"),
+ getString("text modify info 2"),
+ getString("text modify info 3"),
+ getString("text modify info 4")
+ };
+ if (!is_perm_modify)
+ {
+ string_index += 2;
+ }
+ if (!is_one_object)
+ {
+ ++string_index;
+ }
+ childSetEnabled("perm_modify", TRUE);
+ childSetText("perm_modify", MODIFY_INFO_STRINGS[string_index]);
+
+ childSetEnabled("Permissions:", TRUE);
+
+ // Update creator text field
+ childSetEnabled("Creator:", TRUE);
+ BOOL creators_identical;
+ std::string creator_name;
+ creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID,
+ creator_name);
+
+ childSetText("Creator Name", creator_name);
+ childSetEnabled("Creator Name", TRUE);
+
+ // Update owner text field
+ childSetEnabled("Owner:", TRUE);
+
+ std::string owner_name;
+ const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
+ if (mOwnerID.isNull())
+ {
+ if (LLSelectMgr::getInstance()->selectIsGroupOwned())
+ {
+ // Group owned already displayed by selectGetOwner
+ }
+ else
+ {
+ // Display last owner if public
+ std::string last_owner_name;
+ LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name);
+
+ // It should never happen that the last owner is null and the owner
+ // is null, but it seems to be a bug in the simulator right now. JC
+ if (!mLastOwnerID.isNull() && !last_owner_name.empty())
+ {
+ owner_name.append(", last ");
+ owner_name.append(last_owner_name);
+ }
+ }
+ }
+ childSetText("Owner Name", owner_name);
+ childSetEnabled("Owner Name", TRUE);
+
+ // update group text field
+ childSetEnabled("Group:", TRUE);
+ childSetText("Group Name", LLStringUtil::null);
+ LLUUID group_id;
+ BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id);
+ if (groups_identical)
+ {
+ if (mLabelGroupName)
+ {
+ mLabelGroupName->setNameID(group_id,TRUE);
+ mLabelGroupName->setEnabled(TRUE);
+ }
+ }
+ else
+ {
+ if (mLabelGroupName)
+ {
+ mLabelGroupName->setNameID(LLUUID::null, TRUE);
+ mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE);
+ mLabelGroupName->setEnabled(FALSE);
+ }
+ }
+
+ childSetEnabled("button set group", owners_identical && (mOwnerID == gAgent.getID()));
+
+ childSetEnabled("Name:", TRUE);
+ LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name");
+ childSetEnabled("Description:", TRUE);
+ LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description");
+
+ if (is_one_object)
+ {
+ if (keyboard_focus_view != LineEditorObjectName)
+ {
+ childSetText("Object Name",nodep->mName);
+ }
+
+ if (LineEditorObjectDesc)
+ {
+ if (keyboard_focus_view != LineEditorObjectDesc)
+ {
+ LineEditorObjectDesc->setText(nodep->mDescription);
+ }
+ }
+ }
+ else
+ {
+ childSetText("Object Name", LLStringUtil::null);
+ LineEditorObjectDesc->setText(LLStringUtil::null);
+ }
+
+ // figure out the contents of the name, description, & category
+ BOOL edit_name_desc = FALSE;
+ if (is_one_object && objectp->permModify())
+ {
+ edit_name_desc = TRUE;
+ }
+ if (edit_name_desc)
+ {
+ childSetEnabled("Object Name", TRUE);
+ childSetEnabled("Object Description", TRUE);
+ }
+ else
+ {
+ childSetEnabled("Object Name", FALSE);
+ childSetEnabled("Object Description", FALSE);
+ }
+
+ S32 total_sale_price = 0;
+ S32 individual_sale_price = 0;
+ BOOL is_for_sale_mixed = FALSE;
+ BOOL is_sale_price_mixed = FALSE;
+ U32 num_for_sale = FALSE;
+ LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale,
+ is_for_sale_mixed,
+ is_sale_price_mixed,
+ total_sale_price,
+ individual_sale_price);
+
+ const BOOL self_owned = (gAgent.getID() == mOwnerID);
+ const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ;
+ const BOOL public_owned = (mOwnerID.isNull() && !LLSelectMgr::getInstance()->selectIsGroupOwned());
+ const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer();
+ const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy();
+
+ if (!owners_identical)
+ {
+ childSetEnabled("Cost", FALSE);
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
+ }
+ // You own these objects.
+ else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))
+ {
+ // If there are multiple items for sale then set text to PRICE PER UNIT.
+ if (num_for_sale > 1)
+ {
+ childSetText("Cost", getString("Cost Per Unit"));
+ }
+ else
+ {
+ childSetText("Cost", getString("Cost Default"));
+ }
+
+ LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
+ if (!edit_price->hasFocus())
+ {
+ // If the sale price is mixed then set the cost to MIXED, otherwise
+ // set to the actual cost.
+ if ((num_for_sale > 0) && is_for_sale_mixed)
+ {
+ edit_price->setTentative(TRUE);
+ }
+ else if ((num_for_sale > 0) && is_sale_price_mixed)
+ {
+ edit_price->setTentative(TRUE);
+ }
+ else
+ {
+ edit_price->setValue(individual_sale_price);
+ }
+ }
+ // The edit fields are only enabled if you can sell this object
+ // and the sale price is not mixed.
+ BOOL enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : FALSE;
+ childSetEnabled("Cost", enable_edit);
+ childSetEnabled("Edit Cost", enable_edit);
+ }
+ // Someone, not you, owns these objects.
+ else if (!public_owned)
+ {
+ childSetEnabled("Cost", FALSE);
+ childSetEnabled("Edit Cost", FALSE);
+
+ // Don't show a price if none of the items are for sale.
+ if (num_for_sale)
+ childSetText("Edit Cost", llformat("%d",total_sale_price));
+ else
+ childSetText("Edit Cost", LLStringUtil::null);
+
+ // If multiple items are for sale, set text to TOTAL PRICE.
+ if (num_for_sale > 1)
+ childSetText("Cost", getString("Cost Total"));
+ else
+ childSetText("Cost", getString("Cost Default"));
+ }
+ // This is a public object.
+ else
+ {
+ childSetEnabled("Cost", FALSE);
+ childSetText("Cost", getString("Cost Default"));
+
+ childSetText("Edit Cost", LLStringUtil::null);
+ childSetEnabled("Edit Cost", FALSE);
+ }
+
+ // Enable and disable the permissions checkboxes
+ // based on who owns the object.
+ // TODO: Creator permissions
+
+ U32 base_mask_on = 0;
+ U32 base_mask_off = 0;
+ U32 owner_mask_off = 0;
+ U32 owner_mask_on = 0;
+ U32 group_mask_on = 0;
+ U32 group_mask_off = 0;
+ U32 everyone_mask_on = 0;
+ U32 everyone_mask_off = 0;
+ U32 next_owner_mask_on = 0;
+ U32 next_owner_mask_off = 0;
+
+ BOOL valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE,
+ &base_mask_on,
+ &base_mask_off);
+ //BOOL valid_owner_perms =//
+ LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER,
+ &owner_mask_on,
+ &owner_mask_off);
+ BOOL valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP,
+ &group_mask_on,
+ &group_mask_off);
+
+ BOOL valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE,
+ &everyone_mask_on,
+ &everyone_mask_off);
+
+ BOOL valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER,
+ &next_owner_mask_on,
+ &next_owner_mask_off);
+
+
+ if (gSavedSettings.getBOOL("DebugPermissions") )
+ {
+ if (valid_base_perms)
+ {
+ childSetText("B:", "B: " + mask_to_string(base_mask_on));
+ childSetVisible("B:", TRUE);
+
+ childSetText("O:", "O: " + mask_to_string(owner_mask_on));
+ childSetVisible("O:", TRUE);
+
+ childSetText("G:", "G: " + mask_to_string(group_mask_on));
+ childSetVisible("G:", TRUE);
+
+ childSetText("E:", "E: " + mask_to_string(everyone_mask_on));
+ childSetVisible("E:", TRUE);
+
+ childSetText("N:", "N: " + mask_to_string(next_owner_mask_on));
+ childSetVisible("N:", TRUE);
+ }
+
+ U32 flag_mask = 0x0;
+ if (objectp->permMove()) flag_mask |= PERM_MOVE;
+ if (objectp->permModify()) flag_mask |= PERM_MODIFY;
+ if (objectp->permCopy()) flag_mask |= PERM_COPY;
+ if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER;
+
+ childSetText("F:", "F:" + mask_to_string(flag_mask));
+ childSetVisible("F:", TRUE);
+ }
+ else
+ {
+ childSetVisible("B:", FALSE);
+ childSetVisible("O:", FALSE);
+ childSetVisible("G:", FALSE);
+ childSetVisible("E:", FALSE);
+ childSetVisible("N:", FALSE);
+ childSetVisible("F:", FALSE);
+ }
+
+ BOOL has_change_perm_ability = FALSE;
+ BOOL has_change_sale_ability = FALSE;
+
+ if (valid_base_perms &&
+ (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE))))
+ {
+ has_change_perm_ability = TRUE;
+ }
+ if (valid_base_perms &&
+ (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE))))
+ {
+ has_change_sale_ability = TRUE;
+ }
+
+ if (!has_change_perm_ability && !has_change_sale_ability && !root_selected)
+ {
+ // ...must select root to choose permissions
+ childSetValue("perm_modify", getString("text modify warning"));
+ }
+
+ if (has_change_perm_ability)
+ {
+ childSetEnabled("checkbox share with group", TRUE);
+ childSetEnabled("checkbox allow everyone move", owner_mask_on & PERM_MOVE);
+ childSetEnabled("checkbox allow everyone copy", owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER);
+ }
+ else
+ {
+ childSetEnabled("checkbox share with group", FALSE);
+ childSetEnabled("checkbox allow everyone move", FALSE);
+ childSetEnabled("checkbox allow everyone copy", FALSE);
+ }
+
+ if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER))
+ {
+ childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale));
+ // Set the checkbox to tentative if the prices of each object selected
+ // are not the same.
+ childSetTentative("checkbox for sale", is_for_sale_mixed);
+ childSetEnabled("sale type", num_for_sale && can_transfer && !is_sale_price_mixed);
+
+ childSetEnabled("Next owner can:", TRUE);
+ childSetEnabled("checkbox next owner can modify", base_mask_on & PERM_MODIFY);
+ childSetEnabled("checkbox next owner can copy", base_mask_on & PERM_COPY);
+ childSetEnabled("checkbox next owner can transfer", next_owner_mask_on & PERM_COPY);
+ }
+ else
+ {
+ childSetEnabled("checkbox for sale", FALSE);
+ childSetEnabled("sale type", FALSE);
+
+ childSetEnabled("Next owner can:", FALSE);
+ childSetEnabled("checkbox next owner can modify", FALSE);
+ childSetEnabled("checkbox next owner can copy", FALSE);
+ childSetEnabled("checkbox next owner can transfer", FALSE);
+ }
+
+ if (valid_group_perms)
+ {
+ if ((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE))
+ {
+ childSetValue("checkbox share with group", TRUE);
+ childSetTentative("checkbox share with group", FALSE);
+ childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
+ }
+ else if ((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE))
+ {
+ childSetValue("checkbox share with group", FALSE);
+ childSetTentative("checkbox share with group", FALSE);
+ childSetEnabled("button deed", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox share with group", TRUE);
+ childSetTentative("checkbox share with group", TRUE);
+ childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer);
+ }
+ }
+
+ if (valid_everyone_perms)
+ {
+ // Move
+ if (everyone_mask_on & PERM_MOVE)
+ {
+ childSetValue("checkbox allow everyone move", TRUE);
+ childSetTentative("checkbox allow everyone move", FALSE);
+ }
+ else if (everyone_mask_off & PERM_MOVE)
+ {
+ childSetValue("checkbox allow everyone move", FALSE);
+ childSetTentative("checkbox allow everyone move", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox allow everyone move", TRUE);
+ childSetTentative("checkbox allow everyone move", TRUE);
+ }
+
+ // Copy == everyone can't copy
+ if (everyone_mask_on & PERM_COPY)
+ {
+ childSetValue("checkbox allow everyone copy", TRUE);
+ childSetTentative("checkbox allow everyone copy", !can_copy || !can_transfer);
+ }
+ else if (everyone_mask_off & PERM_COPY)
+ {
+ childSetValue("checkbox allow everyone copy", FALSE);
+ childSetTentative("checkbox allow everyone copy", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox allow everyone copy", TRUE);
+ childSetTentative("checkbox allow everyone copy", TRUE);
+ }
+ }
+
+ if (valid_next_perms)
+ {
+ // Modify == next owner canot modify
+ if (next_owner_mask_on & PERM_MODIFY)
+ {
+ childSetValue("checkbox next owner can modify", TRUE);
+ childSetTentative("checkbox next owner can modify", FALSE);
+ }
+ else if (next_owner_mask_off & PERM_MODIFY)
+ {
+ childSetValue("checkbox next owner can modify", FALSE);
+ childSetTentative("checkbox next owner can modify", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox next owner can modify", TRUE);
+ childSetTentative("checkbox next owner can modify", TRUE);
+ }
+
+ // Copy == next owner cannot copy
+ if (next_owner_mask_on & PERM_COPY)
+ {
+ childSetValue("checkbox next owner can copy", TRUE);
+ childSetTentative("checkbox next owner can copy", !can_copy);
+ }
+ else if (next_owner_mask_off & PERM_COPY)
+ {
+ childSetValue("checkbox next owner can copy", FALSE);
+ childSetTentative("checkbox next owner can copy", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox next owner can copy", TRUE);
+ childSetTentative("checkbox next owner can copy", TRUE);
+ }
+
+ // Transfer == next owner cannot transfer
+ if (next_owner_mask_on & PERM_TRANSFER)
+ {
+ childSetValue("checkbox next owner can transfer", TRUE);
+ childSetTentative("checkbox next owner can transfer", !can_transfer);
+ }
+ else if (next_owner_mask_off & PERM_TRANSFER)
+ {
+ childSetValue("checkbox next owner can transfer", FALSE);
+ childSetTentative("checkbox next owner can transfer", FALSE);
+ }
+ else
+ {
+ childSetValue("checkbox next owner can transfer", TRUE);
+ childSetTentative("checkbox next owner can transfer", TRUE);
+ }
+ }
+
+ // reflect sale information
+ LLSaleInfo sale_info;
+ BOOL valid_sale_info = LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
+ LLSaleInfo::EForSale sale_type = sale_info.getSaleType();
+
+ LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
+ if (valid_sale_info)
+ {
+ combo_sale_type->setValue( sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type);
+ combo_sale_type->setTentative( FALSE); // unfortunately this doesn't do anything at the moment.
+ }
+ else
+ {
+ // default option is sell copy, determined to be safest
+ combo_sale_type->setValue( LLSaleInfo::FS_COPY);
+ combo_sale_type->setTentative( TRUE); // unfortunately this doesn't do anything at the moment.
+ }
+
+ childSetValue("checkbox for sale", (num_for_sale != 0));
+
+ // HACK: There are some old objects in world that are set for sale,
+ // but are no-transfer. We need to let users turn for-sale off, but only
+ // if for-sale is set.
+ bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY);
+ if (cannot_actually_sell)
+ {
+ if (num_for_sale && has_change_sale_ability)
+ {
+ childSetEnabled("checkbox for sale", true);
+ }
+ }
+
+ // Check search status of objects
+ const BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
+ bool include_in_search;
+ const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search);
+ childSetEnabled("search_check", has_change_sale_ability && all_volume);
+ childSetValue("search_check", include_in_search);
+ childSetTentative("search_check", !all_include_in_search);
+
+ // Click action (touch, sit, buy)
+ U8 click_action = 0;
+ if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action))
+ {
+ LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction");
+ if (ComboClickAction)
+ {
+ ComboClickAction->setCurrentByIndex((S32)click_action);
+ }
+ }
+ childSetEnabled("label click action", is_perm_modify && all_volume);
+ childSetEnabled("clickaction", is_perm_modify && all_volume);
+
+ if (!getIsEditing())
+ {
+ const std::string no_item_names[] =
+ {
+ "Object Name",
+ "Object Description",
+ "button set group",
+ "checkbox share with group",
+ "button deed",
+ "checkbox allow everyone move",
+ "checkbox allow everyone copy",
+ "checkbox for sale",
+ "sale type",
+ "Edit Cost",
+ "checkbox next owner can modify",
+ "checkbox next owner can copy",
+ "checkbox next owner can transfer",
+ "clickaction",
+ "search_check",
+ "perm_modify",
+ "Group Name",
+ };
+ for (size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
+ {
+ childSetEnabled(no_item_names[t], FALSE);
+ }
+ }
+ updateVerbs();
+}
+
+
+// static
+void LLSidepanelTaskInfo::onClickClaim(void*)
+{
+ // try to claim ownership
+ LLSelectMgr::getInstance()->sendOwner(gAgent.getID(), gAgent.getGroupID());
+}
+
+// static
+void LLSidepanelTaskInfo::onClickRelease(void*)
+{
+ // try to release ownership
+ LLSelectMgr::getInstance()->sendOwner(LLUUID::null, LLUUID::null);
+}
+
+void LLSidepanelTaskInfo::onClickGroup()
+{
+ LLUUID owner_id;
+ std::string name;
+ BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, name);
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+
+ if (owners_identical && (owner_id == gAgent.getID()))
+ {
+ LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID()));
+ if (fg)
+ {
+ fg->setSelectGroupCallback( boost::bind(&LLSidepanelTaskInfo::cbGroupID, this, _1) );
+ if (parent_floater)
+ {
+ LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg);
+ fg->setOrigin(new_rect.mLeft, new_rect.mBottom);
+ parent_floater->addDependentFloater(fg);
+ }
+ }
+ }
+}
+
+void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id)
+{
+ if (mLabelGroupName)
+ {
+ mLabelGroupName->setNameID(group_id, TRUE);
+ }
+ LLSelectMgr::getInstance()->sendGroup(group_id);
+}
+
+static bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
+{
+ const S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ LLUUID group_id;
+ const BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id);
+ if (group_id.notNull() && groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED)))
+ {
+ LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE);
+// LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT);
+ }
+ }
+ return FALSE;
+}
+
+void LLSidepanelTaskInfo::onClickDeedToGroup(void *data)
+{
+ LLNotificationsUtil::add("DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
+}
+
+///----------------------------------------------------------------------------
+/// Permissions checkboxes
+///----------------------------------------------------------------------------
+
+// static
+void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm)
+{
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
+ if(!object) return;
+
+ // Checkbox will have toggled itself
+ // LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
+ BOOL new_state = check->get();
+
+ LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitGroupShare(LLUICtrl *ctrl, void *data)
+{
+ onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneMove(LLUICtrl *ctrl, void *data)
+{
+ onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE);
+}
+
+
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data)
+{
+ onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data)
+{
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerModify" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data)
+{
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerCopy" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data)
+{
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerTransfer" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitName(LLUICtrl*, void* data)
+{
+ //llinfos << "LLSidepanelTaskInfo::onCommitName()" << llendl;
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name");
+ if(tb)
+ {
+ LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+// LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText());
+ }
+}
+
+
+// static
+void LLSidepanelTaskInfo::onCommitDesc(LLUICtrl*, void* data)
+{
+ //llinfos << "LLSidepanelTaskInfo::onCommitDesc()" << llendl;
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLLineEditor* le = self->getChild<LLLineEditor>("Object Description");
+ if(le)
+ {
+ LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+ }
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitSaleInfo(LLUICtrl*, void* data)
+{
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ self->setAllSaleInfo();
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitSaleType(LLUICtrl*, void* data)
+{
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ self->setAllSaleInfo();
+}
+
+
+void LLSidepanelTaskInfo::setAllSaleInfo()
+{
+ LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT;
+
+ LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale");
+
+ // Set the sale type if the object(s) are for sale.
+ if(checkPurchase && checkPurchase->get())
+ {
+ sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger());
+ }
+
+ S32 price = -1;
+
+ LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
+ price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger();
+
+ // If somehow an invalid price, turn the sale off.
+ if (price < 0)
+ sale_type = LLSaleInfo::FS_NOT;
+
+ LLSaleInfo old_sale_info;
+ LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
+
+ LLSaleInfo new_sale_info(sale_type, price);
+ LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
+
+ U8 old_click_action = 0;
+ LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
+
+ if (old_sale_info.isForSale()
+ && !new_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_BUY)
+ {
+ // If turned off for-sale, make sure click-action buy is turned
+ // off as well
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_TOUCH);
+ }
+ else if (new_sale_info.isForSale()
+ && !old_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_TOUCH)
+ {
+ // If just turning on for-sale, preemptively turn on one-click buy
+ // unless user have a different click action set
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_BUY);
+ }
+}
+
+struct LLSelectionPayable : public LLSelectedObjectFunctor
+{
+ virtual bool apply(LLViewerObject* obj)
+ {
+ // can pay if you or your parent has money() event in script
+ LLViewerObject* parent = (LLViewerObject*)obj->getParent();
+ return (obj->flagTakesMoney() ||
+ (parent && parent->flagTakesMoney()));
+ }
+};
+
+static U8 string_value_to_click_action(std::string p_value)
+{
+ if (p_value == "Touch")
+ return CLICK_ACTION_TOUCH;
+ if (p_value == "Sit")
+ return CLICK_ACTION_SIT;
+ if (p_value == "Buy")
+ return CLICK_ACTION_BUY;
+ if (p_value == "Pay")
+ return CLICK_ACTION_PAY;
+ if (p_value == "Open")
+ return CLICK_ACTION_OPEN;
+ if (p_value == "Zoom")
+ return CLICK_ACTION_ZOOM;
+ return CLICK_ACTION_TOUCH;
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*)
+{
+ LLComboBox* box = (LLComboBox*)ctrl;
+ if (!box) return;
+ std::string value = box->getValue().asString();
+ U8 click_action = string_value_to_click_action(value);
+ doClickAction(click_action);
+}
+
+// static
+void LLSidepanelTaskInfo::doClickAction(U8 click_action)
+{
+ if (click_action == CLICK_ACTION_BUY)
+ {
+ LLSaleInfo sale_info;
+ LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
+ if (!sale_info.isForSale())
+ {
+ LLNotificationsUtil::add("CantSetBuyObject");
+
+ // Set click action back to its old value
+ U8 click_action = 0;
+ LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
+// box->setCurrentByIndex((S32)click_action);
+
+ return;
+ }
+ }
+ else if (click_action == CLICK_ACTION_PAY)
+ {
+ // Verify object has script with money() handler
+ LLSelectionPayable payable;
+ bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable);
+ if (!can_pay)
+ {
+ // Warn, but do it anyway.
+ LLNotificationsUtil::add("ClickActionNotPayable");
+ }
+ }
+ LLSelectMgr::getInstance()->selectionSetClickAction(click_action);
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void* data)
+{
+ LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl;
+ llassert(box);
+ LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get());
+}
+
+// virtual
+void LLSidepanelTaskInfo::updateVerbs()
+{
+ LLSidepanelInventorySubpanel::updateVerbs();
+
+ /*
+ mOpenBtn->setVisible(!getIsEditing());
+ mPayBtn->setVisible(!getIsEditing());
+ mBuyBtn->setVisible(!getIsEditing());
+ //const LLViewerObject *obj = getFirstSelectedObject();
+ //mEditBtn->setEnabled(obj && obj->permModify());
+ */
+
+ mOpenBtn->setEnabled(enable_object_open());
+ mPayBtn->setEnabled(enable_pay_object());
+ mBuyBtn->setEnabled(enable_buy_object());
+}
+
+void LLSidepanelTaskInfo::onOpenButtonClicked()
+{
+ if (enable_object_open())
+ {
+ handle_object_open();
+ }
+}
+
+void LLSidepanelTaskInfo::onPayButtonClicked()
+{
+ doClickAction(CLICK_ACTION_PAY);
+}
+
+void LLSidepanelTaskInfo::onBuyButtonClicked()
+{
+ doClickAction(CLICK_ACTION_BUY);
+}
+
+// virtual
+void LLSidepanelTaskInfo::save()
+{
+ onCommitGroupShare(getChild<LLCheckBoxCtrl>("checkbox share with group"), this);
+ onCommitEveryoneMove(getChild<LLCheckBoxCtrl>("checkbox allow everyone move"), this);
+ onCommitEveryoneCopy(getChild<LLCheckBoxCtrl>("checkbox allow everyone copy"), this);
+ onCommitNextOwnerModify(getChild<LLCheckBoxCtrl>("checkbox next owner can modify"), this);
+ onCommitNextOwnerCopy(getChild<LLCheckBoxCtrl>("checkbox next owner can copy"), this);
+ onCommitNextOwnerTransfer(getChild<LLCheckBoxCtrl>("checkbox next owner can transfer"), this);
+ onCommitName(getChild<LLLineEditor>("Object Name"), this);
+ onCommitDesc(getChild<LLLineEditor>("Object Description"), this);
+ onCommitSaleInfo(NULL, this);
+ onCommitSaleType(NULL, this);
+ onCommitIncludeInSearch(getChild<LLCheckBoxCtrl>("search_check"), this);
+}
+
+void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection)
+{
+ mObjectSelection = selection;
+}
+
+LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel()
+{
+ return sActivePanel;
+}
+
+LLViewerObject* LLSidepanelTaskInfo::getObject()
+{
+ if (!mObject->isDead())
+ return mObject;
+ return NULL;
+}
+
+LLViewerObject* LLSidepanelTaskInfo::getFirstSelectedObject()
+{
+ LLSelectNode *node = mObjectSelection->getFirstRootNode();
+ if (node)
+ {
+ return node->getObject();
+ }
+ return NULL;
+}
+
+const LLUUID& LLSidepanelTaskInfo::getSelectedUUID()
+{
+ const LLViewerObject* obj = getFirstSelectedObject();
+ if (obj)
+ {
+ return obj->getID();
+ }
+ return LLUUID::null;
+}
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
new file mode 100644
index 0000000000..cf36c20767
--- /dev/null
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -0,0 +1,126 @@
+/**
+ * @file llsidepaneltaskinfo.h
+ * @brief LLSidepanelTaskInfo class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELTASKINFO_H
+#define LL_LLSIDEPANELTASKINFO_H
+
+#include "llsidepanelinventorysubpanel.h"
+#include "lluuid.h"
+#include "llselectmgr.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLSidepanelTaskInfo
+//
+// Panel for permissions of an object.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLNameBox;
+class LLCheckBoxCtrl;
+class LLViewerObject;
+
+class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel
+{
+public:
+ LLSidepanelTaskInfo();
+ virtual ~LLSidepanelTaskInfo();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setVisible(BOOL visible);
+
+ void setObjectSelection(LLObjectSelectionHandle selection);
+
+ const LLUUID& getSelectedUUID();
+ LLViewerObject* getFirstSelectedObject();
+
+ static LLSidepanelTaskInfo *getActivePanel();
+protected:
+ /*virtual*/ void refresh(); // refresh all labels as needed
+ /*virtual*/ void save();
+ /*virtual*/ void updateVerbs();
+
+ // statics
+ static void onClickClaim(void*);
+ static void onClickRelease(void*);
+ void onClickGroup();
+ void cbGroupID(LLUUID group_id);
+ static void onClickDeedToGroup(void*);
+
+ static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm);
+
+ static void onCommitGroupShare(LLUICtrl *ctrl, void *data);
+
+ static void onCommitEveryoneMove(LLUICtrl *ctrl, void *data);
+ static void onCommitEveryoneCopy(LLUICtrl *ctrl, void *data);
+
+ static void onCommitNextOwnerModify(LLUICtrl* ctrl, void* data);
+ static void onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data);
+ static void onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data);
+
+ static void onCommitName(LLUICtrl* ctrl, void* data);
+ static void onCommitDesc(LLUICtrl* ctrl, void* data);
+
+ static void onCommitSaleInfo(LLUICtrl* ctrl, void* data);
+ static void onCommitSaleType(LLUICtrl* ctrl, void* data);
+ void setAllSaleInfo();
+
+ static void onCommitClickAction(LLUICtrl* ctrl, void* data);
+ static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*);
+
+ static void doClickAction(U8 click_action);
+ void disableAll();
+
+private:
+ LLNameBox* mLabelGroupName; // group name
+
+ LLUUID mCreatorID;
+ LLUUID mOwnerID;
+ LLUUID mLastOwnerID;
+
+protected:
+ void onOpenButtonClicked();
+ void onPayButtonClicked();
+ void onBuyButtonClicked();
+private:
+ LLButton* mOpenBtn;
+ LLButton* mPayBtn;
+ LLButton* mBuyBtn;
+
+protected:
+ LLViewerObject* getObject();
+private:
+ LLViewerObject* mObject;
+ LLObjectSelectionHandle mObjectSelection;
+ static LLSidepanelTaskInfo* sActivePanel;
+};
+
+
+#endif // LL_LLSIDEPANELTASKINFO_H
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index a11ee05532..fba1503b4a 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -34,6 +34,7 @@
#include "lltextbox.h"
+#include "llagent.h"
#include "llbottomtray.h"
#include "llsidetray.h"
#include "llviewerwindow.h"
@@ -45,7 +46,7 @@
#include "llaccordionctrltab.h"
#include "llfloater.h" //for gFloaterView
-#include "lliconctrl.h"//for Home tab icon
+#include "lliconctrl.h"//for OpenClose tab icon
#include "llsidetraypanelcontainer.h"
#include "llwindow.h"//for SetCursor
#include "lltransientfloatermgr.h"
@@ -65,42 +66,12 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";
LLSideTray* LLSideTray::sInstance = 0;
-class LLSideTrayInfoPanel: public LLPanel
-{
-
-public:
- LLSideTrayInfoPanel():LLPanel()
- {
- setBorderVisible(true);
- }
-
- BOOL handleHover(S32 x, S32 y, MASK mask)
- {
- getWindow()->setCursor(UI_CURSOR_HAND);
- return TRUE;
- }
-
- BOOL handleMouseUp(S32 x, S32 y, MASK mask)
- {
- std::string name = getName();
- onCommit();
- LLSideTray::getInstance()->selectTabByName(name);
- return LLPanel::handleMouseUp(x,y,mask);
- }
- void reshape (S32 width, S32 height, BOOL called_from_parent )
- {
- return LLPanel::reshape(width, height, called_from_parent);
- }
-
-};
-
-static LLRegisterPanelClassWrapper<LLSideTrayInfoPanel> t_people("panel_sidetray_home_info");
-
LLSideTray* LLSideTray::getInstance()
{
if (!sInstance)
{
- sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",gViewerWindow->getRootView(), LLRootView::child_registry_t::instance());
+ sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance());
+ sInstance->setXMLFilename("panel_side_tray.xml");
}
return sInstance;
@@ -148,7 +119,6 @@ public:
/*virtual*/ bool addChild (LLView* view, S32 tab_group);
- void arrange (S32 width, S32 height);
void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
static LLSideTrayTab* createInstance ();
@@ -156,10 +126,9 @@ public:
const std::string& getDescription () const { return mDescription;}
const std::string& getTabTitle() const { return mTabTitle;}
- void draw();
-
void onOpen (const LLSD& key);
+ LLPanel *getPanel();
private:
std::string mTabTitle;
std::string mImage;
@@ -209,73 +178,43 @@ BOOL LLSideTrayTab::postBuild()
static const S32 splitter_margin = 1;
-//virtual
-void LLSideTrayTab::arrange(S32 width, S32 height )
-{
- if(!mMainPanel)
- return;
-
- S32 offset = 0;
-
- LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true);
-
- if(title_panel)
- {
- title_panel->setOrigin( 0, height - title_panel->getRect().getHeight() );
- offset = title_panel->getRect().getHeight();
- }
-
- LLRect sRect = mMainPanel->getRect();
- sRect.setLeftTopAndSize( splitter_margin, height - offset - splitter_margin, width - 2*splitter_margin, height - offset - 2*splitter_margin);
- mMainPanel->reshape(sRect.getWidth(),sRect.getHeight());
- mMainPanel->setRect(sRect);
-
-
-
-}
-
void LLSideTrayTab::reshape (S32 width, S32 height, BOOL called_from_parent )
{
- if(!mMainPanel)
- return;
- S32 offset = 0;
-
+ LLPanel::reshape(width, height, called_from_parent);
LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true);
-
- if(title_panel)
+ if (!title_panel)
{
- title_panel->setOrigin( 0, height - title_panel->getRect().getHeight() );
- title_panel->reshape(width,title_panel->getRect().getHeight());
- offset = title_panel->getRect().getHeight();
+ // not fully constructed yet
+ return;
}
-
-
- LLRect sRect = mMainPanel->getRect();
- sRect.setLeftTopAndSize( splitter_margin, height - offset - splitter_margin, width - 2*splitter_margin, height - offset - 2*splitter_margin);
- //mMainPanel->setMaxWidth(sRect.getWidth());
- mMainPanel->reshape(sRect.getWidth(), sRect.getHeight());
-
- mMainPanel->setRect(sRect);
+ S32 title_height = title_panel->getRect().getHeight();
+ title_panel->setOrigin( 0, height - title_height );
+ title_panel->reshape(width,title_height);
+ LLRect sRect;
+ sRect.setLeftTopAndSize( splitter_margin, height - title_height - splitter_margin,
+ width - 2*splitter_margin, height - title_height - 2*splitter_margin);
+ mMainPanel->setShape(sRect);
}
-void LLSideTrayTab::draw()
+void LLSideTrayTab::onOpen (const LLSD& key)
{
- LLPanel::draw();
+ LLPanel *panel = getPanel();
+ if(panel)
+ panel->onOpen(key);
}
-void LLSideTrayTab::onOpen (const LLSD& key)
+LLPanel* LLSideTrayTab::getPanel()
{
LLPanel* panel = dynamic_cast<LLPanel*>(mMainPanel);
- if(panel)
- panel->onOpen(key);
+ return panel;
}
LLSideTrayTab* LLSideTrayTab::createInstance ()
{
LLSideTrayTab::Params tab_params;
- tab_params.tab_title("Home");
+ tab_params.tab_title("openclose");
LLSideTrayTab* tab = LLUICtrlFactory::create<LLSideTrayTab>(tab_params);
return tab;
@@ -300,17 +239,25 @@ LLSideTray::LLSideTray(Params& params)
,mActiveTab(0)
,mCollapsed(false)
,mCollapseButton(0)
- ,mMaxBarWidth(params.rect.width)
{
mCollapsed=params.collapsed;
-
LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
// register handler function to process data from the xml.
// panel_name should be specified via "parameter" attribute.
commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
LLTransientFloaterMgr::getInstance()->addControlView(this);
+ LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
+ if (side_bar_tabs != NULL)
+ {
+ LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+ }
+
+ LLPanel::Params p;
+ p.name = "buttons_panel";
+ p.mouse_opaque = false;
+ mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p);
}
@@ -389,7 +336,8 @@ bool LLSideTray::selectTabByName (const std::string& name)
return true;
}
-LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback)
+LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,const std::string& tooltip,
+ LLUICtrl::commit_callback_t callback)
{
static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
@@ -399,7 +347,7 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i
rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height);
bparams.name(name);
- bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM);
+ bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP);
bparams.rect (rect);
bparams.tab_stop(false);
bparams.image_unselected.name(sidetray_params.tab_btn_image_normal);
@@ -410,13 +358,15 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i
LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);
button->setLabel(name);
button->setClickedCallback(callback);
+
+ button->setToolTip(tooltip);
if(image.length())
{
button->setImageOverlay(image);
}
- addChildInBack(button);
+ mButtonsPanel->addChildInBack(button);
return button;
}
@@ -444,32 +394,46 @@ void LLSideTray::createButtons ()
std::string name = sidebar_tab->getName();
- // The "home" button will open/close the whole panel, this will need to
- // change if the home screen becomes its own tab.
- if (name == "sidebar_home")
+ // The "OpenClose" button will open/close the whole panel
+ if (name == "sidebar_openclose")
{
- mCollapseButton = createButton("",sidebar_tab->mImage,
+ mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
boost::bind(&LLSideTray::onToggleCollapse, this));
}
else
{
- LLButton* button = createButton("",sidebar_tab->mImage,
+ LLButton* button = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
boost::bind(&LLSideTray::onTabButtonClick, this, name));
mTabButtons[name] = button;
}
}
}
+void LLSideTray::processTriState ()
+{
+ if(mCollapsed)
+ expandSideBar();
+ else
+ {
+#if 0 // *TODO: EXT-2092
+
+ // Tell the active task panel to switch to its default view
+ // or collapse side tray if already on the default view.
+ LLSD info;
+ info["task-panel-action"] = "handle-tri-state";
+ mActiveTab->notifyChildren(info);
+#else
+ collapseSideBar();
+#endif
+ }
+}
+
void LLSideTray::onTabButtonClick(string name)
{
LLSideTrayTab* side_bar = getTab(name);
-
if(side_bar == mActiveTab)
{
- if(mCollapsed)
- expandSideBar();
- else
- collapseSideBar();
+ processTriState ();
return;
}
selectTabByName (name);
@@ -482,7 +446,7 @@ void LLSideTray::onToggleCollapse()
if(mCollapsed)
{
expandSideBar();
- selectTabByName("sidebar_home");
+ //selectTabByName("sidebar_openclose");
}
else
collapseSideBar();
@@ -491,7 +455,7 @@ void LLSideTray::onToggleCollapse()
void LLSideTray::reflectCollapseChange()
{
- setPanelRect();
+ updateSidetrayVisibility();
if(mCollapsed)
{
@@ -500,23 +464,24 @@ void LLSideTray::reflectCollapseChange()
}
else
{
- gFloaterView->setSnapOffsetRight(mMaxBarWidth);
+ gFloaterView->setSnapOffsetRight(getRect().getWidth());
setFocus(TRUE);
}
gFloaterView->refresh();
}
-void LLSideTray::arrange ()
+void LLSideTray::arrange()
{
static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
- setPanelRect();
+ updateSidetrayVisibility();
LLRect ctrl_rect;
- ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-sidetray_params.default_button_width
- ,sidetray_params.default_button_width
- ,sidetray_params.default_button_height);
+ ctrl_rect.setLeftTopAndSize(0,
+ mButtonsPanel->getRect().getHeight() - sidetray_params.default_button_width,
+ sidetray_params.default_button_width,
+ sidetray_params.default_button_height);
mCollapseButton->setRect(ctrl_rect);
@@ -528,9 +493,10 @@ void LLSideTray::arrange ()
{
LLSideTrayTab* sidebar_tab = *child_it;
- ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset
- ,sidetray_params.default_button_width
- ,sidetray_params.default_button_height);
+ ctrl_rect.setLeftTopAndSize(0,
+ mButtonsPanel->getRect().getHeight()-offset,
+ sidetray_params.default_button_width,
+ sidetray_params.default_button_height);
if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end())
continue;
@@ -544,14 +510,11 @@ void LLSideTray::arrange ()
btn->setVisible(ctrl_rect.mBottom > 0);
}
- ctrl_rect.setLeftTopAndSize(sidetray_params.default_button_width,getRect().getHeight(),mMaxBarWidth,getRect().getHeight());
-
//arrange tabs
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+ for ( child_vector_t::iterator child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
{
LLSideTrayTab* sidebar_tab = *child_it;
- sidebar_tab->setRect(ctrl_rect);
- sidebar_tab->arrange(mMaxBarWidth,getRect().getHeight());
+ sidebar_tab->setShape(getLocalRect());
}
}
@@ -574,13 +537,13 @@ void LLSideTray::collapseSideBar()
}
}
- // Home tab doesn't put its button in mTabButtons
- LLSideTrayTab* home_tab = getTab("sidebar_home");
- if (home_tab)
+ // OpenClose tab doesn't put its button in mTabButtons
+ LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
+ if (openclose_tab)
{
- mCollapseButton->setImageOverlay( home_tab->mImage );
+ mCollapseButton->setImageOverlay( openclose_tab->mImage );
}
- mActiveTab->setVisible(FALSE);
+ //mActiveTab->setVisible(FALSE);
reflectCollapseChange();
setFocus( FALSE );
@@ -589,16 +552,26 @@ void LLSideTray::collapseSideBar()
void LLSideTray::expandSideBar()
{
mCollapsed = false;
- LLSideTrayTab* home_tab = getTab("sidebar_home");
- if (home_tab)
+ LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
+ if (openclose_tab)
{
- mCollapseButton->setImageOverlay( home_tab->mImageSelected );
+ mCollapseButton->setImageOverlay( openclose_tab->mImageSelected );
}
LLSD key;//empty
mActiveTab->onOpen(key);
- mActiveTab->setVisible(TRUE);
reflectCollapseChange();
+
+
+ std::string name = mActiveTab->getName();
+ std::map<std::string,LLButton*>::const_iterator btn_it =
+ mTabButtons.find(name);
+ if (btn_it != mTabButtons.end())
+ {
+ LLButton* btn = btn_it->second;
+ btn->setImageOverlay( mActiveTab->mImageSelected );
+ }
+
}
void LLSideTray::highlightFocused()
@@ -612,15 +585,6 @@ void LLSideTray::highlightFocused()
*/
}
-BOOL LLSideTray::handleScrollWheel(S32 x, S32 y, S32 mask)
-{
- BOOL ret = LLPanel::handleScrollWheel(x,y,mask);
-
- if(!ret && childFromPoint(x,y) != 0 )
- return TRUE;//mouse wheel over sidetray buttons, eat mouse wheel
- return ret;
-}
-
//virtual
BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask)
{
@@ -630,58 +594,13 @@ BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask)
return ret;
}
-void LLSideTray::reshape (S32 width, S32 height, BOOL called_from_parent)
+void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
{
-
LLPanel::reshape(width, height, called_from_parent);
if(!mActiveTab)
return;
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- setPanelRect();
-
- LLRect ctrl_rect;
- ctrl_rect.setLeftTopAndSize(0
- ,getRect().getHeight()-sidetray_params.default_button_width
- ,sidetray_params.default_button_width
- ,sidetray_params.default_button_height);
-
- mCollapseButton->setRect(ctrl_rect);
-
- //arrange tab buttons
- child_vector_const_iter_t child_it;
- int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset
- ,sidetray_params.default_button_width
- ,sidetray_params.default_button_height);
-
- if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end())
- continue;
-
- LLButton* btn = mTabButtons[sidebar_tab->getName()];
-
- btn->setRect(ctrl_rect);
- offset+=sidetray_params.default_button_height;
- offset+=sidetray_params.default_button_margin;
-
- btn->setVisible(ctrl_rect.mBottom > 0);
- }
-
- //arrange tabs
-
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
- sidebar_tab->reshape(mMaxBarWidth,getRect().getHeight());
- ctrl_rect.setLeftTopAndSize(sidetray_params.default_button_width,getRect().getHeight(),mMaxBarWidth,getRect().getHeight());
- sidebar_tab->setRect(ctrl_rect);
-
- }
+ arrange();
}
/**
@@ -725,46 +644,93 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para
return NULL;
}
-// *TODO: Eliminate magic constants.
-static const S32 fake_offset = 132;
-static const S32 fake_top_offset = 18;
-
-void LLSideTray::resetPanelRect ()
+void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
{
- const LLRect& parent_rect = gViewerWindow->getRootView()->getRect();
-
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- S32 panel_width = sidetray_params.default_button_width;
- panel_width += mCollapsed ? 0 : mMaxBarWidth;
+ if(!sub_panel)
+ return;
- S32 panel_height = parent_rect.getHeight()-fake_top_offset;
+ if (sub_panel->isInVisibleChain())
+ {
+ LLSideTray::getInstance()->collapseSideBar();
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel(panel_name, params);
+ }
+}
- reshape(panel_width,panel_height);
+// This is just LLView::findChildView specialized to restrict the search to LLPanels.
+// Optimization for EXT-4068 to avoid searching down to the individual item level
+// when inventories are large.
+LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
+{
+ for (LLView::child_list_const_iter_t child_it = panel->beginChild();
+ child_it != panel->endChild(); ++child_it)
+ {
+ LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
+ if (!child_panel)
+ continue;
+ if (child_panel->getName() == name)
+ return child_panel;
+ }
+ if (recurse)
+ {
+ for (LLView::child_list_const_iter_t child_it = panel->beginChild();
+ child_it != panel->endChild(); ++child_it)
+ {
+ LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
+ if (!child_panel)
+ continue;
+ LLPanel *found_panel = findChildPanel(child_panel,name,recurse);
+ if (found_panel)
+ {
+ return found_panel;
+ }
+ }
+ }
+ return NULL;
}
-void LLSideTray::setPanelRect ()
+LLPanel* LLSideTray::getPanel(const std::string& panel_name)
{
- LLNavigationBar* nav_bar = LLNavigationBar::getInstance();
- LLRect nav_rect = nav_bar->getRect();
-
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
+ for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+ {
+ LLPanel *panel = findChildPanel(*child_it,panel_name,true);
+ if(panel)
+ {
+ return panel;
+ }
+ }
+ return NULL;
+}
- const LLRect& parent_rect = gViewerWindow->getRootView()->getRect();
+LLPanel* LLSideTray::getActivePanel()
+{
+ if (mActiveTab && !mCollapsed)
+ {
+ return mActiveTab->getPanel();
+ }
+ return NULL;
+}
- S32 panel_width = sidetray_params.default_button_width;
- panel_width += mCollapsed ? 0 : mMaxBarWidth;
+bool LLSideTray::isPanelActive(const std::string& panel_name)
+{
+ LLPanel *panel = getActivePanel();
+ if (!panel) return false;
+ return (panel->getName() == panel_name);
+}
- S32 panel_height = parent_rect.getHeight()-fake_top_offset - nav_rect.getHeight();
- S32 panel_top = parent_rect.mTop-fake_top_offset - nav_rect.getHeight();
- LLRect panel_rect;
- panel_rect.setLeftTopAndSize( parent_rect.mRight-panel_width, panel_top, panel_width, panel_height);
- setRect(panel_rect);
-}
+// *TODO: Eliminate magic constants.
+static const S32 fake_offset = 132;
+static const S32 fake_top_offset = 18;
-S32 LLSideTray::getTrayWidth()
+void LLSideTray::updateSidetrayVisibility()
{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
- return getRect().getWidth() - (sidetray_params.default_button_width + sidetray_params.default_button_margin);
+ // set visibility of parent container based on collapsed state
+ if (getParent())
+ {
+ getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook());
+ }
}
+
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index b49251ec79..140a9c818a 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -36,8 +36,8 @@
#include "llpanel.h"
#include "string"
-class LLSideTrayTab;
class LLAccordionCtrl;
+class LLSideTrayTab;
// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions
// while disconnecting viewer in LLAppViewer::disconnectViewer().
@@ -94,7 +94,26 @@ public:
* if no such tab - return NULL, otherwise a pointer to the panel
* Pass params as array, or they may be overwritten(example - params["name"]="nearby")
*/
- LLPanel* showPanel (const std::string& panel_name, const LLSD& params);
+ LLPanel* showPanel (const std::string& panel_name, const LLSD& params);
+
+ /**
+ * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
+ * If "sub_panel" is not visible Side Tray is opened to display it,
+ * otherwise Side Tray is collapsed.
+ * params are passed to "panel_name" panel onOpen().
+ */
+ void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params);
+
+ /*
+ * get the panel (don't show it or do anything else with it)
+ */
+ LLPanel* getPanel (const std::string& panel_name);
+ LLPanel* getActivePanel ();
+ bool isPanelActive (const std::string& panel_name);
+ /*
+ * get currently active tab
+ */
+ const LLSideTrayTab* getActiveTab() const { return mActiveTab; }
/*
* collapse SideBar, hiding visible tab and moving tab buttons
@@ -115,9 +134,13 @@ public:
void setVisible(BOOL visible)
{
- LLPanel::setVisible(visible);
+ if (getParent()) getParent()->setVisible(visible);
}
+ LLPanel* getButtonsPanel() { return mButtonsPanel; }
+
+ bool getCollapsed() { return mCollapsed; }
+
public:
virtual ~LLSideTray(){};
@@ -129,28 +152,24 @@ public:
bool addChild (LLView* view, S32 tab_group);
BOOL handleMouseDown (S32 x, S32 y, MASK mask);
- BOOL handleScrollWheel(S32 x, S32 y, S32 mask);
void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
- S32 getTrayWidth();
- void resetPanelRect ();
+ void processTriState ();
+ void updateSidetrayVisibility();
protected:
LLSideTrayTab* getTab (const std::string& name);
void createButtons ();
- LLButton* createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback);
+ LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
+ LLUICtrl::commit_callback_t callback);
void arrange ();
void reflectCollapseChange();
void toggleTabButton (LLSideTrayTab* tab);
- void setPanelRect ();
-
-
-
private:
// Implementation of LLDestroyClass<LLSideTray>
static void destroyClass()
@@ -160,18 +179,17 @@ private:
LLSideTray::getInstance()->setEnabled(FALSE);
}
-
private:
- std::map<std::string,LLButton*> mTabButtons;
+ LLPanel* mButtonsPanel;
+ typedef std::map<std::string,LLButton*> button_map_t;
+ button_map_t mTabButtons;
child_vector_t mTabs;
LLSideTrayTab* mActiveTab;
LLButton* mCollapseButton;
bool mCollapsed;
- S32 mMaxBarWidth;
-
static LLSideTray* sInstance;
};
diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp
index 3024492ab9..f2215a2250 100644
--- a/indra/newview/llsidetraypanelcontainer.cpp
+++ b/indra/newview/llsidetraypanelcontainer.cpp
@@ -38,6 +38,7 @@ static LLDefaultChildRegistry::Register<LLSideTrayPanelContainer> r2("panel_cont
std::string LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME = "sub_panel_name";
LLSideTrayPanelContainer::Params::Params()
+ : default_panel_name("default_panel_name")
{
// Always hide tabs.
hide_tabs(true);
@@ -45,6 +46,7 @@ LLSideTrayPanelContainer::Params::Params()
LLSideTrayPanelContainer::LLSideTrayPanelContainer(const Params& p)
: LLTabContainer(p)
+ , mDefaultPanelName(p.default_panel_name)
{
}
@@ -53,19 +55,14 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)
// Select specified panel and save navigation history.
if(key.has(PARAM_SUB_PANEL_NAME))
{
+ //*NOTE dzaporozhan
+ // Navigation history is not used after fix for EXT-3186,
+ // openPreviousPanel() always opens default panel
+
// Save panel navigation history
std::string panel_name = key[PARAM_SUB_PANEL_NAME];
- S32 old_index = getCurrentPanelIndex();
selectTabByName(panel_name);
-
- S32 new_index = getCurrentPanelIndex();
-
- // Don't update navigation history if we are opening same panel again.
- if(old_index != new_index)
- {
- mPanelHistory[panel_name] = old_index;
- }
}
// Will reopen current panel if no panel name was passed.
getCurrentPanel()->onOpen(key);
@@ -73,11 +70,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)
void LLSideTrayPanelContainer::openPreviousPanel()
{
- std::string current_panel_name = getCurrentPanel()->getName();
- panel_navigation_history_t::const_iterator it = mPanelHistory.find(current_panel_name);
- if(mPanelHistory.end() != it)
+ if(!mDefaultPanelName.empty())
+ {
+ selectTabByName(mDefaultPanelName);
+ }
+ else
{
- selectTab(it->second);
+ selectTab(0);
}
}
diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h
index 3f3cb552f8..beed328269 100644
--- a/indra/newview/llsidetraypanelcontainer.h
+++ b/indra/newview/llsidetraypanelcontainer.h
@@ -51,6 +51,7 @@ public:
struct Params : public LLInitParam::Block<Params, LLTabContainer::Params>
{
+ Optional<std::string> default_panel_name;
Params();
};
@@ -90,6 +91,7 @@ protected:
// Navigation history
panel_navigation_history_t mPanelHistory;
+ std::string mDefaultPanelName;
};
#endif //LL_LLSIDETRAY_PANEL_CONTAINER_H
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 37e268ad34..e4773f99c5 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -39,7 +39,14 @@
const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app.";
const std::string LLSLURL::PREFIX_SL = "sl://";
const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://";
-const std::string LLSLURL::PREFIX_SLURL = "http://slurl.com/secondlife/";
+const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/";
+
+// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
+// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this
+// version is required also.
+const std::string LLSLURL::PREFIX_SLURL_WWW = "http://www.slurl.com/secondlife/";
+
+const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/";
const std::string LLSLURL::APP_TOKEN = "app/";
@@ -63,6 +70,14 @@ std::string LLSLURL::stripProtocol(const std::string& url)
{
stripped.erase(0, PREFIX_SLURL.length());
}
+ else if (matchPrefix(stripped, PREFIX_SLURL_OLD))
+ {
+ stripped.erase(0, PREFIX_SLURL_OLD.length());
+ }
+ else if (matchPrefix(stripped, PREFIX_SLURL_WWW))
+ {
+ stripped.erase(0, PREFIX_SLURL_WWW.length());
+ }
return stripped;
}
@@ -74,6 +89,8 @@ bool LLSLURL::isSLURL(const std::string& url)
if (matchPrefix(url, PREFIX_SL)) return true;
if (matchPrefix(url, PREFIX_SECONDLIFE)) return true;
if (matchPrefix(url, PREFIX_SLURL)) return true;
+ if (matchPrefix(url, PREFIX_SLURL_OLD)) return true;
+ if (matchPrefix(url, PREFIX_SLURL_WWW)) return true;
return false;
}
@@ -83,7 +100,9 @@ bool LLSLURL::isSLURLCommand(const std::string& url)
{
if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||
matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||
- matchPrefix(url, PREFIX_SLURL + APP_TOKEN) )
+ matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ||
+ matchPrefix(url, PREFIX_SLURL_WWW + APP_TOKEN) ||
+ matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )
{
return true;
}
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index 05b0143e72..6a695e84f3 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -50,6 +50,8 @@ public:
static const std::string PREFIX_SL;
static const std::string PREFIX_SECONDLIFE;
static const std::string PREFIX_SLURL;
+ static const std::string PREFIX_SLURL_OLD;
+ static const std::string PREFIX_SLURL_WWW;
static const std::string APP_TOKEN;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 9f317803ce..2a57d48f16 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -294,7 +294,7 @@ LLSpatialGroup::~LLSpatialGroup()
sNodeCount--;
- if (gGLManager.mHasOcclusionQuery && mOcclusionQuery)
+ if (gGLManager.mHasOcclusionQuery && mOcclusionQuery[LLViewerCamera::sCurCameraID])
{
sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
}
@@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()
BOOL LLSpatialGroup::isRecentlyVisible() const
{
- return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ;
+ return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;
}
BOOL LLSpatialGroup::isVisible() const
@@ -2460,7 +2460,6 @@ void renderOctree(LLSpatialGroup* group)
gGL.color4fv(col.mV);
drawBox(group->mObjectBounds[0], group->mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
- glDepthMask(GL_TRUE);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (group->mBuilt <= 0.f)
@@ -2608,6 +2607,7 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
break;
case LL_PCODE_LEGACY_TREE:
gGL.color4f(0,0.5f,0,1);
+ break;
default:
gGL.color4f(1,0,1,1);
break;
@@ -2679,8 +2679,7 @@ void renderTexturePriority(LLDrawable* drawable)
//LLViewerTexture* imagep = facep->getTexture();
//if (imagep)
{
-
- //F32 vsize = LLVOVolume::getTextureVirtualSize(facep);
+
//F32 vsize = imagep->mMaxVirtualSize;
F32 vsize = facep->getPixelArea();
@@ -2704,7 +2703,7 @@ void renderTexturePriority(LLDrawable* drawable)
drawBox(center, size);
/*S32 boost = imagep->getBoostLevel();
- if (boost)
+ if (boost>LLViewerTexture::BOOST_NONE)
{
F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1);
LLVector4 col = lerp(boost_cold, boost_hot, t);
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
new file mode 100644
index 0000000000..c5c311ed33
--- /dev/null
+++ b/indra/newview/llspeakbutton.cpp
@@ -0,0 +1,186 @@
+/**
+* @file llspeakbutton.cpp
+* @brief LLSpeakButton class implementation
+*
+* $LicenseInfo:firstyear=2002&license=viewergpl$
+*
+* Copyright (c) 2002-2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llbutton.h"
+#include "llfloaterreg.h"
+
+#include "llagent.h"
+#include "llbottomtray.h"
+#include "llcallfloater.h"
+#include "lloutputmonitorctrl.h"
+#include "lltransientfloatermgr.h"
+
+#include "llspeakbutton.h"
+
+static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLSpeakButton::Params::Params()
+ : speak_button("speak_button")
+ , show_button("show_button")
+ , monitor("monitor")
+{
+ // See widgets/talk_button.xml
+}
+
+void LLSpeakButton::draw()
+{
+ // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
+ bool openmic = gVoiceClient->getUserPTTState();
+ bool voiceenabled = gVoiceClient->voiceEnabled();
+ mSpeakBtn->setToggleState(openmic && voiceenabled);
+ mOutputMonitor->setIsMuted(!voiceenabled);
+ LLUICtrl::draw();
+}
+void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
+{
+ LLButton* speak_btn = getChild<LLButton>("speak_btn");
+ speak_btn->setEnabled(enabled);
+}
+void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
+{
+ LLButton* show_btn = getChild<LLButton>("speak_flyout_btn");
+ show_btn->setEnabled(enabled);
+}
+
+LLSpeakButton::LLSpeakButton(const Params& p)
+: LLUICtrl(p)
+, mOutputMonitor(NULL)
+, mSpeakBtn(NULL)
+, mShowBtn(NULL)
+{
+ LLRect rect = p.rect();
+ LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0);
+ LLRect show_rect = p.show_button.rect();
+ show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0);
+
+ speak_rect.mRight -= show_rect.getWidth();
+ show_rect.mLeft = speak_rect.getWidth();
+ show_rect.mRight = rect.getWidth();
+
+ LLButton::Params speak_params = p.speak_button;
+ speak_params.rect(speak_rect);
+ mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params);
+ addChild(mSpeakBtn);
+ LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn);
+
+ mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this));
+ mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this));
+ mSpeakBtn->setToggleState(FALSE);
+
+ LLButton::Params show_params = p.show_button;
+ show_params.rect(show_rect);
+ mShowBtn = LLUICtrlFactory::create<LLButton>(show_params);
+ addChild(mShowBtn);
+ LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
+
+// mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
+// mShowBtn->setToggleState(FALSE);
+
+ static const S32 MONITOR_RIGHT_PAD = 2;
+
+ LLRect monitor_rect = p.monitor.rect();
+ S32 monitor_height = monitor_rect.getHeight();
+ monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD;
+ monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD;
+ monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2);
+ monitor_rect.mTop = monitor_rect.mBottom + monitor_height;
+
+ LLOutputMonitorCtrl::Params monitor_params = p.monitor;
+ monitor_params.draw_border(false);
+ monitor_params.rect(monitor_rect);
+ monitor_params.auto_update(true);
+ monitor_params.speaker_id(gAgentID);
+ mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params);
+ mSpeakBtn->addChild(mOutputMonitor);
+
+ // never show "muted" because you can't mute yourself
+ mOutputMonitor->setIsMuted(false);
+ mOutputMonitor->setIsAgentControl(true);
+
+ //*TODO find a better place to do that
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
+}
+
+LLSpeakButton::~LLSpeakButton()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn);
+ LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
+}
+
+void LLSpeakButton::setSpeakToolTip(const std::string& msg)
+{
+ mSpeakBtn->setToolTip(msg);
+}
+
+void LLSpeakButton::setShowToolTip(const std::string& msg)
+{
+ mShowBtn->setToolTip(msg);
+}
+
+void LLSpeakButton::setLabelVisible(bool visible)
+{
+ static std::string label_selected = mSpeakBtn->getLabelSelected();
+ static std::string label_unselected = mSpeakBtn->getLabelUnselected();
+
+ if (visible)
+ {
+ mSpeakBtn->setLabelSelected(label_selected);
+ mSpeakBtn->setLabelUnselected(label_unselected);
+ }
+ else
+ {
+ static LLStringExplicit empty_string("");
+ mSpeakBtn->setLabelSelected(empty_string);
+ mSpeakBtn->setLabelUnselected(empty_string);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PROTECTED SECTION
+//////////////////////////////////////////////////////////////////////////
+void LLSpeakButton::onMouseDown_SpeakBtn()
+{
+ bool down = true;
+ gVoiceClient->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
+}
+void LLSpeakButton::onMouseUp_SpeakBtn()
+{
+ bool down = false;
+ gVoiceClient->inputUserControlState(down);
+}
+
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
new file mode 100644
index 0000000000..85c97f1a2c
--- /dev/null
+++ b/indra/newview/llspeakbutton.h
@@ -0,0 +1,100 @@
+/**
+* @file llspeakbutton.h
+* @brief LLSpeakButton class header file
+*
+* $LicenseInfo:firstyear=2002&license=viewergpl$
+*
+* Copyright (c) 2002-2009, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLSPEAKBUTTON_H
+#define LL_LLSPEAKBUTTON_H
+
+#include "llinitparam.h"
+#include "lluictrl.h"
+
+class LLCallFloater;
+class LLButton;
+class LLOutputMonitorCtrl;
+
+/*
+ * Button displaying voice chat status. Displays voice chat options when
+ * clicked.
+*/
+class LLSpeakButton : public LLUICtrl
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<LLButton::Params>
+ speak_button,
+ show_button;
+
+ Optional<LLOutputMonitorCtrl::Params> monitor;
+
+ Params();
+ };
+
+ /*virtual*/ ~LLSpeakButton();
+ /*virtual*/ void draw();
+
+ // methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
+ void setSpeakBtnEnabled(bool enabled);
+ void setFlyoutBtnEnabled(bool enabled);
+
+ // *HACK: Need to put tooltips in a translatable location,
+ // the panel that contains this button.
+ void setSpeakToolTip(const std::string& msg);
+ void setShowToolTip(const std::string& msg);
+
+ /**
+ * Sets visibility of speak button's label according to passed parameter.
+ *
+ * It removes label/selected label if "visible" is false and restores otherwise.
+ *
+ * @param visible if true - show label and selected label.
+ *
+ * @see mSpeakBtn
+ * @see LLBottomTray::processShrinkButtons()
+ */
+ void setLabelVisible(bool visible);
+
+protected:
+ friend class LLUICtrlFactory;
+ LLSpeakButton(const Params& p);
+
+ void onMouseDown_SpeakBtn();
+ void onMouseUp_SpeakBtn();
+
+private:
+ LLButton* mSpeakBtn;
+ LLButton* mShowBtn;
+ LLHandle<LLFloater> mPrivateCallPanel;
+ LLOutputMonitorCtrl* mOutputMonitor;
+};
+
+#endif // LL_LLSPEAKBUTTON_H
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 2341fcfc6d..717a8bda1e 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llappviewer.h"
+#include "llimview.h"
#include "llmutelist.h"
#include "llsdutil.h"
#include "lluicolortable.h"
@@ -43,7 +44,6 @@
#include "llvoavatar.h"
#include "llworld.h"
-const F32 SPEAKER_TIMEOUT = 10.f; // seconds of not being on voice channel before removed from list of active speakers
const LLColor4 INACTIVE_COLOR(0.3f, 0.3f, 0.3f, 0.5f);
const LLColor4 ACTIVE_COLOR(0.5f, 0.5f, 0.5f, 1.f);
@@ -70,10 +70,6 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy
{
mDisplayName = name;
}
-
- gVoiceClient->setUserVolume(id, LLMuteList::getInstance()->getSavedResidentVolume(id));
-
- mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
}
@@ -87,6 +83,26 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c
mDisplayName = first + " " + last;
}
+bool LLSpeaker::isInVoiceChannel()
+{
+ return mStatus == LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
+}
+
+LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source)
+: LLEvent(source, "Speaker add moderator event"),
+ mSpeakerID (source->mID),
+ mIsModerator (source->mIsModerator)
+{
+}
+
+LLSD LLSpeakerUpdateModeratorEvent::getValue()
+{
+ LLSD ret;
+ ret["id"] = mSpeakerID;
+ ret["is_moderator"] = mIsModerator;
+ return ret;
+}
+
LLSpeakerTextModerationEvent::LLSpeakerTextModerationEvent(LLSpeaker* source)
: LLEvent(source, "Speaker text moderation event")
{
@@ -143,6 +159,92 @@ bool LLSortRecentSpeakers::operator()(const LLPointer<LLSpeaker> lhs, const LLPo
return( lhs->mDisplayName.compare(rhs->mDisplayName) < 0 );
}
+LLSpeakerActionTimer::LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id)
+: LLEventTimer(action_period)
+, mActionCallback(action_cb)
+, mSpeakerId(speaker_id)
+{
+}
+
+BOOL LLSpeakerActionTimer::tick()
+{
+ if (mActionCallback)
+ {
+ return (BOOL)mActionCallback(mSpeakerId);
+ }
+ return TRUE;
+}
+
+void LLSpeakerActionTimer::unset()
+{
+ mActionCallback = 0;
+}
+
+LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay)
+: mActionCallback(action_cb)
+, mActionDelay(action_delay)
+{
+}
+
+LLSpeakersDelayActionsStorage::~LLSpeakersDelayActionsStorage()
+{
+ removeAllTimers();
+}
+
+void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
+{
+ bool not_found = true;
+ if (mActionTimersMap.size() > 0)
+ {
+ not_found = mActionTimersMap.find(speaker_id) == mActionTimersMap.end();
+ }
+
+ // If there is already a started timer for the passed UUID don't do anything.
+ if (not_found)
+ {
+ // Starting a timer to remove an participant after delay is completed
+ mActionTimersMap.insert(LLSpeakerActionTimer::action_value_t(speaker_id,
+ new LLSpeakerActionTimer(
+ boost::bind(&LLSpeakersDelayActionsStorage::onTimerActionCallback, this, _1),
+ mActionDelay, speaker_id)));
+ }
+}
+
+void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
+{
+ if (mActionTimersMap.size() == 0) return;
+
+ LLSpeakerActionTimer::action_timer_iter_t it_speaker = mActionTimersMap.find(speaker_id);
+
+ if (it_speaker != mActionTimersMap.end())
+ {
+ it_speaker->second->unset();
+ mActionTimersMap.erase(it_speaker);
+ }
+}
+
+void LLSpeakersDelayActionsStorage::removeAllTimers()
+{
+ LLSpeakerActionTimer::action_timer_iter_t iter = mActionTimersMap.begin();
+ for (; iter != mActionTimersMap.end(); ++iter)
+ {
+ delete iter->second;
+ }
+ mActionTimersMap.clear();
+}
+
+bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
+{
+ unsetActionTimer(speaker_id);
+
+ if (mActionCallback)
+ {
+ mActionCallback(speaker_id);
+ }
+
+ return true;
+}
+
//
// LLSpeakerMgr
@@ -151,10 +253,14 @@ bool LLSortRecentSpeakers::operator()(const LLPointer<LLSpeaker> lhs, const LLPo
LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) :
mVoiceChannel(channelp)
{
+ static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0);
+
+ mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLSpeakerMgr::removeSpeaker, this, _1), remove_delay);
}
LLSpeakerMgr::~LLSpeakerMgr()
{
+ delete mSpeakerDelayRemover;
}
LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type)
@@ -177,7 +283,6 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
{
// keep highest priority status (lowest value) instead of overriding current value
speakerp->mStatus = llmin(speakerp->mStatus, status);
- speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
// RN: due to a weird behavior where IMs from attached objects come from the wearer's agent_id
// we need to override speakers that we think are objects when we find out they are really
// residents
@@ -189,6 +294,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
}
}
+ mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
return speakerp;
}
@@ -293,7 +399,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
S32 sort_index = 0;
speaker_list_t::iterator sorted_speaker_it;
for(sorted_speaker_it = mSpeakersSorted.begin();
- sorted_speaker_it != mSpeakersSorted.end(); )
+ sorted_speaker_it != mSpeakersSorted.end(); ++sorted_speaker_it)
{
LLPointer<LLSpeaker> speakerp = *sorted_speaker_it;
@@ -306,19 +412,6 @@ void LLSpeakerMgr::update(BOOL resort_ok)
// stuff sort ordinal into speaker so the ui can sort by this value
speakerp->mSortIndex = sort_index++;
-
- // remove speakers that have been gone too long
- if (speakerp->mStatus == LLSpeaker::STATUS_NOT_IN_CHANNEL && speakerp->mActivityTimer.hasExpired())
- {
- fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "remove");
-
- mSpeakers.erase(speakerp->mID);
- sorted_speaker_it = mSpeakersSorted.erase(sorted_speaker_it);
- }
- else
- {
- ++sorted_speaker_it;
- }
}
}
@@ -342,8 +435,40 @@ void LLSpeakerMgr::updateSpeakerList()
}
}
+void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp)
+{
+ speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
+ speakerp->mDotColor = INACTIVE_COLOR;
+ mSpeakerDelayRemover->setActionTimer(speakerp->mID);
+}
+
+bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)
+{
+ mSpeakers.erase(speaker_id);
+
+ speaker_list_t::iterator sorted_speaker_it = mSpeakersSorted.begin();
+
+ for(; sorted_speaker_it != mSpeakersSorted.end(); ++sorted_speaker_it)
+ {
+ if (speaker_id == (*sorted_speaker_it)->mID)
+ {
+ mSpeakersSorted.erase(sorted_speaker_it);
+ break;
+ }
+ }
+
+ fireEvent(new LLSpeakerListChangeEvent(this, speaker_id), "remove");
+
+ update(TRUE);
+
+ return false;
+}
+
LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
{
+ //In some conditions map causes crash if it is empty(Windows only), adding check (EK)
+ if (mSpeakers.size() == 0)
+ return NULL;
speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);
if (found_it == mSpeakers.end())
{
@@ -437,9 +562,13 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
if ( speaker_it->second.isMap() )
{
+ BOOL is_moderator = speakerp->mIsModerator;
speakerp->mIsModerator = speaker_it->second["is_moderator"];
speakerp->mModeratorMutedText =
speaker_it->second["mutes"]["text"];
+ // Fire event only if moderator changed
+ if ( is_moderator != speakerp->mIsModerator )
+ fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");
}
}
}
@@ -483,9 +612,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
{
if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull())
{
- speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
- speakerp->mDotColor = INACTIVE_COLOR;
- speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
+ setSpeakerNotInChannel(speakerp);
}
else if (agent_data["transition"].asString() == "ENTER")
{
@@ -507,7 +634,11 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
if (agent_info.has("is_moderator"))
{
+ BOOL is_moderator = speakerp->mIsModerator;
speakerp->mIsModerator = agent_info["is_moderator"];
+ // Fire event only if moderator changed
+ if ( is_moderator != speakerp->mIsModerator )
+ fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");
}
if (agent_info.has("mutes"))
@@ -531,9 +662,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
std::string agent_transition = update_it->second.asString();
if (agent_transition == "LEAVE" && speakerp.notNull())
{
- speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
- speakerp->mDotColor = INACTIVE_COLOR;
- speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
+ setSpeakerNotInChannel(speakerp);
}
else if ( agent_transition == "ENTER")
{
@@ -549,6 +678,144 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
}
}
+class ModerationResponder : public LLHTTPClient::Responder
+{
+public:
+ ModerationResponder(const LLUUID& session_id)
+ {
+ mSessionID = session_id;
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if ( gIMMgr )
+ {
+ //403 == you're not a mod
+ //should be disabled if you're not a moderator
+ if ( 403 == status )
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "not_a_mod_error",
+ mSessionID);
+ }
+ else
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "generic_request_error",
+ mSessionID);
+ }
+ }
+ }
+
+private:
+ LLUUID mSessionID;
+};
+
+void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
+{
+ LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);
+ if (!speakerp) return;
+
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "mute update";
+ data["session-id"] = getSessionID();
+ data["params"] = LLSD::emptyMap();
+ data["params"]["agent_id"] = speaker_id;
+ data["params"]["mute_info"] = LLSD::emptyMap();
+ //current value represents ability to type, so invert
+ data["params"]["mute_info"]["text"] = !speakerp->mModeratorMutedText;
+
+ LLHTTPClient::post(url, data, new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+ LLPointer<LLSpeaker> speakerp = findSpeaker(avatar_id);
+ if (!speakerp) return;
+
+ // *NOTE: mantipov: probably this condition will be incorrect when avatar will be blocked for
+ // text chat via moderation (LLSpeaker::mModeratorMutedText == TRUE)
+ bool is_in_voice = speakerp->mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+
+ // do not send voice moderation changes for avatars not in voice channel
+ if (!is_in_voice) return;
+
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "mute update";
+ data["session-id"] = getSessionID();
+ data["params"] = LLSD::emptyMap();
+ data["params"]["agent_id"] = avatar_id;
+ data["params"]["mute_info"] = LLSD::emptyMap();
+ data["params"]["mute_info"]["voice"] = !unmute;
+
+ LLHTTPClient::post(
+ url,
+ data,
+ new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else)
+{
+ // *TODO: mantipov: add more intellectual processing of several following requests if it is needed.
+ /*
+ Such situation should be tested:
+ "Moderator sends the same second request before first response is come"
+ Moderator sends "mute everyone else" for A and then for B
+ two requests to disallow voice chat are sent
+ UUID of B is stored.
+ Then first response (to disallow voice chat) is come
+ request to allow voice for stored avatar (B)
+ Then second response (to disallow voice chat) is come
+ have nothing to do, the latest selected speaker is already enabled
+
+ What can happen?
+ If request to allow voice for stored avatar (B) is processed on server BEFORE
+ second request to disallow voice chat all speakers will be disabled on voice.
+ But I'm not sure such situation is possible.
+ See EXT-3431.
+ */
+
+ mReverseVoiceModeratedAvatarID = excluded_avatar_id;
+ moderateVoiceSession(getSessionID(), !unmute_everyone_else);
+}
+
+void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
+{
+ if (mReverseVoiceModeratedAvatarID.isNull()) return;
+
+ if (session_update.has("moderated_mode") &&
+ session_update["moderated_mode"].has("voice"))
+ {
+ BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+
+ moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated);
+
+ mReverseVoiceModeratedAvatarID = LLUUID::null;
+ }
+}
+
+void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
+{
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "session update";
+ data["session-id"] = session_id;
+ data["params"] = LLSD::emptyMap();
+
+ data["params"]["update_info"] = LLSD::emptyMap();
+
+ data["params"]["update_info"]["moderated_mode"] = LLSD::emptyMap();
+ data["params"]["update_info"]["moderated_mode"]["voice"] = disallow_voice;
+
+ LLHTTPClient::post(url, data, new ModerationResponder(session_id));
+}
+
//
// LLActiveSpeakerMgr
@@ -564,12 +831,13 @@ void LLActiveSpeakerMgr::updateSpeakerList()
mVoiceChannel = LLVoiceChannel::getCurrentVoiceChannel();
// always populate from active voice channel
- if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel)
+ if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false
{
fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");
mSpeakers.clear();
mSpeakersSorted.clear();
mVoiceChannel = LLVoiceChannel::getCurrentVoiceChannel();
+ mSpeakerDelayRemover->removeAllTimers();
}
LLSpeakerMgr::updateSpeakerList();
@@ -630,9 +898,7 @@ void LLLocalSpeakerMgr::updateSpeakerList()
LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);
if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS)
{
- speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
- speakerp->mDotColor = INACTIVE_COLOR;
- speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
+ setSpeakerNotInChannel(speakerp);
}
}
}
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index e0f22bff4f..b924fb2f2c 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -34,6 +34,7 @@
#define LL_LLSPEAKERS_H
#include "llevent.h"
+#include "lleventtimer.h"
#include "llspeakers.h"
#include "llvoicechannel.h"
@@ -67,11 +68,12 @@ public:
void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+ bool isInVoiceChannel();
+
ESpeakerStatus mStatus; // current activity status in speech group
F32 mLastSpokeTime; // timestamp when this speaker last spoke
F32 mSpeechVolume; // current speech amplitude (timea average rms amplitude?)
std::string mDisplayName; // cache user name for this speaker
- LLFrameTimer mActivityTimer; // time out speakers when they are not part of current voice channel
BOOL mHasSpoken; // has this speaker said anything this session?
BOOL mHasLeftCurrentCall; // has this speaker left the current voice call?
LLColor4 mDotColor;
@@ -84,6 +86,16 @@ public:
BOOL mModeratorMutedText;
};
+class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent
+{
+public:
+ LLSpeakerUpdateModeratorEvent(LLSpeaker* source);
+ /*virtual*/ LLSD getValue();
+private:
+ const LLUUID& mSpeakerID;
+ BOOL mIsModerator;
+};
+
class LLSpeakerTextModerationEvent : public LLOldEvents::LLEvent
{
public:
@@ -108,6 +120,98 @@ private:
const LLUUID& mSpeakerID;
};
+/**
+ * class LLSpeakerActionTimer
+ *
+ * Implements a timer that calls stored callback action for stored speaker after passed period.
+ *
+ * Action is called until callback returns "true".
+ * In this case the timer will be removed via LLEventTimer::updateClass().
+ * Otherwise it should be deleted manually in place where it is used.
+ * If action callback is not set timer will tick only once and deleted.
+ */
+class LLSpeakerActionTimer : public LLEventTimer
+{
+public:
+ typedef boost::function<bool(const LLUUID&)> action_callback_t;
+ typedef std::map<LLUUID, LLSpeakerActionTimer*> action_timers_map_t;
+ typedef action_timers_map_t::value_type action_value_t;
+ typedef action_timers_map_t::const_iterator action_timer_const_iter_t;
+ typedef action_timers_map_t::iterator action_timer_iter_t;
+
+ /**
+ * Constructor.
+ *
+ * @param action_cb - callback which will be called each time after passed action period.
+ * @param action_period - time in seconds timer should tick.
+ * @param speaker_id - LLUUID of speaker which will be passed into action callback.
+ */
+ LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id);
+ virtual ~LLSpeakerActionTimer() {};
+
+ /**
+ * Implements timer "tick".
+ *
+ * If action callback is not specified returns true. Instance will be deleted by LLEventTimer::updateClass().
+ */
+ virtual BOOL tick();
+
+ /**
+ * Clears the callback.
+ *
+ * Use this instead of deleteing this object.
+ * The next call to tick() will return true and that will destroy this object.
+ */
+ void unset();
+private:
+ action_callback_t mActionCallback;
+ LLUUID mSpeakerId;
+};
+
+/**
+ * Represents a functionality to store actions for speakers with delay.
+ * Is based on LLSpeakerActionTimer.
+ */
+class LLSpeakersDelayActionsStorage
+{
+public:
+ LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay);
+ ~LLSpeakersDelayActionsStorage();
+
+ /**
+ * Sets new LLSpeakerActionTimer with passed speaker UUID.
+ */
+ void setActionTimer(const LLUUID& speaker_id);
+
+ /**
+ * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and optionally deletes it.
+ *
+ * @see onTimerActionCallback()
+ */
+ void unsetActionTimer(const LLUUID& speaker_id);
+
+ void removeAllTimers();
+private:
+ /**
+ * Callback of the each instance of LLSpeakerActionTimer.
+ *
+ * Unsets an appropriate timer instance and calls action callback for specified speacker_id.
+ *
+ * @see unsetActionTimer()
+ */
+ bool onTimerActionCallback(const LLUUID& speaker_id);
+
+ LLSpeakerActionTimer::action_timers_map_t mActionTimersMap;
+ LLSpeakerActionTimer::action_callback_t mActionCallback;
+
+ /**
+ * Delay to call action callback for speakers after timer was set.
+ */
+ F32 mActionDelay;
+
+};
+
+
class LLSpeakerMgr : public LLOldEvents::LLObservable
{
public:
@@ -132,6 +236,8 @@ public:
protected:
virtual void updateSpeakerList();
+ void setSpeakerNotInChannel(LLSpeaker* speackerp);
+ bool removeSpeaker(const LLUUID& speaker_id);
typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
speaker_map_t mSpeakers;
@@ -139,6 +245,11 @@ protected:
speaker_list_t mSpeakersSorted;
LLFrameTimer mSpeechTimer;
LLVoiceChannel* mVoiceChannel;
+
+ /**
+ * time out speakers when they are not part of current session
+ */
+ LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
};
class LLIMSpeakerMgr : public LLSpeakerMgr
@@ -148,8 +259,43 @@ public:
void updateSpeakers(const LLSD& update);
void setSpeakers(const LLSD& speakers);
+
+ void toggleAllowTextChat(const LLUUID& speaker_id);
+
+ /**
+ * Mutes/Unmutes avatar for current group voice chat.
+ *
+ * It only marks avatar as muted for session and does not use local Agent's Block list.
+ * It does not mute Agent itself.
+ *
+ * @param[in] avatar_id UUID of avatar to be processed
+ * @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceOtherParticipants()
+ */
+ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+
+ /**
+ * Mutes/Unmutes all avatars except specified for current group voice chat.
+ *
+ * It only marks avatars as muted for session and does not use local Agent's Block list.
+ * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
+ *
+ * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
+ * @param[in] unmute_everyone_else if false - avatars will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceParticipant()
+ */
+ void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else);
+
+ void processSessionUpdate(const LLSD& session_update);
+
protected:
virtual void updateSpeakerList();
+
+ void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
+
+ LLUUID mReverseVoiceModeratedAvatarID;
};
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
new file mode 100644
index 0000000000..d33c050ee4
--- /dev/null
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -0,0 +1,288 @@
+/**
+ * @file llspeakingindicatormanager.cpp
+ * @author Mike Antipov
+ * @brief Implementation of SpeackerIndicatorManager class to process registered LLSpeackerIndicator
+ * depend on avatars are in the same voice channel.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llspeakingindicatormanager.h"
+
+
+#include "llvoicechannel.h"
+#include "llvoiceclient.h"
+
+/**
+ * This class intended to control visibility of avatar speaking indicators depend on whether avatars
+ * are in the same voice channel.
+ *
+ * Speaking indicator should be visible for avatars in the same voice channel. See EXT-3976.
+ *
+ * It stores passed instances of LLOutputMonitorCtrl in a multimap by avatar LLUUID.
+ * It observes changing of voice channel and changing of participant list in voice channel.
+ * When voice channel or voice participant list is changed it updates visibility of an appropriate
+ * speaking indicator.
+ *
+ * Several indicators can be registered for the same avatar.
+ */
+class SpeakingIndicatorManager : public LLSingleton<SpeakingIndicatorManager>, LLVoiceClientParticipantObserver
+{
+ LOG_CLASS(SpeakingIndicatorManager);
+public:
+
+ /**
+ * Stores passed speaking indicator to control its visibility.
+ *
+ * Registered indicator is set visible if an appropriate avatar is in the same voice channel with Agent.
+ * It ignores instances of Agent's indicator.
+ *
+ * @param speaker_id LLUUID of an avatar whose speaking indicator is registered.
+ * @param speaking_indicator instance of the speaking indicator to be registered.
+ */
+ void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator);
+
+ /**
+ * Removes passed speaking indicator from observing.
+ *
+ * @param speaker_id LLUUID of an avatar whose speaking indicator should be unregistered.
+ * @param speaking_indicator instance of the speaking indicator to be unregistered.
+ */
+ void unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator);
+
+private:
+ typedef std::set<LLUUID> speaker_ids_t;
+ typedef std::multimap<LLUUID, LLSpeakingIndicator*> speaking_indicators_mmap_t;
+ typedef speaking_indicators_mmap_t::value_type speaking_indicator_value_t;
+ 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.
+ *
+ * It switches all registered speaking indicators off.
+ * To reduce overheads only switched on indicators are processed.
+ */
+ void sOnCurrentChannelChanged(const LLUUID& session_id);
+
+ /**
+ * Callback of changing voice participant list (from LLVoiceClientParticipantObserver).
+ *
+ * Switches off indicators had been switched on and switches on indicators of current participants list.
+ * There is only a few indicators in lists should be switched off/on.
+ * So, method does not calculate difference between these list it only switches off already
+ * switched on indicators and switches on indicators of voice channel participants
+ */
+ void onChange();
+
+ /**
+ * Changes state of indicators specified by LLUUIDs
+ *
+ * @param speakers_uuids - avatars' LLUUIDs whose speaking indicators should be switched
+ * @param switch_on - if TRUE specified indicator will be switched on, off otherwise.
+ */
+ void switchSpeakerIndicators(const speaker_ids_t& speakers_uuids, BOOL switch_on);
+
+ /**
+ * Ensures that passed instance of Speaking Indicator does not exist among registered ones.
+ * If yes, it will be removed.
+ */
+ void ensureInstanceDoesNotExist(LLSpeakingIndicator* const speaking_indicator);
+
+
+ /**
+ * Multimap with all registered speaking indicators
+ */
+ speaking_indicators_mmap_t mSpeakingIndicators;
+
+ /**
+ * LUUIDs of avatar for which we have speaking indicators switched on.
+ *
+ * Is used to switch off all previously ON indicators when voice participant list is changed.
+ *
+ * @see onChange()
+ */
+ speaker_ids_t mSwitchedIndicatorsOn;
+};
+
+//////////////////////////////////////////////////////////////////////////
+// PUBLIC SECTION
+//////////////////////////////////////////////////////////////////////////
+void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator)
+{
+ // do not exclude agent's indicators. They should be processed in the same way as others. See EXT-3889.
+
+ LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL;
+
+
+ ensureInstanceDoesNotExist(speaking_indicator);
+
+ speaking_indicator_value_t value_type(speaker_id, speaking_indicator);
+ mSpeakingIndicators.insert(value_type);
+
+ speaker_ids_t speakers_uuids;
+ BOOL is_in_same_voice = LLVoiceClient::getInstance()->findParticipantByID(speaker_id) != NULL;
+
+ speakers_uuids.insert(speaker_id);
+ switchSpeakerIndicators(speakers_uuids, is_in_same_voice);
+}
+
+void SpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator)
+{
+ LL_DEBUGS("SpeakingIndicator") << "Unregistering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL;
+ speaking_indicators_mmap_t::iterator it;
+ it = mSpeakingIndicators.find(speaker_id);
+ for (;it != mSpeakingIndicators.end(); ++it)
+ {
+ if (it->second == speaking_indicator)
+ {
+ LL_DEBUGS("SpeakingIndicator") << "Unregistered." << LL_ENDL;
+ mSpeakingIndicators.erase(it);
+ break;
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+SpeakingIndicatorManager::SpeakingIndicatorManager()
+{
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&SpeakingIndicatorManager::sOnCurrentChannelChanged, this, _1));
+ LLVoiceClient::getInstance()->addObserver(this);
+}
+
+SpeakingIndicatorManager::~SpeakingIndicatorManager()
+{
+ // Don't use LLVoiceClient::getInstance() here without check
+ // singleton MAY have already been destroyed.
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+}
+
+void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
+{
+ switchSpeakerIndicators(mSwitchedIndicatorsOn, FALSE);
+ mSwitchedIndicatorsOn.clear();
+}
+
+void SpeakingIndicatorManager::onChange()
+{
+ LL_DEBUGS("SpeakingIndicator") << "Voice participant list was changed, updating indicators" << LL_ENDL;
+
+ speaker_ids_t speakers_uuids;
+ LLVoiceClient::getInstance()->getParticipantsUUIDSet(speakers_uuids);
+
+ LL_DEBUGS("SpeakingIndicator") << "Switching all OFF, count: " << mSwitchedIndicatorsOn.size() << LL_ENDL;
+ // switch all indicators off
+ switchSpeakerIndicators(mSwitchedIndicatorsOn, FALSE);
+ mSwitchedIndicatorsOn.clear();
+
+ LL_DEBUGS("SpeakingIndicator") << "Switching all ON, count: " << speakers_uuids.size() << LL_ENDL;
+ // then switch current voice participants indicators on
+ switchSpeakerIndicators(speakers_uuids, TRUE);
+}
+
+void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& speakers_uuids, BOOL switch_on)
+{
+ speaker_ids_t::const_iterator it_uuid = speakers_uuids.begin();
+ for (; it_uuid != speakers_uuids.end(); ++it_uuid)
+ {
+ LL_DEBUGS("SpeakingIndicator") << "Looking for indicator: " << *it_uuid << LL_ENDL;
+ indicator_range_t it_range = mSpeakingIndicators.equal_range(*it_uuid);
+ indicator_const_iterator it_indicator = it_range.first;
+ bool was_found = false;
+ for (; it_indicator != it_range.second; ++it_indicator)
+ {
+ was_found = true;
+ LLSpeakingIndicator* indicator = (*it_indicator).second;
+ indicator->switchIndicator(switch_on);
+ }
+
+ if (was_found)
+ {
+ LL_DEBUGS("SpeakingIndicator") << mSpeakingIndicators.count(*it_uuid) << " indicators where found" << LL_ENDL;
+
+ if (switch_on)
+ {
+ // store switched on indicator to be able switch it off
+ mSwitchedIndicatorsOn.insert(*it_uuid);
+ }
+ }
+ }
+}
+
+void SpeakingIndicatorManager::ensureInstanceDoesNotExist(LLSpeakingIndicator* const speaking_indicator)
+{
+ LL_DEBUGS("SpeakingIndicator") << "Searching for an registered indicator instance: " << speaking_indicator << LL_ENDL;
+ speaking_indicators_mmap_t::iterator it = mSpeakingIndicators.begin();
+ for (;it != mSpeakingIndicators.end(); ++it)
+ {
+ if (it->second == speaking_indicator)
+ {
+ LL_DEBUGS("SpeakingIndicator") << "Found" << LL_ENDL;
+ break;
+ }
+ }
+
+ // It is possible with LLOutputMonitorCtrl the same instance of indicator is registered several
+ // times with different UUIDs. This leads to crash after instance is destroyed because the
+ // only one (specified by UUID in unregisterSpeakingIndicator()) is removed from the map.
+ // So, using stored deleted pointer leads to crash. See EXT-4782.
+ if (it != mSpeakingIndicators.end())
+ {
+ llwarns << "The same instance of indicator has already been registered, removing it: " << it->first << "|"<< speaking_indicator << llendl;
+ llassert(it == mSpeakingIndicators.end());
+ mSpeakingIndicators.erase(it);
+ }
+}
+
+
+/************************************************************************/
+/* LLSpeakingIndicatorManager namespace implementation */
+/************************************************************************/
+
+void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator)
+{
+ SpeakingIndicatorManager::instance().registerSpeakingIndicator(speaker_id, speaking_indicator);
+}
+
+void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator)
+{
+ SpeakingIndicatorManager::instance().unregisterSpeakingIndicator(speaker_id, speaking_indicator);
+}
+
+// EOF
+
diff --git a/indra/newview/llspeakingindicatormanager.h b/indra/newview/llspeakingindicatormanager.h
new file mode 100644
index 0000000000..ce0158f7d8
--- /dev/null
+++ b/indra/newview/llspeakingindicatormanager.h
@@ -0,0 +1,67 @@
+/**
+ * @file llspeakingindicatormanager.h
+ * @author Mike Antipov
+ * @brief Interfeace of LLSpeackerIndicator class to be processed depend on avatars are in the same voice channel.
+ * Also register/unregister methods for this class are declared
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSPEAKINGINDICATORMANAGER_H
+#define LL_LLSPEAKINGINDICATORMANAGER_H
+
+class LLSpeakingIndicator
+{
+public:
+ virtual void switchIndicator(bool switch_on) = 0;
+};
+
+// See EXT-3976.
+namespace LLSpeakingIndicatorManager
+{
+ /**
+ * Stores passed speaking indicator to control its visibility.
+ *
+ * Registered indicator is set visible if an appropriate avatar is in the same voice channel with Agent.
+ * It ignores instances of Agent's indicator.
+ *
+ * @param speaker_id LLUUID of an avatar whose speaker indicator is registered.
+ * @param speaking_indicator instance of the speaker indicator to be registered.
+ */
+ void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator);
+
+ /**
+ * Removes passed speaking indicator from observing.
+ *
+ * @param speaker_id LLUUID of an avatar whose speaker indicator should be unregistered.
+ * @param speaking_indicator instance of the speaker indicator to be unregistered.
+ */
+ void unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator);
+}
+
+#endif // LL_LLSPEAKINGINDICATORMANAGER_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 43b039f94e..83f773fadc 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -59,12 +59,17 @@
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llhttpsender.h"
+#include "llimfloater.h"
#include "lllocationhistory.h"
+#include "llimageworker.h"
#include "llloginflags.h"
#include "llmd5.h"
#include "llmemorystream.h"
#include "llmessageconfig.h"
#include "llmoveview.h"
+#include "llnearbychat.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llteleporthistory.h"
#include "llregionhandle.h"
#include "llsd.h"
@@ -73,7 +78,7 @@
#include "llsecondlifeurls.h"
#include "llstring.h"
#include "lluserrelations.h"
-#include "llversionviewer.h"
+#include "llversioninfo.h"
#include "llviewercontrol.h"
#include "llvfs.h"
#include "llxorcipher.h" // saved password, MAC address
@@ -96,9 +101,7 @@
#include "lleventnotifier.h"
#include "llface.h"
#include "llfeaturemanager.h"
-#include "llfirstuse.h"
-#include "llfloaterchat.h"
-#include "llfloatergesture.h"
+//#include "llfirstuse.h"
#include "llfloaterhud.h"
#include "llfloaterland.h"
#include "llfloaterpreference.h"
@@ -118,10 +121,9 @@
#include "lllogininstance.h" // Host the login module.
#include "llpanellogin.h"
#include "llmutelist.h"
-#include "llnotify.h"
#include "llpanelavatar.h"
#include "llavatarpropertiesprocessor.h"
-#include "llpanelevent.h"
+#include "llfloaterevent.h"
#include "llpanelclassified.h"
#include "llpanelpick.h"
#include "llpanelplace.h"
@@ -133,13 +135,14 @@
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
+#include "llsidetray.h"
#include "llstatview.h"
-#include "lltrans.h"
#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
#include "llsurface.h"
#include "lltexturecache.h"
#include "lltexturefetch.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llurldispatcher.h"
#include "llurlsimstring.h"
@@ -168,7 +171,7 @@
#include "llvoclouds.h"
#include "llweb.h"
#include "llworld.h"
-#include "llworldmap.h"
+#include "llworldmapmessage.h"
#include "llxfermanager.h"
#include "pipeline.h"
#include "llappviewer.h"
@@ -190,16 +193,13 @@
#include "lllogin.h"
#include "llevents.h"
+#include "llstartuplistener.h"
#if LL_WINDOWS
#include "llwindebug.h"
#include "lldxhardware.h"
#endif
-#if (LL_LINUX || LL_SOLARIS) && LL_GTK
-#include <glib/gspawn.h>
-#endif
-
//
// exported globals
//
@@ -238,7 +238,8 @@ static std::string gFirstSimSeedCap;
static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
static std::string gAgentStartLocation = "safe";
-static LLEventStream sStartupStateWatcher("StartupState");
+boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
+boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
//
// local function declaration
@@ -296,23 +297,6 @@ namespace
};
}
-class LLGestureInventoryFetchObserver : public LLInventoryFetchObserver
-{
-public:
- LLGestureInventoryFetchObserver() {}
- virtual void done()
- {
- // we've downloaded all the items, so repaint the dialog
- LLFloaterGesture* floater = LLFloaterReg::findTypedInstance<LLFloaterGesture>("gestures");
- if (floater)
- {
- floater->refreshAll();
- }
- gInventory.removeObserver(this);
- delete this;
- }
-};
-
void update_texture_fetch()
{
LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
@@ -321,59 +305,6 @@ void update_texture_fetch()
gTextureList.updateImages(0.10f);
}
-//Copies landmarks from the "Library" to "My Favorites"
-void populate_favorites_bar()
-{
- //*TODO consider extending LLInventoryModel::findCategoryUUIDForType(...) to support both root's
- LLInventoryModel::cat_array_t* lib_cats = NULL;
- LLInventoryModel::item_array_t* lib_items = NULL;
- gInventory.getDirectDescendentsOf(gInventory.getLibraryRootFolderID(), lib_cats, lib_items);
- if (!lib_cats) return;
-
- LLUUID lib_landmarks(LLUUID::null);
- S32 count = lib_cats->count();
- for(S32 i = 0; i < count; ++i)
- {
- if(lib_cats->get(i)->getPreferredType() == LLAssetType::AT_LANDMARK)
- {
- lib_landmarks = lib_cats->get(i)->getUUID();
- break;
- }
- }
- if (lib_landmarks.isNull())
- {
- llerror("Library inventory is missing Landmarks", 0);
- return;
- }
-
- LLInventoryModel::cat_array_t* lm_cats = NULL;
- LLInventoryModel::item_array_t* lm_items = NULL;
- gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items);
- if (!lm_items) return;
-
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
- if (favorites_id.isNull())
- {
- llerror("My Inventory is missing My Favorites", 0);
- return;
- }
-
- S32 lm_count = lm_items->count();
- for (S32 i = 0; i < lm_count; ++i)
- {
- LLInventoryItem* item = lm_items->get(i);
- if (item->getUUID().isNull()) continue;
-
- copy_inventory_item(gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- favorites_id,
- std::string(),
- LLPointer<LLInventoryCallback>(NULL));
- }
-}
-
-
// Returns false to skip other idle processing. Should only return
// true when all initialization done.
bool idle_startup()
@@ -381,8 +312,6 @@ bool idle_startup()
LLMemType mt1(LLMemType::MTYPE_STARTUP);
const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
- const F32 TIMEOUT_SECONDS = 5.f;
- const S32 MAX_TIMEOUT_COUNT = 3;
static LLTimer timeout;
static S32 timeout_count = 0;
@@ -443,16 +372,16 @@ bool idle_startup()
if (LLFeatureManager::getInstance()->isSafe())
{
- LLNotifications::instance().add("DisplaySetToSafe");
+ LLNotificationsUtil::add("DisplaySetToSafe");
}
else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
(gSavedSettings.getS32("LastFeatureVersion") != 0))
{
- LLNotifications::instance().add("DisplaySetToRecommended");
+ LLNotificationsUtil::add("DisplaySetToRecommended");
}
else if (!gViewerWindow->getInitAlert().empty())
{
- LLNotifications::instance().add(gViewerWindow->getInitAlert());
+ LLNotificationsUtil::add(gViewerWindow->getInitAlert());
}
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
@@ -497,7 +426,7 @@ bool idle_startup()
{
std::string diagnostic = "Could not start address resolution system";
LL_WARNS("AppInit") << diagnostic << LL_ENDL;
- LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().insert("DIAGNOSTIC", diagnostic));
+ LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
}
//
@@ -556,9 +485,9 @@ bool idle_startup()
if(!start_messaging_system(
message_template_path,
port,
- LL_VERSION_MAJOR,
- LL_VERSION_MINOR,
- LL_VERSION_PATCH,
+ LLVersionInfo::getMajor(),
+ LLVersionInfo::getMinor(),
+ LLVersionInfo::getPatch(),
FALSE,
std::string(),
responder,
@@ -568,7 +497,7 @@ bool idle_startup()
{
std::string diagnostic = llformat(" Error: %d", gMessageSystem->getErrorCode());
LL_WARNS("AppInit") << diagnostic << LL_ENDL;
- LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().insert("DIAGNOSTIC", diagnostic));
+ LLAppViewer::instance()->earlyExit("LoginFailedNoNetwork", LLSD().with("DIAGNOSTIC", diagnostic));
}
#if LL_WINDOWS
@@ -591,7 +520,7 @@ bool idle_startup()
}
else
{
- LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().insert("PATH", message_template_path));
+ LLAppViewer::instance()->earlyExit("MessageTemplateNotFound", LLSD().with("PATH", message_template_path));
}
if(gMessageSystem && gMessageSystem->isOK())
@@ -738,11 +667,12 @@ bool idle_startup()
}
if (!gLoginHandler.getFirstName().empty()
|| !gLoginHandler.getLastName().empty()
- || !gLoginHandler.getWebLoginKey().isNull() )
+ /*|| !gLoginHandler.getWebLoginKey().isNull()*/ )
{
// We have at least some login information on a SLURL
gFirstname = gLoginHandler.getFirstName();
gLastname = gLoginHandler.getLastName();
+ LL_DEBUGS("LLStartup") << "STATE_FIRST: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
// Show the login screen if we don't have everything
show_connect_box =
@@ -753,6 +683,7 @@ bool idle_startup()
LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
gFirstname = cmd_line_login[0].asString();
gLastname = cmd_line_login[1].asString();
+ LL_DEBUGS("LLStartup") << "Setting gFirstname, gLastname from gSavedSettings(\"UserLoginInfo\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());
char md5pass[33]; /* Flawfinder: ignore */
@@ -770,6 +701,7 @@ bool idle_startup()
{
gFirstname = gSavedSettings.getString("FirstName");
gLastname = gSavedSettings.getString("LastName");
+ LL_DEBUGS("LLStartup") << "AutoLogin: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
gPassword = LLStartUp::loadPasswordFromDisk();
gSavedSettings.setBOOL("RememberPassword", TRUE);
@@ -785,6 +717,7 @@ bool idle_startup()
// a valid grid is selected
gFirstname = gSavedSettings.getString("FirstName");
gLastname = gSavedSettings.getString("LastName");
+ LL_DEBUGS("LLStartup") << "normal login: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
gPassword = LLStartUp::loadPasswordFromDisk();
show_connect_box = true;
}
@@ -864,10 +797,16 @@ bool idle_startup()
gLoginMenuBarView->setVisible( TRUE );
gLoginMenuBarView->setEnabled( TRUE );
+ // Hide the splash screen
+ LLSplashScreen::hide();
+
// Push our window frontmost
gViewerWindow->getWindow()->show();
display_startup();
+ //DEV-10530. do cleanup. remove at some later date. jan-2009
+ LLFloaterPreference::cleanupBadSetting();
+
// DEV-16927. The following code removes errant keystrokes that happen while the window is being
// first made visible.
#ifdef _WIN32
@@ -895,13 +834,16 @@ bool idle_startup()
gViewerWindow->moveProgressViewToFront();
//reset the values that could have come in from a slurl
- if (!gLoginHandler.getWebLoginKey().isNull())
+ // DEV-42215: Make sure they're not empty -- gFirstname and gLastname
+ // might already have been set from gSavedSettings, and it's too bad
+ // to overwrite valid values with empty strings.
+ if (! gLoginHandler.getFirstName().empty() && ! gLoginHandler.getLastName().empty())
{
gFirstname = gLoginHandler.getFirstName();
gLastname = gLoginHandler.getLastName();
-// gWebLoginKey = gLoginHandler.getWebLoginKey();
+ LL_DEBUGS("LLStartup") << "STATE_LOGIN_CLEANUP: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
}
-
+
if (show_connect_box)
{
// TODO if not use viewer auth
@@ -925,9 +867,9 @@ bool idle_startup()
// create necessary directories
// *FIX: these mkdir's should error check
gDirUtilp->setLindenUserDir(gFirstname, gLastname);
- LLFile::mkdir(gDirUtilp->getLindenUserDir());
-
- // Set PerAccountSettingsFile to the default value.
+ LLFile::mkdir(gDirUtilp->getLindenUserDir());
+
+ // Set PerAccountSettingsFile to the default value.
gSavedSettings.setString("PerAccountSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
@@ -963,14 +905,8 @@ bool idle_startup()
LLFile::mkdir(gDirUtilp->getChatLogsDir());
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
- // chat history must be loaded AFTER chat directories are defined.
- if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
- {
- LLFloaterChat::loadHistory();
- }
-
-
- //good as place as any to create user windlight directories
+
+ //good a place as any to create user windlight directories
std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));
LLFile::mkdir(user_windlight_path_name.c_str());
@@ -1087,6 +1023,17 @@ bool idle_startup()
credentials["passwd"] = gPassword;
login->connect(credentials);
+ LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
+ return FALSE;
+ }
+
+ if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState())
+ {
+ // If we get here we have gotten past the potential stall
+ // in curl, so take "may appear frozen" out of progress bar. JC
+ auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
+ set_startup_status(progress, auth_desc, auth_message);
+
LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );
return FALSE;
}
@@ -1145,11 +1092,12 @@ bool idle_startup()
LLSD args;
args["ERROR_MESSAGE"] = emsg.str();
LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
- LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
}
//setup map of datetime strings to codes and slt & local time offset from utc
- LLStringOps::setupDatetimeInfo (gPacificDaylightTime);
+ // *TODO: Does this need to be here?
+ LLStringOps::setupDatetimeInfo (false);
transition_back_to_login_panel(emsg.str());
show_connect_box = true;
}
@@ -1167,21 +1115,11 @@ bool idle_startup()
LLSD args;
args["ERROR_MESSAGE"] = emsg.str();
LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
- LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
transition_back_to_login_panel(emsg.str());
show_connect_box = true;
}
}
- else
- {
- // Still waiting for response.
- // *TODO:Mani - Actually check for login progress.
- // If we get here we have gotten past the potential stall
- // in curl, so take "may appear frozen" out of progress bar. JC
- auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
- set_startup_status(progress, auth_desc, auth_message);
- }
-
return FALSE;
}
@@ -1260,6 +1198,7 @@ bool idle_startup()
display_startup();
LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+
return FALSE;
}
@@ -1312,7 +1251,9 @@ bool idle_startup()
// Move the progress view in front of the UI
gViewerWindow->moveProgressViewToFront();
+ // direct logging to the debug console's line buffer
LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
+
// set initial visibility of debug console
gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
}
@@ -1346,6 +1287,14 @@ bool idle_startup()
LLAppViewer::instance()->loadNameCache();
}
+ //gCacheName is required for nearby chat history loading
+ //so I just moved nearby history loading a few states further
+ if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
+ {
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
+ if (nearby_chat) nearby_chat->loadHistory();
+ }
+
// *Note: this is where gWorldMap used to be initialized.
// register null callbacks for audio until the audio system is initialized
@@ -1376,7 +1325,7 @@ bool idle_startup()
// Make sure agent knows correct aspect ratio
// FOV limits depend upon aspect ratio so this needs to happen before initializing the FOV below
- LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeight());
+ LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeightRaw());
LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
// Initialize FOV
LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle"));
@@ -1438,9 +1387,9 @@ bool idle_startup()
msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
msg->sendReliable(
gFirstSim,
- MAX_TIMEOUT_COUNT,
+ gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
FALSE,
- TIMEOUT_SECONDS,
+ gSavedSettings.getF32("UseCircuitCodeTimeout"),
use_circuit_callback,
NULL);
@@ -1637,11 +1586,15 @@ bool idle_startup()
gSavedSettings.setString("TutorialURL", tutorial_url.asString());
}
- LLSD use_tutorial = (*it)["use_tutorial"];
- if(use_tutorial.asString() == "true")
- {
- show_hud = true;
- }
+ // For Viewer 2.0 we are not using the web-based tutorial
+ // If we reverse that decision, put this code back and use
+ // login.cgi to send a different URL with content that matches
+ // the Viewer 2.0 UI.
+ //LLSD use_tutorial = (*it)["use_tutorial"];
+ //if(use_tutorial.asString() == "true")
+ //{
+ // show_hud = true;
+ //}
}
}
// Either we want to show tutorial because this is the first login
@@ -1676,10 +1629,13 @@ bool idle_startup()
gInventory.buildParentChildMap();
//all categories loaded. lets create "My Favorites" category
- gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE,true);
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
+
+ // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+ // fetches their contents if needed and synchronizes it with buddies list.
+ // If the folders are not found they are created.
+ LLFriendCardsManager::instance().syncFriendCardsFolders();
- // lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies
- LLFriendCardsManager::instance().syncFriendsFolder();
// set up callbacks
llinfos << "Registering Callbacks" << llendl;
@@ -1707,12 +1663,6 @@ bool idle_startup()
llinfos << "Creating Inventory Views" << llendl;
LLFloaterReg::getInstance("inventory");
- //default initial content for Favorites Bar
- if (gAgent.isFirstLogin())
- {
- populate_favorites_bar();
- }
-
LLStartUp::setStartupState( STATE_MISC );
return FALSE;
}
@@ -1751,6 +1701,13 @@ bool idle_startup()
<< " kbps" << LL_ENDL;
gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
}
+
+ // Set the show start location to true, now that the user has logged
+ // on with this install.
+ gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+
+ LLSideTray::getInstance()->showPanel("panel_home", LLSD());
+
}
// We're successfully logged in.
@@ -1807,11 +1764,8 @@ bool idle_startup()
item_ids.push_back(item_id);
}
}
-
- LLGestureInventoryFetchObserver* fetch = new LLGestureInventoryFetchObserver();
- fetch->fetchItems(item_ids);
- // deletes itself when done
- gInventory.addObserver(fetch);
+ // no need to add gesture to inventory observer, it's already made in constructor
+ LLGestureManager::instance().fetchItems(item_ids);
}
}
gDisplaySwapBuffers = TRUE;
@@ -1883,16 +1837,13 @@ bool idle_startup()
{
msg = "AvatarMovedLast";
}
- LLNotifications::instance().add(msg);
+ LLNotificationsUtil::add(msg);
}
}
//DEV-17797. get null folder. Any items found here moved to Lost and Found
LLInventoryModel::findLostItems();
- //DEV-10530. do cleanup. remove at some later date. jan-2009
- LLFloaterPreference::cleanupBadSetting();
-
LLStartUp::setStartupState( STATE_PRECACHE );
timeout.reset();
return FALSE;
@@ -1916,21 +1867,6 @@ bool idle_startup()
LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
}
-
- // We now have an inventory skeleton, so if this is a user's first
- // login, we can start setting up their clothing and avatar
- // appearance. This helps to avoid the generic "Ruth" avatar in
- // the orientation island tutorial experience. JC
- if (gAgent.isFirstLogin()
- && !sInitialOutfit.empty() // registration set up an outfit
- && !sInitialOutfitGender.empty() // and a gender
- && gAgent.getAvatarObject() // can't wear clothes without object
- && !gAgent.isGenderChosen() ) // nothing already loading
- {
- // Start loading the wearables, textures, gestures
- LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
- }
-
// wait precache-delay and for agent's avatar or a lot longer.
if(((timeout_frac > 1.f) && gAgent.getAvatarObject())
|| (timeout_frac > 3.f))
@@ -1950,7 +1886,7 @@ bool idle_startup()
LLViewerShaderMgr::instance()->setShaders();
}
}
-
+
return TRUE;
}
@@ -1971,7 +1907,7 @@ bool idle_startup()
// initial outfit, but if the load hasn't started
// already then something is wrong so fall back
// to generic outfits. JC
- LLNotifications::instance().add("WelcomeChooseSex", LLSD(), LLSD(),
+ LLNotificationsUtil::add("WelcomeChooseSex", LLSD(), LLSD(),
callback_choose_gender);
LLStartUp::setStartupState( STATE_CLEANUP );
return TRUE;
@@ -1979,7 +1915,7 @@ bool idle_startup()
if (wearables_time > MAX_WEARABLES_TIME)
{
- LLNotifications::instance().add("ClothingLoading");
+ LLNotificationsUtil::add("ClothingLoading");
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_WEARABLES_TOO_LONG);
LLStartUp::setStartupState( STATE_CLEANUP );
return TRUE;
@@ -2091,6 +2027,8 @@ bool idle_startup()
LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
+ LLIMFloater::initIMFloater();
+
return TRUE;
}
@@ -2112,7 +2050,7 @@ void login_show()
BOOL bUseDebugLogin = TRUE;
#endif
- LLPanelLogin::show( gViewerWindow->getVirtualWindowRect(),
+ LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
bUseDebugLogin,
login_callback, NULL );
@@ -2140,7 +2078,7 @@ void login_callback(S32 option, void *userdata)
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
return;
}
- else if (QUIT_OPTION == option)
+ else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
{
// Make sure we don't save the password if the user is trying to clear it.
std::string first, last, password;
@@ -2305,12 +2243,12 @@ bool is_hex_string(U8* str, S32 len)
void show_first_run_dialog()
{
- LLNotifications::instance().add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
+ LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
}
bool first_run_dialog_callback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
LL_DEBUGS("AppInit") << "First run dialog cancelling" << LL_ENDL;
@@ -2333,7 +2271,7 @@ void set_startup_status(const F32 frac, const std::string& string, const std::st
bool login_alert_status(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// Buttons
switch( option )
{
@@ -2367,7 +2305,7 @@ void use_circuit_callback(void**, S32 result)
{
// Make sure user knows something bad happened. JC
LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
- LLNotifications::instance().add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
+ LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
reset_login();
}
else
@@ -2468,7 +2406,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("AvatarPicksReply",
&LLAvatarPropertiesProcessor::processAvatarPicksReply);
msg->setHandlerFunc("AvatarClassifiedReply",
- &LLAvatarPropertiesProcessor::processAvatarClassifiedReply);
+ &LLAvatarPropertiesProcessor::processAvatarClassifiedsReply);
msg->setHandlerFuncFast(_PREHASH_CreateGroupReply,
LLGroupMgr::processCreateGroupReply);
@@ -2528,13 +2466,13 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);
- msg->setHandlerFunc("MapLayerReply", LLWorldMap::processMapLayerReply);
- msg->setHandlerFunc("MapBlockReply", LLWorldMap::processMapBlockReply);
- msg->setHandlerFunc("MapItemReply", LLWorldMap::processMapItemReply);
+ msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
+ msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
- msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
+ msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);
msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
- msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
+// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
+ msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply);
msg->setHandlerFunc("ScriptDialog", process_script_dialog);
msg->setHandlerFunc("LoadURL", process_load_url);
@@ -2572,7 +2510,7 @@ const S32 OPT_FEMALE = 1;
bool callback_choose_gender(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
case OPT_MALE:
@@ -2591,6 +2529,13 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
+ llinfos << "starting" << llendl;
+
+ // Not going through the processAgentInitialWearables path, so need to set this here.
+ LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
+ // Initiate creation of COF, since we're also bypassing that.
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+
S32 gender = 0;
std::string gestures;
if (gender_name == "male")
@@ -2606,24 +2551,53 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
// try to find the outfit - if not there, create some default
// wearables.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- LLNameCategoryCollector has_name(outfit_folder_name);
- gInventory.collectDescendentsIf(LLUUID::null,
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- has_name);
- if (0 == cat_array.count())
+ LLUUID cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ outfit_folder_name);
+ if (cat_id.isNull())
{
gAgentWearables.createStandardWearables(gender);
}
else
{
- LLAppearanceManager::wearOutfitByName(outfit_folder_name);
+ bool do_copy = true;
+ bool do_append = false;
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
+ }
+
+ // Copy gestures
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+ LLPointer<LLInventoryCallback> cb(NULL);
+ LLAppearanceManager *app_mgr = &(LLAppearanceManager::instance());
+
+ // - Copy gender-specific gestures.
+ LLUUID gestures_cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ gestures);
+ if (gestures_cat_id.notNull())
+ {
+ callAfterCategoryFetch(gestures_cat_id,
+ boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ app_mgr,
+ gestures_cat_id,
+ dst_id,
+ cb));
+ }
+
+ // - Copy common gestures.
+ LLUUID common_gestures_cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ COMMON_GESTURES_FOLDER);
+ if (common_gestures_cat_id.notNull())
+ {
+ callAfterCategoryFetch(common_gestures_cat_id,
+ boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ app_mgr,
+ common_gestures_cat_id,
+ dst_id,
+ cb));
}
- LLAppearanceManager::wearOutfitByName(gestures);
- LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER);
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
@@ -2698,12 +2672,16 @@ std::string LLStartUp::startupStateToString(EStartupState state)
#define RTNENUM(E) case E: return #E
switch(state){
RTNENUM( STATE_FIRST );
+ RTNENUM( STATE_BROWSER_INIT );
RTNENUM( STATE_LOGIN_SHOW );
RTNENUM( STATE_LOGIN_WAIT );
RTNENUM( STATE_LOGIN_CLEANUP );
RTNENUM( STATE_LOGIN_AUTH_INIT );
+ RTNENUM( STATE_LOGIN_CURL_UNSTUCK );
RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
RTNENUM( STATE_WORLD_INIT );
+ RTNENUM( STATE_MULTIMEDIA_INIT );
+ RTNENUM( STATE_FONT_INIT );
RTNENUM( STATE_SEED_GRANTED_WAIT );
RTNENUM( STATE_SEED_CAP_GRANTED );
RTNENUM( STATE_WORLD_WAIT );
@@ -2728,15 +2706,23 @@ void LLStartUp::setStartupState( EStartupState state )
getStartupStateString() << " to " <<
startupStateToString(state) << LL_ENDL;
gStartupState = state;
+ postStartupState();
+}
+
+void LLStartUp::postStartupState()
+{
LLSD stateInfo;
stateInfo["str"] = getStartupStateString();
- stateInfo["enum"] = state;
- sStartupStateWatcher.post(stateInfo);
+ stateInfo["enum"] = gStartupState;
+ sStateWatcher->post(stateInfo);
}
void reset_login()
{
+ gAgent.cleanup();
+ LLWorld::getInstance()->destroyClass();
+
LLStartUp::setStartupState( STATE_LOGIN_SHOW );
if ( gViewerWindow )
@@ -2909,7 +2895,9 @@ bool process_login_success_response()
text = response["agent_region_access"].asString();
if (!text.empty())
{
- int preferredMaturity = LLAgent::convertTextToMaturity(text[0]);
+ U32 preferredMaturity =
+ llmin((U32)LLAgent::convertTextToMaturity(text[0]),
+ gSavedSettings.getU32("PreferredMaturity"));
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
}
// During the AO transition, this flag will be true. Then the flag will
@@ -3037,14 +3025,15 @@ bool process_login_success_response()
gAgent.setGenderChosen(TRUE);
}
+ bool pacific_daylight_time = false;
flag = login_flags["daylight_savings"].asString();
if(flag == "Y")
{
- gPacificDaylightTime = (flag == "Y") ? TRUE : FALSE;
+ pacific_daylight_time = (flag == "Y");
}
//setup map of datetime strings to codes and slt & local time offset from utc
- LLStringOps::setupDatetimeInfo (gPacificDaylightTime);
+ LLStringOps::setupDatetimeInfo(pacific_daylight_time);
}
LLSD initial_outfit = response["initial-outfit"][0];
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 7f869d014f..92fe9521d3 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -33,7 +33,11 @@
#ifndef LL_LLSTARTUP_H
#define LL_LLSTARTUP_H
+#include <boost/scoped_ptr.hpp>
+
class LLViewerTexture ;
+class LLEventPump;
+class LLStartupListener;
// functions
bool idle_startup();
@@ -51,6 +55,7 @@ typedef enum {
STATE_LOGIN_WAIT, // Wait for user input at login screen
STATE_LOGIN_CLEANUP, // Get rid of login screen and start login
STATE_LOGIN_AUTH_INIT, // Start login to SL servers
+ STATE_LOGIN_CURL_UNSTUCK, // Update progress to remove "SL appears frozen" msg.
STATE_LOGIN_PROCESS_RESPONSE, // Check authentication reply
STATE_WORLD_INIT, // Start building the world
STATE_MULTIMEDIA_INIT, // Init the rest of multimedia library
@@ -113,9 +118,13 @@ public:
// *HACK: On startup, if we were passed a secondlife://app/do/foo
// command URL, store it for later processing.
+ static void postStartupState();
+
private:
static std::string startupStateToString(EStartupState state);
static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState
+ static boost::scoped_ptr<LLEventPump> sStateWatcher;
+ static boost::scoped_ptr<LLStartupListener> sListener;
};
diff --git a/indra/newview/llstartuplistener.cpp b/indra/newview/llstartuplistener.cpp
new file mode 100644
index 0000000000..5a76a297c7
--- /dev/null
+++ b/indra/newview/llstartuplistener.cpp
@@ -0,0 +1,34 @@
+/**
+ * @file llstartuplistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-08
+ * @brief Implementation for llstartuplistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llstartuplistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llstartup.h"
+
+
+LLStartupListener::LLStartupListener(/* LLStartUp* instance */):
+ LLEventAPI("LLStartUp", "Access e.g. LLStartup::postStartupState()") /* ,
+ mStartup(instance) */
+{
+ add("postStartupState", "Refresh \"StartupState\" listeners with current startup state",
+ &LLStartupListener::postStartupState);
+}
+
+void LLStartupListener::postStartupState(const LLSD&) const
+{
+ LLStartUp::postStartupState();
+}
diff --git a/indra/newview/llstartuplistener.h b/indra/newview/llstartuplistener.h
new file mode 100644
index 0000000000..a2a4d3a08e
--- /dev/null
+++ b/indra/newview/llstartuplistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file llstartuplistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-07
+ * @brief Event API to provide access to LLStartUp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLSTARTUPLISTENER_H)
+#define LL_LLSTARTUPLISTENER_H
+
+#include "lleventapi.h"
+class LLStartUp;
+class LLSD;
+
+class LLStartupListener: public LLEventAPI
+{
+public:
+ LLStartupListener(/* LLStartUp* instance */); // all static members!
+
+private:
+ void postStartupState(const LLSD&) const;
+
+ //LLStartup* mStartup;
+};
+
+#endif /* ! defined(LL_LLSTARTUPLISTENER_H) */
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 4dccdfd7e6..e83c882866 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -40,8 +40,9 @@
#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llfloaterbuycurrency.h"
-#include "llfloaterchat.h"
#include "llfloaterlagmeter.h"
+#include "llpanelnearbymedia.h"
+#include "llpanelvolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhudicon.h"
@@ -49,8 +50,7 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
-#include "llnotify.h"
-#include "llimview.h"
+#include "llrootview.h"
#include "llsd.h"
#include "lltextbox.h"
#include "llui.h"
@@ -63,6 +63,7 @@
#include "llresmgr.h"
#include "llworld.h"
#include "llstatgraph.h"
+#include "llviewermedia.h"
#include "llviewermenu.h" // for gMenuBarView
#include "llviewerparcelmgr.h"
#include "llviewerthrottle.h"
@@ -72,12 +73,14 @@
#include "llfocusmgr.h"
#include "llappviewer.h"
#include "lltrans.h"
+
// library includes
#include "imageids.h"
#include "llfloaterreg.h"
#include "llfontgl.h"
#include "llrect.h"
#include "llerror.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llstring.h"
#include "message.h"
@@ -106,9 +109,9 @@ const F32 ICON_TIMER_EXPIRY = 3.f; // How long the balance and health icons sho
const F32 ICON_FLASH_FREQUENCY = 2.f;
const S32 TEXT_HEIGHT = 18;
-static void onClickBuyCurrency(void*);
static void onClickHealth(void*);
static void onClickScriptDebug(void*);
+static void onClickVolume(void*);
std::vector<std::string> LLStatusBar::sDays;
std::vector<std::string> LLStatusBar::sMonths;
@@ -116,6 +119,11 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000;
LLStatusBar::LLStatusBar(const LLRect& rect)
: LLPanel(),
+ mTextHealth(NULL),
+ mTextTime(NULL),
+ mSGBandwidth(NULL),
+ mSGPacketLoss(NULL),
+ mBtnVolume(NULL),
mBalance(0),
mHealth(100),
mSquareMetersCredit(0),
@@ -125,7 +133,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
// status bar can possible overlay menus?
setMouseOpaque(FALSE);
- setIsChrome(TRUE);
// size of day of the weeks and year
sDays.reserve(7);
@@ -135,9 +142,39 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mHealthTimer = new LLFrameTimer();
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml");
+}
- // status bar can never get a tab
- setFocusRoot(FALSE);
+LLStatusBar::~LLStatusBar()
+{
+ delete mBalanceTimer;
+ mBalanceTimer = NULL;
+
+ delete mHealthTimer;
+ mHealthTimer = NULL;
+
+ // LLView destructor cleans up children
+}
+
+//-----------------------------------------------------------------------
+// Overrides
+//-----------------------------------------------------------------------
+
+// virtual
+void LLStatusBar::draw()
+{
+ refresh();
+ LLPanel::draw();
+}
+
+BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ show_navbar_context_menu(this,x,y);
+ return TRUE;
+}
+
+BOOL LLStatusBar::postBuild()
+{
+ gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
// build date necessary data (must do after panel built)
setupDate();
@@ -145,8 +182,20 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mTextHealth = getChild<LLTextBox>("HealthText" );
mTextTime = getChild<LLTextBox>("TimeText" );
- mBtnBuyCurrency = getChild<LLButton>( "buycurrency" );
- mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this );
+ getChild<LLUICtrl>("buycurrency")->setCommitCallback(
+ boost::bind(&LLStatusBar::onClickBuyCurrency, this));
+ getChild<LLUICtrl>("buyL")->setCommitCallback(
+ boost::bind(&LLStatusBar::onClickBuyCurrency, this));
+
+ mBtnVolume = getChild<LLButton>( "volume_btn" );
+ mBtnVolume->setClickedCallback( onClickVolume, this );
+ mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
+
+ mMediaToggle = getChild<LLButton>("media_toggle_btn");
+ mMediaToggle->setClickedCallback( &LLStatusBar::onClickMediaToggle, this );
+ mMediaToggle->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterNearbyMedia, this));
+
+ gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
childSetAction("scriptout", onClickScriptDebug, this);
childSetAction("health", onClickHealth, this);
@@ -190,48 +239,19 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
childSetActionTextbox("stat_btn", onClickStatGraph);
-}
-
-LLStatusBar::~LLStatusBar()
-{
- delete mBalanceTimer;
- mBalanceTimer = NULL;
-
- delete mHealthTimer;
- mHealthTimer = NULL;
-
- // LLView destructor cleans up children
-}
-
-//-----------------------------------------------------------------------
-// Overrides
-//-----------------------------------------------------------------------
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
-// virtual
-void LLStatusBar::draw()
-{
- refresh();
+ mPanelVolumePulldown = new LLPanelVolumePulldown();
+ popup_holder->addChild(mPanelVolumePulldown);
- if (isBackgroundVisible())
- {
- static LLUICachedControl<S32> drop_shadow_floater ("DropShadowFloater", 0);
- static LLUIColor color_drop_shadow = LLUIColorTable::instance().getColor("ColorDropShadow");
- gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0,
- color_drop_shadow, drop_shadow_floater );
- }
- LLPanel::draw();
-}
+ mPanelNearByMedia = new LLPanelNearByMedia();
+ popup_holder->addChild(mPanelNearByMedia);
+ gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(&LLStatusBar::onClickScreen, this, _1, _2));
+ mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+ mPanelNearByMedia->setVisible(FALSE);
-BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- show_navbar_context_menu(this,x,y);
- return TRUE;
-}
-
-BOOL LLStatusBar::postBuild()
-{
-
- gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
+ mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+ mPanelVolumePulldown->setVisible(FALSE);
return TRUE;
}
@@ -333,12 +353,24 @@ void LLStatusBar::refresh()
mSGBandwidth->setVisible(net_stats_visible);
mSGPacketLoss->setVisible(net_stats_visible);
childSetEnabled("stat_btn", net_stats_visible);
+
+ // update the master volume button state
+ bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute();
+ mBtnVolume->setToggleState(mute_audio);
+
+ // Don't show media toggle if there's no media, parcel media, and no parcel audio
+ mMediaToggle->setVisible(LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio());
+ // Note the "sense" of the toggle is opposite whether media is playing or not
+ mMediaToggle->setValue(! (LLViewerMedia::isAnyMediaShowing() ||
+ LLViewerMedia::isParcelMediaPlaying() ||
+ LLViewerMedia::isParcelAudioPlaying()));
}
void LLStatusBar::setVisibleForMouselook(bool visible)
{
mTextTime->setVisible(visible);
- mBtnBuyCurrency->setVisible(visible);
+ getChild<LLUICtrl>("buycurrency")->setVisible(visible);
+ getChild<LLUICtrl>("buyL")->setVisible(visible);
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
@@ -358,17 +390,18 @@ void LLStatusBar::setBalance(S32 balance)
{
std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance );
+ LLButton* btn_buy_currency = getChild<LLButton>("buycurrency");
LLStringUtil::format_map_t string_args;
string_args["[AMT]"] = llformat("%s", money_str.c_str());
- std::string labe_str = getString("buycurrencylabel", string_args);
- mBtnBuyCurrency->setLabel(labe_str);
+ std::string label_str = getString("buycurrencylabel", string_args);
+ btn_buy_currency->setLabel(label_str);
// Resize the balance button so that the label fits it, and the button expands to the left.
// *TODO: LLButton should have an option where to expand.
{
- S32 saved_right = mBtnBuyCurrency->getRect().mRight;
- mBtnBuyCurrency->autoResize();
- mBtnBuyCurrency->translate(saved_right - mBtnBuyCurrency->getRect().mRight, 0);
+ S32 saved_right = btn_buy_currency->getRect().mRight;
+ btn_buy_currency->autoResize();
+ btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0);
}
if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold")))
@@ -473,14 +506,14 @@ S32 LLStatusBar::getSquareMetersLeft() const
return mSquareMetersCredit - mSquareMetersCommitted;
}
-static void onClickBuyCurrency(void* data)
+void LLStatusBar::onClickBuyCurrency()
{
LLFloaterBuyCurrency::buyCurrency();
}
static void onClickHealth(void* )
{
- LLNotifications::instance().add("NotSafe");
+ LLNotificationsUtil::add("NotSafe");
}
static void onClickScriptDebug(void*)
@@ -488,6 +521,62 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
+void LLStatusBar::onMouseEnterVolume()
+{
+ LLButton* volbtn = getChild<LLButton>( "volume_btn" );
+ LLRect vol_btn_screen_rect = volbtn->calcScreenRect();
+ LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
+ volume_pulldown_rect.setLeftTopAndSize(vol_btn_screen_rect.mLeft -
+ (volume_pulldown_rect.getWidth() - vol_btn_screen_rect.getWidth())/2,
+ vol_btn_screen_rect.mBottom,
+ volume_pulldown_rect.getWidth(),
+ volume_pulldown_rect.getHeight());
+
+ mPanelVolumePulldown->setShape(volume_pulldown_rect);
+
+
+ // show the master volume pull-down
+ mPanelVolumePulldown->setVisible(TRUE);
+ mPanelNearByMedia->setVisible(FALSE);
+}
+
+void LLStatusBar::onMouseEnterNearbyMedia()
+{
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
+ LLRect nearby_media_rect = mPanelNearByMedia->getRect();
+ LLButton* nearby_media_btn = getChild<LLButton>( "media_toggle_btn" );
+ LLRect nearby_media_btn_rect = nearby_media_btn->calcScreenRect();
+ nearby_media_rect.setLeftTopAndSize(nearby_media_btn_rect.mLeft -
+ (nearby_media_rect.getWidth() - nearby_media_btn_rect.getWidth())/2,
+ nearby_media_btn_rect.mBottom,
+ nearby_media_rect.getWidth(),
+ nearby_media_rect.getHeight());
+ // force onscreen
+ nearby_media_rect.translate(popup_holder->getRect().getWidth() - nearby_media_rect.mRight, 0);
+
+ // show the master volume pull-down
+ mPanelNearByMedia->setShape(nearby_media_rect);
+ mPanelNearByMedia->setVisible(TRUE);
+ mPanelVolumePulldown->setVisible(FALSE);
+}
+
+
+static void onClickVolume(void* data)
+{
+ // toggle the master mute setting
+ bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute();
+ LLAppViewer::instance()->setMasterSystemAudioMute(!mute_audio);
+}
+
+//static
+void LLStatusBar::onClickMediaToggle(void* data)
+{
+ LLStatusBar *status_bar = (LLStatusBar*)data;
+ // "Selected" means it was showing the "play" icon (so media was playing), and now it shows "pause", so turn off media
+ bool enable = ! status_bar->mMediaToggle->getValue();
+ LLViewerMedia::setAllMediaEnabled(enable);
+}
+
// sets the static variables necessary for the date
void LLStatusBar::setupDate()
{
@@ -557,11 +646,27 @@ void LLStatusBar::onClickStatGraph(void* data)
LLFloaterReg::showInstance("lagmeter");
}
+void LLStatusBar::onClickScreen(S32 x, S32 y)
+{
+ if (mPanelNearByMedia->getVisible())
+ {
+ LLRect screen_rect = mPanelNearByMedia->calcScreenRect();
+ if (!screen_rect.pointInRect(x, y))
+ {
+ mPanelNearByMedia->setVisible(FALSE);
+ }
+ }
+}
+
BOOL can_afford_transaction(S32 cost)
{
return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
}
+void LLStatusBar::onVolumeChanged(const LLSD& newvalue)
+{
+ refresh();
+}
// Implements secondlife:///app/balance/request to request a L$ balance
// update via UDP message system. JC
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index d5629e6f1e..e5240fcc3e 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -34,7 +34,6 @@
#define LL_LLSTATUSBAR_H
#include "llpanel.h"
-#include <llmenugl.h>
// "Constants" loaded from settings.xml at start time
extern S32 STATUS_BAR_HEIGHT;
@@ -48,6 +47,8 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
+class LLPanelVolumePulldown;
+class LLPanelNearByMedia;
class LLStatusBar
: public LLPanel
@@ -87,14 +88,22 @@ public:
S32 getSquareMetersCommitted() const;
S32 getSquareMetersLeft() const;
+ LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; }
+
private:
// simple method to setup the part that holds the date
void setupDate();
- static void onCommitSearch(LLUICtrl*, void* data);
- static void onClickSearch(void* data);
+ void onClickBuyCurrency();
+ void onVolumeChanged(const LLSD& newvalue);
+
+ void onMouseEnterVolume();
+ void onMouseEnterNearbyMedia();
+ void onClickScreen(S32 x, S32 y);
static void onClickStatGraph(void* data);
+ static void onClickMediaToggle(void* data);
+
private:
LLTextBox *mTextHealth;
LLTextBox *mTextTime;
@@ -102,7 +111,8 @@ private:
LLStatGraph *mSGBandwidth;
LLStatGraph *mSGPacketLoss;
- LLButton *mBtnBuyCurrency;
+ LLButton *mBtnVolume;
+ LLButton *mMediaToggle;
S32 mBalance;
S32 mHealth;
@@ -110,7 +120,8 @@ private:
S32 mSquareMetersCommitted;
LLFrameTimer* mBalanceTimer;
LLFrameTimer* mHealthTimer;
-
+ LLPanelVolumePulldown* mPanelVolumePulldown;
+ LLPanelNearByMedia* mPanelNearByMedia;
static std::vector<std::string> sDays;
static std::vector<std::string> sMonths;
static const U32 MAX_DATE_STRING_LENGTH;
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 2485563cbc..61705c4eb3 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -49,6 +49,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
if (source != LLUUID::null && source != gAgent.getID() )
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href =
LLSLURL::buildCommand("agent", source, "inspect");
}
@@ -56,6 +57,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
{
// Make the resident's own name white and don't make the name clickable.
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[source] = style_params;
@@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l
if (id != LLUUID::null && !link.empty())
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href = link;
}
else
{
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[id] = style_params;
}
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 5440b2c9ad..1d479bac8c 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -234,12 +234,7 @@ void LLSurface::createSTexture()
{
if (!mSTexturep)
{
- // Fill with dummy gray data.
-
- //mSTexturep = LLViewerTextureManager::getLocalTexture(sTextureSize, sTextureSize, 3, FALSE);
- //mSTexturep->dontDiscard();
- //mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
-
+ // Fill with dummy gray data.
// GL NOT ACTIVE HERE
LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize, sTextureSize, 3);
U8 *default_texture = raw->getData();
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 0ce794addb..48e4a6ccc7 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -60,6 +60,7 @@ LLSurfacePatch::LLSurfacePatch() :
mHeightsGenerated(FALSE),
mDataOffset(0),
mDataZ(NULL),
+ mDataNorm(NULL),
mVObjp(NULL),
mOriginRegion(0.f, 0.f, 0.f),
mCenterRegion(0.f, 0.f, 0.f),
@@ -355,12 +356,14 @@ void LLSurfacePatch::calcNormal(const U32 x, const U32 y, const U32 stride)
normal %= c2;
normal.normVec();
+ llassert(mDataNorm);
*(mDataNorm + surface_stride * y + x) = normal;
}
const LLVector3 &LLSurfacePatch::getNormal(const U32 x, const U32 y) const
{
U32 surface_stride = mSurfacep->getGridsPerEdge();
+ llassert(mDataNorm);
return *(mDataNorm + surface_stride * y + x);
}
@@ -402,6 +405,7 @@ void LLSurfacePatch::updateVerticalStats()
U32 i, j, k;
F32 z, total;
+ llassert(mDataZ);
z = *(mDataZ);
mMinZ = z;
diff --git a/indra/newview/llsyswellitem.cpp b/indra/newview/llsyswellitem.cpp
index eef8435006..0cfcfdc634 100644
--- a/indra/newview/llsyswellitem.cpp
+++ b/indra/newview/llsyswellitem.cpp
@@ -77,10 +77,11 @@ void LLSysWellItem::onClickCloseBtn()
//---------------------------------------------------------------------------------
BOOL LLSysWellItem::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ BOOL res = LLPanel::handleMouseDown(x, y, mask);
if(!mCloseBtn->getRect().pointInRect(x, y))
mOnItemClick(this);
- return LLPanel::handleMouseDown(x, y, mask);
+ return res;
}
//---------------------------------------------------------------------------------
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 93a931dc78..127b4265ca 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -32,30 +32,38 @@
#include "llviewerprecompiledheaders.h" // must be first include
+#include "llagent.h"
+
#include "llflatlistview.h"
+#include "llfloaterreg.h"
+#include "llnotifications.h"
#include "llsyswellwindow.h"
#include "llbottomtray.h"
+#include "llscriptfloater.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llchiclet.h"
#include "lltoastpanel.h"
#include "llnotificationmanager.h"
-
+#include "llnotificationsutil.h"
+#include "llspeakers.h"
//---------------------------------------------------------------------------------
-LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLDockableFloater(NULL, key),
+LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true, key),
mChannel(NULL),
mMessageList(NULL),
- mSeparator(NULL)
-{
- LLIMMgr::getInstance()->addSessionObserver(this);
- LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLSysWellWindow::findIMChiclet, this, _1));
+ mSysWellChiclet(NULL),
+ mSeparator(NULL),
+ NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"),
+ IM_WELL_ANCHOR_NAME("im_well_panel")
+{
mTypedItemsCount[IT_NOTIFICATION] = 0;
mTypedItemsCount[IT_INSTANT_MESSAGE] = 0;
+ setOverlapsScreenChannel(true);
}
//---------------------------------------------------------------------------------
@@ -63,10 +71,6 @@ BOOL LLSysWellWindow::postBuild()
{
mMessageList = getChild<LLFlatListView>("notification_list");
- // init connections to the list's update events
- connectListUpdaterToSignal("notify");
- connectListUpdaterToSignal("groupnotify");
-
// get a corresponding channel
initChannel();
@@ -82,93 +86,35 @@ BOOL LLSysWellWindow::postBuild()
mMessageList->addItem(mSeparator);
- return LLDockableFloater::postBuild();
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::setMinimized(BOOL minimize)
-{
- // we don't show empty Message Well window
- if (!minimize)
- {
- setVisible(!isWindowEmpty());
- }
+ // click on SysWell Window should clear "new message" state (and 'Lit' status). EXT-3147.
+ // mouse up callback is not called in this case.
+ setMouseDownCallback(boost::bind(&LLSysWellWindow::releaseNewMessagesState, this));
- LLDockableFloater::setMinimized(minimize);
+ return LLTransientDockableFloater::postBuild();
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::connectListUpdaterToSignal(std::string notification_type)
+void LLSysWellWindow::setMinimized(BOOL minimize)
{
- LLNotificationsUI::LLNotificationManager* manager = LLNotificationsUI::LLNotificationManager::getInstance();
- LLNotificationsUI::LLEventHandler* n_handler = manager->getHandlerForNotification(notification_type);
- if(n_handler)
- {
- n_handler->setNotificationIDCallback(boost::bind(&LLSysWellWindow::removeItemByID, this, _1));
- }
- else
- {
- llwarns << "LLSysWellWindow::connectListUpdaterToSignal() - could not get a handler for '" << notification_type <<"' type of notifications" << llendl;
- }
+ LLTransientDockableFloater::setMinimized(minimize);
}
//---------------------------------------------------------------------------------
void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)
{
- onChicletClick();
+ // just set floater visible. Screen channels will be cleared.
+ setVisible(TRUE);
}
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::onChicletClick()
-{
- // 1 - remove StartUp toast and channel if present
- if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown())
- {
- LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose();
- }
-
- // 2 - toggle instance of SysWell's chiclet-window
- toggleWindow();
+void LLSysWellWindow::setSysWellChiclet(LLSysWellChiclet* chiclet)
+{
+ mSysWellChiclet = chiclet;
+ if(mSysWellChiclet)
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
-
//---------------------------------------------------------------------------------
LLSysWellWindow::~LLSysWellWindow()
{
- LLIMMgr::getInstance()->removeSessionObserver(this);
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::addItem(LLSysWellItem::Params p)
-{
- LLSD value = p.notification_id;
- // do not add clones
- if( mMessageList->getItemByValue(value))
- return;
-
- LLSysWellItem* new_item = new LLSysWellItem(p);
- if (mMessageList->addItem(new_item, value, ADD_TOP))
- {
- handleItemAdded(IT_NOTIFICATION);
-
- reshapeWindow();
-
- new_item->setOnItemCloseCallback(boost::bind(&LLSysWellWindow::onItemClose, this, _1));
- new_item->setOnItemClickCallback(boost::bind(&LLSysWellWindow::onItemClick, this, _1));
- }
- else
- {
- llwarns << "Unable to add Notification into the list, notification ID: " << p.notification_id
- << ", title: " << p.title
- << llendl;
-
- new_item->die();
- }
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::clear()
-{
- mMessageList->clear();
}
//---------------------------------------------------------------------------------
@@ -193,42 +139,13 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id)
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::onItemClick(LLSysWellItem* item)
-{
- LLUUID id = item->getID();
- if(mChannel)
- mChannel->loadStoredToastByNotificationIDToChannel(id);
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::onItemClose(LLSysWellItem* item)
-{
- LLUUID id = item->getID();
- removeItemByID(id);
- if(mChannel)
- mChannel->killToastByNotificationID(id);
-}
-
-//--------------------------------------------------------------------------
-void LLSysWellWindow::onStoreToast(LLPanel* info_panel, LLUUID id)
-{
- LLSysWellItem::Params p;
- p.notification_id = id;
- p.title = static_cast<LLToastPanel*>(info_panel)->getTitle();
- addItem(p);
-}
-
//---------------------------------------------------------------------------------
void LLSysWellWindow::initChannel()
{
LLNotificationsUI::LLScreenChannelBase* channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(
LLUUID(gSavedSettings.getString("NotificationChannelUUID")));
mChannel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>(channel);
- if(mChannel)
- {
- mChannel->setOnStoreToastCallback(boost::bind(&LLSysWellWindow::onStoreToast, this, _1, _2));
- }
- else
+ if(NULL == mChannel)
{
llwarns << "LLSysWellWindow::initChannel() - could not get a requested screen channel" << llendl;
}
@@ -237,76 +154,53 @@ void LLSysWellWindow::initChannel()
//---------------------------------------------------------------------------------
void LLSysWellWindow::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRect();
+ rect = gViewerWindow->getWorldViewRectScaled();
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::toggleWindow()
-{
- if (getDockControl() == NULL)
- {
- setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getSysWell(), this,
- getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1)));
- }
-
- if(!getVisible() || isMinimized())
- {
- if(mChannel)
- {
- mChannel->removeAndStoreAllStorableToasts();
- }
- if(isWindowEmpty())
- {
- return;
- }
- setVisible(TRUE);
- }
- else if (isDocked())
- {
- setVisible(FALSE);
- }
- //set window in foreground
- setFocus(getVisible());
-}
//---------------------------------------------------------------------------------
void LLSysWellWindow::setVisible(BOOL visible)
{
- if(visible)
- {
- if (LLBottomTray::instanceExists())
- {
- LLBottomTray::getInstance()->getSysWell()->setToggleState(TRUE);
- }
- }
- else
+ if (visible)
{
- if (LLBottomTray::instanceExists())
+ if (NULL == getDockControl() && getDockTongue().notNull())
{
- LLBottomTray::getInstance()->getSysWell()->setToggleState(FALSE);
+ setDockControl(new LLDockControl(
+ LLBottomTray::getInstance()->getChild<LLView>(getAnchorViewName()), this,
+ getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1)));
}
}
- LLDockableFloater::setVisible(visible);
+ // do not show empty window
+ if (NULL == mMessageList || isWindowEmpty()) visible = FALSE;
+
+ LLTransientDockableFloater::setVisible(visible);
// update notification channel state
if(mChannel)
{
mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
+ }
+
+ if (visible)
+ {
+ releaseNewMessagesState();
}
}
//---------------------------------------------------------------------------------
void LLSysWellWindow::setDocked(bool docked, bool pop_on_undock)
{
- LLDockableFloater::setDocked(docked, pop_on_undock);
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
// update notification channel state
if(mChannel)
{
mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
}
}
@@ -328,7 +222,9 @@ void LLSysWellWindow::reshapeWindow()
new_window_height = MAX_WINDOW_HEIGHT;
}
S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
- curRect.setLeftTopAndSize(curRect.mLeft, newY, MIN_WINDOW_WIDTH, new_window_height);
+ S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
+ : curRect.getWidth();
+ curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
setRect(curRect);
@@ -340,60 +236,11 @@ void LLSysWellWindow::reshapeWindow()
}
}
-//---------------------------------------------------------------------------------
-LLChiclet* LLSysWellWindow::findIMChiclet(const LLUUID& sessionId)
+void LLSysWellWindow::releaseNewMessagesState()
{
- LLChiclet* res = NULL;
- RowPanel* panel = mMessageList->getTypedItemByValue<RowPanel>(sessionId);
- if (panel != NULL)
+ if (NULL != mSysWellChiclet)
{
- res = panel->mChiclet;
- }
-
- return res;
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::addIMRow(const LLUUID& sessionId, S32 chicletCounter,
- const std::string& name, const LLUUID& otherParticipantId)
-{
- RowPanel* item = new RowPanel(this, sessionId, chicletCounter, name, otherParticipantId);
- if (mMessageList->insertItemAfter(mSeparator, item, sessionId))
- {
- handleItemAdded(IT_INSTANT_MESSAGE);
- }
- else
- {
- llwarns << "Unable to add IM Row into the list, sessionID: " << sessionId
- << ", name: " << name
- << ", other participant ID: " << otherParticipantId
- << llendl;
-
- item->die();
- }
-}
-
-//---------------------------------------------------------------------------------
-void LLSysWellWindow::delIMRow(const LLUUID& sessionId)
-{
- if (mMessageList->removeItemByValue(sessionId))
- {
- handleItemRemoved(IT_INSTANT_MESSAGE);
- }
- else
- {
- llwarns << "Unable to remove IM Row from the list, sessionID: " << sessionId
- << llendl;
- }
-
- // remove all toasts that belong to this session from a screen
- if(mChannel)
- mChannel->removeToastsBySessionID(sessionId);
-
- // hide chiclet window if there are no items left
- if(isWindowEmpty())
- {
- setVisible(FALSE);
+ mSysWellChiclet->setNewMessagesState(false);
}
}
@@ -404,43 +251,7 @@ bool LLSysWellWindow::isWindowEmpty()
return mMessageList->size() == 1;
}
-//---------------------------------------------------------------------------------
-//virtual
-void LLSysWellWindow::sessionAdded(const LLUUID& session_id,
- const std::string& name, const LLUUID& other_participant_id)
-{
- //*TODO get rid of get_session_value, session_id's are unique, cause performance degradation with lots chiclets (IB)
- if (mMessageList->getItemByValue(session_id) == NULL)
- {
- S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id);
- if (chicletCounter > -1)
- {
- addIMRow(session_id, chicletCounter, name, other_participant_id);
- reshapeWindow();
- }
- }
-}
-
-//---------------------------------------------------------------------------------
-//virtual
-void LLSysWellWindow::sessionRemoved(const LLUUID& sessionId)
-{
- delIMRow(sessionId);
- reshapeWindow();
- LLBottomTray::getInstance()->getSysWell()->updateUreadIMNotifications();
-}
-
-void LLSysWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
- //for outgoing ad-hoc and group im sessions only
- LLChiclet* chiclet = findIMChiclet(old_session_id);
- if (chiclet)
- {
- chiclet->setSessionId(new_session_id);
- mMessageList->updateValue(old_session_id, new_session_id);
- }
-}
-
+// *TODO: mantipov: probably is deprecated
void LLSysWellWindow::handleItemAdded(EItemType added_item_type)
{
bool should_be_shown = ++mTypedItemsCount[added_item_type] == 1 && anotherTypeExists(added_item_type);
@@ -452,6 +263,25 @@ void LLSysWellWindow::handleItemAdded(EItemType added_item_type)
// refresh list to recalculate mSeparator position
mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight());
}
+
+ //fix for EXT-3254
+ //set limits for min_height.
+ S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
+
+ std::vector<LLPanel*> items;
+ mMessageList->getItems(items);
+
+ if(items.size()>1)//first item is separator
+ {
+ S32 min_height;
+ S32 min_width;
+ getResizeLimits(&min_width,&min_height);
+
+ min_height = items[1]->getRect().getHeight() + 2 * mMessageList->getBorderWidth() + parent_list_delta_height;
+
+ setResizeLimits(min_width,min_height);
+ }
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
void LLSysWellWindow::handleItemRemoved(EItemType removed_item_type)
@@ -465,6 +295,7 @@ void LLSysWellWindow::handleItemRemoved(EItemType removed_item_type)
// refresh list to recalculate mSeparator position
mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight());
}
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
bool LLSysWellWindow::anotherTypeExists(EItemType item_type)
@@ -488,8 +319,12 @@ bool LLSysWellWindow::anotherTypeExists(EItemType item_type)
return exists;
}
+/************************************************************************/
+/* RowPanel implementation */
+/************************************************************************/
+
//---------------------------------------------------------------------------------
-LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& sessionId,
+LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& sessionId,
S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId) :
LLPanel(LLPanel::Params()), mChiclet(NULL), mParent(parent)
{
@@ -502,63 +337,588 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
switch (im_chiclet_type)
{
case LLIMChiclet::TYPE_GROUP:
+ mChiclet = getChild<LLIMGroupChiclet>("group_chiclet");
+ break;
case LLIMChiclet::TYPE_AD_HOC:
- mChiclet = getChild<LLIMChiclet>("group_chiclet");
- childSetVisible("p2p_chiclet", false);
+ mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");
break;
case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway
case LLIMChiclet::TYPE_IM:
- mChiclet = getChild<LLIMChiclet>("p2p_chiclet");
- childSetVisible("group_chiclet", false);
+ mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");
break;
}
// Initialize chiclet.
+ mChiclet->setChicletSizeChangedCallback(boost::bind(&LLIMWellWindow::RowPanel::onChicletSizeChanged, this, mChiclet, _2));
+ mChiclet->enableCounterControl(true);
mChiclet->setCounter(chicletCounter);
mChiclet->setSessionId(sessionId);
mChiclet->setIMSessionName(name);
mChiclet->setOtherParticipantId(otherParticipantId);
+ mChiclet->setVisible(true);
LLTextBox* contactName = getChild<LLTextBox>("contact_name");
contactName->setValue(name);
mCloseBtn = getChild<LLButton>("hide_btn");
- mCloseBtn->setCommitCallback(boost::bind(&LLSysWellWindow::RowPanel::onClosePanel, this));
+ mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::RowPanel::onClosePanel, this));
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
+{
+ LLTextBox* text = getChild<LLTextBox>("contact_name");
+ S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
+ LLRect text_rect = text->getRect();
+ text_rect.mLeft = new_text_left;
+ text->setRect(text_rect);
}
//---------------------------------------------------------------------------------
-LLSysWellWindow::RowPanel::~RowPanel()
+LLIMWellWindow::RowPanel::~RowPanel()
{
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::RowPanel::onClosePanel()
+void LLIMWellWindow::RowPanel::onClosePanel()
{
gIMMgr->leaveSession(mChiclet->getSessionId());
// This row panel will be removed from the list in LLSysWellWindow::sessionRemoved().
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::RowPanel::onMouseEnter(S32 x, S32 y, MASK mask)
+void LLIMWellWindow::RowPanel::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemSelected"));
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::RowPanel::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemUnselected"));
+}
+
+//---------------------------------------------------------------------------------
+// virtual
+BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ // Pass the mouse down event to the chiclet (EXT-596).
+ if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
+ mChiclet->onMouseDown();
+ return TRUE;
+ }
+
+ return LLPanel::handleMouseDown(x, y, mask);
+}
+
+// virtual
+BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ return mChiclet->handleRightMouseDown(x, y, mask);
+}
+/************************************************************************/
+/* ObjectRowPanel implementation */
+/************************************************************************/
+
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bool new_message/* = false*/)
+ : LLPanel()
+ , mChiclet(NULL)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
+
+ initChiclet(notification_id);
+
+ LLTextBox* obj_name = getChild<LLTextBox>("object_name");
+ obj_name->setValue(LLScriptFloaterManager::getObjectName(notification_id));
+
+ mCloseBtn = getChild<LLButton>("hide_btn");
+ mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
+}
+
+//---------------------------------------------------------------------------------
+LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
+{
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onClosePanel()
+{
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId());
+}
+
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/)
+{
+ // Choose which of the pre-created chiclets to use.
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
+ {
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
+ mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
+ break;
+ default:
+ mChiclet = getChild<LLScriptChiclet>("object_chiclet");
+ break;
+ }
+
+ mChiclet->setVisible(true);
+ mChiclet->setSessionId(notification_id);
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onMouseEnter(S32 x, S32 y, MASK mask)
{
setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemSelected"));
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::RowPanel::onMouseLeave(S32 x, S32 y, MASK mask)
+void LLIMWellWindow::ObjectRowPanel::onMouseLeave(S32 x, S32 y, MASK mask)
{
setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemUnselected"));
}
//---------------------------------------------------------------------------------
// virtual
-BOOL LLSysWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Pass the mouse down event to the chiclet (EXT-596).
if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
mChiclet->onMouseDown();
+ return TRUE;
+ }
return LLPanel::handleMouseDown(x, y, mask);
}
+// virtual
+BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ return mChiclet->handleRightMouseDown(x, y, mask);
+}
+
+/************************************************************************/
+/* LLNotificationWellWindow implementation */
+/************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+// PUBLIC METHODS
+LLNotificationWellWindow::LLNotificationWellWindow(const LLSD& key)
+: LLSysWellWindow(key)
+{
+ // init connections to the list's update events
+ connectListUpdaterToSignal("notify");
+ connectListUpdaterToSignal("groupnotify");
+ connectListUpdaterToSignal("offer");
+}
+
+// static
+LLNotificationWellWindow* LLNotificationWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
+{
+ return LLFloaterReg::getTypedInstance<LLNotificationWellWindow>("notification_well_window", key);
+}
+
+// virtual
+BOOL LLNotificationWellWindow::postBuild()
+{
+ BOOL rv = LLSysWellWindow::postBuild();
+ setTitle(getString("title_notification_well_window"));
+ return rv;
+}
+
+// virtual
+void LLNotificationWellWindow::setVisible(BOOL visible)
+{
+ if (visible)
+ {
+ // when Notification channel is cleared, storable toasts will be added into the list.
+ clearScreenChannels();
+ }
+
+ LLSysWellWindow::setVisible(visible);
+}
+
+//---------------------------------------------------------------------------------
+void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
+{
+ LLSD value = p.notification_id;
+ // do not add clones
+ if( mMessageList->getItemByValue(value))
+ return;
+
+ LLSysWellItem* new_item = new LLSysWellItem(p);
+ if (mMessageList->addItem(new_item, value, ADD_TOP))
+ {
+ handleItemAdded(IT_NOTIFICATION);
+
+ reshapeWindow();
+
+ new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1));
+ new_item->setOnItemClickCallback(boost::bind(&LLNotificationWellWindow::onItemClick, this, _1));
+ }
+ else
+ {
+ llwarns << "Unable to add Notification into the list, notification ID: " << p.notification_id
+ << ", title: " << p.title
+ << llendl;
+
+ new_item->die();
+ }
+}
+
+void LLNotificationWellWindow::closeAll()
+{
+ // Need to clear notification channel, to add storable toasts into the list.
+ clearScreenChannels();
+ std::vector<LLPanel*> items;
+ mMessageList->getItems(items);
+ for (std::vector<LLPanel*>::iterator
+ iter = items.begin(),
+ iter_end = items.end();
+ iter != iter_end; ++iter)
+ {
+ LLSysWellItem* sys_well_item = dynamic_cast<LLSysWellItem*>(*iter);
+ if (sys_well_item)
+ onItemClose(sys_well_item);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PRIVATE METHODS
+void LLNotificationWellWindow::initChannel()
+{
+ LLSysWellWindow::initChannel();
+ if(mChannel)
+ {
+ mChannel->setOnStoreToastCallback(boost::bind(&LLNotificationWellWindow::onStoreToast, this, _1, _2));
+ }
+}
+
+void LLNotificationWellWindow::clearScreenChannels()
+{
+ // 1 - remove StartUp toast and channel if present
+ if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown())
+ {
+ LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose();
+ }
+
+ // 2 - remove toasts in Notification channel
+ if(mChannel)
+ {
+ mChannel->removeAndStoreAllStorableToasts();
+ }
+}
+
+void LLNotificationWellWindow::onStoreToast(LLPanel* info_panel, LLUUID id)
+{
+ LLSysWellItem::Params p;
+ p.notification_id = id;
+ p.title = static_cast<LLToastPanel*>(info_panel)->getTitle();
+ addItem(p);
+}
+
+void LLNotificationWellWindow::connectListUpdaterToSignal(std::string notification_type)
+{
+ LLNotificationsUI::LLNotificationManager* manager = LLNotificationsUI::LLNotificationManager::getInstance();
+ LLNotificationsUI::LLEventHandler* n_handler = manager->getHandlerForNotification(notification_type);
+ if(n_handler)
+ {
+ n_handler->setNotificationIDCallback(boost::bind(&LLNotificationWellWindow::removeItemByID, this, _1));
+ }
+ else
+ {
+ llwarns << "LLSysWellWindow::connectListUpdaterToSignal() - could not get a handler for '" << notification_type <<"' type of notifications" << llendl;
+ }
+}
+
+void LLNotificationWellWindow::onItemClick(LLSysWellItem* item)
+{
+ LLUUID id = item->getID();
+ LLFloaterReg::showInstance("inspect_toast", id);
+}
+
+void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)
+{
+ LLUUID id = item->getID();
+ removeItemByID(id);
+ if(mChannel)
+ mChannel->killToastByNotificationID(id);
+}
+
+
+
+/************************************************************************/
+/* LLIMWellWindow implementation */
+/************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+// PUBLIC METHODS
+LLIMWellWindow::LLIMWellWindow(const LLSD& key)
+: LLSysWellWindow(key)
+{
+ LLIMMgr::getInstance()->addSessionObserver(this);
+ LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findIMChiclet, this, _1));
+ LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findObjectChiclet, this, _1));
+}
+
+LLIMWellWindow::~LLIMWellWindow()
+{
+ LLIMMgr::getInstance()->removeSessionObserver(this);
+}
+
+// static
+LLIMWellWindow* LLIMWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
+{
+ return LLFloaterReg::getTypedInstance<LLIMWellWindow>("im_well_window", key);
+}
+
+BOOL LLIMWellWindow::postBuild()
+{
+ BOOL rv = LLSysWellWindow::postBuild();
+ setTitle(getString("title_im_well_window"));
+ return rv;
+}
+
+//virtual
+void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
+ const std::string& name, const LLUUID& other_participant_id)
+{
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!session) return;
+
+ // no need to spawn chiclets for participants in P2P calls called through Avaline
+ if (session->isP2P() && session->isOtherParticipantAvaline()) return;
+
+ if (mMessageList->getItemByValue(session_id)) return;
+
+ addIMRow(session_id, 0, name, other_participant_id);
+ reshapeWindow();
+}
+
+//virtual
+void LLIMWellWindow::sessionRemoved(const LLUUID& sessionId)
+{
+ delIMRow(sessionId);
+ reshapeWindow();
+}
+
+//virtual
+void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+ //for outgoing ad-hoc and group im sessions only
+ LLChiclet* chiclet = findIMChiclet(old_session_id);
+ if (chiclet)
+ {
+ chiclet->setSessionId(new_session_id);
+ mMessageList->updateValue(old_session_id, new_session_id);
+ }
+}
+
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id)
+{
+ LLChiclet* res = NULL;
+ ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(notification_id);
+ if (panel != NULL)
+ {
+ res = panel->mChiclet;
+ }
+
+ return res;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PRIVATE METHODS
+LLChiclet* LLIMWellWindow::findIMChiclet(const LLUUID& sessionId)
+{
+ LLChiclet* res = NULL;
+ RowPanel* panel = mMessageList->getTypedItemByValue<RowPanel>(sessionId);
+ if (panel != NULL)
+ {
+ res = panel->mChiclet;
+ }
+
+ return res;
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::addIMRow(const LLUUID& sessionId, S32 chicletCounter,
+ const std::string& name, const LLUUID& otherParticipantId)
+{
+ RowPanel* item = new RowPanel(this, sessionId, chicletCounter, name, otherParticipantId);
+ if (mMessageList->insertItemAfter(mSeparator, item, sessionId))
+ {
+ handleItemAdded(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to add IM Row into the list, sessionID: " << sessionId
+ << ", name: " << name
+ << ", other participant ID: " << otherParticipantId
+ << llendl;
+
+ item->die();
+ }
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
+{
+ //fix for EXT-3252
+ //without this line LLIMWellWindow receive onFocusLost
+ //and hide itself. It was becaue somehow LLIMChicklet was in focus group for
+ //LLIMWellWindow...
+ //But I didn't find why this happen..
+ gFocusMgr.clearLastFocusForGroup(this);
+
+ if (mMessageList->removeItemByValue(sessionId))
+ {
+ handleItemRemoved(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to remove IM Row from the list, sessionID: " << sessionId
+ << llendl;
+ }
+
+ // remove all toasts that belong to this session from a screen
+ if(mChannel)
+ mChannel->removeToastsBySessionID(sessionId);
+
+ // hide chiclet window if there are no items left
+ if(isWindowEmpty())
+ {
+ setVisible(FALSE);
+ }
+ else
+ {
+ setFocus(true);
+ }
+}
+
+void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_message/* = false*/)
+{
+ if (mMessageList->getItemByValue(notification_id) == NULL)
+ {
+ ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message);
+ if (mMessageList->insertItemAfter(mSeparator, item, notification_id))
+ {
+ handleItemAdded(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl;
+ item->die();
+ }
+ reshapeWindow();
+ }
+}
+
+void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
+{
+ if (mMessageList->removeItemByValue(notification_id))
+ {
+ handleItemRemoved(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl;
+ }
+
+ reshapeWindow();
+ // hide chiclet window if there are no items left
+ if(isWindowEmpty())
+ {
+ setVisible(FALSE);
+ }
+}
+
+
+void LLIMWellWindow::addIMRow(const LLUUID& session_id)
+{
+ if (hasIMRow(session_id)) return;
+
+ LLIMModel* im_model = LLIMModel::getInstance();
+ addIMRow(session_id, 0, im_model->getName(session_id), im_model->getOtherParticipantID(session_id));
+ reshapeWindow();
+}
+
+bool LLIMWellWindow::hasIMRow(const LLUUID& session_id)
+{
+ return mMessageList->getItemByValue(session_id);
+}
+
+void LLIMWellWindow::closeAll()
+{
+ // Generate an ignorable alert dialog if there is an active voice IM sesion
+ bool need_confirmation = false;
+ const LLIMModel& im_model = LLIMModel::instance();
+ std::vector<LLSD> values;
+ mMessageList->getValues(values);
+ for (std::vector<LLSD>::iterator
+ iter = values.begin(),
+ iter_end = values.end();
+ iter != iter_end; ++iter)
+ {
+ LLIMSpeakerMgr* speaker_mgr = im_model.getSpeakerManager(*iter);
+ if (speaker_mgr && speaker_mgr->isVoiceActive())
+ {
+ need_confirmation = true;
+ break;
+ }
+ }
+ if ( need_confirmation )
+ {
+ //Bring up a confirmation dialog
+ LLNotificationsUtil::add
+ ("ConfirmCloseAll", LLSD(), LLSD(),
+ boost::bind(&LLIMWellWindow::confirmCloseAll, this, _1, _2));
+ }
+ else
+ {
+ closeAllImpl();
+ }
+}
+
+void LLIMWellWindow::closeAllImpl()
+{
+ std::vector<LLSD> values;
+ mMessageList->getValues(values);
+
+ for (std::vector<LLSD>::iterator
+ iter = values.begin(),
+ iter_end = values.end();
+ iter != iter_end; ++iter)
+ {
+ LLPanel* panel = mMessageList->getItemByValue(*iter);
+
+ RowPanel* im_panel = dynamic_cast <RowPanel*> (panel);
+ if (im_panel)
+ {
+ gIMMgr->leaveSession(*iter);
+ continue;
+ }
+
+ ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);
+ if (obj_panel)
+ {
+ LLScriptFloaterManager::instance().onRemoveNotification(*iter);
+ }
+ }
+}
+
+bool LLIMWellWindow::confirmCloseAll(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch(option)
+ {
+ case 0:
+ {
+ closeAllImpl();
+ return true;
+ }
+ default:
+ break;
+ }
+ return false;
+}
+
// EOF
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index cbc5f7358f..3790aa3ea9 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -35,18 +35,22 @@
#include "llsyswellitem.h"
-#include "lldockablefloater.h"
+#include "lltransientdockablefloater.h"
#include "llbutton.h"
#include "llscreenchannel.h"
#include "llscrollcontainer.h"
-#include "llchiclet.h"
#include "llimview.h"
#include "boost/shared_ptr.hpp"
class LLFlatListView;
+class LLChiclet;
+class LLIMChiclet;
+class LLScriptChiclet;
+class LLSysWellChiclet;
-class LLSysWellWindow : public LLDockableFloater, LLIMSessionObserver
+
+class LLSysWellWindow : public LLTransientDockableFloater
{
public:
LLSysWellWindow(const LLSD& key);
@@ -58,31 +62,24 @@ public:
bool isWindowEmpty();
// Operating with items
- void addItem(LLSysWellItem::Params p);
- void clear( void );
void removeItemByID(const LLUUID& id);
// Operating with outfit
virtual void setVisible(BOOL visible);
void adjustWindowPosition();
- void toggleWindow();
- /*virtual*/ BOOL canClose() { return FALSE; }
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
// override LLFloater's minimization according to EXT-1216
/*virtual*/ void setMinimized(BOOL minimize);
- // Handlers
- void onItemClick(LLSysWellItem* item);
- void onItemClose(LLSysWellItem* item);
- void onStoreToast(LLPanel* info_panel, LLUUID id);
- void onChicletClick();
void onStartUpToastClick(S32 x, S32 y, MASK mask);
+ void setSysWellChiclet(LLSysWellChiclet* chiclet);
+
// size constants for the window and for its elements
static const S32 MAX_WINDOW_HEIGHT = 200;
static const S32 MIN_WINDOW_WIDTH = 318;
-private:
+protected:
typedef enum{
IT_NOTIFICATION,
@@ -91,31 +88,31 @@ private:
// gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111)
void getAllowedRect(LLRect& rect);
- // connect counter and list updaters to the corresponding signals
- void connectListUpdaterToSignal(std::string notification_type);
+
+
// init Window's channel
- void initChannel();
+ virtual void initChannel();
void handleItemAdded(EItemType added_item_type);
void handleItemRemoved(EItemType removed_item_type);
bool anotherTypeExists(EItemType item_type) ;
+ const std::string NOTIFICATION_WELL_ANCHOR_NAME;
+ const std::string IM_WELL_ANCHOR_NAME;
+ virtual const std::string& getAnchorViewName() = 0;
-
- class RowPanel;
void reshapeWindow();
- LLChiclet * findIMChiclet(const LLUUID& sessionId);
- void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
- void delIMRow(const LLUUID& sessionId);
- // LLIMSessionObserver observe triggers
- virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
- virtual void sessionRemoved(const LLUUID& session_id);
- void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ void releaseNewMessagesState();
// pointer to a corresponding channel's instance
LLNotificationsUI::LLScreenChannel* mChannel;
LLFlatListView* mMessageList;
/**
+ * Reference to an appropriate Well chiclet to release "new message" state. EXT-3147
+ */
+ LLSysWellChiclet* mSysWellChiclet;
+
+ /**
* Special panel which is used as separator of Notifications & IM Rows.
* It is always presents in the list and shown when it is necessary.
* It should be taken into account when reshaping and checking list size
@@ -125,7 +122,92 @@ private:
typedef std::map<EItemType, S32> typed_items_count_t;
typed_items_count_t mTypedItemsCount;
+};
+
+/**
+ * Class intended to manage incoming notifications.
+ *
+ * It contains a list of notifications that have not been responded to.
+ */
+class LLNotificationWellWindow : public LLSysWellWindow
+{
+public:
+ LLNotificationWellWindow(const LLSD& key);
+ static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD());
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setVisible(BOOL visible);
+
+ // Operating with items
+ void addItem(LLSysWellItem::Params p);
+
+ // Closes all notifications and removes them from the Notification Well
+ void closeAll();
+
+protected:
+ /*virtual*/ const std::string& getAnchorViewName() { return NOTIFICATION_WELL_ANCHOR_NAME; }
+
+private:
+ // init Window's channel
+ void initChannel();
+ void clearScreenChannels();
+
+
+ void onStoreToast(LLPanel* info_panel, LLUUID id);
+
+ // connect counter and list updaters to the corresponding signals
+ void connectListUpdaterToSignal(std::string notification_type);
+
+ // Handlers
+ void onItemClick(LLSysWellItem* item);
+ void onItemClose(LLSysWellItem* item);
+
+ // ID of a toast loaded by user (by clicking notification well item)
+ LLUUID mLoadedToastId;
+
+};
+
+/**
+ * Class intended to manage incoming messages in IM chats.
+ *
+ * It contains a list list of all active IM sessions.
+ */
+class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<LLIMWellWindow>
+{
+public:
+ LLIMWellWindow(const LLSD& key);
+ ~LLIMWellWindow();
+
+ static LLIMWellWindow* getInstance(const LLSD& key = LLSD());
+ static void initClass() { getInstance(); }
+
+ /*virtual*/ BOOL postBuild();
+
+ // LLIMSessionObserver observe triggers
+ /*virtual*/ void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ /*virtual*/ void sessionRemoved(const LLUUID& session_id);
+ /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+
+ void addObjectRow(const LLUUID& notification_id, bool new_message = false);
+ void removeObjectRow(const LLUUID& notification_id);
+
+ void addIMRow(const LLUUID& session_id);
+ bool hasIMRow(const LLUUID& session_id);
+
+ void closeAll();
+
+protected:
+ /*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; }
+
private:
+ LLChiclet * findIMChiclet(const LLUUID& sessionId);
+ LLChiclet* findObjectChiclet(const LLUUID& notification_id);
+
+ void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
+ void delIMRow(const LLUUID& sessionId);
+ bool confirmCloseAll(const LLSD& notification, const LLSD& response);
+ void closeAllImpl();
+
/**
* Scrolling row panel.
*/
@@ -138,7 +220,11 @@ private:
void onMouseEnter(S32 x, S32 y, MASK mask);
void onMouseLeave(S32 x, S32 y, MASK mask);
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
private:
+ static const S32 CHICLET_HPAD = 10;
+ void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
void onClosePanel();
public:
LLIMChiclet* mChiclet;
@@ -146,6 +232,26 @@ private:
LLButton* mCloseBtn;
const LLSysWellWindow* mParent;
};
+
+ class ObjectRowPanel: public LLPanel
+ {
+ public:
+ ObjectRowPanel(const LLUUID& notification_id, bool new_message = false);
+ virtual ~ObjectRowPanel();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+ private:
+ void onClosePanel();
+ void initChiclet(const LLUUID& notification_id, bool new_message = false);
+
+ public:
+ LLIMChiclet* mChiclet;
+ private:
+ LLButton* mCloseBtn;
+ };
};
#endif // LL_LLSYSWELLWINDOW_H
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index bc886d5743..dcc85392f7 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -39,7 +39,6 @@
#include "llagent.h"
#include "llslurl.h"
-#include "llurlsimstring.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
@@ -52,7 +51,7 @@
const std::string& LLTeleportHistoryItem::getTitle() const
{
- return gSavedSettings.getBOOL("ShowCoordinatesOption") ? mFullTitle : mTitle;
+ return gSavedSettings.getBOOL("NavBarShowCoordinates") ? mFullTitle : mTitle;
}
//////////////////////////////////////////////////////////////////////////////
@@ -167,17 +166,22 @@ void LLTeleportHistory::onHistoryChanged()
void LLTeleportHistory::purgeItems()
{
- mItems.erase(mItems.begin(), mItems.end()-1);
+ if (mItems.size() > 0)
+ {
+ mItems.erase(mItems.begin(), mItems.end()-1);
+ }
// reset the count
mRequestedItem = -1;
mCurrentItem = 0;
+
+ onHistoryChanged();
}
// static
std::string LLTeleportHistory::getCurrentLocationTitle(bool full, const LLVector3& local_pos_override)
{
std::string location_name;
- LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM : LLAgentUI::LOCATION_FORMAT_NORMAL;
+ LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_NO_MATURITY : LLAgentUI::LOCATION_FORMAT_NORMAL;
if (!LLAgentUI::buildLocationString(location_name, fmt, local_pos_override)) location_name = "Unknown";
return location_name;
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index 9f5563ed0b..a82bec7c4f 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -57,7 +57,8 @@ public:
{}
/**
- * @return title formatted according to the current value of the ShowCoordinatesOption setting.
+ * @return title formatted according to the current value of the
+ * NavBarShowCoordinates setting.
*/
const std::string& getTitle() const;
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index d3bbda1c72..c635f91423 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -246,13 +246,6 @@ void LLTeleportHistoryStorage::goToItem(S32 idx)
dump();
return;
}
-
- if (idx == (S32)mItems.size() - 1)
- {
- llwarns << "Will not teleport to the same location." << llendl;
- dump();
- return;
- }
// Attempt to teleport to the requested item.
gAgent.teleportViaLocation(mItems[idx].mGlobalPos);
diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp
index 595b24ad47..d7840fb435 100644
--- a/indra/newview/lltexglobalcolor.cpp
+++ b/indra/newview/lltexglobalcolor.cpp
@@ -108,9 +108,9 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)
return new_param;
}
-void LLTexParamGlobalColor::onGlobalColorChanged(bool set_by_user)
+void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake)
{
- mAvatar->onGlobalColorChanged(mTexGlobalColor, set_by_user);
+ mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake);
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h
index 1e6754133f..829a7d645b 100644
--- a/indra/newview/lltexglobalcolor.h
+++ b/indra/newview/lltexglobalcolor.h
@@ -80,7 +80,7 @@ public:
LLTexParamGlobalColor(LLTexGlobalColor *tex_color);
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
protected:
- /*virtual*/ void onGlobalColorChanged(bool set_by_user);
+ /*virtual*/ void onGlobalColorChanged(bool upload_bake);
private:
LLTexGlobalColor* mTexGlobalColor;
};
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 5d9046ac90..662e6dcabe 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -31,8 +31,14 @@
*/
#include "llviewerprecompiledheaders.h"
-#include "llagent.h"
+
#include "lltexlayer.h"
+
+#include "llagent.h"
+#include "llimagej2c.h"
+#include "llimagetga.h"
+#include "llvfile.h"
+#include "llvfs.h"
#include "llviewerstats.h"
#include "llviewerregion.h"
#include "llvoavatar.h"
@@ -161,8 +167,8 @@ void LLTexLayerSetBuffer::popProjection() const
BOOL LLTexLayerSetBuffer::needsRender()
{
const LLVOAvatarSelf* avatar = mTexLayerSet->getAvatar();
- BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal();
- BOOL needs_update = gAgentQueryManager.hasNoPendingQueries() && (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
+ BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal() && gAgentQueryManager.hasNoPendingQueries();
+ BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
if (needs_update)
{
BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT);
@@ -223,7 +229,16 @@ BOOL LLTexLayerSetBuffer::render()
}
else
{
- readBackAndUpload();
+ if (mTexLayerSet->isVisible())
+ {
+ readBackAndUpload();
+ }
+ else
+ {
+ mUploadPending = FALSE;
+ mNeedsUpload = FALSE;
+ mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE);
+ }
}
}
@@ -551,6 +566,8 @@ LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) :
mComposite( NULL ),
mAvatar( avatar ),
mUpdatesEnabled( FALSE ),
+ mIsVisible( TRUE ),
+ mBakedTexIndex(LLVOAvatarDefines::BAKED_HEAD),
mInfo( NULL )
{
}
@@ -665,44 +682,69 @@ BOOL LLTexLayerSet::isLocalTextureDataFinal() const
BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
{
BOOL success = TRUE;
+ mIsVisible = TRUE;
+
+ if (mMaskLayerList.size() > 0)
+ {
+ for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
+ {
+ LLTexLayerInterface* layer = *iter;
+ if (layer->isInvisibleAlphaMask())
+ {
+ mIsVisible = FALSE;
+ }
+ }
+ }
LLGLSUIDefault gls_ui;
LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
gGL.setColorMask(true, true);
- BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex);
-
// clear buffer area to ensure we don't pick up UI elements
{
gGL.flush();
LLGLDisable no_alpha(GL_ALPHA_TEST);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 1.f );
-
+
gl_rect_2d_simple( width, height );
-
+
gGL.flush();
}
- // composite color layers
- for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ if (mIsVisible)
{
- LLTexLayerInterface* layer = *iter;
- if (layer->getRenderPass() == LLTexLayer::RP_COLOR)
+ // composite color layers
+ for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
- gGL.flush();
- success &= layer->render(x, y, width, height, render_morph);
- gGL.flush();
- if (layer->isMorphValid())
+ LLTexLayerInterface* layer = *iter;
+ if (layer->getRenderPass() == LLTexLayer::RP_COLOR)
{
- mAvatar->setMorphMasksValid(TRUE, mBakedTexIndex);
+ gGL.flush();
+ success &= layer->render(x, y, width, height);
+ gGL.flush();
}
}
- }
+
+ renderAlphaMaskTextures(x, y, width, height, false);
- renderAlphaMaskTextures(x, y, width, height, false);
+ stop_glerror();
+ }
+ else
+ {
+ gGL.flush();
- stop_glerror();
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ LLGLDisable no_alpha(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.color4f( 0.f, 0.f, 0.f, 0.f );
+
+ gl_rect_2d_simple( width, height );
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ gGL.flush();
+
+ }
return success;
}
@@ -786,12 +828,10 @@ void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
{
memset(data, 255, width * height);
- BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex);
-
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
LLTexLayerInterface* layer = *iter;
- layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height, render_morph);
+ layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height);
}
// Set alpha back to that of our alpha masks.
@@ -863,6 +903,31 @@ void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_
mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
}
+BOOL LLTexLayerSet::isMorphValid()
+{
+ for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ {
+ LLTexLayerInterface* layer = *iter;
+ if (layer && !layer->isMorphValid())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+void LLTexLayerSet::invalidateMorphMasks()
+{
+ for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ {
+ LLTexLayerInterface* layer = *iter;
+ if (layer)
+ {
+ layer->invalidateMorphMasks();
+ }
+ }
+}
+
//-----------------------------------------------------------------------------
// LLTexLayerInfo
@@ -1075,7 +1140,11 @@ LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWea
BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions
{
- llassert(mInfo == NULL);
+ //llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating
+ if (mInfo != NULL) // above llassert(), but softened into a warning
+ {
+ llwarns << "BAD STUFF! mInfo != NULL" << llendl;
+ }
mInfo = info;
//mID = info->mID; // No ID
@@ -1282,7 +1351,7 @@ void LLTexLayer::calculateTexLayerColor(const param_color_list_t &param_list, LL
}
}
-BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
+BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
{
LLGLEnable color_mat(GL_COLOR_MATERIAL);
gPipeline.disableLights();
@@ -1333,7 +1402,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
}
}//*/
- renderMorphMasks(x, y, width, height, net_color, render_morph);
+ renderMorphMasks(x, y, width, height, net_color);
alpha_mask_specified = TRUE;
gGL.flush();
gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA);
@@ -1371,7 +1440,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
- gGL.getTexUnit(0)->bind(tex);
+ gGL.getTexUnit(0)->bind(tex, TRUE);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
gl_rect_2d_simple_tex( width, height );
@@ -1393,7 +1462,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
if( tex )
{
- gGL.getTexUnit(0)->bind(tex);
+ gGL.getTexUnit(0)->bind(tex, TRUE);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
@@ -1506,7 +1575,7 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
if( tex )
{
LLGLSNoAlphaTest gls_no_alpha_test;
- gGL.getTexUnit(0)->bind(tex);
+ gGL.getTexUnit(0)->bind(tex, TRUE);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
@@ -1534,12 +1603,12 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
return success;
}
-/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
+/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
{
- addAlphaMask(data, originX, originY, width, height, render_morph);
+ addAlphaMask(data, originX, originY, width, height);
}
-BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph)
+BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color)
{
BOOL success = TRUE;
@@ -1578,46 +1647,38 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
// Accumulate the alpha component of the texture
if( getInfo()->mLocalTexture != -1 )
{
- LLViewerTexture* tex = mLocalTextureObject->getImage();
- if( tex && (tex->getComponents() == 4) )
- {
- LLGLSNoAlphaTest gls_no_alpha_test;
+ LLViewerTexture* tex = mLocalTextureObject->getImage();
+ if( tex && (tex->getComponents() == 4) )
+ {
+ LLGLSNoAlphaTest gls_no_alpha_test;
- LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
-
- gGL.getTexUnit(0)->bind(tex);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
+
+ gGL.getTexUnit(0)->bind(tex, TRUE);
+ gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- gl_rect_2d_simple_tex( width, height );
+ gl_rect_2d_simple_tex( width, height );
- gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- }
- else
- {
- success = FALSE;
- }
+ gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
+ }
if( !getInfo()->mStaticImageFileName.empty() )
{
- LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
- if( tex )
- {
- if( (tex->getComponents() == 4) ||
- ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
- {
- LLGLSNoAlphaTest gls_no_alpha_test;
- gGL.getTexUnit(0)->bind(tex);
- gl_rect_2d_simple_tex( width, height );
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- }
- }
- else
+ LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
+ if( tex )
+ {
+ if( (tex->getComponents() == 4) ||
+ ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
{
- success = FALSE;
+ LLGLSNoAlphaTest gls_no_alpha_test;
+ gGL.getTexUnit(0)->bind(tex, TRUE);
+ gl_rect_2d_simple_tex( width, height );
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
}
+ }
// Draw a rectangle with the layer color to multiply the alpha by that color's alpha.
// Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO );
@@ -1634,7 +1695,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
gGL.setColorMask(true, true);
- if (render_morph && mHasMorph && success)
+ if (hasMorph() && success)
{
LLCRC alpha_mask_crc;
const LLUUID& uuid = getUUID();
@@ -1674,7 +1735,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
return success;
}
-void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
+void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
{
S32 size = width * height;
U8* alphaData = getAlphaData();
@@ -1684,7 +1745,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32
findNetColor( &net_color );
// TODO: eliminate need for layer morph mask valid flag
invalidateMorphMasks();
- renderMorphMasks(originX, originY, width, height, net_color, render_morph);
+ renderMorphMasks(originX, originY, width, height, net_color);
alphaData = getAlphaData();
}
if (alphaData)
@@ -1700,6 +1761,19 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32
}
}
+/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask()
+{
+ if (mLocalTextureObject)
+ {
+ if (mLocalTextureObject->getID() == IMG_INVISIBLE)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
// private helper function
LLUUID LLTexLayer::getUUID()
{
@@ -1787,7 +1861,7 @@ U32 LLTexLayerTemplate::updateWearableCache()
}
LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
{
- if (mWearableCache.size() <= i || i < 0)
+ if (mWearableCache.size() <= i)
{
return NULL;
}
@@ -1805,7 +1879,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
return layer;
}
-/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph)
+/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height)
{
BOOL success = TRUE;
updateWearableCache();
@@ -1825,9 +1899,9 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
}
if (layer)
{
- wearable->writeToAvatar(FALSE, FALSE);
+ wearable->writeToAvatar();
layer->setLTO(lto);
- success &= layer->render(x,y,width,height,render_morph);
+ success &= layer->render(x,y,width,height);
}
}
@@ -1849,7 +1923,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
return success;
}
-/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph)
+/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
{
U32 num_wearables = updateWearableCache();
for (U32 i = 0; i < num_wearables; i++)
@@ -1857,7 +1931,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
LLTexLayer *layer = getLayer(i);
if (layer)
{
- layer->addAlphaMask(data, originX, originY, width, height, render_morph);
+ layer->addAlphaMask(data, originX, originY, width, height);
}
}
}
@@ -1889,6 +1963,23 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
}
}
+/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask()
+{
+ U32 num_wearables = updateWearableCache();
+ for (U32 i = 0; i < num_wearables; i++)
+ {
+ LLTexLayer *layer = getLayer(i);
+ if (layer)
+ {
+ if (layer->isInvisibleAlphaMask())
+ {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
//-----------------------------------------------------------------------------
@@ -2034,7 +2125,7 @@ LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_n
// that once an image is a mask it's always a mask.
tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
}
- tex->createGLTexture(0, image_raw);
+ tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL);
gGL.getTexUnit(0)->bind(tex);
tex->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index e4a6e82ba5..5be58f64a9 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -81,13 +81,14 @@ public:
const LLTexLayerInfo* getInfo() const { return mInfo; }
virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
- virtual BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) = 0;
+ virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0;
void requestUpdate();
LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; }
virtual void deleteCaches() = 0;
void invalidateMorphMasks();
virtual void setHasMorph(BOOL newval) { mHasMorph = newval; }
+ BOOL hasMorph() { return mHasMorph; }
BOOL isMorphValid() { return mMorphMasksValid; }
const std::string& getName() const;
@@ -95,9 +96,10 @@ public:
const std::string& getGlobalColor() const;
virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0;
- virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) = 0;
+ virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0;
BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); }
BOOL isVisibilityMask() const;
+ virtual BOOL isInvisibleAlphaMask() = 0;
LLTexLayerSet* getLayerSet() {return mTexLayerSet;}
@@ -134,12 +136,14 @@ public:
LLTexLayerTemplate(const LLTexLayerTemplate &layer);
/*virtual*/ ~LLTexLayerTemplate();
- /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
/*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
/*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
- /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
/*virtual*/ void setHasMorph(BOOL newval);
/*virtual*/ void deleteCaches();
+ /*virtual*/ BOOL isInvisibleAlphaMask();
+
private:
U32 updateWearableCache();
LLTexLayer* getLayer(U32 i);
@@ -162,16 +166,17 @@ public:
/*virtual*/ ~LLTexLayer();
/*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
- /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
/*virtual*/ void deleteCaches();
U8* getAlphaData();
BOOL findNetColor(LLColor4* color) const;
/*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
- /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
- BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph);
- void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph);
+ /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
+ BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color);
+ void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
+ /*virtual*/ BOOL isInvisibleAlphaMask();
void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; }
LLLocalTextureObject* getLTO() { return mLocalTextureObject; }
@@ -261,6 +266,8 @@ public:
void deleteCaches();
void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
+ BOOL isMorphValid();
+ void invalidateMorphMasks();
LLTexLayerInterface* findLayerByName(const std::string& name);
void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
@@ -269,6 +276,7 @@ public:
BOOL hasComposite() const { return (mComposite.notNull()); }
LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; }
void setBakedTexIndex( LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
+ BOOL isVisible() const { return mIsVisible; }
public:
static BOOL sHasCaches;
@@ -281,6 +289,7 @@ private:
LLPointer<LLTexLayerSetBuffer> mComposite;
LLVOAvatarSelf* const mAvatar; // Backlink only; don't make this an LLPointer.
BOOL mUpdatesEnabled;
+ BOOL mIsVisible;
LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex;
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index 74e0fa077e..d55468841d 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -30,11 +30,14 @@
*/
#include "llviewerprecompiledheaders.h"
+
+#include "lltexlayerparams.h"
+
#include "llagent.h"
+#include "llimagetga.h"
#include "lltexlayer.h"
#include "llvoavatarself.h"
#include "llwearable.h"
-#include "lltexlayerparams.h"
#include "llui.h"
//-----------------------------------------------------------------------------
@@ -160,7 +163,7 @@ BOOL LLTexLayerParamAlpha::getMultiplyBlend() const
return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend;
}
-void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
+void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
{
if (mIsAnimating || mTexLayer == NULL)
{
@@ -179,38 +182,37 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
{
if (gAgent.cameraCustomizeAvatar())
{
- set_by_user = FALSE;
+ upload_bake = FALSE;
}
- mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
+ mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
mTexLayer->invalidateMorphMasks();
- mAvatar->updateMeshTextures();
}
}
}
-void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake)
{
// do not animate dummy parameters
if (mIsDummy)
{
- setWeight(target_value, set_by_user);
+ setWeight(target_value, upload_bake);
return;
}
mTargetWeight = target_value;
- setWeight(target_value, set_by_user);
+ setWeight(target_value, upload_bake);
mIsAnimating = TRUE;
if (mNext)
{
- mNext->setAnimationTarget(target_value, set_by_user);
+ mNext->setAnimationTarget(target_value, upload_bake);
}
}
-void LLTexLayerParamAlpha::animate(F32 delta, BOOL set_by_user)
+void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake)
{
if (mNext)
{
- mNext->animate(delta, set_by_user);
+ mNext->animate(delta, upload_bake);
}
}
@@ -450,7 +452,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const
}
}
-void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
+void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)
{
if (mIsAnimating)
{
@@ -475,11 +477,10 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
{
- onGlobalColorChanged(set_by_user);
+ onGlobalColorChanged(upload_bake);
if (mTexLayer)
{
- mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
- mAvatar->updateMeshTextures();
+ mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
}
}
@@ -487,23 +488,23 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
}
}
-void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake)
{
// set value first then set interpolating flag to ignore further updates
mTargetWeight = target_value;
- setWeight(target_value, set_by_user);
+ setWeight(target_value, upload_bake);
mIsAnimating = TRUE;
if (mNext)
{
- mNext->setAnimationTarget(target_value, set_by_user);
+ mNext->setAnimationTarget(target_value, upload_bake);
}
}
-void LLTexLayerParamColor::animate(F32 delta, BOOL set_by_user)
+void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake)
{
if (mNext)
{
- mNext->animate(delta, set_by_user);
+ mNext->animate(delta, upload_bake);
}
}
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 98365864f9..93d01352d4 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -34,7 +34,11 @@
#include "llviewervisualparam.h"
+class LLImageRaw;
+class LLImageTGA;
class LLTexLayer;
+class LLTexLayerInterface;
+class LLViewerTexture;
class LLVOAvatar;
class LLWearable;
@@ -66,9 +70,9 @@ public:
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex avatar_sex ) {}
- /*virtual*/ void setWeight(F32 weight, BOOL set_by_user);
- /*virtual*/ void setAnimationTarget(F32 target_value, BOOL set_by_user);
- /*virtual*/ void animate(F32 delta, BOOL set_by_user);
+ /*virtual*/ void setWeight(F32 weight, BOOL upload_bake);
+ /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake);
+ /*virtual*/ void animate(F32 delta, BOOL upload_bake);
// LLViewerVisualParam Virtual functions
/*virtual*/ F32 getTotalDistortion() { return 1.f; }
@@ -143,9 +147,9 @@ public:
// LLVisualParam Virtual functions
///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
/*virtual*/ void apply( ESex avatar_sex ) {}
- /*virtual*/ void setWeight(F32 weight, BOOL set_by_user);
- /*virtual*/ void setAnimationTarget(F32 target_value, BOOL set_by_user);
- /*virtual*/ void animate(F32 delta, BOOL set_by_user);
+ /*virtual*/ void setWeight(F32 weight, BOOL upload_bake);
+ /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake);
+ /*virtual*/ void animate(F32 delta, BOOL upload_bake);
// LLViewerVisualParam Virtual functions
@@ -159,7 +163,7 @@ public:
// New functions
LLColor4 getNetColor() const;
protected:
- virtual void onGlobalColorChanged(bool set_by_user) {}
+ virtual void onGlobalColorChanged(bool upload_bake) {}
private:
LLVector3 mAvgDistortionVec;
};
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 1b249d75d1..91c303c79e 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -43,11 +43,18 @@
// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout
#include "llappviewer.h"
-#define USE_LFS_READ 0
-#define USE_LFS_WRITE 0
-
-// Note: first 4 bytes store file size, rest is j2c data
-const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE; //1024;
+// Cache organization:
+// cache/texture.entries
+// Unordered array of Entry structs
+// cache/texture.cache
+// First TEXTURE_CACHE_ENTRY_SIZE bytes of each texture in texture.entries in same order
+// cache/textures/[0-F]/UUID.texture
+// Actual texture body files
+
+//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side.
+const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
+const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
+const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
class LLTextureCacheWorker : public LLWorkerClass
{
@@ -309,94 +316,75 @@ void LLTextureCacheWorker::startWork(S32 param)
{
}
+// This is where a texture is read from the cache system (header and body)
+// Current assumption are:
+// - the whole data are in a raw form, will be stored at mReadData
+// - the size of this raw data is mDataSize and can be smaller than TEXTURE_CACHE_ENTRY_SIZE (the size of a record in the header cache)
+// - the code supports offset reading but this is actually never exercised in the viewer
bool LLTextureCacheRemoteWorker::doRead()
{
+ bool done = false;
+ S32 idx = -1;
+
S32 local_size = 0;
std::string local_filename;
+ // First state / stage : find out if the file is local
if (mState == INIT)
{
std::string filename = mCache->getLocalFileName(mID);
- local_filename = filename + ".j2c";
- local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
- if (local_size == 0)
+ // Is it a JPEG2000 file?
{
- local_filename = filename + ".tga";
+ local_filename = filename + ".j2c";
local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
if (local_size > 0)
{
- mImageFormat = IMG_CODEC_TGA;
- mDataSize = local_size; // Only a complete .tga file is valid
+ mImageFormat = IMG_CODEC_J2C;
}
}
- if (local_size > 0)
- {
- mState = LOCAL;
- }
- else
- {
- mState = CACHE;
- }
- }
-
- if (mState == LOCAL)
- {
-#if USE_LFS_READ
- if (mFileHandle == LLLFSThread::nullHandle())
+ // If not, is it a jpeg file?
+ if (local_size == 0)
{
- mImageLocal = TRUE;
- mImageSize = local_size;
- if (!mDataSize || mDataSize + mOffset > local_size)
- {
- mDataSize = local_size - mOffset;
- }
- if (mDataSize <= 0)
+ local_filename = filename + ".jpg";
+ local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
+ if (local_size > 0)
{
- // no more data to read
- mDataSize = 0;
- return true;
+ mImageFormat = IMG_CODEC_JPEG;
+ mDataSize = local_size; // Only a complete .jpg file is valid
}
- mReadData = new U8[mDataSize];
- mBytesRead = -1;
- mBytesToRead = mDataSize;
- setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
- mFileHandle = LLLFSThread::sLocal->read(local_filename, mReadData, mOffset, mDataSize,
- new ReadResponder(mCache, mRequestHandle));
- return false;
}
- else
+ // Hmm... What about a targa file? (used for UI texture mostly)
+ if (local_size == 0)
{
- if (mBytesRead >= 0)
- {
- if (mBytesRead != mBytesToRead)
- {
-// llwarns << "Error reading file from local cache: " << local_filename
-// << " Bytes: " << mDataSize << " Offset: " << mOffset
-// << " / " << mDataSize << llendl;
- mDataSize = 0; // failed
- delete[] mReadData;
- mReadData = NULL;
- }
- return true;
- }
- else
+ local_filename = filename + ".tga";
+ local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool());
+ if (local_size > 0)
{
- return false;
+ mImageFormat = IMG_CODEC_TGA;
+ mDataSize = local_size; // Only a complete .tga file is valid
}
}
-#else
+ // Determine the next stage: if we found a file, then LOCAL else CACHE
+ mState = (local_size > 0 ? LOCAL : CACHE);
+ }
+
+ // Second state / stage : if the file is local, load it and leave
+ if (!done && (mState == LOCAL))
+ {
+ llassert(local_size != 0); // we're assuming there is a non empty local file here...
if (!mDataSize || mDataSize > local_size)
{
mDataSize = local_size;
}
+ // Allocate read buffer
mReadData = new U8[mDataSize];
S32 bytes_read = LLAPRFile::readEx(local_filename,
mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());
if (bytes_read != mDataSize)
{
-// llwarns << "Error reading file from local cache: " << local_filename
-// << " Bytes: " << mDataSize << " Offset: " << mOffset
-// << " / " << mDataSize << llendl;
+ llwarns << "Error reading file from local cache: " << local_filename
+ << " Bytes: " << mDataSize << " Offset: " << mOffset
+ << " / " << mDataSize << llendl;
mDataSize = 0;
delete[] mReadData;
mReadData = NULL;
@@ -406,405 +394,275 @@ bool LLTextureCacheRemoteWorker::doRead()
mImageSize = local_size;
mImageLocal = TRUE;
}
- return true;
-#endif
+ // We're done...
+ done = true;
}
- S32 idx = -1;
-
- if (mState == CACHE)
+ // Second state / stage : identify the cache or not...
+ if (!done && (mState == CACHE))
{
- llassert_always(mImageSize == 0);
- idx = mCache->getHeaderCacheEntry(mID, false, &mImageSize);
- if (idx >= 0 && mImageSize > mOffset)
+ idx = mCache->getHeaderCacheEntry(mID, mImageSize);
+ if (idx < 0)
{
- llassert_always(mImageSize > 0);
- if (!mDataSize || mDataSize > mImageSize)
- {
- mDataSize = mImageSize;
- }
- mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
+ // The texture is *not* cached. We're done here...
+ mDataSize = 0; // no data
+ done = true;
}
else
{
- mDataSize = 0; // no data
- return true;
+ // If the read offset is bigger than the header cache, we read directly from the body
+ // Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER
+ mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
}
}
- if (mState == HEADER)
+ // Third state / stage : read data from the header cache (texture.entries) file
+ if (!done && (mState == HEADER))
{
-#if USE_LFS_READ
- if (mFileHandle == LLLFSThread::nullHandle())
- {
- llassert_always(idx >= 0);
- llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE);
- S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset;
- S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- llassert_always(mReadData == NULL);
- mReadData = new U8[size];
- mBytesRead = -1;
- mBytesToRead = size;
- setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
- mFileHandle = LLLFSThread::sLocal->read(mCache->mHeaderDataFileName,
- mReadData, offset, mBytesToRead,
- new ReadResponder(mCache, mRequestHandle));
- return false;
- }
- else
- {
- if (mBytesRead >= 0)
- {
- if (mBytesRead != mBytesToRead)
- {
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes read from header: " << mBytesRead
-// << " != " << mBytesToRead << llendl;
- mDataSize = -1; // failed
- return true;
- }
- if (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE)
- {
- return true; // done
- }
- else
- {
- mFileHandle = LLLFSThread::nullHandle();
- mState = BODY;
- }
- }
- else
- {
- return false;
- }
- }
-#else
- llassert_always(idx >= 0);
+ llassert_always(idx >= 0); // we need an entry here or reading the header makes no sense
llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE);
S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset;
+ // Compute the size we need to read (in bytes)
S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
+ size = llmin(size, mDataSize);
+ // Allocate the read buffer
mReadData = new U8[size];
S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,
mReadData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_read != size)
{
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes read from header: " << bytes_read
-// << " / " << size << llendl;
+ llwarns << "LLTextureCacheWorker: " << mID
+ << " incorrect number of bytes read from header: " << bytes_read
+ << " / " << size << llendl;
+ delete[] mReadData;
+ mReadData = NULL;
mDataSize = -1; // failed
- return true;
+ done = true;
}
- if (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE)
+ // If we already read all we expected, we're actually done
+ if (mDataSize <= bytes_read)
{
- return true; // done
+ done = true;
}
else
{
mState = BODY;
}
-#endif
}
- if (mState == BODY)
+ // Fourth state / stage : read the rest of the data from the UUID based cached file
+ if (!done && (mState == BODY))
{
-#if USE_LFS_READ
- if (mFileHandle == LLLFSThread::nullHandle())
- {
- std::string filename = mCache->getTextureFileName(mID);
- S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool());
- if (filesize > mOffset)
- {
- S32 datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize;
- mDataSize = llmin(datasize, mDataSize);
- S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- data_offset = llmax(data_offset, 0);
- S32 file_size = mDataSize - data_offset;
- S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE;
- file_offset = llmax(file_offset, 0);
-
- llassert_always(mDataSize > 0);
- U8* data = new U8[mDataSize];
- if (data_offset > 0)
- {
- llassert_always(mReadData);
- llassert_always(data_offset <= mDataSize);
- memcpy(data, mReadData, data_offset);
- delete[] mReadData;
- mReadData = NULL;
- }
- llassert_always(mReadData == NULL);
- mReadData = data;
-
- mBytesRead = -1;
- mBytesToRead = file_size;
- setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
- llassert_always(data_offset + mBytesToRead <= mDataSize);
- mFileHandle = LLLFSThread::sLocal->read(filename,
- mReadData + data_offset, file_offset, mBytesToRead,
- new ReadResponder(mCache, mRequestHandle));
- return false;
- }
- else
- {
- mDataSize = TEXTURE_CACHE_ENTRY_SIZE;
- return true; // done
- }
- }
- else
- {
- if (mBytesRead >= 0)
- {
- if (mBytesRead != mBytesToRead)
- {
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes read from body: " << mBytesRead
-// << " != " << mBytesToRead << llendl;
- mDataSize = -1; // failed
- }
- return true;
- }
- else
- {
- return false;
- }
- }
-#else
std::string filename = mCache->getTextureFileName(mID);
S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool());
- S32 bytes_read = 0;
- if (filesize > mOffset)
+
+ if (filesize && (filesize + TEXTURE_CACHE_ENTRY_SIZE) > mOffset)
{
- S32 datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize;
- mDataSize = llmin(datasize, mDataSize);
- S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- data_offset = llmax(data_offset, 0);
- S32 file_size = mDataSize - data_offset;
- S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE;
- file_offset = llmax(file_offset, 0);
+ S32 max_datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize - mOffset;
+ mDataSize = llmin(max_datasize, mDataSize);
+
+ S32 data_offset, file_size, file_offset;
+ // Reserve the whole data buffer first
U8* data = new U8[mDataSize];
- if (data_offset > 0)
+
+ // Set the data file pointers taking the read offset into account. 2 cases:
+ if (mOffset < TEXTURE_CACHE_ENTRY_SIZE)
{
+ // Offset within the header record. That means we read something from the header cache.
+ // Note: most common case is (mOffset = 0), so this is the "normal" code path.
+ data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; // i.e. TEXTURE_CACHE_ENTRY_SIZE if mOffset nul (common case)
+ file_offset = 0;
+ file_size = mDataSize - data_offset;
+ // Copy the raw data we've been holding from the header cache into the new sized buffer
llassert_always(mReadData);
memcpy(data, mReadData, data_offset);
delete[] mReadData;
+ mReadData = NULL;
+ }
+ else
+ {
+ // Offset bigger than the header record. That means we haven't read anything yet.
+ data_offset = 0;
+ file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE;
+ file_size = mDataSize;
+ // No data from header cache to copy in that case, we skipped it all
}
+
+ // Now use that buffer as the object read buffer
+ llassert_always(mReadData == NULL);
mReadData = data;
- bytes_read = LLAPRFile::readEx(filename,
+
+ // Read the data at last
+ S32 bytes_read = LLAPRFile::readEx(filename,
mReadData + data_offset,
file_offset, file_size,
mCache->getLocalAPRFilePool());
if (bytes_read != file_size)
{
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes read from body: " << bytes_read
-// << " / " << file_size << llendl;
+ llwarns << "LLTextureCacheWorker: " << mID
+ << " incorrect number of bytes read from body: " << bytes_read
+ << " / " << file_size << llendl;
+ delete[] mReadData;
+ mReadData = NULL;
mDataSize = -1; // failed
- return true;
+ done = true;
}
}
else
{
- mDataSize = TEXTURE_CACHE_ENTRY_SIZE;
- }
-
- return true;
-#endif
+ // No body, we're done.
+ mDataSize = llmax(TEXTURE_CACHE_ENTRY_SIZE - mOffset, 0);
+ lldebugs << "No body file for: " << filename << llendl;
+ }
+ // Nothing else to do at that point...
+ done = true;
}
-
- return false;
+
+ // Clean up and exit
+ return done;
}
+// This is where *everything* about a texture is written down in the cache system (entry map, header and body)
+// Current assumption are:
+// - the whole data are in a raw form, starting at mWriteData
+// - the size of this raw data is mDataSize and can be smaller than TEXTURE_CACHE_ENTRY_SIZE (the size of a record in the header cache)
+// - the code *does not* support offset writing so there are no difference between buffer addresses and start of data
bool LLTextureCacheRemoteWorker::doWrite()
{
+ bool done = false;
S32 idx = -1;
- // No LOCAL state for write()
-
+ // 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...
+ mState = CACHE;
+ }
+
+ // No LOCAL state for write(): because it doesn't make much sense to cache a local file...
+
+ // Second state / stage : set an entry in the headers entry (texture.entries) file
+ if (!done && (mState == CACHE))
+ {
+ bool alreadyCached = false;
S32 cur_imagesize = 0;
- S32 offset = mOffset;
- idx = mCache->getHeaderCacheEntry(mID, false, &cur_imagesize);
- if (idx >= 0 && cur_imagesize > 0)
+ // Checks if this image is already in the entry list
+ idx = mCache->getHeaderCacheEntry(mID, cur_imagesize);
+ if (idx >= 0 && (cur_imagesize >= 0))
{
- offset = TEXTURE_CACHE_ENTRY_SIZE; // don't re-write header
+ alreadyCached = true; // already there and non empty
}
- idx = mCache->getHeaderCacheEntry(mID, true, &mImageSize); // touch entry
- if (idx >= 0)
+ idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry
+ if (idx < 0)
{
- if(cur_imagesize > 0 && mImageSize != cur_imagesize)
- {
-// llwarns << "Header cache entry size: " << cur_imagesize << " != mImageSize: " << mImageSize << llendl;
- offset = 0; // re-write header
- }
- mState = offset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
+ llwarns << "LLTextureCacheWorker: " << mID
+ << " Unable to create header entry for writing!" << llendl;
+ mDataSize = -1; // failed
+ done = true;
}
else
{
- mDataSize = -1; // failed
- return true;
+ if (cur_imagesize > 0 && (mImageSize != cur_imagesize))
+ {
+ alreadyCached = false; // re-write the header if the size changed in all cases
+ }
+ if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
+ {
+ // Small texture already cached case: we're done with writing
+ 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 (mState == HEADER)
+
+ // Third stage / state : write the header record in the header file (texture.cache)
+ if (!done && (mState == HEADER))
{
-#if USE_LFS_WRITE
- if (mFileHandle == LLLFSThread::nullHandle())
+ 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)
{
- llassert_always(idx >= 0);
- llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE);
- S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset;
- S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- mBytesRead = -1;
- mBytesToRead = size;
- setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
- mFileHandle = LLLFSThread::sLocal->write(mCache->mHeaderDataFileName,
- mWriteData, offset, mBytesToRead,
- new WriteResponder(mCache, mRequestHandle));
- return false;
+ // 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 = new U8[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());
+ delete [] padBuffer;
}
else
{
- if (mBytesRead >= 0)
- {
- if (mBytesRead != mBytesToRead)
- {
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes written to header: " << mBytesRead
-// << " != " << mBytesToRead << llendl;
- mDataSize = -1; // failed
- return true;
- }
- if (mDataSize <= mBytesToRead)
- {
- return true; // done
- }
- else
- {
- mFileHandle = LLLFSThread::nullHandle();
- mState = BODY;
- }
- }
- else
- {
- return false;
- }
+ // 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());
}
-#else
- llassert_always(idx >= 0);
- llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE);
- S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset;
- S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- S32 bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_written <= 0)
{
-// llwarns << "LLTextureCacheWorker: missing entry: " << mID << llendl;
+ llwarns << "LLTextureCacheWorker: " << mID
+ << " Unable to write header entry!" << llendl;
mDataSize = -1; // failed
- return true;
+ done = true;
}
- if (mDataSize <= size)
+ // 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)
{
- return true; // done
+ done = true;
}
else
{
mState = BODY;
}
-#endif
}
- if (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))
{
-#if USE_LFS_WRITE
- if (mFileHandle == LLLFSThread::nullHandle())
- {
- S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- data_offset = llmax(data_offset, 0);
- S32 file_size = mDataSize - data_offset;
- S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE;
- file_offset = llmax(file_offset, 0);
- if (file_size > 0 && mCache->appendToTextureEntryList(mID, file_size))
- {
- std::string filename = mCache->getTextureFileName(mID);
- mBytesRead = -1;
- mBytesToRead = file_size;
- setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
- mFileHandle = LLLFSThread::sLocal->write(filename,
- mWriteData + data_offset, file_offset, mBytesToRead,
- new WriteResponder(mCache, mRequestHandle));
- return false;
- }
- else
- {
- mDataSize = 0; // no data written
- return true; // done
- }
- }
- else
- {
- if (mBytesRead >= 0)
- {
- if (mBytesRead != mBytesToRead)
- {
-// llwarns << "LLTextureCacheWorker: " << mID
-// << " incorrect number of bytes written to body: " << mBytesRead
-// << " != " << mBytesToRead << llendl;
- mDataSize = -1; // failed
- }
- return true;
- }
- else
- {
- return false;
- }
- }
-#else
- S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
- data_offset = llmax(data_offset, 0);
- S32 file_size = mDataSize - data_offset;
- S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE;
- file_offset = llmax(file_offset, 0);
- S32 bytes_written = 0;
- if (file_size > 0 && mCache->appendToTextureEntryList(mID, file_size))
+ llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise...
+ S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
+ if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size))
{
- std::string filename = mCache->getTextureFileName(mID);
-
- bytes_written = LLAPRFile::writeEx(filename,
- mWriteData + data_offset,
- file_offset, file_size,
- mCache->getLocalAPRFilePool());
+ // build the cache file name from the UUID
+ std::string filename = mCache->getTextureFileName(mID);
+// llinfos << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << llendl;
+ S32 bytes_written = LLAPRFile::writeEx( filename,
+ mWriteData + TEXTURE_CACHE_ENTRY_SIZE,
+ 0, file_size,
+ mCache->getLocalAPRFilePool());
if (bytes_written <= 0)
{
+ llwarns << "LLTextureCacheWorker: " << mID
+ << " incorrect number of bytes written to body: " << bytes_written
+ << " / " << file_size << llendl;
mDataSize = -1; // failed
+ done = true;
}
}
else
{
mDataSize = 0; // no data written
}
-
- return true;
-#endif
+ // Nothing else to do at that point...
+ done = true;
}
-
- return false;
+
+ // Clean up and exit
+ return done;
}
//virtual
bool LLTextureCacheWorker::doWork(S32 param)
{
-// *TODO reenable disabled apr_pool usage disabled due to maint-render-9 merge breakage -brad
- //allocate a new local apr_pool
-// LLAPRPool pool ;
-
- //save the current mFileAPRPool to avoid breaking anything.
-// apr_pool_t* old_pool = mCache->getFileAPRPool() ;
- //make mFileAPRPool to point to the local one
-// mCache->setFileAPRPool(pool.getAPRPool()) ;
-
bool res = false;
if (param == 0) // read
{
@@ -818,10 +676,6 @@ bool LLTextureCacheWorker::doWork(S32 param)
{
llassert_always(0);
}
-
- //set mFileAPRPool back, the local one will be released automatically.
-// mCache->setFileAPRPool(old_pool) ;
-
return res;
}
@@ -887,6 +741,7 @@ LLTextureCache::LLTextureCache(bool threaded)
mWorkersMutex(NULL),
mHeaderMutex(NULL),
mListMutex(NULL),
+ mHeaderAPRFile(NULL),
mReadOnly(FALSE),
mTexturesSizeTotal(0),
mDoPurge(FALSE)
@@ -926,6 +781,9 @@ S32 LLTextureCache::update(U32 max_time_ms)
}
}
+ unlockWorkers();
+
+ // call 'completed' with workers list unlocked (may call readComplete() or writeComplete()
for (responder_list_t::iterator iter1 = completed_list.begin();
iter1 != completed_list.end(); ++iter1)
{
@@ -934,8 +792,6 @@ S32 LLTextureCache::update(U32 max_time_ms)
responder->completed(success);
}
- unlockWorkers();
-
return res;
}
@@ -954,33 +810,48 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id)
{
std::string idstr = id.asString();
std::string delem = gDirUtilp->getDirDelimiter();
- std::string filename = mTexturesDirName + delem + idstr[0] + delem + idstr;
+ std::string filename = mTexturesDirName + delem + idstr[0] + delem + idstr + ".texture";
return filename;
}
-bool LLTextureCache::appendToTextureEntryList(const LLUUID& id, S32 bodysize)
+bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
{
bool res = false;
bool purge = false;
- // Append UUID to end of texture entries
{
LLMutexLock lock(&mHeaderMutex);
- size_map_t::iterator iter = mTexturesSizeMap.find(id);
- if (iter == mTexturesSizeMap.end() || iter->second < bodysize)
+ size_map_t::iterator iter1 = mTexturesSizeMap.find(id);
+ if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize)
{
llassert_always(bodysize > 0);
- Entry* entry = new Entry(id, bodysize, time(NULL));
- LLAPRFile::writeEx(mTexturesDirEntriesFileName,
- (U8*)entry, -1, 1*sizeof(Entry),
- getLocalAPRFilePool());
- delete entry;
- if (iter != mTexturesSizeMap.end())
+ S32 oldbodysize = 0;
+ if (iter1 != mTexturesSizeMap.end())
{
- mTexturesSizeTotal -= iter->second;
+ oldbodysize = iter1->second;
}
+
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx < 0)
+ {
+ llwarns << "Failed to open entry: " << id << llendl;
+ removeHeaderCacheEntry(id);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ return false;
+ }
+ else if (oldbodysize != entry.mBodySize)
+ {
+ // TODO: change to llwarns
+ llerrs << "Entry mismatch in mTextureSizeMap / mHeaderIDMap"
+ << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl;
+ }
+ entry.mBodySize = bodysize;
+ writeEntryAndClose(idx, entry);
+
+ mTexturesSizeTotal -= oldbodysize;
mTexturesSizeTotal += bodysize;
- mTexturesSizeMap[id] = bodysize;
+
if (mTexturesSizeTotal > sCacheMaxTexturesSize)
{
purge = true;
@@ -995,11 +866,59 @@ bool LLTextureCache::appendToTextureEntryList(const LLUUID& id, S32 bodysize)
return res;
}
+//debug
+BOOL LLTextureCache::isInCache(const LLUUID& id)
+{
+ LLMutexLock lock(&mHeaderMutex);
+ id_map_t::const_iterator iter = mHeaderIDMap.find(id);
+
+ return (iter != mHeaderIDMap.end()) ;
+}
+
+//debug
+BOOL LLTextureCache::isInLocal(const LLUUID& id)
+{
+ S32 local_size = 0;
+ std::string local_filename;
+
+ std::string filename = getLocalFileName(id);
+ // Is it a JPEG2000 file?
+ {
+ local_filename = filename + ".j2c";
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
+ if (local_size > 0)
+ {
+ return TRUE ;
+ }
+ }
+
+ // If not, is it a jpeg file?
+ {
+ local_filename = filename + ".jpg";
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
+ if (local_size > 0)
+ {
+ return TRUE ;
+ }
+ }
+
+ // Hmm... What about a targa file? (used for UI texture mostly)
+ {
+ local_filename = filename + ".tga";
+ local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool());
+ if (local_size > 0)
+ {
+ return TRUE ;
+ }
+ }
+
+ return FALSE ;
+}
//////////////////////////////////////////////////////////////////////////////
//static
const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB
-F32 LLTextureCache::sHeaderCacheVersion = 1.0f;
+F32 LLTextureCache::sHeaderCacheVersion = 1.4f;
U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE;
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
const char* entries_filename = "texture.entries";
@@ -1012,15 +931,16 @@ void LLTextureCache::setDirNames(ELLPath location)
mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, entries_filename);
mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, cache_filename);
mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname);
- mTexturesDirEntriesFileName = mTexturesDirName + delem + entries_filename;
}
void LLTextureCache::purgeCache(ELLPath location)
{
+ LLMutexLock lock(&mHeaderMutex);
+
if (!mReadOnly)
{
setDirNames(location);
-
+ llassert_always(mHeaderAPRFile == NULL);
LLAPRFile::remove(mHeaderEntriesFileName, getLocalAPRFilePool());
LLAPRFile::remove(mHeaderDataFileName, getLocalAPRFilePool());
}
@@ -1063,85 +983,335 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
return max_size; // unused cache space
}
-struct lru_data
+//----------------------------------------------------------------------------
+// mHeaderMutex must be locked for the following functions!
+
+LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
+{
+ llassert_always(mHeaderAPRFile == NULL);
+ apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
+ mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool());
+ mHeaderAPRFile->seek(APR_SET, offset);
+ return mHeaderAPRFile;
+}
+
+void LLTextureCache::closeHeaderEntriesFile()
+{
+ llassert_always(mHeaderAPRFile != NULL);
+ delete mHeaderAPRFile;
+ mHeaderAPRFile = NULL;
+}
+
+void LLTextureCache::readEntriesHeader()
+{
+ // mHeaderEntriesInfo initializes to default values so safe not to read it
+ llassert_always(mHeaderAPRFile == NULL);
+ if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))
+ {
+ LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
+ getLocalAPRFilePool());
+ }
+}
+
+void LLTextureCache::writeEntriesHeader()
{
- lru_data(U32 t, S32 i, const LLUUID& id) { time=t; index=i; uuid=id; }
- U32 time;
- S32 index;
- LLUUID uuid;
- struct Compare
- {
- // lhs < rhs
- typedef const lru_data* lru_data_ptr;
- bool operator()(const lru_data_ptr& a, const lru_data_ptr& b) const
+ llassert_always(mHeaderAPRFile == NULL);
+ if (!mReadOnly)
+ {
+ LLAPRFile::writeEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
+ getLocalAPRFilePool());
+ }
+}
+
+static S32 mHeaderEntriesMaxWriteIdx = 0;
+
+S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create)
+{
+ S32 idx = -1;
+
+ id_map_t::iterator iter1 = mHeaderIDMap.find(id);
+ if (iter1 != mHeaderIDMap.end())
+ {
+ idx = iter1->second;
+ }
+
+ if (idx < 0)
+ {
+ if (create && !mReadOnly)
{
- if(a->time == b->time)
- return (a->index < b->index);
+ if (mHeaderEntriesInfo.mEntries < sCacheMaxEntries)
+ {
+ // Add an entry to the end of the list
+ idx = mHeaderEntriesInfo.mEntries++;
+
+ }
+ else if (!mFreeList.empty())
+ {
+ idx = *(mFreeList.begin());
+ mFreeList.erase(mFreeList.begin());
+ }
else
- return (a->time >= b->time);
+ {
+ // Look for a still valid entry in the LRU
+ for (std::set<LLUUID>::iterator iter2 = mLRU.begin(); iter2 != mLRU.end();)
+ {
+ std::set<LLUUID>::iterator curiter2 = iter2++;
+ LLUUID oldid = *curiter2;
+ // Erase entry from LRU regardless
+ mLRU.erase(curiter2);
+ // Look up entry and use it if it is valid
+ id_map_t::iterator iter3 = mHeaderIDMap.find(oldid);
+ if (iter3 != mHeaderIDMap.end() && iter3->second >= 0)
+ {
+ idx = iter3->second;
+ mHeaderIDMap.erase(oldid);
+ mTexturesSizeMap.erase(oldid);
+ break;
+ }
+ }
+ // if (idx < 0) at this point, we will rebuild the LRU
+ // and retry if called from setHeaderCacheEntry(),
+ // otherwise this shouldn't happen and will trigger an error
+ }
+ if (idx >= 0)
+ {
+ // Set the header index
+ mHeaderIDMap[id] = idx;
+ llassert_always(mTexturesSizeMap.erase(id) == 0);
+ // Initialize the entry (will get written later)
+ entry.init(id, time(NULL));
+ // Update Header
+ writeEntriesHeader();
+ // Write Entry
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
+ S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
+ closeHeaderEntriesFile();
+ }
}
- };
-};
+ }
+ else
+ {
+ // Remove this entry from the LRU if it exists
+ mLRU.erase(id);
+ // Read the entry
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
+ S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_read == sizeof(Entry));
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
+ closeHeaderEntriesFile();
+ }
+ return idx;
+}
-// Called from either the main thread or the worker thread
-void LLTextureCache::readHeaderCache()
+void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry)
{
- LLMutexLock lock(&mHeaderMutex);
- mHeaderEntriesInfo.mVersion = 0.f;
- mHeaderEntriesInfo.mEntries = 0;
- if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))
+ if (idx >= 0)
+ {
+ if (!mReadOnly)
+ {
+ entry.mTime = time(NULL);
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
+ if (entry.mBodySize > 0)
+ {
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ }
+// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
+ S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
+ closeHeaderEntriesFile();
+ }
+ }
+}
+
+U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
+{
+ U32 num_entries = mHeaderEntriesInfo.mEntries;
+
+ mHeaderIDMap.clear();
+ mTexturesSizeMap.clear();
+ mFreeList.clear();
+ mTexturesSizeTotal = 0;
+
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
+ for (U32 idx=0; idx<num_entries; idx++)
{
- LLAPRFile::readEx(mHeaderEntriesFileName,
- (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
- getLocalAPRFilePool());
+ Entry entry;
+ S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry));
+ if (bytes_read < sizeof(Entry))
+ {
+ llwarns << "Corrupted header entries, failed at " << idx << " / " << num_entries << llendl;
+ closeHeaderEntriesFile();
+ purgeAllTextures(false);
+ return 0;
+ }
+ entries.push_back(entry);
+// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl;
+ if (entry.mImageSize < 0)
+ {
+ mFreeList.insert(idx);
+ }
+ else
+ {
+ mHeaderIDMap[entry.mID] = idx;
+ if (entry.mBodySize > 0)
+ {
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
+ }
+ llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize);
+ }
+ }
+ closeHeaderEntriesFile();
+ return num_entries;
+}
+
+void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
+{
+ S32 num_entries = entries.size();
+ llassert_always(num_entries == mHeaderEntriesInfo.mEntries);
+
+ if (!mReadOnly)
+ {
+ LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
+ for (S32 idx=0; idx<num_entries; idx++)
+ {
+ S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ }
+ mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1);
+ closeHeaderEntriesFile();
}
+}
+
+//----------------------------------------------------------------------------
+
+// Called from either the main thread or the worker thread
+void LLTextureCache::readHeaderCache()
+{
+ mHeaderMutex.lock();
+
+ mLRU.clear(); // always clear the LRU
+
+ readEntriesHeader();
+
if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion)
{
if (!mReadOnly)
{
- // Info with 0 entries
- mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
-
- LLAPRFile::writeEx(mHeaderEntriesFileName,
- (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
- getLocalAPRFilePool());
+ purgeAllTextures(false);
}
}
else
{
- S32 num_entries = mHeaderEntriesInfo.mEntries;
+ std::vector<Entry> entries;
+ U32 num_entries = openAndReadEntries(entries);
if (num_entries)
{
- Entry* entries = new Entry[num_entries];
+ U32 empty_entries = 0;
+ typedef std::pair<U32, S32> lru_data_t;
+ std::set<lru_data_t> lru;
+ std::set<LLUUID> purge_list;
+ for (U32 i=0; i<num_entries; i++)
{
- LLAPRFile::readEx(mHeaderEntriesFileName,
- (U8*)entries, sizeof(EntriesInfo), num_entries*sizeof(Entry),
- getLocalAPRFilePool());
+ Entry& entry = entries[i];
+ const LLUUID& id = entry.mID;
+ if (entry.mImageSize < 0)
+ {
+ // This will be in the Free List, don't put it in the LRU
+ ++empty_entries;
+ }
+ else
+ {
+ lru.insert(std::make_pair(entry.mTime, i));
+ if (entry.mBodySize > 0)
+ {
+ if (entry.mBodySize > entry.mImageSize)
+ {
+ // Shouldn't happen, failsafe only
+ llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
+ purge_list.insert(entry.mID);
+ entry.mImageSize = -1; // empty/available
+ }
+ }
+ }
+ }
+ if (num_entries > sCacheMaxEntries)
+ {
+ // Special case: cache size was reduced, need to remove entries
+ // Note: After we prune entries, we will call this again and create the LRU
+ U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+ llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
+ if (entries_to_purge > 0)
+ {
+ for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
+ {
+ S32 idx = iter->second;
+ if (entries[idx].mImageSize >= 0)
+ {
+ purge_list.insert(entries[idx].mID);
+ entries[idx].mImageSize = -1;
+ if (purge_list.size() >= entries_to_purge)
+ break;
+ }
+ }
+ }
+ llassert_always(purge_list.size() >= entries_to_purge);
+ }
+ else
+ {
+ S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
+ for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
+ {
+ S32 idx = iter->second;
+ const LLUUID& id = entries[idx].mID;
+ mLRU.insert(id);
+// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
+ if (--lru_entries <= 0)
+ break;
+ }
}
- typedef std::set<lru_data*, lru_data::Compare> lru_set_t;
- lru_set_t lru;
- for (S32 i=0; i<num_entries; i++)
+
+ if (purge_list.size() > 0)
{
- if (entries[i].mSize >= 0) // -1 indicates erased entry, skip
+ for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- const LLUUID& id = entries[i].mID;
- lru.insert(new lru_data(entries[i].mTime, i, id));
- mHeaderIDMap[id] = i;
+ const LLUUID& id = *iter;
+ bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
+ llassert_always(res);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
}
+ // If we removed any entries, we need to rebuild the entries list,
+ // write the header, and call this again
+ std::vector<Entry> new_entries;
+ for (U32 i=0; i<num_entries; i++)
+ {
+ const Entry& entry = entries[i];
+ if (entry.mImageSize >=0)
+ {
+ new_entries.push_back(entry);
+ }
+ }
+ llassert_always(new_entries.size() <= sCacheMaxEntries);
+ mHeaderEntriesInfo.mEntries = new_entries.size();
+ writeEntriesAndClose(new_entries);
+ mHeaderMutex.unlock(); // unlock the mutex before calling again
+ readHeaderCache(); // repeat with new entries file
+ mHeaderMutex.lock();
}
- mLRU.clear();
- S32 lru_entries = sCacheMaxEntries / 10;
- for (lru_set_t::iterator iter = lru.begin(); iter != lru.end(); ++iter)
+ else
{
- lru_data* data = *iter;
- mLRU[data->index] = data->uuid;
- if (--lru_entries <= 0)
- break;
+ writeEntriesAndClose(entries);
}
- for_each(lru.begin(), lru.end(), DeletePointer());
- delete[] entries;
}
}
+ mHeaderMutex.unlock();
}
//////////////////////////////////////////////////////////////////////////////
@@ -1156,19 +1326,28 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
+ llinfos << "Deleting files in directory: " << dirname << llendl;
gDirUtilp->deleteFilesInDir(dirname,mask);
if (purge_directories)
{
LLFile::rmdir(dirname);
}
}
- LLAPRFile::remove(mTexturesDirEntriesFileName, getLocalAPRFilePool());
if (purge_directories)
{
LLFile::rmdir(mTexturesDirName);
}
}
+ mHeaderIDMap.clear();
mTexturesSizeMap.clear();
+ mTexturesSizeTotal = 0;
+ mFreeList.clear();
+ mTexturesSizeTotal = 0;
+
+ // Info with 0 entries
+ mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
+ mHeaderEntriesInfo.mEntries = 0;
+ writeEntriesHeader();
}
void LLTextureCache::purgeTextures(bool validate)
@@ -1178,55 +1357,44 @@ void LLTextureCache::purgeTextures(bool validate)
return;
}
- // *FIX:Mani - watchdog off.
- LLAppViewer::instance()->pauseMainloopTimeout();
-
- LLMutexLock lock(&mHeaderMutex);
-
- S32 filesize = LLAPRFile::size(mTexturesDirEntriesFileName, getLocalAPRFilePool());
- S32 num_entries = filesize / sizeof(Entry);
- if (num_entries * (S32)sizeof(Entry) != filesize)
+ if (!mThreaded)
{
- LL_WARNS("TextureCache") << "Bad cache file: " << mTexturesDirEntriesFileName << " Purging." << LL_ENDL;
- purgeAllTextures(false);
- return;
- }
- if (num_entries == 0)
- {
- return; // nothing to do
+ // *FIX:Mani - watchdog off.
+ LLAppViewer::instance()->pauseMainloopTimeout();
}
- Entry* entries = new Entry[num_entries];
- S32 bytes_read = LLAPRFile::readEx(mTexturesDirEntriesFileName,
- (U8*)entries, 0, num_entries*sizeof(Entry),
- getLocalAPRFilePool());
- if (bytes_read != filesize)
- {
- LL_WARNS("TextureCache") << "Bad cache file (2): " << mTexturesDirEntriesFileName << " Purging." << LL_ENDL;
- purgeAllTextures(false);
- return;
+ LLMutexLock lock(&mHeaderMutex);
+
+ llinfos << "TEXTURE CACHE: Purging." << llendl;
+
+ // Read the entries list
+ std::vector<Entry> entries;
+ U32 num_entries = openAndReadEntries(entries);
+ if (!num_entries)
+ {
+ writeEntriesAndClose(entries);
+ return; // nothing to purge
}
- LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Reading Entries..." << LL_ENDL;
-
- std::map<LLUUID, S32> entry_idx_map;
- S64 total_size = 0;
- for (S32 idx=0; idx<num_entries; idx++)
- {
- const LLUUID& id = entries[idx].mID;
- LL_DEBUGS("TextureCache") << "Entry: " << id << " Size: " << entries[idx].mSize << " Time: " << entries[idx].mTime << LL_ENDL;
- std::map<LLUUID, S32>::iterator iter = entry_idx_map.find(id);
- if (iter != entry_idx_map.end())
+ // Use mTexturesSizeMap to collect UUIDs of textures with bodies
+ typedef std::set<std::pair<U32,S32> > time_idx_set_t;
+ std::set<std::pair<U32,S32> > time_idx_set;
+ for (size_map_t::iterator iter1 = mTexturesSizeMap.begin();
+ iter1 != mTexturesSizeMap.end(); ++iter1)
+ {
+ if (iter1->second > 0)
{
- // Newer entry replacing older entry
- S32 pidx = iter->second;
- total_size -= entries[pidx].mSize;
- entries[pidx].mSize = 0; // flag: skip older entry
+ id_map_t::iterator iter2 = mHeaderIDMap.find(iter1->first);
+ if (iter2 != mHeaderIDMap.end())
+ {
+ S32 idx = iter2->second;
+ time_idx_set.insert(std::make_pair(entries[idx].mTime, idx));
+// llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl;
+ }
}
- entry_idx_map[id] = idx;
- total_size += entries[idx].mSize;
}
-
+
+ // Validate 1/256th of the files on startup
U32 validate_idx = 0;
if (validate)
{
@@ -1235,19 +1403,17 @@ void LLTextureCache::purgeTextures(bool validate)
gSavedSettings.setU32("CacheValidateCounter", next_idx);
LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL;
}
-
- S64 min_cache_size = (sCacheMaxTexturesSize * 9) / 10;
+
+ S64 cache_size = mTexturesSizeTotal;
+ S64 purged_cache_size = (sCacheMaxTexturesSize * (S64)((1.f-TEXTURE_CACHE_PURGE_AMOUNT)*100)) / 100;
S32 purge_count = 0;
- S32 next_idx = 0;
- for (S32 idx=0; idx<num_entries; idx++)
+ for (time_idx_set_t::iterator iter = time_idx_set.begin();
+ iter != time_idx_set.end(); ++iter)
{
- if (entries[idx].mSize == 0)
- {
- continue;
- }
+ S32 idx = iter->second;
bool purge_entry = false;
std::string filename = getTextureFileName(entries[idx].mID);
- if (total_size >= min_cache_size)
+ if (cache_size >= purged_cache_size)
{
purge_entry = true;
}
@@ -1257,60 +1423,44 @@ void LLTextureCache::purgeTextures(bool validate)
U32 uuididx = entries[idx].mID.mData[0];
if (uuididx == validate_idx)
{
- LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mSize << LL_ENDL;
+ LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mBodySize << LL_ENDL;
S32 bodysize = LLAPRFile::size(filename, getLocalAPRFilePool());
- if (bodysize != entries[idx].mSize)
+ if (bodysize != entries[idx].mBodySize)
{
- LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mSize
+ LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mBodySize
<< filename << LL_ENDL;
purge_entry = true;
}
}
}
+ else
+ {
+ break;
+ }
+
if (purge_entry)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
LLAPRFile::remove(filename, getLocalAPRFilePool());
- total_size -= entries[idx].mSize;
- entries[idx].mSize = 0;
- }
- else
- {
- if (next_idx != idx)
- {
- entries[next_idx] = entries[idx];
- }
- ++next_idx;
+ cache_size -= entries[idx].mBodySize;
+ mTexturesSizeTotal -= entries[idx].mBodySize;
+ entries[idx].mBodySize = 0;
+ mTexturesSizeMap.erase(entries[idx].mID);
}
}
- num_entries = next_idx;
LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: " << num_entries << LL_ENDL;
-
- LLAPRFile::remove(mTexturesDirEntriesFileName, getLocalAPRFilePool());
- LLAPRFile::writeEx(mTexturesDirEntriesFileName,
- (U8*)&entries[0], 0, num_entries*sizeof(Entry),
- getLocalAPRFilePool());
-
- mTexturesSizeTotal = 0;
- mTexturesSizeMap.clear();
- for (S32 idx=0; idx<num_entries; idx++)
- {
- mTexturesSizeMap[entries[idx].mID] = entries[idx].mSize;
- mTexturesSizeTotal += entries[idx].mSize;
- }
- llassert(mTexturesSizeTotal == total_size);
-
- delete[] entries;
+ writeEntriesAndClose(entries);
+
// *FIX:Mani - watchdog back on.
LLAppViewer::instance()->resumeMainloopTimeout();
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
<< " ENTRIES: " << num_entries
- << " CACHE SIZE: " << total_size / 1024*1024 << " MB"
+ << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
<< llendl;
}
@@ -1340,78 +1490,43 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle)
}
//////////////////////////////////////////////////////////////////////////////
-
// Called from work thread
-S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, bool touch, S32* imagesize)
-{
- bool retry = false;
- S32 idx = -1;
+// Reads imagesize from the header, updates timestamp
+S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
+{
+ LLMutexLock lock(&mHeaderMutex);
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx >= 0)
{
- LLMutexLock lock(&mHeaderMutex);
- id_map_t::iterator iter = mHeaderIDMap.find(id);
- if (iter != mHeaderIDMap.end())
- {
- idx = iter->second;
- }
- else if (touch && !mReadOnly)
- {
- if (mHeaderEntriesInfo.mEntries < sCacheMaxEntries)
- {
- // Add an entry
- idx = mHeaderEntriesInfo.mEntries++;
- mHeaderIDMap[id] = idx;
- // Update Info
- LLAPRFile::writeEx(mHeaderEntriesFileName,
- (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
- getLocalAPRFilePool());
- }
- else if (!mLRU.empty())
- {
- idx = mLRU.begin()->first; // will be erased below
- const LLUUID& oldid = mLRU.begin()->second;
- mHeaderIDMap.erase(oldid);
- mTexturesSizeMap.erase(oldid);
- mHeaderIDMap[id] = idx;
- }
- else
- {
- idx = -1;
- retry = true;
- }
- }
- if (idx >= 0)
- {
- if (touch && !mReadOnly)
- {
- // Update the lru entry
- mLRU.erase(idx);
- llassert_always(imagesize && *imagesize > 0);
- Entry* entry = new Entry(id, *imagesize, time(NULL));
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile::writeEx(mHeaderEntriesFileName,
- (U8*)entry, offset, sizeof(Entry),
- getLocalAPRFilePool());
- delete entry;
- }
- else if (imagesize)
- {
- // Get the image size
- Entry entry;
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ imagesize = entry.mImageSize;
+ writeEntryAndClose(idx, entry); // updates time
+ }
+ return idx;
+}
- LLAPRFile::readEx(mHeaderEntriesFileName,
- (U8*)&entry, offset, sizeof(Entry),
- getLocalAPRFilePool());
- *imagesize = entry.mSize;
- }
- }
+// Writes imagesize to the header, updates timestamp
+S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
+{
+ mHeaderMutex.lock();
+ llassert_always(imagesize >= 0);
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, true);
+ if (idx >= 0)
+ {
+ entry.mImageSize = imagesize;
+ writeEntryAndClose(idx, entry);
+ mHeaderMutex.unlock();
}
- if (retry)
+ else // retry
{
- readHeaderCache(); // updates the lru
+ mHeaderMutex.unlock();
+ readHeaderCache(); // We couldn't write an entry, so refresh the LRU
+ mHeaderMutex.lock();
llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
- idx = getHeaderCacheEntry(id, touch, imagesize); // assert above ensures no inf. recursion
+ mHeaderMutex.unlock();
+ idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
}
return idx;
}
@@ -1427,8 +1542,8 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const std::string& filena
// so let the thread handle it
LLMutexLock lock(&mWorkersMutex);
LLTextureCacheWorker* worker = new LLTextureCacheLocalFileWorker(this, priority, filename, id,
- NULL, size, offset, 0,
- responder);
+ NULL, size, offset, 0,
+ responder);
handle_t handle = worker->read();
mReaders[handle] = worker;
return handle;
@@ -1441,8 +1556,8 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const LLUUID& id, U32 pri
// so let the thread handle it
LLMutexLock lock(&mWorkersMutex);
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
- NULL, size, offset, 0,
- responder);
+ NULL, size, offset,
+ 0, responder);
handle_t handle = worker->read();
mReaders[handle] = worker;
return handle;
@@ -1453,21 +1568,24 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
{
lockWorkers();
handle_map_t::iterator iter = mReaders.find(handle);
- llassert_always(iter != mReaders.end());
- LLTextureCacheWorker* worker = iter->second;
- bool res = worker->complete();
- if (res || abort)
+ LLTextureCacheWorker* worker = NULL;
+ bool complete = false;
+ if (iter != mReaders.end())
{
- mReaders.erase(handle);
+ worker = iter->second;
+ complete = worker->complete();
+ }
+ if (worker && (complete || abort))
+ {
+ mReaders.erase(iter);
unlockWorkers();
worker->scheduleDelete();
- return true;
}
else
{
unlockWorkers();
- return false;
}
+ return (complete || abort);
}
LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
@@ -1487,39 +1605,33 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio
purgeTextures(false);
mDoPurge = FALSE;
}
- if (datasize >= TEXTURE_CACHE_ENTRY_SIZE)
- {
- LLMutexLock lock(&mWorkersMutex);
- llassert_always(imagesize > 0);
- LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
- data, datasize, 0,
- imagesize, responder);
- handle_t handle = worker->write();
- mWriters[handle] = worker;
- return handle;
- }
- delete responder;
- return LLWorkerThread::nullHandle();
+ LLMutexLock lock(&mWorkersMutex);
+ LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
+ data, datasize, 0,
+ imagesize, responder);
+ handle_t handle = worker->write();
+ mWriters[handle] = worker;
+ return handle;
}
bool LLTextureCache::writeComplete(handle_t handle, bool abort)
{
lockWorkers();
handle_map_t::iterator iter = mWriters.find(handle);
- llassert_always(iter != mWriters.end());
- LLTextureCacheWorker* worker = iter->second;
- if (worker->complete() || abort)
- {
- mWriters.erase(handle);
- unlockWorkers();
- worker->scheduleDelete();
- return true;
- }
- else
+ llassert(iter != mWriters.end());
+ if (iter != mWriters.end())
{
- unlockWorkers();
- return false;
+ LLTextureCacheWorker* worker = iter->second;
+ if (worker->complete() || abort)
+ {
+ mWriters.erase(handle);
+ unlockWorkers();
+ worker->scheduleDelete();
+ return true;
+ }
}
+ unlockWorkers();
+ return false;
}
void LLTextureCache::prioritizeWrite(handle_t handle)
@@ -1539,32 +1651,20 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
// Called from MAIN thread (endWork())
-
+// Ensure that mHeaderMutex is locked first!
bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
{
- if (mReadOnly)
- {
- return false;
- }
- LLMutexLock lock(&mHeaderMutex);
- id_map_t::iterator iter = mHeaderIDMap.find(id);
- if (iter != mHeaderIDMap.end())
- {
- S32 idx = iter->second;
- if (idx >= 0)
- {
- Entry* entry = new Entry(id, -1, time(NULL));
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
-
- LLAPRFile::writeEx(mHeaderEntriesFileName,
- (U8*)entry, offset, sizeof(Entry),
- getLocalAPRFilePool());
- delete entry;
- mLRU[idx] = id;
- mHeaderIDMap.erase(id);
- mTexturesSizeMap.erase(id);
- return true;
- }
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx >= 0)
+ {
+ entry.mImageSize = -1;
+ entry.mBodySize = 0;
+ writeEntryAndClose(idx, entry);
+ mFreeList.insert(idx);
+ mHeaderIDMap.erase(id);
+ mTexturesSizeMap.erase(id);
+ return true;
}
return false;
}
@@ -1574,6 +1674,7 @@ void LLTextureCache::removeFromCache(const LLUUID& id)
//llwarns << "Removing texture from cache: " << id << llendl;
if (!mReadOnly)
{
+ LLMutexLock lock(&mHeaderMutex);
removeHeaderCacheEntry(id);
LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
}
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 68b1458e9a..64ec881fc3 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -40,6 +40,7 @@
#include "llworkerthread.h"
+class LLImageFormatted;
class LLTextureCacheWorker;
class LLTextureCache : public LLWorkerThread
@@ -48,6 +49,32 @@ class LLTextureCache : public LLWorkerThread
friend class LLTextureCacheRemoteWorker;
friend class LLTextureCacheLocalFileWorker;
+private:
+ // Entries
+ struct EntriesInfo
+ {
+ EntriesInfo() : mVersion(0.f), mEntries(0) {}
+ F32 mVersion;
+ U32 mEntries;
+ };
+ struct Entry
+ {
+ Entry() :
+ mBodySize(0),
+ mImageSize(0),
+ mTime(0)
+ {
+ }
+ Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) :
+ mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {}
+ void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; }
+ LLUUID mID; // 16 bytes
+ S32 mImageSize; // total size of image if known
+ S32 mBodySize; // size of body file in body cache
+ U32 mTime; // seconds since 1/1/1970
+ };
+
+
public:
class Responder : public LLResponder
@@ -106,10 +133,16 @@ public:
// debug
S32 getNumReads() { return mReaders.size(); }
S32 getNumWrites() { return mWriters.size(); }
+ S64 getUsage() { return mTexturesSizeTotal; }
+ S64 getMaxUsage() { return sCacheMaxTexturesSize; }
+ U32 getEntries() { return mHeaderEntriesInfo.mEntries; }
+ U32 getMaxEntries() { return sCacheMaxEntries; };
+ BOOL isInCache(const LLUUID& id) ;
+ BOOL isInLocal(const LLUUID& id) ;
protected:
// Accessed by LLTextureCacheWorker
- bool appendToTextureEntryList(const LLUUID& id, S32 size);
+ bool updateTextureEntryList(const LLUUID& id, S32 size);
std::string getLocalFileName(const LLUUID& id);
std::string getTextureFileName(const LLUUID& id);
void addCompleted(Responder* responder, bool success);
@@ -122,7 +155,16 @@ private:
void readHeaderCache();
void purgeAllTextures(bool purge_directories);
void purgeTextures(bool validate);
- S32 getHeaderCacheEntry(const LLUUID& id, bool touch, S32* imagesize = NULL);
+ LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
+ void closeHeaderEntriesFile();
+ void readEntriesHeader();
+ void writeEntriesHeader();
+ S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
+ void writeEntryAndClose(S32 idx, Entry& entry);
+ U32 openAndReadEntries(std::vector<Entry>& entries);
+ void writeEntriesAndClose(const std::vector<Entry>& entries);
+ S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
+ S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
bool removeHeaderCacheEntry(const LLUUID& id);
void lockHeaders() { mHeaderMutex.lock(); }
void unlockHeaders() { mHeaderMutex.unlock(); }
@@ -132,6 +174,7 @@ private:
LLMutex mWorkersMutex;
LLMutex mHeaderMutex;
LLMutex mListMutex;
+ LLAPRFile* mHeaderAPRFile;
typedef std::map<handle_t, LLTextureCacheWorker*> handle_map_t;
handle_map_t mReaders;
@@ -145,42 +188,28 @@ private:
BOOL mReadOnly;
- // Entries
- struct EntriesInfo
- {
- F32 mVersion;
- U32 mEntries;
- };
- struct Entry
- {
- Entry() {}
- Entry(const LLUUID& id, S32 size, U32 time) : mID(id), mSize(size), mTime(time) {}
- LLUUID mID; // 128 bits
- S32 mSize; // total size of image if known (NOT size cached)
- U32 mTime; // seconds since 1/1/1970
- };
-
// HEADERS (Include first mip)
std::string mHeaderEntriesFileName;
std::string mHeaderDataFileName;
EntriesInfo mHeaderEntriesInfo;
- typedef std::map<S32,LLUUID> index_map_t;
- index_map_t mLRU; // index, id; stored as a map for fast removal
+ std::set<S32> mFreeList; // deleted entries
+ std::set<LLUUID> mLRU;
typedef std::map<LLUUID,S32> id_map_t;
id_map_t mHeaderIDMap;
// BODIES (TEXTURES minus headers)
std::string mTexturesDirName;
- std::string mTexturesDirEntriesFileName;
typedef std::map<LLUUID,S32> size_map_t;
size_map_t mTexturesSizeMap;
S64 mTexturesSizeTotal;
LLAtomic32<BOOL> mDoPurge;
-
+
// Statics
static F32 sHeaderCacheVersion;
static U32 sCacheMaxEntries;
static S64 sCacheMaxTexturesSize;
};
+extern const S32 TEXTURE_CACHE_ENTRY_SIZE;
+
#endif // LL_LLTEXTURECACHE_H
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 4940d9b5bb..2b846d33fc 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -47,7 +47,9 @@
#include "llfolderview.h"
#include "llfoldervieweventlistener.h"
#include "llinventory.h"
-#include "llinventorymodel.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "lllineeditor.h"
#include "llui.h"
@@ -424,7 +426,7 @@ BOOL LLFloaterTexturePicker::postBuild()
mInventoryPanel->getRootFolder()->getFilter()->markDefault();
// Commented out to stop opening all folders with textures
- // mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE);
+ // mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE);
// don't put keyboard focus on selected item, because the selection callback
// will assume that this was user input
@@ -527,7 +529,7 @@ void LLFloaterTexturePicker::draw()
mTexturep = NULL;
if(mImageAssetID.notNull())
{
- mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO);
+ mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES);
mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
}
else if (!mFallbackImageName.empty())
@@ -876,6 +878,7 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
{
setAllowNoTexture(p.allow_no_texture);
setCanApplyImmediately(p.can_apply_immediately);
+ mCommitOnSelection = !p.no_commit_on_selection;
LLTextBox::Params params(p.caption_text);
params.name(p.label);
@@ -1071,7 +1074,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
{
showPicker(FALSE);
//grab textures first...
- gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE));
+ gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));
//...then start full inventory fetch.
gInventory.startBackgroundFetch();
handled = TRUE;
@@ -1100,7 +1103,10 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
{
if (op == TEXTURE_CANCEL)
mViewModel->resetDirty();
- else
+ // If the "no_commit_on_selection" parameter is set
+ // we get dirty only when user presses OK in the picker
+ // (i.e. op == TEXTURE_SELECT) or texture changes via DnD.
+ else if (mCommitOnSelection || op == TEXTURE_SELECT)
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
if( floaterp->isDirty() )
@@ -1120,7 +1126,11 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
}
else
{
- onCommit();
+ // If the "no_commit_on_selection" parameter is set
+ // we commit only when user presses OK in the picker
+ // (i.e. op == TEXTURE_SELECT) or texture changes via DnD.
+ if (mCommitOnSelection || op == TEXTURE_SELECT)
+ onCommit();
}
}
}
@@ -1158,6 +1168,9 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
{
if(doDrop(item))
{
+ if (!mCommitOnSelection)
+ mViewModel->setDirty();
+
// This removes the 'Multiple' overlay, since
// there is now only one texture selected.
setTentative( FALSE );
@@ -1188,8 +1201,12 @@ void LLTextureCtrl::draw()
}
else if (!mImageAssetID.isNull())
{
- mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO);
- mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
+ LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+
+ texture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
+ texture->forceToSaveRawImage(0) ;
+
+ mTexturep = texture;
}
else if (!mFallbackImageName.empty())
{
@@ -1235,15 +1252,16 @@ void LLTextureCtrl::draw()
// Using the discard level, do not show the string if the texture is almost but not
// fully loaded.
if ( mTexturep.notNull() &&
+ (!mTexturep->isFullyLoaded()) &&
(mShowLoadingPlaceholder == TRUE) &&
(mTexturep->getDiscardLevel() != 1) &&
(mTexturep->getDiscardLevel() != 0))
{
- LLFontGL* font = LLFontGL::getFontSansSerifBig();
+ LLFontGL* font = LLFontGL::getFontSansSerif();
font->renderUTF8(
mLoadingPlaceholderString, 0,
- llfloor(interior.mLeft+10),
- llfloor(interior.mTop-20),
+ llfloor(interior.mLeft+3),
+ llfloor(interior.mTop-25),
LLColor4::white,
LLFontGL::LEFT,
LLFontGL::BASELINE,
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 0b232da62b..8ca92c3d87 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -45,7 +45,7 @@
class LLButton;
class LLFloaterTexturePicker;
class LLInventoryItem;
-class LLViewerTexture;
+class LLViewerFetchedTexture;
// used for setting drag & drop callbacks.
typedef boost::function<BOOL (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback;
@@ -74,6 +74,8 @@ public:
Optional<std::string> default_image_name;
Optional<bool> allow_no_texture;
Optional<bool> can_apply_immediately;
+ Optional<bool> no_commit_on_selection; // alternative mode: commit occurs and the widget gets dirty
+ // only on DnD or when OK is pressed in the picker
Optional<S32> label_width;
Optional<LLUIColor> border_color;
@@ -88,6 +90,7 @@ public:
default_image_name("default_image_name"),
allow_no_texture("allow_no_texture"),
can_apply_immediately("can_apply_immediately"),
+ no_commit_on_selection("no_commit_on_selection", false),
label_width("label_width", -1),
border_color("border_color"),
multiselect_text("multiselect_text"),
@@ -189,7 +192,7 @@ private:
drag_n_drop_callback mDropCallback;
commit_callback_t mOnCancelCallback;
commit_callback_t mOnSelectCallback;
- LLPointer<LLViewerTexture> mTexturep;
+ LLPointer<LLViewerFetchedTexture> mTexturep;
LLUIColor mBorderColor;
LLUUID mImageItemID;
LLUUID mImageAssetID;
@@ -204,6 +207,7 @@ private:
PermissionMask mImmediateFilterPermMask;
PermissionMask mNonImmediateFilterPermMask;
BOOL mCanApplyImmediately;
+ BOOL mCommitOnSelection;
BOOL mNeedsRawImageData;
LLViewBorder* mBorder;
BOOL mValid;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 88fc7f98c0..6c35464a51 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -32,108 +32,37 @@
#include "llviewerprecompiledheaders.h"
+#include <iostream>
+
#include "llstl.h"
#include "lltexturefetch.h"
#include "llcurl.h"
+#include "lldir.h"
#include "llhttpclient.h"
+#include "llhttpstatuscodes.h"
#include "llimage.h"
+#include "llimagej2c.h"
#include "llimageworker.h"
#include "llworkerthread.h"
+#include "message.h"
#include "llagent.h"
#include "lltexturecache.h"
+#include "llviewercontrol.h"
#include "llviewertexturelist.h"
#include "llviewertexture.h"
#include "llviewerregion.h"
+#include "llworld.h"
//////////////////////////////////////////////////////////////////////////////
-//static
class LLTextureFetchWorker : public LLWorkerClass
{
-friend class LLTextureFetch;
-
-private:
-#if 0
- class URLResponder : public LLHTTPClient::Responder
- {
- public:
- URLResponder(LLTextureFetch* fetcher, const LLUUID& id)
- : mFetcher(fetcher), mID(id)
- {
- }
- ~URLResponder()
- {
- }
- virtual void error(U32 status, const std::string& reason)
- {
- mFetcher->lockQueue();
- LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
- if (worker)
- {
-// llwarns << "LLTextureFetchWorker::URLResponder::error " << status << ": " << reason << llendl;
- worker->callbackURLReceived(LLSD(), false);
- }
- mFetcher->unlockQueue();
- }
- virtual void result(const LLSD& content)
- {
- mFetcher->lockQueue();
- LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
- if (worker)
- {
- worker->callbackURLReceived(content, true);
- }
- mFetcher->unlockQueue();
- }
- private:
- LLTextureFetch* mFetcher;
- LLUUID mID;
- };
-
- class HTTPGetResponder : public LLHTTPClient::Responder
- {
- public:
- HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id)
- : mFetcher(fetcher), mID(id)
- {
- }
- ~HTTPGetResponder()
- {
- }
- virtual void completed(U32 status, const std::stringstream& content)
- {
- mFetcher->lockQueue();
- LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
- if (worker)
- {
- const std::string& cstr = content.str();
- if (200 <= status && status < 300)
- {
- if (203 == status) // partial information (i.e. last block)
- {
- worker->callbackHttpGet((U8*)cstr.c_str(), cstr.length(), true);
- }
- else
- {
- worker->callbackHttpGet((U8*)cstr.c_str(), cstr.length(), false);
- }
- }
- else
- {
-// llinfos << "LLTextureFetchWorker::HTTPGetResponder::error " << status << ": " << cstr << llendl;
- worker->callbackHttpGet(NULL, -1, true);
- }
- }
- mFetcher->unlockQueue();
- }
- private:
- LLTextureFetch* mFetcher;
- LLUUID mID;
- };
-#endif
+ friend class LLTextureFetch;
+ friend class HTTPGetResponder;
+private:
class CacheReadResponder : public LLTextureCache::ReadResponder
{
public:
@@ -144,13 +73,11 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheRead(success, mFormattedImage, mImageSize, mImageLocal);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -166,35 +93,31 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheWrite(success);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
LLUUID mID;
};
- class DecodeResponder : public LLResponder
+ class DecodeResponder : public LLImageDecodeThread::Responder
{
public:
DecodeResponder(LLTextureFetch* fetcher, const LLUUID& id, LLTextureFetchWorker* worker)
: mFetcher(fetcher), mID(id), mWorker(worker)
{
}
- virtual void completed(bool success)
+ virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
- worker->callbackDecoded(success);
+ worker->callbackDecoded(success, raw, aux);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -227,37 +150,47 @@ public:
~LLTextureFetchWorker();
void relese() { --mActiveCount; }
+ void callbackHttpGet(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer,
+ bool partial, bool success);
+ void callbackCacheRead(bool success, LLImageFormatted* image,
+ S32 imagesize, BOOL islocal);
+ void callbackCacheWrite(bool success);
+ void callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux);
+
+ void setGetStatus(U32 status, const std::string& reason)
+ {
+ LLMutexLock lock(&mWorkMutex);
+
+ mGetStatus = status;
+ mGetReason = reason;
+ }
+
protected:
LLTextureFetchWorker(LLTextureFetch* fetcher, const LLUUID& id, const LLHost& host,
F32 priority, S32 discard, S32 size);
+ LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host,
+ F32 priority, S32 discard, S32 size);
private:
/*virtual*/ void startWork(S32 param); // called from addWork() (MAIN THREAD)
/*virtual*/ void endWork(S32 param, bool aborted); // called from doWork() (MAIN THREAD)
- virtual std::string getName() { return LLStringUtil::null; }
void resetFormattedData();
void setImagePriority(F32 priority);
void setDesiredDiscard(S32 discard, S32 size);
bool insertPacket(S32 index, U8* data, S32 size);
void clearPackets();
+ void setupPacketData();
U32 calcWorkPriority();
void removeFromCache();
bool processSimulatorPackets();
- bool decodeImage();
bool writeToCacheComplete();
- void lockWorkData() { mWorkMutex.lock(); }
- void unlockWorkData() { mWorkMutex.unlock(); }
+ void lockWorkMutex() { mWorkMutex.lock(); }
+ void unlockWorkMutex() { mWorkMutex.unlock(); }
- void callbackURLReceived(const LLSD& data, bool success);
- void callbackHttpGet(U8* data, S32 data_size, bool last_block);
- void callbackCacheRead(bool success, LLImageFormatted* image,
- S32 imagesize, BOOL islocal);
- void callbackCacheWrite(bool success);
- void callbackDecoded(bool success);
-
private:
enum e_state // mState
{
@@ -268,8 +201,8 @@ private:
CACHE_POST,
LOAD_FROM_NETWORK,
LOAD_FROM_SIMULATOR,
- LOAD_FROM_HTTP_GET_URL,
- LOAD_FROM_HTTP_GET_DATA,
+ SEND_HTTP_REQ,
+ WAIT_HTTP_REQ,
DECODE_IMAGE,
DECODE_IMAGE_UPDATE,
WRITE_TO_CACHE,
@@ -280,19 +213,17 @@ private:
{
UNSENT = 0,
QUEUED = 1,
- SENT_SIM = 2,
- SENT_URL = 3,
- SENT_HTTP = 4
+ SENT_SIM = 2
};
static const char* sStateDescs[];
e_state mState;
LLTextureFetch* mFetcher;
- LLImageWorker* mImageWorker;
LLPointer<LLImageFormatted> mFormattedImage;
LLPointer<LLImageRaw> mRawImage;
LLPointer<LLImageRaw> mAuxImage;
LLUUID mID;
LLHost mHost;
+ std::string mUrl;
U8 mType;
F32 mImagePriority;
U32 mWorkPriority;
@@ -314,15 +245,18 @@ private:
S32 mCachedSize;
BOOL mLoaded;
e_request_state mSentRequest;
+ handle_t mDecodeHandle;
BOOL mDecoded;
BOOL mWritten;
BOOL mNeedsAux;
BOOL mHaveAllData;
BOOL mInLocalCache;
+ S32 mHTTPFailCount;
S32 mRetryAttempt;
- std::string mURL;
S32 mActiveCount;
-
+ U32 mGetStatus;
+ std::string mGetReason;
+
// Work Data
LLMutex mWorkMutex;
struct PacketData
@@ -340,25 +274,77 @@ private:
U8 mImageCodec;
};
-class LLTextureFetchLocalFileWorker : public LLTextureFetchWorker
-{
-friend class LLTextureFetch;
-
-protected:
- LLTextureFetchLocalFileWorker(LLTextureFetch* fetcher, const std::string& filename, const LLUUID& id, const LLHost& host,
- F32 priority, S32 discard, S32 size)
- : LLTextureFetchWorker(fetcher, id, host, priority, discard, size),
- mFileName(filename)
- {}
+//////////////////////////////////////////////////////////////////////////////
-private:
- /*virtual*/ std::string getName() { return mFileName; }
+class HTTPGetResponder : public LLCurl::Responder
+{
+ LOG_CLASS(HTTPGetResponder);
+public:
+ HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset)
+ : mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset)
+ {
+ }
+ ~HTTPGetResponder()
+ {
+ }
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ {
+ mFetcher->mTextureInfo.setRequestStartTime(mID, mStartTime);
+ U64 timeNow = LLTimer::getTotalTime();
+ mFetcher->mTextureInfo.setRequestType(mID, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ mFetcher->mTextureInfo.setRequestSize(mID, mRequestedSize);
+ mFetcher->mTextureInfo.setRequestOffset(mID, mOffset);
+ mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, timeNow);
+ }
+ lldebugs << "HTTP COMPLETE: " << mID << llendl;
+ LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
+ if (worker)
+ {
+ bool success = false;
+ bool partial = false;
+ if (HTTP_OK <= status && status < HTTP_MULTIPLE_CHOICES)
+ {
+ success = true;
+ if (HTTP_PARTIAL_CONTENT == status) // partial information
+ {
+ partial = true;
+ }
+ }
+ else
+ {
+ worker->setGetStatus(status, reason);
+// llwarns << status << ": " << reason << llendl;
+ }
+ if (!success)
+ {
+ worker->setGetStatus(status, reason);
+// llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl;
+ }
+ mFetcher->removeFromHTTPQueue(mID);
+ worker->callbackHttpGet(channels, buffer, partial, success);
+ }
+ else
+ {
+ mFetcher->removeFromHTTPQueue(mID);
+ llwarns << "Worker not found: " << mID << llendl;
+ }
+ }
+
private:
- std::string mFileName;
+ LLTextureFetch* mFetcher;
+ LLUUID mID;
+ U64 mStartTime;
+ S32 mRequestedSize;
+ U32 mOffset;
};
+//////////////////////////////////////////////////////////////////////////////
//static
const char* LLTextureFetchWorker::sStateDescs[] = {
@@ -368,8 +354,8 @@ const char* LLTextureFetchWorker::sStateDescs[] = {
"CACHE_POST",
"LOAD_FROM_NETWORK",
"LOAD_FROM_SIMULATOR",
- "LOAD_FROM_HTTP_URL",
- "LOAD_FROM_HTTP_DATA",
+ "SEND_HTTP_REQ",
+ "WAIT_HTTP_REQ",
"DECODE_IMAGE",
"DECODE_IMAGE_UPDATE",
"WRITE_TO_CACHE",
@@ -380,6 +366,7 @@ const char* LLTextureFetchWorker::sStateDescs[] = {
// called from MAIN THREAD
LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
+ const std::string& url, // Optional URL
const LLUUID& id, // Image UUID
const LLHost& host, // Simulator host
F32 priority, // Priority
@@ -388,9 +375,9 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
: LLWorkerClass(fetcher, "TextureFetch"),
mState(INIT),
mFetcher(fetcher),
- mImageWorker(NULL),
mID(id),
mHost(host),
+ mUrl(url),
mImagePriority(priority),
mWorkPriority(0),
mRequestedPriority(0.f),
@@ -404,18 +391,21 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mBuffer(NULL),
mBufferSize(0),
mRequestedSize(0),
- mDesiredSize(FIRST_PACKET_SIZE),
+ mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE),
mFileSize(0),
mCachedSize(0),
mLoaded(FALSE),
mSentRequest(UNSENT),
+ mDecodeHandle(0),
mDecoded(FALSE),
mWritten(FALSE),
mNeedsAux(FALSE),
mHaveAllData(FALSE),
mInLocalCache(FALSE),
+ mHTTPFailCount(0),
mRetryAttempt(0),
mActiveCount(0),
+ mGetStatus(0),
mWorkMutex(NULL),
mFirstPacket(0),
mLastPacket(-1),
@@ -440,7 +430,7 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
// << " Requested=" << mRequestedDiscard
// << " Desired=" << mDesiredDiscard << llendl;
llassert_always(!haveWork());
- lockWorkData();
+ lockWorkMutex();
if (mCacheReadHandle != LLTextureCache::nullHandle())
{
mFetcher->mTextureCache->readComplete(mCacheReadHandle, true);
@@ -449,13 +439,10 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
{
mFetcher->mTextureCache->writeComplete(mCacheWriteHandle, true);
}
- if (mImageWorker)
- {
- mImageWorker->scheduleDelete();
- }
mFormattedImage = NULL;
clearPackets();
- unlockWorkData();
+ unlockWorkMutex();
+ mFetcher->removeFromHTTPQueue(mID);
}
void LLTextureFetchWorker::clearPackets()
@@ -467,11 +454,44 @@ void LLTextureFetchWorker::clearPackets()
mFirstPacket = 0;
}
+void LLTextureFetchWorker::setupPacketData()
+{
+ S32 data_size = 0;
+ if (mFormattedImage.notNull())
+ {
+ data_size = mFormattedImage->getDataSize();
+ }
+ if (data_size > 0)
+ {
+ // Only used for simulator requests
+ mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1;
+ if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size)
+ {
+ llwarns << "Bad CACHED TEXTURE size: " << data_size << " removing." << llendl;
+ removeFromCache();
+ resetFormattedData();
+ clearPackets();
+ }
+ else if (mFileSize > 0)
+ {
+ mLastPacket = mFirstPacket-1;
+ mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1;
+ }
+ else
+ {
+ // This file was cached using HTTP so we have to refetch the first packet
+ resetFormattedData();
+ clearPackets();
+ }
+ }
+}
+
U32 LLTextureFetchWorker::calcWorkPriority()
{
-// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority());
- F32 priority_scale = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
- mWorkPriority = (U32)(mImagePriority * priority_scale);
+ //llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerFetchedTexture::maxDecodePriority());
+ static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
+
+ mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE);
return mWorkPriority;
}
@@ -502,6 +522,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
mDesiredSize = size;
prioritize = true;
}
+ mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);
if ((prioritize && mState == INIT) || mState == DONE)
{
mState = INIT;
@@ -538,7 +559,6 @@ void LLTextureFetchWorker::resetFormattedData()
// Called from MAIN thread
void LLTextureFetchWorker::startWork(S32 param)
{
- llassert(mImageWorker == NULL);
llassert(mFormattedImage.isNull());
}
@@ -549,6 +569,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
LLMutexLock lock(&mWorkMutex);
+ if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
+ {
+ if (mState < WRITE_TO_CACHE)
+ {
+ return true; // abort
+ }
+ }
+
if (mFetcher->mDebugPause)
{
return false; // debug: don't do any work
@@ -563,16 +591,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
mFetchTimer.reset();
}
- if (mImagePriority <= 0.0f)
- {
- if (mState < WRITE_TO_CACHE)
- {
- return true; // cancel request
- }
- }
-
if (mState == INIT)
{
+ mRawImage = NULL ;
mRequestedDiscard = -1;
mLoadedDiscard = -1;
mDecodedDiscard = -1;
@@ -590,8 +611,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
clearPackets(); // TODO: Shouldn't be necessary
mCacheReadHandle = LLTextureCache::nullHandle();
mCacheWriteHandle = LLTextureCache::nullHandle();
- mURL.clear();
mState = LOAD_FROM_TEXTURE_CACHE;
+ mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE
+ LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority)
+ << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
// fall through
}
@@ -612,16 +635,29 @@ bool LLTextureFetchWorker::doWork(S32 param)
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
- if (getName().empty())
+ if (mUrl.compare(0, 7, "file://") == 0)
+ {
+ // read file from local disk
+ std::string filename = mUrl.substr(7, std::string::npos);
+ mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority,
+ offset, size, responder);
+ }
+ else if (mUrl.empty())
{
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority,
offset, size, responder);
}
else
{
- // read file from local disk
- mCacheReadHandle = mFetcher->mTextureCache->readFromCache(getName(), mID, cache_priority,
- offset, size, responder);
+ if (!(mUrl.compare(0, 7, "http://") == 0))
+ {
+ // *TODO:?remove this warning
+ llwarns << "Unknown URL Type: " << mUrl << llendl;
+ }
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ mState = SEND_HTTP_REQ;
+ delete responder;
+ responder = NULL;
}
}
@@ -647,75 +683,101 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == CACHE_POST)
{
- mDesiredSize = llmax(mDesiredSize, FIRST_PACKET_SIZE);
mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
// Successfully loaded
if ((mCachedSize >= mDesiredSize) || mHaveAllData)
{
// we have enough data, decode it
llassert_always(mFormattedImage->getDataSize() > 0);
+ mLoadedDiscard = mDesiredDiscard;
mState = DECODE_IMAGE;
+ LL_DEBUGS("Texture") << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize()
+ << " Size: " << llformat("%dx%d",mFormattedImage->getWidth(),mFormattedImage->getHeight())
+ << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
// fall through
}
else
{
- if (!getName().empty())
+ if (mUrl.compare(0, 7, "file://") == 0)
{
// failed to load local file, we're done.
return true;
}
// need more data
- mState = LOAD_FROM_NETWORK;
+ else
+ {
+ LL_DEBUGS("Texture") << mID << ": Not in Cache" << LL_ENDL;
+ mState = LOAD_FROM_NETWORK;
+ }
// fall through
}
}
if (mState == LOAD_FROM_NETWORK)
{
- if (mSentRequest == UNSENT)
+ bool get_url = gSavedSettings.getBOOL("ImagePipelineUseHTTP");
+ if (!mUrl.empty()) get_url = false;
+// if (mHost != LLHost::invalid) get_url = false;
+ if ( get_url )
{
- if (mFormattedImage.isNull())
- {
- mFormattedImage = new LLImageJ2C;
- }
- // Add this to the network queue and sit here.
- // LLTextureFetch::update() will send off a request which will change our state
- S32 data_size = mFormattedImage->getDataSize();
- if (data_size > 0)
+ LLViewerRegion* region = NULL;
+ if (mHost == LLHost::invalid)
+ region = gAgent.getRegion();
+ else
+ region = LLWorld::getInstance()->getRegion(mHost);
+
+ if (region)
{
- // Only used for simulator requests
- mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1;
- if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size)
- {
-// llwarns << "Bad CACHED TEXTURE size: " << data_size << " removing." << llendl;
- removeFromCache();
- resetFormattedData();
- clearPackets();
- }
- else
+ std::string http_url = region->getCapability("GetTexture");
+ if (!http_url.empty())
{
- mLastPacket = mFirstPacket-1;
- mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1;
+ mUrl = http_url + "/?texture_id=" + mID.asString().c_str();
}
}
+ else
+ {
+ // This will happen if not logged in or if a region deoes not have HTTP Texture enabled
+ //llwarns << "Region not found for host: " << mHost << llendl;
+ }
+ }
+ if (!mUrl.empty())
+ {
+ mState = LLTextureFetchWorker::SEND_HTTP_REQ;
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ // don't return, fall through to next state
+ }
+ else if (mSentRequest == UNSENT)
+ {
+ // Add this to the network queue and sit here.
+ // LLTextureFetch::update() will send off a request which will change our state
mRequestedSize = mDesiredSize;
mRequestedDiscard = mDesiredDiscard;
mSentRequest = QUEUED;
- mFetcher->lockQueue();
mFetcher->addToNetworkQueue(this);
- mFetcher->unlockQueue();
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return false;
+ }
+ else
+ {
+ // Shouldn't need to do anything here
+ //llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end());
+ // Make certain this is in the network queue
+ //mFetcher->addToNetworkQueue(this);
+ //setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return false;
}
- return false;
}
if (mState == LOAD_FROM_SIMULATOR)
{
+ if (mFormattedImage.isNull())
+ {
+ mFormattedImage = new LLImageJ2C;
+ }
if (processSimulatorPackets())
{
- mFetcher->lockQueue();
- mFetcher->removeFromNetworkQueue(this);
- mFetcher->unlockQueue();
+ LL_DEBUGS("Texture") << mID << ": Loaded from Sim. Bytes: " << mFormattedImage->getDataSize() << LL_ENDL;
+ mFetcher->removeFromNetworkQueue(this, false);
if (mFormattedImage.isNull() || !mFormattedImage->getDataSize())
{
// processSimulatorPackets() failed
@@ -727,115 +789,145 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
+ mFetcher->addToNetworkQueue(this); // failsafe
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
}
return false;
}
-#if 0
- if (mState == LOAD_FROM_HTTP_GET_URL)
- {
- if (!mSentRequest)
- {
- mSentRequest = TRUE;
- mLoaded = FALSE;
- std::string url;
- LLViewerRegion* region = gAgent.getRegion();
- if (region)
+ if (mState == SEND_HTTP_REQ)
+ {
+ {
+ const S32 HTTP_QUEUE_MAX_SIZE = 8;
+ // *TODO: Integrate this with llviewerthrottle
+ // Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP,
+ // but probably not for Textures.
+ // Set the throttle to the entire bandwidth, assuming UDP packets will get priority
+ // when they are needed
+ F32 max_bandwidth = mFetcher->mMaxBandwidth;
+ if ((mFetcher->getHTTPQueueSize() >= HTTP_QUEUE_MAX_SIZE) ||
+ (mFetcher->getTextureBandwidth() > max_bandwidth))
{
- url = region->getCapability("RequestTextureDownload");
- }
- if (!url.empty())
- {
- LLSD sd;
- sd = mID.asString();
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
- LLHTTPClient::post(url, sd, new URLResponder(mFetcher, mID));
- return false;
- }
- else
- {
-// llwarns << mID << ": HTTP get url failed, requesting from simulator" << llendl;
- mSentRequest = FALSE;
- mState = LOAD_FROM_SIMULATOR;
+ // Make normal priority and return (i.e. wait until there is room in the queue)
+ setPriority(LLWorkerThread::PRIORITY_NORMAL | mWorkPriority);
return false;
}
- }
- else
- {
- if (mLoaded)
+
+ mFetcher->removeFromNetworkQueue(this, false);
+
+ S32 cur_size = 0;
+ if (mFormattedImage.notNull())
{
- if (!mURL.empty())
- {
- mState = LOAD_FROM_HTTP_GET_DATA;
- mSentRequest = FALSE; // reset
- mLoaded = FALSE; // reset
- }
- else
+ cur_size = mFormattedImage->getDataSize(); // amount of data we already have
+ if (mFormattedImage->getDiscardLevel() == 0)
{
-// llwarns << mID << ": HTTP get url is empty, requesting from simulator" << llendl;
- mSentRequest = FALSE;
- mState = LOAD_FROM_SIMULATOR;
+ // We already have all the data, just decode it
+ mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ mState = DECODE_IMAGE;
return false;
}
}
- }
- // fall through
- }
-
- if (mState == LOAD_FROM_HTTP_GET_DATA)
- {
- if (!mSentRequest)
- {
- mSentRequest = TRUE;
- S32 cur_size = mFormattedImage->getDataSize(); // amount of data we already have
mRequestedSize = mDesiredSize;
mRequestedDiscard = mDesiredDiscard;
-#if 1 // *TODO: LLCurl::getByteRange is broken (ignores range)
- cur_size = 0;
- mFormattedImage->deleteData();
-#endif
mRequestedSize -= cur_size;
- // F32 priority = mImagePriority / (F32)LLViewerTexture::maxDecodePriority(); // 0-1
S32 offset = cur_size;
mBufferSize = cur_size; // This will get modified by callbackHttpGet()
- std::string url;
- if (mURL.empty())
+
+ bool res = false;
+ if (!mUrl.empty())
{
- //url = "http://asset.agni/0000002f-38ae-0e17-8e72-712e58964e9c.texture";
- std::stringstream urlstr;
- urlstr << "http://asset.agni/" << mID.asString() << ".texture";
- url = urlstr.str();
+ mLoaded = FALSE;
+ mGetStatus = 0;
+ mGetReason.clear();
+ LL_DEBUGS("Texture") << "HTTP GET: " << mID << " Offset: " << offset
+ << " Bytes: " << mRequestedSize
+ << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << max_bandwidth
+ << LL_ENDL;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ mState = WAIT_HTTP_REQ;
+
+ mFetcher->addToHTTPQueue(mID);
+ // Will call callbackHttpGet when curl request completes
+ std::vector<std::string> headers;
+ headers.push_back("Accept: image/x-j2c");
+ res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize,
+ new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset));
}
- else
+ if (!res)
{
- url = mURL;
+ llwarns << "HTTP GET request failed for " << mID << llendl;
+ resetFormattedData();
+ ++mHTTPFailCount;
+ return true; // failed
}
- mLoaded = FALSE;
-// llinfos << "HTTP GET: " << mID << " Offset: " << offset << " Bytes: " << mRequestedSize << llendl;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
- LLCurl::getByteRange(url, offset, mRequestedSize,
- new HTTPGetResponder(mFetcher, mID)); // *TODO: use mWorkPriority
- return false; // not done
+ // fall through
}
-
+ }
+
+ if (mState == WAIT_HTTP_REQ)
+ {
if (mLoaded)
{
- S32 cur_size = mFormattedImage->getDataSize();
+ S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
if (mRequestedSize < 0)
{
-// llwarns << "http get failed for: " << mID << llendl;
- if (cur_size == 0)
+ S32 max_attempts;
+ if (mGetStatus == HTTP_NOT_FOUND)
+ {
+ mHTTPFailCount = max_attempts = 1; // Don't retry
+ llinfos << "Texture missing from server (404): " << mUrl << llendl;
+ }
+ else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
{
- resetFormattedData();
- return true; // failed
+ // *TODO: Should probably introduce a timer here to delay future HTTP requsts
+ // for a short time (~1s) to ease server load? Ideally the server would queue
+ // requests instead of returning 503... we already limit the number pending.
+ ++mHTTPFailCount;
+ max_attempts = mHTTPFailCount+1; // Keep retrying
+ LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;
}
else
{
- mState = DECODE_IMAGE;
- return false; // use what we have
+ const S32 HTTP_MAX_RETRY_COUNT = 3;
+ max_attempts = HTTP_MAX_RETRY_COUNT + 1;
+ ++mHTTPFailCount;
+ llinfos << "HTTP GET failed for: " << mUrl
+ << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
+ << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
+ }
+ if (mHTTPFailCount >= max_attempts)
+ {
+ if (cur_size > 0)
+ {
+ // Use available data
+ mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ mState = DECODE_IMAGE;
+ return false;
+ }
+ else
+ {
+ resetFormattedData();
+ return true; // failed
+ }
+ }
+ else
+ {
+ mState = SEND_HTTP_REQ;
+ return false; // retry
+ }
+ }
+
+ if (mFormattedImage.isNull())
+ {
+ // For now, create formatted image based on extension
+ std::string extension = gDirUtilp->getExtension(mUrl);
+ mFormattedImage = LLImageFormatted::createFromType(LLImageBase::getCodecFromExtension(extension));
+ if (mFormattedImage.isNull())
+ {
+ mFormattedImage = new LLImageJ2C; // default
}
}
+
llassert_always(mBufferSize == cur_size + mRequestedSize);
if (mHaveAllData)
{
@@ -854,43 +946,76 @@ bool LLTextureFetchWorker::doWork(S32 param)
mBuffer = NULL;
mBufferSize = 0;
mLoadedDiscard = mRequestedDiscard;
- setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ return false;
+ }
+ else
+ {
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
}
-
- // NOTE: Priority gets updated when the http get completes (in callbackHTTPGet())
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
- return false;
}
-#endif
if (mState == DECODE_IMAGE)
{
- llassert_always(mFormattedImage->getDataSize() > 0);
+ static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled");
+ if(textures_decode_disabled)
+ {
+ // for debug use, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
+ }
+
+ if (mDesiredDiscard < 0)
+ {
+ // We aborted, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
+ }
+
+ if (mFormattedImage->getDataSize() <= 0)
+ {
+ llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl;
+ }
+ if (mLoadedDiscard < 0)
+ {
+ //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+
+ //abort, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
+ }
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
mAuxImage = NULL;
- llassert_always(mImageWorker == NULL);
llassert_always(mFormattedImage.notNull());
S32 discard = mHaveAllData ? 0 : mLoadedDiscard;
U32 image_priority = LLWorkerThread::PRIORITY_NORMAL | mWorkPriority;
mDecoded = FALSE;
mState = DECODE_IMAGE_UPDATE;
- mImageWorker = new LLImageWorker(mFormattedImage, image_priority, discard, new DecodeResponder(mFetcher, mID, this));
- // fall though (need to call requestDecodedData() to start work)
+ LL_DEBUGS("Texture") << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard
+ << " All Data: " << mHaveAllData << LL_ENDL;
+ mDecodeHandle = mFetcher->mImageDecodeThread->decodeImage(mFormattedImage, image_priority, discard, mNeedsAux,
+ new DecodeResponder(mFetcher, mID, this));
+ // fall though
}
if (mState == DECODE_IMAGE_UPDATE)
{
- if (decodeImage())
+ if (mDecoded)
{
if (mDecodedDiscard < 0)
{
+ LL_DEBUGS("Texture") << mID << ": Failed to Decode." << LL_ENDL;
if (mCachedSize > 0 && !mInLocalCache && mRetryAttempt == 0)
{
// Cache file should be deleted, try again
// llwarns << mID << ": Decode of cached file failed (removed), retrying" << llendl;
+ llassert_always(mDecodeHandle == 0);
mFormattedImage = NULL;
++mRetryAttempt;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
@@ -905,6 +1030,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
+ llassert_always(mRawImage.notNull());
+ LL_DEBUGS("Texture") << mID << ": Decoded. Discard: " << mDecodedDiscard
+ << " Raw Image: " << llformat("%dx%d",mRawImage->getWidth(),mRawImage->getHeight()) << LL_ENDL;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = WRITE_TO_CACHE;
}
@@ -918,9 +1046,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == WRITE_TO_CACHE)
{
- if (mInLocalCache || !mFileSize || mSentRequest == UNSENT)
+ if (mInLocalCache || mSentRequest == UNSENT || mFormattedImage.isNull())
{
- // If we're in a local cache or we didn't actually receive any new data, skip
+ // If we're in a local cache or we didn't actually receive any new data,
+ // or we failed to load anything, skip
mState = DONE;
return false;
}
@@ -979,10 +1108,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
// Called from MAIN thread
void LLTextureFetchWorker::endWork(S32 param, bool aborted)
{
- if (mImageWorker)
+ if (mDecodeHandle != 0)
{
- mImageWorker->scheduleDelete();
- mImageWorker = NULL;
+ mFetcher->mImageDecodeThread->abortRequest(mDecodeHandle, false);
+ mDecodeHandle = 0;
}
mFormattedImage = NULL;
}
@@ -1035,7 +1164,7 @@ bool LLTextureFetchWorker::deleteOK()
if ((haveWork() &&
// not ok to delete from these states
- ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) ||
+ ((mState >= SEND_HTTP_REQ && mState <= WAIT_HTTP_REQ) ||
(mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE))))
{
delete_ok = false;
@@ -1044,7 +1173,6 @@ bool LLTextureFetchWorker::deleteOK()
return delete_ok;
}
-
void LLTextureFetchWorker::removeFromCache()
{
if (!mInLocalCache)
@@ -1061,6 +1189,7 @@ bool LLTextureFetchWorker::processSimulatorPackets()
if (mFormattedImage.isNull() || mRequestedSize < 0)
{
// not sure how we got here, but not a valid state, abort!
+ llassert_always(mDecodeHandle == 0);
mFormattedImage = NULL;
return true;
}
@@ -1074,6 +1203,12 @@ bool LLTextureFetchWorker::processSimulatorPackets()
buffer_size += mPackets[i]->mSize;
}
bool have_all_data = mLastPacket >= mTotalPackets-1;
+ if (mRequestedSize <= 0)
+ {
+ // We received a packed but haven't requested anything yet (edge case)
+ // Return true (we're "done") since we didn't request anything
+ return true;
+ }
if (buffer_size >= mRequestedSize || have_all_data)
{
/// We have enough (or all) data
@@ -1109,61 +1244,48 @@ bool LLTextureFetchWorker::processSimulatorPackets()
//////////////////////////////////////////////////////////////////////////////
-void LLTextureFetchWorker::callbackURLReceived(const LLSD& data, bool success)
+void LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer,
+ bool partial, bool success)
{
-#if 0
LLMutexLock lock(&mWorkMutex);
- if (!mSentRequest || mState != LOAD_FROM_HTTP_GET_URL)
- {
- llwarns << "callbackURLReceived for unrequested fetch worker, req="
- << mSentRequest << " state= " << mState << llendl;
- return;
- }
- if (success)
- {
- mURL = data.asString();
- }
- mLoaded = TRUE;
- setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////
-void LLTextureFetchWorker::callbackHttpGet(U8* data, S32 data_size, bool last_block)
-{
-#if 0
- LLMutexLock lock(&mWorkMutex);
- if (!mSentRequest || mState != LOAD_FROM_HTTP_GET_DATA)
+ if (mState != WAIT_HTTP_REQ)
{
- llwarns << "callbackHttpGet for unrequested fetch worker, req="
- << mSentRequest << " state= " << mState << llendl;
+ llwarns << "callbackHttpGet for unrequested fetch worker: " << mID
+ << " req=" << mSentRequest << " state= " << mState << llendl;
return;
}
-// llinfos << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << llendl;
if (mLoaded)
{
llwarns << "Duplicate callback for " << mID.asString() << llendl;
return; // ignore duplicate callback
}
- if (data_size >= 0)
+ if (success)
{
+ // get length of stream:
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ gTextureList.sTextureBits += data_size * 8; // Approximate - does not include header bits
+
+ LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
if (data_size > 0)
{
+ // *TODO: set the formatted image data here directly to avoid the copy
mBuffer = new U8[data_size];
- // *TODO: set the formatted image data here
- memcpy(mBuffer, data, data_size);
+ buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
mBufferSize += data_size;
- if (data_size < mRequestedSize || last_block == true)
+ if (data_size < mRequestedSize && mRequestedDiscard == 0)
{
mHaveAllData = TRUE;
}
else if (data_size > mRequestedSize)
{
- // *TODO: This will happen until we fix LLCurl::getByteRange()
-// llinfos << "HUH?" << llendl;
+ // *TODO: This shouldn't be happening any more
+ llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl;
mHaveAllData = TRUE;
- mFormattedImage->deleteData();
+ llassert_always(mDecodeHandle == 0);
+ mFormattedImage = NULL; // discard any previous data we had
mBufferSize = data_size;
}
}
@@ -1181,7 +1303,6 @@ void LLTextureFetchWorker::callbackHttpGet(U8* data, S32 data_size, bool last_bl
}
mLoaded = TRUE;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
-#endif
}
//////////////////////////////////////////////////////////////////////////////
@@ -1197,7 +1318,7 @@ void LLTextureFetchWorker::callbackCacheRead(bool success, LLImageFormatted* ima
}
if (success)
{
- llassert_always(imagesize > 0);
+ llassert_always(imagesize >= 0);
mFileSize = imagesize;
mFormattedImage = image;
mImageCodec = image->getCodec();
@@ -1225,65 +1346,40 @@ void LLTextureFetchWorker::callbackCacheWrite(bool success)
//////////////////////////////////////////////////////////////////////////////
-void LLTextureFetchWorker::callbackDecoded(bool success)
+void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
+ LLMutexLock lock(&mWorkMutex);
+ if (mDecodeHandle == 0)
+ {
+ return; // aborted, ignore
+ }
if (mState != DECODE_IMAGE_UPDATE)
{
// llwarns << "Decode callback for " << mID << " with state = " << mState << llendl;
+ mDecodeHandle = 0;
return;
}
-// llinfos << mID << " : DECODE COMPLETE " << llendl;
- setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-bool LLTextureFetchWorker::decodeImage()
-{
- if(!mImageWorker)
- {
- //LLTextureFetchWorker is aborted, skip image decoding.
- return true ;
- }
-
- bool res = true;
- if (mRawImage.isNull())
- {
- res = false;
- if (mImageWorker->requestDecodedData(mRawImage, -1))
- {
- res = true;
-// llinfos << mID << " : BASE DECODE FINISHED" << llendl;
- }
- }
- if (res &&
- (mRawImage.notNull() && mRawImage->getDataSize() > 0) &&
- (mNeedsAux && mAuxImage.isNull()))
+ llassert_always(mFormattedImage.notNull());
+
+ mDecodeHandle = 0;
+ if (success)
{
- res = false;
- if (mImageWorker->requestDecodedAuxData(mAuxImage, 4, -1))
- {
- res = true;
-// llinfos << mID << " : AUX DECODE FINISHED" << llendl;
- }
+ llassert_always(raw);
+ mRawImage = raw;
+ mAuxImage = aux;
+ mDecodedDiscard = mFormattedImage->getDiscardLevel();
+ LL_DEBUGS("Texture") << mID << ": Decode Finished. Discard: " << mDecodedDiscard
+ << " Raw Image: " << llformat("%dx%d",mRawImage->getWidth(),mRawImage->getHeight()) << LL_ENDL;
}
- if (res)
+ else
{
- if ((mRawImage.notNull() && mRawImage->getDataSize() > 0) &&
- (!mNeedsAux || (mAuxImage.notNull() && mAuxImage->getDataSize() > 0)))
- {
- mDecodedDiscard = mFormattedImage->getDiscardLevel();
-// llinfos << mID << " : DECODE FINISHED. DISCARD: " << mDecodedDiscard << llendl;
- }
- else
- {
-// llwarns << "DECODE FAILED: " << mID << " Discard: " << (S32)mFormattedImage->getDiscardLevel() << llendl;
- removeFromCache();
- }
- mImageWorker->scheduleDelete();
- mImageWorker = NULL;
+ llwarns << "DECODE FAILED: " << mID << " Discard: " << (S32)mFormattedImage->getDiscardLevel() << llendl;
+ removeFromCache();
+ mDecodedDiscard = -1; // Redundant, here for clarity and paranoia
}
- return res;
+ mDecoded = TRUE;
+// llinfos << mID << " : DECODE COMPLETE " << llendl;
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
}
//////////////////////////////////////////////////////////////////////////////
@@ -1314,15 +1410,21 @@ bool LLTextureFetchWorker::writeToCacheComplete()
//////////////////////////////////////////////////////////////////////////////
// public
-LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded)
+LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded)
: LLWorkerThread("TextureFetch", threaded),
mDebugCount(0),
mDebugPause(FALSE),
mPacketCount(0),
mBadPacketCount(0),
mQueueMutex(getAPRPool()),
- mTextureCache(cache)
+ mNetworkQueueMutex(getAPRPool()),
+ mTextureCache(cache),
+ mImageDecodeThread(imagedecodethread),
+ mTextureBandwidth(0),
+ mCurlGetRequest(NULL)
{
+ mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold"));
}
LLTextureFetch::~LLTextureFetch()
@@ -1330,13 +1432,7 @@ LLTextureFetch::~LLTextureFetch()
// ~LLQueuedThread() called here
}
-bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux)
-{
- return createRequest(LLStringUtil::null, id, host, priority, w, h, c, desired_discard, needs_aux);
-}
-
-bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id, const LLHost& host, F32 priority,
+bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux)
{
if (mDebugPause)
@@ -1344,12 +1440,9 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id
return false;
}
- LLTextureFetchWorker* worker = NULL;
- LLMutexLock lock(&mQueueMutex);
- map_t::iterator iter = mRequestMap.find(id);
- if (iter != mRequestMap.end())
+ LLTextureFetchWorker* worker = getWorker(id) ;
+ if (worker)
{
- worker = iter->second;
if (worker->mHost != host)
{
llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
@@ -1361,7 +1454,15 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id
}
S32 desired_size;
- if (desired_discard == 0)
+ std::string exten = gDirUtilp->getExtension(url);
+ if (!url.empty() && (!exten.empty() && LLImageBase::getCodecFromExtension(exten) != IMG_CODEC_J2C))
+ {
+ // Only do partial requests for J2C at the moment
+ //llinfos << "Merov : LLTextureFetch::createRequest(), blocking fetch on " << url << llendl;
+ desired_size = MAX_IMAGE_DATA_SIZE;
+ desired_discard = 0;
+ }
+ else if (desired_discard == 0)
{
// if we want the entire image, and we know its size, then get it all
// (calcDataSizeJ2C() below makes assumptions about how the image
@@ -1378,7 +1479,7 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id
}
else
{
- desired_size = FIRST_PACKET_SIZE;
+ desired_size = TEXTURE_CACHE_ENTRY_SIZE;
desired_discard = MAX_DISCARD_LEVEL;
}
@@ -1389,52 +1490,49 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id
{
return false; // need to wait for previous aborted request to complete
}
- worker->lockWorkData();
+ worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
worker->setImagePriority(priority);
worker->setDesiredDiscard(desired_discard, desired_size);
- worker->unlockWorkData();
if (!worker->haveWork())
{
worker->mState = LLTextureFetchWorker::INIT;
+ worker->unlockWorkMutex();
+
worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
}
- }
- else
- {
- if (filename.empty())
- {
- // do remote fetch
- worker = new LLTextureFetchWorker(this, id, host, priority, desired_discard, desired_size);
- }
else
{
- // do local file fetch
- worker = new LLTextureFetchLocalFileWorker(this, filename, id, host, priority, desired_discard, desired_size);
+ worker->unlockWorkMutex();
}
+ }
+ else
+ {
+ worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size);
+ lockQueue() ;
mRequestMap[id] = worker;
+ unlockQueue() ;
+
+ worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
+ worker->unlockWorkMutex();
}
- worker->mActiveCount++;
- worker->mNeedsAux = needs_aux;
+
// llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl;
return true;
}
-void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
-{
- LLMutexLock lock(&mQueueMutex);
- LLTextureFetchWorker* worker = getWorker(id);
- if (worker)
- {
- removeRequest(worker, cancel);
- }
-}
-
// protected
-
-// call lockQueue() first!
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
{
- if (mRequestMap.find(worker->mID) != mRequestMap.end())
+ lockQueue() ;
+ bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
+ unlockQueue() ;
+
+ LLMutexLock lock(&mNetworkQueueMutex);
+ if (in_request_map)
{
// only add to the queue if in the request map
// i.e. a delete has not been requested
@@ -1447,29 +1545,84 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
}
}
-// call lockQueue() first!
-void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker)
+void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel)
{
- mNetworkQueue.erase(worker->mID);
+ LLMutexLock lock(&mNetworkQueueMutex);
+ size_t erased = mNetworkQueue.erase(worker->mID);
+ if (cancel && erased > 0)
+ {
+ mCancelQueue[worker->mHost].insert(worker->mID);
+ }
+}
+
+// protected
+void LLTextureFetch::addToHTTPQueue(const LLUUID& id)
+{
+ LLMutexLock lock(&mNetworkQueueMutex);
+ mHTTPTextureQueue.insert(id);
+}
+
+void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id)
+{
+ LLMutexLock lock(&mNetworkQueueMutex);
+ mHTTPTextureQueue.erase(id);
+}
+
+void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
+{
+ lockQueue() ;
+ LLTextureFetchWorker* worker = getWorkerAfterLock(id);
+ if (worker)
+ {
+ size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
+ llassert_always(erased_1 > 0) ;
+
+ removeFromNetworkQueue(worker, cancel);
+ llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
+
+ worker->scheduleDelete();
+ }
+ else
+ {
+ unlockQueue() ;
+ }
}
-// call lockQueue() first!
void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
{
+ lockQueue() ;
size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
llassert_always(erased_1 > 0) ;
- size_t erased = mNetworkQueue.erase(worker->mID);
- if (cancel && erased > 0)
- {
- mCancelQueue[worker->mHost].insert(worker->mID);
- }
+ removeFromNetworkQueue(worker, cancel);
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
worker->scheduleDelete();
}
+S32 LLTextureFetch::getNumRequests()
+{
+ lockQueue() ;
+ S32 size = (S32)mRequestMap.size();
+ unlockQueue() ;
+
+ return size ;
+}
+
+S32 LLTextureFetch::getNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock() ;
+ S32 size = (S32)mHTTPTextureQueue.size();
+ mNetworkQueueMutex.unlock() ;
+
+ return size ;
+}
+
// call lockQueue() first!
-LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
LLTextureFetchWorker* res = NULL;
map_t::iterator iter = mRequestMap.find(id);
@@ -1480,12 +1633,18 @@ LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
return res;
}
+LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+{
+ LLMutexLock lock(&mQueueMutex) ;
+
+ return getWorkerAfterLock(id) ;
+}
+
bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -1504,24 +1663,27 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
}
else if (worker->checkWork())
{
+ worker->lockWorkMutex();
discard_level = worker->mDecodedDiscard;
- raw = worker->mRawImage; worker->mRawImage = NULL;
- aux = worker->mAuxImage; worker->mAuxImage = NULL;
+ raw = worker->mRawImage;
+ aux = worker->mAuxImage;
res = true;
+ LL_DEBUGS("Texture") << id << ": Request Finished. State: " << worker->mState << " Discard: " << discard_level << LL_ENDL;
+ worker->unlockWorkMutex();
}
else
{
- worker->lockWorkData();
+ worker->lockWorkMutex();
if ((worker->mDecodedDiscard >= 0) &&
(worker->mDecodedDiscard < discard_level || discard_level < 0) &&
(worker->mState >= LLTextureFetchWorker::WAIT_ON_WRITE))
{
// Not finished, but data is ready
discard_level = worker->mDecodedDiscard;
- if (worker->mRawImage) raw = worker->mRawImage;
- if (worker->mAuxImage) aux = worker->mAuxImage;
+ raw = worker->mRawImage;
+ aux = worker->mAuxImage;
}
- worker->unlockWorkData();
+ worker->unlockWorkMutex();
}
}
else
@@ -1534,13 +1696,12 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
- worker->lockWorkData();
+ worker->lockWorkMutex();
worker->setImagePriority(priority);
- worker->unlockWorkData();
+ worker->unlockWorkMutex();
res = true;
}
return res;
@@ -1548,40 +1709,114 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
//////////////////////////////////////////////////////////////////////////////
+// MAIN THREAD
//virtual
S32 LLTextureFetch::update(U32 max_time_ms)
{
S32 res;
+
+ mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+
res = LLWorkerThread::update(max_time_ms);
- const F32 REQUEST_TIME = 1.f;
-
- // Periodically, gather the list of textures that need data from the network
- // And send the requests out to the simulators
- if (mNetworkTimer.getElapsedTimeF32() >= REQUEST_TIME)
+ if (!mDebugPause)
{
- mNetworkTimer.reset();
sendRequestListToSimulators();
}
+
+ if (!mThreaded)
+ {
+ // Update Curl on same thread as mCurlGetRequest was constructed
+ S32 processed = mCurlGetRequest->process();
+ if (processed > 0)
+ {
+ lldebugs << "processed: " << processed << " messages." << llendl;
+ }
+ }
return res;
}
+// WORKER THREAD
+void LLTextureFetch::startThread()
+{
+ // Construct mCurlGetRequest from Worker Thread
+ mCurlGetRequest = new LLCurlRequest();
+}
+
+// WORKER THREAD
+void LLTextureFetch::endThread()
+{
+ // Destroy mCurlGetRequest from Worker Thread
+ delete mCurlGetRequest;
+ mCurlGetRequest = NULL;
+}
+
+// WORKER THREAD
+void LLTextureFetch::threadedUpdate()
+{
+ llassert_always(mCurlGetRequest);
+
+ // Limit update frequency
+ const F32 PROCESS_TIME = 0.05f;
+ static LLFrameTimer process_timer;
+ if (process_timer.getElapsedTimeF32() < PROCESS_TIME)
+ {
+ return;
+ }
+ process_timer.reset();
+
+ // Update Curl on same thread as mCurlGetRequest was constructed
+ S32 processed = mCurlGetRequest->process();
+ if (processed > 0)
+ {
+ lldebugs << "processed: " << processed << " messages." << llendl;
+ }
+
+#if 0
+ const F32 INFO_TIME = 1.0f;
+ static LLFrameTimer info_timer;
+ if (info_timer.getElapsedTimeF32() >= INFO_TIME)
+ {
+ S32 q = mCurlGetRequest->getQueued();
+ if (q > 0)
+ {
+ llinfos << "Queued gets: " << q << llendl;
+ info_timer.reset();
+ }
+ }
+#endif
+
+}
+
//////////////////////////////////////////////////////////////////////////////
void LLTextureFetch::sendRequestListToSimulators()
{
+ // All requests
+ const F32 REQUEST_DELTA_TIME = 0.10f; // 10 fps
+
+ // Sim requests
const S32 IMAGES_PER_REQUEST = 50;
- const F32 LAZY_FLUSH_TIMEOUT = 15.f; // 10.0f // temp
+ const F32 SIM_LAZY_FLUSH_TIMEOUT = 10.0f; // temp
const F32 MIN_REQUEST_TIME = 1.0f;
const F32 MIN_DELTA_PRIORITY = 1000.f;
- LLMutexLock lock(&mQueueMutex);
+ // Periodically, gather the list of textures that need data from the network
+ // And send the requests out to the simulators
+ static LLFrameTimer timer;
+ if (timer.getElapsedTimeF32() < REQUEST_DELTA_TIME)
+ {
+ return;
+ }
+ timer.reset();
// Send requests
typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
typedef std::map< LLHost, request_list_t > work_request_map_t;
work_request_map_t requests;
+ {
+ LLMutexLock lock2(&mNetworkQueueMutex);
for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); )
{
queue_t::iterator curiter = iter++;
@@ -1591,65 +1826,65 @@ void LLTextureFetch::sendRequestListToSimulators()
mNetworkQueue.erase(curiter);
continue; // paranoia
}
+ if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) &&
+ (req->mState != LLTextureFetchWorker::LOAD_FROM_SIMULATOR))
+ {
+ // We already received our URL, remove from the queue
+ llwarns << "Worker: " << req->mID << " in mNetworkQueue but in wrong state: " << req->mState << llendl;
+ mNetworkQueue.erase(curiter);
+ continue;
+ }
if (req->mID == mDebugID)
{
mDebugCount++; // for setting breakpoints
}
- if (req->mTotalPackets > 0 && req->mLastPacket >= req->mTotalPackets-1)
+ if (req->mSentRequest == LLTextureFetchWorker::SENT_SIM &&
+ req->mTotalPackets > 0 &&
+ req->mLastPacket >= req->mTotalPackets-1)
{
// We have all the packets... make sure this is high priority
// req->setPriority(LLWorkerThread::PRIORITY_HIGH | req->mWorkPriority);
continue;
}
F32 elapsed = req->mRequestedTimer.getElapsedTimeF32();
- F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority);
- if ((req->mSimRequestedDiscard != req->mDesiredDiscard) ||
- (delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) ||
- (elapsed >= LAZY_FLUSH_TIMEOUT))
{
- requests[req->mHost].insert(req);
+ F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority);
+ if ((req->mSimRequestedDiscard != req->mDesiredDiscard) ||
+ (delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) ||
+ (elapsed >= SIM_LAZY_FLUSH_TIMEOUT))
+ {
+ requests[req->mHost].insert(req);
+ }
}
}
-
- std::string http_url;
-#if 0
- if (gSavedSettings.getBOOL("ImagePipelineUseHTTP"))
- {
- LLViewerRegion* region = gAgent.getRegion();
- if (region)
- {
- http_url = region->getCapability("RequestTextureDownload");
- }
}
-#endif
-
+
for (work_request_map_t::iterator iter1 = requests.begin();
iter1 != requests.end(); ++iter1)
{
- bool use_http = http_url.empty() ? false : true;
LLHost host = iter1->first;
// invalid host = use agent host
if (host == LLHost::invalid)
{
host = gAgent.getRegionHost();
}
- else
- {
- use_http = false;
- }
- if (use_http)
+ S32 sim_request_count = 0;
+
+ for (request_list_t::iterator iter2 = iter1->second.begin();
+ iter2 != iter1->second.end(); ++iter2)
{
- }
- else
- {
- S32 request_count = 0;
- for (request_list_t::iterator iter2 = iter1->second.begin();
- iter2 != iter1->second.end(); ++iter2)
+ LLTextureFetchWorker* req = *iter2;
+ if (gMessageSystem)
{
- LLTextureFetchWorker* req = *iter2;
- req->mSentRequest = LLTextureFetchWorker::SENT_SIM;
- if (0 == request_count)
+ if (req->mSentRequest != LLTextureFetchWorker::SENT_SIM)
+ {
+ // Initialize packet data based on data read from cache
+ req->lockWorkMutex();
+ req->setupPacketData();
+ req->unlockWorkMutex();
+ }
+ if (0 == sim_request_count)
{
gMessageSystem->newMessageFast(_PREHASH_RequestImage);
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
@@ -1666,30 +1901,42 @@ void LLTextureFetch::sendRequestListToSimulators()
// llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard
// << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl;
- req->lockWorkData();
+ if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ {
+ mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime());
+ mTextureInfo.setRequestOffset(req->mID, 0);
+ mTextureInfo.setRequestSize(req->mID, 0);
+ mTextureInfo.setRequestType(req->mID, LLTextureInfoDetails::REQUEST_TYPE_UDP);
+ }
+
+ req->lockWorkMutex();
+ req->mSentRequest = LLTextureFetchWorker::SENT_SIM;
req->mSimRequestedDiscard = req->mDesiredDiscard;
req->mRequestedPriority = req->mImagePriority;
req->mRequestedTimer.reset();
- req->unlockWorkData();
- request_count++;
- if (request_count >= IMAGES_PER_REQUEST)
+ req->unlockWorkMutex();
+ sim_request_count++;
+ if (sim_request_count >= IMAGES_PER_REQUEST)
{
-// llinfos << "REQUESTING " << request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl;
+// llinfos << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl;
+
gMessageSystem->sendSemiReliable(host, NULL, NULL);
- request_count = 0;
+ sim_request_count = 0;
}
}
- if (request_count > 0 && request_count < IMAGES_PER_REQUEST)
- {
-// llinfos << "REQUESTING " << request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl;
- gMessageSystem->sendSemiReliable(host, NULL, NULL);
- request_count = 0;
- }
+ }
+ if (gMessageSystem && sim_request_count > 0 && sim_request_count < IMAGES_PER_REQUEST)
+ {
+// llinfos << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl;
+ gMessageSystem->sendSemiReliable(host, NULL, NULL);
+ sim_request_count = 0;
}
}
// Send cancelations
- if (!mCancelQueue.empty())
+ {
+ LLMutexLock lock2(&mNetworkQueueMutex);
+ if (gMessageSystem && !mCancelQueue.empty())
{
for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
iter1 != mCancelQueue.end(); ++iter1)
@@ -1732,6 +1979,7 @@ void LLTextureFetch::sendRequestListToSimulators()
}
mCancelQueue.clear();
}
+ }
}
//////////////////////////////////////////////////////////////////////////////
@@ -1771,7 +2019,6 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -1804,11 +2051,13 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
- worker->lockWorkData();
+ worker->lockWorkMutex();
// Copy header data into image object
worker->mImageCodec = codec;
@@ -1819,13 +2068,12 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
res = worker->insertPacket(0, data, data_size);
worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
worker->mState = LLTextureFetchWorker::LOAD_FROM_SIMULATOR;
- worker->unlockWorkData();
+ worker->unlockWorkMutex();
return res;
}
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -1849,11 +2097,13 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
- worker->lockWorkData();
+ worker->lockWorkMutex();
res = worker->insertPacket(packet_num, data, data_size);
@@ -1866,12 +2116,20 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
else
{
// llwarns << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id
-// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl;
- removeFromNetworkQueue(worker); // failsafe
- mCancelQueue[host].insert(id);
+// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl;
+ removeFromNetworkQueue(worker, true); // failsafe
}
-
- worker->unlockWorkData();
+
+ if(packet_num >= (worker->mTotalPackets - 1))
+ {
+ if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ {
+ U64 timeNow = LLTimer::getTotalTime();
+ mTextureInfo.setRequestSize(id, worker->mFileSize);
+ mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow);
+ }
+ }
+ worker->unlockWorkMutex();
return res;
}
@@ -1881,13 +2139,12 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
{
BOOL from_cache = FALSE ;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
- worker->lockWorkData();
+ worker->lockWorkMutex() ;
from_cache = worker->mInLocalCache ;
- worker->unlockWorkData();
+ worker->unlockWorkMutex() ;
}
return from_cache ;
@@ -1903,11 +2160,10 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
F32 request_dtime = 999999.f;
U32 fetch_priority = 0;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker && worker->haveWork())
{
- worker->lockWorkData();
+ worker->lockWorkMutex();
state = worker->mState;
fetch_dtime = worker->mFetchTimer.getElapsedTimeF32();
request_dtime = worker->mRequestedTimer.getElapsedTimeF32();
@@ -1924,7 +2180,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
data_progress = (F32)worker->mFormattedImage->getDataSize() / (F32)worker->mFileSize;
}
}
- if (state >= LLTextureFetchWorker::LOAD_FROM_NETWORK && state <= LLTextureFetchWorker::LOAD_FROM_HTTP_GET_DATA)
+ if (state >= LLTextureFetchWorker::LOAD_FROM_NETWORK && state <= LLTextureFetchWorker::WAIT_HTTP_REQ)
{
requested_priority = worker->mRequestedPriority;
}
@@ -1933,7 +2189,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
requested_priority = worker->mImagePriority;
}
fetch_priority = worker->getPriority();
- worker->unlockWorkData();
+ worker->unlockWorkMutex();
}
data_progress_p = data_progress;
requested_priority_p = requested_priority;
@@ -1959,5 +2215,3 @@ void LLTextureFetch::dump()
}
}
-
-//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 97719a9468..5213c4f488 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -37,26 +37,29 @@
#include "llimage.h"
#include "lluuid.h"
#include "llworkerthread.h"
+#include "llcurl.h"
+#include "lltextureinfo.h"
class LLViewerTexture;
class LLTextureFetchWorker;
+class HTTPGetResponder;
class LLTextureCache;
+class LLImageDecodeThread;
class LLHost;
// Interface class
class LLTextureFetch : public LLWorkerThread
{
friend class LLTextureFetchWorker;
+ friend class HTTPGetResponder;
public:
- LLTextureFetch(LLTextureCache* cache, bool threaded);
+ LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded);
~LLTextureFetch();
/*virtual*/ S32 update(U32 max_time_ms);
- bool createRequest(const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 discard, bool needs_aux);
- bool createRequest(const std::string& filename, const LLUUID& id, const LLHost& host, F32 priority,
+ bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
S32 w, S32 h, S32 c, S32 discard, bool needs_aux);
void deleteRequest(const LLUUID& id, bool cancel);
bool getRequestFinished(const LLUUID& id, S32& discard_level,
@@ -66,25 +69,40 @@ public:
bool receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data);
bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data);
+ void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; }
+ F32 getTextureBandwidth() { return mTextureBandwidth; }
+
// Debug
BOOL isFromLocalCache(const LLUUID& id);
S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p,
U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p);
void dump();
- S32 getNumRequests() { return mRequestMap.size(); }
+ S32 getNumRequests() ;
+ S32 getNumHTTPRequests() ;
// Public for access by callbacks
void lockQueue() { mQueueMutex.lock(); }
void unlockQueue() { mQueueMutex.unlock(); }
LLTextureFetchWorker* getWorker(const LLUUID& id);
+ LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id);
+
+ LLTextureInfo* getTextureInfo() { return &mTextureInfo; }
protected:
void addToNetworkQueue(LLTextureFetchWorker* worker);
- void removeFromNetworkQueue(LLTextureFetchWorker* worker);
+ void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
+ void addToHTTPQueue(const LLUUID& id);
+ void removeFromHTTPQueue(const LLUUID& id);
+ S32 getHTTPQueueSize() { return getNumHTTPRequests(); }
void removeRequest(LLTextureFetchWorker* worker, bool cancel);
+ // Called from worker thread (during doWork)
+ void processCurlRequests();
private:
void sendRequestListToSimulators();
+ /*virtual*/ void startThread(void);
+ /*virtual*/ void endThread(void);
+ /*virtual*/ void threadedUpdate(void);
public:
LLUUID mDebugID;
@@ -94,9 +112,12 @@ public:
S32 mBadPacketCount;
private:
- LLMutex mQueueMutex;
+ LLMutex mQueueMutex; //to protect mRequestMap only
+ LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
LLTextureCache* mTextureCache;
+ LLImageDecodeThread* mImageDecodeThread;
+ LLCurlRequest* mCurlGetRequest;
// Map of all requests by UUID
typedef std::map<LLUUID,LLTextureFetchWorker*> map_t;
@@ -105,10 +126,13 @@ private:
// Set of requests that require network data
typedef std::set<LLUUID> queue_t;
queue_t mNetworkQueue;
+ queue_t mHTTPTextureQueue;
typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t;
cancel_queue_t mCancelQueue;
-
- LLFrameTimer mNetworkTimer;
+ F32 mTextureBandwidth;
+ F32 mMaxBandwidth;
+ LLTextureInfo mTextureInfo;
};
#endif // LL_LLTEXTUREFETCH_H
+
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
new file mode 100644
index 0000000000..672a36a8bd
--- /dev/null
+++ b/indra/newview/lltextureinfo.cpp
@@ -0,0 +1,290 @@
+/**
+ * @file lltextureinfo.cpp
+ * @brief Object which handles local texture info
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltextureinfo.h"
+#include "lltexturestats.h"
+#include "llviewercontrol.h"
+
+LLTextureInfo::LLTextureInfo() :
+ mLogTextureDownloadsToViewerLog(false),
+ mLogTextureDownloadsToSimulator(false),
+ mTotalBytes(0),
+ mTotalMilliseconds(0),
+ mTextureDownloadsStarted(0),
+ mTextureDownloadsCompleted(0),
+ mTextureDownloadProtocol("NONE"),
+ mTextureLogThreshold(100 * 1024),
+ mCurrentStatsBundleStartTime(0)
+{
+ mTextures.clear();
+}
+
+void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32 textureLogThreshold)
+{
+ mLogTextureDownloadsToViewerLog = writeToViewerLog;
+ mLogTextureDownloadsToSimulator = sendToSim;
+ mTextureLogThreshold = textureLogThreshold;
+}
+
+LLTextureInfo::~LLTextureInfo()
+{
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator;
+ for (iterator = mTextures.begin(); iterator != mTextures.end(); iterator++)
+ {
+ LLTextureInfoDetails *info = (*iterator).second;
+ delete info;
+ }
+
+ mTextures.clear();
+}
+
+void LLTextureInfo::addRequest(const LLUUID& id)
+{
+ LLTextureInfoDetails *info = new LLTextureInfoDetails();
+ mTextures[id] = info;
+}
+
+U32 LLTextureInfo::getTextureInfoMapSize()
+{
+ return mTextures.size();
+}
+
+bool LLTextureInfo::has(const LLUUID& id)
+{
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ if (iterator == mTextures.end())
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime)
+{
+ if (!has(id))
+ {
+ addRequest(id);
+ }
+ mTextures[id]->mStartTime = startTime;
+ mTextureDownloadsStarted++;
+}
+
+void LLTextureInfo::setRequestSize(const LLUUID& id, U32 size)
+{
+ if (!has(id))
+ {
+ addRequest(id);
+ }
+ mTextures[id]->mSize = size;
+}
+
+void LLTextureInfo::setRequestOffset(const LLUUID& id, U32 offset)
+{
+ if (!has(id))
+ {
+ addRequest(id);
+ }
+ mTextures[id]->mOffset = offset;
+}
+
+void LLTextureInfo::setRequestType(const LLUUID& id, LLTextureInfoDetails::LLRequestType type)
+{
+ if (!has(id))
+ {
+ addRequest(id);
+ }
+ mTextures[id]->mType = type;
+}
+
+void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64 completeTime)
+{
+ if (!has(id))
+ {
+ addRequest(id);
+ }
+ mTextures[id]->mCompleteTime = completeTime;
+
+ std::string protocol = "NONE";
+ switch(mTextures[id]->mType)
+ {
+ case LLTextureInfoDetails::REQUEST_TYPE_HTTP:
+ protocol = "HTTP";
+ break;
+
+ case LLTextureInfoDetails::REQUEST_TYPE_UDP:
+ protocol = "UDP";
+ break;
+
+ case LLTextureInfoDetails::REQUEST_TYPE_NONE:
+ default:
+ break;
+ }
+
+ if (mLogTextureDownloadsToViewerLog)
+ {
+ llinfos << "texture=" << id
+ << " start=" << mTextures[id]->mStartTime
+ << " end=" << mTextures[id]->mCompleteTime
+ << " size=" << mTextures[id]->mSize
+ << " offset=" << mTextures[id]->mOffset
+ << " length_in_ms=" << (mTextures[id]->mCompleteTime - mTextures[id]->mStartTime) / 1000
+ << " protocol=" << protocol
+ << llendl;
+ }
+
+ if(mLogTextureDownloadsToSimulator)
+ {
+ S32 texture_stats_upload_threshold = mTextureLogThreshold;
+ mTotalBytes += mTextures[id]->mSize;
+ mTotalMilliseconds += mTextures[id]->mCompleteTime - mTextures[id]->mStartTime;
+ mTextureDownloadsCompleted++;
+ mTextureDownloadProtocol = protocol;
+ if (mTotalBytes >= texture_stats_upload_threshold)
+ {
+ LLSD texture_data;
+ std::stringstream startTime;
+ startTime << mCurrentStatsBundleStartTime;
+ texture_data["start_time"] = startTime.str();
+ std::stringstream endTime;
+ endTime << completeTime;
+ texture_data["end_time"] = endTime.str();
+ texture_data["averages"] = getAverages();
+ send_texture_stats_to_sim(texture_data);
+ resetTextureStatistics();
+ }
+ }
+
+ mTextures.erase(id);
+}
+
+LLSD LLTextureInfo::getAverages()
+{
+ LLSD averagedTextureData;
+ S32 averageDownloadRate;
+ if(mTotalMilliseconds == 0)
+ {
+ averageDownloadRate = 0;
+ }
+ else
+ {
+ averageDownloadRate = (mTotalBytes * 8) / mTotalMilliseconds;
+ }
+
+ averagedTextureData["bits_per_second"] = averageDownloadRate;
+ averagedTextureData["bytes_downloaded"] = mTotalBytes;
+ averagedTextureData["texture_downloads_started"] = mTextureDownloadsStarted;
+ averagedTextureData["texture_downloads_completed"] = mTextureDownloadsCompleted;
+ averagedTextureData["transport"] = mTextureDownloadProtocol;
+
+ return averagedTextureData;
+}
+
+void LLTextureInfo::resetTextureStatistics()
+{
+ mTotalMilliseconds = 0;
+ mTotalBytes = 0;
+ mTextureDownloadsStarted = 0;
+ mTextureDownloadsCompleted = 0;
+ mTextureDownloadProtocol = "NONE";
+ mCurrentStatsBundleStartTime = LLTimer::getTotalTime();
+}
+
+U32 LLTextureInfo::getRequestStartTime(const LLUUID& id)
+{
+ if (!has(id))
+ {
+ return 0;
+ }
+ else
+ {
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ return (*iterator).second->mStartTime;
+ }
+}
+
+U32 LLTextureInfo::getRequestSize(const LLUUID& id)
+{
+ if (!has(id))
+ {
+ return 0;
+ }
+ else
+ {
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ return (*iterator).second->mSize;
+ }
+}
+
+U32 LLTextureInfo::getRequestOffset(const LLUUID& id)
+{
+ if (!has(id))
+ {
+ return 0;
+ }
+ else
+ {
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ return (*iterator).second->mOffset;
+ }
+}
+
+LLTextureInfoDetails::LLRequestType LLTextureInfo::getRequestType(const LLUUID& id)
+{
+ if (!has(id))
+ {
+ return LLTextureInfoDetails::REQUEST_TYPE_NONE;
+ }
+ else
+ {
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ return (*iterator).second->mType;
+ }
+}
+
+U32 LLTextureInfo::getRequestCompleteTime(const LLUUID& id)
+{
+ if (!has(id))
+ {
+ return 0;
+ }
+ else
+ {
+ std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
+ return (*iterator).second->mCompleteTime;
+ }
+}
+
diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h
new file mode 100644
index 0000000000..71b0ea431f
--- /dev/null
+++ b/indra/newview/lltextureinfo.h
@@ -0,0 +1,80 @@
+/**
+ * @file lltextureinfo.h
+ * @brief Object for managing texture information.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTUREINFO_H
+#define LL_LLTEXTUREINFO_H
+
+#include "lluuid.h"
+#include "lltextureinfodetails.h"
+#include <map>
+
+class LLTextureInfo
+{
+public:
+ LLTextureInfo();
+ ~LLTextureInfo();
+
+ void setUpLogging(bool writeToViewerLog, bool sendToSim, U32 textureLogThreshold);
+ bool has(const LLUUID& id);
+ void setRequestStartTime(const LLUUID& id, U64 startTime);
+ void setRequestSize(const LLUUID& id, U32 size);
+ void setRequestOffset(const LLUUID& id, U32 offset);
+ void setRequestType(const LLUUID& id, LLTextureInfoDetails::LLRequestType type);
+ void setRequestCompleteTimeAndLog(const LLUUID& id, U64 completeTime);
+ U32 getRequestStartTime(const LLUUID& id);
+ U32 getRequestSize(const LLUUID& id);
+ U32 getRequestOffset(const LLUUID& id);
+ LLTextureInfoDetails::LLRequestType getRequestType(const LLUUID& id);
+ U32 getRequestCompleteTime(const LLUUID& id);
+ void resetTextureStatistics();
+ U32 getTextureInfoMapSize();
+ LLSD getAverages();
+
+private:
+ void addRequest(const LLUUID& id);
+
+ std::map<LLUUID, LLTextureInfoDetails *> mTextures;
+
+ LLSD mAverages;
+
+ bool mLogTextureDownloadsToViewerLog;
+ bool mLogTextureDownloadsToSimulator;
+ S32 mTotalBytes;
+ S32 mTotalMilliseconds;
+ S32 mTextureDownloadsStarted;
+ S32 mTextureDownloadsCompleted;
+ std::string mTextureDownloadProtocol;
+ U32 mTextureLogThreshold; // in bytes
+ U64 mCurrentStatsBundleStartTime;
+};
+
+#endif // LL_LLTEXTUREINFO_H
diff --git a/indra/newview/lltextureinfodetails.cpp b/indra/newview/lltextureinfodetails.cpp
new file mode 100644
index 0000000000..f6ef47a2ee
--- /dev/null
+++ b/indra/newview/lltextureinfodetails.cpp
@@ -0,0 +1,40 @@
+/**
+ * @file lltextureinfodetails.cpp
+ * @brief Object which handles details of any individual texture
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltextureinfodetails.h"
+
+LLTextureInfoDetails::LLTextureInfoDetails() : mStartTime(0), mCompleteTime(0), mSize(0), mType(REQUEST_TYPE_NONE), mOffset(0)
+{
+}
+
diff --git a/indra/newview/lltextureinfodetails.h b/indra/newview/lltextureinfodetails.h
new file mode 100644
index 0000000000..091fa01a3d
--- /dev/null
+++ b/indra/newview/lltextureinfodetails.h
@@ -0,0 +1,58 @@
+/**
+ * @file lltextureinfo.h
+ * @brief Object for managing texture information.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTUREINFODETAILS_H
+#define LL_LLTEXTUREINFODETAILS_H
+
+#include "lluuid.h"
+
+class LLTextureInfoDetails
+{
+public:
+ enum LLRequestType
+ {
+ REQUEST_TYPE_NONE,
+ REQUEST_TYPE_HTTP,
+ REQUEST_TYPE_UDP
+ };
+
+ U32 mStartTime;
+ U32 mCompleteTime;
+ U32 mOffset;
+ U32 mSize;
+ LLRequestType mType;
+
+ LLTextureInfoDetails();
+};
+
+#endif // LL_LLTEXTUREINFODETAILS_H
+
diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp
new file mode 100644
index 0000000000..c91bfd4df2
--- /dev/null
+++ b/indra/newview/lltexturestats.cpp
@@ -0,0 +1,61 @@
+/**
+ * @file lltexturerstats.cpp
+ * @brief texture stats helper methods
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "pipeline.h"
+#include "llagent.h"
+#include "lltexturefetch.h"
+#include "lltexturestats.h"
+#include "lltexturestatsuploader.h"
+#include "llviewerregion.h"
+
+void send_texture_stats_to_sim(const LLSD &texture_stats)
+{
+ LLSD texture_stats_report;
+ // Only send stats if the agent is connected to a region.
+ if (!gAgent.getRegion() || gNoRender)
+ {
+ return;
+ }
+
+ LLUUID agent_id = gAgent.getID();
+ texture_stats_report["agent_id"] = agent_id;
+ texture_stats_report["region_id"] = gAgent.getRegion()->getRegionID();
+ texture_stats_report["stats_data"] = texture_stats;
+
+ std::string texture_cap_url = gAgent.getRegion()->getCapability("TextureStats");
+ LLTextureStatsUploader tsu;
+ llinfos << "uploading texture stats data to simulator" << llendl;
+ tsu.uploadStatsToSimulator(texture_cap_url, texture_stats);
+}
+
diff --git a/indra/newview/lltexturestats.h b/indra/newview/lltexturestats.h
new file mode 100644
index 0000000000..2deb377dfd
--- /dev/null
+++ b/indra/newview/lltexturestats.h
@@ -0,0 +1,41 @@
+/**
+ * @file lltexturestats.h
+ * @brief texture stats utilities
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTURESTATS_H
+#define LL_LLTEXTURESTATS_H
+
+#include "llappviewer.h"
+
+// utility functions to capture data on texture download speeds and send to simulator periodically
+void send_texture_stats_to_sim(const LLSD &texture_stats);
+
+#endif // LL_LLTEXTURESTATS_H
diff --git a/indra/newview/lltexturestatsuploader.cpp b/indra/newview/lltexturestatsuploader.cpp
new file mode 100644
index 0000000000..1df73db9b0
--- /dev/null
+++ b/indra/newview/lltexturestatsuploader.cpp
@@ -0,0 +1,61 @@
+/**
+ * @file lltexturerstats.cpp
+ * @brief texture stats upload class
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltexturestatsuploader.h"
+
+#include "llhttpclient.h"
+
+LLTextureStatsUploader::LLTextureStatsUploader()
+{
+}
+
+LLTextureStatsUploader::~LLTextureStatsUploader()
+{
+}
+
+void LLTextureStatsUploader::uploadStatsToSimulator(const std::string texture_cap_url, const LLSD &texture_stats)
+{
+ if ( texture_cap_url != "" )
+ {
+ LLHTTPClient::post(texture_cap_url, texture_stats, NULL);
+ }
+ else
+ {
+ llinfos << "Not sending texture stats: "
+ << texture_stats
+ << " as there is no cap url."
+ << llendl;
+ }
+}
+
diff --git a/indra/newview/lltexturestatsuploader.h b/indra/newview/lltexturestatsuploader.h
new file mode 100644
index 0000000000..f6cc8be8fe
--- /dev/null
+++ b/indra/newview/lltexturestatsuploader.h
@@ -0,0 +1,48 @@
+/**
+ * @file lltexturestatsuploader.h
+ * @brief Class to send the texture stats to the simulatore
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTURESTATSUPLOADER_H
+#define LL_LLTEXTURESTATSUPLOADER_H
+
+#include "llappviewer.h"
+
+// utility functions to capture data on texture download speeds and send to simulator periodically
+
+class LLTextureStatsUploader
+{
+public:
+ LLTextureStatsUploader();
+ ~LLTextureStatsUploader();
+ void uploadStatsToSimulator(const std::string texture_cap_url, const LLSD &texture_stats);
+};
+
+#endif // LL_LLTEXTURESTATSUPLOADER_H
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index ea675c5a6e..98731f90f4 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -44,19 +44,21 @@
#include "llrender.h"
#include "lltooltip.h"
+#include "llappviewer.h"
#include "llselectmgr.h"
#include "lltexlayer.h"
#include "lltexturecache.h"
#include "lltexturefetch.h"
+#include "llviewercontrol.h"
#include "llviewerobject.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
-#include "llappviewer.h"
-
+#include "llvovolume.h"
extern F32 texmem_lower_bound_scale;
LLTextureView *gTextureView = NULL;
LLTextureSizeView *gTextureSizeView = NULL;
+LLTextureSizeView *gTextureCategoryView = NULL;
//static
std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages;
@@ -168,7 +170,7 @@ void LLTextureBar::draw()
{
color = LLColor4::green4;
}
- else if (mImagep->getBoostLevel())
+ else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE)
{
color = LLColor4::magenta;
}
@@ -230,10 +232,10 @@ void LLTextureBar::draw()
{ "DSK", LLColor4::blue }, // CACHE_POST
{ "NET", LLColor4::green }, // LOAD_FROM_NETWORK
{ "SIM", LLColor4::green }, // LOAD_FROM_SIMULATOR
- { "URL", LLColor4::green2 },// LOAD_FROM_HTTP_GET_URL
- { "HTP", LLColor4::green }, // LOAD_FROM_HTTP_GET_DATA
+ { "REQ", LLColor4::yellow },// SEND_HTTP_REQ
+ { "HTP", LLColor4::green }, // WAIT_HTTP_REQ
{ "DEC", LLColor4::yellow },// DECODE_IMAGE
- { "DEC", LLColor4::yellow },// DECODE_IMAGE_UPDATE
+ { "DEC", LLColor4::green }, // DECODE_IMAGE_UPDATE
{ "WRT", LLColor4::purple },// WRITE_TO_CACHE
{ "WRT", LLColor4::orange },// WAIT_ON_WRITE
{ "END", LLColor4::red }, // DONE
@@ -261,7 +263,7 @@ void LLTextureBar::draw()
// Draw the progress bar.
S32 bar_width = 100;
- S32 bar_left = 280;
+ S32 bar_left = 260;
left = bar_left;
right = left + bar_width;
@@ -286,30 +288,31 @@ void LLTextureBar::draw()
S32 pip_x = title_x3 + pip_space/2;
// Draw the packet pip
+ const F32 pip_max_time = 5.f;
F32 last_event = mImagep->mLastPacketTimer.getElapsedTimeF32();
- if (last_event < 1.f)
+ if (last_event < pip_max_time)
{
clr = LLColor4::white;
}
else
{
last_event = mImagep->mRequestDeltaTime;
- if (last_event < 1.f)
+ if (last_event < pip_max_time)
{
clr = LLColor4::green;
}
else
{
last_event = mImagep->mFetchDeltaTime;
- if (last_event < 1.f)
+ if (last_event < pip_max_time)
{
clr = LLColor4::yellow;
}
}
}
- if (last_event < 1.f)
+ if (last_event < pip_max_time)
{
- clr.setAlpha(1.f - last_event);
+ clr.setAlpha(1.f - last_event/pip_max_time);
gGL.color4fv(clr.mV);
gl_rect_2d(pip_x, top, pip_x + pip_width, bottom);
}
@@ -406,121 +409,146 @@ void LLGLTexMemBar::draw()
S32 total_mem = BYTES_TO_MEGA_BYTES(LLViewerTexture::sTotalTextureMemoryInBytes);
S32 max_total_mem = LLViewerTexture::sMaxTotalTextureMemInMegaBytes;
F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;
+ F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;
+ F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ;
S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
- S32 h_offset = (S32)((texture_bar_height + 2.5f) * mTextureView->mNumTextureBars + 2.5f);
+ S32 v_offset = (S32)((texture_bar_height + 2.5f) * mTextureView->mNumTextureBars + 2.5f);
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
- F32 text_color[] = {1.f, 1.f, 1.f, 0.75f};
+ LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
+ LLColor4 color;
std::string text;
- text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Discard Bias: %.2f",
+ text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
total_mem,
max_total_mem,
bound_mem,
max_bound_mem,
- discard_bias);
+ LLImageRaw::sGlobalRawMemory >> 20, discard_bias,
+ cache_usage, cache_max_usage);
+ //, cache_entries, cache_max_entries
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*3,
- text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
//----------------------------------------------------------------------------
- S32 bar_left = 380;
+#if 0
+ S32 bar_left = 400;
S32 bar_width = 200;
- S32 top = line_height*3 - 2 + h_offset;
+ S32 top = line_height*3 - 2 + v_offset;
S32 bottom = top - 6;
S32 left = bar_left;
S32 right = left + bar_width;
-
- F32 bar_scale = (F32)bar_width / (max_bound_mem * 1.5f);
+ F32 bar_scale;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f);
- gl_rect_2d(left, top, right, bottom);
-
+ // GL Mem Bar
+
left = bar_left;
- right = left + llfloor(bound_mem * bar_scale);
- if (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale))
- {
- gGL.color4f(0.f, 1.f, 0.f, 0.75f);
- }
- else if (bound_mem < max_bound_mem)
- {
- gGL.color4f(1.f, 1.f, 0.f, 0.75f);
- }
- else
- {
- gGL.color4f(1.f, 0.f, 0.f, 0.75f);
- }
+ text = "GL";
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*3,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ left = bar_left+20;
+ right = left + bar_width;
+
+ gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f); // grey
gl_rect_2d(left, top, right, bottom);
bar_scale = (F32)bar_width / (max_total_mem * 1.5f);
+ right = left + llfloor(total_mem * bar_scale);
+ right = llclamp(right, bar_left, bar_left + bar_width);
- top = bottom - 2;
- bottom = top - 6;
+ color = (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale)) ? LLColor4::green :
+ (total_mem < max_total_mem) ? LLColor4::yellow : LLColor4::red;
+ color[VALPHA] = .75f;
+ glColor4fv(color.mV);
+
+ gl_rect_2d(left, top, right, bottom); // red/yellow/green
+
+ //
+ bar_left += bar_width + bar_space;
+ //top = bottom - 2; bottom = top - 6;
+
+ // Bound Mem Bar
+
left = bar_left;
- right = left + llfloor(total_mem * bar_scale);
- if (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale))
- {
- gGL.color4f(0.f, 1.f, 0.f, 0.75f);
- }
- else if (total_mem < max_total_mem)
- {
- gGL.color4f(1.f, 1.f, 0.f, 0.75f);
- }
- else
- {
- gGL.color4f(1.f, 0.f, 0.f, 0.75f);
- }
+ text = "GL";
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*3,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ left = bar_left + 20;
+ right = left + bar_width;
+
+ gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f);
gl_rect_2d(left, top, right, bottom);
+ color = (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale)) ? LLColor4::green :
+ (bound_mem < max_bound_mem) ? LLColor4::yellow : LLColor4::red;
+ color[VALPHA] = .75f;
+ glColor4fv(color.mV);
+
+ gl_rect_2d(left, top, right, bottom);
+#else
+ S32 left = 0 ;
+#endif
//----------------------------------------------------------------------------
- text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d mRaw:%d mAux:%d CB:%d",
+ text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d RAW:%d HTP:%d DEC:%d CRE:%d",
gTextureList.getNumImages(),
LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
LLLFSThread::sLocal->getPending(),
- LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(),
- LLImageRaw::sRawImageCount, LLViewerFetchedTexture::sRawCount, LLViewerFetchedTexture::sAuxCount,
- gTextureList.mCallbackList.size());
+ LLImageRaw::sRawImageCount,
+ LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
+ LLAppViewer::getImageDecodeThread()->getPending(),
+ gTextureList.mCreateTextureList.size());
- LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*2,
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*2,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+
+ left = 550;
+ F32 bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth();
+ F32 max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
+ color[VALPHA] = text_color[VALPHA];
+ text = llformat("BW:%.0f/%.0f",bandwidth, max_bandwidth);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, v_offset + line_height*2,
+ color, LLFontGL::LEFT, LLFontGL::TOP);
S32 dx1 = 0;
if (LLAppViewer::getTextureFetch()->mDebugPause)
{
- LLFontGL::getFontMonospace()->renderUTF8(std::string("!"), 0, title_x1, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(std::string("!"), 0, title_x1, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
dx1 += 8;
}
if (mTextureView->mFreezeView)
{
- LLFontGL::getFontMonospace()->renderUTF8(std::string("*"), 0, title_x1, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(std::string("*"), 0, title_x1, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
dx1 += 8;
}
if (mTextureView->mOrderFetch)
{
- LLFontGL::getFontMonospace()->renderUTF8(title_string1b, 0, title_x1+dx1, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(title_string1b, 0, title_x1+dx1, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
}
else
{
- LLFontGL::getFontMonospace()->renderUTF8(title_string1a, 0, title_x1+dx1, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(title_string1a, 0, title_x1+dx1, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
}
- LLFontGL::getFontMonospace()->renderUTF8(title_string2, 0, title_x2, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(title_string2, 0, title_x2, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
- LLFontGL::getFontMonospace()->renderUTF8(title_string3, 0, title_x3, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(title_string3, 0, title_x3, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
- LLFontGL::getFontMonospace()->renderUTF8(title_string4, 0, title_x4, h_offset + line_height,
+ LLFontGL::getFontMonospace()->renderUTF8(title_string4, 0, title_x4, v_offset + line_height,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
}
@@ -555,7 +583,7 @@ public:
void setTop(S32 loaded, S32 bound, F32 scale) {mTopLoaded = loaded ; mTopBound = bound; mScale = scale ;}
void draw();
- BOOL handleHover(S32 x, S32 y, MASK mask) ;
+ BOOL handleHover(S32 x, S32 y, MASK mask, BOOL set_pick_size) ;
private:
S32 mIndex ;
@@ -568,19 +596,16 @@ private:
F32 mScale ;
};
-BOOL LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask)
+BOOL LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask, BOOL set_pick_size)
{
-#if !LL_RELEASE_FOR_DOWNLOAD
if(y > mBottom && (y < mBottom + (S32)(mTopLoaded * mScale) || y < mBottom + (S32)(mTopBound * mScale)))
{
- LLImageGL::setCurTexSizebar(mIndex);
+ LLImageGL::setCurTexSizebar(mIndex, set_pick_size);
}
-#endif
return TRUE ;
}
void LLGLTexSizeBar::draw()
{
-#if !LL_RELEASE_FOR_DOWNLOAD
LLGLSUIDefault gls_ui;
if(LLImageGL::sCurTexSizeBar == mIndex)
@@ -601,7 +626,6 @@ void LLGLTexSizeBar::draw()
F32 bound_color[] = {1.0f, 1.0f, 0.0f, 0.75f};
gl_rect_2d(mLeft, mBottom + (S32)(mTopLoaded * mScale), (mLeft + mRight) / 2, mBottom, loaded_color) ;
gl_rect_2d((mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale), mRight, mBottom, bound_color) ;
-#endif
}
////////////////////////////////////////////////////////////////////////////
@@ -675,7 +699,13 @@ void LLTextureView::draw()
<< "\t" << cur_discard
<< llendl;
}
-
+
+ if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID)
+ {
+ static S32 debug_count = 0;
+ ++debug_count; // for breakpoints
+ }
+
#if 0
if (imagep->getDontDiscard())
{
@@ -889,8 +919,7 @@ BOOL LLTextureView::handleKey(KEY key, MASK mask, BOOL called_from_parent)
}
//-----------------------------------------------------------------
-LLTextureSizeView::LLTextureSizeView(const LLTextureSizeView::Params& p)
- : LLView(p)
+LLTextureSizeView::LLTextureSizeView(const LLTextureSizeView::Params& p) : LLContainerView(p)
{
setVisible(FALSE) ;
@@ -910,7 +939,31 @@ LLTextureSizeView::~LLTextureSizeView()
}
void LLTextureSizeView::draw()
{
-#if !LL_RELEASE_FOR_DOWNLOAD
+ if(mType == TEXTURE_MEM_OVER_SIZE)
+ {
+ drawTextureSizeGraph();
+ }
+ else
+ {
+ drawTextureCategoryGraph() ;
+ }
+
+ LLView::draw();
+}
+
+BOOL LLTextureSizeView::handleHover(S32 x, S32 y, MASK mask)
+{
+ if(x > mTextureSizeBarRect.mLeft && x < mTextureSizeBarRect.mRight)
+ {
+ mTextureSizeBar[(x - mTextureSizeBarRect.mLeft) / mTextureSizeBarWidth]->handleHover(x, y, mask, (mType == TEXTURE_MEM_OVER_SIZE)) ;
+ }
+
+ return TRUE ;
+}
+
+//draw real-time texture mem bar over size
+void LLTextureSizeView::drawTextureSizeGraph()
+{
if(mTextureSizeBar.size() == 0)
{
S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
@@ -931,29 +984,16 @@ void LLTextureSizeView::draw()
mTextureSizeBar[i]->draw() ;
}
LLImageGL::resetCurTexSizebar();
-
- LLView::draw();
-#endif
-}
-
-BOOL LLTextureSizeView::handleHover(S32 x, S32 y, MASK mask)
-{
- if(x > mTextureSizeBarRect.mLeft && x < mTextureSizeBarRect.mRight)
- {
- mTextureSizeBar[(x - mTextureSizeBarRect.mLeft) / mTextureSizeBarWidth]->handleHover(x, y, mask) ;
- }
-
- return TRUE ;
}
//draw background of texture size bar graph
F32 LLTextureSizeView::drawTextureSizeDistributionGraph()
{
+ //scale
F32 scale = 1.0f ;
-#if !LL_RELEASE_FOR_DOWNLOAD
+
LLGLSUIDefault gls_ui;
- //scale
{
S32 count = 0 ;
for(U32 i = 0 ; i < LLImageGL::sTextureLoadedCounter.size() ; i++)
@@ -1043,8 +1083,137 @@ F32 LLTextureSizeView::drawTextureSizeDistributionGraph()
text = llformat("Texture Size Distribution") ;
LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 250, top + line_height * 3,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
-
-#endif
return scale ;
}
+//draw real-time texture mem bar over category
+void LLTextureSizeView::drawTextureCategoryGraph()
+{
+ if(mTextureSizeBar.size() == 0)
+ {
+ S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ;
+ mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ;
+
+ for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++)
+ {
+ mTextureSizeBar[i] = new LLGLTexSizeBar(i, mTextureSizeBarRect.mLeft + i * mTextureSizeBarWidth ,
+ line_height * 2, mTextureSizeBarRect.mLeft + (i + 1) * mTextureSizeBarWidth, line_height) ;
+ }
+ }
+
+ F32 size_bar_scale = drawTextureCategoryDistributionGraph() ;
+ for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++)
+ {
+ U32 k = LLViewerTexture::getIndexFromCategory(i) ;
+ mTextureSizeBar[i]->setTop(LLImageGL::sTextureMemByCategory[k] >> 20, LLImageGL::sTextureMemByCategoryBound[k] >> 20, size_bar_scale) ;
+ mTextureSizeBar[i]->draw() ;
+ }
+ LLImageGL::resetCurTexSizebar();
+}
+
+//draw background for TEXTURE_MEM_OVER_CATEGORY
+F32 LLTextureSizeView::drawTextureCategoryDistributionGraph()
+{
+ //scale
+ F32 scale = 4.0f ;
+
+ LLGLSUIDefault gls_ui;
+
+ {
+ S32 count = 0 ;
+ for(U32 i = 0 ; i < LLImageGL::sTextureMemByCategory.size() ; i++)
+ {
+ S32 tmp = LLImageGL::sTextureMemByCategory[i] >> 20 ;
+ if(tmp > count)
+ {
+ count = tmp ;
+ }
+ }
+ if(count > mTextureSizeBarRect.getHeight() * 0.25f)
+ {
+ scale = (F32)mTextureSizeBarRect.getHeight() * 0.25f / count ;
+ }
+ }
+
+ S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 left = mTextureSizeBarRect.mLeft ;
+ S32 bottom = mTextureSizeBarRect.mBottom ;
+ S32 right = mTextureSizeBarRect.mRight ;
+ S32 top = mTextureSizeBarRect.mTop ;
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ //background rect
+ gl_rect_2d(left - 25, top + 30, right + 100, bottom - 25, LLColor4(0.0f, 0.0f, 0.0f, 0.25f)) ;
+
+ //--------------------------------------------------
+ gGL.color4f(1.0f, 0.5f, 0.5f, 0.75f);
+ gl_line_2d(left, bottom, right, bottom) ; //x axis
+ gl_line_2d(left, bottom, left, top) ; //y axis
+
+ //ruler
+ //--------------------------------------------------
+ gGL.color4f(1.0f, 0.5f, 0.5f, 0.5f);
+ for(S32 i = bottom + 50 ; i <= top ; i += 50)
+ {
+ gl_line_2d(left, i, right, i) ;
+ }
+
+ //texts
+ //--------------------------------------------------
+ F32 text_color[] = {1.f, 1.f, 1.f, 0.75f};
+ std::string text;
+
+ //-------
+ //x axis: size label
+ static char category[LLViewerTexture::MAX_GL_IMAGE_CATEGORY][4] =
+ {"Non", "Bak", "Av", "Cld", "Scp", "Hi", "Trn", "Slt", "Hud", "Bsf", "UI", "Pvw", "Map", "Mvs", "Slf", "Loc", "Scr", "Dyn", "Mdi", "ALT", "Oth" } ;
+
+ text = llformat("%s", category[0]) ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 12, bottom - line_height / 2,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ for(U32 i = 1 ; i < mTextureSizeBar.size() ; i++)
+ {
+ text = llformat("%s", category[i]) ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + i * mTextureSizeBarWidth + 12, bottom - line_height / 2,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ }
+ //-------
+
+ //y axis: number label
+ for(S32 i = bottom + 50 ; i <= top ; i += 50)
+ {
+ text = llformat("%d", (S32)((i - bottom) / scale)) ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left - 20, i + line_height / 2 ,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, right + 5, i + line_height / 2 ,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ }
+
+ text = llformat("MB") ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left - 20, top + line_height * 2 ,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+ //--------------------------------------------------
+ F32 loaded_color[] = {1.0f, 0.0f, 0.0f, 0.75f};
+ gl_rect_2d(left + 70, top + line_height * 2, left + 90, top + line_height, loaded_color) ;
+ text = llformat("Loaded") ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 100, top + line_height * 2,
+ loaded_color,
+ LLFontGL::LEFT, LLFontGL::TOP);
+
+ F32 bound_color[] = {1.0f, 1.0f, 0.0f, 0.75f};
+ gl_rect_2d(left + 170, top + line_height * 2, left + 190, top + line_height, bound_color) ;
+ text = llformat("Bound") ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 200, top + line_height * 2,
+ bound_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ //--------------------------------------------------
+
+ //title
+ text = llformat("Texture Category Distribution") ;
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 250, top + line_height * 3,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
+ return scale ;
+}
diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h
index e917c0235e..435a55df83 100644
--- a/indra/newview/lltextureview.h
+++ b/indra/newview/lltextureview.h
@@ -79,24 +79,41 @@ public:
};
class LLGLTexSizeBar;
-
-class LLTextureSizeView : public LLView
+class LLTextureSizeView : public LLContainerView
{
-public:
+protected:
LLTextureSizeView(const Params&);
+ friend class LLUICtrlFactory;
+public:
~LLTextureSizeView();
/*virtual*/ void draw();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) ;
+ void setType(S32 type) {mType = type ;}
+ enum
+ {
+ TEXTURE_MEM_OVER_SIZE,
+ TEXTURE_MEM_OVER_CATEGORY
+ };
private:
+ //draw background for TEXTURE_MEM_OVER_SIZE
F32 drawTextureSizeDistributionGraph() ;
-
+ //draw real-time texture mem bar over size
+ void drawTextureSizeGraph();
+
+ //draw background for TEXTURE_MEM_OVER_CATEGORY
+ F32 drawTextureCategoryDistributionGraph() ;
+ //draw real-time texture mem bar over category
+ void drawTextureCategoryGraph();
+
private:
std::vector<LLGLTexSizeBar*> mTextureSizeBar ;
LLRect mTextureSizeBarRect ;
- S32 mTextureSizeBarWidth ;
+ S32 mTextureSizeBarWidth ;
+ S32 mType ;
};
extern LLTextureView *gTextureView;
extern LLTextureSizeView *gTextureSizeView;
+extern LLTextureSizeView *gTextureCategoryView;
#endif // LL_TEXTURE_VIEW_H
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 24824a095c..60a89c02e4 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -36,6 +36,7 @@
#include "llbutton.h"
#include "llfocusmgr.h"
+#include "llnotifications.h"
#include "llviewercontrol.h"
using namespace LLNotificationsUI;
@@ -49,13 +50,15 @@ LLToast::Params::Params()
enable_hide_btn("enable_hide_btn", true),
force_show("force_show", false),
force_store("force_store", false),
+ fading_time_secs("fading_time_secs", gSavedSettings.getS32("ToastFadingTime")),
lifetime_secs("lifetime_secs", gSavedSettings.getS32("NotificationToastLifeTime"))
{};
LLToast::LLToast(const LLToast::Params& p)
: LLModalDialog(LLSD(), p.is_modal),
mPanel(p.panel),
- mToastLifetime(p.lifetime_secs),
+ mToastLifetime(p.lifetime_secs),
+ mToastFadingTime(p.fading_time_secs),
mNotificationID(p.notif_id),
mSessionID(p.session_id),
mCanFade(p.can_fade),
@@ -64,10 +67,18 @@ LLToast::LLToast(const LLToast::Params& p)
mHideBtn(NULL),
mNotification(p.notification),
mIsHidden(false),
- mHideBtnPressed(false)
+ mHideBtnPressed(false),
+ mIsTip(p.is_tip),
+ mWrapperPanel(NULL)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
+ setCanDrag(FALSE);
+
+ mWrapperPanel = getChild<LLPanel>("wrapper_panel");
+ mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+ mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
+
if(mPanel)
{
insertPanel(mPanel);
@@ -77,6 +88,8 @@ LLToast::LLToast(const LLToast::Params& p)
{
mHideBtn = getChild<LLButton>("hide_btn");
mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
+ mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+ mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
}
// init callbacks if present
@@ -95,10 +108,30 @@ BOOL LLToast::postBuild()
mTimer.stop();
}
+ if (mIsTip)
+ {
+ mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box");
+
+ if (mTextEditor)
+ {
+ mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this));
+ mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4));
+ }
+ }
+
return TRUE;
}
//--------------------------------------------------------------------------
+void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask)
+{
+ if (!mTextEditor->getRect().pointInRect(x, y))
+ {
+ hide();
+ }
+}
+
+//--------------------------------------------------------------------------
void LLToast::setHideButtonEnabled(bool enabled)
{
if(mHideBtn)
@@ -127,7 +160,7 @@ bool LLToast::lifetimeHasExpired()
if (mTimer.getStarted())
{
F32 elapsed_time = mTimer.getElapsedTimeF32();
- if ((mToastLifetime - elapsed_time) <= gSavedSettings.getS32("ToastOpaqueTime"))
+ if ((mToastLifetime - elapsed_time) <= mToastFadingTime)
{
setBackgroundOpaque(FALSE);
}
@@ -148,6 +181,42 @@ void LLToast::hide()
mOnFadeSignal(this);
}
+void LLToast::onFocusLost()
+{
+ if(mWrapperPanel && !isBackgroundVisible())
+ {
+ // Lets make wrapper panel behave like a floater
+ setBackgroundOpaque(FALSE);
+ }
+}
+
+void LLToast::onFocusReceived()
+{
+ if(mWrapperPanel && !isBackgroundVisible())
+ {
+ // Lets make wrapper panel behave like a floater
+ setBackgroundOpaque(TRUE);
+ }
+}
+
+S32 LLToast::getTopPad()
+{
+ if(mWrapperPanel)
+ {
+ return getRect().getHeight() - mWrapperPanel->getRect().getHeight();
+ }
+ return 0;
+}
+
+S32 LLToast::getRightPad()
+{
+ if(mWrapperPanel)
+ {
+ return getRect().getWidth() - mWrapperPanel->getRect().getWidth();
+ }
+ return 0;
+}
+
//--------------------------------------------------------------------------
void LLToast::setCanFade(bool can_fade)
{
@@ -173,22 +242,21 @@ void LLToast::reshapeToPanel()
if(!panel)
return;
- LLRect panel_rect;
+ LLRect panel_rect = panel->getRect();
- panel_rect = panel->getRect();
- reshape(panel_rect.getWidth(), panel_rect.getHeight());
panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
- panel->setRect(panel_rect);
+ panel->setShape(panel_rect);
LLRect toast_rect = getRect();
- toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight());
- setRect(toast_rect);
+ toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop,
+ panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad());
+ setShape(toast_rect);
}
void LLToast::insertPanel(LLPanel* panel)
{
- addChild(panel);
+ mWrapperPanel->addChild(panel);
reshapeToPanel();
}
@@ -201,6 +269,19 @@ void LLToast::draw()
}
LLFloater::draw();
+
+ if(!isBackgroundVisible())
+ {
+ // Floater background is invisible, lets make wrapper panel look like a
+ // floater - draw shadow.
+ drawShadow(mWrapperPanel);
+
+ // Shadow will probably overlap close button, lets redraw the button
+ if(mHideBtn)
+ {
+ drawChild(mHideBtn);
+ }
+ }
}
//--------------------------------------------------------------------------
@@ -219,12 +300,13 @@ void LLToast::setVisible(BOOL show)
if(show)
{
setBackgroundOpaque(TRUE);
- if(!mTimer.getStarted())
+ if(!mTimer.getStarted() && mCanFade)
{
mTimer.start();
}
+ LLModalDialog::setFrontmost(FALSE);
}
- LLPanel::setVisible(show);
+ LLFloater::setVisible(show);
if(mPanel)
{
if(!mPanel->isDead())
@@ -234,43 +316,102 @@ void LLToast::setVisible(BOOL show)
}
}
-//--------------------------------------------------------------------------
-void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
+void LLToast::onToastMouseEnter()
{
- mOnToastHoverSignal(this, MOUSE_ENTER);
+ LLRect panel_rc = mWrapperPanel->calcScreenRect();
+ LLRect button_rc;
+ if(mHideBtn)
+ {
+ button_rc = mHideBtn->calcScreenRect();
+ }
- setBackgroundOpaque(TRUE);
- if(mCanFade)
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+
+ if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
{
- mTimer.stop();
+ mOnToastHoverSignal(this, MOUSE_ENTER);
+
+ setBackgroundOpaque(TRUE);
+
+ //toasts fading is management by Screen Channel
+
+ sendChildToFront(mHideBtn);
+ if(mHideBtn && mHideBtn->getEnabled())
+ {
+ mHideBtn->setVisible(TRUE);
+ }
+ mOnMouseEnterSignal(this);
+ mToastMouseEnterSignal(this, getValue());
}
-
- sendChildToFront(mHideBtn);
- if(mHideBtn && mHideBtn->getEnabled())
- mHideBtn->setVisible(TRUE);
- mOnMouseEnterSignal(this);
}
-//--------------------------------------------------------------------------
-void LLToast::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- mOnToastHoverSignal(this, MOUSE_LEAVE);
-
- if(mCanFade)
+void LLToast::onToastMouseLeave()
+{
+ LLRect panel_rc = mWrapperPanel->calcScreenRect();
+ LLRect button_rc;
+ if(mHideBtn)
{
- mTimer.start();
+ button_rc = mHideBtn->calcScreenRect();
}
- if(mHideBtn && mHideBtn->getEnabled())
+
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+
+ if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
{
- if( mHideBtnPressed )
+ mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+ //toasts fading is management by Screen Channel
+
+ if(mHideBtn && mHideBtn->getEnabled())
{
- mHideBtnPressed = false;
- return;
+ if( mHideBtnPressed )
+ {
+ mHideBtnPressed = false;
+ return;
+ }
+ mHideBtn->setVisible(FALSE);
}
- mHideBtn->setVisible(FALSE);
+ mToastMouseLeaveSignal(this, getValue());
}
}
+void LLToast::setBackgroundOpaque(BOOL b)
+{
+ if(mWrapperPanel && !isBackgroundVisible())
+ {
+ mWrapperPanel->setBackgroundOpaque(b);
+ }
+ else
+ {
+ LLModalDialog::setBackgroundOpaque(b);
+ }
+}
+
+void LLNotificationsUI::LLToast::stopFading()
+{
+ if(mCanFade)
+ {
+ stopTimer();
+ }
+}
+
+void LLNotificationsUI::LLToast::startFading()
+{
+ if(mCanFade)
+ {
+ resetTimer();
+ }
+}
+
+bool LLToast::isHovered()
+{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+ return mWrapperPanel->calcScreenRect().pointInRect(x, y);
+}
+
//--------------------------------------------------------------------------
BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 0698c94880..64855020a9 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -37,9 +37,10 @@
#include "llpanel.h"
#include "llmodaldialog.h"
#include "lltimer.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
#include "llviewercontrol.h"
+#include "lltexteditor.h"
#define MOUSE_LEAVE false
#define MOUSE_ENTER true
@@ -63,7 +64,8 @@ public:
Optional<LLUUID> notif_id, //notification ID
session_id; //im session ID
Optional<LLNotificationPtr> notification;
- Optional<F32> lifetime_secs;
+ Optional<F32> lifetime_secs,
+ fading_time_secs; // Number of seconds while a toast is fading
Optional<toast_callback_t> on_delete_toast,
on_mouse_enter;
Optional<bool> can_fade,
@@ -84,8 +86,16 @@ public:
// Toast handlers
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual void onMouseEnter(S32 x, S32 y, MASK mask);
- virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ //Fading
+
+ /** Stop fading timer */
+ virtual void stopFading();
+
+ /** Start fading timer */
+ virtual void startFading();
+
+ bool isHovered();
// Operating with toasts
// insert a panel to a toast
@@ -107,10 +117,22 @@ public:
virtual void draw();
//
virtual void setVisible(BOOL show);
+
+ /*virtual*/ void setBackgroundOpaque(BOOL b);
//
virtual void hide();
+ /*virtual*/ void onFocusLost();
+
+ /*virtual*/ void onFocusReceived();
+ /**
+ * Returns padding between floater top and wrapper_panel top.
+ * This padding should be taken into account when positioning or reshaping toasts
+ */
+ S32 getTopPad();
+
+ S32 getRightPad();
// get/set Toast's flags or states
// get information whether the notification corresponding to the toast is valid or not
@@ -128,6 +150,7 @@ public:
// set whether this toast considered as hidden or not
void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; }
+ const LLNotificationPtr& getNotification() { return mNotification;}
// Registers signals/callbacks for events
toast_signal_t mOnFadeSignal;
@@ -142,9 +165,17 @@ public:
toast_hover_check_signal_t mOnToastHoverSignal;
boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); }
+ boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
+ boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
private:
+ void onToastMouseEnter();
+
+ void onToastMouseLeave();
+
+ void handleTipToastClick(S32 x, S32 y, MASK mask);
+
// check timer
bool lifetimeHasExpired();
// on timer finished function
@@ -154,12 +185,16 @@ private:
LLUUID mSessionID;
LLNotificationPtr mNotification;
+ LLPanel* mWrapperPanel;
+
// timer counts a lifetime of a toast
LLTimer mTimer;
F32 mToastLifetime; // in seconds
+ F32 mToastFadingTime; // in seconds
- LLPanel* mPanel;
- LLButton* mHideBtn;
+ LLPanel* mPanel;
+ LLButton* mHideBtn;
+ LLTextEditor* mTextEditor;
LLColor4 mBgColor;
bool mCanFade;
@@ -167,6 +202,10 @@ private:
bool mHideBtnEnabled;
bool mHideBtnPressed;
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
+ bool mIsTip;
+
+ commit_signal_t mToastMouseEnterSignal;
+ commit_signal_t mToastMouseLeaveSignal;
};
}
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index e4a3f8603b..c3ccb9380b 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -30,7 +30,6 @@
* $/LicenseInfo$
*/
-
#include "llviewerprecompiledheaders.h" // must be first include
#include "linden_common.h"
@@ -50,6 +49,7 @@
#include "lluictrlfactory.h"
#include "llnotifications.h"
#include "llfunctorregistry.h"
+#include "llrootview.h"
const S32 MAX_ALLOWED_MSG_WIDTH = 400;
const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@@ -217,16 +217,13 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor");
if (mCaution)
{
- LLIconCtrl::Params params;
- params.name("icon");
- params.rect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
- params.mouse_opaque(false);
- params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
- params.tab_stop(false);
- LLIconCtrl * icon = LLUICtrlFactory::create<LLIconCtrl> (params);
- icon->setValue ("notify_caution_icon.tga");
- icon->setMouseOpaque(FALSE);
- LLToastPanel::addChild(icon);
+ LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance());
+ if(icon)
+ {
+ icon->setRect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
+ LLToastPanel::addChild(icon);
+ }
+
msg_x += 32 + HPAD;
msg_box->setColor( alert_caution_text_color );
}
@@ -242,29 +239,30 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
// Buttons
S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2;
-
+
for( S32 i = 0; i < num_options; i++ )
{
LLRect button_rect;
- button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT );
-
- LLButton::Params p;
- p.name(options[i].first);
- p.rect(button_rect);
- p.click_callback.function(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
- p.font(font);
- p.label(options[i].second);
+
+ LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance());
+ if(btn)
+ {
+ btn->setName(options[i].first);
+ btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT ));
+ btn->setLabel(options[i].second);
+ btn->setFont(font);
+
+ btn->setClickedCallback(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
- LLButton* btn = LLUICtrlFactory::create<LLButton>(p);
- mButtonData[i].mButton = btn;
+ mButtonData[i].mButton = btn;
- LLToastPanel::addChild(btn);
+ LLToastPanel::addChild(btn);
- if( i == mDefaultOption )
- {
- btn->setFocus(TRUE);
+ if( i == mDefaultOption )
+ {
+ btn->setFocus(TRUE);
+ }
}
-
button_left += button_width + BTN_HPAD;
}
@@ -272,25 +270,26 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
if (!edit_text_name.empty())
{
S32 y = VPAD + BTN_HEIGHT + VPAD/2;
+ mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
+
+ if (mLineEditor)
+ {
+ LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y);
+ mLineEditor->setName(edit_text_name);
+ mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
+ mLineEditor->setRect(leditor_rect);
+ mLineEditor->setText(edit_text_contents);
+ mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1);
- LLLineEditor::Params params;
- params.name(edit_text_name);
- params.rect(LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y));
- params.default_text(edit_text_contents);
- params.max_length_bytes(STD_STRING_STR_LEN);
- mLineEditor = LLUICtrlFactory::create<LLLineEditor> (params);
+ // make sure all edit keys get handled properly (DEV-22396)
+ mLineEditor->setHandleEditKeysDirectly(TRUE);
- // make sure all edit keys get handled properly (DEV-22396)
- mLineEditor->setHandleEditKeysDirectly(TRUE);
+ LLToastPanel::addChild(mLineEditor);
- LLToastPanel::addChild(mLineEditor);
- }
-
- if (mLineEditor)
- {
- mLineEditor->setDrawAsterixes(is_password);
+ mLineEditor->setDrawAsterixes(is_password);
- setEditTextArgs(notification->getSubstitutions());
+ setEditTextArgs(notification->getSubstitutions());
+ }
}
std::string ignore_label;
@@ -320,7 +319,14 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control )
{
- const LLFontGL* font = LLFontGL::getFontSansSerif();
+ mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance());
+
+ if(!mCheck)
+ {
+ return false;
+ }
+
+ const LLFontGL* font = mCheck->getFont();
const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f);
// Extend dialog for "check next time"
@@ -336,14 +342,13 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2;
+
+ // set check_box's attributes
+ LLRect check_rect;
+ mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT));
+ mCheck->setLabel(check_title);
+ mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
- LLCheckBoxCtrl::Params p;
- p.name("check");
- p.rect.left(msg_x).bottom(VPAD+BTN_HEIGHT+LINE_HEIGHT/2).width(max_msg_width).height(LINE_HEIGHT);
- p.label(check_title);
- p.font(font);
- p.commit_callback.function(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
- mCheck = LLUICtrlFactory::create<LLCheckBoxCtrl>(p);
LLToastPanel::addChild(mCheck);
return true;
@@ -380,6 +385,12 @@ BOOL LLToastAlertPanel::handleKeyHere(KEY key, MASK mask )
{
if( KEY_RETURN == key && mask == MASK_NONE )
{
+ LLButton* defaultBtn = getDefaultButton();
+ if(defaultBtn && defaultBtn->getVisible() && defaultBtn->getEnabled())
+ {
+ // If we have a default button, click it when return is pressed
+ defaultBtn->onCommit();
+ }
return TRUE;
}
else if (KEY_RIGHT == key)
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index af0c9a9ddd..43e105a4f1 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -36,11 +36,11 @@
#include "lltoastpanel.h"
#include "llfloater.h"
#include "llui.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
+#include "llerror.h"
class LLButton;
class LLCheckBoxCtrl;
-class LLAlertDialogTemplate;
class LLLineEditor;
/**
@@ -54,16 +54,19 @@ class LLLineEditor;
class LLToastAlertPanel
: public LLToastPanel
{
+ LOG_CLASS(LLToastAlertPanel);
public:
typedef bool (*display_callback_t)(S32 modal);
class URLLoader
{
public:
- virtual void load(const std::string& url, bool force_open_externally = 0 ) = 0;
- virtual ~URLLoader() {}
+ virtual void load(const std::string& url, bool force_open_externally = 0) = 0;
+ virtual ~URLLoader()
+ {
+ }
};
-
+
static void setURLLoader(URLLoader* loader)
{
sURLLoader = loader;
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index e26a0776ff..add61c00cf 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -38,8 +38,9 @@
#include "llbutton.h"
#include "lliconctrl.h"
-#include "llnotify.h"
-#include "lltextbox.h"
+#include "llinventoryfunctions.h"
+#include "llnotifications.h"
+#include "llviewertexteditor.h"
#include "lluiconstants.h"
#include "llui.h"
@@ -53,7 +54,7 @@
#include "llfloaterinventory.h"
#include "llinventorytype.h"
-const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 4;
+const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 7;
LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification)
: LLToastPanel(notification),
@@ -83,11 +84,6 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
//message body
const std::string& message = payload["message"].asString();
-
- LLTextBox* pSubjectText = getChild<LLTextBox>("subject");
- pSubjectText->setValue(subject);
-
- LLTextBox* pDateTimeText = getChild<LLTextBox>("datetime");
std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],["
+LLTrans::getString("UTCTimeDay")+"] ["
+LLTrans::getString("UTCTimeMth")+"] ["
@@ -101,20 +97,23 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
LLSD substitution;
substitution["datetime"] = (S32) notice_date.secondsSinceEpoch();
LLStringUtil::format(timeStr, substitution);
- pDateTimeText->setValue(timeStr);
- LLTextBox* pMessageText = getChild<LLTextBox>("message");
+ LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message");
+ pMessageText->clear();
- //If message is empty let it be invisible and not take place at the panel
- if(message.size() != 0)
- {
- pMessageText->setVisible(TRUE);
- pMessageText->setValue(message);
- }
- else
- {
- pMessageText->setVisible(FALSE);
- }
+ LLStyle::Params style;
+ LLFontGL* subject_font = LLFontGL::getFontByName(getString("subject_font"));
+ if (subject_font)
+ style.font = subject_font;
+ pMessageText->appendText(subject, FALSE, style);
+
+ LLFontGL* date_font = LLFontGL::getFontByName(getString("date_font"));
+ if (date_font)
+ style.font = date_font;
+ pMessageText->appendText(timeStr + "\n", TRUE, style);
+
+ style.font = pMessageText->getDefaultFont();
+ pMessageText->appendText(message, TRUE, style);
//attachment
BOOL hasInventory = payload["inventory_offer"].isDefined();
@@ -128,17 +127,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
pAttachLink->setVisible(hasInventory);
pAttachIcon->setVisible(hasInventory);
if (hasInventory) {
- std::string dis_name;
- std::string inv_name = payload["inventory_name"];
-
- if (LLViewerInventoryItem::extractSortFieldAndDisplayName(inv_name, NULL, &dis_name))
- {
- pAttachLink->setValue(dis_name);
- }
- else
- {
- pAttachLink->setValue(inv_name);
- }
+ pAttachLink->setValue(payload["inventory_name"]);
mInventoryOffer = new LLOfferInfo(payload["inventory_offer"]);
childSetActionTextbox("attachment", boost::bind(
@@ -206,7 +195,7 @@ void LLToastGroupNotifyPanel::onClickAttachment()
//if attachment isn't openable - notify about saving
if (!isAttachmentOpenable(mInventoryOffer->mType)) {
- LLNotifications::instance().add("AttachmentSaved");
+ LLNotifications::instance().add("AttachmentSaved", LLSD(), LLSD());
}
mInventoryOffer = NULL;
@@ -219,7 +208,6 @@ bool LLToastGroupNotifyPanel::isAttachmentOpenable(LLAssetType::EType type)
switch(type)
{
case LLAssetType::AT_LANDMARK:
- case LLAssetType::AT_FAVORITE:
case LLAssetType::AT_NOTECARD:
case LLAssetType::AT_IMAGE_JPEG:
case LLAssetType::AT_IMAGE_TGA:
diff --git a/indra/newview/lltoastgroupnotifypanel.h b/indra/newview/lltoastgroupnotifypanel.h
index e3d0ef45cb..4879000e8c 100644
--- a/indra/newview/lltoastgroupnotifypanel.h
+++ b/indra/newview/lltoastgroupnotifypanel.h
@@ -38,7 +38,7 @@
#include "lldarray.h"
#include "lltimer.h"
#include "llviewermessage.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
class LLButton;
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index c02fd7a5ef..26d3bd5192 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -33,51 +33,68 @@
#include "llviewerprecompiledheaders.h"
#include "lltoastimpanel.h"
+#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llgroupactions.h"
+#include "llgroupiconctrl.h"
+#include "llimview.h"
+#include "llnotifications.h"
+#include "llinstantmessage.h"
+#include "lltooltip.h"
+
+#include "llviewerchat.h"
+
const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 6;
//--------------------------------------------------------------------------
LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notification),
- mAvatar(NULL), mUserName(NULL),
- mTime(NULL), mMessage(NULL),
- mReplyBtn(NULL)
+ mAvatarIcon(NULL), mAvatarName(NULL),
+ mTime(NULL), mMessage(NULL), mGroupIcon(NULL)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml");
- LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
- mAvatar = getChild<LLAvatarIconCtrl>("avatar_icon");
- mUserName = getChild<LLTextBox>("user_name");
+ mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");
+ mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ mAdhocIcon = getChild<LLAvatarIconCtrl>("adhoc_icon");
+ mAvatarName = getChild<LLTextBox>("user_name");
mTime = getChild<LLTextBox>("time_box");
mMessage = getChild<LLTextBox>("message");
- mReplyBtn = getChild<LLButton>("reply");
- mMessage->setValue(p.message);
- mUserName->setValue(p.from);
- mTime->setValue(p.time);
- mSessionID = p.session_id;
- mNotification = p.notification;
-
- // if message comes from the system - there shouldn't be a reply btn
- if(p.from == "Second Life")
+ LLStyle::Params style_params;
+ LLFontGL* fontp = LLViewerChat::getChatFont();
+ std::string font_name = LLFontGL::nameFromFont(fontp);
+ std::string font_size = LLFontGL::sizeFromFont(fontp);
+ style_params.font.name(font_name);
+ style_params.font.size(font_size);
+
+
+ //Handle IRC styled /me messages.
+ std::string prefix = p.message.substr(0, 4);
+ if (prefix == "/me " || prefix == "/me'")
{
- mAvatar->setVisible(FALSE);
- sys_msg_icon->setVisible(TRUE);
-
- mReplyBtn->setVisible(FALSE);
- S32 btn_height = mReplyBtn->getRect().getHeight();
- LLRect msg_rect = mMessage->getRect();
- mMessage->reshape(msg_rect.getWidth(), msg_rect.getHeight() + btn_height);
- msg_rect.setLeftTopAndSize(msg_rect.mLeft, msg_rect.mTop, msg_rect.getWidth(), msg_rect.getHeight() + btn_height);
- mMessage->setRect(msg_rect);
+ //style_params.font.style = "UNDERLINE";
+ mMessage->clear();
+
+ style_params.font.style ="ITALIC";
+ mMessage->appendText(p.from, FALSE, style_params);
+
+ style_params.font.style = "ITALIC";
+ mMessage->appendText(p.message.substr(3), FALSE, style_params);
}
else
{
- mAvatar->setVisible(TRUE);
- sys_msg_icon->setVisible(FALSE);
-
- mAvatar->setValue(p.avatar_id);
- mReplyBtn->setClickedCallback(boost::bind(&LLToastIMPanel::onClickReplyBtn, this));
+ style_params.font.style = "NORMAL";
+ mMessage->setText(p.message, style_params);
}
+ mAvatarName->setValue(p.from);
+ mTime->setValue(p.time);
+ mSessionID = p.session_id;
+ mAvatarID = p.avatar_id;
+ mNotification = p.notification;
+
+ initIcon();
+
S32 maxLinesCount;
std::istringstream ss( getString("message_max_lines_count") );
if (!(ss >> maxLinesCount))
@@ -92,11 +109,126 @@ LLToastIMPanel::~LLToastIMPanel()
{
}
-//--------------------------------------------------------------------------
-void LLToastIMPanel::onClickReplyBtn()
+//virtual
+BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
- mNotification->respond(mNotification->getResponseTemplate());
+ if (LLPanel::handleMouseDown(x,y,mask) == FALSE)
+ {
+ mNotification->respond(mNotification->getResponseTemplate());
+ }
+
+ return TRUE;
}
-//--------------------------------------------------------------------------
+//virtual
+BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ // It's not our direct child, so parentPointInView() doesn't work.
+ LLRect ctrl_rect;
+
+ mAvatarName->localRectToOtherView(mAvatarName->getLocalRect(), &ctrl_rect, this);
+ if (ctrl_rect.pointInRect(x, y))
+ {
+ spawnNameToolTip();
+ return TRUE;
+ }
+
+ mGroupIcon->localRectToOtherView(mGroupIcon->getLocalRect(), &ctrl_rect, this);
+ if(mGroupIcon->getVisible() && ctrl_rect.pointInRect(x, y))
+ {
+ spawnGroupIconToolTip();
+ return TRUE;
+ }
+
+ return LLToastPanel::handleToolTip(x, y, mask);
+}
+
+void LLToastIMPanel::spawnNameToolTip()
+{
+ // Spawn at right side of the name textbox.
+ LLRect sticky_rect = mAvatarName->calcScreenRect();
+ S32 icon_x = llmin(sticky_rect.mLeft + mAvatarName->getTextPixelWidth() + 3, sticky_rect.mRight - 16);
+ LLCoordGL pos(icon_x, sticky_rect.mTop);
+
+ LLToolTip::Params params;
+ params.background_visible(false);
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE));
+ params.delay_time(0.0f); // spawn instantly on hover
+ params.image(LLUI::getUIImage("Info_Small"));
+ params.message("");
+ params.padding(0);
+ params.pos(pos);
+ params.sticky_rect(sticky_rect);
+
+ LLToolTipMgr::getInstance()->show(params);
+}
+
+void LLToastIMPanel::spawnGroupIconToolTip()
+{
+ // Spawn at right bottom side of group icon.
+ LLRect sticky_rect = mGroupIcon->calcScreenRect();
+ LLCoordGL pos(sticky_rect.mRight, sticky_rect.mBottom);
+
+ LLGroupData g_data;
+ if(!gAgent.getGroupData(mSessionID, g_data))
+ {
+ llwarns << "Error getting group data" << llendl;
+ }
+
+ LLInspector::Params params;
+ params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE));
+ params.delay_time(0.100f);
+ params.image(LLUI::getUIImage("Info_Small"));
+ params.message(g_data.mName);
+ params.padding(3);
+ params.pos(pos);
+ params.max_width(300);
+
+ LLToolTipMgr::getInstance()->show(params);
+}
+
+void LLToastIMPanel::initIcon()
+{
+ mAvatarIcon->setVisible(FALSE);
+ mGroupIcon->setVisible(FALSE);
+ mAdhocIcon->setVisible(FALSE);
+
+ if(mAvatarName->getValue().asString() == SYSTEM_FROM)
+ {
+ // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe)
+ // and "dummy widget" warnings appeared in log.
+ // It does not make sense to have such image with empty name. Removed for EXT-5057.
+ }
+ else
+ {
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
+ if(!im_session)
+ {
+ llwarns << "Invalid IM session" << llendl;
+ return;
+ }
+
+ switch(im_session->mSessionType)
+ {
+ case LLIMModel::LLIMSession::P2P_SESSION:
+ mAvatarIcon->setVisible(TRUE);
+ mAvatarIcon->setValue(mAvatarID);
+ break;
+ case LLIMModel::LLIMSession::GROUP_SESSION:
+ mGroupIcon->setVisible(TRUE);
+ mGroupIcon->setValue(mSessionID);
+ break;
+ case LLIMModel::LLIMSession::ADHOC_SESSION:
+ mAdhocIcon->setVisible(TRUE);
+ mAdhocIcon->setValue(im_session->mOtherParticipantID);
+ mAdhocIcon->setToolTip(im_session->mName);
+ break;
+ default:
+ llwarns << "Unknown IM session type" << llendl;
+ break;
+ }
+ }
+}
+// EOF
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
index af21b07a3d..cf4ad80637 100644
--- a/indra/newview/lltoastimpanel.h
+++ b/indra/newview/lltoastimpanel.h
@@ -39,6 +39,7 @@
#include "llbutton.h"
#include "llavatariconctrl.h"
+class LLGroupIconCtrl;
class LLToastIMPanel: public LLToastPanel
{
@@ -57,19 +58,27 @@ public:
LLToastIMPanel(LLToastIMPanel::Params &p);
virtual ~LLToastIMPanel();
-
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
private:
- static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
+ void showInspector();
+
+ void spawnNameToolTip();
+ void spawnGroupIconToolTip();
- void onClickReplyBtn();
+ void initIcon();
+
+ static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
LLNotificationPtr mNotification;
LLUUID mSessionID;
- LLAvatarIconCtrl* mAvatar;
- LLTextBox* mUserName;
+ LLUUID mAvatarID;
+ LLAvatarIconCtrl* mAvatarIcon;
+ LLGroupIconCtrl* mGroupIcon;
+ LLAvatarIconCtrl* mAdhocIcon;
+ LLTextBox* mAvatarName;
LLTextBox* mTime;
LLTextBox* mMessage;
- LLButton* mReplyBtn;
};
#endif // LLTOASTIMPANEL_H_
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 0c23947a8c..c47c017143 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -33,13 +33,21 @@
#include "llviewerprecompiledheaders.h"
#include "lltoastnotifypanel.h"
+
+// project includes
#include "llviewercontrol.h"
+
+// library includes
+#include "lldbstrings.h"
+#include "llnotifications.h"
#include "lluiconstants.h"
#include "llrect.h"
#include "lltrans.h"
+#include "llnotificationsutil.h"
const S32 BOTTOM_PAD = VPAD * 3;
-const S32 BUTTON_WIDTH = 90;
+const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
+S32 BUTTON_WIDTH = 90;
//static
const LLFontGL* LLToastNotifyPanel::sFont = NULL;
@@ -48,7 +56,6 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification) :
LLToastPanel(notification),
mTextBox(NULL),
-mIcon(NULL),
mInfoPanel(NULL),
mControlPanel(NULL),
mNumOptions(0),
@@ -58,8 +65,7 @@ mAddedDefaultBtn(false)
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml");
mInfoPanel = getChild<LLPanel>("info_panel");
mControlPanel = getChild<LLPanel>("control_panel");
- mIcon = getChild<LLIconCtrl>("info_icon");
-
+ BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
// customize panel's attributes
// is it intended for displaying a tip
mIsTip = notification->getType() == "notifytip";
@@ -92,27 +98,8 @@ mAddedDefaultBtn(false)
// customize panel's outfit
// preliminary adjust panel's layout
- mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);
-
- // choose a right icon
- if (mIsTip)
- {
- // use the tip notification icon
- mIcon->setValue("notify_tip_icon.tga");
- LLRect icon_rect = mIcon->getRect();
- icon_rect.setLeftTopAndSize(icon_rect.mLeft, getRect().getHeight() - VPAD, icon_rect.getWidth(), icon_rect.getHeight());
- mIcon->setRect(icon_rect);
- }
- else if (mIsCaution)
- {
- // use the caution notification icon
- mIcon->setValue("notify_caution_icon.tga");
- }
- else
- {
- // use the default notification icon
- mIcon->setValue("notify_box_icon.tga");
- }
+ //move to the end
+ //mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);
// adjust text options according to the notification type
// add a caution textbox at the top of a caution notification
@@ -128,12 +115,21 @@ mAddedDefaultBtn(false)
// *TODO: magic numbers(???) - copied from llnotify.cpp(250)
const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;
+ mTextBox->setMaxTextLength(MAX_LENGTH);
mTextBox->setVisible(TRUE);
mTextBox->setValue(notification->getMessage());
// add buttons for a script notification
- if (!mIsTip)
+ if (mIsTip)
{
+ adjustPanelForTipNotice();
+ }
+ else
+ {
+ std::vector<index_button_pair_t> buttons;
+ buttons.reserve(mNumOptions);
+ S32 buttons_width = 0;
+ // create all buttons and accumulate they total width to reshape mControlPanel
for (S32 i = 0; i < mNumOptions; i++)
{
LLSD form_element = form->getElement(i);
@@ -141,70 +137,200 @@ mAddedDefaultBtn(false)
{
continue;
}
-
- addButton(form_element["name"].asString(), form_element["text"].asString(), TRUE, form_element["default"].asBoolean());
+ LLButton* new_button = createButton(form_element, TRUE);
+ buttons_width += new_button->getRect().getWidth();
+ S32 index = form_element["index"].asInteger();
+ buttons.push_back(index_button_pair_t(index,new_button));
}
-
- if (mNumButtons == 0)
+ if (buttons.empty())
{
- addButton("OK", LLTrans::getString("ok"), FALSE, TRUE);
- mAddedDefaultBtn = true;
+ addDefaultButton();
+ }
+ else
+ {
+ const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
+ S32 button_panel_height = mControlPanel->getRect().getHeight();
+ //try get an average h_pad to spread out buttons
+ S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
+ if(h_pad < 2*HPAD)
+ {
+ /*
+ * Probably it is a scriptdialog toast
+ * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
+ * In last case set default h_pad to avoid heaping of buttons
+ */
+ h_pad = 2*HPAD;
+ }
+ if (mIsScriptDialog)
+ {
+ // we are using default width for script buttons so we can determinate button_rows
+ //to get a number of rows we divide the required width of the buttons to button_panel_width
+ S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width);
+ //S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width;
+ //reserve one row for the ignore_btn
+ button_rows++;
+ //calculate required panel height for scripdialog notification.
+ button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD;
+ }
+ else
+ {
+ // in common case buttons can have different widths so we need to calculate button_rows according to buttons_width
+ //S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width);
+ S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width);
+ //calculate required panel height
+ button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + BOTTOM_PAD;
+ }
+
+ // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
+ adjustPanelForScriptNotice(button_panel_width, button_panel_height);
+ updateButtonsLayout(buttons, h_pad);
}
}
-
// adjust panel's height to the text size
mInfoPanel->setFollowsAll();
snapToMessageHeight(mTextBox, MAX_LENGTH);
}
+void LLToastNotifyPanel::addDefaultButton()
+{
+ LLSD form_element;
+ form_element.with("name", "OK").with("text", LLTrans::getString("ok")).with("default", true);
+ LLButton* ok_btn = createButton(form_element, FALSE);
+ LLRect new_btn_rect(ok_btn->getRect());
+
+ new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - BUTTON_WIDTH)/ 2, BOTTOM_PAD,
+ //auto_size for ok button makes it very small, so let's make it wider
+ BUTTON_WIDTH, new_btn_rect.getHeight());
+ ok_btn->setRect(new_btn_rect);
+ addChild(ok_btn, -1);
+ mNumButtons = 1;
+ mAddedDefaultBtn = true;
+}
+LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_option)
+{
+
+ InstanceAndS32* userdata = new InstanceAndS32;
+ userdata->mSelf = this;
+ userdata->mButtonName = is_option ? form_element["name"].asString() : "";
+
+ mBtnCallbackData.push_back(userdata);
+
+ LLButton::Params p;
+ bool is_ignore_btn = form_element["index"].asInteger() == -1;
+ const LLFontGL* font = is_ignore_btn ? sFontSmall: sFont; // for ignore button in script dialog
+ p.name(form_element["name"].asString());
+ p.label(form_element["text"].asString());
+ p.font(font);
+ p.rect.height = BTN_HEIGHT;
+ p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata));
+ p.rect.width = BUTTON_WIDTH;
+ p.auto_resize = false;
+ p.follows.flags(FOLLOWS_RIGHT | FOLLOWS_LEFT | FOLLOWS_BOTTOM);
+ if (mIsCaution)
+ {
+ p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
+ p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
+ }
+ // for the scriptdialog buttons we use fixed button size. This is a limit!
+ if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH)
+ {
+ p.rect.width = 1;
+ p.auto_resize = true;
+ }
+ else if (mIsScriptDialog && is_ignore_btn)
+ {
+ // this is ignore button,make it smaller
+ p.rect.height = BTN_HEIGHT_SMALL;
+ p.rect.width = 1;
+ p.auto_resize = true;
+ }
+ LLButton* btn = LLUICtrlFactory::create<LLButton>(p);
+ mNumButtons++;
+ btn->autoResize();
+ if (form_element["default"].asBoolean())
+ {
+ setDefaultBtn(btn);
+ }
+
+ return btn;
+}
LLToastNotifyPanel::~LLToastNotifyPanel()
{
std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer());
+ if (LLNotificationsUtil::find(mNotification->getID()) != NULL)
+ {
+ LLNotifications::getInstance()->cancel(mNotification);
+ }
}
-
-void LLToastNotifyPanel::adjustPanelForScriptNotice(const LLNotificationFormPtr form)
+void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad)
{
- F32 buttons_num = 0;
- S32 button_rows = 0;
-
- // calculate number of buttons
- for (S32 i = 0; i < mNumOptions; i++)
+ S32 left = 0;
+ //reserve place for ignore button
+ S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD;
+ S32 max_width = mControlPanel->getRect().getWidth();
+ LLButton* ignore_btn = NULL;
+ for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++)
{
- if (form->getElement(i)["type"].asString() == "button")
+ if (it->first == -1)
{
- buttons_num++;
+ ignore_btn = it->second;
+ continue;
}
+ LLButton* btn = it->second;
+ LLRect btn_rect(btn->getRect());
+ if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel
+ {
+ // looks like we need to add button to the next row
+ left = 0;
+ bottom_offset += (BTN_HEIGHT + VPAD);
+ }
+ //we arrange buttons from bottom to top for backward support of old script
+ btn_rect.setOriginAndSize(left, bottom_offset, btn_rect.getWidth(), btn_rect.getHeight());
+ btn->setRect(btn_rect);
+ left = btn_rect.mLeft + btn_rect.getWidth() + h_pad;
+ mControlPanel->addChild(btn, -1);
}
-
- // calculate necessary height for the button panel
- // if notification form contains no buttons - reserve a place for OK button
- // script notifications have extra line for an IGNORE button
- if(mIsScriptDialog)
- {
- button_rows = llceil((buttons_num - 1) / 3.0f) + 1;
- }
- else
+ if (mIsScriptDialog && ignore_btn != NULL)
{
- button_rows = llmax( 1, llceil(buttons_num / 3.0f));
+ LLRect ignore_btn_rect(ignore_btn->getRect());
+ S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH
+ S32 ignore_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - ignore_btn_rect.getWidth();
+ if (ignore_btn_left + ignore_btn_rect.getWidth() > max_width)// make sure that the ignore button is in panel
+ {
+ ignore_btn_left = max_width - ignore_btn_rect.getWidth() - 2 * HPAD;
+ }
+ ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom
+ ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight());
+ ignore_btn->setRect(ignore_btn_rect);
+ mControlPanel->addChild(ignore_btn, -1);
}
+}
- S32 button_panel_height = button_rows * BTN_HEIGHT + (button_rows + 1) * VPAD + BOTTOM_PAD;
-
+void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 button_panel_height)
+{
//adjust layout
- LLRect button_rect = mControlPanel->getRect();
- reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight() + button_panel_height);
- mControlPanel->reshape(button_rect.getWidth(), button_panel_height);
+ // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
+ reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight() + button_panel_height + VPAD);
+ mControlPanel->reshape( button_panel_width, button_panel_height);
}
-// static
void LLToastNotifyPanel::adjustPanelForTipNotice()
{
LLRect info_rect = mInfoPanel->getRect();
LLRect this_rect = getRect();
-
+ //we don't need display ControlPanel for tips because they doesn't contain any buttons.
mControlPanel->setVisible(FALSE);
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight());
+
+ if (mNotification->getPayload().has("respond_on_mousedown")
+ && mNotification->getPayload()["respond_on_mousedown"] )
+ {
+ mInfoPanel->setMouseDownCallback(
+ boost::bind(&LLNotification::respond,
+ mNotification,
+ mNotification->getResponseTemplate()));
+ }
}
// static
@@ -220,65 +346,7 @@ void LLToastNotifyPanel::onClickButton(void* data)
response[button_name] = true;
}
self->mNotification->respond(response);
-}
-
-// virtual
-LLButton* LLToastNotifyPanel::addButton(const std::string& name, const std::string& label, BOOL is_option, BOOL is_default)
-{
- LLRect btn_rect;
- LLButton* btn;
- S32 btn_height= BTN_HEIGHT;
- const LLFontGL* font = sFont;
- S32 ignore_pad = 0;
- S32 button_index = mNumButtons;
- S32 index = button_index;
- S32 x = (HPAD * 4) + 32;
- if (mIsScriptDialog)
- {
- // Add two "blank" option spaces, before the "Ignore" button
- index = button_index + 2;
- if (button_index == 0)
- {
- // Ignore button is smaller, less wide
- btn_height = BTN_HEIGHT_SMALL;
- font = sFontSmall;
- ignore_pad = 10;
- }
- }
-
- btn_rect.setOriginAndSize(x + (index % 3) * (BUTTON_WIDTH+HPAD+HPAD) + ignore_pad,
- BOTTOM_PAD + (index / 3) * (BTN_HEIGHT+VPAD),
- BUTTON_WIDTH - 2*ignore_pad,
- btn_height);
-
- InstanceAndS32* userdata = new InstanceAndS32;
- userdata->mSelf = this;
- userdata->mButtonName = is_option ? name : "";
-
- mBtnCallbackData.push_back(userdata);
-
- LLButton::Params p;
- p.name(name);
- p.label(label);
- p.rect(btn_rect);
- p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata));
- p.font(font);
- if (mIsCaution)
- {
- p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
- p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
- }
- btn = LLUICtrlFactory::create<LLButton>(p);
-
-
- mControlPanel->addChild(btn, -1);
-
- if (is_default)
- {
- setDefaultBtn(btn);
- }
-
- mNumButtons++;
- return btn;
+ // disable all buttons
+ self->mControlPanel->setEnabled(FALSE);
}
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index 66534edcdf..e791eea469 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -35,13 +35,14 @@
#include "llpanel.h"
#include "llfontgl.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
#include "llbutton.h"
#include "lltoastpanel.h"
#include "lliconctrl.h"
#include "lltexteditor.h"
#include "lltextbox.h"
+class LLNotificationForm;
/**
* Toast panel for notification.
@@ -54,9 +55,10 @@ class LLToastNotifyPanel: public LLToastPanel
public:
LLToastNotifyPanel(LLNotificationPtr&);
virtual ~LLToastNotifyPanel();
+ LLPanel * getControlPanel() { return mControlPanel; }
protected:
- LLButton* addButton(std::string const &name, const std::string& label, BOOL is_option, BOOL is_default);
+ LLButton* createButton(const LLSD& form_element, BOOL is_option);
// Used for callbacks
struct InstanceAndS32
@@ -68,12 +70,20 @@ protected:
private:
- void adjustPanelForScriptNotice(const LLNotificationFormPtr form);
+ typedef std::pair<int,LLButton*> index_button_pair_t;
+ void adjustPanelForScriptNotice(S32 max_width, S32 max_height);
void adjustPanelForTipNotice();
+ void addDefaultButton();
+ /*
+ * It lays out buttons of the notification in mControlPanel.
+ * Buttons will be placed from BOTTOM to TOP.
+ * @param h_pad horizontal space between buttons. It is depent on number of buttons.
+ * @param buttons vector of button to be added.
+ */
+ void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad);
// panel elements
LLTextBase* mTextBox;
- LLIconCtrl* mIcon;
LLPanel* mInfoPanel; // a panel, that contains an information
LLPanel* mControlPanel; // a panel, that contains buttons (if present)
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index ef75e06047..755e647777 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -34,6 +34,8 @@
#include "lltoastpanel.h"
+#include "llnotifications.h"
+
//static
const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32)
@@ -46,12 +48,19 @@ LLToastPanel::~LLToastPanel()
{
}
+//virtual
std::string LLToastPanel::getTitle()
{
// *TODO: create Title and localize it. If it will be required.
return mNotification->getMessage();
}
+//virtual
+const LLUUID& LLToastPanel::getID()
+{
+ return mNotification->id();
+}
+
//snap to the message height if it is visible
void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
{
@@ -71,7 +80,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
//Knowing the height is set to max allowed, getTextPixelHeight returns needed text height
//Perhaps we need to pass maxLineCount as parameter to getTextPixelHeight to avoid previous reshape.
- S32 requiredTextHeight = message->getContentsRect().getHeight();
+ S32 requiredTextHeight = message->getTextBoundingRect().getHeight();
S32 newTextHeight = llmin(requiredTextHeight, maxTextHeight);
//Calculate last delta height deducting previous heightDelta
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index a88127b008..f1dd7d7a86 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -35,7 +35,7 @@
#include "llpanel.h"
#include "lltextbox.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
#include <string>
@@ -57,7 +57,7 @@ public:
virtual ~LLToastPanel() = 0;
virtual std::string getTitle();
- virtual const LLUUID& getID() { return mNotification->id();}
+ virtual const LLUUID& getID();
static const S32 MIN_PANEL_HEIGHT;
protected:
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
index 0572f9a698..404eab9249 100644
--- a/indra/newview/lltoolbar.cpp
+++ b/indra/newview/lltoolbar.cpp
@@ -54,12 +54,12 @@
#include "lltooldraganddrop.h"
#include "llfloaterinventory.h"
#include "llfloaterchatterbox.h"
-#include "llfloaterfriends.h"
#include "llfloatersnapshot.h"
+#include "llinventorypanel.h"
#include "lltoolmgr.h"
#include "llui.h"
#include "llviewermenu.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llpanelblockedlist.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -69,8 +69,6 @@
#include "llviewerwindow.h"
#include "lltoolgrab.h"
#include "llcombobox.h"
-#include "llfloaterchat.h"
-#include "llimpanel.h"
#include "lllayoutstack.h"
#if LL_DARWIN
@@ -95,7 +93,10 @@ F32 LLToolBar::sInventoryAutoOpenTime = 1.f;
//
LLToolBar::LLToolBar()
-: LLPanel()
+ : LLPanel(),
+
+ mInventoryAutoOpen(FALSE),
+ mNumUnreadIMs(0)
#if LL_DARWIN
, mResizeHandle(NULL)
#endif // LL_DARWIN
@@ -157,12 +158,11 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
if (!inventory_btn) return FALSE;
- LLFloaterInventory* active_inventory = LLFloaterInventory::getActiveInventory();
-
LLRect button_screen_rect;
inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
-
- if(active_inventory && active_inventory->getVisible())
+
+ const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
{
mInventoryAutoOpen = FALSE;
}
@@ -170,8 +170,8 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
if (mInventoryAutoOpen)
{
- if (!(active_inventory && active_inventory->getVisible()) &&
- mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
+ if (!active_panel &&
+ mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
{
LLFloaterInventory::showAgentInventory();
}
@@ -206,7 +206,7 @@ void LLToolBar::layoutButtons()
{
#if LL_DARWIN
const S32 FUDGE_WIDTH_OF_SCREEN = 4;
- S32 width = gViewerWindow->getWindowWidth() + FUDGE_WIDTH_OF_SCREEN;
+ S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;
S32 pad = 2;
// this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
@@ -263,12 +263,12 @@ void LLToolBar::updateCommunicateList()
communicate_button->removeall();
- LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
+ //LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
LLScrollListItem* itemp = NULL;
LLSD contact_sd;
contact_sd["value"] = "contacts";
- contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();
+ /*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();
if (LLFloaterMyFriends::getInstance() == frontmost_floater)
{
contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
@@ -278,24 +278,9 @@ void LLToolBar::updateCommunicateList()
{
selected = "contacts";
}
- }
+ }*/
itemp = communicate_button->addElement(contact_sd, ADD_TOP);
- LLSD communicate_sd;
- communicate_sd["value"] = "local chat";
- communicate_sd["columns"][0]["value"] = LLFloaterChat::getInstance()->getShortTitle();
-
- if (LLFloaterChat::getInstance() == frontmost_floater)
- {
- communicate_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- communicate_sd["columns"][0]["font"]["style"] = "BOLD";
- if (selected.isUndefined())
- {
- selected = "local chat";
- }
- }
- itemp = communicate_button->addElement(communicate_sd, ADD_TOP);
-
communicate_button->addSeparator(ADD_TOP);
communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
communicate_button->addSeparator(ADD_TOP);
@@ -303,7 +288,7 @@ void LLToolBar::updateCommunicateList()
std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
- if (gIMMgr->getIMFloaterHandles().size() > 0)
+ /*if (gIMMgr->getIMFloaterHandles().size() > 0)
{
communicate_button->addSeparator(ADD_TOP);
}
@@ -329,7 +314,7 @@ void LLToolBar::updateCommunicateList()
}
itemp = communicate_button->addElement(im_sd, ADD_TOP);
}
- }
+ }*/
communicate_button->setValue(selected);
}
@@ -353,12 +338,11 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
}
else if (selected_option.asString() == "redock")
{
- LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
+ /*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
if(chatterbox_instance)
{
chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE);
- chatterbox_instance->addFloater(LLFloaterChat::getInstance(), FALSE);
-
+
LLUUID session_to_show;
std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
@@ -375,7 +359,7 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
}
}
LLFloaterReg::showInstance("communicate", session_to_show);
- }
+ }*/
}
else if (selected_option.asString() == "mute list")
{
@@ -383,11 +367,11 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
}
else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle
{
- LLFloaterReg::toggleInstance("communicate");
+ /*LLFloaterReg::toggleInstance("communicate");*/
}
else // otherwise selection_option is undifined or a specific IM session id
{
- LLFloaterReg::showInstance("communicate", selected_option);
+ /*LLFloaterReg::showInstance("communicate", selected_option);*/
}
}
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 0088a6a2a4..3593064bef 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -35,9 +35,10 @@
#include "lltoolbrush.h"
#include "lltoolselectland.h"
+// library headers
#include "llgl.h"
+#include "llnotificationsutil.h"
#include "llrender.h"
-
#include "message.h"
#include "llagent.h"
@@ -672,7 +673,7 @@ void LLToolBrushLand::alertNoTerraform(LLViewerRegion* regionp)
LLSD args;
args["REGION"] = regionp->getName();
- LLNotifications::instance().add("RegionNoTerraforming", args);
+ LLNotificationsUtil::add("RegionNoTerraforming", args);
}
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 9a63f07a7e..125c62474e 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -31,50 +31,37 @@
*/
#include "llviewerprecompiledheaders.h"
-
-#include "message.h"
#include "lltooldraganddrop.h"
-#include "llfloaterreg.h"
-#include "llinstantmessage.h"
-#include "lldir.h"
-
+// library headers
+#include "llnotificationsutil.h"
+// project headers
#include "llagent.h"
+#include "llagentui.h"
#include "llagentwearables.h"
-#include "llviewercontrol.h"
-#include "llfirstuse.h"
-#include "llfloater.h"
+#include "llappearancemgr.h"
+#include "lldictionary.h"
+//#include "llfirstuse.h"
+#include "llfloaterreg.h"
#include "llfloatertools.h"
-#include "llfocusmgr.h"
#include "llgesturemgr.h"
-#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llhudeffecttrail.h"
+#include "llimview.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
#include "llmutelist.h"
-#include "llnotify.h"
#include "llpreviewnotecard.h"
#include "llrecentpeople.h"
+#include "llrootview.h"
#include "llselectmgr.h"
#include "lltoolmgr.h"
#include "lltooltip.h"
#include "lltrans.h"
-#include "llui.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llviewerobject.h"
#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
-#include "llvolume.h"
#include "llworld.h"
-#include "object_flags.h"
-#include "llimview.h"
-#include "llrootview.h"
-#include "llagentui.h"
-#include "llappearancemgr.h"
// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES
// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
@@ -92,7 +79,7 @@ public:
virtual bool operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
- if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE))
+ if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
{
return true;
}
@@ -109,7 +96,7 @@ public:
LLInventoryItem* item)
{
if(item) return true;
- if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE))
+ if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
{
return true;
}
@@ -355,134 +342,51 @@ void LLCategoryDropDescendentsObserver::done()
delete this;
}
-// This array is used to more easily control what happens when a 3d
-// drag and drop event occurs. Since there's an array of drop target
-// and cargo type, it's implemented as an array of pointers to member
-// functions which correctly carry out the actual drop.
-LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::sDragAndDrop3d[DAD_COUNT][LLToolDragAndDrop::DT_COUNT] =
-{
- // Source: DAD_NONE
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_TEXTURE
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dTextureObject, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_SOUND
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CALLINGCARD
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_LANDMARK
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_SCRIPT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dRezScript, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CLOTHING
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_OBJECT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dRezAttachmentFromInv, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventoryObject, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dRezObjectOnObject, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dRezObjectOnLand, // Dest: DT_LAND
- },
- // Source: DAD_NOTECARD
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CATEGORY
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearCategory, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventoryCategory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventoryCategory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dCategoryOnLand, // Dest: DT_LAND
- },
- // Source: DAD_ROOT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_BODYPART
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_ANIMATION
- // TODO: animation on self could play it? edit it?
+LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none,
+ dragOrDrop3dImpl f_self,
+ dragOrDrop3dImpl f_avatar,
+ dragOrDrop3dImpl f_object,
+ dragOrDrop3dImpl f_land) :
+ LLDictionaryEntry("")
+{
+ mFunctions[DT_NONE] = f_none;
+ mFunctions[DT_SELF] = f_self;
+ mFunctions[DT_AVATAR] = f_avatar;
+ mFunctions[DT_OBJECT] = f_object;
+ mFunctions[DT_LAND] = f_land;
+}
+
+LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::get(EDragAndDropType dad_type, LLToolDragAndDrop::EDropTarget drop_target)
+{
+ const DragAndDropEntry *entry = lookup(dad_type);
+ if (entry)
{
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_GESTURE
+ return (entry->mFunctions[(U8)drop_target]);
+ }
+ return &LLToolDragAndDrop::dad3dNULL;
+}
+
+LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
+{
+ // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
+ // |--------------|---------------------------|---------------------------|-------------------------------|--------------|
+ addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
+ addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory,&LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ // TODO: animation on self could play it? edit it?
// TODO: gesture on self could play it? edit it?
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dActivateGesture, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_LINK
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
};
LLToolDragAndDrop::LLToolDragAndDrop()
@@ -868,6 +772,9 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
{
LLInventoryObject* cargo = locateInventory(item, cat);
+ // fix for EXT-3191
+ if (NULL == cargo) return;
+
EAcceptance item_acceptance = ACCEPT_NO;
handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE,
mCargoTypes[mCurItemIndex],
@@ -925,7 +832,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep
if (mDrop)
{
// don't allow drag and drop onto transparent objects
- pickCallback(gViewerWindow->pickImmediate(x, y, FALSE));
+ pick(gViewerWindow->pickImmediate(x, y, FALSE));
}
else
{
@@ -938,6 +845,14 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep
void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
{
+ if (getInstance() != NULL)
+ {
+ getInstance()->pick(pick_info);
+ }
+}
+
+void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
+{
EDropTarget target = DT_NONE;
S32 hit_face = -1;
@@ -945,31 +860,30 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
LLSelectMgr::getInstance()->unhighlightAll();
// Treat attachments as part of the avatar they are attached to.
- if (hit_obj)
+ if (hit_obj != NULL)
{
// don't allow drag and drop on grass, trees, etc.
- if(pick_info.mPickType == LLPickInfo::PICK_FLORA)
+ if (pick_info.mPickType == LLPickInfo::PICK_FLORA)
{
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO;
- gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor );
+ mCursor = UI_CURSOR_NO;
+ gViewerWindow->getWindow()->setCursor( mCursor );
return;
}
- if(hit_obj->isAttachment() && !hit_obj->isHUDAttachment())
+ if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment())
{
LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj );
if( !avatar )
{
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO;
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO;
- gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor );
+ mLastAccept = ACCEPT_NO;
+ mCursor = UI_CURSOR_NO;
+ gViewerWindow->getWindow()->setCursor( mCursor );
return;
}
-
hit_obj = avatar;
}
- if(hit_obj->isAvatar())
+ if (hit_obj->isAvatar())
{
if(((LLVOAvatar*) hit_obj)->isSelf())
{
@@ -988,9 +902,9 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
hit_face = pick_info.mObjectFace;
// if any item being dragged will be applied to the object under our cursor
// highlight that object
- for (S32 i = 0; i < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); i++)
+ for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
{
- if (LLToolDragAndDrop::getInstance()->mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
+ if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
{
LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
break;
@@ -998,55 +912,54 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
}
}
}
- else if(pick_info.mPickType == LLPickInfo::PICK_LAND)
+ else if (pick_info.mPickType == LLPickInfo::PICK_LAND)
{
target = DT_LAND;
hit_face = -1;
}
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_YES_MULTI;
+ mLastAccept = ACCEPT_YES_MULTI;
- for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
- LLToolDragAndDrop::getInstance()->mCurItemIndex++)
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
+ const S32 item_index = mCurItemIndex;
+ const EDragAndDropType dad_type = mCargoTypes[item_index];
// Call the right implementation function
- LLToolDragAndDrop::getInstance()->mLastAccept = (EAcceptance)llmin(
- (U32)LLToolDragAndDrop::getInstance()->mLastAccept,
- (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
- LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
- (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
+ mLastAccept = (EAcceptance)llmin(
+ (U32)mLastAccept,
+ (U32)callMemberFunction(*this,
+ LLDragAndDropDictionary::instance().get(dad_type, target))
+ (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
}
- if (LLToolDragAndDrop::getInstance()->mDrop &&
- (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE)
+ if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE))
{
// if target allows multi-drop or there is only one item being dropped, go ahead
- if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI ||
- LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1)
+ if ((mLastAccept >= ACCEPT_YES_COPY_MULTI) || (mCargoIDs.size() == 1))
{
// Target accepts multi, or cargo is a single-drop
- for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0;
- LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
- LLToolDragAndDrop::getInstance()->mCurItemIndex++)
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
+ const S32 item_index = mCurItemIndex;
+ const EDragAndDropType dad_type = mCargoTypes[item_index];
// Call the right implementation function
- (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
- LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
+ (U32)callMemberFunction(*this,
+ LLDragAndDropDictionary::instance().get(dad_type, target))
(hit_obj, hit_face, pick_info.mKeyMask, TRUE);
}
}
else
{
// Target does not accept multi, but cargo is multi
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO;
+ mLastAccept = ACCEPT_NO;
}
}
- ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept );
+ ECursorType cursor = acceptanceToCursor( mLastAccept );
gViewerWindow->getWindow()->setCursor( cursor );
- LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal;
- LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal();
+ mLastHitPos = pick_info.mPosGlobal;
+ mLastCameraPos = gAgent.getCameraPositionGlobal();
}
// static
@@ -1071,7 +984,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
hit_obj->fetchInventoryFromServer();
LLSD args;
args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again.";
- LLNotifications::instance().add("ErrorMessage", args);
+ LLNotificationsUtil::add("ErrorMessage", args);
return FALSE;
}
if (hit_obj->getInventoryItemByAsset(item->getAssetUUID()))
@@ -1286,11 +1199,11 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
locateInventory(item, cat);
if(!item || !item->isComplete()) return;
- if (regionp
- && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX))
- {
- LLFirstUse::useSandbox();
- }
+ //if (regionp
+ // && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX))
+ //{
+ // LLFirstUse::useSandbox();
+ //}
// check if it cannot be copied, and mark as remove if it is -
// this will remove the object from inventory after rez. Only
// bother with this check if we would not normally remove from
@@ -1317,8 +1230,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// Check if it's in the trash.
bool is_in_trash = false;
- LLUUID trash_id;
- trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
is_in_trash = true;
@@ -1492,18 +1404,6 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
gFloaterTools->dirty();
}
-struct LLGiveInventoryInfo
-{
- LLUUID mToAgentID;
- LLUUID mInventoryObjectID;
- LLUUID mIMSessionID;
- LLGiveInventoryInfo(const LLUUID& to_agent, const LLUUID& obj_id, const LLUUID &im_session_id = LLUUID::null) :
- mToAgentID(to_agent),
- mInventoryObjectID(obj_id),
- mIMSessionID(im_session_id)
- {}
-};
-
void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
LLInventoryItem* item,
const LLUUID& im_session_id)
@@ -1525,14 +1425,14 @@ void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
LLSD payload;
payload["agent_id"] = to_agent;
payload["item_id"] = item->getUUID();
- LLNotifications::instance().add("CannotCopyWarning", LLSD(), payload,
+ LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload,
&LLToolDragAndDrop::handleCopyProtectedItem);
}
}
// static
bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryItem* item = NULL;
switch(option)
{
@@ -1549,12 +1449,12 @@ bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const
}
else
{
- LLNotifications::instance().add("CannotGiveItem");
+ LLNotificationsUtil::add("CannotGiveItem");
}
break;
default: // no, cancel, whatever, who cares, not yes.
- LLNotifications::instance().add("TransactionCancelled");
+ LLNotificationsUtil::add("TransactionCancelled");
break;
}
return false;
@@ -1650,18 +1550,18 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
}
if(!complete)
{
- LLNotifications::instance().add("IncompleteInventory");
+ LLNotificationsUtil::add("IncompleteInventory");
return;
}
count = items.count() + cats.count();
if(count > MAX_ITEMS)
{
- LLNotifications::instance().add("TooManyItems");
+ LLNotificationsUtil::add("TooManyItems");
return;
}
else if(count == 0)
{
- LLNotifications::instance().add("NoItems");
+ LLNotificationsUtil::add("NoItems");
return;
}
else
@@ -1672,14 +1572,12 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
}
else
{
- LLGiveInventoryInfo* info = NULL;
- info = new LLGiveInventoryInfo(to_agent, cat->getUUID(), im_session_id);
LLSD args;
args["COUNT"] = llformat("%d",giveable.countNoCopy());
LLSD payload;
payload["agent_id"] = to_agent;
payload["folder_id"] = cat->getUUID();
- LLNotifications::instance().add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);
+ LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);
}
}
}
@@ -1688,7 +1586,7 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
// static
bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryCategory* cat = NULL;
switch(option)
{
@@ -1715,12 +1613,12 @@ bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, co
}
else
{
- LLNotifications::instance().add("CannotGiveCategory");
+ LLNotificationsUtil::add("CannotGiveCategory");
}
break;
default: // no, cancel, whatever, who cares, not yes.
- LLNotifications::instance().add("TransactionCancelled");
+ LLNotificationsUtil::add("TransactionCancelled");
break;
}
return false;
@@ -1755,12 +1653,12 @@ void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent,
S32 count = items.count() + cats.count();
if(count > MAX_ITEMS)
{
- LLNotifications::instance().add("TooManyItems");
+ LLNotificationsUtil::add("TooManyItems");
return;
}
else if(count == 0)
{
- LLNotifications::instance().add("NoItems");
+ LLNotificationsUtil::add("NoItems");
return;
}
else
@@ -1921,10 +1819,11 @@ BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item)
EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)
{
// check the basics
- if(!item || !obj) return ACCEPT_NO;
+ if (!item || !obj) return ACCEPT_NO;
// HACK: downcast
LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item;
- if(!vitem->isComplete()) return ACCEPT_NO;
+ if (!vitem->isComplete()) return ACCEPT_NO;
+ if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links
// deny attempts to drop from an object onto itself. This is to
// help make sure that drops that are from an object to an object
@@ -1934,7 +1833,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
{
return ACCEPT_NO;
}
-
+
//BOOL copy = (perm.allowCopyBy(gAgent.getID(),
// gAgent.getGroupID())
// && (obj->mPermModify || obj->mFlagAllowInventoryAdd));
@@ -2088,7 +1987,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
if(!item || !item->isComplete()) return ACCEPT_NO;
// must not be in the trash
- LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
@@ -2170,8 +2069,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
}
// Check if it's in the trash.
- LLUUID trash_id;
- trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
@@ -2249,8 +2147,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
}
// Check if it's in the trash.
- LLUUID trash_id;
- trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
@@ -2388,7 +2285,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
- LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
@@ -2400,7 +2297,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
// destroy clothing items.
if (!gAgentWearables.areWearablesLoaded())
{
- LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return ACCEPT_NO;
}
@@ -2443,7 +2340,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
- LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
@@ -2495,14 +2392,14 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
// destroy clothing items.
if (!gAgentWearables.areWearablesLoaded())
{
- LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return ACCEPT_NO;
}
}
if(mSource == SOURCE_AGENT)
{
- LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )
{
return ACCEPT_NO;
@@ -2511,7 +2408,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
if(drop)
{
BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
- LLAppearanceManager::wearInventoryCategory(category, false, append);
+ LLAppearanceManager::instance().wearInventoryCategory(category, false, append);
}
return ACCEPT_YES_MULTI;
}
@@ -2519,7 +2416,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
{
if(drop)
{
- LLAppearanceManager::wearInventoryCategory(category, true, false);
+ LLAppearanceManager::instance().wearInventoryCategory(category, true, false);
}
return ACCEPT_YES_MULTI;
}
@@ -2575,24 +2472,30 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl;
- if (NULL==obj)
+ if (obj == NULL)
{
llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl;
return ACCEPT_NO;
}
- if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
+ if ((mSource != SOURCE_AGENT) && (mSource != SOURCE_LIBRARY))
{
return ACCEPT_NO;
}
- if(obj->isAttachment()) return ACCEPT_NO_LOCKED;
- LLViewerInventoryItem* item;
- LLViewerInventoryCategory* cat;
+ if (obj->isAttachment())
+ {
+ return ACCEPT_NO_LOCKED;
+ }
+
+ LLViewerInventoryItem* item = NULL;
+ LLViewerInventoryCategory* cat = NULL;
locateInventory(item, cat);
- if(!cat) return ACCEPT_NO;
- EAcceptance rv = ACCEPT_NO;
+ if (!cat)
+ {
+ return ACCEPT_NO;
+ }
- // find all the items in the category
+ // Find all the items in the category
LLDroppableItem droppable(!obj->permYouOwner());
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -2602,7 +2505,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLInventoryModel::EXCLUDE_TRASH,
droppable);
cats.put(cat);
- if(droppable.countNoCopy() > 0)
+ if (droppable.countNoCopy() > 0)
{
llwarns << "*** Need to confirm this step" << llendl;
}
@@ -2616,46 +2519,57 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
}
}
+ EAcceptance rv = ACCEPT_NO;
+
// Check for accept
- S32 i;
- S32 count = cats.count();
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin();
+ cat_iter != cats.end();
+ ++cat_iter)
{
- rv = gInventory.isCategoryComplete(cats.get(i)->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
+ const LLViewerInventoryCategory *cat = (*cat_iter);
+ rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
if(rv < ACCEPT_YES_SINGLE)
{
- lldebugs << "Category " << cats.get(i)->getUUID()
- << "is not complete." << llendl;
+ lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;
break;
}
}
- if(ACCEPT_YES_COPY_SINGLE <= rv)
+ if (ACCEPT_YES_COPY_SINGLE <= rv)
{
- count = items.count();
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- rv = willObjectAcceptInventory(root_object, items.get(i));
- if(rv < ACCEPT_YES_COPY_SINGLE)
+ LLViewerInventoryItem *item = (*item_iter);
+ /*
+ // Pass the base objects, not the links.
+ if (item && item->getIsLinkType())
{
- lldebugs << "Object will not accept "
- << items.get(i)->getUUID() << llendl;
+ item = item->getLinkedItem();
+ (*item_iter) = item;
+ }
+ */
+ rv = willObjectAcceptInventory(root_object, item);
+ if (rv < ACCEPT_YES_COPY_SINGLE)
+ {
+ lldebugs << "Object will not accept " << item->getUUID() << llendl;
break;
}
}
}
- // if every item is accepted, go ahead and send it on.
- if(drop && (ACCEPT_YES_COPY_SINGLE <= rv))
+ // If every item is accepted, send it on
+ if (drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
- S32 count = items.count();
LLInventoryFetchObserver::item_ref_t ids;
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- //dropInventory(root_object, items.get(i), mSource, mSourceID);
- ids.push_back(items.get(i)->getUUID());
+ const LLViewerInventoryItem *item = (*item_iter);
+ ids.push_back(item->getUUID());
}
- LLCategoryDropObserver* dropper;
- dropper = new LLCategoryDropObserver(obj->getID(), mSource);
+ LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource);
dropper->fetchItems(ids);
if(dropper->isEverythingComplete())
{
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index e1536acf75..79b2bc32a3 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -33,6 +33,7 @@
#ifndef LL_TOOLDRAGANDDROP_H
#define LL_TOOLDRAGANDDROP_H
+#include "lldictionary.h"
#include "lltool.h"
#include "llview.h"
#include "lluuid.h"
@@ -102,6 +103,7 @@ protected:
DT_COUNT = 5
};
+protected:
// dragOrDrop3dImpl points to a member of LLToolDragAndDrop that
// takes parameters (LLViewerObject* obj, S32 face, MASK, BOOL
// drop) and returns a BOOL if drop is ok
@@ -112,7 +114,9 @@ protected:
EAcceptance* acceptance);
void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop,
EAcceptance* acceptance);
+
static void pickCallback(const LLPickInfo& pick_info);
+ void pick(const LLPickInfo& pick_info);
protected:
@@ -137,10 +141,6 @@ protected:
enddrag_signal_t mEndDragSignal;
- // array of pointers to functions that implement the logic to
- // dragging and dropping into the simulator.
- static dragOrDrop3dImpl sDragAndDrop3d[DAD_COUNT][DT_COUNT];
-
protected:
// 3d drop functions. these call down into the static functions
// named drop<ThingToDrop> if drop is TRUE and permissions allow
@@ -272,6 +272,25 @@ public:
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept);
+
+ // Classes used for determining 3d drag and drop types.
+private:
+ struct DragAndDropEntry : public LLDictionaryEntry
+ {
+ DragAndDropEntry(dragOrDrop3dImpl f_none,
+ dragOrDrop3dImpl f_self,
+ dragOrDrop3dImpl f_avatar,
+ dragOrDrop3dImpl f_object,
+ dragOrDrop3dImpl f_land);
+ dragOrDrop3dImpl mFunctions[DT_COUNT];
+ };
+ class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>,
+ public LLDictionary<EDragAndDropType, DragAndDropEntry>
+ {
+ public:
+ LLDragAndDropDictionary();
+ dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target);
+ };
};
// utility functions
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index 9400840bdf..2320ae57df 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -365,7 +365,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
// Orbit tool
if (hasMouseCapture())
{
- const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth();
+ const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled();
if (dx != 0)
{
@@ -393,7 +393,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
F32 dist = (F32) camera_to_focus.normVec();
// Fudge factor for pan
- F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidth();
+ F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidthScaled();
if (dx != 0)
{
@@ -415,7 +415,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
if (hasMouseCapture())
{
- const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth();
+ const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled();
if (dx != 0)
{
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index b7a97562bd..d837a334f1 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -78,9 +78,15 @@ LLToolGrab::LLToolGrab( LLToolComposite* composite )
: LLTool( std::string("Grab"), composite ),
mMode( GRAB_INACTIVE ),
mVerticalDragging( FALSE ),
+ mHitLand(FALSE),
+ mLastMouseX(0),
+ mLastMouseY(0),
+ mAccumDeltaX(0),
+ mAccumDeltaY(0),
mHasMoved( FALSE ),
mOutsideSlop(FALSE),
mDeselectedThisClick(FALSE),
+ mLastFace(0),
mSpinGrabbing( FALSE ),
mSpinRotation(),
mHideBuildHighlight(FALSE)
@@ -510,8 +516,8 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
const F32 RADIANS_PER_PIXEL_X = 0.01f;
const F32 RADIANS_PER_PIXEL_Y = 0.01f;
- S32 dx = x - (gViewerWindow->getWorldViewWidth() / 2);
- S32 dy = y - (gViewerWindow->getWorldViewHeight() / 2);
+ S32 dx = x - (gViewerWindow->getWorldViewWidthScaled() / 2);
+ S32 dy = y - (gViewerWindow->getWorldViewHeightScaled() / 2);
if (dx != 0 || dy != 0)
{
@@ -631,10 +637,10 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
// Handle auto-rotation at screen edge.
LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global );
- LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidth() / 2, gViewerWindow->getWorldViewHeight() / 2);
+ LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidthScaled() / 2, gViewerWindow->getWorldViewHeightScaled() / 2);
LLViewerCamera::getInstance()->projectPosAgentToScreen(grab_pos_agent, grab_center_gl);
- const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20;
+ const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidthScaled() / 20;
const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
// ...build mode moves camera about focus point
@@ -649,7 +655,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
gAgent.cameraOrbitAround(rotate_angle);
}
}
- else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN)
+ else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthScaled() - ROTATE_H_MARGIN)
{
if (gAgent.getFocusOnAvatar())
{
@@ -662,7 +668,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
}
// Don't move above top of screen or below bottom
- if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeight() - 6)
+ if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeightScaled() - 6)
&& (grab_center_gl.mY > 24))
{
// Transmit update to simulator
@@ -893,7 +899,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
gAgent.yaw(rotate_angle);
//gAgent.setControlFlags(AGENT_CONTROL_YAW_POS);
}
- else if (x == (gViewerWindow->getWorldViewWidth() - 1) )
+ else if (x == (gViewerWindow->getWorldViewWidthScaled() - 1) )
{
gAgent.yaw(-rotate_angle);
//gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG);
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index 53d71a42cf..a441d653c7 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -140,7 +140,7 @@ void LLToolGun::draw()
{
LLUIImagePtr crosshair = LLUI::getUIImage("crosshairs.tga");
crosshair->draw(
- ( gViewerWindow->getVirtualWorldViewRect().getWidth() - crosshair->getWidth() ) / 2,
- ( gViewerWindow->getVirtualWorldViewRect().getHeight() - crosshair->getHeight() ) / 2);
+ ( gViewerWindow->getWorldViewRectScaled().getWidth() - crosshair->getWidth() ) / 2,
+ ( gViewerWindow->getWorldViewRectScaled().getHeight() - crosshair->getHeight() ) / 2);
}
}
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index ded83debad..fd12163fd3 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -38,7 +38,7 @@
#include "llmenugl.h"
#include "llfloaterreg.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
// tools and manipulators
#include "lltool.h"
#include "llmanipscale.h"
@@ -247,7 +247,7 @@ bool LLToolMgr::inEdit()
bool LLToolMgr::canEdit()
{
- return LLViewerParcelMgr::getInstance()->agentCanBuild();
+ return LLViewerParcelMgr::getInstance()->allowAgentBuild();
}
void LLToolMgr::toggleBuildMode()
@@ -301,7 +301,7 @@ void LLToolMgr::toggleBuildMode()
getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
// Could be first use
- LLFirstUse::useBuild();
+ //LLFirstUse::useBuild();
gAgent.resetView(false);
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index d7d7b5f44b..4fb75f7a49 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -146,8 +146,9 @@ void LLVisualParamHint::preRender(BOOL clear_depth)
{
LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
- mLastParamWeight = avatarp->getVisualParamWeight(mVisualParam);
- avatarp->setVisualParamWeight(mVisualParam, mVisualParamWeight);
+ mLastParamWeight = mVisualParam->getWeight();
+ mVisualParam->setWeight(mVisualParamWeight, FALSE);
+ avatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
avatarp->setVisualParamWeight("Blink_Left", 0.f);
avatarp->setVisualParamWeight("Blink_Right", 0.f);
avatarp->updateComposites();
@@ -242,7 +243,8 @@ BOOL LLVisualParamHint::render()
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
- avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight);
+ avatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight);
+ mVisualParam->setWeight(mLastParamWeight, FALSE);
gGL.color4f(1,1,1,1);
mGLTexturep->setGLTextureCreated(true);
return TRUE;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 7c17699bf9..fb78b6a415 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -41,7 +41,7 @@
#include "llagent.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloaterland.h"
#include "llfloaterreg.h"
#include "llfloaterscriptdebug.h"
@@ -101,16 +101,13 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
{
//left mouse down always picks transparent
- gViewerWindow->pickAsync(x, y, mask, leftMouseCallback, TRUE);
+ mPick = gViewerWindow->pickImmediate(x, y, TRUE);
+ mPick.mKeyMask = mask;
mGrabMouseButtonDown = TRUE;
- return TRUE;
-}
+
+ pickLeftMouseDownCallback();
-// static
-void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)
-{
- LLToolPie::getInstance()->mPick = pick_info;
- LLToolPie::getInstance()->pickLeftMouseDownCallback();
+ return TRUE;
}
// Spawn context menus on right mouse down so you can drag over and select
@@ -118,8 +115,13 @@ void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)
BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
// don't pick transparent so users can't "pay" transparent objects
- gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE);
+ mPick = gViewerWindow->pickImmediate(x, y, FALSE);
+ mPick.mKeyMask = mask;
+
// claim not handled so UI focus stays same
+
+ pickRightMouseDownCallback();
+
return FALSE;
}
@@ -134,13 +136,6 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
}
-// static
-void LLToolPie::rightMouseCallback(const LLPickInfo& pick_info)
-{
- LLToolPie::getInstance()->mPick = pick_info;
- LLToolPie::getInstance()->pickRightMouseDownCallback();
-}
-
// True if you selected an object.
BOOL LLToolPie::pickLeftMouseDownCallback()
{
@@ -209,6 +204,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
// touch behavior down below...
break;
case CLICK_ACTION_SIT:
+
if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting
{
handle_object_sit_or_stand();
@@ -252,7 +248,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
selectionPropertiesReceived();
}
}
- return TRUE;
+ return TRUE;
case CLICK_ACTION_PLAY:
handle_click_action_play();
return TRUE;
@@ -260,6 +256,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
// mClickActionObject = object;
handle_click_action_open_media(object);
return TRUE;
+ case CLICK_ACTION_ZOOM:
+ {
+ const F32 PADDING_FACTOR = 2.f;
+ LLViewerObject* object = gObjectList.findObject(mPick.mObjectID);
+
+ if (object)
+ {
+ gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+
+ LLBBox bbox = object->getBoundingBoxAgent() ;
+ F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
+ F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
+
+ LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent();
+ obj_to_cam.normVec();
+
+ LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+ gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ object_center_global,
+ mPick.mObjectID );
+ }
+ }
+ return TRUE;
default:
// nothing
break;
@@ -413,6 +432,9 @@ ECursorType cursor_from_object(LLViewerObject* object)
cursor = UI_CURSOR_HAND;
}
break;
+ case CLICK_ACTION_ZOOM:
+ cursor = UI_CURSOR_TOOLZOOMIN;
+ break;
case CLICK_ACTION_PLAY:
case CLICK_ACTION_OPEN_MEDIA:
cursor = cursor_from_parcel_media(click_action);
@@ -494,6 +516,8 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
}
else if (handleMediaHover(mHoverPick))
{
+ // *NOTE: If you think the hover glow conflicts with the media outline, you
+ // could disable it here.
show_highlight = true;
// cursor set by media object
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
@@ -524,7 +548,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
}
static LLCachedControl<bool> enable_highlight(
- gSavedSettings, "RenderHighlightEnable", false);
+ gSavedSettings, "RenderHoverGlowEnable", false);
LLDrawable* drawable = NULL;
if (enable_highlight && show_highlight && object)
{
@@ -549,6 +573,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
case CLICK_ACTION_BUY:
case CLICK_ACTION_PAY:
case CLICK_ACTION_OPEN:
+ case CLICK_ACTION_ZOOM:
+ case CLICK_ACTION_PLAY:
+ case CLICK_ACTION_OPEN_MEDIA:
// Because these actions open UI dialogs, we won't change
// the cursor again until the next hover and GL pick over
// the world. Keep the cursor an arrow, assuming that
@@ -598,6 +625,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
static bool needs_tooltip(LLSelectNode* nodep)
{
+ if (!nodep)
+ return false;
+
LLViewerObject* object = nodep->getObject();
LLViewerObject *parent = (LLViewerObject *)object->getParent();
if (object->flagHandleTouch()
@@ -628,285 +658,360 @@ static bool needs_tooltip(LLSelectNode* nodep)
return false;
}
-BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
-{
- if (!LLUI::sSettingGroups["config"]->getBOOL("ShowHoverTips")) return TRUE;
- if (!mHoverPick.isValid()) return TRUE;
-
- LLViewerObject* hover_object = mHoverPick.getObject();
- // update hover object and hover parcel
- LLSelectMgr::getInstance()->setHoverObject(hover_object, mHoverPick.mObjectFace);
-
- if (mHoverPick.mPickType == LLPickInfo::PICK_LAND)
+BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg)
+{
+ LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal );
+ //
+ // Do not show hover for land unless prefs are set to allow it.
+ //
+
+ if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE;
+
+ // Didn't hit an object, but since we have a land point we
+ // must be hovering over land.
+
+ LLParcel* hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
+ LLUUID owner;
+ S32 width = 0;
+ S32 height = 0;
+
+ if ( hover_parcel )
{
- LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal );
+ owner = hover_parcel->getOwnerID();
+ width = S32(LLViewerParcelMgr::getInstance()->getHoverParcelWidth());
+ height = S32(LLViewerParcelMgr::getInstance()->getHoverParcelHeight());
}
-
- std::string tooltip_msg;
- std::string line;
-
- if ( hover_object )
+
+ // Line: "Land"
+ line.clear();
+ line.append(LLTrans::getString("TooltipLand"));
+ if (hover_parcel)
{
- if ( hover_object->isHUDAttachment() )
+ line.append(hover_parcel->getName());
+ }
+ tooltip_msg.append(line);
+ tooltip_msg.push_back('\n');
+
+ // Line: "Owner: James Linden"
+ line.clear();
+ line.append(LLTrans::getString("TooltipOwner") + " ");
+
+ if ( hover_parcel )
+ {
+ std::string name;
+ if (LLUUID::null == owner)
{
- // no hover tips for HUD elements, since they can obscure
- // what the HUD is displaying
- return TRUE;
+ line.append(LLTrans::getString("TooltipPublic"));
}
-
- if ( hover_object->isAttachment() )
+ else if (hover_parcel->getIsGroupOwned())
{
- // get root of attachment then parent, which is avatar
- LLViewerObject* root_edit = hover_object->getRootEdit();
- if (!root_edit)
+ if (gCacheName->getGroupName(owner, name))
{
- // Strange parenting issue, don't show any text
- return TRUE;
+ line.append(name);
+ line.append(LLTrans::getString("TooltipIsGroup"));
}
- hover_object = (LLViewerObject*)root_edit->getParent();
- if (!hover_object)
+ else
{
- // another strange parenting issue, bail out
- return TRUE;
+ line.append(LLTrans::getString("RetrievingData"));
}
}
-
- line.clear();
- if (hover_object->isAvatar())
+ else if(gCacheName->getFullName(owner, name))
{
- // only show tooltip if same inspector not already open
- LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_avatar");
- if (!existing_inspector
- || !existing_inspector->getVisible()
- || existing_inspector->getKey()["avatar_id"].asUUID() != hover_object->getID())
- {
- std::string avatar_name;
- LLNameValue* firstname = hover_object->getNVPair("FirstName");
- LLNameValue* lastname = hover_object->getNVPair("LastName");
- if (firstname && lastname)
- {
- avatar_name = llformat("%s %s", firstname->getString(), lastname->getString());
- }
- else
- {
- avatar_name = LLTrans::getString("TooltipPerson");
- }
-
- // *HACK: We may select this object, so pretend it was clicked
- mPick = mHoverPick;
- LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(avatar_name)
- .image(LLUI::getUIImage("Info"))
- .click_callback(boost::bind(showAvatarInspector, hover_object->getID()))
- .visible_time_near(6.f)
- .visible_time_far(3.f)
- .wrap(false));
- }
+ line.append(name);
}
else
{
- //
- // We have hit a regular object (not an avatar or attachment)
- //
-
- //
- // Default prefs will suppress display unless the object is interactive
- //
- bool show_all_object_tips =
- (bool)gSavedSettings.getBOOL("ShowAllObjectHoverTip");
- LLSelectNode *nodep = LLSelectMgr::getInstance()->getHoverNode();
-
- // only show tooltip if same inspector not already open
- LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_object");
- if (nodep &&
- (!existing_inspector
- || !existing_inspector->getVisible()
- || existing_inspector->getKey()["object_id"].asUUID() != hover_object->getID()))
- {
- if (nodep->mName.empty())
- {
- tooltip_msg.append(LLTrans::getString("TooltipNoName"));
- }
- else
- {
- tooltip_msg.append( nodep->mName );
- }
-
- bool needs_tip = needs_tooltip(nodep);
-
- if (show_all_object_tips || needs_tip)
- {
- // We may select this object, so pretend it was clicked
- mPick = mHoverPick;
- LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(tooltip_msg)
- .image(LLUI::getUIImage("Info"))
- .click_callback(boost::bind(showObjectInspector, hover_object->getID()))
- .visible_time_near(6.f)
- .visible_time_far(3.f)
- .wrap(false));
- }
- }
+ line.append(LLTrans::getString("RetrievingData"));
}
}
- else if ( mHoverPick.mPickType == LLPickInfo::PICK_LAND )
+ else
{
- //
- // Do not show hover for land unless prefs are set to allow it.
- //
+ line.append(LLTrans::getString("RetrievingData"));
+ }
+ tooltip_msg.append(line);
+ tooltip_msg.push_back('\n');
+
+ // Line: "no fly, not safe, no build"
+
+ // Don't display properties for your land. This is just
+ // confusing, because you can do anything on your own land.
+ if ( hover_parcel && owner != gAgent.getID() )
+ {
+ S32 words = 0;
- if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE;
-
- // Didn't hit an object, but since we have a land point we
- // must be hovering over land.
-
- LLParcel* hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
- LLUUID owner;
- S32 width = 0;
- S32 height = 0;
-
- if ( hover_parcel )
- {
- owner = hover_parcel->getOwnerID();
- width = S32(LLViewerParcelMgr::getInstance()->getHoverParcelWidth());
- height = S32(LLViewerParcelMgr::getInstance()->getHoverParcelHeight());
- }
-
- // Line: "Land"
- line.clear();
- line.append(LLTrans::getString("TooltipLand"));
- if (hover_parcel)
- {
- line.append(hover_parcel->getName());
- }
- tooltip_msg.append(line);
- tooltip_msg.push_back('\n');
-
- // Line: "Owner: James Linden"
line.clear();
- line.append(LLTrans::getString("TooltipOwner") + " ");
-
- if ( hover_parcel )
+ // JC - Keep this in the same order as the checkboxes
+ // on the land info panel
+ if ( !hover_parcel->getAllowModify() )
{
- std::string name;
- if (LLUUID::null == owner)
+ if ( hover_parcel->getAllowGroupModify() )
{
- line.append(LLTrans::getString("TooltipPublic"));
+ line.append(LLTrans::getString("TooltipFlagGroupBuild"));
}
- else if (hover_parcel->getIsGroupOwned())
+ else
{
- if (gCacheName->getGroupName(owner, name))
- {
- line.append(name);
- line.append(LLTrans::getString("TooltipIsGroup"));
- }
- else
- {
- line.append(LLTrans::getString("RetrievingData"));
- }
+ line.append(LLTrans::getString("TooltipFlagNoBuild"));
}
- else if(gCacheName->getFullName(owner, name))
+ words++;
+ }
+
+ if ( !hover_parcel->getAllowTerraform() )
+ {
+ if (words) line.append(", ");
+ line.append(LLTrans::getString("TooltipFlagNoEdit"));
+ words++;
+ }
+
+ if ( hover_parcel->getAllowDamage() )
+ {
+ if (words) line.append(", ");
+ line.append(LLTrans::getString("TooltipFlagNotSafe"));
+ words++;
+ }
+
+ // Maybe we should reflect the estate's block fly bit here as well? DK 12/1/04
+ if ( !hover_parcel->getAllowFly() )
+ {
+ if (words) line.append(", ");
+ line.append(LLTrans::getString("TooltipFlagNoFly"));
+ words++;
+ }
+
+ if ( !hover_parcel->getAllowOtherScripts() )
+ {
+ if (words) line.append(", ");
+ if ( hover_parcel->getAllowGroupScripts() )
{
- line.append(name);
+ line.append(LLTrans::getString("TooltipFlagGroupScripts"));
}
else
{
- line.append(LLTrans::getString("RetrievingData"));
+ line.append(LLTrans::getString("TooltipFlagNoScripts"));
}
+
+ words++;
}
- else
+
+ if (words)
{
- line.append(LLTrans::getString("RetrievingData"));
+ tooltip_msg.append(line);
+ tooltip_msg.push_back('\n');
}
+ }
+
+ if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE))
+ {
+ LLStringUtil::format_map_t args;
+ args["[AMOUNT]"] = llformat("%d", hover_parcel->getSalePrice());
+ line = LLTrans::getString("TooltipForSaleL$", args);
tooltip_msg.append(line);
tooltip_msg.push_back('\n');
+ }
+
+ // trim last newlines
+ if (!tooltip_msg.empty())
+ {
+ tooltip_msg.erase(tooltip_msg.size() - 1);
+ LLToolTipMgr::instance().show(tooltip_msg);
+ }
+
+ return TRUE;
+}
- // Line: "no fly, not safe, no build"
-
- // Don't display properties for your land. This is just
- // confusing, because you can do anything on your own land.
- if ( hover_parcel && owner != gAgent.getID() )
+BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg)
+{
+ if ( hover_object->isHUDAttachment() )
+ {
+ // no hover tips for HUD elements, since they can obscure
+ // what the HUD is displaying
+ return TRUE;
+ }
+
+ if ( hover_object->isAttachment() )
+ {
+ // get root of attachment then parent, which is avatar
+ LLViewerObject* root_edit = hover_object->getRootEdit();
+ if (!root_edit)
{
- S32 words = 0;
-
- line.clear();
- // JC - Keep this in the same order as the checkboxes
- // on the land info panel
- if ( !hover_parcel->getAllowModify() )
+ // Strange parenting issue, don't show any text
+ return TRUE;
+ }
+ hover_object = (LLViewerObject*)root_edit->getParent();
+ if (!hover_object)
+ {
+ // another strange parenting issue, bail out
+ return TRUE;
+ }
+ }
+
+ line.clear();
+ if (hover_object->isAvatar())
+ {
+ // only show tooltip if same inspector not already open
+ LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_avatar");
+ if (!existing_inspector
+ || !existing_inspector->getVisible()
+ || existing_inspector->getKey()["avatar_id"].asUUID() != hover_object->getID())
+ {
+ std::string avatar_name;
+ LLNameValue* firstname = hover_object->getNVPair("FirstName");
+ LLNameValue* lastname = hover_object->getNVPair("LastName");
+ if (firstname && lastname)
{
- if ( hover_parcel->getAllowGroupModify() )
- {
- line.append(LLTrans::getString("TooltipFlagGroupBuild"));
- }
- else
- {
- line.append(LLTrans::getString("TooltipFlagNoBuild"));
- }
- words++;
+ avatar_name = llformat("%s %s", firstname->getString(), lastname->getString());
}
-
- if ( !hover_parcel->getAllowTerraform() )
+ else
{
- if (words) line.append(", ");
- line.append(LLTrans::getString("TooltipFlagNoEdit"));
- words++;
+ avatar_name = LLTrans::getString("TooltipPerson");
}
-
- if ( hover_parcel->getAllowDamage() )
+
+ // *HACK: We may select this object, so pretend it was clicked
+ mPick = mHoverPick;
+ LLInspector::Params p;
+ p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ p.message(avatar_name);
+ p.image.name("Inspector_I");
+ p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
+ p.visible_time_near(6.f);
+ p.visible_time_far(3.f);
+ p.delay_time(0.35f);
+ p.wrap(false);
+
+ LLToolTipMgr::instance().show(p);
+ }
+ }
+ else
+ {
+ //
+ // We have hit a regular object (not an avatar or attachment)
+ //
+
+ //
+ // Default prefs will suppress display unless the object is interactive
+ //
+ bool show_all_object_tips =
+ (bool)gSavedSettings.getBOOL("ShowAllObjectHoverTip");
+ LLSelectNode *nodep = LLSelectMgr::getInstance()->getHoverNode();
+
+ // only show tooltip if same inspector not already open
+ LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_object");
+ if (nodep &&
+ (!existing_inspector
+ || !existing_inspector->getVisible()
+ || existing_inspector->getKey()["object_id"].asUUID() != hover_object->getID()))
+ {
+ if (nodep->mName.empty())
{
- if (words) line.append(", ");
- line.append(LLTrans::getString("TooltipFlagNotSafe"));
- words++;
+ tooltip_msg.append(LLTrans::getString("TooltipNoName"));
}
-
- // Maybe we should reflect the estate's block fly bit here as well? DK 12/1/04
- if ( !hover_parcel->getAllowFly() )
+ else
{
- if (words) line.append(", ");
- line.append(LLTrans::getString("TooltipFlagNoFly"));
- words++;
+ tooltip_msg.append( nodep->mName );
}
-
- if ( !hover_parcel->getAllowOtherScripts() )
+
+ bool has_media = false;
+ bool is_time_based_media = false;
+ bool is_web_based_media = false;
+ bool is_media_playing = false;
+ bool is_media_displaying = false;
+
+ // Does this face have media?
+ const LLTextureEntry* tep = hover_object->getTE(mHoverPick.mObjectFace);
+
+ if(tep)
{
- if (words) line.append(", ");
- if ( hover_parcel->getAllowGroupScripts() )
- {
- line.append(LLTrans::getString("TooltipFlagGroupScripts"));
- }
- else
+ has_media = tep->hasMedia();
+ const LLMediaEntry* mep = has_media ? tep->getMediaData() : NULL;
+ if (mep)
{
- line.append(LLTrans::getString("TooltipFlagNoScripts"));
+ viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+ LLPluginClassMedia* media_plugin = NULL;
+
+ if (media_impl.notNull() && (media_impl->hasMedia()))
+ {
+ is_media_displaying = true;
+ LLStringUtil::format_map_t args;
+
+ media_plugin = media_impl->getMediaPlugin();
+ if(media_plugin)
+ {
+ if(media_plugin->pluginSupportsMediaTime())
+ {
+ is_time_based_media = true;
+ is_web_based_media = false;
+ //args["[CurrentURL]"] = media_impl->getMediaURL();
+ is_media_playing = media_impl->isMediaPlaying();
+ }
+ else
+ {
+ is_time_based_media = false;
+ is_web_based_media = true;
+ //args["[CurrentURL]"] = media_plugin->getLocation();
+ }
+ //tooltip_msg.append(LLTrans::getString("CurrentURL", args));
+ }
+ }
}
-
- words++;
}
-
- if (words)
+
+ // Avoid showing tip over media that's displaying
+ // also check the primary node since sometimes it can have an action even though
+ // the root node doesn't
+ bool needs_tip = !is_media_displaying &&
+ (has_media ||
+ needs_tooltip(nodep) ||
+ needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode()));
+
+ if (show_all_object_tips || needs_tip)
{
- tooltip_msg.append(line);
- tooltip_msg.push_back('\n');
+ // We may select this object, so pretend it was clicked
+ mPick = mHoverPick;
+ LLInspector::Params p;
+ p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ p.message(tooltip_msg);
+ p.image.name("Inspector_I");
+ p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace));
+ p.time_based_media(is_time_based_media);
+ p.web_based_media(is_web_based_media);
+ p.media_playing(is_media_playing);
+ p.click_playmedia_callback(boost::bind(playCurrentMedia, mHoverPick));
+ p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
+ p.visible_time_near(6.f);
+ p.visible_time_far(3.f);
+ p.delay_time(0.35f);
+ p.wrap(false);
+
+ LLToolTipMgr::instance().show(p);
}
}
+ }
+
+ return TRUE;
+}
- if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE))
- {
- LLStringUtil::format_map_t args;
- args["[AMOUNT]"] = llformat("%d", hover_parcel->getSalePrice());
- line = LLTrans::getString("TooltipForSaleL$", args);
- tooltip_msg.append(line);
- tooltip_msg.push_back('\n');
- }
+BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
+{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("ShowHoverTips")) return TRUE;
+ if (!mHoverPick.isValid()) return TRUE;
- // trim last newlines
- if (!tooltip_msg.empty())
- {
- tooltip_msg.erase(tooltip_msg.size() - 1);
- LLToolTipMgr::instance().show(tooltip_msg);
- }
- }
+ LLViewerObject* hover_object = mHoverPick.getObject();
+
+ // update hover object and hover parcel
+ LLSelectMgr::getInstance()->setHoverObject(hover_object, mHoverPick.mObjectFace);
+
+
+ std::string tooltip_msg;
+ std::string line;
+ if ( hover_object )
+ {
+ handleTooltipObject(hover_object, line, tooltip_msg );
+ }
+ else if (mHoverPick.mPickType == LLPickInfo::PICK_LAND)
+ {
+ handleTooltipLand(line, tooltip_msg);
+ }
return TRUE;
}
@@ -925,6 +1030,20 @@ static void show_inspector(const char* inspector, const char* param, const LLUUI
LLFloaterReg::showInstance(inspector, params);
}
+
+static void show_inspector(const char* inspector, LLSD& params)
+{
+ if (LLToolTipMgr::instance().toolTipVisible())
+ {
+ LLRect rect = LLToolTipMgr::instance().getToolTipRect();
+ params["pos"]["x"] = rect.mLeft;
+ params["pos"]["y"] = rect.mTop;
+ }
+
+ LLFloaterReg::showInstance(inspector, params);
+}
+
+
// static
void LLToolPie::showAvatarInspector(const LLUUID& avatar_id)
{
@@ -937,6 +1056,113 @@ void LLToolPie::showObjectInspector(const LLUUID& object_id)
show_inspector("inspect_object", "object_id", object_id);
}
+
+// static
+void LLToolPie::showObjectInspector(const LLUUID& object_id, const S32& object_face)
+{
+ LLSD params;
+ params["object_id"] = object_id;
+ params["object_face"] = object_face;
+ show_inspector("inspect_object", params);
+}
+
+// static
+void LLToolPie::playCurrentMedia(const LLPickInfo& info)
+{
+ //FIXME: how do we handle object in different parcel than us?
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (!parcel) return;
+
+ LLPointer<LLViewerObject> objectp = info.getObject();
+
+ // Early out cases. Must clear media hover.
+ // did not hit an object or did not hit a valid face
+ if ( objectp.isNull() ||
+ info.mObjectFace < 0 ||
+ info.mObjectFace >= objectp->getNumTEs() )
+ {
+ return;
+ }
+
+ // Does this face have media?
+ const LLTextureEntry* tep = objectp->getTE(info.mObjectFace);
+ if (!tep)
+ return;
+
+ const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
+ if(!mep)
+ return;
+
+ //TODO: Can you Use it?
+
+ LLPluginClassMedia* media_plugin = NULL;
+
+ viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+
+ if(media_impl.notNull() && media_impl->hasMedia())
+ {
+ media_plugin = media_impl->getMediaPlugin();
+ if (media_plugin && media_plugin->pluginSupportsMediaTime())
+ {
+ if(media_impl->isMediaPlaying())
+ {
+ media_impl->pause();
+ }
+ else
+ {
+ media_impl->play();
+ }
+ }
+ }
+
+
+}
+
+// static
+void LLToolPie::VisitHomePage(const LLPickInfo& info)
+{
+ //FIXME: how do we handle object in different parcel than us?
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (!parcel) return;
+
+ LLPointer<LLViewerObject> objectp = info.getObject();
+
+ // Early out cases. Must clear media hover.
+ // did not hit an object or did not hit a valid face
+ if ( objectp.isNull() ||
+ info.mObjectFace < 0 ||
+ info.mObjectFace >= objectp->getNumTEs() )
+ {
+ return;
+ }
+
+ // Does this face have media?
+ const LLTextureEntry* tep = objectp->getTE(info.mObjectFace);
+ if (!tep)
+ return;
+
+ const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
+ if(!mep)
+ return;
+
+ //TODO: Can you Use it?
+
+ LLPluginClassMedia* media_plugin = NULL;
+
+ viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+
+ if(media_impl.notNull() && media_impl->hasMedia())
+ {
+ media_plugin = media_impl->getMediaPlugin();
+
+ if (media_plugin && !(media_plugin->pluginSupportsMediaTime()))
+ {
+ media_impl->navigateHome();
+ }
+ }
+}
+
+
void LLToolPie::handleDeselect()
{
if( hasMouseCapture() )
@@ -1031,20 +1257,22 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
return false;
}
-
-
// Does this face have media?
const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace);
+ if(!tep)
+ return false;
+
LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL;
- viewer_media_t media_impl = mep ? LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()) : NULL;
+ if(!mep)
+ return false;
+
+ viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
- if (tep
- && mep
- && gSavedSettings.getBOOL("MediaOnAPrimUI")
- && media_impl.notNull())
+ if (gSavedSettings.getBOOL("MediaOnAPrimUI"))
{
- if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) )
+ if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull())
{
+ // It's okay to give this a null impl
LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal);
}
else
@@ -1085,6 +1313,9 @@ bool LLToolPie::handleMediaHover(const LLPickInfo& pick)
// Does this face have media?
const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace);
+ if(!tep)
+ return false;
+
const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
if (mep
&& gSavedSettings.getBOOL("MediaOnAPrimUI"))
@@ -1225,52 +1456,69 @@ BOOL LLToolPie::pickRightMouseDownCallback()
{
LLParcelSelectionHandle selection = LLViewerParcelMgr::getInstance()->selectParcelAt( mPick.mPosGlobal );
gMenuHolder->setParcelSelection(selection);
- gPieLand->show(x, y);
+ gMenuLand->show(x, y);
showVisualContextMenuEffect();
}
else if (mPick.mObjectID == gAgent.getID() )
{
- if(!gPieSelf)
+ if(!gMenuAvatarSelf)
{
//either at very early startup stage or at late quitting stage,
//this event is ignored.
return TRUE ;
}
- gPieSelf->show(x, y);
+ gMenuAvatarSelf->show(x, y);
}
else if (object)
{
gMenuHolder->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
+ bool is_other_attachment = (object->isAttachment() && !object->isHUDAttachment() && !object->permYouOwner());
if (object->isAvatar()
- || (object->isAttachment() && !object->isHUDAttachment() && !object->permYouOwner()))
+ || is_other_attachment)
{
// Find the attachment's avatar
while( object && object->isAttachment())
{
object = (LLViewerObject*)object->getParent();
+ llassert(object);
+ }
+
+ if (!object)
+ {
+ return TRUE; // unexpected, but escape
}
// Object is an avatar, so check for mute by id.
LLVOAvatar* avatar = (LLVOAvatar*)object;
std::string name = avatar->getFullname();
+ std::string mute_msg;
if (LLMuteList::getInstance()->isMuted(avatar->getID(), avatar->getFullname()))
{
- gMenuHolder->childSetText("Avatar Mute", std::string("Unmute")); // *TODO:Translate
+ mute_msg = LLTrans::getString("UnmuteAvatar");
}
else
{
- gMenuHolder->childSetText("Avatar Mute", std::string("Mute")); // *TODO:Translate
+ mute_msg = LLTrans::getString("MuteAvatar");
}
- gPieAvatar->show(x, y);
+ if (is_other_attachment)
+ {
+ gMenuAttachmentOther->getChild<LLUICtrl>("Avatar Mute")->setValue(mute_msg);
+ gMenuAttachmentOther->show(x, y);
+ }
+ else
+ {
+ gMenuAvatarOther->getChild<LLUICtrl>("Avatar Mute")->setValue(mute_msg);
+ gMenuAvatarOther->show(x, y);
+ }
}
else if (object->isAttachment())
{
- gPieAttachment->show(x, y);
+ gMenuAttachmentSelf->show(x, y);
}
else
{
@@ -1281,16 +1529,18 @@ BOOL LLToolPie::pickRightMouseDownCallback()
{
name = node->mName;
}
+ std::string mute_msg;
if (LLMuteList::getInstance()->isMuted(object->getID(), name))
{
- gMenuHolder->childSetText("Object Mute", std::string("Unmute")); // *TODO:Translate
+ mute_msg = LLTrans::getString("UnmuteObject");
}
else
{
- gMenuHolder->childSetText("Object Mute", std::string("Mute")); // *TODO:Translate
+ mute_msg = LLTrans::getString("MuteObject2");
}
- gPieObject->show(x, y);
+ gMenuHolder->childSetText("Object Mute", mute_msg);
+ gMenuObject->show(x, y);
showVisualContextMenuEffect();
}
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 5faedbec5a..8a4c949aef 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -71,13 +71,14 @@ public:
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
- static void leftMouseCallback(const LLPickInfo& pick_info);
- static void rightMouseCallback(const LLPickInfo& pick_info);
-
static void selectionPropertiesReceived();
static void showAvatarInspector(const LLUUID& avatar_id);
static void showObjectInspector(const LLUUID& object_id);
+ static void showObjectInspector(const LLUUID& object_id, const S32& object_face);
+ static void playCurrentMedia(const LLPickInfo& info);
+ static void VisitHomePage(const LLPickInfo& info);
+
private:
BOOL outsideSlop (S32 x, S32 y, S32 start_x, S32 start_y);
BOOL pickLeftMouseDownCallback();
@@ -88,7 +89,9 @@ private:
bool handleMediaClick(const LLPickInfo& info);
bool handleMediaHover(const LLPickInfo& info);
- bool handleMediaMouseUp();
+ bool handleMediaMouseUp();
+ BOOL handleTooltipLand(std::string line, std::string tooltip_msg);
+ BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);
private:
BOOL mGrabMouseButtonDown;
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index a7f4cb558e..612bcc03bd 100644
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -38,7 +38,7 @@
// viewer headers
#include "llbutton.h"
#include "llviewercontrol.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloatertools.h"
#include "llselectmgr.h"
#include "llstatusbar.h"
@@ -188,7 +188,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)
{
- LLFirstUse::useSandbox();
+ //LLFirstUse::useSandbox();
}
// Set params for new object based on its PCode.
@@ -491,7 +491,7 @@ BOOL LLToolPlacer::addDuplicate(S32 x, S32 y)
if (regionp
&& (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX))
{
- LLFirstUse::useSandbox();
+ //LLFirstUse::useSandbox();
}
return TRUE;
diff --git a/indra/newview/lltoolplacer.h b/indra/newview/lltoolplacer.h
index b7422380d4..df07f1854c 100644
--- a/indra/newview/lltoolplacer.h
+++ b/indra/newview/lltoolplacer.h
@@ -33,7 +33,6 @@
#ifndef LL_TOOLPLACER_H
#define LL_TOOLPLACER_H
-#include "llprimitive.h"
#include "llpanel.h"
#include "lltool.h"
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 5929ecd928..407cc23d0d 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -55,6 +55,7 @@
#include "llhudtext.h"
#include "llhudview.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllandmarklist.h"
#include "llsky.h"
#include "llui.h"
@@ -416,10 +417,10 @@ F32 pulse_func(F32 t, F32 z)
return 0.f;
}
- t *= 3.14159f;
+ t *= F_PI;
z -= t*64.f - 256.f;
- F32 a = cosf(z*3.14159/512.f)*10.0f;
+ F32 a = cosf(z*F_PI/512.f)*10.0f;
a = llmax(a, 9.9f);
a -= 9.9f;
a *= 10.f;
@@ -433,7 +434,7 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color)
return;
}
- t *= 0.6284f/3.14159f;
+ t *= 0.6284f/F_PI;
t -= (F32) (S32) t;
diff --git a/indra/newview/lltransientdockablefloater.cpp b/indra/newview/lltransientdockablefloater.cpp
index 7e4d4988d1..9d39aa5182 100644
--- a/indra/newview/lltransientdockablefloater.cpp
+++ b/indra/newview/lltransientdockablefloater.cpp
@@ -42,11 +42,20 @@ LLTransientDockableFloater::LLTransientDockableFloater(LLDockControl* dockContro
LLDockableFloater(dockControl, uniqueDocking, key, params)
{
LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
+ LLTransientFloater::init(this);
}
LLTransientDockableFloater::~LLTransientDockableFloater()
{
LLTransientFloaterMgr::getInstance()->unregisterTransientFloater(this);
+ LLView* dock = getDockWidget();
+ LLTransientFloaterMgr::getInstance()->removeControlView(
+ LLTransientFloaterMgr::DOCKED, this);
+ if (dock != NULL)
+ {
+ LLTransientFloaterMgr::getInstance()->removeControlView(
+ LLTransientFloaterMgr::DOCKED, dock);
+ }
}
void LLTransientDockableFloater::setVisible(BOOL visible)
@@ -54,18 +63,18 @@ void LLTransientDockableFloater::setVisible(BOOL visible)
LLView* dock = getDockWidget();
if(visible && isDocked())
{
- LLTransientFloaterMgr::getInstance()->addControlView(this);
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, this);
if (dock != NULL)
{
- LLTransientFloaterMgr::getInstance()->addControlView(dock);
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, dock);
}
}
else
{
- LLTransientFloaterMgr::getInstance()->removeControlView(this);
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, this);
if (dock != NULL)
{
- LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, dock);
}
}
@@ -77,18 +86,18 @@ void LLTransientDockableFloater::setDocked(bool docked, bool pop_on_undock)
LLView* dock = getDockWidget();
if(docked)
{
- LLTransientFloaterMgr::getInstance()->addControlView(this);
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, this);
if (dock != NULL)
{
- LLTransientFloaterMgr::getInstance()->addControlView(dock);
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::DOCKED, dock);
}
}
else
{
- LLTransientFloaterMgr::getInstance()->removeControlView(this);
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, this);
if (dock != NULL)
{
- LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::DOCKED, dock);
}
}
diff --git a/indra/newview/lltransientdockablefloater.h b/indra/newview/lltransientdockablefloater.h
index 6e8a3afd22..e0541d6597 100644
--- a/indra/newview/lltransientdockablefloater.h
+++ b/indra/newview/lltransientdockablefloater.h
@@ -37,12 +37,13 @@
#include "llfloater.h"
#include "lldockcontrol.h"
#include "lldockablefloater.h"
+#include "lltransientfloatermgr.h"
/**
* Represents floater that can dock and managed by transient floater manager.
* Transient floaters should be hidden if user click anywhere except defined view list.
*/
-class LLTransientDockableFloater : public LLDockableFloater
+class LLTransientDockableFloater : public LLDockableFloater, LLTransientFloater
{
public:
LOG_CLASS(LLTransientDockableFloater);
@@ -52,6 +53,7 @@ public:
/*virtual*/ void setVisible(BOOL visible);
/* virtual */void setDocked(bool docked, bool pop_on_undock = true);
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
};
#endif /* LL_TRANSIENTDOCKABLEFLOATER_H */
diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp
index 7befb87248..d82403070b 100644
--- a/indra/newview/lltransientfloatermgr.cpp
+++ b/indra/newview/lltransientfloatermgr.cpp
@@ -37,55 +37,75 @@
#include "llrootview.h"
#include "llviewerwindow.h"
#include "lldockablefloater.h"
+#include "llmenugl.h"
LLTransientFloaterMgr::LLTransientFloaterMgr()
{
gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(
&LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
+
+ mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
+ mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>()));
+ mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
}
-void LLTransientFloaterMgr::registerTransientFloater(LLFloater* floater)
+void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater)
{
mTransSet.insert(floater);
}
-void LLTransientFloaterMgr::unregisterTransientFloater(LLFloater* floater)
+void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* floater)
{
mTransSet.erase(floater);
}
+void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view)
+{
+ mGroupControls.find(group)->second.insert(view);
+}
+
+void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view)
+{
+ mGroupControls.find(group)->second.erase(view);
+}
+
void LLTransientFloaterMgr::addControlView(LLView* view)
{
- mControlsSet.insert(view);
+ addControlView(GLOBAL, view);
}
void LLTransientFloaterMgr::removeControlView(LLView* view)
{
// we will still get focus lost callbacks on this view, but that's ok
// since we run sanity checking logic every time
- mControlsSet.erase(view);
+ removeControlView(GLOBAL, view);
}
-void LLTransientFloaterMgr::hideTransientFloaters()
+void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
{
- for (std::set<LLFloater*>::iterator it = mTransSet.begin(); it
+ for (std::set<LLTransientFloater*>::iterator it = mTransSet.begin(); it
!= mTransSet.end(); it++)
{
- LLFloater* floater = *it;
- if (floater->isDocked())
+ LLTransientFloater* floater = *it;
+ if (floater->isTransientDocked())
{
- floater->setVisible(FALSE);
+ ETransientGroup group = floater->getGroup();
+
+ bool hide = isControlClicked(mGroupControls.find(group)->second, x, y);
+ if (hide)
+ {
+ floater->setTransientVisible(FALSE);
+ }
}
}
}
-void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
- MASK mask)
+bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y)
{
- bool hide = true;
- for (controls_set_t::iterator it = mControlsSet.begin(); it
- != mControlsSet.end(); it++)
+ bool res = true;
+ for (controls_set_t::iterator it = set.begin(); it
+ != set.end(); it++)
{
LLView* control_view = *it;
if (!control_view->getVisible())
@@ -97,14 +117,33 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
// if click inside view rect
if (rect.pointInRect(x, y))
{
- hide = false;
+ res = false;
break;
}
}
+ return res;
+}
+
+void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
+ MASK mask)
+{
+ // don't hide transient floater if any context menu opened
+ if (LLMenuGL::sMenuContainer->getVisibleMenu() != NULL)
+ {
+ return;
+ }
+ bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y)
+ && isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
if (hide)
{
- hideTransientFloaters();
+ hideTransientFloaters(x, y);
}
}
+void LLTransientFloater::init(LLFloater* thiz)
+{
+ // used since LLTransientFloater(this) can't be used in descendant constructor parameter initialization.
+ mFloater = thiz;
+}
+
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index cef6e1fe45..9c5ae295f2 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -37,27 +37,60 @@
#include "llsingleton.h"
#include "llfloater.h"
+class LLTransientFloater;
/**
* Provides functionality to hide transient floaters.
*/
class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
{
-public:
+protected:
LLTransientFloaterMgr();
- void registerTransientFloater(LLFloater* floater);
- void unregisterTransientFloater(LLFloater* floater);
+ friend class LLSingleton<LLTransientFloaterMgr>;
+
+public:
+ enum ETransientGroup
+ {
+ GLOBAL, DOCKED, IM
+ };
+
+ void registerTransientFloater(LLTransientFloater* floater);
+ void unregisterTransientFloater(LLTransientFloater* floater);
+ void addControlView(ETransientGroup group, LLView* view);
+ void removeControlView(ETransientGroup group, LLView* view);
void addControlView(LLView* view);
void removeControlView(LLView* view);
private:
- void hideTransientFloaters();
+ void hideTransientFloaters(S32 x, S32 y);
void leftMouseClickCallback(S32 x, S32 y, MASK mask);
-
+ bool isControlClicked(std::set<LLView*>& set, S32 x, S32 y);
private:
- std::set<LLFloater*> mTransSet;
+ std::set<LLTransientFloater*> mTransSet;
+
typedef std::set<LLView*> controls_set_t;
- controls_set_t mControlsSet;
+ typedef std::map<ETransientGroup, std::set<LLView*> > group_controls_t;
+ group_controls_t mGroupControls;
+};
+
+/**
+ * An abstract class declares transient floater interfaces.
+ */
+class LLTransientFloater
+{
+protected:
+ /**
+ * Class initialization method.
+ * Should be called from descendant constructor.
+ */
+ void init(LLFloater* thiz);
+public:
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() = 0;
+ bool isTransientDocked() { return mFloater->isDocked(); };
+ void setTransientVisible(BOOL visible) {mFloater->setVisible(visible); }
+
+private:
+ LLFloater* mFloater;
};
#endif // LL_LLTRANSIENTFLOATERMGR_H
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index 9c643e78de..3ad9887bec 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -20,10 +20,16 @@
#include "lluictrl.h"
#include "llerror.h"
-LLUIListener::LLUIListener(const std::string& name):
- LLDispatchListener(name, "op")
+LLUIListener::LLUIListener():
+ LLEventAPI("UI",
+ "LLUICtrl::CommitCallbackRegistry listener.\n"
+ "Capable of invoking any function (with parameter) you can specify in XUI.")
{
- add("call", &LLUIListener::call, LLSD().insert("function", LLSD()));
+ add("call",
+ "Invoke the operation named by [\"function\"], passing [\"parameter\"],\n"
+ "as if from a user gesture on a menu -- or a button click.",
+ &LLUIListener::call,
+ LLSD().with("function", LLSD()));
}
void LLUIListener::call(const LLSD& event) const
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
index ea904a99ff..8605d60bd3 100644
--- a/indra/newview/lluilistener.h
+++ b/indra/newview/lluilistener.h
@@ -12,15 +12,15 @@
#if ! defined(LL_LLUILISTENER_H)
#define LL_LLUILISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
#include <string>
class LLSD;
-class LLUIListener: public LLDispatchListener
+class LLUIListener: public LLEventAPI
{
public:
- LLUIListener(const std::string& name);
+ LLUIListener();
private:
void call(const LLSD& event) const;
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 841902f683..0b6bd4b401 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -41,16 +41,21 @@
#include "llfloaterurldisplay.h"
#include "llfloaterworldmap.h"
#include "llpanellogin.h"
+#include "llregionhandle.h"
#include "llsidetray.h"
#include "llslurl.h"
#include "llstartup.h" // gStartupState
#include "llurlsimstring.h"
#include "llweb.h"
-#include "llworldmap.h"
+#include "llworldmapmessage.h"
+#include "llurldispatcherlistener.h"
// library includes
+#include "llnotificationsutil.h"
#include "llsd.h"
+static LLURLDispatcherListener sURLDispatcherListener;
+
class LLURLDispatcherImpl
{
public:
@@ -162,7 +167,7 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url,
// (but still return true because it is a valid app SLURL)
if (! handled)
{
- LLNotifications::instance().add("UnsupportedCommandSLURL");
+ LLNotificationsUtil::add("UnsupportedCommandSLURL");
}
return true;
}
@@ -201,7 +206,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, bool right_mous
//if(url_displayp) url_displayp->setName(region_name);
// Request a region handle by name
- LLWorldMap::getInstance()->sendNamedRegionRequest(region_name,
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionNameCallback,
url,
false); // don't teleport
@@ -240,7 +245,7 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::strin
LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos);
U64 new_region_handle = to_region_handle(global_pos);
- LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle,
+ LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle,
LLURLDispatcherImpl::regionHandleCallback,
url, teleport);
}
@@ -335,7 +340,7 @@ public:
{
url += tokens[i].asString() + "/";
}
- LLWorldMap::getInstance()->sendNamedRegionRequest(region_name,
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionHandleCallback,
url,
true); // teleport
@@ -364,9 +369,9 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& url)
bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)
{
// *NOTE: Text editors are considered sources of trusted URLs
- // in order to make objectim and avatar profile links in chat
- // history work. While a malicious resident could chat an app
- // SLURL, the receiving resident will see it and must affirmatively
+ // in order to make avatar profile links in chat history work.
+ // While a malicious resident could chat an app SLURL, the
+ // receiving resident will see it and must affirmatively
// click on it.
// *TODO: Make this trust model more refined. JC
const bool trusted_browser = true;
diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp
new file mode 100644
index 0000000000..fea6a769c5
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.cpp
@@ -0,0 +1,58 @@
+/**
+ * @file llurldispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llurldispatcherlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llurldispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llurldispatcher.h"
+
+LLURLDispatcherListener::LLURLDispatcherListener(/* LLURLDispatcher* instance */):
+ LLEventAPI("LLURLDispatcher", "Internal URL handling") /* ,
+ mDispatcher(instance) */
+{
+ add("dispatch",
+ "At startup time or on clicks in internal web browsers,\n"
+ "teleport, open map, or run requested command.\n"
+ "[\"url\"] string url to dispatch\n"
+ "[\"trusted\"] boolean indicating trusted browser [default true]",
+ &LLURLDispatcherListener::dispatch);
+ add("dispatchRightClick", "Dispatch [\"url\"] as if from a right-click on a hot link.",
+ &LLURLDispatcherListener::dispatchRightClick);
+ add("dispatchFromTextEditor", "Dispatch [\"url\"] as if from an edit field.",
+ &LLURLDispatcherListener::dispatchFromTextEditor);
+}
+
+void LLURLDispatcherListener::dispatch(const LLSD& params) const
+{
+ // For most purposes, we expect callers to want to be trusted.
+ bool trusted_browser = true;
+ if (params.has("trusted"))
+ {
+ // But for testing, allow a caller to specify untrusted.
+ trusted_browser = params["trusted"].asBoolean();
+ }
+ LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser);
+}
+
+void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const
+{
+ LLURLDispatcher::dispatchRightClick(params["url"]);
+}
+
+void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const
+{
+ LLURLDispatcher::dispatchFromTextEditor(params["url"]);
+}
diff --git a/indra/newview/llurldispatcherlistener.h b/indra/newview/llurldispatcherlistener.h
new file mode 100644
index 0000000000..894afcbb51
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.h
@@ -0,0 +1,32 @@
+/**
+ * @file llurldispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLURLDispatcher
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLURLDISPATCHERLISTENER_H)
+#define LL_LLURLDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLURLDispatcher;
+class LLSD;
+
+class LLURLDispatcherListener: public LLEventAPI
+{
+public:
+ LLURLDispatcherListener(/* LLURLDispatcher* instance */); // all static members
+
+private:
+ void dispatch(const LLSD& params) const;
+ void dispatchRightClick(const LLSD& params) const;
+ void dispatchFromTextEditor(const LLSD& params) const;
+
+ //LLURLDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLURLDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp
index e8b5aa7c74..08dd82ab86 100644
--- a/indra/newview/llurlhistory.cpp
+++ b/indra/newview/llurlhistory.cpp
@@ -77,7 +77,7 @@ bool LLURLHistory::saveFile(const std::string& filename)
std::string temp_str = gDirUtilp->getLindenUserDir();
if( temp_str.empty() )
{
- llwarns << "Can't save. No user directory set." << llendl;
+ llinfos << "Can't save URL history - no user directory set yet." << llendl;
return false;
}
diff --git a/indra/newview/llurlwhitelist.cpp b/indra/newview/llurlwhitelist.cpp
index da69039cf9..46bc9276c1 100644
--- a/indra/newview/llurlwhitelist.cpp
+++ b/indra/newview/llurlwhitelist.cpp
@@ -121,6 +121,12 @@ bool LLUrlWhiteList::save ()
// build filename for each user
std::string resolvedFilename = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, mFilename );
+ if (resolvedFilename.empty())
+ {
+ llinfos << "No per-user dir for saving URL whitelist - presumably not logged in yet. Skipping." << llendl;
+ return false;
+ }
+
// open a file for writing
llofstream file ( resolvedFilename );
if ( file.is_open () )
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
new file mode 100644
index 0000000000..148931d3ad
--- /dev/null
+++ b/indra/newview/llversioninfo.cpp
@@ -0,0 +1,109 @@
+/**
+ * @file llversioninfo.cpp
+ * @brief Routines to access the viewer version and build information
+ * @author Martin Reddy
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llversioninfo.h"
+
+#include "llversionviewer.h"
+
+//
+// Set the version numbers in indra/llcommon/llversionviewer.h
+//
+
+//static
+S32 LLVersionInfo::getMajor()
+{
+ return LL_VERSION_MAJOR;
+}
+
+//static
+S32 LLVersionInfo::getMinor()
+{
+ return LL_VERSION_MINOR;
+}
+
+//static
+S32 LLVersionInfo::getPatch()
+{
+ return LL_VERSION_PATCH;
+}
+
+//static
+S32 LLVersionInfo::getBuild()
+{
+ return LL_VERSION_BUILD;
+}
+
+//static
+const std::string &LLVersionInfo::getVersion()
+{
+ static std::string version("");
+
+ if (version.empty())
+ {
+ // cache the version string
+ std::ostringstream stream;
+ stream << LL_VERSION_MAJOR << "."
+ << LL_VERSION_MINOR << "."
+ << LL_VERSION_PATCH << "."
+ << LL_VERSION_BUILD;
+ version = stream.str();
+ }
+
+ return version;
+}
+
+//static
+const std::string &LLVersionInfo::getShortVersion()
+{
+ static std::string version("");
+
+ if (version.empty())
+ {
+ // cache the version string
+ std::ostringstream stream;
+ stream << LL_VERSION_MAJOR << "."
+ << LL_VERSION_MINOR << "."
+ << LL_VERSION_PATCH;
+ version = stream.str();
+ }
+
+ return version;
+}
+
+//static
+const std::string &LLVersionInfo::getChannel()
+{
+ static std::string name(LL_CHANNEL);
+ return name;
+}
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
new file mode 100644
index 0000000000..b05109e478
--- /dev/null
+++ b/indra/newview/llversioninfo.h
@@ -0,0 +1,71 @@
+/**
+ * @file llversioninfo.h
+ * @brief Routines to access the viewer version and build information
+ * @author Martin Reddy
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVERSIONINFO_H
+#define LL_LLVERSIONINFO_H
+
+#include <string>
+
+///
+/// This API provides version information for the viewer. This
+/// includes access to the major, minor, patch, and build integer
+/// values, as well as human-readable string representations. All
+/// viewer code that wants to query the current version should
+/// use this API.
+///
+class LLVersionInfo
+{
+public:
+ /// return the major verion number as an integer
+ static S32 getMajor();
+
+ /// return the minor verion number as an integer
+ static S32 getMinor();
+
+ /// return the patch verion number as an integer
+ static S32 getPatch();
+
+ /// return the build number as an integer
+ static S32 getBuild();
+
+ /// return the full viewer version as a string like "2.0.0.200030"
+ static const std::string &getVersion();
+
+ /// return the viewer version as a string like "2.0.0"
+ static const std::string &getShortVersion();
+
+ /// return the channel name, e.g. "Second Life"
+ static const std::string &getChannel();
+};
+
+#endif
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index c32e67ef90..bb49804aff 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -32,13 +32,13 @@
#include "llviewerprecompiledheaders.h"
-#include "linden_common.h"
-
-#include "llagent.h"
#include "llviewerassetstorage.h"
-#include "llviewerbuild.h"
+
#include "llvfile.h"
#include "llvfs.h"
+#include "message.h"
+
+#include "llagent.h"
LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
LLVFS *vfs, const LLHost &upstream_host)
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
new file mode 100644
index 0000000000..b382ff6306
--- /dev/null
+++ b/indra/newview/llviewerassettype.cpp
@@ -0,0 +1,113 @@
+/**
+ * @file llassettype.cpp
+ * @brief Implementatino of LLViewerAssetType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerassettype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llsingleton.h"
+
+static const std::string empty_string;
+
+struct ViewerAssetEntry : public LLDictionaryEntry
+{
+ ViewerAssetEntry(EDragAndDropType dad_type // drag and drop type
+ )
+ :
+ LLDictionaryEntry(empty_string), // no reverse lookup needed for now, so just leave this blank
+ mDadType(dad_type)
+ {
+ }
+ EDragAndDropType mDadType;
+};
+
+class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>,
+ public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry>
+{
+public:
+ LLViewerAssetDictionary();
+};
+
+LLViewerAssetDictionary::LLViewerAssetDictionary()
+{
+ // DRAG&DROP TYPE
+ // |--------------------|
+ addEntry(LLViewerAssetType::AT_TEXTURE, new ViewerAssetEntry(DAD_TEXTURE));
+ addEntry(LLViewerAssetType::AT_SOUND, new ViewerAssetEntry(DAD_SOUND));
+ addEntry(LLViewerAssetType::AT_CALLINGCARD, new ViewerAssetEntry(DAD_CALLINGCARD));
+ addEntry(LLViewerAssetType::AT_LANDMARK, new ViewerAssetEntry(DAD_LANDMARK));
+ addEntry(LLViewerAssetType::AT_SCRIPT, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_CLOTHING, new ViewerAssetEntry(DAD_CLOTHING));
+ addEntry(LLViewerAssetType::AT_OBJECT, new ViewerAssetEntry(DAD_OBJECT));
+ addEntry(LLViewerAssetType::AT_NOTECARD, new ViewerAssetEntry(DAD_NOTECARD));
+ addEntry(LLViewerAssetType::AT_CATEGORY, new ViewerAssetEntry(DAD_CATEGORY));
+ addEntry(LLViewerAssetType::AT_LSL_TEXT, new ViewerAssetEntry(DAD_SCRIPT));
+ addEntry(LLViewerAssetType::AT_LSL_BYTECODE, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_TEXTURE_TGA, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_BODYPART, new ViewerAssetEntry(DAD_BODYPART));
+ addEntry(LLViewerAssetType::AT_SOUND_WAV, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_IMAGE_TGA, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_IMAGE_JPEG, new ViewerAssetEntry(DAD_NONE));
+ addEntry(LLViewerAssetType::AT_ANIMATION, new ViewerAssetEntry(DAD_ANIMATION));
+ addEntry(LLViewerAssetType::AT_GESTURE, new ViewerAssetEntry(DAD_GESTURE));
+ addEntry(LLViewerAssetType::AT_SIMSTATE, new ViewerAssetEntry(DAD_NONE));
+
+ addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK));
+ addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK));
+
+ addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
+};
+
+EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type)
+{
+ const LLViewerAssetDictionary *dict = LLViewerAssetDictionary::getInstance();
+ const ViewerAssetEntry *entry = dict->lookup(asset_type);
+ if (entry)
+ return entry->mDadType;
+ else
+ return DAD_NONE;
+}
+
+// Generate a good default description
+void LLViewerAssetType::generateDescriptionFor(LLViewerAssetType::EType asset_type,
+ std::string& description)
+{
+ const S32 BUF_SIZE = 30;
+ char time_str[BUF_SIZE]; /* Flawfinder: ignore */
+ time_t now;
+ time(&now);
+ memset(time_str, '\0', BUF_SIZE);
+ strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now));
+ description.assign(time_str);
+ description.append(LLAssetType::lookupHumanReadable(asset_type));
+}
diff --git a/indra/newview/llviewerassettype.h b/indra/newview/llviewerassettype.h
new file mode 100644
index 0000000000..01158885ce
--- /dev/null
+++ b/indra/newview/llviewerassettype.h
@@ -0,0 +1,54 @@
+/**
+ * @file llviewerassettype.h
+ * @brief Declaration of LLViewerViewerAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERASSETTYPE_H
+#define LL_LLVIEWERASSETTYPE_H
+
+#include <string>
+#include "llassettype.h"
+
+// This class is similar to llassettype, but contains methods
+// only used by the viewer.
+class LLViewerAssetType : public LLAssetType
+{
+public:
+ // Generate a good default description. You may want to add a verb
+ // or agent name after this depending on your application.
+ static void generateDescriptionFor(LLViewerAssetType::EType asset_type,
+ std::string& description);
+ static EDragAndDropType lookupDragAndDropType(EType asset_type);
+protected:
+ LLViewerAssetType() {}
+ ~LLViewerAssetType() {}
+};
+
+#endif // LL_LLVIEWERASSETTYPE_H
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 49506db173..1d935f5ab8 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -86,16 +86,6 @@ void init_audio()
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
- gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
//gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
//gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
@@ -221,29 +211,60 @@ void audio_update_wind(bool force_update)
//
if (force_update || (last_camera_water_height * camera_water_height) < 0.f)
{
+ static LLUICachedControl<F32> rolloff("AudioLevelRolloff", 1.0f);
if (camera_water_height < 0.f)
{
- gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
+ gAudiop->setRolloffFactor(rolloff * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
}
else
{
- gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
+ gAudiop->setRolloffFactor(rolloff);
}
}
- // this line rotates the wind vector to be listener (agent) relative
- // unfortunately we have to pre-translate to undo the translation that
- // occurs in the transform call
- gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
+
+ // Scale down the contribution of weather-simulation wind to the
+ // ambient wind noise. Wind velocity averages 3.5 m/s, with gusts to 7 m/s
+ // whereas steady-state avatar walk velocity is only 3.2 m/s.
+ // Without this the world feels desolate on first login when you are
+ // standing still.
+ static LLUICachedControl<F32> wind_level("AudioLevelWind", 0.5f);
+ LLVector3 scaled_wind_vec = gWindVec * wind_level;
+
+ // Mix in the avatar's motion, subtract because when you walk north,
+ // the apparent wind moves south.
+ LLVector3 final_wind_vec = scaled_wind_vec - gAgent.getVelocity();
+
+ // rotate the wind vector to be listener (agent) relative
+ gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal( final_wind_vec );
// don't use the setter setMaxWindGain() because we don't
// want to screw up the fade-in on startup by setting actual source gain
// outside the fade-in.
F32 master_volume = gSavedSettings.getBOOL("MuteAudio") ? 0.f : gSavedSettings.getF32("AudioLevelMaster");
F32 ambient_volume = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient");
+ F32 max_wind_volume = master_volume * ambient_volume;
- F32 wind_volume = master_volume * ambient_volume;
- gAudiop->mMaxWindGain = wind_volume;
-
+ const F32 WIND_SOUND_TRANSITION_TIME = 2.f;
+ // amount to change volume this frame
+ F32 volume_delta = (LLFrameTimer::getFrameDeltaTimeF32() / WIND_SOUND_TRANSITION_TIME) * max_wind_volume;
+ if (force_update)
+ {
+ // initialize wind volume (force_update) by using large volume_delta
+ // which is sufficient to completely turn off or turn on wind noise
+ volume_delta = 1.f;
+ }
+
+ // mute wind when not flying
+ if (gAgent.getFlying())
+ {
+ // volume increases by volume_delta, up to no more than max_wind_volume
+ gAudiop->mMaxWindGain = llmin(gAudiop->mMaxWindGain + volume_delta, max_wind_volume);
+ }
+ else
+ {
+ // volume decreases by volume_delta, down to no less than 0
+ gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f);
+ }
last_camera_water_height = camera_water_height;
gAudiop->updateWind(gRelativeWindVec, camera_water_height);
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index f65baea6ca..bd4f172907 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -32,6 +32,7 @@
#include "llviewerprecompiledheaders.h"
+#define LLVIEWERCAMERA_CPP
#include "llviewercamera.h"
// Viewer includes
@@ -105,14 +106,20 @@ glh::matrix4f gl_lookat(LLVector3 eye, LLVector3 center, LLVector3 up)
}
+// Build time optimization, generate this once in .cpp file
+template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
+
LLViewerCamera::LLViewerCamera() : LLCamera()
{
calcProjection(getFar());
mCameraFOVDefault = DEFAULT_FIELD_OF_VIEW;
+ mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f);
mPixelMeterRatio = 0.f;
mScreenPixelArea = 0;
mZoomFactor = 1.f;
mZoomSubregion = 1;
+ mAverageSpeed = 0.f;
+ mAverageAngularSpeed = 0.f;
gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
}
@@ -151,15 +158,22 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 &center,
setOriginAndLookAt(origin, up_direction, point_of_interest);
- F32 dpos = (center - last_position).magVec();
+ mVelocityDir = center - last_position ;
+ F32 dpos = mVelocityDir.normVec() ;
LLQuaternion rotation;
rotation.shortestArc(last_axis, getAtAxis());
F32 x, y, z;
F32 drot;
rotation.getAngleAxis(&drot, &x, &y, &z);
+
mVelocityStat.addValue(dpos);
mAngularVelocityStat.addValue(drot);
+
+ mAverageSpeed = mVelocityStat.getMeanPerSec() ;
+ mAverageAngularSpeed = mAngularVelocityStat.getMeanPerSec() ;
+ mCosHalfCameraFOV = cosf(0.5f * getView() * llmax(1.0f, getAspect()));
+
// update pixel meter ratio using default fov, not modified one
mPixelMeterRatio = getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5));
// update screen pixel area
@@ -391,10 +405,10 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
if (for_selection && (width > 1 || height > 1))
{
- calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f,
- (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f,
- (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f,
- (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f);
+ calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
+ (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f,
+ (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
+ (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f);
}
@@ -459,7 +473,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
}
}
- LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+ LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
S32 viewport[4];
viewport[0] = world_view_rect.mLeft;
viewport[1] = world_view_rect.mBottom;
@@ -475,7 +489,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
y /= gViewerWindow->getDisplayScale().mV[VY];
// should now have the x,y coords of grab_point in screen space
- LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
// convert to pixel coordinates
S32 int_x = lltrunc(x);
@@ -485,14 +499,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
if (clamp)
{
- if (int_x < world_view_rect.mLeft)
+ if (int_x < world_rect.mLeft)
{
- out_point.mX = world_view_rect.mLeft;
+ out_point.mX = world_rect.mLeft;
valid = FALSE;
}
- else if (int_x > world_view_rect.mRight)
+ else if (int_x > world_rect.mRight)
{
- out_point.mX = world_view_rect.mRight;
+ out_point.mX = world_rect.mRight;
valid = FALSE;
}
else
@@ -500,14 +514,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
out_point.mX = int_x;
}
- if (int_y < world_view_rect.mBottom)
+ if (int_y < world_rect.mBottom)
{
- out_point.mY = world_view_rect.mBottom;
+ out_point.mY = world_rect.mBottom;
valid = FALSE;
}
- else if (int_y > world_view_rect.mTop)
+ else if (int_y > world_rect.mTop)
{
- out_point.mY = world_view_rect.mTop;
+ out_point.mY = world_rect.mTop;
valid = FALSE;
}
else
@@ -521,19 +535,19 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
out_point.mX = int_x;
out_point.mY = int_y;
- if (int_x < world_view_rect.mLeft)
+ if (int_x < world_rect.mLeft)
{
valid = FALSE;
}
- else if (int_x > world_view_rect.mRight)
+ else if (int_x > world_rect.mRight)
{
valid = FALSE;
}
- if (int_y < world_view_rect.mBottom)
+ if (int_y < world_rect.mBottom)
{
valid = FALSE;
}
- else if (int_y > world_view_rect.mTop)
+ else if (int_y > world_rect.mTop)
{
valid = FALSE;
}
@@ -562,7 +576,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
in_front = FALSE;
}
- LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+ LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
S32 viewport[4];
viewport[0] = world_view_rect.mLeft;
viewport[1] = world_view_rect.mBottom;
@@ -577,7 +591,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
x /= gViewerWindow->getDisplayScale().mV[VX];
y /= gViewerWindow->getDisplayScale().mV[VY];
// should now have the x,y coords of grab_point in screen space
- const LLRect& world_rect = gViewerWindow->getVirtualWorldViewRect();
+ const LLRect& world_rect = gViewerWindow->getWorldViewRectScaled();
// ...sanity check
S32 int_x = lltrunc(x);
@@ -818,10 +832,12 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts)
LLCamera::setView(vertical_fov_rads); // call base implementation
}
-void LLViewerCamera::setDefaultFOV(F32 vertical_fov_rads) {
+void LLViewerCamera::setDefaultFOV(F32 vertical_fov_rads)
+{
vertical_fov_rads = llclamp(vertical_fov_rads, getMinView(), getMaxView());
setView(vertical_fov_rads);
mCameraFOVDefault = vertical_fov_rads;
+ mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f);
}
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 90b77f771f..cd67af5fef 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -52,6 +52,11 @@ const F32 OGL_TO_CFR_ROTATION[16] = { 0.f, 0.f, -1.f, 0.f, // -Z becomes X
const BOOL FOR_SELECTION = TRUE;
const BOOL NOT_FOR_SELECTION = FALSE;
+// Build time optimization, generate this once in .cpp file
+#ifndef LLVIEWERCAMERA_CPP
+extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
+#endif
+
class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
{
public:
@@ -91,17 +96,20 @@ public:
BOOL projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoordGL &out_point, const BOOL clamp = TRUE) const;
BOOL projectPosAgentToScreenEdge(const LLVector3 &pos_agent, LLCoordGL &out_point) const;
-
+ const LLVector3* getVelocityDir() const {return &mVelocityDir;}
LLStat *getVelocityStat() { return &mVelocityStat; }
LLStat *getAngularVelocityStat() { return &mAngularVelocityStat; }
+ F32 getCosHalfFov() {return mCosHalfCameraFOV;}
+ F32 getAverageSpeed() {return mAverageSpeed ;}
+ F32 getAverageAngularSpeed() {return mAverageAngularSpeed;}
void getPixelVectors(const LLVector3 &pos_agent, LLVector3 &up, LLVector3 &right);
LLVector3 roundToPixel(const LLVector3 &pos_agent);
// Sets the current matrix
/* virtual */ void setView(F32 vertical_fov_rads);
- // Sets the current matrix AND remembers result as default view
- void setDefaultFOV(F32 vertical_fov_rads);
+
+ void setDefaultFOV(F32 fov) ;
F32 getDefaultFOV() { return mCameraFOVDefault; }
BOOL cameraUnderWater() const;
@@ -120,9 +128,14 @@ protected:
LLStat mVelocityStat;
LLStat mAngularVelocityStat;
+ LLVector3 mVelocityDir ;
+ F32 mAverageSpeed ;
+ F32 mAverageAngularSpeed ;
+
mutable LLMatrix4 mProjectionMatrix; // Cache of perspective matrix
mutable LLMatrix4 mModelviewMatrix;
F32 mCameraFOVDefault;
+ F32 mCosHalfCameraFOV;
LLVector3 mLastPointOfInterest;
F32 mPixelMeterRatio; // Divide by distance from camera to get pixels per meter at that distance.
S32 mScreenPixelArea; // Pixel area of entire window
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
new file mode 100644
index 0000000000..8de87eb602
--- /dev/null
+++ b/indra/newview/llviewerchat.cpp
@@ -0,0 +1,221 @@
+/**
+ * @file llviewerchat.cpp
+ * @brief Builds menus out of items.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewerchat.h"
+
+// newview includes
+#include "llagent.h" // gAgent
+#include "lluicolortable.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// LLViewerChat
+
+//static
+void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
+{
+ if(chat.mMuted)
+ {
+ r_color= LLUIColorTable::instance().getColor("LtGray");
+ }
+ else
+ {
+ switch(chat.mSourceType)
+ {
+ case CHAT_SOURCE_SYSTEM:
+ r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+ break;
+ case CHAT_SOURCE_AGENT:
+ if (chat.mFromID.isNull())
+ {
+ r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+ }
+ else
+ {
+ if(gAgentID == chat.mFromID)
+ {
+ r_color = LLUIColorTable::instance().getColor("UserChatColor");
+ }
+ else
+ {
+ r_color = LLUIColorTable::instance().getColor("AgentChatColor");
+ }
+ }
+ break;
+ case CHAT_SOURCE_OBJECT:
+ if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+ {
+ r_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
+ }
+ else if ( chat.mChatType == CHAT_TYPE_OWNER )
+ {
+ r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
+ }
+ else
+ {
+ r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
+ }
+ break;
+ default:
+ r_color.setToWhite();
+ }
+
+ if (!chat.mPosAgent.isExactlyZero())
+ {
+ LLVector3 pos_agent = gAgent.getPositionAgent();
+ F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+ if (distance > gAgent.getNearChatRadius())
+ {
+ // diminish far-off chat
+ r_color.mV[VALPHA] = 0.8f;
+ }
+ }
+ }
+}
+
+
+//static
+void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha)
+{
+ if(chat.mMuted)
+ {
+ r_color_name = "LtGray";
+ }
+ else
+ {
+ switch(chat.mSourceType)
+ {
+ case CHAT_SOURCE_SYSTEM:
+ r_color_name = "SystemChatColor";
+ break;
+
+ case CHAT_SOURCE_AGENT:
+ if (chat.mFromID.isNull())
+ {
+ r_color_name = "SystemChatColor";
+ }
+ else
+ {
+ if(gAgentID == chat.mFromID)
+ {
+ r_color_name = "UserChatColor";
+ }
+ else
+ {
+ r_color_name = "AgentChatColor";
+ }
+ }
+ break;
+
+ case CHAT_SOURCE_OBJECT:
+ if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+ {
+ r_color_name = "ScriptErrorColor";
+ }
+ else if ( chat.mChatType == CHAT_TYPE_OWNER )
+ {
+ r_color_name = "llOwnerSayChatColor";
+ }
+ else
+ {
+ r_color_name = "ObjectChatColor";
+ }
+ break;
+ default:
+ r_color_name = "White";
+ }
+
+ if (!chat.mPosAgent.isExactlyZero())
+ {
+ LLVector3 pos_agent = gAgent.getPositionAgent();
+ F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+ if (distance > gAgent.getNearChatRadius())
+ {
+ // diminish far-off chat
+ r_color_alpha = 0.8f;
+ }
+ else
+ {
+ r_color_alpha = 1.0f;
+ }
+ }
+ }
+
+}
+
+
+//static
+LLFontGL* LLViewerChat::getChatFont()
+{
+ S32 font_size = gSavedSettings.getS32("ChatFontSize");
+ LLFontGL* fontp = NULL;
+ switch(font_size)
+ {
+ case 0:
+ fontp = LLFontGL::getFontSansSerifSmall();
+ break;
+ default:
+ case 1:
+ fontp = LLFontGL::getFontSansSerif();
+ break;
+ case 2:
+ fontp = LLFontGL::getFontSansSerifBig();
+ break;
+ }
+
+ return fontp;
+
+}
+
+//static
+S32 LLViewerChat::getChatFontSize()
+{
+ return gSavedSettings.getS32("ChatFontSize");
+}
+
+
+//static
+void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
+{
+ std::string tmpmsg = chat.mText;
+
+ if(chat.mChatStyle == CHAT_STYLE_IRC)
+ {
+ formated_msg = chat.mFromName + tmpmsg.substr(3);
+ }
+ else
+ {
+ formated_msg = tmpmsg;
+ }
+
+}
+
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
new file mode 100644
index 0000000000..502d6ea7e5
--- /dev/null
+++ b/indra/newview/llviewerchat.h
@@ -0,0 +1,52 @@
+/**
+ * @file llviewerchat.h
+ * @brief wrapper of LLChat in viewer
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERCHAT_H
+#define LL_LLVIEWERCHAT_H
+
+#include "llchat.h"
+#include "llfontgl.h"
+#include "v4color.h"
+
+
+class LLViewerChat
+{
+public:
+ static void getChatColor(const LLChat& chat, LLColor4& r_color);
+ static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
+ static LLFontGL* getChatFont();
+ static S32 getChatFontSize();
+ static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
+
+};
+
+#endif
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 35226a1632..64eabe65cf 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -63,17 +63,16 @@
#include "llviewerjoystick.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
-#include "llnotify.h"
-#include "lloverlaybar.h"
#include "llkeyboard.h"
#include "llerrorcontrol.h"
-#include "llversionviewer.h"
#include "llappviewer.h"
#include "llvosurfacepatch.h"
#include "llvowlsky.h"
#include "llrender.h"
#include "llbottomtray.h"
#include "llnavigationbar.h"
+#include "llfloatertools.h"
+#include "llpaneloutfitsinventory.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
@@ -90,7 +89,7 @@ std::string gCurrentVersion;
extern BOOL gResizeScreenTexture;
extern BOOL gDebugGL;
-
+extern BOOL gAuditTexture;
////////////////////////////////////////////////////////////////////////////
// Listeners
@@ -121,12 +120,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
return true;
}
-static bool handleSetSelfInvisible( const LLSD& newvalue)
-{
- LLVOAvatarSelf::onChangeSelfInvisible( newvalue.asBoolean() );
- return true;
-}
-
static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
@@ -263,35 +256,6 @@ static bool handleJoystickChanged(const LLSD& newvalue)
return true;
}
-static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
-{
- if (gAudiop)
- {
- if ( newvalue.asBoolean() )
- {
- if (LLViewerParcelMgr::getInstance()->getAgentParcel()
- && !LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL().empty())
- {
- // if music isn't playing, start it
- if (gOverlayBar && !gOverlayBar->musicPlaying())
- {
- LLOverlayBar::toggleMusicPlay(NULL);
- }
- }
- }
- else
- {
- // if music is playing, stop it.
- if (gOverlayBar && gOverlayBar->musicPlaying())
- {
- LLOverlayBar::toggleMusicPlay(NULL);
- }
-
- }
- }
- return true;
-}
-
static bool handleUseOcclusionChanged(const LLSD& newvalue)
{
LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery
@@ -378,6 +342,12 @@ static bool handleRenderUseImpostorsChanged(const LLSD& newvalue)
return true;
}
+static bool handleAuditTextureChanged(const LLSD& newvalue)
+{
+ gAuditTexture = newvalue.asBoolean();
+ return true;
+}
+
static bool handleRenderDebugGLChanged(const LLSD& newvalue)
{
gDebugGL = newvalue.asBoolean() || gDebugSession;
@@ -511,34 +481,25 @@ bool toggle_show_snapshot_button(const LLSD& newvalue)
bool toggle_show_navigation_panel(const LLSD& newvalue)
{
- LLRect floater_view_rect = gFloaterView->getRect();
- LLRect notify_view_rect = gNotifyBoxView->getRect();
- LLNavigationBar* navbar = LLNavigationBar::getInstance();
-
- //if newvalue contains 0 => navbar should turn invisible, so floater_view_rect should get higher,
- //and to do this pm=1, else if navbar becomes visible pm=-1 so floater_view_rect gets lower.
- int pm=newvalue.asBoolean()?-1:1;
- floater_view_rect.mTop += pm*(navbar->getDefNavBarHeight()-navbar->getDefFavBarHeight());
- notify_view_rect.mTop += pm*(navbar->getDefNavBarHeight()-navbar->getDefFavBarHeight());
- gFloaterView->setRect(floater_view_rect);
- floater_view_rect = gFloaterView->getRect();
- navbar->showNavigationPanel(newvalue.asBoolean());
+ LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean());
return true;
}
bool toggle_show_favorites_panel(const LLSD& newvalue)
{
- LLRect floater_view_rect = gFloaterView->getRect();
- LLRect notify_view_rect = gNotifyBoxView->getRect();
- LLNavigationBar* navbar = LLNavigationBar::getInstance();
-
- //if newvalue contains 0 => favbar should turn invisible, so floater_view_rect should get higher,
- //and to do this pm=1, else if favbar becomes visible pm=-1 so floater_view_rect gets lower.
- int pm=newvalue.asBoolean()?-1:1;
- floater_view_rect.mTop += pm*navbar->getDefFavBarHeight();
- notify_view_rect.mTop += pm*navbar->getDefFavBarHeight();
- gFloaterView->setRect(floater_view_rect);
- navbar->showFavoritesPanel(newvalue.asBoolean());
+ LLNavigationBar::getInstance()->showFavoritesPanel(newvalue.asBoolean());
+ return true;
+}
+
+bool toggle_show_appearance_editor(const LLSD& newvalue)
+{
+ LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
+ return true;
+}
+
+bool toggle_show_object_render_cost(const LLSD& newvalue)
+{
+ LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
return true;
}
@@ -562,7 +523,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
- gSavedSettings.getControl("RenderAvatarInvisible")->getSignal()->connect(boost::bind(&handleSetSelfInvisible, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
@@ -587,6 +547,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderDeferredShadow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
+ gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2));
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2));
gSavedSettings.getControl("ChatPersistTime")->getSignal()->connect(boost::bind(&handleChatPersistTimeChanged, _2));
gSavedSettings.getControl("ConsoleMaxLines")->getSignal()->connect(boost::bind(&handleConsoleMaxLinesChanged, _2));
@@ -601,7 +562,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
- gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _2));
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
@@ -684,6 +644,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));
gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
+ gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2));
+ gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp
index ecba1b8eb0..0b9db1b906 100644
--- a/indra/newview/llviewercontrollistener.cpp
+++ b/indra/newview/llviewercontrollistener.cpp
@@ -18,12 +18,22 @@
LLViewerControlListener gSavedSettingsListener;
LLViewerControlListener::LLViewerControlListener()
- : LLDispatchListener("LLViewerControl", "group")
+ : LLEventAPI("LLViewerControl",
+ "LLViewerControl listener: set, toggle or set default for various controls",
+ "group")
{
- add("Global", boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
- add("PerAccount", boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
- add("Warning", boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
- add("Crash", boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
+ add("Global",
+ "Set gSavedSettings control [\"key\"] to value [\"value\"]",
+ boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
+ add("PerAccount",
+ "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]",
+ boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
+ add("Warning",
+ "Set gWarningSettings control [\"key\"] to value [\"value\"]",
+ boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
+ add("Crash",
+ "Set gCrashSettings control [\"key\"] to value [\"value\"]",
+ boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
#if 0
add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h
index cacf97e908..88afbb871d 100644
--- a/indra/newview/llviewercontrollistener.h
+++ b/indra/newview/llviewercontrollistener.h
@@ -12,12 +12,12 @@
#ifndef LL_LLVIEWERCONTROLLISTENER_H
#define LL_LLVIEWERCONTROLLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
class LLControlGroup;
class LLSD;
-class LLViewerControlListener : public LLDispatchListener
+class LLViewerControlListener : public LLEventAPI
{
public:
LLViewerControlListener();
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index a6a72e9666..6c1c1d1096 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -45,7 +45,7 @@
#include "lldynamictexture.h"
#include "lldrawpoolalpha.h"
#include "llfeaturemanager.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llhudmanager.h"
#include "llimagebmp.h"
#include "llmemory.h"
@@ -113,7 +113,6 @@ void render_hud_attachments();
void render_ui_3d();
void render_ui_2d();
void render_disconnected_background();
-void render_hud_elements();
void display_startup()
{
@@ -404,7 +403,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if( arrival_fraction > 1.f )
{
arrival_fraction = 1.f;
- LLFirstUse::useTeleport();
+ //LLFirstUse::useTeleport();
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
}
gViewerWindow->setProgressCancelButtonVisible(FALSE, LLTrans::getString("Cancel"));
@@ -483,7 +482,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected");
render_ui();
- render_disconnected_background();
}
//////////////////////////
@@ -712,7 +710,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first.
- const F32 max_image_decode_time = llmin(0.005f, 0.005f*10.f*gFrameIntervalSeconds); // 50 ms/second decode time (no more than 5ms/frame)
+ F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time
+ max_image_decode_time = llclamp(max_image_decode_time, 0.002f, 0.005f ); // min 2ms/frame, max 5ms/frame)
gTextureList.updateImages(max_image_decode_time);
//remove dead textures from GL
@@ -781,10 +780,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// LLRect floater_rect = frontmost_floaterp->calcScreenRect();
// // deflate by one pixel so rounding errors don't occlude outside of floater extents
// floater_rect.stretch(-1);
- // LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidth(),
- // (F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeight(),
- // (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidth(),
- // (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeight());
+ // LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidthScaled(),
+ // (F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeightScaled(),
+ // (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidthScaled(),
+ // (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeightScaled());
// floater_3d_rect.translate(-0.5f, -0.5f);
// glTranslatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
// glScalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
@@ -873,7 +872,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
/// and then display it again with compositor effects.
/// Using render to texture would be faster/better, but I don't have a
/// grasp of their full display stack just yet.
- // gPostProcess->apply(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+ // gPostProcess->apply(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
@@ -990,6 +989,7 @@ void render_hud_attachments()
LLSpatialGroup::sNoDelete = FALSE;
render_hud_elements();
+
//restore type mask
gPipeline.setRenderTypeMask(mask);
if (has_ui)
@@ -1008,67 +1008,58 @@ void render_hud_attachments()
glh_set_current_modelview(current_mod);
}
-BOOL setup_hud_matrices()
+LLRect get_whole_screen_region()
{
- LLRect whole_screen = gViewerWindow->getVirtualWindowRect();
-
+ LLRect whole_screen = gViewerWindow->getWorldViewRectScaled();
+
// apply camera zoom transform (for high res screenshots)
F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
if (zoom_factor > 1.f)
{
S32 num_horizontal_tiles = llceil(zoom_factor);
- S32 tile_width = llround((F32)gViewerWindow->getWindowWidth() / zoom_factor);
- S32 tile_height = llround((F32)gViewerWindow->getWindowHeight() / zoom_factor);
+ S32 tile_width = llround((F32)gViewerWindow->getWorldViewWidthScaled() / zoom_factor);
+ S32 tile_height = llround((F32)gViewerWindow->getWorldViewHeightScaled() / zoom_factor);
int tile_y = sub_region / num_horizontal_tiles;
int tile_x = sub_region - (tile_y * num_horizontal_tiles);
glh::matrix4f mat;
-
- whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeight() - (tile_y * tile_height), tile_width, tile_height);
+
+ whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWorldViewHeightScaled() - (tile_y * tile_height), tile_width, tile_height);
}
-
- return setup_hud_matrices(whole_screen);
+ return whole_screen;
}
-BOOL setup_hud_matrices(const LLRect& screen_region)
+bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::matrix4f &model)
{
LLVOAvatar* my_avatarp = gAgent.getAvatarObject();
if (my_avatarp && my_avatarp->hasHUDAttachment())
{
F32 zoom_level = gAgent.mHUDCurZoom;
LLBBox hud_bbox = my_avatarp->getHUDBBox();
-
- // set up transform to keep HUD objects in front of camera
- glMatrixMode(GL_PROJECTION);
+
F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
- glh::matrix4f proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
+ proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
proj.element(2,2) = -0.01f;
-
+
F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect();
-
+
glh::matrix4f mat;
- F32 scale_x = (F32)gViewerWindow->getWindowWidth() / (F32)screen_region.getWidth();
- F32 scale_y = (F32)gViewerWindow->getWindowHeight() / (F32)screen_region.getHeight();
+ F32 scale_x = (F32)gViewerWindow->getWorldViewWidthScaled() / (F32)screen_region.getWidth();
+ F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight();
mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f));
mat.set_translate(
- glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidth(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
- clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeight(), 0.5f * scale_y, -0.5f * scale_y),
- 0.f));
+ glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
+ clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
+ 0.f));
proj *= mat;
-
- glLoadMatrixf(proj.m);
- glh_set_current_projection(proj);
-
- glMatrixMode(GL_MODELVIEW);
- glh::matrix4f model((GLfloat*) OGL_TO_CFR_ROTATION);
+
+ glh::matrix4f tmp_model((GLfloat*) OGL_TO_CFR_ROTATION);
mat.set_scale(glh::vec3f(zoom_level, zoom_level, zoom_level));
mat.set_translate(glh::vec3f(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f));
-
- model *= mat;
- glLoadMatrixf(model.m);
- glh_set_current_modelview(model);
-
+
+ tmp_model *= mat;
+ model = tmp_model;
return TRUE;
}
else
@@ -1077,6 +1068,35 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
}
}
+bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model)
+{
+ LLRect whole_screen = get_whole_screen_region();
+ return get_hud_matrices(whole_screen, proj, model);
+}
+
+BOOL setup_hud_matrices()
+{
+ LLRect whole_screen = get_whole_screen_region();
+ return setup_hud_matrices(whole_screen);
+}
+
+BOOL setup_hud_matrices(const LLRect& screen_region)
+{
+ glh::matrix4f proj, model;
+ bool result = get_hud_matrices(screen_region, proj, model);
+ if (!result) return result;
+
+ // set up transform to keep HUD objects in front of camera
+ glMatrixMode(GL_PROJECTION);
+ glLoadMatrixf(proj.m);
+ glh_set_current_projection(proj);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadMatrixf(model.m);
+ glh_set_current_modelview(model);
+ return TRUE;
+}
+
static LLFastTimer::DeclareTimer FTM_SWAP("Swap");
void render_ui(F32 zoom_factor, int subfield)
@@ -1109,7 +1129,6 @@ void render_ui(F32 zoom_factor, int subfield)
}
{
-
gGL.color4f(1,1,1,1);
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
@@ -1120,6 +1139,10 @@ void render_ui(F32 zoom_factor, int subfield)
render_ui_3d();
LLGLState::checkStates();
}
+ else
+ {
+ render_disconnected_background();
+ }
render_ui_2d();
LLGLState::checkStates();
@@ -1268,8 +1291,8 @@ void render_ui_2d()
int pos_y = sub_region / llceil(zoom_factor);
int pos_x = sub_region - (pos_y*llceil(zoom_factor));
// offset for this tile
- LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidth() * (F32)pos_x / zoom_factor);
- LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeight() * (F32)pos_y / zoom_factor);
+ LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidthScaled() * (F32)pos_x / zoom_factor);
+ LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeightScaled() * (F32)pos_y / zoom_factor);
}
stop_glerror();
@@ -1279,8 +1302,8 @@ void render_ui_2d()
if (gAgent.getAvatarObject() && gAgent.mHUDCurZoom < 0.98f)
{
glPushMatrix();
- S32 half_width = (gViewerWindow->getWindowWidth() / 2);
- S32 half_height = (gViewerWindow->getWindowHeight() / 2);
+ S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
+ S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
glTranslatef((F32)half_width, (F32)half_height, 0.f);
F32 zoom = gAgent.mHUDCurZoom;
@@ -1340,8 +1363,8 @@ void render_ui_2d()
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
- S32 width = gViewerWindow->getWindowWidth();
- S32 height = gViewerWindow->getWindowHeight();
+ S32 width = gViewerWindow->getWindowWidthScaled();
+ S32 height = gViewerWindow->getWindowHeightScaled();
gGL.getTexUnit(0)->bind(&gPipeline.mUIScreen);
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.color4f(1,1,1,1);
@@ -1410,8 +1433,8 @@ void render_disconnected_background()
}
// Make sure the progress view always fills the entire window.
- S32 width = gViewerWindow->getWindowWidth();
- S32 height = gViewerWindow->getWindowHeight();
+ S32 width = gViewerWindow->getWindowWidthScaled();
+ S32 height = gViewerWindow->getWindowHeightScaled();
if (gDisconnectedImagep)
{
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index dace3f875f..8370c98470 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -38,6 +38,7 @@
#include "llviewerfloaterreg.h"
#include "llcompilequeue.h"
+#include "llcallfloater.h"
#include "llfloaterabout.h"
#include "llfloateractivespeakers.h"
#include "llfloateranimpreview.h"
@@ -52,11 +53,9 @@
#include "llfloaterbuyland.h"
#include "llfloaterbulkpermission.h"
#include "llfloaterbump.h"
-#include "llfloatercall.h"
#include "llfloatercamera.h"
-#include "llfloaterchat.h"
-#include "llfloaterchatterbox.h"
#include "llfloaterdaycycle.h"
+#include "llfloaterevent.h"
#include "llfloatersearch.h"
#include "llfloaterenvsettings.h"
#include "llfloaterfonttest.h"
@@ -70,7 +69,6 @@
#include "llfloaterhud.h"
#include "llfloaterimagepreview.h"
#include "llimfloater.h"
-#include "llimpanel.h"
#include "llfloaterinspect.h"
#include "llfloaterinventory.h"
#include "llfloaterjoystick.h"
@@ -92,6 +90,7 @@
#include "llfloaterregioninfo.h"
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
+#include "llfloaterscriptlimits.h"
#include "llfloatersellland.h"
#include "llfloatersettingsdebug.h"
#include "llfloatersnapshot.h"
@@ -107,11 +106,14 @@
#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindlight.h"
+#include "llfloaterwindowsize.h"
#include "llfloaterworldmap.h"
+#include "llimfloatercontainer.h"
#include "llinspectavatar.h"
#include "llinspectgroup.h"
#include "llinspectobject.h"
-#include "llmediaremotectrl.h"
+#include "llinspectremoteobject.h"
+#include "llinspecttoast.h"
#include "llmoveview.h"
#include "llnearbychat.h"
#include "llpanelblockedlist.h"
@@ -122,6 +124,7 @@
#include "llpreviewsound.h"
#include "llpreviewtexture.h"
#include "llsyswellwindow.h"
+#include "llscriptfloater.h"
// *NOTE: Please add files in alphabetical order to keep merges easy.
@@ -147,17 +150,18 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
- LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);
+ //LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);
LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
- LLFloaterReg::add("communicate", "floater_chatterbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatterBox>);
+
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
- LLFloaterReg::add("contacts", "floater_my_friends.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyFriends>);
LLFloaterReg::add("env_day_cycle", "floater_day_cycle_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDayCycle>);
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+
+ LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
@@ -169,11 +173,16 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+ LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
+ LLFloaterReg::add("im_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMWellWindow>);
+ LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
+ LLInspectRemoteObjectUtil::registerFloater();
+ LLNotificationsUI::registerFloater();
LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
@@ -186,12 +195,12 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("moveview", "floater_moveview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMove>);
LLFloaterReg::add("mute_object_by_name", "floater_mute_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGetBlockedObjectName>);
LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);
- LLFloaterReg::add("syswell_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLSysWellWindow>);
-
+
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
+ LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
-
+ LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>);
LLFloaterPayUtil::registerFloater();
@@ -214,8 +223,13 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml",
&LLFloaterReg::build<LLFloaterTestInspectors>);
- LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>);
- LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);
+ //LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>);
+ LLFloaterReg::add("test_textbox", "floater_test_textbox.xml",
+ &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml",
+ &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_widgets", "floater_test_widgets.xml",
+ &LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>);
LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
@@ -224,6 +238,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);
LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>);
+ LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
+ LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
@@ -237,15 +253,13 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
- LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
+ LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
+ LLFloaterWindowSizeUtil::registerFloater();
LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);
// *NOTE: Please keep these alphabetized for easier merges
- // debug use only
- LLFloaterReg::add("media_remote_ctrl", "floater_media_remote.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaRemoteCtrl>);
-
LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving
}
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
new file mode 100644
index 0000000000..033d35d80a
--- /dev/null
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -0,0 +1,277 @@
+/**
+ * @file llfoldertype.cpp
+ * @brief Implementation of LLViewerFolderType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerfoldertype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llvisualparam.h"
+
+static const std::string empty_string;
+
+struct ViewerFolderEntry : public LLDictionaryEntry
+{
+ // Constructor for non-ensembles
+ ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type
+ const std::string &icon_name, // name of the folder icon
+ BOOL is_quiet // folder doesn't need a UI update when changed
+ )
+ :
+ LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank
+ mIconName(icon_name),
+ mNewCategoryName(new_category_name),
+ mIsQuiet(is_quiet)
+ {
+ mAllowedNames.clear();
+ }
+
+ // Constructor for ensembles
+ ViewerFolderEntry(const std::string &xui_name, // name of the xui menu item
+ const std::string &new_category_name, // default name when creating a new category of this type
+ const std::string &icon_name, // name of the folder icon
+ const std::string allowed_names // allowed item typenames for this folder type
+ )
+ :
+ LLDictionaryEntry(xui_name),
+ mIconName(icon_name),
+ mNewCategoryName(new_category_name),
+ mIsQuiet(FALSE)
+ {
+ const std::string delims (",");
+ LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims);
+ }
+
+ bool getIsAllowedName(const std::string &name) const
+ {
+ if (mAllowedNames.empty())
+ return false;
+ for (name_vec_t::const_iterator iter = mAllowedNames.begin();
+ iter != mAllowedNames.end();
+ iter++)
+ {
+ if (name == (*iter))
+ return true;
+ }
+ return false;
+ }
+ const std::string mIconName;
+ const std::string mNewCategoryName;
+ typedef std::vector<std::string> name_vec_t;
+ name_vec_t mAllowedNames;
+ BOOL mIsQuiet;
+};
+
+class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
+ public LLDictionary<LLFolderType::EType, ViewerFolderEntry>
+{
+public:
+ LLViewerFolderDictionary();
+protected:
+ bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml
+};
+
+LLViewerFolderDictionary::LLViewerFolderDictionary()
+{
+ initEnsemblesFromFile();
+
+ // NEW CATEGORY NAME FOLDER ICON NAME QUIET?
+ // |-------------------------|-------------------------------|-----------|
+ addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "inv_folder_texture.tga", FALSE));
+ addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "inv_folder_sound.tga", FALSE));
+ addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "inv_folder_callingcard.tga", FALSE));
+ addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "inv_folder_landmark.tga", FALSE));
+ addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga", FALSE));
+ addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga", FALSE));
+ addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga", FALSE));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "", FALSE));
+ addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga", FALSE));
+ addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga", FALSE));
+ addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga", TRUE));
+ addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "inv_folder_snapshot.tga", FALSE));
+ addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga", TRUE));
+ addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga", FALSE));
+ addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga", FALSE));
+ addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_plain_closed.tga", FALSE));
+
+ addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga",TRUE));
+ addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga", TRUE));
+ addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_my_outfits.tga", TRUE));
+ addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga", FALSE));
+
+ addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga", FALSE));
+}
+
+bool LLViewerFolderDictionary::initEnsemblesFromFile()
+{
+ std::string xml_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"foldertypes.xml");
+ LLXmlTree folder_def;
+ if (!folder_def.parseFile(xml_filename))
+ {
+ llerrs << "Failed to parse folders file " << xml_filename << llendl;
+ return false;
+ }
+
+ LLXmlTreeNode* rootp = folder_def.getRoot();
+ for (LLXmlTreeNode* ensemble = rootp->getFirstChild();
+ ensemble;
+ ensemble = rootp->getNextChild())
+ {
+ if (!ensemble->hasName("ensemble"))
+ {
+ llwarns << "Invalid ensemble definition node " << ensemble->getName() << llendl;
+ continue;
+ }
+
+ S32 ensemble_type;
+ static LLStdStringHandle ensemble_num_string = LLXmlTree::addAttributeString("foldertype_num");
+ if (!ensemble->getFastAttributeS32(ensemble_num_string, ensemble_type))
+ {
+ llwarns << "No ensemble type defined" << llendl;
+ continue;
+ }
+
+
+ if (ensemble_type < S32(LLFolderType::FT_ENSEMBLE_START) || ensemble_type > S32(LLFolderType::FT_ENSEMBLE_END))
+ {
+ llwarns << "Exceeded maximum ensemble index" << LLFolderType::FT_ENSEMBLE_END << llendl;
+ break;
+ }
+
+ std::string xui_name;
+ static LLStdStringHandle xui_name_string = LLXmlTree::addAttributeString("xui_name");
+ if (!ensemble->getFastAttributeString(xui_name_string, xui_name))
+ {
+ llwarns << "No xui name defined" << llendl;
+ continue;
+ }
+
+ std::string icon_name;
+ static LLStdStringHandle icon_name_string = LLXmlTree::addAttributeString("icon_name");
+ if (!ensemble->getFastAttributeString(icon_name_string, icon_name))
+ {
+ llwarns << "No ensemble icon name defined" << llendl;
+ continue;
+ }
+
+ std::string allowed_names;
+ static LLStdStringHandle allowed_names_string = LLXmlTree::addAttributeString("allowed");
+ if (!ensemble->getFastAttributeString(allowed_names_string, allowed_names))
+ {
+ }
+
+ // Add the entry and increment the asset number.
+ const static std::string new_ensemble_name = "New Ensemble";
+ addEntry(LLFolderType::EType(ensemble_type), new ViewerFolderEntry(xui_name, new_ensemble_name, icon_name, allowed_names));
+ }
+
+ return true;
+}
+
+
+const std::string &LLViewerFolderType::lookupXUIName(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mName;
+ }
+ return badLookup();
+}
+
+LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string &name)
+{
+ return LLViewerFolderDictionary::getInstance()->lookup(name);
+}
+
+const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mIconName;
+ }
+ return badLookup();
+}
+
+BOOL LLViewerFolderType::lookupIsQuietType(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mIsQuiet;
+ }
+ return FALSE;
+}
+
+
+const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mNewCategoryName;
+ }
+ return badLookup();
+}
+
+LLFolderType::EType LLViewerFolderType::lookupTypeFromNewCategoryName(const std::string& name)
+{
+ for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin();
+ iter != LLViewerFolderDictionary::getInstance()->end();
+ iter++)
+ {
+ const ViewerFolderEntry *entry = iter->second;
+ if (entry->mNewCategoryName == name)
+ {
+ return iter->first;
+ }
+ }
+ return FT_NONE;
+}
+
+
+U64 LLViewerFolderType::lookupValidFolderTypes(const std::string& item_name)
+{
+ U64 matching_folders = 0;
+ for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin();
+ iter != LLViewerFolderDictionary::getInstance()->end();
+ iter++)
+ {
+ const ViewerFolderEntry *entry = iter->second;
+ if (entry->getIsAllowedName(item_name))
+ {
+ matching_folders |= 1LL << iter->first;
+ }
+ }
+ return matching_folders;
+}
diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h
new file mode 100644
index 0000000000..dd9360da90
--- /dev/null
+++ b/indra/newview/llviewerfoldertype.h
@@ -0,0 +1,59 @@
+/**
+ * @file llviewerfoldertype.h
+ * @brief Declaration of LLAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERFOLDERTYPE_H
+#define LL_LLVIEWERFOLDERTYPE_H
+
+#include <string>
+#include "llfoldertype.h"
+
+// This class is similar to llfoldertype, but contains methods
+// only used by the viewer. This also handles ensembles.
+class LLViewerFolderType : public LLFolderType
+{
+public:
+ static const std::string& lookupXUIName(EType folder_type); // name used by the UI
+ static LLFolderType::EType lookupTypeFromXUIName(const std::string& name);
+
+ static const std::string& lookupIconName(EType folder_type); // folder icon name
+ static BOOL lookupIsQuietType(EType folder_type); // folder doesn't require UI update when changes have occured
+ static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category
+ static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category
+
+ static U64 lookupValidFolderTypes(const std::string& item_name); // which folders allow an item of this type?
+
+protected:
+ LLViewerFolderType() {}
+ ~LLViewerFolderType() {}
+};
+
+#endif // LL_LLVIEWERFOLDERTYPE_H
diff --git a/indra/newview/llviewergenericmessage.h b/indra/newview/llviewergenericmessage.h
index 6e1f0945b8..6b0a2e5d81 100644
--- a/indra/newview/llviewergenericmessage.h
+++ b/indra/newview/llviewergenericmessage.h
@@ -36,6 +36,7 @@
class LLUUID;
class LLDispatcher;
+class LLMessageSystem;
void send_generic_message(const std::string& method,
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 0e0727e382..b82538dacb 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -33,35 +33,82 @@
#include "llviewerprecompiledheaders.h"
+#include "llcommandhandler.h"
#include "llfloaterhelpbrowser.h"
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llviewercontrol.h"
-#include "llversionviewer.h"
#include "llappviewer.h"
+#include "lllogininstance.h"
#include "llviewerhelputil.h"
#include "llviewerhelp.h"
+// support for secondlife:///app/help/{TOPIC} SLapps
+class LLHelpHandler : public LLCommandHandler
+{
+public:
+ // requests will be throttled from a non-trusted browser
+ LLHelpHandler() : LLCommandHandler("help", UNTRUSTED_THROTTLE) {}
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+ if (! vhelp)
+ {
+ return false;
+ }
+
+ // get the requested help topic name, or use the fallback if none
+ std::string help_topic = vhelp->defaultTopic();
+ if (params.size() >= 1)
+ {
+ help_topic = params[0].asString();
+ }
+
+ vhelp->showTopic(help_topic);
+ return true;
+ }
+};
+LLHelpHandler gHelpHandler;
//////////////////////////////
// implement LLHelp interface
void LLViewerHelp::showTopic(const std::string &topic)
{
- showHelp();
-
+ // allow overriding the help server with a local help file
if( gSavedSettings.getBOOL("HelpUseLocal") )
{
+ showHelp();
LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
+ return;
}
- else
+
+ // if the help topic is empty, use the default topic
+ std::string help_topic = topic;
+ if (help_topic.empty())
{
- const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
- std::string helpURL = LLViewerHelpUtil::buildHelpURL( topic, gSavedSettings, osinfo );
- setRawURL( helpURL );
+ help_topic = defaultTopic();
}
+
+ // f1 help topic means: if the user is not logged in yet, show
+ // the pre-login topic instead of the default fallback topic,
+ // otherwise show help for the focused item
+ if (help_topic == f1HelpTopic())
+ {
+ help_topic = getTopicFromFocus();
+ if (help_topic == defaultTopic() && ! LLLoginInstance::getInstance()->authSuccess())
+ {
+ help_topic = preLoginTopic();
+ }
+ }
+
+ // work out the URL for this topic and display it
+ showHelp();
+ std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic );
+ setRawURL( helpURL );
}
std::string LLViewerHelp::defaultTopic()
@@ -70,6 +117,18 @@ std::string LLViewerHelp::defaultTopic()
return "this_is_fallbacktopic";
}
+std::string LLViewerHelp::preLoginTopic()
+{
+ // *hack: to be done properly
+ return "pre_login_help";
+}
+
+std::string LLViewerHelp::f1HelpTopic()
+{
+ // *hack: to be done properly
+ return "f1_help";
+}
+
//////////////////////////////
// our own interfaces
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index 17aab6f239..07971a593e 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -51,11 +51,17 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
/// display the specified help topic in the help viewer
/*virtual*/ void showTopic(const std::string &topic);
+ // return topic derived from viewer UI focus, else default topic
+ std::string getTopicFromFocus();
+
/// return default (fallback) topic name suitable for showTopic()
/*virtual*/ std::string defaultTopic();
- // return topic derived from viewer UI focus, else default topic
- std::string getTopicFromFocus();
+ // return topic to use before the user logs in
+ /*virtual*/ std::string preLoginTopic();
+
+ // return topic to use for the top-level help, invoked by F1
+ /*virtual*/ std::string f1HelpTopic();
private:
static void showHelp(); // make sure help UI is visible & raised
diff --git a/indra/newview/llviewerhelputil.cpp b/indra/newview/llviewerhelputil.cpp
index c1555eacdc..967a2925e3 100644
--- a/indra/newview/llviewerhelputil.cpp
+++ b/indra/newview/llviewerhelputil.cpp
@@ -32,23 +32,14 @@
*/
#include "llviewerprecompiledheaders.h"
+#include "llviewerhelputil.h"
-#include "llversionviewer.h"
-
-//#include "llfloaterhelpbrowser.h"
-//#include "llfloaterreg.h"
-//#include "llfocusmgr.h"
-//#include "llviewercontrol.h"
-//#include "llappviewer.h"
-
+#include "llagent.h"
+#include "llsd.h"
#include "llstring.h"
#include "lluri.h"
-#include "llsys.h"
-
-#include "llcontrol.h"
-
-#include "llviewerhelputil.h"
-
+#include "llweb.h"
+#include "llviewercontrol.h"
//////////////////////////////////////////////
// Build a help URL from a topic and formatter
@@ -68,47 +59,15 @@ std::string LLViewerHelpUtil::helpURLEncode( const std::string &component )
return escaped;
}
-static std::string buildHelpVersion( const U32 ver_int )
-{
- std::ostringstream ver_str;
- ver_str << ver_int;
- return ver_str.str(); // not encoded - numbers are rfc3986-safe
-}
-
//static
-std::string LLViewerHelpUtil::buildHelpURL( const std::string &topic,
- LLControlGroup &savedSettings,
- const LLOSInfo &osinfo )
+std::string LLViewerHelpUtil::buildHelpURL( const std::string &topic)
{
- std::string helpURL = savedSettings.getString("HelpURLFormat");
LLSD substitution;
substitution["TOPIC"] = helpURLEncode(topic);
+ substitution["DEBUG_MODE"] = gAgent.isGodlike() ? "/debug" : "";
- substitution["CHANNEL"] = helpURLEncode(savedSettings.getString("VersionChannelName"));
-
- // *TODO: We should put this version pattern in a central place; this and near
- // equivalents are replicated in other code - what's a good location?
- std::ostringstream version;
- version << LL_VERSION_MAJOR << "."
- << LL_VERSION_MINOR << "."
- << LL_VERSION_PATCH << "."
- << LL_VERSION_BUILD;
- substitution["VERSION"] = helpURLEncode(version.str());
- substitution["VERSION_MAJOR"] = buildHelpVersion(LL_VERSION_MAJOR);
- substitution["VERSION_MINOR"] = buildHelpVersion(LL_VERSION_MINOR);
- substitution["VERSION_PATCH"] = buildHelpVersion(LL_VERSION_PATCH);
- substitution["VERSION_BUILD"] = buildHelpVersion(LL_VERSION_BUILD);
-
- substitution["OS"] = helpURLEncode(osinfo.getOSStringSimple());
-
- std::string language = savedSettings.getString("Language");
- if( language.empty() || language == "default" )
- {
- language = savedSettings.getString("SystemLanguage");
- }
- substitution["LANGUAGE"] = helpURLEncode(language);
-
- LLStringUtil::format(helpURL, substitution);
-
- return helpURL;
+ // get the help URL and expand all of the substitutions
+ // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+ std::string helpURL = gSavedSettings.getString("HelpURLFormat");
+ return LLWeb::expandURLSubstitutions(helpURL, substitution);
}
diff --git a/indra/newview/llviewerhelputil.h b/indra/newview/llviewerhelputil.h
index 8ee0d96023..95e6744842 100644
--- a/indra/newview/llviewerhelputil.h
+++ b/indra/newview/llviewerhelputil.h
@@ -41,9 +41,7 @@ class LLViewerHelpUtil
{
public:
static std::string helpURLEncode( const std::string &component );
- static std::string buildHelpURL( const std::string &topic,
- LLControlGroup &savedSettings,
- const LLOSInfo &osinfo);
+ static std::string buildHelpURL( const std::string &topic );
};
#endif // header guard
diff --git a/indra/newview/llviewerhome.cpp b/indra/newview/llviewerhome.cpp
new file mode 100644
index 0000000000..8fdbe0a4ae
--- /dev/null
+++ b/indra/newview/llviewerhome.cpp
@@ -0,0 +1,83 @@
+/**
+ * @file llviewerhome.cpp
+ * @brief Model (non-View) component for the web-based Home side panel
+ * @author Martin Reddy
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewerhome.h"
+
+#include "lllogininstance.h"
+#include "llsd.h"
+#include "llui.h"
+#include "lluri.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+
+//static
+std::string LLViewerHome::getHomeURL()
+{
+ // Return the URL to display in the Home side tray. We read
+ // this value from settings.xml and support various substitutions
+
+ LLSD substitution;
+ substitution["AUTH_TOKEN"] = LLURI::escape(getAuthKey());
+
+ // get the home URL from the settings.xml file
+ std::string homeURL = gSavedSettings.getString("HomeSidePanelURL");
+
+ // support a grid-level override of the URL from login.cgi
+ LLSD grid_url = LLLoginInstance::getInstance()->getResponse("home_sidetray_url");
+ if (! grid_url.asString().empty())
+ {
+ homeURL = grid_url.asString();
+ }
+
+ // expand all substitution strings in the URL and return it
+ // (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+ return LLWeb::expandURLSubstitutions(homeURL, substitution);
+}
+
+//static
+std::string LLViewerHome::getAuthKey()
+{
+ // return the value of the (optional) auth token returned by login.cgi
+ // this lets the server provide an authentication token that we can
+ // blindly pass to the Home web page for it to perform authentication.
+ // We use "home_sidetray_token", and fallback to "auth_token" if not
+ // present.
+ LLSD auth_token = LLLoginInstance::getInstance()->getResponse("home_sidetray_token");
+ if (auth_token.asString().empty())
+ {
+ auth_token = LLLoginInstance::getInstance()->getResponse("auth_token");
+ }
+ return auth_token.asString();
+}
+
diff --git a/indra/newview/llviewerhome.h b/indra/newview/llviewerhome.h
new file mode 100644
index 0000000000..50454a71b7
--- /dev/null
+++ b/indra/newview/llviewerhome.h
@@ -0,0 +1,49 @@
+/**
+ * @file llviewerhome.h
+ * @brief Model (non-View) component for the web-based Home side panel
+ * @author Martin Reddy
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERHOME_H
+#define LL_LLVIEWERHOME_H
+
+#include <string>
+
+class LLViewerHome
+{
+public:
+ /// return the URL to use for the web-based Home side panel
+ static std::string getHomeURL();
+
+ /// return the authentication key for the Home web site
+ static std::string getAuthKey();
+};
+
+#endif
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 366e5602bd..b69eaa4853 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -33,20 +33,24 @@
#include "llviewerprecompiledheaders.h"
#include "llviewerinventory.h"
+#include "llnotificationsutil.h"
+#include "llsdserialize.h"
#include "message.h"
#include "indra_constants.h"
#include "llagent.h"
-#include "llfoldertype.h"
+#include "llviewerfoldertype.h"
+#include "llfolderview.h"
#include "llviewercontrol.h"
#include "llconsole.h"
#include "llinventorymodel.h"
-#include "llnotify.h"
#include "llgesturemgr.h"
+#include "llsidetray.h"
#include "llinventorybridge.h"
#include "llfloaterinventory.h"
+#include "llviewerassettype.h"
#include "llviewerregion.h"
#include "llviewerobjectlist.h"
#include "llpreviewgesture.h"
@@ -54,11 +58,60 @@
#include "lltrans.h"
#include "llappearancemgr.h"
#include "llfloatercustomize.h"
+#include "llcommandhandler.h"
+#include "llviewermessage.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
+class LLInventoryHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
+
+ // support secondlife:///app/inventory/show
+ if (params[0].asString() == "show")
+ {
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD());
+ return true;
+ }
+
+ // otherwise, we need a UUID and a verb...
+ if (params.size() < 2)
+ {
+ return false;
+ }
+ LLUUID inventory_id;
+ if (!inventory_id.set(params[0], FALSE))
+ {
+ return false;
+ }
+
+ const std::string verb = params[1].asString();
+ if (verb == "select")
+ {
+ std::vector<LLUUID> items_to_open;
+ items_to_open.push_back(inventory_id);
+ //inventory_handler is just a stub, because we don't know from who this offer
+ open_inventory_offer(items_to_open, "inventory_handler");
+ return true;
+ }
+
+ return false;
+ }
+};
+LLInventoryHandler gInventoryHandler;
+
///----------------------------------------------------------------------------
/// Class LLViewerInventoryItem
///----------------------------------------------------------------------------
@@ -358,7 +411,7 @@ void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const
LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid,
const LLUUID& parent_uuid,
- LLAssetType::EType pref,
+ LLFolderType::EType pref,
const std::string& name,
const LLUUID& owner_id) :
LLInventoryCategory(uuid, parent_uuid, pref, name),
@@ -415,9 +468,9 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const
{
// communicate that change with the server.
- if (LLAssetType::lookupIsProtectedCategoryType(mPreferredType))
+ if (LLFolderType::lookupIsProtectedType(mPreferredType))
{
- LLNotifications::instance().add("CannotModifyProtectedCategories");
+ LLNotificationsUtil::add("CannotModifyProtectedCategories");
return;
}
@@ -439,9 +492,9 @@ void LLViewerInventoryCategory::removeFromServer( void )
llinfos << "Removing inventory category " << mUUID << " from server."
<< llendl;
// communicate that change with the server.
- if(LLAssetType::lookupIsProtectedCategoryType(mPreferredType))
+ if(LLFolderType::lookupIsProtectedType(mPreferredType))
{
- LLNotifications::instance().add("CannotRemoveProtectedCategories");
+ LLNotificationsUtil::add("CannotRemoveProtectedCategories");
return;
}
@@ -474,11 +527,16 @@ bool LLViewerInventoryCategory::fetchDescendents()
// This comes from LLInventoryFilter from llfolderview.h
U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
+ // *NOTE: For bug EXT-2879, originally commented out
+ // gAgent.getRegion()->getCapability in order to use the old
+ // message-based system. This has been uncommented now that
+ // AIS folks are aware of the issue and have a fix in process.
+ // see ticket for details.
+
std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
-
if (!url.empty()) //Capability found. Build up LLSD and use it.
{
- LLInventoryModel::startBackgroundFetch(mUUID);
+ gInventory.startBackgroundFetch(mUUID);
}
else
{ //Deprecated, but if we don't have a capability, use the old system.
@@ -542,7 +600,7 @@ bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp)
}
else if(0 == strcmp("pref_type", keyword))
{
- mPreferredType = LLAssetType::lookup(valuestr);
+ mPreferredType = LLFolderType::lookup(valuestr);
}
else if(0 == strcmp("name", keyword))
{
@@ -580,7 +638,7 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
mParentUUID.toString(uuid_str);
fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str());
fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
- fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType));
+ fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str());
fprintf(fp, "\t\tname\t%s|\n", mName.c_str());
mOwnerID.toString(uuid_str);
fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str());
@@ -591,8 +649,10 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
void LLViewerInventoryCategory::determineFolderType()
{
- LLAssetType::EType original_type = getPreferredType();
- if (LLAssetType::lookupIsProtectedCategoryType(original_type))
+ /* Do NOT uncomment this code. This is for future 2.1 support of ensembles.
+ llassert(FALSE);
+ LLFolderType::EType original_type = getPreferredType();
+ if (LLFolderType::lookupIsProtectedType(original_type))
return;
U64 folder_valid = 0;
@@ -615,28 +675,30 @@ void LLViewerInventoryCategory::determineFolderType()
{
const EWearableType wearable_type = item->getWearableType();
const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type);
- U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name);
+ U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name);
folder_valid |= valid_folder_types;
folder_invalid |= ~valid_folder_types;
}
}
- for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++)
+ for (U8 i = LLFolderType::FT_ENSEMBLE_START; i <= LLFolderType::FT_ENSEMBLE_END; i++)
{
if ((folder_valid & (1LL << i)) &&
!(folder_invalid & (1LL << i)))
{
- changeType((LLAssetType::EType)i);
+ changeType((LLFolderType::EType)i);
return;
}
}
}
- if (LLAssetType::lookupIsEnsembleCategoryType(original_type))
+ if (LLFolderType::lookupIsEnsembleType(original_type))
{
- changeType(LLAssetType::AT_NONE);
+ changeType(LLFolderType::FT_NONE);
}
+ llassert(FALSE);
+ */
}
-void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type)
+void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)
{
const LLUUID &folder_id = getUUID();
const LLUUID &parent_id = getParentUUID();
@@ -783,6 +845,13 @@ void CreateGestureCallback::fire(const LLUUID& inv_item)
gFloaterView->adjustToFitScreen(preview, FALSE);
}
+void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id)
+{
+ if (mTargetLandmarkId.isNull()) return;
+
+ gInventory.rearrangeFavoriteLandmarks(inv_item_id, mTargetLandmarkId);
+}
+
LLInventoryCallbackManager gInventoryCallbacks;
void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
@@ -874,8 +943,20 @@ void link_inventory_item(
}
LLUUID transaction_id;
- std::string desc = "Link";
+ std::string desc = "Broken link"; // This should only show if the object can't find its baseobj.
LLInventoryType::EType inv_type = LLInventoryType::IT_NONE;
+ if (dynamic_cast<const LLInventoryCategory *>(baseobj))
+ {
+ inv_type = LLInventoryType::IT_CATEGORY;
+ }
+ else
+ {
+ const LLViewerInventoryItem *baseitem = dynamic_cast<const LLViewerInventoryItem *>(baseobj);
+ if (baseitem)
+ {
+ inv_type = baseitem->getInventoryType();
+ }
+ }
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LinkInventoryItem);
@@ -947,7 +1028,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar
body["notecard-id"] = notecard_inv_id;
body["object-id"] = object_id;
body["item-id"] = src->getUUID();
- body["folder-id"] = gInventory.findCategoryUUIDForType(src->getType());
+ body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
body["callback-id"] = (LLSD::Integer)callback_id;
request["message"] = "CopyInventoryFromNotecard";
@@ -963,7 +1044,7 @@ void create_new_item(const std::string& name,
U32 next_owner_perm)
{
std::string desc;
- LLAssetType::generateDescriptionFor(asset_type, desc);
+ LLViewerAssetType::generateDescriptionFor(asset_type, desc);
next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
@@ -988,19 +1069,14 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not
const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)
const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
+// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...
void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
{
- std::string type = userdata.asString();
+ std::string type_name = userdata.asString();
- if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) )
+ if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
{
- LLAssetType::EType a_type = LLAssetType::AT_NONE;
- if ("current" == type)
- a_type = LLAssetType::AT_CURRENT_OUTFIT;
- if ("outfit" == type)
- a_type = LLAssetType::AT_OUTFIT;
- if ("my_otfts" == type)
- a_type = LLAssetType::AT_MY_OUTFITS;
+ LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
LLUUID parent_id;
if (bridge)
@@ -1016,103 +1092,53 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
parent_id = gInventory.getRootFolderID();
}
- LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null);
+ LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);
gInventory.notifyObservers();
folder->setSelectionByID(category, TRUE);
}
- else if ("lsl" == type)
+ else if ("lsl" == type_name)
{
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT);
create_new_item(NEW_LSL_NAME,
parent_id,
LLAssetType::AT_LSL_TEXT,
LLInventoryType::IT_LSL,
PERM_MOVE | PERM_TRANSFER);
}
- else if ("notecard" == type)
+ else if ("notecard" == type_name)
{
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_NOTECARD);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD);
create_new_item(NEW_NOTECARD_NAME,
parent_id,
LLAssetType::AT_NOTECARD,
LLInventoryType::IT_NOTECARD,
PERM_ALL);
}
- else if ("gesture" == type)
+ else if ("gesture" == type_name)
{
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
create_new_item(NEW_GESTURE_NAME,
parent_id,
LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE,
PERM_ALL);
}
- else if ("shirt" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SHIRT);
- }
- else if ("pants" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_PANTS);
- }
- else if ("shoes" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SHOES);
- }
- else if ("socks" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SOCKS);
- }
- else if ("jacket" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_JACKET);
- }
- else if ("skirt" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SKIRT);
- }
- else if ("gloves" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_GLOVES);
- }
- else if ("undershirt" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT);
- }
- else if ("underpants" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS);
- }
- else if ("shape" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_SHAPE);
- }
- else if ("skin" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_SKIN);
- }
- else if ("hair" == type)
- {
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_HAIR);
- }
- else if ("eyes" == type)
+ else
{
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_EYES);
+ // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary.
+ EWearableType wearable_type = LLWearableDictionary::typeNameToType(type_name);
+ if (wearable_type >= WT_SHAPE && wearable_type < WT_COUNT)
+ {
+ LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(wearable_type);
+ LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(folder_type);
+ LLFolderBridge::createWearable(parent_id, wearable_type);
+ }
+ else
+ {
+ llwarns << "Can't create unrecognized type " << type_name << llendl;
+ }
}
-
folder->setNeedsAutoRename(TRUE);
}
@@ -1150,79 +1176,198 @@ const std::string& LLViewerInventoryItem::getName() const
return linked_category->getName();
}
- return getDisplayName();
+ return LLInventoryItem::getName();
}
-const std::string& LLViewerInventoryItem::getDisplayName() const
-{
- std::string result;
- BOOL hasSortField = extractSortFieldAndDisplayName(0, &result);
+/**
+ * Class to store sorting order of favorites landmarks in a local file. EXT-3985.
+ * It replaced previously implemented solution to store sort index in landmark's name as a "<N>@" prefix.
+ * Data are stored in user home directory.
+ */
+class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
+ , public LLDestroyClass<LLFavoritesOrderStorage>
+{
+public:
+ /**
+ * Sets sort index for specified with LLUUID favorite landmark
+ */
+ void setSortIndex(const LLUUID& inv_item_id, S32 sort_index);
+
+ /**
+ * Gets sort index for specified with LLUUID favorite landmark
+ */
+ S32 getSortIndex(const LLUUID& inv_item_id);
+ void removeSortIndex(const LLUUID& inv_item_id);
+
+ /**
+ * Implementation of LLDestroyClass. Calls cleanup() instance method.
+ *
+ * It is important this callback is called before gInventory is cleaned.
+ * For now it is called from LLAppViewer::cleanup() -> LLAppViewer::disconnectViewer(),
+ * Inventory is cleaned later from LLAppViewer::cleanup() after LLAppViewer::disconnectViewer() is called.
+ * @see cleanup()
+ */
+ static void destroyClass();
+
+ const static S32 NO_INDEX;
+private:
+ friend class LLSingleton<LLFavoritesOrderStorage>;
+ LLFavoritesOrderStorage() : mIsDirty(false) { load(); }
+ ~LLFavoritesOrderStorage() { save(); }
+
+ /**
+ * Removes sort indexes for items which are not in Favorites bar for now.
+ */
+ void cleanup();
+
+ const static std::string SORTING_DATA_FILE_NAME;
+
+ void load();
+ void save();
+
+ typedef std::map<LLUUID, S32> sort_index_map_t;
+ sort_index_map_t mSortIndexes;
+
+ bool mIsDirty;
+
+ struct IsNotInFavorites
+ {
+ IsNotInFavorites(const LLInventoryModel::item_array_t& items)
+ : mFavoriteItems(items)
+ {
- return mDisplayName = hasSortField ? result : LLInventoryItem::getName();
-}
+ }
-S32 LLViewerInventoryItem::getSortField() const
-{
- S32 result;
- BOOL hasSortField = extractSortFieldAndDisplayName(&result, 0);
+ /**
+ * Returns true if specified item is not found among inventory items
+ */
+ bool operator()(const sort_index_map_t::value_type& id_index_pair) const
+ {
+ LLPointer<LLViewerInventoryItem> item = gInventory.getItem(id_index_pair.first);
+ if (item.isNull()) return true;
- return hasSortField ? result : -1;
-}
+ LLInventoryModel::item_array_t::const_iterator found_it =
+ std::find(mFavoriteItems.begin(), mFavoriteItems.end(), item);
-void LLViewerInventoryItem::setSortField(S32 sortField)
-{
- using std::string;
+ return found_it == mFavoriteItems.end();
+ }
+ private:
+ LLInventoryModel::item_array_t mFavoriteItems;
+ };
- std::stringstream ss;
- ss << sortField;
+};
- string newSortField = ss.str();
+const std::string LLFavoritesOrderStorage::SORTING_DATA_FILE_NAME = "landmarks_sorting.xml";
+const S32 LLFavoritesOrderStorage::NO_INDEX = -1;
- const char separator = getSeparator();
- const string::size_type separatorPos = mName.find(separator, 0);
+void LLFavoritesOrderStorage::setSortIndex(const LLUUID& inv_item_id, S32 sort_index)
+{
+ mSortIndexes[inv_item_id] = sort_index;
+ mIsDirty = true;
+}
- if (separatorPos < string::npos)
- {
- // the name of the LLViewerInventoryItem already consists of sort field and display name.
- mName = newSortField + separator + mName.substr(separatorPos + 1, string::npos);
- }
- else
+S32 LLFavoritesOrderStorage::getSortIndex(const LLUUID& inv_item_id)
+{
+ sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id);
+ if (it != mSortIndexes.end())
{
- // there is no sort field in the name of LLViewerInventoryItem, we should add it
- mName = newSortField + separator + mName;
+ return it->second;
}
+ return NO_INDEX;
}
-void LLViewerInventoryItem::rename(const std::string& n)
+void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id)
{
- using std::string;
+ mSortIndexes.erase(inv_item_id);
+ mIsDirty = true;
+}
- string new_name(n);
- LLStringUtil::replaceNonstandardASCII(new_name, ' ');
- LLStringUtil::replaceChar(new_name, '|', ' ');
- LLStringUtil::trim(new_name);
- LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN);
+// static
+void LLFavoritesOrderStorage::destroyClass()
+{
+ LLFavoritesOrderStorage::instance().cleanup();
+}
- const char separator = getSeparator();
- const string::size_type separatorPos = mName.find(separator, 0);
+void LLFavoritesOrderStorage::load()
+{
+ // load per-resident sorting information
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
- if (separatorPos < string::npos)
+ LLSD settings_llsd;
+ llifstream file;
+ file.open(filename);
+ if (file.is_open())
{
- mName.replace(separatorPos + 1, string::npos, new_name);
+ LLSDSerialize::fromXML(settings_llsd, file);
}
- else
+
+ for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
+ iter != settings_llsd.endMap(); ++iter)
{
- mName = new_name;
+ mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger()));
}
}
-const LLPermissions& LLViewerInventoryItem::getPermissions() const
+void LLFavoritesOrderStorage::save()
{
- if (const LLViewerInventoryItem *linked_item = getLinkedItem())
+ // nothing to save if clean
+ if (!mIsDirty) return;
+
+ // If we quit from the login screen we will not have an SL account
+ // name. Don't try to save, otherwise we'll dump a file in
+ // C:\Program Files\SecondLife\ or similar. JC
+ std::string user_dir = gDirUtilp->getLindenUserDir();
+ if (!user_dir.empty())
{
- return linked_item->getPermissions();
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
+ LLSD settings_llsd;
+
+ for(sort_index_map_t::const_iterator iter = mSortIndexes.begin(); iter != mSortIndexes.end(); ++iter)
+ {
+ settings_llsd[iter->first.asString()] = iter->second;
+ }
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(settings_llsd, file);
}
+}
+
+void LLFavoritesOrderStorage::cleanup()
+{
+ // nothing to clean
+ if (!mIsDirty) return;
+
+ const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+ IsNotInFavorites is_not_in_fav(items);
+
+ sort_index_map_t aTempMap;
+ //copy unremoved values from mSortIndexes to aTempMap
+ std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(),
+ inserter(aTempMap, aTempMap.begin()),
+ is_not_in_fav);
+ //Swap the contents of mSortIndexes and aTempMap
+ mSortIndexes.swap(aTempMap);
+}
+
+
+S32 LLViewerInventoryItem::getSortField() const
+{
+ return LLFavoritesOrderStorage::instance().getSortIndex(mUUID);
+}
+
+void LLViewerInventoryItem::setSortField(S32 sortField)
+{
+ LLFavoritesOrderStorage::instance().setSortIndex(mUUID, sortField);
+}
+
+const LLPermissions& LLViewerInventoryItem::getPermissions() const
+{
// Use the actual permissions of the symlink, not its parent.
return LLInventoryItem::getPermissions();
}
@@ -1309,6 +1454,8 @@ U32 LLViewerInventoryItem::getCRC32() const
return LLInventoryItem::getCRC32();
}
+// *TODO: mantipov: should be removed with LMSortPrefix patch in llinventorymodel.cpp, EXT-3985
+static char getSeparator() { return '@'; }
BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName)
{
using std::string;
@@ -1380,6 +1527,25 @@ LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() const
return NULL;
}
+bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
+{
+ const LLPermissions& perm = getPermissions();
+ PermissionMask curr_mask = PERM_NONE;
+ if(perm.getOwner() == gAgent.getID())
+ {
+ curr_mask = perm.getMaskBase();
+ }
+ else if(gAgent.isInGroup(perm.getGroup()))
+ {
+ curr_mask = perm.getMaskGroup();
+ }
+ else
+ {
+ curr_mask = perm.getMaskEveryone();
+ }
+ return ((curr_mask & mask) == mask);
+}
+
//----------
void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
@@ -1389,3 +1555,74 @@ void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std:
gInventory.notifyObservers();
}
+class LLRegenerateLinkCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLRegenerateLinkCollector(const LLViewerInventoryItem *target_item) : mTargetItem(target_item) {}
+ virtual ~LLRegenerateLinkCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+ {
+ if (item)
+ {
+ if ((item->getName() == mTargetItem->getName()) &&
+ (item->getInventoryType() == mTargetItem->getInventoryType()) &&
+ (!item->getIsLinkType()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+protected:
+ const LLViewerInventoryItem* mTargetItem;
+};
+
+LLUUID find_possible_item_for_regeneration(const LLViewerInventoryItem *target_item)
+{
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+
+ LLRegenerateLinkCollector candidate_matches(target_item);
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ candidate_matches);
+ for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
+ {
+ const LLViewerInventoryItem *item = (*item_iter);
+ if (true) return item->getUUID();
+ }
+ return LLUUID::null;
+}
+
+// This currently dosen't work, because the sim does not allow us
+// to change an item's assetID.
+BOOL LLViewerInventoryItem::regenerateLink()
+{
+ const LLUUID target_item_id = find_possible_item_for_regeneration(this);
+ if (target_item_id.isNull())
+ return FALSE;
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLAssetIDMatches asset_id_matches(getAssetUUID());
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ asset_id_matches);
+ for (LLViewerInventoryItem::item_array_t::iterator item_iter = items.begin();
+ item_iter != items.end();
+ item_iter++)
+ {
+ LLViewerInventoryItem *item = (*item_iter);
+ item->setAssetUUID(target_item_id);
+ item->updateServer(FALSE);
+ gInventory.addChangedMask(LLInventoryObserver::REBUILD, item->getUUID());
+ }
+ gInventory.notifyObservers();
+ return TRUE;
+}
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index d523bf2859..c24f76c87a 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -58,17 +58,14 @@ public:
protected:
~LLViewerInventoryItem( void ); // ref counted
BOOL extractSortFieldAndDisplayName(S32* sortField, std::string* displayName) const { return extractSortFieldAndDisplayName(mName, sortField, displayName); }
- static char getSeparator() { return '@'; }
mutable std::string mDisplayName;
public:
virtual LLAssetType::EType getType() const;
virtual const LLUUID& getAssetUUID() const;
virtual const std::string& getName() const;
- virtual const std::string& getDisplayName() const;
virtual S32 getSortField() const;
virtual void setSortField(S32 sortField);
- virtual void rename(const std::string& new_name);
virtual const LLPermissions& getPermissions() const;
virtual const LLUUID& getCreatorUUID() const;
virtual const std::string& getDescription() const;
@@ -157,10 +154,16 @@ public:
bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory.
LLViewerInventoryItem *getLinkedItem() const;
LLViewerInventoryCategory *getLinkedCategory() const;
+
+ // Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set.
+ bool checkPermissionsSet(PermissionMask mask) const;
// callback
void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
-
+
+ // If this is a broken link, try to fix it and any other identical link.
+ BOOL regenerateLink();
+
public:
BOOL mIsComplete;
LLTransactionID mTransactionID;
@@ -185,7 +188,7 @@ protected:
public:
LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
- LLAssetType::EType preferred_type,
+ LLFolderType::EType preferred_type,
const std::string& name,
const LLUUID& owner_id);
LLViewerInventoryCategory(const LLUUID& owner_id);
@@ -221,7 +224,7 @@ public:
bool exportFileLocal(LLFILE* fp) const;
bool importFileLocal(LLFILE* fp);
void determineFolderType();
- void changeType(LLAssetType::EType new_folder_type);
+ void changeType(LLFolderType::EType new_folder_type);
protected:
LLUUID mOwnerID;
S32 mVersion;
@@ -272,6 +275,18 @@ public:
void fire(const LLUUID& inv_item);
};
+class AddFavoriteLandmarkCallback : public LLInventoryCallback
+{
+public:
+ AddFavoriteLandmarkCallback() : mTargetLandmarkId(LLUUID::null) {}
+ void setTargetLandmarkId(const LLUUID& target_uuid) { mTargetLandmarkId = target_uuid; }
+
+private:
+ void fire(const LLUUID& inv_item);
+
+ LLUUID mTargetLandmarkId;
+};
+
// misc functions
//void inventory_reliable_callback(void**, S32 status);
diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp
index c2591ac8d7..95f05b5f5f 100644
--- a/indra/newview/llviewerjoint.cpp
+++ b/indra/newview/llviewerjoint.cpp
@@ -59,13 +59,9 @@ BOOL LLViewerJoint::sDisableLOD = FALSE;
// Class Constructor
//-----------------------------------------------------------------------------
LLViewerJoint::LLViewerJoint()
+ : LLJoint()
{
- mUpdateXform = TRUE;
- mValid = FALSE;
- mComponents = SC_JOINT | SC_BONE | SC_AXES;
- mMinPixelArea = DEFAULT_LOD;
- mPickName = PN_DEFAULT;
- mVisible = TRUE;
+ init();
}
@@ -73,13 +69,21 @@ LLViewerJoint::LLViewerJoint()
// LLViewerJoint()
// Class Constructor
//-----------------------------------------------------------------------------
-LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) :
- LLJoint(name, parent)
+LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent)
+ : LLJoint(name, parent)
+{
+ init();
+}
+
+
+void LLViewerJoint::init()
{
mValid = FALSE;
mComponents = SC_JOINT | SC_BONE | SC_AXES;
mMinPixelArea = DEFAULT_LOD;
mPickName = PN_DEFAULT;
+ mVisible = TRUE;
+ mMeshID = 0;
}
diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h
index 0e993a2ebe..0d3092a044 100644
--- a/indra/newview/llviewerjoint.h
+++ b/indra/newview/llviewerjoint.h
@@ -37,7 +37,6 @@
// Header Files
//-----------------------------------------------------------------------------
#include "lljoint.h"
-#include "llapr.h"
class LLFace;
class LLViewerJointMesh;
@@ -143,6 +142,8 @@ public:
void setMeshID( S32 id ) {mMeshID = id;}
protected:
+ void init();
+
BOOL mValid;
U32 mComponents;
F32 mMinPixelArea;
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index cd60a8d560..1a67fc0966 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -147,6 +147,7 @@ LLViewerJointMesh::LLViewerJointMesh()
mTexture( NULL ),
mLayerSet( NULL ),
mTestImageName( 0 ),
+ mFaceIndexCount(0),
mIsTransparent(FALSE)
{
@@ -582,7 +583,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
}
else
{
- gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR));
+ gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
if (gRenderForSelect)
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index 543679c44b..d62b0ada85 100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
@@ -37,7 +37,6 @@
#include "llviewertexture.h"
#include "llpolymesh.h"
#include "v4color.h"
-#include "llapr.h"
class LLDrawable;
class LLFace;
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 8fd646ee93..f757155b94 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -538,8 +538,9 @@ void start_chat( EKeystate s )
void start_gesture( EKeystate s )
{
+ LLUICtrl* focus_ctrlp = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (KEYSTATE_UP == s &&
- !(gFocusMgr.getKeyboardFocus() && dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus())->acceptsTextInput()))
+ ! (focus_ctrlp && focus_ctrlp->acceptsTextInput()))
{
if (LLNearbyChatBar::getInstance()->getCurrentChat().empty())
{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index e2d9f5a2c9..395467dffb 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -32,28 +32,45 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
#include "llviewermedia.h"
#include "llviewermediafocus.h"
#include "llmimetypes.h"
#include "llmediaentry.h"
+#include "llversioninfo.h"
#include "llviewercontrol.h"
#include "llviewertexture.h"
#include "llviewerparcelmedia.h"
#include "llviewerparcelmgr.h"
-#include "llversionviewer.h"
#include "llviewertexturelist.h"
#include "llvovolume.h"
#include "llpluginclassmedia.h"
+#include "llviewerwindow.h"
+#include "llfocusmgr.h"
+#include "llcallbacklist.h"
+#include "llparcel.h"
+#include "llaudioengine.h" // for gAudiop
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llviewerregion.h"
#include "llevent.h" // LLSimpleListener
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "lluuid.h"
#include "llkeyboard.h"
#include "llmutelist.h"
+//#include "llfirstuse.h"
+#include "llwindow.h"
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
+/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "ParcelMediaAutoPlayEnable";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING = "MediaShowOnOthers";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING = "MediaShowWithinParcel";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING = "MediaShowOutsideParcel";
+
+
// Move this to its own file.
LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter()
@@ -135,44 +152,117 @@ public:
LLMimeDiscoveryResponder( viewer_media_t media_impl)
: mMediaImpl(media_impl),
mInitialized(false)
- {}
-
+ {
+ if(mMediaImpl->mMimeTypeProbe != NULL)
+ {
+ llerrs << "impl already has an outstanding responder" << llendl;
+ }
+
+ mMediaImpl->mMimeTypeProbe = this;
+ }
+ ~LLMimeDiscoveryResponder()
+ {
+ disconnectOwner();
+ }
virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
{
std::string media_type = content["content-type"].asString();
std::string::size_type idx1 = media_type.find_first_of(";");
std::string mime_type = media_type.substr(0, idx1);
- completeAny(status, mime_type);
- }
- virtual void error( U32 status, const std::string& reason )
- {
- // completeAny(status, "none/none");
+ lldebugs << "status is " << status << ", media type \"" << media_type << "\"" << llendl;
+
+ // 2xx status codes indicate success.
+ // Most 4xx status codes are successful enough for our purposes.
+ // 499 is the error code for host not found, timeout, etc.
+ // 500 means "Internal Server error" but we decided it's okay to
+ // accept this and go past it in the MIME type probe
+ // 302 means the resource can be found temporarily in a different place - added this for join.secondlife.com
+ // 499 is a code specifc to join.secondlife.com (????) apparently safe to ignore
+// if( ((status >= 200) && (status < 300)) ||
+// ((status >= 400) && (status < 499)) ||
+// (status == 500) ||
+// (status == 302) ||
+// (status == 499)
+// )
+ // We now no longer check the error code returned from the probe.
+ // If we have a mime type, use it. If not, default to the web plugin and let it handle error reporting.
+ if(1)
+ {
+ // The probe was successful.
+ if(mime_type.empty())
+ {
+ // Some sites don't return any content-type header at all.
+ // Treat an empty mime type as text/html.
+ mime_type = "text/html";
+ }
+
+ completeAny(status, mime_type);
+ }
+ else
+ {
+ llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
+
+ if(mMediaImpl)
+ {
+ mMediaImpl->mMediaSourceFailed = true;
+ }
+ }
+
}
void completeAny(U32 status, const std::string& mime_type)
{
- if(!mInitialized && ! mime_type.empty())
+ // the call to initializeMedia may disconnect the responder, which will clear mMediaImpl.
+ // Make a local copy so we can call loadURI() afterwards.
+ LLViewerMediaImpl *impl = mMediaImpl;
+
+ if(impl && !mInitialized && ! mime_type.empty())
{
- if(mMediaImpl->initializeMedia(mime_type))
+ if(impl->initializeMedia(mime_type))
{
mInitialized = true;
- mMediaImpl->loadURI();
+ impl->loadURI();
+ disconnectOwner();
}
}
}
+
+ void cancelRequest()
+ {
+ disconnectOwner();
+ }
+
+private:
+ void disconnectOwner()
+ {
+ if(mMediaImpl)
+ {
+ if(mMediaImpl->mMimeTypeProbe != this)
+ {
+ llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl;
+ }
- public:
- viewer_media_t mMediaImpl;
+ mMediaImpl->mMimeTypeProbe = NULL;
+ }
+ mMediaImpl = NULL;
+ }
+
+
+public:
+ LLViewerMediaImpl *mMediaImpl;
bool mInitialized;
};
-typedef std::vector<LLViewerMediaImpl*> impl_list;
-static impl_list sViewerMediaImplList;
+static LLViewerMedia::impl_list sViewerMediaImplList;
+static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;
static LLTimer sMediaCreateTimer;
static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;
static F32 sGlobalVolume = 1.0f;
+static F64 sLowestLoadableImplInterest = 0.0f;
+static bool sAnyMediaShowing = false;
+static boost::signals2::connection sTeleportFinishConnection;
//////////////////////////////////////////////////////////////////////////////////////////
static void add_media_impl(LLViewerMediaImpl* media)
@@ -183,8 +273,8 @@ static void add_media_impl(LLViewerMediaImpl* media)
//////////////////////////////////////////////////////////////////////////////////////////
static void remove_media_impl(LLViewerMediaImpl* media)
{
- impl_list::iterator iter = sViewerMediaImplList.begin();
- impl_list::iterator end = sViewerMediaImplList.end();
+ LLViewerMedia::impl_list::iterator iter = sViewerMediaImplList.begin();
+ LLViewerMedia::impl_list::iterator end = sViewerMediaImplList.end();
for(; iter != end; iter++)
{
@@ -203,6 +293,7 @@ class LLViewerMediaMuteListObserver : public LLMuteListObserver
static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;
static bool sViewerMediaMuteListObserverInitialized = false;
+static bool sInWorldMediaDisabled = false;
//////////////////////////////////////////////////////////////////////////////////////////
@@ -225,8 +316,8 @@ viewer_media_t LLViewerMedia::newMediaImpl(
}
else
{
- media_impl->stop();
- media_impl->mTextureId = texture_id;
+ media_impl->unload();
+ media_impl->setTextureID(texture_id);
media_impl->mMediaWidth = media_width;
media_impl->mMediaHeight = media_height;
media_impl->mMediaAutoScale = media_auto_scale;
@@ -240,7 +331,12 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
{
// Try to find media with the same media ID
viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID());
-
+
+ lldebugs << "called, current URL is \"" << media_entry->getCurrentURL()
+ << "\", previous URL is \"" << previous_url
+ << "\", update_from_self is " << (update_from_self?"true":"false")
+ << llendl;
+
bool was_loaded = false;
bool needs_navigate = false;
@@ -254,6 +350,8 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_impl->mMediaLoop = media_entry->getAutoLoop();
media_impl->mMediaWidth = media_entry->getWidthPixels();
media_impl->mMediaHeight = media_entry->getHeightPixels();
+ media_impl->mMediaAutoPlay = media_entry->getAutoPlay();
+ media_impl->mMediaEntryURL = media_entry->getCurrentURL();
if (media_impl->mMediaSource)
{
media_impl->mMediaSource->setAutoScale(media_impl->mMediaAutoScale);
@@ -261,12 +359,31 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels());
}
- if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self)
+ bool url_changed = (media_impl->mMediaEntryURL != previous_url);
+ if(media_impl->mMediaEntryURL.empty())
+ {
+ if(url_changed)
+ {
+ // The current media URL is now empty. Unload the media source.
+ media_impl->unload();
+
+ lldebugs << "Unloading media instance (new current URL is empty)." << llendl;
+ }
+ }
+ else
{
- if(!media_entry->getCurrentURL().empty())
+ // The current media URL is not empty.
+ // If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
+ // do a navigate.
+ bool auto_play = media_impl->isAutoPlayable();
+ if((was_loaded || auto_play) && !update_from_self)
{
- needs_navigate = (media_entry->getCurrentURL() != previous_url);
+ needs_navigate = url_changed;
}
+
+ lldebugs << "was_loaded is " << (was_loaded?"true":"false")
+ << ", auto_play is " << (auto_play?"true":"false")
+ << ", needs_navigate is " << (needs_navigate?"true":"false") << llendl;
}
}
else
@@ -279,18 +396,32 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_entry->getAutoLoop());
media_impl->setHomeURL(media_entry->getHomeURL());
+ media_impl->mMediaAutoPlay = media_entry->getAutoPlay();
+ media_impl->mMediaEntryURL = media_entry->getCurrentURL();
- if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))
+ if(media_impl->isAutoPlayable())
{
needs_navigate = true;
}
}
- if(media_impl && needs_navigate)
+ if(media_impl)
{
- std::string url = media_entry->getCurrentURL();
-
- media_impl->navigateTo(url, "", true, true);
+ if(needs_navigate)
+ {
+ media_impl->navigateTo(media_impl->mMediaEntryURL, "", true, true);
+ lldebugs << "navigating to URL " << media_impl->mMediaEntryURL << llendl;
+ }
+ else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != media_impl->mMediaEntryURL))
+ {
+ // If we already have a non-empty media URL set and we aren't doing a navigate, update the media URL to match the media entry.
+ media_impl->mMediaURL = media_impl->mMediaEntryURL;
+
+ // If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast.
+ media_impl->mNavigateServerRequest = true;
+
+ lldebugs << "updating URL in the media impl to " << media_impl->mMediaEntryURL << llendl;
+ }
}
return media_impl;
@@ -300,18 +431,16 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
// static
LLViewerMediaImpl* LLViewerMedia::getMediaImplFromTextureID(const LLUUID& texture_id)
{
- impl_list::iterator iter = sViewerMediaImplList.begin();
- impl_list::iterator end = sViewerMediaImplList.end();
-
- for(; iter != end; iter++)
+ LLViewerMediaImpl* result = NULL;
+
+ // Look up the texture ID in the texture id->impl map.
+ impl_id_map::iterator iter = sViewerMediaTextureIDMap.find(texture_id);
+ if(iter != sViewerMediaTextureIDMap.end())
{
- LLViewerMediaImpl* media_impl = *iter;
- if(media_impl->getMediaTextureID() == texture_id)
- {
- return media_impl;
- }
+ result = iter->second;
}
- return NULL;
+
+ return result;
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -334,7 +463,7 @@ std::string LLViewerMedia::getCurrentUserAgent()
// http://www.mozilla.org/build/revised-user-agent-strings.html
std::ostringstream codec;
codec << "SecondLife/";
- codec << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
+ codec << LLVersionInfo::getVersion();
codec << " (" << channel << "; " << skin_name << " skin)";
llinfos << codec.str() << llendl;
@@ -428,15 +557,65 @@ void LLViewerMedia::muteListChanged()
}
}
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setInWorldMediaDisabled(bool disabled)
+{
+ sInWorldMediaDisabled = disabled;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::getInWorldMediaDisabled()
+{
+ return sInWorldMediaDisabled;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest)
+{
+ bool result = false;
+
+ if (NULL == object)
+ {
+ result = false;
+ }
+ // Focused? Then it is interesting!
+ else if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == object->getID())
+ {
+ result = true;
+ }
+ // Selected? Then it is interesting!
+ // XXX Sadly, 'contains()' doesn't take a const :(
+ else if (LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(object)))
+ {
+ result = true;
+ }
+ else
+ {
+ lldebugs << "object interest = " << object_interest << ", lowest loadable = " << sLowestLoadableImplInterest << llendl;
+ if(object_interest >= sLowestLoadableImplInterest)
+ result = true;
+ }
+
+ return result;
+}
+
+LLViewerMedia::impl_list &LLViewerMedia::getPriorityList()
+{
+ return sViewerMediaImplList;
+}
+
// This is the predicate function used to sort sViewerMediaImplList by priority.
-static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
+bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
{
- if(i1->mIsMuted || i1->mMediaSourceFailed)
+ if(i1->isForcedUnloaded() && !i2->isForcedUnloaded())
{
// Muted or failed items always go to the end of the list, period.
return false;
}
- else if(i2->mIsMuted || i2->mMediaSourceFailed)
+ else if(i2->isForcedUnloaded() && !i1->isForcedUnloaded())
{
// Muted or failed items always go to the end of the list, period.
return true;
@@ -451,6 +630,16 @@ static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLVi
// The item with user focus always comes to the front of the list, period.
return false;
}
+ else if(i1->isParcelMedia())
+ {
+ // The parcel media impl sorts above all other inworld media, unless one has focus.
+ return true;
+ }
+ else if(i2->isParcelMedia())
+ {
+ // The parcel media impl sorts above all other inworld media, unless one has focus.
+ return false;
+ }
else if(i1->getUsedInUI() && !i2->getUsedInUI())
{
// i1 is a UI element, i2 is not. This makes i1 "less than" i2, so it sorts earlier in our list.
@@ -461,6 +650,21 @@ static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLVi
// i2 is a UI element, i1 is not. This makes i2 "less than" i1, so it sorts earlier in our list.
return false;
}
+ else if(i1->isPlayable() && !i2->isPlayable())
+ {
+ // Playable items sort above ones that wouldn't play even if they got high enough priority
+ return true;
+ }
+ else if(!i1->isPlayable() && i2->isPlayable())
+ {
+ // Playable items sort above ones that wouldn't play even if they got high enough priority
+ return false;
+ }
+ else if(i1->getInterest() == i2->getInterest())
+ {
+ // Generally this will mean both objects have zero interest. In this case, sort on distance.
+ return (i1->getProximityDistance() < i2->getProximityDistance());
+ }
else
{
// The object with the larger interest value should be earlier in the list, so we reverse the sense of the comparison here.
@@ -468,10 +672,31 @@ static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLVi
}
}
+static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
+{
+ if(i1->getProximityDistance() < i2->getProximityDistance())
+ {
+ return true;
+ }
+ else if(i1->getProximityDistance() > i2->getProximityDistance())
+ {
+ return false;
+ }
+ else
+ {
+ // Both objects have the same distance. This most likely means they're two faces of the same object.
+ // They may also be faces on different objects with exactly the same distance (like HUD objects).
+ // We don't actually care what the sort order is for this case, as long as it's stable and doesn't change when you enable/disable media.
+ // Comparing the impl pointers gives a completely arbitrary ordering, but it will be stable.
+ return (i1 < i2);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::updateMedia()
+void LLViewerMedia::updateMedia(void *dummy_arg)
{
+ sAnyMediaShowing = false;
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
@@ -483,7 +708,7 @@ void LLViewerMedia::updateMedia()
}
// Sort the static instance list using our interest criteria
- std::stable_sort(sViewerMediaImplList.begin(), sViewerMediaImplList.end(), compare_impl_interest);
+ std::stable_sort(sViewerMediaImplList.begin(), sViewerMediaImplList.end(), priorityComparitor);
// Go through the list again and adjust according to priority.
iter = sViewerMediaImplList.begin();
@@ -493,11 +718,10 @@ void LLViewerMedia::updateMedia()
int impl_count_total = 0;
int impl_count_interest_low = 0;
int impl_count_interest_normal = 0;
-
-#if 0
- LL_DEBUGS("PluginPriority") << "Sorted impls:" << llendl;
-#endif
-
+
+ std::vector<LLViewerMediaImpl*> proximity_order;
+
+ bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -505,6 +729,8 @@ void LLViewerMedia::updateMedia()
// Setting max_cpu to 0.0 disables CPU usage checking.
bool check_cpu_usage = (max_cpu != 0.0f);
+ LLViewerMediaImpl* lowest_interest_loadable = NULL;
+
// Notes on tweakable params:
// max_instances must be set high enough to allow the various instances used in the UI (for the help browser, search, etc.) to be loaded.
// If max_normal + max_low is less than max_instances, things will tend to get unloaded instead of being set to slideshow.
@@ -515,7 +741,7 @@ void LLViewerMedia::updateMedia()
LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- if(pimpl->mIsMuted || pimpl->mMediaSourceFailed || (impl_count_total > (int)max_instances))
+ if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
{
// Never load muted or failed impls.
// Hard limit on the number of instances that will be loaded at one time
@@ -528,10 +754,17 @@ void LLViewerMedia::updateMedia()
else if(pimpl->hasFocus())
{
new_priority = LLPluginClassMedia::PRIORITY_HIGH;
+ impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
}
else if(pimpl->getUsedInUI())
{
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
+ }
+ else if(pimpl->isParcelMedia())
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
}
else
{
@@ -539,7 +772,17 @@ void LLViewerMedia::updateMedia()
// Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
// turn it down to low instead of normal. This may downsample for plugins that support it.
- bool media_is_small = pimpl->getInterest() < (pimpl->getApproximateTextureInterest() / 4);
+ bool media_is_small = false;
+ F64 approximate_interest = pimpl->getApproximateTextureInterest();
+ if(approximate_interest == 0.0f)
+ {
+ // this media has no current size, which probably means it's not loaded.
+ media_is_small = true;
+ }
+ else if(pimpl->getInterest() < (approximate_interest / 4))
+ {
+ media_is_small = true;
+ }
if(pimpl->getInterest() == 0.0f)
{
@@ -577,24 +820,88 @@ void LLViewerMedia::updateMedia()
}
}
- if(new_priority != LLPluginClassMedia::PRIORITY_UNLOADED)
+ if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
{
+ // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
+ lowest_interest_loadable = pimpl;
+
impl_count_total++;
}
+
+ // Overrides if the window is minimized or we lost focus (taking care
+ // not to accidentally "raise" the priority either)
+ if (!gViewerWindow->getActive() /* viewer window minimized? */
+ && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ }
+ else if (!gFocusMgr.getAppHasFocus() /* viewer window lost focus? */
+ && new_priority > LLPluginClassMedia::PRIORITY_LOW)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_LOW;
+ }
+ if(!inworld_media_enabled)
+ {
+ // If inworld media is locked out, force all inworld media to stay unloaded.
+ if(!pimpl->getUsedInUI())
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+ }
+ }
+
pimpl->setPriority(new_priority);
-
-#if 0
- LL_DEBUGS("PluginPriority") << " " << pimpl
- << ", setting priority to " << new_priority
- << (pimpl->hasFocus()?", HAS FOCUS":"")
- << (pimpl->getUsedInUI()?", is UI":"")
- << ", cpu " << pimpl->getCPUUsage()
- << ", interest " << pimpl->getInterest()
- << ", media url " << pimpl->getMediaURL() << llendl;
-#endif
+
+ if(pimpl->getUsedInUI())
+ {
+ // Any impls used in the UI should not be in the proximity list.
+ pimpl->mProximity = -1;
+ }
+ else
+ {
+ proximity_order.push_back(pimpl);
+ }
total_cpu += pimpl->getCPUUsage();
+
+ if (!pimpl->getUsedInUI() && pimpl->hasMedia())
+ {
+ sAnyMediaShowing = true;
+ }
+
+ }
+
+ // Re-calculate this every time.
+ sLowestLoadableImplInterest = 0.0f;
+
+ // Only do this calculation if we've hit the impl count limit -- up until that point we always need to load media data.
+ if(lowest_interest_loadable && (impl_count_total >= (int)max_instances))
+ {
+ // Get the interest value of this impl's object for use by isInterestingEnough
+ LLVOVolume *object = lowest_interest_loadable->getSomeObject();
+ if(object)
+ {
+ // NOTE: Don't use getMediaInterest() here. We want the pixel area, not the total media interest,
+ // so that we match up with the calculation done in LLMediaDataClient.
+ sLowestLoadableImplInterest = object->getPixelArea();
+ }
+ }
+
+ if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug"))
+ {
+ // Give impls the same ordering as the priority list
+ // they're already in the right order for this.
+ }
+ else
+ {
+ // Use a distance-based sort for proximity values.
+ std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor);
+ }
+
+ // Transfer the proximity order to the proximity fields in the objects.
+ for(int i = 0; i < (int)proximity_order.size(); i++)
+ {
+ proximity_order[i]->mProximity = i;
}
LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << llendl;
@@ -603,9 +910,129 @@ void LLViewerMedia::updateMedia()
//////////////////////////////////////////////////////////////////////////////////////////
// static
+bool LLViewerMedia::isAnyMediaShowing()
+{
+ return sAnyMediaShowing;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setAllMediaEnabled(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())
+ {
+ pimpl->setDisabled(!val);
+ }
+ }
+
+ // Also do Parcel Media and Parcel Audio
+ if (val)
+ {
+ if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia())
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+
+ if (!LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ {
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ }
+ }
+ else {
+ // This actually unloads the impl, as opposed to "stop"ping the media
+ LLViewerParcelMedia::stop();
+ if (gAudiop) gAudiop->stopInternetStream();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::isParcelMediaPlaying()
+{
+ return (LLViewerMedia::hasParcelMedia() && LLViewerParcelMedia::getParcelMedia() && LLViewerParcelMedia::getParcelMedia()->hasMedia());
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::isParcelAudioPlaying()
+{
+ return (LLViewerMedia::hasParcelAudio() && gAudiop && LLAudioEngine::AUDIO_PLAYING == gAudiop->isInternetStreamPlaying());
+}
+
+bool LLViewerMedia::hasInWorldMedia()
+{
+ if (! gSavedSettings.getBOOL("AudioStreamingMedia")) return false;
+ if (sInWorldMediaDisabled) return false;
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ // This should be quick, because there should be very few non-in-world-media impls
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if (!pimpl->getUsedInUI() && !pimpl->isParcelMedia())
+ {
+ // Found an in-world media impl
+ return true;
+ }
+ }
+ return false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::hasParcelMedia()
+{
+ return !LLViewerParcelMedia::getURL().empty();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::hasParcelAudio()
+{
+ return !LLViewerMedia::getParcelAudioURL().empty();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+std::string LLViewerMedia::getParcelAudioURL()
+{
+ return LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::initClass()
+{
+ gIdleCallbacks.addFunction(LLViewerMedia::updateMedia, NULL);
+ sTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
void LLViewerMedia::cleanupClass()
{
- // This is no longer necessary, since sViewerMediaImplList is no longer smart pointers.
+ gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);
+ sTeleportFinishConnection.disconnect();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::onTeleportFinished()
+{
+ // On teleport, clear this setting (i.e. set it to true)
+ gSavedSettings.setBOOL("MediaTentativeAutoPlay", true);
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -619,12 +1046,13 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
:
mMediaSource( NULL ),
mMovieImageHasMips(false),
- mTextureId(texture_id),
mMediaWidth(media_width),
mMediaHeight(media_height),
mMediaAutoScale(media_auto_scale),
mMediaLoop(media_loop),
mNeedsNewTexture(true),
+ mTextureUsedWidth(0),
+ mTextureUsedHeight(0),
mSuspendUpdates(false),
mVisible(true),
mLastSetCursor( UI_CURSOR_ARROW ),
@@ -641,6 +1069,17 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mNeedsMuteCheck(false),
mPreviousMediaState(MEDIA_NONE),
mPreviousMediaTime(0.0f),
+ mIsDisabled(false),
+ mIsParcelMedia(false),
+ mProximity(-1),
+ mProximityDistance(0.0f),
+ mMimeTypeProbe(NULL),
+ mMediaAutoPlay(false),
+ mInNearbyMediaList(false),
+ mClearCache(false),
+ mBackgroundColor(LLColor4::white),
+ mNavigateSuspended(false),
+ mNavigateSuspendedDeferred(false),
mIsUpdated(false)
{
@@ -652,6 +1091,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
}
add_media_impl(this);
+
+ setTextureID(texture_id);
// connect this media_impl to the media texture, creating it if it doesn't exist.0
// This is necessary because we need to be able to use getMaxVirtualSize() even if the media plugin is not loaded.
@@ -675,6 +1116,7 @@ LLViewerMediaImpl::~LLViewerMediaImpl()
LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ;
+ setTextureID();
remove_media_impl(this);
}
@@ -698,7 +1140,7 @@ void LLViewerMediaImpl::emitEvent(LLPluginClassMedia* plugin, LLViewerMediaObser
bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type)
{
bool mimeTypeChanged = (mMimeType != mime_type);
- bool pluginChanged = (LLMIMETypes::implType(mMimeType) != LLMIMETypes::implType(mime_type));
+ bool pluginChanged = (LLMIMETypes::implType(mCurrentMimeType) != LLMIMETypes::implType(mime_type));
if(!mMediaSource || pluginChanged)
{
@@ -744,7 +1186,9 @@ void LLViewerMediaImpl::destroyMediaSource()
{
oldImage->setPlaying(FALSE) ;
}
-
+
+ cancelMimeTypeProbe();
+
if(mMediaSource)
{
delete mMediaSource;
@@ -770,11 +1214,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
}
else
{
- std::string plugins_path = gDirUtilp->getLLPluginDir();
- plugins_path += gDirUtilp->getDirDelimiter();
-
std::string launcher_name = gDirUtilp->getLLPluginLauncher();
std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename);
+ std::string user_data_path = gDirUtilp->getOSUserAppDir();
+ user_data_path += gDirUtilp->getDirDelimiter();
// See if the plugin executable exists
llstat s;
@@ -790,7 +1233,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
{
LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
media_source->setSize(default_width, default_height);
- if (media_source->init(launcher_name, plugin_name))
+ if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path))
{
return media_source;
}
@@ -805,7 +1248,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
LLSD args;
args["MIME_TYPE"] = media_type;
- LLNotifications::instance().add("NoPlugin", args);
+ LLNotificationsUtil::add("NoPlugin", args);
return NULL;
}
@@ -837,6 +1280,9 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
// If we got here, we want to ignore previous init failures.
mMediaSourceFailed = false;
+ // Save the MIME type that really caused the plugin to load
+ mCurrentMimeType = mMimeType;
+
LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight);
if (media_source)
@@ -846,6 +1292,13 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
media_source->setAutoScale(mMediaAutoScale);
media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent());
media_source->focus(mHasFocus);
+ media_source->setBackgroundColor(mBackgroundColor);
+
+ if(mClearCache)
+ {
+ mClearCache = false;
+ media_source->clear_cache();
+ }
mMediaSource = media_source;
@@ -865,7 +1318,27 @@ void LLViewerMediaImpl::loadURI()
{
if(mMediaSource)
{
- mMediaSource->loadURI( mMediaURL );
+ // trim whitespace from front and back of URL - fixes EXT-5363
+ LLStringUtil::trim( mMediaURL );
+
+ // *HACK: we don't know if the URI coming in is properly escaped
+ // (the contract doesn't specify whether it is escaped or not.
+ // but LLQtWebKit expects it to be, so we do our best to encode
+ // special characters)
+ // The strings below were taken right from http://www.ietf.org/rfc/rfc1738.txt
+ // Note especially that '%' and '/' are there.
+ std::string uri = LLURI::escape(mMediaURL,
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ "0123456789"
+ "$-_.+"
+ "!*'(),"
+ "{}|\\^~[]`"
+ "<>#%"
+ ";/?:@&=",
+ false);
+ llinfos << "Asking media source to load URI: " << uri << llendl;
+
+ mMediaSource->loadURI( uri );
if(mPreviousMediaState == MEDIA_PLAYING)
{
@@ -935,15 +1408,7 @@ void LLViewerMediaImpl::stop()
{
if(mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaBrowser())
- {
- mMediaSource->browse_stop();
- }
- else
- {
- mMediaSource->stop();
- }
-
+ mMediaSource->stop();
// destroyMediaSource();
}
}
@@ -976,6 +1441,40 @@ void LLViewerMediaImpl::seek(F32 time)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipBack(F32 step_scale)
+{
+ if(mMediaSource)
+ {
+ if(mMediaSource->pluginSupportsMediaTime())
+ {
+ F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
+ if(back_step < 0.0)
+ {
+ back_step = 0.0;
+ }
+ mMediaSource->seek(back_step);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipForward(F32 step_scale)
+{
+ if(mMediaSource)
+ {
+ if(mMediaSource->pluginSupportsMediaTime())
+ {
+ F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
+ if(forward_step > mMediaSource->getDuration())
+ {
+ forward_step = mMediaSource->getDuration();
+ }
+ mMediaSource->seek(forward_step);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::setVolume(F32 volume)
{
mRequestedVolume = volume;
@@ -1034,6 +1533,19 @@ std::string LLViewerMediaImpl::getCurrentMediaURL()
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::clearCache()
+{
+ if(mMediaSource)
+ {
+ mMediaSource->clear_cache();
+ }
+ else
+ {
+ mClearCache = true;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
{
scaleMouse(&x, &y);
@@ -1073,14 +1585,38 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask)
}
//////////////////////////////////////////////////////////////////////////////////////////
+//static
+void LLViewerMediaImpl::scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y)
+{
+ F32 texture_x = texture_coords.mV[VX];
+ F32 texture_y = texture_coords.mV[VY];
+
+ // Deal with repeating textures by wrapping the coordinates into the range [0, 1.0)
+ texture_x = fmodf(texture_x, 1.0f);
+ if(texture_x < 0.0f)
+ texture_x = 1.0 + texture_x;
+
+ texture_y = fmodf(texture_y, 1.0f);
+ if(texture_y < 0.0f)
+ texture_y = 1.0 + texture_y;
+
+ // scale x and y to texel units.
+ *x = llround(texture_x * mMediaSource->getTextureWidth());
+ *y = llround((1.0f - texture_y) * mMediaSource->getTextureHeight());
+
+ // Adjust for the difference between the actual texture height and the amount of the texture in use.
+ *y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button)
{
if(mMediaSource)
- {
- mouseDown(
- llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
- llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
- mask, button);
+ {
+ S32 x, y;
+ scaleTextureCoords(texture_coords, &x, &y);
+
+ mouseDown(x, y, mask, button);
}
}
@@ -1088,10 +1624,10 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32
{
if(mMediaSource)
{
- mouseUp(
- llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
- llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
- mask, button);
+ S32 x, y;
+ scaleTextureCoords(texture_coords, &x, &y);
+
+ mouseUp(x, y, mask, button);
}
}
@@ -1099,10 +1635,10 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask)
{
if(mMediaSource)
{
- mouseMove(
- llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
- llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
- mask);
+ S32 x, y;
+ scaleTextureCoords(texture_coords, &x, &y);
+
+ mouseMove(x, y, mask);
}
}
@@ -1155,25 +1691,22 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
}
//////////////////////////////////////////////////////////////////////////////////////////
+std::string LLViewerMediaImpl::getName() const
+{
+ if (mMediaSource)
+ {
+ return mMediaSource->getMediaName();
+ }
+
+ return LLStringUtil::null;
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::navigateBack()
{
if (mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaTime())
- {
- F64 step_scale = 0.02; // temp , can be changed
- F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
- if(back_step < 0.0)
- {
- back_step = 0.0;
- }
- mMediaSource->seek(back_step);
- //mMediaSource->start(-2.0);
- }
- else
- {
- mMediaSource->browse_back();
- }
+ mMediaSource->browse_back();
}
}
@@ -1182,21 +1715,7 @@ void LLViewerMediaImpl::navigateForward()
{
if (mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaTime())
- {
- F64 step_scale = 0.02; // temp , can be changed
- F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
- if(forward_step > mMediaSource->getDuration())
- {
- forward_step = mMediaSource->getDuration();
- }
- mMediaSource->seek(forward_step);
- //mMediaSource->start(2.0);
- }
- else
- {
- mMediaSource->browse_forward();
- }
+ mMediaSource->browse_forward();
}
}
@@ -1213,8 +1732,22 @@ void LLViewerMediaImpl::navigateHome()
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::unload()
+{
+ // Unload the media impl and clear its state.
+ destroyMediaSource();
+ resetPreviousMediaState();
+ mMediaURL.clear();
+ mMimeType.clear();
+ mCurrentMediaURL.clear();
+ mCurrentMimeType.clear();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type, bool rediscover_type, bool server_request)
{
+ cancelMimeTypeProbe();
+
if(mMediaURL != url)
{
// Don't carry media play state across distinct URLs.
@@ -1257,6 +1790,19 @@ void LLViewerMediaImpl::navigateInternal()
// Helpful to have media urls in log file. Shouldn't be spammy.
llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl;
+ if(mNavigateSuspended)
+ {
+ llwarns << "Deferring navigate." << llendl;
+ mNavigateSuspendedDeferred = true;
+ return;
+ }
+
+ if(mMimeTypeProbe != NULL)
+ {
+ llwarns << "MIME type probe already in progress -- bailing out." << llendl;
+ return;
+ }
+
if(mNavigateServerRequest)
{
setNavState(MEDIANAVSTATE_SERVER_SENT);
@@ -1289,7 +1835,12 @@ void LLViewerMediaImpl::navigateInternal()
if(scheme.empty() || "http" == scheme || "https" == scheme)
{
- LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this));
+ // If we don't set an Accept header, LLHTTPClient will add one like this:
+ // Accept: application/llsd+xml
+ // which is really not what we want.
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), headers, 10.0f);
}
else if("data" == scheme || "file" == scheme || "about" == scheme)
{
@@ -1326,18 +1877,12 @@ void LLViewerMediaImpl::navigateStop()
{
mMediaSource->browse_stop();
}
-
}
//////////////////////////////////////////////////////////////////////////////////////////
bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
{
bool result = false;
- // *NOTE:Mani - if this doesn't exist llmozlib goes crashy in the debug build.
- // LLMozlib::init wants to write some files to <exe_dir>/components
- std::string debug_init_component_dir( gDirUtilp->getExecutableDir() );
- debug_init_component_dir += "/components";
- LLAPRFile::makeDir(debug_init_component_dir.c_str());
if (mMediaSource)
{
@@ -1366,9 +1911,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
if(!result)
{
- result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask);
+
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data);
// Since the viewer internal event dispatching doesn't give us key-up events, simulate one here.
- (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask);
+ (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data);
}
}
@@ -1386,7 +1934,9 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char)
if (uni_char >= 32 // discard 'control' characters
&& uni_char != 127) // SDL thinks this is 'delete' - yuck.
{
- mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE));
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data);
}
}
@@ -1420,7 +1970,19 @@ void LLViewerMediaImpl::update()
{
if(mMediaSource == NULL)
{
- if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED)
+ if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
+ {
+ // This media source should not be loaded.
+ }
+ else if(mPriority <= LLPluginClassMedia::PRIORITY_SLIDESHOW)
+ {
+ // Don't load new instances that are at PRIORITY_SLIDESHOW or below. They're just kept around to preserve state.
+ }
+ else if(mMimeTypeProbe != NULL)
+ {
+ // this media source is doing a MIME type probe -- don't try loading it again.
+ }
+ else
{
// This media may need to be loaded.
if(sMediaCreateTimer.hasExpired())
@@ -1441,7 +2003,17 @@ void LLViewerMediaImpl::update()
return;
}
+ // Make sure a navigate doesn't happen during the idle -- it can cause mMediaSource to get destroyed, which can cause a crash.
+ setNavigateSuspended(true);
+
mMediaSource->idle();
+
+ setNavigateSuspended(false);
+
+ if(mMediaSource == NULL)
+ {
+ return;
+ }
if(mMediaSource->isPluginExited())
{
@@ -1522,8 +2094,11 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
if (mNeedsNewTexture
|| placeholder_image->getUseMipMaps()
- || placeholder_image->getWidth() != mMediaSource->getTextureWidth()
- || placeholder_image->getHeight() != mMediaSource->getTextureHeight())
+ || (placeholder_image->getWidth() != mMediaSource->getTextureWidth())
+ || (placeholder_image->getHeight() != mMediaSource->getTextureHeight())
+ || (mTextureUsedWidth != mMediaSource->getWidth())
+ || (mTextureUsedHeight != mMediaSource->getHeight())
+ )
{
LL_DEBUGS("Media") << "initializing media placeholder" << LL_ENDL;
LL_DEBUGS("Media") << "movie image id " << mTextureId << LL_ENDL;
@@ -1540,7 +2115,9 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
// MEDIAOPT: seems insane that we actually have to make an imageraw then
// immediately discard it
LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth);
- raw->clear(0x0f, 0x0f, 0x0f, 0xff);
+ // Clear the texture to the background color, ignoring alpha.
+ // convert background color channels from [0.0, 1.0] to [0, 255];
+ raw->clear(int(mBackgroundColor.mV[VX] * 255.0f), int(mBackgroundColor.mV[VY] * 255.0f), int(mBackgroundColor.mV[VZ] * 255.0f), 0xff);
int discard_level = 0;
// ask media source for correct GL image format constants
@@ -1555,6 +2132,11 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
// FIXME
// placeholder_image->mIsMediaTexture = true;
mNeedsNewTexture = false;
+
+ // If the amount of the texture being drawn by the media goes down in either width or height,
+ // recreate the texture to avoid leaving parts of the old image behind.
+ mTextureUsedWidth = mMediaSource->getWidth();
+ mTextureUsedHeight = mMediaSource->getHeight();
}
return placeholder_image;
@@ -1562,7 +2144,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
//////////////////////////////////////////////////////////////////////////////////////////
-LLUUID LLViewerMediaImpl::getMediaTextureID()
+LLUUID LLViewerMediaImpl::getMediaTextureID() const
{
return mTextureId;
}
@@ -1606,6 +2188,21 @@ void LLViewerMediaImpl::scaleMouse(S32 *mouse_x, S32 *mouse_y)
#endif
}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+bool LLViewerMediaImpl::isMediaTimeBased()
+{
+ bool result = false;
+
+ if(mMediaSource)
+ {
+ result = mMediaSource->pluginSupportsMediaTime();
+ }
+
+ return result;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
bool LLViewerMediaImpl::isMediaPlaying()
{
@@ -1636,7 +2233,7 @@ bool LLViewerMediaImpl::isMediaPaused()
//////////////////////////////////////////////////////////////////////////////////////////
//
-bool LLViewerMediaImpl::hasMedia()
+bool LLViewerMediaImpl::hasMedia() const
{
return mMediaSource != NULL;
}
@@ -1649,6 +2246,85 @@ void LLViewerMediaImpl::resetPreviousMediaState()
mPreviousMediaTime = 0.0f;
}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+void LLViewerMediaImpl::setDisabled(bool disabled, bool forcePlayOnEnable)
+{
+ if(mIsDisabled != disabled)
+ {
+ // Only do this on actual state transitions.
+ mIsDisabled = disabled;
+
+ if(mIsDisabled)
+ {
+ // We just disabled this media. Clear all state.
+ unload();
+ }
+ else
+ {
+ // We just (re)enabled this media. Do a navigate if auto-play is in order.
+ if(isAutoPlayable() || forcePlayOnEnable)
+ {
+ navigateTo(mMediaEntryURL, "", true, true);
+ }
+ }
+
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isForcedUnloaded() const
+{
+ if(mIsMuted || mMediaSourceFailed || mIsDisabled)
+ {
+ return true;
+ }
+
+ if(sInWorldMediaDisabled)
+ {
+ // When inworld media is disabled, all instances that aren't marked as "used in UI" will not be loaded.
+ if(!mUsedInUI)
+ {
+ return true;
+ }
+ }
+
+ // If this media's class is not supposed to be shown, unload
+ if (!shouldShowBasedOnClass())
+ {
+ return true;
+ }
+
+ return false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isPlayable() const
+{
+ if(isForcedUnloaded())
+ {
+ // All of the forced-unloaded criteria also imply not playable.
+ return false;
+ }
+
+ if(hasMedia())
+ {
+ // Anything that's already playing is, by definition, playable.
+ return true;
+ }
+
+ if(!mMediaURL.empty())
+ {
+ // If something has navigated the instance, it's ready to be played.
+ return true;
+ }
+
+ return false;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)
{
@@ -1665,8 +2341,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
// TODO: may want a different message for this case?
LLSD args;
- args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
- LLNotifications::instance().add("MediaPluginFailed", args);
+ args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);
+ LLNotificationsUtil::add("MediaPluginFailed", args);
}
break;
@@ -1679,9 +2355,9 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
resetPreviousMediaState();
LLSD args;
- args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
+ args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);
// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert!
- //LLNotifications::instance().add("MediaPluginFailed", args);
+ //LLNotificationsUtil::add("MediaPluginFailed", args);
}
break;
@@ -1857,6 +2533,15 @@ void LLViewerMediaImpl::calculateInterest()
mInterest = 0.0f;
}
+ // Calculate distance from the avatar, for use in the proximity calculation.
+ mProximityDistance = 0.0f;
+ if(!mObjectList.empty())
+ {
+ // Just use the first object in the list. We could go through the list and find the closest object, but this should work well enough.
+ LLVector3d global_delta = gAgent.getPositionGlobal() - (*mObjectList.begin())->getPositionGlobal();
+ mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same.
+ }
+
if(mNeedsMuteCheck)
{
// Check all objects this instance is associated with, and those objects' owners, against the mute list
@@ -1866,16 +2551,25 @@ void LLViewerMediaImpl::calculateInterest()
for(; iter != mObjectList.end() ; ++iter)
{
LLVOVolume *obj = *iter;
- if(LLMuteList::getInstance()->isMuted(obj->getID()))
+ llassert(obj);
+ if (!obj) continue;
+ if(LLMuteList::getInstance() &&
+ LLMuteList::getInstance()->isMuted(obj->getID()))
+ {
mIsMuted = true;
+ }
else
{
// We won't have full permissions data for all objects. Attempt to mute objects when we can tell their owners are muted.
- LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj);
- if(obj_perm)
+ if (LLSelectMgr::getInstance())
{
- if(LLMuteList::getInstance()->isMuted(obj_perm->getOwner()))
- mIsMuted = true;
+ LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj);
+ if(obj_perm)
+ {
+ if(LLMuteList::getInstance() &&
+ LLMuteList::getInstance()->isMuted(obj_perm->getOwner()))
+ mIsMuted = true;
+ }
}
}
}
@@ -1893,7 +2587,13 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest()
result = mMediaSource->getFullWidth();
result *= mMediaSource->getFullHeight();
}
-
+ else
+ {
+ // No media source is loaded -- all we have to go on is the texture size that has been set on the impl, if any.
+ result = mMediaWidth;
+ result *= mMediaHeight;
+ }
+
return result;
}
@@ -1918,6 +2618,16 @@ void LLViewerMediaImpl::setUsedInUI(bool used_in_ui)
}
};
+void LLViewerMediaImpl::setBackgroundColor(LLColor4 color)
+{
+ mBackgroundColor = color;
+
+ if(mMediaSource)
+ {
+ mMediaSource->setBackgroundColor(mBackgroundColor);
+ }
+};
+
F64 LLViewerMediaImpl::getCPUUsage() const
{
F64 result = 0.0f;
@@ -1934,7 +2644,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)
{
if(mPriority != priority)
{
- LL_INFOS("PluginPriority")
+ LL_DEBUGS("PluginPriority")
<< "changing priority of media id " << mTextureId
<< " from " << LLPluginClassMedia::priorityToString(mPriority)
<< " to " << LLPluginClassMedia::priorityToString(priority)
@@ -1990,6 +2700,38 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)
}
}
+void LLViewerMediaImpl::setNavigateSuspended(bool suspend)
+{
+ if(mNavigateSuspended != suspend)
+ {
+ mNavigateSuspended = suspend;
+ if(!suspend)
+ {
+ // We're coming out of suspend. If someone tried to do a navigate while suspended, do one now instead.
+ if(mNavigateSuspendedDeferred)
+ {
+ mNavigateSuspendedDeferred = false;
+ navigateInternal();
+ }
+ }
+ }
+}
+
+void LLViewerMediaImpl::cancelMimeTypeProbe()
+{
+ if(mMimeTypeProbe != NULL)
+ {
+ // There doesn't seem to be a way to actually cancel an outstanding request.
+ // Simulate it by telling the LLMimeDiscoveryResponder not to write back any results.
+ mMimeTypeProbe->cancelRequest();
+
+ // The above should already have set mMimeTypeProbe to NULL.
+ if(mMimeTypeProbe != NULL)
+ {
+ llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl;
+ }
+ }
+}
void LLViewerMediaImpl::addObject(LLVOVolume* obj)
{
@@ -2017,75 +2759,144 @@ const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const
return &mObjectList ;
}
-//////////////////////////////////////////////////////////////////////////////////////////
-//static
-void LLViewerMedia::toggleMusicPlay(void*)
+LLVOVolume *LLViewerMediaImpl::getSomeObject()
{
-// FIXME: This probably doesn't belong here
-#if 0
- if (mMusicState != PLAYING)
+ LLVOVolume *result = NULL;
+
+ std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
+ if(iter != mObjectList.end())
{
- mMusicState = PLAYING; // desired state
- if (gAudiop)
+ result = *iter;
+ }
+
+ return result;
+}
+
+void LLViewerMediaImpl::setTextureID(LLUUID id)
+{
+ if(id != mTextureId)
+ {
+ if(mTextureId.notNull())
{
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if ( parcel )
- {
- gAudiop->startInternetStream(parcel->getMusicURL());
- }
+ // Remove this item's entry from the map
+ sViewerMediaTextureIDMap.erase(mTextureId);
}
+
+ if(id.notNull())
+ {
+ sViewerMediaTextureIDMap.insert(LLViewerMedia::impl_id_map::value_type(id, this));
+ }
+
+ mTextureId = id;
}
- else
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isAutoPlayable() const
+{
+ return (mMediaAutoPlay &&
+ gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay"));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::shouldShowBasedOnClass() const
+{
+ // If this is parcel media or in the UI, return true always
+ if (getUsedInUI() || isParcelMedia()) return true;
+
+ bool attached_to_another_avatar = isAttachedToAnotherAvatar();
+ bool inside_parcel = isInAgentParcel();
+
+ // llinfos << " hasFocus = " << hasFocus() <<
+ // " others = " << (attached_to_another_avatar && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING)) <<
+ // " within = " << (inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING)) <<
+ // " outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << llendl;
+
+ // If it has focus, we should show it
+ if (hasFocus())
+ return true;
+
+ // If it is attached to an avatar and the pref is off, we shouldn't show it
+ if (attached_to_another_avatar)
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING);
+
+ if (inside_parcel)
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING);
+ else
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const
+{
+ bool result = false;
+
+ std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin();
+ std::list< LLVOVolume* >::const_iterator end = mObjectList.end();
+ for ( ; iter != end; iter++)
{
- mMusicState = STOPPED; // desired state
- if (gAudiop)
+ if (isObjectAttachedToAnotherAvatar(*iter))
{
- gAudiop->stopInternetStream();
+ result = true;
+ break;
}
}
-#endif
+ return result;
}
//////////////////////////////////////////////////////////////////////////////////////////
+//
//static
-void LLViewerMedia::toggleMediaPlay(void*)
+bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj)
{
-// FIXME: This probably doesn't belong here
-#if 0
- if (LLViewerMedia::isMediaPaused())
- {
- LLViewerParcelMedia::start();
- }
- else if(LLViewerMedia::isMediaPlaying())
- {
- LLViewerParcelMedia::pause();
- }
- else
+ bool result = false;
+ LLXform *xform = obj;
+ // Walk up parent chain
+ while (NULL != xform)
{
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if (parcel)
+ LLViewerObject *object = dynamic_cast<LLViewerObject*> (xform);
+ if (NULL != object)
{
- LLViewerParcelMedia::play(parcel);
+ LLVOAvatar *avatar = object->asAvatar();
+ if (NULL != avatar && avatar != gAgent.getAvatarObject())
+ {
+ result = true;
+ break;
+ }
}
+ xform = xform->getParent();
}
-#endif
+ return result;
}
//////////////////////////////////////////////////////////////////////////////////////////
-//static
-void LLViewerMedia::mediaStop(void*)
+//
+bool LLViewerMediaImpl::isInAgentParcel() const
{
-// FIXME: This probably doesn't belong here
-#if 0
- LLViewerParcelMedia::stop();
-#endif
+ bool result = false;
+
+ std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin();
+ std::list< LLVOVolume* >::const_iterator end = mObjectList.end();
+ for ( ; iter != end; iter++)
+ {
+ LLVOVolume *object = *iter;
+ if (LLViewerMediaImpl::isObjectInAgentParcel(object))
+ {
+ result = true;
+ break;
+ }
+ }
+ return result;
}
//////////////////////////////////////////////////////////////////////////////////////////
-//static
-bool LLViewerMedia::isMusicPlaying()
-{
-// FIXME: This probably doesn't belong here
-// FIXME: make this work
- return false;
+//
+// static
+bool LLViewerMediaImpl::isObjectInAgentParcel(LLVOVolume *obj)
+{
+ return (LLViewerParcelMgr::getInstance()->inAgentParcel(obj->getPositionGlobal()));
}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 5444abf854..9dbffa78b3 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -42,12 +42,14 @@
#include "llviewermediaobserver.h"
#include "llpluginclassmedia.h"
+#include "v4color.h"
class LLViewerMediaImpl;
class LLUUID;
class LLViewerMediaTexture;
class LLMediaEntry;
-class LLVOVolume ;
+class LLVOVolume;
+class LLMimeDiscoveryResponder;
typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
///////////////////////////////////////////////////////////////////////////////
@@ -66,37 +68,73 @@ private:
observerListType mObservers;
};
+class LLViewerMediaImpl;
+
class LLViewerMedia
{
LOG_CLASS(LLViewerMedia);
- public:
- // Special case early init for just web browser component
- // so we can show login screen. See .cpp file for details. JC
-
- static viewer_media_t newMediaImpl(const LLUUID& texture_id,
- S32 media_width = 0,
- S32 media_height = 0,
- U8 media_auto_scale = false,
- U8 media_loop = false);
-
- static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self);
- static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id);
- static std::string getCurrentUserAgent();
- static void updateBrowserUserAgent();
- static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/);
- static bool textureHasMedia(const LLUUID& texture_id);
- static void setVolume(F32 volume);
-
- static void updateMedia();
- static bool isMusicPlaying();
-
- static void cleanupClass();
-
- static void toggleMusicPlay(void*);
- static void toggleMediaPlay(void*);
- static void mediaStop(void*);
- static F32 getVolume();
- static void muteListChanged();
+public:
+
+ // String to get/set media autoplay in gSavedSettings
+ static const char* AUTO_PLAY_MEDIA_SETTING;
+ static const char* SHOW_MEDIA_ON_OTHERS_SETTING;
+ static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING;
+ static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING;
+
+ typedef std::vector<LLViewerMediaImpl*> impl_list;
+
+ typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map;
+
+ // Special case early init for just web browser component
+ // so we can show login screen. See .cpp file for details. JC
+
+ static viewer_media_t newMediaImpl(const LLUUID& texture_id,
+ S32 media_width = 0,
+ S32 media_height = 0,
+ U8 media_auto_scale = false,
+ U8 media_loop = false);
+
+ static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self);
+ static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id);
+ static std::string getCurrentUserAgent();
+ static void updateBrowserUserAgent();
+ static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/);
+ static bool textureHasMedia(const LLUUID& texture_id);
+ static void setVolume(F32 volume);
+
+ // Is any media currently "showing"? Includes Parcel Media. Does not include media in the UI.
+ static bool isAnyMediaShowing();
+ // Set all media enabled or disabled, depending on val. Does not include media in the UI.
+ static void setAllMediaEnabled(bool val);
+
+ static void updateMedia(void* dummy_arg = NULL);
+
+ static void initClass();
+ static void cleanupClass();
+
+ static F32 getVolume();
+ static void muteListChanged();
+ static void setInWorldMediaDisabled(bool disabled);
+ static bool getInWorldMediaDisabled();
+
+ static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);
+
+ // Returns the priority-sorted list of all media impls.
+ static impl_list &getPriorityList();
+
+ // This is the comparitor used to sort the list.
+ static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
+
+ // These are just helper functions for the convenience of others working with media
+ static bool hasInWorldMedia();
+ static std::string getParcelAudioURL();
+ static bool hasParcelMedia();
+ static bool hasParcelAudio();
+ static bool isParcelMediaPlaying();
+ static bool isParcelAudioPlaying();
+
+private:
+ static void onTeleportFinished();
};
// Implementation functions not exported into header file
@@ -105,7 +143,10 @@ class LLViewerMediaImpl
{
LOG_CLASS(LLViewerMediaImpl);
public:
-
+
+ friend class LLViewerMedia;
+ friend class LLMimeDiscoveryResponder;
+
LLViewerMediaImpl(
const LLUUID& texture_id,
S32 media_width,
@@ -132,6 +173,8 @@ public:
void pause();
void start();
void seek(F32 time);
+ void skipBack(F32 step_scale);
+ void skipForward(F32 step_scale);
void setVolume(F32 volume);
void updateVolume();
F32 getVolume();
@@ -152,6 +195,7 @@ public:
void navigateForward();
void navigateReload();
void navigateHome();
+ void unload();
void navigateTo(const std::string& url, const std::string& mime_type = "", bool rediscover_type = false, bool server_request = false);
void navigateInternal();
void navigateStop();
@@ -159,28 +203,49 @@ public:
bool handleUnicodeCharHere(llwchar uni_char);
bool canNavigateForward();
bool canNavigateBack();
- std::string getMediaURL() { return mMediaURL; }
+ std::string getMediaURL() const { return mMediaURL; }
std::string getCurrentMediaURL();
std::string getHomeURL() { return mHomeURL; }
+ std::string getMediaEntryURL() { return mMediaEntryURL; }
void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };
+ void clearCache();
std::string getMimeType() { return mMimeType; }
void scaleMouse(S32 *mouse_x, S32 *mouse_y);
+ void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
void update();
void updateImagesMediaStreams();
- LLUUID getMediaTextureID();
+ LLUUID getMediaTextureID() const;
- void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; };
+ void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; }
void setVisible(bool visible);
- bool getVisible() const { return mVisible; };
+ bool getVisible() const { return mVisible; }
+ bool isVisible() const { return mVisible; }
+ bool isMediaTimeBased();
bool isMediaPlaying();
bool isMediaPaused();
- bool hasMedia();
- bool isMediaFailed() { return mMediaSourceFailed; };
+ bool hasMedia() const;
+ bool isMediaFailed() const { return mMediaSourceFailed; }
+ void setMediaFailed(bool val) { mMediaSourceFailed = val; }
void resetPreviousMediaState();
+
+ void setDisabled(bool disabled, bool forcePlayOnEnable = false);
+ bool isMediaDisabled() const { return mIsDisabled; };
+
+ void setInNearbyMediaList(bool in_list) { mInNearbyMediaList = in_list; }
+ bool getInNearbyMediaList() { return mInNearbyMediaList; }
+
+ // returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)
+ bool isForcedUnloaded() const;
+
+ // returns true if this instance could be playable based on autoplay setting, current load state, etc.
+ bool isPlayable() const;
+
+ void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; }
+ bool isParcelMedia() const { return mIsParcelMedia; }
- ECursorType getLastSetCursor() { return mLastSetCursor; };
+ ECursorType getLastSetCursor() { return mLastSetCursor; }
// utility function to create a ready-to-use media instance from a desired media type.
static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height);
@@ -209,7 +274,7 @@ public:
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; };
- /*virtual*/ std::string getName() const { return LLStringUtil::null; };
+ /*virtual*/ std::string getName() const;
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {};
@@ -231,6 +296,7 @@ public:
void addObject(LLVOVolume* obj) ;
void removeObject(LLVOVolume* obj) ;
const std::list< LLVOVolume* >* getObjectList() const ;
+ LLVOVolume *getSomeObject();
void setUpdated(BOOL updated) ;
BOOL isUpdated() ;
@@ -238,11 +304,15 @@ public:
void calculateInterest();
F64 getInterest() const { return mInterest; };
F64 getApproximateTextureInterest();
+ S32 getProximity() const { return mProximity; };
+ F64 getProximityDistance() const { return mProximityDistance; };
// Mark this object as being used in a UI panel instead of on a prim
// This will be used as part of the interest sorting algorithm.
void setUsedInUI(bool used_in_ui);
bool getUsedInUI() const { return mUsedInUI; };
+
+ void setBackgroundColor(LLColor4 color);
F64 getCPUUsage() const;
@@ -250,6 +320,8 @@ public:
LLPluginClassMedia::EPriority getPriority() { return mPriority; };
void setLowPrioritySizeLimit(int size);
+
+ void setTextureID(LLUUID id = LLUUID::null);
typedef enum
{
@@ -269,7 +341,24 @@ public:
EMediaNavState getNavState() { return mMediaNavState; }
void setNavState(EMediaNavState state);
-public:
+ void setNavigateSuspended(bool suspend);
+ bool isNavigateSuspended() { return mNavigateSuspended; };
+
+ void cancelMimeTypeProbe();
+
+ // Is this media attached to an avatar *not* self
+ bool isAttachedToAnotherAvatar() const;
+
+ // Is this media in the agent's parcel?
+ bool isInAgentParcel() const;
+
+private:
+ bool isAutoPlayable() const;
+ bool shouldShowBasedOnClass() const;
+ static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj);
+ static bool isObjectInAgentParcel(LLVOVolume *obj);
+
+private:
// a single media url with some data and an impl.
LLPluginClassMedia* mMediaSource;
LLUUID mTextureId;
@@ -278,6 +367,7 @@ public:
std::string mHomeURL;
std::string mMimeType;
std::string mCurrentMediaURL; // The most current media url from the plugin (via the "location changed" or "navigate complete" events).
+ std::string mCurrentMimeType; // The MIME type that caused the currently loaded plugin to be loaded.
S32 mLastMouseX; // save the last mouse coord we get, so when we lose capture we can simulate a mouseup at that point.
S32 mLastMouseY;
S32 mMediaWidth;
@@ -285,6 +375,8 @@ public:
bool mMediaAutoScale;
bool mMediaLoop;
bool mNeedsNewTexture;
+ S32 mTextureUsedWidth;
+ S32 mTextureUsedHeight;
bool mSuspendUpdates;
bool mVisible;
ECursorType mLastSetCursor;
@@ -301,7 +393,19 @@ public:
bool mNeedsMuteCheck;
int mPreviousMediaState;
F64 mPreviousMediaTime;
-
+ bool mIsDisabled;
+ bool mIsParcelMedia;
+ S32 mProximity;
+ F64 mProximityDistance;
+ LLMimeDiscoveryResponder *mMimeTypeProbe;
+ bool mMediaAutoPlay;
+ std::string mMediaEntryURL;
+ bool mInNearbyMediaList; // used by LLPanelNearbyMedia::refreshList() for performance reasons
+ bool mClearCache;
+ LLColor4 mBackgroundColor;
+ bool mNavigateSuspended;
+ bool mNavigateSuspendedDeferred;
+
private:
BOOL mIsUpdated ;
std::list< LLVOVolume* > mObjectList ;
diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp
index 90cfb85821..67b051e536 100644
--- a/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/indra/newview/llviewermedia_streamingaudio.cpp
@@ -1,7 +1,7 @@
/**
* @file llviewermedia_streamingaudio.h
* @author Tofu Linden, Sam Kolb
- * @brief LLStreamingAudio_MediaPlugins implementation - an implementation of the streaming audio interface which is implemented as a client of the media plugins API.
+ * @brief LLStreamingAudio_MediaPlugins implementation - an implementation of the streaming audio interface which is implemented as a client of the media plugin API.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "linden_common.h"
#include "llpluginclassmedia.h"
+#include "llpluginclassmediaowner.h"
#include "llviewermedia.h"
#include "llviewermedia_streamingaudio.h"
@@ -61,18 +62,18 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
if (!mMediaPlugin) // lazy-init the underlying media plugin
{
mMediaPlugin = initializeMedia("audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis.
- llinfos << "mMediaPlugin is now " << mMediaPlugin << llendl;
+ llinfos << "streaming audio mMediaPlugin is now " << mMediaPlugin << llendl;
}
if(!mMediaPlugin)
return;
-
+
if (!url.empty()) {
llinfos << "Starting internet stream: " << url << llendl;
mURL = url;
mMediaPlugin->loadURI ( url );
mMediaPlugin->start();
- llinfos << "Playing....." << llendl;
+ llinfos << "Playing stream..." << llendl;
} else {
llinfos << "setting stream to NULL"<< llendl;
mURL.clear();
@@ -82,6 +83,7 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
void LLStreamingAudio_MediaPlugins::stop()
{
+ llinfos << "Stopping internet stream." << llendl;
if(mMediaPlugin)
{
mMediaPlugin->stop();
@@ -97,10 +99,12 @@ void LLStreamingAudio_MediaPlugins::pause(int pause)
if(pause)
{
+ llinfos << "Pausing internet stream." << llendl;
mMediaPlugin->pause();
}
else
{
+ llinfos << "Unpausing internet stream." << llendl;
mMediaPlugin->start();
}
}
@@ -114,20 +118,21 @@ void LLStreamingAudio_MediaPlugins::update()
int LLStreamingAudio_MediaPlugins::isPlaying()
{
if (!mMediaPlugin)
- return 0;
+ return 0; // stopped
- // *TODO: can probably do better than this
- if (mMediaPlugin->isPluginRunning())
- {
- return 1; // Active and playing
- }
+ LLPluginClassMediaOwner::EMediaStatus status =
+ mMediaPlugin->getStatus();
- if (mMediaPlugin->isPluginExited())
+ switch (status)
{
+ case LLPluginClassMediaOwner::MEDIA_LOADING: // but not MEDIA_LOADED
+ case LLPluginClassMediaOwner::MEDIA_PLAYING:
+ return 1; // Active and playing
+ case LLPluginClassMediaOwner::MEDIA_PAUSED:
+ return 2; // paused
+ default:
return 0; // stopped
}
-
- return 2; // paused
}
void LLStreamingAudio_MediaPlugins::setGain(F32 vol)
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 0ef4679057..88e7cfec86 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -50,6 +50,8 @@
#include "llmediaentry.h"
#include "llkeyboard.h"
#include "lltoolmgr.h"
+#include "llvovolume.h"
+#include "llhelp.h"
//
// LLViewerMediaFocus
@@ -76,6 +78,10 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
{
old_media_impl->focus(false);
}
+
+ // Always clear the current selection. If we're setting focus on a face, we'll reselect the correct object below.
+ LLSelectMgr::getInstance()->deselectAll();
+ mSelection = NULL;
if (media_impl.notNull() && objectp.notNull())
{
@@ -85,6 +91,12 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
mFocusedObjectID = objectp->getID();
mFocusedObjectFace = face;
mFocusedObjectNormal = pick_normal;
+
+ // Set the selection in the selection manager so we can draw the focus ring.
+ mSelection = LLSelectMgr::getInstance()->selectObjectOnly(objectp, face);
+
+ // Focusing on a media face clears its disable flag.
+ media_impl->setDisabled(false);
LLTextureEntry* tep = objectp->getTE(face);
if(tep->hasMedia())
@@ -109,30 +121,41 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
// We must do this before processing the media HUD zoom, or it may zoom to the wrong face.
update();
- if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
- {
- mMediaControls.get()->resetZoomLevel();
- mMediaControls.get()->nextZoomLevel();
- }
- }
- else
- {
- if(mFocusedImplID.notNull())
+ if(mMediaControls.get())
{
- if(mMediaControls.get())
+ if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
{
+ // Zoom in on this face
mMediaControls.get()->resetZoomLevel();
+ mMediaControls.get()->nextZoomLevel();
+ }
+ else
+ {
+ // Reset the controls' zoom level without moving the camera.
+ // This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button.
+ mMediaControls.get()->resetZoomLevel(false);
}
}
-
+ }
+ else
+ {
if(hasFocus())
{
gFocusMgr.setKeyboardFocus(NULL);
}
mFocusedImplID = LLUUID::null;
- mFocusedObjectID = LLUUID::null;
- mFocusedObjectFace = 0;
+ if (objectp.notNull())
+ {
+ // Still record the focused object...it may mean we need to load media data.
+ // This will aid us in determining this object is "important enough"
+ mFocusedObjectID = objectp->getID();
+ mFocusedObjectFace = face;
+ }
+ else {
+ mFocusedObjectID = LLUUID::null;
+ mFocusedObjectFace = 0;
+ }
}
}
@@ -174,7 +197,7 @@ bool LLViewerMediaFocus::getFocus()
}
// This function selects an ideal viewing distance based on the focused object, pick normal, and padding value
-void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor)
+void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
{
if (object)
{
@@ -245,7 +268,16 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
camera_pos += 0.01 * len * delta;
}
+ // If we are not allowing zooming out and the old camera position is closer to
+ // the center then the new intended camera position, don't move camera and return
+ if (zoom_in_only &&
+ (dist_vec_squared(gAgent.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
+ {
+ return;
+ }
+
gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+
}
else
{
@@ -279,10 +311,28 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
media_impl->handleKeyHere(key, mask);
- if (key == KEY_ESCAPE)
+ if (KEY_ESCAPE == key)
{
+ // Reset camera zoom in this case.
+ if(mFocusedImplID.notNull())
+ {
+ if(mMediaControls.get())
+ {
+ mMediaControls.get()->resetZoomLevel(true);
+ }
+ }
+
clearFocus();
}
+
+ if ( KEY_F1 == key && LLUI::sHelpImpl && mMediaControls.get())
+ {
+ std::string help_topic;
+ if (mMediaControls.get()->findHelpTopic(help_topic))
+ {
+ LLUI::sHelpImpl->showTopic(help_topic);
+ }
+ }
}
return true;
@@ -314,7 +364,7 @@ BOOL LLViewerMediaFocus::handleScrollWheel(S32 x, S32 y, S32 clicks)
void LLViewerMediaFocus::update()
{
- if(mFocusedImplID.notNull() || mFocusedObjectID.notNull())
+ if(mFocusedImplID.notNull())
{
// We have a focused impl/face.
if(!getFocus())
@@ -473,3 +523,65 @@ LLViewerObject* LLViewerMediaFocus::getHoverObject()
{
return gObjectList.findObject(mHoverObjectID);
}
+
+void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id)
+{
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(media_id);
+
+ if(impl)
+ {
+ // Get the first object from the media impl's object list. This is completely arbitrary, but should suffice.
+ LLVOVolume *obj = impl->getSomeObject();
+ if(obj)
+ {
+ // This media is attached to at least one object. Figure out which face it's on.
+ S32 face = obj->getFaceIndexWithMediaImpl(impl, -1);
+
+ // We don't have a proper pick normal here, and finding a face's real normal is... complicated.
+ LLVector3 normal = obj->getApproximateFaceNormal(face);
+ if(normal.isNull())
+ {
+ // If that didn't work, use the inverse of the camera "look at" axis, which should keep the camera pointed in the same direction.
+// llinfos << "approximate face normal invalid, using camera direction." << llendl;
+ normal = LLViewerCamera::getInstance()->getAtAxis();
+ normal *= (F32)-1.0f;
+ }
+
+ // Attempt to focus/zoom on that face.
+ setFocusFace(obj, face, impl, normal);
+
+ if(mMediaControls.get())
+ {
+ mMediaControls.get()->resetZoomLevel();
+ mMediaControls.get()->nextZoomLevel();
+ }
+ }
+ }
+}
+
+void LLViewerMediaFocus::unZoom()
+{
+ if(mMediaControls.get())
+ {
+ mMediaControls.get()->resetZoomLevel();
+ }
+}
+
+bool LLViewerMediaFocus::isZoomed() const
+{
+ return (mMediaControls.get() && mMediaControls.get()->getZoomLevel() != LLPanelPrimMediaControls::ZOOM_NONE);
+}
+
+LLUUID LLViewerMediaFocus::getControlsMediaID()
+{
+ if(getFocusedMediaImpl())
+ {
+ return mFocusedImplID;
+ }
+ else if(getHoverMediaImpl())
+ {
+ return mHoverImplID;
+ }
+
+ return LLUUID::null;
+}
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index c1179de39d..d9ddc7432b 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -66,7 +66,7 @@ public:
void update();
- static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor);
+ static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);
bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
@@ -76,11 +76,21 @@ public:
LLViewerMediaImpl* getFocusedMediaImpl();
LLViewerObject* getFocusedObject();
S32 getFocusedFace() { return mFocusedObjectFace; }
+ LLUUID getFocusedObjectID() { return mFocusedObjectID; }
// These look up (by uuid) and return the values that were set with setHoverFace. They will return null if the objects have been destroyed.
LLViewerMediaImpl* getHoverMediaImpl();
LLViewerObject* getHoverObject();
S32 getHoverFace() { return mHoverObjectFace; }
+
+ // Try to focus/zoom on the specified media (if it's on an object in world).
+ void focusZoomOnMedia(LLUUID media_id);
+ // Are we zoomed in?
+ bool isZoomed() const;
+ void unZoom();
+
+ // Return the ID of the media instance the controls are currently attached to (either focus or hover).
+ LLUUID getControlsMediaID();
protected:
/*virtual*/ void onFocusReceived();
@@ -89,6 +99,7 @@ protected:
private:
LLHandle<LLPanelPrimMediaControls> mMediaControls;
+ LLObjectSelectionHandle mSelection;
LLUUID mFocusedObjectID;
S32 mFocusedObjectFace;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 864cf9d57b..989cfae464 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -31,184 +31,77 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewermenu.h"
-// system library includes
-#include <iostream>
-#include <fstream>
-#include <sstream>
-
// linden library includes
-#include "llaudioengine.h"
#include "llfloaterreg.h"
-#include "indra_constants.h"
-#include "llassetstorage.h"
-#include "llchat.h"
#include "llcombobox.h"
-#include "llfeaturemanager.h"
-#include "llfocusmgr.h"
-#include "llfontgl.h"
-#include "llinstantmessage.h"
-#include "llpermissionsflags.h"
-#include "llrect.h"
-#include "llsecondlifeurls.h"
-#include "lltransactiontypes.h"
-#include "llui.h"
-#include "llview.h"
-#include "llxfermanager.h"
-#include "message.h"
-#include "raytrace.h"
-#include "llsdserialize.h"
-#include "lltimer.h"
-#include "llvfile.h"
-#include "llvolumemgr.h"
+#include "llinventorypanel.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
// newview includes
#include "llagent.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
-#include "llbox.h"
-#include "llcallingcard.h"
-#include "llclipboard.h"
+#include "llbottomtray.h"
#include "llcompilequeue.h"
#include "llconsole.h"
-#include "llviewercontrol.h"
#include "lldebugview.h"
-#include "lldir.h"
-#include "lldrawable.h"
-#include "lldrawpoolalpha.h"
-#include "lldrawpooltree.h"
-#include "llface.h"
#include "llfilepicker.h"
-#include "llfirstuse.h"
-#include "llfloater.h"
-#include "llfloaterabout.h"
-#include "llfloaterbuycurrency.h"
-#include "llfloateractivespeakers.h"
-#include "llfloateranimpreview.h"
-#include "llfloateravatartextures.h"
-#include "llfloaterbuildoptions.h"
-#include "llfloaterbump.h"
+//#include "llfirstuse.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llfloaterbuycurrency.h"
-#include "llfloaterbuyland.h"
-#include "llfloaterchat.h"
#include "llfloatercustomize.h"
-#include "llfloaterdaycycle.h"
-#include "llfloaterchatterbox.h"
-#include "llfloaterfonttest.h"
#include "llfloatergodtools.h"
-#include "llfloatergroupinvite.h"
-#include "llfloatergroups.h"
-#include "llfloaterhud.h"
-#include "llfloaterinspect.h"
-#include "llfloaterlagmeter.h"
+#include "llfloaterinventory.h"
#include "llfloaterland.h"
-#include "llfloaterlandholdings.h"
-#include "llfloatermap.h"
-#include "llfloateropenobject.h"
#include "llfloaterpay.h"
-#include "llfloaterperms.h"
-#include "llfloaterpostprocess.h"
-#include "llfloaterpreference.h"
-#include "llfloaterreg.h"
-#include "llfloaterregioninfo.h"
#include "llfloaterreporter.h"
+#include "llfloatersearch.h"
#include "llfloaterscriptdebug.h"
-#include "llfloatersettingsdebug.h"
-#include "llfloaterenvsettings.h"
+#include "llfloatersnapshot.h"
#include "llfloatertools.h"
-#include "llfloaterwater.h"
-#include "llfloaterwindlight.h"
#include "llfloaterworldmap.h"
-#include "llfloatermemleak.h"
-#include "llfasttimerview.h"
#include "llavataractions.h"
#include "lllandmarkactions.h"
-#include "llmemoryview.h"
#include "llgroupmgr.h"
#include "lltooltip.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
-#include "llimage.h"
-#include "llimagebmp.h"
-#include "llimagej2c.h"
-#include "llimagetga.h"
+#include "llimview.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
-#include "llkeyboard.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
#include "llmenucommands.h"
-#include "llmenugl.h"
-#include "llmimetypes.h"
-#include "llmorphview.h"
#include "llmoveview.h"
-#include "llmutelist.h"
-#include "llnotify.h"
-#include "llpanelobject.h"
#include "llparcel.h"
-#include "llprimitive.h"
-#include "llresmgr.h"
#include "llrootview.h"
#include "llselectmgr.h"
#include "llsidetray.h"
-#include "llsky.h"
#include "llstatusbar.h"
-#include "llstatview.h"
-#include "llstring.h"
-#include "llsurfacepatch.h"
-#include "llimview.h"
#include "lltextureview.h"
-#include "lltool.h"
-#include "lltoolbar.h"
#include "lltoolcomp.h"
-#include "lltoolfocus.h"
-#include "lltoolgrab.h"
#include "lltoolmgr.h"
#include "lltoolpie.h"
#include "lltoolselectland.h"
-#include "lltrans.h"
-#include "lluictrlfactory.h"
-#include "lluploaddialog.h"
-#include "lluserauth.h"
-#include "lluuid.h"
-#include "llviewercamera.h"
#include "llviewergenericmessage.h"
#include "llviewerhelp.h"
-#include "llviewertexturelist.h" // gTextureList
-#include "llviewerinventory.h"
#include "llviewermenufile.h" // init_menu_file()
#include "llviewermessage.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
-#include "llviewerparceloverlay.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvolume.h"
-#include "llweb.h"
-#include "llworld.h"
#include "llworldmap.h"
-#include "object_flags.h"
#include "pipeline.h"
-#include "llappviewer.h"
-#include "roles_constants.h"
#include "llviewerjoystick.h"
#include "llwlanimator.h"
#include "llwlparammanager.h"
-#include "llwaterparammanager.h"
-#include "llfloaternotificationsconsole.h"
#include "llfloatercamera.h"
#include "lluilistener.h"
-
-#include "lltexlayer.h"
#include "llappearancemgr.h"
using namespace LLVOAvatarDefines;
@@ -242,11 +135,12 @@ LLMenuGL *gPopupMenuView = NULL;
LLMenuBarGL *gLoginMenuBarView = NULL;
// Pie menus
-LLContextMenu *gPieSelf = NULL;
-LLContextMenu *gPieAvatar = NULL;
-LLContextMenu *gPieObject = NULL;
-LLContextMenu *gPieAttachment = NULL;
-LLContextMenu *gPieLand = NULL;
+LLContextMenu *gMenuAvatarSelf = NULL;
+LLContextMenu *gMenuAvatarOther = NULL;
+LLContextMenu *gMenuObject = NULL;
+LLContextMenu *gMenuAttachmentSelf = NULL;
+LLContextMenu *gMenuAttachmentOther = NULL;
+LLContextMenu *gMenuLand = NULL;
const std::string SAVE_INTO_INVENTORY("Save Object Back to My Inventory");
const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
@@ -254,7 +148,6 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"
LLMenuGL* gAttachSubMenu = NULL;
LLMenuGL* gDetachSubMenu = NULL;
LLMenuGL* gTakeOffClothes = NULL;
-LLContextMenu* gPieRate = NULL;
LLContextMenu* gAttachScreenPieMenu = NULL;
LLContextMenu* gAttachPieMenu = NULL;
LLContextMenu* gAttachBodyPartPieMenus[8];
@@ -414,7 +307,7 @@ public:
static LLMenuParcelObserver* gMenuParcelObserver = NULL;
-static LLUIListener sUIListener("UI");
+static LLUIListener sUIListener;
LLMenuParcelObserver::LLMenuParcelObserver()
{
@@ -467,16 +360,6 @@ void set_underclothes_menu_options()
void init_menus()
{
S32 top = gViewerWindow->getRootView()->getRect().getHeight();
- S32 width = gViewerWindow->getRootView()->getRect().getWidth();
-
- //
- // Main menu bar
- //
- gMenuHolder = new LLViewerMenuHolderGL();
- gMenuHolder->setRect(LLRect(0, top, width, 0));
- gMenuHolder->setFollowsAll();
-
- LLMenuGL::sMenuContainer = gMenuHolder;
// Initialize actions
initialize_menus();
@@ -494,25 +377,31 @@ void init_menus()
gMenuHolder->addChild( gPopupMenuView );
///
- /// Pie menus
+ /// Context menus
///
- gPieSelf = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_self.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ const widget_registry_t& registry =
+ LLViewerMenuHolderGL::child_registry_t::instance();
+ gMenuAvatarSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_avatar_self.xml", gMenuHolder, registry);
+ gMenuAvatarOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_avatar_other.xml", gMenuHolder, registry);
- // TomY TODO: what shall we do about these?
gDetachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach HUD", true);
gDetachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach", true);
- gPieAvatar = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_avatar.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
- gPieObject = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_object.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ gMenuObject = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_object.xml", gMenuHolder, registry);
gAttachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach HUD");
gAttachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach");
- gPieRate = gMenuHolder->getChild<LLContextMenu>("Rate Menu");
- gPieAttachment = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_attachment.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ gMenuAttachmentSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_attachment_self.xml", gMenuHolder, registry);
+ gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_attachment_other.xml", gMenuHolder, registry);
- gPieLand = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_pie_land.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
+ "menu_land.xml", gMenuHolder, registry);
///
/// set up the colors
@@ -521,12 +410,13 @@ void init_menus()
LLColor4 context_menu_color = LLUIColorTable::instance().getColor("MenuPopupBgColor");
- gPieSelf->setBackgroundColor( context_menu_color );
- gPieAvatar->setBackgroundColor( context_menu_color );
- gPieObject->setBackgroundColor( context_menu_color );
- gPieAttachment->setBackgroundColor( context_menu_color );
+ gMenuAvatarSelf->setBackgroundColor( context_menu_color );
+ gMenuAvatarOther->setBackgroundColor( context_menu_color );
+ gMenuObject->setBackgroundColor( context_menu_color );
+ gMenuAttachmentSelf->setBackgroundColor( context_menu_color );
+ gMenuAttachmentOther->setBackgroundColor( context_menu_color );
- gPieLand->setBackgroundColor( context_menu_color );
+ gMenuLand->setBackgroundColor( context_menu_color );
color = LLUIColorTable::instance().getColor( "MenuPopupBgColor" );
gPopupMenuView->setBackgroundColor( color );
@@ -545,11 +435,7 @@ void init_menus()
gMenuBarView->setBackgroundColor( color );
gMenuHolder->addChild(gMenuBarView);
-
- // menu holder appears on top of menu bar so you can see the menu title
- // flash when an item is triggered (the flash occurs in the holder)
- gViewerWindow->getRootView()->addChild(gMenuHolder);
-
+
gViewerWindow->setMenuBackgroundColor(false,
LLViewerLogin::getInstance()->isInProductionGrid());
@@ -607,7 +493,15 @@ class LLAdvancedToggleConsole : public view_listener_t
}
else if ("debug" == console_type)
{
- toggle_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) );
+ toggle_visibility( (void*)static_cast<LLUICtrl*>(gDebugView->mDebugConsolep));
+ }
+ else if (gTextureSizeView && "texture size" == console_type)
+ {
+ toggle_visibility( (void*)gTextureSizeView );
+ }
+ else if (gTextureCategoryView && "texture category" == console_type)
+ {
+ toggle_visibility( (void*)gTextureCategoryView );
}
else if ("fast timers" == console_type)
{
@@ -636,6 +530,14 @@ class LLAdvancedCheckConsole : public view_listener_t
{
new_value = get_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) );
}
+ else if (gTextureSizeView && "texture size" == console_type)
+ {
+ new_value = get_visibility( (void*)gTextureSizeView );
+ }
+ else if (gTextureCategoryView && "texture category" == console_type)
+ {
+ new_value = get_visibility( (void*)gTextureCategoryView );
+ }
else if ("fast timers" == console_type)
{
new_value = get_visibility( (void*)gDebugView->mFastTimerView );
@@ -702,6 +604,10 @@ class LLAdvancedToggleHUDInfo : public view_listener_t
{
gDisplayFOV = !(gDisplayFOV);
}
+ else if ("badge" == info_type)
+ {
+ gDisplayBadge = !(gDisplayBadge);
+ }
return true;
}
};
@@ -724,10 +630,28 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
{
new_value = gDisplayFOV;
}
+ else if ("badge" == info_type)
+ {
+ new_value = gDisplayBadge;
+ }
return new_value;
}
};
+
+//////////////
+// FLYING //
+//////////////
+
+class LLAdvancedAgentFlyingInfo : public view_listener_t
+{
+ bool handleEvent(const LLSD&)
+ {
+ return gAgent.getFlying();
+ }
+};
+
+
///////////////////////
// CLEAR GROUP CACHE //
///////////////////////
@@ -1160,28 +1084,6 @@ class LLAdvancedCheckWireframe : public view_listener_t
};
//////////////////////
-// DISABLE TEXTURES //
-//////////////////////
-
-class LLAdvancedToggleDisableTextures : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLViewerTexture::sDontLoadVolumeTextures = !LLViewerTexture::sDontLoadVolumeTextures;
- return true;
- }
-};
-
-class LLAdvancedCheckDisableTextures : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = LLViewerTexture::sDontLoadVolumeTextures; // <-- make this using LLCacheControl
- return new_value;
- }
-};
-
-//////////////////////
// TEXTURE ATLAS //
//////////////////////
@@ -1884,7 +1786,7 @@ class LLAdvancedRebakeTextures : public view_listener_t
};
-#ifndef LL_RELEASE_FOR_DOWNLOAD
+#if 1 //ndef LL_RELEASE_FOR_DOWNLOAD
///////////////////////////
// DEBUG AVATAR TEXTURES //
///////////////////////////
@@ -1894,7 +1796,9 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
handle_debug_avatar_textures(NULL);
+#endif
return true;
}
};
@@ -1908,7 +1812,9 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
handle_dump_avatar_local_textures(NULL);
+#endif
return true;
}
};
@@ -2383,20 +2289,23 @@ void cleanup_menus()
delete gMenuParcelObserver;
gMenuParcelObserver = NULL;
- delete gPieSelf;
- gPieSelf = NULL;
+ delete gMenuAvatarSelf;
+ gMenuAvatarSelf = NULL;
+
+ delete gMenuAvatarOther;
+ gMenuAvatarOther = NULL;
- delete gPieAvatar;
- gPieAvatar = NULL;
+ delete gMenuObject;
+ gMenuObject = NULL;
- delete gPieObject;
- gPieObject = NULL;
+ delete gMenuAttachmentSelf;
+ gMenuAttachmentSelf = NULL;
- delete gPieAttachment;
- gPieAttachment = NULL;
+ delete gMenuAttachmentOther;
+ gMenuAttachmentSelf = NULL;
- delete gPieLand;
- gPieLand = NULL;
+ delete gMenuLand;
+ gMenuLand = NULL;
delete gMenuBarView;
gMenuBarView = NULL;
@@ -2522,24 +2431,12 @@ class LLObjectEnableTouch : public view_listener_t
// label.assign("Touch");
// }
//}
-/*
-bool handle_object_open()
-{
- LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if(!obj) return true;
- LLFloaterOpenObject::show();
- return true;
+void handle_object_open()
+{
+ LLFloaterReg::showInstance("openobject");
}
-class LLObjectOpen : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- return handle_object_open();
- }
-};
-*/
bool enable_object_open()
{
// Look for contents in root object, which is all the LLFloaterOpenObject
@@ -2566,7 +2463,7 @@ class LLViewJoystickFlycam : public view_listener_t
class LLViewCheckJoystickFlycam : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
- {
+ {
bool new_value = LLViewerJoystick::getInstance()->getOverrideCamera();
return new_value;
}
@@ -2600,7 +2497,7 @@ class LLObjectBuild : public view_listener_t
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
// Could be first use
- LLFirstUse::useBuild();
+ //LLFirstUse::useBuild();
return true;
}
};
@@ -2645,10 +2542,27 @@ void handle_object_edit()
LLViewerJoystick::getInstance()->setNeedsReset(true);
// Could be first use
- LLFirstUse::useBuild();
+ //LLFirstUse::useBuild();
return;
+}
+
+void handle_object_inspect()
+{
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ LLViewerObject* selected_objectp = selection->getFirstRootObject();
+ if (selected_objectp)
+ {
+ LLSD key;
+ key["task"] = "task";
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ }
+ /*
+ // Old floater properties
+ LLFloaterReg::showInstance("inspect", LLSD());
+ */
}
+
//---------------------------------------------------------------------------
// Land pie menu
//---------------------------------------------------------------------------
@@ -2679,7 +2593,7 @@ class LLLandBuild : public view_listener_t
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
// Could be first use
- LLFirstUse::useBuild();
+ //LLFirstUse::useBuild();
return true;
}
};
@@ -2739,15 +2653,26 @@ bool enable_object_edit()
// there. Eventually this needs to be replaced with code that only
// lets you edit objects if you have permission to do so (edit perms,
// group edit, god). See also lltoolbar.cpp. JC
- bool enable = true;
+ bool enable = false;
if (gAgent.inPrelude())
{
- enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
+ enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
+ }
+ else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
+ {
+ enable = true;
}
+
return enable;
}
+// mutually exclusive - show either edit option or build in menu
+bool enable_object_build()
+{
+ return !enable_object_edit();
+}
+
class LLSelfRemoveAllAttachments : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -2803,20 +2728,24 @@ BOOL enable_has_attachments(void*)
bool enable_object_mute()
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- bool new_value = (object != NULL);
- if (new_value)
+ if (!object) return false;
+
+ LLVOAvatar* avatar = find_avatar_from_object(object);
+ if (avatar)
{
- LLVOAvatar* avatar = find_avatar_from_object(object);
- if (avatar)
- {
- // It's an avatar
- LLNameValue *lastname = avatar->getNVPair("LastName");
- BOOL is_linden = lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
- BOOL is_self = avatar->isSelf();
- new_value = !is_linden && !is_self;
- }
+ // It's an avatar
+ LLNameValue *lastname = avatar->getNVPair("LastName");
+ bool is_linden =
+ lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
+ bool is_self = avatar->isSelf();
+ return !is_linden && !is_self;
+ }
+ else
+ {
+ // Just a regular object
+ return LLSelectMgr::getInstance()->getSelection()->
+ contains( object, SELECT_ALL_TES );
}
- return new_value;
}
class LLObjectMute : public view_listener_t
@@ -2901,7 +2830,7 @@ bool handle_go_to()
}
// Could be first use
- LLFirstUse::useGoTo();
+ //LLFirstUse::useGoTo();
return true;
}
@@ -2933,7 +2862,7 @@ class LLAvatarReportAbuse : public view_listener_t
bool callback_freeze(const LLSD& notification, const LLSD& response)
{
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option || 1 == option)
{
@@ -2963,11 +2892,20 @@ bool callback_freeze(const LLSD& notification, const LLSD& response)
}
-class LLAvatarFreeze : public view_listener_t
+void handle_avatar_freeze(const LLSD& avatar_id)
{
- bool handleEvent(const LLSD& userdata)
- {
- LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ // Use avatar_id if available, otherwise default to right-click avatar
+ LLVOAvatar* avatar = NULL;
+ if (avatar_id.asUUID().notNull())
+ {
+ avatar = find_avatar_from_object(avatar_id.asUUID());
+ }
+ else
+ {
+ avatar = find_avatar_from_object(
+ LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
+ }
+
if( avatar )
{
std::string fullname = avatar->getFullname();
@@ -2978,22 +2916,20 @@ class LLAvatarFreeze : public view_listener_t
{
LLSD args;
args["AVATAR_NAME"] = fullname;
- LLNotifications::instance().add("FreezeAvatarFullname",
+ LLNotificationsUtil::add("FreezeAvatarFullname",
args,
payload,
callback_freeze);
}
else
{
- LLNotifications::instance().add("FreezeAvatar",
+ LLNotificationsUtil::add("FreezeAvatar",
LLSD(),
payload,
callback_freeze);
}
}
- return true;
- }
-};
+}
class LLAvatarVisibleDebug : public view_listener_t
{
@@ -3003,14 +2939,6 @@ class LLAvatarVisibleDebug : public view_listener_t
}
};
-class LLAvatarEnableDebug : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- return gAgent.isGodlike();
- }
-};
-
class LLAvatarDebug : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3035,7 +2963,7 @@ class LLAvatarDebug : public view_listener_t
bool callback_eject(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (2 == option)
{
// Cancel button.
@@ -3087,11 +3015,20 @@ bool callback_eject(const LLSD& notification, const LLSD& response)
return false;
}
-class LLAvatarEject : public view_listener_t
+void handle_avatar_eject(const LLSD& avatar_id)
{
- bool handleEvent(const LLSD& userdata)
- {
- LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ // Use avatar_id if available, otherwise default to right-click avatar
+ LLVOAvatar* avatar = NULL;
+ if (avatar_id.asUUID().notNull())
+ {
+ avatar = find_avatar_from_object(avatar_id.asUUID());
+ }
+ else
+ {
+ avatar = find_avatar_from_object(
+ LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
+ }
+
if( avatar )
{
LLSD payload;
@@ -3108,14 +3045,14 @@ class LLAvatarEject : public view_listener_t
{
LLSD args;
args["AVATAR_NAME"] = fullname;
- LLNotifications::instance().add("EjectAvatarFullname",
+ LLNotificationsUtil::add("EjectAvatarFullname",
args,
payload,
callback_eject);
}
else
{
- LLNotifications::instance().add("EjectAvatarFullname",
+ LLNotificationsUtil::add("EjectAvatarFullname",
LLSD(),
payload,
callback_eject);
@@ -3128,52 +3065,55 @@ class LLAvatarEject : public view_listener_t
{
LLSD args;
args["AVATAR_NAME"] = fullname;
- LLNotifications::instance().add("EjectAvatarFullnameNoBan",
+ LLNotificationsUtil::add("EjectAvatarFullnameNoBan",
args,
payload,
callback_eject);
}
else
{
- LLNotifications::instance().add("EjectAvatarNoBan",
+ LLNotificationsUtil::add("EjectAvatarNoBan",
LLSD(),
payload,
callback_eject);
}
}
}
- return true;
- }
-};
+}
-class LLAvatarEnableFreezeEject : public view_listener_t
+bool enable_freeze_eject(const LLSD& avatar_id)
{
- bool handleEvent(const LLSD& userdata)
+ // Use avatar_id if available, otherwise default to right-click avatar
+ LLVOAvatar* avatar = NULL;
+ if (avatar_id.asUUID().notNull())
{
- LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
- bool new_value = (avatar != NULL);
+ avatar = find_avatar_from_object(avatar_id.asUUID());
+ }
+ else
+ {
+ avatar = find_avatar_from_object(
+ LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
+ }
+ if (!avatar) return false;
- if (new_value)
- {
- const LLVector3& pos = avatar->getPositionRegion();
- const LLVector3d& pos_global = avatar->getPositionGlobal();
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
- LLViewerRegion* region = avatar->getRegion();
- new_value = (region != NULL);
-
- if (new_value)
- {
- new_value = region->isOwnedSelf(pos);
- if (!new_value || region->isOwnedGroup(pos))
- {
- new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
- }
- }
- }
+ // Gods can always freeze
+ if (gAgent.isGodlike()) return true;
- return new_value;
+ // Estate owners / managers can freeze
+ // Parcel owners can also freeze
+ const LLVector3& pos = avatar->getPositionRegion();
+ const LLVector3d& pos_global = avatar->getPositionGlobal();
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
+ LLViewerRegion* region = avatar->getRegion();
+ if (!region) return false;
+
+ bool new_value = region->isOwnedSelf(pos);
+ if (!new_value || region->isOwnedGroup(pos))
+ {
+ new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
}
-};
+ return new_value;
+}
class LLAvatarGiveCard : public view_listener_t
{
@@ -3215,11 +3155,11 @@ class LLAvatarGiveCard : public view_listener_t
transaction_id.generate();
msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);
msg->sendReliable(dest_host);
- LLNotifications::instance().add("OfferedCard", args);
+ LLNotificationsUtil::add("OfferedCard", args);
}
else
{
- LLNotifications::instance().add("CantOfferCallingCard", old_args);
+ LLNotificationsUtil::add("CantOfferCallingCard", old_args);
}
}
return true;
@@ -3238,7 +3178,7 @@ void login_done(S32 which, void *user)
bool callback_leave_group(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
LLMessageSystem *msg = gMessageSystem;
@@ -3305,7 +3245,7 @@ void handle_buy_object(LLSaleInfo sale_info)
{
if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
{
- LLNotifications::instance().add("UnableToBuyWhileDownloading");
+ LLNotificationsUtil::add("UnableToBuyWhileDownloading");
return;
}
@@ -3314,7 +3254,7 @@ void handle_buy_object(LLSaleInfo sale_info)
BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
if (!owners_identical)
{
- LLNotifications::instance().add("CannotBuyObjectsFromDifferentOwners");
+ LLNotificationsUtil::add("CannotBuyObjectsFromDifferentOwners");
return;
}
@@ -3324,7 +3264,7 @@ void handle_buy_object(LLSaleInfo sale_info)
valid &= LLSelectMgr::getInstance()->selectGetAggregatePermissions(ag_perm);
if(!valid || !sale_info.isForSale() || !perm.allowTransferTo(gAgent.getID()))
{
- LLNotifications::instance().add("ObjectNotForSale");
+ LLNotificationsUtil::add("ObjectNotForSale");
return;
}
@@ -3431,27 +3371,49 @@ void handle_show_side_tray()
root->addChild(side_tray);
}
-class LLSelfFriends : public view_listener_t
+// Toggle one of "People" panel tabs in side tray.
+class LLTogglePanelPeopleTab : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- // Open "Friends" tab of the "People" panel in side tray.
+ std::string panel_name = userdata.asString();
+
LLSD param;
- param["people_panel_tab_name"] = "friends_panel";
+ param["people_panel_tab_name"] = panel_name;
- LLSideTray::getInstance()->showPanel("panel_people", param);
- return true;
+ static LLPanel* friends_panel = NULL;
+ static LLPanel* groups_panel = NULL;
+ static LLPanel* nearby_panel = NULL;
+
+ if (panel_name == "friends_panel")
+ {
+ return togglePeoplePanel(friends_panel, panel_name, param);
+ }
+ else if (panel_name == "groups_panel")
+ {
+ return togglePeoplePanel(groups_panel, panel_name, param);
+ }
+ else if (panel_name == "nearby_panel")
+ {
+ return togglePeoplePanel(nearby_panel, panel_name, param);
+ }
+ else
+ {
+ return false;
+ }
}
-};
-class LLSelfGroups : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
+ static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param)
{
- // Open "Groups" tab of the "People" panel in side tray.
- LLSD param;
- param["people_panel_tab_name"] = "groups_panel";
- LLSideTray::getInstance()->showPanel("panel_people", param);
+ if(!panel)
+ {
+ panel = LLSideTray::getInstance()->getPanel(panel_name);
+ if(!panel)
+ return false;
+ }
+
+ LLSideTray::getInstance()->togglePanel(panel, "panel_people", param);
+
return true;
}
};
@@ -3485,9 +3447,8 @@ void set_god_level(U8 god_level)
gAgent.setGodLevel( god_level );
LLViewerParcelMgr::getInstance()->notifyObservers();
- // God mode changes sim visibility
- LLWorldMap::getInstance()->reset();
- LLWorldMap::getInstance()->setCurrentLayer(0);
+ // God mode changes region visibility
+ LLWorldMap::getInstance()->reloadItems(true);
// inventory in items may change in god mode
gObjectList.dirtyAllObjectInventory();
@@ -3502,16 +3463,23 @@ void set_god_level(U8 god_level)
if(god_level > GOD_NOT)
{
args["LEVEL"] = llformat("%d",(S32)god_level);
- LLNotifications::instance().add("EnteringGodMode", args);
+ LLNotificationsUtil::add("EnteringGodMode", args);
}
else
{
args["LEVEL"] = llformat("%d",(S32)old_god_level);
- LLNotifications::instance().add("LeavingGodMode", args);
+ LLNotificationsUtil::add("LeavingGodMode", args);
}
// changing god-level can affect which menus we see
show_debug_menus();
+
+ // changing god-level can invalidate search results
+ LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search"));
+ if (search)
+ {
+ search->godLevelChanged(god_level);
+ }
}
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -3587,9 +3555,15 @@ bool LLHaveCallingcard::operator()(LLInventoryCategory* cat,
BOOL is_agent_mappable(const LLUUID& agent_id)
{
- return (LLAvatarActions::isFriend(agent_id) &&
- LLAvatarTracker::instance().getBuddyInfo(agent_id)->isOnline() &&
- LLAvatarTracker::instance().getBuddyInfo(agent_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
+ const LLRelationship* buddy_info = NULL;
+ bool is_friend = LLAvatarActions::isFriend(agent_id);
+
+ if (is_friend)
+ buddy_info = LLAvatarTracker::instance().getBuddyInfo(agent_id);
+
+ return (buddy_info &&
+ buddy_info->isOnline() &&
+ buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
);
}
@@ -3628,7 +3602,7 @@ void request_friendship(const LLUUID& dest_id)
}
else
{
- LLNotifications::instance().add("CantOfferFriendship");
+ LLNotificationsUtil::add("CantOfferFriendship");
}
}
}
@@ -3699,7 +3673,7 @@ void near_sit_down_point(BOOL success, void *)
gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
// Might be first sit
- LLFirstUse::useSit();
+ //LLFirstUse::useSit();
}
}
@@ -3768,6 +3742,7 @@ void reset_view_final( BOOL proceed )
}
gAgent.resetView(TRUE, TRUE);
+ gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
}
class LLViewLookAtLastChatter : public view_listener_t
@@ -3810,7 +3785,7 @@ class LLViewDefaultUISize : public view_listener_t
{
gSavedSettings.setF32("UIScaleFactor", 1.0f);
gSavedSettings.setBOOL("UIAutoScale", FALSE);
- gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+ gViewerWindow->reshape(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
return true;
}
};
@@ -3888,8 +3863,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object,
InventoryObjectList::const_iterator inv_end = inventory->end();
for ( ; inv_it != inv_end; ++inv_it)
{
- if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)
- && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY))
+ if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))
{
LLInventoryObject* obj = *inv_it;
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj);
@@ -3960,7 +3934,7 @@ void handle_claim_public_land(void*)
{
if (LLViewerParcelMgr::getInstance()->getSelectionRegion() != gAgent.getRegion())
{
- LLNotifications::instance().add("ClaimPublicLand");
+ LLNotificationsUtil::add("ClaimPublicLand");
return;
}
@@ -4156,7 +4130,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
}
else if(!error.empty())
{
- LLNotifications::instance().add(error);
+ LLNotificationsUtil::add(error);
}
}
@@ -4164,12 +4138,10 @@ void handle_take_copy()
{
if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;
- LLUUID category_id =
- gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+ const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);
}
-
// You can return an object to its owner if it is on your land.
class LLObjectReturn : public view_listener_t
{
@@ -4179,13 +4151,13 @@ class LLObjectReturn : public view_listener_t
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
- LLNotifications::instance().add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
+ LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
return true;
}
bool onReturnToOwner(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// Ignore category ID for this derez destination.
@@ -4250,7 +4222,7 @@ class LLObjectEnableReturn : public view_listener_t
void force_take_copy(void*)
{
if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;
- const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+ const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);
}
@@ -4311,8 +4283,7 @@ void handle_take()
if(category_id.notNull())
{
// check trash
- LLUUID trash;
- trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash))
{
category_id.setNull();
@@ -4328,7 +4299,7 @@ void handle_take()
}
if(category_id.isNull())
{
- category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+ category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
}
LLSD payload;
payload["folder_id"] = category_id;
@@ -4363,7 +4334,7 @@ void handle_take()
bool confirm_take(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(enable_take() && (option == 0))
{
derez_objects(DRD_TAKE_INTO_AGENT_INVENTORY, notification["payload"]["folder_id"].asUUID());
@@ -4538,7 +4509,7 @@ S32 selection_price()
/*
bool callback_show_buy_currency(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
llinfos << "Loading page " << LLNotifications::instance().getGlobalString("BUY_CURRENCY_URL") << llendl;
@@ -4564,7 +4535,7 @@ void show_buy_currency(const char* extra)
{
args["EXTRA"] = extra;
}
- LLNotifications::instance().add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency);
+ LLNotificationsUtil::add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency);
}
void handle_buy()
@@ -4834,7 +4805,7 @@ class LLToolsLink : public view_listener_t
{
if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
{
- LLNotifications::instance().add("UnableToLinkWhileDownloading");
+ LLNotificationsUtil::add("UnableToLinkWhileDownloading");
return true;
}
@@ -4845,18 +4816,18 @@ class LLToolsLink : public view_listener_t
args["COUNT"] = llformat("%d", object_count);
int max = MAX_CHILDREN_PER_TASK+1;
args["MAX"] = llformat("%d", max);
- LLNotifications::instance().add("UnableToLinkObjects", args);
+ LLNotificationsUtil::add("UnableToLinkObjects", args);
return true;
}
if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
{
- LLNotifications::instance().add("CannotLinkIncompleteSet");
+ LLNotificationsUtil::add("CannotLinkIncompleteSet");
return true;
}
if(!LLSelectMgr::getInstance()->selectGetRootsModify())
{
- LLNotifications::instance().add("CannotLinkModify");
+ LLNotificationsUtil::add("CannotLinkModify");
return true;
}
LLUUID owner_id;
@@ -4866,7 +4837,7 @@ class LLToolsLink : public view_listener_t
// we don't actually care if you're the owner, but novices are
// the most likely to be stumped by this one, so offer the
// easiest and most likely solution.
- LLNotifications::instance().add("CannotLinkDifferentOwners");
+ LLNotificationsUtil::add("CannotLinkDifferentOwners");
return true;
}
LLSelectMgr::getInstance()->sendLink();
@@ -4878,9 +4849,10 @@ class LLToolsEnableUnlink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+ LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
- LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
- !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment();
+ first_editable_object &&
+ !first_editable_object->isAttachment();
return new_value;
}
};
@@ -5011,7 +4983,7 @@ class LLEditDelete : public view_listener_t
// When deleting an object we may not actually be done
// Keep selection so we know what to delete when confirmation is needed about the delete
- gPieObject->hide();
+ gMenuObject->hide();
return true;
}
};
@@ -5044,7 +5016,7 @@ void handle_object_delete()
// When deleting an object we may not actually be done
// Keep selection so we know what to delete when confirmation is needed about the delete
- gPieObject->hide();
+ gMenuObject->hide();
return;
}
@@ -5202,7 +5174,7 @@ void show_debug_menus()
gMenuBarView->setItemEnabled("Develop", qamode);
// Server ('Admin') menu hidden when not in godmode.
- const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT);
+ const bool show_server_menu = (gAgent.getGodLevel() > GOD_NOT || (debug && gAgent.getAdminOverride()));
gMenuBarView->setItemVisible("Admin", show_server_menu);
gMenuBarView->setItemEnabled("Admin", show_server_menu);
}
@@ -5220,7 +5192,7 @@ void toggle_debug_menus(void*)
gSavedSettings.setBOOL("UseDebugMenus", visible);
if(visible)
{
- LLFirstUse::useDebugMenus();
+ //LLFirstUse::useDebugMenus();
}
show_debug_menus();
}
@@ -5350,7 +5322,7 @@ class LLWorldSetBusy : public view_listener_t
else
{
gAgent.setBusy();
- LLNotifications::instance().add("BusyModeSet");
+ LLNotificationsUtil::add("BusyModeSet");
}
return true;
}
@@ -5360,7 +5332,7 @@ class LLWorldCreateLandmark : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
return true;
}
@@ -5368,7 +5340,7 @@ class LLWorldCreateLandmark : public view_listener_t
void handle_look_at_selection(const LLSD& param)
{
- const F32 PADDING_FACTOR = 2.f;
+ const F32 PADDING_FACTOR = 1.75f;
BOOL zoom = (param.asString() == "zoom");
if (!LLSelectMgr::getInstance()->getSelection()->isEmpty())
{
@@ -5388,14 +5360,19 @@ void handle_look_at_selection(const LLSD& param)
}
if (zoom)
{
+ // Make sure we are not increasing the distance between the camera and object
+ LLVector3d orig_distance = gAgent.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal();
+ distance = llmin(distance, (F32) orig_distance.length());
+
gAgent.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance),
- LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
- object_id );
+ LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
+ object_id );
+
}
else
{
gAgent.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id );
- }
+ }
}
}
@@ -5466,7 +5443,7 @@ class LLAvatarAddContact : public view_listener_t
bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
gAgent.clearBusy();
@@ -5610,79 +5587,91 @@ void handle_viewer_disable_message_log(void*)
gMessageSystem->stopLogging();
}
-class LLShowFloater : public view_listener_t
+void handle_customize_avatar()
+{
+ if (gAgentWearables.areWearablesLoaded())
+ {
+ gAgent.changeCameraToCustomizeAvatar();
+ }
+}
+
+void handle_report_abuse()
+{
+ // Prevent menu from appearing in screen shot.
+ gMenuHolder->hideMenus();
+ LLFloaterReporter::showFromMenu(COMPLAINT_REPORT);
+}
+
+void handle_buy_currency()
+{
+ LLFloaterBuyCurrency::buyCurrency();
+}
+
+class LLFloaterVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string floater_name = userdata.asString();
- if (floater_name == "appearance")
- {
- if (gAgentWearables.areWearablesLoaded())
- {
- gAgent.changeCameraToCustomizeAvatar();
- }
- }
- else if (floater_name == "toolbar")
- {
- LLToolBar::toggle(NULL);
- }
- else if (floater_name == "buy land")
- {
- if (LLViewerParcelMgr::getInstance()->selectionEmpty())
- {
- LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
- }
-
- LLViewerParcelMgr::getInstance()->startBuyLand();
- }
- else if (floater_name == "script errors")
- {
- LLFloaterScriptDebug::show(LLUUID::null);
- }
- else if (floater_name == "help f1")
- {
- LLViewerHelp* vhelp = LLViewerHelp::getInstance();
- vhelp->showTopic(vhelp->getTopicFromFocus());
- }
- else if (floater_name == "complaint reporter")
+ bool new_value = false;
{
- // Prevent menu from appearing in screen shot.
- gMenuHolder->hideMenus();
- LLFloaterReporter::showFromMenu(COMPLAINT_REPORT);
+ new_value = LLFloaterReg::instanceVisible(floater_name);
}
- else if (floater_name == "buy currency")
+ return new_value;
+ }
+};
+
+class LLShowHelp : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string help_topic = userdata.asString();
+ LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+ vhelp->showTopic(help_topic);
+ return true;
+ }
+};
+
+class LLShowSidetrayPanel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+ // Toggle the panel
+ if (!LLSideTray::getInstance()->isPanelActive(panel_name))
{
- LLFloaterBuyCurrency::buyCurrency();
+ // LLFloaterInventory::showAgentInventory();
+ LLSideTray::getInstance()->showPanel(panel_name, LLSD());
}
else
{
- LLFloaterReg::toggleInstance(floater_name);
+ LLSideTray::getInstance()->collapseSideBar();
}
return true;
}
};
-class LLFloaterVisible : public view_listener_t
+class LLSidetrayPanelVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string floater_name = userdata.asString();
- bool new_value = false;
- if (floater_name == "toolbar")
+ std::string panel_name = userdata.asString();
+ // Toggle the panel
+ if (LLSideTray::getInstance()->isPanelActive(panel_name))
{
- new_value = LLToolBar::visible(NULL);
+ return true;
}
else
{
- new_value = LLFloaterReg::instanceVisible(floater_name);
+ return false;
}
- return new_value;
+
}
};
+
bool callback_show_url(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
LLWeb::loadURL(notification["payload"]["url"].asString());
@@ -5705,7 +5694,7 @@ class LLPromptShowURL : public view_listener_t
{
LLSD payload;
payload["url"] = url;
- LLNotifications::instance().add(alert, LLSD(), payload, callback_show_url);
+ LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_url);
}
else
{
@@ -5722,7 +5711,7 @@ class LLPromptShowURL : public view_listener_t
bool callback_show_file(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
LLWeb::loadURL(notification["payload"]["url"]);
@@ -5743,7 +5732,7 @@ class LLPromptShowFile : public view_listener_t
LLSD payload;
payload["url"] = file;
- LLNotifications::instance().add(alert, LLSD(), payload, callback_show_file);
+ LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_file);
}
else
{
@@ -5833,7 +5822,15 @@ BOOL enable_buy_land(void*)
LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(), false);
}
-
+void handle_buy_land()
+{
+ LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+ if (vpm->selectionEmpty())
+ {
+ vpm->selectParcelAt(gAgent.getPositionGlobal());
+ }
+ vpm->startBuyLand();
+}
class LLObjectAttachToAvatar : public view_listener_t
{
@@ -5922,47 +5919,72 @@ void confirm_replace_attachment(S32 option, void* user_data)
}
}
-class LLAttachmentDrop : public view_listener_t
+void callback_attachment_drop(const LLSD& notification, const LLSD& response)
{
- bool handleEvent(const LLSD& userdata)
+ // Ensure user confirmed the drop
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return;
+
+ // Called when the user clicked on an object attached to them
+ // and selected "Drop".
+ LLUUID object_id = notification["payload"]["object_id"].asUUID();
+ LLViewerObject *object = gObjectList.findObject(object_id);
+
+ if (!object)
{
- // Called when the user clicked on an object attached to them
- // and selected "Drop".
- LLViewerObject *object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object)
- {
- llwarns << "handle_drop_attachment() - no object to drop" << llendl;
- return true;
- }
+ llwarns << "handle_drop_attachment() - no object to drop" << llendl;
+ return;
+ }
- LLViewerObject *parent = (LLViewerObject*)object->getParent();
- while (parent)
+ LLViewerObject *parent = (LLViewerObject*)object->getParent();
+ while (parent)
+ {
+ if(parent->isAvatar())
{
- if(parent->isAvatar())
- {
- break;
- }
- object = parent;
- parent = (LLViewerObject*)parent->getParent();
+ break;
}
+ object = parent;
+ parent = (LLViewerObject*)parent->getParent();
+ }
- if (!object)
+ if (!object)
+ {
+ llwarns << "handle_detach() - no object to detach" << llendl;
+ return;
+ }
+
+ if (object->isAvatar())
+ {
+ llwarns << "Trying to detach avatar from avatar." << llendl;
+ return;
+ }
+
+ // reselect the object
+ LLSelectMgr::getInstance()->selectObjectAndFamily(object);
+
+ LLSelectMgr::getInstance()->sendDropAttachment();
+
+ return;
+}
+
+class LLAttachmentDrop : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLSD payload;
+ LLViewerObject *object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+
+ if (object)
{
- llwarns << "handle_detach() - no object to detach" << llendl;
- return true;
+ payload["object_id"] = object->getID();
}
-
- if (object->isAvatar())
+ else
{
- llwarns << "Trying to detach avatar from avatar." << llendl;
+ llwarns << "Drop object not found" << llendl;
return true;
}
- // The sendDropAttachment() method works on the list of selected
- // objects. Thus we need to clear the list, make sure it only
- // contains the object the user clicked, send the message,
- // then clear the list.
- LLSelectMgr::getInstance()->sendDropAttachment();
+ LLNotificationsUtil::add("AttachmentDrop", LLSD(), payload, &callback_attachment_drop);
return true;
}
};
@@ -6087,7 +6109,7 @@ public:
protected:
virtual void done()
{
- gPieAttachment->buildDrawLabels();
+ gMenuAttachmentSelf->buildDrawLabels();
gInventory.removeObserver(this);
delete this;
}
@@ -6098,7 +6120,7 @@ class LLAttachmentEnableDrop : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild());
+ BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->allowAgentBuild());
//Add an inventory observer to only allow dropping the newly attached item
//once it exists in your inventory. Look at Jira 2422.
@@ -6114,7 +6136,8 @@ class LLAttachmentEnableDrop : public view_listener_t
LLViewerJointAttachment* attachment = NULL;
LLInventoryItem* item = NULL;
- if (object)
+ // Do not enable drop if all faces of object are not enabled
+ if (object && LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES ))
{
S32 attachmentID = ATTACHMENT_ID_FROM_STATE(object->getState());
attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
@@ -6156,8 +6179,14 @@ class LLAttachmentEnableDrop : public view_listener_t
BOOL enable_detach(const LLSD&)
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object) return FALSE;
- if (!object->isAttachment()) return FALSE;
+
+ // Only enable detach if all faces of object are selected
+ if (!object ||
+ !object->isAttachment() ||
+ !LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES ))
+ {
+ return FALSE;
+ }
// Find the avatar who owns this attachment
LLViewerObject* avatar = object;
@@ -6208,6 +6237,7 @@ BOOL object_selected_and_point_valid()
return (selection->getRootObjectCount() == 1) &&
(selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) &&
selection->getFirstRootObject()->permYouOwner() &&
+ selection->getFirstRootObject()->flagObjectMove() &&
!((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() &&
(selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL);
}
@@ -6258,21 +6288,20 @@ class LLAvatarSendIM : public view_listener_t
LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
if(avatar)
{
- std::string name("IM");
- LLNameValue *first = avatar->getNVPair("FirstName");
- LLNameValue *last = avatar->getNVPair("LastName");
- if (first && last)
- {
- name.assign( first->getString() );
- name.append(" ");
- name.append( last->getString() );
- }
+ LLAvatarActions::startIM(avatar->getID());
+ }
+ return true;
+ }
+};
- //EInstantMessage type = have_agent_callingcard(gLastHitObjectID)
- // ? IM_SESSION_ADD : IM_SESSION_CARDLESS_START;
- gIMMgr->addSession(name,
- IM_NOTHING_SPECIAL,
- avatar->getID());
+class LLAvatarCall : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ if(avatar)
+ {
+ LLAvatarActions::startCall(avatar->getID());
}
return true;
}
@@ -6315,12 +6344,12 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
if ( !func.scripted )
{
std::string noscriptmsg = std::string("Cannot") + msg + "SelectObjectsNoScripts";
- LLNotifications::instance().add(noscriptmsg);
+ LLNotificationsUtil::add(noscriptmsg);
}
else if ( !func.modifiable )
{
std::string nomodmsg = std::string("Cannot") + msg + "SelectObjectsNoPermission";
- LLNotifications::instance().add(nomodmsg);
+ LLNotificationsUtil::add(nomodmsg);
}
else
{
@@ -6380,7 +6409,6 @@ class LLToolsSelectedScriptAction : public view_listener_t
else
{
llwarns << "Failed to generate LLFloaterScriptQueue with action: " << action << llendl;
- delete queue;
}
return true;
}
@@ -6389,61 +6417,65 @@ class LLToolsSelectedScriptAction : public view_listener_t
void handle_selected_texture_info(void*)
{
for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin();
- iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++)
+ iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++)
{
LLSelectNode* node = *iter;
-
- std::string msg;
- msg.assign("Texture info for: ");
- msg.append(node->mName);
- LLChat chat(msg);
- LLFloaterChat::addChat(chat);
-
- U8 te_count = node->getObject()->getNumTEs();
- // map from texture ID to list of faces using it
- typedef std::map< LLUUID, std::vector<U8> > map_t;
- map_t faces_per_texture;
- for (U8 i = 0; i < te_count; i++)
- {
- if (!node->isTESelected(i)) continue;
-
- LLViewerTexture* img = node->getObject()->getTEImage(i);
- LLUUID image_id = img->getID();
- faces_per_texture[image_id].push_back(i);
- }
- // Per-texture, dump which faces are using it.
- map_t::iterator it;
- for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it)
- {
- LLUUID image_id = it->first;
- U8 te = it->second[0];
- LLViewerTexture* img = node->getObject()->getTEImage(te);
- S32 height = img->getHeight();
- S32 width = img->getWidth();
- S32 components = img->getComponents();
- msg = llformat("%dx%d %s on face ",
- width,
- height,
- (components == 4 ? "alpha" : "opaque"));
- for (U8 i = 0; i < it->second.size(); ++i)
- {
- msg.append( llformat("%d ", (S32)(it->second[i])));
- }
- LLChat chat(msg);
- LLFloaterChat::addChat(chat);
- }
+
+ std::string msg;
+ msg.assign("Texture info for: ");
+ msg.append(node->mName);
+
+ LLSD args;
+ args["MESSAGE"] = msg;
+ LLNotificationsUtil::add("SystemMessage", args);
+
+ U8 te_count = node->getObject()->getNumTEs();
+ // map from texture ID to list of faces using it
+ typedef std::map< LLUUID, std::vector<U8> > map_t;
+ map_t faces_per_texture;
+ for (U8 i = 0; i < te_count; i++)
+ {
+ if (!node->isTESelected(i)) continue;
+
+ LLViewerTexture* img = node->getObject()->getTEImage(i);
+ LLUUID image_id = img->getID();
+ faces_per_texture[image_id].push_back(i);
+ }
+ // Per-texture, dump which faces are using it.
+ map_t::iterator it;
+ for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it)
+ {
+ LLUUID image_id = it->first;
+ U8 te = it->second[0];
+ LLViewerTexture* img = node->getObject()->getTEImage(te);
+ S32 height = img->getHeight();
+ S32 width = img->getWidth();
+ S32 components = img->getComponents();
+ msg = llformat("%dx%d %s on face ",
+ width,
+ height,
+ (components == 4 ? "alpha" : "opaque"));
+ for (U8 i = 0; i < it->second.size(); ++i)
+ {
+ msg.append( llformat("%d ", (S32)(it->second[i])));
+ }
+
+ LLSD args;
+ args["MESSAGE"] = msg;
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
}
}
void handle_test_male(void*)
{
- LLAppearanceManager::wearOutfitByName("Male Shape & Outfit");
+ LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");
//gGestureList.requestResetFromServer( TRUE );
}
void handle_test_female(void*)
{
- LLAppearanceManager::wearOutfitByName("Female Shape & Outfit");
+ LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");
//gGestureList.requestResetFromServer( FALSE );
}
@@ -6525,21 +6557,27 @@ void menu_toggle_attached_particles(void* user_data)
LLPipeline::sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
}
-class LLAdvancedHandleAttchedLightParticles: public view_listener_t
+class LLAdvancedHandleAttachedLightParticles: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string control_name = userdata.asString();
+
+ // toggle the control
+ gSavedSettings.setBOOL(control_name,
+ !gSavedSettings.getBOOL(control_name));
+
+ // update internal flags
if (control_name == "RenderAttachedLights")
-{
+ {
menu_toggle_attached_lights(NULL);
-}
+ }
else if (control_name == "RenderAttachedParticles")
-{
+ {
menu_toggle_attached_particles(NULL);
-}
+ }
return true;
-}
+ }
};
class LLSomethingSelected : public view_listener_t
@@ -6907,7 +6945,7 @@ void handle_grab_texture(void* data)
LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;
LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
- LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type));
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type));
if(folder_id.notNull())
{
std::string name = "Unknown";
@@ -6950,16 +6988,15 @@ void handle_grab_texture(void* data)
gInventory.updateItem(item);
gInventory.notifyObservers();
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
-
// Show the preview panel for textures to let
// user know that the image is now in inventory.
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
{
LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO);
- view->getPanel()->openSelected();
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->openSelected();
//LLFloaterInventory::dumpSelectionInformation((void*)view);
// restore keyboard focus
gFocusMgr.setKeyboardFocus(focus_ctrl);
@@ -7085,6 +7122,11 @@ void handle_test_load_url(void*)
//
// LLViewerMenuHolderGL
//
+static LLDefaultChildRegistry::Register<LLViewerMenuHolderGL> r("menu_holder");
+
+LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p)
+: LLMenuHolderGL(p)
+{}
BOOL LLViewerMenuHolderGL::hideMenus()
{
@@ -7094,8 +7136,11 @@ BOOL LLViewerMenuHolderGL::hideMenus()
mParcelSelection = NULL;
mObjectSelection = NULL;
- gMenuBarView->clearHoverItem();
- gMenuBarView->resetMenuTrigger();
+ if (gMenuBarView)
+ {
+ gMenuBarView->clearHoverItem();
+ gMenuBarView->resetMenuTrigger();
+ }
return handled;
}
@@ -7121,7 +7166,7 @@ void handle_save_to_xml(void*)
LLFloater* frontmost = gFloaterView->getFrontmost();
if (!frontmost)
{
- LLNotifications::instance().add("NoFrontmostFloater");
+ LLNotificationsUtil::add("NoFrontmostFloater");
return;
}
@@ -7172,25 +7217,7 @@ void handle_buy_currency_test(void*)
LLStringUtil::format_map_t replace;
replace["[AGENT_ID]"] = gAgent.getID().asString();
replace["[SESSION_ID]"] = gAgent.getSecureSessionID().asString();
-
- // *TODO: Replace with call to LLUI::getLanguage() after windows-setup
- // branch merges in. JC
- std::string language = "en";
- language = gSavedSettings.getString("Language");
- if (language.empty() || language == "default")
- {
- language = gSavedSettings.getString("InstallLanguage");
- }
- if (language.empty() || language == "default")
- {
- language = gSavedSettings.getString("SystemLanguage");
- }
- if (language.empty() || language == "default")
- {
- language = "en";
- }
-
- replace["[LANGUAGE]"] = language;
+ replace["[LANGUAGE]"] = LLUI::getLanguage();
LLStringUtil::format(url, replace);
llinfos << "buy currency url " << url << llendl;
@@ -7449,52 +7476,10 @@ class LLEditEnableTakeOff : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string clothing = userdata.asString();
- bool new_value = false;
- if (clothing == "shirt")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_SHIRT);
- }
- if (clothing == "pants")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_PANTS);
- }
- if (clothing == "shoes")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_SHOES);
- }
- if (clothing == "socks")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_SOCKS);
- }
- if (clothing == "jacket")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_JACKET);
- }
- if (clothing == "gloves")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_GLOVES);
- }
- if (clothing == "undershirt")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_UNDERSHIRT);
- }
- if (clothing == "underpants")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_UNDERPANTS);
- }
- if (clothing == "skirt")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_SKIRT);
- }
- if (clothing == "alpha")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_ALPHA);
- }
- if (clothing == "tattoo")
- {
- new_value = LLAgentWearables::selfHasWearable(WT_TATTOO);
- }
- return new_value;
+ EWearableType type = LLWearableDictionary::typeNameToType(clothing);
+ if (type >= WT_SHAPE && type < WT_COUNT)
+ return LLAgentWearables::selfHasWearable(type);
+ return false;
}
};
@@ -7503,53 +7488,18 @@ class LLEditTakeOff : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string clothing = userdata.asString();
- if (clothing == "shirt")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_SHIRT);
- }
- else if (clothing == "pants")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_PANTS);
- }
- else if (clothing == "shoes")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_SHOES);
- }
- else if (clothing == "socks")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_SOCKS);
- }
- else if (clothing == "jacket")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_JACKET);
- }
- else if (clothing == "gloves")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_GLOVES);
- }
- else if (clothing == "undershirt")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_UNDERSHIRT);
- }
- else if (clothing == "underpants")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_UNDERPANTS);
- }
- else if (clothing == "skirt")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_SKIRT);
- }
- else if (clothing == "alpha")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_ALPHA);
- }
- else if (clothing == "tattoo")
- {
- LLAgentWearables::userRemoveWearable((void*)WT_TATTOO);
- }
- else if (clothing == "all")
+ if (clothing == "all")
+ LLWearableBridge::removeAllClothesFromAvatar();
+ else
{
- LLAgentWearables::userRemoveAllClothes(NULL);
+ EWearableType type = LLWearableDictionary::typeNameToType(clothing);
+ if (type >= WT_SHAPE && type < WT_COUNT)
+ {
+ // MULTI-WEARABLES
+ LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0));
+ LLWearableBridge::removeItemFromAvatar(item);
+ }
+
}
return true;
}
@@ -7682,6 +7632,24 @@ class LLWorldDayCycle : public view_listener_t
}
};
+class LLWorldToggleMovementControls : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLBottomTray::getInstance()->toggleMovementControls();
+ return true;
+ }
+};
+
+class LLWorldToggleCameraControls : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLBottomTray::getInstance()->toggleCameraControls();
+ return true;
+ }
+};
+
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
{
static LLMenuGL* show_navbar_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_navbar.xml",
@@ -7717,12 +7685,11 @@ void initialize_menus()
LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar();
LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
- LLUICtrl::VisibleCallbackRegistry::Registrar& visible = LLUICtrl::VisibleCallbackRegistry::currentRegistrar();
// Generic enable and visible
// Don't prepend MenuName.Foo because these can be used in any menu.
enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
- visible.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
+ enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
// Agent
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
@@ -7754,6 +7721,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
+ commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
// View menu
view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook");
@@ -7801,6 +7769,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle");
+ view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
+ view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
+
// Tools menu
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
@@ -7829,7 +7800,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink");
view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
- visible.add("Tools.VisibleTakeCopy", boost::bind(&enable_object_take_copy));
enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
@@ -7851,6 +7821,9 @@ void initialize_menus()
// Advanced Other Settings
view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache");
+ // Advanced > Shortcuts
+ view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+
// Advanced > Render > Types
view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType");
view_listener_t::addMenu(new LLAdvancedCheckRenderType(), "Advanced.CheckRenderType");
@@ -7864,8 +7837,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedSelectedTextureInfo(), "Advanced.SelectedTextureInfo");
view_listener_t::addMenu(new LLAdvancedToggleWireframe(), "Advanced.ToggleWireframe");
view_listener_t::addMenu(new LLAdvancedCheckWireframe(), "Advanced.CheckWireframe");
- view_listener_t::addMenu(new LLAdvancedToggleDisableTextures(), "Advanced.ToggleDisableTextures");
- view_listener_t::addMenu(new LLAdvancedCheckDisableTextures(), "Advanced.CheckDisableTextures");
view_listener_t::addMenu(new LLAdvancedToggleTextureAtlas(), "Advanced.ToggleTextureAtlas");
view_listener_t::addMenu(new LLAdvancedCheckTextureAtlas(), "Advanced.CheckTextureAtlas");
view_listener_t::addMenu(new LLAdvancedEnableObjectObjectOcclusion(), "Advanced.EnableObjectObjectOcclusion");
@@ -7879,7 +7850,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedVectorizePerfTest(), "Advanced.VectorizePerfTest");
view_listener_t::addMenu(new LLAdvancedToggleFrameTest(), "Advanced.ToggleFrameTest");
view_listener_t::addMenu(new LLAdvancedCheckFrameTest(), "Advanced.CheckFrameTest");
- view_listener_t::addMenu(new LLAdvancedHandleAttchedLightParticles(), "Advanced.HandleAttchedLightParticles");
+ view_listener_t::addMenu(new LLAdvancedHandleAttachedLightParticles(), "Advanced.HandleAttachedLightParticles");
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -7953,10 +7924,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckDebugCharacterVis(), "Advanced.CheckDebugCharacterVis");
view_listener_t::addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");
view_listener_t::addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures");
- #ifndef LL_RELEASE_FOR_DOWNLOAD
view_listener_t::addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");
view_listener_t::addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures");
- #endif
// Advanced > Network
view_listener_t::addMenu(new LLAdvancedEnableMessageLog(), "Advanced.EnableMessageLog");
view_listener_t::addMenu(new LLAdvancedDisableMessageLog(), "Advanced.DisableMessageLog");
@@ -8009,79 +7978,64 @@ void initialize_menus()
view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
- visible.add("Self.VisibleStandUp", boost::bind(&enable_standup_self));
enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
// we don't use boost::bind directly to delay side tray construction
- view_listener_t::addMenu(new LLSelfFriends(), "Self.Friends");
- view_listener_t::addMenu(new LLSelfGroups(), "Self.Groups");
+ view_listener_t::addMenu( new LLTogglePanelPeopleTab(), "SideTray.PanelPeopleTab");
// Avatar pie menu
view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");
view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend");
view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact");
- view_listener_t::addMenu(new LLAvatarFreeze(), "Avatar.Freeze");
+ commit.add("Avatar.Freeze", boost::bind(&handle_avatar_freeze, LLSD()));
view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug");
view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug");
- view_listener_t::addMenu(new LLAvatarEnableDebug(), "Avatar.EnableDebug");
view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");
view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard");
- view_listener_t::addMenu(new LLAvatarEject(), "Avatar.Eject");
+ commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));
view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
+ view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");
+ enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
- view_listener_t::addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject");
+ enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
+ enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
// Object pie menu
view_listener_t::addMenu(new LLObjectBuild(), "Object.Build");
commit.add("Object.Touch", boost::bind(&handle_object_touch));
commit.add("Object.SitOrStand", boost::bind(&handle_object_sit_or_stand));
- visible.add("Object.EnableSit", boost::bind(&enable_sit_object));
+ enable.add("Object.EnableSit", boost::bind(&enable_sit_object));
commit.add("Object.Delete", boost::bind(&handle_object_delete));
view_listener_t::addMenu(new LLObjectAttachToAvatar(), "Object.AttachToAvatar");
view_listener_t::addMenu(new LLObjectReturn(), "Object.Return");
view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse");
view_listener_t::addMenu(new LLObjectMute(), "Object.Mute");
- visible.add("Object.VisibleTake", boost::bind(&visible_take_object));
- visible.add("Object.VisibleBuy", boost::bind(&visible_buy_object));
+ enable.add("Object.VisibleTake", boost::bind(&visible_take_object));
+ enable.add("Object.VisibleBuy", boost::bind(&visible_buy_object));
commit.add("Object.Buy", boost::bind(&handle_buy));
commit.add("Object.Edit", boost::bind(&handle_object_edit));
-
+ commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
+ commit.add("Object.Open", boost::bind(&handle_object_open));
commit.add("Object.Take", boost::bind(&handle_take));
-
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
- visible.add("Object.VisibleOpen", boost::bind(&enable_object_open));
-
enable.add("Object.EnableTouch", boost::bind(&enable_object_touch));
- visible.add("Object.VisibleTouch", boost::bind(&enable_object_touch));
-
view_listener_t::addMenu(new LLObjectEnableTouch(), "Object.EnableTouch");
view_listener_t::addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand");
-
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
- visible.add("Object.VisibleDelete", boost::bind(&enable_object_delete));
-
enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid));
- visible.add("Object.VisibleWear", boost::bind(&object_selected_and_point_valid));
view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn");
view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse");
enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute));
enable.add("Object.EnableMute", boost::bind(&enable_object_mute));
- visible.add("Object.VisibleMute", boost::bind(&enable_object_mute));
-
enable.add("Object.EnableBuy", boost::bind(&enable_buy_object));
-
- /*view_listener_t::addMenu(new LLObjectVisibleTouch(), "Object.VisibleTouch");
- view_listener_t::addMenu(new LLObjectVisibleCustomTouch(), "Object.VisibleCustomTouch");
- view_listener_t::addMenu(new LLObjectVisibleStandUp(), "Object.VisibleStandUp");
- view_listener_t::addMenu(new LLObjectVisibleSitHere(), "Object.VisibleSitHere");
- view_listener_t::addMenu(new LLObjectVisibleCustomSit(), "Object.VisibleCustomSit");*/
+ commit.add("Object.ZoomIn", boost::bind(&handle_look_at_selection, "zoom"));
// Attachment pie menu
enable.add("Attachment.Label", boost::bind(&onEnableAttachmentLabel, _1, _2));
@@ -8099,9 +8053,12 @@ void initialize_menus()
view_listener_t::addMenu(new LLLandEdit(), "Land.Edit");
view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
+ commit.add("Land.Buy", boost::bind(&handle_buy_land));
// Generic actions
- view_listener_t::addMenu(new LLShowFloater(), "ShowFloater");
+ commit.add("ReportAbuse", boost::bind(&handle_report_abuse));
+ commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
+ view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
view_listener_t::addMenu(new LLToggleControl(), "ToggleControl");
@@ -8110,12 +8067,13 @@ void initialize_menus()
commit.add("PayObject", boost::bind(&handle_give_money_dialog));
enable.add("EnablePayObject", boost::bind(&enable_pay_object));
- visible.add("VisiblePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
enable.add("EnableEdit", boost::bind(&enable_object_edit));
- visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
+ enable.add("VisibleBuild", boost::bind(&enable_object_build));
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
+ view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
+ view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 6d32df2bc5..d3c34f0de4 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -36,6 +36,7 @@
#include "llmenugl.h"
#include "llsafehandle.h"
+class LLMessageSystem;
class LLSD;
class LLUICtrl;
class LLView;
@@ -94,6 +95,7 @@ void handle_sit_down(void*);
void handle_object_build(void*);
void handle_object_touch();
bool enable_object_open();
+void handle_object_open();
// Buy either contents or object itself
void handle_buy();
@@ -101,6 +103,16 @@ void handle_take_copy();
void handle_look_at_selection(const LLSD& param);
void handle_zoom_to_object(LLUUID object_id);
+void handle_buy_land();
+
+// Takes avatar UUID, or if no UUID passed, uses last selected object
+void handle_avatar_freeze(const LLSD& avatar_id);
+
+// Takes avatar UUID, or if no UUID passed, uses last selected object
+void handle_avatar_eject(const LLSD& avatar_id);
+
+bool enable_freeze_eject(const LLSD& avatar_id);
+
// Can anyone take a free copy of the object?
// *TODO: Move to separate file
bool anyone_copy_selection(LLSelectNode* nodep);
@@ -124,6 +136,11 @@ void handle_export_selected( void * );
class LLViewerMenuHolderGL : public LLMenuHolderGL
{
public:
+ struct Params : public LLInitParam::Block<Params, LLMenuHolderGL::Params>
+ {};
+
+ LLViewerMenuHolderGL(const Params& p);
+
virtual BOOL hideMenus();
void setParcelSelection(LLSafeHandle<LLParcelSelection> selection);
@@ -144,21 +161,13 @@ extern LLMenuGL* gPopupMenuView;
extern LLViewerMenuHolderGL* gMenuHolder;
extern LLMenuBarGL* gLoginMenuBarView;
-// Pie menus
-extern LLContextMenu *gPieSelf;
-extern LLContextMenu *gPieAvatar;
-extern LLContextMenu *gPieObject;
-extern LLContextMenu *gPieAttachment;
-
-extern LLContextMenu *gPieLand;
-extern LLContextMenu *gPieRate;
-
-// Pie menus
-extern LLContextMenu *gPieSelfSimple;
-extern LLContextMenu *gPieAvatarSimple;
-extern LLContextMenu *gPieObjectSimple;
-extern LLContextMenu *gPieAttachmentSimple;
-extern LLContextMenu *gPieLandSimple;
+// Context menus in 3D scene
+extern LLContextMenu *gMenuAvatarSelf;
+extern LLContextMenu *gMenuAvatarOther;
+extern LLContextMenu *gMenuObject;
+extern LLContextMenu *gMenuAttachmentSelf;
+extern LLContextMenu *gMenuAttachmentOther;
+extern LLContextMenu *gMenuLand;
// Needed to build menus when attachment site list available
extern LLMenuGL* gAttachSubMenu;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index d3a9e1cef8..84b270f8cc 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -40,6 +40,12 @@
#include "llfloaterreg.h"
#include "llfloaterbuycurrency.h"
#include "llfloatersnapshot.h"
+#include "llimage.h"
+#include "llimagebmp.h"
+#include "llimagepng.h"
+#include "llimagej2c.h"
+#include "llimagejpeg.h"
+#include "llimagetga.h"
#include "llinventorymodel.h" // gInventory
#include "llresourcedata.h"
#include "llfloaterperms.h"
@@ -47,6 +53,8 @@
#include "llviewercontrol.h" // gSavedSettings
#include "llviewertexturelist.h"
#include "lluictrlfactory.h"
+#include "llvfile.h"
+#include "llvfs.h"
#include "llviewerinventory.h"
#include "llviewermenu.h" // gMenuHolder
#include "llviewerregion.h"
@@ -61,24 +69,17 @@
#include "llassetuploadresponders.h"
#include "lleconomy.h"
#include "llhttpclient.h"
+#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "llstring.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
#include "llvorbisencode.h"
+#include "message.h"
// system libraries
#include <boost/tokenizer.hpp>
-class LLFileEnableSaveAs : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
- return new_value;
- }
-};
-
class LLFileEnableUpload : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -175,7 +176,7 @@ const std::string upload_pick(void* data)
// No extension
LLSD args;
args["FILE"] = short_name;
- LLNotifications::instance().add("NoFileExtension", args);
+ LLNotificationsUtil::add("NoFileExtension", args);
return std::string();
}
else
@@ -218,7 +219,7 @@ const std::string upload_pick(void* data)
LLSD args;
args["EXTENSION"] = ext;
args["VALIDS"] = valid_extensions;
- LLNotifications::instance().add("InvalidFileExtension", args);
+ LLNotificationsUtil::add("InvalidFileExtension", args);
return std::string();
}
}//end else (non-null extension)
@@ -236,7 +237,7 @@ const std::string upload_pick(void* data)
llinfos << error_msg << ": " << filename << llendl;
LLSD args;
args["FILE"] = filename;
- LLNotifications::instance().add( error_msg, args );
+ LLNotificationsUtil::add( error_msg, args );
return std::string();
}
}//end if a wave/sound file
@@ -319,7 +320,7 @@ class LLFileUploadBulk : public view_listener_t
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
- upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+ upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
display_name,
callback, expected_upload_cost, userdata);
@@ -338,7 +339,7 @@ class LLFileUploadBulk : public view_listener_t
void upload_error(const std::string& error_message, const std::string& label, const std::string& filename, const LLSD& args)
{
llwarns << error_message << llendl;
- LLNotifications::instance().add(label, args);
+ LLNotificationsUtil::add(label, args);
if(LLFile::remove(filename) == -1)
{
lldebugs << "unable to remove temp file" << llendl;
@@ -385,27 +386,14 @@ class LLFileCloseAllWindows : public view_listener_t
}
};
-class LLFileSaveTexture : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloater* top = gFloaterView->getFrontmost();
- if (top)
- {
- top->saveAs();
- }
- return true;
- }
-};
-
class LLFileTakeSnapshotToDisk : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLPointer<LLImageRaw> raw = new LLImageRaw;
- S32 width = gViewerWindow->getWindowDisplayWidth();
- S32 height = gViewerWindow->getWindowDisplayHeight();
+ S32 width = gViewerWindow->getWindowWidthRaw();
+ S32 height = gViewerWindow->getWindowHeightRaw();
if (gSavedSettings.getBOOL("HighResSnapshot"))
{
@@ -493,7 +481,7 @@ void handle_compress_image(void*)
void upload_new_resource(const std::string& src_filename, std::string name,
std::string desc, S32 compression_info,
- LLAssetType::EType destination_folder_type,
+ LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
@@ -792,7 +780,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
llwarns << error_message << llendl;
LLSD args;
args["ERROR_MESSAGE"] = error_message;
- LLNotifications::instance().add("ErrorMessage", args);
+ LLNotificationsUtil::add("ErrorMessage", args);
if(LLFile::remove(filename) == -1)
{
lldebugs << "unable to remove temp file" << llendl;
@@ -808,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
//LLAssetType::EType pref_loc = data->mPreferredLocation;
BOOL is_balance_sufficient = TRUE;
- if(result >= 0)
+ if(data)
{
- LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation;
-
- if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
- LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
- LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
+ if (result >= 0)
{
- // Charge the user for the upload.
- LLViewerRegion* region = gAgent.getRegion();
-
- if(!(can_afford_transaction(expected_upload_cost)))
- {
- LLFloaterBuyCurrency::buyCurrency(
- llformat(LLTrans::getString("UploadingCosts").c_str(),
- data->mAssetInfo.getName().c_str()),
- expected_upload_cost);
- is_balance_sufficient = FALSE;
- }
- else if(region)
+ LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
+
+ if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
+ LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
+ LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
{
- // Charge user for upload
- gStatusBar->debitBalance(expected_upload_cost);
+ // Charge the user for the upload.
+ LLViewerRegion* region = gAgent.getRegion();
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_MoneyTransferRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_MoneyData);
- msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
- msg->addU8("Flags", 0);
- // we tell the sim how much we were expecting to pay so it
- // can respond to any discrepancy
- msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
- msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
- msg->addStringFast(_PREHASH_Description, NULL);
- msg->sendReliable(region->getHost());
+ if(!(can_afford_transaction(expected_upload_cost)))
+ {
+ LLFloaterBuyCurrency::buyCurrency(
+ llformat(LLTrans::getString("UploadingCosts").c_str(),
+ data->mAssetInfo.getName().c_str()),
+ expected_upload_cost);
+ is_balance_sufficient = FALSE;
+ }
+ else if(region)
+ {
+ // Charge user for upload
+ gStatusBar->debitBalance(expected_upload_cost);
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MoneyTransferRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MoneyData);
+ msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
+ msg->addU8("Flags", 0);
+ // we tell the sim how much we were expecting to pay so it
+ // can respond to any discrepancy
+ msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
+ msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
+ msg->addStringFast(_PREHASH_Description, NULL);
+ msg->sendReliable(region->getHost());
+ }
}
- }
- if(is_balance_sufficient)
- {
- // Actually add the upload to inventory
- llinfos << "Adding " << uuid << " to inventory." << llendl;
- LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc));
- if(folder_id.notNull())
+ if(is_balance_sufficient)
{
- U32 next_owner_perms = data->mNextOwnerPerm;
- if(PERM_NONE == next_owner_perms)
+ // Actually add the upload to inventory
+ llinfos << "Adding " << uuid << " to inventory." << llendl;
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
+ if(folder_id.notNull())
{
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ U32 next_owner_perms = data->mNextOwnerPerm;
+ if(PERM_NONE == next_owner_perms)
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
+ data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
+ data->mInventoryType, NOT_WEARABLE, next_owner_perms,
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
}
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
- data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
- data->mInventoryType, NOT_WEARABLE, next_owner_perms,
- LLPointer<LLInventoryCallback>(NULL));
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
}
}
- }
- else // if(result >= 0)
- {
- LLSD args;
- args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotifications::instance().add("CannotUploadReason", args);
+ else // if(result >= 0)
+ {
+ LLSD args;
+ args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ }
}
LLUploadDialog::modalUploadFinished();
delete data;
+ data = NULL;
// *NOTE: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
@@ -903,7 +895,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
upload_new_resource(next_file, asset_name, asset_name, // file
- 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+ 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
PERM_NONE, PERM_NONE, PERM_NONE,
display_name,
callback,
@@ -915,7 +907,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
std::string name,
std::string desc, S32 compression_info,
- LLAssetType::EType destination_folder_type,
+ LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
@@ -973,14 +965,14 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
llinfos << "Name: " << name << llendl;
llinfos << "Desc: " << desc << llendl;
llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
- lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl;
+ lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
if (!url.empty())
{
llinfos << "New Agent Inventory via capability" << llendl;
LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type);
+ body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
body["asset_type"] = LLAssetType::lookup(asset_type);
body["inventory_type"] = LLInventoryType::lookup(inv_type);
body["name"] = name;
@@ -1049,10 +1041,10 @@ void init_menu_file()
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
view_listener_t::addEnable(new LLFileEnableCloseWindow(), "File.EnableCloseWindow");
view_listener_t::addEnable(new LLFileEnableCloseAllWindows(), "File.EnableCloseAllWindows");
- view_listener_t::addCommit(new LLFileSaveTexture(), "File.SaveTexture");
view_listener_t::addCommit(new LLFileTakeSnapshotToDisk(), "File.TakeSnapshotToDisk");
view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
- view_listener_t::addEnable(new LLFileEnableSaveAs(), "File.EnableSaveAs");
+
+ // "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index bf21292082..1e6d13f1c6 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -33,7 +33,8 @@
#ifndef LLVIEWERMENUFILE_H
#define LLVIEWERMENUFILE_H
-#include "llassettype.h"
+#include "llfoldertype.h"
+#include "llassetstorage.h"
#include "llinventorytype.h"
class LLTransactionID;
@@ -45,7 +46,7 @@ void upload_new_resource(const std::string& src_filename,
std::string name,
std::string desc,
S32 compression_info,
- LLAssetType::EType destination_folder_type,
+ LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
@@ -60,7 +61,7 @@ void upload_new_resource(const LLTransactionID &tid,
std::string name,
std::string desc,
S32 compression_info,
- LLAssetType::EType destination_folder_type,
+ LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ec6ef92a54..b36f58f8ff 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -31,74 +31,46 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewermessage.h"
-#include <deque>
-
+#include "llanimationstates.h"
#include "llaudioengine.h"
-#include "indra_constants.h"
+#include "llavataractions.h"
#include "lscript_byteformat.h"
-#include "mean_collision_data.h"
-#include "llfloaterbump.h"
-#include "llassetstorage.h"
-#include "llcachename.h"
-#include "llchat.h"
-#include "lldbstrings.h"
#include "lleconomy.h"
-#include "llfilepicker.h"
+#include "lleventtimer.h"
#include "llfloaterreg.h"
-#include "llfocusmgr.h"
#include "llfollowcamparams.h"
-#include "llinstantmessage.h"
-#include "llquantize.h"
-#include "llregionflags.h"
#include "llregionhandle.h"
#include "llsdserialize.h"
-#include "llstring.h"
#include "llteleportflags.h"
-#include "lltracker.h"
#include "lltransactionflags.h"
+#include "llvfile.h"
+#include "llvfs.h"
#include "llxfermanager.h"
-#include "message.h"
-#include "sound_ids.h"
-#include "lltimer.h"
-#include "llmd5.h"
+#include "mean_collision_data.h"
#include "llagent.h"
#include "llcallingcard.h"
-#include "llconsole.h"
-#include "llvieweraudio.h"
-#include "llviewercontrol.h"
-#include "lldrawpool.h"
-#include "llfirstuse.h"
-#include "llfloateranimpreview.h"
+//#include "llfirstuse.h"
#include "llfloaterbuycurrency.h"
#include "llfloaterbuyland.h"
-#include "llfloaterchat.h"
-#include "llfloaterimagepreview.h"
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
#include "llfloaterlandholdings.h"
-#include "llurldispatcher.h"
#include "llfloaterpostcard.h"
#include "llfloaterpreference.h"
-#include "llfollowcam.h"
-#include "llgroupnotify.h"
-#include "llhudeffect.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
-#include "llmenugl.h"
-#include "llmoveview.h"
-#include "llmutelist.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "llnearbychat.h"
#include "llnotifications.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
#include "llpanelplaces.h"
#include "llrecentpeople.h"
+#include "llscriptfloater.h"
#include "llselectmgr.h"
#include "llsidetray.h"
#include "llstartup.h"
@@ -107,21 +79,14 @@
#include "llstatenums.h"
#include "llstatusbar.h"
#include "llimview.h"
-#include "lltool.h"
-#include "lltoolbar.h"
-#include "lltoolmgr.h"
+#include "llspeakers.h"
#include "lltrans.h"
-#include "llui.h" // for make_ui_sound
-#include "lluploaddialog.h"
-#include "llviewercamera.h"
+#include "llviewerfoldertype.h"
+#include "lluri.h"
#include "llviewergenericmessage.h"
-#include "llviewerinventory.h"
#include "llviewermenu.h"
-#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
-#include "llviewerpartsource.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewertexteditor.h"
#include "llviewerthrottle.h"
@@ -129,27 +94,23 @@
#include "llvlmanager.h"
#include "llvoavatarself.h"
#include "llvotextbubble.h"
-#include "llweb.h"
#include "llworld.h"
#include "pipeline.h"
-#include "llappviewer.h"
#include "llfloaterworldmap.h"
#include "llviewerdisplay.h"
#include "llkeythrottle.h"
#include "llgroupactions.h"
#include "llagentui.h"
#include "llpanelblockedlist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanelplaceprofile.h"
-#include <boost/tokenizer.hpp>
-#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/split.hpp> //
#if LL_WINDOWS // For Windows specific error handler
#include "llwindebug.h" // For the invalid message handler
#endif
-//#include "llnearbychathistory.h"
-#include "llnotificationmanager.h"
+#include "llnotificationmanager.h" //
//
// Constants
@@ -166,7 +127,6 @@ static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds
extern BOOL gDebugClicks;
// function prototypes
-void open_offer(const std::vector<LLUUID>& items, const std::string& from_name);
bool check_offer_throttle(const std::string& from_name, bool check_only);
//inventory offer throttle globals
@@ -207,8 +167,7 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =
bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
- LLUUID fid;
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLMessageSystem* msg = gMessageSystem;
const LLSD& payload = notification["payload"];
@@ -218,10 +177,11 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
switch(option)
{
case 0:
+ {
// accept
LLAvatarTracker::formFriendship(payload["from_id"]);
- fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+ const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
// This will also trigger an onlinenotification if the user is online
msg->newMessageFast(_PREHASH_AcceptFriendship);
@@ -233,19 +193,39 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
msg->nextBlockFast(_PREHASH_FolderData);
msg->addUUIDFast(_PREHASH_FolderID, fid);
msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ LLSD payload = notification["payload"];
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("FriendshipAcceptedByMe",
+ notification["substitutions"], payload);
break;
- case 1:
- // decline
- // We no longer notify other viewers, but we DO still send
- // the rejection to the simulator to delete the pending userop.
- msg->newMessageFast(_PREHASH_DeclineFriendship);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_TransactionBlock);
- msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
- msg->sendReliable(LLHost(payload["sender"].asString()));
- break;
+ }
+ case 1: // Decline
+ {
+ LLSD payload = notification["payload"];
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("FriendshipDeclinedByMe",
+ notification["substitutions"], payload);
+ }
+ case 2: // Send IM - decline and start IM session
+ {
+ // decline
+ // We no longer notify other viewers, but we DO still send
+ // the rejection to the simulator to delete the pending userop.
+ msg->newMessageFast(_PREHASH_DeclineFriendship);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_TransactionBlock);
+ msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
+ msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ // start IM session
+ if(2 == option)
+ {
+ LLAvatarActions::startIM(payload["from_id"].asUUID());
+ }
+ }
default:
// close button probably, possibly timed out
break;
@@ -629,7 +609,7 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)
bool join_group_response(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
BOOL delete_context_data = TRUE;
bool accept_invite = false;
@@ -644,7 +624,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
LLGroupActions::show(group_id);
LLSD args;
args["MESSAGE"] = message;
- LLNotifications::instance().add("JoinGroup", args, notification["payload"]);
+ LLNotificationsUtil::add("JoinGroup", args, notification["payload"]);
return false;
}
if(option == 0 && !group_id.isNull())
@@ -662,8 +642,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
delete_context_data = FALSE;
LLSD args;
args["NAME"] = name;
- args["INVITE"] = message;
- LLNotifications::instance().add("JoinedTooManyGroupsMember", args, notification["payload"]);
+ LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]);
}
}
@@ -680,7 +659,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
// asking about a fee.
LLSD next_payload = notification["payload"];
next_payload["fee"] = 0;
- LLNotifications::instance().add("JoinGroupCanAfford",
+ LLNotificationsUtil::add("JoinGroupCanAfford",
args,
next_payload);
}
@@ -720,7 +699,7 @@ public:
LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {}
/*virtual*/ void done()
{
- open_offer(mComplete, mFromName);
+ open_inventory_offer(mComplete, mFromName);
gInventory.removeObserver(this);
delete this;
}
@@ -738,11 +717,23 @@ class LLOpenTaskOffer : public LLInventoryAddedObserver
protected:
/*virtual*/ void done()
{
- open_offer(mAdded, "");
+ open_inventory_offer(mAdded, "");
mAdded.clear();
}
};
+class LLOpenTaskGroupOffer : public LLInventoryAddedObserver
+{
+protected:
+ /*virtual*/ void done()
+ {
+ open_inventory_offer(mAdded, "group_offer");
+ mAdded.clear();
+ gInventory.removeObserver(this);
+ delete this;
+ }
+};
+
//one global instance to bind them
LLOpenTaskOffer* gNewInventoryObserver=NULL;
@@ -758,6 +749,7 @@ void start_new_inventory_observer()
class LLDiscardAgentOffer : public LLInventoryFetchComboObserver
{
+ LOG_CLASS(LLDiscardAgentOffer);
public:
LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :
mFolderID(folder_id),
@@ -766,8 +758,7 @@ public:
virtual void done()
{
LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL;
- LLUUID trash_id;
- trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
bool notify = false;
if(trash_id.notNull() && mObjectID.notNull())
{
@@ -855,9 +846,13 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
}
message << ", automatic preview disabled for "
<< OFFER_THROTTLE_TIME << " seconds.";
- chat.mText = message.str();
+
//this is kinda important, so actually put it on screen
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ std::string log_msg = message.str();
+ LLSD args;
+ args["MESSAGE"] = log_msg;
+ LLNotificationsUtil::add("SystemMessage", args);
+
throttle_logged=true;
}
return false;
@@ -870,145 +865,189 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
}
}
-void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
+void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name)
{
- std::vector<LLUUID>::const_iterator it = items.begin();
- std::vector<LLUUID>::const_iterator end = items.end();
- LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
- LLInventoryItem* item;
- for(; it != end; ++it)
+ for (std::vector<LLUUID>::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- const LLUUID& id = *it;
- item = gInventory.getItem(id);
- if(!item)
+ const LLUUID& item_id = (*item_iter);
+ if(!highlight_offered_item(item_id))
{
- LL_WARNS("Messaging") << "Unable to show inventory item: " << id << LL_ENDL;
continue;
}
- if(gInventory.isObjectDescendentOf(id, trash_id))
- {
+
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ llassert(item);
+ if (!item) {
continue;
}
- LLAssetType::EType asset_type = item->getType();
- //if we are throttled, don't display them
- if (check_offer_throttle(from_name, false))
+ ////////////////////////////////////////////////////////////////////////////////
+ // Special handling for various types.
+ const LLAssetType::EType asset_type = item->getType();
+ if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
{
+ LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL;
// If we opened this ourselves, focus it
- BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
+ const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
switch(asset_type)
{
case LLAssetType::AT_NOTECARD:
- LLFloaterReg::showInstance("preview_notecard", LLSD(id), take_focus);
- break;
+ {
+ LLFloaterReg::showInstance("preview_notecard", LLSD(item_id), take_focus);
+ break;
+ }
case LLAssetType::AT_LANDMARK:
{
LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
- LLSD args;
- args["LANDMARK_NAME"] = item->getName();
- args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
- LLNotifications::instance().add("LandmarkCreated", args);
-
- // Created landmark is passed to Places panel to allow its editing.
- LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD()));
- if (panel)
+ if ("inventory_handler" == from_name)
+ {
+ //we have to filter inventory_handler messages to avoid notification displaying
+ LLSideTray::getInstance()->showPanel("panel_places",
+ LLSD().with("type", "landmark").with("id", item->getUUID()));
+ }
+ else if("group_offer" == from_name)
{
- panel->setItem(item);
+ // do not open inventory when we open group notice attachment because
+ // we already opened landmark info panel
+ // "group_offer" is passed by LLOpenTaskGroupOffer
+
+ continue;
+ }
+ else if(from_name.empty())
+ {
+ // we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.
+ LLSD args;
+ args["LANDMARK_NAME"] = item->getName();
+ args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
+ LLNotificationsUtil::add("LandmarkCreated", args);
+ // Created landmark is passed to Places panel to allow its editing. In fact panel should be already displayed.
+ // If the panel is closed we don't reopen it until created landmark is loaded.
+ //TODO*:: dserduk(7/12/09) remove LLPanelPlaces dependency from here
+ LLPanelPlaces *places_panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->getPanel("panel_places"));
+ if (places_panel)
+ {
+ // Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo()
+ // TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347.
+ //if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
+ //{
+ // places_panel->setItem(item);
+ //}
+ //else
+ // we are opening a group notice attachment
+ if("create_landmark" != places_panel->getPlaceInfoType())
+ {
+ LLSD args;
+ args["type"] = "landmark";
+ args["id"] = item_id;
+ LLSideTray::getInstance()->showPanel("panel_places", args);
+ }
+ }
}
- }
+ }
break;
case LLAssetType::AT_TEXTURE:
- LLFloaterReg::showInstance("preview_texture", LLSD(id), take_focus);
- break;
+ {
+ LLFloaterReg::showInstance("preview_texture", LLSD(item_id), take_focus);
+ break;
+ }
+ case LLAssetType::AT_ANIMATION:
+ LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus);
+ break;
+ case LLAssetType::AT_SCRIPT:
+ LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus);
+ break;
+ case LLAssetType::AT_SOUND:
+ LLFloaterReg::showInstance("preview_sound", LLSD(item_id), take_focus);
+ break;
default:
break;
}
}
- //highlight item, if it's not in the trash or lost+found
- // Don't auto-open the inventory floater
- LLFloaterInventory* view = NULL;
- if(gSavedSettings.getBOOL("ShowInInventory") &&
- asset_type != LLAssetType::AT_CALLINGCARD &&
- item->getInventoryType() != LLInventoryType::IT_ATTACHMENT &&
- !from_name.empty())
- {
- view = LLFloaterInventory::showAgentInventory();
- }
- else
- {
- view = LLFloaterInventory::getActiveInventory();
- }
- if(!view)
- {
- return;
- }
-
- //Trash Check
- LLUUID trash_id;
- trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
- if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
- {
- return;
- }
- LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
- //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
- BOOL user_is_away = gAwayTimer.getStarted();
-
- // don't select lost and found items if the user is active
- if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id)
- && !user_is_away)
- {
- return;
+ ////////////////////////////////////////////////////////////////////////////////
+ // Highlight item if it's not in the trash, lost+found, or COF
+ const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") &&
+ (asset_type != LLAssetType::AT_CALLINGCARD) &&
+ (item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&
+ !from_name.empty();
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
+ if(active_panel)
+ {
+ LL_DEBUGS("Messaging") << "Highlighting" << item_id << LL_ENDL;
+ LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ gFocusMgr.setKeyboardFocus(focus_ctrl);
}
+ }
+}
- //Not sure about this check. Could make it easy to miss incoming items.
- //don't dick with highlight while the user is working
- //if(inventory_has_focus && !user_is_away)
- // break;
- LL_DEBUGS("Messaging") << "Highlighting" << item->getUUID() << LL_ENDL;
- //highlight item
+bool highlight_offered_item(const LLUUID& item_id)
+{
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if(!item)
+ {
+ LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL;
+ return false;
+ }
- if (view->getPanel())
+ ////////////////////////////////////////////////////////////////////////////////
+ // Don't highlight if it's in certain "quiet" folders which don't need UI
+ // notification (e.g. trash, cof, lost-and-found).
+ if(!gAgent.getAFK())
+ {
+ const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id);
+ if (parent)
{
- LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO);
- gFocusMgr.setKeyboardFocus(focus_ctrl);
+ const LLFolderType::EType parent_type = parent->getPreferredType();
+ if (LLViewerFolderType::lookupIsQuietType(parent_type))
+ {
+ return false;
+ }
}
}
+
+ return true;
}
void inventory_offer_mute_callback(const LLUUID& blocked_id,
const std::string& first_name,
const std::string& last_name,
- BOOL is_group)
+ BOOL is_group, LLOfferInfo* offer = NULL)
{
std::string from_name;
LLMute::EType type;
-
if (is_group)
{
type = LLMute::GROUP;
from_name = first_name;
}
+ else if(offer && offer->mFromObject)
+ {
+ //we have to block object by name because blocked_id is an id of owner
+ type = LLMute::BY_NAME;
+ from_name = offer->mFromName;
+ }
else
{
type = LLMute::AGENT;
from_name = first_name + " " + last_name;
}
- LLMute mute(blocked_id, from_name, type);
+ // id should be null for BY_NAME mute, see LLMuteList::add for details
+ LLMute mute(type == LLMute::BY_NAME ? LLUUID::null : blocked_id, from_name, type);
if (LLMuteList::getInstance()->add(mute))
{
LLPanelBlockedList::showPanelAndSelect(blocked_id);
}
// purge the message queue of any previously queued inventory offers from the same source.
- class OfferMatcher : public LLNotifyBoxView::Matcher
+ class OfferMatcher : public LLNotificationsUI::LLScreenChannel::Matcher
{
public:
OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {}
- BOOL matches(const LLNotificationPtr notification) const
+ bool matches(const LLNotificationPtr notification) const
{
if(notification->getName() == "ObjectGiveItem"
|| notification->getName() == "ObjectGiveItemUnknownUser"
@@ -1021,7 +1060,9 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
private:
const LLUUID& blocked_id;
};
- gNotifyBoxView->purgeMessagesMatching(OfferMatcher(blocked_id));
+
+ LLNotificationsUI::LLChannelManager::getInstance()->killToastsFromChannel(LLUUID(
+ gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));
}
LLOfferInfo::LLOfferInfo(const LLSD& sd)
@@ -1056,22 +1097,8 @@ LLSD LLOfferInfo::asLLSD()
return sd;
}
-bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
- {
- LLChat chat;
- std::string log_message;
- S32 button = LLNotification::getSelectedOption(notification, response);
-
- // For muting, we need to add the mute, then decline the offer.
- // This must be done here because:
- // * callback may be called immediately,
- // * adding the mute sends a message,
- // * we can't build two messages at once.
- if (2 == button)
- {
- gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
- }
-
+void LLOfferInfo::send_auto_receive_response(void)
+{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -1090,6 +1117,31 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
msg->addU32Fast(_PREHASH_ParentEstateID, 0);
msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+
+ // Auto Receive Message. The math for the dialog works, because the accept
+ // for inventory_offered, task_inventory_offer or
+ // group_notice_inventory is 1 greater than the offer integer value.
+ // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED,
+ // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
+ msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
+ msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
+ sizeof(mFolderID.mData));
+ // send the message
+ msg->sendReliable(mHost);
+
+ if(IM_INVENTORY_OFFERED == mIM)
+ {
+ // add buddy to recent people list
+ LLRecentPeople::instance().add(mFromID);
+ }
+}
+
+bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
+{
+ LLChat chat;
+ std::string log_message;
+ S32 button = LLNotificationsUtil::getSelectedOption(notification, response);
+
LLInventoryObserver* opener = NULL;
LLViewerInventoryCategory* catp = NULL;
catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
@@ -1098,114 +1150,79 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
{
itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
}
+
+ // For muting, we need to add the mute, then decline the offer.
+ // This must be done here because:
+ // * callback may be called immediately,
+ // * adding the mute sends a message,
+ // * we can't build two messages at once.
+ if (2 == button) // Block
+ {
+ gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
+ }
std::string from_string; // Used in the pop-up.
std::string chatHistory_string; // Used in chat history.
- if (mFromObject == TRUE)
- {
- if (mFromGroup)
- {
- std::string group_name;
- if (gCacheName->getGroupName(mFromID, group_name))
- {
- from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
- + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup")
- + " "+ "'" + group_name + "'";
-
- chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup")
- + " " + group_name + "'";
- }
- else
- {
- from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
- + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
- chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
- }
- }
- else
- {
- std::string first_name, last_name;
- if (gCacheName->getName(mFromID, first_name, last_name))
- {
- from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName
- + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name;
- chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name;
- }
- else
- {
- from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'")
- + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser");
- chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser");
- }
- }
- }
- else
- {
- from_string = chatHistory_string = mFromName;
- }
+
+ // TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:
+ from_string = chatHistory_string = mFromName;
bool busy=FALSE;
switch(button)
{
- case IOR_ACCEPT:
- // ACCEPT. The math for the dialog works, because the accept
- // for inventory_offered, task_inventory_offer or
- // group_notice_inventory is 1 greater than the offer integer value.
- // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED,
- // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
- msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
- msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
- sizeof(mFolderID.mData));
- // send the message
- msg->sendReliable(mHost);
-
- //don't spam them if they are getting flooded
- if (check_offer_throttle(mFromName, true))
- {
- log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
- chat.mText = log_message;
- LLFloaterChat::addChatHistory(chat);
- }
-
+ case IOR_SHOW:
// we will want to open this item when it comes back.
LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID
<< LL_ENDL;
switch (mIM)
{
case IM_INVENTORY_OFFERED:
- {
- // This is an offer from an agent. In this case, the back
- // end has already copied the items into your inventory,
- // so we can fetch it out of our inventory.
- LLInventoryFetchObserver::item_ref_t items;
- items.push_back(mObjectID);
- LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
- open_agent_offer->fetchItems(items);
- if(catp || (itemp && itemp->isComplete()))
{
- open_agent_offer->done();
- }
- else
- {
- opener = open_agent_offer;
+ // This is an offer from an agent. In this case, the back
+ // end has already copied the items into your inventory,
+ // so we can fetch it out of our inventory.
+ LLInventoryFetchObserver::item_ref_t items;
+ items.push_back(mObjectID);
+ LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
+ open_agent_offer->fetchItems(items);
+ if(catp || (itemp && itemp->isComplete()))
+ {
+ open_agent_offer->done();
+ }
+ else
+ {
+ opener = open_agent_offer;
+ }
}
- }
break;
- case IM_TASK_INVENTORY_OFFERED:
case IM_GROUP_NOTICE:
+ opener = new LLOpenTaskGroupOffer;
+ send_auto_receive_response();
+ break;
+ case IM_TASK_INVENTORY_OFFERED:
case IM_GROUP_NOTICE_REQUESTED:
- {
// This is an offer from a task or group.
// We don't use a new instance of an opener
// We instead use the singular observer gOpenTaskOffer
// Since it already exists, we don't need to actually do anything
- }
- break;
+ break;
default:
LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
break;
- } // end switch (mIM)
+ }
+ break;
+ // end switch (mIM)
+
+ case IOR_ACCEPT:
+ //don't spam them if they are getting flooded
+ if (check_offer_throttle(mFromName, true))
+ {
+ log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
+ LLSD args;
+ args["MESSAGE"] = log_message;
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
break;
case IOR_BUSY:
@@ -1214,31 +1231,18 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
case IOR_MUTE:
// MUTE falls through to decline
case IOR_DECLINE:
- // DECLINE. The math for the dialog works, because the decline
- // for inventory_offered, task_inventory_offer or
- // group_notice_inventory is 2 greater than the offer integer value.
- // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED,
- // or IM_GROUP_NOTICE_INVENTORY_DECLINED
- default:
- // close button probably (or any of the fall-throughs from above)
- msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2));
- msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
- // send the message
- msg->sendReliable(mHost);
-
- log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
- chat.mText = log_message;
- if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269
{
- chat.mMuted = TRUE;
- }
- LLFloaterChat::addChatHistory(chat);
+ log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
+ chat.mText = log_message;
+ if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269
+ {
+ chat.mMuted = TRUE;
+ }
- // If it's from an agent, we have to fetch the item to throw
- // it away. If it's from a task or group, just denying the
- // request will suffice to discard the item.
- if(IM_INVENTORY_OFFERED == mIM)
- {
+ // *NOTE dzaporozhan
+ // Disabled logging to old chat floater to fix crash in group notices - EXT-4149
+ // LLFloaterChat::addChatHistory(chat);
+
LLInventoryFetchComboObserver::folder_ref_t folders;
LLInventoryFetchComboObserver::item_ref_t items;
items.push_back(mObjectID);
@@ -1254,20 +1258,187 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
opener = discard_agent_offer;
}
+
+ if (busy && (!mFromGroup && !mFromObject))
+ {
+ busy_message(gMessageSystem, mFromID);
+ }
+ break;
}
- if (busy && (!mFromGroup && !mFromObject))
- {
- busy_message(msg,mFromID);
- }
+ default:
+ // close button probably
+ // The item has already been fetched and is in your inventory, we simply won't highlight it
+ // OR delete it if the notification gets killed, since we don't want that to be a vector for
+ // losing inventory offers.
break;
}
- if(IM_INVENTORY_OFFERED == mIM)
+ if(opener)
{
- // add buddy to recent people list
- LLRecentPeople::instance().add(mFromID);
+ gInventory.addObserver(opener);
}
+ delete this;
+ return false;
+}
+
+bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const LLSD& response)
+{
+ LLChat chat;
+ std::string log_message;
+ S32 button = LLNotification::getSelectedOption(notification, response);
+
+ // For muting, we need to add the mute, then decline the offer.
+ // This must be done here because:
+ // * callback may be called immediately,
+ // * adding the mute sends a message,
+ // * we can't build two messages at once.
+ if (2 == button)
+ {
+ gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
+ }
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MessageBlock);
+ msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
+ msg->addUUIDFast(_PREHASH_ToAgentID, mFromID);
+ msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
+ msg->addUUIDFast(_PREHASH_ID, mTransactionID);
+ msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
+ std::string name;
+ LLAgentUI::buildFullname(name);
+ msg->addStringFast(_PREHASH_FromAgentName, name);
+ msg->addStringFast(_PREHASH_Message, "");
+ msg->addU32Fast(_PREHASH_ParentEstateID, 0);
+ msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
+ msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+ LLInventoryObserver* opener = NULL;
+
+ std::string from_string; // Used in the pop-up.
+ std::string chatHistory_string; // Used in chat history.
+ if (mFromObject == TRUE)
+ {
+ if (mFromGroup)
+ {
+ std::string group_name;
+ if (gCacheName->getGroupName(mFromID, group_name))
+ {
+ from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
+ + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup")
+ + " "+ "'" + group_name + "'";
+
+ chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup")
+ + " " + group_name + "'";
+ }
+ else
+ {
+ from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
+ + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
+ chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
+ }
+ }
+ else
+ {
+ std::string first_name, last_name;
+ if (gCacheName->getName(mFromID, first_name, last_name))
+ {
+ from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName
+ + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name;
+ chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name;
+ }
+ else
+ {
+ from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'")
+ + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser");
+ chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser");
+ }
+ }
+ }
+ else
+ {
+ from_string = chatHistory_string = mFromName;
+ }
+
+ bool busy=FALSE;
+
+ switch(button)
+ {
+ case IOR_ACCEPT:
+ // ACCEPT. The math for the dialog works, because the accept
+ // for inventory_offered, task_inventory_offer or
+ // group_notice_inventory is 1 greater than the offer integer value.
+ // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED,
+ // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
+ msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
+ msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
+ sizeof(mFolderID.mData));
+ // send the message
+ msg->sendReliable(mHost);
+
+ //don't spam them if they are getting flooded
+ if (check_offer_throttle(mFromName, true))
+ {
+ log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
+ LLSD args;
+ args["MESSAGE"] = log_message;
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
+
+ // we will want to open this item when it comes back.
+ LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID
+ << LL_ENDL;
+ switch (mIM)
+ {
+ case IM_TASK_INVENTORY_OFFERED:
+ case IM_GROUP_NOTICE:
+ case IM_GROUP_NOTICE_REQUESTED:
+ {
+ // This is an offer from a task or group.
+ // We don't use a new instance of an opener
+ // We instead use the singular observer gOpenTaskOffer
+ // Since it already exists, we don't need to actually do anything
+ }
+ break;
+ default:
+ LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
+ break;
+ } // end switch (mIM)
+ break;
+
+ case IOR_BUSY:
+ //Busy falls through to decline. Says to make busy message.
+ busy=TRUE;
+ case IOR_MUTE:
+ // MUTE falls through to decline
+ case IOR_DECLINE:
+ // DECLINE. The math for the dialog works, because the decline
+ // for inventory_offered, task_inventory_offer or
+ // group_notice_inventory is 2 greater than the offer integer value.
+ // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED,
+ // or IM_GROUP_NOTICE_INVENTORY_DECLINED
+ default:
+ // close button probably (or any of the fall-throughs from above)
+ msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2));
+ msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
+ // send the message
+ msg->sendReliable(mHost);
+
+ log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
+ LLSD args;
+ args["MESSAGE"] = log_message;
+ LLNotificationsUtil::add("SystemMessage", args);
+
+ if (busy && (!mFromGroup && !mFromObject))
+ {
+ busy_message(msg,mFromID);
+ }
+ break;
+ }
+
if(opener)
{
gInventory.addObserver(opener);
@@ -1277,8 +1448,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
return false;
}
-
-void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
+void inventory_offer_handler(LLOfferInfo* info)
{
//Until throttling is implmented, busy mode should reject inventory instead of silently
//accepting it. SEE SL-39554
@@ -1310,11 +1480,16 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
// Strip any SLURL from the message display. (DEV-2754)
std::string msg = info->mDesc;
int indx = msg.find(" ( http://slurl.com/secondlife/");
+ if(indx == std::string::npos)
+ {
+ // try to find new slurl host
+ indx = msg.find(" ( http://maps.secondlife.com/secondlife/");
+ }
if(indx >= 0)
{
LLStringUtil::truncate(msg, indx);
}
-
+
LLSD args;
args["[OBJECTNAME]"] = msg;
@@ -1361,23 +1536,66 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
}
}
+ // If mObjectID is null then generate the object_id based on msg to prevent
+ // multiple creation of chiclets for same object.
+ LLUUID object_id = info->mObjectID;
+ if (object_id.isNull())
+ object_id.generate(msg);
+
payload["from_id"] = info->mFromID;
+ // Needed by LLScriptFloaterManager to bind original notification with
+ // faked for toast one.
+ payload["object_id"] = object_id;
+ // Flag indicating that this notification is faked for toast.
+ payload["give_inventory_notification"] = FALSE;
args["OBJECTFROMNAME"] = info->mFromName;
args["NAME"] = info->mFromName;
+ args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+ std::string verb = "select?name=" + LLURI::escape(msg);
+ args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
LLNotification::Params p("ObjectGiveItem");
- p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
- if (from_task)
+ // Object -> Agent Inventory Offer
+ if (info->mFromObject)
{
+ // Inventory Slurls don't currently work for non agent transfers, so only display the object name.
+ args["ITEM_SLURL"] = msg;
+ // Note: sets inventory_task_offer_callback as the callback
+ p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2));
p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";
+ // Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.
+ LLNotifications::instance().add(p);
}
- else
+ else // Agent -> Agent Inventory Offer
{
+ // Note: sets inventory_offer_callback as the callback
+ p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
p.name = "UserGiveItem";
- }
+
+ // Prefetch the item into your local inventory.
+ LLInventoryFetchObserver::item_ref_t items;
+ items.push_back(info->mObjectID);
+ LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
+ fetch_item->fetchItems(items);
+ if(fetch_item->isEverythingComplete())
+ {
+ fetch_item->done();
+ }
+ else
+ {
+ gInventory.addObserver(fetch_item);
+ }
+
+ // In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
+ info->send_auto_receive_response();
- LLNotifications::instance().add(p);
+ // Inform user that there is a script floater via toast system
+ {
+ payload["give_inventory_notification"] = TRUE;
+ LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload));
+ }
+ }
}
bool lure_callback(const LLSD& notification, const LLSD& response)
@@ -1389,7 +1607,7 @@ bool lure_callback(const LLSD& notification, const LLSD& response)
}
else
{
- option = LLNotification::getSelectedOption(notification, response);
+ option = LLNotificationsUtil::getSelectedOption(notification, response);
}
LLUUID from_id = notification["payload"]["from_id"].asUUID();
@@ -1420,7 +1638,7 @@ static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lu
bool goto_url_callback(const LLSD& notification, const LLSD& response)
{
std::string url = notification["payload"]["url"].asString();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(1 == option)
{
LLWeb::loadURL(url);
@@ -1429,6 +1647,17 @@ bool goto_url_callback(const LLSD& notification, const LLSD& response)
}
static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback);
+bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]);
+ }
+ return false;
+}
+static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback);
+
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@@ -1496,15 +1725,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
std::string separator_string(": ");
- int message_offset = 0;
-
- //Handle IRC styled /me messages.
- std::string prefix = message.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- separator_string = "";
- message_offset = 3;
- }
LLSD args;
switch(dialog)
@@ -1517,7 +1737,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: don't put the message in the IM history, even though was sent
// via the IM mechanism.
- LLNotifications::instance().add("SystemMessageTip",args);
+ LLNotificationsUtil::add("SystemMessageTip",args);
break;
case IM_NOTHING_SPECIAL:
@@ -1556,7 +1776,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// now store incoming IM in chat history
- buffer = message.substr(message_offset);
+ buffer = message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
@@ -1572,31 +1792,30 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
region_id,
position,
true);
-
- // pretend this is chat generated by self, so it does not show up on screen
- chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset);
- LLFloaterChat::addChat( chat, TRUE, TRUE );
}
else if (from_id.isNull())
{
- // Messages from "Second Life" ID don't go to IM history
- // messages which should be routed to IM window come from a user ID with name=SYSTEM_NAME
- chat.mText = name + ": " + message;
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ LLSD args;
+ args["MESSAGE"] = message;
+ LLNotificationsUtil::add("SystemMessage", args);
}
else if (to_id.isNull())
{
// Message to everyone from GOD
args["NAME"] = name;
args["MESSAGE"] = message;
- LLNotifications::instance().add("GodMessage", args);
+ LLNotificationsUtil::add("GodMessage", args);
// Treat like a system message and put in chat history.
// Claim to be from a local agent so it doesn't go into
// console.
- chat.mText = name + separator_string + message.substr(message_offset);
- BOOL local_agent = TRUE;
- LLFloaterChat::addChat(chat, FALSE, local_agent);
+ chat.mText = name + separator_string + message;
+
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ nearby_chat->addMessage(chat);
+ }
}
else
{
@@ -1606,7 +1825,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- buffer = saved + message.substr(message_offset);
+ buffer = saved + message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
@@ -1628,19 +1847,22 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
region_id,
position,
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
-
- BOOL local_agent = FALSE;
- LLFloaterChat::addChat( chat, TRUE, local_agent );
}
else
{
+ /*
+ EXT-5099
+ currently there is no way to store in history only...
+ using LLNotificationsUtil::add will add message to Nearby Chat
+
// muted user, so don't start an IM session, just record line in chat
// history. Pretend the chat is from a local agent,
// so it will go into the history but not be shown on screen.
- chat.mText = buffer;
- BOOL local_agent = TRUE;
- LLFloaterChat::addChat( chat, TRUE, local_agent );
+
+ LLSD args;
+ args["MESSAGE"] = buffer;
+ LLNotificationsUtil::add("SystemMessageTip", args);
+ */
}
}
break;
@@ -1664,7 +1886,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// This is a block, modeless dialog.
//*TODO: Translate
args["MESSAGE"] = message;
- LLNotifications::instance().add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
break;
case IM_GROUP_NOTICE:
@@ -1704,14 +1926,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
if (has_inventory)
{
- info = new LLOfferInfo;
+ info = new LLOfferInfo();
info->mIM = IM_GROUP_NOTICE;
info->mFromID = from_id;
info->mFromGroup = from_group;
info->mTransactionID = session_id;
info->mType = (LLAssetType::EType) asset_type;
- info->mFolderID = gInventory.findCategoryUUIDForType(info->mType);
+ info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
std::string from_name;
from_name += "A group member named ";
@@ -1758,6 +1980,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLPanelGroup::showNotice(subj,mes,group_id,has_inventory,item_name,info);
}
+ else
+ {
+ delete info;
+ }
}
break;
case IM_GROUP_INVITATION:
@@ -1797,7 +2023,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
args["MESSAGE"] = message;
- LLNotifications::instance().add("JoinGroup", args, payload, join_group_response);
+ LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response);
}
}
break;
@@ -1807,7 +2033,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Someone has offered us some inventory.
{
LLOfferInfo* info = new LLOfferInfo;
- bool mute_im = false;
if (IM_INVENTORY_OFFERED == dialog)
{
struct offer_agent_bucket_t
@@ -1819,22 +2044,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
if (sizeof(offer_agent_bucket_t) != binary_bucket_size)
{
LL_WARNS("Messaging") << "Malformed inventory offer from agent" << LL_ENDL;
+ delete info;
break;
}
bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0];
info->mType = (LLAssetType::EType) bucketp->asset_type;
info->mObjectID = bucketp->object_id;
-
- if(accept_im_from_only_friend&&!is_friend)
- {
- mute_im = true;
- }
}
else
{
if (sizeof(S8) != binary_bucket_size)
{
LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
+ delete info;
break;
}
info->mType = (LLAssetType::EType) binary_bucket[0];
@@ -1845,7 +2067,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mFromID = from_id;
info->mFromGroup = from_group;
info->mTransactionID = session_id;
- info->mFolderID = gInventory.findCategoryUUIDForType(info->mType);
+ info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
if (dialog == IM_TASK_INVENTORY_OFFERED)
{
@@ -1859,14 +2081,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mDesc = message;
info->mHost = msg->getSender();
//if (((is_busy && !is_owned_by_me) || is_muted))
- if ( is_muted || mute_im)
+ if (is_muted)
{
+ // Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331)
+ LLInventoryFetchObserver::item_ref_t items;
+ items.push_back(info->mObjectID);
+ LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
+ fetch_item->fetchItems(items);
+ delete fetch_item;
+
// Same as closing window
info->forceResponse(IOR_DECLINE);
}
else
{
- inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED);
+ inventory_offer_handler(info);
}
}
break;
@@ -1874,13 +2103,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
case IM_INVENTORY_ACCEPTED:
{
args["NAME"] = name;
- LLNotifications::instance().add("InventoryAccepted", args);
+ LLSD payload;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("InventoryAccepted", args, payload);
break;
}
case IM_INVENTORY_DECLINED:
{
args["NAME"] = name;
- LLNotifications::instance().add("InventoryDeclined", args);
+ LLSD payload;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("InventoryDeclined", args, payload);
break;
}
// TODO: _DEPRECATED suffix as part of vote removal - DEV-24856
@@ -1916,7 +2149,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- buffer = saved + message.substr(message_offset);
+ buffer = saved + message;
BOOL is_this_agent = FALSE;
if(from_id == gAgentID)
{
@@ -1933,9 +2166,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
region_id,
position,
true);
-
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
- LLFloaterChat::addChat(chat, TRUE, is_this_agent);
}
break;
@@ -1946,9 +2176,79 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
return;
}
+ // Build a link to open the object IM info window.
+ std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1);
+
+ if (session_id.notNull())
+ {
+ chat.mFromID = session_id;
+ }
+ else
+ {
+ // This message originated on a region without the updated code for task id and slurl information.
+ // We just need a unique ID for this object that isn't the owner ID.
+ // If it is the owner ID it will overwrite the style that contains the link to that owner's profile.
+ // This isn't ideal - it will make 1 style for all objects owned by the the same person/group.
+ // This works because the only thing we can really do in this case is show the owner name and link to their profile.
+ chat.mFromID = from_id ^ gAgent.getSessionID();
+ }
+
+ if(SYSTEM_FROM == name)
+ {
+ // System's UUID is NULL (fixes EXT-4766)
+ chat.mFromID = from_id = LLUUID::null;
+ }
+
+ LLSD query_string;
+ query_string["owner"] = from_id;
+ query_string["slurl"] = location;
+ query_string["name"] = name;
+ if (from_group)
+ {
+ query_string["groupowned"] = "true";
+ }
+
+ std::ostringstream link;
+ link << "secondlife:///app/objectim/" << session_id << LLURI::mapToQueryString(query_string);
+
+ chat.mURL = link.str();
+ chat.mText = message;
+ chat.mSourceType = CHAT_SOURCE_OBJECT;
+
+ // Note: lie to Nearby Chat, pretending that this is NOT an IM, because
+ // IMs from obejcts don't open IM sessions.
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ LLSD args;
+ args["owner_id"] = from_id;
+ args["slurl"] = location;
+ args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
+ LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
+ }
+
+
+ //Object IMs send with from name: 'Second Life' need to be displayed also in notification toasts (EXT-1590)
+ if (SYSTEM_FROM != name) break;
+
LLSD substitutions;
- substitutions["MSG"] = message.substr(message_offset);
- LLNotifications::instance().add("ServerObjectMessage", substitutions);
+ substitutions["NAME"] = name;
+ substitutions["MSG"] = message;
+
+ LLSD payload;
+ payload["object_id"] = session_id;
+ payload["owner_id"] = from_id;
+ payload["from_id"] = from_id;
+ payload["slurl"] = location;
+ payload["name"] = name;
+ std::string session_name;
+ gCacheName->getFullName(from_id, session_name);
+ payload["SESSION_NAME"] = session_name;
+ if (from_group)
+ {
+ payload["group_owned"] = "true";
+ }
+ LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);
}
break;
case IM_FROM_TASK_AS_ALERT:
@@ -1960,7 +2260,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Construct a viewer alert for this message.
args["NAME"] = name;
args["MESSAGE"] = message;
- LLNotifications::instance().add("ObjectMessage", args);
+ LLNotificationsUtil::add("ObjectMessage", args);
}
break;
case IM_BUSY_AUTO_RESPONSE:
@@ -1972,7 +2272,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
// TODO: after LLTrans hits release, get "busy response" into translatable file
- buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str());
+ buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str());
gIMMgr->addMessage(session_id, from_id, name, buffer);
}
break;
@@ -1997,7 +2297,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
payload["godlike"] = FALSE;
- LLNotifications::instance().add("TeleportOffered", args, payload);
+ LLNotificationsUtil::add("TeleportOffered", args, payload);
}
}
break;
@@ -2034,7 +2334,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["URL"] = url;
LLSD payload;
payload["url"] = url;
- LLNotifications::instance().add("GotoURL", args, payload );
+ LLNotificationsUtil::add("GotoURL", args, payload );
}
break;
@@ -2061,12 +2361,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
if(message.empty())
{
//support for frienship offers from clients before July 2008
- LLNotifications::instance().add("OfferFriendshipNoMessage", args, payload);
+ LLNotificationsUtil::add("OfferFriendshipNoMessage", args, payload);
}
else
{
args["[MESSAGE]"] = message;
- LLNotifications::instance().add("OfferFriendship", args, payload);
+ LLNotificationsUtil::add("OfferFriendship", args, payload);
}
}
}
@@ -2084,7 +2384,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
send_generic_message("requestonlinenotification", strings);
args["NAME"] = name;
- LLNotifications::instance().add("FriendshipAccepted", args);
+ LLSD payload;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("FriendshipAccepted", args, payload);
}
break;
@@ -2125,7 +2427,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)
bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLUUID fid;
LLUUID from_id;
LLMessageSystem* msg = gMessageSystem;
@@ -2139,7 +2441,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->nextBlockFast(_PREHASH_TransactionBlock);
msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID());
- fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+ fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
msg->nextBlockFast(_PREHASH_FolderData);
msg->addUUIDFast(_PREHASH_FolderID, fid);
msg->sendReliable(LLHost(notification["payload"]["sender"].asString()));
@@ -2204,7 +2506,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
}
else
{
- LLNotifications::instance().add("OfferCallingCard", args, payload);
+ LLNotificationsUtil::add("OfferCallingCard", args, payload);
}
}
else
@@ -2215,18 +2517,18 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
void process_accept_callingcard(LLMessageSystem* msg, void**)
{
- LLNotifications::instance().add("CallingCardAccepted");
+ LLNotificationsUtil::add("CallingCardAccepted");
}
void process_decline_callingcard(LLMessageSystem* msg, void**)
{
- LLNotifications::instance().add("CallingCardDeclined");
+ LLNotificationsUtil::add("CallingCardDeclined");
}
void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
{
- LLChat chat;
+ LLChat chat;
std::string mesg;
std::string from_name;
U8 source_temp;
@@ -2246,7 +2548,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// Object owner for objects
msg->getUUID("ChatData", "OwnerID", owner_id);
-
+
msg->getU8Fast(_PREHASH_ChatData, _PREHASH_SourceType, source_temp);
chat.mSourceType = (EChatSourceType)source_temp;
@@ -2275,7 +2577,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
if (chatter)
{
chat.mPosAgent = chatter->getPositionAgent();
-
+
// Make swirly things only for talking objects. (not script debug messages, though)
if (chat.mSourceType == CHAT_SOURCE_OBJECT
&& chat.mChatType != CHAT_TYPE_DEBUG_MSG)
@@ -2317,14 +2619,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
std::string prefix = mesg.substr(0, 4);
if (prefix == "/me " || prefix == "/me'")
{
- chat.mText = from_name;
- chat.mText += mesg.substr(3);
ircstyle = TRUE;
}
- else
- {
- chat.mText = mesg;
- }
+ chat.mText = mesg;
// Look for the start of typing so we can put "..." in the bubbles.
if (CHAT_TYPE_START == chat.mChatType)
@@ -2350,19 +2647,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
return;
}
- // We have a real utterance now, so can stop showing "..." and proceed.
- if (chatter && chatter->isAvatar())
- {
- LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
- ((LLVOAvatar*)chatter)->stopTyping();
-
- if (!is_muted && !is_busy)
- {
- visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");
- ((LLVOAvatar*)chatter)->addChat(chat);
- }
- }
-
// Look for IRC-style emotes
if (ircstyle)
{
@@ -2376,7 +2660,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
switch(chat.mChatType)
{
case CHAT_TYPE_WHISPER:
- verb = "(" + LLTrans::getString("whisper") + ")";
+ verb = LLTrans::getString("whisper") + " ";
break;
case CHAT_TYPE_DEBUG_MSG:
case CHAT_TYPE_OWNER:
@@ -2384,7 +2668,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
verb = "";
break;
case CHAT_TYPE_SHOUT:
- verb = "(" + LLTrans::getString("shout") + ")";
+ verb = LLTrans::getString("shout") + " ";
break;
case CHAT_TYPE_START:
case CHAT_TYPE_STOP:
@@ -2402,6 +2686,23 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
chat.mText += mesg;
}
+ // We have a real utterance now, so can stop showing "..." and proceed.
+ if (chatter && chatter->isAvatar())
+ {
+ LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
+ ((LLVOAvatar*)chatter)->stopTyping();
+
+ if (!is_muted && !is_busy)
+ {
+ visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");
+ std::string formated_msg = "";
+ LLViewerChat::formatChatMsg(chat, formated_msg);
+ LLChat chat_bubble = chat;
+ chat_bubble.mText = formated_msg;
+ ((LLVOAvatar*)chatter)->addChat(chat_bubble);
+ }
+ }
+
if (chatter)
{
chat.mPosAgent = chatter->getPositionAgent();
@@ -2421,25 +2722,13 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
chat.mMuted = is_muted && !is_linden;
- if (!visible_in_chat_bubble
- && (is_linden || !is_busy || is_owned_by_me))
- {
- // show on screen and add to history
- LLNotificationsUI::LLNotificationManager::instance().onChat(
- chat, LLNotificationsUI::NT_NEARBYCHAT);
+ // pass owner_id to chat so that we can display the remote
+ // object inspect for an object that is chatting with you
+ LLSD args;
+ args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
+ args["owner_id"] = owner_id;
- // adding temporarily so that communications window chat bar
- // works until the new chat window is ready
- chat.mText = from_name + ": " + chat.mText;
- LLFloaterChat::addChat(chat, FALSE, FALSE);
- }
- else
- {
- LLNotificationsUI::LLNotificationManager::instance().onChat(
- chat, LLNotificationsUI::NT_NEARBYCHAT);
- // adding temporarily
- LLFloaterChat::addChatHistory(chat);
- }
+ LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
}
@@ -2551,13 +2840,13 @@ public:
{ // Show notification that they can now teleport to landmarks. Use a random landmark from the inventory
S32 random_land = ll_rand( land_items.count() - 1 );
args["NAME"] = land_items[random_land]->getName();
- LLNotifications::instance().add("TeleportToLandmark",args);
+ LLNotificationsUtil::add("TeleportToLandmark",args);
}
if ( card_items.count() > 0 )
{ // Show notification that they can now contact people. Use a random calling card from the inventory
S32 random_card = ll_rand( card_items.count() - 1 );
args["NAME"] = card_items[random_card]->getName();
- LLNotifications::instance().add("TeleportToPerson",args);
+ LLNotificationsUtil::add("TeleportToPerson",args);
}
gInventory.removeObserver(this);
@@ -2592,11 +2881,10 @@ BOOL LLPostTeleportNotifiers::tick()
{
// get callingcards and landmarks available to the user arriving.
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- LLUUID folder_id;
- folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
- if(folder_id.notNull())
- folders.push_back(folder_id);
- folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+ if(callingcard_id.notNull())
+ folders.push_back(callingcard_id);
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
if(folder_id.notNull())
folders.push_back(folder_id);
if(!folders.empty())
@@ -2825,9 +3113,10 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
if (avatarp)
{
// Chat the "back" SLURL. (DEV-4907)
- LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());
- chat.mSourceType = CHAT_SOURCE_SYSTEM;
- LLFloaterChat::addChatHistory(chat);
+
+ LLSD args;
+ args["MESSAGE"] = "Teleport completed from " + gAgent.getTeleportSourceSLURL();
+ LLNotificationsUtil::add("SystemMessageTip", args);
// Set the new position
avatarp->setPositionAgent(agent_pos);
@@ -2909,46 +3198,37 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
if (!gLastVersionChannel.empty())
{
- LLSD payload;
- payload["message"] = version_channel;
- LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload, server_version_changed_callback);
- }
-
- gLastVersionChannel = version_channel;
-}
-
-bool server_version_changed_callback(const LLSD& notification, const LLSD& response)
-{
- if(notification["payload"]["message"].asString() =="")
- return false;
- std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/";
- //parse the msg string
- std::string server_version = notification["payload"]["message"].asString();
- std::vector<std::string> s_vect;
- boost::algorithm::split(s_vect, server_version, isspace);
- for(U32 i = 0; i < s_vect.size(); i++)
- {
- if (i != (s_vect.size() - 1))
+ // work out the URL for this server's Release Notes
+ std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/";
+ std::string server_version = version_channel;
+ std::vector<std::string> s_vect;
+ boost::algorithm::split(s_vect, server_version, isspace);
+ for(U32 i = 0; i < s_vect.size(); i++)
{
- if(i != (s_vect.size() - 2))
+ if (i != (s_vect.size() - 1))
{
- url += s_vect[i] + "_";
+ if(i != (s_vect.size() - 2))
+ {
+ url += s_vect[i] + "_";
+ }
+ else
+ {
+ url += s_vect[i] + "/";
+ }
}
else
{
- url += s_vect[i] + "/";
+ url += s_vect[i].substr(0,4);
}
}
- else
- {
- url += s_vect[i].substr(0,4);
- }
+
+ LLSD args;
+ args["URL"] = url;
+ LLNotificationsUtil::add("ServerVersionChanged", args);
}
-
- LLWeb::loadURL(url);
- return false;
-}
+ gLastVersionChannel = version_channel;
+}
void process_crossed_region(LLMessageSystem* msg, void**)
{
@@ -3743,6 +4023,17 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
+ // *HACK: Disabling flying mode if it has been enabled shortly before the agent
+ // stand up animation is signaled. In this case we don't get a signal to start
+ // flying animation from server, the AGENT_CONTROL_FLY flag remains set but the
+ // avatar does not play flying animation, so we switch flying mode off.
+ // See LLAgent::setFlying(). This may cause "Stop Flying" button to blink.
+ // See EXT-2781.
+ if (animation_id == ANIM_AGENT_STANDUP && gAgent.getFlying())
+ {
+ gAgent.setFlying(FALSE);
+ }
+
if (i < num_source_blocks)
{
mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i);
@@ -4131,10 +4422,10 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
if (gStatusBar)
{
- S32 old_balance = gStatusBar->getBalance();
+ // S32 old_balance = gStatusBar->getBalance();
// This is an update, not the first transmission of balance
- if (old_balance != 0)
+ /* if (old_balance != 0)
{
// this is actually an update
if (balance > old_balance)
@@ -4146,7 +4437,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
LLFirstUse::useBalanceDecrease(balance - old_balance);
}
}
-
+ */
gStatusBar->setBalance(balance);
gStatusBar->setLandCredit(credit);
gStatusBar->setLandCommitted(committed);
@@ -4163,7 +4454,28 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
// *TODO: Translate
LLSD args;
args["MESSAGE"] = desc;
- LLNotifications::instance().add("SystemMessage", args);
+
+ // this is a marker to retrieve avatar name from server message:
+ // "<avatar name> paid you L$"
+ const std::string marker = "paid you L$";
+
+ // extract avatar name from system message
+ std::string name = desc.substr(0, desc.find(marker, 0));
+ LLStringUtil::trim(name);
+
+ // if name extracted and name cache contains avatar id send loggable notification
+ LLUUID from_id;
+ if(name.size() > 0 && gCacheName->getUUID(name, from_id))
+ {
+ args["NAME"] = name;
+ LLSD payload;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("PaymentRecived", args, payload);
+ }
+ else
+ {
+ LLNotificationsUtil::add("SystemMessage", args);
+ }
// Once the 'recent' container gets large enough, chop some
// off the beginning.
@@ -4181,7 +4493,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
@@ -4202,18 +4514,18 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);
// we're going to throw the LLSD in there in case anyone ever wants to use it
- LLNotifications::instance().add(notificationID+"_Notify", llsdBlock);
+ LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);
if (regionAccess == SIM_ACCESS_MATURE)
{
if (gAgent.isTeen())
{
- LLNotifications::instance().add(notificationID+"_KB", llsdBlock);
+ LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
return true;
}
else if (gAgent.prefersPG())
{
- LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
+ LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
return true;
}
}
@@ -4221,12 +4533,12 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
{
if (!gAgent.isAdult())
{
- LLNotifications::instance().add(notificationID+"_KB", llsdBlock);
+ LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
return true;
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
{
- LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
+ LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
return true;
}
}
@@ -4286,7 +4598,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
}
}
- LLNotifications::instance().add(notificationID, llsdBlock);
+ LLNotificationsUtil::add(notificationID, llsdBlock);
return true;
}
return false;
@@ -4342,7 +4654,7 @@ void process_alert_core(const std::string& message, BOOL modal)
std::string snap_filename = gDirUtilp->getLindenUserDir();
snap_filename += gDirUtilp->getDirDelimiter();
snap_filename += SCREEN_HOME_FILENAME;
- gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, FALSE);
+ gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE);
}
const std::string ALERT_PREFIX("ALERT: ");
@@ -4352,14 +4664,14 @@ void process_alert_core(const std::string& message, BOOL modal)
// Allow the server to spawn a named alert so that server alerts can be
// translated out of English.
std::string alert_name(message.substr(ALERT_PREFIX.length()));
- LLNotifications::instance().add(alert_name);
+ LLNotificationsUtil::add(alert_name);
}
else if (message.find(NOTIFY_PREFIX) == 0)
{
// Allow the server to spawn a named notification so that server notifications can be
// translated out of English.
std::string notify_name(message.substr(NOTIFY_PREFIX.length()));
- LLNotifications::instance().add(notify_name);
+ LLNotificationsUtil::add(notify_name);
}
else if (message[0] == '/')
{
@@ -4371,20 +4683,20 @@ void process_alert_core(const std::string& message, BOOL modal)
S32 mins = 0;
LLStringUtil::convertToS32(text.substr(18), mins);
args["MINUTES"] = llformat("%d",mins);
- LLNotifications::instance().add("RegionRestartMinutes", args);
+ LLNotificationsUtil::add("RegionRestartMinutes", args);
}
else if (text.substr(0,17) == "RESTART_X_SECONDS")
{
S32 secs = 0;
LLStringUtil::convertToS32(text.substr(18), secs);
args["SECONDS"] = llformat("%d",secs);
- LLNotifications::instance().add("RegionRestartSeconds", args);
+ LLNotificationsUtil::add("RegionRestartSeconds", args);
}
else
{
std::string new_msg =LLNotifications::instance().getGlobalString(text);
args["MESSAGE"] = new_msg;
- LLNotifications::instance().add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessage", args);
}
}
else if (modal)
@@ -4392,14 +4704,14 @@ void process_alert_core(const std::string& message, BOOL modal)
LLSD args;
std::string new_msg =LLNotifications::instance().getGlobalString(message);
args["ERROR_MESSAGE"] = new_msg;
- LLNotifications::instance().add("ErrorMessage", args);
+ LLNotificationsUtil::add("ErrorMessage", args);
}
else
{
LLSD args;
std::string new_msg =LLNotifications::instance().getGlobalString(message);
args["MESSAGE"] = new_msg;
- LLNotifications::instance().add("SystemMessageTip", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
}
@@ -4608,14 +4920,14 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
if (caution)
{
LLChat chat(notice.getString());
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ // LLFloaterChat::addChat(chat, FALSE, FALSE);
}
}
}
bool script_question_cb(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLMessageSystem *msg = gMessageSystem;
S32 orig = notification["payload"]["questions"].asInteger();
S32 new_questions = orig;
@@ -4656,33 +4968,34 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
LLMuteList::getInstance()->add(LLMute(item_id, notification["payload"]["object_name"].asString(), LLMute::OBJECT));
// purge the message queue of any previously queued requests from the same source. DEV-4879
- class OfferMatcher : public LLNotifyBoxView::Matcher
+ class OfferMatcher : public LLNotificationsUI::LLScreenChannel::Matcher
{
public:
OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {}
- BOOL matches(const LLNotificationPtr notification) const
+ bool matches(const LLNotificationPtr notification) const
{
if (notification->getName() == "ScriptQuestionCaution"
|| notification->getName() == "ScriptQuestion")
{
return (notification->getPayload()["item_id"].asUUID() == blocked_id);
}
- return FALSE;
+ return false;
}
private:
const LLUUID& blocked_id;
};
- // should do this via the channel
- gNotifyBoxView->purgeMessagesMatching(OfferMatcher(item_id));
+
+ LLNotificationsUI::LLChannelManager::getInstance()->killToastsFromChannel(LLUUID(
+ gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(item_id));
}
if (response["Details"])
{
// respawn notification...
- LLNotifications::instance().add(notification["name"], notification["substitutions"], notification["payload"]);
+ LLNotificationsUtil::add(notification["name"], notification["substitutions"], notification["payload"]);
// ...with description on top
- LLNotifications::instance().add("DebitPermissionDetails");
+ LLNotificationsUtil::add("DebitPermissionDetails");
}
return false;
}
@@ -4779,12 +5092,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
{
// display the caution permissions prompt
- LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
+ LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
}
else
{
// fall back to default behavior if cautions are entirely disabled
- LLNotifications::instance().add("ScriptQuestion", args, payload);
+ LLNotificationsUtil::add("ScriptQuestion", args, payload);
}
}
@@ -4807,22 +5120,21 @@ void container_inventory_arrived(LLViewerObject* object,
gAgent.changeCameraToDefault();
}
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (inventory->size() > 2)
{
// create a new inventory category to put this in
LLUUID cat_id;
cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(),
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
LLTrans::getString("AcquiredItems"));
InventoryObjectList::const_iterator it = inventory->begin();
InventoryObjectList::const_iterator end = inventory->end();
for ( ; it != end; ++it)
{
- if ((*it)->getType() != LLAssetType::AT_CATEGORY &&
- (*it)->getType() != LLAssetType::AT_ROOT_CATEGORY)
+ if ((*it)->getType() != LLAssetType::AT_CATEGORY)
{
LLInventoryObject* obj = (LLInventoryObject*)(*it);
LLInventoryItem* item = (LLInventoryItem*)(obj);
@@ -4846,9 +5158,9 @@ void container_inventory_arrived(LLViewerObject* object,
}
}
gInventory.notifyObservers();
- if(view)
+ if(active_panel)
{
- view->getPanel()->setSelection(cat_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(cat_id, TAKE_FOCUS_NO);
}
}
else if (inventory->size() == 2)
@@ -4857,14 +5169,13 @@ void container_inventory_arrived(LLViewerObject* object,
// one actual object
InventoryObjectList::iterator it = inventory->begin();
- if ((*it)->getType() == LLAssetType::AT_CATEGORY ||
- (*it)->getType() == LLAssetType::AT_ROOT_CATEGORY)
+ if ((*it)->getType() == LLAssetType::AT_CATEGORY)
{
++it;
}
LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
- LLUUID category = gInventory.findCategoryUUIDForType(item->getType());
+ const LLUUID category = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
LLUUID item_id;
item_id.generate();
@@ -4883,9 +5194,9 @@ void container_inventory_arrived(LLViewerObject* object,
new_item->updateServer(TRUE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
- if(view)
+ if(active_panel)
{
- view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
}
}
@@ -4986,7 +5297,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
}
}
- LLNotifications::instance().add("CouldNotTeleportReason", args);
+ LLNotificationsUtil::add("CouldNotTeleportReason", args);
// Let the interested parties know that teleport failed.
LLViewerParcelMgr::getInstance()->onTeleportFailed();
@@ -5119,7 +5430,8 @@ void send_group_notice(const LLUUID& group_id,
bool handle_lure_callback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();
- S32 option = LLNotification::getSelectedOption(notification, response);
+ text.append("\r\n").append(LLAgentUI::buildSLURL());
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(0 == option)
{
@@ -5135,8 +5447,24 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
it != notification["payload"]["ids"].endArray();
++it)
{
+ LLUUID target_id = it->asUUID();
+
msg->nextBlockFast(_PREHASH_TargetData);
- msg->addUUIDFast(_PREHASH_TargetID, it->asUUID());
+ msg->addUUIDFast(_PREHASH_TargetID, target_id);
+
+ // Record the offer.
+ {
+ std::string target_name;
+ gCacheName->getFullName(target_id, target_name);
+ LLSD args;
+ args["TO_NAME"] = target_name;
+
+ LLSD payload;
+ payload["from_id"] = target_id;
+ payload["SESSION_NAME"] = target_name;
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("TeleportOfferSent", args, payload);
+ }
}
gAgent.sendReliableMessage();
}
@@ -5166,11 +5494,11 @@ void handle_lure(const std::vector<LLUUID>& ids)
}
if (gAgent.isGodlike())
{
- LLNotifications::instance().add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);
+ LLNotificationsUtil::add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);
}
else
{
- LLNotifications::instance().add("OfferTeleport", edit_args, payload, handle_lure_callback);
+ LLNotificationsUtil::add("OfferTeleport", edit_args, payload, handle_lure_callback);
}
}
@@ -5363,7 +5691,7 @@ std::vector<LLSD> gLoadUrlList;
bool callback_load_url(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
@@ -5408,7 +5736,7 @@ void callback_load_url_name(const LLUUID& id, const std::string& first, const st
args["OBJECTNAME"] = load_url_info["object_name"].asString();
args["NAME"] = owner_name;
- LLNotifications::instance().add("LoadWebPage", args, load_url_info);
+ LLNotificationsUtil::add("LoadWebPage", args, load_url_info);
}
else
{
@@ -5463,7 +5791,7 @@ void callback_download_complete(void** data, S32 result, LLExtStat ext_status)
std::string* filepath = (std::string*)data;
LLSD args;
args["DOWNLOAD_PATH"] = *filepath;
- LLNotifications::instance().add("FinishedRawDownload", args);
+ LLNotificationsUtil::add("FinishedRawDownload", args);
delete filepath;
}
@@ -5544,7 +5872,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
LLPanelLandCovenant::updateEstateOwnerName(owner_name);
LLFloaterBuyLand::updateEstateOwnerName(owner_name);
- LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+ LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
if (panel)
{
panel->updateEstateName(estate_name);
@@ -5678,7 +6006,7 @@ void onCovenantLoadComplete(LLVFS *vfs,
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
- LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+ LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
if (panel)
{
panel->updateCovenantText(covenant_text);
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index c15e5df675..7dd629dcfd 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -33,10 +33,12 @@
#ifndef LL_LLVIEWERMESSAGE_H
#define LL_LLVIEWERMESSAGE_H
+#include "llassettype.h"
#include "llinstantmessage.h"
#include "llpointer.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
+#include "message.h"
#include "stdenums.h"
//
@@ -47,6 +49,7 @@ class LLInventoryObject;
class LLInventoryItem;
class LLMeanCollisionData;
class LLMessageSystem;
+class LLVFS;
class LLViewerObject;
class LLViewerRegion;
@@ -59,7 +62,8 @@ enum InventoryOfferResponse
IOR_ACCEPT,
IOR_DECLINE,
IOR_MUTE,
- IOR_BUSY
+ IOR_BUSY,
+ IOR_SHOW
};
BOOL can_afford_transaction(S32 cost);
@@ -132,7 +136,6 @@ void container_inventory_arrived(LLViewerObject* object,
// agent movement
void send_complete_agent_movement(const LLHost& sim_host);
void process_agent_movement_complete(LLMessageSystem* msg, void**);
-bool server_version_changed_callback(const LLSD& notification, const LLSD& response);
void process_crossed_region(LLMessageSystem* msg, void**);
void process_teleport_start(LLMessageSystem* msg, void**);
void process_teleport_progress(LLMessageSystem* msg, void**);
@@ -198,10 +201,18 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException);
void process_initiate_download(LLMessageSystem* msg, void**);
void start_new_inventory_observer();
+void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name);
+
+// Returns true if item is not in certain "quiet" folder which don't need UI
+// notification (e.g. trash, cof, lost-and-found) and agent is not AFK, false otherwise.
+// Returns false if item is not found.
+bool highlight_offered_item(const LLUUID& item_id);
struct LLOfferInfo
{
- LLOfferInfo() {};
+ LLOfferInfo()
+ : mFromGroup(FALSE), mFromObject(FALSE),
+ mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {};
LLOfferInfo(const LLSD& sd);
void forceResponse(InventoryOfferResponse response);
@@ -219,7 +230,9 @@ struct LLOfferInfo
LLHost mHost;
LLSD asLLSD();
+ void send_auto_receive_response(void);
bool inventory_offer_callback(const LLSD& notification, const LLSD& response);
+ bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response);
};
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 801c46035a..987d23630a 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -34,8 +34,11 @@
#include "llviewerprecompiledheaders.h"
#include "llviewernetwork.h"
-#include "llviewercontrol.h"
+
#include "llevents.h"
+#include "net.h"
+
+#include "llviewercontrol.h"
#include "lllogin.h"
struct LLGridData
@@ -166,6 +169,7 @@ void LLViewerLogin::setGridChoice(EGridInfo grid)
if(grid < 0 || grid >= GRID_INFO_COUNT)
{
llerrs << "Invalid grid index specified." << llendl;
+ return;
}
if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 20cd516fa0..d0afa9d9de 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -861,6 +861,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
+ // fall through
case 60:
this_update_precision = 32;
// this is a terse update
@@ -900,6 +901,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
+ // fall through
case 32:
this_update_precision = 16;
test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
@@ -1172,6 +1174,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
+ // fall through
case 60:
// this is a terse 32 update
// pos
@@ -1211,6 +1214,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
((LLVOAvatar*)this)->setFootPlane(collision_plane);
count += sizeof(LLVector4);
+ // fall through
case 32:
// this is a terse 16 update
this_update_precision = 16;
@@ -2767,22 +2771,23 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
// I don't think there's a better way to do this without calculating distance per-poly
F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
if (range < 0.001f || isHUDAttachment()) // range == zero
{
mAppAngle = 180.f;
- mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea();
+ mPixelArea = (F32)camera->getScreenPixelArea();
}
else
{
mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
- F32 pixels_per_meter = LLViewerCamera::getInstance()->getPixelMeterRatio() / range;
+ F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
- if (mPixelArea > LLViewerCamera::getInstance()->getScreenPixelArea())
+ if (mPixelArea > camera->getScreenPixelArea())
{
mAppAngle = 180.f;
- mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea();
+ mPixelArea = (F32)camera->getScreenPixelArea();
}
}
}
@@ -2906,7 +2911,7 @@ F32 LLViewerObject::getMidScale() const
}
-void LLViewerObject::updateTextures(LLAgent &agent)
+void LLViewerObject::updateTextures()
{
}
@@ -2928,7 +2933,7 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID sculpt_id = sculpt_params->getSculptTexture();
- LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+ LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
}
if (boost_children)
@@ -3691,7 +3696,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
// if (mDrawable.notNull() && mDrawable->isVisible())
// {
const LLUUID& image_id = getTE(te)->getID();
- mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
// }
}
@@ -3717,7 +3722,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos
uuid == LLUUID::null)
{
retval = LLPrimitive::setTETexture(te, uuid);
- mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+ mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
setChanged(TEXTURE);
if (mDrawable.notNull())
{
@@ -4014,9 +4019,14 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
{
LLVector3 position_agent;
LLQuaternion rot;
+ LLViewerObject* avatar_parent = NULL;
LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
- LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent();
- if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull())
+ if (root_edit)
+ {
+ avatar_parent = (LLViewerObject*)root_edit->getParent();
+ }
+
+ if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull())
{
LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index b8ae31118c..266c40d493 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -199,7 +199,7 @@ public:
S32 getNumFaces() const { return mNumFaces; }
// Graphical stuff for objects - maybe broken out into render class later?
- virtual void updateTextures(LLAgent &agent);
+ virtual void updateTextures();
virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object
virtual LLDrawable* createDrawable(LLPipeline *pipeline);
@@ -457,6 +457,7 @@ public:
inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
+ inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
bool getIncludeInSearch() const;
void setIncludeInSearch(bool include_in_search);
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 2927ca5292..96828ee1b6 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -642,7 +642,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
// Update distance & gpw
objectp->setPixelAreaAndAngle(agent); // Also sets the approx. pixel area
- objectp->updateTextures(agent); // Update the image levels of textures for this object.
+ objectp->updateTextures(); // Update the image levels of textures for this object.
}
}
@@ -1074,6 +1074,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
LLColor4 group_own_below_water_color =
LLUIColorTable::instance().getColor( "NetMapGroupOwnBelowWater" );
+ F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius");
for (S32 i = 0; i < mMapObjects.count(); i++)
{
@@ -1089,6 +1090,11 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
F32 approx_radius = (scale.mV[VX] + scale.mV[VY]) * 0.5f * 0.5f * 1.3f; // 1.3 is a fudge
+ // Limit the size of megaprims so they don't blot out everything on the minimap.
+ // Attempting to draw very large megaprims also causes client lag.
+ // See DEV-17370 and DEV-29869/SNOW-79 for details.
+ approx_radius = llmin(approx_radius, max_radius);
+
LLColor4U color = above_water_color;
if( objectp->permYouOwner() )
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ace5c5038e..2858081dc9 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -233,6 +233,10 @@ public:
extern LLViewerObjectList gObjectList;
// Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id
+ */
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
{
std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 6233a337a6..2c5c0a37e8 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -34,6 +34,7 @@
#include "llviewerparcelmedia.h"
#include "llagent.h"
+#include "llaudioengine.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
#include "llviewerregion.h"
@@ -43,8 +44,8 @@
#include "message.h"
#include "llviewermediafocus.h"
#include "llviewerparcelmediaautoplay.h"
-#include "llnotifications.h"
-#include "llfirstuse.h"
+#include "llnotificationsutil.h"
+//#include "llfirstuse.h"
#include "llpluginclassmedia.h"
#include "llviewertexture.h"
@@ -55,10 +56,6 @@ LLUUID LLViewerParcelMedia::sMediaRegionID;
viewer_media_t LLViewerParcelMedia::sMediaImpl;
-// Local functions
-bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel);
-
-
// static
void LLViewerParcelMedia::initClass()
{
@@ -108,15 +105,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
std::string mediaUrl = std::string ( parcel->getMediaURL () );
std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());
- // First use warning
- if( ! mediaUrl.empty() && gWarningSettings.getBOOL("FirstStreamingVideo") )
- {
- LLNotifications::instance().add("ParcelCanPlayMedia", LLSD(), LLSD(),
- boost::bind(callback_play_media, _1, _2, parcel));
- return;
-
- }
-
// if we have a current (link sharing) url, use it instead
if (mediaCurrentUrl != "" && parcel->getMediaType() == "text/html")
{
@@ -167,7 +155,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
{
gWarningSettings.setBOOL("QuickTimeInstalled", FALSE);
- LLNotifications::instance().add("NoQuickTime" );
+ LLNotificationsUtil::add("NoQuickTime" );
};
}
}
@@ -182,7 +170,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
if (!parcel) return;
- if (!gSavedSettings.getBOOL("AudioSteamingMedia") || !gSavedSettings.getBOOL("AudioStreamingVideo"))
+ if (!gSavedSettings.getBOOL("AudioStreamingMedia"))
return;
std::string media_url = parcel->getMediaURL();
@@ -215,21 +203,15 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
else
{
// Since the texture id is different, we need to generate a new impl
- LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
// Delete the old one first so they don't fight over the texture.
- sMediaImpl->stop();
-
- sMediaImpl = LLViewerMedia::newMediaImpl(
- placeholder_texture_id,
- media_width,
- media_height,
- media_auto_scale,
- media_loop);
- sMediaImpl->navigateTo(media_url, mime_type, true);
+ sMediaImpl = NULL;
+
+ // A new impl will be created below.
}
}
- else
+
+ if(!sMediaImpl)
{
LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
@@ -240,10 +222,11 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
media_height,
media_auto_scale,
media_loop);
+ sMediaImpl->setIsParcelMedia(true);
sMediaImpl->navigateTo(media_url, mime_type, true);
}
- LLFirstUse::useMedia();
+ //LLFirstUse::useMedia();
LLViewerParcelMediaAutoPlay::playStarted();
}
@@ -259,8 +242,7 @@ void LLViewerParcelMedia::stop()
// We need to remove the media HUD if it is up.
LLViewerMediaFocus::getInstance()->clearFocus();
- // This will kill the media instance.
- sMediaImpl->stop();
+ // This will unload & kill the media instance.
sMediaImpl = NULL;
}
@@ -283,7 +265,7 @@ void LLViewerParcelMedia::start()
}
sMediaImpl->start();
- LLFirstUse::useMedia();
+ //LLFirstUse::useMedia();
LLViewerParcelMediaAutoPlay::playStarted();
}
@@ -322,10 +304,36 @@ std::string LLViewerParcelMedia::getMimeType()
{
return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";
}
+
+//static
+std::string LLViewerParcelMedia::getURL()
+{
+ std::string url;
+ if(sMediaImpl.notNull())
+ url = sMediaImpl->getMediaURL();
+
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
+
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+
+ return url;
+}
+
+//static
+std::string LLViewerParcelMedia::getName()
+{
+ if(sMediaImpl.notNull())
+ return sMediaImpl->getName();
+ return "";
+}
+
viewer_media_t LLViewerParcelMedia::getParcelMedia()
{
return sMediaImpl;
}
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
@@ -561,24 +569,6 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
};
}
-bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel)
-{
- S32 option = LLNotification::getSelectedOption(notification, response);
- if (option == 0)
- {
- gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
- if(!gSavedSettings.getBOOL("AudioSteamingMedia"))
- gSavedSettings.setBOOL("AudioSteamingMedia", TRUE);
- LLViewerParcelMedia::play(parcel);
- }
- else
- {
- gSavedSettings.setBOOL("AudioStreamingVideo", FALSE);
- }
- gWarningSettings.setBOOL("FirstStreamingVideo", FALSE);
- return false;
-}
-
// TODO: observer
/*
void LLViewerParcelMediaNavigationObserver::onNavigateComplete( const EventType& event_in )
diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h
index 3f7f898356..19e1ef78d4 100644
--- a/indra/newview/llviewerparcelmedia.h
+++ b/indra/newview/llviewerparcelmedia.h
@@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
static LLPluginClassMediaOwner::EMediaStatus getStatus();
static std::string getMimeType();
+ static std::string getURL();
+ static std::string getName();
static viewer_media_t getParcelMedia();
static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index 1b79b47905..ad2723b66b 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -35,6 +35,7 @@
#include "llviewerparcelmedia.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
+#include "llviewerregion.h"
#include "llparcel.h"
#include "llviewerparcelmgr.h"
#include "lluuid.h"
@@ -48,6 +49,8 @@ const F32 AUTOPLAY_SPEED = 0.1f; // how slow should the agent be moving t
LLViewerParcelMediaAutoPlay::LLViewerParcelMediaAutoPlay() :
LLEventTimer(1),
+
+ mLastParcelID(-1),
mPlayed(FALSE),
mTimeInParcel(0)
{
@@ -81,9 +84,18 @@ void LLViewerParcelMediaAutoPlay::playStarted()
BOOL LLViewerParcelMediaAutoPlay::tick()
{
LLParcel *this_parcel = NULL;
+ LLViewerRegion *this_region = NULL;
std::string this_media_url;
LLUUID this_media_texture_id;
S32 this_parcel_id = 0;
+ LLUUID this_region_id;
+
+ this_region = gAgent.getRegion();
+
+ if (this_region)
+ {
+ this_region_id = this_region->getRegionID();
+ }
this_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
@@ -96,12 +108,14 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
this_parcel_id = this_parcel->getLocalID();
}
- if (this_parcel_id != mLastParcelID)
+ if (this_parcel_id != mLastParcelID ||
+ this_region_id != mLastRegionID)
{
// we've entered a new parcel
mPlayed = FALSE; // we haven't autoplayed yet
mTimeInParcel = 0; // reset our timer
mLastParcelID = this_parcel_id;
+ mLastRegionID = this_region_id;
}
mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 16279e7f1f..40142c1dd1 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -33,7 +33,8 @@
#ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H
#define LLVIEWERPARCELMEDIAAUTOPLAY_H
-#include "lltimer.h"
+#include "lleventtimer.h"
+#include "lluuid.h"
// timer to automatically play media
class LLViewerParcelMediaAutoPlay : LLEventTimer
@@ -47,6 +48,7 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer
private:
S32 mLastParcelID;
+ LLUUID mLastRegionID;
BOOL mPlayed;
F32 mTimeInParcel;
};
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index aa0987aa7d..1f6bbcbae8 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -39,20 +39,23 @@
#include "indra_constants.h"
#include "llcachename.h"
#include "llgl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llsecondlifeurls.h"
#include "message.h"
+#include "llfloaterreg.h"
// Viewer includes
#include "llagent.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llfloaterbuyland.h"
#include "llfloatergroups.h"
+#include "llpanelnearbymedia.h"
#include "llfloatersellland.h"
#include "llfloatertools.h"
-#include "llnotify.h"
#include "llparcelselection.h"
#include "llresmgr.h"
#include "llsdutil.h"
@@ -66,7 +69,6 @@
#include "llviewerparceloverlay.h"
#include "llviewerregion.h"
#include "llworld.h"
-#include "lloverlaybar.h"
#include "roles_constants.h"
#include "llweb.h"
@@ -520,7 +522,7 @@ LLParcelSelectionHandle LLViewerParcelMgr::selectLand(const LLVector3d &corner1,
if (region != region_other)
{
- LLNotifications::instance().add("CantSelectLandFromMultipleRegions");
+ LLNotificationsUtil::add("CantSelectLandFromMultipleRegions");
mSelected = FALSE;
notifyObservers();
return NULL;
@@ -650,7 +652,7 @@ LLParcel *LLViewerParcelMgr::getAgentParcel() const
}
// Return whether the agent can build on the land they are on
-bool LLViewerParcelMgr::agentCanBuild() const
+bool LLViewerParcelMgr::allowAgentBuild() const
{
if (mAgentParcel)
{
@@ -664,19 +666,53 @@ bool LLViewerParcelMgr::agentCanBuild() const
}
}
-BOOL LLViewerParcelMgr::agentCanTakeDamage() const
+// Return whether anyone can build on the given parcel
+bool LLViewerParcelMgr::allowAgentBuild(const LLParcel* parcel) const
{
- return mAgentParcel->getAllowDamage();
+ return parcel->getAllowModify();
}
-BOOL LLViewerParcelMgr::agentCanFly() const
+bool LLViewerParcelMgr::allowAgentVoice() const
{
- return TRUE;
+ return allowAgentVoice(gAgent.getRegion(), mAgentParcel);
}
-F32 LLViewerParcelMgr::agentDrawDistance() const
+bool LLViewerParcelMgr::allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const
{
- return 512.f;
+ return region && region->isVoiceEnabled()
+ && parcel && parcel->getParcelFlagAllowVoice();
+}
+
+bool LLViewerParcelMgr::allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const
+{
+ return region && !region->getBlockFly()
+ && parcel && parcel->getAllowFly();
+}
+
+// Can the agent be pushed around by LLPushObject?
+bool LLViewerParcelMgr::allowAgentPush(const LLViewerRegion* region, const LLParcel* parcel) const
+{
+ return region && !region->getRestrictPushObject()
+ && parcel && !parcel->getRestrictPushObject();
+}
+
+bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LLParcel* parcel) const
+{
+ // *NOTE: This code does not take into account group-owned parcels
+ // and the flag to allow group-owned scripted objects to run.
+ // This mirrors the traditional menu bar parcel icon code, but is not
+ // technically correct.
+ return region
+ && !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+ && !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+ && parcel
+ && parcel->getAllowOtherScripts();
+}
+
+bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const
+{
+ return (region && region->getAllowDamage())
+ || (parcel && parcel->getAllowDamage());
}
BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const
@@ -915,7 +951,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotSetLandOwnerNothingSelected");
+ LLNotificationsUtil::add("CannotSetLandOwnerNothingSelected");
return;
}
@@ -930,7 +966,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
if (!region)
{
// TODO: Add a force owner version of this alert.
- LLNotifications::instance().add("CannotContentifyNoRegion");
+ LLNotificationsUtil::add("CannotContentifyNoRegion");
return;
}
@@ -938,7 +974,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
LLViewerRegion *region2 = LLWorld::getInstance()->getRegionFromPosGlobal( east_north_region_check );
if (region != region2)
{
- LLNotifications::instance().add("CannotSetLandOwnerMultipleRegions");
+ LLNotificationsUtil::add("CannotSetLandOwnerMultipleRegions");
return;
}
@@ -963,7 +999,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
bool callback_god_force_owner(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(0 == option)
{
LLMessageSystem* msg = gMessageSystem;
@@ -983,13 +1019,13 @@ void LLViewerParcelMgr::sendParcelGodForceToContent()
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotContentifyNothingSelected");
+ LLNotificationsUtil::add("CannotContentifyNothingSelected");
return;
}
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
if (!region)
{
- LLNotifications::instance().add("CannotContentifyNoRegion");
+ LLNotificationsUtil::add("CannotContentifyNoRegion");
return;
}
@@ -1007,14 +1043,14 @@ void LLViewerParcelMgr::sendParcelRelease()
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotReleaseLandNothingSelected");
+ LLNotificationsUtil::add("CannotReleaseLandNothingSelected");
return;
}
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
if (!region)
{
- LLNotifications::instance().add("CannotReleaseLandNoRegion");
+ LLNotificationsUtil::add("CannotReleaseLandNoRegion");
return;
}
@@ -1069,14 +1105,14 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
{
if (!mSelected || !mCurrentParcel)
{
- LLNotifications::instance().add("CannotBuyLandNothingSelected");
+ LLNotificationsUtil::add("CannotBuyLandNothingSelected");
return NULL;
}
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
if (!region)
{
- LLNotifications::instance().add("CannotBuyLandNoRegion");
+ LLNotificationsUtil::add("CannotBuyLandNoRegion");
return NULL;
}
@@ -1094,7 +1130,7 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
if (region != region2)
{
- LLNotifications::instance().add("CantBuyLandAcrossMultipleRegions");
+ LLNotificationsUtil::add("CantBuyLandAcrossMultipleRegions");
return NULL;
}
}
@@ -1176,18 +1212,18 @@ void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id)
{
if (!mSelected || !mCurrentParcel)
{
- LLNotifications::instance().add("CannotDeedLandNothingSelected");
+ LLNotificationsUtil::add("CannotDeedLandNothingSelected");
return;
}
if(group_id.isNull())
{
- LLNotifications::instance().add("CannotDeedLandNoGroup");
+ LLNotificationsUtil::add("CannotDeedLandNoGroup");
return;
}
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
if (!region)
{
- LLNotifications::instance().add("CannotDeedLandNoRegion");
+ LLNotificationsUtil::add("CannotDeedLandNoRegion");
return;
}
@@ -1289,14 +1325,37 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag
void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
{
- //FIXME: only request parcel info when tooltip is shown
- return;
- /*LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );
+ static U32 last_west, last_south;
+
+
+ // only request parcel info when tooltip is shown
+ if (!gSavedSettings.getBOOL("ShowLandHoverTip"))
+ {
+ return;
+ }
+
+ // only request parcel info if position has changed outside of the
+ // last parcel grid step
+ U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS );
+ U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS );
+
+ if ((west_parcel_step == last_west) && (south_parcel_step == last_south))
+ {
+ return;
+ }
+ else
+ {
+ last_west = west_parcel_step;
+ last_south = south_parcel_step;
+ }
+
+ LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos );
if (!region)
{
return;
}
+
// Send a rectangle around the point.
// This means the parcel sent back is at least a rectangle around the point,
// which is more efficient for public land. Fewer requests are sent. JC
@@ -1323,7 +1382,7 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
msg->addBOOL("SnapSelection", FALSE );
msg->sendReliable( region->getHost() );
- mHoverRequestResult = PARCEL_RESULT_NO_DATA;*/
+ mHoverRequestResult = PARCEL_RESULT_NO_DATA;
}
@@ -1703,10 +1762,16 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
optionally_start_music(music_url);
}
+ else
+ {
+ llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+ // clears the URL
+ gAudiop->startInternetStream(LLStringUtil::null);
+ }
}
else if (!gAudiop->getInternetStreamURL().empty())
{
- llinfos << "Stopping parcel music" << llendl;
+ llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
gAudiop->startInternetStream(LLStringUtil::null);
}
}
@@ -1725,15 +1790,20 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
void optionally_start_music(const std::string& music_url)
{
- if (gSavedSettings.getBOOL("AudioStreamingMusic") && gSavedSettings.getBOOL("AudioSteamingMedia"))
- {
- // Make the user click the start button on the overlay bar. JC
- // llinfos << "Starting parcel music " << music_url << llendl;
-
- // now only play music when you enter a new parcel if the control is in PLAY state
- // changed as part of SL-4878
- if ( gOverlayBar && gOverlayBar->musicPlaying())
+ if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+ gSavedSettings.getBOOL("AudioStreamingMedia"))
+ {
+ // only play music when you enter a new parcel if the UI control for this
+ // was not *explicitly* stopped by the user. (part of SL-4878)
+ LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();;
+ if ((nearby_media_panel &&
+ nearby_media_panel->getParcelAudioAutoStart()) ||
+ // or they have expressed no opinion in the UI, but have autoplay on...
+ (!nearby_media_panel &&
+ gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
{
+ llinfos << "Starting parcel music " << music_url << llendl;
gAudiop->startInternetStream(music_url);
}
}
@@ -1757,7 +1827,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void
if (parcel_id != parcel->getLocalID())
{
- llwarns << "processParcelAccessListReply for parcel " << parcel_id
+ LL_WARNS_ONCE("") << "processParcelAccessListReply for parcel " << parcel_id
<< " which isn't the selected parcel " << parcel->getLocalID()<< llendl;
return;
}
@@ -2009,18 +2079,18 @@ void LLViewerParcelMgr::deedLandToGroup()
gCacheName->getName(mCurrentParcel->getOwnerID(), first_name, last_name);
args["FIRST_NAME"] = first_name;
args["LAST_NAME"] = last_name;
- LLNotifications::instance().add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB);
+ LLNotificationsUtil::add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB);
}
else
{
- LLNotifications::instance().add("DeedLandToGroup",args, LLSD(), deedAlertCB);
+ LLNotificationsUtil::add("DeedLandToGroup",args, LLSD(), deedAlertCB);
}
}
// static
bool LLViewerParcelMgr::deedAlertCB(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
@@ -2039,26 +2109,26 @@ void LLViewerParcelMgr::startReleaseLand()
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotReleaseLandNothingSelected");
+ LLNotificationsUtil::add("CannotReleaseLandNothingSelected");
return;
}
if (mRequestResult == PARCEL_RESULT_NO_DATA)
{
- LLNotifications::instance().add("CannotReleaseLandWatingForServer");
+ LLNotificationsUtil::add("CannotReleaseLandWatingForServer");
return;
}
if (mRequestResult == PARCEL_RESULT_MULTIPLE)
{
- LLNotifications::instance().add("CannotReleaseLandSelected");
+ LLNotificationsUtil::add("CannotReleaseLandSelected");
return;
}
if (!isParcelOwnedByAgent(mCurrentParcel, GP_LAND_RELEASE)
&& !(gAgent.canManageEstate()))
{
- LLNotifications::instance().add("CannotReleaseLandDontOwn");
+ LLNotificationsUtil::add("CannotReleaseLandDontOwn");
return;
}
@@ -2066,7 +2136,7 @@ void LLViewerParcelMgr::startReleaseLand()
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
if (!region)
{
- LLNotifications::instance().add("CannotReleaseLandRegionNotFound");
+ LLNotificationsUtil::add("CannotReleaseLandRegionNotFound");
return;
}
/*
@@ -2075,21 +2145,21 @@ void LLViewerParcelMgr::startReleaseLand()
{
LLSD args;
args["REGION"] = region->getName();
- LLNotifications::instance().add("CannotReleaseLandNoTransfer", args);
+ LLNotificationsUtil::add("CannotReleaseLandNoTransfer", args);
return;
}
*/
if (!mCurrentParcelSelection->mWholeParcelSelected)
{
- LLNotifications::instance().add("CannotReleaseLandPartialSelection");
+ LLNotificationsUtil::add("CannotReleaseLandPartialSelection");
return;
}
// Compute claim price
LLSD args;
args["AREA"] = llformat("%d",mCurrentParcel->getArea());
- LLNotifications::instance().add("ReleaseLandWarning", args, LLSD(), releaseAlertCB);
+ LLNotificationsUtil::add("ReleaseLandWarning", args, LLSD(), releaseAlertCB);
}
bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
@@ -2164,13 +2234,13 @@ void LLViewerParcelMgr::startDivideLand()
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotDivideLandNothingSelected");
+ LLNotificationsUtil::add("CannotDivideLandNothingSelected");
return;
}
if (mCurrentParcelSelection->mWholeParcelSelected)
{
- LLNotifications::instance().add("CannotDivideLandPartialSelection");
+ LLNotificationsUtil::add("CannotDivideLandPartialSelection");
return;
}
@@ -2178,13 +2248,13 @@ void LLViewerParcelMgr::startDivideLand()
payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);
payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth);
- LLNotifications::instance().add("LandDivideWarning", LLSD(), payload, callbackDivideLand);
+ LLNotificationsUtil::add("LandDivideWarning", LLSD(), payload, callbackDivideLand);
}
// static
bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);
LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);
LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0;
@@ -2192,7 +2262,7 @@ bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD&
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
if (!region)
{
- LLNotifications::instance().add("CannotDivideLandNoRegion");
+ LLNotificationsUtil::add("CannotDivideLandNoRegion");
return false;
}
@@ -2221,19 +2291,19 @@ void LLViewerParcelMgr::startJoinLand()
{
if (!mSelected)
{
- LLNotifications::instance().add("CannotJoinLandNothingSelected");
+ LLNotificationsUtil::add("CannotJoinLandNothingSelected");
return;
}
if (mCurrentParcelSelection->mWholeParcelSelected)
{
- LLNotifications::instance().add("CannotJoinLandEntireParcelSelected");
+ LLNotificationsUtil::add("CannotJoinLandEntireParcelSelected");
return;
}
if (!mCurrentParcelSelection->mSelectedMultipleOwners)
{
- LLNotifications::instance().add("CannotJoinLandSelection");
+ LLNotificationsUtil::add("CannotJoinLandSelection");
return;
}
@@ -2241,13 +2311,13 @@ void LLViewerParcelMgr::startJoinLand()
payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);
payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth);
- LLNotifications::instance().add("JoinLandWarning", LLSD(), payload, callbackJoinLand);
+ LLNotificationsUtil::add("JoinLandWarning", LLSD(), payload, callbackJoinLand);
}
// static
bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);
LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);
LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0;
@@ -2255,7 +2325,7 @@ bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& r
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
if (!region)
{
- LLNotifications::instance().add("CannotJoinLandNoRegion");
+ LLNotificationsUtil::add("CannotJoinLandNoRegion");
return false;
}
@@ -2284,19 +2354,19 @@ void LLViewerParcelMgr::startDeedLandToGroup()
{
if (!mSelected || !mCurrentParcel)
{
- LLNotifications::instance().add("CannotDeedLandNothingSelected");
+ LLNotificationsUtil::add("CannotDeedLandNothingSelected");
return;
}
if (mRequestResult == PARCEL_RESULT_NO_DATA)
{
- LLNotifications::instance().add("CannotDeedLandWaitingForServer");
+ LLNotificationsUtil::add("CannotDeedLandWaitingForServer");
return;
}
if (mRequestResult == PARCEL_RESULT_MULTIPLE)
{
- LLNotifications::instance().add("CannotDeedLandMultipleSelected");
+ LLNotificationsUtil::add("CannotDeedLandMultipleSelected");
return;
}
@@ -2304,7 +2374,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
if (!region)
{
- LLNotifications::instance().add("CannotDeedLandNoRegion");
+ LLNotificationsUtil::add("CannotDeedLandNoRegion");
return;
}
@@ -2316,7 +2386,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()
{
LLSD args;
args["REGION"] = region->getName();
- LLNotifications::instance().add("CannotDeedLandNoTransfer", args);
+ LLNotificationsUtil::add("CannotDeedLandNoTransfer", args);
return;
}
}
@@ -2346,7 +2416,7 @@ void LLViewerParcelMgr::reclaimParcel()
// static
bool LLViewerParcelMgr::releaseAlertCB(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
{
// Send the release message, not a force
@@ -2495,7 +2565,8 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_
*/
void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos)
{
- if (local)
+ // Treat only teleports within the same parcel as local (EXT-3139).
+ if (local && LLViewerParcelMgr::getInstance()->inAgentParcel(new_pos))
{
// Local teleport. We already have the agent parcel data.
// Emit the signal immediately.
@@ -2503,7 +2574,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
}
else
{
- // Non-local teleport.
+ // Non-local teleport (inter-region or between different parcels of the same region).
// The agent parcel data has not been updated yet.
// Let's wait for the update and then emit the signal.
mTeleportInProgress = TRUE;
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 1c8fe23dba..98be8e2c7b 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -56,9 +56,6 @@ class LLViewerRegion;
// | EAST_MASK
// | WEST_MASK);
-const F32 PARCEL_POST_HEIGHT = 0.666f;
-//const F32 PARCEL_POST_HEIGHT = 20.f;
-
// Specify the type of land transfer taking place
//enum ELandTransferType
//{
@@ -171,10 +168,31 @@ public:
LLParcel* getCollisionParcel() const;
- BOOL agentCanTakeDamage() const;
- BOOL agentCanFly() const;
- F32 agentDrawDistance() const;
- bool agentCanBuild() const;
+ // Can this agent build on the parcel he is on?
+ // Used for parcel property icons in nav bar.
+ bool allowAgentBuild() const;
+ bool allowAgentBuild(const LLParcel* parcel) const;
+
+ // Can this agent speak on the parcel he is on?
+ // Used for parcel property icons in nav bar.
+ bool allowAgentVoice() const;
+ bool allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const;
+
+ // Can this agent start flying on this parcel?
+ // Used for parcel property icons in nav bar.
+ bool allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const;
+
+ // Can this agent be pushed by llPushObject() on this parcel?
+ // Used for parcel property icons in nav bar.
+ bool allowAgentPush(const LLViewerRegion* region, const LLParcel* parcel) const;
+
+ // Can scripts written by non-parcel-owners run on the agent's current
+ // parcel? Used for parcel property icons in nav bar.
+ bool allowAgentScripts(const LLViewerRegion* region, const LLParcel* parcel) const;
+
+ // Can the agent be damaged here?
+ // Used for parcel property icons in nav bar.
+ bool allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const;
F32 getHoverParcelWidth() const
{ return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); }
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 9896adad97..9de1ef7190 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -808,6 +808,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
S32 drawn = 0;
F32* vertexp;
U8* colorp;
+ bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
const F32 PROPERTY_LINE_CLIP_DIST = 256.f;
@@ -849,7 +850,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
gGL.end();
- if (LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"))
+ if (render_hidden)
{
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index cfb8340462..6b480ccf8e 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -71,9 +71,9 @@ const F32 LLViewerPartSim::PART_ADAPT_RATE_MULT_RECIP = 1.0f/PART_ADAPT_RATE_MUL
U32 LLViewerPart::sNextPartID = 1;
-F32 calc_desired_size(LLVector3 pos, LLVector2 scale)
+F32 calc_desired_size(LLViewerCamera* camera, LLVector3 pos, LLVector2 scale)
{
- F32 desired_size = (pos-LLViewerCamera::getInstance()->getOrigin()).magVec();
+ F32 desired_size = (pos - camera->getOrigin()).magVec();
desired_size /= 4;
return llclamp(desired_size, scale.magVec()*0.5f, PART_SIM_BOX_SIDE*2);
}
@@ -81,6 +81,7 @@ F32 calc_desired_size(LLVector3 pos, LLVector2 scale)
LLViewerPart::LLViewerPart() :
mPartID(0),
mLastUpdateTime(0.f),
+ mSkipOffset(0.f),
mVPCallback(NULL),
mImagep(NULL)
{
@@ -273,6 +274,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
LLViewerPartSim::checkParticleCount(mParticles.size());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
LLViewerRegion *regionp = getRegion();
S32 end = (S32) mParticles.size();
for (S32 i = 0 ; i < (S32)mParticles.size();)
@@ -394,7 +396,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
}
else
{
- F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale);
if (!posInGroup(part->mPosAgent, desired_size))
{
// Transfer particles between groups
@@ -557,7 +559,8 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
}
else
{
- F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale);
S32 count = (S32) mViewerPartGroups.size();
for (S32 i = 0; i < count; i++)
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index bb317aeb5f..50f905416c 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -41,17 +41,6 @@
#include "linden_common.h"
-// We may want to take the windows.h include out, but it used to be in
-// linden_common.h, and hence in all the libraries. This is better. JC
-#if LL_WINDOWS
- // Limit Windows API to small and manageable set.
- // If you get undefined symbols, find the appropriate
- // Windows header file and include that in your .cpp file.
- #define WIN32_LEAN_AND_MEAN
- #include <winsock2.h>
- #include <windows.h>
-#endif
-
// Work around stupid Microsoft STL warning
#ifdef LL_WINDOWS
#pragma warning (disable : 4702) // warning C4702: unreachable code
@@ -76,21 +65,14 @@
//#include "llpreprocessor.h"
#include "llallocator.h"
#include "llapp.h"
-#include "llapr.h"
#include "llcriticaldamp.h"
-//#include "lldarray.h"
-//#include "lldarrayptr.h"
#include "lldefs.h"
#include "lldepthstack.h"
-//#include "lldqueueptr.h"
-#include "llendianswizzle.h"
#include "llerror.h"
#include "llfasttimer.h"
#include "llframetimer.h"
#include "llhash.h"
#include "lllocalidhashmap.h"
-#include "llmap.h"
-//#include "llmemory.h"
#include "llnametable.h"
#include "llpointer.h"
#include "llpriqueuemap.h"
@@ -100,7 +82,6 @@
//#include "llsecondlifeurls.h"
#include "llsd.h"
#include "llsingleton.h"
-#include "llstack.h"
#include "llstat.h"
#include "llstl.h"
#include "llstrider.h"
@@ -109,7 +90,6 @@
#include "llthread.h"
#include "lltimer.h"
#include "lluuidhashmap.h"
-//#include "llversionviewer.h"
//#include "processor.h"
#include "stdenums.h"
#include "stdtypes.h"
@@ -118,19 +98,7 @@
#include "timing.h"
#include "u64.h"
-// Library includes from llimage
-//#include "llblockdata.h"
-#include "llimage.h"
-#include "llimagebmp.h"
-#include "llimagepng.h"
-#include "llimagej2c.h"
-#include "llimagejpeg.h"
-#include "llimagetga.h"
-#include "llmapimagetype.h"
-
// Library includes from llmath project
-//#include "camera.h"
-//#include "coordframe.h"
#include "llmath.h"
#include "llbboxlocal.h"
#include "llcamera.h"
@@ -158,79 +126,13 @@
////#include "vmath.h"
#include "xform.h"
-// Library includes from llmessage project
-//#include "llassetstorage.h"
-#include "llcachename.h"
-#include "llcircuit.h"
-#include "lldatapacker.h"
-#include "lldbstrings.h"
-#include "lldispatcher.h"
-#include "lleventflags.h"
-#include "llhost.h"
-#include "llinstantmessage.h"
-#include "llinvite.h"
-//#include "llloginflags.h"
-#include "llmail.h"
-#include "llmessagethrottle.h"
-#include "llnamevalue.h"
-#include "llpacketack.h"
-#include "llpacketbuffer.h"
-#include "llpacketring.h"
-#include "llpartdata.h"
-//#include "llqueryflags.h"
-//#include "llregionflags.h"
-#include "llregionhandle.h"
-#include "lltaskname.h"
-#include "llteleportflags.h"
-#include "llthrottle.h"
-#include "lltransfermanager.h"
-#include "lltransfersourceasset.h"
-#include "lltransfersourcefile.h"
-#include "lltransfertargetfile.h"
-#include "lltransfertargetvfile.h"
-#include "lluseroperation.h"
-#include "llvehicleparams.h"
-#include "llxfer.h"
-#include "llxfer_file.h"
-#include "llxfer_mem.h"
-#include "llxfer_vfile.h"
-#include "llxfermanager.h"
-#include "machine.h"
-#include "mean_collision_data.h"
-#include "message.h"
-#include "message_prehash.h"
-#include "net.h"
-//#include "network.h"
-#include "partsyspacket.h"
-#include "patch_code.h"
-#include "patch_dct.h"
-#include "sound_ids.h"
-
-// Builds work with all headers below commented out as of 2009-09-10 JC
-
-// Library includes from llprimitive
-#include "imageids.h"
-#include "legacy_object_types.h"
-#include "llmaterialtable.h"
-//#include "llprimitive.h"
-#include "lltextureanim.h"
-//#include "lltextureentry.h"
-#include "lltreeparams.h"
-//#include "llvolume.h"
-#include "llvolumemgr.h"
-#include "material_codes.h"
-
// Library includes from llvfs
-#include "llassettype.h"
#include "lldir.h"
-//#include "lldir_linux.h"
-//#include "lldir_mac.h"
-//#include "lldir_win32.h"
-#include "llvfile.h"
-#include "llvfs.h"
-// Library includes from llui
-// In skinning-7, llui.h dependencies are changing too often.
-//#include "llui.h"
+// Library includes from llmessage project
+#include "llcachename.h"
+
+// llxuixml
+#include "llinitparam.h"
#endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 7ea55b49e8..77d2d493bd 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1421,19 +1421,22 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
setCapability("Seed", url);
LLSD capabilityNames = LLSD::emptyArray();
+
+ capabilityNames.append("AttachmentResources");
capabilityNames.append("ChatSessionRequest");
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
capabilityNames.append("FetchInventory");
- capabilityNames.append("WebFetchInventoryDescendents");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
capabilityNames.append("FetchLib");
capabilityNames.append("FetchLibDescendents");
+ capabilityNames.append("GetTexture");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
+ capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
capabilityNames.append("NewFileAgentInventory");
@@ -1452,6 +1455,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("SendUserReportWithScreenshot");
capabilityNames.append("ServerReleaseNotes");
capabilityNames.append("StartGroupProposal");
+ capabilityNames.append("TextureStats");
capabilityNames.append("UntrustedSimulatorMessage");
capabilityNames.append("UpdateAgentInformation");
capabilityNames.append("UpdateAgentLanguage");
@@ -1464,6 +1468,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("UploadBakedTexture");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
+ capabilityNames.append("WebFetchInventoryDescendents");
// Please add new capabilities alphabetically to reduce
// merge conflicts.
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 6dc9f5c465..86b1a8c910 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -135,7 +135,8 @@ LLGLSLShader gLuminanceGatherProgram;
GLint gAvatarMatrixParam;
LLViewerShaderMgr::LLViewerShaderMgr() :
- mVertexShaderLevel(SHADER_COUNT, 0)
+ mVertexShaderLevel(SHADER_COUNT, 0),
+ mMaxAvatarShaderLevel(0)
{
/// Make sure WL Sky is the first program
mShaderList.push_back(&gWLSkyProgram);
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 6e07d8f246..8059f866ba 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -39,6 +39,7 @@
#include "llfloaterreg.h"
#include "llmemory.h"
#include "lltimer.h"
+#include "llvfile.h"
#include "llappviewer.h"
@@ -560,12 +561,18 @@ extern U32 gVisCompared;
extern U32 gVisTested;
std::map<S32,LLFrameTimer> gDebugTimers;
+std::map<S32,std::string> gDebugTimerLabel;
+
+void init_statistics()
+{
+ // Label debug timers
+ gDebugTimerLabel[0] = "Texture";
+}
void update_statistics(U32 frame_count)
{
gTotalWorldBytes += gVLManager.getTotalBytes();
gTotalObjectBytes += gObjectBits / 8;
- gTotalTextureBytes += gTextureList.mTextureBits / 8;
// make sure we have a valid time delta for this frame
if (gFrameIntervalSeconds > 0.f)
@@ -617,7 +624,6 @@ void update_statistics(U32 frame_count)
F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
LLViewerStats::getInstance()->mLayersKBitStat.addValue(layer_bits/1024.f);
LLViewerStats::getInstance()->mObjectKBitStat.addValue(gObjectBits/1024.f);
- LLViewerStats::getInstance()->mTextureKBitStat.addValue(gTextureList.mTextureBits/1024.f);
LLViewerStats::getInstance()->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
LLViewerStats::getInstance()->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
@@ -631,8 +637,6 @@ void update_statistics(U32 frame_count)
gDebugTimers[0].unpause();
}
- LLViewerStats::getInstance()->mTexturePacketsStat.addValue(gTextureList.mTexturePackets);
-
{
static F32 visible_avatar_frames = 0.f;
static F32 avg_visible_avatars = 0;
@@ -652,8 +656,20 @@ void update_statistics(U32 frame_count)
gObjectBits = 0;
// gDecodedBits = 0;
- gTextureList.mTextureBits = 0;
- gTextureList.mTexturePackets = 0;
+ // Only update texture stats periodically so that they are less noisy
+ {
+ static const F32 texture_stats_freq = 10.f;
+ static LLFrameTimer texture_stats_timer;
+ if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq)
+ {
+ LLViewerStats::getInstance()->mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f);
+ LLViewerStats::getInstance()->mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets);
+ gTotalTextureBytes += LLViewerTextureList::sTextureBits / 8;
+ LLViewerTextureList::sTextureBits = 0;
+ LLViewerTextureList::sTexturePackets = 0;
+ texture_stats_timer.reset();
+ }
+ }
}
@@ -807,8 +823,8 @@ void send_stats()
// Screen size so the UI team can figure out how big the widgets
// appear and use a "typical" size for end user tests.
- S32 window_width = gViewerWindow->getWindowDisplayWidth();
- S32 window_height = gViewerWindow->getWindowDisplayHeight();
+ S32 window_width = gViewerWindow->getWindowWidthRaw();
+ S32 window_height = gViewerWindow->getWindowHeightRaw();
S32 window_size = (window_width * window_height) / 1024;
misc["string_1"] = llformat("%d", window_size);
// misc["string_2"] =
@@ -826,3 +842,4 @@ void send_stats()
LLViewerStats::getInstance()->addToMessage(body);
LLHTTPClient::post(url, body, new ViewerStatsResponder());
}
+
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index ba89fbf02a..13d73000d2 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -34,6 +34,7 @@
#define LL_LLVIEWERSTATS_H
#include "llstat.h"
+#include "lltextureinfo.h"
class LLViewerStats : public LLSingleton<LLViewerStats>
{
@@ -205,10 +206,13 @@ private:
static const F32 SEND_STATS_PERIOD = 300.0f;
// The following are from (older?) statistics code found in appviewer.
+void init_statistics();
void reset_statistics();
void output_statistics(void*);
void update_statistics(U32 frame_count);
void send_stats();
extern std::map<S32,LLFrameTimer> gDebugTimers;
+extern std::map<S32,std::string> gDebugTimerLabel;
+
#endif // LL_LLVIEWERSTATS_H
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 5c40f2a540..ea8af223c3 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -37,7 +37,6 @@
#include "llagent.h"
#include "llaudioengine.h"
#include "llavataractions.h"
-#include "llfloaterchat.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
@@ -50,7 +49,7 @@
#include "llmemorystream.h"
#include "llmenugl.h"
#include "llnotecard.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llpanelplaces.h"
#include "llpreview.h"
#include "llpreviewnotecard.h"
@@ -62,6 +61,7 @@
#include "lltooltip.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
+#include "llviewerassettype.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewertexturelist.h"
@@ -170,7 +170,7 @@ public:
mToolTip = inv_item->getName() + '\n' + inv_item->getDescription();
}
- /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+ /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
if (num_chars == 0)
{
@@ -182,12 +182,29 @@ public:
width = EMBEDDED_ITEM_LABEL_PADDING + mImage->getWidth() + mStyle->getFont()->getWidth(mLabel.c_str());
height = llmax(mImage->getHeight(), llceil(mStyle->getFont()->getLineHeight()));
}
-
+ return false;
}
/*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
{
- return 1;
+ // always draw at beginning of line
+ if (line_offset == 0)
+ {
+ return 1;
+ }
+ else
+ {
+ S32 width, height;
+ getDimensions(mStart, 1, width, height);
+ if (width > num_pixels)
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+ }
}
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
{
@@ -207,7 +224,7 @@ public:
}
F32 right_x;
- mStyle->getFont()->render(mLabel, 0, image_rect.mRight + EMBEDDED_ITEM_LABEL_PADDING, draw_rect.mBottom, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::UNDERLINE, LLFontGL::NO_SHADOW, mLabel.length(), S32_MAX, &right_x);
+ mStyle->getFont()->render(mLabel, 0, image_rect.mRight + EMBEDDED_ITEM_LABEL_PADDING, draw_rect.mTop, color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::UNDERLINE, LLFontGL::NO_SHADOW, mLabel.length(), S32_MAX, &right_x);
return right_x;
}
@@ -229,7 +246,7 @@ public:
return FALSE;
}
- /*virtual*/ const LLStyleSP getStyle() const { return mStyle; }
+ /*virtual*/ LLStyleConstSP getStyle() const { return mStyle; }
private:
LLUIImagePtr mImage;
@@ -505,19 +522,17 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
}
break;
- case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break;
+ case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break;
case LLAssetType::AT_CLOTHING: img_name = "Inv_Clothing"; break;
- case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break;
+ case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break;
case LLAssetType::AT_CALLINGCARD: img_name = "Inv_CallingCard"; break;
- case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break;
+ case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break;
case LLAssetType::AT_NOTECARD: img_name = "Inv_Notecard"; break;
case LLAssetType::AT_LSL_TEXT: img_name = "Inv_Script"; break;
- case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
- case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation";break;
- case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
- //TODO need img_name
- case LLAssetType::AT_FAVORITE: img_name = "Inv_Landmark"; break;
- default: llassert(0);
+ case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
+ case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break;
+ case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
+ default: llassert(0);
}
return LLUI::getUIImage(img_name);
@@ -732,11 +747,10 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask)
if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) )
{
LLToolDragAndDrop::getInstance()->beginDrag(
- LLAssetType::lookupDragAndDropType( mDragItem->getType() ),
+ LLViewerAssetType::lookupDragAndDropType( mDragItem->getType() ),
mDragItem->getUUID(),
LLToolDragAndDrop::SOURCE_NOTECARD,
mPreviewID, mObjectID);
-
return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
}
getWindow()->setCursor(UI_CURSOR_HAND);
@@ -1166,13 +1180,13 @@ void LLViewerTextEditor::showUnsavedAlertDialog( LLInventoryItem* item )
LLSD payload;
payload["item_id"] = item->getUUID();
payload["notecard_id"] = mNotecardInventoryID;
- LLNotifications::instance().add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog);
+ LLNotificationsUtil::add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog);
}
// static
bool LLViewerTextEditor::onNotecardDialog(const LLSD& notification, const LLSD& response )
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if( option == 0 )
{
LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", notification["payload"]["notecard_id"]);;
@@ -1192,13 +1206,13 @@ void LLViewerTextEditor::showCopyToInvDialog( LLInventoryItem* item, llwchar wc
LLUUID item_id = item->getUUID();
payload["item_id"] = item_id;
payload["item_wc"] = LLSD::Integer(wc);
- LLNotifications::instance().add( "ConfirmItemCopy", LLSD(), payload,
+ LLNotificationsUtil::add( "ConfirmItemCopy", LLSD(), payload,
boost::bind(&LLViewerTextEditor::onCopyToInvDialog, this, _1, _2));
}
bool LLViewerTextEditor::onCopyToInvDialog(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if( 0 == option )
{
LLUUID item_id = notification["payload"]["item_id"].asUUID();
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index e5c53c91c9..6add8a7e92 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -60,6 +60,8 @@
#include "llviewercontrol.h"
#include "pipeline.h"
#include "llappviewer.h"
+#include "llface.h"
+#include "llviewercamera.h"
#include "lltextureatlas.h"
#include "lltextureatlasmanager.h"
#include "lltextureentry.h"
@@ -88,15 +90,37 @@ S32 LLViewerTexture::sTotalTextureMemoryInBytes = 0;
S32 LLViewerTexture::sMaxBoundTextureMemInMegaBytes = 0;
S32 LLViewerTexture::sMaxTotalTextureMemInMegaBytes = 0;
S32 LLViewerTexture::sMaxDesiredTextureMemInBytes = 0 ;
-BOOL LLViewerTexture::sDontLoadVolumeTextures = FALSE;
+S8 LLViewerTexture::sCameraMovingDiscardBias = 0 ;
+S32 LLViewerTexture::sMaxSculptRez = 128 ; //max sculpt image size
+const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64 ;
+const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez ;
+const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128 ;
+S32 LLViewerTexture::sMinLargeImageSize = 65536 ; //256 * 256.
+S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ;
+BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE ;
+F32 LLViewerTexture::sCurrentTime = 0.0f ;
BOOL LLViewerTexture::sUseTextureAtlas = FALSE ;
const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by
const F32 desired_discard_bias_max = 1.5f; // max number of levels to reduce image quality by
+const F64 log_2 = log(2.0);
//----------------------------------------------------------------------------------------------
//namespace: LLViewerTextureAccess
//----------------------------------------------------------------------------------------------
+
+LLLoadedCallbackEntry::LLLoadedCallbackEntry(loaded_callback_func cb,
+ S32 discard_level,
+ BOOL need_imageraw, // Needs image raw for the callback
+ void* userdata )
+ : mCallback(cb),
+ mLastUsedDiscard(MAX_DISCARD_LEVEL+1),
+ mDesiredDiscard(discard_level),
+ mNeedsImageRaw(need_imageraw),
+ mUserData(userdata)
+{
+}
+
LLViewerMediaTexture* LLViewerTextureManager::createMediaTexture(const LLUUID &media_id, BOOL usemipmaps, LLImageGL* gl_image)
{
return new LLViewerMediaTexture(media_id, usemipmaps, gl_image) ;
@@ -134,7 +158,7 @@ LLViewerMediaTexture* LLViewerTextureManager::getMediaTexture(const LLUUID& id,
return tex ;
}
-LLViewerFetchedTexture* LLViewerTextureManager::staticCastToFetchedTexture(LLViewerTexture* tex, BOOL report_error)
+LLViewerFetchedTexture* LLViewerTextureManager::staticCastToFetchedTexture(LLTexture* tex, BOOL report_error)
{
if(!tex)
{
@@ -161,6 +185,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(BOOL usemipma
if(generate_gl_tex)
{
tex->generateGLTexture() ;
+ tex->setCategory(LLViewerTexture::LOCAL) ;
}
return tex ;
}
@@ -170,12 +195,14 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLUUID&
if(generate_gl_tex)
{
tex->generateGLTexture() ;
+ tex->setCategory(LLViewerTexture::LOCAL) ;
}
return tex ;
}
LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps)
{
LLPointer<LLViewerTexture> tex = new LLViewerTexture(raw, usemipmaps) ;
+ tex->setCategory(LLViewerTexture::LOCAL) ;
return tex ;
}
LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex)
@@ -184,6 +211,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
if(generate_gl_tex)
{
tex->generateGLTexture() ;
+ tex->setCategory(LLViewerTexture::LOCAL) ;
}
return tex ;
}
@@ -191,7 +219,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -203,7 +231,7 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
const std::string& filename,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -212,6 +240,19 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
}
+//static
+LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,
+ BOOL usemipmaps,
+ LLViewerTexture::EBoostLevel boost_priority,
+ S8 texture_type,
+ LLGLint internal_format,
+ LLGLenum primary_format,
+ const LLUUID& force_id
+ )
+{
+ return gTextureList.getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
+}
+
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, LLHost host)
{
return gTextureList.getImageFromHost(image_id, host) ;
@@ -252,13 +293,16 @@ void LLViewerTextureManager::init()
}
}
imagep->createGLTexture(0, image_raw);
+ //cache the raw image
+ imagep->setCachedRawImage(0, image_raw) ;
image_raw = NULL;
- LLViewerFetchedTexture::sDefaultImagep->dontDiscard();
#else
- LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
+ LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
#endif
-
- LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, TRUE);
+ LLViewerFetchedTexture::sDefaultImagep->dontDiscard();
+ LLViewerFetchedTexture::sDefaultImagep->setCategory(LLViewerTexture::OTHER) ;
+
+ LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI);
LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ;
LLViewerTexture::initClass() ;
@@ -281,6 +325,8 @@ void LLViewerTextureManager::cleanup()
LLViewerFetchedTexture::sWhiteImagep = NULL;
LLViewerMediaTexture::cleanup() ;
+
+ LLViewerTexture::cleanupClass() ;
}
//----------------------------------------------------------------------------------------------
@@ -291,6 +337,11 @@ void LLViewerTextureManager::cleanup()
void LLViewerTexture::initClass()
{
LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture() ;
+
+ if(gAuditTexture)
+ {
+ LLImageGL::setHighlightTexture(LLViewerTexture::OTHER) ;
+ }
}
// static
@@ -298,6 +349,25 @@ void LLViewerTexture::cleanupClass()
{
}
+// static
+S32 LLViewerTexture::getTotalNumOfCategories()
+{
+ return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ;
+}
+
+// static
+//index starts from zero.
+S32 LLViewerTexture::getIndexFromCategory(S32 category)
+{
+ return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ;
+}
+
+//static
+S32 LLViewerTexture::getCategoryFromIndex(S32 index)
+{
+ return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ;
+}
+
// tuning params
const F32 discard_bias_delta = .05f;
const F32 discard_delta_time = 0.5f;
@@ -309,6 +379,8 @@ F32 texmem_middle_bound_scale = 0.925f;
//static
void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)
{
+ sCurrentTime = gFrameTimeSeconds ;
+
if(LLViewerTextureManager::sTesterp)
{
LLViewerTextureManager::sTesterp->update() ;
@@ -349,6 +421,13 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
}
sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max);
LLViewerTexture::sUseTextureAtlas = gSavedSettings.getBOOL("EnableTextureAtlas") ;
+
+ F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ;
+ F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed();
+ sCameraMovingDiscardBias = (S8)llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1) ;
+
+ LLViewerTexture::sFreezeImageScalingDown = (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < 0.75f * sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) &&
+ (BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < 0.75f * sMaxTotalTextureMemInMegaBytes * texmem_middle_bound_scale) ;
}
//end of static functions
@@ -414,7 +493,14 @@ void LLViewerTexture::init(bool firstinit)
mTextureState = NO_DELETE ;
mDontDiscard = FALSE;
mMaxVirtualSize = 0.f;
+ mNeedsGLTexture = FALSE ;
mNeedsResetMaxVirtualSize = FALSE ;
+ mAdditionalDecodePriority = 0.f ;
+ mParcelMedia = NULL ;
+ mNumFaces = 0 ;
+ mNumVolumes = 0;
+ mFaceList.clear() ;
+ mVolumeList.clear();
}
//virtual
@@ -426,7 +512,7 @@ S8 LLViewerTexture::getType() const
void LLViewerTexture::cleanup()
{
mFaceList.clear() ;
-
+ mVolumeList.clear();
if(mGLTexturep)
{
mGLTexturep->cleanup();
@@ -455,11 +541,15 @@ void LLViewerTexture::setBoostLevel(S32 level)
{
setNoDelete() ;
}
+ if(gAuditTexture)
+ {
+ setCategory(mBoostLevel);
+ }
}
}
-bool LLViewerTexture::bindDefaultImage(S32 stage) const
+bool LLViewerTexture::bindDefaultImage(S32 stage)
{
if (stage < 0) return false;
@@ -478,6 +568,10 @@ bool LLViewerTexture::bindDefaultImage(S32 stage) const
llwarns << "LLViewerTexture::bindDefaultImage failed." << llendl;
}
stop_glerror();
+
+ //check if there is cached raw image and switch to it if possible
+ switchToCachedImage() ;
+
if(LLViewerTextureManager::sTesterp)
{
LLViewerTextureManager::sTesterp->updateGrayTextureBinding() ;
@@ -496,24 +590,32 @@ void LLViewerTexture::forceImmediateUpdate()
{
}
-void LLViewerTexture::addTextureStats(F32 virtual_size) const
+void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const
{
- if (virtual_size > mMaxVirtualSize)
+ if(needs_gltexture)
{
- mMaxVirtualSize = virtual_size;
+ mNeedsGLTexture = TRUE ;
}
-}
-void LLViewerTexture::resetTextureStats(BOOL zero)
-{
- if (zero)
+ if(mNeedsResetMaxVirtualSize)
{
- mMaxVirtualSize = 0.0f;
+ //flag to reset the values because the old values are used.
+ mNeedsResetMaxVirtualSize = FALSE ;
+ mMaxVirtualSize = virtual_size;
+ mAdditionalDecodePriority = 0.f ;
+ mNeedsGLTexture = needs_gltexture ;
}
- else
+ else if (virtual_size > mMaxVirtualSize)
{
- mMaxVirtualSize -= mMaxVirtualSize * .10f; // decay by 5%/update
- }
+ mMaxVirtualSize = virtual_size;
+ }
+}
+
+void LLViewerTexture::resetTextureStats()
+{
+ mMaxVirtualSize = 0.0f;
+ mAdditionalDecodePriority = 0.f ;
+ mNeedsResetMaxVirtualSize = FALSE ;
}
//virtual
@@ -522,16 +624,127 @@ F32 LLViewerTexture::getMaxVirtualSize()
return mMaxVirtualSize ;
}
+//virtual
+void LLViewerTexture::setKnownDrawSize(S32 width, S32 height)
+{
+ //nothing here.
+}
+
//virtual
void LLViewerTexture::addFace(LLFace* facep)
{
- mFaceList.push_back(facep) ;
+ if(mNumFaces >= mFaceList.size())
+ {
+ mFaceList.resize(2 * mNumFaces + 1) ;
+ }
+ mFaceList[mNumFaces] = facep ;
+ facep->setIndexInTex(mNumFaces) ;
+ mNumFaces++ ;
+ mLastFaceListUpdateTimer.reset() ;
}
//virtual
void LLViewerTexture::removeFace(LLFace* facep)
{
- mFaceList.remove(facep) ;
+ if(mNumFaces > 1)
+ {
+ S32 index = facep->getIndexInTex() ;
+ mFaceList[index] = mFaceList[--mNumFaces] ;
+ mFaceList[index]->setIndexInTex(index) ;
+ }
+ else
+ {
+ mFaceList.clear() ;
+ mNumFaces = 0 ;
+ }
+ mLastFaceListUpdateTimer.reset() ;
+}
+
+S32 LLViewerTexture::getNumFaces() const
+{
+ return mNumFaces ;
+}
+
+
+//virtual
+void LLViewerTexture::addVolume(LLVOVolume* volumep)
+{
+ if( mNumVolumes >= mVolumeList.size())
+ {
+ mVolumeList.resize(2 * mNumVolumes + 1) ;
+ }
+ mVolumeList[mNumVolumes] = volumep ;
+ volumep->setIndexInTex(mNumVolumes) ;
+ mNumVolumes++ ;
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+//virtual
+void LLViewerTexture::removeVolume(LLVOVolume* volumep)
+{
+ if(mNumVolumes > 1)
+ {
+ S32 index = volumep->getIndexInTex() ;
+ mVolumeList[index] = mVolumeList[--mNumVolumes] ;
+ mVolumeList[index]->setIndexInTex(index) ;
+ }
+ else
+ {
+ mVolumeList.clear() ;
+ mNumVolumes = 0 ;
+ }
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+S32 LLViewerTexture::getNumVolumes() const
+{
+ return mNumVolumes ;
+}
+
+void LLViewerTexture::reorganizeFaceList()
+{
+ static const F32 MAX_WAIT_TIME = 20.f; // seconds
+ static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ;
+
+ if(mNumFaces + MAX_EXTRA_BUFFER_SIZE > mFaceList.size())
+ {
+ return ;
+ }
+
+ if(mLastFaceListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME)
+ {
+ return ;
+ }
+
+ mLastFaceListUpdateTimer.reset() ;
+ mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());
+}
+
+void LLViewerTexture::reorganizeVolumeList()
+{
+ static const F32 MAX_WAIT_TIME = 20.f; // seconds
+ static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ;
+
+ if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size())
+ {
+ return ;
+ }
+
+ if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME)
+ {
+ return ;
+ }
+
+ mLastVolumeListUpdateTimer.reset() ;
+ mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end());
+}
+
+
+
+//virtual
+void LLViewerTexture::switchToCachedImage()
+{
+ //nothing here.
}
void LLViewerTexture::forceActive()
@@ -563,7 +776,7 @@ void LLViewerTexture::generateGLTexture()
LLImageGL* LLViewerTexture::getGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep ;
}
@@ -578,73 +791,79 @@ BOOL LLViewerTexture::createGLTexture()
return mGLTexturep->createGLTexture() ;
}
-BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename)
+BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
- BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename) ;
+ BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ;
if(ret)
{
mFullWidth = mGLTexturep->getCurrentWidth() ;
mFullHeight = mGLTexturep->getCurrentHeight() ;
- mComponents = mGLTexturep->getComponents() ;
+ mComponents = mGLTexturep->getComponents() ;
}
return ret ;
}
+//virtual
+void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
+{
+ //nothing here.
+}
+
void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ;
}
void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setAddressMode(mode) ;
}
void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setFilteringOption(option) ;
}
//virtual
S32 LLViewerTexture::getWidth(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getWidth(discard_level) ;
}
//virtual
S32 LLViewerTexture::getHeight(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getHeight(discard_level) ;
}
S32 LLViewerTexture::getMaxDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMaxDiscardLevel() ;
}
S32 LLViewerTexture::getDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevel() ;
}
S8 LLViewerTexture::getComponents() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getComponents() ;
}
LLGLuint LLViewerTexture::getTexName() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexName() ;
}
@@ -669,117 +888,124 @@ BOOL LLViewerTexture::getBoundRecently() const
LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTarget() ;
}
BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ;
}
BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ;
}
void LLViewerTexture::setGLTextureCreated (bool initialized)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setGLTextureCreated (initialized) ;
}
+void LLViewerTexture::setCategory(S32 category)
+{
+ llassert(mGLTexturep.notNull()) ;
+
+ mGLTexturep->setCategory(category) ;
+}
+
LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getAddressMode() ;
}
S32 LLViewerTexture::getTextureMemory() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->mTextureMemory ;
}
LLGLenum LLViewerTexture::getPrimaryFormat() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getPrimaryFormat() ;
}
BOOL LLViewerTexture::getIsAlphaMask() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getIsAlphaMask() ;
}
BOOL LLViewerTexture::getMask(const LLVector2 &tc)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMask(tc) ;
}
F32 LLViewerTexture::getTimePassedSinceLastBound()
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTimePassedSinceLastBound() ;
}
BOOL LLViewerTexture::getMissed() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMissed() ;
}
-BOOL LLViewerTexture::isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents)
+BOOL LLViewerTexture::isJustBound() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
- return mGLTexturep->isValidForSculpt(discard_level, image_width, image_height, ncomponents) ;
+ return mGLTexturep->isJustBound() ;
}
-BOOL LLViewerTexture::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const
+void LLViewerTexture::forceUpdateBindStats(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
- return mGLTexturep->readBackRaw(discard_level, imageraw, compressed_ok) ;
+ return mGLTexturep->forceUpdateBindStats() ;
}
U32 LLViewerTexture::getTexelsInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInAtlas() ;
}
U32 LLViewerTexture::getTexelsInGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInGLTexture() ;
}
BOOL LLViewerTexture::isGLTextureCreated() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->isGLTextureCreated() ;
}
S32 LLViewerTexture::getDiscardLevelInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevelInAtlas() ;
}
@@ -793,6 +1019,11 @@ void LLViewerTexture::destroyGLTexture()
}
}
+BOOL LLViewerTexture::isLargeImage()
+{
+ return mFullWidth * mFullHeight > LLViewerTexture::sMinLargeImageSize ;
+}
+
//virtual
void LLViewerTexture::updateBindStatsForTester()
{
@@ -810,14 +1041,9 @@ void LLViewerTexture::updateBindStatsForTester()
//start of LLViewerFetchedTexture
//----------------------------------------------------------------------------------------------
-//static
-F32 LLViewerFetchedTexture::maxDecodePriority()
-{
- return 2000000.f;
-}
-
-LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, BOOL usemipmaps)
- : LLViewerTexture(id, usemipmaps)
+LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps)
+ : LLViewerTexture(id, usemipmaps),
+ mTargetHost(host)
{
init(TRUE) ;
generateGLTexture() ;
@@ -829,9 +1055,9 @@ LLViewerFetchedTexture::LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemi
init(TRUE) ;
}
-LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps)
+LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps)
: LLViewerTexture(id, usemipmaps),
- mLocalFileName(full_path)
+ mUrl(url)
{
init(TRUE) ;
generateGLTexture() ;
@@ -852,6 +1078,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mKnownDrawWidth = 0;
mKnownDrawHeight = 0;
+ mKnownDrawSizeChanged = FALSE ;
if (firstinit)
{
@@ -863,6 +1090,8 @@ void LLViewerFetchedTexture::init(bool firstinit)
// does not contain this image.
mIsMissingAsset = FALSE;
+ mLoadedCallbackDesiredDiscardLevel = 0;
+
mNeedsCreateTexture = FALSE;
mIsRawImageValid = FALSE;
@@ -875,10 +1104,19 @@ void LLViewerFetchedTexture::init(bool firstinit)
mFetchPriority = 0;
mDownloadProgress = 0.f;
mFetchDeltaTime = 999999.f;
- mDecodeFrame = 0;
- mVisibleFrame = 0;
+ mRequestDeltaTime = 0.f;
mForSculpt = FALSE ;
mIsFetched = FALSE ;
+
+ mCachedRawImage = NULL ;
+ mCachedRawDiscardLevel = -1 ;
+ mCachedRawImageReady = FALSE ;
+
+ mSavedRawImage = NULL ;
+ mForceToSaveRawImage = FALSE ;
+ mSavedRawDiscardLevel = -1 ;
+ mDesiredSavedRawDiscardLevel = -1 ;
+ mLastReferencedSavedRawImageTime = 0.0f ;
}
LLViewerFetchedTexture::~LLViewerFetchedTexture()
@@ -915,11 +1153,25 @@ void LLViewerFetchedTexture::cleanup()
// Clean up image data
destroyRawImage();
+ mCachedRawImage = NULL ;
+ mCachedRawDiscardLevel = -1 ;
+ mCachedRawImageReady = FALSE ;
+ mSavedRawImage = NULL ;
}
void LLViewerFetchedTexture::setForSculpt()
{
mForSculpt = TRUE ;
+ if(isForSculptOnly() && !getBoundRecently())
+ {
+ destroyGLTexture() ; //sculpt image does not need gl texture.
+ }
+ checkCachedRawSculptImage() ;
+}
+
+BOOL LLViewerFetchedTexture::isForSculptOnly() const
+{
+ return mForSculpt && !mNeedsGLTexture ;
}
BOOL LLViewerFetchedTexture::isDeleted()
@@ -954,17 +1206,37 @@ void LLViewerFetchedTexture::setInactive()
}
}
+BOOL LLViewerFetchedTexture::isFullyLoaded() const
+{
+ // Unfortunately, the boolean "mFullyLoaded" is never updated correctly so we use that logic
+ // to check if the texture is there and completely downloaded
+ return (mFullWidth != 0) && (mFullHeight != 0) && !mIsFetching && !mHasFetcher;
+}
+
+
// virtual
void LLViewerFetchedTexture::dump()
{
LLViewerTexture::dump();
- llinfos << "LLViewerFetchedTexture"
- << " mIsMissingAsset " << (S32)mIsMissingAsset
- << " mFullWidth " << mFullWidth
- << " mFullHeight " << mFullHeight
- << " mOrigWidth" << mOrigWidth
- << " mOrigHeight" << mOrigHeight
+ llinfos << "Dump : " << mID
+ << ", mIsMissingAsset = " << (S32)mIsMissingAsset
+ << ", mFullWidth = " << (S32)mFullWidth
+ << ", mFullHeight = " << (S32)mFullHeight
+ << ", mOrigWidth = " << (S32)mOrigWidth
+ << ", mOrigHeight = " << (S32)mOrigHeight
+ << llendl;
+ llinfos << " : "
+ << " mFullyLoaded = " << (S32)mFullyLoaded
+ << ", mFetchState = " << (S32)mFetchState
+ << ", mFetchPriority = " << (S32)mFetchPriority
+ << ", mDownloadProgress = " << (F32)mDownloadProgress
+ << llendl;
+ llinfos << " : "
+ << " mHasFetcher = " << (S32)mHasFetcher
+ << ", mIsFetching = " << (S32)mIsFetching
+ << ", mIsFetched = " << (S32)mIsFetched
+ << ", mBoostLevel = " << (S32)mBoostLevel
<< llendl;
}
@@ -985,6 +1257,75 @@ void LLViewerFetchedTexture::destroyTexture()
mFullyLoaded = FALSE ;
}
+//
+//do not change the discard level of the loaded texture image.
+BOOL LLViewerFetchedTexture::keepReuestedDiscardLevel()
+{
+ if (!mLoadedCallbackList.empty())
+ {
+ return TRUE ;
+ }
+
+ return FALSE ;
+}
+
+void LLViewerFetchedTexture::addToCreateTexture()
+{
+ if(isForSculptOnly())
+ {
+ //just update some variables, not to create a real GL texture.
+ createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE) ;
+ mNeedsCreateTexture = FALSE ;
+ destroyRawImage();
+ }
+ else
+ {
+#if 1
+ //
+ //if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up,
+ //so do not scale down the over qualified image.
+ //Note: scaling down image is expensensive. Do it only when very necessary.
+ //
+ if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !keepReuestedDiscardLevel())
+ {
+ S32 w = mFullWidth >> mRawDiscardLevel;
+ S32 h = mFullHeight >> mRawDiscardLevel;
+
+ //if big image, do not load extra data
+ //scale it down to size >= LLViewerTexture::sMinLargeImageSize
+ if(w * h > LLViewerTexture::sMinLargeImageSize)
+ {
+ S32 d_level = llmin(mRequestedDiscardLevel, (S32)mDesiredDiscardLevel) - mRawDiscardLevel ;
+
+ if(d_level > 0)
+ {
+ S32 i = 0 ;
+ while((d_level > 0) && ((w >> i) * (h >> i) > LLViewerTexture::sMinLargeImageSize))
+ {
+ i++;
+ d_level--;
+ }
+ if(i > 0)
+ {
+ mRawDiscardLevel += i ;
+ if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0)
+ {
+ mNeedsCreateTexture = FALSE ;
+ destroyRawImage();
+ return ;
+ }
+ mRawImage->scale(w >> i, h >> i) ;
+ }
+ }
+ }
+ }
+#endif
+ mNeedsCreateTexture = TRUE;
+ gTextureList.mCreateTextureList.insert(this);
+ }
+ return ;
+}
+
// ONLY called from LLViewerTextureList
BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
{
@@ -1006,7 +1347,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
if (!gNoRender)
{
// store original size only for locally-sourced images
- if (!mLocalFileName.empty())
+ if (mUrl.compare(0, 7, "file://") == 0)
{
mOrigWidth = mRawImage->getWidth();
mOrigHeight = mRawImage->getHeight();
@@ -1052,7 +1393,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
if(!(res = insertToAtlas()))
{
- res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename);
+ res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel);
resetFaceAtlas() ;
}
setActive() ;
@@ -1084,10 +1425,17 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
}
// Call with 0,0 to turn this feature off.
+//virtual
void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
{
- mKnownDrawWidth = width;
- mKnownDrawHeight = height;
+ if(mKnownDrawWidth != width || mKnownDrawHeight != height)
+ {
+ mKnownDrawWidth = width;
+ mKnownDrawHeight = height;
+
+ mKnownDrawSizeChanged = TRUE ;
+ mFullyLoaded = FALSE ;
+ }
addTextureStats((F32)(width * height));
}
@@ -1099,18 +1447,39 @@ void LLViewerFetchedTexture::processTextureStats()
return ;
}
- if(!mFullWidth || !mFullHeight)
+ updateVirtualSize() ;
+
+ static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes");
+
+ if (textures_fullres)
+ {
+ mDesiredDiscardLevel = 0;
+ }
+ else if(!mFullWidth || !mFullHeight)
{
mDesiredDiscardLevel = getMaxDiscardLevel() ;
}
else
- {
- mDesiredDiscardLevel = 0;
- if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ {
+ if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)
{
- mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ {
+ mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ }
+ else
+ {
+ mDesiredDiscardLevel = 0;
+ }
}
-
+ else if(mKnownDrawSizeChanged)//known draw size is set
+ {
+ mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,
+ log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
+ mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
+ }
+ mKnownDrawSizeChanged = FALSE ;
+
if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel))
{
mFullyLoaded = TRUE ;
@@ -1118,18 +1487,13 @@ void LLViewerFetchedTexture::processTextureStats()
}
}
-//texture does not have any data, so we don't know the size of the image, treat it like 32 * 32.
-F32 LLViewerFetchedTexture::calcDecodePriorityForUnknownTexture(F32 pixel_priority)
-{
- static const F64 log_2 = log(2.0);
-
- F32 desired = (F32)(log(32.0/pixel_priority) / log_2);
- S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired + 1;
- ddiscard = llclamp(ddiscard, 1, 9);
-
- return ddiscard*100000.f;
-}
-
+const F32 MAX_PRIORITY_PIXEL = 999.f ; //pixel area
+const F32 PRIORITY_BOOST_LEVEL_FACTOR = 1000.f ; //boost level
+const F32 PRIORITY_DELTA_DISCARD_LEVEL_FACTOR = 100000.f ; //delta discard
+const S32 MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY = 4 ;
+const F32 PRIORITY_ADDITIONAL_FACTOR = 1000000.f ; //additional
+const S32 MAX_ADDITIONAL_LEVEL_FOR_PRIORITY = 8 ;
+const F32 PRIORITY_BOOST_HIGH_FACTOR = 10000000.f ;//boost high
F32 LLViewerFetchedTexture::calcDecodePriority()
{
#ifndef LL_RELEASE_FOR_DOWNLOAD
@@ -1148,28 +1512,34 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
{
return mDecodePriority; // no change while waiting to create
}
-
- F32 priority;
- S32 cur_discard = getDiscardLevel();
- bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
- F32 pixel_priority = fsqrtf(mMaxVirtualSize);
- const S32 MIN_NOT_VISIBLE_FRAMES = 30; // NOTE: this function is not called every frame
- mDecodeFrame++;
- if (pixel_priority > 0.f)
+ if(mForceToSaveRawImage)
{
- mVisibleFrame = mDecodeFrame;
+ return maxDecodePriority() ;
}
+ S32 cur_discard = getDiscardLevel();
+ bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
+ F32 pixel_priority = fsqrtf(mMaxVirtualSize);
+
+ F32 priority = 0.f;
if (mIsMissingAsset)
{
priority = 0.0f;
}
+ else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1)
+ {
+ priority = -1.0f ;
+ }
+ else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel)
+ {
+ priority = -1.0f;
+ }
else if (mDesiredDiscardLevel > getMaxDiscardLevel())
{
// Don't decode anything we don't need
priority = -1.0f;
}
- else if (mBoostLevel == LLViewerTexture::BOOST_UI && !have_all_data)
+ else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)
{
priority = 1.f;
}
@@ -1181,11 +1551,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
// Always want high boosted images
priority = 1.f;
}
- else if (mVisibleFrame == 0 || (mDecodeFrame - mVisibleFrame > MIN_NOT_VISIBLE_FRAMES))
- {
- // Don't decode anything that isn't visible unless it's important
- priority = -2.0f;
- }
else
{
// Leave the priority as-is
@@ -1194,7 +1559,13 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else if (cur_discard < 0)
{
- priority = calcDecodePriorityForUnknownTexture(pixel_priority) ;
+ //texture does not have any data, so we don't know the size of the image, treat it like 32 * 32.
+ // priority range = 100,000 - 500,000
+ static const F64 log_2 = log(2.0);
+ F32 desired = (F32)(log(32.0/pixel_priority) / log_2);
+ S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired;
+ ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))
{
@@ -1207,43 +1578,116 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else
{
- // priority range = 100000-400000
- S32 ddiscard = cur_discard - mDesiredDiscardLevel;
+ // priority range = 100,000 - 500,000
+ S32 desired_discard = mDesiredDiscardLevel;
if (getDontDiscard())
{
- ddiscard+=2;
+ desired_discard -= 2;
}
- else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == 0)
+ else if (!isJustBound() && mCachedRawImageReady)
{
- ddiscard-=2;
+ //if(mBoostLevel < BOOST_HIGH)
+ //{
+ // // We haven't rendered this in a while, de-prioritize it
+ // desired_discard += 2;
+ //}
+ //else
+ {
+ // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
+ desired_discard = cur_discard;
+ }
}
- ddiscard = llclamp(ddiscard, 0, 4);
- priority = ddiscard*100000.f;
+
+ S32 ddiscard = cur_discard - desired_discard;
+ ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
+
+ // Priority Formula:
+ // BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS
+ // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999]
if (priority > 0.0f)
{
- pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); // priority range = 100000-900000
+ pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL);
+
+ priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel;
+
if ( mBoostLevel > BOOST_HIGH)
{
- priority = 1000000.f + pixel_priority + 1000.f * mBoostLevel;
- }
- else
+ priority += PRIORITY_BOOST_HIGH_FACTOR;
+ }
+
+ if(mAdditionalDecodePriority > 0.0f)
{
- priority += 0.f + pixel_priority + 1000.f * mBoostLevel;
+ // priority range += 1,000,000.f-9,000,000.f
+ priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY);
}
}
return priority;
}
+
+//static
+F32 LLViewerFetchedTexture::maxDecodePriority()
+{
+ static const F32 max_priority = PRIORITY_BOOST_HIGH_FACTOR + //boost_high
+ PRIORITY_ADDITIONAL_FACTOR * (MAX_ADDITIONAL_LEVEL_FOR_PRIORITY + 1) + //additional (view dependent factors)
+ PRIORITY_DELTA_DISCARD_LEVEL_FACTOR * (MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY + 1) + //delta discard
+ PRIORITY_BOOST_LEVEL_FACTOR * (BOOST_MAX_LEVEL - 1) + //boost level
+ MAX_PRIORITY_PIXEL + 1.0f ; //pixel area.
+
+ return max_priority ;
+}
+
//============================================================================
void LLViewerFetchedTexture::setDecodePriority(F32 priority)
{
- llassert(!mInImageList);
+ //llassert(!mInImageList); // firing a lot, figure out why
+ if (mInImageList) // above llassert() softened to a warning
+ {
+ llwarns << "BAD STUFF! mInImageList" << llendl;
+ }
mDecodePriority = priority;
}
+void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority)
+{
+ priority = llclamp(priority, 0.f, 1.f);
+ if(mAdditionalDecodePriority < priority)
+ {
+ mAdditionalDecodePriority = priority;
+ }
+}
+
+void LLViewerFetchedTexture::updateVirtualSize()
+{
+ if(mNeedsResetMaxVirtualSize)
+ {
+ addTextureStats(0.f, FALSE) ;//reset
+ }
+
+ for(U32 i = 0 ; i < mNumFaces ; i++)
+ {
+ LLFace* facep = mFaceList[i] ;
+ if(facep->getDrawable()->isRecentlyVisible())
+ {
+ addTextureStats(facep->getVirtualSize()) ;
+ setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
+ }
+ }
+ mNeedsResetMaxVirtualSize = TRUE ;
+ reorganizeFaceList() ;
+ reorganizeVolumeList();
+}
+
bool LLViewerFetchedTexture::updateFetch()
{
+ static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled");
+ if(textures_decode_disabled)
+ {
+ return false ;
+ }
+
mFetchState = 0;
mFetchPriority = 0;
mFetchDeltaTime = 999999.f;
@@ -1276,11 +1720,20 @@ bool LLViewerFetchedTexture::updateFetch()
S32 desired_discard = getDesiredDiscardLevel();
F32 decode_priority = getDecodePriority();
decode_priority = llmax(decode_priority, 0.0f);
-
+
if (mIsFetching)
{
// Sets mRawDiscardLevel, mRawImage, mAuxRawImage
S32 fetch_discard = current_discard;
+
+ if(mForceToSaveRawImage)
+ {
+ if(fetch_discard >= 0)
+ {
+ fetch_discard = llmax(fetch_discard, mSavedRawDiscardLevel) ;
+ }
+ }
+
if (mRawImage.notNull()) sRawCount--;
if (mAuxRawImage.notNull()) sAuxCount--;
bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage);
@@ -1315,16 +1768,29 @@ bool LLViewerFetchedTexture::updateFetch()
mComponents = mRawImage->getComponents();
mGLTexturep->setComponents(mComponents) ;
- for(ll_face_list_t::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter)
+ for(U32 i = 0 ; i < mNumFaces ; i++)
{
- (*iter)->dirtyTexture() ;
+ mFaceList[i]->dirtyTexture() ;
}
}
- mIsRawImageValid = TRUE;
- gTextureList.mCreateTextureList.insert(this);
- mNeedsCreateTexture = TRUE;
mFullWidth = mRawImage->getWidth() << mRawDiscardLevel;
mFullHeight = mRawImage->getHeight() << mRawDiscardLevel;
+
+ if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE)
+ {
+ //discard all oversized textures.
+ destroyRawImage();
+ setIsMissingAsset();
+ mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
+ mIsFetching = FALSE ;
+ }
+ else
+ {
+ mIsRawImageValid = TRUE;
+ addToCreateTexture() ;
+ }
+
+ return TRUE ;
}
else
{
@@ -1347,13 +1813,13 @@ bool LLViewerFetchedTexture::updateFetch()
}
else
{
- llwarns << mID << ": Setting min discard to " << current_discard << llendl;
+ //llwarns << mID << ": Setting min discard to " << current_discard << llendl;
mMinDiscardLevel = current_discard;
desired_discard = current_discard;
}
destroyRawImage();
}
- else if (mRawImage.isNull())
+ else if (mRawImage.notNull())
{
// We have data, but our fetch failed to return raw data
// *TODO: FIgure out why this is happening and fix it
@@ -1362,12 +1828,29 @@ bool LLViewerFetchedTexture::updateFetch()
}
else
{
+// // Useful debugging code for undesired deprioritization of textures.
+// if (decode_priority <= 0.0f && desired_discard >= 0 && desired_discard < current_discard)
+// {
+// llinfos << "Calling updateRequestPriority() with decode_priority = 0.0f" << llendl;
+// calcDecodePriority();
+// }
LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority);
}
}
- bool make_request = true;
-
+ if (!mDontDiscard)
+ {
+ if (mBoostLevel == 0)
+ {
+ desired_discard = llmax(desired_discard, current_discard-1);
+ }
+ else
+ {
+ desired_discard = llmax(desired_discard, current_discard-2);
+ }
+ }
+
+ bool make_request = true;
if (decode_priority <= 0)
{
make_request = false;
@@ -1380,6 +1863,10 @@ bool LLViewerFetchedTexture::updateFetch()
{
make_request = false;
}
+ //else if (!isJustBound() && mCachedRawImageReady)
+ //{
+ // make_request = false;
+ //}
else
{
if (mIsFetching)
@@ -1407,33 +1894,12 @@ bool LLViewerFetchedTexture::updateFetch()
h = mGLTexturep->getHeight(0);
c = mComponents;
}
- if (!mDontDiscard)
- {
- if (mBoostLevel == 0)
- {
- desired_discard = llmax(desired_discard, current_discard-1);
- }
- else
- {
- desired_discard = llmax(desired_discard, current_discard-2);
- }
- }
-
+
// bypass texturefetch directly by pulling from LLTextureCache
bool fetch_request_created = false;
- if (mLocalFileName.empty())
- {
- fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(getID(), getTargetHost(), decode_priority,
- w, h, c, desired_discard,
- needsAux());
- }
- else
- {
- fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mLocalFileName, getID(),getTargetHost(), decode_priority,
- w, h, c, desired_discard,
- needsAux());
- }
-
+ fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority,
+ w, h, c, desired_discard, needsAux());
+
if (fetch_request_created)
{
mHasFetcher = TRUE;
@@ -1463,9 +1929,83 @@ bool LLViewerFetchedTexture::updateFetch()
return mIsFetching ? true : false;
}
+//
+//force to fetch a new raw image for this texture
+//
+BOOL LLViewerFetchedTexture::forceFetch()
+{
+ if(!mForceToSaveRawImage)
+ {
+ return false ;
+ }
+ //if(mDesiredSavedRawDiscardLevel < getDiscardLevel())
+ {
+ //no need to force fetching. normal fetching flow will do the work.
+ //return false ;
+ }
+ //if (mNeedsCreateTexture)
+ {
+ // We may be fetching still (e.g. waiting on write)
+ // but don't check until we've processed the raw data we have
+ //return false;
+ }
+ if(mIsFetching)
+ {
+ return false ;
+ }
+ if (mIsMissingAsset)
+ {
+ mForceToSaveRawImage = false ;
+ llassert_always(!mHasFetcher);
+ return false; // skip
+ }
+ if (!mLoadedCallbackList.empty() && mRawImage.notNull())
+ {
+ return false; // process any raw image data in callbacks before replacing
+ }
+ if(mRawImage.notNull() && mRawDiscardLevel <= mDesiredSavedRawDiscardLevel)
+ {
+ return false ; // mRawImage is enough
+ }
+
+ S32 desired_discard = mDesiredSavedRawDiscardLevel ;
+ S32 current_discard = getDiscardLevel();
+
+ bool fetch_request_created = false;
+ S32 w=0, h=0, c=0;
+ if (current_discard >= 0)
+ {
+ w = getWidth(0);
+ h = getHeight(0);
+ c = getComponents();
+ }
+ setDecodePriority(maxDecodePriority()) ;
+ fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), getDecodePriority(),
+ w, h, c, desired_discard, needsAux());
+
+ if (fetch_request_created)
+ {
+ mHasFetcher = TRUE;
+ mIsFetching = TRUE;
+ mRequestedDiscardLevel = desired_discard ;
+
+ mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
+ mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
+ }
+
+ return mIsFetching ? true : false;
+}
+
void LLViewerFetchedTexture::setIsMissingAsset()
{
- llwarns << mLocalFileName << " " << mID << ": Marking image as missing" << llendl;
+ if (mUrl.empty())
+ {
+ llwarns << mID << ": Marking image as missing" << llendl;
+ }
+ else
+ {
+ llwarns << mUrl << ": Marking image as missing" << llendl;
+ }
if (mHasFetcher)
{
LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);
@@ -1487,7 +2027,13 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call
{
// Put in list to call this->doLoadedCallbacks() periodically
gTextureList.mCallbackList.insert(this);
+ mLoadedCallbackDesiredDiscardLevel = (S8)discard_level;
}
+ else
+ {
+ mLoadedCallbackDesiredDiscardLevel = llmin(mLoadedCallbackDesiredDiscardLevel, (S8)discard_level) ;
+ }
+
LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata);
mLoadedCallbackList.push_back(entryp);
mNeedsAux |= needs_aux;
@@ -1616,7 +2162,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
// We have GL data.
destroyRawImage();
- readBackRawImage(gl_discard);
+ reloadRawImage(mLoadedCallbackDesiredDiscardLevel);
llassert_always(mRawImage.notNull());
llassert_always(!mNeedsAux || mAuxRawImage.notNull());
}
@@ -1725,36 +2271,234 @@ void LLViewerFetchedTexture::forceImmediateUpdate()
return ;
}
-// Was in LLImageGL
-LLImageRaw* LLViewerFetchedTexture::readBackRawImage(S8 discard_level)
+LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
{
llassert_always(mGLTexturep.notNull()) ;
llassert_always(discard_level >= 0);
llassert_always(mComponents > 0);
+
if (mRawImage.notNull())
{
- llerrs << "called with existing mRawImage" << llendl;
- mRawImage = NULL;
+ //mRawImage is in use by somebody else, do not delete it.
+ return NULL ;
}
- mRawImage = new LLImageRaw(mGLTexturep->getWidth(discard_level), mGLTexturep->getHeight(discard_level), mComponents);
- sRawCount++;
- mRawDiscardLevel = discard_level;
- mGLTexturep->readBackRaw(mRawDiscardLevel, mRawImage, false);
- mIsRawImageValid = TRUE;
+
+ if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
+ {
+ mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
+ mRawImage->copy(getSavedRawImage()) ;
+ mRawDiscardLevel = discard_level ;
+ }
+ else
+ {
+ //force to fetch raw image again if cached raw image is not good enough.
+ if(mCachedRawDiscardLevel > discard_level)
+ {
+ mRawImage = mCachedRawImage ;
+ mRawDiscardLevel = mCachedRawDiscardLevel;
+
+ forceToSaveRawImage(discard_level) ;
+ }
+ else //cached raw image is good enough, copy it.
+ {
+ mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
+ mRawImage->copy(mCachedRawImage) ;
+ mRawDiscardLevel = discard_level ;
+ }
+ }
+ mIsRawImageValid = TRUE ;
+ sRawCount++;
return mRawImage;
}
void LLViewerFetchedTexture::destroyRawImage()
-{
- if (mRawImage.notNull()) sRawCount--;
+{
if (mAuxRawImage.notNull()) sAuxCount--;
+
+ if (mRawImage.notNull())
+ {
+ sRawCount--;
+
+ if(mForceToSaveRawImage)
+ {
+ saveRawImage() ;
+ }
+ setCachedRawImage() ;
+ }
+
mRawImage = NULL;
mAuxRawImage = NULL;
mIsRawImageValid = FALSE;
mRawDiscardLevel = INVALID_DISCARD_LEVEL;
+
+ if(mForceToSaveRawImage)
+ {
+ forceFetch() ;
+ }
+}
+
+//use the mCachedRawImage to (re)generate the gl texture.
+//virtual
+void LLViewerFetchedTexture::switchToCachedImage()
+{
+ if(mCachedRawImage.notNull())
+ {
+ mRawImage = mCachedRawImage ;
+
+ if (getComponents() != mRawImage->getComponents())
+ {
+ // We've changed the number of components, so we need to move any
+ // objects using this pool to a different pool.
+ mComponents = mRawImage->getComponents();
+ mGLTexturep->setComponents(mComponents) ;
+ gTextureList.dirtyImage(this);
+ }
+
+ mIsRawImageValid = TRUE;
+ mRawDiscardLevel = mCachedRawDiscardLevel ;
+ gTextureList.mCreateTextureList.insert(this);
+ mNeedsCreateTexture = TRUE;
+ }
+}
+
+//cache the imageraw forcefully.
+//virtual
+void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
+{
+ if(imageraw != mRawImage.get())
+ {
+ mCachedRawImage = imageraw ;
+ mCachedRawDiscardLevel = discard_level ;
+ mCachedRawImageReady = TRUE ;
+ }
+}
+
+void LLViewerFetchedTexture::setCachedRawImage()
+{
+ if(mRawImage == mCachedRawImage)
+ {
+ return ;
+ }
+ if(!mIsRawImageValid)
+ {
+ return ;
+ }
+
+ if(mCachedRawImageReady)
+ {
+ return ;
+ }
+
+ if(mCachedRawDiscardLevel < 0 || mCachedRawDiscardLevel > mRawDiscardLevel)
+ {
+ S32 i = 0 ;
+ S32 w = mRawImage->getWidth() ;
+ S32 h = mRawImage->getHeight() ;
+
+ S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ;
+ if(LLViewerTexture::BOOST_TERRAIN == mBoostLevel)
+ {
+ max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ;
+ }
+ if(mForSculpt)
+ {
+ max_size = MAX_CACHED_RAW_SCULPT_IMAGE_AREA ;
+ mCachedRawImageReady = !mRawDiscardLevel ;
+ }
+ else
+ {
+ mCachedRawImageReady = (!mRawDiscardLevel || ((w * h) >= max_size)) ;
+ }
+
+ while(((w >> i) * (h >> i)) > max_size)
+ {
+ ++i ;
+ }
+
+ if(i)
+ {
+ if(!(w >> i) || !(h >> i))
+ {
+ --i ;
+ }
+
+ mRawImage->scale(w >> i, h >> i) ;
+ }
+ mCachedRawImage = mRawImage ;
+ mRawDiscardLevel += i ;
+ mCachedRawDiscardLevel = mRawDiscardLevel ;
+ }
+}
+
+void LLViewerFetchedTexture::checkCachedRawSculptImage()
+{
+ if(mCachedRawImageReady && mCachedRawDiscardLevel > 0)
+ {
+ if(getDiscardLevel() != 0)
+ {
+ mCachedRawImageReady = FALSE ;
+ }
+ else if(isForSculptOnly())
+ {
+ resetTextureStats() ; //do not update this image any more.
+ }
+ }
+}
+
+void LLViewerFetchedTexture::saveRawImage()
+{
+ if(mRawImage.isNull() || mSavedRawDiscardLevel == mRawDiscardLevel)
+ {
+ return ;
+ }
+
+ mSavedRawDiscardLevel = mRawDiscardLevel ;
+ mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()) ;
+
+ if(mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel)
+ {
+ mForceToSaveRawImage = FALSE ;
+ }
+
+ mLastReferencedSavedRawImageTime = sCurrentTime ;
+}
+
+void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
+{
+ if(!mForceToSaveRawImage && (mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard))
+ {
+ mForceToSaveRawImage = TRUE ;
+ mDesiredSavedRawDiscardLevel = desired_discard ;
+
+ forceFetch() ;
+ }
+}
+void LLViewerFetchedTexture::destroySavedRawImage()
+{
+ mSavedRawImage = NULL ;
+ mForceToSaveRawImage = FALSE ;
+ mSavedRawDiscardLevel = -1 ;
+ mDesiredSavedRawDiscardLevel = -1 ;
+ mLastReferencedSavedRawImageTime = 0.0f ;
}
+LLImageRaw* LLViewerFetchedTexture::getSavedRawImage()
+{
+ mLastReferencedSavedRawImageTime = sCurrentTime ;
+
+ return mSavedRawImage ;
+}
+
+BOOL LLViewerFetchedTexture::hasSavedRawImage() const
+{
+ return mSavedRawImage.notNull() ;
+}
+
+F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const
+{
+ return sCurrentTime - mLastReferencedSavedRawImageTime ;
+}
//----------------------------------------------------------------------------------------------
//atlasing
//----------------------------------------------------------------------------------------------
@@ -1766,16 +2510,13 @@ void LLViewerFetchedTexture::resetFaceAtlas()
//invalidate all atlas slots for this image.
void LLViewerFetchedTexture::invalidateAtlas(BOOL rebuild_geom)
{
- for(ll_face_list_t::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter)
+ for(U32 i = 0 ; i < mNumFaces ; i++)
{
- if(*iter)
+ LLFace* facep = mFaceList[i] ;
+ facep->removeAtlas() ;
+ if(rebuild_geom && facep->getDrawable() && facep->getDrawable()->getSpatialGroup())
{
- LLFace* facep = (LLFace*)*iter ;
- facep->removeAtlas() ;
- if(rebuild_geom && facep->getDrawable() && facep->getDrawable()->getSpatialGroup())
- {
- facep->getDrawable()->getSpatialGroup()->setState(LLSpatialGroup::GEOM_DIRTY);
- }
+ facep->getDrawable()->getSpatialGroup()->setState(LLSpatialGroup::GEOM_DIRTY);
}
}
}
@@ -1786,7 +2527,7 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
{
return FALSE ;
}
- if(mFaceList.size() < 1)
+ if(getNumFaces() < 1)
{
return FALSE ;
}
@@ -1810,12 +2551,10 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
//if the atlas slot pointers for some faces are null, process them later.
ll_face_list_t waiting_list ;
-
- for(ll_face_list_t::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter)
+ for(U32 i = 0 ; i < mNumFaces ; i++)
{
- if(*iter)
{
- facep = (LLFace*)*iter ;
+ facep = mFaceList[i] ;
//face can not use atlas.
if(!facep->canUseAtlas())
@@ -1952,14 +2691,14 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
//----------------------------------------------------------------------------------------------
//start of LLViewerLODTexture
//----------------------------------------------------------------------------------------------
-LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, BOOL usemipmaps)
- : LLViewerFetchedTexture(id, usemipmaps)
+LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps)
+ : LLViewerFetchedTexture(id, host, usemipmaps)
{
init(TRUE) ;
}
-LLViewerLODTexture::LLViewerLODTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps)
- : LLViewerFetchedTexture(full_path, id, usemipmaps)
+LLViewerLODTexture::LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps)
+ : LLViewerFetchedTexture(url, id, usemipmaps)
{
init(TRUE) ;
}
@@ -1977,12 +2716,25 @@ S8 LLViewerLODTexture::getType() const
return LLViewerTexture::LOD_TEXTURE ;
}
+BOOL LLViewerLODTexture::isUpdateFrozen()
+{
+ return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel() ;
+}
+
// This is gauranteed to get called periodically for every texture
//virtual
void LLViewerLODTexture::processTextureStats()
{
+ updateVirtualSize() ;
+
+ static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes");
+
+ if (textures_fullres)
+ {
+ mDesiredDiscardLevel = 0;
+ }
// Generate the request priority and render priority
- if (mDontDiscard || !mUseMipMaps)
+ else if (mDontDiscard || !mUseMipMaps)
{
mDesiredDiscardLevel = 0;
if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
@@ -2011,13 +2763,7 @@ void LLViewerLODTexture::processTextureStats()
// If we know the output width and height, we can force the discard
// level to the correct value, and thus not decode more texture
// data than we need to.
- /*if (mBoostLevel == LLViewerTexture::BOOST_UI ||
- mBoostLevel == LLViewerTexture::BOOST_PREVIEW ||
- mBoostLevel == LLViewerTexture::BOOST_AVATAR_SELF) // what about AVATAR_BAKED_SELF?
- {
- discard_level = 0; // full res
- }
- else*/ if (mKnownDrawWidth && mKnownDrawHeight)
+ if (mKnownDrawWidth && mKnownDrawHeight)
{
S32 draw_texels = mKnownDrawWidth * mKnownDrawHeight;
@@ -2028,6 +2774,12 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
+ if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)
+ {
+ //if is a big image and not being used recently, nor close to the view point, do not load hi-res data.
+ mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ;
+ }
+
if ((mCalculatedDiscardLevel >= 0.f) &&
(llabs(mMaxVirtualSize - mDiscardVirtualSize) < mMaxVirtualSize*.20f))
{
@@ -2044,13 +2796,11 @@ void LLViewerLODTexture::processTextureStats()
}
if (mBoostLevel < LLViewerTexture::BOOST_HIGH)
{
- static const F32 discard_bias = -.5f; // Must be < 1 or highest discard will never load!
- discard_level += discard_bias;
discard_level += sDesiredDiscardBias;
discard_level *= sDesiredDiscardScale; // scale
+ discard_level += sCameraMovingDiscardBias ;
}
discard_level = floorf(discard_level);
-// discard_level -= (gTextureList.mVideoMemorySetting>>1); // more video ram = higher detail
F32 min_discard = 0.f;
if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
@@ -2069,46 +2819,39 @@ void LLViewerLODTexture::processTextureStats()
// proper action if we don't.
//
- BOOL increase_discard = FALSE;
S32 current_discard = getDiscardLevel();
if ((sDesiredDiscardBias > 0.0f) &&
(current_discard >= 0 && mDesiredDiscardLevel >= current_discard))
{
- if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale)
- {
- // Limit the amount of GL memory bound each frame
- if (mDesiredDiscardLevel > current_discard)
- {
- increase_discard = TRUE;
- }
- }
- if ( BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale)
+ // Limit the amount of GL memory bound each frame
+ if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
+ (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
{
- // Only allow GL to have 2x the video card memory
- if (!mGLTexturep->getBoundRecently())
- {
- increase_discard = TRUE;
- }
+ scaleDown() ;
}
- if (increase_discard)
+ // Only allow GL to have 2x the video card memory
+ else if ( BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale &&
+ (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
{
- // llinfos << "DISCARDED: " << mID << " Discard: " << current_discard << llendl;
- sBoundTextureMemoryInBytes -= mGLTexturep->mTextureMemory;
- sTotalTextureMemoryInBytes -= mGLTexturep->mTextureMemory;
- // Increase the discard level (reduce the texture res)
- S32 new_discard = current_discard+1;
- mGLTexturep->setDiscardLevel(new_discard);
- sBoundTextureMemoryInBytes += mGLTexturep->mTextureMemory;
- sTotalTextureMemoryInBytes += mGLTexturep->mTextureMemory;
- if(LLViewerTextureManager::sTesterp)
- {
- LLViewerTextureManager::sTesterp->setStablizingTime() ;
- }
+ scaleDown() ;
+
}
}
}
}
+void LLViewerLODTexture::scaleDown()
+{
+ if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel())
+ {
+ switchToCachedImage() ;
+
+ if(LLViewerTextureManager::sTesterp)
+ {
+ LLViewerTextureManager::sTesterp->setStablizingTime() ;
+ }
+ }
+}
//----------------------------------------------------------------------------------------------
//end of LLViewerLODTexture
//----------------------------------------------------------------------------------------------
@@ -2121,22 +2864,28 @@ void LLViewerMediaTexture::updateClass()
{
static const F32 MAX_INACTIVE_TIME = 30.f ;
+#if 0
+ //force to play media.
+ gSavedSettings.setBOOL("AudioStreamingMedia", true) ;
+#endif
+
for(media_map_t::iterator iter = sMediaMap.begin() ; iter != sMediaMap.end(); )
{
LLViewerMediaTexture* mediap = iter->second;
-
- //
- //Note: delay some time to delete the media textures to stop endlessly creating and immediately removing media texture.
- //
- if(mediap->getNumRefs() == 1 && mediap->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME) //one by sMediaMap
- {
- media_map_t::iterator cur = iter++ ;
- sMediaMap.erase(cur) ;
- }
- else
+
+ if(mediap->getNumRefs() == 1) //one reference by sMediaMap
{
- ++iter ;
+ //
+ //Note: delay some time to delete the media textures to stop endlessly creating and immediately removing media texture.
+ //
+ if(mediap->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME)
+ {
+ media_map_t::iterator cur = iter++ ;
+ sMediaMap.erase(cur) ;
+ continue ;
+ }
}
+ ++iter ;
}
}
@@ -2189,21 +2938,33 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
mIsPlaying = FALSE ;
setMediaImpl() ;
+
+ setCategory(LLViewerTexture::MEDIA) ;
+
+ LLViewerTexture* tex = gTextureList.findImage(mID) ;
+ if(tex) //this media is a parcel media for tex.
+ {
+ tex->setParcelMedia(this) ;
+ }
}
//virtual
LLViewerMediaTexture::~LLViewerMediaTexture()
{
+ LLViewerTexture* tex = gTextureList.findImage(mID) ;
+ if(tex) //this media is a parcel media for tex.
+ {
+ tex->setParcelMedia(NULL) ;
+ }
}
void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
{
- mGLTexturep = NULL ;
- init(false);
+ llassert(mGLTexturep.notNull()) ;
+
mUseMipMaps = usemipmaps ;
getLastReferencedTimer()->reset() ;
-
- generateGLTexture() ;
+ mGLTexturep->setUseMipMaps(mUseMipMaps) ;
mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;
}
@@ -2244,15 +3005,15 @@ BOOL LLViewerMediaTexture::findFaces()
mMediaFaceList.clear() ;
BOOL ret = TRUE ;
-
- //for parcel media
- LLViewerTexture* tex = gTextureList.findImage(mID) ;
- if(tex)
+
+ LLViewerTexture* tex = gTextureList.findImage(mID) ;
+ if(tex) //this media is a parcel media for tex.
{
const ll_face_list_t* face_list = tex->getFaceList() ;
- for(ll_face_list_t::const_iterator iter = face_list->begin(); iter != face_list->end(); ++iter)
+ U32 end = tex->getNumFaces() ;
+ for(U32 i = 0 ; i < end ; i++)
{
- mMediaFaceList.push_back(*iter) ;
+ mMediaFaceList.push_back((*face_list)[i]) ;
}
}
@@ -2274,7 +3035,8 @@ BOOL LLViewerMediaTexture::findFaces()
}
S32 face_id = -1 ;
- while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1)
+ S32 num_faces = obj->mDrawable->getNumFaces() ;
+ while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1 && face_id < num_faces)
{
LLFace* facep = obj->mDrawable->getFace(face_id) ;
if(facep)
@@ -2307,6 +3069,10 @@ void LLViewerMediaTexture::initVirtualSize()
void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
{
+ if(facep)
+ {
+ facep->setHasMedia(true) ;
+ }
if(!mIsPlaying)
{
return ; //no need to add the face because the media is not in playing.
@@ -2317,20 +3083,22 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep)
{
- if(!mIsPlaying)
- {
- return ; //no need to remove the face because the media is not in playing.
- }
if(!facep)
{
return ;
}
+ facep->setHasMedia(false) ;
+
+ if(!mIsPlaying)
+ {
+ return ; //no need to remove the face because the media is not in playing.
+ }
mIsPlaying = FALSE ; //set to remove the media from the face.
switchTexture(facep) ;
mIsPlaying = TRUE ; //set the flag back.
- if(mFaceList.empty()) //no face referencing to this media
+ if(getNumFaces() < 1) //no face referencing to this media
{
stopPlaying() ;
}
@@ -2342,7 +3110,7 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
LLViewerTexture::addFace(facep) ;
const LLTextureEntry* te = facep->getTextureEntry() ;
- if(te)
+ if(te && te->getID().notNull())
{
LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
if(tex)
@@ -2358,8 +3126,11 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
mTextureList.push_back(facep->getTexture()) ; //a parcel media.
return ;
}
-
- llerrs << "The face does not have a valid texture before media texture." << llendl ;
+
+ if(te && te->getID().notNull()) //should have a texture
+ {
+ llerrs << "The face does not have a valid texture before media texture." << llendl ;
+ }
}
//virtual
@@ -2368,7 +3139,7 @@ void LLViewerMediaTexture::removeFace(LLFace* facep)
LLViewerTexture::removeFace(facep) ;
const LLTextureEntry* te = facep->getTextureEntry() ;
- if(te)
+ if(te && te->getID().notNull())
{
LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
if(tex)
@@ -2386,17 +3157,17 @@ void LLViewerMediaTexture::removeFace(LLFace* facep)
//
//we have some trouble here: the texture of the face is changed.
//we need to find the former texture, and remove it from the list to avoid memory leaking.
- if(mFaceList.empty())
+ if(!mNumFaces)
{
mTextureList.clear() ;
return ;
}
- S32 end = mFaceList.size() ;
+ S32 end = getNumFaces() ;
std::vector<const LLTextureEntry*> te_list(end) ;
S32 i = 0 ;
- for(ll_face_list_t::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter)
+ for(U32 j = 0 ; j < mNumFaces ; j++)
{
- te_list[i++] = (*iter)->getTextureEntry() ;//all textures are in use.
+ te_list[i++] = mFaceList[j]->getTextureEntry() ;//all textures are in use.
}
for(std::list< LLPointer<LLViewerTexture> >::iterator iter = mTextureList.begin();
iter != mTextureList.end(); ++iter)
@@ -2429,7 +3200,10 @@ void LLViewerMediaTexture::removeFace(LLFace* facep)
}
}
- llerrs << "mTextureList texture reference number is corrupted." << llendl ;
+ if(te && te->getID().notNull()) //should have a texture
+ {
+ llerrs << "mTextureList texture reference number is corrupted." << llendl ;
+ }
}
void LLViewerMediaTexture::stopPlaying()
@@ -2465,11 +3239,15 @@ void LLViewerMediaTexture::switchTexture(LLFace* facep)
const LLTextureEntry* te = facep->getTextureEntry() ;
if(te)
{
- LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
+ LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ;
if(!tex && te->getID() != mID)//try parcel media.
{
tex = gTextureList.findImage(mID) ;
}
+ if(!tex)
+ {
+ tex = LLViewerFetchedTexture::sDefaultImagep ;
+ }
facep->switchTexture(tex) ;
}
}
@@ -2514,16 +3292,9 @@ void LLViewerMediaTexture::setPlaying(BOOL playing)
}
else //stop playing this media
{
- if(mFaceList.empty())
+ for(U32 i = mNumFaces ; i ; i--)
{
- return ;
- }
-
- ll_face_list_t::iterator cur ;
- for(ll_face_list_t::iterator iter = mFaceList.begin(); iter!= mFaceList.end(); )
- {
- cur = iter++ ;
- switchTexture(*cur) ; //cur could be removed in this function.
+ switchTexture(mFaceList[i - 1]) ; //current face could be removed in this function.
}
}
return ;
@@ -2540,23 +3311,19 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
if(mNeedsResetMaxVirtualSize)
{
- mMaxVirtualSize = 0.f ;//reset
- mNeedsResetMaxVirtualSize = FALSE ;
+ addTextureStats(0.f, FALSE) ;//reset
}
if(mIsPlaying) //media is playing
{
- if(mFaceList.size() > 0)
- {
- for(std::list<LLFace*>::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter)
+ for(U32 i = 0 ; i < mNumFaces ; i++)
+ {
+ LLFace* facep = mFaceList[i] ;
+ if(facep->getDrawable()->isRecentlyVisible())
{
- LLFace* facep = *iter ;
- if(facep->getDrawable()->isRecentlyVisible())
- {
- addTextureStats(facep->getVirtualSize()) ;
- }
- }
- }
+ addTextureStats(facep->getVirtualSize()) ;
+ }
+ }
}
else //media is not in playing
{
@@ -2576,6 +3343,8 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
}
mNeedsResetMaxVirtualSize = TRUE ;
+ reorganizeFaceList() ;
+ reorganizeVolumeList();
return mMaxVirtualSize ;
}
@@ -2724,7 +3493,7 @@ void LLTexturePipelineTester::updateTextureLoadingStats(const LLViewerFetchedTex
mTotalBytesLoadedForLargeImage += data_size ;
}
- if(imagep->isForSculpt())
+ if(imagep->forSculpt())
{
mTotalBytesLoadedForSculpties += data_size ;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 480e1c1cbc..79db754072 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -49,12 +49,14 @@
class LLFace;
class LLImageGL ;
+class LLImageRaw;
class LLViewerObject;
class LLViewerTexture;
class LLViewerFetchedTexture ;
class LLViewerMediaTexture ;
class LLTexturePipelineTester ;
+
typedef void (*loaded_callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
class LLVFile;
@@ -68,14 +70,7 @@ public:
LLLoadedCallbackEntry(loaded_callback_func cb,
S32 discard_level,
BOOL need_imageraw, // Needs image raw for the callback
- void* userdata )
- : mCallback(cb),
- mLastUsedDiscard(MAX_DISCARD_LEVEL+1),
- mDesiredDiscard(discard_level),
- mNeedsImageRaw(need_imageraw),
- mUserData(userdata)
- {
- }
+ void* userdata );
loaded_callback_func mCallback;
S32 mLastUsedDiscard;
@@ -122,11 +117,26 @@ public:
BOOST_UI = 16,
BOOST_PREVIEW = 17,
BOOST_MAP = 18,
- BOOST_AVATAR_SELF = 19, // needed for baking avatar
- BOOST_MAX_LEVEL
+ BOOST_MAP_VISIBLE = 19,
+ BOOST_AVATAR_SELF = 20, // needed for baking avatar
+ BOOST_MAX_LEVEL,
+
+ //other texture Categories
+ LOCAL = BOOST_MAX_LEVEL,
+ AVATAR_SCRATCH_TEX,
+ DYNAMIC_TEX,
+ MEDIA,
+ ATLAS,
+ OTHER,
+ MAX_GL_IMAGE_CATEGORY
};
-
- typedef std::list<LLFace*> ll_face_list_t ;
+ static S32 getTotalNumOfCategories() ;
+ static S32 getIndexFromCategory(S32 category) ;
+ static S32 getCategoryFromIndex(S32 index) ;
+
+ typedef std::vector<LLFace*> ll_face_list_t;
+ typedef std::vector<LLVOVolume*> ll_volume_list_t;
+
protected:
virtual ~LLViewerTexture();
@@ -146,7 +156,7 @@ public:
virtual BOOL isMissingAsset()const ;
virtual void dump(); // debug info to llinfos
- /*virtual*/ bool bindDefaultImage(const S32 stage = 0) const ;
+ /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ;
/*virtual*/ void forceImmediateUpdate() ;
const LLUUID& getID() const { return mID; }
@@ -154,19 +164,26 @@ public:
void setBoostLevel(S32 level);
S32 getBoostLevel() { return mBoostLevel; }
- //maxVirtualSize of the texture
- void addTextureStats(F32 virtual_size) const ;
- void resetTextureStats(BOOL zero = FALSE);
+ void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const;
+ void resetTextureStats();
+
virtual F32 getMaxVirtualSize() ;
LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;}
S32 getFullWidth() const { return mFullWidth; }
S32 getFullHeight() const { return mFullHeight; }
+ /*virtual*/ void setKnownDrawSize(S32 width, S32 height);
virtual void addFace(LLFace* facep) ;
virtual void removeFace(LLFace* facep) ;
- const ll_face_list_t* getFaceList() const {return &mFaceList ;}
+ S32 getNumFaces() const;
+ const ll_face_list_t* getFaceList() const {return &mFaceList;}
+
+ virtual void addVolume(LLVOVolume* volumep);
+ virtual void removeVolume(LLVOVolume* volumep);
+ S32 getNumVolumes() const;
+ const ll_volume_list_t* getVolumeList() const { return &mVolumeList; }
void generateGLTexture() ;
void destroyGLTexture() ;
@@ -180,7 +197,8 @@ public:
BOOL hasGLTexture() const ;
LLGLuint getTexName() const ;
BOOL createGLTexture() ;
- BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0);
+ BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER);
+ virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void setFilteringOption(LLTexUnit::eTextureFilterOptions option);
void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE);
@@ -188,7 +206,8 @@ public:
BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height);
BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height);
void setGLTextureCreated (bool initialized);
-
+ void setCategory(S32 category) ;
+
LLTexUnit::eTextureAddressMode getAddressMode(void) const ;
S32 getMaxDiscardLevel() const;
S32 getDiscardLevel() const;
@@ -201,8 +220,8 @@ public:
BOOL getMask(const LLVector2 &tc);
F32 getTimePassedSinceLastBound();
BOOL getMissed() const ;
- BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ;
- BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const;
+ BOOL isJustBound()const ;
+ void forceUpdateBindStats(void) const;
U32 getTexelsInAtlas() const ;
U32 getTexelsInGLTexture() const ;
@@ -220,15 +239,23 @@ public:
BOOL getDontDiscard() const { return mDontDiscard; }
//-----------------
+ BOOL isLargeImage() ;
+
+ void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;}
+ BOOL hasParcelMedia() const { return mParcelMedia != NULL;}
+ LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;}
+
/*virtual*/ void updateBindStatsForTester() ;
protected:
void cleanup() ;
- void init(bool firstinit) ;
-
+ void init(bool firstinit) ;
+ void reorganizeFaceList() ;
+ void reorganizeVolumeList() ;
private:
//note: do not make this function public.
/*virtual*/ LLImageGL* getGLTexture() const ;
-
+ virtual void switchToCachedImage();
+
protected:
LLUUID mID;
S32 mBoostLevel; // enum describing priority level
@@ -237,15 +264,26 @@ protected:
BOOL mUseMipMaps ;
S8 mComponents;
mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need?
+ mutable S8 mNeedsGLTexture;
mutable BOOL mNeedsResetMaxVirtualSize ;
- LLFrameTimer mLastReferencedTimer;
-
- ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture
+ mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority.
+ LLFrameTimer mLastReferencedTimer;
//GL texture
LLPointer<LLImageGL> mGLTexturep ;
S8 mDontDiscard; // Keep full res version of this image (for UI, etc)
+ ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture
+ U32 mNumFaces ;
+ LLFrameTimer mLastFaceListUpdateTimer ;
+
+ ll_volume_list_t mVolumeList;
+ U32 mNumVolumes;
+ LLFrameTimer mLastVolumeListUpdateTimer;
+
+ //do not use LLPointer here.
+ LLViewerMediaTexture* mParcelMedia ;
+
protected:
typedef enum
{
@@ -270,7 +308,12 @@ public:
static S32 sMaxBoundTextureMemInMegaBytes;
static S32 sMaxTotalTextureMemInMegaBytes;
static S32 sMaxDesiredTextureMemInBytes ;
- static BOOL sDontLoadVolumeTextures;
+ static S8 sCameraMovingDiscardBias;
+ static S32 sMaxSculptRez ;
+ static S32 sMinLargeImageSize ;
+ static S32 sMaxSmallImageSize ;
+ static BOOL sFreezeImageScalingDown ;//do not scale down image res if set.
+ static F32 sCurrentTime ;
static BOOL sUseTextureAtlas ;
static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects.
@@ -290,9 +333,9 @@ class LLViewerFetchedTexture : public LLViewerTexture
protected:
/*virtual*/ ~LLViewerFetchedTexture();
public:
- LLViewerFetchedTexture(const LLUUID& id, BOOL usemipmaps = TRUE);
+ LLViewerFetchedTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE);
LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps);
- LLViewerFetchedTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps = TRUE);
+ LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE);
public:
static F32 maxDecodePriority();
@@ -328,6 +371,8 @@ public:
bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; }
bool doLoadedCallbacks();
+ void addToCreateTexture();
+
// ONLY call from LLViewerTextureList
BOOL createTexture(S32 usename = 0);
void destroyTexture() ;
@@ -346,9 +391,11 @@ public:
// the priority list, and cause horrible things to happen.
void setDecodePriority(F32 priority = -1.0f);
F32 getDecodePriority() const { return mDecodePriority; };
+
+ void setAdditionalDecodePriority(F32 priority) ;
- // setDesiredDiscardLevel is only used by LLViewerTextureList
- void setDesiredDiscardLevel(S32 discard) { mDesiredDiscardLevel = discard; }
+ void updateVirtualSize() ;
+
S32 getDesiredDiscardLevel() { return mDesiredDiscardLevel; }
void setMinDiscardLevel(S32 discard) { mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); }
@@ -357,7 +404,7 @@ public:
// Override the computation of discard levels if we know the exact output
// size of the image. Used for UI textures to not decode, even if we have
// more data.
- void setKnownDrawSize(S32 width, S32 height);
+ /*virtual*/ void setKnownDrawSize(S32 width, S32 height);
void setIsMissingAsset();
/*virtual*/ BOOL isMissingAsset() const { return mIsMissingAsset; }
@@ -370,15 +417,16 @@ public:
BOOL isInImageList() const {return mInImageList ;}
void setInImageList(BOOL flag) {mInImageList = flag ;}
- const std::string& getLocalFileName() const {return mLocalFileName ;}
LLFrameTimer* getLastPacketTimer() {return &mLastPacketTimer;}
U32 getFetchPriority() const { return mFetchPriority ;}
F32 getDownloadProgress() const {return mDownloadProgress ;}
- LLImageRaw* readBackRawImage(S8 discard_level) ;
+ LLImageRaw* reloadRawImage(S8 discard_level) ;
void destroyRawImage();
+ /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
+ const std::string& getUrl() const {return mUrl;}
//---------------
BOOL isDeleted() ;
BOOL isInactive() ;
@@ -389,13 +437,35 @@ public:
//---------------
void setForSculpt();
- BOOL isForSculpt() const {return mForSculpt;}
+ BOOL forSculpt() const {return mForSculpt;}
+ BOOL isForSculptOnly() const;
+
+ //raw image management
+ void checkCachedRawSculptImage() ;
+ LLImageRaw* getRawImage()const { return mRawImage ;}
+ S32 getRawImageLevel() const {return mRawDiscardLevel;}
+ LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;}
+ S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
+ BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
+ BOOL isRawImageValid()const { return mIsRawImageValid ; }
+ void forceToSaveRawImage(S32 desired_discard = 0) ;
+ void destroySavedRawImage() ;
+ LLImageRaw* getSavedRawImage() ;
+ BOOL hasSavedRawImage() const ;
+ F32 getElapsedLastReferencedSavedRawImageTime() const ;
+ BOOL isFullyLoaded() const;
+
+protected:
+ /*virtual*/ void switchToCachedImage();
private:
void init(bool firstinit) ;
void cleanup() ;
- F32 calcDecodePriorityForUnknownTexture(F32 pixel_priority) ;
+ void saveRawImage() ;
+ BOOL forceFetch() ;
+ void setCachedRawImage() ;
+ BOOL keepReuestedDiscardLevel();
//for atlas
void resetFaceAtlas() ;
@@ -406,6 +476,8 @@ private:
BOOL mFullyLoaded;
protected:
+ std::string mLocalFileName;
+
S32 mOrigWidth;
S32 mOrigHeight;
@@ -413,13 +485,9 @@ protected:
// Used for UI textures to not decode, even if we have more data.
S32 mKnownDrawWidth;
S32 mKnownDrawHeight;
-
- std::string mLocalFileName;
-
- S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space
- S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have
- S32 mMinDiscardLevel;
-
+ BOOL mKnownDrawSizeChanged ;
+ std::string mUrl;
+
S32 mRequestedDiscardLevel;
F32 mRequestedDownloadPriority;
S32 mFetchState;
@@ -427,8 +495,10 @@ protected:
F32 mDownloadProgress;
F32 mFetchDeltaTime;
F32 mRequestDeltaTime;
- S32 mDecodeFrame;
- S32 mVisibleFrame; // decode frame where image was last visible
+ F32 mDecodePriority; // The priority for decoding this image.
+ S32 mMinDiscardLevel;
+ S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space
+ S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have
S8 mNeedsAux; // We need to decode the auxiliary channels
S8 mDecodingAux; // Are we decoding high components
@@ -436,10 +506,10 @@ protected:
S8 mHasFetcher; // We've made a fecth request
S8 mIsFetching; // Fetch request is active
- mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database.
+ mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database.
- F32 mDecodePriority; // The priority for decoding this image.
typedef std::list<LLLoadedCallbackEntry*> callback_list_t;
+ S8 mLoadedCallbackDesiredDiscardLevel;
callback_list_t mLoadedCallbackList;
LLPointer<LLImageRaw> mRawImage;
@@ -449,6 +519,19 @@ protected:
// doing if you use it for anything else! - djs
LLPointer<LLImageRaw> mAuxRawImage;
+ //keep a copy of mRawImage for some special purposes
+ //when mForceToSaveRawImage is set.
+ BOOL mForceToSaveRawImage ;
+ LLPointer<LLImageRaw> mSavedRawImage;
+ S32 mSavedRawDiscardLevel;
+ S32 mDesiredSavedRawDiscardLevel;
+ F32 mLastReferencedSavedRawImageTime ;
+
+ //a small version of the copy of the raw image (<= 64 * 64)
+ LLPointer<LLImageRaw> mCachedRawImage;
+ S32 mCachedRawDiscardLevel;
+ BOOL mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit.
+
LLHost mTargetHost; // if LLHost::invalid, just request from agent's simulator
// Timers
@@ -477,15 +560,17 @@ protected:
/*virtual*/ ~LLViewerLODTexture(){}
public:
- LLViewerLODTexture(const LLUUID& id, BOOL usemipmaps = TRUE);
- LLViewerLODTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps = TRUE);
+ LLViewerLODTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE);
+ LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE);
/*virtual*/ S8 getType() const;
// Process image stats to determine priority/quality requirements.
/*virtual*/ void processTextureStats();
-
+ BOOL isUpdateFrozen() ;
+
private:
void init(bool firstinit) ;
+ void scaleDown() ;
private:
@@ -570,7 +655,7 @@ public:
static LLTexturePipelineTester* sTesterp ;
//returns NULL if tex is not a LLViewerFetchedTexture nor derived from LLViewerFetchedTexture.
- static LLViewerFetchedTexture* staticCastToFetchedTexture(LLViewerTexture* tex, BOOL report_error = FALSE) ;
+ static LLViewerFetchedTexture* staticCastToFetchedTexture(LLTexture* tex, BOOL report_error = FALSE) ;
//
//"find-texture" just check if the texture exists, if yes, return it, otherwise return null.
@@ -592,7 +677,7 @@ public:
static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -601,7 +686,16 @@ public:
static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
+ S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
+ LLGLint internal_format = 0,
+ LLGLenum primary_format = 0,
+ const LLUUID& force_id = LLUUID::null
+ );
+
+ static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,
+ BOOL usemipmap = TRUE,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index b5986c70f5..ee934ab9c5 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -44,6 +44,7 @@
#include "llimagetga.h"
#include "llimagejpeg.h"
#include "llimagepng.h"
+#include "llimageworker.h"
#include "llsdserialize.h"
#include "llsys.h"
@@ -68,10 +69,15 @@
void (*LLViewerTextureList::sUUIDCallback)(void **, const LLUUID&) = NULL;
-const S32 IMAGES_PER_REQUEST = 42;
-const S32 IMAGES_MIN_UPDATES = 4; // Always update the highest N images each frame
-const S32 IMAGES_MAX_PACKET_UPDATES = 1; // Only send N packets of IMAGES_PER_REQUEST in a frame
-const F32 RESEND_IMAGE_REQUEST_TIME = 15.f; // seconds
+U32 LLViewerTextureList::sTextureBits = 0;
+U32 LLViewerTextureList::sTexturePackets = 0;
+S32 LLViewerTextureList::sNumImages = 0;
+LLStat LLViewerTextureList::sNumImagesStat(32, TRUE);
+LLStat LLViewerTextureList::sNumRawImagesStat(32, TRUE);
+LLStat LLViewerTextureList::sGLTexMemStat(32, TRUE);
+LLStat LLViewerTextureList::sGLBoundMemStat(32, TRUE);
+LLStat LLViewerTextureList::sRawMemStat(32, TRUE);
+LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
LLViewerTextureList gTextureList;
static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
@@ -88,7 +94,7 @@ LLViewerTextureList::LLViewerTextureList()
void LLViewerTextureList::init()
{
- mNumImages = 0;
+ sNumImages = 0;
mMaxResidentTexMemInMegaBytes = 0;
mMaxTotalTextureMemInMegaBytes = 0 ;
if (gNoRender)
@@ -172,7 +178,7 @@ static std::string get_texture_list_name()
void LLViewerTextureList::doPrefetchImages()
{
- if (LLAppViewer::instance()->getPurgeCache())
+ if (LLAppViewer::instance()->getPurgeCache())
{
// cache was purged, no point
return;
@@ -197,7 +203,7 @@ void LLViewerTextureList::doPrefetchImages()
if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type)
{
- LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, FALSE, texture_type);
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type);
if (image)
{
image->addTextureStats((F32)pixel_area);
@@ -231,6 +237,10 @@ void LLViewerTextureList::shutdown()
{
continue; // avoid UI, baked, and other special images
}
+ if(!image->getBoundRecently())
+ {
+ continue ;
+ }
S32 desired = image->getDesiredDiscardLevel();
if (desired >= 0 && desired < MAX_DISCARD_LEVEL)
{
@@ -315,24 +325,37 @@ void LLViewerTextureList::restoreGL()
LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
const LLUUID& force_id)
{
- if (gNoRender)
- {
- // Never mind that this ignores image_set_id;
- // getImage() will handle that later.
- return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
- }
-
std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename);
if (full_path.empty())
{
llwarns << "Failed to find local image file: " << filename << llendl;
- return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
+ return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
+ }
+
+ std::string url = "file://" + full_path;
+
+ return getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id);
+}
+
+LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,
+ BOOL usemipmaps,
+ LLViewerTexture::EBoostLevel boost_priority,
+ S8 texture_type,
+ LLGLint internal_format,
+ LLGLenum primary_format,
+ const LLUUID& force_id)
+{
+ if (gNoRender)
+ {
+ // Never mind that this ignores image_set_id;
+ // getImage() will handle that later.
+ return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
}
// generate UUID based on hash of filename
@@ -343,7 +366,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
}
else
{
- new_id.generate(full_path);
+ new_id.generate(url);
}
LLPointer<LLViewerFetchedTexture> imagep = findImage(new_id);
@@ -353,10 +376,10 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
switch(texture_type)
{
case LLViewerTexture::FETCHED_TEXTURE:
- imagep = new LLViewerFetchedTexture(full_path, new_id, usemipmaps);
+ imagep = new LLViewerFetchedTexture(url, new_id, usemipmaps);
break ;
case LLViewerTexture::LOD_TEXTURE:
- imagep = new LLViewerLODTexture(full_path, new_id, usemipmaps);
+ imagep = new LLViewerLODTexture(url, new_id, usemipmaps);
break ;
default:
llerrs << "Invalid texture type " << texture_type << llendl ;
@@ -388,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -400,7 +423,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
if ((&image_id == NULL) || image_id.isNull())
{
- return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE));
+ return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI));
}
LLPointer<LLViewerFetchedTexture> imagep = findImage(image_id);
@@ -418,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
//when this function is called, there is no such texture in the gTextureList with image_id.
LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -428,18 +451,15 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
switch(texture_type)
{
case LLViewerTexture::FETCHED_TEXTURE:
- imagep = new LLViewerFetchedTexture(image_id, usemipmaps);
+ imagep = new LLViewerFetchedTexture(image_id, request_from_host, usemipmaps);
break ;
case LLViewerTexture::LOD_TEXTURE:
- imagep = new LLViewerLODTexture(image_id, usemipmaps);
+ imagep = new LLViewerLODTexture(image_id, request_from_host, usemipmaps);
break ;
default:
llerrs << "Invalid texture type " << texture_type << llendl ;
}
- // Might want to request from host other than where the agent is. JC
- imagep->setTargetHost(request_from_host);
-
if (internal_format && primary_format)
{
imagep->setExplicitFormat(internal_format, primary_format);
@@ -482,7 +502,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl;
}
- llverify((mImageList.insert(image)).second == true);
+ if ((mImageList.insert(image)).second != true)
+ {
+ llwarns << "BAD STUFF! (mImageList.insert(image)).second != true" << llendl;
+ }
image->setInImageList(TRUE) ;
}
@@ -499,7 +522,10 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
}
llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
}
- llverify(mImageList.erase(image) == 1);
+ if (mImageList.erase(image) != 1)
+ {
+ llwarns << "BAD STUFF! mImageList.erase(image) != 1" << llendl;
+ }
image->setInImageList(FALSE) ;
}
@@ -517,7 +543,7 @@ void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image)
{
llwarns << "Image with ID " << image_id << " already in list" << llendl;
}
- mNumImages++;
+ sNumImages++;
addImageToList(new_image);
mUUIDMap[image_id] = new_image;
@@ -534,7 +560,7 @@ void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image)
}
llverify(mUUIDMap.erase(image->getID()) == 1);
- mNumImages--;
+ sNumImages--;
removeImageFromList(image);
}
}
@@ -554,7 +580,9 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images");
void LLViewerTextureList::updateImages(F32 max_time)
{
- LLViewerStats::getInstance()->mNumImagesStat.addValue(mNumImages);
+ LLAppViewer::getTextureFetch()->setTextureBandwidth(LLViewerStats::getInstance()->mTextureKBitStat.getMeanPerSec());
+
+ LLViewerStats::getInstance()->mNumImagesStat.addValue(sNumImages);
LLViewerStats::getInstance()->mNumRawImagesStat.addValue(LLImageRaw::sRawImageCount);
LLViewerStats::getInstance()->mGLTexMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sGlobalTextureMemoryInBytes));
LLViewerStats::getInstance()->mGLBoundMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sBoundTextureMemoryInBytes));
@@ -562,10 +590,13 @@ void LLViewerTextureList::updateImages(F32 max_time)
LLViewerStats::getInstance()->mFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory));
updateImagesDecodePriorities();
+
+ F32 total_max_time = max_time;
max_time -= updateImagesFetchTextures(max_time);
- max_time = llmin(llmax(max_time, 0.001f*10.f*gFrameIntervalSeconds), 0.001f);
+
+ max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
max_time -= updateImagesCreateTextures(max_time);
- max_time = llmin(llmax(max_time, 0.001f*10.f*gFrameIntervalSeconds), 0.001f);
+
if (!mDirtyTextureList.empty())
{
LLFastTimer t(FTM_IMAGE_MARK_DIRTY);
@@ -578,7 +609,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
{
//trigger loaded callbacks on local textures immediately
LLViewerFetchedTexture* image = *iter++;
- if (!image->getLocalFileName().empty())
+ if (!image->getUrl().empty())
{
// Do stuff to handle callbacks, update priorities, etc.
didone = image->doLoadedCallbacks();
@@ -589,10 +620,6 @@ void LLViewerTextureList::updateImages(F32 max_time)
didone = image->doLoadedCallbacks();
}
}
- if (!gNoRender && !gGLManager.mIsDisabled)
- {
- LLViewerMedia::updateMedia();
- }
updateImagesUpdateStats();
}
@@ -636,6 +663,14 @@ void LLViewerTextureList::updateImagesDecodePriorities()
}
else
{
+ if(imagep->hasSavedRawImage())
+ {
+ if(imagep->getElapsedLastReferencedSavedRawImageTime() > MAX_INACTIVE_TIME)
+ {
+ imagep->destroySavedRawImage() ;
+ }
+ }
+
if(imagep->isDeleted())
{
continue ;
@@ -766,74 +801,76 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
const size_t max_update_count = llmin((S32) (1024*10.f*gFrameIntervalSeconds)+1, 256);
// 32 high priority entries
- std::set<LLViewerFetchedTexture*> entries;
+ typedef std::vector<LLViewerFetchedTexture*> entries_list_t;
+ entries_list_t entries;
size_t update_counter = llmin(max_priority_count, mImageList.size());
image_priority_list_t::iterator iter1 = mImageList.begin();
while(update_counter > 0)
{
- // added extra granularity and verbosity for crash logging during 1.19.1 RC. -Brad
- if(iter1 == mImageList.end())
- {
- llerrs << "DEV-12002: update_counter not calculated correctly!" << llendl;
- return 0.f;
- }
-
- LLPointer<LLViewerFetchedTexture> const & ptr = *iter1;
-
- LLViewerFetchedTexture * img = ptr.get();
-
- // added extra granularity and verbosity for crash logging during 1.19.1 RC. -Brad
- if(img == NULL)
- {
- llwarns << "DEV-12002: image is NULL!" << llendl;
- }
-
- entries.insert(img);
-
+ entries.push_back(*iter1);
+
++iter1;
update_counter--;
}
// 256 cycled entries
- update_counter = llmin(max_update_count, mUUIDMap.size());
- uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID);
- while(update_counter > 0)
+ update_counter = llmin(max_update_count, mUUIDMap.size());
+ if(update_counter > 0)
{
- if (iter2 == mUUIDMap.end())
+ uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID);
+ uuid_map_t::iterator iter2p = iter2;
+ while(update_counter > 0)
{
- iter2 = mUUIDMap.begin();
+ if (iter2 == mUUIDMap.end())
+ {
+ iter2 = mUUIDMap.begin();
+ }
+ entries.push_back(iter2->second);
+ iter2p = iter2++;
+ update_counter--;
}
- mLastFetchUUID = iter2->first;
- entries.insert(iter2->second);
- ++iter2;
- update_counter--;
+
+ mLastFetchUUID = iter2p->first;
}
+ S32 fetch_count = 0;
S32 min_count = max_priority_count + max_update_count/4;
- for (std::set<LLViewerFetchedTexture*>::iterator iter3 = entries.begin();
+ for (entries_list_t::iterator iter3 = entries.begin();
iter3 != entries.end(); )
{
LLPointer<LLViewerFetchedTexture> imagep = *iter3++;
- imagep->updateFetch();
+ bool fetching = imagep->updateFetch();
+ if (fetching)
+ {
+ fetch_count++;
+ }
if (min_count <= 0 && image_op_timer.getElapsedTimeF32() > max_time)
{
break;
}
min_count--;
}
+ if (fetch_count == 0)
+ {
+ gDebugTimers[0].pause();
+ }
+ else
+ {
+ gDebugTimers[0].unpause();
+ }
return image_op_timer.getElapsedTimeF32();
}
void LLViewerTextureList::updateImagesUpdateStats()
{
- if (mUpdateStats)
+ if (mUpdateStats && mForceResetTextureStats)
{
for (image_priority_list_t::iterator iter = mImageList.begin();
iter != mImageList.end(); )
{
LLViewerFetchedTexture* imagep = *iter++;
- imagep->resetTextureStats(mForceResetTextureStats);
+ imagep->resetTextureStats();
}
mUpdateStats = FALSE;
mForceResetTextureStats = FALSE;
@@ -1019,6 +1056,9 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
return compressedImage;
}
+const S32 MIN_VIDEO_RAM = 32;
+const S32 MAX_VIDEO_RAM = 512; // 512MB max for performance reasons.
+
// Returns min setting for TextureMemory (in MB)
S32 LLViewerTextureList::getMinVideoRamSetting()
{
@@ -1137,13 +1177,13 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d
if (msg->getReceiveCompressedSize())
{
- gTextureList.mTextureBits += msg->getReceiveCompressedSize() * 8;
+ gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8;
}
else
{
- gTextureList.mTextureBits += msg->getReceiveSize() * 8;
+ gTextureList.sTextureBits += msg->getReceiveSize() * 8;
}
- gTextureList.mTexturePackets++;
+ gTextureList.sTexturePackets++;
U8 codec;
U16 packets;
@@ -1171,7 +1211,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d
U8 *data = new U8[data_size];
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
- LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
if (!image)
{
delete [] data;
@@ -1202,13 +1242,13 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
if (msg->getReceiveCompressedSize())
{
- gTextureList.mTextureBits += msg->getReceiveCompressedSize() * 8;
+ gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8;
}
else
{
- gTextureList.mTextureBits += msg->getReceiveSize() * 8;
+ gTextureList.sTextureBits += msg->getReceiveSize() * 8;
}
- gTextureList.mTexturePackets++;
+ gTextureList.sTexturePackets++;
//llprintline("Start decode, image header...");
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
@@ -1235,7 +1275,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
U8 *data = new U8[data_size];
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
- LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
if (!image)
{
delete [] data;
@@ -1308,7 +1348,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByID(image_id, use_mips, scale_rect, priority);
+ return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1322,21 +1362,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority);
+ return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips, const LLRect& scale_rect, S32 boost_priority )
+ BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
{
- if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+ if (boost_priority == LLViewerTexture::BOOST_NONE)
+ {
+ boost_priority = LLViewerTexture::BOOST_UI;
+ }
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
return loadUIImage(imagep, name, use_mips, scale_rect);
}
LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
- BOOL use_mips, const LLRect& scale_rect, S32 boost_priority)
+ BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
{
- if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+ if (boost_priority == LLViewerTexture::BOOST_NONE)
+ {
+ boost_priority = LLViewerTexture::BOOST_UI;
+ }
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
}
@@ -1401,7 +1447,7 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
// for images grabbed from local files, apply clipping rectangle to restore original dimensions
// from power-of-2 gl image
- if (success && imagep.notNull() && src_vi && !src_vi->getLocalFileName().empty())
+ if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0))
{
F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth();
F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight();
@@ -1414,6 +1460,8 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
llclamp((F32)scale_rect.mRight / (F32)imagep->getWidth(), 0.f, 1.f),
llclamp((F32)scale_rect.mBottom / (F32)imagep->getHeight(), 0.f, 1.f)));
}
+
+ imagep->onImageLoaded();
}
}
}
@@ -1423,14 +1471,14 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
Mandatory<std::string> name;
Optional<std::string> file_name;
Optional<bool> preload;
- Optional<LLRect> scale_rect;
+ Optional<LLRect> scale;
Optional<bool> use_mips;
UIImageDeclaration()
: name("name"),
file_name("file_name"),
preload("preload", false),
- scale_rect("scale"),
+ scale("scale"),
use_mips("use_mips", false)
{}
};
@@ -1458,6 +1506,11 @@ bool LLUIImageList::initFromFile()
llwarns << "Unable to parse UI image list file " << base_file_path << llendl;
return false;
}
+ if (!root->hasAttribute("version"))
+ {
+ llwarns << "No valid version number in UI image list file " << base_file_path << llendl;
+ return false;
+ }
std::vector<std::string> paths;
// path to current selected skin
@@ -1515,7 +1568,7 @@ bool LLUIImageList::initFromFile()
{
continue;
}
- preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale_rect);
+ preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale);
}
if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload"))
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index fda57ce981..ab55bfd04d 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -131,7 +131,7 @@ private:
LLViewerFetchedTexture * getImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -140,7 +140,16 @@ private:
LLViewerFetchedTexture * getImageFromFile(const std::string& filename,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
+ S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
+ LLGLint internal_format = 0,
+ LLGLenum primary_format = 0,
+ const LLUUID& force_id = LLUUID::null
+ );
+
+ LLViewerFetchedTexture* getImageFromUrl(const std::string& url,
+ BOOL usemipmap = TRUE,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -149,7 +158,7 @@ private:
LLViewerFetchedTexture* createImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -159,7 +168,7 @@ private:
// Request image from a specific host, used for baked avatar textures.
// Implemented in header in case someone changes default params above. JC
LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host)
- { return getImage(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }
+ { return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }
public:
typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t;
@@ -190,11 +199,18 @@ private:
LLFrameTimer mForceDecodeTimer;
public:
- U32 mTextureBits;
- U32 mTexturePackets;
+ static U32 sTextureBits;
+ static U32 sTexturePackets;
+
+ static LLStat sNumImagesStat;
+ static LLStat sNumRawImagesStat;
+ static LLStat sGLTexMemStat;
+ static LLStat sGLBoundMemStat;
+ static LLStat sRawMemStat;
+ static LLStat sFormattedMemStat;
private:
- S32 mNumImages;
+ static S32 sNumImages;
static void (*sUUIDCallback)(void**, const LLUUID &);
};
@@ -213,9 +229,11 @@ public:
static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
private:
LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+ BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
LLUIImagePtr loadUIImageByID(const LLUUID& id,
- BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+ BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp
index b088ef0730..fad398e00b 100644
--- a/indra/newview/llviewervisualparam.cpp
+++ b/indra/newview/llviewervisualparam.cpp
@@ -46,6 +46,7 @@
LLViewerVisualParamInfo::LLViewerVisualParamInfo()
:
mWearableType( WT_INVALID ),
+ mCrossWearable(FALSE),
mCamDist( 0.5f ),
mCamAngle( 0.f ),
mCamElevation( 0.f ),
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 3550a46fbf..1a3975eb99 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -111,6 +111,7 @@ public:
F32 getSimpleMax() const { return getInfo()->mSimpleMax; }
BOOL getCrossWearable() const { return getInfo()->mCrossWearable; }
+
};
#endif // LL_LLViewerVisualParam_H
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index ba32e07464..1669ce6312 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
+#include "llviewerwindow.h"
+
#if LL_WINDOWS
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
@@ -46,10 +48,10 @@
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
#include "llviewermenu.h"
-#include "llviewerwindow.h"
#include "llviewquery.h"
#include "llxmltree.h"
+#include "llslurl.h"
//#include "llviewercamera.h"
#include "llrender.h"
@@ -79,10 +81,12 @@
#include "timing.h"
#include "llviewermenu.h"
#include "lltooltip.h"
+#include "llmediaentry.h"
+#include "llurldispatcher.h"
+#include "llurlsimstring.h"
// newview includes
#include "llagent.h"
-#include "llalertdialog.h"
#include "llbox.h"
#include "llconsole.h"
#include "llviewercontrol.h"
@@ -101,8 +105,6 @@
#include "llfloaterbuildoptions.h"
#include "llfloaterbuyland.h"
#include "llfloatercamera.h"
-#include "llfloaterchat.h"
-#include "llfloaterchatterbox.h"
#include "llfloatercustomize.h"
#include "llfloaterland.h"
#include "llfloaterinspect.h"
@@ -121,6 +123,7 @@
#include "llhudview.h"
#include "llimagebmp.h"
#include "llimagej2c.h"
+#include "llimageworker.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
@@ -128,8 +131,6 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
-#include "llnotify.h"
-#include "lloverlaybar.h"
#include "llpreviewtexture.h"
#include "llprogressview.h"
#include "llresmgr.h"
@@ -148,7 +149,6 @@
#include "lltexturefetch.h"
#include "lltextureview.h"
#include "lltool.h"
-#include "lltoolbar.h"
#include "lltoolcomp.h"
#include "lltooldraganddrop.h"
#include "lltoolface.h"
@@ -160,7 +160,6 @@
#include "lltoolselectland.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
-#include "lluploaddialog.h"
#include "llurldispatcher.h" // SLURL from other app instance
#include "llvieweraudio.h"
#include "llviewercamera.h"
@@ -183,7 +182,6 @@
#include "llworldmapview.h"
#include "pipeline.h"
#include "llappviewer.h"
-#include "llurlsimstring.h"
#include "llviewerdisplay.h"
#include "llspatialpartition.h"
#include "llviewerjoystick.h"
@@ -192,7 +190,10 @@
#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llagentui.h"
+#include "llwearablelist.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llnotificationmanager.h"
#include "llfloaternotificationsconsole.h"
@@ -232,6 +233,7 @@ S32 gDebugRaycastFaceHit;
BOOL gDisplayWindInfo = FALSE;
BOOL gDisplayCameraPos = FALSE;
BOOL gDisplayFOV = FALSE;
+BOOL gDisplayBadge = FALSE;
S32 CHAT_BAR_HEIGHT = 28;
S32 OVERLAY_BAR_HEIGHT = 20;
@@ -256,19 +258,21 @@ public:
virtual void recordMessage(LLError::ELevel level,
const std::string& message)
{
- // only log warnings to chat console
- if (level == LLError::LEVEL_WARN)
- {
- LLFloaterChat* chat_floater = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat");
- if (chat_floater && gSavedSettings.getBOOL("WarningsAsChat"))
- {
- LLChat chat;
- chat.mText = message;
- chat.mSourceType = CHAT_SOURCE_SYSTEM;
+ //FIXME: this is NOT thread safe, and will do bad things when a warning is issued from a non-UI thread
- chat_floater->addChat(chat, FALSE, FALSE);
- }
- }
+ // only log warnings to chat console
+ //if (level == LLError::LEVEL_WARN)
+ //{
+ //LLFloaterChat* chat_floater = LLFloaterReg::findTypedInstance<LLFloaterChat>("chat");
+ //if (chat_floater && gSavedSettings.getBOOL("WarningsAsChat"))
+ //{
+ // LLChat chat;
+ // chat.mText = message;
+ // chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ // chat_floater->addChat(chat, FALSE, FALSE);
+ //}
+ //}
}
};
@@ -314,7 +318,7 @@ public:
mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
// Draw stuff growing up from right lower corner of screen
- U32 xpos = mWindow->getWindowWidth() - 350;
+ U32 xpos = mWindow->getWindowWidthScaled() - 350;
U32 ypos = 64;
const U32 y_inc = 20;
@@ -330,7 +334,9 @@ public:
S32 hours = (S32)(time / (60*60));
S32 mins = (S32)((time - hours*(60*60)) / 60);
S32 secs = (S32)((time - hours*(60*60) - mins*60));
- addText(xpos, ypos, llformat(" Debug %d: %d:%02d:%02d", idx, hours,mins,secs)); ypos += y_inc2;
+ std::string label = gDebugTimerLabel[idx];
+ if (label.empty()) label = llformat("Debug: %d", idx);
+ addText(xpos, ypos, llformat(" %s: %d:%02d:%02d", label.c_str(), hours,mins,secs)); ypos += y_inc2;
}
F32 time = gFrameTimeSeconds;
@@ -417,6 +423,11 @@ public:
addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * LLViewerCamera::getInstance()->getView()));
ypos += y_inc;
}
+ if (gDisplayBadge)
+ {
+ addText(xpos, ypos+(y_inc/2), llformat("Hippos!", RAD_TO_DEG * LLViewerCamera::getInstance()->getView()));
+ ypos += y_inc * 2;
+ }
/*if (LLViewerJoystick::getInstance()->getOverrideCamera())
{
@@ -597,9 +608,8 @@ void LLViewerWindow::updateDebugText()
BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
- std::string buttonname;
- std::string buttonstatestr;
- BOOL handled = FALSE;
+ const char* buttonname = "";
+ const char* buttonstatestr = "";
S32 x = pos.mX;
S32 y = pos.mY;
x = llround((F32)x / mDisplayScale.mV[VX]);
@@ -694,7 +704,10 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
}
else
{
- handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
+ if (top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask))
+ {
+ return TRUE;
+ }
}
}
@@ -712,34 +725,12 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl;
}
- if (down)
+ // Do not allow tool manager to handle mouseclicks if we have disconnected
+ if(!gDisconnected && LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
{
- if (gDisconnected)
- {
- return FALSE;
- }
-
- if(LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
- {
- return TRUE;
- }
+ return TRUE;
}
- else
- {
- if( !handled )
- {
- handled = mRootView->handleAnyMouseClick(x, y, mask, clicktype, down);
- }
- if( !handled )
- {
- LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
- if (tool)
- {
- handled = tool->handleAnyMouseClick(x, y, mask, clicktype, down);
- }
- }
- }
// If we got this far on a down-click, it wasn't handled.
// Up-clicks, though, are always handled as far as the OS is concerned.
@@ -814,6 +805,152 @@ BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MAS
// Always handled as far as the OS is concerned.
return TRUE;
}
+
+LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data)
+{
+ LLWindowCallbacks::DragNDropResult result = LLWindowCallbacks::DND_NONE;
+
+ const bool prim_media_dnd_enabled = gSavedSettings.getBOOL("PrimMediaDragNDrop");
+ const bool slurl_dnd_enabled = gSavedSettings.getBOOL("SLURLDragNDrop");
+
+ if ( prim_media_dnd_enabled || slurl_dnd_enabled )
+ {
+ switch(action)
+ {
+ // Much of the handling for these two cases is the same.
+ case LLWindowCallbacks::DNDA_TRACK:
+ case LLWindowCallbacks::DNDA_DROPPED:
+ case LLWindowCallbacks::DNDA_START_TRACKING:
+ {
+ bool drop = (LLWindowCallbacks::DNDA_DROPPED == action);
+
+ if (slurl_dnd_enabled)
+ {
+ // special case SLURLs
+ if ( LLSLURL::isSLURL( data ) )
+ {
+ if (drop)
+ {
+ LLURLDispatcher::dispatch( data, NULL, true );
+ LLURLSimString::setStringRaw( LLSLURL::stripProtocol( data ) );
+ LLPanelLogin::refreshLocation( true );
+ LLPanelLogin::updateLocationUI();
+ }
+ return LLWindowCallbacks::DND_MOVE;
+ };
+ }
+
+ if (prim_media_dnd_enabled)
+ {
+ LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY, TRUE /*BOOL pick_transparent*/ );
+
+ LLUUID object_id = pick_info.getObjectID();
+ S32 object_face = pick_info.mObjectFace;
+ std::string url = data;
+
+ lldebugs << "Object: picked at " << pos.mX << ", " << pos.mY << " - face = " << object_face << " - URL = " << url << llendl;
+
+ LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject()));
+
+ if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())
+ {
+ LLTextureEntry *te = obj->getTE(object_face);
+ if (te)
+ {
+ if (drop)
+ {
+ // object does NOT have media already
+ if ( ! te->hasMedia() )
+ {
+ // we are allowed to modify the object
+ if ( obj->permModify() )
+ {
+ // Create new media entry
+ LLSD media_data;
+ // XXX Should we really do Home URL too?
+ media_data[LLMediaEntry::HOME_URL_KEY] = url;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
+ obj->syncMediaData(object_face, media_data, true, true);
+ // XXX This shouldn't be necessary, should it ?!?
+ if (obj->getMediaImpl(object_face))
+ obj->getMediaImpl(object_face)->navigateReload();
+ obj->sendMediaDataUpdate();
+
+ result = LLWindowCallbacks::DND_COPY;
+ }
+ }
+ else
+ // object HAS media already
+ {
+ // URL passes the whitelist
+ if (te->getMediaData()->checkCandidateUrl( url ) )
+ {
+ // we are allowed to modify the object or we have navigate permissions
+ // NOTE: Design states you you can change the URL if you have media
+ // navigate permissions even if you do not have prim modify rights
+ if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )
+ {
+ // just navigate to the URL
+ if (obj->getMediaImpl(object_face))
+ {
+ obj->getMediaImpl(object_face)->navigateTo(url);
+ }
+ else
+ {
+ // This is very strange. Navigation should
+ // happen via the Impl, but we don't have one.
+ // This sends it to the server, which /should/
+ // trigger us getting it. Hopefully.
+ LLSD media_data;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ obj->syncMediaData(object_face, media_data, true, true);
+ obj->sendMediaDataUpdate();
+ }
+ result = LLWindowCallbacks::DND_LINK;
+ }
+ }
+ }
+ LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
+ mDragHoveredObject = NULL;
+
+ }
+ else
+ {
+ // Check the whitelist, if there's media (otherwise just show it)
+ if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))
+ {
+ if ( obj != mDragHoveredObject)
+ {
+ // Highlight the dragged object
+ LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
+ mDragHoveredObject = obj;
+ LLSelectMgr::getInstance()->highlightObjectOnly(mDragHoveredObject);
+ }
+ result = (! te->hasMedia()) ? LLWindowCallbacks::DND_COPY : LLWindowCallbacks::DND_LINK;
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case LLWindowCallbacks::DNDA_STOP_TRACKING:
+ // The cleanup case below will make sure things are unhilighted if necessary.
+ break;
+ }
+
+ if (prim_media_dnd_enabled &&
+ result == LLWindowCallbacks::DND_NONE && !mDragHoveredObject.isNull())
+ {
+ LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
+ mDragHoveredObject = NULL;
+ }
+ }
+
+ return result;
+}
BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
@@ -860,6 +997,7 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window)
// Note: we won't get this if we have captured the mouse.
llassert( gFocusMgr.getMouseCapture() == NULL );
mMouseInWindow = FALSE;
+ LLToolTipMgr::instance().blockToolTips();
}
BOOL LLViewerWindow::handleCloseRequest(LLWindow *window)
@@ -1006,13 +1144,17 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
else
{
mActive = FALSE;
- if (gSavedSettings.getBOOL("AllowIdleAFK"))
+
+ if (gSavedSettings.getS32("AFKTimeout"))
{
gAgent.setAFK();
}
// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues
- gAgent.changeCameraToDefault();
+ if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ {
+ gAgent.changeCameraToDefault();
+ }
send_agent_pause();
@@ -1193,9 +1335,9 @@ LLViewerWindow::LLViewerWindow(
mActive(TRUE),
mWantFullscreen(fullscreen),
mShowFullscreenProgress(FALSE),
- mWindowRect(0, height, width, 0),
- mVirtualWindowRect(0, height, width, 0),
- mWorldViewRect(0, height, width, 0),
+ mWindowRectRaw(0, height, width, 0),
+ mWindowRectScaled(0, height, width, 0),
+ mWorldViewRectRaw(0, height, width, 0),
mLeftMouseDown(FALSE),
mMiddleMouseDown(FALSE),
mRightMouseDown(FALSE),
@@ -1209,7 +1351,7 @@ LLViewerWindow::LLViewerWindow(
mStatesDirty(false),
mIsFullscreenChecked(false),
mCurrResolutionIndex(0),
- mViewerWindowListener(new LLViewerWindowListener("LLViewerWindow", this))
+ mViewerWindowListener(new LLViewerWindowListener(this))
{
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
@@ -1264,8 +1406,8 @@ LLViewerWindow::LLViewerWindow(
{
LLCoordWindow size;
mWindow->getSize(&size);
- mWindowRect.set(0, size.mY, size.mX, 0);
- mVirtualWindowRect.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0);
+ mWindowRectRaw.set(0, size.mY, size.mX, 0);
+ mWindowRectScaled.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0);
}
LLFontManager::initClass();
@@ -1304,6 +1446,7 @@ LLViewerWindow::LLViewerWindow(
// Init the image list. Must happen after GL is initialized and before the images that
// LLViewerWindow needs are requested.
+ LLImageGL::initClass(LLViewerTexture::MAX_GL_IMAGE_CATEGORY) ;
gTextureList.init();
LLViewerTextureManager::init() ;
gBumpImageList.init();
@@ -1320,15 +1463,15 @@ LLViewerWindow::LLViewerWindow(
// Create container for all sub-views
LLView::Params rvp;
rvp.name("root");
- rvp.rect(mVirtualWindowRect);
+ rvp.rect(mWindowRectScaled);
rvp.mouse_opaque(false);
rvp.follows.flags(FOLLOWS_NONE);
mRootView = LLUICtrlFactory::create<LLRootView>(rvp);
LLUI::setRootView(mRootView);
// Make avatar head look forward at start
- mCurrentMousePoint.mX = getWindowWidth() / 2;
- mCurrentMousePoint.mY = getWindowHeight() / 2;
+ mCurrentMousePoint.mX = getWindowWidthScaled() / 2;
+ mCurrentMousePoint.mY = getWindowHeightScaled() / 2;
gShowOverlayTitle = gSavedSettings.getBOOL("ShowOverlayTitle");
mOverlayTitle = gSavedSettings.getString("OverlayTitle");
@@ -1340,6 +1483,7 @@ LLViewerWindow::LLViewerWindow(
mDebugText = new LLDebugText(this);
+ mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
}
void LLViewerWindow::initGLDefaults()
@@ -1373,10 +1517,14 @@ void LLViewerWindow::initGLDefaults()
gCylinder.prerender();
}
+struct MainPanel : public LLPanel
+{
+};
+
void LLViewerWindow::initBase()
{
- S32 height = getWindowHeight();
- S32 width = getWindowWidth();
+ S32 height = getWindowHeightScaled();
+ S32 width = getWindowWidthScaled();
LLRect full_window(0, height, width, 0);
@@ -1396,30 +1544,20 @@ void LLViewerWindow::initBase()
// Create the floater view at the start so that other views can add children to it.
// (But wait to add it as a child of the root view so that it will be in front of the
// other views.)
+ MainPanel* main_view = new MainPanel();
+ LLUICtrlFactory::instance().buildPanel(main_view, "main_view.xml");
+ main_view->setShape(full_window);
+ getRootView()->addChild(main_view);
+
+ // placeholder widget that controls where "world" is rendered
+ mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
+ mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
+ mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
// Constrain floaters to inside the menu and status bar regions.
- LLRect floater_view_rect = full_window;
- // make space for menu bar
- floater_view_rect.mTop -= MENU_BAR_HEIGHT;
-
- LLFloaterView::Params fvparams;
- fvparams.name("Floater View");
- fvparams.rect(floater_view_rect);
- fvparams.mouse_opaque(false);
- fvparams.follows.flags(FOLLOWS_ALL);
- fvparams.tab_stop(false);
- gFloaterView = LLUICtrlFactory::create<LLFloaterView> (fvparams);
-
- LLSnapshotFloaterView::Params snapParams;
- snapParams.name("Snapshot Floater View");
- snapParams.rect(full_window);
- snapParams.enabled(false);
- gSnapshotFloaterView = LLUICtrlFactory::create<LLSnapshotFloaterView> (snapParams);
+ gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
+ gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
- // Snapshot floater must start invisible otherwise it eats all
- // the tooltips. JC
- gSnapshotFloaterView->setVisible(FALSE);
-
// Console
llassert( !gConsole );
LLConsole::Params cp;
@@ -1443,43 +1581,20 @@ void LLViewerWindow::initBase()
}
#endif
- // Debug view over the console
- LLDebugView::Params debug_p;
- debug_p.name("DebugView");
- debug_p.rect(full_window);
- debug_p.follows.flags(FOLLOWS_ALL);
- debug_p.visible(true);
- gDebugView = LLUICtrlFactory::create<LLDebugView>(debug_p);
- getRootView()->addChild(gDebugView);
-
- // Add floater view at the end so it will be on top, and give it tab priority over others
- getRootView()->addChild(gFloaterView, -1);
- getRootView()->addChild(gSnapshotFloaterView);
-
- // notify above floaters!
- LLRect notify_rect = floater_view_rect;
- LLNotifyBoxView::Params p;
- p.name("notify_container");
- p.rect(notify_rect);
- p.mouse_opaque(false);
- p.follows.flags(FOLLOWS_ALL);
- gNotifyBoxView = LLUICtrlFactory::create<LLNotifyBoxView> (p);
- getRootView()->addChild(gNotifyBoxView, -2);
-
- // View for tooltips
- LLToolTipView::Params hvp;
- hvp.name("tooltip view");
- hvp.rect(full_window);
- hvp.follows.flags(FOLLOWS_ALL);
- gToolTipView = LLUICtrlFactory::create<LLToolTipView>(hvp);
- gToolTipView->setFollowsAll();
- getRootView()->addChild(gToolTipView);
+ gDebugView = getRootView()->getChild<LLDebugView>("DebugView");
+ gDebugView->init();
+ gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view");
// Add the progress bar view (startup view), which overrides everything
mProgressView = new LLProgressView(full_window);
getRootView()->addChild(mProgressView);
setShowProgress(FALSE);
setProgressCancelButtonVisible(FALSE);
+
+ gMenuHolder = getRootView()->getChild<LLViewerMenuHolderGL>("Menu Holder");
+
+ LLMenuGL::sMenuContainer = gMenuHolder;
+
}
void LLViewerWindow::initWorldUI()
@@ -1488,24 +1603,19 @@ void LLViewerWindow::initWorldUI()
S32 width = mRootView->getRect().getWidth();
LLRect full_window(0, height, width, 0);
- gIMMgr = LLIMMgr::getInstance();
- // side tray
- getRootView()->addChild(LLSideTray::getInstance());
+ gIMMgr = LLIMMgr::getInstance();
getRootView()->sendChildToFront(gFloaterView);
getRootView()->sendChildToFront(gSnapshotFloaterView);
// new bottom panel
- LLRect rc = LLBottomTray::getInstance()->getRect();
- rc.mLeft = 0;
- rc.mRight = mRootView->getRect().getWidth();
- LLBottomTray::getInstance()->reshape(rc.getWidth(),rc.getHeight(),FALSE);
- LLBottomTray::getInstance()->setRect(rc);
-
- // Pre initialize instance communicate instance;
- // currently needs to happen before initializing chat or IM
- LLFloaterReg::getInstance("communicate");
+ LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container");
+ LLBottomTray* bottom_tray = LLBottomTray::getInstance();
+ bottom_tray->setShape(bottom_tray_container->getLocalRect());
+ bottom_tray->setFollowsAll();
+ bottom_tray_container->addChild(bottom_tray);
+ bottom_tray_container->setVisible(TRUE);
LLRect morph_view_rect = full_window;
morph_view_rect.stretch( -STATUS_BAR_HEIGHT );
@@ -1517,17 +1627,6 @@ void LLViewerWindow::initWorldUI()
gMorphView = LLUICtrlFactory::create<LLMorphView>(mvp);
getRootView()->addChild(gMorphView);
- // Make space for nav bar.
- LLNavigationBar* navbar = LLNavigationBar::getInstance();
- LLRect floater_view_rect = gFloaterView->getRect();
- LLRect notify_view_rect = gNotifyBoxView->getRect();
- floater_view_rect.mTop -= navbar->getDefNavBarHeight();
- floater_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight();
- notify_view_rect.mTop -= navbar->getDefNavBarHeight();
- notify_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight();
- gFloaterView->setRect(floater_view_rect);
- gNotifyBoxView->setRect(notify_view_rect);
-
LLWorldMapView::initClass();
// Force gFloaterWorldMap to initialize
@@ -1538,31 +1637,32 @@ void LLViewerWindow::initWorldUI()
LLFloaterReg::hideInstance("build");
// Status bar
- S32 menu_bar_height = gMenuBarView->getRect().getHeight();
- LLRect root_rect = getRootView()->getRect();
- LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height);
- gStatusBar = new LLStatusBar(status_rect);
- gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
-
- gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE);
- gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight());
+ LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container");
+ gStatusBar = new LLStatusBar(status_bar_container->getLocalRect());
+ gStatusBar->setFollowsAll();
+ gStatusBar->setShape(status_bar_container->getLocalRect());
// sync bg color with menu bar
gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() );
+ status_bar_container->addChild(gStatusBar);
+ status_bar_container->setVisible(TRUE);
// Navigation bar
- navbar->reshape(root_rect.getWidth(), navbar->getRect().getHeight(), TRUE); // *TODO: redundant?
- navbar->translate(0, root_rect.getHeight() - menu_bar_height - navbar->getRect().getHeight()); // FIXME
- navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get());
+ LLPanel* nav_bar_container = getRootView()->getChild<LLPanel>("nav_bar_container");
+ LLNavigationBar* navbar = LLNavigationBar::getInstance();
+ navbar->setShape(nav_bar_container->getLocalRect());
+ navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get());
+ nav_bar_container->addChild(navbar);
+ nav_bar_container->setVisible(TRUE);
if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
{
- toggle_show_navigation_panel(LLSD(0));
+ navbar->showNavigationPanel(FALSE);
}
if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"))
{
- toggle_show_favorites_panel(LLSD(0));
+ navbar->showFavoritesPanel(FALSE);
}
if (!gSavedSettings.getBOOL("ShowCameraButton"))
@@ -1585,19 +1685,6 @@ void LLViewerWindow::initWorldUI()
LLBottomTray::getInstance()->showGestureButton(FALSE);
}
- getRootView()->addChild(gStatusBar);
- getRootView()->addChild(navbar);
-
-
- //sidetray
- //then notify area
- //then menu
- //getRootView()->sendChildToFront(LLSideTray::getInstance());
-
- getRootView()->sendChildToFront(gNotifyBoxView);
- // menu holder appears on top to get first pass at all mouse events
- getRootView()->sendChildToFront(gMenuHolder);
-
if ( gHUDView == NULL )
{
LLRect hud_rect = full_window;
@@ -1611,11 +1698,26 @@ void LLViewerWindow::initWorldUI()
getRootView()->addChildInBack(gHUDView);
}
- // this allows not to see UI elements created while UI initializing after Alt+Tab was pressed during login. EXT-744.
- moveProgressViewToFront();
+ LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container");
+ LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
+ panel_ssf_container->addChild(panel_stand_stop_flying);
+ panel_ssf_container->setVisible(TRUE);
- // tooltips are always on top
- getRootView()->sendChildToFront(gToolTipView);
+ // put sidetray in container
+ LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container");
+ LLSideTray* sidetrayp = LLSideTray::getInstance();
+ sidetrayp->setShape(side_tray_container->getLocalRect());
+ // don't follow right edge to avoid spurious resizes, since we are using a fixed width layout
+ sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM);
+ side_tray_container->addChild(sidetrayp);
+ side_tray_container->setVisible(FALSE);
+
+ // put sidetray buttons in their own panel
+ LLPanel* buttons_panel = sidetrayp->getButtonsPanel();
+ LLPanel* buttons_panel_container = getRootView()->getChild<LLPanel>("side_bar_tabs");
+ buttons_panel->setShape(buttons_panel_container->getLocalRect());
+ buttons_panel->setFollowsAll();
+ buttons_panel_container->addChild(buttons_panel);
}
// Destroy the UI
@@ -1640,7 +1742,11 @@ void LLViewerWindow::shutdownViews()
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
delete LLNavigationBar::getInstance();
-
+
+ // destroy menus after instantiating navbar above, as it needs
+ // access to gMenuHolder
+ cleanup_menus();
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
@@ -1654,8 +1760,6 @@ void LLViewerWindow::shutdownViews()
gMorphView = NULL;
gHUDView = NULL;
-
- gNotifyBoxView = NULL;
}
void LLViewerWindow::shutdownGL()
@@ -1670,6 +1774,8 @@ void LLViewerWindow::shutdownGL()
gSky.cleanup();
stop_glerror();
+ LLWearableList::instance().cleanup() ;
+
gTextureList.shutdown();
stop_glerror();
@@ -1683,7 +1789,10 @@ void LLViewerWindow::shutdownGL()
stop_glerror();
LLViewerTextureManager::cleanup() ;
-
+ LLImageGL::cleanupClass() ;
+
+ llinfos << "All textures and llimagegl images are destroyed!" << llendl ;
+
llinfos << "Cleaning up select manager" << llendl;
LLSelectMgr::getInstance()->cleanup();
@@ -1704,6 +1813,9 @@ LLViewerWindow::~LLViewerWindow()
{
llinfos << "Destroying Window" << llendl;
destroyWindow();
+
+ delete mDebugText;
+ mDebugText = NULL;
}
@@ -1738,8 +1850,8 @@ void LLViewerWindow::sendShapeToSim()
msg->addU32Fast(_PREHASH_CircuitCode, gMessageSystem->mOurCircuitCode);
msg->nextBlockFast(_PREHASH_HeightWidthBlock);
msg->addU32Fast(_PREHASH_GenCounter, 0);
- U16 height16 = (U16) mWorldViewRect.getHeight();
- U16 width16 = (U16) mWorldViewRect.getWidth();
+ U16 height16 = (U16) mWorldViewRectRaw.getHeight();
+ U16 width16 = (U16) mWorldViewRectRaw.getWidth();
msg->addU16Fast(_PREHASH_Height, height16);
msg->addU16Fast(_PREHASH_Width, width16);
gAgent.sendReliableMessage();
@@ -1761,14 +1873,14 @@ void LLViewerWindow::reshape(S32 width, S32 height)
}
// update our window rectangle
- mWindowRect.mRight = mWindowRect.mLeft + width;
- mWindowRect.mTop = mWindowRect.mBottom + height;
+ mWindowRectRaw.mRight = mWindowRectRaw.mLeft + width;
+ mWindowRectRaw.mTop = mWindowRectRaw.mBottom + height;
//glViewport(0, 0, width, height );
if (height > 0)
{
- LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() );
+ LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
}
@@ -1778,8 +1890,8 @@ void LLViewerWindow::reshape(S32 width, S32 height)
LLUI::setScaleFactor(mDisplayScale);
// update our window rectangle
- mVirtualWindowRect.mRight = mVirtualWindowRect.mLeft + llround((F32)width / mDisplayScale.mV[VX]);
- mVirtualWindowRect.mTop = mVirtualWindowRect.mBottom + llround((F32)height / mDisplayScale.mV[VY]);
+ mWindowRectScaled.mRight = mWindowRectScaled.mLeft + llround((F32)width / mDisplayScale.mV[VX]);
+ mWindowRectScaled.mTop = mWindowRectScaled.mBottom + llround((F32)height / mDisplayScale.mV[VY]);
setup2DViewport();
@@ -1921,7 +2033,7 @@ void LLViewerWindow::draw()
if (!gSavedSettings.getBOOL("RenderUIBuffer"))
{
- LLUI::sDirtyRect = this->getWindowRect();
+ LLUI::sDirtyRect = getWindowRectScaled();
}
// HACK for timecode debugging
@@ -1935,8 +2047,8 @@ void LLViewerWindow::draw()
microsecondsToTimecodeString(gFrameTime,text);
const LLFontGL* font = LLFontGL::getFontSansSerif();
font->renderUTF8(text, 0,
- llround((getWindowWidth()/2)-100.f),
- llround((getWindowHeight()-60.f)),
+ llround((getWindowWidthScaled()/2)-100.f),
+ llround((getWindowHeightScaled()-60.f)),
LLColor4( 1.f, 1.f, 1.f, 1.f ),
LLFontGL::LEFT, LLFontGL::TOP);
}
@@ -1959,8 +2071,8 @@ void LLViewerWindow::draw()
int pos_y = sub_region / llceil(zoom_factor);
int pos_x = sub_region - (pos_y*llceil(zoom_factor));
// offset for this tile
- glTranslatef((F32)getWindowWidth() * -(F32)pos_x,
- (F32)getWindowHeight() * -(F32)pos_y,
+ glTranslatef((F32)getWindowWidthScaled() * -(F32)pos_x,
+ (F32)getWindowHeightScaled() * -(F32)pos_y,
0.f);
glScalef(zoom_factor, zoom_factor, 1.f);
LLUI::sGLScaleFactor *= zoom_factor;
@@ -2005,8 +2117,8 @@ void LLViewerWindow::draw()
const S32 DIST_FROM_TOP = 20;
LLFontGL::getFontSansSerifBig()->renderUTF8(
mOverlayTitle, 0,
- llround( getWindowWidth() * 0.5f),
- getWindowHeight() - DIST_FROM_TOP,
+ llround( getWindowWidthScaled() * 0.5f),
+ getWindowHeightScaled() - DIST_FROM_TOP,
LLColor4(1, 1, 1, 0.4f),
LLFontGL::HCENTER, LLFontGL::TOP);
}
@@ -2018,9 +2130,6 @@ void LLViewerWindow::draw()
#if LL_DEBUG
LLView::sIsDrawing = FALSE;
#endif
-
- // UI post-draw Updates
- gNotifyBoxView->updateNotifyBoxView();
}
// Takes a single keydown event, usually when UI is visible
@@ -2113,31 +2222,30 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
// arrow keys move avatar while chatting hack
if (chat_editor && chat_editor->hasFocus())
{
- if (chat_editor->getText().empty() || gSavedSettings.getBOOL("ArrowKeysMoveAvatar"))
+ // If text field is empty, there's no point in trying to move
+ // cursor with arrow keys, so allow movement
+ if (chat_editor->getText().empty()
+ || gSavedSettings.getBOOL("ArrowKeysAlwaysMove"))
{
- switch(key)
+ // let Control-Up and Control-Down through for chat line history,
+ if (!(key == KEY_UP && mask == MASK_CONTROL)
+ && !(key == KEY_DOWN && mask == MASK_CONTROL))
{
- case KEY_LEFT:
- case KEY_RIGHT:
- case KEY_UP:
- // let CTRL UP through for chat line history
- if( MASK_CONTROL == mask )
- {
- break;
- }
- case KEY_DOWN:
- // let CTRL DOWN through for chat line history
- if( MASK_CONTROL == mask )
+ switch(key)
{
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_PAGE_UP:
+ case KEY_PAGE_DOWN:
+ case KEY_HOME:
+ // when chatbar is empty or ArrowKeysAlwaysMove set,
+ // pass arrow keys on to avatar...
+ return FALSE;
+ default:
break;
}
- case KEY_PAGE_UP:
- case KEY_PAGE_DOWN:
- case KEY_HOME:
- // when chatbar is empty or ArrowKeysMoveAvatar set, pass arrow keys on to avatar...
- return FALSE;
- default:
- break;
}
}
}
@@ -2307,7 +2415,7 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
// Zoom the camera in and out behavior
- if(top_ctrl == 0 && mWorldViewRect.pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
+ if(top_ctrl == 0 && getWorldViewRectScaled().pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
gAgent.handleScrollWheel(clicks);
return;
@@ -2315,53 +2423,33 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
void LLViewerWindow::moveCursorToCenter()
{
- S32 x = mWorldViewRect.getWidth() / 2;
- S32 y = mWorldViewRect.getHeight() / 2;
-
- //on a forced move, all deltas get zeroed out to prevent jumping
- mCurrentMousePoint.set(x,y);
- mLastMousePoint.set(x,y);
- mCurrentMouseDelta.set(0,0);
-
- LLUI::setMousePositionScreen(x, y);
-}
-
-void LLViewerWindow::updateBottomTrayRect()
-{
- if(LLBottomTray::instanceExists() && LLSideTray::instanceCreated())
+ if (! gSavedSettings.getBOOL("DisableMouseWarp"))
{
- S32 side_tray_width = 0;
- if(LLSideTray::getInstance()->getVisible())
- {
- side_tray_width = LLSideTray::getInstance()->getTrayWidth();
- }
-
- LLBottomTray* bottom_tray = LLBottomTray::getInstance();
- S32 right = llround((F32)mWindowRect.mRight / mDisplayScale.mV[VX]) - side_tray_width;
+ S32 x = getWorldViewWidthScaled() / 2;
+ S32 y = getWorldViewHeightScaled() / 2;
+
+ //on a forced move, all deltas get zeroed out to prevent jumping
+ mCurrentMousePoint.set(x,y);
+ mLastMousePoint.set(x,y);
+ mCurrentMouseDelta.set(0,0);
- LLRect rc = bottom_tray->getRect();
- if (right != rc.mRight)
- {
- rc.mRight = right;
- bottom_tray->reshape(rc.getWidth(), rc.getHeight(), FALSE);
- bottom_tray->setRect(rc);
- mOnBottomTrayWidthChanged();
- }
+ LLUI::setMousePositionScreen(x, y);
}
}
+
//////////////////////////////////////////////////////////////////////
//
// Hover handlers
//
-void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)
+void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params)
{
if (viewp)
{
- if (!tool_tip_msg.empty())
+ if (!params.styled_message().empty())
{
- tool_tip_msg.append("\n---------\n");
+ params.styled_message.add().text("\n---------\n");
}
LLView::root_to_view_iterator_t end_tooltip_it = viewp->endRootToView();
// NOTE: we skip "root" since it is assumed
@@ -2371,15 +2459,16 @@ void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)
{
LLView* viewp = *tooltip_it;
- tool_tip_msg.append(viewp->getName());
+ params.styled_message.add().text(viewp->getName());
+
LLPanel* panelp = dynamic_cast<LLPanel*>(viewp);
if (panelp && !panelp->getXMLFilename().empty())
{
- tool_tip_msg.append("(");
- tool_tip_msg.append(panelp->getXMLFilename());
- tool_tip_msg.append(")");
+ params.styled_message.add()
+ .text("(" + panelp->getXMLFilename() + ")")
+ .style.color(LLColor4(0.7f, 0.7f, 1.f, 1.f));
}
- tool_tip_msg.append("/");
+ params.styled_message.add().text("/");
}
}
}
@@ -2390,9 +2479,12 @@ void LLViewerWindow::updateUI()
{
static std::string last_handle_msg;
- updateWorldViewRect();
+ LLConsole::updateClass();
+
+ // animate layout stacks so we have up to date rect for world view
+ LLLayoutStack::updateClass();
- updateBottomTrayRect();
+ updateWorldViewRect();
LLView::sMouseHandlerMessage.clear();
@@ -2424,19 +2516,35 @@ void LLViewerWindow::updateUI()
BOOL handled_by_top_ctrl = FALSE;
LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
+ LLView* captor_view = dynamic_cast<LLView*>(mouse_captor);
+
+ //FIXME: only include captor and captor's ancestors if mouse is truly over them --RN
//build set of views containing mouse cursor by traversing UI hierarchy and testing
//screen rect against mouse cursor
view_handle_set_t mouse_hover_set;
- // start at current mouse captor (if is a view) or UI root
- LLView* root_view = NULL;
- root_view = dynamic_cast<LLView*>(mouse_captor);
+ // constraint mouse enter events to children of mouse captor
+ LLView* root_view = captor_view;
+
+ // if mouse captor doesn't exist or isn't a LLView
+ // then allow mouse enter events on entire UI hierarchy
if (!root_view)
{
root_view = mRootView;
}
+ // include all ancestors of captor_view as automatically having mouse
+ if (captor_view)
+ {
+ LLView* captor_parent_view = captor_view->getParent();
+ while(captor_parent_view)
+ {
+ mouse_hover_set.insert(captor_parent_view->getHandle());
+ captor_parent_view = captor_parent_view->getParent();
+ }
+ }
+
// aggregate visible views that contain mouse cursor in display order
// while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events
@@ -2603,6 +2711,8 @@ void LLViewerWindow::updateUI()
if (gSavedSettings.getBOOL("DebugShowXUINames"))
{
+ LLToolTip::Params params;
+
LLView* tooltip_view = mRootView;
LLView::tree_iterator_t end_it = mRootView->endTreeDFS();
for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it)
@@ -2620,7 +2730,6 @@ void LLViewerWindow::updateUI()
else if (dynamic_cast<LLUICtrl*>(viewp)
&& viewp != gMenuHolder
&& viewp != gFloaterView
- && viewp != gNotifyBoxView
&& viewp != gConsole)
{
if (dynamic_cast<LLFloater*>(viewp))
@@ -2635,20 +2744,20 @@ void LLViewerWindow::updateUI()
// NOTE: this emulates visiting only the leaf nodes that meet our criteria
if (!viewp->hasAncestor(tooltip_view))
{
- append_xui_tooltip(tooltip_view, tool_tip_msg);
+ append_xui_tooltip(tooltip_view, params);
screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
}
tooltip_view = viewp;
}
}
- append_xui_tooltip(tooltip_view, tool_tip_msg);
+ append_xui_tooltip(tooltip_view, params);
screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
- LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(tool_tip_msg)
- .sticky_rect(screen_sticky_rect)
- .max_width(400));
+ params.sticky_rect = screen_sticky_rect;
+ params.max_width = 400;
+
+ LLToolTipMgr::instance().show(params);
}
// if there is a mouse captor, nothing else gets a tooltip
else if (mouse_captor)
@@ -2760,8 +2869,8 @@ void LLViewerWindow::updateMouseDelta()
mWindow->getCursorPosition(&mouse_pos);
if (mouse_pos.mX < 0 ||
mouse_pos.mY < 0 ||
- mouse_pos.mX > mWindowRect.getWidth() ||
- mouse_pos.mY > mWindowRect.getHeight())
+ mouse_pos.mX > mWindowRectRaw.getWidth() ||
+ mouse_pos.mY > mWindowRectRaw.getHeight())
{
mMouseInWindow = FALSE;
}
@@ -2876,43 +2985,40 @@ void LLViewerWindow::updateKeyboardFocus()
LLSideTray::getInstance()->highlightFocused();
}
+static LLFastTimer::DeclareTimer FTM_UPDATE_WORLD_VIEW("Update World View");
void LLViewerWindow::updateWorldViewRect(bool use_full_window)
{
- if (!LLSideTray::instanceCreated()) return;
+ LLFastTimer ft(FTM_UPDATE_WORLD_VIEW);
// start off using whole window to render world
- LLRect new_world_rect = mWindowRect;
+ LLRect new_world_rect = mWindowRectRaw;
- if (use_full_window == false)
+ if (use_full_window == false && mWorldViewPlaceholder.get())
{
- // pull in right side of world view based on sidetray
- LLSideTray* sidetray = LLSideTray::getInstance();
- if (sidetray->getVisible())
- {
- new_world_rect.mRight -= llround((F32)sidetray->getTrayWidth() * mDisplayScale.mV[VX]);
- }
+ new_world_rect = mWorldViewPlaceholder.get()->calcScreenRect();
+ // clamp to at least a 1x1 rect so we don't try to allocate zero width gl buffers
+ new_world_rect.mTop = llmax(new_world_rect.mTop, new_world_rect.mBottom + 1);
+ new_world_rect.mRight = llmax(new_world_rect.mRight, new_world_rect.mLeft + 1);
- // push top of world view below nav bar
- if (LLNavigationBar::getInstance()->getVisible())
- {
- LLNavigationBar* barp = LLNavigationBar::getInstance();
- LLRect nav_bar_rect;
- if(barp->localRectToOtherView(barp->getLocalRect(), &nav_bar_rect, mRootView))
- {
- new_world_rect.mTop = llround((F32)LLNavigationBar::getInstance()->getRect().mBottom * mDisplayScale.mV[VY]);
- }
- }
+ new_world_rect.mLeft = llround((F32)new_world_rect.mLeft * mDisplayScale.mV[VX]);
+ new_world_rect.mRight = llround((F32)new_world_rect.mRight * mDisplayScale.mV[VX]);
+ new_world_rect.mBottom = llround((F32)new_world_rect.mBottom * mDisplayScale.mV[VY]);
+ new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);
}
- if (mWorldViewRect != new_world_rect)
+ if (mWorldViewRectRaw != new_world_rect)
{
- // sending a signal with a new WorldView rect
- mOnWorldViewRectUpdated(mWorldViewRect, new_world_rect);
-
- mWorldViewRect = new_world_rect;
+ LLRect old_world_rect = mWorldViewRectRaw;
+ mWorldViewRectRaw = new_world_rect;
gResizeScreenTexture = TRUE;
- LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() );
+ LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
+
+ mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
+
+ // sending a signal with a new WorldView rect
+ old_world_rect = calcScaledRect(old_world_rect, mDisplayScale);
+ mOnWorldViewRectUpdated(old_world_rect, mWorldViewRectScaled);
}
}
@@ -2924,9 +3030,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
{
mCurrentMousePoint.mX = 0;
}
- else if (point.mX > getWindowWidth())
+ else if (point.mX > getWindowWidthScaled())
{
- mCurrentMousePoint.mX = getWindowWidth();
+ mCurrentMousePoint.mX = getWindowWidthScaled();
}
else
{
@@ -2937,9 +3043,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
{
mCurrentMousePoint.mY = 0;
}
- else if (point.mY > getWindowHeight() )
+ else if (point.mY > getWindowHeightScaled() )
{
- mCurrentMousePoint.mY = getWindowHeight();
+ mCurrentMousePoint.mY = getWindowHeightScaled();
}
else
{
@@ -3168,7 +3274,6 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
return;
}
- // push back pick info object
BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
{
@@ -3177,27 +3282,8 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
pick_transparent = TRUE;
}
- // center initial pick frame buffer region under mouse cursor
- // since that area is guaranteed to be onscreen and hence a valid
- // part of the framebuffer
- if (mPicks.empty())
- {
- mPickScreenRegion.setCenterAndSize(x, y_from_bot, PICK_DIAMETER, PICK_DIAMETER);
-
- if (mPickScreenRegion.mLeft < mWorldViewRect.mLeft) mPickScreenRegion.translate(mWorldViewRect.mLeft - mPickScreenRegion.mLeft, 0);
- if (mPickScreenRegion.mBottom < mWorldViewRect.mBottom) mPickScreenRegion.translate(0, mWorldViewRect.mBottom - mPickScreenRegion.mBottom);
- if (mPickScreenRegion.mRight > mWorldViewRect.mRight ) mPickScreenRegion.translate(mWorldViewRect.mRight - mPickScreenRegion.mRight, 0);
- if (mPickScreenRegion.mTop > mWorldViewRect.mTop ) mPickScreenRegion.translate(0, mWorldViewRect.mTop - mPickScreenRegion.mTop);
- }
-
- // set frame buffer region for picking results
- // stack multiple picks left to right
- LLRect screen_region = mPickScreenRegion;
- screen_region.translate(mPicks.size() * PICK_DIAMETER, 0);
-
- LLPickInfo pick(LLCoordGL(x, y_from_bot), screen_region, mask, pick_transparent, TRUE, callback);
-
- schedulePick(pick);
+ LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, TRUE, callback);
+ schedulePick(pick_info);
}
void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
@@ -3212,10 +3298,11 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
return;
}
- llassert_always(pick_info.mScreenRegion.notEmpty());
mPicks.push_back(pick_info);
// delay further event processing until we receive results of pick
+ // only do this for async picks so that handleMouseUp won't be called
+ // until the pick triggered in handleMouseDown has been processed, for example
mWindow->delayInputProcessing();
}
@@ -3263,21 +3350,18 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans
return LLPickInfo();
}
- pickAsync(x, y_from_bot, gKeyboard->currentMask(TRUE), NULL, pick_transparent);
- // assume that pickAsync put the results in the back of the mPicks list
- if(mPicks.size() != 0)
- {
- mLastPick = mPicks.back();
- mLastPick.fetchResults();
- mPicks.pop_back();
- }
- else
+ BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
+ if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
{
- llwarns << "List of last picks is empty" << llendl;
- llwarns << "Using stub pick" << llendl;
- mLastPick = LLPickInfo();
+ // build mode allows interaction with all transparent objects
+ // "Show Debug Alpha" means no object actually transparent
+ pick_transparent = TRUE;
}
+ // shortcut queueing in mPicks and just update mLastPick in place
+ mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL);
+ mLastPick.fetchResults();
+
return mLastPick;
}
@@ -3393,11 +3477,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
F32 fov = LLViewerCamera::getInstance()->getView();
// find world view center in scaled ui coordinates
- F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
- F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+ F32 center_x = getWorldViewRectScaled().getCenterX();
+ F32 center_y = getWorldViewRectScaled().getCenterY();
// calculate pixel distance to screen
- F32 distance = ((F32)getWorldViewHeight() / (mDisplayScale.mV[VY] * 2.f)) / (tan(fov / 2.f));
+ F32 distance = ((F32)getWorldViewHeightScaled() * 0.5f) / (tan(fov / 2.f));
// calculate click point relative to middle of screen
F32 click_x = x - center_x;
@@ -3416,11 +3500,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const
{
// find screen resolution
- S32 height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]);
+ S32 height = getWorldViewHeightScaled();
// find world view center
- F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
- F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+ F32 center_x = getWorldViewRectScaled().getCenterX();
+ F32 center_y = getWorldViewRectScaled().getCenterY();
// remap with uniform scale (1/height) so that top is -0.5, bottom is +0.5
F32 hud_x = -((F32)x - center_x) / height;
@@ -3438,12 +3522,12 @@ LLVector3 LLViewerWindow::mouseDirectionCamera(const S32 x, const S32 y) const
F32 fov_width = fov_height * LLViewerCamera::getInstance()->getAspect();
// find screen resolution
- S32 height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]);
- S32 width = llround((F32)getWorldViewWidth() / mDisplayScale.mV[VX]);
+ S32 height = getWorldViewHeightScaled();
+ S32 width = getWorldViewWidthScaled();
// find world view center
- F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
- F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+ F32 center_x = getWorldViewRectScaled().getCenterX();
+ F32 center_y = getWorldViewRectScaled().getCenterY();
// calculate click point relative to middle of screen
F32 click_x = (((F32)x - center_x) / (F32)width) * fov_width * -1.f;
@@ -3683,8 +3767,8 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
||(size.mY != new_height + BORDERHEIGHT))
{
// use actual display dimensions, not virtual UI dimensions
- S32 x = gViewerWindow->getWindowDisplayWidth();
- S32 y = gViewerWindow->getWindowDisplayHeight();
+ S32 x = gViewerWindow->getWindowWidthRaw();
+ S32 y = gViewerWindow->getWindowHeightRaw();
BORDERWIDTH = size.mX - x;
BORDERHEIGHT = size.mY- y;
LLCoordScreen new_size(new_width + BORDERWIDTH,
@@ -3782,9 +3866,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
S32 w = preview_width ;
S32 h = preview_height ;
LLVector2 display_scale = mDisplayScale ;
- mDisplayScale.setVec((F32)w / mWindowRect.getWidth(), (F32)h / mWindowRect.getHeight()) ;
- LLRect window_rect = mWindowRect;
- mWindowRect.set(0, h, w, 0);
+ mDisplayScale.setVec((F32)w / mWindowRectRaw.getWidth(), (F32)h / mWindowRectRaw.getHeight()) ;
+ LLRect window_rect = mWindowRectRaw;
+ mWindowRectRaw.set(0, h, w, 0);
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
@@ -3796,7 +3880,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
LLHUDText::setDisplayText(FALSE) ;
if (type == SNAPSHOT_TYPE_OBJECT_ID)
{
- gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE);
+ gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE);
}
else
{
@@ -3849,7 +3933,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
LLFontGL::setFontDisplay(TRUE) ;
LLHUDText::setDisplayText(TRUE) ;
mDisplayScale.setVec(display_scale) ;
- mWindowRect = window_rect;
+ mWindowRectRaw = window_rect;
setup3DRender();
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
@@ -3917,12 +4001,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Copy screen to a buffer
// crop sides or top and bottom, if taking a snapshot of different aspect ratio
// from window
- S32 snapshot_width = mWindowRect.getWidth();
- S32 snapshot_height = mWindowRect.getHeight();
+ S32 snapshot_width = mWindowRectRaw.getWidth();
+ S32 snapshot_height = mWindowRectRaw.getHeight();
// SNAPSHOT
- S32 window_width = mWindowRect.getWidth();
- S32 window_height = mWindowRect.getHeight();
- LLRect window_rect = mWindowRect;
+ S32 window_width = mWindowRectRaw.getWidth();
+ S32 window_height = mWindowRectRaw.getHeight();
+ LLRect window_rect = mWindowRectRaw;
BOOL use_fbo = FALSE;
LLRenderTarget target;
@@ -3953,7 +4037,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
window_width = snapshot_width;
window_height = snapshot_height;
scale_factor = 1.f;
- mWindowRect.set(0, snapshot_height, snapshot_width, 0);
+ mWindowRectRaw.set(0, snapshot_height, snapshot_width, 0);
target.bindTarget();
}
}
@@ -3986,7 +4070,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
return FALSE ;
}
- BOOL high_res = scale_factor > 1.f;
+ BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher
if (high_res)
{
send_agent_pause();
@@ -4021,7 +4105,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLViewerCamera::getInstance()->setZoomParameters(scale_factor, subimage_x+(subimage_y*llceil(scale_factor)));
setup3DRender();
- gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE);
+ gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE);
}
else
{
@@ -4100,7 +4184,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
if (use_fbo)
{
- mWindowRect = window_rect;
+ mWindowRectRaw = window_rect;
target.flush();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
@@ -4174,30 +4258,20 @@ void LLViewerWindow::drawMouselookInstructions()
{
// Draw instructions for mouselook ("Press ESC to return to World View" partially transparent at the bottom of the screen.)
const std::string instructions = LLTrans::getString("LeaveMouselook");
- const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Huge", LLFontGL::BOLD));
+ const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Large", LLFontGL::BOLD));
//to be on top of Bottom bar when it is opened
const S32 INSTRUCTIONS_PAD = 50;
font->renderUTF8(
instructions, 0,
- getVirtualWorldViewRect().getCenterX(),
- getVirtualWorldViewRect().mBottom + INSTRUCTIONS_PAD,
+ getWorldViewRectScaled().getCenterX(),
+ getWorldViewRectScaled().mBottom + INSTRUCTIONS_PAD,
LLColor4( 1.0f, 1.0f, 1.0f, 0.5f ),
LLFontGL::HCENTER, LLFontGL::TOP,
LLFontGL::NORMAL,LLFontGL::DROP_SHADOW);
}
-S32 LLViewerWindow::getWindowHeight() const
-{
- return mVirtualWindowRect.getHeight();
-}
-
-S32 LLViewerWindow::getWindowWidth() const
-{
- return mVirtualWindowRect.getWidth();
-}
-
void* LLViewerWindow::getPlatformWindow() const
{
return mWindow->getPlatformWindow();
@@ -4218,49 +4292,65 @@ LLRootView* LLViewerWindow::getRootView() const
return mRootView;
}
-LLRect LLViewerWindow::getVirtualWorldViewRect() const
+LLRect LLViewerWindow::getWorldViewRectScaled() const
+{
+ return mWorldViewRectScaled;
+}
+
+S32 LLViewerWindow::getWorldViewHeightScaled() const
+{
+ return mWorldViewRectScaled.getHeight();
+}
+
+S32 LLViewerWindow::getWorldViewWidthScaled() const
{
- LLRect world_view_rect = mWorldViewRect;
- world_view_rect.mLeft = llround((F32)world_view_rect.mLeft / mDisplayScale.mV[VX]);
- world_view_rect.mRight = llround((F32)world_view_rect.mRight / mDisplayScale.mV[VX]);
- world_view_rect.mBottom = llround((F32)world_view_rect.mBottom / mDisplayScale.mV[VY]);
- world_view_rect.mTop = llround((F32)world_view_rect.mTop / mDisplayScale.mV[VY]);
- return world_view_rect;
+ return mWorldViewRectScaled.getWidth();
}
-S32 LLViewerWindow::getWorldViewHeight() const
+
+S32 LLViewerWindow::getWorldViewHeightRaw() const
{
- return mWorldViewRect.getHeight();
+ return mWorldViewRectRaw.getHeight();
}
-S32 LLViewerWindow::getWorldViewWidth() const
+S32 LLViewerWindow::getWorldViewWidthRaw() const
{
- return mWorldViewRect.getWidth();
+ return mWorldViewRectRaw.getWidth();
+}
+
+S32 LLViewerWindow::getWindowHeightScaled() const
+{
+ return mWindowRectScaled.getHeight();
+}
+
+S32 LLViewerWindow::getWindowWidthScaled() const
+{
+ return mWindowRectScaled.getWidth();
}
-S32 LLViewerWindow::getWindowDisplayHeight() const
+S32 LLViewerWindow::getWindowHeightRaw() const
{
- return mWindowRect.getHeight();
+ return mWindowRectRaw.getHeight();
}
-S32 LLViewerWindow::getWindowDisplayWidth() const
+S32 LLViewerWindow::getWindowWidthRaw() const
{
- return mWindowRect.getWidth();
+ return mWindowRectRaw.getWidth();
}
void LLViewerWindow::setup2DRender()
{
// setup ortho camera
- gl_state_for_2d(mWindowRect.getWidth(), mWindowRect.getHeight());
+ gl_state_for_2d(mWindowRectRaw.getWidth(), mWindowRectRaw.getHeight());
setup2DViewport();
}
void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset)
{
- gGLViewport[0] = mWindowRect.mLeft + x_offset;
- gGLViewport[1] = mWindowRect.mBottom + y_offset;
- gGLViewport[2] = mWindowRect.getWidth();
- gGLViewport[3] = mWindowRect.getHeight();
+ gGLViewport[0] = mWindowRectRaw.mLeft + x_offset;
+ gGLViewport[1] = mWindowRectRaw.mBottom + y_offset;
+ gGLViewport[2] = mWindowRectRaw.getWidth();
+ gGLViewport[3] = mWindowRectRaw.getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
}
@@ -4268,7 +4358,7 @@ void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset)
void LLViewerWindow::setup3DRender()
{
// setup perspective camera
- LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRect.mLeft, mWorldViewRect.mBottom, mWorldViewRect.getWidth(), mWorldViewRect.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f);
+ LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRectRaw.mLeft, mWorldViewRectRaw.mBottom, mWorldViewRectRaw.getWidth(), mWorldViewRectRaw.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f);
setup3DViewport();
}
@@ -4276,17 +4366,17 @@ void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)
{
if (LLRenderTarget::getCurrentBoundTarget() != NULL)
{
- // don't use translation component of mWorldViewRect, as we are already in a properly sized render target
+ // don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target
gGLViewport[0] = x_offset;
gGLViewport[1] = y_offset;
}
else
{
- gGLViewport[0] = mWorldViewRect.mLeft + x_offset;
- gGLViewport[1] = mWorldViewRect.mBottom + y_offset;
+ gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;
+ gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;
}
- gGLViewport[2] = mWorldViewRect.getWidth();
- gGLViewport[3] = mWorldViewRect.getHeight();
+ gGLViewport[2] = mWorldViewRectRaw.getWidth();
+ gGLViewport[3] = mWorldViewRectRaw.getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
}
@@ -4497,8 +4587,8 @@ void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height)
if (mWindow
&& mWindow->getFullscreen() == mWantFullscreen)
{
- width = getWindowDisplayWidth();
- height = getWindowDisplayHeight();
+ width = getWindowWidthRaw();
+ height = getWindowHeightRaw();
}
else if (mWantFullscreen)
{
@@ -4545,7 +4635,7 @@ BOOL LLViewerWindow::checkSettings()
getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
}
- reshape(getWindowDisplayWidth(), getWindowDisplayHeight());
+ reshape(getWindowWidthRaw(), getWindowHeightRaw());
// force aspect ratio
if (mIsFullscreenChecked)
@@ -4707,7 +4797,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
LLSD args;
args["RESX"] = llformat("%d",size.mX);
args["RESY"] = llformat("%d",size.mY);
- LLNotifications::instance().add("ResolutionSwitchFail", args);
+ LLNotificationsUtil::add("ResolutionSwitchFail", args);
size = old_size; // for reshape below
}
@@ -4771,15 +4861,14 @@ F32 LLViewerWindow::getDisplayAspectRatio() const
F32 LLViewerWindow::getWorldViewAspectRatio() const
{
- F32 world_aspect = (F32)mWorldViewRect.getWidth() / (F32)mWorldViewRect.getHeight();
- //F32 window_aspect = (F32)mWindowRect.getWidth() / (F32)mWindowRect.getHeight();
+ F32 world_aspect = (F32)mWorldViewRectRaw.getWidth() / (F32)mWorldViewRectRaw.getHeight();
+ //F32 window_aspect = (F32)mWindowRectRaw.getWidth() / (F32)mWindowRectRaw.getHeight();
if (mWindow->getFullscreen())
{
return world_aspect * mWindow->getPixelAspectRatio();
}
else
{
- llinfos << "World aspect ratio: " << world_aspect << llendl;
return world_aspect;
}
}
@@ -4789,7 +4878,7 @@ void LLViewerWindow::calcDisplayScale()
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
LLVector2 display_scale;
display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
- F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRect.getHeight() / display_scale.mV[VY]) / 768.f : 1.f;
+ F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRectRaw.getHeight() / display_scale.mV[VY]) / 768.f : 1.f;
if(mWindow->getFullscreen())
{
display_scale *= (ui_scale_factor * height_normalization);
@@ -4807,8 +4896,8 @@ void LLViewerWindow::calcDisplayScale()
if (mWindow->getFullscreen())
{
- display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRect.getWidth());
- display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRect.getHeight());
+ display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRectRaw.getWidth());
+ display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRectRaw.getHeight());
}
if (display_scale != mDisplayScale)
@@ -4821,6 +4910,18 @@ void LLViewerWindow::calcDisplayScale()
}
}
+//static
+LLRect LLViewerWindow::calcScaledRect(const LLRect & rect, const LLVector2& display_scale)
+{
+ LLRect res = rect;
+ res.mLeft = llround((F32)res.mLeft / display_scale.mV[VX]);
+ res.mRight = llround((F32)res.mRight / display_scale.mV[VX]);
+ res.mBottom = llround((F32)res.mBottom / display_scale.mV[VY]);
+ res.mTop = llround((F32)res.mTop / display_scale.mV[VY]);
+
+ return res;
+}
+
S32 LLViewerWindow::getChatConsoleBottomPad()
{
S32 offset = 0;
@@ -4833,7 +4934,7 @@ S32 LLViewerWindow::getChatConsoleBottomPad()
LLRect LLViewerWindow::getChatConsoleRect()
{
- LLRect full_window(0, getWindowHeight(), getWindowWidth(), 0);
+ LLRect full_window(0, getWindowHeightScaled(), getWindowWidthScaled(), 0);
LLRect console_rect = full_window;
const S32 CONSOLE_PADDING_TOP = 24;
@@ -4855,7 +4956,7 @@ LLRect LLViewerWindow::getChatConsoleRect()
{
// Make console rect somewhat narrow so having inventory open is
// less of a problem.
- console_rect.mRight = console_rect.mLeft + 2 * getWindowWidth() / 3;
+ console_rect.mRight = console_rect.mLeft + 2 * getWindowWidthScaled() / 3;
}
return console_rect;
@@ -4907,13 +5008,11 @@ LLPickInfo::LLPickInfo()
}
LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,
- const LLRect& screen_region,
- MASK keyboard_mask,
- BOOL pick_transparent,
- BOOL pick_uv_coords,
- void (*pick_callback)(const LLPickInfo& pick_info))
+ MASK keyboard_mask,
+ BOOL pick_transparent,
+ BOOL pick_uv_coords,
+ void (*pick_callback)(const LLPickInfo& pick_info))
: mMousePt(mouse_pos),
- mScreenRegion(screen_region),
mKeyMask(keyboard_mask),
mPickCallback(pick_callback),
mPickType(PICK_INVALID),
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index d7c403739e..bfce65f2ba 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -50,6 +50,7 @@
#include "llmousehandler.h"
#include "llcursortypes.h"
#include "llhandle.h"
+#include "llimage.h"
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@@ -88,7 +89,6 @@ public:
public:
LLPickInfo();
LLPickInfo(const LLCoordGL& mouse_pos,
- const LLRect& screen_region,
MASK keyboard_mask,
BOOL pick_transparent,
BOOL pick_surface_info,
@@ -120,16 +120,12 @@ public:
LLVector3 mNormal;
LLVector3 mBinormal;
BOOL mPickTransparent;
- LLRect mScreenRegion;
void getSurfaceInfo();
private:
void updateXYCoords();
BOOL mWantSurfaceInfo; // do we populate mUVCoord, mNormal, mBinormal?
- U8 mPickBuffer[PICK_DIAMETER * PICK_DIAMETER * 4];
- F32 mPickDepthBuffer[PICK_DIAMETER * PICK_DIAMETER];
- BOOL mPickParcelWall;
};
@@ -170,7 +166,8 @@ public:
/*virtual*/ BOOL handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
- /*virtual*/ void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
+ /*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data);
+ void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
/*virtual*/ void handleMouseLeave(LLWindow *window);
/*virtual*/ void handleResize(LLWindow *window, S32 x, S32 y);
/*virtual*/ void handleFocus(LLWindow *window);
@@ -210,21 +207,25 @@ public:
//
LLRootView* getRootView() const;
+ // 3D world area in scaled pixels (via UI scale), use for most UI computations
+ LLRect getWorldViewRectScaled() const;
+ S32 getWorldViewHeightScaled() const;
+ S32 getWorldViewWidthScaled() const;
+
+ // 3D world area, in raw unscaled pixels
+ LLRect getWorldViewRectRaw() const { return mWorldViewRectRaw; }
+ S32 getWorldViewHeightRaw() const;
+ S32 getWorldViewWidthRaw() const;
+
+ // Window in scaled pixels (via UI scale), use for most UI computations
+ LLRect getWindowRectScaled() const { return mWindowRectScaled; }
+ S32 getWindowHeightScaled() const;
+ S32 getWindowWidthScaled() const;
+
// Window in raw pixels as seen on screen.
- const LLRect& getWindowRect() const { return mWindowRect; };
- // portion of window that shows 3d world
- const LLRect& getWorldViewRect() const { return mWorldViewRect; };
- LLRect getVirtualWorldViewRect() const;
- S32 getWorldViewHeight() const;
- S32 getWorldViewWidth() const;
- S32 getWindowDisplayHeight() const;
- S32 getWindowDisplayWidth() const;
-
- // Window in scaled pixels (via UI scale), use this for
- // UI elements checking size.
- const LLRect& getVirtualWindowRect() const { return mVirtualWindowRect; };
- S32 getWindowHeight() const;
- S32 getWindowWidth() const;
+ LLRect getWindowRectRaw() const { return mWindowRectRaw; }
+ S32 getWindowHeightRaw() const;
+ S32 getWindowWidthRaw() const;
LLWindow* getWindow() const { return mWindow; }
void* getPlatformWindow() const;
@@ -294,8 +295,8 @@ public:
void updateKeyboardFocus();
void updateWorldViewRect(bool use_full_window=false);
- void updateBottomTrayRect();
-
+ LLView* getNonSideTrayView() { return mNonSideTrayView.get(); }
+ LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); }
BOOL handleKey(KEY key, MASK mask);
void handleScrollWheel (S32 clicks);
@@ -324,7 +325,7 @@ public:
} ESnapshotType;
BOOL saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);
BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE,
- BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_IMAGE_SIZE );
+ BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE );
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
@@ -341,7 +342,6 @@ public:
void performPick();
void returnEmptyPicks();
-
void pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent);
LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
@@ -388,11 +388,12 @@ public:
F32 getWorldViewAspectRatio() const;
const LLVector2& getDisplayScale() const { return mDisplayScale; }
void calcDisplayScale();
+ static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale);
private:
bool shouldShowToolTipFor(LLMouseHandler *mh);
static bool onAlert(const LLSD& notify);
-
+
void switchToolByMask(MASK mask);
void destroyWindow();
void drawMouselookInstructions();
@@ -410,10 +411,12 @@ protected:
BOOL mActive;
BOOL mWantFullscreen;
BOOL mShowFullscreenProgress;
- LLRect mWindowRect;
- LLRect mVirtualWindowRect;
- LLRect mWorldViewRect; // specifies area of screen where we render the 3D world
- LLRootView* mRootView; // a view of size mWindowRect, containing all child views
+
+ LLRect mWindowRectRaw; // whole window, including UI
+ LLRect mWindowRectScaled; // whole window, scaled by UI size
+ LLRect mWorldViewRectRaw; // area of screen for 3D world
+ LLRect mWorldViewRectScaled; // area of screen for 3D world scaled by UI size
+ LLRootView* mRootView; // a view of size mWindowRectRaw, containing all child views
LLVector2 mDisplayScale;
LLCoordGL mCurrentMousePoint; // last mouse position in GL coords
@@ -451,6 +454,10 @@ protected:
BOOL mIgnoreActivate;
std::string mInitAlert; // Window / GL initialization requires an alert
+
+ LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
+ LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
+ LLHandle<LLView> mFloaterViewHolder; // container for floater_view
class LLDebugText* mDebugText; // Internal class for debug text
@@ -466,6 +473,10 @@ protected:
static std::string sSnapshotDir;
static std::string sMovieBaseName;
+
+private:
+ // Object temporarily hovered over while dragging
+ LLPointer<LLViewerObject> mDragHoveredObject;
};
void toggle_flying(void*);
@@ -495,5 +506,6 @@ extern S32 CHAT_BAR_HEIGHT;
extern BOOL gDisplayCameraPos;
extern BOOL gDisplayWindInfo;
extern BOOL gDisplayFOV;
+extern BOOL gDisplayBadge;
#endif
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index 317e361c80..fae98cf49a 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -20,8 +20,9 @@
// other Linden headers
#include "llviewerwindow.h"
-LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow):
- LLDispatchListener(pumpname, "op"),
+LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):
+ LLEventAPI("LLViewerWindow",
+ "LLViewerWindow listener to (e.g.) save a screenshot"),
mViewerWindow(llviewerwindow)
{
// add() every method we want to be able to invoke via this event API.
@@ -34,8 +35,15 @@ LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLVi
// saveSnapshotArgs["showui"] = LLSD::Boolean();
// saveSnapshotArgs["rebuild"] = LLSD::Boolean();
// saveSnapshotArgs["type"] = LLSD::String();
- add("saveSnapshot", &LLViewerWindowListener::saveSnapshot, saveSnapshotArgs);
- add("requestReshape", &LLViewerWindowListener::requestReshape);
+ add("saveSnapshot",
+ "Save screenshot: [\"filename\"], [\"width\"], [\"height\"], [\"showui\"], [\"rebuild\"], [\"type\"]\n"
+ "type: \"COLOR\", \"DEPTH\", \"OBJECT_ID\"\n"
+ "Post on [\"reply\"] an event containing [\"ok\"]",
+ &LLViewerWindowListener::saveSnapshot,
+ saveSnapshotArgs);
+ add("requestReshape",
+ "Resize the window: [\"w\"], [\"h\"]",
+ &LLViewerWindowListener::requestReshape);
}
void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
@@ -50,8 +58,8 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
#undef tp
// Our add() call should ensure that the incoming LLSD does in fact
// contain our required arguments. Deal with the optional ones.
- S32 width (mViewerWindow->getWindowDisplayWidth());
- S32 height(mViewerWindow->getWindowDisplayHeight());
+ S32 width (mViewerWindow->getWindowWidthRaw());
+ S32 height(mViewerWindow->getWindowHeightRaw());
if (event.has("width"))
width = event["width"].asInteger();
if (event.has("height"))
@@ -69,6 +77,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
{
LL_ERRS("LLViewerWindowListener") << "LLViewerWindowListener::saveSnapshot(): "
<< "unrecognized type " << event["type"] << LL_ENDL;
+ return;
}
type = found->second;
}
diff --git a/indra/newview/llviewerwindowlistener.h b/indra/newview/llviewerwindowlistener.h
index 59c636ecec..699f7907af 100644
--- a/indra/newview/llviewerwindowlistener.h
+++ b/indra/newview/llviewerwindowlistener.h
@@ -12,18 +12,17 @@
#if ! defined(LL_LLVIEWERWINDOWLISTENER_H)
#define LL_LLVIEWERWINDOWLISTENER_H
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
class LLViewerWindow;
class LLSD;
/// Listen on an LLEventPump with specified name for LLViewerWindow request events.
-class LLViewerWindowListener: public LLDispatchListener
+class LLViewerWindowListener: public LLEventAPI
{
public:
- /// Specify the pump name on which to listen, and bind the LLViewerWindow
- /// instance to use (e.g. gViewerWindow).
- LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow);
+ /// Bind the LLViewerWindow instance to use (e.g. gViewerWindow).
+ LLViewerWindowListener(LLViewerWindow* llviewerwindow);
private:
void saveSnapshot(const LLSD& event) const;
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index d124cbcdce..6340189c93 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -279,7 +279,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
if (mRawImages[i].isNull())
{
// Read back a raw image for this discard level, if it exists
- mRawImages[i] = new LLImageRaw;
S32 min_dim = llmin(mDetailTextures[i]->getFullWidth(), mDetailTextures[i]->getFullHeight());
S32 ddiscard = 0;
while (min_dim > BASE_SIZE && ddiscard < MAX_DISCARD_LEVEL)
@@ -287,12 +286,23 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
ddiscard++;
min_dim /= 2;
}
- if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i], false))
+
+ BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ;
+ if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later.
{
- llwarns << "Unable to read raw data for terrain detail texture: " << mDetailTextures[i]->getID() << llendl;
- mRawImages[i] = NULL;
+ if(delete_raw)
+ {
+ mDetailTextures[i]->destroyRawImage() ;
+ }
+ lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl;
return FALSE;
}
+
+ mRawImages[i] = mDetailTextures[i]->getRawImage() ;
+ if(delete_raw)
+ {
+ mDetailTextures[i]->destroyRawImage() ;
+ }
if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE ||
mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE ||
mDetailTextures[i]->getComponents() != 3)
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4bf66ba17e..72b9c6df98 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -45,6 +45,7 @@
#include "llaudioengine.h"
#include "noise.h"
+#include "sound_ids.h"
#include "llagent.h" // Get state values from here
#include "llagentwearables.h"
@@ -55,7 +56,7 @@
#include "lldriverparam.h"
#include "lleditingmotion.h"
#include "llemote.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
#include "llheadrotmotion.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -64,7 +65,6 @@
#include "llkeyframewalkmotion.h"
#include "llmutelist.h"
#include "llmoveview.h"
-#include "llnotify.h"
#include "llquantize.h"
#include "llregionhandle.h"
#include "llresmgr.h"
@@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f;
// Helper functions
//-----------------------------------------------------------------------------
static F32 calc_bouncy_animation(F32 x);
-static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures);
//-----------------------------------------------------------------------------
// LLVOAvatar()
@@ -647,7 +646,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mWindFreq(0.f),
mRipplePhase( 0.f ),
mBelowWater(FALSE),
- mAppearanceAnimSetByUser(FALSE),
mLastAppearanceBlendTime(0.f),
mAppearanceAnimating(FALSE),
mNameString(),
@@ -689,7 +687,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mBakedTextureDatas[i].mIsUsed = false;
mBakedTextureDatas[i].mMaskTexName = 0;
mBakedTextureDatas[i].mTextureIndex = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)i);
- mBakedTextureDatas[i].mMorphMasksValid = FALSE;
}
mDirtyMesh = TRUE; // Dirty geometry, need to regenerate.
@@ -999,7 +996,7 @@ void LLVOAvatar::resetImpostors()
// static
void LLVOAvatar::deleteCachedImages(bool clearAll)
-{
+{
if (LLTexLayerSet::sHasCaches)
{
lldebugs << "Deleting layer set caches" << llendl;
@@ -1495,9 +1492,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
//-------------------------------------------------------------------------
// parse the file
//-------------------------------------------------------------------------
- BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE );
+ BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
- if (!success)
+ if (!parsesuccess)
{
llerrs << "Can't parse skeleton file: " << filename << llendl;
return FALSE;
@@ -1508,11 +1505,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if (!root)
{
llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
+ return FALSE;
}
if( !root->hasName( "linden_skeleton" ) )
{
llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
+ return FALSE;
}
std::string version;
@@ -1520,6 +1519,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
{
llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
+ return FALSE;
}
return TRUE;
@@ -2195,13 +2195,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// store off last frame's root position to be consistent with camera position
LLVector3 root_pos_last = mRoot.getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
- BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
if (gNoRender)
{
return TRUE;
}
+ static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
+ bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) &&
+ gVoiceClient->getVoiceEnabled(mID);
+
idleUpdateVoiceVisualizer( voice_enabled );
idleUpdateMisc( detailed_update );
idleUpdateAppearanceAnimation();
@@ -2385,7 +2388,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
F32 old_angle = mImpostorAngle.mV[i];
F32 angle_diff = fabsf(cur_angle-old_angle);
- if (angle_diff > 3.14159f/512.f*distance*mUpdatePeriod)
+ if (angle_diff > F_PI/512.f*distance*mUpdatePeriod)
{
mNeedsImpostorUpdate = TRUE;
}
@@ -2437,7 +2440,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
{
if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
{
- param->stopAnimating(mAppearanceAnimSetByUser);
+ param->stopAnimating(FALSE);
}
}
updateVisualParams();
@@ -2460,7 +2463,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
{
if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
{
- param->animate(morph_amt, mAppearanceAnimSetByUser);
+ param->animate(morph_amt, FALSE);
}
}
}
@@ -2535,9 +2538,21 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
+ if (isFullyLoaded() && isSelf())
+ {
+ static bool first_fully_visible = true;
+ if (first_fully_visible)
+ {
+ llinfos << "self isFullyLoaded, first_fully_visible" << llendl;
+
+ first_fully_visible = false;
+ LLAppearanceManager::instance().onFirstFullyVisible();
+ }
+ }
if (isFullyLoaded())
{
deleteParticleSource();
+ updateLOD();
}
else
{
@@ -2557,7 +2572,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
particle_parameters.mPartImageID = cloud->getID();
particle_parameters.mMaxAge = 0.f;
particle_parameters.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE;
- particle_parameters.mInnerAngle = 3.14159f;
+ particle_parameters.mInnerAngle = F_PI;
particle_parameters.mOuterAngle = 0.f;
particle_parameters.mBurstRate = 0.02f;
particle_parameters.mBurstRadius = 0.0f;
@@ -3081,7 +3096,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (!visible)
{
- //updateMotions(LLCharacter::HIDDEN_UPDATE);
+ updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
@@ -3624,6 +3639,16 @@ void LLVOAvatar::updateVisibility()
mVisible = visible;
}
+// private
+bool LLVOAvatar::shouldAlphaMask()
+{
+ const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
+ && !LLDrawPoolAvatar::sSkipTransparent;
+
+ return should_alpha_mask;
+
+}
+
//-----------------------------------------------------------------------------
// renderSkinned()
//-----------------------------------------------------------------------------
@@ -3757,9 +3782,8 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
if (pass == AVATAR_RENDER_PASS_SINGLE)
{
- const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
- && !LLDrawPoolAvatar::sSkipTransparent;
+ bool should_alpha_mask = shouldAlphaMask();
LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
if (should_alpha_mask)
@@ -3871,11 +3895,21 @@ U32 LLVOAvatar::renderRigid()
return 0;
}
- if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
+ bool should_alpha_mask = shouldAlphaMask();
+ LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
+
+ if (should_alpha_mask)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
+ }
+
+ if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
{
num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
}
+
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
return num_indices;
}
@@ -3919,7 +3953,7 @@ U32 LLVOAvatar::renderFootShadows()
LLGLDepthTest test(GL_TRUE, GL_FALSE);
//render foot shadows
LLGLEnable blend(GL_BLEND);
- gGL.getTexUnit(0)->bind(mShadowImagep.get());
+ gGL.getTexUnit(0)->bind(mShadowImagep, TRUE);
glColor4fv(mShadow0Facep->getRenderColor().mV);
mShadow0Facep->renderIndexed(foot_mask);
glColor4fv(mShadow1Facep->getRenderColor().mV);
@@ -3967,7 +4001,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)
//------------------------------------------------------------------------
// LLVOAvatar::updateTextures()
//------------------------------------------------------------------------
-void LLVOAvatar::updateTextures(LLAgent &agent)
+void LLVOAvatar::updateTextures()
{
BOOL render_avatar = TRUE;
@@ -4031,6 +4065,7 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
// Spam if this is a baked texture, not set to default image, without valid host info
if (isIndexBakedTexture((ETextureIndex)texture_index)
&& imagep->getID() != IMG_DEFAULT_AVATAR
+ && imagep->getID() != IMG_INVISIBLE
&& !imagep->getTargetHost().isOk())
{
LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture "
@@ -5373,12 +5408,11 @@ void LLVOAvatar::updateShadowFaces()
//-----------------------------------------------------------------------------
// updateSexDependentLayerSets()
//-----------------------------------------------------------------------------
-void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user )
+void LLVOAvatar::updateSexDependentLayerSets( BOOL upload_bake )
{
- invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
- invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user );
- invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user );
- updateMeshTextures();
+ invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+ invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
+ invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
}
//-----------------------------------------------------------------------------
@@ -5588,7 +5622,7 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
if (isSelf())
{
// Might be first sit
- LLFirstUse::useSit();
+ //LLFirstUse::useSit();
gAgent.setFlying(FALSE);
gAgent.setThirdPersonHeadOffset(LLVector3::zero);
@@ -5743,7 +5777,7 @@ LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const
}
// virtual
-void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user )
+void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
{
}
@@ -5756,18 +5790,18 @@ void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
{
}
-void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user )
+void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )
{
if (global_color == mTexSkinColor)
{
- invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
- invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user );
- invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user );
+ invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+ invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
+ invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
}
else if (global_color == mTexHairColor)
{
- invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
- invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, set_by_user );
+ invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+ invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, upload_bake );
// ! BACKWARDS COMPATIBILITY !
// Fix for dealing with avatars from viewers that don't bake hair.
@@ -5783,7 +5817,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL
else if (global_color == mTexEyeColor)
{
// llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl;
- invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet, set_by_user );
+ invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet, upload_bake );
}
updateMeshTextures();
}
@@ -5947,6 +5981,9 @@ void LLVOAvatar::updateMeshTextures()
}
+ // Turn on alpha masking correctly for yourself and other avatars on 1.23+
+ mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];
+
// Baked textures should be requested from the sim this avatar is on. JC
const LLHost target_host = getObjectHost();
if (!target_host.isOk())
@@ -5976,7 +6013,7 @@ void LLVOAvatar::updateMeshTextures()
else
{
mBakedTextureDatas[i].mIsLoaded = FALSE;
- if ( (i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER) )
+ if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
{
baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
}
@@ -5984,8 +6021,7 @@ void LLVOAvatar::updateMeshTextures()
}
}
else if (mBakedTextureDatas[i].mTexLayerSet
- && !other_culled
- && (i != BAKED_HAIR || is_layer_baked[i] || isSelf())) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers.
+ && !other_culled)
{
mBakedTextureDatas[i].mTexLayerSet->createComposite();
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE );
@@ -5996,9 +6032,10 @@ void LLVOAvatar::updateMeshTextures()
}
}
}
-
- // ! BACKWARDS COMPATIBILITY !
- // Workaround for viewing avatars from old viewers that haven't baked hair textures.
+
+ // set texture and color of hair manually if we are not using a baked image.
+ // This can happen while loading hair for yourself, or for clients that did not
+ // bake a hair texture. Still needed for yourself after 1.22 is depricated.
if (!is_layer_baked[BAKED_HAIR] || self_customizing)
{
const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);
@@ -6010,8 +6047,6 @@ void LLVOAvatar::updateMeshTextures()
}
}
- // Turn on alpha masking correctly for yourself and other avatars on 1.23+
- mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];
for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
@@ -6091,28 +6126,6 @@ void LLVOAvatar::addMaskedMorph(EBakedTextureIndex index, LLPolyMorphTarget* mor
}
}
-// invalidates morph masks for a given layer. Don't pass a parameter to invalidate all morph masks.
-void LLVOAvatar::invalidateMorphMasks(LLVOAvatarDefines::EBakedTextureIndex index)
-{
- setMorphMasksValid(FALSE, index);
-}
-
-// updates morph masks to be a value for a given layer. Don't pass an argument to set value for all morph masks
-void LLVOAvatar::setMorphMasksValid(BOOL new_status, LLVOAvatarDefines::EBakedTextureIndex index)
-{
- if (index == BAKED_NUM_INDICES)
- {
- for (U8 tex = 0; tex < (U8)BAKED_NUM_INDICES; tex++)
- {
- mBakedTextureDatas[tex].mMorphMasksValid = new_status;
- }
- }
- else if (index < BAKED_NUM_INDICES)
- {
- mBakedTextureDatas[index].mMorphMasksValid = new_status;
- }
-}
-
// returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise
BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index)
{
@@ -6121,9 +6134,20 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde
return FALSE;
}
- if (!mBakedTextureDatas[index].mMaskedMorphs.empty() && !mBakedTextureDatas[index].mMorphMasksValid)
+ if (!mBakedTextureDatas[index].mMaskedMorphs.empty())
{
- return TRUE;
+ if (isSelf())
+ {
+ LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet;
+ if (layer_set)
+ {
+ return !layer_set->isMorphValid();
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
}
return FALSE;
@@ -6252,14 +6276,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )
return TRUE;
}
-void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user )
+void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake )
{
U32 param_name[3];
if( teToColorParams( te, param_name ) )
{
- setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user );
- setVisualParamWeight( param_name[1], new_color.mV[VY], set_by_user );
- setVisualParamWeight( param_name[2], new_color.mV[VZ], set_by_user );
+ setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake );
+ setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake );
+ setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake );
}
}
@@ -6282,7 +6306,7 @@ LLColor4 LLVOAvatar::getDummyColor()
return DUMMY_COLOR;
}
-void LLVOAvatar::dumpAvatarTEs( const std::string& context )
+void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const
{
/* const char* te_name[] = {
"TEX_HEAD_BODYPAINT ",
@@ -6459,7 +6483,7 @@ void LLVOAvatar::onFirstTEMessageReceived()
LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
mBakedTextureDatas[i].mLastTextureIndex = image->getID();
// If we have more than one texture for the other baked layers, we'll want to call this for them too.
- if ( (i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER) )
+ if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
{
image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
}
@@ -6520,12 +6544,12 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
&& baked_index != BAKED_SKIRT)
{
setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,
- LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+ LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
}
}
- if( !mFirstTEMessageReceived )
+ if( !is_first_appearance_message )
{
onFirstTEMessageReceived();
}
@@ -6605,7 +6629,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
if (interp_params)
{
- startAppearanceAnimation(FALSE, FALSE);
+ startAppearanceAnimation();
}
updateVisualParams();
@@ -6817,7 +6841,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
local_tex_iter != baked_dict->mLocalTextures.end();
++local_tex_iter)
{
- setBakedReady(*local_tex_iter, TRUE);
+ if (isSelf()) setBakedReady(*local_tex_iter, TRUE);
}
// ! BACKWARDS COMPATIBILITY !
@@ -6990,11 +7014,10 @@ void LLVOAvatar::cullAvatarsByPixelArea()
}
}
-void LLVOAvatar::startAppearanceAnimation(BOOL set_by_user, BOOL play_sound)
+void LLVOAvatar::startAppearanceAnimation()
{
if(!mAppearanceAnimating)
{
- mAppearanceAnimSetByUser = set_by_user;
mAppearanceAnimating = TRUE;
mAppearanceMorphTimer.reset();
mLastAppearanceBlendTime = 0.f;
@@ -7647,15 +7670,30 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di
void LLVOAvatar::idleUpdateRenderCost()
{
+ static const U32 ARC_BODY_PART_COST = 20;
+ static const U32 ARC_LIMIT = 2048;
+
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
{
return;
}
- U32 shame = 1;
-
+ U32 cost = 0;
std::set<LLUUID> textures;
+ for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
+ {
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
+ ETextureIndex tex_index = baked_dict->mTextureIndex;
+ if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(WT_SKIRT)))
+ {
+ if (isTextureVisible(tex_index))
+ {
+ cost +=ARC_BODY_PART_COST;
+ }
+ }
+ }
+
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
@@ -7671,22 +7709,21 @@ void LLVOAvatar::idleUpdateRenderCost()
const LLDrawable* drawable = attached_object->mDrawable;
if (drawable)
{
- shame += 10;
const LLVOVolume* volume = drawable->getVOVolume();
if (volume)
{
- shame += calc_shame(volume, textures);
+ cost += volume->getRenderCost(textures);
}
}
}
}
}
- shame += textures.size() * 5;
+ cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
- setDebugText(llformat("%d", shame));
- F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
- F32 red = llmin((F32) shame/1024.f, 1.f);
+ setDebugText(llformat("%d", cost));
+ F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
+ F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
mText->setColor(LLColor4(red,green,0,1));
}
@@ -7728,110 +7765,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const
}
-U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures)
-{
- if (!volume)
- {
- return 0;
- }
-
- U32 shame = 0;
-
- U32 invisi = 0;
- U32 shiny = 0;
- U32 glow = 0;
- U32 alpha = 0;
- U32 flexi = 0;
- U32 animtex = 0;
- U32 particles = 0;
- U32 scale = 0;
- U32 bump = 0;
- U32 planar = 0;
-
- if (volume->isFlexible())
- {
- flexi = 1;
- }
- if (volume->isParticleSource())
- {
- particles = 1;
- }
-
- const LLVector3& sc = volume->getScale();
- scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
-
- const LLDrawable* drawablep = volume->mDrawable;
-
- if (volume->isSculpted())
- {
- const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID sculpt_id = sculpt_params->getSculptTexture();
- textures.insert(sculpt_id);
- }
-
- for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
- {
- const LLFace* face = drawablep->getFace(i);
- const LLTextureEntry* te = face->getTextureEntry();
- const LLViewerTexture* img = face->getTexture();
-
- textures.insert(img->getID());
-
- if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
- {
- alpha++;
- }
- else if (img->getPrimaryFormat() == GL_ALPHA)
- {
- invisi = 1;
- }
-
- if (te)
- {
- if (te->getBumpmap())
- {
- bump = 1;
- }
- if (te->getShiny())
- {
- shiny = 1;
- }
- if (te->getGlow() > 0.f)
- {
- glow = 1;
- }
- if (face->mTextureMatrix != NULL)
- {
- animtex++;
- }
- if (te->getTexGen())
- {
- planar++;
- }
- }
- }
-
- shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
-
- LLViewerObject::const_child_list_t& child_list = volume->getChildren();
- for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end();
- ++iter)
- {
- const LLViewerObject* child_objectp = *iter;
- const LLDrawable* child_drawablep = child_objectp->mDrawable;
- if (child_drawablep)
- {
- const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
- if (child_volumep)
- {
- shame += calc_shame(child_volumep, textures);
- }
- }
- }
-
- return shame;
-}
//virtual
S32 LLVOAvatar::getTexImageSize() const
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index f7c794defe..b5f0ec7176 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -125,7 +125,7 @@ public:
virtual BOOL updateLOD();
BOOL updateJointLODs();
virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- virtual void updateTextures(LLAgent &agent);
+ virtual void updateTextures();
virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.
virtual void onShift(const LLVector3& shift_vector);
virtual U32 getPartitionType() const;
@@ -347,6 +347,8 @@ public:
BOOL mIsDummy; // for special views
S32 mSpecialRenderMode; // special lighting
private:
+ bool shouldAlphaMask();
+
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
@@ -355,10 +357,8 @@ private:
// Morph masks
//--------------------------------------------------------------------
public:
- void invalidateMorphMasks(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES);
BOOL morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES);
void addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer);
- void setMorphMasksValid(BOOL new_status, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES);
void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES);
//--------------------------------------------------------------------
@@ -489,7 +489,6 @@ protected:
// Stores pointers to the joint meshes that this baked texture deals with
std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts
morph_list_t mMaskedMorphs;
- BOOL mMorphMasksValid;
};
typedef std::vector<BakedTextureData> bakedtexturedata_vec_t;
bakedtexturedata_vec_t mBakedTextureDatas;
@@ -525,7 +524,7 @@ protected:
// Composites
//--------------------------------------------------------------------
public:
- virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user);
+ virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
virtual void invalidateAll();
virtual void setCompositeUpdatesEnabled(BOOL b);
@@ -561,12 +560,12 @@ private:
public:
void updateMeshTextures();
- void updateSexDependentLayerSets(BOOL set_by_user);
+ void updateSexDependentLayerSets(BOOL upload_bake);
void dirtyMesh(); // Dirty the avatar mesh
void updateMeshData();
protected:
void releaseMeshData();
- /*virtual*/ void restoreMeshData();
+ virtual void restoreMeshData();
private:
BOOL mDirtyMesh;
BOOL mMeshTexturesDirty;
@@ -594,7 +593,7 @@ protected:
public:
void processAvatarAppearance(LLMessageSystem* mesgsys);
void hideSkirt();
- void startAppearanceAnimation(BOOL set_by_user, BOOL play_sound);
+ void startAppearanceAnimation();
//--------------------------------------------------------------------
// Appearance morphing
@@ -603,14 +602,13 @@ public:
BOOL mAppearanceAnimating;
private:
LLFrameTimer mAppearanceMorphTimer;
- BOOL mAppearanceAnimSetByUser;
F32 mLastAppearanceBlendTime;
//--------------------------------------------------------------------
// Clothing colors (convenience functions to access visual parameters)
//--------------------------------------------------------------------
public:
- void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL set_by_user);
+ void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake);
LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te);
static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name);
@@ -619,7 +617,7 @@ public:
//--------------------------------------------------------------------
public:
LLColor4 getGlobalColor(const std::string& color_name ) const;
- void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user);
+ void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake);
private:
LLTexGlobalColor* mTexSkinColor;
LLTexGlobalColor* mTexHairColor;
@@ -893,7 +891,7 @@ public:
static void dumpArchetypeXML(void*);
static void dumpBakedStatus();
const std::string getBakedStatusForPrintout() const;
- void dumpAvatarTEs(const std::string& context);
+ void dumpAvatarTEs(const std::string& context) const;
static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars
static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame)
diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp
index 17b502ae80..49c4a1a6c8 100644
--- a/indra/newview/llvoavatardefines.cpp
+++ b/indra/newview/llvoavatardefines.cpp
@@ -68,9 +68,9 @@ LLVOAvatarDictionary::Textures::Textures()
addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
- addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "UIImgDefaultTattooUUID", WT_TATTOO));
- addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "UIImgDefaultTattooUUID", WT_TATTOO));
- addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "UIImgDefaultTattooUUID", WT_TATTOO));
+ addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
+ addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
+ addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
addEntry(TEX_HEAD_BAKED, new TextureEntry("head-baked", FALSE, BAKED_HEAD));
addEntry(TEX_UPPER_BAKED, new TextureEntry("upper-baked", FALSE, BAKED_UPPER));
@@ -84,34 +84,34 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures()
{
// Baked textures
addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED,
- "head", "18ded8d6-bcfc-e415-8539-944c0f5ea7a6",
+ "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff",
3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA,
5, WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA));
addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED,
- "upper_body", "338c29e3-3024-4dbb-998d-7c04cf4fa88f",
+ "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4",
7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET,
TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA,
8, WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA));
addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED,
- "lower_body", "91b4a2c7-1b1a-ba16-9a16-1f8f8dcc1c3f",
+ "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d",
8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS,
TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA,
9, WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA));
addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED,
- "eyes", "b2cf28af-b840-1071-3c6a-78085d8128b5",
+ "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788",
2, TEX_EYES_IRIS, TEX_EYES_ALPHA,
2, WT_EYES, WT_ALPHA));
addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED,
- "skirt", "ea800387-ea1a-14e0-56cb-24f2022f969a",
+ "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63",
1, TEX_SKIRT,
1, WT_SKIRT));
addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED,
- "hair", "0af1ef7c-ad24-11dd-8790-001f5bf833e8",
+ "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61",
2, TEX_HAIR, TEX_HAIR_ALPHA,
2, WT_HAIR, WT_ALPHA));
}
@@ -248,8 +248,6 @@ EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name)
//static
const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index)
{
- /* switch( index )
- case TEX_UPPER_SHIRT: return LLUUID( gSavedSettings.getString("UIImgDefaultShirtUUID") ); */
const TextureEntry *texture_dict = getInstance()->getTexture(index);
const std::string &default_image_name = texture_dict->mDefaultImageName;
if (default_image_name == "")
@@ -265,9 +263,6 @@ const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index)
// static
EWearableType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index )
{
- /* switch(index)
- case TEX_UPPER_SHIRT:
- return WT_SHIRT; */
return getInstance()->getTexture(index)->mWearableType;
}
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 758db538a2..00998b300a 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -41,53 +41,22 @@
#include "llvoavatarself.h"
#include "llvoavatar.h"
-#include <stdio.h>
-#include <ctype.h>
-
-#include "llaudioengine.h"
-#include "noise.h"
+#include "pipeline.h"
-// TODO: Seraph - Remove unnecessary headers. These are copied from llvoavatar.h.
#include "llagent.h" // Get state values from here
#include "llagentwearables.h"
-#include "llviewercontrol.h"
-#include "lldrawpoolavatar.h"
-#include "lldriverparam.h"
-#include "lleditingmotion.h"
-#include "llemote.h"
-#include "llface.h"
-#include "llfirstuse.h"
-#include "llheadrotmotion.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
-#include "llkeyframefallmotion.h"
-#include "llkeyframestandmotion.h"
-#include "llkeyframewalkmotion.h"
-#include "llmutelist.h"
#include "llselectmgr.h"
-#include "llsprite.h"
-#include "lltargetingmotion.h"
-#include "lltexlayer.h"
-#include "lltexglobalcolor.h"
#include "lltoolgrab.h" // for needsRenderBeam
#include "lltoolmgr.h" // for needsRenderBeam
#include "lltoolmorph.h"
#include "lltrans.h"
#include "llviewercamera.h"
-#include "llviewertexturelist.h"
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
-#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
-#include "llvovolume.h"
-#include "llworld.h"
-#include "pipeline.h"
-#include "llviewershadermgr.h"
-#include "llsky.h"
-#include "llanimstatelabels.h"
-#include "llgesturemgr.h" //needed to trigger the voice gesticulations
-#include "llvoiceclient.h"
-#include "llvoicevisualizer.h" // Ventrella
+#include "llviewerregion.h"
#include "llappearancemgr.h"
#if LL_MSVC
@@ -205,7 +174,10 @@ void LLVOAvatarSelf::markDead()
param;
param = (LLViewerVisualParam*) getNextVisualParam())
{
- param->setIsDummy(TRUE);
+ if (param->getWearableType() != WT_INVALID)
+ {
+ param->setIsDummy(TRUE);
+ }
}
return success;
@@ -346,11 +318,6 @@ BOOL LLVOAvatarSelf::buildMenus()
}
}
-
- if (!attachment_found)
- {
- gAttachPieMenu->addSeparator();
- }
}
if (gDetachBodyPartPieMenus[i])
@@ -390,11 +357,6 @@ BOOL LLVOAvatarSelf::buildMenus()
break;
}
}
-
- if (!attachment_found)
- {
- gDetachPieMenu->addSeparator();
- }
}
}
@@ -515,18 +477,10 @@ BOOL LLVOAvatarSelf::buildMenus()
}
// add in requested order to pie menu, inserting separators as necessary
- S32 cur_pie_slice = 0;
for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();
attach_it != attachment_pie_menu_map.end(); ++attach_it)
{
- S32 requested_pie_slice = attach_it->first;
S32 attach_index = attach_it->second;
- while (cur_pie_slice < requested_pie_slice)
- {
- gAttachBodyPartPieMenus[group]->addSeparator();
- gDetachBodyPartPieMenus[group]->addSeparator();
- cur_pie_slice++;
- }
LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
if (attachment)
@@ -548,7 +502,6 @@ BOOL LLVOAvatarSelf::buildMenus()
item_params.on_enable.parameter = attach_index;
item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
gDetachBodyPartPieMenus[group]->addChild(item);
- cur_pie_slice++;
}
}
}
@@ -557,8 +510,12 @@ BOOL LLVOAvatarSelf::buildMenus()
LLVOAvatarSelf::~LLVOAvatarSelf()
{
- gAgent.setAvatarObject(NULL);
- gAgentWearables.setAvatarObject(NULL);
+ // gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so.
+ if (gAgent.getAvatarObject() == this)
+ {
+ gAgent.setAvatarObject(NULL);
+ gAgentWearables.setAvatarObject(NULL);
+ }
delete mScreenp;
mScreenp = NULL;
}
@@ -661,33 +618,33 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
return LLVOAvatar::getJoint(name);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
{
if (!which_param)
{
return FALSE;
}
LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID());
- return setParamWeight(param,weight,set_by_user);
+ return setParamWeight(param,weight,upload_bake);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )
{
if (!param_name)
{
return FALSE;
}
LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name);
- return setParamWeight(param,weight,set_by_user);
+ return setParamWeight(param,weight,upload_bake);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )
{
LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
- return setParamWeight(param,weight,set_by_user);
+ return setParamWeight(param,weight,upload_bake);
}
-BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user )
+BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake )
{
if (!param)
{
@@ -703,12 +660,12 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL
LLWearable *wearable = gAgentWearables.getWearable(type,count);
if (wearable)
{
- wearable->setVisualParamWeight(param->getID(), weight, set_by_user);
+ wearable->setVisualParamWeight(param->getID(), weight, upload_bake);
}
}
}
- return LLCharacter::setVisualParamWeight(param,weight,set_by_user);
+ return LLCharacter::setVisualParamWeight(param,weight,upload_bake);
}
/*virtual*/
@@ -719,7 +676,7 @@ void LLVOAvatarSelf::updateVisualParams()
LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);
if (wearable)
{
- wearable->writeToAvatar(FALSE, FALSE);
+ wearable->writeToAvatar();
}
}
@@ -730,7 +687,7 @@ void LLVOAvatarSelf::updateVisualParams()
void LLVOAvatarSelf::idleUpdateAppearanceAnimation()
{
// Animate all top-level wearable visual parameters
- gAgentWearables.animateAllWearableParams(calcMorphAmount(), mAppearanceAnimSetByUser);
+ gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);
// apply wearable visual params to avatar
updateVisualParams();
@@ -765,8 +722,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)
}
}
-// virtual
-void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index)
+void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index)
{
if (te >= TEX_NUM_INDICES)
{
@@ -785,19 +741,7 @@ void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_b
return;
}
- LLTexLayerSet* layer_set = getLayerSet((ETextureIndex)te);
- if (layer_set)
- {
- invalidateComposite(layer_set, set_by_user);
- }
-
setTEImage(te, image);
- updateMeshTextures();
-
- if (gAgent.cameraCustomizeAvatar())
- {
- LLVisualParamHint::requestHintUpdates();
- }
}
//virtual
@@ -978,9 +922,9 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
//-----------------------------------------------------------------------------
// updatedWearable( EWearableType type )
// forces an update to any baked textures relevant to type.
-// Should be called only on saving the wearable
+// will force an upload of the resulting bake if the second parameter is TRUE
//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::wearableUpdated( EWearableType type )
+void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
{
for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
@@ -988,6 +932,13 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
{
const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first;
+
+ // if we're editing our appearance, ensure that we're not using baked textures
+ // The baked texture for alpha masks is set explicitly when you hit "save"
+ if (gAgent.cameraCustomizeAvatar())
+ {
+ setNewBakedTexture(index,IMG_DEFAULT_AVATAR);
+ }
if (baked_dict)
{
for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();
@@ -999,7 +950,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
{
if (mBakedTextureDatas[index].mTexLayerSet)
{
- invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, TRUE);
+ invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);
}
break;
}
@@ -1080,15 +1031,8 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
if (attachment->isObjectAttached(viewer_object))
{
const LLUUID& attachment_id = viewer_object->getItemID();
- LLViewerInventoryItem *item = gInventory.getItem(attachment_id);
- if (item)
- {
- LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
- LLAppearanceManager::wearItem(item,false); // Add COF link for item.
- gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id);
- }
+ LLAppearanceManager::instance().registerAttachment(attachment_id);
}
- gInventory.notifyObservers();
return attachment;
}
@@ -1096,12 +1040,12 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
//virtual
BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
{
- const LLUUID item_id = viewer_object->getItemID();
+ const LLUUID attachment_id = viewer_object->getItemID();
if (LLVOAvatar::detachObject(viewer_object))
{
// the simulator should automatically handle permission revocation
- stopMotionFromSource(item_id);
+ stopMotionFromSource(attachment_id);
LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
@@ -1126,31 +1070,14 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
}
else
{
- LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
- LLAppearanceManager::removeItemLinks(item_id, false);
+ LLAppearanceManager::instance().unregisterAttachment(attachment_id);
}
- // BAP - needs to change for label to track link.
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- gInventory.notifyObservers();
return TRUE;
}
return FALSE;
}
-void LLVOAvatarSelf::getAllAttachmentsArray(LLDynamicArray<S32>& attachments)
-{
- for (LLVOAvatar::attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
- iter != mAttachmentPoints.end(); ++iter)
- {
- LLViewerJointAttachment* attachment = iter->second;
- if ( attachment && (attachment->getNumObjects() > 0))
- {
- attachments.push_back(iter->first);
- }
- }
-}
-
U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const
{
EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
@@ -1210,26 +1137,6 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr
}
// virtual
-/* //unused
-BOOL LLVOAvatarSelf::getLocalTextureRaw(ETextureIndex index, LLImageRaw* image_raw) const
-{
- if (!isIndexLocalTexture(index)) return FALSE;
- if (getLocalTextureID(index) == IMG_DEFAULT_AVATAR) return TRUE;
-
- const LocalTextureData *local_tex_data = getLocalTextureData(index)[0];
- if (local_tex_data->mImage->readBackRaw(-1, image_raw, false))
- {
-
- return TRUE;
- }
-
- // No data loaded yet
- setLocalTexture((ETextureIndex)index, getTEImage(index), FALSE); // <-- non-const, move this elsewhere
- return FALSE;
-}
-*/
-
-// virtual
BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex_pp, U32 index) const
{
*tex_pp = NULL;
@@ -1418,7 +1325,7 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const
return false;
}
-void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user )
+void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
{
if( !layerset || !layerset->getUpdatesEnabled() )
{
@@ -1426,16 +1333,17 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u
}
// llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegion() << llendl;
- invalidateMorphMasks(layerset->getBakedTexIndex());
layerset->requestUpdate();
+ layerset->invalidateMorphMasks();
- if( set_by_user )
+ if( upload_result )
{
llassert(isSelf());
ETextureIndex baked_te = getBakedTE( layerset );
setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) );
layerset->requestUpload();
+ updateMeshTextures();
}
}
@@ -1445,7 +1353,6 @@ void LLVOAvatarSelf::invalidateAll()
{
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
}
- updateMeshTextures();
}
//-----------------------------------------------------------------------------
@@ -1659,7 +1566,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const
llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;
#endif
}
- else if (local_tex_obj->getImage() != NULL)
+ else if (local_tex_obj && local_tex_obj->getImage() != NULL)
{
if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)
{
@@ -1880,12 +1787,13 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe
if (!covered_by_baked)
{
- if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR)
+ if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0)
{
F32 desired_pixels;
desired_pixels = llmin(mPixelArea, (F32)getTexImageArea());
imagep->setBoostLevel(getAvatarBoostLevel());
imagep->addTextureStats( desired_pixels / texel_area_ratio );
+ imagep->forceUpdateBindStats() ;
if (imagep->getDiscardLevel() < 0)
{
mHasGrey = TRUE; // for statistics gathering
@@ -1929,6 +1837,13 @@ ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const
}
+void LLVOAvatarSelf::setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid)
+{
+ ETextureIndex index = LLVOAvatarDictionary::bakedToLocalTextureIndex(i);
+ setNewBakedTexture(index, uuid);
+}
+
+
//-----------------------------------------------------------------------------
// setNewBakedTexture()
// A new baked texture has been successfully uploaded and we can start using it now.
@@ -2015,9 +1930,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
if (layer_set)
{
llinfos << "TAT: rebake - matched entry " << (S32)index << llendl;
- // Apparently set_by_user == force upload
- BOOL set_by_user = TRUE;
- self->invalidateComposite(layer_set, set_by_user);
+ self->invalidateComposite(layer_set, TRUE);
found = TRUE;
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
}
@@ -2053,8 +1966,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
layer_set->cancelUpload();
}
- BOOL set_by_user = TRUE;
- invalidateComposite(layer_set, set_by_user);
+ invalidateComposite(layer_set, TRUE);
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
}
else
@@ -2065,6 +1977,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
// Don't know if this is needed
updateMeshTextures();
+
}
//-----------------------------------------------------------------------------
@@ -2117,48 +2030,52 @@ void LLVOAvatarSelf::onCustomizeEnd()
if (avatarp)
{
avatarp->invalidateAll();
- avatarp->requestLayerSetUploads();
}
}
-// static
-void LLVOAvatarSelf::onChangeSelfInvisible(BOOL newvalue)
+// HACK: this will null out the avatar's local texture IDs before the TE message is sent
+// to ensure local texture IDs are not sent to other clients in the area.
+// this is a short-term solution. The long term solution will be to not set the texture
+// IDs in the avatar object, and keep them only in the wearable.
+// This will involve further refactoring that is too risky for the initial release of 2.0.
+bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
{
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ LLUUID texture_id[TEX_NUM_INDICES];
+ // pack away current TEs to make sure we don't send them out
+ for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
+ iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
+ ++iter)
{
- if (newvalue)
- {
- // we have just requested to set the avatar's baked textures to invisible
- avatarp->setInvisible(TRUE);
- }
- else
+ const ETextureIndex index = iter->first;
+ const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
+ if (!texture_dict->mIsBakedTexture)
{
- avatarp->setInvisible(FALSE);
+ LLTextureEntry* entry = getTE((U8) index);
+ texture_id[index] = entry->getID();
+ entry->setID(IMG_DEFAULT_AVATAR);
}
}
-}
-void LLVOAvatarSelf::setInvisible(BOOL newvalue)
-{
- if (newvalue)
+ bool success = packTEMessage(mesgsys);
+
+ // unpack TEs to make sure we don't re-trigger a bake
+ for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
+ iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
+ ++iter)
{
- setCompositeUpdatesEnabled(FALSE);
- for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
+ const ETextureIndex index = iter->first;
+ const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
+ if (!texture_dict->mIsBakedTexture)
{
- setNewBakedTexture(mBakedTextureDatas[i].mTextureIndex, IMG_INVISIBLE);
+ LLTextureEntry* entry = getTE((U8) index);
+ entry->setID(texture_id[index]);
}
- gAgent.sendAgentSetAppearance();
- }
- else
- {
- setCompositeUpdatesEnabled(TRUE);
- invalidateAll();
- requestLayerSetUploads();
- gAgent.sendAgentSetAppearance();
}
+
+ return success;
}
+
//------------------------------------------------------------------------
// needsRenderBeam()
//------------------------------------------------------------------------
@@ -2183,6 +2100,49 @@ BOOL LLVOAvatarSelf::needsRenderBeam()
// static
void LLVOAvatarSelf::deleteScratchTextures()
{
+ if(gAuditTexture)
+ {
+ S32 total_tex_size = sScratchTexBytes ;
+ S32 tex_size = SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT ;
+
+ if( sScratchTexNames.checkData( GL_LUMINANCE ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= tex_size ;
+ }
+ if( sScratchTexNames.checkData( GL_ALPHA ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= tex_size ;
+ }
+ if( sScratchTexNames.checkData( GL_COLOR_INDEX ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= tex_size ;
+ }
+ if( sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= 2 * tex_size ;
+ }
+ if( sScratchTexNames.checkData( GL_RGB ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 3, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= 3 * tex_size ;
+ }
+ if( sScratchTexNames.checkData( GL_RGBA ) )
+ {
+ LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= 4 * tex_size ;
+ }
+ //others
+ while(total_tex_size > 0)
+ {
+ LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ total_tex_size -= 4 * tex_size ;
+ }
+ }
+
for( LLGLuint* namep = sScratchTexNames.getFirstData();
namep;
namep = sScratchTexNames.getNextData() )
@@ -2205,7 +2165,8 @@ void LLVOAvatarSelf::deleteScratchTextures()
BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
{
U32 texture_bytes = 0;
- GLuint gl_name = getScratchTexName( format, &texture_bytes );
+ S32 components = 0;
+ GLuint gl_name = getScratchTexName( format, components, &texture_bytes );
if( gl_name )
{
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
@@ -2217,12 +2178,12 @@ BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
if( *last_bind_time != LLImageGL::sLastFrameTime )
{
*last_bind_time = LLImageGL::sLastFrameTime;
- LLImageGL::updateBoundTexMem(texture_bytes);
+ LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
}
}
else
{
- LLImageGL::updateBoundTexMem(texture_bytes);
+ LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) );
}
return TRUE;
@@ -2230,9 +2191,8 @@ BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
return FALSE;
}
-LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, U32* texture_bytes )
-{
- S32 components;
+LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U32* texture_bytes )
+{
GLenum internal_format;
switch( format )
{
@@ -2278,6 +2238,11 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, U32* texture_bytes
sScratchTexBytes += *texture_bytes;
LLImageGL::sGlobalTextureMemoryInBytes += *texture_bytes;
+
+ if(gAuditTexture)
+ {
+ LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
+ }
return name;
}
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 6e52b33634..dc70996f0b 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -86,15 +86,15 @@ public:
/*virtual*/ void requestStopMotion(LLMotion* motion);
/*virtual*/ LLJoint* getJoint(const std::string &name);
- /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
- /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
- /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+ /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
+ /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
+ /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
/*virtual*/ void updateVisualParams();
/*virtual*/ void idleUpdateAppearanceAnimation();
private:
// helper function. Passed in param is assumed to be in avatar's parameter list.
- BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user = FALSE );
+ BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE );
/** Initialization
@@ -186,7 +186,7 @@ public:
BOOL getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const;
LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
- void setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index);
+ void setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index);
const LLUUID& grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
BOOL canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
/*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);
@@ -209,6 +209,7 @@ private:
//--------------------------------------------------------------------
public:
LLVOAvatarDefines::ETextureIndex getBakedTE(const LLTexLayerSet* layerset ) const;
+ void setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid);
void setNewBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid);
void setCachedBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid);
void forceBakeAllTextures(bool slam_for_debug = false);
@@ -228,7 +229,7 @@ public:
// Composites
//--------------------------------------------------------------------
public:
- /* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user);
+ /* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
/* virtual */ void invalidateAll();
/* virtual */ void setCompositeUpdatesEnabled(BOOL b); // only works for self
void setupComposites();
@@ -241,7 +242,7 @@ public:
BOOL bindScratchTexture(LLGLenum format);
static void deleteScratchTextures();
protected:
- LLGLuint getScratchTexName(LLGLenum format, U32* texture_bytes);
+ LLGLuint getScratchTexName(LLGLenum format, S32& components, U32* texture_bytes);
private:
static S32 sScratchTexBytes;
static LLMap< LLGLenum, LLGLuint*> sScratchTexNames;
@@ -269,7 +270,7 @@ protected:
public:
/*virtual*/ BOOL isWearingWearableType(EWearableType type) const;
- void wearableUpdated(EWearableType type);
+ void wearableUpdated(EWearableType type, BOOL upload_result);
protected:
U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const;
@@ -283,7 +284,6 @@ public:
const std::string getAttachedPointName(const LLUUID& inv_item_id) const;
/*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object);
/*virtual*/ BOOL detachObject(LLViewerObject *viewer_object);
- void getAllAttachmentsArray(LLDynamicArray<S32>& attachments);
//--------------------------------------------------------------------
// HUDs
@@ -308,8 +308,7 @@ public:
// Visibility
//--------------------------------------------------------------------
public:
- static void onChangeSelfInvisible(BOOL newvalue);
- void setInvisible(BOOL newvalue);
+ bool sendAppearanceMessage(LLMessageSystem *mesgsys) const;
/** Appearance
** **
diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp
index 8d3c8b6f1a..177cb16c50 100644
--- a/indra/newview/llvoclouds.cpp
+++ b/indra/newview/llvoclouds.cpp
@@ -101,7 +101,7 @@ void LLVOClouds::setPixelAreaAndAngle(LLAgent &agent)
mPixelArea = 1500*100;
}
-void LLVOClouds::updateTextures(LLAgent &agent)
+void LLVOClouds::updateTextures()
{
getTEImage(0)->addTextureStats(mPixelArea);
}
diff --git a/indra/newview/llvoclouds.h b/indra/newview/llvoclouds.h
index 95e6b96e4e..c4a75f5b5e 100644
--- a/indra/newview/llvoclouds.h
+++ b/indra/newview/llvoclouds.h
@@ -65,7 +65,7 @@ public:
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
F32 getPartSize(S32 idx);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
void updateFaceSize(S32 idx) { }
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 570a3334b9..e311f07912 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -38,7 +38,7 @@
#include "llviewercontrol.h"
#include "llagent.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "lldrawable.h"
#include "llface.h"
#include "llsky.h"
@@ -106,7 +106,7 @@ void LLVOGrass::updateSpecies()
SpeciesMap::const_iterator it = sSpeciesTable.begin();
mSpecies = (*it).first;
}
- setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+ setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
}
@@ -211,7 +211,7 @@ void LLVOGrass::initClass()
{
LLSD args;
args["SPECIES"] = err;
- LLNotifications::instance().add("ErrorUndefinedGrasses", args);
+ LLNotificationsUtil::add("ErrorUndefinedGrasses", args);
}
for (S32 i = 0; i < GRASS_MAX_BLADES; ++i)
@@ -322,7 +322,7 @@ void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent)
// BUG could speed this up by caching the relative_position and range calculations
-void LLVOGrass::updateTextures(LLAgent &agent)
+void LLVOGrass::updateTextures()
{
if (getTEImage(0))
{
diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h
index 124400d356..6a6fcc31c3 100644
--- a/indra/newview/llvograss.h
+++ b/indra/newview/llvograss.h
@@ -72,7 +72,7 @@ public:
LLStrider<U16>& indicesp);
void updateFaceSize(S32 idx) { }
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ BOOL updateLOD();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index ac2484ddfd..221c6b61ec 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -70,7 +70,7 @@ BOOL LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
-void LLVOGround::updateTextures(LLAgent &agent)
+void LLVOGround::updateTextures()
{
}
diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h
index af3fcd65d4..0ccb0834a2 100644
--- a/indra/newview/llvoground.h
+++ b/indra/newview/llvoground.h
@@ -51,7 +51,7 @@ public:
// Graphical stuff for objects - maybe broken out into render class
// later?
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 96fcf61e62..fac7fa6a18 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -36,6 +36,7 @@
#include "llfloaterreg.h"
#include "llimview.h"
#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llpanel.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h"
@@ -46,6 +47,7 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap;
LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap;
LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL;
LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
+LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChangedSignal;
BOOL LLVoiceChannel::sSuspended = FALSE;
@@ -79,13 +81,13 @@ void LLVoiceCallCapResponder::error(U32 status, const std::string& reason)
if ( 403 == status )
{
//403 == no ability
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"VoiceNotAllowed",
channelp->getNotifyArgs());
}
else
{
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"VoiceCallGenericError",
channelp->getNotifyArgs());
}
@@ -119,7 +121,9 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
mSessionID(session_id),
mState(STATE_NO_CHANNEL_INFO),
mSessionName(session_name),
- mIgnoreNextSessionLeave(FALSE)
+ mCallDirection(OUTGOING_CALL),
+ mIgnoreNextSessionLeave(FALSE),
+ mCallEndedByAgent(false)
{
mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -136,7 +140,10 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
LLVoiceChannel::~LLVoiceChannel()
{
// Don't use LLVoiceClient::getInstance() here -- this can get called during atexit() time and that singleton MAY have already been destroyed.
- if(gVoiceClient)
+ // Using call of instanceExists() instead of gVoiceClient in check to avoid crash in LLVoiceClient::removeObserver()
+ // when quitting viewer by closing console window before login (though in case of such quit crash will occur
+ // later in other destructors anyway). EXT-5524
+ if(LLVoiceClient::instanceExists())
{
gVoiceClient->removeObserver(this);
}
@@ -157,13 +164,13 @@ void LLVoiceChannel::setChannelInfo(
{
if (mURI.empty())
{
- LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs);
+ LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
llwarns << "Received empty URI for channel " << mSessionName << llendl;
deactivate();
}
else if (mCredentials.empty())
{
- LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs);
+ LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
llwarns << "Received empty credentials for channel " << mSessionName << llendl;
deactivate();
}
@@ -207,7 +214,7 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
{
case STATUS_LOGIN_RETRY:
//mLoginNotificationHandle = LLNotifyBox::showXml("VoiceLoginRetry")->getHandle();
- LLNotifications::instance().add("VoiceLoginRetry");
+ LLNotificationsUtil::add("VoiceLoginRetry");
break;
case STATUS_LOGGED_IN:
//if (!mLoginNotificationHandle.isDead())
@@ -225,7 +232,6 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
{
// if forceably removed from channel
// update the UI and revert to default channel
- LLNotifications::instance().add("VoiceChannelDisconnected", mNotifyArgs);
deactivate();
}
mIgnoreNextSessionLeave = FALSE;
@@ -276,10 +282,14 @@ void LLVoiceChannel::deactivate()
if (callStarted())
{
setState(STATE_HUNG_UP);
- // mute the microphone if required when returning to the proximal channel
- if (gSavedSettings.getBOOL("AutoDisengageMic") && sCurrentVoiceChannel == this)
+
+ //Default mic is OFF when leaving voice calls
+ if (gSavedSettings.getBOOL("AutoDisengageMic") &&
+ sCurrentVoiceChannel == this &&
+ gVoiceClient->getUserPTTState())
{
gSavedSettings.setBOOL("PTTCurrentlyEnabled", true);
+ gVoiceClient->inputUserControlState(true);
}
}
@@ -305,8 +315,10 @@ void LLVoiceChannel::activate()
// activating the proximal channel between IM calls
LLVoiceChannel* old_channel = sCurrentVoiceChannel;
sCurrentVoiceChannel = this;
+ mCallDialogPayload["old_channel_name"] = "";
if (old_channel)
{
+ mCallDialogPayload["old_channel_name"] = old_channel->getSessionName();
old_channel->deactivate();
}
}
@@ -320,6 +332,9 @@ void LLVoiceChannel::activate()
{
setState(STATE_CALL_STARTED);
}
+
+ //do not send earlier, channel should be initialized, should not be in STATE_NO_CHANNEL_INFO state
+ sCurrentVoiceChannelChangedSignal(this->mSessionID);
}
void LLVoiceChannel::getChannelInfo()
@@ -378,35 +393,30 @@ void LLVoiceChannel::setState(EState state)
switch(state)
{
case STATE_RINGING:
- gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs);
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("ringing", mNotifyArgs);
break;
case STATE_CONNECTED:
- gIMMgr->addSystemMessage(mSessionID, "connected", mNotifyArgs);
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("connected", mNotifyArgs);
break;
case STATE_HUNG_UP:
- gIMMgr->addSystemMessage(mSessionID, "hang_up", mNotifyArgs);
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("hang_up", mNotifyArgs);
break;
default:
break;
}
- mState = state;
+ doSetState(state);
}
-void LLVoiceChannel::toggleCallWindowIfNeeded(EState state)
+void LLVoiceChannel::doSetState(const EState& new_state)
{
- if (state == STATE_CONNECTED)
- {
- LLFloaterReg::showInstance("voice_call", mSessionID);
- }
- // By checking that current state is CONNECTED we make sure that the call window
- // has been shown, hence there's something to hide. This helps when user presses
- // the "End call" button right after initiating the call.
- // *TODO: move this check to LLFloaterCall?
- else if (state == STATE_HUNG_UP && mState == STATE_CONNECTED)
- {
- LLFloaterReg::hideInstance("voice_call", mSessionID);
- }
+ EState old_state = mState;
+ mState = new_state;
+ if (!mStateChangedCallback.empty())
+ mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
//static
@@ -446,6 +456,17 @@ void LLVoiceChannel::resume()
}
}
+boost::signals2::connection LLVoiceChannel::setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb, bool at_front)
+{
+ if (at_front)
+ {
+ return sCurrentVoiceChannelChangedSignal.connect(cb, boost::signals2::at_front);
+ }
+ else
+ {
+ return sCurrentVoiceChannelChangedSignal.connect(cb);
+ }
+}
//
// LLVoiceChannelGroup
@@ -488,6 +509,13 @@ void LLVoiceChannelGroup::activate()
LLRecentPeople::instance().add(buddy_id);
}
#endif
+
+ //Mic default state is OFF on initiating/joining Ad-Hoc/Group calls
+ if (gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+ {
+ gVoiceClient->inputUserControlState(true);
+ }
+
}
}
@@ -599,7 +627,7 @@ void LLVoiceChannelGroup::handleError(EStatusType status)
// notification
if (!notify.empty())
{
- LLNotificationPtr notification = LLNotifications::instance().add(notify, mNotifyArgs);
+ LLNotificationPtr notification = LLNotificationsUtil::add(notify, mNotifyArgs);
// echo to im window
gIMMgr->addMessage(mSessionID, LLUUID::null, SYSTEM_FROM, notification->getMessage());
}
@@ -609,18 +637,16 @@ void LLVoiceChannelGroup::handleError(EStatusType status)
void LLVoiceChannelGroup::setState(EState state)
{
- // HACK: Open/close the call window if needed.
- toggleCallWindowIfNeeded(state);
-
switch(state)
{
case STATE_RINGING:
if ( !mIsRetrying )
{
- gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs);
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("ringing", mNotifyArgs);
}
- mState = state;
+ doSetState(state);
break;
default:
LLVoiceChannel::setState(state);
@@ -680,7 +706,12 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status)
// do not notify user when leaving proximal channel
return;
case STATUS_VOICE_DISABLED:
- gIMMgr->addSystemMessage(LLUUID::null, "unavailable", mNotifyArgs);
+ //skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749)
+ if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking())
+ {
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("unavailable", mNotifyArgs);
+ }
return;
default:
break;
@@ -705,7 +736,7 @@ void LLVoiceChannelProximal::handleError(EStatusType status)
// notification
if (!notify.empty())
{
- LLNotifications::instance().add(notify, mNotifyArgs);
+ LLNotificationsUtil::add(notify, mNotifyArgs);
}
LLVoiceChannel::handleError(status);
@@ -729,26 +760,31 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
mReceivedCall(FALSE)
{
// make sure URI reflects encoded version of other user's agent id
+ // *NOTE: in case of Avaline call generated SIP URL will be incorrect.
+ // But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call
setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id));
}
void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
{
+ llinfos << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << llendl;
+
// status updates
switch(type)
{
case STATUS_LEFT_CHANNEL:
if (callStarted() && !mIgnoreNextSessionLeave && !sSuspended)
{
+ // *TODO: use it to show DECLINE voice notification
if (mState == STATE_RINGING)
{
// other user declined call
- LLNotifications::instance().add("P2PCallDeclined", mNotifyArgs);
+ LLNotificationsUtil::add("P2PCallDeclined", mNotifyArgs);
}
else
{
- // other user hung up
- LLNotifications::instance().add("VoiceChannelDisconnectedP2P", mNotifyArgs);
+ // other user hung up, so we didn't end the call
+ mCallEndedByAgent = false;
}
deactivate();
}
@@ -766,7 +802,7 @@ void LLVoiceChannelP2P::handleError(EStatusType type)
switch(type)
{
case ERROR_NOT_AVAILABLE:
- LLNotifications::instance().add("P2PCallNoAnswer", mNotifyArgs);
+ LLNotificationsUtil::add("P2PCallNoAnswer", mNotifyArgs);
break;
default:
break;
@@ -779,6 +815,9 @@ void LLVoiceChannelP2P::activate()
{
if (callStarted()) return;
+ //call will be counted as ended by user unless this variable is changed in handleStatusChange()
+ mCallEndedByAgent = true;
+
LLVoiceChannel::activate();
if (callStarted())
@@ -800,6 +839,12 @@ void LLVoiceChannelP2P::activate()
// Add the party to the list of people with which we've recently interacted.
LLRecentPeople::instance().add(mOtherUserID);
+
+ //Default mic is ON on initiating/joining P2P calls
+ if (!gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+ {
+ gVoiceClient->inputUserControlState(true);
+ }
}
}
@@ -844,6 +889,10 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
}
else
{
+ LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL;
+ // In case of incoming AvaLine call generated URI will be differ from original one.
+ // This is because Avatar-2-Avatar URI is based on avatar UUID but Avaline is not.
+ // See LLVoiceClient::sessionAddedEvent() -> setUUIDFromStringHash()
setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));
}
@@ -857,16 +906,20 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
void LLVoiceChannelP2P::setState(EState state)
{
- // HACK: Open/close the call window if needed.
- toggleCallWindowIfNeeded(state);
+ llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
- // you only "answer" voice invites in p2p mode
- // so provide a special purpose message here
- if (mReceivedCall && state == STATE_RINGING)
+ if (mReceivedCall) // incoming call
{
- gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
- mState = state;
- return;
+ // you only "answer" voice invites in p2p mode
+ // so provide a special purpose message here
+ if (mReceivedCall && state == STATE_RINGING)
+ {
+ //TODO: remove or redirect this call status notification
+// LLCallInfoDialog::show("answering", mNotifyArgs);
+ doSetState(state);
+ return;
+ }
}
+
LLVoiceChannel::setState(state);
}
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 9966bdd5ab..941cccacc3 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -52,6 +52,21 @@ public:
STATE_CONNECTED
} EState;
+ typedef enum e_voice_channel_direction
+ {
+ INCOMING_CALL,
+ OUTGOING_CALL
+ } EDirection;
+
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t;
+
+ // on current channel changed signal
+ typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
+ typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t;
+ static channel_changed_signal_t sCurrentVoiceChannelChangedSignal;
+ static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb, bool at_front = false);
+
+
LLVoiceChannel(const LLUUID& session_id, const std::string& session_name);
virtual ~LLVoiceChannel();
@@ -69,12 +84,18 @@ public:
virtual BOOL callStarted();
const std::string& getSessionName() const { return mSessionName; }
+ boost::signals2::connection setStateChangedCallback(const state_changed_signal_t::slot_type& callback)
+ { return mStateChangedCallback.connect(callback); }
+
const LLUUID getSessionID() { return mSessionID; }
EState getState() { return mState; }
void updateSessionID(const LLUUID& new_session_id);
const LLSD& getNotifyArgs() { return mNotifyArgs; }
+ void setCallDirection(EDirection direction) {mCallDirection = direction;}
+ EDirection getCallDirection() {return mCallDirection;}
+
static LLVoiceChannel* getChannelByID(const LLUUID& session_id);
static LLVoiceChannel* getChannelByURI(std::string uri);
static LLVoiceChannel* getCurrentVoiceChannel() { return sCurrentVoiceChannel; }
@@ -85,15 +106,24 @@ public:
protected:
virtual void setState(EState state);
- void toggleCallWindowIfNeeded(EState state);
+ /**
+ * Use this method if you want mStateChangedCallback to be executed while state is changed
+ */
+ void doSetState(const EState& state);
void setURI(std::string uri);
+ // there can be two directions ICOMING and OUTGOING
+ EDirection mCallDirection;
+
std::string mURI;
std::string mCredentials;
LLUUID mSessionID;
EState mState;
std::string mSessionName;
LLSD mNotifyArgs;
+ LLSD mCallDialogPayload;
+ // true if call was ended by agent
+ bool mCallEndedByAgent;
BOOL mIgnoreNextSessionLeave;
LLHandle<LLPanel> mLoginNotificationHandle;
@@ -106,6 +136,9 @@ protected:
static LLVoiceChannel* sCurrentVoiceChannel;
static LLVoiceChannel* sSuspendedVoiceChannel;
static BOOL sSuspended;
+
+private:
+ state_changed_signal_t mStateChangedCallback;
};
class LLVoiceChannelGroup : public LLVoiceChannel
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 2834284a9b..59606f17b2 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -35,8 +35,13 @@
#include <boost/tokenizer.hpp>
+// library includes
+#include "llnotificationsutil.h"
+#include "llsdserialize.h"
#include "llsdutil.h"
+
+// project includes
#include "llvoavatar.h"
#include "llbufferstream.h"
#include "llfile.h"
@@ -59,18 +64,14 @@
#include "llimview.h" // for LLIMMgr
#include "llparcel.h"
#include "llviewerparcelmgr.h"
-#include "llfirstuse.h"
+//#include "llfirstuse.h"
+#include "llspeakers.h"
+#include "lltrans.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
#include "llvoavatarself.h"
#include "llvoicechannel.h"
-#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel
-#include "llfloaterchat.h" // for LLFloaterChat::addChat()
-
-// for Talk Button's state updating
-#include "llnearbychatbar.h"
-
// for base64 decoding
#include "apr_base64.h"
@@ -112,31 +113,15 @@ static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str)
static int scale_mic_volume(float volume)
{
// incoming volume has the range [0.0 ... 2.0], with 1.0 as the default.
- // Map it as follows: 0.0 -> 40, 1.0 -> 44, 2.0 -> 75
-
- volume -= 1.0f; // offset volume to the range [-1.0 ... 1.0], with 0 at the default.
- int scaled_volume = 44; // offset scaled_volume by its default level
- if(volume < 0.0f)
- scaled_volume += ((int)(volume * 4.0f)); // (44 - 40)
- else
- scaled_volume += ((int)(volume * 31.0f)); // (75 - 44)
-
- return scaled_volume;
+ // Map it to Vivox levels as follows: 0.0 -> 30, 1.0 -> 50, 2.0 -> 70
+ return 30 + (int)(volume * 20.0f);
}
static int scale_speaker_volume(float volume)
{
// incoming volume has the range [0.0 ... 1.0], with 0.5 as the default.
- // Map it as follows: 0.0 -> 0, 0.5 -> 62, 1.0 -> 75
-
- volume -= 0.5f; // offset volume to the range [-0.5 ... 0.5], with 0 at the default.
- int scaled_volume = 62; // offset scaled_volume by its default level
- if(volume < 0.0f)
- scaled_volume += ((int)(volume * 124.0f)); // (62 - 0) * 2
- else
- scaled_volume += ((int)(volume * 26.0f)); // (75 - 62) * 2
-
- return scaled_volume;
+ // Map it to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70
+ return 30 + (int)(volume * 40.0f);
}
class LLViewerVoiceAccountProvisionResponder :
@@ -254,6 +239,7 @@ protected:
std::string nameString;
std::string audioMediaString;
std::string displayNameString;
+ std::string deviceString;
int participantType;
bool isLocallyMuted;
bool isModeratorMuted;
@@ -308,8 +294,14 @@ void LLVivoxProtocolParser::reset()
ignoringTags = false;
accumulateText = false;
energy = 0.f;
+ hasText = false;
+ hasAudio = false;
+ hasVideo = false;
+ terminated = false;
ignoreDepth = 0;
isChannel = false;
+ incoming = false;
+ enabled = false;
isEvent = false;
isLocallyMuted = false;
isModeratorMuted = false;
@@ -485,6 +477,14 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
{
gVoiceClient->clearRenderDevices();
}
+ else if (!stricmp("CaptureDevice", tag))
+ {
+ deviceString.clear();
+ }
+ else if (!stricmp("RenderDevice", tag))
+ {
+ deviceString.clear();
+ }
else if (!stricmp("Buddies", tag))
{
gVoiceClient->deleteAllBuddies();
@@ -508,7 +508,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
void LLVivoxProtocolParser::EndTag(const char *tag)
{
const std::string& string = textBuffer;
- bool clearbuffer = true;
responseDepth--;
@@ -580,6 +579,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
nameString = string;
else if (!stricmp("DisplayName", tag))
displayNameString = string;
+ else if (!stricmp("Device", tag))
+ deviceString = string;
else if (!stricmp("AccountName", tag))
nameString = string;
else if (!stricmp("ParticipantType", tag))
@@ -596,18 +597,13 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
uriString = string;
else if (!stricmp("Presence", tag))
statusString = string;
- else if (!stricmp("Device", tag))
- {
- // This closing tag shouldn't clear the accumulated text.
- clearbuffer = false;
- }
else if (!stricmp("CaptureDevice", tag))
{
- gVoiceClient->addCaptureDevice(textBuffer);
+ gVoiceClient->addCaptureDevice(deviceString);
}
else if (!stricmp("RenderDevice", tag))
{
- gVoiceClient->addRenderDevice(textBuffer);
+ gVoiceClient->addRenderDevice(deviceString);
}
else if (!stricmp("Buddy", tag))
{
@@ -648,12 +644,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
else if (!stricmp("SubscriptionType", tag))
subscriptionType = string;
-
- if(clearbuffer)
- {
- textBuffer.clear();
- accumulateText= false;
- }
+ textBuffer.clear();
+ accumulateText= false;
if (responseDepth == 0)
{
@@ -1106,6 +1098,121 @@ static void killGateway()
#endif
+class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
+{
+ LOG_CLASS(LLSpeakerVolumeStorage);
+public:
+
+ /**
+ * Sets internal voluem level for specified user.
+ *
+ * @param[in] speaker_id - LLUUID of user to store volume level for
+ * @param[in] volume - external (vivox) volume level to be stored for user.
+ */
+ void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume);
+
+ /**
+ * Gets stored external (vivox) volume level for specified speaker and
+ * transforms it into internal (viewer) level.
+ *
+ * If specified user is not found -1 will be returned.
+ * Internal level is calculated as: internal = 400 * external^2
+ * Maps 0.0 to 1.0 to internal values 0-400
+ *
+ * @param[in] speaker_id - LLUUID of user to get his volume level
+ */
+ S32 getSpeakerVolume(const LLUUID& speaker_id);
+
+private:
+ friend class LLSingleton<LLSpeakerVolumeStorage>;
+ LLSpeakerVolumeStorage();
+ ~LLSpeakerVolumeStorage();
+
+ const static std::string SETTINGS_FILE_NAME;
+
+ void load();
+ void save();
+
+ typedef std::map<LLUUID, F32> speaker_data_map_t;
+ speaker_data_map_t mSpeakersData;
+};
+
+const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml";
+
+LLSpeakerVolumeStorage::LLSpeakerVolumeStorage()
+{
+ load();
+}
+
+LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage()
+{
+ save();
+}
+
+void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume)
+{
+ mSpeakersData[speaker_id] = volume;
+}
+
+S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id)
+{
+ // Return value of -1 indicates no level is stored for this speaker
+ S32 ret_val = -1;
+ speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id);
+
+ if (it != mSpeakersData.end())
+ {
+ F32 f_val = it->second;
+ // volume can amplify by as much as 4x!
+ S32 ivol = (S32)(400.f * f_val * f_val);
+ ret_val = llclamp(ivol, 0, 400);
+ }
+ return ret_val;
+}
+
+void LLSpeakerVolumeStorage::load()
+{
+ // load per-resident voice volume information
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
+
+ LLSD settings_llsd;
+ llifstream file;
+ file.open(filename);
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(settings_llsd, file);
+ }
+
+ for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
+ iter != settings_llsd.endMap(); ++iter)
+ {
+ mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal()));
+ }
+}
+
+void LLSpeakerVolumeStorage::save()
+{
+ // If we quit from the login screen we will not have an SL account
+ // name. Don't try to save, otherwise we'll dump a file in
+ // C:\Program Files\SecondLife\ or similar. JC
+ std::string user_dir = gDirUtilp->getLindenUserDir();
+ if (!user_dir.empty())
+ {
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
+ LLSD settings_llsd;
+
+ for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter)
+ {
+ settings_llsd[iter->first.asString()] = iter->second;
+ }
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(settings_llsd, file);
+ }
+}
+
+
///////////////////////////////////////////////////////////////////////////////////////////////
LLVoiceClient::LLVoiceClient() :
@@ -1153,7 +1260,6 @@ LLVoiceClient::LLVoiceClient() :
mEarLocation(0),
mSpeakerVolumeDirty(true),
mSpeakerMuteDirty(true),
- mSpeakerVolume(0),
mMicVolume(0),
mMicVolumeDirty(true),
@@ -1164,6 +1270,10 @@ LLVoiceClient::LLVoiceClient() :
{
gVoiceClient = this;
+ mAPIVersion = LLTrans::getString("NotConnected");
+
+ mSpeakerVolume = scale_speaker_volume(0);
+
#if LL_DARWIN || LL_LINUX || LL_SOLARIS
// HACK: THIS DOES NOT BELONG HERE
// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
@@ -1599,7 +1709,7 @@ void LLVoiceClient::stateMachine()
}
else
{
- LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
+ LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
}
}
}
@@ -1868,7 +1978,7 @@ void LLVoiceClient::stateMachine()
}
else
{
- LL_WARNS("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
+ LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
}
}
}
@@ -3332,12 +3442,17 @@ void LLVoiceClient::sendPositionalUpdate(void)
<< "<Volume>" << volume << "</Volume>"
<< "</Request>\n\n\n";
- // Send a "mute for me" command for the user
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">"
- << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
- << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
- << "<Mute>" << (mute?"1":"0") << "</Mute>"
- << "</Request>\n\n\n";
+ if(!mAudioSession->mIsP2P)
+ {
+ // Send a "mute for me" command for the user
+ // Doesn't work in P2P sessions
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">"
+ << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
+ << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
+ << "<Mute>" << (mute?"1":"0") << "</Mute>"
+ << "<Scope>Audio</Scope>"
+ << "</Request>\n\n\n";
+ }
}
p->mVolumeDirty = false;
@@ -3413,7 +3528,7 @@ void LLVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
if(mSpeakerMuteDirty)
{
- const char *muteval = ((mSpeakerVolume == 0)?"true":"false");
+ const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false");
mSpeakerMuteDirty = false;
@@ -3749,6 +3864,7 @@ void LLVoiceClient::connectorCreateResponse(int statusCode, std::string &statusS
{
// Connector created, move forward.
LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL;
+ mAPIVersion = versionID;
mConnectorHandle = connectorHandle;
if(getState() == stateConnectorStarting)
{
@@ -4273,7 +4389,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
if(incoming)
{
// Send the voice chat invite to the GUI layer
- // TODO: Question: Should we correlate with the mute list here?
+ // *TODO: Question: Should we correlate with the mute list here?
session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
session->mVoiceInvitePending = true;
if(session->mName.empty())
@@ -4454,6 +4570,35 @@ void LLVoiceClient::participantUpdatedEvent(
participant->mPower = 0.0f;
}
participant->mVolume = volume;
+
+
+ // *HACK: mantipov: added while working on EXT-3544
+ /*
+ Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE
+ LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER.
+
+ participantUpdatedEvent updates voice participant state in particular participantState::mIsModeratorMuted
+ Originally we wanted to update session Speaker Manager to fire LLSpeakerVoiceModerationEvent to fix the EXT-3544 bug.
+ Calling of the LLSpeakerMgr::update() method was added into LLIMMgr::processAgentListUpdates.
+
+ But in case participantUpdatedEvent() is called after LLViewerChatterBoxSessionAgentListUpdates::post()
+ voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager
+ and event is not fired.
+
+ So, we have to call LLSpeakerMgr::update() here. In any case it is better than call it
+ in LLCallFloater::draw()
+ */
+ LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
+
+ // ignore session ID of local chat
+ if (voice_cnl && voice_cnl->getSessionID().notNull())
+ {
+ LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID());
+ if (speaker_manager)
+ {
+ speaker_manager->update(true);
+ }
+ }
}
else
{
@@ -4691,10 +4836,6 @@ void LLVoiceClient::messageEvent(
LLUUID::null, // default arg
LLVector3::zero, // default arg
true); // prepend name and make it a link to the user's profile
-
- chat.mText = std::string("IM: ") + session->mName + std::string(": ") + message;
- // If the chat should come in quietly (i.e. we're in busy mode), pretend it's from a local agent.
- LLFloaterChat::addChat( chat, TRUE, quiet_chat );
}
}
}
@@ -4900,7 +5041,14 @@ LLVoiceClient::participantState *LLVoiceClient::sessionState::addParticipant(con
}
mParticipantsByUUID.insert(participantUUIDMap::value_type(&(result->mAvatarID), result));
-
+
+ result->mUserVolume = LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID);
+ if (result->mUserVolume != -1)
+ {
+ result->mVolumeDirty = true;
+ mVolumeDirty = true;
+ }
+
LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL;
}
@@ -4986,6 +5134,17 @@ LLVoiceClient::participantMap *LLVoiceClient::getParticipantList(void)
return result;
}
+void LLVoiceClient::getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids)
+{
+ if (NULL == mAudioSession) return;
+
+ participantUUIDMap::const_iterator it = mAudioSession->mParticipantsByUUID.begin(),
+ it_end = mAudioSession->mParticipantsByUUID.end();
+ for (; it != it_end; ++it)
+ {
+ participant_uuids.insert((*(*it).first));
+ }
+}
LLVoiceClient::participantState *LLVoiceClient::sessionState::findParticipant(const std::string &uri)
{
@@ -5221,24 +5380,25 @@ LLVoiceClient::sessionState* LLVoiceClient::startUserIMSession(const LLUUID &uui
// No session with user, need to start one.
std::string uri = sipURIFromID(uuid);
session = addSession(uri);
+
+ llassert(session);
+ if (!session) return NULL;
+
session->mIsSpatial = false;
session->mReconnect = false;
session->mIsP2P = true;
session->mCallerID = uuid;
}
- if(session)
+ if(session->mHandle.empty())
{
- if(session->mHandle.empty())
- {
- // Session isn't active -- start it up.
- sessionCreateSendMessage(session, false, true);
- }
- else
- {
- // Session is already active -- start up text.
- sessionTextConnectSendMessage(session);
- }
+ // Session isn't active -- start it up.
+ sessionCreateSendMessage(session, false, true);
+ }
+ else
+ {
+ // Session is already active -- start up text.
+ sessionTextConnectSendMessage(session);
}
return session;
@@ -5788,7 +5948,6 @@ bool LLVoiceClient::getMuteMic() const
void LLVoiceClient::setUserPTTState(bool ptt)
{
mUserPTTState = ptt;
- if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(ptt);
}
bool LLVoiceClient::getUserPTTState()
@@ -5799,7 +5958,6 @@ bool LLVoiceClient::getUserPTTState()
void LLVoiceClient::toggleUserPTTState(void)
{
mUserPTTState = !mUserPTTState;
- if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(mUserPTTState);
}
void LLVoiceClient::setVoiceEnabled(bool enabled)
@@ -5830,6 +5988,13 @@ bool LLVoiceClient::voiceEnabled()
return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");
}
+//AD *TODO: investigate possible merge of voiceWorking() and voiceEnabled() into one non-static method
+bool LLVoiceClient::voiceWorking()
+{
+ //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)
+ return (stateLoggedIn <= mState) && (mState <= stateSessionTerminated);
+}
+
void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
{
mLipSyncEnabled = enabled;
@@ -5869,6 +6034,10 @@ void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
mPTTIsToggle = PTTIsToggle;
}
+bool LLVoiceClient::getPTTIsToggle()
+{
+ return mPTTIsToggle;
+}
void LLVoiceClient::setPTTKey(std::string &key)
{
@@ -5904,7 +6073,8 @@ void LLVoiceClient::setVoiceVolume(F32 volume)
if(scaled_volume != mSpeakerVolume)
{
- if((scaled_volume == 0) || (mSpeakerVolume == 0))
+ int min_volume = scale_speaker_volume(0);
+ if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume))
{
mSpeakerMuteDirty = true;
}
@@ -5927,8 +6097,6 @@ void LLVoiceClient::setMicGain(F32 volume)
void LLVoiceClient::keyDown(KEY key, MASK mask)
{
-// LL_DEBUGS("Voice") << "key is " << LLKeyboard::stringFromKey(key) << LL_ENDL;
-
if (gKeyboard->getKeyRepeated(key))
{
// ignore auto-repeat keys
@@ -5937,44 +6105,39 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
if(!mPTTIsMiddleMouse)
{
- if(mPTTIsToggle)
- {
- if(key == mPTTKey)
- {
- toggleUserPTTState();
- }
- }
- else if(mPTTKey != KEY_NONE)
- {
- setUserPTTState(gKeyboard->getKeyDown(mPTTKey));
- }
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
}
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
if(!mPTTIsMiddleMouse)
{
- if(!mPTTIsToggle && (mPTTKey != KEY_NONE))
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
+ }
+}
+void LLVoiceClient::inputUserControlState(bool down)
+{
+ if(mPTTIsToggle)
+ {
+ if(down) // toggle open-mic state on 'down'
{
- setUserPTTState(gKeyboard->getKeyDown(mPTTKey));
+ toggleUserPTTState();
}
}
+ else // set open-mic state as an absolute
+ {
+ setUserPTTState(down);
+ }
}
void LLVoiceClient::middleMouseState(bool down)
{
if(mPTTIsMiddleMouse)
{
- if(mPTTIsToggle)
- {
- if(down)
- {
- toggleUserPTTState();
- }
- }
- else
- {
- setUserPTTState(down);
- }
+ inputUserControlState(down);
}
}
@@ -6133,6 +6296,9 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
participantState *participant = findParticipantByID(id);
if (participant)
{
+ // store this volume setting for future sessions
+ LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume);
+
// volume can amplify by as much as 4x!
S32 ivol = (S32)(400.f * volume * volume);
participant->mUserVolume = llclamp(ivol, 0, 400);
@@ -6263,6 +6429,7 @@ void LLVoiceClient::filePlaybackSetMode(bool vox, float speed)
}
LLVoiceClient::sessionState::sessionState() :
+ mErrorStatusCode(0),
mMediaStreamState(streamStateUnknown),
mTextStreamState(streamStateUnknown),
mCreateInProgress(false),
@@ -7060,7 +7227,7 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode
if (!sAlertedUser)
{
//sAlertedUser = TRUE;
- LLNotifications::instance().add("VoiceVersionMismatch");
+ LLNotificationsUtil::add("VoiceVersionMismatch");
gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener
}
}
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index bddd18dee8..a96cf18e27 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -188,15 +188,20 @@ static void updatePosition(void);
void setUserPTTState(bool ptt);
bool getUserPTTState();
void toggleUserPTTState(void);
+ void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
void setVoiceEnabled(bool enabled);
static bool voiceEnabled();
+ // Checks is voice working judging from mState
+ // Returns true if vivox has successfully logged in and is not in error state
+ bool voiceWorking();
void setUsePTT(bool usePTT);
void setPTTIsToggle(bool PTTIsToggle);
+ bool getPTTIsToggle();
void setPTTKey(std::string &key);
void setEarLocation(S32 loc);
void setVoiceVolume(F32 volume);
void setMicGain(F32 volume);
- void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal)
+ void setUserVolume(const LLUUID& id, F32 volume); // sets volume for specified agent, from 0-1 (where .5 is nominal)
void setLipSyncEnabled(BOOL enabled);
BOOL lipSyncEnabled();
@@ -204,6 +209,9 @@ static void updatePosition(void);
void keyDown(KEY key, MASK mask);
void keyUp(KEY key, MASK mask);
void middleMouseState(bool down);
+
+ // Return the version of the Vivox library
+ std::string getAPIVersion() const { return mAPIVersion; }
/////////////////////////////
// Accessors for data related to nearby speakers
@@ -349,6 +357,7 @@ static void updatePosition(void);
participantState *findParticipantByID(const LLUUID& id);
participantMap *getParticipantList(void);
+ void getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids);
typedef std::map<const std::string*, sessionState*, stringMapComparitor> sessionMap;
typedef std::set<sessionState*> sessionSet;
@@ -739,6 +748,8 @@ static std::string nameFromsipURI(const std::string &uri);
BOOL mLipSyncEnabled;
+ std::string mAPIVersion;
+
typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
observer_set_t mParticipantObservers;
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index 9bafc03a6d..4794cab32e 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -142,7 +142,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type )
for (int i=0; i<NUM_VOICE_SYMBOL_WAVES; i++)
{
mSoundSymbol.mWaveFadeOutStartTime [i] = mCurrentTime;
- mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, TRUE);
+ mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLViewerTexture::BOOST_UI);
mSoundSymbol.mWaveActive [i] = false;
mSoundSymbol.mWaveOpacity [i] = 1.0f;
mSoundSymbol.mWaveExpansion [i] = 1.0f;
@@ -369,8 +369,9 @@ void LLVoiceVisualizer::render()
//-------------------------------------------------------------
// create coordinates of the geometry for the dot
//-------------------------------------------------------------
- LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * DOT_SIZE;
- LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * DOT_SIZE;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 l = camera->getLeftAxis() * DOT_SIZE;
+ LLVector3 u = camera->getUpAxis() * DOT_SIZE;
LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u;
LLVector3 bottomRight = mSoundSymbol.mPosition - l - u;
@@ -496,8 +497,8 @@ void LLVoiceVisualizer::render()
F32 width = i * WAVE_WIDTH_SCALE * mSoundSymbol.mWaveExpansion[i];
F32 height = i * WAVE_HEIGHT_SCALE * mSoundSymbol.mWaveExpansion[i];
- LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * width;
- LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * height;
+ LLVector3 l = camera->getLeftAxis() * width;
+ LLVector3 u = camera->getUpAxis() * height;
LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u;
LLVector3 bottomRight = mSoundSymbol.mPosition - l - u;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 7585842623..139d2fbd88 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -108,7 +108,7 @@ void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent)
}
}
-void LLVOPartGroup::updateTextures(LLAgent &agent)
+void LLVOPartGroup::updateTextures()
{
// Texture stats for particles need to be updated in a different way...
}
@@ -249,6 +249,12 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
facep->mCenterLocal = part->mPosAgent;
facep->setFaceColor(part->mColor);
facep->setTexture(part->mImagep);
+
+ //check if this particle texture is replaced by a parcel media texture.
+ if(part->mImagep.notNull() && part->mImagep->hasParcelMedia())
+ {
+ part->mImagep->getParcelMedia()->addMediaToFace(facep) ;
+ }
mPixelArea = tot_area * pixel_meter_ratio;
const F32 area_scale = 10.f; // scale area to increase priority a bit
@@ -380,6 +386,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.clear();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
{
LLDrawable* drawablep = *i;
@@ -409,7 +416,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
}
count++;
- facep->mDistance = (facep->mCenterLocal - LLViewerCamera::getInstance()->getOrigin()) * LLViewerCamera::getInstance()->getAtAxis();
+ facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
obj->mDepth += facep->mDistance;
mFaceList.push_back(facep);
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 3dc3292992..18583b4be9 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -61,7 +61,7 @@ public:
virtual U32 getPartitionType() const;
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index d44c543266..0550ed770b 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -289,7 +289,7 @@ void LLSkyTex::create(const F32 brightness)
void LLSkyTex::createGLImage(S32 which)
{
- mTexture[which]->createGLTexture(0, mImageRaw[which]);
+ mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerTexture::LOCAL);
mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP);
}
@@ -343,7 +343,6 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
cloud_pos_density1 = LLColor3();
cloud_pos_density2 = LLColor3();
-
mInitialized = FALSE;
mbCanSelect = FALSE;
mUpdateTimer.reset();
@@ -376,15 +375,19 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mSun.setIntensity(SUN_INTENSITY);
mMoon.setIntensity(0.1f * SUN_INTENSITY);
- mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+ mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
- mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+ mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);
mBloomTexturep->setNoDelete() ;
mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
mHeavenlyBodyUpdated = FALSE ;
+
+ mDrawRefl = 0;
+ mHazeConcentration = 0.f;
+ mInterpVal = 0.f;
}
@@ -472,9 +475,9 @@ void LLVOSky::restoreGL()
{
mSkyTex[i].restoreGL();
}
- mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+ mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
- mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+ mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);
mBloomTexturep->setNoDelete() ;
@@ -1072,10 +1075,10 @@ BOOL LLVOSky::updateSky()
++next_frame;
next_frame = next_frame % cycle_frame_no;
- sInterpVal = (!mInitialized) ? 1 : (F32)next_frame / cycle_frame_no;
+ mInterpVal = (!mInitialized) ? 1 : (F32)next_frame / cycle_frame_no;
// sInterpVal = (F32)next_frame / cycle_frame_no;
- LLSkyTex::setInterpVal( sInterpVal );
- LLHeavenBody::setInterpVal( sInterpVal );
+ LLSkyTex::setInterpVal( mInterpVal );
+ LLHeavenBody::setInterpVal( mInterpVal );
calcAtmospherics();
if (mForceUpdate || total_no_tiles == frame)
@@ -1180,7 +1183,7 @@ BOOL LLVOSky::updateSky()
return TRUE;
}
-void LLVOSky::updateTextures(LLAgent &agent)
+void LLVOSky::updateTextures()
{
if (mSunTexturep)
{
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 62c934fb41..8366909755 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -492,7 +492,7 @@ public:
// Graphical stuff for objects - maybe broken out into render class
// later?
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
@@ -613,7 +613,7 @@ protected:
LLColor3 mLastTotalAmbient;
F32 mAmbientScale;
LLColor3 mNightColorShift;
- F32 sInterpVal;
+ F32 mInterpVal;
LLColor4 mFogColor;
LLColor4 mGLFogCol;
@@ -636,8 +636,8 @@ protected:
public:
//by bao
//fake vertex buffer updating
- //to guaranttee at least updating one VBO buffer every frame
- //to walk around the bug caused by ATI card --> DEV-3855
+ //to guarantee at least updating one VBO buffer every frame
+ //to work around the bug caused by ATI card --> DEV-3855
//
void createDummyVertexBuffer() ;
void updateDummyVertexBuffer() ;
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 164f0f0cad..ef7b161003 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -134,7 +134,7 @@ void LLVOSurfacePatch::setPixelAreaAndAngle(LLAgent &agent)
}
-void LLVOSurfacePatch::updateTextures(LLAgent &agent)
+void LLVOSurfacePatch::updateTextures()
{
}
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index aaf4d41fa1..10a5888526 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -75,7 +75,7 @@ public:
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
/*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
index f5094c025e..75beab519e 100644
--- a/indra/newview/llvotextbubble.cpp
+++ b/indra/newview/llvotextbubble.cpp
@@ -115,7 +115,7 @@ BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
-void LLVOTextBubble::updateTextures(LLAgent &agent)
+void LLVOTextBubble::updateTextures()
{
// Update the image levels of all textures...
diff --git a/indra/newview/llvotextbubble.h b/indra/newview/llvotextbubble.h
index 45d4df2a7e..7f84dbf631 100644
--- a/indra/newview/llvotextbubble.h
+++ b/indra/newview/llvotextbubble.h
@@ -44,7 +44,7 @@ public:
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ BOOL updateLOD();
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 615ae13bc2..24f1c4bd24 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -55,7 +55,7 @@
#include "noise.h"
#include "pipeline.h"
#include "llspatialpartition.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
extern LLPipeline gPipeline;
@@ -257,7 +257,7 @@ void LLVOTree::initClass()
{
LLSD args;
args["SPECIES"] = err;
- LLNotifications::instance().add("ErrorUndefinedTrees", args);
+ LLNotificationsUtil::add("ErrorUndefinedTrees", args);
}
};
@@ -311,7 +311,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
//
// Load Species-Specific data
//
- mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
mBranchLength = sSpeciesTable[mSpecies]->mBranchLength;
mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength;
mLeafScale = sSpeciesTable[mSpecies]->mLeafScale;
@@ -463,7 +463,7 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent)
#endif
}
-void LLVOTree::updateTextures(LLAgent &agent)
+void LLVOTree::updateTextures()
{
if (mTreeImagep)
{
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index 13817fa111..feac9e0675 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -69,7 +69,7 @@ public:
// Graphical stuff for objects - maybe broken out into render class later?
/*virtual*/ void render(LLAgent &agent);
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
diff --git a/indra/newview/llvotreenew.h b/indra/newview/llvotreenew.h
index 3fec5855ef..426470101d 100644
--- a/indra/newview/llvotreenew.h
+++ b/indra/newview/llvotreenew.h
@@ -156,7 +156,7 @@ public:
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ void render(LLAgent &agent);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 7d4bef3f7d..14bedaa49c 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -53,12 +53,10 @@
#include "lldrawpoolbump.h"
#include "llface.h"
#include "llspatialpartition.h"
-
-// TEMP HACK ventrella
#include "llhudmanager.h"
#include "llflexibleobject.h"
-
#include "llsky.h"
+#include "lltexturefetch.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
#include "llviewerregion.h"
@@ -70,12 +68,12 @@
#include "llmediaentry.h"
#include "llmediadataclient.h"
#include "llagent.h"
+#include "llviewermediafocus.h"
const S32 MIN_QUIET_FRAMES_COALESCE = 30;
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
const F32 FORCE_CULL_AREA = 8.f;
const F32 MAX_LOD_DISTANCE = 24.f;
-const S32 MAX_SCULPT_REZ = 128;
BOOL gAnimateTextures = TRUE;
@@ -95,7 +93,7 @@ static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes");
class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
{
public:
- LLMediaDataClientObjectImpl(LLVOVolume *obj) : mObject(obj) {}
+ LLMediaDataClientObjectImpl(LLVOVolume *obj, bool isNew) : mObject(obj), mNew(isNew) {}
LLMediaDataClientObjectImpl() { mObject = NULL; }
virtual U8 getMediaDataCount() const
@@ -111,6 +109,12 @@ public:
if (te->getMediaData() != NULL)
{
result = te->getMediaData()->asLLSD();
+ // XXX HACK: workaround bug in asLLSD() where whitelist is not set properly
+ // See DEV-41949
+ if (!result.has(LLMediaEntry::WHITELIST_KEY))
+ {
+ result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
+ }
}
}
return result;
@@ -125,20 +129,46 @@ public:
virtual bool hasMedia() const
{ return mObject->hasMedia(); }
- virtual void updateObjectMediaData(LLSD const &data)
- { mObject->updateObjectMediaData(data); }
-
- virtual F64 getDistanceFromAvatar() const
- { return mObject->getRenderPosition().length(); }
+ virtual void updateObjectMediaData(LLSD const &data, const std::string &version_string)
+ { mObject->updateObjectMediaData(data, version_string); }
+
+ virtual F64 getMediaInterest() const
+ {
+ F64 interest = mObject->getTotalMediaInterest();
+ if (interest < (F64)0.0)
+ {
+ // media interest not valid yet, try pixel area
+ interest = mObject->getPixelArea();
+ // HACK: force recalculation of pixel area if interest is the "magic default" of 1024.
+ if (interest == 1024.f)
+ {
+ const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent);
+ interest = mObject->getPixelArea();
+ }
+ }
+ return interest;
+ }
- virtual F64 getTotalMediaInterest() const
- { return mObject->getTotalMediaInterest(); }
+ virtual bool isInterestingEnough() const
+ {
+ return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest());
+ }
virtual std::string getCapabilityUrl(const std::string &name) const
{ return mObject->getRegion()->getCapability(name); }
+ virtual bool isDead() const
+ { return mObject->isDead(); }
+
+ virtual U32 getMediaVersion() const
+ { return LLTextureEntry::getVersionFromMediaVersionString(mObject->getMediaURL()); }
+
+ virtual bool isNew() const
+ { return mNew; }
+
private:
LLPointer<LLVOVolume> mObject;
+ bool mNew;
};
@@ -150,9 +180,10 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mRelativeXform.setIdentity();
mRelativeXformInvTrans.setIdentity();
+ mFaceMappingChanged = FALSE;
mLOD = MIN_LOD;
- mSculptLevel = -2;
mTextureAnimp = NULL;
+ mVolumeChanged = FALSE;
mVObjRadius = LLVector3(1,1,0.5f).length();
mNumFaces = 0;
mLODChanged = FALSE;
@@ -160,6 +191,8 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mSpotLightPriority = 0.f;
mMediaImplList.resize(getNumTEs());
+ mLastFetchedMediaVersion = -1;
+ mIndexInTex = 0;
}
LLVOVolume::~LLVOVolume()
@@ -181,16 +214,46 @@ LLVOVolume::~LLVOVolume()
}
}
+void LLVOVolume::markDead()
+{
+ if (!mDead)
+ {
+ LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false);
+ if (sObjectMediaClient) sObjectMediaClient->removeFromQueue(obj);
+ if (sObjectMediaNavigateClient) sObjectMediaNavigateClient->removeFromQueue(obj);
+
+ // Detach all media impls from this object
+ for(U32 i = 0 ; i < mMediaImplList.size() ; i++)
+ {
+ removeMediaImpl(i);
+ }
+
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->removeVolume(this);
+ }
+ }
+
+ LLViewerObject::markDead();
+}
+
// static
void LLVOVolume::initClass()
{
// gSavedSettings better be around
- const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
- const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
- const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
- sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries);
- sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, max_retries);
+ if (gSavedSettings.getBOOL("PrimMediaMasterEnabled"))
+ {
+ const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
+ const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
+ const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
+ const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize");
+ const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize");
+ sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries,
+ max_sorted_queue_size, max_round_robin_queue_size);
+ sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay,
+ max_retries, max_sorted_queue_size, max_round_robin_queue_size);
+ }
}
// static
@@ -385,7 +448,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
// If the media changed at all, request new media data
LL_DEBUGS("MediaOnAPrim") << "Media update: " << getID() << ": retval=" << retval << " Media URL: " <<
((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL;
- requestMediaDataUpdate();
+ requestMediaDataUpdate(retval & MEDIA_FLAGS_CHANGED);
}
else {
LL_INFOS("MediaOnAPrim") << "Ignoring media update for: " << getID() << " Media URL: " <<
@@ -564,28 +627,32 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
return TRUE;
}
-void LLVOVolume::updateTextures(LLAgent &agent)
+void LLVOVolume::updateTextures()
{
const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds
- if (mDrawable.notNull() && mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME)
+ if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME)
{
- if (mDrawable->isVisible())
- {
- updateTextures();
- }
+ updateTextureVirtualSize();
}
}
-void LLVOVolume::updateTextures()
+void LLVOVolume::updateTextureVirtualSize()
{
// Update the pixel area of all faces
+ if(mDrawable.isNull() || !mDrawable->isVisible())
+ {
+ return ;
+ }
+
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE))
{
return;
}
-
- if (LLViewerTexture::sDontLoadVolumeTextures || mDrawable.isNull()) // || !mDrawable->isVisible())
+
+ static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable");
+
+ if (dont_load_textures || LLAppViewer::getTextureFetch()->mDebugPause) // || !mDrawable->isVisible())
{
return;
}
@@ -597,34 +664,35 @@ void LLVOVolume::updateTextures()
const S32 num_faces = mDrawable->getNumFaces();
F32 min_vsize=999999999.f, max_vsize=0.f;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (S32 i = 0; i < num_faces; i++)
{
LLFace* face = mDrawable->getFace(i);
const LLTextureEntry *te = face->getTextureEntry();
LLViewerTexture *imagep = face->getTexture();
- if (!imagep || !te ||
+ if (!imagep || !te ||
face->mExtents[0] == face->mExtents[1])
{
continue;
}
F32 vsize;
-
+ F32 old_size = face->getVirtualSize();
+
if (isHUDAttachment())
{
- F32 area = (F32) LLViewerCamera::getInstance()->getScreenPixelArea();
+ F32 area = (F32) camera->getScreenPixelArea();
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
+ face->setVirtualSize(vsize);
}
else
{
- vsize = getTextureVirtualSize(face);
+ vsize = face->getTextureVirtualSize();
}
- mPixelArea = llmax(mPixelArea, face->getPixelArea());
-
- F32 old_size = face->getVirtualSize();
+ mPixelArea = llmax(mPixelArea, face->getPixelArea());
if (face->mTextureMatrix != NULL)
{
@@ -634,9 +702,7 @@ void LLVOVolume::updateTextures()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);
}
}
-
- face->setVirtualSize(vsize);
- imagep->addTextureStats(vsize);
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
if (vsize < min_vsize) min_vsize = vsize;
@@ -665,35 +731,49 @@ void LLVOVolume::updateTextures()
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID id = sculpt_params->getSculptTexture();
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
- S32 lod = llmin(mLOD, 3);
- F32 lodf = ((F32)(lod + 1.0f)/4.f);
- F32 tex_size = lodf * MAX_SCULPT_REZ;
- mSculptTexture->addTextureStats(2.f * tex_size * tex_size);
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
(S32)LLViewerTexture::BOOST_SCULPTED));
mSculptTexture->setForSculpt() ;
- }
-
- S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture
- S32 current_discard = mSculptLevel;
+
+ if(!mSculptTexture->isCachedRawImageReady())
+ {
+ S32 lod = llmin(mLOD, 3);
+ F32 lodf = ((F32)(lod + 1.0f)/4.f);
+ F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ;
+ mSculptTexture->addTextureStats(2.f * tex_size * tex_size, FALSE);
+
+ //if the sculpty very close to the view point, load first
+ {
+ LLVector3 lookAt = getPositionAgent() - camera->getOrigin();
+ F32 dist = lookAt.normVec() ;
+ F32 cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ;
+ }
+ }
+
+ S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture
+ S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ;
- if (texture_discard >= 0 && //texture has some data available
- (texture_discard < current_discard || //texture has more data than last rebuild
- current_discard < 0)) //no previous rebuild
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
- mSculptChanged = TRUE;
- }
+ if (texture_discard >= 0 && //texture has some data available
+ (texture_discard < current_discard || //texture has more data than last rebuild
+ current_discard < 0)) //no previous rebuild
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
+ mSculptChanged = TRUE;
+ }
- if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED))
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED))
{
setDebugText(llformat("T%d C%d V%d\n%dx%d",
- texture_discard, current_discard, getVolume()->getSculptLevel(),
- mSculptTexture->getHeight(), mSculptTexture->getWidth()));
+ texture_discard, current_discard, getVolume()->getSculptLevel(),
+ mSculptTexture->getHeight(), mSculptTexture->getWidth()));
}
+ }
}
if (getLightTextureID().notNull())
@@ -706,7 +786,7 @@ void LLVOVolume::updateTextures()
F32 rad = getLightRadius();
mLightTexture->addTextureStats(gPipeline.calcPixelArea(getPositionAgent(),
LLVector3(rad,rad,rad),
- *LLViewerCamera::getInstance()));
+ *camera));
}
}
@@ -714,10 +794,10 @@ void LLVOVolume::updateTextures()
{
setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
}
- else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
- {
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
- }
+ else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
+ {
+ setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ }
else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA))
{
setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
@@ -729,36 +809,6 @@ void LLVOVolume::updateTextures()
}
}
-F32 LLVOVolume::getTextureVirtualSize(LLFace* face)
-{
- //get area of circle around face
- LLVector3 center = face->getPositionAgent();
- LLVector3 size = (face->mExtents[1] - face->mExtents[0]) * 0.5f;
-
- F32 face_area = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
-
- face->setPixelArea(face_area);
-
- if (face_area <= 0)
- {
- return 0.f;
- }
-
- //get area of circle in texture space
- LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0];
- F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f;
- if (texel_area <= 0)
- {
- // Probably animated, use default
- texel_area = 1.f;
- }
-
- //apply texel area to face area to get accurate ratio
- face_area /= llclamp(texel_area, 1.f/64.f, 16.f);
-
- return face_area;
-}
-
BOOL LLVOVolume::isActive() const
{
return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive());
@@ -835,7 +885,6 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
return mDrawable;
}
-
BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
{
// Check if we need to change implementations
@@ -873,64 +922,71 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
{
mVolumeImpl->onSetVolume(volume_params, detail);
}
-
+
+ updateSculptTexture();
+
if (isSculpted())
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
- //ignore sculpt GL usage since bao fixed this in a separate branch
- if (!gGLActive)
- {
- gGLActive = TRUE;
- sculpt();
- gGLActive = FALSE;
- }
- else
- {
- sculpt();
- }
- mSculptLevel = getVolume()->getSculptLevel();
+ sculpt();
}
}
- else
- {
- mSculptTexture = NULL;
- }
return TRUE;
}
return FALSE;
}
-// sculpt replaces generate() for sculpted surfaces
-void LLVOVolume::sculpt()
+void LLVOVolume::updateSculptTexture()
{
- U16 sculpt_height = 0;
- U16 sculpt_width = 0;
- S8 sculpt_components = 0;
- const U8* sculpt_data = NULL;
+ LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
- if (mSculptTexture.notNull())
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID id = sculpt_params->getSculptTexture();
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ }
+ else
{
- S32 discard_level;
- S32 desired_discard = 0; // lower discard levels have MUCH less resolution
+ mSculptTexture = NULL;
+ }
- discard_level = desired_discard;
+ if (mSculptTexture != old_sculpt)
+ {
+ if (old_sculpt.notNull())
+ {
+ old_sculpt->removeVolume(this);
+ }
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->addVolume(this);
+ }
+ }
+
+}
+
+// sculpt replaces generate() for sculpted surfaces
+void LLVOVolume::sculpt()
+{
+ if (mSculptTexture.notNull())
+ {
+ U16 sculpt_height = 0;
+ U16 sculpt_width = 0;
+ S8 sculpt_components = 0;
+ const U8* sculpt_data = NULL;
+
+ S32 discard_level = mSculptTexture->getDiscardLevel() ;
+ LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ;
S32 max_discard = mSculptTexture->getMaxDiscardLevel();
if (discard_level > max_discard)
discard_level = max_discard; // clamp to the best we can do
- S32 best_discard = mSculptTexture->getDiscardLevel();
- if (discard_level < best_discard)
- discard_level = best_discard; // clamp to what we have
-
- if (best_discard == -1)
- discard_level = -1; // and if we have nothing, set to nothing
-
-
- S32 current_discard = getVolume()->getSculptLevel();
+ S32 current_discard = getVolume()->getSculptLevel() ;
if(current_discard < -2)
{
llwarns << "WARNING!!: Current discard of sculpty at " << current_discard
@@ -951,19 +1007,10 @@ void LLVOVolume::sculpt()
if (current_discard == discard_level) // no work to do here
return;
- LLPointer<LLImageRaw> raw_image = new LLImageRaw();
- BOOL is_valid = mSculptTexture->readBackRaw(discard_level, raw_image, FALSE);
-
- sculpt_height = raw_image->getHeight();
- sculpt_width = raw_image->getWidth();
- sculpt_components = raw_image->getComponents();
-
- if(is_valid)
- {
- is_valid = mSculptTexture->isValidForSculpt(discard_level, sculpt_width, sculpt_height, sculpt_components) ;
- }
- if(!is_valid)
+ if(!raw_image)
{
+ llassert(discard_level < 0) ;
+
sculpt_width = 0;
sculpt_height = 0;
sculpt_data = NULL ;
@@ -974,10 +1021,10 @@ void LLVOVolume::sculpt()
}
}
else
- {
- if (raw_image->getDataSize() < sculpt_height * sculpt_width * sculpt_components)
- llerrs << "Sculpt: image data size = " << raw_image->getDataSize()
- << " < " << sculpt_height << " x " << sculpt_width << " x " <<sculpt_components << llendl;
+ {
+ sculpt_height = raw_image->getHeight();
+ sculpt_width = raw_image->getWidth();
+ sculpt_components = raw_image->getComponents();
sculpt_data = raw_image->getData();
@@ -987,6 +1034,16 @@ void LLVOVolume::sculpt()
}
}
getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level);
+
+ //notify rebuild any other VOVolumes that reference this sculpty volume
+ for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i)
+ {
+ LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i];
+ if (volume != this && volume->getVolume() == getVolume())
+ {
+ gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE);
+ }
+ }
}
}
@@ -1013,12 +1070,6 @@ BOOL LLVOVolume::calcLOD()
return FALSE;
}
- //update face texture sizes on lod calculation
- //if (mDrawable->isVisible())
- //{
- // updateTextures();
- //}
-
S32 cur_detail = 0;
F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
@@ -1036,7 +1087,7 @@ BOOL LLVOVolume::calcLOD()
}
// DON'T Compensate for field of view changing on FOV zoom.
- distance *= 3.14159f/3.f;
+ distance *= F_PI/3.f;
cur_detail = computeLODDetail(llround(distance, 0.01f),
llround(radius, 0.01f));
@@ -1157,6 +1208,20 @@ void LLVOVolume::regenFaces()
facep->setTEOffset(i);
facep->setTexture(getTEImage(i));
facep->setViewerObject(this);
+
+ // If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face.
+ // Re-establish the link.
+ if((int)mMediaImplList.size() > i)
+ {
+ if(mMediaImplList[i])
+ {
+ LLViewerMediaTexture* media_tex = LLViewerTextureManager::findMediaTexture(mMediaImplList[i]->getMediaTextureID()) ;
+ if(media_tex)
+ {
+ media_tex->addMediaToFace(facep) ;
+ }
+ }
+ }
}
if (!count_changed)
@@ -1687,9 +1752,37 @@ bool LLVOVolume::hasMedia() const
return result;
}
-void LLVOVolume::requestMediaDataUpdate()
+LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
+{
+ LLVolume* volume = getVolume();
+ LLVector3 result;
+
+ if (volume && face_id < volume->getNumVolumeFaces())
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(face_id);
+ for (S32 i = 0; i < (S32)face.mVertices.size(); ++i)
+ {
+ result += face.mVertices[i].mNormal;
+ }
+
+ result = volumeDirectionToAgent(result);
+ result.normVec();
+ }
+
+ return result;
+}
+
+void LLVOVolume::requestMediaDataUpdate(bool isNew)
{
- sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this));
+ if (sObjectMediaClient)
+ sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew));
+}
+
+bool LLVOVolume::isMediaDataBeingFetched() const
+{
+ // I know what I'm doing by const_casting this away: this is just
+ // a wrapper class that is only going to do a lookup.
+ return (sObjectMediaClient) ? sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)) : false;
}
void LLVOVolume::cleanUpMediaImpls()
@@ -1707,27 +1800,40 @@ void LLVOVolume::cleanUpMediaImpls()
}
}
-void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array)
+void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version)
{
// media_data_array is an array of media entry maps
+ // media_version is the version string in the response.
+ U32 fetched_version = LLTextureEntry::getVersionFromMediaVersionString(media_version);
- //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl;
-
- LLSD::array_const_iterator iter = media_data_array.beginArray();
- LLSD::array_const_iterator end = media_data_array.endArray();
- U8 texture_index = 0;
- for (; iter != end; ++iter, ++texture_index)
+ // Only update it if it is newer!
+ if ( (S32)fetched_version > mLastFetchedMediaVersion)
{
- syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/);
+ mLastFetchedMediaVersion = fetched_version;
+ //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl;
+
+ LLSD::array_const_iterator iter = media_data_array.beginArray();
+ LLSD::array_const_iterator end = media_data_array.endArray();
+ U8 texture_index = 0;
+ for (; iter != end; ++iter, ++texture_index)
+ {
+ syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/);
+ }
}
}
void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent)
{
+ if(mDead)
+ {
+ // If the object has been marked dead, don't process media updates.
+ return;
+ }
+
LLTextureEntry *te = getTE(texture_index);
- //llinfos << "BEFORE: texture_index = " << texture_index
- // << " hasMedia = " << te->hasMedia() << " : "
- // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+ LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
+ << " hasMedia = " << te->hasMedia() << " : "
+ << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
std::string previous_url;
LLMediaEntry* mep = te->getMediaData();
@@ -1762,10 +1868,14 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
addMediaImpl(media_impl, texture_index) ;
}
+ else
+ {
+ removeMediaImpl(texture_index);
+ }
- //llinfos << "AFTER: texture_index = " << texture_index
- // << " hasMedia = " << te->hasMedia() << " : "
- // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+ LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index
+ << " hasMedia = " << te->hasMedia() << " : "
+ << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
}
void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
@@ -1782,13 +1892,33 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
if (mep && impl)
{
std::string url = mep->getCurrentURL();
- if (url.empty())
+ // Look for a ":", if not there, assume "http://"
+ if (!url.empty() && std::string::npos == url.find(':'))
+ {
+ url = "http://" + url;
+ }
+ // If the url we're trying to "bounce back" to is either empty or not
+ // allowed by the whitelist, try the home url. If *that* doesn't work,
+ // set the media as failed and unload it
+ if (url.empty() || !mep->checkCandidateUrl(url))
{
url = mep->getHomeURL();
+ // Look for a ":", if not there, assume "http://"
+ if (!url.empty() && std::string::npos == url.find(':'))
+ {
+ url = "http://" + url;
+ }
}
- if (! url.empty())
- {
- LL_INFOS("LLMediaDataClient") << "bouncing back to URL: " << url << LL_ENDL;
+ if (url.empty() || !mep->checkCandidateUrl(url))
+ {
+ // The url to navigate back to is not good, and we have nowhere else
+ // to go.
+ LL_WARNS("MediaOnAPrim") << "FAILED to bounce back URL \"" << url << "\" -- unloading impl" << LL_ENDL;
+ impl->setMediaFailed(true);
+ }
+ else {
+ // Okay, navigate now
+ LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL;
impl->navigateTo(url, "", false, true);
}
}
@@ -1796,20 +1926,19 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermType perm_type)
{
- // NOTE: This logic duplicates the logic in the server (in particular, in llmediaservice.cpp).
+ // NOTE: This logic ALMOST duplicates the logic in the server (in particular, in llmediaservice.cpp).
if (NULL == media_entry ) return false; // XXX should we assert here?
- // The agent has permissions to navigate if:
- // - agent has edit permissions, or
+ // The agent has permissions if:
// - world permissions are on, or
// - group permissions are on, and agent_id is in the group, or
// - agent permissions are on, and agent_id is the owner
- if (permModify())
- {
- return true;
- }
-
+ // *NOTE: We *used* to check for modify permissions here (i.e. permissions were
+ // granted if permModify() was true). However, this doesn't make sense in the
+ // viewer: we don't want to show controls or allow interaction if the author
+ // has deemed it so. See DEV-42115.
+
U8 media_perms = (perm_type == MEDIA_PERM_INTERACT) ? media_entry->getPermsInteract() : media_entry->getPermsControl();
// World permissions
@@ -1872,12 +2001,12 @@ void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plu
// "bounce back" to the current URL from the media entry
mediaNavigateBounceBack(face_index);
}
- else
+ else if (sObjectMediaNavigateClient)
{
llinfos << "broadcasting navigate with URI " << new_location << llendl;
- sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this), face_index, new_location);
+ sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this, false), face_index, new_location);
}
}
@@ -1941,7 +2070,8 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin,
void LLVOVolume::sendMediaDataUpdate()
{
- sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this));
+ if (sObjectMediaClient)
+ sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false));
}
void LLVOVolume::removeMediaImpl(S32 texture_index)
@@ -2036,14 +2166,26 @@ viewer_media_t LLVOVolume::getMediaImpl(U8 face_id) const
F64 LLVOVolume::getTotalMediaInterest() const
{
- F64 interest = (F64)0.0;
- int i = 0;
+ // If this object is currently focused, this object has "high" interest
+ if (LLViewerMediaFocus::getInstance()->getFocusedObjectID() == getID())
+ return F64_MAX;
+
+ F64 interest = (F64)-1.0; // means not interested;
+
+ // If this object is selected, this object has "high" interest, but since
+ // there can be more than one, we still add in calculated impl interest
+ // XXX Sadly, 'contains()' doesn't take a const :(
+ if (LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this)))
+ interest = F64_MAX / 2.0;
+
+ int i = 0;
const int end = getNumTEs();
for ( ; i < end; ++i)
{
const viewer_media_t &impl = getMediaImpl(i);
if (!impl.isNull())
{
+ if (interest == (F64)-1.0) interest = (F64)0.0;
interest += impl->getInterest();
}
}
@@ -2554,6 +2696,139 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
return mDrawable->getWorldMatrix();
}
+// Returns a base cost and adds textures to passed in set.
+// total cost is returned value + 5 * size of the resulting set.
+// Cannot include cost of textures, as they may be re-used in linked
+// children, and cost should only be increased for unique textures -Nyx
+U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
+{
+ // base cost of each prim should be 10 points
+ static const U32 ARC_PRIM_COST = 10;
+ // per-prim costs
+ static const U32 ARC_INVISI_COST = 1;
+ static const U32 ARC_SHINY_COST = 1;
+ static const U32 ARC_GLOW_COST = 1;
+ static const U32 ARC_FLEXI_COST = 8;
+ static const U32 ARC_PARTICLE_COST = 16;
+ static const U32 ARC_BUMP_COST = 4;
+
+ // per-face costs
+ static const U32 ARC_PLANAR_COST = 1;
+ static const U32 ARC_ANIM_TEX_COST = 4;
+ static const U32 ARC_ALPHA_COST = 4;
+
+ U32 shame = ARC_PRIM_COST;
+
+ U32 invisi = 0;
+ U32 shiny = 0;
+ U32 glow = 0;
+ U32 alpha = 0;
+ U32 flexi = 0;
+ U32 animtex = 0;
+ U32 particles = 0;
+ U32 scale = 0;
+ U32 bump = 0;
+ U32 planar = 0;
+
+ if (isFlexible())
+ {
+ flexi = 1;
+ }
+ if (isParticleSource())
+ {
+ particles = 1;
+ }
+
+ const LLVector3& sc = getScale();
+ scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
+
+ const LLDrawable* drawablep = mDrawable;
+
+ if (isSculpted())
+ {
+ const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ textures.insert(sculpt_id);
+ }
+
+ for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
+ {
+ const LLFace* face = drawablep->getFace(i);
+ const LLTextureEntry* te = face->getTextureEntry();
+ const LLViewerTexture* img = face->getTexture();
+
+ if (img)
+ {
+ textures.insert(img->getID());
+ }
+
+ if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
+ {
+ alpha++;
+ }
+ else if (img && img->getPrimaryFormat() == GL_ALPHA)
+ {
+ invisi = 1;
+ }
+
+ if (te)
+ {
+ if (te->getBumpmap())
+ {
+ bump = 1;
+ }
+ if (te->getShiny())
+ {
+ shiny = 1;
+ }
+ if (te->getGlow() > 0.f)
+ {
+ glow = 1;
+ }
+ if (face->mTextureMatrix != NULL)
+ {
+ animtex++;
+ }
+ if (te->getTexGen())
+ {
+ planar++;
+ }
+ }
+ }
+
+
+ shame += invisi * ARC_INVISI_COST;
+ shame += shiny * ARC_SHINY_COST;
+ shame += glow * ARC_GLOW_COST;
+ shame += alpha * ARC_ALPHA_COST;
+ shame += flexi * ARC_FLEXI_COST;
+ shame += animtex * ARC_ANIM_TEX_COST;
+ shame += particles * ARC_PARTICLE_COST;
+ shame += bump * ARC_BUMP_COST;
+ shame += planar * ARC_PLANAR_COST;
+ shame += scale;
+
+ LLViewerObject::const_child_list_t& child_list = getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end();
+ ++iter)
+ {
+ const LLViewerObject* child_objectp = *iter;
+ const LLDrawable* child_drawablep = child_objectp->mDrawable;
+ if (child_drawablep)
+ {
+ const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
+ if (child_volumep)
+ {
+ shame += child_volumep->getRenderCost(textures);
+ }
+ }
+ }
+
+ return shame;
+
+}
+
//static
void LLVOVolume::preUpdateGeom()
{
@@ -2784,7 +3059,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
if (face == -1)
{
start_face = 0;
- end_face = volume->getNumFaces();
+ end_face = volume->getNumVolumeFaces();
}
else
{
@@ -2799,8 +3074,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
if (face_hit >= 0 && mDrawable->getNumFaces() > face_hit)
{
- LLFace* face = mDrawable->getFace(face_hit);
-
+ LLFace* face = mDrawable->getFace(face_hit);
+
if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n)))
{
v_end = p;
@@ -3047,7 +3322,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLVOVolume* vobj = drawablep->getVOVolume();
llassert_always(vobj);
- vobj->updateTextures();
+ vobj->updateTextureVirtualSize();
vobj->preRebuild();
drawablep->clearState(LLDrawable::HAS_ALPHA);
@@ -3220,7 +3495,8 @@ static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
{
llpushcallstacks ;
- if (group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
+ llassert(group);
+ if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
LLFastTimer tm(FTM_VOLUME_GEOM);
S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ;
@@ -3274,9 +3550,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
}
// don't forget alpha
- if( group != NULL &&
- !group->mVertexBuffer.isNull() &&
- group->mVertexBuffer->isLocked())
+ if(group != NULL &&
+ !group->mVertexBuffer.isNull() &&
+ group->mVertexBuffer->isLocked())
{
group->mVertexBuffer->setBuffer(0);
}
@@ -3302,7 +3578,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
{
llerrs << "WTF?" << llendl;
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 00810b22c4..a8bb597f93 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -37,7 +37,6 @@
#include "llviewertexture.h"
#include "llviewermedia.h"
#include "llframetimer.h"
-#include "llapr.h"
#include "m3math.h" // LLMatrix3
#include "m4math.h" // LLMatrix4
#include <map>
@@ -100,6 +99,7 @@ public:
public:
LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
+ /*virtual*/ void markDead(); // Override (and call through to parent) to clean up media references
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
@@ -120,7 +120,7 @@ public:
const LLMatrix4& getRelativeXform() const { return mRelativeXform; }
const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; }
/*virtual*/ const LLMatrix4 getRenderMatrix() const;
-
+ U32 getRenderCost(std::set<LLUUID> &textures) const;
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
@@ -139,7 +139,7 @@ public:
BOOL getVolumeChanged() const { return mVolumeChanged; }
- F32 getTextureVirtualSize(LLFace* face);
+
/*virtual*/ F32 getRadius() const { return mVObjRadius; };
const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
@@ -179,16 +179,18 @@ public:
/*virtual*/ BOOL setMaterial(const U8 material);
void setTexture(const S32 face);
-
+ S32 getIndexInTex() const {return mIndexInTex ;}
/*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
+ void updateSculptTexture();
+ void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateFaceSize(S32 idx);
/*virtual*/ BOOL updateLOD();
void updateRadius();
- /*virtual*/ void updateTextures(LLAgent &agent);
- void updateTextures();
+ /*virtual*/ void updateTextures();
+ void updateTextureVirtualSize();
void updateFaceFlags();
void regenFaces();
@@ -237,7 +239,7 @@ public:
// Update this object's media data with the given media data array
// (typically this is only called upon a response from a server request)
- void updateObjectMediaData(const LLSD &media_data_array);
+ void updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version);
// Bounce back media at the given index to its current URL (or home URL, if current URL is empty)
void mediaNavigateBounceBack(U8 texture_index);
@@ -263,14 +265,22 @@ public:
F64 getTotalMediaInterest() const;
bool hasMedia() const;
-
+
+ LLVector3 getApproximateFaceNormal(U8 face_id);
+
+ // Returns 'true' iff the media data for this object is in flight
+ bool isMediaDataBeingFetched() const;
+
+ // Returns the "last fetched" media version, or -1 if not fetched yet
+ S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; }
+
protected:
S32 computeLODDetail(F32 distance, F32 radius);
BOOL calcLOD();
LLFace* addFace(S32 face_index);
void updateTEData();
- void requestMediaDataUpdate();
+ void requestMediaDataUpdate(bool isNew);
void cleanUpMediaImpls();
void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;
void removeMediaImpl(S32 texture_index) ;
@@ -284,7 +294,6 @@ private:
LLFrameTimer mTextureUpdateTimer;
S32 mLOD;
BOOL mLODChanged;
- S32 mSculptLevel;
BOOL mSculptChanged;
F32 mSpotLightPriority;
LLMatrix4 mRelativeXform;
@@ -295,7 +304,8 @@ private:
LLPointer<LLViewerFetchedTexture> mSculptTexture;
LLPointer<LLViewerFetchedTexture> mLightTexture;
media_list_t mMediaImplList;
-
+ S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
+ S32 mIndexInTex;
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
@@ -305,6 +315,8 @@ public:
static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;
static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient;
+ static const U32 ARC_TEXTURE_COST = 5;
+
protected:
static S32 sNumLODChanges;
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 0c967f9020..a8c4625f6e 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -55,8 +55,6 @@ const BOOL gUseRoam = FALSE;
///////////////////////////////////
-#include "randgauss.h"
-
template<class T> inline T LERP(T a, T b, F32 factor)
{
return a + (b - a) * factor;
@@ -100,7 +98,7 @@ void LLVOWater::setPixelAreaAndAngle(LLAgent &agent)
// virtual
-void LLVOWater::updateTextures(LLAgent &agent)
+void LLVOWater::updateTextures()
{
}
diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h
index 28a5633c58..3cc031e589 100644
--- a/indra/newview/llvowater.h
+++ b/indra/newview/llvowater.h
@@ -68,7 +68,7 @@ public:
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
- /*virtual*/ void updateTextures(LLAgent &agent);
+ /*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
virtual U32 getPartitionType() const;
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 8621e5e1d9..0272a2ab34 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -49,12 +49,12 @@ const U32 LLVOWLSky::MAX_SKY_DETAIL = 180;
inline U32 LLVOWLSky::getNumStacks(void)
{
- return gSavedSettings.getU32("WLSkyDetail");
+ return llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail")));
}
inline U32 LLVOWLSky::getNumSlices(void)
{
- return 2 * gSavedSettings.getU32("WLSkyDetail");
+ return 2 * llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail")));
}
inline U32 LLVOWLSky::getFanNumVerts(void)
@@ -491,7 +491,7 @@ void LLVOWLSky::drawStars(void)
if (mStarsVerts.notNull())
{
mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK);
- mStarsVerts->draw(LLRender::POINTS, getStarsNumIndices(), 0);
+ mStarsVerts->drawArrays(LLRender::QUADS, 0, getStarsNumVerts()*4);
}
}
@@ -546,6 +546,7 @@ void LLVOWLSky::initStars()
std::vector<F32>::iterator v_i = mStarIntensities.begin();
U32 i;
+
for (i = 0; i < getStarsNumVerts(); ++i)
{
v_p->mV[VX] = ll_frand() - 0.5f;
@@ -771,17 +772,17 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
{
LLStrider<LLVector3> verticesp;
LLStrider<LLColor4U> colorsp;
- LLStrider<U16> indicesp;
+ LLStrider<LLVector2> texcoordsp;
if (mStarsVerts.isNull())
{
mStarsVerts = new LLVertexBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK, GL_DYNAMIC_DRAW);
- mStarsVerts->allocateBuffer(getStarsNumVerts(), getStarsNumIndices(), TRUE);
+ mStarsVerts->allocateBuffer(getStarsNumVerts()*4, 0, TRUE);
}
-
+
BOOL success = mStarsVerts->getVertexStrider(verticesp)
- && mStarsVerts->getIndexStrider(indicesp)
- && mStarsVerts->getColorStrider(colorsp);
+ && mStarsVerts->getColorStrider(colorsp)
+ && mStarsVerts->getTexCoord0Strider(texcoordsp);
if(!success)
{
@@ -791,11 +792,37 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
// *TODO: fix LLStrider with a real prefix increment operator so it can be
// used as a model of OutputIterator. -Brad
// std::copy(mStarVertices.begin(), mStarVertices.end(), verticesp);
+
+ if (mStarVertices.size() < getStarsNumVerts())
+ {
+ llerrs << "Star reference geometry insufficient." << llendl;
+ }
+
for (U32 vtx = 0; vtx < getStarsNumVerts(); ++vtx)
{
+ LLVector3 at = mStarVertices[vtx];
+ at.normVec();
+ LLVector3 left = at%LLVector3(0,0,1);
+ LLVector3 up = at%left;
+
+ F32 sc = 0.5f+ll_frand()*1.25f;
+ left *= sc;
+ up *= sc;
+
*(verticesp++) = mStarVertices[vtx];
+ *(verticesp++) = mStarVertices[vtx]+left;
+ *(verticesp++) = mStarVertices[vtx]+left+up;
+ *(verticesp++) = mStarVertices[vtx]+up;
+
+ *(texcoordsp++) = LLVector2(0,0);
+ *(texcoordsp++) = LLVector2(0,1);
+ *(texcoordsp++) = LLVector2(1,1);
+ *(texcoordsp++) = LLVector2(1,0);
+
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
- *(indicesp++) = vtx;
}
mStarsVerts->setBuffer(0);
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index c8cc6a3d8e..8be8f494da 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -51,16 +51,13 @@
#include "llsdserialize.h"
#include "v4math.h"
-#include "llviewerdisplay.h"
#include "llviewercontrol.h"
-#include "llviewerwindow.h"
#include "lldrawpoolwater.h"
#include "llagent.h"
#include "llviewerregion.h"
#include "llwlparammanager.h"
#include "llwaterparamset.h"
-#include "llpostprocess.h"
#include "llfloaterwater.h"
#include "curl/curl.h"
@@ -91,7 +88,7 @@ LLWaterParamManager::~LLWaterParamManager()
void LLWaterParamManager::loadAllPresets(const std::string& file_name)
{
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
bool found = true;
while(found)
@@ -117,7 +114,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
// And repeat for user presets, note the user presets will modify any system presets already loaded
std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
found = true;
while(found)
@@ -152,7 +149,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
escaped_filename += ".xml";
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
- llinfos << "Loading water settings from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL;
llifstream presetsXML;
presetsXML.open(pathName.c_str());
@@ -161,7 +158,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
if(!presetsXML)
{
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
- llinfos << "Loading User water setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL;
presetsXML.clear();
presetsXML.open(pathName.c_str());
}
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 4cd29bb838..acfbc23f62 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -36,8 +36,10 @@
#include "llagentwearables.h"
#include "llfloatercustomize.h"
#include "lllocaltextureobject.h"
+#include "llnotificationsutil.h"
#include "llviewertexturelist.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llviewerregion.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@@ -60,7 +62,7 @@ static std::string asset_id_to_filename(const LLUUID &asset_id);
LLWearable::LLWearable(const LLTransactionID& transaction_id) :
mDefinitionVersion(LLWearable::sCurrentDefinitionVersion),
- mType(WT_SHAPE)
+ mType(WT_INVALID)
{
mTransactionID = transaction_id;
mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
@@ -68,7 +70,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) :
LLWearable::LLWearable(const LLAssetID& asset_id) :
mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ),
- mType(WT_SHAPE)
+ mType(WT_INVALID)
{
mAssetID = asset_id;
mTransactionID.setNull();
@@ -181,13 +183,7 @@ void LLWearable::createVisualParams()
{
if (param->getWearableType() == mType)
{
- if (mVisualParamIndexMap[param->getID()])
- {
- delete mVisualParamIndexMap[param->getID()];
- }
- LLViewerVisualParam *new_param = param->cloneParam(this);
- new_param->setIsDummy(FALSE);
- mVisualParamIndexMap[param->getID()] = new_param;
+ addVisualParam(param->cloneParam(this));
}
}
@@ -231,7 +227,13 @@ BOOL LLWearable::importFile( LLFILE* file )
return FALSE;
}
- if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion )
+
+ // Temoprary hack to allow wearables with definition version 24 to still load.
+ // This should only affect lindens and NDA'd testers who have saved wearables in 2.0
+ // the extra check for version == 24 can be removed before release, once internal testers
+ // have loaded these wearables again. See hack pt 2 at bottom of function to ensure that
+ // these wearables get re-saved with version definition 22.
+ if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion && mDefinitionVersion != 24 )
{
llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl;
return FALSE;
@@ -354,7 +356,7 @@ BOOL LLWearable::importFile( LLFILE* file )
if( num_parameters != mVisualParamIndexMap.size() )
{
- llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl;
+ llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " << mType << llendl;
}
// parameters
@@ -608,7 +610,7 @@ void LLWearable::setTexturesToDefaults()
}
// Updates the user's avatar's appearance
-void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater )
+void LLWearable::writeToAvatar()
{
LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
llassert( avatar );
@@ -623,29 +625,17 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
// Pull params
for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
{
- if( (((LLViewerVisualParam*)param)->getWearableType() == mType) )
+ // cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the
+ // avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way.
+ if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (!((LLViewerVisualParam*)param)->getCrossWearable()) )
{
S32 param_id = param->getID();
F32 weight = getVisualParamWeight(param_id);
- // only animate with user-originated changes
- if (set_by_user)
- {
- param->setAnimationTarget(weight, set_by_user);
- }
- else
- {
- avatar->setVisualParamWeight( param_id, weight, set_by_user );
- }
+ avatar->setVisualParamWeight( param_id, weight, FALSE );
}
}
- // only interpolate with user-originated changes
- if (set_by_user)
- {
- avatar->startAppearanceAnimation(TRUE, TRUE);
- }
-
// Pull texture entries
for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
{
@@ -661,28 +651,19 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
{
image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
}
- LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE );
+ LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
// MULTI-WEARABLE: replace hard-coded 0
- avatar->setLocalTextureTE(te, image, set_by_user, 0);
+ avatar->setLocalTextureTE(te, image, 0);
}
}
-
- if( gFloaterCustomize && update_customize_floater )
- {
- gFloaterCustomize->setWearable(mType, 0);
- gFloaterCustomize->setCurrentWearableType( mType );
- }
-
ESex new_sex = avatar->getSex();
if( old_sex != new_sex )
{
- avatar->updateSexDependentLayerSets( set_by_user );
+ avatar->updateSexDependentLayerSets( FALSE );
}
- avatar->updateMeshTextures();
-
-// if( set_by_user )
+// if( upload_bake )
// {
// gAgent.sendAgentSetAppearance();
// }
@@ -691,7 +672,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values.
// static
-void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
+void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )
{
LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
llassert( avatar );
@@ -715,7 +696,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
S32 param_id = param->getID();
- avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user );
+ avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake );
}
}
@@ -725,9 +706,9 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
}
avatar->updateVisualParams();
- avatar->updateMeshTextures();
+ avatar->wearableUpdated(type, TRUE);
-// if( set_by_user )
+// if( upload_bake )
// {
// gAgent.sendAgentSetAppearance();
// }
@@ -750,7 +731,8 @@ void LLWearable::copyDataFrom(const LLWearable* src)
mDescription = src->mDescription;
mPermissions = src->mPermissions;
mSaleInfo = src->mSaleInfo;
- mType = src->mType;
+
+ setType(src->mType);
mSavedVisualParamMap.clear();
// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed)
@@ -763,9 +745,6 @@ void LLWearable::copyDataFrom(const LLWearable* src)
S32 id = param->getID();
F32 weight = src->getVisualParamWeight(id);
mSavedVisualParamMap[id] = weight;
-
- // Clones a visual param from src and adds it to this wearable. Value of param is taken from current value of source param, not saved.
- addVisualParam(param->cloneParam(this));
}
}
@@ -841,16 +820,13 @@ const LLLocalTextureObject* LLWearable::getConstLocalTextureObject(S32 index) co
return NULL;
}
-void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject *lto)
+void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject &lto)
{
if( mTEMap.find(index) != mTEMap.end() )
{
mTEMap.erase(index);
}
- if( lto )
- {
- mTEMap[index] = new LLLocalTextureObject(*lto);
- }
+ mTEMap[index] = new LLLocalTextureObject(lto);
}
@@ -860,7 +836,9 @@ void LLWearable::addVisualParam(LLVisualParam *param)
{
delete mVisualParamIndexMap[param->getID()];
}
+ param->setIsDummy(FALSE);
mVisualParamIndexMap[param->getID()] = param;
+ mSavedVisualParamMap[param->getID()] = param->getDefaultWeight();
}
void LLWearable::setVisualParams()
@@ -877,12 +855,12 @@ void LLWearable::setVisualParams()
}
-void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL set_by_user)
+void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake)
{
if( is_in_map(mVisualParamIndexMap, param_index ) )
{
LLVisualParam *wearable_param = mVisualParamIndexMap[param_index];
- wearable_param->setWeight(value, set_by_user);
+ wearable_param->setWeight(value, upload_bake);
}
else
{
@@ -923,14 +901,14 @@ void LLWearable::getVisualParams(visual_param_vec_t &list)
}
}
-void LLWearable::animateParams(F32 delta, BOOL set_by_user)
+void LLWearable::animateParams(F32 delta, BOOL upload_bake)
{
for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin();
iter != mVisualParamIndexMap.end();
++iter)
{
LLVisualParam *param = (LLVisualParam*) iter->second;
- param->animate(delta, set_by_user);
+ param->animate(delta, upload_bake);
}
}
@@ -948,14 +926,14 @@ LLColor4 LLWearable::getClothesColor(S32 te) const
return color;
}
-void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user )
+void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake )
{
U32 param_name[3];
if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) )
{
for( U8 index = 0; index < 3; index++ )
{
- setVisualParamWeight(param_name[index], new_color.mV[index], set_by_user);
+ setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake);
}
}
}
@@ -963,11 +941,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by
void LLWearable::revertValues()
{
//update saved settings so wearable is no longer dirty
+ // non-driver params first
for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
{
S32 id = iter->first;
F32 value = iter->second;
- setVisualParamWeight(id, value, TRUE);
+ LLVisualParam *param = getVisualParam(id);
+ if(param && !dynamic_cast<LLDriverParam*>(param) )
+ {
+ setVisualParamWeight(id, value, TRUE);
+ }
+ }
+
+ //then driver params
+ for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ F32 value = iter->second;
+ LLVisualParam *param = getVisualParam(id);
+ if(param && dynamic_cast<LLDriverParam*>(param) )
+ {
+ setVisualParamWeight(id, value, TRUE);
+ }
+ }
+
+ // make sure that saved values are sane
+ for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ LLVisualParam *param = getVisualParam(id);
+ if( param )
+ {
+ mSavedVisualParamMap[id] = param->getWeight();
+ }
}
syncImages(mSavedTEMap, mTEMap);
@@ -1081,6 +1087,42 @@ void LLWearable::destroyTextures()
mSavedTEMap.clear();
}
+void LLWearable::pullCrossWearableValues()
+{
+ // scan through all of the avatar's visual parameters
+ LLVOAvatar* avatar = gAgent.getAvatarObject();
+ for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ param;
+ param = (LLViewerVisualParam*) avatar->getNextVisualParam())
+ {
+ if( param )
+ {
+ LLDriverParam *driver_param = dynamic_cast<LLDriverParam*>(param);
+ if(driver_param)
+ {
+ // parameter is a driver parameter, have it update its
+ driver_param->updateCrossDrivenParams(getType());
+ }
+ }
+ }
+}
+
+
+void LLWearable::setLabelUpdated() const
+{
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID());
+}
+
+void LLWearable::refreshName()
+{
+ LLUUID item_id = getItemID();
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if( item )
+ {
+ mName = item->getName();
+ }
+}
+
struct LLWearableSaveData
{
EWearableType mType;
@@ -1110,7 +1152,7 @@ void LLWearable::saveNewAsset() const
LLSD args;
args["NAME"] = mName;
- LLNotifications::instance().add("CannotSaveWearableOutOfSpace", args);
+ LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args);
return;
}
@@ -1123,7 +1165,7 @@ void LLWearable::saveNewAsset() const
{
llinfos << "Update Agent Inventory via capability" << llendl;
LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType(getAssetType());
+ body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType()));
body["asset_type"] = LLAssetType::lookup(getAssetType());
body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE);
body["name"] = getName();
@@ -1158,7 +1200,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda
llwarns << buffer << " Status: " << status << llendl;
LLSD args;
args["NAME"] = type_name;
- LLNotifications::instance().add("CannotSaveToAssetStore", args);
+ LLNotificationsUtil::add("CannotSaveToAssetStore", args);
}
// Delete temp file
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 96631811c5..7bd5305079 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -82,6 +82,8 @@ public:
const std::string& getTypeName() const;
LLAssetType::EType getAssetType() const;
LLLocalTextureObject* getLocalTextureObject(S32 index) const;
+ S32 getDefinitionVersion() const { return mDefinitionVersion; }
+ void setDefinitionVersion( S32 new_version ) { mDefinitionVersion = new_version; }
public:
typedef std::vector<LLVisualParam*> visual_param_vec_t;
@@ -89,9 +91,9 @@ public:
BOOL isDirty() const;
BOOL isOldVersion() const;
- void writeToAvatar( BOOL set_by_user, BOOL update_customize_floater = TRUE );
- void removeFromAvatar( BOOL set_by_user ) { LLWearable::removeFromAvatar( mType, set_by_user ); }
- static void removeFromAvatar( EWearableType type, BOOL set_by_user );
+ void writeToAvatar();
+ void removeFromAvatar( BOOL upload_bake ) { LLWearable::removeFromAvatar( mType, upload_bake ); }
+ static void removeFromAvatar( EWearableType type, BOOL upload_bake );
BOOL exportFile(LLFILE* file) const;
BOOL importFile(LLFILE* file);
@@ -112,22 +114,30 @@ public:
LLLocalTextureObject* getLocalTextureObject(S32 index);
const LLLocalTextureObject* getConstLocalTextureObject(S32 index) const;
- void setLocalTextureObject(S32 index, LLLocalTextureObject *lto);
+ void setLocalTextureObject(S32 index, LLLocalTextureObject &lto);
void addVisualParam(LLVisualParam *param);
void setVisualParams();
- void setVisualParamWeight(S32 index, F32 value, BOOL set_by_user);
+ void setVisualParamWeight(S32 index, F32 value, BOOL upload_bake);
F32 getVisualParamWeight(S32 index) const;
LLVisualParam* getVisualParam(S32 index) const;
void getVisualParams(visual_param_vec_t &list);
- void animateParams(F32 delta, BOOL set_by_user);
+ void animateParams(F32 delta, BOOL upload_bake);
LLColor4 getClothesColor(S32 te) const;
- void setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user );
+ void setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake );
void revertValues();
+ void saveValues();
+ void pullCrossWearableValues();
BOOL isOnTop() const;
+ // Something happened that requires the wearable's label to be updated (e.g. worn/unworn).
+ void setLabelUpdated() const;
+
+ // the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem,
+ // not the wearable asset itself.
+ void refreshName();
private:
typedef std::map<S32, LLLocalTextureObject*> te_map_t;
@@ -135,9 +145,8 @@ private:
void createLayers(S32 te);
void createVisualParams();
- void saveValues();
void syncImages(te_map_t &src, te_map_t &dst);
- void destroyTextures();
+ void destroyTextures();
static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml.
S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created.
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index da62223aac..d6a9837b86 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -38,9 +38,8 @@
#include "llassetstorage.h"
#include "llagent.h"
#include "llvoavatar.h"
-#include "llviewerinventory.h"
#include "llviewerstats.h"
-#include "llnotify.h"
+#include "llnotificationsutil.h"
#include "llinventorymodel.h"
#include "lltrans.h"
@@ -70,6 +69,11 @@ struct LLWearableArrivedData
LLWearableList::~LLWearableList()
{
+ llassert_always(mList.empty()) ;
+}
+
+void LLWearableList::cleanup()
+{
for_each(mList.begin(), mList.end(), DeletePairedPointer());
mList.clear();
}
@@ -182,16 +186,16 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
args["TYPE"] =LLTrans::getString(LLAssetType::lookupHumanReadable(data->mAssetType));
if (isNewWearable)
{
- LLNotifications::instance().add("InvalidWearable");
+ LLNotificationsUtil::add("InvalidWearable");
}
else if (data->mName.empty())
{
- LLNotifications::instance().add("FailedToFindWearableUnnamed", args);
+ LLNotificationsUtil::add("FailedToFindWearableUnnamed", args);
}
else
{
args["DESC"] = data->mName;
- LLNotifications::instance().add("FailedToFindWearable", args);
+ LLNotificationsUtil::add("FailedToFindWearable", args);
}
}
// Always call callback; wearable will be NULL if we failed
@@ -244,9 +248,13 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type )
wearable->setParamsToDefaults();
wearable->setTexturesToDefaults();
+ //mark all values (params & images) as saved
+ wearable->saveValues();
+
// Send to the dataserver
wearable->saveNewAsset();
+
return wearable;
}
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index e5155c66a4..cf1a9bddff 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -44,6 +44,7 @@ class LLWearableList : public LLSingleton<LLWearableList>
public:
LLWearableList() {}
~LLWearableList();
+ void cleanup() ;
S32 getLength() const { return mList.size(); }
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 3204c2d264..3385b75c65 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -38,13 +38,24 @@
// Library includes
#include "llwindow.h" // spawnWebBrowser()
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
+#include "llagent.h"
+#include "llappviewer.h"
#include "llfloatermediabrowser.h"
#include "llfloaterreg.h"
-#include "llalertdialog.h"
+#include "lllogininstance.h"
+#include "llparcel.h"
+#include "llsd.h"
+#include "lltoastalertpanel.h"
+#include "llui.h"
+#include "lluri.h"
+#include "llversioninfo.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
-class URLLoader : public LLAlertDialog::URLLoader
+class URLLoader : public LLToastAlertPanel::URLLoader
{
virtual void load(const std::string& url , bool force_open_externally)
{
@@ -64,7 +75,7 @@ static URLLoader sAlertURLLoader;
// static
void LLWeb::initClass()
{
- LLAlertDialog::setURLLoader(&sAlertURLLoader);
+ LLToastAlertPanel::setURLLoader(&sAlertURLLoader);
}
@@ -122,3 +133,54 @@ std::string LLWeb::escapeURL(const std::string& url)
}
return escaped_url;
}
+
+//static
+std::string LLWeb::expandURLSubstitutions(const std::string &url,
+ const LLSD &default_subs)
+{
+ LLSD substitution = default_subs;
+ substitution["VERSION"] = LLVersionInfo::getVersion();
+ substitution["VERSION_MAJOR"] = LLVersionInfo::getMajor();
+ substitution["VERSION_MINOR"] = LLVersionInfo::getMinor();
+ substitution["VERSION_PATCH"] = LLVersionInfo::getPatch();
+ substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
+ substitution["CHANNEL"] = LLVersionInfo::getChannel();
+ substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel();
+ substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ substitution["SESSION_ID"] = gAgent.getSessionID();
+ substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
+
+ // work out the current language
+ std::string lang = LLUI::getLanguage();
+ if (lang == "en-us")
+ {
+ // *HACK: the correct fix is to change English.lproj/language.txt,
+ // but we're late in the release cycle and this is a less risky fix
+ lang = "en";
+ }
+ substitution["LANGUAGE"] = lang;
+
+ // find the region ID
+ LLUUID region_id;
+ LLViewerRegion *region = gAgent.getRegion();
+ if (region)
+ {
+ region_id = region->getRegionID();
+ }
+ substitution["REGION_ID"] = region_id;
+
+ // find the parcel local ID
+ S32 parcel_id = 0;
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (parcel)
+ {
+ parcel_id = parcel->getLocalID();
+ }
+ substitution["PARCEL_ID"] = llformat("%d", parcel_id);
+
+ // expand all of the substitution strings and escape the url
+ std::string expanded_url = url;
+ LLStringUtil::format(expanded_url, substitution);
+
+ return LLWeb::escapeURL(expanded_url);
+}
diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h
index 96a53db2ca..f4666c9280 100644
--- a/indra/newview/llweb.h
+++ b/indra/newview/llweb.h
@@ -57,8 +57,11 @@ public:
/// Load the given url in the operating system's web browser
static void loadURLExternal(const std::string& url);
- // Returns escaped url (eg, " " to "%20") - used by all loadURL methods
+ /// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
static std::string escapeURL(const std::string& url);
+ /// Expands various strings like [LANG], [VERSION], etc. in a URL
+ static std::string expandURLSubstitutions(const std::string &url,
+ const LLSD &default_subs);
};
#endif
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index 7f0c1a13f3..000d50795f 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -33,11 +33,13 @@
#include "llviewerprecompiledheaders.h"
#include "llwldaycycle.h"
+
+#include "llnotificationsutil.h"
#include "llsdserialize.h"
-#include "llwlparammanager.h"
-#include "llnotifications.h"
#include "llxmlnode.h"
+#include "llwlparammanager.h"
+
#include <map>
LLWLDayCycle::LLWLDayCycle() : mDayRate(120)
@@ -85,7 +87,7 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName)
// alert the user
LLSD args;
args["SKY"] = day_data[i][1].asString();
- LLNotifications::instance().add("WLMissingSky", args);
+ LLNotificationsUtil::add("WLMissingSky", args);
continue;
}
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index 1581153c19..7cac564619 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -42,17 +42,12 @@
#include "llspinctrl.h"
#include "llcheckboxctrl.h"
#include "lluictrlfactory.h"
-#include "llviewercamera.h"
#include "llcombobox.h"
#include "lllineeditor.h"
#include "llsdserialize.h"
#include "v4math.h"
-#include "llviewerdisplay.h"
#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "lldrawpoolwater.h"
-#include "llviewerregion.h"
#include "llwlparamset.h"
#include "llpostprocess.h"
@@ -109,7 +104,7 @@ LLWLParamManager::~LLWLParamManager()
void LLWLParamManager::loadPresets(const std::string& file_name)
{
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
bool found = true;
while(found)
@@ -135,7 +130,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
// And repeat for user presets, note the user presets will modify any system presets already loaded
std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
found = true;
while(found)
@@ -196,7 +191,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
escaped_filename += ".xml";
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
- llinfos << "Loading WindLight sky setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL;
llifstream presetsXML;
presetsXML.open(pathName.c_str());
@@ -205,7 +200,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
if(!presetsXML)
{
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
- llinfos << "Loading User WindLight sky setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL;
presetsXML.clear();
presetsXML.open(pathName.c_str());
}
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 5c6fc2cf21..118d7f8d08 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -118,6 +118,7 @@ LLWorld::LLWorld() :
void LLWorld::destroyClass()
{
+ mHoleWaterObjects.clear();
gObjectList.destroy();
for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); )
{
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index 829d631473..66cb02ce99 100644
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -34,58 +34,81 @@
#include "llworldmap.h"
-#include "llregionhandle.h"
+#include "llworldmapmessage.h"
#include "message.h"
-
-#include "llappviewer.h" // for gPacificDaylightTime
-#include "llagent.h"
-#include "llmapresponders.h"
-#include "llviewercontrol.h"
-#include "llfloaterworldmap.h"
#include "lltracker.h"
#include "llviewertexturelist.h"
-#include "llviewerregion.h"
-#include "llregionflags.h"
#include "lltrans.h"
-const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // 10 minutes
+// Timers to temporise database requests
+const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region
+const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // Seconds before we consider re-requesting item data for the grid
+
+//---------------------------------------------------------------------------
+// LLItemInfo
+//---------------------------------------------------------------------------
-// For DEV-17507, do lazy image loading in llworldmapview.cpp instead,
-// limiting requests to currently visible regions and minimizing the
-// number of textures being requested simultaneously.
-//
-// Uncomment IMMEDIATE_IMAGE_LOAD to restore the old behavior
-//
-//#define IMMEDIATE_IMAGE_LOAD
LLItemInfo::LLItemInfo(F32 global_x, F32 global_y,
const std::string& name,
- LLUUID id,
- S32 extra, S32 extra2)
+ LLUUID id)
: mName(name),
mToolTip(""),
mPosGlobal(global_x, global_y, 40.0),
mID(id),
- mSelected(FALSE),
- mExtra(extra),
- mExtra2(extra2)
+ mCount(1)
+// mSelected(false)
+// mColor()
{
- mRegionHandle = to_region_handle(mPosGlobal);
}
-LLSimInfo::LLSimInfo()
-: mHandle(0),
+//---------------------------------------------------------------------------
+// LLSimInfo
+//---------------------------------------------------------------------------
+
+LLSimInfo::LLSimInfo(U64 handle)
+: mHandle(handle),
mName(),
mAgentsUpdateTime(0),
- mShowAgentLocations(FALSE),
mAccess(0x0),
mRegionFlags(0x0),
- mWaterHeight(0.f),
- mAlpha(-1.f)
+ mFirstAgentRequest(true)
+// mWaterHeight(0.f)
+{
+}
+
+void LLSimInfo::setLandForSaleImage (LLUUID image_id)
{
+ mMapImageID = image_id;
+
+ // Fetch the image
+ if (mMapImageID.notNull())
+ {
+ mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE);
+ mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+ else
+ {
+ mOverlayImage = NULL;
+ }
}
+LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage ()
+{
+ if (mOverlayImage.isNull() && mMapImageID.notNull())
+ {
+ // Fetch the image if it hasn't been done yet (unlikely but...)
+ mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE);
+ mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+ if (!mOverlayImage.isNull())
+ {
+ // Boost the fetch level when we try to access that image
+ mOverlayImage->setBoostLevel(LLViewerTexture::BOOST_MAP);
+ }
+ return mOverlayImage;
+}
-LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const
+LLVector3d LLSimInfo::getGlobalPos(const LLVector3& local_pos) const
{
LLVector3d pos = from_region_handle(mHandle);
pos.mdV[VX] += local_pos.mV[VX];
@@ -94,128 +117,184 @@ LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const
return pos;
}
+LLVector3d LLSimInfo::getGlobalOrigin() const
+{
+ return from_region_handle(mHandle);
+}
LLVector3 LLSimInfo::getLocalPos(LLVector3d global_pos) const
{
LLVector3d sim_origin = from_region_handle(mHandle);
return LLVector3(global_pos - sim_origin);
}
+void LLSimInfo::clearImage()
+{
+ if (!mOverlayImage.isNull())
+ {
+ mOverlayImage->setBoostLevel(0);
+ mOverlayImage = NULL;
+ }
+}
-
-//---------------------------------------------------------------------------
-// World Map
-//---------------------------------------------------------------------------
-
-LLWorldMap::LLWorldMap() :
- mIsTrackingUnknownLocation( FALSE ),
- mInvalidLocation( FALSE ),
- mIsTrackingDoubleClick( FALSE ),
- mIsTrackingCommit( FALSE ),
- mUnknownLocation( 0, 0, 0 ),
- mRequestLandForSale(true),
- mCurrentMap(0),
- mMinX(U32_MAX),
- mMaxX(U32_MIN),
- mMinY(U32_MAX),
- mMaxY(U32_MIN),
- mNeighborMap(NULL),
- mTelehubCoverageMap(NULL),
- mNeighborMapWidth(0),
- mNeighborMapHeight(0),
- mSLURLRegionName(),
- mSLURLRegionHandle(0),
- mSLURL(),
- mSLURLCallback(0),
- mSLURLTeleport(false)
-{
- for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map)
+void LLSimInfo::dropImagePriority()
+{
+ if (!mOverlayImage.isNull())
{
- mMapLoaded[map] = FALSE;
- mMapBlockLoaded[map] = new BOOL[MAP_BLOCK_RES*MAP_BLOCK_RES];
- for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx)
- {
- mMapBlockLoaded[map][idx] = FALSE;
- }
+ mOverlayImage->setBoostLevel(0);
}
}
+// Update the agent count for that region
+void LLSimInfo::updateAgentCount(F64 time)
+{
+ if ((time - mAgentsUpdateTime > AGENTS_UPDATE_TIMER) || mFirstAgentRequest)
+ {
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, mHandle);
+ mAgentsUpdateTime = time;
+ mFirstAgentRequest = false;
+ }
+}
-LLWorldMap::~LLWorldMap()
+// Get the total agents count
+const S32 LLSimInfo::getAgentCount() const
{
- reset();
- for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map)
+ S32 total_agent_count = 0;
+ for (LLSimInfo::item_info_list_t::const_iterator it = mAgentLocations.begin(); it != mAgentLocations.end(); ++it)
{
- delete[] mMapBlockLoaded[map];
+ total_agent_count += it->getCount();
}
+ return total_agent_count;
}
+bool LLSimInfo::isName(const std::string& name) const
+{
+ return (LLStringUtil::compareInsensitive(name, mName) == 0);
+}
-void LLWorldMap::reset()
+void LLSimInfo::dump() const
{
- for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer());
- mSimInfoMap.clear();
+ U32 x_pos, y_pos;
+ from_region_handle(mHandle, &x_pos, &y_pos);
+
+ LL_INFOS("World Map") << x_pos << "," << y_pos
+ << " " << mName
+ << " " << (S32)mAccess
+ << " " << std::hex << mRegionFlags << std::dec
+// << " " << mWaterHeight
+ << LL_ENDL;
+}
+
+void LLSimInfo::clearItems()
+{
+ mTelehubs.clear();
+ mInfohubs.clear();
+ mPGEvents.clear();
+ mMatureEvents.clear();
+ mAdultEvents.clear();
+ mLandForSale.clear();
+ mLandForSaleAdult.clear();
+// We persist the agent count though as it is updated on a frequent basis
+// mAgentLocations.clear();
+}
+
+void LLSimInfo::insertAgentLocation(const LLItemInfo& item)
+{
+ std::string name = item.getName();
- for (S32 m=0; m<MAP_SIM_IMAGE_TYPES; ++m)
+ // Find the last item in the list with a different name and erase them
+ item_info_list_t::iterator lastiter;
+ for (lastiter = mAgentLocations.begin(); lastiter != mAgentLocations.end(); ++lastiter)
+ {
+ LLItemInfo& info = *lastiter;
+ if (info.isName(name))
+ {
+ break;
+ }
+ }
+ if (lastiter != mAgentLocations.begin())
{
- mMapLoaded[m] = FALSE;
+ mAgentLocations.erase(mAgentLocations.begin(), lastiter);
}
+ // Now append the new location
+ mAgentLocations.push_back(item);
+}
+
+//---------------------------------------------------------------------------
+// World Map
+//---------------------------------------------------------------------------
+
+LLWorldMap::LLWorldMap() :
+ mIsTrackingLocation( false ),
+ mIsTrackingFound( false ),
+ mIsInvalidLocation( false ),
+ mIsTrackingDoubleClick( false ),
+ mIsTrackingCommit( false ),
+ mTrackingLocation( 0, 0, 0 ),
+ mFirstRequest(true)
+{
+ //LL_INFOS("World Map") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL;
+ mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES];
clearSimFlags();
-
- eraseItems();
+}
- mMinX = U32_MAX;
- mMaxX = U32_MIN;
- mMinY = U32_MAX;
- mMaxY = U32_MIN;
+LLWorldMap::~LLWorldMap()
+{
+ //LL_INFOS("World Map") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL;
+ reset();
+ delete[] mMapBlockLoaded;
+}
- delete [] mNeighborMap;
- mNeighborMap = NULL;
- delete [] mTelehubCoverageMap;
- mTelehubCoverageMap = NULL;
- mNeighborMapWidth = 0;
- mNeighborMapHeight = 0;
+void LLWorldMap::reset()
+{
+ clearItems(true); // Clear the items lists
+ clearImageRefs(); // Clear the world mipmap and the land for sale tiles
+ clearSimFlags(); // Clear the block info flags array
- for (S32 i=0; i<MAP_SIM_IMAGE_TYPES; i++)
- {
- mMapLayers[i].clear();
- }
+ // Finally, clear the region map itself
+ for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer());
+ mSimInfoMap.clear();
}
-void LLWorldMap::eraseItems()
+// Returns true if the items have been cleared
+bool LLWorldMap::clearItems(bool force)
{
- if (mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER)
+ bool clear = false;
+ if ((mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER) || mFirstRequest || force)
{
mRequestTimer.reset();
- mTelehubs.clear();
- mInfohubs.clear();
- mPGEvents.clear();
- mMatureEvents.clear();
- mAdultEvents.clear();
- mLandForSale.clear();
+ LLSimInfo* sim_info = NULL;
+ for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
+ {
+ sim_info = it->second;
+ if (sim_info)
+ {
+ sim_info->clearItems();
+ }
+ }
+ clear = true;
+ mFirstRequest = false;
}
-// mAgentLocationsMap.clear(); // persists
-// mNumAgents.clear(); // persists
+ return clear;
}
-
void LLWorldMap::clearImageRefs()
{
+ // We clear the reference to the images we're holding.
+ // Images hold by the world mipmap first
+ mWorldMipmap.reset();
+
+ // Images hold by the region map
+ LLSimInfo* sim_info = NULL;
for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
{
- LLSimInfo* info = (*it).second;
- if (info->mCurrentImage)
- {
- info->mCurrentImage->setBoostLevel(0);
- info->mCurrentImage = NULL;
- }
- if (info->mOverlayImage)
+ sim_info = it->second;
+ if (sim_info)
{
- info->mOverlayImage->setBoostLevel(0);
- info->mOverlayImage = NULL;
+ sim_info->clearImage();
}
}
}
@@ -223,15 +302,25 @@ void LLWorldMap::clearImageRefs()
// Doesn't clear the already-loaded sim infos, just re-requests them
void LLWorldMap::clearSimFlags()
{
- for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map)
+ for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx)
{
- for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx)
- {
- mMapBlockLoaded[map][idx] = FALSE;
- }
+ mMapBlockLoaded[idx] = false;
}
}
+LLSimInfo* LLWorldMap::createSimInfoFromHandle(const U64 handle)
+{
+ LLSimInfo* sim_info = new LLSimInfo(handle);
+ mSimInfoMap[handle] = sim_info;
+ return sim_info;
+}
+
+void LLWorldMap::equalizeBoostLevels()
+{
+ mWorldMipmap.equalizeBoostLevels();
+ return;
+}
+
LLSimInfo* LLWorldMap::simInfoFromPosGlobal(const LLVector3d& pos_global)
{
U64 handle = to_region_handle(pos_global);
@@ -243,11 +332,7 @@ LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle)
sim_info_map_t::iterator it = mSimInfoMap.find(handle);
if (it != mSimInfoMap.end())
{
- LLSimInfo* sim_info = (*it).second;
- if (sim_info)
- {
- return sim_info;
- }
+ return it->second;
}
return NULL;
}
@@ -258,762 +343,273 @@ LLSimInfo* LLWorldMap::simInfoFromName(const std::string& sim_name)
LLSimInfo* sim_info = NULL;
if (!sim_name.empty())
{
- for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
+ // Iterate through the entire sim info map and compare the name
+ sim_info_map_t::iterator it;
+ for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
{
- sim_info = (*it).second;
- if (sim_info
- && (0 == LLStringUtil::compareInsensitive(sim_name, sim_info->mName)) )
+ sim_info = it->second;
+ if (sim_info && sim_info->isName(sim_name) )
{
+ // break out of loop if success
break;
}
- sim_info = NULL;
}
+ // If we got to the end, we haven't found the sim. Reset the ouput value to NULL.
+ if (it == mSimInfoMap.end())
+ sim_info = NULL;
}
return sim_info;
}
bool LLWorldMap::simNameFromPosGlobal(const LLVector3d& pos_global, std::string & outSimName )
{
- bool gotSimName = true;
+ LLSimInfo* sim_info = simInfoFromPosGlobal(pos_global);
- U64 handle = to_region_handle(pos_global);
-
- sim_info_map_t::iterator it = mSimInfoMap.find(handle);
- if (it != mSimInfoMap.end())
+ if (sim_info)
{
- LLSimInfo* info = (*it).second;
- outSimName = info->mName;
+ outSimName = sim_info->getName();
}
else
{
- gotSimName = false;
outSimName = "(unknown region)";
}
- return gotSimName;
+ return (sim_info != NULL);
}
-void LLWorldMap::setCurrentLayer(S32 layer, bool request_layer)
+void LLWorldMap::reloadItems(bool force)
{
- mCurrentMap = layer;
- if (!mMapLoaded[layer] || request_layer)
+ //LL_INFOS("World Map") << "LLWorldMap::reloadItems()" << LL_ENDL;
+ if (clearItems(force))
{
- sendMapLayerRequest();
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_PG_EVENT);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE);
}
-
- if (mTelehubs.size() == 0 ||
- mInfohubs.size() == 0)
- {
- // Request for telehubs
- sendItemRequest(MAP_ITEM_TELEHUB);
- }
-
- if (mPGEvents.size() == 0)
- {
- // Request for events
- sendItemRequest(MAP_ITEM_PG_EVENT);
- }
-
- if (mMatureEvents.size() == 0)
- {
- // Request for events (mature)
- sendItemRequest(MAP_ITEM_MATURE_EVENT);
- }
-
- if (mAdultEvents.size() == 0)
- {
- // Request for events (adult)
- sendItemRequest(MAP_ITEM_ADULT_EVENT);
- }
-
- if (mLandForSale.size() == 0)
- {
- // Request for Land For Sale
- sendItemRequest(MAP_ITEM_LAND_FOR_SALE);
- }
-
- if (mLandForSaleAdult.size() == 0)
- {
- // Request for Land For Sale
- sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT);
- }
-
- clearImageRefs();
- clearSimFlags();
}
-void LLWorldMap::sendItemRequest(U32 type, U64 handle)
-{
- LLMessageSystem* msg = gMessageSystem;
- S32 layer = mCurrentMap;
-
- msg->newMessageFast(_PREHASH_MapItemRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addU32Fast(_PREHASH_Flags, layer);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
-
- msg->nextBlockFast(_PREHASH_RequestData);
- msg->addU32Fast(_PREHASH_ItemType, type);
- msg->addU64Fast(_PREHASH_RegionHandle, handle); // If zero, filled in on sim
-
- gAgent.sendReliableMessage();
-}
-// public
-void LLWorldMap::sendMapLayerRequest()
+// static public
+// Insert a region in the region map
+// returns true if region inserted, false otherwise
+bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U32 region_flags)
{
- if (!gAgent.getRegion()) return;
-
- LLSD body;
- body["Flags"] = mCurrentMap;
- std::string url = gAgent.getRegion()->getCapability(
- gAgent.isGodlike() ? "MapLayerGod" : "MapLayer");
-
- if (!url.empty())
+ // This region doesn't exist
+ if (accesscode == 255)
{
- llinfos << "LLWorldMap::sendMapLayerRequest via capability" << llendl;
- LLHTTPClient::post(url, body, new LLMapLayerResponder());
+ // Checks if the track point is in it and invalidates it if it is
+ if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS))
+ {
+ LLWorldMap::getInstance()->setTrackingInvalid();
+ }
+ // return failure to insert
+ return false;
}
else
{
- llinfos << "LLWorldMap::sendMapLayerRequest via message system" << llendl;
- LLMessageSystem* msg = gMessageSystem;
- S32 layer = mCurrentMap;
-
- // Request for layer
- msg->newMessageFast(_PREHASH_MapLayerRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addU32Fast(_PREHASH_Flags, layer);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
- gAgent.sendReliableMessage();
-
- if (mRequestLandForSale)
+ U64 handle = to_region_handle(x_world, y_world);
+ //LL_INFOS("World Map") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL;
+ // Insert the region in the region map of the world map
+ // Loading the LLSimInfo object with what we got and insert it in the map
+ LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
+ if (siminfo == NULL)
{
- msg->newMessageFast(_PREHASH_MapLayerRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addU32Fast(_PREHASH_Flags, 2);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
- gAgent.sendReliableMessage();
+ siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle);
}
+ siminfo->setName(name);
+ siminfo->setAccess(accesscode);
+ siminfo->setRegionFlags(region_flags);
+ // siminfo->setWaterHeight((F32) water_height);
+ siminfo->setLandForSaleImage(image_id);
+
+ // Handle the location tracking (for teleport, UI feedback and info display)
+ if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS))
+ {
+ if (siminfo->isDown())
+ {
+ // We were tracking this location, but it's no available
+ LLWorldMap::getInstance()->setTrackingInvalid();
+ }
+ else
+ {
+ // We were tracking this location, and it does exist and is available
+ LLWorldMap::getInstance()->setTrackingValid();
+ }
+ }
+ // return insert region success
+ return true;
}
}
-// public
-void LLWorldMap::sendNamedRegionRequest(std::string region_name)
-{
- LLMessageSystem* msg = gMessageSystem;
- S32 layer = mCurrentMap;
-
- // Request for layer
- msg->newMessageFast(_PREHASH_MapNameRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addU32Fast(_PREHASH_Flags, layer);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
- msg->nextBlockFast(_PREHASH_NameData);
- msg->addStringFast(_PREHASH_Name, region_name);
- gAgent.sendReliableMessage();
-}
-// public
-void LLWorldMap::sendNamedRegionRequest(std::string region_name,
- url_callback_t callback,
- const std::string& callback_url,
- bool teleport) // immediately teleport when result returned
-{
- mSLURLRegionName = region_name;
- mSLURLRegionHandle = 0;
- mSLURL = callback_url;
- mSLURLCallback = callback;
- mSLURLTeleport = teleport;
-
- sendNamedRegionRequest(region_name);
-}
-
-void LLWorldMap::sendHandleRegionRequest(U64 region_handle,
- url_callback_t callback,
- const std::string& callback_url,
- bool teleport) // immediately teleport when result returned
-{
- mSLURLRegionName.clear();
- mSLURLRegionHandle = region_handle;
- mSLURL = callback_url;
- mSLURLCallback = callback;
- mSLURLTeleport = teleport;
-
- U32 global_x;
- U32 global_y;
- from_region_handle(region_handle, &global_x, &global_y);
- U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS);
- U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS);
-
- sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true);
-}
-
-// public
-void LLWorldMap::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
-{
- S32 layer = mCurrentMap;
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_MapBlockRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- U32 flags = layer;
- flags |= (return_nonexistent ? 0x10000 : 0);
- msg->addU32Fast(_PREHASH_Flags, flags);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
- msg->nextBlockFast(_PREHASH_PositionData);
- msg->addU16Fast(_PREHASH_MinX, min_x);
- msg->addU16Fast(_PREHASH_MinY, min_y);
- msg->addU16Fast(_PREHASH_MaxX, max_x);
- msg->addU16Fast(_PREHASH_MaxY, max_y);
- gAgent.sendReliableMessage();
-
- if (mRequestLandForSale)
- {
- msg->newMessageFast(_PREHASH_MapBlockRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addU32Fast(_PREHASH_Flags, 2);
- msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
- msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
- msg->nextBlockFast(_PREHASH_PositionData);
- msg->addU16Fast(_PREHASH_MinX, min_x);
- msg->addU16Fast(_PREHASH_MinY, min_y);
- msg->addU16Fast(_PREHASH_MaxX, max_x);
- msg->addU16Fast(_PREHASH_MaxY, max_y);
- gAgent.sendReliableMessage();
- }
-}
-
-// public static
-void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
+// static public
+// Insert an item in the relevant region map
+// returns true if item inserted, false otherwise
+bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2)
{
- llinfos << "LLWorldMap::processMapLayerReply from message system" << llendl;
-
- U32 agent_flags;
- msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
-
- if (agent_flags != (U32)LLWorldMap::getInstance()->mCurrentMap)
- {
- llwarns << "Invalid or out of date map image type returned!" << llendl;
- return;
- }
+ // Create an item record for the received object
+ LLItemInfo new_item((F32)x_world, (F32)y_world, name, uuid);
- LLUUID image_id;
- //U32 left, right, top, bottom;
+ // Compute a region handle based on the objects coordinates
+ LLVector3d pos((F32)x_world, (F32)y_world, 40.0);
+ U64 handle = to_region_handle(pos);
- S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_LayerData);
-
- LLWorldMap::getInstance()->mMapLayers[agent_flags].clear();
-
- BOOL adjust = FALSE;
- for (S32 block=0; block<num_blocks; ++block)
+ // Get the region record for that handle or NULL if we haven't browsed it yet
+ LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
+ if (siminfo == NULL)
{
- LLWorldMapLayer new_layer;
- new_layer.LayerDefined = TRUE;
- msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block);
- new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
-
- gGL.getTexUnit(0)->bind(new_layer.LayerImage);
- new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
-
- U32 left, right, top, bottom;
- msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Left, left, block);
- msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Right, right, block);
- msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Top, top, block);
- msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Bottom, bottom, block);
-
- new_layer.LayerExtents.mLeft = left;
- new_layer.LayerExtents.mRight = right;
- new_layer.LayerExtents.mBottom = bottom;
- new_layer.LayerExtents.mTop = top;
-
- F32 x_meters = F32(left*REGION_WIDTH_UNITS);
- F32 y_meters = F32(bottom*REGION_WIDTH_UNITS);
- adjust = LLWorldMap::getInstance()->extendAABB(U32(x_meters), U32(y_meters),
- U32(x_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getWidth()),
- U32(y_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getHeight())) || adjust;
-
- LLWorldMap::getInstance()->mMapLayers[agent_flags].push_back(new_layer);
+ siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle);
}
- LLWorldMap::getInstance()->mMapLoaded[agent_flags] = TRUE;
- if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
-}
-
-// public static
-void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
-{
- U32 agent_flags;
- msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
-
- if ((S32)agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES)
+ //LL_INFOS("World Map") << "Process item : type = " << type << LL_ENDL;
+ switch (type)
{
- llwarns << "Invalid map image type returned! " << agent_flags << llendl;
- return;
- }
-
- S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
-
- bool found_null_sim = false;
-
- BOOL adjust = FALSE;
- for (S32 block=0; block<num_blocks; ++block)
- {
- U16 x_regions;
- U16 y_regions;
- std::string name;
- U8 accesscode;
- U32 region_flags;
- U8 water_height;
- U8 agents;
- LLUUID image_id;
- msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block);
- msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block);
- msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
- msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block);
- msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block);
- msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block);
- msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block);
- msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block);
-
- U32 x_meters = x_regions * REGION_WIDTH_UNITS;
- U32 y_meters = y_regions * REGION_WIDTH_UNITS;
-
- U64 handle = to_region_handle(x_meters, y_meters);
-
- if (accesscode == 255)
- {
- // This region doesn't exist
- if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
- {
- // We were tracking this location, but it doesn't exist
- LLWorldMap::getInstance()->mInvalidLocation = TRUE;
- }
-
- found_null_sim = true;
- }
- else
+ case MAP_ITEM_TELEHUB: // telehubs
{
- adjust = LLWorldMap::getInstance()->extendAABB(x_meters,
- y_meters,
- x_meters+REGION_WIDTH_UNITS,
- y_meters+REGION_WIDTH_UNITS) || adjust;
-
-// llinfos << "Map sim " << name << " image layer " << agent_flags << " ID " << image_id.getString() << llendl;
-
- LLSimInfo* siminfo = new LLSimInfo();
- sim_info_map_t::iterator iter = LLWorldMap::getInstance()->mSimInfoMap.find(handle);
- if (iter != LLWorldMap::getInstance()->mSimInfoMap.end())
- {
- LLSimInfo* oldinfo = iter->second;
- for (S32 image=0; image<MAP_SIM_IMAGE_TYPES; ++image)
- {
- siminfo->mMapImageID[image] = oldinfo->mMapImageID[image];
- }
- delete oldinfo;
- }
- LLWorldMap::getInstance()->mSimInfoMap[handle] = siminfo;
-
- siminfo->mHandle = handle;
- siminfo->mName.assign( name );
- siminfo->mAccess = accesscode;
- siminfo->mRegionFlags = region_flags;
- siminfo->mWaterHeight = (F32) water_height;
- siminfo->mMapImageID[agent_flags] = image_id;
-
-#ifdef IMMEDIATE_IMAGE_LOAD
- siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
- siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
-#endif
+ /* Merov: we are not using the hub color anymore for display so commenting that out
+ // Telehub color
+ U32 X = x_world / REGION_WIDTH_UNITS;
+ U32 Y = y_world / REGION_WIDTH_UNITS;
+ F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f;
+ F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f;
+ F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f;
+ F32 add_amt = (X % 2) ? 0.15f : -0.15f;
+ add_amt += (Y % 2) ? -0.15f : 0.15f;
+ LLColor4 color(red + add_amt, green + add_amt, blue + add_amt);
+ new_item.setColor(color);
+ */
- if (siminfo->mMapImageID[2].notNull())
+ // extra2 specifies whether this is an infohub or a telehub.
+ if (extra2)
{
-#ifdef IMMEDIATE_IMAGE_LOAD
- siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
-#endif
+ siminfo->insertInfoHub(new_item);
}
else
{
- siminfo->mOverlayImage = NULL;
- }
-
- if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
- LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
- {
- if (siminfo->mAccess == SIM_ACCESS_DOWN)
- {
- // We were tracking this location, but it doesn't exist
- LLWorldMap::getInstance()->mInvalidLocation = true;
- }
- else
- {
- // We were tracking this location, and it does exist
- bool is_tracking_dbl = LLWorldMap::getInstance()->mIsTrackingDoubleClick == TRUE;
- gFloaterWorldMap->trackLocation(LLWorldMap::getInstance()->mUnknownLocation);
- if (is_tracking_dbl)
- {
- LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
- gAgent.teleportViaLocation( pos_global );
- }
- }
+ siminfo->insertTeleHub(new_item);
}
+ break;
}
-
- if(LLWorldMap::getInstance()->mSLURLCallback != NULL)
+ case MAP_ITEM_PG_EVENT: // events
+ case MAP_ITEM_MATURE_EVENT:
+ case MAP_ITEM_ADULT_EVENT:
{
- // Server returns definitive capitalization, SLURL might not have that.
- if ((LLStringUtil::compareInsensitive(LLWorldMap::getInstance()->mSLURLRegionName, name)==0)
- || (LLWorldMap::getInstance()->mSLURLRegionHandle == handle))
+ std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:["
+ +LLTrans::getString ("TimeMin")+"] ["
+ +LLTrans::getString ("TimeAMPM")+"]";
+ LLSD substitution;
+ substitution["datetime"] = (S32) extra;
+ LLStringUtil::format (timeStr, substitution);
+ new_item.setTooltip(timeStr);
+
+ // HACK: store Z in extra2
+ new_item.setElevation((F64)extra2);
+ if (type == MAP_ITEM_PG_EVENT)
{
- url_callback_t callback = LLWorldMap::getInstance()->mSLURLCallback;
-
- LLWorldMap::getInstance()->mSLURLCallback = NULL;
- LLWorldMap::getInstance()->mSLURLRegionName.clear();
- LLWorldMap::getInstance()->mSLURLRegionHandle = 0;
-
- callback(handle, LLWorldMap::getInstance()->mSLURL, image_id, LLWorldMap::getInstance()->mSLURLTeleport);
+ siminfo->insertPGEvent(new_item);
}
- }
- }
-
- if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
- gFloaterWorldMap->updateSims(found_null_sim);
-}
-
-// public static
-void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**)
-{
- U32 type;
- msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type);
-
- S32 num_blocks = msg->getNumberOfBlocks("Data");
-
- for (S32 block=0; block<num_blocks; ++block)
- {
- U32 X, Y;
- std::string name;
- S32 extra, extra2;
- LLUUID uuid;
- msg->getU32Fast(_PREHASH_Data, _PREHASH_X, X, block);
- msg->getU32Fast(_PREHASH_Data, _PREHASH_Y, Y, block);
- msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
- msg->getUUIDFast(_PREHASH_Data, _PREHASH_ID, uuid, block);
- msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra, extra, block);
- msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra2, extra2, block);
-
- F32 world_x = (F32)X;
- X /= REGION_WIDTH_UNITS;
- F32 world_y = (F32)Y;
- Y /= REGION_WIDTH_UNITS;
-
- LLItemInfo new_item(world_x, world_y, name, uuid, extra, extra2);
- LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(new_item.mRegionHandle);
-
- switch (type)
- {
- case MAP_ITEM_TELEHUB: // telehubs
+ else if (type == MAP_ITEM_MATURE_EVENT)
{
- // Telehub color, store in extra as 4 U8's
- U8 *color = (U8 *)&new_item.mExtra;
-
- F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f;
- F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f;
- F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f;
- F32 add_amt = (X % 2) ? 0.15f : -0.15f;
- add_amt += (Y % 2) ? -0.15f : 0.15f;
- color[0] = U8((red + add_amt) * 255);
- color[1] = U8((green + add_amt) * 255);
- color[2] = U8((blue + add_amt) * 255);
- color[3] = 255;
-
- // extra2 specifies whether this is an infohub or a telehub.
- if (extra2)
- {
- LLWorldMap::getInstance()->mInfohubs.push_back(new_item);
- }
- else
- {
- LLWorldMap::getInstance()->mTelehubs.push_back(new_item);
- }
-
- break;
+ siminfo->insertMatureEvent(new_item);
}
- case MAP_ITEM_PG_EVENT: // events
- case MAP_ITEM_MATURE_EVENT:
- case MAP_ITEM_ADULT_EVENT:
+ else if (type == MAP_ITEM_ADULT_EVENT)
{
- std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"] ["
- +LLTrans::getString ("TimeAMPM")+"]";
- LLSD substitution;
- substitution["datetime"] = (S32) extra;
- LLStringUtil::format (timeStr, substitution);
- new_item.mToolTip = timeStr;
-
- // HACK: store Z in extra2
- new_item.mPosGlobal.mdV[VZ] = (F64)extra2;
- if (type == MAP_ITEM_PG_EVENT)
- {
- LLWorldMap::getInstance()->mPGEvents.push_back(new_item);
- }
- else if (type == MAP_ITEM_MATURE_EVENT)
- {
- LLWorldMap::getInstance()->mMatureEvents.push_back(new_item);
- }
- else if (type == MAP_ITEM_ADULT_EVENT)
- {
- LLWorldMap::getInstance()->mAdultEvents.push_back(new_item);
- }
-
- break;
+ siminfo->insertAdultEvent(new_item);
}
- case MAP_ITEM_LAND_FOR_SALE: // land for sale
- case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale
+ break;
+ }
+ case MAP_ITEM_LAND_FOR_SALE: // land for sale
+ case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale
+ {
+ std::string tooltip = llformat("%d sq. m. L$%d", extra, extra2);
+ new_item.setTooltip(tooltip);
+ if (type == MAP_ITEM_LAND_FOR_SALE)
{
- new_item.mToolTip = llformat("%d sq. m. L$%d", new_item.mExtra, new_item.mExtra2);
- if (type == MAP_ITEM_LAND_FOR_SALE)
- {
- LLWorldMap::getInstance()->mLandForSale.push_back(new_item);
- }
- else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT)
- {
- LLWorldMap::getInstance()->mLandForSaleAdult.push_back(new_item);
- }
- break;
+ siminfo->insertLandForSale(new_item);
}
- case MAP_ITEM_CLASSIFIED: // classifieds
+ else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT)
{
- //DEPRECATED: no longer used
- break;
+ siminfo->insertLandForSaleAdult(new_item);
}
- case MAP_ITEM_AGENT_LOCATIONS: // agent locations
+ break;
+ }
+ case MAP_ITEM_CLASSIFIED: // classifieds
+ {
+ //DEPRECATED: no longer used
+ break;
+ }
+ case MAP_ITEM_AGENT_LOCATIONS: // agent locations
+ {
+// LL_INFOS("World Map") << "New Location " << new_item.mName << LL_ENDL;
+ if (extra > 0)
{
- if (!siminfo)
- {
- llinfos << "siminfo missing for " << new_item.mPosGlobal.mdV[0] << ", " << new_item.mPosGlobal.mdV[1] << llendl;
- break;
- }
-// llinfos << "New Location " << new_item.mName << llendl;
-
- item_info_list_t& agentcounts = LLWorldMap::getInstance()->mAgentLocationsMap[new_item.mRegionHandle];
-
- // Find the last item in the list with a different name and erase them
- item_info_list_t::iterator lastiter;
- for (lastiter = agentcounts.begin(); lastiter!=agentcounts.end(); ++lastiter)
- {
- const LLItemInfo& info = *lastiter;
- if (info.mName == new_item.mName)
- {
- break;
- }
- }
- if (lastiter != agentcounts.begin())
- {
- agentcounts.erase(agentcounts.begin(), lastiter);
- }
- // Now append the new location
- if (new_item.mExtra > 0)
- {
- agentcounts.push_back(new_item);
- }
- break;
+ new_item.setCount(extra);
+ siminfo->insertAgentLocation(new_item);
}
- default:
- break;
- };
- }
-}
-
-void LLWorldMap::dump()
-{
- for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
- {
- U64 handle = (*it).first;
- LLSimInfo* info = (*it).second;
-
- U32 x_pos, y_pos;
- from_region_handle(handle, &x_pos, &y_pos);
-
- llinfos << x_pos << "," << y_pos
- << " " << info->mName
- << " " << (S32)info->mAccess
- << " " << std::hex << info->mRegionFlags << std::dec
- << " " << info->mWaterHeight
- //<< " " << info->mTelehubName
- //<< " " << info->mTelehubPosition
- << llendl;
-
- if (info->mCurrentImage)
- {
- llinfos << "image discard " << (S32)info->mCurrentImage->getDiscardLevel()
- << " fullwidth " << info->mCurrentImage->getFullWidth()
- << " fullheight " << info->mCurrentImage->getFullHeight()
- << " maxvirt " << info->mCurrentImage->getMaxVirtualSize()
- //<< " maxdisc " << (S32)info->mCurrentImage->getMaxDiscardLevel()
- << llendl;
+ break;
}
+ default:
+ break;
}
+ return true;
}
-
-BOOL LLWorldMap::extendAABB(U32 min_x, U32 min_y, U32 max_x, U32 max_y)
+bool LLWorldMap::isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1)
{
- BOOL rv = FALSE;
- if (min_x < mMinX)
- {
- rv = TRUE;
- mMinX = min_x;
- }
- if (min_y < mMinY)
- {
- rv = TRUE;
- mMinY = min_y;
- }
- if (max_x > mMaxX)
- {
- rv = TRUE;
- mMaxX = max_x;
- }
- if (max_y > mMaxY)
- {
- rv = TRUE;
- mMaxY = max_y;
- }
- lldebugs << "World map aabb: (" << mMinX << ", " << mMinY << "), ("
- << mMaxX << ", " << mMaxY << ")" << llendl;
- return rv;
+ if (!mIsTrackingLocation)
+ return false;
+ return ((mTrackingLocation[0] >= x0) && (mTrackingLocation[0] < x1) && (mTrackingLocation[1] >= y0) && (mTrackingLocation[1] < y1));
}
-
-U32 LLWorldMap::getWorldWidth() const
+// Drop priority of all images being fetched by the map
+void LLWorldMap::dropImagePriorities()
{
- return mMaxX - mMinX;
-}
-
-
-U32 LLWorldMap::getWorldHeight() const
-{
- return mMaxY - mMinY;
-}
-
-BOOL LLWorldMap::coveredByTelehub(LLSimInfo* infop)
-{
- /*if (!mTelehubCoverageMap)
+ // Drop the download of tiles priority to nil
+ mWorldMipmap.dropBoostLevels();
+ // Same for the "land for sale" tiles per region
+ for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
{
- return FALSE;
+ LLSimInfo* info = it->second;
+ info->dropImagePriority();
}
- U32 x_pos, y_pos;
- from_region_handle(infop->mHandle, &x_pos, &y_pos);
- x_pos /= REGION_WIDTH_UNITS;
- y_pos /= REGION_WIDTH_UNITS;
-
- S32 index = x_pos - (mMinX / REGION_WIDTH_UNITS - 1) + (mNeighborMapWidth * (y_pos - (mMinY / REGION_WIDTH_UNITS - 1)));
- return mTelehubCoverageMap[index] != 0; */
- return FALSE;
}
-void LLWorldMap::updateTelehubCoverage()
+// Load all regions in a given rectangle (in region grid coordinates, i.e. world / 256 meters)
+void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1)
{
- /*S32 neighbor_width = getWorldWidth() / REGION_WIDTH_UNITS + 2;
- S32 neighbor_height = getWorldHeight() / REGION_WIDTH_UNITS + 2;
- if (neighbor_width > mNeighborMapWidth || neighbor_height > mNeighborMapHeight)
- {
- mNeighborMapWidth = neighbor_width;
- mNeighborMapHeight = neighbor_height;
- delete mNeighborMap;
- delete mTelehubCoverageMap;
-
- mNeighborMap = new U8[mNeighborMapWidth * mNeighborMapHeight];
- mTelehubCoverageMap = new U8[mNeighborMapWidth * mNeighborMapHeight];
- }
-
- memset(mNeighborMap, 0, mNeighborMapWidth * mNeighborMapHeight * sizeof(U8));
- memset(mTelehubCoverageMap, 0, mNeighborMapWidth * mNeighborMapHeight * sizeof(U8));
+ // Convert those boundaries to the corresponding (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) block coordinates
+ x0 = x0 / MAP_BLOCK_SIZE;
+ x1 = x1 / MAP_BLOCK_SIZE;
+ y0 = y0 / MAP_BLOCK_SIZE;
+ y1 = y1 / MAP_BLOCK_SIZE;
- // leave 1 sim border
- S32 min_x = (mMinX / REGION_WIDTH_UNITS) - 1;
- S32 min_y = (mMinY / REGION_WIDTH_UNITS) - 1;
-
- std::map<U64, LLSimInfo*>::const_iterator it;
- for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
+ // Load the region info those blocks
+ for (S32 block_x = llmax(x0, 0); block_x <= llmin(x1, MAP_BLOCK_RES-1); ++block_x)
{
- U64 handle = (*it).first;
- //LLSimInfo* info = (*it).second;
-
- U32 x_pos, y_pos;
- from_region_handle(handle, &x_pos, &y_pos);
- x_pos /= REGION_WIDTH_UNITS;
- y_pos /= REGION_WIDTH_UNITS;
- x_pos -= min_x;
- y_pos -= min_y;
-
- S32 index = x_pos + (mNeighborMapWidth * y_pos);
- mNeighborMap[index - 1]++;
- mNeighborMap[index + 1]++;
- mNeighborMap[index - mNeighborMapWidth]++;
- mNeighborMap[index + mNeighborMapWidth]++;
- }
-
- for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
- {
- U64 handle = (*it).first;
- LLSimInfo* info = (*it).second;
-
- U32 x_pos, y_pos;
- from_region_handle(handle, &x_pos, &y_pos);
- x_pos /= REGION_WIDTH_UNITS;
- y_pos /= REGION_WIDTH_UNITS;
- x_pos -= min_x;
- y_pos -= min_y;
-
- S32 index = x_pos + (mNeighborMapWidth * y_pos);
-
- if (!info->mTelehubName.empty() && mNeighborMap[index])
+ for (S32 block_y = llmax(y0, 0); block_y <= llmin(y1, MAP_BLOCK_RES-1); ++block_y)
{
- S32 x_start = llmax(0, S32(x_pos - 5));
- S32 x_span = llmin(mNeighborMapWidth - 1, (S32)(x_pos + 5)) - x_start + 1;
- S32 y_start = llmax(0, (S32)y_pos - 5);
- S32 y_end = llmin(mNeighborMapHeight - 1, (S32)(y_pos + 5));
- for (S32 y_index = y_start; y_index <= y_end; y_index++)
+ S32 offset = block_x | (block_y * MAP_BLOCK_RES);
+ if (!mMapBlockLoaded[offset])
{
- memset(&mTelehubCoverageMap[x_start + y_index * mNeighborMapWidth], 0xff, sizeof(U8) * x_span);
+ //LL_INFOS("World Map") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL;
+ LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1);
+ mMapBlockLoaded[offset] = true;
}
}
}
+}
- for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
+void LLWorldMap::dump()
+{
+ LL_INFOS("World Map") << "LLWorldMap::dump()" << LL_ENDL;
+ for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
{
- U64 handle = (*it).first;
- //LLSimInfo* info = (*it).second;
-
- U32 x_pos, y_pos;
- from_region_handle(handle, &x_pos, &y_pos);
- x_pos /= REGION_WIDTH_UNITS;
- y_pos /= REGION_WIDTH_UNITS;
-
- S32 index = x_pos - min_x + (mNeighborMapWidth * (y_pos - min_y));
- mTelehubCoverageMap[index] *= mNeighborMap[index];
- }*/
+ LLSimInfo* info = it->second;
+ if (info)
+ {
+ info->dump();
+ }
+ }
}
+
diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h
index 366de8f071..7e37727b86 100644
--- a/indra/newview/llworldmap.h
+++ b/indra/newview/llworldmap.h
@@ -33,203 +33,243 @@
#ifndef LL_LLWORLDMAP_H
#define LL_LLWORLDMAP_H
-#include <map>
-#include <string>
-#include <vector>
+#include "llworldmipmap.h"
#include <boost/function.hpp>
-#include "v3math.h"
#include "v3dmath.h"
-#include "llframetimer.h"
-#include "llmapimagetype.h"
#include "lluuid.h"
#include "llpointer.h"
#include "llsingleton.h"
+#include "llviewerregion.h"
#include "llviewertexture.h"
-#include "lleventinfo.h"
-#include "v3color.h"
-
-class LLMessageSystem;
-
+// Description of objects like hubs, events, land for sale, people and more (TBD).
+// Note: we don't store a "type" in there so we need to store instances of this class in
+// well known objects (i.e. list of objects which type is "well known").
class LLItemInfo
{
public:
- LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id, S32 extra = 0, S32 extra2 = 0);
-
- std::string mName;
- std::string mToolTip;
- LLVector3d mPosGlobal;
- LLUUID mID;
- BOOL mSelected;
- S32 mExtra;
- S32 mExtra2;
- U64 mRegionHandle;
-};
+ LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id);
+
+ // Setters
+ void setTooltip(std::string& tooltip) { mToolTip = tooltip; }
+ void setElevation(F64 z) { mPosGlobal.mdV[VZ] = z; }
+ void setCount(S32 count) { mCount = count; }
+// void setSelected(bool selected) { mSelected = selected; }
+// void setColor(LLColor4 color) { mColor = color; }
+
+ // Accessors
+ const LLVector3d& getGlobalPosition() const { return mPosGlobal; }
+ const std::string& getName() const { return mName; }
+ const std::string& getToolTip() const { return mToolTip; }
+ const LLUUID& getUUID() const { return mID; }
+ S32 getCount() const { return mCount; }
+
+ U64 getRegionHandle() const { return to_region_handle(mPosGlobal); } // Build the handle on the fly
-// Map layers, see indra_constants.h
-// 0 - Prim
-// 1 - Terrain Only
-// 2 - Overlay: Land For Sale
+ bool isName(const std::string& name) const { return (mName == name); } // True if name same as item's name
+// bool isSelected() const { return mSelected; }
+private:
+ std::string mName; // Name of the individual item
+ std::string mToolTip; // Tooltip : typically, something to be displayed to the user when selecting this item
+ LLVector3d mPosGlobal; // Global world position
+ LLUUID mID; // UUID of the item
+ S32 mCount; // Number of elements in item (e.g. people count)
+ // Currently not used but might prove useful one day so we comment out
+// bool mSelected; // Selected or not: updated by the viewer UI, not the simulator or asset DB
+// LLColor4 mColor; // Color of the item
+};
+
+// Info per region
+// Such records are stored in a global map hold by the LLWorldMap and indexed by region handles.
+// To avoid creating too many of them, they are requested in "blocks" corresponding to areas covered by the screen.
+// Unfortunately, when the screen covers the whole world (zoomed out), that can translate in requesting info for
+// every sim on the grid... Not good...
+// To avoid this, the code implements a cut-off threshold for overlay graphics and, therefore, all LLSimInfo.
+// In other words, when zooming out too much, we simply stop requesting LLSimInfo and
+// LLItemInfo and just display the map tiles.
+// As they are stored in different structures (LLSimInfo and LLWorldMipmap), this strategy is now workable.
class LLSimInfo
{
public:
- LLSimInfo();
+ LLSimInfo(U64 handle);
- LLVector3d getGlobalPos(LLVector3 local_pos) const;
+ // Convert local region coordinates into world coordinates
+ LLVector3d getGlobalPos(const LLVector3& local_pos) const;
+ // Get the world coordinates of the SW corner of that region
+ LLVector3d getGlobalOrigin() const;
LLVector3 getLocalPos(LLVector3d global_pos) const;
-public:
- U64 mHandle;
- std::string mName;
-
- F64 mAgentsUpdateTime;
- BOOL mShowAgentLocations; // are agents visible?
+ void clearImage(); // Clears the reference to the Land for sale image for that region
+ void dropImagePriority(); // Drops the boost level of the Land for sale image for that region
+ void updateAgentCount(F64 time); // Send an item request for agent count on that region if time's up
- U8 mAccess;
- U32 mRegionFlags;
- F32 mWaterHeight;
+ // Setters
+ void setName(std::string& name) { mName = name; }
+ void setAccess (U32 accesscode) { mAccess = accesscode; }
+ void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; }
+ void setLandForSaleImage (LLUUID image_id);
+// void setWaterHeight (F32 water_height) { mWaterHeight = water_height; }
- F32 mAlpha;
+ // Accessors
+ std::string getName() const { return mName; }
+ const std::string getFlagsString() const { return LLViewerRegion::regionFlagsToString(mRegionFlags); }
+ const std::string getAccessString() const { return LLViewerRegion::accessToString((U8)mAccess); }
- // Image ID for the current overlay mode.
- LLUUID mMapImageID[MAP_SIM_IMAGE_TYPES];
+ const S32 getAgentCount() const; // Compute the total agents count
+ LLPointer<LLViewerFetchedTexture> getLandForSaleImage(); // Get the overlay image, fetch it if necessary
- // Hold a reference to the currently displayed image.
- LLPointer<LLViewerFetchedTexture> mCurrentImage;
- LLPointer<LLViewerFetchedTexture> mOverlayImage;
-};
+ bool isName(const std::string& name) const;
+ bool isDown() { return (mAccess == SIM_ACCESS_DOWN); }
+ bool isPG() { return (mAccess <= SIM_ACCESS_PG); }
-#define MAP_BLOCK_RES 256
+ // Debug only
+ void dump() const; // Print the region info to the standard output
-struct LLWorldMapLayer
-{
- BOOL LayerDefined;
- LLPointer<LLViewerFetchedTexture> LayerImage;
- LLUUID LayerImageID;
- LLRect LayerExtents;
+ // Items lists handling
+ typedef std::vector<LLItemInfo> item_info_list_t;
+ void clearItems();
+
+ void insertTeleHub(const LLItemInfo& item) { mTelehubs.push_back(item); }
+ void insertInfoHub(const LLItemInfo& item) { mInfohubs.push_back(item); }
+ void insertPGEvent(const LLItemInfo& item) { mPGEvents.push_back(item); }
+ void insertMatureEvent(const LLItemInfo& item) { mMatureEvents.push_back(item); }
+ void insertAdultEvent(const LLItemInfo& item) { mAdultEvents.push_back(item); }
+ void insertLandForSale(const LLItemInfo& item) { mLandForSale.push_back(item); }
+ void insertLandForSaleAdult(const LLItemInfo& item) { mLandForSaleAdult.push_back(item); }
+ void insertAgentLocation(const LLItemInfo& item);
+
+ const LLSimInfo::item_info_list_t& getTeleHub() const { return mTelehubs; }
+ const LLSimInfo::item_info_list_t& getInfoHub() const { return mInfohubs; }
+ const LLSimInfo::item_info_list_t& getPGEvent() const { return mPGEvents; }
+ const LLSimInfo::item_info_list_t& getMatureEvent() const { return mMatureEvents; }
+ const LLSimInfo::item_info_list_t& getAdultEvent() const { return mAdultEvents; }
+ const LLSimInfo::item_info_list_t& getLandForSale() const { return mLandForSale; }
+ const LLSimInfo::item_info_list_t& getLandForSaleAdult() const { return mLandForSaleAdult; }
+ const LLSimInfo::item_info_list_t& getAgentLocation() const { return mAgentLocations; }
- LLWorldMapLayer() : LayerDefined(FALSE) { }
+private:
+ U64 mHandle; // This is a hash of the X and Y world coordinates of the SW corner of the sim
+ std::string mName; // Region name
+
+ F64 mAgentsUpdateTime; // Time stamp giving the last time the agents information was requested for that region
+ bool mFirstAgentRequest; // Init agent request flag
+
+ U32 mAccess; // Down/up and maturity rating of the region
+ U32 mRegionFlags; // Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage)
+ // Currently not used but might prove useful one day so we comment out
+// F32 mWaterHeight; // Water height on the region (not actively used)
+
+ // Handling the "land for sale / land for auction" overlay image
+ LLUUID mMapImageID; // Image ID of the overlay image
+ LLPointer<LLViewerFetchedTexture> mOverlayImage; // Reference to the overlay image
+
+ // Items for this region
+ // Those are data received through item requests (as opposed to block requests for the rest of the data)
+ item_info_list_t mTelehubs; // List of tele hubs in the region
+ item_info_list_t mInfohubs; // List of info hubs in the region
+ item_info_list_t mPGEvents; // List of PG events in the region
+ item_info_list_t mMatureEvents; // List of Mature events in the region
+ item_info_list_t mAdultEvents; // List of Adult events in the region (AO)
+ item_info_list_t mLandForSale; // List of Land for sales in the region
+ item_info_list_t mLandForSaleAdult; // List of Adult Land for sales in the region (AO)
+ item_info_list_t mAgentLocations; // List of agents in the region
};
+// We request region data on the world by "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions
+// This is to reduce the number of requests to the asset DB and get things in big "blocks"
+const S32 MAP_MAX_SIZE = 2048;
+const S32 MAP_BLOCK_SIZE = 4;
+const S32 MAP_BLOCK_RES = (MAP_MAX_SIZE / MAP_BLOCK_SIZE);
class LLWorldMap : public LLSingleton<LLWorldMap>
{
public:
- typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)>
- url_callback_t;
-
LLWorldMap();
~LLWorldMap();
- // clears the list
+ // Clear all: list of region info, tiles, blocks and items
void reset();
- // clear the visible items
- void eraseItems();
+ void clearImageRefs(); // Clears the image references
+ void dropImagePriorities(); // Drops the priority of the images being fetched
+ void reloadItems(bool force = false); // Reload the items (people, hub, etc...)
- // Removes references to cached images
- void clearImageRefs();
+ // Region Map access
+ typedef std::map<U64, LLSimInfo*> sim_info_map_t;
+ const LLWorldMap::sim_info_map_t& getRegionMap() const { return mSimInfoMap; }
+ void updateRegions(S32 x0, S32 y0, S32 x1, S32 y1); // Requests region info for a rectangle of regions (in grid coordinates)
- // Clears the flags indicating that we've received sim infos
- // Causes a re-request of the sim info without erasing extisting info
- void clearSimFlags();
+ // Insert a region and items in the map global instance
+ // Note: x_world and y_world in world coordinates (meters)
+ static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U32 region_flags);
+ static bool insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2);
- // Returns simulator information, or NULL if out of range
+ // Get info on sims (region) : note that those methods only search the range of loaded sims (the one that are being browsed)
+ // *not* the entire world. So a NULL return does not mean a down or unexisting region, just an out of range region.
LLSimInfo* simInfoFromHandle(const U64 handle);
-
- // Returns simulator information, or NULL if out of range
LLSimInfo* simInfoFromPosGlobal(const LLVector3d& pos_global);
-
- // Returns simulator information for named sim, or NULL if non-existent
LLSimInfo* simInfoFromName(const std::string& sim_name);
- // Gets simulator name for a global position, returns true if it was found
+ // Gets simulator name from a global position, returns true if found
bool simNameFromPosGlobal(const LLVector3d& pos_global, std::string& outSimName );
- // Sets the current layer
- void setCurrentLayer(S32 layer, bool request_layer = false);
-
- void sendMapLayerRequest();
- void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false);
- void sendNamedRegionRequest(std::string region_name);
- void sendNamedRegionRequest(std::string region_name,
- url_callback_t callback,
- const std::string& callback_url,
- bool teleport);
- void sendHandleRegionRequest(U64 region_handle,
- url_callback_t callback,
- const std::string& callback_url,
- bool teleport);
- void sendItemRequest(U32 type, U64 handle = 0);
-
- static void processMapLayerReply(LLMessageSystem*, void**);
- static void processMapBlockReply(LLMessageSystem*, void**);
- static void processMapItemReply(LLMessageSystem*, void**);
-
- void dump();
-
- // Extend the bounding box of the list of simulators. Returns true
- // if the extents changed.
- BOOL extendAABB(U32 x_min, U32 y_min, U32 x_max, U32 y_max);
-
- // build coverage maps for telehub region visualization
- void updateTelehubCoverage();
- BOOL coveredByTelehub(LLSimInfo* infop);
-
- // Bounds of the world, in meters
- U32 getWorldWidth() const;
- U32 getWorldHeight() const;
-public:
- // Map from region-handle to simulator info
- typedef std::map<U64, LLSimInfo*> sim_info_map_t;
- sim_info_map_t mSimInfoMap;
+ // Debug only
+ void dump(); // Print the world info to the standard output
- BOOL mIsTrackingUnknownLocation, mInvalidLocation, mIsTrackingDoubleClick, mIsTrackingCommit;
- LLVector3d mUnknownLocation;
+ // Track handling
+ void cancelTracking() { mIsTrackingLocation = false; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false; }
- bool mRequestLandForSale;
+ void setTracking(const LLVector3d& loc) { mIsTrackingLocation = true; mTrackingLocation = loc; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false;}
+ void setTrackingInvalid() { mIsTrackingFound = true; mIsInvalidLocation = true; }
+ void setTrackingValid() { mIsTrackingFound = true; mIsInvalidLocation = false; }
+ void setTrackingDoubleClick() { mIsTrackingDoubleClick = true; }
+ void setTrackingCommit() { mIsTrackingCommit = true; }
- typedef std::vector<LLItemInfo> item_info_list_t;
- item_info_list_t mTelehubs;
- item_info_list_t mInfohubs;
- item_info_list_t mPGEvents;
- item_info_list_t mMatureEvents;
- item_info_list_t mAdultEvents;
- item_info_list_t mLandForSale;
- item_info_list_t mLandForSaleAdult;
-
- std::map<U64,S32> mNumAgents;
-
- typedef std::map<U64, item_info_list_t> agent_list_map_t;
- agent_list_map_t mAgentLocationsMap;
-
- std::vector<LLWorldMapLayer> mMapLayers[MAP_SIM_IMAGE_TYPES];
- BOOL mMapLoaded[MAP_SIM_IMAGE_TYPES];
- BOOL * mMapBlockLoaded[MAP_SIM_IMAGE_TYPES];
- S32 mCurrentMap;
-
- // AABB of the list of simulators
- U32 mMinX;
- U32 mMaxX;
- U32 mMinY;
- U32 mMaxY;
-
- U8* mNeighborMap;
- U8* mTelehubCoverageMap;
- S32 mNeighborMapWidth;
- S32 mNeighborMapHeight;
+ bool isTracking() { return mIsTrackingLocation; }
+ bool isTrackingValidLocation() { return mIsTrackingFound && !mIsInvalidLocation; }
+ bool isTrackingInvalidLocation() { return mIsTrackingFound && mIsInvalidLocation; }
+ bool isTrackingDoubleClick() { return mIsTrackingDoubleClick; }
+ bool isTrackingCommit() { return mIsTrackingCommit; }
+ bool isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1);
+
+ LLVector3d getTrackedPositionGlobal() const { return mTrackingLocation; }
+
+ // World Mipmap delegation: currently used when drawing the mipmap
+ void equalizeBoostLevels();
+ LLPointer<LLViewerFetchedTexture> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true) { return mWorldMipmap.getObjectsTile(grid_x, grid_y, level, load); }
private:
- LLTimer mRequestTimer;
-
- // search for named region for url processing
- std::string mSLURLRegionName;
- U64 mSLURLRegionHandle;
- std::string mSLURL;
- url_callback_t mSLURLCallback;
- bool mSLURLTeleport;
+ bool clearItems(bool force = false); // Clears the item lists
+ void clearSimFlags(); // Clears the block flags indicating that we've already requested region infos
+
+ // Create a region record corresponding to the handle, insert it in the region map and returns a pointer
+ LLSimInfo* createSimInfoFromHandle(const U64 handle);
+
+ // Map from region-handle to region info
+ sim_info_map_t mSimInfoMap;
+
+ // Holds the tiled mipmap of the world. This is the structure that contains the images used for rendering.
+ LLWorldMipmap mWorldMipmap;
+
+ // The World is divided in "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions that get requested at once.
+ // This boolean table avoids "blocks" to be requested multiple times.
+ // Issue: Not sure this scheme is foolproof though as I've seen
+ // cases where a block is never retrieved and, because of this boolean being set, never re-requested
+ bool * mMapBlockLoaded; // Telling us if the block of regions has been requested or not
+
+ // Track location data : used while there's nothing tracked yet by LLTracker
+ bool mIsTrackingLocation; // True when we're tracking a point
+ bool mIsTrackingFound; // True when the tracking position has been found, valid or not
+ bool mIsInvalidLocation; // The region is down or the location does not correspond to an existing region
+ bool mIsTrackingDoubleClick; // User double clicked to set the location (i.e. teleport when found please...)
+ bool mIsTrackingCommit; // User used the search or landmark fields to set the location
+ LLVector3d mTrackingLocation; // World global position being tracked
+
+ // General grid items request timing flags (used for events,hubs and land for sale)
+ LLTimer mRequestTimer;
+ bool mFirstRequest;
};
#endif
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
new file mode 100644
index 0000000000..06040a574c
--- /dev/null
+++ b/indra/newview/llworldmapmessage.cpp
@@ -0,0 +1,262 @@
+/**
+ * @file llworldmapmessage.cpp
+ * @brief Handling of the messages to the DB made by and for the world map.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llworldmapmessage.h"
+#include "message.h"
+
+#include "llworldmap.h"
+#include "llagent.h"
+#include "llfloaterworldmap.h"
+
+const U32 LAYER_FLAG = 2;
+
+//---------------------------------------------------------------------------
+// World Map Message Handling
+//---------------------------------------------------------------------------
+
+LLWorldMapMessage::LLWorldMapMessage() :
+ mSLURLRegionName(),
+ mSLURLRegionHandle(0),
+ mSLURL(),
+ mSLURLCallback(0),
+ mSLURLTeleport(false)
+{
+}
+
+LLWorldMapMessage::~LLWorldMapMessage()
+{
+}
+
+void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle)
+{
+ //LL_INFOS("World Map") << "Send item request : type = " << type << LL_ENDL;
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_MapItemRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG);
+ msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
+ msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
+
+ msg->nextBlockFast(_PREHASH_RequestData);
+ msg->addU32Fast(_PREHASH_ItemType, type);
+ msg->addU64Fast(_PREHASH_RegionHandle, handle); // If zero, filled in on sim
+
+ gAgent.sendReliableMessage();
+}
+
+void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name)
+{
+ //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
+ LLMessageSystem* msg = gMessageSystem;
+
+ // Request for region data
+ msg->newMessageFast(_PREHASH_MapNameRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG);
+ msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
+ msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
+ msg->nextBlockFast(_PREHASH_NameData);
+ msg->addStringFast(_PREHASH_Name, region_name);
+ gAgent.sendReliableMessage();
+}
+
+void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name,
+ url_callback_t callback,
+ const std::string& callback_url,
+ bool teleport) // immediately teleport when result returned
+{
+ //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
+ mSLURLRegionName = region_name;
+ mSLURLRegionHandle = 0;
+ mSLURL = callback_url;
+ mSLURLCallback = callback;
+ mSLURLTeleport = teleport;
+
+ sendNamedRegionRequest(region_name);
+}
+
+void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle,
+ url_callback_t callback,
+ const std::string& callback_url,
+ bool teleport) // immediately teleport when result returned
+{
+ //LL_INFOS("World Map") << "LLWorldMap::sendHandleRegionRequest()" << LL_ENDL;
+ mSLURLRegionName.clear();
+ mSLURLRegionHandle = region_handle;
+ mSLURL = callback_url;
+ mSLURLCallback = callback;
+ mSLURLTeleport = teleport;
+
+ U32 global_x;
+ U32 global_y;
+ from_region_handle(region_handle, &global_x, &global_y);
+ U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS);
+ U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS);
+
+ sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true);
+}
+
+void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
+{
+ //LL_INFOS("World Map") << "LLWorldMap::sendMapBlockRequest()" << ", min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << "), nonexistent = " << return_nonexistent << LL_ENDL;
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MapBlockRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ U32 flags = LAYER_FLAG;
+ flags |= (return_nonexistent ? 0x10000 : 0);
+ msg->addU32Fast(_PREHASH_Flags, flags);
+ msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
+ msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
+ msg->nextBlockFast(_PREHASH_PositionData);
+ msg->addU16Fast(_PREHASH_MinX, min_x);
+ msg->addU16Fast(_PREHASH_MinY, min_y);
+ msg->addU16Fast(_PREHASH_MaxX, max_x);
+ msg->addU16Fast(_PREHASH_MaxY, max_y);
+ gAgent.sendReliableMessage();
+}
+
+// public static
+void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
+{
+ U32 agent_flags;
+ msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
+
+ // There's only one flag that we ever use here
+ if (agent_flags != LAYER_FLAG)
+ {
+ llwarns << "Invalid map image type returned! layer = " << agent_flags << llendl;
+ return;
+ }
+
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
+ //LL_INFOS("World Map") << "LLWorldMap::processMapBlockReply(), num_blocks = " << num_blocks << LL_ENDL;
+
+ bool found_null_sim = false;
+
+ for (S32 block=0; block<num_blocks; ++block)
+ {
+ U16 x_regions;
+ U16 y_regions;
+ std::string name;
+ U8 accesscode;
+ U32 region_flags;
+// U8 water_height;
+// U8 agents;
+ LLUUID image_id;
+ msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block);
+ msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block);
+ msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
+ msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block);
+ msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block);
+// msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block);
+// msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block);
+ msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block);
+
+ U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS;
+ U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS;
+
+ // Insert that region in the world map, if failure, flag it as a "null_sim"
+ if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags)))
+ {
+ found_null_sim = true;
+ }
+
+ // If we hit a valid tracking location, do what needs to be done app level wise
+ if (LLWorldMap::getInstance()->isTrackingValidLocation())
+ {
+ LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal();
+ if (LLWorldMap::getInstance()->isTrackingDoubleClick())
+ {
+ // Teleport if the user double clicked
+ gAgent.teleportViaLocation(pos_global);
+ }
+ // Update the "real" tracker information
+ gFloaterWorldMap->trackLocation(pos_global);
+ }
+
+ // Handle the SLURL callback if any
+ if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL)
+ {
+ U64 handle = to_region_handle(x_world, y_world);
+ // Check if we reached the requested region
+ if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0)
+ || (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle))
+ {
+ url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
+
+ LLWorldMapMessage::getInstance()->mSLURLCallback = NULL;
+ LLWorldMapMessage::getInstance()->mSLURLRegionName.clear();
+ LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0;
+
+ callback(handle, LLWorldMapMessage::getInstance()->mSLURL, image_id, LLWorldMapMessage::getInstance()->mSLURLTeleport);
+ }
+ }
+ }
+ // Tell the UI to update itself
+ gFloaterWorldMap->updateSims(found_null_sim);
+}
+
+// public static
+void LLWorldMapMessage::processMapItemReply(LLMessageSystem* msg, void**)
+{
+ //LL_INFOS("World Map") << "LLWorldMap::processMapItemReply()" << LL_ENDL;
+ U32 type;
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type);
+
+ S32 num_blocks = msg->getNumberOfBlocks("Data");
+
+ for (S32 block=0; block<num_blocks; ++block)
+ {
+ U32 X, Y;
+ std::string name;
+ S32 extra, extra2;
+ LLUUID uuid;
+ msg->getU32Fast(_PREHASH_Data, _PREHASH_X, X, block);
+ msg->getU32Fast(_PREHASH_Data, _PREHASH_Y, Y, block);
+ msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
+ msg->getUUIDFast(_PREHASH_Data, _PREHASH_ID, uuid, block);
+ msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra, extra, block);
+ msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra2, extra2, block);
+
+ LLWorldMap::getInstance()->insertItem(X, Y, name, uuid, type, extra, extra2);
+ }
+}
+
diff --git a/indra/newview/llworldmapmessage.h b/indra/newview/llworldmapmessage.h
new file mode 100644
index 0000000000..2c8fedcb10
--- /dev/null
+++ b/indra/newview/llworldmapmessage.h
@@ -0,0 +1,83 @@
+/**
+ * @file llworldmapmessage.h
+ * @brief Handling of the messages to the DB made by and for the world map.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWORLDMAPMESSAGE_H
+#define LL_LLWORLDMAPMESSAGE_H
+
+// Handling of messages (send and process) as well as SLURL callback if necessary
+class LLMessageSystem;
+
+class LLWorldMapMessage : public LLSingleton<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**);
+
+ // Request data for all regions in a rectangular area. Coordinates in grids (i.e. meters / 256).
+ void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false);
+
+ // Various methods to request LLSimInfo data to the simulator and asset DB
+ void sendNamedRegionRequest(std::string region_name);
+ void sendNamedRegionRequest(std::string region_name,
+ url_callback_t callback,
+ const std::string& callback_url,
+ bool teleport);
+ void sendHandleRegionRequest(U64 region_handle,
+ url_callback_t callback,
+ const std::string& callback_url,
+ bool teleport);
+
+ // Request item data for regions
+ // Note: the handle works *only* when requesting agent count (type = MAP_ITEM_AGENT_LOCATIONS). In that case,
+ // the request will actually be transitting through the spaceserver (all that is done on the sim).
+ // All other values of type do create a global grid request to the asset DB. So no need to try to get, say,
+ // the events for one particular region. For such a request, the handle is ignored.
+ void sendItemRequest(U32 type, U64 handle = 0);
+
+private:
+ // Search for region (by name or handle) for SLURL processing and teleport
+ // None of this relies explicitly on the LLWorldMap instance so better handle it here
+ std::string mSLURLRegionName;
+ U64 mSLURLRegionHandle;
+ std::string mSLURL;
+ url_callback_t mSLURLCallback;
+ bool mSLURLTeleport;
+};
+
+#endif // LL_LLWORLDMAPMESSAGE_H
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 823db027ee..5edf72d4ae 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -46,7 +46,6 @@
#include "llagent.h"
#include "llcallingcard.h"
#include "llviewercontrol.h"
-#include "llcylinder.h"
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
@@ -57,25 +56,29 @@
#include "llviewercamera.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
-#include "llviewermenu.h"
-#include "llviewerparceloverlay.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
-#include "llworldmap.h"
-#include "lltexturefetch.h"
-#include "llappviewer.h" // Only for constants!
#include "lltrans.h"
#include "llglheaders.h"
+// Basically a C++ implementation of the OCEAN_COLOR defined in mapstitcher.py
+// Please ensure consistency between those 2 files (TODO: would be better to get that color from an asset source...)
+// # Constants
+// OCEAN_COLOR = "#1D475F"
+const F32 OCEAN_RED = (F32)(0x1D)/255.f;
+const F32 OCEAN_GREEN = (F32)(0x47)/255.f;
+const F32 OCEAN_BLUE = (F32)(0x5F)/255.f;
+
const F32 GODLY_TELEPORT_HEIGHT = 200.f;
const S32 SCROLL_HINT_WIDTH = 65;
const F32 BIG_DOT_RADIUS = 5.f;
BOOL LLWorldMapView::sHandledLastClick = FALSE;
-LLUIImagePtr LLWorldMapView::sAvatarYouSmallImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarSmallImage = NULL;
-LLUIImagePtr LLWorldMapView::sAvatarLargeImage = NULL;
+LLUIImagePtr LLWorldMapView::sAvatarYouImage = NULL;
+LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL;
+LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL;
@@ -93,43 +96,42 @@ LLUIImagePtr LLWorldMapView::sClassifiedsImage = NULL;
LLUIImagePtr LLWorldMapView::sForSaleImage = NULL;
LLUIImagePtr LLWorldMapView::sForSaleAdultImage = NULL;
-F32 LLWorldMapView::sThresholdA = 48.f;
-F32 LLWorldMapView::sThresholdB = 96.f;
F32 LLWorldMapView::sPanX = 0.f;
F32 LLWorldMapView::sPanY = 0.f;
F32 LLWorldMapView::sTargetPanX = 0.f;
F32 LLWorldMapView::sTargetPanY = 0.f;
S32 LLWorldMapView::sTrackingArrowX = 0;
S32 LLWorldMapView::sTrackingArrowY = 0;
-F32 LLWorldMapView::sPixelsPerMeter = 1.f;
-F32 CONE_SIZE = 0.6f;
+bool LLWorldMapView::sVisibleTilesLoaded = false;
+F32 LLWorldMapView::sMapScale = 128.f;
std::map<std::string,std::string> LLWorldMapView::sStringsMap;
-#define SIM_NULL_MAP_SCALE 1 // width in pixels, where we start drawing "null" sims
-#define SIM_MAP_AGENT_SCALE 2 // width in pixels, where we start drawing agents
-#define SIM_MAP_SCALE 1 // width in pixels, where we start drawing sim tiles
-
-// Updates for agent locations.
-#define AGENTS_UPDATE_TIME 60.0 // in seconds
+// Fetch and draw info thresholds
+const F32 DRAW_TEXT_THRESHOLD = 96.f; // Don't draw text under that resolution value (res = width region in meters)
+const S32 DRAW_SIMINFO_THRESHOLD = 3; // Max level for which we load or display sim level information (level in LLWorldMipmap sense)
+const S32 DRAW_LANDFORSALE_THRESHOLD = 2; // Max level for which we load or display land for sale picture data (level in LLWorldMipmap sense)
+// When on, draw an outline for each mipmap tile gotten from S3
+#define DEBUG_DRAW_TILE 0
void LLWorldMapView::initClass()
{
- sAvatarYouSmallImage = LLUI::getUIImage("map_avatar_you_8.tga");
- sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga");
- sAvatarLargeImage = LLUI::getUIImage("map_avatar_16.tga");
- sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_8.tga");
- sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_8.tga");
+ sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga");
+ sAvatarYouImage = LLUI::getUIImage("map_avatar_16.tga");
+ sAvatarYouLargeImage = LLUI::getUIImage("map_avatar_you_32.tga");
+ sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga");
+ sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga");
+ sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga");
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
sInfohubImage = LLUI::getUIImage("map_infohub.tga");
- sEventImage = LLUI::getUIImage("map_event.tga");
- sEventMatureImage = LLUI::getUIImage("map_event_mature.tga");
+ sEventImage = LLUI::getUIImage("Parcel_PG_Dark");
+ sEventMatureImage = LLUI::getUIImage("Parcel_M_Dark");
// To Do: update the image resource for adult events.
- sEventAdultImage = LLUI::getUIImage("map_event_adult.tga");
+ sEventAdultImage = LLUI::getUIImage("Parcel_R_Dark");
sTrackCircleImage = LLUI::getUIImage("map_track_16.tga");
sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga");
@@ -145,9 +147,10 @@ void LLWorldMapView::initClass()
// static
void LLWorldMapView::cleanupClass()
{
- sAvatarYouSmallImage = NULL;
sAvatarSmallImage = NULL;
- sAvatarLargeImage = NULL;
+ sAvatarYouImage = NULL;
+ sAvatarYouLargeImage = NULL;
+ sAvatarLevelImage = NULL;
sAvatarAboveImage = NULL;
sAvatarBelowImage = NULL;
@@ -167,7 +170,7 @@ void LLWorldMapView::cleanupClass()
LLWorldMapView::LLWorldMapView()
: LLPanel(),
- mBackgroundColor( LLColor4( 4.f/255.f, 4.f/255.f, 75.f/255.f, 1.f ) ),
+ mBackgroundColor( LLColor4( OCEAN_RED, OCEAN_GREEN, OCEAN_BLUE, 1.f ) ),
mItemPicked(FALSE),
mPanning( FALSE ),
mMouseDownPanX( 0 ),
@@ -176,7 +179,8 @@ LLWorldMapView::LLWorldMapView()
mMouseDownY( 0 ),
mSelectIDStart(0)
{
- sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS;
+ //LL_INFOS("World Map") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL;
+
clearLastClick();
}
@@ -215,6 +219,7 @@ BOOL LLWorldMapView::postBuild()
LLWorldMapView::~LLWorldMapView()
{
+ //LL_INFOS("World Map") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL;
cleanupTextures();
}
@@ -228,14 +233,14 @@ void LLWorldMapView::cleanupTextures()
// static
void LLWorldMapView::setScale( F32 scale )
{
- if (scale != gMapScale)
+ if (scale != sMapScale)
{
- F32 old_scale = gMapScale;
+ F32 old_scale = sMapScale;
- gMapScale = scale;
- if (gMapScale == 0.f)
+ sMapScale = scale;
+ if (sMapScale <= 0.f)
{
- gMapScale = 0.1f;
+ sMapScale = 0.1f;
}
F32 ratio = (scale / old_scale);
@@ -243,8 +248,7 @@ void LLWorldMapView::setScale( F32 scale )
sPanY *= ratio;
sTargetPanX = sPanX;
sTargetPanY = sPanY;
-
- sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS;
+ sVisibleTilesLoaded = false;
}
}
@@ -256,6 +260,7 @@ void LLWorldMapView::translatePan( S32 delta_x, S32 delta_y )
sPanY += delta_y;
sTargetPanX = sPanX;
sTargetPanY = sPanY;
+ sVisibleTilesLoaded = false;
}
@@ -269,18 +274,22 @@ void LLWorldMapView::setPan( S32 x, S32 y, BOOL snap )
sPanX = sTargetPanX;
sPanY = sTargetPanY;
}
+ sVisibleTilesLoaded = false;
}
+bool LLWorldMapView::showRegionInfo()
+{
+ return (LLWorldMipmap::scaleToLevel(sMapScale) <= DRAW_SIMINFO_THRESHOLD ? true : false);
+}
///////////////////////////////////////////////////////////////////////////////////
// HELPERS
BOOL is_agent_in_region(LLViewerRegion* region, LLSimInfo* info)
{
- return ((region && info) && (info->mName == region->getName()));
+ return (region && info && info->isName(region->getName()));
}
-
///////////////////////////////////////////////////////////////////////////////////
void LLWorldMapView::draw()
@@ -292,7 +301,7 @@ void LLWorldMapView::draw()
F64 current_time = LLTimer::getElapsedSeconds();
mVisibleRegions.clear();
-
+
// animate pan if necessary
sPanX = lerp(sPanX, sTargetPanX, LLCriticalDamp::getInterpolant(0.1f));
sPanY = lerp(sPanY, sTargetPanY, LLCriticalDamp::getInterpolant(0.1f));
@@ -303,10 +312,12 @@ void LLWorldMapView::draw()
const F32 half_height = F32(height) / 2.0f;
LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ S32 level = LLWorldMipmap::scaleToLevel(sMapScale);
+
LLLocalClipRect clip(getLocalRect());
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
+
glMatrixMode(GL_MODELVIEW);
// Clear the background alpha to 0
@@ -319,307 +330,58 @@ void LLWorldMapView::draw()
}
gGL.flush();
+
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.setColorMask(true, true);
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
-
- F32 layer_alpha = 1.f;
-
- // Draw one image per layer
- for (U32 layer_idx=0; layer_idx<LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap].size(); ++layer_idx)
- {
- if (!LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap][layer_idx].LayerDefined)
- {
- continue;
- }
- LLWorldMapLayer *layer = &LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap][layer_idx];
- LLViewerFetchedTexture *current_image = layer->LayerImage;
-
- if (current_image->isMissingAsset())
- {
- continue; // better to draw nothing than the missing asset image
- }
-
- LLVector3d origin_global((F64)layer->LayerExtents.mLeft * REGION_WIDTH_METERS, (F64)layer->LayerExtents.mBottom * REGION_WIDTH_METERS, 0.f);
-
- // Find x and y position relative to camera's center.
- LLVector3d rel_region_pos = origin_global - camera_global;
- F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale;
- F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale;
-
- F32 pix_width = gMapScale*(layer->LayerExtents.getWidth() + 1);
- F32 pix_height = gMapScale*(layer->LayerExtents.getHeight() + 1);
-
- // When the view isn't panned, 0,0 = center of rectangle
- F32 bottom = sPanY + half_height + relative_y;
- F32 left = sPanX + half_width + relative_x;
- F32 top = bottom + pix_height;
- F32 right = left + pix_width;
- F32 pixel_area = pix_width*pix_height;
- // discard layers that are outside the rectangle
- // and discard small layers
- if (top < 0.f ||
- bottom > height ||
- right < 0.f ||
- left > width ||
- (pixel_area < 4*4))
- {
- current_image->setBoostLevel(0);
- continue;
- }
-
- current_image->setBoostLevel(LLViewerTexture::BOOST_MAP);
- current_image->setKnownDrawSize(llround(pix_width * LLUI::sGLScaleFactor.mV[VX]), llround(pix_height * LLUI::sGLScaleFactor.mV[VY]));
-
- if (!current_image->hasGLTexture())
- {
- continue; // better to draw nothing than the default image
- }
-
-// LLTextureView::addDebugImage(current_image);
-
- // Draw using the texture. If we don't clamp we get artifact at
- // the edge.
- gGL.getTexUnit(0)->bind(current_image);
-
- // Draw map image into RGB
- //gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- gGL.flush();
- gGL.setColorMask(true, false);
- gGL.color4f(1.f, 1.f, 1.f, layer_alpha);
-
- gGL.begin(LLRender::QUADS);
- gGL.texCoord2f(0.0f, 1.0f);
- gGL.vertex3f(left, top, -1.0f);
- gGL.texCoord2f(0.0f, 0.0f);
- gGL.vertex3f(left, bottom, -1.0f);
- gGL.texCoord2f(1.0f, 0.0f);
- gGL.vertex3f(right, bottom, -1.0f);
- gGL.texCoord2f(1.0f, 1.0f);
- gGL.vertex3f(right, top, -1.0f);
- gGL.end();
-
- // draw an alpha of 1 where the sims are visible
- gGL.flush();
- gGL.setColorMask(false, true);
- gGL.color4f(1.f, 1.f, 1.f, 1.f);
-
- gGL.begin(LLRender::QUADS);
- gGL.texCoord2f(0.0f, 1.0f);
- gGL.vertex2f(left, top);
- gGL.texCoord2f(0.0f, 0.0f);
- gGL.vertex2f(left, bottom);
- gGL.texCoord2f(1.0f, 0.0f);
- gGL.vertex2f(right, bottom);
- gGL.texCoord2f(1.0f, 1.0f);
- gGL.vertex2f(right, top);
- gGL.end();
- }
+ // Draw the image tiles
+ drawMipmap(width, height);
gGL.flush();
+
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.setColorMask(true, true);
- // there used to be an #if 1 here, but it was uncommented; perhaps marking a block of code?
- F32 sim_alpha = 1.f;
-
- // Draw one image per region, centered on the camera position.
- const S32 MAX_SIMULTANEOUS_TEX = 100;
- const S32 MAX_REQUEST_PER_TICK = 5;
- const S32 MIN_REQUEST_PER_TICK = 1;
- S32 textures_requested_this_tick = 0;
-
- for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin();
- it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
+ // Draw per sim overlayed information (names, mature, offline...)
+ for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin();
+ it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
{
- U64 handle = (*it).first;
- LLSimInfo* info = (*it).second;
-
- LLViewerFetchedTexture* simimage = info->mCurrentImage;
- LLViewerFetchedTexture* overlayimage = info->mOverlayImage;
+ U64 handle = it->first;
+ LLSimInfo* info = it->second;
- if (gMapScale < SIM_MAP_SCALE)
- {
- if (simimage != NULL) simimage->setBoostLevel(0);
- if (overlayimage != NULL) overlayimage->setBoostLevel(0);
- continue;
- }
-
LLVector3d origin_global = from_region_handle(handle);
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
// Find x and y position relative to camera's center.
LLVector3d rel_region_pos = origin_global - camera_global;
- F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale;
- F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale;
+ F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * sMapScale;
+ F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * sMapScale;
+ // Coordinates of the sim in pixels in the UI panel
// When the view isn't panned, 0,0 = center of rectangle
- F32 bottom = sPanY + half_height + relative_y;
- F32 left = sPanX + half_width + relative_x;
- F32 top = bottom + gMapScale ;
- F32 right = left + gMapScale ;
-
- // Switch to world map texture (if available for this region) if either:
- // 1. Tiles are zoomed out small enough, or
- // 2. Sim's texture has not been loaded yet
- F32 map_scale_cutoff = SIM_MAP_SCALE;
- if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) > 0)
+ F32 bottom = sPanY + half_height + relative_y;
+ F32 left = sPanX + half_width + relative_x;
+ F32 top = bottom + sMapScale ;
+ F32 right = left + sMapScale ;
+
+ // Discard if region is outside the screen rectangle (not visible on screen)
+ if ((top < 0.f) || (bottom > height) ||
+ (right < 0.f) || (left > width) )
{
- map_scale_cutoff = SIM_NULL_MAP_SCALE;
- }
-
- info->mShowAgentLocations = (gMapScale >= SIM_MAP_AGENT_SCALE);
-
- bool sim_visible =
- (gMapScale >= map_scale_cutoff) &&
- (simimage != NULL) &&
- (simimage->hasGLTexture());
-
- if (sim_visible)
- {
- // Fade in
- if (info->mAlpha < 0.0f)
- info->mAlpha = 1.f; // don't fade initially
- else
- info->mAlpha = lerp(info->mAlpha, 1.f, LLCriticalDamp::getInterpolant(0.15f));
- }
- else
- {
- // Fade out
- if (info->mAlpha < 0.0f)
- info->mAlpha = 0.f; // don't fade initially
- else
- info->mAlpha = lerp(info->mAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f));
- }
-
- // discard regions that are outside the rectangle
- // and discard small regions
- if (top < 0.f ||
- bottom > height ||
- right < 0.f ||
- left > width )
- {
- if (simimage != NULL) simimage->setBoostLevel(0);
- if (overlayimage != NULL) overlayimage->setBoostLevel(0);
+ // Drop the "land for sale" fetching priority since it's outside the view rectangle
+ info->dropImagePriority();
continue;
}
- if (info->mCurrentImage.isNull())
- {
- if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) ||
- ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) &&
- (textures_requested_this_tick < MAX_REQUEST_PER_TICK)))
- {
- textures_requested_this_tick++;
- info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
- info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
- simimage = info->mCurrentImage;
- gGL.getTexUnit(0)->bind(simimage);
- }
- }
- if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull())
- {
- if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) ||
- ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) &&
- (textures_requested_this_tick < MAX_REQUEST_PER_TICK)))
- {
- textures_requested_this_tick++;
- info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
- info->mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);
- overlayimage = info->mOverlayImage;
- gGL.getTexUnit(0)->bind(overlayimage);
- }
- }
+ // This list is used by other methods to know which regions are indeed displayed on screen
mVisibleRegions.push_back(handle);
- // See if the agents need updating
- if (current_time - info->mAgentsUpdateTime > AGENTS_UPDATE_TIME)
- {
- LLWorldMap::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, info->mHandle);
- info->mAgentsUpdateTime = current_time;
- }
-
- // Bias the priority escalation for images nearer
- LLVector3d center_global = origin_global;
- center_global.mdV[VX] += 128.0;
- center_global.mdV[VY] += 128.0;
-
- S32 draw_size = llround(gMapScale);
- if (simimage != NULL)
- {
- simimage->setBoostLevel(LLViewerTexture::BOOST_MAP);
- simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY]));
- }
- if (overlayimage != NULL)
+ // Update the agent count for that region if we're not too zoomed out already
+ if (level <= DRAW_SIMINFO_THRESHOLD)
{
- overlayimage->setBoostLevel(LLViewerTexture::BOOST_MAP);
- overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY]));
- }
-
-// LLTextureView::addDebugImage(simimage);
-
- if (sim_visible && info->mAlpha > 0.001f)
- {
- // Draw using the texture. If we don't clamp we get artifact at
- // the edge.
- LLGLSUIDefault gls_ui;
- if (simimage != NULL)
- gGL.getTexUnit(0)->bind(simimage);
-
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- F32 alpha = sim_alpha * info->mAlpha;
- gGL.color4f(1.f, 1.0f, 1.0f, alpha);
-
- gGL.begin(LLRender::QUADS);
- gGL.texCoord2f(0.f, 1.f);
- gGL.vertex3f(left, top, 0.f);
- gGL.texCoord2f(0.f, 0.f);
- gGL.vertex3f(left, bottom, 0.f);
- gGL.texCoord2f(1.f, 0.f);
- gGL.vertex3f(right, bottom, 0.f);
- gGL.texCoord2f(1.f, 1.f);
- gGL.vertex3f(right, top, 0.f);
- gGL.end();
-
- if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->hasGLTexture())
- {
- gGL.getTexUnit(0)->bind(overlayimage);
- gGL.color4f(1.f, 1.f, 1.f, alpha);
- gGL.begin(LLRender::QUADS);
- gGL.texCoord2f(0.f, 1.f);
- gGL.vertex3f(left, top, -0.5f);
- gGL.texCoord2f(0.f, 0.f);
- gGL.vertex3f(left, bottom, -0.5f);
- gGL.texCoord2f(1.f, 0.f);
- gGL.vertex3f(right, bottom, -0.5f);
- gGL.texCoord2f(1.f, 1.f);
- gGL.vertex3f(right, top, -0.5f);
- gGL.end();
- }
-
- if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) == 0)
- {
- // draw an alpha of 1 where the sims are visible (except NULL sims)
- gGL.flush();
- gGL.setSceneBlendType(LLRender::BT_REPLACE);
- gGL.setColorMask(false, true);
- gGL.color4f(1.f, 1.f, 1.f, 1.f);
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.begin(LLRender::QUADS);
- gGL.vertex2f(left, top);
- gGL.vertex2f(left, bottom);
- gGL.vertex2f(right, bottom);
- gGL.vertex2f(right, top);
- gGL.end();
-
- gGL.flush();
- gGL.setColorMask(true, true);
- }
+ info->updateAgentCount(current_time);
}
- if (info->mAccess == SIM_ACCESS_DOWN)
+ if (info->isDown())
{
// Draw a transparent red square over down sims
gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA);
@@ -633,18 +395,15 @@ void LLWorldMapView::draw()
gGL.vertex2f(right, top);
gGL.end();
}
-
- // As part of the AO project, we no longer want to draw access indicators;
- // it's too complicated to get all the rules straight and will only
+ // As part of the AO project, we no longer want to draw access indicators;
+ // it's too complicated to get all the rules straight and will only
// cause confusion.
/**********************
- // If this is mature, and you are not, draw a line across it
- if (info->mAccess != SIM_ACCESS_DOWN
- && info->mAccess > SIM_ACCESS_PG
- && gAgent.isTeen())
+ else if (!info->isPG() && gAgent.isTeen())
{
+ // If this is a mature region, and you are not, draw a line across it
gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
-
+
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color3f(1.f, 0.f, 0.f);
gGL.begin(LLRender::LINES);
@@ -655,68 +414,66 @@ void LLWorldMapView::draw()
gGL.end();
}
**********************/
-
- // Draw the region name in the lower left corner
- LLFontGL* font = LLFontGL::getFontSansSerifSmall();
-
- std::string mesg;
- if (gMapScale < sThresholdA)
+ else if (gSavedSettings.getBOOL("MapShowLandForSale") && (level <= DRAW_LANDFORSALE_THRESHOLD))
{
+ // Draw the overlay image "Land for Sale / Land for Auction"
+ LLViewerFetchedTexture* overlayimage = info->getLandForSaleImage();
+ if (overlayimage)
+ {
+ // Inform the fetch mechanism of the size we need
+ S32 draw_size = llround(sMapScale);
+ overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY]));
+ // Draw something whenever we have enough info
+ if (overlayimage->hasGLTexture())
+ {
+ gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
+ gGL.getTexUnit(0)->bind(overlayimage);
+ gGL.color4f(1.f, 1.f, 1.f, 1.f);
+ gGL.begin(LLRender::QUADS);
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex3f(left, top, -0.5f);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex3f(left, bottom, -0.5f);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex3f(right, bottom, -0.5f);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex3f(right, top, -0.5f);
+ gGL.end();
+ }
+ }
}
- else if (gMapScale < sThresholdB)
+ else
{
- // mesg = llformat( info->mAgents);
+ // If we're not displaying the "land for sale", drop its fetching priority
+ info->dropImagePriority();
}
- else
+
+ // Draw the region name in the lower left corner
+ if (sMapScale >= DRAW_TEXT_THRESHOLD)
{
- //mesg = llformat("%d / %s (%s)",
- // info->mAgents,
- // info->mName.c_str(),
- // LLViewerRegion::accessToShortString(info->mAccess).c_str() );
- if (info->mAccess == SIM_ACCESS_DOWN)
+ LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Small", LLFontGL::BOLD));
+ std::string mesg;
+ if (info->isDown())
{
- mesg = llformat( "%s (%s)", info->mName.c_str(), sStringsMap["offline"].c_str());
+ mesg = llformat( "%s (%s)", info->getName().c_str(), sStringsMap["offline"].c_str());
}
else
{
- mesg = info->mName;
+ mesg = info->getName();
}
- }
-
- if (!mesg.empty())
- {
- font->renderUTF8(
- mesg, 0,
- llfloor(left + 3),
- llfloor(bottom + 2),
- LLColor4::white,
- LLFontGL::LEFT,
- LLFontGL::BASELINE,
- LLFontGL::NORMAL,
- LLFontGL::DROP_SHADOW);
-
- // If map texture is still loading,
- // display "Loading" placeholder text.
- if ((simimage != NULL) &&
- simimage->getDiscardLevel() != 1 &&
- simimage->getDiscardLevel() != 0)
+ if (!mesg.empty())
{
font->renderUTF8(
- sStringsMap["loading"], 0,
- llfloor(left + 18),
- llfloor(top - 25),
+ mesg, 0,
+ llfloor(left + 3), llfloor(bottom + 2),
LLColor4::white,
- LLFontGL::LEFT,
- LLFontGL::BASELINE,
- LLFontGL::NORMAL,
- LLFontGL::DROP_SHADOW);
+ LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);
}
}
}
- // #endif used to be here
- // there used to be an #if 1 here, but it was uncommented; perhaps marking a block of code?
+
// Draw background rectangle
LLGLSUIDefault gls_ui;
{
@@ -726,69 +483,49 @@ void LLWorldMapView::draw()
gGL.color4fv( mBackgroundColor.mV );
gl_rect_2d(0, height, width, 0);
}
-
+
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- // Infohubs
- if (gSavedSettings.getBOOL("MapShowInfohubs")) //(gMapScale >= sThresholdB)
+ // Draw item infos if we're not zoomed out too much and there's something to draw
+ if ((level <= DRAW_SIMINFO_THRESHOLD) && (gSavedSettings.getBOOL("MapShowInfohubs") ||
+ gSavedSettings.getBOOL("MapShowTelehubs") ||
+ gSavedSettings.getBOOL("MapShowLandForSale") ||
+ gSavedSettings.getBOOL("MapShowEvents") ||
+ gSavedSettings.getBOOL("ShowMatureEvents") ||
+ gSavedSettings.getBOOL("ShowAdultEvents")))
{
- drawGenericItems(LLWorldMap::getInstance()->mInfohubs, sInfohubImage);
+ drawItems();
}
- // Telehubs
- if (gSavedSettings.getBOOL("MapShowTelehubs")) //(gMapScale >= sThresholdB)
- {
- drawGenericItems(LLWorldMap::getInstance()->mTelehubs, sTelehubImage);
- }
-
- // Home Sweet Home
+ // Draw the Home location (always)
LLVector3d home;
if (gAgent.getHomePosGlobal(&home))
{
drawImage(home, sHomeImage);
}
- if (gSavedSettings.getBOOL("MapShowLandForSale"))
- {
- drawGenericItems(LLWorldMap::getInstance()->mLandForSale, sForSaleImage);
- // for 1.23, we're showing normal land and adult land in the same UI; you don't
- // get a choice about which ones you want. If you're currently asking for adult
- // content and land you'll get the adult land.
- if (gAgent.canAccessAdult())
- {
- drawGenericItems(LLWorldMap::getInstance()->mLandForSaleAdult, sForSaleAdultImage);
- }
- }
-
- if (gSavedSettings.getBOOL("MapShowEvents") ||
- gSavedSettings.getBOOL("ShowMatureEvents") ||
- gSavedSettings.getBOOL("ShowAdultEvents") )
- {
- drawEvents();
- }
-
- // Now draw your avatar after all that other stuff.
+ // Draw the current agent after all that other stuff.
LLVector3d pos_global = gAgent.getPositionGlobal();
- drawImage(pos_global, sAvatarLargeImage);
+ drawImage(pos_global, sAvatarYouImage);
LLVector3 pos_map = globalPosToView(pos_global);
if (!pointInView(llround(pos_map.mV[VX]), llround(pos_map.mV[VY])))
{
- drawTracking(pos_global,
- lerp(LLColor4::yellow, LLColor4::orange, 0.4f),
- TRUE,
- "You are here",
- "",
- llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking
+ drawTracking(pos_global,
+ lerp(LLColor4::yellow, LLColor4::orange, 0.4f),
+ TRUE,
+ "You are here",
+ "",
+ llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking
}
- // Show your viewing angle
+ // Draw the current agent viewing angle
drawFrustum();
// Draw icons for the avatars in each region.
- // Drawn after your avatar so you can see nearby people.
- if (gSavedSettings.getBOOL("MapShowPeople"))
+ // Drawn this after the current agent avatar so one can see nearby people
+ if (gSavedSettings.getBOOL("MapShowPeople") && (level <= DRAW_SIMINFO_THRESHOLD))
{
drawAgents();
}
@@ -798,9 +535,9 @@ void LLWorldMapView::draw()
if ( LLTracker::TRACKING_AVATAR == tracking_status )
{
drawTracking( LLAvatarTracker::instance().getGlobalPos(), map_track_color, TRUE, LLTracker::getLabel(), "" );
- }
- else if ( LLTracker::TRACKING_LANDMARK == tracking_status
- || LLTracker::TRACKING_LOCATION == tracking_status )
+ }
+ else if ( LLTracker::TRACKING_LANDMARK == tracking_status
+ || LLTracker::TRACKING_LOCATION == tracking_status )
{
// While fetching landmarks, will have 0,0,0 location for a while,
// so don't draw. JC
@@ -810,31 +547,33 @@ void LLWorldMapView::draw()
drawTracking( pos_global, map_track_color, TRUE, LLTracker::getLabel(), LLTracker::getToolTip() );
}
}
- else if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation)
+ else if (LLWorldMap::getInstance()->isTracking())
{
- if (LLWorldMap::getInstance()->mInvalidLocation)
+ if (LLWorldMap::getInstance()->isTrackingInvalidLocation())
{
- // We know this location to be invalid
+ // We know this location to be invalid, draw a blue circle
LLColor4 loading_color(0.0, 0.5, 1.0, 1.0);
- drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("InvalidLocation"), "");
+ drawTracking( LLWorldMap::getInstance()->getTrackedPositionGlobal(), loading_color, TRUE, getString("InvalidLocation"), "");
}
else
{
+ // We don't know yet what that location is, draw a throbing blue circle
double value = fmod(current_time, 2);
- value = 0.5 + 0.5*cos(value * 3.14159f);
+ value = 0.5 + 0.5*cos(value * F_PI);
LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0);
- drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("Loading"), "");
+ drawTracking( LLWorldMap::getInstance()->getTrackedPositionGlobal(), loading_color, TRUE, getString("Loading"), "");
}
}
- // #endif used to be here
-
+
+
// turn off the scissor
LLGLDisable no_scissor(GL_SCISSOR_TEST);
-
+
updateDirections();
LLView::draw();
+ // Get sim info for all sims in view
updateVisibleBlocks();
} // end draw()
@@ -845,36 +584,182 @@ void LLWorldMapView::setVisible(BOOL visible)
LLPanel::setVisible(visible);
if (!visible)
{
- for (S32 map = 0; map < MAP_SIM_IMAGE_TYPES; map++)
+ // Drop the download of tiles and images priority to nil if we hide the map
+ LLWorldMap::getInstance()->dropImagePriorities();
+ }
+}
+
+void LLWorldMapView::drawMipmap(S32 width, S32 height)
+{
+ // Compute the level of the mipmap to use for the current scale level
+ S32 level = LLWorldMipmap::scaleToLevel(sMapScale);
+ // Set the tile boost level so that unused tiles get to 0
+ LLWorldMap::getInstance()->equalizeBoostLevels();
+
+ // Render whatever we already have loaded if we haven't the current level
+ // complete and use it as a background (scaled up or scaled down)
+ if (!sVisibleTilesLoaded)
+ {
+ // Note: the (load = false) parameter avoids missing tiles to be fetched (i.e. we render what we have, no more)
+ // Check all the lower res levels and render them in reverse order (worse to best)
+ // We need to traverse all the levels as the user can zoom in very fast
+ for (S32 l = LLWorldMipmap::MAP_LEVELS; l > level; l--)
{
- for (U32 layer_idx=0; layer_idx<LLWorldMap::getInstance()->mMapLayers[map].size(); ++layer_idx)
- {
- if (LLWorldMap::getInstance()->mMapLayers[map][layer_idx].LayerDefined)
- {
- LLWorldMapLayer *layer = &LLWorldMap::getInstance()->mMapLayers[map][layer_idx];
- layer->LayerImage->setBoostLevel(0);
- }
- }
+ drawMipmapLevel(width, height, l, false);
}
- for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin();
- it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
+ // Skip the current level, as we'll do it anyway here under...
+
+ // Just go one level down in res as it can really get too much stuff
+ // when zooming out and too small to see anyway...
+ if (level > 1)
{
- LLSimInfo* info = (*it).second;
- if (info->mCurrentImage.notNull())
+ drawMipmapLevel(width, height, level - 1, false);
+ }
+ }
+ else
+ {
+ //LL_INFOS("World Map") << "Render complete, don't draw background..." << LL_ENDL;
+ }
+
+ // Render the current level
+ sVisibleTilesLoaded = drawMipmapLevel(width, height, level);
+
+ return;
+}
+
+// Return true if all the tiles required to render that level have been fetched or are truly missing
+bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load)
+{
+ // Check input level
+ llassert (level > 0);
+ if (level <= 0)
+ return false;
+
+ // Count tiles hit and completed
+ S32 completed_tiles = 0;
+ S32 total_tiles = 0;
+
+ // Size in meters (global) of each tile of that level
+ S32 tile_width = LLWorldMipmap::MAP_TILE_SIZE * (1 << (level - 1));
+ // Dimension of the screen in meter at that scale
+ LLVector3d pos_SW = viewPosToGlobal(0, 0);
+ LLVector3d pos_NE = viewPosToGlobal(width, height);
+ // Add external band of tiles on the outskirt so to hit the partially displayed tiles right and top
+ pos_NE[VX] += tile_width;
+ pos_NE[VY] += tile_width;
+
+ // Iterate through the tiles on screen: we just need to ask for one tile every tile_width meters
+ U32 grid_x, grid_y;
+ for (F64 index_y = pos_SW[VY]; index_y < pos_NE[VY]; index_y += tile_width)
+ {
+ for (F64 index_x = pos_SW[VX]; index_x < pos_NE[VX]; index_x += tile_width)
+ {
+ // Compute the world coordinates of the current point
+ LLVector3d pos_global(index_x, index_y, pos_SW[VZ]);
+ // Convert to the mipmap level coordinates for that point (i.e. which tile to we hit)
+ LLWorldMipmap::globalToMipmap(pos_global[VX], pos_global[VY], level, &grid_x, &grid_y);
+ // Get the tile. Note: NULL means that the image does not exist (so it's considered "complete" as far as fetching is concerned)
+ LLPointer<LLViewerFetchedTexture> simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load);
+ if (simimage)
{
- info->mCurrentImage->setBoostLevel(0);
+ // Checks that the image has a valid texture
+ if (simimage->hasGLTexture())
+ {
+ // Increment the number of completly fetched tiles
+ completed_tiles++;
+
+ // Convert those coordinates (SW corner of the mipmap tile) into world (meters) coordinates
+ pos_global[VX] = grid_x * REGION_WIDTH_METERS;
+ pos_global[VY] = grid_y * REGION_WIDTH_METERS;
+ // Now to screen coordinates for SW corner of that tile
+ LLVector3 pos_screen = globalPosToView (pos_global);
+ F32 left = pos_screen[VX];
+ F32 bottom = pos_screen[VY];
+ // Compute the NE corner coordinates of the tile now
+ pos_global[VX] += tile_width;
+ pos_global[VY] += tile_width;
+ pos_screen = globalPosToView (pos_global);
+ F32 right = pos_screen[VX];
+ F32 top = pos_screen[VY];
+
+ // Draw the tile
+ LLGLSUIDefault gls_ui;
+ gGL.getTexUnit(0)->bind(simimage.get());
+ simimage->setAddressMode(LLTexUnit::TAM_CLAMP);
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ gGL.color4f(1.f, 1.0f, 1.0f, 1.0f);
+
+ gGL.begin(LLRender::QUADS);
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex3f(left, top, 0.f);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex3f(left, bottom, 0.f);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex3f(right, bottom, 0.f);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex3f(right, top, 0.f);
+ gGL.end();
+#if DEBUG_DRAW_TILE
+ drawTileOutline(level, top, left, bottom, right);
+#endif // DEBUG_DRAW_TILE
+ }
+ //else
+ //{
+ // Waiting for a tile -> the level is not complete
+ // LL_INFOS("World Map") << "Unfetched tile. level = " << level << LL_ENDL;
+ //}
}
- if (info->mOverlayImage.notNull())
+ else
{
- info->mOverlayImage->setBoostLevel(0);
+ // Unexistent tiles are counted as "completed"
+ completed_tiles++;
}
+ // Increment the number of tiles in that level / screen
+ total_tiles++;
}
}
+ return (completed_tiles == total_tiles);
+}
+
+// Draw lines (rectangle outline and cross) to visualize the position of the tile
+// Used for debug only
+void LLWorldMapView::drawTileOutline(S32 level, F32 top, F32 left, F32 bottom, F32 right)
+{
+ gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (level == 1)
+ gGL.color3f(1.f, 0.f, 0.f); // red
+ else if (level == 2)
+ gGL.color3f(0.f, 1.f, 0.f); // green
+ else if (level == 3)
+ gGL.color3f(0.f, 0.f, 1.f); // blue
+ else if (level == 4)
+ gGL.color3f(1.f, 1.f, 0.f); // yellow
+ else if (level == 5)
+ gGL.color3f(1.f, 0.f, 1.f); // magenta
+ else if (level == 6)
+ gGL.color3f(0.f, 1.f, 1.f); // cyan
+ else if (level == 7)
+ gGL.color3f(1.f, 1.f, 1.f); // white
+ else
+ gGL.color3f(0.f, 0.f, 0.f); // black
+ gGL.begin(LLRender::LINE_STRIP);
+ gGL.vertex2f(left, top);
+ gGL.vertex2f(right, bottom);
+ gGL.vertex2f(left, bottom);
+ gGL.vertex2f(right, top);
+ gGL.vertex2f(left, top);
+ gGL.vertex2f(left, bottom);
+ gGL.vertex2f(right, bottom);
+ gGL.vertex2f(right, top);
+ gGL.end();
}
-void LLWorldMapView::drawGenericItems(const LLWorldMap::item_info_list_t& items, LLUIImagePtr image)
+void LLWorldMapView::drawGenericItems(const LLSimInfo::item_info_list_t& items, LLUIImagePtr image)
{
- LLWorldMap::item_info_list_t::const_iterator e;
+ LLSimInfo::item_info_list_t::const_iterator e;
for (e = items.begin(); e != items.end(); ++e)
{
drawGenericItem(*e, image);
@@ -883,7 +768,7 @@ void LLWorldMapView::drawGenericItems(const LLWorldMap::item_info_list_t& items,
void LLWorldMapView::drawGenericItem(const LLItemInfo& item, LLUIImagePtr image)
{
- drawImage(item.mPosGlobal, image);
+ drawImage(item.getGlobalPosition(), image);
}
@@ -906,137 +791,91 @@ void LLWorldMapView::drawImageStack(const LLVector3d& global_pos, LLUIImagePtr i
}
}
-
-void LLWorldMapView::drawAgents()
+void LLWorldMapView::drawItems()
{
- static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white);
- static LLUIColor map_avatar_friend_color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white);
-
- F32 agents_scale = (gMapScale * 0.9f) / 256.f;
+ bool mature_enabled = gAgent.canAccessMature();
+ bool adult_enabled = gAgent.canAccessAdult();
+
+ BOOL show_mature = mature_enabled && gSavedSettings.getBOOL("ShowMatureEvents");
+ BOOL show_adult = adult_enabled && gSavedSettings.getBOOL("ShowAdultEvents");
for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter)
{
U64 handle = *iter;
- LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
- if (siminfo && (siminfo->mAccess == SIM_ACCESS_DOWN))
+ LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
+ if ((info == NULL) || (info->isDown()))
{
continue;
}
- LLWorldMap::agent_list_map_t::iterator counts_iter = LLWorldMap::getInstance()->mAgentLocationsMap.find(handle);
- if (siminfo && siminfo->mShowAgentLocations && counts_iter != LLWorldMap::getInstance()->mAgentLocationsMap.end())
+ // Infohubs
+ if (gSavedSettings.getBOOL("MapShowInfohubs"))
{
- // Show Individual agents (or little stacks where real agents are)
- LLWorldMap::item_info_list_t& agentcounts = counts_iter->second;
- S32 sim_agent_count = 0;
- for (LLWorldMap::item_info_list_t::iterator iter = agentcounts.begin();
- iter != agentcounts.end(); ++iter)
- {
- const LLItemInfo& info = *iter;
- S32 agent_count = info.mExtra;
- sim_agent_count += info.mExtra;
- // Here's how we'd choose the color if info.mID were available but it's not being sent:
- //LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? map_avatar_friend_color : map_avatar_color;
- drawImageStack(info.mPosGlobal, sAvatarSmallImage, agent_count, 3.f, map_avatar_color);
- }
- LLWorldMap::getInstance()->mNumAgents[handle] = sim_agent_count; // override mNumAgents for this sim
+ drawGenericItems(info->getInfoHub(), sInfohubImage);
}
- else
+ // Telehubs
+ if (gSavedSettings.getBOOL("MapShowTelehubs"))
{
- // Show agent 'stack' at center of sim
- S32 num_agents = LLWorldMap::getInstance()->mNumAgents[handle];
- if (num_agents > 0)
+ drawGenericItems(info->getTeleHub(), sTelehubImage);
+ }
+ // Land for sale
+ if (gSavedSettings.getBOOL("MapShowLandForSale"))
+ {
+ drawGenericItems(info->getLandForSale(), sForSaleImage);
+ // for 1.23, we're showing normal land and adult land in the same UI; you don't
+ // get a choice about which ones you want. If you're currently asking for adult
+ // content and land you'll get the adult land.
+ if (gAgent.canAccessAdult())
{
- LLVector3d region_center = from_region_handle(handle);
- region_center[VX] += REGION_WIDTH_METERS / 2;
- region_center[VY] += REGION_WIDTH_METERS / 2;
- // Reduce the stack size as you zoom out - always display at lease one agent where there is one or more
- S32 agent_count = (S32)(((num_agents-1) * agents_scale + (num_agents-1) * 0.1f)+.1f) + 1;
- drawImageStack(region_center, sAvatarSmallImage, agent_count, 3.f, map_avatar_color);
+ drawGenericItems(info->getLandForSaleAdult(), sForSaleAdultImage);
}
}
+ // PG Events
+ if (gSavedSettings.getBOOL("MapShowEvents"))
+ {
+ drawGenericItems(info->getPGEvent(), sEventImage);
+ }
+ // Mature Events
+ if (show_mature)
+ {
+ drawGenericItems(info->getMatureEvent(), sEventMatureImage);
+ }
+ // Adult Events
+ if (show_adult)
+ {
+ drawGenericItems(info->getAdultEvent(), sEventAdultImage);
+ }
}
}
-
-void LLWorldMapView::drawEvents()
+void LLWorldMapView::drawAgents()
{
- bool mature_enabled = gAgent.canAccessMature();
- bool adult_enabled = gAgent.canAccessAdult();
-
- BOOL show_pg = gSavedSettings.getBOOL("MapShowEvents");
- BOOL show_mature = mature_enabled && gSavedSettings.getBOOL("ShowMatureEvents");
- BOOL show_adult = adult_enabled && gSavedSettings.getBOOL("ShowAdultEvents");
+ static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white);
- // First the non-selected events
- LLWorldMap::item_info_list_t::const_iterator e;
- if (show_pg)
+ for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter)
{
- for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
+ U64 handle = *iter;
+ LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
+ if ((siminfo == NULL) || (siminfo->isDown()))
{
- if (!e->mSelected)
- {
- drawGenericItem(*e, sEventImage);
- }
+ continue;
}
- }
- if (show_mature)
- {
- for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e)
- {
- if (!e->mSelected)
- {
- drawGenericItem(*e, sEventMatureImage);
- }
- }
- }
- if (show_adult)
- {
- for (e = LLWorldMap::getInstance()->mAdultEvents.begin(); e != LLWorldMap::getInstance()->mAdultEvents.end(); ++e)
- {
- if (!e->mSelected)
- {
- drawGenericItem(*e, sEventAdultImage);
- }
- }
- }
- // Then the selected events
- if (show_pg)
- {
- for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getAgentLocation().begin();
+ while (it != siminfo->getAgentLocation().end())
{
- if (e->mSelected)
- {
- drawGenericItem(*e, sEventImage);
- }
+ // Show Individual agents (or little stacks where real agents are)
+
+ // Here's how we'd choose the color if info.mID were available but it's not being sent:
+ // LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? friend_color : avatar_color;
+ drawImageStack(it->getGlobalPosition(), sAvatarSmallImage, it->getCount(), 3.f, map_avatar_color);
+ ++it;
}
}
- if (show_mature)
- {
- for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e)
- {
- if (e->mSelected)
- {
- drawGenericItem(*e, sEventMatureImage);
- }
- }
- }
- if (show_adult)
- {
- for (e = LLWorldMap::getInstance()->mAdultEvents.begin(); e != LLWorldMap::getInstance()->mAdultEvents.end(); ++e)
- {
- if (e->mSelected)
- {
- drawGenericItem(*e, sEventAdultImage);
- }
- }
- }
}
-
void LLWorldMapView::drawFrustum()
{
// Draw frustum
- F32 meters_to_pixels = gMapScale/ REGION_WIDTH_METERS;
+ F32 meters_to_pixels = sMapScale/ REGION_WIDTH_METERS;
F32 horiz_fov = LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect();
F32 far_clip_meters = LLViewerCamera::getInstance()->getFar();
@@ -1077,8 +916,8 @@ LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos )
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
- pos_local.mV[VX] *= sPixelsPerMeter;
- pos_local.mV[VY] *= sPixelsPerMeter;
+ pos_local.mV[VX] *= sMapScale / REGION_WIDTH_METERS;
+ pos_local.mV[VY] *= sMapScale / REGION_WIDTH_METERS;
// leave Z component in meters
@@ -1162,7 +1001,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
LLVector3 pos_local( (F32)x, (F32)y, 0.f );
- pos_local *= ( REGION_WIDTH_METERS / gMapScale );
+ pos_local *= ( REGION_WIDTH_METERS / sMapScale );
LLVector3d pos_global;
pos_global.setVec( pos_local );
@@ -1183,23 +1022,20 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
{
LLVector3d pos_global = viewPosToGlobal(x, y);
-
+ U64 handle = to_region_handle(pos_global);
std::string tooltip_msg;
- LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
+ LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
if (info)
{
LLViewerRegion *region = gAgent.getRegion();
- std::string message =
- llformat("%s (%s)",
- info->mName.c_str(),
- LLViewerRegion::accessToString(info->mAccess).c_str());
+ std::string message = llformat("%s (%s)", info->getName().c_str(), info->getAccessString().c_str());
- if (info->mAccess != SIM_ACCESS_DOWN)
+ if (!info->isDown())
{
- S32 agent_count = LLWorldMap::getInstance()->mNumAgents[info->mHandle];
- if (region && region->getHandle() == info->mHandle)
+ S32 agent_count = info->getAgentCount();
+ if (region && (region->getHandle() == handle))
{
++agent_count; // Bump by 1 if we're here
}
@@ -1208,6 +1044,8 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
// zoomed out, so don't display anything about the count. JC
if (agent_count > 0)
{
+ // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable.
+ // The singular/plural switch form here under might make no sense in some languages. Don't do that.
message += llformat("\n%d ", agent_count);
if (agent_count == 1)
@@ -1223,7 +1061,7 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
tooltip_msg.assign( message );
// Optionally show region flags
- std::string region_flags = LLViewerRegion::regionFlagsToString(info->mRegionFlags);
+ std::string region_flags = info->getFlagsString();
if (!region_flags.empty())
{
@@ -1263,6 +1101,9 @@ static void drawDot(F32 x_pixels, F32 y_pixels,
}
else
{
+ // Draw V indicator for above or below
+ // *TODO: Replace this vector drawing with icons
+
F32 left = x_pixels - dot_radius;
F32 right = x_pixels + dot_radius;
F32 center = (left + right) * 0.5f;
@@ -1271,13 +1112,14 @@ static void drawDot(F32 x_pixels, F32 y_pixels,
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4fv( color.mV );
- LLUI::setLineWidth(1.5f);
- F32 h_bar = relative_z > HEIGHT_THRESHOLD ? top : bottom; // horizontal bar Y
+ LLUI::setLineWidth(3.0f);
+ F32 point = relative_z > HEIGHT_THRESHOLD ? top : bottom; // Y pos of the point of the V
+ F32 back = relative_z > HEIGHT_THRESHOLD ? bottom : top; // Y pos of the ends of the V
gGL.begin( LLRender::LINES );
- gGL.vertex2f(center, top);
- gGL.vertex2f(left, h_bar);
- gGL.vertex2f(right, h_bar);
- gGL.vertex2f(right, bottom);
+ gGL.vertex2f(left, back);
+ gGL.vertex2f(center, point);
+ gGL.vertex2f(center, point);
+ gGL.vertex2f(right, back);
gGL.end();
LLUI::setLineWidth(1.0f);
}
@@ -1292,7 +1134,7 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
F32 dot_radius)
{
const F32 HEIGHT_THRESHOLD = 7.f;
- LLUIImagePtr dot_image = sAvatarSmallImage;
+ LLUIImagePtr dot_image = sAvatarLevelImage;
if(relative_z < -HEIGHT_THRESHOLD)
{
dot_image = sAvatarBelowImage;
@@ -1301,10 +1143,12 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
{
dot_image = sAvatarAboveImage;
}
- dot_image->draw(
- llround(x_pixels) - dot_image->getWidth()/2,
- llround(y_pixels) - dot_image->getHeight()/2,
- color);
+ S32 dot_width = llround(dot_radius * 2.f);
+ dot_image->draw(llround(x_pixels - dot_radius),
+ llround(y_pixels - dot_radius),
+ dot_width,
+ dot_width,
+ color);
}
// Pass relative Z of 0 to draw at same level.
@@ -1565,7 +1409,7 @@ void LLWorldMapView::reshape( S32 width, S32 height, BOOL called_from_parent )
bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track)
{
- LLVector3 pos_view = globalPosToView(item.mPosGlobal);
+ LLVector3 pos_view = globalPosToView(item.getGlobalPosition());
S32 item_x = llround(pos_view.mV[VX]);
S32 item_y = llround(pos_view.mV[VY]);
@@ -1574,12 +1418,12 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo
if (y < item_y - BIG_DOT_RADIUS) return false;
if (y > item_y + BIG_DOT_RADIUS) return false;
- LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.mRegionHandle);
+ LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.getRegionHandle());
if (sim_info)
{
if (track)
{
- gFloaterWorldMap->trackLocation(item.mPosGlobal);
+ gFloaterWorldMap->trackLocation(item.getGlobalPosition());
}
}
@@ -1588,8 +1432,8 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo
gFloaterWorldMap->trackGenericItem(item);
}
- item.mSelected = TRUE;
- *id = item.mID;
+// item.setSelected(true);
+ *id = item.getUUID();
return true;
}
@@ -1612,108 +1456,116 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask,
*hit_type = 0; // hit nothing
- LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE;
- LLWorldMap::getInstance()->mIsTrackingDoubleClick = FALSE;
- LLWorldMap::getInstance()->mIsTrackingCommit = FALSE;
-
- LLWorldMap::item_info_list_t::iterator it;
-
- // clear old selected stuff
- for (it = LLWorldMap::getInstance()->mPGEvents.begin(); it != LLWorldMap::getInstance()->mPGEvents.end(); ++it)
- {
- (*it).mSelected = FALSE;
- }
- for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it)
- {
- (*it).mSelected = FALSE;
- }
- for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it)
- {
- (*it).mSelected = FALSE;
- }
- for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it)
- {
- (*it).mSelected = FALSE;
- }
-
- // Select event you clicked on
- if (gSavedSettings.getBOOL("MapShowEvents"))
- {
- for (it = LLWorldMap::getInstance()->mPGEvents.begin(); it != LLWorldMap::getInstance()->mPGEvents.end(); ++it)
- {
- LLItemInfo& event = *it;
-
- if (checkItemHit(x, y, event, id, false))
- {
- *hit_type = MAP_ITEM_PG_EVENT;
- mItemPicked = TRUE;
- gFloaterWorldMap->trackEvent(event);
- return;
- }
- }
- }
- if (gSavedSettings.getBOOL("ShowMatureEvents"))
- {
- for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it)
- {
- LLItemInfo& event = *it;
-
- if (checkItemHit(x, y, event, id, false))
- {
- *hit_type = MAP_ITEM_MATURE_EVENT;
- mItemPicked = TRUE;
- gFloaterWorldMap->trackEvent(event);
- return;
- }
- }
- }
- if (gSavedSettings.getBOOL("ShowAdultEvents"))
- {
- for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it)
- {
- LLItemInfo& event = *it;
-
- if (checkItemHit(x, y, event, id, false))
- {
- *hit_type = MAP_ITEM_ADULT_EVENT;
- mItemPicked = TRUE;
- gFloaterWorldMap->trackEvent(event);
- return;
- }
- }
- }
+ LLWorldMap::getInstance()->cancelTracking();
- if (gSavedSettings.getBOOL("MapShowLandForSale"))
+ S32 level = LLWorldMipmap::scaleToLevel(sMapScale);
+ // If the zoom level is not too far out already, test hits
+ if (level <= DRAW_SIMINFO_THRESHOLD)
{
- for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it)
- {
- LLItemInfo& land = *it;
+ bool show_mature = gAgent.canAccessMature() && gSavedSettings.getBOOL("ShowMatureEvents");
+ bool show_adult = gAgent.canAccessAdult() && gSavedSettings.getBOOL("ShowAdultEvents");
- if (checkItemHit(x, y, land, id, true))
- {
- *hit_type = MAP_ITEM_LAND_FOR_SALE;
- mItemPicked = TRUE;
- return;
- }
- }
-
- for (it = LLWorldMap::getInstance()->mLandForSaleAdult.begin(); it != LLWorldMap::getInstance()->mLandForSaleAdult.end(); ++it)
+ // Test hits if trackable data are displayed, otherwise, we don't even bother
+ if (gSavedSettings.getBOOL("MapShowEvents") || show_mature || show_adult || gSavedSettings.getBOOL("MapShowLandForSale"))
{
- LLItemInfo& land = *it;
-
- if (checkItemHit(x, y, land, id, true))
+ // Iterate through the visible regions
+ for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter)
{
- *hit_type = MAP_ITEM_LAND_FOR_SALE_ADULT;
- mItemPicked = TRUE;
- return;
+ U64 handle = *iter;
+ LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
+ if ((siminfo == NULL) || (siminfo->isDown()))
+ {
+ continue;
+ }
+ // If on screen check hits with the visible item lists
+ if (gSavedSettings.getBOOL("MapShowEvents"))
+ {
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getPGEvent().begin();
+ while (it != siminfo->getPGEvent().end())
+ {
+ LLItemInfo event = *it;
+ if (checkItemHit(x, y, event, id, false))
+ {
+ *hit_type = MAP_ITEM_PG_EVENT;
+ mItemPicked = TRUE;
+ gFloaterWorldMap->trackEvent(event);
+ return;
+ }
+ ++it;
+ }
+ }
+ if (show_mature)
+ {
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getMatureEvent().begin();
+ while (it != siminfo->getMatureEvent().end())
+ {
+ LLItemInfo event = *it;
+ if (checkItemHit(x, y, event, id, false))
+ {
+ *hit_type = MAP_ITEM_MATURE_EVENT;
+ mItemPicked = TRUE;
+ gFloaterWorldMap->trackEvent(event);
+ return;
+ }
+ ++it;
+ }
+ }
+ if (show_adult)
+ {
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getAdultEvent().begin();
+ while (it != siminfo->getAdultEvent().end())
+ {
+ LLItemInfo event = *it;
+ if (checkItemHit(x, y, event, id, false))
+ {
+ *hit_type = MAP_ITEM_ADULT_EVENT;
+ mItemPicked = TRUE;
+ gFloaterWorldMap->trackEvent(event);
+ return;
+ }
+ ++it;
+ }
+ }
+ if (gSavedSettings.getBOOL("MapShowLandForSale"))
+ {
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getLandForSale().begin();
+ while (it != siminfo->getLandForSale().end())
+ {
+ LLItemInfo event = *it;
+ if (checkItemHit(x, y, event, id, true))
+ {
+ *hit_type = MAP_ITEM_LAND_FOR_SALE;
+ mItemPicked = TRUE;
+ return;
+ }
+ ++it;
+ }
+ // for 1.23, we're showing normal land and adult land in the same UI; you don't
+ // get a choice about which ones you want. If you're currently asking for adult
+ // content and land you'll get the adult land.
+ if (gAgent.canAccessAdult())
+ {
+ LLSimInfo::item_info_list_t::const_iterator it = siminfo->getLandForSaleAdult().begin();
+ while (it != siminfo->getLandForSaleAdult().end())
+ {
+ LLItemInfo event = *it;
+ if (checkItemHit(x, y, event, id, true))
+ {
+ *hit_type = MAP_ITEM_LAND_FOR_SALE_ADULT;
+ mItemPicked = TRUE;
+ return;
+ }
+ ++it;
+ }
+ }
+ }
}
}
}
- // If we get here, we haven't clicked on an icon
+ // If we get here, we haven't clicked on anything
gFloaterWorldMap->trackLocation(pos_global);
mItemPicked = FALSE;
-
*id = LLUUID::null;
return;
}
@@ -1774,59 +1626,36 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask )
return FALSE;
}
-U32 LLWorldMapView::updateBlock(S32 block_x, S32 block_y)
+void LLWorldMapView::updateVisibleBlocks()
{
- U32 blocks_requested = 0;
- S32 offset = block_x | (block_y * MAP_BLOCK_RES);
- if (!LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset])
+ if (LLWorldMipmap::scaleToLevel(sMapScale) > DRAW_SIMINFO_THRESHOLD)
{
-// llinfos << "Loading Block (" << block_x << "," << block_y << ")" << llendl;
- LLWorldMap::getInstance()->sendMapBlockRequest(block_x << 3, block_y << 3, (block_x << 3) + 7, (block_y << 3) + 7);
- LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset] = TRUE;
- blocks_requested++;
+ // If we're zoomed out too much, we just don't load all those sim info: too much!
+ return;
}
- return blocks_requested;
-}
-U32 LLWorldMapView::updateVisibleBlocks()
-{
- if (gMapScale < SIM_MAP_SCALE)
- {
- // We don't care what is loaded if we're zoomed out
- return 0;
- }
+ // Load the blocks visible in the current World Map view
+ // Get the World Map view coordinates and boundaries
LLVector3d camera_global = gAgent.getCameraPositionGlobal();
-
- F32 pixels_per_region = gMapScale;
const S32 width = getRect().getWidth();
const S32 height = getRect().getHeight();
- // Convert pan to sim coordinates
- S32 world_center_x_lo = S32(((-sPanX - width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS));
- S32 world_center_x_hi = S32(((-sPanX + width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS));
- S32 world_center_y_lo = S32(((-sPanY - height/2) / pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS));
- S32 world_center_y_hi = S32(((-sPanY + height/2)/ pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS));
-
- // Find the corresponding 8x8 block
- S32 world_block_x_lo = world_center_x_lo >> 3;
- S32 world_block_x_hi = world_center_x_hi >> 3;
- S32 world_block_y_lo = world_center_y_lo >> 3;
- S32 world_block_y_hi = world_center_y_hi >> 3;
-
- U32 blocks_requested = 0;
- const U32 max_blocks_requested = 9;
+ const F32 half_width = F32(width) / 2.0f;
+ const F32 half_height = F32(height) / 2.0f;
- for (S32 block_x = llmax(world_block_x_lo, 0); block_x <= llmin(world_block_x_hi, MAP_BLOCK_RES-1); ++block_x)
- {
- for (S32 block_y = llmax(world_block_y_lo, 0); block_y <= llmin(world_block_y_hi, MAP_BLOCK_RES-1); ++block_y)
- {
- blocks_requested += updateBlock(block_x, block_y);
- if (blocks_requested >= max_blocks_requested)
- return blocks_requested;
- }
- }
- return blocks_requested;
-}
+ // Compute center into sim grid coordinates
+ S32 world_center_x = S32((-sPanX / sMapScale) + (camera_global.mdV[0] / REGION_WIDTH_METERS));
+ S32 world_center_y = S32((-sPanY / sMapScale) + (camera_global.mdV[1] / REGION_WIDTH_METERS));
+
+ // Compute the boundaries into sim grid coordinates
+ S32 world_left = world_center_x - S32(half_width / sMapScale) - 1;
+ S32 world_right = world_center_x + S32(half_width / sMapScale) + 1;
+ S32 world_bottom = world_center_y - S32(half_height / sMapScale) - 1;
+ S32 world_top = world_center_y + S32(half_height / sMapScale) + 1;
+
+ //LL_INFOS("World Map") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL;
+ LLWorldMap::getInstance()->updateRegions(world_left, world_bottom, world_right, world_top);
+}
BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )
{
@@ -1897,34 +1726,34 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
id.toString(uuid_str);
uuid_str = uuid_str.substr(28);
sscanf(uuid_str.c_str(), "%X", &event_id);
- LLFloaterReg::showInstance("search", LLSD().insert("category", "events").insert("id", event_id));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id));
break;
}
case MAP_ITEM_LAND_FOR_SALE:
case MAP_ITEM_LAND_FOR_SALE_ADULT:
{
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::showInstance("search", LLSD().insert("category", "destinations").insert("id", id));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("id", id));
break;
}
case MAP_ITEM_CLASSIFIED:
{
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::showInstance("search", LLSD().insert("category", "classifieds").insert("id", id));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("id", id));
break;
}
default:
{
- if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation)
+ if (LLWorldMap::getInstance()->isTracking())
{
- LLWorldMap::getInstance()->mIsTrackingDoubleClick = TRUE;
+ LLWorldMap::getInstance()->setTrackingDoubleClick();
}
else
{
// Teleport if we got a valid location
LLVector3d pos_global = viewPosToGlobal(x,y);
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
- if (sim_info && sim_info->mAccess != SIM_ACCESS_DOWN)
+ if (sim_info && !sim_info->isDown())
{
gAgent.teleportViaLocation( pos_global );
}
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 66793f0101..9eecacb2d8 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -30,27 +30,23 @@
* $/LicenseInfo$
*/
-// Global map of the world.
+// View of the global map of the world
+
+// The data (model) for the global map (a singleton, unique to the application instance) is
+// in LLWorldMap and is typically accessed using LLWorldMap::getInstance()
#ifndef LL_LLWORLDMAPVIEW_H
#define LL_LLWORLDMAPVIEW_H
#include "llpanel.h"
-#include "v3math.h"
-#include "v3dmath.h"
-#include "v4color.h"
-#include "llviewertexture.h"
-#include "llmapimagetype.h"
#include "llworldmap.h"
-
-class LLItemInfo;
+#include "v4color.h"
const S32 DEFAULT_TRACKING_ARROW_SIZE = 16;
-class LLColor4;
-class LLColor4U;
-class LLCoordGL;
-class LLViewerTexture;
+class LLUUID;
+class LLVector3d;
+class LLVector3;
class LLTextBox;
@@ -77,22 +73,26 @@ public:
bool checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track);
void handleClick(S32 x, S32 y, MASK mask, S32* hit_type, LLUUID* id);
- // Scale and pan are shared across all instances.
+ // Scale and pan are shared across all instances! (i.e. Terrain and Objects maps are always registered)
static void setScale( F32 scale );
static void translatePan( S32 delta_x, S32 delta_y );
static void setPan( S32 x, S32 y, BOOL snap = TRUE );
+ // Return true if the current scale level is above the threshold for accessing region info
+ static bool showRegionInfo();
LLVector3 globalPosToView(const LLVector3d& global_pos);
LLVector3d viewPosToGlobal(S32 x,S32 y);
virtual void draw();
- void drawGenericItems(const LLWorldMap::item_info_list_t& items, LLUIImagePtr image);
+ void drawGenericItems(const LLSimInfo::item_info_list_t& items, LLUIImagePtr image);
void drawGenericItem(const LLItemInfo& item, LLUIImagePtr image);
void drawImage(const LLVector3d& global_pos, LLUIImagePtr image, const LLColor4& color = LLColor4::white);
void drawImageStack(const LLVector3d& global_pos, LLUIImagePtr image, U32 count, F32 offset, const LLColor4& color);
void drawAgents();
- void drawEvents();
+ void drawItems();
void drawFrustum();
+ void drawMipmap(S32 width, S32 height);
+ bool drawMipmapLevel(S32 width, S32 height, S32 level, bool load = true);
static void cleanupTextures();
@@ -108,7 +108,7 @@ public:
F32 y_pixels,
const LLColor4& color,
F32 relative_z = 0.f,
- F32 dot_radius = 3.f);
+ F32 dot_radius = 5.f);
static void drawTrackingCircle( const LLRect& rect, S32 x, S32 y,
const LLColor4& color,
@@ -129,9 +129,7 @@ public:
static void clearLastClick() { sHandledLastClick = FALSE; }
// if the view changes, download additional sim info as needed
- // return value is number of blocks newly requested.
- U32 updateBlock(S32 block_x, S32 block_y);
- U32 updateVisibleBlocks();
+ void updateVisibleBlocks();
protected:
void setDirectionPos( LLTextBox* text_box, F32 rotation );
@@ -140,11 +138,13 @@ protected:
public:
LLColor4 mBackgroundColor;
- static LLUIImagePtr sAvatarYouSmallImage;
static LLUIImagePtr sAvatarSmallImage;
- static LLUIImagePtr sAvatarLargeImage;
+ static LLUIImagePtr sAvatarYouImage;
+ static LLUIImagePtr sAvatarYouLargeImage;
+ static LLUIImagePtr sAvatarLevelImage;
static LLUIImagePtr sAvatarAboveImage;
static LLUIImagePtr sAvatarBelowImage;
+
static LLUIImagePtr sTelehubImage;
static LLUIImagePtr sInfohubImage;
static LLUIImagePtr sHomeImage;
@@ -157,9 +157,7 @@ public:
static LLUIImagePtr sForSaleImage;
static LLUIImagePtr sForSaleAdultImage;
- static F32 sThresholdA;
- static F32 sThresholdB;
- static F32 sPixelsPerMeter; // world meters to map pixels
+ static F32 sMapScale; // scale = size of a region in pixels
BOOL mItemPicked;
@@ -169,6 +167,7 @@ public:
static F32 sTargetPanY; // in pixels
static S32 sTrackingArrowX;
static S32 sTrackingArrowY;
+ static bool sVisibleTilesLoaded;
// Are we mid-pan from a user drag?
BOOL mPanning;
@@ -191,10 +190,14 @@ public:
static BOOL sHandledLastClick;
S32 mSelectIDStart;
+ // Keep the list of regions that are displayed on screen. Avoids iterating through the whole region map after draw().
typedef std::vector<U64> handle_list_t;
handle_list_t mVisibleRegions; // set every frame
static std::map<std::string,std::string> sStringsMap;
+
+private:
+ void drawTileOutline(S32 level, F32 top, F32 left, F32 bottom, F32 right);
};
#endif
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
new file mode 100644
index 0000000000..1cdccd2baa
--- /dev/null
+++ b/indra/newview/llworldmipmap.cpp
@@ -0,0 +1,274 @@
+/**
+ * @file llworldmipmap.cpp
+ * @brief Data storage for the S3 mipmap of the entire world.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llworldmipmap.h"
+
+#include "llviewertexturelist.h"
+#include "math.h" // log()
+
+// Turn this on to output tile stats in the standard output
+#define DEBUG_TILES_STAT 0
+
+LLWorldMipmap::LLWorldMipmap() :
+ mCurrentLevel(0)
+{
+}
+
+LLWorldMipmap::~LLWorldMipmap()
+{
+ reset();
+}
+
+// Delete all sublevel maps and clean them
+void LLWorldMipmap::reset()
+{
+ for (int level = 0; level < MAP_LEVELS; level++)
+ {
+ mWorldObjectsMipMap[level].clear();
+ }
+}
+
+// This method should be called before each use of the mipmap (typically, before each draw), so that to let
+// the boost level of unused tiles to drop to 0 (BOOST_NONE).
+// Tiles that are accessed have had their boost level pushed to BOOST_MAP_VISIBLE so we can identify them.
+// The result of this strategy is that if a tile is not used during 2 consecutive loops, its boost level drops to 0.
+void LLWorldMipmap::equalizeBoostLevels()
+{
+#if DEBUG_TILES_STAT
+ S32 nb_missing = 0;
+ S32 nb_tiles = 0;
+ S32 nb_visible = 0;
+#endif // DEBUG_TILES_STAT
+ // For each level
+ for (S32 level = 0; level < MAP_LEVELS; level++)
+ {
+ sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level];
+ // For each tile
+ for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++)
+ {
+ LLPointer<LLViewerFetchedTexture> img = iter->second;
+ S32 current_boost_level = img->getBoostLevel();
+ if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE)
+ {
+ // If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high
+ img->setBoostLevel(LLViewerTexture::BOOST_MAP);
+ }
+ else
+ {
+ // If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw
+ // so we drop its boost level to BOOST_NONE.
+ img->setBoostLevel(LLViewerTexture::BOOST_NONE);
+ }
+#if DEBUG_TILES_STAT
+ // Increment some stats if compile option on
+ nb_tiles++;
+ if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE)
+ {
+ nb_visible++;
+ }
+ if (img->isMissingAsset())
+ {
+ nb_missing++;
+ }
+#endif // DEBUG_TILES_STAT
+ }
+ }
+#if DEBUG_TILES_STAT
+ LL_INFOS("World Map") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL;
+#endif // DEBUG_TILES_STAT
+}
+
+// This method should be used when the mipmap is not actively used for a while, e.g., the map UI is hidden
+void LLWorldMipmap::dropBoostLevels()
+{
+ // For each level
+ for (S32 level = 0; level < MAP_LEVELS; level++)
+ {
+ sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level];
+ // For each tile
+ for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++)
+ {
+ LLPointer<LLViewerFetchedTexture> img = iter->second;
+ img->setBoostLevel(LLViewerTexture::BOOST_NONE);
+ }
+ }
+}
+
+LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load)
+{
+ // Check the input data
+ llassert(level <= MAP_LEVELS);
+ llassert(level >= 1);
+
+ // If the *loading* level changed, cleared the new level from "missed" tiles
+ // so that we get a chance to reload them
+ if (load && (level != mCurrentLevel))
+ {
+ cleanMissedTilesFromLevel(level);
+ mCurrentLevel = level;
+ }
+
+ // Build the region handle
+ U64 handle = convertGridToHandle(grid_x, grid_y);
+
+ // Check if the image is around already
+ sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1];
+ sublevel_tiles_t::iterator found = level_mipmap.find(handle);
+
+ // If not there and load on, go load it
+ if (found == level_mipmap.end())
+ {
+ if (load)
+ {
+ // Load it
+ LLPointer<LLViewerFetchedTexture> img = loadObjectsTile(grid_x, grid_y, level);
+ // Insert the image in the map
+ level_mipmap.insert(sublevel_tiles_t::value_type( handle, img ));
+ // Find the element again in the map (it's there now...)
+ found = level_mipmap.find(handle);
+ }
+ else
+ {
+ // Return with NULL if not found and we're not trying to load
+ return NULL;
+ }
+ }
+
+ // Get the image pointer and check if this asset is missing
+ LLPointer<LLViewerFetchedTexture> img = found->second;
+ if (img->isMissingAsset())
+ {
+ // Return NULL if asset missing
+ return NULL;
+ }
+ else
+ {
+ // Boost the tile level so to mark it's in use *if* load on
+ if (load)
+ {
+ img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE);
+ }
+ return img;
+ }
+}
+
+LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
+{
+ // Get the grid coordinates
+ std::string imageurl = llformat("http://map.secondlife.com.s3.amazonaws.com/map-%d-%d-%d-objects.jpg",
+ level, grid_x, grid_y);
+
+ // DO NOT COMMIT!! DEBUG ONLY!!!
+ // Use a local jpeg for every tile to test map speed without S3 access
+ //imageurl = "file://C:\\Develop\\mapserver-distribute-3\\indra\\build-vc80\\mapserver\\relwithdebinfo\\regions\\00995\\01001\\region-995-1001-prims.jpg";
+ // END DEBUG
+ //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
+
+ LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ img->setBoostLevel(LLViewerTexture::BOOST_MAP);
+
+ // Return the smart pointer
+ return img;
+}
+
+// This method is used to clean up a level from tiles marked as "missing".
+// The idea is to allow tiles that have been improperly marked missing to be reloaded when retraversing the level again.
+// When zooming in and out rapidly, some tiles are never properly loaded and, eventually marked missing.
+// This creates "blue" areas in a subresolution that never got a chance to reload if we don't clean up the level.
+void LLWorldMipmap::cleanMissedTilesFromLevel(S32 level)
+{
+ // Check the input data
+ llassert(level <= MAP_LEVELS);
+ llassert(level >= 0);
+
+ // This happens when the object is first initialized
+ if (level == 0)
+ {
+ return;
+ }
+
+ // Iterate through the subresolution level and suppress the tiles that are marked as missing
+ // Note: erasing in a map while iterating through it is bug prone. Using a postfix increment is mandatory here.
+ sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1];
+ sublevel_tiles_t::iterator it = level_mipmap.begin();
+ while (it != level_mipmap.end())
+ {
+ LLPointer<LLViewerFetchedTexture> img = it->second;
+ if (img->isMissingAsset())
+ {
+ level_mipmap.erase(it++);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+ return;
+}
+
+// static methods
+// Compute the level in the world mipmap (between 1 and MAP_LEVELS, as in the URL) given the scale (size of a sim in screen pixels)
+S32 LLWorldMipmap::scaleToLevel(F32 scale)
+{
+ // If scale really small, picks up the higest level there is (lowest resolution)
+ if (scale <= F32_MIN)
+ return MAP_LEVELS;
+ // Compute the power of two resolution level knowing the base level
+ S32 level = llfloor((log(REGION_WIDTH_METERS/scale)/log(2.0f)) + 1.0f);
+ // Check bounds and return the value
+ if (level > MAP_LEVELS)
+ return MAP_LEVELS;
+ else if (level < 1)
+ return 1;
+ else
+ return level;
+}
+
+// Convert world coordinates to mipmap grid coordinates at a given level (between 1 and MAP_LEVELS)
+void LLWorldMipmap::globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y)
+{
+ // Check the input data
+ llassert(level <= MAP_LEVELS);
+ llassert(level >= 1);
+
+ // Convert world coordinates into grid coordinates
+ *grid_x = lltrunc(global_x/REGION_WIDTH_METERS);
+ *grid_y = lltrunc(global_y/REGION_WIDTH_METERS);
+ // Compute the valid grid coordinates at that level of the mipmap
+ S32 regions_in_tile = 1 << (level - 1);
+ *grid_x = *grid_x - (*grid_x % regions_in_tile);
+ *grid_y = *grid_y - (*grid_y % regions_in_tile);
+}
+
+
diff --git a/indra/newview/llworldmipmap.h b/indra/newview/llworldmipmap.h
new file mode 100644
index 0000000000..ecf1003468
--- /dev/null
+++ b/indra/newview/llworldmipmap.h
@@ -0,0 +1,100 @@
+/**
+ * @file llworldmipmap.h
+ * @brief Data storage for the S3 mipmap of the entire world.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWORLDMIPMAP_H
+#define LL_LLWORLDMIPMAP_H
+
+#include <map>
+
+#include "llmemory.h" // LLPointer
+#include "indra_constants.h" // REGION_WIDTH_UNITS
+#include "llregionhandle.h" // to_region_handle()
+
+class LLViewerFetchedTexture;
+
+// LLWorldMipmap : Mipmap handling of all the tiles used to render the world at any resolution.
+// This class provides a clean structured access to the hierarchy of tiles stored in the
+// Amazon S3 repository and abstracts its directory/file structure.
+// The interface of this class though still assumes that the caller knows the general level/tiles
+// structure (at least, that it exists...) but doesn't requite the caller to know the details of it.
+// IOW, you need to know that rendering levels exists as well as grid coordinates for regions,
+// but you can ignore where those tiles are located, how to get them, etc...
+// The class API gives you back LLPointer<LLViewerFetchedTexture> per tile.
+
+// See llworldmipmapview.cpp for the implementation of a class who knows how to render an LLWorldMipmap.
+
+// Implementation notes:
+// - On the S3 servers, the tiles are rendered in 2 flavors: Objects and Terrain.
+// - For the moment, LLWorldMipmap implements access only to the Objects tiles.
+class LLWorldMipmap
+{
+public:
+ // Parameters of the mipmap
+ static const S32 MAP_LEVELS = 8; // Number of subresolution levels computed by the mapserver
+ static const S32 MAP_TILE_SIZE = 256; // Width in pixels of the tiles computed by the mapserver
+
+ LLWorldMipmap();
+ ~LLWorldMipmap();
+
+ // Clear up the maps and release all image handles
+ void reset();
+ // Manage the boost levels between loops (typically draw() loops)
+ void equalizeBoostLevels();
+ // Drop the boost levels to none (used when hiding the map)
+ void dropBoostLevels();
+ // Get the tile smart pointer, does the loading if necessary
+ LLPointer<LLViewerFetchedTexture> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true);
+
+ // Helper functions: those are here as they depend solely on the topology of the mipmap though they don't access it
+ // Convert sim scale (given in sim width in display pixels) into a mipmap level
+ static S32 scaleToLevel(F32 scale);
+ // Convert world coordinates to mipmap grid coordinates at a given level
+ static void globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y);
+
+private:
+ // Get a handle (key) from grid coordinates
+ U64 convertGridToHandle(U32 grid_x, U32 grid_y) { return to_region_handle(grid_x * REGION_WIDTH_UNITS, grid_y * REGION_WIDTH_UNITS); }
+ // Load the relevant tile from S3
+ LLPointer<LLViewerFetchedTexture> loadObjectsTile(U32 grid_x, U32 grid_y, S32 level);
+ // Clear a level from its "missing" tiles
+ void cleanMissedTilesFromLevel(S32 level);
+
+ // The mipmap is organized by resolution level (MAP_LEVELS of them). Each resolution level is an std::map
+ // using a region_handle as a key and storing a smart pointer to the image as a value.
+ typedef std::map<U64, LLPointer<LLViewerFetchedTexture> > sublevel_tiles_t;
+ sublevel_tiles_t mWorldObjectsMipMap[MAP_LEVELS];
+// sublevel_tiles_t mWorldTerrainMipMap[MAP_LEVELS];
+
+ S32 mCurrentLevel; // The level last accessed by a getObjectsTile()
+};
+
+#endif // LL_LLWORLDMIPMAP_H
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index af8cb6b9fb..15417614af 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -21,13 +21,14 @@
// external library headers
#include <boost/scoped_ptr.hpp>
#include <boost/range.hpp> // boost::begin(), boost::end()
+#include <xmlrpc-epi/xmlrpc.h>
+#include "curl/curl.h"
+
// other Linden headers
#include "llerror.h"
#include "stringize.h"
#include "llxmlrpctransaction.h"
-#include <xmlrpc-epi/xmlrpc.h>
-
#if LL_WINDOWS
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 70859e8ea5..c19be37e75 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -252,9 +252,8 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);
- BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert);
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0);
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify());
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify() ? 2 : 0);
// Be a little impatient about establishing connections.
mCurlRequest->setopt(CURLOPT_CONNECTTIMEOUT, 40L);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a37de468b3..57e75ddf30 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -344,7 +344,9 @@ LLPipeline::LLPipeline() :
mWLSkyPool(NULL),
mLightMask(0),
mLightMovingMask(0),
- mLightingDetail(0)
+ mLightingDetail(0),
+ mScreenWidth(0),
+ mScreenHeight(0)
{
mNoiseMap = 0;
mTrueNoiseMap = 0;
@@ -475,8 +477,6 @@ void LLPipeline::cleanup()
releaseGLBuffers();
- mBloomImagep = NULL;
- mBloomImage2p = NULL;
mFaceSelectImagep = NULL;
mMovedBridge.clear();
@@ -506,24 +506,28 @@ void LLPipeline::destroyGL()
}
}
+static LLFastTimer::DeclareTimer FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture");
void LLPipeline::resizeScreenTexture()
{
+ LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE);
if (gPipeline.canUseVertexShaders() && assertInitialized())
{
- GLuint resX = gViewerWindow->getWorldViewWidth();
- GLuint resY = gViewerWindow->getWorldViewHeight();
+ GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ GLuint resY = gViewerWindow->getWorldViewHeightRaw();
allocateScreenBuffer(resX,resY);
-
- llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
}
}
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
+ // remember these dimensions
+ mScreenWidth = resX;
+ mScreenHeight = resY;
+
U32 samples = gSavedSettings.getU32("RenderFSAASamples");
-
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
+
if (res_mod > 1 && res_mod < resX && res_mod < resY)
{
resX /= res_mod;
@@ -541,6 +545,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
addDeferredAttachments(mDeferredScreen);
+
+ // always set viewport to desired size, since allocate resets the viewport
+
mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
@@ -585,14 +592,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (gGLManager.mHasFramebufferMultisample && samples > 1)
{
mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
- mScreen.setSampleBuffer(&mSampleBuffer);
-
if (LLPipeline::sRenderDeferred)
{
addDeferredAttachments(mSampleBuffer);
mDeferredScreen.setSampleBuffer(&mSampleBuffer);
}
+ mScreen.setSampleBuffer(&mSampleBuffer);
+
stop_glerror();
}
@@ -696,8 +703,8 @@ void LLPipeline::createGLBuffers()
stop_glerror();
- GLuint resX = gViewerWindow->getWorldViewWidth();
- GLuint resY = gViewerWindow->getWorldViewHeight();
+ GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ GLuint resY = gViewerWindow->getWorldViewHeightRaw();
if (LLPipeline::sRenderGlow)
{ //screen space glow buffers
@@ -710,6 +717,9 @@ void LLPipeline::createGLBuffers()
}
allocateScreenBuffer(resX,resY);
+ mScreenWidth = 0;
+ mScreenHeight = 0;
+
}
if (sRenderDeferred)
@@ -1343,6 +1353,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
if (!drawablep)
{
llerrs << "updateMove called with NULL drawablep" << llendl;
+ return;
}
if (drawablep->isState(LLDrawable::EARLY_MOVE))
{
@@ -1464,6 +1475,7 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera
F32 dist = lookAt.length();
//ramp down distance for nearby objects
+ //shrink dist by dist/16.
if (dist < 16.f)
{
dist /= 16.f;
@@ -1474,7 +1486,7 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera
//get area of circle around node
F32 app_angle = atanf(size.length()/dist);
F32 radius = app_angle*LLDrawable::sCurPixelAngle;
- return radius*radius * 3.14159f;
+ return radius*radius * F_PI;
}
void LLPipeline::grabReferences(LLCullResult& result)
@@ -1957,7 +1969,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if (root && root->getParent() && root->getVObj() && root->getVObj()->isAttachment())
{
LLVOAvatar* av = root->getParent()->getVObj()->asAvatar();
- if (av->isImpostor())
+ if (av && av->isImpostor())
{
return;
}
@@ -2776,10 +2788,8 @@ void render_hud_elements()
LLViewerParcelMgr::getInstance()->render();
LLViewerParcelMgr::getInstance()->renderParcelCollision();
- // Render debugging beacons.
- //gObjectList.renderObjectBeacons();
- //LLHUDObject::renderAll();
- //gObjectList.resetObjectBeacons();
+ // Render name tags.
+ LLHUDObject::renderAll();
}
else if (gForceRenderLandFence)
{
@@ -3002,15 +3012,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:ForceVBO");
- //by bao
- //fake vertex buffer updating
- //to guaranttee at least updating one VBO buffer every frame
- //to walk around the bug caused by ATI card --> DEV-3855
- //
- if(forceVBOUpdate)
- gSky.mVOSkyp->updateDummyVertexBuffer() ;
-
-
// Initialize lots of GL state to "safe" values
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
@@ -3057,7 +3058,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING))
{
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect");
- gObjectList.renderObjectsForSelect(camera, gViewerWindow->getVirtualWindowRect());
+ gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled());
}
else
{
@@ -3199,7 +3200,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
@@ -3431,7 +3431,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
@@ -3764,9 +3763,10 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
gGL.setColorMask(true, false);
gPipeline.resetDrawOrders();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (std::set<LLViewerObject*>::iterator iter = objects.begin(); iter != objects.end(); ++iter)
{
- stateSort((*iter)->mDrawable, *LLViewerCamera::getInstance());
+ stateSort((*iter)->mDrawable, *camera);
}
LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_SELECT);
@@ -5538,8 +5538,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
LLVector2 tc1(0,0);
- LLVector2 tc2((F32) gViewerWindow->getWorldViewWidth()*2,
- (F32) gViewerWindow->getWorldViewHeight()*2);
+ LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
+ (F32) gViewerWindow->getWorldViewHeightRaw()*2);
if (res_mod > 1)
{
@@ -5739,14 +5739,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
- gGLViewport[0] = gViewerWindow->getWorldViewRect().mLeft;
- gGLViewport[1] = gViewerWindow->getWorldViewRect().mBottom;
- gGLViewport[2] = gViewerWindow->getWorldViewRect().getWidth();
- gGLViewport[3] = gViewerWindow->getWorldViewRect().getHeight();
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- tc2.setVec((F32) gViewerWindow->getWorldViewWidth(),
- (F32) gViewerWindow->getWorldViewHeight());
+ tc2.setVec((F32) gViewerWindow->getWorldViewWidthRaw(),
+ (F32) gViewerWindow->getWorldViewHeightRaw());
gGL.flush();
@@ -6244,6 +6244,7 @@ void LLPipeline::renderDeferredLighting()
{
LLFastTimer ftm(FTM_RENDER_DEFERRED);
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
{
LLGLDepthTest depth(GL_TRUE);
mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
@@ -6346,7 +6347,8 @@ void LLPipeline::renderDeferredLighting()
mDeferredLight[0].flush();
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight"))
+ if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
+ gSavedSettings.getBOOL("RenderDeferredGI"))
{
LLFastTimer ftm(FTM_EDGE_DETECTION);
//get edge map
@@ -6637,7 +6639,7 @@ void LLPipeline::renderDeferredLighting()
continue;
}
- if (LLViewerCamera::getInstance()->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
+ if (camera->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
{
continue;
}
@@ -6661,12 +6663,12 @@ void LLPipeline::renderDeferredLighting()
v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
- if (LLViewerCamera::getInstance()->getOrigin().mV[0] > c[0] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[0] < c[0] - s - 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[1] > c[1] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[1] < c[1] - s - 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[2] > c[2] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[2] < c[2] - s - 0.2f)
+ if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
+ camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
+ camera->getOrigin().mV[1] > c[1] + s + 0.2f ||
+ camera->getOrigin().mV[1] < c[1] - s - 0.2f ||
+ camera->getOrigin().mV[2] > c[2] + s + 0.2f ||
+ camera->getOrigin().mV[2] < c[2] - s - 0.2f)
{ //draw box if camera is outside box
if (render_local)
{
@@ -6681,7 +6683,7 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
stop_glerror();
}
}
@@ -6746,7 +6748,7 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
}
gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
@@ -7183,6 +7185,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
glClearColor(0,0,0,0);
mWaterRef.bindTarget();
+ gGL.setColorMask(true, true);
+ mWaterRef.clear();
+ gGL.setColorMask(true, false);
+
mWaterRef.getViewport(gGLViewport);
stop_glerror();
@@ -7215,6 +7221,21 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
U32 ref_mask = 0;
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
+ //initial sky pass (no user clip plane)
+ { //mask out everything but the sky
+ U32 tmp = mRenderTypeMask;
+ mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |
+ (1 << LLPipeline::RENDER_TYPE_WL_SKY));
+ static LLCullResult result;
+ updateCull(camera, result);
+ stateSort(camera, result);
+ mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |
+ (1 << LLPipeline::RENDER_TYPE_CLOUDS) |
+ (1 << LLPipeline::RENDER_TYPE_WL_SKY));
+ renderGeom(camera, TRUE);
+ mRenderTypeMask = tmp;
+ }
+
U32 mask = mRenderTypeMask;
mRenderTypeMask &= ~((1<<LLPipeline::RENDER_TYPE_WATER) |
(1<<LLPipeline::RENDER_TYPE_GROUND) |
@@ -7242,38 +7263,12 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLDisable cull(GL_CULL_FACE);
updateCull(camera, ref_result, 1);
stateSort(camera, ref_result);
- gGL.setColorMask(true, true);
- mWaterRef.clear();
- gGL.setColorMask(true, false);
-
- }
- else
- {
- gGL.setColorMask(true, true);
- mWaterRef.clear();
- gGL.setColorMask(true, false);
}
-
+
ref_mask = mRenderTypeMask;
mRenderTypeMask = mask;
}
- //initial sky pass (no user clip plane)
- { //mask out everything but the sky
- U32 tmp = mRenderTypeMask;
- mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |
- (1 << LLPipeline::RENDER_TYPE_WL_SKY));
- static LLCullResult result;
- updateCull(camera, result);
- stateSort(camera, result);
- mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |
- (1 << LLPipeline::RENDER_TYPE_CLOUDS) |
- (1 << LLPipeline::RENDER_TYPE_WL_SKY));
- renderGeom(camera, TRUE);
- mRenderTypeMask = tmp;
- }
-
-
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
mRenderTypeMask = ref_mask;
@@ -7908,6 +7903,7 @@ void LLPipeline::generateHighlight(LLCamera& camera)
mHighlight.flush();
gGL.setColorMask(true, false);
+ gViewerWindow->setup3DViewport();
}
}
@@ -8679,7 +8675,8 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
sShadowRender = TRUE;
sImpostorRender = TRUE;
- markVisible(avatar->mDrawable, *LLViewerCamera::getInstance());
+ LLViewerCamera* viewer_camera = LLViewerCamera::getInstance();
+ markVisible(avatar->mDrawable, *viewer_camera);
LLVOAvatar::sUseImpostors = FALSE;
LLVOAvatar::attachment_map_t::iterator iter;
@@ -8694,7 +8691,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
if (LLViewerObject* attached_object = (*attachment_iter))
{
- markVisible(attached_object->mDrawable->getSpatialBridge(), *LLViewerCamera::getInstance());
+ markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
}
}
@@ -8704,9 +8701,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
const LLVector3* ext = avatar->mDrawable->getSpatialExtents();
LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
- LLCamera camera = *LLViewerCamera::getInstance();
+ LLCamera camera = *viewer_camera;
- camera.lookAt(LLViewerCamera::getInstance()->getOrigin(), pos, LLViewerCamera::getInstance()->getUpAxis());
+ camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis());
LLVector2 tdim;
@@ -8749,7 +8746,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
glClearStencil(0);
// get the number of pixels per angle
- F32 pa = gViewerWindow->getWindowDisplayHeight() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView());
+ F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
//get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing)
U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index ce50a37405..711d40b138 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -467,6 +467,9 @@ public:
static F32 sMinRenderSize;
//screen texture
+ U32 mScreenWidth;
+ U32 mScreenHeight;
+
LLRenderTarget mScreen;
LLRenderTarget mUIScreen;
LLRenderTarget mDeferredScreen;
@@ -673,8 +676,6 @@ protected:
std::vector<LLFace*> mSelectedFaces;
LLPointer<LLViewerFetchedTexture> mFaceSelectImagep;
- LLPointer<LLViewerTexture> mBloomImagep;
- LLPointer<LLViewerTexture> mBloomImage2p;
U32 mLightMask;
U32 mLightMovingMask;
@@ -691,6 +692,7 @@ public:
};
void render_bbox(const LLVector3 &min, const LLVector3 &max);
+void render_hud_elements();
extern LLPipeline gPipeline;
extern BOOL gRenderForSelect;
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 433070ce34..38291e45c9 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -134,8 +134,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,3256
- PRODUCTVERSION 2,0,0,3256
+ FILEVERSION 2,0,0,200030
+ PRODUCTVERSION 2,0,0,200030
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -152,12 +152,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Linden Lab"
VALUE "FileDescription", "Second Life"
- VALUE "FileVersion", "2.0.0.3256"
+ VALUE "FileVersion", "2.0.0.200030"
VALUE "InternalName", "Second Life"
VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
VALUE "OriginalFilename", "SecondLife.exe"
VALUE "ProductName", "Second Life"
- VALUE "ProductVersion", "2.0.0.3256"
+ VALUE "ProductVersion", "2.0.0.200030"
END
END
BLOCK "VarFileInfo"
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 287c997c65..45050de044 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -47,7 +47,7 @@
<color
name="Black"
value="0 0 0 1" />
- <color
+ <colork
name="Black_10"
value="0 0 0 0.1" />
<color
@@ -57,28 +57,48 @@
name="Black_50"
value="0 0 0 0.5" />
<color
- name="Red"
- value="1 0 0 1" />
+ name="FrogGreen"
+ value="0.26 0.345 0.263 1" />
<color
- name="Green"
- value="0 1 0 1" />
+ name="Red"
+ value="0.729 0 0.121 1" />
<color
name="Blue"
value="0 0 1 1" />
<color
- name="Unused?"
- value="1 0 1 1" />
+ name="Yellow"
+ value="1 1 0 1" />
+ <color
+ name="Green"
+ value="0 1 0 1" />
<color
name="Transparent"
value="0 0 0 0" />
+ <color
+ name="Purple"
+ value="1 0 1 1" />
+ <color
+ name="Lime"
+ value=".8 1 .73 1" />
+ <color
+ name="LtYellow"
+ value="1 1 .79 1" />
+ <color
+ name="LtOrange"
+ value="1 .85 .73 1" />
+ <!-- This color name makes potentially unused colors show up bright purple.
+ Leave this here until all Unused? are removed below, otherwise
+ the viewer generates many warnings on startup. -->
+ <color
+ name="Unused?"
+ value=".831 1 0 1" />
+ <!-- UI Definitions -->
- <!-- UI Definitions -->
-
- <color
+ <color
name="AgentChatColor"
- reference="LtGray" />
+ reference="White" />
<color
name="AlertBoxColor"
value="0.24 0.24 0.24 1" />
@@ -87,7 +107,7 @@
value="1 0.82 0.46 1" />
<color
name="AlertCautionTextColor"
- reference="Black" />
+ reference="LtYellow" />
<color
name="AgentLinkColor"
reference="White" />
@@ -98,6 +118,24 @@
name="AvatarNameColor"
reference="White" />
<color
+ name="AvatarListItemIconDefaultColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOnlineColor"
+ reference="White" />
+ <color
+ name="AvatarListItemIconOfflineColor"
+ value="0.5 0.5 0.5 0.5" />
+ <color
+ name="AvatarListItemIconVoiceInvitedColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
+ name="AvatarListItemIconVoiceJoinedColor"
+ reference="AvatarListItemIconOnlineColor" />
+ <color
+ name="AvatarListItemIconVoiceLeftColor"
+ reference="AvatarListItemIconOfflineColor" />
+ <color
name="BackgroundChatColor"
reference="DkGray_66" />
<color
@@ -146,11 +184,14 @@
name="ChatHistoryTextColor"
reference="LtGray" />
<color
+ name="ChicletFlashColor"
+ value="0.114 0.65 0.1" />
+ <color
name="ColorDropShadow"
reference="Black_50" />
<color
name="ColorPaletteEntry01"
- value="0 0 0 1" />
+ reference="Black" />
<color
name="ColorPaletteEntry02"
value="0.5 0.5 0.5 1" />
@@ -192,34 +233,34 @@
value="0.5 0.25 0 1" />
<color
name="ColorPaletteEntry15"
- value="1 1 1 1" />
+ reference="White" />
<color
name="ColorPaletteEntry16"
- value="1 1 1 1" />
+ reference="LtYellow" />
<color
name="ColorPaletteEntry17"
- value="1 1 1 1" />
+ reference="LtGreen" />
<color
name="ColorPaletteEntry18"
- value="0.75 0.75 0.75 1" />
+ reference="LtGray" />
<color
name="ColorPaletteEntry19"
- value="1 0 0 1" />
+ reference="Red" />
<color
name="ColorPaletteEntry20"
- reference="Unused?" />
+ reference=".5 .5 1 0" />
<color
name="ColorPaletteEntry21"
- value="0 1 0 1" />
+ reference="Green" />
<color
name="ColorPaletteEntry22"
value="0 1 1 1" />
<color
name="ColorPaletteEntry23"
- value="0 0 1 1" />
+ reference="Blue" />
<color
name="ColorPaletteEntry24"
- value="1 0 1 1" />
+ reference="Purple" />
<color
name="ColorPaletteEntry25"
value="1 1 0.5 1" />
@@ -240,16 +281,19 @@
value="1 0.5 0 1" />
<color
name="ColorPaletteEntry31"
- value="1 1 1 1" />
+ reference="White" />
<color
name="ColorPaletteEntry32"
- value="1 1 1 1" />
+ reference="White" />
+ <color
+ name="ComboListBgColor"
+ reference="DkGray" />
<color
name="ConsoleBackground"
reference="Black" />
<color
name="ContextSilhouetteColor"
- value="0.94 0.61 0 1" />
+ reference="EmphasisColor" />
<color
name="DefaultHighlightDark"
reference="White_10" />
@@ -267,10 +311,10 @@
reference="White" />
<color
name="FilterBackgroundColor"
- reference="DkGray" />
+ reference="Black" />
<color
name="FilterTextColor"
- value="1 0.78 0.27 1" />
+ value="0.38 0.69 0.57 1" />
<color
name="FloaterButtonImageColor"
reference="LtGray" />
@@ -300,7 +344,7 @@
value="0.92 0.92 1 0.78" />
<color
name="GridlineColor"
- value="1 0 0 1" />
+ reference="Red" />
<color
name="GridlineShadowColor"
value="0 0 0 0.31" />
@@ -312,10 +356,10 @@
value="0.3344 0.5456 0.5159 1" />
<color
name="GroupNotifyTextColor"
- reference="White"/>
+ reference="White"/>
<color
name="GroupNotifyDimmedTextColor"
- reference="DkGray"/>
+ reference="DkGray" />
<color
name="GroupOverTierColor"
value="0.43 0.06 0.06 1" />
@@ -345,7 +389,7 @@
reference="Unused?" />
<color
name="HighlightChildColor"
- reference="Unused?" />
+ reference="Yellow" />
<color
name="HighlightInspectColor"
value="1 0.5 0 1" />
@@ -369,13 +413,16 @@
reference="White" />
<color
name="InventoryBackgroundColor"
- reference="Unused?" />
+ reference="DkGray2" />
+ <color
+ name="InventoryFocusOutlineColor"
+ reference="White_25" />
<color
name="InventoryItemSuffixColor"
reference="White_25" />
<color
name="InventorySearchStatusColor"
- reference="Black" />
+ reference="EmphasisColor" />
<color
name="LabelDisabledColor"
reference="White_25" />
@@ -408,10 +455,10 @@
reference="White" />
<color
name="MapAvatarColor"
- reference="White" />
+ reference="Green" />
<color
name="MapAvatarFriendColor"
- reference="Unused?" />
+ reference="Yellow" />
<color
name="MapAvatarSelfColor"
value="0.53125 0 0.498047 1" />
@@ -432,7 +479,7 @@
reference="DkGray" />
<color
name="MenuBarGodBgColor"
- reference="DkGray2" />
+ reference="FrogGreen" />
<color
name="MenuDefaultBgColor"
reference="DkGray2" />
@@ -453,10 +500,10 @@
reference="Black" />
<color
name="MenuNonProductionGodBgColor"
- value="0 0.5 0 1" />
+ value="0.263 0.325 0.345 1" />
<color
name="MenuPopupBgColor"
- reference="DkGray_66" />
+ reference="DkGray2" />
<color
name="MultiSliderDisabledThumbColor"
reference="Unused?" />
@@ -480,7 +527,7 @@
value="0 0 0 0.3" />
<color
name="NetMapGroupOwnAboveWater"
- value="1 0 1 1" />
+ reference="Purple" />
<color
name="NetMapGroupOwnBelowWater"
value="0.78 0 0.78 1" />
@@ -510,10 +557,10 @@
reference="White" />
<color
name="ObjectChatColor"
- reference="LtGray" />
+ reference="EmphasisColor" />
<color
name="OverdrivenColor"
- value="1 0 0 1" />
+ reference="Red" />
<color
name="PanelDefaultBackgroundColor"
reference="DkGray" />
@@ -558,7 +605,7 @@
value="0.39 0.39 0.39 1" />
<color
name="ScriptErrorColor"
- value="0.82 0.27 0.27 1" />
+ reference="Red" />
<color
name="ScrollBGStripeColor"
reference="Transparent" />
@@ -597,7 +644,7 @@
value="0.13 0.42 0.77 1" />
<color
name="SilhouetteParentColor"
- reference="Unused?" />
+ reference="Yellow" />
<color
name="SliderDisabledThumbColor"
reference="White_25" />
@@ -612,10 +659,10 @@
reference="Unused?" />
<color
name="SpeakingColor"
- value="0 1 0 1" />
+ reference="FrogGreen" />
<color
name="SystemChatColor"
- reference="White" />
+ reference="LtGray" />
<color
name="TextBgFocusColor"
reference="White" />
@@ -630,7 +677,7 @@
reference="Black" />
<color
name="TextDefaultColor"
- value="Black" />
+ reference="Black" />
<color
name="TextEmbeddedItemColor"
value="0 0 0.5 1" />
@@ -645,10 +692,10 @@
reference="LtGray" />
<color
name="TextFgTentativeColor"
- value="0 0 0 .33" />
+ value="0.4 0.4 0.4 1" />
<color
name="TimeTextColor"
- reference="LtGray_50" />
+ reference="LtGray" />
<color
name="TitleBarFocusColor"
reference="White_10" />
@@ -660,13 +707,16 @@
value="0.812 0.753 0.451 1" />
<color
name="ToolTipTextColor"
- value="0.749 0.749 0.749 1" />
+ reference="DkGray2" />
<color
- name="UserChatColor"
+ name="InspectorTipTextColor"
reference="LtGray" />
<color
+ name="UserChatColor"
+ reference="White" />
+ <color
name="llOwnerSayChatColor"
- reference="LtGray" />
+ reference="LtYellow" />
<!-- New Colors -->
<color
@@ -678,5 +728,10 @@
<color
name="SysWellItemSelected"
value="0.3 0.3 0.3 1.0" />
-
+ <color
+ name="ChatToastAgentNameColor"
+ reference="EmphasisColor" />
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
</colors>
diff --git a/indra/newview/skins/default/html/da/loading/loading.html b/indra/newview/skins/default/html/da/loading/loading.html
index cdad5702b9..5f3426eb60 100644
--- a/indra/newview/skins/default/html/da/loading/loading.html
+++ b/indra/newview/skins/default/html/da/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/de/loading/loading.html b/indra/newview/skins/default/html/de/loading/loading.html
index 3eddbc24f5..44a621b216 100644
--- a/indra/newview/skins/default/html/de/loading/loading.html
+++ b/indra/newview/skins/default/html/de/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/en-us/loading/loading.html b/indra/newview/skins/default/html/en-us/loading/loading.html
index 34e5c84c4d..1c62d2f73e 100644
--- a/indra/newview/skins/default/html/en-us/loading/loading.html
+++ b/indra/newview/skins/default/html/en-us/loading/loading.html
@@ -1,9 +1,9 @@
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
- </td>
- </tr>
-</table>
-</body>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/es/loading/loading.html b/indra/newview/skins/default/html/es/loading/loading.html
index f03284ba8c..c4260b34c0 100644
--- a/indra/newview/skins/default/html/es/loading/loading.html
+++ b/indra/newview/skins/default/html/es/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/fr/loading/loading.html b/indra/newview/skins/default/html/fr/loading/loading.html
index 23c0ef03bc..b3953448e9 100644
--- a/indra/newview/skins/default/html/fr/loading/loading.html
+++ b/indra/newview/skins/default/html/fr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/hu/loading/loading.html b/indra/newview/skins/default/html/hu/loading/loading.html
index ade91f76c2..ab15a073ba 100644
--- a/indra/newview/skins/default/html/hu/loading/loading.html
+++ b/indra/newview/skins/default/html/hu/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/it/loading/loading.html b/indra/newview/skins/default/html/it/loading/loading.html
index 0f9af31f6e..ab37e41f04 100644
--- a/indra/newview/skins/default/html/it/loading/loading.html
+++ b/indra/newview/skins/default/html/it/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ja/loading/loading.html b/indra/newview/skins/default/html/ja/loading/loading.html
index 069dc5d12f..35cf74a35f 100644
--- a/indra/newview/skins/default/html/ja/loading/loading.html
+++ b/indra/newview/skins/default/html/ja/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/nl/loading/loading.html b/indra/newview/skins/default/html/nl/loading/loading.html
index 39a8691f3f..0215bd7e47 100644
--- a/indra/newview/skins/default/html/nl/loading/loading.html
+++ b/indra/newview/skins/default/html/nl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pl/loading/loading.html b/indra/newview/skins/default/html/pl/loading/loading.html
index 515890c2d5..50f3dfb0c5 100644
--- a/indra/newview/skins/default/html/pl/loading/loading.html
+++ b/indra/newview/skins/default/html/pl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Åadowanie...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Åadowanie...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pt/loading/loading.html b/indra/newview/skins/default/html/pt/loading/loading.html
index 635ea62406..a83e1123d0 100644
--- a/indra/newview/skins/default/html/pt/loading/loading.html
+++ b/indra/newview/skins/default/html/pt/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ru/loading/loading.html b/indra/newview/skins/default/html/ru/loading/loading.html
index dcc0d73c1a..892c0b9f7f 100644
--- a/indra/newview/skins/default/html/ru/loading/loading.html
+++ b/indra/newview/skins/default/html/ru/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/tr/loading/loading.html b/indra/newview/skins/default/html/tr/loading/loading.html
index e7812e7c8e..1ac07bff34 100644
--- a/indra/newview/skins/default/html/tr/loading/loading.html
+++ b/indra/newview/skins/default/html/tr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/uk/loading/loading.html b/indra/newview/skins/default/html/uk/loading/loading.html
index 0f67994635..3b5b8679b4 100644
--- a/indra/newview/skins/default/html/uk/loading/loading.html
+++ b/indra/newview/skins/default/html/uk/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/zh/loading/loading.html b/indra/newview/skins/default/html/zh/loading/loading.html
index 462ea291d9..d1d5d25c92 100644
--- a/indra/newview/skins/default/html/zh/loading/loading.html
+++ b/indra/newview/skins/default/html/zh/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/textures/Blank.png b/indra/newview/skins/default/textures/Blank.png
new file mode 100644
index 0000000000..f38e9f9100
--- /dev/null
+++ b/indra/newview/skins/default/textures/Blank.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png
new file mode 100644
index 0000000000..3cfe2e850e
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png
new file mode 100644
index 0000000000..bb5d85e410
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png
new file mode 100644
index 0000000000..2b50986780
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png
new file mode 100644
index 0000000000..9876aa456c
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png
new file mode 100644
index 0000000000..f481fed88c
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png
new file mode 100644
index 0000000000..d58b4ff990
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png
new file mode 100644
index 0000000000..6e73898992
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png b/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png
index 28ff6ba976..9e7291d6fb 100644
--- a/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png
new file mode 100644
index 0000000000..0ac5b72b8f
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png
index 6f2726c3e6..d7ec04237b 100644
--- a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png
new file mode 100644
index 0000000000..e8fe243dc7
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
index a355917fca..5c0c85b864 100644
--- a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
+++ b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
new file mode 100644
index 0000000000..6cb33efb93
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
new file mode 100644
index 0000000000..6cb33efb93
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
new file mode 100644
index 0000000000..d50dc69ffe
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
new file mode 100644
index 0000000000..3d6964530d
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
new file mode 100644
index 0000000000..3ed0389961
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
new file mode 100644
index 0000000000..3ebd5ea7a1
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
new file mode 100644
index 0000000000..3bdc4d1fd5
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
new file mode 100644
index 0000000000..0912442e29
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
new file mode 100644
index 0000000000..33db4a2de8
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
new file mode 100644
index 0000000000..9e80fe2b84
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
new file mode 100644
index 0000000000..d36bfa55d4
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
new file mode 100644
index 0000000000..962f6efb93
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
new file mode 100644
index 0000000000..715d597144
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
new file mode 100644
index 0000000000..b2ea680f23
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
new file mode 100644
index 0000000000..1fc22686eb
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
new file mode 100644
index 0000000000..5bd87f8a2f
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
new file mode 100644
index 0000000000..a4c3f39e14
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_Selected.png b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
new file mode 100644
index 0000000000..0616dea6a3
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/Accordion_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/default_profile_picture.j2c b/indra/newview/skins/default/textures/default_profile_picture.j2c
index c53a22e816..f21742cf09 100644
--- a/indra/newview/skins/default/textures/default_profile_picture.j2c
+++ b/indra/newview/skins/default/textures/default_profile_picture.j2c
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga
index c344fb1e78..f548126e5a 100644
--- a/indra/newview/skins/default/textures/icon_event_adult.tga
+++ b/indra/newview/skins/default/textures/icon_event_adult.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_top_pick.tga b/indra/newview/skins/default/textures/icon_top_pick.tga
index 7fe119a818..0b34882d2f 100644
--- a/indra/newview/skins/default/textures/icon_top_pick.tga
+++ b/indra/newview/skins/default/textures/icon_top_pick.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Off.png b/indra/newview/skins/default/textures/icons/AudioMute_Off.png
new file mode 100644
index 0000000000..938aaef491
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/AudioMute_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Over.png b/indra/newview/skins/default/textures/icons/AudioMute_Over.png
new file mode 100644
index 0000000000..7bd1b12aae
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/AudioMute_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Audio_Off.png b/indra/newview/skins/default/textures/icons/Audio_Off.png
new file mode 100644
index 0000000000..ef746aab92
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Audio_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Audio_Press.png b/indra/newview/skins/default/textures/icons/Audio_Press.png
new file mode 100644
index 0000000000..25a669224a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Audio_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png
new file mode 100644
index 0000000000..69646ce473
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/ForSale_Badge.png b/indra/newview/skins/default/textures/icons/ForSale_Badge.png
new file mode 100644
index 0000000000..5bee570cee
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/ForSale_Badge.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Group.png b/indra/newview/skins/default/textures/icons/Generic_Group.png
index fdd65b49e1..9d76f75d0f 100644
--- a/indra/newview/skins/default/textures/icons/Generic_Group.png
+++ b/indra/newview/skins/default/textures/icons/Generic_Group.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Object_Small.png b/indra/newview/skins/default/textures/icons/Generic_Object_Small.png
new file mode 100644
index 0000000000..223874e631
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Generic_Object_Small.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Alpha.png b/indra/newview/skins/default/textures/icons/Inv_Alpha.png
new file mode 100644
index 0000000000..b65dc1929d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Alpha.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Landmark.png b/indra/newview/skins/default/textures/icons/Inv_Landmark.png
index f8ce765c50..76df984596 100644
--- a/indra/newview/skins/default/textures/icons/Inv_Landmark.png
+++ b/indra/newview/skins/default/textures/icons/Inv_Landmark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png b/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png
new file mode 100644
index 0000000000..73a708782c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LinkItem.png b/indra/newview/skins/default/textures/icons/Inv_LinkItem.png
new file mode 100644
index 0000000000..73a708782c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LinkItem.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png b/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png
new file mode 100644
index 0000000000..f2ae828efc
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png b/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png
new file mode 100644
index 0000000000..d454d4cd48
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
index 51e1c7bbb7..1f52b0a6b6 100644
--- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png
+++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Tattoo.png b/indra/newview/skins/default/textures/icons/Inv_Tattoo.png
new file mode 100644
index 0000000000..a632197eb5
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Tattoo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png
new file mode 100644
index 0000000000..75bd73cef1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Off.png b/indra/newview/skins/default/textures/icons/MinusItem_Off.png
new file mode 100644
index 0000000000..6f285f3546
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/MinusItem_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Press.png b/indra/newview/skins/default/textures/icons/MinusItem_Press.png
new file mode 100644
index 0000000000..50f65765d5
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/MinusItem_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png
new file mode 100644
index 0000000000..fb1f7d3a6d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png
new file mode 100644
index 0000000000..e6f614b844
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png
new file mode 100644
index 0000000000..84a96a60cb
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png
new file mode 100644
index 0000000000..d55ebd7c67
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png
new file mode 100644
index 0000000000..ae4077488b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
new file mode 100644
index 0000000000..d72f02f708
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png b/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png
new file mode 100644
index 0000000000..4813d37198
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png
new file mode 100644
index 0000000000..e0b18b2451
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png
new file mode 100644
index 0000000000..101aaa42b1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png
new file mode 100644
index 0000000000..c27f18e3c7
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png b/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png
new file mode 100644
index 0000000000..d28e5357df
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png
new file mode 100644
index 0000000000..d72f02f708
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png
new file mode 100644
index 0000000000..60e6a00a25
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Light.png b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png
new file mode 100644
index 0000000000..55f97f3b4e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
new file mode 100644
index 0000000000..f82354959e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png
new file mode 100644
index 0000000000..11ab1f1e60
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png
new file mode 100644
index 0000000000..b536762ddc
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png
new file mode 100644
index 0000000000..8f0fe6a04d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png
new file mode 100644
index 0000000000..eba7070b4d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png
new file mode 100644
index 0000000000..08c2a18ac3
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png
new file mode 100644
index 0000000000..bf618752f6
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Light.png b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png
new file mode 100644
index 0000000000..a67bbd0cc5
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png
new file mode 100644
index 0000000000..8f9f37a1bf
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png
new file mode 100644
index 0000000000..8b1d6c5e14
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png
new file mode 100644
index 0000000000..eace54ae79
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png
new file mode 100644
index 0000000000..0d07e552b1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png
new file mode 100644
index 0000000000..b36a9bd2f0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png b/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png
new file mode 100644
index 0000000000..86ce19474a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Pause_Off.png b/indra/newview/skins/default/textures/icons/Pause_Off.png
new file mode 100644
index 0000000000..77f6be569d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Pause_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Pause_Over.png b/indra/newview/skins/default/textures/icons/Pause_Over.png
new file mode 100644
index 0000000000..580808bf7e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Pause_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Pause_Press.png b/indra/newview/skins/default/textures/icons/Pause_Press.png
new file mode 100644
index 0000000000..859db34cae
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Pause_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Play_Off.png b/indra/newview/skins/default/textures/icons/Play_Off.png
new file mode 100644
index 0000000000..e594c1a4cb
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Play_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Play_Over.png b/indra/newview/skins/default/textures/icons/Play_Over.png
new file mode 100644
index 0000000000..70ab94e8c2
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Play_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Play_Press.png b/indra/newview/skins/default/textures/icons/Play_Press.png
new file mode 100644
index 0000000000..b52742c6da
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Play_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png
new file mode 100644
index 0000000000..c9fbde987a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/SL_Logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/SkipBackward_Off.png b/indra/newview/skins/default/textures/icons/SkipBackward_Off.png
new file mode 100644
index 0000000000..8fc10e6583
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/SkipBackward_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/SkipForward_Off.png b/indra/newview/skins/default/textures/icons/SkipForward_Off.png
new file mode 100644
index 0000000000..2892e3cfa9
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/SkipForward_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/StopReload_Off.png b/indra/newview/skins/default/textures/icons/StopReload_Off.png
new file mode 100644
index 0000000000..698569a540
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/StopReload_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/StopReload_Over.png b/indra/newview/skins/default/textures/icons/StopReload_Over.png
new file mode 100644
index 0000000000..251b38630a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/StopReload_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Stop_Off.png b/indra/newview/skins/default/textures/icons/Stop_Off.png
new file mode 100644
index 0000000000..3ee215d36f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Stop_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/UnZoom_Off.png b/indra/newview/skins/default/textures/icons/UnZoom_Off.png
new file mode 100644
index 0000000000..c794113755
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/UnZoom_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png b/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png
new file mode 100644
index 0000000000..c057e9743d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Zoom_Off.png b/indra/newview/skins/default/textures/icons/Zoom_Off.png
new file mode 100644
index 0000000000..d096720c9c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Zoom_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg b/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg
new file mode 100644
index 0000000000..3bb7f7183c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/object_icon.png b/indra/newview/skins/default/textures/icons/object_icon.png
new file mode 100644
index 0000000000..223874e631
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/object_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
new file mode 100644
index 0000000000..b5508423eb
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
new file mode 100644
index 0000000000..4813d37198
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png
new file mode 100644
index 0000000000..41984c43e4
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/parcel_color_M.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga
new file mode 100644
index 0000000000..04539c2cc4
--- /dev/null
+++ b/indra/newview/skins/default/textures/inv_folder_inbox.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_16.tga b/indra/newview/skins/default/textures/map_avatar_16.tga
index ce129e3590..f59e9e9193 100644
--- a/indra/newview/skins/default/textures/map_avatar_16.tga
+++ b/indra/newview/skins/default/textures/map_avatar_16.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_32.tga b/indra/newview/skins/default/textures/map_avatar_32.tga
new file mode 100644
index 0000000000..aebeab4093
--- /dev/null
+++ b/indra/newview/skins/default/textures/map_avatar_32.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_8.tga b/indra/newview/skins/default/textures/map_avatar_8.tga
index 28552f2237..8500eadeba 100644
--- a/indra/newview/skins/default/textures/map_avatar_8.tga
+++ b/indra/newview/skins/default/textures/map_avatar_8.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_above_32.tga b/indra/newview/skins/default/textures/map_avatar_above_32.tga
new file mode 100644
index 0000000000..65bd0561a7
--- /dev/null
+++ b/indra/newview/skins/default/textures/map_avatar_above_32.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_below_32.tga b/indra/newview/skins/default/textures/map_avatar_below_32.tga
new file mode 100644
index 0000000000..496c44b369
--- /dev/null
+++ b/indra/newview/skins/default/textures/map_avatar_below_32.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_you_32.tga b/indra/newview/skins/default/textures/map_avatar_you_32.tga
new file mode 100644
index 0000000000..782207efd6
--- /dev/null
+++ b/indra/newview/skins/default/textures/map_avatar_you_32.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event.tga b/indra/newview/skins/default/textures/map_event.tga
index c229b379a2..2c06d08fd2 100644
--- a/indra/newview/skins/default/textures/map_event.tga
+++ b/indra/newview/skins/default/textures/map_event.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga
index c344fb1e78..f548126e5a 100644
--- a/indra/newview/skins/default/textures/map_event_adult.tga
+++ b/indra/newview/skins/default/textures/map_event_adult.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga
index 61c879bc92..71067c0dfd 100644
--- a/indra/newview/skins/default/textures/map_event_mature.tga
+++ b/indra/newview/skins/default/textures/map_event_mature.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_home.tga b/indra/newview/skins/default/textures/map_home.tga
index 7478de371a..acaaa3db44 100644
--- a/indra/newview/skins/default/textures/map_home.tga
+++ b/indra/newview/skins/default/textures/map_home.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga
index d0134fa5fe..545b8e532c 100644
--- a/indra/newview/skins/default/textures/map_infohub.tga
+++ b/indra/newview/skins/default/textures/map_infohub.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_telehub.tga b/indra/newview/skins/default/textures/map_telehub.tga
index ef63a3eb72..545b8e532c 100644
--- a/indra/newview/skins/default/textures/map_telehub.tga
+++ b/indra/newview/skins/default/textures/map_telehub.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
index 7c10aaaead..41cb88628a 100644
--- a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
+++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
index 9d7716c6de..a02675502a 100644
--- a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
+++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png
new file mode 100644
index 0000000000..d4f126f969
--- /dev/null
+++ b/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Flag.png b/indra/newview/skins/default/textures/navbar/Flag.png
new file mode 100644
index 0000000000..df53c89224
--- /dev/null
+++ b/indra/newview/skins/default/textures/navbar/Flag.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Lock.png b/indra/newview/skins/default/textures/navbar/Lock.png
new file mode 100644
index 0000000000..cf569d6ad2
--- /dev/null
+++ b/indra/newview/skins/default/textures/navbar/Lock.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/NavBar_BG.png b/indra/newview/skins/default/textures/navbar/NavBar_BG.png
index 1df61751a8..38eea783e6 100644
--- a/indra/newview/skins/default/textures/navbar/NavBar_BG.png
+++ b/indra/newview/skins/default/textures/navbar/NavBar_BG.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png
index ada28e01da..f5a5f7a846 100644
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png
+++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
index 0f8d5619ec..8e0fb9661e 100644
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
+++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 401f32c908..f200566c0e 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,3 +1,33 @@
+<!--
+This file contains metadata about how to load, display, and scale textures for rendering in the UI.
+Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
+to them by filename (relative to textures directory).
+NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry
+with the same filename but different name
+
+<texture
+ name="MyTexture" (mandatory)
+ - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/>
+ file_name="images/my_texture.png" (optional)
+ - this is the path to the actual file asset, relative to the current skins "textures" directory.
+ If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case.
+ NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly
+ preload="true" (optional, false by default)
+ - If true, we will attempt to load the image before displaying any UI.
+ If false, we will load in the background after initializing the UI.
+ use_mips="true" (currently unused)
+ scale.left="1"
+ scale.bottom="1"
+ scale.top="15"
+ scale.right="31"
+ - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner
+ that define the region of the image that is stretched to make the whole image fit in the required space.
+ In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up
+ and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left
+ corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required
+ region.
+-->
+
<textures version="101">
<!-- Please add new files alphabetically to prevent merge conflicts. JC -->
<texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
@@ -6,6 +36,8 @@
<texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" />
<texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" />
<texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" />
+ <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
+ <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
@@ -18,18 +50,41 @@
<texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
<texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true" />
+<!--
+ <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+ <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+-->
+
+ <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
+ <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
+ <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
+
+ <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
<texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
- <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+
+ <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+ <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+ <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
+
+ <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+ <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" />
+ <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
+
+ <texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" />
<texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
<texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
<texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" />
+ <texture name="Blank" file_name="Blank.png" preload="false" />
+
<texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" />
+ <texture name="BottomTray_Scroll_Right" file_name="navbar/Arrow_Right_Off.png" preload="false" />
+ <texture name="BottomTray_Scroll_Left" file_name="navbar/Arrow_Left_Off.png" preload="false" />
- <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="false" />
- <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="false" />
- <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="false" />
+ <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="Cam_Avatar_Disabled" file_name="bottomtray/Cam_Avatar_Disabled.png" preload="false" />
<texture name="Cam_Avatar_Over" file_name="bottomtray/Cam_Avatar_Over.png" preload="false" />
@@ -47,6 +102,16 @@
<texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" />
<texture name="Cam_Pan_Over" file_name="bottomtray/CCam_Pan_Over.png" preload="false" />
<texture name="Cam_Pan_Press" file_name="bottomtray/Cam_Pan_Press.png" preload="false" />
+
+ <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" />
+ <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" />
+ <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" />
+ <texture name="Cam_Preset_Eye_On" file_name="bottomtray/Cam_Preset_Eye_On.png" preload="false" />
+ <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" />
+ <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" />
+ <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" />
+ <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" />
+
<texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
<texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
<texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
@@ -65,7 +130,10 @@
<texture name="ComboButton_Over" file_name="widgets/ComboButton_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="Container" file_name="containers/Container.png" preload="false" />
<texture name="DisclosureArrow_Closed_Off" file_name="widgets/DisclosureArrow_Closed_Off.png" preload="true" />
@@ -75,27 +143,41 @@
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
- <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
<texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
+ <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+ <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" />
+ <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+
<texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
<texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
<texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
<texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
+ <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
<texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" />
<texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" />
+ <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+
+ <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
+ <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
<texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
<texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
<texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
+ <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
<texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
+ <texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" />
+ <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
+ <texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" />
<texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
<texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
@@ -122,8 +204,8 @@
<texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
<texture name="Icon_Gear_Press" file_name="windows/Icon_Gear_Press.png" preload="false" />
- <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="false" />
- <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="false" />
+ <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" />
+ <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" />
<texture name="Icon_Info" file_name="windows/Icon_Info.png" preload="false" />
<texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
@@ -132,9 +214,6 @@
<texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
<texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
- <texture name="Icon_Undock_Foreground" file_name="windows/Icon_Undock_Foreground.png" preload="false" />
- <texture name="Icon_Undock_Press" file_name="windows/Icon_Undock_Press.png" preload="false" />
-
<texture name="Info" file_name="icons/Info.png" preload="false" />
<texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />
<texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" />
@@ -144,6 +223,7 @@
<texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false"
scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
<texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" />
+ <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" />
<texture name="Inv_Acessories" file_name="icons/Inv_Accessories.png" preload="false" />
<texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" />
@@ -158,7 +238,12 @@
<texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
<texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
<texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
+ <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
+ <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" />
+ <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
<texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
+ <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
+ <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
@@ -180,16 +265,21 @@
<texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
<texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
- <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" />
- <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" />
+ <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
<texture name="Lock" file_name="icons/Lock.png" preload="false" />
+ <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
<texture name="Login_Pod" file_name="windows/Login_Pod.png" preload="true" />
<texture name="Microphone_Mute" file_name="icons/Microphone_Mute.png" preload="false" />
<texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
+ <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
+ <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" />
+ <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" />
+
<texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
<texture name="Move_Fly_Disabled" file_name="bottomtray/Move_Fly_Disabled.png" preload="false" />
@@ -217,29 +307,49 @@
<texture name="Movement_Up_Off" file_name="bottomtray/Movement_Up_Off.png" preload="false" />
<texture name="Movement_Up_On" file_name="bottomtray/Movement_Up_On.png" preload="false" />
- <texture name="NavBar_BG_NoFav" file_name="navbar/NavBar_BG_NoFav.png" preload="false" />
- <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="false" />
+ <texture name="NavBar_BG_NoFav" file_name="navbar/NavBar_BG_NoFav.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="NearbyVoice_Lvl1" file_name="bottomtray/NearbyVoice_Lvl1.png" preload="false" />
<texture name="NearbyVoice_Lvl2" file_name="bottomtray/NearbyVoice_Lvl2.png" preload="false" />
<texture name="NearbyVoice_Lvl3" file_name="bottomtray/NearbyVoice_Lvl3.png" preload="false" />
<texture name="NearbyVoice_On" file_name="bottomtray/NearbyVoice_On.png" preload="false" />
+ <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" />
+
+ <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
+ <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
+
<texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" />
+ <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" />
<texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" />
+ <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" />
<texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" />
+ <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" />
<texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" />
+ <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" />
<texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" />
+ <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" />
<texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" />
+ <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" />
<texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" />
+ <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" />
<texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" />
+ <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" />
<texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" />
+ <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" />
<texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" />
+ <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" />
<texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" />
+ <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" />
<texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" />
+ <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" />
<texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" />
+ <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" />
<texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" />
+ <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" />
<texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" />
+ <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" />
<texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" />
<texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
@@ -252,6 +362,58 @@
<texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" />
<texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" />
+ <texture name="Parcel_Evry_Color" file_name="icons/Parcel_Evry_Color.png" preload="false" />
+ <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
+ <texture name="Parcel_M_Color" file_name="icons/Parcel_M_Color.png" preload="false" />
+
+ <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
+ <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
+ <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
+ <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
+ <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" />
+ <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" />
+ <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" />
+ <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
+ <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" />
+ <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" />
+ <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
+ <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
+ <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
+ <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" />
+ <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" />
+ <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" />
+ <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+
+ <texture name="Parcel_Build_Light" file_name="icons/Parcel_Build_Light.png" preload="false" />
+ <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
+ <texture name="Parcel_Damage_Light" file_name="icons/Parcel_Damage_Light.png" preload="false" />
+ <texture name="Parcel_DamageNo_Light" file_name="icons/Parcel_DamageNo_Light.png" preload="false" />
+ <texture name="Parcel_Evry_Light" file_name="icons/Parcel_Evry_Light.png" preload="false" />
+ <texture name="Parcel_Exp_Light" file_name="icons/Parcel_Exp_Light.png" preload="false" />
+ <texture name="Parcel_Fly_Light" file_name="icons/Parcel_Fly_Light.png" preload="false" />
+ <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
+ <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" />
+ <texture name="Parcel_ForSaleNo_Light" file_name="icons/Parcel_ForSaleNo_Light.png" preload="false" />
+ <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" />
+ <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" />
+ <texture name="Parcel_Push_Light" file_name="icons/Parcel_Push_Light.png" preload="false" />
+ <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
+ <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
+ <texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
+ <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
+ <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
+
+ <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+ <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+ <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+ <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+ <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+ <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
+
<texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
<texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
<texture name="Progress_3" file_name="icons/Progress_3.png" preload="false" />
@@ -268,9 +430,12 @@
<texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" />
<texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
+ <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_On_Disabled" file_name="widgets/PushButton_On_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
@@ -291,6 +456,7 @@
<texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
+ <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
<texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
<texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
@@ -303,12 +469,20 @@
<texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
<texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
+ <texture name="ScrubberThumb_Disabled" file_name="widgets/ScrubberThumb_Disabled.png" preload="false" />
+ <texture name="ScrubberThumb_Focus" file_name="widgets/ScrubberThumb_Focus.png" preload="false" />
+ <texture name="ScrubberThumb_Off" file_name="widgets/ScrubberThumb_Off.png" preload="false" />
+ <texture name="ScrubberThumb_Over" file_name="widgets/ScrubberThumb_Over.png" preload="false" />
+ <texture name="ScrubberThumb_Press" file_name="widgets/ScrubberThumb_Press.png" preload="false" />
+
<texture name="Search" file_name="navbar/Search.png" preload="false" />
<texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
@@ -320,28 +494,48 @@
<texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+ <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" />
+ <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" />
+ <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+ <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" />
+ <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />
+
<texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
<texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
<texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
<texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
<texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
+ <texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
+
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" />
<texture name="Snapshot_Press" file_name="bottomtray/Snapshot_Press.png" preload="false" />
- <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="true" />
- <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="true" />
- <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="true" />
- <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="true" />
- <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
- <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
+ <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
+
+ <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" />
+ <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
+ <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
+ <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" />
+ <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
+ <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
+
+ <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
+ <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" />
+ <texture name="Stop_Press" file_name="icons/Stop_Press.png" preload="false" />
+ <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+ <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+ <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
<texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
<texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
@@ -349,6 +543,11 @@
<texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />
<texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
<texture name="TabIcon_Close_Over" file_name="taskpanel/TabIcon_Close_Over.png" preload="false" />
+ <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" />
+ <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" />
+ <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" />
+ <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" />
+ <texture name="TabIcon_Home_Large" file_name="taskpanel/TabIcon_Home_Large.png" preload="false" />
<texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />
<texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" />
<texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
@@ -374,13 +573,13 @@
<texture name="TabTop_Divider" file_name="containers/TabTop_Divider.png" preload="false" />
<texture name="TabTop_Left_Press" file_name="containers/TabTop_Left_Press.png" preload="false" />
<texture name="TabTop_Middle_Press" file_name="containers/TabTop_Middle_Press.png" preload="false" />
- <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" />
+ <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Press" file_name="containers/TabTop_Right_Press.png" preload="false" />
- <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" />
+ <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
<texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
- <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
- <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
+ <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
+ <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
<texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" />
<texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
@@ -394,33 +593,48 @@
<texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TimeBasedMediaBackground" file_name="windows/TimeBasedMediaBackground.png" preload="false" />
+
<texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
<texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
+ <texture name="Toast_Over" file_name="windows/Toast_Over.png" preload="true"
+ scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
<texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" />
+ <texture name="Tool_Create_Selected" file_name="build/Tool_Create_Selected.png" preload="false" />
<texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" />
+ <texture name="Tool_Dozer_Selected" file_name="build/Tool_Dozer_Selected.png" preload="false" />
<texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" />
+ <texture name="Tool_Face_Selected" file_name="build/Tool_Face_Selected.png" preload="false" />
<texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" />
+ <texture name="Tool_Grab_Selected" file_name="build/Tool_Grab_Selected.png" preload="false" />
<texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" />
+ <texture name="Tool_Zoom_Selected" file_name="build/Tool_Zoom_Selected.png" preload="false" />
<texture name="Toolbar_Divider" file_name="containers/Toolbar_Divider.png" preload="false" />
- <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" />
- <texture name="Toolbar_Left_Press" file_name="containers/Toolbar_Left_Press.png" preload="false" />
- <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" />
- <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" />
- <texture name="Toolbar_Middle_Press" file_name="containers/Toolbar_Middle_Press.png" preload="false" />
- <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" />
- <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />
- <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
- <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
+ <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Press" file_name="containers/Toolbar_Left_Press.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Press" file_name="containers/Toolbar_Middle_Press.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+
+ <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
<texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
<texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
<texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
- <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
+ <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
<texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
+ <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
+
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
<texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
<texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
@@ -428,120 +642,86 @@
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
+ <texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
+
<texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
<texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" />
- <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
+ <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
- <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
+ <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
<texture name="Window_NoTitle_Background" file_name="windows/Window_NoTitle_Background.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
<texture name="Window_NoTitle_Foreground" file_name="windows/Window_NoTitle_Foreground.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
- <!--WARNING OLD ART *do not use*-->
+ <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
+
+ <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+ <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
+ <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
+ <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
+ <texture name="UnZoom_Over" file_name="icons/UnZoom_Over.png" preload="false" />
+ <texture name="UnZoom_Press" file_name="icons/UnZoom_Press.png" preload="false" />
+ <texture name="PowerOn_Off" file_name="icons/PowerOn_Off.png" preload="false" />
+ <texture name="PowerOn_Over" file_name="icons/PowerOn_Over.png" preload="false" />
+ <texture name="PowerOn_Press" file_name="icons/PowerOn_Press.png" preload="false" />
+ <texture name="PowerOff_Off" file_name="icons/PowerOff_Off.png" preload="false" />
+ <texture name="PowerOff_Over" file_name="icons/PowerOff_Over.png" preload="false" />
+ <texture name="PowerOff_Press" file_name="icons/PowerOff_Press.png" preload="false" />
- <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
- <texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
-
- <texture name="cam_rotate_out.tga" preload="false" />
- <texture name="cam_rotate_in.tga" preload="false" />
- <texture name="cam_zoom_out.tga" preload="false" />
- <texture name="cam_zoom_plus_in.tga" preload="false" />
- <texture name="cam_zoom_minus_in.tga" preload="false" />
+ <texture name="pixiesmall.j2c" use_mips="true" />
+ <texture name="script_error.j2c" use_mips="true" />
+ <texture name="silhouette.j2c" use_mips="true" />
+ <texture name="foot_shadow.j2c" use_mips="true" />
+ <texture name="cloud-particle.j2c" use_mips="true" />
+ <texture name="transparent.j2c" use_mips="true" />
+ <!--WARNING OLD ART BELOW *do not use*-->
<texture name="icn_chatbar.tga" />
- <texture name="icn_media-pause.tga" />
- <texture name="icn_media-play.tga" />
- <texture name="icn_music-play.tga" />
- <texture name="icn_music-pause.tga" />
<texture name="icn_media_web.tga" preload="true" />
<texture name="icn_media_movie.tga" preload="true" />
-
<texture name="icn_speaker-muted_dark.tga" />
<texture name="icn_speaker_dark.tga" />
-
<texture name="icn_voice-localchat.tga" />
<texture name="icn_voice-groupfocus.tga" />
<texture name="icn_voice-pvtfocus.tga" />
- <texture name="jump_left_out.tga" />
- <texture name="jump_left_in.tga" />
- <texture name="jump_right_out.tga" />
- <texture name="jump_right_in.tga" />
-
- <texture name="move_forward_out.tga" preload="false" />
- <texture name="move_forward_in.tga" preload="false" />
- <texture name="move_left_out.tga" preload="false" />
- <texture name="move_left_in.tga" preload="false" />
- <texture name="move_turn_left_out.tga" preload="false" />
- <texture name="move_turn_left_in.tga" preload="false" />
- <texture name="move_turn_right_out.tga" preload="false" />
- <texture name="move_turn_right_in.tga" preload="false" />
- <texture name="move_right_out.tga" preload="false" />
- <texture name="move_right_in.tga" preload="false" />
- <texture name="move_up_in.tga" preload="false" />
- <texture name="move_up_out.tga" preload="false" />
- <texture name="move_down_in.tga" preload="false" />
- <texture name="move_down_out.tga" preload="false" />
-
- <texture name="tool_grab.tga" />
- <texture name="tool_grab_active.tga" />
-
- <texture name="tool_face.tga" />
- <texture name="tool_face_active.tga" />
-
- <texture name="tool_create.tga" />
- <texture name="tool_create_active.tga" />
+ <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
+ <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
+ <texture name="jump_right_out.tga" file_name="widgets/jump_right_out.png" />
+ <texture name="jump_right_in.tga" file_name="widgets/jump_right_in.png" />
+
+ <texture name="scrollbutton_left_out_blue.tga" file_name="widgets/ScrollArrow_Left_Opaque.png" />
+ <texture name="scrollbutton_left_in_blue.tga" file_name="widgets/ScrollArrow_Left_Over_Opaque.png" />
+ <texture name="scrollbutton_right_out_blue.tga" file_name="widgets/ScrollArrow_Right_Opaque.png" />
+ <texture name="scrollbutton_right_in_blue.tga" file_name="widgets/ScrollArrow_Right_Over_Opaque.png" />
<texture name="up_arrow.tga" file_name="up_arrow.png" />
<texture name="down_arrow.tga" file_name="down_arrow.png" />
+ <texture name="arrow_down.tga" />
<texture name="tearoffbox.tga" />
<texture name="tearoff_pressed.tga" />
<texture name="icn_label_music.tga" />
<texture name="icn_label_media.tga" />
- <texture name="arrow_down.tga" />
- <texture name="cloud-particle.j2c" use_mips="true" />
-
- <texture name="skin_thumbnail_default.png" preload="false" />
-
- <texture name="icn_textfield_enabled.tga" scale.left="5" scale.top="5" scale.bottom="5" scale.right="5" />
<texture name="icn_rounded-text-field.tga" scale.left="14" scale.bottom="16" scale.top="16" scale.right="114" />
- <texture name="toolbar_btn_enabled.tga" scale.left="7" scale.top="32" scale.right="121" scale.bottom="0" />
- <texture name="toolbar_btn_disabled.tga" scale.left="7" scale.top="32" scale.right="121" scale.bottom="0" />
- <texture name="toolbar_btn_selected.tga" scale.left="7" scale.top="32" scale.right="121" scale.bottom="0" />
-
<texture name="toggle_button_off" file_name="toggle_button_off.png" preload="true" />
<texture name="toggle_button_selected" file_name="toggle_button_selected.png" preload="true" />
-
- <texture name="sm_rounded_corners_simple.tga" scale.left="4" scale.top="4" scale.bottom="4" scale.right="4" />
-
- <texture name="rounded_square.tga" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
-
- <texture name="rounded_square_soft.tga" file_name="rounded_square_soft.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
-
- <texture name="toolbar_tab.tga" preload="true" scale.left="6" scale.top="42" scale.right="104" scale.bottom="8" />
- <texture name="toolbar_bg.tga" preload="true" scale.left="6" scale.top="42" scale.right="96" scale.bottom="16" />
-
- <texture name="tab_top_blue.tga" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
- <texture name="tab_top_selected_blue.tga" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
-
- <texture name="startup_logo.j2c" preload="true" />
<texture name="color_swatch_alpha.tga" preload="true" />
<texture name="button_anim_pause.tga" />
<texture name="button_anim_pause_selected.tga" />
<texture name="button_anim_play.tga" />
<texture name="button_anim_play_selected.tga" />
- <texture name="button_anim_stop.tga" />
- <texture name="button_anim_stop_selected.tga" />
<texture name="crosshairs.tga" />
- <texture name="direction_arrow.tga" />
- <texture name="foot_shadow.j2c" use_mips="true" />
+ <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
<texture name="icon_auction.tga" />
<texture name="icon_avatar_offline.tga" />
@@ -551,62 +731,9 @@
<texture name="icon_event.tga" />
<texture name="icon_event_mature.tga" />
<texture name="icon_for_sale.tga" />
- <texture name="icon_group.tga" />
- <texture name="icon_groupnotice.tga" />
- <texture name="icon_groupnoticeinventory.tga" />
- <texture name="icon_place.tga" />
<texture name="icon_place_for_sale.tga" />
- <texture name="icon_popular.tga" />
<texture name="icon_top_pick.tga" />
- <texture name="inv_folder_animation.tga" />
- <texture name="inv_folder_bodypart.tga" />
- <texture name="inv_folder_callingcard.tga" />
- <texture name="inv_folder_clothing.tga" />
- <texture name="inv_folder_current_outfit.tga" />
- <texture name="inv_folder_gesture.tga" />
- <texture name="inv_folder_landmark.tga" />
- <texture name="inv_folder_lostandfound.tga" />
- <texture name="inv_folder_my_outfits.tga" />
- <texture name="inv_folder_notecard.tga" />
- <texture name="inv_folder_object.tga" />
- <texture name="inv_folder_outfit.tga" />
- <texture name="inv_folder_plain_closed.tga" />
- <texture name="inv_folder_script.tga" />
- <texture name="inv_folder_snapshot.tga" />
- <texture name="inv_folder_sound.tga" />
- <texture name="inv_folder_texture.tga" />
- <texture name="inv_folder_trash.tga" />
-
- <texture name="inv_item_animation.tga" />
- <texture name="inv_item_skin.tga" />
- <texture name="inv_item_callingcard_offline.tga" />
- <texture name="inv_item_callingcard_online.tga" />
- <texture name="inv_item_eyes.tga" />
- <texture name="inv_item_gesture.tga" />
- <texture name="inv_item_gloves.tga" />
- <texture name="inv_item_hair.tga" />
- <texture name="inv_item_jacket.tga" />
- <texture name="inv_item_landmark.tga" />
- <texture name="inv_item_landmark_visited.tga" />
- <texture name="inv_item_linkitem.tga" />
- <texture name="inv_item_linkfolder.tga" />
- <texture name="inv_item_notecard.tga" />
- <texture name="inv_item_object.tga" />
- <texture name="inv_item_object_multi.tga" />
- <texture name="inv_item_pants.tga" />
- <texture name="inv_item_script.tga" />
- <texture name="inv_item_shape.tga" />
- <texture name="inv_item_shirt.tga" />
- <texture name="inv_item_shoes.tga" />
- <texture name="inv_item_skirt.tga" />
- <texture name="inv_item_snapshot.tga" />
- <texture name="inv_item_socks.tga" />
- <texture name="inv_item_sound.tga" />
- <texture name="inv_item_texture.tga" />
- <texture name="inv_item_underpants.tga" />
- <texture name="inv_item_undershirt.tga" />
-
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
@@ -623,67 +750,10 @@
<texture name="map_telehub.tga" />
<texture name="map_track_16.tga" />
- <texture name="media_icon.tga" file_name="icn_label_media.tga" />
- <texture name="music_icon.tga" file_name="icn_label_music.tga" />
- <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" />
- <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" />
-
- <texture name="notify_tip_icon.tga" />
<texture name="notify_caution_icon.tga" />
<texture name="notify_next.png" preload="true" />
<texture name="notify_box_icon.tga" />
- <texture name="object_cone.tga" />
- <texture name="object_cone_active.tga" />
- <texture name="object_cube.tga" />
- <texture name="object_cube_active.tga" />
- <texture name="object_cylinder.tga" />
- <texture name="object_cylinder_active.tga" />
- <texture name="object_grass.tga" />
- <texture name="object_grass_active.tga" />
- <texture name="object_hemi_cone.tga" />
- <texture name="object_hemi_cone_active.tga" />
- <texture name="object_hemi_cylinder.tga" />
- <texture name="object_hemi_cylinder_active.tga" />
- <texture name="object_hemi_sphere.tga" />
- <texture name="object_hemi_sphere_active.tga" />
- <texture name="object_prism.tga" />
- <texture name="object_prism_active.tga" />
- <texture name="object_pyramid.tga" />
- <texture name="object_pyramid_active.tga" />
- <texture name="object_ring.tga" />
- <texture name="object_ring_active.tga" />
- <texture name="object_sphere.tga" />
- <texture name="object_sphere_active.tga" />
- <texture name="object_tetrahedron.tga" />
- <texture name="object_tetrahedron_active.tga" />
- <texture name="object_torus.tga" />
- <texture name="object_torus_active.tga" />
- <texture name="object_tree.tga" />
- <texture name="object_tree_active.tga" />
- <texture name="object_tube.tga" />
- <texture name="object_tube_active.tga" />
-
- <texture name="pixiesmall.j2c" use_mips="true" />
- <texture name="script_error.j2c" use_mips="true" />
- <texture name="silhouette.j2c" use_mips="true" />
-
- <texture name="status_no_build.tga" />
- <texture name="status_voice.tga" />
- <texture name="status_buy_currency.tga" />
- <texture name="status_buy_currency_pressed.tga" />
- <texture name="status_buy_land.tga" />
- <texture name="status_buy_land_pressed.tga" />
- <texture name="status_no_fly.tga" />
- <texture name="status_health.tga" />
- <texture name="status_no_push.tga" />
- <texture name="status_no_scripts.tga" />
-
- <texture name="tool_dozer.tga" />
- <texture name="tool_dozer_active.tga" />
- <texture name="tool_zoom.tga" />
- <texture name="tool_zoom_active.tga" />
-
<texture name="icn_active-speakers-dot-lvl0.tga" />
<texture name="icn_active-speakers-dot-lvl1.tga" />
<texture name="icn_active-speakers-dot-lvl2.tga" />
@@ -705,23 +775,5 @@
<texture name="default_profile_picture.j2c" />
<texture name="locked_image.j2c" />
- <texture name="media_btn_back.png" />
- <texture name="media_btn_done.png" />
- <texture name="media_btn_forward.png" />
- <texture name="media_btn_home.png" />
- <texture name="media_btn_newwindow.png" />
- <texture name="media_btn_optimalzoom.png" />
- <texture name="media_btn_reload.png" />
- <texture name="media_btn_scrolldown.png" />
- <texture name="media_btn_scrollleft.png" />
- <texture name="media_btn_scrollright.png" />
- <texture name="media_btn_scrollup.png" />
- <texture name="media_btn_stoploading.png" />
- <texture name="media_panel_divider.png" />
-
<texture name="media_floater_border_16.png" scale_top="12" scale_left="4" scale_bottom="4" scale_right="12" />
-
- <texture name="media_panel_bg.png" preload="true" scale_left="9" scale_top="9" scale_right="9" scale_bottom="9" />
- <texture name="media_panel_hoverrectangle.png" preload="true" scale_left="9" scale_top="9" scale_right="9" scale_bottom="9" />
-
</textures>
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png
new file mode 100644
index 0000000000..2d624c3779
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png
new file mode 100644
index 0000000000..91c03c426e
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png
new file mode 100644
index 0000000000..38aac0e5ca
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
new file mode 100644
index 0000000000..2330cb420b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png
new file mode 100644
index 0000000000..b7b5c2e1d4
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
new file mode 100644
index 0000000000..fd1d11dd0b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Linden_Dollar_Background.png b/indra/newview/skins/default/textures/widgets/Linden_Dollar_Background.png
index a1d602f6f0..61f9b076ce 100644
--- a/indra/newview/skins/default/textures/widgets/Linden_Dollar_Background.png
+++ b/indra/newview/skins/default/textures/widgets/Linden_Dollar_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Opaque.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Opaque.png
new file mode 100644
index 0000000000..549b3980f6
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over_Opaque.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over_Opaque.png
new file mode 100644
index 0000000000..a74abd5d8a
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Opaque.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Opaque.png
new file mode 100644
index 0000000000..36056d0ad9
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over_Opaque.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over_Opaque.png
new file mode 100644
index 0000000000..0c1fd6956b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over_Opaque.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Tooltip.png b/indra/newview/skins/default/textures/widgets/Tooltip.png
new file mode 100644
index 0000000000..f989ac9083
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Tooltip.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/jump_left_in.png b/indra/newview/skins/default/textures/widgets/jump_left_in.png
new file mode 100644
index 0000000000..a1425ccfa0
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/jump_left_in.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/jump_left_out.png b/indra/newview/skins/default/textures/widgets/jump_left_out.png
new file mode 100644
index 0000000000..38edf47d19
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/jump_left_out.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/jump_right_in.png b/indra/newview/skins/default/textures/widgets/jump_right_in.png
new file mode 100644
index 0000000000..39359ab2e2
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/jump_right_in.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/jump_right_out.png b/indra/newview/skins/default/textures/widgets/jump_right_out.png
new file mode 100644
index 0000000000..3f76bbffac
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/jump_right_out.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
new file mode 100644
index 0000000000..361fab59e0
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Inspector_I.png b/indra/newview/skins/default/textures/windows/Inspector_I.png
new file mode 100644
index 0000000000..b4875fd638
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Inspector_I.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..43aaa441f5
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/startup_logo.png b/indra/newview/skins/default/textures/windows/startup_logo.png
new file mode 100644
index 0000000000..b89449692b
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/startup_logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/world/BeaconArrow.png b/indra/newview/skins/default/textures/world/BeaconArrow.png
new file mode 100644
index 0000000000..54934f738a
--- /dev/null
+++ b/indra/newview/skins/default/textures/world/BeaconArrow.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 81d4d3fdfd..eb63b5c975 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -1,20 +1,60 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Om [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="OM [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Bygget med [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i [REGION] lokaliseret på [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memory: [MEMORY_MB] MB
+OS Version: [OS_VERSION]
+Grafik kort mærke: [GRAPHICS_CARD_VENDOR]
+Grafik kort: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Version: [OPENGL_VERSION]
+
+libcurl Version: [LIBCURL_VERSION]
+J2C Decoder Version: [J2C_VERSION]
+Audio Driver Version: [AUDIO_DRIVER_VERSION]
+Qt Webkit Version: [QT_WEBKIT_VERSION]
+Vivox Version: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (ingen)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Pakker tabt: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="Kopiér til udklipsholder" name="copy_btn"/>
+ </panel>
+ <panel label="Tak til" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste version til dato: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
I get by with a little help from my friends. --Richard Starkey
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licenser" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -35,10 +75,7 @@ I get by with a little help from my friends. --Richard Starkey
Alle rettigheder forbeholdes. Se licenses.txt for detaljer.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Du er ved [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml
index c4cf722159..b4af427538 100644
--- a/indra/newview/skins/default/xui/da/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_about_land.xml
@@ -1,7 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Om land">
+<floater name="floaterland" title="OM LAND">
+ <floater.string name="Minutes">
+ [MINUTES] minutter
+ </floater.string>
+ <floater.string name="Minute">
+ minut
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] sekunder
+ </floater.string>
+ <floater.string name="Remaining">
+ mangler
+ </floater.string>
<tab_container name="landtab">
- <panel label="Generelt" name="land_general_panel">
+ <panel label="GENERELT" name="land_general_panel">
+ <panel.string name="new users only">
+ Kun nye brugere
+ </panel.string>
+ <panel.string name="anyone">
+ Alle
+ </panel.string>
+ <panel.string name="area_text">
+ Størrelse
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Auktion nr: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Du skal godkende dit køb for at kunne æmdre på dette land.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Gruppe ejet)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil...
+ </panel.string>
+ <panel.string name="info_text">
+ Info...
+ </panel.string>
+ <panel.string name="public_text">
+ (offentlig)
+ </panel.string>
+ <panel.string name="none_text">
+ (ingen)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Salg i gang)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Pacel ikke valgt.
+Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel for at se detaljer.
+ </panel.string>
<text name="Name:">
Navn:
</text>
@@ -26,7 +78,6 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="Profile..."/>
<text name="Group:">
Gruppe:
</text>
@@ -78,54 +129,23 @@
<button label="Efterlad land..." label_selected="Efterlad land..." name="Abandon Land..."/>
<button label="Kræv tilbage..." label_selected="Kræv tilbage..." name="Reclaim Land..."/>
<button label="Linden salg..." label_selected="Linden salg..." name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede på auktion."/>
- <panel.string name="new users only">
- Kun nye brugere
- </panel.string>
- <panel.string name="anyone">
- Alle
- </panel.string>
- <panel.string name="area_text">
- Størrelse
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Auktion nr: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Du skal godkende dit køb for at kunne æmdre på dette land.
- </panel.string>
- <panel.string name="group_owned_text">
- (Gruppe ejet)
- </panel.string>
- <panel.string name="profile_text">
- Profil...
- </panel.string>
- <panel.string name="info_text">
- Info...
- </panel.string>
- <panel.string name="public_text">
- (offentlig)
+ </panel>
+ <panel label="REGLER" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Købt land i denne region må sælges videre
</panel.string>
- <panel.string name="none_text">
- (ingen)
+ <panel.string name="can_not_resell">
+ Købt land i denne region må ikke sælges videre
</panel.string>
- <panel.string name="sale_pending_text">
- (Salg i gang)
+ <panel.string name="can_change">
+ Købt jord i denne region må gerne samles eller opdeles.
</panel.string>
- <panel.string name="no_selection_text">
- Pacel ikke valgt.
-Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel for at se detaljer.
+ <panel.string name="can_not_change">
+ Købt jord i denne region må íkke samles eller opdeles.
</panel.string>
- </panel>
- <panel label="Regler" name="land_covenant_panel">
<text name="estate_section_lbl">
Estate:
</text>
- <text name="estate_name_lbl">
- Navn:
- </text>
<text name="estate_name_text">
Hovedland
</text>
@@ -144,9 +164,6 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="region_section_lbl">
Region:
</text>
- <text name="region_name_lbl">
- Navn:
- </text>
<text name="region_name_text">
leyla
</text>
@@ -174,35 +191,23 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="changeable_clause">
Land i denne region må ikke samles/opdeles.
</text>
- <panel.string name="can_resell">
- Købt land i denne region må sælges videre
- </panel.string>
- <panel.string name="can_not_resell">
- Købt land i denne region må ikke sælges videre
- </panel.string>
- <panel.string name="can_change">
- Købt jord i denne region må gerne samles eller opdeles.
+ </panel>
+ <panel label="OBJEKTER" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] ud af [MAX] ([AVAILABLE] ledige)
</panel.string>
- <panel.string name="can_not_change">
- Købt jord i denne region må íkke samles eller opdeles.
+ <panel.string name="objects_deleted_text">
+ [COUNT] ud af [MAX] ([DELETED] bliver slettet)
</panel.string>
- </panel>
- <panel label="Objekter" name="land_objects_panel">
<text name="parcel_object_bonus">
Region objekt bonus faktor: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Prims brugt i denne Sim:
+ Prim forbrug:
</text>
<text name="objects_available">
[COUNT] ud af [MAX] ([AVAILABLE] ledige)
</text>
- <panel.string name="objects_available_text">
- [COUNT] ud af [MAX] ([AVAILABLE] ledige)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] ud af [MAX] ([DELETED] bliver slettet)
- </panel.string>
<text name="Primitives parcel supports:">
Prims til rådighed:
</text>
@@ -251,33 +256,63 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="Object Owners:">
Objekt ejere:
</text>
- <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List"/>
+ <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List" tool_tip="Refresh Object List"/>
<button label="Returnér objekter..." label_selected="Returnér objekter..." name="Return objects..."/>
<name_list name="owner list">
- <column label="Type" name="type"/>
- <column label="Navn" name="name"/>
- <column label="Antal" name="count"/>
- <column label="Nyeste" name="mostrecent"/>
+ <name_list.columns label="Type" name="type"/>
+ <name_list.columns label="Navn" name="name"/>
+ <name_list.columns label="Antal" name="count"/>
+ <name_list.columns label="Nyeste" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Indstillinger" name="land_options_panel">
+ <panel label="INDSTILLINGER" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Lad beboere se denne parcel i søgeresultater
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Denne mulighed er ikke til stede da parcellens område er 128 m² eller mindre.
+Kun større parceller kan vises i søgning.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Dette valg er lukket da du ikke kan ændre på denne parcels opsætning.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Mature indhold
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Adult indhold
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Din parcel information eller indhold anses for at være &apos;adult&apos;.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Din parcel information eller indhold anses for at være &apos;adult&apos;.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (ingen)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Skub forbudt
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Skub forbudt (Uanset region indstilling)
+ </panel.string>
<text name="allow_label">
Tillad andre beboere at:
</text>
<check_box label="Redigere terræn" name="edit land check" tool_tip="Hvis dette er valg, kan enhver redigere dit land. Det er bedst ikke at vælge her, da det altid er muligt for dig som ejer at ændre terræn på dit eget land."/>
- <check_box label="Lave landemærker" name="check landmark"/>
<check_box label="Flyve" name="check fly" tool_tip="Hvis valgt, kan beboere flyve på dit land. Hvis ikke valgt kan beboere kun flyve ind på dit land og over dit land."/>
- <text name="allow_label2" left="194">
+ <text left="194" name="allow_label2">
Lave objekter:
</text>
<check_box label="Alle beboere" name="edit objects check"/>
<check_box label="Gruppe" name="edit group objects check"/>
- <text name="allow_label3" left="170">
+ <text left="170" name="allow_label3">
Anbringe objekter:
</text>
<check_box label="Alle beboere" name="all object entry check"/>
<check_box label="Gruppe" name="group object entry check"/>
- <text name="allow_label4" left="200">
+ <text left="200" name="allow_label4">
Køre scripts:
</text>
<check_box label="Alle beboere" name="check other scripts"/>
@@ -287,73 +322,37 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
</text>
<check_box label="Sikker (ingen skade)" name="check safe" tool_tip="Hvis valgt, er det ikke muligt at forårsage skade på andre beboere. Hvis fravalgt er det muligt at få skader (f.eks. ved kamp)."/>
<check_box label="Skub forbudt" name="PushRestrictCheck" tool_tip="Forhindrer scripts i at skubbe. Valg af denne mulighed, kan være nyttigt for at forhindre forstyrrende adfærd på dit land."/>
- <check_box label="Vis sted i søgning (L$30/uge) i kategorien:" name="ShowDirectoryCheck" tool_tip="Lad dit parcel blive vist i søge resultaterne"/>
- <panel.string name="search_enabled_tooltip">
- Lad beboere se denne parcel i søgeresultater
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Denne mulighed er ikke til stede da parcellens område er 128 m² eller mindre.
-Kun større parceller kan vises i søgning.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Dette valg er lukket da du ikke kan ændre på denne parcels opsætning.
- </panel.string>
+ <check_box label="Vis sted i søgning (L$30/uge)" name="ShowDirectoryCheck" tool_tip="Lad dit parcel blive vist i søge resultaterne"/>
<combo_box name="land category with adult">
- <combo_box.item name="item0" label="Enhver kategori"
- />
- <combo_box.item name="item1" label="Linden sted"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Kunst &amp; kultur"
- />
- <combo_box.item name="item4" label="Business"
- />
- <combo_box.item name="item5" label="Uddannelse"
- />
- <combo_box.item name="item6" label="Spil"
- />
- <combo_box.item name="item7" label="Afslapning"
- />
- <combo_box.item name="item8" label="Nybegynder venligt"
- />
- <combo_box.item name="item9" label="Parker &amp; natur"
- />
- <combo_box.item name="item10" label="Beboelse"
- />
- <combo_box.item name="item11" label="Indkøb"
- />
- <combo_box.item name="item12" label="Andet"
- />
+ <combo_box.item label="Enhver kategori" name="item0"/>
+ <combo_box.item label="Linden sted" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Kunst &amp; kultur" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Uddannelse" name="item5"/>
+ <combo_box.item label="Spil" name="item6"/>
+ <combo_box.item label="Afslapning" name="item7"/>
+ <combo_box.item label="Nybegynder venligt" name="item8"/>
+ <combo_box.item label="Parker &amp; natur" name="item9"/>
+ <combo_box.item label="Beboelse" name="item10"/>
+ <combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Andet" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item name="item0" label="Enhver kategori" />
- <combo_box.item name="item1" label="Linden sted" />
- <combo_box.item name="item3" label="Kunst &amp; kultur" />
- <combo_box.item name="item4" label="Business" />
- <combo_box.item name="item5" label="Uddannelse" />
- <combo_box.item name="item6" label="Spil" />
- <combo_box.item name="item7" label="Afslapning" />
- <combo_box.item name="item8" label="Nybegynder venligt" />
- <combo_box.item name="item9" label="Parker &amp; natur" />
- <combo_box.item name="item10" label="Beboelse" />
- <combo_box.item name="item11" label="Indkøb" />
- <combo_box.item name="item12" label="Andet" />
+ <combo_box.item label="Enhver kategori" name="item0"/>
+ <combo_box.item label="Linden sted" name="item1"/>
+ <combo_box.item label="Kunst &amp; kultur" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Uddannelse" name="item5"/>
+ <combo_box.item label="Spil" name="item6"/>
+ <combo_box.item label="Afslapning" name="item7"/>
+ <combo_box.item label="Nybegynder venligt" name="item8"/>
+ <combo_box.item label="Parker &amp; natur" name="item9"/>
+ <combo_box.item label="Beboelse" name="item10"/>
+ <combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Andet" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" name="?"/>
<check_box label="Mature indhold" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Mature indhold
- </panel.string>
- <panel.string name="mature_check_adult">
- Adult indhold
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Din parcel information eller indhold anses for at være &apos;adult&apos;.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Din parcel information eller indhold anses for at være &apos;adult&apos;.
- </panel.string>
<text name="Snapshot:">
Foto:
</text>
@@ -361,40 +360,35 @@ Kun større parceller kan vises i søgning.
<text name="landing_point">
Landingspunkt: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (ingen)
- </panel.string>
<button label="Vælg" label_selected="Vælg" name="Set" tool_tip="Indstiller landingspunkt, hvor de besøgende ankommer. Sættes til din avatars aktuelle placering i denne parcel."/>
<button label="Fjern" label_selected="Fjern" name="Clear" tool_tip="Fjerner oplysning om landingspunkt."/>
<text name="Teleport Routing: ">
Teleport valg:
</text>
<combo_box name="landing type" tool_tip="Vælg hvordan du vil håndtere teleporteringer til dit land.">
- <combo_box.item name="Blocked" label="Blokeret" />
- <combo_box.item name="LandingPoint" label="Landingspunkt" />
- <combo_box.item name="Anywhere" label="Hvor som helst" />
+ <combo_box.item label="Blokeret" name="Blocked"/>
+ <combo_box.item label="Landingspunkt" name="LandingPoint"/>
+ <combo_box.item label="Hvor som helst" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Skub forbudt
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Skub forbudt (Uanset region indstilling)
- </panel.string>
</panel>
- <panel label="Medier" name="land_media_panel">
- <text name="with media:" left="4">
+ <panel label="MEDIA" name="land_media_panel">
+ <text left="4" name="with media:">
Medie type:
</text>
<combo_box name="media type" tool_tip="Specificer om URL-adressen er til en film, hjemmeside eller et andet medie."/>
- <text name="at URL:" left="4">
+ <text left="4" name="at URL:">
Medie URL:
</text>
<button label="Vælg..." label_selected="Vælg..." name="set_media_url"/>
- <text name="Description:" left="4">
+ <text name="CurrentURL:">
+ Nuværende side:
+ </text>
+ <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
+ <text left="4" name="Description:">
Beskrivelse:
</text>
<line_editor name="url_description" tool_tip="Tekst vist ved siden af Afspil/Hent knappen"/>
- <text name="Media texture:" left="4">
+ <text left="4" name="Media texture:">
Erstat tekstur:
</text>
<texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede"/>
@@ -402,13 +396,7 @@ Kun større parceller kan vises i søgning.
(Objekter der har denne tekstur vil vise filmen eller
web-siden, efter du klikker på play knappen.)
</text>
- <text name="Options:">
- Medie valg:
- </text>
<check_box label="Auto skalér" name="media_auto_scale" tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt."/>
- <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
- <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
- <check_box label="Skjul musik URL" name="hide_music_url" tool_tip="Klik her for at skjule musik adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
<text name="media_size" tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." width="105">
Medie Størrelse:
</text>
@@ -417,56 +405,42 @@ web-siden, efter du klikker på play knappen.)
<text name="pixels">
pixels
</text>
- <text name="MusicURL:">
- Musik URL:
- </text>
- <text name="Sound:">
- Lyd:
- </text>
- <check_box label="Begræns lyde fra bevægelser og objekter til denne parcel" name="check sound local"/>
- <button label="?" label_selected="?" name="?" left="400"/>
- <text name="Voice settings:">
- Stemme:
+ <text name="Options:">
+ Medie valg:
</text>
- <radio_group name="parcel_voice_channel">
- <radio_item name="Estate" label="Brug Estate kanalen" />
- <radio_item name="Private" label="Brug en privat kanal" />
- <radio_item name="Disabled" label="Slå stemme chat fra på denne parcel" />
- </radio_group>
+ <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
+ </panel>
+ <panel label="LYD" name="land_audio_panel">
+ <check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
+ <check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
</panel>
- <panel label="Adgang" name="land_access_panel">
+ <panel label="ADGANG" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Defineret via estate)
+ </panel.string>
+ <panel.string name="estate_override">
+ En eller flere af disse valg er indstillet på estate niveau
+ </panel.string>
<text name="Limit access to this parcel to:">
Adgang til denne parcel
</text>
- <check_box label="Tillad offentlig adgang" name="public_access"/>
+ <check_box label="Tillad offentlig adgang [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Blokér adgang for:
+ Blokér adgang for::
</text>
- <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/>
- <check_box label="Beboere der ikke er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/>
- <panel.string name="estate_override">
- En eller flere af disse valg er indstillet på estate niveau
- </panel.string>
+ <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/>
+ <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/>
<check_box label="Tillad adgang til gruppen: [GROUP]" name="GroupCheck" tool_tip="Vælg gruppe under fanen &apos;generelt&apos;."/>
<check_box label="Sælg adgang til:" name="PassCheck" tool_tip="Tillader midlertidig adgang til denne parcel"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Alle" />
- <combo_box.item name="Group" label="Gruppe" />
+ <combo_box.item label="Alle" name="Anyone"/>
+ <combo_box.item label="Gruppe" name="Group"/>
</combo_box>
<spinner label="Pris i L$:" name="PriceSpin"/>
<spinner label="Timers adgang:" name="HoursSpin"/>
- <text label="Tillad altid" name="AllowedText">
- Altid godkendte beboere
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] vist, [MAX] max)"/>
- <button label="Tilføj..." label_selected="Tilføj..." name="add_allowed"/>
- <button label="Fjern" label_selected="Fjern" name="remove_allowed"/>
- <text label="Blokér" name="BanCheck">
- Blokerede beboere
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] vist, [MAX] max)"/>
- <button label="Tilføj..." label_selected="Tilføj..." name="add_banned"/>
- <button label="Fjern" label_selected="Fjern" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="([LISTED] vist, [MAX] maks.)"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_activeim.xml b/indra/newview/skins/default/xui/da/floater_activeim.xml
new file mode 100644
index 0000000000..6fdac8d880
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="AKTIV IM"/>
diff --git a/indra/newview/skins/default/xui/da/floater_animation_preview.xml b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
index 8cb0eee601..47e02f0704 100644
--- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
@@ -1,97 +1,184 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Fejlede at starte bevægelse
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animations filen er [LENGTH] sekunder lang.
+
+Maksimal animations længde er [MAX_LENGTH] sekunder.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Kan ikke læse animations fil.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fil afsluttet for tidligt.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Kan ikke læse &quot;constraint definition&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Kan ikke åbne BVH fil.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ugyldig header i HIERARCHY.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Kan ikke finde &quot;ROOT&quot; eller &quot;JOINT&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Kan ikke finde JOINT navn.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Kan ikke finde OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Kan ikke finde CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Kan ikke læse &quot;rotation order&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Kan ikke finde rotationsakser.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Kan ikke finde MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Kan ikke læse antal &quot;frames&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Kan ikke læse &quot;frame time&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Kan ikke læse positionsværdier.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Kan ikke læse rotationsværdier.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ kan ikke åbne &quot;translation file&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Kan ikke læse &quot;translation header.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Kan ikke aflæse &quot;translation&quot; navne.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Kan ikke læse &quot;translation ignore&quot; værdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Kan ikke læse &quot;translation relative&quot; værdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Kan ikke læse &quot;translation outname&quot; værdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Kan ikke læse &quot;translation matrix&quot;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Kan ikke læse &quot;mergechild&quot; navn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Kan ikke læse &quot;mergeparent&quot; navn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Kan ikke finde prioritetsværdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Kan ikke læse &quot;loop&quot; værdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ kan ikke læse &quot;easeIn&quot; værdier.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Kan ikke læse &quot;easeOut&quot; værdier.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Kan ikke læse &quot;hand morph&quot; værdi.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ kan ikke læse &quot;emote&quot; navn.
+ </floater.string>
<text name="name_label">
Navn:
</text>
<text name="description_label">
Beskrivelse:
</text>
- <spinner label="Prioritet" name="priority"
- tool_tip="Vælg hvilke andre animationer der har lavere prioritet end denne." />
- <check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant." />
- <spinner left="76" label_width="40" width="105" label="Ind(%)" name="loop_in_point" tool_tip="Sætter punktet hvor gentagelsen genstarter fra."/>
- <spinner label="Ud (%)" name="loop_out_point"
- tool_tip="Sætter punktet i animationen der afslutter gentagelsen." />
+ <spinner label="Prioritet" name="priority" tool_tip="Vælg hvilke andre animationer der &quot;overstyres&quot; af denne"/>
+ <check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant"/>
+ <spinner label="Ind(%)" label_width="40" left="76" name="loop_in_point" tool_tip="Sætter punktet hvor gentagelsen genstarter fra" width="105"/>
+ <spinner label="Ud (%)" name="loop_out_point" tool_tip="Sætter punktet i animationen der afslutter gentagelsen"/>
<text name="hand_label">
HÃ¥nd posering
</text>
- <combo_box label="" name="hand_pose_combo"
- tool_tip="Kontrollerer hvad hænderne går i løbet af animationen." width="140">
- <combo_box.item name="Spread" label="Spredt" />
- <combo_box.item name="Relaxed" label="Afslappet" />
- <combo_box.item name="PointBoth" label="Peg begge" />
- <combo_box.item name="Fist" label="Knytnæver" />
- <combo_box.item name="RelaxedLeft" label="Afslappet venstre" />
- <combo_box.item name="PointLeft" label="Peg venstre" />
- <combo_box.item name="FistLeft" label="Knytnæve venstre" />
- <combo_box.item name="RelaxedRight" label="Afslappet højre" />
- <combo_box.item name="PointRight" label="Peg højre" />
- <combo_box.item name="FistRight" label="Knytnæve højre" />
- <combo_box.item name="SaluteRight" label="Honnør højre" />
- <combo_box.item name="Typing" label="Skriver" />
- <combo_box.item name="PeaceRight" label="Fredstegn højre" />
+ <combo_box label="" name="hand_pose_combo" tool_tip="Kontrollerer hvad hænderne går i løbet af animationen" width="140">
+ <combo_box.item label="Spredt" name="Spread"/>
+ <combo_box.item label="Afslappet" name="Relaxed"/>
+ <combo_box.item label="Peg begge" name="PointBoth"/>
+ <combo_box.item label="Knytnæver" name="Fist"/>
+ <combo_box.item label="Afslappet venstre" name="RelaxedLeft"/>
+ <combo_box.item label="Peg venstre" name="PointLeft"/>
+ <combo_box.item label="Knytnæve venstre" name="FistLeft"/>
+ <combo_box.item label="Afslappet højre" name="RelaxedRight"/>
+ <combo_box.item label="peg højre" name="PointRight"/>
+ <combo_box.item label="knytnæve højre" name="FistRight"/>
+ <combo_box.item label="Honnør højre" name="SaluteRight"/>
+ <combo_box.item label="Skrivende" name="Typing"/>
+ <combo_box.item label="Fredstegn højre" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Ansigtsudtryk
</text>
- <combo_box label="" name="emote_combo"
- tool_tip="Angiver hvad ansigtet gør under animationen" width="140">
- <combo_box.item name="[None]" label="Intet]" />
- <combo_box.item name="Aaaaah" label="Aaaaah" />
- <combo_box.item name="Afraid" label="Bange" />
- <combo_box.item name="Angry" label="Vred" />
- <combo_box.item name="BigSmile" label="Stort smil" />
- <combo_box.item name="Bored" label="Keder sig" />
- <combo_box.item name="Cry" label="Græder" />
- <combo_box.item name="Disdain" label="Forarget" />
- <combo_box.item name="Embarrassed" label="Flov" />
- <combo_box.item name="Frown" label="Skuler" />
- <combo_box.item name="Kiss" label="Kysser" />
- <combo_box.item name="Laugh" label="Griner" />
- <combo_box.item name="Plllppt" label="Plllppt" />
- <combo_box.item name="Repulsed" label="Frastødt" />
- <combo_box.item name="Sad" label="Ked af det" />
- <combo_box.item name="Shrug" label="Skuldertræk" />
- <combo_box.item name="Smile" label="Smiler" />
- <combo_box.item name="Surprise" label="Overrasket" />
- <combo_box.item name="Wink" label="Blinker" />
- <combo_box.item name="Worry" label="Bekymret" />
+ <combo_box label="" name="emote_combo" tool_tip="Angiver hvad ansigtet gør under animationen" width="140">
+ <combo_box.item label="(Intet)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Bange" name="Afraid"/>
+ <combo_box.item label="Vred" name="Angry"/>
+ <combo_box.item label="Stort smil" name="BigSmile"/>
+ <combo_box.item label="Keder sig" name="Bored"/>
+ <combo_box.item label="Græder" name="Cry"/>
+ <combo_box.item label="Forarget" name="Disdain"/>
+ <combo_box.item label="Flov" name="Embarrassed"/>
+ <combo_box.item label="Skuler" name="Frown"/>
+ <combo_box.item label="Kysser" name="Kiss"/>
+ <combo_box.item label="Griner" name="Laugh"/>
+ <combo_box.item label="Plllppt" name="Plllppt"/>
+ <combo_box.item label="Frastødt" name="Repulsed"/>
+ <combo_box.item label="Ked af det" name="Sad"/>
+ <combo_box.item label="Skuldertræk" name="Shrug"/>
+ <combo_box.item label="Smil" name="Smile"/>
+ <combo_box.item label="Overrasket" name="Surprise"/>
+ <combo_box.item label="Blinker" name="Wink"/>
+ <combo_box.item label="Bekymret" name="Worry"/>
</combo_box>
<text name="preview_label">
Vis mens
</text>
- <combo_box label="" name="preview_base_anim"
- tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140">
- <combo_box.item name="Standing" label="Står" />
- <combo_box.item name="Walking" label="GÃ¥r" />
- <combo_box.item name="Sitting" label="Sidder" />
- <combo_box.item name="Flying" label="Flyver" />
+ <combo_box label="" name="preview_base_anim" tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140">
+ <combo_box.item label="Stående" name="Standing"/>
+ <combo_box.item label="GÃ¥ende" name="Walking"/>
+ <combo_box.item label="Sidder" name="Sitting"/>
+ <combo_box.item label="Flyver" name="Flying"/>
</combo_box>
- <spinner label="start (sec)" name="ease_in_time"
- tool_tip="Tid i sekunder animationen bruger på at komme i gang." />
- <spinner label="Afslut (sec)" name="ease_out_time"
- tool_tip="Tid i sekunder animationen bruger på at afslutte." />
- <button label="" name="play_btn" tool_tip="Start/pause din animation." />
- <button label="" name="stop_btn" tool_tip="Stop afspilning af animation" />
- <slider label="" name="playback_slider" />
+ <spinner label="start (sec)" name="ease_in_time" tool_tip="Tid (i sekunder) animationen bruger på at komme i gang."/>
+ <spinner label="Afslut (sec)" name="ease_out_time" tool_tip="Tid (i sekunder) animationen bruger på at afslutte"/>
+ <button label="" name="play_btn" tool_tip="Start din animation"/>
+ <button name="pause_btn" tool_tip="Pause din animation"/>
+ <button label="" name="stop_btn" tool_tip="Stop afspilning af animation"/>
+ <slider label="" name="playback_slider"/>
<text name="bad_animation_text">
Kan ikke læse animations fil.
Vi anbefaler BVH filer der er exporteret fra Poser 4.
</text>
- <button label="Annullér" name="cancel_btn" />
- <button label="Hent (L$[AMOUNT])" name="ok_btn" />
- <string name="failed_to_initialize">
- Fejlede at starte bevægelse
- </string>
- <string name="anim_too_long">
- Animations filen er [LENGTH] sekunder lang.
-
-Maksimal animations længde er [MAX_LENGTH] sekunder.
- </string>
- <string name="failed_file_read">
- Kan ikke læse animations fil.
-
-[STATUS]
- </string>
+ <button label="Hent (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_auction.xml b/indra/newview/skins/default/xui/da/floater_auction.xml
index f981242f8a..e74e8a991b 100644
--- a/indra/newview/skins/default/xui/da/floater_auction.xml
+++ b/indra/newview/skins/default/xui/da/floater_auction.xml
@@ -1,9 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="Start Linden land salg">
- <check_box label="Vis også gul aftegning af område" name="fence_check" />
- <button label="Foto" label_selected="Foto" name="snapshot_btn" />
- <button label="OK" label_selected="OK" name="ok_btn" />
- <string name="already for sale">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="START LINDEN LAND SALG">
+ <floater.string name="already for sale">
Du kan ikke sætte jord på auktion der allerede er sat til salg.
- </string>
+ </floater.string>
+ <check_box initial_value="true" label="Vis også gul aftegning af område" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="Sælg til enhver" label_selected="Sælg til enhver" name="sell_to_anyone_btn"/>
+ <button label="Nulstil valg" label_selected="Nulstil valg" name="reset_parcel_btn"/>
+ <button label="Start auktion" label_selected="Start auktion" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml
index f93f0a3525..a337da9b51 100644
--- a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml
@@ -1,5 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Vælg beboer">
+<floater name="avatarpicker" title="VÆLG BEBOER">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; ikke fundet
+ </floater.string>
+ <floater.string name="no_one_near">
+ Ingen i nærheden
+ </floater.string>
+ <floater.string name="no_results">
+ Ingen resultater
+ </floater.string>
+ <floater.string name="searching">
+ Søger...
+ </floater.string>
+ <string label="Vælg" label_selected="Vælg" name="Select">
+ Vælg
+ </string>
+ <string name="Close">
+ Luk
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Søg" name="SearchPanel">
<text name="InstructSearchResidentName">
@@ -7,34 +25,22 @@
</text>
<button label="Find" label_selected="Find" name="Find"/>
</panel>
- <panel label="Visitkort" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Vælg et visitkort:
+ <panel label="Venner" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Vælg en person:
</text>
</panel>
<panel label="Nær ved mig" name="NearMePanel">
<text name="InstructSelectResident">
- Vælg beboere i nærheden:
+ Vælg en person nær:
</text>
- <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh"/>
<slider label="Område" name="near_me_range"/>
<text name="meters">
meter
</text>
+ <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh"/>
</panel>
</tab_container>
- <button label="Vælg" label_selected="Vælg" name="Select"/>
- <button label="Annullér" label_selected="Annullér" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; ikke fundet
- </string>
- <string name="no_one_near">
- Ingen i nærheden
- </string>
- <string name="no_results">
- Ingen resultater
- </string>
- <string name="searching">
- Søger...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
index e3a736b200..1111c5e18b 100644
--- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
@@ -1,30 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="avatar_texture_debug" title="Avatar teksturer">
- <text name="baked_label">
- Faste teksturer
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="AVATAR TEKSTURER">
+ <floater.string name="InvalidAvatar">
+ UGYLDING AVATAR
+ </floater.string>
<text name="composite_label">
Blandede teksturer
</text>
- <texture_picker label="Hoved" name="baked_head" />
- <texture_picker label="Makeup" name="head_bodypaint" />
- <texture_picker label="HÃ¥r" name="hair" />
- <button label="Drop" label_selected="Dump" name="Dump" />
- <texture_picker label="øjne" name="baked_eyes" />
- <texture_picker label="øje" name="eye_texture" />
- <texture_picker label="Overkrop" name="baked_upper_body" />
- <texture_picker label="Tatovering overkrop" name="upper_bodypaint" />
- <texture_picker label="Undertrøje" name="undershirt" />
- <texture_picker label="Handsker" name="gloves" />
- <texture_picker label="Trøje" name="shirt" />
- <texture_picker label="øvre jakke" name="upper_jacket" />
- <texture_picker label="Underkrop" name="baked_lower_body" />
- <texture_picker label="Tatovering underkrop" name="lower_bodypaint" />
- <texture_picker label="Underbukser" name="underpants" />
- <texture_picker label="Strømper" name="socks" />
- <texture_picker label="Sko" name="shoes" />
- <texture_picker label="Bukser" name="pants" />
- <texture_picker label="Jakke" name="jacket" />
- <texture_picker label="Nederdel" name="baked_skirt" />
- <texture_picker label="Nederdel" name="skirt_texture" />
+ <button label="Drop" label_selected="Dump" name="Dump"/>
+ <texture_picker label="HÃ¥r" name="hair_grain"/>
+ <texture_picker label="Alpha - hår" name="hair_alpha"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Alpha - hoved" name="head_alpha"/>
+ <texture_picker label="Tatovering hovede" name="head_tattoo"/>
+ <texture_picker label="Øje" name="eyes_iris"/>
+ <texture_picker label="Alpha - øjne" name="eyes_alpha"/>
+ <texture_picker label="Bodypaint - overkrop" name="upper_bodypaint"/>
+ <texture_picker label="Undertrøje" name="upper_undershirt"/>
+ <texture_picker label="Handsker" name="upper_gloves"/>
+ <texture_picker label="Trøje" name="upper_shirt"/>
+ <texture_picker label="Øvre jakke" name="upper_jacket"/>
+ <texture_picker label="Alpha - øvre" name="upper_alpha"/>
+ <texture_picker label="Øvre tatovering" name="upper_tattoo"/>
+ <texture_picker label="Bodypaint - underkrop" name="lower_bodypaint"/>
+ <texture_picker label="Undertøj" name="lower_underpants"/>
+ <texture_picker label="Strømper" name="lower_socks"/>
+ <texture_picker label="Sko" name="lower_shoes"/>
+ <texture_picker label="Bukser" name="lower_pants"/>
+ <texture_picker label="Jakke" name="lower_jacket"/>
+ <texture_picker label="Alpha - nedre" name="lower_alpha"/>
+ <texture_picker label="Nedre tatovering" name="lower_tattoo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml
index 318a23df4c..d67d859e7b 100644
--- a/indra/newview/skins/default/xui/da/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/da/floater_beacons.xml
@@ -1,15 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="beacons" title="Pejlelys">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="PEJLELYS">
<panel name="beacons_panel">
- <check_box label="Kun scriptede objekter med &quot;rør&quot;" name="touch_only" />
- <check_box label="Scriptede objekter" name="scripted" />
- <check_box label="Fysiske objekter" name="physical" />
- <check_box label="Lyd kilder" name="sounds" />
- <check_box label="Partikel kilder" name="particles" />
- <check_box label="Rendér highlights" name="highlights" />
- <check_box label="Rendér pejlelys" name="beacons" />
- <text name="beacon_width_label">
- Pejlelys bredde:
+ <text name="label_show">
+ Vis:
</text>
+ <check_box label="Pejlelys" name="beacons"/>
+ <check_box label="Fremhævninger" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Pejlelys bredde">
+ Bredde:
+ </text>
+ <text name="label_objects">
+ For disse objekter:
+ </text>
+ <check_box label="Fysisk" name="physical"/>
+ <check_box label="Scriptet" name="scripted"/>
+ <check_box label="Kun berøring" name="touch_only"/>
+ <check_box label="Lydkilder" name="sounds"/>
+ <check_box label="Partikel kilder" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_build_options.xml b/indra/newview/skins/default/xui/da/floater_build_options.xml
index 3b3e14ad64..9196f19b78 100644
--- a/indra/newview/skins/default/xui/da/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_build_options.xml
@@ -1,8 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="build options floater" title="Gitter indstillinger">
- <spinner label="Gitter enhed (meter)" name="GridResolution" width="200" label_width="136"/>
- <spinner label="Gitter rækkevidde (meter)" name="GridDrawSize" width="200" label_width="136"/>
- <check_box label="Aktiver låsning til under-enheder" name="GridSubUnit" />
- <check_box label="Vis &apos;cross sections&apos;" name="GridCrossSection" />
- <slider label="Gitter synlighed" name="GridOpacity" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="GITTER VALG">
+ <spinner label="Gitter enheder (meter)" label_width="136" name="GridResolution" width="200"/>
+ <spinner label="Gitter rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/>
+ <check_box label="Aktivér låsning til underenheder" name="GridSubUnit"/>
+ <check_box label="Vis &apos;cross-sections&apos;" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Gitter synlighed">
+ Uigennemsigtighed:
+ </text>
+ <slider label="Gitter synlighed" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
index 77ae7fe060..0dd1a4f6ba 100644
--- a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Masse-ændring af rettigheder på indhold">
- <text name="applyto">
- Indholdstyper
- </text>
+<floater name="floaterbulkperms" title="REDIGÉR RETTIGHEDER FOR INDHOLD">
+ <floater.string name="nothing_to_modify_text">
+ Valgte indeholder ikke noget som kan redigeres.
+ </floater.string>
+ <floater.string name="status_text">
+ Sætter rettigheder på [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Påbegynder forespørgsel på rettighedsændringer...
+ </floater.string>
+ <floater.string name="done_text">
+ Afsluttet forespørgsel på rettighedsændringer.
+ </floater.string>
<check_box label="Animationer" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animation"/>
<check_box label="Kropsdele" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Kropsdele"/>
<check_box label="Tøj" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Tøj"/>
<check_box label="Bevægelser" name="check_gesture"/>
- <check_box label="Landemærker" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Bevægelser"/>
<check_box label="Noter" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Noter"/>
<check_box label="Objekter" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objekter"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Lyde" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Lyde"/>
<check_box label="Teksturer" name="check_texture"/>
- <button label="Vælg alle" label_selected="Alle" name="check_all"/>
- <button label="Fravælg alle" label_selected="Ingen" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Teksturer"/>
+ <button label="√ Alle" label_selected="Alle" name="check_all"/>
+ <button label="Fjern" label_selected="Ingen" name="check_none"/>
<text name="newperms">
- Nye rettigheder
+ Nye indholdsrettigheder
+ </text>
+ <text name="GroupLabel">
+ Gruppe:
</text>
- <check_box label="Del med gruppe" name="share_with_group"/>
- <check_box label="Tillad enhver at kopiere" name="everyone_copy"/>
+ <check_box label="Del" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Enhver:
+ </text>
+ <check_box label="Kopiér" name="everyone_copy"/>
<text name="NextOwnerLabel">
- Næste ejer kan:
+ Næste ejer:
</text>
<check_box label="Redigere" name="next_owner_modify"/>
<check_box label="Kopiére" name="next_owner_copy"/>
- <check_box label="Sælge/Give væk" name="next_owner_transfer"/>
- <button label="Hjælp" name="help"/>
- <button label="Gem" name="apply"/>
- <button label="Luk" name="close"/>
- <string name="nothing_to_modify_text">
- Valgte indeholder ikke noget som kan redigeres.
- </string>
- <string name="status_text">
- Sætter rettigheder på [NAME]
- </string>
- <string name="start_text">
- Påbegynder forespørgsel på rettighedsændringer...
- </string>
- <string name="done_text">
- Afsluttet forespørgsel på rettighedsændringer.
- </string>
+ <check_box initial_value="true" label="Overfør" name="next_owner_transfer" tool_tip="Næste ejer kan sælge eller forære dette objekt væk"/>
+ <button label="Ok" name="apply"/>
+ <button label="Annullér" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_bumps.xml b/indra/newview/skins/default/xui/da/floater_bumps.xml
index 62a1cd9e5c..d22de6e7f1 100644
--- a/indra/newview/skins/default/xui/da/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/da/floater_bumps.xml
@@ -1,21 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_bumps" title="Bump, skub &amp; slag">
- <string name="none_detected">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="BUMP, SKUB &amp; SLAG">
+ <floater.string name="none_detected">
Ingen registreret
- </string>
- <string name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] ramte dig
- </string>
- <string name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] skubbede dig med et script
- </string>
- <string name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et objekt
- </string>
- <string name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et scriptet objekt
- </string>
- <string name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et fysisk objekt
- </string>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
index c9df548747..c2b2ccc244 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_buy_contents" title="Køb indhold">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="KØB INDHOLD">
<text name="contains_text">
[NAME] indeholder:
</text>
<text name="buy_text">
Køb for L$[AMOUNT] fra [NAME]?
</text>
- <button label="Annullér" label_selected="Annullér" name="cancel_btn" />
- <button label="Køb" label_selected="Køb" name="buy_btn" />
- <check_box label="Tag tøj på nu" name="wear_check" />
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
+ <button label="Køb" label_selected="Køb" name="buy_btn"/>
+ <check_box label="Tag tøj på nu" name="wear_check"/>
<string name="no_copy_text">
(kopiér ej)
</string>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index 1c5876572b..18ee0e0597 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -1,68 +1,66 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="buy currency" title="Køb valuta">
- <text name="info_buying">
- Køber valuta:
- </text>
- <text name="info_cannot_buy">
- Kan ikke købe nu:
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="KØB L$">
+ <floater.string name="buy_currency">
+ Køb L$ [LINDENS] for ca. [LOCALAMOUNT]
+ </floater.string>
<text name="info_need_more">
- Du har ikke penge nok:
+ Du skal bruge flere L$
</text>
- <text name="error_message">
- Noget er gået galt.
- </text>
- <button label="GÃ¥ til hjemmeside" name="error_web" />
<text name="contacting">
Kontakter LindeX...
</text>
- <text name="buy_action_unknown">
- Køb L$ på LindeX valuta marked
+ <text name="info_buying">
+ Køb L$
</text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
+ <text name="balance_label">
+ Jeg har
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
</text>
<text name="currency_action">
- Køb L$
+ Jeg ønsker at købe
</text>
- <line_editor name="currency_amt">
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
1234
</line_editor>
+ <text name="buying_label">
+ Til prisen
+ </text>
<text name="currency_est">
- for ca. US$ [USD]
+ ca. [LOCALAMOUNT]
</text>
<text name="getting_data">
- Henter data...
- </text>
- <text name="balance_label">
- Du har i øjeblikket
- </text>
- <text name="balance_amount">
- L$ [AMT]
- </text>
- <text name="buying_label">
- Du køber
+ Estimerer...
</text>
- <text name="buying_amount">
- L$ [AMT]
+ <text name="buy_action">
+ [NAME] L$ [PRICE]
</text>
<text name="total_label">
- Din balance bliver
+ Min nye beholdning vil være
</text>
<text name="total_amount">
L$ [AMT]
</text>
+ <text name="currency_links">
+ [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ </text>
+ <text name="exchange_rate_note">
+ Indtast beløbet for at se nyeste valutakurs.
+ </text>
<text name="purchase_warning_repurchase">
- Bekræfter at denne handel kun omfatter valuta.
-Gentag operationen venligst igen.
+ Bekræftelse af dette køb medfører kun køb af L$, ikke objektet.
</text>
<text name="purchase_warning_notenough">
- Du køber ikke nok valuta, tast et større beløb
-og prøv igen.
- </text>
- <button label="Annullér" name="cancel_btn" />
- <button label="Køb" name="buy_btn" />
- <string name="buy_currency">
- Køb L$ [LINDENS] for ca. US$ [USD]
- </string>
+ Du køber ikke nok L$. Forøg venligst beløbet.
+ </text>
+ <button label="Køb nu" name="buy_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ Kan ikke købe
+ </text>
+ <button label="Fortsæt til web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml
index 1d42ffb45a..987ad6585f 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Køb land">
+<floater name="buy land" title="KØB LAND">
<text name="region_name_label">
Region:
</text>
@@ -59,7 +59,7 @@
<text left_delta="62" name="info_price">
L$ 1500
(L$ 1.1/m²)
-sælges med objekter
+solgt med objekter
</text>
<text name="info_action">
Køb af dette land vil:
@@ -75,16 +75,16 @@ sælges med objekter
Kun premium medlemmer kan eje land.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/md, månedlig afregning" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/md, kvartalsvis afregning" />
- <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/md, årlig afregning" />
+ <combo_box.item label="US$9.95 pr. måned, faktureret månedligt" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50 pr. måned, faktureret kvartalsvist" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00 pr. måned, faktureret årligt" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Forøg dine månedlige arealanvendelse gebyrer til US $ 40/måned.
</text>
<text name="land_use_reason">
- You hold 1309 m² of land.
-This parcel is 512 m² of land.
+ Du ejer 1309 m² land.
+Denne parcel er på 512 m².
</text>
<text name="purchase_action">
Betal Joe Resident L$ 4000 dette areal
@@ -99,12 +99,12 @@ This parcel is 512 m² of land.
1000
</line_editor>
<text name="currency_est">
- for ca. US$ [AMOUNT2]
+ for ca. [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Du har L$2,100.
</text>
- <check_box label="Fjern [AMOUNT] kvadratmeter af bidrag fra gruppe." name="remove_contribution"/>
+ <check_box label="Fjern [AMOUNT] m² af bidrag fra gruppe." name="remove_contribution"/>
<button label="Køb" name="buy_btn"/>
<button label="Annullér" name="cancel_btn"/>
<string name="can_resell">
@@ -181,16 +181,16 @@ Prøv at vælge et mindre område.
Din konto kan eje jord.
</string>
<string name="land_holdings">
- Du har [BUYER] m² jord.
+ Du ejer [BUYER] m² land.
</string>
<string name="pay_to_for_land">
Betal L$ [AMOUNT] til [SELLER] for dette stykke jord
</string>
<string name="buy_for_US">
- Køb L$ [AMOUNT] for ca. US$ [AMOUNT2],
+ Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT],
</string>
<string name="parcel_meters">
- Denne parcel er [AMOUNT] m².
+ Denne parcel er på [AMOUNT] m²
</string>
<string name="premium_land">
Dette stykke jord er premium, og vil tælle som [AMOUNT] m².
@@ -200,7 +200,7 @@ Prøv at vælge et mindre område.
</string>
<string name="meters_supports_object">
[AMOUNT] m²
-kan indeholder [AMOUNT2] objekter
+kan indeholde [AMOUNT2] objekter
</string>
<string name="sold_with_objects">
solgt med objekter
diff --git a/indra/newview/skins/default/xui/da/floater_buy_object.xml b/indra/newview/skins/default/xui/da/floater_buy_object.xml
index f0e22c8eee..f9e18dcf65 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_object.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="contents" title="Køb kopi af objekt">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="KØB KOPI AF OBJEKT">
<text name="contents_text">
- og dets indhold:
+ Indeholder:
</text>
<text name="buy_text">
Køb for L$[AMOUNT] fra [NAME]?
</text>
- <button label="Annullér" label_selected="Annullér" name="cancel_btn" />
- <button label="Køb" label_selected="Køb" name="buy_btn" />
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
+ <button label="Køb" label_selected="Køb" name="buy_btn"/>
<string name="title_buy_text">
Køb
</string>
diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml
index c52f7ab832..2596559609 100644
--- a/indra/newview/skins/default/xui/da/floater_camera.xml
+++ b/indra/newview/skins/default/xui/da/floater_camera.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="camera_floater" title="">
<floater.string name="rotate_tooltip">
Roter kamera omkring fokus
@@ -11,6 +11,21 @@
</floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, til venstre og højre"/>
- <joystick_zoom name="zoom" tool_tip="Zoom kamera mod fokus"/>
+ <panel name="zoom" tool_tip="Zoom kamera mod fokus">
+ <slider_bar name="zoom_slider" tool_tip="Zoom kamera mod fokus"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kreds kamera omkring fokus"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Se bagfra"/>
+ <button name="group_view" tool_tip="Se som gruppe"/>
+ <button name="front_view" tool_tip="Se forfra"/>
+ <button name="mouselook_view" tool_tip="Førsteperson"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Rotér kamera"/>
+ <button label="" name="pan_btn" tool_tip="Panorér kamera"/>
+ <button label="" name="avatarview_btn" tool_tip="Se som avatar"/>
+ <button label="" name="freecamera_btn" tool_tip="Se objekt"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_choose_group.xml b/indra/newview/skins/default/xui/da/floater_choose_group.xml
index 01c5bf3367..1ccda4f1d7 100644
--- a/indra/newview/skins/default/xui/da/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/da/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="groups" title="Grupper">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GRUPPER">
<text name="groupdesc">
Vælg en gruppe:
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_color_picker.xml b/indra/newview/skins/default/xui/da/floater_color_picker.xml
index c8e1fc813b..514b2c4331 100644
--- a/indra/newview/skins/default/xui/da/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/da/floater_color_picker.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="Farve vælger">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="FARVE VÆLGER">
<text name="r_val_text">
Rød:
</text>
@@ -18,14 +18,14 @@
<text name="l_val_text">
Lysstyrke:
</text>
- <check_box label="Anvend straks" name="apply_immediate" />
- <button label="" label_selected="" name="color_pipette" />
- <button label="Annullér" label_selected="Annullér" name="cancel_btn" />
- <button label="Vælg" label_selected="Vælg" name="select_btn" />
+ <check_box label="Benyt nu" name="apply_immediate"/>
+ <button label="" label_selected="" name="color_pipette"/>
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
+ <button label="Ok" label_selected="Ok" name="select_btn"/>
<text name="Current color:">
Nuværende Farve:
</text>
<text name="(Drag below to save.)">
- (Træk ned og gem)
+ (Træk ned for at gemme)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml
index b434bea1ce..379302ef6a 100644
--- a/indra/newview/skins/default/xui/da/floater_customize.xml
+++ b/indra/newview/skins/default/xui/da/floater_customize.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Appearance" width="509">
+<floater name="floater customize" title="UDSEENDE" width="509">
<tab_container name="customize tab container" width="507">
<placeholder label="Krops Dele" name="body_parts_placeholder"/>
<panel label="Kropsbygning" name="Shape">
@@ -14,8 +14,8 @@
<button label="Overkrop" label_selected="Overkrop" name="Torso"/>
<button label="Ben" label_selected="Ben" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Kvinde" />
- <radio_item name="radio2" label="Mand" />
+ <radio_item label="Kvinde" name="radio"/>
+ <radio_item label="Mand" name="radio2"/>
</radio_group>
<text name="title">
[DESC]
@@ -78,9 +78,9 @@ og bagefter &apos;tage den på&apos;.
<text name="Item Action Label">
Hud:
</text>
- <texture_picker width="98" label="Tatoveringer hoved" name="Head Tattoos" tool_tip="Klik for at vælge et billede"/>
- <texture_picker width="98" label="Tatover. overkrop" name="Upper Tattoos" tool_tip="Klik for at vælge et billede"/>
- <texture_picker width="98" label="Tatover. underkrop" name="Lower Tattoos" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Tatoveringer hoved" name="Head Tattoos" tool_tip="Klik for at vælge et billede" width="98"/>
+ <texture_picker label="Tatover. overkrop" name="Upper Tattoos" tool_tip="Klik for at vælge et billede" width="98"/>
+ <texture_picker label="Tatover. underkrop" name="Lower Tattoos" tool_tip="Klik for at vælge et billede" width="98"/>
<button label="Lav ny hud" label_selected="Lav nyt hud" name="Create New"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -156,7 +156,7 @@ og bagefter &apos;tage dem på&apos;.
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
</panel>
- <panel label="Tøje" name="clothes_placeholder"/>
+ <placeholder label="Tøje" name="clothes_placeholder"/>
<panel label="Trøje" name="Shirt">
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
@@ -471,9 +471,81 @@ og bagefter &apos;tage den på&apos;.
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
</panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: kan ikke ændre
+ </text>
+ <text name="title_loading">
+ [DESC]: indlæser...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: ikke båret
+ </text>
+ <text name="path">
+ Placeret i [PATH]
+ </text>
+ <text name="not worn instructions">
+ Brug en ny &quot;alpha mask&quot; ved at trække en fra din beholding til din avatar.
+Alternativt kan du lave en fra bunden og bære denne.
+ </text>
+ <text name="no modify instructions">
+ Du har ikke rettigheder til at ændre denne.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
+ <button label="Lav ny &quot;Alpha&quot;" label_selected="Lav ny &quot;Alpha&quot;" name="Create New"/>
+ <button label="Tag af" label_selected="Tag af" name="Take Off"/>
+ <button label="Gem" label_selected="Gem" name="Save"/>
+ <button label="Gem som..." label_selected="Gem som..." name="Save As"/>
+ <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/>
+ </panel>
+ <panel label="Tatovering" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: kan ikke ændre
+ </text>
+ <text name="title_loading">
+ [DESC]: indlæser...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: ikke båret
+ </text>
+ <text name="path">
+ Placeret i [PATH]
+ </text>
+ <text name="not worn instructions">
+ Brug en ny tatovering ved at trække en fra din beholding til din avatar.
+Alternativt kan du lave en fra bunden og bære denne.
+ </text>
+ <text name="no modify instructions">
+ Du har ikke rettigheder til at ændre denne.
+ </text>
+ <text name="Item Action Label">
+ Tatovering:
+ </text>
+ <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/>
+ <button label="Tag af" label_selected="Tag af" name="Take Off"/>
+ <button label="Gem" label_selected="Gem" name="Save"/>
+ <button label="Gem som..." label_selected="Gem som..." name="Save As"/>
+ <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/>
+ </panel>
</tab_container>
<scroll_container left="212" name="panel_container"/>
+ <button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Opret sæt..." label_selected="Opret sæt..." name="Make Outfit"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
index 0ca7874c37..94cf4546e3 100644
--- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Day Cycle Floater" title="Dag cyklus opsætning">
+<floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING">
<tab_container name="Day Cycle Tabs">
<panel label="Dag cyklus" name="Day Cycle">
<button label="?" name="WLDayCycleHelp" />
diff --git a/indra/newview/skins/default/xui/da/floater_device_settings.xml b/indra/newview/skins/default/xui/da/floater_device_settings.xml
index 28afd7c459..06d431a8f9 100644
--- a/indra/newview/skins/default/xui/da/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/da/floater_device_settings.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_device_settings" title="Stemme chat indstillinger" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_device_settings" title="STEMME CHAT ENHEDSOPSÆTNING"/>
diff --git a/indra/newview/skins/default/xui/da/floater_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml
index 907771c67a..8d9c05500b 100644
--- a/indra/newview/skins/default/xui/da/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/da/floater_env_settings.xml
@@ -1,26 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Environment Editor Floater" title="Redigering af omgivelser">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="REDIGERING AF OMGIVELSER">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Tid på dagen
</text>
<text name="EnvTimeText2">
00:00
</text>
- <slider label="" name="EnvTimeSlider" />
+ <slider label="" name="EnvTimeSlider"/>
<text name="EnvCloudText">
Skydække
</text>
- <slider label="" name="EnvCloudSlider" />
+ <slider label="" name="EnvCloudSlider"/>
<text name="EnvWaterColorText">
Farve på vand
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger" />
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger"/>
<text name="EnvWaterFogText">
Tåge på vand
</text>
- <slider label="" name="EnvWaterFogSlider" />
- <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton" />
- <button label="Avanceret himmel" name="EnvAdvancedSkyButton" />
- <button label="Avanceret vand" name="EnvAdvancedWaterButton" />
- <button label="?" name="EnvSettingsHelpButton" />
+ <slider label="" name="EnvWaterFogSlider"/>
+ <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton"/>
+ <button label="Avanceret himmel" name="EnvAdvancedSkyButton"/>
+ <button label="Avanceret vand" name="EnvAdvancedWaterButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_font_test.xml b/indra/newview/skins/default/xui/da/floater_font_test.xml
index 7d8ef1b310..591d07188c 100644
--- a/indra/newview/skins/default/xui/da/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/da/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Font test">
+<floater name="contents" title="FONT TEST">
<text name="linea">
OverrideTest, skal vises her som fonten &apos;Times&apos;. (Fra default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_gesture.xml b/indra/newview/skins/default/xui/da/floater_gesture.xml
index 800693ea8c..b7075e356a 100644
--- a/indra/newview/skins/default/xui/da/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/da/floater_gesture.xml
@@ -1,16 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="Aktive bevægelser">
- <text name="help_label">
- Dobbelt-klik på en bevægelse for at afspille animation og lyd.
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Steder" name="gestures" title="BEVÆGELSER">
+ <floater.string name="loading">
+ Henter...
+ </floater.string>
+ <floater.string name="playing">
+ (Afspiller)
+ </floater.string>
+ <floater.string name="copy_name">
+ Kopi af [COPY_NAME]
+ </floater.string>
<scroll_list name="gesture_list">
- <column label="Genvej" name="trigger" />
- <column label="Taste" name="shortcut" />
- <column label="" name="key" />
- <column label="Navn" name="name" />
+ <scroll_list.columns label="Navn" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
+ <scroll_list.columns label="" name="key"/>
+ <scroll_list.columns label="Taste" name="shortcut"/>
</scroll_list>
- <button label="Ny" name="new_gesture_btn" />
- <button label="Redigér" name="edit_btn" />
- <button label="Afspil" name="play_btn" />
- <button label="Stop" name="stop_btn" />
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Flere muligheder"/>
+ <button name="new_gesture_btn" tool_tip="Lav ny bevægelse"/>
+ <button name="activate_btn" tool_tip="Aktivér/Deaktivér valgte bevægelse"/>
+ <button name="del_btn" tool_tip="Slet denne bevægelse"/>
+ </panel>
+ <button label="Redigér" name="edit_btn"/>
+ <button label="Afspil" name="play_btn"/>
+ <button label="Stop" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
index dcc1b8d2e8..2b10afe7e3 100644
--- a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
@@ -1,30 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Hardware Settings Floater" title="Hardware opsætning">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="HARDWARE OPSÆTNING">
<text name="Filtering:">
Filtrering:
</text>
- <check_box label="Anisotropic filtrering (langsommere når aktiveret)" name="ani" />
+ <check_box label="Anisotropic filtrering (langsommere når aktiveret)" name="ani"/>
<text name="Antialiasing:">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="100">
- <combo_box.item name="FSAADisabled" label="Slået fra"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Slået fra" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
- <spinner label="Gamma:" name="gamma" />
+ <spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(Lysstyrke, lavere er lysere, 0=benyt standard)
</text>
<text name="Enable VBO:">
Aktivér VBO:
</text>
- <check_box label="Aktivér OpenGL Vertex Buffer objekter" name="vbo"
- tool_tip="Aktivér af dette på nyere hardware giver performance forbedring. På ældre hardware kan aktivering medfø nedbrud." />
- <slider label="Tekstur hukommelse (MB):" name="GrapicsCardTextureMemory"
- tool_tip="Mængde hukommelse der skal allokeres til teksturer (textures). Standardindstilling er hukommelse på grafikkortet. Reduktion kan medfø bedre ydeevne, men kan samtidig gøre teksturer mere udflydende." />
- <spinner label="TÃ¥ge: afstandsforhold:" name="fog" />
- <button label="OK" label_selected="OK" name="OK" />
+ <check_box initial_value="true" label="Aktivér OpenGL Vertex Buffer objekter" name="vbo" tool_tip="Aktivér af dette på nyere hardware giver performance forbedring. På ældre hardware kan aktivering medfø nedbrud."/>
+ <slider label="Tekstur hukommelse (MB):" name="GraphicsCardTextureMemory" tool_tip="Mængde hukommelse der skal allokeres til teksturer (textures). Standardindstilling er hukommelse på grafikkortet. Reduktion kan medfø bedre ydeevne, men kan samtidig gøre teksturer mere udflydende."/>
+ <spinner label="TÃ¥ge: afstandsforhold:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_help_browser.xml b/indra/newview/skins/default/xui/da/floater_help_browser.xml
new file mode 100644
index 0000000000..fc52796344
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_help_browser.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="HJÆLP">
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls">
+ <button label="Ã…ben i min web browser" name="open_browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_hud.xml b/indra/newview/skins/default/xui/da/floater_hud.xml
index 0f11e2346d..c70da45955 100644
--- a/indra/newview/skins/default/xui/da/floater_hud.xml
+++ b/indra/newview/skins/default/xui/da/floater_hud.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="Tutorial" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="KURSUS"/>
diff --git a/indra/newview/skins/default/xui/da/floater_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml
index 0b42b78706..519a70d1d9 100644
--- a/indra/newview/skins/default/xui/da/floater_im.xml
+++ b/indra/newview/skins/default/xui/da/floater_im.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Personlig samtale (IM)">
<string name="only_user_message">
Du er den eneste deltager i denne samtale
@@ -10,7 +10,7 @@
Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
</string>
<string name="muted_message">
- Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet.
+ Du har blokeret denne beboer. Hvis du sender besked vil denne blokering fjernes.
</string>
<string name="generic_request_error">
Kunne ikke etablere forbindelse, prøv igen senere
diff --git a/indra/newview/skins/default/xui/da/floater_im_container.xml b/indra/newview/skins/default/xui/da/floater_im_container.xml
new file mode 100644
index 0000000000..da6f877f56
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="Personlige beskeder"/>
diff --git a/indra/newview/skins/default/xui/da/floater_im_session.xml b/indra/newview/skins/default/xui/da/floater_im_session.xml
new file mode 100644
index 0000000000..aa7df6ad2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="IM kontrol panel" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="Til" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_image_preview.xml b/indra/newview/skins/default/xui/da/floater_image_preview.xml
index 345c9aa6d1..52fd9f80c0 100644
--- a/indra/newview/skins/default/xui/da/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_image_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Image Preview" title="">
<text name="name_label">
Navn:
@@ -10,23 +10,23 @@
Se billede som:
</text>
<combo_box label="Tøj type" name="clothing_type_combo">
- <combo_box.item name="Image" label="Billede"/>
- <combo_box.item name="Hair" label="HÃ¥r"/>
- <combo_box.item name="FemaleHead" label="Kvinde - hoved"/>
- <combo_box.item name="FemaleUpperBody" label="Kvinde - overkrop"/>
- <combo_box.item name="FemaleLowerBody" label="Kvinde - underkrop"/>
- <combo_box.item name="MaleHead" label="Mand - hoved"/>
- <combo_box.item name="MaleUpperBody" label="Mand - overkrop"/>
- <combo_box.item name="MaleLowerBody" label="Mand - underkrop"/>
- <combo_box.item name="Skirt" label="Nederdel"/>
- <combo_box.item name="SculptedPrim" label="Sculpted prim"/>
+ <combo_box.item label="Billede" name="Image"/>
+ <combo_box.item label="HÃ¥r" name="Hair"/>
+ <combo_box.item label="Kvinde - hoved" name="FemaleHead"/>
+ <combo_box.item label="Kvinde - overkrop" name="FemaleUpperBody"/>
+ <combo_box.item label="Kvinde - underkrop" name="FemaleLowerBody"/>
+ <combo_box.item label="Mand - hoved" name="MaleHead"/>
+ <combo_box.item label="Mand - overkrop" name="MaleUpperBody"/>
+ <combo_box.item label="Mand - underkrop" name="MaleLowerBody"/>
+ <combo_box.item label="Nederdel" name="Skirt"/>
+ <combo_box.item label="Sculpted Prim" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Kunne ikke læse billede.
Prøv at gemme billede som en 24 bit Targa fil (.tga).
</text>
- <check_box label="Benyt komprimering uden tab" name="lossless_check" />
- <button label="Annullér" name="cancel_btn" />
- <button label="Hent (L$[AMOUNT])" name="ok_btn" />
+ <check_box label="Benyt komprimering uden tab" name="lossless_check"/>
+ <button label="Annullér" name="cancel_btn"/>
+ <button label="Hent (L$[AMOUNT])" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml
new file mode 100644
index 0000000000..3a1ef2e47d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="UKENDT PERSON KALDER OP">
+ <floater.string name="localchat">
+ Stemme chat nærved
+ </floater.string>
+ <floater.string name="anonymous">
+ anonym
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ kalder op.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ har sluttet sig til stemme chat opkald med en konference chat.
+ </floater.string>
+ <text name="question">
+ Ønsker du at forlade [CURRENT_CHAT] og slutte dig til denne stemme chat?
+ </text>
+ <button label="Acceptér" label_selected="Acceptér" name="Accept"/>
+ <button label="Afvis" label_selected="Afvis" name="Reject"/>
+ <button label="Start IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inspect.xml b/indra/newview/skins/default/xui/da/floater_inspect.xml
index 56c3f6f784..d0dca8863a 100644
--- a/indra/newview/skins/default/xui/da/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/da/floater_inspect.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="Inspecér objekter">
+<floater name="inspect" title="UNDERSØG OBJEKT">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Vælg et objekt fra listen for at markere det">
- <column label="Objekt navn" name="object_name"/>
- <column label="Objekt ejer" name="owner_name"/>
- <column label="Bygget af" name="creator_name"/>
- <column label="Lavet den " name="creation_date"/>
+ <scroll_list.columns label="Objekt navn" name="object_name"/>
+ <scroll_list.columns label="Objekt ejer" name="owner_name"/>
+ <scroll_list.columns label="Bygget af" name="creator_name"/>
+ <scroll_list.columns label="Lavet den " name="creation_date"/>
</scroll_list>
<button label="Se profil for ejer..." label_selected="" name="button owner" tool_tip="Se profilen for ejeren af det markerede objekt på listen"/>
<button label="Se profil for bygger..." label_selected="" name="button creator" tool_tip="Se profilen for den beboer der har bygget det markerede objekt på listen"/>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml
index 0b931bd7f4..d80051fb84 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory.xml
@@ -1,47 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory" title="Beholdning">
- <search_editor label="Skriv her for at søge" name="inventory search editor" />
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle ting" name="All Items" />
- <inventory_panel label="Nye ting" name="Recent Items" />
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Filer" name="File">
- <menu_item_call label="Ã…ben" name="Open" />
- <menu_item_call label="Nyt vindue" name="New Window" />
- <menu_item_call label="Vis filtre" name="Show Filters" />
- <menu_item_call label="Nulstil filtre" name="Reset Current" />
- <menu_item_call label="Luk alle mapper" name="Close All Folders" />
- <menu_item_call label="Tøm papirkurv" name="Empty Trash" />
- </menu>
- <menu label="Opret" name="Create">
- <menu_item_call label="Ny mappe" name="New Folder" />
- <menu_item_call label="Nyt script" name="New Script" />
- <menu_item_call label="Ny note" name="New Note" />
- <menu_item_call label="Ny bevægelse" name="New Gesture" />
- <menu name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt" />
- <menu_item_call label="Nye bukser" name="New Pants" />
- <menu_item_call label="Nye sko" name="New Shoes" />
- <menu_item_call label="Nye strømper" name="New Socks" />
- <menu_item_call label="Ny jakke" name="New Jacket" />
- <menu_item_call label="Ny nederdel" name="New Skirt" />
- <menu_item_call label="Nye handsker" name="New Gloves" />
- <menu_item_call label="Ny undertrøje" name="New Undershirt" />
- <menu_item_call label="Nye underbukser" name="New Underpants" />
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Ny figur" name="New Shape" />
- <menu_item_call label="Ny hud" name="New Skin" />
- <menu_item_call label="Nyt hår" name="New Hair" />
- <menu_item_call label="Nye øjne" name="New Eyes" />
- </menu>
- </menu>
- <menu label="Sortér" name="Sort">
- <menu_item_check label="Efter navn" name="By Name" />
- <menu_item_check label="Efter dato" name="By Date" />
- <menu_item_check label="Altid mapper efter navn" name="Folders Always By Name" />
- <menu_item_check label="System-mapper i toppen" name="System Folders To Top" />
- </menu>
- </menu_bar>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="BEHOLDNING">
+ <floater.string name="Title">
+ Beholdning
+ </floater.string>
+ <floater.string name="TitleFetching">
+ Beholdning (henter [ITEM_COUNT] genstande...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ Beholdning ([ITEM_COUNT] genstande) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Hentet
+ </floater.string>
+ <panel label="Beholdningspanel" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
index 9f28440fb0..fa36fab762 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="item properties" title="Egenskaber for Objekt i Beholdning">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="OPLYSNINGER OM BEHOLDNINGSGENSTAND">
+ <floater.string name="unknown">
+ (ukendt)
+ </floater.string>
+ <floater.string name="public">
+ (offentlig)
+ </floater.string>
+ <floater.string name="you_can">
+ Du kan:
+ </floater.string>
+ <floater.string name="owner_can">
+ Ejer kan:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Navn:
</text>
@@ -12,14 +27,14 @@
<text name="LabelCreatorName">
Nicole Linden
</text>
- <button label="Profil..." label_selected="" name="BtnCreator" />
+ <button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Ejer:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
- <button label="Profil..." label_selected="" name="BtnOwner" />
+ <button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erhvervet:
</text>
@@ -27,55 +42,32 @@
Wed May 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Du kan:
- </text>
- <check_box label="Redigere" name="CheckOwnerModify" />
- <check_box label="Kopiere" name="CheckOwnerCopy" />
- <check_box label="Sælge/give væk" name="CheckOwnerTransfer" />
- <text name="BaseMaskDebug">
- S:
- </text>
- <text name="OwnerMaskDebug">
- E:
+ Dig:
</text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Redigér" name="CheckOwnerModify"/>
+ <check_box label="Kopiere" name="CheckOwnerCopy"/>
+ <check_box label="Sælg" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Enhver:
</text>
- <text name="EveryoneMaskDebug">
- A:
+ <check_box label="Kopiér" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppe:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Del med gruppe" name="CheckShareWithGroup" />
- <check_box label="Tillad alle at kopiere" name="CheckEveryoneCopy" />
+ <check_box label="Del" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel">
- Næste ejer kan:
- </text>
- <check_box label="Redigere" name="CheckNextOwnerModify" />
- <check_box label="Kopiere" name="CheckNextOwnerCopy" />
- <check_box label="Sælge/Give væk" name="CheckNextOwnerTransfer" />
- <text name="SaleLabel">
- Markér ting:
+ Næste ejer:
+ </text>
+ <check_box label="Redigér" name="CheckNextOwnerModify"/>
+ <check_box label="Kopiere" name="CheckNextOwnerCopy"/>
+ <check_box label="Sælg" name="CheckNextOwnerTransfer"/>
+ <check_box label="Til salg" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopiér" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Pris:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <check_box label="Til salg" name="CheckPurchase" />
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Kopi" />
- </radio_group>
- <text name="TextPrice">
- Pris: L$
- </text>
- <string name="unknown">
- (ukendt)
- </string>
- <string name="public">
- (offentlig)
- </string>
- <string name="you_can">
- Du kan:
- </string>
- <string name="owner_can">
- Ejer kan:
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
index 60a7d78aea..af2910fe58 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory Finder" title="inventory_recent_items">
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
<check_box label="Animation" name="check_animation" />
<check_box label="Visitkort" name="check_calling_card" />
<check_box label="Tøj" name="check_clothing" />
diff --git a/indra/newview/skins/default/xui/da/floater_joystick.xml b/indra/newview/skins/default/xui/da/floater_joystick.xml
index 280650a04b..49e1397e9f 100644
--- a/indra/newview/skins/default/xui/da/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/da/floater_joystick.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Joystick opsætning">
- <check_box name="enable_joystick" label="Aktiver Joystick:"/>
+<floater name="Joystick" title="JOYSTICK OPSÆTNING">
+ <check_box label="Aktiver Joystick:" name="enable_joystick"/>
<spinner label="X akse mapping" name="JoystickAxis1"/>
<spinner label="Y akse mapping" name="JoystickAxis2"/>
<spinner label="Z akse mapping" name="JoystickAxis0"/>
@@ -14,9 +14,9 @@
<text name="Control Modes:">
Kontrollér:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" label="Build"/>
- <check_box name="JoystickFlycamEnabled" label="Flycam"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Build" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
X følsomhed
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml
index 7e7c2dc0d3..149d174c34 100644
--- a/indra/newview/skins/default/xui/da/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/da/floater_lagmeter.xml
@@ -1,152 +1,151 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Lag måler">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/>
- <text name="client">
- Klient:
- </text>
- <text name="client_text">
- Normal
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/>
- <text name="network">
- Netværk:
- </text>
- <text name="network_text">
- Normal
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/>
- <text name="server">
- Server:
- </text>
- <text name="server_text">
- Normal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="LAG METER">
+ <floater.string name="max_title_msg">
Lag måler
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Klient
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, vindue i baggrund
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Klients billeder/sek under [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Klients billeder/sek mellem [CLIENT_FRAME_RATE_CRITICAL] og [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Mulig årsag: &apos;Vis afstand&apos; sat for højt i grafik indstillinger
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Mulig årsag: Billeder hentes
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Mulig årsag: For mange billeder i hukommelse
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Mulig årsag: For mange komplekse objekter i scenariet
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Netværk
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
Forbindelsen mister over [NETWORK_PACKET_LOSS_CRITICAL]% pakker
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
Forbindelsen mister [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% pakker
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Forbindelsens ping tider er over [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Forbindelsens ping tider er [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Muligvis dårlig forbindelse eller &apos;båndbredde&apos; sat for højt i netværksopsætning.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Muligvis dårlig forbindelse eller fil delings program.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Server
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Simulator framerate er under [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Simulator framerate er mellem [SERVER_FRAME_RATE_CRITICAL] og [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Mulig årsag: For mange fysiske objekter
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Mulig årsag: For mange objekter med script
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Mulig årsag: For meget netværks trafik
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Mulig årsag: For mange avatarer i bevægelse i regionen
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Mulig årsag: For mange billed udregninger
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Mulig årsag: Simulator belastning for stor
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/>
+ <text name="client">
+ Klient
+ </text>
+ <text name="client_text">
+ Normal
+ </text>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/>
+ <text name="network">
+ Netværk
+ </text>
+ <text name="network_text">
+ Normal
+ </text>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/>
+ <text name="server">
+ Server
+ </text>
+ <text name="server_text">
+ Normal
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Ændre størrelse"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_land_holdings.xml b/indra/newview/skins/default/xui/da/floater_land_holdings.xml
index bd623e7b75..b3c12627f7 100644
--- a/indra/newview/skins/default/xui/da/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/da/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Mit land">
+<floater name="land holdings floater" title="MIT LAND">
<scroll_list name="parcel list">
- <column label="Navn" name="name"/>
+ <column label="Parcel" name="name"/>
<column label="Region" name="location"/>
<column label="Type" name="type"/>
<column label="Område" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport til centrum på dette land."/>
- <button label="Vis på kort" label_selected="Vis på kort" name="Show on Map" tool_tip="Vis dette land på verdenskortet."/>
+ <button label="Kort" label_selected="Kort" name="Show on Map" tool_tip="Vis dette land i verdenskortet"/>
<text name="contrib_label">
Bidrag til dine grupper:
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
index 112dc70e45..4079ff9f38 100644
--- a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="Script: Nyt script">
- <button label="Nulstil" label_selected="Reset" name="Reset" />
- <check_box label="Kører" name="running" />
- <check_box label="Mono" name="mono" />
- <string name="not_allowed">
- Du har ikke rettigheder til at se dette script.
- </string>
- <string name="script_running">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SCRIPT: NYT SCRIPT">
+ <floater.string name="not_allowed">
+ Du kan ikke se eller redigere dette script, da det er sat til &quot;no copy&quot;. Du skal bruge fulde rettigheder for at kunne se og redigere et script i dette objekt.
+ </floater.string>
+ <floater.string name="script_running">
Kører
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
+ <button label="Nulstil" label_selected="Reset" name="Reset"/>
+ <check_box initial_value="true" label="Kører" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
index d345409859..2b008f133c 100644
--- a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL Wiki">
- <check_box label="Følg markøreren" name="lock_check" />
- <combo_box label="LÃ¥s" name="history_combo" left_delta="114" width="70"/>
- <button label="Tilbage" name="back_btn" />
- <button label="Frem" name="fwd_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL WIKI">
+ <check_box label="Følg markøreren" name="lock_check"/>
+ <combo_box label="LÃ¥s" left_delta="114" name="history_combo" width="70"/>
+ <button label="Tilbage" name="back_btn"/>
+ <button label="Frem" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_media_browser.xml b/indra/newview/skins/default/xui/da/floater_media_browser.xml
index 50004cfa0c..47667973ba 100644
--- a/indra/newview/skins/default/xui/da/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/da/floater_media_browser.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Medie vælger">
+<floater name="floater_about" title="MEDIE VÆLGER">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Tilbage" name="back" />
diff --git a/indra/newview/skins/default/xui/da/floater_media_settings.xml b/indra/newview/skins/default/xui/da/floater_media_settings.xml
new file mode 100644
index 0000000000..67c122b9d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIA INDSTILLINGER">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+ <button label="Anvend" label_selected="Anvend" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_mem_leaking.xml b/indra/newview/skins/default/xui/da/floater_mem_leaking.xml
index 6d5b5bc0ce..60bb3149a5 100644
--- a/indra/newview/skins/default/xui/da/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/da/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="Memory Leaking Simulation">
- <spinner label="Leaking Speed (bytes per frame):" name="leak_speed" />
- <spinner label="Max Leaked Memory (MB):" name="max_leak" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SIMULÉR MEMORY LEAK">
+ <spinner label="Leaking Speed (bytes per frame):" name="leak_speed"/>
+ <spinner label="Max Leaked Memory (MB):" name="max_leak"/>
<text name="total_leaked_label">
Current leaked memory: [SIZE] KB
</text>
@@ -11,8 +11,8 @@
<text name="note_label_2">
[NOTE2]
</text>
- <button label="Start" name="start_btn" />
- <button label="Stop" name="stop_btn" />
- <button label="Slip" name="release_btn" />
- <button label="Luk" name="close_btn" />
+ <button label="Start" name="start_btn"/>
+ <button label="Stop" name="stop_btn"/>
+ <button label="Slip" name="release_btn"/>
+ <button label="Luk" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_moveview.xml b/indra/newview/skins/default/xui/da/floater_moveview.xml
index 2b50528881..b00dc6bf4d 100644
--- a/indra/newview/skins/default/xui/da/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/da/floater_moveview.xml
@@ -1,13 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Drej til venstre" />
- <button label="" label_selected="" name="turn right btn" tool_tip="Drej til højre" />
- <button label="" label_selected="" name="move up btn" tool_tip="Hop eller flyv op" />
- <button label="" label_selected="" name="move down btn" tool_tip="Duk eller flyv ned" />
- <joystick_slide name="slide left btn" tool_tip="GÃ¥ til venstre" />
- <joystick_slide name="slide right btn" tool_tip="Gå til højre" />
- <joystick_turn name="forward btn" tool_tip="GÃ¥ fremad" />
- <joystick_turn name="backward btn" tool_tip="GÃ¥ bagud" />
-</panel>
+ <string name="walk_forward_tooltip">
+ Gå frem (Tryk på Op piletast eller W)
+ </string>
+ <string name="walk_back_tooltip">
+ Gå baglæns (Tryk på Ned piletast eller S)
+ </string>
+ <string name="run_forward_tooltip">
+ Løb forlæns (Tryk på Op piletast eller W)
+ </string>
+ <string name="run_back_tooltip">
+ Løb baglæns (Tryk på Ned piletast eller S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Flyv frem (Tryk på Op piletast eller W)
+ </string>
+ <string name="fly_back_tooltip">
+ Flyv baglæns (Tryk på Ned piletast eller S)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="xxx
+ Drej til venstre (Tryk på venstre piletast eller A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Drej til højre (Tryk på højre piletast eller D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Flyv op, Tryk på &quot;E&quot;"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Flyv ned, Tryk på &quot;C&quot;"/>
+ <joystick_turn name="forward btn" tool_tip="Gå frem (Tryk på Op piletast eller W)"/>
+ <joystick_turn name="backward btn" tool_tip="Gå tilbage (Tryk på Ned piletast eller S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="GÃ¥ tilstand"/>
+ <button label="" name="mode_run_btn" tool_tip="Løbe tilstand"/>
+ <button label="" name="mode_fly_btn" tool_tip="Flyve tilstand"/>
+ <button label="Stop flyvning" name="stop_fly_btn" tool_tip="Stop flyvning"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_mute_object.xml b/indra/newview/skins/default/xui/da/floater_mute_object.xml
index e64557b177..3b3f670792 100644
--- a/indra/newview/skins/default/xui/da/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/da/floater_mute_object.xml
@@ -1,12 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="mute by name" title="Bloker objekt via navn">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="mute by name" title="BLOKÉR OBJEKT VIA NAVN">
<text name="message">
- Blokering via navn har ikke betydning for lyde.
-Du skal skrive det præcise navn på objektet.
+ Blokér et objekt:
</text>
<line_editor name="object_name">
Objekt navn
</line_editor>
- <button label="OK" name="OK" />
- <button label="Annullér" name="Cancel" />
+ <text name="note">
+ * Blokérer kun tekst fra objekt, ikke lyde
+ </text>
+ <button label="OK" name="OK"/>
+ <button label="Annullér" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_my_friends.xml b/indra/newview/skins/default/xui/da/floater_my_friends.xml
index 687266a08a..c3db53ce63 100644
--- a/indra/newview/skins/default/xui/da/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/da/floater_my_friends.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_my_friends" title="Kontakter">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_friends" title="KONTAKTER">
<tab_container name="friends_and_groups">
- <panel label="Venner" name="friends_panel" />
- <panel label="Grupper" name="groups_panel" />
+ <panel label="Venner" name="friends_panel"/>
+ <panel label="Grupper" name="groups_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
new file mode 100644
index 0000000000..ef4e4cbe7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT NÆRVED"/>
diff --git a/indra/newview/skins/default/xui/da/floater_openobject.xml b/indra/newview/skins/default/xui/da/floater_openobject.xml
index d37e3177fa..92fdd1e0a6 100644
--- a/indra/newview/skins/default/xui/da/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/da/floater_openobject.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="objectcontents" title="Objekt indhold">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="OBJEKT INDHOLD">
<text name="object_name">
[DESC]:
</text>
- <button label="Kopiér til beholdning" label_selected="Kopiér til beholdning"
- name="copy_to_inventory_button" />
- <button label="Kopiér og tag på" label_selected="Kopiér og tag på"
- name="copy_and_wear_button" />
+ <button label="Kopiér til beholdning" label_selected="Kopiér til beholdning" name="copy_to_inventory_button"/>
+ <button label="Kopiér og tag på" label_selected="Kopiér og tag på" name="copy_and_wear_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
new file mode 100644
index 0000000000..5c98d9855f
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="KALDER">
+ <floater.string name="localchat">
+ Stemme chat nærved
+ </floater.string>
+ <floater.string name="anonymous">
+ anonym
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ kalder op.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ har sluttet sig til stemmechat med en konference chat.
+ </floater.string>
+ <text name="connecting">
+ Tilslutter til [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Kalder [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Intet svar. Prøv igen senere.
+ </text>
+ <text name="leaving">
+ Forlader [CURRENT_CHAT].
+ </text>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_pay.xml b/indra/newview/skins/default/xui/da/floater_pay.xml
index f39cfa4871..b2cdc0bfe7 100644
--- a/indra/newview/skins/default/xui/da/floater_pay.xml
+++ b/indra/newview/skins/default/xui/da/floater_pay.xml
@@ -1,21 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="Betal" label_selected="Betal" name="pay btn" />
- <button label="Annullér" label_selected="Annullér" name="cancel btn" />
- <text name="payee_label" left="5" width="81">
- Betal beboer:
+ <string name="payee_group">
+ Betal gruppe
+ </string>
+ <string name="payee_resident">
+ Betal beboer
+ </string>
+ <text left="5" name="payee_label" width="81">
+ Betal:
</text>
+ <icon name="icon_person" tool_tip="Person"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text">
- Hurtig betal:
- </text>
- <text name="amount text" left="4" >
- Beløb:
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text left="4" name="amount text">
+ eler vælg beløb:
</text>
+ <button label="Betal" label_selected="Betal" name="pay btn"/>
+ <button label="Annullér" label_selected="Annullér" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_pay_object.xml b/indra/newview/skins/default/xui/da/floater_pay_object.xml
index 09e2e3f5d0..f74e097da2 100644
--- a/indra/newview/skins/default/xui/da/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/da/floater_pay_object.xml
@@ -1,30 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group">
- Betal gruppe:
- </text>
- <text name="payee_resident">
- Betal beboer:
- </text>
+ <string name="payee_group">
+ Betal gruppe
+ </string>
+ <string name="payee_resident">
+ Betal beboer
+ </string>
+ <icon name="icon_person" tool_tip="Person"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
<text name="object_name_label">
Via objekt:
</text>
+ <icon name="icon_object" tool_tip="Objekter"/>
<text name="object_name_text">
...
</text>
- <text name="fastpay text">
- Hurtig betal:
- </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
<text name="amount text">
- Beløb:
+ Eller vælg beløb:
</text>
- <button label="L$1" label_selected="L$1" name="fastpay 1" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="Betal" label_selected="Betal" name="pay btn" />
- <button label="Annullér" label_selected="Annullér" name="cancel btn" />
+ <button label="Betal" label_selected="Betal" name="pay btn"/>
+ <button label="Annullér" label_selected="Annullér" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
index f4b9b0a664..eecddbcdb0 100644
--- a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Standard tilladelser ved hentning">
+<floater name="perm prefs" title="STANDARD RETTIGHEDER">
<panel label="Tilladelser" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Del med gruppe" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/da/floater_postcard.xml b/indra/newview/skins/default/xui/da/floater_postcard.xml
index 24d45062ae..44b0fd4faa 100644
--- a/indra/newview/skins/default/xui/da/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/da/floater_postcard.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Postcard" title="E-mail billede">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="EMAIL FOTO">
<text name="to_label">
Send til:
</text>
@@ -12,7 +12,7 @@
<text name="subject_label">
Emne:
</text>
- <line_editor label="Skriv dit emne her." name="subject_form" />
+ <line_editor label="Skriv dit emne her." name="subject_form"/>
<text name="msg_label">
Besked:
</text>
@@ -22,10 +22,10 @@
<text name="fine_print">
Hvis din modtager opretter en konto i SL, vil du få en henvisnings bonus.
</text>
- <button label="Annullér" name="cancel_btn" />
- <button label="Send" name="send_btn" />
+ <button label="Annullér" name="cancel_btn"/>
+ <button label="Send" name="send_btn"/>
<string name="default_subject">
- Postkort fra [SECOND_LIFE]
+ Postkort fra [SECOND_LIFE].
</string>
<string name="default_message">
Tjek det her ud!
diff --git a/indra/newview/skins/default/xui/da/floater_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml
index 26e932e3cc..f0fe3472d0 100644
--- a/indra/newview/skins/default/xui/da/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/da/floater_preferences.xml
@@ -1,8 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Preferences" title="Indstillinger">
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
- <button label="Gem" label_selected="Gem" name="Apply" />
- <button label="Om" label_selected="Om" name="About..." />
- <button label="Hjælp" label_selected="Hjælp" name="Help" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="INDSTILLINGER">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Generelt" name="general"/>
+ <panel label="Grafik" name="display"/>
+ <panel label="Privatliv" name="im"/>
+ <panel label="Sound" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Beskeder" name="msgs"/>
+ <panel label="Opsætning" name="input"/>
+ <panel label="Avanceret" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_animation.xml b/indra/newview/skins/default/xui/da/floater_preview_animation.xml
index 1494bf36d0..436843decc 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_animation.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animation: [NAME]
+ </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
- <button label="Afspil i verden" label_selected="Stop" name="Anim play btn"
- tool_tip="Afspil denne animation så andre kan se den." />
- <button label="Afspil lokalt" label_selected="Stop" name="Anim audition btn"
- tool_tip="Afspil denne animation så kun du kan se den." />
+ <button label="Afspil i verden" label_selected="Stop" name="Anim play btn" tool_tip="Vis denne animation så andre kan se den"/>
+ <button label="Afspil lokalt" label_selected="Stop" name="Anim audition btn" tool_tip="Vis denne animation så kun du kan se den"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_classified.xml b/indra/newview/skins/default/xui/da/floater_preview_classified.xml
index 6cc4c139f1..bc232f3e9f 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_classified.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="Annonce information" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="ANNONCE INFORMATION">
+ <floater.string name="Title">
+ Annonce: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_event.xml b/indra/newview/skins/default/xui/da/floater_preview_event.xml
index f1be35e1c3..3e870b58ae 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_event.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="Event information" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="EVENT INFORMATION">
+ <floater.string name="Title">
+ Event: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
index 0053cb852f..bfa3c150a9 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
@@ -1,14 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animation til afspilning:
+ </floater.string>
+ <floater.string name="step_sound">
+ Lyd til afspilning:
+ </floater.string>
+ <floater.string name="step_chat">
+ Sig:
+ </floater.string>
+ <floater.string name="step_wait">
+ Vent:
+ </floater.string>
+ <floater.string name="stop_txt">
Stop
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Vis
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Intet --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Bevægelse: [NAME]
+ </floater.string>
<text name="desc_label">
Beskrivelse:
</text>
@@ -23,33 +38,27 @@
Genvejstast:
</text>
<combo_box label="Ingen" name="modifier_combo" width="60"/>
- <combo_box label="Ingen" name="key_combo" left_delta="70" width="60"/>
+ <combo_box label="Ingen" left_delta="70" name="key_combo" width="60"/>
<text name="library_label">
Type:
</text>
+ <scroll_list name="library_list"/>
+ <button label="Tilføj &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Trin:
</text>
- <scroll_list name="library_list">
- Animation
-Lyd
-Chat
-Vent
- </scroll_list>
- <button label="Tilføj &gt;&gt;" name="add_btn"/>
- <button label="Flyt op" name="up_btn"/>
- <button label="Flyt ned" name="down_btn"/>
+ <button label="Op" name="up_btn"/>
+ <button label="Ned" name="down_btn"/>
<button label="Fjern" name="delete_btn"/>
- <text name="help_label">
- Alle trin vil ske samtidigt,
-medmindre du tilføjer vente trin.
- </text>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Start" />
- <radio_item name="stop" label="Stop" />
+ <radio_item label="Start" name="start"/>
+ <radio_item label="Stop" name="stop"/>
</radio_group>
<check_box label="Indtil animation er færdig" name="wait_anim_check"/>
<check_box label="tid i sekunder" name="wait_time_check"/>
+ <text name="help_label">
+ Alle trin vil ske samtidigt, medmindre du tilføjer vente trin.
+ </text>
<check_box label="Aktiv" name="active_check" tool_tip="Aktive bevægelser kan blive aktiveret ved at skrive deress udløser tekst eller ved at trykke på genvejstaste. Bevægelser vil normalt være inaktive hvis der allerede findes en tilsvarende genvejstaste."/>
<button label="Vis" name="preview_btn"/>
<button label="Gem" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..9892a92e4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="BEVÆGELSE GENVEJ"/>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..4d4cca1d90
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GENVEJ BEVÆGELSER">
+ <text name="trigger_label">
+ Chat:
+ </text>
+ <text name="key_label">
+ Tastatur:
+ </text>
+ <combo_box label="Intet" name="modifier_combo"/>
+ <combo_box label="Intet" name="key_combo"/>
+ <text name="replace_text" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser &quot;hello&quot; erstat med &quot;hej&quot; vil ændre chat &apos;Jeg ville bare sige hello&apos; til &apos;Jeg ville bare sige hej&apos; samtidig med bevægelsen afspilles!">
+ Erstat:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser &quot;hello&quot; erstat med &quot;hej&quot; vil ændre chat &apos;Jeg ville bare sige hello&apos; til &apos;Jeg ville bare sige hej&apos; samtidig med bevægelsen afspilles!"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..9892a92e4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="BEVÆGELSE GENVEJ"/>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
index 68d04d6f9b..2ebec4462f 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="Note:">
- <button label="Gem" label_selected="Gem" name="Save"/>
+<floater name="preview notecard" title="NOTE:">
+ <floater.string name="no_object">
+ Kunne ikke finde objekt der indeholder denne note.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Du har ikke rettigheder til at se denne note.
+ </floater.string>
+ <floater.string name="Title">
+ Note: [NAME]
+ </floater.string>
+ <floater.string label="Gem" label_selected="Gem" name="Save">
+ Gem
+ </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
<text_editor name="Notecard Editor">
Indlæser...
</text_editor>
- <string name="no_object">
- Kunne ikke finde objekt der indeholder denne note.
- </string>
- <string name="not_allowed">
- Du har ikke tilladelse til at læse denne note.
- </string>
+ <button label="Gem" label_selected="Gem" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_sound.xml b/indra/newview/skins/default/xui/da/floater_preview_sound.xml
index 9fbfba88b5..21f7656462 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_sound.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Lyd: [NAME]
+ </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
- <button label="Afspil lokalt" label_selected="Afspil lokalt" name="Sound audition btn"
- tool_tip="Afspil denne lyd så kun du kan høre den." />
- <button label="Afspil i verden" label_selected="Afspil i verden" name="Sound play btn"
- tool_tip="Afspil denne lyd så den kan høres af andre." />
+ <button label="Afspil i verden" label_selected="Afspil i verden" name="Sound play btn" tool_tip="Afspil denne lyd så alle kan høre den"/>
+ <button label="Afspil lokalt" label_selected="Afspil lokalt" name="Sound audition btn" tool_tip="Afspil denne lyd så kun du kan høre den"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_texture.xml b/indra/newview/skins/default/xui/da/floater_preview_texture.xml
index 250659f249..ab7ddbcc72 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_texture.xml
@@ -1,9 +1,44 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Tekstur: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Kopiér til beholdning
+ </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
<text name="dimensions">
- Størrelse: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Forhåndsvisning med et bestemt billedformat">
+ <combo_item name="Unconstrained">
+ Ikke låst
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Typisk valg til gruppe logo eller &quot;Real world&quot; profil billede">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Typisk valg til din &quot;Second Life Profil&quot; billede">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Typisk valg til billeder i annoncer, landemærker og søgninger">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Typisk valg til &quot;Om land&quot; billede">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Typisk valg til favorit billeder i profil">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="keep"/>
+ <button label="Annullér" name="discard"/>
+ <button label="Gem som" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_region_info.xml b/indra/newview/skins/default/xui/da/floater_region_info.xml
index 9f6e326cf3..ae00f90f16 100644
--- a/indra/newview/skins/default/xui/da/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/da/floater_region_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="Region/Estate" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="REGION/ESTATE"/>
diff --git a/indra/newview/skins/default/xui/da/floater_report_abuse.xml b/indra/newview/skins/default/xui/da/floater_report_abuse.xml
index 01f152c43a..9ef17a3cbb 100644
--- a/indra/newview/skins/default/xui/da/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/da/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Rapportér misbrug">
- <texture_picker label="" name="screenshot"/>
+<floater name="floater_report_abuse" title="RAPPORTÉR MISBRUG">
+ <floater.string name="Screenshot">
+ Screenshot
+ </floater.string>
<check_box label="Inkludér billede" name="screen_check"/>
<text name="reporter_title">
Anmelder:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Region:
@@ -27,61 +29,60 @@
<text name="object_name_label">
Navn:
</text>
- <text name="object_name" left_delta="64" width="140">
+ <text left_delta="64" name="object_name" width="140">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
Ejer:
</text>
- <text name="owner_name" left_delta="64">
- Hendrerit Vulputate
+ <text left_delta="64" name="owner_name">
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Kategori -- Vælg en kategori der passer bedst på denne rapport">
- <combo_box.item name="Select_category" label="Vælg kategori"/>
- <combo_box.item name="Age__Age_play" label="Alder &gt; Falsk alder"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Alder &gt; Voksen beboer på Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Alder &gt; Mindreårig beboer udenfor Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Overfald &gt; Kamp sandkasse / Usikkert område"/>
- <combo_box.item name="Assault__Safe_area" label="Overfald &gt; Sikkert område"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Overfald &gt; Sandkasse til våbentest"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel &gt; Vare eller ydelse ikke leveret"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Offentliggørelse &gt; Om oplysninger i den virkelige verden"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Offentliggørelse &gt; Fjernaflytning af chat"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Offentliggørelse &gt; Information/chat/IM fra Second Life"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Forstyrrelse af fred &gt; Unfair brug af region ressourcer"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Forstyrrelse af fred &gt; Overdreven brug af objekter med script"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Forstyrrelse af fred &gt; Object affald"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Forstyrring af fred &gt; Gentagen spam"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Forstyrrelse af fred &gt; Uønsket reklame spam"/>
- <combo_box.item name="Fraud__L$" label="Bedrageri &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Bedrageri &gt; Land"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Bedrageri &gt; Pyramide spil eller kædebreve"/>
- <combo_box.item name="Fraud__US$" label="Bedrageri &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Chikane &gt; reklame farm / billedeligt spam"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Chikane &gt; Injurier/bagvask enkeltpersoner eller grupper"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Chikane &gt; Hindre bevægelse"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Chikane &gt; Sex chikane"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Chikane &gt; Opfordrer/kræver at andre overtræder licensbetingelser"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Chikane &gt; Verbalt chikane"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Uanstændighed &gt; Meget stødende indhold eller adfærd"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Uanstændighed &gt; Upassende avatar navn"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;PG&apos; region"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;Mature&apos; region"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Krænkelse af intellektuelle ejendomsrettigheder &gt; Indholds fjernelse"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Krænkelse af intellektuelle ejendomsrettigheder &gt; CopyBot eller omgåelse af rettighedsbeskyttelse"/>
- <combo_box.item name="Intolerance" label="Intolerance"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land &gt; Misbrug af sandkasse resourcer"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Land &gt; Overgreb &gt; Objekter/teksturer"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Land &gt; Overgreb &gt; Partikler"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Land &gt; Overgreb &gt; Træer/planter"/>
- <combo_box.item name="Wagering_gambling" label="Væddemål/gambling"/>
- <combo_box.item name="Other" label="Andet"/>
+ <combo_box.item label="Vælg kategori" name="Select_category"/>
+ <combo_box.item label="Alder &gt; Falsk alder" name="Age__Age_play"/>
+ <combo_box.item label="Alder &gt; Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Alder &gt; Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Overfald &gt; Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Overfald &gt; Sikkert område" name="Assault__Safe_area"/>
+ <combo_box.item label="Overfald &gt; Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Handel &gt; Vare eller ydelse ikke leveret" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Offentliggørelse &gt; Om oplysninger i den virkelige verden" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Offentliggørelse &gt; Fjernaflytning af chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Offentliggørelse &gt; Information/chat/IM fra Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Forstyrrelse af fred &gt; Unfair brug af region ressourcer" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Forstyrrelse af fred &gt; Overdreven brug af objekter med script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Forstyrrelse af fred &gt; Object affald" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Forstyrring af fred &gt; Gentagen spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Forstyrrelse af fred &gt; Uønsket reklame spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Bedrageri &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Bedrageri &gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Bedrageri &gt; Pyramide spil eller kædebreve" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Bedrageri &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Chikane &gt; reklame farm / billedeligt spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Chikane &gt; Injurier/bagvask enkeltpersoner eller grupper" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Chikane &gt; Hindre bevægelse" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Chikane &gt; Sex chikane" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Chikane &gt; Opfordrer/kræver at andre overtræder licensbetingelser" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Chikane &gt; Verbalt chikane" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Uanstændighed &gt; Meget stødende indhold eller adfærd" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Uanstændighed &gt; Upassende avatar navn" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;PG&apos; region" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Usømmelighed &gt; Upassende inhold eller opførsel i en &apos;Mature&apos; region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; Indholds fjernelse" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Krænkelse af intellektuelle ejendomsrettigheder &gt; CopyBot eller omgåelse af rettighedsbeskyttelse" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerance" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Misbrug af sandkasse resourcer" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Overgreb &gt; Objekter/teksturer" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Overgreb &gt; Partikler" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Overgreb &gt; Træer/planter" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Væddemål/gambling" name="Wagering_gambling"/>
+ <combo_box.item label="Andet" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Udøvers navn:
</text>
<button label="Vælg beboer" label_selected="" name="select_abuser" tool_tip="Vælg navnet på udøveren fra denne liste"/>
- <check_box label="Kender ikke udøvers navn" name="omit_abuser_name" tool_tip="Afkryds her, hvis du ikke kender navn på udøvers"/>
<text name="abuser_name_title2">
Sted for misbrug/overgreb:
</text>
@@ -92,12 +93,11 @@
Detaljer:
</text>
<text name="bug_aviso">
- Vær venligst præcis omkring dato, sted, overgrebets
-natur, relevant chat/IM og vælg objekt hvis muligt.
+ Vær venligst så præcis som muligt
</text>
<text name="incomplete_title">
- Note: Ufuldstændige rapporter vil ikke blive undersøgt.
+ * Note: Ufuldstændige rapporter vil ikke blive undersøgt.
</text>
- <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
<button label="Rapporter misbrug" label_selected="Rapporter misbrug" name="send_btn"/>
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_script_debug.xml b/indra/newview/skins/default/xui/da/floater_script_debug.xml
index 17e14cd9b9..df60a2e23f 100644
--- a/indra/newview/skins/default/xui/da/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater name="script debug floater" title="Script advarsel/fejl">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[All scripts]" />
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]" />
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/da/floater_script_preview.xml b/indra/newview/skins/default/xui/da/floater_script_preview.xml
index 6990e8db0e..1e8d869716 100644
--- a/indra/newview/skins/default/xui/da/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="Script: Rotation Script">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT: ROTATIONS SCRIPT">
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_script_queue.xml b/indra/newview/skins/default/xui/da/floater_script_queue.xml
index 47dbf534bd..1ff5494458 100644
--- a/indra/newview/skins/default/xui/da/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/da/floater_script_queue.xml
@@ -1,4 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="queue" title="Nulstil forløb">
- <button label="Luk" label_selected="Luk" name="close" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="NULSTIL FREMSKRIDT">
+ <floater.string name="Starting">
+ Starter [START] af [COUNT] genstande.
+ </floater.string>
+ <floater.string name="Done">
+ Færdig.
+ </floater.string>
+ <floater.string name="Resetting">
+ Nulstiller
+ </floater.string>
+ <floater.string name="Running">
+ Running
+ </floater.string>
+ <floater.string name="NotRunning">
+ Not running
+ </floater.string>
+ <button label="Luk" label_selected="Luk" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_script_search.xml b/indra/newview/skins/default/xui/da/floater_script_search.xml
index d4dae8951f..f1605cac34 100644
--- a/indra/newview/skins/default/xui/da/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/da/floater_script_search.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script search" title="Script søgning">
- <check_box label="Store/små bogstaver har ingen betydning" name="case_text" />
- <button label="Søg" label_selected="Søg" name="search_btn" />
- <button label="Erstat" label_selected="Erstat" name="replace_btn" />
- <button label="Erstat alle" label_selected="Erstat alle" name="replace_all_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="SCRIPT SØGNING">
+ <check_box label="Store/små bogstaver har ingen betydning" name="case_text"/>
+ <button label="Søg" label_selected="Søg" name="search_btn"/>
+ <button label="Erstat" label_selected="Erstat" name="replace_btn"/>
+ <button label="Erstat alle" label_selected="Erstat alle" name="replace_all_btn"/>
<text name="txt">
Søg
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_search.xml b/indra/newview/skins/default/xui/da/floater_search.xml
new file mode 100644
index 0000000000..80a30b1aa1
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="FIND">
+ <floater.string name="loading_text">
+ Henter...
+ </floater.string>
+ <floater.string name="done_text">
+ Færdig
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Gentag søgning med &quot;God level&quot;
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_select_key.xml b/indra/newview/skins/default/xui/da/floater_select_key.xml
index 7fa868a3a9..fe0d31c6c3 100644
--- a/indra/newview/skins/default/xui/da/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/da/floater_select_key.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
<text name="Save item as:">
- Tryk på en taste for at vælge
+ Tryk på en taste for at sætte din &quot;Tale&quot; knap udløser.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_sell_land.xml b/indra/newview/skins/default/xui/da/floater_sell_land.xml
index 87023b4f64..873e6d7995 100644
--- a/indra/newview/skins/default/xui/da/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_sell_land.xml
@@ -1,62 +1,65 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="sell land" title="Sælg land">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Parcel:
- </text>
- <text name="info_parcel">
- PARCEL NAME
- </text>
- <text name="info_size_label">
- Størrelse:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action">
- Sælg denne parcel:
- </text>
- <text name="price_label">
- Sæt en pris:
- </text>
- <text name="price_text">
- Vælg en passende pris for jorden.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- (L$[PER_METER] pr. kvadratmeter)
- </text>
- <text name="sell_to_label">
- Sælg denne jord til:
- </text>
- <text name="sell_to_text">
- Vælg om du vil sælge til hvem som helst eller en specifik køber.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="Vælg --" />
- <combo_box.item name="Anyone" label="Alle" />
- <combo_box.item name="Specificuser:" label="Specifik bruger:" />
- </combo_box>
- <button label="Vælg..." name="sell_to_select_agent" />
- <text name="sell_objects_label">
- Sælg objekter sammen med jorden?
- </text>
- <text name="sell_objects_text">
- Dine objekter der kan videregives sælges med jorden.
- </text>
- <radio_group name="sell_objects">
- <radio_item name="no" label="Nej, behold ejerskab til objekterne" />
- <radio_item name="yes" label="Ja, sælg objekter med jorden" />
- </radio_group>
- <button label="Vis objekter" name="show_objects" />
- <text name="nag_message_label">
- HUSK: Alle salg er endegyldige.
- </text>
- <button label="Sæt land til salg" name="sell_btn" />
- <button label="Annullér" name="cancel_btn" />
- </panel>
- </scroll_container>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="SÆLG LAND">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parcel:
+ </text>
+ <text name="info_parcel">
+ PARCEL
+ </text>
+ <text name="info_size_label">
+ Størrelse:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ For at sælge:
+ </text>
+ <text name="price_label">
+ 1. Sæt en pris:
+ </text>
+ <text name="price_text">
+ Vælg en passende pris for jorden.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] pr. m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Sælg denne parcel til:
+ </text>
+ <text name="sell_to_text">
+ Vælg om du vil sælge til hvem som helst eller en specifik køber.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Vælg -" name="--selectone--"/>
+ <combo_box.item label="Enhver" name="Anyone"/>
+ <combo_box.item label="Specifik person:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Vælg" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Sælg objekter sammen med jorden?
+ </text>
+ <text name="sell_objects_text">
+ Objekter der kan vidergives og som tilhører ejer af land på parcel vil skifte ejerskab
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Nej, behold ejerskab til objekter" name="no"/>
+ <radio_item label="Ja, sælg objekter med jorden" name="yes"/>
+ </radio_group>
+ <button label="Vis objekter" name="show_objects"/>
+ <text name="nag_message_label">
+ HUSK: Alle salg er endegyldige.
+ </text>
+ <button label="Sæt land til salg" name="sell_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
index 60f99deae2..41cf100d94 100644
--- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="settings_debug" title="Tekniske indstillinger">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="DEBUG INDSTILLINGER">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE (Valgt)" />
- <combo_box.item name="FALSE" label="FALSE (Fravalgt)" />
+ <combo_box.item label="SANDT" name="TRUE"/>
+ <combo_box.item label="FALSK" name="FALSE"/>
</combo_box>
- <color_swatch label="Farve" name="color_swatch" />
- <spinner label="x" name="val_spinner_1" />
- <spinner label="x" name="val_spinner_2" />
- <spinner label="x" name="val_spinner_3" />
- <spinner label="x" name="val_spinner_4" />
- <button label="Sæt til standard" name="default_btn" />
+ <color_swatch label="Farve" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Sæt til standard" name="default_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml
index d7a5179890..5e8c64e21f 100644
--- a/indra/newview/skins/default/xui/da/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Se foto">
+<floater name="Snapshot" title="FOTO FORHÃ…NDSVINSNING">
<text name="type_label">
Hvor skal foto hen?
</text>
<radio_group label="Snapshot type" name="snapshot_type_radio">
- <radio_item name="postcard" label="Send via e-mail" />
- <radio_item name="texture" label="Gem i din beholdning (L$[AMOUNT])" />
- <radio_item name="local" label="Gem på din computer" />
+ <radio_item label="Send via e-mail" name="postcard"/>
+ <radio_item label="Gem i din beholdning (L$[AMOUNT])" name="texture"/>
+ <radio_item label="Gem på din computer" name="local"/>
</radio_group>
<text name="file_size_label">
Fil størrelse: [SIZE] KB
@@ -15,12 +15,12 @@
<button label="Send" name="send_btn"/>
<button label="Gem (L$[AMOUNT])" name="upload_btn"/>
<flyout_button label="Gem" name="save_btn" tool_tip="Gem billede i på din computer">
- <flyout_button_item name="save_item" label="Gem"/>
- <flyout_button_item name="saveas_item" label="Gem som..."/>
+ <flyout_button_item label="Gem" name="save_item"/>
+ <flyout_button_item label="Gem som..." name="saveas_item"/>
</flyout_button>
<button label="Annullér" name="discard_btn"/>
- <button label="Mere &gt;&gt;" name="more_btn" tool_tip="Avancerede valg"/>
- <button label="&lt;&lt; Mindre" name="less_btn" tool_tip="Avancerede valg"/>
+ <button label="Mere &gt;&gt;" name="more_btn" tool_tip="Avancerede muligheder"/>
+ <button label="&lt;&lt; Mindre" name="less_btn" tool_tip="Avancerede muligheder"/>
<text name="type_label2">
Størrelse
</text>
@@ -28,45 +28,45 @@
Format
</text>
<combo_box label="Opløsning" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Manuel"/>
+ <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Manuel" name="Custom"/>
</combo_box>
<combo_box label="Opløsning" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/>
- <combo_box.item name="Small(128x128)" label="Lille (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Medium (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Stor (512x512)"/>
- <combo_box.item name="Custom" label="Manuel"/>
+ <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
+ <combo_box.item label="Lille (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Stor (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Manuel" name="Custom"/>
</combo_box>
<combo_box label="Opløsning" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Manuelt"/>
+ <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Manuelt" name="Custom"/>
</combo_box>
<combo_box label="Fil-format" name="local_format_combo" width="76">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Bredde" name="snapshot_width" label_width="41" width="101"/>
- <spinner label="Højde" name="snapshot_height" label_width="32" width="92" left="117"/>
+ <spinner label="Bredde" label_width="41" name="snapshot_width" width="101"/>
+ <spinner label="Højde" label_width="32" left="117" name="snapshot_height" width="92"/>
<check_box label="Fasthold proportioner" name="keep_aspect_check"/>
<slider label="Billed-kvalitet" name="image_quality_slider"/>
<text name="layer_type_label">
Benyt:
</text>
<combo_box label="Billedlag" name="layer_types">
- <combo_box.item name="Colors" label="Farver"/>
- <combo_box.item name="Depth" label="Dybde"/>
- <combo_box.item name="ObjectMattes" label="Materinger"/>
+ <combo_box.item label="Farver" name="Colors"/>
+ <combo_box.item label="Dybde" name="Depth"/>
+ <combo_box.item label="Materinger" name="ObjectMattes"/>
</combo_box>
<check_box label="Vis brugerflade på foto" name="ui_check"/>
<check_box label="Vis HUD objekter på foto" name="hud_check"/>
diff --git a/indra/newview/skins/default/xui/da/floater_sound_preview.xml b/indra/newview/skins/default/xui/da/floater_sound_preview.xml
index 606d290e1d..5f74f28a23 100644
--- a/indra/newview/skins/default/xui/da/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_sound_preview.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Sound Preview" title="sound.wav">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
Navn:
</text>
<text name="description_label">
Beskrivelse:
</text>
- <button label="Annullér" label_selected="Annullér" name="cancel_btn" />
- <button label="Hent (L$[AMOUNT])" label_selected="Hent (L$[AMOUNT])" name="ok_btn" />
+ <button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
+ <button label="Hent (L$[AMOUNT])" label_selected="Hent (L$[AMOUNT])" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_statistics.xml b/indra/newview/skins/default/xui/da/floater_statistics.xml
index 0443553d50..8c33f3ecb3 100644
--- a/indra/newview/skins/default/xui/da/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/da/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statistik"/>
+<floater name="stats floater" title="STATISTIK"/>
diff --git a/indra/newview/skins/default/xui/da/floater_stats.xml b/indra/newview/skins/default/xui/da/floater_stats.xml
new file mode 100644
index 0000000000..fe3fa9626e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTIK">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Grundlæggende" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="BÃ¥ndbredde" name="bandwidth"/>
+ <stat_bar label="Pakketab" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avanceret" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris tegnet" name="ktrisframe"/>
+ <stat_bar label="KTris tegnet" name="ktrissec"/>
+ <stat_bar label="Total antal objekter" name="objs"/>
+ <stat_bar label="Nye objekter" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Netværk" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="Objekter" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Layers" name="layerskbitstat"/>
+ <stat_bar label="Actual In" name="actualinkbitstat"/>
+ <stat_bar label="Actual Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Time Dilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Objects" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="Script Events" name="simscripteps"/>
+ <stat_bar label="Packets In" name="siminpps"/>
+ <stat_bar label="Packets Out" name="simoutpps"/>
+ <stat_bar label="Pending Downloads" name="simpendingdownloads"/>
+ <stat_bar label="Pending Uploads" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="Script Time" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_sys_well.xml b/indra/newview/skins/default/xui/da/floater_sys_well.xml
new file mode 100644
index 0000000000..b5cecf93e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="BESKEDER">
+ <string name="title_im_well_window">
+ IM SESSIONER
+ </string>
+ <string name="title_notification_well_window">
+ BESKEDER
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_telehub.xml b/indra/newview/skins/default/xui/da/floater_telehub.xml
index cd1fb33831..5a0e89aa98 100644
--- a/indra/newview/skins/default/xui/da/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/da/floater_telehub.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="telehub" title="Telehub">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="telehub" title="TELEHUB">
<text name="status_text_connected">
Telehub forbundet til objekt [OBJECT]
</text>
@@ -12,17 +12,14 @@
<text name="help_text_not_connected">
230;lg objekt og klik &apos;Forbind telehub&apos;.
</text>
- <button label="Forbind telehub" name="connect_btn" />
- <button label="Afslut" name="disconnect_btn" />
+ <button label="Forbind telehub" name="connect_btn"/>
+ <button label="Afslut" name="disconnect_btn"/>
<text name="spawn_points_text" width="300">
Ankomst punkter (positioner, ikke objekter):
</text>
- <button label="Tilføj punkt" name="add_spawn_point_btn" />
- <button label="Fjern punkt" name="remove_spawn_point_btn" />
+ <button label="Tilføj punkt" name="add_spawn_point_btn"/>
+ <button label="Fjern punkt" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Vælg objekt og klik på &apos;Tilføj punkt&apos;for at angive
-position. Du kan derefter flytte eller slette
-objektet. Positioner er i forhold til telehub center.
-Vælg emne i listen for at vise position i verden.
+ Vælg objekt og klik på &apos;Tilføj punkt&apos; for at angive position. Du kan derefter flytte eller slette objektet. Positioner er i forhold til telehub center. Vælg emne i listen for at vise position i verden.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
index c35e3aec4c..00b49a9df9 100644
--- a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="texture picker" title="Vælg: Tekstur">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="VÆLG: TEKSTUR">
<string name="choose_picture">
Klik for at vælge et billede
</string>
<text name="Multiple">
- Flere
+ Flere teksturer
</text>
<text name="unknown">
Størrelse: [DIMENSIONS]
</text>
- <button label="Standard" label_selected="Standard" name="Default" />
- <button label="Ingen" label_selected="Ingen" name="None" />
- <button label="Blank" label_selected="Blank" name="Blank" />
- <check_box label="Vis mapper" name="show_folders_check" />
- <search_editor label="Skriv her for at søge" name="inventory search editor" />
- <check_box label="Benyt straks" name="apply_immediate_check" />
- <button label="" label_selected="" name="Pipette" />
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
- <button label="Vælg" label_selected="Vælg" name="Select" />
+ <button label="Standard" label_selected="Standard" name="Default"/>
+ <button label="Ingen" label_selected="Ingen" name="None"/>
+ <button label="Blank" label_selected="Blank" name="Blank"/>
+ <check_box label="Vis mapper" name="show_folders_check"/>
+ <search_editor label="Filtrér teksturer" name="inventory search editor"/>
+ <check_box label="Benyt ny" name="apply_immediate_check"/>
+ <button label="" label_selected="" name="Pipette"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+ <button label="Ok" label_selected="Ok" name="Select"/>
<string name="pick title">
Vælg:
</string>
diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index e50494ff9e..77459aca67 100644
--- a/indra/newview/skins/default/xui/da/floater_tools.xml
+++ b/indra/newview/skins/default/xui/da/floater_tools.xml
@@ -1,92 +1,160 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Byg">
+<floater name="toolbox floater" short_title="BYGGE VÆRKTØJER" title="">
+ <floater.string name="status_rotate">
+ Træk i de farvede bånd for at rotere objekt
+ </floater.string>
+ <floater.string name="status_scale">
+ Klik og træk for at strække valgte side
+ </floater.string>
+ <floater.string name="status_move">
+ Træk for at flytte, hold shift nede for at kopiere
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Klik og hold for at redigere land
+ </floater.string>
+ <floater.string name="status_camera">
+ Klik og træk for at flytte kamera
+ </floater.string>
+ <floater.string name="status_grab">
+ Træk for at flytte, Ctrl for at løfte, Ctrl+Shift for at rotere
+ </floater.string>
+ <floater.string name="status_place">
+ Klik et sted i verden for at bygge
+ </floater.string>
+ <floater.string name="status_selectland">
+ Klik og træk for at vælge land
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Skærm
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Lokalt
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Verden
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Vedhæng
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
<button label="" label_selected="" name="button move" tool_tip="Flyt"/>
<button label="" label_selected="" name="button edit" tool_tip="Redigér"/>
<button label="" label_selected="" name="button create" tool_tip="Opret"/>
<button label="" label_selected="" name="button land" tool_tip="Land"/>
+ <text name="text status">
+ Træk for at flytte, shift+træk for at kopiere
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Kredsløb (Ctrl)" name="radio orbit"/>
- <radio_item label="Panorér (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Panorér (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Flyt" name="radio move"/>
<radio_item label="Løft (Ctrl)" name="radio lift"/>
- <radio_item label="Spin (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Position" name="radio position"/>
+ <radio_item label="Flyt" name="radio position"/>
<radio_item label="Rotér (Ctrl)" name="radio rotate"/>
- <radio_item label="Stræk (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Vælg tekstur" name="radio select face"/>
+ <radio_item label="Stræk (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Vælg overflade" name="radio select face"/>
</radio_group>
<check_box label="Redigér sammenlænkede dele" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Lineal:
+ <text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Verden"/>
- <combo_box.item name="Local" label="Lokal"/>
- <combo_box.item name="Reference" label="Reference"/>
- </combo_box>
<check_box label="Stræk begge sider" name="checkbox uniform"/>
- <check_box label="Stræk teksturer" name="checkbox stretch textures"/>
- <check_box label="Benyt gitter" name="checkbox snap to grid"/>
- <button label="Valg..." label_selected="Valg..." name="Options..." height="18" bottom_delta="-15"/>
- <text name="text status">
- Træk for at flytte, shift+træk for at kopiere
- </text>
- <button label="" label_selected="" name="ToolCube" tool_tip="Terning" />
- <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme" />
- <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide" />
- <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraed" />
- <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylinder" />
- <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Hemicylinder" />
- <button label="" label_selected="" name="ToolCone" tool_tip="Kegle" />
- <button label="" label_selected="" name="ToolHemiCone" tool_tip="Hemikegle" />
- <button label="" label_selected="" name="ToolSphere" tool_tip="Sfære" />
- <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Hemisfære" />
- <button label="" label_selected="" name="ToolTorus" tool_tip="Kuglering" />
- <button label="" label_selected="" name="ToolTube" tool_tip="Rør" />
- <button label="" label_selected="" name="ToolRing" tool_tip="Ring" />
- <button label="" label_selected="" name="ToolTree" tool_tip="Træ" />
- <button label="" label_selected="" name="ToolGrass" tool_tip="Græs" />
- <check_box label="Hold værktøjet valgt" name="checkbox sticky" />
- <check_box label="Kopiér valgte" name="checkbox copy selection" />
- <check_box label="Centreret kopi" name="checkbox copy centers" />
- <check_box label="Rotér" name="checkbox copy rotates" />
+ <check_box initial_value="true" label="Stræk teksturer" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Benyt gitter" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Vælg hvilken type lineal der skal bruges til positionering af objekt">
+ <combo_box.item label="Verden" name="World"/>
+ <combo_box.item label="Lokalt" name="Local"/>
+ <combo_box.item label="Reference" name="Reference"/>
+ </combo_box>
+ <button bottom_delta="-15" height="18" label="Valg..." label_selected="Valg..." name="Options..." tool_tip="Se flere muligheder for gitter"/>
+ <button label="" label_selected="" name="ToolCube" tool_tip="Terning"/>
+ <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme"/>
+ <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
+ <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraed"/>
+ <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylinder"/>
+ <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Hemicylinder"/>
+ <button label="" label_selected="" name="ToolCone" tool_tip="Kegle"/>
+ <button label="" label_selected="" name="ToolHemiCone" tool_tip="Hemikegle"/>
+ <button label="" label_selected="" name="ToolSphere" tool_tip="Sfære"/>
+ <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Hemisfære"/>
+ <button label="" label_selected="" name="ToolTorus" tool_tip="Kuglering"/>
+ <button label="" label_selected="" name="ToolTube" tool_tip="Rør"/>
+ <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
+ <button label="" label_selected="" name="ToolTree" tool_tip="Træ"/>
+ <button label="" label_selected="" name="ToolGrass" tool_tip="Græs"/>
+ <check_box label="Hold værktøjet valgt" name="checkbox sticky"/>
+ <check_box label="Kopier valgte" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Centreret kopi" name="checkbox copy centers"/>
+ <check_box label="Rotér kopi" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
- <radio_item label="Vælg" name="radio select land" />
- <radio_item label="Udflad" name="radio flatten" />
- <radio_item label="Hæv" name="radio raise" />
- <radio_item label="Sænk" name="radio lower" />
- <radio_item label="Udjævn" name="radio smooth" />
- <radio_item label="Gør ujævnt" name="radio noise" />
- <radio_item label="Tilbagefør" name="radio revert" />
+ <radio_item label="Vælg" name="radio select land"/>
+ <radio_item label="Udflad" name="radio flatten"/>
+ <radio_item label="Hæv" name="radio raise"/>
+ <radio_item label="Sænk" name="radio lower"/>
+ <radio_item label="Udjævn" name="radio smooth"/>
+ <radio_item label="Gør ujævnt" name="radio noise"/>
+ <radio_item label="Tilbagefør" name="radio revert"/>
</radio_group>
- <combo_box name="combobox brush size">
- <combo_box.item name="Small" label="Lille"/>
- <combo_box.item name="Medium" label="Mellem"/>
- <combo_box.item name="Large" label="Stor"/>
- </combo_box>
- <text name="Strength:">
- Styrke:
- </text>
<text name="Dozer Size:">
Størrelse
</text>
<text name="Strength:">
- Styrke
+ Styrke:
</text>
+ <button label="Apply" label_selected="Apply" name="button apply to selection" tool_tip="Ændre valgte land"/>
<text name="obj_count">
- Valgte objekter: [COUNT]
+ Objekter: [COUNT]
</text>
<text name="prim_count">
- prims: [COUNT]
+ Prims: [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="Generelt" name="General">
+ <panel.string name="text deed continued">
+ Dedikér
+ </panel.string>
+ <panel.string name="text deed">
+ Deed
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Du kan ændre dette objekt
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Du kan ændre disse objekter
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Du kan ikke ændre dette objekt
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Du kan ikke ændre disse objekter
+ </panel.string>
+ <panel.string name="text modify warning">
+ Du skal vælge hele objektet for at sætte rettigheder
+ </panel.string>
+ <panel.string name="Cost Default">
+ Pris: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Total pris: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Pris pr: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Blandet pris
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Blandet salg
+ </panel.string>
<text name="Name:">
Navn:
</text>
@@ -99,128 +167,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button creator profile"/>
<text name="Owner:">
Ejer:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button owner profile"/>
<text name="Group:">
Gruppe:
</text>
- <text name="Group Name Proxy">
- The Lindens
- </text>
- <button label="Sæt..." label_selected="Sæt..." name="button set group"/>
- <text name="Permissions:">
- Tilladelser:
- </text>
-
- <check_box label="Del med gruppe" name="checkbox share with group" tool_tip="Tillad gruppemedlemmer at flytte, ændre, kopiere og slette."/>
- <string name="text deed continued">
- Deed...
- </string>
- <string name="text deed">
- Deed
- </string>
- <button label="Dedikér..." label_selected="Dedikér..." name="button deed" tool_tip="Gruppedelte genstande kan dedikeres af en gruppeadministrator."/>
- <check_box label="Tillad enhver at flytte" name="checkbox allow everyone move"/>
- <check_box label="Tillad enhver at kopiére" name="checkbox allow everyone copy"/>
- <check_box label="Vis i søgning" name="search_check" tool_tip="Lad folk se dette objekt i søgeresultater"/>
- <check_box label="Til salg" name="checkbox for sale"/>
- <text name="Cost">
- Pris: L$
+ <button label="Sæt..." label_selected="Sæt..." name="button set group" tool_tip="Vælg en gruppe der skal dele dette objekts rettigheder"/>
+ <name_box initial_value="Henter..." name="Group Name Proxy"/>
+ <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med rettighederne for &apos;næste ejer&apos;. Gruppe-delte objekter kan dedikeres af gruppe-administrator."/>
+ <check_box label="Del" name="checkbox share with group" tool_tip="Tillad alle medlemmer fra den valgte gruppe at dele dine &apos;redigere&apos; rettigheder for dette objekt. Du skal dedikere for åbne for rolle begrænsninger."/>
+ <text name="label click action">
+ Klik for at:
</text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Rør (Standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sid på objekt" name="Sitonobject"/>
+ <combo_box.item label="Køb objekt" name="Buyobject"/>
+ <combo_box.item label="Betal objekt" name="Payobject"/>
+ <combo_box.item label="Ã…ben" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="Til salg:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Kopi" name="Copy"/>
<combo_box.item label="Indhold" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action">
- NÃ¥r der venstreklikkes:
- </text>
- <combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="Rør/tag (standard)"/>
- <combo_box.item name="Sitonobject" label="Sid på objekt"/>
- <combo_box.item name="Buyobject" label="Køb objekt"/>
- <combo_box.item name="Payobject" label="Betal objekt"/>
- <combo_box.item name="Open" label="Ã…ben"/>
- <combo_box.item name="Play" label="Afspil medie på parcel"/>
- <combo_box.item name="Opemmedia" label="Åben media på parcel"/>
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Du kan redigére dette objekt
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Næste ejer kan:
- </text>
- <check_box label="Redigére" name="checkbox next owner can modify"/>
- <check_box label="Kopiére" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Du kan redigere dette objekt
- </string>
- <string name="text modify info 2">
- Du kan redigere disse objekter
- </string>
- <string name="text modify info 3">
- Du kan ikke redigere dette objekt
- </string>
- <string name="text modify info 4">
- Du kan ikke redigere disse objekter
- </string>
- <string name="text modify warning">
- Du skal vælge hele objektet for at sætte rettigheder
- </string>
- <string name="Cost Default">
- Pris: L$
- </string>
- <string name="Cost Total">
- Total pris: L$
- </string>
- <string name="Cost Per Unit">
- Pris Pr: L$
- </string>
- <string name="Cost Mixed">
- Blandet pris
- </string>
- <string name="Sale Mixed">
- Blandet salg
- </string>
+ <spinner label="Pris: L$" name="Edit Cost"/>
+ <check_box label="Vis i søgning" name="search_check" tool_tip="Lad folk se dette objekt i søgeresultater"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Du kan redigere dette objekt
+ </text>
+ <text name="Anyone can:">
+ Enhver:
+ </text>
+ <check_box label="Flyt" name="checkbox allow everyone move"/>
+ <check_box label="Kopi" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Næste ejer:
+ </text>
+ <check_box label="Redigére" name="checkbox next owner can modify"/>
+ <check_box label="Kopiére" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Sælge/give væk" left_delta="67" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objekt" name="Object">
- <text name="select_single">
- Vælg kun én prim for at ændre indstillinger.
- </text>
- <text name="edit_object">
- Ret objektets indstillinger:
- </text>
<check_box label="Låst" name="checkbox locked" tool_tip="Forhindrer objektet i at blive flyttet eller slettet. Ofte brugbar under byggeri for at forhindre utilsigtet ændring."/>
<check_box label="Fysisk" name="Physical Checkbox Ctrl" tool_tip="Tillader objekter at blive skubbet og at være påvirkelig af tyngdekraften"/>
- <check_box label="Temporær" name="Temporary Checkbox Ctrl" tool_tip="Medfårer at objekter bliver slettet 1 minut efter de er skabt."/>
+ <check_box label="Temporær" name="Temporary Checkbox Ctrl" tool_tip="Medfører at objekt slettes 1 minut efter skabelse"/>
<check_box label="Uden masse" name="Phantom Checkbox Ctrl" tool_tip="FÃ¥r objektet til ikke at kollidere med andre objekter eller personer"/>
<text name="label position">
Position (meter)
@@ -240,33 +257,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Materiale
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Sten"/>
- <combo_box.item name="Metal" label="Metal"/>
- <combo_box.item name="Glass" label="Glas"/>
- <combo_box.item name="Wood" label="Træ"/>
- <combo_box.item name="Flesh" label="Kød"/>
- <combo_box.item name="Plastic" label="Plastik"/>
- <combo_box.item name="Rubber" label="Gummi"/>
- </combo_box>
- <text name="label basetype">
- Byggegeometrisk figur
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Terning"/>
- <combo_box.item name="Cylinder" label="Cylinder"/>
- <combo_box.item name="Prism" label="Prisme"/>
- <combo_box.item name="Sphere" label="Spfære"/>
- <combo_box.item name="Torus" label="Kuglering"/>
- <combo_box.item name="Tube" label="Rør"/>
- <combo_box.item name="Ring" label="Ring"/>
- <combo_box.item name="Sculpted" label="Sculpted"/>
+ <combo_box.item label="Terning" name="Box"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Prisme" name="Prism"/>
+ <combo_box.item label="Spfære" name="Sphere"/>
+ <combo_box.item label="Kuglering" name="Torus"/>
+ <combo_box.item label="Rør" name="Tube"/>
+ <combo_box.item label="Ring" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Sten" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Træ" name="Wood"/>
+ <combo_box.item label="Kød" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
</combo_box>
<text name="text cut">
- Snit begynd og slut
+ Snit Z-akse (start/slut)
</text>
<spinner label="B" name="cut begin"/>
<spinner label="S" name="cut end"/>
@@ -280,13 +291,13 @@
Form på hul
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Standard"/>
- <combo_box.item name="Circle" label="Cirkel"/>
- <combo_box.item name="Square" label="Firkant"/>
- <combo_box.item name="Triangle" label="Trekant"/>
+ <combo_box.item label="Standard" name="Default"/>
+ <combo_box.item label="Cirkel" name="Circle"/>
+ <combo_box.item label="Firkant" name="Square"/>
+ <combo_box.item label="Trekant" name="Triangle"/>
</combo_box>
<text name="text twist">
- Vrid begynd og slut
+ Vrid (start/slut)
</text>
<spinner label="B" name="Twist Begin"/>
<spinner label="S" name="Twist End"/>
@@ -304,13 +315,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Profilsnit begynd og slut
+ Snit - radial (start/slut)
</text>
<text name="advanced_dimple">
- Fordybning begynd og slut
+ Fordybning (Start/slut)
</text>
<text name="advanced_slice">
- Snit begynd og slut
+ Skive (start/slut)
</text>
<spinner label="B" name="Path Limit Begin"/>
<spinner label="S" name="Path Limit End"/>
@@ -326,17 +337,17 @@
Omdrejninger
</text>
<texture_picker label="Sculpt tekstur" name="sculpt texture control" tool_tip="Klik her for at vælge billede"/>
- <check_box label="Spejlet" name="sculpt mirror control" tool_tip="Spejler sculpted prim omkring X aksen."/>
- <check_box label="Vrangen ud" name="sculpt invert control" tool_tip="Vender &apos;vrangen&apos; ud på sculpted prim."/>
+ <check_box label="Spejlet" name="sculpt mirror control" tool_tip="Spejler sculpted prim omkring X akse"/>
+ <check_box label="Vrangen ud" name="sculpt invert control" tool_tip="Vender &apos;vrangen ud&apos; på sculpted prim"/>
<text name="label sculpt type">
Sting type
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(ingen)"/>
- <combo_box.item name="Sphere" label="Sfære"/>
- <combo_box.item name="Torus" label="Kuglering"/>
- <combo_box.item name="Plane" label="Plan"/>
- <combo_box.item name="Cylinder" label="Cylinder"/>
+ <combo_box.item label="(ingen)" name="None"/>
+ <combo_box.item label="Sfære" name="Sphere"/>
+ <combo_box.item label="Kuglering" name="Torus"/>
+ <combo_box.item label="Plan" name="Plane"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Features" name="Features">
@@ -346,107 +357,106 @@
<text name="edit_object">
Redigér objektets egenskaber:
</text>
- <check_box label="Fleksibel/blød" name="Flexible1D Checkbox Ctrl" tool_tip="Tillader objektet at ændre form omkring Z-aksen. (Kun på klient-siden)"/>
- <spinner label_width="78" width="141" label="Blødhed" name="FlexNumSections"/>
- <spinner label_width="78" width="141" label="Tyngdekraft" name="FlexGravity"/>
- <spinner label_width="78" width="141" label="Træk" name="FlexFriction"/>
- <spinner label_width="78" width="141" label="Vind" name="FlexWind"/>
- <spinner label_width="78" width="141" label="Spændstighed" name="FlexTension"/>
- <spinner label_width="78" width="141" label="Kraft X" name="FlexForceX"/>
- <spinner label_width="78" width="141" label="Kraft Y" name="FlexForceY"/>
- <spinner label_width="78" width="141" label="Kraft Z" name="FlexForceZ"/>
+ <check_box label="Fleksibel/blød" name="Flexible1D Checkbox Ctrl" tool_tip="Tillader objektet at flekse omkring Z aksen (kun på klient siden)"/>
+ <spinner label="Blødhed" label_width="78" name="FlexNumSections" width="141"/>
+ <spinner label="Tyngdekraft" label_width="78" name="FlexGravity" width="141"/>
+ <spinner label="Træk" label_width="78" name="FlexFriction" width="141"/>
+ <spinner label="Vind" label_width="78" name="FlexWind" width="141"/>
+ <spinner label="Spændstighed" label_width="78" name="FlexTension" width="141"/>
+ <spinner label="Kraft X" label_width="78" name="FlexForceX" width="141"/>
+ <spinner label="Kraft Y" label_width="78" name="FlexForceY" width="141"/>
+ <spinner label="Kraft Z" label_width="78" name="FlexForceZ" width="141"/>
<check_box label="Lys" name="Light Checkbox Ctrl" tool_tip="Medfårer at objektet afgiver lys"/>
- <text name="label color">
- Farve
- </text>
<color_swatch label="" name="colorswatch" tool_tip="Klik for at åbne farvevælger"/>
+ <texture_picker label="" name="light texture control" tool_tip="Klik for at vælge billede til projektion (har kun effekt hvis &apos;deferred rendering&apos; er aktiveret)"/>
<spinner label="Intensitet" name="Light Intensity"/>
+ <spinner label="Synsvidde" name="Light FOV"/>
<spinner label="Radius" name="Light Radius"/>
+ <spinner label="Fokus" name="Light Focus"/>
<spinner label="Udfasning" name="Light Falloff"/>
+ <spinner label="Omgivelser" name="Light Ambiance"/>
</panel>
<panel label="Tekstur" name="Texture">
+ <panel.string name="string repeats per meter">
+ Gentagelser pr. meter
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Gentagelser pr. overflade
+ </panel.string>
<texture_picker label="Tekstur" name="texture control" tool_tip="Klik for at vælge billede"/>
<color_swatch label="Farve" name="colorswatch" tool_tip="Klik for at åbne farvevælger"/>
- <text name="color trans" left="170" width="105">
+ <text left="170" name="color trans" width="105">
Gennemsigtighed%
</text>
<spinner left="171" name="ColorTrans"/>
- <text name="glow label" left="170">
+ <text left="170" name="glow label">
Glød
</text>
<spinner left="170" name="glow"/>
- <check_box label="Selvlysende" name="checkbox fullbright" left="170"/>
+ <check_box label="Selvlysende" left="170" name="checkbox fullbright"/>
<text name="tex gen">
Afbildning
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Standard"/>
- <combo_box.item name="Planar" label="Plan"/>
+ <combo_box.item label="Standard" name="Default"/>
+ <combo_box.item label="Plan" name="Planar"/>
</combo_box>
<text name="label shininess">
Blankhed
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Ingen"/>
- <combo_box.item name="Low" label="Lav"/>
- <combo_box.item name="Medium" label="Mellem"/>
- <combo_box.item name="High" label="Høj"/>
+ <combo_box.item label="Ingen" name="None"/>
+ <combo_box.item label="Lav" name="Low"/>
+ <combo_box.item label="Mellem" name="Medium"/>
+ <combo_box.item label="Høj" name="High"/>
</combo_box>
<text name="label bumpiness">
Struktur
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Ingen"/>
- <combo_box.item name="Brightness" label="Lysintensitet"/>
- <combo_box.item name="Darkness" label="Mørke"/>
- <combo_box.item name="woodgrain" label="træårer"/>
- <combo_box.item name="bark" label="bark"/>
- <combo_box.item name="bricks" label="mursten"/>
- <combo_box.item name="checker" label="tern"/>
- <combo_box.item name="concrete" label="beton"/>
- <combo_box.item name="crustytile" label="rustik flise"/>
- <combo_box.item name="cutstone" label="Skåret sten"/>
- <combo_box.item name="discs" label="plader"/>
- <combo_box.item name="gravel" label="grus"/>
- <combo_box.item name="petridish" label="petriskål"/>
- <combo_box.item name="siding" label="udvendig beklædning"/>
- <combo_box.item name="stonetile" label="stenflise"/>
- <combo_box.item name="stucco" label="puds"/>
- <combo_box.item name="suction" label="rør"/>
- <combo_box.item name="weave" label="væv"/>
+ <combo_box.item label="Ingen" name="None"/>
+ <combo_box.item label="Lysintensitet" name="Brightness"/>
+ <combo_box.item label="Mørke" name="Darkness"/>
+ <combo_box.item label="træårer" name="woodgrain"/>
+ <combo_box.item label="bark" name="bark"/>
+ <combo_box.item label="mursten" name="bricks"/>
+ <combo_box.item label="tern" name="checker"/>
+ <combo_box.item label="beton" name="concrete"/>
+ <combo_box.item label="rustik flise" name="crustytile"/>
+ <combo_box.item label="Skåret sten" name="cutstone"/>
+ <combo_box.item label="plader" name="discs"/>
+ <combo_box.item label="grus" name="gravel"/>
+ <combo_box.item label="petriskål" name="petridish"/>
+ <combo_box.item label="udvendig beklædning" name="siding"/>
+ <combo_box.item label="stenflise" name="stonetile"/>
+ <combo_box.item label="puds" name="stucco"/>
+ <combo_box.item label="rør" name="suction"/>
+ <combo_box.item label="væv" name="weave"/>
</combo_box>
<text name="tex scale">
- Gentagelser pr. overflade
+ Gentagelser på overflade
</text>
<spinner label="Vandret (U)" name="TexScaleU"/>
<check_box label="Vend" name="checkbox flip s"/>
<spinner label="Lodret (V)" name="TexScaleV"/>
<check_box label="Vend" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotation (grader)
- </text>
- <string name="string repeats per meter">
- Gentagelser pr. meter
- </string>
- <string name="string repeats per face">
- Gentagelser pr. overflade
- </string>
- <text name="rpt">
- Gentagelser pr. meter
- </text>
- <spinner left="125" name="TexRot" width="55" />
- <spinner left="125" name="rptctrl" width="55" />
- <button label="Gem" label_selected="Gem" name="button apply" left_delta="62"/>
+ <spinner label="RotationËš" left="125" name="TexRot" width="55"/>
+ <spinner label="Gentagelser pr. meter" left="125" name="rptctrl" width="55"/>
+ <button label="Gem" label_selected="Gem" left_delta="62" name="button apply"/>
<text name="tex offset">
- Offset
+ Tekstur offset
</text>
<spinner label="Vandret (U)" name="TexOffsetU"/>
<spinner label="Lodret (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Rette medie tekstur ind
-(skal indlæses først)
- </text>
- <button label="Ret ind" label_selected="Ret ind" name="button align" left="160"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Tilføj media"/>
+ <button name="delete_media" tool_tip="Slet denne media tekstur"/>
+ <button name="edit_media" tool_tip="Redigér dette media"/>
+ <button label="Flugt" label_selected="Flugt Media" name="button align" tool_tip="Flugt media tekstur (skal hentes først)"/>
+ </panel>
</panel>
<panel label="Indhold" name="Contents">
<button label="Nyt script" label_selected="Nyt script" name="button new script"/>
@@ -458,14 +468,20 @@
Parcel information
</text>
<text name="label_area_price">
- Pris: L$[PRICE] for [AREA] m².
+ Pris: L$[PRICE] for [AREA] m²
</text>
<text name="label_area">
- Område: [AREA] m².
+ Areal: [AREA] m²
</text>
- <button label="Om land..." label_selected="Om land..." name="button about land"/>
- <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab: &#10;&#10;Grøn = Dit land &#10;Turkis = Din gruppes land &#10;Rød = Ejet af andre &#10;Gul = Til salg &#10;Lilla = På auktion &#10;Grå = Offentligt ejet"/>
- <button label="?" label_selected="?" name="button show owners help"/>
+ <button label="Om land" label_selected="Om land" name="button about land"/>
+ <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab:
+
+Grøn = Dit land
+Turkis = Din gruppes land
+Rød = Ejet af andre
+Gul = Til salg
+Lilla = PÃ¥ auktion
+Grå = Offentligt ejet"/>
<text name="label_parcel_modify">
Redigere grund
</text>
@@ -475,45 +491,6 @@
Transaktioner for land
</text>
<button label="Køb land" label_selected="Køb land" name="button buy land"/>
- <button label="Flyt fra land" label_selected="Flyt fra land" name="button abandon land"/>
+ <button label="Efterlad land" label_selected="Efterlad land" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- Træk i de farvede bånd for at rotere objekt
- </floater.string>
- <floater.string name="status_scale">
- Klik og træk for at strække valgte side
- </floater.string>
- <floater.string name="status_move">
- Træk for at flytte, hold shift nede for at kopiere
- </floater.string>
- <floater.string name="status_modifyland">
- Klik og hold for at redigere land
- </floater.string>
- <floater.string name="status_camera">
- Klik og træk for at ændre synsvinkel
- </floater.string>
- <floater.string name="status_grab">
- Træk for at flytte objekter, Ctrl for at løfte, Ctrl-Shift for at rotere
- </floater.string>
- <floater.string name="status_place">
- Klik et sted i verden for at bygge
- </floater.string>
- <floater.string name="status_selectland">
- Klik og træk for at vælge land
- </floater.string>
- <floater.string name="grid_screen_text">
- Skærm
- </floater.string>
- <floater.string name="grid_local_text">
- Lokalt
- </floater.string>
- <floater.string name="grid_world_text">
- Verden
- </floater.string>
- <floater.string name="grid_reference_text">
- Reference
- </floater.string>
- <floater.string name="grid_attachment_text">
- Vedhæng
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_top_objects.xml b/indra/newview/skins/default/xui/da/floater_top_objects.xml
index dc4605cc12..3f19350e30 100644
--- a/indra/newview/skins/default/xui/da/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/da/floater_top_objects.xml
@@ -1,33 +1,33 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="top_objects" title="Indlæser...">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top objekter">
<text name="title_text">
Henter...
</text>
<scroll_list name="objects_list">
- <column label="Point" name="score" />
- <column label="Navn" name="name" />
- <column label="Ejer" name="owner" />
- <column label="Lokation" name="location" />
- <column label="Tid" name="time" />
- <column label="Mono tid" name="mono_time" />
+ <column label="Point" name="score"/>
+ <column label="Navn" name="name"/>
+ <column label="Ejer" name="owner"/>
+ <column label="Lokation" name="location"/>
+ <column label="Tid" name="time"/>
+ <column label="Mono tid" name="mono_time"/>
</scroll_list>
<text name="id_text">
Objekt ID:
</text>
- <button label="Vis pejlelys" name="show_beacon_btn" />
+ <button label="Vis pejlelys" name="show_beacon_btn"/>
<text name="obj_name_text">
Objekt navn:
</text>
- <button label="Filter" name="filter_object_btn" />
+ <button label="Filter" name="filter_object_btn"/>
<text name="owner_name_text">
- Ejers navn:
+ Ejer:
</text>
- <button label="Filter" name="filter_owner_btn" />
- <button label="Returnér valgte" name="return_selected_btn" />
- <button label="Returnér alle" name="return_all_btn" />
- <button label="Afbryd valgte" name="disable_selected_btn" />
- <button label="Afbryd alle" name="disable_all_btn" />
- <button label="Genopfrisk" name="refresh_btn" />
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Returnér valgte" name="return_selected_btn"/>
+ <button label="Returnér alle" name="return_all_btn"/>
+ <button label="Afbryd valgte" name="disable_selected_btn"/>
+ <button label="Afbryd alle" name="disable_all_btn"/>
+ <button label="Genopfrisk" name="refresh_btn"/>
<string name="top_scripts_title">
Mest krævende scripts
</string>
diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 9a348ca7bf..77906f0f46 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -1,11 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Fortsæt" label_selected="Fortsæt" name="Continue" />
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
- <check_box label="Jeg accepterer vilkårene for brug af tjenesten" name="agree_chk" />
+ <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+ <check_box label="Jeg accepterer vilkårene for brug af tjenesten" name="agree_chk"/>
<text name="tos_heading">
- Læs venligst de almindelige bestemmelser og vilkår igennem, for at fortsætte til [SECOND_LIFE]
-skal du acceptere vilkårene.
+ Læs venligst de almindelige bestemmelser og vilkår igennem, for at fortsætte til [SECOND LIFE] skal du acceptere vilkårene.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml
new file mode 100644
index 0000000000..8651851233
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_voice_controls.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Stemme opsætning">
+ <string name="title_nearby">
+ STEMMER NÆR
+ </string>
+ <string name="title_group">
+ Gruppe opkald med [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Konference kald
+ </string>
+ <string name="title_peer_2_peer">
+ Opkald med [NAME]
+ </string>
+ <string name="no_one_near">
+ Ingen nær
+ </string>
+ <panel name="control_panel">
+ <layout_stack>
+ <layout_panel name="leave_btn_panel">
+ <button label="Forlad opkald" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml
index 33a10579ab..103feaa879 100644
--- a/indra/newview/skins/default/xui/da/floater_water.xml
+++ b/indra/newview/skins/default/xui/da/floater_water.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Water Floater" title="Avanceret opsætning af vand">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="AVANCERET OPSÆTNING AF VAND">
<text name="KeyFramePresetsText">
Vand opsætninger:
</text>
- <button label="Ny" label_selected="Ny" name="WaterNewPreset" />
- <button label="Gem" label_selected="Gem" name="WaterSavePreset" />
- <button label="Slet" label_selected="Slet" name="WaterDeletePreset" />
+ <button label="Ny" label_selected="Ny" name="WaterNewPreset"/>
+ <button label="Gem" label_selected="Gem" name="WaterSavePreset"/>
+ <button label="Slet" label_selected="Slet" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
<panel label="Opsætning" name="Settings">
<text name="BHText">
Vandtåge farve
</text>
- <button label="?" name="WaterFogColorHelp" />
- <color_swatch label="" name="WaterFogColor" tool_tip="Click to open Color Picker" />
+ <button label="?" name="WaterFogColorHelp"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Klik for at åbne farvevælger"/>
<text name="WaterFogDensText">
Tåge tæthedskarakteristik
</text>
- <button label="?" name="WaterFogDensityHelp" />
- <slider label="" name="WaterFogDensity" />
+ <button label="?" name="WaterFogDensityHelp"/>
+ <slider label="" name="WaterFogDensity"/>
<text name="WaterUnderWaterFogModText">
Tilretning undervandståge
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" />
- <slider label="" name="WaterUnderWaterFogMod" />
+ <button label="?" name="WaterUnderWaterFogModHelp"/>
+ <slider label="" name="WaterUnderWaterFogMod"/>
<text name="BDensText">
Lille bølge reflektionsskala
</text>
- <button label="?" name="WaterNormalScaleHelp" />
+ <button label="?" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -36,65 +36,65 @@
<text name="BHText4">
3
</text>
- <slider label="" name="WaterNormalScaleX" />
- <slider label="" name="WaterNormalScaleY" />
- <slider label="" name="WaterNormalScaleZ" />
+ <slider label="" name="WaterNormalScaleX"/>
+ <slider label="" name="WaterNormalScaleY"/>
+ <slider label="" name="WaterNormalScaleZ"/>
<text name="HDText">
Spredningsskala
</text>
- <button label="?" name="WaterFresnelScaleHelp" />
- <slider label="" name="WaterFresnelScale" />
+ <button label="?" name="WaterFresnelScaleHelp"/>
+ <slider label="" name="WaterFresnelScale"/>
<text name="FresnelOffsetText">
Spredning offset
</text>
- <button label="?" name="WaterFresnelOffsetHelp" />
- <slider label="" name="WaterFresnelOffset" />
+ <button label="?" name="WaterFresnelOffsetHelp"/>
+ <slider label="" name="WaterFresnelOffset"/>
<text name="DensMultText">
Lysbrydning fra oven
</text>
- <button label="?" name="WaterScaleAboveHelp" />
- <slider label="" name="WaterScaleAbove" />
+ <button label="?" name="WaterScaleAboveHelp"/>
+ <slider label="" name="WaterScaleAbove"/>
<text name="WaterScaleBelowText">
Lysbrydning fra neden
</text>
- <button label="?" name="WaterScaleBelowHelp" />
- <slider label="" name="WaterScaleBelow" />
+ <button label="?" name="WaterScaleBelowHelp"/>
+ <slider label="" name="WaterScaleBelow"/>
<text name="MaxAltText">
Udviskning
</text>
- <button label="?" name="WaterBlurMultiplierHelp" />
- <slider label="" name="WaterBlurMult" />
+ <button label="?" name="WaterBlurMultiplierHelp"/>
+ <slider label="" name="WaterBlurMult"/>
</panel>
<panel label="Billede" name="Waves">
<text name="BHText">
Retning for store bølger
</text>
- <button label="?" name="WaterWave1Help" />
+ <button label="?" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
<text name="WaterWave1DirYText">
Y
</text>
- <slider label="" name="WaterWave1DirX" />
- <slider label="" name="WaterWave1DirY" />
+ <slider label="" name="WaterWave1DirX"/>
+ <slider label="" name="WaterWave1DirY"/>
<text name="BHText2">
Retning for små bølger
</text>
- <button label="?" name="WaterWave2Help" />
+ <button label="?" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
<text name="WaterWave2DirYText">
Y
</text>
- <slider label="" name="WaterWave2DirX" />
- <slider label="" name="WaterWave2DirY" />
+ <slider label="" name="WaterWave2DirX"/>
+ <slider label="" name="WaterWave2DirY"/>
<text name="BHText3">
Tekstur map
</text>
- <button label="?" name="WaterNormalMapHelp" />
- <texture_picker label="" name="WaterNormalMap" />
+ <button label="?" name="WaterNormalMapHelp"/>
+ <texture_picker label="" name="WaterNormalMap"/>
</panel>
</tab_container>
<string name="WLDefaultWaterNames">
diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..d2f618579d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry">
+ <text name="media_label">
+ Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
index 9754b1f074..4786609b53 100644
--- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="Avanceret opsætning for himmel">
+<floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL">
<text name="KeyFramePresetsText">
Faste indstillinger:
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_world_map.xml b/indra/newview/skins/default/xui/da/floater_world_map.xml
index d4b58f6232..137e8509a4 100644
--- a/indra/newview/skins/default/xui/da/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_world_map.xml
@@ -1,57 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Verdenskort">
- <tab_container name="maptab">
- <panel label="Objekter" name="objects_mapview"/>
- <panel label="Terræn" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Dig
- </text>
- <text name="home_label">
- Hjem
- </text>
- <text name="auction_label">
- Auktion
- </text>
- <text name="land_for_sale_label">
- Land til salg
- </text>
- <button label="Tag hjem" label_selected="Tag hjem" name="Go Home" tool_tip="Teleporter til dit hjem"/>
- <check_box label="Beboer" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Land til salg" name="land_for_sale_chk"/>
- <text name="events_label">
- Events:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <combo_box label="Venner online" name="friend combo" tool_tip="Ven der skal vises på kortet">
- <combo_box.item name="item1" label="Venner online" />
- </combo_box>
- <combo_box label="Landemærker" name="landmark combo" tool_tip="Landemærke der skal vises på kortet">
- <combo_box.item name="item1" label="Landemærker" />
- </combo_box>
- <line_editor label="Søg på region navn" name="location" tool_tip="Skriv navnet på en region"/>
- <button label="Søg" name="DoSearch" tool_tip="Søg efter en region"/>
- <text name="search_label">
- Søgeresultater:
- </text>
- <scroll_list name="search_results">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Lokation:
- </text>
- <spinner name="spin x" tool_tip="X koordinat for lokation der skal vises på kortet"/>
- <spinner name="spin y" tool_tip="Y koordinat for lokation der skal vises på kortet"/>
- <spinner name="spin z" tool_tip="Z koordinat for lokation der skal vises på kortet"/>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleportér til den valgte lokation"/>
- <button label="Vis destination" label_selected="Vis destination" name="Show Destination" tool_tip="Centrér kortet på valgte lokation"/>
- <button label="Slet" label_selected="Slet" name="Clear" tool_tip="Stop søg"/>
- <button label="Vis min position" label_selected="Vis min position" name="Show My Location" tool_tip="Centrer kortet på din avatars lokation"/>
- <button label="Kopiér SLurl til udklipsholder" name="copy_slurl" tool_tip="Kopierer den nuværende lokation som et SLurl, så det kan bruges på nettet."/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="VERDENSKORT">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Forklaring
+ </text>
+ </panel>
+ <panel>
+ <button label="Vis min position" label_selected="Vis min position" name="Show My Location" tool_tip="Centrér kort om min avatars position"/>
+ <text name="person_label">
+ Mig
+ </text>
+ <check_box label="Beboer" name="people_chk"/>
+ <check_box label="Infohub" name="infohub_chk"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box label="Land til salg" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ Land til salg
+ </text>
+ <text name="auction_label">
+ af ejer
+ </text>
+ <button label="Tag hjem" label_selected="Tag hjem" name="Go Home" tool_tip="Teleportér til min hjemmelokation"/>
+ <text name="Home_label">
+ Hjem
+ </text>
+ <text name="events_label">
+ Events:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ Mature
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Find på kort
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Venner online" name="friend combo" tool_tip="Vis venner på kort">
+ <combo_box.item label="Mine venner online" name="item1"/>
+ </combo_box>
+ <combo_box label="Mine landemærker" name="landmark combo" tool_tip="Landemærke der skal vises på kort">
+ <combo_box.item label="Mine landemærker" name="item1"/>
+ </combo_box>
+ <search_editor label="Regioner efter navn" name="location" tool_tip="Skriv navnet på en region"/>
+ <button label="Find" name="DoSearch" tool_tip="Søg efter en region"/>
+ <scroll_list name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleportér til den valgte lokation"/>
+ <button label="Kopiér SLurl" name="copy_slurl" tool_tip="Kopierer denne lokation som SLurl der kan bruges på web."/>
+ <button label="Vis selektion" label_selected="Vis destination" name="Show Destination" tool_tip="Centrér kortet på valgte lokation"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml
new file mode 100644
index 0000000000..1b85544303
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/>
+ <button label="Tilføj ven" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Mere" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Slå stemme-chat fra" name="disable_voice"/>
+ <button label="Slå stemme-chat til" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_group.xml b/indra/newview/skins/default/xui/da/inspect_group.xml
new file mode 100644
index 0000000000..486c5d8784
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Privat gruppe
+ </string>
+ <string name="FreeToJoin">
+ Ã…ben tilmelding
+ </string>
+ <string name="CostToJoin">
+ Tilmeldingsgebyr: L$[AMOUNT]
+ </string>
+ <string name="YouAreMember">
+ Du er meldlem
+ </string>
+ <button label="Tilmeld" name="join_btn"/>
+ <button label="Forlad" name="leave_btn"/>
+ <button label="Vis profil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_object.xml b/indra/newview/skins/default/xui/da/inspect_object.xml
new file mode 100644
index 0000000000..8cbcf6cac8
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/inspect_object.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Af [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ af [CREATOR]
+ejer [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Gratis!
+ </string>
+ <string name="Touch">
+ Berør
+ </string>
+ <string name="Sit">
+ Sid
+ </string>
+ <button label="Køb" name="buy_btn"/>
+ <button label="Betal" name="pay_btn"/>
+ <button label="Tag kopi" name="take_free_copy_btn"/>
+ <button label="Berør" name="touch_btn"/>
+ <button label="Sid" name="sit_btn"/>
+ <button label="Ã…ben" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Sikker Browsing"/>
+ <button label="Mere" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_remote_object.xml b/indra/newview/skins/default/xui/da/inspect_remote_object.xml
new file mode 100644
index 0000000000..a06452afe6
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Ejer:
+ </text>
+ <button label="Kort" name="map_btn"/>
+ <button label="Blokér" name="block_btn"/>
+ <button label="Luk" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_other.xml b/indra/newview/skins/default/xui/da/menu_attachment_other.xml
new file mode 100644
index 0000000000..2cc23e27c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil" name="Profile..."/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Send besked" name="Send IM..."/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Invitér til gruppe" name="Invite..."/>
+ <menu_item_call label="Blokér" name="Avatar Mute"/>
+ <menu_item_call label="Rapportér" name="abuse"/>
+ <menu_item_call label="Frys" name="Freeze..."/>
+ <menu_item_call label="Smid ud" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Zoom ind" name="Zoom In"/>
+ <menu_item_call label="Betal" name="Pay..."/>
+ <menu_item_call label="Objekt profil" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
new file mode 100644
index 0000000000..306ae96d49
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Berør" name="Attachment Object Touch"/>
+ <menu_item_call label="Redigér" name="Edit..."/>
+ <menu_item_call label="Tag af" name="Detach"/>
+ <menu_item_call label="Smid" name="Drop"/>
+ <menu_item_call label="Stå op" name="Stand Up"/>
+ <menu_item_call label="Udseende" name="Appearance..."/>
+ <menu_item_call label="Venner" name="Friends..."/>
+ <menu_item_call label="Grupper" name="Groups..."/>
+ <menu_item_call label="Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_icon.xml b/indra/newview/skins/default/xui/da/menu_avatar_icon.xml
new file mode 100644
index 0000000000..26b58ce1ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profil" name="Show Profile"/>
+ <menu_item_call label="Send besked..." name="Send IM"/>
+ <menu_item_call label="Tilføj ven..." name="Add Friend"/>
+ <menu_item_call label="Fjern ven..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_other.xml b/indra/newview/skins/default/xui/da/menu_avatar_other.xml
new file mode 100644
index 0000000000..66d357e7e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil" name="Profile..."/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Besked" name="Send IM..."/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Invitér til gruppe" name="Invite..."/>
+ <menu_item_call label="Blokér" name="Avatar Mute"/>
+ <menu_item_call label="Rapportér" name="abuse"/>
+ <menu_item_call label="Frys" name="Freeze..."/>
+ <menu_item_call label="Smid ud" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Zoom ind" name="Zoom In"/>
+ <menu_item_call label="Betal" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
new file mode 100644
index 0000000000..29620fca27
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Stå op" name="Stand Up"/>
+ <context_menu label="Tag af &gt;" name="Take Off &gt;">
+ <context_menu label="Tøj &gt;" name="Clothes &gt;">
+ <menu_item_call label="Trøje" name="Shirt"/>
+ <menu_item_call label="Bukser" name="Pants"/>
+ <menu_item_call label="Nederdel" name="Skirt"/>
+ <menu_item_call label="Sko" name="Shoes"/>
+ <menu_item_call label="Strømper" name="Socks"/>
+ <menu_item_call label="Jakke" name="Jacket"/>
+ <menu_item_call label="Handsker" name="Gloves"/>
+ <menu_item_call label="Undertrøje" name="Self Undershirt"/>
+ <menu_item_call label="Underbukser" name="Self Underpants"/>
+ <menu_item_call label="Tatovering" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Alt tøj" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD &gt;" name="Object Detach HUD"/>
+ <context_menu label="Tag af &gt;" name="Object Detach"/>
+ <menu_item_call label="Tag alt af" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Udseende" name="Appearance..."/>
+ <menu_item_call label="Venner" name="Friends..."/>
+ <menu_item_call label="Grupper" name="Groups..."/>
+ <menu_item_call label="Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
new file mode 100644
index 0000000000..dbdeefeaff
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Faste bevægelser" name="ShowGestureButton"/>
+ <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/>
+ <menu_item_check label="Vis knap" name="ShowCameraButton"/>
+ <menu_item_check label="Foto knap" name="ShowSnapshotButton"/>
+ <menu_item_call label="Klip" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Slet" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Vælg alt" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_favorites.xml b/indra/newview/skins/default/xui/da/menu_favorites.xml
new file mode 100644
index 0000000000..a4793e294c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportér" name="Teleport To Landmark"/>
+ <menu_item_call label="Vis/ret landemærke" name="Landmark Open"/>
+ <menu_item_call label="Kopiér SLurl" name="Copy slurl"/>
+ <menu_item_call label="Vis på kort" name="Show On Map"/>
+ <menu_item_call label="Kopiér" name="Landmark Copy"/>
+ <menu_item_call label="Sæt ind" name="Landmark Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_gesture_gear.xml b/indra/newview/skins/default/xui/da/menu_gesture_gear.xml
new file mode 100644
index 0000000000..a9010e99b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Tilføj/fjern fra favoritter" name="activate"/>
+ <menu_item_call label="Kopiér" name="copy_gesture"/>
+ <menu_item_call label="Sæt ind" name="paste"/>
+ <menu_item_call label="Kopiér UUID" name="copy_uuid"/>
+ <menu_item_call label="Gem til nuværende sæt" name="save_to_outfit"/>
+ <menu_item_call label="Editér" name="edit_gesture"/>
+ <menu_item_call label="Undersøg" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_group_plus.xml b/indra/newview/skins/default/xui/da/menu_group_plus.xml
new file mode 100644
index 0000000000..97fbec1ed1
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Meld ind i gruppe..." name="item_join"/>
+ <menu_item_call label="Ny gruppe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_hide_navbar.xml b/indra/newview/skins/default/xui/da/menu_hide_navbar.xml
new file mode 100644
index 0000000000..45276adda4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Vis navigationsbjælke" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Vis favoritbjælke" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/da/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..f64a6ad455
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Afslut" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/da/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..b89d9a5789
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Gruppe info" name="Show Profile"/>
+ <menu_item_call label="Vis session" name="Chat"/>
+ <menu_item_call label="Afslut session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/da/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..6ebc40a8dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Profil" name="Show Profile"/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Vis session" name="Send IM"/>
+ <menu_item_call label="Afslut session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..5b8089bfe0
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Profil" name="view_profile"/>
+ <menu_item_call label="Tilføj ven" name="add_friend"/>
+ <menu_item_call label="Besked" name="im"/>
+ <menu_item_call label="Opkald" name="call"/>
+ <menu_item_call label="Teleportér" name="teleport"/>
+ <menu_item_call label="Invitér til gruppe" name="invite_to_group"/>
+ <menu_item_call label="Blokér" name="block"/>
+ <menu_item_call label="Rapportér" name="report"/>
+ <menu_item_call label="Frys" name="freeze"/>
+ <menu_item_call label="Smid ud" name="eject"/>
+ <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Find på kort" name="find_on_map"/>
+ <menu_item_call label="Zoom ind" name="zoom_in"/>
+ <menu_item_call label="Betal" name="pay"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..c7bb2a9ead
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Berør" name="touch"/>
+ <menu_item_call label="Sid her" name="sit"/>
+ <menu_item_call label="betal" name="pay"/>
+ <menu_item_call label="Køb" name="buy"/>
+ <menu_item_call label="Tag" name="take"/>
+ <menu_item_call label="tag kopi" name="take_copy"/>
+ <menu_item_call label="Ã…ben" name="open"/>
+ <menu_item_call label="Redigér" name="edit"/>
+ <menu_item_call label="Tag på" name="wear"/>
+ <menu_item_call label="Rapportér" name="report"/>
+ <menu_item_call label="Blokér" name="block"/>
+ <menu_item_call label="Zoom ind" name="zoom_in"/>
+ <menu_item_call label="Fjern" name="remove"/>
+ <menu_item_call label="Mere info" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..cfe455e21d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Stå op" name="stand_up"/>
+ <menu_item_call label="Udseende" name="my_appearance"/>
+ <menu_item_call label="Profil" name="my_profile"/>
+ <menu_item_call label="Venner" name="my_friends"/>
+ <menu_item_call label="Grupper" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml
index fd5ebe5c82..376af507d0 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory.xml
@@ -1,66 +1,82 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="Køb" name="Task Buy" />
- <menu_item_call label="Ã¥ben" name="Task Open" />
- <menu_item_call label="Afspil" name="Task Play" />
- <menu_item_call label="Egenskaber" name="Task Properties" />
- <menu_item_call label="Omdøb" name="Task Rename" />
- <menu_item_call label="Slet" name="Task Remove" />
- <menu_item_call label="Tøm papirkurv" name="Empty Trash" />
- <menu_item_call label="Tøm &apos;Lost and found&apos;" name="Empty Lost And Found" />
- <menu_item_call label="Ny mappe" name="New Folder" />
- <menu_item_call label="Nyt script" name="New Script" />
- <menu_item_call label="Ny note" name="New Note" />
- <menu_item_call label="Ny bevægelse" name="New Gesture" />
- <menu name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt" />
- <menu_item_call label="Nye bukser" name="New Pants" />
- <menu_item_call label="Nye sko" name="New Shoes" />
- <menu_item_call label="Nye strømper" name="New Socks" />
- <menu_item_call label="Ny jakke" name="New Jacket" />
- <menu_item_call label="Ny nederdel" name="New Skirt" />
- <menu_item_call label="Nye handsker" name="New Gloves" />
- <menu_item_call label="Ny undertrøje" name="New Undershirt" />
- <menu_item_call label="Nye underbukser" name="New Underpants" />
+ <menu_item_call label="Køb" name="Task Buy"/>
+ <menu_item_call label="Ã¥ben" name="Task Open"/>
+ <menu_item_call label="Afspil" name="Task Play"/>
+ <menu_item_call label="Egenskaber" name="Task Properties"/>
+ <menu_item_call label="Omdøb" name="Task Rename"/>
+ <menu_item_call label="Slet" name="Task Remove"/>
+ <menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
+ <menu_item_call label="Tøm &apos;Lost and found&apos;" name="Empty Lost And Found"/>
+ <menu_item_call label="Ny mappe" name="New Folder"/>
+ <menu_item_call label="Nyt script" name="New Script"/>
+ <menu_item_call label="Ny note" name="New Note"/>
+ <menu_item_call label="Ny bevægelse" name="New Gesture"/>
+ <menu label="Nyt tøj" name="New Clothes">
+ <menu_item_call label="Ny trøje" name="New Shirt"/>
+ <menu_item_call label="Nye bukser" name="New Pants"/>
+ <menu_item_call label="Nye sko" name="New Shoes"/>
+ <menu_item_call label="Nye strømper" name="New Socks"/>
+ <menu_item_call label="Ny jakke" name="New Jacket"/>
+ <menu_item_call label="Ny nederdel" name="New Skirt"/>
+ <menu_item_call label="Nye handsker" name="New Gloves"/>
+ <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
+ <menu_item_call label="Nye underbukser" name="New Underpants"/>
+ <menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/>
+ <menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
- <menu_item_call label="Ny figur" name="New Shape" />
- <menu_item_call label="Nyt hud" name="New Skin" />
- <menu_item_call label="Nyt hår" name="New Hair" />
- <menu_item_call label="Nye øjne" name="New Eyes" />
+ <menu label="Nye kropsdele" name="New Body Parts">
+ <menu_item_call label="Ny figur" name="New Shape"/>
+ <menu_item_call label="Nyt hud" name="New Skin"/>
+ <menu_item_call label="Nyt hår" name="New Hair"/>
+ <menu_item_call label="Nye øjne" name="New Eyes"/>
</menu>
- <menu_item_call label="Teleport" name="Landmark Open" />
- <menu_item_call label="Ã¥ben" name="Animation Open" />
- <menu_item_call label="Ã¥ben" name="Sound Open" />
- <menu_item_call label="Slet ting" name="Purge Item" />
- <menu_item_call label="Genskab ting" name="Restore Item" />
- <menu_item_call label="Ã¥ben" name="Open" />
- <menu_item_call label="Egenskaber" name="Properties" />
- <menu_item_call label="Omdøb" name="Rename" />
- <menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID" />
- <menu_item_call label="Kopiér" name="Copy" />
- <menu_item_call label="Indsæt" name="Paste" />
- <menu_item_call label="Slet" name="Delete" />
- <menu_item_call label="Tag ting af" name="Take Off Items" />
- <menu_item_call label="Tilføj til påklædning" name="Add To Outfit" />
- <menu_item_call label="Erstat påklædning" name="Replace Outfit" />
- <menu_item_call label="start konference chat" name="Conference Chat Folder" />
- <menu_item_call label="Afspil" name="Sound Play" />
- <menu_item_call label="Om landemærke" name="Teleport To Landmark" />
- <menu_item_call label="Afspil offentligt" name="Animation Play" />
- <menu_item_call label="Afspil lokalt" name="Animation Audition" />
- <menu_item_call label="Send privat besked (IM)" name="Send Instant Message" />
- <menu_item_call label="Tilbyd teleport..." name="Offer Teleport..." />
- <menu_item_call label="start konference Chat" name="Conference Chat" />
- <menu_item_call label="Aktivér" name="Activate" />
- <menu_item_call label="Deaktivér" name="Deactivate" />
- <menu_item_call label="Tag af dig selv" name="Detach From Yourself" />
- <menu_item_call label="Tilbage til sidste position" name="Restore to Last Position"/>
- <menu_item_call label="Tag på" name="Object Wear" />
- <menu label="Vedhæft" name="Attach To" />
- <menu label="Vedhæft til HUD" name="Attach To HUD" />
- <menu_item_call label="Redigér" name="Wearable Edit" />
- <menu_item_call label="Tag på" name="Wearable Wear" />
- <menu_item_call label="Tag af" name="Take Off" />
- <menu_item_call label="--ingen valg--" name="--no options--" />
+ <menu label="Ændre type" name="Change Type">
+ <menu_item_call label="Standard" name="Default"/>
+ <menu_item_call label="Handsker" name="Gloves"/>
+ <menu_item_call label="Jakke" name="Jacket"/>
+ <menu_item_call label="Bukser" name="Pants"/>
+ <menu_item_call label="Kropsbygning" name="Shape"/>
+ <menu_item_call label="Sko" name="Shoes"/>
+ <menu_item_call label="Trøje" name="Shirt"/>
+ <menu_item_call label="Nederdel" name="Skirt"/>
+ <menu_item_call label="Underbukser" name="Underpants"/>
+ <menu_item_call label="Undertrøje" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teleport" name="Landmark Open"/>
+ <menu_item_call label="Ã¥ben" name="Animation Open"/>
+ <menu_item_call label="Ã¥ben" name="Sound Open"/>
+ <menu_item_call label="Slet ting" name="Purge Item"/>
+ <menu_item_call label="Genskab ting" name="Restore Item"/>
+ <menu_item_call label="GÃ¥ til link" name="Goto Link"/>
+ <menu_item_call label="Ã¥ben" name="Open"/>
+ <menu_item_call label="Egenskaber" name="Properties"/>
+ <menu_item_call label="Omdøb" name="Rename"/>
+ <menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Indsæt" name="Paste"/>
+ <menu_item_call label="Sæt ind som link" name="Paste As Link"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Tag ting af" name="Take Off Items"/>
+ <menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
+ <menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
+ <menu_item_call label="start konference chat" name="Conference Chat Folder"/>
+ <menu_item_call label="Afspil" name="Sound Play"/>
+ <menu_item_call label="Om landemærke" name="About Landmark"/>
+ <menu_item_call label="Afspil offentligt" name="Animation Play"/>
+ <menu_item_call label="Afspil lokalt" name="Animation Audition"/>
+ <menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/>
+ <menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/>
+ <menu_item_call label="start konference Chat" name="Conference Chat"/>
+ <menu_item_call label="Aktivér" name="Activate"/>
+ <menu_item_call label="Deaktivér" name="Deactivate"/>
+ <menu_item_call label="Gem som" name="Save As"/>
+ <menu_item_call label="Tag af dig selv" name="Detach From Yourself"/>
+ <menu_item_call label="Tag på" name="Object Wear"/>
+ <menu label="Vedhæft" name="Attach To"/>
+ <menu label="Vedhæft til HUD" name="Attach To HUD"/>
+ <menu_item_call label="Redigér" name="Wearable Edit"/>
+ <menu_item_call label="Tag på" name="Wearable Wear"/>
+ <menu_item_call label="Tag af" name="Take Off"/>
+ <menu_item_call label="--ingen valg--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
new file mode 100644
index 0000000000..dc79e4109e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Hent" name="upload">
+ <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Ny mappe" name="New Folder"/>
+ <menu_item_call label="Nyt script" name="New Script"/>
+ <menu_item_call label="Ny note" name="New Note"/>
+ <menu_item_call label="Ny bevægelse" name="New Gesture"/>
+ <menu label="Nyt tøj" name="New Clothes">
+ <menu_item_call label="Ny trøje" name="New Shirt"/>
+ <menu_item_call label="Nye bukser" name="New Pants"/>
+ <menu_item_call label="Nye sko" name="New Shoes"/>
+ <menu_item_call label="Nye strømper" name="New Socks"/>
+ <menu_item_call label="Ny jakke" name="New Jacket"/>
+ <menu_item_call label="Ny nederdel" name="New Skirt"/>
+ <menu_item_call label="Nye handsker" name="New Gloves"/>
+ <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
+ <menu_item_call label="Nye underbukser" name="New Underpants"/>
+ <menu_item_call label="Nyt alpha lag" name="New Alpha"/>
+ <menu_item_call label="Ny tatovering" name="New Tattoo"/>
+ </menu>
+ <menu label="Nye kropsdele" name="New Body Parts">
+ <menu_item_call label="Ny kropsbygning" name="New Shape"/>
+ <menu_item_call label="Ny hud" name="New Skin"/>
+ <menu_item_call label="Nyt hår" name="New Hair"/>
+ <menu_item_call label="Nye øjne" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..e643498822
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nyt vindue" name="new_window"/>
+ <menu_item_call label="Sortér efter navn" name="sort_by_name"/>
+ <menu_item_call label="Sortér efter nyeste" name="sort_by_recent"/>
+ <menu_item_call label="Vis filtre" name="show_filters"/>
+ <menu_item_call label="Nulstil filtre" name="reset_filters"/>
+ <menu_item_call label="Luk alle mapper" name="close_folders"/>
+ <menu_item_call label="Tøm papirkurv" name="empty_trash"/>
+ <menu_item_call label="Tøm &quot;fundne genstande&quot;" name="empty_lostnfound"/>
+ <menu_item_call label="Gem tekstur som" name="Save Texture As"/>
+ <menu_item_call label="Find original" name="Find Original"/>
+ <menu_item_call label="Find alle links" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_land.xml b/indra/newview/skins/default/xui/da/menu_land.xml
new file mode 100644
index 0000000000..1548f18f89
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Om land" name="Place Information..."/>
+ <menu_item_call label="Sid her" name="Sit Here"/>
+ <menu_item_call label="Køb" name="Land Buy"/>
+ <menu_item_call label="Køb adgang" name="Land Buy Pass"/>
+ <menu_item_call label="Byg" name="Create"/>
+ <menu_item_call label="Tilpas terræn" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_landmark.xml b/indra/newview/skins/default/xui/da/menu_landmark.xml
new file mode 100644
index 0000000000..3cf2ffe375
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Kopiér SLurl" name="copy"/>
+ <menu_item_call label="Slet" name="delete"/>
+ <menu_item_call label="Opret favorit" name="pick"/>
+ <menu_item_call label="Tilføj til favorit bjælke" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_login.xml b/indra/newview/skins/default/xui/da/menu_login.xml
index 9d9dcd4b2e..0942f1b807 100644
--- a/indra/newview/skins/default/xui/da/menu_login.xml
+++ b/indra/newview/skins/default/xui/da/menu_login.xml
@@ -1,13 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Filer" name="File">
- <menu_item_call label="Afslut" name="Quit" />
- </menu>
- <menu label="Rediger" name="Edit">
- <menu_item_call label="Indstillinger..." name="Preferences..." />
+ <menu label="Mig" name="File">
+ <menu_item_call label="Indstillinger" name="Preferences..."/>
+ <menu_item_call label="Afslut" name="Quit"/>
</menu>
<menu label="Hjælp" name="Help">
- <menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help" />
- <menu_item_call label="Om [APP_NAME]..." name="About Second Life..." />
+ <menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help"/>
+ </menu>
+ <menu label="Debug" name="Debug">
+ <menu label="Redigér" name="Edit">
+ <menu_item_call label="Fortryd" name="Undo"/>
+ <menu_item_call label="Gendan" name="Redo"/>
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Duplikér" name="Duplicate"/>
+ <menu_item_call label="Vælg alle" name="Select All"/>
+ <menu_item_call label="Vælg intet" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Vis debug opsætning" name="Debug Settings"/>
+ <menu_item_call label="UI/farve opsætning" name="UI/Color Settings"/>
+ <menu_item_call label="Vis sidebakke" name="Show Side Tray"/>
+ <menu label="UI tests" name="UI Tests"/>
+ <menu_item_call label="Vis betingelser" name="TOS"/>
+ <menu_item_call label="Vis vigtig besked" name="Critical"/>
+ <menu_item_call label="Test i web browser" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/da/menu_mini_map.xml b/indra/newview/skins/default/xui/da/menu_mini_map.xml
index 2a711dc5be..667638c529 100644
--- a/indra/newview/skins/default/xui/da/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/da/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom tæt" name="Zoom Close"/>
<menu_item_call label="Zoom mellem" name="Zoom Medium"/>
<menu_item_call label="Zoom langt" name="Zoom Far"/>
+ <menu_item_check label="Rotér kort" name="Rotate Map"/>
<menu_item_call label="Stop Tracking" name="Stop Tracking"/>
- <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Verdenskort" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_navbar.xml b/indra/newview/skins/default/xui/da/menu_navbar.xml
new file mode 100644
index 0000000000..c04206824a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Vis koordinater" name="Show Coordinates"/>
+ <menu_item_check label="Vis oplysninger om parcel" name="Show Parcel Properties"/>
+ <menu_item_call label="Landemærke" name="Landmark"/>
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Vælg alt" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_nearby_chat.xml b/indra/newview/skins/default/xui/da/menu_nearby_chat.xml
new file mode 100644
index 0000000000..be532ad406
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Vis personer tæt på..." name="nearby_people"/>
+ <menu_item_check label="Vis blokeret tekst" name="muted_text"/>
+ <menu_item_check label="Vis venne-ikoner" name="show_buddy_icons"/>
+ <menu_item_check label="Vis navne" name="show_names"/>
+ <menu_item_check label="Vis ikoner og navne" name="show_icons_and_names"/>
+ <menu_item_call label="Font størrelse" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml
new file mode 100644
index 0000000000..0714b67ec3
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_object.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Berør" name="Object Touch"/>
+ <menu_item_call label="Redigér" name="Edit..."/>
+ <menu_item_call label="Byg" name="Build"/>
+ <menu_item_call label="Ã…ben" name="Open"/>
+ <menu_item_call label="Sid her" name="Object Sit"/>
+ <menu_item_call label="Objekt profil" name="Object Inspect"/>
+ <context_menu label="Sæt på &gt;" name="Put On">
+ <menu_item_call label="Tag på" name="Wear"/>
+ <context_menu label="Vedhæft &gt;" name="Object Attach"/>
+ <context_menu label="Vedhæft HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Fjern &gt;" name="Remove">
+ <menu_item_call label="Tag" name="Pie Object Take"/>
+ <menu_item_call label="Rapportér misbrug" name="Report Abuse..."/>
+ <menu_item_call label="Blokér" name="Object Mute"/>
+ <menu_item_call label="Returnér" name="Return..."/>
+ <menu_item_call label="Slet" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Tag kopi" name="Take Copy"/>
+ <menu_item_call label="Betal" name="Pay..."/>
+ <menu_item_call label="Køb" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_object_icon.xml b/indra/newview/skins/default/xui/da/menu_object_icon.xml
new file mode 100644
index 0000000000..08aeb633b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Objekt Profil..." name="Object Profile"/>
+ <menu_item_call label="Blokér..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_participant_list.xml b/indra/newview/skins/default/xui/da/menu_participant_list.xml
new file mode 100644
index 0000000000..44a016026c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_participant_list.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_call label="Profil" name="View Profile"/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Send besked" name="IM"/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Del" name="Share"/>
+ <menu_item_call label="Betal" name="Pay"/>
+ <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/>
+ <menu_item_check label="Sluk for tekst" name="MuteText"/>
+ <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/>
+ <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Sluk for alle andre" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Ã…ben for denne deltager" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Ã…ben for alle andre" name="ModerateVoiceUnMuteOthers"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..525450f23f
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Sortér efter navn" name="sort_name"/>
+ <menu_item_check label="Sortér efter status" name="sort_status"/>
+ <menu_item_check label="Vis person ikoner" name="view_icons"/>
+ <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..0b9a791530
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Vis gruppe ikoner" name="Display Group Icons"/>
+ <menu_item_call label="Forlad valgte gruppe" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby.xml b/indra/newview/skins/default/xui/da/menu_people_nearby.xml
new file mode 100644
index 0000000000..224190149b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_nearby.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Profil" name="View Profile"/>
+ <menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Besked" name="IM"/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Del" name="Share"/>
+ <menu_item_call label="Betal" name="Pay"/>
+ <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..92c6d2c960
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Tilføj venner" name="Add Friends"/>
+ <menu_item_call label="Besked" name="IM"/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Del" name="Share"/>
+ <menu_item_call label="Betal" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..2f35ff3c92
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Sortér efter tidligere talere" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Sortér efter navn" name="sort_name"/>
+ <menu_item_check label="Sortér efter afstand" name="sort_distance"/>
+ <menu_item_check label="Se ikoner for personer" name="view_icons"/>
+ <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..d081f637f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Sortér efter nyeste" name="sort_most"/>
+ <menu_item_check label="Sortér efter navn" name="sort_name"/>
+ <menu_item_check label="Vis person ikoner" name="view_icons"/>
+ <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_picks.xml b/indra/newview/skins/default/xui/da/menu_picks.xml
new file mode 100644
index 0000000000..81ee900773
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Redigér" name="pick_edit"/>
+ <menu_item_call label="Teleportér" name="pick_teleport"/>
+ <menu_item_call label="Vis på kort" name="pick_map"/>
+ <menu_item_call label="Slet" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_picks_plus.xml b/indra/newview/skins/default/xui/da/menu_picks_plus.xml
new file mode 100644
index 0000000000..d95071fbbb
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Ny favorit" name="create_pick"/>
+ <menu_item_call label="Ny annonce" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_place.xml b/indra/newview/skins/default/xui/da/menu_place.xml
new file mode 100644
index 0000000000..b87964ac14
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Opret et landemærke" name="landmark"/>
+ <menu_item_call label="Opret favorit" name="pick"/>
+ <menu_item_call label="Køb adgang" name="pass"/>
+ <menu_item_call label="Redigér" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_place_add_button.xml b/indra/newview/skins/default/xui/da/menu_place_add_button.xml
new file mode 100644
index 0000000000..7ad2253550
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Opret mappe" name="add_folder"/>
+ <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..3ee3c02fb1
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
+ <menu_item_call label="Tilføj mappe" name="add_folder"/>
+ <menu_item_call label="Klip" name="cut"/>
+ <menu_item_call label="Kopiér" name="copy_folder"/>
+ <menu_item_call label="Sæt ind" name="paste"/>
+ <menu_item_call label="Omdøb" name="rename"/>
+ <menu_item_call label="Slet" name="delete"/>
+ <menu_item_call label="Udvid" name="expand"/>
+ <menu_item_call label="Luk" name="collapse"/>
+ <menu_item_call label="Udvid alle mapper" name="expand_all"/>
+ <menu_item_call label="Luk alle mapper" name="collapse_all"/>
+ <menu_item_check label="Sortér efter dato" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..21f425c49d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportér" name="teleport"/>
+ <menu_item_call label="Mere information" name="more_info"/>
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Tilføj landemærke" name="add_landmark"/>
+ <menu_item_call label="Tilføj mappe" name="add_folder"/>
+ <menu_item_call label="Klip" name="cut"/>
+ <menu_item_call label="Kopiér landemærke" name="copy_landmark"/>
+ <menu_item_call label="Kopiér SLurl" name="copy_slurl"/>
+ <menu_item_call label="Sæt ind" name="paste"/>
+ <menu_item_call label="Omdøb" name="rename"/>
+ <menu_item_call label="Slet" name="delete"/>
+ <menu_item_call label="Ã…ben alle mapper" name="expand_all"/>
+ <menu_item_call label="Luk alle mapper" name="collapse_all"/>
+ <menu_item_check label="Sortér efter dato" name="sort_by_date"/>
+ <menu_item_call label="Opret favorit" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_profile_overflow.xml b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml
new file mode 100644
index 0000000000..58fbc62643
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Betal" name="pay"/>
+ <menu_item_call label="Del" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_slurl.xml b/indra/newview/skins/default/xui/da/menu_slurl.xml
index ef5cfd7200..a9302e111e 100644
--- a/indra/newview/skins/default/xui/da/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/da/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="Om URL" name="about_url" />
- <menu_item_call label="Teleportér til URL" name="teleport_to_url" />
- <menu_item_call label="Vis på kort" name="show_on_map" />
+ <menu_item_call label="Om URL" name="about_url"/>
+ <menu_item_call label="Teleportér til URL" name="teleport_to_url"/>
+ <menu_item_call label="Kort" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/da/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..a1c25fea69
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Udvid alle mapper" name="Expand all folders"/>
+ <menu_item_call label="Luk alle mapper" name="Collapse all folders"/>
+ <menu_item_call label="Nulstil teleport historik" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/da/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..dbaec62087
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportér" name="Teleport"/>
+ <menu_item_call label="Mere information" name="More Information"/>
+ <menu_item_call label="Kopiér til udklipsholder" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/da/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..c4d4bb4b5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Ã…ben" name="TabOpen"/>
+ <menu_item_call label="Luk" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_text_editor.xml b/indra/newview/skins/default/xui/da/menu_text_editor.xml
new file mode 100644
index 0000000000..3ff31ea232
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Vælg alt" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_agent.xml b/indra/newview/skins/default/xui/da/menu_url_agent.xml
new file mode 100644
index 0000000000..491586f3b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis beboer profil" name="show_agent"/>
+ <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_group.xml b/indra/newview/skins/default/xui/da/menu_url_group.xml
new file mode 100644
index 0000000000..c776159b0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis gruppeinformation" name="show_group"/>
+ <menu_item_call label="Kopiér gruppe til udklipsholder" name="url_copy_label"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_http.xml b/indra/newview/skins/default/xui/da/menu_url_http.xml
new file mode 100644
index 0000000000..4398777a39
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Indlæs" name="url_open"/>
+ <menu_item_call label="Ã…ben i intern browser" name="url_open_internal"/>
+ <menu_item_call label="Ã…ben i ekstern browser" name="url_open_external"/>
+ <menu_item_call label="Kopiér URL til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_inventory.xml b/indra/newview/skins/default/xui/da/menu_url_inventory.xml
new file mode 100644
index 0000000000..9a7de23e06
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis beholdningsgenstand" name="show_item"/>
+ <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_map.xml b/indra/newview/skins/default/xui/da/menu_url_map.xml
new file mode 100644
index 0000000000..ff4a4d5174
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Teleport til lokation" name="teleport_to_location"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_objectim.xml b/indra/newview/skins/default/xui/da/menu_url_objectim.xml
new file mode 100644
index 0000000000..e27cf84959
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis objekt information" name="show_object"/>
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Teleportér til objekt lokation" name="teleport_to_object"/>
+ <menu_item_call label="Kopiér objekt navn til udklipsholder" name="url_copy_label"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_parcel.xml b/indra/newview/skins/default/xui/da/menu_url_parcel.xml
new file mode 100644
index 0000000000..0f21e14f66
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis information om parcel" name="show_parcel"/>
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_slapp.xml b/indra/newview/skins/default/xui/da/menu_url_slapp.xml
new file mode 100644
index 0000000000..dd25db2aa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Kør denne kommando" name="run_slapp"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_slurl.xml b/indra/newview/skins/default/xui/da/menu_url_slurl.xml
new file mode 100644
index 0000000000..8d84a138bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Vis information" name="show_place"/>
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Teleportér til lokation" name="teleport_to_location"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_url_teleport.xml b/indra/newview/skins/default/xui/da/menu_url_teleport.xml
new file mode 100644
index 0000000000..e0ca7b920d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="Vis på kort" name="show_on_map"/>
+ <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index 6a75e27381..ec0631d54f 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -1,207 +1,324 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Filer" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Hent" name="upload">
- <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Hent mange (L$[COST] per file)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Sæt standard rettigheder..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Luk vindue" name="Close Window"/>
- <menu_item_call label="Luk alle vinduer" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Gem tekstur som..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Tag foto" name="Take Snapshot"/>
- <menu_item_call label="Tag foto til disk" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Afslut" name="Quit"/>
- </menu>
- <menu label="Redigér" name="Edit">
- <menu_item_call label="Annullér" name="Undo"/>
- <menu_item_call label="Gentag" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopier" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Søg..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Vælg alt" name="Select All"/>
- <menu_item_call label="Vælg intet" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplikér" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Vedhæft objekt" name="Attach Object"/>
- <menu label="Tag objekt af" name="Detach Object"/>
- <menu label="Tag tøj af" name="Take Off Clothing">
- <menu_item_call label="Trøje" name="Shirt"/>
- <menu_item_call label="Bukser" name="Pants"/>
- <menu_item_call label="Sko" name="Shoes"/>
- <menu_item_call label="Strømper" name="Socks"/>
- <menu_item_call label="Jakke" name="Jacket"/>
- <menu_item_call label="Handsker" name="Gloves"/>
- <menu_item_call label="Undertrøje" name="Menu Undershirt"/>
- <menu_item_call label="Underbukser" name="Menu Underpants"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
- <menu_item_call label="Alt tøj" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Bevægelser..." name="Gestures..."/>
- <menu_item_call label="Profil..." name="Profile..."/>
- <menu_item_call label="Udseende..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Venner..." name="Friends..."/>
- <menu_item_call label="Grupper..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Indstillinger..." name="Preferences..."/>
- </menu>
- <menu label="Vis" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Første person" name="Mouselook"/>
- <menu_item_check label="Byg" name="Build"/>
- <menu_item_check label="Flyv via joystick" name="Joystick Flycam"/>
- <menu_item_call label="Nulstil kamera" name="Reset View"/>
- <menu_item_call label="Se på sidste chatter" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Værktøjslinie" name="Toolbar"/>
- <menu_item_check label="Local chat" name="Chat History"/>
- <menu_item_check label="Kommunikér" name="Instant Message"/>
+ <menu label="Mig" name="Me">
+ <menu_item_call label="Indstillinger" name="Preferences"/>
+ <menu_item_call label="Mit instrumentpanel" name="Manage My Account"/>
+ <menu_item_call label="Køb L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Profil" name="Profile"/>
+ <menu_item_call label="Udseende" name="Appearance"/>
<menu_item_check label="Beholdning" name="Inventory"/>
- <menu_item_check label="Aktive talere" name="Active Speakers"/>
- <menu_item_check label="Vis blokerede avatarer" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Kamera kontrol" name="Camera Controls"/>
- <menu_item_check label="Bevægelses kontrol" name="Movement Controls"/>
- <menu_item_check label="Verdenskort" name="World Map"/>
- <menu_item_check label="Lokalt kort" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Teknisk info" name="Statistics Bar"/>
- <menu_item_check label="Parcel skel" name="Property Lines"/>
- <menu_item_check label="Visning af ingen adgang" name="Banlines"/>
- <menu_item_check label="Grundejere" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Tips visning" name="Hover Tips">
- <menu_item_check label="Vis tips" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Tips om land" name="Land Tips"/>
- <menu_item_check label="Tips på alle objekter" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Fremhæv gennemsigtigt" name="Highlight Transparent"/>
- <menu_item_check label="Pejlelys" name="beacons"/>
- <menu_item_check label="Skjul partikler" name="Hide Particles"/>
- <menu_item_check label="Vis HUD vedhæftninger" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Zoom ind" name="Zoom In"/>
- <menu_item_call label="Zoom standard" name="Zoom Default"/>
- <menu_item_call label="Zoom ud" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Skift fuld skærm/vindue" name="Toggle Fullscreen"/>
- <menu_item_call label="Sæt brugerfladestørrelse til normal" name="Set UI Size to Default"/>
+ <menu_item_call label="Vis beholdning i sidebakke" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Mine bevægelser" name="Gestures"/>
+ <menu label="Min status" name="Status">
+ <menu_item_call label="Væk" name="Set Away"/>
+ <menu_item_call label="Optaget" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
+ <menu_item_call label="Stop administrator status" name="Leave Admin Options"/>
+ <menu_item_call label="Afslut [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Kommunikér" name="Communicate">
+ <menu_item_call label="Venner" name="My Friends"/>
+ <menu_item_call label="Grupper" name="My Groups"/>
+ <menu_item_check label="Chat i nærheden" name="Nearby Chat"/>
+ <menu_item_call label="Personer tæt på" name="Active Speakers"/>
+ <menu_item_check label="Media i nærheden" name="Nearby Media"/>
</menu>
<menu label="Verden" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Løb" name="Always Run"/>
- <menu_item_check label="Flyv" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Opret landemærke her" name="Create Landmark Here"/>
- <menu_item_call label="Sæt hjem til her" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleporter hjem" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Sæt &apos;ikke til stede&apos;" name="Set Away"/>
- <menu_item_call label="Sæt &apos;optaget&apos;" name="Set Busy"/>
- <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Frigiv taster" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Konto historik..." name="Account History..."/>
- <menu_item_call label="Vedligehold konto..." name="Manage My Account..."/>
- <menu_item_call label="Køb L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mit land..." name="My Land..."/>
- <menu_item_call label="Om land..." name="About Land..."/>
- <menu_item_call label="Køb land..." name="Buy Land..."/>
- <menu_item_call label="Region/Estate..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Indstillinger for omgivelser" name="Environment Settings">
+ <menu_item_check label="Flyt" name="Movement Controls"/>
+ <menu_item_check label="Vis" name="Camera Controls"/>
+ <menu_item_call label="Om land" name="About Land"/>
+ <menu_item_call label="Region/Estate" name="Region/Estate"/>
+ <menu_item_call label="Køb land" name="Buy Land"/>
+ <menu_item_call label="Mit land" name="My Land"/>
+ <menu label="Vis" name="Land">
+ <menu_item_check label="Ban Lines" name="Ban Lines"/>
+ <menu_item_check label="Pejlelys" name="beacons"/>
+ <menu_item_check label="Parcel skel" name="Property Lines"/>
+ <menu_item_check label="Land-ejere" name="Land Owners"/>
+ </menu>
+ <menu label="Landemærker" name="Landmarks">
+ <menu_item_call label="Opret landemærke her" name="Create Landmark Here"/>
+ <menu_item_call label="Sæt hjem til her" name="Set Home to Here"/>
+ </menu>
+ <menu_item_call label="Hjem" name="Teleport Home"/>
+ <menu_item_check label="Mini-kort" name="Mini-Map"/>
+ <menu_item_check label="Verdenskort" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu label="Sol" name="Environment Settings">
<menu_item_call label="Solopgang" name="Sunrise"/>
<menu_item_call label="Middag" name="Noon"/>
<menu_item_call label="Solnedgang" name="Sunset"/>
<menu_item_call label="Midnat" name="Midnight"/>
- <menu_item_call label="Gendan til standard for region" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Benyt tid fra estate" name="Revert to Region Default"/>
<menu_item_call label="Redigering af omgivelser" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Funktioner" name="Tools">
- <menu label="Vælg værktøj" name="Select Tool">
- <menu_item_call label="Fokus" name="Focus"/>
- <menu_item_call label="Flyt" name="Move"/>
- <menu_item_call label="Rediger" name="Edit"/>
- <menu_item_call label="Byg" name="Create"/>
- <menu_item_call label="Land" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/>
- <menu_item_check label="Vælg kun flytbare objekter" name="Select Only Movable Objects"/>
- <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/>
- <menu_item_check label="Vis skjulte objekter" name="Show Hidden Selection"/>
- <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/>
- <menu_item_check label="Vis guidelys for valgte" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/>
- <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/>
- <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/>
- <menu_item_call label="Gitter indstillinger..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Rediger sammekædede objekter" name="Edit Linked Parts"/>
- <menu_item_call label="Sammenkæd" name="Link"/>
+ <menu label="Byg" name="BuildTools">
+ <menu_item_check label="Byg" name="Show Build Tools"/>
+ <menu label="Vælg byggerværktøj" name="Select Tool">
+ <menu_item_call label="Fokus værktøj" name="Focus"/>
+ <menu_item_call label="Flyt værktøj" name="Move"/>
+ <menu_item_call label="Redigeringsværktøj" name="Edit"/>
+ <menu_item_call label="Byg værktøj" name="Create"/>
+ <menu_item_call label="Land værktøj" name="Land"/>
+ </menu>
+ <menu label="Redigér" name="Edit">
+ <menu_item_call label="Fortryd" name="Undo"/>
+ <menu_item_call label="Gendan" name="Redo"/>
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Duplikér" name="Duplicate"/>
+ <menu_item_call label="Vælg alt" name="Select All"/>
+ <menu_item_call label="Fravælg" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Sammenkæde" name="Link"/>
<menu_item_call label="Adskil" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
<menu_item_call label="Fokusér på valgte" name="Focus on Selection"/>
- <menu_item_call label="Zoom på valgte" name="Zoom to Selection"/>
- <menu_item_call label="Køb objekt" name="Menu Object Take">
- <on_enable userdata="Køb,Tag" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Tag kopi" name="Take Copy"/>
- <menu_item_call label="Opdatér ændringer i indhold på objekt" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Vis vindue med advarsler/fejl fra scripts" name="Show Script Warning/Error Window"/>
- <menu label="Rekompilér scripts i valgte objekter" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Genstart scripts i valgte objekter" name="Reset Scripts in Selection"/>
- <menu_item_call label="Sæt scripts til &apos;Running&apos; i valgte objekter" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Sæt scripts til &apos; Not running&apos; i valgte objekter" name="Set Scripts to Not Running in Selection"/>
+ <menu_item_call label="Zoom til valgte" name="Zoom to Selection"/>
+ <menu label="Objekt" name="Object">
+ <menu_item_call label="Køb" name="Menu Object Take"/>
+ <menu_item_call label="Tag kopi" name="Take Copy"/>
+ <menu_item_call label="Opdatér ændringer til beholdning" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Opdater ændringer i indhold til objekt" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Rekompilér scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Genoversæt scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Genstart scripts" name="Reset Scripts"/>
+ <menu_item_call label="sæt scripts til &quot;Running&quot;" name="Set Scripts to Running"/>
+ <menu_item_call label="Sæt scripts til &quot;Not Running&quot;" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Valg" name="Options">
+ <menu_item_check label="Redigér sammenlænkede dele" name="Edit Linked Parts"/>
+ <menu_item_call label="Sæt standard rettigheder" name="perm prefs"/>
+ <menu_item_check label="Vis avancerede rettigheder" name="DebugPermissions"/>
+ <menu label="Selektion" name="Selection">
+ <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/>
+ <menu_item_check label="Vælg kun flytbare objekter" name="Select Only Movable Objects"/>
+ <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/>
+ </menu>
+ <menu label="Vis" name="Show">
+ <menu_item_check label="Vis skjult selektion" name="Show Hidden Selection"/>
+ <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Vis udvælgelses stråle" name="Show Selection Beam"/>
+ </menu>
+ <menu label="Gitter" name="Grid">
+ <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/>
+ <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/>
+ <menu_item_call label="Gitter valg" name="Grid Options"/>
+ </menu>
+ </menu>
+ <menu label="Vis lænkede dele" name="Select Linked Parts">
+ <menu_item_call label="Vælg næste del" name="Select Next Part"/>
+ <menu_item_call label="Vælg forrige del" name="Select Previous Part"/>
+ <menu_item_call label="Inkludér næste valg" name="Include Next Part"/>
+ <menu_item_call label="Inkludér forrige del" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Hjælp" name="Help">
- <menu_item_call label="[SECOND_LIFE] Hjælp" name="Second Life Help"/>
+ <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
<menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Officiel Linden Blog..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal om scripts..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Rapporter misbrug..." name="Report Abuse..."/>
- <menu_item_call label="Stød, skub &amp; slag..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Lag meter" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Fejlrapport" name="Bug Reporting">
- <menu_item_call label="[SECOND_LIFE] sagsstyring..." name="Public Issue Tracker..."/>
- <menu_item_call label="Hjælp til [SECOND_LIFE] sagsstyring..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Om fejlrapportering..." name="Bug Reporing 101..."/>
- <menu_item_call label="Anmeld sikkerhedshændelser..." name="Security Issues..."/>
- <menu_item_call label="QA Wiki..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Anmeld fejl..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Om [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Rapporter misbrug" name="Report Abuse"/>
+ <menu_item_call label="Rapportér fejl" name="Report Bug"/>
+ </menu>
+ <menu label="Avanceret" name="Advanced">
+ <menu_item_check label="Sæt til &quot;væk&quot; efter 30 minutter" name="Go Away/AFK When Idle"/>
+ <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Gendan teksturer" name="Rebake Texture"/>
+ <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
+ <menu_item_check label="Begræns valg afstand" name="Limit Select Distance"/>
+ <menu_item_check label="Fjern kamerabegrænsninger" name="Disable Camera Distance"/>
+ <menu_item_check label="Højopløsningsfoto" name="HighResSnapshot"/>
+ <menu_item_check label="Lydløse foto&apos;s til disk" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Komprimér fotos til disk" name="CompressSnapshotsToDisk"/>
+ <menu label="Værktøjer til ydelse" name="Performance Tools">
+ <menu_item_call label="Lag meter" name="Lag Meter"/>
+ <menu_item_check label="Statistik bjælke" name="Statistics Bar"/>
+ <menu_item_check label="Vis avatarers gengivelsesbelastning" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Fremhævninger og and sigtbarhed" name="Highlighting and Visibility">
+ <menu_item_check label="Pejlelys blink effekt" name="Cheesy Beacon"/>
+ <menu_item_check label="Skjul partikler" name="Hide Particles"/>
+ <menu_item_check label="Skjul valgte" name="Hide Selected"/>
+ <menu_item_check label="Fremhæv gennemsigtigt" name="Highlight Transparent"/>
+ <menu_item_check label="Vis HUD vedhæftninger" name="Show HUD Attachments"/>
+ <menu_item_check label="Vis muse-sigte" name="ShowCrosshairs"/>
+ <menu_item_check label="Vis tips om land" name="Land Tips"/>
+ </menu>
+ <menu label="Gengivelsestyper" name="Rendering Types">
+ <menu_item_check label="Simpel" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Træer" name="Tree"/>
+ <menu_item_check label="Avatarer" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Himmel" name="Sky"/>
+ <menu_item_check label="Vand" name="Water"/>
+ <menu_item_check label="Jord" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Græs" name="Grass"/>
+ <menu_item_check label="Skyer" name="Clouds"/>
+ <menu_item_check label="Partikler" name="Particles"/>
+ <menu_item_check label="Bump" name="Bump"/>
+ </menu>
+ <menu label="Gengivelsesegenskaber" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Valgte" name="Selected"/>
+ <menu_item_check label="Fremhævede" name="Highlighted"/>
+ <menu_item_check label="Dynamiske teksturer" name="Dynamic Textures"/>
+ <menu_item_check label="Fod skygger" name="Foot Shadows"/>
+ <menu_item_check label="TÃ¥ge" name="Fog"/>
+ <menu_item_check label="Fleksible objekter" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Kør flere tråde" name="Run Multiple Threads"/>
+ <menu_item_call label="Tøm gruppe cache" name="ClearGroupCache"/>
+ <menu_item_check label="Muse udjævning" name="Mouse Smoothing"/>
+ <menu_item_check label="Vis IM&apos;s i lokal chat" name="IMInChat"/>
+ <menu label="Shortcuts" name="Shortcuts">
+ <menu_item_check label="Søg" name="Search"/>
+ <menu_item_call label="Frigør taster" name="Release Keys"/>
+ <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
+ <menu_item_check label="Løb altid" name="Always Run"/>
+ <menu_item_check label="Flyv" name="Fly"/>
+ <menu_item_call label="Luk vindue" name="Close Window"/>
+ <menu_item_call label="Luk alle vinduer" name="Close All Windows"/>
+ <menu_item_call label="Foto til disk" name="Snapshot to Disk"/>
+ <menu_item_call label="Første person" name="Mouselook"/>
+ <menu_item_check label="&quot;Joystick Flycam&quot;" name="Joystick Flycam"/>
+ <menu_item_call label="Nulstil udsyn" name="Reset View"/>
+ <menu_item_call label="Se på den sidste der chattede" name="Look at Last Chatter"/>
+ <menu label="Vælg byggeværktøj" name="Select Tool">
+ <menu_item_call label="Fokuseringsværktøj" name="Focus"/>
+ <menu_item_call label="Flyt værktøj" name="Move"/>
+ <menu_item_call label="Redigeringsværktøj" name="Edit"/>
+ <menu_item_call label="Opret værktøj" name="Create"/>
+ <menu_item_call label="Land værktøj" name="Land"/>
+ </menu>
+ <menu_item_call label="Zoom ind" name="Zoom In"/>
+ <menu_item_call label="Zoom standard" name="Zoom Default"/>
+ <menu_item_call label="Zoom ud" name="Zoom Out"/>
+ <menu_item_call label="Skift fuld-skærm" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Vis debug valg" name="Debug Settings"/>
+ <menu_item_check label="Vis udviklingsmenu" name="Debug Mode"/>
+ </menu>
+ <menu label="Udvikling" name="Develop">
+ <menu label="Konsoller" name="Consoles">
+ <menu_item_check label="Tekstur konsol" name="Texture Console"/>
+ <menu_item_check label="Debug konsol" name="Debug Console"/>
+ <menu_item_call label="Konsol med notifikationer" name="Notifications"/>
+ <menu_item_check label="Tekstur størrelse konsol" name="Texture Size"/>
+ <menu_item_check label="Konsol med tekstur kategorier" name="Texture Category"/>
+ <menu_item_check label="Hurtig-timere" name="Fast Timers"/>
+ <menu_item_check label="Hukommelse" name="Memory"/>
+ <menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/>
+ <menu_item_check label="Kamera" name="Camera"/>
+ <menu_item_check label="Vind" name="Wind"/>
+ </menu>
+ <menu label="Vis info" name="Display Info">
+ <menu_item_check label="Vis tid" name="Show Time"/>
+ <menu_item_check label="Vis gengivelses information" name="Show Render Info"/>
+ <menu_item_check label="Vis farve under cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Vis opdateringer på objekter" name="Show Updates"/>
+ </menu>
+ <menu label="Fremtving en fejl" name="Force Errors">
+ <menu_item_call label="Sæt breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Gennemtving LLError og crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Fremtving &quot;Bad Memory Access&quot;" name="Force Bad Memory Access"/>
+ <menu_item_call label="Fremtving en uendelig løkke" name="Force Infinite Loop"/>
+ <menu_item_call label="Gennemtving drivernedbrud" name="Force Driver Carsh"/>
+ <menu_item_call label="Gennemtving software &quot;exception&quot;" name="Force Software Exception"/>
+ <menu_item_call label="Fremtving mistet forbindelse" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulér et memory leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Gengivelses tests" name="Render Tests">
+ <menu_item_check label="Kamera offset" name="Camera Offset"/>
+ <menu_item_check label="Tilfældige framerates" name="Randomize Framerate"/>
+ <menu_item_check label="Frame test" name="Frame Test"/>
+ </menu>
+ <menu label="Gengivelse" name="Rendering">
+ <menu_item_check label="Akser" name="Axes"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Global oplysning" name="Global Illumination"/>
+ <menu_item_check label="Animationsteksturer" name="Animation Textures"/>
+ <menu_item_check label="Slå teksturer fra" name="Disable Textures"/>
+ <menu_item_check label="Gengiv vedhæftede lys" name="Render Attached Lights"/>
+ <menu_item_check label="Gengiv vedhæftede partikler" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Netværk" name="Network">
+ <menu_item_check label="Pause avatar" name="AgentPause"/>
+ <menu_item_call label="Mist en netværkspakke" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Stød, skub &amp; slag" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Verden" name="World">
+ <menu_item_check label="Vælg anden sol end region" name="Sim Sun Override"/>
+ <menu_item_check label="Pejlelys blink effekt" name="Cheesy Beacon"/>
+ <menu_item_check label="Fast vejr" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI (brugerflade)" name="UI">
+ <menu_item_call label="Test web browser" name="Web Browser Test"/>
+ <menu_item_call label="Print info om valgt objekt" name="Print Selected Object Info"/>
+ <menu_item_call label="Hukommelse statistik" name="Memory Stats"/>
+ <menu_item_check label="Dobbelt-klik auto-pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug klik" name="Debug Clicks"/>
+ <menu_item_check label="Debug muse-hændelser" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Genindlæs farveopsætning" name="Reload Color Settings"/>
+ <menu_item_call label="Vis font test" name="Show Font Test"/>
+ <menu_item_call label="Hent fra XML" name="Load from XML"/>
+ <menu_item_call label="Gem til XML" name="Save to XML"/>
+ <menu_item_check label="Vis XUI navne" name="Show XUI Names"/>
+ <menu_item_call label="Send testbeskeder (IM)" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Hovede" name="Head"/>
+ <menu_item_call label="Overkrop" name="Upper Body"/>
+ <menu_item_call label="Underkrop" name="Lower Body"/>
+ <menu_item_call label="Nederdel" name="Skirt"/>
+ </menu>
+ <menu label="Avatar tests" name="Character Tests">
+ <menu_item_call label="Skift avatar geometri" name="Toggle Character Geometry"/>
+ <menu_item_check label="Tillad at udvælge avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Tving værdier til standard" name="Force Params to Default"/>
+ <menu_item_check label="Animationsinfo" name="Animation Info"/>
+ <menu_item_check label="Slow motion animationer" name="Slow Motion Animations"/>
+ <menu_item_check label="Slå &quot;Level Of Detail&quot; fra" name="Disable LOD"/>
+ <menu_item_check label="Vis kollision skelet" name="Show Collision Skeleton"/>
+ <menu_item_check label="Vis avatar center" name="Display Agent Target"/>
+ <menu_item_call label="Debug avatar teksturer" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="HTTP teksturer" name="HTTP Textures"/>
+ <menu_item_check label="Benyt consol vindue ved næste opstart" name="Console Window"/>
+ <menu_item_check label="Vis administrationsmenu" name="View Admin Options"/>
+ <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
+ <menu_item_call label="Forlad administrationsstatus" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Administrér" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Tag kopi" name="Take Copy"/>
+ <menu_item_call label="Gennemtving ejer til mig" name="Force Owner To Me"/>
+ <menu_item_call label="Gennemtving ejer tolerance" name="Force Owner Permissive"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="LÃ¥s" name="Lock"/>
+ </menu>
+ <menu label="Parcel" name="Parcel">
+ <menu_item_call label="Sæt ejer til &quot;mig&quot;" name="Owner To Me"/>
+ <menu_item_call label="Sat til Linden indhold" name="Set to Linden Content"/>
+ <menu_item_call label="Kræv offentligt land" name="Claim Public Land"/>
+ </menu>
+ <menu label="Region" name="Region">
+ <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Gem regions &quot;State&quot;" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="&quot;God Tools&quot;" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/da/mime_types_linux.xml b/indra/newview/skins/default/xui/da/mime_types_linux.xml
new file mode 100644
index 0000000000..69a0fb23f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web indhold
+ </label>
+ <tooltip name="web_tooltip">
+ Dette sted har ikke noget web indhold
+ </tooltip>
+ <playtip name="web_playtip">
+ Vis web indhold
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Der er en film der kan afspilles her
+ </tooltip>
+ <playtip name="movie_playtip">
+ Afspil film
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Billede
+ </label>
+ <tooltip name="image_tooltip">
+ Der er et billede på dette sted
+ </tooltip>
+ <playtip name="image_playtip">
+ Vis stedets billede
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Lyd
+ </label>
+ <tooltip name="audio_tooltip">
+ Der er lyd på dette sted
+ </tooltip>
+ <playtip name="audio_playtip">
+ Afspil lyden for dette sted
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Realtids streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ingen -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ingen -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Lyd
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Billede
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Lyd/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Hjemmeside (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Lyd (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Lyd (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Lyd (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Lyd (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Billede (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Billede (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Billede (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Billede (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Billede (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Billede (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Hjemmeside
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Tekst
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/da/mime_types_mac.xml b/indra/newview/skins/default/xui/da/mime_types_mac.xml
new file mode 100644
index 0000000000..bd9981b045
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web indhold
+ </label>
+ <tooltip name="web_tooltip">
+ Dette sted har web-indhold
+ </tooltip>
+ <playtip name="web_playtip">
+ Vis web-indhold
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Der kan ses en film her
+ </tooltip>
+ <playtip name="movie_playtip">
+ Afspil film
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Billede
+ </label>
+ <tooltip name="image_tooltip">
+ Dette sted har et billede
+ </tooltip>
+ <playtip name="image_playtip">
+ Vis dette steds billede
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Lyd
+ </label>
+ <tooltip name="audio_tooltip">
+ Dette sted har lyd
+ </tooltip>
+ <playtip name="audio_playtip">
+ Afdspil dette steds lyd
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ingen -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ingen -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Lyd
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Billede
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web side (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Lyd (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Lyd (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Lyd (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Lyd (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Billede (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Billede (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Billede (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Billede (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Billede (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Billede (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web side
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Tekst
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 42f55d4678..42eac1be7a 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -9,74 +9,33 @@
<global name="implicitclosebutton">
Luk
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Ukendt advarsels-besked" name="MissingAlert">
- Din version af [APP_NAME] kan ikke vise den advarselsbesked den modtog.
+ <template name="okbutton">
+ <form>
+ <button name="OK" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore"/>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="Cancel" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore"/>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Ukendt notificeringsbesked" name="MissingAlert">
+ Din version af [APP_NAME] kan ikke vise den besked den lige modtog. Undersøg venligst at du har den nyester version af klienten installeret.
-Fejl detaljer: Advarslen &apos;[_NAME]&apos; blev ikke fundet i notifications.xml.
+Fejl detaljer: Beskeden kaldet &apos;[_NAME]&apos; blev ikke fundet i notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,24 +56,18 @@ Fejl detaljer: Advarslen &apos;[_NAME]&apos; blev ikke fundet i notifications.xm
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ja"/>
</notification>
<notification name="BadInstallation">
- Der opstod en fejl ved opdatering af [APP_NAME]. Hent venligst den nyeste version fra secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Der opstod en fejl ved opdatering af [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Netværksfejl: Kunne ikke oprette forbindelse.
+ Kunne ikke oprette forbindelse til [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Check venligst din netværksforbindelse.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Make sure your Internet connection is working properly.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
Besked template [PATH] kunne ikke findes.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
Gem ændringer til nuværende tøj/krops del?
@@ -177,7 +130,7 @@ Vælg kun en genstand, og prøv igen.
Medlemmer ikke kan fjernes fra denne rolle.
Medlemmerne skal fratræde sin rolle selv.
Er du sikker på du vil fortsætte?
- <usetemplate ignoretext="Når du tilføjer medlemmer til ejer rollen" name="okcancelignore" notext="Nej" yestext="Ja"/>
+ <usetemplate ignoretext="Bekræft, før jeg tilføjer en ny gruppe ejer" name="okcancelignore" notext="Nej" yestext="Ja"/>
</notification>
<notification name="AssignDangerousActionWarning">
Du er ved at tilføje muligheden for &apos;[ACTION_NAME]&apos; til
@@ -189,47 +142,31 @@ Ethvert medlem i en rolle med denne evne kan tildele sig selv -- og et andet med
Add this Ability to &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
- <notification name="ClickSoundHelpLand">
- Media og musik kan kun ses og høres indenfor parcellen. Lyd og stemme valg muligheder kan begrænses til parcellen eller de kan høres af beboere udenfor parcellen, afhængigt af deres indholdsrating. Gå til &apos;Knowledge Base&apos; for at lære hvordan disse valg opsættes.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="GÃ¥ til &apos;Knowledge Base&apos;"
- notext="Luk" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Søgeresultater er organiseret baseret på den fane du står på, din indholdsrating, den valgte kategori og andre faktorer. for yderligere detaljer se i &apos;Knowledge Base&apos;.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="GÃ¥ til &apos;Knowledge Base&apos;"
- notext="Luk" />
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Hvis du vælger &quot;Vis i Søgning&quot; Vises:
-- Din profil i søgeresultater
-- Et link til din profile i de offentlige gruppe sider
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Dinne standard rettigheder virker muligvis ikke i ældre regioner.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Hvis en beboer har en hjemmeside adresse kan du:
- * Klikke &apos;Load&apos; for at side deres side her.
- * Klikke Load &gt; &apos;I ekstern browser&apos; for at se siden i din standard browser.
- * Klikke Load &gt; &apos;Hjemme URL&apos; for at returnere til denne beboers side hvis du har navigeret væk.
-
-Når du ser din egen profil, kan du skrive hvilken som helst adresse og klikke ok for at få den vist i din egen profil.
-Andre beboere kan besøge den adresse du har sat, når de besøger din profil.
+ <notification name="ClickUnimplemented">
+ Beklager, ikke implementeret endnu.
</notification>
<notification name="JoinGroupCannotAfford">
Tilmelding til denne gruppe koster L$[COST].
Du har ikke nok L$ til denne tilmelding.
</notification>
+ <notification name="CreateGroupCost">
+ Oprettelse af denne gruppe vil koste L$100.
+Grupper skal have mindst 2 medlemmer, ellers slettes de for altid.
+Invitér venligst medlemmer indenfor 48 timer.
+ <usetemplate canceltext="Annullér" name="okcancelbuttons" notext="Annullér" yestext="Oprete en gruppe for L$100"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ADVARSEL: Ved at vælge &apos;sælg til enhver&apos; bliver til land tilgængeligt for alle i hele [SECOND_LIFE], også de som ikke er i denne region.
+
+Det valgte antal [LAND_SIZE] m² land bliver sat til salg.
+Salgprisen vil være [SALE_PRICE]L$ og vil være til salg til [NAME].
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Flere overflader er valgt for øjeblikket.
+Hvis du fortsætter med denne aktion, vil flere instanser af media blive vist på overfladerne på objektet.
+Hvis media kun skal vises på en overflade, vælg &apos;Vælg overflade&apos; og klik på den relevante overflade og klik på tilføj.
+ <usetemplate ignoretext="Media vil blive sat på flere valgte overflader" name="okcancelignore" notext="Annullér" yestext="OK"/>
+ </notification>
<notification name="PromptMissingSubjMsg">
E-mail dette billede med standard emne eller besked?
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
@@ -237,6 +174,10 @@ Du har ikke nok L$ til denne tilmelding.
<notification name="ErrorUploadingPostcard">
Der var et problem med at sende billedet på grund af følgende: [REASON]
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Kunne ikke vedhæfte objekt.
+Overskrider vedhæftnings begrænsning på [MAX_ATTACHMENTS] objekter. Tag venligst en anden vedhæftning af først.
+ </notification>
<notification name="MustHaveAccountToLogIn">
Ups! Noget var tomt.
Du skal skrive både fornavn og efternavn på din figur.
@@ -244,6 +185,18 @@ Du skal skrive både fornavn og efternavn på din figur.
Du har brug for en konto for at logge ind i [SECOND_LIFE]. Vil du oprette en nu?
<usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/>
</notification>
+ <notification name="AddClassified">
+ Annoncer vil vises i &apos;Annoncer&apos; sektionen i søge biblioteket og på [http://secondlife.com/community/classifieds secondlife.com] i en uge.
+Udfyld din annonce og klik på &apos;Udgiv...&apos; for at tilf&apos;je den til biblioteket.
+Du vil blive spurgt om en pris når du klikker på &apos;Udgiv&apos;.
+Jo mere du betaler, jo højere oppe på listen vises annoncen, og den vil også optræde højere oppe når personer søger.
+ <usetemplate ignoretext="Hvordan man opretter en annonce" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Du har valgt at slette media tilknyttet denne overflade.
+Er du sikker på at du vil fortsætte?
+ <usetemplate ignoretext="Bekræft før jeg slette media i et objekt" name="okcancelignore" notext="Nej" yestext="Ja"/>
+ </notification>
<notification name="ResetShowNextTimeDialogs">
Vil du gerne genaktivere alle disse popups, som du tidligere har bedt om ikke at få vist?
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
@@ -252,86 +205,144 @@ Du har brug for en konto for at logge ind i [SECOND_LIFE]. Vil du oprette en nu?
Vil du deaktivere alle popups som kan undværes?
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
</notification>
+ <notification name="CacheWillClear">
+ Cache vil blive tømt ved næste genstart af [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Cache vil blive flyttet ved næste genstart af [APP_NAME].
+Note: This will clear the cache.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port ændringer vil blive effektueret ved næste genstart af [APP_NAME].
+ </notification>
<notification name="ChangeSkin">
- Det nye udseende vil vises efter du har genstartet [APP_NAME].
+ Den nye hud vil blive vist ved næste genstart af [APP_NAME].
+ </notification>
+ <notification name="StartRegionEmpty">
+ Ups, din start region er ikke angivet.
+Indtast venligst navn på region i Start lokation feltet eller vælg &quot;Min sidste lokation&quot; eller &quot;Hjem&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="UnsupportedHardware">
+ <usetemplate ignoretext="Din computer hardware understøttes ikke" name="okcancelignore" notext="No" yestext="Yes"/>
</notification>
- <notification name="UnsupportedHardware"/>
<notification name="UnknownGPU">
+ Dit system har et grafikkort som er ukendt for [APP_NAME] lige nu.
+Dette er tilfældet med nyt hardware som endnu ikke er blevet testet med [APP_NAME]. [APP_NAME] vil sandsynligvis kunne køre normalt, men det kan være nødvendigt at justere opsætningen af grafik.
+(Mig &gt; Indstillinger &gt; Grafik).
<form name="form">
- <ignore name="ignore" text="Ved opdagelse af et ukendt grafikkort"/>
+ <ignore name="ignore" text="Dit grafikkort kunne ikke identificeres"/>
</form>
</notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] gik ned ved inititalisering af grafik drivere.
+Grafik kvaliteten sættes til &apos;lav&apos; for at undgå typiske problemer med drivere. Dette vil slå visse grafik funktioner fra.
+Vi anbefaler at opdatere driverne til dit grafikkort.
+Grafik kvaliteten kan forbedres i indstillinger &gt; Grafik.
+ </notification>
+ <notification name="CannotGiveCategory">
+ Du har ikke tilladelse til at videreføre den valgte mappe.
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Du har smidt [AVATAR_NAME] ud af gruppen [GROUP_NAME]
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
- <notification name="invalid_tport">
-Der er problemer med at håndtere din teleport. Det kan være nødvendigt at logge ud og ind for at kunne skifte teleportere.
-Hvis du bliver ved med at have problemet kan du checke teknisk support på:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Problem registreret i forbindelse med skift til ny region. Det kan være nødvendigt at logge ud og ind for at kunne skifte regioner.
-Hvis du bliver ved med at have problemet kan du checke teknisk support på:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Beklager, teleport er blokeret lige nu. Prøv igen senere.
+Gå til [_URL] for information om køb af L$?
+ </notification>
+ <notification name="CannotEncodeFile">
+ Kunne ikke &apos;forstå&apos; filen: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] understøtter p.t. ikke at send flere animationsfiler ad gangen.
+ </notification>
+ <notification name="LandmarkCreated">
+ Du har tilføjet &quot;[LANDMARK_NAME]&quot; til din [FOLDER_NAME] mappe.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Ikke muligt at åbne script i objekt uden &apos;Redigére&apos; rettigheder.
+ </notification>
+ <notification name="invalid_tport">
+ Der opstod et problem ved din teleport. Det kan være nødvendigt at logge ind igen, før du kan teleporte.
+Hvis du bliver ved med at få denne fejl, check venligst [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Der opstod et problem ved skift til ny region. Det kan være nødvendigt at logge ind igen, før du kan skifte til andre regioner.
+Hvis du bliver ved med at få denne fejl, check venligst [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Beklager, teleport er blokeret lige nu. Prøv igen senere.
Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for at løse dette problem.
- </notification>
- <notification name="nolandmark_tport">
-Beklager, systemet kunne ikke finde landmærke destinationen.
- </notification>
- <notification name="timeout_tport">
-Beklager, systemet kunne ikke fuldføre teleport forbindelse.
+ </notification>
+ <notification name="nolandmark_tport">
+ Beklager, systemet kunne ikke finde landmærke destinationen.
+ </notification>
+ <notification name="timeout_tport">
+ Beklager, systemet kunne ikke fuldføre teleport forbindelse.
Prøv igen om lidt.
- </notification>
- <notification name="noaccess_tport">
-Beklager, du har ikke adgang til denne teleport destination.
- </notification>
- <notification name="missing_attach_tport">
-Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen.
- </notification>
- <notification name="too_many_uploads_tport">
-Tekniske problemer hindrer at din teleport kan gennemføres.
+ </notification>
+ <notification name="noaccess_tport">
+ Beklager, du har ikke adgang til denne teleport destination.
+ </notification>
+ <notification name="missing_attach_tport">
+ Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Tekniske problemer hindrer at din teleport kan gennemføres.
Prøv venligst igen om lidt eller vælg et mindre travlt område.
- </notification>
- <notification name="expired_tport">
-Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt.
- </notification>
- <notification name="expired_region_handoff">
-Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt.
- </notification>
- <notification name="no_host">
-Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere.
+ </notification>
+ <notification name="expired_tport">
+ Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt.
+ </notification>
+ <notification name="expired_region_handoff">
+ Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt.
+ </notification>
+ <notification name="no_host">
+ Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere.
Prøv evt. igen om lidt.
- </notification>
- <notification name="no_inventory_host">
-Beholdningssystemet er ikke tilgængelig lige nu.
- </notification>
-
- <notification name="CannotGiveCategory">
- Du har ikke tilladelse til at videreføre den valgte mappe.
</notification>
- <notification name="CannotEncodeFile">
- Kunne ikke &apos;forstå&apos; filen: [FILE]
+ <notification name="no_inventory_host">
+ Beholdningssystemet er ikke tilgængelig lige nu.
</notification>
<notification name="CannotBuyLandNoRegion">
Ikke i stand til at købe land:
Kan ikke finde region som dette land er i.
</notification>
- <notification name="ShowOwnersHelp">
- Vis ejere:
-Farver på parceller viser ejer-type.
+ <notification name="CannotCloseFloaterBuyLand">
+ Du kan ikke lukke &apos;Køb land&apos; vinduet før [APP_NAME] har vurderet en pris på denne transaktion.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Land kunne ikke dedikeres:
+Kunne ikke finde den region land ligger i.
+ </notification>
+ <notification name="ParcelCanPlayMedia">
+ Dette sted kan afspille &apos;streaming media&apos;.
+&apos;Streaming media&apos; kræver en hurtig internet opkobling.
-Grøn = Dit land
-Turkis = Din gruppes land
-Rød = Ejet af andre
-Gul = Til salg
-Lilla = PÃ¥ auktion
-Grå = Offentligt ejet
+Afspil altid &apos;streaming media&apos; når det er tilgængeligt?
+(Du kan ændre dette valg senere under Indstillinger &gt; Privatliv.)
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Kunne ikke efterlade land:
+Kan ikke finde den region landet ligger i.
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Kunne ikke opdele land:
+Kan ikke finde den region landet ligger i.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Kunne ikke opdele land:
+Kan ikke finde den region landet ligger i.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Kunne ikke gemme [NAME] i den centrale database.
+Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minutter.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Du er blevet logget ud af [SECOND_LIFE]:
+ Du er blevet logget af [SECOND_LIFE]:
[MESSAGE]
-Du kan stadig se eksiterende PB&apos;er og chat ved at klikke&apos;Se PB &amp; Chat&apos;. Ellers, klik &apos;Afslut&apos; for at afslutte [APP_NAME] nu.
+Du kan stadig se igangværende samtaler (IM) og chat ved at klikke på &apos;Se IM &amp; chat. Ellers klik på &apos;Afslut&apos; for at lukke [APP_NAME] med det samme.
<usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB &amp; Chat"/>
</notification>
<notification label="Tilføj ven" name="AddFriend">
@@ -354,15 +365,156 @@ Tilbyd venskab til [NAME]?
<button name="Cancel" text="Annullér"/>
</form>
</notification>
+ <notification name="AvatarMovedDesired">
+ Den ønskede lokation er ikke tilgængelig lige nu.
+Du er blevet flyttet til en region in nærheden.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Din sidste lokation er ikke tilgængelig for øjeblikket.
+Du er blevet flyttet til en region in nærheden.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Din hjemme lokation er ikke tilgængelig for øjeblikket.
+Du er blevet flyttet til en region in nærheden.
+Du kan måske ønske at sætte en ny hjemme lokation.
+ </notification>
+ <notification name="ClothingLoading">
+ Dit tøj hentes stadig ned.
+Du kan bruge [SECOND_LIFE] normalt og andre personer vil se dig korrekt.
+ <form name="form">
+ <ignore name="ignore" text="Det tager lang tid at hente tøj"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] installationen er færdig.
+
+Hvis det er første gang du bruger [SECOND_LIFE], skal du først oprette en konto for at logge på.
+Vend tilbage til [http://join.secondlife.com secondlife.com] for at oprette en ny konto?
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Der er problemer med at koble på. Der kan være et problem med din Internet forbindelse eller [SECOND_LIFE_GRID].
+
+Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke på Hjælp for at se [SUPPORT_SITE] siden, eller klikke på Teleport for at forsøge at teleportere hjem.
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] L$ [PRICE] Du har ikke nok L$ til dette.
</notification>
+ <notification name="GrantedModifyRights">
+ [NAME] har givet dig rettighed til at redigere sine objekter.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Dinne rettigheder til at redigere objekter ejet af [NAME] er fjernet
+ </notification>
<notification name="BuyOneObjectOnly">
Ikke muligt at købe mere end et objekt ad gangen. Vælg kun ét objekt og prøv igen.
</notification>
+ <notification name="DownloadWindowsMandatory">
+ En ny version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Du skal hente denne version for at bruge [APP_NAME].
+ </notification>
+ <notification name="DownloadWindows">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ En ny version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Du skal hente denne version for at kunne benytte [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Hent"/>
+ </notification>
+ <notification name="DownloadLinux">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+ <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+ <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ En ny version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Du skal hente denne opdatering for at bruge [APP_NAME].
+
+Download til dit Program bibliotek?
+ </notification>
+ <notification name="DownloadMac">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+
+Download til dit Program bibliotek?
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ En opdateret version af [APP_NAME] er tilgængelig.
+[MESSAGE]
+Denne opdatering er ikke påkrævet, men det anbefales at installere den for at opnå øget hastighed og forbedret stabilitet.
+
+Download til dit Program bibliotek?
+ </notification>
+ <notification name="DeedObjectToGroup">
+ <usetemplate ignoretext="Bekræft før jeg dedikerer et objekt til en gruppe" name="okcancelignore" notext="Cancel" yestext="Deed"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Ønsker du at åbne din web browser for at se dette indhold?
+ <usetemplate ignoretext="Start min browser for at se hjemmesider" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ GÃ¥ til [http://secondlife.com/account/ Dashboard] for at administrere din konto?
+ <usetemplate ignoretext="Start min browser for at administrere min konto" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ <usetemplate ignoretext="Start min browser for at lære hvordan man rapporterer sikkerhedsproblemer" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ <usetemplate ignoretext="Start min browser for at se QA Wiki" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ <usetemplate ignoretext="Start min browser for at bruge det Linden Labs sagsstyring" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ <usetemplate ignoretext="Start min browser for at se bloggen" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Ønsker du at åbne &apos;Scripting Guide&apos; for hjælp til scripting?
+ <usetemplate ignoretext="Start min browser for at se Scripting Guide" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Ønsker du at besøge LSL portalen for hjælp til scripting?
+ <usetemplate ignoretext="Start min browser for at besøge LSL Portalen" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ <usetemplate ignoretext="Bekræft før objekter returneres til deres ejere" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="MuteLinden">
+ Beklager, men du kan ikke blokere en Linden.
+ </notification>
<notification name="CannotStartAuctionAlreadyForSale">
Du kan ikke starte en auktion på en parcel som allerede er sat til salg. Fjern &apos;til salg&apos; muligheden hvis du ønsker at starte en auktion.
</notification>
+ <notification label="Blokering af objekt via navn mislykkedes" name="MuteByNameFailed">
+ Du har allerede blokeret dette navn.
+ </notification>
+ <notification name="BusyModeSet">
+ Sat til &apos;optaget&apos;.
+Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &apos;optaget&apos; besked. Alle teleport invitationer vil blive afvist. Alle objekter sendt til dig vil ende i papirkurven.
+ <usetemplate ignoretext="Jeg skrifter min status til &apos;optaget" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Du har nået det maksimale antal grupper. Du skal forlade en anden gruppe for at kunne være med i denne - eller afvis tilbudet.
+[NAME] har inviteret dig til at være medlem af en gruppe.
+[INVITE]
+ </notification>
<notification name="OfferTeleport">
<form name="form">
<input name="message">
@@ -372,13 +524,22 @@ Tilbyd venskab til [NAME]?
<button name="Cancel" text="Annullér"/>
</form>
</notification>
+ <notification name="TeleportFromLandmark">
+ <usetemplate ignoretext="Bekræft at jeg vil teleportere til et landemærke" name="okcancelignore" notext="Cancel" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleport til [PICK]?
+ <usetemplate ignoretext="Bekræft at jeg ønsker at teleportere til et sted i favoritter" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleport til [CLASSIFIED]?
+ <usetemplate ignoretext="Bekræft at du ønsker at teleportere til lokation in annoncer" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
+ </notification>
<notification name="RegionEntryAccessBlocked">
Du har ikke adgang til denne region på grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder.
Undersøg venligst om du har installeret den nyeste [APP_NAME] klient, og gå til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Du har ikke adgang til denne region på grund af din valgte indholdsrating.
@@ -387,36 +548,26 @@ GÃ¥ til &apos;Knowledge Base&apos; for mere information om indholdsratings.
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="GÃ¥ til &apos;Knowledge Base&apos;"
- notext="Luk"
- ignoretext="Når regionen er blokeret på grund af indholdsrating"/>
+ <usetemplate ignoretext="Ikke adgang til denne region på grund af begrænsninger i min indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Du har ikke adgang til denne region på grund af din valgte indholdsrating.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Du har ikke adgang til denne region på grund af din nuværende indholdsrating opsætning.
+ Du har ikke adgang til denne region på grund af din indholdsrating præferencer.
-Du kan vælge &apos;Indstillinger&apos; for at hæve din indholdsrating nu og dermed få adgang. Du vil så få mulighed for at søge og få adgang til områder med indhold af typen [REGIONMATURITY]. Hvis du senere ønsker at skifte tilbage, kan du skifte tilbage i &apos;Indstillinger&apos;.
- <form name="form">
- <button
- name="OK"
- text="Ændre præferencer"/>
- <button
- name="Cancel"
- text="Luk"/>
- <ignore name="ignore" text="Når regionen er blokeret på grund af indholdsrating"/>
- </form>
+Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
+ <form name="form">
+ <button name="OK" text="Ændre indstillinger"/>
+ <button name="Cancel" text="Luk"/>
+ <ignore name="ignore" text="Din valgte indholdsrating forhindrer dig i at kommer til en region"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder.
Undersøg om du har den nyeste [APP_NAME] klient og gå venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstilling..
@@ -425,32 +576,22 @@ GÃ¥ venligst til &apos;Knowledge Base&apos; for yderligere information om indhol
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="GÃ¥ til &apos;Knowledge Base&apos;"
- notext="Luk"
- ignoretext="Når land ikke kan kræves på grund af indholdsrating"/>
+ <usetemplate ignoretext="Du kan ikke kræve dette land, på grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Du kan ikke kræve dette land på grund af din indholdsrating.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstilling..
+ Du kan ikke kræve dette land, på grund af begrænsninger i din opsætning af indholdsrating.
-Du kan vælge &apos;Indstillinger&apos; for at hæve din indholdsrating nu og dermed få adgang. Du vil så få mulighed for at søge og få adgang til områder med indhold af typen [REGIONMATURITY]. Hvis du senere ønsker at skifte tilbage, kan du skifte tilbage i &apos;Indstillinger&apos;.
- <usetemplate
- name="okcancelignore"
- yestext="Ændre præferencer"
- notext="Luk"
- ignoretext="Når land ikke kan kræves på grund af indholdsrating"/>
+Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
+ <usetemplate ignoretext="Din valgte indholdsrating forhindrer dig i at kræve land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/>
</notification>
<notification name="LandBuyAccessBlocked">
Du kan ikke købe dette land på grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder.
Undersøg om du har den nyeste [APP_NAME] klient og gå venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang til områder med denne indholdsrating.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
Du kan ikke købe dette land på grund af din nuværende indholdsrating.
@@ -459,24 +600,19 @@ GÃ¥ til &apos;Knowledge Base&apos; for yderligere detaljer om indholdsrating.
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="GÃ¥ til &apos;Knowledge Base&apos;"
- notext="Luk"
- ignoretext="Når land ikke kan købes på grund af indholdsrating"/>
+ <usetemplate ignoretext="Du kan ikke købe dette land, på grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="Gå til &apos;Knowledge Base&apos;"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Du kan ikke købe dette land på grund af din nuværende indholdsrating indstilling.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- Du kan ikke købe dette land på grund af din valgte inholdsrating.
+ Du kan ikke købe dette land, på grund af begrænsninger i din opsætning af indholdsrating.
-Du kan vælge &apos;Indstillinger&apos; for at hæve din indholdsrating nu og dermed få adgang. Du vil så få mulighed for at søge og få adgang til områder med indhold af typen [REGIONMATURITY]. Hvis du senere ønsker at skifte tilbage, kan du skifte tilbage i &apos;Indstillinger&apos;.
- <usetemplate
- name="okcancelignore"
- yestext="Ændre præferencer"
- notext="Luk"
- ignoretext="Når land ikke kan købes på grund af indholdsrating"/>
+Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
+ <usetemplate ignoretext="Din valgte rating forhindrer dig i at købe land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Der er valgt for mange prims. Vælg venligst [MAX_PRIM_COUNT] eller færre og prøv igen
</notification>
<notification name="UnableToLoadNotecardAsset">
Kunne ikke hente notecard indhold.
@@ -484,53 +620,92 @@ Du kan vælge &apos;Indstillinger&apos; for at hæve din indholdsrating nu og de
</notification>
<notification name="SetClassifiedMature">
Indeholder denne annonce &apos;Mature&apos; indhold?
- <usetemplate
- canceltext="Annullér"
- name="yesnocancelbuttons"
- notext="Nej"
- yestext="Ja"/>
+ <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
<notification name="SetGroupMature">
Indeholder denne gruppe &apos;Mature&apos; indhold?
- <usetemplate
- canceltext="Annullér"
- name="yesnocancelbuttons"
- notext="Nej"
- yestext="Ja"/>
- </notification>
- <notification label="Indholdsrating" name="HelpRegionMaturity">
- Sætter indholdsrating for regionen, som den vises øverst på menu-bjælken i beboernes klient, og i tooltips på verdenskortet når cursoren placeres over denne region. Denne indstilling har også betydning for adgangen til regionen og for søgeresultater. Andre beboere må kun få adgang til regionen eller se regionen i søgeresultater hvis de har valgt samme eller højere indholdsrating i deres opsætning.
-
-Det kan tage noget tid inden en ændring af indholdsrating er synligt på kortet.
+ <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/>
+ </notification>
+ <notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
+ Denne version af [APP_NAME] er ikke kompatibel med stemme chat funktionen i denne region. For at kunne få stemme chat til at fungere skal du opdatere [APP_NAME].
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ <usetemplate ignoretext="Advar mig før jeg flytter &apos;ikke-kopiérbare&apos; genstande fra et objekt" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ <usetemplate ignoretext="Advar mig før jeg flytter &apos;ikke-kopiérbare&apos; genstande, hvor det kan medføre at ødelægge et scriptet objekt" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Advarsel: &apos;Betal objekt&apos; klik-aktionen er blevet aktiveret, men det vil kun virke, hvis et script med et &apos;money()&apos; event er tilføjet.
+ <form name="form">
+ <ignore name="ignore" text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
+ </form>
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ GÃ¥ til [http://secondlife.com/account/ Dashboard] for at se konto-historik?
+ <usetemplate ignoretext="Start min browser for at se min konto historik" name="okcancelignore" notext="Cancel" yestext="Go to page"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ <usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Brug dette værktøj for at rapportere brud på de almindelige bestemmelser og fællesskabs Standarder. Se:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Benyt dette værktøj til at rapportere Use this tool to report krænkelser af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards].
-Alle rapporterede brud på almindelige bestemmelser og fællesskabs Standarder bliver undersøgt og løst. Du kan følge løsningen på din anmeldselse på:
-
-http://secondlife.com/support/incidentreport.php
+Alle indrapporterede krænkelser er undersøgt og and afgjort. Du kan se løsning ved at læse [http://secondlife.com/support/incidentreport.php Incident Report].
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- Dear Resident,
+ Kære beboer,
-Du ser ud til at være ved at rapportere noget vedr. krænkelse af intellektuelle ejendomsrettigheder. Sørg for, at du rapporterer dette korrekt:
+Det ser ud til at du indrapporterer krænkelse af ophavsret. Check venligst at du rapporterer korrekt:
-(1) Misbrugs processen. Du kan indsende en misbrugs rapport, hvis du mener, at en Beboer udnytter [SECOND_LIFE]&apos;s rettigheds system, for eksempel ved hjælp af en CopyBot eller lignende kopierings værktøjer, at de krænker intellektuelle ejendomsrettigheder. Det team vil undersøge og spørgsmål passende disciplinære sanktioner for adfærd, der overtræder [SECOND_LIFE] EF-standarderne eller Servicevilkår. Men det team vil ikke håndtere og vil ikke reagere på anmodninger om at fjerne indhold fra [SECOND_LIFE]&apos;s verden.
+(1) Krænkelsesproces. Du må sende en rapport, hvis du mener at en beboer udnytter [SECOND_LIFE] rettighedssystemet, for eksempel via CopyBot eller lignende værktøjer, til at overtræde ophavsretten til objekter.
-(2) DMCA eller Indholds fjernelses processen. For at anmode om fjernelse af indhold fra [SECOND_LIFE], skal du sende en gyldig anmeldelse af overtrædelsen som beskrevet i vores DMCA-politik på http://secondlife.com/corporate/dmca.php.
+(2) DCMA (â€Digital Millennium Copyright Actâ€) eller fjernelsesproces. For at kræve at indhold fjernes fra [SECOND_LIFE], SKAL du sende en gyldig besked om overtrædelse som beskrevet i [http://secondlife.com/corporate/dmca.php DMCA Policy].
-Hvis du stadig ønsker at fortsætte med misbrugs processen, luk da venligst dette vindue og færdiggør indsendelsen af din rapport. Du kan være nødt til at vælge den særlige kategori »CopyBot eller Tilladelses Ydnyttelse.
+Hvis du stadig ønsker at fortsætte med rapportering om overtrædelse, luk venligst dette vindue og afslut afsendelse af rapporten. Du skal muligvis vælge en specifik kategori &apos;CopyBot or Permissions Exploit&apos;.
-Mange tak,
+Mange tak
Linden Lab
</notification>
+ <notification label="Replace Existing Attachment" name="ReplaceAttachment">
+ <form name="form">
+ <ignore name="ignore" text="Erstat et eksisterende vedhæng med den valgte genstand"/>
+ </form>
+ </notification>
+ <notification label="Busy Mode Warning" name="BusyModePay">
+ <form name="form">
+ <ignore name="ignore" text="Jeg er ved at betale en person eller et objekt mens jeg er &apos;optaget&apos;"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Mappen &apos;[FOLDERNAME]&apos; er en system mappe. At slette denne mappe kan medføre ustabilitet. Er du sikker på at du vil slette den?
+ <usetemplate ignoretext="Bekræft, inden en system mappe slettes" name="okcancelignore" notext="Annullér" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Er du sikker på at du ønsker at tømme papirkurven?
+ <usetemplate ignoretext="Bekræft før papirkurv i beholdning tømmes" name="okcancelignore" notext="Cancel" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Er du sikker på at du ønsker at slette din historik om besøg, web og søgninger?
+ <usetemplate name="okcancelbuttons" notext="Cancel" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Er du sikker på du vil slette alle cookies?
</notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Er du sikker på at du vil slette indholdet i din &apos;Fundne genstande&apos;?
+ <usetemplate ignoretext="Bekræft før sletning af &apos;Fundne genstande&apos; mappe i beholdning" name="okcancelignore" notext="No" yestext="Yes"/>
+ </notification>
+ <notification name="CopySLURL">
+ Følgende SLurl er blevet kopieret til din udklipsholder:
+ [SLURL]
+
+Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokation, eller prøv det selv ved at indsætte det i adresselinien i en web-browser.
+ <form name="form">
+ <ignore name="ignore" text="SLurl er kopieret til min udklipsholder"/>
+ </form>
+ </notification>
<notification name="NewSkyPreset">
<form name="form">
<input name="message">
@@ -555,7 +730,23 @@ Linden Lab
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Ting kan ikke købes imens de er en del af tilbehør.
+ Du kan ikke købe en genstand mens den er vedhæftet.
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Vil du automatisk tage det tøj på du er ved at lave?
+ <usetemplate ignoretext="Tag det tøj på jeg laver, mens jeg ændrer udseende" name="okcancelignore" notext="No" yestext="Yes"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Du skal være alders-checket for at besøge dette område. Ønsker du at gå til [SECOND_LIFE] hjemmesiden og bekræfte din alder?
+
+[_URL]
+ <usetemplate ignoretext="Jeg har ikke bekræftet min alder" name="okcancelignore" notext="No" yestext="Yes"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Du skal være betalende medlem for at besøge dette område. Ønsker du at gå til [SECOND_LIFE] hjemmesiden for at blive dette?
+
+[_URL]
+ <usetemplate ignoretext="Du mangler at være betalende medlem" name="okcancelignore" notext="No" yestext="Yes"/>
</notification>
<notification name="SystemMessageTip">
[MESSAGE]
@@ -579,7 +770,7 @@ Linden Lab
[FIRST] [LAST] er Offline
</notification>
<notification name="AddSelfFriend">
- Du kan ikke tilføje dig selv som ven.
+ Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven.
</notification>
<notification name="UploadingAuctionSnapshot">
Uploader billeder fra verdenen og www...
@@ -598,7 +789,7 @@ Linden Lab
Terrain.raw downloadet
</notification>
<notification name="GestureMissing">
- Gestus [NAME] mangler i databasen.
+ Bevægelsen [NAME] mangler i databasen.
</notification>
<notification name="UnableToLoadGesture">
Ikke muligt at indlæse gestus [NAME].
@@ -611,14 +802,14 @@ Prøv venligst igen.
Ikke muligt at indlæse landmærke. Prøv venligst igen.
</notification>
<notification name="CapsKeyOn">
- Du har slået store bogstaver til.
-Da det vil have betydning når du indtaster kodeordet, vil du højest sandsynlig slå dem fra.
+ Din Caps Lock er aktiveret.
+Det kan påvirke din indtastning af password.
</notification>
<notification name="NotecardMissing">
Note mangler i databasen.
</notification>
<notification name="NotecardNoPermissions">
- Utilstrækkelige tilladelser til at se note.
+ Du har ikke rettigheder til at se denne note.
</notification>
<notification name="RezItemNoPermissions">
Utilstrækkelige tilladelser til at danne genstanden.
@@ -657,11 +848,11 @@ Prøv venligst igen.
Prøv venligst igen.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Kan ikke købe genstande fra forskellige ejere på samme tid.
-Prøv venligst at vælge en enkelt genstand.
+ Du kan kun købe objekter fra én ejer ad gangen.
+Vælg venligst et enkelt objekt.
</notification>
<notification name="ObjectNotForSale">
- Genstanden ser ikke ud til at være til salg.
+ Dette objekt er ikke til salg.
</notification>
<notification name="EnteringGodMode">
Starter gud-tilstand, niveau [LEVEL]
@@ -670,10 +861,10 @@ Prøv venligst at vælge en enkelt genstand.
Stopper gud-tilstand, niveau [LEVEL]
</notification>
<notification name="CopyFailed">
- Kopiering lykkedes ikke fordi du ikke har nok tilladelser til at kopiere
+ Du har ikke rettigheder til at kopiere dette.
</notification>
<notification name="InventoryAccepted">
- [NAME] accepterede det du tilbød fra din beholdning.
+ [NAME] modtog dit tilbud til hans/hendes beholdning.
</notification>
<notification name="InventoryDeclined">
[NAME] afviste det du tilbød fra din beholdning.
@@ -688,12 +879,16 @@ Prøv venligst at vælge en enkelt genstand.
Dit visitkort blev afvist.
</notification>
<notification name="TeleportToLandmark">
- Nu hvor du er nået frem til hovedlandet, kan du teleportere til steder som &apos;[NAME]&apos; ved at klikke på Beholdning-knappen i nederste højre side af skærmen hvorefter du vælger Landmærke-mappen.
-Dobbeltklik på landmærket og klik på Teleportér, for at rejse derhen.
+ Du kan teleportere til lokationer som &apos;[NAME]&apos; ved at åbne Steder panelet til højre på skærmen, og her vælge landemærker fanen.
+Klik på et landemærke og vælg den, derefter
+Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
+(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
</notification>
<notification name="TeleportToPerson">
- Nu hvor du har nået frem til hovedlandet, kan du kontakte indbyggere som &apos;[NAME]&apos; ved at klikke på Beholdning-knappen i nederste højre side af skærmen, hvorefter du vælger Visitkort-mappen.
-Dobbeltklik på kortet, klik på IM og skriv beskeden.
+ Du kan kontakte beboere som f.eks. &apos;[NAME]&apos; ved at åbne &apos;Personer&apos; panelet til højre på skærmen.
+Vælg beboeren fra listen og klik så på &apos;IM&apos; i bunden af panelet.
+(Du kan også dobbelt-klikke på navnet i listen eller højreklikke og vælge &apos;IM&apos;)
+(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Kan ikke vælge land på tværs af grænser.
@@ -716,6 +911,9 @@ Prøv at vælge mindre stykker land.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Besked om begivenhed:
@@ -739,8 +937,20 @@ Prøv at vælge mindre stykker land.
Deaktiverede bevægelser med samme udløser: [NAMES]
</notification>
<notification name="NoQuickTime">
- Apple&apos;s QuickTime ser ikke ud til at være installeret på computeren.
-Hvis du vil se live transmitteret medie på grunde, der understøtter det, skal du gå ind på QuickTime-siden (http://www.apple.dk/quicktime) og installere QuickTime afspilleren.
+ Det ser ikke ud til at Apples QuickTime software er installeret på dit system.
+Hvis du ønsker at se streaming media på parceller der understøtter dette skal du besøge siden [http://www.apple.com/quicktime QuickTime site] og installere QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ Ingen Media Plugin blev fundet til at håndtere mime af typen &quot;[MIME_TYPE]&quot;. Media af denne type vil ikke være tilgængelig.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Følgende Media Plugin has fejlede:
+ [PLUGIN]
+
+Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis problemerne bliver ved.
+ <form name="form">
+ <ignore name="ignore" text="En Media Plugin kunne ikke afvikles"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
De genstande du ejer på det valgte stykke land er blevet returneret til din beholdning.
@@ -759,23 +969,26 @@ Genstande, der ikke kan overføres og som er dedikeret til gruppen, er blevet sl
<notification name="UnOwnedObjectsReturned">
Genstandene på det valgte stykke land, der IKKE er ejet af dig, er blevet returneret til deres ejere.
</notification>
+ <notification name="ServerObjectMessage">
+ Besked fra [NAME]:
+[MSG]
+ </notification>
<notification name="NotSafe">
- Dette land har sat skade til (&apos;ikke sikker&apos;).
-Du kan komme til skade her. Hvis du dør, vil du blive teleporteret til din hjem-lokalitet.
+ Dette land er åbnet for &apos;skade&apos;.
+Du kan blive skadet her. Hvis du dør, vil du blive teleporteret til din hjemme lokation.
</notification>
<notification name="NoFly">
- Dette land har slået flyvning fra (&apos;ingen flyvning&apos;).
+ Dette sted har ikke aktiveret ret til flyvning.
Du kan ikke flyve her.
</notification>
<notification name="PushRestricted">
- Dette land giver ikke mulighed for at &apos;skubbe&apos; andre, med mindre du ejer landet.
+ Dette sted tillader ikke skubning. Du kan ikke skubbe andre, med mindre du ejer dette land.
</notification>
<notification name="NoVoice">
- Dette land har ikke mulighed for at bruge stemme.
+ Dette sted har ikke aktiveret stemme-chat. Du vil ikke kunne høre nogen tale.
</notification>
<notification name="NoBuild">
- Dette land giver ikke mulighed for at bygge (&apos;byggeri forbudt&apos;).
-Du kan ikke skabe genstande her.
+ Dette sted har ikke aktiveret bygge-ret. Du kan ikke bygge eller &apos;rezze&apos; objekter her.
</notification>
<notification name="ScriptsStopped">
En administrator har midlertidig stoppet scripts i denne region.
@@ -784,12 +997,12 @@ Du kan ikke skabe genstande her.
Denne region kører ikke nogen scripts.
</notification>
<notification name="NoOutsideScripts">
- Dette land har eksterne scripts slået fra
-(&apos;ingen eksterne scripts&apos;).
-Ingen scripts vil køre på nær dem, som tilhører ejeren af landet.
+ Dette sted tillader ikke udefra kommende scripts.
+
+Ingen scripts vil virke her, udover de som tilhører ejeren af landet.
</notification>
<notification name="ClaimPublicLand">
- Du kan kun gøre krav på offentlig land i den region, du befinder dig i.
+ Du kan kun kræve land i den region du befinder dig i.
</notification>
<notification name="RegionTPAccessBlocked">
Du har ikke adgang til denne region på grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder eller at du ikke benytter den nyeste [APP_NAME] klient.
@@ -802,16 +1015,9 @@ GÃ¥ venligst til &apos;Knowledge Base&apos; for yderligere detaljer om adgang ti
<notification name="NoTeenGridAccess">
Du kan ikke tilslutte dig denne &apos;Teen&apos; region.
</notification>
- <notification name="NoHelpIslandTP">
- Du kan ikke teleportere tilbage til Help Island.
-Gå til &apos;Help Island Puclic&apos; for at prøve tutorial igen.
- </notification>
<notification name="ImproperPaymentStatus">
Du har ikke de rette betalingsoplysninger til at komme ind i denne region.
</notification>
- <notification name="MustGetAgeRegion">
- Du skal være aldersgodkendt for at komme ind i denne region.
- </notification>
<notification name="MustGetAgeParcel">
Du skal være aldersgodkendt for at komme ind på denne parcel.
</notification>
@@ -874,7 +1080,8 @@ Prøv igen om lidt.
No valid parcel could be found.
</notification>
<notification name="ObjectGiveItem">
- En genstand med navnet [OBJECTFROMNAME], ejet af [FIRST] [LAST], har givet dig en/et [OBJECTTYPE] med navnet [OBJECTNAME].
+ Et objekt med navnet [OBJECTFROMNAME], ejet af [NAME_SLURL], har givet dig [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behold"/>
<button name="Discard" text="Smid væk"/>
@@ -882,7 +1089,8 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- En genstand med navnet [OBJECTFROMNAME], ejet af (en ukendt bruger), har givet dig en/et [OBJECTTYPE] med navnet [OBJECTNAME].
+ Et objekt med navnet [OBJECTFROMNAME], ejet af en ukendt beboer, har givet dig [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behold"/>
<button name="Discard" text="Smid væk"/>
@@ -890,15 +1098,17 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] har givet dig en/et [OBJECTTYPE] med navnet &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] har givet dig [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behold"/>
+ <button name="Show" text="Vis"/>
<button name="Discard" text="Smid væk"/>
- <button name="Mute" text="Blokér"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -910,7 +1120,7 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] har tilbudt at teleportere dig til hans eller hendes lokalitet:
+ [NAME] har tilbudt dig en teleport til lokationen:
[MESSAGE]
<form name="form">
@@ -935,6 +1145,9 @@ Som standard vil du kunne se andres onlinestatus.
<button name="Decline" text="Afvis"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Du har tilbudt venskab til [TO_NAME]
+ </notification>
<notification name="FriendshipAccepted">
[NAME] accepterede dit tilbud om venskab.
</notification>
@@ -950,12 +1163,12 @@ Dette vil tilføje et bogmærke i din beholdning, så du hurtigt kan sende en pe
</form>
</notification>
<notification name="RegionRestartMinutes">
- Regionen genstarter om [MINUTES] minutter.
-Hvis du bliver i denne region, vil du blive logget af.
+ Denne region vil genstarte om [MINUTES] minutter.
+Hvis du ikke forlader regionen, vil du blive logget af.
</notification>
<notification name="RegionRestartSeconds">
- Regionen genstarter om [SECONDS] sekunder.
-Hvis du bliver i denne region, vil du blive logget af.
+ Denne region genstartes om [SECONDS] sekunder.
+Hvis du ikke forlader regionen, vil du blive logget af.
</notification>
<notification name="LoadWebPage">
Indlæs internetside [URL]?
@@ -975,7 +1188,7 @@ Fra genstand: [OBJECTNAME], ejer: [NAME]?
Det lykkedes ikke at finde [TYPE] med navnet [DESC] i databasen.
</notification>
<notification name="InvalidWearable">
- Den genstand du prøver at tage på benytter funktioner som din klient ikke kan forstå. Opdatér din version af [APP_NAME] for at tage genstanden på.
+ Den genstand du prøver at tage på benytter en funktion din klient ikke kan forstå. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand på.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[NAME]&apos;, vil gerne:
@@ -988,12 +1201,12 @@ Er det iorden?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[NAME]&apos;, vil gerne:
+ Et objekt med navnet &apos;[OBJECTNAME]&apos;, ejet af &apos;[NAME]&apos;, ønsker at:
[QUESTIONS]
-Hvis du ikke har tillid til denne genstand og dens skaber, bør du afvise denne forespørgsel. For yderligere information klik på Detaljer-knappen.
+Hvis du ikke stoler på dette objekt og dets skaber, bør du afvise denne forespørgsel.
-Imødekom denne forespørgsel?
+Tillad denne anmodning?
<form name="form">
<button name="Grant" text="Imødekom"/>
<button name="Deny" text="Afvis"/>
@@ -1014,39 +1227,44 @@ Imødekom denne forespørgsel?
<button name="Ignore" text="Ignorér"/>
</form>
</notification>
+ <notification name="ScriptToast">
+ [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; ønsker bruger-input.
+ <form name="form">
+ <button name="Open" text="Ã…ben dialog"/>
+ <button name="Ignore" text="Ignorér"/>
+ <button name="Block" text="Blokér"/>
+ </form>
+ </notification>
<notification name="FirstBalanceIncrease">
- Du har lige modtaget L$[AMOUNT].
-Genstande og andre brugere kan give dig L$.
-Din saldo er vist i øverste højre hjørne af skærmen.
+ Du har netop modtaget [AMOUNT] L$.
+Din balance vises øverst til højre.
</notification>
<notification name="FirstBalanceDecrease">
- Du har lige modtaget L$[AMOUNT].
-Din saldo er vist i øverste højre hjørne af skærmen.
+ Du har netop betalt [AMOUNT] L$.
+Din balance vises øverst til højre.
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Tak for din betaling!
+
+Din L$ balance vil blive opdateret når transaktionen er gennemført. Ved transaktionen tager mere end 20 min., vil den blive annulleret. I så fald vil beløbet blive krediteret din US$ balance.
+
+Status for din betaling kan ses i din &apos;Transaction History&apos; side på din [http://secondlife.com/account/ Dashboard]
</notification>
<notification name="FirstSit">
- Du sidder.
-Brug piletasterne (eller AWSD) for at ændre hvilken vej du ser.
-Klik på &apos;Stå op&apos;-knappen for at rejse dig op.
+ Du sidder ned.
+Benyt piletasterne (eller AWSD) til at se rundt.
+Klik på &apos;Stå op&apos; tasten for at rejse dig.
</notification>
<notification name="FirstMap">
- Klik og træk for at flytte kortvisningen.
+ Klik og træk på kortet for at se rundt.
Dobbelt-klik for at teleportere.
-Brug kontrollerne til højre for at finde ting og se forskellige baggrunde.
+Benyt kontrollerne til højre for at finde ting og se forskellige baggrunde.
</notification>
<notification name="FirstBuild">
- Du kan bygge nye genstande i nogle områder af [SECOND_LIFE].
-Brug værktøjet øverst til venstre for at bygge, og prøv at holde Ctrl eller Alt nede for hurtigt at skifte imellem værktøjerne.
-Tryk Esc for at stoppe med at bygge.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Venstre-klik interagerer med specielle genstande.
-Hvis musemarkøren ændrer sig til en hånd, kan du interagere med genstanden.
-Højre-klik viser altid en menu med ting du kan gøre.
+ Du har åbnet bygge værktøjer. Alle objekter du ser omkring dig er lavet via disse værktøjer.
</notification>
<notification name="FirstTeleport">
- Du har lige teleporteret.
-Du er ved info-standen nærmest ved din destination.
-Din destination er markeret med en stor rød lyskegle.
+ Du kan kun teleportere til bestemte områder i denne region. Pilen peger på din specifikke destination. Klik på pilen for at fjerne den.
</notification>
<notification name="FirstOverrideKeys">
Dine bevælgelsestaster bliver nu håndteret af et objekt.
@@ -1055,46 +1273,41 @@ Nogle genstande (som skydevåben) kræver at du går ind i musevisning for at br
Tryk på &apos;M&apos; for at gåre det.
</notification>
<notification name="FirstAppearance">
- Du tilretter dit udseende.
-For at rotere og zoome brug piletasterne.
-Når du er færdig, tryk på &apos;Gem alt&apos; for at gemme dit udseende og lukke.
-Du kan rette dit udseende så tit du vil.
+ Du redigerer dit udseende.
+Benyt piletasterne til at se rundt.
+Når du er færdig, tryk på &apos;Gem alt&apos;.
</notification>
<notification name="FirstInventory">
- Dette er din beholdning, der indeholder objekter, noter, tøj og andre ting du ejer.
-* For at bære et objekt eller en mappe med tøj, træk den over på dig selv.
-* For at få et objekt frem i verdenen, træk den ud på jorden.
-* For at læse en note, dobbeltklik på den.
+ Dette er din beholdning, som indeholder de genstande du ejer.
+
+* For at tage noget på, træk det over på dig selv.
+* For at &apos;rezze&apos; noget, træk det over på jorden.
+* For at læse en note, dobbelt-klik på den.
</notification>
<notification name="FirstSandbox">
- Dette er sandkasseområdet.
-Genstande, der er skabt her, vil blive slettet efter du har forladt området. Sandkasser renses jævnligt. Se venligst informationen øverst på skærmen, lige ved siden af områdenavnet.
+ Dette er et sandkasse område. Her kan beboere lære ast bygge.
-Sandkasseområder er ikke almindelige. De er mærket med skilte.
+De ting du bygger vil blive slettet senere, så glem ikke at højre-klikke og vælge &quot;Tag&quot; for at tage en kopi af din kreation til din beholdning.
</notification>
<notification name="FirstFlexible">
- Denne genstand er fleksibel.
-Fleksible genstande er ikke fysiske og man kan gå igennem dem, indtil fleksibel-punktet ikke er afkrydset.
+ Dette objekt er fleksibelt/blødt. Sådanne objekter skal være &apos;uden masse&apos; og ikke fysiske.
</notification>
<notification name="FirstDebugMenus">
- Du har sat avanceret menu til.
-Denne menu indeholder funktioner brugbare for udviklere, der udbedrer fejl i [SECOND_LIFE].
-For at vise denne menu, skal man i Windows trykke Ctrl+Alt+D. PÃ¥ Mac tryk &#8997;&#8984;D.
+ Du har åbnet menuen &apos;Avanceret&apos;.
+
+For at slå denne menu fra og til,
+ Windows: Ctrl+Alt+D
+ Mac: &#8997;&#8984;D
</notification>
<notification name="FirstSculptedPrim">
- Du retter en sculpted prim.
-Sculpted prims kræver et specielt tekstur for at specificere deres form.
-Du kan finde eksempler på sculptede teksturer i din beholdning.
- </notification>
- <notification name="FirstMedia">
- Du er begyndt at afspille medie. Medie kan sættes til automatisk af blive afspillet under Indstillinger, Lyd / Video. Vær opmærksom på, at der kan være en sikkerhedsrisiko for medie-steder, du ikke stoler på.
+ Du redigerer en &apos;Sculpted prim&apos;. Sådanne objekter kræver en speciel tekstur for at definere faconen.
</notification>
<notification name="MaxListSelectMessage">
Du må kun vælge op til [MAX_SELECT] genstande på denne liste.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] inviterer dig til en stemme-chat.
-Klik for at acceptere at koble dig på samtalen eller Afvis for at afvise invitationen. Klik på Slå fra for at blokere denne opkalder.
+ [NAME] inviterer dig til en stemme-chat samtale.
+Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1102,17 +1315,17 @@ Klik for at acceptere at koble dig på samtalen eller Afvis for at afvise invita
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST] har fået en personlig besked (IM) og er automatisk ikke blokeret mere.
+ [FIRST] [LAST] fik tilsendt en personlig besked og er dermed automatisk ikke mere blokeret.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST] har fået penge og er automatisk ikke blokeret mere.
+ [FIRST] [LAST] blev givet penge og er dermed automatisk ikke mere blokeret.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST] har fået tilbudt genstande og er automatisk ikke blokeret mere.
+ [FIRST] [LAST] blev tilbudt en genstand og er dermed automatisk ikke mere blokeret.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] har tilsluttet sig stemme-chat med gruppen [GROUP].
-Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitationen. Klik Slå fra for at blokere denne opkalder.
+ [NAME] har has sluttet sig til stemme-chaten i gruppen [GROUP].
+Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1120,8 +1333,8 @@ Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitati
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] har tilsluttet sig stemme-chat med en konference-chat.
-Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitationen. Klik Slå fra for at blokere denne opkalder.
+ [NAME] har sluttet sig til en stemme-chat med en konference chat.
+Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1129,12 +1342,12 @@ Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitati
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] inviterer dig til en konference-chat.
-Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitationen. Klik Slå fra for at blokere denne opkalder.
+ [NAME] inviterer dig til en konference chat.
+Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik på Blokér for at blokere personen.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
- <button name="Mute" text="Blokeret"/>
+ <button name="Mute" text="Blokér"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -1144,25 +1357,25 @@ Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitati
Vi beklager. Dette område har nået sin maksimale kapacitet for stemme-chat. Prøv venligst at benytte stemme i et andet område.
</notification>
<notification name="VoiceChannelDisconnected">
- Du er blevet koblet af [VOICE_CHANNEL_NAME]. Du vil nu blive koblet op på en lokal stemme-chat.
+ Du er blevet koblet fra [VOICE_CHANNEL_NAME]. Du vil nu blive koblet til almindelig voice-chat.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] har afsluttet opkaldet. Du vil nu blive koblet op på en lokal stemme-chat.
+ [VOICE_CHANNEL_NAME] har afsluttet samtalen. Du vil nu blive koblet til almindelig voice-chat.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] har afvist dit opkald. Du vil nu blive koblet op på en lokal stemme-chat.
+ [VOICE_CHANNEL_NAME] har avist dit opkald. Du vil nu blive koblet til almindelig voice-chat.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] har ikke mulighed for at besvare dit opkald. Du vil nu blive koblet op på en lokal chat.
+ [VOICE_CHANNEL_NAME] er ikke tilgængelig til at modtage dit opkald. Du vil nu blive koblet til almindelig voice-chat.
</notification>
<notification name="VoiceChannelJoinFailed">
- Det lykkedes ikke at koble op til [VOICE_CHANNEL_NAME]. Prøv venligst igen senere.
+ Det lykkedes ikke at forbinde til [VOICE_CHANNEL_NAME], prøv venligst igen senere. Du vil nu blive koblet til almindelig voice-chat.
</notification>
<notification name="VoiceLoginRetry">
Vi laver en stemmekanal til dig. Det kan tage op til et minut.
</notification>
<notification name="Cannot enter parcel: not a group member">
- Du kan ikke komme ind på området. Du er ikke medlem af den nødvendige gruppe.
+ Kun medlemmer af en bestemt gruppe kan besøge dette område.
</notification>
<notification name="Cannot enter parcel: banned">
Du kan ikke komme ind på området. Du er blevet udelukket.
@@ -1177,9 +1390,58 @@ Klik Acceptér for at slutte dig til samtalen eller Afvis for at afvise invitati
En fejl er opstået under forsøget på at koble sig på stemme chatten [VOICE_CHANNEL_NAME]. Pråv venligst senere.
</notification>
<notification name="ServerVersionChanged">
- Det område, du er kommet ind på, kører en anden simulatorversion. Klik på denne besked for detaljer.
+ Du er netop ankommet til en region der benytter en anden server version, hvilket kan influere på hastigheden. [[URL] For at se yderligere.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Den SLurl du klikkede på understøttes ikke.
+ </notification>
+ <notification name="BlockedSLURL">
+ En SLurl blev modtaget en ikke sikret browser og den er blevet blokeret af sikkerhedsmæssige årsager.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Flere SLurls blev modtaget fra en browser i et kort tidsrum.
+De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Svar"/>
+ </form>
+ </notification>
+ <notification name="AttachmentSaved">
+ Vedhæng er blevet gemt.
</notification>
- <notification name="UnableToOpenCommandURL">
- Www-adressen, du har klikket på, kan ikke åbnes fra denne internetbrowser.
+ <notification name="UnableToFindHelpTopic">
+ Ikke muligt at finde hjælp om dette element.
</notification>
+ <notification name="ObjectMediaFailure">
+ Server fejl: Media opdatering eller &quot;get&quot; fejlede.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Din tekst chat er blevet slukket af moderator.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Din stemme er blevet slukket af moderatoren.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Er du sikker på at du vil slette teleport historikken?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Den valgte knap kan ikke vises lige nu.
+Knappen vil blive vist når der er nok plads til den.
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter &apos;multitexture&apos;. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem.
+
+Hvis du bliver ved med at have problemer, besøg venligst [SUPPORT_SITE].
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Hvis du selv ejer land, kan du benytte det til hjemme lokation.
+Ellers kan du se på verdenskortet og finde steder markeret med &quot;Infohub&quot;.
+ </global>
</notifications>
diff --git a/indra/newview/skins/default/xui/da/panel_active_object_row.xml b/indra/newview/skins/default/xui/da/panel_active_object_row.xml
new file mode 100644
index 0000000000..9c27ea7fe2
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Ukendt objekt
+ </string>
+ <text name="object_name">
+ Unavngivet objekt
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..ab2e7a6e31
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <panel name="panel_call_buttons">
+ <button label="Opkald" name="call_btn"/>
+ <button label="Forlad samtale" name="end_call_btn"/>
+ <button label="Stemmekontroller" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..a9d5ba73ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]t
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]u
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mån
+ </string>
+ <string name="FormatYears">
+ [COUNT]Ã¥
+ </string>
+ <text name="avatar_name" value="Ukendt"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..986a4131de
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Blokérede avatarer
+ </text>
+ <scroll_list name="blocked" tool_tip="Vis liste over blokerede avatarer"/>
+ <button label="Blokér beboer..." label_selected="Blokér beboer..." name="Block resident..." tool_tip="Vælg en beboer der skal blokeres"/>
+ <button label="Blokér objekt via navn..." label_selected="Blokér objekt via navn..." name="Block object by name..."/>
+ <button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjern beboer fra liste med blokeringer"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray.xml b/indra/newview/skins/default/xui/da/panel_bottomtray.xml
new file mode 100644
index 0000000000..2085840bb5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_bottomtray.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Slukker/tænder mikrofon
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Skjuler/viser stemme kontrol panel
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_box label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Flyt" name="movement_btn" tool_tip="Vis/skjul bevægelseskontroller"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Vis" name="camera_btn" tool_tip="Vis/Skjul kamerakontroller"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Tag foto"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_classified_info.xml b/indra/newview/skins/default/xui/da/panel_classified_info.xml
new file mode 100644
index 0000000000..a9cce7bf45
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_classified_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <text name="title" value="Annonce info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="classified_name" value="[name]"/>
+ <text name="classified_location" value="[loading...]"/>
+ <text name="content_type" value="[content type]"/>
+ <text name="category" value="[category]"/>
+ <check_box label="Forny automatisk hver uge" name="auto_renew"/>
+ <text name="price_for_listing" tool_tip="Pris for optagelse.">
+ L$[PRICE]
+ </text>
+ <text name="classified_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Kort" name="show_on_map_btn"/>
+ <button label="Redigér" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_alpha.xml b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml
new file mode 100644
index 0000000000..3826e8a228
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - øvre" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - øje" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_classified.xml b/indra/newview/skins/default/xui/da/panel_edit_classified.xml
new file mode 100644
index 0000000000..18689105ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_classified.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Redigér annoncer" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (vil blive opdateret efter gemning)
+ </panel.string>
+ <text name="title">
+ Rediger annonce
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Klik for at forstørre billede"/>
+ <text name="Name:">
+ Titel:
+ </text>
+ <text name="description_label">
+ Beskrivelse:
+ </text>
+ <text name="location_label">
+ Lokation:
+ </text>
+ <text name="classified_location">
+ henter...
+ </text>
+ <button label="Sæt til nuværende lokation" name="set_to_curr_location_btn"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Pris for optagelse." value="50"/>
+ <check_box label="Forny automatisk hver uge" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Gem" name="save_changes_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml
new file mode 100644
index 0000000000..9c0d77c370
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Klik for at vælge billede"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Øjne"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
new file mode 100644
index 0000000000..1d3ba061bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Handsker"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_hair.xml b/indra/newview/skins/default/xui/da/panel_edit_hair.xml
new file mode 100644
index 0000000000..14511d51d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Tekstur" name="Texture" tool_tip="Klik for at vælge et billede"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Farve"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Øjenbryn"/>
+ <accordion_tab name="hair_facial_tab" title="Skæg"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
new file mode 100644
index 0000000000..4c9973c0bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Stof foroven" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jakke"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
new file mode 100644
index 0000000000..bcb1450258
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/>
+ <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Bukser"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
new file mode 100644
index 0000000000..41db2be5e8
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Redigér Pick" name="panel_edit_pick">
+ <text name="title">
+ Redigér favorit
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Klik for at vælge billede"/>
+ <text name="Name:">
+ Titel:
+ </text>
+ <text name="description_label">
+ Beskrivelse:
+ </text>
+ <text name="location_label">
+ Lokation:
+ </text>
+ <text name="pick_location">
+ henter...
+ </text>
+ <button label="Sæt til nuværende lokation" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Gem [WHAT]" name="save_changes_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
index 74b7c7dd72..d3cfdbba52 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
@@ -1,45 +1,49 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Beboer" />
- <string name="AcctTypeTrial"
- value="På prøve" />
- <string name="AcctTypeCharterMember"
- value="æresmedlem" />
- <string name="AcctTypeEmployee"
- value="Linden Lab medarbejder" />
- <string name="PaymentInfoUsed"
- value="Betalende medlem" />
- <string name="PaymentInfoOnFile"
- value="Registreret betalende" />
- <string name="NoPaymentInfoOnFile"
- value="Ingen betalingsinfo" />
- <string name="AgeVerified"
- value="Alders-checket" />
- <string name="NotAgeVerified"
- value="Ikke alders-checket" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=da
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Optaget autosvar:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Redigér profil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Beboer"/>
+ <string name="AcctTypeTrial" value="På prøve"/>
+ <string name="AcctTypeCharterMember" value="æresmedlem"/>
+ <string name="AcctTypeEmployee" value="Linden Lab medarbejder"/>
+ <string name="PaymentInfoUsed" value="Betalende medlem"/>
+ <string name="PaymentInfoOnFile" value="Registreret betalende"/>
+ <string name="NoPaymentInfoOnFile" value="Ingen betalingsinfo"/>
+ <string name="AgeVerified" value="Alders-checket"/>
+ <string name="NotAgeVerified" value="Ikke alders-checket"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=da
+ </string>
+ <string name="no_partner_text" value="Ingen"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Real World:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Klik for at vælge et billede"/>
+ <text name="title_homepage_text">
+ Hjemmeside:
+ </text>
+ <check_box label="Vis mig i søgeresultater" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Min konto:"/>
+ <text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
+ <text name="acc_status_text" value="Beboer. Ingen betalingsinfo."/>
+ <text name="title_partner_text" value="Min partner:"/>
+ <text name="partner_edit_link" value="[[URL] Edit]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Gem ændringer" name="save_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shape.xml b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
new file mode 100644
index 0000000000..19c27748ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Køn:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Kvinde" name="radio"/>
+ <radio_item label="Mand" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Krop"/>
+ <accordion_tab name="shape_head_tab" title="Hoved"/>
+ <accordion_tab name="shape_eyes_tab" title="Øjne"/>
+ <accordion_tab name="shape_ears_tab" title="Ører"/>
+ <accordion_tab name="shape_nose_tab" title="Næse"/>
+ <accordion_tab name="shape_mouth_tab" title="Mund"/>
+ <accordion_tab name="shape_chin_tab" title="Hage"/>
+ <accordion_tab name="shape_torso_tab" title="Overkrop"/>
+ <accordion_tab name="shape_legs_tab" title="Ben"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
new file mode 100644
index 0000000000..cd2e8d8cb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Trøje"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
new file mode 100644
index 0000000000..54a0cc01a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Sko"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_skin.xml b/indra/newview/skins/default/xui/da/panel_edit_skin.xml
new file mode 100644
index 0000000000..46dce354a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Hoved tatoveringer" name="Head Tattoos" tool_tip="Klik for at vælge et bilede"/>
+ <texture_picker label="Øvre tatoveringer" name="Upper Tattoos" tool_tip="Klik for at vælge et bilede"/>
+ <texture_picker label="Nedre tatoveringer" name="Lower Tattoos" tool_tip="Klik for at vælge et bilede"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Hudfarve"/>
+ <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
new file mode 100644
index 0000000000..4407c87d36
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Nederdel"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
new file mode 100644
index 0000000000..6ef6dad86c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Strømper"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..4a133d8693
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Hoved tatovering" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
new file mode 100644
index 0000000000..de52146e29
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Underbukser"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..6c2e1f5833
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Undertrøje"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
new file mode 100644
index 0000000000..12bc120c45
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Kan bæres" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Redigerer kropsbygning
+ </string>
+ <string name="edit_skin_title">
+ Redigerer hud
+ </string>
+ <string name="edit_hair_title">
+ Redigerer hår
+ </string>
+ <string name="edit_eyes_title">
+ Redigerer øjne
+ </string>
+ <string name="edit_shirt_title">
+ Redigerer trøje
+ </string>
+ <string name="edit_pants_title">
+ Redigerer bukser
+ </string>
+ <string name="edit_shoes_title">
+ Redigerer sko
+ </string>
+ <string name="edit_socks_title">
+ Redigerer strømper
+ </string>
+ <string name="edit_jacket_title">
+ Redigerer jakke
+ </string>
+ <string name="edit_skirt_title">
+ Redigerer nederdel
+ </string>
+ <string name="edit_gloves_title">
+ Redigerer handsker
+ </string>
+ <string name="edit_undershirt_title">
+ Redigerer undertrøje
+ </string>
+ <string name="edit_underpants_title">
+ Redigerer underbukser
+ </string>
+ <string name="edit_alpha_title">
+ Redigerer Alpha maske
+ </string>
+ <string name="edit_tattoo_title">
+ Redigerer tatovering
+ </string>
+ <string name="shape_desc_text">
+ Kropsbygning:
+ </string>
+ <string name="skin_desc_text">
+ Hud:
+ </string>
+ <string name="hair_desc_text">
+ HÃ¥r:
+ </string>
+ <string name="eyes_desc_text">
+ Øjne:
+ </string>
+ <string name="shirt_desc_text">
+ Trøje:
+ </string>
+ <string name="pants_desc_text">
+ Bukser:
+ </string>
+ <string name="shoes_desc_text">
+ Sko:
+ </string>
+ <string name="socks_desc_text">
+ Strømper:
+ </string>
+ <string name="jacket_desc_text">
+ Jakke:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Nederdel:
+ </string>
+ <string name="gloves_desc_text">
+ Handsker:
+ </string>
+ <string name="undershirt_desc_text">
+ Undertrøje:
+ </string>
+ <string name="underpants_desc_text">
+ Underbukser:
+ </string>
+ <string name="alpha_desc_text">
+ Alpha maske:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatovering:
+ </string>
+ <text name="edit_wearable_title" value="Redigerer kropsbygning"/>
+ <panel label="Trøje" name="wearable_type_panel">
+ <text name="description_text" value="Kropsbygning:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Gem som" name="save_as_button"/>
+ <button label="Vend tilbage" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_friends.xml b/indra/newview/skins/default/xui/da/panel_friends.xml
index 2644b80968..a41eaf20c1 100644
--- a/indra/newview/skins/default/xui/da/panel_friends.xml
+++ b/indra/newview/skins/default/xui/da/panel_friends.xml
@@ -1,26 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Flere venner...
+ Flere venner
</string>
- <scroll_list name="friend_list"
- tool_tip="Hold Shift eller Ctrl nede imens du klikker for at vælge flere venner">
- <column name="icon_online_status" tool_tip="Online status" />
- <column label="Name" name="friend_name" tool_tip="Navn" />
- <column name="icon_visible_online" tool_tip="Venner kan se at du er online" />
- <column name="icon_visible_map" tool_tip="Venner kan finde dig på kortet" />
- <column name="icon_edit_mine"
- tool_tip="Venner kan rette i, slette eller tage dine objekter" />
- <column name="icon_edit_theirs" tool_tip="Du kan rette i denne vens objekter" />
+ <scroll_list name="friend_list" tool_tip="Hold Shift eller Ctrl nede imens du klikker for at vælge flere venner">
+ <column name="icon_online_status" tool_tip="Online status"/>
+ <column label="Name" name="friend_name" tool_tip="Navn"/>
+ <column name="icon_visible_online" tool_tip="Venner kan se at du er online"/>
+ <column name="icon_visible_map" tool_tip="Venner kan finde dig på kortet"/>
+ <column name="icon_edit_mine" tool_tip="Venner kan rette i, slette eller tage dine objekter"/>
+ <column name="icon_edit_theirs" tool_tip="Du kan rette i denne vens objekter"/>
</scroll_list>
- <button label="IM" name="im_btn" tool_tip="Skriv en personlig besked (IM)" />
- <button label="Profil" name="profile_btn"
- tool_tip="Vis billede, grupper og anden information" />
- <button label="Teleport..." name="offer_teleport_btn"
- tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position" />
- <button label="Betal..." name="pay_btn"
- tool_tip="Giv Linden dollars (L$) til denne ven" />
- <button label="Fjern..." name="remove_btn"
- tool_tip="Fjern denne beboer fra din venneliste" />
- <button label="Tilføj..." name="add_btn" tool_tip="Tilbyd venskab til denne beboer" />
+ <button label="IM" name="im_btn" tool_tip="Skriv en personlig besked (IM)"/>
+ <button label="Profil" name="profile_btn" tool_tip="Vis billede, grupper og anden information"/>
+ <button label="Teleport" name="offer_teleport_btn" tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position"/>
+ <button label="Betal" name="pay_btn" tool_tip="Giv Linden dollars (L$) til denne ven"/>
+ <button label="Fjern" name="remove_btn" tool_tip="Fjern denne beboer fra din venneliste"/>
+ <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til denne beboer"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
new file mode 100644
index 0000000000..1db2db45af
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <button label="Group Profile" name="group_info_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Opkaldsgruppe" name="call_btn"/>
+ <button label="Forlad samtale" name="end_call_btn"/>
+ <button label="Kontroller for åben stemmechat" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_general.xml b/indra/newview/skins/default/xui/da/panel_group_general.xml
index 4e98ca2bc2..ec957e6094 100644
--- a/indra/newview/skins/default/xui/da/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_general.xml
@@ -1,72 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Generelt" name="general_tab">
- <string name="help_text">
- Generel-fanen indeholder generel information om denne gruppe, en liste med ejere og synlige medlemmer, generel-gruppeindstillinger og medlemsmuligheder.
-
-Bevæg din mus over mulighederne for mere hjælp.
- </string>
- <string name="group_info_unchanged">
- Generel gruppeinformation er ændret.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Indtast nyt gruppenavn her" name="group_name_editor"/>
- <text name="group_name">
- Skriv det nye gruppenavn her
- </text>
- <text name="prepend_founded_by">
- Grundlagt af
- </text>
- <text name="founder_name" left_delta="70" >
- (venter)
- </text>
- <text name="group_charter_label">
- Gruppens formål
- </text>
- <texture_picker label="Gruppe distinktioner" name="insignia" tool_tip="Klik for at vælge et billede"/>
+ <panel.string name="help_text">
+ Generelt-fanen indeholder generel information om denne gruppe, en liste med ejere og synlige medlemmer, generel-gruppeindstillinger og medlemsmuligheder. Bevæg din mus over mulighederne for mere hjælp.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Generel gruppeinformation er ændret
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Henter medlemsinformationer
+ </panel.string>
<text_editor name="charter">
Gruppens formål
</text_editor>
- <button label="Tilmeld (L$0)" label_selected="Tilmeld (L$0)" name="join_button"/>
- <button label="Detaljeret visning" label_selected="Detaljeret visning" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Ejere &amp; synlige medlemmer
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Ejere er vist med fed skrift)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Medlemsnavn" name="name"/>
+ <name_list.columns label="Medlem" name="name"/>
<name_list.columns label="Titel" name="title"/>
- <name_list.columns label="Senest på d." name="online"/>
</name_list>
- <text name="text_group_preferences">
- Gruppeindstillinger
+ <text name="active_title_label">
+ Min titel
</text>
+ <combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, når denne gruppe er aktiv"/>
+ <check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/>
+ <check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/>
<panel name="preferences_container">
- <check_box label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/>
<check_box label="Ã…ben tilmelding" name="open_enrollement" tool_tip="Angiver om denne gruppe tillader nye medlemmer at tilmelde sig, uden de er inviteret."/>
- <check_box label="Tilmeldingsgebyr:" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen."/>
- <spinner name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, når Tilmeldingsgebyr er valgt." width="60" left_delta="130"/>
+ <check_box label="Tilmeldingsgebyr" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen"/>
+ <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, når &quot;Tilmeldingsgebyr&quot; er valgt." width="60"/>
<combo_box name="group_mature_check" tool_tip="Angiver om din gruppes information anses som &apos;mature&apos;." width="150">
- <combo_box.item name="select_mature" label="- Vælg indholdsrating -"/>
- <combo_box.item name="mature" label="Mature indhold"/>
- <combo_box.item name="pg" label="PG indhold"/>
+ <combo_box.item label="PG indhold" name="pg"/>
+ <combo_box.item label="Mature indhold" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Min aktive titel
- </text>
- <combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, når denne gruppe er aktiv."/>
- </panel>
- <check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/>
- <check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/>
+ <check_box initial_value="true" label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/>
</panel>
- <string name="incomplete_member_data_str">
- Henter medlemsinformationer
- </string>
- <string name="confirm_group_create_str">
- Creating this group will cost L$100.
-Er du virkelig, virkelig, VIRKELIG sikker på, at du vil bruge L$100 på at lave denne gruppe?
-Du skal være opmærksom på, at hvis ingen andre indmelder sig i denne gruppe indenfor 48 timer, så vil gruppen blive opløst, og gruppens navn vil ikke være tilgængelig i fremtiden.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..9940ebbd4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Gruppe info" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Der er ændringer på denne fane der ikke er gemt
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Ønsker du at gemme disse ændringer?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Tilmeld (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Gratis
+ </panel.string>
+ <text name="group_name" value="(Henter...)"/>
+ <line_editor label="Indtast dit nye gruppenavn her" name="group_name_editor"/>
+ <texture_picker label="" name="insignia" tool_tip="Klik for at vælge bilede"/>
+ <text name="prepend_founded_by">
+ Grundlægger:
+ </text>
+ <name_box initial_value="(finder)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="MELD IND NU!" name="btn_join"/>
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Generelt"/>
+ <accordion_tab name="group_roles_tab" title="Roller"/>
+ <accordion_tab name="group_notices_tab" title="Beskeder"/>
+ <accordion_tab name="group_land_tab" title="Land/Aktiver"/>
+ </accordion>
+ <panel name="button_row">
+ <button label="Lav" label_selected="Ny gruppe" name="btn_create"/>
+ <button label="Gem" label_selected="Gem" name="btn_apply"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_invite.xml b/indra/newview/skins/default/xui/da/panel_group_invite.xml
index 813007aee0..1e00642c29 100644
--- a/indra/newview/skins/default/xui/da/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_invite.xml
@@ -1,31 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Invitér et medlem" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Er du sikker på, at du vil invitere ny(e) ejer(e)? Denne handling er permanent!
+ </panel.string>
+ <panel.string name="loading">
+ (indlæser...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Nogen af avatarerne var allerede i gruppen og blev ikke inviteret
+ </panel.string>
<text name="help_text">
Du kan invitere flere beboere ad
gangen til at blive medlem af din
gruppe. Klik &apos;Åben personvælger&apos; for
at begynde.
</text>
- <button label="Åben personvælger" name="add_button" bottom_delta="-30"/>
- <name_list name="invitee_list"
- tool_tip="Hold Ctrl-tasten nede og klik på beboere for at vælge flere." />
- <button label="Fjern valgte fra listen" name="remove_button"
- tool_tip="Fjerner beboere, der er valgt på ovenstående invitationsliste." />
+ <button bottom_delta="-30" label="Åben personvælger" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Hold Ctrl knappen nede og klik på beboer navne for at vælge flere"/>
+ <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjern beboere valgt ovenfor fra invitationslisten"/>
<text name="role_text">
Vælg hvilken rolle, du vil tildele dem:
</text>
- <combo_box name="role_name"
- tool_tip="Vælg fra listen med roller, du har tilladelse til at tildele medlemmerne." />
- <button label="Send invitationer" name="ok_button" />
- <button label="Annullér" name="cancel_button" />
- <string name="confirm_invite_owner_str">
- Er du sikker på, at du vil invitere ny(e) ejer(e)? Denne handling er permanent!
- </string>
- <!--button bottom="25" font="SansSerifSmall" halign="center" height="20"
- label="Send invitationer" left="65" name="ok_button" width="140" />
- <button bottom_delta="-22" font="SansSerifSmall" halign="center" height="20"
- label="Annull&#233;r" left_delta="0" name="cancel_button" width="140" /-->
- <string name="loading">
- (indlæser...)
+ <combo_box name="role_name" tool_tip="Vælg fra en liste med roller du har ret til at tildele medlemmer"/>
+ <button label="Send invitationer" name="ok_button"/>
+ <button label="Annullér" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Gruppe invitation
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_land_money.xml b/indra/newview/skins/default/xui/da/panel_group_land_money.xml
index 636a16f97b..c73d7c807d 100644
--- a/indra/newview/skins/default/xui/da/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_land_money.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Land &amp; L$" name="land_money_tab">
<string name="help_text">
- Grunde ejet af gruppen er vist sammen med bidragsdetaljer. En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag. Planlægning, detaljer og salgsfaneblade viser information om gruppens økonomi.
+ En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag.
</string>
<button label="?" name="help_button"/>
<string name="cant_view_group_land_text">
@@ -17,27 +17,27 @@
Gruppeejet land
</text>
<scroll_list name="group_parcel_list">
- <column label="Grundens navn" name="name"/>
+ <column label="Parcel" name="name"/>
<column label="Region" name="location"/>
<column label="Type" name="type"/>
<column label="Område" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="Vis på kort" label_selected="Vis på kort" name="map_button"/>
+ <button label="Kort" label_selected="Kort" name="map_button"/>
<text name="total_contributed_land_label">
- Total bidrag:
+ Totalt bidrag:
</text>
<text name="total_contributed_land_value">
[AREA] m²
</text>
<text name="total_land_in_use_label">
- Total land i brug:
+ Totalt land i brug:
</text>
<text name="total_land_in_use_value">
[AREA] m²
</text>
<text name="land_available_label">
- Tilgængeligt land:
+ Ledigt land:
</text>
<text name="land_available_value">
[AREA] m²
@@ -46,40 +46,39 @@
Dit bidrag:
</text>
<string name="land_contrib_error">
- Ikke muligt at lave dit bidrag til landet.
+ Ikke muligt at lave dit bidrag til landet
</string>
<text name="your_contribution_units">
- ( m² )
+ m²
</text>
<text name="your_contribution_max_value">
([AMOUNT] maks.)
</text>
<text name="group_over_limit_text">
- Gruppemedlemmer må bidrag med mere, for at understøtte
-med det land der bliver brugt.
+ Gruppemedlemmer må bidrag med mere, for at understøtte med det land der bliver brugt
</text>
<text name="group_money_heading">
Gruppe L$
</text>
<tab_container name="group_money_tab_container">
- <panel label="Planlægning" name="group_money_planning_tab">
+ <panel label="PLANLÆGNING" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Beregner...
+ Henter...
</text_editor>
</panel>
- <panel label="Detaljer" name="group_money_details_tab">
+ <panel label="DETALJER" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Beregner...
+ Henter...
</text_editor>
- <button label="&lt; Før" label_selected="&lt; Før" name="earlier_details_button" tool_tip="Gå tilbage i tid"/>
- <button label="Efter &gt;" label_selected="Efter &gt;" name="later_details_button" tool_tip="GÃ¥ frem i tid"/>
+ <button label="&lt; Før" label_selected="&lt; Før" name="earlier_details_button" tool_tip="Tilbage"/>
+ <button label="Efter &gt;" label_selected="Efter &gt;" name="later_details_button" tool_tip="Næste"/>
</panel>
- <panel label="Salg" name="group_money_sales_tab">
+ <panel label="SALG" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Beregner...
+ Henter...
</text_editor>
- <button label="&lt; Før" label_selected="&lt; Før" name="earlier_sales_button" tool_tip="Gå tilbage i tid"/>
- <button label="Efter &gt;" label_selected="Efter &gt;" name="later_sales_button" tool_tip="GÃ¥ frem i tid"/>
+ <button label="&lt; Før" label_selected="&lt; Før" name="earlier_sales_button" tool_tip="Tilbage"/>
+ <button label="Efter &gt;" label_selected="Efter &gt;" name="later_sales_button" tool_tip="Næste"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_list_item.xml b/indra/newview/skins/default/xui/da/panel_group_list_item.xml
new file mode 100644
index 0000000000..bfffdccc5e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_group_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Ukendt"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_notices.xml b/indra/newview/skins/default/xui/da/panel_group_notices.xml
index 9e6aa9eb7c..ec503c37dc 100644
--- a/indra/newview/skins/default/xui/da/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_notices.xml
@@ -1,42 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Beskeder" name="notices_tab">
- <string name="help_text">
+ <panel.string name="help_text">
Beskeder er en hurtig måde at kommunikere på
på tværs i gruppen ved at sende en meddelelse eller en
eventuel vedlagt genstand. beskeder sendes kun til
gruppemedlemmer i roller som giver evnen til at
modtage dem. Du kan slå beskeder fra i
Generel-fanebladet.
- </string>
- <string name="no_notices_text">
- Der er ingen tidligere beskeder.
- </string>
- <button label="?" label_selected="?" name="help_button" />
- <text name="lbl">
- Arkiv med gruppebeskeder
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Der er ikke nogen tidligere beskeder
+ </panel.string>
<text name="lbl2">
- Beskeder er gemt i 14 dage.
-Listen er begrænset til 200 beskeder pr. gruppe hver dag.
+ Beskeder gemmes i 14 dage.
+Maksimum er 200 pr. gruppe pr. dag
</text>
<scroll_list name="notice_list">
- <column label="" name="icon" />
- <column label="Emne" name="subject" />
- <column label="Fra" name="from" />
- <column label="Dato" name="date" />
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="Emne" name="subject"/>
+ <scroll_list.columns label="Fra" name="from"/>
+ <scroll_list.columns label="Dato" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Ingen fundet.
+ Ingen fundet
</text>
- <button label="Lav ny besked" label_selected="Lav ny besked" name="create_new_notice" />
- <button label="Genopfrisk" label_selected="Genopfrisk liste" name="refresh_notices" />
+ <button label="Lav en ny besked" label_selected="Lav ny besked" name="create_new_notice" tool_tip="Lav en ny besked"/>
+ <button label="Genopfrisk" label_selected="Genopfrisk liste" name="refresh_notices" tool_tip="Genopfrisk beskedliste"/>
<panel label="Lav ny besked" name="panel_create_new_notice">
<text name="lbl">
Lav en besked
</text>
- <text name="lbl2">
- Du kan tilføje et bilag til beskeden ved at trække den fra beholdningen til dette felt. Vedhæftede objekter skal være sat til at kunne kopieres og overføres, og du kan ikke sende en mappe.
- </text>
<text name="lbl3">
Emne:
</text>
@@ -46,17 +39,19 @@ Listen er begrænset til 200 beskeder pr. gruppe hver dag.
<text name="lbl5">
Vedhæft:
</text>
- <button label="Fjern bilag" label_selected="Fjern bilag" name="remove_attachment" />
- <button label="Afsend" label_selected="Afsend" name="send_notice" />
- <panel name="drop_target"
- tool_tip="Træk en genstand fra beholdningen over på denne boks for at sende den sammen med beskeden. Du skal have tilladelse til at kopiere og overføre genstanden, for at kunne sende den med beskeden." />
+ <text name="string">
+ Træk og slip en gensand for at vedhæfte den:
+ </text>
+ <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment"/>
+ <button label="Send" label_selected="Send" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Træk en genstand fra din beholdning til dette felt for at sende den med denne besked. Du skal have rettigheder til at kopiere og overdrage denne genstand for at kunne vedhæfte den."/>
</panel>
<panel label="Se tidligere beskeder" name="panel_view_past_notice">
<text name="lbl">
Arkiverede beskeder
</text>
<text name="lbl2">
- For at sende en ny besked, klik på &apos;Lav ny besked&apos;-knappen foroven.
+ For at sende en ny besked, tryk på + knappen
</text>
<text name="lbl3">
Emne:
@@ -64,6 +59,6 @@ Listen er begrænset til 200 beskeder pr. gruppe hver dag.
<text name="lbl4">
Besked:
</text>
- <button label="Ã¥ben bilag" label_selected="Ã¥ben bilag" name="open_attachment" />
+ <button label="Ã…ben bilag" label_selected="Ã¥ben bilag" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_notify.xml b/indra/newview/skins/default/xui/da/panel_group_notify.xml
new file mode 100644
index 0000000000..43a84298e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Afsender navn / Gruppe navn"/>
+ </panel>
+ <text name="attachment" value="Bilag"/>
+ <button label="Ok" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_roles.xml b/indra/newview/skins/default/xui/da/panel_group_roles.xml
index 5c2fd356d8..74bea831fb 100644
--- a/indra/newview/skins/default/xui/da/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_roles.xml
@@ -1,147 +1,107 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Medlemmer &amp; roller" name="roles_tab">
- <string name="default_needs_apply_text">
+ <panel.string name="default_needs_apply_text">
Der er ændringer her, der ikke er gemt.
- </string>
- <string name="want_apply_text">
+ </panel.string>
+ <panel.string name="want_apply_text">
Vil du gemme disse ændringer?
- </string>
- <button label="?" name="help_button" />
- <panel name="members_header">
- <text name="static">
- Medlemmer &amp; roller
- </text>
- <text name="static2" width="400">
- Gruppemedlemmer får tildelt roller med rettigheder. Disse indstillinger kan
-let tilpasses efter ønske, så gruppen kan vokse og blive mere fleksibel.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Roller
- </text>
- <text name="role_properties_modifiable" width="400">
- Vælg en rolle nedenfor. Du kan ændre dens navn, beskrivelse og medlemstitel.
- </text>
- <text name="role_properties_not_modifiable" width="400">
- Vælg rolle forneden for at se dens egenskaber, medlemmer og rettigheder.
- </text>
- <text name="role_actions_modifiable">
- Du kan også tildele rettigheder til rollen.
- </text>
- <text name="role_actions_not_modifiable">
- Du kan se, men ikke ændre, tildelte rettigheder.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Rettigheder
- </text>
- <text name="static2">
- Du kan se en rettigheds beskrivelse og hvilke roller og medlemmer,
-der har denne rettighed.
- </text>
- </panel>
+ </panel.string>
<tab_container name="roles_tab_container">
- <panel label="Medlemmer" name="members_sub_tab" tool_tip="Medlemmer">
- <button label="Søg" name="search_button" />
- <button label="Vis alle" name="show_all_button" />
- <name_list name="member_list">
- <column label="Medlemsnavn" name="name" />
- <column label="Doneret leje" name="donated" />
- <column label="Sidst på den" name="online" />
- </name_list>
- <button label="Invitér nyt medlem..." name="member_invite"/>
- <button label="Udmeld" name="member_eject" />
- <string name="help_text">
+ <panel label="MEDLEMMER" name="members_sub_tab" tool_tip="Medlemmer">
+ <panel.string name="help_text">
Du kan tilføje eller fjerne roller, der er tildelt medlemmerne.
Vælg flere medlemmer ved at holde Ctrl-tasten nede og
klik på deres navne.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrér medlemmer" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Medlemsnavn" name="name"/>
+ <name_list.columns label="Doneret leje" name="donated"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Invitér nyt medlem" name="member_invite"/>
+ <button label="Udmeld" name="member_eject"/>
</panel>
- <panel label="Roller" name="roles_sub_tab">
- <button label="Søg" name="search_button" />
- <button label="Vis alle" name="show_all_button" />
- <scroll_list name="role_list">
- <column label="Rollenavn" name="name" />
- <column label="Titel" name="title" />
- <column label="Medlemmer" name="members" />
- </scroll_list>
- <button label="Opret ny rolle..." name="role_create" />
- <button label="Slet rolle" name="role_delete" />
- <string name="help_text">
+ <panel label="ROLLER" name="roles_sub_tab">
+ <panel.string name="help_text">
Roller har en titel og en tilladelsesliste med rettigheder,
som medlemmerne kan bruge. Medlemmer kan høre til
en eller flere roller. En gruppe kan have op til 10 roller,
inkluderet alle- og ejerroller.
- </string>
- <string name="cant_delete_role">
- &apos;Alle-&apos; og &apos;Ejerroller&apos; er specielle og kan ikke slettes.
- </string>
- </panel>
- <panel label="Rettigheder" name="actions_sub_tab">
- <button label="Søg" name="search_button" />
- <button label="Vis alle" name="show_all_button" />
- <scroll_list name="action_list" tool_tip="Vælg en rettighed for at se flere detaljer">
- <column label="" name="icon" />
- <column label="" name="action" />
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Rollerne &apos;Everyone&apos; og &apos;Owners&apos; er specielle og kan ikke slettes
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtrér roller" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Rollenavn" name="name"/>
+ <scroll_list.columns label="Titel" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <string name="help_text">
+ <button label="Opret ny rolle" name="role_create"/>
+ <button label="Slet rolle" name="role_delete"/>
+ </panel>
+ <panel label="RETTIGHEDER" name="actions_sub_tab" tool_tip="Du kan se beskrivelse af rettighed og hvilke roller og medlemmer der har denne rettighed.">
+ <panel.string name="help_text">
Rettigheder giver medlemmer i roller mulighed for at gøre specifikke
ting i denne gruppe. Der er en bred vifte af rettigheder.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrér rettigheder" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Vælg en rettighed for at se flere detaljer">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
- Tildelte roller
+ Medlemmer
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
Tilladte rettigheder
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox" />
- <column label="" name="role" />
- </scroll_list>
- <scroll_list name="member_allowed_actions"
- tool_tip="For detaljer om hver tilladte rettighed, se rettighedsfanebladet.">
- <column label="" name="icon" />
- <column label="" name="action" />
+ <scroll_list name="member_allowed_actions" tool_tip="For detaljer om hver tilladte rettighed, se rettighedsfanebladet.">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
- Navn
- </text>
- <text name="static2">
- Beskrivelse
+ Rolle navn
</text>
<line_editor name="role_name">
Ansatte
</line_editor>
<text name="static3">
- Titel
+ Rolle titel
</text>
<line_editor name="role_title">
(venter)
</line_editor>
+ <text name="static2">
+ Beskrivelse
+ </text>
<text_editor name="role_description">
(venter)
</text_editor>
<text name="static4">
- Tildelte medlemmer
+ Tildelte roller
</text>
- <text name="static5"
- tool_tip="A list of Abilities the currently selected role can perform.">
+ <check_box label="Vis medlemmer for andre" name="role_visible_in_list" tool_tip="Angiver om medlemmer med denne rolle er synlige i fanen &apos;Generelt&apos; for avatarer uden for gruppen."/>
+ <text name="static5" tool_tip="A list of Abilities the currently selected role can perform.">
Tilladte rettigheder
</text>
- <check_box label="Medlemmer er synlige" name="role_visible_in_list"
- tool_tip=" Angiver om medlemmer med denne rolle er synlige i fanen &apos;Generelt&apos; for avatarer uden for gruppen." />
- <scroll_list name="role_allowed_actions"
- tool_tip="For detaljer om hver rettighed se under rettigheder fanebladet.">
- <column label="" name="icon" />
- <column label="" name="checkbox" />
- <column label="" name="action" />
+ <scroll_list name="role_allowed_actions" tool_tip="For detaljer om hver rettighed se under rettigheder fanebladet.">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
diff --git a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
new file mode 100644
index 0000000000..0384652e5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Ukendt"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <button label="Tilføj ven" name="add_friend_btn"/>
+ <button label="Teleportér" name="teleport_btn"/>
+ <button label="Del" name="share_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Opkald" name="call_btn"/>
+ <button label="Læg på" name="end_call_btn"/>
+ <button label="Stemme opsætning" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_landmark_info.xml b/indra/newview/skins/default/xui/da/panel_landmark_info.xml
new file mode 100644
index 0000000000..202a4d4664
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_landmark_info.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Opret landemærke"/>
+ <string name="title_edit_landmark" value="Redigér landemærke"/>
+ <string name="title_landmark" value="Landemærke"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(ukendt)"/>
+ <string name="public" value="(offentlig)"/>
+ <string name="server_update_text">
+ Information om sted ikke tilgængelig før en opdatering af server.
+ </string>
+ <string name="server_error_text">
+ Information om dette sted er ikke tilgængelig lige nu, prøv venligst igen senere.
+ </string>
+ <string name="server_forbidden_text">
+ Information om dette sted er ikke tilgængelig på grund af begrænsning i rettigheder. Check venligst dine adgangsrettigheder med ejeren af parcellen.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Sted profil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="ukendt"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Ejer:"/>
+ <text name="creator_label" value="Skaber:"/>
+ <text name="created_label" value="Lavet d.:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Titel:"/>
+ <text name="notes_label" value="Mine noter:"/>
+ <text name="folder_label" value="Landemærke lokation:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_landmarks.xml b/indra/newview/skins/default/xui/da/panel_landmarks.xml
new file mode 100644
index 0000000000..47487832cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Favorites bjælke"/>
+ <accordion_tab name="tab_landmarks" title="Landemærker"/>
+ <accordion_tab name="tab_inventory" title="Min beholdning"/>
+ <accordion_tab name="tab_library" title="Bibliotek"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Vis yderligere valg"/>
+ <button name="add_btn" tool_tip="Tilføj nyt landemærke"/>
+ <dnd_button name="trash_btn" tool_tip="Fjern valgte landemærke"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index 1c5b013104..c8c275d84d 100644
--- a/indra/newview/skins/default/xui/da/panel_login.xml
+++ b/indra/newview/skins/default/xui/da/panel_login.xml
@@ -1,37 +1,34 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
+ <panel.string name="real_url">
http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
+ </panel.string>
+ <panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
- </string>
- <text name="first_name_text">
- Fornavn:
- </text>
- <text name="last_name_text">
- Efternavn:
- </text>
- <text name="password_text">
- Password:
- </text>
- <text name="start_location_text">
- Start lokation:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Hjem" />
- <combo_box.item name="MyLastLocation" label="Min sidste lokation" />
- <combo_box.item name="Typeregionname" label="&lt;Skriv navn på region&gt;" />
- </combo_box>
- <check_box label="Husk password" name="remember_check" />
- <button label="Log ind" label_selected="Log ind" name="connect_btn" />
- <text name="create_new_account_text">
- Opret bruger
- </text>
- <text name="forgot_password_text">
- Glemt navn eller password?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Fornavn:
+ </text>
+ <line_editor label="Fornavn" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <line_editor label="Efternavn" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <check_box label="Husk" name="remember_check"/>
+ <text name="start_location_text">
+ Start ved:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Hjem" name="MyHome"/>
+ </combo_box>
+ <button label="Log på" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Opret bruger
+ </text>
+ <text name="login_help">
+ Hjælp til login
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_main_inventory.xml b/indra/newview/skins/default/xui/da/panel_main_inventory.xml
new file mode 100644
index 0000000000..ac3a2844db
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ting" name="main inventory panel">
+ <panel.string name="Title">
+ Ting
+ </panel.string>
+ <filter_editor label="Filter" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Alle ting" name="All Items"/>
+ <inventory_panel label="Nye ting" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Vis flere valgmuligheder"/>
+ <button name="add_btn" tool_tip="Opret ny genstand"/>
+ <dnd_button name="trash_btn" tool_tip="Fjern valgt genstand"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Filer" name="File">
+ <menu_item_call label="Ã…ben" name="Open"/>
+ <menu label="Send fil" name="upload">
+ <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Flere filer (L$[COST] pr. fil)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nyt vindue" name="New Window"/>
+ <menu_item_call label="Vis filtre" name="Show Filters"/>
+ <menu_item_call label="Nulstil filtre" name="Reset Current"/>
+ <menu_item_call label="Luk alle mapper" name="Close All Folders"/>
+ <menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
+ <menu_item_call label="Tøm fundne genstande" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Opret" name="Create">
+ <menu_item_call label="Ny mappe" name="New Folder"/>
+ <menu_item_call label="Nyt script" name="New Script"/>
+ <menu_item_call label="Ny note" name="New Note"/>
+ <menu_item_call label="Ny bevægelse" name="New Gesture"/>
+ <menu label="Nyt tøj" name="New Clothes">
+ <menu_item_call label="Ny trøje" name="New Shirt"/>
+ <menu_item_call label="Nye bukser" name="New Pants"/>
+ <menu_item_call label="Nye sko" name="New Shoes"/>
+ <menu_item_call label="Nye strømper" name="New Socks"/>
+ <menu_item_call label="Ny jakke" name="New Jacket"/>
+ <menu_item_call label="Ny nederdel" name="New Skirt"/>
+ <menu_item_call label="Nye handsker" name="New Gloves"/>
+ <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
+ <menu_item_call label="Nye underbukser" name="New Underpants"/>
+ <menu_item_call label="Nyt alpha lag" name="New Alpha"/>
+ <menu_item_call label="Ny tatovering" name="New Tattoo"/>
+ </menu>
+ <menu label="Nye kropsdele" name="New Body Parts">
+ <menu_item_call label="Ny kropsbygning" name="New Shape"/>
+ <menu_item_call label="Ny hud" name="New Skin"/>
+ <menu_item_call label="Nyt hår" name="New Hair"/>
+ <menu_item_call label="Nye øjne" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Sortér" name="Sort">
+ <menu_item_check label="Efter navn" name="By Name"/>
+ <menu_item_check label="Efter dato" name="By Date"/>
+ <menu_item_check label="Altid mapper efter navn" name="Folders Always By Name"/>
+ <menu_item_check label="System-mapper i toppen" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_me.xml b/indra/newview/skins/default/xui/da/panel_me.xml
new file mode 100644
index 0000000000..2cfd358d13
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Min profil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="FAVORITTER" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml
new file mode 100644
index 0000000000..7f1581888d
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Generelt" name="Media Settings General">
+ <text name="home_label">
+ Hjemmeside:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Denne side optræder ikke i godkendte sider)
+ </text>
+ <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette media"/>
+ <text name="preview_label">
+ Vis
+ </text>
+ <text name="current_url_label">
+ Nuværende side:
+ </text>
+ <text name="current_url" tool_tip="Den nuværende hjemmeside for kilden til dette media" value=""/>
+ <button label="Nulstil" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Gentag afspil" name="auto_loop"/>
+ <check_box initial_value="false" label="Første klik medfører interaktion" name="first_click_interact"/>
+ <check_box initial_value="false" label="Auto zoom" name="auto_zoom"/>
+ <check_box initial_value="false" label="Afspil automatisk media" name="auto_play"/>
+ <text name="media_setting_note">
+ Note: Beboere kan selv ændre denne indstilling
+ </text>
+ <check_box initial_value="false" label="Auto skalér media på objektets overflade" name="auto_scale"/>
+ <text name="size_label">
+ Størrelse:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..70570920cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Tilpas" name="Media settings for controls">
+ <text name="controls_label">
+ Kontroller:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_group_control"/>
+ <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
new file mode 100644
index 0000000000..ee341f9142
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sikkerhed" name="Media Settings Security">
+ <check_box initial_value="false" label="Tillad kun adgang til specifikke URL&apos;er (via &quot;prefix&quot;)" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Opslag som hjemmesiden fejler ved er markeret:
+ </text>
+ <button label="Tilføj" name="whitelist_add"/>
+ <button label="Slet" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Advarsel: Hjemmesiden angive i &quot;Generelt&quot; fanen er ikke indeholdt i godkendte sider. Den er slået fra, indtil en gyldig værdi er tilføjet.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml
new file mode 100644
index 0000000000..1dffc73239
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_my_profile.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="no_partner_text" value="Ingen"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/>
+ <text name="title_rw_descr_text" value="RL:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Web:
+ </text>
+ <text name="title_member_text" value="Medlem siden:"/>
+ <text name="title_acc_status_text" value="Konto:"/>
+ <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <text name="title_groups_text" value="Grupper:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Tilføj ven" name="add_friend"/>
+ <button label="IM" name="im"/>
+ <button label="Opkald" name="call"/>
+ <button label="Kort" name="show_on_map_btn"/>
+ <button label="Teleportér" name="teleport"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Rediger profil" name="edit_profile_btn" tool_tip="Redigér personlig information"/>
+ <button label="Ændre udseende" name="edit_appearance_btn" tool_tip="Ændre dit udseende: fysiske data, tøj m.v."/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
new file mode 100644
index 0000000000..465bc75a1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/>
+ <button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/>
+ <button name="home_btn" tool_tip="Teleport til min hjemme lokation"/>
+ <location_input label="Lokation" name="location_combo"/>
+ <search_combo_box label="Søg" name="search_combo_box" tool_tip="Søg">
+ <combo_editor label="Søg [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite">
+ <chevron_button name="&gt;&gt;" tool_tip="Søg mere af mine favoritter"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat.xml
new file mode 100644
index 0000000000..7f94345976
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ CHAT NÆRVED
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..2aa7ed7c6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Klik her for at chatte." name="chat_box" tool_tip="Tryk på enter for at tale, Ctrl-Enter for at råbe."/>
+ <button name="show_nearby_chat" tool_tip="Viser/skjuler log for chat nærved"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_notes.xml b/indra/newview/skins/default/xui/da/panel_notes.xml
new file mode 100644
index 0000000000..f8d911b9e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Noter &amp; Privatliv" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Min private noter:"/>
+ <text name="status_message2" value="Tillad denne person at:"/>
+ <check_box label="Se min online status" name="status_check"/>
+ <check_box label="Se mig på kortet" name="map_check"/>
+ <check_box label="Editére, slette og tage mine objekter" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Tilføj" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/>
+ <button label="IM" name="im" tool_tip="Ã…ben session med personlig besked (IM)"/>
+ <button label="Kald" name="call" tool_tip="Opkald til denne beboer"/>
+ <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboeren på kortet"/>
+ <button label="Teleport" name="teleport" tool_tip="Tilbyd teleport"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..7d6401283e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <accordion_tab name="tab_cof" title="Nuværende sæt"/>
+ <accordion_tab name="tab_outfits" title="Mine sæt"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..a6a796f612
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Erstat nuværende sæt" name="wear"/>
+ <menu_item_call label="Tilføj til nuværende sæt" name="add"/>
+ <menu_item_call label="Fjern fra nuværende sæt" name="remove"/>
+ <menu_item_call label="Omdøb" name="rename"/>
+ <menu_item_call label="Fjern" name="remove_link"/>
+ <menu_item_call label="Slet" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
new file mode 100644
index 0000000000..07b7f60810
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Personer" name="people_panel">
+ <string name="no_people" value="Ingen personer"/>
+ <string name="no_one_near" value="Ingen tæt på"/>
+ <string name="no_friends_online" value="Ingen venner online"/>
+ <string name="no_friends" value="Ingen venner"/>
+ <string name="no_groups" value="Ingen grupper"/>
+ <string name="people_filter_label" value="Filtrér personer"/>
+ <string name="groups_filter_label" value="Filtrér grupper"/>
+ <filter_editor label="Filtrér" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="TÆT PÅ" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Valg"/>
+ <button name="add_friend_btn" tool_tip="Tilføjer valgte beboere til din venneliste"/>
+ </panel>
+ </panel>
+ <panel label="VENNER" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Alle"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Valg"/>
+ <button name="add_btn" tool_tip="Tilbyd venskab til beboer"/>
+ <button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/>
+ </panel>
+ </panel>
+ <panel label="GRUPPER" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Valg"/>
+ <button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/>
+ <button name="activate_btn" tool_tip="Activér valgte gruppe"/>
+ </panel>
+ </panel>
+ <panel label="NYLIGE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Valg"/>
+ <button name="add_friend_btn" tool_tip="Tilføj valgte person til din venneliste"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Profil" name="view_profile_btn" tool_tip="Vis billede, grupper og anden information om beboer"/>
+ <button label="IM" name="im_btn" tool_tip="Chat privat med denne person"/>
+ <button label="Opkald" name="call_btn" tool_tip="Opkald til denne beboer"/>
+ <button label="Del" name="share_btn"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport"/>
+ <button label="Group profil" name="group_info_btn" tool_tip="Vis gruppe information"/>
+ <button label="Gruppe chat" name="chat_btn" tool_tip="Ã…ben chat session"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_pick_info.xml b/indra/newview/skins/default/xui/da/panel_pick_info.xml
new file mode 100644
index 0000000000..ce05018b5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Favorit info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[loading...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportér" name="teleport_btn"/>
+ <button label="Kort" name="show_on_map_btn"/>
+ <button label="Redigér" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_picks.xml b/indra/newview/skins/default/xui/da/panel_picks.xml
new file mode 100644
index 0000000000..ee3c59b88a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favoritter" name="panel_picks">
+ <string name="no_picks" value="Ingen favoritter"/>
+ <string name="no_classifieds" value="Ingen annoncer"/>
+ <text name="empty_picks_panel_text">
+ Der er ingen favoritter/annoncer her
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Favoritter"/>
+ <accordion_tab name="tab_classifieds" title="Annoncer"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Opret en ny favorit eller annonce på dette sted"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Vis favorit information"/>
+ <button label="Teleportér" name="teleport_btn" tool_tip="Teleportér til dette sted"/>
+ <button label="Kort" name="show_on_map_btn" tool_tip="Vis dette sted på verdenskort"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_place_profile.xml b/indra/newview/skins/default/xui/da/panel_place_profile.xml
new file mode 100644
index 0000000000..24316fea14
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Til"/>
+ <string name="off" value="Fra"/>
+ <string name="anyone" value="Enhver"/>
+ <string name="available" value="ledig"/>
+ <string name="allocated" value="fordelt"/>
+ <string name="title_place" value="Sted profil"/>
+ <string name="title_teleport_history" value="Teleport historik sted"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(ukendt)"/>
+ <string name="public" value="(offentlig)"/>
+ <string name="none_text" value="(ingen)"/>
+ <string name="sale_pending_text" value="(Salg igang)"/>
+ <string name="group_owned_text" value="(Gruppe ejet)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Alle beboere"/>
+ <string name="group_text" value="Gruppe"/>
+ <string name="can_resell">
+ Købt land i denne region må sælges videre
+ </string>
+ <string name="can_not_resell">
+ Købt land i denne region må ikke sælges videre
+ </string>
+ <string name="can_change">
+ Købt jord i denne region må gerne samles eller opdeles.
+ </string>
+ <string name="can_not_change">
+ Købt jord i denne region må ikke samles eller opdeles.
+ </string>
+ <string name="server_update_text">
+ Information om dette sted er ikke tilgængelig før en server opdatering.
+ </string>
+ <string name="server_error_text">
+ Information om dette sted er ikke tilgængelig lige nu, prøv venligst igen senere.
+ </string>
+ <string name="server_forbidden_text">
+ Information om dette sted er ikke tilgængelig på grund af adgangsbegrænsninger. Check venligst dine rettigheder med stedets ejer.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Sted profil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Ejer:"/>
+ <text name="maturity_value" value="ukendt"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parcel">
+ <panel>
+ <text name="rating_label" value="Rating:"/>
+ <text name="rating_value" value="ukendt"/>
+ <text name="voice_label" value="Stem:"/>
+ <text name="voice_value" value="Til"/>
+ <text name="fly_label" value="Flyve:"/>
+ <text name="fly_value" value="Til"/>
+ <text name="push_label" value="Skub:"/>
+ <text name="push_value" value="Fra"/>
+ <text name="build_label" value="Byg:"/>
+ <text name="build_value" value="Til"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Til"/>
+ <text name="damage_label" value="Skade:"/>
+ <text name="damage_value" value="Fra"/>
+ <button label="Om land" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Region">
+ <panel>
+ <text name="region_name_label" value="Region:"/>
+ <text name="region_type_label" value="Type:"/>
+ <text name="region_rating_label" value="Rating:"/>
+ <text name="region_owner_label" value="Ejer:"/>
+ <text name="region_group_label" value="Gruppe:"/>
+ <button label="Region/Estate" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Estate">
+ <panel>
+ <text name="estate_name_label" value="Estate:"/>
+ <text name="estate_rating_label" value="Rating:"/>
+ <text name="estate_owner_label" value="Ejer:"/>
+ <text name="covenant_label" value="Regler:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Til salg">
+ <panel>
+ <text name="sales_price_label" value="Pris:"/>
+ <text name="area_label" value="Areal:"/>
+ <text name="traffic_label" value="Trafik:"/>
+ <text name="primitives_label" value="Prims:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Terraform begrænsninger:"/>
+ <text name="subdivide_label" value="Mulighed for at Opdele/samle:"/>
+ <text name="resale_label" value="Mulighed for videresalg:"/>
+ <text name="sale_to_label" value="Til salg til:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml
new file mode 100644
index 0000000000..052bf749cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_places.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Steder" name="places panel">
+ <string name="landmarks_tab_title" value="MINE LANDEMÆRKER"/>
+ <string name="teleport_history_tab_title" value="TELEPORT HISTORIK"/>
+ <filter_editor label="Filtrér steder" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleportér" name="teleport_btn"/>
+ <button label="Kort" name="map_btn"/>
+ <button label="Redigér" name="edit_btn"/>
+ <button label="Luk" name="close_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ <button label="Gem" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
index d3d017914d..87b749b4eb 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
+ <panel.string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </panel.string>
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <check_box label="Talebobler" name="bubble_text_chat"/>
+ <color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
+ <slider label="Gennemsigtighed" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="bredde / højde">
- Format:
+ Format
</text>
<combo_box name="aspect_ratio" tool_tip="bredde/ højde">
<combo_box.item label="4:3 (Standard CRT)" name="item1"/>
@@ -9,4 +18,31 @@
<combo_box.item label="8:5 (Widescreen)" name="item3"/>
<combo_box.item label="16:9 (Widescreen)" name="item4"/>
</combo_box>
+ <check_box label="Registrér automatisk" name="aspect_auto_detect"/>
+ <text name="heading1">
+ Kamera:
+ </text>
+ <slider label="Synsvinkel" name="camera_fov"/>
+ <slider label="Distance" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatisk positionering for:
+ </text>
+ <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/>
+ <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/>
+ <text name="heading3">
+ Avatarer:
+ </text>
+ <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
+ <check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/>
+ <check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/>
+ <check_box label="Vis scriptfejl" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="I chat" name="0"/>
+ <radio_item label="I et vindue" name="1"/>
+ </radio_group>
+ <check_box label="Knap til aktivering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
+ <line_editor label="Brug walkie-talkie modus" name="modifier_combo"/>
+ <button label="Angiv taste" name="set_voice_hotkey_button"/>
+ <button label="Midterste museknap" name="set_voice_middlemouse_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
index c7a49ef307..4791033757 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
@@ -1,20 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
- <text name="dont_show_label">
- Vis ikke disse popups:
+ <text name="tell_me_label">
+ Vis mig når:
</text>
- <button label="Aktivér denne popup" name="enable_popup" />
- <button label="Aktivér alle popups..." name="reset_dialogs_btn"
- tool_tip="Viser alle de valgfrie popups og &apos;første gangs&apos; beskeder." />
+ <check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/>
+ <check_box label="Når mine venner logger af eller på" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Vis disse popups:
+ Vis altid disse beskeder:
</text>
- <button label="Deaktivér alle disse popups..." name="skip_dialogs_btn"
- tool_tip="Viser ingen af de valgfrie popups og &apos;første gangs&apos; beskeder." />
- <text name="text_box2" width="310">
- Ved tilbud om tekstdokumenter, teksturer og landemærker:
+ <text name="dont_show_label">
+ Vis aldrig disse beskeder:
</text>
- <check_box label="Accepter automatisk" name="accept_new_inventory" />
- <check_box label="Vis automatisk efter accept" name="show_new_inventory" />
- <check_box label="Vis nye objekter i beholdning automatisk" name="show_in_inventory" />
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index dee42b4de5..609512bc1b 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -1,12 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tekst chat" name="chat">
- <text name="text_box">
- Chat skriftstørrelse:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Lille" />
- <radio_item name="radio2" label="Mellem" />
- <radio_item name="radio3" label="Stor" />
+ <radio_item label="Lille" name="radio"/>
+ <radio_item label="Mellem" name="radio2"/>
+ <radio_item label="Stor" name="radio3"/>
</radio_group>
<color_swatch label="Dig" name="user"/>
<text name="text_box1">
@@ -36,26 +33,14 @@
<text name="text_box7">
Ejer
</text>
- <color_swatch label="Bobler" name="background"/>
- <text name="text_box8">
- Bobler
- </text>
<color_swatch label="URL&apos;er" name="links"/>
<text name="text_box9">
URL&apos;er
</text>
- <check_box label="Vis script fejl og advarsler i almindelig chat"
- name="script_errors_as_chat" />
- <spinner label="Udfas chat efter" name="fade_chat_time" label_width="90" width="140" />
- <spinner left="350" name="max_chat_count"/>
- <slider label="Gennemsigtighed" name="console_opacity" />
- <check_box label="Brug fuldskærms bredde (Kræver genstart)"
- name="chat_full_width_check" />
- <check_box label="Luk chat efter tryk på enter" name="close_chat_on_return_check" />
- <check_box label="Piletaster flytter altid figur under chat"
- name="arrow_keys_move_avatar_check" />
- <check_box label="Vis klokkeslæt i lokal chat" name="show_timestamps_check" />
- <check_box label="Afspil skrive animation ved chat" name="play_typing_animation" />
- <check_box label="Vis chat bobler" name="bubble_text_chat" />
- <slider label="Gennemsigtighed" name="bubble_chat_opacity" />
+ <check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/>
+ <check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/>
+ <radio_group name="chat_window" tool_tip="Vis dine personlige beskeder i separate vinduer eller i ét vindue med mange faner (ændring kræver genstart)">
+ <radio_item label="Flere vinduer" name="radio"/>
+ <radio_item label="Et vindue" name="radio2"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
index ed23a9a706..e17ccca4a1 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
@@ -1,85 +1,62 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Generelt" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Log ind til min hjemme lokation som standard." label="Mit hjem" />
- <combo_box.item name="MyLastLocation" tool_tip="Log ind til min sidste lokation som standard." label="Min sidste lokation" />
- </combo_box>
- <check_box label="Vis start lokation på login billedet" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Aldrig"/>
- <combo_box.item name="Show Temporarily" label="Vis midlertidigt"/>
- <combo_box.item name="Always" label="Altid"/>
- </combo_box>
- <check_box label="Små avatar navne" name="small_avatar_names_checkbox"/>
- <check_box label="Skjul mit navn på min skærm" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Gruppe titler:
- </text>
- <check_box label="Skjul alle gruppe titler" name="show_all_title_checkbox"/>
- <check_box label="Gem min gruppe titel" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
- <text name="UI Size:">
- UI Størrelse:
+ <text name="language_textbox">
+ Sprog:
</text>
- <check_box label="Brug opløsnings uafhængig skalering" name="ui_auto_scale"/>
- <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/>
- <check_box label="Giv besked når Linden dollars (L$) bliver brugt eller modtaget" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Rating:
+ <combo_box name="language_combobox">
+ <combo_box.item label="System standard" name="System Default Language"/>
+ <combo_box.item label="English (Engelsk)" name="English"/>
+ <combo_box.item label="Dansk - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Tysk) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Spansk) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Fransk) - Beta" name="French"/>
+ <combo_box.item label="Polski (Polsk) - Beta" name="Polish"/>
+ <combo_box.item label="Portugués (Portugisisk) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japansk) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Kræver genstart)
</text>
<text name="maturity_desired_prompt">
Jeg ønsker adgang til inhold med rating:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature og Adult"/>
- <combo_box.item name="Desired_Mature" label="PG and Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="PG, Mature og Adult" name="Desired_Adult"/>
+ <combo_box.item label="PG and Mature" name="Desired_Mature"/>
+ <combo_box.item label="PG" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
Start lokation:
</text>
- <text name="show_names_textbox">
- Vis navne:
- </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Min sidste lokation" name="MyLastLocation" tool_tip="Log ind til min sidste lokation som standard."/>
+ <combo_box.item label="Mit hjem" name="MyHome" tool_tip="Log ind til min hjemme lokation som standard."/>
+ </combo_box>
+ <check_box initial_value="true" label="Vis start lokation på login billedet" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Navneskilte:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Skjul" name="radio"/>
+ <radio_item label="Vis" name="radio2"/>
+ <radio_item label="Vis et øjeblik" name="radio3"/>
+ </radio_group>
+ <check_box label="Vis mit navn" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Små avatar navne" name="small_avatar_names_checkbox"/>
+ <check_box label="Gruppetitler" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
Farve til mine effekter:
</text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
+ <text name="title_afk_text">
+ Tid inden &quot;væk&quot;:
+ </text>
+ <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/>
<text name="seconds_textbox">
sekunder
</text>
- <text name="crash_report_textbox">
- Nedbrudsrapporter:
+ <text name="text_box3">
+ Optaget autosvar:
</text>
- <text name="language_textbox">
- Sprog:
- </text>
- <text name="language_textbox2">
- (Kræver genstart for at virke optimalt)
- </text>
- <string name="region_name_prompt">
- &lt;Skriv regions navn&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Bed om bekræftigelse"/>
- <combo_box.item name="Alwayssend" label="Send altid"/>
- <combo_box.item name="Neversend" label="Send aldrig"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="System standard"/>
- <combo_box.item name="English" label="English (Engelsk)"/>
- <combo_box.item name="Danish" label="Dansk - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Tysk) - Beta"/>
- <combo_box.item name="Spanish" label="Español (Spansk) - Beta"/>
- <combo_box.item name="French" label="Français (Fransk) - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Ungarsk) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polsk) - Beta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugisisk) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Kinesisk) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japansk) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Koreansk) - Beta"/>
- </combo_box>
- <check_box label="Del sprog med objekter" name="language_is_public" tool_tip="Dette lader objekter i verden vide hvad dit foretrukne sprog er."/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
index 4dac7be413..bb1cacc773 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
@@ -1,42 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafik" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton" />
- <check_box label="Kør Second Life i et vindue" name="windowed mode" />
- <text_editor name="FullScreenInfo">
- Hvis dette ikke er valgt kører Second Life i Fuld skærm.
- </text_editor>
- <text name="WindowSizeLabel">
- Opløsning:
+ <text name="UI Size:">
+ UI størrelse:
</text>
- <combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
- </combo_box>
- <text name="DisplayResLabel">
- Skærm opløsning:
- </text>
- <text name="AspectRatioLabel1" tool_tip="bredde / højde">
- Format:
- </text>
- <combo_box name="aspect_ratio" tool_tip="bredde/ højde">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)" />
- </combo_box>
- <check_box label="Auto-detect format" name="aspect_auto_detect" />
- <text name="HigherText">
- Kvalitet og
- </text>
- <text name="QualityText">
- Ydelse:
+ <text name="QualitySpeed">
+ Kvalitet og hastighed:
</text>
<text name="FasterText">
Hurtigere
</text>
+ <text name="BetterText">
+ Bedre
+ </text>
+ <slider label="" name="QualityPerformanceSelection"/>
<text name="ShadersPrefText">
Lav
</text>
@@ -49,99 +25,82 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2">
- Højere
- </text>
- <text name="QualityText2">
- Kvalitet
- </text>
- <slider label="" name="QualityPerformanceSelection" />
- <check_box label="Manuelt" name="CustomSettings" />
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Overflader:
- </text>
- <check_box label="Glatte flader og skin" name="BumpShiny" />
- <check_box label="Basale flader" name="BasicShaders"
- tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher." />
- <check_box label="Atmosfæriske flader" name="WindLightUseAtmosShaders" />
- <check_box label="Reflektioner i vand" name="Reflections" />
- <text name="ReflectionDetailText">
- Spejlnings detaljer:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terræn og træer" />
- <radio_item name="1" label="Alle statiske objekter" />
- <radio_item name="2" label="Alle avatarer og objekter" />
- <radio_item name="3" label="Alt" />
- </radio_group>
- <text name="AvatarRenderingText">
- Avatar gengivelse
- </text>
- <check_box label="Mini-figurer på lang afstand" name="AvatarImpostors" />
- <check_box label="Hardware Skinning" name="AvatarVertexProgram" />
- <check_box label="Avatar tøj" name="AvatarCloth" />
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Maks. visnings-afstand:" name="DrawDistance" />
- <slider label="Maks. antal partikler:" name="MaxParticleCount" />
- <slider label="Efterbehandlingskvalitet:" name="RenderPostProcess" />
- <text name="MeshDetailText">
- Netmaske detaljer:
- </text>
- <slider label=" Objekter:" name="ObjectMeshDetail" />
- <slider label=" Flexiprims:" name="FlexibleMeshDetail" />
- <slider label=" Træer:" name="TreeMeshDetail" />
- <slider label=" Avatarer:" name="AvatarMeshDetail" />
- <slider label=" Terræn:" name="TerrainMeshDetail" />
- <slider label=" Himmel:" name="SkyMeshDetail" />
- <text name="PostProcessText">
- Lav
- </text>
- <text name="ObjectMeshDetailText">
- Lav
- </text>
- <text name="FlexibleMeshDetailText">
- Lav
- </text>
- <text name="TreeMeshDetailText">
- Lav
- </text>
- <text name="AvatarMeshDetailText">
- Lav
- </text>
- <text name="TerrainMeshDetailText">
- Lav
- </text>
- <text name="SkyMeshDetailText">
- Lav
- </text>
- <text name="LightingDetailText">
- Lys detaljer:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Kun sol og måne" />
- <radio_item name="LocalLights" label="Lys i nærheden" />
- </radio_group>
- <text name="TerrainDetailText">
- Terræn detaljer:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Lav" />
- <radio_item name="2" label="Høj" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Overflader:
+ </text>
+ <check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/>
+ <check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/>
+ <check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflektioner i vand" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Spejlnings detaljer:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terræn og træer" name="0"/>
+ <radio_item label="Alle statiske objekter" name="1"/>
+ <radio_item label="Alle avatarer og objekter" name="2"/>
+ <radio_item label="Alt" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Avatar gengivelse
+ </text>
+ <check_box initial_value="true" label="Mini-figurer på lang afstand" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar tøj" name="AvatarCloth"/>
+ <slider label="Maks. visnings-afstand:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Maks. antal partikler:" name="MaxParticleCount"/>
+ <slider label="Efterbehandlingskvalitet:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Netmaske detaljer:
+ </text>
+ <slider label=" Objekter:" name="ObjectMeshDetail"/>
+ <slider label=" Flexiprims:" name="FlexibleMeshDetail"/>
+ <slider label=" Træer:" name="TreeMeshDetail"/>
+ <slider label=" Avatarer:" name="AvatarMeshDetail"/>
+ <slider label=" Terræn:" name="TerrainMeshDetail"/>
+ <slider label=" Himmel:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Lav
+ </text>
+ <text name="ObjectMeshDetailText">
+ Lav
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Lav
+ </text>
+ <text name="TreeMeshDetailText">
+ Lav
+ </text>
+ <text name="AvatarMeshDetailText">
+ Lav
+ </text>
+ <text name="TerrainMeshDetailText">
+ Lav
+ </text>
+ <text name="SkyMeshDetailText">
+ Lav
+ </text>
+ <text name="LightingDetailText">
+ Lys detaljer:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Kun sol og måne" name="SunMoon"/>
+ <radio_item label="Lys i nærheden" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Terræn detaljer:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Lav" name="0"/>
+ <radio_item label="Høj" name="2"/>
+ </radio_group>
</panel>
- <button label="Anbefalede indstillinger" name="Defaults" />
- <button label="Hardware valg" label_selected="Hardware Options"
- name="GraphicsHardwareButton" />
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Benyt" label_selected="Benyt" name="Apply"/>
+ <button label="Nulstil" name="Defaults"/>
+ <button label="Avanceret" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
index c62beac899..c382b222ea 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
@@ -1,33 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Kommunikation" name="im">
- <text name="text_box">
- Min online status:
+ <panel.string name="log_in_to_change">
+ log på for at ændre
+ </panel.string>
+ <button label="Nulstil historik" name="clear_cache"/>
+ <text name="cache_size_label_l">
+ (Lokationer, billeder, web, søge historik)
</text>
- <check_box label="Kun mine venner og grupper kan se når jeg er online"
- name="online_visibility" />
- <text name="text_box2">
- IM valg:
+ <check_box label="Kun venner og grupper ved jeg er online" name="online_visibility"/>
+ <check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/>
+ <check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/>
+ <check_box label="Acceptér cookies" name="cookies_enabled"/>
+ <check_box label="Tillad media autoplay" name="autoplay_enabled"/>
+ <text name="Logs:">
+ Logs:
</text>
- <string name="log_in_to_change">
- Log ind for at ændre
- </string>
- <check_box label="Send IM til E-mail ([EMAIL])" name="send_im_to_email" />
- <check_box label="Inkludér IM i chat vindue" name="include_im_in_chat_console" />
- <check_box label="Vis tidslinje i private beskeder (IM)" name="show_timestamps_check" />
- <check_box label="Vis når venner logger på" name="friends_online_notify_checkbox" />
- <text name="text_box3">
- Optaget autosvar:
+ <check_box label="Gem en log med lokal chat på min computer" name="log_nearby_chat"/>
+ <check_box label="Gem en log med private beskeder (IM) på min computer" name="log_instant_messages"/>
+ <check_box label="Tilføj tidsstempel" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Placering af logfiler
</text>
- <text name="text_box4">
- Log funktioner:
- </text>
- <check_box label="Gem en log af privat beskeder (IM) på min computer"
- name="log_instant_messages" />
- <check_box label="Vis klokkeslæt i log" name="log_instant_messages_timestamp" />
- <check_box label="Vis slutningen af sidste samtale i beskeder" name="log_show_history" />
- <check_box label="Gem log af lokal chat på min computer" name="log_chat" />
- <check_box label="Vis klokkeslæt i lokat chat log" name="log_chat_timestamp" />
- <check_box label="Vis indkommende IM i lokal chat log" name="log_chat_IM" />
- <check_box label="Inkludér dato med klokkeslæt" name="log_date_timestamp" />
- <button label="Ændre sti" label_selected="Ændre sti" name="log_path_button" left="150"/>
+ <button label="Ændre sti" label_selected="Ændre sti" left="150" name="log_path_button"/>
+ <button label="Liste med blokeringer" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
index e826e65315..2dd0b71d8f 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
@@ -1,30 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Input &amp; kamera" name="Input panel">
- <text name=" Mouselook Options:">
- Førstepersons valg:
+<panel label="Input og kamera" name="Input panel">
+ <button label="Andre enheder" name="joystick_setup_button"/>
+ <text name="Mouselook:">
+ Første person:
</text>
- <text name=" Mouse Sensitivity:">
- Mus følsomhed:
+ <text name=" Mouse Sensitivity">
+ Mus - følsomhed
</text>
- <check_box label="Omvendt mus" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Auto flyv valg:
+ <check_box label="Omvendt" name="invert_mouse"/>
+ <text name="Network:">
+ Netværk:
</text>
- <check_box label="Flyv/Land ved at holde Page Up/Down nede" name="automatic_fly"/>
- <text name=" Camera Options:">
- Kamera valg:
+ <text name="Maximum bandwidth">
+ Maksimum båndbredde
</text>
- <text name="camera_fov_label">
- Camera synsvinkel:
+ <text name="text_box2">
+ kbps
</text>
- <text name="Camera Follow Distance:">
- Kamera følge-afstand:
+ <check_box label="Speciel port" name="connection_port_enabled"/>
+ <spinner label="Port nummer:" name="web_proxy_port"/>
+ <text name="cache_size_label_l">
+ Cache størrelse
</text>
- <check_box label="Fokusér kamera automatisk ved redigering" name="edit_camera_movement" tool_tip="Fokusér kamera automatisk når du går ind og ud af redigering."/>
- <check_box label="Fokusér kamera automatisk ved udseende" name="appearance_camera_movement" tool_tip="Lad kameraet automatisk placere sig når du er i redigering"/>
- <text name="text2">
- Avatar skærm funktioner:
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Vælg" label_selected="Vælg" name="set_cache"/>
+ <button label="Nulstil" label_selected="Gem" name="reset_cache"/>
+ <text name="Cache location">
+ Cache lokation
+ </text>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser åbner et nyt vindue i [APP_NAME]."/>
+ <radio_item label="Brug min normale browser (IE, Firefox)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm."/>
+ </radio_group>
+ <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/>
+ <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse på den proxy du ønsker at anvende"/>
+ <button label="Vælg" label_selected="Vælg" name="set_proxy"/>
+ <text name="Proxy location">
+ Proxy placering
</text>
- <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
- <button label="Joystick opsætning" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
index d50c05a192..ce77018f72 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
@@ -1,40 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Lyd &amp; video" name="Preference Media panel">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lyde" name="Preference Media panel">
<slider label="Generel" name="System Volume"/>
+ <check_box initial_value="true" label="Sluk lyd når vinduet er minimeret" name="mute_when_minimized"/>
<slider label="Omgivelser" name="Wind Volume"/>
- <slider label="Effekter" name="SFX Volume"/>
+ <slider label="Knapper" name="UI Volume"/>
<slider label="Media" name="Media Volume"/>
- <slider label="Brugerflade" name="UI Volume"/>
+ <slider label="Effekter" name="SFX Volume"/>
<slider label="Musik" name="Music Volume"/>
+ <check_box label="Tale" name="enable_voice_check"/>
<slider label="Tale" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Stemme chat er ikke tilgængelig
- </text_editor>
- <check_box label="Aktivér stemme chat" name="enable_voice_check"/>
+ <text name="Listen from">
+ Hør stemmer fra:
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Hør stemmer fra kamera position" />
- <radio_item name="1" label="Hør stemmer fra avatar position" />
+ <radio_item label="Kamera position" name="0"/>
+ <radio_item label="Avatar position" name="1"/>
</radio_group>
- <button label="Enheds Indstillinger" name="device_settings_btn"/>
- <text name="muting_text">
- Lydstyrke:
- </text>
- <text name="streaming_prefs_text">
- Streaming indstillinger:
- </text>
- <text name="audio_prefs_text">
- Lyd indstillinger:
- </text>
- <panel label="Lydstyrke" name="Volume Panel" />
- <check_box label="Afspil musik når det er muligt"
- name="streaming_music" />
- <check_box label="Afspil video når det er muligt"
- name="streaming_video" />
- <check_box label="Afspil automatisk medie" name="auto_streaming_video" />
- <check_box label="Sluk lyd når vinduet er minimeret" name="mute_when_minimized" />
- <slider label="Doppler effekt" name="Doppler Effect" />
- <slider label="Rækkevidde" name="Distance Factor" />
- <slider label="Styrkefald/afstand" name="Rolloff Factor" />
- <spinner label="Penge lydstyrke" name="L$ Change Threshold" />
- <spinner label="Livspoint lydstyrke" name="Health Change Threshold" />
+ <button label="Input/Output enheder" name="device_settings_btn"/>
+ <panel label="Enhedsopsætning" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Min lydstyrke:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder"/>
+ <text name="wait_text">
+ Vent venligst
+ </text>
+ <text name="Output">
+ Output
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..987ba2a3f8
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <layout_stack name="media_controls">
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Godkendt side"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Sikker browsing"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmafspilning fremskridt"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Sluk for dette media"/>
+ <slider name="volume_slider" tool_tip="Media lydstyrke"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack>
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Media hentes"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml
new file mode 100644
index 0000000000..ef7110ffcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_profile.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="no_partner_text" value="Ingen"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Real world:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Hjemmeside:
+ </text>
+ <text name="title_member_text" value="Medlem siden:"/>
+ <text name="title_acc_status_text" value="Konto status:"/>
+ <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <text name="title_groups_text" value="Grupper:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til denne beboer"/>
+ <button label="IM" name="im" tool_tip="Skriv en personlig besked (IM)"/>
+ <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
+ <button label="Map" name="show_on_map_btn" tool_tip="Show the resident on the map"/>
+ <button label="Tilbyd teleport" name="teleport" tool_tip="Tilbyd en teleport til denne beboer"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Betal penge til eller del beholdning med denne beboer"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Redigér profil" name="edit_profile_btn"/>
+ <button label="Redigér udseende" name="edit_appearance_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml
new file mode 100644
index 0000000000..23b9d3ba83
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Online
+ </string>
+ <string name="status_offline">
+ Offline
+ </string>
+ <text_editor name="user_name" value="(Henter...)"/>
+ <text name="status" value="Online"/>
+ <tab_container name="tabs">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="FAVORITTER" name="panel_picks"/>
+ <panel label="NOTER &amp; PRIVATLIV" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_covenant.xml b/indra/newview/skins/default/xui/da/panel_region_covenant.xml
index 394664f1f1..0e8ab7556f 100644
--- a/indra/newview/skins/default/xui/da/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Covenant" name="Covenant">
<text name="estate_section_lbl">
- Estate:
+ Estate
</text>
<text name="estate_name_lbl">
Navn:
@@ -27,10 +27,10 @@
Ændringer i regler vil blive vist i alle parceller til denne estate.
</text>
<text name="covenant_instructions">
- Træk og slip et notecard her for at ændre regler for denne estate.
+ Træk og slip en note for at ændre regler for denne estate.
</text>
<text name="region_section_lbl">
- Region:
+ Region
</text>
<text name="region_name_lbl">
Navn:
diff --git a/indra/newview/skins/default/xui/da/panel_region_debug.xml b/indra/newview/skins/default/xui/da/panel_region_debug.xml
index 07e857163a..08e2d1e263 100644
--- a/indra/newview/skins/default/xui/da/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_debug.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="Debug" name="Debug">
<text name="region_text_lbl">
Region:
@@ -6,16 +6,13 @@
<text name="region_text">
ukendt
</text>
- <check_box label="Deaktivér scripts" name="disable_scripts_check"
- tool_tip="Deaktivér alle scripts i denne region" />
- <button label="?" name="disable_scripts_help" />
- <check_box label="Deaktivér kollisioner" name="disable_collisions_check"
- tool_tip="Deaktivér kollisioner mellem objekter i denne region" />
- <button label="?" name="disable_collisions_help" />
- <check_box label="Deaktivér fysik" name="disable_physics_check"
- tool_tip="Deaktivér alt fysik i denne region" />
- <button label="?" name="disable_physics_help" />
- <button label="Gem" name="apply_btn" />
+ <check_box label="Deaktivér scripts" name="disable_scripts_check" tool_tip="Deaktivér alle scripts i denne region"/>
+ <button label="?" name="disable_scripts_help"/>
+ <check_box label="Deaktivér kollisioner" name="disable_collisions_check" tool_tip="Deaktivér kollisioner mellem objekter i denne region"/>
+ <button label="?" name="disable_collisions_help"/>
+ <check_box label="Deaktivér fysik" name="disable_physics_check" tool_tip="Deaktivér alt fysik i denne region"/>
+ <button label="?" name="disable_physics_help"/>
+ <button label="Gem" name="apply_btn"/>
<text name="objret_text_lbl">
Returnér objekter
</text>
@@ -25,27 +22,19 @@
<line_editor name="target_avatar_name">
(ingen)
</line_editor>
- <button label="Vælg..." name="choose_avatar_btn" />
+ <button label="Vælg" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Valg:
</text>
- <check_box label="Returnér kun objekter med script" name="return_scripts"
- tool_tip="Returnér kun objekter med scripts." />
- <check_box label="Returnér kun objekter på andre brugeres land" name="return_other_land"
- tool_tip="returnér kun objekter på land som tilhører andre" />
- <check_box label="Returnér objekter fra alle regioner i denne estate"
- name="return_estate_wide"
- tool_tip="Returnér objekter i alle regioner der tilhører denne estate" />
- <button label="Returnér" name="return_btn" />
- <button label="Mest kolliderende..." name="top_colliders_btn"
- tool_tip="Liste med de objekter der oplever flest kollissioner" />
- <button label="?" name="top_colliders_help" />
- <button label="Mest krævende scripts..." name="top_scripts_btn"
- tool_tip="Liste med de objekter der kræver mest script tid" />
- <button label="?" name="top_scripts_help" />
- <button label="Genstart region" name="restart_btn"
- tool_tip="Genstart region om 2 minutter (sender advarsel først)" />
- <button label="?" name="restart_help" />
- <button label="Udskyd genstart" name="cancel_restart_btn"
- tool_tip="Udsæt genstart med en time" />
+ <check_box label="Med scripts" name="return_scripts" tool_tip="Returnér kun objekter med scripts"/>
+ <check_box label="På en andens land" name="return_other_land" tool_tip="returnér kun objekter på land som tilhører andre"/>
+ <check_box label="I hver eneste region i denne estate" name="return_estate_wide" tool_tip="Returnér objekter i alle regioner der tilhører denne estate"/>
+ <button label="Returnér" name="return_btn"/>
+ <button label="Mest kolliderende..." name="top_colliders_btn" tool_tip="Liste med de objekter der oplever flest kollissioner"/>
+ <button label="?" name="top_colliders_help"/>
+ <button label="Mest krævende scripts..." name="top_scripts_btn" tool_tip="Liste med de objekter der kræver mest script tid"/>
+ <button label="?" name="top_scripts_help"/>
+ <button label="Genstart region" name="restart_btn" tool_tip="Genstart region om 2 minutter (sender advarsel først)"/>
+ <button label="?" name="restart_help"/>
+ <button label="Udskyd genstart" name="cancel_restart_btn" tool_tip="Udsæt genstart med en time"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_estate.xml b/indra/newview/skins/default/xui/da/panel_region_estate.xml
index 5d0799cab9..d726fedfe9 100644
--- a/indra/newview/skins/default/xui/da/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_estate.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="Estate" name="Estate">
<text name="estate_help_text">
Ændringer i dette afsnit vil påvirke alle
@@ -11,61 +11,59 @@ regioner i dette estate.
(ukendt)
</text>
<text name="owner_text">
- Ejer:
+ Estate ejer:
</text>
<text name="estate_owner">
(ukendt)
</text>
- <check_box label="Brug global tid" name="use_global_time_check" />
- <button label="?" name="use_global_time_help" />
- <check_box label="Sol i fast position" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="Fase" name="sun_hour_slider" />
- <check_box label="Tillad offentlig adgang" name="externally_visible_check" />
- <button label="?" name="externally_visible_help" />
+ <check_box label="Brug global tid" name="use_global_time_check"/>
+ <button label="?" name="use_global_time_help"/>
+ <check_box label="Sol i fast position" name="fixed_sun_check"/>
+ <button label="?" name="fixed_sun_help"/>
+ <slider label="Fase" name="sun_hour_slider"/>
+ <check_box label="Tillad offentlig adgang" name="externally_visible_check"/>
+ <button label="?" name="externally_visible_help"/>
<text name="Only Allow">
Begræns adgang til:
</text>
- <check_box label="Beboere med betalingsoplysninger" name="limit_payment"
- tool_tip="Blokér for brugere uden identifikation" />
- <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified"
- tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se support.secondlife.com for mere information." />
- <check_box label="Tillad stemme chat" name="voice_chat_check" />
- <button label="?" name="voice_chat_help" />
- <check_box label="Tillad direkte teleport" name="allow_direct_teleport" />
- <button label="?" name="allow_direct_teleport_help" />
+ <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for brugere uden identifikation"/>
+ <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se [SUPPORT_SITE] for mere information."/>
+ <check_box label="Tillad stemme chat" name="voice_chat_check"/>
+ <button label="?" name="voice_chat_help"/>
+ <check_box label="Tillad direkte teleport" name="allow_direct_teleport"/>
+ <button label="?" name="allow_direct_teleport_help"/>
<text name="abuse_email_text" width="260">
Send beskeder misbrug til email adresse:
</text>
<string name="email_unsupported">
Ikke supporteret
</string>
- <button label="?" name="abuse_email_address_help" />
- <button label="Gem" name="apply_btn" />
- <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn" />
- <button label="Send besked til estate..." name="message_estate_btn" />
+ <button label="?" name="abuse_email_address_help"/>
+ <button label="Gem" name="apply_btn"/>
+ <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn"/>
+ <button label="Send besked til estate..." name="message_estate_btn"/>
<text name="estate_manager_label">
Administratorer:
</text>
- <button label="?" name="estate_manager_help" />
- <button label="Fjern..." name="remove_estate_manager_btn" />
- <button label="Tilføj..." name="add_estate_manager_btn" />
+ <button label="?" name="estate_manager_help"/>
+ <button label="Fjern..." name="remove_estate_manager_btn"/>
+ <button label="Tilføj..." name="add_estate_manager_btn"/>
<text name="allow_resident_label">
Godkendte beboere:
</text>
- <button label="?" name="allow_resident_help" />
- <button label="Fjern..." name="remove_allowed_avatar_btn" />
- <button label="Tilføj..." name="add_allowed_avatar_btn" />
+ <button label="?" name="allow_resident_help"/>
+ <button label="Fjern..." name="remove_allowed_avatar_btn"/>
+ <button label="Tilføj..." name="add_allowed_avatar_btn"/>
<text name="allow_group_label">
Tilladte grupper:
</text>
- <button label="?" name="allow_group_help" />
- <button label="Fjern..." name="remove_allowed_group_btn" />
- <button label="Tilføj..." name="add_allowed_group_btn" />
+ <button label="?" name="allow_group_help"/>
+ <button label="Fjern..." name="remove_allowed_group_btn"/>
+ <button label="Tilføj..." name="add_allowed_group_btn"/>
<text name="ban_resident_label">
Blokérede beboere:
</text>
- <button label="?" name="ban_resident_help" />
- <button label="Fjern..." name="remove_banned_avatar_btn" />
- <button label="Tilføj..." name="add_banned_avatar_btn" />
+ <button label="?" name="ban_resident_help"/>
+ <button label="Fjern..." name="remove_banned_avatar_btn"/>
+ <button label="Tilføj..." name="add_banned_avatar_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml
index 65c4743da0..fc597eee15 100644
--- a/indra/newview/skins/default/xui/da/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terræn textures" name="Textures">
<text name="region_text_lbl">
Region:
@@ -36,22 +36,22 @@
<text name="height_text_lbl9">
Nordøst
</text>
- <spinner label="Lav" name="height_start_spin_0" />
- <spinner label="Lav" name="height_start_spin_1" />
- <spinner label="Lav" name="height_start_spin_2" />
- <spinner label="Lav" name="height_start_spin_3" />
- <spinner label="Høj" name="height_range_spin_0" />
- <spinner label="Høj" name="height_range_spin_1" />
- <spinner label="Høj" name="height_range_spin_2" />
- <spinner label="Høj" name="height_range_spin_3" />
+ <spinner label="Lav" name="height_start_spin_0"/>
+ <spinner label="Lav" name="height_start_spin_1"/>
+ <spinner label="Lav" name="height_start_spin_2"/>
+ <spinner label="Lav" name="height_start_spin_3"/>
+ <spinner label="Høj" name="height_range_spin_0"/>
+ <spinner label="Høj" name="height_range_spin_1"/>
+ <spinner label="Høj" name="height_range_spin_2"/>
+ <spinner label="Høj" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Disse værdier repræsenterer overgange for texturerne ovenfor målt i meter
+ Disse værdier repræsenterer blandingsområder for teksturer ovenfor.
</text>
<text name="height_text_lbl11">
- LAV værdien er MAKSIMUM højde for texture nummer 1,
+ Målt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1, og HØJ værdien er minimumshøjden for tekstur 4.
</text>
<text name="height_text_lbl12">
og HØJ værdien er MIMIMUM højde for texture nummer 4.
</text>
- <button label="Gem" name="apply_btn" />
+ <button label="Gem" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml
new file mode 100644
index 0000000000..0bdfa89d3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Henter...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Du kan ikke se eller rette dette script, da det er sat til &quot;no copy&quot;. Du skal have fulde rettigheder for at se eller rette et script i et objekt.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Offentlige objekter kan ikke afvikle scripts
+ </panel.string>
+ <panel.string name="script_running">
+ kører
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Henter...
+ </text_editor>
+ <button label="Gem" label_selected="Gem" name="Save_btn"/>
+ <combo_box label="Indsæt..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Filer" name="File">
+ <menu_item_call label="Gem" name="Save"/>
+ <menu_item_call label="Annullér alle ændringer" name="Revert All Changes"/>
+ </menu>
+ <menu label="Redigér" name="Edit">
+ <menu_item_call label="Fortryd" name="Undo"/>
+ <menu_item_call label="Gentag" name="Redo"/>
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Indsæt" name="Paste"/>
+ <menu_item_call label="Vælg alt" name="Select All"/>
+ <menu_item_call label="Fravælg alt" name="Deselect"/>
+ <menu_item_call label="Søg / Erstat..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Hjælp" name="Help">
+ <menu_item_call label="Hjælp..." name="Help..."/>
+ <menu_item_call label="Hjælp med keywords..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_side_tray.xml b/indra/newview/skins/default/xui/da/panel_side_tray.xml
new file mode 100644
index 0000000000..ab4a2a134e
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_side_tray.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Hjem." name="sidebar_home">
+ <panel label="hjem" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Find venner, kontakter og personer tæt på." name="sidebar_people">
+ <panel_container name="panel_container">
+ <panel label="Gruppe info" name="panel_group_info_sidetray"/>
+ <panel label="Blokerede beboere og objekter" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find steder du vil hen og steder du har været før." label="Steder" name="sidebar_places">
+ <panel label="Steder" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me">
+ <panel label="Mig" name="panel_me"/>
+ </sidetray_tab>
+ <sidetray_tab description="Ændre dit nuværende udseende" name="sidebar_appearance">
+ <panel label="Redigér fremtoning" name="sidepanel_appearance"/>
+ </sidetray_tab>
+ <sidetray_tab description="Browse din beholdning." name="sidebar_inventory">
+ <panel label="Redigér beholdning" name="sidepanel_inventory"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..5c0bd829d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Side bjælke"/>
+ <button name="show_help" tool_tip="Vis hjælp"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/da/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..f25639d56f
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Stå" name="stand_btn" tool_tip="Klik her for at stå op."/>
+ <button label="Stop flyvning" name="stop_fly_btn" tool_tip="Stop flyvning"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml
index 20e72827f2..4e45b7e328 100644
--- a/indra/newview/skins/default/xui/da/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml
@@ -1,44 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText"
- tool_tip="Navn på det land/parcel som du står på. Klik på teksten for yderligere info.">
- parcel name goes here
- </text>
- <text name="BalanceText" tool_tip="Konto balance">
- Henter...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Køb valuta" />
- <text name="TimeText" tool_tip="Nuværende [SECOND_LIFE] tid">
- 12:00
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Script advarsler og fejl" />
- <button label="" label_selected="" name="health" tool_tip="Helbred" />
- <text name="HealthText" tool_tip="Helbred">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Flyvning ikke tilladt" />
- <button label="" label_selected="" name="no_build"
- tool_tip="Bygning og placering af objekter ikke tilladt" />
- <button label="" label_selected="" name="no_scripts"
- tool_tip="Afvikling af scripts ikke tilladt" />
- <button label="" label_selected="" name="restrictpush"
- tool_tip="Ikke tilladt at skubbe" />
- <button label="" label_selected="" name="status_no_voice"
- tool_tip="Stemme chat ikke tilgængelig" />
- <button label="" label_selected="" name="buyland" tool_tip="Køb denne parcel" />
- <button label="" name="menubar_search_bevel_bg" />
- <line_editor label="Søg" name="search_editor" tool_tip="Søg [SECOND_LIFE]" />
- <button label="" label_selected="" name="search_btn" tool_tip="Søg [SECOND_LIFE]" />
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Packet Loss
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
BÃ¥ndbredde
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="My Balance: Click to buy more L$"/>
+ <text name="TimeText" tool_tip="Nuværende tid (Pacific)">
+ 12:00
+ </text>
+ <button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_teleport_history.xml b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
new file mode 100644
index 0000000000..64b5ecf5cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="I dag"/>
+ <accordion_tab name="yesterday" title="I går"/>
+ <accordion_tab name="2_days_ago" title="2 dage siden"/>
+ <accordion_tab name="3_days_ago" title="3 dage siden"/>
+ <accordion_tab name="4_days_ago" title="4 dage siden"/>
+ <accordion_tab name="5_days_ago" title="5 dage siden"/>
+ <accordion_tab name="6_days_and_older" title="6 dage siden"/>
+ <accordion_tab name="1_month_and_older" title="1 måned eller ældre"/>
+ <accordion_tab name="6_months_and_older" title="6 måneder eller ældre"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_world_map.xml b/indra/newview/skins/default/xui/da/panel_world_map.xml
index d2ae3ab116..bea5ea6b36 100644
--- a/indra/newview/skins/default/xui/da/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/da/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Henter...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ugyldig lokation
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/da/role_actions.xml b/indra/newview/skins/default/xui/da/role_actions.xml
index e4c8c4b93b..5ec90a759a 100644
--- a/indra/newview/skins/default/xui/da/role_actions.xml
+++ b/indra/newview/skins/default/xui/da/role_actions.xml
@@ -1,201 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Disse rettigheder inkluderer adgang til at tilføje og fjerne gruppe medlemmer og tillade nye medlemmer at melde sig ind uden invitation"
- name="Membership">
- <action description="Invitér personer til denne gruppe"
- longdescription="Invitér personer til denne gruppe via &apos;Invitér ny person...&apos; knappen i fanen: medlemmer &amp; roller &gt; underfanen: medlemmer"
- name="member invite" />
- <action description="Fjern medlemmer fra denne gruppe"
- longdescription="Fjern medlemmer i denne gruppe via &apos;Fjern fra gruppe&apos; knappen i fanen: medlemmer &amp; roller &gt; underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden &apos;Fjern medlemmer fra roller&apos;"
- name="member eject" />
- <action
- description="Åben eller luk for &apos;fri tilmelding&apos; og ændre &apos;tilmeldingsgebyr&apos;"
- longdescription="Åben for &apos;fri tilmelding&apos; så alle kan blive medlem af gruppen, eller luk for &apos;fri tilmelding&apos; så kun inveterede kan blive medlem. ændre &apos;tilmeldingsgebyr&apos; i gruppe opsætningsbilledet sektionen i Generelt fanen"
- name="member options" />
+ <action_set description="Disse rettigheder inkluderer adgang til at tilføje og fjerne gruppe medlemmer og tillade nye medlemmer at melde sig ind uden invitation" name="Membership">
+ <action description="Invitér personer til denne gruppe" longdescription="Invitér personer til denne gruppe via &apos;Invitér ny person...&apos; knappen i fanen: medlemmer &amp; roller &gt; underfanen: medlemmer" name="member invite"/>
+ <action description="Fjern medlemmer fra denne gruppe" longdescription="Fjern medlemmer i denne gruppe via &apos;Fjern fra gruppe&apos; knappen i fanen: medlemmer &amp; roller &gt; underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden &apos;Fjern medlemmer fra roller" name="member eject"/>
+ <action description="Åben eller luk for &apos;fri tilmelding&apos; og ændre &apos;tilmeldingsgebyr&apos;" longdescription="Åben for &apos;fri tilmelding&apos; så alle kan blive medlem af gruppen, eller luk for &apos;fri tilmelding&apos; så kun inveterede kan blive medlem. ændre &apos;tilmeldingsgebyr&apos; i gruppe opsætningsbilledet sektionen i Generelt fanen" name="member options"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at tilføje, fjerne og ændre gruppe-roller, tilføje og fjerne medlemmer i roller, og give rettigheder til roller"
- name="Roles">
- <action description="Opret nye roller"
- longdescription="Opret nye roller i fanen: Medlemmer &amp; roller &gt; under-fanen: Roller."
- name="role create" />
- <action description="Slet roller"
- longdescription="Slet roller i roller i fanen: Medlemmer &amp; roller &gt; under-fanen: Roller."
- name="role delete" />
- <action
- description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen"
- longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer &amp; roller &gt; under-fanen: Roller efter at have valgt en rolle."
- name="role properties" />
- <action description="Tildel andre samme roller som dig selv"
- longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har."
- name="role assign member limited" />
- <action description="Tildele medlemmer enhver rolle"
- longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed."
- name="role assign member" />
- <action description="Fjern medlemmer fra roller"
- longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. Ejere kan ikke fjernes."
- name="role remove member" />
- <action description="Tildel og fjern rettigheder for roller"
- longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed."
- name="role change actions" />
+ <action_set description="Disse rettigheder inkluderer adgang til at tilføje, fjerne og ændre gruppe-roller, tilføje og fjerne medlemmer i roller, og give rettigheder til roller" name="Roles">
+ <action description="Opret nye roller" longdescription="Opret nye roller i fanen: Medlemmer &amp; roller &gt; under-fanen: Roller." name="role create"/>
+ <action description="Slet roller" longdescription="Slet roller i roller i fanen: Medlemmer &amp; roller &gt; under-fanen: Roller." name="role delete"/>
+ <action description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen" longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer &amp; roller &gt; under-fanen: Roller efter at have valgt en rolle." name="role properties"/>
+ <action description="Tildel andre samme roller som dig selv" longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har." name="role assign member limited"/>
+ <action description="Tildele medlemmer enhver rolle" longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="role assign member"/>
+ <action description="Fjern medlemmer fra roller" longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Medlemmer. Ejere kan ikke fjernes." name="role remove member"/>
+ <action description="Tildel og fjern rettigheder for roller" longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer &amp; roller &gt; under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed." name="role change actions"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at ændre denne gruppes identitetsoplysninger, som f.eks. om gruppen kan ses af andre, gruppens fundats og billede."
- name="Group Identity">
- <action description="Ændre fundats, billede og &apos;Vis i søgning&apos;"
- longdescription="Ændre fundats og &apos;Vis i søgning&apos;. Dette gøres under fanen Generelt."
- name="group change identity" />
+ <action_set description="Disse rettigheder inkluderer adgang til at ændre denne gruppes identitetsoplysninger, som f.eks. om gruppen kan ses af andre, gruppens fundats og billede." name="Group Identity">
+ <action description="Ændre fundats, billede og &apos;Vis i søgning&apos;" longdescription="Ændre fundats og &apos;Vis i søgning&apos;. Dette gøres under fanen Generelt." name="group change identity"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til dedikere, ændre og sælge land fra denne gruppes besiddelser. For at åbne &apos;Om land...&apos; vinduet, højre-klik på jorden og vælg &apos;Om land...&apos;, eller klik på &apos;Om land...&apos; i &apos;Verden&apos; menuen."
- name="Parcel Management">
- <action description="Dedikér eller køb land til gruppen"
- longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i &apos;Om land...&apos;."
- name="land deed" />
- <action description="Forlad land og overgiv det til guvernør Linden"
- longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i &apos;Om land...&apos; til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed."
- name="land release" />
- <action description="Sæt land til salg"
- longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i &apos;Om land...&apos;! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed."
- name="land set sale info" />
- <action description="Opdel og saml parceller"
- longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge &apos;Redigér terræn&apos;"
- name="land divide join" />
+ <action_set description="Disse rettigheder inkluderer adgang til dedikere, ændre og sælge land fra denne gruppes besiddelser. For at åbne &apos;Om land...&apos; vinduet, højre-klik på jorden og vælg &apos;Om land...&apos;, eller klik på &apos;Om land...&apos; i &apos;Verden&apos; menuen." name="Parcel Management">
+ <action description="Dedikér eller køb land til gruppen" longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i &apos;Om land...&apos;." name="land deed"/>
+ <action description="Forlad land og overgiv det til guvernør Linden" longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i &apos;Om land...&apos; til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land release"/>
+ <action description="Sæt land til salg" longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i &apos;Om land...&apos;! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land set sale info"/>
+ <action description="Opdel og saml parceller" longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge &apos;Redigér terræn&apos;" name="land divide join"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at ændre parcel navn og en række parametre om f.eks. landingspunkt, teleports m.v.."
- name="Parcel Identity">
- <action
- description="Angive om sted skal vises i &apos;vis i Søg steder&apos; og angivelse af kategori"
- longdescription="Angive om sted skal vises i &apos;vis i Søg steder&apos; og angivelse af kategori i &apos;Om land...&apos; &gt; Indstillinger fanen."
- name="land find places" />
- <action
- description="Ændre parcel navn, beskrivelse, og &apos;Vis i Søg&apos; opsætning"
- longdescription="Ændre parcel navn, beskrivelse, og &apos;Vis i Søg&apos; opsætning. Dette håndteres i &apos;Om land...&apos;&gt; Opsætning fanen."
- name="land change identity" />
- <action description="Sæt landingspunkt og teleport muligheder"
- longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i &apos;Om land...&apos;&gt; Opsætning fanen."
- name="land set landing point" />
+ <action_set description="Disse rettigheder inkluderer adgang til at ændre parcel navn og en række parametre om f.eks. landingspunkt, teleports m.v.." name="Parcel Identity">
+ <action description="Angive om sted skal vises i &apos;vis i Søg steder&apos; og angivelse af kategori" longdescription="Angive om sted skal vises i &apos;vis i Søg steder&apos; og angivelse af kategori i &apos;Om land...&apos; &gt; Indstillinger fanen." name="land find places"/>
+ <action description="Ændre parcel navn, beskrivelse, og &apos;Vis i Søg&apos; opsætning" longdescription="Ændre parcel navn, beskrivelse, og &apos;Vis i Søg&apos; opsætning. Dette håndteres i &apos;Om land...&apos;&gt; Opsætning fanen." name="land change identity"/>
+ <action description="Sæt landingspunkt og teleport muligheder" longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i &apos;Om land...&apos;&gt; Opsætning fanen." name="land set landing point"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at opsætte parcel indstillinger som f.eks. &apos;Lave objekter&apos;, &apos;Redigere terræn&apos;, samt musik og media indstillinger."
- name="Parcel Settings">
- <action description="Ændre musik og media indstillinger"
- longdescription="Ændre oplysninger om streaming musik og film i &apos;Om land...&apos; &gt; Media fanen."
- name="land change media" />
- <action description="Ændre rettighed til &apos;Redigere terræn&apos;"
- longdescription="Ændre rettighed til &apos;Redigere terræn&apos;. *ADVARSEL*: Redigere terræn&apos; kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed."
- name="land edit" />
- <action
- description="Ændre diverse andre indstillinger i &apos;Om land...&apos;&gt; indstillinger fanen"
- longdescription="Giv adgang til at ændre &apos;Sikker (ingen skade)&apos;, &apos;Flyve&apos;, og tillad andre beboere at: &apos;Lave objekter&apos;, &apos;Redigere terræn&apos;, &apos;Lave landemærker&apos;, og &apos;Køre scripts&apos; på gruppe-ejet land via About Land &gt; Indstillinger fanen."
- name="land options" />
+ <action_set description="Disse rettigheder inkluderer adgang til at opsætte parcel indstillinger som f.eks. &apos;Lave objekter&apos;, &apos;Redigere terræn&apos;, samt musik og media indstillinger." name="Parcel Settings">
+ <action description="Ændre musik og media indstillinger" longdescription="Ændre oplysninger om streaming musik og film i &apos;Om land...&apos; &gt; Media fanen." name="land change media"/>
+ <action description="Ændre rettighed til &apos;Redigere terræn&apos;" longdescription="Ændre rettighed til &apos;Redigere terræn&apos;. *ADVARSEL*: Redigere terræn&apos; kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land edit"/>
+ <action description="Ændre diverse andre indstillinger i &apos;Om land...&apos;&gt; indstillinger fanen" longdescription="Giv adgang til at ændre &apos;Sikker (ingen skade)&apos;, &apos;Flyve&apos;, og tillad andre beboere at: &apos;Lave objekter&apos;, &apos;Redigere terræn&apos;, &apos;Lave landemærker&apos;, og &apos;Køre scripts&apos; på gruppe-ejet land via About Land &gt; Indstillinger fanen." name="land options"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at medlemmer kan omgå restriktioner på gruppe-ejede parceller."
- name="Parcel Powers">
- <action description="Tillad altid &apos;Rediger Terræn&apos;"
- longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen."
- name="land allow edit land" />
- <action description="Tillad altid at &apos;Flyve&apos;"
- longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen."
- name="land allow fly" />
- <action description="Tillad altid &apos;Lave objekter&apos;"
- longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen."
- name="land allow create" />
- <action description="Tillad altid at &apos;Lave landemærker&apos;"
- longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen."
- name="land allow landmark" />
- <action description="Tillad altid &apos;sæt til hjem&apos; på gruppe-ejet land"
- longdescription="Medlemmer med denne rolle har adgang til at benytte &apos;Verden&apos; menuen og vælge &apos;sæt til hjem&apos; på en parcel der er dedikeret til gruppen."
- name="land allow set home" />
+ <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan omgå restriktioner på gruppe-ejede parceller." name="Parcel Powers">
+ <action description="Tillad altid &apos;Rediger Terræn&apos;" longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen." name="land allow edit land"/>
+ <action description="Tillad altid at &apos;Flyve&apos;" longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen." name="land allow fly"/>
+ <action description="Tillad altid &apos;Lave objekter&apos;" longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen." name="land allow create"/>
+ <action description="Tillad altid at &apos;Lave landemærker&apos;" longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på &apos;Om land...&apos; &gt; Indstillinger fanen." name="land allow landmark"/>
+ <action description="Tillad altid &apos;sæt til hjem&apos; på gruppe-ejet land" longdescription="Medlemmer med denne rolle har adgang til at benytte &apos;Verden&apos; menuen og vælge &apos;sæt til hjem&apos; på en parcel der er dedikeret til gruppen." name="land allow set home"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at medlemmer kan tillade eller forbyde adgang til gruppe-ejede parceller, inkluderende at &apos;fryse&apos; og udsmide beboere."
- name="Parcel Access">
- <action description="Administrér adgangsregler for parceller"
- longdescription="Administrér adgangsregler for parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen."
- name="land manage allowed" />
- <action description="Administrér liste med blokerede beboere på parceller"
- longdescription="Administrér liste med blokerede beboere på parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen."
- name="land manage banned" />
- <action
- description="Ændre indstillinger for at &apos;Sælge adgang til&apos; parceller"
- longdescription="Ændre indstillinger for at &apos;Sælge adgang til&apos; parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen."
- name="land manage passes" />
- <action
- description="Adgang til at smide beboere ud og &apos;fryse&apos; beboere på parceller"
- longdescription="Medlermmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere&gt;, og vælge &apos;Smid ud...&apos; eller &apos;Frys...&apos;."
- name="land admin" />
+ <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan tillade eller forbyde adgang til gruppe-ejede parceller, inkluderende at &apos;fryse&apos; og udsmide beboere." name="Parcel Access">
+ <action description="Administrér adgangsregler for parceller" longdescription="Administrér adgangsregler for parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen." name="land manage allowed"/>
+ <action description="Administrér liste med blokerede beboere på parceller" longdescription="Administrér liste med blokerede beboere på parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen." name="land manage banned"/>
+ <action description="Ændre indstillinger for at &apos;Sælge adgang til&apos; parceller" longdescription="Ændre indstillinger for at &apos;Sælge adgang til&apos; parceller i &apos;Om land&apos; &gt; &apos;Adgang&apos; fanen." name="land manage passes"/>
+ <action description="Adgang til at smide beboere ud og &apos;fryse&apos; beboere på parceller" longdescription="Medlemmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere&gt;, og vælge &apos;Smid ud...&apos; eller &apos;Frys...&apos;." name="land admin"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet."
- name="Parcel Content">
- <action description="Returnere objekter ejet af gruppen"
- longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen."
- name="land return group owned" />
- <action description="Returnere objekter der er sat til &apos;gruppe&apos;"
- longdescription="Returnere objekter på gruppe-ejede parceller, der er &apos;sat til gruppe&apos; i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen."
- name="land return group set" />
- <action description="Returnere objekter der ikke er ejet af andre"
- longdescription="Returnere objekter på gruppe-ejede parceller, der er &apos;Ejet af andre&apos; i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen."
- name="land return non group" />
- <action description="Ændre landskab med Linden planter"
- longdescription="Mulighed for at ændre landskabet ved at placere og flytte Linden træer, planter, og græs. Disse genstande kan findes i din beholdnings Library &gt; Objects mappe eller de kan oprettes via &apos;Byg&apos; knappen."
- name="land gardening" />
+ <action_set description="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="Parcel Content">
+ <action description="Returnere objekter ejet af gruppen" longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen." name="land return group owned"/>
+ <action description="Returnere objekter der er sat til &apos;gruppe&apos;" longdescription="Returnere objekter på gruppe-ejede parceller, der er &apos;sat til gruppe&apos; i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen." name="land return group set"/>
+ <action description="Returnere objekter der ikke er ejet af andre" longdescription="Returnere objekter på gruppe-ejede parceller, der er &apos;Ejet af andre&apos; i &apos;Om land...&apos;&gt; &apos;Objekter&apos; fanen." name="land return non group"/>
+ <action description="Ændre landskab med Linden planter" longdescription="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="land gardening"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer mulighed til at dedikere, ændre og sælge gruppe-ejede objekter. Disse ændringer sker i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen."
- name="Object Management">
- <action description="Dediker objekter til gruppe"
- longdescription="Dediker objekter til gruppe i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen."
- name="object deed" />
- <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter"
- longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen."
- name="object manipulate" />
- <action description="Sæt gruppe-ejede objekter til salg"
- longdescription="Sæt gruppe-ejede objekter til salg i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen."
- name="object set sale" />
+ <action_set description="Disse rettigheder inkluderer mulighed til at dedikere, ændre og sælge gruppe-ejede objekter. Disse ændringer sker i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen." name="Object Management">
+ <action description="Dediker objekter til gruppe" longdescription="Dediker objekter til gruppe i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen." name="object deed"/>
+ <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter" longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen." name="object manipulate"/>
+ <action description="Sæt gruppe-ejede objekter til salg" longdescription="Sæt gruppe-ejede objekter til salg i &apos;Rediger&apos;&gt; &apos;Generelt&apos; fanen." name="object set sale"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer mulighed til at håndtere betalinger for gruppen og styre adgang til gruppens kontobevægelser."
- name="Accounting">
- <action description="Betale gruppe regninger og modtage gruppe udbytte"
- longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. "
- name="accounting accountable" />
+ <action_set description="Disse rettigheder inkluderer mulighed til at håndtere betalinger for gruppen og styre adgang til gruppens kontobevægelser." name="Accounting">
+ <action description="Betale gruppe regninger og modtage gruppe udbytte" longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. " name="accounting accountable"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at kunne sende, modtage og se gruppe beskeder."
- name="Notices">
- <action description="Send beskeder"
- longdescription="Medlemmer med denne rolle kan sende beskeder i &apos;Beskeder&apos; fanen."
- name="notices send" />
- <action description="Modtage og se tidligere beskeder"
- longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i &apos;Beskeder&apos; fanen."
- name="notices receive" />
+ <action_set description="Disse rettigheder inkluderer adgang til at kunne sende, modtage og se gruppe beskeder." name="Notices">
+ <action description="Send beskeder" longdescription="Medlemmer med denne rolle kan sende beskeder i &apos;Beskeder&apos; fanen." name="notices send"/>
+ <action description="Modtage og se tidligere beskeder" longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i &apos;Beskeder&apos; fanen." name="notices receive"/>
</action_set>
- <action_set
- description="Disse rettigheder inkluderer adgang til at kunne oprette forslag, stemme på forslag og se historik med forslag."
- name="Proposals">
- <action description="Opret forslag"
- longdescription="Medlemmer med denne rolle kan oprette forslag som der kan stemmes om i &apos;Forslag&apos; fanen."
- name="proposal start" />
- <action description="Stem på forslag"
- longdescription="Medlemmer med denne rolle kan stemme på forslag i &apos;Forslag&apos; fanen."
- name="proposal vote" />
+ <action_set description="Disse rettigheder inkluderer adgang til at kunne oprette forslag, stemme på forslag og se historik med forslag." name="Proposals">
+ <action description="Opret forslag" longdescription="Medlemmer med denne rolle kan oprette forslag som der kan stemmes om i &apos;Forslag&apos; fanen." name="proposal start"/>
+ <action description="Stem på forslag" longdescription="Medlemmer med denne rolle kan stemme på forslag i &apos;Forslag&apos; fanen." name="proposal vote"/>
</action_set>
- <action_set
- description="Disse rettigheder styrer hvem der kan deltage i gruppe-chat og gruppe stemme-chat."
- name="Chat">
- <action description="Deltage i gruppe-chat"
- longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner"
- name="join group chat" />
- <action description="Deltag i gruppe stemme-chat"
- longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen &apos;Deltage i gruppe-chat&apos; for at denne rolle har effekt."
- name="join voice chat" />
- <action description="Styr gruppe-chat"
- longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner."
- name="moderate group chat" />
+ <action_set description="Disse rettigheder styrer hvem der kan deltage i gruppe-chat og gruppe stemme-chat." name="Chat">
+ <action description="Deltage i gruppe-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner" name="join group chat"/>
+ <action description="Deltag i gruppe stemme-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen &apos;Deltage i gruppe-chat&apos; for at denne rolle har effekt." name="join voice chat"/>
+ <action description="Styr gruppe-chat" longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner." name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml
new file mode 100644
index 0000000000..27708f5c7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sæt" name="appearance panel">
+ <string name="No Outfit" value="Intet sæt"/>
+ <filter_editor label="Filtrér sæt" name="Filter"/>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Vis flere muligheder"/>
+ <button name="newlook_btn" tool_tip="Tilføj nyt sæt"/>
+ <dnd_button name="trash_btn" tool_tip="Fjern valgte del"/>
+ <button label="Bær" name="wear_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
new file mode 100644
index 0000000000..ae029f5939
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ting" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Profil" name="info_btn"/>
+ <button label="Bær" name="wear_btn"/>
+ <button label="Afspil" name="play_btn"/>
+ <button label="Teleportér" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
new file mode 100644
index 0000000000..685601b922
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Egenskaber for beholdningsgenstand">
+ <panel.string name="unknown">
+ (ukendt)
+ </panel.string>
+ <panel.string name="public">
+ (offentlig)
+ </panel.string>
+ <panel.string name="you_can">
+ Du kan:
+ </panel.string>
+ <panel.string name="owner_can">
+ Ejer kan:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Egenskaber for genstand"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Navn:
+ </text>
+ <text name="LabelItemDescTitle">
+ Beskrivelse:
+ </text>
+ <text name="LabelCreatorTitle">
+ Skaber:
+ </text>
+ <button label="Profil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Ejer:
+ </text>
+ <button label="Profil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Erhvervet:
+ </text>
+ <text name="LabelAcquiredDate">
+ Ons Maj 24 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Dig:
+ </text>
+ <check_box label="Editér" name="CheckOwnerModify"/>
+ <check_box label="Kopiér" name="CheckOwnerCopy"/>
+ <check_box label="Sælg" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Enhver:
+ </text>
+ <check_box label="Kopiér" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppe:
+ </text>
+ <check_box label="Del" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Næste ejer:
+ </text>
+ <check_box label="Editér" name="CheckNextOwnerModify"/>
+ <check_box label="Kopiér" name="CheckNextOwnerCopy"/>
+ <check_box label="Sælg" name="CheckNextOwnerTransfer"/>
+ <check_box label="Til salg" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopiér" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Pris:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
new file mode 100644
index 0000000000..6ade03ce56
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Egenskaber for objekt">
+ <panel.string name="text deed continued">
+ Dedikér
+ </panel.string>
+ <panel.string name="text deed">
+ Dedikér
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Du kan modificere dette objekt
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Du kan modificere disse objekter
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Du kan ikke modificere dette objekt
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Du kan ikke modificere disse objekter
+ </panel.string>
+ <panel.string name="text modify warning">
+ Dette objekt har linkede dele
+ </panel.string>
+ <panel.string name="Cost Default">
+ Pris: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Total pris: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Pris pr.: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Blandet pris
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Blandet salg
+ </panel.string>
+ <panel label="">
+ <text name="Name:">
+ Navn:
+ </text>
+ <text name="Description:">
+ Beskrivelse:
+ </text>
+ <text name="Creator:">
+ Skaber:
+ </text>
+ <text name="Owner:">
+ Ejer:
+ </text>
+ <text name="Group:">
+ Gruppe:
+ </text>
+ <button name="button set group" tool_tip="Vælg en gruppe der skal dele dette objekts rettigheder"/>
+ <name_box initial_value="Henter..." name="Group Name Proxy"/>
+ <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med næste ejers rettigheder. Gruppedelte genstande kan dedikeres af en gruppeadministrator."/>
+ <check_box label="Del" name="checkbox share with group" tool_tip="Tillad alle medlemmer i den angivne gruppe at videregive dine &quot;redigere&quot; rettigheder for dette objekt. Du må dedikere for at tillade rolle begrænsninger."/>
+ <text name="label click action">
+ Klik for at:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Røre (standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sidde på objekt" name="Sitonobject"/>
+ <combo_box.item label="Købe objekt" name="Buyobject"/>
+ <combo_box.item label="Betale til objekt" name="Payobject"/>
+ <combo_box.item label="Ã…bne" name="Open"/>
+ </combo_box>
+ <check_box label="Til salg:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopi" name="Copy"/>
+ <combo_box.item label="Indhold" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Pris: L$" name="Edit Cost"/>
+ <check_box label="Vis i søgning" name="search_check" tool_tip="Lad personer se dette objekt i søgeresultater"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Du kan redigere dette objekt
+ </text>
+ <text name="Anyone can:">
+ Enhver:
+ </text>
+ <check_box label="Flytte" name="checkbox allow everyone move"/>
+ <check_box label="Kopiere" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Næste ejer:
+ </text>
+ <check_box label="Redigere" name="checkbox next owner can modify"/>
+ <check_box label="Kopiere" name="checkbox next owner can copy"/>
+ <check_box label="Overfør" name="checkbox next owner can transfer" tool_tip="Næste ejer kan sælge eller give dette objekt væk"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ Ã…:
+ </text>
+ <text name="G:">
+ O:
+ </text>
+ <text name="E:">
+ R:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel name="button_panel">
+ <button label="Ã…ben" name="open_btn"/>
+ <button label="Betal" name="pay_btn"/>
+ <button label="Køb" name="buy_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ <button label="Gem" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 945833d57a..493bb4cb20 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -4,9 +4,21 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SUPPORT_SITE">
+ Second Life Support Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Detekterer hardware...
+ </string>
+ <string name="StartupLoading">
+ Indlæser
+ </string>
<string name="LoginInProgress">
Logger p. [APP_NAME] kan virke laast. Vent venligst.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Logger på...
+ </string>
<string name="LoginAuthenticating">
Validerer adgang
</string>
@@ -25,11 +37,14 @@
<string name="LoginInitializingMultimedia">
Klargør multimedia...
</string>
+ <string name="LoginInitializingFonts">
+ Indlæser fonts...
+ </string>
<string name="LoginVerifyingCache">
- Verificérer cache filer (kan tage 60-90 sekunder)...
+ Checker cache filer (kan tage 60-90 sekunder)...
</string>
<string name="LoginProcessingResponse">
- Behandler svar...
+ Behandler svar ...
</string>
<string name="LoginInitializingWorld">
Initialiserer verden...
@@ -55,6 +70,12 @@
<string name="LoginDownloadingClothing">
Henter tøj...
</string>
+ <string name="LoginFailedNoNetwork">
+ Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
+ </string>
+ <string name="Quit">
+ Afslut
+ </string>
<string name="AgentLostConnection">
Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
</string>
@@ -73,39 +94,9 @@
<string name="TooltipIsGroup">
(Gruppe)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Fysik
- </string>
- <string name="TooltipFlagTouch">
- Rør
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Drop beholdning
- </string>
- <string name="TooltipFlagPhantom">
- Fantom
- </string>
- <string name="TooltipFlagTemporary">
- Temporær
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Højre-klik for menu)
- </string>
- <string name="TooltipFreeToCopy">
- Kan kopieres
- </string>
<string name="TooltipForSaleL$">
Til salg: L$[AMOUNT]
</string>
- <string name="TooltipForSaleMsg">
- Til salg: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Gruppe byg
</string>
@@ -133,6 +124,76 @@
<string name="TooltipMustSingleDrop">
Kun et enkelt element kan trækkes ind her
</string>
+ <string name="TooltipHttpUrl">
+ Klik for at se denne hjemmeside
+ </string>
+ <string name="TooltipSLURL">
+ Klik for at se information om denne lokation
+ </string>
+ <string name="TooltipAgentUrl">
+ Klik for at denne beboers profil
+ </string>
+ <string name="TooltipGroupUrl">
+ Klik for at se denne gruppes beskrivelse
+ </string>
+ <string name="TooltipEventUrl">
+ Klik for at se beskrivelse af denne event
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Klik for at se denne annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Klik for at se beskrivelse for denne parcel
+ </string>
+ <string name="TooltipTeleportUrl">
+ Klik for at teleportere til denne lokation
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Klik for at se beskrivelse for dette objekt
+ </string>
+ <string name="TooltipMapUrl">
+ Klik for at se denne lokation på kortet
+ </string>
+ <string name="TooltipSLAPP">
+ Klik for at starte secondlife:// kommando
+ </string>
+ <string name="CurrentURL" value=" Nuværende URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportér til
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Vis kort for
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Luk (&#8984;W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Luk (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Gendan
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimér
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Løsriv
+ </string>
+ <string name="BUTTON_DOCK">
+ Fastgør
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Frigør
+ </string>
+ <string name="BUTTON_HELP">
+ Vis hjælp
+ </string>
+ <string name="Searching">
+ Søger...
+ </string>
+ <string name="NoneFound">
+ Intet fundet.
+ </string>
<string name="RetrievingData">
Henter...
</string>
@@ -187,8 +248,77 @@
<string name="AssetErrorUnknownStatus">
Ukendt status
</string>
- <string name="AvatarEditingApparance">
- (Ændrer udseende)
+ <string name="texture">
+ tekstur
+ </string>
+ <string name="sound">
+ lyd
+ </string>
+ <string name="calling card">
+ visitkort
+ </string>
+ <string name="landmark">
+ landemærke
+ </string>
+ <string name="legacy script">
+ ældre script
+ </string>
+ <string name="clothing">
+ tøj
+ </string>
+ <string name="object">
+ objekt
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ mappe
+ </string>
+ <string name="root">
+ rod
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ kropsdel
+ </string>
+ <string name="snapshot">
+ foto
+ </string>
+ <string name="lost and found">
+ Fundne genstande
+ </string>
+ <string name="targa image">
+ targa billede
+ </string>
+ <string name="trash">
+ Papirkurv
+ </string>
+ <string name="jpeg image">
+ jpeg billede
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ bevægelse
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorit
+ </string>
+ <string name="symbolic link">
+ link
</string>
<string name="AvatarAway">
Væk
@@ -407,17 +537,80 @@
Ja
</string>
<string name="texture_loading">
- Henter...
+ Indlæser...
</string>
<string name="worldmap_offline">
Offline
</string>
+ <string name="worldmap_results_none_found">
+ Ingen fundet.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fil slutter for tidligt
+ </string>
+ <string name="ST_NO_JOINT">
+ Kan ikke funde ROOT eller JOINT.
+ </string>
<string name="whisper">
hvisker:
</string>
<string name="shout">
råber:
</string>
+ <string name="ringing">
+ Forbinder til stemmechat...
+ </string>
+ <string name="connected">
+ Forbundet
+ </string>
+ <string name="unavailable">
+ Stemmechat er ikke tilladt hvor du befinder dig
+ </string>
+ <string name="hang_up">
+ Stemme chat er afbrudt
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tag Linden dollars (L$) fra dig
+ </string>
+ <string name="ActOnControlInputs">
+ Reagér på dine kontrol-taster
+ </string>
+ <string name="RemapControlInputs">
+ Ændre dine kontrol-taster
+ </string>
+ <string name="AnimateYourAvatar">
+ Animér din avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Sæt på din avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Fjern ejerskabet og sæt til offentlig
+ </string>
+ <string name="LinkAndDelink">
+ Sammenkæd og adskil andre genstande
+ </string>
+ <string name="AddAndRemoveJoints">
+ Tilføj og fjern sammenkødninger med andre genstande
+ </string>
+ <string name="ChangePermissions">
+ Ændre dens tilladelser
+ </string>
+ <string name="TrackYourCamera">
+ Spor dit kamera
+ </string>
+ <string name="ControlYourCamera">
+ Kontrollér dit kamera
+ </string>
<string name="SIM_ACCESS_PG">
PG
</string>
@@ -436,8 +629,6 @@
<string name="land_type_unknown">
(ukendt)
</string>
- <string name="covenant_never_modified">Sidst ændret: (aldrig)</string>
- <string name="covenant_modified">Sidst ændret: </string>
<string name="all_files">
Alle filer
</string>
@@ -483,18 +674,733 @@
<string name="choose_the_directory">
Vælg bibliotek
</string>
- <string name="accel-mac-control">
- &#8963;
+ <string name="AvatarSetNotAway">
+ Sæt &quot;til stede&quot;
+ </string>
+ <string name="AvatarSetAway">
+ Sæt &quot;væk&quot;
+ </string>
+ <string name="AvatarSetNotBusy">
+ Sæt &quot;ledig&quot;
+ </string>
+ <string name="AvatarSetBusy">
+ Sæt &quot;optaget&quot;
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Hud
+ </string>
+ <string name="hair">
+ HÃ¥r
+ </string>
+ <string name="eyes">
+ Øjne
+ </string>
+ <string name="shirt">
+ Trøje
+ </string>
+ <string name="pants">
+ Bukser
+ </string>
+ <string name="shoes">
+ Sko
+ </string>
+ <string name="socks">
+ Strømper
+ </string>
+ <string name="jacket">
+ Jakke
+ </string>
+ <string name="gloves">
+ Handsker
+ </string>
+ <string name="undershirt">
+ Undertrøje
+ </string>
+ <string name="underpants">
+ Underbukser
+ </string>
+ <string name="skirt">
+ Nederdel
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatovering
+ </string>
+ <string name="invalid">
+ ugyldig
+ </string>
+ <string name="next">
+ Næste
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppe besked
+ </string>
+ <string name="GroupNotifySentBy">
+ Sendt af
+ </string>
+ <string name="GroupNotifyAttached">
+ Vedhæftet:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Se tidligere beskeder eller slå modtagelse af beskeder fra her.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Åben vedhæng
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Gem vedhæng
+ </string>
+ <string name="TeleportOffer">
+ Teleport tilbud
+ </string>
+ <string name="StartUpNotification">
+ %d nye besked modtaget mens du var væk...
+ </string>
+ <string name="StartUpNotifications">
+ %d nye beskeder modtaget mens du var væk......
+ </string>
+ <string name="OverflowInfoChannelString">
+ Du har %d mere besked(er)
+ </string>
+ <string name="BodyPartsRightArm">
+ Højre arm
+ </string>
+ <string name="BodyPartsHead">
+ Hoved
+ </string>
+ <string name="BodyPartsLeftArm">
+ Venstre arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Venstre ben
+ </string>
+ <string name="BodyPartsTorso">
+ Overkrop
+ </string>
+ <string name="BodyPartsRightLeg">
+ Højre ben
+ </string>
+ <string name="GraphicsQualityLow">
+ Lav
+ </string>
+ <string name="GraphicsQualityMid">
+ Middel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Høj
+ </string>
+ <string name="LeaveMouselook">
+ Tryk ESC for at skift til normalt udsyn
+ </string>
+ <string name="InventoryNoMatchingItems">
+ No matching items found in inventory.
+ </string>
+ <string name="InventoryNoTexture">
+ Du har ikke en kopi af denne
+tekstur i din beholdning.
+ </string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="no_modify" value=" (ikke redigere)"/>
+ <string name="no_copy" value=" (ikke kopiere)"/>
+ <string name="worn" value=" (båret)"/>
+ <string name="link" value=" (sammenkæde)"/>
+ <string name="broken_link" value=" (brudt_kæde)"/>
+ <string name="LoadingContents">
+ Henter indhold...
+ </string>
+ <string name="NoContents">
+ Intet indhold
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
+ <string name="Chat" value=" Chat : "/>
+ <string name="Sound" value=" Lyd : "/>
+ <string name="Wait" value=" --- Vent : "/>
+ <string name="AnimFlagStop" value=" Stop Animation : "/>
+ <string name="AnimFlagStart" value=" Start Animation : "/>
+ <string name="Wave" value=" Vink "/>
+ <string name="HelloAvatar" value=" Hej, avatar! "/>
+ <string name="ViewAllGestures" value=" Se alle &gt;&gt;"/>
+ <string name="Animations" value=" Animationer,"/>
+ <string name="Calling Cards" value=" Visitkort,"/>
+ <string name="Clothing" value=" Tøj,"/>
+ <string name="Gestures" value=" Bevægelser,"/>
+ <string name="Landmarks" value=" Landemærker,"/>
+ <string name="Notecards" value=" Note,"/>
+ <string name="Objects" value=" Objekter,"/>
+ <string name="Scripts" value=" Scripts,"/>
+ <string name="Sounds" value=" Lyde,"/>
+ <string name="Textures" value=" Teksturer,"/>
+ <string name="Snapshots" value=" Fotos,"/>
+ <string name="No Filters" value="Nej "/>
+ <string name="Since Logoff" value=" - Siden log ud"/>
+ <string name="InvFolder My Inventory">
+ Min beholdning
+ </string>
+ <string name="InvFolder My Favorites">
+ Mine favoritter
+ </string>
+ <string name="InvFolder Library">
+ Bibliotek
+ </string>
+ <string name="InvFolder Textures">
+ Teksturer
+ </string>
+ <string name="InvFolder Sounds">
+ Lyde
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitkort
+ </string>
+ <string name="InvFolder Landmarks">
+ Landemærker
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Tøj
+ </string>
+ <string name="InvFolder Objects">
+ Objekter
+ </string>
+ <string name="InvFolder Notecards">
+ Noter
+ </string>
+ <string name="InvFolder New Folder">
+ Ny mappe
+ </string>
+ <string name="InvFolder Inventory">
+ Beholdning
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Ukomprimerede billeder
+ </string>
+ <string name="InvFolder Body Parts">
+ Kropsdele
+ </string>
+ <string name="InvFolder Trash">
+ Papirkurv
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundne genstande
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Ukomprimerede lyde
+ </string>
+ <string name="InvFolder Animations">
+ Animationer
+ </string>
+ <string name="InvFolder Gestures">
+ Bevægelser
+ </string>
+ <string name="InvFolder favorite">
+ Favoritter
+ </string>
+ <string name="InvFolder Current Outfit">
+ Nuværende sæt
+ </string>
+ <string name="InvFolder My Outfits">
+ Mine sæt
+ </string>
+ <string name="InvFolder Friends">
+ Venner
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="Buy">
+ Køb
+ </string>
+ <string name="BuyforL$">
+ Køb for L$
+ </string>
+ <string name="Stone">
+ Sten
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Træ
+ </string>
+ <string name="Flesh">
+ Kød
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Lys
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Bryst
+ </string>
+ <string name="Skull">
+ Hovedskal
+ </string>
+ <string name="Left Shoulder">
+ Venstre skulder
+ </string>
+ <string name="Right Shoulder">
+ Højre skulder
+ </string>
+ <string name="Left Hand">
+ Venstre hånd
+ </string>
+ <string name="Right Hand">
+ Højre hånd
+ </string>
+ <string name="Left Foot">
+ Venstre fod
+ </string>
+ <string name="Right Foot">
+ Højre fod
+ </string>
+ <string name="Spine">
+ Rygsøjle
+ </string>
+ <string name="Pelvis">
+ Bækken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Hage
+ </string>
+ <string name="Left Ear">
+ Venstre øre
+ </string>
+ <string name="Right Ear">
+ Højre øre
+ </string>
+ <string name="Left Eyeball">
+ Venstre øje
+ </string>
+ <string name="Right Eyeball">
+ Højre øje
+ </string>
+ <string name="Nose">
+ Næse
+ </string>
+ <string name="R Upper Arm">
+ H overarm
+ </string>
+ <string name="R Forearm">
+ H underarm
+ </string>
+ <string name="L Upper Arm">
+ V overarm
+ </string>
+ <string name="L Forearm">
+ V underarm
+ </string>
+ <string name="Right Hip">
+ Højre hofte
+ </string>
+ <string name="R Upper Leg">
+ Højre lår
+ </string>
+ <string name="R Lower Leg">
+ H underben
+ </string>
+ <string name="Left Hip">
+ Venstre hofte
+ </string>
+ <string name="L Upper Leg">
+ Venstre lår
+ </string>
+ <string name="L Lower Leg">
+ V underben
+ </string>
+ <string name="Stomach">
+ Mave
+ </string>
+ <string name="Left Pec">
+ Venstre bryst
+ </string>
+ <string name="Right Pec">
+ Højre bryst
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] gammel
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] gammel
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] gammel
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] gammel
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] gammel
+ </string>
+ <string name="TodayOld">
+ Med fra i dag
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] år
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] år
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] måned
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] måneder
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] måneder
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] uge
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] uger
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] uger
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] medlem
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] medlemmer
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] medlemmer
+ </string>
+ <string name="AcctTypeResident">
+ Beboer
+ </string>
+ <string name="AcctTypeTrial">
+ På prøve
</string>
- <string name="accel-mac-command">
- &#8984;
+ <string name="AcctTypeCharterMember">
+ Æresmedlemmer
</string>
- <string name="accel-mac-option">
- &#8997;
+ <string name="AcctTypeEmployee">
+ Linden Lab medarbejder
</string>
- <string name="accel-mac-shift">
- &#8679;
+ <string name="PaymentInfoUsed">
+ Betalende medlem
</string>
+ <string name="PaymentInfoOnFile">
+ Betalingsinfo registreret
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ingen betalingsinfo
+ </string>
+ <string name="AgeVerified">
+ Alders-checket
+ </string>
+ <string name="NotAgeVerified">
+ Ikke alders-checket
+ </string>
+ <string name="Center 2">
+ Center 2
+ </string>
+ <string name="Top Right">
+ Øverst højre
+ </string>
+ <string name="Top">
+ Top
+ </string>
+ <string name="Top Left">
+ Øverst venstre
+ </string>
+ <string name="Center">
+ Centrum
+ </string>
+ <string name="Bottom Left">
+ Nederst venstre
+ </string>
+ <string name="Bottom">
+ Nederst midt
+ </string>
+ <string name="Bottom Right">
+ nederst højre
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Hentet, kompilerer nu
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script ikke fundet på server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem ved download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Ikke rettigheder til at downloade script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Ikke nok rettigheder til at
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Ukendt fejl ved download
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilering fremskridt
+ </string>
+ <string name="CompileQueueStart">
+ Rekompilér
+ </string>
+ <string name="ResetQueueTitle">
+ Nulstil fremskridt
+ </string>
+ <string name="ResetQueueStart">
+ nulstil
+ </string>
+ <string name="RunQueueTitle">
+ Sæt &quot;running&quot; fremskridt
+ </string>
+ <string name="RunQueueStart">
+ sæt til &quot;running&quot;
+ </string>
+ <string name="NotRunQueueTitle">
+ Sæt &quot;Not Running&quot; fremskridt
+ </string>
+ <string name="NotRunQueueStart">
+ sæt til &quot;not running&quot;
+ </string>
+ <string name="CompileSuccessful">
+ Kompleret uden fejl!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompileret uden fejl, gemmer...
+ </string>
+ <string name="SaveComplete">
+ Gemt.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (&quot;object out of range&quot;)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT] ejet af [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ingen
+ </string>
+ <string name="Group" value=" (gruppe)"/>
+ <string name="Unknown">
+ (ukendt)
+ </string>
+ <string name="SummaryForTheWeek" value="Opsummering for denne uge, begyndende med "/>
+ <string name="NextStipendDay" value="Næste stipendie dag er "/>
+ <string name="GroupIndividualShare" value=" Gruppe Individuel Delt"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Kredit
+ </string>
+ <string name="Debits">
+ Debet
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Ingen gruppedata fundet for gruppe
+ </string>
+ <string name="IMParentEstate">
+ overordnet estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ fejl
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle estates ejet af [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle estates du ejer
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle estates du administrerer for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Godkendte beboere: ([ALLOWEDAGENTS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Linie [LINE], Kolonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] fundet
+ </string>
+ <string name="PanelContentsNewScript">
+ Nyt script
+ </string>
+ <string name="MuteByName">
+ (efter navn)
+ </string>
+ <string name="MuteAgent">
+ (beboer)
+ </string>
+ <string name="MuteObject">
+ (objekt)
+ </string>
+ <string name="MuteGroup">
+ (gruppe)
+ </string>
+ <string name="RegionNoCovenant">
+ Der er ingen regler for dette estate.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Der er ingen regler for dette estate. Land på dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg.
+ </string>
+ <string name="covenant_last_modified">
+ Sidst ændret:
+ </string>
+ <string name="none_text" value=" (ingen) "/>
+ <string name="never_text" value=" (aldrig) "/>
+ <string name="GroupOwned">
+ Gruppe ejet
+ </string>
+ <string name="Public">
+ Offentlig
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klik: [TELEPORT] teleport, [MAP] kort, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vil blive opdateret efter offentliggørelse)
+ </string>
+ <string name="MultiPreviewTitle">
+ Vis først
+ </string>
+ <string name="MultiPropertiesTitle">
+ Egenskaber
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Et objekt med navnet
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ ejet af gruppen
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ ejet af en ukendt gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ ejet af
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ ejet af en ukendt bruger
+ </string>
+ <string name="InvOfferGaveYou">
+ gav dig
+ </string>
+ <string name="InvOfferYouDecline">
+ Du afslår
+ </string>
+ <string name="InvOfferFrom">
+ fra
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ købt
+ </string>
+ <string name="GroupMoneyPaidYou">
+ betalte dig
+ </string>
+ <string name="GroupMoneyPaidInto">
+ betalt til
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ købte adgang til
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ betalte gebyr for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ betalte prisen for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Kredit
+ </string>
+ <string name="GroupMoneyDebits">
+ Debet
+ </string>
+ <string name="ViewerObjectContents">
+ Indhold
+ </string>
+ <string name="AcquiredItems">
+ Anskaffede genstande
+ </string>
+ <string name="Cancel">
+ Annullér
+ </string>
+ <string name="UploadingCosts">
+ Uploader [%s] omkostninger
+ </string>
+ <string name="UnknownFileExtension">
+ Ukendt fil efternavn [.%s]
+Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Tilføj landemærke...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Redigér landemærke...
+ </string>
+ <string name="accel-mac-control">&#8963;</string>
+ <string name="accel-mac-command">&#8984;</string>
+ <string name="accel-mac-option">&#8997;</string>
+ <string name="accel-mac-shift">&#8679;</string>
<string name="accel-win-control">
Ctrl+
</string>
@@ -504,81 +1410,1790 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
+ <string name="FileSaved">
+ Fil gemt
+ </string>
+ <string name="Receiving">
+ Modtager
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Fremad
+ </string>
+ <string name="Left">
+ Venstre
+ </string>
+ <string name="Right">
+ Højre
+ </string>
+ <string name="Back">
+ Bagud
+ </string>
+ <string name="North">
+ Nord
+ </string>
+ <string name="South">
+ Syd
+ </string>
+ <string name="West">
+ Vest
+ </string>
+ <string name="East">
+ Øst
+ </string>
+ <string name="Up">
+ Op
+ </string>
+ <string name="Down">
+ Ned
+ </string>
+ <string name="Any Category">
+ Enhver kategori
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land til leje
+ </string>
+ <string name="Property Rental">
+ Grunde til leje
+ </string>
+ <string name="Special Attraction">
+ Speciel attraktion
+ </string>
+ <string name="New Products">
+ Nye produkter
+ </string>
+ <string name="Employment">
+ Jobs
+ </string>
+ <string name="Wanted">
+ Søges
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personlig
+ </string>
+ <string name="None">
+ Ingen
+ </string>
+ <string name="Linden Location">
+ Linden sted
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; kultur
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Uddannelse
+ </string>
+ <string name="Gaming">
+ Spil
+ </string>
+ <string name="Hangout">
+ Afslapning
+ </string>
+ <string name="Newcomer Friendly">
+ Nybegynder venligt
+ </string>
+ <string name="Parks&amp;Nature">
+ Parker &amp; natur
+ </string>
+ <string name="Residential">
+ Beboelse
+ </string>
+ <string name="Stage">
+ Fase
+ </string>
+ <string name="Other">
+ Andet
+ </string>
+ <string name="Any">
+ Enhver
+ </string>
+ <string name="You">
+ Dig
+ </string>
+ <string name="Multiple Media">
+ Flere medietyper
+ </string>
+ <string name="Play Media">
+ Afspil/Pause medie
+ </string>
+ <string name="MBCmdLineError">
+ Der opstod en fejl ved afvikling af kommandolinie.
+Se venligst: http://wiki.secondlife.com/wiki/Client_parameters
+Fejl:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Kommando linie brug:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kan ikke få adgang til fil den/det skal bruge.
+
+Dette kan skyldes at du har flere kopier kørende eller operativsystemet tror at filen allerede er åben.
+Hvis fejlen bliver ved, genstart computer og prøv igen.
+Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NAME] og installere igen.
+ </string>
+ <string name="MBFatalError">
+ Fatal fejl
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] kræver en processor med AltiVec (G4 eller nyere).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] kører allerede.
+Undersøg din &quot;task bar&quot; for at se efter minimeret version af programmet.
+Hvis fejlen fortsætter, prøv at genstarte din computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] ser ud til at være &quot;frosset&quot; eller gået ned tidligere.
+Ønsker du at sende en fejlrapport?
+ </string>
+ <string name="MBAlert">
+ Besked
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kan ikke detektere DirectX 9.0b eller nyere.
+[APP_NAME] benytte DirectX til at detektere hardware og/eller forældede drivere der kan give problemer med stabilitet, dårlig hastighed eller nedbrud. Selvom du kan køre [APP_NAME] uden det, anbefaler vi meget at køre med DirectX 9.0b.
+
+Ønsker du at fortsætte?
+ </string>
+ <string name="MBWarning">
+ Advarsel
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatisk opdatering er endnu ikke implementeret på Linux.
+Hent venligst den nyeste version på www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fejlede
+ </string>
+ <string name="MBError">
+ Fejl
+ </string>
+ <string name="MBFullScreenErr">
+ Ikke muligt at køre i fuldskærm med [WIDTH] x [HEIGHT].
+Afvikler i vindue.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Nedlukningsfejl ved lukning af vindue (DestroyWindow() fejlede)
+ </string>
+ <string name="MBShutdownErr">
+ Fejl ved nedlukning
+ </string>
+ <string name="MBDevContextErr">
+ Kan ikke oprette &quot;GL device context&quot;
+ </string>
+ <string name="MBPixelFmtErr">
+ Kan ikke finde passende &quot;pixel format&quot;
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Kan ikke finde &quot;pixel format&quot; beskrivelse
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] kræver &quot;True Color (32-bit)&quot; for at kunne køre.
+Gå venligst til din computers skærmopsætning og sæt &quot;color mode&quot; til 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kan ikke køre, da den ikke kan finde en &quot;8 bit alpha channel&quot;. Normalt skyldes dette et problem med en video driver.
+Venligst undersøg om du har de nyeste drivere til dit videokort installeret.
+Din skærm skal også være sat op til at køre &quot;True Color (32-bit)&quot; i din displayopsætning.
+Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Kan ikke sætte &quot;pixel format&quot;
+ </string>
+ <string name="MBGLContextErr">
+ Kan ikke oprette &quot;GL rendering context&quot;
+ </string>
+ <string name="MBGLContextActErr">
+ Kan ikke aktivere &quot;GL rendering context&quot;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem.
+
+Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Skægstubbe
+ </string>
+ <string name="All White">
+ Helt hvidt
+ </string>
+ <string name="Anime Eyes">
+ Store øjne
+ </string>
+ <string name="Arced">
+ Spidst
+ </string>
+ <string name="Arm Length">
+ Armængde
+ </string>
+ <string name="Attached">
+ Vedhæftet
+ </string>
+ <string name="Attached Earlobes">
+ Vedhæftede øreflipper
+ </string>
+ <string name="Back Bangs">
+ Nakkehår
+ </string>
+ <string name="Back Bangs Down">
+ Nakkehår langt
+ </string>
+ <string name="Back Bangs Up">
+ Nakkehår kort
+ </string>
+ <string name="Back Fringe">
+ Nakkehår
+ </string>
+ <string name="Back Hair">
+ Volumen
+ </string>
+ <string name="Back Hair Down">
+ Volumen nedad
+ </string>
+ <string name="Back Hair Up">
+ Volumen op
+ </string>
+ <string name="Baggy">
+ Posede
+ </string>
+ <string name="Bangs">
+ Pandehår
+ </string>
+ <string name="Bangs Down">
+ Pandehår ned
+ </string>
+ <string name="Bangs Up">
+ Pandehår op
+ </string>
+ <string name="Beady Eyes">
+ Stikkende øjne
+ </string>
+ <string name="Belly Size">
+ Mave størrelse
+ </string>
+ <string name="Big">
+ Stor
+ </string>
+ <string name="Big Butt">
+ Stor bagdel
+ </string>
+ <string name="Big Eyeball">
+ Store øjenæbler
+ </string>
+ <string name="Big Hair Back">
+ Stort hår: Bag
+ </string>
+ <string name="Big Hair Front">
+ Stort hår: Foran
+ </string>
+ <string name="Big Hair Top">
+ Stort hår: Top
+ </string>
+ <string name="Big Head">
+ Stort hovede
+ </string>
+ <string name="Big Pectorals">
+ Store brystmuskler
+ </string>
+ <string name="Big Spikes">
+ Store spikes
+ </string>
+ <string name="Black">
+ Sort
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondt hår
+ </string>
+ <string name="Blush">
+ Rødmen
+ </string>
+ <string name="Blush Color">
+ Rødme farve
+ </string>
+ <string name="Blush Opacity">
+ Rødme gennemsigtighed
+ </string>
+ <string name="Body Definition">
+ Kropskontur
+ </string>
+ <string name="Body Fat">
+ Kropsfedt
+ </string>
+ <string name="Body Freckles">
+ Fregner på kroppen
+ </string>
+ <string name="Body Thick">
+ Tyk krop
+ </string>
+ <string name="Body Thickness">
+ Kropstykkelse
+ </string>
+ <string name="Body Thin">
+ Tynd krop
+ </string>
+ <string name="Bow Legged">
+ Hjulbenet
+ </string>
+ <string name="Breast Buoyancy">
+ Bryst tyngdepåvirkning
+ </string>
+ <string name="Breast Cleavage">
+ Kavalergang
+ </string>
+ <string name="Breast Size">
+ Bryststørrelse
+ </string>
+ <string name="Bridge Width">
+ Bredde næseryg
+ </string>
+ <string name="Broad">
+ Bred
+ </string>
+ <string name="Brow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Bug Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bugged Eyes">
+ Udstående øjne
+ </string>
+ <string name="Bulbous">
+ Kartoffelnæse
+ </string>
+ <string name="Bulbous Nose">
+ Kartoffelnæse
+ </string>
+ <string name="Bushy Eyebrows">
+ Buskede øjenbryn
+ </string>
+ <string name="Bushy Hair">
+ Busket hår
+ </string>
+ <string name="Butt Size">
+ Størrelse bagdel
+ </string>
+ <string name="bustle skirt">
+ Tournure
+ </string>
+ <string name="no bustle">
+ Ingen tournure
+ </string>
+ <string name="more bustle">
+ Mere tournure
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Kindben
+ </string>
+ <string name="Chest Size">
+ Bryst størrelse
+ </string>
+ <string name="Chin Angle">
+ Hage form
+ </string>
+ <string name="Chin Cleft">
+ Hagekløft
+ </string>
+ <string name="Chin Curtains">
+ Hageskæg
+ </string>
+ <string name="Chin Depth">
+ Hage dybde
+ </string>
+ <string name="Chin Heavy">
+ Stort forneden
+ </string>
+ <string name="Chin In">
+ Vigende hage
+ </string>
+ <string name="Chin Out">
+ Hage frem
+ </string>
+ <string name="Chin-Neck">
+ Hals under hage
+ </string>
+ <string name="Clear">
+ Slet
+ </string>
+ <string name="Cleft">
+ Kløft
+ </string>
+ <string name="Close Set Eyes">
+ Tætsiddende øjne
+ </string>
+ <string name="Closed">
+ Lukket
+ </string>
+ <string name="Closed Back">
+ Lukket bagtil
+ </string>
+ <string name="Closed Front">
+ Lukket foran
+ </string>
+ <string name="Closed Left">
+ Lukket til venstre
+ </string>
+ <string name="Closed Right">
+ Lukket til højre
+ </string>
+ <string name="Coin Purse">
+ Lille
+ </string>
+ <string name="Collar Back">
+ Krave bagtil
+ </string>
+ <string name="Collar Front">
+ Krave foran
+ </string>
+ <string name="Corner Down">
+ Nedadvendt
+ </string>
+ <string name="Corner Normal">
+ Normalt
+ </string>
+ <string name="Corner Up">
+ Opadvendt
+ </string>
+ <string name="Creased">
+ Rynket
+ </string>
+ <string name="Crooked Nose">
+ Skæv næse
+ </string>
+ <string name="Cropped Hair">
+ Kort hår
+ </string>
+ <string name="Cuff Flare">
+ Svaj
+ </string>
+ <string name="Dark">
+ Mørk
+ </string>
+ <string name="Dark Green">
+ Mørkegrøn
+ </string>
+ <string name="Darker">
+ Mørkere
+ </string>
+ <string name="Deep">
+ Dyb
+ </string>
+ <string name="Default Heels">
+ Standard hæle
+ </string>
+ <string name="Default Toe">
+ Standard snude
+ </string>
+ <string name="Dense">
+ Tæt
+ </string>
+ <string name="Dense hair">
+ Tæt hår
+ </string>
+ <string name="Double Chin">
+ Dobbelthage
+ </string>
+ <string name="Downturned">
+ Peger nedad
+ </string>
+ <string name="Duffle Bag">
+ Stort
+ </string>
+ <string name="Ear Angle">
+ Øre vinkel
+ </string>
+ <string name="Ear Size">
+ Øre størrelse
+ </string>
+ <string name="Ear Tips">
+ Ørespidser
+ </string>
+ <string name="Egg Head">
+ Ovalt hovede
+ </string>
+ <string name="Eye Bags">
+ Poser under øjne
+ </string>
+ <string name="Eye Color">
+ Øjenfarve
+ </string>
+ <string name="Eye Depth">
+ Øjendybde
+ </string>
+ <string name="Eye Lightness">
+ Øjennuance
+ </string>
+ <string name="Eye Opening">
+ Øjenåbning
+ </string>
+ <string name="Eye Pop">
+ Øjensymmetri
+ </string>
+ <string name="Eye Size">
+ Øjenstørrelse
+ </string>
+ <string name="Eye Spacing">
+ Øjenafstand
+ </string>
+ <string name="Eyeball Size">
+ Størrelse øjenæble
+ </string>
+ <string name="Eyebrow Arc">
+ Bue på øjenbryn
+ </string>
+ <string name="Eyebrow Density">
+ Tæthed øjenbryn
+ </string>
+ <string name="Eyebrow Height">
+ Højde på øjenbryn
+ </string>
+ <string name="Eyebrow Points">
+ Løftede øjenbryn
+ </string>
+ <string name="Eyebrow Size">
+ Størrelse øjenbryn
+ </string>
+ <string name="Eyelash Length">
+ Længde øjenvipper
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner farve
+ </string>
+ <string name="Eyes Back">
+ Dybtliggende øjne
+ </string>
+ <string name="Eyes Bugged">
+ Udstående øjne
+ </string>
+ <string name="Eyes Forward">
+ Øjne fremme
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Eyes Shear Left Up
+ </string>
+ <string name="Eyes Shear Right Up">
+ Eyes Shear Right Up
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Stor afstand
+ </string>
+ <string name="Eyes Sunken">
+ Indsunkne øjne
+ </string>
+ <string name="Eyes Together">
+ Tætsiddende
+ </string>
+ <string name="Face Shear">
+ Ansigts symmetri
+ </string>
+ <string name="Facial Definition">
+ Ansigtskonturer
+ </string>
+ <string name="Far Set Eyes">
+ Stor afstand mellem øjne
+ </string>
+ <string name="Fat">
+ Tyk
+ </string>
+ <string name="Fat Head">
+ Tykt hovede
+ </string>
+ <string name="Fat Lips">
+ Tykke læber
+ </string>
+ <string name="Fat Lower">
+ Tyk nedre
+ </string>
+ <string name="Fat Lower Lip">
+ Tyk underlæbe
+ </string>
+ <string name="Fat Torso">
+ Tyk overkrop
+ </string>
+ <string name="Fat Upper">
+ Tyk øvre
+ </string>
+ <string name="Fat Upper Lip">
+ Tyk overlæbe
+ </string>
+ <string name="Female">
+ Kvinde
+ </string>
+ <string name="Fingerless">
+ Fingerløse
+ </string>
+ <string name="Fingers">
+ Fingre
+ </string>
+ <string name="Flared Cuffs">
+ Stor vidde
+ </string>
+ <string name="Flat">
+ Flad
+ </string>
+ <string name="Flat Butt">
+ Flad bagdel
+ </string>
+ <string name="Flat Head">
+ Fladt hovede
+ </string>
+ <string name="Flat Toe">
+ Flad snude
+ </string>
+ <string name="Foot Size">
+ Størrelse fod
+ </string>
+ <string name="Forehead Angle">
+ Pande vinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stort foroven
+ </string>
+ <string name="Freckles">
+ Fregner
+ </string>
+ <string name="Front Bangs Down">
+ Pandehår - ned
+ </string>
+ <string name="Front Bangs Up">
+ Pandehår - op
+ </string>
+ <string name="Front Fringe">
+ Frynser foran
+ </string>
+ <string name="Front Hair">
+ HÃ¥r foran
+ </string>
+ <string name="Front Hair Down">
+ HÃ¥r foran - ned
+ </string>
+ <string name="Front Hair Up">
+ HÃ¥r foran - op
+ </string>
+ <string name="Full Back">
+ Langt ud bagtil
+ </string>
+ <string name="Full Eyeliner">
+ Meget eyeliner
+ </string>
+ <string name="Full Front">
+ Langt frem fortil
+ </string>
+ <string name="Full Hair Sides">
+ HÃ¥r i siderne
+ </string>
+ <string name="Full Sides">
+ Meget hår
+ </string>
+ <string name="Glossy">
+ Skinnende
+ </string>
+ <string name="Glove Fingers">
+ Fingre i handsker
+ </string>
+ <string name="Glove Length">
+ Handskelængde
+ </string>
+ <string name="Hair">
+ HÃ¥r
+ </string>
+ <string name="Hair Back">
+ HÃ¥r: Bagtil
+ </string>
+ <string name="Hair Front">
+ HÃ¥r: Foran
+ </string>
+ <string name="Hair Sides">
+ HÃ¥r: Siderne
+ </string>
+ <string name="Hair Sweep">
+ Strøget hår
+ </string>
+ <string name="Hair Thickess">
+ HÃ¥r tykkelse
+ </string>
+ <string name="Hair Thickness">
+ HÃ¥r tykkelse
+ </string>
+ <string name="Hair Tilt">
+ Hældning
+ </string>
+ <string name="Hair Tilted Left">
+ mest hår venstre
+ </string>
+ <string name="Hair Tilted Right">
+ Mest hår højre
+ </string>
+ <string name="Hair Volume">
+ HÃ¥r: Volumen
+ </string>
+ <string name="Hand Size">
+ Størrelse hånd
+ </string>
+ <string name="Handlebars">
+ Cykelstyr
+ </string>
+ <string name="Head Length">
+ Længde på hovede
+ </string>
+ <string name="Head Shape">
+ Hovedform
+ </string>
+ <string name="Head Size">
+ Hovedstørrelse
+ </string>
+ <string name="Head Stretch">
+ Hovedhøjde
+ </string>
+ <string name="Heel Height">
+ Hælhøjde
+ </string>
+ <string name="Heel Shape">
+ Hælform
+ </string>
+ <string name="Height">
+ Højde
+ </string>
+ <string name="High">
+ Høj
+ </string>
+ <string name="High Heels">
+ Hæje hæle
+ </string>
+ <string name="High Jaw">
+ Høj kæbe
+ </string>
+ <string name="High Platforms">
+ Høje såle
+ </string>
+ <string name="High and Tight">
+ Høj og tæt
+ </string>
+ <string name="Higher">
+ Højere
+ </string>
+ <string name="Hip Length">
+ Hoftelængde
+ </string>
+ <string name="Hip Width">
+ Hoftebredde
+ </string>
+ <string name="In">
+ Inde
+ </string>
+ <string name="In Shdw Color">
+ Indre skygge farve
+ </string>
+ <string name="In Shdw Opacity">
+ Indre skygge gennemsigtighed
+ </string>
+ <string name="Inner Eye Corner">
+ Inderste del af øje
+ </string>
+ <string name="Inner Eye Shadow">
+ Inderste øjenskygge
+ </string>
+ <string name="Inner Shadow">
+ Indre skygge
+ </string>
+ <string name="Jacket Length">
+ Jakkelængde
+ </string>
+ <string name="Jacket Wrinkles">
+ Jakkerynker
+ </string>
+ <string name="Jaw Angle">
+ Kæbevinkel
+ </string>
+ <string name="Jaw Jut">
+ Kæbefremspring
+ </string>
+ <string name="Jaw Shape">
+ Kæbeform
+ </string>
+ <string name="Join">
+ Saml
+ </string>
+ <string name="Jowls">
+ Kindehud
+ </string>
+ <string name="Knee Angle">
+ Knævinkel
+ </string>
+ <string name="Knock Kneed">
+ Kalveknæet
+ </string>
+ <string name="Large">
+ Stor
+ </string>
+ <string name="Large Hands">
+ Store hænder
+ </string>
+ <string name="Left Part">
+ Venstre side
+ </string>
+ <string name="Leg Length">
+ Benlængde
+ </string>
+ <string name="Leg Muscles">
+ Benmuskler
+ </string>
+ <string name="Less">
+ Mindre
+ </string>
+ <string name="Less Body Fat">
+ Mindre kropsfedt
+ </string>
+ <string name="Less Curtains">
+ Mindre
+ </string>
+ <string name="Less Freckles">
+ Færre fregner
+ </string>
+ <string name="Less Full">
+ Mindre
+ </string>
+ <string name="Less Gravity">
+ Mindre
+ </string>
+ <string name="Less Love">
+ Mindre bildæk
+ </string>
+ <string name="Less Muscles">
+ Færre muskler
+ </string>
+ <string name="Less Muscular">
+ Mindre muskuløs
+ </string>
+ <string name="Less Rosy">
+ Mindre rosa
+ </string>
+ <string name="Less Round">
+ Mindre rund
+ </string>
+ <string name="Less Saddle">
+ Mindre
+ </string>
+ <string name="Less Square">
+ Mindre
+ </string>
+ <string name="Less Volume">
+ Mindre
+ </string>
+ <string name="Less soul">
+ Mindre
+ </string>
+ <string name="Lighter">
+ Lettere
+ </string>
+ <string name="Lip Cleft">
+ Læbekløft
+ </string>
+ <string name="Lip Cleft Depth">
+ Dybde læbekløft
+ </string>
+ <string name="Lip Fullness">
+ Fyldige læber
+ </string>
+ <string name="Lip Pinkness">
+ Lyserøde læber
+ </string>
+ <string name="Lip Ratio">
+ Læbeproportioner
+ </string>
+ <string name="Lip Thickness">
+ Læbetykkelse
+ </string>
+ <string name="Lip Width">
+ Læbebredde
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Læbestift
+ </string>
+ <string name="Lipstick Color">
+ Læbestift farve
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langt hovede
+ </string>
+ <string name="Long Hips">
+ Lange hofter
+ </string>
+ <string name="Long Legs">
+ Bange ben
+ </string>
+ <string name="Long Neck">
+ Lang hals
+ </string>
+ <string name="Long Pigtails">
+ Lange rottehaler
+ </string>
+ <string name="Long Ponytail">
+ Lang hestehale
+ </string>
+ <string name="Long Torso">
+ Lang overkrop
+ </string>
+ <string name="Long arms">
+ Lange arme
+ </string>
+ <string name="Longcuffs">
+ Longcuffs
+ </string>
+ <string name="Loose Pants">
+ Løse bukser
+ </string>
+ <string name="Loose Shirt">
+ Løs trøje
+ </string>
+ <string name="Loose Sleeves">
+ Løse ærmer
+ </string>
+ <string name="Love Handles">
+ Bildæk
+ </string>
+ <string name="Low">
Lav
</string>
- <string name="GraphicsQualityMid">
- Middel
+ <string name="Low Heels">
+ Flade hæle
</string>
- <string name="GraphicsQualityHigh">
+ <string name="Low Jaw">
+ Lav kæbe
+ </string>
+ <string name="Low Platforms">
+ Flade såler
+ </string>
+ <string name="Low and Loose">
+ Lav og løs
+ </string>
+ <string name="Lower">
+ Nedre
+ </string>
+ <string name="Lower Bridge">
+ Nedre næseryg
+ </string>
+ <string name="Lower Cheeks">
+ Nedre kinder
+ </string>
+ <string name="Male">
+ Mand
+ </string>
+ <string name="Middle Part">
+ Midterste del
+ </string>
+ <string name="More">
+ Mere
+ </string>
+ <string name="More Blush">
+ Mere rødmen
+ </string>
+ <string name="More Body Fat">
+ Mere kropsfedt
+ </string>
+ <string name="More Curtains">
+ Mere
+ </string>
+ <string name="More Eyeshadow">
+ Mere øjenskygge
+ </string>
+ <string name="More Freckles">
+ Flere fregner
+ </string>
+ <string name="More Full">
+ Mere
+ </string>
+ <string name="More Gravity">
+ More
+ </string>
+ <string name="More Lipstick">
+ Mere læbestift
+ </string>
+ <string name="More Love">
+ Mere bildæk
+ </string>
+ <string name="More Lower Lip">
+ Mere underlæbe
+ </string>
+ <string name="More Muscles">
+ Flere muskler
+ </string>
+ <string name="More Muscular">
+ Mere muskuløs
+ </string>
+ <string name="More Rosy">
+ Mere rosa
+ </string>
+ <string name="More Round">
+ Mere rund
+ </string>
+ <string name="More Saddle">
+ Mere
+ </string>
+ <string name="More Sloped">
+ Mere skrå
+ </string>
+ <string name="More Square">
+ Mere firkantet
+ </string>
+ <string name="More Upper Lip">
+ Mere overlæbe
+ </string>
+ <string name="More Vertical">
+ Mere lodret
+ </string>
+ <string name="More Volume">
+ Mere
+ </string>
+ <string name="More soul">
+ Mere
+ </string>
+ <string name="Moustache">
+ Overskæg
+ </string>
+ <string name="Mouth Corner">
+ Mundvige
+ </string>
+ <string name="Mouth Position">
+ Position mund
+ </string>
+ <string name="Mowhawk">
+ Intet hår
+ </string>
+ <string name="Muscular">
+ Muskuløs
+ </string>
+ <string name="Mutton Chops">
+ Lange
+ </string>
+ <string name="Nail Polish">
+ Neglelak
+ </string>
+ <string name="Nail Polish Color">
+ Neglelak farve
+ </string>
+ <string name="Narrow">
+ Smal
+ </string>
+ <string name="Narrow Back">
+ Smal bagtil
+ </string>
+ <string name="Narrow Front">
+ Smal fortil
+ </string>
+ <string name="Narrow Lips">
+ Smalle læber
+ </string>
+ <string name="Natural">
+ Naturlig
+ </string>
+ <string name="Neck Length">
+ Halslængde
+ </string>
+ <string name="Neck Thickness">
+ Halstykkelse
+ </string>
+ <string name="No Blush">
+ Ingen rødmen
+ </string>
+ <string name="No Eyeliner">
+ Ingen eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Ingen øjenskygge
+ </string>
+ <string name="No Heels">
+ Ingen hæle
+ </string>
+ <string name="No Lipgloss">
+ Ingen lipgloss
+ </string>
+ <string name="No Lipstick">
+ Ingen læbestift
+ </string>
+ <string name="No Part">
+ Ingen dele
+ </string>
+ <string name="No Polish">
+ Ingen lak
+ </string>
+ <string name="No Red">
+ Ingen rød
+ </string>
+ <string name="No Spikes">
+ Ingen spikes
+ </string>
+ <string name="No White">
+ Ingen hvid
+ </string>
+ <string name="No Wrinkles">
+ Ingen rynker
+ </string>
+ <string name="Normal Lower">
+ Normal nedre
+ </string>
+ <string name="Normal Upper">
+ Normal øvre
+ </string>
+ <string name="Nose Left">
+ Højre
+ </string>
+ <string name="Nose Right">
+ Venstre
+ </string>
+ <string name="Nose Size">
+ Næse størrelse
+ </string>
+ <string name="Nose Thickness">
+ Næse tykkelse
+ </string>
+ <string name="Nose Tip Angle">
+ Næsetip vinkel
+ </string>
+ <string name="Nose Tip Shape">
+ Næsetip form
+ </string>
+ <string name="Nose Width">
+ Næse bredde
+ </string>
+ <string name="Nostril Division">
+ Næsebor adskillelse
+ </string>
+ <string name="Nostril Width">
+ Næsebor bredde
+ </string>
+ <string name="Old">
+ Gammel
+ </string>
+ <string name="Opaque">
+ Uigennemsigtig
+ </string>
+ <string name="Open">
+ Ã…ben
+ </string>
+ <string name="Open Back">
+ Ã…ben bagtil
+ </string>
+ <string name="Open Front">
+ Ã…ben foran
+ </string>
+ <string name="Open Left">
+ Ã…ben til venstre
+ </string>
+ <string name="Open Right">
+ Åben til højre
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Ud
+ </string>
+ <string name="Out Shdw Color">
+ Ydre skygge farve
+ </string>
+ <string name="Out Shdw Opacity">
+ Ydre skygge uigennemsigtighed
+ </string>
+ <string name="Outer Eye Corner">
+ Yderste del af øje
+ </string>
+ <string name="Outer Eye Shadow">
+ Ydre øjenskygge
+ </string>
+ <string name="Outer Shadow">
+ Ydre skygge
+ </string>
+ <string name="Overbite">
+ Overbid
+ </string>
+ <string name="Package">
+ Skridt
+ </string>
+ <string name="Painted Nails">
+ Malede negle
+ </string>
+ <string name="Pale">
+ Bleg
+ </string>
+ <string name="Pants Crotch">
+ Bukser skridt
+ </string>
+ <string name="Pants Fit">
+ Pasform bukser
+ </string>
+ <string name="Pants Length">
+ Bukser - længde
+ </string>
+ <string name="Pants Waist">
+ Bukser - vidde
+ </string>
+ <string name="Pants Wrinkles">
+ Bukser - rynker
+ </string>
+ <string name="Part">
+ Skilning
+ </string>
+ <string name="Part Bangs">
+ Skilning
+ </string>
+ <string name="Pectorals">
+ Brystmuskler
+ </string>
+ <string name="Pigment">
+ Pigmentering
+ </string>
+ <string name="Pigtails">
+ Rottehaler
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mere pink
+ </string>
+ <string name="Platform Height">
+ Højde sål
+ </string>
+ <string name="Platform Width">
+ Bredde sål
+ </string>
+ <string name="Pointy">
+ Spids
+ </string>
+ <string name="Pointy Heels">
+ Spidse hæle
+ </string>
+ <string name="Pointy Toe">
+ Spids snude
+ </string>
+ <string name="Ponytail">
+ Hestehale
+ </string>
+ <string name="Poofy Skirt">
+ Strutskørt
+ </string>
+ <string name="Pop Left Eye">
+ Forstør venstre øje
+ </string>
+ <string name="Pop Right Eye">
+ Forstør højre øje
+ </string>
+ <string name="Puffy">
+ Posede
+ </string>
+ <string name="Puffy Eyelids">
+ Posede øjenlåg
+ </string>
+ <string name="Rainbow Color">
+ Regnbue farver
+ </string>
+ <string name="Red Hair">
+ Rødt hår
+ </string>
+ <string name="Red Skin">
+ Rød hud
+ </string>
+ <string name="Regular">
+ Almindelig
+ </string>
+ <string name="Regular Muscles">
+ Almindelige muskler
+ </string>
+ <string name="Right Part">
+ Højre skildning
+ </string>
+ <string name="Rosy Complexion">
+ Rosa teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Round Forehead">
+ Rund pande
+ </string>
+ <string name="Ruddiness">
+ Rødmossethed
+ </string>
+ <string name="Ruddy">
+ Rødmosset
+ </string>
+ <string name="Rumpled Hair">
+ Krøllet hår
+ </string>
+ <string name="Saddle Bags">
+ Ridebukselår
+ </string>
+ <string name="Saddlebags">
+ Ridebukselår
+ </string>
+ <string name="Scrawny">
+ Radmager
+ </string>
+ <string name="Scrawny Leg">
+ Magert ben
+ </string>
+ <string name="Separate">
+ Separat
+ </string>
+ <string name="Shading">
+ Skygger
+ </string>
+ <string name="Shadow hair">
+ Skygge hår
+ </string>
+ <string name="Shallow">
+ Lille
+ </string>
+ <string name="Shear Back">
+ Afklippet bagi
+ </string>
+ <string name="Shear Face">
+ Skævt ansigt
+ </string>
+ <string name="Shear Front">
+ &quot;MÃ¥ne&quot;
+ </string>
+ <string name="Shear Left">
+ Venstre
+ </string>
+ <string name="Shear Left Up">
+ Venstre op
+ </string>
+ <string name="Shear Right">
+ Højre
+ </string>
+ <string name="Shear Right Up">
+ Højre op
+ </string>
+ <string name="Sheared Back">
+ Afklippet bagtil
+ </string>
+ <string name="Sheared Front">
+ MÃ¥ne
+ </string>
+ <string name="Shift Left">
+ Mod venstre
+ </string>
+ <string name="Shift Mouth">
+ Flyt mund
+ </string>
+ <string name="Shift Right">
+ Mod højre
+ </string>
+ <string name="Shirt Bottom">
+ Trøje - bund
+ </string>
+ <string name="Shirt Fit">
+ Trøje - pasform
+ </string>
+ <string name="Shirt Wrinkles">
+ Trøje - rynker
+ </string>
+ <string name="Shoe Height">
+ Sko højde
+ </string>
+ <string name="Short">
+ Kort
+ </string>
+ <string name="Short Arms">
+ Korte arme
+ </string>
+ <string name="Short Legs">
+ Korte ben
+ </string>
+ <string name="Short Neck">
+ Kort hals
+ </string>
+ <string name="Short Pigtails">
+ Korte rottehaler
+ </string>
+ <string name="Short Ponytail">
+ Kort hestehale
+ </string>
+ <string name="Short Sideburns">
+ Korte
+ </string>
+ <string name="Short Torso">
+ Kort overkrop
+ </string>
+ <string name="Short hips">
+ Korte hofter
+ </string>
+ <string name="Shoulders">
+ Skuldre
+ </string>
+ <string name="Side Bangs">
+ Sidehår
+ </string>
+ <string name="Side Bangs Down">
+ Ned
+ </string>
+ <string name="Side Bangs Up">
+ Op
+ </string>
+ <string name="Side Fringe">
+ Side frynser
+ </string>
+ <string name="Sideburns">
+ Bakkenbarter
+ </string>
+ <string name="Sides Hair">
+ Sidehår
+ </string>
+ <string name="Sides Hair Down">
+ Ned
+ </string>
+ <string name="Sides Hair Up">
+ Op
+ </string>
+ <string name="Skinny">
+ Tynd
+ </string>
+ <string name="Skinny Neck">
+ Tynd hals
+ </string>
+ <string name="Skirt Fit">
+ Omfang
+ </string>
+ <string name="Skirt Length">
+ Længde nederdel
+ </string>
+ <string name="Slanted Forehead">
+ Skrånende pande
+ </string>
+ <string name="Sleeve Length">
+ Ærmelængde
+ </string>
+ <string name="Sleeve Looseness">
+ Ærmer - stramhed
+ </string>
+ <string name="Slit Back">
+ Slids: Bag
+ </string>
+ <string name="Slit Front">
+ Slids: Foran
+ </string>
+ <string name="Slit Left">
+ Slids: Venstre
+ </string>
+ <string name="Slit Right">
+ Slids: Højre
+ </string>
+ <string name="Small">
+ Lille
+ </string>
+ <string name="Small Hands">
+ Små hænder
+ </string>
+ <string name="Small Head">
+ Lille hovede
+ </string>
+ <string name="Smooth">
+ Glat
+ </string>
+ <string name="Smooth Hair">
+ Glat hår
+ </string>
+ <string name="Socks Length">
+ Strømper - længde
+ </string>
+ <string name="Some">
+ Nogen
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparsomt
+ </string>
+ <string name="Spiked Hair">
+ HÃ¥r med &quot;spikes&quot;
+ </string>
+ <string name="Square">
+ Firkantet
+ </string>
+ <string name="Square Toe">
+ Firkantet snude
+ </string>
+ <string name="Squash Head">
+ Bredt hovede
+ </string>
+ <string name="Squash/Stretch Head">
+ Sammentryk/stræk hovede
+ </string>
+ <string name="Stretch Head">
+ Stræk hovede
+ </string>
+ <string name="Sunken">
+ Indsunket
+ </string>
+ <string name="Sunken Chest">
+ Indsunket bryst
+ </string>
+ <string name="Sunken Eyes">
+ Dybtliggende øjne
+ </string>
+ <string name="Sweep Back">
+ Stryge tilbage
+ </string>
+ <string name="Sweep Forward">
+ Stryge fremad
+ </string>
+ <string name="Swept Back">
+ Tilbagestrøget
+ </string>
+ <string name="Swept Back Hair">
+ Tilbagestrøget hår
+ </string>
+ <string name="Swept Forward">
+ Fremadstrøget
+ </string>
+ <string name="Swept Forward Hair">
+ Fremadstrøget hår
+ </string>
+ <string name="Tall">
Høj
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Linden sted</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Kunst &amp; kultur</string>
- <string name="Business">Business</string>
- <string name="Educational">Uddannelse</string>
- <string name="Gaming">Spil</string>
- <string name="Hangout">Afslapning</string>
- <string name="Newcomer Friendly">Nybegynder venligt</string>
- <string name="Parks&amp;Nature">Parker &amp; natur</string>
- <string name="Residential">Beboelse</string>
- <string name="Shopping">Indkøb</string>
- <string name="Other">Andet</string>
-
- <string name="ringing">
- Forbinder til stemmechat...
+ <string name="Taper Back">
+ Indsnævring bag
</string>
- <string name="connected">
- Forbundet
+ <string name="Taper Front">
+ Indsnævring foran
</string>
- <string name="unavailable">
- Stemmechat er ikke tilladt hvor du befinder dig
+ <string name="Thick Heels">
+ Brede hæle
</string>
- <string name="hang_up">
- Stemme chat er afbrudt
+ <string name="Thick Neck">
+ Bred nakke
+ </string>
+ <string name="Thick Toe">
+ Bred snude
+ </string>
+ <string name="Thickness">
+ Tykkelse
+ </string>
+ <string name="Thin">
+ Tynd
+ </string>
+ <string name="Thin Eyebrows">
+ Tynde øjenbryn
+ </string>
+ <string name="Thin Lips">
+ Tynde læber
+ </string>
+ <string name="Thin Nose">
+ Tynd næse
+ </string>
+ <string name="Tight Chin">
+ Stram hage
+ </string>
+ <string name="Tight Cuffs">
+ Smalle bukseben
+ </string>
+ <string name="Tight Pants">
+ Stramme bukser
+ </string>
+ <string name="Tight Shirt">
+ Stram trøje
+ </string>
+ <string name="Tight Skirt">
+ Stram nederdel
+ </string>
+ <string name="Tight Sleeves">
+ Stramme ærmer
+ </string>
+ <string name="Tilt Left">
+ Hæld til venstre
+ </string>
+ <string name="Tilt Right">
+ Hæld til højre
+ </string>
+ <string name="Toe Shape">
+ Sko form
+ </string>
+ <string name="Toe Thickness">
+ Tykkelse af snud
+ </string>
+ <string name="Torso Length">
+ Overkrop - længde
+ </string>
+ <string name="Torso Muscles">
+ Overkrop - muskler
+ </string>
+ <string name="Torso Scrawny">
+ Overkrop - mager
+ </string>
+ <string name="Unattached">
+ Ikke vedhæftet
+ </string>
+ <string name="Uncreased">
+ Glat
+ </string>
+ <string name="Underbite">
+ Underbid
+ </string>
+ <string name="Unnatural">
+ Unaturlig
+ </string>
+ <string name="Upper Bridge">
+ Øverste næseryg
+ </string>
+ <string name="Upper Cheeks">
+ Øvre kinder
+ </string>
+ <string name="Upper Chin Cleft">
+ Øvre hagekløft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Øvre øjenlåg
+ </string>
+ <string name="Upturned">
+ Opadvendt
+ </string>
+ <string name="Very Red">
+ Meget rød
+ </string>
+ <string name="Waist Height">
+ Talje højde
+ </string>
+ <string name="Well-Fed">
+ Velnæret
+ </string>
+ <string name="White Hair">
+ Hvidt hår
+ </string>
+ <string name="Wide">
+ Bred
+ </string>
+ <string name="Wide Back">
+ Bredt
+ </string>
+ <string name="Wide Front">
+ Bredt
+ </string>
+ <string name="Wide Lips">
+ Brede læber
+ </string>
+ <string name="Wild">
+ Vildt
+ </string>
+ <string name="Wrinkles">
+ Rynker
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Tilføj til mine landemærker
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Rediger mit landemærke
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Se yderligere information om nuværende lokation
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Min lokationshistorik
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Opdatér
+ </string>
+ <string name="UpdaterNowUpdating">
+ Opdaterer nu [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installerer [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Din [APP_NAME] klient bliver opdateret til nyeste version. Dette kan tage noget tid, så venligst vær tålmodig.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Download færdig...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloader opdatering
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download af opdatering fejlede
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Der opstod en fejl ved opdatering af [APP_NAME]. Hent venligst den nyeste version fra www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Installation af opdatering fejlede
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Opstart af klient fejlede
+ </string>
+ <string name="IM_logging_string">
+ -- Logning af IM aktiveret --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] skriver...
+ </string>
+ <string name="Unnamed">
+ (Uden navn)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modereret: Stemmer deaktiveret)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Tekst chat er ikke tilgængelig i denne samtale.
+ </string>
+ <string name="IM_muted_text_label">
+ Din tekst chat er blevet deaktiveret af en gruppe moderator.
+ </string>
+ <string name="IM_default_text_label">
+ Klik her for privat besked (IM).
+ </string>
+ <string name="IM_to_label">
+ Til
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Tag Linden dollars (L$) fra dig
- </string>
- <string name="ActOnControlInputs">
- Reagér på dine kontrol-taster
- </string>
- <string name="RemapControlInputs">
- Ændre dine kontrol-taster
- </string>
- <string name="AnimateYourAvatar">
- Animér din avatar
- </string>
- <string name="AttachToYourAvatar">
- Sæt på din avatar
- </string>
- <string name="ReleaseOwnership">
- Fjern ejerskabet og sæt til offentlig
- </string>
- <string name="LinkAndDelink">
- Sammenkæd og adskil andre genstande
- </string>
- <string name="AddAndRemoveJoints">
- Tilføj og fjern sammenkødninger med andre genstande
- </string>
- <string name="ChangePermissions">
- Ændre dens tilladelser
- </string>
- <string name="TrackYourCamera">
- Spor dit kamera
- </string>
- <string name="ControlYourCamera">
- Kontrollér dit kamera
- </string>
<string name="only_user_message">
Du er den eneste deltager i denne samtale
</string>
@@ -624,31 +3239,4 @@
<string name="close_on_no_ability">
Du har ikke længere mulighed for at deltage i samtalen
</string>
- <string name="AcctTypeResident">
- Beboer
- </string>
- <string name="AcctTypeTrial">
- På prøve
- </string>
- <string name="AcctTypeCharterMember">
- æresmedlem
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab medarbejder
- </string>
- <string name="PaymentInfoUsed">
- Betalende medlem
- </string>
- <string name="PaymentInfoOnFile">
- Registreret betalende
- </string>
- <string name="NoPaymentInfoOnFile">
- Ingen betalingsinfo
- </string>
- <string name="AgeVerified">
- Alders-checket
- </string>
- <string name="NotAgeVerified">
- Ikke alders-checket
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml
index cc75abbb26..43f8e5144d 100644
--- a/indra/newview/skins/default/xui/da/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/da/teleport_strings.xml
@@ -1,15 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
Der er problemer med at håndtere din teleport. Det kan være nødvendigt at logge ud og ind for at kunne skifte teleportere.
-Hvis du bliver ved med at have problemet kan du checke teknisk support på:
-www.secondlife.com/support
+Hvis du bliver ved med at have problemet kan du checke teknisk support på: [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
Problem registreret i forbindelse med skift til ny region. Det kan være nødvendigt at logge ud og ind for at kunne skifte regioner.
-Hvis du bliver ved med at have problemet kan du checke teknisk support på:
-www.secondlife.com/support
+Hvis du bliver ved med at have problemet kan du checke teknisk support på: [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Beklager, teleport er blokeret lige nu. Prøv igen senere.
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index d36f5a43f6..c19f98516d 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -1,20 +1,60 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Über [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen.
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="INFO ÜBER [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Kompiliert mit [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Speicher: [MEMORY_MB] MB
+Betriebssystem, Version: [OS_VERSION]
+Grafikkarten-Hersteller: [GRAPHICS_CARD_VENDOR]
+Grafikkarten: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Grafiktreiber-Version: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Version: [OPENGL_VERSION]
+
+libcurl-Version: [LIBCURL_VERSION]
+J2C-Decoderversion: [J2C_VERSION]
+Audio-Treiberversion: [AUDIO_DRIVER_VERSION]
+Qt Webkit Version: [QT_WEBKIT_VERSION]
+Vivox-Version: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (keiner)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="In Zwischenablage kopieren" name="copy_btn"/>
+ </panel>
+ <panel label="Danksagung" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen.
Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
-3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Lizenzen" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
@@ -33,11 +73,9 @@ google-perftools Copyright (c) 2005, Google Inc.
Alle Rechte vorbehalten. Details siehe licenses.txt.
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C)
- </text_editor>
- </panel>
-</tab_container>
- <text name="you_are_at">
- Sie befinden sich in [POSITION]
- </text>
+Voice-Chat-Audiocoding: Polycom(R) Siren14(TM)
+(ITU-T Empf.G.722.1 Anhang C)
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 853302d15c..05e2d4d754 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -1,7 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Land-Info">
- <tab_container name="landtab">
- <panel label="Allgemein" name="land_general_panel">
+<floater name="floaterland" title="LAND-INFO">
+ <floater.string name="Minutes">
+ [MINUTES] Minuten
+ </floater.string>
+ <floater.string name="Minute">
+ Minute
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] Sekunden
+ </floater.string>
+ <floater.string name="Remaining">
+ Restzeit
+ </floater.string>
+ <tab_container name="landtab" tab_min_width="40" width="489">
+ <panel label="ALLGEMEIN" name="land_general_panel">
+ <panel.string name="new users only">
+ Nur neue Benutzer
+ </panel.string>
+ <panel.string name="anyone">
+ Jeder
+ </panel.string>
+ <panel.string name="area_text">
+ Gebiet:
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m².
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Auktions-ID: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Bestätigen Sie den Kauf, um dieses Land zu bearbeiten.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (In Gruppenbesitz)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil
+ </panel.string>
+ <panel.string name="info_text">
+ Info
+ </panel.string>
+ <panel.string name="public_text">
+ (öffentlich)
+ </panel.string>
+ <panel.string name="none_text">
+ (keiner)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Wird verkauft)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Keine Parzelle ausgewählt.
+ </panel.string>
<text name="Name:">
Name:
</text>
@@ -26,33 +77,35 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="Profile..."/>
<text name="Group:">
Gruppe:
</text>
- <button label="Einstellen..." label_selected="Einstellen..." name="Set..."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
- <button label="Übertragen..." label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
+ <button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
<check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/>
<text name="For Sale:">
Zum Verkauf:
</text>
<text name="Not for sale.">
- Nicht zu verkaufen.
+ Nicht zu verkaufen
</text>
<text name="For Sale: Price L$[PRICE].">
- Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.).
+ Preis: [PRICE] L$ ([PRICE_PER_SQM]L$/m²)
</text>
<text name="SalePending"/>
- <button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/>
+ <button bottom="-222" label="Land verkaufen" label_selected="Land verkaufen..." name="Sell Land..."/>
<text name="For sale to">
Zum Verkauf an: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="210">
- Objekte sind im Verkauf eingeschlossen.
+ <text left_delta="-50" name="Sell with landowners objects in parcel." width="240">
+ Objekte sind im Verkauf eingeschlossen
</text>
- <text name="Selling with no objects in parcel." width="237">
- Objekte sind im Verkauf nicht eingeschlossen.
+ <text name="Selling with no objects in parcel." width="260">
+ Objekte sind im Verkauf nicht eingeschlossen
</text>
<button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
<text name="Claimed:">
@@ -65,7 +118,7 @@
Gebiet:
</text>
<text name="PriceText">
- 4048 qm.
+ 4.048 m²
</text>
<text name="Traffic:">
Traffic:
@@ -73,60 +126,32 @@
<text name="DwellText">
0
</text>
- <button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/>
- <button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
- <button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
- <button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/>
- <button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
- <button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
- <panel.string name="new users only">
- Nur neue Benutzer
- </panel.string>
- <panel.string name="anyone">
- Jeder
- </panel.string>
- <panel.string name="area_text">
- Gebiet:
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] qm.
- </panel.string>
- <panel.string name="auction_id_text">
- Auktions-ID: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Bestätigen Sie den Kauf, um dieses Land zu bearbeiten.
- </panel.string>
- <panel.string name="group_owned_text">
- (In Gruppenbesitz)
- </panel.string>
- <panel.string name="profile_text">
- Profil...
- </panel.string>
- <panel.string name="info_text">
- Info...
- </panel.string>
- <panel.string name="public_text">
- (öffentlich)
+ <button label="Land kaufen" label_selected="Land kaufen..." name="Buy Land..."/>
+ <button label="Skriptinfo" name="Scripts..."/>
+ <button label="Für Gruppe kaufen" label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
+ <button label="Pass kaufen" label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
+ <button label="Land aufgeben" label_selected="Land aufgeben..." name="Abandon Land..."/>
+ <button label="Land in Besitz nehmen" label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
+ <button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
+ </panel>
+ <panel label="VERTRAG" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Gekauftes Land in dieser Region kann wiederverkauft werden.
</panel.string>
- <panel.string name="none_text">
- (keiner)
+ <panel.string name="can_not_resell">
+ Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
</panel.string>
- <panel.string name="sale_pending_text">
- (Wird verkauft)
+ <panel.string name="can_change">
+ Gekauftes Land in dieser Region kann zusammengelegt und
+geteilt werden.
</panel.string>
- <panel.string name="no_selection_text">
- Keine Parzelle ausgewählt.
-Öffnen Sie „Welt“ &gt; „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen.
+ <panel.string name="can_not_change">
+ Gekauftes Land in dieser Region kann nicht zusammengelegt
+und geteilt werden.
</panel.string>
- </panel>
- <panel label="Vertrag" name="land_covenant_panel">
<text name="estate_section_lbl">
Grundstück:
</text>
- <text name="estate_name_lbl">
- Name:
- </text>
<text name="estate_name_text">
Mainland
</text>
@@ -145,11 +170,8 @@
<text name="region_section_lbl">
Region:
</text>
- <text name="region_name_lbl">
- Name:
- </text>
<text name="region_name_text">
- leyla
+ EricaVille
</text>
<text name="region_landtype_lbl">
Typ:
@@ -176,45 +198,31 @@
Land in dieser Region kann nicht zusammengelegt/geteilt
werden.
</text>
- <panel.string name="can_resell">
- Gekauftes Land in dieser Region kann wiederverkauft werden.
- </panel.string>
- <panel.string name="can_not_resell">
- Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
- </panel.string>
- <panel.string name="can_change">
- Gekauftes Land in dieser Region kann zusammengelegt und
-geteilt werden.
+ </panel>
+ <panel label="OBJEKTE" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] von [MAX] ([AVAILABLE] verfügbar)
</panel.string>
- <panel.string name="can_not_change">
- Gekauftes Land in dieser Region kann nicht zusammengelegt
-und geteilt werden.
+ <panel.string name="objects_deleted_text">
+ [COUNT] von [MAX] ([DELETED] werden gelöscht)
</panel.string>
- </panel>
- <panel label="Objekte" name="land_objects_panel">
<text name="parcel_object_bonus">
Objektbonusfaktor in Region: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Primitive in Simulator:
+ Prim-Verwendung:
</text>
<text name="objects_available">
[COUNT] von [MAX] ([AVAILABLE] verfügbar)
</text>
- <panel.string name="objects_available_text">
- [COUNT] von [MAX] ([AVAILABLE] verfügbar)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] von [MAX] ([DELETED] werden gelöscht)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
- Von Parzelle unterstützte Primitiva:
+ Von Parzelle unterstützte Prims:
</text>
<text left="204" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Primitiva auf Parzelle:
+ Prims auf Parzelle:
</text>
<text left="204" name="total_objects_text" width="48">
[COUNT]
@@ -222,11 +230,11 @@ und geteilt werden.
<text left="14" name="Owned by parcel owner:" width="200">
Im Eigentum des Parzellenbesitzers:
</text>
- <text left="204" name="owner_objects_text" width="48">
+ <text left="204" left_delta="200" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
- <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
<text left="14" name="Set to group:">
Der Gruppe zugeordnet:
</text>
@@ -234,7 +242,7 @@ und geteilt werden.
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/>
- <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
<text left="14" name="Owned by others:" width="128">
Im Eigentum anderer:
</text>
@@ -242,135 +250,117 @@ und geteilt werden.
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/>
- <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
<text left="14" name="Selected / sat upon:" width="140">
Ausgewählt/gesessen auf:
</text>
<text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="380">
+ <text left="4" name="Autoreturn" width="410">
Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):
</text>
<line_editor name="clean other time" right="-10" width="56"/>
<text name="Object Owners:">
Objekteigentümer:
</text>
- <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/>
- <button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/>
+ <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List" tool_tip="Objektliste aktualisieren"/>
+ <button label="Objekte zurückgeben" label_selected="Objekte zurückgeben..." name="Return objects..."/>
<name_list name="owner list">
- <column label="Typ" name="type"/>
- <column label="Name" name="name"/>
- <column label="Zählen" name="count"/>
- <column label="Aktuellster" name="mostrecent"/>
+ <name_list.columns label="Typ" name="type"/>
+ <name_list.columns label="Name" name="name"/>
+ <name_list.columns label="Zählen" name="count" width="80"/>
+ <name_list.columns label="Aktuellster" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Optionen" name="land_options_panel">
+ <panel label="OPTIONEN" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Diese Parzelle in Suchergebnissen anzeigen.
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Diese Option ist nicht aktiviert, weil die Parzelle 128 m² oder kleiner ist.
+Nur große Parzellen können in der Suche aufgeführt werden.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Moderater Inhalt
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Adult-Inhalt
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Die Informationen oder Inhalte Ihrer Parzelle sind „Moderat“.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (keiner)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Kein Stoßen
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Kein Stoßen (regional)
+ </panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
<check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/>
- <check_box label="Landmarken erstellen" name="check landmark"/>
<check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
<text name="allow_label2">
- Objekte erstellen:
+ Bauen:
</text>
- <check_box label="Alle Einwohner" name="edit objects check"/>
+ <check_box label="Jeder" name="edit objects check"/>
<check_box label="Gruppe" name="edit group objects check"/>
<text name="allow_label3">
Objekteintritt:
</text>
- <check_box label="Alle Einwohner" name="all object entry check"/>
+ <check_box label="Jeder" name="all object entry check"/>
<check_box label="Gruppe" name="group object entry check"/>
<text name="allow_label4">
Skripts ausführen:
</text>
- <check_box label="Alle Einwohner" name="check other scripts"/>
+ <check_box label="Jeder" name="check other scripts"/>
<check_box label="Gruppe" name="check group scripts"/>
<text name="land_options_label">
Landoptionen:
</text>
<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/>
<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
- <check_box label="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
- <panel.string name="search_enabled_tooltip">
- Diese Parzelle in Suchergebnissen anzeigen.
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist.
-Nur große Parzellen können in der Suche aufgeführt werden.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können.
- </panel.string>
+ <check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
<combo_box name="land category with adult">
- <combo_box.item name="item0" label="Alle Kategorien"
- />
- <combo_box.item name="item1" label="Lindenort"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Kunst &amp; Kultur"
- />
- <combo_box.item name="item4" label="Business"
- />
- <combo_box.item name="item5" label="Bildung"
- />
- <combo_box.item name="item6" label="Spielen"
- />
- <combo_box.item name="item7" label="Treffpunkt"
- />
- <combo_box.item name="item8" label="Anfängergerecht"
- />
- <combo_box.item name="item9" label="Parks und Natur"
- />
- <combo_box.item name="item10" label="Wohngebiet"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Sonstige"
- />
+ <combo_box.item label="Alle Kategorien" name="item0"/>
+ <combo_box.item label="Lindenort" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Kunst &amp; Kultur" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Bildung" name="item5"/>
+ <combo_box.item label="Spielen" name="item6"/>
+ <combo_box.item label="Treffpunkt" name="item7"/>
+ <combo_box.item label="Anfängergerecht" name="item8"/>
+ <combo_box.item label="Parks und Natur" name="item9"/>
+ <combo_box.item label="Wohngebiet" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Sonstige" name="item12"/>
</combo_box>
<combo_box left="266" name="land category" width="130">
- <combo_box.item name="item0" label="Alle Kategorien"
- />
- <combo_box.item name="item1" label="Lindenort"
- />
- <combo_box.item name="item3" label="Kunst und Kultur"
- />
- <combo_box.item name="item4" label="Business"
- />
- <combo_box.item name="item5" label="Bildung"
- />
- <combo_box.item name="item6" label="Spielen"
- />
- <combo_box.item name="item7" label="Treffpunkt"
- />
- <combo_box.item name="item8" label="Anfängergerecht"
- />
- <combo_box.item name="item9" label="Parks und Natur"
- />
- <combo_box.item name="item10" label="Wohngebiet"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Sonstige"
- />
+ <combo_box.item label="Alle Kategorien" name="item0"/>
+ <combo_box.item label="Lindenort" name="item1"/>
+ <combo_box.item label="Kunst und Kultur" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Bildung" name="item5"/>
+ <combo_box.item label="Spielen" name="item6"/>
+ <combo_box.item label="Treffpunkt" name="item7"/>
+ <combo_box.item label="Anfängergerecht" name="item8"/>
+ <combo_box.item label="Parks und Natur" name="item9"/>
+ <combo_box.item label="Wohngebiet" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Sonstige" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" name="?"/>
- <check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Mature-Inhalt
- </panel.string>
- <panel.string name="mature_check_adult">
- Adult-Inhalt
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“.
- </panel.string>
+ <check_box label="Moderater Inhalt" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
@@ -378,59 +368,43 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="landing_point">
Landepunkt: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (keiner)
- </panel.string>
- <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
- <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/>
+ <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" right="-88" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
+ <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen" width="70"/>
<text name="Teleport Routing: ">
Teleport-Route:
</text>
- <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen.">
- <combo_box.item name="Blocked" label="Blockiert"
- />
- <combo_box.item name="LandingPoint" label="Landepunkt"
- />
- <combo_box.item name="Anywhere" label="Überall"
- />
+ <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen">
+ <combo_box.item label="Blockiert" name="Blocked"/>
+ <combo_box.item label="Landepunkt" name="LandingPoint"/>
+ <combo_box.item label="Überall" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Kein Stoßen
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Kein Stoßen (regional)
- </panel.string>
</panel>
- <panel label="Medien" name="land_media_panel">
+ <panel label="MEDIEN" name="land_media_panel">
<text name="with media:">
- Medientyp:
+ Typ:
</text>
<combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/>
<text name="at URL:">
- Medien-URL:
+ Homepage:
</text>
- <button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/>
+ <button label="Festlegen" label_selected="Einstellen..." name="set_media_url"/>
+ <text name="CurrentURL:">
+ Aktuelle Seite:
+ </text>
+ <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url" tool_tip="URL aktualisieren"/>
+ <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
<text name="Description:">
Inhalt:
</text>
<line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/>
<text name="Media texture:">
- Textur
-ersetzen:
+ Textur ersetzen:
</text>
<texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<text name="replace_texture_help">
- (Objekte mit dieser Textur zeigen nach Anklicken
-des Abspielen-Pfeils den Film oder die Webseite an.)
- </text>
- <text name="Options:">
- Medien-
-Optionen:
+ Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken. Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen.
</text>
<check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/>
- <check_box label="Als Schleife wiedergeben" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/>
- <check_box label="Medien-URL verstecken" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
- <check_box label="Musik-URL verstecken" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können."/>
<text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen.">
Größe:
</text>
@@ -439,56 +413,67 @@ Optionen:
<text name="pixels">
Pixel
</text>
+ <text name="Options:">
+ Optionen:
+ </text>
+ <check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/>
+ </panel>
+ <panel label="SOUND" name="land_audio_panel">
<text name="MusicURL:">
Musik-URL:
</text>
+ <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
<text name="Sound:">
Sound:
</text>
<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
- <button label="?" label_selected="?" left="418" name="?"/>
<text name="Voice settings:">
Voice:
</text>
- <check_box label="Voice-Chat aktivieren" name="parcel_enable_voice_channel"/>
- <check_box label="Voice-Chat aktivieren (vom Grundstück festgelegt)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Voice-Chat auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/>
+ <check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_local"/>
</panel>
- <panel label="Zugang" name="land_access_panel">
+ <panel label="ZUGANG" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Durch Grundstück festgelegt)
+ </panel.string>
+ <panel.string name="estate_override">
+ Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
+ </panel.string>
<text name="Limit access to this parcel to:">
Zugang zu dieser Parzelle
</text>
- <check_box label="Freien Zugang erlauben" name="public_access"/>
- <text name="Only Allow">
- Zugang verweigern für:
+ <check_box label="Öffentlichen Zugang erlauben [MATURITY]" name="public_access"/>
+ <text name="Only Allow" width="400">
+ Zugang auf Einwohner beschränken, die überprüft wurden von:
</text>
- <check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
- <check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersprüfung verbannen. Weitere Informationen finden Sie auf support.secondlife.com."/>
- <panel.string name="estate_override">
- Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
- </panel.string>
+ <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
+ <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
<check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/>
<check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Jeden"
- />
- <combo_box.item name="Group" label="Gruppe"
- />
+ <combo_box.item label="Jeden" name="Anyone"/>
+ <combo_box.item label="Gruppe" name="Group"/>
</combo_box>
<spinner label="Preis in L$:" name="PriceSpin"/>
<spinner label="Online-Zeit:" name="HoursSpin"/>
- <text label="Immer erlauben" name="AllowedText">
- Zulässige Einwohner
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
- <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/>
- <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/>
- <text label="Verbannen" name="BanCheck">
- Verbannte Einwohner
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
- <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/>
- <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Immer erlauben" name="AllowedText">
+ Zulässige Einwohner
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] aufgeführt, [MAX] max)"/>
+ <button label="Hinzufügen" name="add_allowed"/>
+ <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Verbannen" name="BanCheck">
+ Verbannte Einwohner
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] aufgeführt, [MAX] max)"/>
+ <button label="Hinzufügen" name="add_banned"/>
+ <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_activeim.xml b/indra/newview/skins/default/xui/de/floater_activeim.xml
new file mode 100644
index 0000000000..416e31b2d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="AKTIVE IM"/>
diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
index fbd03ab3d7..0d55ea7413 100644
--- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -1,5 +1,114 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Bewegung konnte nicht initialisiert werden
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animationsdatei ist [LENGTH] Sekunden lang.
+
+Maximal erlaubt sind [MAX_LENGTH] Sekunden.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Animationsdatei konnte nicht gelesen werden.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Unvollständige Datei
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Constraint-Definition kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH-Datei kann nicht geöffnet werden
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ungültiger HIERARCHY-Titel.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ ROOT oder JOINT nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ JOINT-Name nicht erfasst.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ VERSATZ nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Kann Rotations-Reihenfolge nicht erfassen.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Kann Rotations-Achse nicht erfassen.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ MOTION nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Anzahl der Bilder kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Bildzeit kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Positions-Werte können nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Kann Rotations-Werte nicht erfassen.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Datei kann nicht geöffnet werden
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Übersetzungstitel kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Übersetzungsnamen können nicht geladen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Ignorier-Wert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Übersetzungs-Wert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Outname-Wert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Übersetzungsmatrix kann nicht geladen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Mergechild-Name nicht erfasst.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Mergeparent-Name nicht erfasst.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Prioritätswert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Loop-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Easeln-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ easeOut-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Hand-Morph-Wert nicht erfasst.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Emote-Name kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Falscher Root-Joint-Name, &quot;hip&quot; verwenden.
+ </floater.string>
<text name="name_label">
Name:
</text>
@@ -7,65 +116,66 @@
<text name="description_label">
Beschreibung:
</text>
- <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/>
- <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/>
- <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/>
- <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/>
+ <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können"/>
+ <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife"/>
+ <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen"/>
+ <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen"/>
<text name="hand_label">
Handhaltung
</text>
- <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände.">
- <combo_box.item name="Spread" label="Dehnen" />
- <combo_box.item name="Relaxed" label="Entspannt" />
- <combo_box.item name="PointBoth" label="Beide zeigen" />
- <combo_box.item name="Fist" label="Faust" />
- <combo_box.item name="RelaxedLeft" label="Links entspannt" />
- <combo_box.item name="PointLeft" label="Nach links zeigen" />
- <combo_box.item name="FistLeft" label="Linke Faust" />
- <combo_box.item name="RelaxedRight" label="Rechts entspannt" />
- <combo_box.item name="PointRight" label="Nach rechts zeigen" />
- <combo_box.item name="FistRight" label="Rechte Faust" />
- <combo_box.item name="SaluteRight" label="Rechts salutieren" />
- <combo_box.item name="Typing" label="Tippt" />
- <combo_box.item name="PeaceRight" label="Friedensrecht" />
+ <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände">
+ <combo_box.item label="Dehnen" name="Spread"/>
+ <combo_box.item label="Entspannt" name="Relaxed"/>
+ <combo_box.item label="Beide zeigen" name="PointBoth"/>
+ <combo_box.item label="Faust" name="Fist"/>
+ <combo_box.item label="Links entspannt" name="RelaxedLeft"/>
+ <combo_box.item label="Nach links zeigen" name="PointLeft"/>
+ <combo_box.item label="Linke Faust" name="FistLeft"/>
+ <combo_box.item label="Rechts entspannt" name="RelaxedRight"/>
+ <combo_box.item label="Nach rechts zeigen" name="PointRight"/>
+ <combo_box.item label="Rechte Faust" name="FistRight"/>
+ <combo_box.item label="Rechts salutieren" name="SaluteRight"/>
+ <combo_box.item label="Tippt" name="Typing"/>
+ <combo_box.item label="Friedensrecht" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Ausdruck
</text>
- <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation.">
- <combo_box.item name="[None]" label="Keine]" />
- <combo_box.item name="Aaaaah" label="Aaaaah" />
- <combo_box.item name="Afraid" label="Ängstlich" />
- <combo_box.item name="Angry" label="Verärgert" />
- <combo_box.item name="BigSmile" label="Grinst" />
- <combo_box.item name="Bored" label="Gelangweilt" />
- <combo_box.item name="Cry" label="Weinen" />
- <combo_box.item name="Disdain" label="Verachten" />
- <combo_box.item name="Embarrassed" label="Verlegen" />
- <combo_box.item name="Frown" label="Stirnrunzeln" />
- <combo_box.item name="Kiss" label="Küssen" />
- <combo_box.item name="Laugh" label="Lachen" />
- <combo_box.item name="Plllppt" label="Bäääh" />
- <combo_box.item name="Repulsed" label="Zurückgestoßen" />
- <combo_box.item name="Sad" label="Traurig" />
- <combo_box.item name="Shrug" label="Schulterzucken" />
- <combo_box.item name="Smile" label="Lächeln" />
- <combo_box.item name="Surprise" label="Überraschung" />
- <combo_box.item name="Wink" label="Zwinkern" />
- <combo_box.item name="Worry" label="Sorgenvoll" />
+ <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation">
+ <combo_box.item label="(Keiner)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Ängstlich" name="Afraid"/>
+ <combo_box.item label="Verärgert" name="Angry"/>
+ <combo_box.item label="Grinst" name="BigSmile"/>
+ <combo_box.item label="Gelangweilt" name="Bored"/>
+ <combo_box.item label="Weinen" name="Cry"/>
+ <combo_box.item label="Verachten" name="Disdain"/>
+ <combo_box.item label="Verlegen" name="Embarrassed"/>
+ <combo_box.item label="Stirnrunzeln" name="Frown"/>
+ <combo_box.item label="Küssen" name="Kiss"/>
+ <combo_box.item label="Lachen" name="Laugh"/>
+ <combo_box.item label="Bäääh" name="Plllppt"/>
+ <combo_box.item label="Angewidert" name="Repulsed"/>
+ <combo_box.item label="Traurig" name="Sad"/>
+ <combo_box.item label="Schulterzucken" name="Shrug"/>
+ <combo_box.item label="Lächeln" name="Smile"/>
+ <combo_box.item label="Überraschung" name="Surprise"/>
+ <combo_box.item label="Zwinkern" name="Wink"/>
+ <combo_box.item label="Sorgenvoll" name="Worry"/>
</combo_box>
<text name="preview_label" width="97">
Vorschau während:
</text>
<combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt.">
- <combo_box.item name="Standing" label="Stehend" />
- <combo_box.item name="Walking" label="Geht" />
- <combo_box.item name="Sitting" label="Sitzt" />
- <combo_box.item name="Flying" label="Fliegend" />
+ <combo_box.item label="Stehend" name="Standing"/>
+ <combo_box.item label="Geht" name="Walking"/>
+ <combo_box.item label="Sitzt" name="Sitting"/>
+ <combo_box.item label="Fliegen" name="Flying"/>
</combo_box>
- <spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
- <spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
- <button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/>
+ <spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)" width="175"/>
+ <spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendegeschwindigkeit von Animationen (in Sekunden)" width="175"/>
+ <button bottom_delta="-32" label="" name="play_btn" tool_tip="Ihre Animation abspielen"/>
+ <button name="pause_btn" tool_tip="Ihre Animation pausieren"/>
<button label="" name="stop_btn" tool_tip="Animation anhalten"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
@@ -73,19 +183,6 @@
Wir empfehlen exportierte BVH-Dateien aus Poser 4.
</text>
- <button label="Abbrechen" name="cancel_btn"/>
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
- <string name="failed_to_initialize">
- Bewegung konnte nicht initialisiert werden
- </string>
- <string name="anim_too_long">
- Animationsdatei ist [LENGTH] Sekunden lang.
-
-Maximal erlaubt sind [MAX_LENGTH] Sekunden.
- </string>
- <string name="failed_file_read">
- Animationsdatei konnte nicht gelesen werden.
-
-[STATUS]
- </string>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="160"/>
+ <button label="Abbrechen" left="180" name="cancel_btn" width="88"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_auction.xml b/indra/newview/skins/default/xui/de/floater_auction.xml
index 42f6a07dc3..8ededff319 100644
--- a/indra/newview/skins/default/xui/de/floater_auction.xml
+++ b/indra/newview/skins/default/xui/de/floater_auction.xml
@@ -1,9 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="Linden-Landverkauf starten">
- <check_box label="Gelben Auswahlrahmen einschließen" name="fence_check" />
- <button label="Foto" label_selected="Foto" name="snapshot_btn" />
- <button label="OK" label_selected="OK" name="ok_btn" />
- <text name="already for sale">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="LINDEN LAND VERKAUF STARTEN">
+ <floater.string name="already for sale">
Parzellen, die bereits zum Verkauf stehen, können nicht auktioniert werden.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Gelben Auswahlrahmen einschließen" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="An jeden verkaufen" label_selected="An jeden verkaufen" name="sell_to_anyone_btn"/>
+ <button label="Einstellungen löschen" label_selected="Einstellungen löschen" name="reset_parcel_btn"/>
+ <button label="Auktion beginnen" label_selected="Auktion beginnen" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
index c546d91d72..f1281bfb9b 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
@@ -1,45 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Einwohner auswählen">
+<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN">
+ <floater.string name="not_found">
+ „[TEXT]“ nicht gefunden
+ </floater.string>
+ <floater.string name="no_one_near">
+ Keiner in der Nähe
+ </floater.string>
+ <floater.string name="no_results">
+ Keine Ergebnisse
+ </floater.string>
+ <floater.string name="searching">
+ Suchen...
+ </floater.string>
+ <string label="OK" label_selected="OK" name="Select">
+ Auswählen
+ </string>
+ <string name="Close">
+ Schließen
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Suchen" name="SearchPanel">
<text name="InstructSearchResidentName">
- Geben Sie einen Teil des Namens des
-Einwohners ein:
+ Geben Sie einen Teil des Namens einer
+Person ein:
</text>
- <line_editor bottom_delta="-36" name="Edit" />
- <button label="Suchen" label_selected="Suchen" name="Find"/>
- <scroll_list height="74" name="SearchResults" bottom_delta="-79"/>
+ <line_editor bottom_delta="-76" name="Edit" top_pad="16"/>
+ <button label="Los" label_selected="Los" name="Find" top="70"/>
+ <scroll_list top="80" height="54" name="SearchResults"/>
</panel>
- <panel label="Visitenkarten" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Wählen Sie eine Visitenkarte:
+ <panel label="Freunde" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Wählen Sie eine Person aus:
</text>
</panel>
<panel label="In meiner Nähe" name="NearMePanel">
<text name="InstructSelectResident">
- Einwohner in der Nähe
-auswählen:
+ Wählen Sie eine Person aus:
</text>
- <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh" left_delta="10" width="105"/>
- <slider label="Bereich" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Bereich" name="near_me_range"/>
<text name="meters">
Meter
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Auswählen" label_selected="Auswählen" name="Select"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <string name="not_found">
- „[TEXT]“ nicht gefunden
- </string>
- <string name="no_one_near">
- Niemand in der Nähe
- </string>
- <string name="no_results">
- Keine Ergebnisse
- </string>
- <string name="searching">
- Suchen...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
index 823d6de78b..cf1b809aa1 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
@@ -1,31 +1,48 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="Avatar-Texturen">
- <text name="label">
+<floater name="avatar_texture_debug" title="AVATAR-TEXTUREN">
+ <floater.string name="InvalidAvatar">
+ UNGÜLTIGER AVATAR
+ </floater.string>
+ <text name="label" width="120">
Gebackene Texturen
</text>
- <text name="composite_label" width="150">
+ <text name="composite_label" width="170">
Zusammengesetzte Texturen
</text>
<button label="Läd IDs in Konsole ab" label_selected="Abladen" name="Dump"/>
- <texture_picker label="Haare" name="hair-baked"/>
- <texture_picker label="Haar" name="hair"/>
- <texture_picker label="Kopf" name="head-baked"/>
- <texture_picker label="Make-Uup" name="head bodypaint"/>
- <texture_picker label="Augen" name="eyes-baked"/>
- <texture_picker label="Auge" name="iris"/>
- <texture_picker label="Oberkörper" name="upper-baked"/>
- <texture_picker label="Oberkörpertattoo" name="upper bodypaint"/>
- <texture_picker label="Unterhemd" name="undershirt"/>
- <texture_picker label="Handschuhe" name="gloves"/>
- <texture_picker label="Hemd" name="shirt"/>
- <texture_picker label="Oberjacke" name="upper jacket"/>
- <texture_picker label="Unterkörper" name="lower-baked"/>
- <texture_picker label="Unterkörper-Tätowierung" name="lower bodypaint"/>
- <texture_picker label="Unterhose" name="underpants"/>
- <texture_picker label="Socken" name="socks"/>
- <texture_picker label="Schuhe" name="shoes"/>
- <texture_picker label="Hose" name="pants"/>
- <texture_picker label="Jacke" name="lower jacket"/>
- <texture_picker label="Rock" name="skirt-baked"/>
- <texture_picker label="Rock" name="skirt"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <texture_picker label="Haare" name="hair-baked"/>
+ <texture_picker label="Haare" name="hair_grain"/>
+ <texture_picker label="Alpha: Haare" name="hair_alpha"/>
+ <texture_picker label="Kopf" name="head-baked"/>
+ <texture_picker label="Make-Uup" name="head_bodypaint"/>
+ <texture_picker label="Kopf: Alpha" name="head_alpha"/>
+ <texture_picker label="Kopftattoo" name="head_tattoo"/>
+ <texture_picker label="Augen" name="eyes-baked"/>
+ <texture_picker label="Auge" name="eyes_iris"/>
+ <texture_picker label="Alpha: Augen" name="eyes_alpha"/>
+ <texture_picker label="Oberkörper" name="upper-baked"/>
+ <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint" width=
+ "140"/>
+ <texture_picker label="Unterhemd" name="upper_undershirt"/>
+ <texture_picker label="Handschuhe" name="upper_gloves"/>
+ <texture_picker label="Hemd" name="upper_shirt"/>
+ <texture_picker label="Oberjacke" name="upper_jacket"/>
+ <texture_picker label="Alpha: Oben" name="upper_alpha"/>
+ <texture_picker label="Obere Tattoos" name="upper_tattoo"/>
+ <texture_picker label="Unterkörper" name="lower-baked"/>
+ <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint" width=
+ "140"/>
+ <texture_picker label="Unterhose" name="lower_underpants"/>
+ <texture_picker label="Socken" name="lower_socks"/>
+ <texture_picker label="Schuhe" name="lower_shoes"/>
+ <texture_picker label="Hose" name="lower_pants"/>
+ <texture_picker label="Jacke" name="lower_jacket"/>
+ <texture_picker label="Alpha: Unten" name="lower_alpha"/>
+ <texture_picker label="Untere Tattoos" name="lower_tattoo"/>
+ <texture_picker label="Rock" name="skirt-baked"/>
+ <texture_picker label="Rock" name="skirt"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml
index 0992727e73..50a4555ae0 100644
--- a/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Beacons">
+<floater name="beacons" title="STRAHLEN">
<panel name="beacons_panel">
- <check_box label="Auf Berührung beschränkte Skriptobjekte" name="touch_only"/>
- <check_box label="Skripting-Objekte" name="scripted"/>
- <check_box label="Physische Objekte" name="physical"/>
+ <text name="label_show">
+ Anzeigen:
+ </text>
+ <check_box label="Strahlen" name="beacons"/>
+ <check_box label="Glanzlichter" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Strahlbreite">
+ Breite:
+ </text>
+ <text name="label_objects">
+ Für diese Objekte:
+ </text>
+ <check_box label="Physisch" name="physical"/>
+ <check_box label="Skriptobjekte" name="scripted"/>
+ <check_box label="Nur berühren" name="touch_only"/>
<check_box label="Soundquellen" name="sounds"/>
<check_box label="Partikelquellen" name="particles"/>
- <check_box label="Glanzlichter anzeigen" name="highlights"/>
- <check_box label="Beacons anzeigen" name="beacons"/>
- <text name="beacon_width_label">
- Beacon-Breite:
- </text>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml
index de3617ed25..b70c859490 100644
--- a/indra/newview/skins/default/xui/de/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_build_options.xml
@@ -1,8 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="build options floater" title="Rasteroptionen">
- <spinner label="Rastereinheit (Meter)" name="GridResolution" />
- <spinner label="Rastergröße (Meter)" name="GridDrawSize" />
- <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit" />
- <check_box label="Querschnitte anzeigen" name="GridCrossSection" />
- <slider label="Rasterdeckkraft" name="GridOpacity" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="RASTER-OPTIONEN">
+ <spinner label="Raster-Einheiten (Meter)" name="GridResolution"/>
+ <spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
+ <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit"/>
+ <check_box label="Überschneidungen anzeigen" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Raster-Deckkraft">
+ Deckkraft:
+ </text>
+ <slider label="Rasterdeckkraft" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index f058a0ed96..1d766ac07b 100644
--- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Mehrere Inhaltsberechtigungen ändern">
- <text name="applyto">
- Inhaltsarten
- </text>
+<floater name="floaterbulkperms" title="INHALTS-BERECHTIGUNGEN BEARBEITEN">
+ <floater.string name="nothing_to_modify_text">
+ Auswahl enthält keinen Inhalt, der bearbeitet werden kann.
+ </floater.string>
+ <floater.string name="status_text">
+ Berechtigungen werden eingestellt auf [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Start: Anforderung auf Änderung der Berechtigung...
+ </floater.string>
+ <floater.string name="done_text">
+ Ende: Anforderung auf Änderung der Berechtigung.
+ </floater.string>
<check_box label="Animation" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animation"/>
<check_box label="Körperteile" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Körperteile"/>
<check_box label="Kleidung" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Kleidung"/>
<check_box label="Gesten" name="check_gesture"/>
- <check_box label="Landmarken" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gesten"/>
<check_box label="Notizkarten" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Notizkarten"/>
<check_box label="Objekte" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objekte"/>
<check_box label="Skripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Skripts"/>
<check_box label="Sounds" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sounds"/>
<check_box label="Texturen" name="check_texture"/>
- <button label="Alle auswählen" label_selected="Alle" name="check_all"/>
- <button label="Keine" label_selected="Keine" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texturen"/>
+ <button label="√ Alle" label_selected="Alle" name="check_all"/>
+ <button label="Löschen" label_selected="Keine" name="check_none"/>
<text name="newperms">
- Neue Berechtigungen
+ Neue Inhalts-Berechtigungen
+ </text>
+ <text name="GroupLabel">
+ Gruppe:
</text>
- <check_box label="Mit Gruppe teilen" name="share_with_group"/>
- <check_box label="Kopieren allen erlauben" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Nächster Eigentümer kann:
+ <check_box label="Teilen" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Jeder:
+ </text>
+ <check_box label="Kopieren" name="everyone_copy"/>
+ <text name="NextOwnerLabel" top="160" left="10">
+ Nächster Eigentümer:
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
<check_box label="Kopieren" name="next_owner_copy"/>
- <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/>
- <button label="Hilfe" name="help"/>
- <button label="Übernehmen" name="apply"/>
- <button label="Schließen" name="close"/>
- <string name="nothing_to_modify_text">
- Auswahl enthält keinen Inhalt, der bearbeitet werden kann.
- </string>
- <string name="status_text">
- Berechtigungen werden eingestellt auf [NAME]
- </string>
- <string name="start_text">
- Start: Anforderung auf Änderung der Berechtigung...
- </string>
- <string name="done_text">
- Ende: Anforderung auf Änderung der Berechtigung.
- </string>
+ <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+ <button label="OK" name="apply"/>
+ <button label="Abbrechen" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_bumps.xml b/indra/newview/skins/default/xui/de/floater_bumps.xml
index 7b21042c2b..dafca44fa3 100644
--- a/indra/newview/skins/default/xui/de/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/de/floater_bumps.xml
@@ -1,21 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_bumps" title="Rempler, Stöße und Schläge">
- <text name="none_detected">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="REMPLER, STÖSSE &amp; SCHLÄGE">
+ <floater.string name="none_detected">
Nicht erkannt
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] hat Sie gestoßen
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] hat Sie mit einem Skript gestoßen
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] hat Sie mit einem Objekt getroffen
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] hat Sie mit einem Skript-Objekt getroffen
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] hat Sie mit einem physischen Objekt getroffen
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
index 01858b3c36..ccafa11cf4 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_buy_contents" title="Inhalte kaufen" min_width="300">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="300" name="floater_buy_contents" title="INHALT KAUFEN">
<text name="contains_text">
[NAME] enthält:
</text>
<text name="buy_text">
[AMOUNT] L$ von [NAME] kaufen?
</text>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73" />
- <button label="Kaufen" label_selected="Kaufen" name="buy_btn" />
- <check_box label="Kleidung jetzt anziehen" name="wear_check" />
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/>
+ <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>
+ <check_box label="Kleidung jetzt anziehen" name="wear_check"/>
<text name="no_copy_text">
(kein Kopieren)
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 787f469854..72959c7a0c 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -1,68 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="buy currency" title="Geld kaufen">
- <text name="info_buying">
- Kaufe Geld:
- </text>
- <text name="info_cannot_buy">
- Kaufen jetzt nicht möglich:
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="L$ kaufen">
+ <floater.string name="buy_currency">
+ [LINDENS] L$ für ca. [LOCALAMOUNT] kaufen
+ </floater.string>
<text name="info_need_more">
- Sie brauchen mehr Geld:
- </text>
- <text name="error_message">
- Irgendetwas stimmt nicht.
+ Sie brauchen mehr Geld
</text>
- <button label="Gehe zu Website" name="error_web" />
<text name="contacting">
LindeX wird kontaktiert...
</text>
- <text name="buy_action_unknown">
- L$ an der LindeX kaufen
+ <text name="info_buying">
+ L$ kaufen
</text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
+ <text name="balance_label">
+ Ich habe
+ </text>
+ <text name="balance_amount">
+ [AMT] L$
</text>
<text name="currency_action" width="90">
- L$ kaufen
+ Ich möchte kaufen
+ </text>
+ <text name="currency_label">
+ L$
</text>
- <line_editor left_delta="55" name="currency_amt">
+ <line_editor label="L$" left_delta="55" name="currency_amt">
1234
</line_editor>
+ <text name="buying_label">
+ Zum Preis von
+ </text>
<text name="currency_est">
- für ca. [USD] US$
+ ca. [LOCALAMOUNT]
</text>
<text name="getting_data">
- Daten werden geladen...
- </text>
- <text name="balance_label">
- Sie haben zurzeit
- </text>
- <text name="balance_amount">
- [AMT] L$
+ Schätzung erfolgt...
</text>
- <text name="buying_label">
- Sie kaufen
- </text>
- <text name="buying_amount">
- [AMT] L$
+ <text name="buy_action">
+ [NAME] L$ [PRICE]
</text>
<text name="total_label">
- Ihr neuer Kontostand:
+ Mein neuer Kontostand wird sein
</text>
<text name="total_amount">
[AMT] L$
</text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php?lang=de-DE Zahlungsart] | [http://www.secondlife.com/my/account/currency.php?lang=de-DE Währung] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=de-DE Umtauschrate]
+ </text>
+ <text name="exchange_rate_note">
+ Geben Sie den Betrag erneut ein, um die aktuellste Umtauschrate anzuzeigen.
+ </text>
<text name="purchase_warning_repurchase">
- Dieser Einkauf betrifft ausschließlich Geld.
-Wiederholen Sie den Vorgang.
+ Nach Bestätigung dieses Kaufs werden nur L$ gekauft, nicht das Objekt.
</text>
<text name="purchase_warning_notenough">
- Sie kaufen nicht genügend Geld.
-Kaufen Sie mehr.
+ Sie kaufen nicht genügend L$. Bitte erhöhen Sie den Betrag.
</text>
- <button label="Kaufen" name="buy_btn" />
- <button label="Abbrechen" name="cancel_btn" />
- <text name="buy_currency">
- [LINDENS] L$ für ca. [USD] US$ kaufen
+ <button label="Jetzt kaufen" name="buy_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <text name="info_cannot_buy" left="160" width="200" height="40">
+ Kauf nicht
+möglich
</text>
+ <button label="Weiter zum Internet" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index e0abf8fae9..7426e97d9e 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -1,43 +1,170 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Land kaufen">
+<floater name="buy land" title="LAND KAUFEN">
+ <floater.string name="can_resell">
+ Verkauf möglich.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Verkauf nicht möglich.
+ </floater.string>
+ <floater.string name="can_change">
+ Zusammenlegen/unterteilen möglich.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Zusammenlegen/unterteilen nicht möglich.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Kein Land ausgewählt.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Mehrere unterschiedliche Parzellen ausgewählt.
+Verkleinern Sie Ihre Auswahl.
+ </floater.string>
+ <floater.string name="no_permission">
+ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Die ausgewählte Parzelle steht nicht zum Verkauf.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Die Parzelle befindet sich bereits in Gruppenbesitz.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Die Parzelle gehört Ihnen bereits.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Die ausgewählte Parzelle steht zum Verkauf an Dritte.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Das ausgewählte Land beinhaltet kein öffentliches Land.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Sie haben Land ausgewählt, das einer anderen Person gehört.
+Verkleinern Sie Ihre Auswahl.
+ </floater.string>
+ <floater.string name="processing">
+ Kauf wird abgewickelt...
+
+(Dies kann 1 bis 2 Minuten dauern.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Fehler bei Abfrage der Landkauf-Informationen.
+ </floater.string>
+ <floater.string name="buying_will">
+ Bei Landkauf:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Landkauf für Gruppe:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Kaufen jetzt nicht möglich:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Nicht zu verkaufen:
+ </floater.string>
+ <floater.string name="none_needed">
+ nicht benötigt
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Sie müssen Ihr Konto upgraden, um Land kaufen zu können.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Mit Ihrem Konto können Sie Land kaufen.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Sie besitzen [BUYER] m² Land.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ [SELLER] [AMOUNT] L$ für das Land bezahlen
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Kaufen Sie [AMOUNT] L$ für ca. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Diese Parzelle ist [AMOUNT] m².
+ </floater.string>
+ <floater.string name="premium_land">
+ Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] m² angesetzt.
+ </floater.string>
+ <floater.string name="discounted_land">
+ Dieses Land ist im Angebot. Es wird mit [AMOUNT] m² angesetzt.
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+unterstützt [AMOUNT2] Objekte
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ mit Objekten verkauft
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ Objekte nicht im Verkauf mit eingeschlossen
+ </floater.string>
+ <floater.string name="info_price_string">
+ [PRICE] L$
+([PRICE_PER_SQM] L$/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$.
+ </floater.string>
+ <floater.string name="balance_left">
+ Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (keine Parzelle ausgewählt)
+ </floater.string>
+ <floater.string name="icon_PG" value="Parcel_PG_Dark"/>
+ <floater.string name="icon_M" value="Parcel_M_Dark"/>
+ <floater.string name="icon_R" value="Parcel_R_Dark"/>
<text name="region_name_label">
Region:
</text>
- <text left="580" name="region_name_text">
+ <text left="680" left_delta="140" name="region_name_text">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="580" name="region_type_text">
+ <text left="680" left_delta="140" name="region_type_text">
(unbekannt)
</text>
<text name="estate_name_label">
Grundstück:
</text>
- <text left="580" name="estate_name_text">
+ <text left="680" left_delta="140" name="estate_name_text">
(unbekannt)
</text>
<text name="estate_owner_label" right="600" width="200">
Grundstückseigentümer:
</text>
- <text left="580" name="estate_owner_text">
+ <text left="680" left_delta="140" name="estate_owner_text">
(unbekannt)
</text>
- <text name="resellable_changeable_label">
+ <text left="410" name="resellable_changeable_label">
Gekauftes Land in dieser Region:
</text>
- <text name="resellable_clause">
+ <text left="410" name="resellable_clause">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text name="changeable_clause">
+ <text left="410" name="changeable_clause">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text name="covenant_text">
+ <text left="410" name="covenant_text">
Sie müssen dem Grundstücksvertrag zustimmen:
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor left="470" name="covenant_editor">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -51,14 +178,14 @@
Größe:
</text>
<text name="info_size">
- 1024 qm.
+ 1.024 m²
</text>
<text name="info_price_label">
Preis:
</text>
<text name="info_price">
1500 L$
-(L$ 1,1 L$/qm)
+(1,1 L$/m²)
Objekte im Verkauf eingeschlossen
</text>
<text name="info_action">
@@ -67,7 +194,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web"/>
+ <button label="Gehe zu Website" name="error_web" top_delta="136"/>
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -75,16 +202,17 @@ Objekte im Verkauf eingeschlossen
Landbesitz ist Premium-Mitgliedern vorbehalten.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9,95 US$/Monat, monatliche Abrechnung" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="7,50 US$/Monat, vierteljährliche Abrechnung" />
- <combo_box.item name="US$6.00/month,billedannually" label="6,00 US$/Monat, jährliche Abrechnung" />
+ <combo_box.item label="9,95 US$/Monat, monatliche Abrechnung" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
+ <text height="36" name="land_use_action" top="270">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
+auf 40 US$/month.
</text>
<text name="land_use_reason">
- Sie besitzen 1309 qm Land.
-Diese Parzelle ist 512 qm groß.
+ Sie besitzen 1309 m² Land.
+Diese Parzelle ist 512 m² gross.
</text>
<text name="purchase_action">
Joe Resident 4000 L$ für das Land bezahlen
@@ -99,139 +227,12 @@ Diese Parzelle ist 512 qm groß.
1000
</line_editor>
<text name="currency_est">
- für ca. [AMOUNT2] US$
+ für ca. [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Sie haben 2.100 L$.
</text>
- <check_box label="[AMOUNT] Quadratmeter des Beitrags von Gruppe nehmen." name="remove_contribution"/>
+ <check_box label="[AMOUNT] m² Beitrag von der Gruppe entfernen." name="remove_contribution"/>
<button label="Kaufen" name="buy_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
- <string name="can_resell">
- Verkauf möglich.
- </string>
- <string name="can_not_resell">
- Verkauf nicht möglich.
- </string>
- <string name="can_change">
- Zusammenlegen/unterteilen möglich.
- </string>
- <string name="can_not_change">
- Zusammenlegen/unterteilen nicht möglich.
- </string>
- <string name="cant_buy_for_group">
- Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
- </string>
- <string name="no_land_selected">
- Kein Land ausgewählt.
- </string>
- <string name="multiple_parcels_selected">
- Mehrere unterschiedliche Parzellen ausgewählt.
-Verkleinern Sie Ihre Auswahl.
- </string>
- <string name="no_permission">
- Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
- </string>
- <string name="parcel_not_for_sale">
- Die ausgewählte Parzelle steht nicht zum Verkauf.
- </string>
- <string name="group_already_owns">
- Die Parzelle befindet sich bereits in Gruppenbesitz.
- </string>
- <string name="you_already_own">
- Die Parzelle gehört Ihnen bereits.
- </string>
- <string name="set_to_sell_to_other">
- Die ausgewählte Parzelle steht zum Verkauf an Dritte.
- </string>
- <string name="no_public_land">
- Das ausgewählte Land beinhaltet kein öffentliches Land.
- </string>
- <string name="not_owned_by_you">
- Sie haben Land ausgewählt, das einer anderen Person gehört.
-Verkleinern Sie Ihre Auswahl.
- </string>
- <string name="processing">
- Kauf wird abgewickelt...
-
-(Dies kann 1 bis 2 Minuten dauern.)
- </string>
- <string name="fetching_error">
- Fehler bei Abfrage der Landkauf-Informationen.
- </string>
- <string name="buying_will">
- Bei Landkauf:
- </string>
- <string name="buying_for_group">
- Landkauf für Gruppe:
- </string>
- <string name="cannot_buy_now">
- Kaufen jetzt nicht möglich:
- </string>
- <string name="not_for_sale">
- Nicht zu verkaufen:
- </string>
- <string name="none_needed">
- nicht benötigt
- </string>
- <string name="must_upgrade">
- Sie müssen Ihr Konto upgraden, um Land kaufen zu können.
- </string>
- <string name="cant_own_land">
- Mit Ihrem Konto können Sie Land kaufen.
- </string>
- <string name="land_holdings">
- Sie besitzen [BUYER] qm Land.
- </string>
- <string name="pay_to_for_land">
- [SELLER] [AMOUNT] L$ für das Land bezahlen
- </string>
- <string name="buy_for_US">
- [AMOUNT] L$ für circa [AMOUNT2] US$ kaufen,
- </string>
- <string name="parcel_meters">
- Diese Parzelle ist [AMOUNT] qm groß.
- </string>
- <string name="premium_land">
- Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] qm angesetzt.
- </string>
- <string name="discounted_land">
- Dieses Land ist im Angebot. Es wird mit [AMOUNT] qm angesetzt.
- </string>
- <string name="meters_supports_object">
- [AMOUNT] qm.
-unterstützt [AMOUNT2] Objekte
- </string>
- <string name="sold_with_objects">
- mit Objekten verkauft
- </string>
- <string name="sold_without_objects">
- Objekte nicht im Verkauf mit eingeschlossen
- </string>
- <string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/qm)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann.
- </string>
- <string name="have_enough_lindens">
- Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes.
- </string>
- <string name="not_enough_lindens">
- Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$.
- </string>
- <string name="balance_left">
- Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen.
- </string>
- <string name="no_parcel_selected">
- (keine Parzelle ausgewählt)
- </string>
- <string name="buy_currency">
- [LINDENS] L$ für ca. [USD] US$ kaufen
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml
index 3cfa59ff06..b23163b4a3 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="contents" title="Objektkopie kaufen">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="KOPIE DES OBJEKTES KAUFEN">
<text name="contents_text">
- samt Inhalt:
+ Inhalt:
</text>
<text name="buy_text">
[AMOUNT] L$ von [NAME] kaufen?
</text>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73" />
- <button label="Kaufen" label_selected="Kaufen" name="buy_btn" />
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/>
+ <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>
<text name="title_buy_text">
Kaufen
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index f44db713d8..b8616ea128 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="camera_floater">
<floater.string name="rotate_tooltip">
Kamera um Fokus drehen
@@ -11,6 +11,21 @@
</floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
- <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/>
+ <panel name="zoom" tool_tip="Kamera auf Fokus zoomen">
+ <slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Hinteransicht"/>
+ <button name="group_view" tool_tip="Gruppen-Ansicht"/>
+ <button name="front_view" tool_tip="Vorderansicht"/>
+ <button name="mouselook_view" tool_tip="Mouselook"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Kamera kreisen"/>
+ <button label="" name="pan_btn" tool_tip="Kamera schwenken"/>
+ <button label="" name="avatarview_btn" tool_tip="Avatarsicht"/>
+ <button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_choose_group.xml b/indra/newview/skins/default/xui/de/floater_choose_group.xml
index dd29aa7550..3d76b645fe 100644
--- a/indra/newview/skins/default/xui/de/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/de/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="groups" title="Gruppen">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GRUPPEN">
<text name="groupdesc">
Gruppe wählen:
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml
index fa2f616249..aed4bacb30 100644
--- a/indra/newview/skins/default/xui/de/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="Farbauswahl">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="FARBAUSWAHL">
<text name="r_val_text">
Rot:
</text>
@@ -18,15 +18,14 @@
<text name="l_val_text">
Hell.:
</text>
- <check_box label="Sofort übernehmen" name="apply_immediate" />
- <button label="" label_selected="" name="color_pipette" />
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" />
- <button label="Auswählen" label_selected="Auswählen" name="select_btn" />
+ <check_box label="Jetzt übernehmen" name="apply_immediate"/>
+ <button label="" label_selected="" name="color_pipette"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Aktuelle Farbe:
</text>
<text name="(Drag below to save.)">
-(Nach unten ziehen,
- um zu speichern)
+ (Nach unten ziehen)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml
index 06b53dd8b4..b1e9ef6f19 100644
--- a/indra/newview/skins/default/xui/de/floater_customize.xml
+++ b/indra/newview/skins/default/xui/de/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Aussehen">
+<floater name="floater customize" title="AUSSEHEN">
<tab_container name="customize tab container">
- <placeholder label="Körperteile" name="body_parts_placeholder"/>
+ <text label="Körperteile" name="body_parts_placeholder">
+ Körperteile
+ </text>
<panel label="Form" name="Shape">
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
<button label="Körper" label_selected="Körper" name="Body"/>
@@ -14,8 +16,8 @@
<button label="Oberkörper" label_selected="Oberkörper" name="Torso"/>
<button label="Beine" label_selected="Beine" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Weiblich"/>
- <radio_item name="radio2" label="Männlich"/>
+ <radio_item label="Weiblich" name="radio" value="0"/>
+ <radio_item label="Männlich" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,9 +35,7 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine Körperform aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch eine neue Körperform erstellen
-und diese anziehen.
+ Ziehen Sie eine neue Form aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -68,9 +68,7 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine Haut aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch eine neue Haut erstellen
-und diese anziehen.
+ Ziehen Sie eine neue Skin (Haut) aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -107,9 +105,7 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Haare aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch neue Haare erstellen
-und diese anziehen.
+ Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -140,9 +136,7 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Augen aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch neue Augen erstellen
-und diese anziehen.
+ Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -156,12 +150,14 @@ und diese anziehen.
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
- <panel label="Kleidung" name="clothes_placeholder"/>
+ <text label="Kleidung" name="clothes_placeholder">
+ Kleidung
+ </text>
<panel label="Hemd" name="Shirt">
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
@@ -181,9 +177,7 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie ein Hemd aus dem Inventar auf Ihren Avatar,
-um es zu tragen. Sie können auch ein neues Hemd erstellen
-und dieses anziehen.
+ Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -195,8 +189,8 @@ und dieses anziehen.
<panel label="Hose" name="Pants">
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
@@ -216,9 +210,7 @@ und dieses anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine Hose aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch eine neue Hose erstellen
-und diese anziehen.
+ Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -244,10 +236,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Schuhe aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch neue Schuhe erstellen
-und diese anziehen.
+ Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -256,7 +247,6 @@ und diese anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -279,10 +269,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Socken aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch neue Socken erstellen
-und diese anziehen.
+ Ziehen Sie neue Strümpfe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -291,7 +280,6 @@ und diese anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -314,10 +302,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine Jacke aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch eine neue Jacke erstellen
-und diese anziehen.
+ Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -327,7 +314,6 @@ und diese anziehen.
<texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -350,10 +336,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Handschuhe aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch neue Handschuhe erstellen
-und diese anziehen.
+ Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -362,7 +347,6 @@ und diese anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -385,10 +369,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie ein Unterhemd aus dem Inventar auf Ihren Avatar,
-um es zu tragen. Sie können auch ein neues Unterhemd erstellen
-und dieses anziehen.
+ Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -397,7 +380,6 @@ und dieses anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -420,10 +402,9 @@ und dieses anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine Unterhose aus dem Inventar auf Ihren Avatar,
-um sie zu tragen. Sie können auch eine neue Unterhose erstellen
-und diese anziehen.
+ Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -432,7 +413,6 @@ und diese anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
@@ -455,10 +435,9 @@ und diese anziehen.
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie einen Rock aus dem Inventar auf Ihren Avatar,
-um ihn zu tragen. Sie können auch einen neuen Rock erstellen
-und diesen anziehen.
+ Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -467,14 +446,84 @@ und diesen anziehen.
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
+ <panel label="Tätowierung" name="Tattoo">
+ <text name="title">
+ [BESCHR]
+ </text>
+ <text name="title_no_modify">
+ [BESCHR]: bearbeiten nicht möglich
+ </text>
+ <text name="title_loading">
+ [BESCHR]: wird geladen...
+ </text>
+ <text name="title_not_worn">
+ [BESCHR]: nicht getragen
+ </text>
+ <text name="path">
+ Befindet sich in [PATH]
+ </text>
+ <text name="not worn instructions">
+ Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
+ </text>
+ <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/>
+ <text name="no modify instructions">
+ Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
+ </text>
+ <text name="Item Action Label">
+ Tätowierung:
+ </text>
+ <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
+ <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
+ <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
+ </panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [BESCHR]
+ </text>
+ <text name="title_no_modify">
+ [BESCHR]: bearbeiten nicht möglich
+ </text>
+ <text name="title_loading">
+ [BESCHR]: wird geladen...
+ </text>
+ <text name="title_not_worn">
+ [BESCHR]: nicht getragen
+ </text>
+ <text name="path">
+ Befindet sich in [PATH]
+ </text>
+ <text name="not worn instructions">
+ Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ </text>
+ <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/>
+ <text name="no modify instructions">
+ Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
+ <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
+ <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
+ </panel>
</tab_container>
+ <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info" tool_tip="Skripts, die an Ihren Avatar angehängt sind, anzeigen"/>
+ <button label="Outfit erstellen" label_selected="Outfit erstellen" name="make_outfit_btn"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Outfit erstellen..." label_selected="Outfit erstellen..." name="Make Outfit" width="115"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
index d5a216a0b5..9baf30fb53 100644
--- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Day Cycle Floater" title="Tageszyklus-Editor">
+<floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR">
<tab_container name="Day Cycle Tabs">
<panel label="Tageszyklus" name="Day Cycle">
<button label=" ?" name="WLDayCycleHelp" />
@@ -66,7 +66,7 @@
Key-Zeit:
</text>
<spinner label="Std." name="WLCurKeyHour" />
- <spinner label="Min." name="WLCurKeyMin" />
+ <spinner label="Min." name="WLCurKeyMin" label_width="100" width="66"/>
<text name="WLCurKeyTimeText2">
Key-Voreinstellung:
</text>
@@ -79,8 +79,8 @@
Zykluslänge:
</text>
<spinner label="Std." name="WLLengthOfDayHour" />
- <spinner label="Min." name="WLLengthOfDayMin" />
- <spinner label="Sek." name="WLLengthOfDaySec" />
+ <spinner label="Min." name="WLLengthOfDayMin" label_width="100" width="66"/>
+ <spinner label="Sek." name="WLLengthOfDaySec" label_width="100" width="66"/>
<text name="DayCycleText3">
Vorschau:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_device_settings.xml b/indra/newview/skins/default/xui/de/floater_device_settings.xml
index 734f4e942c..3d7e9c96c1 100644
--- a/indra/newview/skins/default/xui/de/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_device_settings.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_device_settings" title="Geräte-Einstellungen für Voice-Chat" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_device_settings" title="EINSTELLUNGEN FÜR VOICE-CHAT"/>
diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml
index 3717ff6a48..0f2370771f 100644
--- a/indra/newview/skins/default/xui/de/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_env_settings.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Environment Editor Floater" title="Umwelt-Editor">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="UMWELT-EDITOR">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Tageszeit
</text>
@@ -12,13 +15,12 @@
<text name="EnvWaterColorText">
Wasserfarbe
</text>
- <color_swatch name="EnvWaterColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen" />
+ <color_swatch name="EnvWaterColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<text name="EnvWaterFogText">
Wasser-
trübung
</text>
- <button label="Grundstückszeit verw." name="EnvUseEstateTimeButton" />
- <button label="Himmel (erweitert)" name="EnvAdvancedSkyButton" />
- <button label="Wasser (erweitert)" name="EnvAdvancedWaterButton" />
- <button label=" ?" name="EnvSettingsHelpButton" />
+ <button label="Grundstückszeit verw." name="EnvUseEstateTimeButton"/>
+ <button label="Himmel (erweitert)" name="EnvAdvancedSkyButton"/>
+ <button label="Wasser (erweitert)" name="EnvAdvancedWaterButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_event.xml b/indra/newview/skins/default/xui/de/floater_event.xml
new file mode 100644
index 0000000000..a41ac521a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_event.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT-DETAILS">
+ <floater.string name="none">
+ keines
+ </floater.string>
+ <floater.string name="notify">
+ Benachrichtigen
+ </floater.string>
+ <floater.string name="dont_notify">
+ Nicht benachrichtigen
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Namenloses Event....namenlos! Tadaaa! Tadatadaaaah!
+ </text>
+ <text name="event_category">
+ (keine Kategorie)
+ </text>
+ <text name="event_runby_label">
+ Ausgeführt von:
+ </text>
+ <text initial_value="(wird in Datenbank gesucht)" name="event_runby"/>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration">
+ 1 Stunde
+ </text>
+ <text name="event_cover">
+ Kostenlos
+ </text>
+ <text name="event_location_label">
+ Standort:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Einstufung:"/>
+ <text name="rating_value" value="unbekannt"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Event erstellen"/>
+ <button name="god_delete_event_btn" tool_tip="Event löschen"/>
+ <button label="Mich benachrichtigen" name="notify_btn"/>
+ <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Karte" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_first_time_tip.xml b/indra/newview/skins/default/xui/de/floater_first_time_tip.xml
new file mode 100644
index 0000000000..9546cc2c42
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_first_time_tip.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="set_name_in_the_cladd">
+ <check_box label="Turn off Quick Tips" name="DontShowFirstTimeTip_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_font_test.xml b/indra/newview/skins/default/xui/de/floater_font_test.xml
index 54278fc094..29357b8ee0 100644
--- a/indra/newview/skins/default/xui/de/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/de/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Schriftart-Test">
+<floater name="contents" title="TEST DER SCHRIFTART">
<text name="linea">
OverrideTest, sollte hier als Times angezeigt werden. (Aus default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_gesture.xml b/indra/newview/skins/default/xui/de/floater_gesture.xml
index bdee3b8664..0b27b362c3 100644
--- a/indra/newview/skins/default/xui/de/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_gesture.xml
@@ -1,17 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="Aktive Gesten">
- <text name="help_label">
- Doppelklicken Sie auf eine Geste, um Animationen und Sound &#10;abzuspielen.
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Orte" name="gestures" title="GESTEN">
+ <floater.string name="loading">
+ Wird geladen...
+ </floater.string>
+ <floater.string name="playing">
+ (Wird abgespielt)
+ </floater.string>
+ <floater.string name="copy_name">
+ Kopie von [COPY_NAME]
+ </floater.string>
<scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="Trigger" name="trigger" />
- <column label="Key" name="shortcut" />
- <column label="" name="key" />
- <column label="Name" name="name" />
+ <scroll_list.columns label="Name" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
+ <scroll_list.columns label="" name="key"/>
+ <scroll_list.columns label="Key" name="shortcut"/>
</scroll_list>
- <button label="Neu" name="new_gesture_btn" />
- <button label="Inventar" name="inventory_btn" />
- <button label="Bearbeiten" name="edit_btn" />
- <button label="Abspielen" name="play_btn" />
- <button label="Stopp" name="stop_btn" />
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Mehr Möglichkeiten"/>
+ <button name="new_gesture_btn" tool_tip="Neue Geste erstellen"/>
+ <button name="activate_btn" tool_tip="Ausgewählte Geste aktivieren/deaktivieren"/>
+ <button name="del_btn" tool_tip="Diese Geste löschen"/>
+ </panel>
+ <button label="Bearbeiten" name="edit_btn"/>
+ <button label="Abspielen" name="play_btn"/>
+ <button label="Stopp" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml
index c7cfb5d9d3..30b151ca58 100644
--- a/indra/newview/skins/default/xui/de/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml
@@ -1,136 +1,99 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="godtools floater" title="Gott-Werkzeuge">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="GOTT-WERKZEUGE">
<tab_container name="GodTools Tabs">
<panel label="Raster" name="grid">
- <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen"
- name="Kick all users" width="175" />
- <button label="Sichtbarkeits-Cache dieser Regionskarte leeren"
- label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren"
- name="Flush This Region&apos;s Map Visibility Caches" width="285" />
+ <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/>
+ <button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
</panel>
<panel label="Region" name="region">
<text name="Sim Name:" width="55">
Sim-Name:
</text>
- <check_box label="Startbereich Einleitung" name="check prelude"
- tool_tip="Diese Region zu einem Startbereich machen." />
- <check_box label="Sonne fest" name="check fixed sun"
- tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“." />
- <check_box label="Zuhause auf Teleport &#10;zurücksetzen" name="check reset home"
- tool_tip="Wenn Einwohner wegteleportieren, ihr Zuhause auf Zielposition setzen." height="32" />
- <check_box label="Sichtbar" name="check visible"
- tool_tip="Diese Region für Nicht-Götter sichtbar machen." bottom_delta="-32" />
- <check_box label="Schaden" name="check damage"
- tool_tip="Schaden in dieser Region aktivieren." />
- <check_box label="Trafficüberwachung blockieren" name="block dwell"
- tool_tip="In dieser Region die Traffic-Berechnung abschalten." />
- <check_box label="Terraformen blockieren" name="block terraform"
- tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)" />
- <check_box label="Sandkasten" name="is sandbox"
- tool_tip="Sandkastenregion ein-/ausschalten." />
- <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain"
- tool_tip="Das aktuelle Terrain als Standard speichern." width="118" />
- <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen"
- name="Revert Terrain"
- tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118" />
- <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain"
- tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118" />
+ <check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/>
+ <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“."/>
+ <check_box label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/>
+ <check_box label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
+ <check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/>
+ <check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/>
+ <check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/>
+ <check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/>
+ <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="120"/>
+ <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="120"/>
+ <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="120"/>
<text name="estate id">
Grundstücks-ID:
</text>
<text name="parent id">
Parent ID:
</text>
- <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region" />
+ <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/>
<text name="Grid Pos: ">
Raster-Pos.:
</text>
- <line_editor name="gridposx" tool_tip="Die X-Rasterposition dieser Region" left_delta="110" width="35" />
- <line_editor name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" left_delta="45" width="35" />
- <text name="Redirect to Grid: " >
+ <line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/>
+ <line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/>
+ <text name="Redirect to Grid: " width="110">
Auf Raster umleiten:
</text>
- <line_editor left_delta="110" name="redirectx" width="35" />
+ <line_editor left_delta="110" name="redirectx" width="35" left_pad="0"/>
<line_editor left_delta="45" name="redirecty" width="35" />
- <text name="billable factor text" font="SansSerifSmall" >
+ <text font="SansSerifSmall" name="billable factor text">
Abrechnungsfaktor:
</text>
<text name="land cost text">
L$ pro qm:
</text>
- <button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh"
- tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren." />
- <button label="Übernehmen" label_selected="Übernehmen" name="Apply"
- tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen." />
- <button label="Region auswählen" label_selected="Region auswählen"
- name="Select Region"
- tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130" left="136"/>
- <button label="Automatisch speichern" label_selected="Automatisch speichern"
- name="Autosave now"
- tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130" left="136"/>
+ <button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/>
+ <button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
+ <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="132"/>
+ <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="132"/>
</panel>
<panel label="Objekte" name="objects">
+ <panel.string name="no_target">
+ (kein Ziel)
+ </panel.string>
<text name="Sim Name:" width="55">
Sim-Name:
</text>
<text name="region name">
Welsh
</text>
- <check_box label="Skripts &#10;deaktivieren" name="disable scripts"
- tool_tip="Skripts in dieser Region komplett abschalten" />
- <check_box label="Kollisionen &#10;deaktivieren" name="disable collisions"
- tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten" />
- <check_box label="Physik deaktivieren" name="disable physics"
- tool_tip="Die Physik in dieser Region komplett abschalten" />
- <button label="Übernehmen" label_selected="Übernehmen" name="Apply"
- tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen." />
- <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target"
- tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen." />
+ <check_box label="Skripts deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/>
+ <check_box label="Kollisionen deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/>
+ <check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/>
+ <button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
+ <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/>
<text name="target_avatar_name">
(kein Ziel)
</text>
- <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen"
- label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen"
- name="Delete Target&apos;s Scripted Objects On Others Land"
- tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben." />
- <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen"
- label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen"
- name="Delete Target&apos;s Scripted Objects On *Any* Land"
- tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben." />
- <button label="*ALLE* Objekte des Ziels löschen"
- label_selected="*ALLE* Objekte des Ziels löschen"
- name="Delete *ALL* Of Target&apos;s Objects"
- tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben." />
- <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte"
- name="Get Top Colliders"
- tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130" />
- <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts"
- tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130" />
- <button label="Scripting-Übersicht" label_selected="Scripting-Übersicht"
- name="Scripts digest"
- tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130" />
+ <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+ <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+ <button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+ <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/>
+ <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/>
+ <button label="Scripting-Übersicht" label_selected="Scripting-Übersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/>
</panel>
<panel label="Anfrage" name="request">
<text name="Destination:">
Ziel:
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="Auswahl" />
- <combo_box.item name="item2" label="Avatar-Region" />
+ <combo_box.item label="Auswahl" name="item1"/>
+ <combo_box.item label="Avatar-Region" name="item2"/>
</combo_box>
<text name="Request:">
Anfrage:
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="Kollisionsobjekte &lt;Schritte&gt;" />
- <combo_box.item name="item2" label="Skripts &lt;Zähler&gt;,&lt;Optionales Muster&gt;" />
- <combo_box.item name="item3" label="Objekte &lt;Muster&gt;" />
- <combo_box.item name="item4" label="lt;asset_id&gt; erstellen" />
+ <combo_box.item label="Kollisionsobjekte &lt;Schritte&gt;" name="item1"/>
+ <combo_box.item label="Skripts &lt;Zähler&gt;,&lt;Optionales Muster&gt;" name="item2"/>
+ <combo_box.item label="Objekte &lt;Muster&gt;" name="item3"/>
+ <combo_box.item label="lt;asset_id&gt; erstellen" name="item4"/>
</combo_box>
<text name="Parameter:">
Parameter:
</text>
- <button label="Anfrage" label_selected="Anfrage" name="Make Request" />
+ <button label="Anfrage" label_selected="Anfrage" name="Make Request"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index 4051776b0d..d01ea145f1 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -1,30 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Hardware Settings Floater" title="Hardware-Einstellungen">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN">
<text name="Filtering:">
Filtern:
</text>
- <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani" />
+ <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/>
<text name="Antialiasing:">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa">
- <combo_box.item name="FSAADisabled" label="Deaktiviert" />
- <combo_box.item name="2x" label="2x" />
- <combo_box.item name="4x" label="4x" />
- <combo_box.item name="8x" label="8x" />
- <combo_box.item name="16x" label="16x" />
+ <combo_box.item label="Deaktiviert" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
- <spinner label="Gamma:" name="gamma" />
+ <spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (Helligkeit, niedriger ist heller, 0=Standard)
+ (0 = Standard-Helligkeit, weniger = heller)
</text>
<text name="Enable VBO:">
VBO aktivieren:
</text>
- <check_box label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo"
- tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist." />
- <slider label="Texturspeicher (MB):" name="GrapicsCardTextureMemory"
- tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen." />
- <spinner label="Nebeldistanzverhältnis:" name="fog" />
- <button label="OK" label_selected="OK" name="OK" />
+ <check_box initial_value="true" label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/>
+ <slider label="Texturspeicher (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
+ <spinner label="Nebeldistanzverhältnis:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_help_browser.xml b/indra/newview/skins/default/xui/de/floater_help_browser.xml
new file mode 100644
index 0000000000..d55a3b0a26
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="HILFE-BROWSER">
+ <floater.string name="loading_text">
+ Wird geladen...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_hud.xml b/indra/newview/skins/default/xui/de/floater_hud.xml
index 0f11e2346d..8a10eccabe 100644
--- a/indra/newview/skins/default/xui/de/floater_hud.xml
+++ b/indra/newview/skins/default/xui/de/floater_hud.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="Tutorial" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="ANLEITUNG"/>
diff --git a/indra/newview/skins/default/xui/de/floater_im.xml b/indra/newview/skins/default/xui/de/floater_im.xml
index 9b9bbd0c64..6aa35f2900 100644
--- a/indra/newview/skins/default/xui/de/floater_im.xml
+++ b/indra/newview/skins/default/xui/de/floater_im.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Instant Message">
<string name="only_user_message">
Sie sind der einzige Benutzer in dieser Sitzung.
@@ -10,7 +10,7 @@
Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
</string>
<string name="muted_message">
- Sie haben diesen Einwohner stummgeschaltet.Wenn Sie ihm eine Nachricht senden, wird die Stummschaltung automatisch aufgehoben.
+ Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.
</string>
<string name="generic_request_error">
Fehler bei Anfrage, bitte versuchen Sie es später.
diff --git a/indra/newview/skins/default/xui/de/floater_im_container.xml b/indra/newview/skins/default/xui/de/floater_im_container.xml
new file mode 100644
index 0000000000..95eda97938
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="GESPRÄCHE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml
new file mode 100644
index 0000000000..7bde3a3453
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="IM Steuerkonsole" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="Bis" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml
index 724da83495..fd675f8808 100644
--- a/indra/newview/skins/default/xui/de/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Image Preview" title="">
<text name="name_label">
Name:
@@ -10,23 +10,23 @@
Bildvorschau als:
</text>
<combo_box label="Kleidungstyp" name="clothing_type_combo">
- <combo_box.item name="Image" label="Bild" />
- <combo_box.item name="Hair" label="Haar" />
- <combo_box.item name="FemaleHead" label="Kopf (Frau)" />
- <combo_box.item name="FemaleUpperBody" label="Oberkörper (Frau)" />
- <combo_box.item name="FemaleLowerBody" label="Unterkörper (Frau)" />
- <combo_box.item name="MaleHead" label="Kopf (Mann)" />
- <combo_box.item name="MaleUpperBody" label="Oberkörper (Mann)" />
- <combo_box.item name="MaleLowerBody" label="Unterkörper (Mann)" />
- <combo_box.item name="Skirt" label="Rock" />
- <combo_box.item name="SculptedPrim" label="Geformtes Primitiv" />
+ <combo_box.item label="Bild" name="Image"/>
+ <combo_box.item label="Haare" name="Hair"/>
+ <combo_box.item label="Kopf (Frau)" name="FemaleHead"/>
+ <combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/>
+ <combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/>
+ <combo_box.item label="Kopf (Mann)" name="MaleHead"/>
+ <combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/>
+ <combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/>
+ <combo_box.item label="Rock" name="Skirt"/>
+ <combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Bild kann nicht gelesen werden.
Speichern Sie das Bild als 24 Bit Targa (.tga).
</text>
- <check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check" />
- <button label="Abbrechen" name="cancel_btn" />
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" />
+ <check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="146"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml
new file mode 100644
index 0000000000..740085599f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="ANRUF VON UNBEKANNT">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Voice-Chat in der Nähe
+ </floater.string>
+ <floater.string name="anonymous">
+ Anonym
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ ruft an.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ist einem Voice-Konferenz-Chat beigetreten.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
+ </floater.string>
+ <text name="question">
+ Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten?
+ </text>
+ <button label="Akzeptieren" label_selected="Akzeptieren" name="Accept"/>
+ <button label="Ablehnen" label_selected="Ablehnen" name="Reject"/>
+ <button label="IM starten" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml
index f8c9b62824..da97ceb2d8 100644
--- a/indra/newview/skins/default/xui/de/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/de/floater_inspect.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="inspect" title="Objekt prüfen" min_width="450" >
- <scroll_list name="object_list"
- tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren">
- <column label="Objektname" name="object_name" />
- <column label="Besitzer" name="owner_name" />
- <column label="Ersteller" name="creator_name" />
- <column label="Erstellungsdatum" name="creation_date" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="460" name="inspect" title="OBJEKTE UNTERSUCHEN" width="460">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren">
+ <scroll_list.columns label="Objektname" name="object_name"/>
+ <scroll_list.columns label="Besitzer" name="owner_name" />
+ <scroll_list.columns label="Ersteller" name="creator_name"/>
+ <scroll_list.columns label="Erstellungsdatum" name="creation_date" width="116"/>
</scroll_list>
- <button label="Besitzerprofil einsehen..." name="button owner"
- tool_tip="Profil des Besitzers des markierten Objekts einsehen" width="155" />
- <button label="Erstellerprofil einsehen..." name="button creator"
- tool_tip="Profil des ursprünglichen Erstellers des markierten Objekts einsehen" width="155" left="175"/>
+ <button label="Besitzerprofil einsehen..." name="button owner" tool_tip="Profil des Besitzers des markierten Objekts einsehen" width="155"/>
+ <button label="Erstellerprofil einsehen..." left="175" name="button creator" tool_tip="Profil des ursprünglichen Erstellers des markierten Objekts einsehen" width="155"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory.xml b/indra/newview/skins/default/xui/de/floater_inventory.xml
index c8c67240d8..d9b7c30fd2 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory.xml
@@ -1,47 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory" title="Inventar">
- <search_editor label="Suchanfrage hier eintippen" name="inventory search editor" />
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle Objekte" name="All Items" />
- <inventory_panel label="Letzte Objekte" name="Recent Items" />
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Datei" name="File">
- <menu_item_call label="Öffnen" name="Open" />
- <menu_item_call label="Neues Fenster" name="New Window" />
- <menu_item_call label="Filter anzeigen" name="Show Filters" />
- <menu_item_call label="Filter zurücksetzen" name="Reset Current" />
- <menu_item_call label="Alle Ordner schließen" name="Close All Folders" />
- <menu_item_call label="Papierkorb ausleeren" name="Empty Trash" />
- </menu>
- <menu label="Erstellen" name="Create">
- <menu_item_call label="Neuer Ordner" name="New Folder" />
- <menu_item_call label="Neues Skript" name="New Script" />
- <menu_item_call label="Neue Notiz" name="New Note" />
- <menu_item_call label="Neue Geste" name="New Gesture" />
- <menu name="New Clothes">
- <menu_item_call label="Neues Hemd" name="New Shirt" />
- <menu_item_call label="Neue Hose" name="New Pants" />
- <menu_item_call label="Neue Schuhe" name="New Shoes" />
- <menu_item_call label="Neue Socken" name="New Socks" />
- <menu_item_call label="Neue Jacke" name="New Jacket" />
- <menu_item_call label="Neuer Rock" name="New Skirt" />
- <menu_item_call label="Neue Handschuhe" name="New Gloves" />
- <menu_item_call label="Neues Unterhemd" name="New Undershirt" />
- <menu_item_call label="Neue Unterhose" name="New Underpants" />
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Neue Form/Gestalt" name="New Shape" />
- <menu_item_call label="Neue Haut" name="New Skin" />
- <menu_item_call label="Neues Haar" name="New Hair" />
- <menu_item_call label="Neue Augen" name="New Eyes" />
- </menu>
- </menu>
- <menu label="Sortieren" name="Sort">
- <menu_item_check label="Nach Name" name="By Name" />
- <menu_item_check label="Nach Datum" name="By Date" />
- <menu_item_check label="Ordner immer nach Name" name="Folders Always By Name" />
- <menu_item_check label="Systemordner nach oben" name="System Folders To Top" />
- </menu>
- </menu_bar>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="MEIN INVENTAR">
+ <floater.string name="Title">
+ MEIN INVENTAR
+ </floater.string>
+ <floater.string name="TitleFetching">
+ MEIN INVENTAR ([ITEM_COUNT] Objekte werden abgerufen...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ MEIN INVENTAR ([ITEM_COUNT] Objekte) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Abgerufen
+ </floater.string>
+ <panel label="Inventar" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index 3e79a31abd..f98e23bbc4 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="item properties" title="Inventarobjekt-Eigenschaften">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="EIGENSCHAFTEN: INVENTAROBJEKT">
+ <floater.string name="unknown">
+ (unbekannt)
+ </floater.string>
+ <floater.string name="public">
+ (öffentlich)
+ </floater.string>
+ <floater.string name="you_can">
+ Sie können:
+ </floater.string>
+ <floater.string name="owner_can">
+ Eigentümer kann:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Name:
</text>
@@ -12,14 +27,14 @@
<text name="LabelCreatorName">
Nicole Linden
</text>
- <button label="Profil..." label_selected="" name="BtnCreator" />
+ <button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Eigentümer:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
- <button label="Profil..." label_selected="" name="BtnOwner" />
+ <button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erworben:
</text>
@@ -27,55 +42,32 @@
Mittwoch, 24. Mai 2006, 12:50:46
</text>
<text name="OwnerLabel">
- Sie können:
+ Sie:
</text>
- <check_box label="Bearbeiten" name="CheckOwnerModify" />
- <check_box label="Kopieren" name="CheckOwnerCopy" left_delta="85" />
- <check_box label="Verkaufen/Weggeben" name="CheckOwnerTransfer" />
- <text name="BaseMaskDebug">
- B:
+ <check_box label="Bearbeiten" name="CheckOwnerModify"/>
+ <check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/>
+ <check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Jeder:
</text>
- <text name="OwnerMaskDebug">
- O:
+ <check_box label="Kopieren" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppe:
</text>
- <text name="GroupMaskDebug">
- G:
- </text>
- <text name="EveryoneMaskDebug">
- E:
- </text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Mit Gruppe teilen" name="CheckShareWithGroup" />
- <check_box label="Kopieren allen erlauben" name="CheckEveryoneCopy" />
+ <check_box label="Teilen" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="150">
- Nächster Eigentümer kann:
- </text>
- <check_box label="Bearbeiten" name="CheckNextOwnerModify" />
- <check_box label="Kopieren" name="CheckNextOwnerCopy" left_delta="85" />
- <check_box label="Verkaufen/Weggeben" name="CheckNextOwnerTransfer" />
- <text name="SaleLabel">
- Objekt markieren:
- </text>
- <check_box label="Zum Verkauf" name="CheckPurchase" />
- <radio_group name="RadioSaleType" left_delta="85" width="245" >
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Kopieren" />
- </radio_group>
- <text name="TextPrice">
- Preis: L$
- </text>
- <text name="unknown">
- (unbekannt)
- </text>
- <text name="public">
- (öffentlich)
- </text>
- <text name="you_can">
- Sie können:
- </text>
- <text name="owner_can">
- Eigentümer kann:
+ Nächster Eigentümer:
+ </text>
+ <check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
+ <check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/>
+ <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
+ <check_box label="Zum Verkauf" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy" left_pad="25">
+ <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preis:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
index 2f2eb5aa8d..9cc5b92daf 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory Finder" title="inventar_letzte_objekte">
- <check_box label="Animation" name="check_animation" />
- <check_box label="Visitenkarten" name="check_calling_card" />
- <check_box label="Kleidung" name="check_clothing" />
- <check_box label="Gesten" name="check_gesture" />
- <check_box label="Landmarken" name="check_landmark" />
- <check_box label="Notizkarten" name="check_notecard" />
- <check_box label="Objekte" name="check_object" />
- <check_box label="Skripts" name="check_script" />
- <check_box label="Sounds" name="check_sound" />
- <check_box label="Texturen" name="check_texture" />
- <check_box label="Fotos" name="check_snapshot" />
- <button label="Alle" label_selected="Alle" name="All" />
- <button label="Keine" label_selected="Keine" name="None" />
- <check_box label="Ordner immer anzeigen" name="check_show_empty" />
- <check_box label="Seit Abmeldung" name="check_since_logoff" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="Animation" name="check_animation"/>
+ <check_box label="Visitenkarten" name="check_calling_card"/>
+ <check_box label="Kleidung" name="check_clothing"/>
+ <check_box label="Gesten" name="check_gesture"/>
+ <check_box label="Landmarken" name="check_landmark"/>
+ <check_box label="Notizkarten" name="check_notecard"/>
+ <check_box label="Objekte" name="check_object"/>
+ <check_box label="Skripts" name="check_script"/>
+ <check_box label="Sounds" name="check_sound"/>
+ <check_box label="Texturen" name="check_texture"/>
+ <check_box label="Fotos" name="check_snapshot"/>
+ <button label="Alle" label_selected="Alle" name="All"/>
+ <button label="Keine" label_selected="Keine" name="None"/>
+ <check_box label="Ordner immer anzeigen" name="check_show_empty"/>
+ <check_box label="Seit Abmeldung" name="check_since_logoff"/>
<text name="- OR -">
- ODER -
</text>
- <spinner label="Stunden zuvor" label_width="80" name="spin_hours_ago" />
- <spinner label="Tage zuvor" name="spin_days_ago" />
- <button label="Schließen" label_selected="Schließen" name="Close" />
+ <spinner label="Stunden zuvor" label_width="80" name="spin_hours_ago"/>
+ <spinner label="Tage zuvor" name="spin_days_ago"/>
+ <button label="Schließen" label_selected="Schließen" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_joystick.xml b/indra/newview/skins/default/xui/de/floater_joystick.xml
index ccf6f14ead..2efc11df29 100644
--- a/indra/newview/skins/default/xui/de/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/de/floater_joystick.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Joystick-Konfiguration">
- <check_box name="enable_joystick" width="80" label="Joystick aktivieren:"/>
+<floater name="Joystick" title="JOYSTICK-KONFIGURATION">
+ <check_box label="Joystick aktivieren:" name="enable_joystick" width="80"/>
<text left="140" name="joystick_type" width="360"/>
<spinner label="X-Achse" name="JoystickAxis1"/>
<spinner label="Y-Achse" name="JoystickAxis2"/>
@@ -15,9 +15,9 @@
<text name="Control Modes:">
Steuermodi:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" label="Bauen"/>
- <check_box name="JoystickFlycamEnabled" label="Flycam"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Bauen" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
X-Skala
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml
index 4dd9fd6c76..45ff37c147 100644
--- a/indra/newview/skins/default/xui/de/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/de/floater_lagmeter.xml
@@ -1,152 +1,151 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_lagmeter" title="Lag-Anzeige">
- <button name="client_lagmeter" tool_tip="Client-Lag-Status" />
- <text name="client">
- Client:
- </text>
- <text name="client_text">
- Normal
- </text>
- <button name="network_lagmeter" tool_tip="Netzwerk-Lag-Status" />
- <text name="network">
- Netzwerk:
- </text>
- <text name="network_text">
- Normal
- </text>
- <button name="server_lagmeter" tool_tip="Server-Lag-Status" />
- <text name="server">
- Server:
- </text>
- <text name="server_text">
- Normal
- </text>
- <button label="?" name="server_help" />
- <button label="&gt;&gt; " name="minimize" />
- <text name="max_title_msg">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="LAG METER">
+ <floater.string name="max_title_msg">
Lag-Anzeige
- </text>
- <text name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
350
- </text>
- <text name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </text>
- <text name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </text>
- <text name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Client
- </text>
- <text name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </text>
- <text name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </text>
- <text name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, Fenster im Hintergrund
- </text>
- <text name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Client-Frame-Rate unter [CLIENT_FRAME_RATE_CRITICAL]
- </text>
- <text name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Client-Frame-Rate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING]
- </text>
- <text name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </text>
- <text name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Mögliche Ursache: Sichtweite zu groß
- </text>
- <text name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Mögliche Ursache: Bilder werden geladen
- </text>
- <text name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Mögliche Ursache: Zu viele Bilder im Speicher
- </text>
- <text name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Mögliche Ursache: Zu viele komplexe Objekte in der Szene
- </text>
- <text name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Netzwerk
- </text>
- <text name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </text>
- <text name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </text>
- <text name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL]%
- </text>
- <text name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]%
- </text>
- <text name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </text>
- <text name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </text>
- <text name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </text>
- <text name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Ping-Zeit der Verbindung übersteigt [NETWORK_PING_CRITICAL] ms
- </text>
- <text name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Ping-Zeit der Verbindung liegt bei [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </text>
- <text name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Möglicherweise schlechte Verbindung oder zu hoher Wert für „Bandbreite“.
- </text>
- <text name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Möglicherweise schlechte Verbindung oder File-Sharing-Anwendung.
- </text>
- <text name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Server
- </text>
- <text name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </text>
- <text name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </text>
- <text name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </text>
- <text name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Simulator-Frame-Rate liegt unter [SERVER_FRAME_RATE_CRITICAL]
- </text>
- <text name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Simulator-Frame-Rate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING]
- </text>
- <text name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </text>
- <text name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Mögliche Ursache: Zu viele physische Objekte
- </text>
- <text name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Mögliche Ursache: Zu viele geskriptete Objekte
- </text>
- <text name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Mögliche Ursache: Zu viel Netzwerktraffic
- </text>
- <text name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Mögliche Ursache: Zu viele Personen in Bewegung in der Region
- </text>
- <text name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Mögliche Ursache: Zu viele Bildberechnungen
- </text>
- <text name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Mögliche Ursache: Zu hohe Simulator-Last
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Client-Lag-Status"/>
+ <text name="client">
+ Client
</text>
- <text name="smaller_label">
- &gt;&gt; 
+ <text name="client_text">
+ Normal
+ </text>
+ <button name="network_lagmeter" tool_tip="Netzwerk-Lag-Status"/>
+ <text name="network">
+ Netzwerk
</text>
- <text name="bigger_label">
- &lt;&lt; 
+ <text name="network_text">
+ Normal
+ </text>
+ <button name="server_lagmeter" tool_tip="Server-Lag-Status"/>
+ <text name="server">
+ Server
+ </text>
+ <text name="server_text">
+ Normal
</text>
+ <button label="&gt;&gt; " name="minimize" tool_tip="Fenstergröße ändern"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_land_holdings.xml b/indra/newview/skins/default/xui/de/floater_land_holdings.xml
index 6854903382..73559407a9 100644
--- a/indra/newview/skins/default/xui/de/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/de/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Mein Land">
+<floater name="land holdings floater" title="MEIN LAND">
<scroll_list name="parcel list">
- <column label="Parzellenname" name="name"/>
+ <column label="Parzelle" name="name"/>
<column label="Region" name="location"/>
<column label="Typ" name="type"/>
<column label="Gebiet" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/>
- <button label="Auf Karte" label_selected="Auf Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/>
+ <button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/>
<text name="contrib_label">
Beiträge zu Ihren Gruppen:
</text>
@@ -20,21 +20,21 @@
Zulässiger Landbesitz bei aktuellem Zahlungsplan:
</text>
<text name="allowed_text">
- [AREA] qm
+ [AREA] m².
</text>
<text name="current_label">
Aktueller Landbesitz:
</text>
<text name="current_text">
- [AREA] qm
+ [AREA] m².
</text>
<text name="available_label">
Für Landkäufe verfügbar:
</text>
<text name="available_text">
- [AREA] qm
+ [AREA] m².
</text>
<string name="area_string">
- [AREA] qm
+ [AREA] m².
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
index 8d499bc300..3b42a8b741 100644
--- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="Skript: Neues Skript">
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset" />
- <check_box label="Läuft" name="running" />
- <check_box label="Mono" name="mono" />
- <text name="not_allowed">
- Sie können dieses Skript nicht anzeigen.
- </text>
- <string name="script_running">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SKRIPT: NEUES SKRIPT">
+ <floater.string name="not_allowed">
+ Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
+ </floater.string>
+ <floater.string name="script_running">
Läuft
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ SKRIPT: [NAME]
+ </floater.string>
+ <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/>
+ <check_box initial_value="true" label="Läuft" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
index d7f56b302d..73c21edc67 100644
--- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL-Wiki">
- <check_box label="Cursor folgen" name="lock_check" />
- <combo_box label="Sperren" name="history_combo" />
- <button label="Zurück" name="back_btn" />
- <button label="Weiter" name="fwd_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL-REFERENZ">
+ <check_box label="Cursor folgen" name="lock_check"/>
+ <combo_box label="Sperren" name="history_combo" left_pad="50" width="80"/>
+ <button label="Zurück" name="back_btn"/>
+ <button label="Weiter" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index 97b3d76a46..a9a3149177 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="Minikarte">
<floater.string name="mini_map_north">
N
</floater.string>
@@ -24,6 +24,9 @@
<floater.string name="mini_map_northwest">
NW
</floater.string>
+ <floater.string name="ToolTipMsg">
+ [AGENT][REGION](Karte mit Doppelklick öffnen)
+ </floater.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index ee2532127e..2d438dfe21 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -1,19 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Medienbrowser">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="MEDIEN-BROWSER">
+ <floater.string name="home_page_url">
+ http://de.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://de.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
- <button label="Zurück" name="back" />
- <button label="Weiter" name="forward" />
- <button label="Neu laden" name="reload" />
- <button label="Los" name="go" />
+ <button label="Zurück" name="back"/>
+ <button label="Weiter" name="forward"/>
+ <button label="Neu laden" name="reload"/>
+ <button label="Los" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="zurückspulen" name="rewind" width="100"/>
+ <button label="anhalten" name="stop" left_pad="20"/>
+ <button label="vorwärts" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Aktuelle URL an Parzelle senden" name="assign" />
+ <button label="Aktuelle Seite an Parzelle senden" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="In meinem Browser öffnen" name="open_browser" />
- <check_box label="Immer in meinem Browser öffnen" name="open_always" />
- <button label="Schließen" name="close" />
+ <button label="In meinem Browser öffnen" name="open_browser"/>
+ <check_box label="Immer in meinem Browser öffnen" name="open_always"/>
+ <button label="Schließen" name="close"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_media_settings.xml b/indra/newview/skins/default/xui/de/floater_media_settings.xml
new file mode 100644
index 0000000000..1b98ed7973
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIEN-EINSTELLUNGEN">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <button label="Übernehmen" label_selected="Übernehmen" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
index 0b77a7fe9d..fdc9b950b6 100644
--- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="Speicherverlust-Simulation">
- <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" />
- <spinner label="Max. Speicherverlust (MB):" name="max_leak" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SPEICHERVERLUST SIMULIEREN">
+ <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" label_width="224"/>
+ <spinner label="Max. Speicherverlust (MB):" name="max_leak" label_width="224"/>
<text name="total_leaked_label">
Aktueller Speicherverlust:[SIZE] KB
</text>
@@ -11,8 +11,8 @@
<text name="note_label_2">
[NOTE2]
</text>
- <button label="Start" name="start_btn" />
- <button label="Stopp" name="stop_btn" />
- <button label="Freigeben" name="release_btn" />
- <button label="Schließen" name="close_btn" />
+ <button label="Start" name="start_btn"/>
+ <button label="Stopp" name="stop_btn"/>
+ <button label="Freigeben" name="release_btn"/>
+ <button label="Schließen" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml
index 4ea2048e62..03930c8ed6 100644
--- a/indra/newview/skins/default/xui/de/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/de/floater_moveview.xml
@@ -1,16 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Nach links" />
- <button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts" />
- <button label="" label_selected="" name="move up btn"
- tool_tip="Springen oder Steigflug" />
- <button label="" label_selected="" name="move down btn" tool_tip="Ducken oder Sinkflug" />
- <button label="Fliegen" label_selected="Fliegen" name="fly btn"
- tool_tip="Fliegen/Landen" />
- <joystick_slide name="slide left btn" tool_tip="Nach links" />
- <joystick_slide name="slide right btn" tool_tip="Nach rechts" />
- <joystick_turn name="forward btn" tool_tip="Nach vorn" />
- <joystick_turn name="backward btn" tool_tip="Nach hinten" />
-</panel>
+ <string name="walk_forward_tooltip">
+ Vorwärts gehen (Nach-oben-Pfeil oder W drücken)
+ </string>
+ <string name="walk_back_tooltip">
+ Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)
+ </string>
+ <string name="run_forward_tooltip">
+ Vorwärts rennen (Nach-oben-Pfeil oder W drücken)
+ </string>
+ <string name="run_back_tooltip">
+ Rückwärts rennen (Nach-Unten-Pfeil oder S drücken)
+ </string>
+ <string name="fly_forward_tooltip">
+ Vorwärts fliegen (Nach-oben-Pfeil oder W drücken)
+ </string>
+ <string name="fly_back_tooltip">
+ Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
+ <joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/>
+ <joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Gehen"/>
+ <button label="" name="mode_run_btn" tool_tip="Rennen"/>
+ <button label="" name="mode_fly_btn" tool_tip="Fliegen"/>
+ <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_mute_object.xml b/indra/newview/skins/default/xui/de/floater_mute_object.xml
index 60c6ff008c..3f1af3dc63 100644
--- a/indra/newview/skins/default/xui/de/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_mute_object.xml
@@ -1,12 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="mute by name" title="Objekt nach Name stummschalten">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="mute by name" title="OBJEKT NACH NAMEN IGNORIEREN">
<text name="message">
- Stummschalten nach Name betrifft nur Chat und IM, keine
-Sounds. Sie müssen den Objektnamen exakt angeben.
+ Objekt ignorieren:
</text>
<line_editor name="object_name">
Objektname
</line_editor>
- <button label="OK" name="OK" />
- <button label="Abbrechen" name="Cancel" />
+ <text name="note">
+ * Ignoriert nur Objekttext, nicht die Geräusche
+ </text>
+ <button label="OK" name="OK"/>
+ <button label="Abbrechen" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_my_friends.xml b/indra/newview/skins/default/xui/de/floater_my_friends.xml
index fc24bcece4..61cb0d5c14 100644
--- a/indra/newview/skins/default/xui/de/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/de/floater_my_friends.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_my_friends" title="Kontakte">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_friends" title="KONTAKTE">
<tab_container name="friends_and_groups">
- <panel label="Freunde" name="friends_panel" />
- <panel label="Gruppen" name="groups_panel" />
+ <panel label="Freunde" name="friends_panel"/>
+ <panel label="Gruppen" name="groups_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
new file mode 100644
index 0000000000..e362273396
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT IN DER NÄHE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_notification.xml b/indra/newview/skins/default/xui/de/floater_notification.xml
index 48ff900d5a..7752d22b52 100644
--- a/indra/newview/skins/default/xui/de/floater_notification.xml
+++ b/indra/newview/skins/default/xui/de/floater_notification.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notification" title="Konsole: Meldungen">
+<floater name="notification" title="MELDUNGEN">
<text_editor name="payload">
Wird geladen...
</text_editor>
diff --git a/indra/newview/skins/default/xui/de/floater_notifications_console.xml b/indra/newview/skins/default/xui/de/floater_notifications_console.xml
index a1cd69899c..e271cdace2 100644
--- a/indra/newview/skins/default/xui/de/floater_notifications_console.xml
+++ b/indra/newview/skins/default/xui/de/floater_notifications_console.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notifications_console" title="Konsole: Meldungen">
- <combo_box label="Meldungsart auswählen" name="notification_types" width="412" />
- <button label="Hinzufügen" name="add_notification" left="417" width="78" />
+<floater name="notifications_console" title="BENACHRICHTIGUNGEN">
+ <combo_box label="Meldungsart auswählen" name="notification_types" width="412"/>
+ <button label="Hinzufügen" left="417" name="add_notification" width="78"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml
index fa465c08c7..c3e7052283 100644
--- a/indra/newview/skins/default/xui/de/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/de/floater_openobject.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="objectcontents" title="Objektinhalte">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="INHALT DES OBJEKTS">
<text name="object_name">
[DESC]:
</text>
- <button label="In Inventar kopieren" label_selected="In Inventar kopieren"
- name="copy_to_inventory_button" width="132" />
- <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen"
- name="copy_and_wear_button" width="132" left="150" />
+ <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="120"/>
+ <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left_pad="6" name="copy_and_wear_button" width="136"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..8c110e5516
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Outfit speichern">
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <text name="Save item as:">
+ Meine aktuelle Kleidung
+als neues Outfit speichern:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (neu)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
new file mode 100644
index 0000000000..5372b8387e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ANRUF">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Voice-Chat in der Nähe
+ </floater.string>
+ <floater.string name="anonymous">
+ Anonym
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ ruft an.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ist einem Voice-Konferenz-Chat beigetreten.
+ </floater.string>
+ <text name="connecting">
+ Verbindung mit [CALLEE_NAME] wird hergestellt.
+ </text>
+ <text name="calling">
+ [CALLEE_NAME] wird angerufen
+ </text>
+ <text name="noanswer">
+ Der Anruf wurde nicht entgegengenommen. Bitte versuchen Sie es später erneut.
+ </text>
+ <text name="nearby">
+ Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ [VOICE_CHANNEL_NAME] hat den Anruf beendet. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Sie haben das Gespräch beendet. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ [CURRENT_CHAT] wird verlassen.
+ </text>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml
index a2e40fa078..fb89eeb600 100644
--- a/indra/newview/skins/default/xui/de/floater_pay.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay.xml
@@ -1,21 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="1 L$" label_selected="1 L$" name="fastpay 1" />
- <button label="5 L$" label_selected="5 L$" name="fastpay 5" />
- <button label="10 L$" label_selected="10 L$" name="fastpay 10" />
- <button label="20 L$" label_selected="20 L$" name="fastpay 20" />
- <button label="Zahlen" label_selected="Zahlen" name="pay btn" />
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" />
+ <string name="payee_group">
+ Gruppe bezahlen
+ </string>
+ <string name="payee_resident">
+ Einwohner bezahlen
+ </string>
<text name="payee_label" width="130">
- Einwohner bezahlen:
+ Bezahlen:
</text>
- <text name="payee_name" left="130">
+ <icon name="icon_person" tool_tip="Person"/>
+ <text left="130" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text">
- Schnellzahlung:
- </text>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text name="amount text">
- Betrag:
+ Oder Betrag auswählen:
</text>
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml
index 49bf0c8957..ff85efad50 100644
--- a/indra/newview/skins/default/xui/de/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml
@@ -1,30 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="105">
- Gruppe bezahlen:
- </text>
- <text name="payee_resident" width="118">
- Einwohner bezahlen:
- </text>
- <text name="payee_name" left="128" width="168">
+ <string name="payee_group" width="105">
+ Gruppe bezahlen
+ </string>
+ <string name="payee_resident" width="118">
+ Einwohner bezahlen
+ </string>
+ <icon name="icon_person" tool_tip="Person"/>
+ <text left="128" name="payee_name" width="168">
[FIRST] [LAST]
</text>
- <text name="object_name_label" halign="left">
+ <text halign="left" name="object_name_label">
Über Objekt:
</text>
- <text name="object_name_text" left="105">
+ <icon name="icon_object" tool_tip="Objekte"/>
+ <text left="105" name="object_name_text">
...
</text>
- <text name="fastpay text" width="95" halign="left">
- Schnellzahlung:
- </text>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text name="amount text">
- Betrag:
+ Oder Betrag auswählen:
</text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="105" />
- <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="190" />
- <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="105" />
- <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="190" />
- <button label="Zahlen" label_selected="Zahlen" name="pay btn" />
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76" />
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
index 83ec725487..fd65987aa9 100644
--- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Hochlade-Berechtigungen (Standard)">
+<floater name="perm prefs" title="STANDARD-BERECHTIGUNGEN FÜR HOCHLADEN">
<panel label="Berechtigungen" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Mit Gruppe teilen" name="share_with_group"/>
@@ -9,7 +9,7 @@
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
<check_box label="Kopieren" name="next_owner_copy"/>
- <check_box label="Verkaufen/Weggeben" name="next_owner_transfer" left_delta="80"/>
+ <check_box label="Verkaufen/Weggeben" left_delta="80" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_post_process.xml b/indra/newview/skins/default/xui/de/floater_post_process.xml
index e10806d255..a6ed8cc3df 100644
--- a/indra/newview/skins/default/xui/de/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/de/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Post-Process Floater" title="Post-Processing-Einstellungen">
+<floater name="Post-Process Floater" title="POST-PROCESSING-EINSTELLUNGEN">
<tab_container name="Post-Process Tabs">
<panel label="Farbfilter" name="wmiColorFilterPanel">
<check_box label="Ein" name="wmiColorFilterToggle" />
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 2755704660..91e0bb8133 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -1,39 +1,37 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Postcard" title="Foto per E-Mail senden">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="FOTO EMAILEN">
<text name="to_label">
E-Mail des Empfängers:
</text>
- <line_editor left="145" name="to_form" width="125" />
+ <line_editor left_delta="145" name="to_form" width="125"/>
<text name="from_label">
Ihre E-Mail:
</text>
- <line_editor left="145" name="from_form" width="125" />
+ <line_editor left_delta="145" name="from_form" width="125"/>
<text name="name_label">
Ihr Name:
</text>
- <line_editor left="145" name="name_form" width="125" />
+ <line_editor left_delta="145" name="name_form" width="125"/>
<text name="subject_label">
Betreff:
</text>
- <line_editor label="Betreff hier eingeben." left="145" name="subject_form" width="125" />
+ <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
<text name="msg_label">
Nachricht:
</text>
<text_editor name="msg_form">
Nachricht hier eingeben.
</text_editor>
- <check_box label="Im Web veröffentlichen" name="allow_publish_check"
- tool_tip="Veröffentlicht diese Postkarte im Web." />
- <check_box label="Ab-18-Inhalt" name="mature_check"
- tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte." />
- <button label="?" name="publish_help_btn" />
- <text name="fine_print">
+ <check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
+ <check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
+ <button label="?" name="publish_help_btn"/>
+ <text name="fine_print" bottom_delta="21" height="140">
Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
</text>
- <button label="Abbrechen" name="cancel_btn" />
- <button label="Senden" name="send_btn" />
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
<text name="default_subject">
- Postkarte aus [SECOND_LIFE]
+ Postkarte aus [SECOND_LIFE].
</text>
<text name="default_message">
Sehen Sie hier!
diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml
index 5f68282b9f..a2712c437b 100644
--- a/indra/newview/skins/default/xui/de/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/de/floater_preferences.xml
@@ -1,8 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Preferences" title="Einstellungen">
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
- <button label="Übernehmen" label_selected="Übernehmen" name="Apply" />
- <button label="Info" label_selected="Info" name="About..." />
- <button label="Hilfe" label_selected="Hilfe" name="Help" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="EINSTELLUNGEN">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Allgemein" name="general"/>
+ <panel label="Grafik" name="display"/>
+ <panel label="Privatsphäre" name="im"/>
+ <panel label="Sound &amp; Medien" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Meldungen" name="msgs"/>
+ <panel label="Konfiguration" name="input"/>
+ <panel label="Erweitert" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
index 630127f310..3dcdb52555 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
@@ -1,11 +1,12 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
- <text name="desc txt">
+ <floater.string name="Title">
+ Animation: [NAME]
+ </floater.string>
+ <text name="desc txt" width="140">
Beschreibung:
</text>
-<line_editor left="98" name="desc" width="189" />
- <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn"
- tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116" />
- <button label="Lokal wiedergeben" label_selected="Stopp" name="Anim audition btn"
- tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." left="171" width="116" />
+ <line_editor left="108" name="desc" width="160"/>
+ <button label="Inworld abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/>
+ <button label="Lokal abspielen" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml
index 2257785fda..401758769d 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_classified.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="Vertrauliche Informationen" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="INFORMATIONEN ÜBER ANZEIGE">
+ <floater.string name="Title">
+ Anzeige: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml
index 75e1113eff..7e46bbab54 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_event.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="Event-Informationen" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="EVENT-INFORMATION">
+ <floater.string name="Title">
+ Veranstaltung: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index d72dceec90..1426a33d1d 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -1,14 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animation abspielen:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sound abspielen:
+ </floater.string>
+ <floater.string name="step_chat">
+ Chat sprechen:
+ </floater.string>
+ <floater.string name="step_wait">
+ Warten:
+ </floater.string>
+ <floater.string name="stop_txt">
Stopp
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Vorschau
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
– Keine –
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesten: [NAME]
+ </floater.string>
+ <text name="name_text">
+ Name:
+ </text>
<text name="desc_label">
Beschreibung:
</text>
@@ -18,7 +36,7 @@
<text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
Ersetzen mit:
</text>
- <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt." left_delta="94" width="160"/>
<text name="key_label">
Tastenkürzel:
</text>
@@ -27,30 +45,23 @@
<text name="library_label">
Bibliothek:
</text>
+ <scroll_list name="library_list" width="166"/>
+ <button label="Hinzufügen &gt;&gt;" name="add_btn" left_pad="6" width="94"/>
<text name="steps_label">
Schritte:
</text>
- <scroll_list name="library_list">
- Animation
-Ton
-Chat
-Warten
- </scroll_list>
- <button label="Hinzufügen &gt;&gt;" name="add_btn"/>
<button label="Nach oben" name="up_btn"/>
<button label="Nach unten" name="down_btn"/>
<button label="Entfernen" name="delete_btn"/>
- <text name="help_label">
- Alle Schritte erfolgen zur selben
-Zeit, außer Sie fügen Warteschritte
-ein.
- </text>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Start" />
- <radio_item name="stop" label="Stopp" />
+ <radio_item label="Start" name="start"/>
+ <radio_item label="Stopp" name="stop"/>
</radio_group>
<check_box label="bis alle Animationen beendet sind" name="wait_anim_check"/>
<check_box label="Zeit in Sekunden" name="wait_time_check"/>
+ <text name="help_label">
+ Alle Schritte werden gleichzeitig ausgeführt, wenn keine Pausen hinzugefügt wurden.
+ </text>
<check_box label="Aktiv" name="active_check" tool_tip="Aktive Gesten werden durch Chat-Eingabe ihrer Auslösephrasen oder Drücken von Tastenkürzeln ausgelöst. Bei doppelten Tastenzuweisungen funktionieren Gesten in der Regel nicht."/>
<button label="Vorschau" name="preview_btn"/>
<button label="Speichern" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..0d0d28f96f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTE - SCHNELLTASTE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..0b5df13395
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTE - SCHNELLTASTE">
+ <text name="trigger_label">
+ Chat:
+ </text>
+ <text name="key_label">
+ Tastatur:
+ </text>
+ <combo_box label="Keiner" name="modifier_combo"/>
+ <combo_box label="Keiner" name="key_combo"/>
+ <text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
+ Ersetzen:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..0d0d28f96f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTE - SCHNELLTASTE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
index da90d66e4d..62f9e1e9e5 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview notecard" title="Hinweis:">
- <button label="Speichern" label_selected="Speichern" name="Save" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="NOTIZKARTE:">
+ <floater.string name="no_object">
+ Es wurde kein Objekt gefunden, das diese Notizkarte enthält.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
+ </floater.string>
+ <floater.string name="Title">
+ Notizkarte: [NAME]
+ </floater.string>
+ <floater.string label="Speichern" label_selected="Speichern" name="Save">
+ Speichern
+ </floater.string>
<text name="desc txt">
Beschreibung:
</text>
<text_editor name="Notecard Editor">
Wird geladen...
</text_editor>
- <text name="no_object">
- Es wurde kein Objekt gefunden, das diese Notiz enthält.
- </text>
- <text name="not_allowed">
- Sie können diese Notiz nicht anzeigen.
- </text>
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_sound.xml b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
index 3f2e39c0d6..4629ec4a04 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
@@ -1,12 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Sound: [NAME]
+ </floater.string>
<text name="desc txt">
Beschreibung:
</text>
- <button label="In Welt abspielen" label_selected="In Welt abspielen"
- name="Sound play btn"
- tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können." />
- <button label="Lokal wiedergeben" label_selected="Lokal wiedergeben"
- name="Sound audition btn"
- tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören." />
+ <button label="Inworld abspielen" label_selected="Inworld abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/>
+ <button label="Lokal abspielen" label_selected="Lokal abspielen" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_texture.xml b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
index 0c53eb7ca3..526c0813bd 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
@@ -1,9 +1,47 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Textur: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ In Inventar kopieren
+ </floater.string>
<text name="desc txt">
Beschreibung:
</text>
<text name="dimensions">
- Maße: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <text name="aspect_ratio">
+ Seitenverhältnis anzeigen
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Mit einem vordefinierten Seitenverhältnis anzeigen">
+ <combo_item name="Unconstrained">
+ keines
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Gruppeninsignien oder Beschreibung">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE]-Profil">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Anzeigen und Suchergebnisse, Landmarken">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Über Land">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Profilauswahl">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Verwerfen" name="Discard"/>
+ <button label="Speichern unter" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_region_info.xml b/indra/newview/skins/default/xui/de/floater_region_info.xml
index 4c28c7f5b0..354cdaa272 100644
--- a/indra/newview/skins/default/xui/de/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/de/floater_region_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="Region/Grundstück" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="REGION/GRUNDSTÜCK"/>
diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
index a8df587cfa..02be3b3ed9 100644
--- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Missbrauch melden">
- <texture_picker label="" name="screenshot"/>
- <check_box bottom_delta="-20" label="Screenshot einschließen" name="screen_check"/>
+<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN">
+ <floater.string name="Screenshot">
+ Foto
+ </floater.string>
+ <check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/>
<text name="reporter_title">
Melder:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Region:
@@ -21,12 +23,12 @@
{128.1, 128.1, 15.4}
</text>
<text bottom_delta="-38" height="32" name="select_object_label">
- Klicken Sie auf die Schaltfläche,
-dann auf das Objekt:
+ Klicken Sie auf die Schaltfläche, dann auf das entsprechende
+Objekt:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/>
<text name="object_name_label">
- Name:
+ Objekt:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -35,54 +37,53 @@ dann auf das Objekt:
Eigentümer:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft">
- <combo_box.item name="Select_category" label="Kategorie auswählen"/>
- <combo_box.item name="Age__Age_play" label="Alter&gt; Age-Play"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Alter&gt; Erwachsener Einwohner in Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Alter &gt; Minderjähriger Einwohner außerhalb Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Angriff&gt; Kampf-Sandbox / unsichere Region"/>
- <combo_box.item name="Assault__Safe_area" label="Angriff&gt; Sichere Region"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Angriff &gt; Sandbox für Waffentest"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel &gt; Produkt nicht geliefert oder Dienstleistung nicht erbracht"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Offenlegung &gt; Informationen aus realer Welt"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Offenlegung &gt; Abhören eines Chats aus der Ferne"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Offenlegung &gt; Second Life-Informationen/Chat/IMs"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Ruhestörung &gt; Unfaire Nutzung von Regionsressourcen"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Ruhestörung &gt; Exzessive Nutzung geskripteter Objekte"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Ruhestörung &gt; Wildes Erzeugen von Objekten"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Ruhestörung &gt; Ständige Spam-Wiederholung"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Ruhestörung &gt; Unerwünschte Spam-Werbung"/>
- <combo_box.item name="Fraud__L$" label="Betrug &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Betrug&gt; Land"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Betrug &gt; Schneeballsystem oder Kettenbrief"/>
- <combo_box.item name="Fraud__US$" label="Betrug &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Belästigung &gt; Werbefarmen / visueller Spam"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Belästigung &gt; Diffamieren von Einzelpersonen/Gruppen"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Belästigung &gt; Bewegungseinschränkung"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Belästigung &gt; Sexuelle Belästigung"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Belästigung &gt; Anstiften Dritter zur Missachtung der Nutzungsbedingungen"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Belästigung &gt; Beschimpfung"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Unanständigkeit &gt; Anstößige Inhalte oder Handlungen in der Öffentlichkeit"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Unanständigkeit &gt; Anstößiger Avatarname"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Urheberrechtsverletzung &gt; Entfernen von Inhalten"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Urheberrechtsverletzung &gt; CopyBot oder Berechtigungs-Exploit"/>
- <combo_box.item name="Intolerance" label="Intoleranz"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land &gt; Missbrauch der Sandbox-Ressourcen"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Land &gt; Unbefugte Nutzung &gt; Objekte/Texturen"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Land &gt; Unbefugte Nutzung &gt; Partikel"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Land &gt; Unbefugte Nutzung &gt; Bäume/Pflanzen"/>
- <combo_box.item name="Wagering_gambling" label="Wetten/Glücksspiel"/>
- <combo_box.item name="Other" label="Sonstige"/>
+ <combo_box.item label="Kategorie auswählen" name="Select_category"/>
+ <combo_box.item label="Alter&gt; Age-Play" name="Age__Age_play"/>
+ <combo_box.item label="Alter &gt; Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Alter &gt; Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Angriff&gt; Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Angriff&gt; Sichere Region" name="Assault__Safe_area"/>
+ <combo_box.item label="Angriff &gt; Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Handel &gt; Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Offenlegung &gt; Informationen aus realer Welt" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Offenlegung &gt; Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Offenlegung &gt; Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Ruhestörung &gt; Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Ruhestörung &gt; Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Ruhestörung &gt; Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Ruhestörung &gt; Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Ruhestörung &gt; Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Betrug &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Betrug&gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Betrug &gt; Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Betrug &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Belästigung &gt; Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Belästigung &gt; Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Belästigung &gt; Bewegungseinschränkung" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Belästigung &gt; Sexuelle Belästigung" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Belästigung &gt; Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Belästigung &gt; Beschimpfung" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Unanständigkeit &gt; Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Unanständigkeit &gt; Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in moderater Region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Urheberrechtsverletzung &gt; Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Urheberrechtsverletzung &gt; CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intoleranz" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Objekte/Texturen" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Partikel" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/>
+ <combo_box.item label="Sonstige" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Name des Beschuldigten:
</text>
- <button label="Einwohner auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/>
- <check_box label="Name des Täters ist nicht bekannt" name="omit_abuser_name" tool_tip="Wählen Sie diese Option, wenn Ihnen der Name des Täters unbekannt ist"/>
+ <button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/>
<text name="abuser_name_title2">
Ort des Missbrauchs:
</text>
@@ -93,14 +94,12 @@ dann auf das Objekt:
Details:
</text>
<text name="bug_aviso">
- Machen Sie genaue Angaben zu Datum, Ort und Art des
-Missbrauchs, relevantem Chat/IM und wählen Sie das
-Objekt, wenn möglich.
+ Detaillierte Beschreibung:
</text>
- <text_editor bottom_delta="-136" height="130" name="details_edit"/>
+ <text_editor bottom_delta="-136" height="70" name="details_edit"/>
<text bottom_delta="-20" name="incomplete_title">
- Hinweis: Unvollständige Meldungen werden nicht bearbeitet.
+ * Unvollständige Berichte werden nicht bearbeitet
</text>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
<button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_script_debug.xml b/indra/newview/skins/default/xui/de/floater_script_debug.xml
index f8c1543fdd..585a6c36ea 100644
--- a/indra/newview/skins/default/xui/de/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater name="script debug floater" title="Skriptwarnung/Fehler">
<tab_container name="Preview Tabs">
- <floater label="Skript" name="all_scripts" title="[All scripts]" />
+ <floater label="Skript" name="all_scripts" title="[ALL SCRIPTS]" />
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/de/floater_script_limits.xml b/indra/newview/skins/default/xui/de/floater_script_limits.xml
new file mode 100644
index 0000000000..94a24a97ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="SKRIPT-INFORMATION"/>
diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml
index 3ab5732055..e0bcd42523 100644
--- a/indra/newview/skins/default/xui/de/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml
@@ -1,6 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="Skript: Rotationsskript">
- <text name="desc txt">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SKRIPT: ROTATIONS-SKRIPT">
+ <floater.string name="Title">
+ SKRIPT: [NAME]
+ </floater.string>
+ <text name="desc txt" width="120">
Beschreibung:
</text>
</floater>
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 63d5ef2478..f267fe4b7c 100644
--- a/indra/newview/skins/default/xui/de/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml
@@ -1,4 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="queue" title="Rückgängig">
- <button label="Schließen" label_selected="Schließen" name="close" left="215" width="72"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="ZURÜCKSETZEN">
+ <floater.string name="Starting">
+ [START] von [COUNT] Artikeln.
+ </floater.string>
+ <floater.string name="Done">
+ Fertig.
+ </floater.string>
+ <floater.string name="Resetting">
+ Wird zurückgesetzt
+ </floater.string>
+ <floater.string name="Running">
+ Läuft
+ </floater.string>
+ <floater.string name="NotRunning">
+ Läuft nicht
+ </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_script_search.xml b/indra/newview/skins/default/xui/de/floater_script_search.xml
index bd93427456..de959cbb28 100644
--- a/indra/newview/skins/default/xui/de/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_search.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script search" title="Skriptsuche">
- <check_box label="Groß-/Kleinschreibung irrelevant" name="case_text" />
- <button label="Suchen" label_selected="Suchen" name="search_btn" />
- <button label="Ersetzen" label_selected="Ersetzen" name="replace_btn" />
- <button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="SKRIPT-SUCHE">
+ <check_box label="Groß-/Kleinschreibung irrelevant" name="case_text"/>
+ <button label="Suchen" label_selected="Suchen" name="search_btn"/>
+ <button label="Ersetzen" label_selected="Ersetzen" name="replace_btn"/>
+ <button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn"/>
<text name="txt">
Suchen
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml
new file mode 100644
index 0000000000..d44ad44aea
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="SUCHEN">
+ <floater.string name="loading_text">
+ Wird geladen...
+ </floater.string>
+ <floater.string name="done_text">
+ Fertig
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_select_key.xml b/indra/newview/skins/default/xui/de/floater_select_key.xml
index 6094d11359..8ab9db520a 100644
--- a/indra/newview/skins/default/xui/de/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/de/floater_select_key.xml
@@ -1,8 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
- Zur Auswahl gewünschte
-Taste drücken.
+ Eine Taste drücken, um die Auslösetaste zum Sprechen festzulegen.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 1499bb0152..09eae40477 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -1,67 +1,65 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="sell land" title="Land verkaufen">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Parzelle:
- </text>
- <text bottom_delta="-5" height="16" name="info_parcel">
- PARZELLENNAME
- </text>
- <text name="info_size_label">
- Größe:
- </text>
- <text bottom_delta="-21" height="32" name="info_size">
- [AREA] qm
- </text>
- <text height="28" name="info_action" bottom_delta="-57">
- Zum Verkauf
-dieser Parzelle:
- </text>
- <icon bottom_delta="-80" name="step_price" />
- <text name="price_label">
- Preis festlegen:
- </text>
- <text name="price_text">
- Geben Sie einen angemessenen Preis für dieses Land ein.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER] L$ pro Quadratmeter)
- </text>
- <icon height="64" left="0" name="step_sell_to" width="64" />
- <text bottom_delta="38" left="72" name="sell_to_label" right="-20">
- Land verkaufen an:
- </text>
- <text height="16" left="72" name="sell_to_text" bottom_delta="-16" right="-10">
- Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person
-beschränkt ist.
- </text>
- <combo_box height="16" left="72" name="sell_to" bottom_delta="-32" width="140">
- <combo_box.item name="--selectone--" label="select one --" />
- <combo_box.item name="Anyone" label="Jeder" />
- <combo_box.item name="Specificuser:" label="Bestimmter Benutzer:" />
- </combo_box>
- <button label="Auswählen..." name="sell_to_select_agent" />
- <text name="sell_objects_label">
- Die Objekte mit dem Land verkaufen?
- </text>
- <text name="sell_objects_text">
- Die transferierbaren Landeigentümer-Objekte auf der Parzelle
-wechseln den Eigentümer.
- </text>
- <radio_group bottom_delta="-58" name="sell_objects">
- <radio_item name="no" label="Nein, Objekte behalten" />
- <radio_item name="yes" label="Ja, Objekte mit Land verkaufen" />
- </radio_group>
- <button label="Objekte anzeigen" name="show_objects" width="116"/>
- <text name="nag_message_label">
- ACHTUNG: Verkäufe sind endgültig.
- </text>
- <button label="Land zum Verkauf freigeben" width="180" name="sell_btn" />
- <button label="Abbrechen" name="cancel_btn" />
- </panel>
- </scroll_container>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="LAND VERKAUFEN">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parzelle:
+ </text>
+ <text bottom_delta="-5" height="16" name="info_parcel" left="70">
+ PARZELLENNAME
+ </text>
+ <text name="info_size_label">
+ Größe:
+ </text>
+ <text bottom_delta="-21" height="32" name="info_size" left="70">
+ [AREA] m².
+ </text>
+ <text bottom_delta="-57" height="28" name="info_action">
+ Zum Verkauf dieser Parzelle:
+ </text>
+ <text name="price_label">
+ 1. Preis festlegen:
+ </text>
+ <text name="price_text" >
+ Prei angeben
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ ([PER_METER] L$ pro m²)
+ </text>
+ <text bottom_delta="38" left="72" name="sell_to_label" right="-20">
+ 2. Land verkaufen an:
+ </text>
+ <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
+ Offener Verkauf oder Verkauf an bestimmte Person?
+ </text>
+ <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
+ <combo_box.item label="-- Auswählen --" name="--selectone--"/>
+ <combo_box.item label="An jeden" name="Anyone"/>
+ <combo_box.item label="An bestimmte Person:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Auswählen" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Die Objekte mit dem Land verkaufen?
+ </text>
+ <text name="sell_objects_text">
+ Die transferierbaren Landeigentümer-Objekte auf der Parzelle wechseln den Eigentümer.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="Nein, Objekte behalten" name="no"/>
+ <radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
+ </radio_group>
+ <button label="Objekte anzeigen" name="show_objects" width="116"/>
+ <text name="nag_message_label">
+ ACHTUNG: Verkäufe sind endgültig.
+ </text>
+ <button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
index 034cfca017..004e54a339 100644
--- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="settings_debug" title="Debug-Einstellungen">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="WAHR" />
- <combo_box.item name="FALSE" label="FALSCH" />
+ <combo_box.item label="WAHR" name="TRUE"/>
+ <combo_box.item label="FALSCH" name="FALSE"/>
</combo_box>
- <color_swatch label="Farbe" name="color_swatch" />
- <spinner label="x" name="val_spinner_1" />
- <spinner label="x" name="val_spinner_2" />
- <spinner label="x" name="val_spinner_3" />
- <spinner label="x" name="val_spinner_4" />
- <button label="Standard wiederherstellen" name="default_btn" width="170" />
+ <color_swatch label="Farbe" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Standard wiederherstellen" name="default_btn" width="170"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index bc8a1f42f1..9ee50c7c5c 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -1,26 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Foto-Vorschau">
+<floater name="Snapshot" title="FOTO-VORSCHAU">
<text name="type_label">
Zweck des Fotos
</text>
<radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item name="postcard" label="Per E-Mail senden"/>
- <radio_item name="texture" label="Im Inventar speichern ([AMOUNT] L$)"/>
- <radio_item name="local" label="Auf Festplatte speichern"/>
+ <radio_item label="Emailen" name="postcard"/>
+ <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/>
+ <radio_item label="Auf meinem Computer speichern" name="local"/>
</radio_group>
<text name="file_size_label">
- Dateigröße: [SIZE] KB
+ [SIZE] KB
</text>
<button label="Foto aktualisieren" name="new_snapshot_btn"/>
<button label="Senden" name="send_btn"/>
<button label="Speichern ([AMOUNT] L$)" name="upload_btn"/>
<flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
- <flyout_button_item name="save_item" label="Speichern"/>
- <flyout_button_item name="saveas_item" label="Speichern unter..."/>
+ <flyout_button_item label="Speichern" name="save_item"/>
+ <flyout_button_item label="Speichern unter..." name="saveas_item"/>
</flyout_button>
<button label="Abbrechen" name="discard_btn"/>
- <button label="Mehr &gt;&gt;" name="more_btn" tool_tip="Erweiterte Optionen"/>
- <button label="&lt;&lt; Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/>
+ <button label="Mehr" name="more_btn" tool_tip="Erweiterte Optionen"/>
+ <button label="Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/>
<text name="type_label2">
Größe
</text>
@@ -28,74 +28,50 @@
Format
</text>
<combo_box label="Auflösung" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelles Fenster"
- />
- <combo_box.item name="640x480" label="640x480"
- />
- <combo_box.item name="800x600" label="800x600"
- />
- <combo_box.item name="1024x768" label="1024x768"
- />
- <combo_box.item name="Custom" label="Benutzerdefiniert"
- />
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<combo_box label="Auflösung" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelles Fenster"
- />
- <combo_box.item name="Small(128x128)" label="Klein (128x128)"
- />
- <combo_box.item name="Medium(256x256)" label="Mittel (256x256)"
- />
- <combo_box.item name="Large(512x512)" label="Groß (512x512)"
- />
- <combo_box.item name="Custom" label="Benutzerdefiniert"
- />
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<combo_box label="Auflösung" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Aktuelles Fenster"
- />
- <combo_box.item name="320x240" label="320x240"
- />
- <combo_box.item name="640x480" label="640x480"
- />
- <combo_box.item name="800x600" label="800x600"
- />
- <combo_box.item name="1024x768" label="1024x768"
- />
- <combo_box.item name="1280x1024" label="1280x1024"
- />
- <combo_box.item name="1600x1200" label="1600x1200"
- />
- <combo_box.item name="Custom" label="Benutzerdefiniert"
- />
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<combo_box label="Format" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"
- />
- <combo_box.item name="JPEG" label="JPEG"
- />
- <combo_box.item name="BMP" label="BMP"
- />
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
<spinner label="Breite" name="snapshot_width"/>
<spinner label="Höhe" name="snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
<slider label="Bildqualität" name="image_quality_slider"/>
- <text name="layer_type_label" width="63">
+ <text name="layer_type_label" width="66">
Aufnehmen:
</text>
- <combo_box label="Bildlayer" name="layer_types" width="132" left="73">
- <combo_box.item name="Colors" label="Farben"
- />
- <combo_box.item name="Depth" label="Tiefe"
- />
- <combo_box.item name="ObjectMattes" label="Objektmasken"
- />
+ <combo_box label="Bildlayer" left="73" name="layer_types" width="132">
+ <combo_box.item label="Farben" name="Colors"/>
+ <combo_box.item label="Tiefe" name="Depth"/>
+ <combo_box.item label="Objektmasken" name="ObjectMattes"/>
</combo_box>
- <check_box label="Interface auf Foto anzeigen" name="ui_check"/>
- <check_box label="HUD-Objekte auf Foto anzeigen" name="hud_check"/>
+ <check_box label="Oberfläche" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
<check_box label="Nach dem Speichern offen lassen" name="keep_open_check"/>
- <check_box label="Frame einfrieren (Vollbildvorschau)" name="freeze_frame_check"/>
+ <check_box label="Frame einfrieren (Vollbild)" name="freeze_frame_check"/>
<check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
<string name="unknown">
unbekannt
diff --git a/indra/newview/skins/default/xui/de/floater_sound_preview.xml b/indra/newview/skins/default/xui/de/floater_sound_preview.xml
index 1e5ac179b5..1070c93405 100644
--- a/indra/newview/skins/default/xui/de/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_sound_preview.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Sound Preview" title="sound.wav">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
Name:
</text>
<text name="description_label">
Beschreibung:
</text>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" />
- <button label="Hochladen ([AMOUNT] L$)" label_selected="Hochladen ([AMOUNT] L$)" name="ok_btn" />
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" label_selected="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
<text name="text">
Bitrate (kbit/s):
</text>
<radio_group name="bitrate">
- <radio_item name="32" label="32" />
- <radio_item name="64" label="64" />
- <radio_item name="96" label="96" />
- <radio_item name="128" label="128" />
+ <radio_item label="32" name="32"/>
+ <radio_item label="64" name="64"/>
+ <radio_item label="96" name="96"/>
+ <radio_item label="128" name="128"/>
</radio_group>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_statistics.xml b/indra/newview/skins/default/xui/de/floater_statistics.xml
index 26e976a59c..72a87a9566 100644
--- a/indra/newview/skins/default/xui/de/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/de/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statistikleiste"/>
+<floater name="stats floater" title="STATISTIKEN"/>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
new file mode 100644
index 0000000000..1eb2dd4288
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTIKEN" width="280">
+ <scroll_container name="statistics_scroll" width="280">
+ <container_view name="statistics_view" width="280">
+ <stat_view label="Basic" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandbreite" name="bandwidth"/>
+ <stat_bar label="Paketverlust" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Erweitert" name="advanced">
+ <stat_view label="Darstellung" name="render">
+ <stat_bar label="Gezeichnete KTris" name="ktrisframe"/>
+ <stat_bar label="Gezeichnete KTris" name="ktrissec"/>
+ <stat_bar label="Objektanzahl" name="objs"/>
+ <stat_bar label="Neue Objekte" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Textur" name="texture">
+ <stat_bar label="Zählen" name="numimagesstat"/>
+ <stat_bar label="Rohanzahl" name="numrawimagesstat"/>
+ <stat_bar label="GL Sp" name="gltexmemstat"/>
+ <stat_bar label="Formattierter Sp:" name="formattedmemstat"/>
+ <stat_bar label="Rohsp" name="rawmemstat"/>
+ <stat_bar label="Zugeteilter Sp" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Netzwerk" name="network">
+ <stat_bar label="Paketeingang" name="packetsinstat"/>
+ <stat_bar label="Paketausgang" name="packetsoutstat"/>
+ <stat_bar label="Objekte" name="objectkbitstat"/>
+ <stat_bar label="Textur" name="texturekbitstat"/>
+ <stat_bar label="Bestand" name="assetkbitstat"/>
+ <stat_bar label="Ebenen" name="layerskbitstat"/>
+ <stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/>
+ <stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Zeitdilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physik FPS" name="simphysicsfps"/>
+ <stat_view label="Physikdetails" name="physicsdetail">
+ <stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/>
+ <stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/>
+ <stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Agent-Aktualisierungen/Sek" name="simagentups"/>
+ <stat_bar label="Haupt-Agenten" name="simmainagents"/>
+ <stat_bar label="Child-Agenten" name="simchildagents"/>
+ <stat_bar label="Objekte" name="simobjects"/>
+ <stat_bar label="Aktive Objekte" name="simactiveobjects"/>
+ <stat_bar label="Aktive Skripts" name="simactivescripts"/>
+ <stat_bar label="Skript-Events" name="simscripteps"/>
+ <stat_bar label="Paketeingang" name="siminpps"/>
+ <stat_bar label="Paketausgang" name="simoutpps"/>
+ <stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/>
+ <stat_bar label="Ausstehende Uploads" name="simpendinguploads"/>
+ <stat_bar label="Gesamtanzahl „Unacked&quot; Bytes" name="simtotalunackedbytes"/>
+ <stat_view label="Zeit (ms)" name="simperf">
+ <stat_bar label="Gesamtzeit Frame" name="simframemsec"/>
+ <stat_bar label="Netto-Zeit" name="simnetmsec"/>
+ <stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulationszeit" name="simsimothermsec"/>
+ <stat_bar label="Agent-Zeit" name="simagentmsec"/>
+ <stat_bar label="Bilder-Zeit" name="simimagesmsec"/>
+ <stat_bar label="Skript-Zeit" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sys_well.xml b/indra/newview/skins/default/xui/de/floater_sys_well.xml
new file mode 100644
index 0000000000..d7db97722c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification_chiclet" title="MELDUNGEN">
+ <string name="title_im_well_window">
+ GESPRÄCHE
+ </string>
+ <string name="title_notification_well_window">
+ BENACHRICHTIGUNGEN
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_telehub.xml b/indra/newview/skins/default/xui/de/floater_telehub.xml
index 264411c166..4d3c96bc87 100644
--- a/indra/newview/skins/default/xui/de/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/de/floater_telehub.xml
@@ -1,32 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="telehub" title="Telehub" min_height="310" height="310" >
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="310" min_height="310" name="telehub" title="TELEHUB">
<text name="status_text_connected">
Telehub verbunden mit Objekt [OBJECT]
</text>
<text name="status_text_not_connected">
Kein Telehub verbunden.
</text>
- <text name="help_text_connected">
+ <text name="help_text_connected" width="300">
Klicken Sie zum Entfernen auf „Trennen“.
</text>
- <text name="help_text_not_connected" height="38" bottom_delta="-18" >
+ <text bottom_delta="-18" height="38" name="help_text_not_connected">
Wählen Sie ein Objekt und klicken Sie auf
„Mit Telehub verbinden“.
</text>
- <button label="Mit Telehub verbinden" name="connect_btn" width="122" />
- <button label="Trennen" name="disconnect_btn" left="142" width="98" />
+ <button label="Mit Telehub verbinden" name="connect_btn" width="134"/>
+ <button label="Trennen" left="152" name="disconnect_btn" width="88"/>
<text name="spawn_points_text" width="230">
Spawn-Punkte (Positionen, nicht Objekte):
</text>
- <button label="Spawn hinzufügen" name="add_spawn_point_btn" />
- <button label="Spawn entfernen" name="remove_spawn_point_btn" />
+ <button label="Spawn hinzufügen" name="add_spawn_point_btn"/>
+ <button label="Spawn entfernen" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Wählen Sie ein Objekt und klicken zur
-Positionsangabe auf „Hinzufügen“. Anschließend
-können sie das Objekt verschieben oder löschen.
-Positionsangaben sind relativ zum
-Telehub-Mittelpunkt.
-Wählen Sie ein Objekt aus, um seine Position in
-der Welt anzuzeigen.
+ Wählen Sie ein Objekt und klicken zur Positionsangabe auf Spawn hinzufügen.
+Anschließend können Sie das Objekt verschieben oder löschen.
+Positionsangaben sind relativ zum Telehub-Mittelpunkt.
+Wählen Sie ein Objekt aus der Liste aus, um dieses inworld zu markieren.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index fff6ab5c74..4e2d8a9274 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="texture picker" title="Auswählen: Textur">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="AUSWÄHLEN: TEXTUR">
<string name="choose_picture">
Zum Auswählen eines Bildes hier klicken
</string>
<text name="Multiple">
- Mehrfach
+ Mehrer Texturen
</text>
<text name="unknown">
- Maße: [DIMENSIONS]
+ Größe: [DIMENSIONS]
</text>
- <button label="Standard" label_selected="Standard" name="Default" />
- <button label="Keine" label_selected="Keine" name="None" />
- <button label="Leer" label_selected="Leer" name="Blank" />
- <check_box label="Ordner anzeigen" name="show_folders_check" />
- <search_editor label="Suchanfrage hier eintippen" name="inventory search editor" />
- <check_box label="Sofort übernehmen" name="apply_immediate_check" />
- <button label="" label_selected="" name="Pipette" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
- <button label="Auswählen" label_selected="Auswählen" name="Select" />
+ <button label="Standard" label_selected="Standard" name="Default"/>
+ <button label="Keine" label_selected="Keine" name="None"/>
+ <button label="Leer" label_selected="Leer" name="Blank"/>
+ <check_box label="Ordner anzeigen" name="show_folders_check"/>
+ <search_editor label="Texturen filtern" name="inventory search editor"/>
+ <check_box label="Jetzt übernehmen" name="apply_immediate_check"/>
+ <button label="" label_selected="" name="Pipette"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<text name="pick title">
Auswählen:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 2815fd34a2..b5c02cce0b 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -1,45 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Bauen">
+<floater name="toolbox floater" short_title="BAU-WERKZEUGE" title="">
+ <floater.string name="status_rotate">
+ An den farbigen Bändern ziehen, um das Objekt zu drehen
+ </floater.string>
+ <floater.string name="status_scale">
+ Klicken und ziehen, um die ausgewählte Seite zu dehnen
+ </floater.string>
+ <floater.string name="status_move">
+ Maus verschiebt, Umschalt-Taste und Maus kopiert
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Klicken und halten, um das Land zu bearbeiten
+ </floater.string>
+ <floater.string name="status_camera">
+ Klicken und ziehen, um Kamera zu bewegen
+ </floater.string>
+ <floater.string name="status_grab">
+ Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg + Umschalt zum Drehen
+ </floater.string>
+ <floater.string name="status_place">
+ Inworld klicken, um zu bauen.
+ </floater.string>
+ <floater.string name="status_selectland">
+ Klicken und ziehen, um Land auszuwählen
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Bildschirm
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Lokal
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Welt
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referenz
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anhang
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
<button label="" label_selected="" name="button move" tool_tip="Verschieben"/>
<button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/>
<button label="" label_selected="" name="button create" tool_tip="Erstellen"/>
<button label="" label_selected="" name="button land" tool_tip="Land"/>
+ <text name="text status">
+ Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Orbit (Strg)" name="radio orbit"/>
- <radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/>
+ <radio_item label="Schwenken (Strg+Umschalt)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Verschieben" name="radio move"/>
<radio_item label="Heben (Strg)" name="radio lift"/>
- <radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/>
+ <radio_item label="Drehen (Strg+Umschalt)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Position" name="radio position"/>
+ <radio_item label="Bewegen" name="radio position"/>
<radio_item label="Drehen (Strg)" name="radio rotate"/>
- <radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/>
- <radio_item label="Textur auswählen" name="radio select face"/>
+ <radio_item label="Dehnen (Strg+Umschalt)" name="radio stretch"/>
+ <radio_item label="Fläche auswählen" name="radio select face"/>
</radio_group>
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Lineal:
+ <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für diesen Objekt">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Welt"
- />
- <combo_box.item name="Local" label="Lokal"
- />
- <combo_box.item name="Reference" label="Referenz"
- />
- </combo_box>
<check_box label="Beide Seiten dehnen" name="checkbox uniform"/>
- <check_box label="Texturen dehnen" name="checkbox stretch textures"/>
- <check_box label="Raster verwenden" name="checkbox snap to grid"/>
- <button label="Optionen..." label_selected="Optionen..." name="Options..."/>
- <text name="text status">
- Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen
- </text>
+ <check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Wählen Sie das Rasterlineal aus, um das Objekt zu positionieren.">
+ <combo_box.item label="Globales Raster" name="World"/>
+ <combo_box.item label="Lokales Raster" name="Local"/>
+ <combo_box.item label="Referenzraster" name="Reference"/>
+ </combo_box>
+ <button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Mehr Raster-Optionen anzeigen"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
@@ -55,10 +91,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Baum"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/>
- <check_box label="Auswahl behalten" name="checkbox sticky"/>
+ <check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/>
<check_box label="Auswahl kopieren" name="checkbox copy selection"/>
- <check_box label="Zentrieren" name="checkbox copy centers"/>
- <check_box label="Drehen" name="checkbox copy rotates"/>
+ <check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/>
+ <check_box label="Kopie drehen" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Land auswählen" name="radio select land"/>
<radio_item label="Einebnen" name="radio flatten"/>
@@ -68,7 +104,6 @@
<radio_item label="Aufrauen" name="radio noise"/>
<radio_item label="Zurücksetzen" name="radio revert"/>
</radio_group>
- <button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/>
<text name="Bulldozer:">
Planierraupe:
</text>
@@ -78,14 +113,51 @@
<text name="Strength:">
Stärke
</text>
+ <button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land bearbeiten"/>
<text name="obj_count">
- Ausgewählte Objekte: [COUNT]
+ Objekte: [COUNT]
</text>
<text name="prim_count">
Primitive: [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="Allgemein" name="General">
+ <panel.string name="text deed continued">
+ Übertragung
+ </panel.string>
+ <panel.string name="text deed">
+ Übertragung
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Sie können dieses Objekt bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Sie können diese Objekte bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Sie können dieses Objekt nicht bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Sie können diese Objekte nicht bearbeiten.
+ </panel.string>
+ <panel.string name="text modify warning">
+ Gesamtes Objekt wählen, um Berechtigungen festzulegen.
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preis: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Summe: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Stückpreis: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mischpreis
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mischverkauf
+ </panel.string>
<text name="Name:">
Name:
</text>
@@ -96,137 +168,79 @@
Ersteller:
</text>
<text name="Creator Name">
- Thrax Linden
+ Esbee Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button creator profile"/>
<text name="Owner:">
Eigentümer:
</text>
<text name="Owner Name">
- Thrax Linden
+ Erica Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button owner profile"/>
<text name="Group:">
Gruppe:
</text>
- <text name="Group Name Proxy">
- Die Lindens
- </text>
- <button label="Festlegen..." label_selected="Festlegen..." name="button set group"/>
- <text name="Permissions:">
- Berechtigungen:
- </text>
-
- <check_box label="Mit Gruppe teilen" name="checkbox share with group" tool_tip="Allen Mitgliedern der zugeordneten Gruppe die Erlaubnis erteilen, Ihre Berechtigungen für dieses Objekt zu teilen und zu verwenden. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
- <string name="text deed continued">
- Übertragung...
- </string>
- <string name="text deed">
- Übertragung
- </string>
- <button label="Übertragung..." label_selected="Übertragung..." name="button deed" tool_tip="In der Gruppe gemeinsam verwendete Objekte können von einem Gruppenfunktionär übertragen werden."/>
- <check_box label="Verschieben durch beliebige Personen zulassen" name="checkbox allow everyone move"/>
- <check_box label="Kopieren durch beliebige Personen zulassen" name="checkbox allow everyone copy"/>
- <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
- <check_box label="Zu verkaufen" name="checkbox for sale"/>
- <text name="Cost">
- Preis:L$
+ <button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
+ <name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
+ <button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
+ <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
+ <text name="label click action">
+ Bei Linksklick:
</text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/>
+ <combo_box.item label="Objekt kaufen" name="Buyobject"/>
+ <combo_box.item label="Objekt bezahlen" name="Payobject"/>
+ <combo_box.item label="Öffnen" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="Zum Verkauf:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Kopieren" name="Copy"/>
<combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action">
- Bei Linksklicken:
- </text>
- <combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="Berühren/Greifen (Standard)"
- />
- <combo_box.item name="Sitonobject" label="Auf Objekt sitzen"
- />
- <combo_box.item name="Buyobject" label="Objekt kaufen"
- />
- <combo_box.item name="Payobject" label="Objekt bezahlen"
- />
- <combo_box.item name="Open" label="Öffnen"
- />
- <combo_box.item name="Play" label="Parzellenmedien wiedergeben"
- />
- <combo_box.item name="Opemmedia" label="Parzellenmedien öffnen"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Sie können dieses Objekt ändern
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Nächster Eigentümer kann:
- </text>
- <check_box label="Ändern" name="checkbox next owner can modify"/>
- <check_box label="Kopieren" name="checkbox next owner can copy"/>
- <check_box name="checkbox next owner can transfer"/>
- </panel>
- <string name="text modify info 1">
- Sie können dieses Objekt ändern
- </string>
- <string name="text modify info 2">
- Sie können diese Objekte ändern
- </string>
- <string name="text modify info 3">
- Sie können dieses Objekt nicht ändern
- </string>
- <string name="text modify info 4">
- Sie können diese Objekte nicht ändern
- </string>
- <string name="text modify warning">
- Gesamtes Objekt muss gewählt werden, um Berechtigungen festzulegen
- </string>
- <string name="Cost Default">
- Preis: L$
- </string>
- <string name="Cost Total">
- Summe: L$
- </string>
- <string name="Cost Per Unit">
- Stückpreis: L$
- </string>
- <string name="Cost Mixed">
- Mischpreis
- </string>
- <string name="Sale Mixed">
- Mischverkauf
- </string>
+ <spinner label="Preis: L$" name="Edit Cost"/>
+ <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Sie können dieses Objekt bearbeiten.
+ </text>
+ <text name="Anyone can:">
+ Jeder:
+ </text>
+ <check_box label="Bewegen" name="checkbox allow everyone move"/>
+ <check_box label="Kopieren" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Nächster Eigentümer:
+ </text>
+ <check_box label="Ändern" name="checkbox next owner can modify"/>
+ <check_box label="Kopieren" name="checkbox next owner can copy"/>
+ <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objekt" name="Object">
- <text name="select_single">
- Wählen Sie nur ein Primitivum aus, um Parameter zu bearbeiten.
- </text>
- <text name="edit_object">
- Objektparameter bearbeiten:
- </text>
<check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/>
<check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/>
- <check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/>
+ <check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Bewirkt, dass das Objekt 1 Minute nach seiner Erstellung gelöscht wird."/>
<check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/>
<text name="label position">
Position (Meter)
@@ -246,48 +260,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Material
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Stein"
- />
- <combo_box.item name="Metal" label="Metall"
- />
- <combo_box.item name="Glass" label="Glas"
- />
- <combo_box.item name="Wood" label="Holz"
- />
- <combo_box.item name="Flesh" label="Fleisch"
- />
- <combo_box.item name="Plastic" label="Kunststoff"
- />
- <combo_box.item name="Rubber" label="Gummi"
- />
- </combo_box>
- <text name="label basetype">
- Bausteintyp
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Quader"
- />
- <combo_box.item name="Cylinder" label="Zylinder"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Kugel"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Tube" label="Rohr"
- />
- <combo_box.item name="Ring" label="Ring"
- />
- <combo_box.item name="Sculpted" label="Geformt"
- />
+ <combo_box.item label="Quader" name="Box"/>
+ <combo_box.item label="Zylinder" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Kugel" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Rohr" name="Tube"/>
+ <combo_box.item label="Ring" name="Ring"/>
+ <combo_box.item label="Geformt" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Stein" name="Stone"/>
+ <combo_box.item label="Metall" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Holz" name="Wood"/>
+ <combo_box.item label="Fleisch" name="Flesh"/>
+ <combo_box.item label="Kunststoff" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
</combo_box>
<text name="text cut">
- Pfadschnitt Beginn und Ende
+ Pfadschnitt (Anfang/Ende)
</text>
<spinner label="B" name="cut begin"/>
<spinner label="E" name="cut end"/>
@@ -303,17 +296,13 @@
Hohlform
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Standard"
- />
- <combo_box.item name="Circle" label="Kreis"
- />
- <combo_box.item name="Square" label="Quadrat"
- />
- <combo_box.item name="Triangle" label="Dreieck"
- />
+ <combo_box.item label="Standard" name="Default"/>
+ <combo_box.item label="Kreis" name="Circle"/>
+ <combo_box.item label="Quadrat" name="Square"/>
+ <combo_box.item label="Dreieck" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torsion
+ Torsion (Anfang/Ende)
</text>
<spinner label="B" name="Twist Begin"/>
<spinner label="E" name="Twist End"/>
@@ -331,13 +320,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Profilschnitt-Beginn und Ende
+ Profilschnitt (Anfang/Ende)
</text>
<text name="advanced_dimple">
- Vertiefung-Beginn und Ende
+ Vertiefung (Anfang/Ende)
</text>
<text name="advanced_slice">
- Anfang/Ende abschneiden
+ Abschneiden (Anfang/Ende)
</text>
<spinner label="B" name="Path Limit Begin"/>
<spinner label="E" name="Path Limit End"/>
@@ -353,24 +342,18 @@
Umdrehungen
</text>
<spinner name="Radius Offset"/>
- <texture_picker label="Textur für gestaltetes
-Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ <texture_picker label="Textur für gestaltetes Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/>
<check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/>
<text name="label sculpt type">
Naht
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(keiner)"
- />
- <combo_box.item name="Sphere" label="Kugel"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Plane" label="Fläche"
- />
- <combo_box.item name="Cylinder" label="Zylinder"
- />
+ <combo_box.item label="(keiner)" name="None"/>
+ <combo_box.item label="Kugel" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Fläche" name="Plane"/>
+ <combo_box.item label="Zylinder" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Eigenschaften" name="Features">
@@ -380,7 +363,7 @@ Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild
<text name="edit_object">
Objekteigenschaften bearbeiten:
</text>
- <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (nur Client-Seite)"/>
+ <check_box label="Flexibler Pfad" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/>
<spinner label="Weichheit" name="FlexNumSections"/>
<spinner label="Schwerkraft" name="FlexGravity"/>
<spinner label="Ziehen" name="FlexFriction"/>
@@ -390,17 +373,24 @@ Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild
<spinner label="Erzwingen Y" name="FlexForceY"/>
<spinner label="Erzwingen Z" name="FlexForceZ"/>
<check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/>
- <text name="label color">
- Farbe
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ <texture_picker label="" name="light texture control" tool_tip="Klicken, um eine Bild auszuwählen (dieser Effekt funktioniert nur, wenn zeitversetzte Wiedergabe aktiviert ist)"/>
<spinner label="Intensität" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Radius" name="Light Radius"/>
+ <spinner label="Fokus" name="Light Focus"/>
<spinner label="Abnehmend" name="Light Falloff"/>
+ <spinner label="Ambiente" name="Light Ambiance"/>
</panel>
<panel label="Textur" name="Texture">
+ <panel.string name="string repeats per meter">
+ Kacheln pro Meter
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Wiederholungen pro Fläche
+ </panel.string>
<texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/>
- <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
+ <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<text name="color trans">
Transparenz %
</text>
@@ -412,95 +402,65 @@ Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild
Zuordnung
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Standard"
- />
- <combo_box.item name="Planar" label="Eben"
- />
+ <combo_box.item label="Standard" name="Default"/>
+ <combo_box.item label="Eben" name="Planar"/>
</combo_box>
<text name="label shininess">
Glanz
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Kein"
- />
- <combo_box.item name="Low" label="Niedrig"
- />
- <combo_box.item name="Medium" label="Mittel"
- />
- <combo_box.item name="High" label="Hoch"
- />
+ <combo_box.item label="Kein" name="None"/>
+ <combo_box.item label="Niedrig" name="Low"/>
+ <combo_box.item label="Mittel" name="Medium"/>
+ <combo_box.item label="Hoch" name="High"/>
</combo_box>
<text name="label bumpiness">
Holprigkeit
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Keine"
- />
- <combo_box.item name="Brightness" label="Helligkeit"
- />
- <combo_box.item name="Darkness" label="Dunkelheit"
- />
- <combo_box.item name="woodgrain" label="Holzmaserung"
- />
- <combo_box.item name="bark" label="Rinde"
- />
- <combo_box.item name="bricks" label="Ziegel"
- />
- <combo_box.item name="checker" label="Karo"
- />
- <combo_box.item name="concrete" label="Beton"
- />
- <combo_box.item name="crustytile" label="verkrustete Fliesen"
- />
- <combo_box.item name="cutstone" label="Steinplatten"
- />
- <combo_box.item name="discs" label="Scheiben"
- />
- <combo_box.item name="gravel" label="Kies"
- />
- <combo_box.item name="petridish" label="Petrischale"
- />
- <combo_box.item name="siding" label="Verkleidung"
- />
- <combo_box.item name="stonetile" label="Steinfliesen"
- />
- <combo_box.item name="stucco" label="Stuck"
- />
- <combo_box.item name="suction" label="Saugen"
- />
- <combo_box.item name="weave" label="gewoben"
- />
+ <combo_box.item label="Keine" name="None"/>
+ <combo_box.item label="Helligkeit" name="Brightness"/>
+ <combo_box.item label="Dunkelheit" name="Darkness"/>
+ <combo_box.item label="Holzmaserung" name="woodgrain"/>
+ <combo_box.item label="Rinde" name="bark"/>
+ <combo_box.item label="Ziegel" name="bricks"/>
+ <combo_box.item label="Karo" name="checker"/>
+ <combo_box.item label="Beton" name="concrete"/>
+ <combo_box.item label="verkrustete Fliesen" name="crustytile"/>
+ <combo_box.item label="Steinplatten" name="cutstone"/>
+ <combo_box.item label="Scheiben" name="discs"/>
+ <combo_box.item label="Kies" name="gravel"/>
+ <combo_box.item label="Petrischale" name="petridish"/>
+ <combo_box.item label="Verkleidung" name="siding"/>
+ <combo_box.item label="Steinfliesen" name="stonetile"/>
+ <combo_box.item label="Stuck" name="stucco"/>
+ <combo_box.item label="Saugen" name="suction"/>
+ <combo_box.item label="gewoben" name="weave"/>
</combo_box>
<text name="tex scale">
- Wiederholungen
+ Wiederholungen / Fläche
</text>
<spinner label="Horizontal (U)" name="TexScaleU"/>
<check_box label="Umkehren" name="checkbox flip s"/>
<spinner label="Vertikal (V)" name="TexScaleV"/>
<check_box label="Umkehren" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotation (Grad)
- </text>
- <string name="string repeats per meter">
- Kacheln pro Meter
- </string>
- <string name="string repeats per face">
- Wiederholungen pro Fläche
- </string>
- <text name="rpt">
- Kacheln pro Meter
- </text>
+ <spinner label="RotationËš" name="TexRot"/>
+ <spinner label="Wiederholungen / Meter" name="rptctrl"/>
<button label="Übernehmen" label_selected="Übernehmen" name="button apply"/>
<text name="tex offset">
- Versatz
+ Texture-Versatz
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertikal (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Medientextur ausrichten
-(zuerst laden)
- </text>
- <button label="Ausrichten" label_selected="Ausrichten" name="button align"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Medien
+ </text>
+ <button name="add_media" tool_tip="Medien hinzufügen"/>
+ <button name="delete_media" tool_tip="Diese Medien-Textur löschen"/>
+ <button name="edit_media" tool_tip="Diese Medien bearbeiten"/>
+ <button label="Ausrichten" label_selected="Medien angleichen" name="button align" tool_tip="Medientexturen angleichen (müssen zunächst geladen werden)"/>
+ </panel>
</panel>
<panel label="Inhalt" name="Contents">
<button label="Neues Skript" label_selected="Neues Skript" name="button new script"/>
@@ -512,14 +472,13 @@ Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild
Parzelleninformation
</text>
<text name="label_area_price">
- Preis: L$ [PRICE] für [AREA] m²
+ Preis: [PRICE] L$ für [AREA] m²
</text>
<text name="label_area">
- Fläche: [AREA] m²
+ Gebiet: [AREA] m².
</text>
- <button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/>
- <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: &#10;&#10;Grün = Ihr Land &#10;Blau = Das Land Ihrer Gruppe &#10;Rot = Im Eigentum anderer &#10;Geld = Zum Verkauf &#10;Lila = Zur Auktion &#10;Grau = Öffentlich"/>
- <button label="?" label_selected="?" name="button show owners help"/>
+ <button label="Über Land" label_selected="Über Land" name="button about land"/>
+ <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Die Parzellen farblich nach Eigentümtertyp anzeigen Grün = Ihr Land Blau = Das Land Ihrer Gruppe Rot = Im Eigentum anderer Geld = Zum Verkauf Lila = Zur Auktion Grau = Öffentlich"/>
<text name="label_parcel_modify">
Parzelle ändern
</text>
@@ -531,43 +490,4 @@ Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild
<button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/>
<button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- An den farbigen Bändern ziehen, um das Objekt zu drehen
- </floater.string>
- <floater.string name="status_scale">
- Klicken und ziehen, um die ausgewählte Seite zu dehnen
- </floater.string>
- <floater.string name="status_move">
- Maus verschiebt, Umschalt-Taste und Maus kopiert
- </floater.string>
- <floater.string name="status_modifyland">
- Klicken und halten, um das Land zu bearbeiten
- </floater.string>
- <floater.string name="status_camera">
- Klicken und ziehen, um die Ansicht zu ändern
- </floater.string>
- <floater.string name="status_grab">
- Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen
- </floater.string>
- <floater.string name="status_place">
- Inworld klicken, um zu bauen.
- </floater.string>
- <floater.string name="status_selectland">
- Klicken und ziehen, um Land auszuwählen
- </floater.string>
- <floater.string name="grid_screen_text">
- Bildschirm
- </floater.string>
- <floater.string name="grid_local_text">
- Lokal
- </floater.string>
- <floater.string name="grid_world_text">
- Welt
- </floater.string>
- <floater.string name="grid_reference_text">
- Referenz
- </floater.string>
- <floater.string name="grid_attachment_text">
- Anhang
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index f9e7becee1..dad550227e 100644
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -1,15 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="wird geladen...">
+<floater name="top_objects" title="Top-Objekte">
+ <floater.string name="top_scripts_title">
+ Top-Skripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] Skripts benötigen insgesamt [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Zeit
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono-Uhrzeit:
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Top-Kollisionsobjekte
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Top [COUNT] Objekte mit vielen potenziellen Kollisionen
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Wertung
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Nicht gefunden.
+ </floater.string>
<text name="title_text">
Wird geladen...
</text>
<scroll_list name="objects_list">
- <column label="Wertung" name="score" width="65"/>
- <column label="Name" name="name" width="135"/>
- <column label="Eigentümer" name="owner"/>
- <column label="Position" name="location" width="125"/>
- <column label="Uhrzeit" name="time"/>
- <column label="Mono-Uhrzeit:" name="mono_time"/>
+ <scroll_list.columns label="Wertung" name="score" width="65"/>
+ <scroll_list.columns label="Name" name="name" width="135"/>
+ <scroll_list.columns label="Eigentümer" name="owner"/>
+ <scroll_list.columns label="Position" name="location" width="125"/>
+ <scroll_list.columns label="Uhrzeit" name="time"/>
+ <scroll_list.columns label="Mono-Uhrzeit:" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
</scroll_list>
<text name="id_text">
Objekt-ID:
@@ -22,37 +47,13 @@
<line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="object_name_editor" text_readonly_color="white" width="244"/>
<button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_object_btn" right="-10" width="110"/>
<text name="owner_name_text">
- Eigentümername:
+ Eigentümer:
</text>
<line_editor bg_readonly_color="clear" bottom_delta="3" enabled="true" follows="left|bottom|right" font="SansSerifSmall" height="20" left="106" name="owner_name_editor" text_readonly_color="white" width="218"/>
<button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_owner_btn" right="-10" width="110"/>
+ <button bottom_delta="0" follows="bottom|right" height="20" label="Aktualisieren" name="refresh_btn" right="-10" width="110"/>
<button bottom="35" follows="bottom|left" height="20" label="Auswahl zurückgeben" left="10" name="return_selected_btn" width="134"/>
<button bottom="35" follows="bottom|left" height="20" label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
<button bottom="10" follows="bottom|left" height="20" label="Auswahl deaktivieren" left="10" name="disable_selected_btn" width="134"/>
<button bottom="10" follows="bottom|left" height="20" label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Aktualisieren" name="refresh_btn" right="-10" width="110"/>
- <string name="top_scripts_title">
- Top-Skripts
- </string>
- <string name="top_scripts_text">
- [COUNT] Skripts benötigen insgesamt [TIME] ms
- </string>
- <string name="scripts_score_label">
- Zeit
- </string>
- <string name="scripts_mono_time_label">
- Mono-Uhrzeit:
- </string>
- <string name="top_colliders_title">
- Top-Kollisionsobjekte
- </string>
- <string name="top_colliders_text">
- Top [COUNT] Objekte mit vielen potenziellen Kollisionen
- </string>
- <string name="colliders_score_label">
- Wertung
- </string>
- <string name="none_descriptor">
- Nicht gefunden.
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index e2ad5ef2f6..e11b453b41 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -1,18 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="Weiter" label_selected="Weiter" name="Continue" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
+ <button label="Weiter" label_selected="Weiter" name="Continue"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<radio_group name="tos_agreement">
- <radio_item name="radio_disagree" label="Ich stimme den Nutzungsbedingungen nicht zu" />
- <radio_item name="radio_agree" label="Ich stimme den Nutzungsbedingungen zu" />
+ <radio_item label="Ich stimme den Nutzungsbedingungen nicht zu" name="radio_disagree"/>
+ <radio_item label="Ich stimme den Nutzungsbedingungen zu" name="radio_agree"/>
</radio_group>
<text name="tos_title">
Nutzungsvereinbarung
</text>
- <check_box label="Ich stimme den Nutzungsbedingungen zu" name="agree_chk" />
+ <check_box label="Ich stimme den Nutzungsbedingungen zu" name="agree_chk"/>
<text name="tos_heading">
- Lesen Sie die folgenden Nutzungsbedingungen sorgfältig durch. Sie müssen dieser Vereinbarung
-zustimmen, um [SECOND_LIFE] benutzen zu können.
+ Lesen Sie die folgenden Servicebedingungen sorgfältig durch. Sie müssen den Servicebedinungen zustimmen, um [SECOND_LIFE] weiterhin verwenden zu können.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/de/floater_url_entry.xml b/indra/newview/skins/default/xui/de/floater_url_entry.xml
index 392d53a33d..f5fa449c85 100644
--- a/indra/newview/skins/default/xui/de/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/de/floater_url_entry.xml
@@ -3,10 +3,10 @@
<text name="media_label">
Medien-URL:
</text>
- <button label="OK" name="ok_btn" />
- <button label="Abbrechen" name="cancel_btn" width="75" />
- <button label="Löschen" name="clear_btn" />
- <text name="loading_label">
+ <button label="OK" name="ok_btn" width="30"/>
+ <button label="Abbrechen" name="cancel_btn" width="66" />
+ <button label="Löschen" name="clear_btn" left_pad="100"/>
+ <text name="loading_label" left="120">
Wird geladen...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
new file mode 100644
index 0000000000..f978042cc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Voice-Steuerung">
+ <string name="title_nearby">
+ VOICE IN DER NÄHE
+ </string>
+ <string name="title_group">
+ Gruppengespräch mit [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Konferenzgespräch
+ </string>
+ <string name="title_peer_2_peer">
+ Gespräch mit [NAME]
+ </string>
+ <string name="no_one_near">
+ Es ist niemand in der Nähe, der Voice aktiviert hat.
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Anruf beenden" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
index 95b469434a..ecd6d7ff3e 100644
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ b/indra/newview/skins/default/xui/de/floater_water.xml
@@ -1,66 +1,53 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Water Floater" title="Erweiterter Wasser-Editor">
- <text name="KeyFramePresetsText">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="ERWEITERTER WASSER-EDITOR">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText" width="116">
Voreinstellungen:
</text>
- <button label="Neu" label_selected="Neu" name="WaterNewPreset" />
- <button label="Speichern" label_selected="Speichern" name="WaterSavePreset" />
- <button label="Löschen" label_selected="Löschen" name="WaterDeletePreset" />
+ <button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
+ <button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/>
+ <button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
<panel label="Einstellungen" name="Settings">
<text name="BHText">
Wassertrübungsfarbe
</text>
- <button label=" ?" name="WaterFogColorHelp" left="175" />
- <color_swatch name="WaterFogColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen" />
+ <color_swatch name="WaterFogColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<text name="WaterFogDensText">
Wassertrübungsdichte
</text>
- <button label=" ?" name="WaterFogDensityHelp" left="175" />
<text name="WaterUnderWaterFogModText">
Wassertrübungs-Modifikator
</text>
- <button label=" ?" name="WaterUnderWaterFogModHelp" left="175" />
- <slider bottom_delta="-34" name="WaterUnderWaterFogMod" />
+ <slider bottom_delta="-34" name="WaterUnderWaterFogMod"/>
<text name="BDensText">
Reflexionswellengröße
</text>
- <button label=" ?" name="WaterNormalScaleHelp" />
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
<text name="HDText">
Fresnel-Skalierung
</text>
- <button label=" ?" name="WaterFresnelScaleHelp" />
<text name="FresnelOffsetText">
Fresnel-Versatz
</text>
- <button label=" ?" name="WaterFresnelOffsetHelp" />
<text name="DensMultText">
Brechungsstärke oben
</text>
- <button label=" ?" name="WaterScaleAboveHelp" />
<text name="WaterScaleBelowText">
Brechungsstärke unten
</text>
- <button label=" ?" name="WaterScaleBelowHelp" />
<text name="MaxAltText">
Mischungsmultiplikator
</text>
- <button label=" ?" name="WaterBlurMultiplierHelp" />
</panel>
<panel label="Bild" name="Waves">
<text name="BHText">
Richtung große Welle
</text>
- <button label=" ?" name="WaterWave1Help" />
<text name="WaterWave1DirXText">
X
</text>
@@ -70,7 +57,6 @@
<text name="BHText2">
Richtung kleine Welle
</text>
- <button label=" ?" name="WaterWave2Help" />
<text name="WaterWave2DirXText">
X
</text>
@@ -80,10 +66,6 @@
<text name="BHText3">
Normal-Map
</text>
- <button label=" ?" name="WaterNormalMapHelp" />
</panel>
</tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
index dad1b62975..f9b3552e8b 100644
--- a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="Speichern" label_selected="Speichern" name="Save" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
- Objekt speichern als:
+ Objekt in meinem Inventar speichern als:
</text>
<line_editor name="name ed">
Neu [DESC]
diff --git a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..1332509529
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="WHITELISTEN-EINTRAG">
+ <text name="media_label">
+ Eine URL oder URL
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Eine URL oder URL-Patten in die Whitelist eingeben"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn" width="80"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
index 8df412dab6..3e06d8f06b 100644
--- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
@@ -1,19 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="Erweiterter Himmel-Editor">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="ERWEITERTER HIMMEL-EDITOR">
<text name="KeyFramePresetsText">
Voreinstellungen:
</text>
- <button label="Neu" label_selected="Neu" name="WLNewPreset" />
- <button label="Speichern" label_selected="Speichern" name="WLSavePreset" />
- <button label="Löschen" label_selected="Löschen" name="WLDeletePreset" />
- <button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor"
- name="WLDayCycleMenuButton" />
+ <button label="Neu" label_selected="Neu" name="WLNewPreset"/>
+ <button label="Speichern" label_selected="Speichern" name="WLSavePreset"/>
+ <button label="Löschen" label_selected="Löschen" name="WLDeletePreset"/>
+ <button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
<panel label="Atmosphäre" name="Atmosphere">
<text name="BHText">
Horizontfarbe
</text>
- <button label=" ?" name="WLBlueHorizonHelp" />
+ <button label=" ?" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -29,11 +28,11 @@
<text name="BDensText">
Horizonttrübung
</text>
- <button label=" ?" name="WLHazeHorizonHelp" />
+ <button label=" ?" name="WLHazeHorizonHelp"/>
<text name="BDensText2">
Farbintensität
</text>
- <button label=" ?" name="WLBlueDensityHelp" />
+ <button label=" ?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -49,25 +48,25 @@
<text name="HDText">
Trübungsintensität
</text>
- <button label=" ?" name="WLHazeDensityHelp" />
+ <button label=" ?" name="WLHazeDensityHelp"/>
<text name="DensMultText">
Dichtemultiplikator
</text>
- <button label=" ?" name="WLDensityMultHelp" />
+ <button label=" ?" name="WLDensityMultHelp"/>
<text name="WLDistanceMultText">
Entfernungsmultiplikator
</text>
- <button label=" ?" name="WLDistanceMultHelp" />
+ <button label=" ?" name="WLDistanceMultHelp"/>
<text name="MaxAltText">
Max. Höhe
</text>
- <button label=" ?" name="WLMaxAltitudeHelp" />
+ <button label=" ?" name="WLMaxAltitudeHelp"/>
</panel>
<panel label="Licht" name="Lighting">
<text name="SLCText">
Sonne/Mond-Farbe
</text>
- <button label=" ?" name="WLSunlightColorHelp" />
+ <button label=" ?" name="WLSunlightColorHelp"/>
<text name="BHText">
R
</text>
@@ -83,11 +82,11 @@
<text name="TODText">
Sonne/Mond-Stand
</text>
- <button label=" ?" name="WLTimeOfDayHelp" />
+ <button label=" ?" name="WLTimeOfDayHelp"/>
<text name="WLAmbientText">
Umgebung
</text>
- <button label=" ?" name="WLAmbientHelp" />
+ <button label=" ?" name="WLAmbientHelp"/>
<text name="BHText5">
R
</text>
@@ -103,27 +102,27 @@
<text name="WLEastAngleText">
Ostausrichtung
</text>
- <button label=" ?" name="WLEastAngleHelp" />
+ <button label=" ?" name="WLEastAngleHelp"/>
<text name="SunGlowText">
Sonnenleuchtkraft
</text>
- <button label=" ?" name="WLSunGlowHelp" />
- <slider label="Fokus " name="WLGlowB" />
- <slider label="Größe " name="WLGlowR" />
+ <button label=" ?" name="WLSunGlowHelp"/>
+ <slider label="Fokus " name="WLGlowB"/>
+ <slider label="Größe " name="WLGlowR"/>
<text name="SceneGammaText">
Gamma in Szene
</text>
- <button label=" ?" name="WLSceneGammaHelp" />
+ <button label=" ?" name="WLSceneGammaHelp"/>
<text name="WLStarText">
Sternenleuchtkraft
</text>
- <button label=" ?" name="WLStarBrightnessHelp" />
+ <button label=" ?" name="WLStarBrightnessHelp"/>
</panel>
<panel label="Wolken" name="Clouds">
<text name="WLCloudColorText">
Wolkenfarbe
</text>
- <button label=" ?" name="WLCloudColorHelp" />
+ <button label=" ?" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -139,7 +138,7 @@
<text name="WLCloudColorText2">
Wolken-XY/Dichte
</text>
- <button label=" ?" name="WLCloudDensityHelp" />
+ <button label=" ?" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -152,15 +151,15 @@
<text name="WLCloudCoverageText">
Wolkendichte
</text>
- <button label=" ?" name="WLCloudCoverageHelp" />
+ <button label=" ?" name="WLCloudCoverageHelp"/>
<text name="WLCloudScaleText">
Wolkenskalierung
</text>
- <button label=" ?" name="WLCloudScaleHelp" />
+ <button label=" ?" name="WLCloudScaleHelp"/>
<text name="WLCloudDetailText">
Wolkendetails (XY/Dichte)
</text>
- <button label=" ?" name="WLCloudDetailHelp" />
+ <button label=" ?" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -173,15 +172,15 @@
<text name="WLCloudScrollXText">
Wolkenbewegung X
</text>
- <button label=" ?" name="WLCloudScrollXHelp" />
- <check_box label="Fest" name="WLCloudLockX" />
+ <button label=" ?" name="WLCloudScrollXHelp"/>
+ <check_box label="Fest" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
Wolkenbewegung Y
</text>
- <button label=" ?" name="WLCloudScrollYHelp" />
- <check_box label="Fest" name="WLCloudLockY" />
- <check_box label="Klassische Wolken" name="DrawClassicClouds" />
- <button label=" ?" name="WLClassicCloudsHelp" />
+ <button label=" ?" name="WLCloudScrollYHelp"/>
+ <check_box label="Fest" name="WLCloudLockY"/>
+ <check_box label="Klassische Wolken" name="DrawClassicClouds"/>
+ <button label=" ?" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/de/floater_window_size.xml b/indra/newview/skins/default/xui/de/floater_window_size.xml
new file mode 100644
index 0000000000..a2a53e0567
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="FENSTERGRÖSSE">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Fenstergröße einstellen:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="Breite x Höhe">
+ <combo_box.item label="1000 x 700 (Standard)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Festlegen" name="set_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml
index d3366e5871..7d8a634452 100644
--- a/indra/newview/skins/default/xui/de/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_world_map.xml
@@ -1,57 +1,82 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Weltkarte">
- <tab_container name="maptab">
- <panel label="Objekte" name="objects_mapview"/>
- <panel label="Terrain" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Sie
- </text>
- <text name="home_label">
- Zuhause
- </text>
- <text name="auction_label">
- Auktion
- </text>
- <text font="SansSerifSmall" name="land_for_sale_label">
- Land zum Verkauf
- </text>
- <button label="Nach Hause" label_selected="Nach Hause" name="Go Home" tool_tip="Nach Hause teleportieren"/>
- <check_box label="Einwohner" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Land zu verkaufen" name="land_for_sale_chk"/>
- <text name="events_label">
- Events:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <combo_box label="Online-Freunde" name="friend combo" tool_tip="Freund, der auf Karte angezeigt werden soll">
- <combo_box.item name="item1" label="Online-Freunde" />
- </combo_box>
- <combo_box label="Landmarken" name="landmark combo" tool_tip="Landmarke, die auf Karte angezeigt werden soll">
- <combo_box.item name="item1" label="Landmarken" />
- </combo_box>
- <line_editor label="Nach Regionsname suchen" name="location" tool_tip="Geben Sie den Namen einer Region ein"/>
- <button label="Suchen" name="DoSearch" tool_tip="Nach einer Region suchen"/>
- <text name="search_label">
- Suchergebnisse:
- </text>
- <scroll_list name="search_results">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Standort:
- </text>
- <spinner name="spin x" tool_tip="X-Koordinate der Position auf der Karte"/>
- <spinner name="spin y" tool_tip="Y-Koordinate der Position auf der Karte"/>
- <spinner name="spin z" tool_tip="Z-Koordinate der Position auf der Karte"/>
- <button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zu ausgewählter Position teleportieren"/>
- <button label="Gesuchte Position" label_selected="Ziel anzeigen" name="Show Destination" tool_tip="Karte auf ausgewählte Position zentrieren"/>
- <button label="Löschen" label_selected="Löschen" name="Clear" tool_tip="Verfolgung abschalten"/>
- <button label="Meine Position" label_selected="Wo bin ich?" name="Show My Location" tool_tip="Karte auf Position Ihres Avatars zentrieren"/>
- <button font="SansSerifSmall" label="SLurl in die Zwischenablage kopieren" name="copy_slurl" tool_tip="Kopiert die aktuelle Position als SLurl zur Verwendung im Web."/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="KARTE">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legende
+ </text>
+ </panel>
+ <panel>
+ <button label="Meine Position" label_selected="Wo bin ich?" name="Show My Location" tool_tip="Karte auf Position meines Avatars zentrieren"/>
+ <text name="me_label">
+ Ich
+ </text>
+ <check_box label="Einwohner" name="people_chk"/>
+ <text name="person_label">
+ Person
+ </text>
+ <check_box label="Infohub" name="infohub_chk"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box label="Land zu verkaufen" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ Land-Verkauf
+ </text>
+ <text name="by_owner_label">
+ durch Besitzer
+ </text>
+ <text name="auction_label">
+ Land-Auktion
+ </text>
+ <button label="Nach Hause" label_selected="Nach Hause" name="Go Home" tool_tip="Nach Hause teleportieren"/>
+ <text name="Home_label">
+ Startseite
+ </text>
+ <text name="events_label">
+ Events:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <text name="pg_label">
+ Allgemein
+ </text>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ Moderat
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ <text name="adult_label">
+ Adult
+ </text>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Auf Karte anzeigen
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Online-Freunde" name="friend combo" tool_tip="Freunde auf Karte anzeigen">
+ <combo_box.item label="Meine Freunde: Online" name="item1"/>
+ </combo_box>
+ <combo_box label="Meine Landmarken" name="landmark combo" tool_tip="Landmarke, die auf Karte angezeigt werden soll">
+ <combo_box.item label="Meine Landmarken" name="item1"/>
+ </combo_box>
+ <search_editor label="Regionen nach Name" name="location" tool_tip="Geben Sie den Namen einer Region ein"/>
+ <button label="Suchen" name="DoSearch" tool_tip="Nach einer Region suchen"/>
+ <button name="Clear" tool_tip="Karte zurücksetzen"/>
+ <scroll_list name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zu ausgewählter Position teleportieren"/>
+ <button font="SansSerifSmall" label="SLurl kopieren" name="copy_slurl" tool_tip="Kopiert die aktuelle Position als SLurl zur Verwendung im Web."/>
+ <button label="Auswahl anzeigen" label_selected="Ziel anzeigen" name="Show Destination" tool_tip="Karte auf ausgewählte Position zentrieren"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml
new file mode 100644
index 0000000000..a0bd24a69f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_name" value="Grumpity ProductEngine"/>
+ <text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
+ <text name="user_details">
+ Dies ist meine Beschreibung und ich finde sie wirklich gut!
+ </text>
+ <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
+ <button label="Freund hinzufügen" name="add_friend_btn" width="110"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/>
+ <panel name="moderator_panel">
+ <button label="Voice deaktivieren" name="disable_voice"/>
+ <button label="Voice aktivieren" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml
new file mode 100644
index 0000000000..badb47bf08
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/inspect_group.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Private Gruppe
+ </string>
+ <string name="FreeToJoin">
+ Mitgliedschaft kostenlos
+ </string>
+ <string name="CostToJoin">
+ Mitgliedschaft: [AMOUNT] L$
+ </string>
+ <string name="YouAreMember">
+ Sie sind Mitglied
+ </string>
+ <text name="group_name">
+ Grumpitys schlecht gelaunte Elche
+ </text>
+ <text name="group_subtitle">
+ 123 Mitglieder
+ </text>
+ <text name="group_details">
+ Eine Gruppe für Leute, die sich gerne mit Elchen unterhält.
+Hoch solln sie leben! Elche forever! Und auch Mungos!
+ </text>
+ <text name="group_cost">
+ Mitgliedschaft: 123 L$
+ </text>
+ <button label="Zusammen" name="join_btn"/>
+ <button label="Verlassen" name="leave_btn"/>
+ <button label="Profil anzeigen" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_object.xml b/indra/newview/skins/default/xui/de/inspect_object.xml
new file mode 100644
index 0000000000..ede14a37d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/inspect_object.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Von [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ von [CREATOR]
+Besitzer [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ Kostenlos!
+ </string>
+ <string name="Touch">
+ Berühren
+ </string>
+ <string name="Sit">
+ Sitzen
+ </string>
+ <text name="object_name" value="Wirklich langen Objektnamen als Test eingeben"/>
+ <text name="object_creator">
+ von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ 300.000 L$
+ </text>
+ <text name="object_description">
+ Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon 120 Zeichen. Niemand weiß es genau.
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Kaufen" name="buy_btn"/>
+ <button label="Bezahlen" name="pay_btn"/>
+ <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/>
+ <button label="Berühren" name="touch_btn"/>
+ <button label="Sitzen" name="sit_btn"/>
+ <button label="Öffnen" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Sicheres Browsen"/>
+ <button label="Mehr" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_remote_object.xml b/indra/newview/skins/default/xui/de/inspect_remote_object.xml
new file mode 100644
index 0000000000..9fe05455eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/inspect_remote_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Wirklich langen Objektnamen als Test eingeben
+ </text>
+ <text name="object_owner_label">
+ Eigentümer:
+ </text>
+ <text name="object_owner">
+ Langeravatarname Schmidtmeyermülllermuster
+ </text>
+ <text name="object_slurl_label">
+ Standort:
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Karte" name="map_btn"/>
+ <button label="Ignorieren" name="block_btn"/>
+ <button label="Schließen" name="close_btn"/>
+</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
new file mode 100644
index 0000000000..d234443fae
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil anzeigen" name="Profile..."/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="In Gruppe einladen" name="Invite..."/>
+ <menu_item_call label="Ignorieren" name="Avatar Mute"/>
+ <menu_item_call label="Melden" name="abuse"/>
+ <menu_item_call label="Einfrieren" name="Freeze..."/>
+ <menu_item_call label="Hinauswerfen" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+ <menu_item_call label="Objektprofil" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
new file mode 100644
index 0000000000..bc33b9b93d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Berühren" name="Attachment Object Touch"/>
+ <menu_item_call label="Bearbeiten" name="Edit..."/>
+ <menu_item_call label="Abnehmen" name="Detach"/>
+ <menu_item_call label="Fallen lassen" name="Drop"/>
+ <menu_item_call label="Aufstehen" name="Stand Up"/>
+ <menu_item_call label="Mein Aussehen" name="Appearance..."/>
+ <menu_item_call label="Meine Freunde" name="Friends..."/>
+ <menu_item_call label="Meine Gruppen" name="Groups..."/>
+ <menu_item_call label="Mein Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml
new file mode 100644
index 0000000000..c036cf5515
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profil anzeigen" name="Show Profile"/>
+ <menu_item_call label="IM senden..." name="Send IM"/>
+ <menu_item_call label="Freund hinzufügen..." name="Add Friend"/>
+ <menu_item_call label="Freund entfernen..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_other.xml b/indra/newview/skins/default/xui/de/menu_avatar_other.xml
new file mode 100644
index 0000000000..05eade1d34
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profil anzeigen" name="Profile..."/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="In Gruppe einladen" name="Invite..."/>
+ <menu_item_call label="Ignorieren" name="Avatar Mute"/>
+ <menu_item_call label="Melden" name="abuse"/>
+ <menu_item_call label="Einfrieren" name="Freeze..."/>
+ <menu_item_call label="Hinauswerfen" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
new file mode 100644
index 0000000000..3a116b84a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Aufstehen" name="Stand Up"/>
+ <context_menu label="Ausziehen â–¶" name="Take Off &gt;">
+ <context_menu label="Kleidung â–¶" name="Clothes &gt;">
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Strümpfe" name="Socks"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Unterhemd" name="Self Undershirt"/>
+ <menu_item_call label="Unterhose" name="Self Underpants"/>
+ <menu_item_call label="Tätowierung" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Alle Kleider" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Abnehmen â–¶" name="Object Detach"/>
+ <menu_item_call label="Alles abnehmen" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Mein Aussehen" name="Appearance..."/>
+ <menu_item_call label="Meine Freunde" name="Friends..."/>
+ <menu_item_call label="Meine Gruppen" name="Groups..."/>
+ <menu_item_call label="Mein Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
new file mode 100644
index 0000000000..3f12906adc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
+ <menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
+ <menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
+ <menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/>
+ <menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Löschen" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Alle auswählen" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_favorites.xml b/indra/newview/skins/default/xui/de/menu_favorites.xml
new file mode 100644
index 0000000000..0d0491d2eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportieren" name="Teleport To Landmark"/>
+ <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/>
+ <menu_item_call label="SLurl kopieren" name="Copy slurl"/>
+ <menu_item_call label="Auf Karte zeigen" name="Show On Map"/>
+ <menu_item_call label="Kopieren" name="Landmark Copy"/>
+ <menu_item_call label="Einfügen" name="Landmark Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_gesture_gear.xml b/indra/newview/skins/default/xui/de/menu_gesture_gear.xml
new file mode 100644
index 0000000000..953c0eeed5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Zu Favoriten hinzufügen/daraus entfernen" name="activate"/>
+ <menu_item_call label="Kopieren" name="copy_gesture"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="UUID kopieren" name="copy_uuid"/>
+ <menu_item_call label="Aktuelles Outfit speichern" name="save_to_outfit"/>
+ <menu_item_call label="Bearbeiten" name="edit_gesture"/>
+ <menu_item_call label="Untersuchen" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_group_plus.xml b/indra/newview/skins/default/xui/de/menu_group_plus.xml
new file mode 100644
index 0000000000..583ee793be
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Werden Sie Mitglied..." name="item_join"/>
+ <menu_item_call label="Neue Gruppe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
new file mode 100644
index 0000000000..32a6823b35
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_im_well_button.xml b/indra/newview/skins/default/xui/de/menu_im_well_button.xml
new file mode 100644
index 0000000000..f464b71f4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Alle schließen" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/de/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..11f93f47b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/de/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..81ef3b6569
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Gruppeninfo" name="Show Profile"/>
+ <menu_item_call label="Sitzung anzeigen" name="Chat"/>
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/de/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d123238246
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Profil anzeigen" name="Show Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="Sitzung anzeigen" name="Send IM"/>
+ <menu_item_call label="Sitzung beenden" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..6f003dc9a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Profil anzeigen" name="view_profile"/>
+ <menu_item_call label="Freund hinzufügen" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Anrufen" name="call"/>
+ <menu_item_call label="Teleportieren" name="teleport"/>
+ <menu_item_call label="In Gruppe einladen" name="invite_to_group"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
+ <menu_item_call label="Melden" name="report"/>
+ <menu_item_call label="Einfrieren" name="freeze"/>
+ <menu_item_call label="Hinauswerfen" name="eject"/>
+ <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
+ <menu_item_call label="Hineinzoomen" name="zoom_in"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Teilen" name="share"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..634ef0b198
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Berühren" name="touch"/>
+ <menu_item_call label="Sitzen" name="sit"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Kaufen" name="buy"/>
+ <menu_item_call label="Nehmen" name="take"/>
+ <menu_item_call label="Kopie nehmen" name="take_copy"/>
+ <menu_item_call label="Öffnen" name="open"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+ <menu_item_call label="Anziehen" name="wear"/>
+ <menu_item_call label="Melden" name="report"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Hineinzoomen" name="zoom_in"/>
+ <menu_item_call label="Entfernen" name="remove"/>
+ <menu_item_call label="Weitere Infos" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..383ee7831e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Aufstehen" name="stand_up"/>
+ <menu_item_call label="Mein Aussehen" name="my_appearance"/>
+ <menu_item_call label="Mein Profil" name="my_profile"/>
+ <menu_item_call label="Meine Freunde" name="my_friends"/>
+ <menu_item_call label="Meine Gruppen" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index e05b2e9f1a..a0625d88a8 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -2,7 +2,7 @@
<menu name="Popup">
<menu_item_call label="Kaufen" name="Task Buy"/>
<menu_item_call label="Öffnen" name="Task Open"/>
- <menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/>
+ <menu_item_call label="Abspielen" name="Task Play"/>
<menu_item_call label="Eigenschaften" name="Task Properties"/>
<menu_item_call label="Umbenennen" name="Task Rename"/>
<menu_item_call label="Löschen" name="Task Remove"/>
@@ -10,9 +10,9 @@
<menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
<menu_item_call label="Neuer Ordner" name="New Folder"/>
<menu_item_call label="Neues Skript" name="New Script"/>
- <menu_item_call label="Neue Notiz" name="New Note"/>
+ <menu_item_call label="Neue Notizkarte" name="New Note"/>
<menu_item_call label="Neue Geste" name="New Gesture"/>
- <menu name="New Clothes">
+ <menu label="Neue Kleider" name="New Clothes">
<menu_item_call label="Neues Hemd" name="New Shirt"/>
<menu_item_call label="Neue Hose" name="New Pants"/>
<menu_item_call label="Neue Schuhe" name="New Shoes"/>
@@ -22,40 +22,58 @@
<menu_item_call label="Neue Handschuhe" name="New Gloves"/>
<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
+ <menu label="Neue Körperteile" name="New Body Parts">
<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
<menu_item_call label="Neue Haut" name="New Skin"/>
<menu_item_call label="Neues Haar" name="New Hair"/>
<menu_item_call label="Neue Augen" name="New Eyes"/>
</menu>
+ <menu label="Typ ändern" name="Change Type">
+ <menu_item_call label="Standard" name="Default"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Form" name="Shape"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Unterhose" name="Underpants"/>
+ <menu_item_call label="Unterhemd" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teleportieren" name="Landmark Open"/>
<menu_item_call label="Öffnen" name="Animation Open"/>
<menu_item_call label="Öffnen" name="Sound Open"/>
+ <menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/>
+ <menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/>
+ <menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/>
<menu_item_call label="Objekt löschen" name="Purge Item"/>
<menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
+ <menu_item_call label="Original suchen" name="Find Original"/>
<menu_item_call label="Öffnen" name="Open"/>
<menu_item_call label="Eigenschaften" name="Properties"/>
<menu_item_call label="Umbenennen" name="Rename"/>
<menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
<menu_item_call label="Kopieren" name="Copy"/>
<menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Als Link einfügen" name="Paste As Link"/>
+ <menu_item_call label="Link entfernen" name="Remove Link"/>
<menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Objekte abnehmen" name="Take Off Items"/>
- <menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/>
- <menu_item_call label="Outfit ersetzen" name="Replace Outfit"/>
+ <menu_item_call label="Systemordner löschen" name="Delete System Folder"/>
<menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
<menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
- <menu_item_call label="Landmarken-Info" name="Teleport To Landmark"/>
- <menu_item_call label="In Welt abspielen" name="Animation Play"/>
- <menu_item_call label="Lokal wiedergeben" name="Animation Audition"/>
+ <menu_item_call label="Landmarken-Info" name="About Landmark"/>
+ <menu_item_call label="Inworld abspielen" name="Animation Play"/>
+ <menu_item_call label="Lokal abspielen" name="Animation Audition"/>
<menu_item_call label="Instant Message senden" name="Send Instant Message"/>
<menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
<menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
<menu_item_call label="Aktivieren" name="Activate"/>
<menu_item_call label="Deaktivieren" name="Deactivate"/>
+ <menu_item_call label="Speichern unter" name="Save As"/>
<menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/>
- <menu_item_call label="Zu letzter Position zurücksetzen" name="Restore to Last Position"/>
<menu_item_call label="Anziehen" name="Object Wear"/>
<menu label="Anhängen an" name="Attach To"/>
<menu label="An HUD hängen" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
new file mode 100644
index 0000000000..448b1d80bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Hochladen" name="upload">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Neuer Ordner" name="New Folder"/>
+ <menu_item_call label="Neues Skript" name="New Script"/>
+ <menu_item_call label="Neue Notizkarte" name="New Note"/>
+ <menu_item_call label="Neue Geste" name="New Gesture"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Alpha: Neu" name="New Alpha"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..e2b980c7b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Neues Inventar-Fenster" name="new_window"/>
+ <menu_item_call label="Nach Name sortieren" name="sort_by_name"/>
+ <menu_item_call label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
+ <menu_item_call label="Filter anzeigen" name="show_filters"/>
+ <menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
+ <menu_item_call label="Alle Ordner schließen" name="close_folders"/>
+ <menu_item_call label="Papierkorb ausleeren" name="empty_trash"/>
+ <menu_item_call label="Fundbüro ausleeren" name="empty_lostnfound"/>
+ <menu_item_call label="Textur speichern als" name="Save Texture As"/>
+ <menu_item_call label="Original suchen" name="Find Original"/>
+ <menu_item_call label="Alle Links suchen" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_land.xml b/indra/newview/skins/default/xui/de/menu_land.xml
new file mode 100644
index 0000000000..9b1e6727b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Land-Info" name="Place Information..."/>
+ <menu_item_call label="Hier sitzen" name="Sit Here"/>
+ <menu_item_call label="Dieses Land kaufen" name="Land Buy"/>
+ <menu_item_call label="Pass kaufen" name="Land Buy Pass"/>
+ <menu_item_call label="Bauen" name="Create"/>
+ <menu_item_call label="Terrain bearbeiten" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_landmark.xml b/indra/newview/skins/default/xui/de/menu_landmark.xml
new file mode 100644
index 0000000000..2aff0eec95
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl kopieren" name="copy"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Auswahl erstellen" name="pick"/>
+ <menu_item_call label="Zu Favoritenleiste hinzufügen" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index 887d8d1b84..fffa056cac 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -1,13 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Datei" name="File">
- <menu_item_call label="Beenden" name="Quit" />
- </menu>
- <menu label="Bearbeiten" name="Edit">
- <menu_item_call label="Einstellungen..." name="Preferences..." />
+ <menu label="Ich" name="File">
+ <menu_item_call label="Einstellungen" name="Preferences..."/>
+ <menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
<menu label="Hilfe" name="Help">
- <menu_item_call label="Hilfe zu [SECOND_LIFE]" name="Second Life Help" />
- <menu_item_call label="Über [APP_NAME]..." name="About Second Life..." />
+ <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
+ <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Debug" name="Debug">
+ <menu label="Bearbeiten" name="Edit">
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederherstellen" name="Redo"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Duplizieren" name="Duplicate"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+ <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
+ <menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/>
+ <menu_item_call label="XUI-Editor" name="UI Preview Tool"/>
+ <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-Browser-Test" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml
index 9b7117cf42..a3ebfb3b10 100644
--- a/indra/newview/skins/default/xui/de/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom Nah" name="Zoom Close"/>
<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
<menu_item_call label="Zoom Weit" name="Zoom Far"/>
+ <menu_item_check label="Karte drehen" name="Rotate Map"/>
<menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
- <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Weltkarte" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_navbar.xml b/indra/newview/skins/default/xui/de/menu_navbar.xml
new file mode 100644
index 0000000000..5175f34b41
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
+ <menu_item_check label="Parzelleneigenschaften anzeigen" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmarke" name="Landmark"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_nearby_chat.xml b/indra/newview/skins/default/xui/de/menu_nearby_chat.xml
new file mode 100644
index 0000000000..99d6428c3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Leute in der Nähe anzeigen..." name="nearby_people"/>
+ <menu_item_check label="Ignorierten Text anzeigen" name="muted_text"/>
+ <menu_item_check label="Bilder von Freunden anzeigen" name="show_buddy_icons"/>
+ <menu_item_check label="Namen anzeigen" name="show_names"/>
+ <menu_item_check label="Namen und Symbole anzeigen" name="show_icons_and_names"/>
+ <menu_item_call label="Schriftgröße" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_notification_well_button.xml b/indra/newview/skins/default/xui/de/menu_notification_well_button.xml
new file mode 100644
index 0000000000..0f2784f160
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Alle schließen" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml
new file mode 100644
index 0000000000..320f93c796
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Berühren" name="Object Touch"/>
+ <menu_item_call label="Bearbeiten" name="Edit..."/>
+ <menu_item_call label="Bauen" name="Build"/>
+ <menu_item_call label="Öffnen" name="Open"/>
+ <menu_item_call label="Hier sitzen" name="Object Sit"/>
+ <menu_item_call label="Objektprofil" name="Object Inspect"/>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <context_menu label="Anziehen â–¶" name="Put On">
+ <menu_item_call label="Anziehen" name="Wear"/>
+ <context_menu label="Anhängen ▶" name="Object Attach"/>
+ <context_menu label="HUD anhängen ▶" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Entfernen â–¶" name="Remove">
+ <menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
+ <menu_item_call label="Ignorieren" name="Object Mute"/>
+ <menu_item_call label="Zurückgeben" name="Return..."/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Nehmen" name="Pie Object Take"/>
+ <menu_item_call label="Kopie nehmen" name="Take Copy"/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
+ <menu_item_call label="Kaufen" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_object_icon.xml b/indra/newview/skins/default/xui/de/menu_object_icon.xml
new file mode 100644
index 0000000000..8b6c558416
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Objektprofil..." name="Object Profile"/>
+ <menu_item_call label="Ignorieren..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_participant_list.xml b/indra/newview/skins/default/xui/de/menu_participant_list.xml
new file mode 100644
index 0000000000..5ca4eaaa50
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_participant_list.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Nach Name sortieren" name="SortByName"/>
+ <menu_item_check label="Nach letzten Sprechern sortieren" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Profil anzeigen" name="View Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_check label="Voice ignorieren" name="Block/Unblock"/>
+ <menu_item_check label="Text ignorieren" name="MuteText"/>
+ <context_menu label="Moderator-Optionen &gt;" name="Moderator Options">
+ <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/>
+ <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Alle anderen stummschalten" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Stummschaltung für alle anderen aufheben" name="ModerateVoiceUnMuteOthers"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..9d50a42ed4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Nach Status sortieren" name="sort_status"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_groups.xml b/indra/newview/skins/default/xui/de/menu_people_groups.xml
new file mode 100644
index 0000000000..76225ba241
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Info anzeigen" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Aktivieren" name="Activate"/>
+ <menu_item_call label="Verlassen" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..b68597d8aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/>
+ <menu_item_call label="Ausgewählte Gruppe verlassen" name="Leave Selected Group"/>
+</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
new file mode 100644
index 0000000000..a69ef3891a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Profil anzeigen" name="View Profile"/>
+ <menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="Freund entfernen" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
+ <menu_item_call label="Teleport anbieten" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..d978d9e40c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Freunde hinzufügen" name="Add Friends"/>
+ <menu_item_call label="Freunde entfernen" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Teilen" name="Share"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..0f252ab46d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..1ef020f5e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_name"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_picks.xml b/indra/newview/skins/default/xui/de/menu_picks.xml
new file mode 100644
index 0000000000..9aec4c83b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Bearbeiten" name="pick_edit"/>
+ <menu_item_call label="Teleportieren" name="pick_teleport"/>
+ <menu_item_call label="Karte" name="pick_map"/>
+ <menu_item_call label="Löschen" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_picks_plus.xml b/indra/newview/skins/default/xui/de/menu_picks_plus.xml
new file mode 100644
index 0000000000..385ff25b95
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Neue Auswahl" name="create_pick"/>
+ <menu_item_call label="Neue Anzeige" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_place.xml b/indra/newview/skins/default/xui/de/menu_place.xml
new file mode 100644
index 0000000000..d9c85f5b92
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Eine Landmarke setzen" name="landmark"/>
+ <menu_item_call label="Auswahl erstellen" name="pick"/>
+ <menu_item_call label="Pass kaufen" name="pass"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_place_add_button.xml b/indra/newview/skins/default/xui/de/menu_place_add_button.xml
new file mode 100644
index 0000000000..7c0ff4a46a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..132d3f6466
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Ausschneiden" name="cut"/>
+ <menu_item_call label="Kopieren" name="copy_folder"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Erweitern Sie sich" name="expand"/>
+ <menu_item_call label="Zuklappen" name="collapse"/>
+ <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
+ <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
+ <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..6af4d644af
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportieren" name="teleport"/>
+ <menu_item_call label="Weitere Informationen" name="more_info"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
+ <menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Ausschneiden" name="cut"/>
+ <menu_item_call label="Landmarke kopieren" name="copy_landmark"/>
+ <menu_item_call label="SLurl kopieren" name="copy_slurl"/>
+ <menu_item_call label="Einfügen" name="paste"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Löschen" name="delete"/>
+ <menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
+ <menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
+ <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
+ <menu_item_call label="Auswahl erstellen" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_profile_overflow.xml b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
new file mode 100644
index 0000000000..03bc19aa3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Teilen" name="share"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
+ <menu_item_call label="Hinauswerfen" name="kick"/>
+ <menu_item_call label="Einfrieren" name="freeze"/>
+ <menu_item_call label="Auftauen" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_slurl.xml b/indra/newview/skins/default/xui/de/menu_slurl.xml
index d9793e5906..b2ec017f9f 100644
--- a/indra/newview/skins/default/xui/de/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/de/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="URL-Info" name="about_url" />
- <menu_item_call label="Zu URL teleportieren" name="teleport_to_url" />
- <menu_item_call label="Auf Karte" name="show_on_map" />
+ <menu_item_call label="URL-Info" name="about_url"/>
+ <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/>
+ <menu_item_call label="Karte" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/de/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..68b8e21802
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Alle Ordner aufklappen" name="Expand all folders"/>
+ <menu_item_call label="Alle Ordner schließen" name="Collapse all folders"/>
+ <menu_item_call label="Teleport-Liste löschen" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/de/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ff8fb0b181
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportieren" name="Teleport"/>
+ <menu_item_call label="Weitere Informationen" name="More Information"/>
+ <menu_item_call label="In Zwischenablage kopieren" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/de/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..194dd16fd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Öffnen" name="TabOpen"/>
+ <menu_item_call label="Schließen" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_text_editor.xml b/indra/newview/skins/default/xui/de/menu_text_editor.xml
new file mode 100644
index 0000000000..c00186c13e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml
new file mode 100644
index 0000000000..9a808088fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/>
+ <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_group.xml b/indra/newview/skins/default/xui/de/menu_url_group.xml
new file mode 100644
index 0000000000..6bd86414bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/>
+ <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_http.xml b/indra/newview/skins/default/xui/de/menu_url_http.xml
new file mode 100644
index 0000000000..30eb1668a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Webseite öffnen" name="url_open"/>
+ <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/>
+ <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/>
+ <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_inventory.xml b/indra/newview/skins/default/xui/de/menu_url_inventory.xml
new file mode 100644
index 0000000000..dc069df02b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Inventarobjekte anzeigen" name="show_item"/>
+ <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_map.xml b/indra/newview/skins/default/xui/de/menu_url_map.xml
new file mode 100644
index 0000000000..2f6ffcd450
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_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
new file mode 100644
index 0000000000..90d3763d9c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Objektinformationen anzeigen" name="show_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"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_parcel.xml b/indra/newview/skins/default/xui/de/menu_url_parcel.xml
new file mode 100644
index 0000000000..9169bca24f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_slapp.xml b/indra/newview/skins/default/xui/de/menu_url_slapp.xml
new file mode 100644
index 0000000000..72e916b902
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Diesen Befehl ausführen" name="run_slapp"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_slurl.xml b/indra/newview/skins/default/xui/de/menu_url_slurl.xml
new file mode 100644
index 0000000000..5d48230ebf
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_teleport.xml b/indra/newview/skins/default/xui/de/menu_url_teleport.xml
new file mode 100644
index 0000000000..4cc1ecc70e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="An diesen Standort teleportieren" name="teleport"/>
+ <menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
+ <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 62cd982875..a04532376c 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,219 +1,416 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Datei" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Hochladen" name="upload">
- <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Standard-Berechtigungen einstellen..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Fenster schließen" name="Close Window"/>
- <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Textur speichern unter..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Foto machen" name="Take Snapshot"/>
- <menu_item_call label="Foto auf Datenträger" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Beenden" name="Quit"/>
- </menu>
- <menu label="Bearbeiten" name="Edit">
- <menu_item_call label="Rückgängig" name="Undo"/>
- <menu_item_call label="Wiederherstellen" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Suchen..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
- <menu_item_call label="Auswahl aufheben" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplizieren" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Objekt anhängen" name="Attach Object"/>
- <menu label="Objekt abnehmen" name="Detach Object"/>
- <menu label="Kleider ausziehen" name="Take Off Clothing">
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Hose" name="Pants"/>
- <menu_item_call label="Schuhe" name="Shoes"/>
- <menu_item_call label="Socken" name="Socks"/>
- <menu_item_call label="Jacke" name="Jacket"/>
- <menu_item_call label="Handschuhe" name="Gloves"/>
- <menu_item_call label="Unterhemd" name="Menu Undershirt"/>
- <menu_item_call label="Unterhose" name="Menu Underpants"/>
- <menu_item_call label="Rock" name="Skirt"/>
- <menu_item_call label="Alle Kleider" name="All Clothes"/>
+ <menu label="Ich" name="Me">
+ <menu_item_call label="Einstellungen" name="Preferences"/>
+ <menu_item_call label="Meine Startseite" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
+ </menu_item_call>
+ <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
+ <menu_item_call label="Mein Profil" name="Profile"/>
+ <menu_item_call label="Mein Aussehen" name="Appearance"/>
+ <menu_item_check label="Mein Inventar" name="Inventory"/>
+ <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Meine Gesten" name="Gestures"/>
+ <menu label="Mein Status" name="Status">
+ <menu_item_call label="Abwesend" name="Set Away"/>
+ <menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gesten..." name="Gestures..."/>
- <menu_item_call label="Profil..." name="Profile..."/>
- <menu_item_call label="Aussehen..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Freunde..." name="Friends..."/>
- <menu_item_call label="Gruppen..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Einstellungen..." name="Preferences..."/>
+ <menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/>
+ <menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/>
+ <menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
- <menu label="Ansicht" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Mouselook" name="Mouselook"/>
- <menu_item_check label="Bauen" name="Build"/>
- <menu_item_check label="Joystick-Flycam" name="Joystick Flycam"/>
- <menu_item_call label="Ansicht zurücksetzen" name="Reset View"/>
- <menu_item_call label="Letzten Chatter ansehen" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Symbolleiste" name="Toolbar"/>
- <menu_item_check label="Lokaler Chat" name="Chat History"/>
- <menu_item_check label="Unterhalten" name="Instant Message"/>
- <menu_item_check label="Inventar" name="Inventory"/>
- <menu_item_check label="Aktive Sprecher" name="Active Speakers"/>
- <menu_item_check label="Stummschalten-Liste" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Kamerasteuerung" name="Camera Controls"/>
- <menu_item_check label="Bewegungssteuerung" name="Movement Controls"/>
- <menu_item_check label="Weltkarte" name="World Map"/>
- <menu_item_check label="Minikarte" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Statistikleiste" name="Statistics Bar"/>
- <menu_item_check label="Grundstücksgrenzen" name="Property Lines"/>
- <menu_item_check label="Absperrungen" name="Banlines"/>
- <menu_item_check label="Landeigentümer" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Schwebe-Tipps" name="Hover Tips">
- <menu_item_check label="Tipps anzeigen" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Landtipps" name="Land Tips"/>
- <menu_item_check label="Tipps zu allen Objekten" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Durchsichtig hervorheben" name="Highlight Transparent"/>
- <menu_item_check label="Beacons" name="beacons"/>
- <menu_item_check label="Partikel ausblenden" name="Hide Particles"/>
- <menu_item_check label="HUD-Anhänge anzeigen" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Hinein zoomen" name="Zoom In"/>
- <menu_item_call label="Zoom-Standard" name="Zoom Default"/>
- <menu_item_call label="Wegzoomen" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Vollbild" name="Toggle Fullscreen"/>
- <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
+ <menu label="Unterhalten" name="Communicate">
+ <menu_item_call label="Meine Freunde" name="My Friends"/>
+ <menu_item_call label="Meine Gruppen" name="My Groups"/>
+ <menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
+ <menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
</menu>
<menu label="Welt" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Immer rennen" name="Always Run"/>
- <menu_item_check label="Fliegen" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Landmarke hier setzen" name="Create Landmark Here"/>
- <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
+ <menu_item_check label="Minikarte" name="Mini-Map"/>
+ <menu_item_check label="Karte" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
+ <menu label="Ortsprofil" name="Land">
+ <menu_item_call label="Land-Info" name="About Land"/>
+ <menu_item_call label="Region/Grundstück" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="Dieses Land kaufen" name="Buy Land"/>
+ <menu_item_call label="Mein Land" name="My Land"/>
+ <menu label="Anzeigen" name="LandShow">
+ <menu_item_check label="Bewegungssteuerung" name="Movement Controls"/>
+ <menu_item_check label="Ansichtsteuerung" name="Camera Controls"/>
+ <menu_item_check label="Bannlinien" name="Ban Lines"/>
+ <menu_item_check label="Strahlen" name="beacons"/>
+ <menu_item_check label="Grundstücksgrenzen" name="Property Lines"/>
+ <menu_item_check label="Landeigentümer" name="Land Owners"/>
+ </menu>
<menu_item_call label="Teleport nach Hause" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Als abwesend anzeigen" name="Set Away"/>
- <menu_item_call label="Als beschäftigt anzeigen" name="Set Busy"/>
- <menu_item_call label="Avatar nicht mehr animieren" name="Stop Animating My Avatar"/>
- <menu_item_call label="Tasten freigeben" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Kontostatistik..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=de"/>
- </menu_item_call>
- <menu_item_call label="Mein Konto verwalten..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
- </menu_item_call>
- <menu_item_call label="L$ kaufen..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mein Land..." name="My Land..."/>
- <menu_item_call label="Land-Info..." name="About Land..."/>
- <menu_item_call label="Land kaufen..." name="Buy Land..."/>
- <menu_item_call label="Region/Grundstück..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Umwelt-Einstellungen" name="Environment Settings">
+ <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
+ <menu label="Sonne" name="Environment Settings">
<menu_item_call label="Sonnenaufgang" name="Sunrise"/>
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
- <menu_item_call label="Auf Regionsstandard zurücksetzen" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Grundstückszeit" name="Revert to Region Default"/>
<menu_item_call label="Umwelt-Editor" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Werkzeug" name="Tools">
- <menu label="Fehlermeldungen" name="Select Tool">
+ <menu label="Bauen" name="BuildTools">
+ <menu_item_check label="Bauen" name="Show Build Tools"/>
+ <menu label="Bauwerkzeug auswählen" name="Select Tool">
<menu_item_call label="Fokus" name="Focus"/>
<menu_item_call label="Verschieben" name="Move"/>
<menu_item_call label="Bearbeiten" name="Edit"/>
<menu_item_call label="Erstellen" name="Create"/>
<menu_item_call label="Land" name="Land"/>
</menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/>
- <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/>
- <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/>
- <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/>
- <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/>
- <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/>
- <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/>
- <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/>
- <menu_item_call label="Rasteroptionen..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/>
+ <menu label="Bearbeiten" name="Edit">
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederherstellen" name="Redo"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Duplizieren" name="Duplicate"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+ <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+ </menu>
<menu_item_call label="Verknüpfung" name="Link"/>
- <menu_item_call label="Verknüpfung aufheben" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
+ <menu_item_call label="Verknüpfung auflösen" name="Unlink"/>
+ <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/>
<menu_item_call label="Fokus auf Auswahl" name="Focus on Selection"/>
<menu_item_call label="Auf Auswahl zoomen" name="Zoom to Selection"/>
- <menu_item_call label="Objekt kaufen" name="Menu Object Take">
- <on_enable userdata="Kaufen,Nehmen" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Kopie nehmen/machen" name="Take Copy"/>
- <menu_item_call label="Objekt wieder in Objektinhalt speichern" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Skriptwarnung/Fehlerfenster anzeigen" name="Show Script Warning/Error Window"/>
- <menu label="Skripte in Auswahl neu kompilieren" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Skripte in Auswahl zurücksetzen" name="Reset Scripts in Selection"/>
- <menu_item_call label="Skripte in Auswahl so einstellen, dass sie ausgeführt werden" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Skripte in Auswahl so einstellen, dass sie nicht ausgeführt werden" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Objekt" name="Object">
+ <menu_item_call label="Kaufen" name="Menu Object Take"/>
+ <menu_item_call label="Kopie nehmen" name="Take Copy"/>
+ <menu_item_call label="Objekt wieder in meinem Inventar speichern" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Wieder in Objektinhalt speichern" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Skripts" name="Scripts">
+ <menu_item_call label="Skripts rekompilieren (Mono)" name="Mono"/>
+ <menu_item_call label="Skripts rekompilieren (LSL)" name="LSL"/>
+ <menu_item_call label="Skripts zurücksetzen" name="Reset Scripts"/>
+ <menu_item_call label="Skripts auf ausführen einstellen" name="Set Scripts to Running"/>
+ <menu_item_call label="Skripts auf nicht ausführen einstellen" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Optionen" name="Options">
+ <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
+ <menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/>
+ <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/>
+ <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/>
+ <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/>
+ <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/>
+ <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/>
+ <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/>
+ <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/>
+ <menu_item_call label="Rasteroptionen" name="Grid Options"/>
+ </menu>
+ <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts">
+ <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/>
+ <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/>
+ <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/>
+ <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Hilfe" name="Help">
- <menu_item_call label="Hilfe zu [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Offizielles Linden-Blog..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Scripting-Portal..." name="Scripting Portal...">
- <on_click name="ScriptingPortal_url" userdata="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal/de" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Missbrauch melden..." name="Report Abuse..."/>
- <menu_item_call label="Rempler, Stöße und Schläge..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Lag-Anzeige" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Fehlermeldungen" name="Bug Reporting">
- <menu_item_call label="Allgemeiner Probleme-Tracker..." name="Public Issue Tracker..."/>
- <menu_item_call label="Hilfe zum Allgemeinen Probleme-Tracker..." name="Publc Issue Tracker Help...">
- <on_click name="PublicIssueTrackerHelp_url" userdata="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker/de" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Fehlermeldungs-1x1..." name="Bug Reporing 101...">
- <on_click name="BugReporting101_url" userdata="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101/de"/>
- </menu_item_call>
- <menu_item_call label="Sicherheitsfragen..." name="Security Issues...">
- <on_click name="SecurityIssues_url" userdata="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues/de"/>
- </menu_item_call>
- <menu_item_call label="QA-Wiki..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Fehler melden..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Über [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
+ <menu_item_call label="Missbrauch melden" name="Report Abuse"/>
+ <menu_item_call label="Fehler melden" name="Report Bug"/>
+ <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Erweitert" name="Advanced">
+ <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Textur neu laden" name="Rebake Texture"/>
+ <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
+ <menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
+ <menu_item_check label="Auswahldistanz einschränken" name="Limit Select Distance"/>
+ <menu_item_check label="Kamerabeschränkungen deaktivieren" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto (hohe Auflösung)" name="HighResSnapshot"/>
+ <menu_item_check label="Fotos auf Festplatte leise speichern" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Fotos auf Festplatte komprimieren" name="CompressSnapshotsToDisk"/>
+ <menu label="Performance Tools" name="Performance Tools">
+ <menu_item_call label="Lag-Anzeige" name="Lag Meter"/>
+ <menu_item_check label="Statistikleiste" name="Statistics Bar"/>
+ <menu_item_check label="Avatar-Darstellungskosten anzeigen" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Hervorhebung und Sichtbarkeit" name="Highlighting and Visibility">
+ <menu_item_check label="Pulsierender Strahl" name="Cheesy Beacon"/>
+ <menu_item_check label="Partikel ausblenden" name="Hide Particles"/>
+ <menu_item_check label="Auswahl ausblenden" name="Hide Selected"/>
+ <menu_item_check label="Durchsichtig hervorheben" name="Highlight Transparent"/>
+ <menu_item_check label="HUD-Anhänge anzeigen" name="Show HUD Attachments"/>
+ <menu_item_check label="Fadenkreuz für Mouselook anzeigen" name="ShowCrosshairs"/>
+ <menu_item_check label="Land-Kurzinfos anzeigen" name="Land Tips"/>
+ </menu>
+ <menu label="Darstellungstypen" name="Rendering Types">
+ <menu_item_check label="Einfach" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Baum" name="Tree"/>
+ <menu_item_check label="Avatare" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Himmel" name="Sky"/>
+ <menu_item_check label="Wasser" name="Water"/>
+ <menu_item_check label="Boden" name="Ground"/>
+ <menu_item_check label="Volumen" name="Volume"/>
+ <menu_item_check label="Gras" name="Grass"/>
+ <menu_item_check label="Wolken" name="Clouds"/>
+ <menu_item_check label="Partikel" name="Particles"/>
+ <menu_item_check label="Unebenheiten" name="Bump"/>
+ </menu>
+ <menu label="Rederning-Eigenschaften" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Ausgewählt" name="Selected"/>
+ <menu_item_check label="Farblich hervorgehoben" name="Highlighted"/>
+ <menu_item_check label="Dynamische Texturen" name="Dynamic Textures"/>
+ <menu_item_check label="Fußschatten" name="Foot Shadows"/>
+ <menu_item_check label="Nebel" name="Fog"/>
+ <menu_item_check label="FRInfo testen" name="Test FRInfo"/>
+ <menu_item_check label="Flexible Objekte" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Mehrer Threads ausführen" name="Run Multiple Threads"/>
+ <menu_item_call label="Gruppen-Cache löschen" name="ClearGroupCache"/>
+ <menu_item_check label="Weiche Mausbewegung" name="Mouse Smoothing"/>
+ <menu label="Tastaturkürzel" name="Shortcuts">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
+ <menu_item_check label="Suchen" name="Search"/>
+ <menu_item_call label="Tasten freigeben" name="Release Keys"/>
+ <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
+ <menu_item_check label="Immer rennen" name="Always Run"/>
+ <menu_item_check label="Fliegen" name="Fly"/>
+ <menu_item_call label="Fenster schließen" name="Close Window"/>
+ <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
+ <menu_item_call label="Foto auf Datenträger" name="Snapshot to Disk"/>
+ <menu_item_call label="Mouselook" name="Mouselook"/>
+ <menu_item_check label="Joystick-Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Ansicht zurücksetzen" name="Reset View"/>
+ <menu_item_call label="Letzten Chatter ansehen" name="Look at Last Chatter"/>
+ <menu label="Bauwerkzeug auswählen" name="Select Tool">
+ <menu_item_call label="Fokus-Werkzeug" name="Focus"/>
+ <menu_item_call label="Werkzeug „Bewegen“" name="Move"/>
+ <menu_item_call label="Bearbeiten" name="Edit"/>
+ <menu_item_call label="Werkzeug „Erstellen&quot;" name="Create"/>
+ <menu_item_call label="Land-Werkzeug" name="Land"/>
+ </menu>
+ <menu_item_call label="Hineinzoomen" name="Zoom In"/>
+ <menu_item_call label="Zoom-Standard" name="Zoom Default"/>
+ <menu_item_call label="Wegzoomen" name="Zoom Out"/>
+ <menu_item_call label="Vollbild" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
+ <menu_item_check label="Menü „Entwickler“ anzeigen" name="Debug Mode"/>
+ </menu>
+ <menu label="Entwickler" name="Develop">
+ <menu label="Konsolen" name="Consoles">
+ <menu_item_check label="Textur" name="Texture Console"/>
+ <menu_item_check label="Fehler beseitigen" name="Debug Console"/>
+ <menu_item_call label="Meldungen" name="Notifications"/>
+ <menu_item_check label="Texturgröße" name="Texture Size"/>
+ <menu_item_check label="Texture-Kategorie" name="Texture Category"/>
+ <menu_item_check label="Schnelle Timer" name="Fast Timers"/>
+ <menu_item_check label="Speicher" name="Memory"/>
+ <menu_item_call label="Info zu Region in Fenster Fehler beseitigen" name="Region Info to Debug Console"/>
+ <menu_item_call label="Gruppeninfo in Fenster Fehler beseitigen" name="Group Info to Debug Console"/>
+ <menu_item_call label="Info zu Fähigkeiten in Fenster Fehler beseitigen" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Kamera" name="Camera"/>
+ <menu_item_check label="Wind" name="Wind"/>
+ <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="Gütesiegel" name="Badge"/>
+ </menu>
+ <menu label="Info anzeigen" name="Display Info">
+ <menu_item_check label="Zeit anzeigen" name="Show Time"/>
+ <menu_item_check label="Render-Info anzeigen" name="Show Render Info"/>
+ <menu_item_check label="Matrizen anzeigen" name="Show Matrices"/>
+ <menu_item_check label="Farbe unter Cursor anzeigen" name="Show Color Under Cursor"/>
+ <menu_item_check label="Akutalisierungen an Objekten anzeigen" name="Show Updates"/>
+ </menu>
+ <menu label="Fehler erzwingen" name="Force Errors">
+ <menu_item_call label="Haltepunkt erzwingen" name="Force Breakpoint"/>
+ <menu_item_call label="LLError erzwingen und abstürzen" name="Force LLError And Crash"/>
+ <menu_item_call label="Erzwinge fehlerhaften Speicherzugriff" name="Force Bad Memory Access"/>
+ <menu_item_call label="Endlosschleife erzwingen" name="Force Infinite Loop"/>
+ <menu_item_call label="Treiber-Crash erzwingen" name="Force Driver Carsh"/>
+ <menu_item_call label="Softwareausnahme erzwingen" name="Force Software Exception"/>
+ <menu_item_call label="Verbindungsabbruch erzwingen" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Speicherverlust simulieren" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render-Tests" name="Render Tests">
+ <menu_item_check label="Kamera-Versatz" name="Camera Offset"/>
+ <menu_item_check label="Framerate randomisieren" name="Randomize Framerate"/>
+ <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
+ <menu_item_check label="Frame-Test" name="Frame Test"/>
+ </menu>
+ <menu label="Metadaten darstellen" name="Render Metadata">
+ <menu_item_check label="Bonding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Octree" name="Octree"/>
+ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Okklusion" name="Occlusion"/>
+ <menu_item_check label="Bündel rendern" name="Render Batches"/>
+ <menu_item_check label="Texture-Anim" name="Texture Anim"/>
+ <menu_item_check label="Textur-Priorität" name="Texture Priority"/>
+ <menu_item_check label="Texturbereich" name="Texture Area"/>
+ <menu_item_check label="Oberflächenbereich" name="Face Area"/>
+ <menu_item_check label="Lichter" name="Lights"/>
+ <menu_item_check label="Gelenkpunkte" name="Collision Skeleton"/>
+ <menu_item_check label="Raycast" name="Raycast"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Achsen" name="Axes"/>
+ <menu_item_check label="Tangentenbasis" name="Tangent Basis"/>
+ <menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/>
+ <menu_item_check label="Framebuffer-Objekte" name="Framebuffer Objects"/>
+ <menu_item_check label="Deferred Rendering" name="Deferred Rendering"/>
+ <menu_item_check label="Globale Beleuchtung" name="Global Illumination"/>
+ <menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/>
+ <menu_item_check label="Fehler in Pipeline beseitigen" name="Debug Pipeline"/>
+ <menu_item_check label="Schnelles Alpha" name="Fast Alpha"/>
+ <menu_item_check label="Animationstexturen" name="Animation Textures"/>
+ <menu_item_check label="Texturen deaktivieren" name="Disable Textures"/>
+ <menu_item_check label="Voll-Res-Texturen" name="Rull Res Textures"/>
+ <menu_item_check label="Texturen prüfen" name="Audit Textures"/>
+ <menu_item_check label="Textur-Atlas" name="Texture Atlas"/>
+ <menu_item_check label="Angehängte Lichter rendern" name="Render Attached Lights"/>
+ <menu_item_check label="Angehängte Partikel rendern" name="Render Attached Particles"/>
+ <menu_item_check label="Leucht-Objekte schweben lassen" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Netzwerk" name="Network">
+ <menu_item_check label="Agent pausieren" name="AgentPause"/>
+ <menu_item_call label="Meldungsprotokoll aktivieren" name="Enable Message Log"/>
+ <menu_item_call label="Meldungsprotokoll deaktivieren" name="Disable Message Log"/>
+ <menu_item_check label="Objektposition laut Geschwindigkeit interpolieren" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Positionen der interpolierten Objekte anfragen" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Ein Paket fallenlassen" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>
+ <menu_item_call label="Rempler, Stöße &amp; Schläge" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Rekorder" name="Recorder">
+ <menu_item_call label="Wiedergabe starten" name="Start Playback"/>
+ <menu_item_call label="Wiedergabe stoppen" name="Stop Playback"/>
+ <menu_item_check label="Wiedergabeschleife" name="Loop Playback"/>
+ <menu_item_call label="Aufnahme starten" name="Start Record"/>
+ <menu_item_call label="Aufnahme stoppen" name="Stop Record"/>
+ </menu>
+ <menu label="Welt" name="World">
+ <menu_item_check label="Sonnen-Override für Sim" name="Sim Sun Override"/>
+ <menu_item_check label="Pulsierender Strahl" name="Cheesy Beacon"/>
+ <menu_item_check label="Festgelegtes Wetter" name="Fixed Weather"/>
+ <menu_item_call label="Regionsobjekt-Cache ausgeben" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
+ <menu_item_call label="SelectMgr ausgeben" name="Dump SelectMgr"/>
+ <menu_item_call label="Inventarinfo ausgeben" name="Dump Inventory"/>
+ <menu_item_call label="Timer ausgeben" name="Dump Timers"/>
+ <menu_item_call label="Fokus ausgeben" name="Dump Focus Holder"/>
+ <menu_item_call label="Ausgewählte Objektinfo drucken" name="Print Selected Object Info"/>
+ <menu_item_call label="Agent-Info drucken" name="Print Agent Info"/>
+ <menu_item_call label="Speicher-Stats" name="Memory Stats"/>
+ <menu_item_check label="Double-ClickAuto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Fehler in SelectMgr beseitigen" name="Debug SelectMgr"/>
+ <menu_item_check label="Fehler in Klicks beseitigen" name="Debug Clicks"/>
+ <menu_item_check label="Debug-Ansichten" name="Debug Views"/>
+ <menu_item_check label="Kurzinfos: Debug-Namen" name="Debug Name Tooltips"/>
+ <menu_item_check label="Fehler in Maus-Events beseitigen" name="Debug Mouse Events"/>
+ <menu_item_check label="Fehler in Keys beseitigen" name="Debug Keys"/>
+ <menu_item_check label="Fehler in WindowProc beseitigen" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Farbeinstellungen neu laden" name="Reload Color Settings"/>
+ <menu_item_call label="Schriftarttest anzeigen" name="Show Font Test"/>
+ <menu_item_call label="Von XML laden" name="Load from XML"/>
+ <menu_item_call label="Als XML speichern" name="Save to XML"/>
+ <menu_item_check label="XUI-Namen anzeigen" name="Show XUI Names"/>
+ <menu_item_call label="Test-IMs senden" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Geladene Textur nehmen" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Kopf" name="Head"/>
+ <menu_item_call label="Oberkörper" name="Upper Body"/>
+ <menu_item_call label="Unterkörper" name="Lower Body"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ </menu>
+ <menu label="Avatar-Tests" name="Character Tests">
+ <menu_item_call label="Aussehen als XML speichern" name="Appearance To XML"/>
+ <menu_item_call label="Avatargeometry ein-/ausschalten" name="Toggle Character Geometry"/>
+ <menu_item_call label="Männlich testen" name="Test Male"/>
+ <menu_item_call label="Weiblich testen" name="Test Female"/>
+ <menu_item_call label="PG ein-/ausschalten" name="Toggle PG"/>
+ <menu_item_check label="Avatarauswahl zulassen" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Param auf Standard erzwingen" name="Force Params to Default"/>
+ <menu_item_check label="Animations-Info" name="Animation Info"/>
+ <menu_item_check label="Zeitlupen-Animationen" name="Slow Motion Animations"/>
+ <menu_item_check label="Kamerafokus anzeigen" name="Show Look At"/>
+ <menu_item_check label="Klickpunkt anzeigen??" name="Show Point At"/>
+ <menu_item_check label="Fehler in Landaktualisierung beseitigen" name="Debug Joint Updates"/>
+ <menu_item_check label="LOD deaktiveren" name="Disable LOD"/>
+ <menu_item_check label="Fehler für sichtbare Agenten beseitigen" name="Debug Character Vis"/>
+ <menu_item_check label="Gelenkpunkte anzeigen" name="Show Collision Skeleton"/>
+ <menu_item_check label="Agent-Ziel anzeigen" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Anhänge ausgeben" name="Dump Attachments"/>
+ <menu_item_call label="Fehler in Avatar-Texturen beseitigen" name="Debug Avatar Textures"/>
+ <menu_item_call label="Lokale Texturen ausgeben" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP-Texturen" name="HTTP Textures"/>
+ <menu_item_call label="Bilder komprimieren" name="Compress Images"/>
+ <menu_item_check label="Ausgabe Fehlerbeseitigung ausgeben" name="Output Debug Minidump"/>
+ <menu_item_check label="Bei nächster Ausführung Fenster öffnen" name="Console Window"/>
+ <menu_item_check label="Admin-Menü anzeigen" name="View Admin Options"/>
+ <menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/>
+ <menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Kopie nehmen" name="Take Copy"/>
+ <menu_item_call label="Besitzer zu mir zwingen" name="Force Owner To Me"/>
+ <menu_item_call label="Erlaubnis des Besitzers erzwingen" name="Force Owner Permissive"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Fest" name="Lock"/>
+ <menu_item_call label="Asset-ID zulassen" name="Get Assets IDs"/>
+ </menu>
+ <menu label="Parzelle" name="Parcel">
+ <menu_item_call label="Besitzer zu mir zwingen" name="Owner To Me"/>
+ <menu_item_call label="Auf Linden-Inhalt festlegen" name="Set to Linden Content"/>
+ <menu_item_call label="Öffentiches Land in Besitz nehmen" name="Claim Public Land"/>
+ </menu>
+ <menu label="Region" name="Region">
+ <menu_item_call label="Temp-Asset-Daten ausgeben" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Regions-Status speichern" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Gott-Werkzeuge" name="God Tools"/>
+ </menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Objekt anhängen" name="Attach Object"/>
+ <menu label="Objekt abnehmen" name="Detach Object"/>
+ <menu label="Kleider ausziehen" name="Take Off Clothing">
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Socken" name="Socks"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Unterhemd" name="Menu Undershirt"/>
+ <menu_item_call label="Unterhose" name="Menu Underpants"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Alpha" name="Alpha"/>
+ <menu_item_call label="Tätowierung" name="Tattoo"/>
+ <menu_item_call label="Alle Kleider" name="All Clothes"/>
+ </menu>
+ <menu label="Hilfe" name="Help">
+ <menu_item_call label="Offizielles Linden-Blog" name="Official Linden Blog"/>
+ <menu_item_call label="Scripting-Portal" name="Scripting Portal"/>
+ <menu label="Fehlermeldungen" name="Bug Reporting">
+ <menu_item_call label="Allgemeine Probleme-Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Hilfe zum Allgemeinen Probleme-Tracker" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Fehlermeldungs-1x1" name="Bug Reporing 101"/>
+ <menu_item_call label="Sicherheitsfragen" name="Security Issues"/>
+ <menu_item_call label="QA-Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/de/mime_types_linux.xml b/indra/newview/skins/default/xui/de/mime_types_linux.xml
new file mode 100644
index 0000000000..e4b5c53292
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Webinhalt
+ </label>
+ <tooltip name="web_tooltip">
+ Dieser Ort verfügt über Webinhalte
+ </tooltip>
+ <playtip name="web_playtip">
+ Webinhalt anzeigen
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Video
+ </label>
+ <tooltip name="movie_tooltip">
+ Ein Video wurde gefunden.
+ </tooltip>
+ <playtip name="movie_playtip">
+ Video wiedergeben
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Bild
+ </label>
+ <tooltip name="image_tooltip">
+ Dieser Ort verfügt über Bildinhalte
+ </tooltip>
+ <playtip name="image_playtip">
+ Das Bild an diesem Ort anzeigen
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Dieser Ort verfügt über Audioinhalte
+ </tooltip>
+ <playtip name="audio_playtip">
+ Das Audio dieses Standorts abspielen
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Echtzeit-Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Keine -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Keine -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Bild
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF-Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript-Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Webseite (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Bild (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Bild (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Bild (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Bild (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Bild (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Bild (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Webseite
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Video (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Video (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Video (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Video (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Video (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/de/mime_types_mac.xml b/indra/newview/skins/default/xui/de/mime_types_mac.xml
new file mode 100644
index 0000000000..e4b5c53292
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Webinhalt
+ </label>
+ <tooltip name="web_tooltip">
+ Dieser Ort verfügt über Webinhalte
+ </tooltip>
+ <playtip name="web_playtip">
+ Webinhalt anzeigen
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Video
+ </label>
+ <tooltip name="movie_tooltip">
+ Ein Video wurde gefunden.
+ </tooltip>
+ <playtip name="movie_playtip">
+ Video wiedergeben
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Bild
+ </label>
+ <tooltip name="image_tooltip">
+ Dieser Ort verfügt über Bildinhalte
+ </tooltip>
+ <playtip name="image_playtip">
+ Das Bild an diesem Ort anzeigen
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Dieser Ort verfügt über Audioinhalte
+ </tooltip>
+ <playtip name="audio_playtip">
+ Das Audio dieses Standorts abspielen
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Echtzeit-Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Keine -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Keine -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Bild
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF-Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript-Dokument
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Webseite (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Bild (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Bild (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Bild (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Bild (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Bild (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Bild (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Webseite
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Video (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Video (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Video (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Video (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Video (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index ebe2d9b260..da4a96962e 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -9,74 +9,45 @@
<global name="implicitclosebutton">
Schließen
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert">
- Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen.
-
-Fehlerdetails: Der Warnhinweis „[_NAME]“ wurde in notifications.xml nicht gefunden.
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Unbekannte Meldung" name="MissingAlert">
+ Ihre Version von [APP_NAME] kann die gerade empfangene Benachrichtigung nicht anzeigen. Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben.
+
+Fehlerdetails: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,13 +68,13 @@ Fehlerdetails: Der Warnhinweis „[_NAME]“ wurde in notifications.xml nicht ge
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
</notification>
<notification name="BadInstallation">
- Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von secondlife.com herunter.
+ Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte [http://get.secondlife.com laden Sie die aktuellste Version des Viewers herunter].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden.
-„[DIAGNOSTIC]“
-Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden.
+&apos;[DIAGNOSTIC]&apos;
+Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -134,13 +105,17 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
Änderung an Kleidung/Körperteilen speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben.
+ <usetemplate name="okbutton" yestext="Ja"/>
+ </notification>
<notification name="GrantModifyRights">
- Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
-Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren?
+ Wenn Sie einem anderen Einwohner, das die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren!
+Möchten Sie [FIRST_NAME] [LAST_NAME] die Erlaubnis zum Bearbeiten gewähren?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
+ Wenn Sie einem anderen Einwohner, die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren!
Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
@@ -171,7 +146,7 @@ Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren?
Diese Rolle kann Mitgliedern nicht mehr entzogen werden.
Sie müssen die Rolle selbst niederlegen.
Möchten Sie fortfahren?
- <usetemplate ignoretext="Beim Hinzufügen von Gruppenmitgliedern zur Eigentümerrolle" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="AssignDangerousActionWarning">
Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen.
@@ -197,62 +172,31 @@ Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Auswahl von „In Suche veröffentlichen“
-Dieses Kontrollkästchen zeigt Folgendes an:
-- diese Parzelle in den Suchergebnissen
-- die öffentlichen Objekte dieser Parzelle
-- diese Parzelle in der Websuche
- </notification>
- <notification name="ClickSoundHelpLand">
- Medien und Musik können nur innerhalb der Parzelle abgespielt werden. Sound- und Voice-Chat-Optionen können auf die Parzelle beschränkt werden oder von Einwohnern außerhalb der Parzelle, entsprechend ihrer Alterseinstufung, gehört werden. Möchten Sie unsere Knowledgebase besuchen, um mehr darüber zu erfahren, wie diese Optionen eingestellt werden können?
- <url name="url">
- http://wiki.secondlife.com/wiki/Medien_auf_Parzellen_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="Schließen" yestext="Zur Knowledgbase"/>
- </notification>
- <notification name="ClickSearchHelpAll">
- Die Suchergebnisse wurde aufgrund der entsprechenden Registerkarte, Ihrer Alterseinstufung, der gewählten Kategorie und anderen Faktoren geordnet. Bitte besuchen Sie unsere Knowledgebase, um weitere Informationen zu erhalten.
- <url name="url">
- http://wiki.secondlife.com/wiki/FAQ_zur_Suchfunktion_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="Schließen" yestext="Zur Knowledgbase"/>
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Diese Parzelle kann nicht in der Suche angezeigt werden, da sie sich in einer Region befindet, die das verbietet.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Auswahl von „In Suche anzeigen“ zeigt Folgendes an:
-- Ihr Profil in den Suchergebnissen
-- einen Link auf Ihr Profil in den öffentlichen Gruppenseiten
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Auf der [SECOND_LIFE] Website können Sie anderen Einwohnern eine Partnerschaft vorschlagen und bestehende Partnerschaften lösen.
-
-Die [SECOND_LIFE] Website für weitere Informationen über Partnerschaften öffnen?
- <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Gehe zu Seite"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Ihre Standardberechtigung funktionieren in älteren Regionen möglicherweise nicht.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Wenn dieser Einwohner einen Webprofil-URL angegeben hat, können Sie:
- * Auf „Laden“ klicken und die Seite in dieser Web-Registerkarte anzeigen.
- * Auf Laden &gt; „In externem Browser“ klicken und die Seite im Standard-Browser anzeigen.
- * Auf Laden &gt; „Start-URL“ klicken und zum Webprofil des Bewohners zurückkehren.
-
-In Ihrem eigenen Profil können Sie jeden beliebigen URL als Ihr Webprofil eingeben und mit OK übernehmen.
-Wenn sich andere Einwohner Ihr Profil ansehen, können sie diesen URL besuchen.
+ <notification name="AttachmentDrop">
+ Sie möchten Ihren Anhang wirklich fallen lassen?
+Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bestätigen, bevor Anhänge fallen gelassen werden" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="JoinGroupCanAfford">
Der Beitritt zu dieser Gruppe kostet [COST] L$.
Fortfahren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Sie treten der Gruppe [NAME] bei.
+Fortfahren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Zusammenlegen"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Der Beitritt zu dieser Gruppe kostet [COST] L$.
Sie haben nicht genug L$, um dieser Gruppe beizutreten.
</notification>
+ <notification name="CreateGroupCost">
+ Die Gründung dieser Gruppe kostet 100 L$.
+Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht.
+Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein.
+ <usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/>
+ </notification>
<notification name="LandBuyPass">
Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$
[TIME] Stunden lang betreten. Pass kaufen?
@@ -268,9 +212,9 @@ Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ACHTUNG: Wenn Sie auf „An jeden verkaufen“ klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen.
+ ACHTUNG: Wenn Sie auf An jeden verkaufen klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen.
-Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
+Die ausgewählten [LAND_SIZE] m² Land werden zum Verkauf freigegeben.
Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -331,6 +275,12 @@ Objekte: [N]
Für die gesamte Region ist Schaden aktiviert.
Damit Waffen funktionieren, müssen Skripts erlaubt sein.
</notification>
+ <notification name="MultipleFacesSelected">
+ Mehrere Flächen wurden ausgewählt.
+Wenn Sie fortfahren werden auf mehrere Flächen des Objekts unterschiedlichen Medien-Instanzen eingefügt.
+Um Medien nur auf einer Fläche einzufügen, wählen Sie „Oberfläche auswählen&quot; und klicken Sie auf die gewünschte Fläche des Objektes. Klicken Sie dann auf „Hinzufügen&quot;.
+ <usetemplate ignoretext="Die Medien werden auf mehrere ausgewählte Seiten übertragen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen.
</notification>
@@ -366,6 +316,10 @@ Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge.
<notification name="CannotWearTrash">
Kleider oder Körperteile im Papierkorb können nicht getragen werden
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Objekt konnte nicht angehängt werden.
+Überschreitet die maximale Anzahl an Objekten [MAX_ATTACHMENTS], die angehängt werden können. Bitte nehmen Sie zunächst ein anderes Objekt ab.
+ </notification>
<notification name="CannotWearInfoNotComplete">
Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal.
</notification>
@@ -374,27 +328,45 @@ Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge.
Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein.
Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=de-DE
+ </url>
<usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/>
</notification>
<notification name="AddClassified">
- Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf „Veröffentlichen...“, um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf „Veröffentlichen“ klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.
- <usetemplate ignoretext="Beim Hinzufügen einer neuen Anzeige" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen&quot; und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt.
+Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
+Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
+Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.
+ <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Anzeige „[NAME]“ löschen?
Gebühren werden nicht rückerstattet.
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Sie haben sich entschieden, die Medien auf dieser Seite zu löschen.
+Sind Sie sicher, dass Sie fortfahren wollen?
+ <usetemplate ignoretext="Bestätigen, bevor ich Medien von einem Objekt entferne." name="okcancelignore" notext="Nein" yestext="Ja"/>
+ </notification>
<notification name="ClassifiedSave">
Änderung an Anzeige [NAME] speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Sie haben nicht genügend Geld, um eine Anzeige zu erstellen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
Auswahl [PICK] löschen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
Zur [SECOND_LIFE] Events-Webseite?
+ <url name="url">
+ http://secondlife.com/events/?lang=de-DE
+ </url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -403,14 +375,6 @@ Gebühren werden nicht rückerstattet.
<notification name="SelectHistoryItemToView">
Wählen Sie ein Element zur Ansicht.
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben?
- <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Möchten Sie alle Popups, die übersprungen werden können, deaktivieren?
- <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
- </notification>
<notification name="CacheWillClear">
Der Cache wird nach einem Neustart von [APP_NAME] geleert.
</notification>
@@ -422,10 +386,13 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam.
</notification>
<notification name="ChangeSkin">
- Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet.
+ Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angezeigt.
</notification>
<notification name="GoToAuctionPage">
Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="SaveChanges">
@@ -470,6 +437,11 @@ Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
<notification name="SaveBytecodeFailReason">
Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später.
</notification>
+ <notification name="StartRegionEmpty">
+ Sie haben keine Start-Region festgelegt.
+Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Zuhause“ als Startposition aus.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde.
Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
@@ -481,30 +453,28 @@ Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
Datei [[FILE]] kann nicht geschrieben werden
</notification>
<notification name="UnsupportedHardware">
- Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Für nicht unterstützte Systemkonfigurationen bieten wir keinen technischen Support.
+ Ihr Computer entspricht leider nicht den Mindestanforderungen von [APP_NAME]. Dies kann zur Folge haben, dass das Programm nicht sehr gut ausgeführt wird. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unser [SUPPORT_SITE] leider nicht helfen.
-MINSPECS
-Die Seite [_URL] für weitere Informationen öffnen?
+MINDESTANF.
+Weitere Informationen finden Sie auf [_URL].
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=de
</url>
- <usetemplate ignoretext="Bei Entdeckung nicht unterstützter Hardware" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="UnknownGPU">
- Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte.
-Dies ist häufig der Fall bei neuer Hardware, die wir noch nicht testen konnten.
-[APP_NAME] funktioniert aller Voraussicht nach normal, möglicherweise müssen Sie aber die Grafikeinstellungen anpassen.
-(Bearbeiten &gt; Einstellungen &gt; Grafik).
+ Ihr System verwendet eine Grafikkarte, die [APP_NAME] nicht erkennt.
+Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. Wahrscheinlich wird das Programm richtig ausgeführt, aber Sie müssen eventuell ein paar Grafikeinstellungen vornehmen.
+(Ich &gt; Einstellungen &gt; Grafik).
<form name="form">
- <ignore name="ignore" text="Bei Entdeckung einer unbekannten Grafikkarte"/>
+ <ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
[APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt.
-Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden.
-Einige Grafikfunktionen werden ausgeschaltet.
+Die Grafikqualität wird auf Niedrig gesetzt, um einige typische Treiberfehler zu vermeiden. Einige Grafikfunktionen werden ausgeschaltet.
Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber.
-Sie können die Grafikqualität unter „Einstellungen“ &gt; „Grafik“ wieder erhöhen.
+Sie können die Grafikqualität unter Einstellungen &gt; Grafik wieder erhöhen.
</notification>
<notification name="RegionNoTerraforming">
Die Region [REGION] erlaubt kein Terraforming.
@@ -555,6 +525,9 @@ Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten
[AVATAR_NAME] aus Ihrem Land werfen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Sie haben [AVATAR_NAME] aus der Gruppe [GROUP_NAME] geworfen.
+ </notification>
<notification name="AcquireErrorTooManyObjects">
FEHLER: Zu viele Objekte ausgewählt.
</notification>
@@ -565,7 +538,10 @@ Verschieben Sie alle betreffenden Objekte in dieselbe Region.
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-[_URL] für Informationen zum Deviseneinkauf öffnen?
+[_URL] für Informationen zum Kauf von L$ öffnen?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=de-DE
+ </url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -651,12 +627,19 @@ Erwartet wurde [VALIDS]
Ausgabedatei konnte nicht erstellt werden: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Der Mehrfach-Upload von Animationsdateien wird zurzeit nicht unterstützt.
+ Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt.
</notification>
<notification name="CannotUploadReason">
Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON]
Bitte versuchen Sie es erneut.
</notification>
+ <notification name="LandmarkCreated">
+ „[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt.
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Sie besitzen für diesen Standort bereits eine Landmarke.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat.
</notification>
@@ -679,6 +662,9 @@ Wählen Sie Objekte mit Skripts.
Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Das Skript im Objekt kann nicht geöffnet werden, da keine Änderungs-Berechtigungen vorliegen.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
„Ausführen“ von Skripts nicht möglich.
@@ -703,16 +689,16 @@ Ihre Suchanfrage: [FINALQUERY]
Es wurde keine Suche durchgeführt.
</notification>
<notification name="CouldNotTeleportReason">
- Teleport fehlgeschlagen.
+ Teleport ist fehlgeschlagen.
[REASON]
</notification>
<notification name="invalid_tport">
- Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter:
-www.secondlife.com/support
+ Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
</notification>
<notification name="invalid_region_handoff">
- Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter:
-www.secondlife.com/support
+ Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
</notification>
<notification name="blocked_tport">
Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
@@ -755,7 +741,8 @@ Keine Parzelle ausgewählt.
Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen?
+ Diese Parzelle steht zur Auktion. Wenn Sie eine Eigentumsübertragung erzwingen, wird die Auktion abgesagt. Wenn die Auktion bereits begonnen hatte, dann werden Sie sich hiermit keine Freunde machen!
+Eigentumsübertragung erzwingen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -783,7 +770,7 @@ Keine Parzelle ausgewählt.
Kann die Region nicht finden, in der sich dieses Land befindet.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat.
+ Das Fenster Land kaufen kann nicht geschlossen werden, bevor [APP_NAME] den Preis für diese Transaktion eingeschätzt hat.
</notification>
<notification name="CannotDeedLandNothingSelected">
Land kann nicht übertragen werden:
@@ -803,14 +790,6 @@ Mehrere Parzellen ausgewählt.
Wählen Sie eine einzelne Parzelle.
</notification>
- <notification name="ParcelCanPlayMedia">
- Dieser Ort kann Streaming-Medien abspielen.
-Streaming-Medien erfordern eine schnelle Internet-Verbindung.
-
-Streaming-Medien abspielen, wenn verfügbar?
-(Sie können diese Option später unter „Einstellungen“ &gt; „Audio &amp; Video“ ändern.)
- <usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Land kann nicht übertragen werden:
Warte auf Server für Eigentümerinformationen.
@@ -908,17 +887,6 @@ Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen.
Land zusammenlegen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Eigentümer anzeigen:
-Parzellen farblich kennzeichnen, um Eigentumsart anzuzeigen.
-
-Grün = Ihr Land
-Blau = Das Land Ihrer Gruppe
-Rot = Im Eigentum anderer
-Geld = Zum Verkauf
-Lila = Zur Auktion
-Grau = Öffentlich
- </notification>
<notification name="ConfirmNotecardSave">
Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -944,9 +912,8 @@ Grau = Öffentlich
Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Sie wurden von [SECOND_LIFE] abgemeldet:
+ Es tut uns leid! Sie wurden von [SECOND_LIFE] abgemeldet.
[MESSAGE]
-Klicken Sie auf „IM &amp; Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden.
<usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM &amp; Chat anzeigen"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -1104,29 +1071,42 @@ Der Gruppe „[GROUP_NAME]“
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Ihr gewünschter Zielort ist zurzeit nicht verfügbar.
+Sie wurden zur nächstgelegenen Region teleportiert.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Ihr letzter Standort ist zurzeit nicht verfügbar.
+Sie wurden zur nächstgelegenen Region teleportiert.
</notification>
- <notification name="AvatarMoved">
- Ihr [TYPE]-Ort ist zurzeit nicht verfügbar. [HELP]
+ <notification name="AvatarMovedHome">
+ Ihr Zuhause ist zurzeit nicht verfügbar.
Sie wurden zur nächstgelegenen Region teleportiert.
+Sie müssen eventuell ein neues Zuhause festlegen.
</notification>
<notification name="ClothingLoading">
Ihre Kleidung wird noch heruntergeladen.
Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen.
<form name="form">
- <ignore name="ignore" text="Wenn das Herunterladen von Kleidung lange dauert"/>
+ <ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/>
</form>
</notification>
<notification name="FirstRun">
- Die Installation von [APP_NAME] ist abgeschlossen.
+ Installation von [APP_NAME] vollständig abgeschlossen.
-Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
-Möchten Sie auf www.secondlife.com ein Konto erstellen?
+Falls Sie [SECOND_LIFE] zum ersten Mal verwenden, müssen Sie zuerst ein Konto erstellen, bevor Sie sich anmelden können.
+Zurück zu [http://join.secondlife.com secondlife.com], um ein neues Konto zu erstellen?
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Die Verbindung kann nicht hergestellt werden. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder den [SECOND_LIFE]-Servern.
+ Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
-Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf „Hilfe“, um zu unserer Supportseite zu gelangen, oder klicken Sie auf „Teleportieren“, um nach Hause zu teleportieren.
+Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren.
+ <url name="url">
+ http://de.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Hilfe"/>
@@ -1146,10 +1126,10 @@ Sie können sich später noch umentscheiden.
[NAME] [PRICE] L$ Sie haben nicht genügend L$, um diese Aktion auszuführen.
</notification>
<notification name="GrantedModifyRights">
- Sie verfügen über Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME].
+ [NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten.
</notification>
<notification name="RevokedModifyRights">
- Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen.
+ Ihnen wurden die Änderungsrechte für die Objekte von [NAME] entzogen.
</notification>
<notification name="FlushMapVisibilityCaches">
Der Kartencache dieser Region wird geleert.
@@ -1227,33 +1207,51 @@ Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut.
[DOWNLOAD_PATH].
</notification>
<notification name="DownloadWindowsMandatory">
- Eine neue Version von [APP_NAME] ist verfügbar.
+ Eine neue Version von [SUPPORT_SITE] ist verfügbar.
[MESSAGE]
Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
</notification>
<notification name="DownloadWindows">
- Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+ Eine neue Version von [APP_NAME] ist verfügbar.
[MESSAGE]
Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+ Eine neue Version von [APP_NAME] ist verfügbar.
[MESSAGE]
Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
</notification>
- <notification name="DownloadMacMandatory">
+ <notification name="DownloadLinuxMandatory">
+ Eine neue Version von [SUPPORT_SITE] ist verfügbar.
+[MESSAGE]
+Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
+ <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
+ </notification>
+ <notification name="DownloadLinux">
Eine neue Version von [APP_NAME] ist verfügbar.
[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+ <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Eine neue Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+ <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ Eine neue Version von [SUPPORT_SITE] ist verfügbar.
+[MESSAGE]
Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
In Ihren Anwendungsordner herunterladen?
<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
</notification>
<notification name="DownloadMac">
- Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+ Eine neue Version von [APP_NAME] ist verfügbar.
[MESSAGE]
Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
@@ -1261,7 +1259,7 @@ In Ihren Anwendungsordner herunterladen?
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+ Eine neue Version von [APP_NAME] ist verfügbar.
[MESSAGE]
Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
@@ -1271,49 +1269,45 @@ In Ihren Anwendungsordner herunterladen?
<notification name="DeedObjectToGroup">
Bei Übertragung dieses Objekts erhält die Gruppe:
* An das Objekt bezahlte L$
- <usetemplate ignoretext="Beim Übertragen von Objekten an Gruppen" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/>
+ <usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Den System-Webbrowser öffnen, um diesen Inhalt anzuzeigen?
- <usetemplate ignoretext="Wenn der System-Webbrowser zur Anzeige einer Webseite geöffnet wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ 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="WebLaunchJoinNow">
- Zu www.secondlife.com, um Ihr Konto zu verwalten?
- <usetemplate ignoretext="Beim Starten eines Browsers, um Ihr Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ 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"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet.
- <usetemplate ignoretext="Beim Starten eines Browsers, um das Sicherheitsfragen-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Besuchen Sie das [SECOND_LIFE] QA-Wiki.
- <usetemplate ignoretext="Beim Starten eines Browsers, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden.
- <usetemplate ignoretext="Beim Starten eines Browsers, um den Allgemeine Probleme Tracker anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Informieren Sie sich im [SECOND_LIFE] Wiki über den Allgemeine Fragen-Tracker.
- <usetemplate ignoretext="Beim Starten eines Browsers, um das Allgemeine Fragen-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
+ <usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
</notification>
<notification name="WebLaunchSupportWiki">
Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen.
- <usetemplate ignoretext="Beim Starten eines Browsers, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Zur Scripting-Anleitung, um Scripting-Hilfe zu erhalten?
- <usetemplate ignoretext="Beim Starten eines Browsers, um die Scripting-Anleitung anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ Möchten Sie den Scripting Guide öffnen?
+ <usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Zum LSL-Portal, um Scripting-Hilfe zu erhalten?
- <usetemplate ignoretext="Beim Starten eines Browsers, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
+ Möchten Sie das LSL-Portal besuchen?
+ <usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
</notification>
<notification name="ReturnToOwner">
Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben.
*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht!
- <usetemplate ignoretext="Beim Zurückgeben von Objekten an ihre Eigentümer" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Sie sind Mitglied der Gruppe [GROUP].
@@ -1325,14 +1319,14 @@ Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/>
</notification>
<notification name="MuteLinden">
- Lindens können nicht stummgeschaltet werden.
+ Lindens können nicht ignoriert werden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden. Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten.
</notification>
- <notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed">
- Dieser Name ist bereits stummgeschaltet.
+ <notification label="Objekt nach Name ignorieren ist fehlgeschlagen" name="MuteByNameFailed">
+ Dieser Name wird bereits ignoriert.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1348,17 +1342,19 @@ Diese Gruppe verlassen?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- Beschäftigt-Modus aktiviert.
-Chat und Instant Messages werden ausgeblendet. Instant Messages erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden ausgeschlagen. Alle Inventar-Angebote werden in den Papierkorb verschoben.
- <usetemplate ignoretext="Beim Aktivieren des Beschäftigt-Modus" name="okignore" yestext="OK"/>
+ Beschäftigt-Modus ist aktiviert.
+Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben.
+ <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Sie sind bereits in zu vielen Gruppen Mitglied und können keiner weiteren beitreten. Bitte verlassen Sie eine Gruppe, bevor Sie dieser beitreten oder lehnen Sie das Angebot ab.
-Die Option zum Austritt aus einer Gruppe finden Sie unter „Bearbeiten“ &gt; „Gruppen...“.
-[NAME] hat Sie eingeladen, einer Gruppe beizutreten.
-[INVITE]
+ Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab.
+[NAME] hat Sie eingeladen, einer Gruppe beizutreten.
<usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine Gruppe bevor Sie einer neuen beitreten oder eine neue Gruppe bilden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen?
<form name="form">
@@ -1420,8 +1416,16 @@ Die Option zum Austritt aus einer Gruppe finden Sie unter „Bearbeiten“ &gt;
</form>
</notification>
<notification name="TeleportFromLandmark">
- Möchten Sie sich wirklich teleportieren?
- <usetemplate ignoretext="Beim Teleportieren von einer Landmarke im Inventar" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+ Sind Sie sicher, dass Sie zu &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; teleportieren möchten?
+ <usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Nach [PICK] teleportieren?
+ <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Zu [CLASSIFIED] teleportieren?
+ <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Anzeigen teleportieren möchte." name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
</notification>
<notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate">
Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird.
@@ -1497,9 +1501,9 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
- <usetemplate ignoretext="Wenn Regionzugang aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+ <usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten.
@@ -1507,16 +1511,12 @@ Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Alterein
<notification name="RegionEntryAccessBlocked_Change">
Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten.
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
- <form name="form">
- <button
- name="OK"
- text="Einstellung ändern"/>
- <button
- name="Cancel"
- text="Schließen"/>
- <ignore name="ignore" text="Wenn Regionzugang aufgrund von Einstellung für Alterseinstufung gesperrt ist"/>
- </form>
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen &gt; Allgemein.
+ <form name="form">
+ <button name="OK" text="Einstellung ändern"/>
+ <button name="Cancel" text="Schließen"/>
+ <ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
@@ -1529,9 +1529,9 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
- <usetemplate ignoretext="Wenn Landanspruch aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+ <usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
@@ -1539,8 +1539,8 @@ Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Alterein
<notification name="LandClaimAccessBlocked_Change">
Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
- <usetemplate ignoretext="Wenn Landanspruch aufgrund von Einstellung der Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen &gt; Allgemein.
+ <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
</notification>
<notification name="LandBuyAccessBlocked">
Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
@@ -1553,9 +1553,9 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
- <usetemplate ignoretext="Wenn Landkauf aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+ <usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen.
@@ -1563,11 +1563,12 @@ Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Alterein
<notification name="LandBuyAccessBlocked_Change">
Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen.
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
- <usetemplate ignoretext="Wenn Landkauf aufgrund von Einstellung für Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen &gt; Allgemein.
+ <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut.&quot;
+ 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="ProblemImportingEstateCovenant">
Problem beim Import des Grundstückvertrags.
@@ -1598,11 +1599,11 @@ Anzeige für [AMOUNT] L$ veröffentlichen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- Enthält diese Anzeige Mature-Inhalte?
+ Enthält diese Anzeige moderate Inhalte?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="SetGroupMature">
- Beschäftigt sich diese Gruppe mit Mature-Inhalten?
+ Beschäftigt sich diese Gruppe mit moderaten Inhalten?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification label="Neustart bestätigen" name="ConfirmRestart">
@@ -1617,214 +1618,14 @@ Anzeige für [AMOUNT] L$ veröffentlichen?
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
- <notification label="Terraformen blockieren" name="HelpRegionBlockTerraform">
- Wenn diese Option aktiviert ist, können Landeigentümer Ihr Land nicht terraformen. Ausgenommen davon ist die parzelleneigene Einstellung „Terrain bearbeiten“.
-
-Standard: deaktiviert
- </notification>
- <notification label="Fliegen blockieren" name="HelpRegionBlockFly">
- Wenn diese Option aktiviert ist, ist Fliegen in dieser Region nicht möglich, auch wenn für die Parzelle eine andere Einstellung aktiv ist.
-
-Standard: deaktiviert
- </notification>
- <notification label="Mehrere Inhaltsberechtigungen ändern" name="HelpBulkPermission">
- Mit dem Werkzeug „Mehrere Berechtigungen“ können Sie Berechtigungen für mehrere Objekte in den Inhalten des ausgewählten Objekts schnell ändern. Bitte beachten Sie, dass Sie nur Berechtigungen an den Objekten im Inhalt der ausgewählten Objekte einstellen, nicht Berechtigungen an dem/den Container-Objekt(en=) selbst.
-
-Bitte beachten Sie auch, dass die Berechtigungen nicht auf eingebettete Inhalte der enthaltenen Objekte angewandt werden. Ihre Auftrag wird nur an Objekten ausgeführt, die sie sich in diesem Level befinden.
-
-Sie können auswählen, welche Objektarten Sie ändern möchten, indem Sie diese in der Liste unter „Inhaltsarten“ auswählen. Wenn Sie Texturen auswählen, sind Fotos mit eingeschlossen.
-
-* Mit diesem Werkzeug können Sie nur an Objekten, die Sie ändern dürfen, Änderungen vornehmen.
-* Sie können dem nächsten Eigentümer keine Berechtigungen geben, die Sie nicht besitzen.
-* Die Berechtigungen für den nächsten Eigentümer sind nur Anfragen. Wenn ein Objekt nicht alle Berechtigungen annehmen kann, dann werden keine seiner Berechtigungen geändert.
-
-Wenn Sie bereit sind, die Berechtigungen mehrfach zu ändern, klicken Sie auf Übernehmen und warten Sie, bis die Ergebnisse angezeigt werden.
-
-Wenn Sie das Fenster „Mehrfach-Berechtigungen“ schließen, während die Berechtigungen geändert werden, wird der Vorgang gestoppt.
- </notification>
- <notification label="Schaden zulassen" name="HelpRegionAllowDamage">
- Wenn diese Option aktiviert ist, ist das Gesundheitssystem auf allen Parzellen aktiviert, unabhängig von den Parzelleneinstellungen. Ist die Option links deaktiviert, können die Parzelleneigentümer das Gesundheitssystem individuell einschalten.
-
-Standard: deaktiviert
- </notification>
- <notification label="Avatar-Limit" name="HelpRegionAgentLimit">
- Legt die maximale Anzahl an Avataren für diese Region fest.
-Die Leistung hängt von der Anzahl der Avatare in der Region ab.
-
-Standard: 40
- </notification>
- <notification label="Objektbonus" name="HelpRegionObjectBonus">
- Der Objektbonus ist ein Multiplikator für die Anzahl an zulässigen Primitiven auf einer Parzelle. Gültig sind Werte zwischen 1 und 10. „1“ erlaubt auf einer 512 qm großen Parzelle 117 Objekte. „2“ erlaubt auf einer 512 qm großen Parzelle 234 Objekte, also die doppelte Menge. Die maximale Objektanzahl in einer Region beträgt unabhängig vom Objektbonus 15.000.
-Eine nachträglich Senkung des Objektbonus führt dazu, dass Objekte zurückgegeben oder gelöscht werden.
-
-Standard: 1.0
- </notification>
- <notification label="Alterseinstufung" name="HelpRegionMaturity">
- Legt die Alterseinstufung für die Region fest. Dies wird in der Menüleiste oben im Viewer angezeigt und auch in den Kurzinfos auf der Weltkarte, wenn der Cursor über diese Region schwebt. Diese Einstellung wirkt sich auch auf den Zugang zu dieser Region und die Suchergebnisse aus. Andere Einwohner können Regionen nur dann betreten oder Suchergebnisse anzeigen, wenn Ihre Alterseinstufung in Ihren Einstellungen der Alterseinstellung der Region bzw. Suchergebnisse entsprechen.
-
-Es kann eine Weile dauern, bis diese Änderung auf der Karte angezeigt wird.
- </notification>
- <notification label="Stoßen beschränken" name="HelpRegionRestrictPushObject">
- Aktivieren sie diese Option, um in der gesamten Region das Stoßen zu beschränken. Wenn aktiviert, können Einwohner nur von sich selbst oder vom Parzelleneigentümer gestoßen werden.
-(Stoßen meint die LSL-Funktion llPushObject().)
-
-Standard: deaktiviert
- </notification>
- <notification label="Parzelle zusammenlegen/teilen" name="HelpParcelChanges">
- Dieses Kontrollkästchen steuert, ob Parzellen des Grundstückseigentümers zusammengelegt bzw. unterteilt werden können. Wenn deaktiviert:
- * Nur Grundstückseigentümer bzw. –verwalter können Parzellen zusammenlegen/teilen. * Sie können nur Parzellen zusammenlegen/teilen, die dem Eigentümer oder einer Gruppe gehören, bei der sie entsprechende Gruppenrechte innehaben.
-Wenn aktiviert:
- * Die Parzelleneigentümer können ihre Parzellen selbst zusammenlegen/teilen.
- * Parzellen in Gruppeneigentum können von Mitgliedern mit den entsprechenden Rechten zusammengelegt bzw. unterteilt werden.
-
-Standard: aktiviert
- </notification>
- <notification label="Nicht in Suche anzeigen" name="HelpRegionSearch">
- Wenn Sie diese Option auswählen, können Parzelleneigentümer ihre Parzellen nicht in der Suche anzeigen lassen
-
-Standard: deaktiviert
- </notification>
<notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange">
Die Alterseinstufung dieser Region wurde aktualisiert.
-Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt.
- </notification>
- <notification label="Landwiederverkauf" name="HelpRegionLandResell">
- Grundstückseigentümer und -verwalter können jedes Land im Besitz des Grundstückseigentümers verkaufen.
-Ist diese Option deaktiviert, können Käufer ihr Land in dieser Region nicht weiterverkaufen.
-Ist die Option aktiviert, können Käufer ihr Land in dieser Region weiterverkaufen.
-
-Standard: deaktiviert
- </notification>
- <notification label="Skripts deaktivieren" name="HelpRegionDisableScripts">
- Schlechte Sim-Performance ist oftmals auf ein Skript zurückzuführen. Öffnen Sie die Statistikleiste (Strg+Umschalt+1). Sehen Sie sich den Wert für „Simulator Physics FPS“ (Simulator Physik-FPS) an.
-Wenn der Wert unter 45 liegt, öffnen Sie den Bereich „Time“ (Zeit) ganz unten in der Statistikleiste. Wenn der Wert für „Script Time“ (Skriptzeit) 25 ms oder höher ist, klicken Sie auf „Top-Skripts“. Der Name und die Position der Skripts, die für die schlechte Performance verantwortlich sind, werden angezeigt.
-Wenn Sie das Kontrollkästchen „Skripts deaktivieren“ aktivieren und auf „Übernehmen“ klicken, werden alle Skripts in der Region zeitweilig deaktiviert. Dieser Schritt ist eventuell notwendig, damit Sie an die Position des gemeldeten „Top-Skripts“ reisen können. Sobald Sie dort angekommen sind, sollten Sie das Skript auf die Ursache des Problems hin untersuchen. Möglicherweise müssen Sie sich an den Skript-Eigentümer wenden oder das Objekt löschen bzw. zurückgeben. Um die Skripte in der Region wieder zu aktivieren, deaktivieren Sie „Skript deaktivieren“ und klicken Sie auf „Übernehmen“.
-
-Standard: deaktiviert
- </notification>
- <notification label="Kollisionen deaktivieren" name="HelpRegionDisableCollisions">
- Schlechte Sim-Performance ist oftmals auf physische Objekte zurückzuführen.
-Öffnen Sie die Statistikleiste (Strg+Umschalt+1). Sehen Sie sich den Wert „Simulator Physics FPS“ an. Liegt dieser unter 45, öffnen Sie unten in der Statistikleiste den „Time“-Bereich. Liegt die „Sim Time (Physics)“ bei 20 ms oder darüber, klicken Sie auf „Top-Kollisionsobjekte“.
-Der Name und der Standort der physischen Objekte, die das Problem verursachen, werden angezeigt.
-
-Wenn Sie das Kontrollkästchen „Kollisionen deaktivieren“ aktivieren und auf „Übernehmen“ klicken, werden alle Objekt-Objekt-Kollisionen in der Region zeitweilig deaktiviert. Dieser Schritt ist eventuell notwendig, damit Sie an die Position des gemeldeten „Top-Kollisionsobjekts“ reisen können. Überprüfen Sie das Objekt an der angegebenen Position.
-Kollidiert es ständig mit anderen Objekten? Wenden Sie sich eventuell an den Eigentümer des Objekts, löschen Sie es oder geben Sie es zurück.
-Deaktivieren Sie die Option „Kollisionen deaktivieren“ und klicken Sie auf „Übernehmen“, um Kollisionen in dieser Region wieder zu aktivieren.
-
-Standard: deaktiviert
- </notification>
- <notification label="Physik deaktivieren" name="HelpRegionDisablePhysics">
- Das Deaktivieren der Physik ähnelt dem Deaktivieren von Kollisionen, außer dass die gesamte Physiksimulation ausgeschaltet wird. Das hat nicht nur zur Folge, dass Objekte nicht mehr kollidieren, sondern dass Avatare sich nicht mehr bewegen können.
-
-Diese Option sollte nur verwendet werden, wenn das Deaktivieren von Kollisionen keine ausreichende Leistungssteigerung bringt, um Physikprobleme in der Region oder die Top-Kollisionsobjekte zu erkennen.
-
-Schalten Sie die Physiksimulation hinterher wieder ein. Andernfalls können sich Avatare nicht mehr bewegen.
-
-Standard: deaktiviert
- </notification>
- <notification label="Top-Kollisionsobjekte" name="HelpRegionTopColliders">
- Zeigt eine Liste der Objekte mit den potenziell meisten Objekt-Objekt-Kollisionen an. Diese Objekte können die Leistung beeinträchtigen. Wählen Sie „Ansicht“ &gt; „Statistikleiste“ aus und sehen Sie unter „Simulator“ &gt; „Time“ &gt; „Sim Time (Physics)“ nach, ob die Physikberechnung länger als 20 ms dauert.
- </notification>
- <notification label="Top-Skripts" name="HelpRegionTopScripts">
- Zeigt eine Liste der Objekte an, die die meiste Zeit benötigen, um LSL-Skripts auszuführen. Diese Objekte können die Leistung beeinträchtigen.
-Wählen Sie „Ansicht“ &gt; „Statistikleiste“ und sehen Sie unter „Simulator“ &gt; „Time“ &gt; „Script Time“ nach, ob mehr als 25 ms für Skripts benötigt werden.
- </notification>
- <notification label="Region neu starten" name="HelpRegionRestart">
- Starten Sie den Serverprozess für diese Region nach der 2-Minuten-Warnung neu. Die Verbindung aller Einwohner in dieser Region wird getrennt. Die Region wird gespeichert und sollte nach 90 Sekunden wieder verfügbar sein.
-
-Der Neustart der Region behebt die meisten Leistungs-probleme, sollte aber nur nach Anweisung erfolgen.
- </notification>
- <notification label="Wasserhöhe" name="HelpRegionWaterHeight">
- Die Höhe der Wasserlinie in Metern. Liegt dieser Wert unter 20 und haben Sie Wasser nahe am Rand der Welt oder „offenes“ Wasser definiert, wird eine deutliche Lücke sichtbar.
-
-Standard: 20
- </notification>
- <notification label="Obere Terraingrenze" name="HelpRegionTerrainRaise">
- Der maximale Betrag in Metern, um den Parzelleneigentümer ihr Terrain über die Standardhöhe des „geformten“ Terrains erhöhen können.
-
-Standard: 4
- </notification>
- <notification label="Untere Terraingrenze" name="HelpRegionTerrainLower">
- Der maximale Betrag in Metern, um den Parzelleneigentümer ihr Terrain unter die Standardhöhe des „geformten“ Terrains absenken können.
-
-Standard: -4
- </notification>
- <notification label="RAW-Terrain hochladen" name="HelpRegionUploadRaw">
- Mit dieser Schaltfläche laden Sie eine RAW-Datei in die Region hoch, in der Sie sich befinden.
-Die Datei muss die korrekten Maße (RGB, 256x256) und 13 Kanäle haben. Um eine neue Terraindatei zu erstellen, laden Sie am besten die vorhandene RAW-Datei herunter. Beginnen Sie damit, den Rot-Kanal (Höhe des Landes) zu bearbeiten und laden Sie die Datei wieder hoch.
-
-Der Ladevorgang kann bis zu 45 Sekunden dauern. Beachten Sie, dass beim Hochladen einer Terraindatei die Objekte auf dem Land *nicht* verschoben werden, sondern nur das Land und die mit den Parzellen verbundenen Berechtigungen. Dies kann dazu führen, dass Objekte unter dem Terrain verschwinden.
-
-Weitere Informationen zur Bearbeitung der Höhendaten der Region enthält die F1-Hilfe.
- </notification>
- <notification label="RAW-Terrain herunterladen" name="HelpRegionDownloadRaw">
- Mit dieser Schaltfläche laden Sie eine Datei herunter, welche die Höhendaten, Maße, den Verkaufsstatus der Parzelle und einige Parzellenrechte für diese Region enthält. Wenn Sie diese Datei in einem Programm wie Photoshop öffnen, müssen Sie die Bilddaten eingeben. Diese sind: RGB, 256x256 mit 13 Kanälen. Anders lässt sich diese Terraindatei nicht öffnen.
-
-Weitere Informationen zur Bearbeitung der Höhendaten der Region enthält die F1-Hilfe.
- </notification>
- <notification label="Grundstücksonne verwenden" name="HelpRegionUseEstateSun">
- Aktivieren Sie diese Option, um in dieser Region denselben Sonnenstand wie auf dem restlichen Grundstück einzustellen.
-
-Standard: aktiviert
- </notification>
- <notification label="Sonne fest" name="HelpRegionFixedSun">
- Aktivieren Sie diese Option, um den Sonnenstand auf die im Regler definierte Position festzulegen und die Animation auszuschalten.
-
-Standard: deaktiviert
- </notification>
- <notification label="Terrain formen" name="HelpRegionBakeTerrain">
- Mit dieser Schaltfläche speichern Sie die aktuelle Terrain-Form als neuen Standard für die Region. Nach der Formung können Sie und andere das Land mit der Option „Terrain bearbeiten“ &gt; „Zurücksetzen“ in den ursprünglichen Zustand zurückversetzen. Das geformte Terrain ist auch das Zentrum für die oberen und unteren Terraingrenzen.
- </notification>
- <notification label="Grundstücksverwalter" name="HelpEstateEstateManager">
- Ein Grundstücksverwalter ist ein Einwohner, dem Sie die Kontrolle über die Regions- und Grundstückseinstellungen übertragen haben. Ein Grundstücksverwalter kann alle Einstellungen ändern, außer das Hochladen, Herunterladen und Formen von Terrain. Vor allem kann er Einwohner auf dem Grundstück erlauben und davon verbannen.
-
-Nur der Eigentümer kann den Grundstücksverwalter bestimmen und entlassen. Der Verwalter hat dieses Recht nicht. Wählen Sie nur vertrauenswürdige Einwohner als Grundstücksverwalter, da Sie letztlich für deren Handlungen verantwortlich sind.
- </notification>
- <notification label="Globale Zeit verwenden" name="HelpEstateUseGlobalTime">
- Aktivieren Sie diese Option, um auf Ihrem Grundstück denselben Sonnenstand wie auf dem Linden-„Mainland“ einzustellen.
-
-Standard: aktiviert
- </notification>
- <notification label="Sonne fest" name="HelpEstateFixedSun">
- Aktivieren Sie diese Option, um den Sonnenstand auf die im Regler definierte Position festzulegen und die Animation auszuschalten.
- </notification>
- <notification label="Öffentlich" name="HelpEstateExternallyVisible">
- Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu erlauben, ohne auf der Zugangsliste zu stehen.
-
-Standard: aktiviert
- </notification>
- <notification label="Direktteleport zulassen" name="HelpEstateAllowDirectTeleport">
- Wenn aktiviert, können sich Einwohner an jede Stelle auf Ihrem Grundstück teleportieren. Wenn deaktiviert, werden Einwohner zum nächstgelegenen Telehub teleportiert.
-
-Standard: deaktiviert
- </notification>
- <notification label="Zugang erlauben" name="HelpEstateAllowResident">
- Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn „Öffentlich“ deaktiviert ist.
- </notification>
- <notification label="Gruppenzugang erlauben" name="HelpEstateAllowGroup">
- Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn „Öffentlich“ deaktiviert ist.
- </notification>
- <notification label="E-Mail-Adresse für Missbrauchsmeldungen" name="HelpEstateAbuseEmailAddress">
- Geben Sie hier eine E-Mail-Adresse ein, an die Missbrauchsmeldungen von diesem Grundstück gesendet werden.
-Wenn dieses Feld leer ist, werden Missbrauchsmeldungen nur an Linden Lab gesendet.
- </notification>
- <notification label="Zugang verweigern" name="HelpEstateBanResident">
- Einwohnern auf dieser Liste wird der Zugang zum Grundstück verwehrt, unabhängig von etwaigen anderen Einstellungen.
- </notification>
- <notification label="Voice-Chat erlauben" name="HelpEstateVoiceChat">
- Die Parzellen auf diesem Grundstück können über eigene Voice-Channel verfügen, die es Einwohnern ermöglichen, sich mit anderen Personen in der Nähe zu unterhalten.
+Es kann eine Weile dauern, bis diese Änderung auf der Karte angezeigt wird.
-Standard: deaktiviert
+Um Regionen der Alterseinstufung „Adult&quot; zu betreten, müssen Einwohner altersüberprüft sein. Dies kann entweder über die Alterverifizierung oder Zahlungsverifizierung geschehen.
</notification>
<notification label="Falsche Voice-Version" name="VoiceVersionMismatch">
- Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren.
- </notification>
- <notification label="Grunstücksvertrag" name="HelpEstateCovenant">
- Ein Grundstücksvertrag ermöglicht es Ihnen, Grundstücksparzellen zu verkaufen. Ohne Vertrag können Sie kein Land verkaufen. Wenn Sie keine Regeln festlegen oder Käufern vor dem Kauf keine anderen Informationen über das Land bereitstellen möchten, können Sie die Vertrags-Notizkarte auch leer lassen.
-
-Ein Vertrag kann Regeln und Richtlinien, kulturelle Informationen oder einfach nur Ihre eigenen Erwartungen bezüglich der Landnutzung durch den Käufer enthalten. Das kann Zoning, Baubeschränkungen, Zahloptionen und alle möglichen anderen Informationen betreffen, die der neue Eigentümer Ihrer Meinung nach kennen und akzeptieren sollte.
-
-Der Käufer muss dem Vertrag durch Auswahl dieses Kontrollkästchens zustimmen, bevor der Kauf abgeschlossen werden kann. Grundstücksverträge sind jederzeit unter „Land-Info“ für jede Parzelle einsehbar, für die ein Vertrag definiert wurde.
+ Diese Version von [APP_NAME] ist mit der Voice-Chat-Funktion in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren.
</notification>
<notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner">
Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
@@ -1913,53 +1714,36 @@ Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behal
Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
Inventarobjekt(e) verschieben?
- <usetemplate ignoretext="Beim Verschieben von nicht-kopierfähigem Inventar von Objekten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren.
Inventarobjekt(e) verschieben?
- <usetemplate ignoretext="Beim Verschieben von nicht-kopierfähigem Inventar von geskripteten Objekten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Achtung: Die Klick-Aktion „Objekt bezahlen“ wurde definiert, sie funktioniert aber nur, wenn ein Skript mit einem money() Ereignis hinzugefügt wird.
+ Achtung: Die Klickaktion „Objekt bezahlen&quot; wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird.
<form name="form">
- <ignore name="ignore" text="Beim Einrichten von Events mit „Objektbezahlung“ ohne Geld"/>
+ <ignore name="ignore" text="I habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt.
</notification>
<notification name="WebLaunchAccountHistory">
- Zur [SECOND_LIFE]-Website, um Ihre Kontostatistik anzuzeigen?
- <usetemplate ignoretext="Beim Laden der Kontostatistik-Website" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Die Support-Website von [SECOND_LIFE] öffnen?
- <usetemplate ignoretext="Bei Besuch der [SECOND_LIFE] Support-Website." name="okcancelignore" notext="Abbrechen" yestext="Los"/>
+ Möchten Sie Ihre [http://secondlife.com/account/ Startseite] aufrufen, um Ihre Konto-Statistik anzuzeigen?
+ <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
</notification>
<notification name="ConfirmQuit">
Wirklich beenden?
- <usetemplate ignoretext="Beim Beenden von [APP_NAME]." name="okcancelignore" notext="Weiter" yestext="Beenden"/>
+ <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Mit dieser Funktion können Sie Verstöße gegen die [http://secondlife.com/corporate/tos.php Servicebedingungen (EN)] and [http://secondlife.com/corporate/cs.php Community-Standards] melden.
-Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab.
--
-Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind.
-(Den Vertrag können Sie unter „Welt“ &gt; „Land-Info“ einsehen.)
--
-Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken.
+Alle gemeldeten Verstöße werden bearbeitet.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Wählen Sie eine Missbrauchskategorie aus.
@@ -1986,9 +1770,9 @@ Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle
Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten?
-1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen.
+1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht gemeldete Verstöße gegen die [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Servicebedingungen] oder [http://secondlife.com/corporate/cs.php Community-Standards] und verhängt entsprechende Maßnahmen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen.
-2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen.
+2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter [http://secondlife.com/corporate/dmca.php] dargelegten Anweisungen einreichen.
Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein. Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen.
@@ -2004,7 +1788,7 @@ Linden Lab
An dieser Körperstelle ist bereits ein Objekt angebracht.
Möchten Sie es mit dem ausgewählten Objekt ersetzen?
<form name="form">
- <ignore name="ignore" save_option="true" text="Beim Wechseln von Anhängen"/>
+ <ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/>
<button ignore="Automatisch ersetzen" name="Yes" text="OK"/>
<button ignore="Nie ersetzen" name="No" text="Abbrechen"/>
</form>
@@ -2014,18 +1798,22 @@ Möchten Sie es mit dem ausgewählten Objekt ersetzen?
Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen?
<form name="form">
- <ignore name="ignore" save_option="true" text="Beim Bezahlen einer Person oder eines Objekts im Beschäftigt-Modus"/>
+ <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/>
<button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/>
<button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Der Ordner „[FOLDERNAME]“ ist ein Systemordner. Das Löschen von Systemordnern kann zu instabiler Leistung führen. Möchten Sie fortfahren?
+ <usetemplate ignoretext="Bestätigen, bevor ich einen Systemordner lösche." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Möchten Sie den Inhalt Ihres Papierkorbs wirklich löschen?
- <usetemplate ignoretext="Beim Leeren des Inventar-Papierkorbs" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten?
+ <usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Möchten Sie Ihren Browser-Cache wirklich leeren?
- <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
+ Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
@@ -2036,39 +1824,18 @@ Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschl
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Möchten Sie den Inhalt Ihres Fundstücke-Ordners wirklich permanent löschen?
- <usetemplate ignoretext="Beim Leeren von Inventar und Fundstückeordner-" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten?
+ <usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="CopySLURL">
Die folgende SLurl wurde in die Zwischenablage kopiert:
[SLURL]
-Veröffentlichen Sie sie auf einer Website, um anderen den Zugang zu diesem Ort zu erleichtern, oder testen Sie sie, indem Sie sie in die Adressleiste Ihres Browsers kopieren.
+Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers.
<form name="form">
- <ignore name="ignore" text="Beim Kopieren einer SLurl in die Zwischenablage"/>
+ <ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Die Optionen in diesem Dialog steuern Fenstergröße und Auflösung sowie die Qualität der Grafikdarstellung im Client. Im Fenster „Einstellungen“ &gt; „Grafik“ stehen vier Grafikeinstellungen zur Wahl: Niedrig, Mittel, Hoch und Ultra. Die Grafikeinstellungen lassen sich auch individuell anpassen; aktivieren Sie das Kontrollkästchen „Benutzerdefiniert“, um die folgenden Einstellungen zu bearbeiten:
-
-Shader: Aktivieren oder deaktivieren Sie die verschiedenen Pixel-Shader.
-
-Spiegelung: Legen Sie hier fest, welche Objekte sich in Wasser spiegeln.
-
-Avatar-Darstellung: Einige Optionen, die über die Darstellung Ihres Avatars bestimmen.
-
-Sichtweite: Legt fest, bis zu welcher Entfernung von Ihrem Avatar die Objekte in der Szene berechnet und dargestellt werden.
-
-Max. Partikelzahl: Legt fest, wie viele Partikel gleichzeitig berechnet und angezeigt werden.
-
-Post-Processing-Qualität: Legt fest, mit welcher Auflösung der Glüheffekt berechnet wird.
-
-Gitterdetails: Legt den Detailgrad bzw. die Anzahl an Dreiecken bei der Berechnung bestimmter Objekte fest. Höhere Werte führen zu einer genaueren Darstellung, dauern aber länger in der Berechnung.
-
-Beleuchtungsdetails: Legt fest, welche Lichtquellen berechnet werden.
-
-Terraindetails: Legt den Detailgrad bei der Berechnung der Terraintextur fest.
- </notification>
<notification name="WLSavePresetAlert">
Die gespeicherte Voreinstellung überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
@@ -2087,150 +1854,6 @@ Terraindetails: Legt den Detailgrad bei der Berechnung der Terraintextur fest.
Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="HelpEditSky">
- Verschieben Sie die WindLight-Regler, um verschiedene Himmelsansichten zu erstellen und zu speichern.
- </notification>
- <notification name="HelpEditDayCycle">
- Wählen Sie für jede Tageszeit eine Himmelsansicht aus.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Diese Einstellungen haben Auswirkung auf die lokale Darstellung der Umwelt auf Ihrem Computer. Zugriff auf alle Einstellungen haben Sie nur, wenn Ihre Grafikkarte Atmosphären-Shader unterstützt.
-
-Mit dem Regler „Tageszeit“ stellen Sie die lokal in Ihrem Viewer dargestellte Tageszeit ein.
-
-Mit dem Regler „Wolkendecke“ steuern Sie die Wolkendichte am Himmel.
-
-Unter „Wasserfarbe“ können Sie eine Farbe für die Wasserdarstellung auswählen.
-
-Mit dem Regler „Wassertrübung“ steuern Sie die Sichtweite unter Wasser.
-
-Klicken Sie auf „Grundstückszeit verw.“, um die aktuelle Zeit in der Region fest als Tageszeit einzustellen.
-
-Klicken Sie auf „Himmel (erweitert)“, um einen Editor mit erweiterten Einstellungen für die Himmeldarstellung anzuzeigen.
-
-Klicken Sie auf „Wasser (erweitert)“, um einen Editor mit erweiterten Einstellungen für die Wasserdarstellung anzuzeigen.
- </notification>
- <notification name="HelpDayCycle">
- Im Tageszyklus-Editor steuern Sie den Tag-/Nachtzyklus am [SECOND_LIFE] Himmel. Dabei handelt es sich um den Zyklus, der mit dem Tageszeit-Regler im Umwelt-Basiseditor gesteuert wird.
-
-Der Tageszyklus-Editor verwendet sogenannte Keyframes zur Steuerung des Tag-/Nachtablaufs. Dabei handelt es sich um „Schlüsselbilder“ (die grauen Kreise auf der Zeitskala), für die bestimmte Himmelseinstellungen definiert wurden. Bei voranschreitender Tageszeit interpoliert WindLight den Übergang zwischen diesen Keyframes und erzeugt eine entsprechende Himmelsanimation.
-
-Der gelbe Pfeil über der Zeitskala repräsentiert die aktuelle Tageszeit-Darstellung. Ziehen Sie den Pfeil, um die Tagesanimation anzuzeigen. Mit „Key hinzu“ und „Key löschen“ rechts neben der Zeitskala können Sie neue Keys einfügen und vorhandene löschen.
-
-Keyframes lassen sich einfach entlang der Zeitskala verschieben, oder Sie geben die Werte manuell unter „Keyframe-Einstellungen“ ein. Hier wählen Sie auch eine WindLight-Voreinstellung für den Keyframe aus.
-
-„Zykluslänge“ bestimmt die Gesamtlänge eines „Tages“. Ein niedriger Wert (z.B. 2 Minuten) führt dazu, dass ein ganzer 24-Stunden-Tag innerhalb von zwei Minuten Echtzeit abgespult wird! Wenn Sie alle Einstellungen auf der Zeitskala und für die einzelnen Keyframes vorgenommen haben, können Sie mit „Start“ und „Stopp“ die Animation anzeigen. Das funktioniert natürlich genauso interaktiv, indem Sie den gelben Pfeil über der Zeitskala verschieben. Mit der Schaltfläche „Grundstückszeit verw.“ synchronisieren Sie die Tageszeit und -länge mit den auf dem Grundstück geltenden Einstellungen.
-
-Ihre Tageszyklus-Einstellungen lassen sich mit den Schaltflächen „Testtag speichern“ und „Testtag laden“ speichern bzw. laden. Bis dato kann nur ein Tageszyklus gleichzeitig in Verwendung sein.
- </notification>
- <notification name="HelpBlueHorizon">
- Mit den Reglern für Rot/Grün/Blau (RGB) steuern Sie die Farbe des Himmels. Verwenden Sie den Intensitätsregler (I), um alle drei RGB-Regler gleichzeitig zu verschieben.
- </notification>
- <notification name="HelpHazeHorizon">
- Horizonttrübung ist einer der wichtigsten Parameter, um die Gesamtlichtsituation in der Szene zu steuern. Damit lassen sich viele Belichtungseinstellungen simulieren, z.B. ein Überstrahlen durch die Sonne oder starker Dunst.
- </notification>
- <notification name="HelpBlueDensity">
- Farbintensität steuert die Gesamtfarbsättigung von Himmel und Nebel. Je weiter Sie den Intensitätsregler (I) nach rechts verschieben, desto heller und lebendiger werden die Farben. Wenn Sie ihn ganz nach links verschieben, verlieren die Farben an Intensität und gehen in Schwarz oder Weiß über. Volle Kontrolle über die Farbsättigung des Himmels bieten ihnen die Regler für Rot/Grün/Blau (RGB).
- </notification>
- <notification name="HelpHazeDensity">
- Trübungsintensität steuert die Stärke des grauen Dunsts in der Atmosphäre. Damit lassen sich zum Beispiel starker Rauch oder Luftverschmutzung simulieren. Auch für Nebel und Sprühregen geeignet.
- </notification>
- <notification name="HelpDensityMult">
- Der Dichtemultiplikator beeinflusst die Gesamtdichte der Atmosphäre. Niedrige Einstellungen erzeugen den Eindruck dünner, sauberer Luft, hohe Einstellungen erzeugen den Eindruck schweren Smogs.
- </notification>
- <notification name="HelpDistanceMult">
- Steuert die Entfernungswirkung von WindLight. Ein Wert von Null schaltet den Einfluss von WindLight auf Terrain und Objekte praktisch aus. Werte über 1 simulieren größere Entfernungen und verstärken den Atmosphäreneffekt.
- </notification>
- <notification name="HelpMaxAltitude">
- Max. Höhe steuert die Höhenberechnungen von WindLight bei der Berechnung der atmosphärischen Beleuchtung. Zu späteren Tageszeiten lässt sich damit zum Beispiel die „Intensität“ des Sonnenuntergangs beeinflussen.
- </notification>
- <notification name="HelpSunlightColor">
- Steuert Farbe und Intensität von direktem Licht in der Szene.
- </notification>
- <notification name="HelpSunAmbient">
- Steuert Farbe und Intensität von atmosphärischem Umgebungslicht in der Szene.
- </notification>
- <notification name="HelpSunGlow">
- Der Regler „Größe“ steuert die Größe der Sonne.
-Der Regler „Fokus“ steuert, wie unscharf die Sonne am Himmel erscheint.
- </notification>
- <notification name="HelpSceneGamma">
- Regelt den Hell/Dunkel-Wert des Bildschirms.
- </notification>
- <notification name="HelpStarBrightness">
- Regelt die Helligkeit der Sterne am Himmel.
- </notification>
- <notification name="HelpTimeOfDay">
- Steuert die Sonnenstellung am Himmel.
-Entspricht der Elevation.
- </notification>
- <notification name="HelpEastAngle">
- Steuert die Sonnenstellung am Himmel.
-Entspricht dem Azimut.
- </notification>
- <notification name="HelpCloudColor">
- Steuert die Wolkenfarbe. Generell empfiehlt sich hier ein Weißton, aber hey, warum nicht ein bisschen Spaß haben?
- </notification>
- <notification name="HelpCloudDetail">
- Steuert das Detailbild, welches über das Wolken-Hauptbild gelegt wird. X und Y bestimmen seine Position. D (Dichte) regelt, wie ausgebeult oder zerrissen die Wolken wirken.
- </notification>
- <notification name="HelpCloudDensity">
- Mit den X- und Y-Reglern steuern Sie die Position der Wolken, mit dem Regler D die Wolkendichte.
- </notification>
- <notification name="HelpCloudCoverage">
- Steuert, wie stark die Wolken den Himmel bedecken.
- </notification>
- <notification name="HelpCloudScale">
- Steuert die Skalierung des Wolkenbilds auf der Himmelskuppel.
- </notification>
- <notification name="HelpCloudScrollX">
- Steuert die Bewegungsgeschwindigkeit der Wolken in X-Richtung.
- </notification>
- <notification name="HelpCloudScrollY">
- Steuert die Bewegungsgeschwindigkeit der Wolken in Y-Richtung.
- </notification>
- <notification name="HelpClassicClouds">
- Aktivieren Sie dieses Kontrollkästchen, um die Darstellung der klassischen [SECOND_LIFE] Wolken zusätzlich zu den WindLight-Wolken zu erzwingen.
- </notification>
- <notification name="HelpWaterFogColor">
- Steuert die Farbe der Wassertrübung
- </notification>
- <notification name="HelpWaterFogDensity">
- Steuert die Dichte der Wassertrübung und wie weit Sie unter Wasser sehen können.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Beeinflusst die Auswirkung des Wassertrübungs-Exponenten und regelt die Sichtweite Ihres Avatars unter Wasser.
- </notification>
- <notification name="HelpWaterGlow">
- Steuert, wie groß der Anteil der leuchtenden Wasseroberfläche ist.
- </notification>
- <notification name="HelpWaterNormalScale">
- Steuert die Skalierung der drei Elementarwellen, die das Wasser ausmachen.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Steuert die winkelabhängige Lichtreflexion.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Steuert die Intensität des reflektierten Lichts.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Steuert die Stärke der Lichtbrechung von oberhalb der Wasseroberfläche aus gesehen.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Steuert die Stärke der Lichtbrechung von unterhalb der Wasseroberfläche aus gesehen.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Steuert die Mischung von Wellen und Reflexionen.
- </notification>
- <notification name="HelpWaterNormalMap">
- Ermöglicht die Auswahl einer Normal-Map zur Berechnung von Reflexionen/Brechungen auf dem Wasser.
- </notification>
- <notification name="HelpWaterWave1">
- Steuert die Bewegungsgeschwindigkeit und -richtung der großen Normal-Map-Version in X- und Y-Richtung.
- </notification>
- <notification name="HelpWaterWave2">
- Steuert die Bewegungsgeschwindigkeit und -richtung der kleinen Normal-Map-Version in X- und Y-Richtung.
- </notification>
<notification name="NewSkyPreset">
Wählen Sie einen Namen für den neuen Himmel.
<form name="form">
@@ -2276,7 +1899,7 @@ Entspricht dem Azimut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Objekte können nicht gekauft werden, solange sie Teil eines Anhangs sind.
+ Sie können kein Objekt kaufen, während es angehängt ist.
</notification>
<notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails">
Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt.
@@ -2284,27 +1907,25 @@ Entspricht dem Azimut.
</notification>
<notification name="AutoWearNewClothing">
Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen?
- <usetemplate ignoretext="Neue Kleidung automatisch tragen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="NotAgeVerified">
- Um Zugang zu dieser Parzelle zu erhalten, müssen Sie sich einer Altersprüfung unterziehen.
-Möchten Sie auf der [SECOND_LIFE] Website eine Altersüberprüfung durchführen?
+ Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können. Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=de
</url>
- <usetemplate ignoretext="Auf fehlende Altersprüfung aufmerksam machen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Um Zugang zu dieser Parzelle zu erhalten, müssen Sie Zahlungsinformationen hinterlegt haben.
-Möchten Sie die [SECOND_LIFE] Website öffnen, um diese Angaben zu hinterlegen?
+ Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein. Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=de
</url>
- <usetemplate ignoretext="Auf fehlende Zahlungsinformationen aufmerksam machen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="MissingString">
Der String „[STRING_NAME]“ fehlt in strings.xml
@@ -2334,7 +1955,7 @@ Möchten Sie die [SECOND_LIFE] Website öffnen, um diese Angaben zu hinterlegen?
[FIRST] [LAST] ist offline
</notification>
<notification name="AddSelfFriend">
- Sie können sich nicht selbst als Freund hinzufügen.
+ Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen.
</notification>
<notification name="UploadingAuctionSnapshot">
In-Welt- und Website-Fotos werden hochgeladen...
@@ -2353,11 +1974,10 @@ Möchten Sie die [SECOND_LIFE] Website öffnen, um diese Angaben zu hinterlegen?
Terrain.raw heruntergeladen
</notification>
<notification name="GestureMissing">
- Geste [NAME] fehlt in Datenbank.
+ Hmm. Geste [NAME] fehlt in Datenbank.
</notification>
<notification name="UnableToLoadGesture">
Geste [NAME] konnte nicht geladen werden.
-Bitte versuchen Sie es erneut.
</notification>
<notification name="LandmarkMissing">
Landmarke fehlt in Datenbank.
@@ -2366,14 +1986,14 @@ Bitte versuchen Sie es erneut.
Landmarke konnte nicht geladen werden. Bitte versuchen Sie es erneut.
</notification>
<notification name="CapsKeyOn">
- Die Feststelltaste ist aktiv.
-Da dies Auswirkung auf die Kennworteingabe hat, sollten Sie die Taste besser ausschalten.
+ Die Umschalttaste ist aktiv.
+Dies kann die Eingabe Ihres Passworts beeinflussen.
</notification>
<notification name="NotecardMissing">
Notizkarte fehlt in Datenbank.
</notification>
<notification name="NotecardNoPermissions">
- Unzureichende Rechte zur Anzeige der Notizkarte.
+ Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
</notification>
<notification name="RezItemNoPermissions">
Keine Berechtigung zum Rezzen von Objekten.
@@ -2411,23 +2031,23 @@ Bitte versuchen Sie es erneut.
Bitte versuchen Sie es erneut.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
+ Sie können nur von einem Eigentümer auf einmal Objekte kaufen.
Wählen Sie ein einzelnes Objekt aus.
</notification>
<notification name="ObjectNotForSale">
- Objekt ist nicht zu verkaufen.
+ Dieses Objekt wird nicht verkauft.
</notification>
<notification name="EnteringGodMode">
Gott-Modus aktiviert, Level [LEVEL]
</notification>
<notification name="LeavingGodMode">
- Gott-Modus deaktiviert, Level [LEVEL]
+ Gott-Modus wird nun de-aktiviert, Level [LEVEL]
</notification>
<notification name="CopyFailed">
- Kopieren aufgrund fehlender Kopierrechte fehlgeschlagen
+ Ihnen fehlt die Berechtigung zum Kopieren.
</notification>
<notification name="InventoryAccepted">
- [NAME] hat Ihr Inventarangebot akzeptiert.
+ [NAME] hat Ihr Inventarangebot erhalten.
</notification>
<notification name="InventoryDeclined">
[NAME] hat Ihr Inventarangebot abgelehnt.
@@ -2442,12 +2062,14 @@ Wählen Sie ein einzelnes Objekt aus.
Ihre Visitenkarte wurde abgelehnt.
</notification>
<notification name="TeleportToLandmark">
- Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen.
-Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen.
+ Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Landmarken“ auswählen.
+Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf „Teleport“ unten in der Konsole.
+(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleport“ auswählen).
</notification>
<notification name="TeleportToPerson">
- Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen.
-Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein.
+ Sie können Einwohner wie „[NAME]“ kontaktieren, wenn Sie die Tafel „Leute“ auf der rechten Seite Ihres Bildschirms öffnen.
+Wählen Sie den Einwohner aus der Liste aus und klicken Sie unten auf „IM“.
+(Sie können auch auf den Namen doppelt klicken oder mit rechts auf den Namen klicken und dann „IM“ auswählen).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Land kann nicht über Servergrenzen hinweg ausgewählt werden.
@@ -2457,7 +2079,7 @@ Wählen Sie eine kleinere Landfläche.
Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen.
</notification>
<notification name="NoContentToSearch">
- Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (PG, Mature oder Adult).
+ Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Allgemein, Moderat oder Adult).
</notification>
<notification name="GroupVote">
[NAME] hat eine Abstimmung vorgeschlagen über:
@@ -2470,6 +2092,9 @@ Wählen Sie eine kleinere Landfläche.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Event-Benachrichtigung:
@@ -2494,8 +2119,20 @@ Wählen Sie eine kleinere Landfläche.
[NAMES]
</notification>
<notification name="NoQuickTime">
- Apple QuickTime ist auf Ihrem System anscheinend nicht installiert.
-Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben.
+ AppleQuickTime ist auf Ihrem System anscheinend nicht installiert.
+Laden Sie QuickTime von der [http://www.apple.com/quicktime QuickTime-Webseite] herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben.
+ </notification>
+ <notification name="NoPlugin">
+ Es wurde kein Medien-Plugin gefunden, das &quot;[MIME_TYPE]&quot; ausführen kann. Medien dieses Dateityps sind nicht verfügbar.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Bei folgendem Plugin ist ein Fehler aufgetreten:
+ [PLUGIN]
+
+Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller.
+ <form name="form">
+ <ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert.
@@ -2504,8 +2141,7 @@ Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktim
Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert.
</notification>
<notification name="OtherObjectsReturned2">
- Die Objekte von [FIRST] [LAST] auf dieser
-Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben.
+ Alle Objekte auf der ausgewählten Parzelle, die Einwohner &apos;[NAME]&apos; gehören, wurden an ihren Eigentümern zurückgegeben.
</notification>
<notification name="GroupObjectsReturned">
Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert.
@@ -2515,24 +2151,26 @@ Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht.
<notification name="UnOwnedObjectsReturned">
Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben.
</notification>
+ <notification name="ServerObjectMessage">
+ Nachricht von [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
<notification name="NotSafe">
- Auf diesem Land ist Schaden aktiviert („Unsicher“).
+ Auf diesem Land ist Schaden aktiviert.
Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert.
</notification>
<notification name="NoFly">
- Auf diesem Land ist Fliegen deaktiviert („Fliegen aus“).
+ In diesem Bereich ist das Fliegen deaktiviert.
Fliegen ist hier nicht möglich.
</notification>
<notification name="PushRestricted">
- Auf diesem Land gilt „Kein Stoßen“.
-Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land.
+ In diesem Bereich ist Stoßen nicht erlaubt. Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land.
</notification>
<notification name="NoVoice">
- Auf diesem Land ist Voice deaktiviert.
+ In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören.
</notification>
<notification name="NoBuild">
- Auf diesem Land ist Bauen deaktiviert („Bauen aus“).
-Sie können hier keine Objekte erstellen.
+ In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
</notification>
<notification name="ScriptsStopped">
Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
@@ -2542,8 +2180,8 @@ Sie können hier keine Objekte erstellen.
</notification>
<notification name="NoOutsideScripts">
Auf diesem Land sind externe Skripts deaktiviert
-(„Externe Skripts aus“).
-Nur Skripts, die dem Landeigentümer gehören, funktionieren.
+
+Hier funktionieren nur Skripts, die dem Landeigentümer gehören.
</notification>
<notification name="ClaimPublicLand">
Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden.
@@ -2559,14 +2197,10 @@ Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regione
<notification name="NoTeenGridAccess">
Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen.
</notification>
- <notification name="NoHelpIslandTP">
- Sie können nicht zurück nach Help Island teleportieren.
-Gehen Sie zu „Help Island Public“ und wiederholen sie das Tutorial.
- </notification>
<notification name="ImproperPaymentStatus">
Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor.
</notification>
- <notification name="MustGetAgeRegion">
+ <notification name="MustGetAgeRgion">
Sie müssen alterüberprüft sein, um diese Region betreten zu können.
</notification>
<notification name="MustGetAgeParcel">
@@ -2631,31 +2265,35 @@ Versuchen Sie es in einigen Minuten erneut.
Es konnte keine gültige Parzelle gefunden werden.
</notification>
<notification name="ObjectGiveItem">
- Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
+ Ein Objekt namens [OBJECTFROMNAME] von [NAME_SLURL] hat Ihnen folgendes übergeben [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behalten"/>
<button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
+ Ein Objekt namens [OBJECTFROMNAME] von (einem unbekannten Einwohner) hat Ihnen folgendes übergeben [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behalten"/>
<button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben.
+ [NAME_SLURL] hat Ihnen folgendes [OBJECTTYPE] übergeben:
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Behalten"/>
+ <button name="Show" text="Anzeigen"/>
<button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2667,7 +2305,7 @@ Versuchen Sie es in einigen Minuten erneut.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren:
+ [NAME] hat Ihnen einen Teleport an seine/ihre Position angeboten:
[MESSAGE]
<form name="form">
@@ -2675,6 +2313,9 @@ Versuchen Sie es in einigen Minuten erneut.
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Ein Teleportangebot wurde an [TO_NAME] geschickt
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2694,6 +2335,9 @@ Versuchen Sie es in einigen Minuten erneut.
<button name="Decline" text="Ablehnen"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Sie haben [TO_NAME] die Freundschaft angeboten.
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] bietet Ihnen die Freundschaft an.
@@ -2710,19 +2354,19 @@ Versuchen Sie es in einigen Minuten erneut.
[NAME] hat Ihr Freundschaftsangebot abgelehnt.
</notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] bietet Ihnen eine Visitenkarte an.
-Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen.
+ [FIRST] [LAST] bietet Ihnen ihre/seine Visitenkarte an.
+Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
- Region wird in [MINUTES] Minuten neu gestartet.
+ Diese Region wird in [Minuten] neu gestartet.
Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
</notification>
<notification name="RegionRestartSeconds">
- Region wird in [SECONDS] Sekunden neu gestartet.
+ Diese Region wird in [SECONDS] neu gestartet.
Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
</notification>
<notification name="LoadWebPage">
@@ -2743,7 +2387,7 @@ Von Objekt: [OBJECTNAME], Eigentümer: [NAME]?
[TYPE] namens [DESC] nicht in Datenbank.
</notification>
<notification name="InvalidWearable">
- Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können.
+ Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um dieses Objekt anziehen zu können.
</notification>
<notification name="ScriptQuestion">
Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte:
@@ -2753,14 +2397,14 @@ Ist das OK?
<form name="form">
<button name="Yes" text="Ja"/>
<button name="No" text="Nein"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte:
+ Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte:
[QUESTIONS]
-Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. Klicken Sie für weitere Informationen auf „Info...“.
+Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen.
Anfrage gestatten?
<form name="form">
@@ -2783,40 +2427,20 @@ Anfrage gestatten?
<button name="Ignore" text="Ignorieren"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Sie haben gerade [AMOUNT] L$ erhalten.
-Objekte und andere Benutzer können Ihnen L$ geben.
-Ihren Kontostand sehen Sie in der oberen rechten Ecke des Bildschirms.
- </notification>
- <notification name="FirstBalanceDecrease">
- Sie haben gerade [AMOUNT] L$ bezahlt.
-Ihren Kontostand sehen Sie in der oberen rechten Ecke des Bildschirms.
- </notification>
- <notification name="FirstSit">
- Sie sitzen.
-Benutzen Sie die Pfeil- oder WASD-Tasten, um die Ansicht zu ändern.
-Klicken Sie auf „Aufstehen“, um aufzustehen.
- </notification>
- <notification name="FirstMap">
- Zum Verschieben der Karte klicken und ziehen.
-Zum Teleportieren doppelklicken.
-Nutzen Sie die Optionen links, um Dinge zu finden und um verschiedene Hintergründe anzuzeigen.
- </notification>
- <notification name="FirstBuild">
- In einigen Bereichen von [SECOND_LIFE] können Sie neue Objekte erstellen.
-Verwenden Sie zum Bauen die Werkzeuge oben links.
-Mit den Strg- und Alt-Tasten können Sie schnell zwischen den Werkzeugen umschalten.
-Drücken Sie Esc, um das Bauen abzubrechen.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Die linke Maustaste ermöglicht Objektinteraktionen.
-Der Mauszeiger zeigt eine Hand, wenn Sie
-mit dem Objekt interagieren können.
-Die rechte Maustaste zeigt immer ein Aktionsmenü an.
- </notification>
- <notification name="FirstTeleport">
- Diese Region unterstützt keine direkten Teleports. Sie wurden zum nächstgelegenen Telehub transportiert.
-Ihr Ziel ist mit einem großen roten Strahl markiert. Folgen Sie dem roten Pfeil zum Strahl oder klicken Sie auf den Pfeil, um den Strahl zu entfernen.
+ <notification name="ScriptToast">
+ [FIRST] [LAST]s &apos;[TITLE]&apos; fordert Eingaben vom Benutzer an.
+ <form name="form">
+ <button name="Open" text="Dialog öffnen"/>
+ <button name="Ignore" text="Ignorieren"/>
+ <button name="Block" text="Ignorieren"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Vielen Dank für Ihre Zahlung.
+
+Ihr L$-Kontostand wird aktualisiert, sobald die Bearbeitung abgeschlossen ist. Falls die Bearbeitung länger als 20 min dauert, ist es möglich, dass Ihre Transaktion abgebrochen wird. In diesem Fall wird der Kaufbetrag in US$ auf Ihrem Konto gutgeschrieben.
+
+Der Zahlungsstatus kann auf Ihrer [http://secondlife.com/account/ Startseite] unter Transaktionsübersicht überprüft werden.
</notification>
<notification name="FirstOverrideKeys">
Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert.
@@ -2824,40 +2448,10 @@ Probieren Sie die Pfeil- oder WASD-Tasten aus.
Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden.
Drücken Sie dazu „M“.
</notification>
- <notification name="FirstAppearance">
- Sie bearbeiten gerade Ihr Aussehen.
-Benutzen Sie die Pfeiltasten zum Drehen und Zoomen.
-Klicken Sie auf „Alles speichern“, wenn Sie fertig sind, um Ihr Aussehen zu speichern.
-Sie können Ihr Aussehen jederzeit verändern.
- </notification>
- <notification name="FirstInventory">
- Ihr Inventar. Es enthält Objekte, Notizkarten, Kleidung und andere Dinge in Ihrem Besitz.
-* Zum Anziehen eines Objekts oder Outfit-Ordners ziehen Sie es/ihn auf sich.
-* Um ein Objekt in der Welt abzulegen, ziehen Sie es auf den Boden.
-* Zum Lesen einer Notizkarte klicken Sie sie doppelt an.
- </notification>
<notification name="FirstSandbox">
- Dies ist eine Sandkastenregion.
-Objekte, die Sie hier bauen, können gelöscht werden, wenn Sie das Gebiet verlassen. Sandkästen werden regelmäßig gereinigt. Weitere Informationen hierzu finden Sie oben im Bild neben dem Regionsnamen.
+ Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden.
-Sandkastenregionen kommen selten vor und sind entsprechend gekennzeichnet.
- </notification>
- <notification name="FirstFlexible">
- Dieses Objekt ist flexibel.
-Ein flexibles Objekt ist ein Phantom und nicht physisch, bis die Option „Flexibel“ deaktiviert wurde.
- </notification>
- <notification name="FirstDebugMenus">
- Sie haben das Advanced-Menü aktiviert.
-Dieses Menü enthält nützliche Funktionen zum Debuggen von [SECOND_LIFE].
-Drücken Sie in Windows Strg+Alt+D (Mac: &#8997;&#8984;D) zum Ein- und Ausschalten dieses Menüs.
- </notification>
- <notification name="FirstSculptedPrim">
- Sie bearbeiten ein geformtes Primitiv.
-Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert.
-Beispiele für Formtexturen finden Sie in der Inventarbibliothek.
- </notification>
- <notification name="FirstMedia">
- Sie haben die Medienwiedergabe gestartet. Unter „Audio und Video“ im Fenster „Einstellungen“ können Sie festlegen, dass Medien automatisch wiedergegeben werden. Beachten Sie, dass dies bei nicht vertrauenswürdigen Medienseiten ein Sicherheitsrisiko darstellen kann.
+Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern.
</notification>
<notification name="MaxListSelectMessage">
Sie können maximal [MAX_SELECT] Objekte
@@ -2865,47 +2459,47 @@ von der Liste auswählen.
</notification>
<notification name="VoiceInviteP2P">
[NAME] lädt Sie zu einem Voice-Chat ein.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
+Klicken Sie auf &apos;Akzeptieren &apos;, um dem Gespräch beizutreten, oder auf &apos;Ablehnen &apos;, um die Einladung auszuschlagen. Klicken Sie auf Ignorieren, um diesen Anrufer zu ignorieren.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben.
+ [FIRST] [LAST] hat eine Benachrichtigung erhalten und wird nicht länger ignoriert.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben.
+ [FIRST] [LAST] wurde bezahlt und wird nicht länger ignoriert.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben.
+ [FIRST] [LAST] wurde Inventar angeboten und wird nicht länger ignoriert.
</notification>
<notification name="VoiceInviteGroup">
[NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
+Klicken Sie auf &apos;Akzeptieren &apos;, um dem Gespräch beizutreten, oder auf &apos;Ablehnen &apos;, um die Einladung auszuschlagen. Klicken Sie auf Ignorieren, um diesen Anrufer zu ignorieren.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] ist einem Voice-Konferenz-Chat beigetreten.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
+ [NAME] ist einem Voice-Chat mit Konferenzschaltung beigetreten.
+Klicken Sie auf &apos;Akzeptieren &apos;, um dem Gespräch beizutreten, oder auf &apos;Ablehnen &apos;, um die Einladung auszuschlagen. Klicken Sie auf Ignorieren, um diesen Anrufer zu ignorieren.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="InviteAdHoc">
[NAME] lädt Sie zu einem Konferenz-Chat ein.
-Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
+Klicken Sie auf &apos;Akzeptieren &apos;, um dem Chat beizutreten, oder auf &apos;Ablehnen &apos;, um die Einladung auszuschlagen. Klicken Sie auf Ignorieren, um diesen Anrufer zu ignorieren.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
- <button name="Mute" text="Stummschalten"/>
+ <button name="Mute" text="Ignorieren"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -2915,25 +2509,25 @@ Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen
Es tut uns Leid. Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht. Bitte versuchen Sie es in einem anderen Gebiet.
</notification>
<notification name="VoiceChannelDisconnected">
- Sie haben [VOICE_CHANNEL_NAME] verlassen. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+ Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] hat das Gespräch beendet. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+ [VOICE_CHANNEL_NAME] hat den Anruf beendet. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+ [VOICE_CHANNEL_NAME] hat ihren Anruf abgelehnt. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+ [VOICE_CHANNEL_NAME] kann Ihren Anruf nicht entgegennehmen. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
</notification>
<notification name="VoiceChannelJoinFailed">
- Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+ Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
</notification>
<notification name="VoiceLoginRetry">
Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment.
</notification>
<notification name="Cannot enter parcel: not a group member">
- Zugang zur Parzelle verweigert, Sie gehören keiner berechtigten Gruppe an.
+ Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
</notification>
<notification name="Cannot enter parcel: banned">
Zugang zur Parzelle verweigert. Sie wurden verbannt.
@@ -2948,10 +2542,54 @@ Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen
Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut.
</notification>
<notification name="ServerVersionChanged">
- Die Region, die Sie betreten haben, verwendet eine andere Simulatorversion. Klicken Sie auf diese Nachricht, um weitere Informationen zu erhalten.
+ Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. [[URL] Versionshinweise anzeigen.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt.
+ </notification>
+ <notification name="BlockedSLURL">
+ Ein untrusted Browser hat eine SLurl geschickt, diese wurde sicherheitshalber gesperrt.
</notification>
- <notification name="UnableToOpenCommandURL">
- Die URL, die Sie angeklickt haben, kann in diesem Web Browser nicht geöffnet werden.
+ <notification name="ThrottledSLURL">
+ Innerhalb kurzer Zeit wurden von einem untrusted Browser mehrere SLurls erhalten.
+Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Antworten"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Möchten Sie wirklich alle IMs schließen?
+ <usetemplate name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Der Anhang wurde gespeichert.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Hilfethema für dieses Element wurde nicht gefunden.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Serverfehler: Medienaktualisierung oder Fehler
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Sie wurden vom Moderator stummgeschaltet.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Sie wurden vom Moderator stummgeschaltet.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Möchten Sie Ihre Teleport-Liste löschen?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Die ausgewählte Schaltfläche kann zur Zeit nicht angezeigt werden.
+Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
</notification>
<global name="UnsupportedCPU">
- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
@@ -2959,7 +2597,7 @@ Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen
<global name="UnsupportedGLRequirements">
Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem.
-Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter: http://www.secondlife.com/support
+Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -2973,10 +2611,8 @@ Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter: http://
<global name="UnsupportedRAM">
- Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen.
</global>
- <global name="PermYes">
- Ja
- </global>
- <global name="PermNo">
- Nein
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Wenn Sie ein Stück Land besitzen, können Sie dies als Ihr Zuhause festlegen.
+Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/de/panel_active_object_row.xml b/indra/newview/skins/default/xui/de/panel_active_object_row.xml
new file mode 100644
index 0000000000..00de705a30
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Unbekanntes Objekt
+ </string>
+ <text name="object_name">
+ Unbenanntes Objekt
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_activeim_row.xml b/indra/newview/skins/default/xui/de/panel_activeim_row.xml
new file mode 100644
index 0000000000..84272752cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_activeim_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="contact_name">
+ Grumpity ProductEngine
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..6ad18781f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Anrufen" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Anruf beenden" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..0715175dd9
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]min
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]W
+ </string>
+ <string name="FormatMonths">
+ [COUNT]M
+ </string>
+ <string name="FormatYears">
+ [COUNT]J
+ </string>
+ <text name="avatar_name" value="Unbekannt"/>
+ <text name="last_interaction" value="0s"/>
+ <button name="profile_btn" tool_tip="Profil anzeigen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_avatar_tag.xml b/indra/newview/skins/default/xui/de/panel_avatar_tag.xml
new file mode 100644
index 0000000000..09f930ec01
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ Zwölf große Boxkämpfer jagen Viktor quer über den großen Sylter Deich.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..2d140515d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel" width="300">
+ <text left_pad="5" name="title_text" width="260">
+ Liste der ignorierten Einwohner
+ </text>
+ <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/>
+ <button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/>
+ <button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/>
+ <button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray.xml b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
new file mode 100644
index 0000000000..d3f89b0ad3
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Schaltet Mikrofon ein/aus
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Voice-Chat-Steuerung anzeigen/ausblenden
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Bewegen" name="movement_btn" tool_tip="Bewegungssteuerung anzeigen/ausblenden"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Foto machen"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="IMs"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Benachrichtigungen"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..9c84105254
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_chat_header.xml b/indra/newview/skins/default/xui/de/panel_chat_header.xml
new file mode 100644
index 0000000000..babbff3132
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_chat_header.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text_editor name="user_name" value="Ericag Vader"/>
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_classified_info.xml b/indra/newview/skins/default/xui/de/panel_classified_info.xml
new file mode 100644
index 0000000000..d824eff338
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_classified_info.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Moderat
+ </panel.string>
+ <panel.string name="type_pg">
+ Allgemeiner Inhalt
+ </panel.string>
+ <panel.string name="l$_price">
+ [PRICE] L$
+ </panel.string>
+ <text name="title" value="Anzeigen-Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text_editor name="classified_location" value="[wird geladen...]"/>
+ <text_editor name="content_type" value="[Inhalts-Art]"/>
+ <text_editor name="category" value="[Kategorie]"/>
+ <check_box label="Jede Woche automatisch erneuern" name="auto_renew"/>
+ <text_editor name="price_for_listing" tool_tip="Preis für Anzeige."/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Karte" name="show_on_map_btn"/>
+ <button label="Bearbeiten" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
new file mode 100644
index 0000000000..b6c53be778
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel" width="320">
+ <panel name="avatar_alpha_color_panel" width="300">
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="66"/>
+ <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="72"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_classified.xml b/indra/newview/skins/default/xui/de/panel_edit_classified.xml
new file mode 100644
index 0000000000..2e0370c579
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_classified.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Anzeige bearbeiten" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (wird nach Speichern aktualisiert)
+ </panel.string>
+ <text name="title">
+ Anzeige bearbeiten
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <text name="Name:">
+ Titel:
+ </text>
+ <text name="description_label">
+ Beschreibung:
+ </text>
+ <text name="location_label">
+ Standort:
+ </text>
+ <text name="classified_location">
+ wird geladen...
+ </text>
+ <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/>
+ <combo_box name="content_type">
+ <combo_item name="mature_ci">
+ Moderater Inhalt
+ </combo_item>
+ <combo_item name="pg_ci">
+ Allgemeiner Inhalt
+ </combo_item>
+ </combo_box>
+ <spinner label="L$" name="price_for_listing" tool_tip="Preis für Anzeige." value="50"/>
+ <check_box label="Jede Woche automatisch erneuern" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Speichern" name="save_changes_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_eyes.xml b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml
new file mode 100644
index 0000000000..31251ed48f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Augen"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
new file mode 100644
index 0000000000..2d11befbfd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Handschuhe"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_hair.xml b/indra/newview/skins/default/xui/de/panel_edit_hair.xml
new file mode 100644
index 0000000000..d255b1c16c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Textur" name="Texture" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Farbe"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Augenbrauen"/>
+ <accordion_tab name="hair_facial_tab" title="Gesicht"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
new file mode 100644
index 0000000000..3752faf48a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jacke"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pants.xml b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
new file mode 100644
index 0000000000..1ff439dc26
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Hose"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
new file mode 100644
index 0000000000..0cb14177af
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Auswahl bearbeiten" name="panel_edit_pick">
+ <text name="title">
+ Auswahl bearbeiten
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <text name="Name:">
+ Titel:
+ </text>
+ <text name="description_label">
+ Beschreibung:
+ </text>
+ <text name="location_label">
+ Standort:
+ </text>
+ <text name="pick_location">
+ wird geladen...
+ </text>
+ <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="[WHAT] speichern" name="save_changes_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
index 1f67e0231d..bf74abaeba 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
@@ -1,45 +1,59 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Einwohner" />
- <string name="AcctTypeTrial"
- value="Test" />
- <string name="AcctTypeCharterMember"
- value="Charta-Mitglied" />
- <string name="AcctTypeEmployee"
- value="Linden Lab-Mitarbeiter" />
- <string name="PaymentInfoUsed"
- value="Zahlungsinfo verwendet" />
- <string name="PaymentInfoOnFile"
- value="Zahlungsinfo archiviert" />
- <string name="NoPaymentInfoOnFile"
- value="Keine Zahlungsinfo archiviert" />
- <string name="AgeVerified"
- value="Altersgeprüft" />
- <string name="NotAgeVerified"
- value="Nicht altersgeprüft" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=de
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Antwort für Beschäftigt-Modus:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil bearbeiten" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Einwohner"/>
+ <string name="AcctTypeTrial" value="Test"/>
+ <string name="AcctTypeCharterMember" value="Charta-Mitglied"/>
+ <string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/>
+ <string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/>
+ <string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/>
+ <string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/>
+ <string name="AgeVerified" value="Altersgeprüft"/>
+ <string name="NotAgeVerified" value="Nicht altersgeprüft"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=de
+ </string>
+ <string name="my_account_link_url">
+ http://de.secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Keiner"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Echtes Leben:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <text name="title_homepage_text">
+ Webseite:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Mein Konto:"/>
+ <text_editor name="acc_status_text" value="Einwohner. Keine Zahlungsinfo archiviert."/>
+ <text name="my_account_link" value="[[URL] Meine Startseite aufrufen]"/>
+ <text name="title_partner_text" value="Mein Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] bearbeiten]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Änderungen speichern" name="save_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shape.xml b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
new file mode 100644
index 0000000000..37be3c1d90
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Geschlecht:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="weiblich" name="radio"/>
+ <radio_item label="Männlich" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Körper"/>
+ <accordion_tab name="shape_head_tab" title="Kopf"/>
+ <accordion_tab name="shape_eyes_tab" title="Augen"/>
+ <accordion_tab name="shape_ears_tab" title="Ohren"/>
+ <accordion_tab name="shape_nose_tab" title="Nase"/>
+ <accordion_tab name="shape_mouth_tab" title="Mund"/>
+ <accordion_tab name="shape_chin_tab" title="Kinn"/>
+ <accordion_tab name="shape_torso_tab" title="Oberkörper"/>
+ <accordion_tab name="shape_legs_tab" title="Beine"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
new file mode 100644
index 0000000000..6025606777
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Hemd"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
new file mode 100644
index 0000000000..15e8a21dd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Schuhe"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skin.xml b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
new file mode 100644
index 0000000000..46bd1d9f4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Kopftattoo" name="Head Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Hautfarbe"/>
+ <accordion_tab name="skin_face_tab" title="Gesichtsdetails"/>
+ <accordion_tab name="skin_makeup_tab" title="Make-Uup"/>
+ <accordion_tab name="skin_body_tab" title="Körperdetails"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
new file mode 100644
index 0000000000..4fa9126c37
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Rock"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_socks.xml b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
new file mode 100644
index 0000000000..c2ecad8642
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Socken"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..12649e9251
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
new file mode 100644
index 0000000000..4484068c1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Unterhose"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..847f806fce
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Unterhemd"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
new file mode 100644
index 0000000000..c3ffb2f353
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Tragbar" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Form bearbeiten
+ </string>
+ <string name="edit_skin_title">
+ Skin (Haut) bearbeiten
+ </string>
+ <string name="edit_hair_title">
+ Haare bearbeiten
+ </string>
+ <string name="edit_eyes_title">
+ Augen bearbeiten
+ </string>
+ <string name="edit_shirt_title">
+ Hemd bearbeiten
+ </string>
+ <string name="edit_pants_title">
+ Hosen bearbeiten
+ </string>
+ <string name="edit_shoes_title">
+ Schuhe bearbeiten
+ </string>
+ <string name="edit_socks_title">
+ Strümpfe bearbeiten
+ </string>
+ <string name="edit_jacket_title">
+ Jacke bearbeiten
+ </string>
+ <string name="edit_skirt_title">
+ Rock bearbeiten
+ </string>
+ <string name="edit_gloves_title">
+ Handschuhe bearbeiten
+ </string>
+ <string name="edit_undershirt_title">
+ Unterhemd bearbeiten
+ </string>
+ <string name="edit_underpants_title">
+ Unterhose bearbeiten
+ </string>
+ <string name="edit_alpha_title">
+ Alpha-Maske bearbeiten
+ </string>
+ <string name="edit_tattoo_title">
+ Tätowierung bearbeiten
+ </string>
+ <string name="shape_desc_text">
+ Form:
+ </string>
+ <string name="skin_desc_text">
+ Haut:
+ </string>
+ <string name="hair_desc_text">
+ Haare:
+ </string>
+ <string name="eyes_desc_text">
+ Augen:
+ </string>
+ <string name="shirt_desc_text">
+ Hemd:
+ </string>
+ <string name="pants_desc_text">
+ Hose:
+ </string>
+ <string name="shoes_desc_text">
+ Schuhe:
+ </string>
+ <string name="socks_desc_text">
+ Socken:
+ </string>
+ <string name="jacket_desc_text">
+ Jacke:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Rock:
+ </string>
+ <string name="gloves_desc_text">
+ Handschuhe:
+ </string>
+ <string name="undershirt_desc_text">
+ Unterhemd:
+ </string>
+ <string name="underpants_desc_text">
+ Unterhose:
+ </string>
+ <string name="alpha_desc_text">
+ Alpha-Maske:
+ </string>
+ <string name="tattoo_desc_text">
+ Tätowierung:
+ </string>
+ <text name="edit_wearable_title" value="Form bearbeiten"/>
+ <panel label="Hemd" name="wearable_type_panel">
+ <text name="description_text" value="Form:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Speichern unter" name="save_as_button"/>
+ <button label="Zurücksetzen" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_friends.xml b/indra/newview/skins/default/xui/de/panel_friends.xml
index bb2adb36fe..50013a2b24 100644
--- a/indra/newview/skins/default/xui/de/panel_friends.xml
+++ b/indra/newview/skins/default/xui/de/panel_friends.xml
@@ -1,41 +1,31 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Mehrere Freunde...
+ Mehrere Freunde
</string>
- <scroll_list name="friend_list"
- tool_tip="Halten Sie die Tasten „Umschalt“ oder „Strg“ gedrückt, um durch Klicken mehrere Freunde auszuwählen.">
- <column name="icon_online_status" tool_tip="Online-Status" />
- <column label="Name" name="friend_name" tool_tip="Name" />
- <column name="icon_visible_online" tool_tip="Freund kann sehen, wenn Sie online sind" />
- <column name="icon_visible_map" tool_tip="Freund kann Sie auf der Karte finden" />
- <column name="icon_edit_mine"
- tool_tip="Freunde können Objekte bearbeiten, löschen und an sich nehmen" />
- <column name="icon_edit_theirs"
- tool_tip="Sie können die Objekte dieses Freunds bearbeiten" />
+ <scroll_list name="friend_list" tool_tip="Halten Sie die Tasten „Umschalt“ oder „Strg“ gedrückt, um durch Klicken mehrere Freunde auszuwählen.">
+ <column name="icon_online_status" tool_tip="Online-Status"/>
+ <column label="Name" name="friend_name" tool_tip="Name"/>
+ <column name="icon_visible_online" tool_tip="Freund kann sehen, wenn Sie online sind"/>
+ <column name="icon_visible_map" tool_tip="Freund kann Sie auf der Karte finden"/>
+ <column name="icon_edit_mine" tool_tip="Freunde können Objekte bearbeiten, löschen und an sich nehmen"/>
+ <column name="icon_edit_theirs" tool_tip="Sie können die Objekte dieses Freunds bearbeiten"/>
</scroll_list>
<panel name="rights_container">
<text name="friend_name_label">
Wählen Sie den/die Freund(e) aus, dessen/deren Rechte Sie ändern möchten...
</text>
- <check_box label="Kann meinen Online-Status sehen" name="online_status_cb"
- tool_tip="Festlegen, ob dieser Freund meinen Online-Status auf seiner Freundesliste oder Visitenkarte einsehen kann" />
- <check_box label="Kann mich auf der Weltkarte sehen" name="map_status_cb"
- tool_tip="Festlegen, ob dieser Freund auf seiner Karte meinen Standort sehen kann" />
- <check_box label="Kann meine Objekte verändern" name="modify_status_cb"
- tool_tip="Festlegen, ob dieser Freund meine Objekte verändern kann" />
+ <check_box label="Kann meinen Online-Status sehen" name="online_status_cb" tool_tip="Festlegen, ob dieser Freund meinen Online-Status auf seiner Freundesliste oder Visitenkarte einsehen kann"/>
+ <check_box label="Kann mich auf der Weltkarte sehen" name="map_status_cb" tool_tip="Festlegen, ob dieser Freund auf seiner Karte meinen Standort sehen kann"/>
+ <check_box label="Kann meine Objekte verändern" name="modify_status_cb" tool_tip="Festlegen, ob dieser Freund meine Objekte verändern kann"/>
<text name="process_rights_label">
Rechte werden geändert...
</text>
</panel>
- <button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung" />
- <button label="Profil" name="profile_btn"
- tool_tip="Bilder, Gruppen und andere Informationen anzeigen" />
- <button label="Teleport" name="offer_teleport_btn"
- tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an" />
- <button label="Zahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben" />
- <button label="Entfernen" name="remove_btn"
- tool_tip="Diese Person von Ihrer Freundesliste entfernen" />
- <button label="Hinzufügen" name="add_btn"
- tool_tip="Bieten Sie einem Einwohner die Freundschaft an" />
+ <button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung"/>
+ <button label="Profil" name="profile_btn" tool_tip="Bilder, Gruppen und andere Informationen anzeigen"/>
+ <button label="Teleportieren" name="offer_teleport_btn" tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an"/>
+ <button label="Bezahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/>
+ <button label="Entfernen" name="remove_btn" tool_tip="Diese Person von Ihrer Freundesliste entfernen"/>
+ <button label="Hinzufügen" name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_control_panel.xml b/indra/newview/skins/default/xui/de/panel_group_control_panel.xml
new file mode 100644
index 0000000000..9cb72fafff
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Gruppenprofil" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Gruppe anrufen" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Anruf beenden" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_general.xml b/indra/newview/skins/default/xui/de/panel_group_general.xml
index 2acc9e0649..0d3c082a16 100644
--- a/indra/newview/skins/default/xui/de/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_general.xml
@@ -1,72 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Allgemein" name="general_tab">
- <string name="help_text">
- Die Registerkarte „Allgemein“ enthält Informationen über diese Gruppe, eine Liste der Eigentümer und sichtbaren Mitglieder, allgemeine Gruppeneinstellungen und Mitgliederoptionen.
+ <panel.string name="help_text">
+ Die Registerkarte Allgemein enthält allgemeine Informationen über diese Gruppe, eine Liste der Mitglieder, allgemeine Gruppeneinstellungen und Mitgliederoptionen.
Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen.
- </string>
- <string name="group_info_unchanged">
+ </panel.string>
+ <panel.string name="group_info_unchanged">
Die allgemeine Gruppeninfo wurde geändert.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Neuen Gruppennamen hier eingeben" name="group_name_editor"/>
- <text name="group_name">
- Neuen Gruppennamen hier eingeben
- </text>
- <text name="prepend_founded_by">
- Gegründet von
- </text>
- <text left_delta="79" name="founder_name">
- (wartet)
- </text>
- <text name="group_charter_label">
- Gruppencharta
- </text>
- <texture_picker label="Gruppeninsignien" name="insignia" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Mitgliedsdaten werden abgerufen
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <text name="prepend_founded_by">
+ Gründer:
+ </text>
+ <name_box initial_value="(wird in Datenbank gesucht)" name="founder_name"/>
+ <text name="join_cost_text">
+ Kostenlos
+ </text>
+ <button label="JETZT BEITRETEN!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Gruppencharta
</text_editor>
- <button label="Beitreten (0 L$)" label_selected="Beitreten (0 L$)" name="join_button"/>
- <button label="Detailansicht" label_selected="Detailansicht" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Eigentümer und sichtbare Mitglieder
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Eigentümer werden fettgedruckt angezeigt)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Mitgliedsname" name="name" relwidth="0.40"/>
+ <name_list.columns label="Mitglied" name="name" relwidth="0.40"/>
<name_list.columns label="Titel" name="title" relwidth="0.25"/>
- <name_list.columns label="Letzte Anmeldung" name="online" relwidth="0.35"/>
+ <name_list.columns label="Status" name="status"/>
</name_list>
- <text name="text_group_preferences">
- Gruppeneinstellungen
+ <text name="my_group_settngs_label">
+ Ich
</text>
+ <text name="active_title_label">
+ Mein Titel:
+ </text>
+ <combo_box name="active_title" tool_tip="Legt fest, was im Namensschild Ihres Avatars angezeigt wird, wenn diese Gruppe aktiviert ist."/>
+ <check_box label="Gruppenmitteilungen erhalten" name="receive_notices" tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."/>
+ <check_box label="In meinem Profil anzeigen" name="list_groups_in_profile" tool_tip="Steuert, ob diese Gruppe in Ihrem Profil angezeigt wird"/>
<panel name="preferences_container">
- <check_box label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen."/>
- <check_box label="Registrierung offen" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/>
- <check_box label="Beitrittsgebühr:" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen."/>
- <spinner name="spin_enrollment_fee" tool_tip="Wenn „Beitrittsgebühr“ aktiviert ist, müssen neue Mitglieder diesen Betrag zahlen."/>
- <combo_box name="group_mature_check" tool_tip="Festlegen, ob die Informationen Ihrer Gruppe „Mature“ sind.">
- <combo_box.item name="select_mature" label="- Mature wählen -"/>
- <combo_box.item name="mature" label="Mature-Inhalt"/>
- <combo_box.item name="pg" label="PG-Inhalt"/>
+ <text name="group_settngs_label">
+ Gruppe
+ </text>
+ <check_box label="Jeder kann beitreten" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/>
+ <check_box label="Kosten für Beitritt" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Wenn Beitrittsgebühr aktiviert ist, müssen neue Mitglieder diesen Betrag zahlen."/>
+ <combo_box name="group_mature_check" tool_tip="Legt fest, ob Ihre Gruppeninformation moderate Inhalte enthält">
+ <combo_box.item label="Allgemeiner Inhalt" name="pg"/>
+ <combo_box.item label="Moderater Inhalt" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mein aktiver Titel
- </text>
- <combo_box name="active_title" tool_tip="Legt fest, was im Namensschild Ihres Avatars angezeigt wird, wenn diese Gruppe aktiviert ist."/>
- </panel>
- <check_box label="Gruppenmitteilungen erhalten" name="receive_notices" tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."/>
- <check_box label="Gruppe im Profil anzeigen" name="list_groups_in_profile" tool_tip="Steuert, ob diese Gruppe in Ihrem Profil angezeigt wird"/>
+ <check_box initial_value="true" label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen"/>
</panel>
- <string name="incomplete_member_data_str">
- Mitgliedsdaten werden abgerufen
- </string>
- <string name="confirm_group_create_str">
- Die Gründung dieser Gruppe kostet 100 L$.
-Sind Sie wirklich, WIRKLICH sicher, dass Sie 100 L$ für die Gründung dieser Gruppe ausgeben möchten?
-Falls in den nächsten 48 Stunden niemand sonst dieser Gruppe beitritt, wird sie aufgelöst und der Name der Gruppe wird nicht mehr verfügbar sein.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..b89e4f90de
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Gruppenprofil" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Diese Änderungen wurden nicht gespeichert.
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Möchten Sie diese Änderungen speichern?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Beitreten ([AMOUNT]L$)
+ </panel.string>
+ <panel.string name="group_join_free">
+ Kostenlos
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="(wird geladen...)"/>
+ <line_editor label="Neuen Gruppennamen hier eingeben" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Allgemein"/>
+ <accordion_tab name="group_roles_tab" title="Rollen"/>
+ <accordion_tab name="group_notices_tab" title="Mitteilungen"/>
+ <accordion_tab name="group_land_tab" title="Land/Kapital"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Gruppe anrufen" name="btn_call" tool_tip="Diese Gruppe anrufen"/>
+ <button label="Speichern" label_selected="Speichern" name="btn_apply"/>
+ <button label="Gruppe erstellen" name="btn_create" tool_tip="Neue Gruppe erstellen"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml
index 84ba91a63f..fb357093bb 100644
--- a/indra/newview/skins/default/xui/de/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml
@@ -1,29 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mitglied einladen" name="invite_panel">
- <text name="help_text">
- Sie können mehrere Einwohner in Ihre
-Gruppe einladen. Klicken Sie hierzu
-auf „Einwohnerliste öffnen“.
- </text>
- <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
- <name_list name="invitee_list"
- tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Einwohnernamen." />
- <button label="Auswahl aus Liste löschen" name="remove_button"
- tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen." />
- <text>
- Wählen Sie eine Rolle aus:
+ <panel.string name="confirm_invite_owner_str">
+ Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden!
+ </panel.string>
+ <panel.string name="loading">
+ (wird geladen...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
+ </panel.string>
+ <text name="help_text" top="10">
+ Sie können mehrere Einwohner auswählen, um diese in Ihre Gruppe einzuladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
</text>
+ <button label="Einwohnerliste öffnen" name="add_button" tool_tip="" top_delta="62"/>
+ <name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>
+ <button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/>
<text name="role_text">
Wählen Sie eine Rolle aus:
</text>
- <combo_box name="role_name"
- tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen." />
- <button label="Einladungen versenden" name="ok_button" />
- <button label="Abbrechen" name="cancel_button" />
- <string name="confirm_invite_owner_str">
- Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden!
+ <combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/>
+ <button label="Einladungen versenden" name="ok_button" width="136"/>
+ <button label="Abbrechen" name="cancel_button" width="66"/>
+ <string name="GroupInvitation">
+ Gruppeneinladung
</string>
- <text name="loading">
- (wird geladen...)
- </text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index bc39a3a1bb..0c89946987 100644
--- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -1,171 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Land und L$" name="land_money_tab">
- <string name="help_text">
- Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ <panel.string name="help_text">
+ Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
Wird geladen...
- </string>
- <text name="group_land_heading">
- Land in Gruppenbesitz
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parzellenname" name="name"/>
- <column label="Region" name="location"/>
- <column label="Typ" name="type"/>
- <column label="Gebiet" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/>
- <text name="total_contributed_land_label">
- Gesamtbeitrag:
- </text>
- <text name="total_contributed_land_value">
- [AREA] qm
- </text>
- <text name="total_land_in_use_label">
- Insgesamt verwendetes Land:
- </text>
- <text name="total_land_in_use_value">
- [AREA] qm
- </text>
- <text name="land_available_label">
- Land verfügbar:
- </text>
- <text name="land_available_value">
- [AREA] qm
- </text>
- <text name="your_contribution_label">
- Ihr Beitrag:
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
Ihr Landbeitrag kann nicht festgelegt werden.
- </string>
- <text name="your_contribution_units">
- ( qm )
- </text>
- <text name="your_contribution_max_value">
- (max. [AMOUNT])
- </text>
- <text name="group_over_limit_text">
- Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann.
- </text>
- <text name="group_money_heading">
- Gruppen-L$
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parzelle" name="name"/>
+ <scroll_list.columns label="Region" name="location"/>
+ <scroll_list.columns label="Typ" name="type"/>
+ <scroll_list.columns label="Gebiet" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Gesamtbeitrag:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m².
+ </text>
+ <button label="Karte" label_selected="Karte" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Insgesamt genutztes Land:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m².
+ </text>
+ <text name="land_available_label">
+ Land verfügbar:
+ </text>
+ <text name="land_available_value">
+ [AREA] m².
+ </text>
+ <text name="your_contribution_label">
+ Ihr Beitrag:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max.)
+ </text>
+ <text name="group_over_limit_text">
+ Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich.
+ </text>
+ <text name="group_money_heading">
+ Gruppen-L$
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
- <panel label="Planung" name="group_money_planning_tab">
+ <panel label="PLANUNG" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Wird berechnet...
+ Wird geladen...
</text_editor>
</panel>
- <panel label="Details" name="group_money_details_tab">
+ <panel label="DETAILS" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Wird berechnet...
+ Wird geladen...
</text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
+ <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Hinten"/>
+ <button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter"/>
</panel>
- <panel label="Verkäufe" name="group_money_sales_tab">
+ <panel label="VERKAUF" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Wird berechnet...
+ Wird geladen...
</text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
+ <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Hinten"/>
+ <button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter"/>
</panel>
</tab_container>
</panel>
-
-<!--
-
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land und L$" name="land_money_tab">
- <string name="help_text">
- Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
- </string>
- <string name="cant_view_group_accounting_text">
- Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
- </string>
- <string name="loading_txt">
- Wird geladen...
- </string>
- <text name="group_land_heading">
- Land in Gruppenbesitz
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parzellenname" name="name"/>
- <column label="Region" name="location"/>
- <column label="Typ" name="type"/>
- <column label="Gebiet" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/>
- <text name="total_contributed_land_label">
- Gesamtbeitrag:
- </text>
- <text name="total_contributed_land_value">
- [AREA] qm
- </text>
- <text name="total_land_in_use_label">
- Insgesamt verwendetes Land:
- </text>
- <text name="total_land_in_use_value">
- [AREA] qm
- </text>
- <text name="land_available_label">
- Land verfügbar:
- </text>
- <text name="land_available_value">
- [AREA] qm
- </text>
- <text name="your_contribution_label">
- Ihr Beitrag:
- </text>
- <string name="land_contrib_error">
- Ihr Landbeitrag kann nicht festgelegt werden.
- </string>
- <text name="your_contribution_max_value">
- qm (max. [AMOUNT])
- </text>
- <text name="group_over_limit_text">
- Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
-das verwendete Land gehalten werden kann.
- </text>
- <text name="group_money_heading">
- Gruppen-L$
- </text>
- <tab_container name="group_money_tab_container">
- <panel label="Planung" name="group_money_planning_tab">
- <text_editor name="group_money_planning_text">
- Wird berechnet...
- </text_editor>
- </panel>
- <panel label="Details" name="group_money_details_tab">
- <text_editor name="group_money_details_text">
- Wird berechnet...
- </text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
- </panel>
- <panel label="Verkäufe" name="group_money_sales_tab">
- <text_editor name="group_money_sales_text">
- Wird berechnet...
- </text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
- </panel>
- </tab_container>
-</panel>
-
--->
diff --git a/indra/newview/skins/default/xui/de/panel_group_list_item.xml b/indra/newview/skins/default/xui/de/panel_group_list_item.xml
new file mode 100644
index 0000000000..d097a2b18c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Unbekannt"/>
+ <button name="profile_btn" tool_tip="Profil anzeigen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index ff6f957a73..cc5664bd97 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -1,43 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mitteilungen" name="notices_tab">
- <text name="help_text">
- Mitteilungen sind eine schnelle Möglichkeit,
-Mitglieder auf dem Laufenden zu halten und
-Objekte im Anhang zu versenden. Mitteilungen werden
-nur an Mitglieder mit einer entsprechenden Rolle
-gesendet. Mitteilungen können unter
-„Allgemein“ ausgeschaltet werden.
- </text>
- <text name="no_notices_text">
+ <panel.string name="help_text">
+ Mit Mitteilungen können Sie eine Nachricht und auch einen Anhang versenden.
+Mitteilungen werden nur an Gruppenmitglieder verschickt, deren Rolle es zulässt, dass sie Mitteilungen empfangen.
+Sie können auf der Registerkarte „Allgemein“ wählen, ob Sie Mitteilungen empfangen möchten.
+ </panel.string>
+ <panel.string name="no_notices_text">
Keine älteren Mitteilungen.
- </text>
- <button label="?" label_selected="?" name="help_button" />
- <text name="lbl">
- Gruppenmitteilungsarchiv
- </text>
+ </panel.string>
<text name="lbl2">
- Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
+ Mitteilungen werden 14 Tage lang aufbewahrt.
+Maximal 200 pro Gruppe täglich
</text>
<scroll_list name="notice_list">
- <column label="" name="icon" />
- <column label="Thema" name="subject" />
- <column label="Von" name="from" />
- <column label="Datum" name="date" />
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="Thema" name="subject"/>
+ <scroll_list.columns label="Von" name="from"/>
+ <scroll_list.columns label="Datum" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
Nicht gefunden.
</text>
- <button label="Neue Mitteilung" label_selected="Neue Mitteilung"
- name="create_new_notice" />
- <button label="Aktualisieren" label_selected="Liste aktualisieren"
- name="refresh_notices" />
+ <button label="Neue Mitteilung erstellen" label_selected="Neue Mitteilung" name="create_new_notice" tool_tip="Neue Mitteilung erstellen"/>
+ <button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices" tool_tip="Mitteilungsliste aktualisieren"/>
<panel label="Neue Mitteilung" name="panel_create_new_notice">
<text name="lbl">
Mitteilung schreiben
</text>
- <text name="lbl2">
- Sie können der Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar in dieses Feld ziehen. Angehängte Objekte müssen kopier-und transferierbar sein. Ordner können nicht gesendet werden.
- </text>
<text name="lbl3">
Betreff:
</text>
@@ -47,98 +36,19 @@ gesendet. Mitteilungen können unter
<text name="lbl5">
Anhängen:
</text>
- <button label="Anhang entfernen" label_selected="Anhang entfernen"
- name="remove_attachment" />
- <button label="Senden" label_selected="Senden" name="send_notice" />
- <panel name="drop_target"
- tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
- </panel>
- <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
- <text name="lbl">
- Archivierte Mitteilung
- </text>
- <text name="lbl2">
- Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
- </text>
- <text name="lbl3">
- Betreff:
- </text>
- <text name="lbl4">
- Nachricht:
- </text>
- <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" />
- </panel>
-</panel>
-
-
-<!-- original file
-
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Mitteilungen" name="notices_tab">
- <text name="help_text">
- Mitteilungen sind eine schnelle Möglichkeit,
-Mitglieder auf dem Laufenden zu halten und
-Objekte im Anhang zu versenden. Mitteilungen werden
-nur an Mitglieder mit einer entsprechenden Rolle
-gesendet. Mitteilungen können unter
-„Allgemein“ ausgeschaltet werden.
- </text>
- <text name="no_notices_text">
- Keine älteren Mitteilungen.
- </text>
- <button label="?" label_selected="?" name="help_button" />
- <text name="lbl">
- Gruppenmitteilungsarchiv
- </text>
- <text name="lbl2">
- Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung,
-um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen.
-Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
- </text>
- <scroll_list name="notice_list">
- <column label="" name="icon" />
- <column label="Thema" name="subject" />
- <column label="Von" name="from" />
- <column label="Datum" name="date" />
- </scroll_list>
- <text name="notice_list_none_found">
- Nicht gefunden.
- </text>
- <button label="Neue Mitteilung" label_selected="Neue Mitteilung"
- name="create_new_notice" />
- <button label="Aktualisieren" label_selected="Liste aktualisieren"
- name="refresh_notices" />
- <panel label="Neue Mitteilung" name="panel_create_new_notice">
- <text name="lbl">
- Mitteilung schreiben
- </text>
- <text name="lbl2">
- Geben Sie einen Betreff für die Mitteilung ein. Sie können der
-Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar
-in dieses Feld ziehen. Angehängte Objekte müssen kopier-
-und transferierbar sein. Ordner können nicht gesendet werden.
- </text>
- <text name="lbl3">
- Betreff:
- </text>
- <text name="lbl4">
- Nachricht:
- </text>
- <text name="lbl5">
- Anhängen:
+ <text name="string">
+ Das Objekt hierhin ziehen und ablegen, um es anzuhängen:
</text>
- <button label="Anhang entfernen" label_selected="Anhang entfernen"
- name="remove_attachment" />
- <button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" />
- <panel name="drop_target"
- tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
+ <button label="Entfernen" label_selected="Anhang entfernen" name="remove_attachment" tool_tip="Anhang von Ihrer Benachrichtigung entfernen"/>
+ <button label="Senden" label_selected="Senden" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Ziehen Sie ein Objekt aus Ihrem Inventar auf dieses Feld, um es mit dieser Mitteilung zu versenden. Um das Objekt anhängen zu können, müssen Sie die Erlaubnis zum Kopieren und Übertragen besitzen."/>
</panel>
<panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
<text name="lbl">
Archivierte Mitteilung
</text>
<text name="lbl2">
- Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
+ Um eine neue Mitteilung zu senden, klicken Sie die Schaltfläche +
</text>
<text name="lbl3">
Betreff:
@@ -146,11 +56,6 @@ und transferierbar sein. Ordner können nicht gesendet werden.
<text name="lbl4">
Nachricht:
</text>
- <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" />
+ <button label="Anhang öffnen" label_selected="Anlage öffnen" name="open_attachment"/>
</panel>
</panel>
-
--->
-
-
-
diff --git a/indra/newview/skins/default/xui/de/panel_group_notify.xml b/indra/newview/skins/default/xui/de/panel_group_notify.xml
new file mode 100644
index 0000000000..9c05e99786
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="Überschrift" name="header">
+ <text name="title" value="Absender/Gruppenname"/>
+ </panel>
+ <text_editor name="message" value="Nachricht"/>
+ <text name="attachment" value="Anhang"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index d7f47de46f..db5186e081 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -1,316 +1,115 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mitglieder und Rollen" name="roles_tab">
- <string name="default_needs_apply_text">
- Das Unterregister enthält nicht übernommene Änderungen.
- </string>
- <string name="want_apply_text">
- Diese Änderungen übernehmen?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Mitglieder und Rollen
- </text>
- <text name="static2">
- Gruppenmitgliedern werden Rollen mit Fähigkeiten zugewiesen. Diese Einstellungen können zur flexibleren Organisation angepasst werden.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Rollen
- </text>
- <text name="role_properties_modifiable">
- Wählen Sie eine Rolle. Sie können ihren Namen, ihre Beschreibung und den Mitgliedstitel ändern.
- </text>
- <text name="role_properties_not_modifiable">
- Rolle anklicken um Mitglieder und Fähigkeiten anzuzeigen.
- </text>
- <text name="role_actions_modifiable">
- Sie können der Rolle auch Fähigkeiten zuweisen.
- </text>
- <text name="role_actions_not_modifiable">
- Sie können zugewiesene Fähigkeiten anzeigen, aber nicht bearbeiten.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Fähigkeiten
- </text>
- <text name="static2">
- Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder diese Fähigkeit haben.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ Diese Änderungen wurden nicht gespeichert.
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Möchten Sie Ihre Änderungen speichern?
+ </panel.string>
<tab_container name="roles_tab_container">
- <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
- <name_list name="member_list">
- <column label="Mitgliedsname" name="name"/>
- <column label="Übertragene Landanteile" name="donated"/>
- <column label="Letzte Anmeldung" name="online"/>
- </name_list>
- <button label="Neues Mitglied einladen..." name="member_invite"/>
- <button label="Aus Gruppe werfen" name="member_eject"/>
- <string name="help_text">
+ <panel label="MITGLIEDER" name="members_sub_tab" tool_tip="Mitglieder">
+ <panel.string name="help_text">
Sie können Mitgliedern Rollen zuweisen und entziehen.
Drücken Sie die Strg-Taste und klicken Sie auf Namen,
um mehrere Mitglieder auszuwählen.
- </string>
+ </panel.string>
+ <filter_editor label="Mitglieder filtern" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Mitglied" name="name" relative_width="0.30"/>
+ <name_list.columns label="Übereignung" name="donated" relative_width="0.33"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Einladen" name="member_invite"/>
+ <button label="Hinauswerfen" name="member_eject"/>
</panel>
- <panel label="Rollen" name="roles_sub_tab">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
+ <panel label="ROLLEN" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Rollen haben einen Titel und umfassen bestimmte
+Fähigkeiten. Mitglieder können mehrere
+Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen
+definieren, darunter &apos;Jeder &apos; und &apos;Eigentümer &apos;.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Die Rollen „Jeder&quot; und „Eigentuemer&quot; sind besondere Rollen und können nicht gelöscht werden.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string name="power_all_have_icon">
+ Checkbox_On
+ </panel.string>
+ <panel.string name="power_partial_icon">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor label="Rollen filtern" name="filter_input"/>
<scroll_list name="role_list">
- <column label="Rolle" name="name"/>
- <column label="Titel" name="title"/>
- <column label="Mitglieder" name="members"/>
+ <scroll_list.columns label="Rolle" name="name"/>
+ <scroll_list.columns label="Titel" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Neue Rolle erstellen..." name="role_create"/>
+ <button label="Neue Rolle" name="role_create"/>
<button label="Rolle löschen" name="role_delete"/>
- <string name="help_text">
- Rollen haben einen Titel und umfassen bestimmte
-Fähigkeiten. Mitglieder können mehrere
-Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen
-definieren, darunter „Jeder“ und „Eigentümer“.
- </string>
- <string name="cant_delete_role">
- Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden.
- </string>
</panel>
- <panel label="Fähigkeiten" name="actions_sub_tab">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
- <scroll_list name="action_list" tool_tip="Select an Ability to view more details.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- <string name="help_text">
+ <panel label="FÄHIGKEITEN" name="actions_sub_tab" tool_tip="Sie können eine Beschreibung der Fähigkeit anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen.">
+ <panel.string name="help_text">
Fähigkeiten verleihen Mitgliedern in Rollen bestimmte
Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten.
- </string>
+ </panel.string>
+ <filter_editor label="Fähigkeiten filtern" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Eine Fähigkeit auswählen, um mehr Details anzuzeigen.">
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Rollen
</text>
- <text name="static2">
- Zulässige Fähigkeiten
- </text>
<scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
</scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- </panel>
- <panel name="roles_footer">
- <text name="static">
- Name
- </text>
<text name="static2">
- Beschreibung
- </text>
- <line_editor name="role_name">
- Angestellte
- </line_editor>
- <text name="static3">
- Titel
- </text>
- <line_editor name="role_title">
- (wartet)
- </line_editor>
- <text_editor name="role_description">
- (wartet)
- </text_editor>
- <text name="static4">
- Mitglieder in Rolle
- </text>
- <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle.">
Zulässige Fähigkeiten
</text>
- <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/>
- <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu den Fähigkeiten anzuzeigen, siehe Registerkarte Fähigkeiten.">
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
- <panel name="actions_footer">
+ <panel name="roles_footer">
<text name="static">
- Beschreibung
- </text>
- <text_editor name="action_description">
- Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden.
- </text_editor>
- <text name="static2">
- Rollen mit Fähigkeit
+ Rolle:
</text>
+ <line_editor name="role_name"/>
<text name="static3">
- Mitglieder mit Fähigkeit
- </text>
- </panel>
-</panel>
-
-<!-- original file
-
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Mitglieder und Rollen" name="roles_tab">
- <string name="default_needs_apply_text">
- Das Unterregister enthält nicht übernommene Änderungen.
- </string>
- <string name="want_apply_text">
- Diese Änderungen übernehmen?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Mitglieder und Rollen
- </text>
- <text name="static2">
- Gruppenmitgliedern werden Rollen mit Fähigkeiten zugewiesen. Diese Einstellungen können zur flexibleren Organisation angepasst werden.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Rollen
- </text>
- <text name="role_properties_modifiable">
- Wählen Sie eine Rolle. Sie können ihren Namen, ihre Beschreibung und den Mitgliedstitel ändern.
- </text>
- <text name="role_properties_not_modifiable">
- Rolle anklicken um Mitglieder und Fähigkeiten anzuzeigen.
- </text>
- <text name="role_actions_modifiable">
- Sie können der Rolle auch Fähigkeiten zuweisen.
- </text>
- <text name="role_actions_not_modifiable">
- Sie können zugewiesene Fähigkeiten anzeigen, aber nicht bearbeiten.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Fähigkeiten
- </text>
- <text name="static2">
- Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw.
-Mitglieder diese Fähigkeit haben.
- </text>
- </panel>
- <tab_container name="roles_tab_container">
- <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
- <name_list name="member_list">
- <column label="Mitgliedsname" name="name" width="116"/>
- <column label="Übertragene Landanteile" name="donated" width="156"/>
- <column label="Letzte Anmeldung" name="online"/>
- </name_list>
- <button label="Neues Mitglied einladen..." name="member_invite"/>
- <button label="Aus Gruppe werfen" name="member_eject"/>
- <string name="help_text">
- Sie können Mitgliedern Rollen zuweisen und entziehen.
-Drücken Sie die Strg-Taste und klicken Sie auf Namen,
-um mehrere Mitglieder auszuwählen.
- </string>
- </panel>
- <panel label="Rollen" name="roles_sub_tab">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
- <scroll_list name="role_list">
- <column label="Rolle" name="name" width="126"/>
- <column label="Titel" name="title" width="180"/>
- <column label="Mitglieder" name="members" width="82"/>
- </scroll_list>
- <button label="Neue Rolle erstellen..." name="role_create"/>
- <button label="Rolle löschen" name="role_delete"/>
- <string name="help_text">
- Rollen haben einen Titel und umfassen bestimmte
-Fähigkeiten. Mitglieder können mehrere
-Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen
-definieren, darunter „Jeder“ und „Eigentümer“.
- </string>
- <string name="cant_delete_role">
- Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden.
- </string>
- </panel>
- <panel label="Fähigkeiten" name="actions_sub_tab">
- <button label="Suchen" name="search_button"/>
- <button label="Alle anzeigen" name="show_all_button"/>
- <scroll_list name="action_list" tool_tip="Select an Ability to view more details.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- <string name="help_text">
- Fähigkeiten verleihen Mitgliedern in Rollen bestimmte
-Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten.
- </string>
- </panel>
- </tab_container>
- <panel name="members_footer">
- <text name="static">
- Rollen
- </text>
- <text name="static2">
- Zulässige Fähigkeiten
- </text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
- </scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- </panel>
- <panel name="roles_footer">
- <text name="static">
- Name
+ Rollentitel
</text>
+ <line_editor name="role_title"/>
<text name="static2">
Beschreibung
</text>
- <line_editor name="role_name">
- Angestellte
- </line_editor>
- <text name="static3">
- Titel
- </text>
- <line_editor name="role_title">
- (wartet)
- </line_editor>
- <text_editor name="role_description">
- (wartet)
- </text_editor>
+ <text_editor name="role_description"/>
<text name="static4">
Mitglieder in Rolle
</text>
+ <check_box label="Mitglieder anzeigen" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte &apos;Allgemein &apos; für Personen außerhalb der Gruppe sichtbar sind."/>
<text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle.">
Zulässige Fähigkeiten
</text>
- <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/>
- <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu den Fähigkeiten anzuzeigen, siehe Registerkarte Fähigkeiten.">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
- <text name="static">
- Beschreibung
- </text>
<text_editor name="action_description">
Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden.
</text_editor>
<text name="static2">
- Rollen mit Fähigkeit
+ Rollen mit Fähigkeiten
</text>
<text name="static3">
- Mitglieder mit Fähigkeit
+ Rollen mit dieser Fähigkeit
</text>
</panel>
</panel>
-
--->
diff --git a/indra/newview/skins/default/xui/de/panel_groups.xml b/indra/newview/skins/default/xui/de/panel_groups.xml
index 95a2ef14f9..f857a6c7ac 100644
--- a/indra/newview/skins/default/xui/de/panel_groups.xml
+++ b/indra/newview/skins/default/xui/de/panel_groups.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
- <text name="groupdesc">
+ <text name="groupdesc" width="300">
Die derzeit aktive Gruppe ist fett hervorgehoben.
</text>
- <text name="groupcount">
+ <text name="groupcount" width="360">
Sie sind Mitglied bei [COUNT] Gruppen (von max. [MAX]).
</text>
<button label="IM/Anruf" name="IM" tool_tip="Beginnt eine Instant Message-Sitzung" />
diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
new file mode 100644
index 0000000000..0dca272633
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Unbekannt"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Freund hinzufügen" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Teilen" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Bezahlen" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Anrufen" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Anruf beenden" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_instant_message.xml b/indra/newview/skins/default/xui/de/panel_instant_message.xml
new file mode 100644
index 0000000000..1433552c15
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_instant_message.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="user_name" value="Erica Vader"/>
+ <text name="time_box" value="23:30"/>
+ </panel>
+ <button label="Antworten" name="reply"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
new file mode 100644
index 0000000000..9cef7b6d35
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Landmarken erstellen"/>
+ <string name="title_edit_landmark" value="Landmarke bearbeiten"/>
+ <string name="title_landmark" value="Landmarke"/>
+ <string name="not_available" value="k.A."/>
+ <string name="unknown" value="(unbekannt)"/>
+ <string name="public" value="(öffentlich)"/>
+ <string name="server_update_text">
+ Ohne Serverupdate sind keine Ortsinformationen verfügbar.
+ </string>
+ <string name="server_error_text">
+ Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.
+ </string>
+ <string name="server_forbidden_text">
+ Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <button name="back_btn" tool_tip="Hinten"/>
+ <text name="title" value="Ortsprofil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="unbekannt"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Eigentümer:"/>
+ <text name="creator_label" value="Ersteller:"/>
+ <text name="created_label" value="Erstellt:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Titel:"/>
+ <text name="notes_label" value="Meine Notizen:"/>
+ <text name="folder_label" value="Landmarken-Position:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_landmarks.xml b/indra/newview/skins/default/xui/de/panel_landmarks.xml
new file mode 100644
index 0000000000..db12462a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Favoritenleiste"/>
+ <accordion_tab name="tab_landmarks" title="Meine Landmarken"/>
+ <accordion_tab name="tab_inventory" title="Mein Inventar"/>
+ <accordion_tab name="tab_library" title="Bibliothek"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button name="add_btn" tool_tip="Neue Landmarke hinzufügen"/>
+ <dnd_button name="trash_btn" tool_tip="Ausgewählte Landmarke hinzufügen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 93f2d6c257..2a6ea42c73 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -1,43 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <text name="first_name_text">
- Vorname:
- </text>
- <text name="last_name_text">
- Nachname:
- </text>
- <text name="password_text">
- Kennwort:
- </text>
- <text name="start_location_text">
- Startposition:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Mein Heimatort" />
- <combo_box.item name="MyLastLocation" label="Mein letzter Standort" />
- <combo_box.item name="Typeregionname" label="&lt;Region eingeben&gt;" />
- </combo_box>
- <check_box label="Kennwort merken" name="remember_check"/>
- <text name="full_screen_text">
- Die Anzeige schaltet bei Anmeldung auf Vollbild um.
- </text>
- <button label="Neues Konto..." label_selected="Neues Konto..." name="new_account_btn"/>
- <button label="Einstellungen..." label_selected="Einstellungen..." name="preferences_btn"/>
- <button label="Anmelden" label_selected="Anmelden" name="connect_btn"/>
- <button label="Beenden" label_selected="Beenden" name="quit_btn"/>
- <text name="version_text">
- 1.23.4 (5)
- </text>
- <text name="create_new_account_text">
- Konto erstellen
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
- <text name="forgot_password_text">
- Namen oder Kennwort vergessen?
- </text>
- <text name="forgot_password_url">
- http://secondlife.com/account/request.php
- </text>
+ <panel.string name="create_account_url">
+ http://de.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=de
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Vorname:
+ </text>
+ <line_editor label="Vorname" name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
+ <text name="last_name_text">
+ Nachname:
+ </text>
+ <line_editor label="Nachname" name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/>
+ <text name="password_text">
+ Kennwort:
+ </text>
+ <check_box label="Kennwort merken" name="remember_check"/>
+ <text name="start_location_text">
+ Hier anfangen:
+ </text>
+ <combo_box name="start_location_combo" width="150">
+ <combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
+ <combo_box.item label="Mein Zuhause" name="MyHome"/>
+ <combo_box.item label="&lt;Region eingeben&gt;" name="Typeregionname"/>
+ </combo_box>
+ <button label="Anmelden" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Registrieren
+ </text>
+ <text name="forgot_password_text">
+ Namen oder Kennwort vergessen?
+ </text>
+ <text name="login_help">
+ Sie brauchen Hilfe?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
new file mode 100644
index 0000000000..eed365a1bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sonstiges" name="main inventory panel">
+ <panel.string name="Title">
+ Sonstiges
+ </panel.string>
+ <filter_editor label="Inventar filtern" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="MEIN INVENTAR" name="All Items"/>
+ <inventory_panel label="AKTUELL" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/>
+ <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Datei" name="File">
+ <menu_item_call label="Öffnen" name="Open"/>
+ <menu label="Hochladen" name="upload">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Neues Fenster" name="New Window"/>
+ <menu_item_call label="Filter anzeigen" name="Show Filters"/>
+ <menu_item_call label="Filter zurücksetzen" name="Reset Current"/>
+ <menu_item_call label="Alle Ordner schließen" name="Close All Folders"/>
+ <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
+ <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Erstellen" name="Create">
+ <menu_item_call label="Neuer Ordner" name="New Folder"/>
+ <menu_item_call label="Neues Skript" name="New Script"/>
+ <menu_item_call label="Neue Notizkarte" name="New Note"/>
+ <menu_item_call label="Neue Geste" name="New Gesture"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Alpha: Neu" name="New Alpha"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Sortieren" name="Sort">
+ <menu_item_check label="Nach Name" name="By Name"/>
+ <menu_item_check label="Nach Datum" name="By Date"/>
+ <menu_item_check label="Ordner immer nach Namen" name="Folders Always By Name"/>
+ <menu_item_check label="Systemordner nach oben" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml
new file mode 100644
index 0000000000..26b9812212
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mein Profil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="MEIN PROFIL" name="panel_profile"/>
+ <panel label="MEINE AUSWAHL" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_general.xml b/indra/newview/skins/default/xui/de/panel_media_settings_general.xml
new file mode 100644
index 0000000000..75c9057571
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Allgemein" name="Media Settings General">
+ <text name="home_label">
+ Homepage:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Diese Seite wird von der angegebenen Whiteliste nicht zugelassen)
+ </text>
+ <line_editor name="home_url" tool_tip="Die Start-URL für diese Medienquelle"/>
+ <text name="preview_label">
+ Vorschau
+ </text>
+ <text name="current_url_label">
+ Aktuelle Seite:
+ </text>
+ <text name="current_url" tool_tip="Die aktuelle Seite für diese Medienquelle" value=""/>
+ <button label="Zurücksetzen" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Automatisch wiederholen" name="auto_loop"/>
+ <check_box initial_value="false" label="Interaktion beim ersten Anklicken" name="first_click_interact"/>
+ <check_box initial_value="false" label="Automatisch zoomen" name="auto_zoom"/>
+ <check_box initial_value="false" label="Medien automatisch abspielen" name="auto_play"/>
+ <text name="media_setting_note">
+ Hinweis: Einwohner können diese Einstellung überschreiben
+ </text>
+ <check_box initial_value="false" label="Medien automatisch auf Objektflächen skalieren" name="auto_scale"/>
+ <text name="size_label">
+ Größe:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..7ee0074a3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Anpassen" name="Media settings for controls">
+ <text name="controls_label">
+ Steuerung:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_group_control"/>
+ <check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
new file mode 100644
index 0000000000..adc0d22ce6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sicherheit" name="Media Settings Security">
+ <check_box initial_value="false" label="Nur Zugriff auf festgelegte URL-Muster zulassen" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Einträge, die für die Startseite nicht akzeptiert
+werden, sind markiert:
+ </text>
+ <button label="Hinzufügen" name="whitelist_add"/>
+ <button label="Löschen" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Achtung: Die auf der Registerkarte Allgemein festgelegte Startseite wird von der Whitelist nicht akzeptiert. Sie wurde deaktiviert bis ein gültiger Eintrag hinzugefügt wurde.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_my_profile.xml b/indra/newview/skins/default/xui/de/panel_my_profile.xml
new file mode 100644
index 0000000000..55eed89848
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_my_profile.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=de-DE
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=de
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
+ <string name="no_partner_text" value="Keiner"/>
+ <string name="no_group_text" value="Keiner"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
+ <text name="title_rw_descr_text" value="Echtes Leben:"/>
+ </panel>
+ <text name="title_member_text" value="Einwohner seit:"/>
+ <text name="title_acc_status_text" value="Kontostatus:"/>
+ <text_editor name="acc_status_text">
+ Einwohner. Keine Zahlungsinfo archiviert.
+ Linden.
+ </text_editor>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Gruppen:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
+ <button label="Aussehen bearbeiten" name="edit_appearance_btn" tool_tip="Ihr Aussehen bearbeiten: Körpermaße, Bekleidung, usw."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
new file mode 100644
index 0000000000..99293edd0f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort gehen"/>
+ <pull_button name="forward_btn" tool_tip="Um einen Standort weiter gehen"/>
+ <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
+ <location_input label="Standort" name="location_combo"/>
+ <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
+ <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ Favoritenleiste
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
new file mode 100644
index 0000000000..3f4f5a71b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name" width="200">
+ CHAT IN DER NÄHE
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..5e6e460c65
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/>
+ <button name="show_nearby_chat" tool_tip="Protokoll des Chats in der Nähe anzeigen/ausblenden"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
new file mode 100644
index 0000000000..ec2ad42fa1
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ls Medien-Objekte)
+ </string>
+ <string name="empty_item_text">
+ &lt;leer&gt;
+ </string>
+ <string name="parcel_media_name">
+ Streaming-Medien auf Parzelle
+ </string>
+ <string name="parcel_audio_name">
+ Streaming-Audio auf Parzelle
+ </string>
+ <string name="playing_suffix">
+ (wird abgespielt)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Alle stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/>
+ <button label="Alle starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/>
+ <button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/>
+ <button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="more_less_btn" tool_tip="Erweiterte Steuerung"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Alle" name="All"/>
+ <combo_box.item label="Auf dieser Parzelle" name="WithinParcel"/>
+ <combo_box.item label="Außerhalb dieser Parzelle" name="OutsideParcel"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Umgebung" name="media_proximity"/>
+ <scroll_list.columns label="Sichtbar" name="media_visibility"/>
+ <scroll_list.columns label="Klasse" name="media_class"/>
+ <scroll_list.columns label="Name" name="media_name"/>
+ <scroll_list.columns label="Fehler beseitigen" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Ausgewählte Medien stoppen"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ausgewählte Medien wiedergeben"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Ausgewählte Medien pausieren"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Lautstärke für ausgewählte Medien"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Audio für ausgewählte Medien stummschalten"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Auf ausgewählte Medien zoomen"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Von ausgewählten Medien wegzoomen"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml
new file mode 100644
index 0000000000..374c117cdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notizen &amp; Privatsphäre" name="panel_notes">
+ <layout_stack name="layout">
+ <layout_panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Meine Notizen:"/>
+ <text name="status_message2" value="Diese Person kann:"/>
+ <check_box label="meinen Online-Status sehen." name="status_check"/>
+ <check_box label="mich auf der Karte sehen." name="map_check"/>
+ <check_box label="meine Objekte bearbeiten, löschen oder nehmen." name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="notes_buttons_panel">
+ <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/>
+ <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/>
+ <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="40"/>
+ <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_online_status.xml b/indra/newview/skins/default/xui/de/panel_online_status.xml
new file mode 100644
index 0000000000..7c7448c061
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Freunde_online_Status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..54c56992fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sonstiges" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <inventory_panel label="MEINE OUTFITS" name="outfitslist_tab"/>
+ <inventory_panel label="AKTUELLES OUTFIT" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
+ <button label="Outfit speichern" name="make_outfit_btn" tool_tip="Aussehen als Outfit speichern"/>
+ <button label="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/>
+ <button label="M" name="look_edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..ad0e039070
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Aktuelles Outfit ersetzen" name="wear"/>
+ <menu_item_call label="Vom aktuellen Outfit entfernen" name="remove"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Link entfernen" name="remove_link"/>
+ <menu_item_call label="Outfit löschen" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
new file mode 100644
index 0000000000..a119c86b47
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Leute" name="people_panel">
+ <string name="no_people" value="Keine Leute"/>
+ <string name="no_one_near" value="Keiner in der Nähe"/>
+ <string name="no_friends_online" value="Keine Freunde online"/>
+ <string name="no_friends" value="Keine Freunde"/>
+ <string name="people_filter_label" value="Nach Leuten filtern"/>
+ <string name="groups_filter_label" value="Nach Gruppen filtern"/>
+ <filter_editor label="Filter" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="IN DER NÄHE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Optionen"/>
+ <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
+ </panel>
+ </panel>
+ <panel label="MEINE FREUNDE" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Alle"/>
+ </accordion>
+ <text name="no_friends_msg">
+ Verwenden Sie [secondlife:///app/search/people die globale Suche], um Freunde hinzuzufügen. Oder klicken Sie auf einen Einwohner und fügen Sie diesen als Freund hinzu.
+Wenn Sie nach Orten suchen, an denen sich Leute befinden, verwenden Sie [secondlife:///app/worldmap die Karte].
+ </text>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Optionen"/>
+ <button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
+ <button name="del_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/>
+ </panel>
+ </panel>
+ <panel label="MEINE GRUPPEN" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Optionen"/>
+ <button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/>
+ <button name="activate_btn" tool_tip="Ausgewählte Gruppe aktivieren"/>
+ </panel>
+ </panel>
+ <panel label="AKTUELL" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Optionen"/>
+ <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
+ <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
+ <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
+ <button label="Teilen" name="share_btn"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
+ <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/>
+ <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/>
+ <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_pick_info.xml b/indra/newview/skins/default/xui/de/panel_pick_info.xml
new file mode 100644
index 0000000000..d8939a8ed1
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Auswahl-Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[wird geladen...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Karte" name="show_on_map_btn"/>
+ <button label="Bearbeiten" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml
new file mode 100644
index 0000000000..df68381082
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_picks.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Auswahl" name="panel_picks">
+ <string name="no_picks" value="Keine Auswahl"/>
+ <string name="no_classifieds" value="Keine Anzeigen"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Auswahl"/>
+ <accordion_tab name="tab_classifieds" title="Anzeigen"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="An aktuellem Standort neue Auswahl oder Anzeige erstellen"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Auswahl-Information anzeigen"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren" width="100"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml
new file mode 100644
index 0000000000..fd4da94edc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Ein"/>
+ <string name="off" value="Aus"/>
+ <string name="anyone" value="Jeder"/>
+ <string name="available" value="verfügbar"/>
+ <string name="allocated" value="vergeben"/>
+ <string name="title_place" value="Ortsprofil"/>
+ <string name="title_teleport_history" value="Teleport-Liste"/>
+ <string name="not_available" value="k.A."/>
+ <string name="unknown" value="(unbekannt)"/>
+ <string name="public" value="(öffentlich)"/>
+ <string name="none_text" value="(keiner)"/>
+ <string name="sale_pending_text" value="(Wird verkauft)"/>
+ <string name="group_owned_text" value="(In Gruppenbesitz)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Alle Einwohner"/>
+ <string name="group_text" value="Gruppe"/>
+ <string name="can_resell">
+ Gekauftes Land in dieser Region kann wiederverkauft werden.
+ </string>
+ <string name="can_not_resell">
+ Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
+ </string>
+ <string name="can_change">
+ Gekauftes Land in dieser Region kann zusammengelegt und geteilt werden.
+ </string>
+ <string name="can_not_change">
+ Gekauftes Land in dieser Region kann nicht zusammengelegt und geteilt werden.
+ </string>
+ <string name="server_update_text">
+ Ohne Serverupdate sind keine Ortsinformationen verfügbar.
+ </string>
+ <string name="server_error_text">
+ Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.
+ </string>
+ <string name="server_forbidden_text">
+ Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <string name="icon_Voice" value="parcel_drk_Voice"/>
+ <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
+ <string name="icon_Fly" value="parcel_drk_Fly"/>
+ <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
+ <string name="icon_Push" value="parcel_drk_Push"/>
+ <string name="icon_PushNo" value="parcel_drk_PushNo"/>
+ <string name="icon_Build" value="parcel_drk_Build"/>
+ <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
+ <string name="icon_Scripts" value="parcel_drk_Scripts"/>
+ <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
+ <string name="icon_Damage" value="parcel_drk_Damage"/>
+ <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
+ <button name="back_btn" tool_tip="Hinten"/>
+ <text name="title" value="Ortsprofil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Eigentümer:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="unbekannt"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parzelle">
+ <panel>
+ <text name="rating_label" value="Einstufung:"/>
+ <text name="rating_value" value="unbekannt"/>
+ <text name="voice_label" value="Voice:"/>
+ <text name="voice_value" value="Ein"/>
+ <text name="fly_label" value="Fliegen:"/>
+ <text name="fly_value" value="Ein"/>
+ <text name="push_label" value="Stoßen:"/>
+ <text name="push_value" value="Aus"/>
+ <text name="build_label" value="Bauen:"/>
+ <text name="build_value" value="Ein"/>
+ <text name="scripts_label" value="Skripts:"/>
+ <text name="scripts_value" value="Ein"/>
+ <text name="damage_label" value="Schaden:"/>
+ <text name="damage_value" value="Aus"/>
+ <button label="Über Land" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Region">
+ <panel>
+ <text name="region_name_label" value="Region:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="Typ:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="Einstufung:"/>
+ <text name="region_rating" value="Adult"/>
+ <text name="region_owner_label" value="Eigentümer:"/>
+ <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_group_label" value="Gruppe:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="Region/Grundstück" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Grundstück">
+ <panel>
+ <text name="estate_name_label" value="Grundstück:"/>
+ <text name="estate_rating_label" value="Einstufung:"/>
+ <text name="estate_owner_label" value="Eigentümer:"/>
+ <text name="covenant_label" value="Vertrag:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Zum Verkauf">
+ <panel>
+ <text name="sales_price_label" value="Preis:"/>
+ <text name="area_label" value="Gebiet:"/>
+ <text name="traffic_label" value="Traffic:"/>
+ <text name="primitives_label" value="Primitive:"/>
+ <text name="parcel_scripts_label" value="Skripts:"/>
+ <text name="terraform_limits_label" value="Terraform-Begrenzungen:"/>
+ <text name="subdivide_label" value="Teilen/Zusammenlegen:"/>
+ <text name="resale_label" value="Wiederverkaufen:"/>
+ <text name="sale_to_label" value="Zum Verkauf an:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
new file mode 100644
index 0000000000..7359a4fda4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Orte" name="places panel">
+ <string name="landmarks_tab_title" value="MEINE LANDMARKEN"/>
+ <string name="teleport_history_tab_title" value="TELEPORT-LISTE"/>
+ <filter_editor label="Meine Orte filtern" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/>
+ <button label="Karte" name="map_btn" width="60"/>
+ <button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/>
+ <button name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button label="Schließen" name="close_btn"/>
+ <button label="Abbrechen" name="cancel_btn" width="66"/>
+ <button label="Speichern" name="save_btn" width="66"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index c7833f6936..df1bbd5d52 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -1,12 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <text name="AspectRatioLabel1" tool_tip="Breite/Höhe">
- Aspektverhältnis:
+<panel label="Erweitert" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <slider label="Sichtwinkel" name="camera_fov"/>
+ <slider label="Abstand" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatische Position für:
</text>
- <combo_box name="aspect_ratio" tool_tip="Breite/Höhe">
- <combo_box.item label="4:3 (Standard-CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Widescreen)" name="item3"/>
- <combo_box.item label="16:9 (Widescreen)" name="item4"/>
- </combo_box>
+ <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
+ <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
+ <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/>
+ <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
+ <check_box label="2-mal-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
+ <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
+ <check_box label="Blasen-Chat" name="bubble_text_chat"/>
+ <slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
+ <check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Chat in der Nähe" name="0"/>
+ <radio_item label="Getrenntes Fenster" name="1"/>
+ </radio_group>
+ <check_box label="Sprachfunktion ein-/ausschalten, wenn gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/>
+ <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/>
+ <button label="Taste festlegen" name="set_voice_hotkey_button"/>
+ <button label="Mittlere Maustaste" name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
index 0ad6291537..0a0534c739 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
@@ -1,24 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
- <text>
- Popups nicht anzeigen:
- </text>
- <text name="dont_show_label">
- Diese Popups nicht anzeigen:
- </text>
- <button label="Dieses Popup aktivieren" name="enable_popup"/>
- <text>
- Popups anzeigen:
+ <text name="tell_me_label">
+ Anzeigen:
</text>
+ <check_box label="Wenn ich Geld ausgebe oder L$ erhalte" name="notify_money_change_checkbox"/>
+ <check_box label="Wenn meine Freunde sich an- oder abmelden" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Diese Popups anzeigen:
+ Immer anzeigen:
</text>
- <text name="text_box2">
- Anbieten von Notizkarten, Texturen und Landmarken:
+ <text name="dont_show_label">
+ Niemals anzeigen:
</text>
- <check_box label="Automatisch annehmen" name="accept_new_inventory"/>
- <check_box label="Nach Annahme automatisch anzeigen" name="show_new_inventory"/>
- <button width="200" label="Alle Popups aktivieren..." name="reset_dialogs_btn" tool_tip="Alle optionalen Popups und „Das erste Mal“-Meldungen aktivieren."/>
- <button width="200" label="Alle diese Popups deaktivieren..." name="skip_dialogs_btn" tool_tip="Alle optionalen Popups und „Das erste Mal“-Meldungen deaktivieren."/>
- <check_box label="Neue Objekte im Inventar automatisch anzeigen" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index c99ba9a118..f580691c0d 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -1,16 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Text-Chat" name="chat">
- <text name="text_box">
- Chat-Schriftgröße:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Klein" />
- <radio_item name="radio2" label="Mittel" />
- <radio_item name="radio3" label="Groß" />
+ <radio_item label="Klein" name="radio" value="0"/>
+ <radio_item label="Mittel" name="radio2" value="1"/>
+ <radio_item label="Groß" name="radio3" value="2"/>
</radio_group>
<color_swatch label="Sie" name="user"/>
<text name="text_box1">
- Sie
+ Ich
</text>
<color_swatch label="Andere" name="agent"/>
<text name="text_box2">
@@ -36,23 +33,15 @@
<text name="text_box7">
Eigentümer
</text>
- <color_swatch label="Blase" name="background"/>
- <text name="text_box8">
- Blase
- </text>
<color_swatch label="URLs" name="links"/>
<text name="text_box9">
URLs
</text>
- <spinner label="Chat ausblenden nach" label_width="115" left="148" name="fade_chat_time" width="160"/>
- <spinne left="370" name="max_chat_count"/>
- <slider label="Deckkraft" name="console_opacity"/>
- <check_box label="Chat verwendet volle Bildbreite (Neustart erforderlich)" name="chat_full_width_check"/>
- <check_box label="Chatleiste nach Drücken der Eingabetaste schließen" name="close_chat_on_return_check"/>
- <check_box label="Pfeiltasten bewegen immer den Avatar beim Chatten" name="arrow_keys_move_avatar_check"/>
- <check_box label="Zeitstempel im lokalen Chat anzeigen" name="show_timestamps_check"/>
- <check_box label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
- <check_box label="Chat-Blasen anzeigen" name="bubble_text_chat"/>
- <slider label="Deckkraft" name="bubble_chat_opacity"/>
- <check_box label="Skriptfehler und Warnungen als normalen Chat anzeigen" name="script_errors_as_chat"/>
+ <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
+ <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
+ <check_box label="Text-Chatverlauf aktivieren" name="plain_text_chat_history"/>
+ <radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit viele Registerkarten an (Neustart erforderlich).">
+ <radio_item label="Getrennte Fenster" name="radio" value="0"/>
+ <radio_item label="Registerkarten" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
index 8d9ebe423b..bd9e10b641 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -1,90 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Allgemein" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden." label="Mein Heimatort"/>
- <combo_box.item name="MyLastLocation" tool_tip="Als Standardeinstellung in letztem Standort anmelden." label="Mein letzter Standort"/>
- </combo_box>
- <check_box label="Startposition auf Anmeldebildschirm anzeigen" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nie"/>
- <combo_box.item name="Show Temporarily" label="Temporär anzeigen"/>
- <combo_box.item name="Always" label="Immer"/>
- </combo_box>
- <check_box label="Kleine Avatarnamen" name="small_avatar_names_checkbox"/>
- <check_box label="Meinen Namen auf meinem Bildschirm ausblenden" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Gruppentitel:
- </text>
- <check_box label="Alle Gruppentitel ausblenden" name="show_all_title_checkbox"/>
- <check_box label="Meinen Gruppentitel ausblenden" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <text name="UI Size:">
- UI-Größe:
+ <text name="language_textbox">
+ Sprache:
</text>
- <check_box label="Auflösungsunabhängigen Maßstab verwenden" name="ui_auto_scale"/>
- <spinner label="Timeout für Abwesenheit:" name="afk_timeout_spinner"/>
- <check_box label="L$ Eingänge und Ausgaben melden" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Einstufung:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Systemvorgabe" name="System Default Language"/>
+ <combo_box.item label="English (Englisch)" name="English"/>
+ <combo_box.item label="Danks (Dänisch) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Spanisch) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Französisch) - Beta" name="French"/>
+ <combo_box.item label="Italiano (Italienisch) - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Niederländisch) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polnisch) - Beta" name="Polish"/>
+ <combo_box.item label="Português (Portugiesisch) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japanisch) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Erfordert Neustart)
</text>
- <text name="maturity_desired_prompt">
+ <text name="maturity_desired_prompt" width="350">
Ich möchte auf Inhalt mit folgender Alterseinstufung zugreifen:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature und Adult"/>
- <combo_box.item name="Desired_Mature" label="PG und Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="Allgemein, Moderat, Adult" name="Desired_Adult"/>
+ <combo_box.item label="Allgemein und Moderat" name="Desired_Mature"/>
+ <combo_box.item label="Allgemein" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
- Startposition:
+ Startstandort:
</text>
- <text name="show_names_textbox">
- Namen anzeigen:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mein letzter Standort" name="MyLastLocation" tool_tip="Als Standardeinstellung in letztem Standort anmelden."/>
+ <combo_box.item label="Mein Zuhause" name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden."/>
+ </combo_box>
+ <check_box initial_value="true" label="Beim Anmelden anzeigen" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Avatarnamen:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Aus" name="radio" value="0"/>
+ <radio_item label="An" name="radio2" value="1"/>
+ <radio_item label="Kurz anzeigen" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Meinen Namen anzeigen" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Kleine Avatarnamen" name="small_avatar_names_checkbox"/>
+ <check_box label="Gruppentitel anzeigen" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Farbe für meine Effekte:
- </text>
- <text name="seconds_textbox">
- Sekunden
- </text>
- <text name="crash_report_textbox">
- Crash-Berichte:
- </text>
- <text name="language_textbox">
- Sprache:
+ Meine Effekte:
</text>
- <text name="language_textbox2">
- (Erfordert Neustart)
+ <text name="title_afk_text">
+ Zeit bis zur Abwesenheit:
</text>
- <string name="region_name_prompt">
- &lt;Region eingeben&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Vor dem Senden fragen"/>
- <combo_box.item name="Alwayssend" label="Immer senden"/>
- <combo_box.item name="Neversend" label="Nie senden"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Betriebssystem-Einstellung"/>
- <combo_box.item name="English" label="English (Englisch)"/>
- <combo_box.item name="Danish" label="Danks (Dänisch) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch - Beta"/>
- <combo_box.item name="Spanish" label="Español (Spanisch) - Beta"/>
- <combo_box.item name="French" label="Français (Französisch) - Beta"/>
- <combo_box.item name="Italian" label="Italiano (Italienisch) - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Ungarisch) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Niederländisch) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polnisch) - Beta"/>
- <combo_box.item name="Portugese" label="Português (Portugiesisch) - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russian) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Türkisch) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ukrainisch) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinesisch) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japanisch) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Koreanisch) - Beta"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ <combo_box label="Timeout für Abwesenheit:" name="afk">
+ <combo_box.item label="2 Minuten" name="item0"/>
+ <combo_box.item label="5 Minuten" name="item1"/>
+ <combo_box.item label="10 Minuten" name="item2"/>
+ <combo_box.item label="30 Minuten" name="item3"/>
+ <combo_box.item label="nie" name="item4"/>
</combo_box>
- <check_box label="Objekten Sprache mitteilen" name="language_is_public" tool_tip="In-Welt-Objekten wird Ihre bevorzugte Spracheinstellung mitgeteilt."/>
+ <text name="text_box3">
+ Antwort, wenn im „Beschäftigt“-Modus:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index fe07406908..e7bb768925 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -1,67 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafik" name="Display panel">
- <text name="text">
- Anzeigeauflösung:
- </text>
- <button label=" ?" name="GraphicsPreferencesHelpButton" />
- <check_box label="Second Life in einem Fenster ausführen" name="windowed mode" />
- <text_editor name="voice_chat_description">
- Wenn deaktiviert Anzeige bei Anmeldung in Vollbild.
- </text_editor>
- <text name="Fullscreen Aspect Ratio:">
- Vollbild-Aspektverhältnis:
- </text>
- <text name="(width / height)">
- (Breite/Höhe)
- </text>
- <text_editor name="FullScreenInfo" width="480">
- Wenn deaktiviert, schaltet die Anzeige bei Anmeldung auf Vollbild um.
- </text_editor>
<text name="WindowSizeLabel">
Fenstergröße:
</text>
+ <check_box label="Vollbildmodus verwenden" name="windowed mode"/>
<combo_box left="115" name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="720x480 (NTSC)" name="720x480"/>
+ <combo_box.item label="768x576 (PAL)" name="768x576"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
</combo_box>
- <text name="DisplayResLabel" width="100">
- Anzeigeauflösung:
- </text>
- <combo_box left="115" name="fullscreen combo" />
- <text name="AspectRatioLabel1" tool_tip="Breite/Höhe" width="100">
- Aspektverhältnis:
- </text>
- <combo_box left="115" name="aspect_ratio" tool_tip="Breite/Höhe">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard-CRT)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)" />
- </combo_box>
- <check_box label="Verhältnis automatisch erkennen" left="275" name="aspect_auto_detect" />
<text name="UI Size:">
UI-Größe:
</text>
- <text name="(meters, lower is faster)">
- (Meter, niedriger ist schneller)
- </text>
- <text name="text2">
- Anzeigeoptionen:
- </text>
- <check_box label="Auflösungsunabhängigen Maßstab verwenden" name="ui_auto_scale" />
- <spinner label="Sichtweite:" name="draw_distance" />
- <check_box label="Avatar in Mouselook anzeigen" name="avfp" />
- <text name="HigherText">
- Qualität und
- </text>
- <text name="QualityText">
- Performance:
+ <text name="QualitySpeed">
+ Qualität und Geschwindigkeit:
</text>
<text name="FasterText">
Schneller
</text>
+ <text name="BetterText">
+ Besser
+ </text>
<text name="ShadersPrefText">
Niedrig
</text>
@@ -74,98 +35,82 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2">
- Höhere
- </text>
- <text name="QualityText2">
- Qualität
- </text>
- <check_box label="Benutzerdefiniert" name="CustomSettings" />
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shader:
- </text>
- <check_box label="Bumpmapping und Glanz" name="BumpShiny" />
- <check_box label="Einfache Shader" name="BasicShaders"
- tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht." />
- <check_box label="Atmosphären-Shader" name="WindLightUseAtmosShaders" />
- <check_box label="Wasserreflexionen" name="Reflections" />
- <text name="ReflectionDetailText">
- Spiegelung:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terrain und Bäume" />
- <radio_item name="1" label="Alle statischen Objekte" />
- <radio_item name="2" label="Alle Avatare und Objekte" />
- <radio_item name="3" label="Alles" />
- </radio_group>
- <text name="AvatarRenderingText">
- Avatar-Darstellung:
- </text>
- <check_box label="Ersatzavatare" name="AvatarImpostors" />
- <check_box label="Hardware-Hautberechnung" name="AvatarVertexProgram" />
- <check_box label="Avatar-Kleidung" name="AvatarCloth" />
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Sichtweite:" name="DrawDistance" />
- <slider label="Max. Partikelzahl:" name="MaxParticleCount" />
- <slider label="Post-Processing-Qualität:" name="RenderPostProcess" />
- <text name="MeshDetailText">
- Gitterdetails:
- </text>
- <slider label=" Objekte:" name="ObjectMeshDetail" />
- <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail" />
- <slider label=" Bäume:" name="TreeMeshDetail" />
- <slider label=" Avatare:" name="AvatarMeshDetail" />
- <slider label=" Terrain:" name="TerrainMeshDetail" />
- <slider label=" Himmel:" name="SkyMeshDetail" />
- <text name="PostProcessText">
- Niedrig
- </text>
- <text name="ObjectMeshDetailText">
- Niedrig
- </text>
- <text name="FlexibleMeshDetailText">
- Niedrig
- </text>
- <text name="TreeMeshDetailText">
- Niedrig
- </text>
- <text name="AvatarMeshDetailText">
- Niedrig
- </text>
- <text name="TerrainMeshDetailText">
- Niedrig
- </text>
- <text name="SkyMeshDetailText">
- Niedrig
- </text>
- <text name="LightingDetailText">
- Beleuchtungsdetails:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Nur Sonne und Mond" />
- <radio_item name="LocalLights" label="Lokale Lichtquellen" />
- </radio_group>
- <text name="TerrainDetailText">
- Terraindetails:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Niedrig" />
- <radio_item name="2" label="Hoch" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Shader:
+ </text>
+ <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
+ <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/>
+ <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Spiegelung:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terrain und Bäume" name="0"/>
+ <radio_item label="Alle statischen Objekte" name="1"/>
+ <radio_item label="Alle Avatare und Objekte" name="2"/>
+ <radio_item label="Alles" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Avatar-Darstellung:
+ </text>
+ <check_box initial_value="true" label="Scheinavatare" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/>
+ <slider label="Sichtweite:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Max. Partikelzahl:" name="MaxParticleCount"/>
+ <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Gitterdetails:
+ </text>
+ <slider label=" Objekte:" name="ObjectMeshDetail"/>
+ <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/>
+ <slider label=" Bäume:" name="TreeMeshDetail"/>
+ <slider label=" Avatare:" name="AvatarMeshDetail"/>
+ <slider label=" Terrain:" name="TerrainMeshDetail"/>
+ <slider label=" Himmel:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Niedrig
+ </text>
+ <text name="ObjectMeshDetailText">
+ Niedrig
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Niedrig
+ </text>
+ <text name="TreeMeshDetailText">
+ Niedrig
+ </text>
+ <text name="AvatarMeshDetailText">
+ Niedrig
+ </text>
+ <text name="TerrainMeshDetailText">
+ Niedrig
+ </text>
+ <text name="SkyMeshDetailText">
+ Niedrig
+ </text>
+ <text name="LightingDetailText">
+ Beleuchtungsdetails:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Nur Sonne und Mond" name="SunMoon"/>
+ <radio_item label="Lokale Lichtquellen" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Terraindetails:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Niedrig" name="0"/>
+ <radio_item label="Hoch" name="2"/>
+ </radio_group>
</panel>
- <button label="Empfohlene Einstellungen" name="Defaults" />
- <button label="Hardware-Optionen" label_selected="Hardware-Optionen"
- name="GraphicsHardwareButton" />
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Übernehmen" label_selected="Übernehmen" name="Apply"/>
+ <button label="Zurücksetzen" name="Defaults"/>
+ <button label="Erweitert" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index b52e535114..42a625fbf6 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -1,32 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Kommunikation" name="im">
- <text name="text_box">
- Mein Onlinestatus:
+ <panel.string name="log_in_to_change">
+ Anmelden, um Änderungen vorzunehmen
+ </panel.string>
+ <button label="Cache leeren" name="clear_cache" tool_tip="Bild bei Anmeldung, letzter Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
+ <text name="cache_size_label_l">
+ (Standorte, Bilder, Web, Suchverlauf)
</text>
- <check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/>
- <text name="text_box2">
- IM-Optionen:
+ <check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
+ <check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
+ <check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
+ <check_box label="Cookies annehmen" name="cookies_enabled"/>
+ <text name="Logs:">
+ Protokolle:
</text>
- <text name="log_in_to_change">
- Zum Ändern anmelden
+ <check_box label="Protokolle von Gesprächen in der Nähe auf meinem Computer speichern" name="log_nearby_chat"/>
+ <check_box label="IM Protokolle auf meinem Computer speichern" name="log_instant_messages"/>
+ <check_box label="Zeitstempel hinzufügen" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Protokolle speichern in:
</text>
- <check_box label="IM an E-Mail senden ([EMAIL])" name="send_im_to_email"/>
- <check_box label="IM in Chat-Konsole anzeigen" name="include_im_in_chat_console"/>
- <check_box label="Zeitstempel in IM anzeigen" name="show_timestamps_check"/>
- <check_box label="Online-Freundbenachrichtigungen anzeigen" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Antwort für
-Beschäftigt-Modus:
- </text>
- <text name="text_box4">
- Protokolloptionen:
- </text>
- <check_box label="IM-Verlauf auf meinem Computer speichern" name="log_instant_messages"/>
- <check_box label="Zeitstempel in IM-Verlauf anzeigen" name="log_instant_messages_timestamp"/>
- <check_box label="Ende des letzten IM-Gesprächs anzeigen" name="log_show_history"/>
- <check_box label="Verlauf des lokalen Chats auf meinem Computer speichern" name="log_chat"/>
- <check_box label="Zeitstempel im Verlauf des lokalen Chats anzeigen" name="log_chat_timestamp"/>
- <check_box label="Eingehende IM in Chat-Verlauf anzeigen" name="log_chat_IM"/>
- <check_box label="Datum mit Zeitstempeln hinzufügen" name="log_date_timestamp"/>
- <button label="Pfad ändern" label_selected="Pfad ändern" name="log_path_button"/>
+ <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
+ <button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 97ec745d4d..2516cd3a40 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -1,30 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Kamera" name="Input panel">
- <text name=" Mouselook Options:">
- Mouselook-Optionen:
+<panel label="Hardware/Internet" name="Input panel">
+ <button label="Andere Geräte" name="joystick_setup_button"/>
+ <text name="Mouselook:">
+ Mouselook:
</text>
- <text name=" Mouse Sensitivity:">
+ <text name=" Mouse Sensitivity">
Mausempfindlichkeit:
</text>
- <check_box label="Maus umkehren" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Auto-Flug-Optionen:
+ <check_box label="Umkehren" name="invert_mouse"/>
+ <text name="Network:">
+ Netzwerk:
</text>
- <check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic_fly"/>
- <text name=" Camera Options:">
- Kameraoptionen:
+ <text name="Maximum bandwidth">
+ Maximale Bandbreite
</text>
- <text name="camera_fov_label">
- Kamera-Sichtwinkel:
+ <text name="text_box2">
+ kbit/s
</text>
- <text name="Camera Follow Distance:">
- Kameraabstand:
+ <check_box label="Eigener Port" name="connection_port_enabled"/>
+ <spinner label="Port-Nummer:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ Cachegröße
</text>
- <check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
- <check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
- <text name="text2">
- Avatar-Anzeigeoptionen:
+ <text name="text_box5">
+ MB
</text>
- <check_box label="Avatar in Mouselook anzeigen" name="first_person_avatar_visible"/>
- <button label="Joystick-Einrichtung" name="joystick_setup_button"/>
+ <text name="Cache location">
+ Cache-Ordner:
+ </text>
+ <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
+ <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value="0"/>
+ <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="1"/>
+ </radio_group>
+ <check_box initial_value="false" label="Web-Proxy aktivieren" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ Proxy-Standort:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/>
+ <spinner label="Portnummer:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index 3c4d8203fb..b01db30c82 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -1,73 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Audio und Video" name="Preference Media panel">
- <slider label="Master" name="System Volume"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sounds" name="Preference Media panel">
+ <slider label="Master-Lautstärke" name="System Volume"/>
+ <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/>
+ <slider label="Schaltflächen" name="UI Volume"/>
<slider label="Umgebung" name="Wind Volume"/>
- <slider label="Sounds" name="SFX Volume"/>
+ <slider label="Soundeffekte" name="SFX Volume"/>
+ <slider label="Musik wird gestreamt" name="Music Volume"/>
+ <check_box label="Aktiviert" name="music_enabled"/>
<slider label="Medien" name="Media Volume"/>
- <slider label="UI" name="UI Volume"/>
- <slider label="Musik" name="Music Volume"/>
- <slider label="Sprache" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Voice-Chat ist nicht verfügbar
- </text_editor>
- <check_box label="Voice-Chat aktivieren" name="enable_voice_check"/>
- <radio_group name="ear_location">
- <radio_item name="0" label="Voice-Chat von Kameraposition aus hören" />
- <radio_item name="1" label="Voice-Chat von Avatarposition aus hören" />
- </radio_group>
- <button label="Geräte-Einstellungen" name="device_settings_btn"/>
- <text name="muting_text">
- Lautstärke:
- </text>
- <check_box label="Audio stummschalten" name="disable audio" />
- <text name="streaming_prefs_text">
- Streaming-Einstellungen:
- </text>
- <text name="audio_prefs_text">
- Audio-Einstellungen:
- </text>
- <panel label="Lautstärke" name="Volume Panel" />
- <check_box label="Medien automatisch wiedergeben" name="auto_streaming_video" />
- <check_box label="Audio stummschalten, wenn Fenster minimiert ist"
- name="mute_when_minimized" />
- <text name="streaming_text">
- Streaming:
- </text>
- <check_box label="Streaming-Musik abspielen" name="streaming_music" />
- <check_box label="Streaming-Media abspielen" name="streaming_video" />
- <text name="system_volume_text">
- Soundeffekte:
- </text>
- <text name="wind_volume_text">
- Windlautstärke:
+ <check_box label="Aktiviert" name="enable_media"/>
+ <slider label="Voice-Chat" name="Voice Volume"/>
+ <check_box label="Aktiviert" name="enable_voice_check"/>
+ <check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben." value="wahr"/>
+ <check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden." value="wahr"/>
+ <text name="Listen from">
+ Voice-Chat-Einstellungen
</text>
- <text name="footsteps_volume_text">
- Schrittlautstärke:
- </text>
- <text name="ui_volume_text">
- UI-Volumen:
- </text>
- <slider label="Dopplereffekt" name="Doppler Effect" />
- <slider label="Distanzfaktor" name="Distance Factor" />
- <slider label="Rolloff-Faktor" name="Rolloff Factor" />
- <spinner label="L$ Änderungs-Grenzwert" name="L$ Change Threshold" />
- <spinner label="Gesundheitsschwellwert" name="Health Change Threshold" />
- <text name="doppler_effect_text">
- Audio-Einstellungen:
- </text>
- <text name="distance_factor_text">
- Distanzfaktor:
- </text>
- <text name="rolloff_factor_text">
- Rolloff-Faktor:
- </text>
- <text name="default_upload_bitrate_text">
- Standard-Upload-Bitrate:
- </text>
- <radio_group name="bitrate">
- <radio_item name="32kbps" label="32 kbit/s" />
- <radio_item name="64kbps" label="64 kbit/s" />
- <radio_item name="96kbps" label="96 kbit/s" />
- <radio_item name="128kbps" label="128 kbit/s" />
+ <radio_group name="ear_location">
+ <radio_item label="Kameraposition" name="0"/>
+ <radio_item label="Avatarposition" name="1"/>
</radio_group>
+ <button label="Eingabe-/Ausgabegeräte" name="device_settings_btn"/>
+ <panel label="Geräte-Einstellungen" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Eingabe
+ </text>
+ <text name="My volume label">
+ Meine Lautstärke:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ändern Sie die Lautstärke mit dem Regler"/>
+ <text name="wait_text">
+ Bitte warten
+ </text>
+ <text name="Output">
+ Ausgabe
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..0a19483f8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Medien werden geladen"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Rückwärts"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Vorwärts"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Startseite"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Medienwiedergabe stoppen"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Neu laden"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Ladevorgang stoppen"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Medien wiedergeben"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Medien pausieren"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Medien URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Whitelist aktiviert"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Fortschritt der Filmwiedergabe"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Rückwärts"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Vorwärts"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Stummschalten"/>
+ <slider name="volume_slider" tool_tip="Lautstärke"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Auf Medien zoomen"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Herauszoomen"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="URL in Browser öffnen"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
new file mode 100644
index 0000000000..cb598f89f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=de-DE
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=de
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
+ <string name="no_partner_text" value="Keiner"/>
+ <string name="no_group_text" value="Keiner"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Echtes Leben:"/>
+ </panel>
+ <text name="title_member_text" value="Einwohner seit:"/>
+ <text name="title_acc_status_text" value="Kontostatus:"/>
+ <text_editor name="acc_status_text">
+ Einwohner. Keine Zahlungsinfo archiviert.
+ Linden.
+ </text_editor>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Gruppen:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/>
+ <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/>
+ <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="36"/>
+ <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
+ <button label="Aussehen bearbeiten" name="edit_appearance_btn" tool_tip="Ihr Aussehen bearbeiten: Körpermaße, Bekleidung, usw."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml
new file mode 100644
index 0000000000..f02457dd80
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Online
+ </string>
+ <string name="status_offline">
+ Offline
+ </string>
+ <text_editor name="user_name" value="(wird geladen...)"/>
+ <text name="status" value="Online"/>
+ <tab_container name="tabs" tab_min_width="60">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="AUSWAHL" name="panel_picks"/>
+ <panel label="NOTIZEN &amp; PRIVATSPHÄRE" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_covenant.xml b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
index a72f0e4240..153082909a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Vertrag" name="Covenant">
<text name="estate_section_lbl">
- Grundstück:
+ Grundstück
</text>
<text name="estate_name_lbl">
Name:
@@ -18,7 +18,7 @@
<text name="estate_cov_lbl">
Vertrag:
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="320">
Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
</text>
<button label="?" name="covenant_help"/>
@@ -28,20 +28,19 @@
<button label="Zurücksetzen" name="reset_covenant"/>
<text name="covenant_help_text">
Änderungen am Vertrag werden für alle Parzellen auf dem
- Grundstück übernommen.
+Grundstück übernommen.
</text>
<text bottom_delta="-36" name="covenant_instructions">
- Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für dieses
- Grundstück zu ändern.
+ Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für dieses Grundstück zu ändern.
</text>
<text bottom_delta="-36" name="region_section_lbl">
- Region:
+ Region
</text>
<text name="region_name_lbl">
Name:
</text>
<text name="region_name_text">
- leyla
+ Erica
</text>
<text name="region_landtype_lbl">
Typ:
@@ -64,7 +63,7 @@
<text name="changeable_lbl">
Unterteilen:
</text>
- <text name="changeable_clause">
+ <text name="changeable_clause" width="366">
Land in dieser Region kann nicht zusammengelegt/geteilt werden.
</text>
<string name="can_resell">
diff --git a/indra/newview/skins/default/xui/de/panel_region_debug.xml b/indra/newview/skins/default/xui/de/panel_region_debug.xml
index 9e03ebeda3..920a513308 100644
--- a/indra/newview/skins/default/xui/de/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml
@@ -13,7 +13,7 @@
<check_box label="Physik deaktivieren" name="disable_physics_check" tool_tip="Physik in dieser Region deaktivieren"/>
<button label="?" name="disable_physics_help"/>
<button label="Übernehmen" name="apply_btn"/>
- <text name="objret_text_lbl" width="105">
+ <text name="objret_text_lbl" width="110">
Objekt zurückgeben
</text>
<text name="resident_text_lbl">
@@ -22,13 +22,13 @@
<line_editor name="target_avatar_name">
(keiner)
</line_editor>
- <button label="Auswählen..." name="choose_avatar_btn"/>
+ <button label="Auswählen" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Optionen:
</text>
- <check_box label="Nur Objekte mit Skripten zurückgeben" name="return_scripts" tool_tip="Es werden nur die Objekte zurückgegeben, die über Skripte verfügen."/>
- <check_box label="Nur Objekte auf dem Land eines anderen Einwohners zurückgeben" name="return_other_land" tool_tip="Es werden nur die Objekte zurückgegeben, die sich auf dem Land eines anderen Einwohners befinden"/>
- <check_box label="Objekte in jeder Region dieses Grundstücks zurückgeben" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundstücks zurückgegeben"/>
+ <check_box label="Mit Skripten" name="return_scripts" tool_tip="Es werden nur die Objekte zurückgegeben, die über Skripte verfügen."/>
+ <check_box label="Auf dem Land von jemand anderem" name="return_other_land" tool_tip="Es werden nur die Objekte zurückgegeben, die sich auf dem Land eines anderen Einwohners befinden"/>
+ <check_box label="In jeder Region auf diesem Grundstück" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundstücks zurückgegeben"/>
<button label="Zurückgeben" name="return_btn" width="90"/>
<button label="Top-Kollisionsobjekte..." name="top_colliders_btn" tool_tip="Liste der Objekte mit den meisten potenziellen Kollisionen"/>
<button label="?" name="top_colliders_help"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml
index ddc5941da6..b0c6dce8cf 100644
--- a/indra/newview/skins/default/xui/de/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml
@@ -1,8 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grundstück" name="Estate">
<text name="estate_help_text">
- Änderungen auf dieser Registerkarte wirken sich
-auf alle Regionen auf dem Grundstück aus.
+ Änderungen auf dieser Registerkarte wirken sich auf alle Regionen auf dem Grundstück aus.
</text>
<text name="estate_text">
Grundstück:
@@ -11,67 +10,65 @@ auf alle Regionen auf dem Grundstück aus.
(unbekannt)
</text>
<text name="owner_text">
- Eigentümer:
+ Grundstückseigentümer:
</text>
<text name="estate_owner">
(unbekannt)
</text>
<text name="Only Allow">
- Zugang beschränken auf:
+ Zugang auf Einwohner beschränken, die überprüft wurden von:
</text>
- <check_box label="Einwohner mit Zahlungsinformationen" name="limit_payment"
- tool_tip="Nicht identifizierte Einwohner verbannen." />
- <check_box label="Altersgeprüfte Erwachsene" name="limit_age_verified"
- tool_tip="Einwohner ohne Altersprüfung verbannen. Weitere Informationen finden Sie auf support.secondlife.com." />
- <check_box label="Voice-Chat erlauben" name="voice_chat_check" />
- <button label="?" name="voice_chat_help" />
+ <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen"/>
+ <check_box label="Altersüberprüfung" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+ <check_box label="Voice-Chat erlauben" name="voice_chat_check"/>
+ <button label="?" name="voice_chat_help"/>
<text name="abuse_email_text" width="222">
E-Mail-Adresse für Missbrauchsmeldungen:
</text>
<string name="email_unsupported">
Funktion nicht unterstützt
</string>
- <button label=" ?" name="abuse_email_address_help" />
- <button label="?" name="estate_manager_help" />
- <button label="Hinzufügen..." name="add_estate_manager_btn" />
- <button label="Entfernen..." name="remove_estate_manager_btn" />
- <check_box label="Globale Zeit verwenden" name="use_global_time_check" />
- <button label="?" name="use_global_time_help" />
- <check_box label="Sonne fest" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="Phase" name="sun_hour_slider" />
- <check_box label="Freien Zugang erlauben" name="externally_visible_check" />
- <button label="?" name="externally_visible_help" />
- <check_box label="Direktteleport zulassen" name="allow_direct_teleport" />
- <button label="?" name="allow_direct_teleport_help" />
+ <button label=" ?" name="abuse_email_address_help"/>
+ <button label="?" name="estate_manager_help"/>
+ <button label="Hinzufügen..." name="add_estate_manager_btn"/>
+ <button label="Entfernen..." name="remove_estate_manager_btn"/>
+ <check_box label="Globale Zeit verwenden" name="use_global_time_check"/>
+ <button label="?" name="use_global_time_help"/>
+ <check_box label="Sonne fest" name="fixed_sun_check"/>
+ <button label="?" name="fixed_sun_help"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <check_box label="Freien Zugang erlauben" name="externally_visible_check"/>
+ <button label="?" name="externally_visible_help"/>
+ <check_box label="Direktteleport zulassen" name="allow_direct_teleport"/>
+ <button label="?" name="allow_direct_teleport_help"/>
<text name="region_text_lbl">
Zugang nach Zahlungsstatus verweigern:
</text>
- <check_box label="Verweigern - keine archivierte Zahlungsinfo" name="deny_anonymous" />
- <check_box label="Verweigern - Zahlungsinfo archiviert" name="deny_identified" />
- <check_box label="Verweigern - Zahlungsinfo verwendet" name="deny_transacted" />
- <button label="Übernehmen" name="apply_btn" />
+ <check_box label="Verweigern - keine archivierte Zahlungsinfo" name="deny_anonymous"/>
+ <check_box label="Verweigern - Zahlungsinfo archiviert" name="deny_identified"/>
+ <check_box label="Verweigern - Zahlungsinfo verwendet" name="deny_transacted"/>
+ <button label="Übernehmen" name="apply_btn"/>
<text name="estate_manager_label">
Grundstücksverwalter:
</text>
<text name="allow_resident_label">
Zulässige Einwohner:
</text>
- <button label="?" name="allow_resident_help" />
- <button label="Hinzufügen..." name="add_allowed_avatar_btn" />
- <button label="Entfernen..." name="remove_allowed_avatar_btn" />
+ <button label="?" name="allow_resident_help"/>
+ <button label="Hinzufügen..." name="add_allowed_avatar_btn"/>
+ <button label="Entfernen..." name="remove_allowed_avatar_btn"/>
<text name="allow_group_label">
Zulässige Gruppen:
</text>
- <button label="?" name="allow_group_help" />
- <button label="Hinzufügen..." name="add_allowed_group_btn" />
- <button label="Entfernen..." name="remove_allowed_group_btn" />
+ <button label="?" name="allow_group_help"/>
+ <button label="Hinzufügen..." name="add_allowed_group_btn"/>
+ <button label="Entfernen..." name="remove_allowed_group_btn"/>
<text name="ban_resident_label">
Verbannte Einwohner:
</text>
- <button label="?" name="ban_resident_help" />
- <button label="Hinzufügen..." name="add_banned_avatar_btn" />
- <button label="Entfernen..." name="remove_banned_avatar_btn" />
- <button label="Nachricht an Grundstück senden..." name="message_estate_btn" />
- <button label="Benutzer von Grundstück werfen..." name="kick_user_from_estate_btn" />
+ <button label="?" name="ban_resident_help"/>
+ <button label="Hinzufügen..." name="add_banned_avatar_btn"/>
+ <button label="Entfernen..." name="remove_banned_avatar_btn"/>
+ <button label="Nachricht an Grundstück senden..." name="message_estate_btn"/>
+ <button label="Benutzer von Grundstück werfen..." name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml
index 13df2bfb3b..978b701054 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general.xml
@@ -39,10 +39,10 @@
<text label="Alterseinstufung" name="access_text">
Einstufung:
</text>
- <combo_box label="Mature" name="access_combo">
+ <combo_box label="Moderat" name="access_combo">
<combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
+ <combo_box.item label="Moderat" name="Mature"/>
+ <combo_box.item label="Allgemein" name="PG"/>
</combo_box>
<button label="?" name="access_help"/>
<button label="Übernehmen" name="apply_btn"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml
new file mode 100644
index 0000000000..732249df35
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Region" name="General">
+ <text name="region_text_lbl">
+ Region:
+ </text>
+ <text name="region_text">
+ unbekannt
+ </text>
+ <text name="version_channel_text_lbl">
+ Version:
+ </text>
+ <text name="version_channel_text">
+ unbekannt
+ </text>
+ <text name="region_type_lbl">
+ Typ:
+ </text>
+ <text name="region_type">
+ unbekannt
+ </text>
+ <check_box label="Terraformen blockieren" name="block_terraform_check"/>
+ <check_box label="Fliegen blockieren" name="block_fly_check"/>
+ <check_box label="Schaden zulassen" name="allow_damage_check"/>
+ <check_box label="Stoßen beschränken" name="restrict_pushobject"/>
+ <check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/>
+ <check_box label="Zusammenlegen/Teilen von Land zulassen" name="allow_parcel_changes_check"/>
+ <check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/>
+ <spinner label="Avatar-Limit" name="agent_limit_spin"/>
+ <spinner label="Objektbonus" name="object_bonus_spin"/>
+ <text label="Alterseinstufung" name="access_text">
+ Einstufung:
+ </text>
+ <combo_box label="Moderat" name="access_combo">
+ <combo_box.item label="Adult" name="Adult"/>
+ <combo_box.item label="Moderat" name="Mature"/>
+ <combo_box.item label="Allgemein" name="PG"/>
+ </combo_box>
+ <button label="Übernehmen" name="apply_btn"/>
+ <button label="Einen Benutzer nach Hause teleportieren..." name="kick_btn"/>
+ <button label="Alle Benutzer nach Hause teleportieren..." name="kick_all_btn"/>
+ <button label="Nachricht an Region senden..." name="im_btn"/>
+ <button label="Telehub verwalten..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_texture.xml b/indra/newview/skins/default/xui/de/panel_region_texture.xml
index df936ff643..f9997f300a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Bodentexturen" name="Textures">
<text name="region_text_lbl">
Region:
@@ -36,22 +36,22 @@
<text name="height_text_lbl9">
Nordost
</text>
- <spinner label="Niedrig" name="height_start_spin_0" />
- <spinner label="Niedrig" name="height_start_spin_1" />
- <spinner label="Niedrig" name="height_start_spin_2" />
- <spinner label="Niedrig" name="height_start_spin_3" />
- <spinner label="Hoch" name="height_range_spin_0" />
- <spinner label="Hoch" name="height_range_spin_1" />
- <spinner label="Hoch" name="height_range_spin_2" />
- <spinner label="Hoch" name="height_range_spin_3" />
+ <spinner label="Niedrig" name="height_start_spin_0" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_1" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_2" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_3" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_0" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_1" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_2" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_3" label_width="40"/>
<text name="height_text_lbl10">
Diese Werte geben den Mischungsgrad für die obigen Texturen an.
</text>
<text name="height_text_lbl11">
- Der UNTERE Wert gibt die MAXIMALE Höhe von Textur Nr. 1 an
+ In Metern gemessen. Der NIEDRIG-Wert ist die MAXIMALE Höhe der Textur #1, der HÖCHST-Wert ist die MINDEST-Höhe von Textur #4.
</text>
<text name="height_text_lbl12">
und der OBERE WERT die MINIMALE Höhe von Textur 4.
</text>
- <button label="Übernehmen" name="apply_btn" />
+ <button label="Übernehmen" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml
new file mode 100644
index 0000000000..17970cf261
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Wird geladen...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Öffentliche Objekte können keine Skripts ausführen
+ </panel.string>
+ <panel.string name="script_running">
+ Läuft
+ </panel.string>
+ <panel.string name="Title">
+ Skript: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Wird geladen...
+ </text_editor>
+ <button label="Speichern" label_selected="Speichern" name="Save_btn"/>
+ <combo_box label="Einfügen..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Datei" name="File">
+ <menu_item_call label="Speichern" name="Save"/>
+ <menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/>
+ </menu>
+ <menu label="Bearbeiten" name="Edit">
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederherstellen" name="Redo"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+ <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+ <menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Hilfe" name="Help">
+ <menu_item_call label="Hilfe..." name="Help..."/>
+ <menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..c91eb98e9c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MEIN AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar-Skript-Gebrauch
+ </text>
+ <text name="loading_text">
+ Wird geladen...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Objektname" name="name"/>
+ <scroll_list.columns label="Ort" name="location"/>
+ </scroll_list>
+ <button label="Liste aktualisieren" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..8d7cc1bf9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="REGIONSSPEICHER" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Parzellenskript-Speicher
+ </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
+ <text name="loading_text">
+ Wird geladen...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Objektname" name="name"/>
+ <scroll_list.columns label="Objekteigentümer" name="owner" width="130"/>
+ <scroll_list.columns label="Parzelle" name="parcel"/>
+ <scroll_list.columns label="Standort" name="location"/>
+ </scroll_list>
+ <button label="Liste aktualisieren" name="refresh_list_btn" width="110"/>
+ <button label="Markieren" name="highlight_btn"/>
+ <button label="Zurückgeben" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_side_tray.xml b/indra/newview/skins/default/xui/de/panel_side_tray.xml
new file mode 100644
index 0000000000..3c81636fa0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose" tab_title="Seitenleiste auf-/zuklappen"/>
+ <sidetray_tab description="Startseite." name="sidebar_home" tab_title="Startseite">
+ <panel label="Startseite" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me" tab_title="Mein Profil">
+ <panel_container name="panel_container">
+ <panel label="Ich" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people" tab_title="Leute">
+ <panel_container name="panel_container">
+ <panel label="Gruppenprofil" name="panel_group_info_sidetray"/>
+ <panel label="Ignorierte Einwohner &amp; Objekte" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places" tab_title="Orte">
+ <panel label="Orte" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory" tab_title="Mein Inventar">
+ <panel label="Inventar bearbeiten" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance" tab_title="Mein Aussehen">
+ <panel label="Aussehen bearbeiten" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/de/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/de/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..93fff56f84
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Klappmenü??"/>
+ <button name="show_help" tool_tip="Hilfe anzeigen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/de/panel_sidetray_home_tab.xml
new file mode 100644
index 0000000000..cf3080a4f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_sidetray_home_tab.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Part of side tray, see that XML file for panel config -->
+<panel label="home_tab" name="home_tab">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="sidebar_people">
+ <text name="tab_name" value="Leute"/>
+ <text name="tab_description">
+ Freunde, Gruppen, Kontakte und Leute in Ihrer Nähe finden.
+ </text>
+ </panel>
+ <panel name="sidebar_places">
+ <text name="tab_name" value="Orte"/>
+ <text name="tab_description">
+ Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben.
+ </text>
+ </panel>
+ <panel name="sidebar_me">
+ <text name="tab_name" value="Mein Profil"/>
+ <text name="tab_description">
+ Öffentliches Profil bearbeiten.
+ </text>
+ </panel>
+ <panel name="sidebar_appearance">
+ <text name="tab_name" value="Mein Aussehen"/>
+ <text name="tab_description">
+ Ändern Sie Ihr Aussehen und Ihren aktuellen Look.
+ </text>
+ </panel>
+ <panel name="sidebar_inventory">
+ <text name="tab_name" value="Mein Inventar"/>
+ <text name="tab_description">
+ Inventar durchsuchen.
+ </text>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..5b8137af4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/>
+ <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 01091e38fb..283df990ae 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -1,42 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Der Name der Parzelle, auf der Sie sich befinden. Klicken Sie für Land-Informationen.">
- Parzellenname hier
- </text>
- <text name="BalanceText" tool_tip="Kontostand">
- Wird geladen...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Geld kaufen"/>
- <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
- 12:00
- </text>
- <text name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
- </text>
- <text name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
- </text>
- <button label="" label_selected="" name="scriptout" tool_tip="Skriptwarnungen und -fehler"/>
- <button label="" label_selected="" name="health" tool_tip="Gesundheit"/>
- <text name="HealthText" tool_tip="Gesundheit">
- 100%
- </text>
- <button label="" label_selected="" name="fly" tool_tip="Fliegen aus"/>
- <button label="" label_selected="" name="build" tool_tip="Bauen aus"/>
- <button label="" label_selected="" name="scripts" tool_tip="Skripts aus"/>
- <button name="no_fly" tool_tip="Fliegen ist unzulässig"/>
- <button name="no_build" tool_tip="Bauen/Rezzen ist unzulässig"/>
- <button name="no_scripts" tool_tip="Skripte sind unzulässig"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Kein Stoßen"/>
- <button name="status_voice" tool_tip="Voice aktiviert"/>
- <button name="status_no_voice" tool_tip="Voice hier nicht möglich"/>
- <button label="" label_selected="" name="buyland" tool_tip="Diese Parzelle kaufen"/>
- <text name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Paketverlust
- </text>
- <text name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Bandbreite
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/>
+ <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
+ 24:00 H PST
</text>
- <line_editor label="Suchen" name="search_editor" tool_tip="[SECOND_LIFE] durchsuchen"/>
- <button name="search_btn" tool_tip="[SECOND_LIFE] durchsuchen"/>
+ <button name="media_toggle_btn" tool_tip="Klicken, um Medien ein-/auszuschalten"/>
+ <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_sys_well_item.xml b/indra/newview/skins/default/xui/de/panel_sys_well_item.xml
new file mode 100644
index 0000000000..504f1727e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_sys_well_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="sys_well_item" title="sys_well_item">
+ <text name="title">
+ Achtung Forelle! ACHTUNG! DIE! FORELLE!
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_teleport_history.xml b/indra/newview/skins/default/xui/de/panel_teleport_history.xml
new file mode 100644
index 0000000000..4efd83dfff
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_teleport_history.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Heute"/>
+ <accordion_tab name="yesterday" title="Gestern"/>
+ <accordion_tab name="2_days_ago" title="Vor 2 Tagen"/>
+ <accordion_tab name="3_days_ago" title="Vor 3 Tagen"/>
+ <accordion_tab name="4_days_ago" title="Vor 4 Tagen"/>
+ <accordion_tab name="5_days_ago" title="Vor 5 Tagen"/>
+ <accordion_tab name="6_days_and_older" title="6 Tage und älter"/>
+ <accordion_tab name="1_month_and_older" title="1 Monat und älter"/>
+ <accordion_tab name="6_months_and_older" title="6 Monate und älter"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/de/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..4b57aa69b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Objektinfo anzeigen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_world_map.xml b/indra/newview/skins/default/xui/de/panel_world_map.xml
index 7b18c5e822..f7454dd634 100644
--- a/indra/newview/skins/default/xui/de/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/de/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Wird geladen...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ungültige Position
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml
index 95eb6c5eb2..554a5c27a4 100644
--- a/indra/newview/skins/default/xui/de/role_actions.xml
+++ b/indra/newview/skins/default/xui/de/role_actions.xml
@@ -1,200 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Diese Fähigkeiten ermöglichen das Hinzufügen und Entfernen von Mitgliedern sowie den Beitritt ohne Einladung."
- name="Membership">
- <action description="Personen in diese Gruppe einladen"
- longdescription="Personen zu dieser Gruppe einladen können Sie mit „Neue Person einladen...“ unter „Mitglieder und Rollen“ &gt; „Mitglieder“."
- name="member invite" />
- <action description="Mitglieder aus dieser Gruppe werfen"
- longdescription="Mitglieder von der Gruppe ausschließen können Sie mit „Aus Gruppe werfen“ unter „Mitglieder und Rollen“ &gt; „Mitglieder“. Ein Eigentümer kann jeden, außer einen anderen Eigentümer, ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann von der Gruppe ausschließen, wenn es die Rolle „Jeder“ innehat, aber KEINE ANDERE Rolle. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen."
- name="member eject" />
- <action
- description="„Registrierung offen“ einstellen und „Beitrittsgebühr“ ändern"
- longdescription="„Beitritt möglich“ erlaubt den Beitritt zur Gruppe ohne vorhergehende Einladung. Die „Beitrittsgebühr“ wird in den Gruppeneinstellungen auf der Registerkarte „Allgemein“ festgelegt."
- name="member options" />
+ <action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen und Entfernen von Mitgliedern sowie den Beitritt ohne Einladung." name="Membership">
+ <action description="Personen in diese Gruppe einladen" longdescription="Leute in diese Gruppe mit der Schaltfläche „Einladen“ im Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“ in die Gruppe einladen." name="member invite"/>
+ <action description="Mitglieder aus dieser Gruppe werfen" longdescription="Leute aus dieser Gruppe mit der Schaltfläche „Hinauswerfen“ im Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“ aus der Gruppe werfen. Ein Eigentümer kann jeden, außer einen anderen Eigentümer, ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann aus der Gruppe werfen, wenn es die Rolle Jeder inne hat, jedoch KEINE andere Rolle. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen." name="member eject"/>
+ <action description="„Registrierung offen“ aktivieren/deaktivieren und „Beitrittsgebühr“ ändern." longdescription="„Registrierung offen“ aktivieren, um damit neue Mitglieder ohne Einladung beitreten können, und die „Beitrittsgebühr“ im Abschnitt „Allgemein“ ändern." name="member options"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen das Hinzufügen, Entfernen und Ändern von Gruppenrollen, das Zuweisen und Entfernen von Rollen und das Zuweisen von Fähigkeiten zu Rollen."
- name="Roles">
- <action description="Neue Rollen erstellen"
- longdescription="Neue Rollen erstellen Sie unter „Mitglieder und Rollen“ &gt; „Rollen“."
- name="role create" />
- <action description="Rollen löschen"
- longdescription="Rollen löschen können Sie unter „Mitglieder und Rollen“ &gt; „Rollen“."
- name="role delete" />
- <action description="Rollennamen, Titel und Beschreibung ändern"
- longdescription="Namen, Titel und Beschreibungen von Rollen können Sie nach Auswahl einer Rolle unten auf der Registerkarte „Mitglieder und Rollen“ &gt; „Rollen“ ändern."
- name="role properties" />
- <action description="Mitgliedern nur eigene Rollen zuweisen"
- longdescription="Mitgliedern nur eigene Rollen zuweisen können Sie im Bereich „Zugewiesene Rollen“ auf der Registerkarte „Mitglieder und Rollen“ &gt; „Mitglieder“. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigenen Rollen zuweisen."
- name="role assign member limited" />
- <action description="Mitgliedern beliebige Rolle zuweisen"
- longdescription="Mitgliedern beliebige Rolle zuweisen können Sie im Bereich „Zugewiesene Rollen“ auf der Registerkarte „Mitglieder und Rollen“ &gt; „Mitglieder“. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen."
- name="role assign member" />
- <action description="Mitgliedern Rollen entziehen"
- longdescription="Mitgliedern Rollen entziehen können Sie im Bereich „Rollen“ auf der Registerkarte „Mitglieder und Rollen“ &gt; „Mitglieder“. Eigentümer können nicht entfernt werden."
- name="role remove member" />
- <action description="Rollenfähigkeiten zuweisen und entfernen"
- longdescription="Rollenfähigkeiten zuweisen und entfernen können Sie im Bereich „Zulässige Fähigkeiten“ auf der Registerkarte „Mitglieder und Rollen“ &gt; „Rollen“. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen."
- name="role change actions" />
+ <action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen, Entfernen und Ändern von Gruppenrollen, das Zuweisen und Entfernen von Rollen und das Zuweisen von Fähigkeiten zu Rollen." name="Roles">
+ <action description="Neue Rollen erstellen" longdescription="Neue Rollen im Abschnitt „Rollen“ &gt; Registerkarte „Rollen“ erstellen." name="role create"/>
+ <action description="Rollen löschen" longdescription="Neue Rollen im Abschnitt „Rollen“ &gt; Registerkarte „Rollen“ löschen." name="role delete"/>
+ <action description="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern." longdescription="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern. Dies wird im unteren Bereich des Abschnitts „Rollen“ &gt; Registerkarte „Rollen“ eingestellt, nachdem eine Rolle ausgewählt wurde." name="role properties"/>
+ <action description="Mitgliedern nur eigene Rollen zuweisen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) können Mitgliedern Rollen zugewiesen werden. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigenen Rollen zuweisen." name="role assign member limited"/>
+ <action description="Mitgliedern beliebige Rolle zuweisen" longdescription="Sie können Mitglieder jede beliebige Rolle der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) zuweisen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role assign member"/>
+ <action description="Mitgliedern Rollen entziehen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ &gt; Registerkarte „Mitglieder“) können Mitgliedern Rollen abgenommen werden. Eigentümer können nicht entfernt werden." name="role remove member"/>
+ <action description="Rollenfähigkeiten zuweisen und entfernen" longdescription="Fähigkeiten für jede Rolle können in der Liste „Zulässige Fähigkeiten&quot; (Abschnitt „Rollen&quot; &gt; Registerkarte „Rollen“) zugewiesen und auch entzogen werden. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Überlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role change actions"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, die Gruppenidentität zu ändern, z. B. öffentliche Sichtbarkeit, Charta und Insignien."
- name="Group Identity">
- <action
- description="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind."
- longdescription="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind. Diese Einstellungen finden Sie auf der Registerkarte „Allgemein“."
- name="group change identity" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, die Gruppenidentität zu ändern, z. B. öffentliche Sichtbarkeit, Charta und Insignien." name="Group Identity">
+ <action description="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind." longdescription="Charta, Insignien und „In Suche anzeigen&quot; ändern. Diese Einstellungen werden im Abschnitt „Allgemein&quot; vorgenommen." name="group change identity"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, gruppeneigenes Land zu übertragen, zu bearbeiten und zu verkaufen. Klicken Sie mit rechts auf den Boden und wählen Sie „Land-Info...“ oder klicken Sie in der Menüleiste auf den Parzellennamen."
- name="Parcel Management">
- <action description="Land übertragen und für Gruppe kaufen"
- longdescription="Land übertragen und für Gruppe kaufen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Allgemein“."
- name="land deed" />
- <action description="Land Governor Linden überlassen"
- longdescription="Land Governor Linden überlassen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann gruppeneigenes Land unter „Land-Info“ &gt; „Allgemein“ aufgeben und es ohne Verkauf in das Eigentum von Linden zurückführen! Überlegen Sie sich, wem Sie diese Fähigkeit verleihen."
- name="land release" />
- <action description="Land.zu.verkaufen-Info einstellen"
- longdescription="Land zu verkaufen-Info einstellen. *WARNUNG* Mitglieder in einer Rolle mit dieser Fähigkeit können gruppeneigenes Land jederzeit unter „Land-Info“ &gt; „Allgemein“ verkaufen! Überlegen Sie sich, wem Sie diese Fähigkeit verleihen."
- name="land set sale info" />
- <action description="Parzellen teilen und zusammenlegen"
- longdescription="Parzellen teilen und zusammenlegen. Klicken Sie dazu mit rechts auf den Boden, wählen sie „Terrain bearbeiten“ und ziehen Sie die Maus auf das Land, um eine Auswahl zu treffen. Zum Teilen treffen Sie eine Auswahl und klicken auf „Unterteilen...“. Zum Zusammenlegen von zwei oder mehr angrenzenden Parzellen klicken Sie auf „Zusammenlegen...“."
- name="land divide join" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, gruppeneigenes Land zu übertragen, zu bearbeiten und zu verkaufen. Klicken Sie mit rechts auf den Boden und wählen Sie „Land-Info...“ oder klicken Sie in der Navigationsleiste auf das Symbol „i&quot;." name="Parcel Management">
+ <action description="Land übertragen und für Gruppe kaufen" longdescription="Land übertragen und für Gruppe kaufen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Allgemein“." name="land deed"/>
+ <action description="Land Governor Linden überlassen" longdescription="Land Governor Linden überlassen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann gruppeneigenes Land unter „Land-Info“ &gt; „Allgemein“ aufgeben und es ohne Verkauf in das Eigentum von Linden zurückführen! Überlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land release"/>
+ <action description="Land.zu.verkaufen-Info einstellen" longdescription="Land zu verkaufen-Info einstellen. *WARNUNG* Mitglieder in einer Rolle mit dieser Fähigkeit können gruppeneigenes Land jederzeit unter „Land-Info“ &gt; „Allgemein“ verkaufen! Überlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land set sale info"/>
+ <action description="Parzellen teilen und zusammenlegen" longdescription="Parzellen teilen und zusammenlegen. Klicken Sie dazu mit rechts auf den Boden, wählen sie „Terrain bearbeiten“ und ziehen Sie die Maus auf das Land, um eine Auswahl zu treffen. Zum Teilen treffen Sie eine Auswahl und klicken auf „Unterteilen“. Zum Zusammenlegen von zwei oder mehr angrenzenden Parzellen klicken Sie auf „Zusammenlegen“." name="land divide join"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, den Parzellennamen und die Veröffentlichungseinstellungen sowie die Anzeige des Suchverzeichnisses, den Landepunkt und die TP-Routenoptionen festzulegen."
- name="Parcel Identity">
- <action
- description="„In Orte suchen anzeigen“ ein-/ausschalten und Kategorie festlegen"
- longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „In Orte suchen anzeigen“ ein- und ausschalten und die Parzellenkategorie festlegen."
- name="land find places" />
- <action
- description="Name und Beschreibung der Parzelle und Einstellungen für „Im Web veröffentlichen“ ändern"
- longdescription="Name und Beschreibung der Parzelle und Einstellungen für „Im Web veröffentlichen“ ändern. Diese Einstellungen finden Sie unter „Land-Info“ &gt; „Optionen“."
- name="land change identity" />
- <action description="Landepunkt und Teleport-Route festlegen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle einen Landepunkt für ankommende Teleports und Teleport-Routen festlegen. Diese Einstellungen finden Sie unter „Land-Info“ &gt; „Optionen“."
- name="land set landing point" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, den Parzellennamen und die Veröffentlichungseinstellungen sowie die Anzeige des Suchverzeichnisses, den Landepunkt und die TP-Routenoptionen festzulegen." name="Parcel Identity">
+ <action description="„Ort in Suche anzeigen&quot; ein-/ausschalten und Kategorie festlegen." longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „Ort in Suche anzeigen“ ein- und ausschalten und die Parzellenkategorie festlegen." name="land find places"/>
+ <action description="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen&quot; ändern" longdescription="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen&quot; ändern Diese Einstellungen finden Sie unter „Land-Info“ &gt; Registerkarte „Optionen“." name="land change identity"/>
+ <action description="Landepunkt und Teleport-Route festlegen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle einen Landepunkt für ankommende Teleports und Teleport-Routen festlegen. Diese Einstellungen finden Sie unter „Land-Info“ &gt; „Optionen“." name="land set landing point"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern."
- name="Parcel Settings">
- <action description="Musik- und Medieneinstellungen ändern"
- longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ &gt; „Medien“."
- name="land change media" />
- <action description="„Terrain bearbeiten“ ein/aus"
- longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ &gt; „Optionen“ &gt; „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundstücks und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Optionen“."
- name="land edit" />
- <action description="„Land-Info“-Optionen einstellen"
- longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen auf gruppeneigenem Land erlauben: „Objekte erstellen“, „Terrain bearbeiten“, „Landmarken erstellen“ und „Skripts ausführen“."
- name="land options" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern." name="Parcel Settings">
+ <action description="Musik- und Medieneinstellungen ändern" longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ &gt; „Medien“." name="land change media"/>
+ <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ &gt; „Optionen“ &gt; „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundstücks und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Optionen“." name="land edit"/>
+ <action description="„Land-Info“-Optionen einstellen" longdescription="„Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen erlauben: „Terrain bearbeiten“, „Bauen“, „Landmarken erstellen“ und „Skripts ausführen“ auf gruppeneigenem Land in „Land-Info“ &gt; Registerkarte „Optionen“." name="land options"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Umgehen von Restriktionen auf gruppeneigenen Parzellen zu erlauben."
- name="Parcel Powers">
- <action description="„Terrain bearbeiten“ zulassen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle das Terrain bearbeiten, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist."
- name="land allow edit land" />
- <action description="„Fliegen“ zulassen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle fliegen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist."
- name="land allow fly" />
- <action description="„Objekte erstellen“ zulassen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle Objekte erstellen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist."
- name="land allow create" />
- <action description="„Landmarke erstellen“ zulassen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können für eine gruppeneigene Parzelle eine Landmarke erstellen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist."
- name="land allow landmark" />
- <action description="„Hier als Zuhause wählen“ auf Gruppenland zulassen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer an diese Gruppe übertragenen Parzelle die Funktion „Welt“ &gt; „Hier als Zuhause wählen“ verwenden."
- name="land allow set home" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Umgehen von Restriktionen auf gruppeneigenen Parzellen zu erlauben." name="Parcel Powers">
+ <action description="„Terrain bearbeiten“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle das Terrain bearbeiten, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist." name="land allow edit land"/>
+ <action description="„Fliegen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle fliegen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist." name="land allow fly"/>
+ <action description="„Objekte erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle Objekte erstellen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist." name="land allow create"/>
+ <action description="„Landmarke erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können für eine gruppeneigene Parzelle eine Landmarke erstellen, selbst wenn diese Option unter „Land-Info“ &gt; „Optionen“ deaktiviert ist." name="land allow landmark"/>
+ <action description="„Hier als Zuhause wählen“ auf Gruppenland zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer an diese Gruppe übertragenen Parzelle die Funktion „Welt“ &gt; „Landmarken“ &gt; „Hier als Zuhause wählen“ verwenden." name="land allow set home"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, den Zugang auf gruppeneigenen Parzellen zu steuern. Dazu gehört das Einfrieren und Ausschließen von Einwohnern."
- name="Parcel Access">
- <action description="Parzellen-Zugangslisten verwalten"
- longdescription="Parzellen-Zugangslisten bearbeiten Sie unter „Land-Info“ &gt; „Zugang“."
- name="land manage allowed" />
- <action description="Parzellen-Bannlisten verwalten"
- longdescription="Parzellen-Bannlisten bearbeiten Sie unter „Land-Info“ &gt; „Verbannen“."
- name="land manage banned" />
- <action
- description="Parzelleneinstellungen für „Pässe verkaufen...“ ändern"
- longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen...“ ändern Sie unter „Land-Info“ &gt; „Zugang“."
- name="land manage passes" />
- <action description="Einwohner aus Parzellen werfen und einfrieren"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Personen auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie die Person mit rechts an und wählen Sie „Mehr“ &gt;, dann „Ausschließen...“ oder „Einfrieren...“."
- name="land admin" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, den Zugang auf gruppeneigenen Parzellen zu steuern. Dazu gehört das Einfrieren und Ausschließen von Einwohnern." name="Parcel Access">
+ <action description="Parzellen-Zugangslisten verwalten" longdescription="Parzellen-Zugangslisten bearbeiten Sie unter „Land-Info“ &gt; „Zugang“." name="land manage allowed"/>
+ <action description="Parzellen-Bannlisten verwalten" longdescription="Bannlisten für Parzellen bearbeiten Sie unter „Land-Info“ &gt; Registerkarte „Zugang“." name="land manage banned"/>
+ <action description="Parzelleneinstellungen für „Pässe verkaufen“ ändern" longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen“ ändern Sie unter „Land-Info“ &gt; Registerkarte „Zugang“." name="land manage passes"/>
+ <action description="Einwohner aus Parzellen werfen und einfrieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Einwohner auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie den Einwohner mit rechts an und wählen Sie „Hinauswerfen“ oder „Einfrieren“." name="land admin"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können das Grundstück aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden."
- name="Parcel Content">
- <action description="Gruppeneigene Objekte zurückgeben"
- longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben."
- name="land return group owned" />
- <action description="Gruppenobjekte zurückgeben"
- longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben."
- name="land return group set" />
- <action description="Gruppenfremde Objekte zurückgeben"
- longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben."
- name="land return non group" />
- <action description="Landschaftsgestaltung mit Linden-Pflanzen"
- longdescription="Die Fähigkeit zur Landschaftsgestaltung ermöglicht das Platzieren und Verschieben von Linden-Bäumen, -Pflanzen und -Gräsern. Diese Objekte finden Sie im Bibliotheksordner des Inventars unter „Objekte“. Sie lassen sich auch mit der Schaltfläche „Erstellen“ erzeugen."
- name="land gardening" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können das Grundstück aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content">
+ <action description="Gruppeneigene Objekte zurückgeben" longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return group owned"/>
+ <action description="Gruppenobjekte zurückgeben" longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return group set"/>
+ <action description="Gruppenfremde Objekte zurückgeben" longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return non group"/>
+ <action description="Landschaftsgestaltung mit Linden-Pflanzen" longdescription="Die Fähigkeit zur Landschaftsgestaltung ermöglicht das Platzieren und Verschieben von Linden-Bäumen, -Pflanzen und -Gräsern. Diese Objekte finden Sie im Bibliotheksordner des Inventars unter Objekte. Sie lassen sich auch mit der Menü Erstellen erzeugen." name="land gardening"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, gruppeneigene Objekte zu übertragen, zu bearbeiten und zu verkaufen. Änderungen werden unter „Auswahl-Tool“ &gt; „Bearbeiten“ auf der Registerkarte „Allgemein“ vorgenommen. Klicken Sie mit rechts auf ein Objekt und wählen Sie „Bearbeiten“, um seine Einstellungen anzuzeigen."
- name="Object Management">
- <action description="Objekte an Gruppe übertragen"
- longdescription="Objekte an eine Gruppe übertragen können Sie unter „Auswahl-Tool“ &gt; „Bearbeiten“ auf der Registerkarte „Allgemein“."
- name="object deed" />
- <action
- description="Gruppeneigene Objekte manipulieren (verschieben, kopieren, bearbeiten)"
- longdescription="Gruppeneigene Objekte lassen sich unter „Auswahl-Tool“ &gt; „Bearbeiten“ auf der Registerkarte „Allgemein“ manipulieren (verschieben, kopieren, bearbeiten)."
- name="object manipulate" />
- <action description="Gruppeneigene Objekte zum Verkauf freigeben"
- longdescription="Gruppeneigene Objekte zum Verkauf freigeben können Sie unter „Auswahl-Tool“ &gt; „Bearbeiten“ auf der Registerkarte „Allgemein“."
- name="object set sale" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, gruppeneigene Objekte zu übertragen, zu bearbeiten und zu verkaufen. Änderungen werden im Werkzeug Bearbeiten auf der Registerkarte Allgemein vorgenommen. Klicken Sie mit rechts auf ein Objekt und wählen Sie &apos;Bearbeiten &apos;, um seine Einstellungen anzuzeigen." name="Object Management">
+ <action description="Objekte an Gruppe übertragen" longdescription="Objekte an eine Gruppe übertragen können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object deed"/>
+ <action description="Gruppeneigene Objekte manipulieren (verschieben, kopieren, bearbeiten)" longdescription="Gruppeneigene Objekte lassen sich im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“ manipulieren (verschieben, kopieren, bearbeiten)." name="object manipulate"/>
+ <action description="Gruppeneigene Objekte zum Verkauf freigeben" longdescription="Gruppeneigene Objekte zum Verkauf freigeben, können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object set sale"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Gruppenschulden und Gruppendividenden zu aktivieren und den Zugriff auf das Gruppenkonto zu beschränken."
- name="Accounting">
- <action description="Gruppenschulden zahlen und Gruppendividende erhalten"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit zahlen automatisch Gruppenschulden und erhalten Gruppendividenden. D. h. sie erhalten einen Anteil an Verkäufen von gruppeneigenem Land, der täglich verrechnet wird. Außerdem zahlen Sie automatisch für anfallende Kosten wie Parzellenlisten-Gebühren."
- name="accounting accountable" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Gruppenschulden und Gruppendividenden zu aktivieren und den Zugriff auf das Gruppenkonto zu beschränken." name="Accounting">
+ <action description="Gruppenschulden zahlen und Gruppendividende erhalten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit zahlen automatisch Gruppenschulden und erhalten Gruppendividenden. D. h. sie erhalten einen Anteil an Verkäufen von gruppeneigenem Land, der täglich verrechnet wird. Außerdem zahlen Sie automatisch für anfallende Kosten wie Parzellenlisten-Gebühren." name="accounting accountable"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Senden, Empfangen und Anzeigen von Gruppennachrichten zu erlauben."
- name="Notices">
- <action description="Mitteilungen senden"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können in der Gruppeninfo unter „Mitteilungen“ Mitteilungen senden."
- name="notices send" />
- <action description="Mitteilungen erhalten und ältere Mitteilungen anzeigen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen erhalten und in der Gruppeninfo unter „Mitteilungen“ ältere Mitteilungen einsehen."
- name="notices receive" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Senden, Empfangen und Anzeigen von Gruppennachrichten zu erlauben." name="Notices">
+ <action description="Mitteilungen senden" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen im Abschnitt Gruppe &gt; Mitteilungen senden." name="notices send"/>
+ <action description="Mitteilungen erhalten und ältere Mitteilungen anzeigen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen erhalten und im Abschnitt Gruppe &gt; Mitteilungen ältere Mitteilungen anzeigen." name="notices receive"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Erstellen von Anfragen, das Abstimmen über Anfragen und das Anzeigen des Abstimmprotokolls zu erlauben."
- name="Proposals">
- <action description="Neue Anfragen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Anfragen stellen, über die auf der Registerkarte „Anfragen“ in der Gruppeninfo abgestimmt werden kann."
- name="proposal start" />
- <action description="Über Anfragen abstimmen"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können in der Gruppeninfo unter „Anfragen“ über Anfragen abstimmen."
- name="proposal vote" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Erstellen von Anfragen, das Abstimmen über Anfragen und das Anzeigen des Abstimmprotokolls zu erlauben." name="Proposals">
+ <action description="Neue Anfragen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Anfragen stellen, über die auf der Registerkarte „Anfragen“ in der Gruppeninfo abgestimmt werden kann." name="proposal start"/>
+ <action description="Über Anfragen abstimmen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können in der Gruppeninfo unter „Anfragen“ über Anfragen abstimmen." name="proposal vote"/>
</action_set>
- <action_set
- description="Diese Fähigkeiten ermöglichen es, den Zugang zu Gruppen-Chat und Gruppen-Voice-Chat zu steuern."
- name="Chat">
- <action description="Gruppen-Chat beitreten"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Chat und Gruppen-Voice-Chat beitreten."
- name="join group chat" />
- <action description="Gruppen-Voice-Chat beitreten"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Voice-Chat beitreten. HINWEIS: Sie benötigen die Fähigkeit „Gruppen-Chat beitreten“, um Zugang zu dieser Voice-Chat-Sitzung zu erhalten."
- name="join voice chat" />
- <action description="Gruppen-Chat moderieren"
- longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können den Zugang zu und die Teilnahme an Gruppen-Chat- und Voice-Chat-Sitzungen steuern."
- name="moderate group chat" />
+ <action_set description="Diese Fähigkeiten ermöglichen es, den Zugang zu Gruppen-Chat und Gruppen-Voice-Chat zu steuern." name="Chat">
+ <action description="Gruppen-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Chat und Gruppen-Voice-Chat beitreten." name="join group chat"/>
+ <action description="Gruppen-Voice-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Voice-Chat beitreten. HINWEIS: Sie benötigen die Fähigkeit „Gruppen-Chat beitreten“, um Zugang zu dieser Voice-Chat-Sitzung zu erhalten." name="join voice chat"/>
+ <action description="Gruppen-Chat moderieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können den Zugang zu und die Teilnahme an Gruppen-Chat- und Voice-Chat-Sitzungen steuern." name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_appearance.xml b/indra/newview/skins/default/xui/de/sidepanel_appearance.xml
new file mode 100644
index 0000000000..7a280bd7ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/sidepanel_appearance.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Outfits" name="appearance panel">
+ <string name="No Outfit" value="Kein Outfit"/>
+ <panel name="panel_currentlook">
+ <button label="Bearbeiten" name="editappearance_btn"/>
+ <text name="currentlook_title">
+ (nicht gespeichert)
+ </text>
+ <text name="currentlook_name">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ </panel>
+ <filter_editor label="Outfits filtern" name="Filter"/>
+ <button label="Anziehen" name="wear_btn"/>
+ <button label="Neues Outfit" name="newlook_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
new file mode 100644
index 0000000000..f6cf911bb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sonstiges" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Profil" name="info_btn"/>
+ <button label="Anziehen" name="wear_btn"/>
+ <button label="Wiedergeben" name="play_btn"/>
+ <button label="Teleportieren" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
new file mode 100644
index 0000000000..09935019ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Objektprofil">
+ <panel.string name="unknown">
+ (unbekannt)
+ </panel.string>
+ <panel.string name="public">
+ (öffentlich)
+ </panel.string>
+ <panel.string name="you_can">
+ Sie können:
+ </panel.string>
+ <panel.string name="owner_can">
+ Eigentümer kann:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Objektprofil"/>
+ <text name="where" value="(Inventar)"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Name:
+ </text>
+ <text name="LabelItemDescTitle">
+ Beschreibung:
+ </text>
+ <text name="LabelCreatorTitle">
+ Ersteller:
+ </text>
+ <text name="LabelCreatorName">
+ Nicole Linden
+ </text>
+ <button label="Profil" name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Eigentümer:
+ </text>
+ <text name="LabelOwnerName">
+ Thrax Linden
+ </text>
+ <button label="Profil" name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Erworben:
+ </text>
+ <text name="LabelAcquiredDate">
+ Mittwoch, 24. Mai 2006, 12:50:46
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Sie können:
+ </text>
+ <check_box label="Bearbeiten" name="CheckOwnerModify"/>
+ <check_box label="Kopieren" name="CheckOwnerCopy"/>
+ <check_box label="Transferieren" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Jeder:
+ </text>
+ <check_box label="Kopieren" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppe:
+ </text>
+ <check_box label="Teilen" name="CheckShareWithGroup" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
+ <text name="NextOwnerLabel">
+ Nächster Eigentümer:
+ </text>
+ <check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
+ <check_box label="Kopieren" name="CheckNextOwnerCopy"/>
+ <check_box label="Transferieren" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+ </panel>
+ <check_box label="Zum Verkauf" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preis: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Abbrechen" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
new file mode 100644
index 0000000000..825acac79d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Objektprofil">
+ <panel.string name="text deed continued">
+ Übertragung
+ </panel.string>
+ <panel.string name="text deed">
+ Übertragung
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Sie können dieses Objekt bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Sie können diese Objekte bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Sie können dieses Objekt nicht bearbeiten.
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Sie können diese Objekte nicht bearbeiten.
+ </panel.string>
+ <panel.string name="text modify warning">
+ Diese Objekt verfügt über verknüpfte Teile
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preis: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Summe: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Stückpreis: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mischpreis
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mischverkauf
+ </panel.string>
+ <text name="title" value="Objektprofil"/>
+ <text name="where" value="(inworld)"/>
+ <panel label="">
+ <text name="Name:">
+ Name:
+ </text>
+ <text name="Description:">
+ Beschreibung:
+ </text>
+ <text name="CreatorNameLabel">
+ Ersteller:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ Eigentümer:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ Gruppe:
+ </text>
+ <button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
+ <name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
+ <button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
+ <text name="label click action">
+ Bei Linksklick:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Auf Objekt setzen" name="Sitonobject"/>
+ <combo_box.item label="Objekt kaufen" name="Buyobject"/>
+ <combo_box.item label="Objekt bezahlen" name="Payobject"/>
+ <combo_box.item label="Öffnen" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Sie können dieses Objekt bearbeiten.
+ </text>
+ <text name="Anyone can:">
+ Jeder:
+ </text>
+ <check_box label="Kopieren" name="checkbox allow everyone copy"/>
+ <check_box label="Bewegen" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Gruppe:
+ </text>
+ <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
+ <text name="NextOwnerLabel">
+ Nächster Eigentümer:
+ </text>
+ <check_box label="Bearbeiten" name="checkbox next owner can modify"/>
+ <check_box label="Kopieren" name="checkbox next owner can copy"/>
+ <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+ </panel>
+ <check_box label="Zum Verkauf" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box.item label="Inhalte" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preis: L$" name="Edit Cost"/>
+ <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Öffnen" name="open_btn"/>
+ <button label="Bezahlen" name="pay_btn"/>
+ <button label="Kaufen" name="buy_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index af9185e0b7..c9307a5d7d 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1,12 +1,39 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life-Grid:
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Support-Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Hardware wird erfasst...
+ </string>
+ <string name="StartupLoading">
+ Wird geladen
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
<string name="LoginInProgress">
Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Anmeldung erfolgt...
+ </string>
<string name="LoginAuthenticating">
Authentifizierung
</string>
@@ -25,6 +52,9 @@
<string name="LoginInitializingMultimedia">
Multimedia wird initialisiert...
</string>
+ <string name="LoginInitializingFonts">
+ Schriftarten werden geladen...
+ </string>
<string name="LoginVerifyingCache">
Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...
</string>
@@ -55,8 +85,17 @@
<string name="LoginDownloadingClothing">
Kleidung wird geladen...
</string>
+ <string name="LoginFailedNoNetwork">
+ Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ </string>
+ <string name="Quit">
+ Beenden
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=de-DE
+ </string>
<string name="AgentLostConnection">
- In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
+ In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
</string>
<string name="TooltipPerson">
Person
@@ -73,39 +112,9 @@
<string name="TooltipIsGroup">
(Gruppe)
</string>
- <string name="TooltipFlagScript">
- Skript
- </string>
- <string name="TooltipFlagPhysics">
- Physik
- </string>
- <string name="TooltipFlagTouch">
- Berühren
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Inventar fallen lassen
- </string>
- <string name="TooltipFlagPhantom">
- Phantom
- </string>
- <string name="TooltipFlagTemporary">
- Temporär
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Rechtsklick für Menü)
- </string>
- <string name="TooltipFreeToCopy">
- Kopieren möglich
- </string>
<string name="TooltipForSaleL$">
Zum Verkauf: [AMOUNT] L$
</string>
- <string name="TooltipForSaleMsg">
- Zum Verkauf: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Gruppenbau
</string>
@@ -133,6 +142,73 @@
<string name="TooltipMustSingleDrop">
Sie können nur ein einzelnes Objekt hierher ziehen
</string>
+ <string name="TooltipHttpUrl">
+ Anklicken, um Webseite anzuzeigen
+ </string>
+ <string name="TooltipSLURL">
+ Anklicken, um Informationen zu diesem Standort anzuzeigen
+ </string>
+ <string name="TooltipAgentUrl">
+ Anklicken, um das Profil dieses Einwohners anzuzeigen
+ </string>
+ <string name="TooltipGroupUrl">
+ Anklicken, um Beschreibung der Gruppe anzuzeigen
+ </string>
+ <string name="TooltipEventUrl">
+ Anklicken, um Beschreibung der Veranstaltung anzuzeigen
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Anklicken, um diese Anzeige anzuzeigen
+ </string>
+ <string name="TooltipParcelUrl">
+ Anklicken, um Beschreibung der Parzelle anzuzeigen
+ </string>
+ <string name="TooltipTeleportUrl">
+ Anklicken, um zu diesem Standort zu teleportieren
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Anklicken, um Beschreibung des Objekts anzuzeigen
+ </string>
+ <string name="TooltipMapUrl">
+ Klicken, um diese Position auf der Karte anzuzeigen
+ </string>
+ <string name="TooltipSLAPP">
+ Anklicken, um Befehl secondlife:// auszuführen
+ </string>
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportieren nach
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Karte anzeigen für
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Schließen (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Schließen (Strg+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Wiederherstellen
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimieren
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Abnehmen
+ </string>
+ <string name="BUTTON_DOCK">
+ Andocken
+ </string>
+ <string name="BUTTON_HELP">
+ Hilfe anzeigen
+ </string>
+ <string name="Searching">
+ Suchen...
+ </string>
+ <string name="NoneFound">
+ Nicht gefunden.
+ </string>
<string name="RetrievingData">
Laden...
</string>
@@ -148,8 +224,8 @@
<string name="AvatarNameWaiting">
(wartet)
</string>
- <string name="AvatarNameHippos">
- (hippos)
+ <string name="AvatarNameMultiple">
+ (mehrere)
</string>
<string name="GroupNameNone">
(keiner)
@@ -187,7 +263,79 @@
<string name="AssetErrorUnknownStatus">
Status unbekannt
</string>
- <string name="AvatarEditingApparance">
+ <string name="texture">
+ Textur
+ </string>
+ <string name="sound">
+ Sound
+ </string>
+ <string name="calling card">
+ Visitenkarte
+ </string>
+ <string name="landmark">
+ Landmarke
+ </string>
+ <string name="legacy script">
+ Skript (veraltet)
+ </string>
+ <string name="clothing">
+ Kleidung
+ </string>
+ <string name="object">
+ Objekt
+ </string>
+ <string name="note card">
+ Notizkarte
+ </string>
+ <string name="folder">
+ Ordner
+ </string>
+ <string name="root">
+ Hauptverzeichnis
+ </string>
+ <string name="lsl2 script">
+ LSL2 Skript
+ </string>
+ <string name="lsl bytecode">
+ LSL Bytecode
+ </string>
+ <string name="tga texture">
+ tga-Textur
+ </string>
+ <string name="body part">
+ Körperteil
+ </string>
+ <string name="snapshot">
+ Foto
+ </string>
+ <string name="lost and found">
+ Fundbüro
+ </string>
+ <string name="targa image">
+ targa-Bild
+ </string>
+ <string name="trash">
+ Papierkorb
+ </string>
+ <string name="jpeg image">
+ jpeg-Bild
+ </string>
+ <string name="animation">
+ Animation
+ </string>
+ <string name="gesture">
+ Geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ Favoriten
+ </string>
+ <string name="symbolic link">
+ Link
+ </string>
+ <string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
<string name="AvatarAway">
@@ -197,7 +345,7 @@
Beschäftigt
</string>
<string name="AvatarMuted">
- Stummgeschaltet
+ Ignoriert
</string>
<string name="anim_express_afraid">
Ängstlich
@@ -412,17 +560,86 @@
<string name="worldmap_offline">
Offline
</string>
+ <string name="worldmap_results_none_found">
+ Nicht gefunden.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Unvollständige Datei
+ </string>
+ <string name="ST_NO_JOINT">
+ HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.
+ </string>
<string name="whisper">
flüstert:
</string>
<string name="shout">
ruft:
</string>
+ <string name="ringing">
+ Verbindung mit In-Welt-Voice-Chat...
+ </string>
+ <string name="connected">
+ Verbunden
+ </string>
+ <string name="unavailable">
+ Der aktuelle Standort unterstützt keine Voice-Kommunikation
+ </string>
+ <string name="hang_up">
+ Verbindung mit In-Welt-Voice-Chat getrennt
+ </string>
+ <string name="reconnect_nearby">
+ Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Linden-Dollar (L$) von Ihnen nehmen
+ </string>
+ <string name="ActOnControlInputs">
+ Steuerung festlegen
+ </string>
+ <string name="RemapControlInputs">
+ Steuerung neu zuweisen
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatar animieren
+ </string>
+ <string name="AttachToYourAvatar">
+ An Avatar anhängen
+ </string>
+ <string name="ReleaseOwnership">
+ Eigentum aufgeben und öffentlich machen
+ </string>
+ <string name="LinkAndDelink">
+ Mit Objekten verknüpfen und davon trennen
+ </string>
+ <string name="AddAndRemoveJoints">
+ Verbindungen zu anderen Objekten hinzufügen und entfernen
+ </string>
+ <string name="ChangePermissions">
+ Berechtigungen ändern
+ </string>
+ <string name="TrackYourCamera">
+ Kameraverfolgung
+ </string>
+ <string name="ControlYourCamera">
+ Kamerasteuerung
+ </string>
+ <string name="NotConnected">
+ Nicht verbunden
+ </string>
<string name="SIM_ACCESS_PG">
- PG
+ Allgemein
</string>
<string name="SIM_ACCESS_MATURE">
- Mature
+ Moderat
</string>
<string name="SIM_ACCESS_ADULT">
Adult
@@ -436,12 +653,6 @@
<string name="land_type_unknown">
(unbekannt)
</string>
- <string name="covenant_never_modified">
- Zuletzt geändert: (nie)
- </string>
- <string name="covenant_modified">
- Zuletzt geändert:
- </string>
<string name="all_files">
Alle Dateien
</string>
@@ -487,17 +698,922 @@
<string name="choose_the_directory">
Verzeichnis auswählen
</string>
+ <string name="AvatarSetNotAway">
+ Nicht abwesend
+ </string>
+ <string name="AvatarSetAway">
+ Abwesend
+ </string>
+ <string name="AvatarSetNotBusy">
+ Nicht beschäftigt
+ </string>
+ <string name="AvatarSetBusy">
+ Beschäftigt
+ </string>
+ <string name="shape">
+ Form
+ </string>
+ <string name="skin">
+ Haut
+ </string>
+ <string name="hair">
+ Haare
+ </string>
+ <string name="eyes">
+ Augen
+ </string>
+ <string name="shirt">
+ Hemd
+ </string>
+ <string name="pants">
+ Hose
+ </string>
+ <string name="shoes">
+ Schuhe
+ </string>
+ <string name="socks">
+ Socken
+ </string>
+ <string name="jacket">
+ Jacke
+ </string>
+ <string name="gloves">
+ Handschuhe
+ </string>
+ <string name="undershirt">
+ Unterhemd
+ </string>
+ <string name="underpants">
+ Unterhose
+ </string>
+ <string name="skirt">
+ Rock
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tätowierung
+ </string>
+ <string name="invalid">
+ ungültig
+ </string>
+ <string name="next">
+ Weiter
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Gruppenmitteilung
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Gruppenmitteilungen
+ </string>
+ <string name="GroupNotifySentBy">
+ Gesendet von
+ </string>
+ <string name="GroupNotifyAttached">
+ Im Anhang:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Anlage öffnen
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Siehe Anhang
+ </string>
+ <string name="TeleportOffer">
+ Teleport-Angebot
+ </string>
+ <string name="StartUpNotifications">
+ Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Sie haben noch %d weitere Benachrichtigungen
+ </string>
+ <string name="BodyPartsRightArm">
+ Rechter Arm
+ </string>
+ <string name="BodyPartsHead">
+ Kopf
+ </string>
+ <string name="BodyPartsLeftArm">
+ Linker Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Linkes Bein
+ </string>
+ <string name="BodyPartsTorso">
+ Oberkörper
+ </string>
+ <string name="BodyPartsRightLeg">
+ Rechtes Bein
+ </string>
+ <string name="GraphicsQualityLow">
+ Niedrig
+ </string>
+ <string name="GraphicsQualityMid">
+ Mittel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Hoch
+ </string>
+ <string name="LeaveMouselook">
+ ESC drücken, um zur Normalansicht zurückzukehren
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Im Inventar wurden keine passenden Objekte gefunden. Versuchen Sie es mit [secondlife:///app/search/groups „Suche&quot;].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Hier eine Landmarke hin ziehen, um diese zu Ihrem Favoriten hinzuzufügen.
+ </string>
+ <string name="InventoryNoTexture">
+ Sie haben keine Kopie dieser Textur in Ihrem Inventar.
+ </string>
+ <string name="no_transfer" value=" (kein Transferieren)"/>
+ <string name="no_modify" value=" (kein Bearbeiten)"/>
+ <string name="no_copy" value=" (kein Kopieren)"/>
+ <string name="worn" value=" (getragen)"/>
+ <string name="link" value=" (Link)"/>
+ <string name="broken_link" value=" (unvollständiger_Link)"/>
+ <string name="LoadingContents">
+ Inhalte werden geladen...
+ </string>
+ <string name="NoContents">
+ Keine Inhalte
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="PermYes">
+ Ja
+ </string>
+ <string name="PermNo">
+ Nein
+ </string>
+ <string name="Chat" value=" Chat:"/>
+ <string name="Sound" value=" Sound:"/>
+ <string name="Wait" value=" --- Warten:"/>
+ <string name="AnimFlagStop" value=" Animation stoppen:"/>
+ <string name="AnimFlagStart" value=" Animation starten:"/>
+ <string name="Wave" value=" Winken"/>
+ <string name="HelloAvatar" value=" Hallo Avatar!"/>
+ <string name="ViewAllGestures" value=" Alle anzeigen &gt;&gt;"/>
+ <string name="Animations" value=" Animationen,"/>
+ <string name="Calling Cards" value=" Visitenkarten,"/>
+ <string name="Clothing" value=" Kleidung,"/>
+ <string name="Gestures" value=" Gesten,"/>
+ <string name="Landmarks" value=" Landmarken,"/>
+ <string name="Notecards" value=" Notizkarten,"/>
+ <string name="Objects" value=" Objekte,"/>
+ <string name="Scripts" value=" Skripts,"/>
+ <string name="Sounds" value=" Sounds,"/>
+ <string name="Textures" value=" Texturen,"/>
+ <string name="Snapshots" value=" Fotos,"/>
+ <string name="No Filters" value="Nein "/>
+ <string name="Since Logoff" value=" - Seit Abmeldung"/>
+ <string name="InvFolder My Inventory">
+ Mein Inventar
+ </string>
+ <string name="InvFolder My Favorites">
+ Meine Favoriten
+ </string>
+ <string name="InvFolder Library">
+ Bibliothek
+ </string>
+ <string name="InvFolder Textures">
+ Texturen
+ </string>
+ <string name="InvFolder Sounds">
+ Sounds
+ </string>
+ <string name="InvFolder Calling Cards">
+ Visitenkarten
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarken
+ </string>
+ <string name="InvFolder Scripts">
+ Skripts
+ </string>
+ <string name="InvFolder Clothing">
+ Kleidung
+ </string>
+ <string name="InvFolder Objects">
+ Objekte
+ </string>
+ <string name="InvFolder Notecards">
+ Notizkarten
+ </string>
+ <string name="InvFolder New Folder">
+ Neuer Ordner
+ </string>
+ <string name="InvFolder Inventory">
+ Inventar
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Nicht-Komprimierte Bilder
+ </string>
+ <string name="InvFolder Body Parts">
+ Körperteile
+ </string>
+ <string name="InvFolder Trash">
+ Papierkorb
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoalbum
+ </string>
+ <string name="InvFolder Lost And Found">
+ Fundbüro
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Nicht-Komprimierte Sounds
+ </string>
+ <string name="InvFolder Animations">
+ Animationen
+ </string>
+ <string name="InvFolder Gestures">
+ Gesten
+ </string>
+ <string name="InvFolder favorite">
+ Favoriten
+ </string>
+ <string name="InvFolder Current Outfit">
+ Aktuelles Outfit
+ </string>
+ <string name="InvFolder My Outfits">
+ Meine Outfits
+ </string>
+ <string name="InvFolder Friends">
+ Freunde
+ </string>
+ <string name="InvFolder All">
+ Alle
+ </string>
+ <string name="Buy">
+ Kaufen
+ </string>
+ <string name="BuyforL$">
+ Kaufen für L$
+ </string>
+ <string name="Stone">
+ Stein
+ </string>
+ <string name="Metal">
+ Metall
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Holz
+ </string>
+ <string name="Flesh">
+ Fleisch
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Gummi
+ </string>
+ <string name="Light">
+ Licht
+ </string>
+ <string name="KBShift">
+ Umschalt-Taste
+ </string>
+ <string name="KBCtrl">
+ Strg
+ </string>
+ <string name="Chest">
+ Brust
+ </string>
+ <string name="Skull">
+ Schädel
+ </string>
+ <string name="Left Shoulder">
+ Linke Schulter
+ </string>
+ <string name="Right Shoulder">
+ Rechte Schulter
+ </string>
+ <string name="Left Hand">
+ Linke Hand
+ </string>
+ <string name="Right Hand">
+ Rechte Hand
+ </string>
+ <string name="Left Foot">
+ Linker Fuß
+ </string>
+ <string name="Right Foot">
+ Rechter Fuß
+ </string>
+ <string name="Spine">
+ Wirbelsäule
+ </string>
+ <string name="Pelvis">
+ Becken
+ </string>
+ <string name="Mouth">
+ Mund
+ </string>
+ <string name="Chin">
+ Kinn
+ </string>
+ <string name="Left Ear">
+ Linkes Ohr
+ </string>
+ <string name="Right Ear">
+ Rechtes Ohr
+ </string>
+ <string name="Left Eyeball">
+ Linker Augapfel
+ </string>
+ <string name="Right Eyeball">
+ Rechter Augapfel
+ </string>
+ <string name="Nose">
+ Nase
+ </string>
+ <string name="R Upper Arm">
+ R Oberarm
+ </string>
+ <string name="R Forearm">
+ R Unterarm
+ </string>
+ <string name="L Upper Arm">
+ L Oberarm
+ </string>
+ <string name="L Forearm">
+ L Unterarm
+ </string>
+ <string name="Right Hip">
+ Rechte Hüfte
+ </string>
+ <string name="R Upper Leg">
+ R Oberschenkel
+ </string>
+ <string name="R Lower Leg">
+ R Unterschenkel
+ </string>
+ <string name="Left Hip">
+ Linke Hüfte
+ </string>
+ <string name="L Upper Leg">
+ L Oberschenkel
+ </string>
+ <string name="L Lower Leg">
+ L Unterschenkel
+ </string>
+ <string name="Stomach">
+ Bauch
+ </string>
+ <string name="Left Pec">
+ Linke Brust
+ </string>
+ <string name="Right Pec">
+ Rechts
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] alt
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] alt
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] alt
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] alt
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] alt
+ </string>
+ <string name="TodayOld">
+ Seit heute Mitglied
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] Jahr
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] Jahre
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] Monat
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] Monate
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] Monate
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] Woche
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] Wochen
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] Tag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] Tage
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] Tage
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] Mitglied
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] Mitglieder
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] Mitglieder
+ </string>
+ <string name="AcctTypeResident">
+ Einwohner
+ </string>
+ <string name="AcctTypeTrial">
+ Test
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charta-Mitglied
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab-Mitarbeiter
+ </string>
+ <string name="PaymentInfoUsed">
+ Zahlungsinfo verwendet
+ </string>
+ <string name="PaymentInfoOnFile">
+ Zahlungsinfo archiviert
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Keine Zahlungsinfo archiviert
+ </string>
+ <string name="AgeVerified">
+ Altersgeprüft
+ </string>
+ <string name="NotAgeVerified">
+ Nicht altersgeprüft
+ </string>
+ <string name="Center 2">
+ Mitte 2
+ </string>
+ <string name="Top Right">
+ Oben rechts
+ </string>
+ <string name="Top">
+ Oben
+ </string>
+ <string name="Top Left">
+ Oben links
+ </string>
+ <string name="Center">
+ Zentrieren
+ </string>
+ <string name="Bottom Left">
+ Unten links
+ </string>
+ <string name="Bottom">
+ Unten
+ </string>
+ <string name="Bottom Right">
+ Unten rechts
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Heruntergeladen, wird kompiliert
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Skript wurde auf Server nicht gefunden.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Beim Herunterladen ist ein Problem aufgetreten
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Unzureichende Rechte zum Herunterladen eines Skripts.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Unzureichende Berechtigungen für
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unbekannter Fehler beim Herunterladen
+ </string>
+ <string name="CompileQueueTitle">
+ Rekompilierung
+ </string>
+ <string name="CompileQueueStart">
+ rekompilieren
+ </string>
+ <string name="ResetQueueTitle">
+ Zurücksetzen
+ </string>
+ <string name="ResetQueueStart">
+ Zurücksetzen
+ </string>
+ <string name="RunQueueTitle">
+ Skript ausführen
+ </string>
+ <string name="RunQueueStart">
+ Skript ausführen
+ </string>
+ <string name="NotRunQueueTitle">
+ Skript anhalten
+ </string>
+ <string name="NotRunQueueStart">
+ Skript anhalten
+ </string>
+ <string name="CompileSuccessful">
+ Kompilieren erfolgreich abgeschlossen!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Kompilieren erfolgreich abgeschlossen, speichern...
+ </string>
+ <string name="SaveComplete">
+ Speichervorgang abgeschlossen.
+ </string>
+ <string name="ObjectOutOfRange">
+ Skript (Objekt außerhalb des Bereichs)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objekt [OBJECT], Besitzer [OWNER]
+ </string>
+ <string name="GroupsNone">
+ keine
+ </string>
+ <string name="Group" value=" (Gruppe)"/>
+ <string name="Unknown">
+ (unbekannt)
+ </string>
+ <string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/>
+ <string name="NextStipendDay" value="Der nächste Stipendium-Tag ist "/>
+ <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
+ <string name="Balance">
+ Kontostand
+ </string>
+ <string name="Credits">
+ Danksagung
+ </string>
+ <string name="Debits">
+ Soll
+ </string>
+ <string name="Total">
+ Gesamtbetrag
+ </string>
+ <string name="NoGroupDataFound">
+ Für Gruppe wurden keine Gruppendaten gefunden
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ Mainland
+ </string>
+ <string name="IMTeen">
+ Teen
+ </string>
+ <string name="RegionInfoError">
+ Fehler
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ alle Grundstücke gehören [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ alle Grundstücke, die Sie besitzen
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ alle Grundstücke, die Sie für [OWNER] verwalten
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parzellenskript-Speicher
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Aufgeführte Parzellen: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Verwendeter Speicher: [COUNT] KB
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parzelleskript-URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Verwendete URLs: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Fehler bei Informationsabruf
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Keine Parzellen wurden ausgewählt
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Informationen werden abgerufen...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Sie sind nicht berechtigt, diese Parzelle zu untersuchen.
+ </string>
+ <string name="SITTING_ON">
+ sitzt auf
+ </string>
+ <string name="ATTACH_CHEST">
+ Brust
+ </string>
+ <string name="ATTACH_HEAD">
+ Kopf
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Linke Schulter
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Rechte Schulter
+ </string>
+ <string name="ATTACH_LHAND">
+ Linke Hand
+ </string>
+ <string name="ATTACH_RHAND">
+ Rechte Hand
+ </string>
+ <string name="ATTACH_LFOOT">
+ Linker Fuß
+ </string>
+ <string name="ATTACH_RFOOT">
+ Rechter Fuß
+ </string>
+ <string name="ATTACH_BACK">
+ Hinten
+ </string>
+ <string name="ATTACH_PELVIS">
+ Becken
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mund
+ </string>
+ <string name="ATTACH_CHIN">
+ Kinn
+ </string>
+ <string name="ATTACH_LEAR">
+ Linkes Ohr
+ </string>
+ <string name="ATTACH_REAR">
+ Rechtes Ohr
+ </string>
+ <string name="ATTACH_LEYE">
+ Linkes Auge
+ </string>
+ <string name="ATTACH_REYE">
+ Rechtes Auge
+ </string>
+ <string name="ATTACH_NOSE">
+ Nase
+ </string>
+ <string name="ATTACH_RUARM">
+ Rechter Oberarm
+ </string>
+ <string name="ATTACH_RLARM">
+ Rechter Unterarm
+ </string>
+ <string name="ATTACH_LUARM">
+ Linker Oberarm
+ </string>
+ <string name="ATTACH_LLARM">
+ Linker Unterarm
+ </string>
+ <string name="ATTACH_RHIP">
+ Rechte Hüfte
+ </string>
+ <string name="ATTACH_RULEG">
+ Rechter Oberschenkel
+ </string>
+ <string name="ATTACH_RLLEG">
+ Rechter Unterschenkel
+ </string>
+ <string name="ATTACH_LHIP">
+ Linke Hüfte
+ </string>
+ <string name="ATTACH_LULEG">
+ Linker Oberschenkel
+ </string>
+ <string name="ATTACH_LLLEG">
+ Linker Unterschenkel
+ </string>
+ <string name="ATTACH_BELLY">
+ Bauch
+ </string>
+ <string name="ATTACH_RPEC">
+ Rechts
+ </string>
+ <string name="ATTACH_LPEC">
+ Linke Brust
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Mitte 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD oben rechts
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD oben Mitte
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD oben links
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Mitte 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD unten links
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD unten
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD unten rechts
+ </string>
+ <string name="CursorPos">
+ Zeile [LINE], Spalte [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] gefunden
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsNewScript">
+ Neues Skript
+ </string>
+ <string name="MuteByName">
+ (nach Namen)
+ </string>
+ <string name="MuteAgent">
+ (Einwohner)
+ </string>
+ <string name="MuteObject">
+ (Objekt)
+ </string>
+ <string name="MuteGroup">
+ (Gruppe)
+ </string>
+ <string name="RegionNoCovenant">
+ Für dieses Grundstück liegt kein Vertrag vor.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung.
+ </string>
+ <string name="covenant_last_modified">
+ Zuletzt geändert:
+ </string>
+ <string name="none_text" value=" (keiner) "/>
+ <string name="never_text" value=" (nie) "/>
+ <string name="GroupOwned">
+ In Gruppenbesitz
+ </string>
+ <string name="Public">
+ Öffentlich
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (wird nach Veröffentlichung aktualisiert)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus&quot;-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Wird geladen...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vorschau
+ </string>
+ <string name="MultiPropertiesTitle">
+ Eigenschaften
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Ein Objekt namens
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ im Besitz der Gruppe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ im Besitz einer unbekannten Gruppe
+ </string>
+ <string name="InvOfferOwnedBy">
+ im Besitz von
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ im Besitz eines unbekannten Einwohners
+ </string>
+ <string name="InvOfferGaveYou">
+ hat Ihnen folgendes übergeben
+ </string>
+ <string name="InvOfferYouDecline">
+ Sie lehnen folgendes ab:
+ </string>
+ <string name="InvOfferFrom">
+ von
+ </string>
+ <string name="GroupMoneyTotal">
+ Gesamtbetrag
+ </string>
+ <string name="GroupMoneyBought">
+ gekauft
+ </string>
+ <string name="GroupMoneyPaidYou">
+ bezahlte Ihnen
+ </string>
+ <string name="GroupMoneyPaidInto">
+ bezahlte an
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ kaufte Pass für
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ bezahlte Gebühr für Event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ bezahlte Preis für Event
+ </string>
+ <string name="GroupMoneyBalance">
+ Kontostand
+ </string>
+ <string name="GroupMoneyCredits">
+ Danksagung
+ </string>
+ <string name="GroupMoneyDebits">
+ Soll
+ </string>
+ <string name="ViewerObjectContents">
+ Inhalte
+ </string>
+ <string name="AcquiredItems">
+ Erworbene Artikel
+ </string>
+ <string name="Cancel">
+ Abbrechen
+ </string>
+ <string name="UploadingCosts">
+ Hochladen von %s kostet
+ </string>
+ <string name="UnknownFileExtension">
+ Unbekanntes Dateiformat .%s
+Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorieren
+ </string>
+ <string name="MuteAvatar">
+ Ignorieren
+ </string>
+ <string name="UnmuteObject">
+ Freischalten
+ </string>
+ <string name="UnmuteAvatar">
+ Freischalten
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Zu meinen Landmarken hinzufügen...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Meine Landmarken bearbeiten...
+ </string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Strg+
@@ -508,79 +1624,1681 @@
<string name="accel-win-shift">
Umschalt+
</string>
- <string name="GraphicsQualityLow">
- Niedrig
+ <string name="FileSaved">
+ Datei wurde gespeichert
</string>
- <string name="GraphicsQualityMid">
- Mittel
+ <string name="Receiving">
+ Daten werden empfangen
</string>
- <string name="GraphicsQualityHigh">
+ <string name="AM">
+ Uhr
+ </string>
+ <string name="PM">
+ Uhr
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Vorwärts
+ </string>
+ <string name="Left">
+ Links
+ </string>
+ <string name="Right">
+ Rechts
+ </string>
+ <string name="Back">
+ Hinten
+ </string>
+ <string name="North">
+ Norden
+ </string>
+ <string name="South">
+ Süden
+ </string>
+ <string name="West">
+ Westen
+ </string>
+ <string name="East">
+ Osten
+ </string>
+ <string name="Up">
+ Nach oben
+ </string>
+ <string name="Down">
+ Nach unten
+ </string>
+ <string name="Any Category">
+ Alle Kategorien
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land mieten
+ </string>
+ <string name="Property Rental">
+ Immobilie mieten
+ </string>
+ <string name="Special Attraction">
+ Attraktionen
+ </string>
+ <string name="New Products">
+ Neue Produkte
+ </string>
+ <string name="Employment">
+ Stellenangebote
+ </string>
+ <string name="Wanted">
+ Gesucht
+ </string>
+ <string name="Service">
+ Dienstleistungen
+ </string>
+ <string name="Personal">
+ Sonstiges
+ </string>
+ <string name="None">
+ Keiner
+ </string>
+ <string name="Linden Location">
+ Lindenort
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; Kultur
+ </string>
+ <string name="Business">
+ Firmen
+ </string>
+ <string name="Educational">
+ Bildung
+ </string>
+ <string name="Gaming">
+ Spielen
+ </string>
+ <string name="Hangout">
+ Treffpunkt
+ </string>
+ <string name="Newcomer Friendly">
+ Anfängergerecht
+ </string>
+ <string name="Parks&amp;Nature">
+ Parks und Natur
+ </string>
+ <string name="Residential">
+ Wohngebiet
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Sonstige
+ </string>
+ <string name="Any">
+ Alle
+ </string>
+ <string name="You">
+ Sie
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Mehrere Medien
+ </string>
+ <string name="Play Media">
+ Medien Abspielen/Pausieren
+ </string>
+ <string name="MBCmdLineError">
+ Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
+Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
+Fehler:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Verwendung in Befehlszeile:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
+
+Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet.
+Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal.
+Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.
+ </string>
+ <string name="MBFatalError">
+ Unbehebbarer Fehler
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] läuft bereits.
+Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden.
+Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
+Möchten Sie einen Absturz-Bericht einschicken?
+ </string>
+ <string name="MBAlert">
+ Benachrichtigung
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
+[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird.
+
+Möchten Sie fortfahren?
+ </string>
+ <string name="MBWarning">
+ Hinweis
+ </string>
+ <string name="MBNoAutoUpdate">
+ Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
+Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass fehlgeschlagen
+ </string>
+ <string name="MBError">
+ Fehler
+ </string>
+ <string name="MBFullScreenErr">
+ Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
+Ausführung erfolgt in Fenster.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)
+ </string>
+ <string name="MBShutdownErr">
+ Fehler beim Herunterfahren
+ </string>
+ <string name="MBDevContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBPixelFmtErr">
+ Passendes Pixelformat wurde nicht gefunden
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Beschreibung für Pixelformat nicht verfügbar
+ </string>
+ <string name="MBTrueColorWindow">
+ Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich.
+Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
+Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben.
+Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung &gt; Anzeige &gt; Einstellungen).
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Pixel-Format kann nicht eingestellt werden.
+ </string>
+ <string name="MBGLContextErr">
+ Kann keinen Kontext für GL-Gerät erstellen
+ </string>
+ <string name="MBGLContextActErr">
+ Kann keinen Kontext für GL-Gerät aktivieren
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
+
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Bartschatten
+ </string>
+ <string name="All White">
+ Ganz weiß
+ </string>
+ <string name="Anime Eyes">
+ Anime-Augen
+ </string>
+ <string name="Arced">
+ Gewölbt
+ </string>
+ <string name="Arm Length">
+ Armlänge
+ </string>
+ <string name="Attached">
+ Angewachsen
+ </string>
+ <string name="Attached Earlobes">
+ Angewachsene Ohrläppchen
+ </string>
+ <string name="Back Fringe">
+ Nackenfransen
+ </string>
+ <string name="Baggy">
+ Tränensäcke
+ </string>
+ <string name="Bangs">
+ Pony
+ </string>
+ <string name="Beady Eyes">
+ Knopfaugen
+ </string>
+ <string name="Belly Size">
+ Bauchgröße
+ </string>
+ <string name="Big">
+ Groß
+ </string>
+ <string name="Big Butt">
+ Großer Hintern
+ </string>
+ <string name="Big Hair Back">
+ Volumen: Hinten
+ </string>
+ <string name="Big Hair Front">
+ Volumen: Vorne
+ </string>
+ <string name="Big Hair Top">
+ Volumen: Oben
+ </string>
+ <string name="Big Head">
+ Groß
+ </string>
+ <string name="Big Pectorals">
+ Große Brustmuskeln
+ </string>
+ <string name="Big Spikes">
+ Große Stacheln
+ </string>
+ <string name="Black">
+ Schwarz
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blondes Haar
+ </string>
+ <string name="Blush">
+ Rouge
+ </string>
+ <string name="Blush Color">
+ Rougefarbe
+ </string>
+ <string name="Blush Opacity">
+ Rouge Deckkraft
+ </string>
+ <string name="Body Definition">
+ Körperkonturen
+ </string>
+ <string name="Body Fat">
+ Körperfett
+ </string>
+ <string name="Body Freckles">
+ Sommersprossen
+ </string>
+ <string name="Body Thick">
+ breit
+ </string>
+ <string name="Body Thickness">
+ Körperbreite
+ </string>
+ <string name="Body Thin">
+ schmal
+ </string>
+ <string name="Bow Legged">
+ o-beinig
+ </string>
+ <string name="Breast Buoyancy">
+ Brust, Straffheit
+ </string>
+ <string name="Breast Cleavage">
+ Dekolleté
+ </string>
+ <string name="Breast Size">
+ Brustgröße
+ </string>
+ <string name="Bridge Width">
+ Rückenbreite
+ </string>
+ <string name="Broad">
+ Breit
+ </string>
+ <string name="Brow Size">
+ Brauengröße
+ </string>
+ <string name="Bug Eyes">
+ Glubschaugen
+ </string>
+ <string name="Bugged Eyes">
+ Hervortretend
+ </string>
+ <string name="Bulbous">
+ Knollennase
+ </string>
+ <string name="Bulbous Nose">
+ Knollennase
+ </string>
+ <string name="Bushy Eyebrows">
+ Buschige Augenbrauen
+ </string>
+ <string name="Bushy Hair">
+ Buschiges Haar
+ </string>
+ <string name="Butt Size">
+ Hintern, Größe
+ </string>
+ <string name="bustle skirt">
+ Tournürenrock
+ </string>
+ <string name="no bustle">
+ Ohne
+ </string>
+ <string name="more bustle">
+ Mit
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Wangenknochen
+ </string>
+ <string name="Chest Size">
+ Brustgröße
+ </string>
+ <string name="Chin Angle">
+ Kinnwinkel
+ </string>
+ <string name="Chin Cleft">
+ Kinnspalte
+ </string>
+ <string name="Chin Curtains">
+ Schifferfräse
+ </string>
+ <string name="Chin Depth">
+ Kinnlänge
+ </string>
+ <string name="Chin Heavy">
+ Kinn ausgeprägt
+ </string>
+ <string name="Chin In">
+ Kinn zurück
+ </string>
+ <string name="Chin Out">
+ Kinn nach vorne
+ </string>
+ <string name="Chin-Neck">
+ Kinn-Hals
+ </string>
+ <string name="Clear">
+ Löschen
+ </string>
+ <string name="Cleft">
+ Spalte
+ </string>
+ <string name="Close Set Eyes">
+ Eng stehende Augen
+ </string>
+ <string name="Closed">
+ Geschlossen
+ </string>
+ <string name="Closed Back">
+ Hinten geschlossen
+ </string>
+ <string name="Closed Front">
+ Vorne geschlossen
+ </string>
+ <string name="Closed Left">
+ Links geschlossen
+ </string>
+ <string name="Closed Right">
+ Rechts geschlossen
+ </string>
+ <string name="Coin Purse">
+ Klein
+ </string>
+ <string name="Collar Back">
+ Kragen hinten
+ </string>
+ <string name="Collar Front">
+ Kragen vorne
+ </string>
+ <string name="Corner Down">
+ Nach unten
+ </string>
+ <string name="Corner Up">
+ Nach oben
+ </string>
+ <string name="Creased">
+ Schlupflid
+ </string>
+ <string name="Crooked Nose">
+ Krumme Nase
+ </string>
+ <string name="Cuff Flare">
+ Hosenaufschlag
+ </string>
+ <string name="Dark">
+ Dunkel
+ </string>
+ <string name="Dark Green">
+ Dunkelgrün
+ </string>
+ <string name="Darker">
+ Dunkler
+ </string>
+ <string name="Deep">
+ Tief
+ </string>
+ <string name="Default Heels">
+ Standardabsätze
+ </string>
+ <string name="Dense">
+ Dicht
+ </string>
+ <string name="Double Chin">
+ Doppelkinn
+ </string>
+ <string name="Downturned">
+ Nach unten
+ </string>
+ <string name="Duffle Bag">
+ Groß
+ </string>
+ <string name="Ear Angle">
+ Ohrenwinkel
+ </string>
+ <string name="Ear Size">
+ Ohrengröße
+ </string>
+ <string name="Ear Tips">
+ Ohrenspitzen
+ </string>
+ <string name="Egg Head">
+ Eierkopf
+ </string>
+ <string name="Eye Bags">
+ Augenränder
+ </string>
+ <string name="Eye Color">
+ Augenfarbe
+ </string>
+ <string name="Eye Depth">
+ Augentiefe
+ </string>
+ <string name="Eye Lightness">
+ Helligkeit
+ </string>
+ <string name="Eye Opening">
+ Öffnung
+ </string>
+ <string name="Eye Pop">
+ Symmetrie
+ </string>
+ <string name="Eye Size">
+ Augengröße
+ </string>
+ <string name="Eye Spacing">
+ Augenstand
+ </string>
+ <string name="Eyebrow Arc">
+ Brauenbogen
+ </string>
+ <string name="Eyebrow Density">
+ Brauendichte
+ </string>
+ <string name="Eyebrow Height">
+ Brauenhöhe
+ </string>
+ <string name="Eyebrow Points">
+ Brauenenden
+ </string>
+ <string name="Eyebrow Size">
+ Brauengröße
+ </string>
+ <string name="Eyelash Length">
+ Wimpernlänge
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Farbe des Eyeliners
+ </string>
+ <string name="Eyes Bugged">
+ Glubschaugen
+ </string>
+ <string name="Face Shear">
+ Gesichtsverzerrung
+ </string>
+ <string name="Facial Definition">
+ Gesichtskonturen
+ </string>
+ <string name="Far Set Eyes">
+ Weit auseinander
+ </string>
+ <string name="Fat Lips">
+ Volle Lippen
+ </string>
+ <string name="Female">
+ weiblich
+ </string>
+ <string name="Fingerless">
+ Ohne Finger
+ </string>
+ <string name="Fingers">
+ Finger
+ </string>
+ <string name="Flared Cuffs">
+ Ausgestellt
+ </string>
+ <string name="Flat">
+ Flach
+ </string>
+ <string name="Flat Butt">
+ Flacher Hintern
+ </string>
+ <string name="Flat Head">
+ Flacher Kopf
+ </string>
+ <string name="Flat Toe">
+ Flache Spitze
+ </string>
+ <string name="Foot Size">
+ Fußgröße
+ </string>
+ <string name="Forehead Angle">
+ Stirnwinkel
+ </string>
+ <string name="Forehead Heavy">
+ Stirn ausgeprägt
+ </string>
+ <string name="Freckles">
+ Sommersprossen
+ </string>
+ <string name="Front Fringe">
+ Fransen, vorne
+ </string>
+ <string name="Full Back">
+ Hinten volles Haar
+ </string>
+ <string name="Full Eyeliner">
+ Starker Eyeliner
+ </string>
+ <string name="Full Front">
+ Vorne volles Haar
+ </string>
+ <string name="Full Hair Sides">
+ Seitlich volles Haar
+ </string>
+ <string name="Full Sides">
+ Volle Seiten
+ </string>
+ <string name="Glossy">
+ Glänzend
+ </string>
+ <string name="Glove Fingers">
+ Handschuhfinger
+ </string>
+ <string name="Glove Length">
+ Handschuhlänge
+ </string>
+ <string name="Hair">
+ Haare
+ </string>
+ <string name="Hair Back">
+ Haare: Hinten
+ </string>
+ <string name="Hair Front">
+ Haare: Vorne
+ </string>
+ <string name="Hair Sides">
+ Haare: Seiten
+ </string>
+ <string name="Hair Sweep">
+ Haartolle
+ </string>
+ <string name="Hair Thickess">
+ Haardicke
+ </string>
+ <string name="Hair Thickness">
+ Haardicke
+ </string>
+ <string name="Hair Tilt">
+ Haarneigung
+ </string>
+ <string name="Hair Tilted Left">
+ Nach links
+ </string>
+ <string name="Hair Tilted Right">
+ Nach rechts
+ </string>
+ <string name="Hair Volume">
+ Haare: Volumen
+ </string>
+ <string name="Hand Size">
+ Handgröße
+ </string>
+ <string name="Handlebars">
+ Zwirbelbart
+ </string>
+ <string name="Head Length">
+ Kopflänge
+ </string>
+ <string name="Head Shape">
+ Kopfform
+ </string>
+ <string name="Head Size">
+ Kopfgröße
+ </string>
+ <string name="Head Stretch">
+ Kopfstreckung
+ </string>
+ <string name="Heel Height">
+ Absatzhöhe
+ </string>
+ <string name="Heel Shape">
+ Absatzform
+ </string>
+ <string name="Height">
+ Größe
+ </string>
+ <string name="High">
Hoch
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Lindenort</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Kunst &amp; Kultur</string>
- <string name="Business">Business</string>
- <string name="Educational">Bildung</string>
- <string name="Gaming">Spielen</string>
- <string name="Hangout">Treffpunkt</string>
- <string name="Newcomer Friendly">Anfängergerecht</string>
- <string name="Parks&amp;Nature">Parks und Natur</string>
- <string name="Residential">Wohngebiet</string>
- <string name="Shopping">Shopping</string>
- <string name="Other">Sonstige</string>
- <string name="ringing">
- Verbindung mit In-Welt-Voice-Chat...
+ <string name="High Heels">
+ Hohe Absätze
</string>
- <string name="connected">
- Verbunden
+ <string name="High Jaw">
+ Hoch
</string>
- <string name="unavailable">
- Der aktuelle Standort unterstützt keine Voice-Kommunikation
+ <string name="High Platforms">
+ Hohe Plattformsohlen
</string>
- <string name="hang_up">
- Verbindung mit In-Welt-Voice-Chat getrennt
+ <string name="High and Tight">
+ Hoch und eng
</string>
- <string name="ScriptQuestionCautionChatGranted">
- Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
+ <string name="Higher">
+ Höhere
</string>
- <string name="ScriptQuestionCautionChatDenied">
- Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
+ <string name="Hip Length">
+ Länge der Hüfte
</string>
- <string name="ScriptTakeMoney">
- Linden-Dollar (L$) von Ihnen nehmen
+ <string name="Hip Width">
+ Breite der Hüfte
</string>
- <string name="ActOnControlInputs">
- Steuerung festlegen
+ <string name="In">
+ In
</string>
- <string name="RemapControlInputs">
- Steuerung neu zuweisen
+ <string name="In Shdw Color">
+ Farbe Innenseite
</string>
- <string name="AnimateYourAvatar">
- Avatar animieren
+ <string name="In Shdw Opacity">
+ Deckkraft: innerer Lidschatten
</string>
- <string name="AttachToYourAvatar">
- An Avatar anhängen
+ <string name="Inner Eye Corner">
+ Ecke: Nasenseite
</string>
- <string name="ReleaseOwnership">
- Eigentum aufgeben und öffentlich machen
+ <string name="Inner Eye Shadow">
+ Innerer Lidschatten
</string>
- <string name="LinkAndDelink">
- Mit Objekten verknüpfen und davon trennen
+ <string name="Inner Shadow">
+ Innerer Lidschatten
</string>
- <string name="AddAndRemoveJoints">
- Verbindungen zu anderen Objekten hinzufügen und entfernen
+ <string name="Jacket Length">
+ Jackenlänge
</string>
- <string name="ChangePermissions">
- Berechtigungen ändern
+ <string name="Jacket Wrinkles">
+ Jackenfalten
</string>
- <string name="TrackYourCamera">
- Kameraverfolgung
+ <string name="Jaw Angle">
+ Kinnansatz
</string>
- <string name="ControlYourCamera">
- Kamerasteuerung
+ <string name="Jaw Jut">
+ Kinnposition
+ </string>
+ <string name="Jaw Shape">
+ Kinnform
+ </string>
+ <string name="Join">
+ Zusammen
+ </string>
+ <string name="Jowls">
+ Hängebacken
+ </string>
+ <string name="Knee Angle">
+ Kniewinkel
+ </string>
+ <string name="Knock Kneed">
+ X-beinig
+ </string>
+ <string name="Large">
+ Groß
+ </string>
+ <string name="Large Hands">
+ Große Hände
+ </string>
+ <string name="Left Part">
+ Linksscheitel
+ </string>
+ <string name="Leg Length">
+ Beinlänge
+ </string>
+ <string name="Leg Muscles">
+ Beinmuskeln
+ </string>
+ <string name="Less">
+ Weniger
+ </string>
+ <string name="Less Body Fat">
+ Weniger Speck
+ </string>
+ <string name="Less Curtains">
+ Weniger
+ </string>
+ <string name="Less Freckles">
+ Weniger
+ </string>
+ <string name="Less Full">
+ Weniger
+ </string>
+ <string name="Less Gravity">
+ Weniger
+ </string>
+ <string name="Less Love">
+ Weniger
+ </string>
+ <string name="Less Muscles">
+ Weniger
+ </string>
+ <string name="Less Muscular">
+ Weniger
+ </string>
+ <string name="Less Rosy">
+ Weniger
+ </string>
+ <string name="Less Round">
+ Weniger
+ </string>
+ <string name="Less Saddle">
+ Weniger
+ </string>
+ <string name="Less Square">
+ Weniger
+ </string>
+ <string name="Less Volume">
+ Weniger
+ </string>
+ <string name="Less soul">
+ Weniger
+ </string>
+ <string name="Lighter">
+ Heller
+ </string>
+ <string name="Lip Cleft">
+ Amorbogen
+ </string>
+ <string name="Lip Cleft Depth">
+ Tiefe: Amorbogen
+ </string>
+ <string name="Lip Fullness">
+ Fülle
+ </string>
+ <string name="Lip Pinkness">
+ Pinkton
+ </string>
+ <string name="Lip Ratio">
+ Lippenproportionen
+ </string>
+ <string name="Lip Thickness">
+ Lippendicke
+ </string>
+ <string name="Lip Width">
+ Mundbreite
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lippenstift
+ </string>
+ <string name="Lipstick Color">
+ Farbe
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Langer Kopf
+ </string>
+ <string name="Long Hips">
+ Lange Hüften
+ </string>
+ <string name="Long Legs">
+ Lange Beine
+ </string>
+ <string name="Long Neck">
+ Langer Hals
+ </string>
+ <string name="Long Pigtails">
+ Lange Zöpfe
+ </string>
+ <string name="Long Ponytail">
+ Langer Pferdeschwanz
+ </string>
+ <string name="Long Torso">
+ Langer Oberkörper
+ </string>
+ <string name="Long arms">
+ Lange Arme
+ </string>
+ <string name="Loose Pants">
+ Weite Hosen
+ </string>
+ <string name="Loose Shirt">
+ Weites Hemd
+ </string>
+ <string name="Loose Sleeves">
+ Weite Ärmel
+ </string>
+ <string name="Love Handles">
+ Fettpölsterchen
+ </string>
+ <string name="Low">
+ Niedrig
+ </string>
+ <string name="Low Heels">
+ Niedrig
+ </string>
+ <string name="Low Jaw">
+ Niedrig
+ </string>
+ <string name="Low Platforms">
+ Niedrig
+ </string>
+ <string name="Low and Loose">
+ Weit
+ </string>
+ <string name="Lower">
+ Absenken
+ </string>
+ <string name="Lower Bridge">
+ Brücke, Unterer Teil
+ </string>
+ <string name="Lower Cheeks">
+ Wangen, unterer Bereich
+ </string>
+ <string name="Male">
+ Männlich
+ </string>
+ <string name="Middle Part">
+ Mittelscheitel
+ </string>
+ <string name="More">
+ Mehr
+ </string>
+ <string name="More Blush">
+ Mehr
+ </string>
+ <string name="More Body Fat">
+ Mehr Speck
+ </string>
+ <string name="More Curtains">
+ Mehr
+ </string>
+ <string name="More Eyeshadow">
+ Mehr
+ </string>
+ <string name="More Freckles">
+ Mehr
+ </string>
+ <string name="More Full">
+ Voller
+ </string>
+ <string name="More Gravity">
+ Mehr
+ </string>
+ <string name="More Lipstick">
+ Mehr
+ </string>
+ <string name="More Love">
+ Mehr
+ </string>
+ <string name="More Lower Lip">
+ Größer
+ </string>
+ <string name="More Muscles">
+ Mehr
+ </string>
+ <string name="More Muscular">
+ Mehr
+ </string>
+ <string name="More Rosy">
+ Mehr
+ </string>
+ <string name="More Round">
+ Runder
+ </string>
+ <string name="More Saddle">
+ Mehr
+ </string>
+ <string name="More Sloped">
+ Flach
+ </string>
+ <string name="More Square">
+ Eckiger
+ </string>
+ <string name="More Upper Lip">
+ Mehr
+ </string>
+ <string name="More Vertical">
+ Steil
+ </string>
+ <string name="More Volume">
+ Mehr
+ </string>
+ <string name="More soul">
+ Mehr
+ </string>
+ <string name="Moustache">
+ Schnauzer
+ </string>
+ <string name="Mouth Corner">
+ Mundwinkel
+ </string>
+ <string name="Mouth Position">
+ Mundposition
+ </string>
+ <string name="Mowhawk">
+ Irokese
+ </string>
+ <string name="Muscular">
+ Muskulös
+ </string>
+ <string name="Mutton Chops">
+ Koteletten
+ </string>
+ <string name="Nail Polish">
+ Nagellack
+ </string>
+ <string name="Nail Polish Color">
+ Farbe
+ </string>
+ <string name="Narrow">
+ Schmal
+ </string>
+ <string name="Narrow Back">
+ Wenig
+ </string>
+ <string name="Narrow Front">
+ Wenig
+ </string>
+ <string name="Narrow Lips">
+ Schmale Lippen
+ </string>
+ <string name="Natural">
+ Natürlich
+ </string>
+ <string name="Neck Length">
+ Halslänge
+ </string>
+ <string name="Neck Thickness">
+ Halsdicke
+ </string>
+ <string name="No Blush">
+ Kein Rouge
+ </string>
+ <string name="No Eyeliner">
+ Kein Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Kein Lidschatten
+ </string>
+ <string name="No Lipgloss">
+ Kein Lipgloss
+ </string>
+ <string name="No Lipstick">
+ Kein Lippenstift
+ </string>
+ <string name="No Part">
+ Kein Scheitel
+ </string>
+ <string name="No Polish">
+ Kein Nagellack
+ </string>
+ <string name="No Red">
+ Nicht rot
+ </string>
+ <string name="No Spikes">
+ Keine Stachel
+ </string>
+ <string name="No White">
+ Kein Weiß
+ </string>
+ <string name="No Wrinkles">
+ Keine Falten
+ </string>
+ <string name="Normal Lower">
+ Normal unten
+ </string>
+ <string name="Normal Upper">
+ Normal oben
+ </string>
+ <string name="Nose Left">
+ Links
+ </string>
+ <string name="Nose Right">
+ Rechts
+ </string>
+ <string name="Nose Size">
+ Größe
+ </string>
+ <string name="Nose Thickness">
+ Dicke
+ </string>
+ <string name="Nose Tip Angle">
+ Nasenspitze
+ </string>
+ <string name="Nose Tip Shape">
+ Nasenspitze
+ </string>
+ <string name="Nose Width">
+ Nasenbreite
+ </string>
+ <string name="Nostril Division">
+ Teilung
+ </string>
+ <string name="Nostril Width">
+ Größe
+ </string>
+ <string name="Opaque">
+ Deckend
+ </string>
+ <string name="Open">
+ Öffnen
+ </string>
+ <string name="Open Back">
+ Hinten offen
+ </string>
+ <string name="Open Front">
+ Vorne offen
+ </string>
+ <string name="Open Left">
+ Links offen
+ </string>
+ <string name="Open Right">
+ Rechts offen
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Aus
+ </string>
+ <string name="Out Shdw Color">
+ Farbe: Oberer Lidschatten
+ </string>
+ <string name="Out Shdw Opacity">
+ Deckkraft: Oberer Lidschatten
+ </string>
+ <string name="Outer Eye Corner">
+ Äußerer Augenwinkel
+ </string>
+ <string name="Outer Eye Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Outer Shadow">
+ Lidschatten: Oben
+ </string>
+ <string name="Overbite">
+ Überbiss
+ </string>
+ <string name="Package">
+ Ausbeulung
+ </string>
+ <string name="Painted Nails">
+ Lackierte Nägel
+ </string>
+ <string name="Pale">
+ Blass
+ </string>
+ <string name="Pants Crotch">
+ Schritt
+ </string>
+ <string name="Pants Fit">
+ Passform
+ </string>
+ <string name="Pants Length">
+ Hosenlänge
+ </string>
+ <string name="Pants Waist">
+ Hüfte
+ </string>
+ <string name="Pants Wrinkles">
+ Falten
+ </string>
+ <string name="Part">
+ Scheitel
+ </string>
+ <string name="Part Bangs">
+ Pony scheiteln
+ </string>
+ <string name="Pectorals">
+ Brustmuskel
+ </string>
+ <string name="Pigment">
+ Pigmentierung
+ </string>
+ <string name="Pigtails">
+ Zöpfe
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Mehr Pink
+ </string>
+ <string name="Platform Height">
+ Höhe
+ </string>
+ <string name="Platform Width">
+ Breite
+ </string>
+ <string name="Pointy">
+ Spitz
+ </string>
+ <string name="Pointy Heels">
+ Pfennigabsätze
+ </string>
+ <string name="Ponytail">
+ Pferdeschwanz
+ </string>
+ <string name="Poofy Skirt">
+ Weit ausgestellt
+ </string>
+ <string name="Pop Left Eye">
+ Linkes Auge größer
+ </string>
+ <string name="Pop Right Eye">
+ Rechtes Auge größer
+ </string>
+ <string name="Puffy">
+ Geschwollen
+ </string>
+ <string name="Puffy Eyelids">
+ Geschwollene Lider
+ </string>
+ <string name="Rainbow Color">
+ Regenbogenfarben
+ </string>
+ <string name="Red Hair">
+ Rote Haare
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Scheitel rechts
+ </string>
+ <string name="Rosy Complexion">
+ Rosiger Teint
+ </string>
+ <string name="Round">
+ Rund
+ </string>
+ <string name="Ruddiness">
+ Röte
+ </string>
+ <string name="Ruddy">
+ Rötlich
+ </string>
+ <string name="Rumpled Hair">
+ Zerzauste Haare
+ </string>
+ <string name="Saddle Bags">
+ Hüftspeck
+ </string>
+ <string name="Scrawny Leg">
+ Dürres Bein
+ </string>
+ <string name="Separate">
+ Auseinander
+ </string>
+ <string name="Shallow">
+ Flach
+ </string>
+ <string name="Shear Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Shear Face">
+ Gesicht verzerren
+ </string>
+ <string name="Shear Front">
+ Vorne rasiert
+ </string>
+ <string name="Shear Left Up">
+ Links
+ </string>
+ <string name="Shear Right Up">
+ Rechts
+ </string>
+ <string name="Sheared Back">
+ Hinterkopf rasiert
+ </string>
+ <string name="Sheared Front">
+ Vorne rasiert
+ </string>
+ <string name="Shift Left">
+ Nach links
+ </string>
+ <string name="Shift Mouth">
+ Mund verschieben
+ </string>
+ <string name="Shift Right">
+ Nach rechts
+ </string>
+ <string name="Shirt Bottom">
+ Hemdlänge
+ </string>
+ <string name="Shirt Fit">
+ Passform
+ </string>
+ <string name="Shirt Wrinkles">
+ Falten
+ </string>
+ <string name="Shoe Height">
+ Schuhart
+ </string>
+ <string name="Short">
+ Sandale
+ </string>
+ <string name="Short Arms">
+ Kurze Arme
+ </string>
+ <string name="Short Legs">
+ Kurze Beine
+ </string>
+ <string name="Short Neck">
+ Kurzer Hals
+ </string>
+ <string name="Short Pigtails">
+ Kurze Zöpfe
+ </string>
+ <string name="Short Ponytail">
+ Kurzer Pferdeschwanz
+ </string>
+ <string name="Short Sideburns">
+ Kurze Koteletten
+ </string>
+ <string name="Short Torso">
+ Kurzer Oberkörper
+ </string>
+ <string name="Short hips">
+ Kurze Hüften
+ </string>
+ <string name="Shoulders">
+ Schultern
+ </string>
+ <string name="Side Fringe">
+ Seitliche Fransen
+ </string>
+ <string name="Sideburns">
+ Koteletten
+ </string>
+ <string name="Sides Hair">
+ Seitliches Haar
+ </string>
+ <string name="Sides Hair Down">
+ Lang
+ </string>
+ <string name="Sides Hair Up">
+ Kurz
+ </string>
+ <string name="Skinny Neck">
+ Dünner Hals
+ </string>
+ <string name="Skirt Fit">
+ Passform
+ </string>
+ <string name="Skirt Length">
+ Rocklänge
+ </string>
+ <string name="Slanted Forehead">
+ Fliehende Stirn
+ </string>
+ <string name="Sleeve Length">
+ Ärmellänge
+ </string>
+ <string name="Sleeve Looseness">
+ Passform Ärmel
+ </string>
+ <string name="Slit Back">
+ Schlitz: Hinten
+ </string>
+ <string name="Slit Front">
+ Schlitz: Vorne
+ </string>
+ <string name="Slit Left">
+ Schlitz: Links
+ </string>
+ <string name="Slit Right">
+ Schlitz: Rechts
+ </string>
+ <string name="Small">
+ Klein
+ </string>
+ <string name="Small Hands">
+ Kleine Hände
+ </string>
+ <string name="Small Head">
+ Klein
+ </string>
+ <string name="Smooth">
+ Glätten
+ </string>
+ <string name="Smooth Hair">
+ Glattes Haar
+ </string>
+ <string name="Socks Length">
+ Strumpflänge
+ </string>
+ <string name="Soulpatch">
+ Unterlippenbart
+ </string>
+ <string name="Sparse">
+ Wenig
+ </string>
+ <string name="Spiked Hair">
+ Stachelhaare
+ </string>
+ <string name="Square">
+ Rechteck
+ </string>
+ <string name="Square Toe">
+ Eckig
+ </string>
+ <string name="Squash Head">
+ Gestaucht
+ </string>
+ <string name="Stretch Head">
+ Gestreckt
+ </string>
+ <string name="Sunken">
+ Eingefallen
+ </string>
+ <string name="Sunken Chest">
+ Trichterbrust
+ </string>
+ <string name="Sunken Eyes">
+ Eingesunkene Augen
+ </string>
+ <string name="Sweep Back">
+ Nach hinten
+ </string>
+ <string name="Sweep Forward">
+ Nach vorne
+ </string>
+ <string name="Tall">
+ Stiefel
+ </string>
+ <string name="Taper Back">
+ Ansatzbreite hinten
+ </string>
+ <string name="Taper Front">
+ Ansatzbreite vorne
+ </string>
+ <string name="Thick Heels">
+ Dicke Absätze
+ </string>
+ <string name="Thick Neck">
+ Dicker Hals
+ </string>
+ <string name="Thick Toe">
+ Dick
+ </string>
+ <string name="Thin">
+ Dünn
+ </string>
+ <string name="Thin Eyebrows">
+ Dünne Augenbrauen
+ </string>
+ <string name="Thin Lips">
+ Dünne Lippen
+ </string>
+ <string name="Thin Nose">
+ Dünne Nase
+ </string>
+ <string name="Tight Chin">
+ Straffes Kinn
+ </string>
+ <string name="Tight Cuffs">
+ Eng
+ </string>
+ <string name="Tight Pants">
+ Enge Hosen
+ </string>
+ <string name="Tight Shirt">
+ Enges Hemd
+ </string>
+ <string name="Tight Skirt">
+ Enger Rock
+ </string>
+ <string name="Tight Sleeves">
+ Enge Ärmel
+ </string>
+ <string name="Toe Shape">
+ Spitze
+ </string>
+ <string name="Toe Thickness">
+ Dicke
+ </string>
+ <string name="Torso Length">
+ Länge des Oberkörpers
+ </string>
+ <string name="Torso Muscles">
+ Muskeln
+ </string>
+ <string name="Torso Scrawny">
+ Dürr
+ </string>
+ <string name="Unattached">
+ Frei
+ </string>
+ <string name="Uncreased">
+ Straffes Lid
+ </string>
+ <string name="Underbite">
+ Unterbiss
+ </string>
+ <string name="Unnatural">
+ Unnatürlich
+ </string>
+ <string name="Upper Bridge">
+ Brücke, oberer Teil
+ </string>
+ <string name="Upper Cheeks">
+ Obere Wangen
+ </string>
+ <string name="Upper Chin Cleft">
+ Obere Kinnspalte
+ </string>
+ <string name="Upper Eyelid Fold">
+ Obere Lidfalte
+ </string>
+ <string name="Upturned">
+ Stupsnase
+ </string>
+ <string name="Very Red">
+ Sehr rot
+ </string>
+ <string name="Waist Height">
+ Bund
+ </string>
+ <string name="Well-Fed">
+ Gut genährt
+ </string>
+ <string name="White Hair">
+ Weiße Haare
+ </string>
+ <string name="Wide">
+ Breit
+ </string>
+ <string name="Wide Back">
+ Breit
+ </string>
+ <string name="Wide Front">
+ Breit
+ </string>
+ <string name="Wide Lips">
+ Breit
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Falten
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Zu meinen Landmarken hinzufügen
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Meine Landmarken bearbeiten
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Weitere Informationen über die aktuelle Position
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Mein Reiseverlauf
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Dieses Land kaufen
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Voice hier nicht möglich
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Fliegen ist unzulässig
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Kein Stoßen
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Bauen/Fallen lassen von Objekten ist verboten
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Skripte sind unzulässig
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Gesundheit
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Aktualisierung
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] wird aktualisiert...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] wird installiert...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Aktualisierung wird heruntergeladen...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Aktualisierung wird heruntergeladen
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Herunterladen ist fehlgeschlagen
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Aktualisierung konnte nicht installiert werden
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Viewer konnte nicht gestartet werden
+ </string>
+ <string name="IM_logging_string">
+ -- Instant-Message-Protokoll aktiviert --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] tippt...
+ </string>
+ <string name="Unnamed">
+ (Nicht benannt)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Für diese Verbindung ist kein Text-Chat verfügbar.
+ </string>
+ <string name="IM_muted_text_label">
+ Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.
+ </string>
+ <string name="IM_default_text_label">
+ Für Instant Message hier klicken.
+ </string>
+ <string name="IM_to_label">
+ Bis
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="started_call">
+ haben/hat einen Anruf initiiert
+ </string>
+ <string name="joined_call">
+ ist dem Gespräch beigetreten
+ </string>
+ <string name="ringing-im">
+ Verbindung wird hergestellt...
+ </string>
+ <string name="connected-im">
+ Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen
+ </string>
+ <string name="hang_up-im">
+ Anruf wurde beendet
+ </string>
+ <string name="answering-im">
+ Wird verbunden...
+ </string>
+ <string name="conference-title">
+ Ad-hoc-Konferenz
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventarobjekt angeboten
+ </string>
+ <string name="share_alert">
+ Objekte aus dem Inventar hier her ziehen
</string>
<string name="only_user_message">
Sie sind der einzige Benutzer in dieser Sitzung.
@@ -591,6 +3309,12 @@
<string name="invite_message">
Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
</string>
+ <string name="muted_message">
+ Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.
+ </string>
+ <string name="generic">
+ Fehler bei Anfrage, bitte versuchen Sie es später.
+ </string>
<string name="generic_request_error">
Fehler bei Anfrage, bitte versuchen Sie es später.
</string>
@@ -609,46 +3333,37 @@
<string name="not_a_mod_error">
Sie sind kein Sitzungsmoderator.
</string>
+ <string name="muted">
+ Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+ </string>
<string name="muted_error">
Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
</string>
<string name="add_session_event">
Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
</string>
+ <string name="message">
+ Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+ </string>
<string name="message_session_event">
Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
</string>
+ <string name="mute">
+ Fehler während Moderation.
+ </string>
+ <string name="removed">
+ Sie wurden von der Gruppe ausgeschlossen.
+ </string>
<string name="removed_from_group">
Sie wurden von der Gruppe ausgeschlossen.
</string>
<string name="close_on_no_ability">
Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.
</string>
- <string name="AcctTypeResident">
- Einwohner
- </string>
- <string name="AcctTypeTrial">
- Test
- </string>
- <string name="AcctTypeCharterMember">
- Charta-Mitglied
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab-Mitarbeiter
- </string>
- <string name="PaymentInfoUsed">
- Zahlungsinfo verwendet
- </string>
- <string name="PaymentInfoOnFile">
- Zahlungsinfo archiviert
- </string>
- <string name="NoPaymentInfoOnFile">
- Keine Zahlungsinfo archiviert
- </string>
- <string name="AgeVerified">
- Altersgeprüft
- </string>
- <string name="NotAgeVerified">
- Nicht altersgeprüft
- </string>
+ <string name="unread_chat_single">
+ [SOURCES] hat etwas Neues gesagt
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] haben etwas Neues gesagt
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 31f92dc920..2c56eff0a3 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages name="">
<message_set name="errors">
<message name="invalid_tport">
- Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter:
-www.secondlife.com/support
+ Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter:
-www.secondlife.com/support
+ Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
diff --git a/indra/newview/skins/default/xui/en/accordion_drag.xml b/indra/newview/skins/default/xui/en/accordion_drag.xml
index 94839a7593..e8a705e744 100644
--- a/indra/newview/skins/default/xui/en/accordion_drag.xml
+++ b/indra/newview/skins/default/xui/en/accordion_drag.xml
@@ -4,5 +4,5 @@
height="5"
left="50"
top="50"
- follows="left|bottom|right" background_visible="true" label="splitter_drag" title="">
+ follows="left|bottom|right" background_visible="true" label="splitter_drag" title="" translate="false">
</panel>
diff --git a/indra/newview/skins/default/xui/en/accordion_parent.xml b/indra/newview/skins/default/xui/en/accordion_parent.xml
index ea34bac0a7..e17a0dd351 100644
--- a/indra/newview/skins/default/xui/en/accordion_parent.xml
+++ b/indra/newview/skins/default/xui/en/accordion_parent.xml
@@ -3,5 +3,6 @@
background_visible="true"
label="splitter_parent"
title=""
+ translate="false"
>
</panel>
diff --git a/indra/newview/skins/default/xui/en/alert_button.xml b/indra/newview/skins/default/xui/en/alert_button.xml
new file mode 100644
index 0000000000..632564d793
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_button.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<button
+ name="Alert Button"
+ label_shadow="true"
+ auto_resize="false"
+ image_overlay_alignment="center"
+ use_ellipses="flse"
+ pad_right="10"
+ pad_left="10"
+ is_toggle="false"
+ scale_image="true"
+ commit_on_return="true"
+ font="SansSerifSmall"
+ follows="bottom"/>
diff --git a/indra/newview/skins/default/xui/en/alert_check_box.xml b/indra/newview/skins/default/xui/en/alert_check_box.xml
new file mode 100644
index 0000000000..9f1bdb5193
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_check_box.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<check_box
+ text_enabled_color="LabelTextColor"
+ text_disabled_color="LabelDisabledColor"
+ font="SansSerif"
+ follows="left|top"
+ name="check"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/alert_icon.xml b/indra/newview/skins/default/xui/en/alert_icon.xml
new file mode 100644
index 0000000000..b0886fce06
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_icon.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<icon color="1.0 1.0 1.0 1.0"
+ tab_stop="false"
+ mouse_opaque="false"
+ name="icon"
+ image_name="notify_caution_icon.tga"
+ follows="left|top">
+</icon>
diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml
new file mode 100644
index 0000000000..97991153d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<line_editor
+ select_on_focus="false"
+ handle_edit_keys_directly="false"
+ revert_on_esc="true"
+ commit_on_focus_lost="true"
+ ignore_tab="true"
+ max_length="254"
+ text_pad_right="0"
+ text_pad_left="2"
+ mouse_opaque="true"/>
diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
index c35cbb1539..b365040c20 100644
--- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml
+++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
@@ -9,15 +9,19 @@
image_disabled_selected="transparent.j2c"
image_selected="transparent.j2c"
image_unselected="transparent.j2c"
- image_hover_selected="FileMenu_BarSelect"
- image_hover_unselected="FileMenu_BarSelect"
- image_pressed="FileMenu_BarSelect"
- image_pressed_selected="FileMenu_BarSelect"
+ image_pressed="Favorite_Link_Over"
+ image_hover_selected="Favorite_Link_Over"
+ image_hover_unselected="Favorite_Link_Over"
hover_glow_amount="0.15"
+ label_shadow="false"
layout="topleft"
left="0"
name="favorites_bar_btn"
+ pad_bottom="1"
+ pad_left="11"
+ pad_right="9"
+ scale_image="true"
tab_stop="false"
top="0"
use_ellipses="true"
- width="120" />
+ width="140" />
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 3789369e74..b9bc45a10b 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -1,24 +1,57 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="440"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_close="true"
+ can_dock="true"
+ bevel_style="in"
+ height="300"
layout="topleft"
- name="floater_aaa"
- help_topic="floater_aaa"
+ name="Test Floater"
save_rect="true"
- can_resize="true"
- title="About [APP_NAME]"
- width="470">
- <text_editor
- follows="left|top|right|bottom"
- height="400"
- layout="topleft"
- left="6"
- max_length="65536"
- name="credits_editor"
- top="25"
- width="458"
- word_wrap="true">
-This is line 4
- </text_editor>
+ title="TEST FLOATER"
+ save_dock_state="true"
+ save_visibility="true"
+ single_instance="true"
+ width="320">
+ <string name="nudge_parabuild" translate="false">Nudge 1</string>
+ <string name="test_the_vlt">This string CHANGE2 is extracted.</string>
+ <string name="testing_eli">Just a test. changes.</string>
+ <chat_history
+ allow_html="true"
+ bg_readonly_color="ChatHistoryBgColor"
+ bg_writeable_color="ChatHistoryBgColor"
+ border_visible="false"
+ follows="all"
+ font="SansSerif"
+ left="1"
+ top="20"
+ layout="topleft"
+ height="260"
+ name="chat_history"
+ parse_highlights="true"
+ text_color="ChatHistoryTextColor"
+ text_readonly_color="ChatHistoryTextColor"
+ translate="false"
+ width="320">
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+ </chat_history>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 02c6ed1b20..bc67621dfd 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -6,7 +6,7 @@
name="floater_about"
help_topic="floater_about"
save_rect="true"
- title="About [APP_NAME]"
+ title="ABOUT [CAPITALIZED_APP_NAME]"
width="470">
<floater.string
name="AboutHeader">
@@ -21,7 +21,7 @@ Built with [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string
name="AboutPosition">
-You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at [HOSTNAME] ([HOSTIP])
+You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
@@ -49,6 +49,7 @@ libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
Qt Webkit Version: [QT_WEBKIT_VERSION]
+Vivox Version: [VIVOX_VERSION]
</floater.string>
<floater.string
name="none">
@@ -68,7 +69,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
tab_position="top">
<panel
border="true"
- label="Support"
+ label="Info"
help_topic="about_support_tab"
name="support_panel">
<text_editor
@@ -90,7 +91,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
left="10"
top_pad="5"
height="25"
- width="160" />
+ width="180" />
</panel>
<panel
border="true"
@@ -111,7 +112,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
word_wrap="true">
Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
-Thank you to the following residents for helping to ensure that this is the best version yet: (in progress)
+Thank you to the following Residents for helping to ensure that this is the best version yet: (in progress)
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 c245f877c7..58ea7cec9c 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
can_tear_off="false"
height="420"
layout="topleft"
name="floaterland"
help_topic="floaterland"
save_rect="true"
- title="About Land"
- width="460">
+ title="ABOUT LAND"
+ width="490">
<floater.string
name="Minutes">
[MINUTES] minutes
@@ -26,27 +25,25 @@
remaining
</floater.string>
<tab_container
- follows="left|top|right|bottom"
- height="400"
+ follows="all"
+ height="410"
layout="topleft"
- font="SansSerifSmall"
- left="1"
- tab_padding_right="5"
+ left="0"
name="landtab"
tab_position="top"
- top="20"
- width="459">
+ tab_height="25"
+ tab_min_width="67"
+ top="10"
+ width="489">
<panel
- border="true"
- follows="left|top|right|bottom"
- height="380"
- label="General"
+ border="false"
+ follows="all"
+ label="GENERAL"
layout="topleft"
- left="1"
+ left="0"
help_topic="land_general_tab"
name="land_general_panel"
- top="-31"
- width="458">
+ top="0">
<panel.string
name="new users only">
New users only
@@ -77,11 +74,11 @@
</panel.string>
<panel.string
name="profile_text">
- Profile...
+ Profile
</panel.string>
<panel.string
name="info_text">
- Info...
+ Info
</panel.string>
<panel.string
name="public_text">
@@ -98,7 +95,6 @@
<panel.string
name="no_selection_text">
No parcel selected.
-Go to World menu &gt; About Land or select another parcel to show its details.
</panel.string>
<text
type="string"
@@ -106,32 +102,29 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Name:"
- top="4"
- width="92">
+ top="10"
+ width="100">
Name:
</text>
<line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="16"
+ follows="left|top"
+ height="23"
layout="topleft"
left_pad="2"
max_length="63"
name="Name"
top_delta="0"
- width="350" />
+ width="365" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Description:"
- top="24"
width="100">
Description:
</text>
@@ -139,10 +132,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top|right"
height="52"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="Description"
top_delta="0"
- width="350"
+ width="365"
word_wrap="true" />
<text
type="string"
@@ -150,10 +143,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="LandType"
- top="84"
- width="92">
+ top_pad="5"
+ width="100">
Type:
</text>
<text
@@ -162,7 +155,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="LandTypeText"
top_delta="0"
width="250">
@@ -174,10 +167,9 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="ContentRating"
- top="104"
- width="92">
+ width="100">
Rating:
</text>
<text
@@ -186,7 +178,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="ContentRatingText"
top_delta="0"
width="250">
@@ -198,10 +190,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Owner:"
- top="124"
- width="92">
+ top_pad="5"
+ width="100">
Owner:
</text>
<text
@@ -210,98 +202,110 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="OwnerText"
- top_delta="0"
- width="250">
+ width="240">
Leyla Linden
</text>
- <button
+ <button
+ follows="right"
+ height="23"
+ image_pressed="Info_Press"
+ image_unselected="Info_Over"
+ left_pad="3"
+ name="info_btn"
+ top_delta="-2"
+ width="16" />
+ <!-- <button
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Profile..."
- label_selected="Profile..."
+ height="23"
+ label="Profile"
layout="topleft"
left_pad="4"
name="Profile..."
- top_delta="0"
- width="90" />
+ width="90" />-->
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Group:"
- top="144"
- width="92">
+ top_pad="7"
+ width="100">
Group:
</text>
+ <!--TODO: HOOK UP GROUP ICON-->
<text
enabled="false"
follows="left|top"
height="16"
+ left_pad="2"
layout="topleft"
- left_delta="92"
name="GroupText"
- top_delta="2"
- width="250" />
+ width="240">
+Leyla Linden </text>
+ <button
+ follows="right"
+ height="23"
+ image_pressed="Info_Press"
+ image_unselected="Info_Over"
+ left_pad="3"
+ name="info_btn"
+ top_delta="-2"
+ width="16" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Set..."
- label_selected="Set..."
+ height="23"
+ label="Set"
layout="topleft"
left_pad="4"
+ right="-10"
name="Set..."
- top_delta="-2"
- width="90" />
+ width="50"
+ top_delta="-2"/>
<check_box
enabled="false"
height="16"
label="Allow Deed to Group"
layout="topleft"
- left="96"
+ left="108"
name="check deed"
tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."
- top="164"
- width="116" />
+ top_pad="3"
+ width="146" />
<button
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Deed..."
- label_selected="Deed..."
+ height="23"
+ label="Deed"
layout="topleft"
- left_pad="138"
+ left_pad="2"
+ right="-10"
name="Deed..."
tool_tip="You may only deed land if you are an officer in the selected group."
- top_delta="0"
+ top_delta="-2"
width="90" />
<check_box
enabled="false"
height="16"
label="Owner Makes Contribution With Deed"
layout="topleft"
- left="96"
+ left="108"
name="check contrib"
tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."
- top="184"
- width="199" />
+ width="199"
+ top_pad="0"/>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="For Sale:"
- top="204"
- width="92">
+ width="100">
For Sale:
</text>
<text
@@ -310,11 +314,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="Not for sale."
- top_delta="0"
width="186">
- Not for sale.
+ Not for sale
</text>
<text
type="string"
@@ -324,9 +327,8 @@ Go to World menu &gt; About Land or select another parcel to show its details.
layout="topleft"
left_delta="0"
name="For Sale: Price L$[PRICE]."
- top_delta="0"
width="226">
- Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
+ Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
</text>
<text
enabled="false"
@@ -335,18 +337,18 @@ Go to World menu &gt; About Land or select another parcel to show its details.
layout="topleft"
left_delta="0"
name="SalePending"
- top_pad="4"
- width="344" />
+ top_pad="5"
+ width="324" />
<button
follows="left|top"
- height="20"
- label="Sell Land..."
- label_selected="Sell Land..."
+ height="23"
+ label="Sell Land"
layout="topleft"
- left_delta="199"
+ left_pad="5"
+ right="-10"
name="Sell Land..."
- top_delta="0"
- width="145" />
+ width="145"
+ top_delta="-25"/>
<text
type="string"
length="1"
@@ -355,7 +357,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
layout="topleft"
left_delta="-199"
name="For sale to"
- top_delta="0"
+ top_delta="20"
width="186">
For sale to: [BUYER]
</text>
@@ -367,9 +369,9 @@ Go to World menu &gt; About Land or select another parcel to show its details.
layout="topleft"
left_delta="0"
name="Sell with landowners objects in parcel."
- top_pad="4"
+ top_pad="-2"
width="186">
- Objects included in sale.
+ Objects included in sale
</text>
<text
type="string"
@@ -381,17 +383,18 @@ Go to World menu &gt; About Land or select another parcel to show its details.
name="Selling with no objects in parcel."
top_delta="0"
width="186">
- Objects not included in sale.
+ Objects not included in sale
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Cancel Land Sale"
label_selected="Cancel Land Sale"
layout="topleft"
- left="295"
+ right="-10"
name="Cancel Land Sale"
- top="228"
+ left_pad="5"
+ top_pad="-25"
width="145" />
<text
type="string"
@@ -399,10 +402,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Claimed:"
top="268"
- width="92">
+ width="100">
Claimed:
</text>
<text
@@ -411,7 +414,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="DateClaimText"
top_delta="0"
width="186">
@@ -423,10 +426,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="PriceLabel"
- top="288"
- width="92">
+ top_pad="5"
+ width="100">
Area:
</text>
<text
@@ -435,7 +438,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="PriceText"
top_delta="0"
width="186">
@@ -447,10 +450,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Traffic:"
top="308"
- width="92">
+ width="100">
Traffic:
</text>
<text
@@ -459,7 +462,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="DwellText"
top_delta="0"
width="186">
@@ -468,31 +471,38 @@ Go to World menu &gt; About Land or select another parcel to show its details.
<button
enabled="false"
follows="left|top"
- height="20"
- label="Buy Land..."
- label_selected="Buy Land..."
+ height="23"
+ label="Buy Land"
layout="topleft"
- left="155"
+ left_delta="82"
name="Buy Land..."
- top="328"
+ top_pad="7"
+ width="100" />
+ <button
+ enabled="true"
+ follows="left|top"
+ height="23"
+ label="Script Info"
+ layout="topleft"
+ left="10"
+ name="Scripts..."
+ top_pad="1"
width="100" />
<button
enabled="false"
follows="left|top"
- height="20"
- label="Buy For Group..."
- label_selected="Buy For Group..."
+ height="23"
+ label="Buy For Group"
layout="topleft"
- left="260"
+ right="-10"
name="Buy For Group..."
- top="352"
+ top_delta="0"
width="180" />
<button
enabled="false"
follows="left|top"
- height="20"
- label="Buy Pass..."
- label_selected="Buy Pass..."
+ height="23"
+ label="Buy Pass"
layout="topleft"
left_delta="-105"
name="Buy Pass..."
@@ -501,48 +511,43 @@ Go to World menu &gt; About Land or select another parcel to show its details.
width="100" />
<button
follows="left|top"
- height="20"
- label="Abandon Land..."
- label_selected="Abandon Land..."
+ height="23"
+ label="Abandon Land"
layout="topleft"
- left="260"
+ right="-10"
name="Abandon Land..."
- top="328"
+ top_pad="-47"
width="180" />
<button
follows="left|top"
- height="20"
- label="Reclaim Land..."
- label_selected="Reclaim Land..."
+ height="23"
+ label="Reclaim Land"
layout="topleft"
left_delta="0"
name="Reclaim Land..."
- top_delta="-48"
+ top_delta="-61"
width="180" />
<button
enabled="false"
follows="left|top"
- height="20"
- label="Linden Sale..."
- label_selected="Linden Sale..."
+ height="23"
+ label="Linden Sale"
layout="topleft"
left_delta="0"
name="Linden Sale..."
tool_tip="Land must be owned, set content, and not already for auction."
- top_pad="4"
+ top_pad="2"
width="180" />
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="380"
- label="Covenant"
+ follows="all"
+ label="COVENANT"
layout="topleft"
- left_delta="-1"
+ left="0"
+ top="0"
help_topic="land_covenant_tab"
- name="land_covenant_panel"
- top_delta="-47"
- width="458">
+ name="land_covenant_panel">
<panel.string
name="can_resell">
Purchased land in this region may be resold.
@@ -563,13 +568,12 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="20"
+ height="16"
layout="topleft"
- left="5"
+ left="10"
mouse_opaque="false"
name="estate_section_lbl"
- top="0"
+ top="10"
width="100">
Estate:
</text>
@@ -577,38 +581,24 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="estate_name_lbl"
- top="20"
- width="100">
- Name:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
+ height="16"
layout="topleft"
- left_pad="10"
+ left_pad="0"
mouse_opaque="false"
name="estate_name_text"
top_delta="0"
- width="150">
+ width="260">
mainland
</text>
<text
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left="10"
mouse_opaque="false"
name="estate_owner_lbl"
- top="40"
width="100">
Owner:
</text>
@@ -616,55 +606,52 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
- left_pad="10"
+ left_pad="0"
mouse_opaque="false"
name="estate_owner_text"
- top_delta="0"
- width="150">
+ width="300">
(none)
</text>
<text_editor
type="string"
length="1"
enabled="false"
- follows="left|top|right|bottom"
- handle_edit_keys_directly="true"
- height="115"
+ follows="all"
+ handle_edit_keys_directly="true"
+ height="200"
layout="topleft"
- left_delta="0"
+ left="10"
max_length="65535"
name="covenant_editor"
- top_delta="20"
- width="330"
+ width="470"
word_wrap="true">
There is no Covenant provided for this Estate.
</text_editor>
<text
type="string"
length="1"
- follows="left|top"
- height="20"
+ follows="right|top"
+ height="16"
+ halign="right"
layout="topleft"
- left_delta="0"
+ right="-10"
+ top_pad="0"
mouse_opaque="false"
name="covenant_timestamp_text"
- top_pad="55"
- width="250">
+ width="460">
Last Modified Wed Dec 31 16:00:00 1969
</text>
<text
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="20"
+ height="16"
layout="topleft"
- left="5"
+ left="10"
mouse_opaque="false"
name="region_section_lbl"
- top="250"
width="100">
Region:
</text>
@@ -672,38 +659,23 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="region_name_lbl"
- top="270"
- width="100">
- Name:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left_pad="10"
mouse_opaque="false"
name="region_name_text"
- top_delta="0"
width="150">
- leyla
+ EricaVille
</text>
<text
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left="10"
mouse_opaque="false"
name="region_landtype_lbl"
- top="290"
width="100">
Type:
</text>
@@ -711,12 +683,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left_pad="10"
mouse_opaque="false"
name="region_landtype_text"
- top_delta="0"
width="150">
Mainland / Homestead
</text>
@@ -724,12 +695,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left="10"
mouse_opaque="false"
name="region_maturity_lbl"
- top="310"
width="100">
Rating:
</text>
@@ -737,12 +707,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left_pad="10"
mouse_opaque="false"
name="region_maturity_text"
- top_delta="0"
width="150">
Adult
</text>
@@ -750,12 +719,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left="10"
mouse_opaque="false"
name="resellable_lbl"
- top="330"
width="100">
Resale:
</text>
@@ -763,12 +731,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="16"
layout="topleft"
left_pad="10"
mouse_opaque="false"
name="resellable_clause"
- top_delta="0"
width="330">
Land in this region may not be resold.
</text>
@@ -776,12 +743,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="20"
+ height="30"
layout="topleft"
left="10"
mouse_opaque="false"
name="changeable_lbl"
- top="350"
width="100">
Subdivide:
</text>
@@ -794,22 +760,20 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left_pad="10"
mouse_opaque="false"
name="changeable_clause"
- top_delta="0"
+ word_wrap="true"
width="330">
Land in this region may not be joined/subdivided.
</text>
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="380"
- label="Objects"
+ follows="all"
+ label="OBJECTS"
layout="topleft"
- left_delta="0"
+ left="0"
+ top="0"
help_topic="land_objects_tab"
- name="land_objects_panel"
- top_delta="-47"
- width="458">
+ name="land_objects_panel">
<panel.string
name="objects_available_text">
[COUNT] out of [MAX] ([AVAILABLE] available)
@@ -824,7 +788,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="parcel_object_bonus"
top="4"
visible="false"
@@ -841,7 +805,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
name="Simulator primitive usage:"
top_pad="4"
width="364">
- Simulator primitive usage:
+ Primative usage:
</text>
<text
type="string"
@@ -849,10 +813,10 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="152"
+ left_delta="190"
name="objects_available"
top_delta="0"
- width="212">
+ width="260">
[COUNT] out of [MAX] ([AVAILABLE] available)
</text>
<text
@@ -861,11 +825,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Primitives parcel supports:"
top="44"
width="152">
- Primitives parcel supports:
+ Prims parcel supports:
</text>
<text
type="string"
@@ -873,7 +837,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="152"
+ left_delta="190"
name="object_contrib_text"
top_delta="0"
width="212">
@@ -885,11 +849,11 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Primitives on parcel:"
top="64"
width="152">
- Primitives on parcel:
+ Prims on parcel:
</text>
<text
type="string"
@@ -897,7 +861,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
- left_delta="152"
+ left_delta="190"
name="total_objects_text"
top_delta="0"
width="48">
@@ -907,21 +871,21 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
left="28"
name="Owned by parcel owner:"
top="84"
- width="128">
+ width="176">
Owned by parcel owner:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left_delta="128"
+ left_delta="172"
name="owner_objects_text"
top_delta="0"
width="48">
@@ -931,46 +895,45 @@ Go to World menu &gt; About Land or select another parcel to show its details.
bottom="100"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Show"
label_selected="Show"
layout="topleft"
name="ShowOwner"
- right="-190"
- width="60" />
+ right="-140"
+ width="60"
+ top_delta="-6"/>
<button
bottom="100"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Return..."
- label_selected="Return..."
+ height="23"
+ label="Return"
layout="topleft"
name="ReturnOwner..."
- right="-60"
+ right="-10"
tool_tip="Return objects to their owners."
- width="119" />
+ width="119"
+ top_delta="0"/>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
left="28"
name="Set to group:"
- top="104"
- width="128">
+ top_pad="5"
+ width="176">
Set to group:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left_delta="128"
+ left_delta="172"
name="group_objects_text"
top_delta="0"
width="48">
@@ -980,46 +943,45 @@ Go to World menu &gt; About Land or select another parcel to show its details.
bottom="120"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
label="Show"
+ height="23"
label_selected="Show"
layout="topleft"
name="ShowGroup"
- right="-190"
- width="60" />
+ right="-140"
+ width="60"
+ top_delta="-6"/>
<button
bottom="120"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Return..."
- label_selected="Return..."
+ height="23"
+ label="Return"
layout="topleft"
name="ReturnGroup..."
- right="-60"
+ right="-10"
tool_tip="Return objects to their owners."
- width="119" />
+ width="119"
+ top_delta="0"/>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
left="28"
name="Owned by others:"
- top="124"
- width="128">
+ top_pad="5"
+ width="176">
Owned by others:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left_delta="128"
+ left_delta="172"
name="other_objects_text"
top_delta="0"
width="48">
@@ -1029,46 +991,45 @@ Go to World menu &gt; About Land or select another parcel to show its details.
bottom="140"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Show"
label_selected="Show"
layout="topleft"
name="ShowOther"
- right="-190"
- width="60" />
+ right="-140"
+ width="60"
+ top_delta="-6"/>
<button
bottom="140"
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Return..."
- label_selected="Return..."
+ height="23"
+ label="Return"
layout="topleft"
name="ReturnOther..."
- right="-60"
+ right="-10"
tool_tip="Return objects to their owners."
- width="119" />
+ width="119"
+ top_delta="0"/>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
left="28"
name="Selected / sat upon:"
- top="144"
- width="128">
+ top_pad="5"
+ width="176">
Selected / sat upon:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left_delta="128"
+ left_delta="172"
name="selected_objects_text"
top_delta="0"
width="48">
@@ -1078,71 +1039,70 @@ Go to World menu &gt; About Land or select another parcel to show its details.
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left="4"
+ left="10"
name="Autoreturn"
- top="164"
+ top_pad="0"
width="294">
- Autoreturn other residents&apos; objects (minutes, 0 for off):
+ Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<line_editor
border_style="line"
border_thickness="1"
bottom="180"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
max_length="6"
name="clean other time"
- right="-100"
- width="56" />
+ right="-72"
+ width="56"
+ top_delta="-6"/>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left="4"
+ left="10"
name="Object Owners:"
- top="184"
+ top_pad="10"
width="104">
Object Owners:
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Refresh List"
- label_selected="Refresh List"
- layout="topleft"
- left_delta="104"
- name="Refresh List"
- top_delta="0"
- width="106" />
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ name="Refresh List"
+ left_pad="5"
+ right="-183"
+ tool_tip="Refresh Object List"
+ width="20"
+ top_delta="-6"/>
<button
enabled="false"
follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Return objects..."
- label_selected="Return objects..."
+ height="23"
+ label="Return Objects"
layout="topleft"
left_pad="6"
name="Return objects..."
top_delta="0"
+ right="-10"
width="164" />
<name_list
column_padding="0"
draw_heading="true"
- follows="left|top|right|bottom"
- height="165"
+ follows="all"
+ height="180"
layout="topleft"
- left="4"
+ left="10"
name="owner list"
name_column="name"
- top="210"
- width="450">
+ width="470">
<name_list.columns
label="Type"
name="type"
@@ -1158,24 +1118,22 @@ Go to World menu &gt; About Land or select another parcel to show its details.
<name_list.columns
label="Count"
name="count"
- width="70" />
+ width="60" />
<name_list.columns
label="Most Recent"
name="mostrecent"
- width="160" />
+ width="170" />
</name_list>
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="333"
- label="Options"
+ follows="all"
+ label="OPTIONS"
layout="topleft"
- left_delta="0"
help_topic="land_options_tab"
name="land_options_panel"
- top_delta="31"
- width="458">
+ left="0"
+ top="0">
<panel.string
name="search_enabled_tooltip">
Let people see this parcel in search results
@@ -1191,7 +1149,7 @@ Only large parcels can be listed in search.
</panel.string>
<panel.string
name="mature_check_mature">
- Mature Content
+ Moderate Content
</panel.string>
<panel.string
name="mature_check_adult">
@@ -1199,7 +1157,7 @@ Only large parcels can be listed in search.
</panel.string>
<panel.string
name="mature_check_mature_tooltip">
- Your parcel information or content is considered mature.
+ Your parcel information or content is considered moderate.
</panel.string>
<panel.string
name="mature_check_adult_tooltip">
@@ -1221,13 +1179,14 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
+ text_color="white"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="allow_label"
- top="4"
+ top="10"
width="278">
- Allow other residents to:
+ Allow other Residents to:
</text>
<check_box
height="16"
@@ -1236,44 +1195,40 @@ Only large parcels can be listed in search.
left="14"
name="edit land check"
tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
- top="24"
- width="268" />
+ top_pad="4"
+ width="147i" />
<check_box
height="16"
label="Fly"
layout="topleft"
- left_delta="0"
name="check fly"
tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
- top_pad="4"
- width="268" />
+ left_pad="4"
+ width="150" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="178"
+ left="14"
name="allow_label2"
- top="24"
- width="104">
- Create Objects:
+ width="150">
+ Build:
</text>
<check_box
height="16"
- label="All Residents"
+ label="Everyone"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="edit objects check"
- top_delta="0"
- width="104" />
+ width="120" />
<check_box
height="16"
label="Group"
layout="topleft"
- left_delta="100"
+ left_pad="2"
name="edit group objects check"
- top_delta="0"
width="70" />
<text
type="string"
@@ -1281,17 +1236,16 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="178"
+ left="14"
name="allow_label3"
- top="44"
- width="124">
+ width="150">
Object Entry:
</text>
<check_box
height="16"
- label="All Residents"
+ label="Everyone"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="all object entry check"
top_delta="0"
width="120" />
@@ -1299,7 +1253,7 @@ Only large parcels can be listed in search.
height="16"
label="Group"
layout="topleft"
- left_delta="100"
+ left_pad="2"
name="group object entry check"
top_delta="0"
width="70" />
@@ -1309,17 +1263,16 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="178"
+ left="14"
name="allow_label4"
- top="64"
- width="124">
+ width="150">
Run Scripts:
</text>
<check_box
height="16"
- label="All Residents"
+ label="Everyone"
layout="topleft"
- left_delta="92"
+ left_pad="2"
name="check other scripts"
top_delta="0"
width="120" />
@@ -1327,19 +1280,19 @@ Only large parcels can be listed in search.
height="16"
label="Group"
layout="topleft"
- left_delta="100"
+ left_pad="2"
name="check group scripts"
top_delta="0"
width="70" />
<text
type="string"
+ text_color="white"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="land_options_label"
- top="84"
width="278">
Land Options:
</text>
@@ -1350,33 +1303,31 @@ Only large parcels can be listed in search.
left="14"
name="check safe"
tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
- top="104"
- width="268" />
+ top_pad="5"
+ width="200" />
<check_box
height="16"
label="No Pushing"
layout="topleft"
- left_delta="164"
+ left_pad="5"
name="PushRestrictCheck"
tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
top_delta="0"
width="119" />
<check_box
height="16"
- label="Show Place in Search (L$30/week) under"
+ label="Show Place in Search (L$30/week)"
layout="topleft"
left="14"
name="ShowDirectoryCheck"
tool_tip="Let people see this parcel in search results"
- top="124"
- width="268" />
+ width="430" />
<combo_box
enabled="false"
- height="18"
+ height="23"
layout="topleft"
- left_delta="241"
+ left="30"
name="land category with adult"
- top_delta="-2"
visible="false"
width="130">
<combo_box.item
@@ -1434,11 +1385,10 @@ Only large parcels can be listed in search.
</combo_box>
<combo_box
enabled="false"
- height="18"
+ height="23"
layout="topleft"
- left_delta="0"
+ left="30"
name="land category"
- top_delta="0"
visible="false"
width="130">
<combo_box.item
@@ -1490,24 +1440,14 @@ Only large parcels can be listed in search.
name="item12"
value="other" />
</combo_box>
- <button
- follows="left|top"
- height="18"
- label="?"
- label_selected="?"
- layout="topleft"
- left_pad="15"
- name="?"
- top_delta="0"
- width="18" />
<check_box
height="16"
- label="Mature Content"
+ label="Moderate Content"
layout="topleft"
left="14"
name="MatureCheck"
+ top="177"
tool_tip=" "
- top="144"
width="107" />
<text
type="string"
@@ -1515,76 +1455,75 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="10"
name="Snapshot:"
- top="164"
- width="278">
+ text_color="white"
+ top="220"
+ width="200">
Snapshot:
</text>
<texture_picker
follows="left|top"
- height="135"
+ height="150"
layout="topleft"
- left_delta="72"
+ left="14"
name="snapshot_ctrl"
tool_tip="Click to choose a picture"
- top_delta="0"
- width="180" />
+ width="195" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="220"
+ top="180"
+ text_color="white"
name="landing_point"
- top="287"
- width="278">
+ word_wrap="true"
+ width="200">
Landing Point: [LANDING]
</text>
<button
- follows="left|top"
- font="SansSerifSmall"
- height="16"
+ follows="right|top"
+ height="23"
label="Set"
label_selected="Set"
layout="topleft"
- left_delta="232"
name="Set"
+ right="-68"
tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
- top_delta="0"
width="50" />
<button
- follows="left|top"
- font="SansSerifSmall"
- height="16"
+ follows="right|top"
+ height="23"
label="Clear"
label_selected="Clear"
layout="topleft"
left_pad="5"
name="Clear"
tool_tip="Clear the landing point"
- top_delta="0"
+ right="-10"
width="50" />
<text
type="string"
length="1"
+ text_color="white"
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="220"
+ top_pad="10"
name="Teleport Routing: "
- top="307"
- width="278">
+ width="200">
Teleport Routing:
</text>
<combo_box
- height="18"
+ height="23"
layout="topleft"
- left_delta="116"
name="landing type"
+ top_pad="3"
tool_tip="Teleport Routing -- select how to handle teleports onto your land"
- top_delta="0"
width="120">
<combo_box.item
enabled="true"
@@ -1605,142 +1544,104 @@ Only large parcels can be listed in search.
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="363"
- label="Media"
+ follows="all"
+ label="MEDIA"
layout="topleft"
- left_delta="0"
+ left="0"
+ top="0"
help_topic="land_media_tab"
- name="land_media_panel"
- top_delta="1"
- width="458">
+ name="land_media_panel">
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="20"
layout="topleft"
left="10"
name="with media:"
- top="9"
- width="65">
+ top="10"
+ width="100">
Type:
</text>
<combo_box
- height="18"
+ height="23"
layout="topleft"
- left_pad="5"
+ left_pad="0"
name="media type"
tool_tip="Specify if the URL is a movie, web page, or other media"
- top_delta="-2"
- width="120" />
+ width="120"
+ top_delta="0"/>
<text
follows="left|top"
height="16"
layout="topleft"
left_pad="10"
name="mime_type"
- top_delta="2"
width="200" />
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="20"
layout="topleft"
left="10"
name="at URL:"
- top="29"
- width="65">
- Home URL:
+ width="100"
+ top_pad="10">
+ Home Page:
</text>
<line_editor
- bottom_delta="0"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left="80"
+ left_pad="0"
max_length="255"
name="media_url"
- right="-80"
select_on_focus="true"
- text_readonly_color="0.576471 0.662745 0.835294 1" />
+ width="300"
+ top_delta="0"/>
<button
- follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Set..."
- label_selected="Set..."
- layout="topleft"
- left_pad="8"
- name="set_media_url"
- top_delta="0"
- width="60" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="CurrentURL:"
- top="49"
- width="65">
- Current URL:
- </text>
- <text
- follows="left|top"
- height="16"
+ follows="right|top"
+ height="23"
+ label="Set"
layout="topleft"
left_pad="5"
- name="current_url"
- top_delta="0"
- width="300" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="16"
- label="Reset..."
- label_selected="Reset..."
- layout="topleft"
- left_pad="6"
- name="reset_media_url"
- top_delta="0"
- width="60" />
+ name="set_media_url"
+ width="50"
+ top_delta="0"/>
<check_box
+ follows="top|left"
height="16"
label="Hide URL"
layout="topleft"
- left="100"
+ left="110"
name="hide_media_url"
tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
- top="89"
- width="200" />
+ width="50"
+ top_pad="5"/>
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
left="10"
name="Description:"
- top="49"
- width="364">
+ width="364"
+ top_pad="10">
Description:
</text>
<line_editor
- border_style="line"
- border_thickness="1"
- bottom_delta="0"
follows="left|top"
- height="16"
+ height="20"
layout="topleft"
- left="80"
+ left="110"
max_length="255"
name="url_description"
- right="-80"
select_on_focus="true"
- tool_tip="Text displayed next to play/load button" />
+ tool_tip="Text displayed next to play/load button"
+ top_delta="0"
+ width="300" />
<text
type="string"
length="1"
@@ -1749,10 +1650,10 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="Media texture:"
- top="69"
- width="364">
- Replace
-Texture:
+ top_pad="10"
+ width="364"
+ word_wrap="true">
+ Replace Texture:
</text>
<texture_picker
allow_no_texture="true"
@@ -1760,7 +1661,7 @@ Texture:
follows="left|top"
height="80"
layout="topleft"
- left_delta="70"
+ left="110"
name="media texture"
tool_tip="Click to choose a picture"
top_delta="0"
@@ -1769,37 +1670,35 @@ Texture:
type="string"
length="1"
follows="left|top"
- height="16"
+ height="80"
layout="topleft"
- left_delta="75"
+ left_pad="8"
name="replace_texture_help"
- top="85"
- width="270">
- Objects using this texture will show the movie or
- web page after you click the play arrow.
-
- Select the thumbnail to choose a different texture.
+ width="300"
+ word_wrap="true"
+ top_delta="0">
+ Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
</text>
<check_box
height="16"
label="Auto scale"
layout="topleft"
- left_delta="70"
+ left="107"
name="media_auto_scale"
+ top_pad="-10"
tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."
- top_delta="0"
width="200" />
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="20"
layout="topleft"
- left="85"
+ left="10"
name="media_size"
tool_tip="Size to render Web media, leave 0 for default."
- top="185"
- width="85">
+ width="100"
+ top_pad="10">
Size:
</text>
<spinner
@@ -1807,11 +1706,11 @@ Texture:
enabled="false"
follows="left|top"
halign="right"
- height="16"
+ height="23"
increment="1"
initial_value="0"
layout="topleft"
- left_delta="65"
+ left_pad="0"
max_val="1024"
name="media_size_width"
tool_tip="Size to render Web media, leave 0 for default."
@@ -1822,7 +1721,7 @@ Texture:
enabled="false"
follows="left|top"
halign="right"
- height="16"
+ height="23"
increment="1"
initial_value="0"
layout="topleft"
@@ -1839,7 +1738,7 @@ Texture:
follows="left|top"
height="16"
layout="topleft"
- left_delta="70"
+ left_pad="5"
name="pixels"
right="-10">
pixels
@@ -1852,31 +1751,29 @@ Texture:
layout="topleft"
left="10"
name="Options:"
- top="237"
- width="292">
+ top_pad="10"
+ width="100">
Options:
</text>
<check_box
height="16"
label="Loop"
layout="topleft"
- left_delta="70"
+ left_pad="-3"
name="media_loop"
tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."
- top_delta="0"
+ top_delta="-1"
width="200" />
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="363"
- label="Audio"
+ follows="all"
+ label="SOUND"
layout="topleft"
- left_delta="0"
+ left="0"
+ top="0"
help_topic="land_audio_tab"
- name="land_audio_panel"
- top_delta="1"
- width="458">
+ name="land_audio_panel">
<text
type="string"
length="1"
@@ -1884,23 +1781,30 @@ Texture:
height="16"
layout="topleft"
left="10"
+ top="10"
name="MusicURL:"
- top="225"
width="364">
Music URL:
</text>
<line_editor
- border_style="line"
- border_thickness="1"
- bottom_delta="0"
follows="left|top"
- height="16"
+ height="23"
layout="topleft"
- left="80"
+ left="100"
max_length="255"
name="music_url"
+ top_delta="0"
right="-15"
select_on_focus="true" />
+ <check_box
+ height="16"
+ label="Hide URL"
+ layout="topleft"
+ name="hide_music_url"
+ tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
+ left_delta="10"
+ top_pad="5"
+ width="292" />
<text
type="string"
length="1"
@@ -1909,28 +1813,17 @@ Texture:
layout="topleft"
left="10"
name="Sound:"
- top="265"
- width="364">
+ top_pad="10"
+ width="100">
Sound:
</text>
<check_box
height="16"
label="Restrict gesture and object sounds to this parcel"
layout="topleft"
- left_delta="70"
name="check sound local"
- top_delta="0"
+ left_pad="0"
width="292" />
- <button
- follows="left|top"
- height="18"
- label="?"
- label_selected="?"
- layout="topleft"
- left_delta="292"
- name="?"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -1940,47 +1833,47 @@ Texture:
left="10"
mouse_opaque="false"
name="Voice settings:"
- top="305"
- width="364">
+ top_pad="10"
+ width="100">
Voice:
</text>
<check_box
- height="54"
+ height="16"
label="Enable Voice"
layout="topleft"
- left="80"
+ left_pad="0"
name="parcel_enable_voice_channel"
- top="267"
- width="463" />
+ width="300" />
<check_box
enabled="false"
- height="54"
+ height="16"
label="Enable Voice (established by the Estate)"
layout="topleft"
- left_delta="0"
+ left="110"
name="parcel_enable_voice_channel_is_estate_disabled"
top_delta="0"
- width="463" />
+ width="300" />
<check_box
- height="54"
+ height="16"
label="Restrict Voice to this parcel"
layout="topleft"
- left="100"
- name="parcel_enable_voice_channel_parcel"
- top="287"
- width="443" />
+ left="110"
+ name="parcel_enable_voice_channel_local"
+ width="300" />
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
- height="333"
- label="Access"
+ follows="all"
+ label="ACCESS"
layout="topleft"
- left_delta="0"
+ left="0"
+ top="0"
help_topic="land_access_tab"
- name="land_access_panel"
- top_delta="31"
- width="458">
+ name="land_access_panel">
+ <panel.string
+ name="access_estate_defined">
+ (Defined by the Estate)
+ </panel.string>
<panel.string
name="estate_override">
One or more of these options is set at the estate level
@@ -1989,19 +1882,19 @@ Texture:
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="20"
+ height="16"
layout="topleft"
- left="8"
+ left="10"
name="Limit access to this parcel to:"
- top="4"
- width="278">
+ text_color="White"
+ top="10"
+ width="400">
Access To This Parcel
</text>
<check_box
follows="top|left"
height="16"
- label="Allow Public Access"
+ label="Allow Public Access [MATURITY]"
layout="topleft"
left_delta="0"
name="public_access"
@@ -2017,26 +1910,26 @@ Texture:
name="Only Allow"
top="49"
width="278">
- Block Access By:
+ Restrict Access to Residents verified by:
</text>
<check_box
follows="top|left"
height="16"
- label="Residents who have not given payment info to Linden Lab"
+ label="Payment Information on File [ESTATE_PAYMENT_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified residents."
+ tool_tip="Ban unidentified Residents."
top_pad="4"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Residents who are not age verified adults"
+ label="Age Verification [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
@@ -2059,7 +1952,7 @@ Texture:
top_pad="4"
width="120" />
<combo_box
- height="16"
+ height="23"
layout="topleft"
left_pad="22"
name="pass_combo"
@@ -2077,7 +1970,7 @@ Texture:
<spinner
enabled="false"
follows="left|top"
- height="16"
+ height="23"
increment="1"
initial_value="10"
label="Price in L$:"
@@ -2087,12 +1980,12 @@ Texture:
max_val="500"
min_val="1"
name="PriceSpin"
- top="149"
- width="180" />
+ top_pad="5"
+ width="200" />
<spinner
enabled="false"
follows="left|top"
- height="16"
+ height="23"
increment="0.25"
initial_value="1"
label="Hours of access:"
@@ -2102,8 +1995,15 @@ Texture:
max_val="24"
min_val="0.01"
name="HoursSpin"
- top_pad="4"
- width="180" />
+ top_pad="5"
+ width="200" />
+ <panel
+ name="Allowed_layout_panel"
+ follows="top|left"
+ left="10"
+ height="170"
+ top_pad="8"
+ width="240">
<text
type="string"
length="1"
@@ -2111,46 +2011,48 @@ Texture:
height="16"
label="Always Allow"
layout="topleft"
- left="20"
+ left="0"
name="AllowedText"
- top="204"
- width="195">
+ top="0"
+ width="230">
Allowed Residents
</text>
<name_list
column_padding="0"
follows="top|bottom"
heading_height="14"
- height="80"
+ height="120"
layout="topleft"
- left_delta="0"
+ left="0"
multi_select="true"
name="AccessList"
tool_tip="([LISTED] listed, [MAX] max)"
- top_pad="4"
- width="195" />
+ width="230" />
<button
follows="bottom"
- font="SansSerifSmall"
- height="16"
- label="Add..."
- label_selected="Add..."
+ height="23"
+ label="Add"
layout="topleft"
- left_delta="5"
+ left="0"
name="add_allowed"
- top="308"
- width="80" />
+ width="100" />
<button
follows="bottom"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Remove"
label_selected="Remove"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="remove_allowed"
- top_delta="0"
- width="80" />
+ right="-1"
+ width="100" />
+ </panel>
+ <panel
+ name="Banned_layout_panel"
+ follows="top|right"
+ height="170"
+ width="240"
+ left_pad="2">
<text
type="string"
length="1"
@@ -2158,47 +2060,43 @@ Texture:
height="16"
label="Ban"
layout="topleft"
- left="240"
+ left="0"
name="BanCheck"
- top="204"
- width="195">
+ top="0"
+ width="200">
Banned Residents
</text>
<name_list
column_padding="0"
follows="top|bottom"
heading_height="14"
- height="80"
+ height="120"
layout="topleft"
- left_delta="0"
+ left="0"
multi_select="true"
name="BannedList"
tool_tip="([LISTED] listed, [MAX] max)"
- top_pad="4"
- width="195" />
+ width="230" />
<button
follows="bottom"
- font="SansSerifSmall"
- height="16"
- label="Add..."
- label_selected="Add..."
+ height="23"
+ label="Add"
layout="topleft"
- left_delta="5"
+ left="0"
name="add_banned"
- top="308"
- width="80" />
+ width="100" />
<button
enabled="false"
follows="bottom"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Remove"
label_selected="Remove"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="remove_banned"
- top_delta="0"
- width="80" />
+ right="-1"
+ width="100" />
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_activeim.xml b/indra/newview/skins/default/xui/en/floater_activeim.xml
index 1bc9cde044..96fe0aa70c 100644
--- a/indra/newview/skins/default/xui/en/floater_activeim.xml
+++ b/indra/newview/skins/default/xui/en/floater_activeim.xml
@@ -30,4 +30,4 @@
name="chiclet_row_panel_list"
width="318"/>
</scroll_container>
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index ab3d5722f0..1ffedde29b 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="556"
+ height="610"
layout="topleft"
name="Animation Preview"
help_topic="animation_preview"
@@ -147,7 +147,11 @@ Maximum animation length is [MAX_LENGTH] seconds.
name="E_ST_NO_XLT_EMOTE">
Cannot read emote name.
</floater.string>
- <text
+ <floater.string
+ name="E_ST_BAD_ROOT">
+ Incorrect root joint name, use "hip".
+ </floater.string>
+ <text
type="string"
length="1"
bottom="42"
@@ -163,7 +167,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
follows="top|left|right"
height="23"
layout="topleft"
- left="85"
+ left="100"
name="name_form"
right="-10" />
<text
@@ -182,7 +186,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
follows="top|left|right"
height="23"
layout="topleft"
- left="85"
+ left="100"
name="description_form"
right="-10" />
<spinner
@@ -192,7 +196,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
increment="1"
initial_value="0"
label="Priority"
- label_width="90"
+ label_width="88"
layout="topleft"
left="10"
max_val="4"
@@ -214,14 +218,14 @@ Maximum animation length is [MAX_LENGTH] seconds.
increment="1"
initial_value="0"
label="In(%)"
- label_width="35"
+ label_width="49"
layout="topleft"
top_pad="5"
left="30"
max_val="100"
name="loop_in_point"
tool_tip="Sets point in animation that looping returns to"
- width="110" />
+ width="115" />
<spinner
bottom_delta="0"
follows="left|top"
@@ -234,8 +238,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
max_val="100"
name="loop_out_point"
tool_tip="Sets point in animation that ends a loop"
- label_width="45"
- width="120" />
+ label_width="49"
+ width="115" />
<text
type="string"
length="1"
@@ -243,6 +247,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
follows="top|left"
height="23"
width="110"
+ word_wrap="true"
layout="topleft"
left="10"
name="hand_label">
@@ -315,6 +320,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
follows="top|left"
height="23"
width="110"
+ word_wrap="true"
layout="topleft"
left="10"
name="emote_label">
@@ -395,6 +401,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
follows="top|left"
height="23"
width="110"
+ word_wrap="true"
layout="topleft"
left="10"
name="preview_label">
@@ -449,30 +456,55 @@ Maximum animation length is [MAX_LENGTH] seconds.
width="200" />
<button
follows="top|right"
- height="28"
- image_selected="button_anim_play_selected.tga"
- image_unselected="button_anim_play.tga"
+ height="23"
+ image_overlay="Play_Over"
+ image_unselected="SegmentedBtn_Left_Off"
+ image_selected="SegmentedBtn_Left_On_Selected"
+ image_disabled_selected="SegmentedBtn_Left_Selected_Disabled"
+ image_disabled="SegmentedBtn_Left_Disabled"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Selected_Press"
layout="topleft"
left="10"
name="play_btn"
- picture_style="true"
- tool_tip="Play/pause your animation"
+ tool_tip="Play your animation"
top_pad="0"
- width="28" />
+ width="23" />
+ <button
+ visible = "false"
+ follows="top|right"
+ height="23"
+ image_overlay="Pause_Over"
+ image_unselected="SegmentedBtn_Left_Off"
+ image_selected="SegmentedBtn_Left_On_Selected"
+ image_disabled_selected="SegmentedBtn_Left_Selected_Disabled"
+ image_disabled="SegmentedBtn_Left_Disabled"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Selected_Press"
+ layout="topleft"
+ left="10"
+ name="pause_btn"
+ tool_tip="Pause your animation"
+ top_pad="-23"
+ width="23" />
<button
follows="top|right"
- height="28"
- image_selected="button_anim_stop_selected.tga"
- image_unselected="button_anim_stop.tga"
+ height="23"
+ image_overlay="StopReload_Over"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_selected="SegmentedBtn_Right_On_Selected"
+ image_disabled_selected="SegmentedBtn_Right_Selected_Disabled"
+ image_disabled="SegmentedBtn_Right_Disabled"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
layout="topleft"
- left_pad="4"
name="stop_btn"
- picture_style="true"
tool_tip="Stop animation playback"
top_delta="0"
- width="28" />
+ left_delta="23"
+ width="23" />
<slider
- left_pad="0"
+ left_pad="10"
follows="top|right"
height="23"
width="200"
@@ -484,6 +516,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
<text
type="string"
length="1"
+ height="72"
+ word_wrap="true"
top_pad="5"
text_color="EmphasisColor"
follows="top|left"
@@ -495,21 +529,21 @@ Maximum animation length is [MAX_LENGTH] seconds.
We recommend BVH files exported from Poser 4.
</text>
<button
- bottom="546"
- follows="bottom|right"
+ top="580"
+ follows="bottom|left"
height="23"
- label="Cancel"
+ label="Upload (L$[AMOUNT])"
layout="topleft"
- name="cancel_btn"
- right="265"
- width="123" />
+ left="10"
+ name="ok_btn"
+ width="128" />
<button
+ top="580"
follows="bottom|left"
height="23"
- label="Upload (L$[AMOUNT])"
+ label="Cancel"
layout="topleft"
- left_delta="-129"
- name="ok_btn"
- top_delta="0"
- width="123" />
+ name="cancel_btn"
+ left="142"
+ width="128" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_auction.xml b/indra/newview/skins/default/xui/en/floater_auction.xml
index aae6508041..9c6d114c4c 100644
--- a/indra/newview/skins/default/xui/en/floater_auction.xml
+++ b/indra/newview/skins/default/xui/en/floater_auction.xml
@@ -8,7 +8,7 @@
min_width="420"
name="floater_auction"
help_topic="floater_auction"
- title="Start Linden Land Sale"
+ title="START LINDEN LAND SALE"
width="420">
<floater.string
name="already for sale">
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index d20566b08a..f59badfcb4 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -8,7 +8,7 @@
min_width="265"
name="avatarpicker"
help_topic="avatarpicker"
- title="Choose Resident"
+ title="CHOOSE RESIDENT"
width="265">
<floater.string
name="not_found">
@@ -16,7 +16,7 @@
</floater.string>
<floater.string
name="no_one_near">
- No-one near
+ No one near
</floater.string>
<floater.string
name="no_results">
@@ -26,6 +26,12 @@
name="searching">
Searching...
</floater.string>
+ <!-- For multiple person selection, use "Select" and "Close"
+ instead of "OK" and "Cancel" because "Cancel" still keeps the ones
+ you have already selected. The code will show the appropriate
+ set of buttons. -->
+ <string name="Select">Select</string>
+ <string name="Close">Close</string>
<tab_container
follows="all"
height="300"
@@ -41,7 +47,7 @@
label="Search"
layout="topleft"
left="6"
- help_topic="avatarpicker_search_tab"
+ help_topic="avatarpicker"
name="SearchPanel"
top="150"
width="132">
@@ -86,6 +92,51 @@
top="52"
width="132" />
</panel>
+ <panel
+ border="none"
+ height="150"
+ label="Friends"
+ layout="topleft"
+ left="6"
+ help_topic="avatarpicker"
+ name="FriendsPanel"
+ top="150"
+ width="132">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="InstructSelectFriend"
+ top="5"
+ width="200">
+ Select a person:
+ </text>
+ <button
+ follows="top|right"
+ layout="topleft"
+ right="-5"
+ top ="5"
+ height="20"
+ width="20"
+ name="RefreshFriends"
+ image_overlay="Refresh_Off">
+ <button.commit_callback
+ function="Refresh.FriendList"/>
+ </button>
+ <scroll_list
+ follows="all"
+ height="100"
+ border="false"
+ layout="topleft"
+ left="0"
+ name="Friends"
+ sort_column="0"
+ top_pad="5"
+ width="132" />
+ </panel>
<panel
border="none"
@@ -93,7 +144,7 @@
label="Near Me"
layout="topleft"
left="6"
- help_topic="avatarpicker_near_me_tab"
+ help_topic="avatarpicker"
name="NearMePanel"
top="150"
width="132">
@@ -142,7 +193,6 @@
height="28"
width="28"
name="Refresh"
- picture_style="true"
image_overlay="Refresh_Off" />
<scroll_list
follows="all"
@@ -161,7 +211,7 @@
height="23"
label="OK"
label_selected="OK"
- name="Select"
+ name="ok_btn"
top_pad="3"
left="46"
width="100" />
@@ -170,7 +220,7 @@
height="23"
label="Cancel"
label_selected="Cancel"
- name="Cancel"
+ name="cancel_btn"
width="100"
left_pad="5" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
index 4f2a36e518..54b6edb0ec 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="950"
+ height="650"
layout="topleft"
name="avatar_texture_debug"
help_topic="avatar_texture_debug"
- title="Avatar Textures"
+ title="AVATAR TEXTURES"
width="1250">
<floater.string
name="InvalidAvatar">
@@ -16,9 +16,9 @@
length="1"
height="16"
layout="topleft"
- left="10"
+ left="30"
name="label"
- top="24"
+ top="40"
width="80">
Baked Textures
</text>
@@ -27,7 +27,7 @@
length="1"
height="16"
layout="topleft"
- left_pad="60"
+ left_pad="50"
name="composite_label"
top_delta="0"
width="120">
@@ -40,16 +40,37 @@
layout="topleft"
left_pad="530"
name="Dump"
- top_delta="1"
+ top_delta="0"
width="150" />
+ <scroll_container
+ color="DkGray2"
+ opaque="true"
+ follows="all"
+ height="590"
+ layout="topleft"
+ left="5"
+ top_pad="5"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ width="1240">
+ <panel
+ name="scroll_content_panel"
+ follows="left|top"
+ min_height="300"
+ layout="topleft"
+ top="0"
+ background_visible="false"
+ height="950"
+ left="0"
+ width="1250">
<texture_picker
height="143"
label="Hair"
layout="topleft"
left="10"
name="hair-baked"
- top="47"
+ top="17"
width="128" />
<texture_picker
height="143"
@@ -74,7 +95,7 @@
layout="topleft"
left="10"
name="head-baked"
- top="197"
+ top="167"
width="128" />
<texture_picker
height="143"
@@ -107,7 +128,7 @@
layout="topleft"
left="10"
name="eyes-baked"
- top="347"
+ top="317"
width="128" />
<texture_picker
height="143"
@@ -132,7 +153,7 @@
layout="topleft"
left="10"
name="upper-baked"
- top="497"
+ top="467"
width="128" />
<texture_picker
height="143"
@@ -197,7 +218,7 @@
layout="topleft"
left="10"
name="lower-baked"
- top="647"
+ top="617"
width="128" />
<texture_picker
height="143"
@@ -270,7 +291,7 @@
layout="topleft"
left="10"
name="skirt-baked"
- top="797"
+ top="767"
width="128" />
<texture_picker
height="143"
@@ -280,5 +301,6 @@
name="skirt"
top_delta="0"
width="128" />
-
+</panel>
+</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml
index 1c83799e72..4fc2b698d8 100644
--- a/indra/newview/skins/default/xui/en/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/en/floater_beacons.xml
@@ -8,7 +8,7 @@
save_rect="true"
save_visibility="true"
single_instance="true"
- title="Beacons"
+ title="BEACONS"
width="240">
<panel
follows="left|top|right|bottom"
@@ -25,7 +25,7 @@
name="label_show"
text_color="White"
type="string">
- Show:
+ Show :
</text>
<check_box
control_name="renderbeacons"
@@ -117,6 +117,7 @@
<check_box
control_name="soundsbeacon"
height="16"
+ left="0"
label="Sound sources"
layout="topleft"
name="sounds" >
diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml
index bddbbdd3b2..56230e912c 100644
--- a/indra/newview/skins/default/xui/en/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_build_options.xml
@@ -7,7 +7,7 @@
name="build options floater"
help_topic="build_options_floater"
save_rect="true"
- title="Grid Options"
+ title="GRID OPTIONS"
width="264">
<spinner
control_name="GridResolution"
@@ -15,14 +15,14 @@
height="23"
initial_value="1"
label="Grid Units (meters)"
- label_width="130"
+ label_width="160"
layout="topleft"
left="10"
max_val="5"
min_val="0.01"
name="GridResolution"
top="25"
- width="200" />
+ width="230" />
<spinner
control_name="GridDrawSize"
decimal_digits="1"
@@ -31,14 +31,14 @@
increment="0.5"
initial_value="5"
label="Grid Extents (meters)"
- label_width="130"
+ label_width="160"
layout="topleft"
left_delta="0"
max_val="50"
min_val="1"
name="GridDrawSize"
top_pad="0"
- width="200" />
+ width="230" />
<check_box
control_name="GridSubUnit"
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
index 02958bee74..d007ceff98 100644
--- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
@@ -6,7 +6,7 @@
layout="topleft"
name="floaterbulkperms"
help_topic="floaterbulkperms"
- title="Edit Content Permissions"
+ title="EDIT CONTENT PERMISSIONS"
width="270">
<floater.string
name="nothing_to_modify_text">
@@ -154,7 +154,7 @@
image_name="Inv_Texture"
mouse_opaque="true"
name="icon_texture"
- tool_top="Textures"
+ tool_tip="Textures"
left_pad="2" />
<button
@@ -287,7 +287,7 @@
<button
follows="left|top"
height="23"
- label="Ok"
+ label="OK"
layout="topleft"
left="65"
name="apply"
diff --git a/indra/newview/skins/default/xui/en/floater_bumps.xml b/indra/newview/skins/default/xui/en/floater_bumps.xml
index 2917096f3c..303c28d7c8 100644
--- a/indra/newview/skins/default/xui/en/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/en/floater_bumps.xml
@@ -6,7 +6,7 @@
name="floater_bumps"
help_topic="floater_bumps"
save_rect="true"
- title="Bumps, Pushes &amp; Hits"
+ title="BUMPS, PUSHES &amp; HITS"
width="400">
<floater.string
name="none_detected">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index aacc3ad8d0..77a0e9b91b 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -9,7 +9,7 @@
name="floater_buy_contents"
help_topic="floater_buy_contents"
save_rect="true"
- title="Buy Contents"
+ title="BUY CONTENTS"
width="280">
<floater.string
name="no_copy_text">
@@ -56,7 +56,7 @@
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|bottom"
font="SansSerif"
height="16"
layout="topleft"
@@ -68,7 +68,7 @@
Buy for L$[AMOUNT] from [NAME]?
</text>
<check_box
- follows="left|top"
+ follows="left|bottom"
height="16"
label="Wear clothing now"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 26d5d4bedf..961bd6b5e4 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -4,10 +4,10 @@
can_minimize="false"
height="275"
layout="topleft"
+ title="BUY L$"
name="buy currency"
help_topic="buy_linden_dollars"
single_instance="true"
- title="Buy L$"
width="350">
<floater.string
name="buy_currency">
@@ -107,13 +107,14 @@
height="16"
layout="topleft"
top_delta="0"
- left="242"
+ left="217"
name="currency_label"
width="15">
L$
</text>
<line_editor
type="string"
+ max_length="10"
halign="right"
font="SansSerifMedium"
select_on_focus="true"
@@ -123,7 +124,7 @@
label="L$"
left_pad="3"
name="currency_amt"
- width="60">
+ width="85">
1234
</line_editor>
<text
@@ -177,8 +178,8 @@
follows="top|left"
height="16"
halign="right"
- left="150"
- width="170"
+ left="140"
+ width="180"
layout="topleft"
name="buy_action">
[NAME] L$ [PRICE]
@@ -222,7 +223,7 @@
width="300"
height="30"
name="currency_links">
- [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
</text>
<text
type="string"
@@ -304,7 +305,7 @@ Re-enter amount to see the latest exchange rate.
</text>
<text
type="string"
- width="175"
+ width="176"
height="125"
top="60"
left="165"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index 8314549132..98508e5113 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -7,7 +7,7 @@
name="buy land"
help_topic="buy_land"
single_instance="true"
- title="Buy Land"
+ title="BUY LAND"
width="740">
<floater.string
name="can_resell">
@@ -115,7 +115,7 @@ Try selecting a smaller area.
</floater.string>
<floater.string
name="buy_for_US">
- Buy L$ [AMOUNT] for approx. US$ [AMOUNT2],
+ Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT],
</floater.string>
<floater.string
name="parcel_meters">
@@ -173,9 +173,14 @@ supports [AMOUNT2] objects
(no parcel selected)
</floater.string>
<floater.string
- name="buy_currency">
- Buy L$ [LINDENS] for approx. US$ [USD]
- </floater.string>
+ name="icon_PG"
+ value="Parcel_PG_Dark"/>
+ <floater.string
+ name="icon_M"
+ value="Parcel_M_Dark"/>
+ <floater.string
+ name="icon_R"
+ value="Parcel_R_Dark"/>
<text
type="string"
length="1"
@@ -199,9 +204,17 @@ supports [AMOUNT2] objects
left_delta="110"
name="region_name_text"
top_delta="0"
- width="175">
+ use_ellipses="true"
+ width="155">
(unknown)
</text>
+ <icon
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="rating_icon"
+ top_delta="-2"
+ width="18"/>
<text
type="string"
length="1"
@@ -667,7 +680,7 @@ This parcel is 512 m² of land.
name="currency_est"
top="409"
width="178">
- for approx. US$ [AMOUNT2]
+ for approx. [LOCAL_AMOUNT]
</text>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml
index 49ea3f5dd1..f0e5e30010 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml
@@ -10,7 +10,7 @@
help_topic="contents"
save_rect="true"
single_instance="true"
- title="Buy Copy of Object"
+ title="BUY COPY OF OBJECT"
width="280">
<floater.string
name="title_buy_text">
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 1b69418013..2bd8420925 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -2,8 +2,8 @@
<floater
legacy_header_height="18"
can_dock="true"
- can_minimize="false"
- can_close="true"
+ can_minimize="true"
+ can_close="false"
center_horiz="true"
follows="bottom"
height="152"
@@ -12,6 +12,7 @@
help_topic="camera_floater"
save_rect="true"
save_visibility="true"
+ single_instance="true"
width="150">
<floater.string
name="rotate_tooltip">
@@ -34,7 +35,7 @@
mouse_opaque="false"
name="controls"
width="148">
- <joystick_track
+ <joystick_track
follows="top|left"
height="78"
image_selected="Cam_Tracking_In"
@@ -42,7 +43,6 @@
layout="topleft"
left="45"
name="cam_track_stick"
- picture_style="true"
quadrant="left"
scale_image="false"
sound_flags="3"
@@ -50,23 +50,59 @@
top="22"
visible="false"
width="78" />
- <!--TODO: replace with slider, + - images -->
- <joystick_zoom
- follows="top|left"
- height="78"
- image_unselected="ScrollThumb_Vert"
- layout="topleft"
- left="7"
- minus_image="ScrollThumb_Vert"
- name="zoom"
- picture_style="true"
- plus_image="ScrollThumb_Vert"
- quadrant="left"
- scale_image="false"
- sound_flags="3"
- tool_tip="Zoom camera toward focus"
- top="22"
- width="20" />
+ <!--TODO: replace + - images -->
+ <panel
+ border="false"
+ class="camera_zoom_panel"
+ height="94"
+ layout="topleft"
+ left="7"
+ mouse_opaque="false"
+ name="zoom"
+ top="22"
+ width="18">
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="AddItem_Disabled"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ name="zoom_plus_btn"
+ width="18">
+ <commit_callback
+ function="Zoom.plus" />
+ <mouse_held_callback
+ function="Zoom.plus" />
+ </button>
+ <slider_bar
+ height="48"
+ layout="topleft"
+ name="zoom_slider"
+ orientation="vertical"
+ tool_tip="Zoom camera toward focus"
+ top_pad="0"
+ min_val="0"
+ max_val="1"
+ width="18">
+ <commit_callback function="Slider.value_changed"/>
+ </slider_bar>
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="MinusItem_Disabled"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ layout="topleft"
+ name="zoom_minus_btn"
+ top_pad="0"
+ width="18">
+ <commit_callback
+ function="Zoom.minus" />
+ <mouse_held_callback
+ function="Zoom.minus" />
+ </button>
+ </panel>
<joystick_rotate
follows="top|left"
height="78"
@@ -74,8 +110,8 @@
image_unselected="Cam_Rotate_Out"
layout="topleft"
left="45"
+ mouse_opaque="false"
name="cam_rotate_stick"
- picture_style="true"
quadrant="left"
scale_image="false"
sound_flags="3"
@@ -83,70 +119,65 @@
tool_tip="Orbit camera around focus"
top="22"
width="78" />
- <panel
+ <panel
height="78"
layout="topleft"
left="36"
name="camera_presets"
- top="30"
+ top="20"
visible="false"
width="78">
<button
- height="30"
- image_selected="CameraPreset_Rear"
- image_unselected="CameraPreset_Rear"
+ height="40"
+ image_selected="Cam_Preset_Back_On"
+ image_unselected="Cam_Preset_Back_Off"
layout="topleft"
- left="5"
+ left="0"
name="rear_view"
- picture_style="true"
tool_tip="Rear View"
top="2"
- width="30">
+ width="40">
<click_callback
function="CameraPresets.ChangeView"
parameter="rear_view" />
</button>
<button
- height="30"
- image_selected="CameraPreset_3_4"
- image_unselected="CameraPreset_3_4"
+ height="40"
+ image_selected="Cam_Preset_Side_On"
+ image_unselected="Cam_Preset_Side_Off"
layout="topleft"
left_pad="5"
name="group_view"
- picture_style="true"
tool_tip="Group View"
top="2"
- width="30">
+ width="40">
<click_callback
function="CameraPresets.ChangeView"
parameter="group_view" />
</button>
<button
- height="30"
- image_selected="CameraPreset_Front"
- image_unselected="CameraPreset_Front"
+ height="40"
+ image_selected="Cam_Preset_Front_On"
+ image_unselected="Cam_Preset_Front_Off"
layout="topleft"
- left="5"
+ left="0"
name="front_view"
- picture_style="true"
tool_tip="Front View"
top_pad="5"
- width="30">
+ width="40">
<click_callback
function="CameraPresets.ChangeView"
parameter="front_view" />
</button>
<button
- height="30"
- image_selected="CameraPreset_Mouselook"
- image_unselected="CameraPreset_Mouselook"
+ height="40"
+ image_selected="Cam_Preset_Eye_Off"
+ image_unselected="Cam_Preset_Eye_Off"
layout="topleft"
left_pad="5"
name="mouselook_view"
- picture_style="true"
tool_tip="Mouselook View"
- top_pad="-30"
- width="30">
+ width="40">
<click_callback
function="CameraPresets.ChangeView"
parameter="mouselook_view" />
@@ -172,7 +203,6 @@
name="orbit_btn"
tab_stop="false"
tool_tip="Orbit camera"
- value="true"
width="25">
</button>
<button
diff --git a/indra/newview/skins/default/xui/en/floater_choose_group.xml b/indra/newview/skins/default/xui/en/floater_choose_group.xml
index 8b34fda96c..dc1ee5f24e 100644
--- a/indra/newview/skins/default/xui/en/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/en/floater_choose_group.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="groups"
help_topic="groups"
- title="Groups"
+ title="GROUPS"
width="280">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml
index 686b8dc40f..2fa112af8c 100644
--- a/indra/newview/skins/default/xui/en/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml
@@ -7,26 +7,25 @@
layout="topleft"
name="ColorPicker"
help_topic="colorpicker"
- title="Color Picker"
+ title="COLOR PICKER"
width="440">
<text
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="r_val_text"
- top="35"
+ top="25"
width="413">
Red:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="128"
layout="topleft"
@@ -39,20 +38,18 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="g_val_text"
- top="56"
width="413">
Green:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="128"
layout="topleft"
@@ -65,20 +62,18 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="b_val_text"
- top="77"
width="413">
Blue:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="128"
layout="topleft"
@@ -91,20 +86,18 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="h_val_text"
- top="108"
width="413">
Hue:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="180"
layout="topleft"
@@ -117,20 +110,18 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="s_val_text"
- top="129"
width="413">
Sat:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="50"
layout="topleft"
@@ -143,20 +134,18 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="10"
+ height="20"
layout="topleft"
- left="12"
+ left="10"
mouse_opaque="false"
name="l_val_text"
- top="150"
width="413">
Lum:
</text>
<spinner
decimal_digits="0"
follows="left"
- height="16"
+ height="20"
increment="1"
initial_value="50"
layout="topleft"
@@ -168,36 +157,39 @@
<check_box
follows="left|bottom"
height="20"
- label="Apply Now"
+ label="Apply now"
layout="topleft"
- left="12"
+ left="10"
name="apply_immediate"
top_pad="185"
width="100" />
<button
- follows="left|top"
- height="32"
+ follows="left|bottom"
+ height="28"
+ image_selected="eye_button_active.tga"
+ image_unselected="eye_button_inactive.tga"
layout="topleft"
- left_pad="30"
+ left_pad="50"
name="color_pipette"
- picture_style="true"
- width="32" />
+ width="28" />
<button
follows="right|bottom"
- height="20"
- label="Ok"
- label_selected="Select"
+ height="23"
+ label="OK"
+ label_selected="OK"
layout="topleft"
- left_pad="50"
+ right="-120"
+ top_delta="9"
name="select_btn"
width="100" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
label_selected="Cancel"
layout="topleft"
left_pad="5"
+ right="-10"
name="cancel_btn"
width="100" />
<text
@@ -206,7 +198,7 @@
follows="left|top"
height="16"
layout="topleft"
- left="12"
+ left="10"
name="Current color:"
top="172"
width="110">
@@ -218,7 +210,7 @@
follows="left|top"
height="16"
layout="topleft"
- left="12"
+ left="10"
name="(Drag below to save.)"
top_pad="66"
width="130">
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 07d76f4810..b048eeceb6 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -3,38 +3,50 @@
legacy_header_height="18"
can_minimize="false"
follows="left|top"
- height="540"
+ height="583"
layout="topleft"
left_delta="-3"
name="floater customize"
help_topic="floater_customize"
save_rect="true"
- title="Appearance"
+ title="APPEARANCE"
top_delta="-185"
- width="494">
+ width="524">
<tab_container
- height="483"
+ height="517"
layout="topleft"
- left="0"
+ left="10"
name="customize tab container"
tab_min_width="96"
tab_position="left"
- top="24"
- width="492">
- <placeholder
- label="Body Parts"
- layout="topleft"
- name="body_parts_placeholder" />
+ tab_height="50"
+ top="26"
+ width="506">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="5"
+ name="body_parts_placeholder"
+ font="SansSerifSmallBold"
+ top="10"
+ width="100">
+ Body Parts
+ </text>
+ <placeholder />
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Shape"
layout="topleft"
- left_delta="0"
name="Shape"
- top_delta="0"
- width="389">
+ help_topic="customize_shape_tab"
+ width="400">
<icon
follows="top|right"
height="18"
@@ -47,143 +59,131 @@
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left="299"
+ right="390"
name="Revert"
- top="458"
+ top="477"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Body"
label_selected="Body"
layout="topleft"
- left="8"
+ left="10"
name="Body"
- top="65"
+ top="63"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Head"
label_selected="Head"
layout="topleft"
left_delta="0"
name="Head"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Eyes"
label_selected="Eyes"
layout="topleft"
left_delta="0"
name="Eyes"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Ears"
label_selected="Ears"
layout="topleft"
left_delta="0"
name="Ears"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Nose"
label_selected="Nose"
layout="topleft"
left_delta="0"
name="Nose"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Mouth"
label_selected="Mouth"
layout="topleft"
left_delta="0"
name="Mouth"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Chin"
label_selected="Chin"
layout="topleft"
left_delta="0"
name="Chin"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Torso"
label_selected="Torso"
layout="topleft"
left_delta="0"
name="Torso"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Legs"
label_selected="Legs"
layout="topleft"
left_delta="0"
name="Legs"
- top_pad="16"
+ top_pad="4"
width="82" />
<radio_group
control_name="AvatarSex"
height="34"
layout="topleft"
- left_delta="0"
name="sex radio"
- top_pad="16"
+ top_pad="10"
width="82">
<radio_item
height="16"
label="Female"
layout="topleft"
- left="1"
name="radio"
- top="1"
+ value="0"
width="82" />
<radio_item
height="16"
label="Male"
layout="topleft"
- left_delta="0"
name="radio2"
- top_delta="16"
+ value="1"
width="82" />
</radio_group>
<text
@@ -193,9 +193,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left="26"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -206,9 +206,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -219,9 +219,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -232,9 +232,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -242,11 +242,11 @@
type="string"
length="1"
follows="left|top"
- height="14"
+ height="16"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -256,13 +256,12 @@
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new shape by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new shape by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -270,67 +269,69 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Shape:
</text>
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Shape"
label_selected="Create New Shape"
layout="topleft"
- left="8"
+ left="10"
name="Create New"
top="104"
- width="120" />
+ width="160" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
name="Save"
- top="458"
+ right="218"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
name="Save As"
- top_delta="0"
+ top="477"
+ right="304"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Skin"
layout="topleft"
- left_delta="0"
name="Skin"
- top_delta="0"
- width="389">
+ help_topic="customize_skin_tab"
+ width="400">
<icon
follows="top|right"
height="18"
@@ -343,54 +344,50 @@ scratch and wear it.
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Skin Color"
label_selected="Skin Color"
layout="topleft"
- left_delta="0"
+ left="10"
name="Skin Color"
- top_pad="41"
+ top="63"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Face Detail"
label_selected="Face Detail"
layout="topleft"
left_delta="0"
name="Face Detail"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Makeup"
label_selected="Makeup"
layout="topleft"
left_delta="0"
name="Makeup"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Body Detail"
label_selected="Body Detail"
layout="topleft"
left_delta="0"
name="Body Detail"
- top_pad="16"
+ top_pad="4"
width="82" />
<text
type="string"
@@ -399,9 +396,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="26"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -412,9 +409,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -425,9 +422,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -438,9 +435,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -450,9 +447,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -462,13 +459,12 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new skin by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new skin by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -476,23 +472,24 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Skin:
</text>
@@ -501,91 +498,92 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Head Tattoos"
layout="topleft"
- left="8"
+ left="10"
name="Head Tattoos"
tool_tip="Click to choose a picture"
- top="193"
- width="74" />
+ top="176"
+ width="82" />
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Upper Tattoos"
layout="topleft"
left_delta="0"
name="Upper Tattoos"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="74" />
+ top_delta="102"
+ width="82" />
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Lower Tattoos"
layout="topleft"
left_delta="0"
name="Lower Tattoos"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="74" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Skin"
label_selected="Create New Skin"
layout="topleft"
left_delta="0"
name="Create New"
top_delta="-249"
- width="120" />
+ width="160" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Hair"
layout="topleft"
- left_delta="0"
name="Hair"
- top_delta="0"
- width="389">
+ help_topic="customize_hair_tab"
+ width="400">
<icon
follows="top|right"
height="18"
@@ -598,54 +596,48 @@ scratch and wear it.
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Color"
label_selected="Color"
layout="topleft"
- left_delta="0"
+ left="10"
name="Color"
- top_pad="41"
+ top="63"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Style"
label_selected="Style"
layout="topleft"
left_delta="0"
name="Style"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Eyebrows"
label_selected="Eyebrows"
layout="topleft"
- left_delta="0"
name="Eyebrows"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="16"
+ height="23"
label="Facial"
label_selected="Facial"
layout="topleft"
- left_delta="0"
name="Facial"
- top_pad="16"
+ top_pad="4"
width="82" />
<text
type="string"
@@ -654,9 +646,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="26"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -667,9 +659,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -680,9 +672,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -693,9 +685,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -705,9 +697,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -717,13 +709,12 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new hair by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new hair by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -731,23 +722,24 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Hair:
</text>
@@ -755,65 +747,66 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Texture"
layout="topleft"
- left="8"
+ left="10"
name="Texture"
tool_tip="Click to choose a picture"
- top="193"
- width="64" />
+ top="176"
+ width="82" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Hair"
label_selected="Create New Hair"
layout="topleft"
left_delta="0"
name="Create New"
top_delta="-89"
- width="120" />
+ width="160" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Eyes"
layout="topleft"
- left_delta="0"
name="Eyes"
- top_delta="0"
- width="389">
+ help_topic="customize_eyes_tab"
+ width="400">
<icon
follows="top|right"
height="18"
@@ -826,10 +819,10 @@ scratch and wear it.
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<text
type="string"
@@ -838,9 +831,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -851,9 +844,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -864,9 +857,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -877,21 +870,21 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
<text
type="string"
length="1"
- follows="left|top|right"
- height="14"
+ follows="left|top"
+ height="16"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -901,13 +894,12 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new eyes by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new set of eyes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -915,23 +907,24 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Eyes:
</text>
@@ -939,159 +932,166 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Iris"
layout="topleft"
- left="8"
+ left="10"
name="Iris"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Eyes"
label_selected="Create New Eyes"
layout="topleft"
- left_delta="0"
name="Create New"
- top_delta="39"
- width="120" />
+ top="66"
+ width="160" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
- <placeholder
- label="Clothes"
- layout="topleft"
- name="clothes_placeholder" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="5"
+ name="clothes_placeholder"
+ font="SansSerifSmallBold"
+ top="125"
+ width="100">
+ Clothes
+ </text>
+ <placeholder />
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Shirt"
layout="topleft"
- left_delta="0"
name="Shirt"
+ help_topic="customize_shirt_tab"
top_delta="0"
- width="389">
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left_delta="0"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top_pad="41"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Shirt"
- label_selected="Create New Shirt"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="120" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
+ follows="left|top"
+ height="23"
+ label="Create New Shirt"
+ label_selected="Create New Shirt"
+ layout="topleft"
+ name="Create New"
+ top="66"
+ width="160" />
+ <button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
<text
type="string"
@@ -1100,9 +1100,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="26"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -1113,9 +1113,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -1126,9 +1126,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -1139,21 +1139,21 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
<text
type="string"
length="1"
- follows="left|top|right"
- height="14"
+ follows="left|top"
+ height="16"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -1163,13 +1163,12 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new shirt by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new shirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -1177,127 +1176,125 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Shirt:
</text>
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Pants"
layout="topleft"
- left_delta="0"
name="Pants"
- top_delta="0"
- width="389">
+ help_topic="customize_pants_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left_delta="0"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top_pad="41"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Pants"
- label_selected="Create New Pants"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="120" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
+ follows="left|top"
+ height="23"
+ label="Create New Pants"
+ label_selected="Create New Pants"
+ layout="topleft"
+ name="Create New"
+ top="66"
+ width="160" />
+ <button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
<text
type="string"
@@ -1306,9 +1303,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="26"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -1319,9 +1316,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -1332,9 +1329,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -1345,9 +1342,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -1357,9 +1354,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -1369,13 +1366,12 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new pants by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on new pants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
<text
type="string"
@@ -1383,53 +1379,55 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Pants:
</text>
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Shoes"
layout="topleft"
- left_delta="0"
name="Shoes"
- top_delta="0"
- width="389">
+ help_topic="customize_shoes_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -1438,9 +1436,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -1451,9 +1449,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -1464,9 +1462,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -1477,9 +1475,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -1489,9 +1487,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -1501,37 +1499,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new shoes by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new pair of shoes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Shoes"
+ label_selected="Create New Shoes"
+ layout="topleft"
+ name="Create New"
+ top_pad="18"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Shoes:
</text>
@@ -1539,103 +1546,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Shoes"
- label_selected="Create New Shoes"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="120" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Socks"
layout="topleft"
- left_delta="0"
name="Socks"
- top_delta="0"
- width="389">
+ help_topic="customize_socks_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -1644,9 +1639,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -1657,9 +1652,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -1670,9 +1665,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -1683,9 +1678,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -1695,9 +1690,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -1707,37 +1702,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new socks by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on new socks by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Socks"
+ label_selected="Create New Socks"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Socks:
</text>
@@ -1745,103 +1749,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Socks"
- label_selected="Create New Socks"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="120" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Jacket"
layout="topleft"
- left_delta="0"
name="Jacket"
- top_delta="0"
- width="389">
+ help_topic="customize_jacket_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -1850,9 +1842,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -1863,9 +1855,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -1876,9 +1868,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -1889,9 +1881,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -1901,9 +1893,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -1913,37 +1905,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new jacket by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new jacket by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Jacket"
+ label_selected="Create New Jacket"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Jacket:
</text>
@@ -1951,115 +1952,102 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Upper Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Upper Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Lower Fabric"
layout="topleft"
- left_delta="0"
name="Lower Fabric"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="64" />
+ top_delta="102"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Jacket"
- label_selected="Create New Jacket"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-121"
- width="140" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="182"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Gloves"
layout="topleft"
- left_delta="0"
name="Gloves"
- top_delta="0"
- width="389">
+ help_topic="customize_gloves_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -2068,9 +2056,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -2081,9 +2069,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -2094,9 +2082,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -2107,9 +2095,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -2119,9 +2107,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -2131,37 +2119,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new gloves by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on new gloves by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Gloves"
+ label_selected="Create New Gloves"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Gloves:
</text>
@@ -2169,103 +2166,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Gloves"
- label_selected="Create New Gloves"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="130" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Undershirt"
layout="topleft"
- left_delta="0"
name="Undershirt"
- top_delta="0"
- width="389">
+ help_topic="customize_undershirt_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -2274,9 +2259,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -2287,9 +2272,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -2300,9 +2285,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -2313,9 +2298,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -2325,9 +2310,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -2337,37 +2322,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new undershirt by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new undershirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Undershirt"
+ label_selected="Create New Undershirt"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Undershirt:
</text>
@@ -2375,103 +2369,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Undershirt"
- label_selected="Create New Undershirt"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="160" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Underpants"
layout="topleft"
- left_delta="0"
name="Underpants"
- top_delta="0"
- width="389">
+ help_topic="customize_underpants_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -2480,9 +2462,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -2493,9 +2475,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -2506,9 +2488,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -2519,9 +2501,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -2531,9 +2513,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -2543,37 +2525,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new underpants by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on new underpants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Underpants"
+ label_selected="Create New Underpants"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Underpants:
</text>
@@ -2581,103 +2572,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Underpants"
- label_selected="Create New Underpants"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="160" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Skirt"
layout="topleft"
- left_delta="0"
name="Skirt"
- top_delta="0"
- width="389">
+ help_topic="customize_skirt_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -2686,9 +2665,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -2699,9 +2678,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -2712,9 +2691,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -2725,9 +2704,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -2737,9 +2716,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -2749,37 +2728,46 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new skirt by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new skirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Skirt"
+ label_selected="Create New Skirt"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Skirt:
</text>
@@ -2787,103 +2775,91 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Fabric"
layout="topleft"
- left="8"
+ left="10"
name="Fabric"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
- height="80"
+ height="108"
label="Color/Tint"
layout="topleft"
- left_delta="0"
name="Color/Tint"
tool_tip="Click to open color picker"
- top_delta="80"
- width="64" />
- <button
- follows="left|top"
- height="24"
- label="Create New Skirt"
- label_selected="Create New Skirt"
- layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-41"
- width="120" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="0"
name="Take Off"
- top_pad="102"
+ top_pad="4"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
- label="Alpha"
+ height="508"
+ label="Tattoo"
layout="topleft"
- left_delta="0"
- name="Alpha"
- top_delta="0"
- width="389">
+ name="Tattoo"
+ help_topic="customize_tattoo_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -2892,9 +2868,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -2905,9 +2881,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -2918,9 +2894,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -2931,9 +2907,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -2943,9 +2919,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -2955,222 +2931,151 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="-2"
+ left="10"
name="not worn instructions"
- top_delta="2"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new alpha mask by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new tattoo by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Tattoo"
+ label_selected="Create New Tattoo"
+ layout="topleft"
+ name="Create New"
+ top_pad="7"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="119"
+ right="132"
width="100">
- Alpha:
+ Tattoo:
</text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Lower Alpha"
- layout="topleft"
- left="8"
- name="Lower Alpha"
- tool_tip="Click to choose a picture"
- top="65"
- width="64" />
- <check_box
- control_name="LowerAlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="lower alpha texture invisible"
- top_delta="4"
- width="16" />
- <texture_picker
- can_apply_immediately="true"
- default_image_name="Default"
- follows="left|top"
- height="80"
- label="Upper Alpha"
- layout="topleft"
- left="8"
- name="Upper Alpha"
- tool_tip="Click to choose a picture"
- top="145"
- width="64" />
- <check_box
- control_name="UpperAlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="upper alpha texture invisible"
- top_delta="4"
- width="16" />
- <texture_picker
- can_apply_immediately="true"
- default_image_name="Default"
- follows="left|top"
- height="80"
- label="Head Alpha"
+ height="108"
+ label="Head Tattoo"
layout="topleft"
- left="8"
- name="Head Alpha"
+ left="10"
+ name="Head Tattoo"
tool_tip="Click to choose a picture"
- top="225"
- width="64" />
- <check_box
- control_name="HeadAlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="head alpha texture invisible"
- top_delta="4"
- width="16" />
+ top="66"
+ width="82" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Eye Alpha"
+ height="108"
+ label="Upper Tattoo"
layout="topleft"
- left="8"
- name="Eye Alpha"
+ name="Upper Tattoo"
tool_tip="Click to choose a picture"
- top="305"
- width="64" />
- <check_box
- control_name="Eye AlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="eye alpha texture invisible"
- top_delta="4"
- width="16" />
+ left_delta="90"
+ width="82" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Hair Alpha"
+ height="108"
+ label="Lower Tattoo"
layout="topleft"
- left="8"
- name="Hair Alpha"
+ name="Lower Tattoo"
tool_tip="Click to choose a picture"
- top="385"
- width="64" />
- <check_box
- control_name="HairAlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="hair alpha texture invisible"
- top_delta="4"
- width="16" />
- <button
- follows="left|top"
- height="24"
- label="Create New Alpha"
- label_selected="Create New Alpha"
- layout="topleft"
- left="8"
- name="Create New"
- top="104"
- width="120" />
+ left_delta="90"
+ width="82" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="-4"
name="Take Off"
- top_pad="332"
+ top_pad="4"
+ left="10"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left_pad="37"
+ right="218"
name="Save"
- top_delta="-2"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
- label="Tattoo"
+ height="508"
+ label="Alpha"
layout="topleft"
- left_delta="0"
- name="Tattoo"
- top_delta="0"
- width="389">
+ name="Alpha"
+ help_topic="customize_alpha_tab"
+ width="400">
<icon
- follows="top|right"
+ follows="top|left"
height="18"
image_name="Lock"
layout="topleft"
- left="315"
+ left="10"
mouse_opaque="true"
name="square"
- top="4"
+ top="10"
width="18" />
<icon
height="16"
layout="topleft"
- left_delta="-325"
+ left="10"
mouse_opaque="true"
- top_delta="3"
+ top="10"
width="16" />
<text
type="string"
@@ -3179,9 +3084,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_pad="2"
+ left="31"
name="title"
- top_delta="0"
+ top="10"
width="355">
[DESC]
</text>
@@ -3192,9 +3097,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -3205,9 +3110,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -3218,9 +3123,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -3230,9 +3135,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -3242,136 +3147,198 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="-2"
+ left="10"
name="not worn instructions"
- top_delta="2"
+ top="31"
+ word_wrap="true"
width="373">
- Put on a new tattoo by dragging one from your inventory
-to your avatar. Alternately, you create a new one from
-scratch and wear it.
+ Put on a new alpha mask by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it.
</text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Create New Alpha"
+ label_selected="Create New Alpha"
+ layout="topleft"
+ name="Create New"
+ top_pad="18"
+ width="160" />
<text
type="string"
length="1"
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="no modify instructions"
- top_delta="0"
+ top="31"
+ word_wrap="true"
width="373">
You do not have permission to modify this wearable.
</text>
<text
type="string"
length="1"
- bottom="486"
- follows="left|top|right"
+ bottom="4"
+ follows="left|bottom|right"
font="SansSerif"
halign="right"
- height="28"
- layout="topleft"
+ height="23"
+ layout="bottomleft"
name="Item Action Label"
- right="119"
+ right="132"
width="100">
- Tattoo:
+ Alpha:
</text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Head Tattoo"
+ height="108"
+ label="Lower Alpha"
layout="topleft"
- left="8"
- name="Head Tattoo"
+ left="10"
+ name="Lower Alpha"
tool_tip="Click to choose a picture"
- top="65"
- width="64" />
+ top="66"
+ width="82" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Upper Tattoo"
+ height="108"
+ label="Upper Alpha"
layout="topleft"
- left_delta="0"
- name="Upper Tattoo"
+ name="Upper Alpha"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="64" />
+ left_delta="90"
+ width="82" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
- label="Lower Tattoo"
+ height="108"
+ label="Head Alpha"
layout="topleft"
- left_delta="0"
- name="Lower Tattoo"
+ name="Head Alpha"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="64" />
- <button
+ left_delta="90"
+ width="82" />
+ <check_box
+ control_name="LowerAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left="43"
+ name="lower alpha texture invisible"
+ top_delta="96"
+ width="16" />
+ <check_box
+ control_name="UpperAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="72"
+ name="upper alpha texture invisible"
+ width="16" />
+ <check_box
+ control_name="HeadAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="72"
+ name="head alpha texture invisible"
+ width="16" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
follows="left|top"
- height="24"
- label="Create New Tattoo"
- label_selected="Create New Tattoo"
+ height="108"
+ label="Eye Alpha"
layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-121"
- width="120" />
+ name="Eye Alpha"
+ tool_tip="Click to choose a picture"
+ left="10"
+ top_pad="20"
+ width="82" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="108"
+ label="Hair Alpha"
+ layout="topleft"
+ name="Hair Alpha"
+ left_delta="90"
+ tool_tip="Click to choose a picture"
+ width="82" />
+ <check_box
+ control_name="Eye AlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left="43"
+ name="eye alpha texture invisible"
+ top_delta="96"
+ width="16" />
+ <check_box
+ control_name="HairAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left_pad="72"
+ name="hair alpha texture invisible"
+ width="16" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
- left_delta="-4"
name="Take Off"
- top_pad="332"
+ left="10"
+ top_pad="20"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left_pad="37"
+ right="218"
name="Save"
- top_delta="-2"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
</tab_container>
<scroll_container
follows="left|top|right|bottom"
- height="382"
+ height="409"
layout="topleft"
- left="197"
+ left="211"
mouse_opaque="false"
name="panel_container"
- top="94"
+ top="92"
width="292">
<scrolling_panel_list
follows="left|bottom"
@@ -3379,9 +3346,30 @@ scratch and wear it.
name="panel_list" />
</scroll_container>
<button
- bottom="536"
+ bottom="460"
+ follows="right|left"
+ height="23"
+ label="Script Info"
+ label_selected="Script Info"
+ layout="topleft"
+ name="script_info"
+ tool_tip="Show scripts attached to your avatar"
+ left="13"
+ width="90" />
+ <button
+ bottom="574"
+ follows="right|bottom"
+ height="23"
+ label="Make Outfit"
+ label_selected="Make Outfit"
+ layout="topleft"
+ name="make_outfit_btn"
+ right="-218"
+ width="100" />
+ <button
+ bottom="574"
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
label_selected="Cancel"
layout="topleft"
@@ -3389,13 +3377,13 @@ scratch and wear it.
right="-10"
width="100" />
<button
- bottom="536"
+ bottom="574"
follows="right|bottom"
- height="20"
+ height="23"
label="OK"
label_selected="OK"
layout="topleft"
name="Ok"
- right="-116"
+ right="-114"
width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
index b8fa104352..8c5af2283d 100644
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
@@ -6,7 +6,7 @@
name="Day Cycle Floater"
help_topic="day_cycle_floater"
save_rect="true"
- title="Day Cycle Editor"
+ title="DAY CYCLE EDITOR"
width="646">
<tab_container
follows="left|top"
@@ -28,16 +28,6 @@
name="Day Cycle"
top="0"
width="642">
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="15"
- label="?"
- layout="topleft"
- left="612"
- name="WLDayCycleHelp"
- top="3"
- width="18" />
<multi_slider
can_edit_text="true"
control_name="WLTimeSlider"
@@ -75,11 +65,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left="8"
name="WL12am"
@@ -90,11 +78,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL3am"
@@ -105,11 +91,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL6am"
@@ -120,11 +104,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL9amHash"
@@ -135,11 +117,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL12pmHash"
@@ -150,11 +130,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL3pm"
@@ -165,11 +143,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL6pm"
@@ -180,11 +156,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL9pm"
@@ -195,11 +169,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12am2"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL12am2"
@@ -210,9 +182,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12amHash"
follows="left|top|right"
font="SansSerif"
height="14"
@@ -220,135 +190,119 @@
left="20"
name="WL12amHash"
top="54"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3amHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL3amHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6amHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL6amHash"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9amHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL9amHash2"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12pmHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL12pmHash2"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3pmHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL3pmHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6pmHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL6pmHash"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9pmHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL9pmHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12amHash2"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL12amHash2"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<button
@@ -356,9 +310,9 @@
label="Add Key"
label_selected="Add Key"
layout="topleft"
- left="550"
+ left="555"
name="WLAddKey"
- top="20"
+ top="30"
width="80" />
<button
height="20"
@@ -372,9 +326,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -388,9 +340,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -434,9 +384,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WLCurKeyTimeText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -466,9 +414,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -491,9 +437,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -552,9 +496,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -570,7 +512,7 @@
label="Play"
label_selected="Play"
layout="topleft"
- left_delta="0"
+ left_delta="60"
name="WLAnimSky"
top_pad="5"
width="50" />
@@ -591,7 +533,7 @@
left_pad="5"
name="WLUseLindenTime"
top_delta="0"
- width="140" />
+ width="150" />
<button
height="20"
label="Save Test Day"
diff --git a/indra/newview/skins/default/xui/en/floater_device_settings.xml b/indra/newview/skins/default/xui/en/floater_device_settings.xml
index 2b23980423..91a7a678da 100644
--- a/indra/newview/skins/default/xui/en/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_device_settings.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="260"
layout="topleft"
name="floater_device_settings"
help_topic="floater_device_settings"
- title="Voice Chat Device Settings"
+ title="VOICE CHAT DEVICE SETTINGS"
width="405">
<panel
bottom="260"
diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml
index 7c22311f66..8c87bd42dd 100644
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml
@@ -6,7 +6,7 @@
name="Environment Editor Floater"
help_topic="environment_editor_floater"
save_rect="true"
- title="Environment Editor"
+ title="ENVIRONMENT EDITOR"
width="600">
<floater.string
name="timeStr">
@@ -98,7 +98,6 @@
Water Color
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.5 0.5 0.5 1"
follows="left|top"
@@ -136,7 +135,6 @@
width="210" />
<button
follows="left|top"
- font="SansSerifSmall"
height="20"
label="Use Estate Time"
layout="topleft"
@@ -146,7 +144,6 @@
width="137" />
<button
follows="left|top"
- font="SansSerifSmall"
height="20"
label="Advanced Sky"
layout="topleft"
@@ -156,7 +153,6 @@
width="137" />
<button
follows="left|top"
- font="SansSerifSmall"
height="20"
label="Advanced Water"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
new file mode 100644
index 0000000000..50f0f0454c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="350"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ title="EVENT DETAILS"
+ width="330">
+ <floater.string
+ name="none">
+ none
+ </floater.string>
+ <floater.string
+ name="notify">
+ Notify
+ </floater.string>
+ <floater.string
+ name="dont_notify">
+ Don&apos;t Notify
+ </floater.string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="350"
+ width="330"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="305"
+ width="330">
+ <text
+ follows="top|left|right"
+ font="SansSerifLarge"
+ text_color="white"
+ height="17"
+ layout="topleft"
+ left="10"
+ name="event_name"
+ top="5"
+ use_ellipses="true"
+ width="310">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ height="13"
+ text_color="LtGray_50"
+ layout="topleft"
+ left="25"
+ name="event_category"
+ width="300">
+ (no category)
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="7"
+ name="event_runby_label"
+ width="310">
+ Run by:
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left="10"
+ link="true"
+ name="event_runby"
+ top_pad="2"
+ use_ellipses="true"
+ width="310" />
+ <text
+ type="string"
+ length="1"
+ left="10"
+ height="17"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ top_pad="5"
+ follows="top|left"
+ layout="topleft"
+ name="event_date"
+ width="310">
+ 10/10/2010
+ </text>
+ <text
+ type="string"
+ height="14"
+ length="1"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_duration"
+ width="310">
+ 1 hour
+ </text>
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="event_cover"
+ visible="true"
+ width="310">
+ Free
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_location_label">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ height="20"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_location"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="310" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="12"
+ name="rating_label"
+ top_delta="3"
+ value="Rating:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="rating_value"
+ top_delta="0"
+ value="unknown"
+ width="200" />
+ <expandable_text
+ follows="left|top|right"
+ height="106"
+ layout="topleft"
+ left="6"
+ name="event_desc"
+ width="313" />
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_panel"
+ top="0"
+ left="0"
+ user_resize="false">
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left="6"
+ name="create_event_btn"
+ picture_style="true"
+ tool_tip="Create Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ image_disabled="MinusItem_Disabled"
+ layout="topleft"
+ visible="false"
+ left="6"
+ top_pad="-7"
+ name="god_delete_event_btn"
+ picture_style="true"
+ tool_tip="Delete Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Notify Me"
+ layout="topleft"
+ left_pad="3"
+ top_delta="-12"
+ name="notify_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left_pad="5"
+ name="teleport_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left_pad="5"
+ name="map_btn"
+ width="85" />
+ </layout_panel>
+ </layout_stack>
+ </floater>
+
diff --git a/indra/newview/skins/default/xui/en/floater_font_test.xml b/indra/newview/skins/default/xui/en/floater_font_test.xml
index 8b14f691d6..3ab19ec9d9 100644
--- a/indra/newview/skins/default/xui/en/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/en/floater_font_test.xml
@@ -8,7 +8,7 @@
min_width="154"
name="contents"
help_topic="contents"
- title="Font Test"
+ title="FONT TEST"
width="500">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 128d518e12..9f5e6828d2 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -5,7 +5,7 @@
height="465"
name="gestures"
help_topic="gestures"
- title="Gestures"
+ title="GESTURES"
background_visible="true"
follows="all"
label="Places"
@@ -21,12 +21,16 @@
name="playing">
(Playing)
</floater.string>
+ <!-- It's used to build new name for gesture created by "Copy" menu item -->
+ <floater.string
+ name="copy_name">Copy of [COPY_NAME]</floater.string>
<scroll_list
bottom_delta="400"
draw_heading="true"
follows="all"
layout="topleft"
left="0"
+ multi_select="true"
top="20"
name="gesture_list">
<scroll_list.columns
@@ -57,19 +61,18 @@
left="0"
name="bottom_panel"
width="313">
- <button
+ <menu_button
follows="bottom|left"
- font="SansSerifBigBold"
- tool_tip="Change sort and view of recent residents list"
height="18"
image_disabled="OptionsMenu_Disabled"
image_selected="OptionsMenu_Press"
image_unselected="OptionsMenu_Off"
layout="topleft"
left="10"
- name="recent_viewsort_btn"
- picture_style="true"
+ menu_filename="menu_gesture_gear.xml"
+ name="gear_btn"
top="5"
+ tool_tip="More options"
width="18" />
<button
follows="bottom|left"
@@ -81,27 +84,38 @@
layout="topleft"
left_pad="5"
name="new_gesture_btn"
- picture_style="true"
tool_tip="Make new gesture"
top_delta="0"
width="18" />
- <button
+ <button
follows="bottom|left"
font="SansSerifBigBold"
+ height="10"
+ image_hover_selected="Activate_Checkmark"
+ image_selected="Activate_Checkmark"
+ image_unselected="Activate_Checkmark"
+ layout="topleft"
+ left_pad="5"
+ name="activate_btn"
+ tool_tip="Activate/Deactivate selected gesture"
+ top="10"
+ width="10" />
+ <button
+ follows="bottom|right"
+ font="SansSerifBigBold"
height="18"
image_selected="TrashItem_Press"
image_unselected="TrashItem_Off"
image_disabled="TrashItem_Disabled"
layout="topleft"
- left_pad="230"
name="del_btn"
- picture_style="true"
+ right="-5"
tool_tip="Delete this gesture"
top_delta="0"
width="18" />
</panel>
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Edit"
layout="topleft"
@@ -110,7 +124,7 @@
top_pad="5"
width="83" />
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Play"
layout="topleft"
@@ -119,7 +133,7 @@
top_delta="0"
width="83" />
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Stop"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index 97cb6e259c..0fac6cd5f1 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="godtools floater"
help_topic="godtools_floater"
- title="God Tools"
+ title="GOD TOOLS"
width="400">
<tab_container
follows="left|top"
@@ -123,7 +123,7 @@
layout="topleft"
left_delta="0"
name="check reset home"
- tool_tip="When resident teleports out, reset their home to the destination position."
+ tool_tip="When Resident teleports out, reset their home to the destination position."
top_pad="4"
width="180">
<check_box.commit_callback
@@ -191,7 +191,6 @@
</check_box>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Bake Terrain"
label_selected="Bake Terrain"
@@ -206,7 +205,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Revert Terrain"
label_selected="Revert Terrain"
@@ -220,7 +218,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Swap Terrain"
label_selected="Swap Terrain"
@@ -419,7 +416,6 @@
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Refresh"
label_selected="Refresh"
@@ -434,7 +430,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Apply"
label_selected="Apply"
@@ -449,7 +444,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Select Region"
label_selected="Select Region"
@@ -464,7 +458,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Autosave now"
label_selected="Autosave now"
@@ -556,7 +549,6 @@
</check_box>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Apply"
label_selected="Apply"
@@ -571,7 +563,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Set Target"
label_selected="Set Target"
@@ -598,7 +589,6 @@
</text>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Delete Target&apos;s Scripted Objects On Others Land"
label_selected="Delete Target&apos;s Scripted Objects On Others Land"
@@ -613,7 +603,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Delete Target&apos;s Scripted Objects On *Any* Land"
label_selected="Delete Target&apos;s Scripted Objects On *Any* Land"
@@ -628,7 +617,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="22"
label="Delete *ALL* Of Target&apos;s Objects"
label_selected="Delete *ALL* Of Target&apos;s Objects"
@@ -643,7 +631,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="20"
label="Get Top Colliders"
label_selected="Get Top Colliders"
@@ -658,7 +645,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="20"
label="Get Top Scripts"
label_selected="Get Top Scripts"
@@ -673,7 +659,6 @@
</button>
<button
follows="top|right"
- font="SansSerifSmall"
height="20"
label="Scripts digest"
label_selected="Scripts digest"
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index cd98f21918..1e2440580e 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="Hardware Settings Floater"
help_topic="hardware_settings_floater"
- title="Hardware Settings"
+ title="HARDWARE SETTINGS"
width="500">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml
index d2fe8d0e6d..214fb6ce54 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -2,68 +2,55 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="400"
+ height="600"
layout="topleft"
- min_height="140"
- min_width="467"
+ min_height="150"
+ min_width="500"
name="floater_help_browser"
help_topic="floater_help_browser"
save_rect="true"
single_instance="true"
- title="Help Browser"
- width="620">
+ title="HELP BROWSER"
+ width="650">
<floater.string
- name="home_page_url">
- http://www.secondlife.com
+ name="loading_text">
+ Loading...
</floater.string>
<floater.string
- name="support_page_url">
- http://support.secondlife.com
+ name="done_text">
</floater.string>
<layout_stack
- bottom="400"
+ bottom="600"
follows="left|right|top|bottom"
layout="topleft"
- left="10"
+ left="5"
name="stack1"
top="20"
- width="600">
+ width="640">
<layout_panel
- height="20"
layout="topleft"
left_delta="0"
- name="external_controls"
top_delta="0"
+ name="external_controls"
user_resize="false"
- width="570">
+ width="620">
<web_browser
- bottom="-10"
+ bottom="-11"
follows="left|right|top|bottom"
layout="topleft"
left="0"
name="browser"
top="0"
- width="570" />
- <button
+ height="610"
+ width="620" />
+ <text
follows="bottom|left"
- height="20"
- label="Open in My Web Browser"
+ height="16"
layout="topleft"
- left_delta="0"
- name="open_browser"
+ left_delta="2"
+ name="status_text"
top_pad="5"
- width="185" />
-<!--
- <button
- follows="bottom|right"
- height="20"
- label="Close"
- layout="topleft"
- left_pad="290"
- name="close"
- top_delta="0"
- width="70" />
--->
+ width="150" />
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml
index 6e8950c49a..99a6a95828 100644
--- a/indra/newview/skins/default/xui/en/floater_hud.xml
+++ b/indra/newview/skins/default/xui/en/floater_hud.xml
@@ -8,7 +8,7 @@
help_topic="floater_hud"
save_rect="true"
save_visibility="true"
- title="Tutorial"
+ title="TUTORIAL"
width="362">
<web_browser
border_visible="false"
diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml
index b6cf05aefc..a21242ffe1 100644
--- a/indra/newview/skins/default/xui/en/floater_im.xml
+++ b/indra/newview/skins/default/xui/en/floater_im.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater
+ legacy_header_height="18"
can_resize="true"
follows="left|bottom"
height="422"
@@ -25,7 +26,7 @@
</multi_floater.string>
<multi_floater.string
name="muted_message">
- You have blocked this resident. Sending a message will automatically unblock them.
+ You have blocked this Resident. Sending a message will automatically unblock them.
</multi_floater.string>
<multi_floater.string
name="generic_request_error">
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
new file mode 100644
index 0000000000..964713adbf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<multi_floater
+ can_close="false"
+ can_minimize="true"
+ can_resize="true"
+ height="390"
+ layout="topleft"
+ name="floater_im_box"
+ help_topic="floater_im_box"
+ save_rect="true"
+ save_visibility="true"
+ single_instance="true"
+ title="CONVERSATIONS"
+ width="392">
+ <tab_container
+ follows="left|right|top|bottom"
+ height="390"
+ layout="topleft"
+ left="1"
+ name="im_box_tab_container"
+ tab_position="bottom"
+ tab_width="64"
+ tab_max_width = "134"
+ tab_height="16"
+ use_custom_icon_ctrl="true"
+ tab_icon_ctrl_pad="2"
+ font_halign="left"
+ use_ellipses="true"
+ top="0"
+ width="390" />
+ <icon
+ color="DefaultShadowLight"
+ enabled="false"
+ follows="left|right|bottom"
+ height="17"
+ image_name="tabarea.tga"
+ layout="bottomleft"
+ left="1"
+ name="im_box_tab_container_icon"
+ bottom="10"
+ width="390" />
+</multi_floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index d9c3ff77d9..d2e5473157 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -2,69 +2,81 @@
<floater
legacy_header_height="18"
background_visible="true"
- follows="left|top|right|bottom"
- height="250"
+ follows="all"
+ height="350"
layout="topleft"
left="0"
name="panel_im"
- help_topic="panel_im"
top="0"
- can_dock="true"
+ can_dock="false"
can_minimize="true"
- visible="true"
- width="365"
+ can_close="true"
+ visible="false"
+ width="360"
can_resize="true"
- min_width="200"
- min_height="150">
- <layout_stack follows="left|top|right|bottom"
- height="235"
- width="365"
- layout="topleft"
- orientation="horizontal"
- name="im_panels"
- top="16"
- left="2">
+ min_width="250"
+ min_height="190">
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="320"
+ width="360"
+ layout="topleft"
+ orientation="horizontal"
+ name="im_panels"
+ top="20"
+ left="0">
<layout_panel
name="panel_im_control_panel"
layout="topleft"
- top_delta="-3"
- width="146"
- height="225"
follows="left"
label="IM Control Panel"
- user_resize="false" />
- <layout_panel height="235"
- width="200"
- left_delta="146"
- top="0"
- user_resize="false">
- <button height="12"
- follows="left|top"
- top="8"
- label="&lt;&lt;"
- layout="topleft"
- width="35"
- name="slide_left_btn" />
- <button height="12"
- follows="left|top"
- top="8"
- label="&gt;&gt;"
- layout="topleft"
- width="35"
- name="slide_right_btn" />
- <chat_history
- length="1"
- follows="left|top|right|bottom"
- font="SansSerif"
- height="185"
- layout="topleft"
- name="chat_history"
- parse_highlights="true"
- allow_html="true"
- width="195">
- </chat_history>
- <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190">
- </line_editor>
+ min_width="115"
+ auto_resize="false"
+ user_resize="true" />
+ <layout_panel
+ left="0"
+ top="0"
+ height="200"
+ width="245"
+ user_resize="true">
+ <button
+ height="20"
+ follows="left|top"
+ top="0"
+ left="2"
+ image_overlay="TabIcon_Open_Off"
+ layout="topleft"
+ width="25"
+ name="slide_left_btn" />
+ <button
+ height="20"
+ follows="left|top"
+ top="0"
+ left="2"
+ image_overlay="TabIcon_Close_Off"
+ width="25"
+ name="slide_right_btn" />
+ <chat_history
+ font="SansSerifSmall"
+ follows="left|right|top|bottom"
+ height="150"
+ name="chat_history"
+ parse_highlights="true"
+ allow_html="true"
+ left="1"
+ width="240">
+ </chat_history>
+ <line_editor
+ bottom="0"
+ follows="left|right|bottom"
+ font="SansSerifSmall"
+ height="20"
+ label="To"
+ layout="bottomleft"
+ name="chat_editor"
+ width="240">
+ </line_editor>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 2562daf4b3..6f8f272128 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -47,9 +47,11 @@
<text
type="string"
length="1"
- bottom_delta="20"
+ bottom_delta="30"
follows="top|left"
- height="15"
+ height="25"
+ width="105"
+ word_wrap="true"
layout="topleft"
name="preview_label">
Preview image as:
@@ -96,7 +98,9 @@
<text
type="string"
length="1"
- bottom="190"
+ bottom="225"
+ height="45"
+ word_wrap="true"
follows="top|left"
layout="topleft"
left="10"
@@ -114,7 +118,7 @@ Try saving image as 24 bit Targa (.tga).
layout="topleft"
left_delta="2"
name="lossless_check"
- top_pad="197"
+ top_pad="162"
width="280" />
<button
follows="bottom|right"
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index dcb93c6e2f..1d67123726 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -4,13 +4,21 @@
can_close="false"
can_minimize="false"
can_tear_off="false"
- height="200"
+ height="125"
layout="topleft"
name="incoming call"
help_topic="incoming_call"
- title="Unknown Person is calling"
- width="240">
- <floater.string
+ title="UNKNOWN PERSON IS CALLING"
+ width="410">
+ <floater.string
+ name="lifetime">
+ 5
+ </floater.string>
+ <floater.string
+ name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string
name="anonymous">
anonymous
</floater.string>
@@ -22,6 +30,10 @@
name="VoiceInviteAdHoc">
has joined a Voice Chat call with a conference chat.
</floater.string>
+ <floater.string
+ name="VoiceInviteGroup">
+ has joined a Voice Chat call with the group [GROUP].
+ </floater.string>
<avatar_icon
enabled="false"
follows="left|top"
@@ -31,18 +43,37 @@
left_delta="19"
top="35"
width="36" />
- <text_editor
- font="SansSerif"
- height="64"
- border_visible="false"
+ <group_icon
+ enabled="false"
+ follows="left|top"
+ height="36"
+ layout="topleft"
+ top="35"
+ width="36" />
+ <text
+ clip_partial="true"
+ font="SansSerifLarge"
+ height="37"
layout="topleft"
left="77"
- max_length="2147483647"
name="caller name"
- read_only="true"
- top="21"
- width="163"
+ top="20"
+ use_ellipses="true"
+ width="315"
word_wrap="true" />
+ <text
+ clip_partial="true"
+ font="SansSerif"
+ height="30"
+ layout="topleft"
+ left="77"
+ name="question"
+ top_pad="5"
+ use_ellipses="true"
+ width="315"
+ word_wrap="true">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </text>
<button
height="24"
label="Accept"
@@ -57,16 +88,14 @@
label="Reject"
label_selected="Reject"
layout="topleft"
- left_delta="0"
name="Reject"
- top_pad="12"
+ left_pad="10"
width="100" />
<button
height="24"
label="Start IM"
layout="topleft"
- left_delta="0"
name="Start IM"
- top_pad="12"
+ left_pad="10"
width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 9f7723c51b..3f7642fafe 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -9,7 +9,7 @@
name="inspect"
help_topic="inspect"
save_rect="true"
- title="Inspect Objects"
+ title="INSPECT OBJECTS"
width="400">
<floater.string
name="timeStamp">
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index 2011635790..0d381fe5cb 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -11,422 +11,34 @@
help_topic="inventory"
save_rect="true"
save_visibility="true"
- single_instance="true"
- title="Inventory"
+ single_instance="false"
+ title="MY INVENTORY"
width="467">
<floater.string
name="Title">
- Inventory
+ MY INVENTORY
</floater.string>
<floater.string
name="TitleFetching">
- Inventory (Fetching [ITEM_COUNT] Items...) [FILTER]
+ MY INVENTORY (Fetching [ITEM_COUNT] Items...) [FILTER]
</floater.string>
<floater.string
name="TitleCompleted">
- Inventory ([ITEM_COUNT] Items) [FILTER]
+ MY INVENTORY ([ITEM_COUNT] Items) [FILTER]
</floater.string>
<floater.string
name="Fetched">
Fetched
</floater.string>
- <filter_editor
- search_button_visible="false"
- text_pad_left="12"
- follows="left|top|right"
- height="16"
- label="Type here to search"
- layout="topleft"
- left="6"
- name="inventory search editor"
- top="34"
- width="455" />
- <tab_container
- follows="left|top|right|bottom"
- height="508"
- layout="topleft"
- left_delta="-4"
- name="inventory filter tabs"
- tab_position="top"
- top_pad="4"
- width="463">
- <inventory_panel
- follows="left|top|right|bottom"
- height="491"
- label="All Items"
- layout="topleft"
- left="1"
- name="All Items"
- top="16"
- width="461" />
- <inventory_panel
- follows="left|top|right|bottom"
- height="491"
- label="Recent Items"
- layout="topleft"
- left_delta="0"
- name="Recent Items"
- top_delta="0"
- width="461" />
- </tab_container>
- <menu_bar
- bg_visible="false"
- follows="left|top|right"
- height="18"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="Inventory Menu"
- top_delta="-38"
- width="461">
- <menu
- height="101"
- label="File"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="File"
- tear_off="true"
- top="-117"
- width="128">
- <menu_item_call
- label="Open"
- layout="topleft"
- name="Open">
- <menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="open" />
- </menu_item_call>
- <menu
- create_jump_keys="true"
- label="Upload"
- layout="topleft"
- name="upload"
- tear_off="true">
- <menu_item_call
- label="Image (L$[COST])..."
- layout="topleft"
- name="Upload Image"
- shortcut="control|U">
- <menu_item_call.on_click
- function="File.UploadImage"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Sound (L$[COST])..."
- layout="topleft"
- name="Upload Sound">
- <menu_item_call.on_click
- function="File.UploadSound"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Animation (L$[COST])..."
- layout="topleft"
- name="Upload Animation">
- <menu_item_call.on_click
- function="File.UploadAnim"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Bulk (L$[COST] per file)..."
- layout="topleft"
- name="Bulk Upload">
- <menu_item_call.on_click
- function="File.UploadBulk"
- parameter="" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
- </menu>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="New Window"
- layout="topleft"
- name="New Window">
- <menu_item_call.on_click
- function="Inventory.NewWindow" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="separator2" />
- <menu_item_call
- label="Show Filters"
- layout="topleft"
- name="Show Filters">
- <menu_item_call.on_click
- function="Inventory.ShowFilters" />
- </menu_item_call>
- <menu_item_call
- label="Reset Filters"
- layout="topleft"
- name="Reset Current">
- <menu_item_call.on_click
- function="Inventory.ResetFilter" />
- </menu_item_call>
- <menu_item_call
- label="Close All Folders"
- layout="topleft"
- name="Close All Folders">
- <menu_item_call.on_click
- function="Inventory.CloseAllFolders" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="separator3" />
- <menu_item_call
- label="Empty Trash"
- layout="topleft"
- name="Empty Trash">
- <menu_item_call.on_click
- function="Inventory.EmptyTrash" />
- </menu_item_call>
- <menu_item_call
- label="Empty Lost And Found"
- layout="topleft"
- name="Empty Lost And Found">
- <menu_item_call.on_click
- function="Inventory.EmptyLostAndFound" />
- </menu_item_call>
- </menu>
- <menu
- height="121"
- label="Create"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="Create"
- tear_off="true"
- top="-201"
- width="121">
- <menu_item_call
- label="New Folder"
- layout="topleft"
- name="New Folder">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="category" />
- </menu_item_call>
- <menu_item_call
- label="New Script"
- layout="topleft"
- name="New Script">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="lsl" />
- </menu_item_call>
- <menu_item_call
- label="New Note"
- layout="topleft"
- name="New Note">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="notecard" />
- </menu_item_call>
- <menu_item_call
- label="New Gesture"
- layout="topleft"
- name="New Gesture">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gesture" />
- </menu_item_call>
- <menu
- height="175"
- label="New Clothes"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Clothes"
- top_pad="514"
- width="125">
- <menu_item_call
- label="New Shirt"
- layout="topleft"
- name="New Shirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shirt" />
- </menu_item_call>
- <menu_item_call
- label="New Pants"
- layout="topleft"
- name="New Pants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="pants" />
- </menu_item_call>
- <menu_item_call
- label="New Shoes"
- layout="topleft"
- name="New Shoes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shoes" />
- </menu_item_call>
- <menu_item_call
- label="New Socks"
- layout="topleft"
- name="New Socks">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="socks" />
- </menu_item_call>
- <menu_item_call
- label="New Jacket"
- layout="topleft"
- name="New Jacket">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="jacket" />
- </menu_item_call>
- <menu_item_call
- label="New Skirt"
- layout="topleft"
- name="New Skirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skirt" />
- </menu_item_call>
- <menu_item_call
- label="New Gloves"
- layout="topleft"
- name="New Gloves">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gloves" />
- </menu_item_call>
- <menu_item_call
- label="New Undershirt"
- layout="topleft"
- name="New Undershirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="undershirt" />
- </menu_item_call>
- <menu_item_call
- label="New Underpants"
- layout="topleft"
- name="New Underpants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="underpants" />
- </menu_item_call>
- <menu_item_call
- label="New Alpha"
- layout="topleft"
- name="New Alpha">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="alpha" />
- </menu_item_call>
- <menu_item_call
- label="New Tattoo"
- layout="topleft"
- name="New Tattoo">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="tattoo" />
- </menu_item_call>
- </menu>
- <menu
- height="85"
- label="New Body Parts"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Body Parts"
- top_pad="514"
- width="118">
- <menu_item_call
- label="New Shape"
- layout="topleft"
- name="New Shape">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shape" />
- </menu_item_call>
- <menu_item_call
- label="New Skin"
- layout="topleft"
- name="New Skin">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skin" />
- </menu_item_call>
- <menu_item_call
- label="New Hair"
- layout="topleft"
- name="New Hair">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="hair" />
- </menu_item_call>
- <menu_item_call
- label="New Eyes"
- layout="topleft"
- name="New Eyes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="eyes" />
- </menu_item_call>
- </menu>
- </menu>
- <menu
- height="49"
- label="Sort"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="Sort"
- tear_off="true"
- top="-113"
- width="118">
- <menu_item_check
- control_name="Inventory.SortByName"
- label="By Name"
- layout="topleft"
- name="By Name">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="name" />
- </menu_item_check>
- <menu_item_check
- control_name="Inventory.SortByDate"
- label="By Date"
- layout="topleft"
- name="By Date">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="date" />
- </menu_item_check>
- <menu_item_separator
- layout="topleft" />
- <menu_item_check
- control_name="Inventory.FoldersAlwaysByName"
- label="Folders Always By Name"
- layout="topleft"
- name="Folders Always By Name">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="foldersalwaysbyname" />
- </menu_item_check>
- <menu_item_check
- control_name="Inventory.SystemFoldersToTop"
- label="System Folders To Top"
- layout="topleft"
- name="System Folders To Top">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="systemfolderstotop" />
- </menu_item_check>
- </menu>
- </menu_bar>
+ <panel
+ bottom="560"
+ class="panel_main_inventory"
+ filename="panel_main_inventory.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ label="Inventory Panel"
+ name="Inventory Panel"
+ top="15"
+ width="467" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 4f0609c7f8..366098013b 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -7,7 +7,7 @@
name="item properties"
help_topic="item_properties"
save_rect="true"
- title="Inventory Item Properties"
+ title="INVENTORY ITEM PROPERTIES"
width="350">
<floater.string
name="unknown">
@@ -106,12 +106,11 @@
left_delta="78"
name="LabelCreatorName"
top_delta="0"
- width="200">
+ width="170">
Nicole Linden
</text>
<button
follows="top|right"
- font="SansSerifSmall"
height="16"
label="Profile..."
layout="topleft"
@@ -140,12 +139,11 @@
left_delta="78"
name="LabelOwnerName"
top_delta="0"
- width="200">
+ width="170">
Thrax Linden
</text>
<button
follows="top|right"
- font="SansSerifSmall"
height="16"
label="Profile..."
layout="topleft"
@@ -257,12 +255,13 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="25"
layout="topleft"
left="10"
name="NextOwnerLabel"
top_pad="5"
- width="78">
+ width="78"
+ word_wrap="true">
Next owner:
</text>
<check_box
@@ -303,7 +302,7 @@
layout="topleft"
follows="left|top"
name="combobox sale copy"
- width="90">
+ width="110">
<combo_box.item
label="Copy"
name="Copy"
@@ -319,14 +318,26 @@
increment="1"
control_name="Edit Cost"
name="Edit Cost"
- label="Price: L$"
- label_width="60"
+ label="Price:"
+ label_width="100"
left="10"
- width="180"
+ width="192"
min_val="1"
height="19"
max_val="999999999"
top_pad="5"/>
+ <text
+ type="string"
+ length="1"
+ height="15"
+ follows="left|top"
+ layout="topleft"
+ left_delta="82"
+ name="CurrencySymbol"
+ top_delta="1"
+ width="18">
+ L$
+ </text>
<!--line_editor
border_style="line"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 0042f97a8e..90fee857fb 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -6,7 +6,7 @@
layout="topleft"
name="Inventory Finder"
help_topic="inventory_finder"
- title="inventory_recent_items"
+ title="INVENTORY_RECENT_ITEMS"
width="280">
<icon
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml
index e2da059ace..4d67e4c343 100644
--- a/indra/newview/skins/default/xui/en/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/en/floater_joystick.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="Joystick"
help_topic="joystick"
- title="Joystick Configuration"
+ title="JOYSTICK CONFIGURATION"
width="550">
<floater.string
name="NoDevice">
diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml
index d98fdc5118..b24c745bdd 100644
--- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="150"
+ height="170"
layout="topleft"
name="floater_lagmeter"
help_topic="floater_lagmeter"
save_rect="true"
- title="Lag Meter"
+ title="LAG METER"
width="350">
<floater.string
name="max_title_msg">
@@ -184,7 +184,6 @@
layout="topleft"
left="8"
name="client_lagmeter"
- picture_style="true"
tab_stop="false"
tool_tip="Client lag status"
top="24"
@@ -233,7 +232,6 @@
layout="topleft"
left="8"
name="network_lagmeter"
- picture_style="true"
tab_stop="false"
tool_tip="Network lag status"
top="64"
@@ -282,7 +280,6 @@
layout="topleft"
left="8"
name="server_lagmeter"
- picture_style="true"
tab_stop="false"
tool_tip="Server lag status"
top="104"
@@ -323,15 +320,6 @@
left="40"
name="server_lag_cause"
right="-32" />
- <!--button
- bottom="145"
- follows="left|top"
- height="18"
- label="?"
- layout="topleft"
- name="server_help"
- right="-10"
- width="18" /-->
<button
follows="left|top"
height="20"
@@ -340,7 +328,7 @@
left="10"
name="minimize"
tool_tip="Toggle floater size"
- top_delta="4"
+ top_delta="24"
width="40">
<button.commit_callback
function="LagMeter.ClickShrink" />
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 46d74b6aff..06c766f744 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="400"
+ height="430"
layout="topleft"
name="land holdings floater"
help_topic="land_holdings_floater"
- title="My Land"
- width="280">
+ title="MY LAND"
+ width="600">
<floater.string
name="area_string">
[AREA] m²
@@ -15,81 +15,80 @@
draw_heading="true"
height="170"
layout="topleft"
- left="8"
+ left="10"
name="parcel list"
- top="24"
- width="270">
+ top="28"
+ width="580">
<scroll_list.columns
label="Parcel"
name="name"
- width="69" />
+ width="167" />
<scroll_list.columns
label="Region"
name="location"
- width="74" />
+ width="180" />
<scroll_list.columns
label="Type"
name="type"
- width="55" />
+ width="145" />
<scroll_list.columns
label="Area"
name="area"
- width="10" />
+ width="88" />
<scroll_list.columns
label=""
name="hidden"
width="-1" />
</scroll_list>
<button
- height="20"
- font="SansSerifSmall"
+ height="23"
label="Teleport"
label_selected="Teleport"
layout="topleft"
- left_delta="4"
+ top="208"
+ left="10"
name="Teleport"
tool_tip="Teleport to the center of this land."
- top_pad="4"
- width="100" />
+ width="80" />
<button
- height="20"
- font="SansSerifSmall"
+ height="23"
label="Map"
label_selected="Map"
layout="topleft"
- left_pad="4"
+ top="208"
+ left="95"
name="Show on Map"
tool_tip="Show this land on the world map"
- top_delta="0"
- width="100" />
+ width="80" />
<text
type="string"
length="1"
follows="left|top"
- height="16"
layout="topleft"
- left="12"
+ top="251"
+ left="10"
name="contrib_label"
- top="222"
- width="480">
+ height="16"
+ width="580">
Contributions to your groups:
</text>
<scroll_list
draw_heading="true"
height="75"
layout="topleft"
- left_delta="-4"
name="grant list"
- top_pad="4"
- width="270">
+ top="271"
+ left="10"
+ width="580">
<scroll_list.columns
label="Group"
name="group"
- width="125" />
+ width="290"
+ left_pad="10" />
<scroll_list.columns
label="Area"
name="area"
- width="125" />
+ width="290" />
</scroll_list>
<text
type="string"
@@ -97,12 +96,11 @@
follows="left|top"
height="16"
layout="topleft"
- left_delta="4"
name="allowed_label"
- top_pad="4"
- width="150">
- Allowed land holdings at
-current payment plan:
+ top="366"
+ left="10"
+ width="290">
+ Allowed land holdings at current payment plan:
</text>
<text
type="string"
@@ -110,10 +108,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
- left_pad="5"
name="allowed_text"
- top_delta="10"
- width="132">
+ top="366"
+ left="305"
+ width="290">
[AREA] m²
</text>
<text
@@ -122,10 +120,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
- left="12"
+ top="386"
+ left="10"
name="current_label"
- top_pad="5"
- width="150">
+ width="290">
Current land holdings:
</text>
<text
@@ -134,10 +132,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
- left_pad="5"
+ top="386"
+ left="305"
name="current_text"
- top_delta="0"
- width="132">
+ width="290">
[AREA] m²
</text>
<text
@@ -147,12 +145,11 @@ current payment plan:
font="SansSerifBold"
height="16"
layout="topleft"
- left="12"
+ top="406"
+ left="10"
name="available_label"
- top_pad="5"
- width="150">
- Available for land
-purchases:
+ width="290">
+ Available for land purchases:
</text>
<text
type="string"
@@ -161,10 +158,10 @@ purchases:
font="SansSerifBold"
height="16"
layout="topleft"
- left_pad="5"
name="available_text"
- top_delta="5"
- width="140">
+ top="406"
+ left="305"
+ width="290">
[AREA] m²
</text>
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 93bbb0107e..990be55847 100644
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
bevel_style="none"
border_style="line"
can_resize="true"
follows="left|top"
- height="570"
+ height="580"
layout="topleft"
min_height="271"
min_width="290"
name="script ed float"
help_topic="script_ed_float"
save_rect="true"
- title="Script: New Script"
- width="500">
+ title="SCRIPT: NEW SCRIPT"
+ width="508">
<floater.string
name="not_allowed">
You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
@@ -24,19 +24,31 @@
</floater.string>
<floater.string
name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
+ <panel
+ bevel_style="none"
+
+ border_style="line"
+ follows="left|top|right|bottom"
+ height="522"
+ layout="topleft"
+ left="10"
+ name="script ed panel"
+ top="20"
+ width="497" />
<button
- follows="right|bottom"
- height="20"
+ follows="left|bottom"
+ height="23"
label="Reset"
label_selected="Reset"
layout="topleft"
- left="358"
name="Reset"
- top="545"
- width="128" />
+ left="10"
+ width="61" />
<check_box
+ left_delta="71"
+ top_delta="3"
enabled="false"
follows="left|bottom"
font="SansSerif"
@@ -44,30 +56,17 @@
initial_value="true"
label="Running"
layout="topleft"
- left_delta="-350"
name="running"
- top_delta="2"
width="100" />
<check_box
- enabled="false"
+ left_delta="75"
+ enabled="true"
follows="left|bottom"
font="SansSerif"
height="18"
initial_value="true"
label="Mono"
layout="topleft"
- left_delta="70"
name="mono"
- top_delta="0"
width="100" />
- <panel
- bevel_style="none"
- border_style="line"
- follows="left|top|right|bottom"
- height="506"
- layout="topleft"
- left="1"
- name="script ed panel"
- top="18"
- width="497" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
index 4dcf168605..c9d87f158f 100644
--- a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
@@ -8,9 +8,9 @@
min_height="271"
min_width="350"
name="script ed float"
- help_topic="script_ed_float"
+ help_topic="lsl_reference"
save_rect="true"
- title="LSL Wiki"
+ title="LSL REFERENCE"
width="370">
<check_box
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 7b4c5f38a1..5d35275e17 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,17 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
+ can_minimize="true"
can_resize="true"
follows="top|right"
- height="225"
+ height="218"
layout="topleft"
- min_height="60"
+ min_height="174"
min_width="174"
name="Map"
+ title="Mini Map"
help_topic="map"
save_rect="true"
save_visibility="true"
single_instance="true"
+ left="0"
+ top="0"
width="200">
<floater.string
name="mini_map_north">
@@ -51,116 +55,116 @@
</floater.string>
<net_map
bg_color="NetMapBackgroundColor"
- bottom="225"
follows="top|left|bottom|right"
layout="topleft"
left="0"
mouse_opaque="false"
name="Net Map"
- right="198"
- top="2" />
+ width="200"
+ height="200"
+ top="18"/>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="N"
layout="topleft"
left="0"
name="floater_map_north"
right="10"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
N
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="E"
layout="topleft"
left="0"
name="floater_map_east"
right="10"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
E
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="205"
label="W"
layout="topleft"
left="0"
name="floater_map_west"
right="11"
text_color="1 1 1 0.7"
- top="215">
+ top="195">
W
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="S"
layout="topleft"
left="0"
name="floater_map_south"
right="10"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
S
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="SE"
layout="topleft"
left="0"
name="floater_map_southeast"
right="20"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
SE
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="NE"
layout="topleft"
left="0"
name="floater_map_northeast"
right="20"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
NE
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="SW"
layout="topleft"
left="0"
name="floater_map_southwest"
right="20"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
SW
</text>
<text
type="string"
length="1"
- bottom="225"
+ bottom="218"
label="NW"
layout="topleft"
left="0"
name="floater_map_northwest"
right="20"
text_color="1 1 1 0.7"
- top="215">
+ top="209">
NW
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index b11892be74..70dac7e41c 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -10,7 +10,7 @@
help_topic="floater_about"
save_rect="true"
single_instance="true"
- title="Media Browser"
+ title="MEDIA BROWSER"
width="820">
<floater.string
name="home_page_url">
@@ -80,7 +80,7 @@
height="20"
layout="topleft"
left_pad="5"
- max_chars="255"
+ max_chars="1024"
name="address"
top_delta="0"
width="540">
@@ -127,7 +127,6 @@
layout="topleft"
left_delta="55"
name="play"
- picture_style="true"
top_delta="0"
width="55" />
<button
@@ -138,7 +137,6 @@
layout="topleft"
left_delta="0"
name="pause"
- picture_style="true"
top_delta="0"
width="55" />
<button
@@ -173,7 +171,7 @@
enabled="false"
follows="left|top"
height="20"
- label="Send Current URL to Parcel"
+ label="Send Current Page to Parcel"
layout="topleft"
left="0"
name="assign"
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 4218c15408..681731b0da 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- bottom="-666"
can_close="true"
can_drag_on_left="false"
can_minimize="true"
@@ -12,14 +11,14 @@
width="365"
height="535"
left="330"
- min_height="430"
- min_width="620"
+ min_height="535"
+ min_width="365"
mouse_opaque="true"
- name="Medis Settings"
+ name="media_settings"
help_topic = "media_settings"
- title="Media Settings">
+ title="MEDIA SETTINGS">
<button
- bottom="-525"
+ bottom="525"
enabled="true"
follows="right|bottom"
font="SansSerif"
@@ -61,7 +60,7 @@
scale_image="true"
width="90" />
<tab_container
- bottom="-500"
+ bottom="500"
enabled="true"
follows="left|top|right|bottom"
height="485"
diff --git a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
index 560acafd4f..28a29c42aa 100644
--- a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
@@ -7,7 +7,7 @@
layout="topleft"
name="MemLeak"
help_topic="memleak"
- title="Simulate a Memory Leak"
+ title="SIMULATE A MEMORY LEAK"
width="350">
<spinner
decimal_digits="0"
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 01a1b95a9a..851a689d42 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -2,8 +2,8 @@
<floater
legacy_header_height="18"
can_dock="true"
- can_close="true"
can_minimize="true"
+ can_close="false"
center_horiz="true"
follows="bottom"
height="110"
@@ -38,12 +38,12 @@
Fly Backwards (press Down Arrow or S)
</string>
<panel
- border="true"
+ border="false"
height="83"
- follows="left|top"
+ follows="left|top"
layout="topleft"
left="0"
- mouse_opaque="false"
+ mouse_opaque="false"
name="panel_actions"
top="0"
width="115">
@@ -56,7 +56,6 @@
layout="topleft"
left="17"
name="turn left btn"
- picture_style="true"
scale_image="false"
tool_tip="Turn left (press Left Arrow or A)"
top="45"
@@ -70,7 +69,6 @@
layout="topleft"
left_pad="34"
name="turn right btn"
- picture_style="true"
scale_image="false"
tool_tip="Turn right (press Right Arrow or D)"
top_delta="0"
@@ -84,9 +82,8 @@
layout="topleft"
left="10"
name="move up btn"
- picture_style="true"
scale_image="false"
- tool_tip="Fly up, press &quot;E&quot;"
+ tool_tip="Fly up, press E"
top="14"
width="25" />
<button
@@ -98,9 +95,8 @@
layout="topleft"
left_pad="45"
name="move down btn"
- picture_style="true"
scale_image="false"
- tool_tip="Fly down, press &quot;C&quot;"
+ tool_tip="Fly down, press C"
top_delta="0"
width="20" />
<joystick_turn
@@ -112,7 +108,6 @@
layout="topleft"
left="46"
name="forward btn"
- picture_style="true"
quadrant="up"
scale_image="false"
tool_tip="Walk forward (press up arrow or W)"
@@ -127,7 +122,6 @@
layout="topleft"
left_delta="0"
name="backward btn"
- picture_style="true"
quadrant="down"
scale_image="false"
tool_tip="Walk backward (press down arrow or S)"
@@ -136,7 +130,7 @@
</panel>
<!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml -->
<panel
- border="true"
+ border="false"
height="27"
layout="topleft"
left="0"
@@ -147,7 +141,7 @@
follows="left|bottom"
height="23"
image_overlay="Move_Walk_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
name="mode_walk_btn"
@@ -158,10 +152,9 @@
width="31" />
<button
follows="left|bottom"
- font="SansSerifSmall"
height="23"
image_overlay="Move_Run_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
left_pad="0"
@@ -175,7 +168,7 @@
follows="left|bottom"
height="23"
image_overlay="Move_Fly_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
left_pad="0"
@@ -186,7 +179,7 @@
top="2"
width="31" />
<button
- visible="false"
+ visible="false"
follows="left|bottom"
height="20"
label="Stop Flying"
diff --git a/indra/newview/skins/default/xui/en/floater_mute_object.xml b/indra/newview/skins/default/xui/en/floater_mute_object.xml
index 33b1dac8a5..22b0a1783f 100644
--- a/indra/newview/skins/default/xui/en/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_mute_object.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
can_minimize="false"
@@ -6,7 +6,7 @@
layout="topleft"
name="block by name"
help_topic="mute_by_name"
- title="Block object by name"
+ title="BLOCK OBJECT BY NAME"
width="375">
<text
type="string"
@@ -47,7 +47,7 @@
<button
follows="bottom|left"
height="23"
- label="Ok"
+ label="OK"
layout="topleft"
left="155"
name="OK"
diff --git a/indra/newview/skins/default/xui/en/floater_my_friends.xml b/indra/newview/skins/default/xui/en/floater_my_friends.xml
index 689221b9c7..e7efcc7844 100644
--- a/indra/newview/skins/default/xui/en/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_friends.xml
@@ -11,7 +11,7 @@
help_topic="floater_my_friends"
save_rect="true"
single_instance="true"
- title="Contacts"
+ title="CONTACTS"
width="395">
<tab_container
follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 65dd4e74ff..28616d503b 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -1,36 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
+ border_visible="false"
+ border_drop_shadow_visible="false"
+ drop_shadow_visible="false"
+ border="false"
+ bg_opaque_image="Window_Foreground"
+ bg_alpha_image="Window_Background"
+ bg_alpha_image_overlay="DkGray_66"
legacy_header_height="18"
can_minimize="true"
can_tear_off="false"
- can_resize="false"
+ can_resize="true"
can_drag_on_left="false"
can_close="false"
can_dock="true"
bevel_style="in"
height="300"
+ min_width="150"
layout="topleft"
name="nearby_chat"
help_topic="nearby_chat"
save_rect="true"
- title="Nearby Chat"
+ title="NEARBY CHAT"
+ save_dock_state="true"
save_visibility="true"
single_instance="true"
width="320">
<chat_history
- allow_html="true"
+ allow_html="true"
bg_readonly_color="ChatHistoryBgColor"
bg_writeable_color="ChatHistoryBgColor"
follows="all"
- left="1"
+ left="5"
top="20"
- font="SansSerif"
layout="topleft"
- height="280"
+ height="275"
name="chat_history"
- parse_highlights="true"
+ parse_highlights="true"
text_color="ChatHistoryTextColor"
text_readonly_color="ChatHistoryTextColor"
- width="320"/>
-
+ right_widget_pad="5"
+ left_widget_pad="0"
+ width="315" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_notification.xml b/indra/newview/skins/default/xui/en/floater_notification.xml
index f9cb22055a..1f9ddecac2 100644
--- a/indra/newview/skins/default/xui/en/floater_notification.xml
+++ b/indra/newview/skins/default/xui/en/floater_notification.xml
@@ -6,7 +6,7 @@
layout="topleft"
min_height="50"
name="notification"
- title="Notifications Console"
+ title="NOTIFICATIONS CONSOLE"
width="200">
<text_editor
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_notifications_console.xml b/indra/newview/skins/default/xui/en/floater_notifications_console.xml
index 03a2aad96d..ca81b9bcf0 100644
--- a/indra/newview/skins/default/xui/en/floater_notifications_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_notifications_console.xml
@@ -8,7 +8,7 @@
name="notifications_console"
help_topic="notifications_console"
single_instance="true"
- title="Notifications Console"
+ title="NOTIFICATIONS CONSOLE"
width="500">
<combo_box
follows="left|right|top"
diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml
index cc50f43339..41a440aaa0 100644
--- a/indra/newview/skins/default/xui/en/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/en/floater_openobject.xml
@@ -10,7 +10,7 @@
name="objectcontents"
help_topic="objectcontents"
save_rect="true"
- title="Object Contents"
+ title="OBJECT CONTENTS"
width="300">
<text
type="string"
@@ -26,7 +26,7 @@
width="284">
[DESC]:
</text>
- <panel_inventory
+ <panel_inventory_object
background_visible="false"
draw_border="false"
follows="all"
@@ -38,7 +38,6 @@
width="284" />
<button
follows="bottom|left"
- font="SansSerifSmall"
height="23"
label="Copy To Inventory"
label_selected="Copy To Inventory"
@@ -53,7 +52,6 @@
</button>
<button
follows="bottom|left"
- font="SansSerifSmall"
height="23"
label="Copy And Wear"
label_selected="Copy And Wear"
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..a2938e8574
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_close="false"
+ can_minimize="false"
+ height="100"
+ layout="topleft"
+ title="Save Outfit"
+ name="modal container"
+ width="240">
+ <button
+ height="23"
+ label="Save"
+ label_selected="Save"
+ layout="topleft"
+ left="20"
+ name="Save"
+ top="70"
+ width="82" />
+ <button
+ height="23"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ left_pad="36"
+ name="Cancel"
+ top_delta="0"
+ width="82" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="30"
+ layout="topleft"
+ left="20"
+ word_wrap="true"
+ name="Save item as:"
+ top="10"
+ width="200">
+ Save what I'm wearing
+as a new Outfit:
+ </text>
+ <line_editor
+ type="string"
+ length="1"
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ handle_edit_keys_directly="true"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ show_text_as_tentative="false"
+ top_pad="0"
+ max_length="63"
+ name="name ed"
+ width="200">
+ [DESC] (new)
+ </line_editor>
+</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
new file mode 100644
index 0000000000..2bafd1bdef
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_close="false"
+ can_minimize="false"
+ can_tear_off="false"
+ height="125"
+ layout="topleft"
+ name="outgoing call"
+ help_topic="outgoing_call"
+ title="CALLING"
+ width="410">
+ <floater.string
+ name="lifetime">
+ 5
+ </floater.string>
+ <floater.string
+ name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string
+ name="anonymous">
+ anonymous
+ </floater.string>
+ <floater.string
+ name="VoiceInviteP2P">
+ is calling.
+ </floater.string>
+ <floater.string
+ name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <avatar_icon
+ enabled="false"
+ follows="left|top"
+ height="36"
+ image_name="icon_avatar_online.tga"
+ layout="topleft"
+ left_delta="19"
+ top="35"
+ width="36" />
+ <group_icon
+ enabled="false"
+ follows="left|top"
+ height="36"
+ layout="topleft"
+ top="35"
+ width="36" />
+ <text
+ font="SansSerifLarge"
+ height="20"
+ layout="topleft"
+ left="77"
+ name="connecting"
+ top="27"
+ visible="false"
+ width="315"
+ word_wrap="true">
+Connecting to [CALLEE_NAME]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="20"
+ layout="topleft"
+ left="77"
+ name="calling"
+ top="27"
+ width="315"
+ word_wrap="true">
+Calling [CALLEE_NAME]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="20"
+ layout="topleft"
+ left="77"
+ name="noanswer"
+ top="27"
+ width="315"
+ word_wrap="true">
+No Answer. Please try again later.
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P_by_other"
+ top="27"
+ width="315"
+ word_wrap="true">
+ [VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P_by_agent"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text
+ font="SansSerif"
+ height="50"
+ layout="topleft"
+ left="77"
+ name="leaving"
+ top="52"
+ width="315"
+ word_wrap="true">
+Leaving [CURRENT_CHAT].
+ </text>
+ <button
+ height="24"
+ label="Cancel"
+ label_selected="Cancel"
+ left="70"
+ layout="topleft"
+ name="Cancel"
+ left_pad="10"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml
index b4becfa022..509cffe490 100644
--- a/indra/newview/skins/default/xui/en/floater_pay.xml
+++ b/indra/newview/skins/default/xui/en/floater_pay.xml
@@ -2,22 +2,29 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="185"
+ height="200"
layout="topleft"
name="Give Money"
help_topic="give_money"
save_rect="true"
width="225">
+ <string
+ name="payee_group">
+ Pay Group
+ </string>
+ <string
+ name="payee_resident">
+ Pay Resident
+ </string>
<text
type="string"
length="1"
follows="left|top"
- font="SansSerifBold"
height="18"
layout="topleft"
left="12"
name="payee_label"
- top="7"
+ top="22"
width="75">
Pay:
</text>
@@ -45,7 +52,6 @@
</text>
<button
height="23"
- font="SansSerifSmall"
label="L$1"
label_selected="L$1"
layout="topleft"
@@ -55,8 +61,7 @@
width="80" />
<button
height="23"
- label="L$1"
- font="SansSerif"
+ label="L$5"
label_selected="L$5"
layout="topleft"
left_pad="15"
@@ -65,7 +70,6 @@
<button
height="23"
label="L$10"
- font="SansSerifHuge"
label_selected="L$10"
layout="topleft"
left="25"
diff --git a/indra/newview/skins/default/xui/en/floater_pay_object.xml b/indra/newview/skins/default/xui/en/floater_pay_object.xml
index 8d230023cc..d09a0a0535 100644
--- a/indra/newview/skins/default/xui/en/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_pay_object.xml
@@ -8,32 +8,14 @@
help_topic="give_money"
save_rect="true"
width="225">
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerifBold"
- height="18"
- layout="topleft"
- left="12"
- name="payee_group"
- top="7"
- width="75">
- Pay group:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerifBold"
- height="18"
- layout="topleft"
- left="12"
- name="payee_resident"
- top="7"
- width="75">
- Pay resident:
- </text>
+ <string
+ name="payee_group">
+ Pay Group
+ </string>
+ <string
+ name="payee_resident">
+ Pay Resident
+ </string>
<icon
height="16"
width="16"
@@ -41,32 +23,32 @@
mouse_opaque="true"
name="icon_person"
tool_tip="Person"
- top_pad="0"
+ top_pad="24"
left="10"
/>
<text
type="string"
length="1"
follows="left|top"
- font="SansSerif"
height="16"
layout="topleft"
left_pad="7"
+ top_delta="3"
name="payee_name"
- width="210">
- [FIRST] [LAST]
+ width="184">
+ [FIRST] [LAST]
</text>
<text
type="string"
length="1"
follows="left|top"
halign="left"
- height="16"
+ height="14"
layout="topleft"
- left="30"
+ left="34"
name="object_name_label"
top_pad="0"
- width="150">
+ width="180">
Via object:
</text>
<icon
@@ -77,20 +59,21 @@
name="icon_object"
tool_tip="Objects"
top_pad="0"
- left="30"
+ left="10"
/>
<text
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="18"
+ height="16"
layout="topleft"
- left_pad="5"
+ left_pad="7"
name="object_name_text"
- top_delta="0"
- width="210">
- ...
+ top_delta="3"
+ use_ellipses="true"
+ word_wrap="false"
+ width="188">
+ My awesome object with a really damn long name
</text>
<button
height="23"
@@ -130,7 +113,7 @@
type="string"
length="1"
follows="left|top"
- height="18"
+ height="14"
layout="topleft"
left="25"
name="amount text"
@@ -141,7 +124,7 @@
<line_editor
border_style="line"
follows="left|top|right"
- height="19"
+ height="21"
top_pad="0"
layout="topleft"
left="120"
diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
index eb0c22b9c4..4909b8988f 100644
--- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
@@ -6,7 +6,7 @@
name="perm prefs"
help_topic="perm_prefs"
save_rect="true"
- title="Default Upload Permissions"
+ title="DEFAULT UPLOAD PERMISSIONS"
width="315">
<panel
follows="left|top|right|bottom"
@@ -17,29 +17,15 @@
name="permissions"
top="20"
width="315">
- <button
- follows="left"
- height="18"
- label="?"
- label_selected="?"
- layout="topleft"
- left="260"
- name="help"
- top="7"
- width="22">
- <button.commit_callback
- function="Notification.Show"
- parameter="ClickUploadHelpPermissions" />
- </button>
<check_box
control_name="ShareWithGroup"
height="16"
label="Share with group"
layout="topleft"
- left_delta="-250"
+ left="10"
name="share_with_group"
- top_delta="2"
- width="106" />
+ top="5"
+ width="150" />
<check_box
control_name="EveryoneCopy"
height="16"
@@ -47,8 +33,8 @@
layout="topleft"
left_delta="0"
name="everyone_copy"
- top_pad="16"
- width="130" />
+ top_pad="5"
+ width="150" />
<text
type="string"
length="1"
@@ -57,8 +43,8 @@
layout="topleft"
left_delta="0"
name="NextOwnerLabel"
- top_pad="16"
- width="88">
+ top_pad="5"
+ width="150">
Next owner can:
</text>
<check_box
@@ -68,17 +54,17 @@
layout="topleft"
left_delta="0"
name="next_owner_modify"
- top_pad="14"
- width="78" />
+ top_pad="5"
+ width="150" />
<check_box
control_name="NextOwnerCopy"
height="16"
label="Copy"
layout="topleft"
- left_delta="78"
+ left_delta="0"
name="next_owner_copy"
- top_delta="0"
- width="88" >
+ top_pad="5"
+ width="150" >
<check_box.commit_callback
function="Perms.Copy" />
</check_box>
@@ -90,10 +76,10 @@
initial_value="true"
label="Resell/Give away"
layout="topleft"
- left_delta="88"
+ left_delta="0"
name="next_owner_transfer"
- top_delta="0"
- width="106" />
+ top_pad="5"
+ width="150" />
</panel>
<button
height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_post_process.xml b/indra/newview/skins/default/xui/en/floater_post_process.xml
index 46554beede..05559adf89 100644
--- a/indra/newview/skins/default/xui/en/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/en/floater_post_process.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="Post-Process Floater"
help_topic="post_process_floater"
- title="Post-Process Settings"
+ title="POST-PROCESS SETTINGS"
width="400">
<tab_container
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
index b13bd1740c..6f78363b25 100644
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/en/floater_postcard.xml
@@ -10,7 +10,7 @@
min_width="450"
name="Postcard"
help_topic="postcard"
- title="Email Snapshot"
+ title="EMAIL SNAPSHOT"
width="450">
<floater.string
name="default_subject">
@@ -128,19 +128,9 @@
width="420">
Type your message here.
</text_editor>
- <text
- type="string"
- length="1"
- bottom_delta="37"
- follows="left|bottom"
- layout="topleft"
- left="12"
- name="fine_print">
- If your recipient joins SL, you&apos;ll get a referral bonus.
- </text>
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
@@ -149,7 +139,7 @@
width="100" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Send"
layout="topleft"
left_delta="-106"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index d2a2a7ce02..7aa8e23e76 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -9,7 +9,7 @@
name="Preferences"
help_topic="preferences"
single_instance="true"
- title="Preferences"
+ title="PREFERENCES"
width="620">
<button
follows="right|bottom"
@@ -56,7 +56,7 @@
help_topic="preferences_general_tab"
name="general" />
<panel
- class="panel_preference"
+ class="panel_preference_graphics"
filename="panel_preferences_graphics1.xml"
label="Graphics"
layout="topleft"
@@ -72,7 +72,7 @@
<panel
class="panel_preference"
filename="panel_preferences_sound.xml"
- label="Sound"
+ label="Sound &amp; Media"
layout="topleft"
help_topic="preferences_audio_tab"
name="audio" />
@@ -86,7 +86,7 @@
<panel
class="panel_preference"
filename="panel_preferences_alerts.xml"
- label="Alerts"
+ label="Notifications"
layout="topleft"
help_topic="preferences_msgs_tab"
name="msgs" />
diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
index 3b84358484..6dc073728b 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
@@ -38,8 +38,7 @@
width="170" />
<button
height="20"
- font="SansSerifSmall"
- label="Play in World"
+ label="Play Inworld"
label_selected="Stop"
layout="topleft"
left="10"
@@ -49,7 +48,6 @@
width="125" />
<button
height="20"
- font="SansSerifSmall"
label="Play Locally"
label_selected="Stop"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_classified.xml b/indra/newview/skins/default/xui/en/floater_preview_classified.xml
index 7c8c6d7207..2017cf2bd1 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_classified.xml
@@ -7,7 +7,7 @@
name="classified_preview"
help_topic="classified_preview"
save_rect="true"
- title="Classified Information"
+ title="CLASSIFIED INFORMATION"
width="440">
<floater.string
name="Title">
diff --git a/indra/newview/skins/default/xui/en/floater_preview_event.xml b/indra/newview/skins/default/xui/en/floater_preview_event.xml
index f5ab8c95d7..a4066b34c5 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_event.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
auto_tile="true"
@@ -7,7 +7,7 @@
name="event_preview"
help_topic="event_preview"
save_rect="true"
- title="Event Information"
+ title="EVENT INFORMATION"
width="440">
<floater.string
name="Title">
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index 4f3978a5e3..3dc546aee3 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -39,6 +39,28 @@
name="Title">
Gesture: [NAME]
</floater.string>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerifSmall"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="name_text"
+ top="20"
+ font.style="BOLD"
+ width="100">
+ Name:
+ </text>
+ <line_editor
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_delta="84"
+ name="name"
+ top_delta="-4"
+ width="180" />
<text
type="string"
length="1"
@@ -48,7 +70,7 @@
layout="topleft"
left="10"
name="desc_label"
- top="25"
+ top_pad="10"
font.style="BOLD"
width="100">
Description:
@@ -173,7 +195,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="Add &gt;&gt;"
layout="topleft"
left_pad="10"
@@ -205,7 +226,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="Up"
layout="topleft"
left_pad="10"
@@ -215,7 +235,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="Down"
layout="topleft"
left_delta="0"
@@ -225,7 +244,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="Remove"
layout="topleft"
left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml
index fc838f27b4..66408a5057 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml
@@ -8,7 +8,7 @@
name="Gesture"
help_topic="gesture"
save_rect="true"
- title="Gesture Shortcut"
+ title="GESTURE SHORTCUT"
width="260">
<scroll_list
follows="top|left"
@@ -54,4 +54,4 @@
name="save_btn"
top_delta="0"
width="80" /-->
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml
index b489ae2e77..26252a7a16 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml
@@ -8,7 +8,7 @@
name="Gesture"
help_topic="gesture"
save_rect="true"
- title="Gesture Shortcut"
+ title="GESTURE SHORTCUT"
width="260">
<text
type="string"
@@ -85,4 +85,4 @@
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"
top_delta="-4"
width="135" />
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml
index 8a07f3ad1e..34f707cd2a 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml
@@ -8,7 +8,7 @@
name="Gesture"
help_topic="gesture"
save_rect="true"
- title="Gesture Shortcut"
+ title="GESTURE SHORTCUT"
width="260">
<scroll_list
follows="top|left"
@@ -239,4 +239,4 @@ unless you add wait steps.
name="wait_time_editor"
top_delta="0"
width="50" /-->
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index 3797055054..ead5b8c8f2 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -11,15 +11,15 @@
min_width="234"
name="preview notecard"
help_topic="preview_notecard"
- title="Note:"
+ title="NOTECARD:"
width="400">
<floater.string
name="no_object">
- Unable to find object containing this note.
+ Unable to find object containing this notecard.
</floater.string>
<floater.string
name="not_allowed">
- You do not have permission to view this note.
+ You do not have permission to view this notecard.
</floater.string>
<floater.string
name="Title">
@@ -75,7 +75,7 @@
left="4"
max_length="65536"
name="Notecard Editor"
- allow_html="true"
+ allow_html="false"
handle_edit_keys_directly="true"
tab_group="1"
top="46"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
index 95347f0dff..f3be8c4131 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
@@ -38,8 +38,8 @@
<button
follows="left|top"
height="22"
- label="Play in World"
- label_selected="Play in World"
+ label="Play Inworld"
+ label_selected="Play Inworld"
layout="topleft"
name="Sound play btn"
sound_flags="0"
@@ -50,7 +50,6 @@
<button
follows="left|top"
height="22"
- font="SansSerifSmall"
label="Play Locally"
label_selected="Play Locally"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index e7abfb075a..7fd7eab867 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -3,15 +3,15 @@
legacy_header_height="18"
auto_tile="true"
can_resize="true"
- follows="left|bottom"
- height="331"
+ follows="left|top"
+ height="350"
layout="topleft"
- min_height="120"
- min_width="300"
+ min_height="200"
+ min_width="370"
name="preview_texture"
help_topic="preview_texture"
- width="300">
- <floater.string
+ width="370">
+ <floater.string
name="Title">
Texture: [NAME]
</floater.string>
@@ -43,63 +43,38 @@
max_length="127"
name="desc"
width="190" />
- <button
- follows="left|bottom"
- height="22"
- label="OK"
- layout="topleft"
- left="80"
- name="Keep"
- top="302"
- width="100" />
- <button
- follows="left|bottom"
- height="22"
- label="Cancel"
- layout="topleft"
- left_pad="5"
- name="Discard"
- top_delta="0"
- width="100" />
- <text
+ <text
type="string"
+ halign="right"
length="1"
- follows="left|bottom"
+ follows="right|bottom"
height="16"
layout="topleft"
- left="13"
+ left="110"
name="dimensions"
- top="309"
- width="303">
+ top="255"
+ width="200">
[WIDTH]px x [HEIGHT]px
</text>
<text
type="string"
+ halign="right"
length="1"
- bg_visible="false"
- border_drop_shadow_visible="false"
- border_visible="false"
- top="309"
- drop_shadow_visible="true"
- enabled="true"
follows="right|bottom"
- font="SansSerifSmall"
- h_pad="0"
- halign="right"
- height="14"
- left="54"
- mouse_opaque="true"
+ height="16"
+ layout="topleft"
+ left_delta="-110"
name="aspect_ratio"
- v_pad="0"
- width="110">
- Preview Aspect Ratio
+ top_pad="5"
+ width="200">
+ Preview aspect ratio
</text>
<combo_box
allow_text_entry="true"
- top="306"
+ top_delta="-3"
follows="right|bottom"
- height="20"
- left="176"
+ height="23"
+ left_pad="10"
max_chars="20"
mouse_opaque="true"
enabled="true"
@@ -109,10 +84,10 @@
<combo_item name="Unconstrained" value="Unconstrained">
Unconstrained
</combo_item>
- <combo_item name="1:1" value="1:1" tool_tip="Group insignia or 1st Life profile">
+ <combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile">
1:1
</combo_item>
- <combo_item name="4:3" value="4:3" tool_tip="2nd Life profile">
+ <combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile">
4:3
</combo_item>
<combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks">
@@ -131,4 +106,31 @@
2:1
</combo_item>
</combo_box>
+ <button
+ follows="right|bottom"
+ height="22"
+ label="OK"
+ layout="topleft"
+ left="6"
+ name="Keep"
+ top_pad="5"
+ width="110" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Discard"
+ layout="topleft"
+ left_pad="5"
+ name="Discard"
+ top_delta="0"
+ width="110" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Save As"
+ layout="topleft"
+ left_pad="5"
+ name="save_tex_btn"
+ top_delta="0"
+ width="110" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index ae01d0bdf4..262bcd07a0 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="512"
+ height="555"
help_topic="regioninfo"
layout="topleft"
name="regioninfo"
save_rect="true"
- title="Region/Estate"
+ title="REGION/ESTATE"
width="480">
<tab_container
- bottom="512"
+ bottom="555"
follows="left|right|top|bottom"
layout="topleft"
left="1"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 88f09b521c..ac0fca9cce 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="floater_report_abuse"
help_topic="floater_report_abuse"
- title="Report Abuse"
+ title="REPORT ABUSE"
width="333">
<floater.string
name="Screenshot">
@@ -18,7 +18,7 @@
height="150"
layout="topleft"
left="60"
- name=""
+ name="screenshot"
top="15"
width="220" />
<check_box
@@ -52,6 +52,7 @@
left_pad="5"
name="reporter_field"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="200">
Loremipsum Dolorsitamut Longnamez
@@ -126,7 +127,6 @@
layout="topleft"
left_delta="0"
name="pick_btn"
- picture_style="true"
image_overlay="Inv_Object"
tool_tip="Object Picker - Identify an object as the subject of this report"
top_pad="0"
@@ -154,6 +154,7 @@
left_pad="6"
name="object_name"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="185">
Consetetur Sadipscing
@@ -181,6 +182,7 @@
left_pad="6"
name="owner_name"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="185">
Hendrerit Vulputate Kamawashi Longname
@@ -202,11 +204,11 @@
name="Age__Age_play"
value="31" />
<combo_box.item
- label="Age &gt; Adult resident on Teen Second Life"
+ label="Age &gt; Adult Resident on Teen Second Life"
name="Age__Adult_resident_on_Teen_Second_Life"
value="32" />
<combo_box.item
- label="Age &gt; Underage resident outside of Teen Second Life"
+ label="Age &gt; Underage Resident outside of Teen Second Life"
name="Age__Underage_resident_outside_of_Teen_Second_Life"
value="33" />
<combo_box.item
@@ -310,7 +312,7 @@
name="Indecency__Mature_content_in_PG_region"
value="60" />
<combo_box.item
- label="Indecency &gt; Inappropriate content or conduct in a Mature region"
+ label="Indecency &gt; Inappropriate content or conduct in a Moderate region"
name="Indecency__Inappropriate_content_in_Mature_region"
value="69" />
<combo_box.item
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
new file mode 100644
index 0000000000..663899d4b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ background_visible="true"
+ follows="left|top|right|bottom"
+ height="369"
+ layout="topleft"
+ left="0"
+ name="script_floater"
+ top="0"
+ can_dock="true"
+ can_minimize="true"
+ visible="false"
+ width="520"
+ can_resize="false"
+ min_width="350"
+ min_height="369">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index 0029fcb09b..bd9925be1d 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -7,8 +7,8 @@
layout="topleft"
name="script"
help_topic="script"
- short_title="[All scripts]"
- title="[All scripts]"
+ short_title="[ALL SCRIPTS]"
+ title="[ALL SCRIPTS]"
width="440">
<text_editor
bottom="197"
diff --git a/indra/newview/skins/default/xui/en/floater_script_limits.xml b/indra/newview/skins/default/xui/en/floater_script_limits.xml
new file mode 100644
index 0000000000..6b36cdfcc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script_limits.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="570"
+ help_topic="scriptlimits"
+ layout="topleft"
+ name="scriptlimits"
+ save_rect="true"
+ title="SCRIPT INFORMATION"
+ width="480">
+ <tab_container
+ bottom="555"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="1"
+ name="scriptlimits_panels"
+ right="-1"
+ tab_position="top"
+ top="20" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml
index c29a2f4516..d0cd00d147 100644
--- a/indra/newview/skins/default/xui/en/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml
@@ -3,26 +3,24 @@
legacy_header_height="18"
auto_tile="true"
can_resize="true"
- height="550"
+ height="570"
layout="topleft"
- left_delta="343"
min_height="271"
min_width="290"
name="preview lsl text"
help_topic="preview_lsl_text"
save_rect="true"
- title="Script: Rotation Script"
- top_delta="0"
- width="500">
+ title="SCRIPT: ROTATION SCRIPT"
+ width="508">
<floater.string
name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
<panel
follows="left|top|right|bottom"
- height="508"
+ height="522"
layout="topleft"
- left="0"
+ left="10"
name="script panel"
top="42"
width="497" />
diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml
index 8a44252426..60a26fcf1d 100644
--- a/indra/newview/skins/default/xui/en/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml
@@ -8,7 +8,7 @@
name="queue"
help_topic="queue"
save_rect="true"
- title="Reset Progress"
+ title="RESET PROGRESS"
width="300">
<floater.string
name="Starting">
diff --git a/indra/newview/skins/default/xui/en/floater_script_search.xml b/indra/newview/skins/default/xui/en/floater_script_search.xml
index 79c4438dd6..ade0156bc7 100644
--- a/indra/newview/skins/default/xui/en/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_search.xml
@@ -6,7 +6,7 @@
layout="topleft"
name="script search"
help_topic="script_search"
- title="Script Search"
+ title="SCRIPT SEARCH"
width="300">
<check_box
control_name="LSLFindCaseInsensitivity"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 2f4d7c50a1..9ca18d455b 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -1,21 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
+ legacy_header_height="13"
can_resize="true"
- height="400"
+ height="600"
layout="topleft"
- min_height="140"
- min_width="467"
+ min_height="400"
+ min_width="450"
name="floater_search"
help_topic="floater_search"
save_rect="true"
single_instance="true"
- title="Search [SECOND_LIFE]"
- width="620">
- <floater.string
- name="search_url">
- http://eniac21.lindenlab.com:10001/viewer
- </floater.string>
+ title="FIND"
+ width="650">
<floater.string
name="loading_text">
Loading...
@@ -25,21 +21,20 @@
Done
</floater.string>
<layout_stack
- bottom="400"
+ bottom="595"
follows="left|right|top|bottom"
layout="topleft"
left="10"
name="stack1"
top="20"
- width="600">
+ width="630">
<layout_panel
- height="12"
layout="topleft"
left_delta="0"
- name="external_controls"
top_delta="0"
+ name="browser_layout"
user_resize="false"
- width="570">
+ width="630">
<web_browser
bottom="-10"
follows="left|right|top|bottom"
@@ -47,15 +42,28 @@
left="0"
name="browser"
top="0"
- width="570" />
+ height="555"
+ width="630" />
<text
follows="bottom|left"
height="16"
layout="topleft"
left_delta="0"
name="status_text"
- top_pad="4"
+ top_pad="7"
width="150" />
+ <text
+ visible="false"
+ follows="bottom|right"
+ height="16"
+ left_delta="0"
+ name="refresh_search"
+ left_pad="0"
+ right="-10"
+ halign="right"
+ width="450">
+ Redo search to reflect current God level
+ </text>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml
index 31d133ff9b..4e89df5a73 100644
--- a/indra/newview/skins/default/xui/en/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/en/floater_select_key.xml
@@ -1,33 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- border="true"
+ border="false"
can_close="false"
can_minimize="false"
- height="100"
+ height="90"
layout="topleft"
name="modal container"
width="240">
- <button
- height="20"
- label="Cancel"
- label_selected="Cancel"
- layout="topleft"
- left="138"
- name="Cancel"
- top="70"
- width="82" />
<text
type="string"
+ halign="center"
length="1"
follows="left|top"
- font="SansSerif"
- height="16"
+ height="30"
layout="topleft"
- left="20"
+ left="30"
name="Save item as:"
- top="10"
- width="200">
- Press a key to select
+ top="25"
+ word_wrap="true"
+ width="180">
+ Press a key to set your Speak button trigger.
</text>
+ <button
+ height="23"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ right="-10"
+ name="Cancel"
+ top_pad="8"
+ width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 8fedd0a89f..afc44c41b8 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -2,18 +2,18 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="450"
+ can_resize="true"
+ height="535"
layout="topleft"
name="sell land"
help_topic="sell_land"
single_instance="true"
- title="Sell Land"
+ title="SELL LAND"
width="313">
<scroll_container
color="DkGray2"
follows="left|top|right|bottom"
- height="435"
- min_height="300"
+ height="520"
layout="topleft"
name="profile_scroll"
reserve_scroll_corner="true"
@@ -32,63 +32,47 @@
enabled="false"
follows="top|left"
height="135"
- layout="topleft"
left="60"
name="info_image"
top="20"
width="180" />
<text
- type="string"
- length="1"
top="150"
follows="top|left"
- layout="topleft"
left="16"
name="info_parcel_label"
width="48">
Parcel:
</text>
<text
- type="string"
- length="1"
top_delta="0"
follows="top|left"
height="16"
- layout="topleft"
left="56"
name="info_parcel"
right="-20">
PARCEL NAME
</text>
<text
- type="string"
- length="1"
follows="top|left"
- layout="topleft"
left="16"
name="info_size_label"
width="48">
Size:
</text>
<text
- type="string"
- length="1"
follows="top|left"
top_delta="0"
height="32"
- layout="topleft"
left="56"
name="info_size"
right="-20">
[AREA] m²
</text>
<text
- type="string"
- length="1"
follows="top|left"
font="SansSerifBig"
height="24"
- layout="topleft"
left="16"
name="info_action"
text_color="white"
@@ -96,55 +80,31 @@
width="200">
To sell this parcel:
</text>
- <icon
- follows="top|left"
- height="64"
- image_name="badge_note.j2c"
- layout="topleft"
- left="0"
- name="step_price"
- top="206"
- width="64" />
<text
- type="string"
- length="1"
- bottom_delta="-38"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
- left="72"
- name="price_label"
- right="-20">
- Set a price:
+ left="30"
+ name="price_label">
+ 1. Set a price:
</text>
<text
- type="string"
- length="1"
follows="top|left"
height="16"
- layout="topleft"
- left="72"
- name="price_text"
- right="-20">
+ left="40"
+ name="price_text">
Choose an appropriate price.
</text>
<text
- type="string"
- length="1"
height="16"
- layout="topleft"
- left="72"
+ left="40"
name="price_ld"
width="20">
L$
</text>
<line_editor
- type="string"
- length="1"
follows="top|left"
height="18"
- layout="topleft"
left_delta="20"
name="price"
top_delta="0"
@@ -152,60 +112,40 @@
0
</line_editor>
<text
- type="string"
- length="1"
height="16"
- layout="topleft"
- left="72"
+ left="40"
name="price_per_m"
top_delta="25"
width="200">
(L$[PER_METER] per m²)
</text>
- <icon
- follows="top|left"
- height="64"
- image_name="badge_note.j2c"
- layout="topleft"
- left="0"
- name="step_sell_to"
- width="64" />
<text
- type="string"
- length="1"
- bottom_delta="-38"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
- left="72"
- name="sell_to_label"
- right="-20">
- Sell the land to:
+ left="30"
+ name="sell_to_label">
+ 2. Sell the land to:
</text>
<text
- type="string"
- length="1"
follows="top|left"
height="25"
- layout="topleft"
- left="72"
+ left="40"
word_wrap="true"
name="sell_to_text"
right="-20">
Choose whether to sell to anyone or a particular buyer.
</text>
<combo_box
- follows="top|right"
+ follows="top|left"
height="18"
- layout="topleft"
left_delta="0"
name="sell_to"
top_delta="32"
width="130">
<combo_box.item
enabled="false"
- label="-- select one --"
+ label="- Select one -"
name="--selectone--"
value="select" />
<combo_box.item
@@ -219,67 +159,46 @@
</combo_box>
<line_editor
enabled="false"
- follows="top|right"
+ follows="top|left"
height="18"
- layout="topleft"
left_delta="0"
name="sell_to_agent"
top_pad="4"
width="130" />
<button
height="20"
- font="SansSerifSmall"
label="Select"
- layout="topleft"
left_pad="5"
name="sell_to_select_agent"
top_delta="0"
width="60" />
- <icon
- follows="top|left"
- height="64"
- image_name="badge_note.j2c"
- layout="topleft"
- left="0"
- name="step_sell_objects"
- width="64" />
<text
- type="string"
- length="1"
- bottom_delta="-38"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
- left="72"
- name="sell_objects_label"
- right="-20">
- Sell the objects with the land?
+ left="30"
+ name="sell_objects_label">
+ 3. Sell the objects with the land?
</text>
<text
- type="string"
- length="1"
font="SansSerifSmall"
follows="top|left"
height="25"
- layout="topleft"
word_wrap="true"
- left="72"
+ left="40"
name="sell_objects_text">
Land owner&apos;s transferable objects on parcel will change ownership.
</text>
<radio_group
top_pad="5"
- follows="top|right"
+ follows="top|left"
height="40"
- layout="topleft"
- left="72"
+ left="40"
name="sell_objects"
- right="420">
+ right="-20">
<radio_item
bottom="40"
height="0"
- layout="topleft"
left="10"
name="none"
visible="false" />
@@ -287,34 +206,27 @@
bottom="20"
height="16"
label="No, keep ownership of objects"
- layout="topleft"
left="10"
name="no" />
<radio_item
bottom="40"
height="16"
label="Yes, sell objects with land"
- layout="topleft"
left="10"
name="yes" />
</radio_group>
<button
height="20"
- font="SansSerifSmall"
label="Show Objects"
- layout="topleft"
name="show_objects"
- left="100"
+ left="70"
top_pad="10"
width="110" />
<text
- type="string"
- length="1"
bottom_delta="30"
follows="top|left"
font="SansSerifBig"
height="16"
- layout="topleft"
left="16"
name="nag_message_label"
right="-20">
@@ -323,19 +235,15 @@
<button
follows="bottom|left"
height="20"
- font="SansSerifSmall"
label="Set Land For Sale"
- layout="topleft"
left_delta="0"
name="sell_btn"
top_pad="10"
width="130" />
<button
- follows="bottom|right"
+ follows="bottom|left"
height="20"
- font="SansSerifSmall"
label="Cancel"
- layout="topleft"
left_pad="30"
name="cancel_btn"
top_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
index 02b3cee97c..3ed2bd7206 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
@@ -6,7 +6,7 @@
layout="topleft"
name="settings_debug"
help_topic="settings_debug"
- title="Debug Settings"
+ title="DEBUG SETTINGS"
width="350">
<combo_box
allow_text_entry="true"
@@ -30,26 +30,29 @@
top_pad="10"
width="320"
word_wrap="true" />
- <combo_box
- follows="top|left"
- height="20"
- layout="topleft"
- left_delta="0"
- name="boolean_combo"
- top_pad="10"
- visible="false"
- width="100">
- <combo_box.item
- label="TRUE"
- name="TRUE"
- value="true" />
- <combo_box.item
- label="FALSE"
- name="FALSE"
- value="" />
- <combo_box.commit_callback
- function="CommitSettings" />
- </combo_box>
+ <radio_group
+ follows="top|left"
+ height="30"
+ layout="topleft"
+ left_delta="0"
+ name="boolean_combo"
+ top_pad="10"
+ visible="false"
+ tab_stop="true"
+ width="100">
+ <radio_item
+ top_pad="5"
+ label="TRUE"
+ name="TRUE"
+ value="true" />
+ <radio_item
+ top_pad="5"
+ label="FALSE"
+ name="FALSE"
+ value="" />
+ <commit_callback
+ function="CommitSettings" />
+ </radio_group>
<line_editor
height="20"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 4f2be37ade..1ab3dda52c 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -2,106 +2,107 @@
<floater
legacy_header_height="18"
can_minimize="false"
+ can_close="true"
follows="left|top"
- height="526"
+ height="516"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
save_rect="true"
- title="Snapshot Preview"
+ save_visibility="true"
+ title="SNAPSHOT PREVIEW"
width="215">
<floater.string
name="unknown">
unknown
</floater.string>
- <text
- type="string"
- length="1"
- follows="top|left"
- height="15"
- layout="topleft"
- left="10"
- name="type_label"
- top="25"
- width="195">
- Snapshot destination
- </text>
<radio_group
- height="60"
+ height="58"
label="Snapshot type"
layout="topleft"
- left_delta="0"
+ left="10"
name="snapshot_type_radio"
- top_pad="5"
- width="195">
+ top="25"
+ width="205">
<radio_item
bottom="19"
height="16"
- label="Send via email"
+ label="Email"
layout="topleft"
name="postcard" />
<radio_item
bottom="38"
height="16"
- label="Save to your inventory (L$[AMOUNT])"
+ label="My inventory (L$[AMOUNT])"
layout="topleft"
name="texture" />
<radio_item
bottom="57"
height="16"
- label="Save to your hard drive"
+ label="Save to my computer"
layout="topleft"
name="local" />
</radio_group>
+ <ui_ctrl
+ height="90"
+ width="90"
+ layout="topleft"
+ name="thumbnail_placeholder"
+ top_pad="6"
+ follows="left|top"
+ left="10"
+ />
<text
type="string"
+ font="SansSerifSmall"
length="1"
follows="left|top"
- height="25"
+ height="14"
layout="topleft"
+ right="-5"
left_delta="0"
+ halign="right"
name="file_size_label"
- top_pad="106"
+ top_pad="10"
width="195">
- File size: [SIZE] KB
+ [SIZE] KB
</text>
<button
follows="left|top"
- height="20"
- label="Refresh Snapshot"
+ height="22"
+ image_overlay="Refresh_Off"
layout="topleft"
- left_delta="0"
+ left="10"
name="new_snapshot_btn"
- top_delta="15"
- width="195" />
+ width="23" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Send"
layout="topleft"
- left_delta="0"
+ left_pad="5"
+ right="-5"
name="send_btn"
- top_pad="2"
- width="105" />
+ width="100" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Save (L$[AMOUNT])"
layout="topleft"
- left_delta="0"
+ right="-5"
name="upload_btn"
top_delta="0"
- width="105" />
+ width="100" />
<flyout_button
follows="left|top"
- height="20"
+ height="23"
label="Save"
layout="topleft"
- left_delta="0"
+ right="-5"
name="save_btn"
tool_tip="Save image to a file"
top_delta="0"
- width="105">
+ width="100">
<flyout_button.item
label="Save"
value="save" />
@@ -109,54 +110,51 @@
label="Save As..."
value="save as" />
</flyout_button>
- <button
+ <button
follows="left|top"
- height="20"
- label="Cancel"
- layout="topleft"
- left_pad="5"
- name="discard_btn"
- top_delta="0"
- width="85" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="20"
- label="More &gt;&gt;"
+ height="23"
+ label="More"
layout="topleft"
left="10"
name="more_btn"
tool_tip="Advanced options"
- top="270"
width="80" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="20"
- label="&lt;&lt; Less"
+ height="23"
+ label="Less"
layout="topleft"
left_delta="0"
name="less_btn"
tool_tip="Advanced options"
top_delta="0"
width="80" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ right="-5"
+ left_pad="5"
+ name="discard_btn"
+ width="100" />
<text
type="string"
length="1"
follows="top|left"
- height="15"
+ height="12"
layout="topleft"
- left_delta="0"
+ left="10"
name="type_label2"
top_pad="5"
- width="115">
+ width="120">
Size
</text>
<text
type="string"
length="1"
follows="top|left"
- height="15"
+ height="12"
layout="topleft"
left_pad="5"
name="format_label"
@@ -165,13 +163,12 @@
Format
</text>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left="10"
name="postcard_size_combo"
- top="312"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -194,13 +191,13 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left_delta="0"
name="texture_size_combo"
top_delta="0"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -223,13 +220,13 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left_delta="0"
name="local_size_combo"
top_delta="0"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -264,12 +261,11 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Format"
layout="topleft"
left_pad="5"
name="local_format_combo"
- top_delta="0"
width="70">
<combo_box.item
label="PNG"
@@ -288,13 +284,13 @@
height="20"
increment="32"
label="Width"
- label_width="30"
+ label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="snapshot_width"
- top="337"
+ top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
@@ -303,7 +299,7 @@
height="20"
increment="32"
label="Height"
- label_width="35"
+ label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
@@ -313,7 +309,7 @@
width="95" />
<check_box
bottom_delta="20"
- label="Constrain Proportions"
+ label="Constrain proportions"
layout="topleft"
left="10"
name="keep_aspect_check" />
@@ -323,32 +319,32 @@
height="15"
increment="1"
initial_value="75"
- label="Image Quality"
+ label="Image quality"
+ label_width="100"
layout="topleft"
left_delta="0"
max_val="100"
name="image_quality_slider"
top_pad="5"
- width="210" />
+ width="205" />
<text
type="string"
length="1"
follows="left|top"
- height="20"
+ height="13"
layout="topleft"
- left_delta="0"
+ left="10"
name="layer_type_label"
- top_pad="8"
+ top_pad="5"
width="50">
Capture:
</text>
<combo_box
- height="20"
+ height="23"
label="Image Layers"
layout="topleft"
- left_delta="50"
+ left="30"
name="layer_types"
- top_delta="-3"
width="145">
<combo_box.item
label="Colors"
@@ -358,39 +354,40 @@
label="Depth"
name="Depth"
value="depth" />
- <combo_box.item
- label="Object Mattes"
- name="ObjectMattes"
- value="objects" />
</combo_box>
<check_box
- bottom_delta="20"
- label="Show interface in snapshot"
+ label="Interface"
layout="topleft"
- left="10"
+ left="30"
+ top_pad="10"
+ width="180"
name="ui_check" />
<check_box
- bottom_delta="20"
- label="Show HUD objects in snapshot"
+ label="HUDs"
layout="topleft"
- left="10"
+ left="30"
+ top_pad="10"
+ width="180"
name="hud_check" />
<check_box
- bottom_delta="20"
label="Keep open after saving"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="keep_open_check" />
<check_box
- bottom_delta="20"
- label="Freeze frame (fullscreen preview)"
+ label="Freeze frame (fullscreen)"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="freeze_frame_check" />
<check_box
- bottom_delta="20"
label="Auto-refresh"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="auto_snapshot_check" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sound_preview.xml b/indra/newview/skins/default/xui/en/floater_sound_preview.xml
index 6145b722f1..ca54ee6604 100644
--- a/indra/newview/skins/default/xui/en/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_sound_preview.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="Sound Preview"
help_topic="sound_preview"
- title="sound.wav"
+ title="SOUND.WAV"
width="300">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_statistics.xml b/indra/newview/skins/default/xui/en/floater_statistics.xml
index ab783b0735..3a4e845141 100644
--- a/indra/newview/skins/default/xui/en/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/en/floater_statistics.xml
@@ -8,5 +8,5 @@
mouse_opaque="false"
name="stats floater"
help_topic="stats_floater"
- title="Statistics"
+ title="STATISTICS"
width="250" />
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index bdc2874281..f9dacf0207 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -9,7 +9,7 @@
help_topic="statistics"
save_rect="true"
save_visibility="true"
- title="Statistics"
+ title="STATISTICS"
width="250">
<scroll_container
follows="top|left|bottom|right"
@@ -405,179 +405,179 @@
show_bar="false"
show_mean="false" >
</stat_bar>
+ </stat_view>
- <stat_bar
- name="simagentups"
- label="Agent Updates/Sec"
- stat="simagentups"
- precision="1"
- bar_min="0.f"
- bar_max="100.f"
- tick_spacing="25.f"
- label_spacing="50.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simagentups"
+ label="Agent Updates/Sec"
+ stat="simagentups"
+ precision="1"
+ bar_min="0.f"
+ bar_max="100.f"
+ tick_spacing="25.f"
+ label_spacing="50.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simmainagents"
- label="Main Agents"
- stat="simmainagents"
- precision="0"
- bar_min="0.f"
- bar_max="80.f"
- tick_spacing="10.f"
- label_spacing="40.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simmainagents"
+ label="Main Agents"
+ stat="simmainagents"
+ precision="0"
+ bar_min="0.f"
+ bar_max="80.f"
+ tick_spacing="10.f"
+ label_spacing="40.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simchildagents"
- label="Child Agents"
- stat="simchildagents"
- precision="0"
- bar_min="0.f"
- bar_max="40.f"
- tick_spacing="5.f"
- label_spacing="10.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simchildagents"
+ label="Child Agents"
+ stat="simchildagents"
+ precision="0"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="5.f"
+ label_spacing="10.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simobjects"
- label="Objects"
- stat="simobjects"
- precision="0"
- bar_min="0.f"
- bar_max="30000.f"
- tick_spacing="5000.f"
- label_spacing="10000.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simobjects"
+ label="Objects"
+ stat="simobjects"
+ precision="0"
+ bar_min="0.f"
+ bar_max="30000.f"
+ tick_spacing="5000.f"
+ label_spacing="10000.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simactiveobjects"
- label="Active Objects"
- stat="simactiveobjects"
- precision="0"
- bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simactiveobjects"
+ label="Active Objects"
+ stat="simactiveobjects"
+ precision="0"
+ bar_min="0.f"
+ bar_max="800.f"
+ tick_spacing="100.f"
+ label_spacing="200.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simactivescripts"
- label="Active Scripts"
- stat="simactivescripts"
- precision="0"
- bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simactivescripts"
+ label="Active Scripts"
+ stat="simactivescripts"
+ precision="0"
+ bar_min="0.f"
+ bar_max="800.f"
+ tick_spacing="100.f"
+ label_spacing="200.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simscripteps"
- label="Script Events"
- stat="simscripteps"
- unit_label="eps"
- precision="0"
- bar_min="0.f"
- bar_max="20000.f"
- tick_spacing="2500.f"
- label_spacing="5000.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simscripteps"
+ label="Script Events"
+ stat="simscripteps"
+ unit_label="eps"
+ precision="0"
+ bar_min="0.f"
+ bar_max="20000.f"
+ tick_spacing="2500.f"
+ label_spacing="5000.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="siminpps"
- label="Packets In"
- stat="siminpps"
- unit_label="pps"
- precision="0"
- bar_min="0.f"
- bar_max="2000.f"
- tick_spacing="250.f"
- label_spacing="1000.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="siminpps"
+ label="Packets In"
+ stat="siminpps"
+ unit_label="pps"
+ precision="0"
+ bar_min="0.f"
+ bar_max="2000.f"
+ tick_spacing="250.f"
+ label_spacing="1000.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simoutpps"
- label="Packets Out"
- stat="simoutpps"
- unit_label="pps"
- precision="0"
- bar_min="0.f"
- bar_max="2000.f"
- tick_spacing="250.f"
- label_spacing="1000.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simoutpps"
+ label="Packets Out"
+ stat="simoutpps"
+ unit_label="pps"
+ precision="0"
+ bar_min="0.f"
+ bar_max="2000.f"
+ tick_spacing="250.f"
+ label_spacing="1000.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simpendingdownloads"
- label="Pending Downloads"
- stat="simpendingdownloads"
- precision="0"
- bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simpendingdownloads"
+ label="Pending Downloads"
+ stat="simpendingdownloads"
+ precision="0"
+ bar_min="0.f"
+ bar_max="800.f"
+ tick_spacing="100.f"
+ label_spacing="200.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simpendinguploads"
- label="Pending Uploads"
- stat="simpendinguploads"
- precision="0"
- bar_min="0.f"
- bar_max="100.f"
- tick_spacing="25.f"
- label_spacing="50.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
+ <stat_bar
+ name="simpendinguploads"
+ label="Pending Uploads"
+ stat="simpendinguploads"
+ precision="0"
+ bar_min="0.f"
+ bar_max="100.f"
+ tick_spacing="25.f"
+ label_spacing="50.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
- <stat_bar
- name="simtotalunackedbytes"
- label="Total Unacked Bytes"
- stat="simtotalunackedbytes"
- unit_label="kb"
- precision="0"
- bar_min="0.f"
- bar_max="100000.f"
- tick_spacing="25000.f"
- label_spacing="50000.f"
- show_per_sec="false"
- show_bar="false"
- show_mean="false" >
- </stat_bar>
- </stat_view>
+ <stat_bar
+ name="simtotalunackedbytes"
+ label="Total Unacked Bytes"
+ stat="simtotalunackedbytes"
+ unit_label="kb"
+ precision="0"
+ bar_min="0.f"
+ bar_max="100000.f"
+ tick_spacing="25000.f"
+ label_spacing="50000.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
<stat_view
name="simperf"
diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml
index e1f07a49e7..005952f3f2 100644
--- a/indra/newview/skins/default/xui/en/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml
@@ -3,23 +3,33 @@
legacy_header_height="18"
bevel_style="in"
left="0"
- top="0"
+ top="0"
follows="right|bottom"
layout="topleft"
- name="notification_chiclet"
+ name="sys_well_window"
help_topic="notification_chiclet"
save_rect="true"
- title="NOTIFICATIONS"
+ title="NOTIFICATIONS"
width="320"
min_width="320"
height="23"
- can_minimize="true"
+ can_minimize="false"
can_tear_off="false"
- can_resize="false"
+ can_resize="true"
can_drag_on_left="false"
- can_close="false"
can_dock="true"
+ save_visibility="true"
+ single_instance="true"
>
+ <string
+ name="title_im_well_window">
+ CONVERSATIONS
+ </string>
+ <string
+ name="title_notification_well_window">
+ NOTIFICATIONS
+ </string>
+
<flat_list_view
color="FloaterDefaultBackgroundColor"
follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index faf1a378f2..da412ed8a0 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Explicit left edge to avoid overlapping build tools -->
<floater
legacy_header_height="18"
height="250"
layout="topleft"
+ left="300"
name="telehub"
help_topic="telehub"
- title="Telehub"
- width="280">
+ title="TELEHUB"
+ width="330">
<text
type="string"
length="1"
@@ -16,7 +18,7 @@
left="10"
name="status_text_connected"
top="24"
- width="200">
+ width="315">
Telehub connected to object [OBJECT]
</text>
<text
@@ -28,7 +30,7 @@
left_delta="0"
name="status_text_not_connected"
top_delta="0"
- width="200">
+ width="315">
No telehub connected.
</text>
<text
@@ -40,7 +42,7 @@
left_delta="0"
name="help_text_connected"
top_delta="16"
- width="260">
+ width="315">
To remove, click Disconnect.
</text>
<text
@@ -52,82 +54,73 @@
left_delta="0"
name="help_text_not_connected"
top_delta="0"
- width="260">
+ width="315">
Select object and click Connect Telehub.
</text>
<button
follows="top|left"
- font="SansSerifSmall"
- height="20"
+ height="23"
label="Connect Telehub"
layout="topleft"
left_delta="0"
name="connect_btn"
top_delta="20"
- width="110" />
+ width="130" />
<button
follows="top|left"
- font="SansSerifSmall"
- height="20"
+ height="23"
label="Disconnect"
layout="topleft"
left_pad="10"
name="disconnect_btn"
top_delta="0"
- width="110" />
+ width="130" />
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="14"
layout="topleft"
left="10"
name="spawn_points_text"
top="84"
- width="200">
+ width="315">
Spawn Points (positions, not objects):
</text>
<scroll_list
follows="left|top"
height="60"
layout="topleft"
- left_delta="0"
name="spawn_points_list"
- top_delta="16"
- width="230" />
+ width="315" />
<button
follows="top|left"
- font="SansSerifSmall"
- height="20"
+ height="23"
label="Add Spawn"
layout="topleft"
- left_delta="0"
name="add_spawn_point_btn"
- top_pad="5"
- width="110" />
+ width="130" />
<button
follows="top|left"
- font="SansSerifSmall"
- height="20"
+ height="23"
label="Remove Spawn"
layout="topleft"
left_pad="10"
name="remove_spawn_point_btn"
- top_delta="0"
- width="110" />
+ width="130" />
<text
type="string"
length="1"
follows="top|left"
- height="80"
+ height="56"
layout="topleft"
left="10"
name="spawn_point_help"
- top="190"
- width="260">
- Select object and click Add to specify position.
-You may then move or delete the object.
+ word_wrap="true"
+ width="317">
+ Select object and click "Add Spawn" to specify position.
+You can then move or delete the object.
Positions are relative to the telehub center.
-Select item in list to show position in world.
+Select an item in list to highlight it inworld.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml
index 89a1ddda99..bf0a774e76 100644
--- a/indra/newview/skins/default/xui/en/floater_test_button.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_button.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_button"
help_topic="floater_test_button"
+ translate="false"
width="500">
<button
height="23"
@@ -23,7 +24,6 @@
name="bottom_delta_button" />
<button
bottom_delta="30"
- font="SansSerifSmall"
height="23"
label="SansSerifSmall"
layout="topleft"
@@ -96,7 +96,6 @@
layout="topleft"
left="200"
name="image_button"
- picture_style="true"
top="20"
width="16" />
<button
@@ -107,7 +106,6 @@
layout="topleft"
left_delta="0"
name="image_color_button"
- picture_style="true"
top_pad="10"
width="16" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml
index 9977e85a9d..1935edfcc1 100644
--- a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_checkbox"
help_topic="floater_test_checkbox"
+ translate="false"
width="400">
<check_box
control_name="ShowStartLocation"
diff --git a/indra/newview/skins/default/xui/en/floater_test_combobox.xml b/indra/newview/skins/default/xui/en/floater_test_combobox.xml
index 317d8f5ba8..45e2e34da7 100644
--- a/indra/newview/skins/default/xui/en/floater_test_combobox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_combobox.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_combobox"
help_topic="floater_test_combobox"
+ translate="false"
width="400">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
index c954607ffe..209285da2e 100644
--- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
@@ -6,7 +6,8 @@
layout="topleft"
name="floater_test_inspectors"
help_topic="floater_test_inspectors"
- title="Test Inspectors"
+ title="TEST INSPECTORS"
+ translate="false"
width="400">
<text
height="20"
@@ -115,10 +116,10 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect
</text>
@@ -126,12 +127,11 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl_group"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect
</text>
-
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_layout.xml b/indra/newview/skins/default/xui/en/floater_test_layout.xml
index c6acb7c96e..94f7e0b798 100644
--- a/indra/newview/skins/default/xui/en/floater_test_layout.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_layout.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_layout"
help_topic="floater_test_layout"
+ translate="false"
width="500">
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
index e017d404c6..2894ad2a32 100644
--- a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
@@ -2,10 +2,11 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="400"
+ height="500"
layout="topleft"
name="floater_test_line_editor"
help_topic="floater_test_line_editor"
+ translate="false"
width="400">
<line_editor
height="20"
@@ -18,7 +19,18 @@
Enabled line editor
</line_editor>
<line_editor
- enabled="false"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="ascii_line_editor"
+ prevalidate_callback="ascii"
+ tool_tip="ascii line editor"
+ top_pad="10"
+ width="200">
+ ASCII only line editor
+ </line_editor>
+ <line_editor
+ enabled="false"
height="20"
layout="topleft"
left_delta="0"
@@ -51,6 +63,34 @@
width="200">
Disabled red-text line editor
</line_editor>
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="left_pad_editor"
+ text_pad_left="25"
+ top_pad="10"
+ width="200">
+ 25 px left text padding
+ </line_editor>
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="left_pad_editor"
+ text_pad_right="75"
+ top_pad="10"
+ width="200">
+ 75 px right text padding
+ </line_editor>
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="left_pad_editor"
+ text_pad_left="25"
+ text_pad_right="75"
+ top_pad="10"
+ width="200">
+ 25 px left 75 px right text padding
+ </line_editor>
<!-- "search_editor" is a specialized line_editor that shows read-only
help text until the user clicks in the widget. -->
<search_editor
diff --git a/indra/newview/skins/default/xui/en/floater_test_list_view.xml b/indra/newview/skins/default/xui/en/floater_test_list_view.xml
index 1d2086d9bc..32ccc31dfd 100644
--- a/indra/newview/skins/default/xui/en/floater_test_list_view.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_list_view.xml
@@ -6,28 +6,7 @@
layout="topleft"
name="floater_test_list_view"
help_topic="floater_test_list_view"
+ translate="false"
width="400">
- <list_view
- height="300"
- left="10"
- name="test_list_view"
- top="28"
- width="300" />
- <button
- name="test_1_btn"
- label="Test 1"
- top="350"
- left="10"
- height="20"
- width="80"
- commit_callback.function="TestListView.Test1" />
- <button
- name="test_2_btn"
- label="Test 2"
- top_delta="0"
- left_pad="10"
- height="20"
- width="80"
- commit_callback.function="TestListView.Test2" />
-
+ <!-- intentionally empty -->
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_navigation_bar.xml b/indra/newview/skins/default/xui/en/floater_test_navigation_bar.xml
index c6b4cca6b9..f4a50ecc96 100644
--- a/indra/newview/skins/default/xui/en/floater_test_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_navigation_bar.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_navigation_bar"
help_topic="floater_test_navigation_bar"
+ translate="false"
width="900">
<panel
name="navigation_bar"
diff --git a/indra/newview/skins/default/xui/en/floater_test_radiogroup.xml b/indra/newview/skins/default/xui/en/floater_test_radiogroup.xml
index 7ef2d97cdc..db14ecae83 100644
--- a/indra/newview/skins/default/xui/en/floater_test_radiogroup.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_radiogroup.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_radiogroup"
help_topic="floater_test_radiogroup"
+ translate="false"
width="400">
<radio_group
height="54"
diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml
index 57d8e686ce..20bd555a03 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slider.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml
@@ -2,10 +2,11 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="400"
+ height="500"
layout="topleft"
name="floater_test_slider"
help_topic="floater_test_slider"
+ translate="false"
width="450">
<slider
height="20"
@@ -57,6 +58,13 @@
width="200" />
<slider_bar
bottom="320"
+ height="100"
+ left="20"
+ name="slider_bar_vertical"
+ orientation="vertical"
+ width="20" />
+ <slider_bar
+ bottom="300"
height="20"
increment="1"
initial_value="2.0"
@@ -64,6 +72,7 @@
layout="topleft"
max_val="5"
min_val="1"
+ left_pad="20"
name="slider_bar"
width="300" />
<slider
@@ -76,4 +85,17 @@
name="red_slider"
text_color="red"
text_width="40" />
+ <slider
+ width ="140"
+ bottom="490"
+ decimal_digits="1"
+ height="100"
+ left="20"
+ label="Red Slider Vertical"
+ label_width="100"
+ layout="topleft"
+ name="red_slider_vertical"
+ text_color="red"
+ orientation="vertical"
+ text_width="20" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_spinner.xml b/indra/newview/skins/default/xui/en/floater_test_spinner.xml
index 3c44a4884d..acd49aa492 100644
--- a/indra/newview/skins/default/xui/en/floater_test_spinner.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_spinner.xml
@@ -6,6 +6,7 @@
layout="topleft"
name="floater_test_spinner"
help_topic="floater_test_spinner"
+ translate="false"
width="450">
<spinner
height="32"
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
new file mode 100644
index 0000000000..b730f0e511
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="600"
+ layout="topleft"
+ name="floater_test_text_editor"
+ translate="false"
+ width="800">
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left="10"
+ name="test_text_editor"
+ tool_tip="text editor"
+ top="25"
+ width="200">
+ Text Editor
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="SansSerif"
+ left="10"
+ name="test_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+ This contains long text and should scroll horizontally to the right
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="SansSerif"
+ left="10"
+ name="numeric_text_editor"
+ tool_tip="text editor for numeric text entry only"
+ top_pad="10"
+ text_type="int"
+ width="200">
+ This is text that is NOT a number, so shouldn't appear
+ </text_editor>
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index f39d27761c..2df9bb35fe 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -2,172 +2,253 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="400"
+ height="600"
layout="topleft"
name="floater_test_textbox"
help_topic="floater_test_textbox"
- width="400">
+ translate="false"
+ width="800">
<text
type="string"
length="1"
- height="10"
+ height="90"
layout="topleft"
left="10"
- top="30"
- width="300">
- Bottom and left specified
- </text>
- <text
- type="string"
- length="1"
- height="10"
- layout="topleft"
- left_delta="200"
- top_delta="0"
- width="300">
- Bottom delta left delta
- </text>
- <text
- type="string"
- length="1"
- height="10"
- layout="topleft"
- left="10"
- top="50"
- width="300">
- Bottom delta -20
- </text>
- <text
- type="string"
- length="1"
- height="10"
- layout="topleft"
- left_delta="0"
top_pad="30"
width="300">
First line of multiple lines
- Second line of multiple lines
- </text>
- <text
- type="string"
- length="1"
- font="SansSerif"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="30"
- width="300">
- font SansSerif
- </text>
- <text
- type="string"
- length="1"
- follows="bottom|right"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- follows bottom right
- </text>
- <text
- type="string"
- length="1"
- font="SansSerifSmall"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- font style BOLD
- </text>
- <text
- type="string"
- length="1"
- font="SansSerifSmall"
- font.style="BOLD|UNDERLINE"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- font style BOLD UNDERLINE
+Second line of multiple lines
+Third line of multiple lines
+Fourth line of multiple lines
+Fifth line of multiple lines
</text>
- <text
- type="string"
- length="1"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- font style UNDERLINE
- </text>
- <text
- type="string"
- length="1"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- Escaped greater than &gt;
- </text>
- <text
- type="string"
- length="1"
- bottom="390"
- label="N"
+ <text
+ clip_partial="true"
+ top_pad="10"
+ left="10"
+ width="267"
+ height="28"
+ layout="topleft"
+ follows="right|left"
+ text_color="white"
+ use_ellipses="true"
+ word_wrap="true"
+ mouse_opaque="false"
+ name="title" >
+ This text has word_wrap set true, use_ellipses set true, and clip_partial set true, so it should wrap around, spilling over to the last line, then clip the last partial line and show ellipses to indicate there is more text
+ </text>
+
+ <text
+ font="SansSerif"
+ font.style="BOLD"
+ height="10"
layout="topleft"
- left="10"
- name="right_aligned_text"
- width="380"
- halign="right"
- text_color="1 1 1 0.7"
- top_pad="10">
+ left_delta="0"
+ top_pad="10"
+ width="300">
+ SansSerif BOLD
+ </text>
+ <text
+ font="SansSerif"
+ font.style="BOLD|UNDERLINE"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ top_pad="10"
+ width="300">
+ SansSerif BOLD UNDERLINE
+ </text>
+ <text
+ bottom="390"
+ left="10"
+ name="right_aligned_text"
+ width="300"
+ halign="right"
+ top_pad="10">
Right aligned text
</text>
<text
- type="string"
- length="1"
bottom="390"
- label="N"
- layout="topleft"
left="10"
name="centered_text"
- width="380"
+ width="300"
halign="center"
- text_color="1 1 1 0.7"
top_pad="10">
Centered text
</text>
<text
- type="string"
- length="1"
- bottom="390"
- label="N"
- layout="topleft"
left="10"
- name="centered_text"
- width="380"
+ name="left_aligned_text"
+ width="300"
halign="left"
- text_color="1 1 1 0.7"
top_pad="10">
Left aligned text
</text>
<text
- type="string"
- length="1"
- bottom="390"
- label="N"
- layout="topleft"
+ left="10"
+ name="v_pad_text"
+ height="40"
+ width="300"
+ halign="left"
+ top_pad="10"
+ v_pad="10">
+ v_pad = 10, height = 40
+ </text>
+ <text
+ left="10"
+ name="v_pad_text"
+ height="40"
+ width="300"
+ halign="left"
+ top_pad="10"
+ h_pad="30">
+ h_pad = 30, height = 40
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ right="-10"
+ height="20"
+ follows="top|left"
+ font.name="SansSerifSmall"
+ name="test_text10"
+ tool_tip="text">
+ SansSerifSmall
+ The åŽæ–‡ç»†é»‘ brown fox ヒラキjumped over the lazy dog.
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ right="-10"
+ height="25"
+ follows="top|left"
+ font.name="SansSerifMedium"
+ name="test_text11"
+ tool_tip="text">
+ SansSerif
+ The åŽæ–‡ç»†é»‘ brown fox ヒラキjumped over the lazy dog.
+ </text>
+ <text
+ top_pad="10"
left="10"
- name="floater_map_north"
- right="30"
- text_color="1 1 1 0.7"
- top="370">
- N
+ right="-10"
+ follows="top|left"
+ height="26"
+ font.name="SansSerifLarge"
+ name="test_text12"
+ tool_tip="text">
+ SansSerifLarge
+ The åŽæ–‡ç»†é»‘ brown fox ヒラキjumped over the lazy dog.
</text>
+ <text
+ top_pad="10"
+ left="10"
+ height="35"
+ right="-10"
+ follows="top|left"
+ font.name="SansSerifHuge"
+ name="test_text13"
+ tool_tip="text">
+ SansSerifHuge
+ The åŽæ–‡ç»†é»‘ brown fox ヒラキjumped over the lazy dog.
+ </text>
+
+<!-- next column -->
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left="400"
+ name="test_text_editor"
+ tool_tip="text editor"
+ top="25"
+ width="200">
+ Text Editor
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left_delta="0"
+ name="long_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+Text Editor
+with multiple
+lines of text
+and hence a
+scroll bar
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left_delta="0"
+ max_length="65536"
+ name="blob_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200"
+ word_wrap="true">
+Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="Monospace"
+ left_delta="0"
+ name="monospace_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+Text Editor
+with multiple
+lines of text
+and hence a
+scroll bar gjyrrr
+ </text_editor>
+ <text_editor
+ border_visible="true"
+ height="50"
+ follows="top|left|bottom"
+ font="Monospace"
+ left_delta="0"
+ name="monospace_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+Text Editor
+with multiple
+lines of text
+and hence a
+scroll bar gjyrrr
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="SansSerif"
+ left_delta="0"
+ name="sansserif_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+Text Editor
+with multiple
+lines of text
+and hence a
+scroll bar gjyrrr
+ </text_editor>
+ <text
+ height="40"
+ follows="top|left|bottom"
+ layout="topleft"
+ name="test_text_box"
+ tool_tip="text box"
+ top_pad="5"
+ width="200">
+Text box
+with
+multiple lines
+and too many lines
+to actually fit
+ </text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
index 12d7e18762..80cb2723a0 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Sample "floater" window with examples of common widgets.
+<!-- Sample "floater" window with examples of common widgets.
Notes:
XML UI (XUI) files use spaces for indentation, not tabs.
@@ -16,17 +16,18 @@
-->
<floater
legacy_header_height="18"
- can_dock="true"
+ can_dock="true"
can_resize="true"
- title="Test Floater"
+ title="TEST FLOATER"
height="500"
- min_width="850"
- min_height="500"
+ min_width="850"
+ min_height="500"
layout="topleft"
name="floater_test_widgets"
help_topic="floater_test_widgets"
+ translate="false"
width="850">
-
+
<!-- Strings are used by C++ code for localization. They are not visible
unless the C++ code uses them to fill in another widget. -->
<floater.string
@@ -35,15 +36,15 @@
<floater.string
name="other_string"
value="Other String" />
-
+
<!-- Floaters can contain drop-down menus.
The menu_bar widget contains the inividual menus.
The width is automatically computed to fit the labels. -->
<menu_bar
height="18"
layout="topleft"
- follows="top|left"
- tool_tip="menu"
+ follows="top|left"
+ tool_tip="menu"
left="2"
name="test_menu_bar"
top="16">
@@ -71,7 +72,7 @@
name="test_menu_item_2" />
</menu>
</menu_bar>
-
+
<!-- "text" is one or more read-only lines of text.
It can be made clickable but this requires C++ code
support. URLs are not automatically underlined. -->
@@ -85,27 +86,25 @@
</text>
<!-- First column -->
-
+
<button
- height="20"
- follows="top|left"
+ follows="top|left"
label="Button"
layout="topleft"
left_delta="0"
name="test_button"
- tool_tip="button"
+ tool_tip="button"
top="80"
- width="100" />
+ width="100" />
<!-- "flyout_button" is a button that can spawn a menu -->
<flyout_button
- follows="top|left"
- height="20"
+ follows="top|left"
label="Flyout"
layout="topleft"
left_delta="0"
name="fly_btn"
top_pad="15"
- tool_tip="flyout button"
+ tool_tip="flyout button"
width="100">
<flyout_button.item
label="Item 1"
@@ -121,19 +120,24 @@
bottom_delta="35"
label="Checkbox"
layout="topleft"
- tool_tip="checkbox"
+ tool_tip="checkbox"
name="test_checkbox" />
+ <check_box
+ top_pad="5"
+ enabled="false"
+ label="Checkbox Disabled"
+ tool_tip="checkbox disabled"
+ name="test_checkbox_disabled" />
<!-- "combo_box" is a pop-menu of items. Optionally the box itself can
contain a general purpose line input editor, allowing the user to
provide input that is not a list item. -->
<combo_box
bottom_delta="35"
- follows="top|left"
- height="16"
+ follows="top|left"
width="150"
label="Combobox"
layout="topleft"
- tool_tip="combo box"
+ tool_tip="combo box"
name="test_combo_box">
<combo_box.item
name="item1"
@@ -149,21 +153,21 @@
image_name="icon_avatar_online.tga"
layout="topleft"
left_delta="0"
- tool_tip="icon"
+ tool_tip="icon"
name="test_icon"
top_pad="40"
width="16" />
- <!-- "line_editor" allows a single line of editable text input.
+ <!-- "line_editor" allows a single line of editable text input.
The contents of this XML node are used as the initial value for
the text. -->
<line_editor
height="20"
- follows="top|left"
+ follows="top|left"
layout="topleft"
left_delta="0"
name="test_line_editor"
top_pad="20"
- tool_tip="line editor"
+ tool_tip="line editor"
width="200">
Line Editor Sample Text
</line_editor>
@@ -176,18 +180,18 @@
layout="topleft"
left_delta="0"
name="search editor"
- tool_tip="search editor"
+ tool_tip="search editor"
top_pad="30"
width="200" />
<!-- "progress_bar" percent completed gets set in C++ code -->
<progress_bar
height="16"
- follows="top|left"
+ follows="top|left"
layout="topleft"
left_delta="0"
name="test_progress_bar"
top_pad="30"
- tool_tip="progress bar"
+ tool_tip="progress bar"
width="200" />
<!-- "stat_view" is a container for statistics graphs. It is only used
for debugging/diagnostic displays. -->
@@ -199,10 +203,10 @@
name="axis_view"
show_label="true"
top_pad="30"
- tool_tip="stat view"
+ tool_tip="stat view"
width="200">
<stat_bar
- width="100"
+ width="100"
bar_max="100"
bottom_delta="30"
label="Test Stat"
@@ -211,9 +215,9 @@
bar_min="20"
name="test_stat_bar" />
</stat_view>
-
+
<!-- New column -->
-
+
<!-- "radio_group" is a set of mutually exclusive choices, like the buttons
on a car radio that allow a single radio station to be chosen. -->
<radio_group
@@ -221,7 +225,7 @@
layout="topleft"
left_pad="90"
name="size_radio_group"
- tool_tip="radio group"
+ tool_tip="radio group"
top="80"
width="200">
<radio_item
@@ -237,10 +241,10 @@
<!-- "scroll_list" is a scrolling list of columnar data. -->
<scroll_list
bottom_delta="100"
- follows="top|left"
+ follows="top|left"
height="80"
draw_heading="true"
- tool_tip="scroll list"
+ tool_tip="scroll list"
layout="topleft">
<scroll_list.columns
dynamic_width="true"
@@ -262,29 +266,29 @@
<!-- "slider" is a horizontal input widget for numerical data. -->
<slider
bottom_delta="45"
- follows="top|left"
+ follows="top|left"
layout="topleft"
min_val="0"
max_val="100"
initial_value="20"
label="Slider"
name="test_slider"
- tool_tip="slider"
+ tool_tip="slider"
width="200" />
<!-- "spinner" is a numerical input widget with an up and down arrow to
change the value. -->
<spinner
bottom_delta="35"
- follows="top|left"
+ follows="top|left"
label="Spinner"
layout="topleft"
- label_width="45"
- name="test_spinner"
+ label_width="45"
+ name="test_spinner"
tool_tip="spinner"/>
<text
bottom_delta="50"
- follows="top|left"
- font.name="SansSerifSmall"
+ follows="top|left"
+ font.name="SansSerifSmall"
font.style = "UNDERLINE"
layout="topleft"
name="test_text"
@@ -293,23 +297,23 @@
</text>
<text
top_pad="10"
- follows="top|left"
+ follows="top|left"
layout="topleft"
- width="60"
- use_ellipses="true"
+ width="60"
+ use_ellipses="true"
name="test_text"
tool_tip="text">
Truncated text here
</text>
- <!-- "text_editor" is a multi-line text input widget, similar to
+ <!-- "text_editor" is a multi-line text input widget, similar to
textarea in HTML. -->
<text_editor
height="40"
- follows="top|left|bottom"
+ follows="top|left|bottom"
layout="topleft"
left_delta="0"
name="test_text_editor"
- tool_tip="text editor"
+ tool_tip="text editor"
top_pad="25"
width="200">
Text Editor
@@ -330,19 +334,19 @@ many
line to actually fit
</text>
<!-- And a third column -->
-
+
<!-- "tab_container" is a holder for multiple panels of UI widgets.
Tabs can appear at the top, bottom, or left of the container. -->
<tab_container
follows="all"
height="400"
layout="topleft"
- left="575"
+ left="525"
name="group_tab_container"
tab_position="top"
- tool_tip="tab container"
+ tool_tip="tab container"
top="80"
- width="250">
+ width="300">
<!-- "panel" is a container for widgets. It is automatically resized to
fit the parent tab_container. -->
<panel
@@ -353,7 +357,6 @@ line to actually fit
<!-- "color_swatch" displays a color and spawns a color picker when
clicked. -->
<color_swatch
- border_color="1 0 0 1"
can_apply_immediately="true"
color="0.3 0.6 0.9 1"
follows="left|top"
@@ -366,7 +369,6 @@ line to actually fit
top="10"
width="80" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="1 0 1 1"
follows="left|top"
@@ -378,6 +380,56 @@ line to actually fit
tool_tip="Color Swatch: Click to open Color Picker"
top_delta="0"
width="80" />
+ <text
+ top_pad="10"
+ left="10"
+ width="250"
+ follows="top|left"
+ font.name="Monospace"
+ name="test_text10"
+ tool_tip="text">
+ Monospace Button Flyout Checkbox
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ width="250"
+ follows="top|left"
+ font.name="SansSerifSmall"
+ name="test_text10"
+ tool_tip="text">
+ SansSerifSmall. РуÑÑкий 中文 (简体)
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ width="250"
+ follows="top|left"
+ font.name="SansSerif"
+ name="test_text11"
+ tool_tip="text">
+ SansSerif. РуÑÑкий 中文 (简体)
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ width="250"
+ follows="top|left"
+ font.name="SansSerifLarge"
+ name="test_text12"
+ tool_tip="text">
+ SansSerifLarge. РуÑÑкий 中文 (简体)
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ width="250"
+ follows="top|left"
+ font.name="SansSerifHuge"
+ name="test_text13"
+ tool_tip="text">
+ SansSerifHuge. РуÑÑкий 中文 (简体)
+ </text>
</panel>
<!-- panels can also refer to other floaters or panels -->
<panel
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 0a1f6e0e29..cad7d72ed7 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -9,7 +9,7 @@
min_width="410"
name="texture picker"
help_topic="texture_picker"
- title="Pick: Texture"
+ title="PICK: TEXTURE"
width="410">
<floater.string
name="choose_picture">
@@ -23,14 +23,16 @@
type="string"
length="1"
follows="left|top"
+ text_color="White"
+ font="SansSerifBig"
halign="center"
- height="14"
+ height="17"
layout="topleft"
left="4"
name="Multiple"
top="96"
width="163">
- Multiple
+ Multiple textures
</text>
<text
type="string"
@@ -42,12 +44,11 @@
name="unknown"
top_pad="80"
width="163">
- Dimensions: [DIMENSIONS]
+ Size: [DIMENSIONS]
</text>
<button
enabled="false"
follows="left|bottom"
- font="SansSerifSmall"
height="20"
label="Default"
label_selected="Default"
@@ -55,11 +56,10 @@
left_delta="0"
name="Default"
top_pad="4"
- width="64" />
+ width="80" />
<button
enabled="false"
follows="left|bottom"
- font="SansSerifSmall"
height="20"
label="None"
label_selected="None"
@@ -67,85 +67,84 @@
left_pad="4"
name="None"
top_delta="0"
- width="64" />
+ width="80" />
<button
follows="left|bottom"
- font="SansSerifSmall"
height="20"
label="Blank"
label_selected="Blank"
layout="topleft"
left="4"
name="Blank"
- top="232"
- width="64" />
- <check_box
- height="24"
+ top_pad="5"
+ width="80" />
+ <button
+ follows="left|bottom"
+ height="28"
+ image_selected="eye_button_active.tga"
+ image_unselected="eye_button_inactive.tga"
+ layout="topleft"
+ left_pad="50"
+ top_delta="3"
+ name="Pipette"
+ width="28" />
+ <check_box
+ follows="left|bottom"
+ height="20"
initial_value="true"
- label="Show Folders"
+ label="Apply now"
layout="topleft"
- left="175"
- name="show_folders_check"
- top="20"
- width="201" />
+ left="4"
+ name="apply_immediate_check"
+ top="262"
+ width="120" />
<filter_editor
follows="left|top|right"
- height="16"
- label="Type here to search"
+ height="23"
+ label="Filter Textures"
layout="topleft"
- left_delta="0"
+ left="175"
name="inventory search editor"
- top_delta="0"
+ top="20"
width="231" />
<inventory_panel
allow_multi_select="false"
- border="true"
- follows="left|top|right|bottom"
- height="216"
+ bg_visible="true"
+ bg_alpha_color="DkGray2"
+ border="false"
+ follows="all"
+ height="200"
layout="topleft"
left_delta="0"
name="inventory panel"
top_pad="4"
width="231" />
- <check_box
- follows="left|bottom"
- height="20"
- initial_value="true"
- label="Apply Immediately"
- layout="topleft"
- left="4"
- name="apply_immediate_check"
- top="262"
- width="150" />
- <button
- follows="left|bottom"
- height="32"
- image_selected="eye_button_active.tga"
- image_unselected="eye_button_inactive.tga"
+ <check_box
+ height="14"
+ initial_value="false"
+ label="Show folders"
layout="topleft"
- left="139"
- name="Pipette"
- picture_style="true"
- top="250"
- width="32" />
- <button
+ name="show_folders_check"
+ top_pad="0"
+ left_delta="-3"
+ width="200" />
+ <button
follows="right|bottom"
height="20"
- label="Cancel"
- label_selected="Cancel"
+ label="OK"
+ label_selected="OK"
layout="topleft"
- left="186"
- name="Cancel"
- top="262"
+ right="-120"
+ name="Select"
width="100" />
<button
follows="right|bottom"
height="20"
- label="Select"
- label_selected="Select"
+ label="Cancel"
+ label_selected="Cancel"
layout="topleft"
- left_pad="4"
- name="Select"
- top_delta="0"
+ right="-10"
+ left_pad="5"
+ name="Cancel"
width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index e6ac39e40b..d989282b9f 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -4,12 +4,12 @@
follows="left|top|right"
height="570"
layout="topleft"
- bg_opaque_image="Window_NoTitle_Foreground"
- bg_alpha_image="Window_NoTitle_Background"
+ bg_opaque_image="Window_NoTitle_Foreground"
+ bg_alpha_image="Window_NoTitle_Background"
name="toolbox floater"
help_topic="toolbox_floater"
save_rect="true"
- short_title="Build Tools"
+ short_title="BUILD TOOLS"
single_instance="true"
sound_flags="0"
width="280">
@@ -67,85 +67,75 @@
</floater.string>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Zoom"
- image_disabled_selected="Tool_Zoom"
- image_selected="Tool_Zoom"
- image_unselected="Tool_Zoom"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Zoom"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
left="10"
name="button focus"
- picture_style="true"
tool_tip="Focus"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Focus" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Grab"
- image_disabled_selected="Tool_Grab"
- image_selected="Tool_Grab"
- image_unselected="Tool_Grab"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Grab"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button move"
- picture_style="true"
tool_tip="Move"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Move" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Face"
- image_disabled_selected="Tool_Face"
- image_selected="Tool_Face"
- image_unselected="Tool_Face"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Face"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button edit"
- picture_style="true"
tool_tip="Edit"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Edit" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Create"
- image_disabled_selected="Tool_Create"
- image_selected="Tool_Create"
- image_unselected="Tool_Create"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Create"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button create"
- picture_style="true"
tool_tip="Create"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Create" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Dozer"
- image_disabled_selected="Tool_Dozer"
- image_selected="Tool_Dozer"
- image_unselected="Tool_Dozer"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Dozer"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button land"
- picture_style="true"
tool_tip="Land"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Land" />
@@ -267,6 +257,19 @@
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
+
+ <text
+ text_color="LtGray_50"
+ follows="top|left"
+ halign="left"
+ left="13"
+ name="RenderingCost"
+ tool_tip="Shows the rendering cost calculated for this object"
+ top_pad="9"
+ type="string"
+ width="100">
+ þ: [COUNT]
+ </text>
<check_box
control_name="ScaleUniform"
height="19"
@@ -295,10 +298,11 @@
name="checkbox snap to grid"
width="134" />
<combo_box
- height="19"
+ height="23"
layout="topleft"
follows="left|top"
name="combobox grid mode"
+ tool_tip="Choose the type of grid ruler for positioning the object"
width="108">
<combo_box.item
label="World grid"
@@ -320,11 +324,9 @@
image_disabled="ForwardArrow_Disabled"
image_selected="ForwardArrow_Press"
image_unselected="ForwardArrow_Off"
- picture_style="true"
- label_selected="Options"
layout="topleft"
name="Options..."
- tool_tip="Grid options"
+ tool_tip="See more grid options"
top_delta="0"
right="-10"
width="18"
@@ -332,17 +334,16 @@
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
- <button
+ <button
follows="left|top"
height="20"
image_disabled="Object_Cube"
image_disabled_selected="Object_Cube"
- image_selected="Object_Cube"
+ image_selected="Object_Cube_Selected"
image_unselected="Object_Cube"
layout="topleft"
left="4"
name="ToolCube"
- picture_style="true"
tool_tip="Cube"
top="51"
width="20" />
@@ -351,12 +352,11 @@
height="20"
image_disabled="Object_Prism"
image_disabled_selected="Object_Prism"
- image_selected="Object_Prism"
+ image_selected="Object_Prism_Selected"
image_unselected="Object_Prism"
layout="topleft"
left_delta="26"
name="ToolPrism"
- picture_style="true"
tool_tip="Prism"
top_delta="0"
width="20" />
@@ -365,12 +365,11 @@
height="20"
image_disabled="Object_Pyramid"
image_disabled_selected="Object_Pyramid"
- image_selected="Object_Pyramid"
+ image_selected="Object_Pyramid_Selected"
image_unselected="Object_Pyramid"
layout="topleft"
left_delta="26"
name="ToolPyramid"
- picture_style="true"
tool_tip="Pyramid"
top_delta="0"
width="20" />
@@ -379,12 +378,11 @@
height="20"
image_disabled="Object_Tetrahedron"
image_disabled_selected="Object_Tetrahedron"
- image_selected="Object_Tetrahedron"
+ image_selected="Object_Tetrahedron_Selected"
image_unselected="Object_Tetrahedron"
layout="topleft"
left_delta="26"
name="ToolTetrahedron"
- picture_style="true"
tool_tip="Tetrahedron"
top_delta="0"
width="20" />
@@ -393,12 +391,11 @@
height="20"
image_disabled="Object_Cylinder"
image_disabled_selected="Object_Cylinder"
- image_selected="Object_Cylinder"
+ image_selected="Object_Cylinder_Selected"
image_unselected="Object_Cylinder"
layout="topleft"
left_delta="26"
name="ToolCylinder"
- picture_style="true"
tool_tip="Cylinder"
top_delta="0"
width="20" />
@@ -407,12 +404,11 @@
height="20"
image_disabled="Object_Hemi_Cylinder"
image_disabled_selected="Object_Hemi_Cylinder"
- image_selected="Object_Hemi_Cylinder"
+ image_selected="Object_Hemi_Cylinder_Selected"
image_unselected="Object_Hemi_Cylinder"
layout="topleft"
left_delta="26"
name="ToolHemiCylinder"
- picture_style="true"
tool_tip="Hemicylinder"
top_delta="0"
width="20" />
@@ -421,12 +417,11 @@
height="20"
image_disabled="Object_Cone"
image_disabled_selected="Object_Cone"
- image_selected="Object_Cone"
+ image_selected="Object_Cone_Selected"
image_unselected="Object_Cone"
layout="topleft"
left_delta="26"
name="ToolCone"
- picture_style="true"
tool_tip="Cone"
top_delta="0"
width="20" />
@@ -435,12 +430,11 @@
height="20"
image_disabled="Object_Hemi_Cone"
image_disabled_selected="Object_Hemi_Cone"
- image_selected="Object_Hemi_Cone"
+ image_selected="Object_Hemi_Cone_Selected"
image_unselected="Object_Hemi_Cone"
layout="topleft"
left_delta="26"
name="ToolHemiCone"
- picture_style="true"
tool_tip="Hemicone"
top_delta="0"
width="20" />
@@ -449,12 +443,11 @@
height="20"
image_disabled="Object_Sphere"
image_disabled_selected="Object_Sphere"
- image_selected="Object_Sphere"
+ image_selected="Object_Sphere_Selected"
image_unselected="Object_Sphere"
layout="topleft"
left_delta="26"
name="ToolSphere"
- picture_style="true"
tool_tip="Sphere"
top_delta="0"
width="20" />
@@ -463,12 +456,11 @@
height="20"
image_disabled="Object_Hemi_Sphere"
image_disabled_selected="Object_Hemi_Sphere"
- image_selected="Object_Hemi_Sphere"
+ image_selected="Object_Hemi_Sphere_Selected"
image_unselected="Object_Hemi_Sphere"
layout="topleft"
left_delta="26"
name="ToolHemiSphere"
- picture_style="true"
tool_tip="Hemisphere"
top_delta="0"
width="20" />
@@ -477,12 +469,11 @@
height="20"
image_disabled="Object_Torus"
image_disabled_selected="Object_Torus"
- image_selected="Object_Torus"
+ image_selected="Object_Torus_Selected"
image_unselected="Object_Torus"
layout="topleft"
left="4"
name="ToolTorus"
- picture_style="true"
tool_tip="Torus"
top="77"
width="20" />
@@ -491,12 +482,11 @@
height="20"
image_disabled="Object_Tube"
image_disabled_selected="Object_Tube"
- image_selected="Object_Tube"
+ image_selected="Object_Tube_Selected"
image_unselected="Object_Tube"
layout="topleft"
left_delta="26"
name="ToolTube"
- picture_style="true"
tool_tip="Tube"
top_delta="0"
width="20" />
@@ -505,12 +495,11 @@
height="20"
image_disabled="Object_Ring"
image_disabled_selected="Object_Ring"
- image_selected="Object_Ring"
+ image_selected="Object_Ring_Selected"
image_unselected="Object_Ring"
layout="topleft"
left_delta="26"
name="ToolRing"
- picture_style="true"
tool_tip="Ring"
top_delta="0"
width="20" />
@@ -519,12 +508,11 @@
height="20"
image_disabled="Object_Tree"
image_disabled_selected="Object_Tree"
- image_selected="Object_Tree"
+ image_selected="Object_Tree_Selected"
image_unselected="Object_Tree"
layout="topleft"
left_delta="26"
name="ToolTree"
- picture_style="true"
tool_tip="Tree"
top_delta="0"
width="20" />
@@ -533,12 +521,12 @@
height="20"
image_disabled="Object_Grass"
image_disabled_selected="Object_Grass"
- image_selected="Object_Grass"
+ image_selected="Object_Grass_Selected"
image_unselected="Object_Grass"
+ image_overlay_color="Red"
layout="topleft"
left_delta="26"
name="ToolGrass"
- picture_style="true"
tool_tip="Grass"
top_delta="0"
width="20" />
@@ -709,7 +697,6 @@
</slider_bar>
<button
follows="left|top"
- font="SansSerifSmall"
height="19"
label="Apply"
label_selected="Apply"
@@ -723,6 +710,7 @@
function="BuildTool.applyToSelection"/>
</button>
<text
+ text_color="LtGray_50"
type="string"
length="1"
height="12"
@@ -736,6 +724,7 @@
Objects: [COUNT]
</text>
<text
+ text_color="LtGray_50"
type="string"
length="1"
follows="left|top"
@@ -749,9 +738,10 @@
<tab_container
follows="left|top"
height="400"
+ halign="center"
left="0"
name="Object Info Tabs"
- tab_max_width="55"
+ tab_max_width="54"
tab_min_width="40"
tab_position="top"
tab_height="25"
@@ -793,7 +783,7 @@
</panel.string>
<panel.string
name="text modify warning">
- This object has linked parts
+ You must select entire object to set permissions
</panel.string>
<panel.string
name="Cost Default">
@@ -816,11 +806,8 @@
Mixed Sale
</panel.string>
<text
- type="string"
- length="1"
follows="left|top"
height="10"
- layout="topleft"
left="10"
name="Name:"
top="0"
@@ -830,7 +817,6 @@
<line_editor
follows="left|top|right"
height="19"
- layout="topleft"
left_pad="0"
max_length="63"
name="Object Name"
@@ -838,11 +824,8 @@
top_delta="0"
width="170" />
<text
- type="string"
- length="1"
follows="left|top"
height="10"
- layout="topleft"
left="10"
name="Description:"
top_pad="3"
@@ -852,7 +835,6 @@
<line_editor
follows="left|top|right"
height="19"
- layout="topleft"
left_pad="0"
max_length="127"
name="Object Description"
@@ -926,7 +908,6 @@
left_pad="0"
top_delta="0"
name="button set group"
- picture_style="true"
tab_stop="false"
tool_tip="Choose a group to share this object's permissions"
width="10" />
@@ -941,7 +922,6 @@
width="150" />
<button
follows="top|left"
- font="SansSerifSmall"
height="20"
label="Deed"
label_selected="Deed"
@@ -982,23 +962,27 @@
<combo_box.item
label="Touch (default)"
name="Touch/grab(default)"
- value="Touch/grab (default)" />
+ value="Touch" />
<combo_box.item
label="Sit on object"
name="Sitonobject"
- value="Sit on object" />
+ value="Sit" />
<combo_box.item
label="Buy object"
name="Buyobject"
- value="Buy object" />
+ value="Buy" />
<combo_box.item
label="Pay object"
name="Payobject"
- value="Pay object" />
+ value="Pay" />
<combo_box.item
label="Open"
name="Open"
value="Open" />
+ <combo_box.item
+ label="Zoom"
+ name="Zoom"
+ value="Zoom" />
</combo_box>
<check_box
height="16"
@@ -1033,8 +1017,11 @@
label="Original"
value="1" />
</combo_box>
-<!-- NEW PRICE SPINNER -->
- <spinner
+<!-- NEW PRICE SPINNER
+Objects are allowed to be for sale for L$0 to invoke buy UI behavior
+even though the user gets a free copy.
+-->
+ <spinner
follows="left|top"
decimal_digits="0"
increment="1"
@@ -1045,13 +1032,13 @@
label="Price: L$"
label_width="65"
width="150"
- min_val="1"
+ min_val="0"
height="20"
max_val="999999999" />
<check_box
height="15"
width="110"
- top_pad="3"
+ top_pad="5"
label="Show in search"
layout="topleft"
left="100"
@@ -1079,7 +1066,7 @@
follows="left|top|right"
layout="topleft"
name="perm_modify"
- width="250">
+ width="264">
You can modify this object
</text>
<text
@@ -1696,6 +1683,7 @@
Taper
</text>
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1778,6 +1766,7 @@
top_delta="0"
width="68" />
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1790,6 +1779,7 @@
Profile Cut (begin/end)
</text>
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1840,6 +1830,7 @@
top_delta="0"
width="68" />
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1852,6 +1843,7 @@
Taper
</text>
<spinner
+ visible="false"
decimal_digits="2"
follows="left|top"
height="19"
@@ -1866,6 +1858,7 @@
top_pad="3"
width="68" />
<spinner
+ visible="false"
decimal_digits="2"
follows="left|top"
height="19"
@@ -1880,6 +1873,7 @@
top_delta="0"
width="68" />
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1892,6 +1886,7 @@
Radius
</text>
<text
+ visible="false"
type="string"
length="1"
follows="left|top"
@@ -1903,6 +1898,7 @@
Revolutions
</text>
<spinner
+ visible="false"
follows="left|top"
height="19"
increment="0.05"
@@ -1914,6 +1910,7 @@
top_pad="4"
width="68" />
<spinner
+ visible="false"
decimal_digits="2"
follows="left|top"
height="19"
@@ -2273,7 +2270,6 @@
top="8"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2347,16 +2343,16 @@
left="10"
name="tex gen"
top_pad="5"
- width="87">
+ width="85">
Mapping
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox texgen"
top_pad="4"
- width="60">
+ width="85">
<combo_box.item
label="Default"
name="Default"
@@ -2373,18 +2369,18 @@
height="10"
layout="topleft"
name="label shininess"
- left_pad="5"
+ left_pad="4"
top_pad="-36"
- width="60">
+ width="85">
Shininess
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox shininess"
top_pad="4"
- width="60">
+ width="85">
<combo_box.item
label="None"
name="None"
@@ -2408,19 +2404,19 @@
follows="left|top"
height="10"
layout="topleft"
- left_pad="5"
+ left_pad="4"
name="label bumpiness"
top_pad="-36"
- width="87">
+ width="85">
Bumpiness
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox bumpiness"
top_pad="4"
- width="87">
+ width="85">
<combo_box.item
label="None"
name="None"
@@ -2613,8 +2609,7 @@
width="170" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Apply"
label_selected="Apply"
layout="topleft"
@@ -2679,16 +2674,16 @@
top_pad="5"
name="media_tex"
width="260">
- Media URL
+ Media
</text>
- <line_editor
+ <text
follows="left|top|right"
height="18"
layout="topleft"
left="10"
+ use_ellipses="true"
read_only="true"
name="media_info"
- select_on_focus="true"
width="180" />
<button
follows="top|left"
@@ -2699,7 +2694,6 @@
layout="topleft"
left_pad="0"
name="add_media"
- picture_style="true"
tab_stop="false"
top_delta="0"
tool_tip="Add Media"
@@ -2715,7 +2709,6 @@
layout="topleft"
left_pad="5"
name="delete_media"
- picture_style="true"
tool_tip="Delete this media texture"
top_delta="0"
width="18">
@@ -2732,15 +2725,14 @@
layout="topleft"
left_pad="10"
name="edit_media"
- picture_style="true"
top_delta="0"
width="18">
<button.commit_callback
function="BuildTool.EditMedia"/>
</button>
<web_browser
- visible="false"
- enabled="false"
+ visible="false"
+ enabled="false"
border_visible="true"
bottom_delta="0"
follows="top|left"
@@ -2752,14 +2744,14 @@
decouple_texture_size="true" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Align"
label_selected="Align Media"
layout="topleft"
left="10"
name="button align"
top_pad="5"
+ tool_tip="Align media texture (must load first)"
width="100" />
</panel>
</panel>
@@ -2792,9 +2784,12 @@
left_pad="8"
name="button permissions"
width="130" />
- <panel_inventory
+ <panel_inventory_object
+ border="true"
+ border_visible="true"
+ bevel_style="in"
follows="left|top"
- height="210"
+ height="325"
layout="topleft"
left="10"
name="contents_inventory"
@@ -2867,15 +2862,6 @@
tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
top_pad="8"
width="205" />
- <!--TODO: HOOK UP TO HELP VIEWER-->
- <!-- <button
- image_overlay="Arrow_Right_Off"
- picture_style="true"
- left_pad="5"
- name="button show owners help"
- tool_tip="See an explanation of colors"
- width="26"
- height="22" />-->
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index 2f53422d51..b06c6dc215 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -8,8 +8,8 @@
min_width="450"
name="top_objects"
help_topic="top_objects"
- title="loading..."
- width="550">
+ title="Top Objects"
+ width="800">
<floater.string
name="top_scripts_title">
Top Scripts
@@ -46,25 +46,25 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
height="20"
layout="topleft"
left="10"
name="title_text"
- top="30"
+ top="20"
+ text_color="EmphasisColor"
width="400">
Loading...
</text>
<scroll_list
draw_heading="true"
- follows="left|top|bottom|right"
- height="150"
+ follows="all"
+ height="170"
layout="topleft"
left_delta="0"
multi_select="true"
name="objects_list"
- top_delta="20"
- width="530">
+ top_delta="17"
+ width="780">
<scroll_list.columns
label="Score"
name="score"
@@ -84,11 +84,15 @@
<scroll_list.columns
label="Time"
name="time"
- width="100" />
+ width="150" />
<scroll_list.columns
label="Mono Time"
name="mono_time"
- width="55" />
+ width="100" />
+ <scroll_list.columns
+ label="URLs"
+ name="URLs"
+ width="100" />
<scroll_list.commit_callback
function="TopObjects.CommitObjectsList" />
</scroll_list>
@@ -109,16 +113,16 @@
follows="left|bottom|right"
height="20"
layout="topleft"
- left_delta="70"
+ left_pad="3"
name="id_editor"
top_delta="-3"
- width="350" />
+ width="575" />
<button
follows="bottom|right"
- height="20"
+ height="23"
label="Show Beacon"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="show_beacon_btn"
top_delta="0"
width="100">
@@ -132,25 +136,25 @@
height="20"
layout="topleft"
left="10"
+ top_pad="5"
name="obj_name_text"
- top="237"
width="100">
- Object Name:
+ Object name:
</text>
<line_editor
follows="left|bottom|right"
height="20"
layout="topleft"
- left_delta="70"
+ left_pad="3"
name="object_name_editor"
top_delta="-3"
- width="350" />
+ width="575" />
<button
follows="bottom|right"
- height="20"
+ height="23"
label="Filter"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="filter_object_btn"
top_delta="0"
width="100">
@@ -164,25 +168,25 @@
height="20"
layout="topleft"
left="10"
+ top_pad="5"
name="owner_name_text"
- top="264"
width="100">
- Owner Name:
+ Owner:
</text>
<line_editor
follows="left|bottom|right"
height="20"
layout="topleft"
- left_delta="70"
+ left_pad="3"
name="owner_name_editor"
top_delta="-3"
- width="350" />
+ width="575" />
<button
follows="bottom|right"
- height="20"
+ height="23"
label="Filter"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="filter_owner_btn"
top_delta="0"
width="100">
@@ -190,20 +194,32 @@
function="TopObjects.GetByOwnerName" />
</button>
<button
+ follows="bottom|right"
+ height="22"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ name="refresh_btn"
+ right="-8"
+ top_pad="5"
+ width="23">
+ <button.commit_callback
+ function="TopObjects.Refresh" />
+ </button>
+ <button
follows="bottom|left"
- height="20"
+ height="23"
label="Return Selected"
layout="topleft"
- left="10"
+ left="112"
+ top_delta="0"
name="return_selected_btn"
- top="295"
width="130">
<button.commit_callback
function="TopObjects.ReturnSelected" />
</button>
<button
follows="bottom|left"
- height="20"
+ height="23"
label="Return All"
layout="topleft"
left_pad="10"
@@ -215,19 +231,19 @@
</button>
<button
follows="bottom|left"
- height="20"
+ height="23"
label="Disable Selected"
layout="topleft"
- left="10"
+
+ left="112"
name="disable_selected_btn"
- top="320"
width="130">
<button.commit_callback
function="TopObjects.DisableSelected" />
</button>
<button
follows="bottom|left"
- height="20"
+ height="23"
label="Disable All"
layout="topleft"
left_pad="10"
@@ -237,16 +253,4 @@
<button.commit_callback
function="TopObjects.DisableAll" />
</button>
- <button
- bottom="315"
- follows="bottom|right"
- height="20"
- label="Refresh"
- layout="topleft"
- name="refresh_btn"
- right="-10"
- width="100">
- <button.commit_callback
- function="TopObjects.Refresh" />
- </button>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 4e2cce1428..5e168fe4aa 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -49,26 +49,10 @@
left_delta="0"
name="tos_heading"
top_delta="-399"
+ word_wrap="true"
width="552">
- Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],
-you must accept the agreement.
+ Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement.
</text>
- <text_editor
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="283"
- layout="topleft"
- left_delta="0"
- max_length="65536"
- name="tos_text"
- top_pad="43"
- width="568"
- handle_edit_keys_directly="true"
- word_wrap="true">
- TOS_TEXT
- </text_editor>
<web_browser
follows="left|top"
height="340"
@@ -76,6 +60,6 @@ you must accept the agreement.
left_delta="0"
name="tos_html"
start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E"
- top_delta="-27"
+ top_delta="40"
width="568" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index 380e51977f..e86cb23c1e 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -9,7 +9,8 @@
name="gui_preview_tool"
help_topic="gui_preview_tool"
single_instance="true"
- title="XUI Preview Tool"
+ title="XUI PREVIEW TOOL"
+ translate="false"
width="750">
<panel
bottom="640"
diff --git a/indra/newview/skins/default/xui/en/floater_url_entry.xml b/indra/newview/skins/default/xui/en/floater_url_entry.xml
index 1ab42cb140..29fb29fabf 100644
--- a/indra/newview/skins/default/xui/en/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_url_entry.xml
@@ -32,7 +32,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="OK"
layout="topleft"
left="10"
@@ -42,7 +41,6 @@
<button
follows="top|left"
height="20"
- font="SansSerifSmall"
label="Cancel"
layout="topleft"
left_pad="5"
@@ -52,7 +50,6 @@
<button
follows="top|right"
height="20"
- font="SansSerifSmall"
label="Clear"
layout="topleft"
left_pad="65"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
new file mode 100644
index 0000000000..c4411db8c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ can_minimize="true"
+ can_close="false"
+ height="202"
+ layout="topleft"
+ min_height="124"
+ min_width="190"
+ name="floater_voice_controls"
+ help_topic="floater_voice_controls"
+ title="Voice Controls"
+ save_visibility="true"
+ single_instance="true"
+ width="282">
+ <string
+ name="title_nearby">
+ NEARBY VOICE
+ </string>
+ <string
+ name="title_group">
+ Group Call with [GROUP]
+ </string>
+ <string
+ name="title_adhoc">
+ Conference Call
+ </string>
+ <string
+ name="title_peer_2_peer">
+ Call with [NAME]
+ </string>
+ <string
+ name="no_one_near">
+ No one near has voice enabled
+ </string>
+ <layout_stack
+ clip="false"
+ follows="all"
+ height="189"
+ layout="topleft"
+ left="10"
+ mouse_opaque="false"
+ name="my_call_stack"
+ orientation="vertical"
+ width="263">
+ <layout_panel
+ follows="top|left|right"
+ user_resize="false"
+ auto_resize="false"
+ layout="topleft"
+ height="26"
+ name="my_panel">
+ <avatar_icon
+ enabled="false"
+ follows="left|top"
+ height="18"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left="5"
+ name="user_icon"
+ top="0"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifSmallBold"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="user_text"
+ text_color="white"
+ top="4"
+ use_ellipses="true"
+ value="Mya Avatar:"
+ width="210" />
+ <output_monitor
+ auto_update="true"
+ draw_border="false"
+ follows="top|right"
+ height="16"
+ layout="topleft"
+ right="-3"
+ name="speaking_indicator"
+ left_pad="5"
+ visible="true"
+ width="20" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ follows="top|left"
+ height="26"
+ visible="true"
+ layout="topleft"
+ name="leave_call_btn_panel"
+ width="100">
+ <button
+ follows="right|top"
+ height="23"
+ top_pad="0"
+ label="Leave Call"
+ name="leave_call_btn"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ follows="all"
+ layout="topleft"
+ left="2"
+ top_pad="0"
+ height="132"
+ name="callers_panel"
+ user_resize="false"
+ width="280">
+ <avatar_list
+ follows="all"
+ height="132"
+ ignore_online_status="true"
+ layout="topleft"
+ multi_select="true"
+ name="speakers_list"
+ width="280" />
+ <panel
+ filename="panel_avatar_list_item.xml"
+ follows="left|right|top"
+ height="24"
+ layout="topleft"
+ left="0"
+ name="non_avatar_caller"
+ top="10"
+ width="276" />
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index 9c55e8ea16..32739ac953 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -6,7 +6,7 @@
name="Water Floater"
help_topic="water_floater"
save_rect="true"
- title="Advanced Water Editor"
+ title="ADVANCED WATER EDITOR"
width="700">
<floater.string
name="WLDefaultWaterNames">
@@ -16,7 +16,7 @@
type="string"
length="1"
follows="left|top|right"
- font="SansSerif"
+ font.style="BOLD"
height="16"
layout="topleft"
left="10"
@@ -28,7 +28,7 @@
<combo_box
height="18"
layout="topleft"
- left_delta="110"
+ left_pad="10"
name="WaterPresetsCombo"
top_delta="-2"
width="150" />
@@ -40,7 +40,7 @@
left_pad="20"
name="WaterNewPreset"
top_delta="1"
- width="70" />
+ width="90" />
<button
height="20"
label="Save"
@@ -49,7 +49,7 @@
left_pad="10"
name="WaterSavePreset"
top_delta="0"
- width="70" />
+ width="90" />
<button
height="20"
label="Delete"
@@ -58,10 +58,12 @@
left_pad="10"
name="WaterDeletePreset"
top_delta="0"
- width="70" />
+ width="90" />
<tab_container
+ border="false"
follows="left|top"
height="180"
+ halign="center"
layout="topleft"
left="0"
name="Water Tabs"
@@ -70,15 +72,15 @@
width="700">
<panel
border="true"
- follows="left|top|right|bottom"
+ follows="all"
height="180"
label="Settings"
layout="topleft"
- left="1"
+ left="0"
mouse_opaque="false"
help_topic="water_settings_tab"
name="Settings"
- top="60"
+ top="0"
width="698">
<text
type="string"
@@ -90,21 +92,10 @@
left="10"
name="BHText"
top="4"
- width="355">
+ width="200">
Water Fog Color
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterFogColorHelp"
- top_delta="-2"
- width="18" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.5 0.5 0.5 1"
follows="left|top"
@@ -124,20 +115,10 @@
layout="topleft"
left="10"
name="WaterFogDensText"
- top="74"
- width="355">
+ top="84"
+ width="200">
Fog Density Exponent
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterFogDensityHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterFogDensity"
decimal_digits="1"
@@ -148,7 +129,7 @@
left="24"
max_val="10"
name="WaterFogDensity"
- top="110"
+ top="124"
width="200" />
<text
type="string"
@@ -159,20 +140,10 @@
layout="topleft"
left_delta="-14"
name="WaterUnderWaterFogModText"
- top_delta="4"
- width="355">
+ top="124"
+ width="200">
Underwater Fog Modifier
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterUnderWaterFogModHelp"
- top_delta="-2"
- width="18" />
<slider
decimal_digits="2"
follows="left"
@@ -183,7 +154,7 @@
left="24"
max_val="2"
name="WaterUnderWaterFogMod"
- top="150"
+ top="164"
width="200" />
<text
type="string"
@@ -195,93 +166,44 @@
left="245"
name="BDensText"
top="4"
- width="355">
+ width="200">
Reflection Wavelet Scale
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterNormalScaleHelp"
- top_delta="-2"
- width="18" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText2"
- top="21"
- width="10">
- 1
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText3"
- top_delta="11"
- width="10">
- 2
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText4"
- top_delta="11"
- width="10">
- 3
- </text>
<slider
control_name="WaterNormalScaleX"
decimal_digits="1"
follows="left"
- height="10"
+ height="15"
initial_value="0.7"
+ label="1"
layout="topleft"
- left_pad="4"
max_val="10"
name="WaterNormalScaleX"
- top_delta="-3"
+ top_pad="24"
width="200" />
<slider
control_name="WaterNormalScaleY"
decimal_digits="1"
follows="left"
- height="10"
+ height="15"
initial_value="0.7"
+ label="2"
layout="topleft"
- left_delta="0"
max_val="10"
name="WaterNormalScaleY"
- top_pad="1"
+ top_pad="4"
width="200" />
<slider
control_name="WaterNormalScaleZ"
decimal_digits="1"
follows="left"
- height="10"
+ height="15"
initial_value="0.7"
+ label="3"
layout="topleft"
- left_delta="0"
max_val="10"
name="WaterNormalScaleZ"
- top_pad="1"
+ top_pad="4"
width="200" />
<text
type="string"
@@ -290,22 +212,11 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
name="HDText"
- top_delta="2"
- width="355">
+ top="84"
+ width="200">
Fresnel Scale
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterFresnelScaleHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterFresnelScale"
decimal_digits="2"
@@ -314,9 +225,8 @@
increment="0.01"
initial_value="0.7"
layout="topleft"
- left="259"
name="WaterFresnelScale"
- top="100"
+ top="124"
width="200" />
<text
type="string"
@@ -325,22 +235,11 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
name="FresnelOffsetText"
- top_delta="-1"
- width="355">
+ top="124"
+ width="200">
Fresnel Offset
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterFresnelOffsetHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterFresnelOffset"
decimal_digits="2"
@@ -349,9 +248,8 @@
increment="0.01"
initial_value="0.7"
layout="topleft"
- left="259"
name="WaterFresnelOffset"
- top="135"
+ top="164"
width="200" />
<text
type="string"
@@ -363,19 +261,9 @@
left="480"
name="DensMultText"
top="4"
- width="355">
+ width="200">
Refract Scale Above
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterScaleAboveHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterScaleAbove"
decimal_digits="2"
@@ -386,7 +274,7 @@
layout="topleft"
left="494"
name="WaterScaleAbove"
- top="40"
+ top="44"
width="200" />
<text
type="string"
@@ -397,20 +285,10 @@
layout="topleft"
left_delta="-14"
name="WaterScaleBelowText"
- top_delta="-3"
- width="355">
+ top="44"
+ width="200">
Refract Scale Below
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterScaleBelowHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterScaleBelow"
decimal_digits="2"
@@ -421,7 +299,7 @@
layout="topleft"
left="494"
name="WaterScaleBelow"
- top="73"
+ top="84"
width="200" />
<text
type="string"
@@ -432,20 +310,10 @@
layout="topleft"
left_delta="-14"
name="MaxAltText"
- top_delta="-2"
- width="355">
+ top="84"
+ width="200">
Blur Multiplier
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WaterBlurMultiplierHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WaterBlurMult"
follows="left"
@@ -456,20 +324,20 @@
left="494"
max_val="0.16"
name="WaterBlurMult"
- top="107"
+ top="124"
width="200" />
</panel>
<panel
border="true"
- follows="left|top|right|bottom"
+ follows="all"
height="180"
label="Image"
layout="topleft"
- left_delta="0"
+ left="0"
mouse_opaque="false"
help_topic="water_waves_tab"
name="Waves"
- top_delta="44"
+ top="0"
width="698">
<text
type="string"
@@ -480,20 +348,10 @@
layout="topleft"
left="10"
name="BHText"
- top="4"
- width="355">
+ top="10"
+ width="200">
Big Wave Direction
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="145"
- name="WaterWave1Help"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -503,7 +361,7 @@
layout="topleft"
left="10"
name="WaterWave1DirXText"
- top="21"
+ top_pad="4"
width="10">
X
</text>
@@ -516,7 +374,7 @@
layout="topleft"
left_delta="0"
name="WaterWave1DirYText"
- top_delta="11"
+ top_delta="18"
width="10">
Y
</text>
@@ -532,7 +390,7 @@
max_val="4"
min_val="-4"
name="WaterWave1DirX"
- top="40"
+ top="55"
width="200" />
<slider
control_name="WaterWave1DirY"
@@ -546,7 +404,7 @@
max_val="4"
min_val="-4"
name="WaterWave1DirY"
- top_pad="1"
+ top_pad="5"
width="200" />
<text
type="string"
@@ -561,16 +419,6 @@
width="355">
Little Wave Direction
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="145"
- name="WaterWave2Help"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -580,7 +428,7 @@
layout="topleft"
left="10"
name="WaterWave2DirXText"
- top="71"
+ top="90"
width="10">
X
</text>
@@ -593,7 +441,7 @@
layout="topleft"
left_delta="0"
name="WaterWave2DirYText"
- top_delta="11"
+ top_delta="20"
width="10">
Y
</text>
@@ -609,7 +457,7 @@
max_val="4"
min_val="-4"
name="WaterWave2DirX"
- top="90"
+ top="115"
width="200" />
<slider
control_name="WaterWave2DirY"
@@ -623,7 +471,7 @@
max_val="4"
min_val="-4"
name="WaterWave2DirY"
- top_pad="1"
+ top_pad="10"
width="200" />
<text
type="string"
@@ -635,19 +483,9 @@
left="240"
name="BHText3"
top="4"
- width="355">
+ width="200">
Normal Map
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="125"
- name="WaterNormalMapHelp"
- top_delta="-2"
- width="18" />
<texture_picker
height="143"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
index 9a95e3dfef..b4b57f2dbc 100644
--- a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
- border="true"
+ legacy_header_height="0"
can_close="false"
can_minimize="false"
height="100"
@@ -9,7 +8,7 @@
name="modal container"
width="240">
<button
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -18,7 +17,7 @@
top="70"
width="82" />
<button
- height="20"
+ height="23"
label="Cancel"
label_selected="Cancel"
layout="topleft"
@@ -30,14 +29,14 @@
type="string"
length="1"
follows="left|top"
- font="SansSerif"
- height="16"
+ height="30"
layout="topleft"
+ word_wrap="true"
left="20"
name="Save item as:"
top="10"
width="200">
- Save item as:
+ Save item to my inventory as:
</text>
<line_editor
type="string"
@@ -45,14 +44,13 @@
border_style="line"
border_thickness="1"
follows="left|top"
- font="SansSerif"
handle_edit_keys_directly="true"
- height="20"
+ height="23"
layout="topleft"
left_delta="0"
max_length="63"
name="name ed"
- top_pad="4"
+ top_pad="0"
width="200">
New [DESC]
</line_editor>
diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
index ef68d03a45..897d959b98 100644
--- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
@@ -5,6 +5,9 @@
height="108"
layout="topleft"
name="whitelist_entry"
+ single_instance="true"
+ help_topic="whitelist_entry"
+ title="WHITELIST ENTRY"
width="390">
<text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
@@ -17,9 +20,9 @@
tool_tip="Enter a URL or URL pattern to White List"
width="350" />
- <button follows="top|left" height="20" font="SansSerifSmall" label="OK"
+ <button follows="top|left" height="20" label="OK"
layout="topleft" left="10" name="ok_btn" bottom_delta="28" width="64" />
- <button follows="top|left" height="20" font="SansSerifSmall" label="Cancel"
+ <button follows="top|left" height="20" label="Cancel"
layout="topleft" left_pad="5" name="cancel_btn" bottom_delta="0" width="64" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
index 0ea769921f..0cb7814c6a 100644
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
@@ -6,7 +6,7 @@
name="WindLight floater"
help_topic="windlight_floater"
save_rect="true"
- title="Advanced Sky Editor"
+ title="ADVANCED SKY EDITOR"
width="700">
<floater.string
name="WLDefaultSkyNames">
@@ -71,10 +71,12 @@
<tab_container
follows="left|top"
height="160"
+ halign="center"
layout="topleft"
left="0"
name="WindLight Tabs"
tab_position="top"
+ tab_height="20"
top="60"
width="700">
<panel
@@ -102,16 +104,6 @@
width="355">
Blue Horizon
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLBlueHorizonHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -225,16 +217,6 @@
width="355">
Haze Horizon
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLHazeHorizonHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLHazeHorizon"
decimal_digits="2"
@@ -260,16 +242,6 @@
width="355">
Blue Density
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLBlueDensityHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -383,16 +355,6 @@
width="355">
Haze Density
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLHazeDensityHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLHazeDensity"
decimal_digits="2"
@@ -419,16 +381,6 @@
width="355">
Density Multiplier
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLDensityMultHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLDensityMult"
decimal_digits="2"
@@ -455,16 +407,6 @@
width="355">
Distance Multiplier
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLDistanceMultHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLDistancMult"
decimal_digits="1"
@@ -490,16 +432,6 @@
width="355">
Max Altitude
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLMaxAltitudeHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLMaxAltitude"
decimal_digits="0"
@@ -538,16 +470,6 @@
width="355">
Sun/Moon Color
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLSunlightColorHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -661,16 +583,6 @@
width="355">
Sun/Moon Position
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLTimeOfDayHelp"
- top_delta="-2"
- width="18" />
<icon
height="20"
image_name="icon_diurnal.tga"
@@ -703,16 +615,6 @@
width="355">
Ambient
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLAmbientHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -826,16 +728,6 @@
width="355">
East Angle
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLEastAngleHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLEastAngle"
decimal_digits="2"
@@ -861,16 +753,6 @@
width="355">
Sun Glow
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLSunGlowHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLGlowB"
decimal_digits="2"
@@ -913,16 +795,6 @@
width="200">
Scene Gamma
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLSceneGammaHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLGamma"
decimal_digits="2"
@@ -949,16 +821,6 @@
width="355">
Star Brightness
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLStarBrightnessHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLStarAlpha"
decimal_digits="2"
@@ -998,16 +860,6 @@
width="355">
Cloud Color
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLCloudColorHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -1121,16 +973,6 @@
width="355">
Cloud XY/Density
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLCloudDensityHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -1219,16 +1061,6 @@
width="355">
Cloud Coverage
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLCloudCoverageHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLCloudCoverage"
decimal_digits="2"
@@ -1254,16 +1086,6 @@
width="355">
Cloud Scale
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLCloudScaleHelp"
- top_delta="-2"
- width="18" />
<slider
control_name="WLCloudScale"
decimal_digits="2"
@@ -1290,16 +1112,6 @@
width="355">
Cloud Detail (XY/Density)
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="150"
- name="WLCloudDetailHelp"
- top_delta="-2"
- width="18" />
<text
type="string"
length="1"
@@ -1388,16 +1200,6 @@
width="355">
Cloud Scroll X
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="125"
- name="WLCloudScrollXHelp"
- top_delta="-2"
- width="18" />
<check_box
control_name="WLCloudLockX"
follows="left"
@@ -1434,16 +1236,6 @@
width="355">
Cloud Scroll Y
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="125"
- name="WLCloudScrollYHelp"
- top_delta="-2"
- width="18" />
<check_box
control_name="WLCloudLockY"
follows="left"
@@ -1477,16 +1269,6 @@
name="DrawClassicClouds"
top="104"
width="200" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left="608"
- name="WLClassicCloudsHelp"
- top="84"
- width="18" />
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_window_size.xml b/indra/newview/skins/default/xui/en/floater_window_size.xml
new file mode 100644
index 0000000000..355d257785
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_window_size.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_minimize="false"
+ can_resize="false"
+ height="105"
+ layout="topleft"
+ name="window_size"
+ title="WINDOW SIZE"
+ width="205">
+ <string name="resolution_format">[RES_X] x [RES_Y]</string>
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ left="15"
+ top="10"
+ name="windowsize_text"
+ width="280">
+ Set window size:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ height="23"
+ follows="left|top"
+ left_delta="0"
+ max_chars="20"
+ name="window_size_combo"
+ tool_tip="width x height"
+ top_pad="5"
+ width="179">
+ <combo_box.item
+ label="1000 x 700 (default)"
+ name="item0"
+ value="1000 x 700" />
+ <combo_box.item
+ label="1024 x 768"
+ name="item1"
+ value="1024 x 768" />
+ <combo_box.item
+ label="1280 x 720 (720p)"
+ name="item2"
+ value="1280 x 720" />
+ <combo_box.item
+ label="1920 x 1080 (1080p)"
+ name="item3"
+ value="1920 x 1080" />
+ </combo_box>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Set"
+ left_delta="0"
+ name="set_btn"
+ top_pad="10"
+ width="85" />
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ left_pad="5"
+ name="cancel_btn"
+ top_delta="0"
+ width="85" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 93755fa253..86ac7c8e54 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -13,414 +13,513 @@
save_rect="true"
save_visibility="true"
single_instance="true"
- title="World Map"
- width="800">
- <tab_container
- follows="left|top|right|bottom"
- height="565"
- layout="topleft"
- left="15"
- name="maptab"
- tab_position="top"
+ title="WORLD MAP"
+ width="650">
+ <panel
+ filename="panel_world_map.xml"
+ follows="all"
+ height="555"
+ layout="topleft"
+ left="10"
+ name="objects_mapview"
top="25"
- width="542">
- <panel
- filename="panel_world_map.xml"
- follows="left|top|right|bottom"
- height="550"
- label="Objects"
- layout="topleft"
- left="1"
- help_topic="worldmap_objects_tab"
- name="objects_mapview"
- top="19"
- width="540" />
- <panel
- filename="panel_world_map.xml"
- follows="left|top|right|bottom"
- height="550"
- label="Terrain"
- layout="topleft"
- left_delta="0"
- help_topic="worldmap_terrain_tab"
- name="terrain_mapview"
- top_delta="3"
- width="540" />
- </tab_container>
- <icon
- follows="top|right"
- height="16"
- image_name="map_avatar_16.tga"
- layout="topleft"
- left="-230"
- mouse_opaque="true"
- name="self"
- top="34"
- width="16" />
+ width="375" />
+ <panel
+ name="layout_panel_1"
+ height="22"
+ width="238"
+ follows="right|top"
+ top="25"
+ left_pad="5"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
<text
+ text_color="White"
+ font="SansSerifLarge"
type="string"
length="1"
follows="top|right"
+ halign="left"
height="16"
layout="topleft"
- left_pad="4"
- name="you_label"
- top_delta="0"
- width="145">
- You
+ left="15"
+ name="events_label"
+ top="3"
+ width="215">
+ Legend
</text>
- <icon
- follows="top|right"
- height="16"
- image_name="map_home.tga"
+ </panel>
+<panel
+ follows="right|top"
+ height="126"
+ top_pad="0"
+ width="238">
+<button
+ follows="right|top"
+ height="22"
+ image_overlay="map_avatar_16.tga"
+ scale_image="true"
+ left="4"
layout="topleft"
- left_delta="50"
- mouse_opaque="true"
- name="home"
- top_delta="0"
- width="16" />
- <text
+ name="Show My Location"
+ tool_tip="Center map on my avatar&apos;s location"
+ top="6"
+ width="24" >
+ <button.commit_callback
+ function="WMap.ShowAgent" />
+ </button>
+ <text
type="string"
length="1"
follows="top|right"
- height="16"
+ halign="left"
+ height="13"
+ top_delta="6"
+ left_pad="5"
layout="topleft"
- left_pad="4"
- name="home_label"
- top_delta="0"
- width="145">
- Home
+ name="me_label"
+ width="90">
+ Me
</text>
- <icon
- color="0.5 0.25 1 1"
+ <check_box
+ control_name="MapShowPeople"
follows="top|right"
height="16"
- image_name="legend.tga"
layout="topleft"
- left="-230"
+ left="3"
+ name="people_chk"
+ top_pad="9"
+ width="22" />
+ <icon
+ color="0 1 0 1"
+ follows="top|right"
+ height="8"
+ image_name="map_avatar_8.tga"
+ layout="topleft"
+ left_pad="3"
mouse_opaque="true"
- name="square2"
- top="54"
- width="16" />
- <text
+ name="person"
+ top_delta="3"
+ width="8" />
+ <text
type="string"
length="1"
follows="top|right"
+ halign="left"
height="16"
+ top_delta="-2"
+ left_pad="7"
layout="topleft"
- left_pad="4"
- name="auction_label"
- top_delta="0"
- width="145">
- Auction
+ name="person_label"
+ width="90">
+ Person
</text>
- <icon
- color="1 1 0.25 1"
+ <check_box
+ control_name="MapShowInfohubs"
follows="top|right"
height="16"
- image_name="legend.tga"
layout="topleft"
- left_delta="50"
+ left="3"
+ name="infohub_chk"
+ top_pad="3"
+ width="22" />
+ <icon
+ follows="top|right"
+ height="16"
+ image_name="map_infohub.tga"
+ layout="topleft"
+ left_pad="0"
mouse_opaque="true"
- name="square"
+ name="infohub"
top_delta="0"
width="16" />
- <text
+ <text
type="string"
length="1"
follows="top|right"
+ halign="left"
height="16"
+ top_delta="2"
+ left_pad="3"
layout="topleft"
- left_pad="4"
- name="land_for_sale_label"
- top_delta="0"
- width="145">
- Land For Sale
+ name="infohub_label"
+ width="90">
+ Infohub
</text>
- <button
+ <check_box
+ control_name="MapShowLandForSale"
follows="top|right"
- font="SansSerifSmall"
height="16"
- label="Go Home"
- label_selected="Go Home"
layout="topleft"
- left="-90"
- name="Go Home"
- tool_tip="Teleport to your home"
- top="34"
- width="88" >
- <button.commit_callback
- function="WMap.GoHome" />
- </button>
+ left="3"
+ name="land_for_sale_chk"
+ top_pad="2"
+ width="22" />
<icon
- color="0 1 0 1"
follows="top|right"
- height="8"
- image_name="map_avatar_8.tga"
+ height="16"
+ image_name="icon_for_sale.tga"
layout="topleft"
- left="-226"
mouse_opaque="true"
- name="person"
- top="84"
- width="8" />
- <check_box
- control_name="MapShowPeople"
+ name="landforsale"
+ top_delta="0"
+ left_pad="0"
+ width="16" />
+ <text
+ type="string"
+ length="1"
follows="top|right"
+ halign="left"
height="16"
- label="Resident"
+ top_delta="2"
+ left_pad="3"
layout="topleft"
- left_pad="8"
- name="people_chk"
- top_delta="-4"
- width="110" />
+ name="land_sale_label"
+ width="90">
+ Land Sale
+ </text>
<icon
+ color="1 1 0.25 1"
follows="top|right"
height="16"
- image_name="map_infohub.tga"
+ image_name="legend.tga"
layout="topleft"
- left="-230"
mouse_opaque="true"
- name="infohub"
- top="100"
+ name="square2"
+ left="41"
+ top_pad="-2"
width="16" />
- <check_box
- control_name="MapShowInfohubs"
+ <text
+ type="string"
+ length="1"
follows="top|right"
height="16"
- label="Infohub"
layout="topleft"
- left_pad="4"
- name="infohub_chk"
- top_delta="0"
- width="110" />
- <icon
+ left_pad="0"
+ name="by_owner_label"
+ top_delta="3"
+ width="100">
+ by owner
+ </text>
+ <icon
+ color="0.5 0.25 1 1"
follows="top|right"
height="16"
- image_name="map_telehub.tga"
+ image_name="legend.tga"
layout="topleft"
- left="-230"
mouse_opaque="true"
- name="telehub"
- top="120"
+ name="square2"
+ left="41"
+ top_pad="-3"
width="16" />
- <check_box
- control_name="MapShowTelehubs"
+ <text
+ type="string"
+ length="1"
follows="top|right"
height="16"
- label="Telehub"
layout="topleft"
- left_pad="4"
- name="telehubchk"
- top_delta="0"
- width="110" />
- <icon
+ left_pad="0"
+ name="auction_label"
+ top_delta="3"
+ width="170">
+ land auction
+ </text>
+
+ <button
follows="top|right"
- height="16"
- image_name="icon_for_sale.tga"
+ height="22"
+ image_overlay="map_home.tga"
+ scale_image="true"
+ label_color="White"
layout="topleft"
- left="-230"
- mouse_opaque="true"
- name="landforsale"
- top="140"
- width="16" />
- <check_box
- control_name="MapShowLandForSale"
+ left="136"
+ top="6"
+ name="Go Home"
+ tool_tip="Teleport to my home location"
+ width="24" >
+ <button.commit_callback
+ function="WMap.GoHome" />
+ </button>
+ <text
+ type="string"
+ length="1"
follows="top|right"
- height="16"
- label="Land for Sale"
+ halign="left"
+ height="13"
+ top_delta="6"
+ left_pad="5"
layout="topleft"
- left_pad="4"
- name="land_for_sale_chk"
- top_delta="0"
- width="110" />
+ name="Home_label"
+ width="70">
+ Home
+ </text>
<text
type="string"
length="1"
follows="top|right"
+ halign="left"
height="16"
layout="topleft"
- left="-104"
+ left="137"
name="events_label"
- top="80"
- width="145">
+ top_pad="9"
+ width="66">
Events:
</text>
- <icon
- follows="top|right"
- height="16"
- image_name="map_event.tga"
- layout="topleft"
- left="-92"
- mouse_opaque="true"
- name="event"
- top="100"
- width="16" />
+
<check_box
control_name="MapShowEvents"
follows="top|right"
height="16"
- label="PG"
layout="topleft"
- left_pad="4"
+ left="135"
+ top_pad="1"
name="event_chk"
- top_delta="0"
- width="55" />
- <icon
+ width="22" />
+ <icon
follows="top|right"
height="16"
- image_name="map_event_mature.tga"
+ image_name="Parcel_PG_Dark"
layout="topleft"
- left="-92"
mouse_opaque="true"
- name="events_mature_icon"
- top="120"
- width="16" />
+ name="event"
+ left_pad="0"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ halign="left"
+ height="16"
+ top_delta="2"
+ left_pad="3"
+ layout="topleft"
+ name="pg_label"
+ width="60">
+ General
+ </text>
+
<check_box
control_name="ShowMatureEvents"
follows="top|right"
height="16"
initial_value="true"
- label="Mature"
layout="topleft"
- left_pad="4"
+ left="135"
name="event_mature_chk"
- top_delta="0"
- width="55" />
+ top_pad="3"
+ width="22" />
<icon
follows="top|right"
height="16"
- image_name="map_event_adult.tga"
+ image_name="Parcel_M_Dark"
layout="topleft"
- left="-92"
mouse_opaque="true"
- name="events_adult_icon"
- top="140"
- width="16" />
+ name="events_mature_icon"
+ top_delta="0"
+ left_pad="0"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ halign="left"
+ height="16"
+ top_delta="2"
+ left_pad="3"
+ layout="topleft"
+ name="mature_label"
+ width="66">
+ Moderate
+ </text>
+
<check_box
control_name="ShowAdultEvents"
follows="top|right"
height="16"
- label="Adult"
layout="topleft"
- left_pad="4"
+ left="135"
name="event_adult_chk"
- top_delta="0"
- width="55" />
+ top_pad="3"
+ width="22" />
<icon
- color="0.5 0 0 1"
follows="top|right"
height="16"
- image_name="map_track_16.tga"
+ image_name="Parcel_R_Dark"
layout="topleft"
- left="-230"
+ left_pad="0"
mouse_opaque="true"
- name="avatar_icon"
- top="164"
- width="16" />
+ name="events_adult_icon"
+ top_delta="0"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ halign="left"
+ height="16"
+ top_delta="2"
+ left_pad="3"
+ layout="topleft"
+ name="adult_label"
+ width="66">
+ Adult
+ </text>
+</panel>
+
+
+ <panel
+ follows="right|top"
+ height="22"
+ top_pad="0"
+ width="238"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ text_color="White"
+ font="SansSerifLarge"
+ type="string"
+ length="1"
+ follows="top|right"
+ halign="left"
+ height="16"
+ layout="topleft"
+ left="15"
+ name="find_on_map_label"
+ top="3"
+ width="215">
+ Find on Map
+ </text>
+ </panel>
+
+ <panel
+ follows="right|top|bottom"
+ height="310"
+ top_pad="0"
+ width="238">
+ <icon
+ color="0.5 0 0 1"
+ follows="top|right"
+ height="16"
+ image_name="map_track_16.tga"
+ layout="topleft"
+ left="3"
+ top="11"
+ mouse_opaque="true"
+ name="friends_icon"
+ width="16" />
<combo_box
allow_text_entry="true"
follows="top|right"
- height="20"
+ height="23"
label="Online Friends"
layout="topleft"
- left_pad="4"
+ top_delta="-4"
+ left_pad="7"
max_chars="60"
name="friend combo"
- tool_tip="Friend to show on map"
- top_delta="-4"
- width="202">
+ tool_tip="Show friends on map"
+ width="182">
<combo_box.item
- label="Online Friends"
+ label="My Friends Online"
name="item1"
value="None" />
<combo_box.commit_callback
function="WMap.AvatarCombo"/>
</combo_box>
- <icon
+ <icon
color="0.5 0 0 1"
follows="top|right"
height="16"
image_name="map_track_16.tga"
layout="topleft"
- left="-230"
+ left="3"
+ top_pad="8"
mouse_opaque="true"
name="landmark_icon"
- top="189"
width="16" />
<combo_box
allow_text_entry="true"
follows="top|right"
- height="20"
- label="Landmarks"
+ height="23"
+ label="My Landmarks"
layout="topleft"
- left_pad="4"
+ top_delta="-3"
+ left_pad="7"
max_chars="64"
name="landmark combo"
tool_tip="Landmark to show on map"
- top_delta="-4"
- width="202">
+ width="182">
<combo_box.item
- label="Landmarks"
+ label="My Landmarks"
name="item1"
value="None" />
+ <combo_box.commit_callback
+ function="WMap.Landmark"/>
</combo_box>
- <icon
+ <icon
color="0.5 0 0 1"
follows="top|right"
height="16"
image_name="map_track_16.tga"
layout="topleft"
- left="-230"
+ left="3"
+ top_pad="7"
mouse_opaque="true"
- name="location_icon"
- top="214"
+ name="region_icon"
width="16" />
- <line_editor
+ <search_editor
follows="top|right"
- height="20"
- label="Search by Region Name"
+ search_button_visible="false"
+ height="22"
+ text_readonly_color="DkGray"
+ label="Regions by Name"
layout="topleft"
- left_pad="4"
+ top_delta="-2"
+ left_pad="7"
name="location"
select_on_focus="true"
tool_tip="Type the name of a region"
- top_delta="-4"
- width="140" />
- <button
+ width="152">
+ <search_editor.commit_callback
+ function="WMap.Location" />
+ </search_editor>
+ <button
follows="top|right"
- height="20"
- label="Search"
+ height="23"
+ label="Find"
layout="topleft"
- left_pad="5"
+ left_pad="2"
+ top_delta="-1"
name="DoSearch"
tool_tip="Search for region"
- top_delta="0"
- width="60">
+ width="58">
<button.commit_callback
function="WMap.Location" />
- </button>
- <text
- type="string"
- length="1"
+ </button>
+ <button
+ image_overlay="Refresh_Off"
follows="top|right"
- font="SansSerif"
- height="16"
+ height="23"
layout="topleft"
- left="-230"
- name="search_label"
- top="234"
- width="222">
- Search Results:
- </text>
+ left="0"
+ name="Clear"
+ tool_tip="Clear tracking lines and reset map"
+ top_pad="5"
+ width="23">
+ <button.commit_callback
+ function="WMap.Clear" />
+ </button>
<scroll_list
draw_stripes="false"
- follows="top|right|bottom"
- height="200"
+ bg_writeable_color="MouseGray"
+ follows="all"
+ height="145"
layout="topleft"
- left_delta="0"
+ left="28"
name="search_results"
- top_pad="10"
- width="222"
+ top_pad="-23"
+ width="209"
sort_column="1">
<scroll_list.columns
label=""
@@ -429,35 +528,74 @@
<scroll_list.columns
label=""
name="sim_name"
- width="206" />
+ width="193" />
<scroll_list.commit_callback
function="WMap.SearchResult" />
</scroll_list>
- <text
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="25"
+ name="Teleport"
+ tool_tip="Teleport to selected location"
+ top_pad="7"
+ width="104">
+ <button.commit_callback
+ function="WMap.Teleport" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Copy SLurl"
+ layout="topleft"
+ left_pad="5"
+ name="copy_slurl"
+ tool_tip="Copies current location as SLurl to be used on the web."
+ top_delta="0"
+ width="104">
+ <button.commit_callback
+ function="WMap.CopySLURL" />
+ </button>
+ <button
+ enabled="false"
+ follows="right|bottom"
+ height="23"
+ label="Show Selection"
+ left="25"
+ top_pad="5"
+ name="Show Destination"
+ tool_tip="Center map on selected location"
+ width="213">
+ <button.commit_callback
+ function="WMap.ShowTarget" />
+ </button>
+
+<!-- <text
type="string"
length="1"
follows="bottom|right"
- font="SansSerif"
+ halign="left"
height="16"
- layout="topleft"
- left_delta="0"
- name="location_label"
top_pad="4"
- width="98">
+ left="25"
+ layout="topleft"
+ name="land_sale_label"
+ width="250">
Location:
</text>
- <spinner
+ <spinner
decimal_digits="0"
follows="bottom|right"
- height="16"
increment="1"
initial_value="128"
layout="topleft"
- left_delta="70"
+ top_pad="0"
+ left="25"
max_val="255"
name="spin x"
tool_tip="X coordinate of location to show on map"
- top_delta="0"
width="48">
<spinner.commit_callback
function="WMap.CommitLocation" />
@@ -481,7 +619,6 @@
<spinner
decimal_digits="0"
follows="bottom|right"
- height="16"
increment="1"
initial_value="0"
layout="topleft"
@@ -493,89 +630,58 @@
width="48">
<spinner.commit_callback
function="WMap.CommitLocation" />
- </spinner>
- <button
- follows="right|bottom"
- height="20"
- label="Teleport"
- label_selected="Teleport"
- layout="topleft"
- left="-230"
- name="Teleport"
- tool_tip="Teleport to selected location"
- top="494"
- width="90">
- <button.commit_callback
- function="WMap.Teleport" />
- </button>
- <button
- follows="right|bottom"
- height="20"
- label="Show Destination"
- label_selected="Show Destination"
- layout="topleft"
- left_pad="10"
- name="Show Destination"
- tool_tip="Center map on selected location"
- top_delta="0"
- width="125">
- <button.commit_callback
- function="WMap.ShowTarget" />
- </button>
- <button
- follows="right|bottom"
- height="20"
- label="Clear"
- label_selected="Clear"
- layout="topleft"
- left="-230"
- name="Clear"
- tool_tip="Stop tracking"
- top="518"
- width="90">
- <button.commit_callback
- function="WMap.Clear" />
- </button>
- <button
- follows="right|bottom"
- height="20"
- label="Show My Location"
- label_selected="Show My Location"
- layout="topleft"
- left_pad="10"
- name="Show My Location"
- tool_tip="Center map on your avatar&apos;s location"
- top_delta="0"
- width="125" >
- <button.commit_callback
- function="WMap.ShowAgent" />
- </button>
- <button
- enabled="false"
- follows="bottom|right"
- height="20"
- label="Copy SLurl to clipboard"
+ </spinner>-->
+ </panel>
+ <panel
+ follows="right|bottom"
+ height="22"
+ top_pad="0"
+ width="238"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ text_color="White"
+ font="SansSerifLarge"
+ type="string"
+ length="1"
+ follows="top|right"
+ halign="left"
+ height="16"
layout="topleft"
- left="-230"
- name="copy_slurl"
- tool_tip="Copies current location as SLurl to be used on the web."
- top="542"
- width="222">
- <button.commit_callback
- function="WMap.CopySLURL" />
- </button>
+ left="15"
+ name="zoom_label"
+ top="3"
+ width="210">
+ Zoom
+ </text>
+ </panel>
+ <panel
+ follows="right|bottom"
+ height="30"
+ min_height="30"
+ top_pad="0"
+ width="238">
+ <icon
+ follows="left|bottom"
+ height="16"
+ image_name="Zoom_Off"
+ layout="topleft"
+ left="20"
+ mouse_opaque="true"
+ name="zoom_icon"
+ top_pad="7"
+ width="16" />
<slider
- follows="right|bottom"
+ follows="left|bottom"
height="16"
increment="0.2"
- initial_value="48.5029"
- label="Zoom"
+ initial_value="-2"
+ left_pad="0"
layout="topleft"
- left_delta="0"
max_val="0"
min_val="-8"
name="zoom slider"
show_text="false"
- top_pad="8"
- width="222" />
+ width="200" />
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index b261281c64..ebbb53729d 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -18,7 +18,7 @@
</os>
</font>
- <font name="SansSerifBold"
+ <font name="SansSerifBold"
comment="Name of bold sans-serif font">
<file>DejaVuSans-Bold.ttf</file>
<os name="Windows">
@@ -39,20 +39,20 @@
</os>
</font>
- <font name="SansSerif"
- comment="Name of bold sans-serif font"
+ <font name="SansSerif"
+ comment="Name of bold sans-serif font"
font_style="BOLD">
<file>DejaVuSans-Bold.ttf</file>
</font>
- <font name="SansSerif"
- comment="Name of italic sans-serif font"
+ <font name="SansSerif"
+ comment="Name of italic sans-serif font"
font_style="ITALIC">
<file>DejaVuSans-Oblique.ttf</file>
</font>
- <font name="SansSerif"
- comment="Name of bold italic sans-serif font"
+ <font name="SansSerif"
+ comment="Name of bold italic sans-serif font"
font_style="BOLD|ITALIC">
<file>DejaVuSans-BoldOblique.ttf</file>
</font>
@@ -140,7 +140,7 @@
<font_size name="Monospace"
comment="Size for monospaced font (points, or 1/72 of an inch)"
- size="9.0"
+ size="8.0"
/>
<font_size name="Huge"
comment="Size of huge font (points, or 1/72 of an inch)"
@@ -148,17 +148,14 @@
/>
<font_size name="Large"
comment="Size of large font (points, or 1/72 of an inch)"
- size="10.0"
+ size="10.6"
/>
- <!-- Changed Medium size to address menu font size not matching spec.
- May want to revert/update after menu font configuration has been enabled. -->
<font_size name="Medium"
comment="Size of medium font (points, or 1/72 of an inch)"
- size="8.0"
+ size="8.6"
/>
<font_size name="Small"
comment="Size of small font (points, or 1/72 of an inch)"
- size="8.0"
+ size="7.6"
/>
</fonts>
-
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 6b13e2f1c7..194ae151d2 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -4,22 +4,22 @@
Single instance - only have one at a time, recycle it each spawn
-->
<floater
- legacy_header_height="18"
+ legacy_header_height="25"
bevel_style="in"
- bg_opaque_image="Inspector_Background"
+ bg_opaque_image="Inspector_Background"
can_close="false"
can_minimize="false"
- height="138"
+ height="148"
layout="topleft"
name="inspect_avatar"
single_instance="true"
sound_flags="0"
visible="true"
- width="245">
+ width="228">
<!-- Allowed fields include:
[BORN_ON] ("12/3/2008")
[SL_PROFILE] (Second Life profile),
- [RW_PROFILE] (real world profile),
+ [RW_PROFILE] (real world profile),
[ACCTTYPE] ("Resident"),
[PAYMENTINFO] ("Payment Info on File"),
[AGE] ("1 year 2 months")
@@ -30,57 +30,44 @@
</string>
<string
name="Details">
-[ACCTTYPE][COMMA] [PAYMENTINFO]
+[SL_PROFILE]
</string>
- <string
- name="Partner">
- Partner: [PARTNER]
- </string>
<text
- follows="all"
- font="SansSerifLargeBold"
- height="18"
+ follows="top|left"
+ font="SansSerifLarge"
+ height="16"
left="8"
name="user_name"
- top="5"
- text_color="white"
+ top="10"
+ text_color="White"
use_ellipses="true"
value="Grumpity ProductEngine"
- width="240"
- word_wrap="false" />
+ width="175" />
<text
- follows="all"
+ follows="top|left"
height="16"
left="8"
- value="Grumpity ProductEngine moose moose"
- name="user_details"
- top_pad="0"
- width="170"
- use_ellipses="true"
- word_wrap="false" />
- <text
- follows="all"
- font="SansSerifSmallBold"
- text_color="White"
- height="18"
- left="8"
name="user_subtitle"
- use_ellipses="true"
- top_pad="0"
- width="170" />
- <text
- follows="all"
- height="16"
+ font="SansSerifSmall"
+ text_color="White"
+ value="11 Months, 3 days old"
+ width="175"
+ use_ellipses="true" />
+ <text
+ follows="left|top|right"
+ height="35"
left="8"
- name="user_partner"
- top_pad="8"
- width="240"
+ name="user_details"
+ right="-10"
+ word_wrap="true"
+ top_pad="6"
use_ellipses="true"
- word_wrap="false" />
+ width="220">This is my second life description and I really think it is great.
+ </text>
<slider
follows="top|left"
height="23"
- increment="0.05"
+ increment="0.01"
left="1"
max_val="0.95"
min_val="0.05"
@@ -89,76 +76,107 @@
tool_tip="Voice volume"
top_pad="0"
value="0.5"
- width="150" />
+ width="195" />
<button
- follows="all"
+ follows="top|left"
height="16"
- image_disabled="Inv_Sound"
- image_disabled_selected="Inv_Sound"
- image_hover_selected="Inv_Sound"
- image_selected="Inv_Sound"
- image_unselected="Inv_Sound"
+ image_disabled="Audio_Off"
+ image_disabled_selected="AudioMute_Off"
+ image_hover_selected="AudioMute_Over"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
is_toggle="true"
left_pad="0"
top_delta="4"
name="mute_btn"
- picture_style="true"
width="16" />
<avatar_icon
- follows="all"
+ follows="top|left"
height="38"
- right="-25"
+ right="-10"
bevel_style="in"
border_style="line"
mouse_opaque="true"
name="avatar_icon"
- top="24"
+ top="10"
width="38" />
+<!-- Overlapping buttons for default actions
+ llinspectavatar.cpp makes visible the most likely default action
+-->
<button
follows="top|left"
- height="18"
- image_disabled="ForwardArrow_Disabled"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
- layout="topleft"
- name="view_profile_btn"
- picture_style="true"
- right="-8"
- top="35"
- left_delta="110"
- tab_stop="false"
- width="18" />
- <button
- follows="bottom|left"
- height="23"
+ height="20"
label="Add Friend"
left="8"
- top="246"
+ top="119"
name="add_friend_btn"
- width="100" />
- <menu_button
+ width="90" />
+ <button
+ follows="top|left"
+ height="20"
+ label="IM"
+ left_delta="0"
+ top_delta="0"
+ name="im_btn"
+ width="80"
+ commit_callback.function="InspectAvatar.IM"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Profile"
+ layout="topleft"
+ name="view_profile_btn"
+ left_delta="96"
+ top_delta="0"
+ tab_stop="false"
+ width="80" />
+ <!-- gear buttons here -->
+ <menu_button
follows="top|left"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="20"
+ layout="topleft"
+ image_overlay="OptionsMenu_Off"
menu_filename="menu_inspect_avatar_gear.xml"
name="gear_btn"
- picture_style="true"
- right="-10"
- top="249"
- width="18" />
- <menu_button
- visible="false"
+ right="-5"
+ top_delta="0"
+ width="35" />
+ <menu_button
follows="top|left"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="20"
+ image_overlay="OptionsMenu_Off"
menu_filename="menu_inspect_self_gear.xml"
name="gear_self_btn"
- picture_style="true"
- right="-10"
- top="249"
- width="18" />
+ right="-5"
+ top_delta="0"
+ width="35" />
+ <panel
+ follows="top|left"
+ top="148"
+ left="0"
+ height="60"
+ width="228"
+ visible="false"
+ background_visible="true"
+ name="moderator_panel"
+ background_opaque="true"
+ bg_opaque_color="MouseGray">
+ <button
+ name="disable_voice"
+ label="Disable Voice"
+ top="20"
+ width="95"
+ height="20"
+ left="10"
+ commit_callback.function="InspectAvatar.DisableVoice"/>
+ <button
+ name="enable_voice"
+ label="Enable Voice"
+ top="20"
+ width="95"
+ height="20"
+ left="10"
+ visible="false"
+ commit_callback.function="InspectAvatar.EnableVoice"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index db12daa6e0..37ae5a64d7 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -4,105 +4,101 @@
Single instance - only have one at a time, recycle it each spawn
-->
<floater
- legacy_header_height="18"
+ legacy_header_height="25"
bevel_style="in"
bg_opaque_image="Inspector_Background"
can_close="false"
can_minimize="false"
- height="138"
+ height="158"
layout="topleft"
name="inspect_group"
single_instance="true"
sound_flags="0"
visible="true"
- width="245">
+ width="228">
<string name="PrivateGroup">Private group</string>
<string name="FreeToJoin">Free to join</string>
<string name="CostToJoin">L$[AMOUNT] to join</string>
<string name="YouAreMember">You are a member</string>
<text
follows="all"
- font="SansSerifLargeBold"
- height="18"
+ font="SansSerifLarge"
+ height="16"
left="8"
name="group_name"
- top="5"
- text_color="white"
+ top="10"
+ text_color="White"
use_ellipses="true"
- width="240"
+ width="175"
word_wrap="false">
- Grumpity's Grumpy Group of Moose
+ Grumpity&apos;s Grumpy Group of Moose
</text>
<text
follows="all"
- font="SansSerifSmallBold"
+ font="SansSerifSmall"
text_color="White"
- height="18"
+ height="16"
left="8"
name="group_subtitle"
use_ellipses="true"
- top_pad="0"
- width="170">
+ width="175">
123 members
</text>
<text
follows="all"
- height="50"
+ height="45"
left="8"
name="group_details"
- top_pad="0"
- width="170"
+ use_ellipses="true"
+ top_pad="6"
+ width="220"
word_wrap="true">
A group of folks charged with creating a room with a moose.
Fear the moose! Fear it! And the mongoose too!
</text>
<text
follows="all"
- height="15"
+ height="13"
left="8"
name="group_cost"
- top_pad="2"
- width="170">
+ top_pad="13"
+ width="220">
L$123 to join
</text>
<icon
follows="all"
height="38"
- right="-25"
+ right="-10"
mouse_opaque="true"
name="group_icon"
- top="24"
- width="38" />
- <button
- follows="top|left"
- height="18"
- image_disabled="ForwardArrow_Disabled"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
- name="view_profile_btn"
- picture_style="true"
- right="-8"
- top="35"
- left_delta="110"
- tab_stop="false"
- width="18"
- commit_callback.function="InspectGroup.ViewProfile" />
+ top="10"
+ width="38"
+ bevel_style="in" />
<button
follows="bottom|left"
height="23"
label="Join"
left="8"
- top="246"
+ top="286"
name="join_btn"
- width="100"
+ width="103"
commit_callback.function="InspectGroup.Join"/>
<button
follows="bottom|left"
height="23"
label="Leave"
left="8"
- top="246"
+ top="286"
name="leave_btn"
- width="100"
+ width="103"
commit_callback.function="InspectGroup.Leave"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="View Profile"
+ name="view_profile_btn"
+ top="286"
+ left="117"
+ width="103"
+ commit_callback.function="InspectGroup.ViewProfile" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 603ff55e6d..00e00b9694 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -4,165 +4,177 @@
Single instance - only have one at a time, recycle it each spawn
-->
<floater
- legacy_header_height="18"
+ legacy_header_height="25"
bevel_style="in"
- bg_opaque_image="Inspector_Background"
+ bg_opaque_image="Inspector_Background"
can_close="false"
can_minimize="false"
- height="145"
+ height="150"
layout="topleft"
name="inspect_object"
single_instance="true"
sound_flags="0"
visible="true"
- width="300">
+ width="228">
<string name="Creator">By [CREATOR]</string>
<string name="CreatorAndOwner">
by [CREATOR]
owner [OWNER]
</string>
- <!-- *TODO: Might need to change to [AMOUNT] if icon contains "L$" -->
<string name="Price">L$[AMOUNT]</string>
<string name="PriceFree">Free!</string>
<string name="Touch">Touch</string>
<string name="Sit">Sit</string>
<text
follows="all"
- font="SansSerifLargeBold"
+ font="SansSerifLarge"
height="16"
left="8"
name="object_name"
text_color="White"
- top="5"
+ top="10"
use_ellipses="true"
value="Test Object Name That Is Really Long"
- width="291" />
+ width="220" />
<text
follows="all"
- font="SansSerif"
- height="30"
+ height="33"
left="8"
name="object_creator"
top_pad="0"
use_ellipses="true"
- width="275">
-by Longavatarname Johnsonlongstonnammer
-owner James Linden
+ width="220">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
</text>
<!-- *TODO: Replace this icon -->
<icon
name="price_icon"
image_name="Icon_For_Sale"
- left="7"
+ right="-5"
width="16"
height="16"
- top="52"
+ top="56"
follows="left|top"
/>
<text
follows="all"
- font="SansSerifSmallBold"
+ font="SansSerifSmall"
+ font.style="BOLD"
height="16"
- left_pad="5"
+ halign="right"
+ left="5"
name="price_text"
text_color="white"
- top="54"
+ top="58"
font_shadow="none"
- width="150">
+ width="196">
L$300,000
</text>
- <text
+ <text
+ clip_partial="true"
follows="all"
- height="30"
+ font="SansSerifSmall"
+ height="37"
left="8"
name="object_description"
top_pad="0"
- width="291"
- use_ellipses="true"
+ use_ellipses="true"
+ width="220"
word_wrap="true">
This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
</text>
<!-- Overlapping buttons for all default actions. Show "Buy" if
for sale, "Sit" if can sit, etc. -->
+ <text
+ follows="all"
+ font="SansSerifSmall"
+ height="13"
+ left_delta="0"
+ name="object_media_url"
+ bottom_pad="2"
+ width="200"
+ max_length = "50"
+ use_ellipses="true">
+ http://www.superdupertest.com
+</text>
<button
- follows="top|left"
- font="SansSerif"
- height="23"
- label="Buy"
- left="10"
- name="buy_btn"
- top="114"
- width="100" />
+ follows="top|left"
+ height="20"
+ label="Buy"
+ left="8"
+ name="buy_btn"
+ top="121"
+ width="80" />
<button
follows="top|left"
- font="SansSerif"
- height="23"
+ height="20"
label="Pay"
left_delta="0"
name="pay_btn"
top_delta="0"
- width="100" />
+ width="80" />
<button
follows="top|left"
- font="SansSerif"
- height="23"
+ height="20"
label="Take Copy"
left_delta="0"
name="take_free_copy_btn"
top_delta="0"
- width="100" />
+ width="80" />
<button
follows="top|left"
- font="SansSerifSmall"
- height="23"
+ height="20"
label="Touch"
left_delta="0"
name="touch_btn"
top_delta="0"
- width="100" />
+ width="80" />
<button
follows="top|left"
- font="SansSerif"
- height="23"
+ height="20"
label="Sit"
left_delta="0"
name="sit_btn"
top_delta="0"
- width="100" />
+ width="80" />
<button
follows="top|left"
- font="SansSerifSmall"
- height="23"
+ height="20"
label="Open"
left_delta="0"
name="open_btn"
top_delta="0"
- width="100" />
- <!-- non-overlapping buttons here -->
- <menu_button
- follows="top|left"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
- menu_filename="menu_inspect_object_gear.xml"
- name="gear_btn"
- picture_style="true"
- right="-10"
- top_delta="5"
- width="18" />
- <button
+ width="80" />
+ <icon
+ name="secure_browsing"
+ image_name="Lock"
+ left_delta="80"
+ visible="false"
+ width="18"
+ height="18"
+ top_delta="0"
+ tool_tip="Secure Browsing"
+ follows="left|top" />
+
+ <!-- non-overlapping buttons here -->
+ <button
follows="top|left"
- height="18"
- image_disabled="ForwardArrow_Disabled"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
+ height="20"
+ label="More"
layout="topleft"
name="more_info_btn"
- picture_style="true"
- right="-5"
- top="20"
- left_delta="110"
+ left_delta="10"
+ top_delta="0"
tab_stop="false"
- width="18" />
+ width="80" />
+ <menu_button
+ follows="top|left"
+ height="20"
+ image_overlay="OptionsMenu_Off"
+ menu_filename="menu_inspect_object_gear.xml"
+ name="gear_btn"
+ right="-5"
+ top_delta="0"
+ width="35" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
new file mode 100644
index 0000000000..ef3dd844cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="18"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="130"
+ layout="topleft"
+ name="inspect_remote_object"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="300">
+ <text
+ follows="all"
+ font="SansSerifLarge"
+ font_style="BOLD"
+ height="30"
+ left="8"
+ name="object_name"
+ text_color="White"
+ top="5"
+ use_ellipses="true"
+ word_wrap="true"
+ width="291">
+ Test Object Name That Is Really Long OMG so long I can't believe how long the name of this object is, I mean really.
+ </text>
+ <text
+ follows="top|left"
+ font="SansSerifSmall"
+ height="16"
+ left="8"
+ name="object_owner_label"
+ width="55"
+ top_pad="12">
+ Owner:
+ </text>
+ <text
+ follows="top|left"
+ height="16"
+ left_pad="5"
+ name="object_owner"
+ use_ellipses="true"
+ width="230"
+ word_wrap="false">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <!--<text
+ follows="top|left"
+ height="16"
+ left="8"
+ name="object_slurl_label"
+ top_pad="5"
+ width="55">
+ Location:
+ </text>-->
+ <text
+ follows="top|left"
+ height="16"
+ left="8"
+ name="object_slurl"
+ width="290"
+ use_ellipses="true"
+ word_wrap="false">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button
+ follows="top|left"
+ height="23"
+ label="Map"
+ left="8"
+ top_pad="8"
+ name="map_btn"
+ width="90" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Block"
+ left_pad="8"
+ name="block_btn"
+ width="90" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Close"
+ right="-8"
+ name="close_btn"
+ left_pad="5"
+ width="90" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_toast.xml b/indra/newview/skins/default/xui/en/inspect_toast.xml
new file mode 100644
index 0000000000..0221397a8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/inspect_toast.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="25"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="148"
+ layout="topleft"
+ name="inspect_toast"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="228">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
new file mode 100644
index 0000000000..7b6081d7be
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="left|right|top|bottom"
+ height="768"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="main_view"
+ width="1024">
+ <layout_stack border_size="0"
+ follows="all"
+ mouse_opaque="false"
+ height="749"
+ name="menu_stack"
+ orientation="vertical"
+ top="19">
+ <layout_panel auto_resize="false"
+ height="60"
+ mouse_opaque="false"
+ name="nav_bar_container"
+ tab_stop="false"
+ width="1024"
+ user_resize="false"
+ visible="false">
+ </layout_panel>
+ <layout_panel auto_resize="true"
+ follows="all"
+ height="500"
+ layout="topleft"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="hud"
+ width="1024">
+ <layout_stack border_size="0"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="hud_stack"
+ orientation="horizontal"
+ top="0"
+ width="1024">
+ <layout_panel auto_resize="true"
+ follows="all"
+ height="500"
+ layout="topleft"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="non_side_tray_view"
+ user_resize="false"
+ width="500">
+ <view bottom="500"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_view_rect"
+ width="500"/>
+ <layout_stack border_size="0"
+ bottom="500"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_stack"
+ orientation="vertical"
+ tab_stop="false">
+ <panel auto_resize="true"
+ follows="all"
+ height="500"
+ layout="topleft"
+ tab_stop="false"
+ mouse_opaque="false"
+ name="hud container"
+ width="500">
+ <panel follows="right|top|bottom"
+ height="500"
+ mouse_opaque="false"
+ name="side_bar_tabs"
+ right="500"
+ tab_stop="false"
+ top="0"
+ width="32"/>
+ <panel bottom="500"
+ follows="left|right|bottom"
+ height="25"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="stand_stop_flying_container"
+ visible="false"
+ width="500"/>
+ </panel>
+ <layout_panel auto_resize="false"
+ follows="all"
+ min_height="33"
+ mouse_opaque="false"
+ name="bottom_tray_container"
+ visible="false"/>
+ </layout_stack>
+ </layout_panel>
+ <!-- side tray -->
+ <layout_panel auto_resize="false"
+ follows="all"
+ height="500"
+ min_width="333"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="side_tray_container"
+ user_resize="false"
+ visible="false"
+ width="333"/>
+ </layout_stack>
+ <panel follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="floater_view_holder"
+ tab_group="-1"
+ tab_stop="false"
+ top="0"
+ width="1024">
+ <floater_view follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="Floater View"
+ tab_group="-1"
+ tab_stop="false"
+ top="0"
+ width="1024"/>
+ </panel>
+ <debug_view follows="all"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ height="500"
+ name="DebugView"
+ width="1024"/>
+ </layout_panel>
+ </layout_stack>
+ <panel mouse_opaque="false"
+ follows="left|right|top"
+ name="status_bar_container"
+ tab_stop="false"
+ height="19"
+ left="0"
+ top="0"
+ width="1024"
+ visible="false"/>
+ <notify_box_view top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="notify_container"
+ tab_group="-2"
+ width="1024"/>
+ <menu_holder top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="Menu Holder"
+ width="1024"/>
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="popup_holder"
+ width="1024"/>
+ <snapshot_floater_view enabled="false"
+ follows="all"
+ height="768"
+ left="0"
+ mouse_opaque="false"
+ name="Snapshot Floater View"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
+ <tooltip_view top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="tooltip view"
+ tab_group="-2"
+ width="1024"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
new file mode 100644
index 0000000000..c5b31c7f63
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+ <menu_item_call
+ label="View Profile"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="hit object" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Add Friend"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableAddFriend" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="Send IM...">
+ <menu_item_call.on_click
+ function="Avatar.SendIM" />
+ </menu_item_call>
+ <menu_item_call
+ label="Call"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableCall" />
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to Group"
+ name="Invite...">
+ <menu_item_call.on_click
+ function="Avatar.InviteToGroup" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Avatar Mute">
+ <menu_item_call.on_click
+ function="Avatar.Mute" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="abuse">
+ <menu_item_call.on_click
+ function="Avatar.ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="Freeze...">
+ <menu_item_call.on_click
+ function="Avatar.Freeze" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="Eject...">
+ <menu_item_call.on_click
+ function="Avatar.Eject" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Debug"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Tools.LookAtSelection"
+ parameter="zoom" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pay"
+ name="Pay...">
+ <menu_item_call.on_click
+ function="PayObject" />
+ <menu_item_call.on_enable
+ function="EnablePayAvatar" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Object Profile"
+ name="Object Inspect">
+ <menu_item_call.on_click
+ function="Object.Inspect" />
+ <menu_item_call.on_enable
+ function="Object.EnableInspect" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
new file mode 100644
index 0000000000..281ec5a7c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Attachment Pie">
+ <menu_item_call
+ enabled="false"
+ label="Touch"
+ layout="topleft"
+ name="Attachment Object Touch">
+ <menu_item_call.on_click
+ function="Object.Touch" />
+ <menu_item_call.on_enable
+ function="Object.EnableTouch"
+ name="EnableTouch"
+ parameter="Touch" />
+ </menu_item_call>
+ <!--menu_item_call
+ label="Stand Up"
+ layout="topleft"
+ name="Stand Up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call-->
+ <menu_item_call
+ enabled="false"
+ label="Edit"
+ layout="topleft"
+ name="Edit...">
+ <menu_item_call.on_click
+ function="Object.Edit" />
+ <menu_item_call.on_enable
+ function="EnableEdit" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Detach"
+ layout="topleft"
+ name="Detach">
+ <menu_item_call.on_click
+ function="Attachment.Detach" />
+ <menu_item_call.on_enable
+ function="Attachment.EnableDetach" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Drop"
+ layout="topleft"
+ name="Drop">
+ <menu_item_call.on_click
+ function="Attachment.Drop" />
+ <menu_item_call.on_enable
+ function="Attachment.EnableDrop" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+
+ <menu_item_call
+ label="Stand Up"
+ layout="topleft"
+ name="Stand Up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Appearance"
+ name="Appearance...">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Groups"
+ layout="topleft"
+ name="Groups...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Profile"
+ layout="topleft"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
index df510d68eb..50910dff32 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
@@ -9,7 +9,7 @@
visible="false"
width="128">
<menu_item_call
- label="Show Profile..."
+ label="View Profile"
layout="topleft"
name="Show Profile">
<menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
new file mode 100644
index 0000000000..ac9101cfd9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Avatar Pie">
+ <menu_item_call
+ label="View Profile"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="hit object" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Add Friend"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableAddFriend" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="Send IM...">
+ <menu_item_call.on_click
+ function="Avatar.SendIM" />
+ </menu_item_call>
+ <menu_item_call
+ label="Call"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableCall" />
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to Group"
+ name="Invite...">
+ <menu_item_call.on_click
+ function="Avatar.InviteToGroup" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Avatar Mute">
+ <menu_item_call.on_click
+ function="Avatar.Mute" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="abuse">
+ <menu_item_call.on_click
+ function="Avatar.ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="Freeze...">
+ <menu_item_call.on_click
+ function="Avatar.Freeze" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="Eject...">
+ <menu_item_call.on_click
+ function="Avatar.Eject" />
+ <menu_item_call.on_visible
+ function="Avatar.EnableFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Debug"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Tools.LookAtSelection"
+ parameter="zoom" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pay"
+ name="Pay...">
+ <menu_item_call.on_click
+ function="PayObject" />
+ <menu_item_call.on_enable
+ function="EnablePayAvatar" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
new file mode 100644
index 0000000000..1e32cfd9df
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Self Pie">
+ <menu_item_call
+ label="Stand Up"
+ layout="topleft"
+ name="Stand Up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call>
+ <context_menu
+ label="Take Off â–¶"
+ layout="topleft"
+ name="Take Off &gt;">
+ <context_menu
+ label="Clothes â–¶"
+ layout="topleft"
+ name="Clothes &gt;">
+ <menu_item_call
+ enabled="false"
+ label="Shirt"
+ layout="topleft"
+ name="Shirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pants"
+ layout="topleft"
+ name="Pants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="pants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Skirt"
+ layout="topleft"
+ name="Skirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="skirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Shoes"
+ layout="topleft"
+ name="Shoes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shoes" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Socks"
+ layout="topleft"
+ name="Socks">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="socks" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Jacket"
+ layout="topleft"
+ name="Jacket">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="jacket" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Gloves"
+ layout="topleft"
+ name="Gloves">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="gloves" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Undershirt"
+ layout="topleft"
+ name="Self Undershirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="undershirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Underpants"
+ layout="topleft"
+ name="Self Underpants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="underpants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Tattoo"
+ layout="topleft"
+ name="Self Tattoo">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="tattoo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="tattoo" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Alpha"
+ layout="topleft"
+ name="Self Alpha">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="alpha" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="All Clothes"
+ layout="topleft"
+ name="All Clothes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="all" />
+ </menu_item_call>
+ </context_menu>
+ <context_menu
+ label="HUD â–¶"
+ layout="topleft"
+ name="Object Detach HUD" />
+ <context_menu
+ label="Detach â–¶"
+ layout="topleft"
+ name="Object Detach" />
+ <menu_item_call
+ label="Detach All"
+ layout="topleft"
+ name="Detach All">
+ <menu_item_call.on_click
+ function="Self.RemoveAllAttachments"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableRemoveAllAttachments" />
+ </menu_item_call>
+ </context_menu>
+ <menu_item_call
+ label="My Appearance"
+ layout="topleft"
+ name="Appearance...">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Groups"
+ layout="topleft"
+ name="Groups...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Profile"
+ layout="topleft"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
index a7abb223ba..7ef91a1d85 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -52,4 +52,57 @@
function="CheckControl"
parameter="ShowSnapshotButton" />
</menu_item_check>
+ <menu_item_separator
+ name="Separator" />
+ <menu_item_call
+ label="Cut"
+ name="NearbyChatBar_Cut">
+ <menu_item_call.on_click
+ function="NearbyChatBar.Action"
+ parameter="cut" />
+ <menu_item_call.on_enable
+ function="NearbyChatBar.EnableMenuItem"
+ parameter="can_cut" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ name="NearbyChatBar_Copy">
+ <menu_item_call.on_click
+ function="NearbyChatBar.Action"
+ parameter="copy" />
+ <menu_item_call.on_enable
+ function="NearbyChatBar.EnableMenuItem"
+ parameter="can_copy" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ name="NearbyChatBar_Paste">
+ <menu_item_call.on_click
+ function="NearbyChatBar.Action"
+ parameter="paste" />
+ <menu_item_call.on_enable
+ function="NearbyChatBar.EnableMenuItem"
+ parameter="can_paste" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete"
+ name="NearbyChatBar_Delete">
+ <menu_item_call.on_click
+ function="NearbyChatBar.Action"
+ parameter="delete" />
+ <menu_item_call.on_enable
+ function="NearbyChatBar.EnableMenuItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Select All"
+ name="NearbyChatBar_Select_All">
+ <menu_item_call.on_click
+ function="NearbyChatBar.Action"
+ parameter="select_all" />
+ <menu_item_call.on_enable
+ function="NearbyChatBar.EnableMenuItem"
+ parameter="can_select_all" />
+ </menu_item_call>
+
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
new file mode 100644
index 0000000000..649f0edff7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ mouse_opaque="false"
+ name="menu_gesture_gear"
+ visible="false">
+ <menu_item_call
+ font="SansSerifBold"
+ label="Add/Remove from Favorites"
+ layout="topleft"
+ name="activate">
+ <on_click
+ function="Gesture.Action.ToogleActiveState" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ layout="topleft"
+ name="copy_gesture">
+ <on_click
+ function="Gesture.Action.CopyPaste"
+ parameter="copy_gesture" />
+ <on_enable
+ function="Gesture.EnableAction"
+ parameter="copy_gesture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ layout="topleft"
+ name="paste">
+ <on_click
+ function="Gesture.Action.CopyPaste"
+ parameter="paste" />
+ <on_enable
+ function="Gesture.EnableAction"
+ parameter="paste" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy UUID"
+ layout="topleft"
+ name="copy_uuid">
+ <on_click
+ function="Gesture.Action.CopyPaste"
+ parameter="copy_uuid" />
+ <on_enable
+ function="Gesture.EnableAction"
+ parameter="copy_uuid" />
+ </menu_item_call>
+ <menu_item_call
+ label="Save to current outfit"
+ layout="topleft"
+ name="save_to_outfit">
+ <on_click
+ function="Gesture.Action.SaveToCOF" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="edit_gesture">
+ <on_click
+ function="Gesture.Action.ShowPreview" />
+ <on_enable
+ function="Gesture.EnableAction"
+ parameter="edit_gesture" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_im_well_button.xml b/indra/newview/skins/default/xui/en/menu_im_well_button.xml
new file mode 100644
index 0000000000..f8dfba91ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_im_well_button.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="IM Well Button Context Menu">
+ <menu_item_call
+ label="Close All"
+ layout="topleft"
+ name="Close All">
+ <menu_item_call.on_click
+ function="IMWellChicletMenu.Action"
+ parameter="close all" />
+ <menu_item_call.on_enable
+ function="IMWellChicletMenu.EnableItem"
+ parameter="can close all" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..eb5e31b57d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_adhoc.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="101"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="IMChiclet AdHoc Menu"
+ top="724"
+ visible="false"
+ width="128">
+ <menu_item_call
+ label="End Session"
+ layout="topleft"
+ name="End Session">
+ <menu_item_call.on_click
+ function="IMChicletMenu.Action"
+ parameter="end" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
index 542e319792..8cbe62cfb0 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
@@ -9,7 +9,15 @@
visible="false"
width="128">
<menu_item_call
- label="Chat..."
+ label="Group Info"
+ layout="topleft"
+ name="Show Profile">
+ <menu_item_call.on_click
+ function="IMChicletMenu.Action"
+ parameter="info" />
+ </menu_item_call>
+ <menu_item_call
+ label="Show Session"
layout="topleft"
name="Chat">
<menu_item_call.on_click
@@ -17,11 +25,11 @@
parameter="group chat" />
</menu_item_call>
<menu_item_call
- label="Info..."
+ label="End Session"
layout="topleft"
- name="Show Profile">
+ name="End Session">
<menu_item_call.on_click
function="IMChicletMenu.Action"
- parameter="info" />
+ parameter="end" />
</menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
index c205868429..038b8328cb 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
@@ -9,7 +9,7 @@
visible="false"
width="128">
<menu_item_call
- label="Show Profile..."
+ label="View Profile"
layout="topleft"
name="Show Profile">
<menu_item_call.on_click
@@ -17,7 +17,15 @@
parameter="profile" />
</menu_item_call>
<menu_item_call
- label="Send IM..."
+ label="Add Friend"
+ layout="topleft"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="IMChicletMenu.Action"
+ parameter="add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Show Session"
layout="topleft"
name="Send IM">
<menu_item_call.on_click
@@ -25,11 +33,11 @@
parameter="im" />
</menu_item_call>
<menu_item_call
- label="Add Friend..."
+ label="End Session"
layout="topleft"
- name="Add Friend">
+ name="End Session">
<menu_item_call.on_click
function="IMChicletMenu.Action"
- parameter="add" />
+ parameter="end" />
</menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index edff1a093a..1b002b1c32 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -1,112 +1,125 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
- <menu_item_call
- label="View Profile"
- layout="topleft"
- enabled="true"
- name="view_profile">
- <menu_item_call.on_click
- function="InspectAvatar.ViewProfile"/>
- </menu_item_call>
- <menu_item_call
- label="Add Friend"
- layout="topleft"
- name="add_friend">
- <menu_item_call.on_click
- function="InspectAvatar.AddFriend"/>
- </menu_item_call>
- <menu_item_call
- label="IM"
- layout="topleft"
- name="im">
- <menu_item_call.on_click
- function="InspectAvatar.IM"/>
- </menu_item_call>
- <menu_item_call
- label="Call"
- layout="topleft"
- enabled="true"
- name="call">
- </menu_item_call>
- <menu_item_call
- label="Teleport"
- layout="topleft"
- name="teleport">
- <menu_item_call.on_click
- function="InspectAvatar.Teleport"/>
- </menu_item_call>
- <menu_item_call
- label="Invite to Group"
- layout="topleft"
- name="invite_to_group">
- <menu_item_call.on_click
- function="InspectAvatar.InviteToGroup"/>
- </menu_item_call>
- <menu_item_separator layout="topleft" />
- <menu_item_call
- label="Block"
- layout="topleft"
- name="block">
- <menu_item_call.on_click
- function="InspectAvatar.Block"/>
- </menu_item_call>
- <menu_item_call
- label="Report"
- layout="topleft"
- name="report">
- <menu_item_call.on_click
- function="InspectAvatar.Report"/>
- </menu_item_call>
- <menu_item_call
- label="Freeze"
- name="freeze">
- <menu_item_call.on_click
- function="InspectAvatar.Freeze"/>
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Eject"
- name="eject">
- <menu_item_call.on_click
- function="InspectAvatar.Eject"/>
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Debug"
- name="debug">
- <menu_item_call.on_click
- function="InspectAvatar.Debug"/>
- <menu_item_call.on_visible
- function="IsGodCustomerService"/>
- </menu_item_call>
- <menu_item_call
- label="Find On Map"
- layout="topleft"
- name="find_on_map">
- <menu_item_call.on_click
- function="InspectAvatar.FindOnMap"/>
- <menu_item_call.on_visible
- function="InspectAvatar.VisibleFindOnMap"/>
- </menu_item_call>
- <menu_item_call
- label="Zoom In"
- layout="topleft"
- name="zoom_in">
- <menu_item_call.on_click
- function="InspectAvatar.ZoomIn"/>
- </menu_item_call>
- <menu_item_call
- label="Pay"
- layout="topleft"
- name="pay">
- <menu_item_call.on_click
- function="InspectAvatar.Pay"/>
- </menu_item_call>
-</menu> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+ create_jump_keys="true"
+ layout="topleft"
+ mouse_opaque="false"
+ visible="false"
+ name="Gear Menu">
+ <menu_item_call
+ label="View Profile"
+ enabled="true"
+ name="view_profile">
+ <menu_item_call.on_click
+ function="InspectAvatar.ViewProfile"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend"
+ name="add_friend">
+ <menu_item_call.on_click
+ function="InspectAvatar.AddFriend"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.Enable"/>
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ name="im">
+ <menu_item_call.on_click
+ function="InspectAvatar.IM"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Call"
+ enabled="true"
+ name="call">
+ <menu_item_call.on_click
+ function="InspectAvatar.Call"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.EnableCall"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Teleport"
+ name="teleport">
+ <menu_item_call.on_click
+ function="InspectAvatar.Teleport"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Invite to Group"
+ name="invite_to_group">
+ <menu_item_call.on_click
+ function="InspectAvatar.InviteToGroup"/>
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Block"
+ name="block">
+ <menu_item_call.on_click
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <menu_item_call.on_click
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableUnmute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report"
+ name="report">
+ <menu_item_call.on_click
+ function="InspectAvatar.Report"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ name="freeze">
+ <menu_item_call.on_click
+ function="InspectAvatar.Freeze"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Eject"
+ name="eject">
+ <menu_item_call.on_click
+ function="InspectAvatar.Eject"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleFreezeEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Debug"
+ name="debug">
+ <menu_item_call.on_click
+ function="Avatar.Debug"/>
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Find On Map"
+ name="find_on_map">
+ <menu_item_call.on_click
+ function="InspectAvatar.FindOnMap"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleFindOnMap"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="zoom_in">
+ <menu_item_call.on_click
+ function="InspectAvatar.ZoomIn"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.VisibleZoomIn"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Pay"
+ name="pay">
+ <menu_item_call.on_click
+ function="InspectAvatar.Pay"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Share"
+ name="share">
+ <menu_item_call.on_click
+ function="InspectAvatar.Share"/>
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
index 93c53981f3..22df02cd7e 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
@@ -13,7 +13,7 @@
<menu_item_call.on_click
function="InspectObject.Touch"/>
<menu_item_call.on_visible
- function="Object.VisibleTouch" />
+ function="Object.EnableTouch" />
</menu_item_call>
<menu_item_call
label="Sit"
@@ -31,7 +31,7 @@
<menu_item_call.on_click
function="InspectObject.Pay"/>
<menu_item_call.on_visible
- function="VisiblePayObject" />
+ function="EnablePayObject" />
</menu_item_call>
<menu_item_call
label="Buy"
@@ -59,7 +59,7 @@
<menu_item_call.on_click
function="InspectObject.TakeFreeCopy"/>
<menu_item_call.on_visible
- function="Tools.VisibleTakeCopy"/>
+ function="Tools.EnableTakeCopy"/>
</menu_item_call>
<menu_item_call
label="Open"
@@ -68,16 +68,16 @@
<menu_item_call.on_click
function="InspectObject.Open"/>
<menu_item_call.on_visible
- function="Object.VisibleOpen" />
+ function="Object.EnableOpen" />
</menu_item_call>
<menu_item_call
label="Edit"
layout="topleft"
- name="report">
+ name="edit">
<menu_item_call.on_click
function="Object.Edit" />
<menu_item_call.on_enable
- function="Object.VisibleEdit"/>
+ function="EnableEdit"/>
</menu_item_call>
<menu_item_call
label="Wear"
@@ -86,7 +86,7 @@
<menu_item_call.on_click
function="Object.AttachToAvatar" />
<menu_item_call.on_visible
- function="Object.VisibleWear" />
+ function="Object.EnableWear" />
</menu_item_call>
<menu_item_call
label="Report"
@@ -102,7 +102,7 @@
<menu_item_call.on_click
function="Object.Mute" />
<menu_item_call.on_visible
- function="Object.VisibleMute" />
+ function="Object.EnableMute" />
</menu_item_call>
<menu_item_call
label="Zoom In"
@@ -118,7 +118,7 @@
<menu_item_call.on_click
function="Object.Delete" />
<menu_item_call.on_visible
- function="Object.VisibleDelete" />
+ function="Object.EnableDelete" />
</menu_item_call>
<menu_item_call
label="More Info"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 240822e5ca..9dc2611663 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -1,53 +1,48 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
- <menu_item_call
- label="Stand Up"
- layout="topleft"
- enabled="true"
- name="stand_up">
- <menu_item_call.on_click
- function="Self.StandUp"
- parameter="" />
- <menu_item_call.on_visible
- function="Self.VisibleStandUp" />
- </menu_item_call>
- <menu_item_call
- label="My Appearance"
- layout="topleft"
- name="my_appearance">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
- </menu_item_call>
- <menu_item_call
- label="My Profile"
- layout="topleft"
- enabled="true"
- name="my_profile">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="My Friends"
- layout="topleft"
- name="my_friends">
- <menu_item_call.on_click
- function="Self.Friends"
- parameter="" />
- </menu_item_call>
- <menu_item_call
- label="My Groups"
- layout="topleft"
- name="my_groups">
- <menu_item_call.on_click
- function="Self.Groups" />
- </menu_item_call>
-</menu> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+ create_jump_keys="true"
+ layout="topleft"
+ mouse_opaque="false"
+ visible="false"
+ name="Gear Menu">
+ <menu_item_call
+ label="Stand Up"
+ enabled="true"
+ name="stand_up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_visible
+ function="Self.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Appearance"
+ name="my_appearance">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Profile"
+ enabled="true"
+ name="my_profile">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Friends"
+ name="my_friends">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Groups"
+ name="my_groups">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 62940b87dc..2874151df5 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -85,7 +85,7 @@
parameter="lsl" />
</menu_item_call>
<menu_item_call
- label="New Note"
+ label="New Notecard"
layout="topleft"
name="New Note">
<menu_item_call.on_click
@@ -339,31 +339,61 @@
function="Inventory.DoToSelected"
parameter="open" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Folder Wearables Separator" />
<menu_item_call
- label="Purge Item"
+ label="Replace Current Outfit"
layout="topleft"
- name="Purge Item">
+ name="Replace Outfit">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="purge" />
+ parameter="replaceoutfit" />
</menu_item_call>
<menu_item_call
- label="Restore Item"
+ label="Add To Current Outfit"
layout="topleft"
- name="Restore Item">
+ name="Add To Outfit">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="restore" />
+ parameter="addtooutfit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove From Current Outfit"
+ layout="topleft"
+ name="Remove From Outfit">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="removefromoutfit" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Outfit Separator" />
<menu_item_call
- label="Goto Link"
+ label="Find Original"
layout="topleft"
- name="Goto Link">
+ name="Find Original">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="goto" />
</menu_item_call>
<menu_item_call
+ label="Purge Item"
+ layout="topleft"
+ name="Purge Item">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="purge" />
+ </menu_item_call>
+ <menu_item_call
+ label="Restore Item"
+ layout="topleft"
+ name="Restore Item">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="restore" />
+ </menu_item_call>
+ <menu_item_call
label="Open"
layout="topleft"
name="Open">
@@ -396,7 +426,8 @@
parameter="copy_uuid" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Copy Separator" />
<menu_item_call
label="Copy"
layout="topleft"
@@ -422,43 +453,36 @@
parameter="paste_link" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Paste Separator" />
<menu_item_call
- label="Delete"
+ label="Remove Link"
layout="topleft"
- name="Delete">
+ name="Remove Link">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="delete" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
<menu_item_call
- label="Take Off Items"
- layout="topleft"
- name="Take Off Items">
- <menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="removefromoutfit" />
- </menu_item_call>
- <menu_item_call
- label="Add To Outfit"
+ label="Delete"
layout="topleft"
- name="Add To Outfit">
+ name="Delete">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="addtooutfit" />
+ parameter="delete" />
</menu_item_call>
<menu_item_call
- label="Replace Outfit"
+ label="Delete System Folder"
layout="topleft"
- name="Replace Outfit">
+ name="Delete System Folder">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="replaceoutfit" />
+ parameter="delete_system_folder" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
+ <menu_item_separator
+ layout="topleft" />
<menu_item_call
label="Start Conference Chat"
layout="topleft"
@@ -489,9 +513,10 @@
parameter="about" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Animation Separator" />
<menu_item_call
- label="Play in World"
+ label="Play Inworld"
layout="topleft"
name="Animation Play">
<menu_item_call.on_click
@@ -507,7 +532,8 @@
parameter="playlocal" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Send Instant Message Separator" />
<menu_item_call
label="Send Instant Message"
layout="topleft"
@@ -533,7 +559,8 @@
parameter="selected" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Gesture Separator" />
<menu_item_call
label="Activate"
layout="topleft"
@@ -551,7 +578,19 @@
parameter="deactivate" />
</menu_item_call>
<menu_item_separator
- layout="topleft" />
+ layout="topleft"
+ name="Texture Separator" />
+ <menu_item_call
+ label="Save As"
+ layout="topleft"
+ name="Save As">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="save_as" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Attach Separator"/>
<menu_item_call
label="Detach From Yourself"
layout="topleft"
@@ -587,6 +626,9 @@
label="Attach To HUD"
layout="topleft"
name="Attach To HUD" />
+ <menu_item_separator
+ layout="topleft"
+ name="Wearable Separator"/>
<menu_item_call
label="Edit"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
new file mode 100644
index 0000000000..5ad099e2d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_inventory_add"
+ visible="false">
+ <menu
+ create_jump_keys="true"
+ label="Upload"
+ layout="topleft"
+ name="upload"
+ tear_off="true">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ layout="topleft"
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound (L$[COST])..."
+ layout="topleft"
+ name="Upload Sound">
+ <menu_item_call.on_click
+ function="File.UploadSound"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation (L$[COST])..."
+ layout="topleft"
+ name="Upload Animation">
+ <menu_item_call.on_click
+ function="File.UploadAnim"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Bulk (L$[COST] per file)..."
+ layout="topleft"
+ name="Bulk Upload">
+ <menu_item_call.on_click
+ function="File.UploadBulk"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ </menu>
+
+ <menu_item_call
+ label="New Folder"
+ layout="topleft"
+ name="New Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="category" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Script"
+ layout="topleft"
+ name="New Script">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="lsl" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Notecard"
+ layout="topleft"
+ name="New Note">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="notecard" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gesture"
+ layout="topleft"
+ name="New Gesture">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gesture" />
+ </menu_item_call>
+ <menu
+ height="175"
+ label="New Clothes"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Clothes"
+ top_pad="514"
+ width="125">
+ <menu_item_call
+ label="New Shirt"
+ layout="topleft"
+ name="New Shirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Pants"
+ layout="topleft"
+ name="New Pants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Shoes"
+ layout="topleft"
+ name="New Shoes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Socks"
+ layout="topleft"
+ name="New Socks">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Jacket"
+ layout="topleft"
+ name="New Jacket">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skirt"
+ layout="topleft"
+ name="New Skirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gloves"
+ layout="topleft"
+ name="New Gloves">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Undershirt"
+ layout="topleft"
+ name="New Undershirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Underpants"
+ layout="topleft"
+ name="New Underpants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Alpha"
+ layout="topleft"
+ name="New Alpha">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Tattoo"
+ layout="topleft"
+ name="New Tattoo">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="tattoo" />
+ </menu_item_call>
+ </menu>
+ <menu
+ height="85"
+ label="New Body Parts"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Body Parts"
+ top_pad="514"
+ width="118">
+ <menu_item_call
+ label="New Shape"
+ layout="topleft"
+ name="New Shape">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shape" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skin"
+ layout="topleft"
+ name="New Skin">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skin" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Hair"
+ layout="topleft"
+ name="New Hair">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="hair" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Eyes"
+ layout="topleft"
+ name="New Eyes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="eyes" />
+ </menu_item_call>
+ </menu>
+</menu> \ No newline at end of file
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
new file mode 100644
index 0000000000..4e6a07d020
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_gear_default"
+ visible="false">
+ <menu_item_call
+ label="New Inventory Window"
+ layout="topleft"
+ name="new_window">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="new_window" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Sort by Name"
+ layout="topleft"
+ name="sort_by_name">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_by_name" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sort by Most Recent"
+ layout="topleft"
+ name="sort_by_recent">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_by_recent" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Show Filters"
+ layout="topleft"
+ name="show_filters">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="show_filters" />
+ </menu_item_call>
+ <menu_item_call
+ label="Reset Filters"
+ layout="topleft"
+ name="reset_filters">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="reset_filters" />
+ </menu_item_call>
+ <menu_item_call
+ label="Close All Folders"
+ layout="topleft"
+ name="close_folders">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="close_folders" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Empty Trash"
+ layout="topleft"
+ name="empty_trash">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="empty_trash" />
+ </menu_item_call>
+ <menu_item_call
+ label="Empty Lost and Found"
+ layout="topleft"
+ name="empty_lostnfound">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="empty_lostnfound" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Save Texture As"
+ layout="topleft"
+ name="Save Texture As">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="save_texture" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="save_texture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Find Original"
+ layout="topleft"
+ name="Find Original">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="find_original" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="find_original" />
+ </menu_item_call>
+ <menu_item_call
+ label="Find All Links"
+ layout="topleft"
+ name="Find All Links">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="find_links" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="find_links" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
new file mode 100644
index 0000000000..cc6d8ad9c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Land Pie">
+ <menu_item_call
+ label="About Land"
+ name="Place Information...">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="about_land" />
+ </menu_item_call>
+ <!-- <menu_item_call
+ label="Go Here"
+ name="Go Here">
+ <menu_item_call.on_click
+ function="GoToObject" />
+ </menu_item_call>-->
+ <menu_item_call
+ label="Sit Here"
+ name="Sit Here">
+ <menu_item_call.on_click
+ function="Land.Sit" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Buy This Land"
+ name="Land Buy">
+ <menu_item_call.on_click
+ function="Land.Buy" />
+ <menu_item_call.on_enable
+ function="World.EnableBuyLand" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Buy Pass"
+ name="Land Buy Pass">
+ <menu_item_call.on_click
+ function="Land.BuyPass" />
+ <menu_item_call.on_enable
+ function="Land.EnableBuyPass" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Build"
+ name="Create">
+ <menu_item_call.on_click
+ function="Land.Build" />
+ <menu_item_call.on_enable
+ function="EnableEdit" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Edit Terrain"
+ name="Edit Terrain">
+ <menu_item_call.on_click
+ function="Land.Edit" />
+ <menu_item_call.on_enable
+ function="EnableEdit" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index c3ee6e250b..ba74104594 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -10,22 +10,19 @@
<menu
create_jump_keys="true"
label="Me"
- layout="topleft"
+ tear_off="true"
name="File">
<menu_item_call
label="Preferences"
- layout="topleft"
name="Preferences..."
shortcut="control|P">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Toggle"
parameter="preferences" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator />
<menu_item_call
label="Quit [APP_NAME]"
- layout="topleft"
name="Quit"
shortcut="control|Q">
<menu_item_call.on_click
@@ -36,7 +33,6 @@
<menu
create_jump_keys="true"
label="Edit"
- layout="topleft"
name="Edit"
width="153">
</menu>
@@ -44,32 +40,29 @@
<menu
create_jump_keys="true"
label="Help"
- layout="topleft"
+ tear_off="true"
name="Help">
<menu_item_call
label="[SECOND_LIFE] Help"
- layout="topleft"
name="Second Life Help"
shortcut="F1">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="help f1" />
+ function="ShowHelp"
+ parameter="f1_help" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator />
<menu_item_call
label="About [APP_NAME]"
- layout="topleft"
name="About Second Life">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="sl_about" />
</menu_item_call>
</menu>
<menu
+ visible="false"
create_jump_keys="true"
label="Debug"
- layout="topleft"
name="Debug"
tear_off="true">
<!-- Need a copy of the edit menu here so keyboard shortcuts like
@@ -78,12 +71,10 @@
<menu
create_jump_keys="true"
label="Edit"
- layout="topleft"
name="Edit"
tear_off="true">
<menu_item_call
label="Undo"
- layout="topleft"
name="Undo"
shortcut="control|Z">
<menu_item_call.on_click
@@ -93,7 +84,6 @@
</menu_item_call>
<menu_item_call
label="Redo"
- layout="topleft"
name="Redo"
shortcut="control|Y">
<menu_item_call.on_click
@@ -101,11 +91,9 @@
<menu_item_call.on_enable
function="Edit.EnableRedo" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator />
<menu_item_call
label="Cut"
- layout="topleft"
name="Cut"
shortcut="control|X">
<menu_item_call.on_click
@@ -115,7 +103,6 @@
</menu_item_call>
<menu_item_call
label="Copy"
- layout="topleft"
name="Copy"
shortcut="control|C">
<menu_item_call.on_click
@@ -125,7 +112,6 @@
</menu_item_call>
<menu_item_call
label="Paste"
- layout="topleft"
name="Paste"
shortcut="control|V">
<menu_item_call.on_click
@@ -135,7 +121,6 @@
</menu_item_call>
<menu_item_call
label="Delete"
- layout="topleft"
name="Delete"
shortcut="Del">
<menu_item_call.on_click
@@ -145,7 +130,6 @@
</menu_item_call>
<menu_item_call
label="Duplicate"
- layout="topleft"
name="Duplicate"
shortcut="control|D">
<menu_item_call.on_click
@@ -153,11 +137,9 @@
<menu_item_call.on_enable
function="Edit.EnableDuplicate" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator />
<menu_item_call
label="Select All"
- layout="topleft"
name="Select All"
shortcut="control|A">
<menu_item_call.on_click
@@ -167,7 +149,6 @@
</menu_item_call>
<menu_item_call
label="Deselect"
- layout="topleft"
name="Deselect"
shortcut="control|E">
<menu_item_call.on_click
@@ -179,7 +160,6 @@
<menu_item_separator />
<menu_item_call
label="Show Debug Settings"
- layout="topleft"
name="Debug Settings">
<menu_item_call.on_click
function="Advanced.ShowDebugSettings"
@@ -187,7 +167,6 @@
</menu_item_call>
<menu_item_call
label="UI/Color Settings"
- layout="topleft"
name="UI/Color Settings">
<menu_item_call.on_click
function="Advanced.ShowDebugSettings"
@@ -196,53 +175,92 @@
<menu_item_separator />
<menu_item_call
label="XUI Preview Tool"
- layout="topleft"
name="UI Preview Tool"
shortcut="control|T">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Toggle"
parameter="ui_preview" />
</menu_item_call>
<menu_item_separator />
- <menu_item_call
- label="Widget Test"
- layout="topleft"
- name="Widget Test"
- shortcut="control|shift|T">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="test_widgets" />
- </menu_item_call>
- <menu_item_call
- label="Inspectors Test"
- name="inspectors_test"
- shortcut="control|shift|I"
- >
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="test_inspectors" />
- </menu_item_call>
+ <!-- Broken
<menu_item_call
label="Show Side Tray"
name="Show Side Tray">
<menu_item_call.on_click
function="Advanced.ShowSideTray" />
</menu_item_call>
+ -->
+ <menu
+ label="UI Tests"
+ name="UI Tests"
+ tear_off="true">
+ <menu_item_call
+ label="Textbox"
+ name="Textbox"
+ translate="false"
+ shortcut="control|1">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="test_textbox" />
+ </menu_item_call>
+ <menu_item_call
+ label="Text Editor"
+ name="Text Editor"
+ translate="false"
+ shortcut="control|2">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="test_text_editor" />
+ </menu_item_call>
+ <menu_item_call
+ label="Widgets"
+ name="Widgets"
+ translate="false"
+ shortcut="control|shift|T">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="test_widgets" />
+ </menu_item_call>
+ <menu_item_call
+ label="Inspectors"
+ translate="false"
+ name="Inspectors">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="test_inspectors" />
+ </menu_item_call>
+ </menu>
+<!--
+ <menu_item_check
+ label="Reg In Client Test (restart)"
+ name="Reg In Client Test (restart)">
+ <menu_item_check.on_check
+ control="RegInClient" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="RegInClient" />
+ </menu_item_check>
+-->
<menu_item_separator />
+ <menu_item_call
+ label="Set Window Size..."
+ name="Set Window Size...">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="window_size" />
+ </menu_item_call>
<menu_item_call
label="Show TOS"
- layout="topleft"
name="TOS">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="message_tos" />
</menu_item_call>
<menu_item_call
label="Show Critical Message"
- layout="topleft"
name="Critical">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="message_critical" />
</menu_item_call>
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml
index 5cbbd71bfe..f5ea3e735b 100644
--- a/indra/newview/skins/default/xui/en/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml
@@ -10,7 +10,6 @@
width="128">
<menu_item_call
label="Zoom Close"
- layout="topleft"
name="Zoom Close">
<menu_item_call.on_click
function="Minimap.Zoom"
@@ -18,7 +17,6 @@
</menu_item_call>
<menu_item_call
label="Zoom Medium"
- layout="topleft"
name="Zoom Medium">
<menu_item_call.on_click
function="Minimap.Zoom"
@@ -26,32 +24,34 @@
</menu_item_call>
<menu_item_call
label="Zoom Far"
- layout="topleft"
name="Zoom Far">
<menu_item_call.on_click
function="Minimap.Zoom"
parameter="far" />
</menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="Tracking Separator" />
+ <menu_item_check
+ label="Rotate Map"
+ name="Rotate Map">
+ <menu_item_check.on_check
+ control="MiniMapRotate" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="MiniMapRotate" />
+ </menu_item_check>
+ <menu_item_separator />
<menu_item_call
label="Stop Tracking"
- layout="topleft"
name="Stop Tracking">
<menu_item_call.on_click
function="Minimap.Tracker"
parameter="task_properties" />
</menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="Tracking Separator" />
+ <menu_item_separator />
<menu_item_call
label="World Map"
- layout="topleft"
name="World Map">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="world_map" />
</menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_navbar.xml b/indra/newview/skins/default/xui/en/menu_navbar.xml
index 89469fb013..b71b866c4b 100644
--- a/indra/newview/skins/default/xui/en/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_navbar.xml
@@ -10,7 +10,6 @@
width="128">
<menu_item_check
label="Show Coordinates"
- layout="topleft"
name="Show Coordinates">
<menu_item_check.on_click
function="Navbar.Action"
@@ -19,22 +18,30 @@
function="Navbar.EnableMenuItem"
parameter="show_coordinates" />
</menu_item_check>
+ <menu_item_check
+ label="Show Parcel Properties"
+ name="Show Parcel Properties">
+ <menu_item_check.on_click
+ function="Navbar.Action"
+ parameter="show_properties" />
+ <menu_item_check.on_check
+ control="NavBarShowParcelProperties" />
+ </menu_item_check>
+ <menu_item_separator
+ name="Separator" />
<!-- Label of 'Landmark' item is changing in runtime,
see AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml -->
<menu_item_call
label="Landmark"
- layout="topleft"
name="Landmark">
<menu_item_call.on_click
function="Navbar.Action"
parameter="landmark" />
</menu_item_call>
<menu_item_separator
- layout="topleft"
name="Separator" />
<menu_item_call
label="Cut"
- layout="topleft"
name="Cut">
<menu_item_call.on_click
function="Navbar.Action"
@@ -45,7 +52,6 @@
</menu_item_call>
<menu_item_call
label="Copy"
- layout="topleft"
name="Copy">
<menu_item_call.on_click
function="Navbar.Action"
@@ -56,7 +62,6 @@
</menu_item_call>
<menu_item_call
label="Paste"
- layout="topleft"
name="Paste">
<menu_item_call.on_click
function="Navbar.Action"
@@ -67,7 +72,6 @@
</menu_item_call>
<menu_item_call
label="Delete"
- layout="topleft"
name="Delete">
<menu_item_call.on_click
function="Navbar.Action"
@@ -78,7 +82,6 @@
</menu_item_call>
<menu_item_call
label="Select All"
- layout="topleft"
name="Select All">
<menu_item_call.on_click
function="Navbar.Action"
diff --git a/indra/newview/skins/default/xui/en/menu_notification_well_button.xml b/indra/newview/skins/default/xui/en/menu_notification_well_button.xml
new file mode 100644
index 0000000000..263ac40f4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_notification_well_button.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Notification Well Button Context Menu">
+ <menu_item_call
+ label="Close All"
+ layout="topleft"
+ name="Close All">
+ <menu_item_call.on_click
+ function="NotificationWellChicletMenu.Action"
+ parameter="close all" />
+ <menu_item_call.on_enable
+ function="NotificationWellChicletMenu.EnableItem"
+ parameter="can close all" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
new file mode 100644
index 0000000000..d66818e91a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Object Pie">
+ <menu_item_call
+ enabled="false"
+ label="Touch"
+ name="Object Touch">
+ <menu_item_call.on_click
+ function="Object.Touch" />
+ <menu_item_call.on_enable
+ function="Object.EnableTouch"
+ name="EnableTouch"
+ parameter="Touch" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ name="Edit...">
+ <menu_item_call.on_click
+ function="Object.Edit" />
+ <menu_item_call.on_visible
+ function="EnableEdit"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Build"
+ name="Build">
+ <menu_item_call.on_click
+ function="Object.Edit" />
+ <menu_item_call.on_visible
+ function="VisibleBuild"/>
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Open"
+ name="Open">
+ <menu_item_call.on_click
+ function="Object.Open" />
+ <menu_item_call.on_enable
+ function="Object.EnableOpen" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Sit Here"
+ name="Object Sit">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_enable
+ function="Object.EnableSitOrStand"
+ name="EnableSitOrStand"
+ parameter="Sit Here,Stand Up" />
+ </menu_item_call>
+ <menu_item_call
+ label="Object Profile"
+ name="Object Inspect">
+ <menu_item_call.on_click
+ function="Object.Inspect" />
+ <menu_item_call.on_enable
+ function="Object.EnableInspect" />
+ </menu_item_call>
+ <menu_item_call
+ label="Zoom In"
+ name="Zoom In">
+ <menu_item_call.on_click
+ function="Object.ZoomIn" />
+ </menu_item_call>
+<menu_item_separator layout="topleft" />
+ <context_menu
+ label="Put On â–¶"
+ name="Put On" >
+ <menu_item_call
+ enabled="false"
+ label="Wear"
+ name="Wear">
+ <menu_item_call.on_click
+ function="Object.AttachToAvatar" />
+ <menu_item_call.on_enable
+ function="Object.EnableWear" />
+ </menu_item_call>
+ <context_menu
+ label="Attach â–¶"
+ name="Object Attach" />
+ <context_menu
+ label="Attach HUD â–¶"
+ name="Object Attach HUD" />
+ </context_menu>
+ <context_menu
+ label="Remove â–¶"
+ name="Remove">
+ <menu_item_call
+ enabled="false"
+ label="Report Abuse"
+ name="Report Abuse...">
+ <menu_item_call.on_click
+ function="Object.ReportAbuse" />
+ <menu_item_call.on_enable
+ function="Object.EnableReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Block"
+ name="Object Mute">
+ <menu_item_call.on_click
+ function="Object.Mute" />
+ <menu_item_call.on_enable
+ function="Object.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Return"
+ name="Return...">
+ <menu_item_call.on_click
+ function="Object.Return" />
+ <menu_item_call.on_enable
+ function="Object.EnableReturn" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Delete"
+ name="Delete">
+ <menu_item_call.on_click
+ function="Object.Delete" />
+ <menu_item_call.on_enable
+ function="Object.EnableDelete" />
+ </menu_item_call>
+ </context_menu>
+ <menu_item_separator layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Take"
+ name="Pie Object Take">
+ <menu_item_call.on_click
+ function="Tools.BuyOrTake" />
+ <menu_item_call.on_enable
+ function="Tools.EnableBuyOrTake"
+ parameter="Buy,Take" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Take Copy"
+ name="Take Copy">
+ <menu_item_call.on_click
+ function="Tools.TakeCopy" />
+ <menu_item_call.on_enable
+ function="Tools.EnableTakeCopy" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pay"
+ name="Pay...">
+ <menu_item_call.on_click
+ function="PayObject" />
+ <menu_item_call.on_enable
+ function="EnablePayObject" />
+</menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Buy"
+ name="Buy...">
+ <menu_item_call.on_click
+ function="Object.Buy" />
+ <menu_item_call.on_enable
+ function="Object.EnableBuy" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
new file mode 100644
index 0000000000..d03a7e3d41
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Participant List Context Menu">
+ <menu_item_check
+ label="Sort by Name"
+ layout="topleft"
+ name="SortByName">
+ <menu_item_check.on_click
+ function="ParticipantList.Sort"
+ parameter="sort_by_name" />
+ <menu_item_check.on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_sorted_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by Recent Speakers"
+ layout="topleft"
+ name="SortByRecentSpeakers">
+ <menu_item_check.on_click
+ function="ParticipantList.Sort"
+ parameter="sort_by_recent_speakers" />
+ <menu_item_check.on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_sorted_by_recent_speakers" />
+ </menu_item_check>
+ <menu_item_call
+ label="View Profile"
+ layout="topleft"
+ name="View Profile">
+ <menu_item_call.on_click
+ function="Avatar.Profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add Friend"
+ layout="topleft"
+ name="Add Friend">
+ <menu_item_call.on_click
+ function="Avatar.AddFriend" />
+ <menu_item_call.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="IM"
+ layout="topleft"
+ name="IM">
+ <menu_item_call.on_click
+ function="Avatar.IM" />
+ <menu_item_call.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_im" />
+ </menu_item_call>
+ <menu_item_call
+ label="Call"
+ layout="topleft"
+ name="Call">
+ <menu_item_call.on_click
+ function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_call" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="true"
+ label="Share"
+ layout="topleft"
+ name="Share">
+ <menu_item_call.on_click
+ function="Avatar.Share" />
+ <menu_item_call.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="Pay">
+ <menu_item_call.on_click
+ function="Avatar.Pay" />
+ <menu_item_call.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_pay" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_check
+ label="Block Voice"
+ layout="topleft"
+ name="Block/Unblock">
+ <menu_item_check.on_click
+ function="Avatar.BlockUnblock" />
+ <menu_item_check.on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_blocked" />
+ <menu_item_check.on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_block" />
+ </menu_item_check>
+ <menu_item_check
+ label="Block Text"
+ layout="topleft"
+ name="MuteText">
+ <on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_muted" />
+ <on_click
+ function="ParticipantList.ToggleMuteText" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_mute_text" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
+ <context_menu
+ label="Moderator Options &gt;"
+ layout="topleft"
+ name="Moderator Options" >
+ <menu_item_check
+ label="Allow text chat"
+ layout="topleft"
+ name="AllowTextChat">
+ <on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_allowed_text_chat" />
+ <on_click
+ function="ParticipantList.ToggleAllowTextChat" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_allow_text_chat" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft"
+ name="moderate_voice_separator" />
+ <menu_item_call
+ label="Mute this participant"
+ layout="topleft"
+ name="ModerateVoiceMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Mute everyone else"
+ layout="topleft"
+ name="ModerateVoiceMuteOthers">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="others" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute this participant"
+ layout="topleft"
+ name="ModerateVoiceUnMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute everyone else"
+ layout="topleft"
+ name="ModerateVoiceUnMuteOthers">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="others" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index eedb4383bb..f1117d1419 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -31,9 +31,6 @@
function="CheckControl"
parameter="FriendsListShowIcons" />
</menu_item_check>
- <menu_item_call name="organize_offline" label="Organize Offline Friends">
- <menu_item_call.on_click function="People.Friends.ViewSort.Action" userdata="organize_offline" />
- </menu_item_call>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
<menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" />
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups.xml b/indra/newview/skins/default/xui/en/menu_people_groups.xml
new file mode 100644
index 0000000000..afa680139d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_groups.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu name="menu_group_plus"
+ left="0" bottom="0" visible="false"
+ mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ <menu_item_call
+ label="View Info"
+ name="View Info">
+ <menu_item_call.on_click
+ function="People.Groups.Action"
+ parameter="view_info" />
+ <menu_item_call.on_enable
+ function="People.Groups.Enable"
+ parameter="view_info" />
+ </menu_item_call>
+ <menu_item_call
+ label="Chat"
+ name="Chat">
+ <menu_item_call.on_click
+ function="People.Groups.Action"
+ parameter="chat" />
+ <menu_item_call.on_enable
+ function="People.Groups.Enable"
+ parameter="chat" />
+ </menu_item_call>
+ <menu_item_call
+ label="Call"
+ name="Call">
+ <menu_item_call.on_click
+ function="People.Groups.Action"
+ parameter="call" />
+ <menu_item_call.on_enable
+ function="People.Groups.Enable"
+ parameter="call" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Activate"
+ name="Activate">
+ <menu_item_call.on_click
+ function="People.Groups.Action"
+ parameter="activate" />
+ <menu_item_call.on_enable
+ function="People.Groups.Enable"
+ parameter="activate" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Leave"
+ name="Leave">
+ <menu_item_call.on_click
+ function="People.Groups.Action"
+ parameter="leave" />
+ <menu_item_call.on_enable
+ function="People.Groups.Enable"
+ parameter="leave" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index 2bec745410..df3cb26b04 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -13,4 +13,13 @@
function="CheckControl"
parameter="GroupListShowIcons" />
</menu_item_check>
+ <menu_item_call
+ label="Leave Selected Group"
+ layout="topleft"
+ name="Leave Selected Group">
+ <menu_item_call.on_click
+ function="People.Group.Minus.Action"/>
+ <menu_item_call.on_enable
+ function="People.Group.Minus.Enable"/>
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 643336cf6c..9d2ccba4da 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -20,6 +20,16 @@
parameter="can_add" />
</menu_item_call>
<menu_item_call
+ label="Remove Friend"
+ layout="topleft"
+ name="Remove Friend">
+ <menu_item_call.on_click
+ function="Avatar.RemoveFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
label="IM"
layout="topleft"
name="IM">
@@ -27,15 +37,16 @@
function="Avatar.IM" />
</menu_item_call>
<menu_item_call
- enabled="false"
label="Call"
layout="topleft"
name="Call">
<menu_item_call.on_click
function="Avatar.Call" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_call" />
</menu_item_call>
<menu_item_call
- enabled="false"
label="Share"
layout="topleft"
name="Share">
@@ -62,4 +73,10 @@
function="Avatar.EnableItem"
parameter="can_block" />
</menu_item_check>
+ <menu_item_call
+ label="Offer Teleport"
+ name="teleport">
+ <menu_item_call.on_click
+ function="Avatar.OfferTeleport"/>
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index df74d2dcd4..588342595e 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -14,6 +14,16 @@
parameter="can_add" />
</menu_item_call>
<menu_item_call
+ label="Remove Friends"
+ layout="topleft"
+ name="Remove Friend">
+ <menu_item_call.on_click
+ function="Avatar.RemoveFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
label="IM"
layout="topleft"
name="IM">
@@ -27,6 +37,9 @@
name="Call">
<on_click
function="Avatar.Call" />
+ <on_enable
+ function="Avatar.EnableItem"
+ parameter="can_call" />
</menu_item_call>
<menu_item_call
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index c002cd078f..39f9e48609 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -2,15 +2,36 @@
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
- <menu_item_call name="sort_recent" label="Sort by Recent Speakers">
- <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_recent" />
- </menu_item_call>
- <menu_item_call name="sort_name" label="Sort by Name">
- <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_name" />
- </menu_item_call>
- <menu_item_call name="sort_distance" label="Sort by Distance">
- <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_distance" />
- </menu_item_call>
+ <menu_item_check
+ label="Sort by Recent Speakers"
+ name="sort_by_recent_speakers">
+ <menu_item_check.on_click
+ function="People.Nearby.ViewSort.Action"
+ parameter="sort_by_recent_speakers"/>
+ <menu_item_check.on_check
+ function="People.Nearby.ViewSort.CheckItem"
+ parameter="sort_by_recent_speakers"/>
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by Name"
+ name="sort_name">
+ <menu_item_check.on_click
+ function="People.Nearby.ViewSort.Action"
+ parameter="sort_name"/>
+ <menu_item_check.on_check
+ function="People.Nearby.ViewSort.CheckItem"
+ parameter="sort_name"/>
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by Distance"
+ name="sort_distance">
+ <menu_item_check.on_click
+ function="People.Nearby.ViewSort.Action"
+ parameter="sort_distance"/>
+ <menu_item_check.on_check
+ function="People.Nearby.ViewSort.CheckItem"
+ parameter="sort_distance"/>
+ </menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_check name="view_icons" label="View People Icons">
<menu_item_check.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_picks_plus.xml b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
new file mode 100644
index 0000000000..f3b207e36c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="201"
+ layout="topleft"
+ mouse_opaque="false"
+ name="picks_plus_menu"
+ width="120">
+ <menu_item_call
+ name="create_pick"
+ label="New Pick">
+ <menu_item_call.on_click
+ function="Picks.Plus.Action"
+ userdata="new_pick" />
+ <menu_item_call.on_enable
+ function="Picks.Plus.Enable"
+ userdata="new_pick" />
+ </menu_item_call>
+ <menu_item_call
+ name="create_classified"
+ label="New Classified">
+ <menu_item_call.on_click
+ function="Picks.Plus.Action"
+ userdata="new_classified" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
index c849188699..9b3948b29b 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
@@ -104,6 +104,9 @@
<on_click
function="Places.LandmarksGear.Folding.Action"
parameter="expand_all" />
+ <on_enable
+ function="Places.LandmarksGear.Enable"
+ parameter="expand_all" />
</menu_item_call>
<menu_item_call
label="Collapse all folders"
@@ -112,6 +115,9 @@
<on_click
function="Places.LandmarksGear.Folding.Action"
parameter="collapse_all" />
+ <on_enable
+ function="Places.LandmarksGear.Enable"
+ parameter="collapse_all" />
</menu_item_call>
<menu_item_check
label="Sort by Date"
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
index 63d1a67d0f..4b8bc8132f 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
@@ -82,7 +82,7 @@
parameter="copy" />
</menu_item_call>
<menu_item_call
- label="Copy SLURL"
+ label="Copy SLurl"
layout="topleft"
name="copy_slurl">
<on_click
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
new file mode 100644
index 0000000000..5162a4902f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="50"
+ layout="topleft"
+ mouse_opaque="false"
+ name="profile_overflow_menu"
+ width="120">
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="pay">
+ <menu_item_call.on_click
+ function="Profile.Pay" />
+ </menu_item_call>
+ <menu_item_call
+ label="Share"
+ layout="topleft"
+ name="share">
+ <menu_item_call.on_click
+ function="Profile.Share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Block"
+ name="block">
+ <menu_item_call.on_click
+ function="Profile.BlockUnblock"/>
+ <menu_item_call.on_visible
+ function="Profile.EnableBlock" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <menu_item_call.on_click
+ function="Profile.BlockUnblock"/>
+ <menu_item_call.on_visible
+ function="Profile.EnableUnblock" />
+ </menu_item_call>
+ <menu_item_call
+ label="Kick"
+ layout="topleft"
+ name="kick">
+ <menu_item_call.on_click
+ function="Profile.Kick" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ layout="topleft"
+ name="freeze">
+ <menu_item_call.on_click
+ function="Profile.Freeze" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unfreeze"
+ layout="topleft"
+ name="unfreeze">
+ <menu_item_call.on_click
+ function="Profile.Unfreeze" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="CSR"
+ layout="topleft"
+ name="csr">
+ <menu_item_call.on_click
+ function="Profile.CSR" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml
index 6768d7fccb..134b331514 100644
--- a/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml
@@ -13,12 +13,18 @@
name="Expand all folders">
<menu_item_call.on_click
function="TeleportHistory.ExpandAllFolders" />
+ <on_enable
+ function="TeleportHistory.GearMenu.Enable"
+ parameter="expand_all" />
</menu_item_call>
<menu_item_call
label="Collapse all folders"
name="Collapse all folders">
<menu_item_call.on_click
function="TeleportHistory.CollapseAllFolders" />
+ <on_enable
+ function="TeleportHistory.GearMenu.Enable"
+ parameter="collapse_all" />
</menu_item_call>
<menu_item_separator layout="topleft" />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml
index 7c9e6f0796..ecd96088e7 100644
--- a/indra/newview/skins/default/xui/en/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml
@@ -32,10 +32,10 @@
function="Edit.EnablePaste" />
</menu_item_call>
<menu_item_call
- label="Delete"
- layout="topleft"
- name="Delete"
- shortcut="Del">
+ label="Delete"
+ layout="topleft"
+ name="Delete"
+ shortcut="Del">
<menu_item_call.on_click
function="Edit.Delete" />
<menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_url_inventory.xml b/indra/newview/skins/default/xui/en/menu_url_inventory.xml
new file mode 100644
index 0000000000..cf9d1d5881
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Url Popup">
+ <menu_item_call
+ label="Show Inventory Item"
+ layout="topleft"
+ name="show_item">
+ <menu_item_call.on_click
+ function="Url.Execute" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Copy Name to clipboard"
+ layout="topleft"
+ name="url_copy_label">
+ <menu_item_call.on_click
+ function="Url.CopyLabel" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy SLurl to clipboard"
+ layout="topleft"
+ name="url_copy">
+ <menu_item_call.on_click
+ function="Url.CopyUrl" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_map.xml b/indra/newview/skins/default/xui/en/menu_url_map.xml
new file mode 100644
index 0000000000..2ca9e3b3fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_map.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Url Popup">
+ <menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Url.Execute" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Teleport to Location"
+ layout="topleft"
+ name="teleport_to_location">
+ <menu_item_call.on_click
+ function="Url.Teleport" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Copy SLurl to clipboard"
+ layout="topleft"
+ name="url_copy">
+ <menu_item_call.on_click
+ function="Url.CopyUrl" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index 6f7e659f48..35c2269b0d 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -12,6 +12,13 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Url.ShowOnMap" />
+ </menu_item_call>
+ <menu_item_call
label="Teleport to Object Location"
layout="topleft"
name="teleport_to_object">
diff --git a/indra/newview/skins/default/xui/en/menu_url_parcel.xml b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
index 3804f7f780..f477c310fb 100644
--- a/indra/newview/skins/default/xui/en/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
@@ -12,6 +12,15 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Url.ShowOnMap" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
label="Copy SLurl to clipboard"
layout="topleft"
name="url_copy">
diff --git a/indra/newview/skins/default/xui/en/menu_url_slurl.xml b/indra/newview/skins/default/xui/en/menu_url_slurl.xml
index 58714f1f42..98abc206a5 100644
--- a/indra/newview/skins/default/xui/en/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_slurl.xml
@@ -12,6 +12,13 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Url.ShowOnMap" />
+ </menu_item_call>
+ <menu_item_call
label="Teleport to Location"
layout="topleft"
name="teleport_to_location">
diff --git a/indra/newview/skins/default/xui/en/menu_url_teleport.xml b/indra/newview/skins/default/xui/en/menu_url_teleport.xml
index ff52d7e109..289e32bcf4 100644
--- a/indra/newview/skins/default/xui/en/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_teleport.xml
@@ -12,6 +12,15 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Url.ShowOnMap" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
label="Copy SLurl to clipboard"
layout="topleft"
name="url_copy">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index a59a8b065f..4c4867b862 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -32,8 +32,7 @@
layout="topleft"
name="Buy and Sell L$">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="buy currency" />
+ function="BuyCurrency" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@@ -50,16 +49,16 @@
layout="topleft"
name="Appearance">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
+ function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
<menu_item_check
label="My Inventory"
- layout="topleft"
name="Inventory"
- shortcut="control|I">
+ layout="topleft"
+ shortcut="control|shift|I"
+ visible="false">
<menu_item_check.on_check
function="Floater.Visible"
parameter="inventory" />
@@ -67,15 +66,31 @@
function="Floater.Toggle"
parameter="inventory" />
</menu_item_check>
- <menu_item_call
+ <menu_item_check
+ label="My Inventory"
+ name="ShowSidetrayInventory"
+ layout="topleft"
+ shortcut="control|I"
+ visible="true">
+ <menu_item_check.on_check
+ function="SidetrayPanelVisible"
+ parameter="sidepanel_inventory" />
+ <menu_item_check.on_click
+ function="ShowSidetrayPanel"
+ parameter="sidepanel_inventory" />
+ </menu_item_check>
+ <menu_item_check
label="My Gestures"
layout="topleft"
name="Gestures"
shortcut="control|G">
- <menu_item_call.on_click
- function="ShowFloater"
+ <menu_item_check.on_check
+ function="Floater.Visible"
parameter="gestures" />
- </menu_item_call>
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="gestures" />
+ </menu_item_check>
<menu
label="My Status"
layout="topleft"
@@ -98,6 +113,24 @@
function="World.SetBusy"/>
</menu_item_call>
</menu>
+ <menu_item_call
+ label="Request Admin Status"
+ layout="topleft"
+ name="Request Admin Options"
+ shortcut="control|alt|G"
+ visible="false">
+ <menu_item_call.on_click
+ function="Advanced.RequestAdminStatus" />
+ </menu_item_call>
+ <menu_item_call
+ label="Leave Admin Status"
+ layout="topleft"
+ name="Leave Admin Options"
+ shortcut="control|alt|shift|G"
+ visible="false">
+ <menu_item_call.on_click
+ function="Advanced.LeaveAdminStatus" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -114,25 +147,22 @@
layout="topleft"
name="Communicate"
tear_off="true">
- <menu_item_check
+ <menu_item_call
label="My Friends"
layout="topleft"
name="My Friends"
shortcut="control|shift|F">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="contacts.friends" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="contacts.friends" />
- </menu_item_check>
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
<menu_item_call
label="My Groups"
layout="topleft"
name="My Groups">
<menu_item_call.on_click
- function="Floater.Show"
- parameter="contacts.groups" />
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@@ -155,82 +185,70 @@
function="Floater.Toggle"
parameter="nearby_chat" />
</menu_item_check>
- <menu_item_check
- label="Nearby Speakers"
+ <menu_item_call
+ label="Nearby People"
layout="topleft"
name="Active Speakers"
shortcut="control|shift|A">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="active_speakers" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="active_speakers" />
- </menu_item_check>
- <!--menu_item_check
- label="Block List"
- layout="topleft"
- name="Mute List">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="mute" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="mute" />
- </menu_item_check-->
- <menu_item_separator
- layout="topleft" />
- <menu_item_check
- label="(Legacy) Communicate"
- layout="topleft"
- name="Instant Message"
- shortcut="control|T">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="communicate" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="communicate" />
- </menu_item_check>
- <menu_item_call
- label="(Temp) Media Remote Ctrl"
- layout="topleft"
- name="Preferences"
- shortcut="control|alt|M">
<menu_item_call.on_click
- function="Floater.Toggle"
- parameter="media_remote_ctrl" />
- </menu_item_call>
+ function="SideTray.PanelPeopleTab"
+ parameter="nearby_panel" />
+ </menu_item_call>
</menu>
<menu
label="World"
layout="topleft"
name="World"
tear_off="true">
- <menu_item_check
- label="Move"
+ <menu_item_check
+ label="Mini-Map"
layout="topleft"
- name="Movement Controls">
+ name="Mini-Map"
+ shortcut="control|shift|M">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="moveview" />
+ parameter="mini_map" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="moveview" />
+ parameter="mini_map" />
</menu_item_check>
- <menu_item_check
- label="View"
+ <menu_item_check
+ label="World Map"
layout="topleft"
- name="Camera Controls">
+ name="World Map"
+ shortcut="control|M"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="camera" />
+ parameter="world_map" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="camera" />
+ parameter="world_map" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_call
+ label="Snapshot"
+ layout="topleft"
+ name="Take Snapshot"
+ shortcut="control|shift|S">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="snapshot" />
+ </menu_item_call>
+ <menu_item_call
+ label="Landmark This Place"
+ layout="topleft"
+ name="Create Landmark Here">
+ <menu_item_call.on_click
+ function="World.CreateLandmark" />
+ <menu_item_call.on_enable
+ function="World.EnableCreateLandmark" />
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="Place Profile"
+ layout="topleft"
+ name="Land"
+ tear_off="true">
<menu_item_call
label="About Land"
layout="topleft"
@@ -247,13 +265,15 @@
function="Floater.Show"
parameter="region_info" />
</menu_item_call>
+ </menu>
+ <menu_item_separator
+ layout="topleft" />
<menu_item_call
- label="Buy Land"
+ label="Buy This Land"
layout="topleft"
name="Buy Land">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="buy land" />
+ function="Land.Buy" />
<menu_item_call.on_enable
function="World.EnableBuyLand" />
</menu_item_call>
@@ -262,15 +282,35 @@
layout="topleft"
name="My Land">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="land_holdings" />
</menu_item_call>
<menu
create_jump_keys="true"
label="Show"
layout="topleft"
- name="Land"
+ name="LandShow"
tear_off="true">
+ <menu_item_check
+ label="Move Controls"
+ layout="topleft"
+ name="Movement Controls">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="moveview" />
+ <menu_item_check.on_click
+ function="World.Toggle.MovementControls" />
+ </menu_item_check>
+ <menu_item_check
+ label="View Controls"
+ layout="topleft"
+ name="Camera Controls">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="camera" />
+ <menu_item_check.on_click
+ function="World.Toggle.CameraControls" />
+ </menu_item_check>
<menu_item_check
label="Ban Lines"
layout="topleft"
@@ -314,23 +354,37 @@
function="ToggleControl"
parameter="ShowParcelOwners" />
</menu_item_check>
+ <menu_item_check
+ label="Coordinates"
+ name="Coordinates">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NavBarShowCoordinates" />
+ <menu_item_check.on_check
+ control="NavBarShowCoordinates" />
+ </menu_item_check>
+ <menu_item_check
+ label="Parcel Properties"
+ name="Parcel Properties">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NavBarShowParcelProperties" />
+ <menu_item_check.on_check
+ control="NavBarShowParcelProperties" />
+ </menu_item_check>
</menu>
<menu_item_separator
layout="topleft" />
- <menu
- label="Landmarks"
- layout="topleft"
- name="Landmarks"
- tear_off="true">
- <menu_item_call
- label="Create Landmark Here"
- layout="topleft"
- name="Create Landmark Here">
- <menu_item_call.on_click
- function="World.CreateLandmark" />
- <menu_item_call.on_enable
- function="World.EnableCreateLandmark" />
- </menu_item_call>
+ <menu_item_call
+ label="Teleport Home"
+ layout="topleft"
+ name="Teleport Home"
+ shortcut="control|shift|H">
+ <menu_item_call.on_click
+ function="World.TeleportHome" />
+ <menu_item_call.on_enable
+ function="World.EnableTeleportHome" />
+ </menu_item_call>
<menu_item_call
label="Set Home to Here"
layout="topleft"
@@ -340,42 +394,6 @@
<menu_item_call.on_enable
function="World.EnableSetHomeLocation" />
</menu_item_call>
- <menu_item_call
- label="Teleport Home"
- layout="topleft"
- name="Teleport Home"
- shortcut="control|shift|H">
- <menu_item_call.on_click
- function="World.TeleportHome" />
- <menu_item_call.on_enable
- function="World.EnableTeleportHome" />
- </menu_item_call>
- </menu>
- <menu_item_check
- label="Mini-Map"
- layout="topleft"
- name="Mini-Map"
- shortcut="control|shift|M">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="mini_map" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="mini_map" />
- </menu_item_check>
- <menu_item_check
- label="World Map"
- layout="topleft"
- name="World Map"
- shortcut="control|M"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="world_map" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="world_map" />
- </menu_item_check>
<!-- <menu_item_check
label="Show Navigation Bar"
layout="topleft"
@@ -400,15 +418,8 @@
</menu_item_check>
<menu_item_separator
layout="topleft" />-->
- <menu_item_call
- label="Snapshot"
- layout="topleft"
- name="Take Snapshot"
- shortcut="control|shift|S">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="snapshot" />
- </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
<menu
create_jump_keys="true"
label="Sun"
@@ -450,7 +461,7 @@
parameter="midnight" />
</menu_item_call>
<menu_item_call
- label="Use the Estate Time"
+ label="Estate Time"
layout="topleft"
name="Revert to Region Default">
<menu_item_call.on_click
@@ -663,6 +674,18 @@
<menu_item_call.on_enable
function="Tools.EnableUnlink" />
</menu_item_call>
+ <menu_item_check
+ label="Edit Linked Parts"
+ layout="topleft"
+ name="Edit Linked Parts">
+ <menu_item_check.on_check
+ control="EditLinkedParts" />
+ <menu_item_check.on_click
+ function="Tools.EditLinkedParts"
+ parameter="EditLinkedParts" />
+ <menu_item_check.on_enable
+ function="Tools.EnableToolNotPie" />
+ </menu_item_check>
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -800,18 +823,6 @@
layout="topleft"
name="Options"
tear_off="true">
- <menu_item_check
- label="Edit Linked Parts"
- layout="topleft"
- name="Edit Linked Parts">
- <menu_item_check.on_check
- control="EditLinkedParts" />
- <menu_item_check.on_click
- function="Tools.EditLinkedParts"
- parameter="EditLinkedParts" />
- <menu_item_check.on_enable
- function="Tools.EnableToolNotPie" />
- </menu_item_check>
<menu_item_call
label="Set Default Upload Permissions"
layout="topleft"
@@ -819,35 +830,21 @@
<menu_item_call.on_click
function="Floater.Toggle"
parameter="perm_prefs" />
- <menu_item_check
- label="Show Advanced Permissions"
- layout="topleft"
- name="DebugPermissions">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="DebugPermissions" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="DebugPermissions" />
- </menu_item_check>
</menu_item_call>
- <!--menu_item_call
- label="Show Script Warning/Error Window"
- layout="topleft"
- name="Show Script Warning/Error Window">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="script errors" />
- </menu_item_call-->
+ <menu_item_check
+ label="Show Advanced Permissions"
+ layout="topleft"
+ name="DebugPermissions">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugPermissions" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugPermissions" />
+ </menu_item_check>
<menu_item_separator
layout="topleft" />
- <menu
- create_jump_keys="true"
- label="Selection"
- layout="topleft"
- name="Selection"
- tear_off="true">
- <menu_item_check
+ <menu_item_check
label="Select Only My Objects"
layout="topleft"
name="Select Only My Objects">
@@ -875,14 +872,9 @@
control="RectangleSelectInclusive" />
<menu_item_check.on_click
function="Tools.SelectBySurrounding" />
- </menu_item_check>
- </menu>
- <menu
- create_jump_keys="true"
- label="Show"
- layout="topleft"
- name="Show"
- tear_off="true">
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
<menu_item_check
label="Show Hidden Selection"
layout="topleft"
@@ -911,13 +903,8 @@
function="ToggleControl"
parameter="ShowSelectionBeam" />
</menu_item_check>
- </menu>
- <menu
- create_jump_keys="true"
- label="Grid"
- layout="topleft"
- name="Grid"
- tear_off="true">
+ <menu_item_separator
+ layout="topleft" />
<menu_item_check
label="Snap to Grid"
layout="topleft"
@@ -962,7 +949,6 @@
<menu_item_call.on_enable
function="Tools.EnableToolNotPie" />
</menu_item_call>
- </menu>
</menu>
<menu
create_jump_keys="true"
@@ -1027,17 +1013,17 @@
name="Second Life Help"
shortcut="F1">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="help f1" />
+ function="ShowHelp"
+ parameter="f1_help" />
</menu_item_call>
- <menu_item_call
+ <!-- <menu_item_call
label="Tutorial"
layout="topleft"
name="Tutorial">
<menu_item_call.on_click
function="Floater.Show"
parameter="hud" />
- </menu_item_call>
+ </menu_item_call>-->
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -1045,8 +1031,15 @@
layout="topleft"
name="Report Abuse">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="complaint reporter" />
+ function="ReportAbuse" />
+ </menu_item_call>
+ <menu_item_call
+ label="Report Bug"
+ layout="topleft"
+ name="Report Bug">
+ <menu_item_call.on_click
+ function="ShowHelp"
+ parameter="report_bug" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@@ -1065,17 +1058,6 @@
name="Advanced"
tear_off="true"
visible="false">
- <menu_item_check
- label="Set Away After 30 Minutes"
- layout="topleft"
- name="Go Away/AFK When Idle">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="AllowIdleAFK" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="AllowIdleAFK" />
- </menu_item_check>
<menu_item_call
label="Stop Animating Me"
layout="topleft"
@@ -1098,6 +1080,13 @@
<menu_item_call.on_click
function="View.DefaultUISize" />
</menu_item_call>
+ <menu_item_call
+ label="Set Window Size..."
+ name="Set Window Size...">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="window_size" />
+ </menu_item_call>
<menu_item_separator/>
<menu_item_check
label="Limit Select Distance"
@@ -1156,15 +1145,6 @@
function="ToggleControl"
parameter="CompressSnapshotsToDisk" />
</menu_item_check>
- <menu_item_call
- label="Save Texture As"
- layout="topleft"
- name="Save Texture As">
- <menu_item_call.on_click
- function="File.SaveTexture" />
- <menu_item_call.on_enable
- function="File.EnableSaveAs" />
- </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu
@@ -1626,6 +1606,17 @@
name="Shortcuts"
tear_off="true"
visible="false">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ layout="topleft"
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
<menu_item_check
label="Search"
layout="topleft"
@@ -1674,6 +1665,8 @@
layout="topleft"
name="Fly"
shortcut="Home">
+ <menu_item_check.on_check
+ function="Agent.getFlying" />
<menu_item_check.on_click
function="Agent.toggleFlying" />
<menu_item_check.on_enable
@@ -1908,6 +1901,39 @@
function="Advanced.ToggleConsole"
parameter="debug" />
</menu_item_check>
+ <menu_item_call
+ label="Notifications Console"
+ layout="topleft"
+ name="Notifications"
+ shortcut="control|shift|5">
+ <menu_item_call.on_click
+ function="Floater.Toggle"
+ parameter="notifications_console" />
+ </menu_item_call>
+ <menu_item_check
+ label="Texture Size Console"
+ layout="topleft"
+ name="Texture Size"
+ shortcut="control|shift|6">
+ <menu_item_check.on_check
+ function="Advanced.CheckConsole"
+ parameter="texture size" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleConsole"
+ parameter="texture size" />
+ </menu_item_check>
+ <menu_item_check
+ label="Texture Category Console"
+ layout="topleft"
+ name="Texture Category"
+ shortcut="control|shift|7">
+ <menu_item_check.on_check
+ function="Advanced.CheckConsole"
+ parameter="texture category" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleConsole"
+ parameter="texture category" />
+ </menu_item_check>
<menu_item_check
label="Fast Timers"
layout="topleft"
@@ -1934,19 +1960,6 @@
function="Advanced.ToggleConsole"
parameter="memory view" />
</menu_item_check>
- <menu_item_check
- label="Notifications Console"
- layout="topleft"
- name="Notifications"
- shortcut="control|shift|5"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Advanced.CheckConsole"
- parameter="notifications" />
- <menu_item_check.on_click
- function="Floater.Show"
- parameter="notifications_console" />
- </menu_item_check>
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -2008,6 +2021,18 @@
function="Advanced.ToggleHUDInfo"
parameter="fov" />
</menu_item_check>
+ <menu_item_check
+ label="Badge"
+ layout="topleft"
+ name="Badge"
+ shortcut="alt|control|shift|h">
+ <menu_item_check.on_check
+ function="Advanced.CheckHUDInfo"
+ parameter="badge" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleHUDInfo"
+ parameter="badge" />
+ </menu_item_check>
</menu>
<menu
create_jump_keys="true"
@@ -2132,7 +2157,7 @@
function="Advanced.ForceErrorDisconnectViewer" />
</menu_item_call>
<menu_item_call
- label="Simulate a Memory Leak..."
+ label="Simulate a Memory Leak"
layout="topleft"
name="Memory Leaking Simulation">
<menu_item_call.on_click
@@ -2409,7 +2434,7 @@
function="Advanced.EnableRenderDeferred" />
</menu_item_check>
<menu_item_check
- label="Global Illumintation"
+ label="Global Illumination"
name="Global Illumination">
<menu_item_check.on_check
function="CheckControl"
@@ -2436,48 +2461,72 @@
name="Debug Pipeline">
<menu_item_check.on_check
function="CheckControl"
- parameter="RenderDebugGL" />
+ parameter="RenderDebugPipeline" />
<menu_item_check.on_click
function="ToggleControl"
- parameter="RenderDebugGL" />
+ parameter="RenderDebugPipeline" />
</menu_item_check>
<menu_item_check
label="Fast Alpha"
name="Fast Alpha">
<menu_item_check.on_check
function="CheckControl"
- parameter="RenderDebugGL" />
+ parameter="RenderFastAlpha" />
<menu_item_check.on_click
function="ToggleControl"
- parameter="RenderDebugGL" />
+ parameter="RenderFastAlpha" />
</menu_item_check>
<menu_item_check
label="Animation Textures"
name="Animation Textures">
<menu_item_check.on_check
function="CheckControl"
- parameter="RenderDebugGL" />
+ parameter="AnimateTextures" />
<menu_item_check.on_click
function="ToggleControl"
- parameter="RenderDebugGL" />
+ parameter="AnimateTextures" />
</menu_item_check>
<menu_item_check
label="Disable Textures"
name="Disable Textures">
<menu_item_check.on_check
- function="Advanced.CheckDisableTextures"
- parameter="DisableTextures" />
+ function="CheckControl"
+ parameter="TextureDisable" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="TextureDisable" />
+ </menu_item_check>
+ <menu_item_check
+ label="Full Res Textures"
+ layout="topleft"
+ name="Rull Res Textures">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="TextureLoadFullRes" />
<menu_item_check.on_click
- function="Advanced.ToggleDisableTextures" />
+ function="ToggleControl"
+ parameter="TextureLoadFullRes" />
+ </menu_item_check>
+ <menu_item_check
+ label="Audit Textures"
+ layout="topleft"
+ name="Audit Textures">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="AuditTexture" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="AuditTexture" />
</menu_item_check>
<menu_item_check
label="Texture Atlas"
name="Texture Atlas">
<menu_item_check.on_check
- function="Advanced.CheckTextureAtlas"
- parameter="TextureAtlas" />
+ function="CheckControl"
+ parameter="EnableTextureAtlas" />
<menu_item_check.on_click
- function="Advanced.ToggleTextureAtlas" />
+ function="ToggleControl"
+ parameter="EnableTextureAtlas" />
</menu_item_check>
<menu_item_check
label="Render Attached Lights"
@@ -2486,7 +2535,7 @@
function="CheckControl"
parameter="RenderAttachedLights" />
<menu_item_check.on_click
- function="Advanced.HandleAttchedLightParticles"
+ function="Advanced.HandleAttachedLightParticles"
parameter="RenderAttachedLights" />
</menu_item_check>
<menu_item_check
@@ -2496,18 +2545,18 @@
function="CheckControl"
parameter="RenderAttachedParticles" />
<menu_item_check.on_click
- function="Advanced.HandleAttchedLightParticles"
+ function="Advanced.HandleAttachedLightParticles"
parameter="RenderAttachedParticles" />
</menu_item_check>
<menu_item_check
- label="Hover Highlight Objects"
- name="Hover Highlight Objects">
+ label="Hover Glow Objects"
+ name="Hover Glow Objects">
<menu_item_check.on_check
function="CheckControl"
- parameter="RenderHighlightEnable" />
+ parameter="RenderHoverGlowEnable" />
<menu_item_check.on_click
function="ToggleControl"
- parameter="RenderHighlightEnable" />
+ parameter="RenderHoverGlowEnable" />
</menu_item_check>
</menu>
@@ -2740,8 +2789,7 @@
<menu_item_call
label="Dump Focus Holder"
layout="topleft"
- name="Dump Focus Holder"
- shortcut="control|alt|F">
+ name="Dump Focus Holder">
<menu_item_call.on_click
function="Advanced.DumpFocusHolder" />
</menu_item_call>
@@ -2876,14 +2924,14 @@
parameter="font_test" />
</menu_item_call>
<menu_item_call
- label="Load from XML..."
+ label="Load from XML"
layout="topleft"
name="Load from XML">
<menu_item_call.on_click
function="Advanced.LoadUIFromXML" />
</menu_item_call>
<menu_item_call
- label="Save to XML..."
+ label="Save to XML"
layout="topleft"
name="Save to XML">
<menu_item_call.on_click
@@ -2906,14 +2954,6 @@
<menu_item_call.on_click
function="Advanced.SendTestIMs" />
</menu_item_call>
- <menu_item_call
- label="Test Inspectors"
- name="Test Inspectors"
- shortcut="control|shift|I">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="test_inspectors" />
- </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -3178,6 +3218,17 @@
</menu>
<menu_item_separator
layout="topleft" />
+ <menu_item_check
+ label="HTTP Textures"
+ layout="topleft"
+ name="HTTP Textures">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ImagePipelineUseHTTP" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ImagePipelineUseHTTP" />
+ </menu_item_check>
<menu_item_call
label="Compress Images"
layout="topleft"
@@ -3314,7 +3365,7 @@
name="Parcel"
tear_off="true">
<menu_item_call
- label="Owner To Me"
+ label="Force Owner To Me"
layout="topleft"
name="Owner To Me">
<menu_item_call.on_click
@@ -3536,17 +3587,6 @@
parameter="all" />
</menu_item_call>
</menu>
- <menu_item_check
- label="Show Toolbar"
- layout="topleft"
- name="Show Toolbar">
- <menu_item_check.on_check
- function="FloaterVisible"
- parameter="toolbar" />
- <menu_item_check.on_click
- function="ShowFloater"
- parameter="toolbar" />
- </menu_item_check>
<menu
create_jump_keys="true"
label="Help"
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index 2de9449ea6..76c0d027f3 100644
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -163,8 +163,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="application/javascript">
<label name="application/javascript_label">
@@ -208,7 +208,7 @@
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
- Synchronized Multimedia Integration Language (SMIL)
+ Synchronized Multimedia Integration Language (SMIL)
</label>
<widgettype>
movie
@@ -348,8 +348,8 @@
web
</widgettype>
<impl>
- media_plugin_webkit
- </impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="text/plain">
<label name="text/plain_label">
@@ -381,8 +381,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="video/mp4">
<label name="video/mp4_label">
@@ -392,8 +392,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype menu="1" name="video/quicktime">
<label name="video/quicktime_label">
@@ -403,8 +403,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="video/x-ms-asf">
<label name="video/x-ms-asf_label">
@@ -414,8 +414,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="video/x-ms-wmv">
<label name="video/x-ms-wmv_label">
@@ -425,8 +425,8 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype menu="1" name="video/x-msvideo">
<label name="video/x-msvideo_label">
@@ -436,7 +436,7 @@
movie
</widgettype>
<impl>
- media_plugin_quicktime
- </impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
</mimetypes>
diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml
new file mode 100644
index 0000000000..05cd850725
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<mimetypes name="default">
+ <defaultlabel>
+ (Unknown)
+ </defaultlabel>
+ <defaultwidget>
+ none
+ </defaultwidget>
+ <defaultimpl>
+ media_plugin_webkit
+ </defaultimpl>
+ <widgetset name="web">
+ <label name="web_label">
+ Web Content
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ text/html
+ </default_type>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ Show Web content
+ </playtip>
+ <allow_resize>
+ true
+ </allow_resize>
+ <allow_looping>
+ false
+ </allow_looping>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Movie
+ </label>
+ <default_type>
+ video/*
+ </default_type>
+ <icon>
+ icn_media_movie.tga
+ </icon>
+ <tooltip name="movie_tooltip">
+ There is a movie to play here
+ </tooltip>
+ <playtip name="movie_playtip">
+ Play movie
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ true
+ </allow_looping>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ image/*
+ </default_type>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ false
+ </allow_looping>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ audio/*
+ </default_type>
+ <tooltip name="audio_tooltip">
+ There is audio at this location
+ </tooltip>
+ <playtip name="audio_playtip">
+ Play this location&apos;s audio
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ true
+ </allow_looping>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - None -
+ </label>
+ <widgettype>
+ none
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - None -
+ </label>
+ <widgettype>
+ none
+ </widgettype>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Movie (QuickTime)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Page (XHTML)
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="text/html">
+ <label name="text/html_label">
+ Web Page
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ <widgettype>
+ text
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ <widgettype>
+ text
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/mpeg">
+ <label name="video/mpeg_label">
+ Movie (MPEG)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Movie (MP4)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/quicktime">
+ <label name="video/quicktime_label">
+ Movie (QuickTime)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Movie (Windows Media ASF)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Movie (Windows Media WMV)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Movie (AVI)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml
new file mode 100644
index 0000000000..76c0d027f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<mimetypes name="default">
+ <defaultlabel>
+ (Unknown)
+ </defaultlabel>
+ <defaultwidget>
+ none
+ </defaultwidget>
+ <defaultimpl>
+ media_plugin_webkit
+ </defaultimpl>
+ <widgetset name="web">
+ <label name="web_label">
+ Web Content
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ text/html
+ </default_type>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ Show Web content
+ </playtip>
+ <allow_resize>
+ true
+ </allow_resize>
+ <allow_looping>
+ false
+ </allow_looping>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Movie
+ </label>
+ <default_type>
+ video/*
+ </default_type>
+ <icon>
+ icn_media_movie.tga
+ </icon>
+ <tooltip name="movie_tooltip">
+ There is a movie to play here
+ </tooltip>
+ <playtip name="movie_playtip">
+ Play movie
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ true
+ </allow_looping>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ image/*
+ </default_type>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ false
+ </allow_looping>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <icon>
+ icn_media_web.tga
+ </icon>
+ <default_type>
+ audio/*
+ </default_type>
+ <tooltip name="audio_tooltip">
+ There is audio at this location
+ </tooltip>
+ <playtip name="audio_playtip">
+ Play this location&apos;s audio
+ </playtip>
+ <allow_resize>
+ false
+ </allow_resize>
+ <allow_looping>
+ true
+ </allow_looping>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - None -
+ </label>
+ <widgettype>
+ none
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - None -
+ </label>
+ <widgettype>
+ none
+ </widgettype>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Movie (QuickTime)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Page (XHTML)
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ <widgettype>
+ audio
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ <widgettype>
+ image
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="text/html">
+ <label name="text/html_label">
+ Web Page
+ </label>
+ <widgettype>
+ web
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ <widgettype>
+ text
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ <widgettype>
+ text
+ </widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/mpeg">
+ <label name="video/mpeg_label">
+ Movie (MPEG)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Movie (MP4)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/quicktime">
+ <label name="video/quicktime_label">
+ Movie (QuickTime)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Movie (Windows Media ASF)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Movie (Windows Media WMV)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+ <mimetype menu="1" name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Movie (AVI)
+ </label>
+ <widgettype>
+ movie
+ </widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 9aacb8a92c..8f1812830f 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -13,13 +13,13 @@
<global name="implicitclosebutton">
Close
</global>
-
+
<template name="okbutton">
<form>
<button
default="true"
index="0"
- name="OK"
+ name="OK_okbutton"
text="$yestext"/>
</form>
</template>
@@ -29,7 +29,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okignore"
text="$yestext"/>
<ignore text="$ignoretext"/>
</form>
@@ -40,11 +40,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelbuttons"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelbuttons"
text="$notext"/>
</form>
</template>
@@ -54,11 +54,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelignore"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelignore"
text="$notext"/>
<ignore text="$ignoretext"/>
</form>
@@ -69,7 +69,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okhelpbuttons"
text="$yestext"/>
<button
index="1"
@@ -91,7 +91,7 @@
text="$notext"/>
<button
index="2"
- name="Cancel"
+ name="Cancel_yesnocancelbuttons"
text="$canceltext"/>
</form>
</template>
@@ -100,11 +100,11 @@
functor="GenericAcknowledge"
icon="alertmodal.tga"
name="MissingAlert"
- label="Unknown Alert Message"
+ label="Unknown Notification Message"
type="alertmodal">
-Your version of [APP_NAME] does not know how to display the alert it just received. Please verify that you have the latest Viewer installed.
+Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
-Error details: The alert called &apos;[_NAME]&apos; was not found in notifications.xml.
+Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -154,10 +154,10 @@ No tutorial is currently available.
icon="alertmodal.tga"
name="BadInstallation"
type="alertmodal">
- An error occurred while updating [APP_NAME]. Please download the latest version of the Viewer. http://get.secondlife.com
+ An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
<usetemplate
name="okbutton"
- yestext="Ok"/>
+ yestext="OK"/>
</notification>
<notification
@@ -169,7 +169,7 @@ Could not connect to the [SECOND_LIFE_GRID].
Make sure your Internet connection is working properly.
<usetemplate
name="okbutton"
- yestext="Ok"/>
+ yestext="OK"/>
</notification>
<notification
@@ -179,7 +179,7 @@ Make sure your Internet connection is working properly.
Message Template [PATH] not found.
<usetemplate
name="okbutton"
- yestext="Ok"/>
+ yestext="OK"/>
</notification>
<notification
@@ -244,9 +244,19 @@ Save all changes to clothing/body parts?
<notification
icon="alertmodal.tga"
+ name="FriendsAndGroupsOnly"
+ type="alertmodal">
+ Non-friends won't know that you've choosen to ignore their calls and instant messages.
+ <usetemplate
+ name="okbutton"
+ yestext="Yes"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="GrantModifyRights"
type="alertmodal">
-Granting modify rights to another resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?
<usetemplate
name="okcancelbuttons"
@@ -258,7 +268,7 @@ Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?
icon="alertmodal.tga"
name="GrantModifyRightsMultiple"
type="alertmodal">
-Granting modify rights to another resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for the selected Residents?
<usetemplate
name="okcancelbuttons"
@@ -371,103 +381,33 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
<notification
icon="alertmodal.tga"
- name="ClickPublishHelpLand"
- type="alertmodal">
-Selecting the &quot;Publish in Search&quot;
-Checking this box will show:
-- this parcel in search results
-- this parcel&apos;s public objects
-- this parcel in web search
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickSoundHelpLand"
- type="alertmodal">Media and Music can only be experienced within the parcel. Sound and Voice options can be restricted to the parcel or will be heard by residents outside the parcel depending on their maturity Rating. Go to Knowledge Base to learn more about how to set these options?
- <url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Go to Knowledge Base"
- notext="Close" />
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickSearchHelpAll"
+ name="AttachmentDrop"
type="alertmodal">
-Search results are organized based on the tab you are in, your maturity Rating, the category chosen, and other factors. For more details, please see the Knowledge Base.
- <url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
+ You are about to drop your attachment.
+ Are you sure you want to continue?
<usetemplate
- name="okcancelbuttons"
- yestext="Go to Knowledge Base"
- notext="Close" />
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickPublishHelpLandDisabled"
- type="alertmodal">
-You can&apos;t make this parcel show in search because it is located in a region that forbids this.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickPublishHelpAvatar"
- type="alertmodal">
-Selecting &quot;Show in Search&quot; will show:
-- my profile in search results
-- a link to my profile in public group pages
+ ignoretext="Confirm before dropping attachments"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
</notification>
-
<notification
icon="alertmodal.tga"
- name="ClickPartnerHelpAvatar"
+ name="JoinGroupCanAfford"
type="alertmodal">
-You can propose to another Resident or dissolve an existing partnership through the [SECOND_LIFE] website.
-
-Go to the [SECOND_LIFE] web site for more information on partnering?
+Joining this group costs L$[COST].
+Do you wish to proceed?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
- yestext="Go to Page"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickUploadHelpPermissions"
- type="alertmodal">
-Your default permissions may not work in older regions.
- </notification>
-
-<notification
- icon="alertmodal.tga"
- name="ClickUnimplemented"
- type="alertmodal">
-Sorry, not implemented yet.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClickWebProfileHelpAvatar"
- type="alertmodal">
-If this Resident has set a web profile URL then you can:
- * Click &apos;Load&apos; to see the page in this Web tab.
- * Click Load &gt; &apos;In external browser&apos; to view the page in your default web browser.
- * Click Load &gt; &apos;Home URL&apos; to return to this Resident&apos;s web profile if you&apos;ve navigated away.
-
-When viewing your own profile, you can enter any URL as your web profile and click OK to set it.
-Other residents can visit the URL you set when they look at your profile.
+ yestext="Join"/>
</notification>
<notification
icon="alertmodal.tga"
- name="JoinGroupCanAfford"
+ name="JoinGroupNoCost"
type="alertmodal">
-Joining this group costs L$[COST].
+You are joining group [NAME].
Do you wish to proceed?
<usetemplate
name="okcancelbuttons"
@@ -475,6 +415,7 @@ Do you wish to proceed?
yestext="Join"/>
</notification>
+
<notification
icon="alertmodal.tga"
name="JoinGroupCannotAfford"
@@ -507,7 +448,7 @@ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hour
notext="Cancel"
yestext="OK"/>
</notification>
-
+
<notification
icon="alertmodal.tga"
name="SalePriceRestriction"
@@ -664,28 +605,16 @@ Scripts must be allowed to run for weapons to work.
icon="alertmodal.tga"
name="MultipleFacesSelected"
type="alertmodal">
-Multiple faces are currently selected.
+Multiple faces are currently selected.
If you continue this action, separate instances of media will be set on multiple faces of the object.
-To place the media on only one face, choose Select Texture and click on the desired face of that object then click Add.
- <usetemplate
- name="okcancelignore"
- notext="Cancel"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="WhiteListInvalidatesHomeUrl"
- type="alertmodal">
-Adding this entry to the whitelist will invalidate the home URL you
-specified for this instance of media. You are not allowed to do this
-so the entry cannot be added to the whitelist.
+To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
<usetemplate
- name="okbutton"
- yestext="Ok"/>
+ ignoretext="Media will be set on multiple selected faces"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
</notification>
-
<notification
icon="alertmodal.tga"
name="MustBeInParcel"
@@ -791,7 +720,7 @@ Oops! Something was left blank.
You need to enter both the First and Last name of your avatar.
You need an account to enter [SECOND_LIFE]. Would you like to create one now?
- <url
+ <url
option="0"
name="url"
openexternally = "1">
@@ -808,7 +737,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
icon="alertmodal.tga"
name="AddClassified"
type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on www.secondlife.com for one week.
+Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
You&apos;ll be asked for a price to pay when clicking Publish.
Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
@@ -859,6 +788,16 @@ Save changes to classified [NAME]?
<notification
icon="alertmodal.tga"
+ name="ClassifiedInsufficientFunds"
+ type="alertmodal">
+Insufficient funds to create classified.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="DeleteAvatarPick"
type="alertmodal">
Delete pick [PICK]?
@@ -897,6 +836,7 @@ Please select a proposal to view.
Please select a history item to view.
</notification>
+<!--
<notification
icon="alertmodal.tga"
name="ResetShowNextTimeDialogs"
@@ -918,6 +858,7 @@ Would you like to disable all popups which can be skipped?
notext="Cancel"
yestext="OK"/>
</notification>
+-->
<notification
icon="alertmodal.tga"
@@ -1060,13 +1001,13 @@ There was a problem saving a compiled script due to the following reason: [REASO
icon="alertmodal.tga"
name="StartRegionEmpty"
type="alertmodal">
-Oops, Your Start Region is not defined.
-Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+Oops, Your Start Region is not defined.
+Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
-
+
<notification
icon="alertmodal.tga"
name="CouldNotStartStopScript"
@@ -1093,10 +1034,10 @@ Unable to write file [[FILE]]
icon="alertmodal.tga"
name="UnsupportedHardware"
type="alertmodal">
-Warning: Your system does not meet [APP_NAME]&apos;s minimum system requirements. If you continue using [APP_NAME], you may experience poor performance. Unfortunately, the [SUPPORT_SITE] cannot provide technical support for unsupported system configurations.
+Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations.
MINSPECS
-Do you wish to visit [_URL] for more information?
+Visit [_URL] for more information?
<url option="0" name="url">
http://www.secondlife.com/corporate/sysreqs.php
@@ -1112,8 +1053,8 @@ Do you wish to visit [_URL] for more information?
icon="alertmodal.tga"
name="UnknownGPU"
type="alertmodal">
-Your system contains a graphics card that is unknown to [APP_NAME] at this time.
-This is often the case with new hardware that hasn&apos;t been tested yet with [APP_NAME]. [APP_NAME] will most likely run properly, but you may need to adjust your graphics settings to something more appropriate.
+Your system contains a graphics card that [APP_NAME] doesn't recognize.
+This is often the case with new hardware that hasn&apos;t been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings.
(Me &gt; Preferences &gt; Graphics).
<form name="form">
<ignore name="ignore"
@@ -1258,6 +1199,13 @@ Eject [AVATAR_NAME] from your land?
<notification
icon="alertmodal.tga"
+ name="EjectAvatarFromGroup"
+ type="notify">
+You ejected [AVATAR_NAME] from group [GROUP_NAME]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="AcquireErrorTooManyObjects"
type="alertmodal">
ACQUIRE ERROR: Too many objects selected.
@@ -1479,6 +1427,16 @@ You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.
</notification>
<notification
+ icon="alert.tga"
+ name="LandmarkAlreadyExists"
+ type="alert">
+You already have a landmark for this location.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="CannotCreateLandmarkNotOwner"
type="alertmodal">
@@ -1522,6 +1480,13 @@ Select objects with scripts that you have permission to modify.
<notification
icon="alertmodal.tga"
+ name="CannotOpenScriptObjectNoMod"
+ type="alertmodal">
+ Unable to open script in object without modify permissions.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="CannotSetRunningSelectObjectsNoScripts"
type="alertmodal">
Not able to set any scripts to &apos;running&apos;.
@@ -1567,7 +1532,7 @@ Your search terms were too short so no search was performed.
icon="alertmodal.tga"
name="CouldNotTeleportReason"
type="alertmodal">
-Could not teleport.
+Teleport failed.
[REASON]
</notification>
@@ -1669,7 +1634,8 @@ Unable to force land ownership because selection spans multiple regions. Please
icon="alertmodal.tga"
name="ForceOwnerAuctionWarning"
type="alertmodal">
-This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some residents unhappy if bidding has begun. Force ownership?
+This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
+Force ownership?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1767,21 +1733,6 @@ Try selecting a single parcel.
<notification
icon="alertmodal.tga"
- name="ParcelCanPlayMedia"
- type="alertmodal">
-This location can play streaming media.
-Streaming media requires a fast Internet connection.
-
-Play streaming media when available?
-(You can change this option later under Preferences &gt; Audio &amp; Video.)
- <usetemplate
- name="okcancelbuttons"
- notext="Disable"
- yestext="Play Media"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="CannotDeedLandWaitingForServer"
type="alertmodal">
Unable to deed land:
@@ -1959,21 +1910,6 @@ Join land?
<notification
icon="alertmodal.tga"
- name="ShowOwnersHelp"
- type="alertmodal">
-Show owners:
-Color parcels to show the owner type.
-
-Green = Your land
-Aqua = Your Group&apos;s land
-Red = Owned by others
-Yellow = For sale
-Purple = For auction
-Grey = Public
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="ConfirmNotecardSave"
type="alertmodal">
This notecard needs to be saved before the item can be copied or viewed. Save notecard?
@@ -2034,9 +1970,8 @@ This is usually a temporary failure. Please customize and save the wearable agai
icon="alertmodal.tga"
name="YouHaveBeenLoggedOut"
type="alertmodal">
-You have been logged out of [SECOND_LIFE]:
+Darn. You have been logged out of [SECOND_LIFE]
[MESSAGE]
-You can still look at existing IM and chat by clicking &apos;View IM &amp; Chat&apos;. Otherwise, click &apos;Quit&apos; to exit [APP_NAME] immediately.
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2362,6 +2297,9 @@ Display settings have been set to recommended levels based on your system config
name="ErrorMessage"
type="alertmodal">
[ERROR_MESSAGE]
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -2409,7 +2347,7 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
[APP_NAME] installation is complete.
If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
-Return to www.secondlife.com to create a new account?
+Return to [http://join.secondlife.com secondlife.com] to create a new account?
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2426,7 +2364,7 @@ You can either check your Internet connection and try again in a few minutes, cl
<url option="1" name="url">
http://secondlife.com/support/
- </url>
+ </url>
<form name="form">
<button
default="true"
@@ -2469,15 +2407,15 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="GrantedModifyRights"
- type="alertmodal">
-[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
+ type="notify">
+[NAME] has given you permission to edit their objects.
</notification>
<notification
icon="alertmodal.tga"
name="RevokedModifyRights"
- type="alertmodal">
-Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
+ type="notify">
+Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
<notification
@@ -2801,7 +2739,7 @@ Do you want to open your Web browser to view this content?
icon="alertmodal.tga"
name="WebLaunchJoinNow"
type="alertmodal">
-Go to secondlife.com to manage your account?
+Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
<usetemplate
ignoretext="Launch my browser to manage my account"
name="okcancelignore"
@@ -2847,18 +2785,6 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe
<notification
icon="alertmodal.tga"
- name="WebLaunchPublicIssueHelp"
- type="alertmodal">
-Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker.
- <usetemplate
- ignoretext="Launch my browser to view instructions for the Public Issue Tracker"
- name="okcancelignore"
- notext="Cancel"
- yestext="Go to page"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="WebLaunchSupportWiki"
type="alertmodal">
Go to the Official Linden Blog, for the latest news and information.
@@ -3007,7 +2933,6 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
type="alert">
You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
[NAME] has invited you to join a group as a member.
-[INVITE]
<usetemplate
name="okcancelbuttons"
notext="Decline"
@@ -3016,6 +2941,16 @@ You have reached your maximum number of groups. Please leave another group befor
<notification
icon="alert.tga"
+ name="JoinedTooManyGroups"
+ type="alert">
+You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
name="KickUser"
type="alert">
Kick this user with what message?
@@ -3144,7 +3079,7 @@ Join me in [REGION]
icon="alertmodal.tga"
name="TeleportFromLandmark"
type="alertmodal">
-Are you sure you want to teleport?
+Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
<usetemplate
ignoretext="Confirm that I want to teleport to a landmark"
name="okcancelignore"
@@ -3163,7 +3098,19 @@ Teleport to [PICK]?
notext="Cancel"
yestext="Teleport"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportToClassified"
+ type="alertmodal">
+ Teleport to [CLASSIFIED]?
+ <usetemplate
+ ignoretext="Confirm that I want to teleport to a location in Classifieds"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Teleport"/>
+ </notification>
+
<notification
icon="alert.tga"
label="Message everyone in your Estate"
@@ -3362,7 +3309,7 @@ You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3419,7 +3366,7 @@ You cannot claim this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3469,7 +3416,7 @@ You cannot buy this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3580,7 +3527,7 @@ Publish this classified now for L$[AMOUNT]?
icon="alertmodal.tga"
name="SetClassifiedMature"
type="alertmodal">
-Does this classified contain Mature content?
+Does this classified contain Moderate content?
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3592,7 +3539,7 @@ Does this classified contain Mature content?
icon="alertmodal.tga"
name="SetGroupMature"
type="alertmodal">
-Does this group contain Mature content?
+Does this group contain Moderate content?
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3634,384 +3581,13 @@ Type a short announcement which will be sent to everyone in this region.
<notification
icon="alertmodal.tga"
- label="Block Terraform"
- name="HelpRegionBlockTerraform"
- type="alertmodal">
-If this box is checked, land owners will not be able to terraform their land regardless of the per-parcel &apos;Edit Terrain&apos; setting.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Block Fly"
- name="HelpRegionBlockFly"
- type="alertmodal">
-If this box is checked, people will not be able to fly in this region regardless of the per-parcel &apos;Fly&apos; setting.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Bulk Change Content Permissions"
- name="HelpBulkPermission"
- type="alertmodal">
-The Bulk Permissions tool helps you to quickly change the permissions on multiple items in the contents of the selected object(s). However, please note that you are only setting permissions on the items in the Contents of the selected objects -- not permissions on the container object(s) themselves.
-
-Also note, the permissions are not applied to the nested contents of any of the contained items. Your request only operates on items exactly one level deep.
-
-You can selectively choose which types of items to modify by using the checklist under &apos;Content Types&apos; here. Snapshots are included when you select Textures.
-
-* This tool will only succeed at changing permissions on items you are allowed to change.
-* You cannot grant any Next owner permissions which you do not already have.
-* The Next owner permissions are merely requests. If any item cannot take all of the new permissions, none of its permissions will change.
-
-When you are ready to change the permissions in bulk, click &apos;Apply&apos; and wait for the results to display.
-
-If you close the Bulk Permissions window while permissions are being changed, it will halt the operation.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Allow Damage"
- name="HelpRegionAllowDamage"
- type="alertmodal">
-If this box is checked, the health system across all parcels regardless of individual parcel settings. If this box is left unchecked, individual parcel owners will still be able to activate the health system on their parcels.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Agent Limit"
- name="HelpRegionAgentLimit"
- type="alertmodal">
-Sets the maximum number of avatars allowed in this region.
-Performance may vary depending on the number avatars present.
-
-Default: 40
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Object Bonus"
- name="HelpRegionObjectBonus"
- type="alertmodal">
-The Object Bonus is a multiplier for primitives allowed on any given parcel. The range allowed is 1 to 10. Set at &apos;1&apos;, each 512m² parcel is allowed 117 objects. Set at &apos;2&apos;, each 512m² parcel is allowed 234, or twice as many, and so on. The max number of objects allowed per region remains 15,000 no matter what the Object Bonus is. Once set, be aware that lowering the Object Bonus may cause objects to be returned or deleted.
-
-Default: 1.0
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Maturity"
- name="HelpRegionMaturity"
- type="alertmodal">
-Sets the maturity Rating of the Region, as shown in the menu bar at the top of any Resident&apos;s viewer, and in tooltips on the World Map when the cursor hovers over this Region. This setting also affects access to this Region and search results. Other Residents may only enter Regions or view search results with the same maturity Ratings they have chosen in their preferences.
-
-It may take some time for this change to be reflected on the map.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Restrict Pushing"
- name="HelpRegionRestrictPushObject"
- type="alertmodal">
-This checkbox sets the full region to restricted push permissions.
-When enabled, Residents may only be pushed by themselves or by the parcel&apos;s owner.
-(Push refers to the llPushObject() LSL function.)
-
-Default: Off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Parcel Join/Subdivide"
- name="HelpParcelChanges"
- type="alertmodal">
-This checkbox sets whether or not parcels not owned by the estate owner can be joined or subdivided.
-If this option is unchecked:
- * Only estate owners or managers can join or subdivide parcels.
- * They may only join or subdivide parcels belonging to the owner, or to a group where they have the appropriate group powers.
-If this option is checked:
- * All parcel owners can join or subdivide the parcels they own.
- * For group owned parcels, those with appropriate group powers may join or subdivide parcels.
-
-Default: Checked
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Do Not Show In Search"
- name="HelpRegionSearch"
- type="alertmodal">
-Checking this box will block parcel owners from listing their parcels in search.
-
-Default: Off
- </notification>
-
- <notification
- icon="alertmodal.tga"
label="Changed Region Maturity"
name="RegionMaturityChange"
type="alertmodal">
The maturity rating for this region has been updated.
It may take some time for the change to be reflected on the map.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Land Resale"
- name="HelpRegionLandResell"
- type="alertmodal">
-Estate owners and managers can sell any land owned by the estate owner.
-If this option is left unchecked, buyers cannot resell their land in this region.
-If this option is checked, buyers can resell their land in this region.
-
-Default: Disallow
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Disable Scripts"
- name="HelpRegionDisableScripts"
- type="alertmodal">
-When sim performance is poor, a script may be to blame. Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS.
-If it is lower than 45, open the Time panel located at the bottom of the Stats Bar. If Script Time reads 25 ms or higher, click the Get Top Scripts button. You will be given the name and location of scripts that may be causing poor performance.
-
-Checking the Disable Scripts box and then pressing the Apply button will temporarily disable all scripts in this region. You may need to do this in order to travel to the location of a noted &apos;top script&apos;. Once you have arrived at the location, investigate the script to determine if it is causing the problem. You may want to contact the owner of the script or delete or return the object.
-Uncheck the Disable Script box and then Apply to reactivate the scripts in the region.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Disable Collisions"
- name="HelpRegionDisableCollisions"
- type="alertmodal">
-When sim performance is poor, physical objects may be to blame.
-Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS. If it is lower than 45, open the Time panel located at the bottom of the Stats Bar. If Sim Time (Physics) reads 20 ms or higher, click the Get Top Colliders button.
-You will be given the name and location of physical objects that may be causing poor performance.
-
-Checking the Disable Collisions box and then pressing the Apply button will temporarily disable object-object collisions. You may need to do this in order to travel to the location of a noted &apos;top collider&apos;. Once you have arrived at the location, investigate the object - is it constantly colliding with other objects? You may want to contact the owner of the object or delete or return the object.
-Uncheck the Disable Collisions box and then Apply to reactivate collisions in the region.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Disable Physics"
- name="HelpRegionDisablePhysics"
- type="alertmodal">
-Disable Physics is similar to Disable Collisions, except all physics simulation is disabled. This means that not only will objects stop colliding, but avatars will be unable to move.
-
-This should only be used when Disable Collisions does not give back enough performance to the region to investigate a physics problem or Top Collider.
-
-Be sure to re-enable physics when you are done, or avatars will continue to be unable to move.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Top Colliders"
- name="HelpRegionTopColliders"
- type="alertmodal">
-Show a list of objects experiencing the greatest number of potential object-object collisions. These objects can slow performance. Select Advanced &gt; Performance Tools &gt; Statistics Bar and look under Simulator &gt; Time &gt; Physics Time to see if more than 20 ms is being spent in physics.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Top Scripts"
- name="HelpRegionTopScripts"
- type="alertmodal">
-Show a list of objects spending the most time running LSL scripts. These objects can slow performance.
-Select Advanced &gt; Performance Tools &gt; Statistics Bar and look under Simulator &gt; Time &gt; Script Time to see if more than 25 ms is being spent in scripts.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Restart Region"
- name="HelpRegionRestart"
- type="alertmodal">
-Restart the server process running this region after a two minute warning. All Residents in the region will be disconnected. The region will save its data, and should come back up within 90 seconds.
-
-Restarting the region will not fix most performance problems, and should usually be used only when directed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Water Height"
- name="HelpRegionWaterHeight"
- type="alertmodal">
-This is the height in meters where water appears. If this setting is anything other than 20 and you have water that is adjacent to the edge of world or &apos;void&apos; water, there will be a visible gap.
-
-Default: 20
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Terrain Raise"
- name="HelpRegionTerrainRaise"
- type="alertmodal">
-This is the distance in meters that parcel owners can raise their terrain above the &apos;baked&apos; terrain default height.
-Default: 4
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Terrain Lower"
- name="HelpRegionTerrainLower"
- type="alertmodal">
-This is the distance in meters that parcel owners can lower their terrain below the &apos;baked&apos; terrain default height.
-
-Default: -4
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Upload RAW Terrain"
- name="HelpRegionUploadRaw"
- type="alertmodal">
-This button uploads a .RAW file to the region you are in.
-The file must have the correct dimensions (RGB, 256x256) and 13 channels. The best way to create a terrain file is to download the existing RAW file. A good first step is to modify the red channel (land height), and upload it.
-
-The upload can take up to 45 seconds. Note that uploading a terrain file *will not* move the objects that are on the land, only the terrain itself and the permissions associated with the parcels. This can result in objects going underground.
-
-For more information on editing region height fields, consult F1 Help.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Download RAW Terrain"
- name="HelpRegionDownloadRaw"
- type="alertmodal">
-This button downloads a file containing the height field data, parcel dimensions, parcel for sale status and some parcel permissions for this region. When opening the file in a program such as Photoshop you must specify the document&apos;s dimensions which are: RGB, 256x256 with 13 channels. This terrain file cannot be opened in any other way.
-
-For more information on editing region height fields, consult F1 help.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Use Estate Sun"
- name="HelpRegionUseEstateSun"
- type="alertmodal">
-This checkbox makes the sun position in this region the same as the sun position in the rest of the estate.
-
-Default: on
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Fixed Sun"
- name="HelpRegionFixedSun"
- type="alertmodal">
-This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Bake Terrain"
- name="HelpRegionBakeTerrain"
- type="alertmodal">
-This button saves the current shape of the terrain as the new default for the region. Once baked, the land can revert to the saved shape whenever you or others use the Edit Terrain &apos;Revert&apos; option. The baked terrain is also the middle point for the terrain raise and lower limits.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Estate Managers"
- name="HelpEstateEstateManager"
- type="alertmodal">
-An estate manager is a Resident to whom you have delegated control of region and estate settings. An estate manager can change any setting in these panels, except for uploading, downloading, and baking terrain. In particular, they can allow or ban Residents from your estate.
-
-Estate managers can only be added or removed by the owner of the estate, not by each other. Please only choose Residents you trust as estate managers, as you will be ultimately responsible for their actions.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Use Global Time"
- name="HelpEstateUseGlobalTime"
- type="alertmodal">
-This checkbox makes the sun in your estate follow the same position as on the Linden-owned &apos;mainland&apos; estates.
-
-Default: on
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Fixed Sun"
- name="HelpEstateFixedSun"
- type="alertmodal">
-This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Public Access"
- name="HelpEstateExternallyVisible"
- type="alertmodal">
-This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list.
-
-Default: on
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Allow Direct Teleport"
- name="HelpEstateAllowDirectTeleport"
- type="alertmodal">
-When checked, allows Residents to directly teleport to any point in your estate. When unchecked, Residents teleport to the nearest telehub.
-
-Default: off
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Allow Access"
- name="HelpEstateAllowResident"
- type="alertmodal">
-Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Public Access is unchecked.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Allow Group Access"
- name="HelpEstateAllowGroup"
- type="alertmodal">
-Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Public Access is unchecked.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Abuse Email Address"
- name="HelpEstateAbuseEmailAddress"
- type="alertmodal">
-Setting this to a valid email address will cause abuse reports on this estate to be sent to that address.
-Setting it blank will cause abuse reports to be sent only to Linden Lab.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Deny Access"
- name="HelpEstateBanResident"
- type="alertmodal">
-Residents on this list are denied access to your estate, regardless of any other settings.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- label="Allow Voice Chat"
- name="HelpEstateVoiceChat"
- type="alertmodal">
-Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby.
-
-Default: off
+To enter Adult regions, Residents must be Account Verified, either by age-verification or payment-verification.
</notification>
<notification
@@ -4024,18 +3600,6 @@ This version of [APP_NAME] is not compatible with the Voice Chat feature in this
<notification
icon="alertmodal.tga"
- label="Estate Covenant"
- name="HelpEstateCovenant"
- type="alertmodal">
-Setting an estate covenant enables you to sell parcels within that estate. If a covenant is not set, you cannot sell the land. The notecard for your covenant can be empty if you do not wish to apply any rules or advise buyers of anything in relation to the land before they buy it.
-
-A covenant can be used to communicate rules, guidelines, cultural information or simply your own expectations to the prospective buyer. This can include zoning, building regulations, payment options or any other information you feel it is important for the new owner to have seen and to have agreed to before they purchase.
-
-The buyer must agree to the covenant by ticking the check box before they will be able to finish the purchase. Estate covenants are always visible in the About Land dialog for any parcels that have one set.
- </notification>
-
- <notification
- icon="alertmodal.tga"
label="Can&apos;t Buy Objects"
name="BuyObjectOneOwner"
type="alertmodal">
@@ -4251,7 +3815,7 @@ There are no items in this object that you are allowed to copy.
icon="alertmodal.tga"
name="WebLaunchAccountHistory"
type="alertmodal">
-Go to secondlife.com to see your account history?
+Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
<usetemplate
ignoretext="Launch my browser to see my account history"
name="okcancelignore"
@@ -4261,18 +3825,6 @@ Go to secondlife.com to see your account history?
<notification
icon="alertmodal.tga"
- name="ClickOpenF1Help"
- type="alertmodal">
-Do you want to visit [SECOND_LIFE] help?
- <usetemplate
- ignoretext="Launch my browser to view Help/Support"
- name="okcancelignore"
- notext="Cancel"
- yestext="Go"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="ConfirmQuit"
type="alertmodal">
Are you sure you want to quit?
@@ -4287,35 +3839,15 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
- type="alertmodal">
-Use this tool to report violations of the Terms of Service and Community Standards. See:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-All reported abuses of the Terms of Service and Community Standards are investigated and resolved. You can view the incident resolution on the Incident Report at:
+ type="alert">
+Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
-http://secondlife.com/support/incidentreport.php
+All reported abuses are investigated and resolved.
<unique/>
</notification>
<notification
icon="alertmodal.tga"
- name="HelpReportAbuseEmailEO"
- type="alertmodal">
-IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab.
-
-As a service to residents and visitors, the owner of the region you are in has elected to receive and resolve all reports originating in this region. Linden Lab will not investigate reports you file from this location.
-
-The region owner will resolve reports based on the local rules of this region as outlined in the estate Covenant.
-(View covenants by going to the World menu and selecting About Land.)
-
-The resolution of this report applies only to this Region. Residents&apos; access to other areas of [SECOND_LIFE] will not be affected by the outcome of this report. Only Linden Lab can restrict access to the entirety of [SECOND_LIFE].
- <unique/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="HelpReportAbuseSelectCategory"
type="alertmodal">
Please select a category for this abuse report.
@@ -4363,9 +3895,9 @@ Dear Resident,
You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
-(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
+(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] or [http://secondlife.com/corporate/cs.php Community Standards]. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
-(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our DMCA Policy at http://secondlife.com/corporate/dmca.php.
+(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our [http://secondlife.com/corporate/dmca.php DMCA Policy].
If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
@@ -4435,6 +3967,18 @@ Would you like to leave Busy Mode before completing this transaction?
<notification
icon="alertmodal.tga"
+ name="ConfirmDeleteProtectedCategory"
+ type="alertmodal">
+The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it?
+ <usetemplate
+ ignoretext="Confirm before I delete a system folder"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ConfirmEmptyTrash"
type="alertmodal">
Are you sure you want to permanently delete the contents of your Trash?
@@ -4506,31 +4050,6 @@ Link to this from a web page to give others easy access to this location, or try
<notification
icon="alertmodal.tga"
- name="GraphicsPreferencesHelp"
- type="alertmodal">
-This panel controls window size and resolution and the quality of the client&apos;s graphics. The Preferences &gt; Graphics interface allows you to choose between four graphics levels: Low, Mid, High, and Ultra. You may also customize your graphics settings by clicking the Advanced button and manipulating the following settings:
-
-Shaders: Enable or disable various types of pixel shaders.
-
-Reflection Detail: Sets the types of objects that water can reflect.
-
-Avatar Rendering: Sets options that affect how the client renders avatars.
-
-Draw Distance: Affects how far out from your viewpoint objects will be rendered in the scene.
-
-Max Particle Count: Sets the maximum number of particles you are able to see on your screen at once.
-
-Post Process Quality: Sets the resolution with which Glow is rendered.
-
-Mesh Detail: Sets the amount of detail or number of triangles used in rendering certain objects. A higher value takes longer to render, but makes these objects appear with more detail.
-
-Lighting Detail: Selects what types of lights you would like to render.
-
-Terrain Detail: Sets the amount of detail you would like to see for the terrain texture.
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="WLSavePresetAlert"
type="alertmodal">
Do you wish to overwrite the saved preset?
@@ -4577,306 +4096,6 @@ PostProcess Effect exists. Do you still wish overwrite it?
</notification>
<notification
- icon="alertmodal.tga"
- name="HelpEditSky"
- type="alertmodal">
-Edit the WindLight sliders to create and save a set of skies.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpEditDayCycle"
- type="alertmodal">
-Set which skies to turn to throughout the day.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="EnvSettingsHelpButton"
- type="alertmodal">
-These settings adjust the way the environment looks locally on your computer. Your graphics card needs to support atmospheric shaders in order to have access to all of the settings.
-
-Adjust the &quot;Time of Day&quot; slider to change the day&apos;s phase locally on the viewer.
-
-Adjust the &quot;Cloud Cover&quot; slider to control how much the clouds cover the sky.
-
-Pick a color in the &quot;Water Color&quot; color picker to change the color of the water.
-
-Adjust the &quot;Water Fog&quot; slider to control how dense the fog is underwater.
-
-Click &quot;Use Estate Time&quot; to reset the time of day to the region&apos;s current time of day and remain linked to it.
-
-Click &quot;Advanced Sky&quot; to bring up an editor with more advanced settings for the sky.
-
-Click &quot;Advanced Water&quot; to bring up an editor with more advanced settings for the water.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpDayCycle"
- type="alertmodal">
-The Day Cycle Editor gives you control over the sky during [SECOND_LIFE]&apos;s day/night cycle. This is the cycle that is used by the Basic Environment Editor&apos;s Time of Day slider.
-
-The Day Cycle Editor works by setting keyframes. These are nodes (represented by the gray blips on the time graph) that have Sky Presets associated with them. As the Time of Day progresses, the WindLight sky &quot;animates&quot; as it interpolates between these keyframes.
-
-The yellow arrow above the timeline represents your current view, based on Time of Day. Click and drag it to see how your day will animate. You may add or delete keyframes by pressing the Add Key and Delete Key buttons to the right of the timeline.
-
-You can set the time position of a keyframe by either dragging it along the timeline, or by setting its value manually in the Key Frame Settings frame. Within the Key Frame Settings frame, you&apos;ll be able to associate the keyframe with its respective WindLight preset.
-
-Length of Cycle dictates the overall duration of a &quot;day&quot;. Setting this to a low value (for instance, 2 min.) will mean your entire 24-hour timeline will animate in only two real minutes! Once you are satisfied with your timeline and keyframe cycle, use the Play and Stop buttons to preview the results. Remember- you can also move the yellow time-indicator arrow above the timeline to see the cycle animate interactively. Using the Use Estate Time button will synchronize your day length and time of day with the Estate&apos;s day cycle.
-
-Once you are pleased with your Day Cycle, you can save and load it with the Save Test Day and Load Test Day buttons. Note that, for now, we only allow one Day Cycle.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpBlueHorizon"
- type="alertmodal">
-Use the Red/Green/Blue (RGB) sliders to adjust the color of the sky. You can use the Intensity (I) slider to move all three RGB sliders in unison.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpHazeHorizon"
- type="alertmodal">
-Haze Horizon is one of the most useful parameters for adjusting overall light exposure in the scene. It is effective for simulating many exposure settings, such as white-outs from the sun and darker, closed-iris settings.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpBlueDensity"
- type="alertmodal">
-Blue Density affects the overall color saturation of the sky and fog. If you move the Intensity (I) slider to the right, colors will become brighter and more vibrant. If you move it all the way to the left, the colors will become duller, eventually fading to black and white. If you want to fine-tune the sky&apos;s color balance, you can control individual elements of saturation by using the Red/Green/Blue (RGB) sliders.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpHazeDensity"
- type="alertmodal">
-Haze Density controls the level of dull, gray haze in the atmosphere. It is effective for simulating scenes with high levels of smoke and man-made pollutants. It is also effective for simulating fog and mist.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpDensityMult"
- type="alertmodal">
-The Density Multiplier can be used to affect the overall atmospheric density. At lower settings, it creates a feeling of &quot;thin air&quot;, and at higher settings, it creates a very heavy, smoggy effect.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpDistanceMult"
- type="alertmodal">
-Adjusts WindLight&apos;s perceived distance. A value of zero effectively turns off WindLight&apos;s influence on terrain and objects. Values greater than 1 simulate greater distances for thicker atmospheric effects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpMaxAltitude"
- type="alertmodal">
-Max Altitude adjusts the altitude calculations WindLight performs when computing its atmospheric lighting. At later times of day, it is useful for adjusting how &quot;deep&quot; the sunset appears.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpSunlightColor"
- type="alertmodal">
-Adjusts the color and intensity of the direct light in the scene.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpSunAmbient"
- type="alertmodal">
-Adjusts the color and intensity of ambient atmospheric light in the scene.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpSunGlow"
- type="alertmodal">
-The Size slider controls the size of the sun.
-The Focus slider controls how blurred the sun is over the sky.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpSceneGamma"
- type="alertmodal">
-Adjust the screen&apos;s distribution of light and dark.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpStarBrightness"
- type="alertmodal">
-Adjusts the brightness of the stars in the sky.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpTimeOfDay"
- type="alertmodal">
-Controls the location of the sun in the sky.
-Similar to elevation.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpEastAngle"
- type="alertmodal">
-Controls the location of the sun in the sky.
-Similar to azimuth.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudColor"
- type="alertmodal">
-Edits the color of the clouds. It is generally recommended to keep it whitish, but hey, have fun if you want.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudDetail"
- type="alertmodal">
-Controls the detail image layered on top of the main cloud image. X and Y control its position. D (Density) controls how puffy or fractured the clouds appear.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudDensity"
- type="alertmodal">
-Allows you to control the position of the clouds with the X and Y sliders and how dense they are with the the D slider.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudCoverage"
- type="alertmodal">
-Controls how much the clouds cover the sky.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudScale"
- type="alertmodal">
-Controls the scaling of the cloud image on the sky dome.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudScrollX"
- type="alertmodal">
-Controls the speed of the clouds as they move in the X direction.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpCloudScrollY"
- type="alertmodal">
-Controls the speed of the clouds as they move in the Y direction.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpClassicClouds"
- type="alertmodal">
-Check this box to enable rendering of [SECOND_LIFE]&apos;s older classic clouds in addition to WindLight&apos;s clouds.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterFogColor"
- type="alertmodal">
-Chooses the color of the underwater fog.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterFogDensity"
- type="alertmodal">
-Controls how dense the water fog is and how far you can see underwater.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpUnderWaterFogMod"
- type="alertmodal">
-Modifies the effect of the Fog Density Exponent to control how far you can see when your avatar is underwater.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterGlow"
- type="alertmodal">
-Controls how much the surface of the water glows.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterNormalScale"
- type="alertmodal">
-Controls the scaling of the three wavelets that make up the water.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterFresnelScale"
- type="alertmodal">
-Controls how much light is reflected at different angles.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterFresnelOffset"
- type="alertmodal">
-Controls how much light intensity is reflected.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterScaleAbove"
- type="alertmodal">
-Controls how much light is refracted from looking above the surface of the water.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterScaleBelow"
- type="alertmodal">
-Controls how much light is refracted from looking from below the surface of the water.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterBlurMultiplier"
- type="alertmodal">
-Controls how waves and reflections are mixed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterNormalMap"
- type="alertmodal">
-Controls what normal map is layered across the water to determine reflections/refractions.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterWave1"
- type="alertmodal">
-Controls where and how fast the large scaled version of the normal map moves in the X and Y direction.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HelpWaterWave2"
- type="alertmodal">
-Controls where and how fast the the small scaled version of the normal map moves in the X and Y direction.
- </notification>
-
- <notification
icon="alert.tga"
name="NewSkyPreset"
type="alert">
@@ -5156,7 +4375,6 @@ Hmm. Gesture [NAME] is missing from the database.
name="UnableToLoadGesture"
type="notifytip">
Unable to load gesture [NAME].
-Please try again.
</notification>
<notification
@@ -5315,7 +4533,7 @@ You don&apos;t have permission to copy this.
icon="notifytip.tga"
name="InventoryAccepted"
type="notifytip">
-[NAME] accepted your inventory offer.
+[NAME] received your inventory offer.
</notification>
<notification
@@ -5359,8 +4577,8 @@ Click on any landmark to select it, then click &apos;Teleport&apos; at the botto
icon="notifytip.tga"
name="TeleportToPerson"
type="notifytip">
-You can contact residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
-Select the resident from the list, then click &apos;IM&apos; at the bottom of the panel.
+You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
+Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
</notification>
@@ -5383,7 +4601,7 @@ Some terms in your search query were excluded due to content restrictions as cla
icon="notifytip.tga"
name="NoContentToSearch"
type="notifytip">
-Please select at least one type of content to search (PG, Mature, or Adult).
+Please select at least one type of content to search (General, Moderate, or Adult).
</notification>
<notification
@@ -5413,6 +4631,13 @@ Please select at least one type of content to search (PG, Mature, or Adult).
<notification
icon="notify.tga"
+ name="PaymentRecived"
+ type="notify">
+[MESSAGE]
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="EventNotification"
type="notify">
Event Notification:
@@ -5463,7 +4688,7 @@ Deactivated gestures with same trigger:
name="NoQuickTime"
type="notify">
Apple&apos;s QuickTime software does not appear to be installed on your system.
-If you want to view streaming media on parcels that support it you should go to the QuickTime site (http://www.apple.com/quicktime) and install the QuickTime Player.
+If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
</notification>
<notification
icon="notify.tga"
@@ -5502,7 +4727,7 @@ The objects on the selected parcel of land that is owned by [FIRST] [LAST] have
icon="notify.tga"
name="OtherObjectsReturned2"
type="notify">
-The objects on the selected parcel of land owned by the resident &apos;[NAME]&apos; have been returned to their owner.
+The objects on the selected parcel of land owned by the Resident &apos;[NAME]&apos; have been returned to their owner.
</notification>
<notification
@@ -5525,9 +4750,10 @@ The objects on the selected parcel that are NOT owned by you have been returned
icon="notify.tga"
name="ServerObjectMessage"
type="notify">
-[MSG]
+Message from [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
-
+
<notification
icon="notify.tga"
name="NotSafe"
@@ -5625,14 +4851,6 @@ Your account cannot connect to this teen grid region.
<notification
icon="notify.tga"
- name="NoHelpIslandTP"
- type="notify">
-You cannot teleport back to Help Island.
-Go to &apos;Help Island Public&apos; to repeat the tutorial.
- </notification>
-
- <notification
- icon="notify.tga"
name="ImproperPaymentStatus"
type="notify">
You do not have proper payment status to enter this region.
@@ -5789,17 +5007,18 @@ No valid parcel could be found.
<notification
icon="notify.tga"
name="ObjectGiveItem"
- type="notify">
-An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
+ type="offer">
+An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button
index="0"
name="Keep"
- text="OK"/>
+ text="Keep"/>
<button
index="1"
name="Discard"
- text="Cancel"/>
+ text="Discard"/>
<button
index="2"
name="Mute"
@@ -5810,17 +5029,18 @@ An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECT
<notification
icon="notify.tga"
name="ObjectGiveItemUnknownUser"
- type="notify">
-An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a [OBJECTTYPE] named [OBJECTNAME].
+ type="offer">
+An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button
index="0"
name="Keep"
- text="OK"/>
+ text="Keep"/>
<button
index="1"
name="Discard"
- text="Cancel"/>
+ text="Discard"/>
<button
index="2"
name="Mute"
@@ -5831,17 +5051,22 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
name="UserGiveItem"
- type="notify">
-[NAME] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;.
+ type="offer">
+[NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button
- index="0"
- name="Keep"
- text="Accept"/>
+ index="4"
+ name="Show"
+ text="Show"/>
<button
index="1"
name="Discard"
- text="No, thanks"/>
+ text="Discard"/>
+ <button
+ index="2"
+ name="Mute"
+ text="Block"/>
</form>
</notification>
@@ -5850,6 +5075,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
name="GodMessage"
type="notify">
[NAME]
+
[MESSAGE]
</notification>
@@ -5877,7 +5103,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
name="TeleportOffered"
- type="notify">
+ type="offer">
[NAME] has offered to teleport you to their location:
[MESSAGE]
@@ -5895,6 +5121,14 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
+ name="TeleportOfferSent"
+ type="offer">
+ Teleport offer sent to [TO_NAME]
+ </notification>
+
+
+ <notification
+ icon="notify.tga"
name="GotoURL"
type="notify">
[MESSAGE]
@@ -5914,7 +5148,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
name="OfferFriendship"
- type="notify">
+ type="offer">
[NAME] is offering friendship.
[MESSAGE]
@@ -5934,6 +5168,13 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
+ name="FriendshipOffered"
+ type="offer">
+ You have offered friendship to [TO_NAME]
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="OfferFriendshipNoMessage"
type="notify">
[NAME] is offering friendship.
@@ -5954,7 +5195,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
<notification
icon="notify.tga"
name="FriendshipAccepted"
- type="notify">
+ type="offer">
[NAME] accepted your friendship offer.
</notification>
@@ -5964,13 +5205,27 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
type="notify">
[NAME] declined your friendship offer.
</notification>
+
+ <notification
+ icon="notify.tga"
+ name="FriendshipAcceptedByMe"
+ type="offer">
+Friendship offer accepted.
+ </notification>
<notification
icon="notify.tga"
+ name="FriendshipDeclinedByMe"
+ type="offer">
+Friendship offer declined.
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="OfferCallingCard"
type="notify">
[FIRST] [LAST] is offering their calling card.
-This will add a bookmark in your inventory so you can quickly IM this resident.
+This will add a bookmark in your inventory so you can quickly IM this Resident.
<form name="form">
<button
index="0"
@@ -6127,6 +5382,28 @@ Grant this request?
<notification
icon="notify.tga"
+ name="ScriptToast"
+ type="notify">
+ [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting user input.
+ <form name="form">
+ <button
+ index="0"
+ name="Open"
+ text="Open Dialog"/>
+ <button
+ index="1"
+ name="Ignore"
+ text="Ignore"/>
+ <button
+ index="2"
+ name="Block"
+ text="Block"/>
+ </form>
+ </notification>
+
+<!--
+ <notification
+ icon="notify.tga"
name="FirstBalanceIncrease"
type="notify">
You just received L$[AMOUNT].
@@ -6140,6 +5417,7 @@ Your L$ balance is shown in the upper-right.
You just paid L$[AMOUNT].
Your L$ balance is shown in the upper-right.
</notification>
+-->
<notification
icon="notify.tga"
@@ -6149,8 +5427,10 @@ Thank you for your payment!
Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
-The status of your payment can be checked on your Transaction History page at Me > My Dashboard, or http://secondlife.com/account/
+The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
</notification>
+
+<!--
<notification
icon="notify.tga"
name="FirstSit"
@@ -6175,6 +5455,7 @@ Use the controls on the right to find things and display different backgrounds.
type="notify">
You have opened the Build Tools. Every object you see around you was created using these tools.
</notification>
+-->
<!--
<notification
@@ -6185,7 +5466,7 @@ You have opened the Build Tools. Every object you see around you was created usi
If the mouse pointer changes to a hand, you can interact with the object.
Right-click always shows a menu of things you can do.
</notification>
--->
+
<notification
icon="notify.tga"
name="FirstTeleport"
@@ -6193,6 +5474,8 @@ You have opened the Build Tools. Every object you see around you was created usi
You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it.
</notification>
+-->
+
<notification
icon="notify.tga"
name="FirstOverrideKeys"
@@ -6203,6 +5486,7 @@ Some objects (like guns) require you to go into mouselook to use them.
Press &apos;M&apos; to do this.
</notification>
+<!--
<notification
icon="notify.tga"
name="FirstAppearance"
@@ -6222,6 +5506,7 @@ This is your Inventory, which contains items you own.
* To rez something inworld, drag it onto the ground.
* To read a notecard, double-click it.
</notification>
+-->
<notification
icon="notify.tga"
@@ -6232,6 +5517,7 @@ This is a sandbox area, and is meant to help Residents learn how to build.
Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
</notification>
+<!--
<notification
icon="notify.tga"
name="FirstFlexible"
@@ -6257,13 +5543,16 @@ To toggle this menu,
type="notify">
You are editing a Sculpted prim. Sculpties require a special texture to define their shape.
</notification>
+-->
- <!--notification
+ <!--
+ <notification
icon="notify.tga"
name="FirstMedia"
type="notify">
You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust.
- </notification-->
+ </notification>
+ -->
<notification
icon="notifytip.tga"
@@ -6416,7 +5705,7 @@ We&apos;re sorry. This area has reached maximum capacity for voice conversation
icon="notifytip.tga"
name="VoiceChannelDisconnected"
type="notifytip">
-You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to spatial voice chat.
+You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -6426,7 +5715,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="VoiceChannelDisconnectedP2P"
type="notifytip">
-[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -6436,7 +5725,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="P2PCallDeclined"
type="notifytip">
-[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -6446,7 +5735,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="P2PCallNoAnswer"
type="notifytip">
-[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -6456,7 +5745,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="VoiceChannelJoinFailed"
type="notifytip">
-Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.
+Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -6518,7 +5807,7 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N
name="ServerVersionChanged"
priority="high"
type="notifytip">
-You just entered a region using a different server version, which may affect performance. Click to see the release notes.
+You just entered a region using a different server version, which may affect performance. [[URL] View the release notes.]
</notification>
<notification
@@ -6529,6 +5818,23 @@ You just entered a region using a different server version, which may affect per
The SLurl you clicked on is not supported.
</notification>
+ <notification
+ icon="notifytip.tga"
+ name="BlockedSLURL"
+ priority="high"
+ type="notifytip">
+A SLurl was received from an untrusted browser and has been blocked for your security.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ThrottledSLURL"
+ priority="high"
+ type="notifytip">
+Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security.
+ </notification>
+
<notification name="IMToast" type="notifytoast">
[MESSAGE]
<form name="form">
@@ -6536,6 +5842,17 @@ The SLurl you clicked on is not supported.
</form>
</notification>
+ <notification
+ icon="alert.tga"
+ name="ConfirmCloseAll"
+ type="alertmodal">
+Are you sure you want to close all IMs?
+ <usetemplate
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
<notification icon="notifytip.tga"
name="AttachmentSaved" type="notifytip">
Attachment has been saved.
@@ -6559,6 +5876,26 @@ Server Error: Media update or get failed.
yestext="OK"/>
</notification>
+ <notification
+ icon="alertmodal.tga"
+ name="TextChatIsMutedByModerator"
+ type="alertmodal">
+Your text chat has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="VoiceIsMutedByModerator"
+ type="alertmodal">
+Your voice has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="ConfirmClearTeleportHistory"
@@ -6570,6 +5907,15 @@ Are you sure you want to delete your teleport history?
yestext="OK"/>
</notification>
+ <notification
+ icon="alert.tga"
+ name="BottomTrayButtonCanNotBeShown"
+ type="alert">
+Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+ </notification>
+
+
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
</global>
@@ -6596,19 +5942,11 @@ If you continue to have problems, please visit the [SUPPORT_SITE].
- Your system memory does not meet the minimum requirements.
</global>
- <global name="PermYes">
-Yes
- </global>
-
- <global name="PermNo">
-No
- </global>
-<!-- this is alert string from server. the name needs to match entire the server string, and needs to be changed
- whenever the server string changes -->
+<!-- this is alert string from server. the name needs to match entire the server string, and needs to be changed
+ whenever the server string changes -->
<global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">
-If you own a piece of land, you can make it your home location.
+If you own a piece of land, you can make it your home location.
Otherwise, you can look at the Map and find places marked &quot;Infohub&quot;.
- </global>
-
-</notifications>
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
new file mode 100644
index 0000000000..bef5f8dafd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ name="panel_activeim_row"
+ layout="topleft"
+ follows="left|right"
+ top="0"
+ left="0"
+ height="35"
+ width="318"
+ background_opaque="false"
+ background_visible="true"
+ bg_alpha_color="0.0 0.0 0.0 0.0" >
+ <chiclet_script
+ name="object_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_script>
+ <chiclet_offer
+ name="inv_offer_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_offer>
+ <text
+ type="string"
+ name="object_name"
+ layout="topleft"
+ top="10"
+ left_pad="20"
+ height="14"
+ width="245"
+ length="1"
+ follows="right|left"
+ use_ellipses="true"
+ font="SansSerifBold">
+ Unnamed Object
+ </text>
+ <button
+ top="10"
+ right="-5"
+ width="17"
+ height="17"
+ layout="topleft"
+ follows="right"
+ name="hide_btn"
+ mouse_opaque="true"
+ label=""
+ tab_stop="false"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 4dc4a9ff46..3416b2369d 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
+<panel
name="panel_activeim_row"
layout="topleft"
follows="left|right"
@@ -7,56 +7,89 @@
left="0"
height="35"
width="318"
- background_visible="true"
- bevel_style="in"
- bg_alpha_color="0 0 0 0">
+ background_opaque="false"
+ background_visible="true"
+ bg_alpha_color="0.0 0.0 0.0 0.0" >
<chiclet_im_p2p
name="p2p_chiclet"
layout="topleft"
follows="left"
- top="5"
+ top="3"
left="5"
height="25"
- width="45">
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
</chiclet_im_p2p>
<chiclet_im_group
name="group_chiclet"
layout="topleft"
follows="left"
- top="5"
+ top="3"
left="5"
height="25"
- width="45">
+ width="25"
+ visible="false"
+ speaker.name="speaker_grp"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
</chiclet_im_group>
+ <chiclet_im_adhoc
+ name="adhoc_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_hoc"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_im_adhoc>
<text
type="string"
name="contact_name"
layout="topleft"
- top="8"
- left_pad="6"
- height="28"
- width="235"
+ top="10"
+ left_pad="10"
+ height="14"
+ width="255"
length="1"
follows="right|left"
- font="SansSerifBold"
- text_color="White">
- Contact Name
+ use_ellipses="true"
+ font="SansSerifBold">
+ Grumpity ProductEngine
</text>
<button
- top="5"
- left_pad="5"
- width="15"
- height="15"
+ top="10"
+ right="-5"
+ width="17"
+ height="17"
layout="topleft"
follows="right"
name="hide_btn"
mouse_opaque="true"
label=""
tab_stop="false"
- image_unselected="toast_hide_btn.tga"
- image_disabled="toast_hide_btn.tga"
- image_selected="toast_hide_btn.tga"
- image_hover_selected="toast_hide_btn.tga"
- image_disabled_selected="toast_hide_btn.tga"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
/>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index 8db745fab7..28a6995186 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -1,29 +1,99 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- name="panel_im_control_panel"
- width="146"
+ border="false"
+ follows="all"
height="215"
- border="false">
- <avatar_list
- color="DkGray2"
- follows="left|top|right|bottom"
- height="130"
- ignore_online_status="true"
+ name="panel_im_control_panel"
+ width="150">
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="215"
layout="topleft"
left="3"
- name="speakers_list"
- opaque="false"
- top="10"
- width="140" />
- <button
- name="call_btn"
- label="Call"
- width="90"
- height="20" />
- <button
- name="end_call_btn"
- label="End Call"
- width="90"
- height="20"
- visible="false"/>
+ name="vertical_stack"
+ orientation="vertical"
+ top="0"
+ width="147">
+ <layout_panel
+ auto_resize="true"
+ follows="top|left"
+ height="130"
+ layout="topleft"
+ left="0"
+ min_height="0"
+ mouse_opaque="false"
+ width="147"
+ top="0"
+ name="speakers_list_panel"
+ user_resize="false">
+ <avatar_list
+ color="DkGray2"
+ follows="all"
+ height="130"
+ ignore_online_status="true"
+ layout="topleft"
+ name="speakers_list"
+ opaque="false"
+ show_info_btn="false"
+ show_profile_btn="false"
+ show_speaking_indicator="false"
+ width="147" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="130"
+ name="call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="20"
+ label="Call"
+ name="call_btn"
+ width="130"
+ top="5" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="130"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="20"
+ label="Leave Call"
+ name="end_call_btn"
+ top="5"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="130"
+ name="voice_ctrls_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="20"
+ label="Voice Controls"
+ name="voice_ctrls_btn"
+ top="5"
+ use_ellipses="true" />
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 8aaa462aaf..1e2e74f882 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -7,6 +7,18 @@
name="avatar_list_item"
top="0"
width="320">
+ <!--
+ Strings used to localize last interaction time.
+ See last_interaction textbox below.
+ -->
+ <string name="FormatSeconds">[COUNT]s</string>
+ <string name="FormatMinutes">[COUNT]m</string>
+ <string name="FormatHours">[COUNT]h</string>
+ <string name="FormatDays">[COUNT]d</string>
+ <string name="FormatWeeks">[COUNT]w</string>
+ <string name="FormatMonths">[COUNT]mon</string>
+ <string name="FormatYears">[COUNT]y</string>
+
<icon
follows="top|right|left"
height="24"
@@ -30,7 +42,7 @@
<avatar_icon
follows="top|left"
height="20"
- image_name="smile.png"
+ default_icon_name="Generic_Person"
layout="topleft"
left="5"
mouse_opaque="true"
@@ -39,7 +51,6 @@
<text
follows="left|right"
font="SansSerifSmall"
- font.style="BOLD"
height="15"
layout="topleft"
left_pad="5"
@@ -47,50 +58,50 @@
top="6"
use_ellipses="true"
value="Unknown"
- width="196" />
+ width="180" />
<text
follows="right"
font="SansSerifSmall"
height="15"
layout="topleft"
- left_pad="10"
+ left_pad="5"
+ right="-72"
name="last_interaction"
text_color="LtGray_50"
value="0s"
width="24" />
- <output_monitor
- auto_update="true"
- follows="right"
- draw_border="false"
- height="16"
- layout="topleft"
- left_pad="0"
- mouse_opaque="true"
- name="speaking_indicator"
- visible="true"
- width="20" />
- <button
+ <button
follows="right"
height="16"
image_pressed="Info_Press"
- image_hover="Info_Over"
- image_unselected="Info_Off"
+ image_unselected="Info_Over"
layout="topleft"
left_pad="3"
- right="-25"
+ right="-53"
name="info_btn"
- picture_style="true"
+ top_delta="-2"
width="16" />
<button
follows="right"
- height="16"
- image_selected="BuyArrow_Press"
- image_pressed="BuyArrow_Press"
- image_unselected="BuyArrow_Press"
+ height="20"
+ image_overlay="ForwardArrow_Off"
layout="topleft"
left_pad="5"
- right="-5"
+ right="-28"
name="profile_btn"
- picture_style="true"
- width="16" />
+ tool_tip="View profile"
+ top_delta="-2"
+ width="20" />
+ <output_monitor
+ auto_update="true"
+ follows="right"
+ draw_border="false"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ right="-3"
+ mouse_opaque="true"
+ name="speaking_indicator"
+ visible="true"
+ width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
index e4f6e7bd44..b779b08a63 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
@@ -4,67 +4,63 @@
top="10"
width="250"
height="100"
- background_opaque="false"
- background_visible="true"
- follows="left|top|bottom|right"
- bg_alpha_color="0.3 0.3 0.3 1.0">
- <panel
- width="250"
- height="30"
- background_visible="true"
- background_opaque="false"
+ follows="all">
+ <panel
+ width="240"
+ height="24"
+ left="5"
+ background_visible="true"
+ background_opaque="false"
follows="left|top|right"
- bg_alpha_color="0.0 0.0 0.0 1.0"
+ top="-5"
+ bg_alpha_color="black"
name="msg_caption">
- <avatar_icon
- top="-7"
- left="10"
- width="20"
- height="20"
+ <avatar_icon
+ top="-3"
+ left="3"
+ width="18"
+ image_name="Generic_Person"
+ height="18"
follows="left|top"
- color="1 1 1 1"
- enabled="true"
- name="avatar_tag_icon"/>
+ enabled="true"
+ name="avatar_tag_icon" />
<text
- width="160"
- top="-10"
- left="40"
- height="20"
+ width="160"
+ top="-8"
+ left="30"
+ height="20"
follows="left|right|top"
- font="SansSerifBigBold"
- text_color="white"
+ font.style="BOLD"
+ text_color="white"
word_wrap="true"
- mouse_opaque="true"
- name="sender_tag_name" >
+ mouse_opaque="true"
+ name="sender_tag_name">
Angela Tester
</text>
- <text
- width="30"
- top="-12"
- left="210"
- height="20"
- follows="right|top"
- text_color="white"
- word_wrap="true"
- mouse_opaque="true"
- name="tag_time" >
- 07:52
- </text>
+ <text
+ font="SansSerifSmall"
+ follows="right"
+ height="13"
+ layout="topleft"
+ halign="right"
+ right="-5"
+ name="tag_time"
+ top="8"
+ value="23:30"
+ width="50" />
</panel>
- <text_editor
- top="65"
- left="10"
- right="-10"
- can_resize="true"
- height="100"
- follows="left|top|bottom|right"
- font="SansSerifSmall"
+ <text_editor
+ bg_readonly_color="DkGray"
+ font="SansSerifSmall"
+ top="65"
+ left="5"
+ right="-5"
+ height="100"
+ follows="all"
read_only="true"
- bg_readonly_color="0 0 0 0"
word_wrap="true"
- mouse_opaque="true"
- name="msg_text" >
+ mouse_opaque="true"
+ name="msg_text">
The quick brown fox jumps over the lazy dog.
</text_editor>
</panel>
-
diff --git a/indra/newview/skins/default/xui/en/panel_bars.xml b/indra/newview/skins/default/xui/en/panel_bars.xml
index 9c06329eaf..96722ce278 100644
--- a/indra/newview/skins/default/xui/en/panel_bars.xml
+++ b/indra/newview/skins/default/xui/en/panel_bars.xml
@@ -5,65 +5,14 @@
layout="topleft"
left="0"
mouse_opaque="false"
- name="bottom_panel"
+ name="screen"
width="1024">
- <panel
- follows="left|right|top|bottom"
- height="728"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="status"
- top="0"
- width="1024" />
- <layout_stack
- border_size="0"
- follows="left|right|bottom|top"
- height="768"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="bar_stack"
- top_delta="0"
- use_bounding_rect="true"
- width="1024">
- <layout_panel
- follows="left|right|top|bottom"
- height="768"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="spacer"
- top="0"
- user_resize="false"
- width="1024" />
- <layout_panel
- auto_resize="false"
- height="200"
- layout="topleft"
- min_height="200"
- mouse_opaque="false"
- name="overlay"
- use_bounding_rect="true"
- user_resize="false"
- width="1024" />
- <layout_panel
- auto_resize="false"
- filename="panel_toolbar.xml"
- layout="topleft"
- min_height="28"
- name="toolbar"
- use_bounding_rect="true"
- user_resize="false"
- width="1024" />
+ <layout_stack name="menu_stack" orientation="vertical" height="768" border_size="0">
+ <panel auto_resize="false" width="1024" name="status_bar" filename="panel_status_bar.xml"/>
+ <panel auto_resize="false" width="1024" height="60" name="navigation bar" filename="panel_navigation_bar.xml"/>
+ <layout_stack name="hud_stack" orientation="horizontal" auto_resize="true" width="1024" height="500" follows="all">
+ <panel auto_resize="true" name="floater_view" height="500"/>
+ <panel auto_resize="false" filename="panel_side_tray.xml" height="500" width="333"/>
</layout_stack>
- <panel
- follows="left|right|top|bottom"
- height="728"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="hud"
- top_delta="-10"
- width="1024" />
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 5c8a8ee208..072ea882e6 100644
--- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
@@ -5,49 +5,49 @@
height="305"
layout="topleft"
name="block_list_panel"
+ help_topic="blocked_list"
min_height="350"
min_width="240"
width="280">
- <text
+ <button
+ follows="top|left"
+ height="25"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ name="back"
+ left="10"
+ tab_stop="false"
+ top="0"
+ width="25"/>
+ <text
follows="top|left|right"
- font="SansSerifHugeBold"
+ font="SansSerifLargeBold"
height="20"
layout="topleft"
- left="10"
+ left_pad="10"
name="title_text"
text_color="white"
- top="0"
+ top="5"
width="250">
- Blocked List
+ Block List
</text>
- <button
- follows="top|right"
- height="25"
- image_overlay="BackArrow_Off"
- layout="topleft"
- name="back"
- right="-9"
- tab_stop="false"
- top="0"
- width="25"/>
<scroll_list
- follows="left|top|right|bottom"
- height="200"
+ follows="all"
+ height="190"
layout="topleft"
left="5"
name="blocked"
- tool_tip="List of currently blocked residents"
+ tool_tip="List of currently blocked Residents"
top="30"
width="270" />
<button
follows="left|bottom"
- height="20"
- label="Block Resident..."
- label_selected="Block Resident..."
+ height="23"
+ label="Block person"
layout="topleft"
left_delta="0"
name="Block resident..."
- tool_tip="Pick a resident to block"
+ tool_tip="Pick a Resident to block"
top_pad="4"
width="210">
<button.commit_callback
@@ -55,12 +55,12 @@
</button>
<button
follows="left|bottom"
- height="20"
- label="Block object by name..."
- label_selected="Block object by name..."
+ height="23"
+ label="Block object by name"
layout="topleft"
left_delta="0"
name="Block object by name..."
+ tool_tip="Pick an object to block by name"
top_pad="4"
width="210" >
<button.commit_callback
@@ -69,13 +69,12 @@
<button
enabled="false"
follows="left|bottom"
- height="20"
+ height="23"
label="Unblock"
- label_selected="Unblock"
layout="topleft"
left_delta="0"
name="Unblock"
- tool_tip="Remove resident or object from blocked list"
+ tool_tip="Remove Resident or object from blocked list"
top_pad="4"
width="210" >
<button.commit_callback
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 9065c6b3e8..4c5d5a1b96 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -10,8 +10,11 @@
left="0"
name="bottom_tray"
top="28"
+ chrome="true"
border_visible="false"
width="1000">
+ <string name="SpeakBtnToolTip">Turns microphone on/off</string>
+ <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string>
<layout_stack
mouse_opaque="false"
border_size="0"
@@ -30,9 +33,10 @@
height="10"
image_name="spacer24.tga"
layout="topleft"
+ min_width="2"
left="0"
top="0"
- width="4" />
+ width="2" />
<layout_panel
mouse_opaque="false"
auto_resize="false"
@@ -42,11 +46,11 @@
left="0"
min_height="23"
width="310"
- top="0"
- min_width="300"
+ top="4"
+ min_width="216"
name="chat_bar"
user_resize="false"
- filename="panel_nearby_chat_bar.xml"/>
+ filename="panel_nearby_chat_bar.xml" />
<layout_panel
mouse_opaque="false"
auto_resize="false"
@@ -54,33 +58,44 @@
height="28"
layout="topleft"
min_height="28"
- width="96"
+ width="100"
top_delta="0"
- min_width="96"
+ min_width="100"
name="speak_panel"
user_resize="false">
- <chiclet_talk
- follows="right"
- height="23"
- speak_button.font="SansSerifMedium"
- speak_button.tab_stop="true"
- show_button.tab_stop="true"
- layout="topleft"
- left="0"
- name="talk"
- top="3"
- width="96" />
- </layout_panel>
- <icon
- auto_resize="false"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- name="DUMMY"
- top="0"
- width="4"/>
+ <talk_button
+ follows="left|right"
+ height="23"
+ speak_button.tab_stop="true"
+ show_button.tab_stop="true"
+ layout="topleft"
+ left="0"
+ name="talk"
+ top="5"
+ width="100">
+ <speak_button
+ name="speak_btn"
+ label="Speak"
+ label_selected="Speak"
+ />
+ <show_button>
+ <show_button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="voice_controls" />
+ </show_button>
+ </talk_button>
+ </layout_panel>
+ <icon
+ auto_resize="false"
+ follows="left|right"
+ height="10"
+ image_name="spacer24.tga"
+ layout="topleft"
+ left="0"
+ name="after_speak_panel"
+ min_width="3"
+ top="0"
+ width="3"/>
<layout_panel
mouse_opaque="false"
auto_resize="false"
@@ -88,21 +103,25 @@
height="28"
layout="topleft"
min_height="28"
- width="76"
+ width="82"
top_delta="0"
- min_width="76"
+ min_width="62"
name="gesture_panel"
user_resize="false">
- <button
- follows="right"
- height="23"
- label="Gesture"
- layout="topleft"
- name="Gesture"
- left="0"
- top="3"
- use_ellipses="true"
- width="76" />
+ <gesture_combo_list
+ follows="left|right"
+ height="23"
+ label="Gesture"
+ layout="topleft"
+ name="Gesture"
+ left="0"
+ top="5"
+ width="82"
+ tool_tip="Shows/hides gestures">
+ <gesture_combo_list.combo_button
+ pad_right="10"
+ use_ellipses="true" />
+ </gesture_combo_list>
</layout_panel>
<icon
auto_resize="false"
@@ -112,9 +131,10 @@
image_name="spacer24.tga"
layout="topleft"
left="0"
- name="DUMMY"
+ min_width="3"
+ name="after_gesture_panel"
top="0"
- width="4"/>
+ width="3"/>
<layout_panel
mouse_opaque="false"
auto_resize="false"
@@ -123,9 +143,13 @@
layout="topleft"
min_height="28"
name="movement_panel"
- width="76"
- min_width="76">
+ user_resize="false"
+ width="80"
+ min_width="49">
<button
+ image_selected="PushButton_Selected_Press"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
follows="left|right"
height="23"
use_ellipses="true"
@@ -133,9 +157,9 @@
label="Move"
layout="topleft"
name="movement_btn"
- tool_tip="Show/hide movement controls"
- top="3"
- width="76">
+ tool_tip="Shows/hides movement controls"
+ top="5"
+ width="80">
<button.init_callback
function="Button.SetDockableFloaterToggle"
parameter="moveview" />
@@ -149,9 +173,10 @@
image_name="spacer24.tga"
layout="topleft"
left="0"
- name="DUMMY"
+ min_width="3"
+ name="after_movement_panel"
top="0"
- width="4"/>
+ width="3"/>
<layout_panel
mouse_opaque="false"
auto_resize="false"
@@ -159,11 +184,14 @@
height="28"
layout="topleft"
min_height="28"
- min_width="76"
+ min_width="49"
name="cam_panel"
- top_delta="-10"
- width="100">
+ user_resize="false"
+ width="80">
<button
+ image_selected="PushButton_Selected_Press"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
follows="left|right"
height="23"
use_ellipses="true"
@@ -171,10 +199,10 @@
label="View"
layout="topleft"
left="0"
- tool_tip="Show/hide camera controls"
- top="3"
+ tool_tip="Shows/hides camera controls"
+ top="5"
name="camera_btn"
- width="76">
+ width="80">
<button.init_callback
function="Button.SetDockableFloaterToggle"
parameter="camera" />
@@ -188,61 +216,102 @@
image_name="spacer24.tga"
layout="topleft"
left="0"
- name="DUMMY"
+ min_width="3"
+ name="after_cam_panel"
top="0"
- width="4"/>
+ width="3"/>
<layout_panel
mouse_opaque="false"
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
+ min_width="40"
name="snapshot_panel"
- width="35">
- <split_button
- arrow_position="right"
- follows="left|right"
+ width="40">
+ <button
+ follows="left|right"
height="23"
+ image_selected="PushButton_Selected_Press"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
left="0"
+ label=""
layout="topleft"
name="snapshots"
- width="46"
- top="3">
- <split_button.item
- image_overlay="Snapshot_Off"
- name="snapshot"
- tool_tip="Take snapshot"
- />
- <split_button.arrow_button
- name="snapshot_settings"
- image_overlay="Widget_UpArrow"
- tool_tip="Snapshot and Preset Views"
- width="18"
- />
- </split_button>
- </layout_panel>
+ width="36"
+ top="5"
+ is_toggle="true"
+ image_overlay="Snapshot_Off"
+ tool_tip="Take snapshot">
+ <button.init_callback
+ function="Button.SetFloaterToggle"
+ parameter="snapshot" />
+ </button>
+ </layout_panel>
<layout_panel
mouse_opaque="false"
follows="left|right"
- height="28"
+ height="30"
layout="topleft"
top="0"
name="chiclet_list_panel"
width="189"
- min_width="189"
+ min_width="60"
user_resize="false"
auto_resize="true">
+<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
+as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
<chiclet_panel
mouse_opaque="false"
follows="left|right"
- height="28"
+ height="24"
layout="topleft"
- left="0"
+ left="1"
+ min_width="60"
name="chiclet_list"
- top="0"
- chiclet_padding="3"
+ top="7"
+ chiclet_padding="4"
scrolling_offset="40"
- width="189" />
+ width="189">
+ <button
+ auto_resize="true"
+ follows="right"
+ height="29"
+ image_selected="SegmentedBtn_Left_Off"
+ image_unselected="SegmentedBtn_Left_Off"
+ image_hover_selected="SegmentedBtn_Left_Over"
+ image_hover_unselected="SegmentedBtn_Left_Over"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Press"
+ image_overlay="Arrow_Small_Left"
+ layout="topleft"
+ name="chicklet_left_scroll_button"
+ scale_image="true"
+ tab_stop="false"
+ top="-4"
+ right_pad="2"
+ visible="false"
+ width="7" />
+ <button
+ auto_resize="true"
+ follows="right"
+ height="29"
+ image_selected="SegmentedBtn_Right_Off"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_hover_selected="SegmentedBtn_Right_Over"
+ image_hover_unselected="SegmentedBtn_Right_Over"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Press"
+ image_overlay="Arrow_Small_Right"
+ layout="topleft"
+ name="chicklet_right_scroll_button"
+ scale_image="true"
+ tab_stop="false"
+ top="-4"
+ visible="false"
+ width="7" />
+ </chiclet_panel>
</layout_panel>
<icon
auto_resize="false"
@@ -252,6 +321,8 @@
image_name="spacer24.tga"
layout="topleft"
left="0"
+ min_width="4"
+ name="DUMMY"
top="0"
width="5"/>
<layout_panel
@@ -261,35 +332,103 @@
layout="topleft"
min_height="28"
top="0"
- name="sys_well_panel"
- width="34"
- min_width="34"
+ name="im_well_panel"
+ width="35"
+ min_width="35"
user_resize="false">
+ <chiclet_im_well
+ max_displayed_count="99"
+ flash_period="0.3"
+ follows="right"
+ height="28"
+ layout="topleft"
+ left="0"
+ name="im_well"
+ top="0"
+ width="35">
+ <!--
+Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
+xml attribute Description
+image_unselected "Unlit" - there are no new messages
+image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed "Lit" - there are new messages
+image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ -->
+ <button
+ auto_resize="true"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Unread_IM"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread IM messages"
+ tool_tip="Conversations"
+ width="34" >
+ <button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="im_well_window" />
+ </button>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ top="0"
+ left_pad="3"
+ name="notification_well_panel"
+ width="40"
+ min_width="40"
+ user_resize="false">
+ <icon
+ auto_resize="false"
+ color="0 0 0 0"
+ follows="left|right"
+ height="10"
+ image_name="spacer24.tga"
+ layout="topleft"
+ left="0"
+ min_width="4"
+ top="0"
+ width="5" />
<chiclet_notification
+ flash_period="0.25"
follows="right"
- height="25"
+ height="23"
layout="topleft"
left="0"
- name="sys_well"
- top="3"
- width="34">
+ max_displayed_count="99"
+ name="notification_well"
+ top="5"
+ width="35">
<button
+ bottom_pad="3"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
auto_resize="true"
- halign="right"
+ halign="center"
height="23"
follows="right"
- flash_color="EmphasisColor"
+ label_color="Black"
+ left="0"
name="Unread"
- picture_style="true"
- image_overlay="Widget_UpArrow" />
- <unread_notifications
- width="34"
- height="23"
- left="22"
- top="23" />
- </chiclet_notification>
- </layout_panel>
- <icon
+ image_overlay="Notices_Unread"
+ image_overlay_alignment="center"
+ tool_tip="Notifications"
+ width="34" >
+ <button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="notification_well_window" />
+ </button>
+ <icon
auto_resize="false"
color="0 0 0 0"
follows="left|right"
@@ -297,7 +436,10 @@
image_name="spacer24.tga"
layout="topleft"
left="0"
+ min_width="4"
top="0"
- width="10"/>
+ width="5" />
+ </chiclet_notification>
+ </layout_panel>
</layout_stack>
-</panel> \ No newline at end of file
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..6e9476f814
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ default_tab_group="2"
+ mouse_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ follows="left|bottom|right"
+ height="33"
+ layout="topleft"
+ left="0"
+ name="bottom_tray_lite"
+ tab_stop="true"
+ top="28"
+ chrome="true"
+ border_visible="false"
+ visible="false"
+ width="1000">
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="28"
+ layout="topleft"
+ left="0"
+ name="toolbar_stack_lite"
+ orientation="horizontal"
+ top="0"
+ width="1000">
+ <icon
+ auto_resize="false"
+ follows="left|right"
+ height="10"
+ image_name="spacer24.tga"
+ layout="topleft"
+ min_width="2"
+ left="0"
+ top="0"
+ width="2" />
+ <layout_panel
+ mouse_opaque="false"
+ auto_resize="true"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ left="0"
+ min_height="23"
+ width="310"
+ top="4"
+ min_width="188"
+ name="chat_bar"
+ user_resize="false"
+ filename="panel_nearby_chat_bar.xml" />
+ <layout_panel
+ mouse_opaque="false"
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="82"
+ top_delta="0"
+ min_width="52"
+ name="gesture_panel"
+ user_resize="false">
+ <gesture_combo_list
+ follows="left|right"
+ height="23"
+ label="Gesture"
+ layout="topleft"
+ name="Gesture"
+ left="0"
+ top="5"
+ width="82"
+ tool_tip="Shows/hides gestures">
+ <gesture_combo_list.combo_button
+ pad_right="10"
+ use_ellipses="true" />
+ </gesture_combo_list>
+ </layout_panel>
+ <icon
+ auto_resize="false"
+ color="0 0 0 0"
+ follows="left|right"
+ height="10"
+ image_name="spacer24.tga"
+ layout="topleft"
+ left="0"
+ min_width="3"
+ name="after_gesture_panel"
+ top="0"
+ width="3"/>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index a9f622e018..250dadd390 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -1,53 +1,52 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="left|top|right"
- height="57"
- label="im_header_container"
- layout="topleft"
- left="8"
- name="im_header_container">
- <panel
- background_visible="true"
+ background_visible="true"
bevel_style="in"
- bg_alpha_color="black"
- follows="left|top|right"
- height="30"
+ bg_opaque_color="Black"
+ bg_alpha_color="DkGray_66"
+ follows="top|left|right"
+ height="24"
label="im_header"
- layout="topleft"
+ layout="topleft"
name="im_header"
- top_pad="17">
- <avatar_icon
+ width="310">
+ <avatar_icon
follows="left"
- height="20"
- image_name="icon_avatar_online.tga"
+ height="18"
+ image_name="Generic_Person"
layout="topleft"
- left="5"
+ left="3"
mouse_opaque="true"
name="avatar_icon"
- top="5"
- width="20" />
- <text
- follows="left|right"
- font="SansSerifBigBold"
- height="20"
- layout="topleft"
- left_pad="10"
- right="-50"
- name="user_name"
- text_color="white"
- top="5"
- value="Darth Vader"
- use_ellipses="true" />
- <text
+ top="3"
+ width="18" />
+ <text
+ allow_scroll="false"
+ v_pad = "7"
+ read_only = "true"
+ follows="left|right"
+ font.style="BOLD"
+ height="24"
+ layout="topleft"
+ left_pad="5"
+ right="-120"
+ name="user_name"
+ text_color="white"
+ bg_readonly_color="black"
+ top="0"
+ use_ellipses="true"
+ valign="bottom"
+ value="Ericag Vader" />
+ <text
+ font="SansSerifSmall"
follows="right"
- font="SansSerifBig"
- height="20"
+ halign="right"
+ height="13"
layout="topleft"
- name="time_box"
- right="0"
- text_color="white"
- top="5"
+ left_pad="5"
+ name="time_box"
+ right="-5"
+ top="8"
value="23:30"
- width="50" />
- </panel>
+ width="110" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 78f53562cd..34c6e02684 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -1,38 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- All our XML is utf-8 encoded. -->
-
<panel
name="instant_message"
- width="300"
+ width="315"
height="180"
- background_opaque="false"
- background_visible="true"
- follows="left|top|right|bottom"
- bg_alpha_color="0.3 0.3 0.3 1.0">
- <panel width="250" height="30" background_visible="true" background_opaque="false" bg_alpha_color="0.0 0.0 0.0 1.0" name="msg_caption">
- <avatar_icon
- top="25" left="10" width="20" height="20" follows="left|top"
- color="1 1 1 1" enabled="true" name="avatar_icon"
- />
- <text
- width="130" top="25" left="40" height="20" follows="left|right|top"
- font="SansSerifBigBold" text_color="white" word_wrap="false" use_ellipses="true"
- mouse_opaque="true" name="sender_name" >
- Jerry Knight
- </text>
- <icon top="22" left="170" width="15" height="15" follows="top|right"
- image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector"/>
- <icon top="22" left="190" width="10" height="10" follows="top|right"
- image_name="speaking_indicator.tga" name="msg_icon"/>
- <text width="35" top="22" left="205" height="20" follows="right|top"
- text_color="white" word_wrap="true" mouse_opaque="true" name="msg_time" >
- 10:32
- </text>
- </panel>
+ follows="all">
+ <avatar_icon
+ follows="left|top"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="true"
+ name="avatar_icon"
+ top="3"
+ width="18" />
<text_chat
- top="-35" left="10" right="-10" height="120" follows="left|right|bottom"
- font="SansSerifSmall" text_color="white" word_wrap="true"
- mouse_opaque="true" name="msg_text" >
+ top="5"
+ left="30"
+ height="120"
+ text_color="white"
+ word_wrap="true"
+ mouse_opaque="true"
+ name="msg_text">
</text_chat>
</panel>
-
diff --git a/indra/newview/skins/default/xui/en/panel_chat_separator.xml b/indra/newview/skins/default/xui/en/panel_chat_separator.xml
index bacc750e86..357dbc07cc 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_separator.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_separator.xml
@@ -1,16 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
+ bg_alpha_color="black"
follows="left|right|top"
- height="9"
+ height="0"
layout="topleft"
- left="8"
- name="chat_separator_container">
- <panel
- background_visible="true"
- bg_alpha_color="black"
- follows="left|right|top"
- height="1"
- layout="topleft"
- name="chat_separator_panel"
- top_pad="3" />
-</panel>
+ name="chat_separator_panel" />
diff --git a/indra/newview/skins/default/xui/en/panel_classified.xml b/indra/newview/skins/default/xui/en/panel_classified.xml
index 18d12aef70..c8293d3663 100644
--- a/indra/newview/skins/default/xui/en/panel_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified.xml
@@ -107,15 +107,15 @@
top="48"
width="130">
<combo_box.item
- label="- Select Mature -"
+ label="- Select one -"
name="select_mature"
value="Select" />
<combo_box.item
- label="Mature Content"
+ label="Moderate Content"
name="mature"
value="Mature" />
<combo_box.item
- label="PG Content"
+ label="General Content"
name="pg"
value="PG" />
</combo_box>
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
new file mode 100644
index 0000000000..34c1923582
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_classified_info"
+ help_topic="profile_classified_info"
+ top="0"
+ width="333">
+ <panel.string
+ name="type_mature">
+ Moderate
+ </panel.string>
+ <panel.string
+ name="type_pg">
+ General Content
+ </panel.string>
+ <panel.string
+ name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ name="back_btn"
+ picture_style="true"
+ left="11"
+ tab_stop="false"
+ top="2"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ value="Classified Info"
+ use_ellipses="true"
+ width="275" />
+ <scroll_container
+ color="DkGray2"
+ opaque="true"
+ follows="all"
+ height="502"
+ layout="topleft"
+ left="9"
+ top_pad="10"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ width="310">
+ <panel
+ name="scroll_content_panel"
+ follows="left|top"
+ min_height="300"
+ layout="topleft"
+ top="0"
+ background_visible="false"
+ height="500"
+ left="0"
+ width="285">
+ <texture_picker
+ enabled="false"
+ follows="left|top|right"
+ height="197"
+ layout="topleft"
+ left="11"
+ name="classified_snapshot"
+ top="10"
+ width="286" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="35"
+ width="290"
+ layout="topleft"
+ font="SansSerifBig"
+ font.style="BOLD"
+ left="10"
+ top_pad="10"
+ name="classified_name"
+ read_only="true"
+ text_color="white"
+ v_pad="0"
+ value="[name]"
+ use_ellipses="true" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ height="25"
+ layout="topleft"
+ left="10"
+ name="classified_location"
+ read_only="true"
+ width="290"
+ word_wrap="true"
+ v_pad="0"
+ value="[loading...]" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="18"
+ layout="topleft"
+ left="10"
+ name="content_type"
+ read_only="true"
+ width="290"
+ top_pad="5"
+ v_pad="0"
+ value="[content type]" />
+ <text_editor
+ allow_html="true"
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="18"
+ layout="topleft"
+ left="10"
+ name="category"
+ read_only="true"
+ width="290"
+ top_pad="5"
+ v_pad="0"
+ value="[category]" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="Auto renew each week"
+ layout="topleft"
+ left="10"
+ name="auto_renew"
+ top_pad="5"
+ v_pad="0"
+ width="290" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ halign="left"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="price_for_listing"
+ read_only="true"
+ top_pad="5"
+ tool_tip="Price for listing."
+ v_pad="0"
+ width="105" />
+ <text_editor
+ allow_html="true"
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="200"
+ layout="topleft"
+ left="10"
+ max_length="1023"
+ name="classified_desc"
+ read_only="true"
+ width="290"
+ v_pad="0"
+ value="[description]"
+ word_wrap="true" />
+ </panel>
+ </scroll_container>
+ <panel
+ follows="left|right|bottom"
+ height="35"
+ layout="topleft"
+ top_pad="5"
+ left="9"
+ name="buttons">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="0"
+ name="teleport_btn"
+ top="0"
+ width="101" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left_pad="3"
+ name="show_on_map_btn"
+ width="100" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Edit"
+ layout="topleft"
+ name="edit_btn"
+ left_pad="3"
+ width="101" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
new file mode 100644
index 0000000000..1375eb87d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="top|left|right"
+ height="85"
+ layout="topleft"
+ left="0"
+ name="classified_item"
+ top="0"
+ width="313">
+ <icon
+ follows="all"
+ height="85"
+ image_name="ListItem_Over"
+ right="-2"
+ mouse_opaque="false"
+ name="hovered_icon"
+ top="1"
+ scale_image="true"
+ visible="false"
+ width="308"/>
+ <icon
+ follows="all"
+ height="85"
+ image_name="ListItem_Select"
+ right="-2"
+ mouse_opaque="false"
+ name="selected_icon"
+ top="1"
+ scale_image="true"
+ visible="false"
+ width="308"/>
+ <texture_picker
+ allow_no_texture="true"
+ border_enabled="true"
+ default_image_name="TabIcon_Places_Large"
+ enabled="false"
+ follows="left|top"
+ height="80"
+ layout="topleft"
+ left="10"
+ mouse_opaque="false"
+ name="picture"
+ tab_stop="false"
+ top="10"
+ top_pad="10"
+ width="90" />
+ <text
+ follows="top|left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="name"
+ text_color="white"
+ top="9"
+ use_ellipses="true"
+ width="193"
+ word_wrap="false" />
+ <expandable_text
+ follows="top|left|right"
+ font="SansSerifSmall"
+ height="55"
+ layout="topleft"
+ left="103"
+ name="description"
+ textbox.show_context_menu="false"
+ top_pad="0"
+ width="178"
+ word_wrap="true" />
+ <button
+ follows="right"
+ height="20"
+ image_overlay="ForwardArrow_Off"
+ layout="topleft"
+ left_pad="5"
+ right="-8"
+ name="info_chevron"
+ top_delta="24"
+ width="20" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
new file mode 100644
index 0000000000..d31e7d2ed8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ follows="left|top|right|bottom"
+ height="569"
+ label="Edit Classified"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_edit_classified"
+ help_topic="profile_edit_classified"
+ top="0"
+ width="333">
+ <panel.string
+ name="location_notice">
+ (will update after save)
+ </panel.string>
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ name="back_btn"
+ picture_style="true"
+ left="12"
+ tab_stop="false"
+ top="2"
+ width="23" />
+ <text
+ type="string"
+ length="1"
+ follows="top"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ width="250">
+ Edit Classified
+ </text>
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="502"
+ layout="topleft"
+ left="8"
+ top_pad="10"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ opaque="true"
+ width="312">
+ <panel
+ name="scroll_content_panel"
+ follows="left|top"
+ min_height="300"
+ layout="topleft"
+ top="0"
+ background_visible="false"
+ height="600"
+ left="0"
+ width="285">
+ <texture_picker
+ follows="left|top|right"
+ height="197"
+ width="272"
+ layout="topleft"
+ top="10"
+ left="11"
+ name="classified_snapshot" />
+ <icon
+ height="197"
+ image_name="spacer24.tga"
+ layout="topleft"
+ name="edit_icon"
+ label=""
+ tool_tip="Click to select an image"
+ top="10"
+ left="11"
+ width="286" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ font="SansSerifSmall"
+ font.style="BOLD"
+ layout="topleft"
+ left="10"
+ top="215"
+ name="Name:"
+ text_color="white"
+ width="280">
+ Title:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="10"
+ top_pad="2"
+ max_length="63"
+ name="classified_name"
+ prevalidate_callback="ascii"
+ text_color="black"
+ width="273" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ font="SansSerifSmall"
+ font.style="BOLD"
+ layout="topleft"
+ left="10"
+ top_pad="20"
+ name="description_label"
+ text_color="white"
+ width="280">
+ Description:
+ </text>
+ <text_editor
+ follows="left|top|right"
+ height="100"
+ width="273"
+ hide_scrollbar="false"
+ layout="topleft"
+ left="10"
+ top_pad="2"
+ max_length="1023"
+ name="classified_desc"
+ text_color="black"
+ word_wrap="true" />
+ <text
+ type="string"
+ length="1"
+ font="SansSerifSmall"
+ font.style="BOLD"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="location_label"
+ text_color="white"
+ top_pad="20"
+ width="280">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="50"
+ layout="topleft"
+ left="10"
+ name="classified_location"
+ right="-10"
+ top_pad="2"
+ width="280"
+ word_wrap="true">
+ loading...
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Set to Current Location"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="set_to_curr_location_btn"
+ width="156" />
+ <combo_box
+ follows="left|top"
+ height="23"
+ label=""
+ left="10"
+ name="category"
+ top_pad="5"
+ width="156" />
+ <combo_box
+ allow_text_entry="false"
+ follows="left|top"
+ height="23"
+ left="10"
+ name="content_type"
+ top_pad="5"
+ width="156">
+ <combo_item
+ name="mature_ci"
+ value="Mature">
+ Moderate Content
+ </combo_item>
+ <combo_item
+ name="pg_ci"
+ value="PG">
+ General Content
+ </combo_item>
+ </combo_box>
+ <spinner
+ decimal_digits="0"
+ follows="left|top"
+ halign="left"
+ height="23"
+ increment="1"
+ label_width="20"
+ label="L$"
+ v_pad="10"
+ layout="topleft"
+ left="10"
+ value="50"
+ min_val="50"
+ max_val="99999"
+ name="price_for_listing"
+ top_pad="5"
+ tool_tip="Price for listing."
+ width="105" />
+ <check_box
+ height="16"
+ label="Auto renew each week"
+ layout="topleft"
+ left="10"
+ name="auto_renew"
+ top_pad="5"
+ width="250" />
+ </panel>
+ </scroll_container>
+ <panel
+ follows="left|right|bottom"
+ height="23"
+ label="bottom_panel"
+ layout="topleft"
+ left="8"
+ name="bottom_panel"
+ top_pad="5"
+ width="303">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Save"
+ layout="topleft"
+ name="save_changes_btn"
+ left="0"
+ top="0"
+ width="152" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ left_pad="3"
+ width="153" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
index 9789da5796..c514054c41 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
@@ -37,13 +37,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="eyes_main_tab"
title="Eyes">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="eyes_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
index 517cdd75fb..7aca40e8d9 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="gloves_main_tab"
title="Gloves">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="gloves_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
index d2ee2ebf2a..e7d1c05301 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
@@ -37,13 +37,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="hair_color_tab"
title="Color">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="hair_color_param_list"
@@ -51,13 +49,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="hair_style_tab"
title="Style">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="hair_style_param_list"
@@ -65,13 +61,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="hair_eyebrows_tab"
title="Eyebrows">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="hair_eyebrows_param_list"
@@ -79,13 +73,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="hair_facial_tab"
title="Facial">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="hair_facial_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
index 0b54944e29..ed92b1e0f8 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -41,7 +41,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -61,13 +60,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="jacket_main_tab"
title="Jacket">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="jacket_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
index 939314f9f9..b764188e04 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="pants_main_tab"
title="Pants">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="pants_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index bac6f6e4d1..657e369beb 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -3,12 +3,13 @@
background_visible="true"
bevel_style="in"
follows="left|top|right|bottom"
- height="570"
+ height="569"
label="Edit Pick"
layout="topleft"
left="0"
min_height="350"
name="panel_edit_pick"
+ help_topic="profile_edit_pick"
top="0"
width="333">
<button
@@ -17,8 +18,7 @@
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
- picture_style="true"
- left="10"
+ left="12"
tab_stop="false"
top="2"
width="23" />
@@ -26,59 +26,59 @@
type="string"
length="1"
follows="top"
- font="SansSerifHuge"
- height="15"
+ font="SansSerifHugeBold"
+ height="26"
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
- top="5"
+ text_color="LtGray"
+ top="0"
width="250">
Edit Pick
</text>
<scroll_container
color="DkGray2"
follows="all"
- height="510"
+ height="502"
layout="topleft"
- left="10"
+ left="8"
top_pad="10"
name="profile_scroll"
- reserve_scroll_corner="false"
opaque="true"
- width="313">
+ width="312">
<panel
name="scroll_content_panel"
- follows="left|top"
+ follows="left|top|right"
min_height="300"
layout="topleft"
top="0"
background_visible="false"
- height="470"
+ height="500"
left="0"
- width="295">
+ width="285">
<texture_picker
follows="left|top|right"
height="197"
- width="290"
+ width="272"
layout="topleft"
- top="20"
- left="10"
+ no_commit_on_selection="true"
+ top="10"
+ left="11"
name="pick_snapshot" />
- <button
- height="18"
- image_overlay="AddItem_Off"
+ <icon
+ height="197"
+ image_name="spacer24.tga"
layout="topleft"
- right="-5"
name="edit_icon"
label=""
tool_tip="Click to select an image"
- top="27"
- width="18" />
+ top="10"
+ left="11"
+ width="286" />
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|top|right"
height="15"
font="SansSerifSmall"
font.style="BOLD"
@@ -87,7 +87,7 @@
top="215"
name="Name:"
text_color="white"
- width="290">
+ width="280">
Title:
</text>
<line_editor
@@ -100,11 +100,11 @@
max_length="63"
name="pick_name"
text_color="black"
- width="290" />
+ width="273" />
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|top|right"
height="15"
font="SansSerifSmall"
font.style="BOLD"
@@ -113,13 +113,13 @@
top_pad="20"
name="description_label"
text_color="white"
- width="290">
+ width="280">
Description:
</text>
<text_editor
follows="left|top|right"
height="100"
- width="290"
+ width="273"
hide_scrollbar="false"
layout="topleft"
left="10"
@@ -133,67 +133,65 @@
length="1"
font="SansSerifSmall"
font.style="BOLD"
- follows="left|top"
+ follows="left|top|right"
height="15"
layout="topleft"
left="10"
name="location_label"
text_color="white"
top_pad="20"
- width="290">
+ width="280">
Location:
</text>
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|top|right"
height="50"
layout="topleft"
left="10"
name="pick_location"
- right="-10"
top_pad="2"
- width="290"
+ width="280"
word_wrap="true">
loading...
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Set to Current Location"
layout="topleft"
left="8"
top_pad="0"
name="set_to_curr_location_btn"
- width="200" />
+ width="156" />
</panel>
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="23"
label="bottom_panel"
layout="topleft"
- left="10"
+ left="8"
name="bottom_panel"
top_pad="5"
width="303">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Save [WHAT]"
layout="topleft"
name="save_changes_btn"
left="0"
top="0"
- width="130" />
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- left_pad="5"
- right="-1"
- width="130" />
+ left_pad="3"
+ width="153" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index b002034a08..26be8440e7 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -15,6 +15,10 @@
[ACCTTYPE]
[PAYMENTINFO] [AGEVERIFICATION]
</string>
+ <string
+ name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
<string
name="AcctTypeResident"
value="Resident" />
@@ -47,37 +51,42 @@
http://www.secondlife.com/account/partners.php?lang=en
</string>
<string
+ name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string
name="no_partner_text"
value="None" />
<scroll_container
color="DkGray2"
follows="all"
- height="505"
+ height="494"
min_height="300"
layout="topleft"
- left="0"
+ left="8"
+ width="292"
name="profile_scroll"
reserve_scroll_corner="true"
opaque="true"
- top="0">
+ top="10">
<panel
name="scroll_content_panel"
follows="left|top|right"
layout="topleft"
top="0"
- height="505"
+ height="494"
min_height="300"
left="0"
- width="313">
+ width="292">
<panel
name="data_panel"
follows="left|top|right"
layout="topleft"
top="0"
- height="505"
+ height="494"
min_height="300"
left="0"
- width="313">
+ width="292">
<panel
name="lifes_images_panel"
follows="left|top|right"
@@ -85,7 +94,7 @@
layout="topleft"
top="0"
left="0"
- width="285">
+ width="292">
<panel
follows="left|top"
height="117"
@@ -93,51 +102,53 @@
left="10"
name="second_life_image_panel"
top="0"
- width="285">
+ width="282">
<text
follows="left|top|right"
font.style="BOLD"
height="15"
layout="topleft"
left="0"
+ top="10"
name="second_life_photo_title_text"
text_color="white"
value="[SECOND_LIFE]:"
- width="170" />
+ width="100" />
<texture_picker
allow_no_texture="true"
default_image_name="None"
enabled="false"
follows="top|left"
- height="117"
+ height="124"
layout="topleft"
- left="0"
+ left="1"
name="2nd_life_pic"
top_pad="0"
width="102" />
</panel>
- <button
- height="18"
- image_overlay="AddItem_Off"
+ <icon
+ height="102"
+ image_name="spacer24.tga"
layout="topleft"
name="2nd_life_edit_icon"
label=""
- left="87"
+ left="11"
+ top_pad="-92"
tool_tip="Click to select an image"
- top="25"
- width="18" />
+ width="102" />
</panel>
<text_editor
type="string"
length="1"
follows="left|top|right"
font="SansSerifSmall"
- height="100"
+ height="102"
layout="topleft"
- left="120"
- top="18"
+ left="123"
+ top="25"
+ max_length="512"
name="sl_description_edit"
- width="173"
+ width="157"
word_wrap="true">
</text_editor>
<panel
@@ -154,43 +165,45 @@
height="15"
layout="topleft"
left="0"
+ top_pad="10"
name="real_world_photo_title_text"
text_color="white"
value="Real World:"
- width="173" />
+ width="100" />
<texture_picker
allow_no_texture="true"
default_image_name="None"
enabled="false"
follows="top|left"
- height="117"
+ height="124"
layout="topleft"
- left="0"
+ left="1"
name="real_world_pic"
top_pad="0"
width="102" />
</panel>
- <button
- height="18"
- image_overlay="AddItem_Off"
+ <icon
+ height="102"
+ image_name="spacer24.tga"
layout="topleft"
name="real_world_edit_icon"
label=""
- left="87"
+ left="11"
+ top_pad="-92"
tool_tip="Click to select an image"
- top="148"
- width="18" />
+ width="102" />
<text_editor
type="string"
length="1"
follows="left|top|right"
font="SansSerifSmall"
- height="100"
+ height="102"
layout="topleft"
- left="120"
- top="142"
+ left="123"
+ max_length="512"
+ top="157"
name="fl_description_edit"
- width="173"
+ width="157"
word_wrap="true">
</text_editor>
<text
@@ -205,7 +218,7 @@
name="title_homepage_text"
text_color="white"
top_pad="10"
- width="285">
+ width="100">
Homepage:
</text>
<line_editor
@@ -217,19 +230,19 @@
top_pad="0"
value="http://"
name="homepage_edit"
- width="285">
+ width="272">
</line_editor>
<check_box
follows="left|top"
font="SansSerifSmall"
label="Show me in Search results"
layout="topleft"
- left="10"
+ left="8"
name="show_in_search_checkbox"
height="15"
text_enabled_color="white"
- top_pad="10"
- width="240" />
+ top_pad="12"
+ width="100" />
<text
follows="left|top"
font="SansSerifSmall"
@@ -239,9 +252,24 @@
left="10"
name="title_acc_status_text"
text_color="white"
- top_pad="5"
+ top_pad="10"
value="My Account:"
- width="285" />
+ width="100" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
+ height="28"
+ layout="topleft"
+ left="10"
+ name="acc_status_text"
+ read_only="true"
+ top_pad="5"
+ v_pad="0"
+ value="Resident. No payment info on file."
+ width="200"
+ word_wrap="true" />
<text
type="string"
follows="left|top"
@@ -250,18 +278,8 @@
layout="topleft"
left="10"
name="my_account_link"
- value="Go to My Dashboard"
- width="285" />
- <text
- follows="left|top|right"
- height="20"
- layout="topleft"
- left="10"
- name="acc_status_text"
- top_pad="5"
- value="Resident. No payment info on file."
- width="285"
- word_wrap="true" />
+ value="[[URL] Go to My Dashboard]"
+ width="200" />
<text
follows="left|top"
font="SansSerifSmall"
@@ -271,64 +289,62 @@
left="10"
name="title_partner_text"
text_color="white"
- top_pad="0"
+ top_pad="10"
value="My Partner:"
width="150" />
- <text
- follows="left|top"
- height="15"
- halign="right"
- layout="topleft"
- left_pad="10"
- right="-10"
- name="partner_edit_link"
- value="[[URL] Edit]"
- width="150" />
<panel
follows="left|top|right"
height="15"
layout="topleft"
left="10"
name="partner_data_panel"
- width="285">
- <text
+ width="200">
+ <name_box
follows="left|top|right"
height="30"
+ initial_value="(retrieving)"
layout="topleft"
left="0"
+ link="true"
name="partner_text"
top="0"
- value="[FIRST] [LAST]"
- width="285"
+ width="200"
word_wrap="true" />
</panel>
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="partner_edit_link"
+ value="[[URL] Edit]"
+ width="50" />
</panel>
</panel>
</scroll_container>
<panel
follows="bottom|left"
- height="20"
- left="10"
+ height="28"
+ left="0"
name="profile_me_buttons_panel"
- top_pad="5"
- width="303">
+ top_pad="0"
+ width="313">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Save Changes"
layout="topleft"
- left="0"
+ left="8"
name="save_btn"
- top="0"
- width="130" />
+ top="5"
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="cancel_btn"
- right="-1"
- width="130" />
+ width="153" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
index a9dfcb82d6..45c4b92338 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -59,13 +59,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_body_tab"
title="Body">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_body_param_list"
@@ -73,13 +71,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_head_tab"
title="Head">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_head_param_list"
@@ -87,13 +83,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_eyes_tab"
title="Eyes">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_eyes_param_list"
@@ -101,13 +95,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_ears_tab"
title="Ears">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_ears_param_list"
@@ -115,13 +107,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_nose_tab"
title="Nose">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_nose_param_list"
@@ -129,13 +119,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_mouth_tab"
title="Mouth">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_mouth_param_list"
@@ -143,13 +131,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_chin_tab"
title="Chin">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_chin_param_list"
@@ -157,13 +143,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_torso_tab"
title="Torso">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_torso_param_list"
@@ -171,13 +155,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shape_legs_tab"
title="Legs">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shape_legs_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
index 258ee06697..4b7235545f 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shirt_main_tab"
title="Shirt">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shirt_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
index 22fced4aac..e886afa010 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="shoes_main_tab"
title="Shoes">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="shoes_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
index 1a00277f43..918606b54c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
@@ -64,13 +64,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="skin_color_tab"
title="Skin Color">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="skin_color_param_list"
@@ -78,13 +76,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="skin_face_tab"
title="Face Detail">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="skin_face_param_list"
@@ -92,13 +88,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="skin_makeup_tab"
title="Makeup">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="skin_makeup_param_list"
@@ -106,13 +100,11 @@
width="303" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="skin_body_tab"
title="Body Detail">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="skin_body_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
index 411d433604..6cccab1843 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="skirt_main_tab"
title="Skirt">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="skirt_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
index faff67795c..fc7de00714 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="socks_main_tab"
title="Socks">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="socks_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
index bb0b353a01..03e0bb70ef 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="underpants_main_tab"
title="Underpants">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="underpants_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
index 097cb14ee6..20c56142fb 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -49,13 +48,11 @@
top_pad="10"
width="303">
<accordion_tab
- can_resize="false"
layout="topleft"
min_height="150"
name="undershirt_main_tab"
title="Undershirt">
<scrolling_panel_list
- draw_heading="false"
follows="all"
left="0"
name="undershirt_main_param_list"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index 77b887de9b..f76a56bda4 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -137,7 +137,6 @@ left="0"
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
- picture_style="true"
left="10"
top="7" />
<text
diff --git a/indra/newview/skins/default/xui/en/panel_friends.xml b/indra/newview/skins/default/xui/en/panel_friends.xml
index 3a35465df2..c315adb33e 100644
--- a/indra/newview/skins/default/xui/en/panel_friends.xml
+++ b/indra/newview/skins/default/xui/en/panel_friends.xml
@@ -8,7 +8,7 @@
width="100">
<panel.string
name="Multiple">
- Multiple friends...
+ Multiple friends
</panel.string>
<scroll_list
bottom="337"
@@ -84,7 +84,7 @@
<button
follows="top|right"
height="22"
- label="Teleport..."
+ label="Teleport"
layout="topleft"
left_delta="0"
name="offer_teleport_btn"
@@ -94,7 +94,7 @@
<button
follows="top|right"
height="22"
- label="Pay..."
+ label="Pay"
layout="topleft"
left_delta="0"
name="pay_btn"
@@ -104,7 +104,7 @@
<button
follows="top|right"
height="22"
- label="Remove..."
+ label="Remove"
layout="topleft"
left_delta="0"
name="remove_btn"
@@ -114,11 +114,11 @@
<button
follows="top|right"
height="22"
- label="Add..."
+ label="Add"
layout="topleft"
left_delta="0"
name="add_btn"
- tool_tip="Offer friendship to a resident"
+ tool_tip="Offer friendship to a Resident"
top_pad="13"
width="80" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 15b6b2a00d..aa7d621e4c 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,35 +1,114 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ border="false"
+ follows="all"
+ height="238"
name="panel_im_control_panel"
- width="146"
- height="215"
- border="false">
- <avatar_list
- color="DkGray2"
- follows="left|top|right|bottom"
- height="130"
- ignore_online_status="true"
+ width="150">
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="238"
layout="topleft"
- left="3"
- name="speakers_list"
- opaque="false"
- top="10"
- width="140" />
- <button
- name="group_info_btn"
- label="Group Info"
- left_delta="3"
- width="90"
- height="20" />
- <button
- name="call_btn"
- label="Call"
- width="90"
- height="20" />
- <button
- name="end_call_btn"
- label="End Call"
- width="90"
- height="20"
- visible="false"/>
+ left="5"
+ name="vertical_stack"
+ orientation="vertical"
+ top="0"
+ width="145">
+ <layout_panel
+ auto_resize="true"
+ follows="top|left"
+ height="100"
+ layout="topleft"
+ min_height="0"
+ mouse_opaque="false"
+ width="145"
+ top="0"
+ name="speakers_list_panel"
+ user_resize="false">
+ <avatar_list
+ color="DkGray2"
+ follows="all"
+ height="100"
+ ignore_online_status="true"
+ layout="topleft"
+ name="speakers_list"
+ opaque="false"
+ show_info_btn="false"
+ show_profile_btn="false"
+ show_speaking_indicator="false"
+ width="145" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="group_info_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|right|bottom"
+ height="23"
+ label="Group Profile"
+ name="group_info_btn"
+ use_ellipses="true"
+ top="5"
+ width="130" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="call_btn_panel"
+ user_resize="false">
+ <button
+ follows="all"
+ height="23"
+ label="Call Group"
+ name="call_btn"
+ use_ellipses="true"
+ width="130" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="23"
+ label="Leave Call"
+ name="end_call_btn"
+ use_ellipses="true" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ width="130"
+ name="voice_ctrls_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="all"
+ height="23"
+ label="Open Voice Controls"
+ name="voice_ctrls_btn"
+ use_ellipses="true" />
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index a85c55f9b2..41e53be29e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,14 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="all"
- height="412"
label="General"
+ follows="all"
+ height="604"
+ width="303"
class="panel_group_general"
- layout="topleft"
- left="0"
- top="0"
- name="general_tab"
- width="313">
+ name="general_tab">
<panel.string
name="help_text">
The General tab contains general information about this group, a list of members, general Group Preferences and member options.
@@ -23,103 +20,199 @@ Hover your mouse over the options for more help.
name="incomplete_member_data_str">
Retrieving member data
</panel.string>
- <text_editor
+ <panel
+ name="group_info_top"
+ follows="top|left"
+ top="0"
+ left="0"
+ height="129"
+ width="313"
+ layout="topleft">
+ <texture_picker
+ follows="left|top"
+ height="110"
+ label=""
+ layout="topleft"
+ left="10"
+ name="insignia"
+ no_commit_on_selection="true"
+ tool_tip="Click to choose a picture"
+ top="5"
+ width="100" />
+ <text
+ font="SansSerifSmall"
+ text_color="White_50"
+ width="190"
+ follows="top|left"
+ layout="topleft"
+ mouse_opaque="false"
+ type="string"
+ height="16"
+ length="1"
+ left_pad="10"
+ name="prepend_founded_by"
+ top_delta="0">
+ Founder:
+ </text>
+ <name_box
+ follows="left|top"
+ height="16"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left_delta="0"
+ link="true"
+ name="founder_name"
+ top_pad="2"
+ use_ellipses="true"
+ width="190" />
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
type="string"
follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="join_cost_text"
+ top_pad="10"
+ visible="true"
+ width="190">
+ Free
+ </text>
+ <button
+ follows="left|top"
+ left_delta="0"
+ top_pad="6"
+ height="23"
+ label="JOIN NOW!"
+ name="btn_join"
+ visible="true"
+ width="120" />
+ </panel>
+ <text_editor
+ type="string"
+ follows="left|top|right"
left="5"
- height="60"
+ height="80"
layout="topleft"
max_length="511"
name="charter"
- top="5"
- width="303"
+ top="105"
+ right="-1"
+ bg_readonly_color="DkGray2"
+ text_readonly_color="White"
word_wrap="true">
Group Charter
</text_editor>
<name_list
column_padding="0"
draw_heading="true"
- follows="left|top"
- heading_height="16"
+ follows="left|top|right"
+ heading_height="23"
height="160"
layout="topleft"
- left_delta="0"
+ left="0"
name="visible_members"
- top_pad="0"
- width="303">
+ top_pad="2">
<name_list.columns
label="Member"
name="name"
- relative_width="0.6" />
+ relative_width="0.4" />
<name_list.columns
label="Title"
name="title"
relative_width="0.4" />
+ <name_list.columns
+ label="Status"
+ name="status"
+ relative_width="0.2" />
</name_list>
<text
- follows="left|top"
+ follows="left|top|right"
type="string"
- height="14"
- layout="topleft"
- left_delta="0"
+ height="12"
+ layout="left|top|right"
+ left="5"
+ text_color="EmphasisColor"
+ name="my_group_settngs_label"
+ top_pad="10"
+ width="300">
+ Me
+ </text>
+ <text
+ follows="left|top|right"
+ type="string"
+ height="12"
+ layout="left|top|right"
+ left="10"
name="active_title_label"
top_pad="5"
- width="303">
- My Title
+ width="300">
+ My title:
</text>
<combo_box
- follows="left|top"
- height="20"
+ follows="left|top|right"
+ height="23"
layout="topleft"
- left_delta="0"
+ left="10"
+ right="-5"
name="active_title"
tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
- top_pad="2"
- width="303" />
+ top_pad="2" />
<check_box
height="16"
font="SansSerifSmall"
- label="Receive notices"
+ label="Receive group notices"
layout="topleft"
- left="5"
+ left="10"
name="receive_notices"
tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."
top_pad="5"
- width="303" />
+ width="300" />
<check_box
height="16"
label="Show in my profile"
layout="topleft"
- left="5"
+ left="10"
name="list_groups_in_profile"
tool_tip="Sets whether you want to show this group in your profile"
top_pad="5"
- width="303" />
- <panel
- background_visible="true"
- bevel_style="in"
- border="true"
+ width="295" />
+ <panel
+ background_visible="false"
+ bevel_style="none"
+ border="false"
bg_alpha_color="FloaterUnfocusBorderColor"
- follows="left|top"
- height="93"
+ follows="left|top|right"
+ height="140"
+ width="313"
layout="topleft"
- left="5"
+ left="0"
name="preferences_container"
- top_pad="5"
- width="303">
+ top_pad="5">
+ <text
+ follows="left|top|right"
+ type="string"
+ height="12"
+ layout="left|top|right"
+ left="5"
+ text_color="EmphasisColor"
+ name="group_settngs_label"
+ width="300">
+ Group
+ </text>
<check_box
- follows="right|top"
+ follows="right|top|left"
height="16"
- label="Open enrollment"
+ label="Anyone can join"
layout="topleft"
left="10"
name="open_enrollement"
tool_tip="Sets whether this group allows new members to join without being invited."
- top_pad="5"
width="90" />
<check_box
height="16"
- label="Enrollment fee"
+ label="Cost to join"
layout="topleft"
left_delta="0"
name="check_enrollment_fee"
@@ -130,43 +223,45 @@ Hover your mouse over the options for more help.
decimal_digits="0"
follows="left|top"
halign="left"
- height="16"
+ height="23"
increment="1"
- label_width="20"
+ label_width="15"
label="L$"
layout="topleft"
- right="-10"
max_val="99999"
- left_pad="2"
+ left="30"
name="spin_enrollment_fee"
tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
- width="105" />
- <check_box
- height="16"
- initial_value="true"
- label="Show in search"
- layout="topleft"
- left="10"
- name="show_in_group_list"
- tool_tip="Let people see this group in search results"
- top_pad="4"
- width="300" />
+ width="170" />
<combo_box
- height="20"
+ follows="left|top"
+ height="23"
layout="topleft"
- left_delta="0"
+ left="10"
name="group_mature_check"
- tool_tip="Sets whether your group information is considered mature"
- top_pad="5"
+ tool_tip="Sets whether your group contains information rated as Moderate"
+ top_pad="4"
width="190">
<combo_box.item
- label="PG Content"
+ label="General Content"
name="pg"
value="Not Mature" />
<combo_box.item
- label="Mature Content"
+ label="Moderate Content"
name="mature"
value="Mature" />
</combo_box>
+ <check_box
+ follows="left|top"
+ height="16"
+ initial_value="true"
+ label="Show in search"
+ layout="topleft"
+ left="10"
+ name="show_in_group_list"
+ tool_tip="Let people see this group in search results"
+ top_pad="4"
+ width="300" />
+
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index d8d47c4008..b196d8eeb7 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -3,16 +3,16 @@
background_visible="true"
follows="all"
height="570"
- label="Group Info"
+ label="Group Profile"
layout="topleft"
min_height="350"
left="0"
top="20"
name="GroupInfo"
- width="333">
+ width="313">
<panel.string
name="default_needs_apply_text">
- There are unsaved changes to the current tab
+ There are unsaved changes
</panel.string>
<panel.string
name="want_apply_text">
@@ -26,29 +26,38 @@ background_visible="true"
name="group_join_free">
Free
</panel.string>
+ <panel
+ name="group_info_top"
+ follows="top|left"
+ top="0"
+ left="0"
+ height="29"
+ width="313"
+ layout="topleft">
<button
follows="top|right"
height="23"
image_overlay="BackArrow_Off"
layout="topleft"
name="back"
- picture_style="true"
- left="10"
+ left="8"
tab_stop="false"
top="2"
width="23" />
<text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="26"
layout="topleft"
- left_pad="10"
name="group_name"
- text_color="white"
- top="0"
value="(Loading...)"
- use_elipsis="true"
- width="300" />
+ font="SansSerifHugeBold"
+ height="26"
+ left_pad="10"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ width="275"
+ follows="top|left|right"
+ word_wrap="false"
+ mouse_opaque="false"/>
<line_editor
follows="left|top"
font="SansSerif"
@@ -58,168 +67,157 @@ background_visible="true"
max_length="35"
name="group_name_editor"
top_delta="5"
- width="250"
+ width="270"
height="20"
- visible="true" />
- <texture_picker
- follows="left|top"
- height="113"
- label=""
- layout="topleft"
- left="20"
- name="insignia"
- tool_tip="Click to choose a picture"
- top_pad="5"
- width="100" />
- <text
- type="string"
- follows="left|top"
- height="16"
- length="1"
- layout="topleft"
- left_pad="10"
- name="prepend_founded_by"
- top_delta="0"
- width="140">
- Founder:
- </text>
- <name_box
- follows="left|top"
- height="16"
- initial_value="(retrieving)"
- layout="topleft"
- left_delta="0"
- name="founder_name"
- top_pad="2"
- use_ellipses="true"
- width="140" />
- <text
- font="SansSerifBig"
- text_color="EmphasisColor"
- type="string"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="0"
- name="join_cost_text"
- top_pad="10"
- visible="true"
- width="140">
- Free
- </text>
- <button
- follows="left|top"
- left_delta="0"
- top_pad="6"
- height="23"
- label="Join now!"
- label_selected="Join now!"
- name="btn_join"
- visible="true"
- width="120" />
+ visible="false" />
+ </panel>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ left="8"
+ top_pad="0"
+ height="536"
+ width="292"
+ border_size="0">
+ <layout_panel
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ name="group_accordions"
+ follows="all"
+ layout="topleft"
+ auto_resize="true"
+ >
<accordion
+ left="0"
+ top="0"
+ single_expansion="true"
follows="all"
- height="405"
layout="topleft"
- left="0"
- name="groups_accordion"
- top_pad="20"
- width="333">
+ name="groups_accordion">
<accordion_tab
- can_resize="false"
- layout="topleft"
- name="tab_general"
- title="General">
- <panel
- border="false"
- filename="panel_group_general.xml"
- layout="topleft"
- left="0"
- help_topic="group_general_tab"
- name="general_tab"
- top="0"
- width="333" />
+ expanded="true"
+ layout="topleft"
+ name="group_general_tab"
+ title="General">
+ <panel
+ border="false"
+ class="panel_group_general"
+ filename="panel_group_general.xml"
+ layout="topleft"
+ left="0"
+ follows="all"
+ help_topic="group_general_tab"
+ name="group_general_tab_panel"
+ top="0" />
</accordion_tab>
<accordion_tab
- can_resize="false"
- expanded="false"
- layout="topleft"
- name="tab_roles"
- title="Roles">
- <panel
- border="false"
- filename="panel_group_roles.xml"
- layout="topleft"
- left="0"
- help_topic="group_roles_tab"
- name="roles_tab"
- top="0"
- width="333" />
+ expanded="false"
+ layout="topleft"
+ name="group_roles_tab"
+ title="Roles">
+ <panel
+ border="false"
+ class="panel_group_roles"
+ filename="panel_group_roles.xml"
+ layout="topleft"
+ left="0"
+ name="group_roles_tab_panel"
+ top="0" />
</accordion_tab>
<accordion_tab
- can_resize="false"
expanded="false"
layout="topleft"
- name="tab_notices"
+ name="group_notices_tab"
title="Notices">
<panel
+ border="false"
+ class="panel_group_notices"
filename="panel_group_notices.xml"
layout="topleft"
left="0"
help_topic="group_notices_tab"
- name="notices_tab"
- top="0"
- width="333" />
+ name="group_notices_tab_panel"
+ top="0" />
</accordion_tab>
- <accordion_tab
- can_resize="false"
+ <accordion_tab
expanded="false"
layout="topleft"
- name="tab_notices"
+ name="group_land_tab"
title="Land/Assets">
<panel
border="false"
+ class="panel_group_land_money"
filename="panel_group_land_money.xml"
layout="topleft"
left="0"
- help_topic="group_land_money_tab"
- name="land_money_tab"
- top="0"
- width="333" />
+ name="group_land_tab_panel"
+ top="0" />
</accordion_tab>
</accordion>
- <button
- follows="top|left"
- height="20"
+ </layout_panel>
+ <layout_panel
+ height="30"
+ layout="topleft"
+ auto_resize="false"
+ left="0"
+ top_pad="0"
+ name="button_row"
+ follows="bottom|left"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="23"
image_overlay="Refresh_Off"
layout="topleft"
+ left="0"
+ top="5"
name="btn_refresh"
- picture_style="true"
- left="5"
- width="20" />
+ width="23" />
<button
- height="20"
- font="SansSerifSmall"
+ follows="bottom|left"
+ label="Chat"
+ name="btn_chat"
+ left_pad="3"
+ height="23"
+ width="82" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ name="btn_call"
+ label="Group Call"
+ layout="topleft"
+ tool_tip="Call this group"
+ width="112" />
+ <button
+ follows="bottom|left"
+ height="23"
label="Save"
label_selected="Save"
name="btn_apply"
- left_pad="5"
- width="65" />
+ left_pad="3"
+ width="82" />
<button
- height="20"
- label="Create"
- label_selected="Create"
+ follows="bottom|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ label="Create Group"
name="btn_create"
- left_pad="5"
- visible="false"
- width="65" />
- <button
- left_pad="5"
- height="20"
+ visible="true"
+ tool_tip="Create a new Group"
+ width="103" />
+ <!--<button
+ left_pad="3"
+ height="23"
label="Cancel"
label_selected="Cancel"
name="btn_cancel"
visible="false"
- width="65" />
-
-</panel> \ No newline at end of file
+ width="65" />-->
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 1996977acb..48083b7677 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -17,7 +17,7 @@
</panel.string>
<panel.string
name="already_in_group">
- Some avatars are already in group and were not invited.
+ Some Residents you chose are already in the group, and so were not sent an invitation.
</panel.string>
<text
type="string"
@@ -26,14 +26,12 @@
layout="topleft"
left="7"
name="help_text"
- top="24"
+ top="28"
+ word_wrap="true"
width="200">
- You can select multiple residents to
-invite to your group. Click &apos;Open
-Resident Chooser&apos; to start.
+ You can select multiple Residents to invite to your group. Click &apos;Open Resident Chooser&apos; to start.
</text>
<button
- font="SansSerifSmall"
height="20"
label="Open Resident Chooser"
layout="topleft"
@@ -49,17 +47,16 @@ Resident Chooser&apos; to start.
left_delta="0"
multi_select="true"
name="invitee_list"
- tool_tip="Hold the Ctrl key and click resident names to multi-select"
+ tool_tip="Hold the Ctrl key and click Resident names to multi-select"
top_pad="4"
width="200" />
<button
- font="SansSerifSmall"
height="20"
label="Remove Selected from List"
layout="topleft"
left_delta="0"
name="remove_button"
- tool_tip="Removes residents selected above from the invite list"
+ tool_tip="Removes the Residents selected above from the invite list"
top_pad="4"
width="200" />
<text
@@ -70,6 +67,7 @@ Resident Chooser&apos; to start.
left_delta="4"
name="role_text"
top_pad="5"
+ word_wrap="true"
width="200">
Choose what Role to assign them to:
</text>
@@ -82,7 +80,6 @@ Resident Chooser&apos; to start.
top_delta="16"
width="196" />
<button
- font="SansSerifSmall"
height="20"
label="Send Invitations"
layout="topleft"
@@ -91,7 +88,6 @@ Resident Chooser&apos; to start.
top="356"
width="130" />
<button
- font="SansSerifSmall"
height="20"
label="Cancel"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 0845ec014e..38b0f234d5 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="true"
+ border="false"
follows="all"
- height="510"
+ height="500"
label="Land &amp; L$"
layout="topleft"
- left="1"
+ left="0"
name="land_money_tab"
- top="490"
- width="280">
+ top="0"
+ width="313">
<panel.string
name="help_text">
- Parcels owned by the group are listed along with contribution details. A warning appears until the Total Land in Use is less than or equal to the Total Contribution. The Planning, Details, and Sales tabs provide information about the group&apos;s finances.
+ A warning appears until the Total Land in Use is less than or = to the Total Contribution.
</panel.string>
<panel.string
name="cant_view_group_land_text">
- You do not have permission to view group owned land.
+ You don&apos;t have permission to view group owned land
</panel.string>
<panel.string
name="cant_view_group_accounting_text">
- You do not have permission to view the group&apos;s accounting information.
+ You don&apos;t have permission to view the group&apos;s accounting information.
</panel.string>
<panel.string
name="loading_txt">
@@ -27,19 +27,8 @@
</panel.string>
<panel.string
name="land_contrib_error">
- Unable to set your land contribution.
+ Unable to set your land contribution
</panel.string>
- <!--
- <button
- follows="left|top"
- height="16"
- label="?"
- layout="topleft"
- left="250"
- name="help_button"
- top="8"
- width="20" />
- -->
<!-- <text
type="string"
follows="left|top"
@@ -52,61 +41,54 @@
width="260">
Group Owned Land
</text> -->
+ <panel
+ name="layout_panel_landmoney"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ height="250"
+ width="313"
+ >
<scroll_list
draw_heading="true"
- follows="top"
- heading_height="14"
- height="100"
+ follows="top|left|right"
+ height="130"
layout="topleft"
- left="5"
+ left="0"
+ right="-1"
+ top="0"
name="group_parcel_list"
- top_pad="10"
- width="265">
+ width="313">
<scroll_list.columns
label="Parcel"
name="name"
- width="67" />
+ width="78" />
<scroll_list.columns
label="Region"
name="location"
- width="72" />
+ width="78" />
<scroll_list.columns
label="Type"
name="type"
- width="60" />
+ width="70" />
<scroll_list.columns
label="Area"
name="area"
- width="20" />
- <scroll_list.columns
- label=""
- name="hidden"
- width="-1" />
+ width="50" />
</scroll_list>
- <button
- follows="top"
- height="20"
- label="Map"
- label_selected="Map"
- layout="topleft"
- left="150"
- name="map_button"
- top_pad="10"
- width="125"
- enabled="false" />
<text
type="string"
follows="left|top"
halign="right"
height="16"
layout="topleft"
- left="5"
+ left="0"
name="total_contributed_land_label"
- top_pad="10"
width="130">
- Total Contribution:
+ Total contribution:
</text>
<text
+ text_color="EmphasisColor"
type="string"
follows="left|top"
height="16"
@@ -114,22 +96,34 @@
left_pad="5"
name="total_contributed_land_value"
top_delta="0"
- width="120">
+ width="90">
[AREA] m²
</text>
+ <button
+ follows="top"
+ height="23"
+ label="Map"
+ label_selected="Map"
+ layout="topleft"
+ name="map_button"
+ top_delta="-4"
+ left_pad="0"
+ width="60"
+ enabled="false" />
<text
type="string"
follows="left|top"
halign="right"
height="16"
layout="topleft"
- left="5"
+ left="0"
name="total_land_in_use_label"
top_pad="0"
width="130">
- Total Land In Use:
+ Total land in use:
</text>
<text
+ text_color="EmphasisColor"
type="string"
follows="left|top"
height="16"
@@ -146,13 +140,14 @@
halign="right"
height="16"
layout="topleft"
- left="5"
+ left="0"
name="land_available_label"
top_pad="0"
width="130">
- Land Available:
+ Land available:
</text>
<text
+ text_color="EmphasisColor"
type="string"
follows="left|top"
height="16"
@@ -169,210 +164,203 @@
halign="right"
height="16"
layout="topleft"
- left="5"
+ left="0"
name="your_contribution_label"
top_pad="0"
width="130">
- Your Contribution:
+ Your contribution:
</text>
<line_editor
- border_style="line"
- border_thickness="1"
follows="left|top"
- height="16"
+ height="19"
layout="topleft"
left_pad="5"
max_length="10"
name="your_contribution_line_editor"
- top_delta="-2"
- width="95" />
+ top_delta="0"
+ width="80" />
<text
type="string"
follows="left|top"
height="16"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="your_contribution_units"
- top_delta="2">
+ top_delta="2"
+ width="40"
+ >
m²
</text>
<text
type="string"
follows="left|top"
- halign="right"
+ halign="left"
height="16"
layout="topleft"
left="140"
name="your_contribution_max_value"
- top_pad="0"
- width="95">
+ top_pad="2"
+ width="170">
([AMOUNT] max)
</text>
<icon
height="16"
- image_name="smicon_warn.tga"
+ image_name="Parcel_Exp_Color"
layout="topleft"
- left="9"
+ left="75"
name="group_over_limit_icon"
+ color="Green"
top_pad="0"
- visible="false"
- width="16" />
+ visible="true"
+ width="18" />
<text
- follows="left|top"
+ follows="left|top"
type="string"
word_wrap="true"
- font="SansSerifSmall"
- height="40"
+ height="20"
layout="topleft"
- left_pad="5"
+ left_pad="2"
name="group_over_limit_text"
- text_color="GroupOverTierColor"
+ text_color="ColorPaletteEntry29"
top_delta="0"
- width="250">
- Group members must contribute more land credits to support land in use.
- </text>
+ width="213">
+ More land credits are needed to support land in use
+ </text>
<text
type="string"
follows="left|top"
font="SansSerifBig"
height="16"
layout="topleft"
- left="10"
+ left="0"
name="group_money_heading"
text_color="EmphasisColor"
- top_pad="0"
- width="150">
+ top_pad="-15"
+ width="100">
Group L$
</text>
+ </panel>
<tab_container
follows="all"
- height="200"
+ height="230"
+ halign="center"
layout="topleft"
- left="10"
+ left="0"
+ right="-1"
name="group_money_tab_container"
tab_position="top"
- top_pad="10"
- width="265">
+ top_pad="2"
+ tab_min_width="90"
+ width="313">
<panel
- border="true"
- follows="left|top|right|bottom"
- height="180"
- label="Planning"
+ border="false"
+ follows="all"
+ label="PLANNING"
layout="topleft"
- left="1"
+ left="0"
help_topic="group_money_planning_tab"
name="group_money_planning_tab"
- top="5"
- width="265">
+ top="0"
+ width="313">
<text_editor
type="string"
- bg_readonly_color="0.784314 0.819608 0.8 1"
follows="all"
- font="Monospace"
- height="168"
+ height="200"
layout="topleft"
- left="8"
+ left="0"
max_length="4096"
name="group_money_planning_text"
- top="5"
- width="250"
+ top="2"
+ width="313"
word_wrap="true">
- Computing...
+ Loading...
</text_editor>
</panel>
<panel
- border="true"
- follows="left|top|right|bottom"
- height="180"
- label="Details"
+ border="false"
+ follows="all"
+ label="DETAILS"
layout="topleft"
- left_delta="0"
+ left="0"
help_topic="group_money_details_tab"
name="group_money_details_tab"
- top_delta="0"
- width="265">
+ top="0"
+ width="313">
<text_editor
type="string"
- bg_readonly_color="0.784314 0.819608 0.8 1"
follows="all"
- font="Monospace"
- height="140"
+ height="185"
layout="topleft"
- left="8"
+ left="0"
max_length="4096"
name="group_money_details_text"
- top="7"
- width="250"
+ top="2"
+ width="313"
word_wrap="true">
- Computing...
- </text_editor>
- <button
- height="20"
- label="&lt; Earlier"
- label_selected="&lt; Earlier"
- layout="topleft"
- left="5"
- name="earlier_details_button"
- tool_tip="Go back in time"
- top_pad="10"
- width="125" />
+ Loading...
+ </text_editor>
<button
- height="20"
- label="Later &gt;"
- label_selected="Later &gt;"
- layout="topleft"
- left_pad="5"
- name="later_details_button"
- tool_tip="Go forward in time"
- top_delta="0"
- width="125" />
+ follows="left|top"
+ height="18"
+ image_overlay="Arrow_Left_Off"
+ layout="topleft"
+ name="earlier_details_button"
+ tool_tip="Back"
+ left="200"
+ top_pad="0"
+ width="25" />
+ <button
+ follows="left|top"
+ height="18"
+ image_overlay="Arrow_Right_Off"
+ layout="topleft"
+ name="later_details_button"
+ tool_tip="Next"
+ left_pad="15"
+ width="25" />
</panel>
<panel
- border="true"
- follows="left|top|right|bottom"
- height="180"
- label="Sales"
+ border="false"
+ follows="all"
+ label="SALES"
layout="topleft"
- left_delta="0"
+ left="0"
help_topic="group_money_sales_tab"
name="group_money_sales_tab"
- top_delta="-1"
- width="265">
+ top="0"
+ width="313">
<text_editor
type="string"
- bg_readonly_color="0.784314 0.819608 0.8 1"
follows="all"
- font="Monospace"
- height="140"
+ height="185"
layout="topleft"
- left="8"
+ left="0"
max_length="4096"
name="group_money_sales_text"
- top="7"
- width="250"
+ top="2"
+ width="313"
word_wrap="true">
- Computing...
+ Loading...
</text_editor>
- <button
- height="20"
- label="&lt; Earlier"
- label_selected="&lt; Earlier"
- layout="topleft"
- left="5"
- name="earlier_sales_button"
- tool_tip="Go back in time"
- top_pad="10"
- width="125" />
- <button
- height="20"
- label="Later &gt;"
- label_selected="Later &gt;"
- layout="topleft"
- left_pad="5"
- name="later_sales_button"
- tool_tip="Go forward in time"
- top_delta="0"
- width="125" />
+ <button
+ follows="left|top"
+ height="18"
+ image_overlay="Arrow_Left_Off"
+ layout="topleft"
+ name="earlier_sales_button"
+ tool_tip="Back"
+ left="200"
+ top_pad="0"
+ width="25" />
+ <button
+ follows="left|top"
+ height="18"
+ image_overlay="Arrow_Right_Off"
+ layout="topleft"
+ left_pad="15"
+ name="later_sales_button"
+ tool_tip="Next"
+ width="25" />
</panel>
</tab_container>
-</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index 7bdcaafe31..b674b39d9b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -28,16 +28,15 @@
visible="false"
width="320" />
<icon
- follows="top|left"
height="20"
image_name="Generic_Group"
name="group_icon"
- layout="topleft"
- left="5"
mouse_opaque="true"
+ left="5"
top="2"
width="20" />
<text
+ allow_html="false"
follows="left|right"
font="SansSerifSmall"
height="15"
@@ -47,28 +46,27 @@
top="6"
use_ellipses="true"
value="Unknown"
- width="246" />
+ width="242" />
<button
follows="right"
height="16"
image_pressed="Info_Press"
- image_hover="Info_Over"
- image_unselected="Info_Off"
+ image_unselected="Info_Over"
left_pad="3"
- right="-25"
+ right="-31"
name="info_btn"
- picture_style="true"
+ top_delta="-2"
width="16" />
+ <!--*TODO: Should only appear on rollover-->
<button
follows="right"
- height="16"
- image_selected="BuyArrow_Press"
- image_pressed="BuyArrow_Press"
- image_unselected="BuyArrow_Press"
+ height="20"
+ image_overlay="ForwardArrow_Off"
layout="topleft"
left_pad="5"
- right="-5"
+ right="-3"
name="profile_btn"
- picture_style="true"
- width="16" />
+ tool_tip="View profile"
+ top_delta="-2"
+ width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index d9fb962998..5f46ad7860 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,89 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="true"
follows="all"
- height="485"
+ height="530"
label="Notices"
layout="topleft"
- left="1"
+ left="0"
name="notices_tab"
- top="485"
- width="280">
+ top="0"
+ width="313">
<panel.string
name="help_text">
- Notices are a quick way to communicate across a
-group by broadcasting a message and delivering
-an optionally attached item. Notices only go to
-group members in Roles granted the ability to
-receive Notices. You can turn off Notices on
-the General tab.
+ Notices let you send a message and an optionally attached item.
+Notices only go to group members in Roles with the ability to receive Notices.
+You can turn off Notices on the General tab.
</panel.string>
<panel.string
name="no_notices_text">
- There are no past notices.
+ There are no past notices
</panel.string>
- <!-- <button
- follows="left|top"
- height="16"
- label="?"
- label_selected="?"
- layout="topleft"
- left="250"
- name="help_button"
- top="8"
- width="20" /> -->
- <!--<text
- follows="left|top"
- type="string"
- font="SansSerifBig"
- height="16"
- layout="topleft"
- left="10"
- name="lbl"
- top_pad="10"
- width="269">
- Group Notices Archive
- </text> -->
<text
follows="left|top"
type="string"
word_wrap="true"
- height="40"
+ height="24"
+ halign="left"
layout="topleft"
- left_delta="10"
+ text_color="White_50"
+ left="5"
name="lbl2"
- text_color="EmphasisColor"
- top_pad="10"
- width="270">
- Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis.
+ right="-1"
+ top="5"
+ width="300">
+ Notices are kept for 14 days.
+Maximum 200 per group daily
</text>
<scroll_list
- follows="left|top"
+ follows="left|top|right"
column_padding="0"
draw_heading="true"
- heading_height="14"
- height="109"
+ height="175"
layout="topleft"
- left_delta="0"
+ left="0"
+ right="-1"
name="notice_list"
top_pad="0"
- width="265">
+ width="313">
<scroll_list.columns
label=""
name="icon"
- width="16" />
+ width="20" />
<scroll_list.columns
label="Subject"
name="subject"
- width="100" />
+ width="110" />
<scroll_list.columns
label="From"
name="from"
- width="83" />
+ width="100" />
<scroll_list.columns
label="Date"
name="date"
- width="50" />
+ width="60" />
<scroll_list.columns
name="sort"
width="-1" />
@@ -94,39 +71,41 @@ the General tab.
layout="topleft"
name="notice_list_none_found"
visible="false">
- None found.
+ None found
</text>
- <button
- follows="left|top"
- height="20"
- font="SansSerifSmall"
- label="New Notice"
- label_selected="Create New Notice"
+ <button
+ follows="top|left"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left="5"
+ name="create_new_notice"
+ tool_tip="Create a new notice"
+ top_delta="-3"
+ width="18" />
+ <button
+ follows="top|left"
+ height="23"
+ image_overlay="Refresh_Off"
layout="topleft"
- left_delta="0"
- name="create_new_notice"
- top_delta="4"
- width="125" />
- <button
- follows="left|top"
- height="20"
- font="SansSerifSmall"
- label="Refresh"
- label_selected="Refresh List"
- layout="topleft"
- left_pad="12"
name="refresh_notices"
+ left_pad="230"
+ tool_tip="Refresh list of notices"
top_delta="0"
- width="125" />
+ width="23" />
<panel
- follows="left|top"
- height="268"
+ follows="left|top|right"
+ height="280"
label="Create New Notice"
layout="topleft"
left="0"
+ right="-1"
+ top_pad="0"
+ visible="true"
name="panel_create_new_notice"
- top_pad="10"
- width="265">
+ width="313">
<text
follows="left|top"
type="string"
@@ -137,30 +116,16 @@ the General tab.
mouse_opaque="false"
name="lbl"
text_color="EmphasisColor"
- top_pad="0"
- width="265">
+ top="0"
+ width="200">
Create a Notice
</text>
<text
follows="left|top"
type="string"
- word_wrap="true"
- height="90"
- layout="topleft"
- left_delta="0"
- name="lbl2"
- text_color="EmphasisColor"
- top_pad="4"
- width="195">
- You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can&apos;t send a folder.
- </text>
- <text
- follows="left|top"
- type="string"
halign="left"
height="16"
layout="topleft"
- left_delta="0"
name="lbl3"
top_pad="10"
width="60">
@@ -174,8 +139,8 @@ the General tab.
left_pad="3"
max_length="63"
name="create_subject"
- top_delta="-1"
- width="200" />
+ prevalidate_callback="ascii"
+ width="220" />
<text
follows="left|top"
type="string"
@@ -184,109 +149,107 @@ the General tab.
layout="topleft"
left="10"
name="lbl4"
- top_pad="10"
+ top_pad="5"
width="60">
Message:
</text>
<text_editor
- height="75"
+ height="90"
layout="topleft"
left_pad="3"
max_length="511"
name="create_message"
top_delta="0"
- width="200"
+ width="220"
word_wrap="true" />
<text
follows="left|top"
type="string"
halign="left"
- height="16"
+ height="14"
layout="topleft"
left="10"
name="lbl5"
- top_pad="10"
- width="60">
+ width="200">
Attach:
</text>
<line_editor
enabled="false"
- height="16"
+ height="19"
layout="topleft"
- left_pad="3"
- max_length="63"
+ max_length="90"
mouse_opaque="false"
name="create_inventory_name"
- top_delta="0"
- width="200" />
+ top_pad="2"
+ width="285" />
+ <text
+ text_color="EmphasisColor"
+ follows="left|top"
+ type="string"
+ halign="right"
+ height="34"
+ layout="topleft"
+ left="10"
+ name="string"
+ top_pad="15"
+ word_wrap="true"
+ width="150">
+ Drag and drop item here to attach it:
+ </text>
<icon
- height="16"
+ height="72"
+ image_name="DropTarget"
layout="topleft"
- left_delta="0"
- name="create_inv_icon"
- top_delta="0"
- width="16" />
+ left_pad="10"
+ mouse_opaque="true"
+ name="drop_icon"
+ top_delta="-10"
+ width="72" />
<button
follows="left|top"
- height="20"
- font="SansSerifSmall"
- label="Remove Attachment"
- label_selected="Remove Attachment"
layout="topleft"
- left="10"
+ left="140"
name="remove_attachment"
- top_pad="10"
- width="135" />
+ top_delta="50"
+ height="18"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ image_disabled="TrashItem_Disabled"
+ tool_tip="Remove attachment from your notification"
+ width="18" />
<button
follows="left|top"
- height="20"
- font="SansSerifSmall"
+ height="23"
label="Send"
- label_selected="Send Notice"
+ label_selected="Send"
layout="topleft"
- left_delta="138"
+ right="-10"
+ top_pad="10"
name="send_notice"
- top_delta="0"
- width="125" />
- <panel
- bevel_style="in"
- border="true"
- height="71"
- layout="topleft"
- left="200"
- name="drop_target2"
- top="20"
- width="71" />
- <icon
- height="59"
- image_name="icon_groupnoticeinventory.tga"
- layout="topleft"
- left_delta="6"
- mouse_opaque="true"
- name="drop_icon"
- top="26"
- width="59" />
- <group_drop_target
- height="466"
+ width="100" />
+ <group_drop_target
+ height="95"
+ top="160"
+ left="10"
layout="topleft"
- left="0"
name="drop_target"
- tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."
- top="-198"
+ tool_tip="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it."
width="280" />
- </panel>
+ </panel>
<panel
- follows="left|top"
- height="268"
+ follows="left|top|right"
+ height="280"
label="View Past Notice"
layout="topleft"
left="0"
+ right="-1"
+ visible="false"
name="panel_view_past_notice"
- top="197"
- width="265">
+ top="230"
+ width="313">
<text
type="string"
- font="SansSerifBig"
+ font="SansSerifMedium"
height="16"
layout="topleft"
left="10"
@@ -304,9 +267,9 @@ the General tab.
layout="topleft"
left_delta="0"
name="lbl2"
- top_pad="4"
+ top_pad="2"
width="265">
- To send a new notice, click the &apos;New Notice&apos; button above.
+ To send a new notice, click the + button
</text>
<text
type="string"
@@ -315,7 +278,7 @@ the General tab.
layout="topleft"
left_delta="0"
name="lbl3"
- top_pad="24"
+ top_pad="15"
visible="false"
width="60">
Subject:
@@ -324,7 +287,7 @@ the General tab.
border_style="line"
border_thickness="1"
enabled="false"
- height="16"
+ height="20"
layout="topleft"
left_pad="3"
max_length="63"
@@ -345,42 +308,35 @@ the General tab.
Message:
</text>
<text_editor
+ follows="top|left|right"
enabled="false"
- height="150"
+ height="160"
layout="topleft"
- left="10"
+ left="0"
+ right="-1"
max_length="511"
name="view_message"
- top_delta="-35"
- width="260"
+ top_delta="-40"
+ width="313"
word_wrap="true" />
<line_editor
enabled="false"
- height="16"
+ height="20"
layout="topleft"
- left_delta="0"
+ left="5"
max_length="63"
mouse_opaque="false"
name="view_inventory_name"
- top_pad="10"
- width="260" />
- <icon
- height="16"
- layout="topleft"
- left_delta="0"
- name="view_inv_icon"
- top_delta="0"
- width="16" />
+ top_pad="8"
+ width="250"/>
<button
follows="left|top"
- height="20"
- font="SansSerifSmall"
+ height="23"
label="Open Attachment"
- label_selected="Open Attachment"
layout="topleft"
- left_delta="0"
+ left="5"
name="open_attachment"
- top_pad="10"
- width="135" />
+ top_pad="5"
+ width="180" />
</panel>
-</panel> \ No newline at end of file
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index bd98996ae1..65b2e81d50 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,77 +1,101 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0"
- height="155" label="instant_message" layout="topleft" left="0"
- name="panel_group_notify" top="0" width="350">
+<panel
+ background_visible="true"
+ height="90"
+ label="instant_message"
+ layout="topleft"
+ left="0"
+ name="panel_group_notify"
+ top="0"
+ width="305">
<string
- name="message_max_lines_count">
- 4
- </string>
- <panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black"
- height="30" label="header" layout="topleft" left="0" name="header"
- top="0" width="350">
- <icon follows="left|top|right|bottom" height="20" width="20" layout="topleft"
- top="5" left="5" mouse_opaque="true" name="group_icon"/>
- <text type="string" length="1" follows="left|top|right|bottom"
- font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title"
- text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true">
- Sender Name / Group Name
- </text>
- </panel>
- <text
+ name="message_max_lines_count"
+ value="7" />
+ <string
+ name="subject_font"
+ value="SANSSERIF_BIG" />
+ <string
+ name="date_font"
+ value="SANSSERIF" />
+ <panel
+ background_visible="true"
follows="top"
- height="20"
+ height="30"
+ label="header"
+ layout="topleft"
+ left="0"
+ name="header"
+ top="0"
+ width="305">
+ <icon
+ follows="all"
+ height="20"
+ layout="topleft"
+ left="5"
+ mouse_opaque="true"
+ name="group_icon"
+ top="5"
+ width="20" />
+ <text
+ follows="all"
+ font="SansSerifBig"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="GroupNotifyTextColor"
+ top="5"
+ use_ellipses="true"
+ value="Sender Name / Group Name"
+ width="230" />
+ </panel>
+ <text_editor
+ allow_html="true"
+ enabled="true"
+ follows="all"
+ height="0"
layout="topleft"
left="25"
- name="subject"
+ max_length="2147483647"
+ name="message"
+ parse_highlights="true"
+ read_only="true"
text_color="GroupNotifyTextColor"
- font="SansSerifBig"
- top="60"
+ top="40"
+ type="string"
use_ellipses="true"
- value="subject"
- width="300"
- word_wrap="true">
- subject
- </text>
- <text
- follows="top"
- height="20"
+ value="message"
+ width="270"
+ word_wrap="true" >
+ </text_editor>
+ <icon
+ bottom="60"
+ follows="left|bottom|right"
+ height="15"
layout="topleft"
left="25"
- name="datetime"
- text_color="GroupNotifyTextColor"
- font="SansSerif"
- top="80"
- use_ellipses="true"
- value="datetime"
- width="300"
- word_wrap="true">
- datetime
- </text>
+ mouse_opaque="true"
+ name="attachment_icon"
+ width="15" />
<text
- follows="left|top|bottom|right"
- height="0"
+ bottom="60"
+ follows="left|bottom|right"
+ font="SansSerif"
+ height="15"
layout="topleft"
- left="25"
- name="message"
+ left="45"
+ name="attachment"
text_color="GroupNotifyTextColor"
- top="100"
+ value="Attachment"
use_ellipses="true"
- value="message"
- width="300"
- word_wrap="true"
- visible="true" >
- </text>
- <icon
- follows="left|bottom|right" height="15" width="15"
- layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true"
- />
- <text font="SansSerif" font.style="UNDERLINE" font_shadow="none"
- type="string" length="1" follows="left|bottom|right" layout="topleft"
- left="45" bottom="122" height="15" width="280" name="attachment"
- text_color="GroupNotifyTextColor" visible="true">
- Attachment
- </text>
-
- <button label="OK" layout="topleft" bottom="145" left="140" height="20"
- width="70" name="btn_ok" follows="bottom" />
-</panel> \ No newline at end of file
+ width="250" />
+ <button
+ bottom="85"
+ follows="bottom"
+ height="20"
+ label="OK"
+ layout="topleft"
+ right="-10"
+ name="btn_ok"
+ width="70" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index e2e4ca8b8f..7557e2cc5e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="false"
- height="412"
+ follows="all"
+ height="680"
label="Members &amp; Roles"
layout="topleft"
left="0"
@@ -10,265 +10,126 @@
width="313">
<panel.string
name="default_needs_apply_text">
- There are unsaved changes to the current tab
+ There are unsaved changes
</panel.string>
<panel.string
name="want_apply_text">
- Do you want to save these changes?
+ Do you want to save your changes?
</panel.string>
<panel.string
name="help_text" />
- <!--
- <button
- follows="left|top"
- height="16"
- label="?"
- layout="topleft"
- left="250"
- name="help_button"
- top="8"
- width="20" />
- -->
- <!--<panel
- follows="left|top"
- height="80"
- layout="topleft"
- left="10"
- name="members_header"
- top_pad="10"
- width="270">
- <text
- type="string"
- font="SansSerifBig"
- height="16"
- layout="topleft"
- left="0"
- name="static"
- top="0"
- width="270">
- Members &amp; Roles
- </text>
- <text
- type="string"
- word_wrap="true"
- height="40"
- layout="topleft"
- left_delta="0"
- name="static2"
- top_pad="4"
- width="270">
- Group Members are assigned Roles with Abilities. These settings can easily be customized, allowing for greater organization and flexibility.
- </text>
- </panel>
- <panel
- follows="left|top"
- height="24"
- layout="topleft"
- left_delta="0"
- name="roles_header"
- top_delta="0"
- visible="false"
- width="270">
- <text
- type="string"
- font="SansSerifBig"
- height="16"
- layout="topleft"
- left="0"
- name="static"
- top="0"
- width="270">
- Roles
- </text>
- <text
- type="string"
- word_wrap="true"
- height="40"
- layout="topleft"
- left_delta="0"
- name="role_properties_modifiable"
- top_pad="4"
- visible="false"
- width="270">
- Select a Role below. You can modify its Name, Description and Member Title.
- </text>
- <text
- type="string"
- word_wrap="true"
- height="40"
- layout="topleft"
- left_delta="0"
- name="role_properties_not_modifiable"
- top_delta="0"
- width="270">
- Select a Role below to see its properties, Members and allowed Abilities.
- </text>
- <text
- type="string"
- word_wrap="true"
- height="16"
- layout="topleft"
- left_delta="0"
- name="role_actions_modifiable"
- top_delta="24"
- visible="false"
- width="270">
- You can also assign Abilities to the Role.
- </text>
- <text
- type="string"
- word_wrap="true"
- height="16"
- layout="topleft"
- left_delta="0"
- name="role_actions_not_modifiable"
- top_delta="0"
- width="270">
- You may view, but not modify, assigned Abilities.
- </text>
- </panel>
- <panel
- follows="left|top"
- height="24"
- layout="topleft"
- left_delta="0"
- name="actions_header"
- top_delta="0"
- visible="false"
- width="270">
- <text
- type="string"
- font="SansSerifBig"
- height="16"
- layout="topleft"
- left="0"
- name="static"
- top="0"
- width="270">
- Abilities
- </text>
- <text
- type="string"
- word_wrap="true"
- height="40"
- layout="topleft"
- left_delta="0"
- name="static2"
- top_pad="4"
- width="270">
- You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.
- </text>
- </panel> -->
<tab_container
- border="true"
- follows="left|top"
- height="260"
+ border="false"
+ follows="left|top|right"
+ height="552"
+ halign="center"
layout="topleft"
- left="5"
+ left="0"
+ right="-1"
name="roles_tab_container"
tab_position="top"
- tab_height="20"
+ tab_height="22"
+ tab_min_width="90"
top="0"
- width="303">
+ width="313">
<panel
border="false"
- height="260"
- label="Members"
+ follows="all"
+ height="303"
+ label="MEMBERS"
layout="topleft"
- left="1"
+ left="0"
+ right="-1"
help_topic="roles_members_tab"
name="members_sub_tab"
tool_tip="Members"
- top="17"
- class="panel_group_members_subtab"
- width="300">
+ class="panel_group_members_subtab">
<panel.string
name="help_text">
You can add or remove Roles assigned to Members.
Select multiple Members by holding the Ctrl key and
clicking on their names.
</panel.string>
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
<filter_editor
layout="topleft"
- top="10"
- left="4"
- width="280"
- height="20"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
follows="left|top|right"
- max_length="250"
label="Filter Members"
- name="filter_input"
- font="SansSerif" />
- <!-- <button
- enabled="false"
- font="SansSerifSmall"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="-90"
- name="show_all_button"
- top_delta="-6"
- width="80" />-->
+ name="filter_input" />
<name_list
- column_padding="0"
+ column_padding="2"
draw_heading="true"
- heading_height="20"
- height="160"
- follows="left|top"
+ height="240"
+ follows="left|top|right"
layout="topleft"
left="0"
+ right="-1"
multi_select="true"
name="member_list"
- top_pad="2"
- width="300">
+ top_pad="5">
<name_list.columns
label="Member"
name="name"
- relative_width="0.45" />
+ relative_width="0.44" />
<name_list.columns
- label="Donations"
+ label="Donation"
name="donated"
- relative_width="0.3" />
+ relative_width="0.25" />
<name_list.columns
- label="Online"
+ label="Status"
name="online"
- relative_width="0.2" />
+ relative_width="0.14" />
</name_list>
<button
- height="20"
- font="SansSerifSmall"
+ height="23"
+ follows="top|left"
label="Invite"
- layout="topleft"
+ left="0"
name="member_invite"
- top_pad="3"
width="100" />
<button
- height="20"
- font="SansSerifSmall"
+ height="23"
label="Eject"
- layout="topleft"
- left_pad="5"
+ follows="top|left"
+ left_pad="10"
name="member_eject"
width="100" />
- <icon
- height="16"
- image_name="Inv_FolderClosed"
- layout="topleft"
- name="power_folder_icon"
- visible="false"
- width="16" />
</panel>
<panel
border="false"
- height="164"
- label="Roles"
+ height="303"
+ label="ROLES"
layout="topleft"
- left_delta="0"
+ left="0"
+ right="-1"
help_topic="roles_roles_tab"
name="roles_sub_tab"
- class="panel_group_roles_subtab"
- top="17"
- width="265">
+ class="panel_group_roles_subtab">
+ <!-- <button
+ enabled="false"
+ height="20"
+ label="Show All"
+ layout="topleft"
+ top="-65"
+ right="-5"
+ name="show_all_button"
+ width="100" />-->
<panel.string
name="help_text">
Roles have a title and an allowed list of Abilities
@@ -278,395 +139,360 @@ including the Everyone and Owner Roles.
</panel.string>
<panel.string
name="cant_delete_role">
- The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and cannot be deleted.
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
</panel.string>
<panel.string
- name="power_folder_icon">
+ name="power_folder_icon" translate="false">
Inv_FolderClosed
</panel.string>
<panel.string
- name="power_all_have_icon">
- checkbox_enabled_true.tga
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
</panel.string>
<panel.string
- name="power_partial_icon">
- checkbox_enabled_false.tga
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
</panel.string>
- <filter_editor
- layout="topleft"
- top="10"
- left="4"
- width="260"
- height="20"
- follows="left|top|right"
- max_length="250"
- label="Filter Roles"
- name="filter_input"
- font="SansSerif" />
- <!--<line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="4"
- max_length="63"
- name="search_text"
- top="10"
- width="90" />
- <button
- font="SansSerifSmall"
- height="20"
- label="Search"
- layout="topleft"
- left_pad="5"
- name="search_button"
- top_delta="-2"
- width="80" />
- <button
- enabled="false"
- font="SansSerifSmall"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="0"
- name="show_all_button"
- top_delta="0"
- width="80" /> -->
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Roles"
+ name="filter_input" />
<scroll_list
column_padding="0"
draw_heading="true"
- follows="left|top"
- heading_height="20"
- height="150"
+ draw_stripes="false"
+ heading_height="23"
+ height="130"
layout="topleft"
- left="4"
+ search_column="1"
+ left="0"
+ follows="left|top|right"
+ right="-1"
name="role_list"
- top_pad="4"
- width="300">
+ top_pad="2"
+ width="310">
<scroll_list.columns
label="Role"
name="name"
- width="80" />
+ relative_width="0.45" />
<scroll_list.columns
label="Title"
name="title"
- width="90" />
+ relative_width="0.45" />
<scroll_list.columns
- label="Members"
+ label="#"
name="members"
- width="95" />
+ relative_width="0.15" />
</scroll_list>
<button
- height="20"
- font="SansSerifSmall"
- label="Add Role"
+ follows="top|left"
+ height="23"
+ label="New Role"
layout="topleft"
- left_delta="0"
+ left="0"
name="role_create"
- top_pad="6"
- width="125" />
+ width="120" />
<button
- height="20"
- font="SansSerifSmall"
+ height="23"
+ follows="top|left"
label="Delete Role"
layout="topleft"
- left_pad="5"
+ left_pad="10"
name="role_delete"
- top_delta="0"
- width="125" />
+ width="120" />
</panel>
<panel
border="false"
- height="164"
- label="Abilities"
+ height="303"
+ label="ABILITIES"
layout="topleft"
- left_delta="0"
+ left="0"
+ right="-1"
help_topic="roles_actions_tab"
name="actions_sub_tab"
class="panel_group_actions_subtab"
- top="17"
tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
- width="300">
+ width="310">
<panel.string
name="help_text">
Abilities allow Members in Roles to do specific
things in this group. There&apos;s a broad variety of Abilities.
</panel.string>
- <filter_editor
- layout="topleft"
- top="10"
- left="4"
- width="255"
- height="20"
- follows="left|top|right"
- max_length="250"
- label="Filter Abilities"
- name="filter_input"
- font="SansSerif" />
- <!--<line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="4"
- max_length="63"
- name="search_text"
- top="10"
- width="90" />
- <button
- font="SansSerifSmall"
- height="20"
- label="Search"
- layout="topleft"
- left_pad="5"
- name="search_button"
- top_delta="-2"
- width="80" />
- <button
- enabled="false"
- font="SansSerifSmall"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="0"
- name="show_all_button"
- top_delta="0"
- width="80" /> -->
- <scroll_list
- column_padding="0"
- draw_stripes="false"
- follows="left|top"
- height="100"
- layout="topleft"
- left="6"
- multi_select="true"
- name="action_list"
- search_column="1"
- tool_tip="Select an Ability to view more details"
- top_pad="6"
- width="255">
- <scroll_list.columns
- label=""
- name="icon"
- width="18" />
- <scroll_list.columns
- label=""
- name="action"
- width="247" />
- </scroll_list>
- <icon
- height="16"
- image_name="inv_folder_plain_closed.tga"
- layout="topleft"
- name="power_folder_icon"
- visible="false"
- width="16" />
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Abilities"
+ name="filter_input" />
+ <scroll_list
+ column_padding="0"
+ draw_stripes="true"
+ height="200"
+ follows="left|top"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="action_list"
+ search_column="2"
+ tool_tip="Select an Ability to view more details"
+ top_pad="5"
+ width="300">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action"
+ width="270" />
+ </scroll_list>
</panel>
</tab_container>
<panel
- height="150"
+ height="350"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
- follows="left|top"
- left="10"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
name="members_footer"
- top_pad="2"
- width="300">
+ top="325"
+ visible="false">
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
follows="left|top"
- left="0"
+ left="5"
+ top="8"
+ text_color="EmphasisColor"
name="static"
- top_pad="0"
- width="100">
+ width="300">
Assigned Roles
</text>
- <text
- type="string"
- font="SansSerif"
- height="16"
- layout="topleft"
- follows="left|top"
- left_pad="35"
- name="static2"
- top_delta="0"
- width="100">
- Allowed Abilities
- </text>
<scroll_list
- draw_stripes="false"
- follows="left|top"
+ draw_stripes="true"
+ follows="left|top|right"
height="150"
layout="topleft"
left="0"
+ right="-1"
name="member_assigned_roles"
- top_pad="5"
- width="130">
+ top_pad="0">
<scroll_list.columns
label=""
name="checkbox"
- width="18" />
+ width="20" />
<scroll_list.columns
label=""
name="role"
- width="107" />
+ width="270" />
</scroll_list>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top_pad="5"
+ text_color="EmphasisColor"
+ name="static2"
+ width="285">
+ Allowed Abilities
+ </text>
<scroll_list
- draw_stripes="false"
+ draw_stripes="true"
+ follows="left|top|right"
height="150"
layout="topleft"
- follows="left|top"
- left_pad="5"
+ left="0"
+ right="-1"
name="member_allowed_actions"
+ search_column="2"
tool_tip="For details of each allowed ability see the abilities tab"
- top_delta="0"
- width="130">
+ top_pad="0">
<scroll_list.columns
label=""
name="icon"
- width="14" />
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
<scroll_list.columns
label=""
name="action"
- width="126" />
+ width="270" />
</scroll_list>
</panel>
<panel
- height="252"
+ height="550"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
- left_delta="0"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
name="roles_footer"
top_delta="0"
- visible="false"
- width="270">
+ top="209"
+ visible="false">
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
- left="0"
+ follows="left|top"
+ left="5"
+ top="5"
name="static"
- top="0"
- width="100">
- Name
- </text>
- <text
- type="string"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_pad="35"
- name="static2"
- top_delta="0"
- width="100">
- Description
+ width="300">
+ Role Name
</text>
<line_editor
type="string"
- border_style="line"
- border_thickness="1"
- follows="left|top"
height="20"
layout="topleft"
left="0"
- max_length="20"
+ follows="left|top|right"
+ right="-1"
+ max_length="295"
name="role_name"
top_pad="0"
- width="130">
- Employees
+ width="300">
</line_editor>
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ follows="left|top"
+ left="5"
name="static3"
- top_pad="10"
- width="100">
- Title
+ top_pad="5"
+ width="300">
+ Role Title
</text>
<line_editor
type="string"
- border_style="line"
- border_thickness="1"
- follows="left|top"
height="20"
layout="topleft"
- left_delta="0"
- max_length="20"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length="295"
name="role_title"
top_pad="0"
- width="130">
- (waiting)
+ width="300">
</line_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static2"
+ top_pad="5"
+ width="200">
+ Description
+ </text>
<text_editor
type="string"
- halign="left"
- height="48"
layout="topleft"
- left="135"
- max_length="254"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length="295"
+ height="35"
name="role_description"
- top="16"
- width="130"
+ top_pad="0"
+ width="300"
word_wrap="true">
- (waiting)
</text_editor>
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
- left="0"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
name="static4"
- top="85"
- width="120">
+ top_pad="5"
+ width="300">
Assigned Members
</text>
- <text
- type="string"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_pad="15"
- name="static5"
- tool_tip="A list of abilities the currently selected role can perform"
- top_delta="0"
- width="100">
- Allowed Abilities
- </text>
<name_list
- draw_stripes="false"
- height="150"
+ draw_stripes="true"
+ height="128"
layout="topleft"
left="0"
+ follows="left|top|right"
+ right="-1"
name="role_assigned_members"
top_pad="0"
- width="130" />
+ width="300" />
<check_box
- height="16"
- label="Members are visible"
+ height="15"
+ label="Reveal members"
+ left="5"
layout="topleft"
- left_delta="0"
name="role_visible_in_list"
tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
- top_pad="10"
- width="130" />
+ top_pad="4"
+ width="300" />
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
+ name="static5"
+ top_pad="2"
+ width="300">
+ Allowed Abilities
+ </text>
<scroll_list
- draw_stripes="false"
- height="150"
+ draw_stripes="true"
+ height="140"
layout="topleft"
- left="135"
+ left="0"
+ follows="left|top|right"
+ right="-1"
name="role_allowed_actions"
search_column="2"
tool_tip="For details of each allowed ability see the abilities tab"
- top="101"
- width="130">
+ top_pad="0"
+ width="300">
<scroll_list.columns
label=""
name="icon"
@@ -674,81 +500,84 @@ things in this group. There&apos;s a broad variety of Abilities.
<scroll_list.columns
label=""
name="checkbox"
- width="16" />
+ width="20" />
<scroll_list.columns
label=""
name="action"
- width="220" />
+ width="270" />
</scroll_list>
</panel>
<panel
- height="215"
+ height="424"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
- left_delta="0"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
name="actions_footer"
top_delta="0"
- visible="false"
- width="265">
- <text
- type="string"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="0"
- name="static"
- top="0"
- width="200">
- Description
- </text>
+ top="255"
+ visible="false">
<text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
type="string"
enabled="false"
halign="left"
- height="48"
layout="topleft"
- left_delta="0"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
max_length="512"
name="action_description"
- top_pad="0"
- width="265"
+ top="0"
word_wrap="true">
This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
</text_editor>
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ follows="left|top"
+ left="5"
name="static2"
- top_pad="10"
- width="125">
- Roles with Ability
+ top_pad="1"
+ width="300">
+ Roles with this ability
</text>
+ <scroll_list
+ height="172"
+ layout="topleft"
+ follows="left|top|right"
+ left="5"
+ right="-1"
+ name="action_roles"
+ top_pad="0"
+ width="300" />
<text
type="string"
- font="SansSerif"
height="16"
layout="topleft"
- left_pad="10"
+ follows="left|top"
+ left="5"
name="static3"
- top_delta="0"
- width="125">
- Members with Ability
+ top_pad="5"
+ width="300">
+ Members with this ability
</text>
- <scroll_list
- height="150"
- layout="topleft"
- left="0"
- name="action_roles"
- top="90"
- width="130" />
<name_list
- height="150"
+ height="122"
+ follows="left|top|right"
layout="topleft"
- left_pad="5"
+ left="5"
+ right="-1"
name="action_members"
- top_delta="0"
- width="130" />
+ top_pad="0"
+ width="300" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index dca52def49..28c4adf67c 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -1,39 +1,175 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="panel_im_control_panel"
- width="96"
- height="225"
- border="false">
-
- <avatar_icon name="avatar_icon"
- width="96"
- height="96" />
-
- <button name="view_profile_btn"
- label="View Profile"
- left_delta="3"
- width="90"
- height="20" />
-
- <button name="add_friend_btn"
- label="Add Friend"
- width="90"
- height="20" />
-
- <button name="call_btn"
- label="Call"
- width="90"
- height="20" />
-
- <button
- height="20"
- label="End Call"
- name="end_call_btn"
- visible="false"
- width="90" />
-
- <button name="share_btn"
- label="Share"
- width="90"
- height="20" />
-
+<panel
+ border="false"
+ height="300"
+ name="panel_im_control_panel"
+ width="110">
+ <avatar_icon
+ follows="left|top"
+ height="105"
+ left_delta="5"
+ name="avatar_icon"
+ top="-5"
+ width="105"/>
+ <layout_stack
+ mouse_opaque="false"
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="168"
+ layout="topleft"
+ left="5"
+ name="button_stack"
+ orientation="vertical"
+ top_pad="5"
+ width="105">
+ <layout_panel
+ mouse_opaque="false"
+ auto_resize="true"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="2"
+ min_height="0"
+ width="100"
+ top="0"
+ name="spacer"
+ user_resize="false" />
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="20"
+ layout="topleft"
+ min_height="20"
+ width="100"
+ name="view_profile_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Profile"
+ name="view_profile_btn"
+ top="0"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="add_friend_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Add Friend"
+ name="add_friend_btn"
+ top="5"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="teleport_btn_panel"
+ user_resize="false">
+ <button
+ auto_resize="false"
+ follows="left|top|right"
+ height="23"
+ label="Teleport"
+ name="teleport_btn"
+ tool_tip = "Offer to teleport this person"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="share_btn_panel"
+ user_resize="false">
+ <button
+ auto_resize="true"
+ follows="left|top|right"
+ height="23"
+ label="Share"
+ name="share_btn"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="share_btn_panel"
+ user_resize="false">
+ <button
+ auto_resize="true"
+ follows="left|top|right"
+ height="23"
+ label="Pay"
+ name="pay_btn"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="call_btn_panel"
+ user_resize="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Call"
+ name="call_btn"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="end_call_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Leave Call"
+ name="end_call_btn"
+ width="100" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="top|left|right"
+ height="25"
+ layout="topleft"
+ min_height="25"
+ width="100"
+ name="voice_ctrls_btn_panel"
+ user_resize="false"
+ visible="false">
+ <button
+ follows="left|top|right"
+ height="23"
+ label="Voice Controls"
+ name="voice_ctrls_btn"
+ width="100" />
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index 26d8304551..34fd3352a3 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
- bg_alpha_color="0.3 0.3 0.3 0"
- height="175"
+ height="152"
label="im_panel"
layout="topleft"
left="0"
@@ -18,79 +17,82 @@
bevel_style="in"
bg_alpha_color="black"
follows="top"
- height="20"
+ height="24"
label="im_header"
layout="topleft"
left="5"
+ mouse_opaque="false"
name="im_header"
top="5"
width="295">
<avatar_icon
follows="right"
- height="20"
- image_name="icon_avatar_online.tga"
+ height="18"
+ image_name="Generic_Person"
layout="topleft"
- left="0"
- mouse_opaque="true"
+ left="3"
+ mouse_opaque="false"
name="avatar_icon"
- top="0"
- width="20" />
- <icon
+ top="3"
+ width="18" />
+ <group_icon
follows="right"
- height="20"
- image_name="icon_top_pick.tga"
+ height="18"
+ default_icon_name="Generic_Group"
layout="topleft"
- left="0"
- mouse_opaque="true"
- name="sys_msg_icon"
- top="0"
- width="20" />
+ left="3"
+ mouse_opaque="false"
+ name="group_icon"
+ top="3"
+ width="18" />
+ <avatar_icon
+ color="Green"
+ follows="right"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="adhoc_icon"
+ top="3"
+ width="18" />
<text
follows="left|right"
- font="SansSerifBold"
- height="20"
+ font.style="BOLD"
+ height="12"
layout="topleft"
left_pad="5"
name="user_name"
text_color="white"
- top="5"
- value="Darth Vader"
- width="295" />
+ top="8"
+ use_ellipses="true"
+ value="Erica Vader"
+ width="212" />
<!-- TIME STAMP -->
<text
+ font="SansSerifSmall"
follows="right"
- font="SansSerif"
- height="20"
+ height="13"
layout="topleft"
halign="right"
- left="245"
+ right="-5"
name="time_box"
- text_color="white"
- top="5"
+ top="8"
value="23:30"
width="50" />
</panel>
<text
- follows="left|top|bottom|right"
- height="86"
+ font="SansSerifSmall"
+ follows="all"
+ height="97"
layout="topleft"
left="10"
name="message"
text_color="white"
top="33"
use_ellipses="true"
- value="MESSAGE"
+ value=""
width="285"
word_wrap="true"
max_length="350" />
- <button
- follows="bottom"
- font="SansSerifBold"
- height="25"
- label="Reply"
- layout="topleft"
- left="97"
- name="reply"
- top="137"
- width="110" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
new file mode 100644
index 0000000000..66070c028d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="landmark_info"
+ top="20"
+ width="333">
+ <string
+ name="title_create_landmark"
+ value="Create Landmark" />
+ <string
+ name="title_edit_landmark"
+ value="Edit Landmark" />
+ <string
+ name="title_landmark"
+ value="Landmark" />
+ <string
+ name="not_available"
+ value="(N\A)" />
+ <string
+ name="unknown"
+ value="(unknown)" />
+ <string
+ name="public"
+ value="(public)" />
+ <string
+ name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string
+ name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string
+ name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string
+ name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <!-- Texture names for rating icons -->
+ <string
+ name="icon_PG"
+ value="Parcel_PG_Dark" />
+ <string
+ name="icon_M"
+ value="Parcel_M_Dark" />
+ <string
+ name="icon_R"
+ value="Parcel_R_Dark" />
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="11"
+ name="back_btn"
+ tool_tip="Back"
+ tab_stop="false"
+ top="4"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="2"
+ use_ellipses="true"
+ value="Place Profile"
+ width="280" />
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="532"
+ layout="topleft"
+ left="9"
+ name="place_scroll"
+ opaque="true"
+ top_pad="10"
+ width="310">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="left|top|right"
+ height="700"
+ layout="topleft"
+ left="0"
+ min_height="300"
+ name="scrolling_panel"
+ top="0"
+ width="285">
+ <texture_picker
+ enabled="false"
+ follows="left|top|right"
+ height="197"
+ layout="topleft"
+ left="11"
+ name="logo"
+ top="10"
+ width="290" />
+ <text
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="region_title"
+ text_color="white"
+ top_pad="10"
+ use_ellipses="true"
+ value="SampleRegion"
+ width="280" />
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="parcel_title"
+ top_pad="10"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="280" />
+ <expandable_text
+ follows="left|top|right"
+ height="50"
+ layout="topleft"
+ left="10"
+ name="description"
+ top_pad="10"
+ value="Du waltz die spritz"
+ width="280" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="unknown"
+ layout="topleft"
+ left="10"
+ name="maturity_icon"
+ top_pad="10"
+ width="18" />
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ name="maturity_value"
+ top_pad="-13"
+ value="unknown"
+ width="268" />
+ <panel
+ follows="left|top|right"
+ height="55"
+ layout="topleft"
+ left="10"
+ name="landmark_info_panel"
+ top_pad="10"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="owner_label"
+ top_pad="10"
+ value="Owner:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="owner"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="creator_label"
+ value="Creator:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="creator"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="created_label"
+ value="Created:"
+ width="50" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="created"
+ top_delta="0"
+ width="200" />
+ </panel>
+ <panel
+ follows="left|top|right"
+ height="210"
+ layout="topleft"
+ left="10"
+ name="landmark_edit_panel"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="title_label"
+ top_pad="10"
+ value="Title:"
+ width="290" />
+ <text
+ allow_html="false"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="0"
+ name="title_value"
+ text_color="white"
+ top_pad="5"
+ use_ellipses="true"
+ width="290" />
+ <line_editor
+ follows="left|top|right"
+ height="22"
+ layout="topleft"
+ left="0"
+ max_length="63"
+ name="title_editor"
+ prevalidate_callback="ascii"
+ text_readonly_color="white"
+ top_delta="0"
+ width="290" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="notes_label"
+ top_pad="10"
+ value="My notes:"
+ width="290" />
+ <text_editor
+ bg_readonly_color="DkGray2"
+ follows="all"
+ height="70"
+ layout="topleft"
+ left="0"
+ max_length="127"
+ name="notes_editor"
+ read_only="true"
+ text_readonly_color="white"
+ text_type="ascii"
+ top_pad="5"
+ width="290"
+ wrap="true" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="folder_label"
+ top_pad="15"
+ value="Landmark location:"
+ width="290" />
+ <combo_box
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="folder_combo"
+ top_pad="5"
+ width="200" />
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 5293043ba7..fdc26b5c46 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -6,7 +6,8 @@
layout="topleft"
left="0"
width="380"
- border="true"
+ help_topic="panel_landmarks"
+ border="false"
background_visible="true"
bg_alpha_color="DkGray2"
follows="left|top|right|bottom">
@@ -16,79 +17,82 @@
layout="topleft"
left="0"
name="landmarks_accordion"
- top="2"
+ top="0"
width="380">
<accordion_tab
layout="topleft"
name="tab_favorites"
title="Favorites bar">
- <inventory_subtree_panel
+ <places_inventory_panel
allow_multi_select="true"
- border="true"
+ border="false"
bottom="0"
follows="left|top|right|bottom"
height="126"
left="0"
mouse_opaque="true"
name="favorites_list"
- start_folder="favorite"
+ start_folder="Favorites"
width="380"/>
</accordion_tab>
<accordion_tab
layout="topleft"
name="tab_landmarks"
- title="Landmarks">
- <inventory_subtree_panel
+ title="My Landmarks">
+ <places_inventory_panel
allow_multi_select="true"
- border="true"
+ border="false"
bottom="0"
follows="left|top|right|bottom"
height="126"
left="0"
mouse_opaque="true"
name="landmarks_list"
- start_folder="landmark"
+ start_folder="Landmarks"
width="380"/>
</accordion_tab>
<accordion_tab
layout="topleft"
name="tab_inventory"
title="My Inventory">
- <inventory_subtree_panel
+ <places_inventory_panel
allow_multi_select="true"
- border="true"
+ border="false"
bottom="0"
follows="left|top|right|bottom"
height="126"
left="0"
mouse_opaque="true"
name="my_inventory_list"
- start_folder="inventory"
+ start_folder="My Inventory"
width="380"/>
- </accordion_tab>
- <accordion_tab
- layout="topleft"
- name="tab_library"
- title="Library">
- <inventory_subtree_panel
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ name="tab_library"
+ title="Library">
+ <places_inventory_panel
allow_multi_select="true"
- border="true"
+ border="false"
bottom="0"
follows="left|top|right|bottom"
height="120"
left="0"
mouse_opaque="true"
name="library_list"
- start_folder="library"
+ start_folder="LIBRARY"
width="380"/>
</accordion_tab>
</accordion>
<panel
- background_visible="true"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
bevel_style="none"
bottom="0"
follows="left|right|bottom"
- height="30"
+ height="38"
layout="bottomleft"
left="0"
name="bottom_panel"
@@ -103,8 +107,7 @@
layout="topleft"
left="10"
name="options_gear_btn"
- picture_style="true"
- top="6"
+ top="14"
width="18" />
<button
follows="bottom|left"
@@ -113,9 +116,8 @@
image_unselected="AddItem_Off"
image_disabled="AddItem_Disabled"
layout="topleft"
- left_pad="5"
+ left_pad="10"
name="add_btn"
- picture_style="true"
tool_tip="Add new landmark"
width="18" />
<dnd_button
@@ -124,11 +126,10 @@
image_selected="TrashItem_Press"
image_unselected="TrashItem_Off"
layout="topleft"
- right="-5"
+ right="-8"
name="trash_btn"
- picture_style="true"
tool_tip="Remove selected landmark"
- top="6"
+ top="14"
width="18" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index afe00271f7..627e616af5 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -1,218 +1,234 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="all"
- height="600"
- layout="topleft"
- left="0"
- name="panel_login"
- top="600"
- width="800">
- <panel.string
+follows="all"
+height="600"
+layout="topleft"
+left="0"
+name="panel_login"
+top="600"
+ width="996">
+<panel.string
name="create_account_url">
- http://join.secondlife.com/
- </panel.string>
- <panel.string
- name="real_url">
- http://secondlife.com/app/login/
- </panel.string>
- <panel.string
+ http://join.secondlife.com/
+</panel.string>
+<panel.string
+ name="real_url" translate="false">
+ http://secondlife.com/app/login/
+</panel.string>
+ <string name="reg_in_client_url" translate="false">
+ http://secondlife.eniac15.lindenlab.com/reg-in-client/
+</string>
+<panel.string
name="forgot_password_url">
- http://secondlife.com/account/request.php
- </panel.string>
- <web_browser
- border_visible="false"
- bottom="600"
- follows="all"
- layout="topleft"
- left="0"
- name="login_html"
- right="-1"
- start_url=""
- top="1" />
- <text
- type="string"
- length="1"
- follows="left|bottom"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="32"
- name="first_name_text"
- top="530"
- width="120">
- First Name:
- </text>
- <line_editor
- follows="left|bottom"
- handle_edit_keys_directly="true"
- height="20"
- layout="topleft"
- left_delta="0"
- max_length="31"
- name="first_name_edit"
- select_on_focus="true"
- tool_tip="[SECOND_LIFE] First Name"
- top_pad="2"
- width="120" />
- <text
- type="string"
- length="1"
- follows="left|bottom"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="164"
- name="last_name_text"
- top="530"
- width="120">
- Last Name:
- </text>
- <line_editor
- follows="left|bottom"
- font="SansSerif"
- handle_edit_keys_directly="true"
- height="20"
- layout="topleft"
- left_delta="0"
- max_length="31"
- name="last_name_edit"
- select_on_focus="true"
- tool_tip="[SECOND_LIFE] Last Name"
- top_pad="2"
- width="120" />
- <text
- type="string"
- length="1"
- follows="left|bottom"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="296"
- name="password_text"
- top="530"
- width="120">
- Password:
- </text>
- <line_editor
- follows="left|bottom"
- font="SansSerif"
- handle_edit_keys_directly="true"
- height="20"
- layout="topleft"
- left_delta="0"
- max_length="16"
- name="password_edit"
- select_on_focus="true"
- top_pad="2"
- width="120" />
- <button
- follows="left|bottom"
- height="23"
- label="Log In"
- label_selected="Log In"
- layout="topleft"
- left="425"
- name="connect_btn"
- top="546"
- width="100" />
- <combo_box
- allow_text_entry="true"
- follows="left|bottom"
- height="23"
- layout="topleft"
- left_pad="5"
- name="server_combo"
- width="100" />
- <text
- type="string"
- length="1"
- follows="left|bottom"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="32"
- name="start_location_text"
- top="576"
- width="95">
- Start location:
- </text>
- <combo_box
- allow_text_entry="true"
- control_name="LoginLocation"
- follows="left|bottom"
- height="23"
- layout="topleft"
- left_pad="0"
- max_chars="128"
- name="start_location_combo"
- top_delta="-2"
- width="155">
- <combo_box.item
- label="My Last Location"
- name="MyLastLocation"
+ http://secondlife.com/account/request.php
+</panel.string>
+<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
+<web_browser
+bg_opaque_color="Black"
+border_visible="false"
+bottom="600"
+follows="all"
+hide_loading="true"
+left="0"
+name="login_html"
+start_url=""
+top="0"
+height="600"
+ width="980" />
+<layout_stack
+follows="left|bottom|right"
+name="login_widgets"
+layout="topleft"
+orientation="horizontal"
+top="519"
+width="996"
+height="80">
+<layout_panel
+auto_resize="false"
+follows="left|bottom"
+name="login"
+layout="topleft"
+width="695"
+min_width="695"
+user_resize="false"
+height="80">
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+name="first_name_text"
+top="20"
+left="20"
+width="150">
+First name:
+</text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+height="22"
+label="First"
+left_delta="0"
+max_length="31"
+name="first_name_edit"
+select_on_focus="true"
+tool_tip="[SECOND_LIFE] First Name"
+top_pad="0"
+ width="135" />
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="16"
+ left_pad="8"
+ name="last_name_text"
+ top="20"
+ width="150">
+ Last name: </text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+height="22"
+label="Last"
+max_length="31"
+name="last_name_edit"
+select_on_focus="true"
+tool_tip="[SECOND_LIFE] Last Name"
+ top_pad="0"
+ width="135" />
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="15"
+left_pad="8"
+name="password_text"
+top="20"
+ width="150">
+ Password:
+</text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+ height="22"
+ max_length="16"
+name="password_edit"
+select_on_focus="true"
+ top_pad="0"
+ width="135" />
+ <check_box
+control_name="RememberPassword"
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+label="Remember password"
+ top_pad="3"
+ name="remember_check"
+ width="135" />
+<button
+ follows="left|bottom"
+ height="23"
+ image_unselected="PushButton_On"
+ image_selected="PushButton_On_Selected"
+ label="Log In"
+ label_color="White"
+ layout="topleft"
+ left_pad="10"
+ name="connect_btn"
+ top="35"
+ width="90" />
+ <text
+ follows="left|bottom"
+ font="SansSerifSmall"
+ height="15"
+ left_pad="18"
+ name="start_location_text"
+top="20"
+ width="130">
+ Start at:
+ </text>
+<combo_box
+allow_text_entry="true"
+control_name="LoginLocation"
+ follows="left|bottom"
+ height="23"
+max_chars="128"
+top_pad="0"
+name="start_location_combo"
+ width="135">
+<combo_box.item
+label="My last location"
+name="MyLastLocation"
value="last" />
- <combo_box.item
- label="My Home"
- name="MyHome"
+<combo_box.item
+label="My home"
+name="MyHome"
value="home" />
- <combo_box.item
- label="&lt;Type region name&gt;"
- name="Typeregionname"
- value="" />
- </combo_box>
- <check_box
- control_name="RememberPassword"
- follows="left|bottom"
- height="16"
- label="Remember password"
- layout="topleft"
- left_pad="10"
- name="remember_check"
- top_delta="3"
- width="138" />
- <text
- type="string"
- length="1"
- follows="right|bottom"
- halign="right"
- height="16"
- hover="true"
- hover_color="0.2 0.45 0.72 1"
- layout="topleft"
- left="-210"
- name="create_new_account_text"
- top="539"
- width="200">
- Create a new account
- </text>
- <text
- type="string"
- length="1"
- follows="right|bottom"
- halign="right"
- height="16"
- hover="true"
- hover_color="0.2 0.45 0.72 1"
- layout="topleft"
- left_delta="0"
- name="forgot_password_text"
- top_pad="4"
- width="200">
- Forgot your name or password?
- </text>
- <text
- type="string"
- length="1"
- follows="right|bottom"
- halign="right"
- height="16"
- hover="true"
- hover_color="0.2 0.45 0.72 1"
- layout="topleft"
- left="-310"
- name="channel_text"
- top="579"
- width="300">
- [VERSION]
- </text>
+<combo_box.item
+label="&lt;Type region name&gt;"
+name="Typeregionname" value="" />
+</combo_box>
+<combo_box
+allow_text_entry="true"
+font="SansSerifSmall"
+ follows="left|right|bottom"
+ height="23"
+layout="topleft"
+top_pad="2"
+name="server_combo"
+width="135"
+ visible="false" />
+</layout_panel>
+<layout_panel
+follows="right|bottom"
+name="links"
+width="200"
+min_width="200"
+user_resize="false"
+height="80">
+ <text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+top="12"
+right="-10"
+name="create_new_account_text"
+ width="180">
+ Sign up
+ </text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="forgot_password_text"
+top_pad="12"
+right="-10"
+ width="180">
+ Forgot your name or password?
+</text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="login_help"
+top_pad="2"
+right="-10"
+ width="180">
+ Need help logging in? </text>
+<!-- <text
+ follows="right|bottom"
+ font="SansSerifSmall"
+ halign="right"
+ height="28"
+ top_pad="2"
+ name="channel_text"
+ width="180"
+ word_wrap="true">
+ [VERSION]
+ </text>-->
+ </layout_panel>
+</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
new file mode 100644
index 0000000000..e6f67078d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="408"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ name="main inventory panel"
+ width="330">
+ <panel.string
+ name="Title">
+ Things
+ </panel.string>
+ <menu_bar
+ bg_visible="false"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left="10"
+ mouse_opaque="false"
+ name="Inventory Menu"
+ top="0"
+ visible="true"
+ width="290">
+ <menu
+ height="101"
+ label="File"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="File"
+ tear_off="true"
+ top="-117"
+ width="128">
+ <menu_item_call
+ label="Open"
+ layout="topleft"
+ name="Open">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open" />
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="Upload"
+ layout="topleft"
+ name="upload"
+ tear_off="true">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ layout="topleft"
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound (L$[COST])..."
+ layout="topleft"
+ name="Upload Sound">
+ <menu_item_call.on_click
+ function="File.UploadSound"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation (L$[COST])..."
+ layout="topleft"
+ name="Upload Animation">
+ <menu_item_call.on_click
+ function="File.UploadAnim"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Bulk (L$[COST] per file)..."
+ layout="topleft"
+ name="Bulk Upload">
+ <menu_item_call.on_click
+ function="File.UploadBulk"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ </menu>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="New Window"
+ layout="topleft"
+ name="New Window">
+ <menu_item_call.on_click
+ function="Inventory.NewWindow" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="separator2" />
+ <menu_item_call
+ label="Show Filters"
+ layout="topleft"
+ name="Show Filters">
+ <menu_item_call.on_click
+ function="Inventory.ShowFilters" />
+ </menu_item_call>
+ <menu_item_call
+ label="Reset Filters"
+ layout="topleft"
+ name="Reset Current">
+ <menu_item_call.on_click
+ function="Inventory.ResetFilters" />
+ </menu_item_call>
+ <menu_item_call
+ label="Close All Folders"
+ layout="topleft"
+ name="Close All Folders">
+ <menu_item_call.on_click
+ function="Inventory.CloseAllFolders" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="separator3" />
+ <menu_item_call
+ label="Empty Trash"
+ layout="topleft"
+ name="Empty Trash">
+ <menu_item_call.on_click
+ function="Inventory.EmptyTrash" />
+ </menu_item_call>
+ <menu_item_call
+ label="Empty Lost And Found"
+ layout="topleft"
+ name="Empty Lost And Found">
+ <menu_item_call.on_click
+ function="Inventory.EmptyLostAndFound" />
+ </menu_item_call>
+ </menu>
+ <menu
+ height="121"
+ label="Create"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="Create"
+ tear_off="true"
+ top="-201"
+ width="121">
+ <menu_item_call
+ label="New Folder"
+ layout="topleft"
+ name="New Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="category" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Script"
+ layout="topleft"
+ name="New Script">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="lsl" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Notecard"
+ layout="topleft"
+ name="New Note">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="notecard" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gesture"
+ layout="topleft"
+ name="New Gesture">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gesture" />
+ </menu_item_call>
+ <menu
+ height="175"
+ label="New Clothes"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Clothes"
+ top_pad="514"
+ width="125">
+ <menu_item_call
+ label="New Shirt"
+ layout="topleft"
+ name="New Shirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Pants"
+ layout="topleft"
+ name="New Pants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Shoes"
+ layout="topleft"
+ name="New Shoes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Socks"
+ layout="topleft"
+ name="New Socks">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Jacket"
+ layout="topleft"
+ name="New Jacket">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skirt"
+ layout="topleft"
+ name="New Skirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gloves"
+ layout="topleft"
+ name="New Gloves">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Undershirt"
+ layout="topleft"
+ name="New Undershirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Underpants"
+ layout="topleft"
+ name="New Underpants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Alpha"
+ layout="topleft"
+ name="New Alpha">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Tattoo"
+ layout="topleft"
+ name="New Tattoo">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="tattoo" />
+ </menu_item_call>
+ </menu>
+ <menu
+ height="85"
+ label="New Body Parts"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Body Parts"
+ top_pad="514"
+ width="118">
+ <menu_item_call
+ label="New Shape"
+ layout="topleft"
+ name="New Shape">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shape" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skin"
+ layout="topleft"
+ name="New Skin">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skin" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Hair"
+ layout="topleft"
+ name="New Hair">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="hair" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Eyes"
+ layout="topleft"
+ name="New Eyes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="eyes" />
+ </menu_item_call>
+ </menu>
+ </menu>
+ <menu
+ height="49"
+ label="Sort"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="Sort"
+ tear_off="true"
+ top="-113"
+ width="118">
+ <menu_item_check
+ control_name="Inventory.SortByName"
+ label="By Name"
+ layout="topleft"
+ name="By Name">
+ <menu_item_check.on_click
+ function="Inventory.SetSortBy"
+ parameter="name" />
+ </menu_item_check>
+ <menu_item_check
+ control_name="Inventory.SortByDate"
+ label="By Date"
+ layout="topleft"
+ name="By Date">
+ <menu_item_check.on_click
+ function="Inventory.SetSortBy"
+ parameter="date" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_check
+ control_name="Inventory.FoldersAlwaysByName"
+ label="Folders Always By Name"
+ layout="topleft"
+ name="Folders Always By Name">
+ <menu_item_check.on_click
+ function="Inventory.SetSortBy"
+ parameter="foldersalwaysbyname" />
+ </menu_item_check>
+ <menu_item_check
+ control_name="Inventory.SystemFoldersToTop"
+ label="System Folders To Top"
+ layout="topleft"
+ name="System Folders To Top">
+ <menu_item_check.on_click
+ function="Inventory.SetSortBy"
+ parameter="systemfolderstotop" />
+ </menu_item_check>
+ </menu>
+ </menu_bar>
+ <filter_editor
+ text_pad_left="10"
+ follows="left|top|right"
+ height="23"
+ label="Filter Inventory"
+ layout="topleft"
+ left="10"
+max_length="300"
+ name="inventory search editor"
+ top="26"
+ width="303" />
+ <tab_container
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+follows="all"
+halign="center"
+ height="305"
+ layout="topleft"
+ left="6"
+ name="inventory filter tabs"
+ tab_height="30"
+ tab_position="top"
+ tab_min_width="100"
+ top_pad="10"
+ width="315">
+ <inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ height="295"
+ label="MY INVENTORY"
+ help_topic="my_inventory_tab"
+ layout="topleft"
+ left="0"
+ name="All Items"
+ top="16"
+ width="290" />
+ <inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ height="295"
+ label="RECENT"
+ help_topic="recent_inventory_tab"
+ layout="topleft"
+ left_delta="0"
+ name="Recent Items"
+ width="290" />
+ </tab_container>
+
+ <panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ bevel_style="none"
+ follows="left|right|bottom"
+ height="38"
+ layout="topleft"
+ top_pad="-1"
+ left="9"
+ name="bottom_panel"
+ width="310">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="18"
+ image_disabled="OptionsMenu_Disabled"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ layout="topleft"
+ left="8"
+ name="options_gear_btn"
+ top="14"
+ width="18" />
+ <button
+ follows="bottom|left"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left_pad="10"
+ name="add_btn"
+ tool_tip="Add new item"
+ width="18" />
+ <dnd_button
+ follows="bottom|right"
+ height="18"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ right="-7"
+ name="trash_btn"
+ tool_tip="Remove selected item"
+ top="14"
+ width="18" />
+ </panel>
+
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
new file mode 100644
index 0000000000..63c522ac69
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ border="false"
+ follows="all"
+ height="570"
+ label="My Profile"
+ layout="topleft"
+ left="0"
+ name="panel_me"
+ top="0"
+ width="333">
+ <!--<text
+ type="string"
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="15"
+ name="user_name"
+ text_color="white"
+ top="0"
+ mouse_opaque="true"
+ width="280">
+ (Loading...)
+ </text> -->
+ <tab_container
+ follows="all"
+ height="575"
+ halign="center"
+ layout="topleft"
+ left="5"
+ name="tabs"
+ tab_min_width="95"
+ tab_height="30"
+ tab_position="top"
+ top_pad="10"
+ width="317">
+ <panel
+ class="panel_my_profile"
+ filename="panel_my_profile.xml"
+ label="MY PROFILE"
+ help_topic="panel_my_profile_tab"
+ name="panel_profile" />
+ <panel
+ class="panel_picks"
+ filename="panel_picks.xml"
+ label="MY PICKS"
+ help_topic="panel_my_picks_tab"
+ name="panel_picks" />
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index cc47e99c2c..38e8b9844f 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -10,24 +10,35 @@
name="Media Settings General"
help_topic = "media_settings_general"
width="365">
-
- <text
- bottom_delta="-17"
- follows="top|left"
- height="15"
- left="10"
- name="">
- Home URL:
+
+ <text
+ bottom_delta="-25"
+ follows="top|left"
+ height="15"
+ left="10"
+ name="home_label">
+ Home Page:
+ </text>
+ <text
+ visible="false"
+ bottom_delta="0"
+ follows="top|left"
+ height="15"
+ left_delta="64"
+ text_color="red"
+ name="home_fails_whitelist_label">
+ (This page does not pass the specified whitelist)
</text>
<line_editor
- bottom_delta="-21"
+ max_length="1024"
+ bottom_delta="-24"
enabled="true"
follows="left|top"
font="SansSerif"
height="20"
left="10"
name="home_url"
- tool_tip="The home URL for this media source"
+ tool_tip="The home page for this media source"
width="340">
<!-- <line_editor.commit_callback
function="Media.CommitHomeURL"/> -->
@@ -49,7 +60,7 @@
follows="top|left"
height="15"
left="164"
- name="">
+ name="preview_label">
Preview
</text>
@@ -59,17 +70,19 @@
height="15"
left="10"
name="current_url_label">
- Current URL:
+ Current Page:
</text>
- <line_editor
+ <text
+ name="current_url"
+ max_length="1024"
+ use_ellipses="true"
bottom_delta="-20"
enabled="false"
follows="left|top"
font="SansSerif"
height="20"
left="10"
- name="current_url"
- tool_tip="The current URL for this media source"
+ tool_tip="The current page for this media source"
value=""
width="340" />
<button
@@ -83,43 +96,6 @@
<button.commit_callback
function="Media.ResetCurrentUrl"/>
</button>
- <text
- bottom_delta="-5"
- follows="top|left"
- height="15"
- left="10"
- name="">
- Controls:
- </text>
- <combo_box
- allow_text_entry="false"
- bottom_delta="-20"
- enabled="true"
- follows="left|top"
- height="18"
- left="10"
- max_chars="20"
- mouse_opaque="true"
- name="controls"
- width="120">
- <combo_item
- type="string"
- length="1"
- enabled="true"
- name="Standard"
- value="Standard">
- Standard
- </combo_item>
- <combo_item
- type="string"
- length="1"
- enabled="true"
- name="Mini"
- value="Mini">
- Mini
- </combo_item>
- </combo_box>
-
<check_box
bottom_delta="-25"
enabled="true"
@@ -133,7 +109,6 @@
name="auto_loop"
radio_style="false"
width="150" />
-
<check_box
bottom_delta="-25"
visible="false"
@@ -207,7 +182,7 @@
follows="top|left"
height="15"
left="30"
- name="">
+ name="size_label">
Size:
</text>
@@ -228,13 +203,24 @@
name="width_pixels"
width="50" />
- <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="">
- X
+ <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label">
+ X
</text>
- <spinner bottom_delta="0"
- decimal_digits="0" enabled="true" follows="left|top" height="16"
- increment="1" initial_val="256" label="" label_width="0"
- left_delta="20" max_val="2048" min_val="0" mouse_opaque="true"
- name="height_pixels" width="50" />
+ <spinner
+ bottom_delta="0"
+ decimal_digits="0"
+ enabled="true"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_val="256"
+ label=""
+ label_width="0"
+ left_delta="20"
+ max_val="2048"
+ min_val="0"
+ mouse_opaque="true"
+ name="height_pixels"
+ width="50" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
index 85f534c4a3..b5c2371510 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
@@ -4,13 +4,42 @@
enabled="true"
follows="left|top|right|bottom"
height="500"
- label="Controls"
+ label="Customize"
left="102"
mouse_opaque="true"
name="Media settings for controls"
help_topic = "media_settings_controls"
width="365">
+ <text
+ bottom_delta="-50"
+ follows="top|left"
+ height="15"
+ left="10"
+ name="controls_label">
+ Controls:
+ </text>
+ <combo_box
+ allow_text_entry="false"
+ bottom_delta="0"
+ follows="left|top"
+ height="18"
+ left="100"
+ max_chars="20"
+ name="controls"
+ width="120">
+ <combo_item
+ name="Standard"
+ value="Standard">
+ Standard
+ </combo_item>
+ <combo_item
+ name="Mini"
+ value="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+
<text
bottom_delta="-50"
follows="top|left"
@@ -27,7 +56,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Disable Navigation &amp; Interactivity"
+ label="Allow Navigation &amp; Interactivity"
left="30"
mouse_opaque="true"
name="perms_owner_interact"
@@ -41,7 +70,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Hide Control Bar"
+ label="Show Control Bar"
left="30"
mouse_opaque="true"
name="perms_owner_control"
@@ -74,7 +103,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Disable Navigation &amp; Interactivity"
+ label="Allow Navigation &amp; Interactivity"
left="30"
mouse_opaque="true"
name="perms_group_interact"
@@ -88,7 +117,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Hide Control Bar"
+ label="Show Control Bar"
left="30"
mouse_opaque="true"
name="perms_group_control"
@@ -111,7 +140,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Disable Navigation &amp; Interactivity"
+ label="Allow Navigation &amp; Interactivity"
left="30"
mouse_opaque="true"
name="perms_anyone_interact"
@@ -125,7 +154,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Hide Control Bar"
+ label="Show Control Bar"
left="30"
mouse_opaque="true"
name="perms_anyone_control"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
index a26f74844e..1f580831f9 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
@@ -17,7 +17,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Only Allow Access to Specified URLs (by prefix)"
+ label="Only Allow Access to Specified URL patterns"
left="10"
mouse_opaque="true"
name="whitelist_enable"
@@ -30,8 +30,28 @@
name="whitelist"
width="315"
enabled="true" />
+ <icon
+ bottom_delta="-23"
+ right="-35"
+ width="16"
+ height="16"
+ image_name="Parcel_Exp_Color"
+ mouse_opaque="true"
+ follows="top|left"
+ name="Parcel_Exp_Color"
+ />
+ <text
+ visible="true"
+ follows="top|left"
+ height="15"
+ left="30"
+ bottom_delta="0"
+ text_color="0.4 0.4 0.4 1.0"
+ name="home_url_fails_some_items_in_whitelist">
+ Entries that the home page fails against are marked:
+ </text>
<button
- bottom_delta="-30"
+ bottom_delta="-36"
follows="top|left"
height="20"
label="Add"
@@ -54,4 +74,16 @@
<button.commit_callback
function="Media.whitelistDelete"/>
</button>
+ <text
+ visible="true"
+ bottom_delta="-75"
+ follows="top|left"
+ height="40"
+ left="30"
+ text_color="0.6 0.0 0.0 1.0"
+ word_wrap="true"
+ name="home_url_fails_whitelist">
+Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
+ </text>
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
new file mode 100644
index 0000000000..4112b65635
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="all"
+ height="535"
+ label="Profile"
+ layout="topleft"
+ left="0"
+ name="panel_profile"
+ top="0"
+ width="315">
+ <string
+ name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string
+ name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=en
+ </string>
+ <string
+ name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string
+ name="my_account_link_url"
+ value="http://secondlife.com/account" />
+ <string
+ name="no_partner_text"
+ value="None" />
+ <string
+ name="no_group_text"
+ value="None" />
+ <string
+ name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="522"
+ width="315"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="492"
+ user_resize="false"
+ width="315">
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="profile_scroll"
+ opaque="true"
+ height="488"
+ width="315"
+ top="0">
+ <panel
+ layout="topleft"
+ follows="left|top|right"
+ height="488"
+ name="scroll_content_panel"
+ top="0"
+ left="0"
+ width="297">
+ <panel
+ follows="left|top|right"
+ height="117"
+ layout="topleft"
+ left="10"
+ name="second_life_image_panel"
+ top="0"
+ width="297">
+ <texture_picker
+ allow_no_texture="true"
+ default_image_name="None"
+ enabled="false"
+ follows="top|left"
+ height="124"
+ layout="topleft"
+ left="3"
+ name="2nd_life_pic"
+ top="10"
+ width="102" />
+ <icon
+ height="102"
+ image_name="Blank"
+ layout="topleft"
+ name="2nd_life_edit_icon"
+ label=""
+ left="3"
+ tool_tip="Click the Edit Profile button below to change image"
+ top="10"
+ width="102" />
+ <text
+ follows="left|top|right"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="title_sl_descr_text"
+ text_color="white"
+ top_delta="0"
+ value="[SECOND_LIFE]:"
+ width="180" />
+ <expandable_text
+ follows="left|top|right"
+ height="95"
+ layout="topleft"
+ left="107"
+ textbox.max_length="512"
+ name="sl_description_edit"
+ top_pad="-3"
+ translate="false"
+ width="181"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+ </expandable_text>
+ </panel>
+ <panel
+ follows="left|top|right"
+ height="117"
+ layout="topleft"
+ top_pad="0"
+ left="10"
+ name="first_life_image_panel"
+ width="297">
+ <texture_picker
+ allow_no_texture="true"
+ default_image_name="None"
+ enabled="false"
+ follows="top|left"
+ height="124"
+ layout="topleft"
+ left="3"
+ name="real_world_pic"
+ width="102" />
+ <icon
+ height="102"
+ image_name="Blank"
+ layout="topleft"
+ name="real_world_edit_icon"
+ label=""
+ left="3"
+ tool_tip="Click the Edit Profile button below to change image"
+ top="4"
+ width="102" />
+ <text
+ follows="left|top|right"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="title_rw_descr_text"
+ text_color="white"
+ top_delta="0"
+ value="Real World:"
+ width="180" />
+ <expandable_text
+ follows="left|top|right"
+ height="95"
+ layout="topleft"
+ left="107"
+ textbox.max_length="512"
+ name="fl_description_edit"
+ top_pad="-3"
+ translate="false"
+ width="181"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+ </expandable_text>
+ </panel>
+ <text
+ follows="left|top"
+ height="15"
+ font.style="BOLD"
+ font="SansSerifMedium"
+ layout="topleft"
+ left="10"
+ name="homepage_edit"
+ top_pad="0"
+ translate="false"
+ value="http://librarianavengers.org"
+ width="300"
+ word_wrap="false"
+ use_ellipses="true"
+ />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="title_member_text"
+ text_color="white"
+ top_pad="10"
+ value="Resident Since:"
+ width="300" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="register_date"
+ read_only="true"
+ translate="false"
+ v_pad="0"
+ value="05/31/2376"
+ width="300"
+ word_wrap="true" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="title_acc_status_text"
+ text_color="white"
+ top_pad="5"
+ value="Account Status:"
+ width="300" />
+ <!-- <text
+ type="string"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="my_account_link"
+ top_delta="0"
+ value="Go to Dashboard"
+ width="100"/> -->
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ height="28"
+ layout="topleft"
+ left="10"
+ name="acc_status_text"
+ read_only="true"
+ top_pad="0"
+ translate="false"
+ v_pad="0"
+ width="300"
+ word_wrap="true">
+ Resident. No payment info on file.
+ Linden.
+ </text_editor>
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="title_partner_text"
+ text_color="white"
+ top_pad="3"
+ value="Partner:"
+ width="300" />
+ <panel
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="partner_data_panel"
+ top_pad="0"
+ width="300">
+ <name_box
+ follows="left|top"
+ height="10"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left="0"
+ link="true"
+ name="partner_text"
+ top="0"
+ width="300"
+ word_wrap="true" />
+ </panel>
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="13"
+ layout="topleft"
+ left="10"
+ name="title_groups_text"
+ text_color="white"
+ top_pad="3"
+ value="Groups:"
+ width="300" />
+ <expandable_text
+ follows="all"
+ height="113"
+ layout="topleft"
+ left="7"
+ name="sl_groups"
+ top_pad="0"
+ translate="false"
+ width="298"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. Aenean viverra tulip moosetop. Slan de heelish marfnik tooplod. Sum sum to whop de wompam booster copm.
+ </expandable_text>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <!-- <layout_panel
+ follows="bottom|left"
+ layout="topleft"
+ left="0"
+ name="profile_buttons_panel"
+ height="28"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Add Friend"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="add_friend"
+ tool_tip="Offer friendship to the Resident"
+ top="5"
+ width="80" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="IM"
+ layout="topleft"
+ name="im"
+ top="5"
+ left_pad="3"
+ width="45" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Call"
+ layout="topleft"
+ name="call"
+ left_pad="3"
+ top="5"
+ width="45" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ height="23"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ top="5"
+ left_pad="3"
+ width="45" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ name="teleport"
+ left_pad="3"
+ top="5"
+ width="85" />
+ </panel>-->
+ <layout_panel
+ follows="bottom|left"
+ layout="topleft"
+ left="0"
+ top_pad="0"
+ name="profile_me_buttons_panel"
+ visible="false"
+ user_resize="false"
+ auto_resize="false"
+ height="28"
+ width="315">
+ <button
+ follows="bottom|right"
+ height="23"
+ left="6"
+ top="1"
+ label="Edit Profile"
+ name="edit_profile_btn"
+ tool_tip="Edit your personal information"
+ width="152" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Edit Appearance"
+ left_pad="3"
+ name="edit_appearance_btn"
+ tool_tip="Create/edit your appearance: physical data, clothes and etc."
+ width="153" />
+ </layout_panel>
+</layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 4175d21639..d484564e0d 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -4,89 +4,72 @@
background_visible="true"
bg_opaque_color="MouseGray"
follows="left|top|right"
- height="65"
+ height="60"
layout="topleft"
name="navigation_bar"
+ chrome="true"
width="600">
<icon
follows="all"
image_name="NavBar_BG"
- mouse_opaque="true"
+ mouse_opaque="false"
name="bg_icon"
scale_image="true"
visible="true"
left="0"
top="0"
- height="65"
+ height="60"
width="600"/>
<icon
follows="all"
image_name="NavBar_BG_NoFav"
- mouse_opaque="true"
+ mouse_opaque="false"
name="bg_icon_no_fav"
scale_image="true"
visible="false"
left="0"
top="0"
- height="65"
+ height="50"
width="600"/>
<panel
background_visible="false"
follows="left|top|right"
- top="5"
+ top="3"
height="23"
layout="topleft"
name="navigation_panel"
width="600">
- <button
+ <pull_button
follows="left|top"
- font="SansSerifSmall"
+ direction="down"
height="23"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
image_overlay="Arrow_Left_Off"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- hover_glow_amount="0.15"
+ image_bottom_pad="1"
layout="topleft"
left="10"
name="back_btn"
- picture_style="true"
tool_tip="Go back to previous location"
- top="3"
+ top="2"
width="31" />
-
- <button
+ <pull_button
follows="left|top"
- font="SansSerifSmall"
+ direction="down"
height="23"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
image_overlay="Arrow_Right_Off"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- hover_glow_amount="0.15"
+ image_bottom_pad="1"
layout="topleft"
left_pad="0"
name="forward_btn"
- picture_style="true"
tool_tip="Go forward one location"
top_delta="0"
width="31" />
<button
follows="left|top"
- font="SansSerifSmall"
height="23"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
image_overlay="Home_Off"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
- hover_glow_amount="0.15"
layout="topleft"
left_pad="7"
name="home_btn"
- picture_style="true"
tool_tip="Teleport to my home location"
top_delta="0"
width="32" />
@@ -113,7 +96,6 @@
width="20" />
-->
</location_input>
-
<!-- <button -->
<!-- follows="right|top" -->
<!-- height="20" -->
@@ -127,10 +109,8 @@
<!-- left_pad="5" -->
<!-- mouse_opaque="false" -->
<!-- name="search_bg" -->
- <!-- picture_style="true" -->
<!-- top_delta="0" -->
<!-- width="168" /> -->
-
<search_combo_box
bevel_style="none"
border_style="line"
@@ -148,18 +128,48 @@
top_delta="0"
width="200" >
<combo_editor
- label="Search" />
+ label="Search [SECOND_LIFE]"
+ name="search_combo_editor"/>
+ <combo_list
+ draw_border="true"
+ border.highlight_light_color="FocusColor"
+ border.highlight_dark_color="FocusColor"
+ border.shadow_light_color="FocusColor"
+ border.shadow_dark_color="FocusColor"/>
</search_combo_box>
</panel>
-
<favorites_bar
follows="left|right|top"
+ font="SansSerifSmall"
height="15"
layout="topleft"
left="0"
name="favorite"
- image_drag_indication="Arrow_Down"
- chevron_button_tool_tip="Show more of My Favorites"
- bottom="62"
- width="590" />
+ image_drag_indication="Accordion_ArrowOpened_Off"
+ bottom="55"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ width="590">
+ <label
+ follows="left|top"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="favorites_bar_label"
+ text_color="LtGray"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ top="12"
+ width="102">
+ Favorites Bar
+ </label>
+ <chevron_button name=">>"
+ image_unselected="TabIcon_Close_Off"
+ image_selected="TabIcon_Close_Off"
+ tab_stop="false"
+ follows="left|bottom"
+ tool_tip="Show more of My Favorites"
+ width="15"
+ top="15"
+ height="15"/>
+ </favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index af00b96d27..088f098f85 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -9,7 +9,7 @@
top="21"
width="310">
<string name="min_width">
- 310
+ 216
</string>
<string name="max_width">
320
@@ -21,12 +21,14 @@
height="23"
label="Click here to chat."
layout="topleft"
- left_delta="7"
+ left_delta="3"
+ text_pad_right="25"
left="0"
+ max_length="512"
name="chat_box"
tool_tip="Press Enter to say, Ctrl+Enter to shout"
- top="0"
- width="250" />
+ top="2"
+ width="283" />
<output_monitor
auto_update="true"
follows="right"
@@ -36,18 +38,26 @@
left_pad="-24"
mouse_opaque="true"
name="chat_zone_indicator"
- top="4"
+ top="6"
visible="true"
width="20" />
<button
follows="right"
- width="45"
- top="0"
+ is_toggle="true"
+ width="20"
+ top="2"
layout="topleft"
- left_pad="8"
- label="Log"
+ left_pad="4"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_Up_On_Selected"
+ image_pressed="ComboButton_UpSelected"
+ image_pressed_selected="ComboButton_Up_On_Selected"
height="23"
- tool_tip="Show/hide nearby chat log">
- <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/>
+ name="show_nearby_chat"
+ tool_tip="Shows/hides nearby chat log">
+ <button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="nearby_chat" />
</button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
new file mode 100644
index 0000000000..0f911f789e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -0,0 +1,410 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ can_resize="true"
+ can_close="false"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ background_opaque="true"
+ background_visible="true"
+ layout="topleft"
+ width="270"
+ height="235"
+ name="nearby_media"
+ help_topic="nearby_media">
+ <string name="media_item_count_format">(%ld media items)</string>
+ <string name="empty_item_text">&lt;empty&gt;</string>
+ <string name="parcel_media_name">Parcel Streaming Media</string>
+ <string name="parcel_audio_name">Parcel Streaming Audio</string>
+ <string name="playing_suffix">(playing)</string>
+ <panel
+ bevel_style="in"
+ background_visible="false"
+ follows="left|right|top"
+ top="0"
+ height="30"
+ name="minimized_controls"
+ left="0">
+ <button
+ name="all_nearby_media_disable_btn"
+ follows="left"
+ tool_tip="Turn all nearby media off"
+ left="15"
+ width="60"
+ height="22"
+ label="Stop All">
+ <button.commit_callback
+ function="MediaListCtrl.DisableAll" />
+ </button>
+ <button
+ name="all_nearby_media_enable_btn"
+ follows="left"
+ tool_tip="Turn all nearby media on"
+ left_pad="4"
+ width="60"
+ height="22"
+ label="Start All">
+ <button.commit_callback
+ function="MediaListCtrl.EnableAll" />
+ </button>
+ <button
+ name="open_prefs_btn"
+ image_overlay="Icon_Gear_Foreground"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ tool_tip = "Bring up media prefs"
+ top_delta="0"
+ left_pad="4"
+ height="22"
+ min_width="28"
+ width="28">
+ <button.commit_callback
+ function="MediaListCtrl.GoMediaPrefs" />
+ </button>
+ <button
+ name="more_less_btn"
+ follows="right"
+ tool_tip="Advanced Controls"
+ top_delta="0"
+ right="-10"
+ width="60"
+ height="22"
+ toggle="true"
+ label="More &gt;&gt;"
+ label_selected="Less &lt;&lt;">
+ <button.commit_callback
+ function="MediaListCtrl.MoreLess" />
+ </button>
+ </panel>
+ <panel
+ name="nearby_media_panel"
+ bevel_style="in"
+ border_style="line"
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="left|right|top|bottom"
+ top_delta="30"
+ right="-1"
+ left="0"
+ height="200">
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerif"
+ left="10"
+ width="100">
+ Nearby Media
+ </text>
+ <!-- nix for now
+ <text
+ bottom_delta="1"
+ type="string"
+ follows="top|left|right"
+ font="SansSerif"
+ font.style="ITALIC"
+ font.size="Small"
+ name="media_item_count"
+ left="115"
+ right="-10">
+ (?? media items)
+ </text>
+ -->
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerif"
+ top_pad="15"
+ left="10"
+ width="40">
+ Show:
+ </text>
+ <combo_box
+ height="23"
+ left="50"
+ width="140"
+ top_delta="-5"
+ follows="left|top"
+ name="show_combo">
+ <combo_box.item
+ label="All"
+ value="0"
+ name="All" />
+ <combo_box.item
+ label="In this Parcel"
+ value="2"
+ name="WithinParcel" />
+ <combo_box.item
+ label="Outside this Parcel"
+ value="3"
+ name="OutsideParcel" />
+ <combo_box.item
+ label="On other Avatars"
+ value="4"
+ ame="OnOthers" />
+ </combo_box>
+ <scroll_list
+ follows="left|top|bottom|right"
+ column_padding="0"
+ height="105"
+ draw_heading="false"
+ draw_stripes="true"
+ bg_stripe_color="0.25 0.25 0.25 0.25"
+ top_pad="8"
+ left="10"
+ right="-10"
+ name="media_list">
+ <scroll_list.columns
+ type="checkbox"
+ width="-1"
+ label=""
+ name="media_checkbox_ctrl" />
+ <scroll_list.columns
+ sort_column="media_proximity"
+ width="-1"
+ label="Proximity"
+ name="media_proximity" />
+ <scroll_list.columns
+ sort_column="media_visibility"
+ width="-1"
+ label="Visible"
+ name="media_visibility" />
+ <scroll_list.columns
+ sort_column="media_class"
+ width="-1"
+ label="Class"
+ name="media_class" />
+ <scroll_list.columns
+ label="Name"
+ name="media_name" />
+ <scroll_list.columns
+ sort_column="media_debug"
+ width="-1"
+ label="Debug"
+ name="media_debug" />
+ </scroll_list>
+ <panel
+ bevel_style="in"
+ background_visible="false"
+ follows="left|right|bottom"
+ top_pad="5"
+ height="30"
+ left="10"
+ right="-10">
+ <layout_stack
+ name="media_controls"
+ follows="left|right|top"
+ animate="false"
+ height="26"
+ layout="topleft"
+ top="4"
+ left="10"
+ right="-10"
+ border_size="0"
+ mouse_opaque="false"
+ orientation="horizontal">
+ <layout_panel
+ name="stop"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="22"
+ width="22">
+ <button
+ name="stop_btn"
+ follows="top"
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ tool_tip="Stop selected media"
+ top="0"
+ height="22"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Stop" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="play"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="22"
+ width="22">
+ <button
+ name="play_btn"
+ follows="top"
+ image_overlay="Play_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ tool_tip = "Play selected media"
+ top="0"
+ height="22"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Play" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="pause"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ min_width="22"
+ width="22">
+ <button
+ name="pause_btn"
+ follows="top"
+ image_overlay="Pause_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ top="0"
+ height="22"
+ width="22"
+ tool_tip = "Pause selected media">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Pause" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="volume_slider_ctrl"
+ mouse_opaque="false"
+ auto_resize="true"
+ user_resize="false"
+ follows="left|right"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="100"
+ width="200">
+ <slider_bar
+ name="volume_slider"
+ follows="left|right|top"
+ top="0"
+ height="22"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ tool_tip="Audio volume for selected media"
+ width="200">
+ <slider_bar.commit_callback
+ function="SelectedMediaCtrl.Volume" />
+ </slider_bar>
+ </layout_panel>
+ <layout_panel
+ name="mute"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="72"
+ min_width="22"
+ width="22">
+ <button
+ name="mute_btn"
+ follows="top"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ hover_glow_amount="0.15"
+ is_toggle="true"
+ layout="topleft"
+ scale_image="false"
+ tool_tip="Mute audio on selected media"
+ top="0"
+ height="20"
+ width="22" >
+ <button.commit_callback
+ function="SelectedMediaCtrl.Mute" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="zoom"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="28"
+ min_width="22"
+ width="22">
+ <button
+ name="zoom_btn"
+ follows="top"
+ image_overlay="Zoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
+ height="22"
+ layout="topleft"
+ tool_tip="Zoom into selected media"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Zoom" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="unzoom"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ min_width="21"
+ width="21" >
+ <button
+ name="unzoom_btn"
+ follows="top"
+ image_overlay="UnZoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
+ height="22"
+ layout="topleft"
+ tool_tip ="Zoom back from selected media"
+ top_delta="-4"
+ width="21" >
+ <button.commit_callback
+ function="SelectedMediaCtrl.Unzoom" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="right_bookend"
+ width="0"
+ mouse_opaque="false"
+ user_resize="false" />
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index 5333dfa2f5..cff7b51ce8 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="535"
+ height="533"
label="Notes &amp; Privacy"
layout="topleft"
left="0"
@@ -17,142 +17,153 @@
left="0"
top="0"
height="517"
+ width="313"
border_size="0">
- <panel
- name="notes_stack"
+ <layout_panel
+ name="notes_stack"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="450"
+ width="313">
+ <scroll_container
+ color="DkGray2"
follows="all"
layout="topleft"
- top="0"
- left="0">
- <scroll_container
- color="DkGray2"
- follows="all"
+ left="0"
+ name="profile_scroll"
+ opaque="true"
+ height="450"
+ width="313"
+ top="0">
+ <panel
+ height="450"
+ layout="topleft"
+ name="profile_scroll_panel"
+ top="0"
+ left="0"
+ width="303">
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="16"
layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- top="0">
- <panel
- layout="topleft"
- name="profile_scroll_panel"
- top="0"
- left="0"
- width="303">
- <text
- follows="left|top"
- font="SansSerifBold"
- height="16"
- layout="topleft"
- left="10"
- name="status_message"
- text_color="white"
- top="20"
- value="My private notes:"
- width="293" />
- <text_editor
- follows="left|top"
- height="120"
- layout="topleft"
- left="10"
- max_length="1000"
- name="notes_edit"
- text_color="DkGray"
- top_pad="10"
- width="280"
- word_wrap="true" />
- <text
- follows="left|top"
- font="SansSerifBold"
- height="16"
- layout="topleft"
- left="10"
- name="status_message2"
- text_color="white"
- top_pad="30"
- value="Allow this person to:"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See my online status"
- layout="topleft"
- left="20"
- name="status_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See me on the map"
- layout="topleft"
- left="20"
- name="map_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="Edit, delete or take my objects"
- layout="topleft"
- left="20"
- name="objects_check"
- width="293" />
- </panel>
- </scroll_container>
- </panel>
- <panel
- follows="bottom|left"
- height="30"
+ left="11"
+ name="status_message"
+ text_color="white"
+ top="10"
+ value="My private notes:"
+ width="293" />
+ <text_editor
+ follows="left|top"
+ height="120"
+ layout="topleft"
+ left="12"
+ max_length="1000"
+ name="notes_edit"
+ text_color="DkGray"
+ top_pad="3"
+ width="288"
+ word_wrap="true" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="16"
+ layout="topleft"
+ left="11"
+ name="status_message2"
+ text_color="white"
+ top_pad="20"
+ value="Allow this person to:"
+ width="293" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="See my online status"
+ layout="topleft"
+ left="10"
+ name="status_check"
+ width="293" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="See me on the map"
+ layout="topleft"
+ left="10"
+ name="map_check"
+ width="293" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="Edit, delete or take my objects"
+ layout="topleft"
+ left="10"
+ name="objects_check"
+ width="293" />
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left"
+ height="30"
layout="topleft"
left="0"
name="notes_buttons_panel"
- auto_resize="false">
+ auto_resize="false"
+ width="313">
<button
follows="bottom|left"
- height="19"
- label="Add"
+ height="23"
+ label="Add Friend"
layout="topleft"
- left="0"
+ left="2"
mouse_opaque="false"
name="add_friend"
+ tool_tip="Offer friendship to the Resident"
top="5"
- width="55" />
+ width="80" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="IM"
layout="topleft"
name="im"
+ tool_tip="Open instant message session"
top="5"
- left_pad="5"
- width="40" />
+ left_pad="3"
+ width="45" />
<button
- enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Call"
layout="topleft"
name="call"
- left_pad="5"
+ tool_tip="Call this Resident"
+ left_pad="3"
top="5"
- width="55" />
+ width="46" />
<button
enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
name="show_on_map_btn"
+ tool_tip="Show the Resident on the map"
top="5"
- left_pad="5"
- width="50" />
+ left_pad="3"
+ width="45" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
name="teleport"
- left_pad="5"
+ tool_tip="Offer teleport"
+ left_pad="3"
top="5"
- width="90" />
- </panel>
+ width="80" />
+ </layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 0d34aa0f08..34738745eb 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -2,44 +2,37 @@
<panel
background_opaque="false"
border_visible="false"
- border = "false"
- border_drop_shadow_visible = "false"
- drop_shadow_visible = "false"
background_visible="true"
- bg_alpha_color="0.3 0.3 0.3 0"
- bg_opaque_color="0.3 0.3 0.3 0"
+ bg_alpha_color="1 0.3 0.3 0"
+ bg_opaque_color="1 0.3 0.3 0"
label="notification_panel"
layout="topleft"
left="0"
name="notification_panel"
top="0"
- height="10"
+ height="140"
+ translate="false"
width="305">
<!-- THIS PANEL CONTROLS TOAST HEIGHT? -->
<panel
border_visible="false"
- drop_shadow="false"
bevel_style="none"
- border_style="none"
- border = "false"
- border_drop_shadow_visible = "false"
- drop_shadow_visible = "false"
background_visible="true"
bg_alpha_color="0.3 0.3 0.3 0"
bg_opaque_color="0.3 0.3 0.3 0"
follows="left|right|top"
- height="10"
+ height="100"
label="info_panel"
layout="topleft"
left="0"
name="info_panel"
top="0"
width="305">
- <!-- <text
+ <text
border_visible="false"
follows="left|right|top|bottom"
font="SansSerif"
- height="90"
+ height="85"
layout="topleft"
left="10"
name="text_box"
@@ -47,33 +40,31 @@
text_color="white"
top="10"
visible="false"
- width="300"
+ width="285"
wrap="true"/>
<text
border_visible="false"
follows="left|right|top|bottom"
font="SansSerifBold"
- height="90"
+ height="85"
layout="topleft"
- left="45"
+ left="10"
name="caution_text_box"
text_color="1 0.82 0.46 1"
- top="5"
+ top="10"
visible="false"
- width="300"
- wrap="true"/> -->
+ width="285"
+ wrap="true"/>
<text_editor
h_pad="0"
v_pad="0"
bg_readonly_color="0.0 0.0 0.0 0"
border_visible="false"
- border = "false"
- border_drop_shadow_visible = "false"
- drop_shadow_visible = "false"
embedded_items="false"
enabled="false"
follows="left|right|top|bottom"
font="SansSerif"
+ height="85"
layout="topleft"
left="10"
mouse_opaque="false"
@@ -85,27 +76,23 @@
top="10"
visible="false"
width="285"
- wrap="true"/>
+ wrap="true"
+ parse_highlights="true"
+ allow_html="true"/>
</panel>
<panel
background_visible="false"
follows="left|right|bottom"
+ height="30"
+ width="290"
label="control_panel"
layout="topleft"
- left="0"
- left_delta="-38"
+ left="10"
name="control_panel"
- top="20">
+ top_pad="5">
+ <!--
+ Notes:
+ This panel holds buttons of notification. Change of its size can affect the layout of buttons.
+ -->
</panel>
- <!--
- <icon
- follows="left|top"
- height="32"
- image_name="notify_tip_icon.tga"
- layout="topleft"
- left="8"
- mouse_opaque="false"
- name="info_icon"
- top="20"
- width="32" /> -->
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
index c67ae41677..16593751f7 100644
--- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
+++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
@@ -3,6 +3,7 @@
height="100"
layout="topleft"
name="notifications_panel"
+ translate="false"
width="100">
<layout_stack
follows="left|right|top|bottom"
@@ -71,7 +72,6 @@
layout="topleft"
left_delta="0"
name="header"
- picture_style="true"
top_delta="-20"
width="100" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_online_status.xml b/indra/newview/skins/default/xui/en/panel_online_status.xml
new file mode 100644
index 0000000000..14cb5fffee
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_online_status.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ height="152"
+ label="friend_online_status"
+ layout="topleft"
+ left="0"
+ name="friend_online_status"
+ top="0"
+ width="305">
+ <avatar_icon
+ follows="top|left"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="avatar_icon"
+ top="10"
+ width="18" />
+ <text
+ font="SansSerifSmall"
+ follows="all"
+ height="137"
+ layout="topleft"
+ left_pad="5"
+ name="message"
+ text_color="white"
+ top="15"
+ use_ellipses="true"
+ value=""
+ width="285"
+ word_wrap="true"
+ max_length="350" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
new file mode 100644
index 0000000000..14cb5fffee
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ height="152"
+ label="friend_online_status"
+ layout="topleft"
+ left="0"
+ name="friend_online_status"
+ top="0"
+ width="305">
+ <avatar_icon
+ follows="top|left"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="avatar_icon"
+ top="10"
+ width="18" />
+ <text
+ font="SansSerifSmall"
+ follows="all"
+ height="137"
+ layout="topleft"
+ left_pad="5"
+ name="message"
+ text_color="white"
+ top="15"
+ use_ellipses="true"
+ value=""
+ width="285"
+ word_wrap="true"
+ max_length="350" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..cc60b97f92
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel name="Outfits"
+ background_visible="true"
+ follows="all"
+ height="570"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ width="320"
+ border="false">
+ <tab_container
+ follows="all"
+ height="490"
+ layout="topleft"
+ left="6"
+ name="appearance_tabs"
+ tab_min_width="140"
+ tab_height="30"
+ tab_position="top"
+ halign="center"
+ width="315">
+ <inventory_panel
+ background_visible="true"
+ background_opaque="true"
+ label="MY OUTFITS"
+ help_topic="my_outfits_tab"
+ allow_multi_select="true"
+ follows="all"
+ border="false"
+ left="0"
+ top="0"
+ width="314"
+ mouse_opaque="true"
+ name="outfitslist_tab"
+ start_folder="My Outfits" />
+ <inventory_panel
+ follows="all"
+ background_visible="true"
+ background_opaque="true"
+ label="WEARING"
+ help_topic="now_wearing_tab"
+ allow_multi_select="true"
+ border="false"
+ left="0"
+ top="0"
+ mouse_opaque="true"
+ name="cof_tab"
+ start_folder="Current Outfit"
+ width="313" />
+ </tab_container>
+ <panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="left|right|bottom"
+ height="38"
+ layout="topleft"
+ left="9"
+ visible="true"
+ top_pad="-1"
+ width="310" />
+ <panel
+ background_visible="false"
+ follows="bottom|left"
+ height="73"
+ layout="topleft"
+ left="9"
+ visible="true"
+ name="bottom_panel"
+ top_pad="-38"
+ width="310">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="18"
+ image_disabled="OptionsMenu_Disabled"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ layout="topleft"
+ left="8"
+ name="options_gear_btn"
+ top="14"
+ width="18" />
+ <dnd_button
+ follows="bottom|right"
+ height="18"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ right="-9"
+ name="trash_btn"
+ tool_tip="Remove selected item"
+ top="14"
+ width="18" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Save Outfit"
+ layout="topleft"
+ name="make_outfit_btn"
+ tool_tip="Save appearance as an outfit"
+ top="43"
+ left="0"
+ width="153" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ name="wear_btn"
+ left_pad="3"
+ top="43"
+ tool_tip="Wear selected outfit"
+ width="152" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="M"
+ layout="topleft"
+ right="-140"
+ name="look_edit_btn"
+ top="26"
+ visible="false"
+ width="20" />
+ </panel>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..2c7a51f0e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_gear_default"
+ visible="false">
+ <menu_item_call
+ label="Replace Current Outfit"
+ layout="topleft"
+ name="wear">
+ <on_click
+ function="panel_outfits_inventory_gear_default.Custom.Action"
+ parameter="wear" />
+ <on_enable
+ function="panel_outfits_inventory_gear_default.Enable"
+ parameter="wear" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove From Current Outfit"
+ layout="topleft"
+ name="remove">
+ <on_click
+ function="panel_outfits_inventory_gear_default.Custom.Action"
+ parameter="remove" />
+ <on_enable
+ function="panel_outfits_inventory_gear_default.Enable"
+ parameter="remove" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Outfits Gear Separator" />
+ <menu_item_call
+ label="Rename"
+ layout="topleft"
+ name="rename">
+ <on_click
+ function="panel_outfits_inventory_gear_default.Custom.Action"
+ parameter="rename" />
+ <on_enable
+ function="panel_outfits_inventory_gear_default.Enable"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove Link"
+ layout="topleft"
+ name="remove_link">
+ <on_click
+ function="panel_outfits_inventory_gear_default.Custom.Action"
+ parameter="remove_link" />
+ <on_enable
+ function="panel_outfits_inventory_gear_default.Enable"
+ parameter="remove_link" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete Outfit"
+ layout="topleft"
+ name="delete">
+ <on_click
+ function="panel_outfits_inventory_gear_default.Custom.Action"
+ parameter="delete" />
+ <on_enable
+ function="panel_outfits_inventory_gear_default.Enable"
+ parameter="delete_outfit" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 0db5a41cc5..daab52f06a 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Side tray panel -->
<panel
-background_visible="true"
follows="all"
- height="570"
label="People"
layout="topleft"
+ height="449"
min_height="350"
name="people_panel"
top="0"
@@ -16,7 +15,7 @@ background_visible="true"
value="No people" />
<string
name="no_one_near"
- value="No-one near" />
+ value="No one near" />
<string
name="no_friends_online"
value="No friends online" />
@@ -24,20 +23,17 @@ background_visible="true"
name="no_friends"
value="No friends" />
<string
- name="no_groups"
- value="No groups" />
- <string
name="people_filter_label"
value="Filter People" />
<string
name="groups_filter_label"
value="Filter Groups" />
<filter_editor
+ text_pad_left="10"
follows="left|top|right"
- font="SansSerif"
height="23"
layout="topleft"
- left="15"
+ left="10"
label="Filter"
max_length="300"
name="filter_input"
@@ -46,21 +42,24 @@ background_visible="true"
width="303" />
<tab_container
follows="all"
- height="500"
+ height="383"
layout="topleft"
- left="10"
- font="SansSerifBigBold"
+ left="5"
name="tabs"
tab_min_width="70"
tab_height="30"
tab_position="top"
top_pad="10"
- halign="center"
- width="313">
- <panel
+ halign="center"
+ width="317">
+ <panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="500"
- label="Nearby"
+ height="383"
+ label="NEARBY"
layout="topleft"
left="0"
help_topic="people_nearby_tab"
@@ -70,18 +69,17 @@ background_visible="true"
<avatar_list
allow_select="true"
follows="all"
- height="470"
+ height="345"
ignore_online_status="true"
layout="topleft"
left="0"
multi_select="true"
name="avatar_list"
top="0"
- volume_column_width="20"
width="313" />
<panel
follows="left|right|bottom"
- height="30"
+ height="38"
label="bottom_panel"
layout="topleft"
left="0"
@@ -97,40 +95,56 @@ background_visible="true"
layout="topleft"
left="10"
name="nearby_view_sort_btn"
- picture_style="true"
- top="5"
+ top="10"
width="18" />
+ <button
+ follows="bottom|left"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left_pad="10"
+ name="add_friend_btn"
+ tool_tip="Add selected Resident to your friends List"
+ width="18">
+ <commit_callback
+ function="People.addFriend" />
+ </button>
</panel>
</panel>
<panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="500"
- left="0"
- top="0"
- label="Friends"
+ height="383"
+ label="MY FRIENDS"
layout="topleft"
+ left="0"
help_topic="people_friends_tab"
name="friends_panel"
+ top="0"
width="313">
<accordion
follows="all"
- height="470"
+ height="345"
layout="topleft"
left="0"
name="friends_accordion"
top="0"
width="313">
<accordion_tab
- can_resize="false"
layout="topleft"
- height="230"
+ height="172"
min_height="150"
name="tab_online"
title="Online">
<avatar_list
allow_select="true"
follows="all"
- height="150"
+ height="172"
layout="topleft"
left="0"
multi_select="true"
@@ -139,15 +153,14 @@ background_visible="true"
width="313" />
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
- height="230"
+ height="173"
name="tab_all"
title="All">
<avatar_list
allow_select="true"
follows="all"
- height="230"
+ height="173"
layout="topleft"
left="0"
multi_select="true"
@@ -158,7 +171,7 @@ background_visible="true"
</accordion>
<panel
follows="left|right|bottom"
- height="30"
+ height="38"
label="bottom_panel"
layout="topleft"
left="0"
@@ -174,8 +187,7 @@ background_visible="true"
layout="topleft"
left="10"
name="friends_viewsort_btn"
- picture_style="true"
- top="5"
+ top="10"
width="18" />
<button
follows="bottom|left"
@@ -184,11 +196,9 @@ background_visible="true"
image_unselected="AddItem_Off"
image_disabled="AddItem_Disabled"
layout="topleft"
- left_pad="5"
+ left_pad="10"
name="add_btn"
- picture_style="true"
- tool_tip="Offer friendship to a resident"
- top_delta="0"
+ tool_tip="Offer friendship to a Resident"
width="18" />
<button
follows="bottom|left"
@@ -200,33 +210,49 @@ background_visible="true"
left_pad="10"
right="-10"
name="del_btn"
- picture_style="true"
tool_tip="Remove selected person from your Friends list"
top_delta="0"
width="18" />
</panel>
+ <text
+ follows="all"
+ height="450"
+ left="10"
+ name="no_friends_msg"
+ top="10"
+ width="293"
+ wrap="true">
+ To add friends try [secondlife:///app/search/people global search] or click on a user to add them as a friend.
+If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map].
+ </text>
</panel>
<panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="500"
- label="Groups"
- top="0"
+ height="383"
+ label="MY GROUPS"
layout="topleft"
+ left="0"
help_topic="people_groups_tab"
name="groups_panel"
+ top="0"
width="313">
<group_list
follows="all"
- height="470"
+ height="345"
layout="topleft"
left="0"
name="group_list"
+ no_filtered_groups_msg="[secondlife:///app/search/groups Try fine the group in search?]"
+ no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"
top="0"
width="313" />
<panel
- top_pad="0"
follows="left|right|bottom"
- height="30"
+ height="38"
label="bottom_panel"
layout="topleft"
left="0"
@@ -242,8 +268,7 @@ background_visible="true"
layout="topleft"
left="10"
name="groups_viewsort_btn"
- picture_style="true"
- top="7"
+ top="10"
width="18" />
<button
follows="bottom|left"
@@ -252,11 +277,9 @@ background_visible="true"
image_unselected="AddItem_Off"
image_disabled="AddItem_Disabled"
layout="topleft"
- left_pad="5"
+ left_pad="10"
name="plus_btn"
- picture_style="true"
tool_tip="Join group/Create new group"
- top_delta="0"
width="18" />
<button
follows="bottom|left"
@@ -265,53 +288,41 @@ background_visible="true"
image_selected="Activate_Checkmark"
image_unselected="Activate_Checkmark"
layout="topleft"
- left_pad="24"
+ left_pad="10"
name="activate_btn"
- picture_style="true"
tool_tip="Activate selected group"
- top_delta="5"
+ top_delta="4"
width="10" />
- <button
- follows="bottom|left"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- layout="topleft"
- left_pad="10"
- right="-10"
- name="minus_btn"
- picture_style="true"
- tool_tip="Leave selected group"
- top_delta="-5"
- width="18" />
</panel>
</panel>
<panel
- top="0"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="500"
- label="Recent"
+ height="383"
+ label="RECENT"
layout="topleft"
+ left="0"
help_topic="people_recent_tab"
name="recent_panel"
+ top="0"
width="313">
<avatar_list
allow_select="true"
follows="all"
- height="470"
+ height="345"
layout="topleft"
left="0"
multi_select="true"
name="avatar_list"
show_last_interaction_time="true"
- top="2"
+ top="0"
width="313" />
<panel
- background_visible="true"
- bevel_style="none"
- top_pad="0"
follows="left|right|bottom"
- height="30"
+ height="38"
label="bottom_panel"
layout="topleft"
left="0"
@@ -327,176 +338,104 @@ background_visible="true"
layout="topleft"
left="10"
name="recent_viewsort_btn"
- picture_style="true"
- top="7"
+ top="10"
width="18" />
+ <button
+ follows="bottom|left"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left_pad="10"
+ name="add_friend_btn"
+ top_delta="0"
+ tool_tip="Add selected Resident to your friends List"
+ width="18">
+ <commit_callback
+ function="People.addFriend" />
+ </button>
</panel>
</panel>
</tab_container>
- <layout_stack
- animate="false"
- border_size="0"
- follows="left|right|bottom"
- height="25"
+ <panel
+ follows="bottom|left"
+ height="23"
layout="topleft"
- left="10"
+ left="8"
+ top_pad="0"
name="button_bar"
- orientation="horizontal"
width="313">
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Profile"
layout="topleft"
- left="0"
- name="view_profile_btn_panel"
- top="-25"
- width="65">
- <button
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Profile"
- layout="topleft"
- name="view_profile_btn"
- tool_tip="Show picture, groups, and other residents information"
- width="65" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ name="view_profile_btn"
+ tool_tip="Show picture, groups, and other Residents information"
+ width="64" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="IM"
layout="topleft"
- left_delta="0"
- min_width="85"
- name="add_friend_btn_panel"
- top_delta="0"
- width="50">
- <button
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Add"
- layout="topleft"
- name="add_friend_btn"
- tool_tip="Add selected resident to your friends List"
- width="50" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="19"
+ name="im_btn"
+ tool_tip="Open instant message session"
+ width="43" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="Call"
layout="topleft"
- min_width="80"
- name="group_info_btn_panel"
- width="80">
- <button
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Group Profile"
- layout="topleft"
- name="group_info_btn"
- tool_tip="Show group information"
- width="80" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ name="call_btn"
+ tool_tip="Call this Resident"
+ width="51" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="Share"
layout="topleft"
- min_width="45"
- name="chat_btn_panel"
- top_delta="0"
- width="45">
- <button
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Chat"
- layout="topleft"
- name="chat_btn"
- tool_tip="Open chat session"
- width="45" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ name="share_btn"
+ width="62" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="Teleport"
layout="topleft"
- min_width="35"
- name="im_btn_panel"
+ name="teleport_btn"
+ tool_tip="Offer teleport"
+ width="76" />
+ <button
+ follows="bottom|left"
+ left="0"
top_delta="0"
- width="35">
- <button
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="IM"
- layout="topleft"
- name="im_btn"
- tool_tip="Open instant message session"
- width="35" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ height="23"
+ label="Group Profile"
layout="topleft"
- min_width="40"
- name="call_btn_panel"
- top_delta="0"
- visible="false"
- width="40">
- <button
- enabled="false"
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Call"
- layout="topleft"
- name="call_btn"
- width="40" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- follows="left|top|right"
- height="25"
+ name="group_info_btn"
+ tool_tip="Show group information"
+ width="107" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="Group Chat"
layout="topleft"
- min_width="65"
- name="teleport_btn_panel"
- top_delta="0"
- width="65">
- <button
- follows="left|top|right"
- font="SansSerifSmall"
- height="19"
- label="Teleport"
- layout="topleft"
- name="teleport_btn"
- tool_tip="Offer teleport"
- width="65" />
- </layout_panel>
- <layout_panel
- default_tab_group="1"
- enabled="false"
- follows="left|top|right"
- height="25"
+ name="chat_btn"
+ tool_tip="Open chat session"
+ width="100" />
+ <button
+ follows="bottom|left"
+ left_pad="3"
+ height="23"
+ label="Group Call"
layout="topleft"
- min_width="50"
- name="share_btn_panel"
- top_delta="0"
- visible="false"
- width="50">
- <button
- enabled="false"
- follows="top|left|right"
- font="SansSerifSmall"
- height="19"
- label="Share"
- layout="topleft"
- name="share_btn"
- width="50" />
- </layout_panel>
- </layout_stack>
+ name="group_call_btn"
+ tool_tip="Call this group"
+ width="95" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index a67ae59b4a..ecf5516390 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -7,6 +7,7 @@
left="0"
min_height="350"
name="panel_pick_info"
+ help_topic="profile_pick_info"
top="0"
width="333">
<button
@@ -15,8 +16,7 @@
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
- picture_style="true"
- left="10"
+ left="12"
tab_stop="false"
top="2"
width="23" />
@@ -27,110 +27,121 @@
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
+ text_color="LtGray"
top="0"
value="Pick Info"
- use_elipsis="true"
+ use_ellipses="true"
width="275" />
<scroll_container
color="DkGray2"
opaque="true"
follows="all"
- height="500"
+ height="503"
layout="topleft"
- left="10"
+ left="8"
top_pad="10"
name="profile_scroll"
- reserve_scroll_corner="false"
- width="313">
+ width="312">
<panel
name="scroll_content_panel"
- follows="left|top"
+ follows="left|top|right"
min_height="300"
layout="topleft"
top="0"
background_visible="false"
- height="470"
+ height="400"
left="0"
- width="295">
+ width="285">
<texture_picker
enabled="false"
- follows="left|top"
+ follows="left|top|right"
height="197"
layout="topleft"
- left="10"
+ left="11"
name="pick_snapshot"
- top="20"
- width="290" />
- <text
+ top="10"
+ width="272" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
follows="left|top|right"
+ h_pad="0"
height="35"
- width="290"
+ width="280"
layout="topleft"
font="SansSerifBig"
font.style="BOLD"
left="10"
top_pad="10"
name="pick_name"
+ read_only="true"
text_color="white"
+ v_pad="0"
value="[name]"
use_ellipses="true" />
- <text
- follows="left|top"
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top|right"
+ h_pad="0"
height="25"
layout="topleft"
left="10"
name="pick_location"
- width="290"
+ read_only="true"
+ width="280"
word_wrap="true"
+ v_pad="0"
value="[loading...]" />
- <text
- follows="left|top|right"
- height="280"
+ <text_editor
+ bg_readonly_color="DkGray2"
+ follows="all"
+ height="100"
+ width="280"
+ allow_html="true"
+ hide_scrollbar="false"
layout="topleft"
left="10"
+ top_pad="2"
+ max_length="1023"
name="pick_desc"
- width="290"
+ read_only="true"
+ text_readonly_color="white"
value="[description]"
- word_wrap="true" />
+ wrap="true" />
</panel>
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="35"
layout="topleft"
- top_pad="8"
- left="10"
+ top_pad="5"
+ left="8"
name="buttons">
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="0"
name="teleport_btn"
top="0"
- width="90" />
+ width="101" />
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Map"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="show_on_map_btn"
- top="0"
- width="90" />
+ width="100" />
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
- right="-1"
name="edit_btn"
- top="0"
- width="90" />
+ left_pad="3"
+ width="101" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 1074dd4627..8b25fb5d2a 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -12,24 +12,24 @@
follows="all"
height="85"
image_name="ListItem_Over"
- right="-3"
+ right="-2"
mouse_opaque="false"
name="hovered_icon"
top="1"
scale_image="true"
visible="false"
- width="307"/>
+ width="308" />
<icon
follows="all"
height="85"
image_name="ListItem_Select"
- right="-3"
+ right="-2"
mouse_opaque="false"
name="selected_icon"
top="1"
scale_image="true"
visible="false"
- width="307"/>
+ width="308" />
<texture_picker
allow_no_texture="true"
border_enabled="true"
@@ -47,37 +47,35 @@
width="90" />
<text
follows="top|left|right"
- font="SansSerifSmallBold"
- height="16"
+ font="SansSerifSmall"
+ height="15"
layout="topleft"
left="110"
name="picture_name"
text_color="white"
top="9"
- use_ellipses="false"
- width="197"
+ use_ellipses="true"
+ width="193"
word_wrap="false" />
- <text
+ <expandable_text
follows="top|left|right"
font="SansSerifSmall"
- height="40"
+ height="55"
layout="topleft"
- left="110"
+ left="103"
name="picture_descr"
- top_pad="3"
+ textbox.show_context_menu="false"
+ top_pad="0"
width="178"
word_wrap="true" />
- <button
- follows="top|right"
- height="16"
- image_selected="BuyArrow_Press"
- image_pressed="BuyArrow_Press"
- image_unselected="BuyArrow_Press"
+ <button
+ follows="right"
+ height="20"
+ image_overlay="ForwardArrow_Off"
layout="topleft"
+ left_pad="5"
+ right="-8"
name="info_chevron"
- picture_style="true"
- right="-7"
- tab_stop="false"
- top="27"
- width="16" />
+ top_delta="24"
+ width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index cbe1f11e3d..0093a08e15 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -1,35 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="535"
+ height="548"
label="Picks"
layout="topleft"
left="0"
name="panel_picks"
top="0"
width="313">
+ <string
+ name="no_picks"
+ value="No Picks" />
+ <string
+ name="no_classifieds"
+ value="No Classifieds" />
+ <text
+ type="string"
+ follows="all"
+ height="535"
+ layout="topleft"
+ left="6"
+ name="picks_panel_text"
+ wrap="true"
+ top="10"
+ width="313"/>
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height="470"
+ layout="topleft"
+ left="0"
+ name="accordion"
+ top="0"
+ single_expansion="true"
+ width="313">
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ height="235"
+ min_height="150"
+ name="tab_picks"
+ title="Picks"
+ visible="false">
<flat_list_view
color="DkGray2"
follows="all"
- height="465"
layout="topleft"
left="0"
name="picks_list"
opaque="true"
top="0"
width="313" />
+ </accordion_tab>
+ <accordion_tab
+ can_resize="false"
+ layout="topleft"
+ height="235"
+ name="tab_classifieds"
+ title="Classifieds"
+ visible="false">
+ <flat_list_view
+ color="DkGray2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="classifieds_list"
+ opaque="true"
+ top="0"
+ width="313" />
+ </accordion_tab>
+ </accordion>
<panel
- background_visible="true"
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
bevel_style="none"
enabled="false"
auto_resize="false"
follows="bottom"
- left="0"
- height="18"
+ left="1"
+ height="27"
label="bottom_panel"
layout="topleft"
name="edit_panel"
- top_pad="0"
+ top_pad="-2"
width="313">
<button
enabled="false"
@@ -39,10 +96,9 @@
image_unselected="OptionsMenu_Off"
image_disabled="OptionsMenu_Disabled"
layout="topleft"
- left="0"
+ left="10"
name="gear_menu_btn"
- picture_style="true"
- top="5"
+ top="9"
width="18" />
<button
follows="bottom|left"
@@ -53,9 +109,8 @@
layout="topleft"
left_pad="15"
name="new_btn"
- picture_style="true"
- tool_tip="Create new pick at current location"
- top="5"
+ tool_tip="Create a new pick or classified at the current location"
+ top="9"
width="18" />
<button
follows="bottom|right"
@@ -65,66 +120,53 @@
image_unselected="TrashItem_Off"
layout="topleft"
name="trash_btn"
- picture_style="true"
right="-10"
- top="5"
+ top="9"
width="18" />
</panel>
<panel
+ bg_opaque_color="DkGray"
+ background_visible="true"
+ background_opaque="true"
layout="topleft"
left="0"
- height="25"
- top_pad="10"
+ height="40"
+ top="502"
name="buttons_cucks"
- help_topic="picks_button_tab"
width="313">
<button
enabled="false"
follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
+ height="23"
label="Info"
layout="topleft"
- left="5"
+ left="2"
name="info_btn"
tab_stop="false"
- top="0"
- width="55" />
+ tool_tip="Show pick information"
+ top="5"
+ width="95" />
<button
enabled="false"
follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
+ height="23"
label="Teleport"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="teleport_btn"
tab_stop="false"
- top="0"
- width="77" />
+ tool_tip="Teleport to the corresponding area"
+ width="117" />
<button
enabled="false"
follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
+ height="23"
label="Map"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="show_on_map_btn"
tab_stop="false"
- top="0"
- width="50" />
- <button
- enabled="false"
- follows="bottom|right"
- font="SansSerifSmallBold"
- height="25"
- label="â–¼"
- layout="topleft"
- name="overflow_btn"
- right="-10"
- tab_stop="false"
- top="0"
- width="30" />
+ tool_tip="Show the corresponding area on the World Map"
+ width="90" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
new file mode 100644
index 0000000000..b22dad5841
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -0,0 +1,931 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="place_profile"
+ top="20"
+ width="333">
+ <string
+ name="on"
+ value="On" />
+ <string
+ name="off"
+ value="Off" />
+ <string
+ name="anyone"
+ value="Anyone" />
+ <string
+ name="available"
+ value="available" />
+ <string
+ name="allocated"
+ value="allocated" />
+ <string
+ name="title_place"
+ value="Place Profile" />
+ <string
+ name="title_teleport_history"
+ value="Teleport History" />
+ <string
+ name="not_available"
+ value="(N\A)" />
+ <string
+ name="unknown"
+ value="(unknown)" />
+ <string
+ name="public"
+ value="(public)" />
+ <string
+ name="none_text"
+ value="(none)" />
+ <string
+ name="sale_pending_text"
+ value="(Sale Pending)" />
+ <string
+ name="group_owned_text"
+ value="(Group Owned)" />
+ <string
+ name="price_text"
+ value="L$" />
+ <string
+ name="area_text"
+ value="m²" />
+ <string
+ name="all_residents_text"
+ value="All Residents" />
+ <string
+ name="group_text"
+ value="Group" />
+ <string
+ name="can_resell">
+ Purchased land in this region may be resold.
+ </string>
+ <string
+ name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </string>
+ <string
+ name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </string>
+ <string
+ name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </string>
+ <string
+ name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string
+ name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string
+ name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string
+ name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <!-- Texture names for parcel permissions icons -->
+ <string
+ name="icon_PG"
+ value="Parcel_PG_Dark" />
+ <string
+ name="icon_M"
+ value="Parcel_M_Dark" />
+ <string
+ name="icon_R"
+ value="Parcel_R_Dark" />
+ <string
+ name="icon_Voice"
+ value="Parcel_Voice_Dark" />
+ <string
+ name="icon_VoiceNo"
+ value="Parcel_VoiceNo_Dark" />
+ <string
+ name="icon_Fly"
+ value="Parcel_Fly_Dark" />
+ <string
+ name="icon_FlyNo"
+ value="Parcel_FlyNo_Dark" />
+ <string
+ name="icon_Push"
+ value="Parcel_Push_Dark" />
+ <string
+ name="icon_PushNo"
+ value="Parcel_PushNo_Dark" />
+ <string
+ name="icon_Build"
+ value="Parcel_Build_Dark" />
+ <string
+ name="icon_BuildNo"
+ value="Parcel_BuildNo_Dark" />
+ <string
+ name="icon_Scripts"
+ value="Parcel_Scripts_Dark" />
+ <string
+ name="icon_ScriptsNo"
+ value="Parcel_ScriptsNo_Dark" />
+ <string
+ name="icon_Damage"
+ value="Parcel_Damage_Dark" />
+ <string
+ name="icon_DamageNo"
+ value="Parcel_DamageNo_Dark" />
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="11"
+ name="back_btn"
+ tool_tip="Back"
+ tab_stop="false"
+ top="4"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="2"
+ use_ellipses="true"
+ value="Place Profile"
+ width="280" />
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="532"
+ layout="topleft"
+ left="9"
+ name="place_scroll"
+ opaque="true"
+ top_pad="10"
+ width="310">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="left|top|right"
+ height="700"
+ layout="topleft"
+ left="0"
+ min_height="300"
+ name="scrolling_panel"
+ top="0"
+ width="285">
+ <texture_picker
+ enabled="false"
+ follows="left|top|right"
+ height="197"
+ layout="topleft"
+ left="11"
+ name="logo"
+ top="10"
+ width="290" />
+ <layout_stack
+ border_size="0"
+ clip="false"
+ follows="left|top|right"
+ height="50"
+ layout="topleft"
+ mouse_opaque="false"
+ name="panel_stack"
+ orientation="horizontal"
+ top_pad="-65"
+ width="100">
+ <layout_panel
+ follows="left|right"
+ height="50"
+ layout="topleft"
+ left="0"
+ min_height="50"
+ min_width="50"
+ mouse_opaque="false"
+ name="here_panel"
+ top="0"
+ user_resize="false"
+ width="60">
+ <icon
+ follows="top|left"
+ height="50"
+ image_name="YouAreHere_Badge"
+ layout="topleft"
+ left="0"
+ name="icon_you_are_here"
+ top="0"
+ width="50" />
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="60"
+ layout="topleft"
+ min_height="50"
+ min_width="60"
+ mouse_opaque="false"
+ name="for_sale_panel"
+ top="0"
+ user_resize="false"
+ width="60">
+ <icon
+ follows="top|left"
+ height="50"
+ image_name="ForSale_Badge"
+ layout="topleft"
+ left="10"
+ name="icon_for_sale"
+ top="0"
+ width="50" />
+ </layout_panel>
+ </layout_stack>
+ <text
+ allow_html="false"
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="region_title"
+ text_color="white"
+ top_pad="5"
+ use_ellipses="true"
+ value="SampleRegion"
+ width="290" />
+ <text
+ allow_html="false"
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="parcel_title"
+ top_pad="4"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="285" />
+ <expandable_text
+ follows="left|top|right"
+ height="50"
+ layout="topleft"
+ left="5"
+ name="description"
+ top_pad="10"
+ value="Du waltz die spritz"
+ width="300" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="owner_label"
+ text_color="White"
+ top_pad="0"
+ value="Owner:"
+ width="90" />
+ <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR -->
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left_pad="1"
+ name="owner_value"
+ top_delta="0"
+ value="Alex Superduperlongenamenton"
+ width="205" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="unknown"
+ layout="topleft"
+ left="10"
+ name="maturity_icon"
+ top_delta="0"
+ width="18" />
+ <text
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="8"
+ name="maturity_value"
+ top_delta="0"
+ value="unknown"
+ width="268" />
+ <accordion
+ follows="all"
+ height="230"
+ layout="topleft"
+ left="0"
+ name="advanced_info_accordion"
+ top_pad="10"
+ width="313">
+ <accordion_tab
+ layout="topleft"
+ name="parcel_characteristics_tab"
+ title="Parcel">
+ <panel
+ follows="all"
+ height="160"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="275">
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon"
+ top="0"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="12"
+ name="rating_label"
+ value="Rating:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="rating_value"
+ top_delta="0"
+ value="unknown"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Voice_Dark"
+ layout="topleft"
+ left="10"
+ name="voice_icon"
+ top_pad="5"
+ width="22" />
+ <text
+ follows="left|top"
+ height="18"
+ layout="topleft"
+ left_pad="8"
+ name="voice_label"
+ top_delta="0"
+ value="Voice:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="18"
+ layout="topleft"
+ left_pad="0"
+ name="voice_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Fly_Dark"
+ layout="topleft"
+ left="10"
+ name="fly_icon"
+ top_pad="3"
+ width="22" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="8"
+ name="fly_label"
+ value="Fly:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="fly_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Push_Dark"
+ layout="topleft"
+ left="10"
+ name="push_icon"
+ top_pad="3"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="push_label"
+ value="Push:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="push_value"
+ top_delta="0"
+ value="Off"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Build_Dark"
+ layout="topleft"
+ left="10"
+ name="build_icon"
+ top_pad="3"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="build_label"
+ value="Build:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="build_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Scripts_Dark"
+ layout="topleft"
+ left="10"
+ name="scripts_icon"
+ top_pad="3"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="scripts_label"
+ value="Scripts:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="scripts_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_Damage_Dark"
+ layout="topleft"
+ left="10"
+ name="damage_icon"
+ top_pad="7"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="damage_label"
+ value="Damage:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="damage_value"
+ top_delta="0"
+ value="Off"
+ width="60" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="About Land"
+ layout="topleft"
+ name="about_land_btn"
+ right="-5"
+ tab_stop="false"
+ top="138"
+ width="90">
+ <click_callback
+ function="Floater.Show"
+ parameter="about_land" />
+ </button>
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="region_information_tab"
+ title="Region">
+ <panel
+ follows="all"
+ height="125"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_name_label"
+ top_pad="5"
+ value="Region:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_name"
+ top_delta="0"
+ value="Mooseland"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_type_label"
+ top_pad="5"
+ value="Type:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_type"
+ top_delta="0"
+ value="Moose"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_rating_label"
+ top_pad="7"
+ value="Rating:"
+ width="90" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left_pad="0"
+ name="region_rating_icon"
+ width="18" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="region_rating"
+ value="Adult"
+ width="159" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_owner_label"
+ top_pad="5"
+ value="Owner:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_owner"
+ top_delta="0"
+ value="moose Van Moose"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_group_label"
+ top_pad="5"
+ value="Group:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_group"
+ top_delta="0"
+ use_ellipses="true"
+ width="187">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Region/Estate"
+ layout="topleft"
+ name="region_info_btn"
+ right="-5"
+ tab_stop="false"
+ width="105">
+ <click_callback
+ function="Floater.Show"
+ parameter="region_info" />
+ </button>
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="estate_information_tab"
+ title="Estate">
+ <panel
+ follows="all"
+ height="189"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_name_label"
+ top_pad="5"
+ value="Estate:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="estate_name"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_rating_label"
+ top_pad="5"
+ value="Rating:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="estate_rating"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_owner_label"
+ top_pad="5"
+ value="Owner:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="estate_owner"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="covenant_label"
+ top_pad="5"
+ value="Covenant:"
+ width="277" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ handle_edit_keys_directly="true"
+ height="90"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="covenant"
+ read_only="true"
+ top_pad="0"
+ width="277"
+ word_wrap="true" />
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="sales_tab"
+ title="For Sale">
+ <panel
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="sales_price_label"
+ top_pad="5"
+ value="Price:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="sales_price"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="area_label"
+ top_pad="5"
+ value="Area:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="area"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="traffic_label"
+ top_pad="5"
+ value="Traffic:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="traffic"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="primitives_label"
+ top_pad="5"
+ value="Primitives:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="primitives"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="parcel_scripts_label"
+ top_pad="5"
+ value="Scripts:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="parcel_scripts"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="terraform_limits_label"
+ top_pad="5"
+ value="Terraform limits:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="terraform_limits"
+ top_delta="0"
+ width="187" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="subdivide_label"
+ top_pad="5"
+ value="Subdivide/Join ability:"
+ width="277" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ height="45"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="subdivide"
+ read_only="true"
+ top_pad="5"
+ width="277"
+ word_wrap="true" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="resale_label"
+ top_pad="5"
+ value="ReSale ability:"
+ width="277" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ height="45"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="resale"
+ read_only="true"
+ top_pad="5"
+ width="277"
+ word_wrap="true" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="sale_to_label"
+ top_pad="5"
+ value="For sale to:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="sale_to"
+ top_delta="0"
+ width="187" />
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 50108aa21f..57535649de 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -12,134 +12,124 @@ background_visible="true"
width="333">
<string
name="landmarks_tab_title"
- value="My Landmarks" />
+ value="MY LANDMARKS" />
<string
name="teleport_history_tab_title"
- value="Teleport History" />
+ value="TELEPORT HISTORY" />
<filter_editor
+ text_pad_left="10"
follows="left|top|right"
- font="SansSerif"
+ font="SansSerifSmall"
height="23"
layout="topleft"
- left="15"
- label="Filter"
+ left="10"
+ label="Filter My Places"
max_length="300"
name="Filter"
top="3"
width="303" />
<tab_container
follows="all"
- height="500"
+ halign="center"
+ height="503"
layout="topleft"
- left="10"
+ left="6"
name="Places Tabs"
- tab_min_width="70"
+ tab_min_width="80"
tab_height="30"
tab_position="top"
top_pad="10"
- width="313" />
+ width="315" />
<panel
- class="panel_place_info"
- filename="panel_place_info.xml"
+ class="panel_place_profile"
+ filename="panel_place_profile.xml"
follows="all"
height="533"
layout="topleft"
left="0"
- help_topic="places_info_tab"
- name="panel_place_info"
+ help_topic="place_profile"
+ name="panel_place_profile"
top="5"
visible="false"
- width="313" />
+ width="315" />
<panel
- height="19"
+ class="panel_landmark_info"
+ filename="panel_landmark_info.xml"
+ follows="all"
+ height="533"
layout="topleft"
left="0"
- help_topic="places_button_tab"
+ help_topic="landmark"
+ name="panel_landmark_info"
+ top="5"
+ visible="false"
+ width="315" />
+ <panel
+ height="19"
+ layout="topleft"
+ left="4"
name="button_panel"
- width="313">
+ width="315">
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="5"
name="teleport_btn"
- top="0"
- width="77" />
+ tool_tip="Teleport to the selected area"
+ top="1"
+ width="108" />
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Map"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="map_btn"
- top="0"
- width="50" />
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmall"
- height="19"
- label="Share"
- layout="topleft"
- left_pad="5"
- name="share_btn"
- top="0"
- width="60" />
+ width="85" />
<button
follows="bottom|left"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="edit_btn"
- top="0"
- width="50" />
+ tool_tip="Edit landmark information"
+ width="83" />
<button
follows="bottom|right"
- font="SansSerifSmall"
- height="19"
- image_disabled="ForwardArrow_Disabled"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
- picture_style="true"
+ height="23"
+ label="â–¼"
layout="topleft"
name="overflow_btn"
- right="-10"
- top="0"
- width="18" />
+ tool_tip="Show additional options"
+ left_pad="3"
+ width="23" />
<button
- follows="bottom|right"
- font="SansSerifSmall"
- height="19"
- label="Close"
+ follows="bottom|left"
+ height="23"
+ label="Save"
layout="topleft"
- name="close_btn"
- right="-10"
- top="0"
- width="60" />
+ name="save_btn"
+ left="5"
+ top_pad="-23"
+ width="152" />
<button
follows="bottom|right"
- font="SansSerifSmall"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- right="-10"
- top="0"
- width="60" />
+ left_pad="3"
+ width="153" />
<button
follows="bottom|right"
- font="SansSerifSmall"
- height="19"
- label="Save"
+ height="23"
+ label="Close"
layout="topleft"
- name="save_btn"
- right="-75"
- top="0"
+ name="close_btn"
+ left_pad="3"
width="60" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 91dcdce23b..05a3771edf 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -1,129 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
-
<panel
border="true"
- background_visible="true"
- follows="left|top|right|bottom"
+ follows="all"
height="408"
+ label="Advanced"
layout="topleft"
left="102"
name="advanced"
top="1"
width="517">
- <panel.string
- name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
<panel.string
name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box
- control_name="UseChatBubbles"
- follows="left|top"
- height="16"
- label="Bubble chat"
- layout="topleft"
- left="30"
- top="10"
- name="bubble_text_chat"
- width="150" />
-
- <slider
- control_name="ChatBubbleOpacity"
- follows="left|top"
- height="16"
- increment="0.05"
- initial_value="1"
- label="Opacity"
- layout="topleft"
- left_delta="50"
- top_pad="5"
- label_width="50"
- name="bubble_chat_opacity"
- width="200" />
- <text
- follows="left|top"
- type="string"
- length="1"
- height="25"
- layout="topleft"
- left="30"
- top_pad="5"
- name="AspectRatioLabel1"
- tool_tip="width / height"
- label_width="50"
- width="120">
- Aspect ratio
- </text>
- <combo_box
- allow_text_entry="true"
- height="20"
- follows="left|top"
- layout="topleft"
- left_pad="0"
- max_chars="100"
- name="aspect_ratio"
- tool_tip="width / height"
- top_delta="0"
- width="150">
- <combo_box.item
- enabled="true"
- label=" 4:3 (Standard CRT)"
- name="item1"
- value="1.333333" />
- <combo_box.item
- enabled="true"
- label=" 5:4 (1280x1024 LCD)"
- name="item2"
- value="1.25" />
- <combo_box.item
- enabled="true"
- label=" 8:5 (Widescreen)"
- name="item3"
- value="1.6" />
- <combo_box.item
- enabled="true"
- label=" 16:9 (Widescreen)"
- name="item4"
- value="1.7777777" />
- </combo_box>
- <check_box
- control_name="FullScreenAutoDetectAspectRatio"
- follows="left|top"
- height="25"
- label="Auto-detect"
- layout="topleft"
- left_pad="10"
- name="aspect_auto_detect"
- width="256">
- <check_box.commit_callback
- function="Pref.AutoDetectAspect" />
- </check_box>
- <text
- follows="left|top"
- type="string"
- length="1"
- height="10"
- left="30"
- name="heading1"
- top_pad="5"
- width="270">
-Camera:
- </text>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Cam_FreeCam_Off"
+ layout="topleft"
+ name="camera_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ left="30"
+ top="10"/>
<slider
can_edit_text="true"
- control_name="CameraAngle"
+ control_name="CameraAngle"
decimal_digits="2"
- top_pad="5"
follows="left|top"
height="16"
increment="0.025"
initial_value="1.57"
layout="topleft"
label_width="100"
- label="View Angle"
- left_delta="50"
+ label="View angle"
+ left_pad="30"
max_val="2.97"
min_val="0.17"
name="camera_fov"
@@ -152,11 +64,11 @@ Camera:
type="string"
length="1"
height="10"
- left="30"
+ left="80"
name="heading2"
width="270"
top_pad="5">
-Automatic positioning for:
+Automatic position for:
</text>
<check_box
control_name="EditCameraMovement"
@@ -164,7 +76,7 @@ Automatic positioning for:
follows="left|top"
label="Build/Edit"
layout="topleft"
- left_delta="50"
+ left_delta="30"
name="edit_camera_movement"
tool_tip="Use automatic camera positioning when entering and exiting edit mode"
width="280"
@@ -178,29 +90,29 @@ Automatic positioning for:
name="appearance_camera_movement"
tool_tip="Use automatic camera positioning while in edit mode"
width="242" />
- <text
- follows="left|top"
- type="string"
- length="1"
- height="10"
- left="30"
- name="heading3"
- top_pad="5"
- width="270">
-Avatars:
- </text>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Move_Walk_Off"
+ layout="topleft"
+ name="avatar_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ top_pad="2"
+ left="30"
+ />
<check_box
control_name="FirstPersonAvatarVisible"
follows="left|top"
height="20"
label="Show me in Mouselook"
layout="topleft"
- left_delta="50"
+ left_pad="30"
name="first_person_avatar_visible"
- width="256"
- top_pad="0"/>
+ width="256" />
<check_box
- control_name="ArrowKeysMoveAvatar"
+ control_name="ArrowKeysAlwaysMove"
follows="left|top"
height="20"
label="Arrow keys always move me"
@@ -229,22 +141,61 @@ Avatars:
name="enable_lip_sync"
width="237"
top_pad="0" />
+ <check_box
+ control_name="UseChatBubbles"
+ follows="left|top"
+ height="16"
+ label="Bubble chat"
+ layout="topleft"
+ left="78"
+ top_pad="6"
+ name="bubble_text_chat"
+ width="150" />
+ <slider
+ control_name="ChatBubbleOpacity"
+ follows="left|top"
+ height="16"
+ increment="0.05"
+ initial_value="1"
+ label="Opacity"
+ layout="topleft"
+ left="80"
+ label_width="50"
+ name="bubble_chat_opacity"
+ width="200" />
+ <color_swatch
+ can_apply_immediately="true"
+ color="0 0 0 1"
+ control_name="BackgroundChatColor"
+ follows="left|top"
+ height="50"
+ layout="topleft"
+ left_pad="10"
+ name="background"
+ tool_tip="Choose color for bubble chat"
+ width="38">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="BackgroundChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="BackgroundChatColor" />
+ </color_swatch>
<check_box
control_name="ShowScriptErrors"
follows="left|top"
height="20"
- label="Show script errors"
+ label="Show script errors in:"
layout="topleft"
left="30"
name="show_script_errors"
- width="256"
- top_pad="5"/>
+ width="256" />
<radio_group
- enabled_control="ShowScriptErrors"
- control_name="ShowScriptErrorsLocation"
+ enabled_control="ShowScriptErrors"
+ control_name="ShowScriptErrorsLocation"
follows="top|left"
draw_border="false"
- height="40"
+ height="16"
layout="topleft"
left_delta="50"
name="show_location"
@@ -252,7 +203,7 @@ Avatars:
width="364">
<radio_item
height="16"
- label="In chat"
+ label="Nearby chat"
layout="topleft"
left="3"
name="0"
@@ -260,7 +211,7 @@ Avatars:
width="315" />
<radio_item
height="16"
- label="In window"
+ label="Separate window"
layout="topleft"
left_delta="175"
name="1"
@@ -269,40 +220,50 @@ Avatars:
</radio_group>
<check_box
follows="top|left"
- height="20"
- label="Use Push-to-talk in toggle mode"
+ enabled_control="EnableVoiceChat"
+ control_name="PushToTalkToggle"
+ height="15"
+ label="Toggle speak on/off when I press:"
layout="topleft"
left="30"
name="push_to_talk_toggle_check"
width="237"
- top_pad="-25"
- tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/>
+ tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
<line_editor
follows="top|left"
- height="19"
- left_delta="50"
- max_length="254"
+ control_name="PushToTalkButton"
+ enabled="false"
+ enabled_control="EnableVoiceChat"
+ height="23"
+ left="80"
+ max_length="200"
name="modifier_combo"
- label="Push-to-talk trigger"
- top_pad="0"
- width="280" />
+ label="Push-to-Speak trigger"
+ top_pad="5"
+ width="200" />
<button
- follows="top|left"
- height="20"
- label="Set Key"
- left_delta="0"
- name="set_voice_hotkey_button"
- width="115"
- top_pad="5" />
+ follows="top|left"
+ enabled_control="EnableVoiceChat"
+ height="23"
+ label="Set Key"
+ left_pad="5"
+ name="set_voice_hotkey_button"
+ width="100">
+ <button.commit_callback
+ function="Pref.VoiceSetKey" />
+ </button>
<button
- bottom_delta="0"
- follows="left"
- font="SansSerif"
- halign="center"
- height="20"
- label="Middle Mouse Button"
- left_delta="120"
- mouse_opaque="true"
- name="set_voice_middlemouse_button"
- width="160" />
+ enabled_control="EnableVoiceChat"
+ follows="top|left"
+ halign="center"
+ height="23"
+ image_overlay="Refresh_Off"
+ tool_tip="Reset to Middle Mouse Button"
+ mouse_opaque="true"
+ name="set_voice_middlemouse_button"
+ left_pad="5"
+ width="25">
+ <button.commit_callback
+ function="Pref.VoiceSetMiddleMouse" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index 159323538c..188fd3b7bc 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="true"
- height="500"
+ height="408"
label="Popups"
layout="topleft"
left="0"
@@ -14,7 +14,7 @@
follows="top|left"
height="12"
layout="topleft"
- left="30"
+ left="10"
name="tell_me_label"
top="10"
width="300">
@@ -31,9 +31,8 @@
width="300" />
<check_box
control_name="ChatOnlineNotification"
- enabled="false"
height="16"
- label="When my friends log out or in"
+ label="When my friends log in or out"
layout="topleft"
left_delta="0"
name="friends_online_notify_checkbox"
@@ -43,58 +42,47 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifBold"
height="12"
layout="topleft"
- left="30"
+ left="10"
name="show_label"
- top_pad="14"
+ top_pad="8"
width="450">
- Always show these alerts:
+ Always show:
</text>
<scroll_list
follows="top|left"
- height="92"
+ height="140"
layout="topleft"
left="10"
- multi_select="true"
+ multi_select="true"
name="enabled_popups"
width="475" />
<button
enabled_control="FirstSelectedDisabledPopups"
follows="top|left"
- height="20"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
+ height="23"
image_overlay="Arrow_Up"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
hover_glow_amount="0.15"
layout="topleft"
- left_delta="137"
+ left="180"
name="enable_this_popup"
- picture_style="true"
- top_pad="10"
- width="43">
+ top_pad="5"
+ width="40">
<button.commit_callback
function="Pref.ClickEnablePopup" />
</button>
<button
enabled_control="FirstSelectedEnabledPopups"
follows="top|left"
- height="20"
- image_disabled="PushButton_Disabled"
- image_disabled_selected="PushButton_Disabled"
+ height="23"
image_overlay="Arrow_Down"
- image_selected="PushButton_Selected"
- image_unselected="PushButton_Off"
hover_glow_amount="0.15"
layout="topleft"
- left_pad="50"
+ left_pad="40"
name="disable_this_popup"
- picture_style="true"
top_delta="0"
- width="43">
+ width="40">
<button.commit_callback
function="Pref.ClickDisablePopup" />
</button>
@@ -102,21 +90,20 @@
type="string"
length="1"
follows="top|left"
- font="SansSerifBold"
height="12"
layout="topleft"
- left="30"
+ left="10"
name="dont_show_label"
- top_pad="10"
+ top_pad="-10"
width="450">
- Never show these alerts:
+ Never show:
</text>
<scroll_list
follows="top|left"
- height="92"
+ height="140"
layout="topleft"
left="10"
- multi_select="true"
+ multi_select="true"
name="disabled_popups"
width="475" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 051cb51d25..2e81139ef2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -9,20 +9,30 @@
name="chat"
top="1"
width="517">
- <radio_group
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ width="120"
+ top="10">
+ Font size:
+ </text>
+ <radio_group
height="30"
layout="topleft"
- left="30"
- control_name="ChatFontSize"
+ left="40"
+ control_name="ChatFontSize"
name="chat_font_size"
- top="10"
- width="331">
+ top_pad="0"
+ width="440">
<radio_item
height="16"
label="Small"
layout="topleft"
left="0"
name="radio"
+ value="0"
top="10"
width="125" />
<radio_item
@@ -31,6 +41,7 @@
layout="topleft"
left_delta="145"
name="radio2"
+ value="1"
top_delta="0"
width="125" />
<radio_item
@@ -39,20 +50,38 @@
layout="topleft"
left_delta="170"
name="radio3"
+ value="2"
top_delta="0"
width="125" />
</radio_group>
+
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ top_pad="10"
+ width="120"
+ >
+ Font colors:
+ </text>
+
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- control_name="UserChatColor"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="user"
top_pad="10"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="UserChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="UserChatColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -67,16 +96,21 @@
Me
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- control_name="AgentChatColor"
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="agent"
top_pad="-17"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="AgentChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="AgentChatColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -91,19 +125,24 @@
Others
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.6 0.6 1 1"
- control_name="IMChatColor"
+ color="LtGray"
follows="left|top"
height="47"
label_width="60"
layout="topleft"
- left="350"
+ left="360"
name="im"
top_pad="-17"
- width="44" />
- <text
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="IMChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="IMChatColor" />
+ </color_swatch>
+ <text
type="string"
length="1"
follows="left|top"
@@ -117,18 +156,23 @@
IM
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.8 1 1 1"
- control_name="SystemChatColor"
+ color="LtGray"
follows="left|top"
height="47"
label_width="44"
layout="topleft"
- left="30"
+ left="40"
name="system"
top_pad="40"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="SystemChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="SystemChatColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -143,17 +187,22 @@
System
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.82 0.82 0.99 1"
- control_name="ScriptErrorColor"
+ color="Red"
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="script_error"
top_pad="-17"
- width="44" />
+ width="44">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ScriptErrorColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ScriptErrorColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -168,17 +217,22 @@
Errors
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.7 0.9 0.7 1"
- control_name="ObjectChatColor"
+ color="EmphasisColor_35"
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="360"
name="objects"
top_pad="-17"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="ObjectChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="ObjectChatColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -193,17 +247,22 @@
Objects
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.7 0.9 0.7 1"
- control_name="llOwnerSayChatColor"
+ color="LtYellow"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="owner"
top_pad="40"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="llOwnerSayChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="llOwnerSayChatColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -218,42 +277,22 @@
Owner
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
- can_apply_immediately="true"
- color="0 0 0 1"
- control_name="BackgroundChatColor"
- follows="left|top"
- height="47"
- layout="topleft"
- left="180"
- name="background"
- top_pad="-17"
- width="44" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="5"
- mouse_opaque="false"
- name="text_box8"
- top_delta="5"
- width="95">
- Bubble
- </text>
- <color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
- color="0.6 0.6 1 1"
- control_name="HTMLLinkColor"
+ color="EmphasisColor"
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="190"
name="links"
top_pad="-17"
- width="44" />
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="HTMLLinkColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="HTMLLinkColor" />
+ </color_swatch>
<text
type="string"
length="1"
@@ -286,4 +325,61 @@
name="send_im_to_email"
top_pad="5"
width="400" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="Enable plain text chat history"
+ layout="topleft"
+ left_delta="0"
+ name="plain_text_chat_history"
+ top_pad="5"
+ width="400" />
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="20"
+ width="120"
+ top_pad="20">
+ Show IMs in:
+ </text>
+ <text
+ follows="left|top"
+ layout="topleft"
+ top_delta="0"
+ left="120"
+ height="20"
+ width="100"
+ text_color="White_25"
+ >
+ (requires restart)
+ </text>
+ <radio_group
+ height="30"
+ layout="topleft"
+ left="40"
+ control_name="ChatWindow"
+ name="chat_window"
+ top_pad="0"
+ tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)"
+ width="331">
+ <radio_item
+ height="16"
+ label="Separate windows"
+ layout="topleft"
+ left="0"
+ name="radio"
+ value="0"
+ top="0"
+ width="150" />
+ <radio_item
+ height="16"
+ label="Tabs"
+ layout="topleft"
+ left_delta="0"
+ name="radio2"
+ value="1"
+ top_pad="5"
+ width="150" />
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 975d21aaa6..099c789e4b 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -13,7 +13,7 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="language_textbox"
@@ -23,14 +23,13 @@
</text>
<combo_box
control_name="Language"
- follows="left|bottom"
- height="18"
+ follows="left|top"
+ height="23"
layout="topleft"
- left_delta="50"
+ left="50"
max_chars="135"
name="language_combobox"
- top_pad="10"
- width="170">
+ width="200">
<combo_box.item
enabled="true"
label="System default"
@@ -68,11 +67,6 @@
value="it" />
<combo_box.item
enabled="true"
- label="Magyar (Hungarian) - Beta"
- name="Hungarian"
- value="hu" />
- <combo_box.item
- enabled="true"
label="Nederlands (Dutch) - Beta"
name="Dutch"
value="nl" />
@@ -88,94 +82,63 @@
value="pt" />
<combo_box.item
enabled="true"
- label="РуÑÑкий (Russian) - Beta"
- name="Russian"
- value="ru" />
- <combo_box.item
- enabled="true"
- label="Türkçe (Turkish) - Beta"
- name="Turkish"
- value="tr" />
- <combo_box.item
- enabled="true"
- label="УкраїнÑька (Ukrainian) - Beta"
- name="Ukrainian"
- value="uk" />
- <combo_box.item
- enabled="true"
- label="中文 (简体) (Chinese) - Beta"
- name="Chinese"
- value="zh" />
- <combo_box.item
- enabled="true"
label="日本語 (Japanese) - Beta"
name="(Japanese)"
value="ja" />
- <combo_box.item
- enabled="true"
- label="한국어 (Korean) - Beta"
- name="(Korean)"
- value="ko" />
- <combo_box.item
- enabled="true"
- label="Test Language"
- name="TestLanguage"
- value="test" />
</combo_box>
<text
+ font="SansSerifSmall"
type="string"
+ text_color="White_50"
length="1"
follows="left|top"
- height="10"
+ height="18"
layout="topleft"
- left_delta="175"
+ left_pad="10"
name="language_textbox2"
- top_delta="1"
- width="400">
+ width="200">
(Requires restart)
</text>
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
+ top_pad="15"
name="maturity_desired_prompt"
- top_pad="10"
- width="400">
+ width="200">
I want to access content rated:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
- left="90"
+ left_pad="5"
name="maturity_desired_textbox"
- top_pad="10"
- width="400">
+ width="200">
</text>
<combo_box
control_name="PreferredMaturity"
- follows="left|bottom"
- height="18"
+ follows="left|top"
+ height="23"
layout="topleft"
- left_delta="-10"
+ left="50"
name="maturity_desired_combobox"
- top_pad="-10"
- width="170">
+ width="200">
<combo_box.item
- label="PG, Mature and Adult"
+ label="General, Moderate, Adult"
name="Desired_Adult"
value="42" />
<combo_box.item
- label="PG and Mature"
+ label="General and Moderate"
name="Desired_Mature"
value="21" />
<combo_box.item
- label="PG"
+ label="General"
name="Desired_PG"
value="13" />
</combo_box>
@@ -183,23 +146,22 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="start_location_textbox"
- top_delta="20"
+ top_pad="10"
width="394">
Start location:
</text>
<combo_box
control_name="LoginLocation"
- follows="left|bottom"
- height="18"
+ follows="left|top"
+ height="23"
layout="topleft"
- left_delta="50"
name="start_location_combo"
- top_pad="10"
- width="170">
+ left="50"
+ width="200">
<combo_box.item
label="My Last Location"
name="MyLastLocation"
@@ -215,54 +177,48 @@
initial_value="true"
label="Show on login"
layout="topleft"
- left_delta="175"
+ left_pad="5"
name="show_location_checkbox"
- top_delta="1"
- width="256" />
-
+ top_delta="5"
+ width="256" />
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="name_tags_textbox"
- top_pad="10"
+ top_pad="15"
width="400">
Name tags:
</text>
<radio_group
control_name="AvatarNameTagMode"
- height="30"
+ height="20"
layout="topleft"
- left_delta="50"
- name="Name_Tag_Preference"
- top_pad="10">
+ left="50"
+ name="Name_Tag_Preference">
<radio_item
- height="16"
label="Off"
layout="topleft"
- left="0"
name="radio"
- top_pad="0"
- width="98" />
+ value="0"
+ width="75" />
<radio_item
- height="16"
label="On"
layout="topleft"
left_pad="12"
name="radio2"
- top_delta="0"
- width="98" />
+ value="1"
+ width="75" />
<radio_item
- height="16"
label="Show briefly"
layout="topleft"
left_pad="12"
name="radio3"
- top_delta="0"
- width="98" />
+ value="2"
+ width="160" />
</radio_group>
<check_box
enabled_control="AvatarNameTagMode"
@@ -270,9 +226,8 @@
height="16"
label="Show my name"
layout="topleft"
- left_delta="0"
+ left="50"
name="show_my_name_checkbox1"
- top_pad="-7"
width="300" />
<check_box
enabled_control="AvatarNameTagMode"
@@ -283,7 +238,6 @@
layout="topleft"
left_delta="175"
name="small_avatar_names_checkbox"
- top_delta="0"
width="200" />
<check_box
enabled_control="AvatarNameTagMode"
@@ -299,74 +253,77 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="effects_color_textbox"
- top_pad="5"
- width="400">
- My Effects:
+ top_pad="15"
+ width="200">
+ My effects:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left_pad="5"
+ name="title_afk_text"
+ width="190">
+ Away timeout:
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
- control_name="EffectColor"
+ can_apply_immediately="true"
follows="left|top"
- height="48"
+ height="50"
layout="topleft"
- left_delta="50"
+ left="50"
name="effect_color_swatch"
tool_tip="Click to open Color Picker"
- top_pad="5"
- width="32" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="15"
- layout="topleft"
- left="30"
- name="title_afk_text"
- text_color="white"
- top_pad="-5"
- width="190">
- Away timeout:
- </text>
- <spinner
- control_name="AFKTimeout"
- decimal_digits="0"
- follows="left|top"
- halign="right"
- height="15"
- increment="1"
- initial_value="300"
- label=""
- label_width="0"
- layout="topleft"
- left_delta="50"
- max_val="600"
- min_val="30"
- name="afk_timeout_spinner"
- top_pad="5"
- width="50" />
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="left"
- height="15"
- layout="topleft"
- left_pad="2"
- name="seconds_textbox"
- width="70">
- seconds
- </text>
+ width="38">
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="EffectColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="EffectColor" />
+ </color_swatch>
+ <combo_box
+ height="23"
+ layout="topleft"
+ control_name="AFKTimeout"
+ left_pad="160"
+ label="Away timeout:"
+ top_delta="0"
+ name="afk"
+ width="130">
+ <combo_box.item
+ label="2 minutes"
+ name="item0"
+ value="120" />
+ <combo_box.item
+ label="5 minutes"
+ name="item1"
+ value="300" />
+ <combo_box.item
+ label="10 minutes"
+ name="item2"
+ value="600" />
+ <combo_box.item
+ label="30 minutes"
+ name="item3"
+ value="1800" />
+ <combo_box.item
+ label="never"
+ name="item4"
+ value="0" />
+ </combo_box>
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="13"
layout="topleft"
- text_color="white"
left="30"
mouse_opaque="false"
name="text_box3"
@@ -376,16 +333,19 @@
</text>
<text_editor
control_name="BusyModeResponse2"
+ text_readonly_color="LabelDisabledColor"
+ bg_writeable_color="LtGray"
+ use_ellipses="false"
+ hover="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="56"
+ height="60"
layout="topleft"
- left_delta="50"
+ left="50"
name="busy_response"
- width="400"
- word_wrap="true"
- top_pad="5">
+ width="440"
+ word_wrap="true">
log_in_to_change
</text_editor>
-
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index b1308a1942..f20526b491 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -16,81 +16,8 @@
height="12"
layout="topleft"
left="30"
- name="WindowSizeLabel"
- top="10"
- width="300">
- Window size:
- </text>
- <check_box
- control_name="WindowFullScreen"
- height="16"
- label="Use fullscreen"
- layout="topleft"
- left_delta="50"
- name="windowed mode"
- top_pad="4"
- width="175">
- </check_box>
- <combo_box
- visiblity_control="WindowFullScreen"
- allow_text_entry="false"
- enabled="true"
- layout="topleft"
- height="18"
- left_delta="220"
- max_chars="20"
- mouse_opaque="true"
- name="windowsize combo"
- top_delta="-1"
- width="150">
- <combo_box.item
- type="string"
- length="1"
- enabled="true"
- name="640x480"
- value="640 x 480"
- label="640x480"/>
- <combo_box.item
- type="string"
- length="1"
- enabled="true"
- name="800x600"
- value="800 x 600"
- label="800x600"/>
- <combo_box.item
- type="string"
- length="1"
- enabled="true"
- name="720x480"
- value="720 x 480"
- label="720x480 (NTSC)"/>
- <combo_box.item
- type="string"
- length="1"
- enabled="true"
- name="768x576"
- value="768 x 576"
- label="768x576 (PAL)"/>
- <combo_box.item
- type="string"
- length="1"
- enabled="true"
- name="1024x768"
- value="1024 x 768"
- label="1024x768"/>
- <combo_box.commit_callback
- function="Pref.setControlFalse"
- parameter="FullScreenAutoDetectAspectRatio" />
- </combo_box>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="30"
name="UI Size:"
- top_pad="4"
+ top="10"
width="300">
UI size:
</text>
@@ -109,19 +36,7 @@
name="ui_scale_slider"
top_pad="2"
width="180" />
- <spinner
- control_name="UIScaleFactor"
- height="16"
- increment="0.025"
- initial_value="1"
- layout="topleft"
- left_pad="10"
- max_val="1.4"
- min_val="0.75"
- name="ui_scale_slider"
- top_delta="0"
- width="58" />
- <text
+ <text
type="string"
length="1"
follows="left|top"
@@ -161,7 +76,7 @@
<icon
color="0.12 0.12 0.12 1"
height="14"
- image_name="rounded_square.tga"
+ image_name="Rounded_Square"
layout="topleft"
left="128"
name="LowGraphicsDivet"
@@ -170,7 +85,7 @@
<icon
color="0.12 0.12 0.12 1"
height="14"
- image_name="rounded_square.tga"
+ image_name="Rounded_Square"
layout="topleft"
left_pad="83"
name="MidGraphicsDivet"
@@ -179,7 +94,7 @@
<icon
color="0.12 0.12 0.12 1"
height="14"
- image_name="rounded_square.tga"
+ image_name="Rounded_Square"
layout="topleft"
left_pad="85"
name="HighGraphicsDivet"
@@ -188,7 +103,7 @@
<icon
color="0.12 0.12 0.12 1"
height="14"
- image_name="rounded_square.tga"
+ image_name="Rounded_Square"
layout="topleft"
left_pad="83"
name="UltraGraphicsDivet"
@@ -451,10 +366,7 @@
min_val="64"
name="DrawDistance"
top="3"
- width="255">
- <slider.commit_callback
- function="Pref.UpdateMeterText" />
- </slider>
+ width="255" />
<text
type="string"
length="1"
@@ -463,7 +375,7 @@
layout="topleft"
left_delta="250"
name="DrawDistanceMeterText2"
- top_delta="1"
+ top_delta="0"
width="128">
m
</text>
@@ -480,7 +392,7 @@
left="216"
max_val="8192"
name="MaxParticleCount"
- top_pad="6"
+ top_pad="7"
width="262" />
<slider
control_name="RenderGlowResolutionPow"
@@ -741,6 +653,7 @@
layout="topleft"
left="3"
name="SunMoon"
+ value="0"
top="3"
width="156" />
<radio_item
@@ -749,6 +662,7 @@
layout="topleft"
left_delta="0"
name="LocalLights"
+ value="1"
top_delta="16"
width="156" />
</radio_group>
@@ -790,23 +704,25 @@
top_delta="16"
width="315" />
</radio_group>
- </panel>
+ </panel>
+
<button
follows="left|bottom"
- height="20"
+ height="23"
label="Apply"
label_selected="Apply"
layout="topleft"
left="10"
name="Apply"
top="383"
- width="115">
+ width="115"
+ >
<button.commit_callback
function="Pref.Apply" />
</button>
<button
follows="left|bottom"
- height="20"
+ height="23"
label="Reset"
layout="topleft"
left_pad="3"
@@ -819,7 +735,7 @@
<button
control_name="ShowAdvancedGraphicsSettings"
follows="right|bottom"
- height="20"
+ height="23"
is_toggle="true"
label="Advanced"
layout="topleft"
@@ -829,7 +745,7 @@
width="115" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Hardware"
label_selected="Hardware"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index ce7939c00f..f232a69482 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -15,8 +15,9 @@
</panel.string>
<button
follows="left|bottom"
- height="20"
+ height="23"
label="Clear History"
+ tool_tip="Clear login image, last location, teleport history, web, and texture cache"
layout="topleft"
left="30"
name="clear_cache"
@@ -77,16 +78,7 @@
name="cookies_enabled"
top_pad="10"
width="350" />
- <check_box
- control_name="AutoPlayMedia"
- height="16"
- label="Allow Media Autoplay"
- layout="topleft"
- left="30"
- name="autoplay_enabled"
- top_pad="10"
- width="350" />
- <text
+ <text
type="string"
length="1"
follows="left|top"
@@ -94,66 +86,33 @@
layout="topleft"
left="30"
mouse_opaque="false"
+ name="Logs:"
top_pad="10"
width="350">
Logs:
</text>
<check_box
-
+ enabled="false"
+ control_name="LogChat"
+ height="16"
+ label="Save nearby chat logs on my computer"
+ layout="topleft"
+ left="30"
+ name="log_nearby_chat"
+ top_pad="10"
+ width="350">
+ </check_box>
+ <check_box
enabled="false"
control_name="LogInstantMessages"
height="16"
- label="Save logs on my computer"
+ label="Save IM logs on my computer"
layout="topleft"
left="30"
name="log_instant_messages"
top_pad="10"
width="350">
- <check_box.commit_callback
- function="Pref.Logging" />
</check_box>
- <radio_group
- control_name="IMLogOptions"
- enabled="false"
- height="80"
- layout="topleft"
- left_delta="50"
- name="ChatIMLogs"
- width="350"
- top_pad="0">
- <radio_item
- height="16"
- label="Chat"
- layout="topleft"
- left="0"
- name="radio1"
- top="3"
- width="200" />
- <radio_item
- height="16"
- label="IM"
- layout="topleft"
- left_delta="0"
- name="radio2"
- top_pad="3"
- width="200" />
- <radio_item
- height="16"
- label="Both, together"
- layout="topleft"
- left_delta="0"
- name="radio3"
- top_pad="3"
- width="200" />
- <radio_item
- height="16"
- label="Both, separate"
- layout="topleft"
- left_delta="0"
- name="radio4"
- top_pad="3"
- width="200" />
- </radio_group>
<check_box
control_name="LogTimestamp"
enabled="false"
@@ -164,18 +123,6 @@
name="show_timestamps_check_im"
top_pad="10"
width="237" />
- <line_editor
- bottom="366"
- control_name="InstantMessageLogFolder"
- enabled="false"
- follows="top|left|right"
- halign="right"
- height="19"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="log_path_string"
- top_pad="5" />
<text
type="string"
length="1"
@@ -184,29 +131,41 @@
layout="topleft"
left_delta="0"
mouse_opaque="false"
- top_pad="1"
- width="128"
- text_color="LtGray_50">
- Location of logs
+ name="log_path_desc"
+ top_pad="5"
+ width="128">
+ Location of logs:
</text>
+ <line_editor
+ bottom="366"
+ control_name="InstantMessageLogPath"
+ follows="top|left|right"
+ halign="right"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="log_path_string"
+ top_pad="5"
+ width="250"/>
<button
enabled="false"
follows="right|bottom"
- height="20"
+ height="23"
label="Browse"
label_selected="Browse"
layout="topleft"
- left_pad="115"
+ left_pad="5"
name="log_path_button"
- top_delta="-21"
+ top_delta="0"
width="145">
<button.commit_callback
function="Pref.LogPath" />
</button>
<button
follows="left|bottom"
- height="20"
- label="Block List"
+ height="23"
+ label="Block list"
layout="topleft"
left="30"
name="block_list"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 9cf0bd26d8..8723e0a832 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -3,70 +3,70 @@
border="true"
follows="left|top|right|bottom"
height="408"
- label="Input &amp; Camera"
+ label="Setup"
layout="topleft"
left="102"
name="Input panel"
top="1"
width="517">
- <button
- height="20"
- label="Other Devices"
- layout="topleft"
- left="30"
- name="joystick_setup_button"
- top="10"
- width="155">
- <button.commit_callback
- function="Floater.Show"
- parameter="pref_joystick" />
- </button>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="30"
- name="Mouselook:"
- top_pad="10"
- width="300">
- Mouselook:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="50"
- name=" Mouse Sensitivity"
- top_pad="10"
- width="150">
- Mouse sensitivity
- </text>
- <slider
- control_name="MouseSensitivity"
- follows="left|top"
- height="15"
- initial_value="2"
- layout="topleft"
- show_text="false"
- left_delta="150"
- max_val="15"
- name="mouse_sensitivity"
- top_delta="0"
- width="145" />
- <check_box
- control_name="InvertMouse"
- height="16"
- label="Invert"
- layout="topleft"
- left_pad="2"
- name="invert_mouse"
- top_delta="0"
- width="128" />
- <text
+ <button
+ height="23"
+ label="Other Devices"
+ layout="topleft"
+ left="30"
+ name="joystick_setup_button"
+ top="10"
+ width="155">
+ <button.commit_callback
+ function="Floater.Show"
+ parameter="pref_joystick" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="Mouselook:"
+ top_pad="10"
+ width="300">
+ Mouselook:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="50"
+ name=" Mouse Sensitivity"
+ top_pad="10"
+ width="150">
+ Mouse sensitivity
+ </text>
+ <slider
+ control_name="MouseSensitivity"
+ follows="left|top"
+ height="15"
+ initial_value="2"
+ layout="topleft"
+ show_text="false"
+ left_delta="150"
+ max_val="15"
+ name="mouse_sensitivity"
+ top_delta="0"
+ width="145" />
+ <check_box
+ control_name="InvertMouse"
+ height="16"
+ label="Invert"
+ layout="topleft"
+ left_pad="2"
+ name="invert_mouse"
+ top_delta="0"
+ width="128" />
+ <text
type="string"
length="1"
follows="left|top"
@@ -77,265 +77,270 @@
mouse_opaque="false"
top_pad="4"
width="300">
- Network:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="50"
- name="Maximum bandwidth"
- mouse_opaque="false"
- top_pad="10"
- width="200">
- Maximum bandwidth
- </text>
- <slider
- can_edit_text="true"
- control_name="ThrottleBandwidthKBPS"
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="10"
- initial_value="50"
- layout="topleft"
- left_delta="150"
- max_val="1500"
- min_val="50"
- name="max_bandwidth"
- top_delta="0"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="6"
- mouse_opaque="false"
- name="text_box2"
- top_delta="1"
- width="200">
- kbps
- </text>
- <check_box
- control_name="ConnectionPortEnabled"
- height="16"
- label="Custom port"
- layout="topleft"
- left="77"
- name="connection_port_enabled"
- top_pad="20"
- width="256">
- <check_box.commit_callback
- function="Notification.Show"
- parameter="ChangeConnectionPort" />
- </check_box>
- <spinner
- control_name="BrowserProxyPort"
- enabled_control="BrowserProxyEnabled"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="80"
- label="Port number:"
- label_width="75"
- layout="topleft"
- left_delta="160"
- max_val="12000"
- min_val="10"
- name="web_proxy_port"
- top_delta="-2"
- width="140" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- mouse_opaque="false"
- name="cache_size_label_l"
- top_pad="20"
- width="200">
- Cache size
- </text>
- <slider
- can_edit_text="true"
- control_name="CacheSize"
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="10"
- initial_value="50"
- layout="topleft"
- left_delta="150"
- max_val="1000"
- min_val="10"
- name="cache_size"
- top_delta="-1"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="6"
- mouse_opaque="false"
- name="text_box5"
- top_delta="1"
- width="40">
- MB
- </text>
- <line_editor
- control_name="CacheLocationTopFolder"
- border_style="line"
- border_thickness="1"
- enabled="false"
- follows="left|top"
- font="SansSerif"
- handle_edit_keys_directly="true"
- height="20"
- layout="topleft"
- left="80"
- max_length="4096"
- name="cache_location"
- top_pad="20"
- width="205" />
- <button
- follows="left|top"
- height="22"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="set_cache"
- top_delta="-1"
- width="100">
- <button.commit_callback
- function="Pref.SetCache" />
- </button>
- <button
- follows="left|top"
- height="22"
- label="Reset"
- label_selected="Set"
- layout="topleft"
- left_pad="3"
- name="reset_cache"
- top_delta="0"
- width="100">
- <button.commit_callback
- function="Pref.ResetCache" />
- </button>
+ Network:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="50"
+ name="Maximum bandwidth"
+ mouse_opaque="false"
+ top_pad="10"
+ width="200">
+ Maximum bandwidth
+ </text>
+ <slider
+ can_edit_text="true"
+ control_name="ThrottleBandwidthKBPS"
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="100"
+ initial_value="500"
+ layout="topleft"
+ left_delta="150"
+ max_val="10000"
+ min_val="100"
+ name="max_bandwidth"
+ top_delta="0"
+ width="180" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="6"
+ mouse_opaque="false"
+ name="text_box2"
+ top_delta="1"
+ width="200">
+ kbps
+ </text>
+ <check_box
+ control_name="ConnectionPortEnabled"
+ height="16"
+ label="Custom port"
+ layout="topleft"
+ left="77"
+ name="connection_port_enabled"
+ top_pad="20"
+ width="256">
+ <check_box.commit_callback
+ function="Notification.Show"
+ parameter="ChangeConnectionPort" />
+ </check_box>
+ <spinner
+ control_name="ConnectionPort"
+ enabled_control="ConnectionPortEnabled"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="13000"
+ label="Port number:"
+ label_width="75"
+ layout="topleft"
+ left_delta="160"
+ max_val="13050"
+ min_val="13000"
+ name="connection_port"
+ top_delta="-2"
+ width="140" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="80"
+ mouse_opaque="false"
+ name="cache_size_label_l"
+ top_pad="20"
+ width="200">
+ Cache size
+ </text>
+ <slider
+ can_edit_text="true"
+ control_name="CacheSize"
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="16"
+ initial_value="512"
+ layout="topleft"
+ left_delta="150"
+ max_val="1024"
+ min_val="32"
+ name="cache_size"
+ top_delta="-2"
+ width="180" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="6"
+ mouse_opaque="false"
+ name="text_box5"
+ top_delta="1"
+ width="40">
+ MB
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="80"
+ name="Cache location"
+ top_delta="20"
+ width="300">
+ Cache location:
+ </text>
+ <line_editor
+ control_name="CacheLocationTopFolder"
+ border_style="line"
+ border_thickness="1"
+ enabled="false"
+ follows="left|top"
+ font="SansSerif"
+ handle_edit_keys_directly="true"
+ height="23"
+ layout="topleft"
+ left="80"
+ max_length="4096"
+ name="cache_location"
+ top_pad="5"
+ width="205" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse"
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="set_cache"
+ top_delta="-1"
+ width="100">
+ <button.commit_callback
+ function="Pref.SetCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Reset"
+ label_selected="Reset"
+ layout="topleft"
+ left_pad="3"
+ name="reset_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ResetCache" />
+ </button>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- name="Cache location"
- top_delta="20"
- width="300"
- text_color="LtGray_50">
- Cache location
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="30"
- name="Web:"
- top_pad="5"
- width="300">
- Web:
- </text>
- <radio_group
- control_name="UseExternalBrowser"
- draw_border="false"
- follows="top|left"
- height="40"
- layout="topleft"
- left_delta="50"
- name="use_external_browser"
- top_pad="4"
- width="480">
- <radio_item
- height="20"
- label="Use built-in browser"
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
layout="topleft"
- left="0"
- name="internal"
- tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]."
- top="0"
- width="480" />
- <radio_item
- height="20"
- label="Use my browser (IE, Firefox)"
- layout="topleft"
- left_delta="0"
- name="external"
- tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
- top_delta="20"
- width="480" />
- </radio_group>
-
- <check_box
- top_delta="4"
- enabled="true"
- follows="left|top"
- height="16"
- initial_value="false"
- label="Web proxy"
- left_delta="0"
- mouse_opaque="true"
- name="web_proxy_enabled"
- radio_style="false"
- width="400" />
- <line_editor
- control_name="BrowserProxyAddress"
- enabled_control="BrowserProxyEnabled"
- follows="left|top"
- font="SansSerif"
- height="20"
- layout="topleft"
- left_delta="1"
- name="web_proxy_editor"
- tool_tip="The name or IP address of the proxy you would like to use"
- top_pad="4"
- width="200" />
- <button
- follows="left|top"
- height="22"
- enabled="false"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="set_proxy"
- top_pad="-21"
- width="100">
- <button.commit_callback
- function="Pref.SetCache" />
- </button>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="-203"
- name="Proxy location"
- top_delta="20"
- width="300"
- text_color="LtGray_50">
- Proxy location
- </text></panel>
+ left="30"
+ name="Web:"
+ top_pad="5"
+ width="300">
+ Web:
+ </text>
+ <radio_group
+ control_name="UseExternalBrowser"
+ draw_border="false"
+ follows="top|left"
+ height="40"
+ layout="topleft"
+ left_delta="50"
+ name="use_external_browser"
+ top_pad="4"
+ width="480">
+ <radio_item
+ height="20"
+ label="Use built-in browser"
+ layout="topleft"
+ left="0"
+ name="internal"
+ value="0"
+ tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]."
+ top="0"
+ width="480" />
+ <radio_item
+ height="20"
+ label="Use my browser (IE, Firefox, Safari)"
+ layout="topleft"
+ left_delta="0"
+ name="external"
+ value="1"
+ tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
+ top_delta="20"
+ width="480" />
+ </radio_group>
+
+ <check_box
+ top_delta="4"
+ enabled="true"
+ follows="left|top"
+ height="16"
+ initial_value="false"
+ control_name="BrowserProxyEnabled"
+ label="Enable Web Proxy"
+ left_delta="0"
+ mouse_opaque="true"
+ name="web_proxy_enabled"
+ radio_style="false"
+ width="400" top_pad="5"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="1"
+ name="Proxy location"
+ top_delta="20"
+ width="300">
+ Proxy location:
+ </text>
+ <line_editor
+ control_name="BrowserProxyAddress"
+ enabled_control="BrowserProxyEnabled"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="web_proxy_editor"
+ tool_tip="The name or IP address of the proxy you would like to use"
+ top_pad="4"
+ width="200" />
+ <spinner
+ control_name="BrowserProxyPort"
+ enabled_control="BrowserProxyEnabled"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="80"
+ label="Port number:"
+ label_width="75"
+ layout="topleft"
+ left_delta="230"
+ max_val="12000"
+ min_val="10"
+ name="web_proxy_port"
+ top_delta="0"
+ width="140" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 832c9775ce..c9752cf913 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -17,43 +17,75 @@
increment="0.05"
initial_value="0.5"
label="Master volume"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="System Volume"
show_text="false"
slider_label.halign="right"
- top_pad="5"
+ top="10"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteAudio" />
</slider>
<button
control_name="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="16"
+ left_pad="5"
name="mute_audio"
- picture_style="true"
tab_stop="false"
- top_delta="-2"
- width="22" />
+ width="16" />
<check_box
control_name="MuteWhenMinimized"
height="15"
initial_value="true"
- label="Mute if minimized"
+ label="Mute when minimized"
layout="topleft"
- left="167"
name="mute_when_minimized"
- top_pad="5"
+ top_delta="3"
+ left_pad="5"
width="215" />
+ <slider
+ control_name="AudioLevelUI"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.05"
+ initial_value="0.5"
+ label="Buttons"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ name="UI Volume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="7"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteUI" />
+ </slider>
+ <button
+ control_name="MuteUI"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
<slider
control_name="AudioLevelAmbient"
disabled_control="MuteAudio"
@@ -62,7 +94,7 @@
increment="0.05"
initial_value="0.5"
label="Ambient"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="Wind Volume"
@@ -70,98 +102,24 @@
slider_label.halign="right"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteAmbient" />
</slider>
- <button
- control_name="MuteAmbient"
- disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
- is_toggle="true"
- layout="topleft"
- left_pad="16"
- name="mute_wind"
- picture_style="true"
- tab_stop="false"
- top_delta="-2"
- width="22" />
- <slider
- control_name="AudioLevelUI"
- disabled_control="MuteAudio"
- follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Buttons"
- label_width="160"
- layout="topleft"
- left="0"
- name="UI Volume"
- show_text="false"
- slider_label.halign="right"
- top_pad="7"
- volume="true"
- width="350">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteUI" />
- </slider>
- <button
- control_name="MuteUI"
- disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
- is_toggle="true"
- layout="topleft"
- left_pad="16"
- name="mute_ui"
- picture_style="true"
- tab_stop="false"
- top_delta="-2"
- width="22" />
- <slider
- control_name="AudioLevelMedia"
- disabled_control="MuteAudio"
- follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Media"
- label_width="160"
- layout="topleft"
- left="0"
- name="Media Volume"
- show_text="false"
- slider_label.halign="right"
- top_pad="7"
- volume="true"
- width="350">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteMedia" />
- </slider>
- <button
- control_name="MuteMedia"
+ <button
+ control_name="MuteAmbient"
disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="16"
- name="mute_media"
- picture_style="true"
+ left_pad="5"
+ name="mute_audio"
tab_stop="false"
- top_delta="-2"
- width="22" />
+ width="16" />
<slider
control_name="AudioLevelSFX"
disabled_control="MuteAudio"
@@ -169,8 +127,8 @@
height="15"
increment="0.05"
initial_value="0.5"
- label="Sound effects"
- label_width="160"
+ label="Sound Effects"
+ label_width="120"
slider_label.halign="right"
layout="topleft"
left="0"
@@ -178,26 +136,24 @@
show_text="false"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteSounds" />
</slider>
- <button
+ <button
control_name="MuteSounds"
disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="16"
- name="mute_sfx"
- picture_style="true"
+ left_pad="5"
+ name="mute_audio"
tab_stop="false"
- top_delta="-2"
- width="22" />
+ width="16" />
<slider
control_name="AudioLevelMusic"
disabled_control="MuteAudio"
@@ -206,7 +162,7 @@
increment="0.05"
initial_value="0.5"
label="Streaming music"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="Music Volume"
@@ -214,151 +170,244 @@
show_text="false"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteMusic" />
- </slider>
+ </slider>
<button
control_name="MuteMusic"
- disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="16"
- name="mute_music"
- picture_style="true"
+ left_pad="5"
+ name="mute_audio"
tab_stop="false"
- top_delta="-2"
- width="22" />
- <check_box
- height="16"
- control_name ="EnableVoiceChat"
- disabled_control="CmdLineDisableVoice"
- label="Enable Voice"
- layout="topleft"
- left="22"
- name="enable_voice_check"
- width="100">
- </check_box>
- <slider
- control_name="AudioLevelVoice"
- enabled_control="EnableVoiceChat"
- disabled_control="MuteAudio"
+ width="16" />
+ <check_box
+ control_name="AudioStreamingMusic"
+ height="16"
+ label="Enabled"
+ layout="topleft"
+ left_pad="5"
+ name="music_enabled"
+ top_delta="2"
+ width="350"/>
+ <slider
+ control_name="AudioLevelMedia"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.05"
+ initial_value="0.5"
+ label="Media"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ name="Media Volume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="7"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteMedia" />
+ </slider>
+ <button
+ control_name="MuteMedia"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="AudioStreamingMedia"
+ label="Enabled"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_media"
+ width="110"/>
+ <slider
+ control_name="AudioLevelVoice"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.05"
+ initial_value="0.5"
+ label="Voice Chat"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ top_delta="20"
+ name="Voice Volume"
+ show_text="false"
+ slider_label.halign="right"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteVoice" />
+ </slider>
+ <button
+ control_name="MuteVoice"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="EnableVoiceChat"
+ disabled_control="CmdLineDisableVoice"
+ label="Enabled"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_voice_check"
+ width="110"/>
+ <!-- -->
+ <check_box
+ name="media_auto_play_btn"
+ control_name="ParcelMediaAutoPlayEnable"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Check this to let media auto-play if it wants"
+ label="Allow Media to auto-play"
+ top_pad="5"
+ left="25"/>
+ <check_box
+ name="media_show_on_others_btn"
+ control_name="MediaShowOnOthers"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Uncheck this to hide media attached to other avatars nearby"
+ label="Play media attached to other avatars"
+ left="25"/>
+
+ <text
+ type="string"
+ length="1"
follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Voice"
- label_width="60"
- layout="topleft"
- left="100"
- name="Voice Volume"
- show_text="false"
- slider_label.halign="right"
- top_pad="-15"
- volume="true"
- width="250">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteVoice" />
- </slider>
- <button
- control_name="MuteVoice"
- enabled_control="EnableVoiceChat"
- disabled_control="MuteAudio"
- follows="top|right"
- height="18"
- image_selected="parcel_drk_VoiceNo"
- image_unselected="parcel_drk_Voice"
- is_toggle="true"
+ height="20"
layout="topleft"
- left_pad="16"
- name="mute_voice"
- picture_style="true"
- tab_stop="false"
- top_delta="-2"
- width="22" />
+ left="25"
+ name="voice_chat_settings"
+ width="200"
+ top="210">
+ Voice Chat Settings
+ </text>
<text
type="string"
length="1"
follows="left|top"
- height="13"
layout="topleft"
- left="170"
+ left="80"
+ top_delta="16"
name="Listen from"
- width="200">
+ width="80">
Listen from:
</text>
- <icon
- follows="left"
- height="18"
- image_name="CameraView_Off"
- name="camera_icon"
- mouse_opaque="false"
- visible="true"
- width="18" />
<icon
- follows="left"
- height="18"
- image_name="Move_Walk_Off"
- name="avatar_icon"
- mouse_opaque="false"
- visible="true"
- width="18" />
+ follows="left|top"
+ height="18"
+ image_name="Cam_FreeCam_Off"
+ layout="topleft"
+ name="camera_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ left_pad="0"
+ top_delta="-5"/>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Move_Walk_Off"
+ layout="topleft"
+ name="avatar_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ top_delta="20" />
<radio_group
enabled_control="EnableVoiceChat"
control_name="VoiceEarLocation"
draw_border="false"
- follows="left"
- left_delta="20"
- top = "210"
- width="221"
- height="38"
+ follows="left|top"
+ layout="topleft"
+ left_pad="2"
+ width="221"
+ height="38"
name="ear_location">
- <radio_item
- height="16"
- label="Camera position"
- left_pad="1"
- follows="topleft"
- name="0"
- top_delta="-30"
- width="200" />
- <radio_item
- height="16"
- follows="topleft"
- label="Avatar position"
- left_delta="0"
- name="1"
- top_delta="19"
- width="200" />
- </radio_group>
- <button
- control_name="ShowDeviceSettings"
- follows="left|bottom"
- height="19"
- is_toggle="true"
- label="Input / Output Devices"
+ <radio_item
+ height="16"
+ label="Camera position"
+ follows="left|top"
layout="topleft"
- left="165"
- top_pad="12"
- name="device_settings_btn"
- width="190" />
+ name="0"
+ width="200"/>
+ <radio_item
+ height="16"
+ follows="left|top"
+ label="Avatar position"
+ layout="topleft"
+ name="1"
+ width="200" />
+ </radio_group>
+ <button
+ control_name="ShowDeviceSettings"
+ follows="left|top"
+ height="23"
+ is_toggle="true"
+ label="Input/Output devices"
+ layout="topleft"
+ left="80"
+ top_pad="5"
+ name="device_settings_btn"
+ width="190">
+ </button>
<panel
- background_visible="true"
+ background_visible="false"
bg_alpha_color="DkGray"
visiblity_control="ShowDeviceSettings"
border="false"
follows="top|left"
- height="145"
- label="DeviceSettings"
+ height="120"
+ label="Device Settings"
layout="topleft"
left="0"
- name="Device Settings"
- width="501">
+ name="device_settings_panel"
+ class="panel_voice_device_settings"
+ width="501"
+ top="285">
+ <panel.string
+ name="default_text">
+ Default
+ </panel.string>
<icon
height="18"
image_name="Microphone_On"
@@ -381,12 +430,13 @@
Input
</text>
<combo_box
- height="19"
+ height="23"
+ control_name="VoiceInputAudioDevice"
layout="topleft"
left="165"
max_chars="128"
name="voice_input_device"
- top_pad="0"
+ top_pad="-2"
width="200" />
<text
type="string"
@@ -396,11 +446,12 @@
layout="topleft"
left="165"
name="My volume label"
- top_pad="10"
+ top_pad="5"
width="200">
My volume:
</text>
- <slider
+ <slider_bar
+ control_name="AudioLevelMic"
follows="left|top"
height="17"
increment="0.05"
@@ -410,7 +461,7 @@
max_val="2"
name="mic_volume_slider"
tool_tip="Change the volume using this slider"
- top_pad="0"
+ top_pad="-2"
width="220" />
<text
type="string"
@@ -430,49 +481,39 @@
layout="topleft"
left_delta="0"
name="bar0"
- top_delta="5"
+ top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar1"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar2"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar3"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar4"
top_delta="0"
width="20" />
- <!-- <text
- type="string"
- height="37"
- left="30"
- name="voice_intro_text1"
- top_pad="-4"
- width="410"
- word_wrap="true">
- Adjust the slider to control how loud you sound to other people. To test your volume, simply speak into your microphone
- </text>-->
<icon
height="18"
- image_name="parcel_lght_Voice"
+ image_name="Parcel_Voice_Light"
left="80"
name="speaker_icon"
mouse_opaque="false"
@@ -492,25 +533,13 @@
Output
</text>
<combo_box
- height="19"
+ control_name="VoiceOutputAudioDevice"
+ height="23"
layout="topleft"
left="165"
max_chars="128"
name="voice_output_device"
- top_pad="0"
+ top_pad="-2"
width="200" />
</panel>
- <!-- Until new panel is hooked up to code, we need to be able to get to
- the old window to change input devices. James -->
- <button
- follows="left|bottom"
- label="Old"
- name="legacy_device_window_btn"
- height="16"
- left="20"
- top="-270"
- width="40"
- commit_callback.function="Floater.Show"
- commit_callback.parameter="pref_voicedevicesettings"
- />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index b21fbc1795..6b5f0c3896 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -1,37 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="left|right|top|bottom"
- name="MediaControls"
- bg_alpha_color="1 1 1 0"
- height="160"
+ name="MediaControlsPanel"
+ background_visible="false"
+ height="200"
layout="topleft"
+ help_topic="prim_media_controls"
mouse_opaque="false"
+ min_width="300"
width="800">
- <panel
- name="media_region"
- bottom="125"
- follows="left|right|top|bottom"
- layout="topleft"
- left="20"
- mouse_opaque="false"
- right="-20"
- top="20" />
+ <string name="control_background_image_name">Inspector_Background</string>
+ <string name="skip_step">0.2</string>
+ <string name="min_width">300</string>
+ <string name="min_height">75</string>
+ <string name="zoom_near_padding">1.0</string>
+ <string name="zoom_medium_padding">1.1</string>
+ <string name="zoom_far_padding">1.5</string>
+ <string name="top_world_view_avoid_zone">50</string>
<layout_stack
- follows="left|right|bottom"
- height="32"
+ name="progress_indicator_area"
+ follows="left|right|top"
+ height="8"
layout="topleft"
animate="false"
left="0"
orientation="horizontal"
- top="96">
+ top="22">
<!-- outer layout_panels center the inner one -->
<layout_panel
width="0"
+ name="left_bookend_bottom"
+ mouse_opaque="false"
layout="topleft"
user_resize="false" />
<panel
name="media_progress_indicator"
- height="22"
+ mouse_opaque="false"
+ follows="left|right|top"
+ height="8"
layout="topleft"
left="0"
top="0"
@@ -41,108 +47,121 @@
width="200">
<progress_bar
name="media_progress_bar"
+ color_bg="1 1 1 1"
color_bar="1 1 1 0.96"
follows="left|right|top"
- height="16"
+ height="8"
layout="topleft"
+ top="0"
left="0"
tool_tip="Media is Loading"/>
</panel>
<layout_panel
+ name="right_bookend_bottom"
width="0"
+ mouse_opaque="false"
layout="topleft"
user_resize="false" />
</layout_stack>
<layout_stack
name="media_controls"
- follows="left|right"
+ follows="left|right|top"
animate="false"
- height="32"
+ height="75"
layout="topleft"
+ top="0"
left="0"
- orientation="horizontal"
- top="128">
+ border_size="0"
+ mouse_opaque="false"
+ orientation="horizontal">
<!-- outer layout_panels center the inner one -->
<layout_panel
+ name="left_bookend"
+ top="0"
width="0"
+ mouse_opaque="false"
layout="topleft"
user_resize="false" />
<layout_panel
name="back"
+ top="0"
auto_resize="false"
user_resize="false"
layout="topleft"
+ mouse_opaque="false"
min_width="22"
- width="22"
- top="4">
+ width="22">
<button
+ name="back_btn"
+ follows="top"
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
auto_resize="false"
- height="22"
- image_selected="media_btn_back.png"
- image_unselected="media_btn_back.png"
layout="topleft"
- tool_tip="Step back"
- picture_style="true"
+ tool_tip="Navigate back"
+ top="0"
+ left="0"
width="22"
- top_delta="4">
+ height="22">
<button.commit_callback
function="MediaCtrl.Back" />
</button>
</layout_panel>
<layout_panel
name="fwd"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="10"
- min_width="17"
- width="17">
+ min_width="22"
+ top="0"
+ height="22"
+ width="22">
<button
+ name="fwd_btn"
+ follows="top"
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
height="22"
- image_selected="media_btn_forward.png"
- image_unselected="media_btn_forward.png"
+ width="22"
layout="topleft"
- tool_tip="Step forward"
- picture_style="true"
- top_delta="0"
- min_width="17"
- width="17">
+ tool_tip="Navigate forward">
<button.commit_callback
function="MediaCtrl.Forward" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
name="home"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="-2"
+ top="0"
+ height="22"
min_width="22"
width="22">
<button
- height="22"
- image_selected="media_btn_home.png"
- image_unselected="media_btn_home.png"
+ name="home_btn"
+ follows="top"
+ image_overlay="Home_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Home page"
- picture_style="true"
- min_width="22"
+ top="0"
+ height="22"
width="22">
<button.commit_callback
function="MediaCtrl.Home" />
@@ -150,57 +169,55 @@
</layout_panel>
<layout_panel
name="media_stop"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="2"
+ top="0"
+ height="22"
min_width="22"
width="22">
<button
- height="22"
- image_selected="button_anim_stop.tga"
- image_unselected="button_anim_stop.tga"
+ name="media_stop_btn"
+ follows="top"
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Stop media"
- picture_style="true"
- min_width="22"
+ top="0"
+ height="22"
width="22">
<button.commit_callback
- function="MediaCtrl.Stop" />
+ function="MediaCtrl.MediaStop" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
name="reload"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="6"
+ top="0"
+ height="22"
min_width="22"
width="22">
<button
- height="22"
- image_selected="media_btn_reload.png"
- image_unselected="media_btn_reload.png"
+ name="reload_btn"
+ follows="top"
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Reload"
- picture_style="true"
- min_width="22"
+ top="0"
+ height="22"
width="22">
<button.commit_callback
function="MediaCtrl.Reload" />
@@ -208,20 +225,27 @@
</layout_panel>
<layout_panel
name="stop"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="10"
+ top="0"
+ height="22"
min_width="22"
width="22">
<button
- height="22"
- image_selected="media_btn_stoploading.png"
- image_unselected="media_btn_stoploading.png"
+ name="stop_btn"
+ follows="top"
+ image_overlay="StopReload_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
- picture_style="true"
tool_tip = "Stop loading"
- min_width="22"
+ top="0"
+ height="22"
width="22">
<button.commit_callback
function="MediaCtrl.Stop" />
@@ -229,20 +253,27 @@
</layout_panel>
<layout_panel
name="play"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="14"
+ top="0"
+ height="22"
min_width="22"
width="22">
<button
- height="22"
- image_selected="button_anim_play.tga"
- image_unselected="button_anim_play.tga"
+ name="play_btn"
+ follows="top"
+ image_overlay="Play_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip = "Play media"
- picture_style="true"
- min_width="22"
+ top="0"
+ height="22"
width="22">
<button.commit_callback
function="MediaCtrl.Play" />
@@ -250,19 +281,27 @@
</layout_panel>
<layout_panel
name="pause"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- top="18"
+ top="0"
min_width="22"
width="22">
<button
- height="22"
- image_selected="button_anim_pause.tga"
- image_unselected="button_anim_pause.tga"
+ name="pause_btn"
+ follows="top"
+ image_overlay="Pause_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
- tool_tip = "Pause media"
- picture_style="true">
+ top="0"
+ height="22"
+ width="22"
+ tool_tip = "Pause media">
<button.commit_callback
function="MediaCtrl.Pause" />
</button>
@@ -270,30 +309,19 @@
<!-- media URL entry -->
<layout_panel
name="media_address"
+ mouse_opaque="false"
auto_resize="true"
user_resize="false"
- height="22"
+ height="24"
follows="left|right|bottom"
layout="topleft"
+ top="0"
width="190"
min_width="90">
- <!--
- RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
-
-<combo_box
-name="media_address_url"
-allow_text_entry="true"
-height="22"
-layout="topleft"
-max_chars="1024"
-tool_tip = "Media URL"
-<combo_box.commit_callback
-function="MediaCtrl.CommitURL" />
-</combo_box>
- -->
<line_editor
name="media_address_url"
- follows="left|right"
+ max_length="1024"
+ follows="top|left|right"
height="22"
top="0"
tool_tip="Media URL"
@@ -302,293 +330,281 @@ function="MediaCtrl.CommitURL" />
function="MediaCtrl.CommitURL"/>
</line_editor>
<layout_stack
+ name="media_address_url_icons"
animate="false"
- follows="right"
- width="32"
- min_width="32"
- height="16"
- top="3"
- orientation="horizontal"
- left_pad="-38">
- <icon
- name="media_whitelist_flag"
- follows="top|right"
- height="16"
- image_name="smicon_warn.tga"
+ follows="top|right"
+ height="20"
+ width="38"
+ top="0"
+ right="-1"
+ border_size="0"
+ mouse_opaque="false"
+ orientation="horizontal">
+ <layout_panel
layout="topleft"
- tool_tip="White List enabled"
- min_width="16"
- width="16" />
- <icon
- name="media_secure_lock_flag"
- height="16"
- image_name="inv_item_eyes.tga"
+ width="16"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false">
+ <icon
+ name="media_whitelist_flag"
+ follows="top|right"
+ height="16"
+ image_name="Flag"
+ layout="topleft"
+ tool_tip="White List enabled"
+ width="16" />
+ </layout_panel>
+ <layout_panel
layout="topleft"
- tool_tip="Secured Browsing"
- min_width="16"
- width="16" />
+ width="16"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false">
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ image_name="Lock2"
+ layout="topleft"
+ tool_tip="Secured Browsing"
+ width="16" />
+ </layout_panel>
</layout_stack>
</layout_panel>
<layout_panel
name="media_play_position"
+ mouse_opaque="false"
auto_resize="true"
user_resize="false"
- follows="left|right|top|bottom"
+ follows="left|right"
layout="topleft"
+ top="0"
+ height="22"
min_width="100"
width="200">
<slider_bar
name="media_play_slider"
follows="left|right|top"
+ top="0"
height="22"
- increment="0.05"
+ increment="0.01"
initial_value="0.5"
layout="topleft"
tool_tip="Movie play progress"
- min_width="100"
width="200">
<slider_bar.commit_callback
function="MediaCtrl.JumpProgress" />
</slider_bar>
</layout_panel>
<layout_panel
- name="media_volume"
+ name="skip_back"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- height="24"
- min_width="24"
- width="24">
+ top="0"
+ min_width="22"
+ width="22">
<button
- name="media_volume_button"
+ name="skip_back_btn"
+ follows="top"
+ image_overlay="SkipBackward_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ auto_resize="false"
height="22"
- image_selected="icn_speaker-muted_dark.tga"
- image_unselected="icn_speaker_dark.tga"
- is_toggle="true"
layout="topleft"
- scale_image="false"
- picture_style="true"
- tool_tip="Mute This Media"
- top_delta="22"
- min_width="24"
- width="24" >
+ tool_tip="Step back"
+ top="0"
+ width="22"
+ left="0">
<button.commit_callback
- function="MediaCtrl.ToggleMute" />
+ function="MediaCtrl.SkipBack" />
</button>
</layout_panel>
<layout_panel
- name="volume_up"
+ name="skip_forward"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="20"
- height="14"
- width="20">
+ top="0"
+ min_width="22"
+ width="22">
<button
- top="-3"
- height="14"
- image_selected="media_btn_scrollup.png"
- image_unselected="media_btn_scrollup.png"
+ name="skip_forward_btn"
+ follows="top"
+ image_overlay="SkipForward_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ height="22"
layout="topleft"
- tool_tip="Volume up"
- picture_style="true"
- scale_image="true"
- min_width="20"
- width="20" >
+ tool_tip="Step forward"
+ top="0"
+ width="22">
<button.commit_callback
- function="MediaCtrl.CommitVolumeUp" />
+ function="MediaCtrl.SkipForward" />
</button>
</layout_panel>
<layout_panel
- name="volume_down"
+ name="media_volume"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="20"
- height="14"
- width="20">
+ top="0"
+ height="72"
+ min_width="22"
+ width="22">
+ <!-- Note: this is not quite right either...the mute button is not the -->
+ <!-- same as the others because it cannot have the "image_overlay" be -->
+ <!-- two different images. -->
+ <!-- Note also: the button and the slider must overlap! -->
<button
- top="-5"
- height="14"
- image_selected="media_btn_scrolldown.png"
- image_unselected="media_btn_scrolldown.png"
+ name="media_mute_button"
+ follows="top"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ hover_glow_amount="0.15"
+ is_toggle="true"
layout="topleft"
- tool_tip="Volume down"
- picture_style="true"
- scale_image="true"
- min_width="20"
- width="20">
+ scale_image="false"
+ tool_tip="Mute This Media"
+ top="0"
+ height="20"
+ width="22" >
<button.commit_callback
- function="MediaCtrl.CommitVolumeDown" />
+ function="MediaCtrl.ToggleMute" />
+ <button.mouseenter_callback
+ function="MediaCtrl.ShowVolumeSlider" />
+ <button.mouseleave_callback
+ function="MediaCtrl.HideVolumeSlider" />
</button>
- </layout_panel>
- <!-- Scroll pad -->
- <layout_panel
- name="media_panel_scroll"
- auto_resize="false"
- user_resize="false"
- height="32"
- follows="left|right|top|bottom"
- layout="topleft"
- min_width="32"
- width="32">
- <icon
- height="32"
- image_name="media_panel_scrollbg.png"
- layout="topleft"
- top="0"
- min_width="32"
- width="32" />
- <button
- name="scrollup"
- height="8"
- image_selected="media_btn_scrollup.png"
- image_unselected="media_btn_scrollup.png"
- layout="topleft"
- tool_tip="Scroll up"
- picture_style="true"
- scale_image="false"
- left="12"
- top_delta="4"
- min_width="8"
- width="8" />
- <button
- name="scrollleft"
- height="8"
- image_selected="media_btn_scrollleft.png"
- image_unselected="media_btn_scrollleft.png"
- layout="topleft"
- left="3"
- tool_tip="Scroll left"
- picture_style="true"
- scale_image="false"
- top="12"
- min_width="8"
- width="8" />
- <button
- name="scrollright"
- height="8"
- image_selected="media_btn_scrollright.png"
- image_unselected="media_btn_scrollright.png"
- layout="topleft"
- left_pad="9"
- tool_tip="Scroll right"
- picture_style="true"
- scale_image="false"
- top_delta="0"
- min_width="8"
- width="8" />
- <button
- name="scrolldown"
- height="8"
- image_selected="media_btn_scrolldown.png"
- image_unselected="media_btn_scrolldown.png"
+ <slider
+ orientation="vertical"
+ left="0"
+ top="16"
+ height="50"
layout="topleft"
- left="12"
- tool_tip="Scroll down"
- picture_style="true"
- scale_image="false"
- top="20"
- min_width="8"
- width="8" />
+ increment="0.01"
+ initial_value="0.5"
+ name="volume_slider"
+ tool_tip="Media Volume"
+ show_text="false"
+ volume="true">
+ <slider.commit_callback
+ function="MediaCtrl.Volume"/>
+ <slider.mouseenter_callback
+ function="MediaCtrl.ShowVolumeSlider" />
+ <slider.mouseleave_callback
+ function="MediaCtrl.HideVolumeSlider" />
+ </slider>
</layout_panel>
<layout_panel
name="zoom_frame"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
+ top="0"
height="28"
min_width="22"
width="22">
<button
+ name="zoom_frame_btn"
+ follows="top"
+ image_overlay="Zoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
height="22"
- image_selected="media_btn_optimalzoom.png"
- image_unselected="media_btn_optimalzoom.png"
layout="topleft"
- tool_tip="Zoom"
- picture_style="true"
- min_width="22"
+ tool_tip="Zoom into media"
width="22">
<button.commit_callback
function="MediaCtrl.Zoom" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
- name="new_window"
+ name="close"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="22"
- width="22">
+ top="0"
+ min_width="21"
+ width="21" >
<button
+ name="close_btn"
+ follows="top"
+ image_overlay="UnZoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
height="22"
- image_selected="media_btn_newwindow.png"
- image_unselected="media_btn_newwindow.png"
layout="topleft"
- tool_tip = "Open URL in browser"
- picture_style="true"
- top_delta="-3"
- min_width="24"
- width="24" >
+ tool_tip ="Zoom Back"
+ top_delta="-4"
+ width="21" >
<button.commit_callback
- function="MediaCtrl.Open" />
+ function="MediaCtrl.Close" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
- name="close"
+ name="new_window"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="21"
- width="21" >
+ top="0"
+ min_width="22"
+ width="22">
<button
+ name="new_window_btn"
+ follows="top"
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="media_btn_done.png"
- image_unselected="media_btn_done.png"
layout="topleft"
- tool_tip ="Close media control"
- picture_style="true"
- top_delta="-4"
- width="21" >
+ tool_tip = "Open URL in browser"
+ top="0"
+ width="24" >
<button.commit_callback
- function="MediaCtrl.Close" />
+ function="MediaCtrl.Open" />
</button>
</layout_panel>
+ <!-- bookend panel -->
<layout_panel
+ name="right_bookend"
+ mouse_opaque="false"
+ top="0"
width="0"
layout="topleft"
user_resize="false" />
</layout_stack>
+ <panel
+ name="media_region"
+ height="100"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ mouse_opaque="false"
+ top="30" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 73a759a8ba..d72e175bc4 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="535"
+ height="540"
label="Profile"
layout="topleft"
left="0"
name="panel_profile"
top="0"
- width="313">
+ width="317">
<string
name="CaptionTextAcctInfo">
[ACCTTYPE]
@@ -27,168 +27,191 @@
<string
name="no_partner_text"
value="None" />
- <scroll_container
- color="DkGray2"
+ <string
+ name="no_group_text"
+ value="None" />
+ <string
+ name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
follows="all"
- height="485"
- min_height="300"
layout="topleft"
- name="profile_scroll"
- reserve_scroll_corner="true"
- opaque="true"
+ left="0"
top="0"
- width="313">
- <panel
- name="scroll_content_panel"
- follows="left|top|right"
- height="485"
+ height="524"
+ width="317"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="all"
layout="topleft"
top="0"
left="0"
- width="313">
- <panel
- follows="left|top"
- height="117"
+ height="524"
+ width="317">
+ <scroll_container
+ color="DkGray2"
+ follows="all"
layout="topleft"
- left="10"
- name="second_life_image_panel"
- top="0"
- width="280">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- follows="top|left"
- height="117"
+ left="0"
+ name="profile_scroll"
+ opaque="true"
+ height="527"
+ width="317"
+ top="0">
+ <panel
+ layout="topleft"
+ follows="left|top|right"
+ height="505"
+ min_height="505"
+ name="profile_scroll_panel"
+ top="0"
+ left="0"
+ width="297">
+ <panel
+ follows="left|top|right"
+ height="124"
+ layout="topleft"
+ left="13"
+ name="second_life_image_panel"
+ top="0"
+ width="297">
+ <texture_picker
+ allow_no_texture="true"
+ default_image_name="None"
+ enabled="false"
+ follows="top|left"
+ height="124"
+ layout="topleft"
+ left="0"
+ name="2nd_life_pic"
+ top="10"
+ width="102" />
+ <text
+ follows="left|top|right"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="title_sl_descr_text"
+ text_color="white"
+ top_delta="0"
+ value="[SECOND_LIFE]:"
+ width="180" />
+ <expandable_text
+ follows="left|top|right"
+ height="97"
+ layout="topleft"
+ left="107"
+ textbox.max_length="512"
+ name="sl_description_edit"
+ top_pad="-3"
+ translate="false"
+ width="180"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet.Nullamma lesuada mauris sit amet ipsum. adipiscing elit. Ae nean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+ </expandable_text>
+ </panel>
+ <panel
+ follows="left|top|right"
+ height="124"
layout="topleft"
- left="0"
- name="2nd_life_pic"
- top="10"
- width="102" />
+ top_pad="0"
+ left="13"
+ name="first_life_image_panel"
+ width="297">
+ <texture_picker
+ allow_no_texture="true"
+ default_image_name="None"
+ enabled="false"
+ follows="top|left"
+ height="124"
+ layout="topleft"
+ left="0"
+ name="real_world_pic"
+ width="102" />
+ <text
+ follows="left|top|right"
+ font.style="BOLD"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="title_rw_descr_text"
+ text_color="white"
+ top_delta="0"
+ value="Real World:"
+ width="180" />
+ <expandable_text
+ follows="left|top|right"
+ height="97"
+ layout="topleft"
+ left="107"
+ textbox.max_length="512"
+ name="fl_description_edit"
+ top_pad="-3"
+ translate="false"
+ width="180"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+ </expandable_text>
+ </panel>
<text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
+ follows="left|top"
+ height="15"
+ font.style="BOLD"
+ font="SansSerifMedium"
+ layout="topleft"
+ left="10"
+ name="homepage_edit"
+ top_pad="0"
+ translate="false"
+ value="http://librarianavengers.org"
+ width="300"
+ word_wrap="false"
+ use_ellipses="true" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
layout="topleft"
- left_pad="10"
- name="title_sl_descr_text"
+ left="10"
+ name="title_member_text"
text_color="white"
- top_delta="0"
- value="[SECOND_LIFE]:"
- width="165" />
- <expandable_text
- follows="left|top|right"
- height="95"
- layout="topleft"
- left="107"
- name="sl_description_edit"
- top_pad="-3"
- width="173"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <panel
- follows="left|top"
- height="117"
- layout="topleft"
- top_pad="10"
- left="10"
- name="first_life_image_panel"
- width="280">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- follows="top|left"
- height="117"
+ top_pad="10"
+ value="Resident Since:"
+ width="300" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ height="15"
layout="topleft"
- left="0"
- name="real_world_pic"
- width="102" />
+ left="10"
+ name="register_date"
+ read_only="true"
+ translate="false"
+ v_pad="0"
+ value="05/31/2376"
+ width="300"
+ word_wrap="true" />
<text
- follows="left|top|right"
- font.style="BOLD"
+ follows="left|top"
+ font.style="BOLD"
height="15"
layout="topleft"
- left_pad="10"
- name="title_rw_descr_text"
+ left="10"
+ name="title_acc_status_text"
text_color="white"
- top_delta="0"
- value="Real World:"
- width="165" />
- <expandable_text
- follows="left|top|right"
- height="95"
- layout="topleft"
- left="107"
- name="fl_description_edit"
- top_pad="-3"
- width="173"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <text
- type="string"
- follows="left|top"
- font="SansSerifSmall"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="me_homepage_text"
- text_color="white"
- top_pad="0"
- width="280">
- Homepage:
- </text>
- <text
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="homepage_edit"
- top_pad="0"
- value="http://librarianavengers.org"
- width="280"
- word_wrap="false"
- use_elipsis="true"
- />
- <text
- follows="left|top"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left="10"
- name="title_member_text"
- text_color="white"
- top_pad="10"
- value="Member Since:"
- width="280" />
- <text
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="register_date"
- value="05/31/1976"
- width="280"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_acc_status_text"
- text_color="white"
- top_pad="10"
- value="Account Status:"
- width="280" />
- <!-- <text
+ top_pad="5"
+ value="Account Status:"
+ width="300" />
+ <!-- <text
type="string"
follows="left|top"
font="SansSerifSmall"
@@ -199,153 +222,178 @@
top_delta="0"
value="Go to Dashboard"
width="100"/> -->
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="acc_status_text"
- top_pad="0"
- value="Resident. No payment info on file."
- width="280"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_partner_text"
- text_color="white"
- top_pad="5"
- value="Partner:"
- width="280" />
- <panel
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="partner_data_panel"
- top_pad="0"
- width="280">
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ height="28"
+ layout="topleft"
+ left="10"
+ name="acc_status_text"
+ read_only="true"
+ top_pad="0"
+ translate="false"
+ v_pad="0"
+ width="300"
+ word_wrap="true">
+ Resident. No payment info on file.
+ Linden.
+ </text_editor>
<text
follows="left|top"
- height="10"
+ font.style="BOLD"
+ height="15"
layout="topleft"
- left="0"
- name="partner_text"
- top="0"
- value="[FIRST] [LAST]"
- width="280"
- word_wrap="true" />
- </panel>
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_groups_text"
- text_color="white"
- top_pad="8"
- value="Groups:"
- width="280" />
- <expandable_text
- follows="left|top|bottom"
- height="60"
+ left="10"
+ name="title_partner_text"
+ text_color="white"
+ top_pad="3"
+ value="Partner:"
+ width="300" />
+ <panel
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="partner_data_panel"
+ top_pad="0"
+ width="300">
+ <name_box
+ follows="left|top"
+ height="10"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left="0"
+ link="true"
+ name="partner_text"
+ top="0"
+ width="300"
+ word_wrap="true" />
+ </panel>
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="13"
+ layout="topleft"
+ left="10"
+ name="title_groups_text"
+ text_color="white"
+ top_pad="3"
+ value="Groups:"
+ width="300" />
+ <expandable_text
+ follows="all"
+ height="113"
+ layout="topleft"
+ left="7"
+ name="sl_groups"
+ top_pad="0"
+ translate="false"
+ width="290"
+ expanded_bg_visible="true"
+ expanded_bg_color="DkGray">
+ Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. Aenean viverra tulip moosetop. Slan de heelish marfnik tooplod. Sum sum to whop de wompam booster copm.
+ </expandable_text>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left"
+ height="30"
layout="topleft"
- left="10"
- name="sl_groups"
- top_pad="0"
- width="280"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- </scroll_container>
- <panel
- follows="bottom|left"
- layout="topleft"
- left="0"
- name="profile_buttons_panel"
- top_pad="2"
- bottom="10"
- height="19"
- width="303">
+ name="profile_buttons_panel"
+ auto_resize="false"
+ width="317">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Add Friend"
layout="topleft"
- left="0"
+ left="2"
mouse_opaque="false"
name="add_friend"
+ tool_tip="Offer friendship to the Resident"
top="5"
- width="75" />
+ width="80" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="IM"
layout="topleft"
name="im"
+ tool_tip="Open instant message session"
top="5"
- left_pad="5"
- width="45" />
+ left_pad="3"
+ width="39" />
<button
- enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Call"
layout="topleft"
name="call"
- left_pad="5"
+ tool_tip="Call this Resident"
+ left_pad="3"
top="5"
- width="45" />
+ width="43" />
<button
enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
name="show_on_map_btn"
+ tool_tip="Show the Resident on the map"
top="5"
- left_pad="5"
- width="45" />
+ left_pad="3"
+ width="41" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
name="teleport"
- left_pad="5"
+ tool_tip="Offer teleport"
+ left_pad="3"
top="5"
- width="80" />
- </panel>
- <panel
- follows="bottom|left"
- layout="topleft"
- left="0"
- top_pad="-17"
- name="profile_me_buttons_panel"
- visible="false"
- height="19"
- width="303">
+ width="69" />
<button
follows="bottom|right"
- font="SansSerifSmall"
- height="19"
- left="10"
+ height="23"
+ label="â–¼"
+ layout="topleft"
+ name="overflow_btn"
+ tool_tip="Pay money to or share inventory with the Resident"
+ right="-1"
+ top="5"
+ left_pad="3"
+ width="23" />
+ </layout_panel>
+ <layout_panel
+ follows="bottom|left"
+ height="30"
+ layout="topleft"
+ name="profile_me_buttons_panel"
+ visible="false"
+ width="313">
+ <button
+ follows="bottom|right"
+ height="23"
+ left="20"
+ top="0"
label="Edit Profile"
name="edit_profile_btn"
+ tool_tip="Edit your personal information"
width="130" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Edit Appearance"
left_pad="10"
name="edit_appearance_btn"
- right="-10"
+ tool_tip="Create/edit your appearance: physical data, clothes and etc."
width="130" />
- </panel>
+ </layout_panel>
+
+</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 7a5781651d..5a96ba2dd2 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -6,6 +6,7 @@
layout="topleft"
min_height="350"
name="panel_target_profile"
+ left="0"
width="333">
<string
name="status_online">
@@ -21,23 +22,27 @@
image_overlay="BackArrow_Off"
layout="topleft"
name="back"
- picture_style="true"
- left="10"
+ left="12"
tab_stop="false"
top="2"
width="23" />
- <text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="26"
- layout="topleft"
- left_pad="10"
- name="user_name"
- text_color="white"
- top="0"
- value="(Loading...)"
- use_elipsis="true"
- width="275" />
+ <text_editor
+ h_pad="0"
+ v_pad="0"
+ allow_scroll="false"
+ bg_visible="false"
+ read_only = "true"
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="user_name"
+ text_color="LtGray"
+ top="0"
+ value="(Loading...)"
+ use_ellipses="true"
+ width="275" />
<text
follows="top|left"
height="13"
@@ -49,16 +54,17 @@
width="150" />
<tab_container
follows="all"
- height="535"
+ height="538"
+ halign="center"
layout="topleft"
- left="10"
- min_width="333"
+ left="5"
+ min_width="333"
name="tabs"
tab_min_width="80"
tab_height="30"
tab_position="top"
- top_pad="10"
- width="313">
+ top_pad="5"
+ width="317">
<panel
class="panel_profile"
filename="panel_profile.xml"
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index a312e4cf13..727c5fb7b2 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -54,7 +54,7 @@
color="LoginProgressBoxCenterColor"
follows="left|right|bottom|top"
height="250"
- image_name="rounded_square.tga"
+ image_name="Rounded_Square"
layout="topleft"
left="0"
top="0"
@@ -129,7 +129,6 @@
layout="topleft"
left="-106"
name="cancel_btn"
- picture_style="true"
top="700"
width="90" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index b3147f5e6b..dc8f71c868 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -3,6 +3,7 @@
border="true"
follows="top|left"
height="320"
+ help_topic="panel_region_covenant_tab"
label="Covenant"
layout="topleft"
left="0"
@@ -103,17 +104,6 @@
width="308">
Last Modified Wed Dec 31 16:00:00 1969
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="5"
- name="covenant_help"
- top_delta="-2"
- width="18" />
-
<text_editor
enabled="false"
follows="left|top"
@@ -130,7 +120,6 @@
</text_editor>
<button
follows="left|top"
- font="SansSerifSmall"
height="18"
label="Reset"
layout="topleft"
@@ -146,7 +135,8 @@
left="120"
name="covenant_help_text"
top_pad="10"
- width="460">
+ word_wrap="true"
+ width="360">
Changes to the covenant will show on all parcels in the estate.
</text>
<text
@@ -156,9 +146,10 @@
left_delta="0"
name="covenant_instructions"
top_pad="5"
- width="465">
- Drag and drop a notecard to change
- the Covenant for this Estate.
+ word_wrap="true"
+ font.style="ITALIC"
+ width="360">
+ Drag and drop a notecard to change the Covenant for this estate.
</text>
<text
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 25e1171688..a6b4ddd01e 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -3,6 +3,7 @@
border="true"
follows="top|left"
height="320"
+ help_topic="panel_region_debug_tab"
label="Debug"
layout="topleft"
left="0"
@@ -40,16 +41,6 @@
tool_tip="Disable all scripts in this region"
top="30"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="70"
- name="disable_scripts_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Disable Collisions"
@@ -59,16 +50,6 @@
tool_tip="Disable non-avatar collisions in this region"
top="50"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="70"
- name="disable_collisions_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Disable Physics"
@@ -79,19 +60,8 @@
top="70"
width="80" />
<button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="70"
- name="disable_physics_help"
- top_delta="2"
- width="18" />
- <button
enabled="false"
follows="left|top"
- font="SansSerifSmall"
height="20"
label="Apply"
layout="topleft"
@@ -139,7 +109,6 @@
<button
follows="left|top"
height="20"
- font="SansSerifSmall"
label="Choose"
layout="topleft"
left_pad="5"
@@ -186,7 +155,6 @@
<button
follows="left|top"
height="20"
- font="SansSerifSmall"
label="Return"
layout="topleft"
left="20"
@@ -195,7 +163,6 @@
width="80" />
<button
follows="left|top"
- font="SansSerifSmall"
height="20"
label="Get Top Colliders..."
layout="topleft"
@@ -206,17 +173,6 @@
width="150" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="top_colliders_help"
- top_delta="2"
- width="18" />
- <button
- follows="left|top"
- font="SansSerifSmall"
height="20"
label="Get Top Scripts..."
layout="topleft"
@@ -227,17 +183,6 @@
width="150" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="top_scripts_help"
- top_delta="2"
- width="18" />
- <button
- follows="left|top"
- font="SansSerifSmall"
height="20"
label="Restart Region"
layout="topleft"
@@ -248,17 +193,6 @@
width="130" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="restart_help"
- top_delta="2"
- width="18" />
- <button
- follows="left|top"
- font="SansSerifSmall"
height="20"
label="Delay Restart"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index c7a60ed2e4..3980eb86d3 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -3,16 +3,13 @@
border="false"
follows="top|left"
height="320"
+ help_topic="panel_region_estate_tab"
label="Estate"
layout="topleft"
left="0"
name="Estate"
top="320"
width="480">
- <panel.string
- name="email_unsupported">
- Feature unsupported
- </panel.string>
<text
type="string"
length="1"
@@ -22,9 +19,9 @@
left="10"
name="estate_help_text"
top="14"
- width="313">
- Changes to settings on this tab will affect all
-regions in the estate.
+ word_wrap="true"
+ width="275">
+ Changes to settings on this tab will affect all regions in the estate.
</text>
<text
type="string"
@@ -81,7 +78,7 @@ regions in the estate.
<view_border
bevel_style="in"
follows="top|left"
- height="290"
+ height="270"
layout="topleft"
left_delta="-4"
top_pad="5"
@@ -94,16 +91,6 @@ regions in the estate.
name="use_global_time_check"
top="132"
width="200" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="20"
- name="use_global_time_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Fixed Sun"
@@ -112,16 +99,6 @@ regions in the estate.
name="fixed_sun_check"
top="152"
width="100" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="120"
- name="fixed_sun_help"
- top_delta="2"
- width="18" />
<icon
height="20"
image_name="icon_day_cycle.tga"
@@ -151,16 +128,6 @@ regions in the estate.
name="externally_visible_check"
top_pad="6"
width="200" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="20"
- name="externally_visible_help"
- top_delta="2"
- width="18" />
<text
type="string"
length="1"
@@ -171,26 +138,26 @@ regions in the estate.
name="Only Allow"
top="250"
width="278">
- Restrict Access To:
+ Restrict Access to accounts verified by:
</text>
<check_box
follows="top|left"
height="16"
- label="Residents with payment info on file"
+ label="Payment Information on File"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified residents"
+ tool_tip="Ban unidentified Residents"
top_pad="2"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Age-verified adults"
+ label="Age Verification"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
<check_box
@@ -201,16 +168,6 @@ regions in the estate.
name="voice_chat_check"
top="304"
width="200" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="20"
- name="voice_chat_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Direct Teleport"
@@ -220,73 +177,33 @@ regions in the estate.
top_pad="4"
width="80" />
<button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="140"
- name="allow_direct_teleport_help"
- top_delta="2"
- width="18" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="abuse_email_text"
- top_pad="5"
- width="180">
- Abuse email address:
- </text>
- <line_editor
- follows="top|left"
- height="19"
- layout="topleft"
- left="15"
- name="abuse_email_address"
- top_pad="5"
- width="205" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="12"
- name="abuse_email_address_help"
- top_dekta="0"
- width="18" />
- <button
enabled="false"
follows="left|top"
- height="20"
+ height="23"
label="Apply"
layout="topleft"
name="apply_btn"
- right="250"
- top_pad="4"
- width="90" />
+ top_pad="10"
+ left="78"
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Send Message To Estate..."
layout="topleft"
- left="8"
+ left="50"
name="message_estate_btn"
- top_pad="5"
- width="250" />
+ top_pad="20"
+ width="160" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Kick User from Estate..."
layout="topleft"
- left="8"
+ left="50"
name="kick_user_from_estate_btn"
top_pad="5"
- width="250" />
+ width="160" />
<text
type="string"
@@ -300,27 +217,17 @@ regions in the estate.
width="200">
Estate Managers:
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="182"
- name="estate_manager_help"
- top_delta="-1"
- width="18" />
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -329,22 +236,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_estate_manager_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_estate_manager_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -353,31 +260,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="allow_resident_label"
- top_pad="5"
+ top_pad="10"
width="200">
Allowed Residents:
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="182"
- name="allow_resident_help"
- top_delta="-1"
- width="18" />
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -386,22 +283,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_allowed_avatar_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_allowed_avatar_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -410,31 +307,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="allow_group_label"
- top_pad="5"
+ top_pad="10"
width="200">
Allowed Groups:
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="182"
- name="allow_group_help"
- top_delta="-1"
- width="18" />
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -443,22 +330,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_allowed_group_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_allowed_group_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -467,31 +354,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="ban_resident_label"
- top_pad="5"
+ top_pad="10"
width="200">
Banned Residents:
</text>
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_delta="182"
- name="ban_resident_help"
- top_delta="-1"
- width="18" />
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -500,20 +377,20 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_banned_avatar_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_banned_avatar_btn"
top_delta="0"
- width="90" />
+ width="97" />
</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 160ae96fc4..c06e67a4bb 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -3,6 +3,7 @@
border="true"
follows="top|left"
height="320"
+ help_topic="panel_region_general_tab"
label="Region"
layout="topleft"
left="0"
@@ -83,16 +84,6 @@
name="block_terraform_check"
top="70"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="terraform_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Block Fly"
@@ -101,16 +92,6 @@
name="block_fly_check"
top="90"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="fly_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Damage"
@@ -119,16 +100,6 @@
name="allow_damage_check"
top="110"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="damage_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Restrict Pushing"
@@ -137,16 +108,6 @@
name="restrict_pushobject"
top="130"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="restrict_pushobject_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Land Resell"
@@ -155,16 +116,6 @@
name="allow_land_resell_check"
top="160"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="land_resell_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Land Join/Divide"
@@ -173,16 +124,6 @@
name="allow_parcel_changes_check"
top="180"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="parcel_changes_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Block Land Show in Search"
@@ -192,17 +133,8 @@
tool_tip="Let people see this region and its parcels in search results"
top="200"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="parcel_search_help"
- top_delta="2"
- width="18" />
<spinner
+ decimal_digits="0"
follows="left|top"
height="20"
increment="1"
@@ -215,16 +147,6 @@
name="agent_limit_spin"
top="240"
width="170" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="25"
- name="agent_limit_help"
- top_delta="2"
- width="18" />
<spinner
follows="left|top"
height="20"
@@ -238,16 +160,6 @@
name="object_bonus_spin"
top="260"
width="170" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="25"
- name="object_bonus_help"
- top_delta="2"
- width="18" />
<text
follows="left|top"
height="20"
@@ -261,7 +173,7 @@
</text>
<combo_box
height="20"
- label="Mature"
+ label="Moderate"
layout="topleft"
left_delta="100"
name="access_combo"
@@ -272,25 +184,15 @@
name="Adult"
value="42" />
<combo_box.item
- label="Mature"
+ label="Moderate"
name="Mature"
value="21" />
<combo_box.item
- label="PG"
+ label="General"
name="PG"
value="13" />
</combo_box>
<button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="access_help"
- top_delta="2"
- width="18" />
- <button
enabled="false"
follows="left|top"
height="20"
@@ -299,10 +201,7 @@
left="108"
name="apply_btn"
top="320"
- width="100">
- <button.commit_callback
- function="RegionInfo.Cancel" />
- </button>
+ width="100"/>
<button
follows="left|top"
height="20"
@@ -338,5 +237,8 @@
left="250"
name="manage_telehub_btn"
top="70"
- width="150" />
+ width="150">
+ <button.commit_callback
+ function="RegionInfo.ManageTelehub" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
index 9b9c62dbf9..525c5aa8e7 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
@@ -83,16 +83,6 @@
name="block_terraform_check"
top="70"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="terraform_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Block Fly"
@@ -101,16 +91,6 @@
name="block_fly_check"
top="90"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="fly_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Damage"
@@ -119,16 +99,6 @@
name="allow_damage_check"
top="110"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="damage_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Restrict Pushing"
@@ -137,16 +107,6 @@
name="restrict_pushobject"
top="130"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="restrict_pushobject_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Land Resell"
@@ -155,16 +115,6 @@
name="allow_land_resell_check"
top="160"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="land_resell_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Allow Land Join/Divide"
@@ -173,16 +123,6 @@
name="allow_parcel_changes_check"
top="180"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="parcel_changes_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Block Land Show in Search"
@@ -192,16 +132,6 @@
tool_tip="Let people see this region and its parcels in search results"
top="200"
width="80" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="115"
- name="parcel_search_help"
- top_delta="2"
- width="18" />
<spinner
follows="left|top"
height="20"
@@ -215,16 +145,6 @@
name="agent_limit_spin"
top="240"
width="170" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="25"
- name="agent_limit_help"
- top_delta="2"
- width="18" />
<spinner
follows="left|top"
height="20"
@@ -238,16 +158,6 @@
name="object_bonus_spin"
top="260"
width="170" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="25"
- name="object_bonus_help"
- top_delta="2"
- width="18" />
<text
follows="left|top"
height="20"
@@ -261,7 +171,7 @@
</text>
<combo_box
height="20"
- label="Mature"
+ label="Moderate"
layout="topleft"
left_delta="100"
name="access_combo"
@@ -272,25 +182,15 @@
name="Adult"
value="42" />
<combo_box.item
- label="Mature"
+ label="Moderate"
name="Mature"
value="21" />
<combo_box.item
- label="PG"
+ label="General"
name="PG"
value="13" />
</combo_box>
<button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="access_help"
- top_delta="2"
- width="18" />
- <button
enabled="false"
follows="left|top"
height="20"
@@ -299,10 +199,7 @@
left="108"
name="apply_btn"
top="320"
- width="100">
- <button.commit_callback
- function="RegionInfo.Cancel" />
- </button>
+ width="100"/>
<button
follows="left|top"
height="20"
@@ -338,5 +235,8 @@
left_delta="0"
name="manage_telehub_btn"
top_pad="20"
- width="150" />
+ width="150" >
+ <button.commit_callback
+ function="RegionInfo.ManageTelehub" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index 148d9500bb..5093c52129 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -3,6 +3,7 @@
border="true"
follows="top|left"
height="320"
+ help_topic="panel_region_terrain_tab"
label="Terrain"
layout="topleft"
left="0"
@@ -42,16 +43,6 @@
name="water_height_spin"
top="40"
width="180" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="5"
- name="water_height_help"
- top_delta="2"
- width="18" />
<spinner
follows="left|top"
height="20"
@@ -64,16 +55,6 @@
name="terrain_raise_spin"
top="60"
width="180" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="5"
- name="terrain_raise_help"
- top_delta="2"
- width="18" />
<spinner
follows="left|top"
height="20"
@@ -87,16 +68,6 @@
name="terrain_lower_spin"
top="80"
width="180" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="5"
- name="terrain_lower_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Use Estate Sun"
@@ -105,16 +76,6 @@
name="use_estate_sun_check"
top="35"
width="100" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="70"
- name="use_estate_sun_help"
- top_delta="2"
- width="18" />
<check_box
height="20"
label="Fixed Sun"
@@ -123,16 +84,6 @@
name="fixed_sun_check"
top="55"
width="100" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="70"
- name="fixed_sun_help"
- top_delta="2"
- width="18" />
<icon
height="20"
image_name="icon_day_cycle.tga"
@@ -184,16 +135,6 @@
width="170" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="download_raw_help"
- top_delta="2"
- width="18" />
- <button
- follows="left|top"
height="20"
label="Upload RAW terrain..."
layout="topleft"
@@ -204,16 +145,6 @@
width="170" />
<button
follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="upload_raw_help"
- top_delta="2"
- width="18" />
- <button
- follows="left|top"
height="20"
label="Bake Terrain"
layout="topleft"
@@ -222,14 +153,4 @@
tool_tip="Set current terrain as mid-point for raise/lower limits"
top="283"
width="100" />
- <button
- follows="left|top"
- font="SansSerifSmall"
- height="18"
- label="?"
- layout="topleft"
- left_pad="10"
- name="bake_terrain_help"
- top_delta="2"
- width="18" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml
index 5089064c07..04dbf73be9 100644
--- a/indra/newview/skins/default/xui/en/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml
@@ -3,6 +3,7 @@
border="true"
follows="top|left"
height="320"
+ help_topic="panel_region_texture_tab"
label="Ground Textures"
layout="topleft"
left="0"
@@ -135,7 +136,7 @@
layout="topleft"
left="10"
name="height_text_lbl5"
- top="186"
+ top="170"
width="300">
Texture Elevation Ranges
</text>
@@ -145,7 +146,7 @@
layout="topleft"
left="51"
name="height_text_lbl6"
- top="201"
+ top="185"
width="100">
Southwest
</text>
@@ -170,7 +171,7 @@
max_val="500"
min_val="-500"
name="height_start_spin_0"
- top_delta="20"
+ top_delta="15"
width="100" />
<spinner
follows="left|top"
@@ -215,9 +216,9 @@
follows="left|top"
height="20"
layout="topleft"
- left_pad="10"
+ left="51"
name="height_text_lbl8"
- top_delta="0"
+ top_pad="10"
width="100">
Southeast
</text>
@@ -242,7 +243,7 @@
max_val="500"
min_val="-500"
name="height_start_spin_2"
- top_delta="20"
+ top_delta="15"
width="100" />
<spinner
follows="left|top"
@@ -290,9 +291,9 @@
left="10"
name="height_text_lbl10"
top_delta="30"
- width="270">
- These values represent the blend range
- for the textures above.
+ width="400"
+ word_wrap="true">
+ These values represent the blend range for the textures above.
</text>
<text
follows="left|top"
@@ -301,11 +302,9 @@
left_delta="0"
name="height_text_lbl11"
top_delta="32"
- width="270">
- Measured in meters, the LOW value
- is the MAXIMUM height of Texture #1,
- and the HIGH value is the MINIMUM
- height of Texture #4.
+ width="400"
+ word_wrap="true">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
</text>
<button
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index 765e2ae623..d14355b9f4 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -2,13 +2,12 @@
<panel
bevel_style="none"
border_style="line"
- bottom="550"
follows="left|top|right|bottom"
- height="508"
+ height="522"
layout="topleft"
left="0"
name="script panel"
- width="500">
+ width="497">
<panel.string
name="loading">
Loading...
@@ -29,71 +28,17 @@
name="Title">
Script: [NAME]
</panel.string>
- <text_editor
- type="string"
- length="1"
- bottom="393"
- follows="left|top|right|bottom"
- font="Monospace"
- height="376"
- ignore_tab="false"
- layout="topleft"
- left="4"
- max_length="65536"
- name="Script Editor"
- width="492"
- show_line_numbers="true"
- handle_edit_keys_directly="true"
- word_wrap="true">
- Loading...
- </text_editor>
- <button
- bottom="499"
- follows="right|bottom"
- height="20"
- label="Save"
- label_selected="Save"
- layout="topleft"
- left="360"
- name="Save_btn"
- width="128" />
- <scroll_list
- bottom="457"
- follows="left|right|bottom"
- height="60"
- layout="topleft"
- left="4"
- name="lsl errors"
- width="492" />
- <combo_box
- bottom="499"
- follows="left|bottom"
- height="20"
- label="Insert..."
- layout="topleft"
- left="12"
- name="Insert..."
- width="128" />
- <text
- bottom="473"
- follows="left|bottom"
- height="12"
- layout="topleft"
- left="12"
- name="line_col"
- width="128" />
<menu_bar
bg_visible="false"
- bottom="18"
- follows="left|top|right"
+ follows="left|top"
height="18"
layout="topleft"
- left="8"
+ left="0"
mouse_opaque="false"
name="script_menu"
width="476">
<menu
- bottom="18"
+ top="0"
height="62"
label="File"
layout="topleft"
@@ -113,11 +58,10 @@
name="Revert All Changes" />
</menu>
<menu
- bottom="-647"
+ top="0"
height="198"
label="Edit"
layout="topleft"
- left="222"
mouse_opaque="false"
name="Edit"
width="139">
@@ -169,11 +113,10 @@
name="Search / Replace..." />
</menu>
<menu
- bottom="18"
+ top="0"
height="34"
label="Help"
layout="topleft"
- left="0"
mouse_opaque="false"
name="Help"
width="112">
@@ -187,4 +130,53 @@
name="Keyword Help..." />
</menu>
</menu_bar>
+ <text_editor
+ left="0"
+ type="string"
+ length="1"
+ follows="left|top|right|bottom"
+ font="Monospace"
+ height="376"
+ ignore_tab="false"
+ layout="topleft"
+ max_length="65536"
+ name="Script Editor"
+ width="487"
+ show_line_numbers="true"
+ handle_edit_keys_directly="true"
+ word_wrap="true">
+ Loading...
+ </text_editor>
+ <scroll_list
+ top_pad="10"
+ left="0"
+ follows="left|right|bottom"
+ height="60"
+ layout="topleft"
+ name="lsl errors"
+ width="487" />
+ <text
+ follows="left|bottom"
+ height="12"
+ layout="topleft"
+ left="0"
+ name="line_col"
+ width="128" />
+ <combo_box
+ follows="left|bottom"
+ height="23"
+ label="Insert..."
+ layout="topleft"
+ name="Insert..."
+ width="128" />
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ label_selected="Save"
+ layout="topleft"
+ top_pad="-35"
+ right="487"
+ name="Save_btn"
+ width="61" />
</panel>
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
new file mode 100644
index 0000000000..629d8567d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="true"
+ follows="top|left"
+ height="570"
+ label="MY AVATAR"
+ layout="topleft"
+ left="0"
+ name="script_limits_my_avatar_panel"
+ top="0"
+ width="480">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="script_memory"
+ top_pad="24"
+ text_color="White"
+ width="480">
+ Avatar Script Usage
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="memory_used"
+ top_delta="18"
+ width="480">
+
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="urls_used"
+ top_delta="18"
+ width="480">
+
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="loading_text"
+ top="80"
+ text_color="EmphasisColor"
+ width="480">
+ Loading...
+ </text>
+ <scroll_list
+ draw_heading="true"
+ follows="all"
+ height="415"
+ layout="topleft"
+ left_delta="0"
+ multi_select="true"
+ name="scripts_list"
+ top="100"
+ width="460">
+ <scroll_list.columns
+ label="Size (kb)"
+ name="size"
+ width="70" />
+ <scroll_list.columns
+ label="URLs"
+ name="urls"
+ width="50" />
+ <scroll_list.columns
+ label="Object Name"
+ name="name"
+ width="140" />
+ <scroll_list.columns
+ label="Location"
+ name="location"
+ width="130" />
+ </scroll_list>
+ <button
+ follows="bottom|left"
+ height="19"
+ label="Refresh List"
+ layout="bottomleft"
+ left_pad="5"
+ name="refresh_list_btn"
+ top="34"
+ left="10"
+ width="100" />
+</panel>
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
new file mode 100644
index 0000000000..9dff00fa0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ border="true"
+ follows="top|left"
+ height="570"
+ label="REGION MEMORY"
+ layout="topleft"
+ name="script_limits_region_memory_panel"
+ top="0"
+ left="0"
+ width="480">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="script_memory"
+ top_pad="24"
+ text_color="White"
+ width="480">
+ Parcel Script Memory
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="parcels_listed"
+ top_delta="18"
+ visible="true"
+ width="480">
+
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="memory_used"
+ top_delta="18"
+ width="480">
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="30"
+ name="urls_used"
+ top_delta="18"
+ width="480">
+
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="loading_text"
+ top_delta="12"
+ text_color="EmphasisColor"
+ width="480">
+ Loading...
+ </text>
+ <scroll_list
+ draw_heading="true"
+ follows="all"
+ height="409"
+ layout="topleft"
+ left_delta="0"
+ multi_select="true"
+ name="scripts_list"
+ top_delta="16"
+ width="460">
+ <scroll_list.columns
+ label="Size (kb)"
+ name="size"
+ width="72" />
+ <scroll_list.columns
+ label="URLs"
+ name="urls"
+ width="48" />
+ <scroll_list.columns
+ label="Object Name"
+ name="name"
+ width="100" />
+ <scroll_list.columns
+ label="Object Owner"
+ name="owner"
+ width="100" />
+ <scroll_list.columns
+ label="Parcel"
+ name="parcel"
+ width="130" />
+ <scroll_list.columns
+ label="Location"
+ name="location"
+ width="80" />
+ </scroll_list>
+ <button
+ follows="bottom|left"
+ height="19"
+ label="Refresh List"
+ layout="bottomleft"
+ left_pad="5"
+ name="refresh_list_btn"
+ top="34"
+ left="10"
+ width="100" />
+ <button
+ follows="bottom|right"
+ height="19"
+ label="Highlight"
+ visible="false"
+ layout="bottomright"
+ left="370"
+ name="highlight_btn"
+ top="34"
+ width="100" />
+ <button
+ follows="bottom|right"
+ height="19"
+ label="Return"
+ visible="false"
+ layout="bottomright"
+ name="return_btn"
+ top="34"
+ left_delta="-105"
+ width="100" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
index 21ecd01839..44afadf65a 100644
--- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
@@ -56,7 +56,6 @@
layout="topleft"
left="2"
name="less"
- picture_style="true"
tab_stop="false"
top="0"
width="132" />
@@ -70,7 +69,6 @@
layout="topleft"
left_pad="2"
name="more"
- picture_style="true"
tab_stop="false"
top_delta="0"
width="132" />
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index 3f64c9c633..6ef93406ec 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Side tray cannot show background because it is always
+<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray
name="sidebar"
@@ -10,19 +10,34 @@
>
<!-- Individual tabs must show background to have seemless
appearance up to tray panel header word like "Home".
- Embedded panels are inset by a pixel and so their
+ Embedded panels are inset by a pixel and so their
backgrounds will not block the world fully. -->
+
+ <sidetray_tab
+ name="sidebar_openclose"
+ help_topic="sidebar_openclose"
+ tab_title="Toggle Sidebar"
+ description="Toggle Sidebar."
+ image="TabIcon_Open_Off"
+ image_selected="TabIcon_Close_Off"
+ mouse_opaque="false"
+ background_visible="true"
+ >
+ <panel /> <!-- dummy panel, never to actually be seen -->
+ </sidetray_tab>
+
<sidetray_tab
name="sidebar_home"
help_topic="sidebar_home"
tab_title="Home"
description="Home."
- image="TabIcon_Open_Off"
- image_selected="TabIcon_Close_Off"
+ image="TabIcon_Home_Off"
+ image_selected="TabIcon_Home_Selected"
mouse_opaque="false"
background_visible="true"
>
<panel
+ class="panel_sidetray_home"
name="panel_home"
filename="panel_sidetray_home_tab.xml"
label="home"
@@ -30,6 +45,31 @@
</sidetray_tab>
<sidetray_tab
+ name="sidebar_me"
+ help_topic="sidebar_me"
+ tab_title="My Profile"
+ description="Edit your public profile and Picks."
+ image="TabIcon_Me_Off"
+ image_selected="TabIcon_Me_Selected"
+ mouse_opaque="false"
+ background_visible="true"
+ >
+ <panel_container
+ name="panel_container"
+ default_panel_name="panel_me"
+ width="333"
+ >
+ <panel
+ class="panel_me"
+ name="panel_me"
+ filename="panel_me.xml"
+ label="Me"
+ />
+
+ </panel_container>
+ </sidetray_tab>
+
+ <sidetray_tab
name="sidebar_people"
help_topic="sidebar_people"
tab_title="People"
@@ -41,6 +81,7 @@
>
<panel_container
name="panel_container"
+ default_panel_name="panel_people"
width="333"
>
<panel
@@ -57,7 +98,7 @@
class="panel_group_info_sidetray"
name="panel_group_info_sidetray"
filename="panel_group_info_sidetray.xml"
- label="Group Info"
+ label="Group Profile"
font="SansSerifBold"
/>
<panel
@@ -70,7 +111,7 @@
</panel_container>
</sidetray_tab>
-
+
<sidetray_tab
name="sidebar_places"
help_topic="sidebar_places"
@@ -92,27 +133,28 @@
</sidetray_tab>
<sidetray_tab
- name="sidebar_me"
- help_topic="sidebar_me"
- tab_title="Me"
- description="Edit your public profile and Picks."
- image="TabIcon_Me_Off"
- image_selected="TabIcon_Me_Selected"
+ name="sidebar_inventory"
+ help_topic="sidebar_inventory"
+ tab_title="My Inventory"
+ description="Browse your inventory."
+ image="TabIcon_Things_Off"
+ image_selected="TabIcon_Things_Selected"
mouse_opaque="false"
background_visible="true"
>
<panel
- class="panel_me_profile_view"
- name="panel_me_profile"
- filename="panel_me_profile.xml"
- label="Me"
+ class="sidepanel_inventory"
+ name="sidepanel_inventory"
+ filename="sidepanel_inventory.xml"
+ label="Edit Inventory"
+ font="SansSerifBold"
/>
</sidetray_tab>
<sidetray_tab
name="sidebar_appearance"
help_topic="sidebar_appearance"
- tab_title="Appearance"
+ tab_title="My Appearance"
description="Change your appearance and current look."
image="TabIcon_Appearance_Off"
image_selected="TabIcon_Appearance_Selected"
@@ -120,9 +162,9 @@
background_visible="true"
>
<panel
- class="panel_appearance"
- name="panel_appearance"
- filename="panel_appearance.xml"
+ class="sidepanel_appearance"
+ name="sidepanel_appearance"
+ filename="sidepanel_appearance.xml"
label="Edit Appearance"
font="SansSerifBold"
/>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
index 9845a9eb78..0a9c70303e 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
@@ -19,16 +19,17 @@
top="4"
value="Side Panel"
width="255" />
- <button
+ <button
follows="left|right|top"
- font="SansSerif"
- height="23"
- label="?"
+ height="16"
+ image_selected="Icon_Help_Press"
+ image_unselected="Icon_Help_Foreground"
+ image_disabled="Icon_Help_Press"
layout="topleft"
name="show_help"
- top="5"
- right="-8"
- width="28"
+ top="10"
+ right="-11"
+ width="16"
tool_tip="Show Help">
<button.commit_callback
function="Button.ShowHelp" />
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 247054772e..ab3cc036d5 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -1,198 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Part of side tray, see that XML file for panel config -->
+<!-- the web-based Home panel of the side tray -->
<panel
follows="all"
- height="560"
- label="home_tab"
+ height="570"
+ min_height="350"
+ help_topic="sidetray_home"
layout="topleft"
+ top="0"
+ left="0"
name="home_tab"
width="333">
- <panel
- background_visible="true"
- bg_alpha_color="DkGray2"
- class="panel_sidetray_home_info"
- follows="left|top|right"
- height="120"
+ <layout_stack
+ follows="all"
+ height="550"
+ layout="topleft"
+ left="10"
+ name="stack"
+ top_pad="10"
+ width="313">
+ <layout_panel
+ height="550"
layout="topleft"
- left="15"
- top="17"
- name="sidebar_people"
- width="303">
- <text
- follows="left|right|top"
- font="SansSerifBigBold"
- height="30"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_name"
- text_color="EmphasisColor"
- top="10"
- value="People"
- width="200"
- word_wrap="true" />
- <icon
- follows="top|right"
- height="20"
- layout="topleft"
- name="tab_icon"
- right="-10"
- top="10"
- image_name="TabIcon_People_Selected"
- width="20" />
- <text
- follows="left|right|bottom"
- height="120"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_description"
- right="-10"
- text_color="white"
- top="40"
- word_wrap="true">
- Find your friends, your groups, contacts and people nearby.
- </text>
- </panel>
- <panel
- background_visible="true"
- bg_alpha_color="DkGray2"
- class="panel_sidetray_home_info"
- follows="left|top|right"
- height="120"
- layout="topleft"
- left="15"
- top_pad="15"
- name="sidebar_places"
- width="303">
- <text
- follows="left|right|top"
- font="SansSerifBigBold"
- height="30"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_name"
- text_color="EmphasisColor"
- top="10"
- value="Places"
- width="200"
- word_wrap="true" />
- <icon
- follows="top|right"
- height="20"
- layout="topleft"
- name="tab_icon"
- right="-10"
- top="10"
- width="20"
- image_name="TabIcon_Places_Selected"/>
- <text
- follows="all"
- height="120"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_description"
- right="-10"
- text_color="white"
- top="40"
- word_wrap="true">
- Find places to go and places you&apos;ve visited before.
- </text>
- </panel>
- <panel
- background_visible="true"
- bg_alpha_color="DkGray2"
- class="panel_sidetray_home_info"
- follows="left|top|right"
- height="120"
- layout="topleft"
- left="15"
- top_pad="15"
- name="sidebar_me"
- width="303">
- <text
- follows="left|right|top"
- font="SansSerifBigBold"
- height="30"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_name"
- text_color="EmphasisColor"
- top="10"
- value="My Profile"
- width="200"
- word_wrap="true" />
- <icon
- follows="top|right"
- height="20"
- layout="topleft"
- name="tab_icon"
- right="-10"
- top="10"
- width="20"
- image_name="TabIcon_Me_Selected"/>
- <text
- follows="all"
- height="120"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_description"
- right="-10"
- text_color="white"
- top="40"
- word_wrap="true">
- Edit your public profile.
- </text>
- </panel>
- <panel
- background_visible="true"
- bg_alpha_color="DkGray2"
- class="panel_sidetray_home_info"
- follows="left|top|right"
- height="120"
- layout="topleft"
- left="15"
- top_pad="15"
- name="sidebar_appearance"
- width="303">
- <text
- follows="left|right|top"
- font="SansSerifBigBold"
- height="30"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_name"
- text_color="EmphasisColor"
- top="10"
- value="My Appearance"
- width="200"
- word_wrap="true" />
- <icon
- follows="top|right"
- height="20"
- layout="topleft"
- name="tab_icon"
- right="-10"
- top="10"
- width="20"
- image_name="TabIcon_Appearance_Selected"/>
- <text
- follows="all"
- height="120"
- layout="topleft"
- left="10"
- mouse_opaque="false"
- name="tab_description"
- right="-10"
- text_color="white"
- top="40"
- word_wrap="true">
- Change your appearance and current look.
- </text>
- </panel>
+ left_delta="0"
+ name="browser_layout"
+ top_delta="0"
+ width="313">
+ <web_browser
+ border_visible="false"
+ follows="all"
+ height="550"
+ layout="topleft"
+ left="0"
+ name="browser"
+ start_url="data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#2A2A2A%22 text=%22eeeeee%22%3E %3Ch3%3E %0D%0A%0D%0ALoading... %3C/h3%3E %3C/body%3E%3C/html%3E"
+ top="0"
+ width="313" />
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
index c8703aa895..b48943c699 100644
--- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
@@ -5,7 +5,7 @@
layout="topleft"
name="panel_stand_stop_flying"
mouse_opaque="false"
- visible="false"
+ visible="true"
width="115">
<button
follows="left|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 795e0ffc0d..96c61b69f5 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -3,13 +3,15 @@
background_opaque="true"
background_visible="true"
bg_opaque_color="MouseGray"
- follows="top|left|right"
+ chrome="true"
+ follows="top|right"
height="19"
layout="topleft"
left="0"
mouse_opaque="false"
name="status"
top="19"
+ tab_stop="false"
width="1000">
<panel.string
name="StatBarDaysOfWeek">
@@ -41,172 +43,87 @@
</panel.string>
<button
auto_resize="true"
- halign="right"
- follows="right|bottom"
+ halign="right"
font="SansSerifSmall"
- image_color="White_05"
- flash_color="EmphasisColor"
- image_overlay="BuyArrow_Over"
- height="18"
- layout="topleft"
- left="-225"
+ follows="right|top"
+ image_overlay=""
+ image_selected="spacer35.tga"
+ image_unselected="spacer35.tga"
+ image_pressed="spacer35.tga"
+ height="16"
+ right="-204"
+ label_shadow="false"
name="buycurrency"
- pad_right="23px"
- picture_style="true"
- tool_tip="My Balance: Click to buy more L$"
- top="0"
- width="117" />
+ tool_tip="My Balance"
+ top="3"
+ width="100" />
+ <button
+ auto_resize="true"
+ halign="right"
+ font="SansSerifSmall"
+ follows="right|top"
+ image_selected="BuyArrow_Over"
+ image_unselected="BuyArrow_Over"
+ image_pressed="BuyArrow_Press"
+ height="16"
+ label="Buy L$"
+ label_color="EmphasisColor"
+ left_pad="0"
+ label_shadow="false"
+ name="buyL"
+ pad_right="20"
+ pad_bottom="2"
+ tool_tip="Click to buy more L$"
+ top="2"
+ width="45" />
<text
type="string"
- length="1"
+ font="SansSerifSmall"
text_readonly_color="TimeTextColor"
- follows="right|bottom"
+ follows="right|top"
halign="right"
height="16"
- top="3"
+ top="5"
layout="topleft"
- left_pad="20"
+ left_pad="0"
name="TimeText"
- text_color="TimeTextColor"
tool_tip="Current time (Pacific)"
width="80">
- 12:00 AM
- </text>
- <button
- follows="right|bottom"
- height="16"
- layout="topleft"
- left_delta="-537"
- image_selected="Inv_DangerousScript"
- image_unselected="Inv_DangerousScript"
- name="scriptout"
- picture_style="true"
- scale_image="false"
- tool_tip="Script warnings and errors"
- top="0"
- visible="false"
- width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_selected="Health"
- image_unselected="Health"
- layout="topleft"
- left_pad="7"
- name="health"
- picture_style="true"
- scale_image="false"
- tool_tip="Health"
- top="0"
- visible="false"
- width="16" />
- <text
- bg_visible="false"
- text_readonly_color="HealthTextColor"
- follows="rsight|bottom"
- font_shadow="none"
- height="16"
- layout="topleft"
- left_pad="18"
- name="HealthText"
- text_color="HealthTextColor"
- tool_tip="Health"
- top="0"
- visible="false"
- width="31">
- 100%
+ 24:00 AM PST
</text>
<button
- follows="right|bottom"
- height="16"
- image_selected="Move_Fly_Disabled"
- image_unselected="Move_Fly_Disabled"
- layout="topleft"
- left_pad="7"
- name="no_fly"
- picture_style="true"
- scale_image="false"
- tool_tip="Flying not allowed"
- top="3"
- visible="false"
- width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_selected="Tool_Create"
- image_unselected="Tool_Create"
- layout="topleft"
- left_pad="7"
- name="no_build"
- picture_style="true"
- scale_image="false"
- tool_tip="Building/rezzing not allowed"
- top="0"
- visible="false"
- width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_selected="Inv_Script"
- image_unselected="Inv_Script"
- layout="topleft"
- left_pad="7"
- name="no_scripts"
- picture_style="true"
- scale_image="false"
- tool_tip="Scripts not allowed"
- top="0"
- visible="false"
- width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_selected="Inv_Gesture"
- image_unselected="Inv_Gesture"
- layout="topleft"
- left_pad="7"
- name="restrictpush"
- picture_style="true"
- scale_image="false"
- tool_tip="No pushing"
- top="0"
- visible="false"
- width="16" />
+ follows="right|top"
+ height="15"
+ image_selected="Pause_Off"
+ image_unselected="Play_Off"
+ image_pressed="Play_Press"
+ image_pressed_selected="Pause_Press"
+ is_toggle="true"
+ left_pad="15"
+ top="2"
+ name="media_toggle_btn"
+ tool_tip="Click to toggle media"
+ width="16" >
+ </button>
<button
- follows="right|bottom"
- height="18"
- image_selected="Microphone_Mute"
- image_unselected="Microphone_Mute"
- layout="topleft"
- left_pad="7"
- name="status_no_voice"
- picture_style="true"
- scale_image="false"
- tool_tip="Voice not available here"
- top="1"
- visible="false"
- width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_selected="Icon_For_Sale"
- image_unselected="Icon_For_Sale"
- layout="topleft"
- left_pad="7"
- name="buyland"
- picture_style="true"
- tool_tip="Buy this parcel"
- top="0"
- visible="false"
+ follows="right|top"
+ height="15"
+ image_selected="AudioMute_Off"
+ image_pressed="Audio_Press"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ left_pad="5"
+ top="2"
+ name="volume_btn"
+ tool_tip="Global Volume Control"
width="16" />
<text
- enabled="true"
- follows="right|bottom"
+ follows="right|top"
halign="center"
height="12"
layout="topleft"
- left_delta="-4"
+ left_delta="0"
name="stat_btn"
- top_delta="3"
- width="20" />
+ top_delta="0"
+ width="20"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 53ee0d159d..5e74689c5a 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -1,65 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- All our XML is utf-8 encoded. -->
-
<panel
- name="sys_well_item"
- title="sys_well_item"
+ translate="false"
+ name="sys_well_item"
+ title="sys_well_item"
visible="true"
- top="0"
- left="0"
- width="318"
- height="35"
+ top="0"
+ left="0"
+ width="300"
+ height="35"
layout="topleft"
follows="left|right"
background_opaque="false"
background_visible="true"
bg_alpha_color="0.0 0.0 0.0 0.0" >
-
- <icon
- top="8"
- left="8"
- width="20"
- height="20"
- layout="topleft"
- follows="left"
- name="icon"
- label=""
- mouse_opaque="false"
- image_name="lag_status_warning.tga"
- />
-
<text
- top="2"
- left_pad="8"
- width="255"
- height="28"
+ clip_partial="true"
+ top="2"
+ left="10"
+ width="267"
+ height="28"
layout="topleft"
follows="right|left"
- font="SansSerifBold"
text_color="white"
- use_ellipses="true"
+ use_ellipses="true"
word_wrap="true"
mouse_opaque="false"
name="title" >
- Select your streaming media preference. Select your streaming media preference.
- </text>
-
+ Beware the trout. BEWARE! THE! TROUT!
+ </text>
<button
- top="5"
- left_pad="5"
- width="15"
- height="15"
+ top="5"
+ right="-5"
+ width="17"
+ height="17"
layout="topleft"
follows="right"
- name="close_btn"
+ name="close_btn"
mouse_opaque="true"
- label=""
tab_stop="false"
- image_unselected="toast_hide_btn.tga"
- image_disabled="toast_hide_btn.tga"
- image_selected="toast_hide_btn.tga"
- image_hover_selected="toast_hide_btn.tga"
- image_disabled_selected="toast_hide_btn.tga"
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast"
/>
-
-</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 4169c6245b..ecf7252a11 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,21 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Teleport History" bottom="0" height="326" left="0" width="380"
- border="true" follows="left|top|right|bottom">
+<panel name="Teleport History" bottom="0" height="400" left="0" width="380"
+ help_topic="panel_teleport_history"
+ border="false" follows="left|top|right|bottom">
<accordion
follows="left|top|right|bottom"
- height="300"
+ height="368"
layout="topleft"
left="0"
top="0"
name="history_accordion"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
width="380">
<accordion_tab
- can_resize="false"
layout="topleft"
name="today"
title="Today">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -26,12 +27,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="yesterday"
title="Yesterday">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -42,12 +41,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="2_days_ago"
title="2 days ago">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -56,14 +53,12 @@
top="0"
width="380">
</flat_list_view>
- </accordion_tab>
+ </accordion_tab>5
<accordion_tab
- can_resize="false"
layout="topleft"
name="3_days_ago"
title="3 days ago">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -74,12 +69,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="4_days_ago"
title="4 days ago">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -90,12 +83,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="5_days_ago"
title="5 days ago">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -106,12 +97,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="6_days_and_older"
title="6 days and older">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -122,12 +111,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="1_month_and_older"
title="1 month and older">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -138,12 +125,10 @@
</flat_list_view>
</accordion_tab>
<accordion_tab
- can_resize="false"
layout="topleft"
name="6_months_and_older"
title="6 months and older">
<flat_list_view
- draw_heading="false"
follows="all"
height="150"
layout="topleft"
@@ -155,20 +140,21 @@
</accordion_tab>
</accordion>
<panel
- background_visible="true"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
bevel_style="none"
- top_pad="0"
+ bottom="0"
follows="left|right|bottom"
- height="30"
- label="bottom_panel"
- layout="topleft"
+ height="38"
+ layout="bottomleft"
left="0"
name="bottom_panel"
width="380">
<button
follows="bottom|left"
- font="SansSerifBigBold"
- tool_tip=""
+ tool_tip="Show additional optioins"
height="18"
image_disabled="OptionsMenu_Disabled"
image_selected="OptionsMenu_Press"
@@ -176,8 +162,7 @@
layout="topleft"
left="10"
name="gear_btn"
- picture_style="true"
- top="5"
+ top="14"
width="18" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index 63c2d4538e..c5f3fcc27d 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -28,39 +28,36 @@
visible="false"
width="380" />
<icon
- height="20"
- follows="top|right|left"
- image_name="ListItem_Select"
+ height="16"
+ follows="top|left"
+ image_name="Inv_Landmark"
layout="topleft"
left="0"
name="landmark_icon"
top="0"
- visible="false"
- width="20" />
+ width="16" />
<text
follows="left|right"
height="20"
layout="topleft"
left_pad="5"
+ allow_html="false"
use_ellipses="true"
name="region"
text_color="white"
top="4"
- value="Unknown"
+ value="..."
width="330" />
<button
follows="right"
- height="18"
- image_disabled="Info"
- image_disabled_selected="Info"
- image_hover_selected="Info"
- image_selected="Info"
- image_unselected="Info"
+ height="20"
+ image_overlay="ForwardArrow_Off"
layout="topleft"
- name="info_btn"
- picture_style="true"
+ left_pad="5"
+ right="-3"
+ name="profile_btn"
+ tool_tip="Show item info"
+ top="1"
visible="false"
- right="-5"
- top="2"
- width="18" />
+ width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 66237d585a..11069b3ac3 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -1,78 +1,89 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- All our XML is utf-8 encoded. -->
-<!-- All this does is establish the position of the "close" button on the toast. -->
+<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
+
+<!--
+ This floater is invisible. To make toast look like a floater we render wrapper_panel
+ like a floater(draw shadows and so on). This is done with one purpose - make close button
+ look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246)
+-->
<floater
- legacy_header_height="18"
- name="toast"
- title=""
- visible="false"
+ legacy_header_height="0"
+ header_height="0"
+ name="toast"
+ title=""
+ visible="false"
+ layout="topleft"
+ height="47"
+ width="310"
+ left="0"
+ top="0"
+ follows="right|bottom"
+ background_visible="false"
+ bg_opaque_image="Toast_Over"
+ bg_alpha_image="Toast_Background"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="false"
+ can_drag_on_left="false"
+ can_close="false"
+ can_dock="false"
+ border_visible = "false"
+ border_drop_shadow_visible = "false"
+ drop_shadow_visible = "false"
+ border = "false"
+>
+ <panel
+ background_opaque="false"
+ border_visible="false"
+ background_visible="true"
+ bg_opaque_image="Toast_Over"
+ bg_alpha_image="Toast_Background"
+ label="wrapper_panel"
layout="topleft"
- width="305"
left="0"
- top="0"
- follows="right|bottom"
- bg_opaque_image="Toast_Background"
- bg_alpha_image="Toast_Background"
- can_minimize="false"
- can_tear_off="false"
- can_resize="false"
- can_drag_on_left="false"
- can_close="false"
- can_dock="false"
- border_visible = "false"
- border_drop_shadow_visible = "false"
- drop_shadow_visible = "false"
- border = "false"
- >
-
- <!--
+ name="wrapper_panel"
+ top="7"
+ height="40"
+ follows="all"
+ translate="false"
+ width="305">
+ <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
<text
+ clip_partial="true"
visible="false"
follows="left|top|right|bottom"
font="SansSerifBold"
- height="40"
+ height="20"
layout="topleft"
- left="60"
+ left="20"
name="toast_text"
word_wrap="true"
text_color="white"
- top="20"
- width="290">
+ top="5"
+ translate="false"
+ v_pad="5"
+ use_ellipses="true"
+ width="260">
Toast text;
</text>
- <icon
- top="20"
- left="10"
- width="32"
- height="32"
- follows="top|left"
- layout="topleft"
- visible="false"
- color="1 1 1 1"
- enabled="true"
- image_name="notify_tip_icon.tga"
- mouse_opaque="true"
- name="icon"
- />-->
+ </panel>
<button
layout="topleft"
- top="-6"
- left="293"
- width="17"
- height="17"
+ top="0"
+ right="310"
+ width="17"
+ height="17"
follows="top|right"
- visible="false"
- enabled="true"
- mouse_opaque="false"
- name="hide_btn"
- label=""
+ visible="false"
+ enabled="true"
+ mouse_opaque="false"
+ name="hide_btn"
+ label=""
tab_stop="false"
- image_unselected="windows/Toast_CloseBtn.png"
- image_disabled="windows/Toast_CloseBtn.png"
- image_selected="windows/Toast_CloseBtn.png"
- image_hover_selected="windows/Toast_CloseBtn.png"
- image_disabled_selected="windows/Toast_CloseBtn.png"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
/>
-</floater>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
new file mode 100644
index 0000000000..cd66c56ca1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ border_visible="false"
+ border="false"
+ chrome="true"
+ follows="bottom"
+ height="150"
+ layout="topleft"
+ name="volumepulldown_floater"
+ width="32">
+ <slider
+ control_name="AudioLevelMaster"
+ follows="left|top"
+ left="0"
+ top="1"
+ orientation="vertical"
+ height="120"
+ increment="0.05"
+ initial_value="0.5"
+ layout="topleft"
+ name="mastervolume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="2"
+ volume="true">
+ <slider.commit_callback
+ function="Vol.setControlFalse"
+ parameter="MuteAudio" />
+ </slider>
+ <button
+ left="7"
+ top_pad="9"
+ width="18"
+ height="12"
+ follows="top|left"
+ name="prefs_btn"
+ image_unselected="Icon_Gear_Foreground"
+ image_disabled="Icon_Gear_Background"
+ image_pressed="Icon_Gear_Press"
+ scale_image="false">
+ <button.commit_callback
+ function="Vol.GoAudioPrefs" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index b89a975430..a6036f8b78 100644
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -4,39 +4,39 @@
description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation."
name="Membership">
<action description="Invite People to this Group"
- longdescription="Invite People to this Group using the &apos;Invite New Person...&apos; button in the Members &amp; Roles tab &gt; Members sub-tab."
+ longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles section &gt; Members tab."
name="member invite" value="1" />
<action description="Eject Members from this Group"
- longdescription="Eject Members from this Group using the &apos;Eject From Group&apos; button in the Members &amp; Roles tab &gt; Members sub-tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
+ longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
name="member eject" value="2" />
<action
- description="Toggle &apos;Open Enrollment&apos; and change &apos;Signup Fee&apos;"
- longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change &apos;Signup Fee&apos; in the Group Preferences section of the General tab."
+ description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;"
+ longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section."
name="member options" value="3" />
</action_set>
<action_set
description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles."
name="Roles">
<action description="Create new Roles"
- longdescription="Create new Roles in the Members &amp; Roles tab &gt; Roles sub-tab."
+ longdescription="Create new Roles in the Roles section &gt; Roles tab."
name="role create" value="4" />
<action description="Delete Roles"
- longdescription="Delete Roles in the Members &amp; Roles tab &gt; Roles sub-tab."
+ longdescription="Delete Roles in the Roles section &gt; Roles tab."
name="role delete" value="5" />
- <action description="Change Role names, titles, descriptions, and whether Role members are publicly visible"
- longdescription="Change Role names, titles, descriptions, and whether Role members are publicly visible. This is done at the bottom of the the Members &amp; Roles tab &gt; Roles sub-tab after selecting a Role."
+ <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed"
+ longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role."
name="role properties" value="6" />
<action description="Assign Members to Assigner&apos;s Roles"
- longdescription="Assign Members to Roles in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. A Member with this Ability can only add Members to a Role the assigner is already in."
+ longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in."
name="role assign member limited" value="7" />
<action description="Assign Members to Any Role"
- longdescription="Assign Members to Any Role in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+ longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
name="role assign member" value="8" />
<action description="Remove Members from Roles"
- longdescription="Remove Members from Roles in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. Owners can&apos;t be removed."
+ longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed."
name="role remove member" value="9" />
<action description="Assign and Remove Abilities in Roles"
- longdescription="Assign and Remove Abilities in Roles in the Allowed Abilities section of the Members &amp; Roles tab &gt; Roles sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+ longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
name="role change actions" value="10" />
</action_set>
<action_set
@@ -44,11 +44,11 @@
name="Group Identity">
<action
description="Change Charter, Insignia, and &apos;Show in search&apos;"
- longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General tab."
+ longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General section."
name="group change identity" value="11" />
</action_set>
<action_set
- description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land...&apos;, or click the parcel info in the menu bar."
+ description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land&apos;, or click the &apos;i&apos; icon in the Navigation Bar."
name="Parcel Management">
<action description="Deed land and buy land for group"
longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab."
@@ -60,18 +60,18 @@
longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land &gt; General tab as they wish! Be sure you know what you&apos;re doing before assigning this Ability."
name="land set sale info" value="14" />
<action description="Subdivide and join parcels"
- longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide...&apos;. To join, select two or more contiguous parcels and click &apos;Join...&apos;. "
+ longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide&apos;. To join, select two or more contiguous parcels and click &apos;Join&apos;. "
name="land divide join" value="15" />
</action_set>
<action_set
description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point &amp; TP routing options."
name="Parcel Identity">
- <action description="Toggle &apos;Show in Find Places&apos; and set category"
- longdescription="Toggle &apos;Show in Find Places&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
+ <action description="Toggle &apos;Show Place in Search&apos; and set category"
+ longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
name="land find places" value="17" />
<action
- description="Change parcel name, description, and &apos;Show in search&apos; settings"
- longdescription="Change parcel name, description, and &apos;Show in search&apos; settings. This is done in About Land &gt; Options tab."
+ description="Change parcel name, description, and &apos;Show Place in Search&apos; settings"
+ longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab."
name="land change identity" value="18" />
<action description="Set landing point and set teleport routing"
longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab."
@@ -87,7 +87,7 @@
longdescription="Toggle &apos;Edit Terrain&apos;. *WARNING* About Land &gt; Options tab &gt; Edit Terrain allows anyone to terraform your land&apos;s shape, and place and move Linden plants. Be sure you know what you&apos;re doing before assigning this Ability. Editing terrain is toggled in About Land &gt; Options tab."
name="land edit" value="21" />
<action description="Toggle various About Land &gt; Options settings"
- longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Create Objects&apos;, &apos;Edit Terrain&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab."
+ longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Edit Terrain&apos;, &apos;Build&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab."
name="land options" value="22" />
</action_set>
<action_set
@@ -106,7 +106,7 @@
longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab."
name="land allow landmark" value="26" />
<action description="Allow &apos;Set Home to Here&apos; on group land"
- longdescription="Members in a Role with this Ability can use World menu &gt; Set Home to Here on a parcel deeded to this group."
+ longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group."
name="land allow set home" value="28" />
</action_set>
<action_set
@@ -116,13 +116,13 @@
longdescription="Manage parcel Access lists in About Land &gt; Access tab."
name="land manage allowed" value="29" />
<action description="Manage parcel Ban lists"
- longdescription="Manage parcel Ban lists in About Land &gt; Ban tab."
+ longdescription="Manage parcel Ban lists in About Land &gt; Access tab."
name="land manage banned" value="30" />
- <action description="Change parcel &apos;Sell passes...&apos; settings"
- longdescription="Change parcel &apos;Sell passes...&apos; settings in About Land &gt; Access tab."
+ <action description="Change parcel &apos;Sell passes to&apos; settings"
+ longdescription="Change parcel &apos;Sell passes to&apos; settings in About Land &gt; Access tab."
name="land manage passes" value="31" />
<action description="Eject and freeze Residents on parcels"
- longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, More &gt;, and selecting &apos;Eject...&apos; or &apos;Freeze...&apos;."
+ longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting &apos;Eject&apos; or &apos;Freeze&apos;."
name="land admin" value="32" />
</action_set>
<action_set
@@ -138,20 +138,20 @@
longdescription="Return objects on group-owned parcels that are non-group in About Land &gt; Objects tab."
name="land return non group" value="34" />
<action description="Landscaping using Linden plants"
- longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder or they can be created via the Build button."
+ longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder, or they can be created via the Build menu."
name="land gardening" value="35" />
</action_set>
<action_set
- description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools &gt; General Tab. Right-click an object and Edit to see its settings. "
+ description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools &gt; General tab. Right-click an object and Edit to see its settings. "
name="Object Management">
<action description="Deed objects to group"
- longdescription="Deed objects to group in the Edit Tools &gt; General Tab."
+ longdescription="Deed objects to group in the Build Tools &gt; General tab."
name="object deed" value="36" />
<action description="Manipulate (move, copy, modify) group-owned objects"
- longdescription="Manipulate (move, copy, modify) group-owned objects in the Edit Tools &gt; General Tab."
+ longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools &gt; General tab."
name="object manipulate" value="38" />
<action description="Set group-owned objects for sale"
- longdescription="Set group-owned objects for sale in the Edit Tools &gt; General tab."
+ longdescription="Set group-owned objects for sale in the Build Tools &gt; General tab."
name="object set sale" value="39" />
</action_set>
<action_set
@@ -165,10 +165,10 @@
description="These Abilities include powers to allow Members to send, receive, and view group Notices."
name="Notices">
<action description="Send Notices"
- longdescription="Members in a Role with this Ability can send Notices in Group Information &gt; Notices tab."
+ longdescription="Members in a Role with this Ability can send Notices via the Group &gt; Notices section."
name="notices send" value="42" />
<action description="Receive Notices and view past Notices"
- longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group Information &gt; Notices tab."
+ longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group &gt; Notices section."
name="notices receive" value="43" />
</action_set>
<action_set
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
new file mode 100644
index 0000000000..b3d55fec65
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+background_visible="true"
+follows="all"
+height="570"
+label="Outfits"
+layout="topleft"
+min_height="350"
+min_width="240"
+name="appearance panel"
+top="0"
+left="0"
+width="333">
+ <string
+ name="No Outfit"
+ value="No Outfit" />
+ <panel
+ left="0"
+ top="0"
+ follows="all"
+ layout="topleft"
+ width="330"
+ height="33"
+ name="panel_currentlook"
+ >
+ <button
+ follows="left|top"
+ top="0" width="1" height="1"
+ layout="topleft"
+ left="0"
+ name="editappearance_btn" />
+ <button
+ follows="left|top"
+ top="0" width="1" height="1"
+ layout="topleft"
+ left="0"
+ name="openoutfit_btn" />
+ <icon
+ follows="top|left"
+ height="24"
+ image_name="TabIcon_Appearance_Off"
+ name="outfit_icon"
+ mouse_opaque="false"
+ visible="true"
+ left="9"
+ top="0"
+ width="24" />
+ <text
+ font="SansSerifHugeBold"
+ height="20"
+ left_pad="5"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ width="305"
+ follows="top|left"
+ word_wrap="true"
+ mouse_opaque="false"
+ name="currentlook_name">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ <text
+ font="SansSerifSmall"
+ text_color="White_50"
+ width="300"
+ height="1"
+ follows="top|left"
+ layout="topleft"
+ top_pad="5"
+ mouse_opaque="false"
+ name="currentlook_title" >
+ (unsaved)
+ </text>
+ </panel>
+ <filter_editor
+ height="23"
+ follows="left|top|right"
+ layout="topleft"
+ left="10"
+ label="Filter Outfits"
+ max_length="300"
+ name="Filter"
+ top_pad="10"
+ width="303" />
+ <panel
+ class="panel_outfits_inventory"
+ filename="panel_outfits_inventory.xml"
+ name="panel_outfits_inventory"
+ height="505"
+ min_height="410"
+ width="320"
+ left="0"
+ top_pad="6"
+ follows="all" />
+ <!-- <button
+ follows="bottom|left"
+ height="23"
+ label="New outfit"
+ layout="topleft"
+ left_pad="5"
+ right="-10"
+ name="newlook_btn"
+ width="100" />-->
+ <panel
+ class="panel_look_info"
+ filename="panel_look_info.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_look_info"
+ top="35"
+ visible="false" />
+ <panel
+ class="panel_edit_wearable"
+ filename="panel_edit_wearable.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_edit_wearable"
+ top="35"
+ visible="false" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
new file mode 100644
index 0000000000..a233d42568
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ name="objects panel"
+ width="333">
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="sidepanel__inventory_panel"
+ top="0"
+ label=""
+ height="570"
+ visible="true"
+ width="330">
+ <panel
+ class="panel_main_inventory"
+ filename="panel_main_inventory.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_main_inventory"
+ top="0"
+ label=""
+ height="545"
+ width="330" />
+ <panel
+ height="25"
+ layout="topleft"
+ name="button_panel"
+ left="9"
+ top_pad="-2"
+ width="313">
+ <button
+ enabled="true"
+ follows="bottom|left"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ left="0"
+ name="info_btn"
+ top="0"
+ width="153" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ left="156"
+ name="wear_btn"
+ top="0"
+ width="152" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ height="23"
+ label="Play"
+ layout="topleft"
+ name="play_btn"
+ left="156"
+ top="0"
+ width="152" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left="156"
+ name="teleport_btn"
+ top="0"
+ width="152" />
+ </panel>
+ </panel>
+
+<panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ class="sidepanel_item_info"
+ filename="sidepanel_item_info.xml"
+ name="sidepanel__item_panel"
+ top="0"
+ label=""
+ height="570"
+ visible="false"
+ width="330">
+ </panel>
+
+<panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ class="sidepanel_task_info"
+ filename="sidepanel_task_info.xml"
+ name="sidepanel__task_panel"
+ top="0"
+ label=""
+ height="570"
+ visible="false"
+ width="330">
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
new file mode 100644
index 0000000000..12c06504ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ auto_tile="true"
+ height="570"
+ layout="topleft"
+ name="item properties"
+ help_topic="item_properties"
+ save_rect="true"
+ title="Object Profile"
+ width="333">
+ <panel.string
+ name="unknown">
+ (unknown)
+ </panel.string>
+ <panel.string
+ name="public">
+ (public)
+ </panel.string>
+ <panel.string
+ name="you_can">
+ You can:
+ </panel.string>
+ <panel.string
+ name="owner_can">
+ Owner can:
+ </panel.string>
+ <panel.string
+ name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <icon
+ follows="top|right"
+ height="18"
+ image_name="Lock"
+ layout="topleft"
+ right="-15"
+ mouse_opaque="true"
+ name="IconLocked"
+ top="8"
+ width="18" />
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="14"
+ name="back_btn"
+ tab_stop="false"
+ top="2"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ value="Object Profile"
+ width="275" />
+ <text
+ follows="top|left"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="where"
+ text_color="LtGray_50"
+ value="(Inventory)"
+ width="150" />
+ <panel
+ follows="all"
+ height="493"
+ label=""
+ layout="topleft"
+ left="9"
+ help_topic=""
+ top="45"
+ width="313"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemNameTitle"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length="63"
+ name="LabelItemName"
+ top_delta="0"
+ width="225" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemDescTitle"
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ max_length="127"
+ name="LabelItemDesc"
+ top_delta="-5"
+ width="225" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelCreatorTitle"
+ top_pad="10"
+ width="78">
+ Creator:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelCreatorName"
+ top_delta="6"
+ width="140">
+ Nicole Linden
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnCreator"
+ top_delta="-6"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelOwnerTitle"
+ top_pad="10"
+ width="78">
+ Owner:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelOwnerName"
+ top_delta="6"
+ width="140">
+ Thrax Linden
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnOwner"
+ top_delta="-3"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelAcquiredTitle"
+top_pad="10"
+ width="78">
+ Acquired:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ name="LabelAcquiredDate"
+ top_delta="0"
+ width="222">
+ Wed May 24 12:50:46 2006
+ </text>
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ name="perms_inv"
+ left="0"
+ top_pad="25"
+ height="155"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="13"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ name="CheckOwnerModify"
+ top_pad="0"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerTransfer"
+ width="106" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="AnyoneLabel"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckEveryoneCopy"
+ top_delta="-2"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-2"
+ name="CheckShareWithGroup"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="CheckNextOwnerModify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerTransfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="18"
+ label="For Sale"
+ layout="topleft"
+ left="20"
+ name="CheckPurchase"
+ top_pad="20"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
+ name="combobox sale copy"
+ width="170">
+ <combo_box.item
+ label="Copy"
+ name="Copy"
+ value="Copy" />
+ <combo_box.item
+ label="Original"
+ name="Original"
+ value="Original" />
+ </combo_box>
+ <spinner
+ follows="left|top"
+ decimal_digits="0"
+ increment="1"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="Price: L$"
+ label_width="75"
+ left="120"
+ width="170"
+ min_val="1"
+ height="23"
+ max_val="999999999"
+ top_pad="10"/>
+ </panel>
+ <panel
+ height="30"
+ layout="topleft"
+ name="button_panel"
+ left="5"
+ bottom="2"
+ width="313">
+ <button
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-1"
+ width="100" />
+ </panel>
+ </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
new file mode 100644
index 0000000000..d2c9e56bc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -0,0 +1,553 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ auto_tile="true"
+ height="570"
+ layout="topleft"
+ name="object properties"
+ help_topic="object_properties"
+ save_rect="true"
+ title="Object Profile"
+ width="333">
+ <panel.string
+ name="text deed continued">
+ Deed
+ </panel.string>
+ <panel.string
+ name="text deed">
+ Deed
+ </panel.string>
+ <panel.string
+ name="text modify info 1">
+ You can modify this object
+ </panel.string>
+ <panel.string
+ name="text modify info 2">
+ You can modify these objects
+ </panel.string>
+ <panel.string
+ name="text modify info 3">
+ You can't modify this object
+ </panel.string>
+ <panel.string
+ name="text modify info 4">
+ You can't modify these objects
+ </panel.string>
+ <panel.string
+ name="text modify warning">
+ This object has linked parts
+ </panel.string>
+ <panel.string
+ name="Cost Default">
+ Price: L$
+ </panel.string>
+ <panel.string
+ name="Cost Total">
+ Total Price: L$
+ </panel.string>
+ <panel.string
+ name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string
+ name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string
+ name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ tab_stop="false"
+ top="0"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHuge"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ value="Object Profile"
+ width="275" />
+ <text
+ follows="top|left"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="where"
+ text_color="LtGray_50"
+ value="(inworld)"
+ width="150" />
+ <panel
+ follows="all"
+ height="490"
+ label=""
+ layout="topleft"
+ left="10"
+ help_topic=""
+ top="45"
+ width="313"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="Name:"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length="63"
+ name="Object Name"
+ top_delta="0"
+ width="225" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="Description:"
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ name="Object Description"
+ select_on_focus="true"
+ left_delta="78"
+ max_length="127"
+ top_delta="-5"
+ width="225"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="CreatorNameLabel"
+ top_pad="12"
+ width="78">
+ Creator:
+ </text>
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="Creator Name"
+ top_delta="0"
+ width="140">
+ Erica Linden
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Owner:"
+ top_pad="15"
+ width="78">
+ Owner:
+ </text>
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="Owner Name"
+ top_delta="0"
+ width="140">
+ Erica Linden
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Group_label"
+ top_pad="15"
+ width="78">
+ Group:
+ </text>
+ <button
+ follows="top|left"
+ height="10"
+ image_disabled="Activate_Checkmark"
+ image_selected="Activate_Checkmark"
+ image_unselected="Activate_Checkmark"
+ image_color="White_50"
+ layout="topleft"
+ left_pad="0"
+ top_delta="0"
+ name="button set group"
+ picture_style="true"
+ tab_stop="false"
+ tool_tip="Choose a group to share this object's permissions"
+ width="10" />
+ <name_box
+ follows="left|top"
+ height="18"
+ initial_value="Loading..."
+ layout="topleft"
+ left_pad="5"
+ top_delta="-1"
+ name="Group Name Proxy"
+ width="150" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Deed"
+ label_selected="Deed"
+ layout="topleft"
+ name="button deed"
+ top_pad="0"
+ left="81"
+ tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="9"
+ layout="topleft"
+ top_pad="5"
+ left="5"
+ name="label click action"
+ width="280">
+ Click to:
+ </text>
+ <combo_box
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ name="clickaction"
+ width="168"
+ left="81">
+ <combo_box.item
+ label="Touch (default)"
+ name="Touch/grab(default)"
+ value="Touch/grab (default)" />
+ <combo_box.item
+ label="Sit on object"
+ name="Sitonobject"
+ value="Sit on object" />
+ <combo_box.item
+ label="Buy object"
+ name="Buyobject"
+ value="Buy object" />
+ <combo_box.item
+ label="Pay object"
+ name="Payobject"
+ value="Pay object" />
+ <combo_box.item
+ label="Open"
+ name="Open"
+ value="Open" />
+ </combo_box>
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="perms_inv"
+ left="0"
+ top_pad="15"
+ height="135"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="15"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can modify this object
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Anyone can:"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox allow everyone copy"
+ top_delta="-2"
+ width="90" />
+ <check_box
+ height="18"
+ label="Move"
+ layout="topleft"
+ name="checkbox allow everyone move"
+ left_pad="0"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="90"
+ top_delta="-2"
+ name="checkbox share with group"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="checkbox next owner can modify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can copy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can transfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="23"
+ label="For Sale"
+ layout="topleft"
+ left="20"
+ name="checkbox for sale"
+ top_pad="10"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
+ name="sale type"
+ width="170">
+ <combo_box.item
+ name="Copy"
+ label="Copy"
+ value="2" />
+ <combo_box.item
+ name="Contents"
+ label="Contents"
+ value="3" />
+ <combo_box.item
+ name="Original"
+ label="Original"
+ value="1" />
+ </combo_box>
+ <spinner
+ follows="left|top"
+ decimal_digits="0"
+ increment="1"
+ top_pad="10"
+ left="120"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="Price: L$"
+ label_width="65"
+ width="150"
+ min_val="1"
+ height="20"
+ max_val="999999999" />
+ <check_box
+ height="20"
+ width="110"
+ top_pad="6"
+ label="Show in search"
+ layout="topleft"
+ left="120"
+ name="search_check"
+ tool_tip="Let people see this object in search results" />
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ top_pad="15"
+ follows="left|top"
+ layout="topleft"
+ left="10"
+ name="B:"
+ height="10"
+ width="50">
+ B:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="O:"
+ height="10"
+ width="50">
+ O:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="G:"
+ height="10"
+ width="50">
+ G:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ left_pad="0"
+ layout="topleft"
+ name="E:"
+ height="10"
+ width="50">
+ E:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="N:"
+ height="10"
+ width="50">
+ N:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ name="F:"
+ height="10"
+ width="50">
+ F:
+ </text>
+ </panel>
+ <panel
+ height="25"
+ layout="bottomright"
+ name="button_panel"
+ left="5"
+ bottom="5"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Open"
+ layout="topleft"
+ left="5"
+ name="open_btn"
+ top="0"
+ width="100" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Pay"
+ layout="topleft"
+ left_pad="5"
+ name="pay_btn"
+ top="0"
+ width="100" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Buy"
+ layout="topleft"
+ left_pad="5"
+ name="buy_btn"
+ top="0"
+ width="100" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 4eacd72a7d..455b4be264 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
<!-- Default Args - these arguments will be replaced in all strings -->
<string name="SECOND_LIFE">Second Life</string>
<string name="APP_NAME">Second Life</string>
+ <string name="CAPITALIZED_APP_NAME">SECOND LIFE</string>
<string name="SECOND_LIFE_GRID">Second Life Grid</string>
<string name="SUPPORT_SITE">Second Life Support Portal</string>
@@ -44,8 +45,8 @@
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
-
-
+
+
<!-- Tooltip, lltooltipview.cpp -->
<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
@@ -66,23 +67,28 @@
<!-- tooltips for Urls -->
<string name="TooltipHttpUrl">Click to view this web page</string>
<string name="TooltipSLURL">Click to view this location's information</string>
- <string name="TooltipAgentUrl">Click to view this resident's profile</string>
+ <string name="TooltipAgentUrl">Click to view this Resident's profile</string>
<string name="TooltipGroupUrl">Click to view this group's description</string>
<string name="TooltipEventUrl">Click to view this event's description</string>
<string name="TooltipClassifiedUrl">Click to view this classified</string>
<string name="TooltipParcelUrl">Click to view this parcel's description</string>
<string name="TooltipTeleportUrl">Click to teleport to this location</string>
<string name="TooltipObjectIMUrl">Click to view this object's description</string>
+ <string name="TooltipMapUrl">Click to view this location on a map</string>
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
-
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+
+ <!-- text for SLURL labels -->
+ <string name="SLurlLabelTeleport">Teleport to</string>
+ <string name="SLurlLabelShowOnMap">Show Map for</string>
+
<!-- ButtonToolTips, llfloater.cpp -->
<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
- <string name="BUTTON_RESTORE">Restore</string>
+ <string name="BUTTON_RESTORE">Restore</string>
<string name="BUTTON_MINIMIZE">Minimize</string>
<string name="BUTTON_TEAR_OFF">Tear Off</string>
<string name="BUTTON_DOCK">Dock</string>
- <string name="BUTTON_UNDOCK">Undock</string>
<string name="BUTTON_HELP">Show Help</string>
<!-- searching - generic -->
@@ -97,24 +103,21 @@
<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
<string name="LoadingData">Loading...</string>
-
-
+
+
<!-- namecache -->
<!-- Avatar name: text shown for LLUUID::null -->
<string name="AvatarNameNobody">(nobody)</string>
-
+
<!-- Avatar name: text shown while fetching name -->
<string name="AvatarNameWaiting">(waiting)</string>
<!-- Avatar name: More than one avatar is selected/used here -->
<string name="AvatarNameMultiple">(multiple)</string>
-
- <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
- <string name="AvatarNameHippos">(hippos)</string>
-
+
<!-- Group name: text shown for LLUUID::null -->
<string name="GroupNameNone">(none)</string>
-
+
<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
<string name="AssetErrorNone">No error</string>
<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -127,7 +130,7 @@
<string name="AssetErrorCircuitGone">Circuit gone</string>
<string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string>
<string name="AssetErrorUnknownStatus">Unknown status</string>
-
+
<!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* -->
<string name="texture">texture</string>
<string name="sound">sound</string>
@@ -153,7 +156,7 @@
<string name="simstate">simstate</string>
<string name="favorite">favorite</string>
<string name="symbolic link">link</string>
-
+
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
<string name="AvatarAway">Away</string>
@@ -230,17 +233,17 @@
<string name="anim_express_worry">Worry</string>
<string name="anim_yes_happy">Yes (Happy)</string>
<string name="anim_yes_head">Yes</string>
-
+
<!-- world map -->
<string name="texture_loading">Loading...</string>
<string name="worldmap_offline">Offline</string>
<string name="worldmap_results_none_found">None found.</string>
-
+
<!-- animations uploading status codes -->
<string name="Ok">OK</string>
<string name="Premature end of file">Premature end of file</string>
<string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
-
+
<!-- Chat -->
<string name="whisper">whispers:</string>
<string name="shout">shouts:</string>
@@ -248,6 +251,7 @@
<string name="connected">Connected</string>
<string name="unavailable">Voice not available at your current location</string>
<string name="hang_up">Disconnected from in-world Voice Chat</string>
+ <string name="reconnect_nearby">You will now be reconnected to Nearby Voice Chat</string>
<string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string>
<string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string>
<string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string>
@@ -261,14 +265,15 @@
<string name="ChangePermissions">Change its permissions</string>
<string name="TrackYourCamera">Track your camera</string>
<string name="ControlYourCamera">Control your camera</string>
+ <string name="NotConnected">Not Connected</string>
<!-- Sim Access labels -->
- <string name="SIM_ACCESS_PG">PG</string>
- <string name="SIM_ACCESS_MATURE">Mature</string>
+ <string name="SIM_ACCESS_PG">General</string>
+ <string name="SIM_ACCESS_MATURE">Moderate</string>
<string name="SIM_ACCESS_ADULT">Adult</string>
<string name="SIM_ACCESS_DOWN">Offline</string>
<string name="SIM_ACCESS_MIN">Unknown</string>
-
+
<!-- For use when we do not have land type back from the server -->
<string name="land_type_unknown">(unknown)</string>
@@ -288,14 +293,14 @@
<string name="compressed_image_files">Compressed Images</string>
<string name="load_files">Load Files</string>
<string name="choose_the_directory">Choose Directory</string>
-
+
<!-- LSL Usage Hover Tips -->
<!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. -->
<string name="LSLTipSleepTime" translate="false">
Sleeps script for [SLEEP_TIME] seconds.
</string>
-
+
<string name="LSLTipText_llSin" translate="false">
float llSin(float theta)
Returns the sine of theta (theta in radians)
@@ -636,7 +641,7 @@ Sets the script timer to zero
float llGetAndResetTime()
Returns the script time in seconds and then resets the script timer to zero
</string>
- <string name="LSLTipText_llSound" translate="false">
+ <string name="LSLTipText_llSoplayund" translate="false">
llSound(string sound, float volume, integer queue, integer loop)
Plays sound at volume and whether it should loop or not
</string>
@@ -806,7 +811,7 @@ Preloads a sound on viewers within range
</string>
<string name="LSLTipText_llRotLookAt" translate="false">
llRotLookAt(rotation target, float strength, float damping)
-Causes object name to point its forward axis towards target
+Causes object to point its forward axis towards target
</string>
<string name="LSLTipText_llStringLength" translate="false">
integer llStringLength(string str)
@@ -1465,7 +1470,7 @@ Returns the requested permission mask for the root object the task is attached t
</string>
<string name="LSLTipText_llSetObjectPermMask" translate="false">
llSetObjectPermMask(integer mask, integer value)
-Sets the given permission mask to the new value on the root object the task is attached to
+Sets the given permission mask to the new value on the root object the task is attached to (requires God Mode)
</string>
<string name="LSLTipText_llGetInventoryPermMask" translate="false">
integer llGetInventoryPermMask(string item, integer mask)
@@ -1473,7 +1478,7 @@ Returns the requested permission mask for the inventory item
</string>
<string name="LSLTipText_llSetInventoryPermMask" translate="false">
llSetInventoryPermMask(string item, integer mask, integer value)
-Sets the given permission mask to the new value on the inventory item
+Sets the given permission mask to the new value on the inventory item (requires God Mode)
</string>
<string name="LSLTipText_llGetInventoryCreator" translate="false">
key llGetInventoryCreator(string item)
@@ -1602,11 +1607,11 @@ Sends an HTTP request to the specified url with the body of the request and para
</string>
<string name="LSLTipText_llResetLandBanList" translate="false">
llResetLandBanList()
-Removes all residents from the land ban list
+Removes all Residents from the land ban list
</string>
<string name="LSLTipText_llResetLandPassList" translate="false">
llResetLandPassList()
-Removes all residents from the land access/pass list
+Removes all Residents from the land access/pass list
</string>
<string name="LSLTipText_llGetObjectPrimCount" translate="false">
integer llGetObjectPrimCount(key object_id)
@@ -1614,7 +1619,7 @@ Returns the total number of prims for an object in the region
</string>
<string name="LSLTipText_llGetParcelPrimOwners" translate="false">
list llGetParcelPrimOwners(vector pos)
-Returns a list of all residents who own objects on the parcel at pos and with individual prim counts.
+Returns a list of all Residents who own objects on the parcel at pos and with individual prim counts.
Requires owner-like permissions for the parcel.
</string>
<string name="LSLTipText_llGetParcelPrimCount" translate="false">
@@ -1726,7 +1731,7 @@ Returns the value for header for request_id
</string>
<string name="LSLTipText_llSetPrimMediaParams" translate="false">
llSetPrimMediaParams(integer face, list params)
-Sets the media params for a particular face on an object. If media is not already on this object, add it.
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified.
The possible names are below, along with the types of values and what they mean.
</string>
@@ -1741,11 +1746,11 @@ Clears (deletes) the media and all params from the given face.
</string>
<!-- Avatar busy/away mode -->
- <string name="AvatarSetNotAway">Set Not Away</string>
- <string name="AvatarSetAway">Set Away</string>
- <string name="AvatarSetNotBusy">Set Not Busy</string>
- <string name="AvatarSetBusy">Set Busy</string>
-
+ <string name="AvatarSetNotAway">Not Away</string>
+ <string name="AvatarSetAway">Away</string>
+ <string name="AvatarSetNotBusy">Not Busy</string>
+ <string name="AvatarSetBusy">Busy</string>
+
<!-- Wearable Types -->
<string name="shape">Shape</string>
<string name="skin">Skin</string>
@@ -1763,8 +1768,9 @@ Clears (deletes) the media and all params from the given face.
<string name="alpha">Alpha</string>
<string name="tattoo">Tattoo</string>
<string name="invalid">invalid</string>
-
- <!-- notify -->
+
+ <!-- LLGroupNotify -->
+ <!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
<string name="next">Next</string>
<string name="ok">OK</string>
<string name="GroupNotifyGroupNotice">Group Notice</string>
@@ -1774,14 +1780,14 @@ Clears (deletes) the media and all params from the given face.
<string name="GroupNotifyViewPastNotices">View past notices or opt-out of receiving these messages here.</string>
<string name="GroupNotifyOpenAttachment">Open Attachment</string>
<string name="GroupNotifySaveAttachment">Save Attachment</string>
+
<string name="TeleportOffer">Teleport offering</string>
<!-- start-up toast's string-->
- <string name="StartUpNotification">%d new notification arrived while you were away...</string>
- <string name="StartUpNotifications">%d new notifications arrived while you were away...</string>
+ <string name="StartUpNotifications">New notifications arrived while you were away.</string>
<!-- overflow toast's string-->
<string name="OverflowInfoChannelString">You have %d more notification</string>
-
-
+
+
<!-- body parts -->
<string name="BodyPartsRightArm">Right Arm</string>
<string name="BodyPartsHead">Head</string>
@@ -1794,16 +1800,14 @@ Clears (deletes) the media and all params from the given face.
<string name="GraphicsQualityLow">Low</string>
<string name="GraphicsQualityMid">Mid</string>
<string name="GraphicsQualityHigh">High</string>
-
+
<!-- mouselook -->
<string name="LeaveMouselook">Press ESC to return to World View</string>
-
+
<!-- inventory -->
- <string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
- <string name="InventoryNoTexture">
- You do not have a copy of
-this texture in your inventory
- </string>
+ <string name="InventoryNoMatchingItems">No matching items found in inventory. Try [secondlife:///app/search/groups "Search"].</string>
+ <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
+ <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
@@ -1814,6 +1818,9 @@ this texture in your inventory
<string name="LoadingContents">Loading contents...</string>
<string name="NoContents">No contents</string>
<string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
+ <!-- Inventory permissions -->
+ <string name="PermYes">Yes</string>
+ <string name="PermNo">No</string>
<!-- Gestures labels -->
<!-- use value="" because they have preceding spaces -->
@@ -1825,7 +1832,7 @@ this texture in your inventory
<string name="Wave" value=" Wave " />
<string name="HelloAvatar" value=" Hello, avatar! " />
<string name="ViewAllGestures" value=" View All &gt;&gt;" />
-
+
<!-- inventory filter -->
<!-- use value="" because they have preceding spaces -->
<string name="Animations" value=" Animations," />
@@ -1873,23 +1880,24 @@ this texture in your inventory
<string name="InvFolder All">All</string>
<!-- inventory FVBridge -->
+ <!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale -->
<string name="Buy">Buy</string>
<string name="BuyforL$">Buy for L$</string>
-
+
<string name="Stone">Stone</string>
<string name="Metal">Metal</string>
<string name="Glass">Glass</string>
<string name="Wood">Wood</string>
<string name="Flesh">Flesh</string>
<string name="Plastic">Plastic</string>
- <string name="Rubber">Rubber</string>
+ <string name="Rubber">Rubber</string>
<string name="Light">Light</string>
-
+
<!-- keyboard -->
<string name="KBShift">Shift</string>
<string name="KBCtrl">Ctrl</string>
- <!-- Avatar Skeleton -->
+ <!-- Avatar Skeleton -->
<string name="Chest">Chest</string>
<string name="Skull">Skull</string>
<string name="Left Shoulder">Left Shoulder</string>
@@ -1919,7 +1927,7 @@ this texture in your inventory
<string name="L Lower Leg">L Lower Leg</string>
<string name="Stomach">Stomach</string>
<string name="Left Pec">Left Pec</string>
- <string name="Right Pec">Right Pec</string>
+ <string name="Right Pec">Right Pec</string>
<!-- Avatar age computation, see LLDateUtil::ageFromDate -->
<string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string>
@@ -1928,7 +1936,7 @@ this texture in your inventory
<string name="WeeksOld">[AGEWEEKS] old</string>
<string name="DaysOld">[AGEDAYS] old</string>
<string name="TodayOld">Joined today</string>
-
+
<!-- AgeYearsA = singular,
AgeYearsB = plural,
AgeYearsC = plural for non-English languages like Russian
@@ -1961,16 +1969,16 @@ this texture in your inventory
<string name="NoPaymentInfoOnFile">No Payment Info On File</string>
<string name="AgeVerified">Age-verified</string>
<string name="NotAgeVerified">Not Age-verified</string>
-
- <!-- HUD Position -->
- <string name="Center 2">Center 2</string>
- <string name="Top Right">Top Right</string>
- <string name="Top">Top</string>
- <string name="Top Left">Top Left</string>
- <string name="Center">Center</string>
- <string name="Bottom Left">Bottom Left</string>
- <string name="Bottom">Bottom</string>
- <string name="Bottom Right">Bottom Right</string>
+
+ <!-- HUD Position -->
+ <string name="Center 2">Center 2</string>
+ <string name="Top Right">Top Right</string>
+ <string name="Top">Top</string>
+ <string name="Top Left">Top Left</string>
+ <string name="Center">Center</string>
+ <string name="Bottom Left">Bottom Left</string>
+ <string name="Bottom">Bottom</string>
+ <string name="Bottom Right">Bottom Right</string>
<!-- compile queue-->
<string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
@@ -1992,29 +2000,30 @@ this texture in your inventory
<string name="CompileSuccessful">Compile successful!</string>
<string name="CompileSuccessfulSaving">Compile successful, saving...</string>
<string name="SaveComplete">Save complete.</string>
- <string name="ObjectOutOfRange">Script (object out of range)</string>
-
+ <string name="ObjectOutOfRange">Script (object out of range)</string>
+
<!-- god tools -->
<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
-
+
<!-- groups -->
<string name="GroupsNone">none</string>
- <string name="Group" value=" (group)" />
- <string name="Unknown">(Unknown)</string>
+ <string name="Group" value=" (group)" />
+ <string name="Unknown">(Unknown)</string>
<string name="SummaryForTheWeek" value="Summary for this week, beginning on " />
<string name="NextStipendDay" value="The next stipend day is " />
<string name="GroupIndividualShare" value=" Group Individual Share" />
<string name="Balance">Balance</string>
<string name="Credits">Credits</string>
<string name="Debits">Debits</string>
- <string name="Total">Total</string>
- <string name="NoGroupDataFound">No group data found for group </string>
-
- <!-- floater IM -->
+ <string name="Total">Total</string>
+ <string name="NoGroupDataFound">No group data found for group </string>
+
+ <!-- floater IM bonus_info: When a Linden with Admin/god status receives a new IM this displays the estate (Mainland vs. teen grid) of the source avatar.
+ This is to help Lindens when answering questions. -->
<string name="IMParentEstate">parent estate</string>
<string name="IMMainland">mainland</string>
<string name="IMTeen">teen</string>
-
+
<!-- floater region info -->
<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
<string name="RegionInfoError">error</string>
@@ -2025,53 +2034,101 @@ this texture in your inventory
<string name="RegionInfoAllEstatesYouManage">
all estates that you manage for [OWNER]
</string>
- <string name="RegionInfoAllowedResidents">Allowed residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string>
+ <string name="RegionInfoAllowedResidents">Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string>
<string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string>
+ <!-- script limits floater -->
+ <string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string>
+ <string name="ScriptLimitsParcelsOwned">Parcels Listed: [PARCELS]</string>
+ <string name="ScriptLimitsMemoryUsed">Memory used: [COUNT] kb out of [MAX] kb; [AVAILABLE] kb available</string>
+ <string name="ScriptLimitsMemoryUsedSimple">Memory used: [COUNT] kb</string>
+ <string name="ScriptLimitsParcelScriptURLs">Parcel Script URLs</string>
+ <string name="ScriptLimitsURLsUsed">URLs used: [COUNT] out of [MAX]; [AVAILABLE] available</string>
+ <string name="ScriptLimitsURLsUsedSimple">URLs used: [COUNT]</string>
+ <string name="ScriptLimitsRequestError">Error requesting information</string>
+ <string name="ScriptLimitsRequestNoParcelSelected">No Parcel Selected</string>
+ <string name="ScriptLimitsRequestWrongRegion">Error: script information is only available in your current region</string>
+ <string name="ScriptLimitsRequestWaiting">Retrieving information...</string>
+ <string name="ScriptLimitsRequestDontOwnParcel">You do not have permission to examine this parcel</string>
+
+ <string name="SITTING_ON">Sitting On</string>
+ <string name="ATTACH_CHEST">Chest</string>
+ <string name="ATTACH_HEAD">Head</string>
+ <string name="ATTACH_LSHOULDER">Left Shoulder</string>
+ <string name="ATTACH_RSHOULDER">Right Shoulder</string>
+ <string name="ATTACH_LHAND">Left Hand</string>
+ <string name="ATTACH_RHAND">Right Hand</string>
+ <string name="ATTACH_LFOOT">Left Foot</string>
+ <string name="ATTACH_RFOOT">Right Foot</string>
+ <string name="ATTACH_BACK">Back</string>
+ <string name="ATTACH_PELVIS">Pelvis</string>
+ <string name="ATTACH_MOUTH">Mouth</string>
+ <string name="ATTACH_CHIN">Chin</string>
+ <string name="ATTACH_LEAR">Left Ear</string>
+ <string name="ATTACH_REAR">Right Ear</string>
+ <string name="ATTACH_LEYE">Left Eye</string>
+ <string name="ATTACH_REYE">Right Eye</string>
+ <string name="ATTACH_NOSE">Nose</string>
+ <string name="ATTACH_RUARM">Right Upper Arm</string>
+ <string name="ATTACH_RLARM">Right Lower Arm</string>
+ <string name="ATTACH_LUARM">Left Upper Arm</string>
+ <string name="ATTACH_LLARM">Left Lower Arm</string>
+ <string name="ATTACH_RHIP">Right Hip</string>
+ <string name="ATTACH_RULEG">Right Upper Leg</string>
+ <string name="ATTACH_RLLEG">Right Lower Leg</string>
+ <string name="ATTACH_LHIP">Left Hip</string>
+ <string name="ATTACH_LULEG">Left Upper Leg</string>
+ <string name="ATTACH_LLLEG">Left Lower Leg</string>
+ <string name="ATTACH_BELLY">Belly</string>
+ <string name="ATTACH_RPEC">Right Pec</string>
+ <string name="ATTACH_LPEC">Left Pec</string>
+ <string name="ATTACH_HUD_CENTER_2">HUD Center 2</string>
+ <string name="ATTACH_HUD_TOP_RIGHT">HUD Top Right</string>
+ <string name="ATTACH_HUD_TOP_CENTER">HUD Top Center</string>
+ <string name="ATTACH_HUD_TOP_LEFT">HUD Top Left</string>
+ <string name="ATTACH_HUD_CENTER_1">HUD Center 1</string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
+ <string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
+
<!-- script editor -->
<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
-
+
<!-- panel dir browser -->
<string name="PanelDirCountFound">[COUNT] found</string>
<string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
<!-- panel dir events -->
<string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
-
+
<!-- panel contents -->
<string name="PanelContentsNewScript">New Script</string>
-
- <!-- panel avatar -->
- <!-- <string name="None">None</string> Duplicate-->
-
+
<!-- Mute -->
<string name="MuteByName">(by name)</string>
- <string name="MuteAgent">(resident)</string>
+ <string name="MuteAgent">(Resident)</string>
<string name="MuteObject">(object)</string>
<string name="MuteGroup">(group)</string>
-
+
<!-- Region/Estate Covenant -->
<string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
<string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string>
<string name="covenant_last_modified">Last Modified:</string>
<string name="none_text" value=" (none) " />
<string name="never_text" value=" (never) " />
-
+
<!--Region Details-->
<string name="GroupOwned">Group Owned</string>
<string name="Public">Public</string>
-
+
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-
- <!-- group voting dialog -->
- <string name="GroupVoteYes">Yes</string>
- <string name="GroupVoteNo">No</string>
- <string name="GroupVoteNoActiveProposals">There are currently no active proposals</string>
- <string name="GroupVoteNoArchivedProposals">There are currently no archived proposals</string>
- <string name="GroupVoteRetrievingArchivedProposals">Retrieving archived proposals</string>
- <string name="GroupVoteRetrievingActiveProposals">Retrieving active proposals</string>
+
+ <!-- panel picks -->
+ <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
+ <string name="NoAvatarPicksClassifiedsText">User has no picks or classfields</string>
+ <string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
<string name="MultiPreviewTitle">Preview</string>
@@ -2086,7 +2143,7 @@ this texture in your inventory
<string name="InvOfferGaveYou">gave you</string>
<string name="InvOfferYouDecline">You decline</string>
<string name="InvOfferFrom">from</string>
-
+
<!-- group money -->
<string name="GroupMoneyTotal">Total</string>
<string name="GroupMoneyBought">bought</string>
@@ -2098,21 +2155,25 @@ this texture in your inventory
<string name="GroupMoneyBalance">Balance</string>
<string name="GroupMoneyCredits">Credits</string>
<string name="GroupMoneyDebits">Debits</string>
-
+
<!-- viewer object -->
<string name="ViewerObjectContents">Contents</string>
-
+
<!-- Viewer menu -->
<string name="AcquiredItems">Acquired Items</string>
- <string name="Cancel">Cancel</string>
- <string name="UploadingCosts">Uploading %s costs</string>
+ <string name="Cancel">Cancel</string>
+ <string name="UploadingCosts">Uploading %s costs</string>
<string name="UnknownFileExtension">
Unknown file extension .%s
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="AddLandmarkNavBarMenu">Add Landmark...</string>
- <string name="EditLandmarkNavBarMenu">Edit Landmark...</string>
-
+ </string>
+ <string name="MuteObject2">Block</string>
+ <string name="MuteAvatar">Block</string>
+ <string name="UnmuteObject">Unblock</string>
+ <string name="UnmuteAvatar">Unblock</string>
+ <string name="AddLandmarkNavBarMenu">Add to My Landmarks...</string>
+ <string name="EditLandmarkNavBarMenu">Edit my Landmark...</string>
+
<!-- menu accelerators -->
<string name="accel-mac-control">&#8963;</string>
<string name="accel-mac-command">&#8984;</string>
@@ -2123,71 +2184,72 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">Shift+</string>
<!-- Previews -->
- <string name="FileSaved">File Saved</string>
- <string name="Receiving">Receiving</string>
-
+ <string name="FileSaved">File Saved</string>
+ <string name="Receiving">Receiving</string>
+
<!-- status bar , Time -->
- <string name="AM">AM</string>
- <string name="PM">PM</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
+ <string name="AM">AM</string>
+ <string name="PM">PM</string>
+ <string name="PST">PST</string>
+ <string name="PDT">PDT</string>
<!-- Directions, HUD -->
- <string name="Forward">Forward</string>
- <string name="Left">Left</string>
- <string name="Right">Right</string>
- <string name="Back">Back</string>
- <string name="North">North</string>
- <string name="South">South</string>
- <string name="West">West</string>
- <string name="East">East</string>
- <string name="Up">Up</string>
- <string name="Down">Down</string>
+ <string name="Forward">Forward</string>
+ <string name="Left">Left</string>
+ <string name="Right">Right</string>
+ <string name="Back">Back</string>
+ <string name="North">North</string>
+ <string name="South">South</string>
+ <string name="West">West</string>
+ <string name="East">East</string>
+ <string name="Up">Up</string>
+ <string name="Down">Down</string>
<!-- Search Category Strings -->
- <string name="Any Category">Any Category</string>
- <string name="Shopping">Shopping</string>
- <string name="Land Rental">Land Rental</string>
- <string name="Property Rental">Property Rental</string>
- <string name="Special Attraction">Special Attraction</string>
- <string name="New Products">New Products</string>
- <string name="Employment">Employment</string>
- <string name="Wanted">Wanted</string>
- <string name="Service">Service</string>
- <string name="Personal">Personal</string>
+ <string name="Any Category">Any Category</string>
+ <string name="Shopping">Shopping</string>
+ <string name="Land Rental">Land Rental</string>
+ <string name="Property Rental">Property Rental</string>
+ <string name="Special Attraction">Special Attraction</string>
+ <string name="New Products">New Products</string>
+ <string name="Employment">Employment</string>
+ <string name="Wanted">Wanted</string>
+ <string name="Service">Service</string>
+ <string name="Personal">Personal</string>
<!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="None">None</string>
- <string name="Linden Location">Linden Location</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Arts &amp; Culture</string>
- <string name="Business">Business</string>
- <string name="Educational">Educational</string>
- <string name="Gaming">Gaming</string>
- <string name="Hangout">Hangout</string>
- <string name="Newcomer Friendly">Newcomer Friendly</string>
+ <string name="None">None</string>
+ <string name="Linden Location">Linden Location</string>
+ <string name="Adult">Adult</string>
+ <string name="Arts&amp;Culture">Arts &amp; Culture</string>
+ <string name="Business">Business</string>
+ <string name="Educational">Educational</string>
+ <string name="Gaming">Gaming</string>
+ <string name="Hangout">Hangout</string>
+ <string name="Newcomer Friendly">Newcomer Friendly</string>
<string name="Parks&amp;Nature">Parks &amp; Nature</string>
- <string name="Residential">Residential</string>
+ <string name="Residential">Residential</string>
<!--<string name="Shopping">Shopping</string> -->
- <string name="Stage">Stage</string>
- <string name="Other">Other</string>
- <string name="Any">Any</string>
- <string name="You">You</string>
-
+ <string name="Stage">Stage</string>
+ <string name="Other">Other</string>
+ <string name="Any">Any</string>
+ <string name="You">You</string>
+
<!-- punctuations -->
- <string name=":">:</string>
- <string name=",">,</string>
- <string name="...">...</string>
- <string name="***">***</string>
- <string name="(">(</string>
+ <string name=":">:</string>
+ <string name=",">,</string>
+ <string name="...">...</string>
+ <string name="***">***</string>
+ <string name="(">(</string>
<string name=")">)</string>
- <string name=".">.</string>
- <string name="'">'</string>
- <string name="---">---</string>
+ <string name=".">.</string>
+ <string name="'">'</string>
+ <string name="---">---</string>
<!-- media -->
<string name="Multiple Media">Multiple Media</string>
-
+ <string name="Play Media">Play/Pause Media</string>
+
<!-- OSMessageBox messages -->
<string name="MBCmdLineError">
An error was found parsing the command line.
@@ -2213,7 +2275,7 @@ If this message persists, restart your computer.
[APP_NAME] appears to have frozen or crashed on the previous run.
Would you like to send a crash report?
</string>
- <string name="MBAlert">Alert</string>
+ <string name="MBAlert">Notification</string>
<string name="MBNoDirectX">
[APP_NAME] is unable to detect DirectX 9.0b or greater.
[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
@@ -2265,22 +2327,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Attached">Attached</string>
<string name="Attached Earlobes">Attached Earlobes</string>
-<string name="Back Bangs">Back Bangs</string>
-<string name="Back Bangs Down">Back Bangs Down</string>
-<string name="Back Bangs Up">Back Bangs Up</string>
+
<string name="Back Fringe">Back Fringe</string>
-<string name="Back Hair">Back Hair</string>
-<string name="Back Hair Down">Back Hair Down</string>
-<string name="Back Hair Up">Back Hair Up</string>
+
<string name="Baggy">Baggy</string>
<string name="Bangs">Bangs</string>
-<string name="Bangs Down">Bangs Down</string>
-<string name="Bangs Up">Bangs Up</string>
+
<string name="Beady Eyes">Beady Eyes</string>
<string name="Belly Size">Belly Size</string>
<string name="Big">Big</string>
<string name="Big Butt">Big Butt</string>
-<string name="Big Eyeball">Big Eyeball</string>
+
<string name="Big Hair Back">Big Hair: Back</string>
<string name="Big Hair Front">Big Hair: Front</string>
<string name="Big Hair Top">Big Hair: Top</string>
@@ -2299,9 +2356,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Body Thick">Body Thick</string>
<string name="Body Thickness">Body Thickness</string>
<string name="Body Thin">Body Thin</string>
-<string name="Bottom">Bottom</string>
-<string name="Bottom Left">Bottom Left</string>
-<string name="Bottom Right">Bottom Right</string>
<string name="Bow Legged">Bow Legged</string>
<string name="Breast Buoyancy">Breast Buoyancy</string>
@@ -2323,13 +2377,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="no bustle">No Bustle</string>
<string name="more bustle">More Bustle</string>
-<string name="Center">Center</string>
-<string name="Center 2">Center 2</string>
<string name="Chaplin">Chaplin</string>
<string name="Cheek Bones">Cheek Bones</string>
-<string name="Chest">Chest</string>
<string name="Chest Size">Chest Size</string>
-<string name="Chin">Chin</string>
<string name="Chin Angle">Chin Angle</string>
<string name="Chin Cleft">Chin Cleft</string>
<string name="Chin Curtains">Chin Curtains</string>
@@ -2357,20 +2407,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Corner Down">Corner Down</string>
-<string name="Corner Normal">Corner Normal</string>
+
<string name="Corner Up">Corner Up</string>
<string name="Creased">Creased</string>
<string name="Crooked Nose">Crooked Nose</string>
-<string name="Cropped Hair">Cropped Hair</string>
+
<string name="Cuff Flare">Cuff Flare</string>
<string name="Dark">Dark</string>
<string name="Dark Green">Dark Green</string>
<string name="Darker">Darker</string>
<string name="Deep">Deep</string>
<string name="Default Heels">Default Heels</string>
-<string name="Default Toe">Default Toe</string>
+
<string name="Dense">Dense</string>
-<string name="Dense hair">Dense hair</string>
+
<string name="Double Chin">Double Chin</string>
<string name="Downturned">Downturned</string>
<string name="Duffle Bag">Duffle Bag</string>
@@ -2386,7 +2436,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Eye Pop">Eye Pop</string>
<string name="Eye Size">Eye Size</string>
<string name="Eye Spacing">Eye Spacing</string>
-<string name="Eyeball Size">Eyeball Size</string>
+
<string name="Eyebrow Arc">Eyebrow Arc</string>
<string name="Eyebrow Density">Eyebrow Density</string>
@@ -2397,27 +2447,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Eyelash Length">Eyelash Length</string>
<string name="Eyeliner">Eyeliner</string>
<string name="Eyeliner Color">Eyeliner Color</string>
-<string name="Eyes Back">Eyes Back</string>
+
<string name="Eyes Bugged">Eyes Bugged</string>
-<string name="Eyes Forward">Eyes Forward</string>
-<string name="Eyes Long Head">Eyes Long Head</string>
-<string name="Eyes Shear Left Up">Eyes Shear Left Up</string>
-<string name="Eyes Shear Right Up">Eyes Shear Right Up</string>
-<string name="Eyes Short Head">Eyes Short Head</string>
-<string name="Eyes Spread">Eyes Spread</string>
-<string name="Eyes Sunken">Eyes Sunken</string>
-<string name="Eyes Together">Eyes Together</string>
+
+
+
+
+
+
+
+
<string name="Face Shear">Face Shear</string>
<string name="Facial Definition">Facial Definition</string>
<string name="Far Set Eyes">Far Set Eyes</string>
-<string name="Fat">Fat</string>
-<string name="Fat Head">Fat Head</string>
+
<string name="Fat Lips">Fat Lips</string>
-<string name="Fat Lower">Fat Lower</string>
-<string name="Fat Lower Lip">Fat Lower Lip</string>
-<string name="Fat Torso">Fat Torso</string>
-<string name="Fat Upper">Fat Upper</string>
-<string name="Fat Upper Lip">Fat Upper Lip</string>
+
<string name="Female">Female</string>
<string name="Fingerless">Fingerless</string>
<string name="Fingers">Fingers</string>
@@ -2430,12 +2475,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Forehead Angle">Forehead Angle</string>
<string name="Forehead Heavy">Forehead Heavy</string>
<string name="Freckles">Freckles</string>
-<string name="Front Bangs Down">Front Bangs Down</string>
-<string name="Front Bangs Up">Front Bangs Up</string>
+
<string name="Front Fringe">Front Fringe</string>
-<string name="Front Hair">Front Hair</string>
-<string name="Front Hair Down">Front Hair Down</string>
-<string name="Front Hair Up">Front Hair Up</string>
+
<string name="Full Back">Full Back</string>
<string name="Full Eyeliner">Full Eyeliner</string>
<string name="Full Front">Full Front</string>
@@ -2493,22 +2535,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Jowls">Jowls</string>
<string name="Knee Angle">Knee Angle</string>
<string name="Knock Kneed">Knock Kneed</string>
-<string name="L Forearm">L Forearm</string>
-<string name="L Lower Leg">L Lower Leg</string>
-<string name="L Upper Arm">L Upper Arm</string>
-<string name="L Upper Leg">L Upper Leg</string>
<string name="Large">Large</string>
<string name="Large Hands">Large Hands</string>
-<string name="Left">Left</string>
-<string name="Left Ear">Left Ear</string>
-<string name="Left Eyeball">Left Eyeball</string>
-<string name="Left Foot">Left Foot</string>
-<string name="Left Hand">Left Hand</string>
-<string name="Left Hip">Left Hip</string>
<string name="Left Part">Left Part</string>
-<string name="Left Pec">Left Pec</string>
-<string name="Left Shoulder">Left Shoulder</string>
<string name="Leg Length">Leg Length</string>
<string name="Leg Muscles">Leg Muscles</string>
<string name="Less">Less</string>
@@ -2526,7 +2556,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Less Square">Less Square</string>
<string name="Less Volume">Less Volume</string>
<string name="Less soul">Less soul</string>
-<string name="Light">Light</string>
<string name="Lighter">Lighter</string>
<string name="Lip Cleft">Lip Cleft</string>
<string name="Lip Cleft Depth">Lip Cleft Depth</string>
@@ -2547,7 +2576,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Long Ponytail">Long Ponytail</string>
<string name="Long Torso">Long Torso</string>
<string name="Long arms">Long arms</string>
-<string name="Longcuffs">Longcuffs</string>
+
<string name="Loose Pants">Loose Pants</string>
<string name="Loose Shirt">Loose Shirt</string>
@@ -2589,7 +2618,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="More soul">More soul</string>
<string name="Moustache">Moustache</string>
-<string name="Mouth">Mouth</string>
<string name="Mouth Corner">Mouth Corner</string>
<string name="Mouth Position">Mouth Position</string>
<string name="Mowhawk">Mowhawk</string>
@@ -2608,7 +2636,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="No Blush">No Blush</string>
<string name="No Eyeliner">No Eyeliner</string>
<string name="No Eyeshadow">No Eyeshadow</string>
-<string name="No Heels">No Heels</string>
+
<string name="No Lipgloss">No Lipgloss</string>
<string name="No Lipstick">No Lipstick</string>
<string name="No Part">No Part</string>
@@ -2617,10 +2645,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="No Spikes">No Spikes</string>
<string name="No White">No White</string>
<string name="No Wrinkles">No Wrinkles</string>
-<string name="None">None</string>
<string name="Normal Lower">Normal Lower</string>
<string name="Normal Upper">Normal Upper</string>
-<string name="Nose">Nose</string>
<string name="Nose Left">Nose Left</string>
<string name="Nose Right">Nose Right</string>
<string name="Nose Size">Nose Size</string>
@@ -2631,7 +2657,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Nostril Division">Nostril Division</string>
<string name="Nostril Width">Nostril Width</string>
-<string name="Old">Old</string>
+
<string name="Opaque">Opaque</string>
<string name="Open">Open</string>
<string name="Open Back">Open Back</string>
@@ -2660,7 +2686,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Part">Part</string>
<string name="Part Bangs">Part Bangs</string>
<string name="Pectorals">Pectorals</string>
-<string name="Pelvis">Pelvis</string>
<string name="Pigment">Pigment</string>
<string name="Pigtails">Pigtails</string>
<string name="Pink">Pink</string>
@@ -2669,51 +2694,39 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Platform Width">Platform Width</string>
<string name="Pointy">Pointy</string>
<string name="Pointy Heels">Pointy Heels</string>
-<string name="Pointy Toe">Pointy Toe</string>
+
<string name="Ponytail">Ponytail</string>
<string name="Poofy Skirt">Poofy Skirt</string>
<string name="Pop Left Eye">Pop Left Eye</string>
<string name="Pop Right Eye">Pop Right Eye</string>
<string name="Puffy">Puffy</string>
<string name="Puffy Eyelids">Puffy Eyelids</string>
-<string name="R Forearm">R Forearm</string>
-<string name="R Lower Leg">R Lower Leg</string>
-<string name="R Upper Arm">R Upper Arm</string>
-<string name="R Upper Leg">R Upper Leg</string>
<string name="Rainbow Color">Rainbow Color</string>
<string name="Red Hair">Red Hair</string>
-<string name="Red Skin">Red Skin</string>
+
<string name="Regular">Regular</string>
-<string name="Regular Muscles">Regular Muscles</string>
-<string name="Right">Right</string>
-<string name="Right Ear">Right Ear</string>
-<string name="Right Eyeball">Right Eyeball</string>
-<string name="Right Foot">Right Foot</string>
-<string name="Right Hand">Right Hand</string>
-<string name="Right Hip">Right Hip</string>
+
<string name="Right Part">Right Part</string>
-<string name="Right Pec">Right Pec</string>
-<string name="Right Shoulder">Right Shoulder</string>
<string name="Rosy Complexion">Rosy Complexion</string>
<string name="Round">Round</string>
-<string name="Round Forehead">Round Forehead</string>
+
<string name="Ruddiness">Ruddiness</string>
<string name="Ruddy">Ruddy</string>
<string name="Rumpled Hair">Rumpled Hair</string>
<string name="Saddle Bags">Saddle Bags</string>
-<string name="Saddlebags">Saddlebags</string>
-<string name="Scrawny">Scrawny</string>
+
+
<string name="Scrawny Leg">Scrawny Leg</string>
<string name="Separate">Separate</string>
-<string name="Shading">Shading</string>
-<string name="Shadow hair">Shadow hair</string>
+
+
<string name="Shallow">Shallow</string>
<string name="Shear Back">Shear Back</string>
<string name="Shear Face">Shear Face</string>
<string name="Shear Front">Shear Front</string>
-<string name="Shear Left">Shear Left</string>
+
<string name="Shear Left Up">Shear Left Up</string>
-<string name="Shear Right">Shear Right</string>
+
<string name="Shear Right Up">Shear Right Up</string>
<string name="Sheared Back">Sheared Back</string>
<string name="Sheared Front">Sheared Front</string>
@@ -2737,20 +2750,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Short Torso">Short Torso</string>
<string name="Short hips">Short hips</string>
<string name="Shoulders">Shoulders</string>
-<string name="Side Bangs">Side Bangs</string>
-<string name="Side Bangs Down">Side Bangs Down</string>
-<string name="Side Bangs Up">Side Bangs Up</string>
+
<string name="Side Fringe">Side Fringe</string>
<string name="Sideburns">Sideburns</string>
<string name="Sides Hair">Sides Hair</string>
<string name="Sides Hair Down">Sides Hair Down</string>
<string name="Sides Hair Up">Sides Hair Up</string>
-<string name="Skinny">Skinny</string>
+
<string name="Skinny Neck">Skinny Neck</string>
<string name="Skirt Fit">Skirt Fit</string>
<string name="Skirt Length">Skirt Length</string>
-<string name="Skull">Skull</string>
<string name="Slanted Forehead">Slanted Forehead</string>
<string name="Sleeve Length">Sleeve Length</string>
@@ -2768,34 +2778,29 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Smooth Hair">Smooth Hair</string>
<string name="Socks Length">Socks Length</string>
-<string name="Some">Some</string>
+
<string name="Soulpatch">Soulpatch</string>
<string name="Sparse">Sparse</string>
<string name="Spiked Hair">Spiked Hair</string>
-<string name="Spine">Spine</string>
<string name="Square">Square</string>
<string name="Square Toe">Square Toe</string>
<string name="Squash Head">Squash Head</string>
-<string name="Squash/Stretch Head">Squash/Stretch Head</string>
-<string name="Stomach">Stomach</string>
+
<string name="Stretch Head">Stretch Head</string>
<string name="Sunken">Sunken</string>
<string name="Sunken Chest">Sunken Chest</string>
<string name="Sunken Eyes">Sunken Eyes</string>
<string name="Sweep Back">Sweep Back</string>
<string name="Sweep Forward">Sweep Forward</string>
-<string name="Swept Back">Swept Back</string>
-<string name="Swept Back Hair">Swept Back Hair</string>
-<string name="Swept Forward">Swept Forward</string>
-<string name="Swept Forward Hair">Swept Forward Hair</string>
+
<string name="Tall">Tall</string>
<string name="Taper Back">Taper Back</string>
<string name="Taper Front">Taper Front</string>
<string name="Thick Heels">Thick Heels</string>
<string name="Thick Neck">Thick Neck</string>
<string name="Thick Toe">Thick Toe</string>
-<string name="Thickness">Thickness</string>
+
<string name="Thin">Thin</string>
<string name="Thin Eyebrows">Thin Eyebrows</string>
<string name="Thin Lips">Thin Lips</string>
@@ -2806,13 +2811,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Tight Shirt">Tight Shirt</string>
<string name="Tight Skirt">Tight Skirt</string>
<string name="Tight Sleeves">Tight Sleeves</string>
-<string name="Tilt Left">Tilt Left</string>
-<string name="Tilt Right">Tilt Right</string>
+
<string name="Toe Shape">Toe Shape</string>
<string name="Toe Thickness">Toe Thickness</string>
-<string name="Top">Top</string>
-<string name="Top Left">Top Left</string>
-<string name="Top Right">Top Right</string>
<string name="Torso Length">Torso Length</string>
<string name="Torso Muscles">Torso Muscles</string>
<string name="Torso Scrawny">Torso Scrawny</string>
@@ -2838,13 +2839,21 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Wide Lips">Wide Lips</string>
<string name="Wild">Wild</string>
<string name="Wrinkles">Wrinkles</string>
-
- <!-- Favorites Bar -->
+
+ <!-- Navigation bar location input control.
+ Strings are here because widget xml is not localizable -->
<string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
- <string name="LocationCtrlEditLandmarkTooltip">Edit My Landmark</string>
+ <string name="LocationCtrlEditLandmarkTooltip">Edit my Landmark</string>
<string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
<string name="LocationCtrlComboBtnTooltip">My location history</string>
-
+ <string name="LocationCtrlForSaleTooltip">Buy this land</string>
+ <string name="LocationCtrlVoiceTooltip">Voice not available here</string>
+ <string name="LocationCtrlFlyTooltip">Flying not allowed</string>
+ <string name="LocationCtrlPushTooltip">No pushing</string>
+ <string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string>
+ <string name="LocationCtrlScriptsTooltip">Scripts not allowed</string>
+ <string name="LocationCtrlDamageTooltip">Health</string>
+
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
[APP_NAME] Update
@@ -2883,23 +2892,37 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Unnamed">(Unnamed)</string>
<string name="IM_moderated_chat_label">(Moderated: Voices off by default)</string>
<string name="IM_unavailable_text_label">Text chat is not available for this call.</string>
+ <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string>
+ <string name="IM_default_text_label">Click here to instant message.</string>
+ <string name="IM_to_label">To</string>
+ <string name="IM_moderator_label">(Moderator)</string>
+ <!-- voice calls -->
+ <string name="started_call">Started a voice call</string>
+ <string name="joined_call">Joined the voice call</string>
<string name="ringing-im">
- Joining Voice Chat...
+ Joining voice call...
</string>
<string name="connected-im">
- Connected, click End Call to hang up
+ Connected, click Leave Call to hang up
</string>
<string name="hang_up-im">
- Left Voice Chat
+ Left voice call
</string>
<string name="answering-im">
Connecting...
</string>
+ <string name="conference-title">
+ Ad-hoc Conference
+ </string>
<string name="inventory_item_offered-im">
Inventory item offered
</string>
+ <string name="share_alert">
+ Drag items from inventory here
+ </string>
+
<string name="only_user_message">
You are the only user in this session.
@@ -2911,7 +2934,15 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Click the [BUTTON NAME] button to accept/connect to this voice chat.
</string>
<string name="muted_message">
- You have blocked this resident. Sending a message will automatically unblock them.
+ You have blocked this Resident. Sending a message will automatically unblock them.
+ </string>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3115 issue 'generic' is passed into the gIMMgr::showSessionStartError as a string name.
+ Also there are some other places where "generic" is used.
+ So, let add string with name="generic" with the same value as "generic_request_error" -->
+ <string name="generic">
+ Error making request, please try again later.
</string>
<string name="generic_request_error">
Error making request, please try again later.
@@ -2931,19 +2962,49 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="not_a_mod_error">
You are not a session moderator.
</string>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3562 issue 'muted' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="muted" with the same value as "muted_error" -->
+ <string name="muted">
+ A group moderator disabled your text chat.
+ </string>
<string name="muted_error">
A group moderator disabled your text chat.
</string>
<string name="add_session_event">
Unable to add users to chat session with [RECIPIENT].
</string>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3562 issue 'message' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="message" with the same value as "message_session_event" -->
+ <string name="message">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
<string name="message_session_event">
Unable to send your message to the chat session with [RECIPIENT].
</string>
+ <string name="mute">
+ Error while moderating.
+ </string>
+ <!--Some times string name is getting from the body of server response.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ In case of the EXT-3459 issue 'removed' is passed into the gIMMgr::showSessionStartError as a string name.
+ So, let add string with name="removed" with the same value as "removed_from_group" -->
+ <string name="removed">
+ You have been removed from the group.
+ </string>
<string name="removed_from_group">
You have been removed from the group.
</string>
<string name="close_on_no_ability">
You no longer have the ability to be in the chat session.
</string>
+ <string name="unread_chat_single">
+ [SOURCES] has said something new
+ </string>"
+ <string name="unread_chat_multiple">
+ [SOURCES] have said something new
+ </string>"
</strings>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
index dabcb1038b..102dc0c16d 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<accordion_tab
header_bg_color="DkGray2"
- header_txt_color="LtGray"
header_collapse_img="Accordion_ArrowClosed_Off"
header_collapse_img_pressed="Accordion_ArrowClosed_Press"
header_expand_img="Accordion_ArrowOpened_Off"
@@ -9,4 +8,7 @@
header_image="Accordion_Off"
header_image_over="Accordion_Over"
header_image_pressed="Accordion_Press"
+ header_image_focused="Accordion_Selected"
+ header_text_color="LtGray"
+ font="SansSerif"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
new file mode 100644
index 0000000000..a35e2c3663
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<avatar_icon default_icon_name="Generic_Person_Large">
+</avatar_icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml
new file mode 100644
index 0000000000..ed8df69bf4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<avatar_list_item
+ height="0"
+ layout="topleft"
+ left="0"
+ name="avatar_list_item"
+ top="0"
+ width="0">
+ <!-- DEFAULT styles for avatar item -->
+ <default_style
+ font="SansSerifSmall"
+ font.style="NORMAL"
+ color="DkGray"/>
+
+ <!-- styles for avatar item INVITED to voice call -->
+ <voice_call_invited_style
+ font="SansSerifSmall"
+ font.style="NORMAL"
+ color="0.5 0.5 0.5 0.5"/>
+
+ <!-- styles for avatar item JOINED to voice call -->
+ <voice_call_joined_style
+ font="SansSerifSmall"
+ font.style="NORMAL"
+ color="white"/>
+
+ <!-- styles for avatar item which HAS LEFT voice call -->
+ <voice_call_left_style
+ font="SansSerifSmall"
+ font.style="ITALIC"
+ color="LtGray_50"/>
+
+ <!-- styles for ONLINE avatar item -->
+ <online_style
+ font="SansSerifSmall"
+ font.style="NORMAL"
+ color="white"/>
+
+ <!-- styles for OFFLINE avatar item -->
+ <offline_style
+ font="SansSerifSmall"
+ font.style="NORMAL"
+ color="0.5 0.5 0.5 1.0"/>
+</avatar_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 5bb48ef5aa..c4f0fe5208 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -1,8 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Additional attributes:
+ image_pressed
+ image_pressed_selected
+ -->
<button image_unselected="PushButton_Off"
image_selected="PushButton_Selected"
image_disabled_selected="PushButton_Selected_Disabled"
image_disabled="PushButton_Disabled"
+ image_top_pad="0"
+ image_bottom_pad="0"
+ imgoverlay_label_space="1"
label_color="ButtonLabelColor"
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
@@ -11,8 +18,10 @@
image_color="ButtonImageColor"
image_color_disabled="ButtonImageColor"
flash_color="ButtonFlashBgColor"
- font="SansSerifSmall"
+ font="SansSerifSmall"
hover_glow_amount="0.15"
halign="center"
+ pad_bottom="3"
+ height="23"
scale_image="true">
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
index ea6997ebd5..ef885e8045 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
@@ -1,14 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<chat_history
- message_header="panel_chat_header.xml"
- message_separator="panel_chat_separator.xml"
- left_text_pad="10"
- right_text_pad="15"
- left_widget_pad="0"
- right_widget_pad="10"
+ message_header="panel_chat_header.xml"
+ message_separator="panel_chat_separator.xml"
+ left_text_pad="10"
+ right_text_pad="15"
+ left_widget_pad="0"
+ right_widget_pad="10"
+ top_separator_pad="1"
+ bottom_separator_pad="1"
+ top_header_pad="12"
+ bottom_header_pad="5"
max_length="2147483647"
- enabled="false"
track_bottom="true"
name="chat_history"
type="string"
- word_wrap="true" /> \ No newline at end of file
+ word_wrap="true"
+ line_spacing.multiple="1.0"
+ font="SansSerif">
+ <more_chat_text
+ mouse_opaque="true"
+ word_wrap="true"
+ />
+</chat_history> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
new file mode 100644
index 0000000000..63f08a4250
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_im_adhoc
+ height="23"
+ name="im_adhoc_chiclet"
+ show_speaker="false"
+ width="25">
+ <chiclet_im_adhoc.chiclet_button
+ height="25"
+ image_selected="PushButton_On"
+ image_unselected="PushButton_Off"
+ name="chiclet_button"
+ tab_stop="false"
+ width="25" />
+ <chiclet_im_adhoc.speaker
+ auto_update="true"
+ draw_border="false"
+ height="23"
+ left="25"
+ name="speaker"
+ visible="false"
+ width="20" />
+ <chiclet_im_adhoc.avatar_icon
+ bottom="3"
+ follows="left|top|bottom"
+ height="20"
+ left="2"
+ mouse_opaque="true"
+ name="adhoc_icon"
+ width="21" />
+ <chiclet_im_adhoc.unread_notifications
+ halign="center"
+ height="23"
+ left="25"
+ mouse_opaque="false"
+ name="unread"
+ text_color="white"
+ v_pad="3"
+ visible="false"
+ width="20" />
+ <chiclet_im_adhoc.new_message_icon
+ bottom="11"
+ height="14"
+ image_name="Unread_Chiclet"
+ left="12"
+ name="new_message_icon"
+ visible="false"
+ width="14" />
+</chiclet_im_adhoc> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
new file mode 100644
index 0000000000..372a89cbc7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_im_group
+ height="23"
+ name="im_group_chiclet"
+ show_speaker="false"
+ width="25">
+ <chiclet_im_group.chiclet_button
+ height="25"
+ image_selected="PushButton_On"
+ image_unselected="PushButton_Off"
+ name="chiclet_button"
+ tab_stop="false"
+ width="25" />
+ <chiclet_im_group.speaker
+ auto_update="true"
+ draw_border="false"
+ height="25"
+ left="25"
+ name="speaker"
+ visible="false"
+ width="20" />
+ <chiclet_im_group.group_icon
+ bottom="3"
+ default_icon="Generic_Group"
+ follows="left|top|bottom"
+ height="20"
+ left="2"
+ mouse_opaque="false"
+ name="group_icon"
+ width="21" />
+ <chiclet_im_group.unread_notifications
+ height="23"
+ halign="center"
+ left="25"
+ mouse_opaque="false"
+ name="unread"
+ text_color="white"
+ v_pad="3"
+ visible="false"
+ width="20"/>
+ <chiclet_im_group.new_message_icon
+bottom="11"
+ height="14"
+ image_name="Unread_Chiclet"
+ left="12"
+ name="new_message_icon"
+ visible="false"
+ width="14" />
+</chiclet_im_group> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
new file mode 100644
index 0000000000..99807d4717
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_im_p2p
+ height="23"
+ name="im_p2p_chiclet"
+ show_speaker="false"
+ width="25">
+ <chiclet_im_p2p.chiclet_button
+ height="25"
+ image_selected="PushButton_On"
+ image_unselected="PushButton_Off"
+ name="chiclet_button"
+ tab_stop="false"
+ width="25"/>
+ <chiclet_im_p2p.speaker
+ auto_update="true"
+ draw_border="false"
+ height="23"
+ left="25"
+ name="speaker"
+ visible="false"
+ width="20" />
+ <chiclet_im_p2p.avatar_icon
+ bottom="3"
+ follows="left|top|bottom"
+ height="20"
+ left="2"
+ mouse_opaque="false"
+ name="avatar_icon"
+ width="21" />
+ <chiclet_im_p2p.unread_notifications
+ height="23"
+ halign="center"
+ left="25"
+ mouse_opaque="false"
+ name="unread"
+ text_color="white"
+ v_pad="3"
+ visible="false"
+ width="20"/>
+ <chiclet_im_p2p.new_message_icon
+ bottom="11"
+ height="14"
+ image_name="Unread_Chiclet"
+ left="12"
+ name="new_message_icon"
+ visible="false"
+ width="14" />
+</chiclet_im_p2p>
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml
new file mode 100644
index 0000000000..4bc295f747
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_offer.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_offer
+ height="23"
+ name="offer_chiclet"
+ width="25">
+ <chiclet_offer.chiclet_button
+ height="25"
+ image_selected="PushButton_On"
+ image_unselected="PushButton_Off"
+ name="chiclet_button"
+ tab_stop="false"
+ width="25" />
+ <chiclet_offer.icon
+ bottom="3"
+ default_icon="Generic_Object_Small"
+ follows="all"
+ height="20"
+ left="2"
+ mouse_opaque="false"
+ name="chiclet_icon"
+ width="21" />
+ <chiclet_offer.new_message_icon
+ bottom="11"
+ height="14"
+ image_name="Unread_Chiclet"
+ left="12"
+ name="new_message_icon"
+ visible="false"
+ width="14" />
+</chiclet_offer> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_panel.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_panel.xml
new file mode 100644
index 0000000000..5f51f4afd9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_panel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_panel
+ name="chiclet_panel"
+ chiclet_padding="3"
+ scrolling_offset="40"
+ scroll_button_hpad="0"
+ scroll_ratio="10"
+ min_width="180"
+ /> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
new file mode 100644
index 0000000000..db6a9434df
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_script
+ height="23"
+ name="script_chiclet"
+ width="25">
+ <chiclet_script.chiclet_button
+ height="25"
+ image_selected="PushButton_On"
+ image_unselected="PushButton_Off"
+ name="chiclet_button"
+ tab_stop="false"
+ width="25"/>
+ <chiclet_script.icon
+ bottom="3"
+ follows="all"
+ height="18"
+ image_name="Generic_Object_Small"
+ left="2"
+ mouse_opaque="false"
+ name="chiclet_icon"
+ width="21"/>
+ <chiclet_script.new_message_icon
+ bottom="11"
+ height="14"
+ image_name="Unread_Chiclet"
+ left="12"
+ name="new_message_icon"
+ visible="false"
+ width="14" />
+</chiclet_script> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
index 178c890c61..dfd301a770 100644
--- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
+++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<color_swatch alpha_background_image="color_swatch_alpha.tga"
- border_color="DefaultHighlightLight"
+ border_color="ColorSwatchBorderColor"
name="color_swatch">
<color_swatch.caption_text name="caption"
- font="SansSerifSmall"
+ halign="center"
follows="left|right|bottom"/>
</color_swatch>
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index 9ed3749308..d1f68a9ef9 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -2,9 +2,9 @@
<combo_box font="SansSerifSmall"
list_position="below"
max_chars="20"
+ height="23"
follows="right|top">
<combo_box.combo_button name="Combobox Button"
- label=""
hover_glow_amount="0.15"
font="SansSerifSmall"
scale_image="false"
@@ -12,15 +12,16 @@
image_selected="ComboButton_Selected"
image_disabled="ComboButton_Disabled" />
<combo_box.drop_down_button name="Drop Down Button"
- label=""
hover_glow_amount="0.15"
font="SansSerifSmall"
scale_image="true"
pad_right="24"
image_unselected="DropDown_Off"
- image_selected="DropDown_Selected"
+ image_selected="DropDown_On"
+ image_pressed="DropDown_Press"
+ image_pressed_selected="DropDown_Press"
image_disabled="DropDown_Disabled" />
- <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
+ <combo_box.combo_list bg_writeable_color="ComboListBgColor"
background_visible="true"
/>
<!-- Text is "tentative" if you have typed in a string that does not match
diff --git a/indra/newview/skins/default/xui/en/widgets/context_menu.xml b/indra/newview/skins/default/xui/en/widgets/context_menu.xml
new file mode 100644
index 0000000000..459706c689
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/context_menu.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu visible="false"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index 319beac291..d9b6387f0d 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -2,10 +2,13 @@
<expandable_text
max_height="300" >
<textbox
- more_label="More"
- follows="left|top"
+ allow_html="true"
+ allow_scroll="true"
+ bg_visible="false"
+ more_label="More"
+ follows="left|top|right"
name="text"
- allow_scroll="true"
+ read_only="true"
use_ellipses="true"
word_wrap="true"
tab_stop="true"
@@ -16,4 +19,4 @@
name="scroll"
follows="all"
/>
-</expandable_text> \ No newline at end of file
+</expandable_text>
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index ec8395a7c5..0720621f0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<filter_editor
clear_button_visible="true"
- search_button_visible="true"
- text_pad_left="5"
+ search_button_visible="false"
+ text_pad_left="7"
select_on_focus="true"
+ text_tentative_color="TextFgTentativeColor"
background_image="TextField_Search_Off"
background_image_disabled="TextField_Search_Disabled"
background_image_focused="TextField_Search_Active">
@@ -15,6 +16,6 @@
image_unselected="Search"
image_selected="Search" />
<clear_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast" />
</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
index 888b4eaf7c..a71b293f31 100644
--- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
+++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
@@ -5,4 +5,12 @@
item_pad="0"
keep_one_selected="true"
multi_select="false"
- opaque="true" /> \ No newline at end of file
+ opaque="true">
+ <flat_list_view.no_items_text
+ follows="all"
+ name="no_items_msg"
+ v_pad="10"
+ h_pad="10"
+ value="There are no any items in the list"
+ wrap="true" />
+</flat_list_view> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 6660fbf1a8..85d0c633af 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -1,10 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- See also settings.xml UIFloater* settings for configuration -->
-<floater name="floater"
- bg_opaque_color="FloaterFocusBackgroundColor"
- bg_alpha_color="FloaterDefaultBackgroundColor"
- bg_opaque_image="Window_Foreground"
- bg_alpha_image="Window_Background"
- background_visible="true"
- background_opaque="false"
- header_height="25" />
+<floater
+ name="floater"
+ bg_opaque_color="FloaterFocusBackgroundColor"
+ bg_alpha_color="FloaterDefaultBackgroundColor"
+ bg_opaque_image="Window_Foreground"
+ bg_alpha_image="Window_Background"
+ background_visible="true"
+ background_opaque="false"
+ header_height="25"
+ close_image="Icon_Close_Foreground"
+ restore_image="Icon_Restore_Foreground"
+ minimize_image="Icon_Minimize_Foreground"
+ tear_off_image="tearoffbox.tga"
+ dock_image="Icon_Dock_Foreground"
+ help_image="Icon_Help_Foreground"
+ close_pressed_image="Icon_Close_Press"
+ restore_pressed_image="Icon_Restore_Press"
+ minimize_pressed_image="Icon_Minimize_Press"
+ tear_off_pressed_image="tearoff_pressed.tga"
+ dock_pressed_image="Icon_Dock_Press"
+ help_pressed_image="Icon_Help_Press"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
index a5043c5c14..83df10e417 100644
--- a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<flyout_button list_position="below">
+<flyout_button list_position="below" height="23">
<action_button scale_image="true"
image_selected="SegmentedBtn_Left_Selected"
image_unselected="SegmentedBtn_Left_Off"
diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
new file mode 100644
index 0000000000..e6bdcccfdf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<folder_view_item
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
deleted file mode 100644
index ab4ad94089..0000000000
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<gesture_combo_box font="SansSerifSmall"
- label="Gestures"
- list_position="below"
- max_chars="20"
- follows="right|top">
- <gesture_combo_box.combo_button name="Combobox Button"
- label=""
- hover_glow_amount="0.15"
- font="SansSerifSmall"
- scale_image="true"
- image_unselected="ComboButton_Off"
- image_selected="ComboButton_Selected"
- image_disabled="ComboButton_Disabled"
- image_disabled_selected="ComboButton_Disabled_Selected" />
- <gesture_combo_box.drop_down_button name="Drop Down Button"
- label=""
- hover_glow_amount="0.15"
- font="SansSerif"
- scale_image="true"
- pad_right="24"
- image_unselected="DropDown_Off"
- image_selected="DropDown_Selected"
- image_disabled="DropDown_Disabled"
- image_disabled_selected="DropDown_Disabled_Selected" />
- <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
- scroll_bar_bg_visible="true" />
- <gesture_combo_box.combo_editor name="Combo Text Entry"
- select_on_focus="true"
- font="SansSerifSmall" />
-</gesture_combo_box>
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml
new file mode 100644
index 0000000000..808683864d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<gesture_combo_list
+ follows="right|top">
+ <gesture_combo_list.combo_button
+ name="Combolist Button"
+ label=""
+ layout="topleft"
+ halign="center"
+ hover_glow_amount="0.15"
+ mouse_opaque="false"
+ scale_image="true"
+ image_selected="PushButton_Selected_Press"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_unselected="PushButton_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Selected_Disabled" />
+ <gesture_combo_list.combo_list
+ bg_writeable_color="MenuDefaultBgColor"
+ scroll_bar_bg_visible="false" />
+</gesture_combo_list>
diff --git a/indra/newview/skins/default/xui/en/widgets/group_icon.xml b/indra/newview/skins/default/xui/en/widgets/group_icon.xml
new file mode 100644
index 0000000000..58d5e19fcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/group_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<group_icon
+ default_icon_name="Generic_Group"
+ image_name="Generic_Group"
+ name="group_icon" />
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
new file mode 100644
index 0000000000..428b2ce03b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inspector name="inspector"
+ bg_opaque_color="DkGray_66"
+ background_visible="true"
+ bg_opaque_image="Inspector_Hover"
+ background_opaque="true"
+ bg_alpha_image="none"
+ mouse_opaque="true"
+ text_color="InspectorTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
new file mode 100644
index 0000000000..93875d66e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bg_opaque_color="InventoryBackgroundColor"
+ background_visible="true"
+ background_opaque="true"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
index 546fbd9b47..a21e3f2645 100644
--- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
@@ -8,6 +8,7 @@
ignore_tab="true"
cursor_color="TextCursorColor"
text_color="TextFgColor"
+ text_pad_left="2"
text_readonly_color="TextFgReadOnlyColor"
text_tentative_color="TextFgTentativeColor"
highlight_color="EmphasisColor"
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 f2e48c517d..1d61447e31 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -3,15 +3,15 @@
*TODO: Replace hardcoded buttons width/height with getting this info from the button images.
Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images.
-->
-
-
-
<location_input font="SansSerifSmall"
+ icon_maturity_general="Parcel_PG_Light"
+ icon_maturity_adult="Parcel_R_Light"
add_landmark_image_enabled="Favorite_Star_Active"
add_landmark_image_disabled="Favorite_Star_Off"
add_landmark_image_hover="Favorite_Star_Over"
add_landmark_image_selected="Favorite_Star_Press"
- add_landmark_hpad="2"
+ add_landmark_hpad="12"
+ icon_hpad="2"
allow_text_entry="true"
list_position="below"
show_text_as_tentative="false"
@@ -19,10 +19,14 @@
follows="left|top"
allow_new_values="true"
>
- <info_button name="Place Information"
- label=""
- width="16"
- height="16"
+ <!-- *NOTE: Tooltips are in strings.xml so they can be localized.
+ See LocationCtrlAddLandmarkTooltip etc. -->
+ <info_button
+ name="Place Information"
+ width="16"
+ height="16"
+ left="6"
+ top="20"
follows="left|top"
hover_glow_amount="0.15"
image_unselected="Info_Off"
@@ -30,7 +34,6 @@
image_disabled_selected="Info_Off"
image_disabled="Info_Off" />
<add_landmark_button name="Add Landmark"
- label=""
hover_glow_amount="0.15"
image_hover_selected="Favorite_Star_Over"
image_hover_unselected="Favorite_Star_Over"
@@ -40,16 +43,97 @@
scale_image="false"
top="19"
left="-3" />
- <combo_button name="Location History"
- label=""
- pad_right="0"/>
- <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
+ <maturity_icon
+ name="maturity_icon"
+ width="18"
+ height="16"
+ top="20"
+ follows="left|top"
+ />
+ <for_sale_button
+ name="for_sale_btn"
+ image_unselected="Parcel_ForSale_Light"
+ image_selected="Parcel_ForSale_Light"
+ width="22"
+ height="18"
+ follows="right|top"
+ scale_image="false"
+ top="21"
+ />
+ <voice_icon
+ enabled="true"
+ name="voice_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_VoiceNo_Light"
+ />
+ <fly_icon
+ name="fly_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_FlyNo_Light"
+ />
+ <push_icon
+ name="push_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_PushNo_Light"
+ />
+ <build_icon
+ name="build_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_BuildNo_Light"
+ />
+ <scripts_icon
+ name="scripts_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_ScriptsNo_Light"
+ />
+ <damage_icon
+ name="damage_icon"
+ width="14"
+ height="13"
+ top="19"
+ left="2"
+ follows="right|top"
+ image_name="Parcel_Health_Dark"
+ />
+ <!-- Default text color is invisible on top of nav bar background -->
+ <damage_text
+ name="damage_text"
+ width="35"
+ height="18"
+ top="17"
+ follows="right|top"
+ halign="right"
+ font="SansSerifSmall"
+ text_color="TextFgColor"
+ />
+ <combo_button
+ name="Location History"
+ label=""
+ pad_right="0"/>
+ <combo_list
+ bg_writeable_color="MenuDefaultBgColor"
+ page_lines="10"
scroll_bar_bg_visible="true" />
<combo_editor name="Combo Text Entry"
- text_pad_left="20"
+ text_pad_left="27"
select_on_focus="false"
font="SansSerifSmall"
bevel_style="none"
border_style="line"
- border.border_thickness="0"/>
+ border.border_thickness="0" />
</location_input>
diff --git a/indra/newview/skins/default/xui/en/widgets/menu.xml b/indra/newview/skins/default/xui/en/widgets/menu.xml
index 53034afa61..58543338f6 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu bg_color="MenuDefaultBgColor"
bg_visible="true"
- drop_shadow="false"
+ drop_shadow="true"
tear_off="false"
shortcut_pad="15">
</menu>
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
new file mode 100644
index 0000000000..563f3dc5c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Use this for the top-level menu styling -->
+<menu_item font="SansSerifSmall" />
diff --git a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml
index 98b3e2faaa..9d71ceca2f 100644
--- a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml
@@ -1,9 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<output_monitor
- image_mute="parcel_lght_VoiceNo"
+ draw_border="true"
+ follows="top|left"
+ image_mute="Parcel_VoiceNo_Light"
image_off="VoicePTT_Off"
image_on="VoicePTT_On"
image_level_1="VoicePTT_Lvl1"
image_level_2="VoicePTT_Lvl2"
image_level_3="VoicePTT_Lvl3"
+ mouse_opaque="false"
+ name="output_monitor"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 127f0f40e8..9bf99fa363 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -1,9 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Optional parameters:
+ border - show border around panel
bg_opaque_image - image name for "in-front" panel look
bg_alpha_image - image name for "in-back" or transparent panel look
-->
<panel bg_opaque_color="PanelFocusBackgroundColor"
bg_alpha_color="PanelDefaultBackgroundColor"
+ bg_opaque_image_overlay="White"
+ bg_alpha_image_overlay="White"
background_visible="false"
- background_opaque="false"/>
+ background_opaque="false"
+ chrome="false"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/radio_item.xml b/indra/newview/skins/default/xui/en/widgets/radio_item.xml
index dd848f3acd..3ddf18b2cb 100644
--- a/indra/newview/skins/default/xui/en/widgets/radio_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/radio_item.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<radio_item follows="left|top">
+<radio_item follows="left|top" font="SansSerif">
<radio_item.label_text name="Radio Item label"/>
<radio_item.check_button name="Radio control button"
image_unselected="RadioButton_Off"
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
new file mode 100644
index 0000000000..f936a1e208
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<scroll_column_header
+ image_unselected="SegmentedBtn_Middle_Selected"
+ image_selected="SegmentedBtn_Middle_Selected"
+ image_pressed="SegmentedBtn_Middle_Selected_Press"
+ image_disabled="SegmentedBtn_Middle_Disabled"
+ image_disabled_selected="SegmentedBtn_Middle_Selected_Disabled"
+ image_overlay="DisclosureArrow_Opened_Off"
+ image_overlay_alignment="right"
+ halign="left"
+ scale_image="true" />
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
index 4520768216..63166f32b7 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
@@ -15,4 +15,6 @@
background_visible="true"
heading_height="23"
draw_border="false"
- draw_heading="false" />
+ draw_heading="false"
+ border.name="dig border"
+ border.bevel_style="in" />
diff --git a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
index 56204201ef..5d429d5b5b 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
@@ -13,7 +13,8 @@
<combo_editor
name="child1"
select_on_focus="true"
- text_pad_left="28"
+ text_pad_left="30"
+ text_tentative_color="TextFgTentativeColor"
background_image="TextField_Search_Off"
background_image_disabled="TextField_Search_Disabled"
background_image_focused="TextField_Search_Active"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index f482ff3b89..a9a760b3a4 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -2,19 +2,24 @@
<search_editor
clear_button_visible="false"
search_button_visible="true"
- text_pad_left="4"
+ text_pad_left="6"
select_on_focus="true"
+ text_tentative_color="TextFgTentativeColor"
background_image="TextField_Search_Off"
background_image_disabled="TextField_Search_Disabled"
background_image_focused="TextField_Search_Active" >
- <search_button label=""
+ <search_button
top_pad="4"
left_pad="4"
width="13"
height="13"
image_unselected="Search"
image_selected="Search" />
- <clear_button label=""
+ <clear_button
+ bottom="4"
+ height="16"
image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ width="16" />
</search_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/side_tray.xml b/indra/newview/skins/default/xui/en/widgets/side_tray.xml
index 8b4a5afbe9..022564c12f 100644
--- a/indra/newview/skins/default/xui/en/widgets/side_tray.xml
+++ b/indra/newview/skins/default/xui/en/widgets/side_tray.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<side_tray tab_btn_image="TaskPanel_Tab_Off"
- tab_btn_image_selected="TaskPanel_Tab_Selected"
- tab_btn_width="32"
- tab_btn_height="40"
- tab_btn_margin="1"
- >
+ tab_btn_image_selected="TaskPanel_Tab_Selected"
+ tab_btn_width="32"
+ tab_btn_height="40"
+ tab_btn_margin="1">
</side_tray>
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index bc1ca339a2..89d5950e98 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -4,6 +4,9 @@
thumb_center_color="SliderThumbCenterColor"
thumb_image="SliderThumb_Off"
thumb_image_pressed="SliderThumb_Press"
- thumb_image_disabled="SliderThumb_Disabled"
- track_image="SliderTrack_Horiz"
- track_highlight_image="SliderTrack_Horiz" />
+ thumb_image_disabled="SliderThumb_Disabled"
+ track_image_horizontal="SliderTrack_Horiz"
+ track_image_vertical="SliderTrack_Vert"
+ track_highlight_horizontal_image="SliderTrack_Horiz"
+ track_highlight_vertical_image="SliderTrack_Vert"
+ font="SansSerif" />
diff --git a/indra/newview/skins/default/xui/en/widgets/spinner.xml b/indra/newview/skins/default/xui/en/widgets/spinner.xml
index 7d1a5118cb..d7af6077e5 100644
--- a/indra/newview/skins/default/xui/en/widgets/spinner.xml
+++ b/indra/newview/skins/default/xui/en/widgets/spinner.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<spinner text_enabled_color="LabelTextColor"
text_disabled_color="LabelDisabledColor"
+ font="SansSerifSmall"
decimal_digits="3"
label_width="40" >
<spinner.up_button name="SpinCtrl Up"
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 7d10df1af7..4a163fc1e3 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -1,24 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+label_pad_bottom - vertical padding under tab button labels
+label_pad_left - padding to the left of tab button labels
+-->
<tab_container tab_min_width="60"
tab_max_width="150"
- font_halign="left"
- tab_height="16">
+ use_custom_icon_ctrl="false"
+ halign="center"
+ font="SansSerifSmall"
+ tab_height="21"
+ label_pad_bottom="2"
+ label_pad_left="4">
<first_tab tab_top_image_unselected="TabTop_Left_Off"
tab_top_image_selected="TabTop_Left_Selected"
tab_bottom_image_unselected="Toolbar_Left_Off"
tab_bottom_image_selected="Toolbar_Left_Selected"
- tab_left_image_unselected="TabTop_Middle_Off"
- tab_left_image_selected="TabTop_Middle_Selected"/>
+ tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+ tab_left_image_selected="SegmentedBtn_Left_Off"/>
<middle_tab tab_top_image_unselected="TabTop_Middle_Off"
tab_top_image_selected="TabTop_Middle_Selected"
tab_bottom_image_unselected="Toolbar_Middle_Off"
tab_bottom_image_selected="Toolbar_Middle_Selected"
- tab_left_image_unselected="TabTop_Middle_Off"
- tab_left_image_selected="TabTop_Middle_Selected"/>
+ tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+ tab_left_image_selected="SegmentedBtn_Left_Off"/>
<last_tab tab_top_image_unselected="TabTop_Right_Off"
tab_top_image_selected="TabTop_Right_Selected"
tab_bottom_image_unselected="Toolbar_Right_Off"
tab_bottom_image_selected="Toolbar_Right_Selected"
- tab_left_image_unselected="TabTop_Middle_Off"
- tab_left_image_selected="TabTop_Middle_Selected"/>
-</tab_container> \ No newline at end of file
+ tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+ tab_left_image_selected="SegmentedBtn_Left_Off"/>
+</tab_container>
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
new file mode 100644
index 0000000000..a7e271a1ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Derives from LLUICtrl -->
+<talk_button>
+ <!-- To make speak button look green when selected set:
+ image_selected="SegmentedBtn_Left_Selected"
+ image_unselected="SegmentedBtn_Left_Off"
+ -->
+ <speak_button
+ follows="left|right"
+ image_selected="SegmentedBtn_Left_Selected_Press"
+ image_unselected="SegmentedBtn_Left_Off"
+ image_pressed="SegmentedBtn_Left_Selected_Press"
+ image_pressed_selected="SegmentedBtn_Left_Selected_Press"
+ tab_stop="false"
+ />
+ <show_button
+ follows="right"
+ name="speak_flyout_btn"
+ label=""
+ left="0"
+ top="0"
+ right="20"
+ bottom="0"
+ tab_stop="false"
+ is_toggle="true"
+ image_selected="SegmentedBtn_Right_Selected_Press"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+ image_overlay="Arrow_Small_Up"
+ />
+ <monitor
+ follows="right"
+ name="monitor"
+ left="0"
+ top="18"
+ right="18"
+ bottom="0"
+ />
+</talk_button>
diff --git a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
new file mode 100644
index 0000000000..4f574d75d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Menu items for the back button drop-down menu of locations.
+ Based on menu_item_call.xml -->
+<teleport_history_menu_item
+ back_item_font="SansSerif"
+ current_item_font="SansSerifBold"
+ forward_item_font="SansSerif"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 5dd09e663b..855584a0db 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -11,7 +11,6 @@
allow_scroll="false"
text_readonly_color="LabelDisabledColor"
bg_writeable_color="FloaterDefaultBackgroundColor"
- border_color="DefaultHighlightLight"
use_ellipses="false"
bg_visible="false"
border_visible="false"
diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
index 23ca8ea338..2ced8b1b4b 100644
--- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Core parameters are in simple_text_editor.xml -->
<text_editor
- allow_html="false"/>
+ allow_html="false"
+ show_context_menu="true"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/textbase.xml b/indra/newview/skins/default/xui/en/widgets/textbase.xml
index 6dd92ea34b..f4dc192bc3 100644
--- a/indra/newview/skins/default/xui/en/widgets/textbase.xml
+++ b/indra/newview/skins/default/xui/en/widgets/textbase.xml
@@ -1,2 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<textbase/>
+<textbase clip_partial="false"
+ font="SansSerif"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml b/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml
new file mode 100644
index 0000000000..48950a98ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu visible="false"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
new file mode 100644
index 0000000000..9ca15ae50d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<tool_tip name="tooltip"
+ max_width="200"
+ padding="4"
+ wrap="true"
+ font="SansSerif"
+ mouse_opaque="false"
+ bg_opaque_image="Tooltip"
+ background_opaque="true"
+ background_visible="true"
+ text_color="ToolTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml
new file mode 100644
index 0000000000..f4dbb8f404
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Global settings for all widgets ("UI Controls") -->
+<!-- The params in this file aren't currently getting loaded in OSX -->
+<ui_ctrl
+ />
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index 071d505569..0ba8fdad18 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -1,20 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Acerca de [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Le ofrecen Second Life Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, y otros muchos.
+<floater name="floater_about" title="ACERCA DE [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Compilado con [COMPILER], versión [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Estás en [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] en la región de [REGION], alojada en [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memoria: [MEMORY_MB] MB
+Versión del Sistema Operativo: [OS_VERSION]
+Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR]
+Tarjeta gráfica: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Versión de OpenGL: [OPENGL_VERSION]
+
+Versión de libcurl: [LIBCURL_VERSION]
+Versión de J2C Decoder: [J2C_VERSION]
+Versión de Audio Driver: [AUDIO_DRIVER_VERSION]
+Versión de Qt Webkit: [QT_WEBKIT_VERSION]
+Versión de Vivox: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (no hay)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Información" name="support_panel">
+ <button label="Copiar al portapapeles" name="copy_btn"/>
+ </panel>
+ <panel label="Créditos" name="credits_panel">
+ <text_editor name="credits_editor">
+ Le ofrecen Second Life Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, y otros muchos.
Gracias a todos estos residentes por contribuir a garantizar que esta es la mejor versión: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
Para tener éxito en los negocios, se atrevido, se el primero, se diferente. (Henry Marchant)
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licencias" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -35,10 +75,7 @@
All rights reserved. See licenses.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Está en [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index bc775c1b1c..f215348b00 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -1,7 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Acerca del terreno">
+<floater name="floaterland" title="ACERCA DEL TERRENO">
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ restantes
+ </floater.string>
<tab_container name="landtab">
- <panel label="General" name="land_general_panel">
+ <panel label="GENERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sólo usuarios nuevos
+ </panel.string>
+ <panel.string name="anyone">
+ Cualquiera
+ </panel.string>
+ <panel.string name="area_text">
+ Superficie
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID de la subasta: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Debe aprobar su compra para modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Propiedad del grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Información...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (ninguno)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venta pendiente)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No se ha seleccionado una parcela.
+Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+ </panel.string>
<text name="Name:">
Nombre:
</text>
@@ -26,7 +78,6 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="Profile..."/>
<text name="Group:">
Grupo:
</text>
@@ -47,13 +98,13 @@
<text name="For sale to">
En venta a: [BUYER]
</text>
- <text width="216" name="Sell with landowners objects in parcel.">
+ <text name="Sell with landowners objects in parcel." width="216">
Los objetos se incluyen en la venta.
</text>
- <text width="216" name="Selling with no objects in parcel.">
+ <text name="Selling with no objects in parcel." width="216">
Los objetos no se incluyen en la venta.
</text>
- <button font="SansSerifSmall" bottom="-245" left="275" width="165" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/>
+ <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale" width="165"/>
<text name="Claimed:">
Reclamada:
</text>
@@ -74,58 +125,27 @@
</text>
<button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
<button label="Comprar para el grupo..." label_selected="Comprar para el grupo..." name="Buy For Group..."/>
- <button label="Comprar un pase..." label_selected="Comprar un pase..." left="130" width="125" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno."/>
+ <button label="Comprar un pase..." label_selected="Comprar un pase..." left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
<button label="Abandonar el terreno..." label_selected="Abandonar el terreno..." name="Abandon Land..."/>
<button label="Reclamar el terreno..." label_selected="Reclamar el terreno..." name="Reclaim Land..."/>
<button label="Venta Linden..." label_selected="Venta Linden..." name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
- <panel.string name="new users only">
- Sólo usuarios nuevos
- </panel.string>
- <panel.string name="anyone">
- Cualquiera
- </panel.string>
- <panel.string name="area_text">
- Superficie
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- ID de la subasta: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Debe aprobar su compra para modificar este terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Propiedad del grupo)
- </panel.string>
- <panel.string name="profile_text">
- Perfil...
- </panel.string>
- <panel.string name="info_text">
- Información...
- </panel.string>
- <panel.string name="public_text">
- (público)
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
</panel.string>
- <panel.string name="none_text">
- (ninguno)
+ <panel.string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
</panel.string>
- <panel.string name="sale_pending_text">
- (Venta pendiente)
+ <panel.string name="can_change">
+ El terreno comprado en esta región se podrá unir o dividir.
</panel.string>
- <panel.string name="no_selection_text">
- No se ha seleccionado una parcela.
-Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+ <panel.string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir o dividir.
</panel.string>
- </panel>
- <panel label="Contrato" name="land_covenant_panel">
<text name="estate_section_lbl">
Estado:
</text>
- <text name="estate_name_lbl">
- Nombre:
- </text>
<text name="estate_name_text">
mainland
</text>
@@ -144,9 +164,6 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="region_section_lbl">
Región:
</text>
- <text name="region_name_lbl">
- Nombre:
- </text>
<text name="region_name_text">
leyla
</text>
@@ -174,121 +191,82 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="changeable_clause">
El terreno de esta región no se podrá unir/dividir.
</text>
- <panel.string name="can_resell">
- El terreno comprado en esta región se podrá revender.
- </panel.string>
- <panel.string name="can_not_resell">
- El terreno comprado en esta región no se podrá revender.
- </panel.string>
- <panel.string name="can_change">
- El terreno comprado en esta región se podrá unir o dividir.
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
</panel.string>
- <panel.string name="can_not_change">
- El terreno comprado en esta región no se podrá unir o dividir.
+ <panel.string name="objects_deleted_text">
+ [COUNT] de un máximo de [MAX] ([DELETED] se borrarán)
</panel.string>
- </panel>
- <panel label="Objetos" name="land_objects_panel">
<text name="parcel_object_bonus">
Plus de objetos en la región: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Simulador de uso de prims:
+ Uso de primitivas:
</text>
- <text name="objects_available" left="204" width="250" >
+ <text left="204" name="objects_available" width="250">
[COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
</text>
- <panel.string name="objects_available_text">
- [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] de un máximo de [MAX] ([DELETED] se borrarán)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
Prims que admite la parcela:
</text>
- <text name="object_contrib_text" left="204" width="152">
+ <text left="204" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
Prims en la parcela:
</text>
- <text name="total_objects_text" left="204" width="48">
+ <text left="204" name="total_objects_text" width="48">
[COUNT]
</text>
- <text name="Owned by parcel owner:" left="14" width="180" >
+ <text left="14" name="Owned by parcel owner:" width="180">
Del propietario de la parcela:
</text>
- <text name="owner_objects_text" left="204" width="48">
+ <text left="204" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Set to group:" left="14" width="180">
+ <button label="Devolver..." label_selected="Devolver..." name="ReturnOwner..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Set to group:" width="180">
Del grupo:
</text>
- <text name="group_objects_text" left="204" width="48">
+ <text left="204" name="group_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Owned by others:" left="14" width="128">
+ <button label="Devolver..." label_selected="Devolver..." name="ReturnGroup..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Owned by others:" width="128">
Propiedad de otros:
</text>
- <text name="other_objects_text" left="204" width="48">
+ <text left="204" name="other_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Selected / sat upon:" left="14" width="193" >
+ <button label="Devolver..." label_selected="Devolver..." name="ReturnOther..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Selected / sat upon:" width="193">
Seleccionados / con gente sentada:
</text>
- <text name="selected_objects_text" left="204" width="48">
+ <text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text name="Autoreturn" left="4" width="412" >
+ <text left="4" name="Autoreturn" width="412">
Autodevolución de objetos a otros residentes (minutos; 0 la desactiva):
</text>
- <line_editor name="clean other time" right="-20" />
+ <line_editor name="clean other time" right="-20"/>
<text name="Object Owners:" width="150">
Propietarios de los objetos:
</text>
- <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" left="158"/>
- <button label="Devolver los objetos..." label_selected="Devolver los objetos..." name="Return objects..." left="270" width="164"/>
+ <button label="Actualizar la lista" label_selected="Actualizar la lista" left="158" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Devolver los objetos..." label_selected="Devolver los objetos..." left="270" name="Return objects..." width="164"/>
<name_list name="owner list">
- <column label="Tipo" name="type"/>
- <column label="Nombre" name="name"/>
- <column label="Número" name="count"/>
- <column label="Más recientes" name="mostrecent"/>
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nombre" name="name"/>
+ <name_list.columns label="Número" name="count"/>
+ <name_list.columns label="Más recientes" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opciones" name="land_options_panel">
- <text name="allow_label">
- Permitir a otros residentes:
- </text>
- <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
- <check_box label="Crear hitos" name="check landmark"/>
- <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
- <text name="allow_label2" left="162" >
- Crear objetos:
- </text>
- <check_box label="Todos los residentes" name="edit objects check" left="255" />
- <check_box label="El grupo" name="edit group objects check" left="385" />
- <text name="allow_label3" left="162">
- Dejar objetos:
- </text>
- <check_box label="Todos los residentes" name="all object entry check" left="255"/>
- <check_box label="El grupo" name="group object entry check" left="385"/>
- <text name="allow_label4" left="162">
- Ejecutar scripts:
- </text>
- <check_box label="Todos los residentes" name="check other scripts" left="255"/>
- <check_box label="El grupo" name="check group scripts" left="385"/>
- <text name="land_options_label">
- Opciones del terreno:
- </text>
- <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
- <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
- <check_box label="Mostrar la parcela en Buscar (30 L$/semana) en" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <panel label="OPCIONES" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
Permitir que aparezca esta parcela en los resultados de la búsqueda
</panel.string>
@@ -299,62 +277,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="search_disabled_permissions_tooltip">
Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
</panel.string>
- <combo_box name="land category with adult" left="282" width="140">
- <combo_box.item name="item0" label="Cualquier categoría"
- />
- <combo_box.item name="item1" label="Localización Linden"
- />
- <combo_box.item name="item2" label="&apos;Adult&apos;"
- />
- <combo_box.item name="item3" label="Arte y Cultura"
- />
- <combo_box.item name="item4" label="Negocios"
- />
- <combo_box.item name="item5" label="Educativo"
- />
- <combo_box.item name="item6" label="Juegos de azar"
- />
- <combo_box.item name="item7" label="Entretenimiento"
- />
- <combo_box.item name="item8" label="Para recién llegados"
- />
- <combo_box.item name="item9" label="Parques y Naturaleza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Otra"
- />
- </combo_box>
- <combo_box name="land category" left="282" width="140">
- <combo_box.item name="item0" label="Cualquier categoría"
- />
- <combo_box.item name="item1" label="Localización Linden"
- />
- <combo_box.item name="item3" label="Arte y Cultura"
- />
- <combo_box.item name="item4" label="Negocios"
- />
- <combo_box.item name="item5" label="Educativo"
- />
- <combo_box.item name="item6" label="Juegos de azar"
- />
- <combo_box.item name="item7" label="Entretenimiento"
- />
- <combo_box.item name="item8" label="Para recién llegados"
- />
- <combo_box.item name="item9" label="Parques y Naturaleza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Otra"
- />
- </combo_box>
- <button label="?" label_selected="?" name="?" left="427"/>
- <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
<panel.string name="mature_check_mature">
Contenido &apos;Mature&apos;
</panel.string>
@@ -367,6 +289,71 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="mature_check_adult_tooltip">
La información o el contenido de su parcela se considera &apos;Adult&apos;.
</panel.string>
+ <panel.string name="landing_point_none">
+ (ninguno)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Sin &apos;empujones&apos;
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Sin &apos;empujones&apos; (prevalece lo marcado en la región)
+ </panel.string>
+ <text name="allow_label">
+ Permitir a otros residentes:
+ </text>
+ <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
+ <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text left="162" name="allow_label2">
+ Crear objetos:
+ </text>
+ <check_box label="Todos los residentes" left="255" name="edit objects check"/>
+ <check_box label="El grupo" left="385" name="edit group objects check"/>
+ <text left="162" name="allow_label3">
+ Dejar objetos:
+ </text>
+ <check_box label="Todos los residentes" left="255" name="all object entry check"/>
+ <check_box label="El grupo" left="385" name="group object entry check"/>
+ <text left="162" name="allow_label4">
+ Ejecutar scripts:
+ </text>
+ <check_box label="Todos los residentes" left="255" name="check other scripts"/>
+ <check_box label="El grupo" left="385" name="check group scripts"/>
+ <text name="land_options_label">
+ Opciones del terreno:
+ </text>
+ <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
+ <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
+ <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <combo_box left="282" name="land category with adult" width="140">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="&apos;Adult&apos;" name="item2"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <combo_box left="282" name="land category" width="140">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
@@ -374,61 +361,46 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (ninguno)
- </panel.string>
<button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
<button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
<text name="Teleport Routing: ">
Punto de teleporte:
</text>
<combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
- <combo_box.item name="Blocked" label="Bloqueado"
- />
- <combo_box.item name="LandingPoint" label="Punto de llegada"
- />
- <combo_box.item name="Anywhere" label="Cualquiera"
- />
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Punto de llegada" name="LandingPoint"/>
+ <combo_box.item label="Cualquiera" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Sin &apos;empujones&apos;
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Sin &apos;empujones&apos; (prevalece lo marcado en la región)
- </panel.string>
</panel>
- <panel label="Media" name="land_media_panel">
+ <panel label="MEDIA" name="land_media_panel">
<text name="with media:" width="85">
Tipo de media:
</text>
- <combo_box name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media" left="97" />
+ <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
<text name="at URL:" width="85">
- URL del media:
+ Página inicial:
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir..." label_selected="Definir..." name="set_media_url"/>
+ <text name="CurrentURL:">
+ Página actual:
+ </text>
+ <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
<text name="Description:">
Descripción:
</text>
- <line_editor name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar" left="97" />
+ <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
<text name="Media texture:">
Cambiar
la textura:
</text>
- <texture_picker label="" name="media texture" tool_tip="Pulse para elegir una imagen" left="97" />
+ <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
<text name="replace_texture_help" width="285">
(Los objetos que usen esta textura mostrarán la
película o la web cuando pulse la flecha de play.)
</text>
- <text name="Options:">
- Opciones de
-los media:
- </text>
- <check_box left="97" label="Escala automática" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
- <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
- <check_box left="97" label="Ocultar la URL del media" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
- <check_box label="Ocultar la URL de la música" name="hide_music_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL de la música"/>
- <text name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." left="102" width="120">
+ <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
+ <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
Tamaño del media:
</text>
<spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
@@ -436,58 +408,43 @@ los media:
<text name="pixels">
píxeles
</text>
- <text name="MusicURL:" bottom_delta="-28" >
- URL de la
-música:
- </text>
- <line_editor bottom_delta="-12" left="97" name="music_url"/>
- <text name="Sound:">
- Sonido:
- </text>
- <check_box left="97" label="Limitar los gestos y los sonidos de objetos a esta parcela" name="check sound local"/>
- <button label="?" label_selected="?" name="?" left="424"/>
- <text name="Voice settings:">
- Voz:
+ <text name="Options:">
+ Opciones de
+los media:
</text>
- <check_box left="97" label="Activar la voz" name="parcel_enable_voice_channel"/>
- <check_box left="97" label="Activar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box left="117" label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
</panel>
- <panel label="Acceso" name="land_access_panel">
+ <panel label="SONIDO" name="land_audio_panel">
+ <check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ </panel>
+ <panel label="ACCESO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definido por el Estado)
+ </panel.string>
+ <panel.string name="estate_override">
+ Una o más de esta opciones está configurada a nivel del estado
+ </panel.string>
<text name="Limit access to this parcel to:">
Acceso a esta parcela
</text>
- <check_box label="Permitir el acceso público" name="public_access"/>
+ <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Impedir el acceso a:
+ Restringir el acceso a residentes verificados con:
</text>
- <check_box label="Residentes que no hayan dado a Linden Lab información de su forma de pago" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/>
- <check_box label="Residentes de los que no se ha verificado si son adultos" name="limit_age_verified" tool_tip="Residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/>
- <panel.string name="estate_override">
- Una o más de esta opciones está configurada a nivel del estado
- </panel.string>
+ <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/>
+ <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Prohibir el acceso a residentes que no hayan verificado su edad. Para más información, ver [SUPPORT_SITE]."/>
<check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
<check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Cualquiera"
- />
- <combo_box.item name="Group" label="Grupo"
- />
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
</combo_box>
<spinner label="Precio en L$:" name="PriceSpin"/>
<spinner label="Horas de acceso:" name="HoursSpin"/>
- <text label="Permitir siempre" name="AllowedText">
- Residentes autorizados
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/>
- <button label="Añadir..." label_selected="Añadir..." name="add_allowed"/>
- <button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
- <text label="Prohibir el acceso" name="BanCheck">
- Residentes con el acceso prohibido
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/>
- <button label="Añadir..." label_selected="Añadir..." name="add_banned"/>
- <button label="Quitar" label_selected="Quitar" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_activeim.xml b/indra/newview/skins/default/xui/es/floater_activeim.xml
new file mode 100644
index 0000000000..988786c1ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="MI activo"/>
diff --git a/indra/newview/skins/default/xui/es/floater_animation_preview.xml b/indra/newview/skins/default/xui/es/floater_animation_preview.xml
index 5a03aa6370..39835968ae 100644
--- a/indra/newview/skins/default/xui/es/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_animation_preview.xml
@@ -1,70 +1,177 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Fallo al iniciar el movimiento
+ </floater.string>
+ <floater.string name="anim_too_long">
+ El archivo de la animación dura [LENGTH] segundos.
+
+La duración máxima de una animación es de [MAX_LENGTH] segundos.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ No se ha podido leer el archivo de la animación.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fin prematuro del archivo.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ No se puede leer la definición de la restricción.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ No se puede abrir el archivo BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ &apos;HIERARCHY header&apos; inválido.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ No se pueden encontrar &apos;ROOT&apos; o &apos;JOINT&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ No se puede obtener el nombre &apos;JOINT&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ No se puede encontrar &apos;OFFSET&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ No se puede encontrar &apos;CHANNELS&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ No se puede conseguir el orden de la rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ No se puede encontrar el eje de rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ No se puede encontrar &apos;MOTION&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ No se puede conseguir el número de frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ No se puede conseguir el tiempo del frame.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ No se pueden conseguir los valores de la posición.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ No se pueden conseguir los valores de la rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ No se puede abrir el archivo de traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ No se puede leer el encabezamiento de la traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ No se puede leer la traducción de los nombres.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ No se puede leer la traducción de los valores ignorados.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ No se puede leer el valor relativo de la traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ No se puede leer la traducción del valor &apos;outname&apos;
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ No se puede leer la matriz de traducciones.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ No se puede conseguir el nombre &apos;mergechild&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ No se puede conseguir el nombre &apos;mergeparent&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ No se puede obtener el valor prioritario.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ No se puede conseguir el valor del bucle.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ No se pueden conseguir los valores &apos;easeIn&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ No se pueden conseguir los valores &apos;easeOut&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ No se puede conseguir el valor de &apos;hand morph&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ No se puede leer el nombre del gesto.
+ </floater.string>
<text name="name_label">
Nombre:
</text>
<text name="description_label">
Descripción:
</text>
- <spinner label_width="72" width="110" label="Prioridad:" name="priority" tool_tip="Controle qué otras animaciones pueden ser anuladas por ésta."/>
- <check_box left="8" label="Bucle:" name="loop_check" tool_tip="Haga esta animación en bucle."/>
- <spinner label_width="65" left="65" width="116" label="Empieza(%)" name="loop_in_point" tool_tip="Indique el punto en el que la animación empieza el bucle."/>
- <spinner label_width="50" left="185" label="Acaba(%)" name="loop_out_point" tool_tip="Indique el punto en el que la animación acaba el bucle."/>
+ <spinner label="Prioridad:" label_width="72" name="priority" tool_tip="Controla qué otras animaciones pueden ser anuladas por ésta" width="110"/>
+ <check_box label="Bucle:" left="8" name="loop_check" tool_tip="Hace esta animación en bucle"/>
+ <spinner label="Empieza(%)" label_width="65" left="65" name="loop_in_point" tool_tip="Indica el punto en el que la animación vuelve a empezar" width="116"/>
+ <spinner label="Acaba(%)" label_width="50" left="185" name="loop_out_point" tool_tip="Indica el punto en el que la animación acaba el bucle"/>
<text name="hand_label">
Posición de las manos
</text>
- <combo_box left_delta="120" width="164" name="hand_pose_combo" tool_tip="Control de lo que hacen las manos durante la animación.">
- <combo_box.item name="Spread" label="Extendidas"/>
- <combo_box.item name="Relaxed" label="Relajadas"/>
- <combo_box.item name="PointBoth" label="Ambas señalan"/>
- <combo_box.item name="Fist" label="Puño"/>
- <combo_box.item name="RelaxedLeft" label="La izquierda relajada"/>
- <combo_box.item name="PointLeft" label="La izquierda señala"/>
- <combo_box.item name="FistLeft" label="Puño en la izquierda"/>
- <combo_box.item name="RelaxedRight" label="La derecha relajada"/>
- <combo_box.item name="PointRight" label="La derecha señala"/>
- <combo_box.item name="FistRight" label="Puño en la derecha"/>
- <combo_box.item name="SaluteRight" label="La derecha saluda"/>
- <combo_box.item name="Typing" label="Escribiendo"/>
- <combo_box.item name="PeaceRight" label="Paz en la derecha"/>
+ <combo_box left_delta="120" name="hand_pose_combo" tool_tip="Controla qué hacen las manos durante la animación" width="164">
+ <combo_box.item label="Extendidas" name="Spread"/>
+ <combo_box.item label="Relajadas" name="Relaxed"/>
+ <combo_box.item label="Ambas señalan" name="PointBoth"/>
+ <combo_box.item label="Puño" name="Fist"/>
+ <combo_box.item label="La izq. relajada" name="RelaxedLeft"/>
+ <combo_box.item label="La izq. señala" name="PointLeft"/>
+ <combo_box.item label="Puño izq." name="FistLeft"/>
+ <combo_box.item label="La der. relajada" name="RelaxedRight"/>
+ <combo_box.item label="La der. señala" name="PointRight"/>
+ <combo_box.item label="Puño der." name="FistRight"/>
+ <combo_box.item label="La derecha saluda" name="SaluteRight"/>
+ <combo_box.item label="Escribiendo" name="Typing"/>
+ <combo_box.item label="&apos;Paz&apos; en la der." name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expresión
</text>
- <combo_box left_delta="120" width="164" name="emote_combo" tool_tip="Controle qué hace la cara durante la animación.">
- <combo_box.item name="[None]" label="Nada]"/>
- <combo_box.item name="Aaaaah" label="Aaaaah"/>
- <combo_box.item name="Afraid" label="Con miedo"/>
- <combo_box.item name="Angry" label="Enfadada"/>
- <combo_box.item name="BigSmile" label="Gran sonrisa"/>
- <combo_box.item name="Bored" label="Aburrida"/>
- <combo_box.item name="Cry" label="Llorar"/>
- <combo_box.item name="Disdain" label="Desdén"/>
- <combo_box.item name="Embarrassed" label="Avergonzada"/>
- <combo_box.item name="Frown" label="Fruncir el ceño"/>
- <combo_box.item name="Kiss" label="Besar"/>
- <combo_box.item name="Laugh" label="Reír"/>
- <combo_box.item name="Plllppt" label="Sacar la lengua"/>
- <combo_box.item name="Repulsed" label="Rechazo"/>
- <combo_box.item name="Sad" label="Triste"/>
- <combo_box.item name="Shrug" label="Encogerse de hombros"/>
- <combo_box.item name="Smile" label="Sonrisa"/>
- <combo_box.item name="Surprise" label="Sorpresa"/>
- <combo_box.item name="Wink" label="Guiño"/>
- <combo_box.item name="Worry" label="Preocupación"/>
+ <combo_box left_delta="120" name="emote_combo" tool_tip="Controla qué hace la cara durante la animación" width="164">
+ <combo_box.item label="(ninguno)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Con miedo" name="Afraid"/>
+ <combo_box.item label="Enfado" name="Angry"/>
+ <combo_box.item label="Gran sonrisa" name="BigSmile"/>
+ <combo_box.item label="Aburrimiento" name="Bored"/>
+ <combo_box.item label="Llorar" name="Cry"/>
+ <combo_box.item label="Desdén" name="Disdain"/>
+ <combo_box.item label="Avergonzarse" name="Embarrassed"/>
+ <combo_box.item label="Fruncir el ceño" name="Frown"/>
+ <combo_box.item label="Beso" name="Kiss"/>
+ <combo_box.item label="Reír" name="Laugh"/>
+ <combo_box.item label="Sacar la lengua" name="Plllppt"/>
+ <combo_box.item label="Rechazo" name="Repulsed"/>
+ <combo_box.item label="Triste" name="Sad"/>
+ <combo_box.item label="Encogerse de hombros" name="Shrug"/>
+ <combo_box.item label="Sonrisa" name="Smile"/>
+ <combo_box.item label="Sorpresa" name="Surprise"/>
+ <combo_box.item label="Guiño" name="Wink"/>
+ <combo_box.item label="Preocupación" name="Worry"/>
</combo_box>
<text name="preview_label" width="250">
Vista previa mientras
</text>
- <combo_box left_delta="120" width="130" name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes.">
- <combo_box.item name="Standing" label="Estar de pie"/>
- <combo_box.item name="Walking" label="Caminar"/>
- <combo_box.item name="Sitting" label="Estar sentado"/>
- <combo_box.item name="Flying" label="Volar"/>
+ <combo_box left_delta="120" name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes." width="130">
+ <combo_box.item label="De pie" name="Standing"/>
+ <combo_box.item label="Caminando" name="Walking"/>
+ <combo_box.item label="Sentado/a" name="Sitting"/>
+ <combo_box.item label="Volando" name="Flying"/>
</combo_box>
- <spinner label_width="125" width="192" label="Combinar (sec)" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones."/>
- <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Dejar de combinar (sec)" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones."/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Mover/Pausar su animación."/>
+ <spinner label="Combinar (sec)" label_width="125" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones" width="192"/>
+ <spinner bottom_delta="-20" label="Dejar de combinar (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones" width="192"/>
+ <button bottom_delta="-32" name="play_btn" tool_tip="Ejecutar tu animación"/>
+ <button name="pause_btn" tool_tip="Pausar tu animación"/>
<button label="" name="stop_btn" tool_tip="Parar la repetición de la animación"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
@@ -73,19 +180,6 @@
Recomendamos usar archivos BVH exportados de
Poser 4.
</text>
- <button label="Cancelar" name="cancel_btn"/>
<button label="Subir ([AMOUNT] L$)" name="ok_btn"/>
- <string name="failed_to_initialize">
- Fallo al iniciar el movimiento
- </string>
- <string name="anim_too_long">
- El archivo de la animación dura [LENGTH] segundos.
-
-La duración máxima de una animación es de [MAX_LENGTH] segundos.
- </string>
- <string name="failed_file_read">
- No se ha podido leer el archivo de la animación.
-
-[STATUS]
- </string>
+ <button label="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml
index c6d89891bc..6faf19dbb5 100644
--- a/indra/newview/skins/default/xui/es/floater_auction.xml
+++ b/indra/newview/skins/default/xui/es/floater_auction.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="Empezar venta de terreno Linden">
- <check_box label="Incluir la valla amarilla de selección" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <text name="already for sale">
+<floater name="floater_auction" title="COMENZAR LA VENTA DE TERRENO LINDEN">
+ <floater.string name="already for sale">
No puede subastar parcelas que ya están en venta.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Incluir la valla amarilla de selección" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="Vender a cualquiera" label_selected="Vender a cualquiera" name="sell_to_anyone_btn"/>
+ <button label="Limpiar las configuraciones" label_selected="Limpiar las configuraciones" name="reset_parcel_btn"/>
+ <button label="Comenzar subasta" label_selected="Comenzar subasta" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
index 68a56ac678..c83dd3ef3e 100644
--- a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Elegir a un residente">
+<floater name="avatarpicker" title="ELEGIR A UN RESIDENTE">
+ <floater.string name="not_found">
+ No se ha encontrado &apos;[TEXT]&apos;
+ </floater.string>
+ <floater.string name="no_one_near">
+ No hay nadie cerca
+ </floater.string>
+ <floater.string name="no_results">
+ Sin resultados
+ </floater.string>
+ <floater.string name="searching">
+ Buscando...
+ </floater.string>
+ <string label="Elegir" label_selected="Elegir" name="Select">
+ Seleccionar
+ </string>
+ <string name="Close">
+ Cerrar
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Buscar" name="SearchPanel">
<text name="InstructSearchResidentName">
- Escriba parte del nombre del residente:
+ Escribe parte del nombre de la persona:
</text>
- <button label="Buscar" label_selected="Buscar" name="Find"/>
+ <button label="Ir" label_selected="Ir" name="Find"/>
</panel>
- <panel label="Tarjetas de visita" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Elija una tarjeta de visita:
+ <panel label="Amigos" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Elige a una persona:
</text>
</panel>
<panel label="Cercanos" name="NearMePanel">
<text name="InstructSelectResident">
- Seleccionar un
-residente cercano:
+ Elegir a alguien que esté cerca:
</text>
- <button font="SansSerifSmall" left_delta="1" width="115" label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh"/>
- <slider label="Alcance" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Alcance" name="near_me_range"/>
<text name="meters">
Metros
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Actualizar la lista" label_selected="Actualizar la lista" left_delta="1" name="Refresh" width="115"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Elegir" label_selected="Elegir" name="Select"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <string name="not_found">
- No se ha encontrado &apos;[TEXT]&apos;
- </string>
- <string name="no_one_near">
- No hay nadie cerca
- </string>
- <string name="no_results">
- Sin resultados
- </string>
- <string name="searching">
- Buscando...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
index 6344768c7f..d9ad3da633 100644
--- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
@@ -1,30 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="Texturas del avatar">
- <text name="baked_label">
- Texturas predeterminadas
- </text>
+<floater name="avatar_texture_debug" title="TEXTURAS DEL AVATAR">
+ <floater.string name="InvalidAvatar">
+ AVATAR NO VÃLIDO
+ </floater.string>
<text name="composite_label">
Texturas compuestas
</text>
- <texture_picker label="Cabeza" name="baked_head"/>
- <texture_picker label="Maquillaje" name="head_bodypaint"/>
- <texture_picker label="Pelo" name="hair"/>
<button label="Soltar" label_selected="Soltar" name="Dump"/>
- <texture_picker label="Ojos" name="baked_eyes"/>
- <texture_picker label="Ojo" name="eye_texture"/>
- <texture_picker label="Parte superior del cuerpo" name="baked_upper_body"/>
- <texture_picker label="Tatuaje de la parte superior del cuerpo" name="upper_bodypaint"/>
- <texture_picker label="Camiseta" name="undershirt"/>
- <texture_picker label="Guantes" name="gloves"/>
- <texture_picker label="Camisa" name="shirt"/>
+ <texture_picker label="Pelo" name="hair_grain"/>
+ <texture_picker label="Alfa del pelo" name="hair_alpha"/>
+ <texture_picker label="Maquillaje" name="head_bodypaint"/>
+ <texture_picker label="Alfa de la cabeza" name="head_alpha"/>
+ <texture_picker label="Tatuaje de la cabeza" name="head_tattoo"/>
+ <texture_picker label="Ojo" name="eyes_iris"/>
+ <texture_picker label="Alfa de los ojos" name="eyes_alpha"/>
+ <texture_picker label="Pintura corporal: parte superior del cuerpo" name="upper_bodypaint"/>
+ <texture_picker label="Camiseta" name="upper_undershirt"/>
+ <texture_picker label="Guantes" name="upper_gloves"/>
+ <texture_picker label="Camisa" name="upper_shirt"/>
<texture_picker label="Parte superior de la chaqueta" name="upper_jacket"/>
- <texture_picker label="Parte inferior del cuerpo" name="baked_lower_body"/>
- <texture_picker label="Tatuaje de la parte inferior del cuerpo" name="lower_bodypaint"/>
- <texture_picker label="Ropa interior" name="underpants"/>
- <texture_picker label="Calcetines" name="socks"/>
- <texture_picker label="Zapatos" name="shoes"/>
- <texture_picker label="Pantalones" name="pants"/>
- <texture_picker label="Chaqueta" name="jacket"/>
- <texture_picker label="Falda" name="baked_skirt"/>
- <texture_picker label="Falda" name="skirt_texture"/>
+ <texture_picker label="Alfa superior" name="upper_alpha"/>
+ <texture_picker label="Tatuaje superior" name="upper_tattoo"/>
+ <texture_picker label="Pintura corporal: parte inferior del cuerpo" name="lower_bodypaint"/>
+ <texture_picker label="Ropa interior" name="lower_underpants"/>
+ <texture_picker label="Calcetines" name="lower_socks"/>
+ <texture_picker label="Zapatos" name="lower_shoes"/>
+ <texture_picker label="Pantalones" name="lower_pants"/>
+ <texture_picker label="Chaqueta" name="lower_jacket"/>
+ <texture_picker label="Alfa inferior" name="lower_alpha"/>
+ <texture_picker label="Tatuaje inferior" name="lower_tattoo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml
index 9282cb04a6..b86967755c 100644
--- a/indra/newview/skins/default/xui/es/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/es/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Balizas">
+<floater name="beacons" title="BALIZAS">
<panel name="beacons_panel">
- <check_box label="Objetos con script sólo al tocarlos" name="touch_only"/>
- <check_box label="Objetos con script" name="scripted"/>
- <check_box label="Objetos materiales" name="physical"/>
- <check_box label="Fuentes de sonido" name="sounds"/>
- <check_box label="Fuentes de partículas" name="particles"/>
- <check_box label="Activar los realzados" name="highlights"/>
- <check_box label="Activar las balizas" name="beacons"/>
- <text name="beacon_width_label">
- Ancho de la baliza:
+ <text name="label_show">
+ Mostrar:
</text>
+ <check_box label="Balizas" name="beacons"/>
+ <check_box label="Realzados" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Ancho de la baliza">
+ Ancho:
+ </text>
+ <text name="label_objects">
+ Para estos objetos:
+ </text>
+ <check_box label="Materiales" name="physical"/>
+ <check_box label="Con scripts" name="scripted"/>
+ <check_box label="Sólo tocar" name="touch_only"/>
+ <check_box label="Origen de sonidos" name="sounds"/>
+ <check_box label="Origen de partículas" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml
index c3e4acacf0..de8d205ad4 100644
--- a/indra/newview/skins/default/xui/es/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_build_options.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="Opciones de la cuadrícula">
- <spinner label="Unidad de la cuadrícula (metros)" name="GridResolution" width="250" label_width="192"/>
- <spinner label="Graduación de la cuadrícula (metros)" name="GridDrawSize" width="250" label_width="192"/>
+<floater name="build options floater" title="OPCIONES DE LA CUADRÃCULA">
+ <spinner label="Unidad de la cuadrícula (metros)" label_width="192" name="GridResolution" width="250"/>
+ <spinner label="Graduación de la cuadrícula (metros)" label_width="192" name="GridDrawSize" width="250"/>
<check_box label="Activar subunidades" name="GridSubUnit"/>
<check_box label="Ver la sección transversal" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacidad de la cuadrícula">
+ Opacidad:
+ </text>
<slider label="Opacidad de la cuadrícula" name="GridOpacity" width="250"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
index 3251713074..f1948220b4 100644
--- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Cambio masivo de los permisos del contenido">
- <text name="applyto">
- Tipos de contenido
- </text>
+<floater name="floaterbulkperms" title="EDITAR LOS PERMISOS DEL CONTENIDO">
+ <floater.string name="nothing_to_modify_text">
+ Lo seleccionado tiene contenidos no editables.
+ </floater.string>
+ <floater.string name="status_text">
+ Configurando los permisos de [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Iniciando el cambio de permisos solicitado...
+ </floater.string>
+ <floater.string name="done_text">
+ Finalizado el cambio de permisos solicitado.
+ </floater.string>
<check_box label="Animación" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animaciones"/>
<check_box label="Partes del cuerpo" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Partes del cuerpo"/>
<check_box label="Ropa" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Ropa"/>
<check_box label="Gestos" name="check_gesture"/>
- <check_box label="Hitos" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestos"/>
<check_box label="Notas" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Notas"/>
<check_box label="Objetos" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objetos"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Sonidos" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sonidos"/>
<check_box label="Texturas" name="check_texture"/>
- <button label="Marcar todo" label_selected="Todo" name="check_all"/>
- <button label="Desmarcar todo" label_selected="Ninguno" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texturas"/>
+ <button label="√ Todos" label_selected="Todo" name="check_all"/>
+ <button label="Limpiar" label_selected="Ninguno" name="check_none"/>
<text name="newperms">
- Permisos nuevos
+ Permisos nuevos del contenido
+ </text>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <check_box label="Compartir con el grupo" name="share_with_group"/>
- <check_box label="Permitir a cualquiera que lo copie" name="everyone_copy"/>
+ <check_box label="Compartir" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
+ </text>
+ <check_box label="Copiarlo" name="everyone_copy"/>
<text name="NextOwnerLabel">
- El próximo propietario puede:
+ Próximo propietario:
</text>
<check_box label="Modificarlo" name="next_owner_modify"/>
<check_box label="Copiarlo" name="next_owner_copy"/>
- <check_box label="Revenderlo/Darlo" name="next_owner_transfer"/>
- <button label="Ayuda" name="help"/>
- <button label="Aplicar" name="apply"/>
- <button label="Cerrar" name="close"/>
- <string name="nothing_to_modify_text">
- Lo seleccionado tiene contenidos no editables.
- </string>
- <string name="status_text">
- Configurando los permisos de [NAME]
- </string>
- <string name="start_text">
- Iniciando el cambio de permisos solicitado...
- </string>
- <string name="done_text">
- Finalizado el cambio de permisos solicitado.
- </string>
+ <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <button label="OK" name="apply"/>
+ <button label="Cancelar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_bumps.xml b/indra/newview/skins/default/xui/es/floater_bumps.xml
index ed43e93688..6a9c6b1f22 100644
--- a/indra/newview/skins/default/xui/es/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/es/floater_bumps.xml
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="Choques, empujones, e impactos">
- <text name="none_detected">
+<floater name="floater_bumps" title="CHOQUES, EMPUJONES, E IMPACTOS">
+ <floater.string name="none_detected">
No se han detectado
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] ha chocado con usted
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] le ha empujado con un script
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto impacte con usted
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto con script impacte con usted
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto material impacte con usted
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
index 2346798f94..98604ad5f4 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="Comprar el contenido">
+<floater name="floater_buy_contents" title="COMPRAR LOS CONTENIDOS">
<text name="contains_text">
[NAME] contiene:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index a01e07e694..30c4ea965d 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -1,68 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="Comprar dinero">
- <text name="info_buying">
- Comprando dinero:
- </text>
- <text name="info_cannot_buy" left="5" right="-5">
- No puede comprar en este momento:
- </text>
- <text name="info_need_more" left="5" right="-5">
- Necesita más dinero:
- </text>
- <text name="error_message">
- Algo no va bien.
+<floater name="buy currency" title="COMPRAR L$">
+ <floater.string name="buy_currency">
+ Comprar [LINDENS] L$ por, aprox., [LOCALAMOUNT]
+ </floater.string>
+ <text left="5" name="info_need_more" right="-5">
+ Necesitas más L$
</text>
- <button label="Ir al sitio web" name="error_web"/>
<text name="contacting">
Contactando con el LindeX...
</text>
- <text name="buy_action_unknown" right="-5">
- Comprar L$ en el sistema LindeX de cambio
+ <text name="info_buying">
+ Comprar L$
</text>
- <text name="buy_action">
- [NAME] [PRICE] L$
+ <text name="balance_label">
+ Tengo
+ </text>
+ <text name="balance_amount">
+ [AMT] L$
</text>
<text name="currency_action" width="50">
- Comprar
+ Quiero comprar
</text>
- <line_editor name="currency_amt" width="65" left_delta="50">
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" left_delta="50" name="currency_amt" width="65">
1234
</line_editor>
- <text name="currency_est" width="138" left_delta="68">
- L$ por, aprox., [USD] US$
- </text>
- <text name="getting_data">
- Obteniendo los datos...
+ <text name="buying_label">
+ Al precio de
</text>
- <text name="balance_label">
- Actualmente, tiene
+ <text left_delta="68" name="currency_est" width="138">
+ aprox. [LOCALAMOUNT]
</text>
- <text name="balance_amount">
- [AMT] L$
- </text>
- <text name="buying_label">
- Está comprando
+ <text name="getting_data">
+ Calculando...
</text>
- <text name="buying_amount">
- [AMT] L$
+ <text name="buy_action">
+ [NAME] [PRICE] L$
</text>
<text name="total_label">
- Su saldo será de
+ Mi nuevo saldo será
</text>
<text name="total_amount">
[AMT] L$
</text>
+ <text name="currency_links">
+ [http://www.secondlife.com/ método de pago] | [http://www.secondlife.com/ moneda] | [http://www.secondlife.com/my/account/exchange_rates.php tipo de cambio]
+ </text>
+ <text name="exchange_rate_note">
+ Vuelve a escribir la cantidad para ver el tipo de cambio más reciente.
+ </text>
<text name="purchase_warning_repurchase" right="-10">
- Confirmando esta compra sólo compra la moneda.
-Tendrá que intentar de nuevo la operación.
+ Confirmando que con esta compra sólo se compran L$, no el objeto.
</text>
<text name="purchase_warning_notenough">
- No está comprando dinero suficiente.
-Aumente la cantidad a comprar.
+ No estás comprando suficientes L$. Por favor, aumenta la cantidad.
</text>
+ <button label="Comprar ahora" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
- <button label="Comprar" name="buy_btn"/>
- <string name="buy_currency">
- Compre [LINDENS] L$ por, aprox., [USD] US$
- </string>
+ <text left="5" name="info_cannot_buy" right="-5">
+ No se pudo hacer la compra
+ </text>
+ <button label="Ir a la web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index 7ee15955eb..9e5af72199 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Comprar terreno">
+<floater name="buy land" title="COMPRAR TERRENO">
<text name="region_name_label">
Región:
</text>
- <text name="region_name_text" left="565">
+ <text left="565" name="region_name_text">
(desconocida)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text name="region_type_text" left="565">
+ <text left="565" name="region_type_text">
(desconocido)
</text>
<text name="estate_name_label">
Estado:
</text>
- <text name="estate_name_text" left="565">
+ <text left="565" name="estate_name_text">
(desconocido)
</text>
- <text name="estate_owner_label" width="115" right="565">
+ <text name="estate_owner_label" right="565" width="115">
Propietario del estado:
</text>
- <text name="estate_owner_text" left="565" >
+ <text left="565" name="estate_owner_text">
(desconocido)
</text>
<text name="resellable_changeable_label">
@@ -58,8 +58,8 @@
</text>
<text name="info_price">
1500 L$
-(1.1 L$/m²)
-incluyendo los objetos
+(1.1/m² L$)
+se vende con los objetos
</text>
<text name="info_action">
Al comprar este terreno:
@@ -75,16 +75,16 @@ incluyendo los objetos
Sólo pueden ser propietarios de terreno los miembros premium.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9.95 US$/mes, facturados mensualmente" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="7.50 US$/mes, facturados cuatrimestralmente" />
- <combo_box.item name="US$6.00/month,billedannually" label="6.00 US$/mes, facturados anualmente" />
+ <combo_box.item label="9.95 US$/mes, facturados mensualmente" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7.50 US$/mes, facturados trimestralmente" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6.00 US$/mes, facturados anualmente" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Aumenta su cuota mensual por uso de terreno a 40 US$/mes.
</text>
<text name="land_use_reason">
- Usted posee 1309 m² de terreno.
-Esta parcela mide 512 m².
+ Tienes 1309 m² de terreno.
+Esta parcela es de 512 m².
</text>
<text name="purchase_action">
Pagar al residente Joe 4.000 L$ por el terreno
@@ -99,12 +99,12 @@ Esta parcela mide 512 m².
1.000
</line_editor>
<text name="currency_est">
- por, aprox., [AMOUNT2] US$
+ por, aprox., [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Tiene 2.100 L$.
</text>
- <check_box label="Quitar [AMOUNT] m² de la contribución del grupo." name="remove_contribution"/>
+ <check_box label="Quitar [AMOUNT] m² de las contribuciones de grupo." name="remove_contribution"/>
<button label="Comprar" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
<string name="can_resell">
@@ -181,22 +181,22 @@ Inténtelo seleccionando un área más pequeña.
Su cuenta puede poseer terreno.
</string>
<string name="land_holdings">
- Usted tiene [BUYER] m² de terreno.
+ Tienes [BUYER] m² de terreno.
</string>
<string name="pay_to_for_land">
Pagar por este terreno [AMOUNT] L$ a [SELLER]
</string>
<string name="buy_for_US">
- Comprar [AMOUNT] L$ por, aprox., [AMOUNT2] US$,
+ Comprar [AMOUNT] L$ por, aprox., [LOCAL_AMOUNT],
</string>
<string name="parcel_meters">
- Esta parcela tiene [AMOUNT] m².
+ Este terreno tiene [AMOUNT] m²
</string>
<string name="premium_land">
- Este terreno es premium, y se contará como de [AMOUNT] m².
+ Este terreno es &apos;premium&apos;, y se considerará como de [AMOUNT] m².
</string>
<string name="discounted_land">
- Este terreno tiene descuento, y se contará como de [AMOUNT] m².
+ Este terreno es &apos;discounted&apos;, y se considerará como de [AMOUNT] m².
</string>
<string name="meters_supports_object">
[AMOUNT] m²
diff --git a/indra/newview/skins/default/xui/es/floater_buy_object.xml b/indra/newview/skins/default/xui/es/floater_buy_object.xml
index 8e713f362b..117d29777f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Comprar una copia del objeto">
+<floater name="contents" title="COMPRAR UNA COPIA DEL OBJETO">
<text name="contents_text">
- y sus contenidos:
+ Contenidos:
</text>
<text name="buy_text">
¿Comprarlo por [AMOUNT] L$ a [NAME]?
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index 3aeb4e5771..40c5603706 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -10,7 +10,22 @@
Mover la cámara arriba y abajo, izquierda y derecha
</floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Mover la cámara arriba y abajo, izquierda y derecha"/>
- <joystick_zoom name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"/>
+ <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/>
+ <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado">
+ <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Desde detrás"/>
+ <button name="group_view" tool_tip="Desde tu hombro"/>
+ <button name="front_view" tool_tip="De frente"/>
+ <button name="mouselook_view" tool_tip="Vista subjetiva"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Cámara orbital"/>
+ <button label="" name="pan_btn" tool_tip="Cámara panorámica"/>
+ <button label="" name="avatarview_btn" tool_tip="Posición de tu cámara"/>
+ <button label="" name="freecamera_btn" tool_tip="Centrar el objeto"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_choose_group.xml b/indra/newview/skins/default/xui/es/floater_choose_group.xml
index 71331abb65..a5967b814e 100644
--- a/indra/newview/skins/default/xui/es/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/es/floater_choose_group.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="groups" title="Grupos">
+<floater name="groups" title="GRUPOS">
<text name="groupdesc">
Elegir un grupo:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_color_picker.xml b/indra/newview/skins/default/xui/es/floater_color_picker.xml
index 616c373d18..ed168c09d5 100644
--- a/indra/newview/skins/default/xui/es/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/es/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="Paleta de colores">
+<floater name="ColorPicker" title="SELECTOR DE COLOR">
<text name="r_val_text">
Rojo:
</text>
@@ -18,14 +18,13 @@
<text name="l_val_text">
Lumin.:
</text>
- <check_box label="Aplicar ahora mismo" name="apply_immediate"/>
+ <check_box label="Aplicarlo ahora" name="apply_immediate"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
- <button label="Elegir" label_selected="Elegir" name="select_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Color actual:
</text>
<text name="(Drag below to save.)">
- (Arrástrelo abajo
- para guardarlo)
+ (arrástralo abajo para guardarlo)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
index 1322b9a5cf..672a6fbc8b 100644
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ b/indra/newview/skins/default/xui/es/floater_customize.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Apariencia" width="527">
+<floater name="floater customize" title="APARIENCIA" width="527">
<tab_container name="customize tab container" width="525">
<placeholder label="Partes del cuerpo" name="body_parts_placeholder"/>
<panel label="Forma" name="Shape" width="389">
@@ -14,8 +14,8 @@
<button label="Torso" label_selected="Torso" name="Torso"/>
<button label="Piernas" label_selected="Piernas" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Mujer" />
- <radio_item name="radio2" label="Varón" />
+ <radio_item label="Mujer" name="radio"/>
+ <radio_item label="Varón" name="radio2"/>
</radio_group>
<text name="title">
[DESC]
@@ -43,8 +43,8 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Forma:
</text>
<button label="Crear una forma nueva" label_selected="Crear una forma nueva" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
</panel>
<panel label="Piel" name="Skin">
<button label="Color de piel" label_selected="Color de piel" name="Skin Color" width="115"/>
@@ -76,12 +76,12 @@ avatar. O parta de cero creando una nueva y vistiéndola.
<text name="Item Action Label" right="107">
Piel:
</text>
- <texture_picker width="90" label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker width="90" label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker width="90" label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen"/>
+ <texture_picker label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
+ <texture_picker label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
+ <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
<button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Pelo" name="Hair">
@@ -116,8 +116,8 @@ avatar. O parta de cero creando uno nueva y vistiéndolo.
</text>
<texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ojos" name="Eyes">
@@ -148,18 +148,18 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
</text>
<texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
- <panel label="Ropa" name="clothes_placeholder"/>
+ <placeholder label="Ropa" name="clothes_placeholder"/>
<panel label="Camisa" name="Shirt">
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -189,11 +189,11 @@ avatar. O parta de cero creando una nueva y vistiéndola.
</panel>
<panel label="Pantalones" name="Pants">
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -248,11 +248,11 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Zapatos:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Calcetines" name="Socks">
@@ -282,11 +282,11 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Calcetines:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Chaqueta" name="Jacket">
@@ -317,11 +317,11 @@ avatar. O parta de cero creando una nueva y vistiéndola.
</text>
<texture_picker label="Tela superior" name="Upper Fabric" tool_tip="Pulse para elegir una imagen"/>
<texture_picker label="Tela inferior" name="Lower Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Guantes" name="Gloves">
@@ -351,11 +351,11 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Guantes:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Camiseta" name="Undershirt">
@@ -385,11 +385,11 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Camiseta:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ropa interior" name="Underpants">
@@ -419,11 +419,11 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Ropa interior:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Falda" name="Skirt">
@@ -453,16 +453,88 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Falda:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
+ <panel label="Alfa" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: no modificable
+ </text>
+ <text name="title_loading">
+ [DESC]: cargando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: no puesto
+ </text>
+ <text name="path">
+ Situado en [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pon una capa Alfa nueva arrastrándola desde tu inventario a tu avatar.
+O crea una nueva y vístetela.
+ </text>
+ <text name="no modify instructions">
+ No tienes permiso para modificar este artículo.
+ </text>
+ <text name="Item Action Label">
+ Alfa:
+ </text>
+ <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <button label="Crear una capa Alfa nueva" label_selected="Crear una capa Alfa nueva" name="Create New"/>
+ <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Revertir" label_selected="Revertir" name="Revert"/>
+ </panel>
+ <panel label="Tatuaje" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: no modificable
+ </text>
+ <text name="title_loading">
+ [DESC]: cargando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: no puesto
+ </text>
+ <text name="path">
+ Situado en [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pon un tatuaje nuevo arrastrándolo desde tu inventario a tu avatar.
+O crea una nueva y vístetela.
+ </text>
+ <text name="no modify instructions">
+ No tienes permiso para modificar este artículo.
+ </text>
+ <text name="Item Action Label">
+ Tatuaje:
+ </text>
+ <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <button label="Crear un tatuaje nuevo" label_selected="Crear un tatuaje nuevo" name="Create New"/>
+ <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Revertir" label_selected="Revertir" name="Revert"/>
+ </panel>
</tab_container>
<scroll_container left="230" name="panel_container"/>
+ <button label="Hacer un vestuario" label_selected="Hacer un vestuario" name="make_outfit_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Hacer un vestuario..." label_selected="Hacer un vestuario..." name="Make Outfit" width="130"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
index 9ee7fc3ead..fc2b12d1e4 100644
--- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="Editor del ciclo de un día">
+<floater name="Day Cycle Floater" title="EDITOR DEL CICLO DE UN DÃA">
<tab_container name="Day Cycle Tabs">
<panel label="Ciclo de un día" name="Day Cycle">
<button label="?" name="WLDayCycleHelp"/>
diff --git a/indra/newview/skins/default/xui/es/floater_device_settings.xml b/indra/newview/skins/default/xui/es/floater_device_settings.xml
index e8989f44ef..eadf04a417 100644
--- a/indra/newview/skins/default/xui/es/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_device_settings.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="Configuración de los dispositivos del chat de voz"/>
+<floater name="floater_device_settings" title="CONFIGURACIÓN DE LOS DISPOSITIVOS DEL CHAT DE VOZ"/>
diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml
index 65710fc5ed..195690f546 100644
--- a/indra/newview/skins/default/xui/es/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_env_settings.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="Editor del entorno">
+<floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Duración de
un día
@@ -14,13 +17,12 @@ un día
Color del
agua
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Pulsa para abrir el selector de color"/>
<text name="EnvWaterFogText">
Claridad del
agua
</text>
<button bottom="-144" label="Usar el horario del estado" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Cielo avanzado" name="EnvAdvancedSkyButton" width="155" left="167" />
- <button label="Agua avanzada" name="EnvAdvancedWaterButton" width="155" left="326"/>
- <button label="?" name="EnvSettingsHelpButton"/>
+ <button label="Cielo avanzado" left="167" name="EnvAdvancedSkyButton" width="155"/>
+ <button label="Agua avanzada" left="326" name="EnvAdvancedWaterButton" width="155"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_font_test.xml b/indra/newview/skins/default/xui/es/floater_font_test.xml
index e6b8087b60..9a665321a4 100644
--- a/indra/newview/skins/default/xui/es/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/es/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Prueba de fuentes">
+<floater name="contents" title="PRUEBA DE FUENTES">
<text name="linea">
OverrideTest, debería de aparecer aquí en Times. (Desde default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_gesture.xml b/indra/newview/skins/default/xui/es/floater_gesture.xml
index e7f1a7aca2..1dc1d54295 100644
--- a/indra/newview/skins/default/xui/es/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_gesture.xml
@@ -1,15 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="Gestos disponibles">
- <text name="help_label">
- Pulse dos veces en un gesto para reproducir las animaciones
-y sonidos.
- </text>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="Botón" name="trigger"/>
- <column label="Tecla" name="shortcut"/>
- <column label="Nombre" name="name"/>
+<floater label="Lugares" name="gestures" title="GESTOS">
+ <floater.string name="loading">
+ Cargando...
+ </floater.string>
+ <floater.string name="playing">
+ (Ejecutándose)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copia de [COPY_NAME]
+ </floater.string>
+ <scroll_list bottom_delta="-385" height="360" name="gesture_list">
+ <scroll_list.columns label="Nombre" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
+ <scroll_list.columns label="Tecla" name="shortcut"/>
</scroll_list>
- <button label="Nuevo" name="new_gesture_btn"/>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Más opciones"/>
+ <button name="new_gesture_btn" tool_tip="Hacer un gesto nuevo"/>
+ <button name="activate_btn" tool_tip="Activar/Desactivar el gesto elegido"/>
+ <button name="del_btn" tool_tip="Borrar este gesto"/>
+ </panel>
<button label="Editar" name="edit_btn"/>
<button label="Reproducir" name="play_btn"/>
<button label="Parar" name="stop_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_god_tools.xml b/indra/newview/skins/default/xui/es/floater_god_tools.xml
index ea2571ecb8..78ec76e32b 100644
--- a/indra/newview/skins/default/xui/es/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_god_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="godtools floater" title="Herramientas de Dios">
+<floater name="godtools floater" title="HERRAMIENTAS DE DIOS">
<tab_container name="GodTools Tabs">
<panel label="Red" name="grid">
<button label="Expulsar a todos los usuarios"
diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
index 29750ee737..f967d697c5 100644
--- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="Configuración del hardware">
+<floater name="Hardware Settings Floater" title="CONFIGURACIÓN DEL HARDWARE">
<text name="Filtering:">
Filtrado:
</text>
@@ -8,21 +8,21 @@
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
- <combo_box.item name="FSAADisabled" label="Desactivado"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Desactivado" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (brillo; menor es más brillante, 0=predeterminado)
+ (0 = brillo por defecto, más bajo = más brillo)
</text>
<text name="Enable VBO:">
Activar VBO:
</text>
- <check_box label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caídas."/>
- <slider label_width="150" left="10" width="300" label="Memoria para texturas (MB):" name="GrapicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también puede hacer que las texturas se vean borrosas."/>
+ <check_box initial_value="true" label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caídas."/>
+ <slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/>
<spinner label="Intensidad de la niebla:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml
new file mode 100644
index 0000000000..2a26bb8453
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="BUSCADOR DE AYUDA">
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls">
+ <button label="Abrir en mi propio navegador" name="open_browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_hud.xml b/indra/newview/skins/default/xui/es/floater_hud.xml
index d31bcedf05..e458913452 100644
--- a/indra/newview/skins/default/xui/es/floater_hud.xml
+++ b/indra/newview/skins/default/xui/es/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="Tutorial"/>
+<floater name="floater_hud" title="TUTORIAL"/>
diff --git a/indra/newview/skins/default/xui/es/floater_im.xml b/indra/newview/skins/default/xui/es/floater_im.xml
index 3e92003bac..8589718b88 100644
--- a/indra/newview/skins/default/xui/es/floater_im.xml
+++ b/indra/newview/skins/default/xui/es/floater_im.xml
@@ -10,7 +10,7 @@
Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
</string>
<string name="muted_message">
- Ha ignorado a este residente. Al enviarle un mensaje, automáticamente dejará de ignorarle.
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
</string>
<string name="generic_request_error">
Error al hacer lo solicitado; por favor, inténtelo más tarde.
diff --git a/indra/newview/skins/default/xui/es/floater_im_container.xml b/indra/newview/skins/default/xui/es/floater_im_container.xml
new file mode 100644
index 0000000000..617097e9c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="Mensajes instantáneos"/>
diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml
new file mode 100644
index 0000000000..c7312e609b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Panel de control de MI" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="A" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_image_preview.xml b/indra/newview/skins/default/xui/es/floater_image_preview.xml
index 6d51a800b7..0ad91265c9 100644
--- a/indra/newview/skins/default/xui/es/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_image_preview.xml
@@ -10,17 +10,17 @@
Previsualizar la
imagen como:
</text>
- <combo_box label="Tipo de ropa" name="clothing_type_combo" left="100" width="186">
- <combo_box.item name="Image" label="Imagen" />
- <combo_box.item name="Hair" label="Pelo" />
- <combo_box.item name="FemaleHead" label="Cabeza de mujer" />
- <combo_box.item name="FemaleUpperBody" label="Mujer: parte superior del cuerpo" />
- <combo_box.item name="FemaleLowerBody" label="Mujer: parte inferior del cuerpo" />
- <combo_box.item name="MaleHead" label="Cabeza de varón" />
- <combo_box.item name="MaleUpperBody" label="Varón: parte superior del cuerpo" />
- <combo_box.item name="MaleLowerBody" label="Varón: parte inferior del cuerpo" />
- <combo_box.item name="Skirt" label="Falda" />
- <combo_box.item name="SculptedPrim" label="Prim sculpted"/>
+ <combo_box label="Tipo de ropa" left="100" name="clothing_type_combo" width="186">
+ <combo_box.item label="Imagen" name="Image"/>
+ <combo_box.item label="Pelo" name="Hair"/>
+ <combo_box.item label="Mujer: cabeza" name="FemaleHead"/>
+ <combo_box.item label="Mujer: parte superior del cuerpo" name="FemaleUpperBody"/>
+ <combo_box.item label="Mujer: parte inferior del cuerpo" name="FemaleLowerBody"/>
+ <combo_box.item label="Varón: cabeza" name="MaleHead"/>
+ <combo_box.item label="Varón: parte superior del cuerpo" name="MaleUpperBody"/>
+ <combo_box.item label="Varón: parte inferior del cuerpo" name="MaleLowerBody"/>
+ <combo_box.item label="Falda" name="Skirt"/>
+ <combo_box.item label="Prim sculpted" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Imposible leer la imagen.
diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml
new file mode 100644
index 0000000000..f499198b31
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="ESTÃ LLAMANDO ALGUIEN DESCONOCIDO">
+ <floater.string name="localchat">
+ Chat de voz
+ </floater.string>
+ <floater.string name="anonymous">
+ anónimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está llamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha entrado en un chat de voz en multiconferencia.
+ </floater.string>
+ <text name="question">
+ ¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz?
+ </text>
+ <button label="Aceptar" label_selected="Aceptar" name="Accept"/>
+ <button label="Expulsar" label_selected="Expulsar" name="Reject"/>
+ <button label="Comenzar un MI" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inspect.xml b/indra/newview/skins/default/xui/es/floater_inspect.xml
index 026081bc04..d95653ddd0 100644
--- a/indra/newview/skins/default/xui/es/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/es/floater_inspect.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="Examinar objetos" min_width="450">
+<floater min_width="450" name="inspect" title="EXAMINAR LOS OBJETOS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Seleccione un objeto de esta lista para realzarlo en el mundo">
- <column label="Nombre del objeto" name="object_name"/>
- <column label="Propietario" name="owner_name"/>
- <column label="Creador" name="creator_name"/>
- <column label="Fecha de creación" name="creation_date"/>
+ <scroll_list.columns label="Nombre del objeto" name="object_name"/>
+ <scroll_list.columns label="Propietario" name="owner_name"/>
+ <scroll_list.columns label="Creador" name="creator_name"/>
+ <scroll_list.columns label="Fecha de creación" name="creation_date"/>
</scroll_list>
- <button width="185" label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado"/>
- <button width="165" left="205" label="Ver el perfil del creador..." label_selected="" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado"/>
+ <button label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado" width="185"/>
+ <button label="Ver el perfil del creador..." label_selected="" left="205" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado" width="165"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory.xml b/indra/newview/skins/default/xui/es/floater_inventory.xml
index 7da14c0579..c2a1e4e91d 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Inventario">
- <search_editor label="Escriba aquí para buscar" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Todos los ítems" name="All Items"/>
- <inventory_panel label="Ãtems recientes" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Archivo" name="File">
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Nueva ventana" name="New Window"/>
- <menu_item_call label="Ver los filtros" name="Show Filters"/>
- <menu_item_call label="Restablecer los filtros" name="Reset Current"/>
- <menu_item_call label="Cerrar todas las carpetas" name="Close All Folders"/>
- <menu_item_call label="Vaciar la papelera" name="Empty Trash"/>
- </menu>
- <menu label="Crear" name="Create">
- <menu_item_call label="Carpeta nueva" name="New Folder"/>
- <menu_item_call label="Script nuevo" name="New Script"/>
- <menu_item_call label="Nota nueva" name="New Note"/>
- <menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Falda nueva" name="New Shirt"/>
- <menu_item_call label="Pantalones nuevos" name="New Pants"/>
- <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
- <menu_item_call label="Calcetines nuevos" name="New Socks"/>
- <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
- <menu_item_call label="Falda nueva" name="New Skirt"/>
- <menu_item_call label="Guantes nuevos" name="New Gloves"/>
- <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
- <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Forma nueva" name="New Shape"/>
- <menu_item_call label="Piel nueva" name="New Skin"/>
- <menu_item_call label="Pelo nuevo" name="New Hair"/>
- <menu_item_call label="Ojos nuevos" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordenar" name="Sort">
- <menu_item_check label="Por el nombre" name="By Name"/>
- <menu_item_check label="Por la fecha" name="By Date"/>
- <menu_item_check label="Las carpetas, siempre por la fecha" name="Folders Always By Name"/>
- <menu_item_check label="Las carpetas del sistema, arriba" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="INVENTARIO">
+ <floater.string name="Title">
+ Inventario
+ </floater.string>
+ <floater.string name="TitleFetching">
+ Inventario (obtenidos [ITEM_COUNT] ítems...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ Inventario ([ITEM_COUNT] ítems) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Obtenido
+ </floater.string>
+ <panel label="Panel del inventario" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
index 4df3ca2cf6..5746688962 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="Propiedades del ítem del inventario">
+<floater name="item properties" title="PROPIEDADES DEL ÃTEM DEL INVENTARIO">
+ <floater.string name="unknown">
+ (desconocido)
+ </floater.string>
+ <floater.string name="public">
+ (público)
+ </floater.string>
+ <floater.string name="you_can">
+ Usted puede:
+ </floater.string>
+ <floater.string name="owner_can">
+ El propietario puede:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nombre:
</text>
@@ -27,55 +42,32 @@
May Mié 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Usted puede:
- </text>
- <check_box label="Modificarlo" name="CheckOwnerModify"/>
- <check_box left_delta="88" label="Copiarlo" name="CheckOwnerCopy"/>
- <check_box label="Venderlo/darlo" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- O:
+ Tú:
</text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Editar" name="CheckOwnerModify"/>
+ <check_box label="Copiarlo" left_delta="88" name="CheckOwnerCopy"/>
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
</text>
- <text name="EveryoneMaskDebug">
- E:
+ <check_box label="Copiar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Compartir con el grupo" name="CheckShareWithGroup"/>
- <check_box label="Permitir a cualquiera que lo copie" name="CheckEveryoneCopy"/>
+ <check_box label="Compartir" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- El próximo propietario puede:
- </text>
- <check_box label="Modificarlo" name="CheckNextOwnerModify"/>
- <check_box left_delta="88" label="Copiarlo" name="CheckNextOwnerCopy"/>
- <check_box label="Revenderlo/darlo" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Marcar ítem como:
+ Próximo propietario:
</text>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
+ <check_box label="Copiarlo" left_delta="88" name="CheckNextOwnerCopy"/>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="En venta" name="CheckPurchase"/>
- <radio_group name="RadioSaleType" left_delta="88" >
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Copia" />
- </radio_group>
- <text name="TextPrice">
- Precio: L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (desconocido)
- </string>
- <string name="public">
- (público)
- </string>
- <string name="you_can">
- Usted puede:
- </string>
- <string name="owner_can">
- El propietario puede:
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
index 7cd787bfb5..0cbee11bfb 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="ítems_recientes_del_inventario">
+<floater name="Inventory Finder" title="ÃTEMS_RECIENTES_DEL_INVENTARIO">
<check_box label="Animaciones" name="check_animation"/>
<check_box label="Tarjetas de visita" name="check_calling_card"/>
<check_box label="Ropa" name="check_clothing"/>
diff --git a/indra/newview/skins/default/xui/es/floater_joystick.xml b/indra/newview/skins/default/xui/es/floater_joystick.xml
index 2e0fb87744..283a46b60b 100644
--- a/indra/newview/skins/default/xui/es/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/es/floater_joystick.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Configuración del joystick">
- <check_box name="enable_joystick" label="Activar el joystick:"/>
+<floater name="Joystick" title="CONFIGURACIÓN DEL JOYSTICK">
+ <check_box label="Activar el joystick:" name="enable_joystick"/>
<text left="140" name="joystick_type" width="360"/>
- <spinner label="Mapping: eje X" name="JoystickAxis1" label_width="118" width="161"/>
- <spinner label="Mapping: eje Y" name="JoystickAxis2" label_width="105" width="148"/>
- <spinner label="Mapping: eje Z" name="JoystickAxis0" label_width="95" width="138"/>
- <spinner label="Mapping: arriba/abajo" name="JoystickAxis4" label_width="118" width="161"/>
- <spinner label="Mapping: izq./der." name="JoystickAxis5" label_width="105" width="148"/>
- <spinner label="Mapping: giro" name="JoystickAxis3" label_width="95" width="138"/>
- <spinner label="Mapping: zoom" name="JoystickAxis6" label_width="118" width="161"/>
+ <spinner label="Mapping: eje X" label_width="118" name="JoystickAxis1" width="161"/>
+ <spinner label="Mapping: eje Y" label_width="105" name="JoystickAxis2" width="148"/>
+ <spinner label="Mapping: eje Z" label_width="95" name="JoystickAxis0" width="138"/>
+ <spinner label="Mapping: arriba/abajo" label_width="118" name="JoystickAxis4" width="161"/>
+ <spinner label="Mapping: izq./der." label_width="105" name="JoystickAxis5" width="148"/>
+ <spinner label="Mapping: giro" label_width="95" name="JoystickAxis3" width="138"/>
+ <spinner label="Mapping: zoom" label_width="118" name="JoystickAxis6" width="161"/>
<check_box label="Zoom directo" name="ZoomDirect"/>
<check_box label="Cursor 3D" name="Cursor3D"/>
<check_box label="Nivel automático" name="AutoLeveling"/>
<text name="Control Modes:">
Modos de control:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" left="192" label="Construir"/>
- <check_box name="JoystickFlycamEnabled" label="Flycam"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala: X
</text>
@@ -27,7 +27,7 @@
<text name="ZScale">
Escala: Z
</text>
- <text name="PitchScale" left="3" width="115">
+ <text left="3" name="PitchScale" width="115">
Escala: arriba/abajo
</text>
<text name="YawScale">
@@ -45,10 +45,10 @@
<text name="ZDeadZone">
Zona muerta Z
</text>
- <text name="PitchDeadZone" left="3" width="115">
+ <text left="3" name="PitchDeadZone" width="115">
Zona muerta arri./aba.
</text>
- <text name="YawDeadZone" left="3" width="115">
+ <text left="3" name="YawDeadZone" width="115">
Zona muerta izq./der.
</text>
<text name="RollDeadZone">
@@ -63,9 +63,9 @@
<text name="ZoomDeadZone">
Zona muerta zoom
</text>
- <button label="Predeterminados del SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall" left="330" width="210"/>
- <button label="OK" label_selected="OK" name="ok_btn" left="330"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn" left_delta="120"/>
+ <button font="SansSerifSmall" label="Predeterminados del SpaceNavigator" left="330" name="SpaceNavigatorDefaults" width="210"/>
+ <button label="OK" label_selected="OK" left="330" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" left_delta="120" name="cancel_btn"/>
<stat_view label="Monitor del joystick" name="axis_view">
<stat_bar label="Eje 0" name="axis0"/>
<stat_bar label="Eje 1" name="axis1"/>
diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
index 1af0bb065c..227689a194 100644
--- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
@@ -1,155 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Medidor del lag">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
- <text name="client">
- Cliente:
- </text>
- <text name="client_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="client_lag_cause" right="-10" />
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
- <text name="network">
- Red:
- </text>
- <text name="network_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="network_lag_cause" right="-10" />
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
- <text name="server">
- Servidor:
- </text>
- <text name="server_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="server_lag_cause" right="-32" />
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="MEDIDOR DEL LAG">
+ <floater.string name="max_title_msg">
Medidor del lag
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Cliente
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, ventana en segundo plano
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Posible causa: distancia de dibujo fijada muy alta
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Posible causa: imágenes cargándose
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Posible causa: demasiadas imágenes en la memoria
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Posible causa: demasiados objetos complejos en la escena
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Red
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Quizá una mala conexión o un ancho de banda fijado demasiado alto.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Quizá una mala conexión o una aplicación de archivos compartidos.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Servidor
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Posible causa: demasiados objetos físicos
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Posible causa: demasiados objetos con script
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Posible causa: demasiado tráfico en la red
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Posible causa: demasiada gente moviéndose en la región
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Posible causa: demasiados cálculos de imáganes
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Posible causa: carga del simulador muy pesada
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
+ <text name="client">
+ Cliente
+ </text>
+ <text font="SansSerifSmall" name="client_text">
+ Normal
+ </text>
+ <text left="30" name="client_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
+ <text name="network">
+ Red
+ </text>
+ <text font="SansSerifSmall" name="network_text">
+ Normal
+ </text>
+ <text left="30" name="network_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
+ <text name="server">
+ Servidor
+ </text>
+ <text font="SansSerifSmall" name="server_text">
+ Normal
+ </text>
+ <text left="30" name="server_lag_cause" right="-32"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Cambia el tamaño de la ventana"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_land_holdings.xml b/indra/newview/skins/default/xui/es/floater_land_holdings.xml
index 5df319905d..36a02b7300 100644
--- a/indra/newview/skins/default/xui/es/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/es/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Mi terreno">
+<floater name="land holdings floater" title="MI TERRENO">
<scroll_list name="parcel list">
- <column label="Nombre de la parcela" name="name"/>
+ <column label="Parcela" name="name"/>
<column label="Región" name="location"/>
<column label="Tipo" name="type"/>
<column label="Superficie" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportar al centro de este terreno."/>
- <button width="130" label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo."/>
+ <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo" width="130"/>
<text name="contrib_label">
Contribuciones a sus grupos:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
index 226c3482af..a1ec0eba4d 100644
--- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="Script: script nuevo">
- <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/>
- <check_box label="Ejecutándose" name="running" left="4"/>
- <check_box label="Mono" name="mono" left="106"/>
- <string name="not_allowed">
- No está autorizado para ver este script.
- </string>
- <string name="script_running">
+<floater name="script ed float" title="SCRIPT: SCRIPT NUEVO">
+ <floater.string name="not_allowed">
+ No puedes ver ni editar este script. Ha sido configurado como &quot;no copiable&quot;. Necesitas todos los permisos para ver o editar un script que está dentro de un objeto.
+ </floater.string>
+ <floater.string name="script_running">
Ejecutándose
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
+ <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/>
+ <check_box initial_value="true" label="Ejecutándose" left="4" name="running"/>
+ <check_box initial_value="true" label="Mono" left="106" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
index 859a2d3812..d4a6e52f9f 100644
--- a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="Wiki de LSL">
+<floater name="script ed float" title="WIKI DE LSL">
<check_box label="Seguir al cursor" name="lock_check"/>
- <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/>
- <button label="Atrás" name="back_btn" left_delta="75"/>
+ <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/>
+ <button label="Atrás" left_delta="75" name="back_btn"/>
<button label="Adelante" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml
index 79c8980c02..cdc7ae49ff 100644
--- a/indra/newview/skins/default/xui/es/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Navegador">
+<floater name="floater_about" title="NAVEGADOR">
+ <floater.string name="home_page_url">
+ http://es.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://es.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Atrás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/es/floater_media_settings.xml b/indra/newview/skins/default/xui/es/floater_media_settings.xml
new file mode 100644
index 0000000000..3f7cef5785
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="CONFIGURACIÓN DE LOS MEDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
index a2791d6432..da8ba780bc 100644
--- a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Prueba de la fuga de memoria">
+<floater name="MemLeak" title="SIMULAR UNA PÉRDIDA DE MEMORIA">
<spinner label="Velocidad de la fuga (bites por fotograma):" name="leak_speed"/>
<spinner label="Fuga de memoria máx. (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml
index a61cebbf80..00a7a3fd6b 100644
--- a/indra/newview/skins/default/xui/es/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/es/floater_moveview.xml
@@ -1,13 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izquierda"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la derecha"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Saltar o ascender"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Agacharse o descender"/>
- <joystick_slide name="slide left btn" tool_tip="Ir hacia la izquierda"/>
- <joystick_slide name="slide right btn" tool_tip="Ir hacia la derecha"/>
- <joystick_turn name="forward btn" tool_tip="Ir hacia adelante"/>
- <joystick_turn name="backward btn" tool_tip="Ir hacia atrás"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Caminar hacia adelante (cursor arriba o W)
+ </string>
+ <string name="walk_back_tooltip">
+ Caminar de espaldas (cursor abajo o S)
+ </string>
+ <string name="run_forward_tooltip">
+ Correr hacia adelante (cursor arriba o W)
+ </string>
+ <string name="run_back_tooltip">
+ Correr de espaldas (cursor abajo o S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Volar hacia adelante (cursor arriba o W)
+ </string>
+ <string name="fly_back_tooltip">
+ Volar hacia atrás (cursor abajo o S)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Volar subiendo, pulsa &quot;E&quot;"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Volar bajando, pulsa &quot;C&quot;"/>
+ <joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/>
+ <joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/>
+ <button label="" name="mode_run_btn" tool_tip="Modo de correr"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modo de volar"/>
+ <button label="Dejar de volar" name="stop_fly_btn" tool_tip="Dejar de volar"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_mute_object.xml b/indra/newview/skins/default/xui/es/floater_mute_object.xml
index 0cf38c09ee..4cd16a59ed 100644
--- a/indra/newview/skins/default/xui/es/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_mute_object.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="Ignorar un objeto según su nombre">
- <text name="message" bottom_delta="-40">
- Ignorar según el nombre sólo afecta al chat y los MI del
-objeto, no a sus sonidos.
-Debe escribir exactamente el nombre del objeto.
+<floater name="mute by name" title="IGNORAR OBJETOS SEGÚN SU NOMBRE">
+ <text bottom_delta="-40" name="message">
+ Ignorar un objeto:
</text>
- <line_editor name="object_name" bottom_delta="-58">
+ <line_editor bottom_delta="-58" name="object_name">
Nombre del objeto
</line_editor>
+ <text name="note">
+ * Sólo se ignoran los textos del objeto, no sus sonidos
+ </text>
<button label="OK" name="OK"/>
<button label="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_my_friends.xml b/indra/newview/skins/default/xui/es/floater_my_friends.xml
index d555eed305..07f362560b 100644
--- a/indra/newview/skins/default/xui/es/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/es/floater_my_friends.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_my_friends" title="Contactos">
+<floater name="floater_my_friends" title="CONTACTOS">
<tab_container name="friends_and_groups">
<panel label="Amigos" name="friends_panel"/>
<panel label="Grupos" name="groups_panel"/>
diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
new file mode 100644
index 0000000000..d30a39f725
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT"/>
diff --git a/indra/newview/skins/default/xui/es/floater_openobject.xml b/indra/newview/skins/default/xui/es/floater_openobject.xml
index 60487b829c..b8b688df60 100644
--- a/indra/newview/skins/default/xui/es/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/es/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="Contenido del objeto">
+<floater name="objectcontents" title="CONTENIDOS DEL OBJETO">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_outgoing_call.xml b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
new file mode 100644
index 0000000000..51ff71dd17
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="LLAMANDO">
+ <floater.string name="localchat">
+ Chat de voz
+ </floater.string>
+ <floater.string name="anonymous">
+ anónimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está llamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha entrado en un chat de voz en multiconferencia.
+ </floater.string>
+ <text name="connecting">
+ Conectando con [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Llamando a [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Sin respuesta. Vuelve a intentarlo más tarde.
+ </text>
+ <text name="leaving">
+ Saliendo de [CURRENT_CHAT].
+ </text>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml
index 64156d94e3..d4a4e81310 100644
--- a/indra/newview/skins/default/xui/es/floater_pay.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay.xml
@@ -1,22 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
+ <string name="payee_group">
+ Pagar al grupo
+ </string>
+ <string name="payee_resident">
+ Pagar al residente
+ </string>
+ <text left="5" name="payee_label" width="105">
+ Pagar:
+ </text>
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="115" name="payee_name">
+ [FIRST] [LAST]
+ </text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
- <text name="payee_label" left="5" width="105">
- Pagar al residente:
- </text>
- <text name="payee_name" left="115">
- [FIRST] [LAST]
- </text>
- <text name="fastpay text" width="100" halign="left">
- Pago rápido:
- </text>
- <text name="amount text" left="4" >
- Cantidad:
+ <text left="4" name="amount text">
+ O elige cuánto:
</text>
<line_editor left="60" name="amount" width="55"/>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay_object.xml b/indra/newview/skins/default/xui/es/floater_pay_object.xml
index b5eca53bfa..2af8c8cc13 100644
--- a/indra/newview/skins/default/xui/es/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay_object.xml
@@ -1,30 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" left="5" width="110">
- Pagar al grupo:
- </text>
- <text name="payee_resident" left="5" width="110">
- Pagar al residente:
- </text>
- <text name="payee_name" left="120" width="180">
+ <string left="5" name="payee_group" width="110">
+ Pagar al grupo
+ </string>
+ <string left="5" name="payee_resident" width="110">
+ Pagar al residente
+ </string>
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="120" name="payee_name" width="180">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="110">
+ <text left="5" name="object_name_label" width="110">
A través del objeto:
</text>
- <text name="object_name_text" left="120" width="180">
+ <icon name="icon_object" tool_tip="Objetos"/>
+ <text left="120" name="object_name_text" width="180">
...
</text>
- <text name="fastpay text">
- Pago rápido:
- </text>
- <text name="amount text">
- Cantidad:
- </text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+ <text name="amount text">
+ O elige cuánto:
+ </text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
index 4a3977be3d..93e2088aba 100644
--- a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Permisos de subida por defecto">
+<floater name="perm prefs" title="PERMISOS POR DEFECTO DE SUBIDA">
<panel label="Permisos" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Compartir con el grupo" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/es/floater_post_process.xml b/indra/newview/skins/default/xui/es/floater_post_process.xml
index acac2b2bf9..5c62ccde36 100644
--- a/indra/newview/skins/default/xui/es/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/es/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="Configuración del procesamiento">
+<floater name="Post-Process Floater" title="CONFIGURACIÓN DEL PROCESAMIENTO">
<tab_container name="Post-Process Tabs">
<panel label="Color del filtro" name="wmiColorFilterPanel">
<check_box label="Activar" name="wmiColorFilterToggle"/>
diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml
index 6a9811c058..df94486c0e 100644
--- a/indra/newview/skins/default/xui/es/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/es/floater_postcard.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="Foto por correo electrónico">
+<floater name="Postcard" title="FOTO POR CORREO">
<text name="to_label">
Correo electrónico
del destinatario:
</text>
- <line_editor bottom_delta="-20" name="to_form" />
- <text name="from_label" bottom_delta="-12">
+ <line_editor bottom_delta="-20" name="to_form"/>
+ <text bottom_delta="-12" name="from_label">
Su correo
electrónico:
</text>
- <line_editor bottom_delta="-20" name="from_form" />
+ <line_editor bottom_delta="-20" name="from_form"/>
<text name="name_label">
Su nombre:
</text>
@@ -17,20 +17,20 @@
Asunto:
</text>
<line_editor label="Escriba aquí el asunto." name="subject_form"/>
- <text name="msg_label" bottom_delta="-18">
+ <text bottom_delta="-18" name="msg_label">
Mensaje:
</text>
<text_editor name="msg_form">
Escriba aquí el mensaje.
</text_editor>
- <text name="fine_print" bottom_delta="-21">
+ <text bottom_delta="-21" name="fine_print">
Si su destinatario se registra en [SECOND_LIFE],
usted conseguirá un bono de referido.
</text>
<button label="Cancelar" name="cancel_btn"/>
<button label="Enviar" name="send_btn"/>
<string name="default_subject">
- Postal desde [SECOND_LIFE]
+ Postal desde [SECOND_LIFE].
</string>
<string name="default_message">
¡Mira esto!
diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml
index df7fc93dd9..8f71fdd035 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="Preferencias" min_width="350" width="646">
+<floater min_width="350" name="Preferences" title="PREFERENCIAS" width="646">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
- <button label="Acerca de..." label_selected="Acerca de..." name="About..." />
- <button label="Ayuda" label_selected="Ayuda" name="Help"/>
- <tab_container name="pref core" tab_width="146" width="646" />
+ <tab_container name="pref core" tab_width="146" width="646">
+ <panel label="General" name="general"/>
+ <panel label="Gráficos" name="display"/>
+ <panel label="Privacidad" name="im"/>
+ <panel label="Sonido" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Notificaciones" name="msgs"/>
+ <panel label="Configurar" name="input"/>
+ <panel label="Avanzado" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
index 0d9cf8ec9f..c10648db73 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animación: [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
- <button left="12" width="142" label="Ejecutarla en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás."/>
- <button left="156" width="136" label="Ejecutarla para usted" label_selected="Parar" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea usted."/>
+ <button label="Ejecutarla en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/>
+ <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
index f2fa38ead8..d9c9c51ba8 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="Información clasificada"/>
+<floater name="classified_preview" title="INFORMACIÓN DEL CLASIFICADO">
+ <floater.string name="Title">
+ Clasificado: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml
index 7f727b0502..7edd4f9e3f 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_event.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="Información de eventos"/>
+<floater name="event_preview" title="INFORMACIÓN DEL EVENTO">
+ <floater.string name="Title">
+ Evento: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index 0e43ce536c..febcd9d485 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -1,14 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animación a ejecutar:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sonido a ejecutar:
+ </floater.string>
+ <floater.string name="step_chat">
+ Decir en el chat:
+ </floater.string>
+ <floater.string name="step_wait">
+ Espera:
+ </floater.string>
+ <floater.string name="stop_txt">
Parar
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Vista previa
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Ninguno --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
<text name="desc_label">
Descripción:
</text>
@@ -22,37 +37,32 @@
<text name="key_label">
Atajo de teclado:
</text>
- <combo_box label="Ninguno" name="modifier_combo" left="116" width="76"/>
- <combo_box label="Ninguno" name="key_combo" width="76" left_delta="80"/>
+ <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
+ <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
<text name="library_label">
Biblioteca:
</text>
+ <scroll_list name="library_list"/>
+ <button label="Añadir &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Pasos:
</text>
- <scroll_list name="library_list">
- Animación
-Sonido
-Chat
-Esperar
- </scroll_list>
- <button label="Añadir &gt;&gt;" name="add_btn"/>
- <button label="Hacia arriba" name="up_btn"/>
- <button label="Hacia abajo" name="down_btn"/>
+ <button label="Arriba" name="up_btn"/>
+ <button label="Abajo" name="down_btn"/>
<button label="Quitar" name="delete_btn"/>
- <text name="help_label">
- Todos los pasos suceden a la vez,
-a menos que añada pasos de espera.
- </text>
- <text left="230" name="options_text" width="200" />
+ <text left="230" name="options_text" width="200"/>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Empezar" />
- <radio_item name="stop" label="Parar" />
+ <radio_item label="Empezar" name="start"/>
+ <radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="hasta que las animaciones &#10;estén hechas" name="wait_anim_check"/>
+ <check_box bottom_delta="34" label="hasta que las animaciones
+estén hechas" name="wait_anim_check"/>
<check_box bottom_delta="-30" label="tiempo en segundos" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor" />
- <check_box left="130" label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+ <line_editor left_delta="130" name="wait_time_editor"/>
+ <text name="help_label">
+ Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
+ </text>
+ <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
<button label="Vista previa" name="preview_btn" width="85"/>
<button label="Guardar" name="save_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..f5b771c6e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..ea955f9727
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS">
+ <text name="trigger_label">
+ Chat :
+ </text>
+ <text name="key_label">
+ Teclado:
+ </text>
+ <combo_box label="Ninguno/a" name="modifier_combo"/>
+ <combo_box label="Ninguno/a" name="key_combo"/>
+ <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quería decir hola&apos; por &apos;Quería decir qué tal&apos; en cuanto realices el gesto.">
+ Reemplazar por:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quería decir hola&apos; por &apos;Quería decir qué tal&apos; en cuanto realices el gesto."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..f5b771c6e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
index 4d11520335..ee2e06a3d7 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="Nota:">
- <button label="Guardar" label_selected="Guardar" name="Save"/>
+<floater name="preview notecard" title="NOTA:">
+ <floater.string name="no_object">
+ No se ha podido encontrar el objeto que contiene esta nota.
+ </floater.string>
+ <floater.string name="not_allowed">
+ no tienes permiso para ver esta nota.
+ </floater.string>
+ <floater.string name="Title">
+ Nota: [NAME]
+ </floater.string>
+ <floater.string label="Guardar" label_selected="Guardar" name="Save">
+ Guardar
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
<text_editor name="Notecard Editor">
Cargando...
</text_editor>
- <string name="no_object">
- No se ha podido encontrar el objeto que contiene esta nota.
- </string>
- <string name="not_allowed">
- No está autorizado a ver esta nota.
- </string>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_sound.xml b/indra/newview/skins/default/xui/es/floater_preview_sound.xml
index 060a033b08..07ec53581c 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_sound.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Sonido : [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
- <button label="Tocar en el mundo" label_selected="Tocar en el mundo" name="Sound play btn" tool_tip="Tocar este sonido para que puedan oírlo los demás."/>
- <button label="Oír sólo uno mismo" label_selected="Oír sólo uno mismo" name="Sound audition btn" tool_tip="Tocar este sonido para que sólo pueda oírlo usted."/>
+ <button label="Tocar en el mundo" label_selected="Tocar en el mundo" name="Sound play btn" tool_tip="Ejecutar este sonido de modo que lo oigan todos"/>
+ <button label="Oír sólo uno mismo" label_selected="Oír sólo uno mismo" name="Sound audition btn" tool_tip="Ejecutar este sonido de modo que sólo tú lo oigas"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_texture.xml b/indra/newview/skins/default/xui/es/floater_preview_texture.xml
index 280438fefd..412b31abb9 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_texture.xml
@@ -1,9 +1,44 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Textura: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copiar al inventario
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
<text name="dimensions">
- Tamaño: [WIDTH] x [HEIGHT]
+ [WIDTH] px x [HEIGHT] px
</text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Vista previa en una proporción concreta">
+ <combo_item name="Unconstrained">
+ Sin restricciones
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Emblema del grupo o perfil del Mundo real">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Perfil de [SECOND_LIFE]">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Clasificados (también en las listas de búsqueda), hitos">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Acerca del terreno">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Destacados del perfil">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="keep"/>
+ <button label="Cancelar" name="discard"/>
+ <button label="Guardar como" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_region_info.xml b/indra/newview/skins/default/xui/es/floater_region_info.xml
index b5a85378c2..46d0839238 100644
--- a/indra/newview/skins/default/xui/es/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/es/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="Región/Estado"/>
+<floater name="regioninfo" title="REGIÓN/ESTADO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index 8ae8c212e6..760429e73d 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Denuncia de Infracción">
- <texture_picker label="" name="screenshot"/>
- <check_box label="Incluir una captura de pantalla" name="screen_check"/>
+<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
+ <floater.string name="Screenshot">
+ Captura de pantalla
+ </floater.string>
+ <check_box label="Usar esta captura de pantalla" name="screen_check"/>
<text name="reporter_title">
Denunciante:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Región:
@@ -21,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Pulse el botón y luego el objeto:
+ Pulsa el botón y luego el objeto a denunciar:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
<text name="object_name_label">
- Nombre:
+ Objeto:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -34,54 +36,53 @@
Propietario:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
- <combo_box.item name="Select_category" label="Elegir la categoría"/>
- <combo_box.item name="Age__Age_play" label="Edad &gt; Jugar a ser niño"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Edad &gt; Residente adulto en Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Edad &gt; Residente menor de edad fuera de Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Ataque &gt; Sandbox de combate / Zona no segura"/>
- <combo_box.item name="Assault__Safe_area" label="Ataque &gt; Zona segura"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Ataque &gt; Sandbox de prueba de armas"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comercio &gt; Error en la entrega de productos o servicios"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Indiscreción &gt; Información del mundo real"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Indiscreción &gt; Monitorizar a distancia el chat"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Indiscreción &gt; Información Se Second Life, el chat o los MI"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Perturbando la paz &gt; Abuso de los recursos de la región"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Perturbando la paz &gt; Excesivos objetos con script"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Perturbando la paz &gt; Objeto basura"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Perturbando la paz &gt; Publicidad no deseada"/>
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Terreno"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Esquemas piramidales o cadenas de cartas"/>
- <combo_box.item name="Fraud__US$" label="Fraude &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Acoso &gt; Anuncios múltiples / Spam visual"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Acoso &gt; Difamación de individuos o grupos"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Acoso &gt; Impedir el movimiento"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Acoso &gt; Acoso sexual"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Acoso &gt; Abuso verbal"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecencia &gt; En general, contenido o conducta ofensivos"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecencia &gt; Nombre inapropiado del avatar"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos"/>
- <combo_box.item name="Intolerance" label="Intolerancia"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terreno &gt; Abuso de los recursos de un sandbox"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terreno &gt; Invasión &gt; Objetos/Texturas"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Terreno &gt; Invasión &gt; Partículas"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terreno &gt; Invasión &gt; Ãrboles/Plantas"/>
- <combo_box.item name="Wagering_gambling" label="Apuestas/Juego"/>
- <combo_box.item name="Other" label="Otra"/>
+ <combo_box.item label="Elegir la categoría" name="Select_category"/>
+ <combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
+ <combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerancia" name="Intolerance"/>
+ <combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Ãrboles/Plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
+ <combo_box.item label="Otra" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nombre del infractor:
</text>
- <button label="Elegir al residente" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
- <check_box label="No sé el nombre del infractor" name="omit_abuser_name" tool_tip="Marque esto si no puede aportar el nombre del infractor"/>
+ <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
<text name="abuser_name_title2">
Localización de la infracción:
</text>
@@ -92,13 +93,11 @@
Detalles:
</text>
<text name="bug_aviso">
- Por favor, sea muy concreto sobre la fecha, la localización,
-la naturaleza de la infracción, el aportar textos relevantes
-del chat o los MI, y, si es posible, seleccione el objeto.
+ Por favor, sé todo lo concreto que puedas
</text>
<text name="incomplete_title">
- Nota: las denuncias incompletas no se investigarán.
+ * Las denuncias incompletas no se investigarán
</text>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_script_debug.xml b/indra/newview/skins/default/xui/es/floater_script_debug.xml
index e33ffb7d96..e7eddfd9f3 100644
--- a/indra/newview/skins/default/xui/es/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="script debug floater" title="Alerta/Error de los scripts">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[Todos los scripts]"/>
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..db9fd5f36e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[TODOS LOS SCRIPTS]" title="[TODOS LOS SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/es/floater_script_preview.xml b/indra/newview/skins/default/xui/es/floater_script_preview.xml
index 0d8cd0b406..36b58b608b 100644
--- a/indra/newview/skins/default/xui/es/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_preview.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="Script: script de rotación">
+<floater name="preview lsl text" title="SCRIPT: ROTACIÓN DEL SCRIPT">
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_script_queue.xml b/indra/newview/skins/default/xui/es/floater_script_queue.xml
index dcd2bfe5b0..39c84103c4 100644
--- a/indra/newview/skins/default/xui/es/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_queue.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="Reinicio">
+<floater name="queue" title="PROGRESO DEL REINICIO">
+ <floater.string name="Starting">
+ Empezando [START] de [COUNT] ítems.
+ </floater.string>
+ <floater.string name="Done">
+ Hecho.
+ </floater.string>
+ <floater.string name="Resetting">
+ Reiniciando
+ </floater.string>
+ <floater.string name="Running">
+ Ejecutándose
+ </floater.string>
+ <floater.string name="NotRunning">
+ Sin ejecutarse
+ </floater.string>
<button label="Cerrar" label_selected="Cerrar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_script_search.xml b/indra/newview/skins/default/xui/es/floater_script_search.xml
index 3c8dc2fe9c..1ab6682023 100644
--- a/indra/newview/skins/default/xui/es/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="Buscar en el script" width="320">
- <check_box label="Indiferente mays./mins." name="case_text" left="75"/>
+<floater name="script search" title="BÚSQUEDA DE SCRIPTS" width="320">
+ <check_box label="Indiferente mays./mins." left="75" name="case_text"/>
<button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/>
- <button label="Reemplazar" label_selected="Reemplazar" name="replace_btn" left="100" width="85"/>
- <button label="Reemplazar todos" label_selected="Reemplazar todos" name="replace_all_btn" left="190" width="122"/>
+ <button label="Reemplazar" label_selected="Reemplazar" left="100" name="replace_btn" width="85"/>
+ <button label="Reemplazar todos" label_selected="Reemplazar todos" left="190" name="replace_all_btn" width="122"/>
<text name="txt" width="65">
Buscar
</text>
<text name="txt2" width="65">
Reemplazar
</text>
- <line_editor left="75" name="search_text" width="240" />
- <line_editor left="75" name="replace_text" width="240" />
+ <line_editor left="75" name="search_text" width="240"/>
+ <line_editor left="75" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml
new file mode 100644
index 0000000000..377b848530
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="ENCONTRAR">
+ <floater.string name="loading_text">
+ Cargando...
+ </floater.string>
+ <floater.string name="done_text">
+ Hecho
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_select_key.xml b/indra/newview/skins/default/xui/es/floater_select_key.xml
index 9c889df63a..6503a3d5cb 100644
--- a/indra/newview/skins/default/xui/es/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/es/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Pulse una tecla para seleccionarla
+ Pulsa una tecla para configurarla como tu botón para hablar.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml
index bce13c1e33..efedb5d689 100644
--- a/indra/newview/skins/default/xui/es/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml
@@ -1,64 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="Vender el terreno">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Parcela:
- </text>
- <text name="info_parcel">
- NOMBRE DE LA PARCELA
- </text>
- <text name="info_size_label">
- Tamaño:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action">
- Vender esta parcela:
- </text>
- <icon bottom_delta="-56" name="step_price" />
- <text name="price_label">
- Marque un precio:
- </text>
- <text name="price_text">
- Elija un precio adecuado para esta parcela.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER] L$ por metro cuadrado)
- </text>
- <text name="sell_to_label">
- Vender este terreno a:
- </text>
- <text name="sell_to_text">
- Elija si venderlo a cualquiera o a un comprador concreto.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="seleccione --" />
- <combo_box.item name="Anyone" label="Cualquiera" />
- <combo_box.item name="Specificuser:" label="Un usuario concreto:" />
- </combo_box>
- <button label="Seleccionar..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- ¿Vender los objetos con el terreno?
- </text>
- <text name="sell_objects_text">
- Los objetos transferibles del propietario del terreno cambiarán
-de propietario.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58" >
- <radio_item name="no" label="No, mantener la propiedad de los objetos" />
- <radio_item name="yes" label="Sí, vender los objetos con el terreno" />
- </radio_group>
- <button label="Mostrar los objetos" name="show_objects" width="120"/>
- <text name="nag_message_label">
- RECUERDE: todas las ventas son definitivas.
- </text>
- <button label="Poner el terreno en venta" name="sell_btn"/>
- <button label="Cancelar" name="cancel_btn"/>
- </panel>
- </scroll_container>
+<floater name="sell land" title="VENTA DE TERRENO">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parcela:
+ </text>
+ <text name="info_parcel">
+ NOMBRE DE LA PARCELA
+ </text>
+ <text name="info_size_label">
+ Tamaño:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ Vender esta parcela:
+ </text>
+ <text name="price_label">
+ 1. Marcar un precio:
+ </text>
+ <text name="price_text">
+ Elegir un precio adecuado.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ ([PER_METER] L$ por m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vender el terreno a:
+ </text>
+ <text name="sell_to_text">
+ Elige si venderlo a cualquiera o a un comprador concreto.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Elegir a alguien -" name="--selectone--"/>
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Alguien concreto:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Elegir" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. ¿Vender los objetos junto con el terreno?
+ </text>
+ <text name="sell_objects_text">
+ Los objetos transferibles del propietario del terreno que estén en la parcela cambiarán de propietario.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="No, mantener la propiedad de los objetos" name="no"/>
+ <radio_item label="Sí, vender los objetos con el terreno" name="yes"/>
+ </radio_group>
+ <button label="Mostrar los objetos" name="show_objects" width="120"/>
+ <text name="nag_message_label">
+ RECUERDA: todas las ventas son definitivas.
+ </text>
+ <button label="Poner en venta el terreno" name="sell_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
index 1d5ad2f34c..36234763b0 100644
--- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="Configuración del depurador">
+<floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE" />
- <combo_box.item name="FALSE" label="FALSE" />
+ <combo_box.item label="VERDADERO" name="TRUE"/>
+ <combo_box.item label="FALSO" name="FALSE"/>
</combo_box>
- <color_swatch label="Color" name="color_swatch"/>
+ <color_swatch label="Color" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index c1ace23503..9417c74d28 100644
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Vista previa de la foto">
+<floater name="Snapshot" title="VISTA PREVIA DE LA FOTO">
<text name="type_label">
Destino de la foto
</text>
<radio_group label="Tipo de la foto" name="snapshot_type_radio">
- <radio_item name="postcard" label="Enviar por correo electrónico" />
- <radio_item name="texture" label="Guardarla en su inventario ([AMOUNT] L$)" />
- <radio_item name="local" label="Guardarla en su disco duro" />
+ <radio_item label="Enviar por correo electrónico" name="postcard"/>
+ <radio_item label="Guardarla en su inventario ([AMOUNT] L$)" name="texture"/>
+ <radio_item label="Guardarla en su disco duro" name="local"/>
</radio_group>
<text name="file_size_label">
Tamaño del archivo: [SIZE] KB
@@ -15,8 +15,8 @@
<button label="Enviar" name="send_btn"/>
<button label="Guardar ([AMOUNT] L$)" name="upload_btn"/>
<flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
- <flyout_button_item name="save_item" label="Guardar"/>
- <flyout_button_item name="saveas_item" label="Guardar como..."/>
+ <flyout_button_item label="Guardar" name="save_item"/>
+ <flyout_button_item label="Guardar como..." name="saveas_item"/>
</flyout_button>
<button label="Cancelar" name="discard_btn"/>
<button label="Más &gt;&gt;" name="more_btn" tool_tip="Opciones avanzadas"/>
@@ -28,50 +28,51 @@
Formato
</text>
<combo_box label="Resolución" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Personalizar"/>
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizar" name="Custom"/>
</combo_box>
<combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="Small(128x128)" label="Pequeño (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Medio (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Grande (512x512)"/>
- <combo_box.item name="Custom" label="Personalizar"/>
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeño (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Medio (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizar" name="Custom"/>
</combo_box>
<combo_box label="Resolución" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Personalizar"/>
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizar" name="Custom"/>
</combo_box>
<combo_box label="Formato" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Ancho" name="snapshot_width" label_width="41" width="101"/>
- <spinner label="Alto" name="snapshot_height" label_width="30" width="90" left="121"/>
+ <spinner label="Ancho" label_width="41" name="snapshot_width" width="101"/>
+ <spinner label="Alto" label_width="30" left="121" name="snapshot_height" width="90"/>
<check_box label="Mantener las proporciones" name="keep_aspect_check"/>
<slider label="Calidad de la imagen" name="image_quality_slider"/>
<text name="layer_type_label">
Captura:
</text>
<combo_box label="Capas de la imagen" name="layer_types">
- <combo_box.item name="Colors" label="Colores"/>
- <combo_box.item name="Depth" label="Profundidad"/>
- <combo_box.item name="ObjectMattes" label="Bandas negras"/>
+ <combo_box.item label="Colores" name="Colors"/>
+ <combo_box.item label="Profundidad" name="Depth"/>
+ <combo_box.item label="Bandas negras" name="ObjectMattes"/>
</combo_box>
<check_box label="Incluir la interfaz en la foto" name="ui_check"/>
<check_box bottom_delta="-17" label="Incluir los HUD en la foto" name="hud_check"/>
<check_box bottom_delta="-17" label="Mantenerla abierta tras guardarla" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Congelar la toma &#10;(vista previa en pantalla completa)" name="freeze_frame_check"/>
+ <check_box bottom_delta="-17" label="Congelar la toma
+(vista previa en pantalla completa)" name="freeze_frame_check"/>
<check_box bottom_delta="-29" label="Actualizar automáticamente" name="auto_snapshot_check"/>
<string name="unknown">
desconocido
diff --git a/indra/newview/skins/default/xui/es/floater_sound_preview.xml b/indra/newview/skins/default/xui/es/floater_sound_preview.xml
index e69ac10123..8b8d9f13ce 100644
--- a/indra/newview/skins/default/xui/es/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="sound.wav">
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
Nombre:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_statistics.xml b/indra/newview/skins/default/xui/es/floater_statistics.xml
index 6e644cacf1..c9b0a76df0 100644
--- a/indra/newview/skins/default/xui/es/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/es/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Estadísticas"/>
+<floater name="stats floater" title="ESTADÃSTICAS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml
new file mode 100644
index 0000000000..5f4fabf375
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="ESTADÃSTICAS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Básico" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Ancho de banda" name="bandwidth"/>
+ <stat_bar label="Pérdida de paquetes" name="packet_loss"/>
+ <stat_bar label="Ping del Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avanzado" name="advanced">
+ <stat_view label="Renderización" name="render">
+ <stat_bar label="KTris generados" name="ktrisframe"/>
+ <stat_bar label="KTris generados" name="ktrissec"/>
+ <stat_bar label="Objetos en total" name="objs"/>
+ <stat_bar label="Objetos nuevos" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Textura" name="texture">
+ <stat_bar label="Número" name="numimagesstat"/>
+ <stat_bar label="Raw: número" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Red" name="network">
+ <stat_bar label="Paquetes salientes" name="packetsinstat"/>
+ <stat_bar label="Paquetes entrantes" name="packetsoutstat"/>
+ <stat_bar label="Objetos" name="objectkbitstat"/>
+ <stat_bar label="Textura" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Capas" name="layerskbitstat"/>
+ <stat_bar label="Entrando ahora" name="actualinkbitstat"/>
+ <stat_bar label="Saliendo ahora" name="actualoutkbitstat"/>
+ <stat_bar label="Operaciones VFS pendientes" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulador" name="sim">
+ <stat_bar label="Tiempo de dilación" name="simtimedilation"/>
+ <stat_bar label="FPS en el Sim" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pin de objetos" name="physicspinnedtasks"/>
+ <stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/>
+ <stat_bar label="Memoria asignada" name="physicsmemoryallocated"/>
+ <stat_bar label="Agentes: actual./seg." name="simagentups"/>
+ <stat_bar label="Agentes del grid principal" name="simmainagents"/>
+ <stat_bar label="Agentes secundarios" name="simchildagents"/>
+ <stat_bar label="Objetos" name="simobjects"/>
+ <stat_bar label="Objetos activos" name="simactiveobjects"/>
+ <stat_bar label="Scripts activos" name="simactivescripts"/>
+ <stat_bar label="Eventos de scripts" name="simscripteps"/>
+ <stat_bar label="Paquetes salientes" name="siminpps"/>
+ <stat_bar label="Paquetes entrantes" name="simoutpps"/>
+ <stat_bar label="Descargas pendientes" name="simpendingdownloads"/>
+ <stat_bar label="Subidas pendientes" name="simpendinguploads"/>
+ <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Tiempo (ms)" name="simperf">
+ <stat_bar label="Tiempo total de los frames" name="simframemsec"/>
+ <stat_bar label="Tiempo de red" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Tiempo de la simulación" name="simsimothermsec"/>
+ <stat_bar label="Tiempo de los agentes" name="simagentmsec"/>
+ <stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/>
+ <stat_bar label="Tiempo de los scripts" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sys_well.xml b/indra/newview/skins/default/xui/es/floater_sys_well.xml
new file mode 100644
index 0000000000..34c87351a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="NOTIFICACIONES">
+ <string name="title_im_well_window">
+ SESIONES DE MI
+ </string>
+ <string name="title_notification_well_window">
+ NOTIFICACIONES
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_telehub.xml b/indra/newview/skins/default/xui/es/floater_telehub.xml
index 74084e9db9..87cc9c1659 100644
--- a/indra/newview/skins/default/xui/es/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/es/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="Punto de Teleporte" min_height="310" height="310">
+<floater height="310" min_height="310" name="telehub" title="PUNTO DE TELEPORTE">
<text name="status_text_connected">
Punto de Teleporte conectado al objeto [OBJECT]
</text>
@@ -9,7 +9,7 @@
<text name="help_text_connected">
Para quitar, pulse Desconectar.
</text>
- <text name="help_text_not_connected" height="38" bottom_delta="-18">
+ <text bottom_delta="-18" height="38" name="help_text_not_connected">
Seleccione el objeto y pulse Conectar el Punto
de Teleporte.
</text>
@@ -21,12 +21,9 @@ de Teleporte.
<button label="Añadir sucursales" name="add_spawn_point_btn"/>
<button label="Quitar sucursales" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Seleccione el objeto y pulse Añadir para
-especificar la posición.
-Hecho eso, puede mover o borrar el objeto.
-Las posiciones son relativas al centro del
-Punto de Teleporte.
-Seleccione un ítem de la lista para mostrar su
-posición en el mundo.
+ Selecciona el objeto y pulsa &quot;Añadir sucursal&quot; para especificar una posición.
+Luego, puedes mover o borrar el objeto.
+Las posiciones son relativas al centro del Punto de Teleporte.
+Elige un ítem de la lista para realzarlo en el mundo.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
index 8b661a6041..ed2787ea60 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Elegir: Textura">
+<floater name="texture picker" title="DESTACADO: TEXTURA">
<string name="choose_picture">
Pulse para elegir una imagen
</string>
<text name="Multiple">
- Múltiple
+ Texturas múltiples
</text>
<text name="unknown">
- Dimensiones: [DIMENSIONS]
+ Tamaño: [DIMENSIONS]
</text>
<button label="Por defecto" label_selected="Por defecto" name="Default" width="84"/>
- <button label="Ninguna" label_selected="Ninguna" name="None" left="90"/>
+ <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/>
<button label="Blanca" label_selected="Blanca" name="Blank"/>
<check_box label="Ver las carpetas" name="show_folders_check"/>
- <search_editor label="Escriba aquí para buscar una" name="inventory search editor"/>
- <check_box label="Aplicar ahora mismo" name="apply_immediate_check"/>
+ <search_editor label="Filtrar las texturas" name="inventory search editor"/>
+ <check_box label="Aplicarlo ahora" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Elegir" label_selected="Elegir" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Elegir:
</string>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index da842d22c6..1c65567830 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -1,45 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Construir" width="288">
+<floater name="toolbox floater" short_title="HERRAMIENTAS DE CONSTRUCCIÓN" title="" width="288">
+ <floater.string name="status_rotate">
+ Arrastre las bandas de color para girar el objeto
+ </floater.string>
+ <floater.string name="status_scale">
+ Pulse y arrastre para estirar el lado seleccionado
+ </floater.string>
+ <floater.string name="status_move">
+ Arrastrar para mover, Mayús.+arrastrar para copiar
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Mantenga pulsado para modificar el terreno
+ </floater.string>
+ <floater.string name="status_camera">
+ Pulsa y arrastra para mover la cámara
+ </floater.string>
+ <floater.string name="status_grab">
+ Arrastra para mover: Ctrl, verticalmente; Ctrl-Mayús., girando
+ </floater.string>
+ <floater.string name="status_place">
+ Pulse en el mundo para construir
+ </floater.string>
+ <floater.string name="status_selectland">
+ Pulse y arrastre para seleccionar el terreno
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Pantalla
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referencia
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Añadido
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Visión"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
<button label="" label_selected="" name="button edit" tool_tip="Editar"/>
<button label="" label_selected="" name="button create" tool_tip="Crear"/>
<button label="" label_selected="" name="button land" tool_tip="Terreno"/>
+ <text name="text status" width="280">
+ Arrastrar para mover, Mayús.+arrastrar para copiar
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Órbita (Ctrl)" name="radio orbit"/>
- <radio_item label="Panorámica (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Panorámica (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Mover" name="radio move"/>
<radio_item label="Vertical (Ctrl)" name="radio lift"/>
- <radio_item label="Horizontal (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Posición" name="radio position"/>
+ <radio_item label="Moverse" name="radio position"/>
<radio_item label="Girar (Ctrl)" name="radio rotate"/>
- <radio_item label="Estirar (Ctrl-Shift)" name="radio stretch"/>
+ <radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Elegir la cara" name="radio select face"/>
</radio_group>
<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Ajuste:
+ <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode" width="82">
- <combo_box.item name="World" label="Mundo"
- />
- <combo_box.item name="Local" label="Local"
- />
- <combo_box.item name="Reference" label="Referencia"
- />
- </combo_box>
<check_box label="Estirar ambos lados" name="checkbox uniform"/>
- <check_box label="Estirar las texturas" name="checkbox stretch textures"/>
- <check_box label="Usar la cuadrícula" name="checkbox snap to grid"/>
- <button label="Opciones..." label_selected="Opciones..." name="Options..."/>
- <text name="text status" width="280">
- Arrastrar para mover, Mayús.+arrastrar para copiar
- </text>
+ <check_box initial_value="true" label="Estirar las texturas" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Usar la cuadrícula" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Elige qué cuadricula usar para posicionar el objeto" width="82">
+ <combo_box.item label="Mundo" name="World"/>
+ <combo_box.item label="Local" name="Local"/>
+ <combo_box.item label="Referencia" name="Reference"/>
+ </combo_box>
+ <button label="Opciones..." label_selected="Opciones..." name="Options..." tool_tip="Ver más opciones de la cuadrícula"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pirámide"/>
@@ -55,10 +91,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Cono truncado"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Ãrbol"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Hierba"/>
- <check_box label="Mantener seleccionado" name="checkbox sticky"/>
- <check_box label="Copia seleccionada" name="checkbox copy selection"/>
- <check_box label="Centrada" name="checkbox copy centers"/>
- <check_box label="Girada" name="checkbox copy rotates"/>
+ <check_box label="Mantener la herramienta elegida" name="checkbox sticky"/>
+ <check_box label="Copiar la selección" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Copia centrada" name="checkbox copy centers"/>
+ <check_box label="Copia girada" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Seleccionar el terreno" name="radio select land"/>
<radio_item label="Nivelar" name="radio flatten"/>
@@ -68,7 +104,6 @@
<radio_item label="Escarpar" name="radio noise"/>
<radio_item label="Restablecer" name="radio revert"/>
</radio_group>
- <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar el terreno seleccionado" left="146"/>
<text name="Bulldozer:">
Bulldozer:
</text>
@@ -78,14 +113,51 @@
<text name="Strength:">
Fuerza
</text>
- <text name="obj_count" left="134">
- Objetos seleccionados: [COUNT]
+ <button label="Aplicar" label_selected="Aplicar" left="146" name="button apply to selection" tool_tip="Modificar el terreno seleccionado"/>
+ <text left="134" name="obj_count">
+ Objetos: [COUNT]
</text>
- <text name="prim_count" left="134">
- primitivas: [COUNT]
+ <text left="134" name="prim_count">
+ Primitivas: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288">
<panel label="General" name="General">
+ <panel.string name="text deed continued">
+ Transfeir
+ </panel.string>
+ <panel.string name="text deed">
+ Transferir
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ No puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ No puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Para configurar los permisos, debes seleccionar el objeto completo
+ </panel.string>
+ <panel.string name="Cost Default">
+ Precio: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Precio total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Precio variable
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venta variable
+ </panel.string>
<text name="Name:">
Nombre:
</text>
@@ -98,135 +170,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/>
<text name="Owner:">
Propietario:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/>
<text name="Group:">
Grupo:
</text>
- <text name="Group Name Proxy">
- Los Linden
- </text>
- <button label="Configurar..." label_selected="Configurar..." name="button set group"/>
- <text name="Permissions:">
- Permisos:
- </text>
-
- <check_box label="Compartir con el grupo" name="checkbox share with group" tool_tip="Permitir que todos los miembros del grupo compartan y utilicen sus permisos sobre este objeto. Debe transferirlo para activar las restricciones según los roles."/>
- <string name="text deed continued">
- Transferir...
- </string>
- <string name="text deed">
- Transferir
- </string>
- <button label="Transferir..." label_selected="Transferir..." name="button deed" tool_tip="Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
- <check_box label="Permitir a cualquiera que lo mueva" name="checkbox allow everyone move"/>
- <check_box label="Permitir a cualquiera que lo copie" name="checkbox allow everyone copy"/>
- <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/>
- <check_box label="En venta" name="checkbox for sale"/>
- <text name="Cost">
- Precio: L$
+ <button label="Configurar..." label_selected="Configurar..." name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
+ <name_box initial_value="Cargando..." name="Group Name Proxy"/>
+ <button label="Transfeir" label_selected="Transfeir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
+ <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <text name="label click action" width="180">
+ Al tocarlo:
</text>
+ <combo_box name="clickaction" width="192">
+ <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentarse en el objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar el objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar al objeto" name="Payobject"/>
+ <combo_box.item label="Abrirlo" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="En venta:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Copia" name="Copy"/>
<combo_box.item label="Contenidos" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action" width="180">
- Al pulsarlo con el botón izquierdo:
- </text>
- <combo_box name="clickaction" width="192">
- <combo_box.item name="Touch/grab(default)" label="Tocar/Agarrar (por defecto)"
- />
- <combo_box.item name="Sitonobject" label="Sentarse en el objeto"
- />
- <combo_box.item name="Buyobject" label="Comprar el objeto"
- />
- <combo_box.item name="Payobject" label="Pagar al objeto"
- />
- <combo_box.item name="Open" label="Abrirlo"
- />
- <combo_box.item name="Play" label="Ejecutar los media de la parcela"
- />
- <combo_box.item name="Opemmedia" label="Abrir los media de la parcela"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Puede modificar este objeto
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- El próximo propietario puede:
- </text>
- <check_box label="Modificarlo" name="checkbox next owner can modify"/>
- <check_box label="Copiarlo" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Puede modificar este objeto
- </string>
- <string name="text modify info 2">
- Puede modificar estos objetos
- </string>
- <string name="text modify info 3">
- No puede modificar este objeto
- </string>
- <string name="text modify info 4">
- No puede modificar estos objetos
- </string>
- <string name="text modify warning">
- Debe seleccionar todo el objeto para definir los permisos
- </string>
- <string name="Cost Default">
- Precio: L$
- </string>
- <string name="Cost Total">
- Precio total: L$
- </string>
- <string name="Cost Per Unit">
- Precio por: L$
- </string>
- <string name="Cost Mixed">
- Precio variable
- </string>
- <string name="Sale Mixed">
- Venta variable
- </string>
+ <spinner label="Precio: L$" name="Edit Cost"/>
+ <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Puedes modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Cualquiera:
+ </text>
+ <check_box label="Moverlo" name="checkbox allow everyone move"/>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo propietario:
+ </text>
+ <check_box label="Modificarlo" name="checkbox next owner can modify"/>
+ <check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objeto" name="Object">
- <text name="select_single">
- Seleccione un sólo prim para editarlo.
- </text>
- <text name="edit_object">
- Modificar los parámetros del objeto:
- </text>
<check_box label="Bloqueado" name="checkbox locked" tool_tip="Previene que el objeto sea movido o borrado. Suele ser útil mientras se construye, para prevenir que se modifique sin querer."/>
<check_box label="Material" name="Physical Checkbox Ctrl" tool_tip="Permite que el objeto pueda ser empujado y le afecte la gravedad."/>
- <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Hace que el objeto se borre 1 minuto después de su creación."/>
+ <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Provoca que el objeto desaparezca 1 minuto después de ser creado"/>
<check_box label="Inmaterial" name="Phantom Checkbox Ctrl" tool_tip="Hace que el objeto no colisiones con otros objetos o avatares."/>
<text name="label position">
Posición (metros)
@@ -246,48 +260,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Material
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Piedra"
- />
- <combo_box.item name="Metal" label="Metal"
- />
- <combo_box.item name="Glass" label="Vidrio"
- />
- <combo_box.item name="Wood" label="Madera"
- />
- <combo_box.item name="Flesh" label="Carne"
- />
- <combo_box.item name="Plastic" label="Plástico"
- />
- <combo_box.item name="Rubber" label="Goma"
- />
- </combo_box>
- <text name="label basetype">
- Tipo de objeto a construir
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Caja"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toroide"
- />
- <combo_box.item name="Tube" label="Tubo"
- />
- <combo_box.item name="Ring" label="Cono truncado"
- />
- <combo_box.item name="Sculpted" label="Sculpted"
- />
+ <combo_box.item label="Caja" name="Box"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toroide" name="Torus"/>
+ <combo_box.item label="Tubo" name="Tube"/>
+ <combo_box.item label="Cono truncado" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Piedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidrio" name="Glass"/>
+ <combo_box.item label="Madera" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Goma" name="Rubber"/>
</combo_box>
<text name="text cut">
- Corte: Inicio y Fin
+ Corte (inicio/fin)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -301,17 +294,13 @@
Forma del hueco
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Por defecto"
- />
- <combo_box.item name="Circle" label="Círculo"
- />
- <combo_box.item name="Square" label="Cuadrado"
- />
- <combo_box.item name="Triangle" label="Triángulo"
- />
+ <combo_box.item label="Por defecto" name="Default"/>
+ <combo_box.item label="Círculo" name="Circle"/>
+ <combo_box.item label="Cuadrado" name="Square"/>
+ <combo_box.item label="Triángulo" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torsión: Inicio y Fin
+ Torsión (inicio/fin)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -329,13 +318,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Corte del perfil: Inicio y Fin
+ Corte del perfil (inicio/fin)
</text>
<text name="advanced_dimple">
- Horadar: Inicio y Fin
+ Horadar (inicio/fin)
</text>
<text name="advanced_slice">
- Cortar: Inicio y Fin
+ Cortar (inicio/fin)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -351,22 +340,17 @@
Giros
</text>
<texture_picker label="Textura para sculpted" name="sculpt texture control" tool_tip="Pulse para elegir una imagen"/>
- <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X."/>
- <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro."/>
+ <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X"/>
+ <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro"/>
<text name="label sculpt type">
Tipo de unión
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(ninguna)"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toroide"
- />
- <combo_box.item name="Plane" label="Plano"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
+ <combo_box.item label="(ninguna)" name="None"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toroide" name="Torus"/>
+ <combo_box.item label="Plano" name="Plane"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Caracter." name="Features">
@@ -376,7 +360,7 @@
<text name="edit_object">
Editar las características del objeto:
</text>
- <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z. (Sólo del lado del cliente)"/>
+ <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z (sólo del lado del cliente)"/>
<spinner label="Blandura" name="FlexNumSections"/>
<spinner label="Gravedad" name="FlexGravity"/>
<spinner label="Fricción" name="FlexFriction"/>
@@ -386,86 +370,70 @@
<spinner label="Fuerza en Y" name="FlexForceY"/>
<spinner label="Fuerza en Z" name="FlexForceZ"/>
<check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Hace que el objeto emita luz"/>
- <text name="label color">
- Color
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/>
+ <texture_picker label="" name="light texture control" tool_tip="Pulsa para elegir una proyección de imagen (sólo tiene efecto con renderización deferida activada)"/>
<spinner label="Intensidad" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Radio" name="Light Radius"/>
+ <spinner label="Visión" name="Light Focus"/>
<spinner label="Atenuación" name="Light Falloff"/>
+ <spinner label="Ambiental" name="Light Ambiance"/>
</panel>
<panel label="Textura" name="Texture">
+ <panel.string name="string repeats per meter">
+ Repeticiones por m.
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repeticiones por cara
+ </panel.string>
<texture_picker label="Textura" name="texture control" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/>
<text name="color trans">
Transparencia %
</text>
<text name="glow label">
Resplandor
</text>
- <check_box label="Brillo al &#10;máximo" name="checkbox fullbright" bottom_delta="-21"/>
+ <check_box bottom_delta="-21" label="Brillo al
+máximo" name="checkbox fullbright"/>
<text name="tex gen">
Detallado
</text>
<combo_box name="combobox texgen" width="86">
- <combo_box.item name="Default" label="Por defecto"
- />
- <combo_box.item name="Planar" label="Plano"
- />
+ <combo_box.item label="Por defecto" name="Default"/>
+ <combo_box.item label="Plano" name="Planar"/>
</combo_box>
<text name="label shininess">
Brillantez
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Ninguna"
- />
- <combo_box.item name="Low" label="Baja"
- />
- <combo_box.item name="Medium" label="Media"
- />
- <combo_box.item name="High" label="Alta"
- />
+ <combo_box.item label="Ninguna" name="None"/>
+ <combo_box.item label="Baja" name="Low"/>
+ <combo_box.item label="Media" name="Medium"/>
+ <combo_box.item label="Alta" name="High"/>
</combo_box>
<text name="label bumpiness">
Relieve
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Ninguno"
- />
- <combo_box.item name="Brightness" label="Brillo"
- />
- <combo_box.item name="Darkness" label="Oscuro"
- />
- <combo_box.item name="woodgrain" label="grano de madera"
- />
- <combo_box.item name="bark" label="corteza"
- />
- <combo_box.item name="bricks" label="ladrillos"
- />
- <combo_box.item name="checker" label="cajero"
- />
- <combo_box.item name="concrete" label="cemento"
- />
- <combo_box.item name="crustytile" label="azulejería"
- />
- <combo_box.item name="cutstone" label="piedra cortada"
- />
- <combo_box.item name="discs" label="discos"
- />
- <combo_box.item name="gravel" label="grava"
- />
- <combo_box.item name="petridish" label="placa de Petri"
- />
- <combo_box.item name="siding" label="revestimiento"
- />
- <combo_box.item name="stonetile" label="baldosa de piedra"
- />
- <combo_box.item name="stucco" label="estuco"
- />
- <combo_box.item name="suction" label="succión"
- />
- <combo_box.item name="weave" label="tejido"
- />
+ <combo_box.item label="Ninguno" name="None"/>
+ <combo_box.item label="Brillo" name="Brightness"/>
+ <combo_box.item label="Oscuro" name="Darkness"/>
+ <combo_box.item label="grano de madera" name="woodgrain"/>
+ <combo_box.item label="corteza" name="bark"/>
+ <combo_box.item label="ladrillos" name="bricks"/>
+ <combo_box.item label="cajero" name="checker"/>
+ <combo_box.item label="cemento" name="concrete"/>
+ <combo_box.item label="azulejería" name="crustytile"/>
+ <combo_box.item label="piedra cortada" name="cutstone"/>
+ <combo_box.item label="discos" name="discs"/>
+ <combo_box.item label="grava" name="gravel"/>
+ <combo_box.item label="placa de Petri" name="petridish"/>
+ <combo_box.item label="revestimiento" name="siding"/>
+ <combo_box.item label="baldosa de piedra" name="stonetile"/>
+ <combo_box.item label="estuco" name="stucco"/>
+ <combo_box.item label="succión" name="suction"/>
+ <combo_box.item label="tejido" name="weave"/>
</combo_box>
<text name="tex scale">
Repeticiones por cara
@@ -474,31 +442,23 @@
<check_box label="Voltear" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Voltear" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotación (grados)
- </text>
- <string name="string repeats per meter">
- Repeticiones por m.
- </string>
- <string name="string repeats per face">
- Repeticiones por cara
- </string>
- <text name="rpt">
- Repeticiones por m.
- </text>
- <spinner left="118" name="TexRot" width="62" />
- <spinner left="118" name="rptctrl" width="62" />
- <button label="Aplicar" label_selected="Aplicar" name="button apply" left_delta="72"/>
+ <spinner label="Rotación" left="118" name="TexRot" width="62"/>
+ <spinner label="Repeticiones / Metro" left="118" name="rptctrl" width="62"/>
+ <button label="Aplicar" label_selected="Aplicar" left_delta="72" name="button apply"/>
<text name="tex offset">
Desplazar
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertical (V)" name="TexOffsetV"/>
- <text name="textbox autofix" width="180">
- Centrar la textura para los media
-(primero debe subirla)
- </text>
- <button label="Alinear" label_selected="Alinear" name="button align" left="180"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Añadir un media"/>
+ <button name="delete_media" tool_tip="Borrar esta textura para media"/>
+ <button name="edit_media" tool_tip="Editar este media"/>
+ <button label="Centrar" label_selected="Centrar los media" name="button align" tool_tip="Centrar esta textura para media (primero debe cargarse)"/>
+ </panel>
</panel>
<panel label="Contenido " name="Contents">
<button label="Script nuevo" label_selected="Script nuevo" name="button new script"/>
@@ -513,59 +473,26 @@
Precio: [PRICE] L$ por [AREA] m²
</text>
<text name="label_area">
- Superficie: [AREA] m²
+ Ãrea: [AREA] m²
</text>
- <button label="Acerca del terreno..." label_selected="Acerca del terreno..." name="button about land" width="140"/>
- <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario: &#10;&#10;Verde = Su terreno &#10;Agua = Terreno de sus grupos &#10;Rojo = Propiedad de otros &#10;Amarillo = En venta &#10;Morado = Para subasta &#10;Gris = Público"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="150"/>
+ <button label="Acerca del terreno" label_selected="Acerca del terreno" name="button about land" width="140"/>
+ <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario:
+
+Verde = Su terreno
+Agua = Terreno de sus grupos
+Rojo = Propiedad de otros
+Amarillo = En venta
+Morado = Para subasta
+Gris = Público"/>
<text name="label_parcel_modify">
Modificar la parcela
</text>
- <button label="Subdividir" label_selected="Subdividir" name="button subdivide land" width="140"/>
- <button label="Unir" label_selected="Unir" name="button join land" width="140"/>
+ <button label="Dividir" label_selected="Dividir" name="button subdivide land" width="140"/>
+ <button label="Inscribirse" label_selected="Inscribirse" name="button join land" width="140"/>
<text name="label_parcel_trans">
Transacciones de terreno
</text>
<button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land" width="140"/>
<button label="Abandonar el terreno" label_selected="Abandonar el terreno" name="button abandon land" width="140"/>
</panel>
- <floater.string name="status_rotate">
- Arrastre las bandas de color para girar el objeto
- </floater.string>
- <floater.string name="status_scale">
- Pulse y arrastre para estirar el lado seleccionado
- </floater.string>
- <floater.string name="status_move">
- Arrastrar para mover, Mayús.+arrastrar para copiar
- </floater.string>
- <floater.string name="status_modifyland">
- Mantenga pulsado para modificar el terreno
- </floater.string>
- <floater.string name="status_camera">
- Pulse y arrastre para cambiar el punto de vista
- </floater.string>
- <floater.string name="status_grab">
- Arrastre para mover objetos: Ctrl, verticalmente; Ctrl-Mayús., para girarlos.
- </floater.string>
- <floater.string name="status_place">
- Pulse en el mundo para construir
- </floater.string>
- <floater.string name="status_selectland">
- Pulse y arrastre para seleccionar el terreno
- </floater.string>
- <floater.string name="grid_screen_text">
- Pantalla
- </floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referencia
- </floater.string>
- <floater.string name="grid_attachment_text">
- Añadido
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 95f2c39d42..d2311c734b 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="cargando...">
+<floater name="top_objects" title="Objetos superiores">
<text name="title_text">
Cargando...
</text>
@@ -23,13 +23,13 @@
</text>
<button label="Filtro" name="filter_object_btn" width="115"/>
<text name="owner_name_text" width="130">
- Nombre del propietario:
+ Propietario:
</text>
<button label="Filtro" name="filter_owner_btn" width="115"/>
<button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/>
- <button label="Devolver todo" name="return_all_btn" left="190"/>
+ <button label="Devolver todo" left="190" name="return_all_btn"/>
<button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/>
- <button label="Desactivar todo" name="disable_all_btn" left="190"/>
+ <button label="Desactivar todo" left="190" name="disable_all_btn"/>
<button label="Actualizar" name="refresh_btn" width="115"/>
<string name="top_scripts_title">
Scripts según su uso
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index d46c84cb03..cbacce304c 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -4,8 +4,7 @@
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<check_box label="Estoy de acuerdo con las Condiciones del Servicio" name="agree_chk"/>
<text name="tos_heading">
- Por favor, lea cuidadosamente las siguientes Condiciones del Servicio. Si quiere seguir
-iniciando sesión en [SECOND_LIFE], debe aceptar el acuerdo.
+ Por favor, lee detenidamente las siguientes Condiciones del Servicio. Para conectarte a [SECOND_LIFE], debes aceptar este acuerdo.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
new file mode 100644
index 0000000000..dfd03c6f83
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Controles de Voz">
+ <string name="title_nearby">
+ CHAT DE VOZ
+ </string>
+ <string name="title_group">
+ Multiconferencia de voz con [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Multiconferencia de voz
+ </string>
+ <string name="title_peer_2_peer">
+ Llamada: [NAME]
+ </string>
+ <string name="no_one_near">
+ No hay nadie cerca
+ </string>
+ <panel name="control_panel">
+ <layout_stack>
+ <layout_panel name="leave_btn_panel">
+ <button label="Colgar" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml
index 934fc7882b..9996860137 100644
--- a/indra/newview/skins/default/xui/es/floater_water.xml
+++ b/indra/newview/skins/default/xui/es/floater_water.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="Editor avanzado del agua">
+<floater name="Water Floater" title="EDITOR AVANZADO DEL AGUA">
<text name="KeyFramePresetsText">
Agua predefinida:
</text>
@@ -11,20 +11,20 @@
<text name="BHText">
Color del agua
</text>
- <button label="?" name="WaterFogColorHelp" left="175" />
- <color_swatch label="" name="WaterFogColor" tool_tip="Pulse para abrir el selector de color"/>
+ <button label="?" left="175" name="WaterFogColorHelp"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Pulsa para abrir el selector de color"/>
<text name="WaterFogDensText">
Transparencia
</text>
- <button label="?" name="WaterFogDensityHelp" left="175" />
+ <button label="?" left="175" name="WaterFogDensityHelp"/>
<text name="WaterUnderWaterFogModText">
Modificar la claridad del agua
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" left="175" />
+ <button label="?" left="175" name="WaterUnderWaterFogModHelp"/>
<text name="BDensText">
Tamaño de las ondulaciones
</text>
- <button label="?" name="WaterNormalScaleHelp" left="405"/>
+ <button label="?" left="405" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -37,29 +37,29 @@
<text name="HDText">
Escala de Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" left="405"/>
+ <button label="?" left="405" name="WaterFresnelScaleHelp"/>
<text name="FresnelOffsetText">
Coeficiente de reflexión
</text>
- <button label="?" name="WaterFresnelOffsetHelp" left="405"/>
+ <button label="?" left="405" name="WaterFresnelOffsetHelp"/>
<text name="DensMultText">
Refracción de la superficie
</text>
- <button label="?" name="WaterScaleAboveHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleAboveHelp"/>
<text name="WaterScaleBelowText">
Refracción bajo la superficie
</text>
- <button label="?" name="WaterScaleBelowHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleBelowHelp"/>
<text name="MaxAltText">
Desenfoque
</text>
- <button label="?" name="WaterBlurMultiplierHelp" left="640"/>
+ <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
</panel>
<panel label="Imagen" name="Waves">
<text name="BHText">
Sentido de la onda grande
</text>
- <button label="?" name="WaterWave1Help" left="170"/>
+ <button label="?" left="170" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
@@ -69,7 +69,7 @@
<text name="BHText2">
Sentido de la onda pequeña
</text>
- <button label="?" name="WaterWave2Help" left="170"/>
+ <button label="?" left="170" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..71b185aa0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry">
+ <text name="media_label">
+ Escribe una URL o un rango de URL para añadirla a lista de dominios autorizados
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Añade una URL o un rango de URL a la Lista Blanca"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
index e240dea0b5..0697f05553 100644
--- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="Editor avanzado del cielo">
+<floater name="WindLight floater" title="EDITOR AVANZADO DEL CIELO">
<text name="KeyFramePresetsText">
Cielos definidos:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml
index 6521e72d5a..37c4e2a377 100644
--- a/indra/newview/skins/default/xui/es/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_world_map.xml
@@ -1,57 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Mapa del Mundo">
- <tab_container name="maptab">
- <panel label="Objetos" name="objects_mapview"/>
- <panel label="Terreno" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Usted
- </text>
- <text name="home_label">
- Base
- </text>
- <text name="auction_label">
- Subasta
- </text>
- <text name="land_for_sale_label">
- Terreno en venta
- </text>
- <button label="Ir a la Base" label_selected="Ir a la Base" name="Go Home" tool_tip="Teleportar a su Base"/>
- <check_box label="Residente" name="people_chk"/>
- <check_box label="Punto de Info" name="infohub_chk"/>
- <check_box label="Punto de Teleporte" name="telehubchk"/>
- <check_box label="Terreno en venta" name="land_for_sale_chk"/>
- <text name="events_label">
- Eventos:
- </text>
- <check_box label="&apos;PG&apos;" name="event_chk"/>
- <check_box label="&apos;Mature&apos;" name="event_mature_chk"/>
- <check_box label="&apos;Adult&apos;" name="event_adult_chk"/>
- <combo_box label="Amigos conectados" name="friend combo" tool_tip="Amigo a mostrar en el mapa">
- <combo_box.item name="item1" label="Amigos conectados" />
- </combo_box>
- <combo_box label="Hitos" name="landmark combo" tool_tip="Hito a mostrar en el mapa">
- <combo_box.item name="item1" label="Hitos" />
- </combo_box>
- <line_editor label="Buscar por el nombre de la región" name="location" tool_tip="Escriba el nombre de una región"/>
- <button label="Buscar" name="DoSearch" tool_tip="Buscar una región"/>
- <text name="search_label">
- Resultados de la búsqueda:
- </text>
- <scroll_list name="search_results">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Localización:
- </text>
- <spinner name="spin x" tool_tip="Coordenada X de la posición a mostrar en el mapa"/>
- <spinner name="spin y" tool_tip="Coordenada Y de la posición a mostrar en el mapa"/>
- <spinner name="spin z" tool_tip="Coordenada Z de la posición a mostrar en el mapa"/>
- <button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportarse a la localización elegida"/>
- <button label="Mostrar el destino" label_selected="Mostrar el destino" name="Show Destination" tool_tip="Centrar el mapa en la localización elegida"/>
- <button label="Limpiar" label_selected="Limpiar" name="Clear" tool_tip="Parar la búsqueda"/>
- <button label="Mostrar mi posición" label_selected="Mostrar mi posición" name="Show My Location" tool_tip="Centrar el mapa en la posición de su avatar"/>
- <button label="Copiar la SLurl al portapapeles" name="copy_slurl" tool_tip="Copiar la posición actual como una SLurl, para usarla en la web."/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="MAPA DEL MUNDO">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Leyenda
+ </text>
+ </panel>
+ <panel>
+ <button label="Mostrar mi posición" label_selected="Mostrar mi posición" name="Show My Location" tool_tip="Centrar el mapa en la posición de mi avatar"/>
+ <text name="person_label">
+ Yo
+ </text>
+ <check_box label="Residente" name="people_chk"/>
+ <check_box label="Punto de Info" name="infohub_chk"/>
+ <text name="infohub_label">
+ Punto de Info
+ </text>
+ <check_box label="Terreno en venta" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ Venta de terreno
+ </text>
+ <text name="auction_label">
+ por el propietario
+ </text>
+ <button label="Ir a la Base" label_selected="Ir a la Base" name="Go Home" tool_tip="Teleportar a mi Base"/>
+ <text name="Home_label">
+ Base
+ </text>
+ <text name="events_label">
+ Eventos:
+ </text>
+ <check_box label="&apos;PG&apos;" name="event_chk"/>
+ <check_box initial_value="true" label="&apos;Mature&apos;" name="event_mature_chk"/>
+ <text name="mature_label">
+ Mature
+ </text>
+ <check_box label="&apos;Adult&apos;" name="event_adult_chk"/>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Encontrar en el mapa
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Amigos conectados" name="friend combo" tool_tip="Ver a los amigos en el mapa">
+ <combo_box.item label="Mis amigos conectados" name="item1"/>
+ </combo_box>
+ <combo_box label="Mis hitos" name="landmark combo" tool_tip="Hito a ver en el mapa">
+ <combo_box.item label="Mis hitos" name="item1"/>
+ </combo_box>
+ <search_editor label="Regiones alfabéticamente" name="location" tool_tip="Escriba el nombre de una región"/>
+ <button label="Encontrar" name="DoSearch" tool_tip="Buscar una región"/>
+ <scroll_list name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportarse a la localización elegida"/>
+ <button label="Copiar la SLurl" name="copy_slurl" tool_tip="Copiar la SLurl de esta posición para usarla en una web."/>
+ <button label="Ver lo elegido" label_selected="Mostrar el destino" name="Show Destination" tool_tip="Centrar el mapa en la localización elegida"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml
new file mode 100644
index 0000000000..dff09aaace
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/>
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Más" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Desactivar la voz" name="disable_voice"/>
+ <button label="Activar la voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_group.xml b/indra/newview/skins/default/xui/es/inspect_group.xml
new file mode 100644
index 0000000000..ba10b19f41
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Grupo privado
+ </string>
+ <string name="FreeToJoin">
+ Inscripción gratuita
+ </string>
+ <string name="CostToJoin">
+ Inscribirse cuesta [AMOUNT] L$
+ </string>
+ <string name="YouAreMember">
+ Eres miembro
+ </string>
+ <button label="Inscribirse" name="join_btn"/>
+ <button label="Abandonar" name="leave_btn"/>
+ <button label="Ver el perfil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_object.xml b/indra/newview/skins/default/xui/es/inspect_object.xml
new file mode 100644
index 0000000000..6a831def07
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_object.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Por [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ por [CREATOR]
+propietario [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ ¡Gratis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentarme
+ </string>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Coger una copia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentarme" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegación segura"/>
+ <button label="Más" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_remote_object.xml b/indra/newview/skins/default/xui/es/inspect_remote_object.xml
new file mode 100644
index 0000000000..f814e84a6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Propietario:
+ </text>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Ignorar" name="block_btn"/>
+ <button label="Cerrar" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_other.xml b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
new file mode 100644
index 0000000000..12acb572dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
new file mode 100644
index 0000000000..c5afb99d49
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Quitar" name="Detach"/>
+ <menu_item_call label="Soltar" name="Drop"/>
+ <menu_item_call label="Levantarse" name="Stand Up"/>
+ <menu_item_call label="Mi apariencia" name="Appearance..."/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_icon.xml b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml
new file mode 100644
index 0000000000..fe7331a108
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar un MI..." name="Send IM"/>
+ <menu_item_call label="Añadir como amigo..." name="Add Friend"/>
+ <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_other.xml b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
new file mode 100644
index 0000000000..83801e872d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
new file mode 100644
index 0000000000..8d3790a4d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Levantarse" name="Stand Up"/>
+ <context_menu label="Quitarse &gt;" name="Take Off &gt;">
+ <context_menu label="Ropa &gt;" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Calcetines" name="Socks"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Ropa interior" name="Self Underpants"/>
+ <menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Toda la ropa" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD &gt;" name="Object Detach HUD"/>
+ <context_menu label="Quitarse &gt;" name="Object Detach"/>
+ <menu_item_call label="Quitarse todo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Mi apariencia" name="Appearance..."/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
new file mode 100644
index 0000000000..8169563882
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
+ <menu_item_check label="Botón Vista" name="ShowCameraButton"/>
+ <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
new file mode 100644
index 0000000000..c8a7858ddb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
+ <menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Pegar" name="Landmark Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_gesture_gear.xml b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml
new file mode 100644
index 0000000000..24706eb2c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Copiar la UUID" name="copy_uuid"/>
+ <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Inspeccionar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_group_plus.xml b/indra/newview/skins/default/xui/es/menu_group_plus.xml
new file mode 100644
index 0000000000..6b26ba42c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar al grupo..." name="item_join"/>
+ <menu_item_call label="Grupo nuevo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
new file mode 100644
index 0000000000..7fc1af00c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..e11e9bdc58
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..a5e60ea40b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Información del grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar la sesión" name="Chat"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..492801026c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="Mostrar la sesión" name="Send IM"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..c6728f948d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ver el perfil" name="view_profile"/>
+ <menu_item_call label="Añadir como amigo" name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Llamada" name="call"/>
+ <menu_item_call label="Teleportarse" name="teleport"/>
+ <menu_item_call label="Invitar al grupo" name="invite_to_group"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Expulsar" name="eject"/>
+ <menu_item_call label="Depurar" name="debug"/>
+ <menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+ <menu_item_call label="Pagar" name="pay"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..af85b833e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentarse" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Tomar" name="take"/>
+ <menu_item_call label="Coger una copia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Ponerse" name="wear"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+ <menu_item_call label="Quitar" name="remove"/>
+ <menu_item_call label="Más información" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..cb8fb82f0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Levantarse" name="stand_up"/>
+ <menu_item_call label="Mi apariencia" name="my_appearance"/>
+ <menu_item_call label="Mi perfil" name="my_profile"/>
+ <menu_item_call label="Mis amigos" name="my_friends"/>
+ <menu_item_call label="Mis grupos" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index 28d47fce52..ae3eb1c845 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Script nuevo" name="New Script"/>
<menu_item_call label="Nota nueva" name="New Note"/>
<menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu name="New Clothes" label="Nueva ropa">
+ <menu label="Ropas nuevas" name="New Clothes">
<menu_item_call label="Camisa nueva" name="New Shirt"/>
<menu_item_call label="Pantalones nuevos" name="New Pants"/>
<menu_item_call label="Zapatos nuevos" name="New Shoes"/>
@@ -22,31 +22,47 @@
<menu_item_call label="Guantes nuevos" name="New Gloves"/>
<menu_item_call label="Camiseta nueva" name="New Undershirt"/>
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts" label="Nuevas partes del cuerpo">
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
<menu_item_call label="Piel nueva" name="New Skin"/>
<menu_item_call label="Pelo nuevo" name="New Hair"/>
<menu_item_call label="Ojos nuevos" name="New Eyes"/>
</menu>
+ <menu label="Change Type" name="Change Type">
+ <menu_item_call label="Por defecto" name="Default"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Forma" name="Shape"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Ropa interior" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teleportar" name="Landmark Open"/>
<menu_item_call label="Abrir" name="Animation Open"/>
<menu_item_call label="Abrir" name="Sound Open"/>
<menu_item_call label="Eliminar el ítem" name="Purge Item"/>
<menu_item_call label="Restaurar el ítem" name="Restore Item"/>
+ <menu_item_call label="Ir al enlace" name="Goto Link"/>
<menu_item_call label="Abrir" name="Open"/>
<menu_item_call label="Propiedades" name="Properties"/>
<menu_item_call label="Renombrar" name="Rename"/>
<menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/>
<menu_item_call label="Copiar" name="Copy"/>
<menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Pegar como enlace" name="Paste As Link"/>
<menu_item_call label="Borrar" name="Delete"/>
<menu_item_call label="Quitarse los ítems" name="Take Off Items"/>
<menu_item_call label="Añadir al vestuario" name="Add To Outfit"/>
<menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/>
<menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
<menu_item_call label="Escuchar" name="Sound Play"/>
- <menu_item_call label="Acerca del hito" name="Teleport To Landmark"/>
+ <menu_item_call label="Acerca del hito" name="About Landmark"/>
<menu_item_call label="Ver en el mundo" name="Animation Play"/>
<menu_item_call label="Ejecutarla para usted" name="Animation Audition"/>
<menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/>
@@ -54,8 +70,8 @@
<menu_item_call label="Empezar multiconferencia" name="Conference Chat"/>
<menu_item_call label="Activar" name="Activate"/>
<menu_item_call label="Desactivar" name="Deactivate"/>
+ <menu_item_call label="Guardar como" name="Save As"/>
<menu_item_call label="Quitarse" name="Detach From Yourself"/>
- <menu_item_call label="Volver a la última posición" name="Restore to Last Position"/>
<menu_item_call label="Ponerse" name="Object Wear"/>
<menu label="Anexar a" name="Attach To"/>
<menu label="Anexar como HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
new file mode 100644
index 0000000000..91cb4a08ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Subir" name="upload">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Carpeta nueva" name="New Folder"/>
+ <menu_item_call label="Script nuevo" name="New Script"/>
+ <menu_item_call label="Nota nueva" name="New Note"/>
+ <menu_item_call label="Gesto nuevo" name="New Gesture"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Forma nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..80cf78c0b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nueva ventana del inventario" name="new_window"/>
+ <menu_item_call label="Ordenar alfabéticamente" name="sort_by_name"/>
+ <menu_item_call label="Ordenar por los más recientes" name="sort_by_recent"/>
+ <menu_item_call label="Ver los filtros" name="show_filters"/>
+ <menu_item_call label="Restablecer los filtros" name="reset_filters"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
+ <menu_item_call label="Vaciar la Papelera" name="empty_trash"/>
+ <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Guardar la textura como" name="Save Texture As"/>
+ <menu_item_call label="Encontrar el original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_land.xml b/indra/newview/skins/default/xui/es/menu_land.xml
new file mode 100644
index 0000000000..c315cb2f2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Acerca del terreno" name="Place Information..."/>
+ <menu_item_call label="Sentarse aquí" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar un pase" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Modificar el terreno" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_landmark.xml b/indra/newview/skins/default/xui/es/menu_landmark.xml
new file mode 100644
index 0000000000..f69b1539b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar la SLurl" name="copy"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Crear un Destacado" name="pick"/>
+ <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index 1cf6ad5ae6..7e1a537122 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -1,13 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Archivo" name="File">
+ <menu label="Yo" name="File">
+ <menu_item_call label="Preferencias" name="Preferences..."/>
<menu_item_call label="Salir" name="Quit"/>
</menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Preferencias..." name="Preferences..."/>
- </menu>
<menu label="Ayuda" name="Help">
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/>
+ </menu>
+ <menu label="Depurar" name="Debug">
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Duplicar" name="Duplicate"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
+ <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/>
+ <menu_item_call label="Mostrar el panel lateral" name="Show Side Tray"/>
+ <menu label="Pruebas de la interfaz" name="UI Tests"/>
+ <menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
+ <menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
+ <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/menu_mini_map.xml b/indra/newview/skins/default/xui/es/menu_mini_map.xml
index 19061cea06..9c5a5719ee 100644
--- a/indra/newview/skins/default/xui/es/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/es/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom cerca" name="Zoom Close"/>
<menu_item_call label="Zoom medio" name="Zoom Medium"/>
<menu_item_call label="Zoom lejos" name="Zoom Far"/>
+ <menu_item_check label="Girar el mapa" name="Rotate Map"/>
<menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
- <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Mapa del mundo" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_navbar.xml b/indra/newview/skins/default/xui/es/menu_navbar.xml
new file mode 100644
index 0000000000..63e5468020
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
+ <menu_item_call label="Hito" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_nearby_chat.xml b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml
new file mode 100644
index 0000000000..94b281b6c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/>
+ <menu_item_check label="Ver el texto ignorado" name="muted_text"/>
+ <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar los nombres" name="show_names"/>
+ <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/>
+ <menu_item_call label="Tamaño de la fuente" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml
new file mode 100644
index 0000000000..2d701a89c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_object.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentarse aquí" name="Object Sit"/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+ <context_menu label="Poner &gt;" name="Put On">
+ <menu_item_call label="Ponerse" name="Wear"/>
+ <context_menu label="Anexar &gt;" name="Object Attach"/>
+ <context_menu label="Anexar el HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Quitar &gt;" name="Remove">
+ <menu_item_call label="Tomar" name="Pie Object Take"/>
+ <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
+ <menu_item_call label="Ignorar" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml
new file mode 100644
index 0000000000..7e4578b950
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil del objeto..." name="Object Profile"/>
+ <menu_item_call label="Ignorar..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_participant_list.xml b/indra/newview/skins/default/xui/es/menu_participant_list.xml
new file mode 100644
index 0000000000..bc7e2617be
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_participant_list.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <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_check label="Silenciar el texto" name="MuteText"/>
+ <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/>
+ <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Silenciar a todos los demás" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Quitar el silencio a todos los demás" name="ModerateVoiceUnMuteOthers"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..0e883be00e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar por estatus" name="sort_status"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..1bd3efb611
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/>
+ <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
new file mode 100644
index 0000000000..310a96d740
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..7d6979256e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Añadir como amigos" name="Add Friends"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..f0fe383c0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar según distancia" name="sort_distance"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..e4aaa89110
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por los más recientes" name="sort_most"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_picks.xml b/indra/newview/skins/default/xui/es/menu_picks.xml
new file mode 100644
index 0000000000..9da68d7c9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Información" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teleportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Eliminar" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_picks_plus.xml b/indra/newview/skins/default/xui/es/menu_picks_plus.xml
new file mode 100644
index 0000000000..cc59bf1d29
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Destacado nuevo" name="create_pick"/>
+ <menu_item_call label="Clasificado nuevo" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_place.xml b/indra/newview/skins/default/xui/es/menu_place.xml
new file mode 100644
index 0000000000..675f0699e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Crear un hito" name="landmark"/>
+ <menu_item_call label="Crear un destacado" name="pick"/>
+ <menu_item_call label="Comprar un pase" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_place_add_button.xml b/indra/newview/skins/default/xui/es/menu_place_add_button.xml
new file mode 100644
index 0000000000..4b2f908a06
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..bf46eb58e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Abrir" name="expand"/>
+ <menu_item_call label="Cerrar" name="collapse"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..eac85de846
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportar" name="teleport"/>
+ <menu_item_call label="Más información" name="more_info"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Añadir un hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar el hito" name="copy_landmark"/>
+ <menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Eliminar" name="delete"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+ <menu_item_call label="Crear un Destacado" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_profile_overflow.xml b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
new file mode 100644
index 0000000000..c1e01f0554
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartir" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_slurl.xml b/indra/newview/skins/default/xui/es/menu_slurl.xml
index 5c5900ae56..ca19acec6e 100644
--- a/indra/newview/skins/default/xui/es/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/es/menu_slurl.xml
@@ -2,5 +2,5 @@
<menu name="Popup">
<menu_item_call label="Acerca de la URL" name="about_url"/>
<menu_item_call label="Teleportar a la URL" name="teleport_to_url"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..b708f3bc20
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/>
+ <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ed33c55aca
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Más información" name="More Information"/>
+ <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..17e90422a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Cerrar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_text_editor.xml b/indra/newview/skins/default/xui/es/menu_text_editor.xml
new file mode 100644
index 0000000000..095e461734
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml
new file mode 100644
index 0000000000..a089c8f68e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_group.xml b/indra/newview/skins/default/xui/es/menu_url_group.xml
new file mode 100644
index 0000000000..79374b9739
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del grupo" name="show_group"/>
+ <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_http.xml b/indra/newview/skins/default/xui/es/menu_url_http.xml
new file mode 100644
index 0000000000..585c059ff3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir la página web" name="url_open"/>
+ <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/>
+ <menu_item_call label="Abrir en mi navegador" name="url_open_external"/>
+ <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_inventory.xml b/indra/newview/skins/default/xui/es/menu_url_inventory.xml
new file mode 100644
index 0000000000..13a8711c76
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar ítem del inventario" name="show_item"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_map.xml b/indra/newview/skins/default/xui/es/menu_url_map.xml
new file mode 100644
index 0000000000..f96a0c7170
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
new file mode 100644
index 0000000000..8791a290af
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del objeto" name="show_object"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_parcel.xml b/indra/newview/skins/default/xui/es/menu_url_parcel.xml
new file mode 100644
index 0000000000..9e789ef8ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_slapp.xml b/indra/newview/skins/default/xui/es/menu_url_slapp.xml
new file mode 100644
index 0000000000..7147dcd3cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ejecutar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_slurl.xml b/indra/newview/skins/default/xui/es/menu_url_slurl.xml
new file mode 100644
index 0000000000..4ab47c2f61
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del lugar" name="show_place"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_teleport.xml b/indra/newview/skins/default/xui/es/menu_url_teleport.xml
new file mode 100644
index 0000000000..8f86a91be3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleportarse a este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 33754f3935..acd7319b31 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,211 +1,326 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Archivo" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Subir" name="upload">
- <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Masiva ([COST] L$ por archivo)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Definir los permisos por defecto..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cerrar la ventana" name="Close Window"/>
- <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Guardar la textura como..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Hacer una foto" name="Take Snapshot"/>
- <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Salir" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Deshacer" name="Undo"/>
- <menu_item_call label="Rehacer" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Buscar..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Seleccionar todo" name="Select All"/>
- <menu_item_call label="Deseleccionar" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplicar" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Anexar el objeto" name="Attach Object"/>
- <menu label="Quitarse el objeto" name="Detach Object"/>
- <menu label="Quitarse ropa" name="Take Off Clothing">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Pantalones" name="Pants"/>
- <menu_item_call label="Zapatos" name="Shoes"/>
- <menu_item_call label="Calcetines" name="Socks"/>
- <menu_item_call label="Chaqueta" name="Jacket"/>
- <menu_item_call label="Guantes" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Menu Undershirt"/>
- <menu_item_call label="Ropa interior" name="Menu Underpants"/>
- <menu_item_call label="Falda" name="Skirt"/>
- <menu_item_call label="Toda la ropa" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gestos..." name="Gestures..."/>
- <menu_item_call label="Perfil..." name="Profile..."/>
- <menu_item_call label="Apariencia..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amigos..." name="Friends..."/>
- <menu_item_call label="Grupos..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Preferencias..." name="Preferences..."/>
+ <menu label="Yo" name="Me">
+ <menu_item_call label="Preferencias" name="Preferences"/>
+ <menu_item_call label="Mi panel de control" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
+ </menu_item_call>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Mi perfil" name="Profile"/>
+ <menu_item_call label="Mi apariencia" name="Appearance"/>
+ <menu_item_check label="Mi Inventario" name="Inventory"/>
+ <menu_item_call label="Mostrar el inventario en el panel lateral" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Mis gestos" name="Gestures"/>
+ <menu label="Mi estatus" name="Status">
+ <menu_item_call label="Ausente" name="Set Away"/>
+ <menu_item_call label="Ocupado" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/>
+ <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/>
+ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Ver" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Vista subjetiva" name="Mouselook"/>
- <menu_item_check label="Construir" name="Build"/>
- <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/>
- <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
- <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Barra de herramientas" name="Toolbar"/>
- <menu_item_check label="Chat" name="Chat History"/>
- <menu_item_check label="Comunicarse" name="Instant Message"/>
- <menu_item_check label="Inventario" name="Inventory"/>
- <menu_item_check label="Participantes activos" name="Active Speakers"/>
- <menu_item_check label="Lista de ignorados" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Controles de la cámara" name="Camera Controls"/>
- <menu_item_check label="Controles del movimiento" name="Movement Controls"/>
- <menu_item_check label="Mapa del mundo" name="World Map"/>
- <menu_item_check label="Minimapa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Estadísticas" name="Statistics Bar"/>
- <menu_item_check label="Límites de las parcelas" name="Property Lines"/>
- <menu_item_check label="Líneas de prohibición" name="Banlines"/>
- <menu_item_check label="Propietarios del terreno" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Información adicional" name="Hover Tips">
- <menu_item_check label="Mostrar información adicional." name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Información adicional del terreno" name="Land Tips"/>
- <menu_item_check label="Información adicional en todos los objetos" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/>
- <menu_item_check label="Balizas" name="beacons"/>
- <menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
- <menu_item_check label="Mostrar los HUD en uso" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Acercar el zoom" name="Zoom In"/>
- <menu_item_call label="Zoom predeterminado" name="Zoom Default"/>
- <menu_item_call label="Alejar el zoom" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Pantalla completa" name="Toggle Fullscreen"/>
- <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu label="Comunicarse" name="Communicate">
+ <menu_item_call label="Mis amigos" name="My Friends"/>
+ <menu_item_call label="Mis grupos" name="My Groups"/>
+ <menu_item_check label="Chat" name="Nearby Chat"/>
+ <menu_item_call label="Gente cerca" name="Active Speakers"/>
+ <menu_item_check label="Media cercanos" name="Nearby Media"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Correr siempre" name="Always Run"/>
- <menu_item_check label="Volar" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Crear aquí un hito" name="Create Landmark Here"/>
- <menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleportar a mi Base" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Pasar al estado ausente" name="Set Away"/>
- <menu_item_call label="Pasar al estado ocupado" name="Set Busy"/>
- <menu_item_call label="Parar la animación de mi avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Historial de mi cuenta..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Administrar mi cuenta..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mi terreno..." name="My Land..."/>
- <menu_item_call label="Acerca del terreno..." name="About Land..."/>
- <menu_item_call label="Comprar terreno..." name="Buy Land..."/>
- <menu_item_call label="Region/Estado..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Configuración del entorno" name="Environment Settings">
+ <menu_item_check label="Moverse" name="Movement Controls"/>
+ <menu_item_check label="Vista" name="Camera Controls"/>
+ <menu_item_call label="Acerca del terreno" name="About Land"/>
+ <menu_item_call label="Región/Estado" name="Region/Estate"/>
+ <menu_item_call label="Comprar terreno" name="Buy Land"/>
+ <menu_item_call label="Mi terreno" name="My Land"/>
+ <menu label="Mostrar" name="Land">
+ <menu_item_check label="Líneas de prohibición" name="Ban Lines"/>
+ <menu_item_check label="Balizas" name="beacons"/>
+ <menu_item_check label="Límites de las parcelas" name="Property Lines"/>
+ <menu_item_check label="Propietarios del terreno" name="Land Owners"/>
+ </menu>
+ <menu label="Hitos" name="Landmarks">
+ <menu_item_call label="Crear aquí un hito" name="Create Landmark Here"/>
+ <menu_item_call label="Fijar mi base aquí" name="Set Home to Here"/>
+ </menu>
+ <menu_item_call label="Base" name="Teleport Home"/>
+ <menu_item_check label="Minimapa" name="Mini-Map"/>
+ <menu_item_check label="Mapa del mundo" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanecer" name="Sunrise"/>
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
- <menu_item_call label="Volver a los valores por defecto de la región" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Usar el horario del estado" name="Revert to Region Default"/>
<menu_item_call label="Editor del entorno" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Herramientas" name="Tools">
- <menu label="Elegir una herramienta" name="Select Tool">
- <menu_item_call label="Visión" name="Focus"/>
- <menu_item_call label="Moverse" name="Move"/>
- <menu_item_call label="Modificar" name="Edit"/>
- <menu_item_call label="Crear" name="Create"/>
- <menu_item_call label="Terreno" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/>
- <menu_item_check label="Seleccionar sólo objetos movibles" name="Select Only Movable Objects"/>
- <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/>
- <menu_item_check label="Al seleccionar, mostrar los ocultos" name="Show Hidden Selection"/>
- <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostrar rayo indicador" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Ajustar a la cuadrícula" name="Snap to Grid"/>
- <menu_item_call label="Ajustar a la cuadrícula los ejes X e Y" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usar lo seleccionado como cuadrícula" name="Use Selection for Grid"/>
- <menu_item_call label="Opciones de la cuadrícula..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/>
+ <menu label="Construir" name="BuildTools">
+ <menu_item_check label="Construir" name="Show Build Tools"/>
+ <menu label="Seleccionar la herramienta de construcción" name="Select Tool">
+ <menu_item_call label="Herramienta Visión" name="Focus"/>
+ <menu_item_call label="Herramienta Mover" name="Move"/>
+ <menu_item_call label="Herramienta Editar" name="Edit"/>
+ <menu_item_call label="Herramienta Crear" name="Create"/>
+ <menu_item_call label="Herramienta Terreno" name="Land"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ <menu_item_call label="Duplicar" name="Duplicate"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+ </menu>
<menu_item_call label="Enlazar" name="Link"/>
<menu_item_call label="Desenlazar" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
<menu_item_call label="Visión en lo seleccionado" name="Focus on Selection"/>
<menu_item_call label="Zoom en lo seleccionado" name="Zoom to Selection"/>
- <menu_item_call label="Comprar el objeto" name="Menu Object Take">
- <on_enable userdata="Comprar el objeto,Coger el objeto" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Coger una copia" name="Take Copy"/>
- <menu_item_call label="Devolver una copia del objeto a los contenidos de donde salió" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Ver en una ventana los errores o alertas de los scripts" name="Show Script Warning/Error Window"/>
- <menu label="Recompilar los scripts en lo seleccionado" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Reiniciar los scripts en lo seleccionado" name="Reset Scripts in Selection"/>
- <menu_item_call label="Definir los scripts a ejecutar en lo seleccionado" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Definir los scripts a no ejecutar en lo seleccionado" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Objeto" name="Object">
+ <menu_item_call label="Comprar" name="Menu Object Take"/>
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Guardar una copia en mi inventario" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Guardar una copia del objeto en los contenidos de donde salió" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompilar los scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Recompilar los scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Reiniciar los scripts" name="Reset Scripts"/>
+ <menu_item_call label="Definir los scripts a ejecutar" name="Set Scripts to Running"/>
+ <menu_item_call label="Configurar scripts como no ejecutándose" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opciones" name="Options">
+ <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/>
+ <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
+ <menu_item_check label="Mostrar los permisos avanzados" name="DebugPermissions"/>
+ <menu label="Selección" name="Selection">
+ <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/>
+ <menu_item_check label="Seleccionar sólo los objetos movibles" name="Select Only Movable Objects"/>
+ <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/>
+ </menu>
+ <menu label="Mostrar" name="Show">
+ <menu_item_check label="Al seleccionar, mostrar lo oculto" name="Show Hidden Selection"/>
+ <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Mostrar el rayo indicador" name="Show Selection Beam"/>
+ </menu>
+ <menu label="Cuadrícula" name="Grid">
+ <menu_item_check label="Ajustar a la cuadrícula" name="Snap to Grid"/>
+ <menu_item_call label="Ajustar a la cuadrícula los ejes X e Y" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Usar lo seleccionado como cuadrícula" name="Use Selection for Grid"/>
+ <menu_item_call label="Opciones de la cuadrícula" name="Grid Options"/>
+ </menu>
+ </menu>
+ <menu label="Seleccionar las partes enlazadas" name="Select Linked Parts">
+ <menu_item_call label="Seleccionar la parte siguiente" name="Select Next Part"/>
+ <menu_item_call label="Seleccionar la parte previa" name="Select Previous Part"/>
+ <menu_item_call label="Incluir la parte siguiente" name="Include Next Part"/>
+ <menu_item_call label="Incluir la parte previa" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Ayuda" name="Help">
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
<menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog oficial..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal de programación..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Denunciar una infracción..." name="Report Abuse..."/>
- <menu_item_call label="Choques, empujones, e impactos..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Medidor del lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Informes de fallos" name="Bug Reporting">
- <menu_item_call label="Public Issue Tracker..." name="Public Issue Tracker..."/>
- <menu_item_call label="Ayuda del Public Issue Tracker..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Informes de fallos - instrucciones..." name="Bug Reporing 101..."/>
- <menu_item_call label="Problemas de seguridad..." name="Security Issues..."/>
- <menu_item_call label="Wiki QA..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Informar de un fallo..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Denunciar una infracción" name="Report Abuse"/>
+ <menu_item_call label="Informar de un fallo" name="Report Bug"/>
+ </menu>
+ <menu label="Avanzado" name="Advanced">
+ <menu_item_check label="Pasar al estado ausente tras 30 min." name="Go Away/AFK When Idle"/>
+ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Recargar las texturas" name="Rebake Texture"/>
+ <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu_item_check label="Limitar la distancia para Seleccionar" name="Limit Select Distance"/>
+ <menu_item_check label="Desactivar los límites de la cámara" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto en Alta Resolución" name="HighResSnapshot"/>
+ <menu_item_check label="Silenciar el Guardar una foto" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Comprimir las fotos para el disco duro" name="CompressSnapshotsToDisk"/>
+ <menu label="Herramientas de rendimiento" name="Performance Tools">
+ <menu_item_call label="Medidor de lag" name="Lag Meter"/>
+ <menu_item_check label="Estadísticas" name="Statistics Bar"/>
+ <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Realzando y Visibilidad" name="Highlighting and Visibility">
+ <menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
+ <menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
+ <menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/>
+ <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/>
+ <menu_item_check label="Mostrar los HUD anexados" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostrar el Punto de Mira en la vista subjetiva" name="ShowCrosshairs"/>
+ <menu_item_check label="Mostrar información complementaria del terreno" name="Land Tips"/>
+ </menu>
+ <menu label="Objetos representados" name="Rendering Types">
+ <menu_item_check label="Simple" name="Simple"/>
+ <menu_item_check label="Alfa" name="Alpha"/>
+ <menu_item_check label="Ãrbol" name="Tree"/>
+ <menu_item_check label="Avatares" name="Character"/>
+ <menu_item_check label="Superficie del terreno" name="SurfacePath"/>
+ <menu_item_check label="Cielo" name="Sky"/>
+ <menu_item_check label="Agua" name="Water"/>
+ <menu_item_check label="Terreno" name="Ground"/>
+ <menu_item_check label="volumen" name="Volume"/>
+ <menu_item_check label="Hierba" name="Grass"/>
+ <menu_item_check label="Nubes" name="Clouds"/>
+ <menu_item_check label="Partículas" name="Particles"/>
+ <menu_item_check label="Efectos de relieve" name="Bump"/>
+ </menu>
+ <menu label="Rasgos renderizados" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Seleccionado" name="Selected"/>
+ <menu_item_check label="Realzados" name="Highlighted"/>
+ <menu_item_check label="Texturas dinámicas" name="Dynamic Textures"/>
+ <menu_item_check label="Huellas" name="Foot Shadows"/>
+ <menu_item_check label="Niebla" name="Fog"/>
+ <menu_item_check label="Objetos flexibles" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Ejecutar múltiples temas" name="Run Multiple Threads"/>
+ <menu_item_call label="Vaciar la caché de grupo" name="ClearGroupCache"/>
+ <menu_item_check label="Vista subjetiva suavizada" name="Mouse Smoothing"/>
+ <menu_item_check label="Mostrar los MI en el chat" name="IMInChat"/>
+ <menu label="Atajos de teclado" name="Shortcuts">
+ <menu_item_check label="Buscar" name="Search"/>
+ <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
+ <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu_item_check label="Correr siempre" name="Always Run"/>
+ <menu_item_check label="Volar" name="Fly"/>
+ <menu_item_call label="Cerrar la ventana" name="Close Window"/>
+ <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
+ <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/>
+ <menu_item_call label="Vista subjetiva" name="Mouselook"/>
+ <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/>
+ <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
+ <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
+ <menu label="Seleccionar la herramienta de construcción" name="Select Tool">
+ <menu_item_call label="Herramienta Visión" name="Focus"/>
+ <menu_item_call label="Herramienta Mover" name="Move"/>
+ <menu_item_call label="Herramienta Editar" name="Edit"/>
+ <menu_item_call label="Herramienta Crear" name="Create"/>
+ <menu_item_call label="Herramienta Terreno" name="Land"/>
+ </menu>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Zoom por defecto" name="Zoom Default"/>
+ <menu_item_call label="Alejar el zoom" name="Zoom Out"/>
+ <menu_item_call label="Pantalla completa" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
+ <menu_item_check label="Mostrar el menú Desarrollar" name="Debug Mode"/>
+ </menu>
+ <menu label="Develop" name="Develop">
+ <menu label="Consoles" name="Consoles">
+ <menu_item_check label="Texture Console" name="Texture Console"/>
+ <menu_item_check label="Debug Console" name="Debug Console"/>
+ <menu_item_call label="Notifications Console" name="Notifications"/>
+ <menu_item_check label="Texture Size Console" name="Texture Size"/>
+ <menu_item_check label="Texture Category Console" name="Texture Category"/>
+ <menu_item_check label="Fast Timers" name="Fast Timers"/>
+ <menu_item_check label="Memory" name="Memory"/>
+ <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_check label="Wind" name="Wind"/>
+ </menu>
+ <menu label="Show Info" name="Display Info">
+ <menu_item_check label="Show Time" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Show Updates to Objects" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="FForce LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Ejes" name="Axes"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Global Illumination" name="Global Illumination"/>
+ <menu_item_check label="Animation Textures" name="Animation Textures"/>
+ <menu_item_check label="Disable Textures" name="Disable Textures"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Red" name="Network">
+ <menu_item_check label="Pause Avatar" name="AgentPause"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="World" name="World">
+ <menu_item_check label="Region Sun Override" name="Sim Sun Override"/>
+ <menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
+ <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Memory Stats" name="Memory Stats"/>
+ <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
+ <menu_item_call label="Show Font Test" name="Show Font Test"/>
+ <menu_item_call label="Load from XML" name="Load from XML"/>
+ <menu_item_call label="Save to XML" name="Save to XML"/>
+ <menu_item_check label="Show XUI Names" name="Show XUI Names"/>
+ <menu_item_call label="Send Test IMs" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Cabeza" name="Head"/>
+ <menu_item_call label="Upper Body" name="Upper Body"/>
+ <menu_item_call label="Lower Body" name="Lower Body"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ </menu>
+ <menu label="Character Tests" name="Character Tests">
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_check label="Animation Info" name="Animation Info"/>
+ <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/>
+ <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Textures" name="HTTP Textures"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
+ <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/>
+ <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ </menu>
+ <menu label="Parcel" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/>
+ <menu_item_call label="Claim Public Land" name="Claim Public Land"/>
+ </menu>
+ <menu label="Región" name="Region">
+ <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/mime_types_linux.xml b/indra/newview/skins/default/xui/es/mime_types_linux.xml
new file mode 100644
index 0000000000..77d05934f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenido web
+ </label>
+ <tooltip name="web_tooltip">
+ Este sitio tiene contenido web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar el contenido web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Película
+ </label>
+ <tooltip name="movie_tooltip">
+ Aquí puede verse una película
+ </tooltip>
+ <playtip name="movie_playtip">
+ Ver la película
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagen
+ </label>
+ <tooltip name="image_tooltip">
+ En este sitio hay una imagen
+ </tooltip>
+ <playtip name="image_playtip">
+ Ver la imagen de esta localización
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ En este sitio hay audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Oír el audio de este sitio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Streaming en &apos;Real Time&apos;
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagen
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vídeo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Texto enriquecido (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagen (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagen (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagen (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagen (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagen (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagen (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Película (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Película (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Película (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Película (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Película (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/es/mime_types_mac.xml b/indra/newview/skins/default/xui/es/mime_types_mac.xml
new file mode 100644
index 0000000000..77d05934f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenido web
+ </label>
+ <tooltip name="web_tooltip">
+ Este sitio tiene contenido web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar el contenido web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Película
+ </label>
+ <tooltip name="movie_tooltip">
+ Aquí puede verse una película
+ </tooltip>
+ <playtip name="movie_playtip">
+ Ver la película
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagen
+ </label>
+ <tooltip name="image_tooltip">
+ En este sitio hay una imagen
+ </tooltip>
+ <playtip name="image_playtip">
+ Ver la imagen de esta localización
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ En este sitio hay audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Oír el audio de este sitio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Streaming en &apos;Real Time&apos;
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagen
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vídeo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Texto enriquecido (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagen (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagen (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagen (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagen (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagen (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagen (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Película (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Película (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Película (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Película (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Película (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 86f3f1f125..08b0ab1720 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -9,74 +9,33 @@
<global name="implicitclosebutton">
Cerrar
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Mensaje de alerta desconocida" name="MissingAlert">
- Su versión de [APP_NAME] no sabe cómo mostrar el mensaje de alerta que acaba de recibir.
-
-Detalles del error: no se ha encontrado en notifications.xml la alerta llamada &apos;[_NAME]&apos;.
+ <template name="okbutton">
+ <form>
+ <button name="OK" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore"/>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="Cancel" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore"/>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
+ Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor.
+
+Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,24 +56,18 @@ Detalles del error: no se ha encontrado en notifications.xml la alerta llamada &
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
<notification name="BadInstallation">
- Ha habido un error al actualizar [APP_NAME]. Por favor, descargue la última versión desde secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar.
+ No se puede conectar con [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Por favor, revise su conexión a internet.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Asegúrate de que tu conexión a internet está funcionando adecuadamente.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
No se ha encontrado la plantilla de mensaje [PATH].
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
¿Guardar los cambios en las ropas o partes del cuerpo actuales?
@@ -173,7 +126,7 @@ Por favor, revise su conexión a internet.
Va a añadir miembros al rol de [ROLE_NAME].
No podrá removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
¿Está seguro de que quiere seguir?
- <usetemplate ignoretext="Cuando se añaden miembros del grupo al rol de propietario" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="Confirma que vas a añadir un nuevo Propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="AssignDangerousActionWarning">
Va a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
@@ -191,58 +144,8 @@ No podrá removérseles de ese rol, sino que deberán renunciar a él por sí mi
¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Seleccionar &apos;Publicar en la web&apos;
-Marcando este ítem, se mostrará:
-- esta parcela en los resultados de la búsqueda
-- los objetos públicos de esta parcela
-- esta parcela en la búsqueda de la web
- </notification>
- <notification name="ClickSoundHelpLand">
- Los media y la música sólo pueden disfrutarse dentro de la parcela. Según el nivel de calificación de los residentes, las opciones de sonido y de voz pueden ceñirse a la parcela u oírse fuera de ella. ¿Quiere ir a la Base de Conocimientos para aprender más sobre cómo configurar estas opciones?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Los resultados de la búsqueda se organizan según la pestaña en que esté, su nivel de calificación, la categoría elegida, y otros factores. Para más detalles, vea, por favor, la Base de Conocimientos.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- No puede hacer que esta parcela aparezca en la búsqueda, porque está situada en una región que lo prohíbe.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Al seleccionar &apos;Mostrar en la búsqueda&apos; se mostrará:
-- mi perfil en los resultados de la búsqueda
-- un enlace a mi perfil en las páginas públicas de grupo
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Puede proponérselo a otro residente o disolver su relación con un/a compañero/a en el sitio web de [SECOND_LIFE].
-
-¿Ir al sitio web de [SECOND_LIFE] para tener más información sobre este asunto?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Sus permisos por defecto no funcionarán en regiones antiguas.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Si este residente ha indicado una URL para mostrar un perfil en la web, usted puede:
- * Pulsar &apos;Cargar&apos; para ver la página en esta pestaña web.
- * Pulsar Cargar &gt; &apos;En un navegador externo&apos; para ver la página en su navegador por defecto.
- * Pulsar Cargar &gt; &apos;URL Inicio&apos; para volver al perfil en la web de este residente si usted ha estado navegando por otros sitios.
-
-Cuando esté viendo su propio perfil, puede introducir cualquier URL como su perfil web, y pulsar OK para fijarla.
-Los demás residentes podrán visitar la URL que usted haya elegido cuando vean su perfil.
+ <notification name="ClickUnimplemented">
+ Lo sentimos, aún no está implementado.
</notification>
<notification name="JoinGroupCanAfford">
Entrar a este grupo cuesta [COST] L$.
@@ -253,6 +156,12 @@ Los demás residentes podrán visitar la URL que usted haya elegido cuando vean
Entrar a este grupo cuesta [COST] L$.
No tiene dinero suficiente para entrar.
</notification>
+ <notification name="CreateGroupCost">
+ Crear este grupo te costará 100 L$.
+Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
+Por favor, invita a miembros en las próximas 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
+ </notification>
<notification name="LandBuyPass">
Por [COST] L$ puede entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -267,10 +176,10 @@ Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATENCIÓN: Al pulsar &apos;vender a cualquiera&apos;, su terreno estará disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
+ ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
-Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
-Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra a [NAME].
+Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -330,6 +239,12 @@ Objetos: [N]
Toda esta región tiene activado el &apos;daño&apos;.
Para que funcionen las armas los scripts deben estar activados.
</notification>
+ <notification name="MultipleFacesSelected">
+ Están seleccionadas varias caras.
+Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
+Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
+ <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Para configurar el Punto de llegada de la parcela,
debe estar usted dentro de ella.
@@ -366,6 +281,10 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no
<notification name="CannotWearTrash">
No puede vestirse ropas o partes del cuerpo que están en la Papelera
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ No se puede anexar el objeto.
+Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
+ </notification>
<notification name="CannotWearInfoNotComplete">
No puede vestirse este ítem porque aún no se ha cargado. Por favor, reinténtelo en un minuto.
</notification>
@@ -374,20 +293,28 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no
Debe escribir tanto el nombre como el apellido de su avatar, los dos.
Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
</notification>
<notification name="AddClassified">
- Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en www.secondlife.com.
-Rellene su anuncio y pulse &apos;Publicar...&apos; para añadirlo al directorio.
-Cuando pulse Publicar, se le preguntará por un precio a pagar.
-El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave.
- <usetemplate ignoretext="Cuando se añade un nuevo Clasificado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com].
+Rellena tu anuncio y pulsa &apos;Publicar...&apos; para añadirlo al directorio.
+Cuando pulses Publicar, se te preguntará por un precio a pagar.
+El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave.
+ <usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
¿Borrar el clasificado &apos;[NAME]&apos;?
No se reembolsan las cuotas pagadas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Has elegido borrar los media asociados a esta cara.
+¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
<notification name="ClassifiedSave">
¿Guardar los cambios en el clasificado [NAME]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
@@ -398,6 +325,9 @@ No se reembolsan las cuotas pagadas.
</notification>
<notification name="PromptGoToEventsPage">
¿Ir a la web de eventos de [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -415,17 +345,17 @@ No se reembolsan las cuotas pagadas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="CacheWillClear">
- La caché se limpiará cuando reinicie [APP_NAME].
+ La caché se limpiará cuando reinices [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- La caché se moverá cuando reinicie [APP_NAME].
-Nota: esto limpiará la caché.
+ La caché se moverá cuando reinicies [APP_NAME].
+Nota: esto vaciará la caché.
</notification>
<notification name="ChangeConnectionPort">
- Las configuraciones del puerto tendrán efecto cuando reinicie [APP_NAME].
+ La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
</notification>
<notification name="ChangeSkin">
- La nueva apariencia se verá cuando reinicie [APP_NAME].
+ La nueva apariencia la verás cuando reinicies [APP_NAME].
</notification>
<notification name="GoToAuctionPage">
¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
@@ -474,6 +404,11 @@ El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&
<notification name="SaveBytecodeFailReason">
Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde..
</notification>
+ <notification name="StartRegionEmpty">
+ Perdon, no está definida tu Posición inicial.
+Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
@@ -492,23 +427,21 @@ Para más información, ¿quiere visitar [_URL]?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=es
</url>
- <usetemplate ignoretext="Cuando se detecte hardware no adecuado" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="UnknownGPU">
- En este momento, desconocemos la tarjeta gráfica de su sistema.
-Con frecuencia, esto se debe a hardware nuevo que no hemos podido revisar aún.
-Es muy probable que [APP_NAME] funcione correctamente, pero deberá ajustar sus configuraciones gráficas a lo que sea más apropiado.
-(Menú Editar &gt; Preferencias &gt; Gráficos).
+ Tu sistema tiene una tarjeta gráfica desconocida, hoy por hoy, para [APP_NAME].
+Suele suceder con hardware nuevo aún no probado con [APP_NAME]. Lo más probable es que [APP_NAME] se ejecute correctamente, pero debes ajustar tus preferencias gráficas a niveles más adecuados.
+(Yo &gt; Preferencias &gt; Gráficos).
<form name="form">
- <ignore name="ignore" text="Cuando se detecte una tarjeta gráfica desconocida"/>
+ <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] se cayó al inicializar los drivers gráficos.
-La calidad de los gráficos deberá establecerse en un nivel bajo para prevenir algunos errores frecuentes en los drivers.
-Esto desactivará algunas opciones gráficas.
-Le recomendamos que actualice los drivers de su tarjeta gráfica.
-La calidad gráfica puede configurarse en Preferencias &gt; Gráficos.
+ [APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
+La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
+Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
+La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
</notification>
<notification name="RegionNoTerraforming">
En la región [REGION] no se permite modificar el terreno.
@@ -563,6 +496,9 @@ Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mund
¿Expulsar a [AVATAR_NAME] de su terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
</notification>
@@ -574,7 +510,10 @@ misma región.
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-¿Ir a [_URL] para informarse sobre la compra de L$?
+¿Ir a [_URL] para informarte sobre la compra de L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -662,12 +601,15 @@ Podría ser [VALIDS]
No se ha podido crear el archivo de salida: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Actualmente, no ofrecemos la posibilidad de subida masiva de archivos de animación.
+ Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
</notification>
<notification name="CannotUploadReason">
No se ha podido subir [FILE] por la siguiente razón: [REASON]
Por favor, inténtelo más tarde.
</notification>
+ <notification name="LandmarkCreated">
+ Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
No puede crear un hito aquí porque el propietario del terreno no lo permite.
</notification>
@@ -690,6 +632,9 @@ Seleccione objetos con scripts.
Seleccione objetos con scripts en los que usted tenga permiso para modificarlos.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Imposible abrir el script del objeto sin modificar los permisos.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
No se puede configurar ningún script como &apos;ejecutándose&apos;.
@@ -717,48 +662,45 @@ por lo que no se ha hecho la búsqueda.
No se ha podido teleportar.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema.
- </notification>
- <notification name="nolandmark_tport">
-Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
- </notification>
- <notification name="timeout_tport">
-Lo sentimos, pero el sistema no ha podido completar el teleporte.
+ <notification name="invalid_tport">
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+ </notification>
+ <notification name="timeout_tport">
+ Lo sentimos, pero el sistema no ha podido completar el teleporte.
Vuelva a intentarlo en un momento.
- </notification>
- <notification name="noaccess_tport">
-Lo sentimos, pero usted no tiene acceso al destino de este teleporte.
- </notification>
- <notification name="missing_attach_tport">
-Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse.
- </notification>
- <notification name="too_many_uploads_tport">
-La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada.
- </notification>
- <notification name="expired_tport">
-Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="expired_region_handoff">
-Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_host">
-Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_inventory_host">
-En estos momentos no está disponible el sistema del inventario.
- </notification>
-
-
+ </notification>
+ <notification name="noaccess_tport">
+ Lo sentimos, pero usted no tiene acceso al destino de este teleporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_host">
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ En estos momentos no está disponible el sistema del inventario.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
No se ha podido configurar el propietario del terreno:
no se ha seleccionado una parcela.
@@ -795,7 +737,7 @@ no se ha seleccionado una parcela.
no se ha podido encontrar en qué región está.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- No puede cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
+ No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
</notification>
<notification name="CannotDeedLandNothingSelected">
No se ha podido transferir el terreno:
@@ -816,11 +758,11 @@ ha seleccionado varias parcelas.
Inténtelo seleccionando sólo una.
</notification>
<notification name="ParcelCanPlayMedia">
- Esta localización puede mostrar media en streaming.
+ Esta localización puede ejecutar media en streaming.
Los media en streaming necesitan una conexión a internet rápida.
Si hay media, ¿reproducirlos en streaming?
-(Puede cambiar más adelante esta opción en Preferencias &gt; Audio y Vídeo).
+(Puedes cambiar más adelante esta opción en Preferencias &gt; Privacidad).
<usetemplate name="okcancelbuttons" notext="Desactivar" yestext="Ejecutar los media"/>
</notification>
<notification name="CannotDeedLandWaitingForServer">
@@ -919,17 +861,6 @@ Deberá reconfigurar el nombre y las opciones de la nueva parcela.
¿Unir el terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Mostrar los propietarios:
-El color de las parcelas indica el tipo de propietario.
-
-Verde = Su terreno
-Agua = Terreno de sus grupos
-Rojo = Propiedad de otros
-Amarillo = En venta
-Morado = Para subasta
-Gris = Público
- </notification>
<notification name="ConfirmNotecardSave">
Esta nota debe guardarse antes de que se la pueda copiar o ver. ¿Guardar la nota?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -952,12 +883,12 @@ Gris = Público
</notification>
<notification name="CannotSaveToAssetStore">
No se ha podido guardar [NAME] en la base central de almacenamiento.
-Esto es, generalmente, un fallo temporal. Por favor, reinténtelo en unos pocos minutos.
+Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Se ha cerrado su sesión en [SECOND_LIFE]:
+ Se te ha cerrado la sesión en [SECOND_LIFE]:
[MESSAGE]
-Aún puede ver el chat y los MI existentes pulsando &apos;Ver MI y Chat&apos;. Si no, pulse &apos;Salir&apos; para dejar inmediatemente [APP_NAME].
+Aún puedes ver el chat y los MI existentes pulsando &apos;Ver MI y Chat&apos;. Si no, pulsa &apos;Salir&apos; para dejar ahora [SECOND_LIFE].
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -1117,36 +1048,40 @@ Si se vende una parcela transferida, el precio de venta se dividirá a partes ig
<notification name="ErrorMessage">
[ERROR_MESSAGE]
</notification>
- <notification name="AvatarMoved">
- Su localización [TYPE] no está disponible en estos momentos. [HELP]
-Ha sido llevado a una región cercana.
- </notification>
<notification name="AvatarMovedDesired">
- La localización que ha elegido no está disponible en estos momentos.
-Ha sido llevado a una región cercana.
+ La localización que querías no está disponible en estos momentos.
+Se te ha llevado a una región cercana.
</notification>
<notification name="AvatarMovedLast">
- Su última posición no está disponible en estos momentos.
-Ha sido llevado a una región cercana.
+ En estos momentos no está disponible tu última posición.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedHome">
+ En estos momentos no está disponible tu Base.
+Se te ha llevado a una región cercana.
+Quizá quieras configurar una nueva posición para tu Base.
</notification>
<notification name="ClothingLoading">
- Aún está descargándose su ropa.
-Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctamente.
+ Aún está descargándose tu ropa.
+Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
<form name="form">
- <ignore name="ignore" text="Cuando está llevando mucho tiempo descargar la ropa"/>
+ <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
</form>
</notification>
<notification name="FirstRun">
- Se ha completado la instalación de [APP_NAME].
+ Se ha completado la instalación de [SECOND_LIFE].
-Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión.
-¿Volver a www.secondlife.com para crear una cuenta nueva?
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
+¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE].
+ Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a internet o de [SECOND_LIFE_GRID].
-Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base.
+Puedes revisar tu conexión a internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
+ <url name="url">
+ http://es.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Ayuda"/>
@@ -1166,10 +1101,10 @@ Puede cambiar más adelante su elección.
[NAME] cuesta [PRICE] L$. No tiene suficientes L$ para hacer eso.
</notification>
<notification name="GrantedModifyRights">
- Se le ha concedido el privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME].
+ [NAME] te ha dado permiso para modificar sus objetos.
</notification>
<notification name="RevokedModifyRights">
- Ha sido revocado su privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME].
+ Ha sido revocado tu privilegio de modificar los objetos de [NAME]
</notification>
<notification name="FlushMapVisibilityCaches">
Esto limpiará las caches del mapa en esta región.
@@ -1248,93 +1183,107 @@ Por favor, ponga en venta el objeto y reinténtelo.
[DOWNLOAD_PATH].
</notification>
<notification name="DownloadWindowsMandatory">
- Está disponible una versión nueva de [APP_NAME].
+ Hay una versión nueva de [SECOND_LIFE] disponible.
[MESSAGE]
-Debe descargar esta actualización para usar [APP_NAME].
+Debes descargar esta actualización para usar [SECOND_LIFE].
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
</notification>
<notification name="DownloadWindows">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
<notification name="DownloadMacMandatory">
- Está disponible una versión nueva de [APP_NAME].
+ Hay una versión nueva de [SECOND_LIFE] disponible.
[MESSAGE]
-Debe descargar esta actualización para usar [APP_NAME].
+Debes descargar esta actualización para usar [SECOND_LIFE].
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
</notification>
<notification name="DownloadMac">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DeedObjectToGroup">
Transferir este objeto al grupo hará que:
* Reciba los L$ pagados en el objeto
- <usetemplate ignoretext="Cuando se transfieren objetos a los grupos" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
+ <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
</notification>
<notification name="WebLaunchExternalTarget">
- ¿Abrir el navegador de su sistema para ver este contenido?
- <usetemplate ignoretext="Cuando se abra el navegador de su sistema para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Quieres abrir tu navegador para ver este contenido?
+ <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- ¿Ir a www.secondlife.com para administrar su cuenta?
- <usetemplate ignoretext="Cuando se abra el navegador para administrar su cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Visite el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki de cuestiones de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Visite el wiki QA de [SECOND_LIFE].
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki QA" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Visite el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrá informar de errores y otros asuntos.
- <usetemplate ignoretext="Cuando se abra el navegador para ver el Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Visite el wiki de [SECOND_LIFE] para informarse de cómo usar el Public Issue Tracker (sistema público de seguimiento de incidencias).
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki del Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ <usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="WebLaunchSupportWiki">
Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
- <usetemplate ignoretext="Cuando se abra el navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- ¿Ir a la Guía de programación para encontrar ayuda?
- <usetemplate ignoretext="Cuando se abra el navegador para ver la Guía de programación" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
+ <usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- ¿Ir al portal de LSL para encontrar ayuda sobre programación?
- <usetemplate ignoretext="Cuando se abra el navegador para ver el portal de programación" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
+ <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="ReturnToOwner">
¿Está seguro de que quiere devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
- <usetemplate ignoretext="Cuando se devuelvan los objetos a sus propietarios" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Actualmente, usted es miembro del grupo [GROUP].
@@ -1346,14 +1295,14 @@ Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los usuarios"/>
</notification>
<notification name="MuteLinden">
- Perdón, pero no puede ignorar a un Linden.
+ Lo sentimos, pero no puedes ignorar a un Linden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
No puede empezar una subasta en una parcela que ya está en venta. Desactive la venta de terreno si está seguro de querer iniciar una subasta.
</notification>
- <notification label="Fallo al ignorar un objeto según el nombre" name="MuteByNameFailed">
- Ya ha ignorado ese nombre.
+ <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
+ Ya has ignorado este nombre.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1371,12 +1320,12 @@ Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar
</notification>
<notification name="BusyModeSet">
Pasar al modo ocupado.
-Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos recibirán su Respuesta en el modo ocupado. Todos los ofrecimientos de teleporte serán rehusados. Todas las ofertas de inventario irán a su Papelera.
- <usetemplate ignoretext="Cuando se pasa al modo ocupado" name="okignore" yestext="OK"/>
+Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
+ <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Pertenece a demasiados grupos para poder entrar en otro. Por favor, salga de al menos uno antes de entrar en éste, o rehúse la oferta. Para salir de un grupo, seleccione la opción &apos;Grupos...&apos; en el menú &apos;Editar&apos;.
-[NAME] le ha invitado a ser miembro de un grupo.
+ Perteneces a demasiados grupos para poder entrar en otro. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
+[NAME] te ha invitado a ser miembro de un grupo.
[INVITE]
<usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
</notification>
@@ -1442,7 +1391,15 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
</notification>
<notification name="TeleportFromLandmark">
¿Está seguro de que quiere teleportarse?
- <usetemplate ignoretext="Cuando está teleportando desde un hito del inventario" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ¿Teleportarte a [PICK]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ¿Teleportarse a [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
</notification>
<notification label="Mensaje a todo el estado" name="MessageEstate">
Escriba un anuncio breve que se enviará a todo el que esté en su estado.
@@ -1511,111 +1468,80 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
Usted no está autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Usted no está autorizado en esa región por su nivel de calificación.
¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando la entrada a la región está bloqueada por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Usted no está autorizado en esa región por su nivel de calificación.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Usted no está autorizado en esa región por su nivel de calificación..
-
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General.
- <form name="form">
- <button
- name="OK"
- text="Cambiar preferencia"/>
- <button
- default="true"
- name="Cancel"
- text="Cerrar"/>
- <ignore name="ignore" text="Cuando la entrada a la región está bloqueada por la preferencia del nivel de calificación"/>
- </form>
+ No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <form name="form">
+ <button name="OK" text="Cambiar las preferencias"/>
+ <button default="true" name="Cancel" text="Cerrar"/>
+ <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Usted no puede reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
No puede reclamar este terreno por sus nivel de calificación.
¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando el reclamar terreno está bloqueado por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo reclamar este terreno, dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Por su nivel de calificación, usted no puede reclamar este terreno.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- No puede reclamar este terreno por sus preferencias de nivel de calificación.
+ No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General..
- <usetemplate
- name="okcancelignore"
- yestext="Cambiar preferencia"
- notext="Cerrar"
- ignoretext="Cuando el reclamar terreno está bloqueado por la preferencia del nivel de calificación"/>
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
</notification>
<notification name="LandBuyAccessBlocked">
Usted no puede comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
No puede comprar este terreno por sus preferencias de nivel de calificación.
¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando la compra de terreno está bloqueada por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo comprar este terreno, dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
No puede comprar este terreno por su nivel de calificación.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- No puede comprar este terreno por sus preferencias de nivel de calificación.
+ No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General.
- <usetemplate
- name="okcancelignore"
- yestext="Cambiar preferencia"
- notext="Cerrar"
- ignoretext="Cuando la compra de terreno está bloqueada por la preferencia del nivel de calificación"/>
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Hay seleccionadas demasiadas primitivas. Por favor, seleccione [MAX_PRIM_COUNT] o menos, y reinténtelo.&quot;
+ Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
@@ -1630,9 +1556,7 @@ Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificac
</notification>
<notification name="UnableToLoadNotecardAsset">
En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
Permisos insuficientes para ver la nota asociada a la ID solicitada.
@@ -1650,19 +1574,11 @@ Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificac
</notification>
<notification name="SetClassifiedMature">
¿Este anuncio tiene contenido &apos;Mature&apos;?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Sí"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="SetGroupMature">
¿Este grupo tiene contenido &apos;Mature&apos;?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Sí"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification label="Confirmar el reinicio" name="ConfirmRestart">
¿Verdaderamente quiere reiniciar la región de aquí a 2 minutos?
@@ -1676,226 +1592,12 @@ Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificac
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="No permitir modificar el terreno" name="HelpRegionBlockTerraform">
- Si se marca está casilla, los propietarios de terreno no podrán modificarlo, independientemente de lo que esté configurado en cada parcela.
-
-Por defecto: off
- </notification>
- <notification label="Prohibir volar" name="HelpRegionBlockFly">
- Si se marca esta casilla, estará prohibido volar en la región, independientemente de lo que esté configurado en cada parcela.
-
-Por defecto: off
- </notification>
- <notification label="Cambio múltiple de permisos del contenido" name="HelpBulkPermission">
- La herramienta de cambio múltiple de permisos le ayuda a cambiar con rapidez los permisos de varios de los objetos contenidos en el objeto u objetos que seleccione. Pero fíjese que sólo configurará los permisos de los ítems que están en el contenido de los objetos seleccionados, no los de esos objetos que los contienen.
-
-Note también que los permisos no se aplicarán a los contenidos que puedan tener cada uno de los ítems. Lo que haga sólo afectará a los ítems que estén exactamente en el primer nivel de contenidos.
-
-Puede elegir qué clase de ítems modificar usando la lista &apos;Tipos de contenido&apos; here. Las imágenes se consideran incluidas si selecciona Texturas.
-
-* Esta herramienta sólo puede cambiar los permisos de aquellos ítems de los que usted esté autorizado a cambiarlos.
-* No puede otorgar al siguiente propietario permisos que usted no tenga ya.
-* Los permisos para el nuevo propietario son, en principio, una solicitud. Si alguno de los ítems no puede coger todos esos permisos solicitados, no cambiará ninguno de los permisos que tenga.
-
-Cuando esté listo para efectuar el cambio múltiple de permisos, pulse &apos;Aplicar&apos; y espere a que se muestren los resultados.
-
-SSi cierra la ventana de Cambio múltiple de permisos mientras se están cambiando, se cancelará la operación.
- </notification>
- <notification label="Permitir el daño" name="HelpRegionAllowDamage">
- Si se marca la casilla, el sistema de &apos;vida&apos; afecta a todas las parcelas independientemente de lo que tenga marcado cada una.
-Si la casilla no está marcada, el propietario de cada parcela podrá decidir si activa en ella el sistema de &apos;vida&apos;.
-
-Por defecto: off
- </notification>
- <notification label="Nº máximo de avatares" name="HelpRegionAgentLimit">
- Configura el número máximo de avatares que se permite en esta región.
-El funcionamiento puede variar según el número de avatares que estén presentes.
-
-Por defecto: 40
- </notification>
- <notification label="Plus de objetos" name="HelpRegionObjectBonus">
- El plus de objetos es un multiplicador de los prims permitidos en cualquier parcela.
-El rango permitido es de 1 a 10. Fijándolo en &apos;1&apos;, se permiten 117 objetos en cada parcela de 512 m². Fijándolo en &apos;2&apos;, se permiten 234 (el doble), y así sucesivamente. El número máximo de objetos permitidos en una región sigue siendo de 15.000, sea cual sea el plus.
-Una vez establecido, tenga en cuenta que reducir el plus de objetos puede causar que se devuelvan o borren objetos.
-
-Por defecto: 1.0
- </notification>
- <notification label="Calificación" name="HelpRegionMaturity">
- Configura el nivel de calificación de la región, tal como se verá en la barra superior del visor de cualquier residente, y en los datos que mostrará el mapa del mundo cuando se pase el cursor sobre esta región. Esta configuración también afecta al acceso a esta región y a los resultados de la búsqueda. Los demás residentes sólo entrarán en las regiones o verán aquellos resultados de la búsqueda que tengan el mismo nivel de calificación que ellos han elegido en sus preferencias.
-
-Puede llevar algún tiempo que este cambio se refleje en el mapa.
- </notification>
- <notification label="Impedir &apos;empujar&apos;" name="HelpRegionRestrictPushObject">
- Esta casilla controla en toda la región los permisos para que haya &apos;empujones&apos;.
-Cuando está activada, los residentes sólo pueden ser empujados por sí mismos o por el propietario de la parcela.
-(&apos;Empujar&apos; se refiere a la función llPushObject() del LSL).
-
-Por defecto: Off
- </notification>
- <notification label="Unir/Dividir parcelas" name="HelpParcelChanges">
- Esta casilla determina si las parcelas que no son del propietario del estado pueden unirse o subdividirse.
-Si no se marca esta opción:
- * Sólo los propietarios o los administradores del estado pueden unir o dividir parcelas.
- * Sólo podrán unir o dividir las parcelas pertenecientes al propietario o a un grupo en el que tengan los poderes adecuados.
-Si se marca esta opción:
- * Todo los propietarios de parcelas podrán unir o dividir las que posean.
- * En parcelas propiedad de un grupo, quienes tengan los poderes adecuados podrán unirlas o dividirlas.
-
-Por defecto: Marcado
- </notification>
- <notification label="No mostrar en la búsqueda" name="HelpRegionSearch">
- Marcando esta casilla bloqueará que los propietarios de parcelas puedan listarlas en la búsqueda.
-
-Por defecto: Off
- </notification>
<notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
Se ha actualizado la calificación de esta región.
Llevará algún tiempo que el cambio se refleje en el mapa.
</notification>
- <notification label="Reventa de terreno" name="HelpRegionLandResell">
- Los propietarios y los administradores del estado pueden poner en venta cualquier terreno que posea el propietario del estado.
-Si se desmarca esta opción, los compradores no podrán revender el terreno que compren en esta región.
-Si se marca esta opción, los compradores podrán revender el terreno que compren en esta región.
-
-Por defecto: Deshabilitado
- </notification>
- <notification label="Desactivar los scripts" name="HelpRegionDisableScripts">
- Cuando el rendimiento de un sim es pobre, el culpable puede ser un script. Abra Estadísticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las Estadísticas. Si ve que Script Time está en 25 ms o más alto, pulse el botón Listar los scripts según su uso, y verá el nombre y la posición de los scripts que pueden estar causando el bajo rendimiento.
-
-Marcando la casilla Desactivar los scripts y pulsando el botón Aplicar, se desactivarán temporalmente en esta región todos los scripts.
-Debe hacer esto para viajar a la posición que ha visto en la Lista de scripts según su uso. Cuando llegue, investigue el script para determinar si es él quien causa el problema. Deberá contactar con el propietario del script, o borrar o devolver el objeto.
-Desmarque la casilla Desactivar los scripts y pulse Aplicar para reactivar los scripts en la región.
-
-Por defecto: off
- </notification>
- <notification label="Desactivar las colisiones" name="HelpRegionDisableCollisions">
- Cuando el rendimiento de un sim es pobre, la culpa puede estar en los objetos físicos. Abra Estadísticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las Estadísticas. Si ve que Sim Time (Physics) está en 20 ms o más alto, pulse el botón Listar los objetos que colisionan, y verá el nombre y la posición de los objetos que pueden estar causando el bajo rendimiento.
-
-Marcando la casilla Desactivar las colisiones y pulsando el botón Aplicar, se desactivarán temporalmente las colisiones entre objetos.
-Debe hacer esto para viajar a la localización que se ha avisado en la Lista de objetos que colisionan. Cuando llegue, investigue el objeto:
-¿está colisionando constantemente con otros objetos? Deberá contactar con el propietario del objeto, o borrarlo o devolverlo.
-Desmarque la casilla Desactivar las colisiones y pulse Aplicar para reactivar las colisiones en la región.
-
-Por defecto: off
- </notification>
- <notification label="Desactivar la física" name="HelpRegionDisablePhysics">
- Desactivar la física es parecido a Desactivar las colisiones, pero se desactivan todas las simulaciones físicas: no sólo se detiene la colisión de objetos, sino que también se provoca que los avatares no puedan moverse.
-
-Esto debería usarse sólo cuando Desactivar las colisiones no ha aportado a la región suficiente rendimiento para investigar un problema con las propiedades físicas o los objetos que colisionan.
-
-Cuando acabe, no se olvide de reactivar la física, o los avatares seguirán sin poderse mover.
-
-Por defecto: off
- </notification>
- <notification label="Objetos que colisionan" name="HelpRegionTopColliders">
- Muestra una lista de aquellos objetos con más colisiones potenciales con otros objetos. Estos objetos pueden ralentizar el rendimiento.
-Seleccione Ver &gt; Estadísticas, y mire Simulator &gt; Time &gt; Sim Time (Physics) para ver si se están empleando en &apos;physics&apos; más de 20 ms.
- </notification>
- <notification label="Listar los scripts" name="HelpRegionTopScripts">
- Muestra una lista de los objetos que más tiempo emplean en ejecutar scripts de LSL. Estos objetos pueden ralentizar el rendimiento.
-Seleccione Ver &gt; Estadísticas, y mire Simulator &gt; Time &gt; Script Time para ver si se están empleando más de 25 ms.
- </notification>
- <notification label="Reiniciar la región" name="HelpRegionRestart">
- Reinicia los procesos del servidor en que corre esta región tras dos minutos de advertencia previa. Se desconectará a todos los residentes que estén en la región. La región guardará sus datos, y debería volver en unos 90 segundos.
-
-Reiniciar la región no solventa la mayoría de los problemas de rendimiento, y, normalmente, debe utilizarse sólo cuando se indique.
- </notification>
- <notification label="Nivel del agua" name="HelpRegionWaterHeight">
- Es el nivel, en metros, del agua. Si se marca en algo distinto de 20, y usted tiene al lado el agua del mundo o un &apos;vacío&apos;, habrá una diferencia visible.
-
-Por defecto: 20
- </notification>
- <notification label="Elevación del terreno" name="HelpRegionTerrainRaise">
- Es la distancia que, en metros, los propietarios de parcelas pueden elevar su terreno sobre la altura del terreno inicialmente creado.
-
-Por defecto: 4
- </notification>
- <notification label="Rebaje del terreno" name="HelpRegionTerrainLower">
- Es la distancia que, en metros, los propietarios de parcelas pueden bajar su terreno sobre la altura del terreno inicialmente creado.
-
-Por defecto: -4
- </notification>
- <notification label="Subir un RAW para el terreno" name="HelpRegionUploadRaw">
- Este botón carga un archivo .RAW en la región en que usted está.
-El archivo debe tener las dimensiones correctas (RGB, 256x256) y 13 canales. La forma mejor de crear un archivo de terreno es descargar el archivo RAW existente. Un buen inicio es modificar el canal rojo -red- (altura del terreno), y subirlo.
-
-La carga puede llevar unos 45 segundos. Fíjese que subir un archivo de terreno *no* moverá los objetos que haya en el terreno, sólo el terreno mismo y los permisos asociados a las parcelas.
-Por tanto, puede que algunos objetos acaben enterrados..
-
-Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1.
- </notification>
- <notification label="Descargar el RAW del terreno" name="HelpRegionDownloadRaw">
- Este botón descarga un archivo de esta región con los datos de alturas, dimensiones de las parcelas, estado de las parcelas en venta, y algunos permisos de las parcelas. Al abrir el archivo en un programa como Photoshop debe especificar las dimensiones del documento: RGB, 256x256 con 13 canales.
-Este archivo de terreno no puede abrirse de otro modo.
-
-Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1.
- </notification>
- <notification label="Usar el Sol del estado" name="HelpRegionUseEstateSun">
- Esta casilla hace que la posición del Sol en la región sea la misma que la del resto del estado.
-
-Por defecto: on
- </notification>
- <notification label="Fijar el Sol" name="HelpRegionFixedSun">
- Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento.
-
-Por defecto: off
- </notification>
- <notification label="Predeterminar este terreno" name="HelpRegionBakeTerrain">
- Este botón salva la forma actual del terreno como nueva forma por defecto para la región. Una vez predeterminado, el terreno puede volver a esa forma cada vez que usted u otros usan la opción &apos;Revertir&apos; en Editar el terreno. El terreno predeterminado también marca el punto medio para elevar y bajar los límites.
- </notification>
- <notification label="Administradores del estado" name="HelpEstateEstateManager">
- Un administrador del estado es un residente en el que usted delega controles de la región y configuraciones del estado. Un administrador del estado puede cambiar algunas configuraciones de estos paneles, excepto las de subir, descargar, y predeterminar el terreno. Y, concretamente, puede autorizar o expulsar a residentes de su estado.
-
-Sólo el propietario del estado puede añadir o remover administradores, nadie más.
-Por favor, elija sólo a residentes en quienes confíe, pues usted será el responsable último de sus acciones.
- </notification>
- <notification label="Usar el horario global" name="HelpEstateUseGlobalTime">
- Esta casilla hace que, en su estado, el Sol tenga la misma posición que en los estados propiedad de Linden, &apos;mainland&apos;.
-
-Por defecto: on
- </notification>
- <notification label="Fijar el Sol" name="HelpEstateFixedSun">
- Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento.
- </notification>
- <notification label="Acceso público" name="HelpEstateExternallyVisible">
- Esta casilla habilita que cualquier residente que esté en otro estado pueda entrar en éste sin tener que estar en una lista de acceso.
-
-Por defecto: on
- </notification>
- <notification label="Permitir el teleporte a cualquier punto" name="HelpEstateAllowDirectTeleport">
- Cuando esta marcado, los residentes puede teleportarse directamente a cualquier punto de su estado. Si se desmarca, los residentes se teleportarán al Punto de Teleporte más cercano.
-
-Por defecto: off
- </notification>
- <notification label="Autorizar el acceso" name="HelpEstateAllowResident">
- El acceso a este estado se limitará a los residentes aquí enumerados y a cualquier grupo de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público.
- </notification>
- <notification label="Autorizar el acceso de grupo" name="HelpEstateAllowGroup">
- El acceso a este estado se limitará a los grupos aquí enumerados y a cualquier residente de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público.
- </notification>
- <notification label="Dirección de correo para infracciones" name="HelpEstateAbuseEmailAddress">
- Aportando aquí una dirección de correo válida, se hará que las Denuncias de Infracción en este estado se envíen a esa dirección.
-Si se deja en blanco, las Denuncias de Infracción se enviarán sólo a Linden Lab.
- </notification>
- <notification label="Denegar el acceso" name="HelpEstateBanResident">
- A los residentes en esta lista se les niega el acceso a su estado, independientemente de cualquier otra configuración.
- </notification>
- <notification label="Autorizar el chat de voz" name="HelpEstateVoiceChat">
- Se autoriza a las parcelas del estado a tener sus propios canales de voz en los que los residentes puedan hablar y oír a otros residentes.
-
-Por defecto: off
- </notification>
<notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
- En esta región, la versión de [APP_NAME] no es compatible con el chat de voz. Para que el chat de voz funcione correctamente, debe actualizar [APP_NAME].
- </notification>
- <notification label="Contrato del estado" name="HelpEstateCovenant">
- Definir un contrato del estado le permite vender parcelas del mismo. Si no existe un contrato, no puede vender terreno.
-La nota para su contrato puede estar vacía si es que no quiere aplicar reglas, avisos a los compradores, o cualquier otra cosa relacionada con el terreno antes de que sea comprado.
-
-Puede usar un contrato para comunicar al posible comprador reglas, pautas, información cultural, o, simplemente, sus propias expectativas.
-Así, puede hablarse de parcelación, normas de las construcciones, formas de pago, u otra información que considere que el nuevo propietario debe saber y con la que debe estar de acuerdo antes de hacer la compra.
-
-Para poder finalizar la compra, el comprador debe aceptar el contrato marcando la casilla adecuada. Los contratos de los estados son siempre visibles en la información Acerca del terreno en todas las parcelas.
+ Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
</notification>
<notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
No se pueden comprar a la vez objetos de propietarios diferentes.
@@ -1983,55 +1685,36 @@ Ha actualizado la posición de este Destacado, pero los otros detalles permanece
Ha elegido ítems &apos;no copiables&apos; de su inventario. Esos ítems se quitarán de su inventario, no se copiarán.
¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Cuando mueva objetos &apos;no copiables&apos; del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Ha elegido ítems &apos;no copiables&apos; de su inventario. Esos ítems se moverán a su inventario, no se copiarán.
Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar un mal funcionamiento del script.
¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Cuando mueva objetos con script &apos;no copiables&apos; del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Atención: la acción &apos;Pagar al objeto&apos; al pulsar ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
+ Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
<form name="form">
- <ignore name="ignore" text="Cuando configure &apos;Pagar al objeto&apos; sin el evento money()"/>
+ <ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
En este objeto, no hay ítems que esté autorizado a copiar.
</notification>
<notification name="WebLaunchAccountHistory">
- ¿Ir al sitio web de [SECOND_LIFE] para ver el historial de su cuenta?
- <usetemplate ignoretext="Cuando se cargue la página web del historial de la cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ClickOpenF1Help">
- ¿Visitar el sitio web de Soporte de [SECOND_LIFE]?
- <usetemplate ignoretext="Cuando visite el sitio web de Soporte de [SECOND_LIFE]." name="okcancelignore" notext="Cancelar" yestext="Ir"/>
+ ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="ConfirmQuit">
¿Está seguro de que quiere salir?
- <usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/>
+ <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta herramienta para denunciar violaciones de las Normas de la Comunidad y las Condiciones del Servicio. Vea:
+ Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- IMPORTANTE: Esta denuncia no irá a Linden Lab, sino al propietario de la región en la que usted se encuentra actualmente.
-
-Como un servicio a los residentes y visitantes, el propietario de la región ha elegido recibir y resolver todas las enuncias que se originen en esta región. Linden Lab no investigará las denuncias que usted envíe desde aquí.
-
-El propietario de la región resolverá las denuncias basándose en las reglas locales de la región, tal como se detallan en el Contrato del estado.
-(Puede ver el Contrato yendo al menú Mundo y eligiendo Acerca del terreno).
-
-La resolución de esta denuncia se aplica exclusivamente a esta región; el acceso de los residentes a otras áreas de [SECOND_LIFE] no se verá afectado por el resultado de esta denuncia. Únicamente Linden Lab puede impedir el acceso a la totalidad de [SECOND_LIFE].
+Se investigan y resuelven todas las infracciones denunciadas. Puedes ver la resolución tomada en el [http://secondlife.com/support/incidentreport.php Informe de Incidentes].
</notification>
<notification name="HelpReportAbuseSelectCategory">
Por favor, elija una categoría para esta denuncia de infracción.
@@ -2057,13 +1740,13 @@ Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias
<notification name="HelpReportAbuseContainsCopyright">
Estimado Residente:
-Parece que está usted denunciando una violación de la propiedad intelectual. Por favor, asegúrese de que su denuncia es correcto.
+Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
-(1) El proceso de la denuncia. Debe enviar una denuncia de infracción si cree que un Residente está reventando el sistema de permisos de [SECOND_LIFE], por ejemplo, usando un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (Abuse Team) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las las Normas de la Comunidad de [SECOND_LIFE] o las Condiciones del Servicio. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
+(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
-(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBE enviar una notificación válida de infracción tal y como se explica en nuestra DMCA Policy en http://secondlife.com/corporate/dmca.php.
+(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
-Si todavía quiere seguir con el proceso de infracción, por favor, cierre esta ventana y acabe de enviar su denuncia. En concreto, debe seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
+Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
Gracias,
@@ -2076,7 +1759,7 @@ Linden Lab
<notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
En ese punto de su cuerpo ya hay un objeto anexado. ¿Quiere reemplazarlo por el objeto que ha elegido?
<form name="form">
- <ignore name="ignore" save_option="true" text="Cuando se reemplacen anexados existentes"/>
+ <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
<button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
<button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
</form>
@@ -2086,18 +1769,22 @@ Linden Lab
¿Quiere salir del modo Ocupado ante de completar esta transacción?
<form name="form">
- <ignore name="ignore" save_option="true" text="Cuando se esté pagando a un objeto o persona en el modo Ocupado"/>
+ <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
<button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
<button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla?
+ <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- ¿Está seguro de que quiere vaciar definitivamente el contenido de su Papelera?
- <usetemplate ignoretext="Cuando se vacíe la Papelera" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
+ <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- ¿Está seguro de que quiere limpiar la caché de su navegador?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+ ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
¿Está seguro de que quiere limpiar sus cookies?
@@ -2108,39 +1795,18 @@ Linden Lab
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- ¿Está seguro de que quiere eliminar permanentemente el contenido de su carpeta Objetos Perdidos?
- <usetemplate ignoretext="Cuando se vacíe la carpeta del inventario Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
+ <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="CopySLURL">
- Se ha copiado a su portapapeles la siguiente SLurl:
+ Se ha copiado a tu portapapeles esta SLurl:
[SLURL]
-Publíquela en una página web para que otros puedan acceder fácilmente a esta posición, o pruébela usted mismo pegándola en la barra de direcciones de su navegador.
+Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
<form name="form">
- <ignore name="ignore" text="Cuando se copie una SLurl al portapapeles"/>
+ <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Este panel controla el tamaño de la ventana, y la resolución y la calidad de los gráficos del cliente. La interfaz Preferencias &gt; Gráficos le permite escoger entre cuatro niveles gráficos: Bajo, Medio, Alto, y Ultra. También puede personalizar sus configuraciones gráficas marcando la casilla Personalizar y adaptando estas configuraciones:
-
-Efectos: activa o desactiva varios tipos de shaders.
-
-Objetos reflejados: determina qué objetos reflejará el agua.
-
-Renderización del avatar: muestra opciones que afectan a cómo renderiza el cliente los avatares.
-
-Distancia de dibujo: afecta a cuán lejos de su punto de vista se renderizarán los objetos en la escena.
-
-Núm. máx. de partículas: define el número máximo de partículas que podrá ver a la vez en su pantalla.
-
-Calidad del procesamiento: define la resolución con que se renderiza el brillo.
-
-Detalle de la malla: define la cantidad de detalles o número de triángulos usados para renderizar algunos objetos. Cuanto más alto sea el valor, más detalle, pero más tiempo para renderizar.
-
-Detalles de la iluminación: determina que tipo de luces quiere usted que se rendericen.
-
-Nivel de detalle del terreno: marca con cuánto detalle quiere ver la textura del terreno.
- </notification>
<notification name="WLSavePresetAlert">
¿Quiere sobrescribir la preselección guardada?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
@@ -2159,149 +1825,6 @@ Nivel de detalle del terreno: marca con cuánto detalle quiere ver la textura de
Ya existe un efecto de procesamiento. ¿Desea sobreescribirlo?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="HelpEditSky">
- Edite los deslizables del WindLight para crear y guardar configuraciones del cielo.
- </notification>
- <notification name="HelpEditDayCycle">
- Define cómo se verán los cielos a lo largo del día.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Estas configuraciones ajustan la forma en que usted ve el medio ambiente localmente, en su ordenador. Su tarjeta gráfica debe admitir shaders de la atmósfera (&apos;atmospheric shaders&apos;) para poder acceder a esta configuración.
-
-Ajuste el deslizable &apos;Duración de un día&apos; para cambiar localmente, en su visor, las etapas del día.
-
-Ajuste el deslizable &apos;Nubosidad&apos; para controlar cuántas nubes cubren el cielo.
-
-Pulse un color en el selector de &apos;Color del agua&apos; para cambiar el color de la misma.
-
-Ajuste el deslizable &apos;Claridad del agua&apos; para controlar el nivel de claridad del agua bajo la superficie.
-
-Pulse &apos;Usar el horario del estado&apos; para devolver los valores del día al tiempo actual de la región y seguir a partir de él.
-
-Pulse &apos;Cielo avanzado&apos; para abrir un editor con configuraciones avanzadas para el cielo.
-
-Pulse &apos;Agua avanzada&apos; para abrir un editor con configuraciones avanzadas para el agua.
- </notification>
- <notification name="HelpDayCycle">
- El Editor del ciclo del día le permite controlar el cielo de [SECOND_LIFE] durante el ciclo día/noche. Este es el ciclo que usa el deslizable Duración de un día del Editor del entorno.
-
-El Editor del ciclo del día trabaja configurando fotogramas clave (&apos;keyframes&apos;): nodos (representados por los puntos grises en la línea del tiempo) cada uno de los cuales tiene asociado un Cielo definido. Según progresa la Duración de un día, el WindLight realiza la &apos;animación&apos; del cielo interpolándose entre esos fotogramas clave.
-
-La flecha amarilla sobre la línea del tiempo representa lo que usted ve actualmente, basándose en la Duración de un día. Púlsela y muévela para ver cómo cambia la animación del día. Puede añadir o borrar fotogramas clave pulsando los botones Añadir un punto o Quitar un punto, situados a la derecha de la línea del tiempo.
-
-Puede establecer la posición en el tiempo de cualquier fotograma clave moviéndolo a lo largo de la línea del tiempo, o configurando manualmente su valor en el recuadro Configuración del fotograma clave. También en ese recuadro podrá asociar el fotograma clave a un modelo predefinido de WindLight.
-
-La Duración del ciclo establece la duración total de un &apos;día&apos;. Marcar un valor bajo (por ejemplo, 2 min.) hará que las 24 horas de su línea del tiempo se animen ¡en sólo dos minutos reales! Una vez que esté satisfecho con su ciclo de la línea del tiempo y los fotogramas clave, utilice los botones Probar y Parar para obtener una vista previa de los resultados. Recuerde que también puede mover la flecha amarilla de encima de la línea del tiempo para ver el ciclo de la animación. El botón Usar el horario del estado sincronizará su ciclo de duración de un día con el ciclo del estado.
-
-Cuando todo esté a su gusto, puede guardar esos datos y cargarlos luego usando los botones Guardar este tipo de día y Cargar un tipo de día. Note que, por el momento, sólo podemos permitir un ciclo de un día.
- </notification>
- <notification name="HelpBlueHorizon">
- Use los deslizables Rojo/Verde/Azul (RVA) para ajustar el color del cielo. Puede usar el deslizable de Intensidad (I) para moverlos al unísono.
- </notification>
- <notification name="HelpHazeHorizon">
- La Cantidad de bruma es uno de los parámetros más útiles para ajustar el nivel de luz de la escena. Es eficaz para simular muchos ajustes de la exposición, como la claridad en un ambiente nublado o de nevisca, o las tonalidades del una flor Iris aún cerrada.
- </notification>
- <notification name="HelpBlueDensity">
- La Saturación afecta a la densidad global de la saturación de color del cielo y la niebla. Si mueve el deslizable Intensidad (I) a la derecha, los colores serán más vivos y brillantes. Si lo mueve a la izquierda, se irán decolorando hasta llegar incluso al blanco y negro. Si desea ajustar el balance de color del cielo, puede controlar la saturación de cada elemento usando el deslizable Rojo/Verde/Azul (RVA).
- </notification>
- <notification name="HelpHazeDensity">
- La Densidad de la bruma controla lo sombrío de la atmósfera, su neblina. Es eficaz para simular escenas con mucho humo o contaminantes, y también para simular niebla y llovizna.
- </notification>
- <notification name="HelpDensityMult">
- La Densidad puede usarse para definir globalmente la &apos;pesadez&apos; de la atmósfera. Los ajustes bajos dan sensación de un &apos;aire limpio&apos;, y los altos de pesadez, de esmog.
- </notification>
- <notification name="HelpDistanceMult">
- Ajusta a qué distancia se percibe el WindLight. El valor cero desactiva la influencia del WindLight en el terreno y los objetos. Los valores superiores a 1 simulan mayores distancias a las que afectan los efectos atmosféricos
- </notification>
- <notification name="HelpMaxAltitude">
- La Altitud máx. ajusta hasta que altura el WindLight realiza sus cálculos para computar la iluminación atmosférica. En las últimas horas del día, es útil para ajustar la &apos;profundidad&apos; a la que aparece el Sol.
- </notification>
- <notification name="HelpSunlightColor">
- Ajusta en la escena la intensidad y el color de las luces directas.
- </notification>
- <notification name="HelpSunAmbient">
- Ajusta en la escena la intensidad y el color de la luz ambiental.
- </notification>
- <notification name="HelpSunGlow">
- El deslizable Tamaño controla el tamaño del Sol.
-El deslizable Visión controla cómo se ve de borroso el Sol en el cielo.
- </notification>
- <notification name="HelpSceneGamma">
- Ajusta la distribución de luz y oscuridad en la pantalla.
- </notification>
- <notification name="HelpStarBrightness">
- Ajusta el brillo de las estrellas en el cielo.
- </notification>
- <notification name="HelpTimeOfDay">
- Controla la posición del Sol en el cielo. Es parecido a la elevación.
- </notification>
- <notification name="HelpEastAngle">
- Controla la posición del Sol en el cielo. Es parecido al acimut.
- </notification>
- <notification name="HelpCloudColor">
- Edita el color de las nubes. En general, es recomendable mantenerlas blanquecinas.
-Pero, vaya, diviértase si quiere.
- </notification>
- <notification name="HelpCloudDetail">
- Controla el detalle de las capas superiores de la imagen en la imagen principal de las nubes. X e Y controlan su posición. D (Densidad) controla la densidad o la fracturación con que aparecen las nubes.
- </notification>
- <notification name="HelpCloudDensity">
- Le permite controlar la posición de las nubes con los deslizables X e Y, y su desnidad con el deslizable D.
- </notification>
- <notification name="HelpCloudCoverage">
- Controla cuánto cubren el cielo las nubes.
- </notification>
- <notification name="HelpCloudScale">
- Controla el tamaño de la imagen de las nubes en la bóveda celeste.
- </notification>
- <notification name="HelpCloudScrollX">
- Controla la velocidad de las nubes al moverse en la dirección del eje X.
- </notification>
- <notification name="HelpCloudScrollY">
- Controla la velocidad de las nubes al moverse en la dirección del eje Y.
- </notification>
- <notification name="HelpClassicClouds">
- Marque esta casilla para activar la aparición de las nubes clásicas de [SECOND_LIFE] junto a las nubes del WindLight.
- </notification>
- <notification name="HelpWaterFogColor">
- Elije el color del agua bajo la superficie.
- </notification>
- <notification name="HelpWaterFogDensity">
- Controla la densidad de la claridad del agua, y a qué distancia puede verse bajo ella.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifica el efecto de Transparencia para controlar cuán lejos su avatar puede ver bajo el agua.
- </notification>
- <notification name="HelpWaterGlow">
- Controla la cantidad de brillo de la superficie del agua.
- </notification>
- <notification name="HelpWaterNormalScale">
- Controla el tamaño de las tres ondulaciones que componen el agua.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Controla cuánta luz se refleja desde diferentes ángulos.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Controla cuánta intensidad de luz se refleja.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Controla la cantidad de luz refractada mirando la superficie del agua desde arriba.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Controla la cantidad de luz refractada mirando la superficie del agua desde debajo.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Controla cómo se mezclan las ondas y los reflejos.
- </notification>
- <notification name="HelpWaterNormalMap">
- Controla cuál es la capa de &apos;vista normal&apos; del agua, para determinar las reflexiones/refracciones.
- </notification>
- <notification name="HelpWaterWave1">
- Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño grande de la &apos;vista normal&apos;.
- </notification>
- <notification name="HelpWaterWave2">
- Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño pequeño de la &apos;vista normal&apos;.
- </notification>
<notification name="NewSkyPreset">
Dame un nombre para el cielo nuevo.
<form name="form">
@@ -2347,35 +1870,33 @@ Pero, vaya, diviértase si quiere.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- No se pueden comprar los ítems que aún forman parte de un objeto anexado.
+ No puedes comprar un objeto mientras esté anexado.
</notification>
<notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
Al admitir esta petición, le da permiso a un script para que coja dólares Linden (L$) de su cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- ¿Quiere vestirse automáticamente el ítem de ropa nueva que ha creado?
- <usetemplate ignoretext="Al vestirme automáticamente la ropa nueva" name="okcancelignore" notext="No" yestext="Sí"/>
+ ¿Quieres ponerte automáticamente la ropa que vas a crear?
+ <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="NotAgeVerified">
- Para acceder a esta parcela, se debe haber verificado su edad.
-¿Quiere visitar la web de [SECOND_LIFE] para verificar su edad?
+ Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=es
</url>
- <usetemplate ignoretext="Advertir de la falta de la verificación de edad" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Antes de que pueda acceder a esta parcela, se requiere que usted tenga archivada su información de pago.
-¿Quiere visitar la web de [SECOND_LIFE] para actualizar esto?
+ Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=es
</url>
- <usetemplate ignoretext="Advertir de la falta de información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="MissingString">
La cadena [STRING_NAME] Ha desaparecido de strings.xml
@@ -2405,7 +1926,7 @@ Pero, vaya, diviértase si quiere.
[FIRST] [LAST] no está conectado
</notification>
<notification name="AddSelfFriend">
- No se puede añadir como amigo a usted mismo.
+ Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
</notification>
<notification name="UploadingAuctionSnapshot">
Subiendo fotos del mundo y del sitio web...
@@ -2424,7 +1945,7 @@ Pero, vaya, diviértase si quiere.
Se ha descargado Terrain.raw
</notification>
<notification name="GestureMissing">
- El gesto [NAME] ha desaparecido de la base de datos.
+ No se encuentra en la base de datos el gesto [NAME].
</notification>
<notification name="UnableToLoadGesture">
No se ha podido cargar el gesto [NAME].
@@ -2437,14 +1958,14 @@ Por favor, vuelva a intentarlo.
No se ha podido cargar el hito. Por favor, vuelva a intentarlo.
</notification>
<notification name="CapsKeyOn">
- Tiene pulsada su tecla de bloqueo de mayúsculas, lo que influirá en cómo escriba la contraseña.
-Quizá quiera soltar esa tecla.
+ Tienes pulsada la tecla de mayúsculas.
+Esto puede influir en tu contraseña.
</notification>
<notification name="NotecardMissing">
La nota ha desaparecido de la base de datos.
</notification>
<notification name="NotecardNoPermissions">
- No tiene permisos suficientes para ver la nota.
+ No tienes permiso para ver esta nota.
</notification>
<notification name="RezItemNoPermissions">
No tiene permisos suficientes para renderizar el objeto.
@@ -2482,11 +2003,11 @@ Por favor, vuelva a intentarlo.
Por favor, vuelva a intentarlo.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- No puede comprar a la vez objetos de diferentes propietarios.
-Por favor, elija sólo uno.
+ No puedes comprar más de un objeto a la vez.
+Por favor, selecciona un sólo objeto.
</notification>
<notification name="ObjectNotForSale">
- El objeto no aparece como puesto a la venta.
+ Este objeto no está en venta.
</notification>
<notification name="EnteringGodMode">
Entrando en el modo administrativo, nivel [LEVEL]
@@ -2495,10 +2016,10 @@ Por favor, elija sólo uno.
Saliendo del modo administrativo, nivel [LEVEL]
</notification>
<notification name="CopyFailed">
- No se ha hecho la copia porque usted no tiene permiso para hacerla
+ No tienes pemiso para copiar esto.
</notification>
<notification name="InventoryAccepted">
- [NAME] ha aceptado su oferta del inventario.
+ [NAME] ha recibido tu oferta de inventario.
</notification>
<notification name="InventoryDeclined">
[NAME] ha rehusado su oferta del inventario.
@@ -2513,12 +2034,14 @@ Por favor, elija sólo uno.
Se ha rehusado su tarjeta de visita.
</notification>
<notification name="TeleportToLandmark">
- Ahora que ha llegado a mainland (los continentes), puede teleportarse a localizaciones como &apos;[NAME]&apos; pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Hitos.
-Pulse dos veces en el hito y, luego, pulse en Teleportar para viajar hasta allí.
+ Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
+Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Ahora que ha llegado a mainland (los continentes), puede contactar con residentes como &apos;[NAME]&apos; pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Tarjetas de visita.
-Pulse dos veces en la tarjeta, pulse en Mensaje Instantáneo, y escriba un mensaje.
+ Puedes contactar con residentes como &apos;[NAME]&apos; abriendo el panel Gente, a la derecha de tu pantalla.
+Selecciona un residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
No puede seleccionar un terreno que cruce las fronteras entre servidores.
@@ -2541,6 +2064,9 @@ Inténtelo seleccionando un trozo más pequeño de terreno.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificación de un evento:
@@ -2565,8 +2091,20 @@ Inténtelo seleccionando un trozo más pequeño de terreno.
[NAMES]
</notification>
<notification name="NoQuickTime">
- No se ve como instalado en su sistema el software QuickTime de Apple.
-Si quiere ver por streaming elementos multimedia en las parcelas que los tengan, debe ir al sitio web de QuickTime (http://www.apple.com/quicktime) e instalar el QuickTime Player.
+ No parece que tu sistema tenga instalado el software QuickTime de Apple.
+Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;. Los media de este tipo no estarán disponibles.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Fallo de este &apos;Media Plugin&apos;:
+ [PLUGIN]
+
+Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
+ <form name="form">
+ <ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Se han devuelto a su inventario los objetos de los que usted era propietario en la parcela seleccionada.
@@ -2585,24 +2123,26 @@ Los objetos no transferibles que se transfirieron al grupo han sido borrados.
<notification name="UnOwnedObjectsReturned">
Se han devuelto a sus propietarios los objetos de los que usted NO era propietario en la parcela seleccionada.
</notification>
+ <notification name="ServerObjectMessage">
+ Mensaje de [NAME]:
+[MSG]
+ </notification>
<notification name="NotSafe">
- Este es un terreno con el daño autorizado (&apos;no seguro&apos;).
-Aquí puede ser herido. Si muere, será teleportado a su Base.
+ Este terreno tiene el daño activado.
+Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
</notification>
<notification name="NoFly">
- En este terreno no se permite volar (&apos;no volar&apos;).
-Aquí no debe volar.
+ Este terreno tiene desactivado el poder volar.
+Aquí no puedes volar.
</notification>
<notification name="PushRestricted">
- Este terreno es &apos;Sin empujones&apos;.
-No puede empujar a otros a menos que sea el propietario del terreno.
+ Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
</notification>
<notification name="NoVoice">
- Este terreno tiene desactivada la voz.
+ Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
</notification>
<notification name="NoBuild">
- Este terreno tiene desactivado el construir (&apos;no construir&apos;).
-Aquí no puede crear objetos.
+ Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
</notification>
<notification name="ScriptsStopped">
Un administrador ha detenido temporalmente los scripts en esta región.
@@ -2611,12 +2151,12 @@ Aquí no puede crear objetos.
En esta región no se está ejecutando ningún script.
</notification>
<notification name="NoOutsideScripts">
- Esta región tiene desactivados los scripts de otros
-(&apos;no scripts de otros&apos;).
-No se ejecutará ningún script que no pertenezca al propietario del terreno.
+ Este terreno tiene desactivados los scripts externos.
+
+Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
</notification>
<notification name="ClaimPublicLand">
- Sólo puede reclamar terreno público en la región en que está usted.
+ Sólo puedes reclamar terreno público de la región en que estás.
</notification>
<notification name="RegionTPAccessBlocked">
No está autorizado en esa región por su nivel de calificación. Debe validar su edad y/o instalar el último visor.
@@ -2629,16 +2169,9 @@ Por favor, vaya a la Base de Conocimientos para más detalles sobre el acceso a
<notification name="NoTeenGridAccess">
Su cuenta no puede conectarse a esta región del grid teen.
</notification>
- <notification name="NoHelpIslandTP">
- No puede teleportarse de vuelta a la Help Island (&apos;Isla de Ayuda&apos;).
-Vaya a la &apos;Help Island Public&apos; (&apos;Isla Pública de Ayuda&apos;) para repetir el tutorial.
- </notification>
<notification name="ImproperPaymentStatus">
No tiene el estado de pago adecuado para entrar a esta región.
</notification>
- <notification name="MustGetAgeRegion">
- Debe haber verificado su edad para entrar a esta región.
- </notification>
<notification name="MustGetAgeParcel">
Debe haber verificado su edad para entrar a esta parcela.
</notification>
@@ -2701,7 +2234,8 @@ Por favor, reinténtelo en unos momentos.
No se ha podido encontrar una parcela válida.
</notification>
<notification name="ObjectGiveItem">
- Un objeto llamado [OBJECTFROMNAME], propiedad de [FIRST] [LAST], le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME].
+ Un objeto de nombre [OBJECTFROMNAME], propiedad de [NAME_SLURL], te ha dado un/a [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Guardar"/>
<button name="Discard" text="Descartar"/>
@@ -2709,7 +2243,8 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Un objeto llamado [OBJECTFROMNAME], propiedad de (un usuario desconocido), le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME].
+ Un objeto de nombre [OBJECTFROMNAME], propiedad de (un residente desconocido) te ha dado un/a [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Guardar"/>
<button name="Discard" text="Descartar"/>
@@ -2717,15 +2252,17 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] le ha dado un/a [OBJECTTYPE] de nombre &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] te ha dado un/a [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Guardar"/>
+ <button name="Show" text="Mostrar"/>
<button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2737,7 +2274,7 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] se ha ofrecido a teleportarle hasta su posición:
+ [NAME] te ofrece teleportarte a su localización:
[MESSAGE]
<form name="form">
@@ -2764,6 +2301,9 @@ Por favor, reinténtelo en unos momentos.
<button name="Decline" text="Rehusar"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Has ofrecido amistad a [TO_NAME]
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] le está ofreciendo amistad.
@@ -2788,12 +2328,12 @@ Esto añadirá un ítem a su inventario para que pueda enviar rápidamente a est
</form>
</notification>
<notification name="RegionRestartMinutes">
- La región se reiniciará en [MINUTES] minutos.
-Si permanece en esta región, será desconectado.
+ Esta región se reiniciará en [MINUTES] minutos.
+Si permaneces en esta región serás desconectado.
</notification>
<notification name="RegionRestartSeconds">
- La región se reiniciará en [SECONDS] segundos.
-Si permanece en esta región, será desconectado.
+ Esta región se reiniciará en [SECONDS] segundos.
+Si permaneces en esta región serás desconectado.
</notification>
<notification name="LoadWebPage">
¿Cargar la página web [URL]?
@@ -2813,7 +2353,7 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
</notification>
<notification name="InvalidWearable">
- El ítem que intenta llevar usa una característica que su visor no puede leer. Por favor, actualice su versión de [APP_NAME] para llevar este ítem.
+ El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[NAME]&apos;, querría:
@@ -2827,10 +2367,10 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[NAME]&apos;, querría:
+ Un objeto de nombre &apos;[OBJECTNAME]&apos;, propiedad de &apos;[NAME]&apos;, quiere:
[QUESTIONS]
-Si no confía en este objeto y su creador, debe denegar la solicitud. Para más información, pulse el botón Detalles.
+Si no confias en este objeto y en su creador, deberías rehusar esta petición.
¿Autorizar esta petición?
<form name="form">
@@ -2853,39 +2393,44 @@ Si no confía en este objeto y su creador, debe denegar la solicitud. Para más
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
+ <notification name="ScriptToast">
+ El &apos;[TITLE]&apos; de [FIRST] [LAST] está esperando una respuesta del usuario.
+ <form name="form">
+ <button name="Open" text="Abrir el diálogo"/>
+ <button name="Ignore" text="Ignorar"/>
+ <button name="Block" text="Ignorar"/>
+ </form>
+ </notification>
<notification name="FirstBalanceIncrease">
- Ha recibido [AMOUNT] L$.
-Pueden darle L$ tanto objetos como otros usuarios.
-Su balance se muestra en la esquina superior derecha de la pantalla.
+ Has recibido [AMOUNT] L$.
+Tu saldo de L$ se muestra arriba a la derecha.
</notification>
<notification name="FirstBalanceDecrease">
- Ha pagado [AMOUNT] L$.
-Su balance se muestra en la esquina superior derecha de la pantalla.
+ Acabas de pagar [AMOUNT] L$.
+Tu saldo de L$ se muestra arriba a la derecha.
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ ¡Gracias por tu pago!
+
+Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$.
+
+Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
</notification>
<notification name="FirstSit">
- Está sentado.
-Use las teclas del cursor (o AWSD) para cambiar el punto de vista.
-Pulde el botón &apos;Levantarse&apos; para ponerse de pie.
+ Estás sentado.
+Usa las teclas de cursor (o AWSD) para mirar alrededor.
+Pulsa el botón &apos;Levantarme&apos; para ponerte de pie.
</notification>
<notification name="FirstMap">
- Pulse el mapa y arrástrelo para desplazarlo.
-Púlselo dos veces para teleportarse.
-Use los controles de la derecha para encontrar sitios y mostrar diferentes fondos.
+ Pulsa y arrastra el mapa para ver los alrededores.
+Pulsa dos veces para teleportarte.
+Usa los controles de la derecha para encontrar cosas y mostrar diferentes fondos.
</notification>
<notification name="FirstBuild">
- Usted puede construir objetos nuevos en algunas zonas de [SECOND_LIFE].
-Use las herramientas de arriba a la izquierda para construir, y pruebe a cambiar rápidamente entre ellas pulsando Ctrl o Alt.
-Pulse Esc para dejar de construir.
- </notification>
- <notification name="FirstLeftClickNoHit">
- En algunos objetos concretos, al pulsarlos con el botón izquierdo del ratón interacciona con ellos.
-Si el puntero del ratón pasa a ser una mano puede interactuar con el objeto.
-El botón derecho del ratón siempre muestra un menú con cosas que usted puede hacer.
+ Has abierto las herramientas de construcción. Cada objeto que estás viendo alrededor de ti se ha creado usando estas herramientas.
</notification>
<notification name="FirstTeleport">
- Esta región no permite teleportarse de un punto a otro, por lo que ha sido llevado al Punto de Teleporte más cercano.
-Su destinado está señalado con una columna de luz roja.
-Siga la flecha roja hasta llegar a la columna, o pulse la flecha para hacerla desaparecer.
+ Sólo puedes teleportarte a ciertos lugares de esta región. La flecha apunta al destino que elegiste. Pulsa la flecha para que desaparezca.
</notification>
<notification name="FirstOverrideKeys">
A partir de ahora, sus teclas de movimiento las gestiona un objeto.
@@ -2893,46 +2438,41 @@ Pruebe las teclas del cursor o AWSD para ver qué hacen.
Algunos objetos (las pistolas, por ejemplo) le pedirán que, para usarlos, entre usted en vista subjetiva. Pulse &apos;M&apos; para hacerlo.
</notification>
<notification name="FirstAppearance">
- Está modificando su apariencia.
-Use las teclas del cursor para girar el punto de vista y hacer zoom.
-Cuando acabe, pulse &apos;Guardar todo&apos; para salvar su apariencia y salir del modificarla.
-Puede modificar su apariencia tantas veces como quiera.
+ Estás modicando tu apariencia.
+Usa las teclas de cursor para mirar alrededor.
+Cuando lo hayas hecho, pulsa &apos;Guardar todo&apos;.
</notification>
<notification name="FirstInventory">
- Este es su inventario. Tiene objetos, notas, ropas, y otras cosas de su propiedad.
-* Para vestirse un objeto o un vestuario completo, arrástrelo hasta usted mismo.
-* Para colocar un objeto en el mundo, arrástrelo hasta el suelo.
-* Para leer una nota, pulse dos veces en ella.
+ Este es tu inventario: contiene los ítems de los que eres propietario.
+
+* Para vestirte algo, arrástralo hasta ti mismo.
+* Para colocar un objeto en el mundo, arrástralo hasta el suelo.
+* Para leer una nota, pulsa dos veces en ella.
</notification>
<notification name="FirstSandbox">
- Esta es una región &apos;sandbox&apos; (zona de pruebas).
-Los objetos que construya aquí pueden ser eliminados cuando salga de esta zona, pues los sandbox se limpian regularmente. Por favor, tenga en cuenta la información que hay arriba de su pantalla junto al nombre de la región.
+ Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
-Las regiones sandbox no son frecuentes, y están señalizadas.
+Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
</notification>
<notification name="FirstFlexible">
- Este objeto es flexible.
-Los objetos flexibles no pueden ser materiales, y serán inmateriales hasta que se desmarque la casilla de flexibles.
+ Este objeto es flexible. Los objetos flexibles han de ser inmateriales, no materiales.
</notification>
<notification name="FirstDebugMenus">
- Ha activado el menú Avanzado.
-Contiene herramientas útiles para los desarrolladores que trabajan mejorando [SECOND_LIFE].
-Para pasar este menú a una ventana, pulse Ctrl+Alt+D. En un Mac, pulse &#8997;&#8984;D.
+ Has abierto el menú Avanzado.
+
+Para activar este menú,
+ Windows: Ctrl+Alt+D
+ Mac: ⌥⌘D
</notification>
<notification name="FirstSculptedPrim">
- Está editando un prim &apos;sculpted&apos;.
-Los prim sculpted requieren una textura especial para tomar forma.
-Puede encontrar ejemplos de texturas sculpted en la biblioteca del inventario.
- </notification>
- <notification name="FirstMedia">
- Ha empezado a reproducir media. Puede hacer que los media se reproduzcan automáticamente en la pestaña Audio y Vídeo de la ventana de preferencias. Note que tal cosa puede suponer un riesgo de seguridad en los sitios multimedia en los que no confíe.
+ Está editando un prim &apos;sculpted&apos;. Los prim sculpted necesitan una textura especial para definir su forma.
</notification>
<notification name="MaxListSelectMessage">
Puede seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] le está invitando a un chat de voz.
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama.
+ [NAME] te está invitando a un chat de voz.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2940,17 +2480,17 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST], a quien ha enviado un mensaje instantáneo, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST], a quien ha dado dinero, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al darle dinero.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST], a quien ha ofrecido algo del inventario, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al ofrecerle algo del inventario.
</notification>
<notification name="VoiceInviteGroup">
[NAME] ha empezado un chat de voz con el grupo [GROUP].
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2959,7 +2499,7 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</notification>
<notification name="VoiceInviteAdHoc">
[NAME] ha empezado un chat de voz en multiconferencia.
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2967,8 +2507,8 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] le está invitando a un chat en multiconferencia.
-Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario.
+ NAME] te está invitando a un chat en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2982,25 +2522,25 @@ Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse
Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intente usar la voz en otra zona.
</notification>
<notification name="VoiceChannelDisconnected">
- Ha sido desconectado del [VOICE_CHANNEL_NAME]. Va a ser reconectado al chat de voz del mundo.
+ Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha colgado la llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha rehusado su llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] no está disponible para coger su llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceChannelJoinFailed">
- Fallo al conectar al [VOICE_CHANNEL_NAME]; por favor, inténtelo más tarde. Usted va a ser reconectado al chat de voz del mundo.
+ Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceLoginRetry">
Estamos creando un canal de voz para usted. Se puede tardar hasta un minuto.
</notification>
<notification name="Cannot enter parcel: not a group member">
- No puede entrar en esta parcela, no es miembro del grupo adecuado.
+ Sólo los miembros de un grupo determinado pueden visitar esta zona.
</notification>
<notification name="Cannot enter parcel: banned">
No puede entrar en esta parcela, se le ha prohibido el acceso.
@@ -3015,18 +2555,58 @@ Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse
Ha ocurrido un error intentando conectarle al [VOICE_CHANNEL_NAME]. Por favor, inténtelo más tarde.
</notification>
<notification name="ServerVersionChanged">
- La región en la que ha entrado se ejecuta en un simulador con una versión diferente. Pulse este mensaje para ver más detalles.
+ Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo].
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ No se admite el formato de la SLurl que has pulsado.
+ </notification>
+ <notification name="BlockedSLURL">
+ Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
</notification>
- <notification name="UnableToOpenCommandURL">
- No puede abrirse desde este navegador la URL que ha pulsado.
+ <notification name="ThrottledSLURL">
+ En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
+Por tu seguridad, serán bloqueadas durante unos segundos.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="AttachmentSaved">
+ Se ha guardado el adjunto.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ No se ha podido encontrar un tema de ayuda para este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Error del servidor: fallo en la actualización u obtención de los media.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Un moderador ha silenciado tu chat de texto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Un moderador ha silenciado tu voz.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ ¿Estás seguro de que quieres borrar tu historial de teleportes?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ El botón elegido no se puede mostrar correctamente.
+Se mostrará cuando tenga suficiente espacio.
</notification>
<global name="UnsupportedCPU">
- La velocidad de su CPU no cumple los requerimientos mínimos.
</global>
<global name="UnsupportedGLRequirements">
- Parece que no tiene los requerimientos de hardware apropiados para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tiene, compruebe que tiene los últimos drivers para su tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para su sistema operativo.
+ Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
-Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/support
+Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -3040,10 +2620,8 @@ Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/suppor
<global name="UnsupportedRAM">
- La memoria de su sistema no cumple los requerimientos mínimos.
</global>
- <global name="PermYes">
- Sí
- </global>
- <global name="PermNo">
- No
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Si posees un terreno, puedes hacerlo tu Base.
+También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/es/panel_active_object_row.xml b/indra/newview/skins/default/xui/es/panel_active_object_row.xml
new file mode 100644
index 0000000000..8d4fadb101
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Objeto desconocido
+ </string>
+ <text name="object_name">
+ Objeto sin nombre
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..6f30286216
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <panel name="panel_call_buttons">
+ <button label="Llamar" name="call_btn"/>
+ <button label="Colgar" name="end_call_btn"/>
+ <button label="Controles de la voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..83d7223272
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] seg.
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] min.
+ </string>
+ <string name="FormatHours">
+ [COUNT] h.
+ </string>
+ <string name="FormatDays">
+ [COUNT] d.
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] sem.
+ </string>
+ <string name="FormatMonths">
+ [COUNT] mes/es
+ </string>
+ <string name="FormatYears">
+ [COUNT] año/s
+ </string>
+ <text name="avatar_name" value="Desconocido"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..6513345448
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista de ignorados
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/>
+ <button label="Ignorar al residente..." label_selected="Ignorar al residente..." name="Block resident..." tool_tip="Elige a un residente para ignorarle"/>
+ <button label="Ignorar objetos según el nombre..." label_selected="Ignorar objetos según el nombre..." name="Block object by name..."/>
+ <button label="No ignorar" label_selected="No ignorar" name="Unblock" tool_tip="Quitar objetos o residentes de la lista de ignorados"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_bottomtray.xml b/indra/newview/skins/default/xui/es/panel_bottomtray.xml
new file mode 100644
index 0000000000..9924cd5ed6
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_bottomtray.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Activa/Desactiva el micrófono
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Muestra/Oculta el panel del control de voz
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_box label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Moverme" name="movement_btn" tool_tip="Muestra/Oculta los controles del movimiento"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Hacer una foto"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_classified_info.xml b/indra/newview/skins/default/xui/es/panel_classified_info.xml
new file mode 100644
index 0000000000..3b82994e32
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_classified_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <text name="title" value="Información del clasificado"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="classified_name" value="[nombre]"/>
+ <text name="classified_location" value="[cargando...]"/>
+ <text name="content_type" value="[tipo de contenido]"/>
+ <text name="category" value="[categoría]"/>
+ <check_box label="Renovar automáticamente cada semana" name="auto_renew"/>
+ <text name="price_for_listing" tool_tip="Precio por publicarlo.">
+ [PRICE] L$
+ </text>
+ <text name="classified_desc" value="[descripción]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_alpha.xml b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
new file mode 100644
index 0000000000..3f238da9d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_classified.xml b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
new file mode 100644
index 0000000000..e612104b3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el clasificado" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (se actualizará tras guardarlo)
+ </panel.string>
+ <text name="title">
+ Editar el clasificado
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="Name:">
+ Título:
+ </text>
+ <text name="description_label">
+ Descripción:
+ </text>
+ <text name="location_label">
+ Localización:
+ </text>
+ <text name="classified_location">
+ cargando...
+ </text>
+ <button label="Configurarlo en esta localización" name="set_to_curr_location_btn"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Precio por publicarlo." value="50"/>
+ <check_box label="Renovar automáticamente cada semana" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Guardar" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_eyes.xml b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
new file mode 100644
index 0000000000..e33848554d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Ojos"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
new file mode 100644
index 0000000000..397322466c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Guantes"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_hair.xml b/indra/newview/skins/default/xui/es/panel_edit_hair.xml
new file mode 100644
index 0000000000..49cc8ce98c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Textura" name="Texture" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Color"/>
+ <accordion_tab name="hair_style_tab" title="Estilo"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Cejas"/>
+ <accordion_tab name="hair_facial_tab" title="Facial"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
new file mode 100644
index 0000000000..abee993aec
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tejido superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tejido inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Chaqueta"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pants.xml b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
new file mode 100644
index 0000000000..80eb5f0de0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantalones"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
new file mode 100644
index 0000000000..839e9c6023
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el destacado" name="panel_edit_pick">
+ <text name="title">
+ Editar el destacado
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="Name:">
+ Título:
+ </text>
+ <text name="description_label">
+ Descripción:
+ </text>
+ <text name="location_label">
+ Posición:
+ </text>
+ <text name="pick_location">
+ cargando...
+ </text>
+ <button label="Configurar en la posición actual" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Guardar [WHAT]" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
index bcf4128e01..e1ff6ec92a 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
@@ -1,45 +1,48 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Residente" />
- <string name="AcctTypeTrial"
- value="Prueba" />
- <string name="AcctTypeCharterMember"
- value="Miembro fundador" />
- <string name="AcctTypeEmployee"
- value="Empleado de Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Ha usado una forma de pago" />
- <string name="PaymentInfoOnFile"
- value="Hay infor. de la forma de pago" />
- <string name="NoPaymentInfoOnFile"
- value="Sin infor. de la forma de pago" />
- <string name="AgeVerified"
- value="Edad verificada" />
- <string name="NotAgeVerified"
- value="Edad no verificada" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=es
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Compañero/a:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Mensaje en el estado ocupado:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el perfil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Residente"/>
+ <string name="AcctTypeTrial" value="Prueba"/>
+ <string name="AcctTypeCharterMember" value="Miembro fundador"/>
+ <string name="AcctTypeEmployee" value="Empleado de Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Ha usado una forma de pago"/>
+ <string name="PaymentInfoOnFile" value="Hay infor. de la forma de pago"/>
+ <string name="NoPaymentInfoOnFile" value="Sin infor. de la forma de pago"/>
+ <string name="AgeVerified" value="Edad verificada"/>
+ <string name="NotAgeVerified" value="Edad no verificada"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=es
+ </string>
+ <string name="no_partner_text" value="Ninguno"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Mundo real:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="title_homepage_text">
+ Web:
+ </text>
+ <check_box label="Mostrarme en los resultados de la búsqueda" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Mi cuenta:"/>
+ <text name="my_account_link" value="[[URL] Ir a mi Panel de Control]"/>
+ <text name="acc_status_text" value="Residente. No ha aportado información de pago."/>
+ <text name="title_partner_text" value="Mi compañero/a:"/>
+ <text name="partner_edit_link" value="[[URL] Editar]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Guardar cambios" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shape.xml b/indra/newview/skins/default/xui/es/panel_edit_shape.xml
new file mode 100644
index 0000000000..8a9ac0e9ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Sexo:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Mujer" name="radio"/>
+ <radio_item label="Varón" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Cuerpo"/>
+ <accordion_tab name="shape_head_tab" title="Cabeza"/>
+ <accordion_tab name="shape_eyes_tab" title="Ojos"/>
+ <accordion_tab name="shape_ears_tab" title="Orejas"/>
+ <accordion_tab name="shape_nose_tab" title="Nariz"/>
+ <accordion_tab name="shape_mouth_tab" title="Boca"/>
+ <accordion_tab name="shape_chin_tab" title="Barbilla"/>
+ <accordion_tab name="shape_torso_tab" title="Torso"/>
+ <accordion_tab name="shape_legs_tab" title="Piernas"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
new file mode 100644
index 0000000000..6d65660409
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camisa"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
new file mode 100644
index 0000000000..e613b1809d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Zapatos"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skin.xml b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
new file mode 100644
index 0000000000..2d9e556a4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuajes de la cabeza" name="Head Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuajes superiores" name="Upper Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuajes inferiores" name="Lower Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Color de la piel"/>
+ <accordion_tab name="skin_face_tab" title="Detalles faciales"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquillaje"/>
+ <accordion_tab name="skin_body_tab" title="Detalles del cuerpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
new file mode 100644
index 0000000000..c8e25d38a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Falda"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_socks.xml b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
new file mode 100644
index 0000000000..d65f119da7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Calcetines"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..e5e72a11e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
new file mode 100644
index 0000000000..ea446c1625
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Ropa interior"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..92e42657a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
new file mode 100644
index 0000000000..6d48b77d3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Se puede poner" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Modificando la anatomía
+ </string>
+ <string name="edit_skin_title">
+ Modificando la piel
+ </string>
+ <string name="edit_hair_title">
+ Modificando el pelo
+ </string>
+ <string name="edit_eyes_title">
+ Modificando los ojos
+ </string>
+ <string name="edit_shirt_title">
+ Modificando la camisa
+ </string>
+ <string name="edit_pants_title">
+ Modificando los pantalones
+ </string>
+ <string name="edit_shoes_title">
+ Modificando los zapatos
+ </string>
+ <string name="edit_socks_title">
+ Modificando los calcetines
+ </string>
+ <string name="edit_jacket_title">
+ Modificando la chaqueta
+ </string>
+ <string name="edit_skirt_title">
+ Modificando la falda
+ </string>
+ <string name="edit_gloves_title">
+ Modificando los guantes
+ </string>
+ <string name="edit_undershirt_title">
+ Modificando la camiseta
+ </string>
+ <string name="edit_underpants_title">
+ Modificando la ropa interior
+ </string>
+ <string name="edit_alpha_title">
+ Modificando la capa Alfa
+ </string>
+ <string name="edit_tattoo_title">
+ Modificando los tatuajes
+ </string>
+ <string name="shape_desc_text">
+ Anatomía:
+ </string>
+ <string name="skin_desc_text">
+ Piel:
+ </string>
+ <string name="hair_desc_text">
+ Pelo:
+ </string>
+ <string name="eyes_desc_text">
+ Ojos:
+ </string>
+ <string name="shirt_desc_text">
+ Camisa:
+ </string>
+ <string name="pants_desc_text">
+ Pantalones:
+ </string>
+ <string name="shoes_desc_text">
+ Zapatos:
+ </string>
+ <string name="socks_desc_text">
+ Calcetines:
+ </string>
+ <string name="jacket_desc_text">
+ Chaqueta:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Falda:
+ </string>
+ <string name="gloves_desc_text">
+ Guantes:
+ </string>
+ <string name="undershirt_desc_text">
+ Camiseta:
+ </string>
+ <string name="underpants_desc_text">
+ Ropa interior:
+ </string>
+ <string name="alpha_desc_text">
+ Capa alfa:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuaje:
+ </string>
+ <text name="edit_wearable_title" value="Modificando la anatomía"/>
+ <panel label="Camisa" name="wearable_type_panel">
+ <text name="description_text" value="Anatomía:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Guardar como" name="save_as_button"/>
+ <button label="Revertir" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_friends.xml b/indra/newview/skins/default/xui/es/panel_friends.xml
index ea5c7d1e4f..833b71a038 100644
--- a/indra/newview/skins/default/xui/es/panel_friends.xml
+++ b/indra/newview/skins/default/xui/es/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Varios amigos...
+ Varios amigos
</string>
<scroll_list name="friend_list" tool_tip="Para seleccionar a varios amigos, mantenga pulsado Ctrl o Mays. mientras les va pulsando.">
<column name="icon_online_status" tool_tip="Estado de conexión"/>
@@ -13,8 +13,8 @@
</scroll_list>
<button label="MI/Llamada" name="im_btn" tool_tip="Abrir sesión de mensajes instantáneos"/>
<button label="Perfil" name="profile_btn" tool_tip="Mostrar la imagen, los grupos, y otra información"/>
- <button label="Teleportar..." name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
- <button label="Pagar..." name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
- <button label="Quitar..." name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
- <button label="Añadir..." name="add_btn" tool_tip="Ofrecer ser mi amigo a un residente"/>
+ <button label="Teleporte" name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
+ <button label="Pagar" name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
+ <button label="Quitar" name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
+ <button label="Añadir" name="add_btn" tool_tip="Ofrecer ser mi amigo a un residente"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_control_panel.xml b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
new file mode 100644
index 0000000000..c55d69b8a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <button label="Perfil del grupo" name="group_info_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Llamar al grupo" name="call_btn"/>
+ <button label="Colgar" name="end_call_btn"/>
+ <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index 4fd5685b7d..4f7c7e599e 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -1,72 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="General" name="general_tab">
- <string name="help_text">
- La pestaña General contiene información global de este grupo, la lista de propietarios y miembros visibles, las preferencias generales del grupo, y las opciones de los miembros.
+ <panel.string name="help_text">
+ La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
-Ponga su ratón sobre las opciones para más información.
- </string>
- <string name="group_info_unchanged">
- La información general del grupo ha cambiado.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Escriba aquí el nombre de su nuevo grupo" name="group_name_editor"/>
- <text name="group_name">
- Escriba aquí el nombre de su nuevo grupo
- </text>
- <text name="prepend_founded_by">
- Creado por
- </text>
- <text name="founder_name">
- (esperando)
- </text>
- <text name="group_charter_label">
- Carta del grupo
- </text>
- <texture_picker label="Emblema del grupo" name="insignia" tool_tip="Pulse para elegir una imagen"/>
+Deja el cursor sobre las opciones para ver más ayuda.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Ha cambiado la información general del grupo
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando los datos de los miembros
+ </panel.string>
<text_editor name="charter">
Carta del grupo
</text_editor>
- <button label="Entrar (0 L$)" label_selected="Entrar (0 L$)" name="join_button"/>
- <button label="Ver en detalle" label_selected="Ver en detalle" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Propietarios y Miembros visibles
- </text>
- <text name="text_owners_are_shown_in_bold">
- (los propietarios aparecen en negrilla)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nombre del miembro" name="name" relwidth="0.40"/>
+ <name_list.columns label="Miembro" name="name" relwidth="0.40"/>
<name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
- <name_list.columns label="Última conexión" name="online" relwidth="0.35"/>
</name_list>
- <text name="text_group_preferences">
- Preferencias del grupo
+ <text name="active_title_label">
+ Mi etiqueta
</text>
+ <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
+ <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envía &apos;spam&apos;."/>
+ <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
<panel name="preferences_container">
- <check_box label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Dejar que la gente vea este grupo en los resultados de la búsqueda."/>
- <check_box label="Inscripción libre" name="open_enrollement" tool_tip="Definir si se admiten al grupo nuevos miembros sin que sea preciso invitárseles."/>
- <check_box label="Cuota de inscripción:" name="check_enrollment_fee" tool_tip="Define si se requiere una cuota para entrar al grupo."/>
- <spinner width="60" left_delta="130" name="spin_enrollment_fee" tool_tip="Cuando está marcado &apos;Cuota de inscripción&apos;, los miembros nuevos deben pagar esta cuota para entrar al grupo."/>
- <combo_box bottom_delta="-38" width="150" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;.">
- <combo_box.item name="select_mature" label="- Elegir Calificación -"/>
- <combo_box.item name="mature" label="Contenido &apos;Mature&apos;"/>
- <combo_box.item name="pg" label="Contenido &apos;PG&apos;"/>
+ <check_box label="Inscripción libre" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
+ <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
+ <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;." width="150">
+ <combo_box.item label="Contenido &apos;PG&apos;" name="pg"/>
+ <combo_box.item label="Contenido &apos;Mature&apos;" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mi etiqueta activa
- </text>
- <combo_box name="active_title" tool_tip="Define la etiqueta que aparecerá sobre el nombre de su avatar cuando tenga activo este grupo."/>
- </panel>
- <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Define si quiere recibir avisos de este grupo. Desmarque esto si el grupo le envía spam."/>
- <check_box label="Mostrar el grupo en mi perfil" name="list_groups_in_profile" tool_tip="Define si quiere que este grupo aparezca en su perfil."/>
+ <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
</panel>
- <string name="incomplete_member_data_str">
- Recuperando los datos de los miembros
- </string>
- <string name="confirm_group_create_str">
- Crear este grupo cuesta 100 L$.
-¿Está plena, absoluta, y TOTALMENTE seguro de que quiere gastarse 100 L$ para crear este grupo?
-Queda avisado de que si, en un plazo de 48 horas, no entra nadie al grupo, éste será disuelto, y el nombre no se podrá usar en el futuro.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..be08a1aaa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Información del grupo" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Hay cambios sin guardar en la pestaña actual
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ¿Quieres guardar estos cambios?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Entrar ([AMOUNT] L$)
+ </panel.string>
+ <panel.string name="group_join_free">
+ Gratis
+ </panel.string>
+ <text name="group_name" value="(Cargando...)"/>
+ <line_editor label="Escribe aquí el nombre de tu nuevo grupo" name="group_name_editor"/>
+ <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(buscando)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="¡ENTRA AHORA!" name="btn_join"/>
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="General"/>
+ <accordion_tab name="group_roles_tab" title="Roles"/>
+ <accordion_tab name="group_notices_tab" title="Avisos"/>
+ <accordion_tab name="group_land_tab" title="Terreno/Bienes"/>
+ </accordion>
+ <panel name="button_row">
+ <button label="Crear" label_selected="Grupo nuevo" name="btn_create"/>
+ <button label="Guardar" label_selected="Guardar" name="btn_apply"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_invite.xml b/indra/newview/skins/default/xui/es/panel_group_invite.xml
index f66f0c473a..08993d6ed8 100644
--- a/indra/newview/skins/default/xui/es/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_invite.xml
@@ -1,24 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Invitar a un miembro" name="invite_panel" width="224">
- <text name="help_text" height="72" bottom_delta="-96" width="214">
+ <panel.string name="confirm_invite_owner_str">
+ ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente!
+ </panel.string>
+ <panel.string name="loading">
+ (cargando...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ No se invitará a algunos avatares porque ya están en el grupo.
+ </panel.string>
+ <text bottom_delta="-96" height="72" name="help_text" width="214">
Puede seleccionar a varios residentes
para invitarles a su grupo. Para
empezar, pulse &apos;Abrir el selector de
residentes&apos;.
</text>
<button bottom_delta="-10" label="Abrir el selector de residentes" name="add_button" tool_tip=""/>
- <name_list height="156" bottom_delta="-160" name="invitee_list" tool_tip="Para seleccionar a varios residentes, mantenga pulsada la tecla Ctrl y vaya pulsando sus nombres."/>
- <button left_delta="-7" width="214" label="Eliminar de la lista a los seleccionados" name="remove_button" tool_tip="Elimina los residentes seleccionados de la lista de invitaciones."/>
+ <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="Apretando la tecla Ctrl, pulsa en los nombres de los residentes para elegir a varios"/>
+ <button label="Eliminar de la lista a los seleccionados" left_delta="-7" name="remove_button" tool_tip="Quitar a los residentes seleccionados de la lista de invitaciones" width="214"/>
<text name="role_text">
Elegir qué rol asignarles:
</text>
- <combo_box name="role_name" tool_tip="Elige de la lista de roles cuál asignar a los miembros."/>
+ <combo_box name="role_name" tool_tip="Elige el rol de entre la lista de aquellos que estás autorizado a asignar"/>
<button label="Enviar las invitaciones" name="ok_button"/>
<button label="Cancelar" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente!
- </string>
- <string name="loading">
- (cargando...)
+ <string name="GroupInvitation">
+ Invitar al grupo
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_land_money.xml b/indra/newview/skins/default/xui/es/panel_group_land_money.xml
index bccc114624..2ad290b49f 100644
--- a/indra/newview/skins/default/xui/es/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_land_money.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terreno y L$" name="land_money_tab">
<string name="help_text">
- Se listan las parcelas propiedad del grupo, detallando las contribuciones. Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total. Las pestañas &apos;Planificación&apos;, &apos;Detalles&apos; y &apos;Ventas&apos; aportan información sobre las finanzas del grupo
+ Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total.
</string>
<button label="?" name="help_button"/>
<string name="cant_view_group_land_text">
- No tiene permiso para ver qué terreno posee el grupo.
+ No tienes permiso para ver el terreno propiedad del grupo
</string>
<string name="cant_view_group_accounting_text">
- No tiene permiso para ver la información de la cuenta del grupo.
+ No tienes permiso para ver la información de la cuenta del grupo.
</string>
<string name="loading_txt">
Cargando...
@@ -23,7 +23,7 @@
<column label="Superficie" name="area" width="81"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="map_button" left="282" width="130"/>
+ <button label="Mapa" label_selected="Mapa" left="282" name="map_button" width="130"/>
<text name="total_contributed_land_label">
Contribución total:
</text>
@@ -43,43 +43,42 @@
[AREA] m²
</text>
<text name="your_contribution_label">
- Su contribución:
+ Tu contribución:
</text>
<string name="land_contrib_error">
- No se ha podido defininir su contribución de terreno.
+ No se ha podido definir tu contribución de terreno
</string>
<text name="your_contribution_units">
- ( m² )
+ m²
</text>
<text name="your_contribution_max_value">
([AMOUNT] máx.)
</text>
<text name="group_over_limit_text">
- Los miembros del grupo deben contribuir con más créditos de terreno
-para mantener el terreno en uso.
+ Se necesitan más créditos de terreno para mantener el terreno en uso
</text>
<text name="group_money_heading">
L$ del grupo
</text>
<tab_container name="group_money_tab_container">
- <panel label="Planificación" name="group_money_planning_tab">
+ <panel label="RESUMEN" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Calculando...
+ Cargando...
</text_editor>
</panel>
- <panel label="Detalles" name="group_money_details_tab">
+ <panel label="DETALLES" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Calculando...
+ Cargando...
</text_editor>
- <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_details_button" tool_tip="Ir hacia atrás en el tiempo"/>
- <button label="Después &gt;" label_selected="Después &gt;" name="later_details_button" tool_tip="Ir hacia adelante en el tiempo"/>
+ <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_details_button" tool_tip="Anterior"/>
+ <button label="Después &gt;" label_selected="Después &gt;" name="later_details_button" tool_tip="Siguiente"/>
</panel>
- <panel label="Ventas" name="group_money_sales_tab">
+ <panel label="VENTAS" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Calculando...
+ Cargando...
</text_editor>
- <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_sales_button" tool_tip="Ir hacia atrás en el tiempo"/>
- <button label="Después &gt;" label_selected="Después &gt;" name="later_sales_button" tool_tip="Ir hacia adelante en el tiempo"/>
+ <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_sales_button" tool_tip="Anterior"/>
+ <button label="Después &gt;" label_selected="Después &gt;" name="later_sales_button" tool_tip="Siguiente"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_list_item.xml b/indra/newview/skins/default/xui/es/panel_group_list_item.xml
new file mode 100644
index 0000000000..4b6373f6ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Desconocido"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_notices.xml b/indra/newview/skins/default/xui/es/panel_group_notices.xml
index c6788b3a65..02365fc698 100644
--- a/indra/newview/skins/default/xui/es/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_notices.xml
@@ -1,35 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Avisos" name="notices_tab">
- <text name="help_text">
+ <panel.string name="help_text">
Los avisos son una forma rápida de comunicación dentro de un grupo, difundiendo un mensaje y, si se quiere, añadiéndole un ítem. Los avisos sólo los reciben los miembros del grupo cuyo rol tiene adjudicada tal habilidad. Puede desactivar los avisos en la pestaña General.
- </text>
- <text name="no_notices_text">
- No hay avisos pasados.
- </text>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Archivo de avisos del grupo
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ No hay avisos pasados
+ </panel.string>
<text name="lbl2">
- Los avisos se mantienen durante 14 días. Las listas de avisos tienen un límite de 200 avisos por día.
+ Los avisos se mantienen durante 14 días.
+El máximo es de 200 por día y grupo.
</text>
<scroll_list name="notice_list">
- <column label="Asunto" name="subject"/>
- <column label="De" name="from"/>
- <column label="Fecha" name="date"/>
+ <scroll_list.columns label="Asunto" name="subject"/>
+ <scroll_list.columns label="De" name="from"/>
+ <scroll_list.columns label="Fecha" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- No se han encontrado.
+ No se han encontrado
</text>
- <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice"/>
- <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices"/>
+ <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice" tool_tip="Crear un aviso nuevo"/>
+ <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices" tool_tip="Actualizar la lista de avisos"/>
<panel label="Crear un aviso nuevo" name="panel_create_new_notice">
<text name="lbl">
Crear un aviso
</text>
- <text name="lbl2">
- Puede añadir un ítem al aviso arrastrándolo desde su inventario a este panel. Los ítems anexados deben ser copiables y transferibles, y no se puede enviar una carpeta.
- </text>
<text name="lbl3">
Asunto:
</text>
@@ -39,16 +33,19 @@
<text name="lbl5">
Anexar:
</text>
- <button label="Remover lo anexado" label_selected="Remover lo anexado" name="remove_attachment"/>
+ <text name="string">
+ Arrastra y suelta aquí un ítem para adjuntarlo:
+ </text>
+ <button label="Quitar" label_selected="Remover lo anexado" name="remove_attachment"/>
<button label="Enviar" label_selected="Enviar" name="send_notice"/>
- <panel name="drop_target" tool_tip="Para enviar un ítem con el aviso, arrástrelo desde su inventario hasta el cuadro del mensaje. Para poder enviar ese objeto con el aviso, usted debe tener permiso para copiarlo y transferirlo."/>
+ <group_drop_target name="drop_target" tool_tip="Para enviar un ítem con el aviso, arrástralo desde tu inventario hasta este cajetín. Para poder adjuntarlo, debes tener permiso para copiarlo y transferirlo."/>
</panel>
<panel label="Ver avisos pasados" name="panel_view_past_notice">
<text name="lbl">
Avisos archivados
</text>
<text name="lbl2">
- Pulse el botón &apos;Crear un aviso nuevo&apos; para enviar uno nuevo.
+ Para enviar un aviso nuevo, pulsa el botón +
</text>
<text name="lbl3">
Asunto:
@@ -56,6 +53,6 @@
<text name="lbl4">
Mensaje:
</text>
- <button label="Abrir lo anexado" label_selected="Abrir lo anexado" name="open_attachment"/>
+ <button label="Abrir el adjunto" label_selected="Abrir lo anexado" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_notify.xml b/indra/newview/skins/default/xui/es/panel_group_notify.xml
new file mode 100644
index 0000000000..7bdacbd1e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Nombre del emisor / Nombre del grupo"/>
+ </panel>
+ <text name="attachment" value="Adjunto"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_roles.xml b/indra/newview/skins/default/xui/es/panel_group_roles.xml
index 2739a3da5e..29d96d8d9e 100644
--- a/indra/newview/skins/default/xui/es/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_roles.xml
@@ -1,158 +1,119 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Miembros y Roles" name="roles_tab">
- <string name="default_needs_apply_text">
- En esta pestaña hay cambios sin aplicar.
- </string>
- <string name="want_apply_text">
- ¿Quiere aplicar estos cambios?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Miembros y Roles
- </text>
- <text name="static2">
- Los miembros del grupo tienen asignados roles con distintas capacidades.
-Estas configuraciones son fácilmente personalizables, para facilitar una
-mayor flexibilidad y organización.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Roles
- </text>
- <text name="role_properties_modifiable">
- Elija un rol de los de abajo. Puede modificar su nombre, su
-descripción, y la etiqueta de los miembros.
- </text>
- <text name="role_properties_not_modifiable">
- Elija un rol de los de abajo para ver sus propiedades, miembros, y qué
-capacidades tiene asignadas.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- También puede asignar capacidades al rol.
- </text>
- <text name="role_actions_not_modifiable">
- Puede ver, pero no modificar, las capacidades asignadas.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Capacidades
- </text>
- <text name="static2">
- Puede ver una descripción de la capacidad, y qué miembros y roles pueden
-realizarla.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ En esta pestaña hay cambios sin guardar
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ¿Quieres guardar estos cambios?
+ </panel.string>
<tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Miembros" name="members_sub_tab" tool_tip="Miembros">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <name_list name="member_list" bottom_delta="-105" height="104" >
- <column label="Nombre del miembro" name="name"/>
- <column label="Cuotas donadas" name="donated"/>
- <column label="Última conexión" name="online"/>
- </name_list>
- <button label="Invitar a un nuevo miembro..." name="member_invite" width="175"/>
- <button label="Expulsar del grupo" name="member_eject"/>
- <string name="help_text">
+ <panel height="148" label="MIEMBROS" name="members_sub_tab" tool_tip="Miembros">
+ <panel.string name="help_text">
Puede añadir o quitar los roles asignados a los miembros.
Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada uno de ellos.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar los miembros" name="filter_input"/>
+ <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list.columns label="Miembro" name="name"/>
+ <name_list.columns label="Donaciones" name="donated"/>
+ <name_list.columns label="Estatus" name="online"/>
+ </name_list>
+ <button label="Invitar" name="member_invite" width="175"/>
+ <button label="Expulsar" name="member_eject"/>
</panel>
- <panel height="148" label="Roles" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <scroll_list name="role_list" bottom_delta="-104" height="104">
- <column label="Nombre del rol" name="name"/>
- <column label="Etiqueta" name="title"/>
- <column label="Miembros" name="members"/>
+ <panel height="148" label="ROLES" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Los roles tienen una etiqueta propia y unas capacidades que se
+permiten ejercer a sus miembros. Los miembros pueden
+tener más de un rol. Un grupo puede tener hasta 10 roles,
+incluyendo el de Todos y el de Propietarios.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Los roles de &apos;Todos&apos; y &apos;Propietarios&apos; son especiales, y no pueden eliminarse.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtrar los roles" name="filter_input"/>
+ <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list.columns label="Rol" name="name"/>
+ <scroll_list.columns label="Etiqueta" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Crear un rol nuevo..." name="role_create"/>
+ <button label="Añadir un rol" name="role_create"/>
<button label="Eliminar el rol" name="role_delete"/>
- <string name="help_text">
- Los roles tienen una etiqueta y una serie de capacidades permitidas que los miembros pueden desarrollar. Los miembros pueden tener más de un rol. Un grupo puede tener hasta 10 roles, incluyendo el de Todos y el de Propietarios.
- </string>
- <string name="cant_delete_role">
- Los roles de &apos;Todos&apos; y &apos;Propietarios&apos; son especiales, y no pueden eliminarse.
- </string>
</panel>
- <panel height="148" label="Capacidades" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elija una capacidad para verla más en detalle.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- <string name="help_text">
+ <panel height="148" label="CAPACIDADES" name="actions_sub_tab" tool_tip="Puedes ver una descripción de la capacidad y qué miembros y roles la tienen.">
+ <panel.string name="help_text">
Las capacidades permiten a los miembros que tienen ese rol el hacer tareas específicas dentro de este grupo. Hay una gran variedad de capacidades.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar las capacidades" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elige una capacidad para verla más en detalle">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
- Roles asignados
+ Miembros asignados
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
Capacidades permitidas
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
- </scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
+ <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
- Nombre
- </text>
- <text name="static2">
- Descripción
+ Nombre del rol
</text>
<line_editor name="role_name">
Empleados
</line_editor>
<text name="static3">
- Etiqueta
+ Etiqueta del rol
</text>
<line_editor name="role_title">
(esperando)
</line_editor>
+ <text name="static2">
+ Descripción
+ </text>
<text_editor name="role_description">
(esperando)
</text_editor>
<text name="static4">
- Miembros asignados
+ Roles asignados
</text>
+ <check_box label="Mostrar los miembros" name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/>
<text name="static5" tool_tip="Una lista de las capacidades que puede desarrollar el rol seleccionado actualmente.">
Capacidades asignadas
</text>
- <check_box label="Los miembros son visibles." name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/>
- <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades.">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
<text name="static">
- Descripción
+ Descripción de la capacidad
</text>
<text_editor name="action_description">
Esta capacidad es la de &apos;Expulsar miembros de este grupo&apos;. Sólo un propietario puede expulsar a otro.
</text_editor>
<text name="static2">
- Roles con la capacidad
+ Roles con esta capacidad
</text>
<text name="static3">
- Miembros con la capacidad
+ Miembros con esta capacidad
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
new file mode 100644
index 0000000000..5f69c50b73
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Desconocido"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ <button label="Teleportarse" name="teleport_btn"/>
+ <button label="Compartir" name="share_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Llamada" name="call_btn"/>
+ <button label="Colgar" name="end_call_btn"/>
+ <button label="Controles de Voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
new file mode 100644
index 0000000000..c4d9d4a2b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Crear un hito"/>
+ <string name="title_edit_landmark" value="Editar el hito"/>
+ <string name="title_landmark" value="Hito"/>
+ <string name="not_available" value="(No disp.)"/>
+ <string name="unknown" value="(desconocidas)"/>
+ <string name="public" value="(público)"/>
+ <string name="server_update_text">
+ Los datos de este lugar no están disponibles sin una actualización del servidor.
+ </string>
+ <string name="server_error_text">
+ Los datos de este lugar no están disponibles por el momento. Por favor, prueba más tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Por restricciones en el acceso, los datos de esta localización no están disponibles. Por favor, revisa tus permisos con el propietario de la parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <text name="title" value="Añadir el perfil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="desconocido"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Propietario:"/>
+ <text name="creator_label" value="Creador:"/>
+ <text name="created_label" value="Creado:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Título:"/>
+ <text name="notes_label" value="Mis notas:"/>
+ <text name="folder_label" value="Localización del hito:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_landmarks.xml b/indra/newview/skins/default/xui/es/panel_landmarks.xml
new file mode 100644
index 0000000000..8c2aa96b3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barra de favoritos"/>
+ <accordion_tab name="tab_landmarks" title="Hitos"/>
+ <accordion_tab name="tab_inventory" title="Mi Inventario"/>
+ <accordion_tab name="tab_library" title="Biblioteca"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <button name="add_btn" tool_tip="Añadir un nuevo hito"/>
+ <dnd_button name="trash_btn" tool_tip="Quitar el hito seleccionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 6505424b35..5485575aec 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,37 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
- <text name="first_name_text">
- Nombre:
- </text>
- <text name="last_name_text">
- Apellido:
- </text>
- <text name="password_text">
- Contraseña:
- </text>
- <text name="start_location_text">
- Posición inicial:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Mi Base"/>
- <combo_box.item name="MyLastLocation" label="Mi última posición"/>
- <combo_box.item name="Typeregionname" label="&lt;Escriba el nombre de la Región&gt;"/>
- </combo_box>
- <check_box label="Recordar la contraseña" name="remember_check"/>
- <button label="Iniciar sesión" label_selected="Iniciar sesión" name="connect_btn"/>
- <text name="create_new_account_text">
- Regístrese para obtener una cuenta
- </text>
- <text name="forgot_password_text">
- ¿Olvidó su nombre o su contraseña?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=es
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Nombre:
+ </text>
+ <line_editor label="Nombre" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <line_editor label="Apellido" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <check_box label="Recordar" name="remember_check"/>
+ <text name="start_location_text">
+ Empezar en:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi Base" name="MyHome"/>
+ </combo_box>
+ <button label="Iniciar sesión" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Registrarse
+ </text>
+ <text name="login_help">
+ ¿Necesitas ayuda para conectarte?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_main_inventory.xml b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
new file mode 100644
index 0000000000..8656098467
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cosas" name="main inventory panel">
+ <panel.string name="Title">
+ Cosas
+ </panel.string>
+ <filter_editor label="Filtrar" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Todos los ítems" name="All Items"/>
+ <inventory_panel label="Ãtems recientes" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar más opciones"/>
+ <button name="add_btn" tool_tip="Añadir un ítem nuevo"/>
+ <dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Archivo" name="File">
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu label="Subir" name="upload">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Ventana nueva" name="New Window"/>
+ <menu_item_call label="Ver los filtros" name="Show Filters"/>
+ <menu_item_call label="Restablecer los filtros" name="Reset Current"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="Close All Folders"/>
+ <menu_item_call label="Vaciar la Papelera" name="Empty Trash"/>
+ <menu_item_call label="Vaciar Objetos Perdidos" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Crear" name="Create">
+ <menu_item_call label="Carpeta nueva" name="New Folder"/>
+ <menu_item_call label="Script nuevo" name="New Script"/>
+ <menu_item_call label="Nota nueva" name="New Note"/>
+ <menu_item_call label="Gesto nuevo" name="New Gesture"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Forma nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Ordenar" name="Sort">
+ <menu_item_check label="Alfabéticamente" name="By Name"/>
+ <menu_item_check label="Cronológicamente" name="By Date"/>
+ <menu_item_check label="Las carpetas siempre alfabéticamente" name="Folders Always By Name"/>
+ <menu_item_check label="Las carpetas del sistema, arriba" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml
new file mode 100644
index 0000000000..fe5c91bafe
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mi perfil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="Destacados" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
new file mode 100644
index 0000000000..3cf10e0e2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="Media Settings General">
+ <text name="home_label">
+ Web:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (La Lista Blanca especificada no aprueba esta página)
+ </text>
+ <line_editor name="home_url" tool_tip="Página inicial para el origen de este media"/>
+ <text name="preview_label">
+ Vista previa
+ </text>
+ <text name="current_url_label">
+ Página actual:
+ </text>
+ <text name="current_url" tool_tip="La página actual para el origen de este media" value=""/>
+ <button label="Definir" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Media en bucle" name="auto_loop"/>
+ <check_box initial_value="false" label="A la primera pulsación" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
+ <check_box initial_value="false" label="Ejecutar automáticamente los media" name="auto_play"/>
+ <text name="media_setting_note">
+ Nota: los residentes pueden elegir una configuración distinta de ésta
+ </text>
+ <check_box initial_value="false" label="Ajustar automáticamente los media en la cara del objeto" name="auto_scale"/>
+ <text name="size_label">
+ Tamaño:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..3e625f56fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Personalizar" name="Media settings for controls">
+ <text name="controls_label">
+ Controles:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Estándar
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_group_control"/>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
new file mode 100644
index 0000000000..f4debc88fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Seguridad" name="Media Settings Security">
+ <check_box initial_value="false" label="Permitir el acceso sólo a estas URL (según prefijo)" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Están marcadas las entradas que la página web no admite:
+ </text>
+ <button label="Añadir" name="whitelist_add"/>
+ <button label="Borrar" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Atención: la página web especificada en la pestaña General no se admite en esta Lista Blanca. Se ha desactivado hasta que se añada una entrada correcta.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_my_profile.xml b/indra/newview/skins/default/xui/es/panel_my_profile.xml
new file mode 100644
index 0000000000..41623e8acb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_my_profile.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="no_partner_text" value="Ninguno/a"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Página web:
+ </text>
+ <text name="title_member_text" value="Miembro desde:"/>
+ <text name="title_acc_status_text" value="Estado de la cuenta:"/>
+ <text name="acc_status_text" value="Residente. No ha aportado información de pago."/>
+ <text name="title_partner_text" value="Compañero/a:"/>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Añadir como amigo" name="add_friend"/>
+ <button label="MI" name="im"/>
+ <button label="Llamada" name="call"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Teleporte" name="teleport"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Edita tu información personal"/>
+ <button label="Editar la apariencia" name="edit_appearance_btn" tool_tip="Crea o edita tu apariencia: físico, ropas, etc."/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
new file mode 100644
index 0000000000..8e595096d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <button name="back_btn" tool_tip="Volver a lo localización anterior"/>
+ <button name="forward_btn" tool_tip="Ir una localización adelante"/>
+ <button name="home_btn" tool_tip="Teleportar a mi Base"/>
+ <location_input label="Localización" name="location_combo"/>
+ <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
+ <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite">
+ <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
new file mode 100644
index 0000000000..986c109c41
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ CHAT
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..1df45108ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/>
+ <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml
new file mode 100644
index 0000000000..26d5a044c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notas y Privacidad" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Mis notas privadas:"/>
+ <text name="status_message2" value="Permitir que esta persona:"/>
+ <check_box label="Vea si estoy conectado" name="status_check"/>
+ <check_box label="Me vea en el mapa" name="map_check"/>
+ <check_box label="Edite, borre o coja mis objetos" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Añadir" name="add_friend" tool_tip="Ofrecer amistad al residente"/>
+ <button label="MI" name="im" tool_tip="Abrir un mensaje instantáneo"/>
+ <button label="Llamada" name="call" tool_tip="Llamar a este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Ver al residente en el mapa"/>
+ <button label="Teleportar" name="teleport" tool_tip="Ofrecer teleporte"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..7d966bba37
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <accordion_tab name="tab_cof" title="Vestuario actual"/>
+ <accordion_tab name="tab_outfits" title="Mis vestuarios"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..8fc265504b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Reemplazar el vestuario actual" name="wear"/>
+ <menu_item_call label="Añadir al vestuario actual" name="add"/>
+ <menu_item_call label="Quitar del vestuario actual" name="remove"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Quitar" name="remove_link"/>
+ <menu_item_call label="Borrar" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
new file mode 100644
index 0000000000..35a6c4f641
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Gente" name="people_panel">
+ <string name="no_people" value="No hay nadie"/>
+ <string name="no_one_near" value="No hay nadie cerca"/>
+ <string name="no_friends_online" value="No hay amigos conectados"/>
+ <string name="no_friends" value="No hay amigos"/>
+ <string name="no_groups" value="No hay grupos"/>
+ <string name="people_filter_label" value="Filtrar a la gente"/>
+ <string name="groups_filter_label" value="Filtrar a los grupos"/>
+ <filter_editor label="Filtrar" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="CERCANÃA" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opciones"/>
+ <button name="add_friend_btn" tool_tip="Añadir a tu lista de amigos al residente seleccionado"/>
+ </panel>
+ </panel>
+ <panel label="AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Conectado"/>
+ <accordion_tab name="tab_all" title="Todas"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opciones"/>
+ <button name="add_btn" tool_tip="Ofrecer amistad a un residente"/>
+ <button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="GRUPOS" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opciones"/>
+ <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/>
+ <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/>
+ </panel>
+ </panel>
+ <panel label="RECIENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opciones"/>
+ <button name="add_friend_btn" tool_tip="Añadir a tu lista de amigos al residente seleccionado"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imagen, grupos y otra información de los residentes"/>
+ <button label="MI" name="im_btn" tool_tip="Abrir un mensaje instantáneo"/>
+ <button label="Llamada" name="call_btn" tool_tip="Llamar a este residente"/>
+ <button label="Compartir" name="share_btn"/>
+ <button label="Teleportarse" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/>
+ <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_pick_info.xml b/indra/newview/skins/default/xui/es/panel_pick_info.xml
new file mode 100644
index 0000000000..c55addbc93
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Información del destacado"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[nombre]"/>
+ <text name="pick_location" value="[cargando...]"/>
+ <text name="pick_desc" value="[descripción]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleporte" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_picks.xml b/indra/newview/skins/default/xui/es/panel_picks.xml
new file mode 100644
index 0000000000..abedc6c551
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Destacados" name="panel_picks">
+ <string name="no_picks" value="No hay destacados"/>
+ <string name="no_classifieds" value="No hay clasificados"/>
+ <text name="empty_picks_panel_text">
+ No hay ni destacados ni clasificados
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Destacados"/>
+ <accordion_tab name="tab_classifieds" title="Clasificados"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Crear un nuevo destacado o clasificado de la posición actual"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Información" name="info_btn" tool_tip="Mostrar la información del destacado"/>
+ <button label="Teleportarse" name="teleport_btn" tool_tip="Teleportar a esta zona"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar esta zona en el mapa del mundo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
new file mode 100644
index 0000000000..ad1b832979
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Cualquiera"/>
+ <string name="available" value="disponible"/>
+ <string name="allocated" value="asignados"/>
+ <string name="title_place" value="Añadir el perfil"/>
+ <string name="title_teleport_history" value="Localización del historial de teleportes"/>
+ <string name="not_available" value="(No disp.)"/>
+ <string name="unknown" value="(desconocido)"/>
+ <string name="public" value="(público)"/>
+ <string name="none_text" value="(ninguno)"/>
+ <string name="sale_pending_text" value="(venta pendiente)"/>
+ <string name="group_owned_text" value="(propiedad de un grupo)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Todos los residentes"/>
+ <string name="group_text" value="Grupo"/>
+ <string name="can_resell">
+ El terreno comprado en esta región puede revenderse.
+ </string>
+ <string name="can_not_resell">
+ El terreno comprado en esta región no puede revenderse.
+ </string>
+ <string name="can_change">
+ El terreno comprado en esta región puede unirse o dividirse.
+ </string>
+ <string name="can_not_change">
+ El terreno comprado en esta región no puede unirse o dividirse.
+ </string>
+ <string name="server_update_text">
+ La información de esta parcela no está disponible sin una actualización del servidor.
+ </string>
+ <string name="server_error_text">
+ En este momento no está disponible la información de esta parcela. Por favor, inténtalo más tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Por tener restringido el acceso, no está disponible la información de esta parcela. Por favor, revisa tus permisos con el propietario de la parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <text name="title" value="Añadir el perfil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Propietario:"/>
+ <text name="maturity_value" value="desconocido"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parcela">
+ <panel>
+ <text name="rating_label" value="Calificación:"/>
+ <text name="rating_value" value="desconocida"/>
+ <text name="voice_label" value="Voz:"/>
+ <text name="voice_value" value="Sí"/>
+ <text name="fly_label" value="Volar:"/>
+ <text name="fly_value" value="Sí"/>
+ <text name="push_label" value="Empujones:"/>
+ <text name="push_value" value="No"/>
+ <text name="build_label" value="Construir:"/>
+ <text name="build_value" value="Sí"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Sí"/>
+ <text name="damage_label" value="Daño:"/>
+ <text name="damage_value" value="No"/>
+ <button label="Acerca del terreno" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Región">
+ <panel>
+ <text name="region_name_label" value="Región:"/>
+ <text name="region_type_label" value="Tipo:"/>
+ <text name="region_rating_label" value="Calificación:"/>
+ <text name="region_owner_label" value="Propietario:"/>
+ <text name="region_group_label" value="Grupo:"/>
+ <button label="Región/Estado" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Estado">
+ <panel>
+ <text name="estate_name_label" value="Estado:"/>
+ <text name="estate_rating_label" value="Calificación:"/>
+ <text name="estate_owner_label" value="Propietario:"/>
+ <text name="covenant_label" value="Contrato:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="En venta">
+ <panel>
+ <text name="sales_price_label" value="Precio:"/>
+ <text name="area_label" value="Ãrea:"/>
+ <text name="traffic_label" value="Tráfico:"/>
+ <text name="primitives_label" value="Primitivas:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Límites de modificación del terreno:"/>
+ <text name="subdivide_label" value="Puede dividirse/unirse:"/>
+ <text name="resale_label" value="Puede revenderse:"/>
+ <text name="sale_to_label" value="En venta a:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml
new file mode 100644
index 0000000000..4a64fa3320
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_places.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lugares" name="places panel">
+ <string name="landmarks_tab_title" value="MIS HITOS"/>
+ <string name="teleport_history_tab_title" value="HISTORIAL DE TELEPORTES"/>
+ <filter_editor label="Filtrar los lugares" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleporte" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ <button label="Cerrar" name="close_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Guardar" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index 02fb4da017..3dc6cad90e 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
+ <panel.string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </panel.string>
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <check_box label="Bocadillos del chat" name="bubble_text_chat"/>
+ <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/>
+ <slider label="Opacidad" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="ancho / alto">
- Proporción:
+ Proporción
</text>
<combo_box name="aspect_ratio" tool_tip="ancho / alto">
<combo_box.item label="4:3 (Standard CRT)" name="item1"/>
@@ -9,4 +18,31 @@
<combo_box.item label="8:5 (Widescreen)" name="item3"/>
<combo_box.item label="16:9 (Widescreen)" name="item4"/>
</combo_box>
+ <check_box label="Detectar automáticamente" name="aspect_auto_detect"/>
+ <text name="heading1">
+ Cámara:
+ </text>
+ <slider label="Ãngulo de visión" name="camera_fov"/>
+ <slider label="Distancia" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posicionamiento automático para:
+ </text>
+ <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/>
+ <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/>
+ <text name="heading3">
+ Avatares:
+ </text>
+ <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/>
+ <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
+ <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/>
+ <check_box label="Mostrar los errores de los scripts" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="En el chat" name="0"/>
+ <radio_item label="En una ventana" name="1"/>
+ </radio_group>
+ <check_box label="Modo &apos;un toque&apos; para el micrófono cuando pulses la tecla:" name="push_to_talk_toggle_check" tool_tip="En el modo &apos;un toque&apos;, pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo &apos;un toque&apos;, el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/>
+ <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/>
+ <button label="Elegir la tecla" name="set_voice_hotkey_button"/>
+ <button label="Botón de en medio del ratón" name="set_voice_middlemouse_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
index a71ac172a3..433d7d15b4 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ventanas emergentes" name="popups" title="Ventanas emergentes">
- <text name="dont_show_label">
- No mostrar estas ventanas emergentes:
+ <text name="tell_me_label">
+ Avisarme:
</text>
- <button width="200" label="Activar esta ventana emergente" label_selected="Activar esta popup" name="enable_popup"/>
- <button width="255" left="225" label="Activar todas las ventanas emergentes..." label_selected="Restaurar cajas de diálogo &apos;Mostrar en la próxima vez&apos;..." name="reset_dialogs_btn" tool_tip="Activar todas las ventanas emergentes y los avisos de &apos;primera vez que se usa&apos;."/>
+ <check_box label="Cuando gaste o consiga L$" name="notify_money_change_checkbox"/>
+ <check_box label="Cuando mis amigos se conecten o desconecten" name="friends_online_notify_checkbox"/>
<text name="show_label" width="300">
- Mostrar estas ventanas emergentes:
+ Mostrar siempre estos avisos:
</text>
- <button left="205" width="275" label="Desactivar todas estas ventanas emergentes..." name="skip_dialogs_btn" tool_tip="Desactivar todas las ventanas emergentes y los avisos de &apos;primera vez que se usa&apos;."/>
- <text name="text_box2">
- Oferta de notas, texturas e hitos:
+ <text name="dont_show_label">
+ No mostrar nunca estos avisos:
</text>
- <check_box label="Aceptar automáticamente" name="accept_new_inventory"/>
- <check_box label="Ver automáticamente tras aceptar" name="show_new_inventory"/>
- <check_box label="Mostrar automáticamente los objetos aceptados recientemente en el inventario" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index 4e9dc6db6f..89243afbb5 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat de texto" name="chat">
- <text name="text_box">
- Tamaño de la fuente
-del chat:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Pequeño" />
- <radio_item name="radio2" label="Medio" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Disminuir" name="radio"/>
+ <radio_item label="Media" name="radio2"/>
+ <radio_item label="Aumentar" name="radio3"/>
</radio_group>
<color_swatch label="Usted" name="user"/>
<text name="text_box1">
- Usted
+ Yo
</text>
<color_swatch label="Otros" name="agent"/>
<text name="text_box2">
@@ -37,22 +33,14 @@ del chat:
<text name="text_box7">
Propietario
</text>
- <color_swatch label="Bocadillo" name="background"/>
- <text name="text_box8">
- Bocadillo
- </text>
<color_swatch label="URL" name="links"/>
<text name="text_box9">
URL
</text>
- <check_box label="Ver en el chat los avisos y errores de los scripts" name="script_errors_as_chat"/>
- <spinner label="Quitar el chat tras" name="fade_chat_time" label_width="95" width="145" />
- <slider label="Opacidad" name="console_opacity"/>
- <check_box label="Usar el ancho de la pantalla (tras reiniciar)" name="chat_full_width_check"/>
- <check_box label="Cerrar el chat al pulsar Intro" name="close_chat_on_return_check"/>
- <check_box label="En el chat, las teclas del cursor mueven el avatar" name="arrow_keys_move_avatar_check"/>
- <check_box label="Incluir la hora en el chat" name="show_timestamps_check"/>
- <check_box label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/>
- <check_box label="Mostrar el chat en bocadillos" name="bubble_text_chat"/>
- <slider label="Opacidad" name="bubble_chat_opacity"/>
+ <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/>
+ <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/>
+ <radio_group name="chat_window" tool_tip="Ver tus mensajes instantáneos en ventanas separadas o en una sola con varias pestañas (requiere volverse a conectar)">
+ <radio_item label="Varias ventanas" name="radio"/>
+ <radio_item label="Una ventana" name="radio2"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 2b813a18bf..7402f6270d 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -1,90 +1,64 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="General" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base." label="Mi Base"/>
- <combo_box.item name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición." label="Mi última posición"/>
- </combo_box>
- <check_box label="Ver mi posición inicial en la pantalla de inicio de sesión" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nunca"/>
- <combo_box.item name="Show Temporarily" label="Mostrarlos temporalmente"/>
- <combo_box.item name="Always" label="Siempre"/>
- </combo_box>
- <check_box label="Nombres de avatar en pequeño" name="small_avatar_names_checkbox"/>
- <check_box label="No ver mi nombre en mi pantalla" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Etiquetas de grupo:
- </text>
- <check_box label="Ocultar las etiquetas de grupo" name="show_all_title_checkbox"/>
- <check_box label="Ocultar mi etiqueta de grupo" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/>
- <text name="UI Size:">
- Tamaño de la interfaz:
+ <text name="language_textbox">
+ Idioma:
</text>
- <check_box label="Resolución independiente del tamaño" name="ui_auto_scale"/>
- <spinner label="Ausente tras:" name="afk_timeout_spinner"/>
- <check_box label="Avisar cuando gasto o recibo dólares Linden (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Calificación:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglés)" name="English"/>
+ <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francés) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
+ <combo_box.item label="Portugués (Portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (requiere reiniciar)
</text>
<text name="maturity_desired_prompt">
Quiero acceder a contenido calificado:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;"/>
- <combo_box.item name="Desired_Mature" label="&apos;PG&apos; y &apos;Mature&apos;"/>
- <combo_box.item name="Desired_PG" label="&apos;PG&apos;"/>
+ <combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;" name="Desired_Adult"/>
+ <combo_box.item label="&apos;PG&apos; y &apos;Mature&apos;" name="Desired_Mature"/>
+ <combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- &apos;PG&apos;
- </text>
<text name="start_location_textbox">
- Posición inicial:
+ Localización inicial:
</text>
- <text name="show_names_textbox">
- Mostrar los nombres:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
+ <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Etiquetas de los nombres:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio"/>
+ <radio_item label="On" name="radio2"/>
+ <radio_item label="Mostrar brevemente" name="radio3"/>
+ </radio_group>
+ <check_box label="Mostrar mi nombre" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Etiquetas de los avatares en pequeño" name="small_avatar_names_checkbox"/>
+ <check_box label="Mostrar las etiquetas de grupo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Color de mis efectos:
+ Mis efectos:
+ </text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/>
+ <text name="title_afk_text">
+ Ausente tras:
</text>
+ <spinner label="Ausente tras:" name="afk_timeout_spinner"/>
<text name="seconds_textbox">
segundos
</text>
- <text name="crash_report_textbox">
- Informes de caídas:
- </text>
- <text name="language_textbox">
- Idioma:
- </text>
- <text name="language_textbox2">
- (Tendrá efecto tras reiniciar)
+ <text name="text_box3">
+ Respuesta cuando estoy en el modo ocupado:
</text>
- <string name="region_name_prompt">
- &lt;escriba el nombre de la región&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Preguntar antes de enviar"/>
- <combo_box.item name="Alwayssend" label="Enviar siempre"/>
- <combo_box.item name="Neversend" label="No enviar nunca"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Predeterminado del sistema"/>
- <combo_box.item name="English" label="English (Inglés)"/>
- <combo_box.item name="Danish" label="Dansk (Danés) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Alemán) - Beta"/>
- <combo_box.item name="Spanish" label="Español - Beta"/>
- <combo_box.item name="French" label="Français (Francés) - Beta"/>
- <combo_box.item name="Italian" label="Italiano - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Neerlandés) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polaco) - Beta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugués) - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Ruso) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chino) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japonés) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coreano) - Beta"/>
- </combo_box>
- <check_box label="Compartir el idioma con los objetos" name="language_is_public" tool_tip="Hace que los objetos con script del mundo sepan su idioma preferido."/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 4038940256..dc7d692531 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -1,43 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Gráficos" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Abrir Second Life en una ventana" name="windowed mode"/>
- <text_editor name="FullScreenInfo" width="480">
- Si no está marcado, el visor se mostrará en pantalla completa cuando inicie sesión.
- </text_editor>
- <text name="WindowSizeLabel">
- Tamaño de la ventana:
+ <text name="UI Size:">
+ Tamaño de la UI:
</text>
- <combo_box left="124" name="windowsize combo">
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="720x480" label="720x480 (NTSC)"/>
- <combo_box.item name="768x576" label="768x576 (PAL)"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- </combo_box>
- <text name="DisplayResLabel">
- Resolución:
+ <text name="QualitySpeed">
+ Calidad y velocidad:
</text>
- <combo_box left="124" name="fullscreen combo" />
- <text name="AspectRatioLabel1" tool_tip="ancho / alto">
- Proporción:
- </text>
- <combo_box left="124" name="aspect_ratio" tool_tip="ancho / alto">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)"/>
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/>
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)"/>
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)"/>
- </combo_box>
- <check_box label="Detectar automáticamente &#10;la proporción" name="aspect_auto_detect" left="295" />
- <text name="HigherText">
- Calidad y
- </text>
- <text name="QualityText">
- Rendimiento:
- </text>
- <text name="FasterText" left="95">
+ <text left="95" name="FasterText">
El más rápido
</text>
+ <text name="BetterText">
+ Mejor
+ </text>
<text name="ShadersPrefText">
Bajo
</text>
@@ -50,97 +24,83 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2" left="325" >
- Más alto
- </text>
- <text name="QualityText2" left="325" >
- calidad
- </text>
- <check_box label="Personalizar" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shaders:
- </text>
- <check_box label="Efecto de relieve y brillo" name="BumpShiny"/>
- <check_box label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
- <check_box label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
- <check_box label="Reflejos en el agua" name="Reflections"/>
- <text name="ReflectionDetailText">
- Objetos reflejados:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terreno y árboles" />
- <radio_item name="1" label="Todos los objetos estáticos" />
- <radio_item name="2" label="Todos los avatares y objetos" />
- <radio_item name="3" label="Todo" />
- </radio_group>
- <text name="AvatarRenderingText">
- Renderización del avatar:
- </text>
- <check_box label="Avatares simulados" name="AvatarImpostors"/>
- <check_box label="Renderizado por hardware" name="AvatarVertexProgram"/>
- <check_box label="Ropas del avatar" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Distancia de dibujo:" name="DrawDistance"/>
- <slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="Calidad del procesamiento:" name="RenderPostProcess" label_width="142"/>
- <text name="MeshDetailText">
- Detalle de la malla:
- </text>
- <slider label=" Objetos:" name="ObjectMeshDetail"/>
- <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/>
- <slider label=" Ãrboles:" name="TreeMeshDetail"/>
- <slider label=" Avatares:" name="AvatarMeshDetail"/>
- <slider label=" Terreno:" name="TerrainMeshDetail"/>
- <slider label=" Cielo:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Baja
- </text>
- <text name="ObjectMeshDetailText">
- Bajo
- </text>
- <text name="FlexibleMeshDetailText">
- Bajo
- </text>
- <text name="TreeMeshDetailText">
- Bajo
- </text>
- <text name="AvatarMeshDetailText">
- Bajo
- </text>
- <text name="TerrainMeshDetailText">
- Bajo
- </text>
- <text name="SkyMeshDetailText">
- Bajo
- </text>
- <text name="LightingDetailText" width="135">
- Detalles de la iluminación:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Sólo el Sol y la Luna" />
- <radio_item name="LocalLights" label="Puntos de luz cercanos" />
- </radio_group>
- <text name="TerrainDetailText">
- Nivel de detalle del
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Shaders:
+ </text>
+ <check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
+ <check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
+ <check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflejos en el agua" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Objetos reflejados:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terreno y árboles" name="0"/>
+ <radio_item label="Todos los objetos estáticos" name="1"/>
+ <radio_item label="Todos los avatares y objetos" name="2"/>
+ <radio_item label="Todo" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Renderización del avatar:
+ </text>
+ <check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/>
+ <slider label="Distancia de dibujo:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
+ <slider label="Calidad del procesamiento:" label_width="142" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Detalle de la malla:
+ </text>
+ <slider label=" Objetos:" name="ObjectMeshDetail"/>
+ <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/>
+ <slider label=" Ãrboles:" name="TreeMeshDetail"/>
+ <slider label=" Avatares:" name="AvatarMeshDetail"/>
+ <slider label=" Terreno:" name="TerrainMeshDetail"/>
+ <slider label=" Cielo:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Baja
+ </text>
+ <text name="ObjectMeshDetailText">
+ Bajo
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Bajo
+ </text>
+ <text name="TreeMeshDetailText">
+ Bajo
+ </text>
+ <text name="AvatarMeshDetailText">
+ Bajo
+ </text>
+ <text name="TerrainMeshDetailText">
+ Bajo
+ </text>
+ <text name="SkyMeshDetailText">
+ Bajo
+ </text>
+ <text name="LightingDetailText" width="135">
+ Detalles de la iluminación:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Sólo el Sol y la Luna" name="SunMoon"/>
+ <radio_item label="Puntos de luz cercanos" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Nivel de detalle del
terreno:
- </text>
- <radio_group name="TerrainDetailRadio" left_delta="60">
- <radio_item name="0" label="Bajo" />
- <radio_item name="2" label="Alto" />
- </radio_group>
+ </text>
+ <radio_group left_delta="60" name="TerrainDetailRadio">
+ <radio_item label="Bajo" name="0"/>
+ <radio_item label="Alto" name="2"/>
+ </radio_group>
</panel>
- <button label="Configuraciones recomendadas" name="Defaults" width="195" left="110"/>
- <button label="Opciones del hardware" label_selected="Opciones del hardware" name="GraphicsHardwareButton" left="315"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+ <button label="Por defecto" left="110" name="Defaults" width="195"/>
+ <button label="Avanzado" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" left="315" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index cbaa3d96ee..fbc885abc4 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -1,34 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Comunicación" name="im">
- <text name="text_box">
- Mi estado de conexión:
+ <panel.string name="log_in_to_change">
+ Conéctate para que cambie
+ </panel.string>
+ <button label="Limpiar el historial" name="clear_cache"/>
+ <text name="cache_size_label_l">
+ (Localizaciones, imágenes, web, historial de búsqueda)
</text>
- <check_box label="Sólo pueden ver si estoy conectado mis amigos y grupos" name="online_visibility"/>
- <text name="text_box2">
- Opciones de los MI:
+ <check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
+ <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
+ <check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
+ <check_box label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
+ <check_box label="Permitir la ejecución automática de los media" name="autoplay_enabled"/>
+ <text name="Logs:">
+ Registros:
</text>
- <string name="log_in_to_change">
- inicie sesión para cambiar
- </string>
- <check_box label="Enviar MI al correo electrónico ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Incluir los MI en la consola del chat" name="include_im_in_chat_console"/>
- <check_box label="Incluir la hora en los MI" name="show_timestamps_check"/>
- <check_box label="Avisar si se conecta un amigo" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Mensaje en el estado
-ocupado:
- </text>
- <text name="text_box4">
- Opciones de los
-registros:
- </text>
- <check_box label="Guardar un registro de los MI en mi ordenador" name="log_instant_messages"/>
- <check_box label="Incluir la hora en el registro de los MI" name="log_instant_messages_timestamp"/>
- <check_box label="Mostrar el final de la última conversación por MI" name="log_show_history"/>
- <check_box label="Guardar un registro del chat en mi ordenador" name="log_chat"/>
- <check_box label="Incluir la hora en el registro del chat" name="log_chat_timestamp"/>
- <check_box label="Mostrar en el chat la llegada de los MI" name="log_chat_IM"/>
- <check_box label="Incluir la fecha junto a la hora" name="log_date_timestamp"/>
- <button label="Cambiar la ruta" label_selected="Cambiar la ruta" name="log_path_button" width="120"/>
+ <check_box label="Guardar en mi ordenador registros del chat" name="log_nearby_chat"/>
+ <check_box label="Guardar en mi ordenador registros de los MI" name="log_instant_messages"/>
+ <check_box label="Añadir fecha y hora" name="show_timestamps_check_im"/>
<line_editor left="278" name="log_path_string" right="-20"/>
+ <text name="log_path_desc">
+ Ruta de los registros
+ </text>
+ <button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/>
+ <button label="Lista de ignorados" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 967626b8d5..d58878b120 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -1,32 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Dispositivos y Cámara" name="Input panel">
- <text name=" Mouselook Options:">
+ <button bottom_delta="-40" label="Otros dispositivos" name="joystick_setup_button"/>
+ <text name="Mouselook:">
Vista subjetiva:
</text>
- <text name=" Mouse Sensitivity:">
- Sensibilidad del ratón:
+ <text name=" Mouse Sensitivity">
+ Sensibilidad del ratón
</text>
- <check_box label="Invertir el ratón" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Vuelo:
+ <check_box label="Invertir" name="invert_mouse"/>
+ <text name="Network:">
+ Red:
</text>
- <check_box label="Despegar/Aterrizar pulsando RePág/AvPág" name="automatic_fly"/>
- <text name=" Camera Options:">
- Opciones de la cámara:
+ <text name="Maximum bandwidth">
+ Ancho de banda máximo
</text>
- <text name="camera_fov_label" width="218">
- Ãngulo de vista de la cámara:
+ <text name="text_box2">
+ kbps
</text>
- <slider bottom_delta="-6" width="128" left="326" name="camera_fov" />
- <text name="Camera Follow Distance:" width="218">
- Distancia a la que sigue la cámara:
+ <check_box label="Personalizar el puerto" name="connection_port_enabled"/>
+ <spinner label="Número de puerto:" name="web_proxy_port"/>
+ <text name="cache_size_label_l">
+ Tamaño de la caché
</text>
- <slider bottom_delta="-6" width="128" left="326" name="camera_offset_scale" />
- <check_box label="Reorientar la cámara al editar" name="edit_camera_movement" tool_tip="Usar la reorientación automática de la cámara al entrar y salir del modo de edición"/>
- <check_box label="Reorientar la cámara al modificar la apariencia" name="appearance_camera_movement" tool_tip="Usar la reorientación automática de la cámara mientras se modifica la apariencia"/>
- <text name="text2">
- Visualización del avatar:
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Elegir" label_selected="Elegir" name="set_cache"/>
+ <button label="Recuperar" label_selected="Configurar" name="reset_cache"/>
+ <text name="Cache location">
+ Ruta de la caché
+ </text>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]."/>
+ <radio_item label="Usar mi navegador (IE, Firefox)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa."/>
+ </radio_group>
+ <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/>
+ <line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/>
+ <button label="Buscar" label_selected="Buscar" name="set_proxy"/>
+ <text name="Proxy location">
+ Localización del proxy
</text>
- <check_box label="Ver el avatar en vista subjetiva" name="first_person_avatar_visible"/>
- <button bottom_delta="-40" label="Configurar el joystick" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 241f3042fe..5ec5ba88fa 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -1,38 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Audio y Vídeo" name="Preference Media panel">
- <slider label="General" name="System Volume"/>
+<panel label="Sonidos" name="Preference Media panel">
+ <slider label="Volumen general" name="System Volume"/>
+ <check_box initial_value="true" label="Silenciar al minimizar" name="mute_when_minimized"/>
<slider label="Ambiental" name="Wind Volume"/>
- <slider label="Sonidos" name="SFX Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Interfaz" name="UI Volume"/>
- <slider label="Música" name="Music Volume"/>
+ <slider label="Botones" name="UI Volume"/>
+ <slider label="Medios de comunicación" name="Media Volume"/>
+ <slider label="Efectos sonoros" name="SFX Volume"/>
+ <slider label="Música en streaming" name="Music Volume"/>
+ <check_box label="Voz" name="enable_voice_check"/>
<slider label="Voz" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- El chat de voz no está disponible
- </text_editor>
- <check_box label="Activar el chat de voz" name="enable_voice_check"/>
+ <text name="Listen from">
+ Oír desde:
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Oír el chat desde la posición de la cámara." />
- <radio_item name="1" label="Oír el chat desde la posición del avatar." />
+ <radio_item label="La posición de la cámara" name="0"/>
+ <radio_item label="La posición del avatar" name="1"/>
</radio_group>
- <button label="Configuración de los dispositivos" name="device_settings_btn" width="210" />
- <text name="muting_text">
- Volumen:
- </text>
- <text name="streaming_prefs_text">
- Preferencias multimedia:
- </text>
- <text name="audio_prefs_text">
- Preferencias de sonido:
- </text>
- <panel label="Volumen" name="Volume Panel"/>
- <check_box label="Si hay música, reproducirla en streaming" name="streaming_music"/>
- <check_box label="Si hay media, reproducirlos en streaming" name="streaming_video"/>
- <check_box label="Reproducir automáticamente los media" name="auto_streaming_video"/>
- <check_box label="Silenciar el sonido al minimizar la ventana" name="mute_when_minimized"/>
- <slider label="Efecto Doppler" name="Doppler Effect" label_width="140" width="270" />
- <slider label="Distancia de escucha" name="Distance Factor" label_width="140" width="270" />
- <slider label="Nivel de atenuación" name="Rolloff Factor" label_width="140" width="270" />
- <spinner label="Avisar de transacción de L$ desde" name="L$ Change Threshold" label_width="195" width="259"/>
- <spinner label="Avisar del estado de la vida desde" name="Health Change Threshold" label_width="195" width="259"/>
+ <button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/>
+ <panel label="Configuración de dispositivos" name="device_settings_panel">
+ <panel.string name="default_text">
+ Por defecto
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Mi volumen:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
+ <text name="wait_text">
+ Por favor, espera
+ </text>
+ <text name="Output">
+ Salida
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..4701c67e06
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <layout_stack name="media_controls">
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL de los media"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Lista Blanca activada"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progreso de la película"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Silenciar este media"/>
+ <slider name="volume_slider" tool_tip="Volumen de los media"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack>
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Los media se están cargando"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
new file mode 100644
index 0000000000..f61c7c3e33
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=es-ES
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=es
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
+ <string name="no_partner_text" value="Ninguno"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Web:
+ </text>
+ <text name="title_member_text" value="Miembro desde:"/>
+ <text name="title_acc_status_text" value="Estado de la cuenta:"/>
+ <text name="acc_status_text" value="Residente. No ha aportado información de pago."/>
+ <text name="title_partner_text" value="Compañero/a:"/>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad al residente"/>
+ <button label="MI" name="im" tool_tip="Abrir un mensaje instantáneo"/>
+ <button label="Llamada" name="call" tool_tip="Llamar a este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Ver al residente en el mapa"/>
+ <button label="Teleportarse" name="teleport" tool_tip="Ofrecer teleporte"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Pagar dinero o dar algo del inventario al residente"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Editar el perfil" name="edit_profile_btn"/>
+ <button label="Modificar la apariencia" name="edit_appearance_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml
new file mode 100644
index 0000000000..b556346051
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Conectado/a
+ </string>
+ <string name="status_offline">
+ Desconectado/a
+ </string>
+ <text_editor name="user_name" value="(Cargando...)"/>
+ <text name="status" value="Conectado/a"/>
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="DESTACADOS" name="panel_picks"/>
+ <panel label="NOTAS Y PRIVACIDAD" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 220479098b..7713a173e5 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Contrato" name="Covenant">
<text name="estate_section_lbl">
- Estado:
+ Estado
</text>
<text name="estate_name_lbl">
Nombre:
@@ -22,7 +22,7 @@
Última modificación el miér. 31 de dic. de 1969, 16:00:00
</text>
<button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-263" height="178" >
+ <text_editor bottom="-263" height="178" name="covenant_editor">
No se ha aportado un contrato para este estado.
</text_editor>
<button label="Cambiar" name="reset_covenant"/>
@@ -30,11 +30,11 @@
Los cambios en el contrato se mostrarán en todas las parcelas
del estado.
</text>
- <text name="covenant_instructions" bottom_delta="-31" >
- Para cambiar el contrato de este estado, arrastre y suelte una nota.
+ <text bottom_delta="-31" name="covenant_instructions">
+ Arrastra y suelta una nota para cambiar el contrato de este Estado.
</text>
<text name="region_section_lbl">
- Región:
+ Región
</text>
<text name="region_name_lbl">
Nombre:
diff --git a/indra/newview/skins/default/xui/es/panel_region_debug.xml b/indra/newview/skins/default/xui/es/panel_region_debug.xml
index a7999cc54d..64162220a6 100644
--- a/indra/newview/skins/default/xui/es/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_debug.xml
@@ -7,11 +7,11 @@
desconocida
</text>
<check_box label="Desactivar los scripts" name="disable_scripts_check" tool_tip="Descativar todos los scripts en esta región"/>
- <button label="?" name="disable_scripts_help" left="215"/>
+ <button label="?" left="215" name="disable_scripts_help"/>
<check_box label="Desactivar las colisiones" name="disable_collisions_check" tool_tip="Desactiva las colisiones (no las de avatares) en esta región"/>
- <button label="?" name="disable_collisions_help" left="215"/>
+ <button label="?" left="215" name="disable_collisions_help"/>
<check_box label="Desactivar las propiedades físicas" name="disable_physics_check" tool_tip="Desactiva toda la física en esta región"/>
- <button label="?" name="disable_physics_help" left="215"/>
+ <button label="?" left="215" name="disable_physics_help"/>
<button label="Aplicar" name="apply_btn"/>
<text name="objret_text_lbl" width="130">
Devolver el objeto
@@ -22,18 +22,18 @@
<line_editor name="target_avatar_name">
(nadie)
</line_editor>
- <button label="Elegir..." name="choose_avatar_btn"/>
+ <button label="Elegir" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opciones:
</text>
- <check_box label="Devolver sólo los objetos con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos que tengan scripts."/>
- <check_box label="Devolver sólo los objetos que están en terreno de otro" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/>
- <check_box label="Devolver los objetos de cualquier región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/>
+ <check_box label="Con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos con scripts"/>
+ <check_box label="En el terreno de otros" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/>
+ <check_box label="En cada región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/>
<button label="Devolver" name="return_btn"/>
- <button width="280" label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales"/>
- <button label="?" name="top_colliders_help" left="297"/>
- <button width="280" label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts"/>
- <button label="?" name="top_scripts_help" left="297"/>
+ <button label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales" width="280"/>
+ <button label="?" left="297" name="top_colliders_help"/>
+ <button label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts" width="280"/>
+ <button label="?" left="297" name="top_scripts_help"/>
<button label="Reiniciar la región" name="restart_btn" tool_tip="Cuenta atrás de 2 minutos y reiniciar la región"/>
<button label="?" name="restart_help"/>
<button label="Retrasar el reinicio" name="cancel_restart_btn" tool_tip="Retrasar una hora el reinicio de la región"/>
diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml
index f16ec89cb0..437ecd4e10 100644
--- a/indra/newview/skins/default/xui/es/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml
@@ -11,7 +11,7 @@ pestaña afectarán a todas las regiones del estado.
(desconocido)
</text>
<text name="owner_text">
- Propietario:
+ Propietario del Estado:
</text>
<text name="estate_owner">
(desconocido)
@@ -24,10 +24,10 @@ pestaña afectarán a todas las regiones del estado.
<check_box label="Permitir el acceso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Impedir el acceso a Residentes...
+ Acceso restringido a cuentas verificadas por:
</text>
- <check_box label="sin información de pago archivada" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/>
- <check_box label="que no han verificado si son adultos" name="limit_age_verified" tool_tip="Impedir el acceso a residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/>
+ <check_box label="Información de pago aportada" name="limit_payment" tool_tip="Expulsar a los residentes no identificados"/>
+ <check_box label="Verificación de la edad" name="limit_age_verified" tool_tip="Prohibir el acceso a residentes que no hayan verificado su edad. Para más información, ver [SUPPORT_SITE]."/>
<check_box label="Permitir el chat de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir el teleporte a cualquier punto" name="allow_direct_teleport"/>
diff --git a/indra/newview/skins/default/xui/es/panel_region_texture.xml b/indra/newview/skins/default/xui/es/panel_region_texture.xml
index 5540358f97..83c22d20eb 100644
--- a/indra/newview/skins/default/xui/es/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_texture.xml
@@ -48,7 +48,7 @@
Estos valores representan la gama de mezclas para las texturas superiores.
</text>
<text name="height_text_lbl11">
- Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1,
+ Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1, y el valor ALTA es la altura MÃNIMA de la textura #4.
</text>
<text name="height_text_lbl12">
y el valor ALTA es la altura MÃNIMA de la textura #4.
diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml
new file mode 100644
index 0000000000..c73db729fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Cargando...
+ </panel.string>
+ <panel.string name="can_not_view">
+ No puedes ver ni editar este script. Ha sido configurado como &quot;no copiable&quot;. Necesitas todos los permisos para ver o editar un script que está dentro de un objeto.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Los objetos públicos no pueden ejecutar scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Ejecutándose
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Cargando...
+ </text_editor>
+ <button label="Guardar" label_selected="Guardar" name="Save_btn"/>
+ <combo_box label="Insertar..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Archivo" name="File">
+ <menu_item_call label="Guardar" name="Save"/>
+ <menu_item_call label="Deshacer todos los cambios" name="Revert All Changes"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+ <menu_item_call label="Buscar / Reemplazar..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Ayuda" name="Help">
+ <menu_item_call label="Ayuda..." name="Help..."/>
+ <menu_item_call label="Ayuda de palabras clave..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_side_tray.xml b/indra/newview/skins/default/xui/es/panel_side_tray.xml
new file mode 100644
index 0000000000..1222f620f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_side_tray.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Base." name="sidebar_home" tab_title="Home">
+ <panel label="base" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Encuentra a tus amigos, contactos y gente que esté cerca." name="sidebar_people" tab_title="People">
+ <panel_container name="panel_container">
+ <panel label="Información del grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encontrar lugares donde ir o que ya visitaste." label="Lugares" name="sidebar_places" tab_title="Places">
+ <panel label="Lugares" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Edita tu perfil público y tus destacados." name="sidebar_me" tab_title="My Profile">
+ <panel label="Yo" name="panel_me"/>
+ </sidetray_tab>
+ <sidetray_tab description="Cambia tu apariencia y tu &apos;look&apos; actual." name="sidebar_appearance" tab_title="My Appearance">
+ <panel label="Modificar la apariencia" name="sidepanel_appearance"/>
+ </sidetray_tab>
+ <sidetray_tab description="Mira tu inventario." name="sidebar_inventory" tab_title="My Inventory">
+ <panel label="Modificar el inventario" name="sidepanel_inventory"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..3633b0ccaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Panel lateral"/>
+ <button name="show_help" tool_tip="Ver ayuda"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..350aec9c69
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Levantarme" name="stand_btn" tool_tip="Pulsa aquí para levantarte."/>
+ <button label="Dejar de volar" name="stop_fly_btn" tool_tip="Dejar de volar"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 31cde7d237..a3443aee25 100644
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -1,38 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nombre de la parcela en la que está. Pulse Acerca del terreno.">
- el nombre de la parcela va aquí
- </text>
- <text name="BalanceText" tool_tip="Saldo de su cuenta">
- Cargando...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinero"/>
- <text name="TimeText" tool_tip="Hora actual (costa oeste EE.UU.)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Errores y alertas de los scripts"/>
- <button label="" label_selected="" name="health" tool_tip="Vida"/>
- <text name="HealthText" tool_tip="Vida">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Prohibido volar"/>
- <button label="" label_selected="" name="no_build" tool_tip="No se permite Construir/Renderizar"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="No se permiten los scripts"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Sin &apos;empujones&apos;"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Aquí no está disponible la voz"/>
- <button label="" label_selected="" name="buyland" tool_tip="Comprar esta parcela"/>
- <line_editor label="Buscar" name="search_editor" tool_tip="Buscar en [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Buscar en [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Pérdida de paquetes
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Ancho de banda
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Mi saldo: pulsa para comprar más L$"/>
+ <text name="TimeText" tool_tip="Hora actual (Pacífico)">
+ 12:00 AM
+ </text>
+ <button name="volume_btn" tool_tip="Control general del volumen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history.xml b/indra/newview/skins/default/xui/es/panel_teleport_history.xml
new file mode 100644
index 0000000000..ff7cd5e723
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_teleport_history.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Hoy"/>
+ <accordion_tab name="yesterday" title="Ayer"/>
+ <accordion_tab name="2_days_ago" title="Hace 2 días"/>
+ <accordion_tab name="3_days_ago" title="Hace 3 días"/>
+ <accordion_tab name="4_days_ago" title="Hace 4 días"/>
+ <accordion_tab name="5_days_ago" title="Hace 5 días"/>
+ <accordion_tab name="6_days_and_older" title="6 y más días"/>
+ <accordion_tab name="1_month_and_older" title="1 mes y más"/>
+ <accordion_tab name="6_months_and_older" title="6 y más meses"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_world_map.xml b/indra/newview/skins/default/xui/es/panel_world_map.xml
index 7cb4009422..77cec6b60b 100644
--- a/indra/newview/skins/default/xui/es/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/es/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Cargando...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Localización inválida
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml
index da9a820eb8..14df3d67ca 100644
--- a/indra/newview/skins/default/xui/es/role_actions.xml
+++ b/indra/newview/skins/default/xui/es/role_actions.xml
@@ -1,199 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación."
- name="Membership">
- <action description="Invitar personas al grupo"
- longdescription="Invitar a personas al grupo usando el botón &apos;Invitar a un nuevo miembro&apos; en Miembros y Roles &gt; subpestaña Miembros."
- name="member invite" value="1" />
- <action description="Expulsar a miembros del grupo"
- longdescription="Expulsar a miembros del grupo usando el botón &apos;Expulsar del grupo&apos; en Miembros y Roles &gt; subpestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si usted no es un propietario, un miembro del grupo puede expulsarle sólo si tiene concedida tal capacidad específica. Para quitar capacidades a los miembros, usted debe tener la de &apos;Quitar capacidades a miembros&apos;."
- name="member eject" value="2" />
- <action
- description="Activar/desactivar &apos;Inscripción libre&apos; y cambiar &apos;Cuota de inscripción&apos;"
- longdescription="Activar/desactivar &apos;Inscripción libre&apos; para permitir o no que se unan sin invitación nuevos miembros, y cambiar la &apos;Cuota de inscripción&apos; en la sección Preferencias del grupo de la pestaña General."
- name="member options" value="3" />
+ <action_set description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." name="Membership">
+ <action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón &apos;Invitar&apos; en la sección Roles &gt; pestaña Miembros." name="member invite" value="1"/>
+ <action description="Expulsar a miembros del grupo" longdescription="Expulsar a miembros de este grupo usando el botón &apos;Expulsar&apos; en la sección Roles &gt; pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Cualquiera y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de &apos;Quitar roles a los miembros&apos;." name="member eject" value="2"/>
+ <action description="Cambiar &apos;Inscripción abierta&apos; y &apos;Cuota de inscripción&apos;" longdescription="En la sección General, cambiar la &apos;Inscripción abierta&apos; -que permite entrar al grupo sin invitación- y la &apos;Cuota de inscripción&apos;." name="member options" value="3"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades."
- name="Roles">
- <action description="Crear nuevos roles"
- longdescription="Crear nuevos roles en Miembros y Roles &gt; pestaña Roles &gt; botón Crear un rol nuevo."
- name="role create" value="4" />
- <action description="Borrar roles"
- longdescription="Borrar roles en Miembros y Roles &gt; pestaña Roles &gt; botón Eliminar el rol."
- name="role delete" value="5" />
- <action description="Cambiar nombres de roles, títulos y descripciones"
- longdescription="Cambiar el nombre del rol que elija, su etiqueta y descripción en la parte media de la pestaña Miembros y Roles."
- name="role properties" value="6" />
- <action description="Designar miembros para el rol del asignador"
- longdescription="Designar miembros para un rol en la sección Roles asignados de la pestaña Miembros y Roles &gt; subpestaña Miembros. Un miembro con este poder sólo puede asignar a otros el rol que él posee."
- name="role assign member limited" value="7" />
- <action description="Designar miembros para cualquier rol"
- longdescription="Designar miembros para cualquier rol en la sección Roles asignados de la pestaña Miembros y Roles &gt; subpestaña Miembros. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="role assign member" value="8" />
- <action description="Quitar capacidades a los miembros"
- longdescription="Quitar capacidades a los miembros en la sección Capacidades asignadas de Miembros y Roles &gt; subpestaña Roles. No se pueden quitar a los Propietarios."
- name="role remove member" value="9" />
- <action description="Añadir o quitar capacidades a los roles"
- longdescription="Añadir o quitar capacidades a los roles en la sección Capacidades asignadas de Miembros y Roles &gt; subpestaña Roles. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="role change actions" value="10" />
+ <action_set description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." name="Roles">
+ <action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles &gt; pestaña Roles." name="role create" value="4"/>
+ <action description="Borrar roles" longdescription="Borrar roles en la sección Roles &gt; pestaña Roles." name="role delete" value="5"/>
+ <action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol. Se hace seleccionando el rol, dentro de la sección Roles &gt; pestaña Roles." name="role properties" value="6"/>
+ <action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
+ <action description="Designar miembros para cualquier rol" longdescription="Designar miembros para cualquier rol en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
+ <action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles &gt; pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
+ <action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar capacidades a cada rol en la lista de capacidades permitidas (sección Roles &gt; pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema."
- name="Group Identity">
- <action
- description="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo"
- longdescription="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo de la pestaña General."
- name="group change identity" value="11" />
+ <action_set description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." name="Group Identity">
+ <action description="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo" longdescription="Cambia la carta, emblema y &apos;Mostrar en la búsqueda&apos;. Se hace en la sección General." name="group change identity" value="11"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para transferir, modificar y vender terrenos del grupo. Vea el menú Mundo &gt; Acerca del terreno, o pulse con el botón derecho en el terreno y seleccione &apos;Acerca del terreno...&apos;, o pulse en la información de la parcela en la barra superior del menú."
- name="Parcel Management">
- <action description="Transferir y comprar terreno para el grupo"
- longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno &gt; pestaña General."
- name="land deed" value="12" />
- <action description="Abandonar al terreno a favor de Governor Linden"
- longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno &gt; pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="land release" value="13" />
- <action description="Vender terreno"
- longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno &gt; pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="land set sale info" value="14" />
- <action description="Dividir y unir parcelas"
- longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, &apos;Modificar el terreno&apos;, y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elija la parte que quiere separar y pulse &apos;Subdividir...&apos;. Para unir, seleccione dos o más parcelas contiguas y pulse &apos;Unir...&apos;. "
- name="land divide join" value="15" />
+ <action_set description="Estas capacidades incluyen poder para transferir, modificar y vender terrenos del grupo. Para ver la ventana Acerca del terreno, pulsa con el botón derecho en el terreno y selecciona &apos;Acerca del terreno&apos;, o pulsa en el signo &apos;i&apos; de la barra de navegación." name="Parcel Management">
+ <action description="Transferir y comprar terreno para el grupo" longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno &gt; pestaña General." name="land deed" value="12"/>
+ <action description="Abandonar al terreno a favor de Governor Linden" longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno &gt; pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land release" value="13"/>
+ <action description="Vender terreno" longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno &gt; pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land set sale info" value="14"/>
+ <action description="Dividir y unir parcelas" longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, &apos;Modificar el terreno&apos;, y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elige la parte que quieres separar y pulsa &apos;Dividir&apos;. Para unir, selecciona dos o más parcelas contiguas y pulsa &apos;Unir&apos;." name="land divide join" value="15"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, así como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte."
- name="Parcel Identity">
- <action
- description="Activar/desactivar &apos;Mostrar en Buscar&apos; y el definir la categoría"
- longdescription="Activar/desactivar el &apos;Mostrar en Buscar&apos; y en que categoría se mostrará en Acerca del terreno &gt; pestaña Opciones."
- name="land find places" value="17" />
- <action
- description="Cambiar el nombre de la parcela, la descripción, y la configuración de &apos;Mostrar en Buscar&apos;"
- longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de &apos;Mostrar en Buscar&apos;. Se hace en Acerca del terreno &gt; pestaña Opciones."
- name="land change identity" value="18" />
- <action description="Definir los puntos de llegada y teleporte"
- longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno &gt; pestaña Opciones."
- name="land set landing point" value="19" />
+ <action_set description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, así como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte." name="Parcel Identity">
+ <action description="Cambiar &apos;Mostrar el sitio en Buscar&apos; y configurar la categoría" longdescription="Cambia &apos;Mostrar el sitio en Buscar&apos; y el configurar la categoría de una parcela en Acerca del terreno &gt; pestaña Opciones." name="land find places" value="17"/>
+ <action description="Cambiar el nombre de la parcela, su descripción, y la configuración de &apos;Mostrar el sitio en Buscar&apos;" longdescription="Cambia el nombre de la parcela, su descripción, y la configuración de &apos;Mostrar el sitio en Buscar&apos;. Se hace en Acerca del terreno &gt; pestaña Opciones." name="land change identity" value="18"/>
+ <action description="Definir los puntos de llegada y teleporte" longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno &gt; pestaña Opciones." name="land set landing point" value="19"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como &apos;Crear objetos&apos;, &apos;Editar el terreno&apos; y las configuraciones de la música y los media."
- name="Parcel Settings">
- <action description="Cambiar música y configuraciones de los media"
- longdescription="Cambiar la música en streaming y las configuraciones de vídeo en Acerca del terreno &gt; pestaña Media."
- name="land change media" value="20" />
- <action description="Activar/desactivar &apos;Editar el terreno&apos;"
- longdescription="Activar/desactivar &apos;Editar el terreno&apos;. *AVISO* Acerca del terreno &gt; pestaña Opciones &gt; Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno &gt; pestaña Opciones."
- name="land edit" value="21" />
- <action
- description="Activar/desactivar varios ítems de Acerca del terreno &gt; Opciones"
- longdescription="Activar/desactivar en un terreno del grupo los ítems de Acerca del terreno &gt; pestaña Opciones: &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y permitir a otros residentes: &apos;Crear objetos&apos;, &apos;Editar el terreno&apos;, &apos;Crear hitos&apos;, y &apos;Ejecutar scripts&apos;."
- name="land options" value="22" />
+ <action_set description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como &apos;Crear objetos&apos;, &apos;Editar el terreno&apos; y las configuraciones de la música y los media." name="Parcel Settings">
+ <action description="Cambiar música y configuraciones de los media" longdescription="Cambiar la música en streaming y las configuraciones de vídeo en Acerca del terreno &gt; pestaña Media." name="land change media" value="20"/>
+ <action description="Activar/desactivar &apos;Editar el terreno&apos;" longdescription="Activar/desactivar &apos;Editar el terreno&apos;. *AVISO* Acerca del terreno &gt; pestaña Opciones &gt; Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno &gt; pestaña Opciones." name="land edit" value="21"/>
+ <action description="Activar/desactivar varios ítems de Acerca del terreno &gt; Opciones" longdescription="Cambia &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y el permitir a otros residentes en terrenos propiedad del grupo &apos;Modificar el terreno&apos;, &apos;Construir&apos;, &apos;Crear hitos&apos; y &apos;Ejecutat scripts&apos;, como aparece en Acerca del terreno &gt; pestaña Opciones." name="land options" value="22"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo."
- name="Parcel Powers">
- <action description="Permitir siempre &apos;Editar el terreno&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow edit land" value="23" />
- <action description="Permitir siempre &apos;Volar&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow fly" value="24" />
- <action description="Permitir siempre &apos;Crear objetos&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow create" value="25" />
- <action description="Permitir siempre &apos;Crear hitos&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow landmark" value="26" />
- <action description="Permitir &apos;Fijar mi Base aquí&apos; en el terreno del grupo"
- longdescription="Quien tenga un rol con esta capacidad puede usar el menú Mundo &gt; Fijar mi Base aquí en una parcela transferida al grupo."
- name="land allow set home" value="28" />
+ <action_set description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo." name="Parcel Powers">
+ <action description="Permitir siempre &apos;Editar el terreno&apos;" longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow edit land" value="23"/>
+ <action description="Permitir siempre &apos;Volar&apos;" longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow fly" value="24"/>
+ <action description="Permitir siempre &apos;Crear objetos&apos;" longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow create" value="25"/>
+ <action description="Permitir siempre &apos;Crear hitos&apos;" longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow landmark" value="26"/>
+ <action description="Permitir &apos;Fijar mi Base aquí&apos; en el terreno del grupo" longdescription="Los miembros que tengan un rol con esta capacidad pueden usar el menú Mundo &gt; Hitos &gt; Fijar aquí mi Base en una parcela transferida al grupo." name="land allow set home" value="28"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes."
- name="Parcel Access">
- <action description="Administrar las listas de acceso a la parcela"
- longdescription="Administre las listas de acceso a la parcela en Acerca del terreno &gt; pestaña Acceso."
- name="land manage allowed" value="29" />
- <action description="Administrar la lista de residentes con el acceso prohibido"
- longdescription="Administrar la lista de residentes con el acceso prohibido a la parcela en Acerca del terreno &gt; pestaña Acceso."
- name="land manage banned" value="30" />
- <action description="Cambiar en las configuraciones de parcela el &apos;Vender pases a...&apos;"
- longdescription="Cambiar la configuración de &apos;Vender pases a...&apos; en Acerca del terreno &gt; pestaña Acceso."
- name="land manage passes" value="31" />
- <action description="Expulsar y congelar residentes en las parcelas"
- longdescription="Quien tenga un rol con esta capacidad puede actuar frente a un residente indeseado en una parcela del grupo pulsando con el botón derecho sobre él, Más &gt; y seleccionando &apos;Expulsar...&apos; o &apos;Congelar...&apos;."
- name="land admin" value="32" />
+ <action_set description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes." name="Parcel Access">
+ <action description="Administrar las listas de acceso a la parcela" longdescription="Administre las listas de acceso a la parcela en Acerca del terreno &gt; pestaña Acceso." name="land manage allowed" value="29"/>
+ <action description="Administrar la lista de residentes con el acceso prohibido" longdescription="Manejar la lista de expulsados en Acerca del terreno &gt; pestaña Acceso." name="land manage banned" value="30"/>
+ <action description="Cambiar en la parcela la configuración de &apos;Vender pases a&apos;" longdescription="Cambia en la parcela la configuración de &apos;Vender pases a&apos; (Acerca del terreno &gt; pestaña Acceso)." name="land manage passes" value="31"/>
+ <action description="Expulsar y congelar residentes en las parcelas" longdescription="En una parcela propiedad del grupo, los miembros cuyo rol tengan esta capacidad pueden manejar a residentes no deseados pulsándoles con el botón derecho del ratón para &apos;Expulsar&apos; o &apos;Congelar&apos;." name="land admin" value="32"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos."
- name="Parcel Content">
- <action description="Devolver objetos que pertenecen al grupo"
- longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno &gt; pestaña Objetos."
- name="land return group owned" value="48" />
- <action description="Devolver objetos definidos para el grupo"
- longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno &gt; pestaña Objetos."
- name="land return group set" value="33" />
- <action description="Devolver objetos que no pertenecen al grupo"
- longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno &gt; pestaña Objetos."
- name="land return non group" value="34" />
- <action description="Modificar el paisaje usando plantas Linden"
- longdescription="La capacidad de modificar el paisaje permite poner y mover árboles Linden, plantas y arbustos. Estos ítems están en la &apos;s Biblioteca de su Inventario &gt; carpeta Objetos, o pueden crearse con el botón Construir."
- name="land gardening" value="35" />
+ <action_set description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos." name="Parcel Content">
+ <action description="Devolver objetos que pertenecen al grupo" longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno &gt; pestaña Objetos." name="land return group owned" value="48"/>
+ <action description="Devolver objetos definidos para el grupo" longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno &gt; pestaña Objetos." name="land return group set" value="33"/>
+ <action description="Devolver objetos que no pertenecen al grupo" longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno &gt; pestaña Objetos." name="land return non group" value="34"/>
+ <action description="Modificar el paisaje usando plantas Linden" longdescription="Capacidad de poner y mover árboles, plantas y arbustos Linden. Estos ítems están en la Biblioteca de tu inventario &gt; carpeta Objetos, o pueden construirse con el menú Construir." name="land gardening" value="35"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para tranferir, modificar y vender objetos pertenecientes al grupo. Estos cambios se hacen en la pestaña General de la herramienta de edición. Para verlo, pulse en un objeto con el botón derecho y elija Editar. "
- name="Object Management">
- <action description="Transferir objetos al grupo"
- longdescription="Transferir objetos al grupo en Editar &gt; pestaña General."
- name="object deed" value="36" />
- <action description="Manipular (mover, copiar, y modificar) objetos del grupo"
- longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Editar &gt; pestaña General."
- name="object manipulate" value="38" />
- <action description="Vender objetos pertenecientes al grupo"
- longdescription="Poner a la venta objetos pertenecientes al grupo para venta en Editar &gt; pestaña General."
- name="object set sale" value="39" />
+ <action_set description="Estas capacidades incluyen poder transferir, modificar y vender objetos propiedad del grupo. Estos cambios se hacen en las Herramientas de construcción &gt; pestaña General. Pulsa un objeto con el botón derecho del ratón y edítalo para ver sus configuraciones." name="Object Management">
+ <action description="Transferir objetos al grupo" longdescription="Transferir objetos al grupo en las Herramientas de construcción &gt; pestaña General." name="object deed" value="36"/>
+ <action description="Manipular (mover, copiar, y modificar) objetos del grupo" longdescription="Mover, copiar y modificar objetos pertenecientes al grupo en las Herramientas de construcción &gt; pestaña General." name="object manipulate" value="38"/>
+ <action description="Vender objetos pertenecientes al grupo" longdescription="Poner a la venta objetos pertenecientes al grupo en las Herramientas de construcción &gt; pestaña General." name="object set sale" value="39"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo."
- name="Accounting">
- <action description="Pagar deudas y recibir dividendos del grupo"
- longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. "
- name="accounting accountable" value="40" />
+ <action_set description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo." name="Accounting">
+ <action description="Pagar deudas y recibir dividendos del grupo" longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. " name="accounting accountable" value="40"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo."
- name="Notices">
- <action description="Enviar aviso"
- longdescription="Quien tenga un rol con esta capacidad puede enviar avisos en Información del grupo &gt; pestaña Avisos."
- name="notices send" value="42" />
- <action description="Recibir avisos nuevos y ver los anteriores"
- longdescription="Quien tenga un rol con esta capacidad puede recibir los avisos nuevos, y ver los anteriores en Información del grupo &gt; pestaña Avisos."
- name="notices receive" value="43" />
+ <action_set description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo." name="Notices">
+ <action description="Enviar aviso" longdescription="Los miembros con un rol que tenga esta capacidad pueden enviar avisos a través de la sección Grupo &gt; Avisos." name="notices send" value="42"/>
+ <action description="Recibir avisos nuevos y ver los anteriores" longdescription="Los miembros con un rol que tenga esta capacidad pueden recibir Avisos y ver los ya enviados en la sección Grupo &gt; Avisos." name="notices receive" value="43"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones."
- name="Proposals">
- <action description="Hacer una propuesta"
- longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo &gt; pestaña Propuestas."
- name="proposal start" value="44" />
- <action description="Votar en propuestas"
- longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo &gt; pestaña Propuestas."
- name="proposal vote" value="45" />
+ <action_set description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones." name="Proposals">
+ <action description="Hacer una propuesta" longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo &gt; pestaña Propuestas." name="proposal start" value="44"/>
+ <action description="Votar en propuestas" longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo &gt; pestaña Propuestas." name="proposal vote" value="45"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo."
- name="Chat">
- <action description="Abrir chat de grupo"
- longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz."
- name="join group chat" value="16" />
- <action description="Abrir chat de voz del grupo"
- longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad &apos;Abrir chat de grupo&apos;."
- name="join voice chat" value="27" />
- <action description="Moderar el chat de grupo"
- longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo."
- name="moderate group chat" value="37" />
+ <action_set description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo." name="Chat">
+ <action description="Abrir chat de grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz." name="join group chat" value="16"/>
+ <action description="Abrir chat de voz del grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad &apos;Abrir chat de grupo&apos;." name="join voice chat" value="27"/>
+ <action description="Moderar el chat de grupo" longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo." name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_appearance.xml b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
new file mode 100644
index 0000000000..da9f6bbcf1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Vestuarios" name="appearance panel">
+ <string name="No Outfit" value="No hay vestuario"/>
+ <filter_editor label="Filtrar los vestuarios" name="Filter"/>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <button name="newlook_btn" tool_tip="Añadir un vestuario nuevo"/>
+ <dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
+ <button label="Ponerme" name="wear_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
new file mode 100644
index 0000000000..776b253adc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cosas" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Perfil" name="info_btn"/>
+ <button label="Ponerme" name="wear_btn"/>
+ <button label="Play" name="play_btn"/>
+ <button label="Teleporte" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
new file mode 100644
index 0000000000..e5a132ce1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Propiedades del ítem del inventario">
+ <panel.string name="unknown">
+ (desconocidas)
+ </panel.string>
+ <panel.string name="public">
+ (público)
+ </panel.string>
+ <panel.string name="you_can">
+ Puedes:
+ </panel.string>
+ <panel.string name="owner_can">
+ El propietario puede:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <text name="title" value="Propiedades del ítem"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nombre:
+ </text>
+ <text name="LabelItemDescTitle">
+ Descripción:
+ </text>
+ <text name="LabelCreatorTitle">
+ Creador:
+ </text>
+ <button label="Perfil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Propietario:
+ </text>
+ <button label="Perfil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Obtenido:
+ </text>
+ <text name="LabelAcquiredDate">
+ Miér., 24 Mayo 2006 12:50:46
+ </text>
+ <text name="OwnerLabel">
+ Tú:
+ </text>
+ <check_box label="Editar" name="CheckOwnerModify"/>
+ <check_box label="Copiar" name="CheckOwnerCopy"/>
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
+ </text>
+ <check_box label="Copiar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartir" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ El próximo propietario:
+ </text>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
+ <check_box label="Copiar" name="CheckNextOwnerCopy"/>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
+ <check_box label="En venta" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
new file mode 100644
index 0000000000..a65a0d5e45
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Propiedades del objeto">
+ <panel.string name="text deed continued">
+ Transfeir
+ </panel.string>
+ <panel.string name="text deed">
+ Transfeir
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ No puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ No puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Este objeto tiene partes enlazadas
+ </panel.string>
+ <panel.string name="Cost Default">
+ Precio: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Precio total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <panel label="">
+ <text name="Name:">
+ Nombre:
+ </text>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <text name="Creator:">
+ Creador:
+ </text>
+ <text name="Owner:">
+ Propietario:
+ </text>
+ <text name="Group:">
+ Grupo:
+ </text>
+ <button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
+ <name_box initial_value="Cargando..." name="Group Name Proxy"/>
+ <button label="Transfeir" label_selected="Transfeir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
+ <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <text name="label click action">
+ Al tocarlo:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentarme en el objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar el objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar al objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ </combo_box>
+ <check_box label="En venta:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copiarlo" name="Copy"/>
+ <combo_box.item label="Contenidos" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio: L$" name="Edit Cost"/>
+ <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objetos en los resultados de la búsqueda"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Puedes modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Cualquiera:
+ </text>
+ <check_box label="Moverse" name="checkbox allow everyone move"/>
+ <check_box label="Copiarlo" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo propietario:
+ </text>
+ <check_box label="Modificarlo" name="checkbox next owner can modify"/>
+ <check_box label="Copiarlo" name="checkbox next owner can copy"/>
+ <check_box label="Transferirlo" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel name="button_panel">
+ <button label="Abrir" name="open_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Guardar" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 294e407278..4b96b7f31f 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -4,9 +4,21 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Cargando
+ </string>
<string name="LoginInProgress">
Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
<string name="LoginAuthenticating">
Autenticando
</string>
@@ -25,6 +37,9 @@
<string name="LoginInitializingMultimedia">
Iniciando multimedia...
</string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
<string name="LoginVerifyingCache">
Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
</string>
@@ -55,9 +70,15 @@
<string name="LoginDownloadingClothing">
Descargando la ropa...
</string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
+ </string>
<string name="Quit">
Salir
</string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </string>
<string name="AgentLostConnection">
Esta región puede estar teniendo problemas. Por favor, compruebe su conexión a internet.
</string>
@@ -76,39 +97,9 @@
<string name="TooltipIsGroup">
(Grupo)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Propiedades físicas
- </string>
- <string name="TooltipFlagTouch">
- Tocar
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Desplegar el inventario
- </string>
- <string name="TooltipFlagPhantom">
- Inmaterial
- </string>
- <string name="TooltipFlagTemporary">
- Temporal
- </string>
- <string name="TooltipFlagRightClickMenu">
- (pulse el botón derecho del ratón para ver el menú)
- </string>
- <string name="TooltipFreeToCopy">
- Copia gratis
- </string>
<string name="TooltipForSaleL$">
En venta: [AMOUNT] L$
</string>
- <string name="TooltipForSaleMsg">
- En venta: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Construir el grupo
</string>
@@ -136,6 +127,76 @@
<string name="TooltipMustSingleDrop">
Aquí se puede arrastrar sólo un ítem
</string>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil de este residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Soltar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
<string name="RetrievingData">
Reintentando...
</string>
@@ -190,8 +251,77 @@
<string name="AssetErrorUnknownStatus">
Estado desconocido
</string>
- <string name="AvatarEditingApparance">
- (Modificando la apariencia)
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
</string>
<string name="AvatarAway">
Ausente
@@ -413,7 +543,19 @@
Cargando...
</string>
<string name="worldmap_offline">
- Desconectado/a
+ Sin conexión
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
</string>
<string name="whisper">
susurra:
@@ -421,6 +563,57 @@
<string name="shout">
grita:
</string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
<string name="SIM_ACCESS_PG">
&apos;PG&apos;
</string>
@@ -439,8 +632,6 @@
<string name="land_type_unknown">
(desconocido)
</string>
- <string name="covenant_never_modified">Última modificación: (nunca)</string>
- <string name="covenant_modified">Última modificación: </string>
<string name="all_files">
Todos los archivos
</string>
@@ -486,28 +677,740 @@
<string name="choose_the_directory">
Elegir directorio
</string>
- <!-- OSMessageBox messages -->
- <string name="MBAlreadyRunning">
- [APP_NAME] ya se está ejecutando.
-Busque en la barra de su escritorio una copia minimizada del programa.
-Si aun así persiste este mensaje, reinicie su ordenador.
+ <string name="AvatarSetNotAway">
+ Salir del estado ausente
</string>
- <string name="MBVideoDrvErr">
- No se puede ejecutar [APP_NAME] porque los drivers de su tarjeta de vídeo no están instalados correctamente, o no están actualizados, o son de un hardware no admitido. Por favor, asegúrese de que tiene los últimos drivers para su tarjeta de vídeo, e incluso en ese caso intente reinstalarlos.
-
-Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
+ <string name="AvatarSetAway">
+ Pasar al estado ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Salir del estado ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Pasar al estado ocupado
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotification">
+ Llegó [%d] aviso nuevo mientras estabas ausente...
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron [%d] avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ No se han encontrado tales ítems en el inventario.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes una copia de esta
+textura en tu inventario
+ </string>
+ <string name="no_transfer" value="(no transferible)"/>
+ <string name="no_modify" value="(no modificable)"/>
+ <string name="no_copy" value="(no copiable)"/>
+ <string name="worn" value="(puesto)"/>
+ <string name="link" value="(enlace)"/>
+ <string name="broken_link" value="(enlace roto)&quot;"/>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
+ <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="Chat" value="Chat :"/>
+ <string name="Sound" value="Sonido :"/>
+ <string name="Wait" value="--- Espera :"/>
+ <string name="AnimFlagStop" value="Parar la animación:"/>
+ <string name="AnimFlagStart" value="Empezar la animación:"/>
+ <string name="Wave" value="Onda"/>
+ <string name="HelloAvatar" value="¡Hola, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
+ <string name="Animations" value="Animaciones,"/>
+ <string name="Calling Cards" value="Tarjetas de visita,"/>
+ <string name="Clothing" value="Ropa,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Hitos,"/>
+ <string name="Notecards" value="Notas,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sonidos,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotos,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Desde la desconexión"/>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder My Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ la Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] día
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] días
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] días
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconocido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
+ <string name="NextStipendDay" value="El próximo día de pago es el"/>
+ <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residentes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Línea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="MuteByName">
+ (por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (objeto)
+ </string>
+ <string name="MuteGroup">
+ (grupo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
+ <string name="covenant_last_modified">
+ Última modificación:
+ </string>
+ <string name="none_text" value="(no hay)"/>
+ <string name="never_text" value="(nunca)"/>
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferYouDecline">
+ Has rehusado
+ </string>
+ <string name="InvOfferFrom">
+ de
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Contenidos
+ </string>
+ <string name="AcquiredItems">
+ Artículos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir este/a [%s] cuesta
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
</string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -518,82 +1421,1790 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
<string name="accel-win-shift">
Mayús+
</string>
- <string name="GraphicsQualityLow">
- Bajo
+ <string name="FileSaved">
+ Archivo guardado
</string>
- <string name="GraphicsQualityMid">
- Medio
+ <string name="Receiving">
+ Recibiendo
</string>
- <string name="GraphicsQualityHigh">
- Alto
+ <string name="AM">
+ AM
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Localización Linden</string>
- <string name="Adult">&apos;Adult&apos;</string>
- <string name="Arts&amp;Culture">Arte y Cultura</string>
- <string name="Business">Negocios</string>
- <string name="Educational">Educativo</string>
- <string name="Gaming">Juegos de azar</string>
- <string name="Hangout">Entretenimiento</string>
- <string name="Newcomer Friendly">Para recién llegados</string>
- <string name="Parks&amp;Nature">Parques y Naturaleza</string>
- <string name="Residential">Residencial</string>
- <string name="Shopping">Compras</string>
- <string name="Other">Otra</string>
-
- <string name="ringing">
- Conectando al chat de voz...
+ <string name="PM">
+ PM
</string>
- <string name="connected">
- Conectado
+ <string name="PST">
+ PST
</string>
- <string name="unavailable">
- La voz no está disponible en su localización actual
+ <string name="PDT">
+ PDT
</string>
- <string name="hang_up">
- Desconectado del chat de voz
+ <string name="Forward">
+ Adelante
+ </string>
+ <string name="Left">
+ Izquierda
+ </string>
+ <string name="Right">
+ Derecha
+ </string>
+ <string name="Back">
+ Atrás
+ </string>
+ <string name="North">
+ Norte
+ </string>
+ <string name="South">
+ Sur
+ </string>
+ <string name="West">
+ Oeste
+ </string>
+ <string name="East">
+ Este
+ </string>
+ <string name="Up">
+ Arriba
+ </string>
+ <string name="Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categoría
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ &apos;Adult&apos;
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la línea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de línea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el &apos;GL device context&apos;
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de píxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de píxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de píxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba del día
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos cortos
+ </string>
+ <string name="Back Bangs">
+ Back Bangs
+ </string>
+ <string name="Back Bangs Down">
+ Back Bangs Down
+ </string>
+ <string name="Back Bangs Up">
+ Back Bangs Up
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Back Hair">
+ Back Hair
+ </string>
+ <string name="Back Hair Down">
+ Back Hair Down
+ </string>
+ <string name="Back Hair Up">
+ Back Hair Up
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Bangs Down">
+ Bangs Down
+ </string>
+ <string name="Bangs Up">
+ Bangs Up
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Eyeball">
+ Big Eyeball
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Ancho
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <string name="Bulbous Nose">
+ Nariz de porra
+ </string>
+ <string name="Bushy Eyebrows">
+ Cejijuntas
+ </string>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraída
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Normal">
+ Corner Normal
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ Caídos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cropped Hair">
+ Cropped Hair
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Default Toe">
+ Default Toe
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Dense hair">
+ Dense hair
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetría
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyeball Size">
+ Eyeball Size
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Back">
+ Eyes Back
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Eyes Forward">
+ Eyes Forward
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Ojos arriba - izq.
+ </string>
+ <string name="Eyes Shear Right Up">
+ Ojos arriba - der.
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Eyes Spread
+ </string>
+ <string name="Eyes Sunken">
+ Eyes Sunken
+ </string>
+ <string name="Eyes Together">
+ Eyes Together
+ </string>
+ <string name="Face Shear">
+ Cara: simetría
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat">
+ Fat
+ </string>
+ <string name="Fat Head">
+ Fat Head
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Fat Lower">
+ Fat Lower
+ </string>
+ <string name="Fat Lower Lip">
+ Fat Lower Lip
+ </string>
+ <string name="Fat Torso">
+ Fat Torso
+ </string>
+ <string name="Fat Upper">
+ Fat Upper
+ </string>
+ <string name="Fat Upper Lip">
+ Fat Upper Lip
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Bangs Down">
+ Front Bangs Down
+ </string>
+ <string name="Front Bangs Up">
+ Front Bangs Up
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Front Hair">
+ Front Hair
+ </string>
+ <string name="Front Hair Down">
+ Front Hair Down
+ </string>
+ <string name="Front Hair Up">
+ Front Hair Up
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ Mandíbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ Línea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ Línea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Línea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ Mandíbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ Mandíbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Longcuffs">
+ Longcuffs
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ Mandíbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Heels">
+ No Heels
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Old">
+ Old
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ Retraído
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Pointy Toe">
+ Pointy Toe
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Red Skin">
+ Red Skin
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Regular Muscles">
+ Regular Muscles
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Round Forehead">
+ Round Forehead
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Saddlebags">
+ Cartucheras
+ </string>
+ <string name="Scrawny">
+ Scrawny
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shading">
+ Shading
+ </string>
+ <string name="Shadow hair">
+ Shadow hair
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left">
+ Shear Left
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right">
+ Shear Right
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Bangs">
+ Side Bangs
+ </string>
+ <string name="Side Bangs Down">
+ Side Bangs Down
+ </string>
+ <string name="Side Bangs Up">
+ Side Bangs Up
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny">
+ Skinny
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Some">
+ Some
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Squash/Stretch Head">
+ Squash/Stretch Head
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Swept Back">
+ Swept Back
+ </string>
+ <string name="Swept Back Hair">
+ Swept Back Hair
+ </string>
+ <string name="Swept Forward">
+ Swept Forward
+ </string>
+ <string name="Swept Forward Hair">
+ Swept Forward Hair
+ </string>
+ <string name="Tall">
+ Alta
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thickness">
+ Thickness
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Tilt Left">
+ Tilt Left
+ </string>
+ <string name="Tilt Right">
+ Tilt Right
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Ancho
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquí para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Cogerle a usted dólares Linden (L$)
- </string>
- <string name="ActOnControlInputs">
- Actuar en sus controles de entrada
- </string>
- <string name="RemapControlInputs">
- Reconfigurar sus controles de entrada
- </string>
- <string name="AnimateYourAvatar">
- Ejecutar animaciones en su avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexarse a su avatar
- </string>
- <string name="ReleaseOwnership">
- Anular la propiedad y que pase a ser público
- </string>
- <string name="LinkAndDelink">
- Enlazar y desenlazar de otros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Añadir y quitar uniones con otros objetos
- </string>
- <string name="ChangePermissions">
- Cambiar sus permisos
- </string>
- <string name="TrackYourCamera">
- Seguir su cámara
- </string>
- <string name="ControlYourCamera">
- Controlar su cámara
- </string>
-
<string name="only_user_message">
Usted es el único usuario en esta sesión.
</string>
@@ -636,31 +3247,4 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
<string name="close_on_no_ability">
Usted ya no tendrá más la capacidad de estar en la sesión de chat.
</string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Prueba
- </string>
- <string name="AcctTypeCharterMember">
- Miembro fundador
- </string>
- <string name="AcctTypeEmployee">
- Empleado de Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Ha usado una forma de pago
- </string>
- <string name="PaymentInfoOnFile">
- Hay infor. de la forma de pago
- </string>
- <string name="NoPaymentInfoOnFile">
- Sin infor. de la forma de pago
- </string>
- <string name="AgeVerified">
- Edad verificada
- </string>
- <string name="NotAgeVerified">
- Edad no verificada
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index 6cf5437e3c..0a605277f2 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema.
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 7b918be075..21d0b6c10c 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,27 +1,68 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="A propos de [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes.
+<floater name="floater_about" title="À PROPOS DE [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Compilé avec [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU : [CPU]
+Mémoire : [MEMORY_MB] Mo
+Version OS : [OS_VERSION]
+Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR]
+Cartes graphiques : [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Version OpenGL : [OPENGL_VERSION]
+
+Version libcurl : [LIBCURL_VERSION]
+Version J2C Decoder : [J2C_VERSION]
+Version Audio Driver : [AUDIO_DRIVER_VERSION]
+Version Qt Webkit : [QT_WEBKIT_VERSION]
+Version Vivox : [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (aucun)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Infos" name="support_panel">
+ <button label="Copier dans le presse-papiers" name="copy_btn"/>
+ </panel>
+ <panel label="Remerciements" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes.
Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
- Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
+ </text_editor>
+ </panel>
+ <panel label="Licences" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
@@ -33,11 +74,9 @@
Tous droits réservés. Voir licenses.txt pour plus de détails.
- Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Votre position : [POSITION]
- </string>
+ Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1
+ Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index f2d2dbfa07..e7e2d8a0ee 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -1,7 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="À propos du terrain">
- <tab_container name="landtab">
- <panel label="Général" name="land_general_panel">
+<floater name="floaterland" title="À PROPOS DES TERRAINS">
+ <floater.string name="Minutes">
+ [MINUTES] minutes
+ </floater.string>
+ <floater.string name="Minute">
+ minute
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] secondes
+ </floater.string>
+ <floater.string name="Remaining">
+ restantes
+ </floater.string>
+ <tab_container name="landtab" tab_min_width="60">
+ <panel label="GÉNÉRAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Nouveaux utilisateurs uniquement
+ </panel.string>
+ <panel.string name="anyone">
+ Tout le monde
+ </panel.string>
+ <panel.string name="area_text">
+ Surface
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Code de l&apos;enchère : [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Pour modifier ce terrain, vous devez approuver votre achat.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (propriété du groupe)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil
+ </panel.string>
+ <panel.string name="info_text">
+ Infos
+ </panel.string>
+ <panel.string name="public_text">
+ (public)
+ </panel.string>
+ <panel.string name="none_text">
+ (aucun)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (vente en cours)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Aucune parcelle sélectionnée.
+ </panel.string>
<text name="Name:">
Nom :
</text>
@@ -20,7 +71,7 @@
Catégorie :
</text>
<text name="ContentRatingText">
- Adult
+ Adulte
</text>
<text name="Owner:">
Propriétaire :
@@ -28,14 +79,15 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="Profile..."/>
<text name="Group:">
Groupe :
</text>
- <text name="GroupText"/>
- <button label="Définir..." label_selected="Définir..." name="Set..."/>
- <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe."/>
- <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Choisir" label_selected="Définir..." name="Set..."/>
+ <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier du groupe peut céder ce terrain à ce groupe, afin qu&apos;il soit pris en charge par l&apos;allocation de terrains du groupe."/>
+ <button label="Céder" label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
<check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
<text name="For Sale:">
À vendre :
@@ -44,18 +96,18 @@
Pas à vendre
</text>
<text name="For Sale: Price L$[PRICE].">
- Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
+ Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²)
</text>
<text name="SalePending"/>
- <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/>
+ <button label="Vendre le terrain" label_selected="Vendre le terrain..." name="Sell Land..."/>
<text name="For sale to">
À vendre à : [BUYER]
</text>
<text name="Sell with landowners objects in parcel.">
- Objets inclus dans la vente.
+ Objets inclus dans la vente
</text>
<text name="Selling with no objects in parcel.">
- Objets non inclus dans la vente.
+ Objets non inclus dans la vente
</text>
<button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/>
<text name="Claimed:">
@@ -68,7 +120,7 @@
Superficie :
</text>
<text name="PriceText">
- 4048 m²
+ 4 048 m²
</text>
<text name="Traffic:">
Trafic :
@@ -76,60 +128,32 @@
<text name="DwellText">
0
</text>
- <button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/>
- <button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
- <button label="Acheter un pass..." label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
- <button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/>
- <button label="Redemander le terrain..." label_selected="Redemander le terrain…" name="Reclaim Land..."/>
- <button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
- <panel.string name="new users only">
- Nouveaux utilisateurs uniquement
- </panel.string>
- <panel.string name="anyone">
- Tout le monde
- </panel.string>
- <panel.string name="area_text">
- Surface
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Code de l&apos;enchère : [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Pour modifier ce terrain, vous devez approuver votre achat.
- </panel.string>
- <panel.string name="group_owned_text">
- (propriété du groupe)
- </panel.string>
- <panel.string name="profile_text">
- Profil...
- </panel.string>
- <panel.string name="info_text">
- Infos...
- </panel.string>
- <panel.string name="public_text">
- (public)
+ <button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <button label="Infos sur les scripts" name="Scripts..." width="110"/>
+ <button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
+ <button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
+ <button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
+ <button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
+ <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
+ </panel>
+ <panel label="RÈGLEMENT" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Le terrain acheté dans cette région peut être revendu.
</panel.string>
- <panel.string name="none_text">
- (aucun)
+ <panel.string name="can_not_resell">
+ Le terrain acheté dans cette région ne peut pas être revendu.
</panel.string>
- <panel.string name="sale_pending_text">
- (vente en cours)
+ <panel.string name="can_change">
+ Le terrain acheté dans cette région peut être fusionné
+ou divisé.
</panel.string>
- <panel.string name="no_selection_text">
- Aucune parcelle sélectionnée.
-Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails.
+ <panel.string name="can_not_change">
+ Le terrain acheté dans cette région ne peut pas être fusionné
+ou divisé.
</panel.string>
- </panel>
- <panel label="Règlement" name="land_covenant_panel">
<text name="estate_section_lbl">
Domaine :
</text>
- <text name="estate_name_lbl">
- Nom :
- </text>
<text name="estate_name_text">
continent
</text>
@@ -148,11 +172,8 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
<text name="region_section_lbl">
Région :
</text>
- <text name="region_name_lbl">
- Nom :
- </text>
<text name="region_name_text">
- leyla
+ EricaVille
</text>
<text name="region_landtype_lbl">
Type :
@@ -178,45 +199,31 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
<text name="changeable_clause">
Le terrain dans cette région ne peut être fusionné/divisé.
</text>
- <panel.string name="can_resell">
- Le terrain acheté dans cette région peut être revendu.
- </panel.string>
- <panel.string name="can_not_resell">
- Le terrain acheté dans cette région ne peut pas être revendu.
- </panel.string>
- <panel.string name="can_change">
- Le terrain acheté dans cette région peut être fusionné
-ou divisé.
+ </panel>
+ <panel label="OBJETS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] sur [MAX] ([AVAILABLE] disponibles)
</panel.string>
- <panel.string name="can_not_change">
- Le terrain acheté dans cette région ne peut pas être fusionné
-ou divisé.
+ <panel.string name="objects_deleted_text">
+ [COUNT] sur [MAX] ([DELETED] seront supprimés)
</panel.string>
- </panel>
- <panel label="Objets" name="land_objects_panel">
<text name="parcel_object_bonus">
Facteur Bonus Objets : [BONUS]
</text>
<text name="Simulator primitive usage:">
- Prims utilisées sur la parcelle :
+ Utilisation des prims :
</text>
<text left="214" name="objects_available" width="230">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
</text>
- <panel.string name="objects_available_text">
- [COUNT] sur [MAX] ([AVAILABLE] disponibles)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] sur [MAX] ([DELETED] seront supprimés)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
- Prims max. sur la parcelle :
+ Prims max. sur la parcelle :
</text>
<text left="214" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims sur la parcelle :
+ Prims sur la parcelle :
</text>
<text left="214" name="total_objects_text" width="48">
[COUNT]
@@ -228,7 +235,7 @@ ou divisé.
[COUNT]
</text>
<button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/>
- <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+ <button label="Retour" label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
<text left="14" name="Set to group:" width="180">
Données au groupe :
</text>
@@ -236,7 +243,7 @@ ou divisé.
[COUNT]
</text>
<button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/>
- <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+ <button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
<text left="14" name="Owned by others:" width="128">
Appartenant à d&apos;autres :
</text>
@@ -244,136 +251,118 @@ ou divisé.
[COUNT]
</text>
<button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/>
- <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
- <text left="14" name="Selected / sat upon:" width="193">
+ <button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+ <text left="14" name="Selected / sat upon:" width="220">
Sélectionnées/où quelqu&apos;un est assis :
</text>
- <text left="214" name="selected_objects_text" width="48">
+ <text left_delta="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
- Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) :
+ <text left="4" name="Autoreturn" width="440">
+ Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
</text>
<line_editor name="clean other time" right="-6" width="36"/>
<text name="Object Owners:">
Propriétaires :
</text>
- <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/>
- <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/>
+ <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List" tool_tip="Actualiser la liste des objets"/>
+ <button label="Renvoi des objets" label_selected="Renvoyer les objets..." name="Return objects..."/>
<name_list label="Plus récents" name="owner list">
- <column label="Type" name="type"/>
- <column name="online_status"/>
- <column label="Nom" name="name"/>
- <column label="Nombre" name="count"/>
- <column label="Plus récents" name="mostrecent"/>
+ <name_list.columns label="Type" name="type"/>
+ <name_list.columns name="online_status"/>
+ <name_list.columns label="Nom" name="name" width="100"/>
+ <name_list.columns label="Nombre" name="count" width="100"/>
+ <name_list.columns label="Plus récents" name="mostrecent" width="120"/>
</name_list>
</panel>
- <panel label="Options" name="land_options_panel">
+ <panel label="OPTIONS" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m².
+Seules les parcelles de grande taille peuvent apparaître dans la recherche.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Contenu Modéré
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Contenu Adult
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Les informations ou contenu de votre parcelle sont classés Modéré.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Les informations ou contenu de votre parcelle sont classés Adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (aucun)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Pas de bousculades
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Pas de bousculades (les règles de la région priment)
+ </panel.string>
<text name="allow_label">
- Autoriser les autres résidents à :
+ Autoriser les autres résidents à :
</text>
<check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
- <check_box label="Créer des repères" name="check landmark"/>
<check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
<text left="152" name="allow_label2">
- Créer des objets :
+ Construire :
</text>
- <check_box label="Tous les résidents" left="285" name="edit objects check"/>
+ <check_box label="Tous" left="285" name="edit objects check"/>
<check_box label="Groupe" left="395" name="edit group objects check"/>
- <text left="152" name="allow_label3" width="134">
+ <text left="152" name="allow_label3" width="150">
Laisser entrer des objets :
</text>
- <check_box label="Tous les résidents" left="285" name="all object entry check"/>
+ <check_box label="Tous" left="285" name="all object entry check"/>
<check_box label="Groupe" left="395" name="group object entry check"/>
<text left="152" name="allow_label4">
Exécuter des scripts :
</text>
- <check_box label="Tous les résidents" left="285" name="check other scripts"/>
+ <check_box label="Tous" left="285" name="check other scripts"/>
<check_box label="Groupe" left="395" name="check group scripts"/>
<text name="land_options_label">
Options du terrain :
</text>
<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
<check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
- <check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
- <panel.string name="search_enabled_tooltip">
- Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m².
-Seules les parcelles de grande taille peuvent apparaître dans la recherche.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle.
- </panel.string>
+ <check_box bottom="-160" label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
<combo_box bottom="-160" left="286" name="land category with adult" width="146">
- <combo_box.item name="item0" label="Toutes catégories"
- />
- <combo_box.item name="item1" label="Appartenant aux Lindens"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Art et Culture"
- />
- <combo_box.item name="item4" label="Affaires"
- />
- <combo_box.item name="item5" label="Éducation"
- />
- <combo_box.item name="item6" label="Jeux"
- />
- <combo_box.item name="item7" label="Favoris"
- />
- <combo_box.item name="item8" label="Accueil pour les nouveaux"
- />
- <combo_box.item name="item9" label="Parcs et Nature"
- />
- <combo_box.item name="item10" label="Résidentiel"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Autre"
- />
+ <combo_box.item label="Toutes catégories" name="item0"/>
+ <combo_box.item label="Appartenant aux Lindens" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Art et Culture" name="item3"/>
+ <combo_box.item label="Affaires" name="item4"/>
+ <combo_box.item label="Éducation" name="item5"/>
+ <combo_box.item label="Jeux" name="item6"/>
+ <combo_box.item label="Favoris" name="item7"/>
+ <combo_box.item label="Accueil pour les nouveaux" name="item8"/>
+ <combo_box.item label="Parcs et Nature" name="item9"/>
+ <combo_box.item label="Résidentiel" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Autre" name="item12"/>
</combo_box>
<combo_box bottom="-160" left="286" name="land category" width="146">
- <combo_box.item name="item0" label="Toutes catégories"
- />
- <combo_box.item name="item1" label="Appartenant aux Lindens"
- />
- <combo_box.item name="item3" label="Art et Culture"
- />
- <combo_box.item name="item4" label="Affaires"
- />
- <combo_box.item name="item5" label="Éducation"
- />
- <combo_box.item name="item6" label="Jeux"
- />
- <combo_box.item name="item7" label="Favoris"
- />
- <combo_box.item name="item8" label="Accueil pour les nouveaux"
- />
- <combo_box.item name="item9" label="Parcs et Nature"
- />
- <combo_box.item name="item10" label="Résidentiel"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Autre"
- />
+ <combo_box.item label="Toutes catégories" name="item0"/>
+ <combo_box.item label="Appartenant aux Lindens" name="item1"/>
+ <combo_box.item label="Art et Culture" name="item3"/>
+ <combo_box.item label="Affaires" name="item4"/>
+ <combo_box.item label="Éducation" name="item5"/>
+ <combo_box.item label="Jeux" name="item6"/>
+ <combo_box.item label="Favoris" name="item7"/>
+ <combo_box.item label="Accueil pour les nouveaux" name="item8"/>
+ <combo_box.item label="Parcs et Nature" name="item9"/>
+ <combo_box.item label="Résidentiel" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Autre" name="item12"/>
</combo_box>
- <button bottom="-160" label="?" label_selected="?" left="436" name="?"/>
- <check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Contenu Mature
- </panel.string>
- <panel.string name="mature_check_adult">
- Contenu Adult
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Les informations ou contenu de votre parcelle sont classés Mature.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Les informations ou contenu de votre parcelle sont classés Adult.
- </panel.string>
+ <check_box bottom="-180" label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
<text bottom="-200" name="Snapshot:">
Photo :
</text>
@@ -381,121 +370,116 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<text bottom="-323" name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
- <panel.string name="landing_point_none">
- (aucun)
- </panel.string>
<button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
- <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d&apos;arrivée."/>
+ <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d&apos;arrivée"/>
<text bottom="-343" name="Teleport Routing: ">
Règles de téléportation :
</text>
- <combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140">
- <combo_box.item name="Blocked" label="Bloqué"
- />
- <combo_box.item name="LandingPoint" label="Lieu d&apos;arrivée fixe"
- />
- <combo_box.item name="Anywhere" label="Lieu d&apos;arrivée libre"
- />
+ <combo_box bottom="-343" left="140" name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140">
+ <combo_box.item label="Bloqué" name="Blocked"/>
+ <combo_box.item label="Lieu d&apos;arrivée fixe" name="LandingPoint"/>
+ <combo_box.item label="Lieu d&apos;arrivée libre" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Pas de bousculades
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Pas de bousculades (les règles de la région priment)
- </panel.string>
</panel>
- <panel label="Médias" name="land_media_panel">
+ <panel label="MÉDIA" name="land_media_panel">
<text name="with media:" width="85">
- Type de média :
+ Type :
</text>
<combo_box left="97" name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
<text name="mime_type"/>
<text name="at URL:" width="85">
- URL du média :
+ Page d&apos;accueil :
</text>
<line_editor left="97" name="media_url"/>
- <button label="Définir..." label_selected="Définir..." name="set_media_url"/>
+ <button label="Choisir" label_selected="Définir..." name="set_media_url"/>
+ <text name="CurrentURL:">
+ Page actuelle :
+ </text>
+ <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url" tool_tip="Actualiser l&apos;URL"/>
+ <check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
<text name="Description:">
Description :
</text>
<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
<text name="Media texture:">
- Remplacer
-la texture :
+ Remplacer la
+texture :
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
<text name="replace_texture_help">
- (Les objets avec cette texture affichent le film ou
-la page web quand vous cliquez sur la flèche Jouer.)
- </text>
- <text name="Options:">
- Options
-média :
+ Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. Sélectionnez l&apos;image miniature pour choisir une texture différente.
</text>
<check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
- <check_box label="Média en boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
- <check_box label="Masquer l&apos;URL du média" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
- <check_box label="Masquer l&apos;URL de la musique" name="hide_music_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL de la musique."/>
<text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
- Taille du média :
+ Taille :
</text>
<spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<text name="pixels">
pixels
</text>
+ <text name="Options:">
+ Options :
+ </text>
+ <check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
+ </panel>
+ <panel label="SON" name="land_audio_panel">
<text bottom_delta="-28" name="MusicURL:">
- URL de la
-musique :
+ URL de la
+musique :
</text>
- <line_editor bottom_delta="-12" left="97" name="music_url"/>
+ <check_box label="Masquer l&apos;URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l&apos;URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/>
<text name="Sound:">
- Son :
+ Son :
</text>
- <check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" left="97" name="check sound local"/>
- <button label="?" label_selected="?" left="378" name="?"/>
+ <check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
<text name="Voice settings:">
- Voix :
+ Voix :
</text>
- <check_box label="Activer le chat vocal" left="97" name="parcel_enable_voice_channel"/>
- <check_box label="Activer le chat vocal (contrôlé par le domaine)" left="97" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Limiter le chat vocal à cette parcelle" left="117" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/>
+ <check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_local"/>
</panel>
- <panel label="Accès" name="land_access_panel">
+ <panel label="ACCÈS" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (défini par le domaine
+ </panel.string>
+ <panel.string name="estate_override">
+ Au moins une de ces options est définie au niveau du domaine.
+ </panel.string>
<text name="Limit access to this parcel to:">
Accès à cette parcelle
</text>
- <check_box label="Autoriser l&apos;accès public" name="public_access"/>
+ <check_box label="Autoriser l&apos;accès public [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Bloquer l&apos;accès aux résidents :
+ Limiter l&apos;accès aux résidents vérifiés par :
</text>
- <check_box label="Qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/>
- <check_box label="Dont l&apos;âge n&apos;a pas été vérifié" name="limit_age_verified" tool_tip="Aux résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
- <panel.string name="estate_override">
- Au moins une de ces options est définie au niveau du domaine.
- </panel.string>
+ <check_box label="Informations de paiement enregistrées [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Bannir les résidents non identifiés."/>
+ <check_box label="Vérification de l&apos;âge [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
- <combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Tout le monde"
- />
- <combo_box.item name="Group" label="Groupe"
- />
+ <combo_box name="pass_combo" width="110">
+ <combo_box.item label="Tout le monde" name="Anyone"/>
+ <combo_box.item label="Groupe" name="Group"/>
</combo_box>
<spinner label="Prix en L$ :" name="PriceSpin"/>
<spinner label="Durée en heures :" name="HoursSpin"/>
- <text label="Toujours autoriser" name="AllowedText">
- Résidents autorisés
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/>
- <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/>
- <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
- <text label="Bannir" name="BanCheck">
- Résidents bannis
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/>
- <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/>
- <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Toujours autoriser" name="AllowedText">
+ Résidents autorisés
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] dans la liste, [MAX] max.)"/>
+ <button label="Ajouter" name="add_allowed"/>
+ <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Bannir" name="BanCheck">
+ Résidents bannis
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] dans la liste, [MAX] max.)"/>
+ <button label="Ajouter" name="add_banned"/>
+ <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_activeim.xml b/indra/newview/skins/default/xui/fr/floater_activeim.xml
new file mode 100644
index 0000000000..18e3d66bb7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="IM ACTIVE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index af6cb41ba8..e0cb0ef524 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -1,91 +1,189 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Echec de l&apos;initialisation du mouvement
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Le fichier d&apos;animation fait [LENGTH] secondes.
+
+La longueur maximale est de [MAX_LENGTH] secondes.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Impossible de lire le fichier d&apos;animation.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fichier incomplet.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossible de lire la définition des contraintes.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossible d&apos;ouvrir le fichier BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ En-tête HIERARCHY non valide.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Impossible de trouver ROOT ou JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossible de trouver le nom JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossible de trouver OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossible de trouver les CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossible d&apos;obtenir l&apos;ordre de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Impossible d&apos;obtenir l&apos;axe de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossible de trouver MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossible d&apos;obtenir le nombre de cadres.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossible d&apos;obtenir le temps du cadre.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossible de trouver les valeurs de la position.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossible de trouver les valeurs de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossible d&apos;ouvrir le fichier de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossible de lire l&apos;en-tête de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossible de lire la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossible de lire la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossible de lire la valeur de traduction relative.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Impossible de lire la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossible de lire la matrice de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossible de trouver le nom mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossible de trouver le nom mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossible de définir la valeur de la priorité.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossible de définir la valeur de la boucle
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossible de trouver les valeurs easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Impossible de trouver les valeurs easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossible d&apos;obtenir la valeur hand morph.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossible de lire le nom emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nom de racine incorrect.
+ </floater.string>
<text name="name_label">
Nom :
</text>
<text name="description_label">
Description :
</text>
- <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
- <text name="preview_label" width="110">
- Prévisualiser pendant
+ <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles autres animations peuvent être remplacées par cette animation"/>
+ <check_box label="Boucle" left="6" name="loop_check" tool_tip="Lit cette animation en boucle"/>
+ <spinner label="Début (%)" label_width="65" name="loop_in_point" tool_tip="Définit un point de l&apos;animation auquel retourne la boucle" width="105"/>
+ <spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit un point de l&apos;animation qui met fin à la boucle"/>
+ <text name="hand_label">
+ Mouvement de
+main
</text>
- <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." left_delta="116" width="124">
- <combo_box.item name="Standing" label="Debout" />
- <combo_box.item name="Walking" label="En train de marcher" />
- <combo_box.item name="Sitting" label="Assis" />
- <combo_box.item name="Flying" label="En train de voler" />
- </combo_box>
- <check_box left="6" label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle."/>
- <spinner left="76" label_width="55" width="105" label="Début (%)" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart."/>
- <spinner left="195" label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
- <text name="hand_label" width="110">
- Mouvement de main
- </text>
- <combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation" left_delta="116" width="124">
- <combo_box.item name="Spread" label="Doigts écartés" />
- <combo_box.item name="Relaxed" label="Détendues" />
- <combo_box.item name="PointBoth" label="Pointer (les deux)" />
- <combo_box.item name="Fist" label="Poing" />
- <combo_box.item name="RelaxedLeft" label="Détendue (gauche)" />
- <combo_box.item name="PointLeft" label="Pointer (gauche)" />
- <combo_box.item name="FistLeft" label="Poing (gauche)" />
- <combo_box.item name="RelaxedRight" label="Détendue (droite)" />
- <combo_box.item name="PointRight" label="Pointer (droite)" />
- <combo_box.item name="FistRight" label="Poing (droite)" />
- <combo_box.item name="SaluteRight" label="Saluer (droite)" />
- <combo_box.item name="Typing" label="Taper" />
- <combo_box.item name="PeaceRight" label="Paix (main droite)" />
+ <combo_box label="" name="hand_pose_combo" tool_tip="Contrôle ce que font les mains pendant l&apos;animation">
+ <combo_box.item label="Espacement" name="Spread"/>
+ <combo_box.item label="Détendues" name="Relaxed"/>
+ <combo_box.item label="Pointer (les deux)" name="PointBoth"/>
+ <combo_box.item label="Poing" name="Fist"/>
+ <combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/>
+ <combo_box.item label="Pointer (gauche)" name="PointLeft"/>
+ <combo_box.item label="Poing (gauche)" name="FistLeft"/>
+ <combo_box.item label="Détendue (droite)" name="RelaxedRight"/>
+ <combo_box.item label="Pointer (droite)" name="PointRight"/>
+ <combo_box.item label="Poing (droite)" name="FistRight"/>
+ <combo_box.item label="Saluer (droite)" name="SaluteRight"/>
+ <combo_box.item label="Taper" name="Typing"/>
+ <combo_box.item label="Paix (main droite)" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expression
</text>
- <combo_box label="" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation." left_delta="116" width="124">
- <combo_box.item name="[None]" label="None]" />
- <combo_box.item name="Aaaaah" label="Aaaaah" />
- <combo_box.item name="Afraid" label="Effrayé" />
- <combo_box.item name="Angry" label="En colère" />
- <combo_box.item name="BigSmile" label="Grand sourire" />
- <combo_box.item name="Bored" label="Ennui" />
- <combo_box.item name="Cry" label="Pleurer" />
- <combo_box.item name="Disdain" label="Mépris" />
- <combo_box.item name="Embarrassed" label="Gêne" />
- <combo_box.item name="Frown" label="Froncer les sourcils" />
- <combo_box.item name="Kiss" label="Embrasser" />
- <combo_box.item name="Laugh" label="Rire" />
- <combo_box.item name="Plllppt" label="Plllppt" />
- <combo_box.item name="Repulsed" label="Dégoût" />
- <combo_box.item name="Sad" label="Triste" />
- <combo_box.item name="Shrug" label="Hausser les épaules" />
- <combo_box.item name="Smile" label="Sourire" />
- <combo_box.item name="Surprise" label="Surprise" />
- <combo_box.item name="Wink" label="Clin d&apos;œil" />
- <combo_box.item name="Worry" label="Soucis" />
+ <combo_box label="" name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l&apos;animation">
+ <combo_box.item label="(aucun)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Effrayé" name="Afraid"/>
+ <combo_box.item label="En colère" name="Angry"/>
+ <combo_box.item label="Grand sourire" name="BigSmile"/>
+ <combo_box.item label="Ennui" name="Bored"/>
+ <combo_box.item label="Pleurer" name="Cry"/>
+ <combo_box.item label="Mépris" name="Disdain"/>
+ <combo_box.item label="Gêne" name="Embarrassed"/>
+ <combo_box.item label="Froncer les sourcils" name="Frown"/>
+ <combo_box.item label="Embrasser" name="Kiss"/>
+ <combo_box.item label="Rire" name="Laugh"/>
+ <combo_box.item label="Plllppt" name="Plllppt"/>
+ <combo_box.item label="Dégoût" name="Repulsed"/>
+ <combo_box.item label="Triste" name="Sad"/>
+ <combo_box.item label="Hausser les épaules" name="Shrug"/>
+ <combo_box.item label="Sourire" name="Smile"/>
+ <combo_box.item label="Surprise" name="Surprise"/>
+ <combo_box.item label="Clin d&apos;œil" name="Wink"/>
+ <combo_box.item label="Soucis" name="Worry"/>
+ </combo_box>
+ <text name="preview_label">
+ Prévisualiser
+pendant
+ </text>
+ <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
+ <combo_box.item label="Debout" name="Standing"/>
+ <combo_box.item label="Marche" name="Walking"/>
+ <combo_box.item label="Assis" name="Sitting"/>
+ <combo_box.item label="Vol" name="Flying"/>
</combo_box>
- <spinner label_width="65" label="Transition &#10;début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
- <spinner label_width="65" left="160" width="125" label="Transition &#10;fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement."/>
- <button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation." bottom_delta="-48"/>
+ <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l&apos;entrée en fondu de l&apos;animation"/>
+ <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l&apos;animation"/>
+ <button label="" name="play_btn" tool_tip="Lire votre animation"/>
+ <button name="pause_btn" tool_tip="Pauser votre animation"/>
<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
Impossible de lire le fichier d&apos;animation.
-Nous recommandons les fichiers BVH extraits de
-Poser 4.
+Nous recommandons les fichiers BVH extraits de Poser 4.
</text>
- <button label="Annuler" name="cancel_btn"/>
<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
- <string name="failed_to_initialize">
- Echec de l&apos;initialisation du mouvement
- </string>
- <string name="anim_too_long">
- Le fichier d&apos;animation fait [LENGTH] secondes.
-
-La longueur maximale est de [MAX_LENGTH] secondes.
- </string>
- <string name="failed_file_read">
- Impossible de lire le fichier d&apos;animation.
-
-[STATUS]
- </string>
+ <button label="Annuler" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_auction.xml b/indra/newview/skins/default/xui/fr/floater_auction.xml
index 4bdf9df1be..6cef2a3591 100644
--- a/indra/newview/skins/default/xui/fr/floater_auction.xml
+++ b/indra/newview/skins/default/xui/fr/floater_auction.xml
@@ -1,14 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="Commencer la vente de terrain Linden">
- <check_box label="Inclure le marquage de sélection jaune" name="fence_check" />
- <combo_box name="saletype_combo">
- <combo_box.item name="Auction" label="Enchères" />
- <combo_box.item name="FirstLand" label="Premier terrain" />
- </combo_box>
- <button label="Capture d&apos;écran" label_selected="Capture d&apos;écran"
- name="snapshot_btn" width="110" />
- <button label="OK" label_selected="OK" name="ok_btn" left_delta="114"/>
- <text name="already for sale">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="COMMENCER LA VENTE DE TERRAINS LINDEN">
+ <floater.string name="already for sale">
Vous ne pouvez pas mettre aux enchères des parcelles déjà en vente.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Inclure le marquage de sélection jaune" name="fence_check"/>
+ <button label="Capture d&apos;écran" label_selected="Capture d&apos;écran" name="snapshot_btn" width="110"/>
+ <button label="Vendre à n&apos;importe qui" label_selected="Vendre à n&apos;importe qui" name="sell_to_anyone_btn"/>
+ <button label="Effacer les paramètres" label_selected="Effacer les paramètres" name="reset_parcel_btn"/>
+ <button label="Commencer les enchères" label_selected="Commencer les enchères" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index 01b4c944f3..65bb683e4c 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Choisir le résident">
+<floater name="avatarpicker" title="CHOISIR UN RÉSIDENT">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; introuvable
+ </floater.string>
+ <floater.string name="no_one_near">
+ Personne près de vous
+ </floater.string>
+ <floater.string name="no_results">
+ Aucun résultat
+ </floater.string>
+ <floater.string name="searching">
+ Recherche...
+ </floater.string>
+ <string label="OK" label_selected="OK" name="Select">
+ Sélectionner
+ </string>
+ <string name="Close">
+ Fermer
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Rechercher" name="SearchPanel">
- <text name="InstructSearchResidentName">
- Saisissez une partie du nom du résident :
+ <text name="InstructSearchResidentName" width="240">
+ Saisissez une partie du nom du résident :
</text>
- <button label="Trouver" label_selected="Trouver" name="Find"/>
+ <button label="OK" label_selected="OK" name="Find"/>
</panel>
- <panel label="Cartes de visite" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Sélectionnez une carte de visite :
+ <panel label="Amis" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Sélectionner une personne :
</text>
</panel>
<panel label="Près de moi" name="NearMePanel">
<text name="InstructSelectResident">
- Choisir un résident
-près de vous :
+ Sélectionner une personne près de vous :
</text>
- <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" name="Refresh" left_delta="10" width="105"/>
- <slider label="Distance" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Distance" name="near_me_range"/>
<text name="meters">
mètres
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; introuvable
- </string>
- <string name="no_one_near">
- Il n'y a personne près de vous
- </string>
- <string name="no_results">
- Aucun résultat
- </string>
- <string name="searching">
- Recherche...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
index f4e3a1615c..ae8f926d8f 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
@@ -1,31 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="Textures de l&apos;avatar">
+<floater name="avatar_texture_debug" title="TEXTURES DES AVATARS">
+ <floater.string name="InvalidAvatar">
+ AVATAR NON VALIDE
+ </floater.string>
<text name="label">
Textures fixées
</text>
<text name="composite_label">
Textures composées
</text>
- <button label="Vider ces ID dans la console" label_selected="Vider" name="Dump" left="-185" width="175"/>
- <texture_picker label="Cheveux" name="hair-baked"/>
- <texture_picker label="Cheveux" name="hair"/>
- <texture_picker label="Tête" name="head-baked"/>
- <texture_picker label="Maquillage" name="head bodypaint"/>
- <texture_picker label="Yeux" name="eyes-baked"/>
- <texture_picker label="Å’il" name="iris"/>
- <texture_picker label="Haut du corps" name="upper-baked"/>
- <texture_picker label="Tatouage (haut du corps)" name="upper bodypaint"/>
- <texture_picker label="Tricot" name="undershirt"/>
- <texture_picker label="Gants" name="gloves"/>
- <texture_picker label="Chemise" name="shirt"/>
- <texture_picker label="Veste (haut)" name="upper jacket"/>
- <texture_picker label="Bas du corps" name="lower-baked"/>
- <texture_picker label="Tatouage (bas du corps)" name="lower bodypaint"/>
- <texture_picker label="Sous-vêtements" name="underpants"/>
- <texture_picker label="Chaussettes" name="socks"/>
- <texture_picker label="Chaussures" name="shoes"/>
- <texture_picker label="Pantalon" name="pants"/>
- <texture_picker label="Veste" name="lower jacket"/>
- <texture_picker label="Jupe" name="skirt-baked"/>
- <texture_picker label="Jupe" name="skirt"/>
+ <button label="Vider ces ID dans la console" label_selected="Vider" left="-185" name="Dump" width="175"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <texture_picker label="Cheveux" name="hair-baked"/>
+ <texture_picker label="Cheveux" name="hair_grain"/>
+ <texture_picker label="Alpha cheveux" name="hair_alpha"/>
+ <texture_picker label="Tête" name="head-baked"/>
+ <texture_picker label="Maquillage" name="head_bodypaint"/>
+ <texture_picker label="Alpha tête" name="head_alpha"/>
+ <texture_picker label="Tatouage tête" name="head_tattoo"/>
+ <texture_picker label="Yeux" name="eyes-baked"/>
+ <texture_picker label="Å’il" name="eyes_iris"/>
+ <texture_picker label="Alpha yeux" name="eyes_alpha"/>
+ <texture_picker label="Haut du corps" name="upper-baked"/>
+ <texture_picker label="Peinture corporelle &#10;haut" name="upper_bodypaint"/>
+ <texture_picker label="Débardeur" name="upper_undershirt"/>
+ <texture_picker label="Gants" name="upper_gloves"/>
+ <texture_picker label="Chemise" name="upper_shirt"/>
+ <texture_picker label="Veste (haut)" name="upper_jacket"/>
+ <texture_picker label="Alpha haut" name="upper_alpha"/>
+ <texture_picker label="Tatouage haut" name="upper_tattoo"/>
+ <texture_picker label="Bas du corps" name="lower-baked"/>
+ <texture_picker label="Peinture corporelle bas" name="lower_bodypaint"/>
+ <texture_picker label="Caleçon" name="lower_underpants"/>
+ <texture_picker label="Chaussettes" name="lower_socks"/>
+ <texture_picker label="Chaussures" name="lower_shoes"/>
+ <texture_picker label="Pantalon" name="lower_pants"/>
+ <texture_picker label="Veste" name="lower_jacket"/>
+ <texture_picker label="Alpha bas" name="lower_alpha"/>
+ <texture_picker label="Tatouage bas" name="lower_tattoo"/>
+ <texture_picker label="Jupe" name="skirt-baked"/>
+ <texture_picker label="Jupe" name="skirt"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml
index 0b060983ee..d61115a2db 100644
--- a/indra/newview/skins/default/xui/fr/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Balises">
+<floater name="beacons" title="BALISES">
<panel name="beacons_panel">
- <check_box label="Objets scriptés avec Toucher uniquement" name="touch_only"/>
- <check_box label="Objets scriptés" name="scripted"/>
- <check_box label="Objets physiques" name="physical"/>
- <check_box label="Sources sonores" name="sounds"/>
- <check_box label="Sources de particules" name="particles"/>
- <check_box label="Mettre en surbrillance" name="highlights"/>
- <check_box label="Montrer les balises" name="beacons"/>
- <text name="beacon_width_label">
- Largeur de la balise :
+ <text name="label_show">
+ Afficher :
+ </text>
+ <check_box label="Balises" name="beacons"/>
+ <check_box label="Surbrillances" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Largeur de la balise">
+ Largeur :
</text>
+ <text name="label_objects">
+ Pour ces objets :
+ </text>
+ <check_box label="Physique" name="physical"/>
+ <check_box label="Scripté" name="scripted"/>
+ <check_box label="Toucher uniquement" name="touch_only"/>
+ <check_box label="Sources sonores" name="sounds"/>
+ <check_box label="Sources des particules" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml
index 3451c2de4c..cad00ea866 100644
--- a/indra/newview/skins/default/xui/fr/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml
@@ -1,8 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="build options floater" title="Options de la grille">
- <spinner label="Unité (mètres)" name="GridResolution" />
- <spinner label="Mesures (mètres)" name="GridDrawSize" />
- <check_box label="Activer la fixation des sous-unités" name="GridSubUnit" />
- <check_box label="Afficher les sections transversales" name="GridCrossSection" />
- <slider label="Opacité de la grille" name="GridOpacity" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="OPTIONS DE LA GRILLE">
+ <spinner label="Unités (mètres)" name="GridResolution"/>
+ <spinner label="Mesures (mètres)" name="GridDrawSize"/>
+ <check_box label="Fixation des sous-unités" name="GridSubUnit"/>
+ <check_box label="Afficher les sections transversales" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacité de la grille">
+ Opacité :
+ </text>
+ <slider label="Opacité de la grille" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
index b868aa33ad..ecd9dd0863 100644
--- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Changement des droits relatifs au contenu">
- <text name="applyto">
- Types de contenu
- </text>
+<floater name="floaterbulkperms" title="MODIFIER LES DROITS RELATIFS AU CONTENU">
+ <floater.string name="nothing_to_modify_text">
+ La sélection contient des contenus non modifiables.
+ </floater.string>
+ <floater.string name="status_text">
+ Permissions paramétrées sur [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Demande de changement des droits lancée...
+ </floater.string>
+ <floater.string name="done_text">
+ Demande de changement des droits finie.
+ </floater.string>
<check_box label="Animation" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animation"/>
<check_box label="Parties du corps" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Parties du corps"/>
<check_box label="Habits" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Habits"/>
<check_box label="Gestes" name="check_gesture"/>
- <check_box label="Repères" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestes"/>
<check_box label="Notes" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Notes"/>
<check_box label="Objets" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objets"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Sons" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sons"/>
<check_box label="Textures" name="check_texture"/>
- <button label="Tout cocher" label_selected="Tout" name="check_all"/>
- <button label="Tout décocher" label_selected="Aucun" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Textures"/>
+ <button label="√ Tout" label_selected="Tout" name="check_all"/>
+ <button label="Effacer" label_selected="Aucun" name="check_none"/>
<text name="newperms">
- Nouveaux droits
+ Nouvelles permissions
+ </text>
+ <text name="GroupLabel">
+ Groupe :
</text>
- <check_box label="Partager avec le groupe" name="share_with_group"/>
- <check_box label="Autoriser tout le monde à copier" name="everyone_copy"/>
+ <check_box label="Partager" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ N&apos;importe qui :
+ </text>
+ <check_box label="Copier" name="everyone_copy"/>
<text name="NextOwnerLabel">
- Le prochain propriétaire pourra :
+ Le prochain propriétaire :
</text>
<check_box label="Modifier" name="next_owner_modify"/>
<check_box label="Copier" name="next_owner_copy"/>
- <check_box label="Revendre/Donner" name="next_owner_transfer"/>
- <button label="Aide" name="help"/>
- <button label="Appliquer" name="apply"/>
- <button label="Fermer" name="close"/>
- <string name="nothing_to_modify_text">
- La sélection contient des contenus non modifiables.
- </string>
- <string name="status_text">
- Permissions paramétrées sur [NAME]
- </string>
- <string name="start_text">
- Demande de changement des droits lancée...
- </string>
- <string name="done_text">
- Demande de changement des droits finie.
- </string>
+ <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+ <button label="OK" name="apply"/>
+ <button label="Annuler" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_bumps.xml b/indra/newview/skins/default/xui/fr/floater_bumps.xml
index e12c7ed17d..34b33bbd6b 100644
--- a/indra/newview/skins/default/xui/fr/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/fr/floater_bumps.xml
@@ -1,21 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_bumps" title="Collisions, coups et bousculades">
- <text name="none_detected">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="COLLISIONS, COUPS ET BOUSCULADES">
+ <floater.string name="none_detected">
Aucun détecté
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] est entré en collision avec vous
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] vous a bousculé avec un script
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] vous a donné un coup avec un objet
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] vous a donné un coup avec un objet scripté
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] vous a donné un coup avec un objet physique
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
index 916b270500..7aa142b13e 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="Acheter ce contenu">
+<floater name="floater_buy_contents" title="ACHETER DES CONTENUS">
<text name="contains_text">
[NAME] contient :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 85d67218d3..c7437c4603 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -1,69 +1,67 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="Acheter des L$">
- <text left="5" name="info_buying">
- Achat de L$ :
- </text>
- <text left="5" name="info_cannot_buy" right="-5">
- Impossible d&apos;acheter maintenant :
- </text>
+<floater name="buy currency" title="ACHETER DES L$">
+ <floater.string name="buy_currency">
+ Achetez [LINDENS] L$ pour environ [LOCALAMOUNT]
+ </floater.string>
<text left="5" name="info_need_more" right="-5">
- Vous avez besoin de plus de devises:
- </text>
- <text name="error_message">
- Quelque chose ne va pas.
+ Vous avez besoin de plus de L$
</text>
- <button label="Aller sur le site" name="error_web"/>
<text name="contacting">
- En train de contacter le Lindex...
+ En train de contacter
+le Lindex...
</text>
- <text name="buy_action_unknown" right="-5">
- Acheter des L$ sur le marché du LindeX
+ <text left="5" name="info_buying">
+ Acheter des L$
</text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
+ <text name="balance_label">
+ J&apos;ai
+ </text>
+ <text name="balance_amount">
+ [AMT] L$
</text>
<text name="currency_action">
- Acheter
+ Je veux acheter
</text>
- <line_editor name="currency_amt" width="65">
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt" width="65">
1234
</line_editor>
- <text name="currency_est" width="138" left_delta="68">
- L$ pour environ [USD] US$
- </text>
- <text name="getting_data" width="138">
- Obtention des données...
+ <text name="buying_label">
+ Pour
</text>
- <text name="balance_label">
- Actuellement, vous avez
+ <text left_delta="68" name="currency_est" width="138">
+ environ [LOCALAMOUNT]
</text>
- <text name="balance_amount">
- [AMT] L$
- </text>
- <text name="buying_label">
- Vous achetez
+ <text name="getting_data" width="138">
+ Estimation en cours...
</text>
- <text name="buying_amount">
- [AMT] L$
+ <text name="buy_action">
+ [NAME] L$ [PRICE]
</text>
<text name="total_label">
- Votre solde sera de
+ Mon nouveau solde sera de
</text>
<text name="total_amount">
[AMT] L$
</text>
- <text name="purchase_warning_repurchase" height="48" bottom_delta="-64" right="-10">
- En confirmant cette transaction, vous achetez
-uniquement les devises. Vous devrez recommencer
-cette opération.
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php?lang=fr-FR mode de paiement] | [http://www.secondlife.com/my/account/currency.php?lang=fr-FR devise] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=fr-FR taux de change]
</text>
- <text name="purchase_warning_notenough" bottom_delta="16">
- Vous n&apos;achetez pas assez de devises.
-Veuillez saisir un montant plus élevé.
+ <text name="exchange_rate_note">
+ Saisissez à nouveau le montant pour voir le taux de change actuel.
+ </text>
+ <text name="purchase_warning_repurchase">
+ La confirmation de cet achat n&apos;achète que des L$, pas l&apos;objet.
+ </text>
+ <text bottom_delta="16" name="purchase_warning_notenough">
+ Vous n&apos;achetez pas assez de L$. Veuillez augmenter le montant.
</text>
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
- <string name="buy_currency">
- Acheter [LINDENS] L$ pour environ [USD] US$
- </string>
+ <text left="5" name="info_cannot_buy" width="200" right="-5">
+ Achat impossible
+ </text>
+ <button label="Accéder au Web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index aaf1577114..7c9a31a4c3 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -1,5 +1,132 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Acheter le terrain">
+<floater name="buy land" title="ACHETER DU TERRAIN">
+ <floater.string name="can_resell">
+ Peut être revendu.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Ne peut pas être revendu.
+ </floater.string>
+ <floater.string name="can_change">
+ Peut être fusionné ou divisé.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Ne peut pas être fusionné ou divisé.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Aucun terrain sélectionné.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Vous avez sélectionné plusieurs parcelles.
+Sélectionnez une zone plus petite.
+ </floater.string>
+ <floater.string name="no_permission">
+ Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ La parcelle sélectionnée n&apos;est pas à vendre.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ La parcelle appartient déjà au groupe.
+ </floater.string>
+ <floater.string name="you_already_own">
+ La parcelle vous appartient déjà.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ La parcelle sélectionnée doit déjà être vendue à quelqu&apos;un d&apos;autre.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Il n&apos;y a pas de terrain public dans cette zone.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Le terrain sélectionné appartient à quelqu&apos;un d&apos;autre.
+Sélectionnez une zone plus petite.
+ </floater.string>
+ <floater.string name="processing">
+ Achat en cours de traitement...
+
+(Veuillez patienter quelques instants.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Une erreur s&apos;est produite pendant le traitement de l&apos;achat du terrain.
+ </floater.string>
+ <floater.string name="buying_will">
+ Si vous achetez ce terrain :
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Si vous achetez le terrain pour le groupe :
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Impossible d&apos;acheter maintenant :
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Pas à vendre :
+ </floater.string>
+ <floater.string name="none_needed">
+ aucun besoin
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Pour posséder du terrain, vous devez avoir un niveau de compte supérieur.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Avec votre compte, vous pouvez posséder du terrain.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Vous détenez [BUYER] m² de terrain.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Payez [AMOUNT] L$ à [SELLER] pour ce terrain
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Achetez [AMOUNT] L$ pour environ [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Cette parcelle fait [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ C&apos;est un terrain premium, [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Ce terrain est en solde, [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+prend en charge [AMOUNT2] objets
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ vendu avec objets
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objets non inclus
+ </floater.string>
+ <floater.string name="info_price_string">
+ [PRICE] L$
+([PRICE_PER_SQM] L$/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
+ </floater.string>
+ <floater.string name="balance_left">
+ Après cet achat, il vous restera [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (aucune parcelle sélectionnée)
+ </floater.string>
+ <floater.string name="icon_PG" value="Parcel_PG_Dark"/>
+ <floater.string name="icon_M" value="Parcel_M_Dark"/>
+ <floater.string name="icon_R" value="Parcel_R_Dark"/>
<text name="region_name_label">
Région :
</text>
@@ -37,10 +164,10 @@
Vous devez accepter le règlement du domaine :
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor left="510" name="covenant_editor">
Chargement...
</text_editor>
- <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant"/>
+ <check_box label="J&apos;accepte le règlement ci-dessus." left="510" name="agree_covenant"/>
<text name="info_parcel_label">
Parcelle :
</text>
@@ -51,15 +178,15 @@
Taille :
</text>
<text name="info_size">
- 1024 m²
+ 1 024 m²
</text>
<text name="info_price_label">
Prix :
</text>
<text name="info_price">
1500 L$
- (1,1 L$/m²)
- vendu avec objets
+(1,1 L$/m²)
+vendu avec objets
</text>
<text name="info_action" width="380">
Si vous achetez ce terrain :
@@ -75,15 +202,15 @@
Seuls les membres Premium peuvent posséder du terrain.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9,95 US$/mois, facturation mensuelle"/>
- <combo_box.item name="US$7.50/month,billedquarterly" label="7,50 US$/mois, facturation trimestrielle"/>
- <combo_box.item name="US$6.00/month,billedannually" label="6,00 US$/mois, facturation annuelle"/>
+ <combo_box.item label="9,95 US$/mois, facturation mensuelle" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7,50 US$/mois, facturation trimestrielle" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6,00 US$/mois, facturation annuelle" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
+ <text follows="top|left" font="SansSerifBig" height="16" layout="topleft" left="72" length="1" name="land_use_action" right="500" top="284" type="string" width="400">
Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
</text>
<text name="land_use_reason">
- Vous êtes propriétaire de 1 309 m² de terrain.
+ Vous détenez 1 309 m² de terrain.
Cette parcelle fait 512 m².
</text>
<text name="purchase_action">
@@ -99,139 +226,12 @@ Cette parcelle fait 512 m².
1000
</line_editor>
<text name="currency_est">
- pour environ [AMOUNT2] US$
+ pour environ [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Vous avez 2 100 L$.
</text>
- <check_box label="Supprimer [AMOUNT] mètres carrés de votre contribution au groupe." name="remove_contribution"/>
+ <check_box label="Enlever [AMOUNT] m² de contribution du groupe." name="remove_contribution"/>
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
- <string name="can_resell">
- Peut être revendu.
- </string>
- <string name="can_not_resell">
- Ne peut pas être revendu.
- </string>
- <string name="can_change">
- Peut être fusionné ou divisé.
- </string>
- <string name="can_not_change">
- Ne peut pas être fusionné ou divisé.
- </string>
- <string name="cant_buy_for_group">
- Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
- </string>
- <string name="no_land_selected">
- Aucun terrain sélectionné.
- </string>
- <string name="multiple_parcels_selected">
- Vous avez sélectionné plusieurs parcelles.
-Sélectionnez une zone plus petite.
- </string>
- <string name="no_permission">
- Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
- </string>
- <string name="parcel_not_for_sale">
- La parcelle sélectionnée n&apos;est pas à vendre.
- </string>
- <string name="group_already_owns">
- La parcelle appartient déjà au groupe.
- </string>
- <string name="you_already_own">
- La parcelle vous appartient déjà.
- </string>
- <string name="set_to_sell_to_other">
- La parcelle sélectionnée doit déjà être vendue à quelqu&apos;un d&apos;autre.
- </string>
- <string name="no_public_land">
- Il n&apos;y a pas de terrain public dans cette zone.
- </string>
- <string name="not_owned_by_you">
- Le terrain sélectionné appartient à quelqu&apos;un d&apos;autre.
-Sélectionnez une zone plus petite.
- </string>
- <string name="processing">
- Achat en cours de traitement...
-
-(Veuillez patienter quelques instants.)
- </string>
- <string name="fetching_error">
- Une erreur s&apos;est produite pendant le traitement de l&apos;achat du terrain.
- </string>
- <string name="buying_will">
- Si vous achetez ce terrain :
- </string>
- <string name="buying_for_group">
- Si vous achetez le terrain pour le groupe :
- </string>
- <string name="cannot_buy_now">
- Impossible d&apos;acheter maintenant :
- </string>
- <string name="not_for_sale">
- Pas à vendre :
- </string>
- <string name="none_needed">
- aucun besoin
- </string>
- <string name="must_upgrade">
- Pour posséder du terrain, vous devez avoir un niveau de compte supérieur.
- </string>
- <string name="cant_own_land">
- Avec votre compte, vous pouvez posséder du terrain.
- </string>
- <string name="land_holdings">
- Vous possédez un terrain de [BUYER] m².
- </string>
- <string name="pay_to_for_land">
- Payez [AMOUNT] L$ à [SELLER] pour ce terrain
- </string>
- <string name="buy_for_US">
- Acheter [AMOUNT] L$ pour environ [AMOUNT2] US$,
- </string>
- <string name="parcel_meters">
- Cette parcelle fait [AMOUNT] m².
- </string>
- <string name="premium_land">
- Ce terrain est premium et les frais associés sont ceux d&apos;un terrain de [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Ce terrain est en solde et les frais associés sont ceux d&apos;un terrain de [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-peuvent contenir [AMOUNT2] prims
- </string>
- <string name="sold_with_objects">
- vendu avec objets
- </string>
- <string name="sold_without_objects">
- objets non inclus
- </string>
- <string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
- </string>
- <string name="have_enough_lindens">
- Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain.
- </string>
- <string name="not_enough_lindens">
- Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
- </string>
- <string name="balance_left">
- Après cet achat, il vous restera [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
- </string>
- <string name="no_parcel_selected">
- (aucune parcelle sélectionnée)
- </string>
- <string name="buy_currency">
- Acheter [LINDENS] L$ pour environ [USD] US$
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
index 9e0ce25b97..bd29f27cbc 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Acheter une copie de l&apos;objet">
+<floater name="contents" title="ACHETER UNE COPIE DE L&apos;OBJET">
<text name="contents_text">
- et ses contenus :
+ Contient :
</text>
<text name="buy_text">
Acheter pour [AMOUNT] L$ à [NAME] ?
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 8ea640853f..309c93cf3b 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="camera_floater">
<floater.string name="rotate_tooltip">
Faire tourner la caméra autour du point central
@@ -11,6 +11,21 @@
</floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
- <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/>
+ <panel name="zoom" tool_tip="Zoomer en direction du point central">
+ <slider_bar name="zoom_slider" tool_tip="Zoomer en direction du point central"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Vue arrière"/>
+ <button name="group_view" tool_tip="Vue Groupe"/>
+ <button name="front_view" tool_tip="Vue frontale"/>
+ <button name="mouselook_view" tool_tip="Vue subjective"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/>
+ <button label="" name="pan_btn" tool_tip="Faire un panoramique"/>
+ <button label="" name="avatarview_btn" tool_tip="Vue subjective"/>
+ <button label="" name="freecamera_btn" tool_tip="Voir l&apos;objet"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_choose_group.xml b/indra/newview/skins/default/xui/fr/floater_choose_group.xml
index ade440f296..b73bedd7b5 100644
--- a/indra/newview/skins/default/xui/fr/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/fr/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="groups" title="Groupes">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GROUPES">
<text name="groupdesc">
Choisissez un groupe :
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index 94bcad070e..8d7fe76b35 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="Choix de texture et de couleur">
+<floater name="ColorPicker" title="SÉLECTEUR DE COULEURS">
<text name="r_val_text">
Rouge :
</text>
@@ -18,15 +18,14 @@
<text name="l_val_text">
Lum :
</text>
- <check_box label="Application auto" left="4" name="apply_immediate" width="108"/>
+ <check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/>
<button label="" label_selected="" left_delta="138" name="color_pipette"/>
<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
- <button label="Sélectionner" label_selected="Sélectionner" name="select_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text left="8" name="Current color:">
Couleur actuelle :
</text>
- <text left="8" name="(Drag below to save.)" width="114">
- (Faire glisser dessous
-pour enregistrer)
+ <text left="8" name="(Drag below to save.)" width="220">
+ (Faire glisser dessous pour enregistrer.)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
index 1250c46933..82b54aeffc 100644
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ b/indra/newview/skins/default/xui/fr/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Apparence" width="548">
+<floater name="floater customize" title="APPARENCE" width="548">
<tab_container name="customize tab container" tab_min_width="150" width="546">
- <placeholder label="Parties du corps" name="body_parts_placeholder"/>
+ <text label="Parties du corps" name="body_parts_placeholder">
+ Parties du corps
+ </text>
<panel label="Silhouette" left="154" name="Shape" width="389">
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
<button label="Corps" label_selected="Corps" name="Body"/>
@@ -14,8 +16,8 @@
<button label="Torse" label_selected="Torse" name="Torso"/>
<button label="Jambes" label_selected="Jambes" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Femme"/>
- <radio_item name="radio2" label="Homme"/>
+ <radio_item label="Femme" name="radio" value="0"/>
+ <radio_item label="Homme" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,9 +35,7 @@
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer de silhouette, faites-en glisser une à partir de votre
-inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle
-et de la porter.
+ Pour changer de silhouette, faites-en glisser une de votre inventaire à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -68,8 +68,7 @@ et de la porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer de peau, faites-en glisser une à partir de votre inventaire.
-Vous pouvez aussi en créer une nouvelle et la porter.
+ Pour changer de peau, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -106,9 +105,7 @@ Vous pouvez aussi en créer une nouvelle et la porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer de chevelure, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle
-et la porter.
+ Pour changer de cheveux, faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -139,8 +136,7 @@ et la porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer vos yeux, faites-les glisser de votre inventaire jusqu&apos;à
-votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
+ Pour changer d&apos;yeux, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -154,12 +150,14 @@ votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
</panel>
- <panel label="Habits" name="clothes_placeholder"/>
+ <text label="Habits" name="clothes_placeholder">
+ Habits
+ </text>
<panel label="Chemise" name="Shirt">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+ <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
@@ -179,8 +177,7 @@ votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter une nouvelle chemise, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
+ Pour changer de chemise, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -191,9 +188,9 @@ jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porte
</panel>
<panel label="Pantalon" name="Pants">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+ <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
@@ -213,8 +210,7 @@ jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porte
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter un nouveau pantalon, faites-en glisser un de votre inventaire
-jusqu&apos;à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
+ Pour changer de pantalon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
</text>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
@@ -240,10 +236,9 @@ jusqu&apos;à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter de nouvelles chaussures, faites-en glisser une paire de votre
-inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
-nouvelle paire et la porter.
+ Pour changer de chaussures, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer des nouvelles et les porter.
</text>
+ <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -251,8 +246,7 @@ nouvelle paire et la porter.
Chaussures :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New" />
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
@@ -275,10 +269,9 @@ nouvelle paire et la porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter de nouvelles chaussettes, faites-en glisser une paire de votre
-inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
-nouvelle paire et la porter.
+ Pour changer de chaussettes, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer des nouvelles et les porter.
</text>
+ <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -286,8 +279,7 @@ nouvelle paire et la porter.
Chaussettes :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
@@ -310,9 +302,9 @@ nouvelle paire et la porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter une nouvelle veste, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
+ Pour changer de veste, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
+ <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -321,8 +313,7 @@ jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porte
</text>
<texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
<texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="81"/>
- <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
@@ -345,9 +336,9 @@ jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porte
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter de nouveaux gants, faites-les glisser à partir de votre
-inventaire. Vous pouvez aussi en créer une nouvelle paire et la porter.
+ Pour changer de gants, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
</text>
+ <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -355,14 +346,13 @@ inventaire. Vous pouvez aussi en créer une nouvelle paire et la porter.
Gants :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
</panel>
- <panel label="Sous-vêtements (haut)" name="Undershirt">
+ <panel label="Débardeur" name="Undershirt">
<text name="title">
[DESC]
</text>
@@ -373,31 +363,29 @@ inventaire. Vous pouvez aussi en créer une nouvelle paire et la porter.
[DESC]: en cours de chargement...
</text>
<text name="title_not_worn">
- [DESC]: non portés
+ [DESC]: non porté
</text>
<text name="path">
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter de nouveaux sous-vêtements, faites-les glisser à partir de
-votre inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
+ Pour changer de débardeur, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un débardeur" label_selected="Créer un débardeur" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text name="Item Action Label" right="92" bottom="-470">
- Sous-vêtements
-(haut) :
+ <text bottom="-470" name="Item Action Label" right="92">
+ Débardeur :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
</panel>
- <panel label="Sous-vêtements (bas)" name="Underpants">
+ <panel label="Caleçon" name="Underpants">
<text name="title">
[DESC]
</text>
@@ -408,25 +396,23 @@ votre inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
[DESC]: en cours de chargement...
</text>
<text name="title_not_worn">
- [DESC]: non portés
+ [DESC]: non porté
</text>
<text name="path">
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter de nouveaux sous-vêtements, faites-les glisser à partir de
-votre inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
+ Pour changer de caleçon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un caleçon" label_selected="Créer un caleçon" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text name="Item Action Label" right="92" bottom="-470">
- Sous-vêtements
-(bas) :
+ <text bottom="-470" name="Item Action Label" right="92">
+ Caleçon :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
@@ -449,9 +435,9 @@ votre inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour porter une nouvelle jupe, faites-en glisser une à partir de votre
-inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
+ Pour changer de jupe, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
+ <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -459,16 +445,86 @@ inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
Jupe :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
</panel>
+ <panel label="Tatouage" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: impossible de modifier
+ </text>
+ <text name="title_loading">
+ [DESC]: en cours de chargement...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: non porté
+ </text>
+ <text name="path">
+ Dans [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
+ </text>
+ <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/>
+ <text name="no modify instructions">
+ Vous n&apos;avez pas le droit de modifier cet objet.
+ </text>
+ <text name="Item Action Label">
+ Tatouage :
+ </text>
+ <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <button label="Enlever" label_selected="Enlever" name="Take Off"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/>
+ </panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: impossible de modifier
+ </text>
+ <text name="title_loading">
+ [DESC]: en cours de chargement...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: non porté
+ </text>
+ <text name="path">
+ Dans [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
+ </text>
+ <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/>
+ <text name="no modify instructions">
+ Vous n&apos;avez pas le droit de modifier cet objet.
+ </text>
+ <text name="Item Action Label">
+ Alpha :
+ </text>
+ <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <button label="Enlever" label_selected="Enlever" name="Take Off"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/>
+ </panel>
</tab_container>
<scroll_container left="251" name="panel_container"/>
+ <button label="Infos sur les scripts" label_selected="Infos sur les scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/>
+ <button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Créer un ensemble..." label_selected="Créer un ensemble..." name="Make Outfit" left="152" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
index 1103539898..15cc6cd1ba 100644
--- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Day Cycle Floater" title="Editeur du cycle du jour">
+<floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR">
<tab_container name="Day Cycle Tabs">
<panel label="Cycle du jour" name="Day Cycle">
<button label="?" name="WLDayCycleHelp" />
@@ -59,14 +59,14 @@
</text>
<button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey" width="89" bottom="-45" />
<button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey" width="89" bottom="-70" />
- <text name="WLCurKeyFrameText">
+ <text name="WLCurKeyFrameText" width="170">
Réglages des images-clés :
</text>
- <text name="WLCurKeyTimeText">
+ <text name="WLCurKeyTimeText" width="170">
Heure de la clé :
</text>
- <spinner label="Heure" name="WLCurKeyHour" />
- <spinner label="Min" name="WLCurKeyMin" />
+ <spinner label="Heure" name="WLCurKeyHour" label_width="80" width="74"/>
+ <spinner label="Min" name="WLCurKeyMin" label_width="80"/>
<text name="WLCurKeyTimeText2">
Préréglages clés :
</text>
@@ -78,13 +78,13 @@
<text name="DayCycleText2">
Durée du cycle :
</text>
- <spinner label="Heure" name="WLLengthOfDayHour" />
+ <spinner label="Heure" name="WLLengthOfDayHour" label_width="80" width="74" />
<spinner label="Min" name="WLLengthOfDayMin" />
- <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="75"/>
- <text name="DayCycleText3">
+ <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="95"/>
+ <text name="DayCycleText3" left="280" width="200">
Prévisualiser :
</text>
- <button label="Jouer" label_selected="Jouer" name="WLAnimSky" />
+ <button label="Jouer" label_selected="Jouer" name="WLAnimSky" left_delta="90"/>
<button label="Stop !" label_selected="Stop" name="WLStopAnimSky" />
<button label="Utiliser heure domaine" label_selected="Aller heure domaine"
name="WLUseLindenTime" />
diff --git a/indra/newview/skins/default/xui/fr/floater_device_settings.xml b/indra/newview/skins/default/xui/fr/floater_device_settings.xml
index 656f1c4fba..f5994cb604 100644
--- a/indra/newview/skins/default/xui/fr/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_device_settings.xml
@@ -1,3 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_device_settings"
- title="Paramètres du matériel utilisé pour le chat vocal" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_device_settings" title="PARAMÈTRES DU MATÉRIEL UTILISÉ POUR LE CHAT VOCAL"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
index 1d14142dd3..dd714e85b6 100644
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="Éditeur d&apos;environnement">
- <text bottom="-45" name="EnvTimeText">
+<floater name="Environment Editor Floater" title="ÉDITEUR D&apos;ENVIRONNEMENT">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text bottom="-45" name="EnvTimeText" top="29">
Heure de la
journée
</text>
@@ -11,17 +14,16 @@ journée
Couverture
nuageuse
</text>
- <text bottom="-45" name="EnvWaterColorText">
+ <text bottom="-45" name="EnvWaterColorText" top="29">
Couleur de
l&apos;eau
</text>
- <color_swatch name="EnvWaterColor" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch name="EnvWaterColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
<text name="EnvWaterFogText">
Brouillard
dans l&apos;eau
</text>
- <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="145"/>
- <button label="Ciel avancé" name="EnvAdvancedSkyButton" width="145" left="162" />
- <button label="Eau avancée" name="EnvAdvancedWaterButton" width="145" left="316"/>
- <button label="?" name="EnvSettingsHelpButton"/>
+ <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/>
+ <button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/>
+ <button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_event.xml b/indra/newview/skins/default/xui/fr/floater_event.xml
new file mode 100644
index 0000000000..02192c65ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_event.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Événement" name="Event" title="DÉTAILS SUR L&apos;ÉVÉNEMENT">
+ <floater.string name="none">
+ aucun
+ </floater.string>
+ <floater.string name="notify">
+ Prévenir
+ </floater.string>
+ <floater.string name="dont_notify">
+ Ne pas prévenir
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text name="event_category">
+ (pas de catégorie)
+ </text>
+ <text name="event_runby_label">
+ Organisé par :
+ </text>
+ <text initial_value="(récupération en cours)" name="event_runby"/>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration">
+ 1 heure
+ </text>
+ <text name="event_cover">
+ Gratuit
+ </text>
+ <text name="event_location_label">
+ Lieu :
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Catégorie :"/>
+ <text name="rating_value" value="inconnu"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Créer un événement"/>
+ <button name="god_delete_event_btn" tool_tip="Supprimer l&apos;événement"/>
+ <button label="Me prévenir" name="notify_btn"/>
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml b/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml
new file mode 100644
index 0000000000..a1c6a19e8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="set_name_in_the_cladd">
+ <check_box label="Désactiver les astuces" name="DontShowFirstTimeTip_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_font_test.xml b/indra/newview/skins/default/xui/fr/floater_font_test.xml
index 11eb11a0d7..974a5ca3a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/fr/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Test de la police">
+<floater name="contents" title="TEST DE POLICE">
<text name="linea">
OverrideTest, Times-BOLD doit être sélectionné ici. (De default/xui/fr)
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_gesture.xml b/indra/newview/skins/default/xui/fr/floater_gesture.xml
index 4411fee480..113df0acc4 100644
--- a/indra/newview/skins/default/xui/fr/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_gesture.xml
@@ -1,18 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="Gestes utilisés">
- <text name="help_label">
- Double-cliquez sur un geste pour jouer les animations
-et les sons.
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Lieux" name="gestures" title="GESTES">
+ <floater.string name="loading">
+ Chargement...
+ </floater.string>
+ <floater.string name="playing">
+ (lecture en cours)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copie de [COPY_NAME]
+ </floater.string>
<scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="Déclencheur" name="trigger" width="85" />
- <column label="Touche" name="shortcut" />
- <column label="" name="key" />
- <column label="Nom" name="name" width="145"/>
+ <scroll_list.columns label="Nom" name="name" width="145"/>
+ <scroll_list.columns label="Chat" name="trigger" width="85"/>
+ <scroll_list.columns label="" name="key"/>
+ <scroll_list.columns label="Touche" name="shortcut"/>
</scroll_list>
- <button label="Nouveau" name="new_gesture_btn" />
- <button label="Inventaire" name="inventory_btn" />
- <button label="Modifier" name="edit_btn" />
- <button label="Jouer" name="play_btn" />
- <button label="Stop" name="stop_btn" />
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Plus d&apos;options"/>
+ <button name="new_gesture_btn" tool_tip="Faire un nouveau geste"/>
+ <button name="activate_btn" tool_tip="Activer/désactiver le geste sélectionné"/>
+ <button name="del_btn" tool_tip="Supprimer ce geste"/>
+ </panel>
+ <button label="Modifier" name="edit_btn"/>
+ <button label="Jouer" name="play_btn"/>
+ <button label="Stop" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index 461956ff34..187814eba2 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -1,26 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="Outils divins">
+<floater name="godtools floater" title="OUTILS DIVINS">
<tab_container name="GodTools Tabs">
<panel label="Grille" name="grid">
- <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175" />
+ <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/>
<button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
</panel>
<panel label="Région" name="region">
<text name="Sim Name:" width="70">
Nom du sim :
</text>
- <line_editor left="85" name="region name" width="198" />
+ <line_editor left="85" name="region name" width="198"/>
<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
- <check_box label="Réinitialiser le domicile &#10;à la téléportation" name="check reset home" tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination." height="32"/>
- <check_box label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins." bottom_delta="-32"/>
+ <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s&apos;en vont par téléportation, réinitialisez leur domicile sur l&apos;emplacement de destination."/>
+ <check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
<check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/>
<check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/>
- <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118" />
- <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118" />
- <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118" />
+ <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/>
+ <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/>
+ <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/>
<text name="estate id">
ID du domaine :
</text>
@@ -31,37 +31,40 @@
<text name="Grid Pos: ">
Position sur la grille :
</text>
- <line_editor name="gridposx" tool_tip="Position x de cette région sur la grille" left_delta="120" width="35"/>
- <line_editor name="gridposy" tool_tip="Position y de cette région sur la grille" left_delta="40" width="35" />
+ <line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/>
+ <line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/>
<text name="Redirect to Grid: ">
Rediriger vers la grille :
</text>
- <line_editor left_delta="120" name="redirectx" width="35" />
- <line_editor left_delta="40" name="redirecty" width="35" />
- <spinner left="320" name="billable factor" width="70" />
- <text name="billable factor text" font="SansSerifSmall" left_delta="-120" width="120">
+ <line_editor left_delta="120" name="redirectx" width="35"/>
+ <line_editor left_delta="40" name="redirecty" width="35"/>
+ <text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120">
Facteur de facturation :
</text>
- <spinner left="320" name="land cost" width="70" />
- <text name="land cost text" left_delta="-120">
+ <spinner left="320" name="billable factor" width="70"/>
+ <text left_delta="-120" name="land cost text">
L$ par m² :
</text>
+ <spinner left="320" name="land cost" width="70"/>
<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
- <button label="Sélectionner une région" label_selected="Sélectionner une région" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="140" left="136"/>
- <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140" left="136"/>
+ <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="160"/>
+ <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="160"/>
</panel>
<panel label="Objets" name="objects">
+ <panel.string name="no_target">
+ (aucune cible)
+ </panel.string>
<text name="Sim Name:" width="70">
Nom du sim :
</text>
- <text name="region name" left_delta="75">
+ <text left_delta="75" name="region name">
Welsh
</text>
- <check_box label="Désactiver les &#10;scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
- <check_box label="Désactiver les &#10;collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
- <check_box label="Désactiver la &#10;physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/>
- <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." bottom="-85"/>
+ <check_box label="Désactiver les scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
+ <check_box label="Désactiver les collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
+ <check_box label="Désactiver la physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/>
+ <button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
<button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet."/>
<text name="target_avatar_name">
(aucune cible)
@@ -69,26 +72,26 @@
<button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/>
<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
<button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
- <button width="300" label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. "/>
- <button width="300" label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts."/>
- <button width="300" label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences."/>
+ <button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/>
+ <button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/>
+ <button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/>
</panel>
<panel label="Requête" name="request">
<text name="Destination:">
Destination :
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="Sélection" />
- <combo_box.item name="item2" label="Région de l&apos;avatar" />
+ <combo_box.item label="Sélection" name="item1"/>
+ <combo_box.item label="Région de l&apos;avatar" name="item2"/>
</combo_box>
<text name="Request:">
Requête :
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="Objets responsables de collisions : étapes" />
- <combo_box.item name="item2" label="Nombre de scripts et schéma optionnel" />
- <combo_box.item name="item3" label="Schéma des objets" />
- <combo_box.item name="item4" label="rezzer &lt;asset_id&gt;" />
+ <combo_box.item label="Objets responsables de collisions : étapes" name="item1"/>
+ <combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/>
+ <combo_box.item label="Schéma des objets" name="item3"/>
+ <combo_box.item label="rezzer &lt;asset_id&gt;" name="item4"/>
</combo_box>
<text name="Parameter:">
Paramètre :
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 11d7fc28e9..e3d604477c 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="Configuration du matériel">
+<floater name="Hardware Settings Floater" title="PARAMÈTRES MATÉRIELS">
<text name="Filtering:">
Filtres :
</text>
@@ -8,11 +8,11 @@
Anti-aliasing :
</text>
<combo_box label="Anti-aliasing" name="fsaa" width="84">
- <combo_box.item name="FSAADisabled" label="Désactivé" />
- <combo_box.item name="2x" label="2x" />
- <combo_box.item name="4x" label="4x" />
- <combo_box.item name="8x" label="8x" />
- <combo_box.item name="16x" label="16x" />
+ <combo_box.item label="Désactivé" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gamma :" name="gamma"/>
<text left="217" name="(brightness, lower is brighter)">
@@ -21,8 +21,8 @@
<text name="Enable VBO:">
Activer le VBO :
</text>
- <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
- <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/>
+ <check_box initial_value="true" label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
+ <slider label="Mémoire textures (Mo) :" name="GraphicsCardTextureMemory" tool_tip="Quantité de mémoire à affecter aux textures. Utilise la mémoire de la carte vidéo par défaut. Si vous réduisez ce paramètre, cela peut améliorer les performances, mais les textures risquent d&apos;être floues."/>
<spinner label="Indice du brouillard :" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_help_browser.xml b/indra/newview/skins/default/xui/fr/floater_help_browser.xml
new file mode 100644
index 0000000000..11caca640c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="NAVIGATEUR D&apos;AIDE">
+ <floater.string name="loading_text">
+ Chargement…
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_hud.xml b/indra/newview/skins/default/xui/fr/floater_hud.xml
index 55c8b57ae2..f212f113b3 100644
--- a/indra/newview/skins/default/xui/fr/floater_hud.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hud.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="Didacticiel" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="DIDACTICIEL"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_im.xml b/indra/newview/skins/default/xui/fr/floater_im.xml
index a116c43f3f..0e4039d3af 100644
--- a/indra/newview/skins/default/xui/fr/floater_im.xml
+++ b/indra/newview/skins/default/xui/fr/floater_im.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Message instantané">
<text name="only_user_message">
Vous êtes le seul participant à cette session.
diff --git a/indra/newview/skins/default/xui/fr/floater_im_container.xml b/indra/newview/skins/default/xui/fr/floater_im_container.xml
new file mode 100644
index 0000000000..5ea073365e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="CONVERSATIONS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml
new file mode 100644
index 0000000000..c3df4a869c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Panneau de contrôle IM" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="À" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
index f12c1fee44..a28e0bd7d5 100644
--- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
@@ -9,17 +9,17 @@
<text name="preview_label">
Prévisualiser comme :
</text>
- <combo_box label="Habits" name="clothing_type_combo" left="126" >
- <combo_box.item name="Image" label="Image" />
- <combo_box.item name="Hair" label="Cheveux" />
- <combo_box.item name="FemaleHead" label="Tête de femme" />
- <combo_box.item name="FemaleUpperBody" label="Corps de femme (haut)" />
- <combo_box.item name="FemaleLowerBody" label="Corps de femme (bas)" />
- <combo_box.item name="MaleHead" label="Tête d&apos;homme" />
- <combo_box.item name="MaleUpperBody" label="Corps d&apos;homme (haut)" />
- <combo_box.item name="MaleLowerBody" label="Corps d&apos;homme (bas)" />
- <combo_box.item name="Skirt" label="Jupe" />
- <combo_box.item name="SculptedPrim" label="Sculptie" />
+ <combo_box label="Habits" left="126" name="clothing_type_combo">
+ <combo_box.item label="Image" name="Image"/>
+ <combo_box.item label="Cheveux" name="Hair"/>
+ <combo_box.item label="Tête de femme" name="FemaleHead"/>
+ <combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/>
+ <combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/>
+ <combo_box.item label="Tête d&apos;homme" name="MaleHead"/>
+ <combo_box.item label="Corps d&apos;homme (haut)" name="MaleUpperBody"/>
+ <combo_box.item label="Corps d&apos;homme (bas)" name="MaleLowerBody"/>
+ <combo_box.item label="Jupe" name="Skirt"/>
+ <combo_box.item label="Sculptie" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Impossible de lire l&apos;image.
diff --git a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml
new file mode 100644
index 0000000000..110c61aedc
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="APPEL D&apos;UN(E)INCONNU(E)">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Chat vocal près de vous
+ </floater.string>
+ <floater.string name="anonymous">
+ anonyme
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ appelle.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ a rejoint un chat vocal avec conférence.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ a rejoint un chat vocal avec le groupe [GROUP].
+ </floater.string>
+ <text name="question">
+ Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ?
+ </text>
+ <button label="Accepter" label_selected="Accepter" name="Accept"/>
+ <button label="Refuser" label_selected="Refuser" name="Reject"/>
+ <button label="Lancer IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inspect.xml b/indra/newview/skins/default/xui/fr/floater_inspect.xml
index f140c66de0..9b1bdf106d 100644
--- a/indra/newview/skins/default/xui/fr/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inspect.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="inspect" title="Inspecter les objets">
- <scroll_list name="object_list"
- tool_tip="Sélectionner un objet de la liste pour le mettre en surbrillance dans le Monde.">
- <column label="Nom" name="object_name" />
- <column label="Propriétaire" name="owner_name" />
- <column label="Créateur" name="creator_name" />
- <column label="Date de création" name="creation_date" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="INSPECTER LES OBJETS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="Sélectionner un objet de la liste pour le mettre en surbrillance dans le Monde.">
+ <scroll_list.columns label="Nom" name="object_name"/>
+ <scroll_list.columns label="Propriétaire" name="owner_name"/>
+ <scroll_list.columns label="Créateur" name="creator_name"/>
+ <scroll_list.columns label="Date de création" name="creation_date" width="114"/>
</scroll_list>
- <button label="Voir le profil du propriétaire..." name="button owner" width="172"
- tool_tip="Voir le profil du propriétaire de l&apos;objet en surbrillance" />
- <button label="Voir le profil du créateur..." name="button creator" left="192" width="172"
- tool_tip="Voir le profil du créateur de l&apos;objet en surbrillance" />
+ <button label="Voir le profil du propriétaire..." name="button owner" tool_tip="Voir le profil du propriétaire de l&apos;objet en surbrillance" width="172"/>
+ <button label="Voir le profil du créateur..." left="192" name="button creator" tool_tip="Voir le profil du créateur de l&apos;objet en surbrillance" width="172"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory.xml b/indra/newview/skins/default/xui/fr/floater_inventory.xml
index 7173025d18..200c07e522 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory.xml
@@ -1,55 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Inventaire">
- <search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Tous les objets" name="All Items"/>
- <inventory_panel label="Objets récents" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Fichier" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Ouvrir" name="Open"/>
- <menu_item_call label="Nouvelle fenêtre" name="New Window"/>
- <menu_item_call label="Afficher les filtres" name="Show Filters"/>
- <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
- <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
- <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
- </menu>
- <menu label="Créer" name="Create">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Nouveau dossier" name="New Folder"/>
- <menu_item_call label="Nouveau script" name="New Script"/>
- <menu_item_call label="Nouvelle note" name="New Note"/>
- <menu_item_call label="Nouveau geste" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
- <menu_item_call label="Nouveau pantalon" name="New Pants"/>
- <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
- <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
- <menu_item_call label="Nouvelle veste" name="New Jacket"/>
- <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
- <menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveaux sous-vêtements (haut)" name="New Undershirt"/>
- <menu_item_call label="Nouveaux sous-vêtements (bas)" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
- <menu_item_call label="Nouvelle peau" name="New Skin"/>
- <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
- <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Trier" name="Sort">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_check label="Par nom" name="By Name"/>
- <menu_item_check label="Par date" name="By Date"/>
- <menu_item_check label="Trier les dossiers par nom" name="Folders Always By Name"/>
- <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
- </menu>
- <menu label="Filters" name="Filters">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_check label="Modifier actuel" name="Modify Current"/>
- <menu_item_call label="Réinitialiser actuel" name="Reset Current"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="MON INVENTAIRE">
+ <floater.string name="Title">
+ MON INVENTAIRE
+ </floater.string>
+ <floater.string name="TitleFetching">
+ MON INVENTAIRE (récupération de [ITEM_COUNT] articles en cours) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ MON INVENTAIRE ([ITEM_COUNT] articles) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Récupéré
+ </floater.string>
+ <panel label="Panneau Inventaire" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index ec83d5bcaa..fca1a329a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="Propriétés de l&apos;objet de l&apos;inventaire">
+<floater name="item properties" title="PROPRIÉTÉS DES ARTICLES DE L&apos;INVENTAIRE">
+ <floater.string name="unknown">
+ (inconnu)
+ </floater.string>
+ <floater.string name="public">
+ (public)
+ </floater.string>
+ <floater.string name="you_can">
+ Vous pouvez :
+ </floater.string>
+ <floater.string name="owner_can">
+ Le propriétaire peut :
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nom :
</text>
@@ -27,55 +42,32 @@
Wed May 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Vous pouvez :
+ Vous :
</text>
- <check_box label="Modifier" name="CheckOwnerModify"/>
+ <check_box label="Éditer" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
- <check_box label="Revendre/Donner" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B :
- </text>
- <text name="OwnerMaskDebug">
- O :
- </text>
- <text name="GroupMaskDebug">
- G :
+ <check_box label="Revendre" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel" width="80">
+ N&apos;importe qui :
</text>
- <text name="EveryoneMaskDebug">
- E :
+ <check_box label="Copier" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel" width="80">
+ Groupe :
</text>
- <text name="NextMaskDebug">
- N :
- </text>
- <check_box label="Partager avec le groupe" name="CheckShareWithGroup"/>
- <check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy"/>
+ <check_box label="Partager" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="192">
- Le prochain propriétaire pourra :
+ Le prochain propriétaire :
</text>
- <check_box label="Modifier" name="CheckNextOwnerModify"/>
+ <check_box label="Éditer" name="CheckNextOwnerModify"/>
<check_box label="Copier" name="CheckNextOwnerCopy"/>
- <check_box label="Revendre/Donner" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Marquer l&apos;objet :
- </text>
+ <check_box label="Revendre" name="CheckNextOwnerTransfer"/>
<check_box label="À vendre" name="CheckPurchase"/>
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Copie" />
- </radio_group>
- <text name="TextPrice">
- Prix : L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copier" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Prix :" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (inconnu)
- </string>
- <string name="public">
- (public)
- </string>
- <string name="you_can">
- Vous pouvez :
- </string>
- <string name="owner_can">
- Le propriétaire peut :
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 634bb6e2e9..6cd886d4b9 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="inventory_recent_items">
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
<check_box label="Animations" name="check_animation"/>
<check_box label="Cartes de visite" name="check_calling_card"/>
<check_box label="Habits" name="check_clothing"/>
@@ -12,13 +12,13 @@
<check_box label="Textures" name="check_texture"/>
<check_box label="Photos" name="check_snapshot"/>
<button label="Tout" label_selected="Tout" name="All" width="70"/>
- <button label="Aucun" label_selected="Aucun" name="None" width="70" bottom_delta="0" left="83"/>
- <check_box label="Toujours montrer &#10;les dossiers" name="check_show_empty" bottom_delta="-20"/>
- <check_box label="Depuis la déconnexion" name="check_since_logoff" bottom_delta="-36"/>
+ <button bottom_delta="0" label="Aucun" label_selected="Aucun" left="83" name="None" width="70"/>
+ <check_box bottom_delta="-20" label="Toujours montrer les dossiers" name="check_show_empty"/>
+ <check_box bottom_delta="-36" label="Depuis la déconnexion" name="check_since_logoff"/>
<text name="- OR -">
Ou il y a...
</text>
<spinner label="Heures" name="spin_hours_ago"/>
<spinner label="Jours" name="spin_days_ago"/>
- <button label="Fermer" label_selected="Fermer" name="Close" bottom_delta="-30"/>
+ <button bottom_delta="-30" label="Fermer" label_selected="Fermer" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml
index 75800847d7..e00f9564e8 100644
--- a/indra/newview/skins/default/xui/fr/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Configuration du joystick">
- <check_box name="enable_joystick" label="Activer :"/>
- <spinner label="Mapping axe des X " name="JoystickAxis1"/>
- <spinner label="Mapping axe des Y" name="JoystickAxis2"/>
- <spinner label="Mapping axe des Z" name="JoystickAxis0"/>
- <spinner label="Mapping du tangage" label_width="111" left="8" name="JoystickAxis4" width="152"/>
- <spinner label="Mapping du lacet" name="JoystickAxis5"/>
- <spinner label="Mapping du roulis" name="JoystickAxis3"/>
- <spinner label="Mapping du zoom" name="JoystickAxis6"/>
+<floater name="Joystick" title="CONFIGURATION DU JOYSTICK">
+ <check_box label="Activer :" name="enable_joystick"/>
+ <spinner label="Mapping axe des X " name="JoystickAxis1" left="20" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Y" name="JoystickAxis2" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Z" name="JoystickAxis0" width="154" label_width="130"/>
+ <spinner label="Mapping du tangage" label_width="136" left="20" name="JoystickAxis4" width="154"/>
+ <spinner label="Mapping du lacet" name="JoystickAxis5" width="154" label_width="130"/>
+ <spinner label="Mapping du roulis" name="JoystickAxis3" width="154" label_width="130"/>
+ <spinner label="Mapping du zoom" name="JoystickAxis6" left="20" width="154" label_width="130"/>
<check_box label="Zoom direct" name="ZoomDirect"/>
- <check_box label="Curseur 3D" name="Cursor3D"/>
- <check_box label="Niveau automatique" name="AutoLeveling"/>
+ <check_box label="Curseur 3D" name="Cursor3D" left="300"/>
+ <check_box label="Niveau automatique" name="AutoLeveling" left="400"/>
<text name="Control Modes:">
Modes de contrôle :
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" label="Build"/>
- <check_box name="JoystickFlycamEnabled" label="Flycam"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Build" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
Échelle des X
</text>
@@ -44,13 +44,13 @@
<text name="ZDeadZone">
Zone neutre Z
</text>
- <text left="4" name="PitchDeadZone" width="110">
- Zone neutre Tangage
+ <text left="4" name="PitchDeadZone" width="116">
+ Zone neutre tangage
</text>
- <text name="YawDeadZone">
+ <text name="YawDeadZone" left="10" width="104">
Zone neutre lacet
</text>
- <text name="RollDeadZone">
+ <text name="RollDeadZone" left="10" width="104">
Zone neutre roulis
</text>
<text name="Feathering">
@@ -59,7 +59,7 @@
<text name="ZoomScale2">
Échelle du zoom
</text>
- <text left="6" name="ZoomDeadZone" width="110">
+ <text left="6" name="ZoomDeadZone" width="120">
Zone neutre du zoom
</text>
<button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
index 54069c9c49..20dffbbbc8 100644
--- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
@@ -1,152 +1,151 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Mesure du lag">
- <button name="client_lagmeter" tool_tip="Statut du lag client"/>
- <text name="client">
- Client :
- </text>
- <text name="client_text">
- Normal
- </text>
- <button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
- <text name="network">
- Réseau :
- </text>
- <text name="network_text">
- Normal
- </text>
- <button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
- <text name="server">
- Serveur :
- </text>
- <text name="server_text">
- Normal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="MESURE DU LAG">
+ <floater.string name="max_title_msg">
Mesure du lag
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Client
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, fenêtre en arrière-plan
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Taux de défilement client ci-dessous [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Taux de défilement client entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Cause possible : la limite d&apos;affichage est trop élevée
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Cause possible : images en cours de chargement
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Cause possible : trop d&apos;images en mémoire
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Cause possible : trop d&apos;objets complexes dans la scène
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Réseau
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Temps de connexion ping supérieur à [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Temps de connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Mauvaise connexion possible ou réglage de la bande passante trop élevé.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Mauvaise connexion possible ou app. de partage des fichiers
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Serveur
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Taux de défilement du simulateur au dessous de [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Taux de défilement du simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Cause possible : trop d&apos;objets physiques
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Cause possible : trop d&apos;objets scriptés
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Cause possible : trop de trafic réseau
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Cause possible : trop de personnes en mouvement dans la région
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Cause possible : trop de calculs d&apos;images
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Cause possible : charge simulateur trop lourde
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Statut du lag client"/>
+ <text name="client">
+ Client
+ </text>
+ <text name="client_text">
+ Normal
+ </text>
+ <button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
+ <text name="network">
+ Réseau
+ </text>
+ <text name="network_text">
+ Normal
+ </text>
+ <button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
+ <text name="server">
+ Serveur
+ </text>
+ <text name="server_text">
+ Normal
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Activer/désactiver la taille du floater"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
index 9c4f4ee966..10fe132623 100644
--- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Mes terrains">
+<floater name="land holdings floater" title="MES TERRAINS">
<scroll_list name="parcel list">
- <column label="Nom de la parcelle" name="name"/>
+ <column label="Parcelle" name="name"/>
<column label="Région" name="location"/>
<column label="Type" name="type"/>
<column label="Surface" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/>
- <button label="Voir sur la carte" label_selected="Voir sur la carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/>
+ <button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Afficher ce terrain sur la carte du monde"/>
<text name="contrib_label">
Vos contributions :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
index e2e2a9af9a..52b1a16bbc 100644
--- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="Script : Nouveau script">
- <button label="Réinitialiser" label_selected="Réinitialiser" name="Reset" width="100" left="390"/>
- <check_box label="Exécution en cours" name="running" left="4"/>
- <check_box label="Mono" name="mono" left="130"/>
- <string name="not_allowed">
- Vous n&apos;êtes pas autorisé à afficher ce script.
- </string>
- <string name="script_running">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT">
+ <floater.string name="not_allowed">
+ Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
+ </floater.string>
+ <floater.string name="script_running">
Exécution en cours
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ SCRIPT : [NAME]
+ </floater.string>
+ <button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/>
+ <check_box initial_value="true" label="Exécution en cours" left="4" name="running"/>
+ <check_box initial_value="true" label="Mono" left_delta="160" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
index 5dc0fa76a3..71d2c42578 100644
--- a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
@@ -1,7 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="Wiki LSL">
- <check_box label="Suivre le curseur" name="lock_check" />
- <combo_box label="Verrouiller" name="history_combo" left_delta="120" width="70"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="RÉFÉRENCE LSL">
+
+ <check_box label="Suivre le curseur" name="lock_check" width="90" />
+ <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="82"/>
<button label="Précédente" name="back_btn" left_delta="75"/>
- <button label="Suivante" name="fwd_btn" />
+ <button label="Suivante" name="fwd_btn" width="60"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index ec4bd4ef4a..e01b687fce 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="Mini-carte">
<floater.string name="mini_map_north">
N
</floater.string>
@@ -24,6 +24,9 @@
<floater.string name="mini_map_northwest">
NO
</floater.string>
+ <floater.string name="ToolTipMsg">
+ [AGENT][REGION](Double-cliquez pour ouvrir la carte)
+ </floater.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index e75b45c43a..58535eddf5 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Navigateur">
+<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS">
+ <floater.string name="home_page_url">
+ http://fr.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://fr.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Précédente" name="back" width="75"/>
@@ -8,8 +14,13 @@
<combo_box left_delta="75" name="address" width="510"/>
<button label="OK" left_delta="515" name="go"/>
</layout_panel>
+ <layout_panel name="time_controls">
+ <button label="en arrière" name="rewind" width="60"/>
+ <button label="stop" name="stop"/>
+ <button label="en avant" name="seek" width="60"/>
+ </layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Envoyer l&apos;URL sur la parcelle" name="assign"/>
+ <button label="Envoyer la page actuelle à la parcelle" name="assign" width="220"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_settings.xml b/indra/newview/skins/default/xui/fr/floater_media_settings.xml
new file mode 100644
index 0000000000..27db5ea995
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="PARAMÈTRES DES MÉDIAS">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+ <button label="Appliquer" label_selected="Appliquer" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
index 8ee3a23b95..d03c4d7544 100644
--- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="Simulation fuite mémoire">
- <spinner label="Vitesse de la fuite (octets) :" name="leak_speed" />
- <spinner label="Max mémoire perdue (Mo) :" name="max_leak" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SIMULER UNE FUITE DE MÉMOIRE">
+ <spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/>
+ <spinner label="Max mémoire perdue (Mo) :" name="max_leak"/>
<text name="total_leaked_label">
Mémoire perdue actuelle : [SIZE] Ko
</text>
@@ -12,7 +12,7 @@
[NOTE2]
</text>
<button label="Commencer" name="start_btn" width="85"/>
- <button label="Stop" name="stop_btn" left="100"/>
- <button label="Libérer" name="release_btn" left="177"/>
- <button label="Fermer" name="close_btn" />
+ <button label="Stop" name="stop_btn"/>
+ <button label="Libérer" name="release_btn"/>
+ <button label="Fermer" name="close_btn" left_pad="20"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index e59f09cba1..0e8887bb96 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,14 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Sauter ou voler vers le haut"/>
- <button label="" label_selected="" name="move down btn" tool_tip="S&apos;accroupir ou voler vers le bas"/>
- <button label="Voler" label_selected="Voler" name="fly btn" tool_tip="Démarrer/arrêter le vol"/>
- <joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche"/>
- <joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite"/>
- <joystick_turn name="forward btn" tool_tip="Se déplacer vers l&apos;avant"/>
- <joystick_turn name="backward btn" tool_tip="Se déplacer vers l&apos;arrière"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Marcher en avant (appuyer sur la flèche vers le haut ou W)
+ </string>
+ <string name="walk_back_tooltip">
+ Marcher en arrière (appuyer sur la flèche vers le bas ou S)
+ </string>
+ <string name="run_forward_tooltip">
+ Courir vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
+ </string>
+ <string name="run_back_tooltip">
+ Courir en arrière (appuyer sur la flèche vers le bas ou S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Voler vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
+ </string>
+ <string name="fly_back_tooltip">
+ Voler vers l&apos;arrière (appuyer sur la flèche vers le bas ou S)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut, appuyer sur E"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas, appuyer sur C"/>
+ <joystick_turn name="forward btn" tool_tip="Marcher en avant (appuyer sur la flèche vers le haut ou W)"/>
+ <joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
+ <button label="" name="mode_run_btn" tool_tip="Mode course"/>
+ <button label="" name="mode_fly_btn" tool_tip="Mode vol"/>
+ <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_mute_object.xml b/indra/newview/skins/default/xui/fr/floater_mute_object.xml
index 23d351f32d..f4db3201a8 100644
--- a/indra/newview/skins/default/xui/fr/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mute_object.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="Ignorer les objets par nom">
+<floater name="mute by name" title="IGNORER L&apos;OBJET PAR NOM">
<text name="message">
- Cette fonction ne marche que pour les chats et les IM,
-pas les sons. Saisissez le nom exact de l&apos;objet.
+ Ignorer un objet :
</text>
<line_editor name="object_name">
Nom de l&apos;objet
</line_editor>
+ <text name="note">
+ * Ignore uniquement le texte de l&apos;objet, pas les sons
+ </text>
<button label="OK" name="OK"/>
<button label="Annuler" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_friends.xml b/indra/newview/skins/default/xui/fr/floater_my_friends.xml
index 911647d8be..db7c026e22 100644
--- a/indra/newview/skins/default/xui/fr/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/fr/floater_my_friends.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_my_friends" title="Contacts">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_friends" title="CONTACTS">
<tab_container name="friends_and_groups">
- <panel label="Amis" name="friends_panel" />
- <panel label="Groupes" name="groups_panel" />
+ <panel label="Amis" name="friends_panel"/>
+ <panel label="Groupes" name="groups_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
new file mode 100644
index 0000000000..72775169cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT PRÈS DE VOUS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_notification.xml b/indra/newview/skins/default/xui/fr/floater_notification.xml
index 7ca2dc3a64..fe4b5f9bd6 100644
--- a/indra/newview/skins/default/xui/fr/floater_notification.xml
+++ b/indra/newview/skins/default/xui/fr/floater_notification.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notification" title="Console de notifications">
+<floater name="notification" title="CONSOLE DE NOTIFICATIONS">
<text_editor name="payload">
- Chargement..
+ Chargement...
</text_editor>
<combo_box label="Réponse" name="response"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_notifications_console.xml b/indra/newview/skins/default/xui/fr/floater_notifications_console.xml
index 7262fe8fe2..e040e948f5 100644
--- a/indra/newview/skins/default/xui/fr/floater_notifications_console.xml
+++ b/indra/newview/skins/default/xui/fr/floater_notifications_console.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notifications_console" title="Console de notifications">
+<floater name="notifications_console" title="CONSOLE DE NOTIFICATIONS">
<combo_box label="Sélectionner le type de notification" name="notification_types" width="412"/>
- <button label="Ajouter" name="add_notification" left="417" width="78"/>
+ <button label="Ajouter" left="417" name="add_notification" width="78"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_openobject.xml b/indra/newview/skins/default/xui/fr/floater_openobject.xml
index 3761200d48..4e046ff3f3 100644
--- a/indra/newview/skins/default/xui/fr/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/fr/floater_openobject.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="objectcontents" title="Contenu des objets">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="CONTENU DES OBJETS">
<text name="object_name">
[DESC]:
</text>
- <button label="Copier vers l&apos;inventaire" label_selected="Copier vers l&apos;inventaire" name="copy_to_inventory_button" width="132" />
- <button label="Copier et porter" label_selected="Copier et porter" name="copy_and_wear_button" left="152"/>
+ <button label="Copier vers l&apos;inventaire" label_selected="Copier vers l&apos;inventaire" name="copy_to_inventory_button" width="132"/>
+ <button label="Copier et porter" label_selected="Copier et porter" left="152" name="copy_and_wear_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..d77dfbdf82
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Enregistrer la tenue">
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+ <text name="Save item as:">
+ Enregistrer ce que je porte
+comme une nouvelle tenue :
+ </text>
+ <line_editor name="name ed">
+ [DESC] (nouv.)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
new file mode 100644
index 0000000000..2420c2b04b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="APPEL EN COURS">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Chat vocal près de vous
+ </floater.string>
+ <floater.string name="anonymous">
+ anonyme
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ appelle.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ a rejoint un chat vocal avec conférence.
+ </floater.string>
+ <text name="connecting">
+ Connexion à [CALLEE_NAME] en cours
+ </text>
+ <text name="calling">
+ En train d&apos;appeler [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Pas de réponse. Veuillez réessayer ultérieurement.
+ </text>
+ <text name="nearby">
+ Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ [VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Vous avez mis fin à l&apos;appel. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ En train de quitter [CURRENT_CHAT].
+ </text>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml
index b66ea79e7b..30e510efb5 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,22 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <button label="Payer" label_selected="Payer" name="pay btn"/>
- <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
- <text name="payee_label" left="5">
+ <string name="payee_group">
+ Payer le groupe
+ </string>
+ <string name="payee_resident">
+ Payer le résident
+ </string>
+ <text left="5" name="payee_label">
Payer :
</text>
+ <icon name="icon_person" tool_tip="Résident"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text" width="100" halign="left">
- Paiement rapide :
- </text>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text left="4" name="amount text">
- Montant :
+ Ou choisissez un montant :
</text>
<line_editor left="60" name="amount" width="55"/>
+ <button label="Payer" label_selected="Payer" name="pay btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index 077e6965b6..9cac739ab0 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -1,31 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="95">
- Payer le groupe :
- </text>
- <text name="payee_resident" width="100" halign="left" >
- Payer le résident :
- </text>
- <text name="payee_name" left="105">
+ <string name="payee_group" width="95">
+ Payer le groupe
+ </string>
+ <string halign="left" name="payee_resident" width="100">
+ Payer le résident
+ </string>
+ <icon name="icon_person" tool_tip="Résident"/>
+ <text left="105" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="25">
+ <text left="25" name="object_name_label">
Via un objet :
</text>
- <text name="object_name_text" left="105">
+ <icon name="icon_object" tool_tip="Objets"/>
+ <text left="105" name="object_name_text">
...
</text>
- <text name="fastpay text" width="95">
- Paiement rapide :
- </text>
- <text name="amount text" left="5" halign="left">
- Montant :
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+ <text halign="left" left="5" name="amount text">
+ Ou choisissez un montant :
</text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="105" />
- <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="190"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="105" />
- <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="190"/>
+ <line_editor left="65" name="amount" width="50"/>
<button label="Payer" label_selected="Payer" name="pay btn"/>
<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
- <line_editor left="65" name="amount" width="50" />
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
index 9ea970d89d..f83000cf87 100644
--- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Droits par défaut">
+<floater name="perm prefs" title="PERMISSIONS DE CHARGEMENT PAR DÉFAUT">
<panel label="Droits" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Partager avec le groupe" name="share_with_group"/>
<check_box label="Autoriser tout le monde à copier" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" width="260">
Le prochain propriétaire pourra :
</text>
<check_box label="Modifier" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_post_process.xml b/indra/newview/skins/default/xui/fr/floater_post_process.xml
index 52afb340a6..a22c7512e5 100644
--- a/indra/newview/skins/default/xui/fr/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/fr/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Post-Process Floater" title="Paramètres post-traitement">
+<floater name="Post-Process Floater" title="PARAMÈTRES POST-TRAITEMENT">
<tab_container name="Post-Process Tabs">
<panel label="Filtre couleur" name="wmiColorFilterPanel">
<check_box label="Activer" name="wmiColorFilterToggle" />
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index ab21d7423a..489b90eeba 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -1,40 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Postcard" title="Envoyer la photo par e-mail">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
<text name="to_label" width="135">
E-mail du destinataire :
</text>
- <line_editor name="to_form" left="143" width="127" />
+ <line_editor left="143" name="to_form" width="130" left_delta="146"/>
<text name="from_label">
Votre e-mail :
</text>
- <line_editor name="from_form" left="143" width="127" />
+ <line_editor left="143" name="from_form" width="130" left_delta="146"/>
<text name="name_label">
Votre nom :
</text>
- <line_editor name="name_form" left="143" width="127" />
+ <line_editor left="143" name="name_form" width="130" left_delta="146"/>
<text name="subject_label">
Sujet :
</text>
- <line_editor name="subject_form" left="143" width="127" />
- <line_editor label="Saisissez votre sujet ici." name="subject_form" />
+ <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
+ <line_editor label="Saisissez votre sujet ici." name="subject_form"/>
<text name="msg_label">
Message :
</text>
- <check_box label="Publier sur le web" name="allow_publish_check"
- tool_tip="Publiez cette carte postale sur le web." />
- <check_box label="Contenu adulte" name="mature_check"
- tool_tip="Cette carte postale est à caractère adulte." />
- <button label="?" name="publish_help_btn" />
+ <check_box label="Publier sur le web" name="allow_publish_check" tool_tip="Publiez cette carte postale sur le web."/>
+ <check_box label="Contenu adulte" name="mature_check" tool_tip="Cette carte postale est à caractère adulte."/>
+ <button label="?" name="publish_help_btn"/>
<text_editor name="msg_form">
Saisissez votre message ici.
</text_editor>
<text name="fine_print">
Si le destinataire s&apos;inscrit sur [SECOND_LIFE], vous recevrez un bonus.
</text>
- <button label="Annuler" name="cancel_btn" />
- <button label="Envoyer" name="send_btn" />
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
<string name="default_subject">
- Carte postale de [SECOND_LIFE]
+ Carte postale de [SECOND_LIFE].
</string>
<string name="default_message">
Ouvrez-moi !
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml
index 9dab4d642c..406e91a18a 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml
@@ -1,9 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Preferences" title="Préférences" min_width="330" width="626">
- <button label="À propos" label_selected="À propos" name="About..." />
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
- <button label="Appliquer" label_selected="Appliquer" name="Apply" />
- <button label="Aide" label_selected="Aide" name="Help" />
- <tab_container name="pref core" tab_width="126" width="626" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="330" name="Preferences" title="PRÉFÉRENCES" width="626">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+ <tab_container name="pref core" tab_width="126" width="626">
+ <panel label="Général" name="general"/>
+ <panel label="Graphiques" name="display"/>
+ <panel label="Confidentialité" name="im"/>
+ <panel label="Son et Média" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Notifications" name="msgs"/>
+ <panel label="Configuration" name="input"/>
+ <panel label="Avancées" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index 813e611621..b14aecafbb 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animation : [NAME]
+ </floater.string>
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans le Monde" label_selected="Stop" name="Anim play btn"
- tool_tip="Jouer cette animation et partagez-la avec d&apos;autres." width="131" left="20"/>
- <button label="Jouer localement" label_selected="Stop" name="Anim audition btn"
- tool_tip="Jouer cette animation et soyez le seul à la voir." width="125" left="162"/>
+ <button label="Jouer dans Second Life" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
+ <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
index 1b6f26150d..23f86d88b9 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="Informations sur la petite annonce" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="INFOS SUR LA PETITE ANNONCE">
+ <floater.string name="Title">
+ Petite annonce : [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml
index e7fc2aa8dd..7590c43af1 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_event.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="Informations sur l&apos;événement" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="INFORMATIONS SUR LES ÉVÉNEMENTS">
+ <floater.string name="Title">
+ Événement : [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
index b2c3d18cbd..7133f8754c 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
@@ -1,62 +1,69 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animation à jouer :
+ </floater.string>
+ <floater.string name="step_sound">
+ Son à lire :
+ </floater.string>
+ <floater.string name="step_chat">
+ Chatter pour dire :
+ </floater.string>
+ <floater.string name="step_wait">
+ Attendre :
+ </floater.string>
+ <floater.string name="stop_txt">
Stop
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Prévisualiser
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Aucune --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Geste : [NAME]
+ </floater.string>
+ <text name="name_text">
+ Nom :
+ </text>
<text name="desc_label">
Description :
</text>
<text name="trigger_label">
Déclencheur :
</text>
- <text name="replace_text"
- tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste.">
+ <text name="replace_text" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste.">
Remplacer par :
</text>
- <line_editor left="310" name="replace_editor"
- tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste"
- width="120" />
+ <line_editor left="310" name="replace_editor" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste" width="120"/>
<text name="key_label">
Raccourci :
</text>
- <combo_box label="Aucun" name="modifier_combo" width="55" />
- <combo_box label="Aucun" name="key_combo" width="55" />
+ <combo_box label="Aucun" name="modifier_combo" width="55"/>
+ <combo_box label="Aucun" name="key_combo" width="55"/>
<text name="library_label">
Bibliothèque :
</text>
+ <scroll_list name="library_list"/>
+ <button label="Ajouter &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Étapes :
</text>
- <scroll_list name="library_list">
- Animation
-Son
-Chat
-Attendre
- </scroll_list>
- <button label="Ajouter &gt;&gt;" name="add_btn" />
- <button label="Monter" name="up_btn" />
- <button label="Descendre" name="down_btn" />
- <button label="Supprimer" name="delete_btn" />
- <text name="help_label">
- Toutes les étapes ont lieu
-simultanément, sauf si vous
-ajoutez des pauses.
- </text>
+ <button label="Vers le haut" name="up_btn"/>
+ <button label="Vers le bas" name="down_btn"/>
+ <button label="Supprimer" name="delete_btn"/>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Commencer" />
- <radio_item name="stop" label="Stop" />
+ <radio_item label="Lancer" name="start"/>
+ <radio_item label="Arrêter" name="stop"/>
</radio_group>
- <check_box label="jusqu&apos;à la fin des animations" name="wait_anim_check" />
- <check_box label="temps en secondes" name="wait_time_check" />
- <line_editor left_delta="130" name="wait_time_editor" />
- <check_box label="Actifs" name="active_check"
- tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu&apos;il y a un conflit entre les raccourcis." />
- <button label="Prévisualiser" name="preview_btn" width="86" />
- <button label="Enregistrer" name="save_btn" width="86" left_delta="96"/>
+ <check_box label="jusqu&apos;à la fin des animations" name="wait_anim_check"/>
+ <check_box label="temps en secondes" name="wait_time_check"/>
+ <line_editor left_delta="130" name="wait_time_editor"/>
+ <text name="help_label">
+ Toutes les étapes ont lieu en même temps si vous n&apos;ajoutez pas d&apos;étapes d&apos;attente.
+ </text>
+ <check_box label="Actifs" name="active_check" tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu&apos;il y a un conflit entre les raccourcis."/>
+ <button label="Prévisualiser" name="preview_btn" width="86"/>
+ <button label="Enregistrer" left_delta="96" name="save_btn" width="86"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..4a91992f6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="RACCOURCI DU GESTE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..d866c32882
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="RACCOURCI DU GESTE">
+ <text name="trigger_label">
+ Chat :
+ </text>
+ <text name="key_label">
+ Clavier :
+ </text>
+ <combo_box label="Aucun" name="modifier_combo" width="62"/>
+ <combo_box label="Aucun" name="key_combo" width="62"/>
+ <text name="replace_text" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé &quot; bonjour &quot; par &quot; salut &quot;, le chat &quot; Je voulais te dire bonjour &quot; devient &quot; Je voulais te dire salut &quot; et le geste correspondant s&apos;affiche.">
+ Remplacer :
+ </text>
+ <line_editor name="replace_editor" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé &quot; bonjour &quot; par &quot; salut &quot;, le chat &quot; Je voulais te dire bonjour &quot; devient &quot; Je voulais te dire salut &quot; et le geste correspondant s&apos;affiche."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..4a91992f6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="RACCOURCI DU GESTE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
index a23b906df6..d6ec915fd1 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview notecard" title="Remarque :">
- <button label="Enregistrer" label_selected="Enregistrer" name="Save" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="NOTE :">
+ <floater.string name="no_object">
+ Impossible de trouver l&apos;objet contenant cette note.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Vous n&apos;avez pas le droit de voir cette note.
+ </floater.string>
+ <floater.string name="Title">
+ Note : [NAME]
+ </floater.string>
+ <floater.string label="Enregistrer" label_selected="Enregistrer" name="Save">
+ Enregistrer
+ </floater.string>
<text name="desc txt">
Description :
</text>
<text_editor name="Notecard Editor">
Chargement...
</text_editor>
- <string name="no_object">
- Impossible de trouver l&apos;objet contenant cette note.
- </string>
- <string name="not_allowed">
- Vous n&apos;êtes pas autorisé à afficher cette note.
- </string>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
index 19ae28c463..a215f92df1 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
@@ -1,12 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Son : [NAME]
+ </floater.string>
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans le Monde" label_selected="Jouer dans le Monde"
- name="Sound play btn"
- tool_tip="Jouer ce son et partagez-le avec d&apos;autres." width="131" left_delta="-142"/>
- <button label="Jouer localement" label_selected="Jouer localement"
- name="Sound audition btn"
- tool_tip="Jouer ce son et soyez le seul à l&apos;entendre." width="125" left="162"/>
+ <button label="Jouer dans Second Life" label_selected="Jouer dans Second Life" left_delta="-142" name="Sound play btn" tool_tip="Lire ce son de façon à ce que les autres puissent l&apos;entendre" width="131"/>
+ <button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Lire ce son de façon à ce que vous soyez la seule personne à pouvoir l&apos;entendre" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
index e5fd5fc78f..dc40d31a79 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
@@ -1,9 +1,47 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Texture : [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copier dans l&apos;inventaire
+ </floater.string>
<text name="desc txt">
Description :
</text>
<text name="dimensions">
- Dimensions : [WIDTH] x [HEIGHT]
+ [WIDTH] px x [HEIGHT] px
</text>
+ <text name="aspect_ratio">
+ Aperçu du rapport hauteur/largeur
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Aperçu avec un rapport hauteur/largeur fixe">
+ <combo_item name="Unconstrained">
+ Sans contraintes
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Logo du groupe ou profil dans le monde physique">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Profil [SECOND_LIFE]">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Petites annonces, repères">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="À propos des terrains">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Favoris du profil">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Jeter" name="Discard"/>
+ <button label="Enregistrer sous" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_region_info.xml b/indra/newview/skins/default/xui/fr/floater_region_info.xml
index d69f212b86..c2663174d4 100644
--- a/indra/newview/skins/default/xui/fr/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/fr/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="Région et domaine"/>
+<floater name="regioninfo" title="RÉGION/DOMAINE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index 687b3068e6..78c35dc303 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Signaler une infraction">
- <texture_picker label="" name="screenshot"/>
- <check_box label="Inclure une capture d&apos;écran" name="screen_check"/>
+<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION">
+ <floater.string name="Screenshot">
+ Capture d&apos;écran
+ </floater.string>
+ <check_box label="Utiliser cette capture d&apos;écran" name="screen_check"/>
<text name="reporter_title" width="60">
- Déposant :
+ Témoin :
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Région :
@@ -21,106 +23,66 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Cliquez sur le bouton puis l&apos;objet :
+ Cliquez sur le bouton puis l&apos;objet responsable :
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
<text name="object_name_label">
- Nom :
+ Objet :
</text>
- <text left_delta="70" name="object_name" width="105">
+ <text left_pad="26" name="object_name" width="105">
Consetetur Sadipscing
</text>
- <text name="owner_name_label" width="66">
+ <text name="owner_name_label" width="100">
Propriétaire :
</text>
- <text left_delta="70" name="owner_name" width="105">
- Hendrerit Vulputate
+ <text left_delta="120" name="owner_name" width="105">
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
- <combo_box.item name="Select_category" label="Sélectionnez une catégorie"
- />
- <combo_box.item name="Age__Age_play" label="Âge &gt; « Age play »"
- />
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Âge &gt; Résident adulte sur Second Life pour adolescents"
- />
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Âge &gt; Resident mineur en dehors de Teen Second Life"
- />
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assaut &gt; Bac à sable utilisé pour des combats/zone non sécurisée"
- />
- <combo_box.item name="Assault__Safe_area" label="Assaut &gt; Zone sécurisée"
- />
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assaut &gt; Bac à sable pour tests d&apos;armes à feu"
- />
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Commerce &gt; Incapacité à fournir un produit ou service"
- />
- <combo_box.item name="Disclosure__Real_world_information" label="Divulgation &gt; Informations sur la vie réelle"
- />
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Divulgation &gt; Écoute d&apos;un chat à distance"
- />
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Divulgation &gt; Informations sur Second Life/chat/IM"
- />
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Trouble de la paix &gt; Utilisation inadéquate des ressources de la région"
- />
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Trouble de la paix &gt; Nombre d&apos;objets scriptés excessif"
- />
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Trouble de la paix &gt; Abandon d&apos;objets"
- />
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Trouble de la paix &gt; Spam à répétition"
- />
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Trouble de la paix &gt; Spam à caractère commercial"
- />
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"
- />
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Terrain"
- />
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Vente pyramidale ou lettre-chaîne"
- />
- <combo_box.item name="Fraud__US$" label="Fraude &gt; US$"
- />
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Harcèlement &gt; Spam visuel"
- />
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Harcèlement &gt; Diffamation envers des individus ou des groupes"
- />
- <combo_box.item name="Harassment__Impeding_movement" label="Harcèlement &gt; Immobilisation"
- />
- <combo_box.item name="Harassment__Sexual_harassment" label="Harcèlement &gt; Harcèlement sexuel"
- />
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Harcèlement &gt; Incitation à enfreindre les Conditions d&apos;utilisation"
- />
- <combo_box.item name="Harassment__Verbal_abuse" label="Harcèlement &gt; Abus verbal"
- />
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indécence &gt; Contenu ou comportement offensifs"
- />
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indécence &gt; Nom d&apos;avatar inapproprié"
- />
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indécence &gt; Contenu ou conduite inappropriés dans une région PG"
- />
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indécence &gt; Contenu ou conduite inappropriés dans une région Mature"
- />
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violation de droits de propriété intellectuelle &gt; Suppression de contenu"
- />
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violation de droits de propriété intellectuelle &gt; CopyBot ou exploitation abusive des droits"
- />
- <combo_box.item name="Intolerance" label="Intolérance"
- />
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terrain &gt; Utilisation abusive des ressources du bac à sable"
- />
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terrain &gt; Empiètement &gt; Objets/textures"
- />
- <combo_box.item name="Land__Encroachment__Particles" label="Terrain &gt; Empiètement &gt; Particules"
- />
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terrain &gt; Empiètement &gt; Arbres/plantes"
- />
- <combo_box.item name="Wagering_gambling" label="Paris/jeux d&apos;argent"
- />
- <combo_box.item name="Other" label="Autre"
- />
+ <combo_box.item label="Sélectionnez une catégorie" name="Select_category"/>
+ <combo_box.item label="Âge &gt; « Age play »" name="Age__Age_play"/>
+ <combo_box.item label="Âge &gt; Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Âge &gt; Résident mineur en dehors de Second Life pour adolescents" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assaut &gt; Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assaut &gt; Zone sécurisée" name="Assault__Safe_area"/>
+ <combo_box.item label="Assaut &gt; Bac à sable pour tests d&apos;armes à feu" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Commerce &gt; Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Divulgation &gt; Informations sur la vie réelle" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Divulgation &gt; Écoute d&apos;un chat à distance" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Divulgation &gt; Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Trouble de la paix &gt; Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Trouble de la paix &gt; Nombre d&apos;objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Trouble de la paix &gt; Abandon d&apos;objets" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Trouble de la paix &gt; Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Trouble de la paix &gt; Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terrain" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Harcèlement &gt; Spam visuel" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Harcèlement &gt; Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Harcèlement &gt; Immobilisation" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Harcèlement &gt; Harcèlement sexuel" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Harcèlement &gt; Incitation à enfreindre les Conditions d&apos;utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Harcèlement &gt; Abus verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indécence &gt; Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indécence &gt; Nom d&apos;avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région modérée" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Violation de droits de propriété intellectuelle &gt; Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Violation de droits de propriété intellectuelle &gt; CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolérance" name="Intolerance"/>
+ <combo_box.item label="Terrain &gt; Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terrain &gt; Empiètement &gt; Objets/textures" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terrain &gt; Empiètement &gt; Particules" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terrain &gt; Empiètement &gt; Arbres/plantes" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Paris/jeux d&apos;argent" name="Wagering_gambling"/>
+ <combo_box.item label="Autre" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nom du contrevenant :
</text>
- <button label="Choisir le résident" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
- <check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name" tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant"/>
+ <button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
<text name="abuser_name_title2">
Indiquez où l&apos;infraction a eu lieu :
</text>
@@ -131,14 +93,11 @@
Détails :
</text>
<text name="bug_aviso">
- Indiquez la date, le lieu, la nature de l&apos;infraction, ainsi que
-tout chat ou IM relatif à l&apos;infraction, en étant aussi précis
-que possible. Pensez à indiquer un objet si possible.
+ Soyez aussi spécifique que possible
</text>
<text bottom_delta="-16" name="incomplete_title">
- Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une
-enquête.
+ * Les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête
</text>
- <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
<button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug.xml b/indra/newview/skins/default/xui/fr/floater_script_debug.xml
index 3664222fd2..e257aac6c4 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater name="script debug floater" title="Erreurs/alertes de scripts">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[All scripts]" />
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]" />
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_limits.xml b/indra/newview/skins/default/xui/fr/floater_script_limits.xml
new file mode 100644
index 0000000000..cc3aaa6653
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="INFORMATIONS SUR LES SCRIPTS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
index b767081625..7b6bc73677 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="Script : Script de rotation">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION">
+ <floater.string name="Title">
+ SCRIPT : [NAME]
+ </floater.string>
<text name="desc txt">
Description :
</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 55487f75db..b9a8165457 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml
@@ -1,4 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="queue" title="Réinitialiser progression">
- <button label="Fermer" label_selected="Fermer" name="close" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RÉINITIALISER LES PROGRÈS">
+ <floater.string name="Starting">
+ Lancement de [START] sur [COUNT] objets.
+ </floater.string>
+ <floater.string name="Done">
+ Fini.
+ </floater.string>
+ <floater.string name="Resetting">
+ Réinitialisation
+ </floater.string>
+ <floater.string name="Running">
+ Exécution en cours
+ </floater.string>
+ <floater.string name="NotRunning">
+ Arrêt
+ </floater.string>
+ <button label="Fermer" label_selected="Fermer" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_search.xml b/indra/newview/skins/default/xui/fr/floater_script_search.xml
index 6f912026c4..09b903f41c 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_search.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script search" title="Recherche de scripts" width="320">
- <check_box label="Non sensible à la casse" name="case_text" left="75"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="RECHERCHE DE SCRIPT" width="320">
+ <check_box label="Non sensible à la casse" left="75" name="case_text"/>
<button label="Rechercher" label_selected="Rechercher" name="search_btn" width="96"/>
- <button label="Remplacer" label_selected="Remplacer" name="replace_btn" left="111" width="96"/>
- <button label="Tout remplacer" label_selected="Tout remplacer" name="replace_all_btn" left="212" width="96"/>
+ <button label="Remplacer" label_selected="Remplacer" left="111" name="replace_btn" width="96"/>
+ <button label="Tout remplacer" label_selected="Tout remplacer" left="212" name="replace_all_btn" width="96"/>
<text name="txt" width="65">
Rechercher
</text>
<text name="txt2" width="65">
Remplacer
</text>
- <line_editor left="75" name="search_text" width="240" />
- <line_editor left="75" name="replace_text" width="240" />
+ <line_editor left="75" name="search_text" width="240"/>
+ <line_editor left="75" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml
new file mode 100644
index 0000000000..672024466a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="RECHERCHER">
+ <floater.string name="loading_text">
+ Chargement...
+ </floater.string>
+ <floater.string name="done_text">
+ Terminé
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Relancer la recherche pour refléter le niveau divin actuel
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_select_key.xml b/indra/newview/skins/default/xui/fr/floater_select_key.xml
index 0dc47df72b..664bc0a723 100644
--- a/indra/newview/skins/default/xui/fr/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/fr/floater_select_key.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
- Appuyer sur une touche pour choisir
+ Appuyez sur une touche pour définir la touche de contrôle de la fonction Parler.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index 643a9435db..d79726e8e2 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -1,66 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="Vendre terrain">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Parcelle :
- </text>
- <text name="info_parcel">
- PARCEL NAME
- </text>
- <text name="info_size_label">
- Taille :
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action" bottom_delta="-60">
- Pour vendre cette
-parcelle :
- </text>
- <icon bottom_delta="-86" name="step_price" />
- <text name="price_label">
- Votre prix de vente :
- </text>
- <text name="price_text">
- Fixez un prix convenable pour ce terrain.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER] L$ par mètre carré)
- </text>
- <text name="sell_to_label">
- Vos acheteurs :
- </text>
- <text name="sell_to_text">
- Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur
-spécifique.
- </text>
- <combo_box name="sell_to" bottom_delta="-32">
- <combo_box.item name="--selectone--" label="Sélectionnez --" />
- <combo_box.item name="Anyone" label="N&apos;importe qui" />
- <combo_box.item name="Specificuser:" label="Acheteur spécifique :" />
- </combo_box>
- <button label="Sélectionner..." name="sell_to_select_agent" width="100"/>
- <text name="sell_objects_label">
- Vendez-vous des objets avec ce terrain ?
- </text>
- <text name="sell_objects_text">
- Les objets transférables se trouvant sur la parcelle changeront
-de propriétaire.
- </text>
- <radio_group name="sell_objects" right="430" bottom_delta="-54">
- <radio_item name="no" label="Non, rester le propriétaire des objets" />
- <radio_item name="yes" label="Oui, vendre les objets avec le terrain" />
- </radio_group>
- <button label="Afficher les objets" name="show_objects" right="420" width="120"/>
- <text name="nag_message_label" bottom_delta="-30">
- Rappel : toute vente est définitive.
- </text>
- <button label="Mettre le terrain en vente" name="sell_btn" width="165"/>
- <button label="Annuler" name="cancel_btn"/>
- </panel>
- </scroll_container>
+<floater name="sell land" title="VENDRE DU TERRAIN">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parcelle :
+ </text>
+ <text name="info_parcel" left="70">
+ NOM DE LA PARCELLE
+ </text>
+ <text name="info_size_label">
+ Taille :
+ </text>
+ <text name="info_size" left="70">
+ [AREA] m²
+ </text>
+ <text bottom_delta="-60" name="info_action">
+ Pour vendre cette parcelle :
+ </text>
+ <text name="price_label">
+ 1. Votre prix de vente :
+ </text>
+ <text name="price_text">
+ Fixez un prix convenable.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ ([PER_METER] L$/m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vos acheteurs :
+ </text>
+ <text name="sell_to_text">
+ Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur spécifique.
+ </text>
+ <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box.item label="- Sélectionnez -" name="--selectone--"/>
+ <combo_box.item label="Tout le monde" name="Anyone"/>
+ <combo_box.item label="Personne spécifique :" name="Specificuser:"/>
+ </combo_box>
+ <button label="Sélectionner" name="sell_to_select_agent" width="100"/>
+ <text name="sell_objects_label">
+ 3. Vendez-vous les objets avec ce terrain ?
+ </text>
+ <text name="sell_objects_text">
+ Les objets transférables se trouvant sur la parcelle changeront de propriétaire.
+ </text>
+ <radio_group bottom_delta="-54" name="sell_objects" right="430">
+ <radio_item label="Non, rester le propriétaire des objets" name="no"/>
+ <radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
+ </radio_group>
+ <button label="Afficher les objets" name="show_objects" right="420" width="120"/>
+ <text bottom_delta="-30" name="nag_message_label">
+ Rappel : Toutes les ventes sont définitives.
+ </text>
+ <button label="Indiquer le terrain à vendre" name="sell_btn" width="165"/>
+ <button label="Annuler" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
index e67b8e2f79..995837e9ee 100644
--- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="settings_debug" title="Paramétrages du mode Debug">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="PARAMÈTRES DE DÉBOGAGE">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE" />
- <combo_box.item name="FALSE" label="FALSE" />
+ <combo_box.item label="VRAI" name="TRUE"/>
+ <combo_box.item label="FAUX" name="FALSE"/>
</combo_box>
- <color_swatch label="Couleur" name="color_swatch" width="43" />
- <spinner label="x" name="val_spinner_1" />
- <spinner label="x" name="val_spinner_2" />
- <spinner label="x" name="val_spinner_3" />
- <spinner label="x" name="val_spinner_4" />
- <button label="Paramètres par défaut" name="default_btn" />
+ <color_swatch label="Couleur" name="val_color_swatch" width="50"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Paramètres par défaut" name="default_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 49c6ff04a6..74738b7e31 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Prévisualiser la photo" width="247">
+<floater name="Snapshot" title="APERÇU DE LA PHOTO" width="247">
<text name="type_label">
Destination de la photo
</text>
<radio_group label="Type de photo" name="snapshot_type_radio" width="228">
- <radio_item name="postcard" label="Envoyer par e-mail" />
- <radio_item name="texture" label="Enregistrer dans votre inventaire ([AMOUNT] L$)" />
- <radio_item name="local" label="Enregistrer sur votre disque dur" />
+ <radio_item label="E-mail" name="postcard"/>
+ <radio_item label="Mon inventaire ([AMOUNT] L$)" name="texture"/>
+ <radio_item label="Enregistrer sur mon ordinateur" name="local"/>
</radio_group>
- <button label="Plus &gt;&gt;" name="more_btn" tool_tip="Options avancées"/>
- <button label="&lt;&lt; Moins" name="less_btn" tool_tip="Options avancées"/>
+ <button label="Plus" name="more_btn" tool_tip="Options avancées"/>
+ <button label="Moins" name="less_btn" tool_tip="Options avancées"/>
<text name="type_label2">
Taille
</text>
@@ -17,62 +17,62 @@
Format
</text>
<combo_box label="Résolution" name="postcard_size_combo">
- <combo_box.item name="640x480" label="640 x 480" />
- <combo_box.item name="800x600" label="800 x 600" />
- <combo_box.item name="1024x768" label="1024 x 768" />
- <combo_box.item name="CurrentWindow" label="Fenêtre actuelle" />
- <combo_box.item name="Custom" label="Personnaliser" />
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1024 x 768" name="1024x768"/>
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="Personnaliser" name="Custom"/>
</combo_box>
<combo_box label="Résolution" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Fenêtre actuelle" />
- <combo_box.item name="Small(128x128)" label="Petite (128 x 128)" />
- <combo_box.item name="Medium(256x256)" label="Moyenne (256 x 256)" />
- <combo_box.item name="Large(512x512)" label="Grande (512 x 512)" />
- <combo_box.item name="Custom" label="Personnaliser" />
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
+ <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
+ <combo_box.item label="Personnaliser" name="Custom"/>
</combo_box>
<combo_box label="Résolution" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Fenêtre actuelle" />
- <combo_box.item name="320x240" label="320 x 240" />
- <combo_box.item name="640x480" label="640 x 480" />
- <combo_box.item name="800x600" label="800 x 600" />
- <combo_box.item name="1024x768" label="1024 x 768" />
- <combo_box.item name="1280x1024" label="1280 x 1024" />
- <combo_box.item name="1600x1200" label="1600 x 1200" />
- <combo_box.item name="Custom" label="Personnaliser" />
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="320 x 240" name="320x240"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1024 x 768" name="1024x768"/>
+ <combo_box.item label="1280 x 1024" name="1280x1024"/>
+ <combo_box.item label="1600 x 1200" name="1600x1200"/>
+ <combo_box.item label="Personnaliser" name="Custom"/>
</combo_box>
<combo_box label="Format" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG" />
- <combo_box.item name="JPEG" label="JPEG" />
- <combo_box.item name="BMP" label="BMP" />
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/>
+ <spinner label="Largeur" label_width="44" name="snapshot_width" width="101"/>
+ <spinner label="Hauteur" label_width="46" left="121" name="snapshot_height" width="101"/>
<slider label="Qualité de l&apos;image" name="image_quality_slider"/>
<text name="layer_type_label">
Capturer :
</text>
<combo_box label="Couches de l&apos;image" name="layer_types">
- <combo_box.item name="Colors" label="Couleurs" />
- <combo_box.item name="Depth" label="Profondeur" />
- <combo_box.item name="ObjectMattes" label="Matte des objets" />
+ <combo_box.item label="Couleurs" name="Colors"/>
+ <combo_box.item label="Profondeur" name="Depth"/>
+ <combo_box.item label="Matte des objets" name="ObjectMattes"/>
</combo_box>
<text name="file_size_label">
- Taille du fichier : [SIZE] Ko
+ [SIZE] Ko
</text>
- <check_box label="Voir l&apos;interface sur la photo" name="ui_check"/>
- <check_box label="Voir les éléments HUD sur la photo" name="hud_check"/>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
<check_box label="Garder ouvert après enregistrement" name="keep_open_check"/>
- <check_box label="Imposer les proportions" name="keep_aspect_check"/>
- <check_box label="Prévisualisation plein écran (geler l&apos;écran)" name="freeze_frame_check"/>
+ <check_box label="Contraindre les proportions" name="keep_aspect_check"/>
+ <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
<button label="Rafraîchir" name="new_snapshot_btn"/>
<check_box label="Rafraîchissement automatique" name="auto_snapshot_check"/>
<button label="Enregistrer ([AMOUNT] L$)" name="upload_btn" width="118"/>
<button label="Envoyer" name="send_btn" width="118"/>
<flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier" width="118">
- <flyout_button.item name="save_item" label="Enregistrer"/>
- <flyout_button.item name="saveas_item" label="Enregistrer sous..."/>
+ <flyout_button.item label="Enregistrer" name="save_item"/>
+ <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
</flyout_button>
- <button label="Annuler" name="discard_btn" left="133" width="72" />
+ <button label="Annuler" left="133" name="discard_btn" width="72"/>
<string name="unknown">
inconnu
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
index 1ab3a4a714..6f0fb3421f 100644
--- a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="sound.wav">
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
Nom :
</text>
@@ -12,9 +12,9 @@
Débit (kbps) :
</text>
<radio_group name="bitrate">
- <radio_item name="32" label="32" />
- <radio_item name="64" label="64" />
- <radio_item name="96" label="96" />
- <radio_item name="128" label="128" />
+ <radio_item label="32" name="32"/>
+ <radio_item label="64" name="64"/>
+ <radio_item label="96" name="96"/>
+ <radio_item label="128" name="128"/>
</radio_group>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_statistics.xml b/indra/newview/skins/default/xui/fr/floater_statistics.xml
index 0768c3ace4..a2e3c199ab 100644
--- a/indra/newview/skins/default/xui/fr/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/fr/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statistiques"/>
+<floater name="stats floater" title="STATISTIQUES"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
new file mode 100644
index 0000000000..3c19bb2608
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTIQUES">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="De base" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bande passante" name="bandwidth"/>
+ <stat_bar label="Perte de paquets" name="packet_loss"/>
+ <stat_bar label="Ping sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avancées" name="advanced">
+ <stat_view label="Rendu" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="Objets totaux" name="objs"/>
+ <stat_bar label="Nouveaux objets" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Nombre" name="numimagesstat"/>
+ <stat_bar label="Nombre brut" name="numrawimagesstat"/>
+ <stat_bar label="Mém GL" name="gltexmemstat"/>
+ <stat_bar label="Mém formatée" name="formattedmemstat"/>
+ <stat_bar label="Mém brute" name="rawmemstat"/>
+ <stat_bar label="Mém liée" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Réseau" name="network">
+ <stat_bar label="Paquets en entrée" name="packetsinstat"/>
+ <stat_bar label="Paquets en sortie" name="packetsoutstat"/>
+ <stat_bar label="Objets" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Actif" name="assetkbitstat"/>
+ <stat_bar label="Couches" name="layerskbitstat"/>
+ <stat_bar label="Arrivés" name="actualinkbitstat"/>
+ <stat_bar label="Sortis" name="actualoutkbitstat"/>
+ <stat_bar label="Ops VFS en attente" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulateur" name="sim">
+ <stat_bar label="Dilatation temporelle" name="simtimedilation"/>
+ <stat_bar label="FPS sim" name="simfps"/>
+ <stat_bar label="Propriétés physiques FPS" name="simphysicsfps"/>
+ <stat_view label="Détails des propriétés physiques" name="physicsdetail">
+ <stat_bar label="Objets fixés" name="physicspinnedtasks"/>
+ <stat_bar label="Objets LOD faibles" name="physicslodtasks"/>
+ <stat_bar label="Mémoire allouée" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Mises à jour avatar/s" name="simagentups"/>
+ <stat_bar label="Avatars principaux" name="simmainagents"/>
+ <stat_bar label="Avatars enfants" name="simchildagents"/>
+ <stat_bar label="Objets" name="simobjects"/>
+ <stat_bar label="Objets actifs" name="simactiveobjects"/>
+ <stat_bar label="Scripts actifs" name="simactivescripts"/>
+ <stat_bar label="Événements de scripts" name="simscripteps"/>
+ <stat_bar label="Paquets en entrée" name="siminpps"/>
+ <stat_bar label="Paquets en sortie" name="simoutpps"/>
+ <stat_bar label="En attente des téléchargements" name="simpendingdownloads"/>
+ <stat_bar label="En attente des chargements" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ <stat_view label="Temps (ms)" name="simperf">
+ <stat_bar label="Durée du cadre totale" name="simframemsec"/>
+ <stat_bar label="Durée nette" name="simnetmsec"/>
+ <stat_bar label="Durée physique" name="simsimphysicsmsec"/>
+ <stat_bar label="Durée de la simulation" name="simsimothermsec"/>
+ <stat_bar label="Durée de l&apos;avatar" name="simagentmsec"/>
+ <stat_bar label="Durée des images" name="simimagesmsec"/>
+ <stat_bar label="Durée du script" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sys_well.xml b/indra/newview/skins/default/xui/fr/floater_sys_well.xml
new file mode 100644
index 0000000000..47b761aed9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification_chiclet" title="NOTIFICATIONS">
+ <string name="title_im_well_window">
+ CONVERSATIONS
+ </string>
+ <string name="title_notification_well_window">
+ NOTIFICATIONS
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_telehub.xml b/indra/newview/skins/default/xui/fr/floater_telehub.xml
index e6201785bd..c529ca2736 100644
--- a/indra/newview/skins/default/xui/fr/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/fr/floater_telehub.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="telehub" title="Téléhub" min_height="310" height="310" >
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="310" min_height="310" name="telehub" title="TÉLÉHUB">
<text name="status_text_connected">
Téléhub connecté à l&apos;objet [OBJECT]
</text>
@@ -9,23 +9,20 @@
<text name="help_text_connected">
Pour supprimer, cliquez sur Déconnecter.
</text>
- <text name="help_text_not_connected" height="38" bottom_delta="-18">
- Sélectionner l&apos;objet et cliquez sur Connecter
-le téléhub.
+ <text bottom_delta="-18" height="38" name="help_text_not_connected">
+ Sélectionner l&apos;objet et cliquez sur Connecter le téléhub.
</text>
<button label="Connecter le téléhub" name="connect_btn" width="122"/>
- <button label="Déconnecter" name="disconnect_btn" left="142" width="98"/>
+ <button label="Déconnecter" left="142" name="disconnect_btn" width="98"/>
<text name="spawn_points_text" width="230">
Points d&apos;apparition (positions, pas objets) :
</text>
- <button label="Ajouter point" name="add_spawn_point_btn" />
- <button label="Supprimer point" name="remove_spawn_point_btn" />
- <text name="spawn_point_help">
- Sélectionnez l&apos;objet et cliquez sur Ajouter pour
-indiquer la position. Vous pourrez ensuite
-déplacer ou supprimer l&apos;objet.
+ <button label="Ajouter point" name="add_spawn_point_btn"/>
+ <button label="Supprimer point" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help" height="100">
+ Sélectionnez l&apos;objet et cliquez sur Ajouter pour indiquer la position.
+Vous pourrez ensuite déplacer ou supprimer l&apos;objet.
Les positions sont relatives au centre du téléhub.
-Sélectionnez l&apos;élément dans la liste pour afficher
-sa position dans le Monde.
+Sélectionnez un objet dans la liste pour le mettre en surbrillance dans le monde virtuel.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index fa8b65d8a5..381bcceb00 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Texture">
+<floater name="texture picker" title="CHOISIR : TEXTURE">
<string name="choose_picture">
Cliquez pour sélectionner une image
</string>
<text name="Multiple">
- Multiple
+ Textures multiples
</text>
<text name="unknown">
- Dimensions : [DIMENSIONS]
+ Taille : [DIMENSIONS]
</text>
- <button label="Défaut" label_selected="Défaut" name="Default" width="60" />
- <button label="Aucune" label_selected="Aucune" name="None" width="60" left="68" />
- <button label="Vierge" label_selected="Vierge" name="Blank" width="60" />
+ <button label="Défaut" label_selected="Défaut" name="Default" width="60"/>
+ <button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/>
+ <button label="Vierge" label_selected="Vierge" name="Blank" width="60"/>
<check_box label="Afficher les dossiers" name="show_folders_check"/>
- <search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
- <check_box label="Appliquer immédiatement" name="apply_immediate_check" />
- <button label="" label_selected="" name="Pipette" bottom="-240" />
+ <search_editor label="Filtrer les textures" name="inventory search editor"/>
+ <check_box label="Appliquer maintenant" name="apply_immediate_check"/>
+ <button bottom="-240" label="" label_selected="" name="Pipette"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Choisir :
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index e8db326e15..3488ae15d1 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,42 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Construire">
+<floater name="toolbox floater" short_title="OUTILS DE CONSTRUCTION" title="">
+ <floater.string name="status_rotate">
+ Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
+ </floater.string>
+ <floater.string name="status_scale">
+ Pour étirer le côté sélectionné, cliquez et faites glisser.
+ </floater.string>
+ <floater.string name="status_move">
+ Glissez pour déplacer, Maj-glissez pour copier.
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Cliquez et maintenez pour modifier le terrain.
+ </floater.string>
+ <floater.string name="status_camera">
+ Cliquez et faites glisser pour bouger la caméra
+ </floater.string>
+ <floater.string name="status_grab">
+ Faites glisser pour déplacer, appuyez sur Ctrl pour soulever, Ctrl-Maj pour pivoter
+ </floater.string>
+ <floater.string name="status_place">
+ Cliquez dans le monde pour construire.
+ </floater.string>
+ <floater.string name="status_selectland">
+ Cliquez et faites glisser pour sélectionner le terrain.
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Écran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Monde
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Référence
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Pièce-jointe
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
<button label="" label_selected="" name="button edit" tool_tip="Modifier"/>
<button label="" label_selected="" name="button create" tool_tip="Créer"/>
<button label="" label_selected="" name="button land" tool_tip="Terrain"/>
+ <text name="text status">
+ Glissez pour déplacer, Maj-glissez pour copier.
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Orbite (Ctrl)" name="radio orbit"/>
- <radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/>
+ <radio_item label="Faire un panoramique (Ctrl+Maj)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Déplacer" name="radio move"/>
<radio_item label="Orbite (Ctrl)" name="radio lift"/>
- <radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/>
+ <radio_item label="Faire tourner (Ctrl+Maj)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Positionner" name="radio position"/>
+ <radio_item label="Bouger" name="radio position"/>
<radio_item label="Pivoter (Ctrl)" name="radio rotate"/>
- <radio_item label="Étirer (Ctrl-Maj)" name="radio stretch"/>
+ <radio_item label="Étirer (Ctrl+Maj)" name="radio stretch"/>
<radio_item label="Sélectionner une face" name="radio select face"/>
</radio_group>
- <check_box label="Modifier les parties liées" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Axe :
+ <check_box label="Modification liée" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet">
+ þ : [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Monde"/>
- <combo_box.item name="Local" label="Local"/>
- <combo_box.item name="Reference" label="Référence"/>
- </combo_box>
<check_box label="Étirer les deux côtés" name="checkbox uniform"/>
- <check_box label="Étirer les textures" name="checkbox stretch textures"/>
- <check_box label="Utiliser la grille" name="checkbox snap to grid"/>
- <button label="Options..." label_selected="Options..." name="Options..."/>
- <text name="text status">
- Glissez pour déplacer, Maj-glissez pour copier.
- </text>
+ <check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Choisissez le type d&apos;axe de grille pour le positionnement de l&apos;objet">
+ <combo_box.item label="Grille du monde" name="World"/>
+ <combo_box.item label="Grille locale" name="Local"/>
+ <combo_box.item label="Grille de référence" name="Reference"/>
+ </combo_box>
+ <button label="Options..." label_selected="Options..." name="Options..." tool_tip="Afficher d&apos;autres options de grille"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
@@ -54,7 +93,7 @@
<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
<check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
<check_box label="Copier la sélection" name="checkbox copy selection"/>
- <check_box label="Centrer" name="checkbox copy centers"/>
+ <check_box initial_value="true" label="Centrer" name="checkbox copy centers"/>
<check_box label="Pivoter" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Sélectionner le terrain" name="radio select land"/>
@@ -65,7 +104,6 @@
<radio_item label="Bosseler" name="radio noise"/>
<radio_item label="Annuler modification" name="radio revert"/>
</radio_group>
- <button label="Appliquer" label_selected="Appliquer" name="button apply to selection" tool_tip="Modifier le terrain sélectionné" left="176"/>
<text name="Bulldozer:">
Bulldozer :
</text>
@@ -75,14 +113,51 @@
<text name="Strength:">
Force
</text>
+ <button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
<text name="obj_count">
- Objets sélectionnés : [COUNT]
+ Objets : [COUNT]
</text>
<text name="prim_count">
- Prims : [COUNT]
+ Prims : [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="Général" name="General">
+ <panel.string name="text deed continued">
+ Céder
+ </panel.string>
+ <panel.string name="text deed">
+ Transférer
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Vous pouvez modifier cet objet
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Vous pouvez modifier ces objets
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Vous ne pouvez pas modifier cet objet
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Vous ne pouvez pas modifier ces objets
+ </panel.string>
+ <panel.string name="text modify warning">
+ Sélectionnez l&apos;objet en entier
+ </panel.string>
+ <panel.string name="Cost Default">
+ Prix : L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Prix total : L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Prix par : L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Prix mixte
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Vente mixte
+ </panel.string>
<text name="Name:">
Nom :
</text>
@@ -93,130 +168,79 @@
Créateur :
</text>
<text name="Creator Name">
- Thrax Linden
+ Esbee Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button creator profile"/>
<text name="Owner:">
Propriétaire :
</text>
<text name="Owner Name">
- Thrax Linden
+ Erica Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button owner profile"/>
<text name="Group:">
Groupe :
</text>
- <text name="Group Name Proxy">
- Les Lindens
- </text>
- <button label="Définir..." label_selected="Définir..." name="button set group"/>
- <text name="Permissions:">
- Droits :
- </text>
-
- <check_box label="Partager avec le groupe" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
- <string name="text deed continued">
- Transférer...
- </string>
- <string name="text deed">
- Transférer
- </string>
- <button label="Céder..." label_selected="Céder..." name="button deed" tool_tip="Les objets partagés par un groupe peuvent être cédés par un officier."/>
- <check_box label="Autoriser tout le monde à déplacer" name="checkbox allow everyone move"/>
- <check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy"/>
- <check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
- <check_box label="À vendre" name="checkbox for sale"/>
- <text name="Cost">
- Prix : L$
+ <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
+ <name_box initial_value="Chargement..." name="Group Name Proxy"/>
+ <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
+ <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
+ <text name="label click action">
+ Cliquer pour :
</text>
+ <combo_box name="clickaction" width="178">
+ <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
+ <combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
+ <combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
+ <combo_box.item label="Payer l&apos;objet" name="Payobject"/>
+ <combo_box.item label="Ouvrir" name="Open"/>
+ <combo_box.item label="Zoomer" name="Zoom"/>
+ </combo_box>
+ <check_box label="À vendre :" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Copie" name="Copy"/>
<combo_box.item label="Contenus" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action">
- Action du clic-gauche :
- </text>
- <combo_box name="clickaction" width="178">
- <combo_box.item name="Touch/grab(default)" label="Toucher/attraper (défaut)"/>
- <combo_box.item name="Sitonobject" label="S&apos;asseoir sur l&apos;objet"/>
- <combo_box.item name="Buyobject" label="Acheter l&apos;objet"/>
- <combo_box.item name="Payobject" label="Payer l&apos;objet"/>
- <combo_box.item name="Open" label="Ouvrir"/>
- <combo_box.item name="Play" label="Jouer le média de la parcelle"/>
- <combo_box.item name="Opemmedia" label="Ouvrir le média de la parcelle"/>
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Vous pouvez modifier cet objet
- </text>
- <text name="B:">
- B :
- </text>
- <text name="O:">
- O :
- </text>
- <text name="G:">
- G :
- </text>
- <text name="E:">
- E :
- </text>
- <text name="N:">
- N :
- </text>
- <text name="F:">
- F :
- </text>
- <text name="Next owner can:">
- Le prochain propriétaire pourra :
- </text>
- <check_box label="Modifier" name="checkbox next owner can modify"/>
- <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/>
- <check_box name="checkbox next owner can transfer"/>
- </panel>
- <string name="text modify info 1">
- Vous pouvez modifier cet objet
- </string>
- <string name="text modify info 2">
- Vous pouvez modifier ces objets
- </string>
- <string name="text modify info 3">
- Vous ne pouvez pas modifier cet objet
- </string>
- <string name="text modify info 4">
- Vous ne pouvez pas modifier ces objets
- </string>
- <string name="text modify warning">
- Sélectionnez l&apos;objet en entier
- </string>
- <string name="Cost Default">
- Prix : L$
- </string>
- <string name="Cost Total">
- Prix total : L$
- </string>
- <string name="Cost Per Unit">
- Prix par : L$
- </string>
- <string name="Cost Mixed">
- Prix mixte
- </string>
- <string name="Sale Mixed">
- Vente mixte
- </string>
+ <spinner label="Prix : L$" name="Edit Cost"/>
+ <check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Vous pouvez modifier cet objet
+ </text>
+ <text name="Anyone can:">
+ N&apos;importe qui :
+ </text>
+ <check_box label="Bouger" name="checkbox allow everyone move"/>
+ <check_box label="Copier" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Le prochain propriétaire :
+ </text>
+ <check_box label="Modifier" name="checkbox next owner can modify"/>
+ <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/>
+ <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+ <text name="B:">
+ B :
+ </text>
+ <text name="O:">
+ O :
+ </text>
+ <text name="G:">
+ G :
+ </text>
+ <text name="E:">
+ E :
+ </text>
+ <text name="N:">
+ N :
+ </text>
+ <text name="F:">
+ F :
+ </text>
+ </panel>
</panel>
<panel label="Objet" name="Object">
- <text name="select_single">
- Sélectionnez un prim pour modifier les paramètres.
- </text>
- <text name="edit_object">
- Modifier les paramètres de l&apos;objet :
- </text>
<check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/>
<check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité"/>
- <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L&apos;objet est supprimé 1 mn après sa création."/>
+ <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="Les objets sont supprimés une minute après leur création"/>
<check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars."/>
<text name="label position">
Position (mètres)
@@ -236,33 +260,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Matériau
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Pierre"/>
- <combo_box.item name="Metal" label="Métal"/>
- <combo_box.item name="Glass" label="Verre"/>
- <combo_box.item name="Wood" label="Bois"/>
- <combo_box.item name="Flesh" label="Chair"/>
- <combo_box.item name="Plastic" label="Plastique"/>
- <combo_box.item name="Rubber" label="Caoutchouc"/>
- </combo_box>
- <text name="label basetype">
- Type de construction
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Boîte"/>
- <combo_box.item name="Cylinder" label="Cylindre"/>
- <combo_box.item name="Prism" label="Prisme"/>
- <combo_box.item name="Sphere" label="Sphère"/>
- <combo_box.item name="Torus" label="Tore"/>
- <combo_box.item name="Tube" label="Tube"/>
- <combo_box.item name="Ring" label="Anneau"/>
- <combo_box.item name="Sculpted" label="Sculptie"/>
+ <combo_box.item label="Boîte" name="Box"/>
+ <combo_box.item label="Cylindre" name="Cylinder"/>
+ <combo_box.item label="Prisme" name="Prism"/>
+ <combo_box.item label="Sphère" name="Sphere"/>
+ <combo_box.item label="Tore" name="Torus"/>
+ <combo_box.item label="Tube" name="Tube"/>
+ <combo_box.item label="Anneau" name="Ring"/>
+ <combo_box.item label="Sculptie" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Pierre" name="Stone"/>
+ <combo_box.item label="Métal" name="Metal"/>
+ <combo_box.item label="Verre" name="Glass"/>
+ <combo_box.item label="Bois" name="Wood"/>
+ <combo_box.item label="Chair" name="Flesh"/>
+ <combo_box.item label="Plastique" name="Plastic"/>
+ <combo_box.item label="Caoutchouc" name="Rubber"/>
</combo_box>
<text name="text cut">
- Début et fin de découpe du tracé
+ Découpe du tracé (début/fin)
</text>
<spinner label="D" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -276,13 +294,13 @@
Forme du creux
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Défaut"/>
- <combo_box.item name="Circle" label="Cercle"/>
- <combo_box.item name="Square" label="Carré"/>
- <combo_box.item name="Triangle" label="Triangle"/>
+ <combo_box.item label="Défaut" name="Default"/>
+ <combo_box.item label="Cercle" name="Circle"/>
+ <combo_box.item label="Carré" name="Square"/>
+ <combo_box.item label="Triangle" name="Triangle"/>
</combo_box>
<text name="text twist">
- Début et fin de vrille
+ Vrille (début/fin)
</text>
<spinner label="D" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -300,13 +318,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Début et fin de découpe du profilé
+ Découpe du profilé (début/fin)
</text>
<text name="advanced_dimple">
- Début et fin du creux
+ Creux (début/fin)
</text>
<text name="advanced_slice">
- Début et fin de la tranche
+ Tranche (début/fin)
</text>
<spinner label="D" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -322,17 +340,17 @@
Révolutions
</text>
<texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
- <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l&apos;axe des X."/>
- <check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d&apos;un sculptie et le fait apparaître à l&apos;envers."/>
+ <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Inverse le sculptie le long de l&apos;axe X"/>
+ <check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les normales des sculpties, qui apparaissent alors à l&apos;envers"/>
<text name="label sculpt type">
Type de raccord
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(aucun)"/>
- <combo_box.item name="Sphere" label="Sphère"/>
- <combo_box.item name="Torus" label="Tore"/>
- <combo_box.item name="Plane" label="Plan"/>
- <combo_box.item name="Cylinder" label="Cylindre"/>
+ <combo_box.item label="(aucun)" name="None"/>
+ <combo_box.item label="Sphère" name="Sphere"/>
+ <combo_box.item label="Tore" name="Torus"/>
+ <combo_box.item label="Plan" name="Plane"/>
+ <combo_box.item label="Cylindre" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Attributs" name="Features">
@@ -342,7 +360,7 @@
<text name="edit_object">
Modifier les attributs de l&apos;objet :
</text>
- <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z (côté client uniquement)."/>
+ <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Permet à l&apos;objet de se plier le long de l&apos;axe Z (côté client uniquement)"/>
<spinner label="Souplesse" name="FlexNumSections"/>
<spinner label="Gravité" name="FlexGravity"/>
<spinner label="Élasticité" name="FlexFriction"/>
@@ -352,17 +370,24 @@
<spinner label="Force Y" name="FlexForceY"/>
<spinner label="Force Z" name="FlexForceZ"/>
<check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d&apos;émettre de la lumière"/>
- <text name="label color">
- Couleur
- </text>
<color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <texture_picker label="" name="light texture control" tool_tip="Cliquez pour choisir une image de projection (n&apos;a d&apos;effet que si le rendu différé est activé)"/>
<spinner label="Intensité" name="Light Intensity"/>
+ <spinner label="Angle de champ" name="Light FOV"/>
<spinner label="Portée" name="Light Radius"/>
+ <spinner label="Point central" name="Light Focus"/>
<spinner label="Atténuation" name="Light Falloff"/>
+ <spinner label="Ambiance" name="Light Ambiance"/>
</panel>
<panel label="Texture" name="Texture">
+ <panel.string name="string repeats per meter">
+ Répétitions au mètre
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Répétitions par face
+ </panel.string>
<texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
<text name="color trans" width="88">
Transparence
</text>
@@ -374,73 +399,65 @@
Application
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Défaut"/>
- <combo_box.item name="Planar" label="Planar"/>
+ <combo_box.item label="Défaut" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
</combo_box>
<text name="label shininess">
Brillance
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Aucune"/>
- <combo_box.item name="Low" label="Faible"/>
- <combo_box.item name="Medium" label="Moyenne"/>
- <combo_box.item name="High" label="Élevée"/>
+ <combo_box.item label="Aucune" name="None"/>
+ <combo_box.item label="Faible" name="Low"/>
+ <combo_box.item label="Moyenne" name="Medium"/>
+ <combo_box.item label="Élevée" name="High"/>
</combo_box>
<text name="label bumpiness">
Relief
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Aucun"/>
- <combo_box.item name="Brightness" label="Luminosité"/>
- <combo_box.item name="Darkness" label="Obscurité"/>
- <combo_box.item name="woodgrain" label="Aggloméré"/>
- <combo_box.item name="bark" label="Écorce"/>
- <combo_box.item name="bricks" label="Briques"/>
- <combo_box.item name="checker" label="Damier"/>
- <combo_box.item name="concrete" label="Béton"/>
- <combo_box.item name="crustytile" label="Carrelage"/>
- <combo_box.item name="cutstone" label="Pierre de taille"/>
- <combo_box.item name="discs" label="Disques"/>
- <combo_box.item name="gravel" label="Gravier"/>
- <combo_box.item name="petridish" label="Boîte de Petri"/>
- <combo_box.item name="siding" label="Lattes"/>
- <combo_box.item name="stonetile" label="Carreaux"/>
- <combo_box.item name="stucco" label="Stuc"/>
- <combo_box.item name="suction" label="Ventouses"/>
- <combo_box.item name="weave" label="Tissage"/>
+ <combo_box.item label="Aucun" name="None"/>
+ <combo_box.item label="Luminosité" name="Brightness"/>
+ <combo_box.item label="Obscurité" name="Darkness"/>
+ <combo_box.item label="Aggloméré" name="woodgrain"/>
+ <combo_box.item label="Écorce" name="bark"/>
+ <combo_box.item label="Briques" name="bricks"/>
+ <combo_box.item label="Damier" name="checker"/>
+ <combo_box.item label="Béton" name="concrete"/>
+ <combo_box.item label="Carrelage" name="crustytile"/>
+ <combo_box.item label="Pierre de taille" name="cutstone"/>
+ <combo_box.item label="Disques" name="discs"/>
+ <combo_box.item label="Gravier" name="gravel"/>
+ <combo_box.item label="Boîte de Petri" name="petridish"/>
+ <combo_box.item label="Lattes" name="siding"/>
+ <combo_box.item label="Carreaux" name="stonetile"/>
+ <combo_box.item label="Stuc" name="stucco"/>
+ <combo_box.item label="Ventouses" name="suction"/>
+ <combo_box.item label="Tissage" name="weave"/>
</combo_box>
<text name="tex scale">
- Répétitions par face
+ Répétitions / Face
</text>
<spinner label="Horizontal (U)" name="TexScaleU"/>
<check_box label="Inverser" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Inverser" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotation (degrés)
- </text>
- <spinner left="122" name="TexRot" width="58"/>
- <string name="string repeats per meter">
- Répétitions au mètre
- </string>
- <string name="string repeats per face">
- Répétitions par face
- </string>
- <text name="rpt" width="160">
- Répétitions au mètre
- </text>
- <spinner left="122" name="rptctrl" width="58"/>
+ <spinner label="RotationËš" left="122" name="TexRot" width="58"/>
+ <spinner label="Répétitions / Mètre" left="122" name="rptctrl" width="58"/>
<button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/>
<text name="tex offset">
- Décalage
+ Décalage de la texture
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertical (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Ajuster la texture du média
-(chargement préalable)
- </text>
- <button label="Ajuster" label_selected="Ajuster" left="150" name="button align"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Média
+ </text>
+ <button name="add_media" tool_tip="Ajouter un média"/>
+ <button name="delete_media" tool_tip="Supprimer cette texture de média"/>
+ <button name="edit_media" tool_tip="Modifier ce média"/>
+ <button label="Aligner" label_selected="Aligner le média" name="button align" tool_tip="Ajuster la texture du média (le chargement doit d&apos;abord se terminer)"/>
+ </panel>
</panel>
<panel label="Contenu" name="Contents">
<button label="Nouveau script" label_selected="Nouveau script" name="button new script"/>
@@ -452,62 +469,22 @@
Informations sur la parcelle
</text>
<text name="label_area_price">
- Prix : [PRICE] L$ pour [AREA] m².
+ Prix : [PRICE] L$ pour [AREA] m²
</text>
<text name="label_area">
- Surface : [AREA] m²
+ Surface : [AREA] m²
</text>
- <button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="142"/>
- <check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorie les parcelles en fonction de leur propriétaire : &#10;&#10;Vert = votre terrain &#10;Turquoise = le terrain de votre groupe &#10;Rouge = appartenant à d&apos;autres &#10;Jaune = en vente &#10;Mauve = aux enchères &#10;Gris = public"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="154"/>
+ <button label="À propos des terrains" label_selected="À propos des terrains" name="button about land" width="142"/>
+ <check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorier les parcelles en fonction du type de leur propriétaire : Vert = votre terrain Turquoise = le terrain de votre groupe Rouge = appartenant à d&apos;autres Jaune = en vente Mauve = aux enchères Gris = public"/>
<text name="label_parcel_modify">
Modifier la parcelle
</text>
- <button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/>
+ <button label="Sous-diviser" label_selected="Sous-diviser" name="button subdivide land" width="142"/>
<button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/>
<text name="label_parcel_trans">
Transactions
</text>
- <button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/>
+ <button label="Acheter du terrain" label_selected="Acheter du terrain" name="button buy land" width="142"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/>
</panel>
- <floater.string name="status_rotate">
- Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
- </floater.string>
- <floater.string name="status_scale">
- Pour étirer le côté sélectionné, cliquez et faites glisser.
- </floater.string>
- <floater.string name="status_move">
- Glissez pour déplacer, Maj-glissez pour copier.
- </floater.string>
- <floater.string name="status_modifyland">
- Cliquez et maintenez pour modifier le terrain.
- </floater.string>
- <floater.string name="status_camera">
- Cliquez et faites glisser pour changer l&apos;affichage.
- </floater.string>
- <floater.string name="status_grab">
- Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter.
- </floater.string>
- <floater.string name="status_place">
- Cliquez dans le monde pour construire.
- </floater.string>
- <floater.string name="status_selectland">
- Cliquez et faites glisser pour sélectionner le terrain.
- </floater.string>
- <floater.string name="grid_screen_text">
- Écran
- </floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Monde
- </floater.string>
- <floater.string name="grid_reference_text">
- Référence
- </floater.string>
- <floater.string name="grid_attachment_text">
- Pièce-jointe
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
index 69a3d0cd18..42352e7c1e 100644
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -1,55 +1,56 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="en cours de chargement...">
+<floater name="top_objects" title="Objets les plus utilisés">
+ <floater.string name="top_scripts_title">
+ Scripts principaux
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts prenant un total de [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Heure
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Heure Mono
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Collisions les plus consommatrices
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ [COUNT] collisions les plus consommatrices
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Score
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Aucun résultat.
+ </floater.string>
<text name="title_text">
Chargement...
</text>
<scroll_list name="objects_list">
- <column label="Score" name="score"/>
- <column label="Nom" name="name"/>
- <column label="Propriétaire" name="owner"/>
- <column label="Lieu" name="location"/>
- <column label="Heure" name="time"/>
- <column label="Heure Mono" name="mono_time"/>
+ <scroll_list.columns label="Score" name="score"/>
+ <scroll_list.columns label="Nom" name="name"/>
+ <scroll_list.columns label="Propriétaire" name="owner"/>
+ <scroll_list.columns label="Lieu" name="location"/>
+ <scroll_list.columns label="Heure" name="time"/>
+ <scroll_list.columns label="Heure Mono" name="mono_time"/>
+ <scroll_list.columns label="URL" name="URLs"/>
</scroll_list>
<text name="id_text">
ID de l&apos;objet :
</text>
<button label="Afficher balise" name="show_beacon_btn"/>
<text name="obj_name_text">
- Objet :
+ Nom :
</text>
<button label="Filtre" name="filter_object_btn"/>
<text name="owner_name_text">
- Propriétaire :
+ Propriétaire :
</text>
<button label="Filtre" name="filter_owner_btn"/>
+ <button label="Rafraîchir" name="refresh_btn"/>
<button label="Renvoyer" name="return_selected_btn"/>
<button label="Tout renvoyer" name="return_all_btn"/>
<button label="Désactiver" name="disable_selected_btn"/>
<button label="Tout désactiver" name="disable_all_btn"/>
- <button label="Rafraîchir" name="refresh_btn"/>
- <string name="top_scripts_title">
- Scripts principaux
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts prenant un total de [TIME] ms
- </string>
- <string name="scripts_score_label">
- Heure
- </string>
- <string name="scripts_mono_time_label">
- Heure Mono
- </string>
- <string name="top_colliders_title">
- Collisions les plus consommatrices
- </string>
- <string name="top_colliders_text">
- [COUNT] collisions les plus consommatrices
- </string>
- <string name="colliders_score_label">
- Score
- </string>
- <string name="none_descriptor">
- Aucun résultat.
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index ba7052562c..2c8e8bc5bc 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -1,18 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="Continuer" label_selected="Continuer" name="Continue" />
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
+ <button label="Continuer" label_selected="Continuer" name="Continue"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
<radio_group name="tos_agreement">
- <radio_item name="radio_disagree" label="Je n&apos;accepte pas les Conditions Générales d&apos;Utilisation" />
- <radio_item name="radio_agree" label="J&apos;accepte les Conditions Générales d&apos;Utilisation" />
+ <radio_item label="Je n&apos;accepte pas les Conditions Générales d&apos;Utilisation" name="radio_disagree"/>
+ <radio_item label="J&apos;accepte les Conditions Générales d&apos;Utilisation" name="radio_agree"/>
</radio_group>
<text name="tos_title">
Acceptation des Conditions Générales d&apos;Utilisation
</text>
- <check_box label="J&apos;accepte les Conditions d&apos;utilisation" name="agree_chk" />
+ <check_box label="J&apos;accepte les Conditions d&apos;utilisation" name="agree_chk"/>
<text name="tos_heading">
- Veuillez lire attentivement les Conditions d&apos;utilisation suivantes. Pour continuer à utiliser
-[SECOND_LIFE], vous devez accepter ces conditions.
+ Veuillez lire attentivement les Conditions d&apos;utilisation suivantes. Pour vous connecter à [SECOND_LIFE], vous devez accepter l&apos;accord.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/fr/floater_url_entry.xml b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
index 6a90731691..4b2be14569 100644
--- a/indra/newview/skins/default/xui/fr/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
URL du média :
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" />
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="30" />
<button label="Annuler" name="cancel_btn" />
- <button label="Effacer" name="clear_btn" />
- <text name="loading_label">
+ <button label="Effacer" name="clear_btn" left_pad="94"/>
+ <text name="loading_label" left="120">
Chargement...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
new file mode 100644
index 0000000000..54ba2ad3e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Contrôles vocaux">
+ <string name="title_nearby">
+ CHAT VOCAL PRÈS DE VOUS
+ </string>
+ <string name="title_group">
+ Appel de groupe avec [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Téléconférence
+ </string>
+ <string name="title_peer_2_peer">
+ Appel avec [NAME]
+ </string>
+ <string name="no_one_near">
+ Il n&apos;y a personne près de vous avec le chat vocal activé
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Quitter l&apos;appel" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
index 9b77c2450d..1a74017330 100644
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ b/indra/newview/skins/default/xui/fr/floater_water.xml
@@ -1,66 +1,52 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Water Floater" title="Éditeur d&apos;eau avancé">
- <text name="KeyFramePresetsText">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="ÉDITEUR D&apos;EAU AVANCÉE">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText" width="120">
Préréglages eau :
</text>
- <button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset" />
- <button label="Enregistrer" label_selected="Enregistrer" name="WaterSavePreset" width="75" left_delta="75"/>
- <button label="Supprimer" label_selected="Supprimer" name="WaterDeletePreset" left_delta="80"/>
+ <button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/>
+ <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WaterSavePreset" width="75"/>
+ <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
<panel label="Paramètres" name="Settings">
<text name="BHText">
- Couleur du brouillard
-dans l&apos;eau
+ Couleur du brouillard dans l&apos;eau
</text>
- <button label="?" name="WaterFogColorHelp" />
- <color_swatch name="WaterFogColor" left="75" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
+ <color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
<text name="WaterFogDensText">
Densité du brouillard
</text>
- <button label="?" name="WaterFogDensityHelp" />
<text name="WaterUnderWaterFogModText">
Brouillard sous-marin
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" />
<text name="BDensText">
Échelle des vaguelettes
</text>
- <button label="?" name="WaterNormalScaleHelp" />
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
<text name="HDText">
Échelle Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" />
<text name="FresnelOffsetText">
Décalage Fresnel
</text>
- <button label="?" name="WaterFresnelOffsetHelp" />
<text name="DensMultText">
Réfraction au dessus
</text>
- <button label="?" name="WaterScaleAboveHelp" />
<text name="WaterScaleBelowText">
Réfraction en dessous
</text>
- <button label="?" name="WaterScaleBelowHelp" />
<text name="MaxAltText">
Multiplicateur de flou
</text>
- <button label="?" name="WaterBlurMultiplierHelp" />
</panel>
<panel label="Image" name="Waves">
<text name="BHText">
Direction grande vague
</text>
- <button label="?" name="WaterWave1Help" />
<text name="WaterWave1DirXText">
X
</text>
@@ -70,7 +56,6 @@ dans l&apos;eau
<text name="BHText2">
Direction petite vague
</text>
- <button label="?" name="WaterWave2Help" />
<text name="WaterWave2DirXText">
X
</text>
@@ -80,10 +65,6 @@ dans l&apos;eau
<text name="BHText3">
Normal Map
</text>
- <button label="?" name="WaterNormalMapHelp" />
</panel>
</tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
index af6274d4e2..5dda347fcf 100644
--- a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="Enregistrer" label_selected="Enregistrer" name="Save" />
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
- Enregistrer l&apos;objet sous :
+ Enregistrer l&apos;objet dans mon inventaire comme :
</text>
<line_editor name="name ed">
Nouveau [DESC]
diff --git a/indra/newview/skins/default/xui/fr/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/fr/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..99e4954555
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="ENTRÉE DE LA LISTE BLANCHE">
+ <text name="media_label">
+ Saisissez une URL ou un style d&apos;URL à ajouter à la liste des domaines autorisés
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Saisissez une URL ou un style d&apos;URL à ajouter à la liste blanche"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
index d1a62dc6bc..d92fadd048 100644
--- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
@@ -1,19 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="Éditeur de ciel avancé" width="706">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706">
<text name="KeyFramePresetsText">
Préréglages ciel :
</text>
- <button label="Nouveau" label_selected="Nouveau" name="WLNewPreset" />
- <button label="Enregistrer" label_selected="Enregistrer" name="WLSavePreset" width="75" left_delta="75"/>
- <button label="Supprimer" label_selected="Supprimer" name="WLDeletePreset" left_delta="80"/>
- <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour"
- name="WLDayCycleMenuButton" width="150" left_delta="95" />
+ <button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/>
+ <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/>
+ <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/>
+ <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_pad="20" left_delta="95" name="WLDayCycleMenuButton" width="150"/>
<tab_container name="WindLight Tabs" width="706">
<panel label="Atmosphère" name="Atmosphere">
<text name="BHText">
Bleu de l&apos;horizon
</text>
- <button label="?" name="WLBlueHorizonHelp" />
+ <button label="?" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -29,11 +28,11 @@
<text name="BDensText">
Quantité de brume
</text>
- <button label="?" name="WLHazeHorizonHelp" />
+ <button label="?" name="WLHazeHorizonHelp"/>
<text name="BDensText2">
Densité du bleu
</text>
- <button label="?" name="WLBlueDensityHelp" />
+ <button label="?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -49,25 +48,25 @@
<text name="HDText">
Densité de la brume
</text>
- <button label="?" name="WLHazeDensityHelp" />
+ <button label="?" name="WLHazeDensityHelp"/>
<text name="DensMultText">
Multiplicateur de densité
</text>
- <button label="?" name="WLDensityMultHelp" />
+ <button label="?" name="WLDensityMultHelp"/>
<text name="WLDistanceMultText">
Multiplicateur de distance
</text>
- <button label="?" name="WLDistanceMultHelp" />
+ <button label="?" name="WLDistanceMultHelp"/>
<text name="MaxAltText">
Altitude maximum
</text>
- <button label="?" name="WLMaxAltitudeHelp" />
+ <button label="?" name="WLMaxAltitudeHelp"/>
</panel>
<panel label="Éclairage" name="Lighting">
<text name="SLCText">
Couleur soleil/lune
</text>
- <button label="?" name="WLSunlightColorHelp" />
+ <button label="?" name="WLSunlightColorHelp"/>
<text name="BHText">
R
</text>
@@ -83,11 +82,11 @@
<text name="TODText">
Position soleil/lune
</text>
- <button label="?" name="WLTimeOfDayHelp" />
+ <button label="?" name="WLTimeOfDayHelp"/>
<text name="WLAmbientText">
Éclairage ambiant
</text>
- <button label="?" name="WLAmbientHelp" />
+ <button label="?" name="WLAmbientHelp"/>
<text name="BHText5">
R
</text>
@@ -103,27 +102,27 @@
<text name="WLEastAngleText">
Angle du levant
</text>
- <button label="?" name="WLEastAngleHelp" />
+ <button label="?" name="WLEastAngleHelp"/>
<text name="SunGlowText">
Rayonnement du soleil
</text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="Netteté " name="WLGlowB" />
- <slider label="Taille " name="WLGlowR" />
+ <button label="?" name="WLSunGlowHelp"/>
+ <slider label="Netteté " name="WLGlowB"/>
+ <slider label="Taille " name="WLGlowR"/>
<text name="SceneGammaText">
Gamma de la scène
</text>
- <button label="?" name="WLSceneGammaHelp" />
+ <button label="?" name="WLSceneGammaHelp"/>
<text name="WLStarText">
Éclat des étoiles
</text>
- <button label="?" name="WLStarBrightnessHelp" />
+ <button label="?" name="WLStarBrightnessHelp"/>
</panel>
<panel label="Nuages" name="Clouds">
<text name="WLCloudColorText">
Couleur des nuages
</text>
- <button label="?" name="WLCloudColorHelp" />
+ <button label="?" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -139,7 +138,7 @@
<text name="WLCloudColorText2">
Nuages XY/densité
</text>
- <button label="?" name="WLCloudDensityHelp" />
+ <button label="?" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -152,15 +151,15 @@
<text name="WLCloudCoverageText">
Couverture nuageuse
</text>
- <button label="?" name="WLCloudCoverageHelp" left="407"/>
+ <button label="?" left="407" name="WLCloudCoverageHelp"/>
<text name="WLCloudScaleText">
Altitude des nuages
</text>
- <button label="?" name="WLCloudScaleHelp" left="407"/>
+ <button label="?" left="407" name="WLCloudScaleHelp"/>
<text name="WLCloudDetailText">
Détails nuages (XY/densité)
</text>
- <button label="?" name="WLCloudDetailHelp" left="407" bottom_delta="-2" />
+ <button bottom_delta="-2" label="?" left="407" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -173,15 +172,15 @@
<text name="WLCloudScrollXText">
Direction et vitesse X
</text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="Verrouiller" name="WLCloudLockX" />
+ <button label="?" name="WLCloudScrollXHelp"/>
+ <check_box label="Verrouiller" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
Direction et vitesse Y
</text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="Verrouiller" name="WLCloudLockY" />
- <check_box label="Nuages classiques" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
+ <button label="?" name="WLCloudScrollYHelp"/>
+ <check_box label="Verrouiller" name="WLCloudLockY"/>
+ <check_box label="Nuages classiques" name="DrawClassicClouds"/>
+ <button label="?" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/fr/floater_window_size.xml b/indra/newview/skins/default/xui/fr/floater_window_size.xml
new file mode 100644
index 0000000000..cbda4390d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="TAILLE DE LA FENÊTRE">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Définir la taille de la fenêtre :
+ </text>
+ <combo_box name="window_size_combo" tool_tip="largeur x hauteur">
+ <combo_box.item label="1 000 x 700 (défaut)" name="item0"/>
+ <combo_box.item label="1 024 x 768" name="item1"/>
+ <combo_box.item label="1 280 x 720 (720 p)" name="item2"/>
+ <combo_box.item label="1 920 x 1 080 (1 080p)" name="item3"/>
+ </combo_box>
+ <button label="Choisir" name="set_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml
index ec2db5f163..19ea764ae8 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,71 +1,91 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Carte du monde">
- <tab_container name="maptab" width="955">
- <panel label="Objets" name="objects_mapview" width="953"/>
- <panel label="Terrain" name="terrain_mapview" width="953"/>
- </tab_container>
- <icon left="973" name="self"/>
- <text name="you_label">
- Vous
- </text>
- <icon left="1033" name="home"/>
- <text name="home_label">
- Domicile
- </text>
- <icon left="973" name="square2"/>
- <text name="auction_label">
- Terrain aux enchères
- </text>
- <icon left="1105" name="square"/>
- <text name="land_for_sale_label">
- Terrain à vendre
- </text>
- <button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
- <icon left="977" name="person"/>
- <check_box label="Résident" name="people_chk"/>
- <icon left="973" name="infohub"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <icon left="973" name="telehub"/>
- <check_box label="Téléhub" name="telehubchk"/>
- <icon left="973" name="landforsale"/>
- <check_box label="Terrain à vendre" name="land_for_sale_chk"/>
- <text name="events_label" left="1099">
- Événements :
- </text>
- <icon left="1121" name="event"/>
- <check_box label="PG" name="event_chk"/>
- <icon left="1121" name="events_mature_icon"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <icon left="1121" name="events_adult_icon"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <icon left="973" name="avatar_icon"/>
- <combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">
- <combo_box.item name="item1" label="Amis connectés" />
- </combo_box>
- <icon left="973" name="landmark_icon"/>
- <combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
- <combo_box.item name="item1" label="Repères" />
- </combo_box>
- <icon left="973" name="location_icon"/>
- <line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155"/>
- <button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/>
- <text left="973" name="search_label">
- Résultats de la recherche :
- </text>
- <scroll_list left="973" name="search_results" width="252">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text left="973" name="location_label">
- Emplacement :
- </text>
- <spinner left="1078" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
- <spinner name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>
- <spinner name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>
- <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
- <button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
- <button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>
- <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar" width="165"/>
- <button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLurl pour l&apos;utiliser sur le Web." width="262"/>
- <slider label="Zoom" left="-270" name="zoom slider"/>
+<floater name="worldmap" title="CARTE DU MONDE">
+ <panel name="objects_mapview" width="542"/>
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Légende
+ </text>
+ </panel>
+ <panel>
+ <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de mon avatar" width="165"/>
+ <text name="me_label">
+ Moi
+ </text>
+ <check_box label="Résident" name="people_chk"/>
+ <icon left="-262" name="person"/>
+ <text name="person_label">
+ Résident
+ </text>
+ <check_box label="Infohub" name="infohub_chk"/>
+ <icon left="-266" name="infohub"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box label="Terrain à vendre" name="land_for_sale_chk"/>
+ <icon left="-266" name="landforsale"/>
+ <text name="land_sale_label">
+ Vente de terrains
+ </text>
+ <icon left="-270" name="square2"/>
+ <text name="by_owner_label">
+ par le propriétaire
+ </text>
+ <text name="auction_label">
+ enchères
+ </text>
+ <button label="Aller chez moi" label_selected="Aller chez moi" left="-120" name="Go Home" tool_tip="Me téléporter jusqu&apos;à mon domicile" width="108"/>
+ <text name="Home_label">
+ Domicile
+ </text>
+ <text left="-144" name="events_label">
+ Événements :
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <icon left="-132" name="event"/>
+ <text name="pg_label">
+ Général
+ </text>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <icon left="-132" name="events_mature_icon"/>
+ <text name="mature_label">
+ Modéré
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ <icon left="-132" name="events_adult_icon"/>
+ <text name="adult_label">
+ Adulte
+ </text>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Situer sur la carte
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Amis connectés" name="friend combo" tool_tip="Afficher les amis sur la carte" width="232">
+ <combo_box.item label="Mes amis connectés" name="item1"/>
+ </combo_box>
+ <icon left="-270" name="landmark_icon"/>
+ <combo_box label="Mes repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
+ <combo_box.item label="Mes repères" name="item1"/>
+ </combo_box>
+ <search_editor label="Régions par nom" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155"/>
+ <button label="Trouver" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/>
+ <button name="Clear" tool_tip="Effacer les lignes de suivi et réinitialiser la carte"/>
+ <scroll_list left="-270" name="search_results" width="252">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
+ <button label="Copier la SLurl" left="-270" name="copy_slurl" tool_tip="Copie l&apos;emplacement actuel sous la forme d&apos;une SLurl à utiliser sur le Web."/>
+ <button label="Afficher la sélection" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoomer
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" left="-270" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
new file mode 100644
index 0000000000..381a52ed43
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_name" value="Grumpity ProductEngine"/>
+ <text name="user_subtitle" value="11 mois, 3 jours"/>
+ <text name="user_details">
+ C&apos;est ma description second life et je la trouve vraiment géniale.
+ </text>
+ <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
+ <button label="Devenir amis" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Désactiver le chat vocal" name="disable_voice"/>
+ <button label="Activer le chat vocal" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_group.xml b/indra/newview/skins/default/xui/fr/inspect_group.xml
new file mode 100644
index 0000000000..4519c380c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/inspect_group.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Groupe privé
+ </string>
+ <string name="FreeToJoin">
+ Inscription gratuite
+ </string>
+ <string name="CostToJoin">
+ Inscription : [AMOUNT] L$
+ </string>
+ <string name="YouAreMember">
+ Vous êtes membre
+ </string>
+ <text name="group_name">
+ Groupe grognon des Orignaux Grumpity
+ </text>
+ <text name="group_subtitle">
+ 123 membres
+ </text>
+ <text name="group_details">
+ Un groupe chargé de créer une pièce avec un orignal.
+Méfiez-vous de l&apos;orignal ! Méfiez-vous ! Et de la mangouste aussi !
+ </text>
+ <text name="group_cost">
+ Inscription : 123 L$
+ </text>
+ <button label="Vous inscrire" name="join_btn"/>
+ <button label="Quitter" name="leave_btn"/>
+ <button label="Voir le profil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_object.xml b/indra/newview/skins/default/xui/fr/inspect_object.xml
new file mode 100644
index 0000000000..e50de400fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/inspect_object.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Par [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ par [CREATOR]
+propriétaire [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ Gratuit !
+ </string>
+ <string name="Touch">
+ Toucher
+ </string>
+ <string name="Sit">
+ M&apos;asseoir
+ </string>
+ <text name="object_name" value="Nom d&apos;objet de test vraiment très long"/>
+ <text name="object_creator">
+ par secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ 300 000 L$
+ </text>
+ <text name="object_description">
+ Cette description d&apos;objet est vraiment très longue : elle compte au moins 80 caractères, voire plus de 120, vraiment très très longue. Who knows, really?
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Acheter" name="buy_btn"/>
+ <button label="Payer" name="pay_btn"/>
+ <button label="Prendre une copie" name="take_free_copy_btn"/>
+ <button label="Toucher" name="touch_btn"/>
+ <button label="M&apos;asseoir" name="sit_btn"/>
+ <button label="Ouvert" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navigation sécurisée"/>
+ <button label="Plus" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
new file mode 100644
index 0000000000..6d7cfadc04
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Nom d&apos;objet de test vraiment très long
+ </text>
+ <text name="object_owner_label" width="70">
+ Propriétaire :
+ </text>
+ <text name="object_owner">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text name="object_slurl_label">
+ Lieu :
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Carte" name="map_btn"/>
+ <button label="Ignorer" name="block_btn"/>
+ <button label="Fermer" name="close_btn"/>
+</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
new file mode 100644
index 0000000000..ccb93f129e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Voir le profil" name="Profile..."/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
+ <menu_item_call label="Ignorer" name="Avatar Mute"/>
+ <menu_item_call label="Signaler" name="abuse"/>
+ <menu_item_call label="Geler" name="Freeze..."/>
+ <menu_item_call label="Expulser" name="Eject..."/>
+ <menu_item_call label="Débogage" name="Debug..."/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+ <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
new file mode 100644
index 0000000000..999a1c156c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Toucher" name="Attachment Object Touch"/>
+ <menu_item_call label="Éditer" name="Edit..."/>
+ <menu_item_call label="Détacher" name="Detach"/>
+ <menu_item_call label="Lâcher" name="Drop"/>
+ <menu_item_call label="Me lever" name="Stand Up"/>
+ <menu_item_call label="Mon apparence" name="Appearance..."/>
+ <menu_item_call label="Mes amis" name="Friends..."/>
+ <menu_item_call label="Mes groupes" name="Groups..."/>
+ <menu_item_call label="Mon profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml
new file mode 100644
index 0000000000..3bac25c79b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Voir le profil" name="Show Profile"/>
+ <menu_item_call label="Envoyer IM..." name="Send IM"/>
+ <menu_item_call label="Devenir amis..." name="Add Friend"/>
+ <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
new file mode 100644
index 0000000000..289912cd05
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Voir le profil" name="Profile..."/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Inviter dans le groupe" name="Invite..."/>
+ <menu_item_call label="Ignorer" name="Avatar Mute"/>
+ <menu_item_call label="Signaler" name="abuse"/>
+ <menu_item_call label="Geler" name="Freeze..."/>
+ <menu_item_call label="Expulser" name="Eject..."/>
+ <menu_item_call label="Débogage" name="Debug..."/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
new file mode 100644
index 0000000000..e370e8d3b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Me lever" name="Stand Up"/>
+ <context_menu label="Enlever â–¶" name="Take Off &gt;">
+ <context_menu label="Habits â–¶" name="Clothes &gt;">
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chaussettes" name="Socks"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Sous-vêtements (homme)" name="Self Undershirt"/>
+ <menu_item_call label="Sous-vêtements (femme)" name="Self Underpants"/>
+ <menu_item_call label="Tatouage" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Tous les habits" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Détacher ▶" name="Object Detach"/>
+ <menu_item_call label="Tout détacher" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Mon apparence" name="Appearance..."/>
+ <menu_item_call label="Mes amis" name="Friends..."/>
+ <menu_item_call label="Mes groupes" name="Groups..."/>
+ <menu_item_call label="Mon profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
new file mode 100644
index 0000000000..3229940980
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
+ <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
+ <menu_item_check label="Bouton Afficher" name="ShowCameraButton"/>
+ <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
+ <menu_item_call label="Couper" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copier" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Coller" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Supprimer" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Tout sélectionner" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_favorites.xml b/indra/newview/skins/default/xui/fr/menu_favorites.xml
new file mode 100644
index 0000000000..5f1545fde7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Téléporter" name="Teleport To Landmark"/>
+ <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
+ <menu_item_call label="Copier la SLurl" name="Copy slurl"/>
+ <menu_item_call label="Voir sur la carte" name="Show On Map"/>
+ <menu_item_call label="Copier" name="Landmark Copy"/>
+ <menu_item_call label="Coller" name="Landmark Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml b/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml
new file mode 100644
index 0000000000..02d734045a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Ajouter/Supprimer des Favoris" name="activate"/>
+ <menu_item_call label="Copier" name="copy_gesture"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Copier l&apos;UUID" name="copy_uuid"/>
+ <menu_item_call label="Enregistrer dans la tenue actuelle" name="save_to_outfit"/>
+ <menu_item_call label="Éditer" name="edit_gesture"/>
+ <menu_item_call label="Inspecter" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
new file mode 100644
index 0000000000..f5882261b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Rejoignez des groupes..." name="item_join"/>
+ <menu_item_call label="Nouveau groupe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
new file mode 100644
index 0000000000..3a7126fe50
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Afficher la barre des Favoris" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_im_well_button.xml b/indra/newview/skins/default/xui/fr/menu_im_well_button.xml
new file mode 100644
index 0000000000..8ef1529e6b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Tout fermer" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/fr/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..4d9a103058
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/fr/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..59f97d8b48
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Profil du groupe" name="Show Profile"/>
+ <menu_item_call label="Afficher la session" name="Chat"/>
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/fr/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..ecc8cee413
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Voir le profil" name="Show Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="Afficher la session" name="Send IM"/>
+ <menu_item_call label="Mettre fin à la session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..e5746dd4c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Voir le profil" name="view_profile"/>
+ <menu_item_call label="Devenir amis" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Appeler" name="call"/>
+ <menu_item_call label="Téléporter" name="teleport"/>
+ <menu_item_call label="Inviter dans le groupe" name="invite_to_group"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
+ <menu_item_call label="Signaler" name="report"/>
+ <menu_item_call label="Geler" name="freeze"/>
+ <menu_item_call label="Expulser" name="eject"/>
+ <menu_item_call label="Débogage" name="debug"/>
+ <menu_item_call label="Situer sur la carte" name="find_on_map"/>
+ <menu_item_call label="Zoomer en avant" name="zoom_in"/>
+ <menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Partager" name="share"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..0ecce069bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Toucher" name="touch"/>
+ <menu_item_call label="M&apos;asseoir" name="sit"/>
+ <menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Acheter" name="buy"/>
+ <menu_item_call label="Prendre" name="take"/>
+ <menu_item_call label="Prendre une copie" name="take_copy"/>
+ <menu_item_call label="Ouvrir" name="open"/>
+ <menu_item_call label="Éditer" name="edit"/>
+ <menu_item_call label="Porter" name="wear"/>
+ <menu_item_call label="Signaler" name="report"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Zoomer en avant" name="zoom_in"/>
+ <menu_item_call label="Supprimer" name="remove"/>
+ <menu_item_call label="En savoir plus" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..d28d36bca7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Me lever" name="stand_up"/>
+ <menu_item_call label="Mon apparence" name="my_appearance"/>
+ <menu_item_call label="Mon profil" name="my_profile"/>
+ <menu_item_call label="Mes amis" name="my_friends"/>
+ <menu_item_call label="Mes groupes" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index ce347afe89..2f6f25dc6b 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Nouveau script" name="New Script"/>
<menu_item_call label="Nouvelle note" name="New Note"/>
<menu_item_call label="Nouveau geste" name="New Gesture"/>
- <menu name="New Clothes">
+ <menu label="Nouveaux habits" name="New Clothes">
<menu_item_call label="Nouvelle chemise" name="New Shirt"/>
<menu_item_call label="Nouveau pantalon" name="New Pants"/>
<menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
@@ -20,42 +20,60 @@
<menu_item_call label="Nouvelle veste" name="New Jacket"/>
<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
<menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveau tricot" name="New Undershirt"/>
- <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
<menu_item_call label="Nouvelle peau" name="New Skin"/>
<menu_item_call label="Nouveaux cheveux" name="New Hair"/>
<menu_item_call label="Nouveaux yeux" name="New Eyes"/>
</menu>
+ <menu label="Changer de type" name="Change Type">
+ <menu_item_call label="Défaut" name="Default"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Silhouette" name="Shape"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Caleçon" name="Underpants"/>
+ <menu_item_call label="Débardeur" name="Undershirt"/>
+ </menu>
<menu_item_call label="Téléporter" name="Landmark Open"/>
<menu_item_call label="Ouvrir" name="Animation Open"/>
<menu_item_call label="Ouvrir" name="Sound Open"/>
+ <menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/>
+ <menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/>
+ <menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/>
<menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
<menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
+ <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Ouvrir" name="Open"/>
<menu_item_call label="Propriétés" name="Properties"/>
<menu_item_call label="Renommer" name="Rename"/>
<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
<menu_item_call label="Copier" name="Copy"/>
<menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Coller comme lien" name="Paste As Link"/>
+ <menu_item_call label="Supprimer le lien" name="Remove Link"/>
<menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Enlever les objets" name="Take Off Items"/>
- <menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit"/>
- <menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit"/>
+ <menu_item_call label="Supprimer le dossier système" name="Delete System Folder"/>
<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
<menu_item_call label="Jouer" name="Sound Play"/>
- <menu_item_call label="Au sujet du repère" name="Teleport To Landmark"/>
- <menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
+ <menu_item_call label="À propos du repère" name="About Landmark"/>
+ <menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
<menu_item_call label="Jouer localement" name="Animation Audition"/>
<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
<menu_item_call label="Activer" name="Activate"/>
<menu_item_call label="Désactiver" name="Deactivate"/>
+ <menu_item_call label="Enregistrer sous" name="Save As"/>
<menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
- <menu_item_call label="Remettre dans le dernier emplacement" name="Restore to Last Position"/>
<menu_item_call label="Porter" name="Object Wear"/>
<menu label="Attacher à" name="Attach To"/>
<menu label="Attacher au HUD " name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
new file mode 100644
index 0000000000..0e5abdad0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Importer" name="upload">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nouveau dossier" name="New Folder"/>
+ <menu_item_call label="Nouveau script" name="New Script"/>
+ <menu_item_call label="Nouvelle note" name="New Note"/>
+ <menu_item_call label="Nouveau geste" name="New Gesture"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveaux sous-vêtements (homme)" name="New Undershirt"/>
+ <menu_item_call label="Nouveaux sous-vêtements (femme)" name="New Underpants"/>
+ <menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..91bccfd699
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
+ <menu_item_call label="Trier par nom" name="sort_by_name"/>
+ <menu_item_call label="Trier en commençant par le plus récent" name="sort_by_recent"/>
+ <menu_item_call label="Afficher les filtres" name="show_filters"/>
+ <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
+ <menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
+ <menu_item_call label="Vider la corbeille" name="empty_trash"/>
+ <menu_item_call label="Vider les Objets trouvés" name="empty_lostnfound"/>
+ <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>
+ <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
+ <menu_item_call label="Trouver tous les liens" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_land.xml b/indra/newview/skins/default/xui/fr/menu_land.xml
new file mode 100644
index 0000000000..80cc49aa42
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="À propos des terrains" name="Place Information..."/>
+ <menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
+ <menu_item_call label="Acheter ce terrain" name="Land Buy"/>
+ <menu_item_call label="Acheter un pass" name="Land Buy Pass"/>
+ <menu_item_call label="Construire" name="Create"/>
+ <menu_item_call label="Modifier le terrain" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_landmark.xml b/indra/newview/skins/default/xui/fr/menu_landmark.xml
new file mode 100644
index 0000000000..2e0cafa227
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copier la SLurl" name="copy"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Créer une préférence" name="pick"/>
+ <menu_item_call label="Ajouter à la barre des Favoris" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index 212216f16f..fc42b02908 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -1,13 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Fichier" name="File">
- <menu_item_call label="Quitter" name="Quit" />
- </menu>
- <menu label="Édition" name="Edit">
- <menu_item_call label="Préférences..." name="Preferences..." />
+ <menu label="Moi" name="File">
+ <menu_item_call label="Préférences" name="Preferences..."/>
+ <menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aide" name="Help">
- <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help" />
- <menu_item_call label="À propos de [APP_NAME]..." name="About Second Life..." />
+ <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Débogage" name="Debug">
+ <menu label="Éditer" name="Edit">
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Dupliquer" name="Duplicate"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+ <menu_item_call label="Désélectionner" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
+ <menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/>
+ <menu_item_call label="Outil d&apos;aperçu XUI" name="UI Preview Tool"/>
+ <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 du navigateur Web" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
index 36107885f4..a9facb2c30 100644
--- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
+ <menu_item_check label="Faire pivoter la carte" name="Rotate Map"/>
<menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
- <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Carte du monde" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_navbar.xml b/indra/newview/skins/default/xui/fr/menu_navbar.xml
new file mode 100644
index 0000000000..08d810b653
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/>
+ <menu_item_check label="Afficher les propriétés de la parcelle" name="Show Parcel Properties"/>
+ <menu_item_call label="Repère" name="Landmark"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_nearby_chat.xml b/indra/newview/skins/default/xui/fr/menu_nearby_chat.xml
new file mode 100644
index 0000000000..99e22aeff7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Afficher les personnes près de vous..." name="nearby_people"/>
+ <menu_item_check label="Afficher le texte ignoré" name="muted_text"/>
+ <menu_item_check label="Afficher les icônes des Buddy" name="show_buddy_icons"/>
+ <menu_item_check label="Afficher les noms" name="show_names"/>
+ <menu_item_check label="Afficher les icônes et les noms" name="show_icons_and_names"/>
+ <menu_item_call label="Taille de la police" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_notification_well_button.xml b/indra/newview/skins/default/xui/fr/menu_notification_well_button.xml
new file mode 100644
index 0000000000..323bfdbf16
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Tout fermer" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml
new file mode 100644
index 0000000000..1837be9c5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Toucher" name="Object Touch"/>
+ <menu_item_call label="Éditer" name="Edit..."/>
+ <menu_item_call label="Construire" name="Build"/>
+ <menu_item_call label="Ouvrir" name="Open"/>
+ <menu_item_call label="M&apos;asseoir ici" name="Object Sit"/>
+ <menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <context_menu label="Porter â–¶" name="Put On">
+ <menu_item_call label="Porter" name="Wear"/>
+ <context_menu label="Attacher â–¶" name="Object Attach"/>
+ <context_menu label="Attacher les éléments HUD ▶" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Supprimer â–¶" name="Remove">
+ <menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
+ <menu_item_call label="Ignorer" name="Object Mute"/>
+ <menu_item_call label="Retour" name="Return..."/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Prendre" name="Pie Object Take"/>
+ <menu_item_call label="Prendre une copie" name="Take Copy"/>
+ <menu_item_call label="Payer" name="Pay..."/>
+ <menu_item_call label="Acheter" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_object_icon.xml b/indra/newview/skins/default/xui/fr/menu_object_icon.xml
new file mode 100644
index 0000000000..69f8e88a0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Profil de l&apos;objet..." name="Object Profile"/>
+ <menu_item_call label="Ignorer..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_participant_list.xml b/indra/newview/skins/default/xui/fr/menu_participant_list.xml
new file mode 100644
index 0000000000..c8f5b5f1ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_participant_list.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Trier par nom" name="SortByName"/>
+ <menu_item_check label="Trier par intervenants récents" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Voir le profil" name="View Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Payer" name="Pay"/>
+ <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/>
+ <menu_item_check label="Ignorer le texte" name="MuteText"/>
+ <context_menu label="Options du modérateur &gt;" name="Moderator Options">
+ <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/>
+ <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Ignorer tous les autres" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Ne plus ignorer tous les autres" name="ModerateVoiceUnMuteOthers"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..5adf8714cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <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_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups.xml b/indra/newview/skins/default/xui/fr/menu_people_groups.xml
new file mode 100644
index 0000000000..eb51b4cf7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Afficher les infos" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Activer" name="Activate"/>
+ <menu_item_call label="Quitter" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..34f949cf2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/>
+ <menu_item_call label="Quitter le groupe sélectionné" name="Leave Selected Group"/>
+</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
new file mode 100644
index 0000000000..08a97ee403
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Voir le profil" name="View Profile"/>
+ <menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="Supprimer cet ami" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="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="Proposer une téléportation" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..18ae84a67b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Devenir amis" name="Add Friends"/>
+ <menu_item_call label="Supprimer des amis" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Partager" name="Share"/>
+ <menu_item_call label="Payer" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..45f97e062e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <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_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..93b90ae61c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/>
+ <menu_item_check label="Trier par nom" name="sort_name"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
+ <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_picks.xml b/indra/newview/skins/default/xui/fr/menu_picks.xml
new file mode 100644
index 0000000000..adb1cec8f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Infos" name="pick_info"/>
+ <menu_item_call label="Éditer" name="pick_edit"/>
+ <menu_item_call label="Téléporter" name="pick_teleport"/>
+ <menu_item_call label="Carte" name="pick_map"/>
+ <menu_item_call label="Supprimer" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_picks_plus.xml b/indra/newview/skins/default/xui/fr/menu_picks_plus.xml
new file mode 100644
index 0000000000..a3b4fb4f55
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Nouveau Favori" name="create_pick"/>
+ <menu_item_call label="Nouvelle petite annonce" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_place.xml b/indra/newview/skins/default/xui/fr/menu_place.xml
new file mode 100644
index 0000000000..beaf37011f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Enregistrer comme repère" name="landmark"/>
+ <menu_item_call label="Créer une préférence" name="pick"/>
+ <menu_item_call label="Acheter un pass" name="pass"/>
+ <menu_item_call label="Éditer" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_place_add_button.xml b/indra/newview/skins/default/xui/fr/menu_place_add_button.xml
new file mode 100644
index 0000000000..92f9e7719d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..3570bdec7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Couper" name="cut"/>
+ <menu_item_call label="Copier" name="copy_folder"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Renommer" name="rename"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Agrandir" name="expand"/>
+ <menu_item_call label="Réduire" name="collapse"/>
+ <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
+ <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
+ <menu_item_check label="Trier par date" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..2ad007c142
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Téléporter" name="teleport"/>
+ <menu_item_call label="Plus d&apos;informations" name="more_info"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Ajouter un repère" name="add_landmark"/>
+ <menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Couper" name="cut"/>
+ <menu_item_call label="Copier le repère" name="copy_landmark"/>
+ <menu_item_call label="Copier la SLurl" name="copy_slurl"/>
+ <menu_item_call label="Coller" name="paste"/>
+ <menu_item_call label="Renommer" name="rename"/>
+ <menu_item_call label="Supprimer" name="delete"/>
+ <menu_item_call label="Développer tous les dossiers" name="expand_all"/>
+ <menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
+ <menu_item_check label="Trier par date" name="sort_by_date"/>
+ <menu_item_call label="Créer une préférence" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ab5016465d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Partager" name="share"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
+ <menu_item_call label="Éjecter" name="kick"/>
+ <menu_item_call label="Geler" name="freeze"/>
+ <menu_item_call label="Dégeler" name="unfreeze"/>
+ <menu_item_call label="Représentant du service consommateur" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_slurl.xml b/indra/newview/skins/default/xui/fr/menu_slurl.xml
index ebd042a38a..ddfa5c0849 100644
--- a/indra/newview/skins/default/xui/fr/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/fr/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="À propos de l&apos;URL" name="about_url" />
- <menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url" />
- <menu_item_call label="Voir sur la carte" name="show_on_map" />
+ <menu_item_call label="À propos de l&apos;URL" name="about_url"/>
+ <menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url"/>
+ <menu_item_call label="Carte" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/fr/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..3dea662cc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Développer tous les dossiers" name="Expand all folders"/>
+ <menu_item_call label="Réduire tous les dossiers" name="Collapse all folders"/>
+ <menu_item_call label="Effacer l&apos;historique des téléportations" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/fr/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..fb4582dbce
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Téléporter" name="Teleport"/>
+ <menu_item_call label="Plus d&apos;informations" name="More Information"/>
+ <menu_item_call label="Copier dans le presse-papiers" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/fr/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..369680985d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Ouvrir" name="TabOpen"/>
+ <menu_item_call label="Fermer" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_text_editor.xml b/indra/newview/skins/default/xui/fr/menu_text_editor.xml
new file mode 100644
index 0000000000..b6f429aec9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml
new file mode 100644
index 0000000000..5ed627fbc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir le profil du résident" name="show_agent"/>
+ <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_group.xml b/indra/newview/skins/default/xui/fr/menu_url_group.xml
new file mode 100644
index 0000000000..de90c3ff7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir le profil du groupe" name="show_group"/>
+ <menu_item_call label="Copier le groupe dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_http.xml b/indra/newview/skins/default/xui/fr/menu_url_http.xml
new file mode 100644
index 0000000000..5e96352999
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ouvrir la page Web" name="url_open"/>
+ <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/>
+ <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/>
+ <menu_item_call label="Copier l&apos;URL dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_inventory.xml b/indra/newview/skins/default/xui/fr/menu_url_inventory.xml
new file mode 100644
index 0000000000..8ab88b4be7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher l&apos;article d&apos;inventaire" name="show_item"/>
+ <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_map.xml b/indra/newview/skins/default/xui/fr/menu_url_map.xml
new file mode 100644
index 0000000000..67e6986f5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_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
new file mode 100644
index 0000000000..f581c3ef9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur l&apos;objet" name="show_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"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml
new file mode 100644
index 0000000000..07b0eeca49
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_slapp.xml b/indra/newview/skins/default/xui/fr/menu_url_slapp.xml
new file mode 100644
index 0000000000..f4b7e212ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Exécuter cette commande" name="run_slapp"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml
new file mode 100644
index 0000000000..e44943cf15
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml
new file mode 100644
index 0000000000..a5075a2740
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Me téléporter à cet endroit." name="teleport"/>
+ <menu_item_call label="Voir sur la carte" name="show_on_map"/>
+ <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index ea28b82d7e..21f39682ba 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,219 +1,413 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Fichier" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Importer" name="upload">
- <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Définir les droits par défaut..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Fermer la fenêtre" name="Close Window"/>
- <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Enregistrer la texture sous..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Prendre une photo" name="Take Snapshot"/>
- <menu_item_call label="Enregistrer la photo sur le disque" name="Snapshot to Disk" shortcut="control|shift|X"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Quitter" name="Quit"/>
- </menu>
- <menu label="Édition" name="Edit">
- <menu_item_call label="Annuler" name="Undo"/>
- <menu_item_call label="Recommencer" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Rechercher..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
- <menu_item_call label="Désélectionner" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Dupliquer" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Attacher l&apos;objet" name="Attach Object"/>
- <menu label="Détacher l&apos;objet" name="Detach Object"/>
- <menu label="Enlever mes habits" name="Take Off Clothing">
- <menu_item_call label="Chemise" name="Shirt"/>
- <menu_item_call label="Pantalon" name="Pants"/>
- <menu_item_call label="Chaussures" name="Shoes"/>
- <menu_item_call label="Chaussettes" name="Socks"/>
- <menu_item_call label="Veste" name="Jacket"/>
- <menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Tricot" name="Menu Undershirt"/>
- <menu_item_call label="Sous-vêtements" name="Menu Underpants"/>
- <menu_item_call label="Jupe" name="Skirt"/>
- <menu_item_call label="Tous les habits" name="All Clothes"/>
+ <menu label="Moi" name="Me">
+ <menu_item_call label="Préférences" name="Preferences"/>
+ <menu_item_call label="Ma Page d&apos;accueil" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
+ </menu_item_call>
+ <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Mon profil" name="Profile"/>
+ <menu_item_call label="Mon apparence" name="Appearance"/>
+ <menu_item_check label="Mon inventaire" name="Inventory"/>
+ <menu_item_call label="Mon inventaire" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Mes gestes" name="Gestures"/>
+ <menu label="Mon statut" name="Status">
+ <menu_item_call label="Absent" name="Set Away"/>
+ <menu_item_call label="Occupé" name="Set Busy"/>
</menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gestes..." name="Gestures..."/>
- <menu_item_call label="Profil..." name="Profile..."/>
- <menu_item_call label="Apparence..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amis..." name="Friends..."/>
- <menu_item_call label="Groupes..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Préférences..." name="Preferences..."/>
+ <menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
+ <menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
+ <menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Affichage" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Vue subjective" name="Mouselook"/>
- <menu_item_check label="Construire" name="Build"/>
- <menu_item_check label="Vue au joystick" name="Joystick Flycam"/>
- <menu_item_call label="Réinitialiser l&apos;affichage" name="Reset View"/>
- <menu_item_call label="Regarder le dernier intervenant" name="Look at Last Chatter" shortcut="alt|V"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Barre d&apos;outils" name="Toolbar"/>
- <menu_item_check label="Chat local" name="Chat History"/>
- <menu_item_check label="Communiquer" name="Instant Message"/>
- <menu_item_check label="Inventaire" name="Inventory"/>
- <menu_item_check label="Intervenants actifs" name="Active Speakers"/>
- <menu_item_check label="Liste des ignorés" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Contrôles de la caméra" name="Camera Controls"/>
- <menu_item_check label="Contrôle des déplacements" name="Movement Controls"/>
- <menu_item_check label="Carte du monde" name="World Map"/>
- <menu_item_check label="Mini-carte" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Statistiques" name="Statistics Bar"/>
- <menu_item_check label="Limites des parcelles" name="Property Lines"/>
- <menu_item_check label="Barrières d&apos;interdiction d&apos;accès" name="Banlines"/>
- <menu_item_check label="Propriétaires fonciers" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Infobulles" name="Hover Tips">
- <menu_item_check label="Affichez les infobulles" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Infobulles des terrains" name="Land Tips"/>
- <menu_item_check label="Infobulles de tous les objets" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Voir les objets invisibles" name="Highlight Transparent"/>
- <menu_item_check label="Balises" name="beacons"/>
- <menu_item_check label="Masquer les particules" name="Hide Particles"/>
- <menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Zoomer" name="Zoom In"/>
- <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
- <menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/>
- <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
+ <menu label="Communiquer" name="Communicate">
+ <menu_item_call label="Mes amis" name="My Friends"/>
+ <menu_item_call label="Mes groupes" name="My Groups"/>
+ <menu_item_check label="Chat près de vous" name="Nearby Chat"/>
+ <menu_item_call label="Personnes près de vous" name="Active Speakers"/>
+ <menu_item_check label="Média près de vous" name="Nearby Media"/>
</menu>
<menu label="Monde" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Toujours courir" name="Always Run"/>
- <menu_item_check label="Voler" name="Fly" shortcut="F"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Créer un repère ici" name="Create Landmark Here"/>
- <menu_item_call label="Définir comme domicile" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
+ <menu_item_check label="Mini-carte" name="Mini-Map"/>
+ <menu_item_check label="Carte du monde" name="World Map"/>
+ <menu_item_call label="Photo" name="Take Snapshot"/>
+ <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
+ <menu label="Profil du lieu" name="Land">
+ <menu_item_call label="À propos des terrains" name="About Land"/>
+ <menu_item_call label="Région/Domaine" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="Acheter ce terrain" name="Buy Land"/>
+ <menu_item_call label="Mes terrains" name="My Land"/>
+ <menu label="Afficher" name="LandShow">
+ <menu_item_check label="Contrôles de mouvement" name="Movement Controls"/>
+ <menu_item_check label="Contrôles d&apos;affichage" name="Camera Controls"/>
+ </menu>
<menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Me mettre absent(e)" name="Set Away"/>
- <menu_item_call label="Me mettre occupé(e)" name="Set Busy"/>
- <menu_item_call label="Arrêter d&apos;animer mon avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Reprendre le contrôle" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Historique de mon compte..." name="Account History...">
- <menu_item_call.on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=fr"/>
- </menu_item_call>
- <menu_item_call label="Gérer mon compte..." name="Manage My Account...">
- <menu_item_call.on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
- </menu_item_call>
- <menu_item_call label="Acheter des L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mes terrains..." name="My Land..."/>
- <menu_item_call label="À propos du terrain..." name="About Land..."/>
- <menu_item_call label="Acheter le terrain..." name="Buy Land..."/>
- <menu_item_call label="Région et domaine..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Environnement" name="Environment Settings">
+ <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
+ <menu label="Luminosité" name="Environment Settings">
<menu_item_call label="Aube" name="Sunrise"/>
<menu_item_call label="Milieu de journée" name="Noon"/>
<menu_item_call label="Coucher de soleil" name="Sunset"/>
<menu_item_call label="Minuit" name="Midnight"/>
- <menu_item_call label="Revenir aux options par défaut" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Heure du domaine" name="Revert to Region Default"/>
<menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Outils" name="Tools">
- <menu label="Sélectionner un outil" name="Select Tool">
- <menu_item_call label="Mise au point" name="Focus"/>
- <menu_item_call label="Déplacer" name="Move"/>
- <menu_item_call label="Éditer" name="Edit"/>
- <menu_item_call label="Créer" name="Create"/>
- <menu_item_call label="Terrain" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
- <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
- <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
- <menu_item_check label="Afficher les parties cachées de la sélection" name="Show Hidden Selection"/>
- <menu_item_check label="Afficher la sphère de lumière de la sélection" name="Show Light Radius for Selection"/>
- <menu_item_check label="Afficher le faisceau de sélection" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Aligner sur la grille" name="Snap to Grid"/>
- <menu_item_call label="Aligner sur les axes XY de la grille" name="Snap Object XY to Grid"/>
- <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
- <menu_item_call label="Options de la grille..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/>
- <menu_item_call label="Lier" name="Link"/>
- <menu_item_call label="Délier" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Mise au point sur la sélection" name="Focus on Selection"/>
- <menu_item_call label="Zoom sur la sélection" name="Zoom to Selection"/>
- <menu_item_call label="Acheter l&apos;objet" name="Menu Object Take">
- <menu_item_call.on_enable parameter="Acheter,Prendre" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Prendre une copie" name="Take Copy"/>
- <menu_item_call label="Remplacer l&apos;objet dans le contenu de l&apos;objet" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Afficher la fenêtre d&apos;alertes/erreurs de script" name="Show Script Warning/Error Window"/>
- <menu label="Recompiler les scripts dans la sélection" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Réinitialiser les scripts dans la sélection" name="Reset Scripts in Selection"/>
- <menu_item_call label="Activer les scripts dans la sélection" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Désactiver les scripts dans la sélection" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Construire" name="BuildTools">
+ <menu_item_check label="Construire" name="Show Build Tools"/>
+ <menu label="Sélectionner l&apos;outil de construction" name="Select Tool">
+ <menu_item_call label="Outil de zoom" name="Focus"/>
+ <menu_item_call label="Outil de déplacement" name="Move"/>
+ <menu_item_call label="Outil de modification" name="Edit"/>
+ <menu_item_call label="Outil de création" name="Create"/>
+ <menu_item_call label="Outil Terrain" name="Land"/>
+ </menu>
+ <menu label="Édition" name="Edit">
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Dupliquer" name="Duplicate"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+ <menu_item_call label="Désélectionner" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Lien" name="Link"/>
+ <menu_item_call label="Annuler le lien" name="Unlink"/>
+ <menu_item_check label="Modifier les parties reliées" name="Edit Linked Parts"/>
+ <menu_item_call label="Point central sur la sélection" name="Focus on Selection"/>
+ <menu_item_call label="Zoomer sur la sélection" name="Zoom to Selection"/>
+ <menu label="Objet" name="Object">
+ <menu_item_call label="Acheter" name="Menu Object Take"/>
+ <menu_item_call label="Prendre une copie" name="Take Copy"/>
+ <menu_item_call label="Enregistrer dans mon inventaire" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Enregistrer dans le contenu des objets" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompiler les scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Recompiler les scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Réinitialiser les scripts" name="Reset Scripts"/>
+ <menu_item_call label="Définir les scripts sur Exécution" name="Set Scripts to Running"/>
+ <menu_item_call label="Définir les scripts sur Pas d&apos;exécution" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Options" name="Options">
+ <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
+ <menu_item_check label="Afficher les droits avancés" name="DebugPermissions"/>
+ <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
+ <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
+ <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
+ <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/>
+ <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/>
+ <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/>
+ <menu_item_call label="Fixer les coordonnées XY de l’objet sur la grille" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
+ <menu_item_call label="Options de la grille" name="Grid Options"/>
+ </menu>
+ <menu label="Sélectionner les parties relié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>
</menu>
<menu label="Aide" name="Help">
<menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Didacticiel" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog officiel..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Aide sur le LSL..." name="Scripting Portal...">
- <menu_item_call.on_click name="ScriptingPortal_url" userdata="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal/fr" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Signaler une infraction..." name="Report Abuse..."/>
- <menu_item_call label="Collisions, coups et bousculades…" name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Mesure du lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Signaler des bugs" name="Bug Reporting">
- <menu_item_call label="Ouvrir un JIRA..." name="Public Issue Tracker..."/>
- <menu_item_call label="Comment utiliser JIRA ?" name="Publc Issue Tracker Help...">
- <menu_item_call.on_click name="PublicIssueTrackerHelp_url" userdata="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker/fr" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Comment signaler des bugs ?" name="Bug Reporing 101...">
- <menu_item_call.on_click name="BugReporting101_url" userdata="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101/fr"/>
- </menu_item_call>
- <menu_item_call label="Comment signaler un problème de sécurité ?" name="Security Issues...">
- <menu_item_call.on_click name="SecurityIssues_url" userdata="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues/fr"/>
- </menu_item_call>
- <menu_item_call label="Wiki Assurance Qualité…" name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Signaler un bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="À propos de [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Signaler une infraction" name="Report Abuse"/>
+ <menu_item_call label="Signaler un bug" name="Report Bug"/>
+ <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Avancé" name="Advanced">
+ <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Refixer les textures" name="Rebake Texture"/>
+ <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
+ <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
+ <menu_item_check label="Limiter la distance de sélection" name="Limit Select Distance"/>
+ <menu_item_check label="Désactiver les contraintes de la caméra" name="Disable Camera Distance"/>
+ <menu_item_check label="Photo haute résolution" name="HighResSnapshot"/>
+ <menu_item_check label="Photos discrètes sur disque" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Compresser les photos sur disque" name="CompressSnapshotsToDisk"/>
+ <menu label="Outils de performance" name="Performance Tools">
+ <menu_item_call label="Mesure du lag" name="Lag Meter"/>
+ <menu_item_check label="Barre de statistiques" name="Statistics Bar"/>
+ <menu_item_check label="Afficher le coût de rendu de l&apos;avatar" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Surbrillance et visibilité" name="Highlighting and Visibility">
+ <menu_item_check label="Balise animée" name="Cheesy Beacon"/>
+ <menu_item_check label="Cacher les particules" name="Hide Particles"/>
+ <menu_item_check label="Masquer la sélection" name="Hide Selected"/>
+ <menu_item_check label="Mettre la transparence en surbrillance" name="Highlight Transparent"/>
+ <menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Afficher le réticule de la vue subjective" name="ShowCrosshairs"/>
+ <menu_item_check label="Afficher les info-bulles de terrain" name="Land Tips"/>
+ </menu>
+ <menu label="Types de rendu" name="Rendering Types">
+ <menu_item_check label="Simple" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Arbre" name="Tree"/>
+ <menu_item_check label="Avatars" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Ciel" name="Sky"/>
+ <menu_item_check label="Eau" name="Water"/>
+ <menu_item_check label="Sol" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Herbe" name="Grass"/>
+ <menu_item_check label="Nuages" name="Clouds"/>
+ <menu_item_check label="Particules" name="Particles"/>
+ <menu_item_check label="Placage de relief" name="Bump"/>
+ </menu>
+ <menu label="Fonctionnalités de rendu" name="Rendering Features">
+ <menu_item_check label="Interface" name="UI"/>
+ <menu_item_check label="Sélection" name="Selected"/>
+ <menu_item_check label="En surbrillance" name="Highlighted"/>
+ <menu_item_check label="Textures dynamiques" name="Dynamic Textures"/>
+ <menu_item_check label="Ombres des pieds" name="Foot Shadows"/>
+ <menu_item_check label="Brouillard" name="Fog"/>
+ <menu_item_check label="Tester FRInfo" name="Test FRInfo"/>
+ <menu_item_check label="Objets flexibles" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Exécuter plusieurs threads" name="Run Multiple Threads"/>
+ <menu_item_call label="Effacer le cache du groupe" name="ClearGroupCache"/>
+ <menu_item_check label="Effet de lissage de la souris" name="Mouse Smoothing"/>
+ <menu label="Raccourcis" name="Shortcuts">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
+ <menu_item_check label="Rechercher" name="Search"/>
+ <menu_item_call label="Relâcher les touches" name="Release Keys"/>
+ <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
+ <menu_item_check label="Toujours courir" name="Always Run"/>
+ <menu_item_check label="Voler" name="Fly"/>
+ <menu_item_call label="Fermer la fenêtre" name="Close Window"/>
+ <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
+ <menu_item_call label="Photo sur disque" name="Snapshot to Disk"/>
+ <menu_item_call label="Vue subjective" name="Mouselook"/>
+ <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Réinitialiser la vue" name="Reset View"/>
+ <menu_item_call label="Regarder la dernière conversation" name="Look at Last Chatter"/>
+ <menu label="Sélectionner l&apos;outil de construction" name="Select Tool">
+ <menu_item_call label="Outil de zoom" name="Focus"/>
+ <menu_item_call label="Outil de déplacement" name="Move"/>
+ <menu_item_call label="Outil de modification" name="Edit"/>
+ <menu_item_call label="Outil de création" name="Create"/>
+ <menu_item_call label="Outil Terrain" name="Land"/>
+ </menu>
+ <menu_item_call label="Zoomer en avant" name="Zoom In"/>
+ <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
+ <menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
+ <menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
+ <menu_item_check label="Afficher le menu Développeurs" name="Debug Mode"/>
+ </menu>
+ <menu label="Développeurs" name="Develop">
+ <menu label="Consoles" name="Consoles">
+ <menu_item_check label="Console de textures" name="Texture Console"/>
+ <menu_item_check label="Console de débogage" name="Debug Console"/>
+ <menu_item_call label="Console de notifications" name="Notifications"/>
+ <menu_item_check label="Console de tailles de textures" name="Texture Size"/>
+ <menu_item_check label="Console des catégories de textures" name="Texture Category"/>
+ <menu_item_check label="Chronos" name="Fast Timers"/>
+ <menu_item_check label="Mémoire" name="Memory"/>
+ <menu_item_call label="Infos de région vers la console de débogage" name="Region Info to Debug Console"/>
+ <menu_item_call label="Infos de groupe vers la console de débogage" name="Group Info to Debug Console"/>
+ <menu_item_call label="Infos de capacités vers la console de débogage" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Caméra" name="Camera"/>
+ <menu_item_check label="Vent" name="Wind"/>
+ <menu_item_check label="Angle de champ" name="FOV"/>
+ <menu_item_check label="Badge" name="Badge"/>
+ </menu>
+ <menu label="Afficher les infos" name="Display Info">
+ <menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
+ <menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/>
+ <menu_item_check label="Afficher les matrices" name="Show Matrices"/>
+ <menu_item_check label="Afficher la couleur sous le curseur" name="Show Color Under Cursor"/>
+ <menu_item_check label="Afficher les mises à jour des objets" name="Show Updates"/>
+ </menu>
+ <menu label="Forcer une erreur" name="Force Errors">
+ <menu_item_call label="Forcer le point de rupture" name="Force Breakpoint"/>
+ <menu_item_call label="Forcer LLError et plantage" name="Force LLError And Crash"/>
+ <menu_item_call label="Forcer un mauvais accès à la mémoire" name="Force Bad Memory Access"/>
+ <menu_item_call label="Forcer une boucle infinie" name="Force Infinite Loop"/>
+ <menu_item_call label="Forcer le plantage du driver" name="Force Driver Carsh"/>
+ <menu_item_call label="Forcer une exception logicielle" name="Force Software Exception"/>
+ <menu_item_call label="Forcer la déconnexion du client" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simuler une fuite de mémoire" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Tests de rendu" name="Render Tests">
+ <menu_item_check label="Décalage de la caméra" name="Camera Offset"/>
+ <menu_item_check label="Taux de défilement aléatoire" name="Randomize Framerate"/>
+ <menu_item_check label="Cadre lent périodique" name="Periodic Slow Frame"/>
+ <menu_item_check label="Test cadre" name="Frame Test"/>
+ </menu>
+ <menu label="Métadonnées de rendu" name="Render Metadata">
+ <menu_item_check label="Cadres" name="Bounding Boxes"/>
+ <menu_item_check label="Octree" name="Octree"/>
+ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Occlusion" name="Occlusion"/>
+ <menu_item_check label="Lots de rendu" name="Render Batches"/>
+ <menu_item_check label="Texture Anim" name="Texture Anim"/>
+ <menu_item_check label="Priorité de la texture" name="Texture Priority"/>
+ <menu_item_check label="Zone de texture" name="Texture Area"/>
+ <menu_item_check label="Zone de face" name="Face Area"/>
+ <menu_item_check label="Lumières" name="Lights"/>
+ <menu_item_check label="Squelette de collision" name="Collision Skeleton"/>
+ <menu_item_check label="Rayons" name="Raycast"/>
+ </menu>
+ <menu label="Rendu" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Tangente" name="Tangent Basis"/>
+ <menu_item_call label="Base des infos de la texture sélectionnée" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Filaire" name="Wireframe"/>
+ <menu_item_check label="Occlusion objet-objet" name="Object-Object Occlusion"/>
+ <menu_item_check label="Objets de mémoire vidéo" name="Framebuffer Objects"/>
+ <menu_item_check label="Rendu différé" name="Deferred Rendering"/>
+ <menu_item_check label="Illumination globale" name="Global Illumination"/>
+ <menu_item_check label="Débogage GL" name="Debug GL"/>
+ <menu_item_check label="Débogage pipeline" name="Debug Pipeline"/>
+ <menu_item_check label="Alpha rapide" name="Fast Alpha"/>
+ <menu_item_check label="Textures d&apos;animation" name="Animation Textures"/>
+ <menu_item_check label="Désactiver les textures" name="Disable Textures"/>
+ <menu_item_check label="Textures pleine résolution" name="Rull Res Textures"/>
+ <menu_item_check label="Audit Textures" name="Audit Textures"/>
+ <menu_item_check label="Atlas des textures" name="Texture Atlas"/>
+ <menu_item_check label="Rendu des lumières jointes" name="Render Attached Lights"/>
+ <menu_item_check label="Rendu des particules jointes" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Réseau" name="Network">
+ <menu_item_check label="Pauser l&apos;avatar" name="AgentPause"/>
+ <menu_item_call label="Activer le journal des messages" name="Enable Message Log"/>
+ <menu_item_call label="Désactiver le journal des messages" name="Disable Message Log"/>
+ <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Interpolation ping des positions des objets" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Abandonner un paquet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Dump caméra scriptée" name="Dump Scripted Camera"/>
+ <menu_item_call label="Collisions, coups et bousculades" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Enregistreur" name="Recorder">
+ <menu_item_call label="Commencer la lecture" name="Start Playback"/>
+ <menu_item_call label="Arrêter la lecture" name="Stop Playback"/>
+ <menu_item_check label="Lecture en boucle" name="Loop Playback"/>
+ <menu_item_call label="Commencer l&apos;enregistrement" name="Start Record"/>
+ <menu_item_call label="Arrêter l&apos;enregistrement" name="Stop Record"/>
+ </menu>
+ <menu label="Monde" name="World">
+ <menu_item_check label="Sim Sun Override" name="Sim Sun Override"/>
+ <menu_item_check label="Balise animée" name="Cheesy Beacon"/>
+ <menu_item_check label="Météo fixe" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Interface" name="UI">
+ <menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
+ <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"/>
+ <menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/>
+ <menu_item_call label="Imprimer les infos sur l&apos;objet sélectionné" name="Print Selected Object Info"/>
+ <menu_item_call label="Imprimer les infos sur l&apos;avatar" name="Print Agent Info"/>
+ <menu_item_call label="Statistiques de mémoire" name="Memory Stats"/>
+ <menu_item_check label="Double-ClickAuto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Débogage SelectMgr" name="Debug SelectMgr"/>
+ <menu_item_check label="Débogage clics" name="Debug Clicks"/>
+ <menu_item_check label="Débogage des vues" name="Debug Views"/>
+ <menu_item_check label="Débogage des info-bulles de noms" name="Debug Name Tooltips"/>
+ <menu_item_check label="Débogage des événements de souris" name="Debug Mouse Events"/>
+ <menu_item_check label="Débogage touches" name="Debug Keys"/>
+ <menu_item_check label="Débogage WindowProc" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Recharger les paramètres de couleurs" name="Reload Color Settings"/>
+ <menu_item_call label="Afficher le test de police" name="Show Font Test"/>
+ <menu_item_call label="Charger à partir de XML" name="Load from XML"/>
+ <menu_item_call label="Enregistrer en XML" name="Save to XML"/>
+ <menu_item_check label="Afficher les noms XUI" name="Show XUI Names"/>
+ <menu_item_call label="Envoyer des IM tests" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Récupérer la texture fixée" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Tête" name="Head"/>
+ <menu_item_call label="Haut du corps" name="Upper Body"/>
+ <menu_item_call label="Bas du corps" name="Lower Body"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ </menu>
+ <menu label="Tests personnages" name="Character Tests">
+ <menu_item_call label="Apparence dans XML" name="Appearance To XML"/>
+ <menu_item_call label="Basculer la géométrie des personnages" name="Toggle Character Geometry"/>
+ <menu_item_call label="Test homme" name="Test Male"/>
+ <menu_item_call label="Test femme" name="Test Female"/>
+ <menu_item_call label="Activer/désactiver PG" name="Toggle PG"/>
+ <menu_item_check label="Autoriser la sélection de l&apos;avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Forcer les paramètres par défaut" name="Force Params to Default"/>
+ <menu_item_check label="Infos sur l&apos;animation" name="Animation Info"/>
+ <menu_item_check label="Animations au ralenti" name="Slow Motion Animations"/>
+ <menu_item_check label="Afficher la direction du regard" name="Show Look At"/>
+ <menu_item_check label="Afficher la direction du pointeur" name="Show Point At"/>
+ <menu_item_check label="Débogages des mises à jour" name="Debug Joint Updates"/>
+ <menu_item_check label="Désactiver LOD" name="Disable LOD"/>
+ <menu_item_check label="Debogage Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Afficher le squelette de collision" name="Show Collision Skeleton"/>
+ <menu_item_check label="Afficher la cible de l&apos;avatar" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Dump Attachments" name="Dump Attachments"/>
+ <menu_item_call label="Débogage des textures des avatars" name="Debug Avatar Textures"/>
+ <menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="Textures HTTP" name="HTTP Textures"/>
+ <menu_item_call label="Compresser les images" name="Compress Images"/>
+ <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_check label="Afficher le menu Admin" name="View Admin Options"/>
+ <menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
+ <menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Prendre une copie" name="Take Copy"/>
+ <menu_item_call label="Forcer le propriétaire sur moi" name="Force Owner To Me"/>
+ <menu_item_call label="Forcer la permission du propriétaire" name="Force Owner Permissive"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Verrouiller" name="Lock"/>
+ <menu_item_call label="Obtenir les ID d&apos;actifs" name="Get Assets IDs"/>
+ </menu>
+ <menu label="Parcelle" name="Parcel">
+ <menu_item_call label="Forcer le propriétaire sur moi" name="Owner To Me"/>
+ <menu_item_call label="Définir sur le contenu Linden" name="Set to Linden Content"/>
+ <menu_item_call label="Réclamer un terrain public" name="Claim Public Land"/>
+ </menu>
+ <menu label="Région" name="Region">
+ <menu_item_call label="Dump Temp Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Enregistrer l&apos;état de la région" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Outils divins" name="God Tools"/>
+ </menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Joindre l&apos;objet" name="Attach Object"/>
+ <menu label="Détacher l&apos;objet" name="Detach Object"/>
+ <menu label="Me déshabiller" name="Take Off Clothing">
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chaussettes" name="Socks"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Sous-vêtements (homme)" name="Menu Undershirt"/>
+ <menu_item_call label="Sous-vêtements (femme)" name="Menu Underpants"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Alpha" name="Alpha"/>
+ <menu_item_call label="Tatouage" name="Tattoo"/>
+ <menu_item_call label="Tous les habits" name="All Clothes"/>
+ </menu>
+ <menu label="Aide" name="Help">
+ <menu_item_call label="Blog officiel des Linden" name="Official Linden Blog"/>
+ <menu_item_call label="Portail d&apos;écriture de scripts" name="Scripting Portal"/>
+ <menu label="Signaler des bugs" name="Bug Reporting">
+ <menu_item_call label="JIRA" name="Public Issue Tracker"/>
+ <menu_item_call label="Aide du JIRA" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Comment signaler des bugs" name="Bug Reporing 101"/>
+ <menu_item_call label="Problèmes de sécurité" name="Security Issues"/>
+ <menu_item_call label="Wiki sur l&apos;Assurance Qualité" name="QA Wiki"/>
+ </menu>
+ </menu>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/fr/mime_types_linux.xml b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
new file mode 100644
index 0000000000..fc5e7ad659
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenu web
+ </label>
+ <tooltip name="web_tooltip">
+ Cette parcelle propose du contenu web
+ </tooltip>
+ <playtip name="web_playtip">
+ Afficher le contenu web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Vous pouvez jouer un film ici
+ </tooltip>
+ <playtip name="movie_playtip">
+ Jouer le film
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <tooltip name="image_tooltip">
+ Cette parcelle contient une image
+ </tooltip>
+ <playtip name="image_playtip">
+ Afficher l&apos;image qui se trouve ici
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Cette parcelle propose du contenu audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Jouer le contenu audio qui se trouve ici
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Flux en temps réel
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Aucun -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Aucun -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vidéo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vidéo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Document PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Document Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Format RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ SMIL (Synchronized Multimedia Integration Language)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Page web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Page web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texte
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/fr/mime_types_mac.xml b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
new file mode 100644
index 0000000000..fc5e7ad659
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenu web
+ </label>
+ <tooltip name="web_tooltip">
+ Cette parcelle propose du contenu web
+ </tooltip>
+ <playtip name="web_playtip">
+ Afficher le contenu web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Vous pouvez jouer un film ici
+ </tooltip>
+ <playtip name="movie_playtip">
+ Jouer le film
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <tooltip name="image_tooltip">
+ Cette parcelle contient une image
+ </tooltip>
+ <playtip name="image_playtip">
+ Afficher l&apos;image qui se trouve ici
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Cette parcelle propose du contenu audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Jouer le contenu audio qui se trouve ici
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Flux en temps réel
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Aucun -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Aucun -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vidéo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vidéo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Document PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Document Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Format RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ SMIL (Synchronized Multimedia Integration Language)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Page web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Page web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texte
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index a38cf858e0..e122032447 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -9,74 +9,45 @@
<global name="implicitclosebutton">
Fermer
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Message d&apos;alerte inconnu" name="MissingAlert">
- Votre version de [APP_NAME] ne peut afficher ce message d&apos;erreur.
-
-Détails de l&apos;erreur : L&apos;alerte, appelée &apos;[_NAME]&apos; est introuvable dans notifications.xml.
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Message de notification inconnu" name="MissingAlert">
+ Votre version de [APP_NAME] ne peut afficher ce message de notification. Veuillez vous assurer que vous avez bien la toute dernière version du client.
+
+Détails de l&apos;erreur : La notification, appelée &apos;[_NAME]&apos;, est introuvable dans notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,13 +68,13 @@ Détails de l&apos;erreur : L&apos;alerte, appelée &apos;[_NAME]&apos; est int
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
</notification>
<notification name="BadInstallation">
- Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version depuis secondlife.com.
+ Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez [http://get.secondlife.com télécharger la dernière version] du client.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Erreur réseau : impossible d&apos;établir une connexion.
+ Connexion à [SECOND_LIFE_GRID] impossible.
&apos;[DIAGNOSTIC]&apos;
-Veuillez vérifier votre connexion.
+Veuillez vérifier votre connexion Internet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -134,14 +105,18 @@ Veuillez ne sélectionner qu&apos;un seul objet.
Enregistrer tous les changements dans les habits/parties du corps ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d&apos;ignorer leurs appels et leurs messages instantanés.
+ <usetemplate name="okbutton" yestext="Oui"/>
+ </notification>
<notification name="GrantModifyRights">
Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
-Souhaitez-vous accorder des droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
+Souhaitez-vous accorder des droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="GrantModifyRightsMultiple">
Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
-Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnés ?
+Souhaitez-vous accorder des droits d&apos;édition aux résidents sélectionnés ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="RevokeModifyRights">
@@ -171,7 +146,7 @@ Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnésÂ
Les membres ne peuvent pas être destitués de ce rôle.
Ils doivent donner eux-mêmes leur démission.
Êtes-vous certain de vouloir continuer ?
- <usetemplate ignoretext="Lorsque vous donnez à des membres du groupe le rôle de « propriétaire »" name="okcancelignore" notext="Non" yestext="Oui"/>
+ <usetemplate ignoretext="Confirmer avant d&apos;ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="AssignDangerousActionWarning">
Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
@@ -190,62 +165,31 @@ Ajouter ce pouvoir à « [ROLE_NAME] » ?
Ajouter ce pouvoir à « [ROLE_NAME] » ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Sélectionner l&apos;option Afficher dans la recherche
-En cochant cette case, votre parcelle apparaîtra :
-- dans les résultats de recherche ;
-- dans les objets publics ;
-- dans la recherche web.
- </notification>
- <notification name="ClickSoundHelpLand">
- La musique et le média ne peuvent être utilisés que sur cette parcelle. Les options Son et Voix peuvent être limités à la parcelle ou seront entendus par les résidents en dehors de la parcelle, en fonction de leur catégorie d&apos;accès. Souhaitez-vous en savoir plus sur le paramétrage de ces options ?
- <url name="url">
- http://wiki.secondlife.com/wiki/M%C3%A9dias_sur_la_parcelle_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
- </notification>
- <notification name="ClickSearchHelpAll">
- Les résultats de recherche sont organisés en fonction de l&apos;onglet dans lequel vous vous trouvez, votre catégorie d&apos;accès, la catégorie choisie, ainsi que d&apos;autres facteurs. Pour plus de détails, veuillez consulter les pages d&apos;aide.
- <url name="url">
- http://wiki.secondlife.com/wiki/FAQ_sur_la_recherche_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Cette parcelle ne peut pas apparaître dans la recherche car elle est dans une région où cela n&apos;est pas autorisé.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Si vous sélectionnez Afficher dans la recherche :
-- votre profil apparaîtra dans les résultats de recherche ;
-- un lien vers votre profil apparaîtra dans les pages de groupe publiques.
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Vous pouvez proposer à un autre résident de devenir votre partenaire ou dissoudre un partenariat existant à partir du site de [SECOND_LIFE].
-
-Aller sur le site de [SECOND_LIFE] pour avoir plus d&apos;informations sur les partenariats ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Aller sur cette page"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Il est possible que vos droits par défaut ne fonctionnent pas dans les anciennes régions.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Si ce résident a défini une URL de profil web, vous pouvez :
- * Cliquer sur Charger pour afficher la page dans cet onglet ;
- * Cliquer sur Charger &gt; Dans un navigateur externe, pour afficher la page dans votre navigateur par défaut ;
- * Cliquer sur Charger &gt; URL du domicile, pour retourner au profil web du résident.
-
-Lorsque vous êtes dans votre propre profil, vous pouvez définir n&apos;importe quelle URL comme profil web. Pour cela, saisissez l&apos;URL et cliquez sur OK.
-Les autres résidents peuvent visiter l&apos;URL que vous avez définie en regardant votre profil.
+ <notification name="AttachmentDrop">
+ Vous êtes sur le point d&apos;abandonner l&apos;élément joint.
+Voulez-vous vraiment continuer ?
+ <usetemplate ignoretext="Confirmez avant d&apos;abandonner les éléments joints." name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="JoinGroupCanAfford">
Rejoindre ce groupe coûte [COST] L$.
Voulez-vous continuer ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Vous vous apprêtez à rejoindre le groupe [NAME].
+Voulez-vous continuer ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Fusionner"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Rejoindre ce groupe coûte [COST] L$.
Vous n&apos;avez pas suffisamment de L$ pour rejoindre ce groupe.
</notification>
+ <notification name="CreateGroupCost">
+ La création de ce groupe coûte 100 L$.
+Les groupes doivent comporter plus d&apos;un membre, sinon ils sont supprimés.
+Veuillez inviter des membres d&apos;ici 48 heures.
+ <usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/>
+ </notification>
<notification name="LandBuyPass">
Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -260,10 +204,10 @@ Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- Attention : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région.
+ ATTENTION : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région.
Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
-Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
+Votre prix de vente sera de [SALE_PRICE]L$ et la vente sera disponible à [NAME].
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -323,6 +267,12 @@ Objets : [N]
Les dégâts sont autorisés dans toute la région.
Pour que les armes fonctionnent, les scripts doivent être autorisés.
</notification>
+ <notification name="MultipleFacesSelected">
+ Plusieurs faces sont sélectionnées.
+Si vous poursuivez cette action, des instances séparées du média seront définies sur plusieurs faces de l&apos;objet.
+Pour ne placer le média que sur une seule face, choisissez Sélectionner une face, cliquez sur la face de l&apos;objet de votre choix, puis sur Ajouter.
+ <usetemplate ignoretext="Le média sera défini sur plusieurs faces sélectionnées" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Pour définir le point d&apos;atterrissage, vous devez vous trouver à l&apos;intérieur de la parcelle.
</notification>
@@ -358,6 +308,10 @@ Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces join
<notification name="CannotWearTrash">
Vous ne pouvez pas porter d&apos;habits ni de parties du corps se trouvant dans la corbeille.
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Impossible de joindre l&apos;objet.
+La limite de [MAX_ATTACHMENTS] objets joints a été dépassée. Veuillez commencer par supprimer un objet joint existant.
+ </notification>
<notification name="CannotWearInfoNotComplete">
Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
</notification>
@@ -366,30 +320,45 @@ Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces join
Vous devez saisir le nom et le prénom de votre avatar.
Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=fr-FR
+ </url>
<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
</notification>
<notification name="AddClassified">
- Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche pendant une semaine.
+ Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine.
Rédigez votre annonce, puis cliquez sur Publier pour l&apos;ajouter à la liste des annonces.
Au moment de cliquer sur Publier, vous serez invité à payer des frais.
Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
- <usetemplate ignoretext="Lors de l&apos;ajout d&apos;une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Supprimer l&apos;annonce [NAME] ?
Une fois payés, les frais ne sont pas remboursables.
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Vous avez choisi de supprimer le média associé à cette face.
+Voulez-vous vraiment continuer ?
+ <usetemplate ignoretext="Confirmer avant de supprimer un média d&apos;un objet" name="okcancelignore" notext="Non" yestext="Oui"/>
+ </notification>
<notification name="ClassifiedSave">
Enregistrer les changements dans l&apos;annonce [NAME] ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Fonds insuffisants pour créer la petite annonce.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
Supprimer le favori [PICK] ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
Aller à la page web de [SECOND_LIFE] réservée aux événements ?
+ <url name="url">
+ http://secondlife.com/events/?lang=fr-FR
+ </url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -398,14 +367,6 @@ Une fois payés, les frais ne sont pas remboursables.
<notification name="SelectHistoryItemToView">
Veuillez sélectionner un historique.
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Voulez-vous désactiver tous les pop-ups qui peuvent être évités ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
- </notification>
<notification name="CacheWillClear">
Le cache sera vidé après le redémarrage de [APP_NAME].
</notification>
@@ -421,6 +382,9 @@ Remarque : cela videra le cache.
</notification>
<notification name="GoToAuctionPage">
Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="SaveChanges">
@@ -465,6 +429,11 @@ L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
<notification name="SaveBytecodeFailReason">
Une erreur est survenue lors de l&apos;enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
</notification>
+ <notification name="StartRegionEmpty">
+ Vous n&apos;avez pas défini de région de départ.
+Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Impossible de lancer ou d&apos;arrêter le script car l&apos;objet qui le contient est introuvable.
L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
@@ -476,28 +445,26 @@ L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
Impossible d&apos;écrire le fichier [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Avertissement : vous n&apos;avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d&apos;être moindre. Malheureusement, nous n&apos;offrons aucune assistance pour les problèmes de configuration système.
+ Votre ordinateur ne satisfait pas la configuration système requise pour [APP_NAME]. Les performances risquent d&apos;être médiocres. Malheureusement, la page [SUPPORT_SITE] n’offre aucune assistance pour les problèmes de configuration système.
MINSPECS
-Voulez-vous visiter [_URL] pour plus d&apos;informations ?
+Consulter [_URL] pour en savoir plus ?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=fr
</url>
- <usetemplate ignoretext="Lors de la détection de matériel non pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
+ <usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="UnknownGPU">
- Votre système contient une carte graphique que nous ne connaissons pas actuellement.
-Cela est souvent le cas avec le nouveau materiel qui n&apos;a pas encore été testé.
-Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques.
-(Menu Édition &gt; Préférences &gt; Graphiques).
+ Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas.
+Cela est souvent le cas avec le nouveau matériel qui n&apos;a pas encore été testé avec [APP_NAME]. Cela ne posera probablement pas de problème, mais vous devrez peut-être ajuster vos paramètres graphiques.
+(Moi &gt; Préférences &gt; Graphiques).
<form name="form">
- <ignore name="ignore" text="Lors de la détection d&apos;une carte graphique inconnue"/>
+ <ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
[APP_NAME] a planté lors de l&apos;initialisation des drivers graphiques.
-La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes.
-Certaines fonctionnalités graphiques seront donc désactivées.
+La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes. Certaines fonctionnalités graphiques seront donc désactivées.
Nous vous recommandons de mettre à jour les drivers de votre carte graphique.
La qualité des graphiques peut être augmentée à la section Préférences &gt; Graphiques
</notification>
@@ -550,6 +517,9 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
Expulser [AVATAR_NAME] de votre terrain ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Vous avez expulsé [AVATAR_NAME] du groupe [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
Erreur d&apos;acquisition : trop d&apos;objets sélectionnés.
</notification>
@@ -560,7 +530,10 @@ Veuillez mettre tous les objets que vous souhaitez acquérir dans la même régi
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
+Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=fr-FR
+ </url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -646,12 +619,19 @@ Assurez-vous que le fichier a l&apos;extension correcte.
Impossible de créer le fichier de sortie : [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Actuellement, nous ne prenons pas en charge le chargement de lots de fichiers d&apos;animation.
+ Actuellement, [APP_NAME] ne prend pas en charge le chargement de lots de fichiers d&apos;animation.
</notification>
<notification name="CannotUploadReason">
Impossible de charger [FILE] suite au problème suivant : [REASON]
Veuillez réessayer ultérieurement.
</notification>
+ <notification name="LandmarkCreated">
+ Vous avez ajouté [LANDMARK_NAME] à votre dossier [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Vous avez déjà un repère pour cet emplacement.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l&apos;autorise pas.
</notification>
@@ -674,6 +654,9 @@ Veuillez sélectionner des objets avec des scripts.
Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Impossible d&apos;ouvrir le script de l&apos;objet sans droits de modification.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
Impossible de définir les scripts sur « exécution ».
@@ -696,16 +679,16 @@ Recherche effectuée : [FINALQUERY]
Vos termes de recherche étaient trop courts et aucune recherche n&apos;a été effectuée.
</notification>
<notification name="CouldNotTeleportReason">
- Impossible de téléporter.
+ Échec de la téléportation.
[REASON]
</notification>
<notification name="invalid_tport">
- Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à la page suivante :
-www.secondlife.com/support
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
</notification>
<notification name="invalid_region_handoff">
- Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à la page suivante :
-www.secondlife.com/support
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
</notification>
<notification name="blocked_tport">
Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
@@ -747,7 +730,8 @@ aucune parcelle sélectionnée.
Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ?
+ Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé.
+Définir un propriétaire ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -786,7 +770,7 @@ aucune parcelle sélectionnée.
aucun groupe sélectionné.
</notification>
<notification name="CannotDeedLandNoRegion">
- Cession du terrain impossible :
+ Cession du terrain impossible :
la région dans laquelle il est situé est introuvable.
</notification>
<notification name="CannotDeedLandMultipleSelected">
@@ -795,14 +779,6 @@ plusieurs parcelles sélectionnées.
Essayez de ne sélectionner qu&apos;une seule parcelle.
</notification>
- <notification name="ParcelCanPlayMedia">
- Cette parcelle propose des flux média.
-Pour jouer des flux média, il faut avoir une connexion internet rapide.
-
-Jouer les flux média lorsqu&apos;ils sont disponibles ?
-(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Audio et vidéo.)
- <usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Cession du terrain impossible :
rapport de propriété sur le point d&apos;être envoyé par le serveur.
@@ -831,7 +807,7 @@ vous n&apos;avez pas le droit de libérer cette parcelle.
Les parcelles qui vous appartiennent sont en vert.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Impossible d&apos;abandonner le terrain :
+ Impossible d&apos;abandonner le terrain :
la région dans laquelle il est situé est introuvable.
</notification>
<notification name="CannotReleaseLandNoTransfer">
@@ -869,11 +845,11 @@ Diviser le terrain ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Division du terrain impossible :
+ Division du terrain impossible :
la région dans laquelle il est situé est introuvable.
</notification>
<notification name="CannotJoinLandNoRegion">
- Impossible de fusionner le terrain :
+ Impossible de fusionner le terrain :
la région dans laquelle il est situé est introuvable.
</notification>
<notification name="CannotJoinLandNothingSelected">
@@ -899,17 +875,6 @@ Vous devrez réinitialiser le nom et les options de la nouvelle parcelle.
Fusionner le terrain ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Afficher les propriétaires :
-La couleur des parcelles indique le type de propriété.
-
-Vert = votre terrain
-Turquoise = le terrain de votre groupe
-Rouge = appartenant à d&apos;autres
-Jaune = en vente
-Mauve = aux enchères
-Gris = public
- </notification>
<notification name="ConfirmNotecardSave">
Cette note doit être sauvegardée avant que l&apos;objet ne puisse être copié ou visualisé. Enregistrer la note ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -935,9 +900,8 @@ Gris = public
Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Vous avez été déconnecté(e) de [SECOND_LIFE] :
+ Zut. Vous avez été déconnecté(e) de [SECOND_LIFE]
[MESSAGE]
-Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -1087,29 +1051,42 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ La destination que vous avez choisie n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
</notification>
- <notification name="AvatarMoved">
- L&apos;emplacement [TYPE] n&apos;est pas disponible actuellement. [HELP]
-Vous avez été déplacé dans une région voisine.
+ <notification name="AvatarMovedLast">
+ Votre dernière destination n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
+ </notification>
+ <notification name="AvatarMovedHome">
+ La destination que vous avez choisie n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
+Nous vous conseillons de définir votre domicile ailleurs.
</notification>
<notification name="ClothingLoading">
- Vos habits sont toujours en train d&apos;être téléchargés.
-Vous pouvez utiliser [SECOND_LIFE] sans problème, les autres résidents vous voient normalement.
+ Vos habits sont en cours de téléchargement.
+Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement.
<form name="form">
- <ignore name="ignore" text="Lorsque les habits prennent longtemps à télécharger"/>
+ <ignore name="ignore" text="Vos habits prennent du temps à télécharger"/>
</form>
</notification>
<notification name="FirstRun">
L&apos;installation de [APP_NAME] est terminée.
-S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
-Retourner sur www.secondlife.com pour créer un nouveau compte ?
+Si vous utilisez [SECOND_LIFE] pour la première fois, vous devez ouvrir un compte avant de pouvoir vous connecter.
+Retourner sur [http://join.secondlife.com secondlife.com] pour ouvrir un nouveau compte ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Vous avez des problèmes à vous connecter. Il peut s&apos;agir d&apos;un problème avec votre connexion internet ou les serveurs de [SECOND_LIFE].
+ Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID].
-Nous vous conseillons de vérifier votre connexion Internet et de réessayer dans quelques minutes, de cliquer sur Aide, ou bien de cliquer sur Téléporter pour être téléporté vers votre domicile.
+Vérifiez votre connexion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
+ <url name="url">
+ http://fr.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Aide"/>
@@ -1129,10 +1106,10 @@ Vous pourrez revenir sur votre décision plus tard.
[NAME] [PRICE] L$ Vous n&apos;avez pas suffisamment de L$ pour faire cela.
</notification>
<notification name="GrantedModifyRights">
- Vous avez reçu le droit de modifier les objets de [FIRST_NAME] [LAST_NAME].
+ [NAME] vous a donné la permission de modifier ses objets.
</notification>
<notification name="RevokedModifyRights">
- Vous n&apos;avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME].
+ Vous n&apos;avez plus la permission de modifier les objets de [NAME]
</notification>
<notification name="FlushMapVisibilityCaches">
Cela videra le cache cartographique de cette région.
@@ -1213,7 +1190,7 @@ Veuillez choisir un objet à vendre et réessayer.
<notification name="DownloadWindowsMandatory">
Une nouvelle version de [APP_NAME] est disponible.
[MESSAGE]
-Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
+Pour utiliser [APP_NAME], vous devez télécharger cette mise à jour.
<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
</notification>
<notification name="DownloadWindows">
@@ -1228,12 +1205,30 @@ Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure perf
Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Une nouvelle version de [APP_NAME] est disponible.
+[MESSAGE]
+Pour utiliser [APP_NAME], vous devez télécharger cette mise à jour.
+ <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+ <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+ <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+ </notification>
<notification name="DownloadMacMandatory">
Une nouvelle version de [APP_NAME] est disponible.
[MESSAGE]
-Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
+Pour utiliser [APP_NAME], vous devez télécharger cette mise à jour.
-Télécharger vers le dossier Applications ?
+Télécharger vers le dossier Applications ?
<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
</notification>
<notification name="DownloadMac">
@@ -1241,7 +1236,7 @@ Télécharger vers le dossier Applications ?
[MESSAGE]
Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-Télécharger vers le dossier Applications ?
+Télécharger vers le dossier Applications ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
@@ -1249,55 +1244,51 @@ Télécharger vers le dossier Applications ?
[MESSAGE]
Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-Télécharger vers le dossier Applications ?
+Télécharger vers le dossier Applications ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
</notification>
<notification name="DeedObjectToGroup">
Si vous cédez cet objet, le groupe :
* recevra les L$ versés pour l&apos;objet ;
- <usetemplate ignoretext="Lors de la cession d&apos;objets au groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/>
+ <usetemplate ignoretext="Confirmer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Ouvrir votre navigateur web système pour afficher ce contenu ?
- <usetemplate ignoretext="Lors de l&apos;ouverture de votre navigateur système pour afficher une page web" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ 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="WebLaunchJoinNow">
- Aller sur www.secondlife.com pour gérer votre compte ?
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour gérer votre compte" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ 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"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE].
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter la page Wiki sur les problèmes de sécurité." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Consultez le Wiki sur l&apos;Assurance Qualité de [SECOND_LIFE].
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter la page Wiki sur l&apos;Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l&apos;Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE].
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter le JIRA" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Pour apprendre à utiliser JIRA, consultez le Wiki de [SECOND_LIFE].
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter la page Wiki sur le JIRA" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
+ <usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
</notification>
<notification name="WebLaunchSupportWiki">
Visitez le blog officiel des Lindens pour les dernières nouvelles et informations.
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
+ <usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Consulter le Guide guide pour l&apos;écriture de scripts pour obtenir de l&apos;aide ?
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour voir le Guide pour l&apos;écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ Voulez-vous ouvrir le guide pour l&apos;écriture de scripts ?
+ <usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l&apos;écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Consulter le Wiki LSL pour de l&apos;aide sur les scripts ?
- <usetemplate ignoretext="Lors de l&apos;ouverture du navigateur web pour consulter le Guide sur l&apos;écriture de scripts" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
+ Voulez-vous ouvrir le portail LSL pour l&apos;écriture de scripts ?
+ <usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
</notification>
<notification name="ReturnToOwner">
Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire.
*Avertissement* Les objets non transférables seront supprimés !
- <usetemplate ignoretext="Lors du renvoi d&apos;objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Vous êtes actuellement membre du groupe [GROUP].
@@ -1315,8 +1306,8 @@ Quitter le groupe ?
<notification name="CannotStartAuctionAlreadyForSale">
Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente. Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente.
</notification>
- <notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed">
- Vous ignorez déjà ce résident.
+ <notification label="L&apos;interdiction de l&apos;objet par nom a échoué." name="MuteByNameFailed">
+ Vous avez déjà interdit ce nom.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1332,17 +1323,19 @@ Quitter le groupe ?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- Mode occupé activé.
-Les chats et les messages instantanés ne s&apos;afficheront pas. Vous répondrez aux messages instantanés en utilisant la réponse automatique que vous avez créée. Toutes les propositions de téléportation seront refusées. Tous objets envoyés iront dans la corbeille.
- <usetemplate ignoretext="Lors de l&apos;utilisation du mode Occupé" name="okignore" yestext="OK"/>
+ Le mode Occupé est sélectionné.
+Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d&apos;inventaire iront dans la corbeille.
+ <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Vous appartenez déjà à un nombre élevé de groupes et nous ne pouvez pas en rejoindre un nouveau. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
-Pour quitter un groupe, sélectionnez l&apos;option Groupe dans le menu Éditer.
+ Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
[NAME] vous invite à rejoindre un groupe.
-[INVITE]
<usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Vous avez atteint le nombre de groupes maximum. Vous devez en quitter un avant d&apos;en rejoindre ou d&apos;en créer un nouveau.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
Éjecter cet utilisateur avec quel message ?
<form name="form">
@@ -1404,8 +1397,16 @@ Pour quitter un groupe, sélectionnez l&apos;option Groupe dans le menu Éditer.
</form>
</notification>
<notification name="TeleportFromLandmark">
- Êtes-vous certain de vouloir être téléporté ?
- <usetemplate ignoretext="Lors de la téléportation depuis un repère de l&apos;inventaire" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+ Souhaitez-vous vraiment vous téléporter vers &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; ?
+ <usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Vous téléporter vers [PICK] ?
+ <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Favoris" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Vous téléporter vers [CLASSIFIED] ?
+ <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans les Petites annonces" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
</notification>
<notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate">
Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
@@ -1481,9 +1482,9 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
- <usetemplate ignoretext="Lorsque l&apos;accès à une région est bloqué à cause de la catégorie d&apos;accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+ <usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
@@ -1491,17 +1492,12 @@ Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<notification name="RegionEntryAccessBlocked_Change">
Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
- <form name="form">
- <button
- name="OK"
- text="Modifier les Préférences"/>
- <button
- default="true"
- name="Cancel"
- text="Fermer"/>
- <ignore name="ignore" text="Lorsque l&apos;accès à une région est bloqué à cause des préférences concernant la catégorie d&apos;accès"/>
- </form>
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Moi &gt; Préférences &gt; Général.
+ <form name="form">
+ <button name="OK" text="Modifier les préférences"/>
+ <button default="true" name="Cancel" text="Fermer"/>
+ <ignore name="ignore" text="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de pénétrer dans une région"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
@@ -1514,9 +1510,9 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
- <usetemplate ignoretext="Lorsqu&apos;une région ne peut pas être réclamée à cause de la catégorie d&apos;accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+ <usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Votre catégorie d&apos;accès ne vous autorise pas à réclamer cette région.
@@ -1524,8 +1520,8 @@ Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<notification name="LandClaimAccessBlocked_Change">
Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région.
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
- <usetemplate ignoretext="Lorsqu&apos;une région ne peut pas être réclamée à cause des préférences concernant la catégorie d&apos;accès" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Moi &gt; Préférences &gt; Général.
+ <usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
</notification>
<notification name="LandBuyAccessBlocked">
Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
@@ -1538,9 +1534,9 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
- <usetemplate ignoretext="Lorsqu&apos;une région ne peut pas être achetée à cause de la catégorie d&apos;accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+ <usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région.
@@ -1548,11 +1544,12 @@ Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<notification name="LandBuyAccessBlocked_Change">
Votre catégorie d&apos;accès ne vous autorise pas à acheter cette région.
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
- <usetemplate ignoretext="Lorsqu&apos;une région ne peut pas être achetée à cause des préférences concernant la catégorie d&apos;accès" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Moi &gt; Préférences &gt; Général.
+ <usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche d&apos;acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer.&quot;
+ 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="ProblemImportingEstateCovenant">
Problème lors de l&apos;importation du règlement du domaine.
@@ -1566,6 +1563,7 @@ En cliquant sur Modifier les préférences, vous pourrez changer votre catégori
</notification>
<notification name="UnableToLoadNotecardAsset">
Impossible de charger les données de la note actuellement.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
Permissions pour afficher la note insuffisantes.
@@ -1582,11 +1580,11 @@ Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- Cette petite annonce contient-elle du contenu Mature ?
+ Cette petite annonce contient-elle du contenu Modéré ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="SetGroupMature">
- Ce groupe contient-il du contenu Mature ?
+ Ce groupe contient-il du contenu Modéré ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification label="Confirmer le redémarrage" name="ConfirmRestart">
@@ -1601,222 +1599,15 @@ Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
<button name="Cancel" text="Annuler"/>
</form>
</notification>
- <notification label="Interdire le terraformage" name="HelpRegionBlockTerraform">
- Si vous cochez cette case, les propriétaires ne pourront plus terraformer leur terrain, quel que soit le paramétrage individuel des parcelles.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Interdire le vol" name="HelpRegionBlockFly">
- Si vous cochez cette case, les résidents ne pourront plus voler dans cette région, quel que soit le paramétrage individuel des parcelles.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Modifications groupées des droits relatifs au contenu" name="HelpBulkPermission">
- L&apos;outil Modifications groupées des droits vous permet de modifier rapidement et simultanément les droits dans les contenus des objets séléctionnés. Notez toutefois que vous paramétrez uniquement les droits des objets dans les Contenus des objets sélectionnés, et non les droits sur les objets eux-mêmes.
-
-Notez aussi que les droits ne s&apos;appliquent pas aux contenus imbriqués dans les objets contenus. Votre requête ne porte que sur les objets de premier niveau.
-
-Vous pouvez sélectionner quels types d&apos;objets modifier à la section Types de contenu. Les photos sont incluses quand vous sélectionnez Textures.
-
-* Cet outil ne vous permettra de changer que les droits des objets que vous êtes autorisés à modifier.
-* Vous ne pouvez pas accorder de droits que vous n&apos;avez pas au prochain propriétaire.
-* Les droits accordés au prochain propriétaire de sont que des requêtes. Si un objet ne peut recevoir tous les nouveaux droits, aucun de ses droits ne changera.
-
-Lorsque vous êtes prêt à modifier tous les droits, cliquez sur Appliquer et attendez de voir s&apos;afficher les résultats.
-
-Si vous fermez la fenêtre des modifications groupées alors que les droits sont en train d&apos;être modifiés, vous suspendez l&apos;opération.
- </notification>
- <notification label="Autoriser les dégâts" name="HelpRegionAllowDamage">
- Si vous cochez cette case, les résidents peuvent subir des dégâts dans toute la région quel que soit le paramétrage individuel des parcelles. Si la case n&apos;est pas cochée, les propriétaires sont libres d&apos;activer ou non cette option sur leur parcelle.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Nombre maximum d&apos;avatars" name="HelpRegionAgentLimit">
- Définit le nombre maximum d&apos;avatars autorisés dans cette région.
-La performance peut varier en fonction du nombre d&apos;avatars présents.
-
-Valeur par défaut : 40
- </notification>
- <notification label="Bonus objet" name="HelpRegionObjectBonus">
- Le bonus objet est le multiplicateur de prims autorisées sur une parcelle donnée. L&apos;échelle autorisée est comprise entre 1 et 10. Lorsque ce chiffre est de 1, chaque parcelle de 512 m² peut contenir 117 prims. S&apos;il est de 2, chaque parcelle peut contenir 234 prims, ou deux fois plus, et ainsi de suite. Le nombre maximum de prims autorisées dans une région est de 15 000, quel que soit le bonus objet. Attention : si vous définissez un bonus objet et décidez ensuite de le diminuer, cela peut entraîner la suppression ou le renvoi d&apos;objets.
-
-Valeur par défaut : 1.0
- </notification>
- <notification label="Accès" name="HelpRegionMaturity">
- Définit la catégorie d&apos;accès de la région, telle qu&apos;affichée dans la barre de menu en haut du client et dans les infobulles de la carte lorsque vous passez votre curseur au-dessus de cette région. Ce paramètre affecte aussi l&apos;accès à cette région et les résultats de recherche. Les autres résidents ne peuvent pénétrer que dans les régions ou n&apos;afficher que les résultats de recherche ayant la même catégorie d&apos;accès que celle indiquée dans leurs Préférences.
-
-Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
- </notification>
- <notification label="Interdire les bousculades" name="HelpRegionRestrictPushObject">
- Cette case permet de restreindre les bousculades dans toute une région.
-Lorsqu&apos;elle est cochée, les résidents ne peuvent être bousculés que par d&apos;autres résidents ou par le propriétaire de la parcelle.
-(Bousculer fait référence à la fonction LSL llPushObjet().)
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Fusionner/Diviser des parcelles" name="HelpParcelChanges">
- Cette case permet de choisir si les parcelles n&apos;appartenant pas au gérant du domaine peuvent ou pas être fusionnées ou divisées.
-Si cette case n&apos;est pas cochée :
- * Seuls les propriétaires ou gérants de domaine peuvent fusionner ou diviser des parcelles.
- * Ils ne peuvent fusionner ou diviser que les parcelles du propriétaire,
- ou celles d&apos;un groupe dans lequel ils ont les pouvoirs nécessaires.
- Si cette case est cochée :
- * Tous les propriétaires peuvent fusionner ou diviser leurs parcelles.
- * Pour les parcelles appartenant à un groupe, les membres avec les pouvoirs nécessaires peuvent fusionner ou diviser les parcelles.
-
-Valeur par défaut : activée
- </notification>
- <notification label="Ne pas afficher dans la recherche" name="HelpRegionSearch">
- Si vous cochez cette option, les propriétaires ne pourront pas faire apparaître leurs parcelles dans les résultats de recherche.
-Valeur par défaut : désactivé
- </notification>
<notification label="Catégorie de la région modifiée" name="RegionMaturityChange">
- La catégorie d&apos;accès de cette région a été mise à jour.
+ Le niveau de maturité de cette région a été mis à jour.
Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
- </notification>
- <notification label="Revente de terrain" name="HelpRegionLandResell">
- Les propriétaires et gérants de domaine peuvent vendre n&apos;importe quel terrain appartenant au propriétaire du domaine.
-Si cette option n&apos;est pas cochée, les propriétaires ne peuvent pas revendre leur parcelle.
-Si cette option est cochée, les propriétaires sont libres de revendre leur parcelle.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Désactiver les scripts" name="HelpRegionDisableScripts">
- Lorsque la performance d&apos;une région est faible, cela peut venir d&apos;un script. Ouvrez la section Statistiques (Ctrl+Maj+1) et vérifiez le FPS Physique (Physics FPS) de la section Simulateur.
-Si le FPS est en dessous de 45, ouvrez la section Time située en fin de liste. Si le Script Time est au dessus de 25ms, cliquez sur le bouton Afficher les objets scriptés les plus consommateurs. Vous verrez le nom et l&apos;emplacement des scripts éventuellement à l&apos;origine du problème.
-
-Si vous cochez la case Désactiver les scripts et que vous appuyez sur Appliquer, tous les scripts de cette région seront temporairement désactivés. Vous devrez peut-être faire cela le temps d&apos;arriver à l&apos;endroit su script en cause. Une fois sur place, assurez-vous que le script est bien à l&apos;origine du problème. Pour cela, vous devrez peut-être contacter le propriétaire du script ou bien supprimer ou renvoyer l&apos;objet.
-Décochez la case Désactiver le script, puis cliquez sur Appliquer pour réactiver tous les scripts dans la région.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Désactiver les collisions" name="HelpRegionDisableCollisions">
- Des objets physiques peuvent fortement réduire les performances d&apos;une région.
-Ouvrez la barre de statistiques (Ctrl+Maj+1) et vérifiez le FPS Physique (Physics FPS) de la section Simulateur.
-Si le FPS est en dessous de 45, ouvrez la section Time située en fin de liste. Si le Script Time est au dessus de 25ms, cliquez sur le bouton Afficher les collisions les plus consommatrices.
-Vous verrez le nom et l&apos;emplacement des objets physiques éventuellement à l&apos;origine du problème.
-
-Si vous décochez la case Désactiver les collisions et que vous cliquez sur Appliquer, toutes les collisions entre objets seront désactivées. Vous pourrez avoir besoin de cette fonction le temps d&apos;arriver à l&apos;emplacement des objets en cause. Une fois sur place, vérifiez que l&apos;&apos;objet est bien responsable du problème (entre-t-il sans cesse en collision avec d&apos;autres objets ?) Pour cela, vous devrez peut-être contacter le propriétaire de l&apos;objet ou bien supprimer ou renvoyer l&apos;objet.
-Décochez la case Désactiver les collisions, puis cliquez sur le bouton Appliquer pour réactiver les collisions dans la région.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Désactiver la physique" name="HelpRegionDisablePhysics">
- L&apos;option Désactiver la physique est similaire à l&apos;option Désactiver les collisions sauf qu&apos;elle englobe tous les effets liés à la physique. Cela signifie que les objets n&apos;entreront plus en collision et que les avatars ne pourront plus bouger.
-
-Vous ne devriez utiliser cette option que lorsque l&apos;option Désactiver les collisions n&apos;améliore pas sufisamment la performance de la région pour résoudre un problème de physique ou trouver les objets entrant en collision.
-
-Une fois que vous avez fini, n&apos;oubliez pas de réactiver les propriétés physiques sinon les avatars ne pourront pas bouger.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Afficher les collisions les plus consommatrices" name="HelpRegionTopColliders">
- Montre une liste des objets générant le plus de collisions avec d&apos;autres objets. Ces objets peuvent ralentir les performances de votre région. Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Sim Time (Physics) pour voir si le temps du moteur physique est au dessus de 20 ms.
- </notification>
- <notification label="Afficher les objets scriptés les plus consommateurs" name="HelpRegionTopScripts">
- Dresse une liste des objets dont les scripts consomment le plus de ressources. Ces objets peuvent ralentir la performance de votre région.
-Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Script Time pour voir si le temps des scripts est au dessus de 25 ms.
- </notification>
- <notification label="Redémarrer la région" name="HelpRegionRestart">
- Redémarre le serveur en charge de la région après deux minutes d&apos;avertissement. Tous les résidents dans cette région seront déconnectés. Les données de la région seront sauvegardées et réapparaîtront au bout de 90 secondes.
-
-Le redémarrage de la région ne permet pas de résoudre la plupart des problèmes de performance. Les redémarrages ne doivent avoir lieu qu&apos;en dernier recours.
- </notification>
- <notification label="Niveau de l&apos;eau" name="HelpRegionWaterHeight">
- Il s&apos;agit de la hauteur de l&apos;eau en mètres.
-Si ce paramètre est différent de 20 et que vous avez de l&apos;eau adjacente au bord du monde ou de l&apos;eau « vide », il y aura un espace vide visible.
-
-
-Valeur par défaut : 20
- </notification>
- <notification label="Surélévation du terrain" name="HelpRegionTerrainRaise">
- Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent surélever leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.
-
-Valeur par défaut : 4
- </notification>
- <notification label="Abaisser le terrain" name="HelpRegionTerrainLower">
- Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent abaisser leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.
-
-Valeur par défaut : -4
- </notification>
- <notification label="Charger le terrain au format RAW" name="HelpRegionUploadRaw">
- Ce bouton permet de charger un fichier .RAW dans la région où vous vous trouvez.
-Ce fichier doit avoir les bonnes dimensions (RGB, 256 x 256) et 13 canaux. Le meilleur moyen de créer un fichier terrain est de télécharger le fichier RAW existant. Un bon moyen est de modifier le canal rouge (hauteur terrain) et de le charger.
-
-Le chargement peut prendre jusqu&apos;à 45 secondes. Veuillez noter que le chargement d&apos;un fichier terrain ne déplacera pas les objets qui se trouvent sur le terrain, mais seulement le terrain et les droits associés aux parcelles. Certains objets risquent d&apos;aller sous la terre.
-
-Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
- </notification>
- <notification label="Télécharger le terrain au format RAW" name="HelpRegionDownloadRaw">
- Ce bouton permet de télécharger un fichier contenant les données relatives à la hauteur du terrain, dimensions de la parcelle, les mises en vente ainsi que certains droits relatifs à la parcelle pour cette région. Lorsque vous ouvrez le fichier avec un programme tel que Photoshop, vous devez indiquer les dimensions du document qui sont les suivantes : RGB, 256 x 256 avec 13 canaux. Le fichier terrain ne peut pas être ouvert différemment.
-
-Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
- </notification>
- <notification label="Utiliser le soleil du domaine" name="HelpRegionUseEstateSun">
- Si vous cochez cette case, la position du soleil dans cette région sera la même que dans le reste du domaine.
-
-Valeur par défaut : activé
- </notification>
- <notification label="Soleil fixe" name="HelpRegionFixedSun">
- Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Figer le terrain" name="HelpRegionBakeTerrain">
- Ce bouton permet d&apos;enregistrer la forme actuelle du terrain comme nouvelle forme par défaut pour la région. Une fois figé, le terrain peut reprendre la forme enregistrée à partir de l&apos;option Rétablir le terrain à la section Modifer le terrain. Le terrain figé est aussi le point de référence pour les limites de surélévation et d&apos;abaissement.
- </notification>
- <notification label="Gérants du domaine" name="HelpEstateEstateManager">
- Un gérant de domaine est un résident chargé du contrôle de la région et des paramètres du domaine. Un gérant de domaine peut modifier tous les paramètres, mais ne peut pas charger, télécharger ni figer de terrain. Un des pouvoirs principaux du gérant est de bannir ou d&apos;autoriser un résident sur votre domaine.
-
-Seuls les propriétaires de domaine peuvent ajouter ou supprimer des gérants de domaine. Lorsque vous choisissez un gérant de domaine, prenez un résident en qui vous avez confiance car vous serez en quelque sorte responsable de ses actions.
- </notification>
- <notification label="Utiliser le temps universel" name="HelpEstateUseGlobalTime">
- Cette case permet au soleil de votre domaine de suivre la position du soleil sur les domaines Linden du continent.
-
-Valeur par défaut : activé
- </notification>
- <notification label="Soleil fixe" name="HelpEstateFixedSun">
- Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger.
- </notification>
- <notification label="Accès public" name="HelpEstateExternallyVisible">
- Cette option vous permet de choisir quels résidents d&apos;autres domaines peuvent pénétrer sur votre domaine sans devoir être ajoutés à la liste d&apos;accès.
-
-Valeur par défaut : activé
- </notification>
- <notification label="Autoriser la téléportation directe" name="HelpEstateAllowDirectTeleport">
- Lorsqu&apos;elle est cochée, cette option permet aux résidents d&apos;être téléportés à n&apos;importe quel endroit sur votre domaine. Lorsque cette option n&apos;est pas cochée, les résidents sont téléportés au téléhub le plus proche.
-
-Valeur par défaut : désactivé
- </notification>
- <notification label="Autoriser l&apos;accès" name="HelpEstateAllowResident">
- L&apos;accès à ce domaine sera réservé aux résidents figurant dans cette liste et aux groupes ci-dessous.
-Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
- </notification>
- <notification label="Autoriser l&apos;accès de groupe" name="HelpEstateAllowGroup">
- L&apos;accès à ce domaine sera réservé aux groupes figurant dans cette liste et aux résidents ci-dessous. Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
- </notification>
- <notification label="Adresse e-mail où signaler une infraction" name="HelpEstateAbuseEmailAddress">
- Si vous utilisez une adresse e-mail valide, les rapports d&apos;infraction de ce domaine iront à cette adresse.
-Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à Linden Lab uniquement.
- </notification>
- <notification label="Refuser l&apos;accès" name="HelpEstateBanResident">
- Les résidents figurant sur cette liste ne peuvent pas pénétrer sur votre domaine, quels que soient les autres paramètres.
- </notification>
- <notification label="Autoriser les chats vocaux" name="HelpEstateVoiceChat">
- Les parcelles de ce domaine peuvent avoir leurs propres canaux vocaux, ce qui permet aux résidents de communiquer avec leurs voisins.
-Valeur par défaut : désactivé
+Pour entrer dans les régions Adultes, le résident doit avoir vérifié son compte, que ce soit par vérification de l&apos;âge ou du mode de paiement.
</notification>
<notification label="Versions de voix non compatibles" name="VoiceVersionMismatch">
Cette version de [APP_NAME] n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement.
</notification>
- <notification label="Règlement du domaine" name="HelpEstateCovenant">
- Définir un règlement pour le domaine vous permet de vendre les parcelles de ce domaine. S&apos;il n&apos;y a pas de règlement, vous ne pouvez pas vendre le terrain. Si vous ne souhaitez pas indiquer de règlement ou donner de conseils aux acheteurs, laissez la section relative au règlement vide.
-
-Un règlement sert à communiquer des règles, des lignes directrices ou informations culturelles, ou simplement à expliquer vos attentes à un acheteur potentiel. Il peut s&apos;agir de régulations concernant la construction, les options de paiement ou tout autre information que vous souhaitez faire passer au résident avant que l&apos;achat n&apos;ait lieu.
-
-L&apos;acheteur est tenu d&apos;accepter le règlement en cochant une case avant de pouvoir finaliser l&apos;achat. Les règlements, lorsqu&apos;ils existent, apparaissent toujours dans la boîte de dialogue À propos du terrain.
- </notification>
<notification label="Impossible d&apos;acheter des objets" name="BuyObjectOneOwner">
Impossible d&apos;acheter simultanément des objets de propriétaires différents.
Veuillez ne sélectionner qu&apos;un seul objet.
@@ -1903,55 +1694,36 @@ vous avez mis à jour l&apos;emplacement de ce favori mais les autres détails r
Ces objets seront déplacés dans votre inventaire et non pas copiés.
Déplacer les objets de l&apos;inventaire ?
- <usetemplate ignoretext="Lors du transfert d&apos;un inventaire non copiable depuis des objets" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés.
L&apos;objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script.
Déplacer les objets de l&apos;inventaire ?
- <usetemplate ignoretext="Lors du transfert d&apos;un inventaire non copiable depuis des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Avertissement : l&apos;action du clic &apos;Payer l&apos;objet&apos; a été défini mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
+ Avertissement : l&apos;action du clic Payer l&apos;objet a été définie mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
<form name="form">
- <ignore name="ignore" text="Lors du paramétrage de la fonction Payer sur des objets sans événement monétaire"/>
+ <ignore name="ignore" text="Je définis l&apos;action du clic Payer l&apos;objet lorsque je construis un objet sans le script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
</notification>
<notification name="WebLaunchAccountHistory">
- Aller sur le site de [SECOND_LIFE] pour consulter l&apos;historique de votre compte ?
- <usetemplate ignoretext="Lors du chargement de la page web contenant l&apos;historique de votre compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Visiter les pages d&apos;aide de [SECOND_LIFE] ?
- <usetemplate ignoretext="Lors de la visite des pages d&apos;aide de [SECOND_LIFE]" name="okcancelignore" notext="Annuler" yestext="Aller"/>
+ Accéder à votre [http://secondlife.com/account/ Page d&apos;accueil] pour consulter l&apos;historique de votre compte ?
+ <usetemplate ignoretext="Lancer mon navigateur pour consulter l&apos;historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
</notification>
<notification name="ConfirmQuit">
Êtes-vous certain de vouloir quitter ?
- <usetemplate ignoretext="Lorsque vous quittez [APP_NAME]" name="okcancelignore" notext="Continuer" yestext="Quitter"/>
+ <usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
+ Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php Conditions d’utilisation] et aux [http://secondlife.com/corporate/cs.php Règles communautaires].
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab.
-
-Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s&apos;occuper de tous les rapports envoyés à partir de cette région. Linden Lab n&apos;enquêtera pas sur les rapports que vous envoyez à partir de cet endroit.
-
-Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine.
-(Les réglements sont visibles à partir du menu Monde &gt; À propos du terrain.)
-
-La résolution de ce rapport ne s&apos;applique qu&apos;à cette région ; L&apos;accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l&apos;accès à l&apos;ensemble de [SECOND_LIFE].
+Lorsqu&apos;elles sont signalées, toutes les infractions font l&apos;objet d&apos;une enquête et sont résolues.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
@@ -1979,9 +1751,9 @@ Les descriptions précises nous permettent de traiter les rapports plus rapideme
Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction :
-(1) Remplissez un rapport d&apos;infraction. Vous pouvez soumettre un rapport d&apos;infraction si vous pensez qu&apos;un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l&apos;encontre du résident non respectueux des Conditions d&apos;utilisation ou des règles de la communauté. Sachez toutefois que l&apos;équipe chargée des infractions ne supprimera pas de contenu à l&apos;intérieur de [SECOND_LIFE].
+(1) Remplissez un rapport d&apos;infraction. Vous pouvez soumettre un rapport d&apos;infraction si vous pensez qu&apos;un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l&apos;encontre du résident non respectueux des [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Conditions d&apos;utilisation] ou des [http://secondlife.com/corporate/cs.php Règles communautaires]. Sachez toutefois que l&apos;équipe chargée des infractions ne supprimera pas de contenu à l&apos;intérieur de [SECOND_LIFE].
-(2) Demandez à ce que du contenu à l&apos;intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d&apos;infraction valide, tel que fourni dans notre Règlement contre les violations des droit d&apos;auteurs (DMCA), à http://secondlife.com/corporate/dmca.php.
+(2) Demandez à ce que du contenu à l&apos;intérieur de Second Life soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d&apos;infraction valide, tel que fourni dans notre [http://secondlife.com/corporate/dmca.php Règlement contre les violations des droits d&apos;auteur].
Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits.
@@ -1997,7 +1769,7 @@ Linden Lab
Vous avez déjà un objet sur cette partie du corps.
Voulez-vous le remplacer par l&apos;objet sélectionné ?
<form name="form">
- <ignore name="ignore" save_option="true" text="Lors du remplacement de pièces-jointes existantes"/>
+ <ignore name="ignore" save_option="true" text="Remplacer une pièce jointe existante par l&apos;objet sélectionné"/>
<button ignore="Remplacer automatiquement" name="Yes" text="OK"/>
<button ignore="Ne jamais remplacer" name="No" text="Annuler"/>
</form>
@@ -2007,18 +1779,22 @@ Voulez-vous le remplacer par l&apos;objet sélectionné ?
Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
<form name="form">
- <ignore name="ignore" save_option="true" text="Lorsque vous envoyez de l&apos;argent à une personne en mode Occupé"/>
+ <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/>
<button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/>
<button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Le dossier [FOLDERNAME] est un dossier système. La suppression d&apos;un dossier système peut provoquer une instabilité. Voulez-vous vraiment le supprimer ?
+ <usetemplate ignoretext="Confirmer avant la suppression d&apos;un dossier système" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente  ?
- <usetemplate ignoretext="Lorsque vous videz la corbeille de l&apos;inventaire" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ?
+ <usetemplate ignoretext="Confirmer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Êtes-vous certain de vouloir vider le cache de votre navigateur ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
+ Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Êtes-vous certain de vouloir supprimer vos cookies ?
@@ -2029,39 +1805,18 @@ Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
- <usetemplate ignoretext="Losque vous videz le dossier Objets trouvés dans votre inventaire" name="okcancelignore" notext="Non" yestext="Oui"/>
+ Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
+ <usetemplate ignoretext="Confirmer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="CopySLURL">
- La SLurl suivante a été copiée dans votre presse-papiers :
+ La SLurl suivante a été copiée dans votre presse-papiers :
[SLURL]
-Mettez-la dans une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
+Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
<form name="form">
- <ignore name="ignore" text="Lorsque vous copiez une SLurl dans votre presse-papier"/>
+ <ignore name="ignore" text="La SLurl est copiée dans mon presse-papiers"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Ce menu permet de contrôler la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client. Les préférences de l&apos;interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants :
-
-Effets : active ou désactive les différents types de shaders pixels.
-
-Objets reflétés : définit le type d&apos;objets reflétés dans l&apos;eau.
-
-Rendu de l&apos;avatar : définit les options qui influent sur la manière dont le client rend les avatars.
-
-Limite d&apos;affichage : la distance à laquelle vous voyez les objets s&apos;afficher dans la scène.
-
-Nombre de particules max. : définit le nombre maximum de particules que vous pouvez voir à la fois sur votre écran.
-
-Qualité post-traitement : définit la résolution du rayonnement.
-
-Détails des rendus : définit le niveau de détail ou le nombre de polygones utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d&apos;avoir des objets plus détaillés.
-
-Sources lumineuses : définit les types de lumières que vous souhaitez faire apparaître.
-
-Rendu du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain.
- </notification>
<notification name="WLSavePresetAlert">
Voulez-vous écraser l&apos;option précédemment enregistrée ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
@@ -2080,153 +1835,6 @@ Rendu du terrain : définit le niveau de détail que vous souhaitez utiliser dan
Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
- <notification name="HelpEditSky">
- Pour créer et sauvegarder plusieurs ciels, utilisez les curseurs WindLight.
- </notification>
- <notification name="HelpEditDayCycle">
- Choisissez quel ciel apparaît au cours de la journée.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Ces paramètres permettent de modifier l&apos;environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les effets atmosphériques.
-
-Pour changer les différentes phases de la journée dans le client, utilisez le curseur Heure de la journée.
-
-Le curseur Couverture nuageuse permet de contrôler le nombre de nuages dans le ciel.
-
-L&apos;option Couleur de l&apos;eau vous permet de modifier la couleur de l&apos;eau grâce au sélecteur de couleurs.
-
-Le curseur Brouillard dans l&apos;eau permet de contrôler la densité du brouillard sous l&apos;eau.
-
-Pour synchroniser l&apos;heure du jour sur celle de la région, cliquez sur Utiliser heure domaine.
-
-En cliquant sur le bouton Ciel Avancé, vous aurez accès à tous les réglages relatifs au ciel.
-
-En cliquant sur le bouton Eau Avancée, vous aurez accès à tous les réglages relatifs à l&apos;eau.
- </notification>
- <notification name="HelpDayCycle">
- L&apos;éditeur du cycle du jour vous permet de contrôler le ciel au cours du cycle jour/nuit de [SECOND_LIFE]. C&apos;est ce même cycle qui est contrôlé par le curseur Heure de la journée dans l&apos;éditeur d&apos;environnement basique.
-
-L&apos;éditeur du jour fonctionne grâce au réglage d&apos;images-clés. Ces images-clés sont représentées par les marques grises sur la ligne du temps et ont des préréglages qui leurs sont associées. Au cours de la journée et de la nuit, le ciel WindLight s&apos;anime en passant d&apos;une clé à l&apos;autre.
-
-La flèche jaune au dessus de la ligne du temps représente votre vue actuelle, basée sur l&apos;heure de la journée. Cliquez et faites glisser pour voir l&apos;animation au cours de votre journée. Ajoutez ou supprimez des clés en appuyant sur les boutons Ajouter clé ou Supprimer clé, à droite de la ligne du temps.
-
-Vous pouvez définir la position d&apos;une clé en la faisant glisser le long de la ligne du temps ou en définissant manuellement ses valeurs dans la section Réglages des images-clés. Dans cette même section, vous pouvez associer chaque clé au préréglage WindLight respectif.
-
-La Durée du cycle contrôle la durée d&apos;une « journée ». Si vous choisissez une valeur basse (2mn par exemple), cela signifie que toutes les animations de votre journée de 24h se dérouleront en 2mn seulement ! Une fois satisfait de vos choix, utilisez les boutons Jouer et Stop ! pour prévisualiser les résultats. Pour voir l&apos;animation, vous pouvez aussi bouger la flèche jaune au dessus de la ligne du temps. Si vous sélectionnez l&apos;option Utiliser heure domaine, vous synchronisez la durée de votre journée et votre heure avec celle du cycle du jour du domaine.
-
-Une fois que vous êtes satisfait de votre Cycle du jour, vous pouvez le sauvegarder et le charger grâce aux boutons Enregistrer jour test et Charger Jour Test. Veuillez noter que pour l&apos;instant, nous ne pouvez avoir qu&apos;un seul Cycle du jour.
- </notification>
- <notification name="HelpBlueHorizon">
- Utilisez les curseurs Rouge/Vert/Bleu (RVB) pour ajuster la couleur du ciel. Pour déplacer les trois curseurs en même temps, utilisez le curseur Intensité.
- </notification>
- <notification name="HelpHazeHorizon">
- Le paramètre Quantité de brume est l&apos;un des plus utiles pour ajuster l&apos;exposition lumineuse de la scène.
-Il permet de simuler de nombreux paramètres d&apos;exposition, tels que les voiles blancs créés par le soleil ou des lumières plus foncées.
- </notification>
- <notification name="HelpBlueDensity">
- La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l&apos;aide des curseurs Rouge/Vert/Bleu (RVB).
- </notification>
- <notification name="HelpHazeDensity">
- Le paramètre Densité de la brume permet de contrôler le niveau de brume grisâtre dans l&apos;atmosphère. Ce paramètre est utile pour simuler les scènes dans lesquelles il y a beaucoup de fumée et de substances polluantes émises par l&apos;homme. Il est également utile pour simuler le brouillard et la brume.
- </notification>
- <notification name="HelpDensityMult">
- Utilisez le Multiplicateur de densité pour modifier la densité atmosphérique générale. Une valeur basse donne l&apos;impression d&apos;un air « léger » alors qu&apos;une valeur élevée donne l&apos;impression d&apos;un air « lourd » et enfumé.
- </notification>
- <notification name="HelpDistanceMult">
- Ajuste la distance perçue par WindLight.
-La valeur zéro désactive l&apos;influence de WindLight sur le terrain et les objets.
-Les valeurs supérieures à 1 simulent des distances plus importantes pour des effets atmosphériques plus épais.
- </notification>
- <notification name="HelpMaxAltitude">
- L&apos;Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la « profondeur » du coucher de soleil.
- </notification>
- <notification name="HelpSunlightColor">
- Ajuste la couleur et l&apos;intensité de la lumière directe de la scène.
- </notification>
- <notification name="HelpSunAmbient">
- Ajuste la couleur et l&apos;intensité de la lumière atmosphérique ambiante.
- </notification>
- <notification name="HelpSunGlow">
- Le curseur Taille contrôle la taille du soleil.
-Le curseur Netteté permet de rendre le soleil plus ou moins flou dans le ciel.
- </notification>
- <notification name="HelpSceneGamma">
- Ajuste la distribution de clair et de foncé sur l&apos;écran.
- </notification>
- <notification name="HelpStarBrightness">
- Vous permet de contrôler l&apos;intensité des étoiles dans le ciel.
- </notification>
- <notification name="HelpTimeOfDay">
- Contrôle la position du soleil dans le ciel.
-Même chose que l&apos;élévation.
- </notification>
- <notification name="HelpEastAngle">
- Contrôle la position du soleil dans le ciel.
-Même chose que l&apos;azimut.
- </notification>
- <notification name="HelpCloudColor">
- Modifie la couleur des nuages. Il est recommandé de laisser les nuages en blanc mais vous pouvez aussi faire preuve de créativité...
- </notification>
- <notification name="HelpCloudDetail">
- Contrôle le détail de l&apos;image placée sur l&apos;image du nuage principal. X et Y contrôlent sa position. D (Densité) permet de rendre les nuages plus ou moins pleins ou plus ou moins fracturés.
- </notification>
- <notification name="HelpCloudDensity">
- Vous permet de contrôler la position des nuages avec les curseurs X et Y ainsi que leur densité avec le curseur D.
- </notification>
- <notification name="HelpCloudCoverage">
- Contrôle la surface du ciel couverte par les nuages.
- </notification>
- <notification name="HelpCloudScale">
- Contrôle l&apos;échelle de l&apos;image des nuages sur le dôme du ciel.
- </notification>
- <notification name="HelpCloudScrollX">
- Contrôle la vitesse des nuages sur l&apos;axe des X.
- </notification>
- <notification name="HelpCloudScrollY">
- Contrôle la vitesse des nuages sur l&apos;axe des Y.
- </notification>
- <notification name="HelpClassicClouds">
- Cochez cette option pour utiliser les anciens nuages de [SECOND_LIFE] en plus des nuages WindLight.
- </notification>
- <notification name="HelpWaterFogColor">
- Permet de sélectionner la couleur du brouillard sous l&apos;eau.
- </notification>
- <notification name="HelpWaterFogDensity">
- Contrôle la densité du brouillard sous l&apos;eau, ainsi que votre visibilité.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifie l&apos;effet créé par l&apos;option Densité du brouillard pour contrôler votre visibilité quand votre avatar est sous l&apos;eau.
- </notification>
- <notification name="HelpWaterGlow">
- Contrôle l&apos;éclat de l&apos;eau à la surface.
- </notification>
- <notification name="HelpWaterNormalScale">
- Contrôle l&apos;échelle des trois vaguelettes qui forment l&apos;eau.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Contrôle la quantité de lumière réfléchie à des angles différents.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Contrôle l&apos;intensité de la lumière réfléchie.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Contrôle la quantité de lumière réfractée lorsque votre avatar regarde au dessus de l&apos;eau.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Contrôle la quantité de lumière réfractée lorsque votre avatar est sous l&apos;eau.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Contrôle le mélange reflets/vagues.
- </notification>
- <notification name="HelpWaterNormalMap">
- Contrôle quelle normal map est posée sur l&apos;eau pour déterminer la réflection/réfraction.
- </notification>
- <notification name="HelpWaterWave1">
- Contrôle dans quelle direction et à quelle vitesse la version grande échelle de la normal map se déplace sur l&apos;axe des X et l&apos;axe des Y.
- </notification>
- <notification name="HelpWaterWave2">
- Contrôle dans quelle direction et à quelle vitesse la version grande échelle de la normal map se déplace sur l&apos;axe des X et l&apos;axe des Y.
- </notification>
<notification name="NewSkyPreset">
Nommez le nouveau ciel.
<form name="form">
@@ -2272,35 +1880,33 @@ Même chose que l&apos;azimut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Les objets qui font partie d&apos;une pièce-jointe ne peuvent pas être achetés.
+ Vous ne pouvez pas acheter un objet s&apos;il fait partie d&apos;une pièce jointe.
</notification>
<notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails">
Accepter cette requête donne au script l&apos;autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- Voulez-vous automatiquement porter l&apos;habit que vous créez ?
- <usetemplate ignoretext="Porter automatiquement" name="okcancelignore" notext="Non" yestext="Oui"/>
+ Voulez-vous automatiquement porter l&apos;habit que vous allez créer ?
+ <usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="NotAgeVerified">
- Pour que vous puissiez accéder à cette parcelle, votre âge doit être vérifié.
-Voulez-vous aller sur le site de [SECOND_LIFE] pour vérifier votre âge ?
+ Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge. Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=fr
</url>
- <usetemplate ignoretext="Avertir si l&apos;âge n&apos;a pas été vérifié" name="okcancelignore" notext="Non" yestext="Oui"/>
+ <usetemplate ignoretext="Je n&apos;ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Avant de pouvoir pénétrer sur cette parcelle, vous devez enregistrer vos informations de paiement.
-Voulez-vous aller sur le site de [SECOND_LIFE] pour enregistrer ces informations ?
+ Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=fr
</url>
- <usetemplate ignoretext="Avertir si les informations de paiement ne sont pas fournies" name="okcancelignore" notext="Non" yestext="Oui"/>
+ <usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="MissingString">
The string [STRING_NAME] is missing from strings.xml
@@ -2330,7 +1936,7 @@ Voulez-vous aller sur le site de [SECOND_LIFE] pour enregistrer ces informations
[FIRST] [LAST] est déconnecté(e)
</notification>
<notification name="AddSelfFriend">
- Vous ne pouvez pas devenir ami avec vous-même.
+ Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même.
</notification>
<notification name="UploadingAuctionSnapshot">
Importation de photos SL et Web en cours...
@@ -2353,7 +1959,6 @@ Voulez-vous aller sur le site de [SECOND_LIFE] pour enregistrer ces informations
</notification>
<notification name="UnableToLoadGesture">
Impossible de charger le geste [NAME].
-Merci de réessayer.
</notification>
<notification name="LandmarkMissing">
Repère absent de la base de données.
@@ -2363,13 +1968,13 @@ Merci de réessayer.
</notification>
<notification name="CapsKeyOn">
La touche Verr.maj est activée.
-Ce mode modifie le mot de passe que vous saisissez, vous devriez le quitter.
+Cela risque d&apos;impacter votre mot de passe.
</notification>
<notification name="NotecardMissing">
Note absente de la base de données.
</notification>
<notification name="NotecardNoPermissions">
- Permissions insuffisantes pour voir la note.
+ Vous n&apos;avez pas le droit de consulter cette note.
</notification>
<notification name="RezItemNoPermissions">
Permissions insuffisantes pour rezzer l&apos;objet.
@@ -2408,10 +2013,11 @@ Merci de réessayer.
Merci de réessayer.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Impossible d&apos;acheter simultanément des objets de propriétaires différents. Veuillez sélectionner un seul objet.
+ Vous ne pouvez pas acheter simultanément des objets de propriétaires différents.
+Veuillez sélectionner un seul objet.
</notification>
<notification name="ObjectNotForSale">
- Cet objet ne semble pas à vendre.
+ Cet objet n&apos;est pas à vendre.
</notification>
<notification name="EnteringGodMode">
Activation du mode divin : niveau [LEVEL]
@@ -2420,10 +2026,10 @@ Merci de réessayer.
Désactivation du mode divin : niveau [LEVEL]
</notification>
<notification name="CopyFailed">
- Copie impossible, droits insuffisants.
+ Vous n&apos;avez pas le droit de copier ceci.
</notification>
<notification name="InventoryAccepted">
- [NAME] a accepté votre envoi.
+ [NAME] a reçu votre offre d&apos;inventaire.
</notification>
<notification name="InventoryDeclined">
[NAME] a refusé votre envoi.
@@ -2438,12 +2044,14 @@ Merci de réessayer.
Votre carte de visite a été refusée.
</notification>
<notification name="TeleportToLandmark">
- A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Repères (Landmarks).
-Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter.
+ Vous pouvez vous téléporter vers des endroits comme [NAME] en ouvrant le panneau Lieux sur le côté droit de votre écran, puis en sélectionnant l&apos;onglet Repères.
+Cliquez sur le repère de votre choix pour le sélectionner, puis sur Téléporter en bas du panneau.
+(Vous pouvez aussi double-cliquer sur le repère ou cliquer dessus avec le bouton droit de la souris et sélectionner Téléporter.)
</notification>
<notification name="TeleportToPerson">
- A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Cartes de visite (Calling Cards).
-Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané.
+ Vous pouvez contacter des résidents comme [NAME] en ouvrant le panneau Résidents sur le côté droit de votre écran.
+Sélectionnez le résident de votre choix dans la liste, puis cliquez sur IM en bas du panneau.
+(Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer dessus avec le bouton droit de la souris et sélectionner IM.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur.
@@ -2453,7 +2061,7 @@ Veuillez sélectionner un terrain plus petit.
Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires.
</notification>
<notification name="NoContentToSearch">
- Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte)
+ Veuillez sélectionner au moins un type de contenu à rechercher (Général, Modéré ou Adulte)
</notification>
<notification name="GroupVote">
[NAME] a proposé un vote pour :
@@ -2466,6 +2074,9 @@ Veuillez sélectionner un terrain plus petit.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Avis d&apos;événement :
@@ -2491,7 +2102,19 @@ Veuillez sélectionner un terrain plus petit.
</notification>
<notification name="NoQuickTime">
Le logiciel Apple QuickTime ne semble pas installé sur votre système.
-Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime.
+Pour voir les vidéos sur les terrains qui le permettent, allez sur le [http://www.apple.com/quicktime site de QuickTime] et installez le lecteur QuickTime.
+ </notification>
+ <notification name="NoPlugin">
+ Aucun Media Plugin n&apos;a été trouvé pour prendre en charge [MIME_TYPE]. Les médias de ce type ne sont pas disponibles.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Le Media Plugin suivant a échoué :
+ [PLUGIN]
+
+Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur.
+ <form name="form">
+ <ignore name="ignore" text="L&apos;exécution d&apos;un Media Plugin a échoué"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire.
@@ -2500,7 +2123,7 @@ Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de Q
Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire.
</notification>
<notification name="OtherObjectsReturned2">
- Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire.
+ Les objets sur la parcelle de terrain sélectionnée appartenant au résident [NAME] ont été rendus à leur propriétaire.
</notification>
<notification name="GroupObjectsReturned">
Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l&apos;inventaire de leur propriétaire.
@@ -2510,24 +2133,26 @@ Les objets non transférables donnés au groupe ont étés supprimés.
<notification name="UnOwnedObjectsReturned">
Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires.
</notification>
+ <notification name="ServerObjectMessage">
+ Message de [NAME] :
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
<notification name="NotSafe">
- Les dégâts sont autorisés sur ce terrain (« non sécurisé »).
+ Les dégâts sont autorisés sur ce terrain.
Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile.
</notification>
<notification name="NoFly">
- Le vol est interdit sur ce terrain (« pas de vol »).
+ Le vol est interdit dans cette zone.
Vous ne pouvez pas voler ici.
</notification>
<notification name="PushRestricted">
- Les bousculades sont interdites sur ce terrain.
-Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain.
+ Les bousculades sont interdites dans cette zone. Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain.
</notification>
<notification name="NoVoice">
- La voix est désactivée sur ce terrain.
+ Le chat vocal est interdit dans cette zone. Vous n&apos;entendrez personne parler.
</notification>
<notification name="NoBuild">
- Le mode construction sur ce terrain est désactivé (« pas de construction »).
-Vous ne pouvez pas créer d&apos;objets ici.
+ La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
</notification>
<notification name="ScriptsStopped">
Un administrateur a temporairement stoppé les scripts dans cette région.
@@ -2536,8 +2161,9 @@ Vous ne pouvez pas créer d&apos;objets ici.
Aucun script ne fonctionne dans cette région.
</notification>
<notification name="NoOutsideScripts">
- Les scripts externes sont désactivés sur ce terrain (« pas de scripts externes »).
-Aucun script n&apos;est exécuté à part ceux du propriétaire du terrain.
+ Les scripts externes sont désactivés sur ce terrain.
+
+Aucun script ne marche ici à part ceux du propriétaire du terrain.
</notification>
<notification name="ClaimPublicLand">
Vous ne pouvez réclamer qu&apos;un terrain public dans la région où vous vous trouvez actuellement.
@@ -2553,14 +2179,10 @@ Pour savoir comment accéder aux zones ayant un tel niveau d&apos;accès, veuill
<notification name="NoTeenGridAccess">
Votre compte ne peut pas se connecter à cette région du Teen grid.
</notification>
- <notification name="NoHelpIslandTP">
- Vous ne pouvez pas retourner sur Help Island.
-Pour répéter le didacticiel, veuillez aller sur Help Island Public.
- </notification>
<notification name="ImproperPaymentStatus">
Vous n&apos;avez pas le statut de paiement approprié pour pénétrer dans cette région.
</notification>
- <notification name="MustGetAgeRegion">
+ <notification name="MustGetAgeRgion">
Pour pouvoir pénétrer dans cette région, vous devez avoir procédé à la vérification de votre âge.
</notification>
<notification name="MustGetAgeParcel">
@@ -2625,7 +2247,8 @@ Veuillez réessayer dans quelques minutes.
Aucune parcelle valide n&apos;a été trouvée.
</notification>
<notification name="ObjectGiveItem">
- Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME].
+ Un objet appelé [OBJECTFROMNAME] appartenant à [NAME_SLURL] vous a donné un [OBJECTTYPE] :
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Garder"/>
<button name="Discard" text="Jeter"/>
@@ -2633,7 +2256,8 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- L&apos;objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
+ Un objet appelé [OBJECTFROMNAME] appartenant à (un résident inconnu) vous a donné un [OBJECTTYPE] :
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Garder"/>
<button name="Discard" text="Jeter"/>
@@ -2641,15 +2265,17 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
+ [NAME_SLURL] vous a donné un [OBJECTTYPE] :
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Garder"/>
+ <button name="Show" text="Afficher"/>
<button name="Discard" text="Jeter"/>
<button name="Mute" text="Ignorer"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2661,7 +2287,7 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] vous propose de le/la rejoindre par téléportation :
+ [NAME] vous propose d&apos;être téléporté jusqu&apos;à son emplacement :
[MESSAGE]
<form name="form">
@@ -2669,6 +2295,9 @@ Veuillez réessayer dans quelques minutes.
<button name="Cancel" text="Annuler"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Offre de téléportation envoyée à [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2688,6 +2317,9 @@ Veuillez réessayer dans quelques minutes.
<button name="Decline" text="Refuser"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Vous avez proposé à [TO_NAME] de devenir votre ami(e)
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] vous demande de devenir son ami.
@@ -2737,7 +2369,7 @@ Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué.
</notification>
<notification name="InvalidWearable">
- L&apos;objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour du client.
+ L&apos;objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour de [APP_NAME].
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[NAME]&apos;, aimerait :
@@ -2747,16 +2379,16 @@ Acceptez-vous ?
<form name="form">
<button name="Yes" text="Oui"/>
<button name="No" text="Non"/>
- <button name="Mute" text="Ignorer"/>
+ <button name="Mute" text="Interdire"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- [OBJECTNAME], un objet appartenant à [NAME], aimerait :
+ Un objet appelé [OBJECTNAME], appartenant à [NAME], aimerait :
[QUESTIONS]
-Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. Pour plus d&apos;informations, cliquez sur le bouton Détails.
+Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête.
-Accepter cette requête ?
+Accepter cette requête ?
<form name="form">
<button name="Grant" text="Accepter"/>
<button name="Deny" text="Refuser"/>
@@ -2777,39 +2409,20 @@ Accepter cette requête ?
<button name="Ignore" text="Ignorer"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Vous venez de recevoir [AMOUNT] L$.
-Des objets et des utilisateurs peuvent vous donner des L$.
-Votre solde est affiché dans le coin supérieur droit de votre écran.
- </notification>
- <notification name="FirstBalanceDecrease">
- Vous venez de payer [AMOUNT] L$.
-Votre solde est affiché dans le coin supérieur droit de votre écran.
- </notification>
- <notification name="FirstSit">
- Vous êtes assis(e).
-Utilisez les touches de direction (ou AWSD) pour changer la vue.
-Pour vous lever, cliquez sur le bouton Me lever.
- </notification>
- <notification name="FirstMap">
- Cliquez et faites glisser pour faire défiler la carte.
-Double-cliquez pour vous téléporter.
-Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans.
- </notification>
- <notification name="FirstBuild">
- Vous pouvez construire des objets dans certaines zones de [SECOND_LIFE].
-Utilisez les outils en haut à gauche pour construire et gardez la touche Ctrl ou Alt enfoncée pour passer rapidement d&apos;un outil à l&apos;autre.
-Appuyez sur la touche Esc pour arrêter de construire.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Un clic gauche permet d&apos;interagir avec certains objets.
-Si le pointeur de la souris se transforme en main, vous pouvez interagir avec l&apos;objet.
-Un clic droit fait toujours apparaître un menu des choses que vous pouvez faire.
+ <notification name="ScriptToast">
+ [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; demande la participation de l&apos;utilisateur.
+ <form name="form">
+ <button name="Open" text="Ouvrir la boîte de dialogue"/>
+ <button name="Ignore" text="Ignorer"/>
+ <button name="Block" text="Ignorer"/>
+ </form>
</notification>
- <notification name="FirstTeleport">
- Cette région n&apos;autorise pas la téléportation de point à point. Vous avez donc été transporté au téléhub le plus proche.
-Votre destination est marquée par une grande balise.
-Suivez la flèche rouge vers la balise ou cliquez sur la flèche pour faire disparaître la balise.
+ <notification name="BuyLindenDollarSuccess">
+ Nous vous remercions de votre paiement.
+
+Votre solde en L$ sera mis à jour une fois le traitement terminé. Si le traitement prend plus de 20 minutes, il est possible que votre transaction soit annulée. Dans ce cas, le montant de l&apos;achat sera crédité sur votre solde en US$.
+
+Vous pouvez consulter le statut de votre paiement à la page Historique de mes transactions sur votre [http://secondlife.com/account/ Page d&apos;accueil]
</notification>
<notification name="FirstOverrideKeys">
Vos mouvements sont maintenant pris en charge par un objet.
@@ -2817,40 +2430,10 @@ Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent.
Certains objets (comme les armes) nécessitent l&apos;activation du mode Vue subjective pour être utilisés.
Pour cela, appuyez sur la touche M.
</notification>
- <notification name="FirstAppearance">
- Vous êtes en train d&apos;éditer votre apparence.
-Pour tourner et zoomer, utilisez les flèches de direction.
-Lorsque vous avez terminé, appuyez sur Enregistrer tout pour sauvegarder votre apparence et sortir.
-Vous pouvez modifier votre apparence aussi souvent que vous le souhaitez.
- </notification>
- <notification name="FirstInventory">
- Il s&apos;agit de votre inventaire qui contient des objets, notes, vêtements, et autres possessions.
-* Pour porter un objet ou le dossier contenant un ensemble complet, faites-le glisser sur vous-même.
-* Pour mettre un objet dans le monde, faites-le glisser sur le sol.
-* Pour lire une note, double-cliquez dessus.
- </notification>
<notification name="FirstSandbox">
- Cette région est un bac à sable.
-Les objets que vous construisez ici peuvent être supprimés quand vous partez. Les bacs à sable sont nettoyés régulièrement, veuillez lire les informations en haut de l&apos;écran à côté du nom de la région.
+ Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire.
-Les régions bacs à sable sont rares et sont signalées par des panneaux.
- </notification>
- <notification name="FirstFlexible">
- Cet objet est flexible.
-Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes jusqu&apos;à ce que la case Fantôme soit décochée.
- </notification>
- <notification name="FirstDebugMenus">
- Vous avez activé le menu Avancé.
-Ce menu contient des fonctionnalités utiles pour les développeurs qui travaillent sur [SECOND_LIFE].
-Pour activer/désactiver ce menu sous Windows, appuyez sur Ctrl+Alt+D. Sur un Mac, appuyez sur &#8997;&#8984;D
- </notification>
- <notification name="FirstSculptedPrim">
- Vous êtes en train d&apos;éditer un sculptie.
-Pour modifier la forme d&apos;un sculptie, vous devez utiliser une texture spécifique.
-Vous trouverez des textures dans la bibliothèque de votre inventaire.
- </notification>
- <notification name="FirstMedia">
- Vous avez lancé la lecture d&apos;un média. Dans le menu Préférences, à l&apos;onglet Audio et vidéo, vous pouvez choisir de lire automatiquement les médias. Notez que cela peut être risqué lorsque les médias viennent de sites que vous ne connaissez pas.
+Les objets que vous construisez ici seront supprimés après votre départ. N&apos;oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire.
</notification>
<notification name="MaxListSelectMessage">
Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste.
@@ -2884,7 +2467,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
</notification>
<notification name="VoiceInviteAdHoc">
[NAME] a rejoint un chat vocal avec conférence.
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
<form name="form">
<button name="Accept" text="Accepter"/>
<button name="Decline" text="Refuser"/>
@@ -2893,7 +2476,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
</notification>
<notification name="InviteAdHoc">
[NAME] vous invite à un chat conférence.
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
<form name="form">
<button name="Accept" text="Accepter"/>
<button name="Decline" text="Refuser"/>
@@ -2907,25 +2490,25 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter.
</notification>
<notification name="VoiceChannelDisconnected">
- Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial.
+ Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+ [VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+ [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+ [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
</notification>
<notification name="VoiceChannelJoinFailed">
- Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial.
+ Échec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
</notification>
<notification name="VoiceLoginRetry">
Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants.
</notification>
<notification name="Cannot enter parcel: not a group member">
- Vous ne pouvez pas pénétrer sur ce terrain car vous n&apos;êtes pas membre du groupe adéquat.
+ Seuls les membres d&apos;un certain groupe peuvent visiter cette zone.
</notification>
<notification name="Cannot enter parcel: banned">
Vous ne pouvez pas pénétrer sur ce terrain car l&apos;accès vous y est interdit.
@@ -2940,18 +2523,62 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement.
</notification>
<notification name="ServerVersionChanged">
- La région dans laquelle vous avez pénétré utilise une version de simulateur différente. Pour plus de détails, cliquez sur ce message.
+ La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. [[URL] Consultez les notes de version.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ La SLurl que vous avez saisie n&apos;est pas prise en charge.
+ </notification>
+ <notification name="BlockedSLURL">
+ Une SLurl a été reçue d&apos;un navigateur non sécurisé et a été bloquée pour votre sécurité.
</notification>
- <notification name="UnableToOpenCommandURL">
- L&apos;URL sur laquelle vous avez cliqué ne peut pas être ouverte dans ce navigateur.
+ <notification name="ThrottledSLURL">
+ Plusieurs SLurl ont été reçues d&apos;un navigateur non sécurisé pendant un court laps de temps.
+Elles vont être bloquées pendant quelques secondes pour votre sécurité.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Répondre"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Êtes-vous certain de vouloir fermer tous les IM ?
+ <usetemplate name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ L&apos;élément joint a été sauvegardé.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Impossible de trouver l&apos;aide.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Erreur serveur : Échec de la mise à jour ou de l&apos;obtention du média.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Le modérateur ignore votre chat écrit.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Le modérateur ignore vos paroles.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Voulez-vous vraiment supprimer votre historique des téléportations ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Le bouton sélectionné ne peut pas être affiché actuellement.
+Le bouton sera affiché quand il y aura suffisamment de place.
</notification>
<global name="UnsupportedCPU">
- Votre processeur ne remplit pas les conditions minimum requises.
</global>
<global name="UnsupportedGLRequirements">
- Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les drivers les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
+ Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
-Si vous avez toujours des problèmes, veuillez consulter la page suivante : http://www.secondlife.com/support
+Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -2965,10 +2592,8 @@ Si vous avez toujours des problèmes, veuillez consulter la page suivante : ht
<global name="UnsupportedRAM">
- Votre mémoire système ne remplit pas les conditions minimum requises.
</global>
- <global name="PermYes">
- Oui
- </global>
- <global name="PermNo">
- Non
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Si vous possédez un terrain, vous pouvez le définir comme domicile.
+Sinon, consultez la carte et trouvez les &quot; infohubs &quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/fr/panel_active_object_row.xml b/indra/newview/skins/default/xui/fr/panel_active_object_row.xml
new file mode 100644
index 0000000000..0baa8353d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Objet inconnu
+ </string>
+ <text name="object_name">
+ Objet sans nom
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_activeim_row.xml b/indra/newview/skins/default/xui/fr/panel_activeim_row.xml
new file mode 100644
index 0000000000..84272752cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_activeim_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="contact_name">
+ Grumpity ProductEngine
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..4191ba42f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Appeler" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Quitter l&apos;appel" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
index a9540d8346..2caa013f54 100644
--- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
@@ -6,7 +6,7 @@
<text name="Input device (microphone):">
Périphérique d&apos;entrée (micro) :
</text>
- <text name="Output device (speakers):">
+ <text name="Output device (speakers):" width="300">
Périphérique de sortie (haut-parleurs) :
</text>
<text name="Input level:">
diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..792fd70c7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] mn
+ </string>
+ <string name="FormatHours">
+ [COUNT] h
+ </string>
+ <string name="FormatDays">
+ [COUNT] j
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] s
+ </string>
+ <string name="FormatMonths">
+ [COUNT] m
+ </string>
+ <string name="FormatYears">
+ [COUNT] a
+ </string>
+ <text name="avatar_name" value="Inconnu"/>
+ <text name="last_interaction" value="0s"/>
+ <button name="profile_btn" tool_tip="Voir le profil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_tag.xml b/indra/newview/skins/default/xui/fr/panel_avatar_tag.xml
new file mode 100644
index 0000000000..20a355b11d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Testeur
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ Le renard brun et vif saute par dessus le chien paresseux.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..f54bed4fae
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Liste des ignorés
+ </text>
+ <scroll_list name="blocked" tool_tip="Liste des résidents actuellement ignorés"/>
+ <button label="Ignorer une personne" label_selected="Ignorer le résident..." name="Block resident..." tool_tip="Choisir un résident à ignorer"/>
+ <button label="Ignorer l&apos;objet par nom" label_selected="Ignorer l&apos;objet par nom..." name="Block object by name..." tool_tip="Choisir un objet à ignorer par nom"/>
+ <button label="Ne plus ignorer" label_selected="Ne plus ignorer" name="Unblock" tool_tip="Enlever le résident ou l&apos;objet de la liste des ignorés"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
new file mode 100644
index 0000000000..d3e4afd6ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Active/Désactive le micro
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Affiche/Masque le panneau de contrôle vocal
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Parler" label_selected="Parler" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Bouger" name="movement_btn" tool_tip="Affiche/Masque le contrôle des déplacements"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Affichage" name="camera_btn" tool_tip="Affiche/Masque le contrôle de la caméra"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Prendre une photo"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifications"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..5b6d37ce00
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_chat_header.xml b/indra/newview/skins/default/xui/fr/panel_chat_header.xml
new file mode 100644
index 0000000000..babbff3132
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_chat_header.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text_editor name="user_name" value="Ericag Vader"/>
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_classified_info.xml b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
new file mode 100644
index 0000000000..784c6baae9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Modéré
+ </panel.string>
+ <panel.string name="type_pg">
+ Contenu Général
+ </panel.string>
+ <panel.string name="l$_price">
+ [PRICE] L$
+ </panel.string>
+ <text name="title" value="Infos sur la petite annonce"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text_editor name="category" value="[category]"/>
+ <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/>
+ <text_editor name="price_for_listing" tool_tip="Coût de l&apos;annonce."/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="show_on_map_btn"/>
+ <button label="Édition" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
new file mode 100644
index 0000000000..3b81ef2a5f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
new file mode 100644
index 0000000000..1f44f2fe09
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modifier la petite annonce" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (mise à jour après l&apos;enregistrement)
+ </panel.string>
+ <text name="title">
+ Modifier la petite annonce
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="Name:">
+ Titre :
+ </text>
+ <text name="description_label">
+ Description :
+ </text>
+ <text name="location_label">
+ Lieu :
+ </text>
+ <text name="classified_location">
+ en cours de chargement...
+ </text>
+ <button label="Définir sur l&apos;emplacement actuel" name="set_to_curr_location_btn"/>
+ <combo_box name="content_type">
+ <combo_item name="mature_ci">
+ Contenu Modéré
+ </combo_item>
+ <combo_item name="pg_ci">
+ Contenu Général
+ </combo_item>
+ </combo_box>
+ <spinner label="L$" name="price_for_listing" tool_tip="Coût de l&apos;annonce." value="50"/>
+ <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Enregistrer" name="save_changes_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml
new file mode 100644
index 0000000000..7de6ca8b3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Yeux"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
new file mode 100644
index 0000000000..73e136ade6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Gants"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_hair.xml b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml
new file mode 100644
index 0000000000..9293c23e19
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Couleur"/>
+ <accordion_tab name="hair_style_tab" title="Coupe"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sourcils"/>
+ <accordion_tab name="hair_facial_tab" title="Pilosité du visage"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
new file mode 100644
index 0000000000..cee44eb795
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Veste"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
new file mode 100644
index 0000000000..71d82c817f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantalon"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
new file mode 100644
index 0000000000..f234529764
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modifier la préférence" name="panel_edit_pick">
+ <text name="title">
+ Modifier la préférence
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="Name:">
+ Titre :
+ </text>
+ <text name="description_label">
+ Description :
+ </text>
+ <text name="location_label">
+ Lieu :
+ </text>
+ <text name="pick_location">
+ en cours de chargement...
+ </text>
+ <button label="Définir sur l&apos;emplacement actuel" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Enregistrer [WHAT]" name="save_changes_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index f62ea7c80f..d10a7f37e1 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -1,45 +1,59 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Résident" />
- <string name="AcctTypeTrial"
- value="Essai" />
- <string name="AcctTypeCharterMember"
- value="Membre originaire" />
- <string name="AcctTypeEmployee"
- value="Employé(e) de Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Infos de paiement utilisées" />
- <string name="PaymentInfoOnFile"
- value="Infos de paiement enregistrées" />
- <string name="NoPaymentInfoOnFile"
- value="Aucune info de paiement" />
- <string name="AgeVerified"
- value="Âge vérifié" />
- <string name="NotAgeVerified"
- value="Âge non vérifié" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=fr
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partenaire :"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Réponse si occupé(e) :
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modification du profil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Résident"/>
+ <string name="AcctTypeTrial" value="Essai"/>
+ <string name="AcctTypeCharterMember" value="Membre originaire"/>
+ <string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Infos de paiement utilisées"/>
+ <string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/>
+ <string name="NoPaymentInfoOnFile" value="Aucune info de paiement enregistrée"/>
+ <string name="AgeVerified" value="Personne dont l&apos;âge a été vérifié"/>
+ <string name="NotAgeVerified" value="Personne dont l&apos;âge n&apos;a pas été vérifié"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=fr
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Aucun"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Monde physique :"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="title_homepage_text">
+ Page d&apos;accueil :
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Mon compte :"/>
+ <text_editor name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/>
+ <text name="my_account_link" value="[[URL] Accéder à ma Page d&apos;accueil]"/>
+ <text name="title_partner_text" value="Mon partenaire :"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(récupération en cours)" name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Modifier]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Enregistrer les changements" name="save_btn" width="166"/>
+ <button label="Annuler" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml
new file mode 100644
index 0000000000..450b23608a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Sexe :
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Femme" name="radio"/>
+ <radio_item label="Homme" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corps"/>
+ <accordion_tab name="shape_head_tab" title="Tête"/>
+ <accordion_tab name="shape_eyes_tab" title="Yeux"/>
+ <accordion_tab name="shape_ears_tab" title="Oreilles"/>
+ <accordion_tab name="shape_nose_tab" title="Nez"/>
+ <accordion_tab name="shape_mouth_tab" title="Bouche"/>
+ <accordion_tab name="shape_chin_tab" title="Menton"/>
+ <accordion_tab name="shape_torso_tab" title="Torse"/>
+ <accordion_tab name="shape_legs_tab" title="Jambes"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
new file mode 100644
index 0000000000..cf28cd8c1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Chemise"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
new file mode 100644
index 0000000000..a8e0910a15
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Chaussures"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
new file mode 100644
index 0000000000..dac005f6b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatouage tête" name="Head Tattoos" width="76" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoos" width="80" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Couleur de peau"/>
+ <accordion_tab name="skin_face_tab" title="Détails du visage"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquillage"/>
+ <accordion_tab name="skin_body_tab" title="Détails du corps"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
new file mode 100644
index 0000000000..e9784b9510
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Jupe"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
new file mode 100644
index 0000000000..6fc6a3dc77
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Chaussettes"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..7ab2aa6bc9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatouage tête" name="Head Tattoo" width="76" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoo" width="80" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoo" width="76" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
new file mode 100644
index 0000000000..90dcae18ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Caleçon"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..950cdd7639
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Débardeur"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
new file mode 100644
index 0000000000..c6ab686b0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Portable" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Modification de la silhouette
+ </string>
+ <string name="edit_skin_title">
+ Modification de la peau
+ </string>
+ <string name="edit_hair_title">
+ Modification des cheveux
+ </string>
+ <string name="edit_eyes_title">
+ Modification des yeux
+ </string>
+ <string name="edit_shirt_title">
+ Modification de la chemise
+ </string>
+ <string name="edit_pants_title">
+ Modification du pantalon
+ </string>
+ <string name="edit_shoes_title">
+ Modification des chaussures
+ </string>
+ <string name="edit_socks_title">
+ Modification des chaussettes
+ </string>
+ <string name="edit_jacket_title">
+ Modification de la veste
+ </string>
+ <string name="edit_skirt_title">
+ Modification de la jupe
+ </string>
+ <string name="edit_gloves_title">
+ Modification des gants
+ </string>
+ <string name="edit_undershirt_title">
+ Modification des sous-vêtements (homme)
+ </string>
+ <string name="edit_underpants_title">
+ Modification des sous-vêtements (femme)
+ </string>
+ <string name="edit_alpha_title">
+ Modification du masque alpha
+ </string>
+ <string name="edit_tattoo_title">
+ Modification du tatouage
+ </string>
+ <string name="shape_desc_text">
+ Silhouette :
+ </string>
+ <string name="skin_desc_text">
+ Peau :
+ </string>
+ <string name="hair_desc_text">
+ Cheveux :
+ </string>
+ <string name="eyes_desc_text">
+ Yeux :
+ </string>
+ <string name="shirt_desc_text">
+ Chemise :
+ </string>
+ <string name="pants_desc_text">
+ Pantalon :
+ </string>
+ <string name="shoes_desc_text">
+ Chaussures :
+ </string>
+ <string name="socks_desc_text">
+ Chaussettes :
+ </string>
+ <string name="jacket_desc_text">
+ Veste :
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Jupe :
+ </string>
+ <string name="gloves_desc_text">
+ Gants :
+ </string>
+ <string name="undershirt_desc_text">
+ Sous-vêtements (homme) :
+ </string>
+ <string name="underpants_desc_text">
+ Sous-vêtements (femme) :
+ </string>
+ <string name="alpha_desc_text">
+ Masque alpha :
+ </string>
+ <string name="tattoo_desc_text">
+ Tatouage :
+ </string>
+ <text name="edit_wearable_title" value="Modification de la silhouette"/>
+ <panel label="Chemise" name="wearable_type_panel">
+ <text name="description_text" value="Silhouette :"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Enregistrer sous" name="save_as_button"/>
+ <button label="Annuler modification" width="130" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_friends.xml b/indra/newview/skins/default/xui/fr/panel_friends.xml
index cbeb10287d..10ec952aa3 100644
--- a/indra/newview/skins/default/xui/fr/panel_friends.xml
+++ b/indra/newview/skins/default/xui/fr/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Amis multiples...
+ Amis multiples
</string>
<scroll_list name="friend_list" tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée">
<column name="icon_online_status" tool_tip="Statut en ligne"/>
@@ -13,8 +13,8 @@
</scroll_list>
<button label="IM/Appel" name="im_btn" tool_tip="Envoyez un IM à ce résident"/>
<button label="Profil" name="profile_btn" tool_tip="Consultez le profil de ce résident (photos, groupes et autres infos)"/>
- <button label="Téléporter..." name="offer_teleport_btn" tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes"/>
- <button label="Payer..." name="pay_btn" tool_tip="Donnez des L$ à cet ami"/>
- <button label="Supprimer..." name="remove_btn" tool_tip="Supprimez ce résident de votre liste d&apos;amis"/>
- <button label="Ajouter..." name="add_btn" tool_tip="Demandez à un résident de devenir votre ami"/>
+ <button label="Téléporter" name="offer_teleport_btn" tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes"/>
+ <button label="Payer" name="pay_btn" tool_tip="Donnez des L$ à cet ami"/>
+ <button label="Supprimer" name="remove_btn" tool_tip="Supprimez ce résident de votre liste d&apos;amis"/>
+ <button label="Ajouter" name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
new file mode 100644
index 0000000000..69403939aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Profil du groupe" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Appeler le groupe" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Quitter l&apos;appel" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ouvrir les contrôles vocaux" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_general.xml b/indra/newview/skins/default/xui/fr/panel_group_general.xml
index 9afc4ae11d..cf71a28451 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml
@@ -1,70 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Général" name="general_tab">
- <string name="help_text">
- L&apos;onglet Général contient les infos générales et les préférences du groupe ainsi que la liste des propriétaires et des membres visibles.
- </string>
- <string name="group_info_unchanged">
+ <panel.string name="help_text">
+ L&apos;onglet Général contient les informations générales et les préférences du groupe ainsi que la liste et les options des membres.
+
+Faites glisser le pointeur de la souris sur les options pour en savoir plus.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
Le profil du groupe a changé.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/>
- <text name="group_name">
- Saisissez le nom du groupe ici
- </text>
- <text name="prepend_founded_by">
- Fondé par
- </text>
- <text left_delta="54" name="founder_name">
- (en attente)
- </text>
- <text name="group_charter_label">
- Charte du groupe
- </text>
- <texture_picker label="Logo du groupe" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Extraction des données du résident en cours
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="prepend_founded_by">
+ Fondateur :
+ </text>
+ <name_box initial_value="(récupération en cours)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratuit
+ </text>
+ <button label="REJOINDRE" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Indiquez ici la charte de votre groupe
</text_editor>
- <button label="Rejoindre (0L$)" label_selected="Rejoindre (0L$)" name="join_button"/>
- <button label="Affichage détaillé" label_selected="Affichage détaillé" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Propriétaires et membres visibles
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Les propriétaires apparaissent en gras)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nom du membre" name="name" relwidth="0.40"/>
+ <name_list.columns label="Membre" name="name" relwidth="0.40"/>
<name_list.columns label="Titre" name="title" relwidth="0.25"/>
- <name_list.columns label="Dernière connexion" name="online" relwidth="0.35"/>
+ <name_list.columns label="Statut" name="status"/>
</name_list>
- <text name="text_group_preferences">
- Préférences
+ <text name="my_group_settngs_label">
+ Moi
</text>
+ <text name="active_title_label">
+ Mon titre :
+ </text>
+ <combo_box name="active_title" tool_tip="Indique le titre qui apparaît en face du nom de votre avatar lorsque votre groupe est actif."/>
+ <check_box label="Recevoir les notices du groupe" name="receive_notices" tool_tip="Indique si vous souhaitez recevoir les notices envoyées au groupe. Décochez si ce groupe vous envoie des spams."/>
+ <check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez afficher ce groupe dans votre profil"/>
<panel name="preferences_container">
- <check_box label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Afficher ce groupe dans les résultats de recherche."/>
- <check_box label="Inscription libre" name="open_enrollement" tool_tip="Indique si une invitation est nécessaire pour devenir membre de ce groupe."/>
- <check_box label="Frais d&apos;inscription :" name="check_enrollment_fee" tool_tip="Indique s&apos;il y a des frais d&apos;inscription pour devenir membre."/>
- <spinner name="spin_enrollment_fee" tool_tip="Si la case Frais d&apos;inscription est cochée, cela signifie qu&apos;il faut payer des frais pour devenir membre."/>
- <combo_box name="group_mature_check" tool_tip="Indique si les informations sur votre groupe sont classées Mature." width="195">
- <combo_box.item name="select_mature" label="- Type de public -"/>
- <combo_box.item name="mature" label="Contenu Mature"/>
- <combo_box.item name="pg" label="Contenu PG"/>
+ <text name="group_settngs_label">
+ Groupe
+ </text>
+ <check_box label="Inscription ouverte à tous" name="open_enrollement" tool_tip="Indique si ce groupe autorise les nouveaux membres à le rejoindre sans y être invités."/>
+ <check_box label="Inscription payante" name="check_enrollment_fee" tool_tip="Indique s&apos;il faut payer des frais d&apos;inscription pour rejoindre ce groupe"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Les nouveaux membres doivent payer ces frais pour rejoindre le groupe quand l&apos;option Frais d&apos;inscription est cochée."/>
+ <combo_box name="group_mature_check" tool_tip="Définit si votre groupe contient des informations de type Modéré" width="195">
+ <combo_box.item label="Contenu Général" name="pg"/>
+ <combo_box.item label="Contenu Modéré" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mon titre actuel
- </text>
- <combo_box name="active_title" tool_tip="Définit le titre qui apparaît près du nom de votre avatar lorsque ce groupe est actif."/>
- </panel>
- <check_box label="Recevoir les notices" name="receive_notices" tool_tip="Cochez si vous souhaitez recevoir les notices envoyées au groupe. Décochez si ce groupe vous envoie des spams."/>
- <check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez que ce groupe apparaisse dans votre profil"/>
+ <check_box initial_value="true" label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Permettre aux autres résidents de voir ce groupe dans les résultats de recherche"/>
</panel>
- <string name="incomplete_member_data_str">
- Extraction des données du résident en cours
- </string>
- <string name="confirm_group_create_str">
- La création de ce groupe coûte 100 L$.
-Êtes-vous vraiment certain de vouloir dépenser 100 L$ pour créer ce groupe ?
-Sachez que si personne ne rejoint ce groupe sous 48h, il sera démantelé et ne pourra plus être utilisé.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..5b08b4aefb
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil du groupe" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Certaines modifications n&apos;ont pas été enregistrées.
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Voulez-vous enregistrer ces modifications ?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Rejoindre ([AMOUNT] L$)...
+ </panel.string>
+ <panel.string name="group_join_free">
+ Gratuit
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="(en cours de chargement...)"/>
+ <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Général"/>
+ <accordion_tab name="group_roles_tab" title="Rôles"/>
+ <accordion_tab name="group_notices_tab" title="Notices"/>
+ <accordion_tab name="group_land_tab" title="Terrain/Actifs"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Appel de groupe" name="btn_call" tool_tip="Appeler ce groupe"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/>
+ <button label="Créer un groupe" name="btn_create" tool_tip="Créer un groupe"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
index 4cb0b88672..53f7ac33c2 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
@@ -1,26 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Inviter un résident" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
+ </panel.string>
+ <panel.string name="loading">
+ (en cours de chargement...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Certains résidents que vous avez choisis font déjà partie du groupe et l&apos;invitation ne leur a donc pas été envoyée.
+ </panel.string>
<text name="help_text">
- Vous pouvez inviter plusieurs résidents
-à la fois. Cliquez d&apos;abord sur
-Choisir un résident.
+ Vous pouvez inviter plusieurs résidents à la fois. Cliquez d&apos;abord sur Choisir un résident.
</text>
<button label="Choisir un résident" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/>
- <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/>
- <text>
- Assignez-leur un rôle :
- </text>
+ <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs résidents, maintenez la touche Ctrl enfoncée et cliquez sur leurs noms"/>
+ <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés ci-dessus de la liste des invités"/>
<text name="role_text">
Assignez-leur un rôle :
</text>
- <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/>
+ <combo_box name="role_name" tool_tip="Choisissez dans la liste de rôles que vous êtes autorisé(e) à attribuer aux membres"/>
<button label="Envoyer les invitations" name="ok_button"/>
<button label="Annuler" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
- </string>
- <string name="loading">
- (en cours de chargement...)
+ <string name="GroupInvitation">
+ Invitations au groupe
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 29259e2e42..a10eaf9d18 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -1,86 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terrain et L$" name="land_money_tab">
- <string name="help_text">
- Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe.
- </string>
- <string name="cant_view_group_accounting_text">
- Vous n&apos;avez pas la permission d&apos;accéder aux informations
-financières de ce groupe.
- </string>
- <string name="loading_txt">
+ <panel.string name="help_text">
+ Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ Vous n&apos;avez pas la permission d&apos;accéder aux informations financières de ce groupe.
+ </panel.string>
+ <panel.string name="loading_txt">
Chargement...
- </string>
- <text name="group_land_heading">
- Terrain du groupe
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parcelle" name="name"/>
- <column label="Région" name="location"/>
- <column label="Type" name="type"/>
- <column label="Surface" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button"/>
- <text name="total_contributed_land_label">
- Total des contributions :
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Superficie déjà utilisée :
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Superficie disponible :
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Votre contribution :
- </text>
- <string name="land_contrib_error">
- Impossible de définir votre don de terre.
- </string>
- <text name="your_contribution_units">
- ( m² )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] max.)
- </text>
- <text name="group_over_limit_text">
- Une contribution supplémentaire du groupe est requise pour prendre en
-charge le terrain utilisé.
- </text>
- <text name="group_money_heading">
- Finances
- </text>
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Impossible de définir votre don de terrain
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parcelle" name="name"/>
+ <scroll_list.columns label="Région" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Surface" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Total des contributions :
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Carte" label_selected="Carte" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Superficie déjà utilisée :
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Superficie disponible :
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Votre contribution :
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max.)
+ </text>
+ <text name="group_over_limit_text">
+ Une contribution supplémentaire est requise pour prendre en charge le terrain utilisé
+ </text>
+ <text name="group_money_heading">
+ Finances
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
- <panel label="Planification" name="group_money_planning_tab">
+ <panel label="PLANIFICATION" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Calcul en cours...
+ Chargement...
</text_editor>
</panel>
- <panel label="Détails" name="group_money_details_tab">
+ <panel label="DÉTAILS" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Calcul en cours...
+ Chargement...
</text_editor>
- <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/>
- <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Avancer dans le temps"/>
+ <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Précédent"/>
+ <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Suivant"/>
</panel>
- <panel label="Ventes" name="group_money_sales_tab">
+ <panel label="VENTES" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Calcul en cours...
+ Chargement...
</text_editor>
- <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/>
- <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Avancer dans le temps"/>
+ <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Précédent"/>
+ <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Suivant"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml
new file mode 100644
index 0000000000..5fb69d1989
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Inconnu"/>
+ <button name="profile_btn" tool_tip="Voir le profil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index 841ac5e7ee..35a5caaa92 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -1,59 +1,57 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Notices" name="notices_tab">
- <text name="help_text">
- Les notices vous permettent d&apos;envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l&apos;onglet Général.
- </text>
- <text name="no_notices_text">
- Aucune notice
- </text>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Anciennes notices du groupe
- </text>
+ <panel.string name="help_text">
+ Les notices vous permettent d&apos;envoyer un message et facultativement, une pièce jointe si vous le souhaitez.
+Les notices ne peuvent être envoyées qu&apos;aux membres du groupe dont le rôle leur permet de recevoir des notices.
+Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Pas d&apos;anciennes notices
+ </panel.string>
<text name="lbl2">
- Les notices sont conservées pendant 14 jours et chaque groupe a une limite quotidienne de 200 notices.
+ Les notices sont conservées pendant 14 jours.
+200 max. par groupe et par jour.
</text>
<scroll_list name="notice_list">
- <column label="" name="icon"/>
- <column label="Sujet" name="subject"/>
- <column label="De" name="from"/>
- <column label="Date" name="date"/>
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="Sujet" name="subject"/>
+ <scroll_list.columns label="De" name="from"/>
+ <scroll_list.columns label="Date" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Aucun résultat.
+ Aucun résultat
</text>
- <button label="Créer une notice" label_selected="Créer une notice" name="create_new_notice"/>
- <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/>
+ <button label="Créer une notice" label_selected="Créer une notice" name="create_new_notice" tool_tip="Créer une notice"/>
+ <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices" tool_tip="Actualiser la liste des notices"/>
<panel label="Créer une notice" name="panel_create_new_notice">
<text name="lbl">
Créer une notice
</text>
- <text name="lbl2">
- Pour joindre une pièce-jointe à cette notice, faites-la glisser depuis votre inventaire vers cette fenêtre. Les pièces-jointes doivent être copiables et transférables. Il n&apos;est pas possible d&apos;envoyer de dossiers.
- </text>
- <text bottom_delta="-79" name="lbl3" left="20">
+ <text name="lbl3">
Sujet :
</text>
- <line_editor name="create_subject" width="331" left_delta="61"/>
- <text name="lbl4" left="20">
+ <line_editor name="create_subject"/>
+ <text name="lbl4">
Message :
</text>
- <text_editor name="create_message" bottom_delta="-90" height="104" left_delta="61" width="330"/>
- <text name="lbl5" width="68">
+ <text_editor name="create_message"/>
+ <text name="lbl5">
Pièce-jointe :
</text>
- <line_editor name="create_inventory_name" width="190" left_delta="74"/>
- <button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
- <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/>
- <panel name="drop_target2" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
- <panel name="drop_target" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
+ <line_editor name="create_inventory_name"/>
+ <text name="string">
+ Faire glisser l&apos;objet et le déposer ici pour le joindre :
+ </text>
+ <button label="Supprimer" label_selected="Supprimer pièce-jointe" name="remove_attachment" tool_tip="Supprimer la pièce jointe de votre notification"/>
+ <button label="Envoyer" label_selected="Envoyer" left="200" name="send_notice" width="100"/>
+ <group_drop_target name="drop_target" tool_tip="Faites glisser un objet de l&apos;inventaire jusqu&apos;à cette case pour l&apos;envoyer avec la notice. Vous devez avoir l&apos;autorisation de copier et transférer l&apos;objet pour pouvoir le joindre."/>
</panel>
<panel label="Voir ancienne notice" name="panel_view_past_notice">
<text name="lbl">
Détails
</text>
<text name="lbl2">
- Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus.
+ Pour envoyer une nouvelle notice, cliquez sur le bouton +
</text>
<text name="lbl3">
Sujet :
@@ -61,7 +59,7 @@
<text name="lbl4">
Message :
</text>
- <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
<line_editor left="128" name="view_inventory_name" width="256"/>
+ <button label="Ouvrir la pièce jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notify.xml b/indra/newview/skins/default/xui/fr/panel_group_notify.xml
new file mode 100644
index 0000000000..08a49f908c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="en-tête" name="header">
+ <text name="title" value="Nom de l&apos;expéditeur / Nom du groupe"/>
+ </panel>
+ <text_editor name="message" value="message"/>
+ <text name="attachment" value="Pièce jointe"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index 008402db32..7fc10833ea 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -1,152 +1,105 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membres et rôles" name="roles_tab">
- <text name="default_needs_apply_text">
- Certains changements n&apos;ont pas été appliqués sur ce sous-onglet.
- </text>
- <text name="want_apply_text">
- Voulez-vous enregistrer les modifications ?
- </text>
- <text name="cant_delete_role">
- Les Rôles Tout le monde et Propriétaires sont spéciaux et ne peuvent être supprimés.
- </text>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Membres
- </text>
- <text name="static2">
- Les rôles de chaque membre peuvent être personnalisés, ce qui permet une
-meilleure organisation du groupe.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Rôles
- </text>
- <text name="role_properties_modifiable">
- Sélectionnez un rôle ci-dessous. Vous pouvez modifier le nom, la
-description et le titre du membre.
- </text>
- <text name="role_properties_not_modifiable">
- Sélectionnez un rôle ci-dessous pour en connaître les propriétés, les
-membres et les pouvoirs.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- Vous pouvez aussi assigner des pouvoirs au rôle.
- </text>
- <text name="role_actions_not_modifiable">
- Vous pouvez afficher mais non modifier les pouvoirs assignés.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Pouvoirs
- </text>
- <text name="static2">
- Vous pouvez afficher la description du pouvoir et voir à quels rôles ou à
-quels membres ces pouvoirs sont assignés.
- </text>
- </panel>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres">
- <line_editor bottom="127" name="search_text"/>
- <button label="Rechercher" name="search_button" width="75"/>
- <button label="Afficher tout" left_delta="80" name="show_all_button"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
- <column label="Nom du membre" name="name"/>
- <column label="Surface donnée" name="donated" width="116"/>
- <column label="Dernière connexion" name="online" width="136"/>
- </name_list>
- <button label="Inviter un membre..." name="member_invite" width="165"/>
- <button label="Expulser un membre" name="member_eject"/>
- <text name="help_text">
+ <panel.string name="default_needs_apply_text">
+ Certaines modifications n&apos;ont pas été enregistrées.
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Voulez-vous enregistrer vos modifications ?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBRES" name="members_sub_tab" tool_tip="Membres">
+ <panel.string name="help_text">
Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
- </text>
+ </panel.string>
+ <filter_editor label="Filtrer les membres" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Membre" name="name"/>
+ <name_list.columns label="Donation" name="donated" width="116"/>
+ <name_list.columns label="Statut" name="online" width="136"/>
+ </name_list>
+ <button label="Inviter" name="member_invite" width="165"/>
+ <button label="Expulser" name="member_eject"/>
</panel>
- <panel height="148" label="Rôles" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Rechercher" name="search_button" width="75"/>
- <button label="Afficher tout" left_delta="80" name="show_all_button"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
- <column label="Nom du rôle" name="name"/>
- <column label="Titre" name="title"/>
- <column label="Membres" name="members"/>
- </scroll_list>
- <button label="Créer un rôle..." name="role_create"/>
- <button label="Supprimer le rôle" name="role_delete"/>
- <text name="help_text">
- Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus.
- </text>
- <string name="cant_delete_role">
+ <panel label="RÔLES" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Chaque rôle possède un titre et des
+pouvoirs. Les membres peuvent avoir
+un ou plusieurs rôles. Un groupe peut avoir jusqu&apos;à 10 rôles,
+notamment les rôles Tous et Propriétaire.
+ </panel.string>
+ <panel.string name="cant_delete_role">
Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés.
- </string>
- </panel>
- <panel height="148" label="Pouvoirs" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Rechercher" name="search_button" width="75"/>
- <button label="Afficher tout" left_delta="80" name="show_all_button"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string name="power_all_have_icon">
+ Checkbox_On
+ </panel.string>
+ <panel.string name="power_partial_icon">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor label="Filtrer les rôles" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Rôle" name="name"/>
+ <scroll_list.columns label="Titre" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <text name="help_text">
+ <button label="Nouveau rôle" name="role_create"/>
+ <button label="Supprimer le rôle" name="role_delete" width="120"/>
+ </panel>
+ <panel height="148" label="POUVOIRS" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s&apos;en servir.">
+ <panel.string name="help_text">
Les pouvoirs déterminent les facultés de chaque membre dans le groupe.
- </text>
+ </panel.string>
+ <filter_editor label="Filtrer les pouvoirs" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en savoir plus">
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Rôles assignés
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
Pouvoirs attribués
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
- </scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
+ <scroll_list name="member_allowed_actions" tool_tip="Pour en savoir plus sur chaque pouvoir, consultez l&apos;onglet Pouvoirs">
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
- Nom
+ Nom du rôle
</text>
+ <line_editor name="role_name"/>
+ <text name="static3">
+ Titre du rôle
+ </text>
+ <line_editor name="role_title"/>
<text name="static2">
Description
</text>
- <line_editor name="role_name">
- Employés
- </line_editor>
- <text name="static3">
- Titre
- </text>
- <line_editor name="role_title">
- (en attente)
- </line_editor>
- <text_editor name="role_description">
- (en attente)
- </text_editor>
+ <text_editor name="role_description"/>
<text name="static4">
Membres assignés
</text>
+ <check_box label="Afficher les membres" name="role_visible_in_list" tool_tip="Détermine si les personnes n&apos;appartenant pas au groupe peuvent voir les membres de ce rôle dans l&apos;onglet Général."/>
<text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
Pouvoirs attribués
</text>
- <check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe."/>
- <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="role_allowed_actions" tool_tip="Pour en savoir plus sur chaque pouvoir, consultez l&apos;onglet Pouvoirs">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
- <text name="static">
- Description
- </text>
<text_editor name="action_description">
Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
</text_editor>
diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml
index 98320656fb..4cda98b9f7 100644
--- a/indra/newview/skins/default/xui/fr/panel_groups.xml
+++ b/indra/newview/skins/default/xui/fr/panel_groups.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="groups">
<scroll_list bottom="50" name="group list"/>
- <text bottom="16" height="32" name="groupdesc" width="268">
+ <text name="groupdesc">
Le groupe actif est en gras.
</text>
- <text bottom="3" name="groupcount">
+ <text name="groupcount" width="280">
Vous appartenez à [COUNT] groupes ([MAX] max).
</text>
<button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
new file mode 100644
index 0000000000..115e25e487
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Inconnu"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Devenir amis" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Partager" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Payer" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Appeler" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Quitter l&apos;appel" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_instant_message.xml b/indra/newview/skins/default/xui/fr/panel_instant_message.xml
new file mode 100644
index 0000000000..bf3720f411
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_instant_message.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="user_name" value="Erica Vader"/>
+ <text name="time_box" value="23:30"/>
+ </panel>
+ <button label="Répondre" name="reply"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
new file mode 100644
index 0000000000..a2f82c72df
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Créer un repère"/>
+ <string name="title_edit_landmark" value="Modifier le repère"/>
+ <string name="title_landmark" value="Repère"/>
+ <string name="not_available" value="(s/o)"/>
+ <string name="unknown" value="(inconnu)"/>
+ <string name="public" value="(public)"/>
+ <string name="server_update_text">
+ Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
+ </string>
+ <string name="server_error_text">
+ Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
+ </string>
+ <string name="server_forbidden_text">
+ Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <button name="back_btn" tool_tip="Précédent"/>
+ <text name="title" value="Profil du lieu"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="(inconnu)"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Propriétaire :"/>
+ <text name="creator_label" value="Créé par :"/>
+ <text name="created_label" value="Le :"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Titre :"/>
+ <text name="notes_label" value="Mes notes :"/>
+ <text name="folder_label" value="Emplacement du repère :"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_landmarks.xml b/indra/newview/skins/default/xui/fr/panel_landmarks.xml
new file mode 100644
index 0000000000..9c15b0bbd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barre des Favoris"/>
+ <accordion_tab name="tab_landmarks" title="Mes repères"/>
+ <accordion_tab name="tab_inventory" title="Mon inventaire"/>
+ <accordion_tab name="tab_library" title="Bibliothèque"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <button name="add_btn" tool_tip="Ajouter un nouveau repère"/>
+ <dnd_button name="trash_btn" tool_tip="Supprimer le repère sélectionné"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index eeef97454f..209a803e07 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,43 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
- <text name="first_name_text">
- Prénom :
- </text>
- <text name="last_name_text">
- Nom :
- </text>
- <text name="password_text">
- Mot de passe :
- </text>
- <text name="start_location_text">
- Lieu de départ :
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Domicile" />
- <combo_box.item name="MyLastLocation" label="Dernier emplacement" />
- <combo_box.item name="Typeregionname" label="&lt;Nom de la région&gt;" />
- </combo_box>
- <check_box label="Mémoriser" name="remember_check"/>
- <text name="full_screen_text">
- Le plein écran sera activé après identification.
- </text>
- <button label="Nouveau Compte..." label_selected="Nouveau Compte..." name="new_account_btn"/>
- <button label="Me connecter" label_selected="Me connecter" name="connect_btn"/>
- <button label="Préférences..." label_selected="Préférences..." name="preferences_btn"/>
- <button label="Quitter" label_selected="Quitter" name="quit_btn"/>
- <text name="version_text">
- 1.23.4 (5)
- </text>
- <text name="create_new_account_text">
- Créer un compte
- </text>
- <text name="forgot_password_text">
- Nom ou mot de passe oublié ?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ <panel.string name="create_account_url">
+ http://fr.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=fr
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Prénom :
+ </text>
+ <line_editor label="Prénom" name="first_name_edit" tool_tip="Prénom [SECOND_LIFE]"/>
+ <text name="last_name_text">
+ Nom :
+ </text>
+ <line_editor label="Nom :" name="last_name_edit" tool_tip="Nom [SECOND_LIFE]"/>
+ <text name="password_text">
+ Mot de passe :
+ </text>
+ <check_box label="Enregistrer" name="remember_check"/>
+ <text name="start_location_text">
+ Commencer à :
+ </text>
+ <combo_box name="start_location_combo" width="152">
+ <combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
+ <combo_box.item label="Domicile" name="MyHome"/>
+ <combo_box.item label="&lt;Saisissez le nom de la région&gt;" name="Typeregionname"/>
+ </combo_box>
+ <button label="Connexion" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ S&apos;inscrire
+ </text>
+ <text name="forgot_password_text">
+ Nom ou mot de passe oublié ?
+ </text>
+ <text name="login_help">
+ Besoin d&apos;aide ?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
new file mode 100644
index 0000000000..5faba01339
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Choses" name="main inventory panel">
+ <panel.string name="Title">
+ Choses
+ </panel.string>
+ <filter_editor label="Filtrer l&apos;inventaire" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="MON INVENTAIRE" name="All Items"/>
+ <inventory_panel label="RÉCENT" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <button name="add_btn" tool_tip="Ajouter un nouvel article"/>
+ <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;article sélectionné"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Fichier" name="File">
+ <menu_item_call label="Ouvrir" name="Open"/>
+ <menu label="Charger" name="upload">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nouvelle fenêtre" name="New Window"/>
+ <menu_item_call label="Afficher les filtres" name="Show Filters"/>
+ <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
+ <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
+ <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
+ <menu_item_call label="Vider les Objets trouvés" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Créer" name="Create">
+ <menu_item_call label="Nouveau dossier" name="New Folder"/>
+ <menu_item_call label="Nouveau script" name="New Script"/>
+ <menu_item_call label="Nouvelle note" name="New Note"/>
+ <menu_item_call label="Nouveau geste" name="New Gesture"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Trier" name="Sort">
+ <menu_item_check label="Par nom" name="By Name"/>
+ <menu_item_check label="Par date" name="By Date"/>
+ <menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name"/>
+ <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml
new file mode 100644
index 0000000000..2521967bc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mon profil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="MON PROFIL" name="panel_profile"/>
+ <panel label="MES PRÉFÉRENCES" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml
new file mode 100644
index 0000000000..afd2d9cd8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Général" name="Media Settings General">
+ <text name="home_label">
+ Page d&apos;accueil :
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Cette page a été rejetée par la liste blanche spécifiée)
+ </text>
+ <line_editor name="home_url" tool_tip="La page d&apos;accueil pour cette source média"/>
+ <text name="preview_label">
+ Prévisualiser
+ </text>
+ <text name="current_url_label">
+ Page actuelle :
+ </text>
+ <text name="current_url" tool_tip="La page actuelle pour cette source média" value=""/>
+ <button label="Réinitialiser" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Boucle auto" name="auto_loop"/>
+ <check_box initial_value="false" label="Premier clic interagit" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom auto" name="auto_zoom"/>
+ <check_box initial_value="false" label="Lecture auto du média" name="auto_play"/>
+ <text name="media_setting_note">
+ Remarque : kes résidents peuvent ignorer ce paramètre
+ </text>
+ <check_box initial_value="false" label="Mise à l&apos;échelle auto du média sur la face de l&apos;objet" name="auto_scale"/>
+ <text name="size_label">
+ Taille :
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..6f6ae035a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Personnaliser" name="Media settings for controls">
+ <text name="controls_label">
+ Contrôles :
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_group_control"/>
+ <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
new file mode 100644
index 0000000000..9d070b7aff
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sécurité" name="Media Settings Security">
+ <check_box initial_value="false" label="Autoriser l&apos;accès aux styles d&apos;URL spécifiés uniquement" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Les entrées par lesquelles la page
+d&apos;accueil est rejetée sont indiquées :
+ </text>
+ <button label="Ajouter" name="whitelist_add"/>
+ <button label="Supprimer" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Avertissement : la page d&apos;accueil spécifiée dans l&apos;onglet Général a été rejetée par la liste blanche. Elle sera désactivée jusqu&apos;à l&apos;ajout d&apos;une entrée valide.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_my_profile.xml b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
new file mode 100644
index 0000000000..73affc3420
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=en
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="no_partner_text" value="Aucun"/>
+ <string name="no_group_text" value="Aucun"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d&apos;image"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d&apos;image"/>
+ <text name="title_rw_descr_text" value="Monde physique :"/>
+ </panel>
+ <text name="title_member_text" value="Résident depuis :"/>
+ <text name="title_acc_status_text" value="Statut du compte :"/>
+ <text_editor name="acc_status_text">
+ Résident. Aucune info de paiement enregistrée.
+ Linden.
+ </text_editor>
+ <text name="title_partner_text" value="Partenaire :"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(récupération en cours)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Groupes :"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
+ <button label="Changer d&apos;apparence" name="edit_appearance_btn" tool_tip="Créer/modifier votre apparence : données physiques, habits, etc."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
new file mode 100644
index 0000000000..974c0cd032
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
+ <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
+ <button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
+ <location_input label="Emplacement" name="location_combo"/>
+ <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
+ <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ Barre des Favoris
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
new file mode 100644
index 0000000000..f1a7ebb35c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text
+ name="sender_name"
+width="170">CHAT PRÈS DE VOUS</text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..8ed441cbae
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/>
+ <button name="show_nearby_chat" tool_tip="Affiche/Masque le journal de chats près de vous"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
new file mode 100644
index 0000000000..53b9bc6f82
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld articles de média)
+ </string>
+ <string name="empty_item_text">
+ &lt;vide&gt;
+ </string>
+ <string name="parcel_media_name">
+ Flux de média de la parcelle
+ </string>
+ <string name="parcel_audio_name">
+ Flux audio de la parcelle
+ </string>
+ <string name="playing_suffix">
+ (lecture en cours)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Tout arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
+ <button label="Tout lancer" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
+ <button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/>
+ <button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="more_less_btn" tool_tip="Options avancées"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Tout" name="All"/>
+ <combo_box.item label="Dans cette parcelle" name="WithinParcel"/>
+ <combo_box.item label="En dehors de la parcelle" name="OutsideParcel"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximité" name="media_proximity"/>
+ <scroll_list.columns label="Visible" name="media_visibility"/>
+ <scroll_list.columns label="Classe" name="media_class"/>
+ <scroll_list.columns label="Nom" name="media_name"/>
+ <scroll_list.columns label="Débogage" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Arrêter le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Jouer le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pauser le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume audio pour le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Couper l&apos;audio sur le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoomer en avant sur le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoomer en arrière sur le média sélectionné"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml
new file mode 100644
index 0000000000..ba052a0e07
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notes/Perso" name="panel_notes">
+ <layout_stack name="layout">
+ <layout_panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Mes notes perso :"/>
+ <text name="status_message2" value="Autoriser cette personne à :"/>
+ <check_box label="Afficher mon statut en ligne" name="status_check"/>
+ <check_box label="Me situer sur la carte" name="map_check"/>
+ <check_box label="Modifier, supprimer ou prendre mes objets" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="notes_buttons_panel">
+ <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button label="IM" name="im" width="30" tool_tip="Ouvrir une session IM"/>
+ <button label="Appeler" name="call" width="60" tool_tip="Appeler ce résident"/>
+ <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
+ <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_online_status.xml b/indra/newview/skins/default/xui/fr/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..9b9d830aaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Choses" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <inventory_panel label="MES TENUES" name="outfitslist_tab"/>
+ <inventory_panel label="PORTÉ" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;objet sélectionné"/>
+ <button label="Enregistrer la tenue" name="make_outfit_btn" tool_tip="Enregistrer l&apos;apparence comme tenue"/>
+ <button label="Porter" name="wear_btn" tool_tip="Porter la tenue sélectionnée"/>
+ <button label="M" name="look_edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..4703559111
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Remplacer la tenue actuelle" name="wear"/>
+ <menu_item_call label="Enlever de la tenue actuelle" name="remove"/>
+ <menu_item_call label="Renommer" name="rename"/>
+ <menu_item_call label="Supprimer le lien" name="remove_link"/>
+ <menu_item_call label="Supprimer la tenue" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
new file mode 100644
index 0000000000..f129f56261
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Résidents" name="people_panel">
+ <string name="no_people" value="Personne"/>
+ <string name="no_one_near" value="Personne près de vous"/>
+ <string name="no_friends_online" value="Pas d&apos;amis connectés"/>
+ <string name="no_friends" value="Pas d&apos;amis"/>
+ <string name="people_filter_label" value="Filtrer les personnes"/>
+ <string name="groups_filter_label" value="Filtrer les groupes"/>
+ <filter_editor label="Filtre" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="PRÈS DE VOUS" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Options"/>
+ <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
+ </panel>
+ </panel>
+ <panel label="MES AMIS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="En ligne"/>
+ <accordion_tab name="tab_all" title="Tout"/>
+ </accordion>
+ <text name="no_friends_msg">
+ Pour ajouter des amis, essayez [secondlife:///app/search/people la recherche globale] ou cliquez sur un utilisateur pour l&apos;ajouter à vos amis.
+Si vous voulez rencontrer d&apos;autres résidents, ouvrez la [secondlife:///app/worldmap carte].
+ </text>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Options"/>
+ <button name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis"/>
+ </panel>
+ </panel>
+ <panel label="MES GROUPES" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Options"/>
+ <button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/>
+ <button name="activate_btn" tool_tip="Activer le groupe sélectionné"/>
+ </panel>
+ </panel>
+ <panel label="RÉCENT" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Options"/>
+ <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
+ <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
+ <button label="Appeler" name="call_btn" tool_tip="Appeler ce résident"/>
+ <button label="Partager" name="share_btn"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposez une téléportation"/>
+ <button label="Profil" name="group_info_btn" tool_tip="Voir le profil du groupe"/>
+ <button label="Chat" name="chat_btn" tool_tip="Ouvrir une session de chat"/>
+ <button label="Appel" name="group_call_btn" tool_tip="Appeler ce groupe"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_pick_info.xml b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
new file mode 100644
index 0000000000..e9572caac7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Infos"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[loading...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="show_on_map_btn"/>
+ <button label="Éditer" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_picks.xml b/indra/newview/skins/default/xui/fr/panel_picks.xml
new file mode 100644
index 0000000000..e33281defc
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_picks.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favoris" name="panel_picks">
+ <string name="no_picks" value="Pas de favoris"/>
+ <string name="no_classifieds" value="Pas de petites annonces"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Favoris"/>
+ <accordion_tab name="tab_classifieds" title="Petites annonces"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Créer une nouvelle préférence ou petite annonce à l&apos;emplacement actuel"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Infos" name="info_btn" tool_tip="Afficher les informations du Favori"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu&apos;à la zone correspondante"/>
+ <button label="Carte" name="show_on_map_btn" tool_tip="Afficher la zone correspondante sur la carte du monde"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
new file mode 100644
index 0000000000..620bab0c24
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Activé"/>
+ <string name="off" value="Désactivé"/>
+ <string name="anyone" value="Tout le monde"/>
+ <string name="available" value="disponible"/>
+ <string name="allocated" value="affecté"/>
+ <string name="title_place" value="Profil du lieu"/>
+ <string name="title_teleport_history" value="Historique des téléportations"/>
+ <string name="not_available" value="(s/o)"/>
+ <string name="unknown" value="(inconnu)"/>
+ <string name="public" value="(public)"/>
+ <string name="none_text" value="(aucun)"/>
+ <string name="sale_pending_text" value="(vente en cours)"/>
+ <string name="group_owned_text" value="(propriété du groupe)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Tous les résidents"/>
+ <string name="group_text" value="Groupe"/>
+ <string name="can_resell">
+ Le terrain acheté dans cette région peut être revendu.
+ </string>
+ <string name="can_not_resell">
+ Le terrain acheté dans cette région ne peut pas être revendu.
+ </string>
+ <string name="can_change">
+ Le terrain acheté dans cette région peut être fusionné ou divisé.
+ </string>
+ <string name="can_not_change">
+ Le terrain acheté dans cette région ne peut pas être fusionné ou divisé.
+ </string>
+ <string name="server_update_text">
+ Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
+ </string>
+ <string name="server_error_text">
+ Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
+ </string>
+ <string name="server_forbidden_text">
+ Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions auprès du propriétaire de la parcelle.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <string name="icon_Voice" value="parcel_drk_Voice"/>
+ <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
+ <string name="icon_Fly" value="parcel_drk_Fly"/>
+ <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
+ <string name="icon_Push" value="parcel_drk_Push"/>
+ <string name="icon_PushNo" value="parcel_drk_PushNo"/>
+ <string name="icon_Build" value="parcel_drk_Build"/>
+ <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
+ <string name="icon_Scripts" value="parcel_drk_Scripts"/>
+ <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
+ <string name="icon_Damage" value="parcel_drk_Damage"/>
+ <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
+ <button name="back_btn" tool_tip="Précédent"/>
+ <text name="title" value="Profil du lieu"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Exemple de région"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Propriétaire :"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="(inconnu)"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parcelle">
+ <panel>
+ <text name="rating_label" value="Catégorie :"/>
+ <text name="rating_value" value="(inconnu)"/>
+ <text name="voice_label" value="Voix :"/>
+ <text name="voice_value" value="Activée"/>
+ <text name="fly_label" value="Voler :"/>
+ <text name="fly_value" value="Activé"/>
+ <text name="push_label" value="Appuyer :"/>
+ <text name="push_value" value="Désactivé"/>
+ <text name="build_label" value="Construire :"/>
+ <text name="build_value" value="Activé"/>
+ <text name="scripts_label" value="Scripts :"/>
+ <text name="scripts_value" value="Activés"/>
+ <text name="damage_label" value="Dégâts :"/>
+ <text name="damage_value" value="Désactivés"/>
+ <button label="À propos des terrains" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Région">
+ <panel>
+ <text name="region_name_label" value="Région :"/>
+ <text name="region_name" value="Pays des orignaux"/>
+ <text name="region_type_label" value="Type :"/>
+ <text name="region_type" value="Orignal"/>
+ <text name="region_rating_label" value="Catégorie :"/>
+ <text name="region_rating" value="Adulte"/>
+ <text name="region_owner_label" value="Propriétaire :"/>
+ <text name="region_owner" value="orignal Van Orignal"/>
+ <text name="region_group_label" value="Groupe :"/>
+ <text name="region_group">
+ Le puissant orignal d&apos;Orignalville
+ </text>
+ <button label="Région/Domaine" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Domaine">
+ <panel>
+ <text name="estate_name_label" value="Domaine :"/>
+ <text name="estate_rating_label" value="Catégorie :"/>
+ <text name="estate_owner_label" value="Propriétaire :"/>
+ <text name="covenant_label" value="Règlement :"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="À vendre">
+ <panel>
+ <text name="sales_price_label" value="Prix :"/>
+ <text name="area_label" value="Surface :"/>
+ <text name="traffic_label" value="Trafic :"/>
+ <text name="primitives_label" value="Prims :"/>
+ <text name="parcel_scripts_label" value="Scripts :"/>
+ <text name="terraform_limits_label" value="Limites de terraformage :"/>
+ <text name="subdivide_label" value="Possibilité de division/fusion :"/>
+ <text name="resale_label" value="Possibilité de revente :"/>
+ <text name="sale_to_label" value="À vendre à :"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml
new file mode 100644
index 0000000000..f6a64f0c58
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_places.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lieux" name="places panel">
+ <string name="landmarks_tab_title" value="MES REPÈRES"/>
+ <string name="teleport_history_tab_title" value="HISTORIQUE DES TÉLÉPORTATIONS"/>
+ <filter_editor label="Filtrer Mes lieux" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu&apos;à la zone sélectionnée"/>
+ <button label="Carte" name="map_btn"/>
+ <button label="Éditer" name="edit_btn" tool_tip="Modifier les informations du repère"/>
+ <button name="overflow_btn" tool_tip="Afficher d&apos;autres options"/>
+ <button label="Fermer" name="close_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Enregistrer" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index 4f0f6a8a23..4b8559fdde 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -1,12 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <text name="AspectRatioLabel1" tool_tip="largeur/hauteur">
- Rapport hauteur/largeur :
+<panel label="Avancées" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <slider label="Angle de vue" name="camera_fov"/>
+ <slider label="Distance" name="camera_offset_scale"/>
+ <text name="heading2">
+ Positionnement automatique pour :
</text>
- <combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
- <combo_box.item label="4:3 (Standard CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280 x 1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (écran large)" name="item3"/>
- <combo_box.item label="16:9 (plein écran)" name="item4"/>
- </combo_box>
+ <check_box label="Construire/Éditer" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/>
+ <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/>
+ <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/>
+ <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
+ <check_box label="Faire bouger les lèvres de l&apos;avatar quand il parle" name="enable_lip_sync"/>
+ <check_box label="Bulles de chat" name="bubble_text_chat"/>
+ <slider label="Opacité" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/>
+ <check_box label="Afficher les erreurs de script dans :" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Chat près de vous" name="0"/>
+ <radio_item label="Autre fenêtre" name="1"/>
+ </radio_group>
+ <check_box label="Activer/désactiver la fonction Parler quand j&apos;appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n&apos;êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/>
+ <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/>
+ <button label="Définir la touche" name="set_voice_hotkey_button"/>
+ <button label="Bouton central de la souris" name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
index 61fcd912f5..901a92ed1b 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
@@ -1,21 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Pop-ups" name="popups" title="Pop-ups">
- <text name="text_box">
- Ne pas afficher les pop-ups :
+ <text name="tell_me_label">
+ Me prévenir :
</text>
- <text name="dont_show_label">
- Ne pas afficher ces pop-ups :
- </text>
- <button label="Activer ce pop-up" label_selected="Autoriser ce pop-up" name="enable_popup"/>
+ <check_box label="Quand je dépense ou que je reçois des L$" name="notify_money_change_checkbox"/>
+ <check_box label="Quand mes amis se connectent ou se déconnectent" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Afficher ces pop-ups :
+ Toujours afficher :
</text>
- <button label="Désactiver tous les pop-ups" name="skip_dialogs_btn" tool_tip="Désactiver tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
- <text name="text_box2">
- Offres de notes, textures et repères :
+ <text name="dont_show_label">
+ Ne jamais afficher :
</text>
- <button label="Activer tous les pop-ups" label_selected="Réinitialiser les dialogues &apos;Afficher la prochaine fois&apos;..." name="reset_dialogs_btn" tool_tip="Activer tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
- <check_box label="Accepter automatiquement" name="accept_new_inventory"/>
- <check_box label="Afficher après avoir accepté" name="show_new_inventory"/>
- <check_box label="Ouvrir l&apos;inventaire et sélectionner les objets reçus" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index f616591c4e..27242ec3de 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat écrit" name="chat">
- <text name="text_box">
- Taille de la police
-du chat :
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Petite" />
- <radio_item name="radio2" label="Moyenne" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Moins" name="radio" value="0"/>
+ <radio_item label="Moyenne" name="radio2" value="1"/>
+ <radio_item label="Plus" name="radio3" value="2"/>
</radio_group>
<color_swatch label="Vous" name="user"/>
<text name="text_box1">
- Vous
+ Moi
</text>
<color_swatch label="Avatars" name="agent"/>
<text name="text_box2">
@@ -37,23 +33,15 @@ du chat :
<text name="text_box7">
Propriétaire
</text>
- <color_swatch label="Bulle" name="background"/>
- <text name="text_box8">
- Bulle
- </text>
<color_swatch label="URL" name="links"/>
<text name="text_box9">
URL
</text>
- <spinner label="Effacer le texte après" label_width="112" name="fade_chat_time" width="162"/>
- <spinner left="335" name="max_chat_count"/>
- <slider label="Opacité" name="console_opacity"/>
- <check_box label="Utiliser la largeur de l&apos;écran (redémarrage requis)" name="chat_full_width_check"/>
- <check_box label="Fermer le chat après avoir appuyé sur Entrée" name="close_chat_on_return_check"/>
- <check_box label="Faire bouger l&apos;avatar avec les touches de direction" name="arrow_keys_move_avatar_check"/>
- <check_box label="Afficher les heures dans le chat" name="show_timestamps_check"/>
- <check_box label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
- <check_box label="Afficher les bulles de chat" name="bubble_text_chat"/>
- <slider label="Opacité" name="bubble_chat_opacity"/>
- <check_box label="Afficher les erreurs dans le chat" name="script_errors_as_chat"/>
+ <check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
+ <check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
+ <check_box label="Activer l&apos;historique des chats en texte brut" name="plain_text_chat_history"/>
+ <radio_group name="chat_window" tool_tip="Afficher vos messages instantanés dans plusieurs fenêtres ou dans une seule fenêtre avec plusieurs onglets (redémarrage requis)">
+ <radio_item label="Plusieurs fenêtres" name="radio" value="0"/>
+ <radio_item label="Onglets" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 1ed3cafbc3..c3bbe18a7c 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -1,91 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Général" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Par défaut, choisir mon domicile comme lieu de départ." label="Domicile"/>
- <combo_box.item name="MyLastLocation" tool_tip="Par défaut, choisir mon dernier emplacement comme lieu de départ." label="Dernier emplacement"/>
- </combo_box>
- <check_box label="Afficher le lieu de départ sur l&apos;écran de connexion" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Jamais"/>
- <combo_box.item name="Show Temporarily" label="Afficher temporairement"/>
- <combo_box.item name="Always" label="Toujours"/>
- </combo_box>
- <check_box label="Nom des avatars en petit" name="small_avatar_names_checkbox"/>
- <check_box label="Masquer mon nom sur mon écran" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Titres de groupe :
- </text>
- <check_box label="Masquer tous les titres de groupe" name="show_all_title_checkbox"/>
- <check_box label="Masquer mon titre de groupe" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
- <text name="UI Size:">
- Taille de l&apos;interface :
+ <text name="language_textbox">
+ Langue :
</text>
- <slider name="ui_scale_slider"/>
- <check_box label="Utiliser une échelle indépendante de la résolution" name="ui_auto_scale"/>
- <spinner label="Absent(e) après :" name="afk_timeout_spinner"/>
- <check_box label="M&apos;avertir lorsque je dépense ou reçois des L$" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Catégorie de contenu :
+ <combo_box name="language_combobox">
+ <combo_box.item label="Choix par défaut" name="System Default Language"/>
+ <combo_box.item label="English (Anglais)" name="English"/>
+ <combo_box.item label="Dansk (Danois) - Bêta" name="Danish"/>
+ <combo_box.item label="Deutsch (Allemand) - Bêta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Espagnol) - Bêta" name="Spanish"/>
+ <combo_box.item label="Français - Bêta" name="French"/>
+ <combo_box.item label="Italiano (Italien) - Bêta" name="Italian"/>
+ <combo_box.item label="Nederlands (Néerlandais) - Bêta" name="Dutch"/>
+ <combo_box.item label="Polski (Polonais) - Bêta" name="Polish"/>
+ <combo_box.item label="Portugués (Portugais) - Bêta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (redémarrage requis)
</text>
<text name="maturity_desired_prompt">
Je veux accéder au contenu classé :
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature et Adult"/>
- <combo_box.item name="Desired_Mature" label="PG et Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="Général, Modéré, Adulte" name="Desired_Adult"/>
+ <combo_box.item label="Général et Modéré" name="Desired_Mature"/>
+ <combo_box.item label="Général" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
- Lieu de départ :
+ Lieu de départ :
</text>
- <text name="show_names_textbox">
- Afficher les noms :
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Dernier emplacement" name="MyLastLocation" tool_tip="Par défaut, choisir mon dernier emplacement comme lieu de départ."/>
+ <combo_box.item label="Domicile" name="MyHome" tool_tip="Par défaut, choisir mon domicile comme lieu de départ."/>
+ </combo_box>
+ <check_box initial_value="true" label="Afficher à la connexion" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Affichage des noms :
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Désactivé" name="radio" value="0"/>
+ <radio_item label="Activé" name="radio2" value="1"/>
+ <radio_item label="Afficher brièvement" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Afficher mon nom" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Affichage en petit" name="small_avatar_names_checkbox"/>
+ <check_box label="Afficher les titres de groupe" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Couleur du faisceau de sélection :
- </text>
- <text name="seconds_textbox">
- secondes
- </text>
- <text name="crash_report_textbox">
- Rapports de crash :
- </text>
- <text name="language_textbox">
- Langue :
+ Mes effets :
</text>
- <text name="language_textbox2">
- (redémarrage requis)
+ <text name="title_afk_text">
+ Me montrer absent après :
</text>
- <string name="region_name_prompt">
- &lt;Saisissez le nom de la région&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Demander avant d&apos;envoyer"/>
- <combo_box.item name="Alwayssend" label="Toujours envoyer"/>
- <combo_box.item name="Neversend" label="Ne jamais envoyer"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Choix par défaut"/>
- <combo_box.item name="English" label="English (Anglais)"/>
- <combo_box.item name="Danish" label="Dansk (Danois) - Bêta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Allemand) - Bêta"/>
- <combo_box.item name="Spanish" label="Español (Espagnol) - Bêta"/>
- <combo_box.item name="French" label="Français - Bêta"/>
- <combo_box.item name="Italian" label="Italiano (Italien) - Bêta"/>
- <combo_box.item name="Hungarian" label="Magyar (Hongrois) - Bêta"/>
- <combo_box.item name="Dutch" label="Nederlands (Néerlandais) - Bêta"/>
- <combo_box.item name="Polish" label="Polski (Polonais) - Bêta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugais) - Bêta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russe) - Bêta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turc) - Bêta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ukrainien) - Bêta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinois) - Bêta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japonais) - Bêta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coréen) - Bêta"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
+ <combo_box label="Me montrer absent après :" name="afk">
+ <combo_box.item label="2 minutes" name="item0"/>
+ <combo_box.item label="5 minutes" name="item1"/>
+ <combo_box.item label="10 minutes" name="item2"/>
+ <combo_box.item label="30 minutes" name="item3"/>
+ <combo_box.item label="jamais" name="item4"/>
</combo_box>
- <check_box label="Partager la langue avec les objets" name="language_is_public" tool_tip="Cette option permet de faire connaître aux objets du Monde votre langue favorite."/>
+ <text name="text_box3">
+ Réponse si occupé(e) :
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
</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 726ebc78b0..aa004d2c84 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -1,63 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Graphiques" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <text_editor bottom="-56" height="40" left="25" name="FullScreenInfo" width="460">
- Décochez cette option pour passer en mode plein écran.
- </text_editor>
<text name="WindowSizeLabel">
Taille de la fenêtre :
</text>
+ <check_box label="Utiliser le plein écran" name="windowed mode"/>
<combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640 x 480" />
- <combo_box.item name="800x600" label="800 x 600" />
- <combo_box.item name="720x480" label="720 x 480 (NTSC)" />
- <combo_box.item name="768x576" label="768 x 576 (PAL)" />
- <combo_box.item name="1024x768" label="1024 x 768" />
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="720 x 480 (NTSC)" name="720x480"/>
+ <combo_box.item label="768 x 576 (PAL)" name="768x576"/>
+ <combo_box.item label="1024 x 768" name="1024x768"/>
</combo_box>
- <text name="DisplayResLabel" width="165">
- Résolution de l&apos;affichage :
- </text>
- <text name="AspectRatioLabel1" tool_tip="largeur/hauteur">
- Rapport hauteur/largeur :
- </text>
- <combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280 x 1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (écran large)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (plein écran)" />
- </combo_box>
- <text name="text">
- Résolution d&apos;affichage :
- </text>
- <text name="Fullscreen Aspect Ratio:">
- Format de plein écran :
- </text>
- <text name="(width / height)">
- (largeur / hauteur)
- </text>
<text name="UI Size:">
- Taille de l&apos;IU :
- </text>
- <text name="(meters, lower is faster)">
- (mètres, moins = plus rapide)
- </text>
- <text name="text2">
- Options d&apos;affichage :
- </text>
- <check_box label="Lancer Second Life en mode fenêtré" name="windowed mode"/>
- <check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect"/>
- <check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale"/>
- <check_box label="Montrer l&apos;avatar en vue subjective" name="avfp"/>
- <spinner label="Distance d&apos;affichage :" name="draw_distance"/>
- <text name="HigherText">
- Qualité et
+ Taille de l&apos;interface :
</text>
- <text name="QualityText">
- Performance :
+ <text name="QualitySpeed">
+ Qualité et vitesse :
</text>
- <text left="105" name="FasterText">
+ <text left="35" name="FasterText">
Plus rapide
</text>
+ <text name="BetterText">
+ Meilleure
+ </text>
<text name="ShadersPrefText">
Faible
</text>
@@ -70,94 +35,82 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text bottom="-86" left="325" name="HigherText2">
- Plus élevée
- </text>
- <text name="QualityText2" visible="false"/>
- <check_box label="Personnaliser" left="395" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Effets :
- </text>
- <check_box label="Placage de relief et brillance" name="BumpShiny"/>
- <check_box label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/>
- <check_box label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
- <check_box label="Reflets de l&apos;eau" name="Reflections"/>
- <text name="ReflectionDetailText">
- Objets reflétés :
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terrain et Arbres" />
- <radio_item name="1" label="Objets statiques" />
- <radio_item name="2" label="Objets et avatars" />
- <radio_item name="3" label="Tout" />
- </radio_group>
- <text name="AvatarRenderingText">
- Rendu de l&apos;avatar :
- </text>
- <check_box label="Avatars éloignés en 2D" name="AvatarImpostors"/>
- <check_box label="Accélération du rendu" name="AvatarVertexProgram"/>
- <check_box label="Mouvement des habits" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Limite d&apos;affichage :" name="DrawDistance"/>
- <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
- <slider label="Qualité post-traitement :" name="RenderPostProcess"/>
- <text name="MeshDetailText">
- Détails des rendus :
- </text>
- <slider label=" Objets :" name="ObjectMeshDetail"/>
- <slider label=" Flexiprims :" name="FlexibleMeshDetail"/>
- <slider label=" Arbres :" name="TreeMeshDetail"/>
- <slider label=" Avatars :" name="AvatarMeshDetail"/>
- <slider label=" Relief :" name="TerrainMeshDetail"/>
- <slider label=" Ciel :" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Faible
- </text>
- <text name="ObjectMeshDetailText">
- Faible
- </text>
- <text name="FlexibleMeshDetailText">
- Faible
- </text>
- <text name="TreeMeshDetailText">
- Faible
- </text>
- <text name="AvatarMeshDetailText">
- Faible
- </text>
- <text name="TerrainMeshDetailText">
- Faible
- </text>
- <text name="SkyMeshDetailText">
- Faible
- </text>
- <text name="LightingDetailText">
- Sources lumineuses :
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Soleil et lune uniquement" />
- <radio_item name="LocalLights" label="Lumières à proximité" />
- </radio_group>
- <text left="380" name="TerrainDetailText">
- Rendu du terrain :
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Faible" />
- <radio_item name="2" label="Élevé" />
- </radio_group>
+ <panel label="Graphiques personnalisés" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Effets :
+ </text>
+ <check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
+ <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="La désactivation de cette option peut éviter le plantage de certains pilotes de cartes graphiques"/>
+ <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflets dans l&apos;eau" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Objets reflétés :
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terrain et arbres" name="0"/>
+ <radio_item label="Tous les objets statiques" name="1"/>
+ <radio_item label="Tous les objets et avatars" name="2"/>
+ <radio_item label="Tout" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Rendu de l&apos;avatar :
+ </text>
+ <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/>
+ <slider label="Limite d&apos;affichage :" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/>
+ <slider label="Qualité post-traitement :" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Détails des rendus :
+ </text>
+ <slider label=" Objets :" name="ObjectMeshDetail"/>
+ <slider label=" Flexiprims :" name="FlexibleMeshDetail"/>
+ <slider label=" Arbres :" name="TreeMeshDetail"/>
+ <slider label=" Avatars :" name="AvatarMeshDetail"/>
+ <slider label=" Relief :" name="TerrainMeshDetail"/>
+ <slider label=" Ciel :" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Faible
+ </text>
+ <text name="ObjectMeshDetailText">
+ Faible
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Faible
+ </text>
+ <text name="TreeMeshDetailText">
+ Faible
+ </text>
+ <text name="AvatarMeshDetailText">
+ Faible
+ </text>
+ <text name="TerrainMeshDetailText">
+ Faible
+ </text>
+ <text name="SkyMeshDetailText">
+ Faible
+ </text>
+ <text name="LightingDetailText">
+ Sources lumineuses :
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Soleil et lune uniquement" name="SunMoon"/>
+ <radio_item label="Lumières à proximité" name="LocalLights"/>
+ </radio_group>
+ <text left="380" name="TerrainDetailText">
+ Rendu du terrain :
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Bas" name="0"/>
+ <radio_item label="Haut" name="2"/>
+ </radio_group>
</panel>
- <button label="Paramètres recommandés" name="Defaults"/>
- <button label="Configuration du matériel" label_selected="Configuration du matériel" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Appliquer" label_selected="Appliquer" name="Apply"/>
+ <button label="Réinitialiser" name="Defaults"/>
+ <button label="Avancé" name="Advanced"/>
+ <button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index 527097b392..f14ccc3a8e 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -1,32 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Communication" name="im">
- <text name="text_box">
- Mon statut en ligne :
- </text>
- <check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)" name="online_visibility"/>
- <text name="log_in_to_change">
+ <panel.string name="log_in_to_change">
se connecter pour changer
+ </panel.string>
+ <button label="Vider le cache" name="clear_cache" tool_tip="Effacer l&apos;image de connexion, le dernier lieu, l&apos;historique des téléportations et la texture du cache."/>
+ <text name="cache_size_label_l">
+ (Endroits, images, web, historique des recherches)
</text>
- <check_box label="Envoyer les IM à mon adresse e-mail ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Afficher les IM dans la console du chat" name="include_im_in_chat_console"/>
- <check_box label="Afficher l&apos;heure dans les IM" name="show_timestamps_check"/>
- <check_box label="Me prévenir quand des amis se connectent" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Réponse si occupé(e) :
+ <check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
+ <check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
+ <check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
+ <check_box label="Accepter les cookies" name="cookies_enabled"/>
+ <text name="Logs:">
+ Journaux :
</text>
- <text name="text_box4">
- Enregistrements :
+ <check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/>
+ <check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/>
+ <check_box label="Inclure les dates et heures" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Emplacement :
</text>
- <check_box label="Enregistrer les IM sur mon ordinateur" name="log_instant_messages"/>
- <check_box label="Inclure les heures" name="log_instant_messages_timestamp"/>
- <check_box label="Enregistrer le chat local sur mon ordinateur" name="log_chat"/>
- <check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history"/>
- <check_box label="Inclure les heures" name="log_chat_timestamp"/>
- <check_box label="Inclure les IM reçus" name="log_chat_IM"/>
- <check_box label="Inclure la date avec les heures" name="log_date_timestamp"/>
- <button label="Changer d&apos;emplacement" label_selected="Changer d&apos;emplacement" name="log_path_button" width="150"/>
<line_editor left="308" name="log_path_string" right="-20"/>
- <text name="text_box2">
- IM :
- </text>
+ <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/>
+ <button label="Liste des ignorés" name="block_list"/>
</panel>
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 b52ab672b0..3c789574a4 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -1,30 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Contrôle et caméra" name="Input panel">
- <text name=" Mouselook Options:">
+<panel label="Configuration" name="Input panel">
+ <button label="Autres accessoires" name="joystick_setup_button" width="175"/>
+ <text name="Mouselook:">
Vue subjective :
</text>
- <text name=" Mouse Sensitivity:">
- Sensibilité de la souris :
+ <text name=" Mouse Sensitivity">
+ Sensibilité de la souris
</text>
- <check_box label="Inverser la souris" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Vol automatique :
+ <check_box label="Inverser" name="invert_mouse"/>
+ <text name="Network:">
+ Réseau :
</text>
- <check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas" name="automatic_fly"/>
- <text name=" Camera Options:">
- Options de la caméra :
+ <text name="Maximum bandwidth">
+ Bande passante maximale
</text>
- <text name="camera_fov_label">
- Angle de vision :
+ <text name="text_box2">
+ kbps
</text>
- <text name="Camera Follow Distance:">
- Distance :
+ <check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
+ <spinner label="Numéro de port :" name="connection_port"/>
+ <text name="cache_size_label_l">
+ Taille de la mémoire
</text>
- <check_box label="Ajustement automatique en mode Édition" name="edit_camera_movement" tool_tip="Positionner automatiquement la caméra lors de l&apos;entrée ou de la sortie du mode Édition"/>
- <check_box label="Ajustement automatique en mode Édition d&apos;apparence" name="appearance_camera_movement" tool_tip="Positionner automatiquement la caméra en mode Édition"/>
- <text name="text2">
- Affichage de l&apos;avatar :
+ <text name="text_box5">
+ Mo
</text>
- <check_box label="Montrer l&apos;avatar en vue subjective" name="first_person_avatar_visible"/>
- <button label="Configuration du joystick" name="joystick_setup_button" width="175"/>
+ <text name="Cache location">
+ Emplacement du cache :
+ </text>
+ <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
+ <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/>
+ <text name="Web:">
+ Web :
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]." value="0"/>
+ <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="1"/>
+ </radio_group>
+ <check_box initial_value="false" label="Activer le proxy Web" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ Emplacement du proxy :
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
+ <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index facd22988c..663775559a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -1,40 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Audio et vidéo" name="Preference Media panel">
- <slider label="Principal" name="System Volume"/>
- <slider label="Son ambiant" name="Wind Volume"/>
- <slider label="Sons" name="SFX Volume"/>
+<panel label="Sons" name="Preference Media panel">
+ <slider label="Volume principal" name="System Volume"/>
+ <check_box initial_value="true" label="Couper le son quand minimisé" name="mute_when_minimized"/>
+ <slider label="Boutons" name="UI Volume"/>
+ <slider label="Ambiant" name="Wind Volume"/>
+ <slider label="Effets sonores" name="SFX Volume"/>
+ <slider label="Flux musical" name="Music Volume"/>
+ <check_box label="Activé" name="music_enabled"/>
<slider label="Média" name="Media Volume"/>
- <slider label="Interface" name="UI Volume"/>
- <slider label="Musique" name="Music Volume"/>
- <slider label="Voix" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Le chat vocal n&apos;est pas disponible
- </text_editor>
- <check_box label="Activer la voix" name="enable_voice_check"/>
+ <check_box label="Activé" name="enable_media"/>
+ <slider label="Chat vocal" name="Voice Volume"/>
+ <check_box label="Activé" name="enable_voice_check"/>
+ <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="vrai"/>
+ <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="vrai"/>
+ <text name="Listen from">
+ Paramètres du chat vocal
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Écouter depuis la position de la caméra." />
- <radio_item name="1" label="Écouter depuis la position de l&apos;avatar." />
+ <radio_item label="Position de la caméra" name="0"/>
+ <radio_item label="Position de l&apos;avatar" name="1"/>
</radio_group>
- <button label="Paramètres du matériel" name="device_settings_btn"/>
- <text name="muting_text">
- Volume :
- </text>
- <panel name="Volume Panel" width="249"/>
- <check_box label="Couper le son" name="disable audio"/>
- <text bottom="-195" name="streaming_prefs_text" width="145">
- Média :
- </text>
- <text name="audio_prefs_text">
- Audio :
- </text>
- <panel label="Volume" name="Volume Panel"/>
- <check_box label="Couper le son lorsque la fenêtre est minimisée" name="mute_when_minimized"/>
- <check_box label="Jouer la musique disponible" name="streaming_music"/>
- <check_box label="Jouer le média disponible" name="streaming_video"/>
- <check_box label="Lire automatiquement le média" name="auto_streaming_video"/>
- <slider label="Effet Doppler" label_width="115" name="Doppler Effect"/>
- <slider label="Facteur d&apos;éloignement" label_width="115" name="Distance Factor"/>
- <slider label="Facteur d&apos;atténuation" label_width="115" name="Rolloff Factor"/>
- <spinner label="Alerte L$" name="L$ Change Threshold"/>
- <spinner label="Alerte santé" name="Health Change Threshold"/>
+ <button label="Périphériques d&apos;entrée/de sortie" name="device_settings_btn"/>
+ <panel label="Paramètres du matériel" name="device_settings_panel">
+ <panel.string name="default_text">
+ Défaut
+ </panel.string>
+ <text name="Input">
+ Entrée
+ </text>
+ <text name="My volume label">
+ Mon volume :
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Régler le volume avec le curseur"/>
+ <text name="wait_text">
+ Veuillez patienter
+ </text>
+ <text name="Output">
+ Sortie
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..c7ab31c4b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Le média est en cours de chargement"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Naviguer en arrière"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Naviguer vers l&apos;avant"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Page d&apos;accueil"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Arrêter le média"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Recharger"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Arrêter le chargement"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Jouer le média"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pauser le média"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL du média"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Liste blanche activée"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progrès de la lecture du film"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Reculer"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Avancer"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Couper le son de ce média"/>
+ <slider name="volume_slider" tool_tip="Volume du média"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom avant sur le média"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom arrière"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Ouvrir l&apos;URL dans le navigateur"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
new file mode 100644
index 0000000000..364426fed1
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=fr-FR
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=fr
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
+ <string name="no_partner_text" value="Aucun"/>
+ <string name="no_group_text" value="Aucun"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Monde physique :"/>
+ </panel>
+ <text name="title_member_text" value="Résident depuis :"/>
+ <text name="title_acc_status_text" value="Statut du compte :"/>
+ <text_editor name="acc_status_text">
+ Résident. Aucune info de paiement enregistrée.
+ Linden.
+ </text_editor>
+ <text name="title_partner_text" value="Partenaire :"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(récupération en cours)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Groupes :"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button label="IM" name="im" tool_tip="Ouvrir une session IM" width="30"/>
+ <button label="Appeler" name="call" tool_tip="Appeler ce résident" width="60"/>
+ <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
+ <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
+ <button label="▼" name="overflow_btn" tool_tip="Payer ou partager l&apos;inventaire avec le résident"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
+ <button label="Changer d&apos;apparence" name="edit_appearance_btn" tool_tip="Créer/modifier votre apparence : données physiques, habits, etc."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
new file mode 100644
index 0000000000..8f57dd89c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ En ligne
+ </string>
+ <string name="status_offline">
+ Hors ligne
+ </string>
+ <text_editor name="user_name" value="(en cours de chargement...)"/>
+ <text name="status" value="En ligne"/>
+ <tab_container name="tabs">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="FAVORIS" name="panel_picks"/>
+ <panel label="NOTES/PERSO" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
index f2ba297fd2..cd1d0c4886 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Règlement" name="Covenant">
<text name="estate_section_lbl">
- Domaine :
+ Domaine
</text>
<text bottom_delta="-19" name="estate_name_lbl">
Nom :
@@ -18,7 +18,7 @@
<text name="estate_cov_lbl">
Règlement :
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="350">
Dernière modification le mercredi 31 décembre 1969 16:00:00
</text>
<button label="?" name="covenant_help"/>
@@ -27,20 +27,20 @@
</text_editor>
<button label="Réinitialiser" name="reset_covenant"/>
<text name="covenant_help_text">
- Les changements apportés au règlement apparaîtront sur toutes
- les parcelles du domaine.
+ Les changements apportés au règlement apparaîtront sur
+toutes les parcelles du domaine.
</text>
<text bottom_delta="-31" name="covenant_instructions">
Faire glisser une note pour changer le règlement de ce domaine.
</text>
<text name="region_section_lbl">
- Région :
+ Région
</text>
<text name="region_name_lbl">
Nom :
</text>
<text name="region_name_text">
- leyla
+ Erica
</text>
<text name="region_landtype_lbl">
Type :
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index 1338ab9e71..cb4a74e142 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -12,8 +12,8 @@
<button label="?" name="disable_collisions_help"/>
<check_box label="Désactiver la physique" name="disable_physics_check" tool_tip="Désactiver tous les effets liés à la physique dans cette région"/>
<button label="?" name="disable_physics_help"/>
- <button label="Appliquer" name="apply_btn" bottom_delta="-38"/>
- <text name="objret_text_lbl" bottom_delta="-42">
+ <button bottom_delta="-38" label="Appliquer" name="apply_btn"/>
+ <text bottom_delta="-42" name="objret_text_lbl" width="260">
Renvoi de l&apos;objet
</text>
<text name="resident_text_lbl">
@@ -22,19 +22,19 @@
<line_editor name="target_avatar_name">
(aucun)
</line_editor>
- <button label="Choisir..." name="choose_avatar_btn"/>
+ <button label="Choisir" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Options :
</text>
- <check_box label="Ne renvoyer que les objets avec des scripts" name="return_scripts" tool_tip="Ne renvoyer que les objets avec des scripts."/>
- <check_box label="Ne renvoyer que les objets sur le terrain de quelqu&apos;un d&apos;autre" name="return_other_land" tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre"/>
- <check_box label="Renvoyer les objets dans toutes les régions de ce domaine" name="return_estate_wide" tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine"/>
+ <check_box label="Avec scripts" name="return_scripts" tool_tip="Renvoyer les objets avec scripts uniquement"/>
+ <check_box label="Sur le terrain d&apos;un autre résident" name="return_other_land" tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre"/>
+ <check_box label="Dans toutes les régions de ce domaine" name="return_estate_wide" tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine"/>
<button label="Renvoyer" name="return_btn"/>
<button label="Afficher les collisions les plus consommatrices..." name="top_colliders_btn" tool_tip="Liste des objets avec le plus de collisions potentielles" width="320"/>
- <button label="?" name="top_colliders_help" left="337"/>
+ <button label="?" left="337" name="top_colliders_help"/>
<button label="Afficher les objets scriptés les plus consommateurs..." name="top_scripts_btn" tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts" width="320"/>
- <button label="?" name="top_scripts_help" left="337"/>
+ <button label="?" left="337" name="top_scripts_help"/>
<button label="Redémarrer la région" name="restart_btn" tool_tip="Redémarrer la région au bout de 2 minutes" width="160"/>
- <button label="?" name="restart_help" left="177" />
+ <button label="?" left="177" name="restart_help"/>
<button label="Retarder le redémarrage" name="cancel_restart_btn" tool_tip="Retarder le redémarrage de la région d&apos;une heure" width="160"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index 425f273790..f9262ea478 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Domaine" name="Estate">
- <text name="estate_help_text" bottom="-34">
- Les changements apportés aux paramètres
-de cet onglet auront des répercussions sur
-toutes les régions du domaine.
+ <text bottom="-34" name="estate_help_text">
+ Les modifications des paramètres de cet
+onglet affecteront toutes les régions du
+domaine.
</text>
- <text name="estate_text" bottom_delta="-34">
+ <text top_pad="8" bottom_delta="-34" name="estate_text">
Domaine :
</text>
<text name="estate_name">
(inconnu)
</text>
<text name="owner_text">
- Propriétaire :
+ Propriétaire :
</text>
<text name="estate_owner">
(inconnu)
</text>
<text name="Only Allow">
- Limiter l&apos;accès aux résidents qui :
+ Limiter l&apos;accès aux comptes vérifiés par :
</text>
- <check_box label="Ont enregistré leurs infos de paiement" name="limit_payment" tool_tip="Bannir les résidents non identifés."/>
- <check_box label="Ont fait vérifier leur âge" name="limit_age_verified" tool_tip="Bannir les résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
+ <check_box label="Informations de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/>
+ <check_box label="Vérification de mon âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser les chats vocaux" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index 70782e2aa6..711278d614 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -32,17 +32,17 @@
<button label="?" name="parcel_changes_help"/>
<check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
<button label="?" name="parcel_search_help"/>
- <spinner label="Nombre maximum d&apos;avatars" label_width="127" name="agent_limit_spin" width="190"/>
+ <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin" label_width="160" width="240"/>
<button label="?" name="agent_limit_help"/>
- <spinner label="Bonus objet" label_width="127" name="object_bonus_spin" width="190"/>
+ <spinner label="Bonus objet" name="object_bonus_spin" label_width="160" width="240"/>
<button label="?" name="object_bonus_help"/>
<text label="Maturité" name="access_text">
Catégorie :
</text>
- <combo_box label="Mature" name="access_combo">
+ <combo_box label="Modéré" name="access_combo">
<combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
+ <combo_box.item label="Modéré" name="Mature"/>
+ <combo_box.item label="Général" name="PG"/>
</combo_box>
<button label="?" name="access_help"/>
<button label="Appliquer" name="apply_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
new file mode 100644
index 0000000000..e709100fa2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Région" name="General">
+ <text name="region_text_lbl">
+ Région :
+ </text>
+ <text name="region_text" left_delta="56">
+ inconnu
+ </text>
+ <text name="version_channel_text_lbl">
+ Version :
+ </text>
+ <text name="version_channel_text" left_delta="56">
+ inconnu
+ </text>
+ <text name="region_type_lbl">
+ Type :
+ </text>
+ <text name="region_type" left_delta="56">
+ inconnu
+ </text>
+ <check_box label="Interdire le terraformage" name="block_terraform_check"/>
+ <check_box label="Interdire le vol" name="block_fly_check"/>
+ <check_box label="Autoriser les dégâts" name="allow_damage_check"/>
+ <check_box label="Interdire les bousculades" name="restrict_pushobject"/>
+ <check_box label="Autoriser la revente de terrains" name="allow_land_resell_check"/>
+ <check_box label="Autoriser la fusion/division de terrains" name="allow_parcel_changes_check"/>
+ <check_box label="Interdire l&apos;affichage du terrain dans les recherches" name="block_parcel_search_check" tool_tip="Permettre aux autres résidents de voir cette région et ses parcelles dans les résultats de recherche"/>
+ <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin" label_width="160" width="240"/>
+ <spinner label="Bonus objet" name="object_bonus_spin" label_width="160" width="240"/>
+ <text label="Accès" name="access_text">
+ Catégorie :
+ </text>
+ <combo_box label="Modéré" name="access_combo">
+ <combo_box.item label="Adulte" name="Adult"/>
+ <combo_box.item label="Modéré" name="Mature"/>
+ <combo_box.item label="Général" name="PG"/>
+ </combo_box>
+ <button label="Appliquer" name="apply_btn"/>
+ <button label="Téléporter un résident chez lui..." name="kick_btn"/>
+ <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/>
+ <button label="Envoyer un message à la région..." name="im_btn"/>
+ <button label="Gérer le téléhub..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_texture.xml b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
index d312646788..e95d911c01 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Textures du sol" name="Textures">
<text name="region_text_lbl">
Région :
@@ -39,11 +39,11 @@
<text name="height_text_lbl9">
Nord-est
</text>
- <text name="height_text_lbl10">
+ <text name="height_text_lbl10" width="460">
Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
</text>
<text name="height_text_lbl11">
- En mètres, la valeur Bas correspond à la hauteur maximum de la texture n°1
+ En mètres, la valeur Bas correspond à la hauteur maximum de la texture n°1 et la valeur Haut correspond à la hauteur minimum de la texture n°4.
</text>
<text name="height_text_lbl12">
et la valeur Haut correspond à la hauteur minimum de la texture n°4.
@@ -51,14 +51,14 @@
<text name="height_text_lbl13">
Nord-est
</text>
- <spinner label="Bas" name="height_start_spin_0" />
- <spinner label="Bas" name="height_start_spin_1" />
- <spinner label="Bas" name="height_start_spin_2" />
- <spinner label="Bas" name="height_start_spin_3" />
- <spinner label="Haut" name="height_range_spin_0" />
- <spinner label="Haut" name="height_range_spin_1" />
- <spinner label="Haut" name="height_range_spin_2" />
- <spinner label="Haut" name="height_range_spin_3" />
+ <spinner label="Bas" name="height_start_spin_0"/>
+ <spinner label="Bas" name="height_start_spin_1"/>
+ <spinner label="Bas" name="height_start_spin_2"/>
+ <spinner label="Bas" name="height_start_spin_3"/>
+ <spinner label="Haut" name="height_range_spin_0"/>
+ <spinner label="Haut" name="height_range_spin_1"/>
+ <spinner label="Haut" name="height_range_spin_2"/>
+ <spinner label="Haut" name="height_range_spin_3"/>
<text name="height_text_lbl14">
Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
</text>
@@ -68,5 +68,5 @@
<text name="height_text_lbl16">
et la valeur HAUTE correspond à la hauteur MINIMUM de la Texture #4.
</text>
- <button label="Appliquer" name="apply_btn" />
+ <button label="Appliquer" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
new file mode 100644
index 0000000000..ea161ecae8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Chargement...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Les objets publics ne peuvent pas exécuter de scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Exécution en cours
+ </panel.string>
+ <panel.string name="Title">
+ Script : [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Chargement...
+ </text_editor>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/>
+ <combo_box label="Insérer..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Fichier" name="File">
+ <menu_item_call label="Enregistrer" name="Save"/>
+ <menu_item_call label="Annuler tous les changements" name="Revert All Changes"/>
+ </menu>
+ <menu label="Éditer" name="Edit">
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+ <menu_item_call label="Désélectionner" name="Deselect"/>
+ <menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Aide" name="Help">
+ <menu_item_call label="Aide..." name="Help..."/>
+ <menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..e541fae31f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MON AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Utilisation des scripts d&apos;avatars
+ </text>
+ <text name="loading_text">
+ Chargement...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Taille (Ko)" name="size" width="80"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nom de l&apos;objet" name="name"/>
+ <scroll_list.columns label="Endroit" name="location"/>
+ </scroll_list>
+ <button label="Rafraîchir la liste" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..751abd6f1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MÉMOIRE DE LA RÉGION" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Mémoire des scripts de parcelles
+ </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
+ <text name="loading_text">
+ Chargement...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Taille (Ko)" name="size" width="80"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nom de l&apos;objet" name="name"/>
+ <scroll_list.columns label="Propriétaire d&apos;objet" name="owner" width="140"/>
+ <scroll_list.columns label="Parcelle" name="parcel"/>
+ <scroll_list.columns label="Endroit" name="location"/>
+ </scroll_list>
+ <button label="Rafraîchir la liste" name="refresh_list_btn"/>
+ <button label="Surbrillance" name="highlight_btn"/>
+ <button label="Retour" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_side_tray.xml b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
new file mode 100644
index 0000000000..178ae4324b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose" tab_title="Activer/désactiver le panneau latéral"/>
+ <sidetray_tab description="Domicile." name="sidebar_home" tab_title="Accueil">
+ <panel label="domicile" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me" tab_title="Mon profil">
+ <panel_container name="panel_container">
+ <panel label="Moi" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people" tab_title="Personnes">
+ <panel_container name="panel_container">
+ <panel label="Profil du groupe" name="panel_group_info_sidetray"/>
+ <panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà." label="Lieux" name="sidebar_places" tab_title="Endroits">
+ <panel label="Lieux" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory" tab_title="Mon inventaire">
+ <panel label="Modifier l&apos;inventaire" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance" tab_title="Mon apparence">
+ <panel label="Changer d&apos;apparence" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/fr/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/fr/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..2899f630f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Panneau latéral"/>
+ <button name="show_help" tool_tip="Afficher l&apos;aide"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/fr/panel_sidetray_home_tab.xml
new file mode 100644
index 0000000000..48bcff1c09
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_sidetray_home_tab.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Part of side tray, see that XML file for panel config -->
+<panel label="home_tab" name="home_tab">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="sidebar_people">
+ <text name="tab_name" value="Résidents"/>
+ <text name="tab_description">
+ Trouvez vos amis, vos groupes, vos contacts et les personnes se trouvant près de vous.
+ </text>
+ </panel>
+ <panel name="sidebar_places">
+ <text name="tab_name" value="Lieux"/>
+ <text name="tab_description">
+ Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà.
+ </text>
+ </panel>
+ <panel name="sidebar_me">
+ <text name="tab_name" value="Mon profil"/>
+ <text name="tab_description">
+ Modifiez votre profil public.
+ </text>
+ </panel>
+ <panel name="sidebar_appearance">
+ <text name="tab_name" value="Mon apparence"/>
+ <text name="tab_description">
+ Modifiez votre apparence actuelle.
+ </text>
+ </panel>
+ <panel name="sidebar_inventory">
+ <text name="tab_name" value="Mon inventaire"/>
+ <text name="tab_description">
+ Parcourez votre inventaire.
+ </text>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..ee4e8a6be6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/>
+ <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index 9545b25126..e58e806f99 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,41 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir la section À propos du terrain.">
- Saisissez le nom de la parcelle ici
- </text>
- <text name="BalanceText" tool_tip="Solde du compte">
- Chargement...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises"/>
- <text name="TimeText" tool_tip="Heure actuelle (Californie)">
- midi
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
January:February:March:April:May:June:July:August:September:October:November:December
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Alertes et erreurs de scripts"/>
- <button label="" label_selected="" name="health" tool_tip="Santé"/>
- <text name="HealthText" tool_tip="Santé">
- 100 %
- </text>
- <button label="" label_selected="" name="fly" tool_tip="Vol interdit"/>
- <button label="" label_selected="" name="build" tool_tip="Construction interdite"/>
- <button label="" label_selected="" name="scripts" tool_tip="Scripts interdits"/>
- <button name="no_fly" tool_tip="Interdiction de voler"/>
- <button name="no_build" tool_tip="Interdiction de construire/rezzer"/>
- <button name="no_scripts" tool_tip="Interdiction d&apos;utiliser des scripts"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Pas de bousculades"/>
- <button name="status_no_voice" tool_tip="Voix non disponible ici"/>
- <button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle"/>
- <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans [SECOND_LIFE]"/>
- <button name="search_btn" tool_tip="Rechercher dans [SECOND_LIFE]"/>
- <text name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Perte de paquets
- </text>
- <text name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Bande passante
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde"/>
+ <button label="Acheter des L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/>
+ <text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
+ 00h00 PST
</text>
+ <button name="media_toggle_btn" tool_tip="Cliquer pour activer/désactiver le média"/>
+ <button name="volume_btn" tool_tip="Contrôle du volume global"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_sys_well_item.xml b/indra/newview/skins/default/xui/fr/panel_sys_well_item.xml
new file mode 100644
index 0000000000..81db7c8989
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_sys_well_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="sys_well_item" title="sys_well_item">
+ <text name="title">
+ Beware the trout. BEWARE! THE! TROUT!
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml
new file mode 100644
index 0000000000..bfd7a869c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Aujourd&apos;hui"/>
+ <accordion_tab name="yesterday" title="Hier"/>
+ <accordion_tab name="2_days_ago" title="Il y a 2 jours"/>
+ <accordion_tab name="3_days_ago" title="Il y a 3 jours"/>
+ <accordion_tab name="4_days_ago" title="Il y a 4 jours"/>
+ <accordion_tab name="5_days_ago" title="Il y a 5 jours"/>
+ <accordion_tab name="6_days_and_older" title="Il y a 6 jours ou plus"/>
+ <accordion_tab name="1_month_and_older" title="Il y a 1 mois ou plus"/>
+ <accordion_tab name="6_months_and_older" title="Il y a 6 mois ou plus"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/fr/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..21eb7ff62c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Afficher les infos de l&apos;objet"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_world_map.xml b/indra/newview/skins/default/xui/fr/panel_world_map.xml
index d00157a297..e6e95c2605 100644
--- a/indra/newview/skins/default/xui/fr/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Chargement...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Lieu invalide...
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml
index a2df596773..3367353b28 100644
--- a/indra/newview/skins/default/xui/fr/role_actions.xml
+++ b/indra/newview/skins/default/xui/fr/role_actions.xml
@@ -1,201 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Ces pouvoirs permettent d&apos;ajouter et de supprimer des membres du groupe et permettent aux nouveaux membres de rejoindre le groupe sans recevoir d&apos;invitation."
- name="Membership">
- <action description="Inviter des membres dans ce groupe"
- longdescription="Invitez des membres à rejoindre ce groupe en utilisant le bouton Inviter un nouveau membre à partir de l&apos;onglet Membres et rôles &gt; Membres."
- name="member invite" value="1" />
- <action description="Expulser des membres du groupe"
- longdescription="Expulsez des membres de ce groupe en utilisant le bouton Expulser un membre à partir de l&apos;onglet Membres et rôles &gt; Membres. Un propriétaire ne peut pas être expulsé. Un membre peut être expulsé d&apos;un groupe uniquement s&apos;il a le rôle Tous (Everyone). Si vous n&apos;êtes pas propriétaire, vous devez d&apos;abord retirer les rôles d&apos;un membre avant de pouvoir l&apos;expulser."
- name="member eject" value="2" />
- <action
- description="Gérer l&apos;inscription et les frais d&apos;inscription"
- longdescription="Choisissez l&apos;inscription libre pour permettre aux nouveaux membres de rejoindre le groupe sans invitation et modifiez les frais d&apos;inscription à l&apos;onglet Général."
- name="member options" value="3" />
+ <action_set description="Ces pouvoirs permettent d&apos;ajouter et de supprimer des membres du groupe et permettent aux nouveaux membres de rejoindre le groupe sans recevoir d&apos;invitation." name="Membership">
+ <action description="Inviter des membres dans ce groupe" longdescription="Invitez des personnes à rejoindre ce groupe en utilisant le bouton Inviter dans l&apos;onglet Membres de la section Rôles." name="member invite" value="1"/>
+ <action description="Expulser des membres du groupe" longdescription="Expulsez des personnes de ce groupe en utilisant le bouton Expulser dans l&apos;onglet Membres de la section Rôles. Un propriétaire peut expulser tout le monde à l&apos;exception des autres propriétaires. Si vous n&apos;êtes pas propriétaire, vous pouvez expulser un membre d&apos;un groupe uniquement si il n&apos;a que le rôle Tous et AUCUN autre rôle. Pour supprimer des membres des rôles, vous devez disposer du pouvoir correspondant." name="member eject" value="2"/>
+ <action description="Activez Inscription libre et modifiez les frais d&apos;inscription" longdescription="Activez Inscription libre pour permettre aux nouveaux membres de s&apos;inscrire sans invitation, et changez les frais d&apos;inscription dans la section Général." name="member options" value="3"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent d&apos;ajouter, de supprimer et de modifier les rôles dans le groupe et d&apos;y assigner des membres et des pouvoirs."
- name="Roles">
- <action description="Créer des rôles"
- longdescription="Créez de nouveaux rôles à l&apos;onglet Membres et rôles &gt; Rôles."
- name="role create" value="4" />
- <action description="Supprimer des rôles"
- longdescription="Supprimez des rôles à l&apos;onglet Membres et rôles &gt; Rôles."
- name="role delete" value="5" />
- <action description="Modifier les noms, les titres et les descriptions des rôles"
- longdescription="Modifiez les noms, titres et descriptions des rôles à l&apos;onglet Membres et rôles &gt; Rôles."
- name="role properties" value="6" />
- <action description="Attribuer des rôles limités"
- longdescription="Affectez des membres à certains rôles à l&apos;onglet Membres et rôles &gt; Membres. Un membre ne peut attribuer que des rôles auxquels il est lui-même affecté."
- name="role assign member limited" value="7" />
- <action description="Attribuer tous les rôles"
- longdescription="Affectez des membres à tous types de rôles à l&apos;onglet Membres et rôles &gt; Membres &gt; Rôles assignés. Attention : ce pouvoir peut conférer des rôles très importants, proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer."
- name="role assign member" value="8" />
- <action description="Destituer des membres de leurs rôles"
- longdescription="Destituez des membres de leurs rôles à partir du menu Rôles attribués à l&apos;onglet Membres et rôles &gt; Membres. Les propriétaires ne peuvent pas être destitués."
- name="role remove member" value="9" />
- <action description="Modifier les pouvoirs d&apos;un rôle"
- longdescription="Attribuez et retirez les pouvoirs d&apos;un rôle à partir du menu Pouvoirs attribués à l&apos;onglet Membres et rôles &gt; Rôles &gt; Pouvoirs attribués. Attention : ce pouvoir peut donner des rôles très importants, proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer."
- name="role change actions" value="10" />
+ <action_set description="Ces pouvoirs permettent d&apos;ajouter, de supprimer et de modifier les rôles dans le groupe et d&apos;y assigner des membres et des pouvoirs." name="Roles">
+ <action description="Créer des rôles" longdescription="Créez de nouveaux rôles dans l&apos;onglet Rôles de la section Rôles." name="role create" value="4"/>
+ <action description="Supprimer des rôles" longdescription="Supprimez des rôles dans l&apos;onglet Rôles de la section Rôles." name="role delete" value="5"/>
+ <action description="Changez les noms, les titres et les descriptions des rôles, et indiquez si les membres des rôles sont rendus publics" longdescription="Changez les noms, les titres et les descriptions des rôles, et indiquez si les membres des rôles sont rendus publics. Vous pouvez le faire au bas de l&apos;onglet Rôles dans la section Rôles, après avoir sélectionné un rôle." name="role properties" value="6"/>
+ <action description="Attribuer des rôles limités" longdescription="Assignez des membres aux rôles dans la liste Rôles assignés (section Rôles &gt; onglet Membres). Un membre avec ce pouvoir peut uniquement ajouter des membres à un rôle dans lequel le responsable de l&apos;assignation est déjà présent." name="role assign member limited" value="7"/>
+ <action description="Attribuer tous les rôles" longdescription="Assignez des membres à n&apos;importe quel rôle dans la liste Rôles assignés (section Rôles &gt; onglet Membres). *AVERTISSEMENT* Tout membre disposant de ce pouvoir peut s&apos;assigner lui-même, ainsi que tout autre membre non-propriétaire, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role assign member" value="8"/>
+ <action description="Destituer des membres de leurs rôles" longdescription="Supprimez des membres des rôles dans la liste Rôles assignés (section Rôles &gt; onglet Membres). Les propriétaires ne peuvent pas être supprimés." name="role remove member" value="9"/>
+ <action description="Modifier les pouvoirs d&apos;un rôle" longdescription="Attribuez et supprimez des pouvoirs pour chaque rôle dans la liste Pouvoirs attribués (section Rôles &gt; onglet Rôles). *AVERTISSEMENT* Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre non-propriétaire, tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir." name="role change actions" value="10"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de modifier le profil public du groupe, sa charte et son logo."
- name="Group Identity">
- <action
- description="Modifier le profil public du groupe"
- longdescription="Modifiez la charte, le logo, l&apos;affichage dans la recherche et la liste des membres visibles à l&apos;onglet Général."
- name="group change identity" value="11" />
+ <action_set description="Ces pouvoirs permettent de modifier le profil public du groupe, sa charte et son logo." name="Group Identity">
+ <action description="Modifier le profil public du groupe" longdescription="Modifiez la charte, le logo et l&apos;affichage dans les résultats de recherche. Vous pouvez faire cela dans la section Général." name="group change identity" value="11"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de transférer, modifier et vendre du terrain appartenant au groupe. Pour accéder au menu À propos du terrain, cliquez sur le nom de la parcelle en haut de l&apos;écran ou cliquez-droit sur le sol."
- name="Parcel Management">
- <action description="Transférer et acheter des parcelles pour le groupe"
- longdescription="Transférez et achetez des parcelles pour le groupe à partir du menu À propos du terrain &gt; Général."
- name="land deed" value="12" />
- <action description="Abandonner le terrain"
- longdescription="Abandonnez des parcelles du groupe à Linden Lab. Attention : ce pouvoir autorise l&apos;abandon d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer."
- name="land release" value="13" />
- <action description="Vendre du terrain"
- longdescription="Vendez des parcelles du groupe. Attention : ce pouvoir autorise la vente d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer."
- name="land set sale info" value="14" />
- <action description="Diviser et fusionner des parcelles"
- longdescription="Divisez et fusionnez des parcelles. Pour cela, cliquez-droit sur le sol, sélectionnez Modifier le terrain, et faites glisser votre souris sur l&apos;endroit que vous souhaitez modifier. Pour diviser le terrain, sélectionnez un endroit puis cliquez sur Diviser... Pour fusionner des parcelles, sélectionnez au moins deux parcelles adjacentes et cliquez sur Fusionner."
- name="land divide join" value="15" />
+ <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre les terrains de ce groupe. Pour accéder à la fenêtre À propos des terrains, cliquez sur le sol avec le bouton droit de la souris et sélectionnez À propos des terrains, ou cliquez sur l&apos;icône i dans la barre de navigation." name="Parcel Management">
+ <action description="Transférer et acheter des parcelles pour le groupe" longdescription="Transférez et achetez des parcelles pour le groupe à partir du menu À propos du terrain &gt; Général." name="land deed" value="12"/>
+ <action description="Abandonner le terrain" longdescription="Abandonnez des parcelles du groupe à Linden Lab. Attention : ce pouvoir autorise l&apos;abandon d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer." name="land release" value="13"/>
+ <action description="Vendre du terrain" longdescription="Vendez des parcelles du groupe. Attention : ce pouvoir autorise la vente d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer." name="land set sale info" value="14"/>
+ <action description="Diviser et fusionner des parcelles" longdescription="Divisez et fusionnez des parcelles. Pour ce faire, cliquez sur le sol avec le bouton droit de la souris, sélectionnez Modifier le terrain et faites glisser la souris sur le terrain pour faire une sélection. Pour diviser une parcelle, sélectionnez ce que vous souhaitez diviser et cliquez sur Sous-diviser. Pour fusionner des parcelles, sélectionnez-en deux ou plus qui sont contiguës et cliquez sur Fusionner." name="land divide join" value="15"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de modifier le nom de la parcelle, son référencement dans la recherche et le lieu de téléportation."
- name="Parcel Identity">
- <action
- description="Afficher dans la recherche et définir une catégorie"
- longdescription="Choisissez de faire apparaître la parcelle dans la recherche et définissez sa catégorie à partir du menu À propos du terrain &gt; Options."
- name="land find places" value="17" />
- <action
- description="Modifier le nom, la description et le référencement du terrain dans la recherche"
- longdescription="Modifiez le nom, la description de la parcelle et son référencement dans la recherche à partir du menu À propos du terrain &gt; Options."
- name="land change identity" value="18" />
- <action
- description="Définir le lieu d&apos;arrivée et le routage des téléportations"
- longdescription="Définissez le lieu d&apos;arrivée des téléportations et le routage à partir du menu À propos du terrain &gt; Options."
- name="land set landing point" value="19" />
+ <action_set description="Ces pouvoirs permettent de modifier le nom de la parcelle, son référencement dans la recherche et le lieu de téléportation." name="Parcel Identity">
+ <action description="Activez Afficher le lieu dans la recherche et définissez la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d&apos;une parcelle dans l&apos;onglet À propos des terrains &gt; Options." name="land find places" value="17"/>
+ <action description="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche. Pour ce faire, utilisez l&apos;onglet À propos des terrains &gt; Options." name="land change identity" value="18"/>
+ <action description="Définir le lieu d&apos;arrivée et le routage des téléportations" longdescription="Définissez le lieu d&apos;arrivée des téléportations et le routage à partir du menu À propos du terrain &gt; Options." name="land set landing point" value="19"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de définir les options de la parcelle concernant la musique, les médias, la création d&apos;objets et le relief."
- name="Parcel Settings">
- <action description="Modifier la musique et les médias"
- longdescription="Changez la musique et les médias à partir du menu À propos du terrain &gt; Médias."
- name="land change media" value="20" />
- <action description="Changer l&apos;option Modifier le terrain"
- longdescription="Changez l&apos;option Modifier le terrain à partir du menu À propos du terrain &gt; Options. Attention : ce pouvoir permet de terraformer votre terrain et de placer ou déplacer des plantes Linden. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer. "
- name="land edit" value="21" />
- <action
- description="Changer diverses options du terrain"
- longdescription="Changez diverses options de la parcelle à partir du menu À propos du terrain &gt; Options. Vous pouvez permettre aux autres résidents de voler, créer des objets, modifier le terrain, lancer des scripts, créer des repères etc."
- name="land options" value="22" />
+ <action_set description="Ces pouvoirs permettent de définir les options de la parcelle concernant la musique, les médias, la création d&apos;objets et le relief." name="Parcel Settings">
+ <action description="Modifier la musique et les médias" longdescription="Changez la musique et les médias à partir du menu À propos du terrain &gt; Médias." name="land change media" value="20"/>
+ <action description="Changer l&apos;option Modifier le terrain" longdescription="Changez l&apos;option Modifier le terrain à partir du menu À propos du terrain &gt; Options. Attention : ce pouvoir permet de terraformer votre terrain et de placer ou déplacer des plantes Linden. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer. " name="land edit" value="21"/>
+ <action description="Changer diverses options du terrain" longdescription="Activez Sécurisé (pas de dégâts), Voler, et autorisez les autres résidents à : modifier le terrain, construire, créer des repères et exécuter des scripts sur les terrains appartenant au groupe dans l&apos;onglet propos des terrains &gt; Options." name="land options" value="22"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent aux membres d&apos;outrepasser les restrictions sur les parcelles du groupe."
- name="Parcel Powers">
- <action description="Toujours autoriser Modifier le terrain"
- longdescription="Vous pouvez modifier le relief d&apos;une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options."
- name="land allow edit land" value="23" />
- <action description="Toujours autoriser à voler"
- longdescription="Vous pouvez voler sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options."
- name="land allow fly" value="24" />
- <action description="Toujours autoriser à créer des objets"
- longdescription="Vous pouvez créer des objets sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options."
- name="land allow create" value="25" />
- <action description="Toujours autoriser à créer des repères"
- longdescription="Vous pouvez créer un repère sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options."
- name="land allow landmark" value="26" />
- <action description="Autoriser à définir un domicile sur le terrain du groupe"
- longdescription="Vous pouvez définir votre domicile sur une parcelle du groupe à partir du menu Monde &gt; Définir comme domicile."
- name="land allow set home" value="28" />
+ <action_set description="Ces pouvoirs permettent aux membres d&apos;outrepasser les restrictions sur les parcelles du groupe." name="Parcel Powers">
+ <action description="Toujours autoriser Modifier le terrain" longdescription="Vous pouvez modifier le relief d&apos;une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow edit land" value="23"/>
+ <action description="Toujours autoriser à voler" longdescription="Vous pouvez voler sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow fly" value="24"/>
+ <action description="Toujours autoriser à créer des objets" longdescription="Vous pouvez créer des objets sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow create" value="25"/>
+ <action description="Toujours autoriser à créer des repères" longdescription="Vous pouvez créer un repère sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow landmark" value="26"/>
+ <action description="Autoriser à définir un domicile sur le terrain du groupe" longdescription="Un membre dans un rôle avec ce pouvoir peut utiliser le menu Monde &gt; Repères &gt; Définir le domicile ici sur une parcelle cédée à ce groupe." name="land allow set home" value="28"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent d&apos;autoriser ou d&apos;interdire l&apos;accès à des parcelles du groupe et de geler ou d&apos;expulser des résidents."
- name="Parcel Access">
- <action description="Gérer la liste d&apos;accès à la parcelle"
- longdescription="Gérez la liste des résidents autorisés sur la parcelle à partir du menu À propos du terrain &gt; Accès."
- name="land manage allowed" value="29" />
- <action description="Gérer la liste noire de cette parcelle"
- longdescription="Gérez la liste des résidents interdits sur la parcelle à partir du menu À propos du terrain &gt; Interdire."
- name="land manage banned" value="30" />
- <action description="Vendre des pass"
- longdescription="Choisissez le prix et la durée des pass pour accéder à la parcelle à partir du menu À propos du terrain &gt; Accès."
- name="land manage passes" value="31" />
- <action description="Expulser et geler des résidents"
- longdescription="Vous pouvez expulser ou geler un résident indésirable en cliquant-droit sur lui, menu radial &gt; Plus."
- name="land admin" value="32" />
+ <action_set description="Ces pouvoirs permettent d&apos;autoriser ou d&apos;interdire l&apos;accès à des parcelles du groupe et de geler ou d&apos;expulser des résidents." name="Parcel Access">
+ <action description="Gérer la liste d&apos;accès à la parcelle" longdescription="Gérez la liste des résidents autorisés sur la parcelle à partir du menu À propos du terrain &gt; Accès." name="land manage allowed" value="29"/>
+ <action description="Gérer la liste noire de cette parcelle" longdescription="Gérez les listes des résidents bannis des parcelles dans l&apos;onglet À propos des terrains &gt; Accès." name="land manage banned" value="30"/>
+ <action description="Modifiez les paramètres Vendre des pass à" longdescription="Modifiez les paramètres Vendre des pass à dans l&apos;onglet À propos des terrains &gt; Accès." name="land manage passes" value="31"/>
+ <action description="Expulser et geler des résidents" longdescription="Les membres dans un rôle avec ce pouvoir peuvent se charger des résidents indésirables sur une parcelle appartenant au groupe en cliquant dessus, puis en sélectionnant Expulser ou Geler." name="land admin" value="32"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de renvoyer des objets du groupe et de placer ou déplacer des plantes Linden pour aménager le paysage. Utilisez ce pouvoir avec précaution car les objets renvoyés le sont définitivement."
- name="Parcel Content">
- <action description="Renvoyer les objets transférés au groupe"
- longdescription="Vous pouvez renvoyer des objets appartenant au groupe à partir du menu À propos du terrain &gt; Objets."
- name="land return group owned" value="48" />
- <action description="Renvoyer les objets attribués au groupe"
- longdescription="Renvoyez les objets attribués au groupe et sur des parcelles du groupe à partir du menu À propos du terrain &gt; Objets."
- name="land return group set" value="33" />
- <action description="Renvoyer des objets n&apos;appartenant pas au groupe"
- longdescription="Renvoyez les objets n&apos;appartenant pas au groupe et sur des parcelles du groupe à partir du menu À propos du terrain &gt; Objets."
- name="land return non group" value="34" />
- <action description="Aménager le paysage avec des plantes Linden"
- longdescription="Placez et déplacez des arbres, plantes et herbes Linden. Vous les trouverez dans le dossier Objets de la bibliothèque de votre inventaire mais aussi à partir du menu Construire."
- name="land gardening" value="35" />
+ <action_set description="Ces pouvoirs permettent de renvoyer des objets du groupe et de placer ou déplacer des plantes Linden pour aménager le paysage. Utilisez ce pouvoir avec précaution car les objets renvoyés le sont définitivement." name="Parcel Content">
+ <action description="Renvoyer les objets transférés au groupe" longdescription="Vous pouvez renvoyer des objets appartenant au groupe à partir du menu À propos du terrain &gt; Objets." name="land return group owned" value="48"/>
+ <action description="Renvoyer les objets attribués au groupe" longdescription="Renvoyez les objets attribués au groupe et sur des parcelles du groupe à partir du menu À propos du terrain &gt; Objets." name="land return group set" value="33"/>
+ <action description="Renvoyer des objets n&apos;appartenant pas au groupe" longdescription="Renvoyez les objets n&apos;appartenant pas au groupe et sur des parcelles du groupe à partir du menu À propos du terrain &gt; Objets." name="land return non group" value="34"/>
+ <action description="Aménager le paysage avec des plantes Linden" longdescription="Pouvoir de paysagisme permettant de placer et déplacer des arbres, des plantes et des herbes Linden. Vous trouverez ces objets dans le dossier Bibliothèque &gt; Objets de votre inventaire. Vous pouvez aussi les créer à partir du menu Construire." name="land gardening" value="35"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de transférer, modifier et vendre des objets du groupe. Ces changements se font à partir du menu Construire &gt; Modifier &gt; Général."
- name="Object Management">
- <action description="Transférer des objets au groupe"
- longdescription="Transférez des objets au groupe à partir du menu Construire &gt; Modifier &gt; Général."
- name="object deed" value="36" />
- <action
- description="Manipuler les objets du groupe"
- longdescription="Déplacez, copiez et modifiez les objets du groupe à partir du menu Construire &gt; Modifier &gt; Général."
- name="object manipulate" value="38" />
- <action description="Vendre des objets du groupe"
- longdescription="Mettez en vente des objets du groupe à partir du menu Construire &gt; Modifier &gt; Général."
- name="object set sale" value="39" />
+ <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre des objets appartenant au groupe. Pour ce faire, utilisez l&apos;onglet Outils de construction &gt; Général. Cliquez sur un objet avec le bouton droit de la souris puis sur Modifier pour accéder à ses paramètres." name="Object Management">
+ <action description="Transférer des objets au groupe" longdescription="Cédez des objets au groupe dans l&apos;onglet Outils de construction &gt; Général." name="object deed" value="36"/>
+ <action description="Manipuler les objets du groupe" longdescription="Manipulez (déplacez, copiez, modifiez) des objets appartenant au groupe dans l&apos;onglet Outils de construction &gt; Général." name="object manipulate" value="38"/>
+ <action description="Vendre des objets du groupe" longdescription="Mettez des objets appartenant au groupe en vente dans l&apos;onglet Outils de construction &gt; Général." name="object set sale" value="39"/>
</action_set>
- <action_set
- description="Ce pouvoir définit les contributions aux frais du groupe, la réception des dividendes et l&apos;accès aux finances du groupe."
- name="Accounting">
- <action description="Contribuer aux frais du groupe et recevoir des dividendes"
- longdescription="Contribuez aux frais du groupe et recevez des dividendes en cas de bénéfices. Vous recevrez une partie des ventes de terrains et objets appartenant au groupe et contribuerez aux frais divers (mise en vente des terrains etc.)"
- name="accounting accountable" value="40" />
+ <action_set description="Ce pouvoir définit les contributions aux frais du groupe, la réception des dividendes et l&apos;accès aux finances du groupe." name="Accounting">
+ <action description="Contribuer aux frais du groupe et recevoir des dividendes" longdescription="Contribuez aux frais du groupe et recevez des dividendes en cas de bénéfices. Vous recevrez une partie des ventes de terrains et objets appartenant au groupe et contribuerez aux frais divers (mise en vente des terrains etc.)" name="accounting accountable" value="40"/>
</action_set>
- <action_set
- description="Envoyez, recevez et consultez les notices du groupe."
- name="Notices">
- <action description="Envoyer des notices"
- longdescription="Envoyez des notices à l&apos;onglet Notices."
- name="notices send" value="42" />
- <action description="Recevoir et consulter les notices"
- longdescription="Recevez des notices et consulter d&apos;anciennes notices à l&apos;onglet Notices."
- name="notices receive" value="43" />
+ <action_set description="Envoyez, recevez et consultez les notices du groupe." name="Notices">
+ <action description="Envoyer des notices" longdescription="Les membres dans un rôle avec ce pouvoir peuvent envoyer des notices par le biais de la section Groupe &gt; Notices." name="notices send" value="42"/>
+ <action description="Recevoir et consulter les notices" longdescription="Les membres dans un rôle avec ce pouvoir peuvent recevoir des notices et consulter les anciennes notices par le biais de la section Groupe &gt; Notices." name="notices receive" value="43"/>
</action_set>
- <action_set
- description="Ces pouvoirs permettent de créer de nouvelles propositions, de voter et de consulter l&apos;historique des votes."
- name="Proposals">
- <action description="Créer des propositions"
- longdescription="Ces pouvoirs permettent de créer des propositions et de les soumettre au vote, à partir du menu Profil du groupe &gt; Propositions."
- name="proposal start" value="44" />
- <action description="Voter les propositions"
- longdescription="Votez les propositions à partir du menu Profil du groupe &gt; Propositions."
- name="proposal vote" value="45" />
+ <action_set description="Ces pouvoirs permettent de créer de nouvelles propositions, de voter et de consulter l&apos;historique des votes." name="Proposals">
+ <action description="Créer des propositions" longdescription="Ces pouvoirs permettent de créer des propositions et de les soumettre au vote, à partir du menu Profil du groupe &gt; Propositions." name="proposal start" value="44"/>
+ <action description="Voter les propositions" longdescription="Votez les propositions à partir du menu Profil du groupe &gt; Propositions." name="proposal vote" value="45"/>
</action_set>
- <action_set
- description="Ces pouvoirs vous permettent de gérer l&apos;accès aux sessions de chat écrit ou vocal du groupe."
- name="Chat">
- <action description="Participer aux chats"
- longdescription="Participez aux chats du groupe."
- name="join group chat" />
- <action description="Participer au chat vocal"
- longdescription="Participez au chat vocal du groupe. Remarque : vous devez au préalable avoir le pouvoir de participer aux chats."
- name="join voice chat" />
- <action description="Modérer les chats"
- longdescription="Contrôlez l&apos;accès et la participation aux chats de groupe écrits et vocaux."
- name="moderate group chat" />
+ <action_set description="Ces pouvoirs vous permettent de gérer l&apos;accès aux sessions de chat écrit ou vocal du groupe." name="Chat">
+ <action description="Participer aux chats" longdescription="Participez aux chats du groupe." name="join group chat"/>
+ <action description="Participer au chat vocal" longdescription="Participez au chat vocal du groupe. Remarque : vous devez au préalable avoir le pouvoir de participer aux chats." name="join voice chat"/>
+ <action description="Modérer les chats" longdescription="Contrôlez l&apos;accès et la participation aux chats de groupe écrits et vocaux." name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml
new file mode 100644
index 0000000000..60fd63bffc
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Tenues" name="appearance panel">
+ <string name="No Outfit" value="Aucune tenue"/>
+ <panel name="panel_currentlook">
+ <button label="Éditer" name="editappearance_btn"/>
+ <text name="currentlook_title">
+ (non enregistré)
+ </text>
+ <text name="currentlook_name">
+ Ma tenue avec un nom très long comme ORIGNAL
+ </text>
+ </panel>
+ <filter_editor label="Filtrer les tenues" name="Filter"/>
+ <button label="Porter" name="wear_btn"/>
+ <button label="Nouvelle tenue" name="newlook_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
new file mode 100644
index 0000000000..eba399f6a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Choses" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Profil" name="info_btn"/>
+ <button label="Porter" name="wear_btn"/>
+ <button label="Jouer" name="play_btn"/>
+ <button label="Téléporter" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
new file mode 100644
index 0000000000..31a0534b2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Profil de l&apos;objet">
+ <panel.string name="unknown">
+ (inconnu)
+ </panel.string>
+ <panel.string name="public">
+ (public)
+ </panel.string>
+ <panel.string name="you_can">
+ Vous pouvez :
+ </panel.string>
+ <panel.string name="owner_can">
+ Le propriétaire peut :
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Profil de l&apos;objet"/>
+ <text name="where" value="(inventaire)"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nom :
+ </text>
+ <text name="LabelItemDescTitle">
+ Description :
+ </text>
+ <text name="LabelCreatorTitle">
+ Créateur :
+ </text>
+ <text name="LabelCreatorName">
+ Nicole Linden
+ </text>
+ <button label="Profil" name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Propriétaire :
+ </text>
+ <text name="LabelOwnerName">
+ Thrax Linden
+ </text>
+ <button label="Profil" name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Acquis :
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Vous pouvez :
+ </text>
+ <check_box label="Modifier" name="CheckOwnerModify"/>
+ <check_box label="Copier" name="CheckOwnerCopy"/>
+ <check_box label="Transférer" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ N&apos;importe qui :
+ </text>
+ <check_box label="Copier" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Groupe :
+ </text>
+ <check_box label="Partager" name="CheckShareWithGroup" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
+ <text name="NextOwnerLabel">
+ Le prochain propriétaire :
+ </text>
+ <check_box label="Modifier" name="CheckNextOwnerModify"/>
+ <check_box label="Copier" name="CheckNextOwnerCopy"/>
+ <check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+ </panel>
+ <check_box label="À vendre" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copier" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Prix : L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Annuler" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
new file mode 100644
index 0000000000..f791877fa8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Profil de l&apos;objet">
+ <panel.string name="text deed continued">
+ Céder
+ </panel.string>
+ <panel.string name="text deed">
+ Céder
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Vous pouvez modifier cet objet
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Vous pouvez modifier ces objets
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Vous ne pouvez pas modifier cet objet
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Vous ne pouvez pas modifier ces objets
+ </panel.string>
+ <panel.string name="text modify warning">
+ Cet objet comprend des parties reliées
+ </panel.string>
+ <panel.string name="Cost Default">
+ Prix : L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Prix total : L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Prix par : L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Prix mixte
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Vente mixte
+ </panel.string>
+ <text name="title" value="Profil de l&apos;objet"/>
+ <text name="where" value="(dans Second Life)"/>
+ <panel label="">
+ <text name="Name:">
+ Nom :
+ </text>
+ <text name="Description:">
+ Description :
+ </text>
+ <text name="CreatorNameLabel">
+ Créateur :
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ Propriétaire :
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ Groupe :
+ </text>
+ <button name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
+ <name_box initial_value="Chargement..." name="Group Name Proxy"/>
+ <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
+ <text name="label click action">
+ Cliquer pour :
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
+ <combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
+ <combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
+ <combo_box.item label="Payer l&apos;objet" name="Payobject"/>
+ <combo_box.item label="Ouvrir" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Vous pouvez modifier cet objet
+ </text>
+ <text name="Anyone can:">
+ N&apos;importe qui :
+ </text>
+ <check_box label="Copier" name="checkbox allow everyone copy"/>
+ <check_box label="Bouger" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Groupe :
+ </text>
+ <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
+ <text name="NextOwnerLabel">
+ Le prochain propriétaire :
+ </text>
+ <check_box label="Modifier" name="checkbox next owner can modify"/>
+ <check_box label="Copier" name="checkbox next owner can copy"/>
+ <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+ </panel>
+ <check_box label="À vendre" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copier" name="Copy"/>
+ <combo_box.item label="Contenus" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Prix : L$" name="Edit Cost"/>
+ <check_box label="Afficher dans les résultats de recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
+ <text name="B:">
+ B :
+ </text>
+ <text name="O:">
+ O :
+ </text>
+ <text name="G:">
+ G :
+ </text>
+ <text name="E:">
+ E :
+ </text>
+ <text name="N:">
+ N :
+ </text>
+ <text name="F:">
+ F :
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Ouvrir" name="open_btn"/>
+ <button label="Payer" name="pay_btn"/>
+ <button label="Acheter" name="buy_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 070d2cd1a5..f25fe09c84 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1,12 +1,39 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Grille de Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Portail Assistance Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Détection du matériel...
+ </string>
+ <string name="StartupLoading">
+ Chargement
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
<string name="LoginInProgress">
La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Connexion...
+ </string>
<string name="LoginAuthenticating">
Authentification en cours
</string>
@@ -25,6 +52,9 @@
<string name="LoginInitializingMultimedia">
Multimédia en cours d&apos;initialisation…
</string>
+ <string name="LoginInitializingFonts">
+ Chargement des polices en cours...
+ </string>
<string name="LoginVerifyingCache">
Fichiers du cache en cours de vérification (peut prendre 60-90 s)...
</string>
@@ -55,8 +85,17 @@
<string name="LoginDownloadingClothing">
Habits en cours de téléchargement...
</string>
+ <string name="LoginFailedNoNetwork">
+ Erreur réseau : impossible d&apos;établir la connexion. Veuillez vérifier votre connexion réseau.
+ </string>
+ <string name="Quit">
+ Quitter
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=fr-FR
+ </string>
<string name="AgentLostConnection">
- Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet.
+ Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
</string>
<string name="TooltipPerson">
Personne
@@ -73,39 +112,9 @@
<string name="TooltipIsGroup">
(Groupe)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Propriétés physique
- </string>
- <string name="TooltipFlagTouch">
- Toucher
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Laisser tomber l&apos;inventaire
- </string>
- <string name="TooltipFlagPhantom">
- Fantôme
- </string>
- <string name="TooltipFlagTemporary">
- Temporaire
- </string>
- <string name="TooltipFlagRightClickMenu">
- (cliquez-droit pour le menu)
- </string>
- <string name="TooltipFreeToCopy">
- Copie autorisée
- </string>
<string name="TooltipForSaleL$">
À vendre : [AMOUNT] L$
</string>
- <string name="TooltipForSaleMsg">
- À vendre : [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Contruction de groupe
</string>
@@ -133,6 +142,73 @@
<string name="TooltipMustSingleDrop">
Impossible de faire glisser plus d&apos;un objet ici
</string>
+ <string name="TooltipHttpUrl">
+ Cliquez pour afficher cette page web
+ </string>
+ <string name="TooltipSLURL">
+ Cliquez pour en savoir plus sur cet endroit
+ </string>
+ <string name="TooltipAgentUrl">
+ Cliquez pour afficher le profil de ce résident
+ </string>
+ <string name="TooltipGroupUrl">
+ Cliquez pour afficher la description de ce groupe
+ </string>
+ <string name="TooltipEventUrl">
+ Cliquez pour afficher la description de cet événement
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Cliquez pour afficher cette petite annonce
+ </string>
+ <string name="TooltipParcelUrl">
+ Cliquez pour afficher la description de cette parcelle
+ </string>
+ <string name="TooltipTeleportUrl">
+ Cliquez pour vous téléporter à cet endroit
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Cliquez pour afficher la description de cet objet
+ </string>
+ <string name="TooltipMapUrl">
+ Cliquez pour voir cet emplacement sur la carte
+ </string>
+ <string name="TooltipSLAPP">
+ Cliquez pour exécuter la commande secondlife:// command
+ </string>
+ <string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Me téléporter vers
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Afficher la carte pour
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fermer (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fermer (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurer
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimiser
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Réduire
+ </string>
+ <string name="BUTTON_DOCK">
+ Attacher
+ </string>
+ <string name="BUTTON_HELP">
+ Afficher l&apos;aide
+ </string>
+ <string name="Searching">
+ Recherche...
+ </string>
+ <string name="NoneFound">
+ Aucun résultat.
+ </string>
<string name="RetrievingData">
En cours d&apos;extraction...
</string>
@@ -140,7 +216,7 @@
Notes de version
</string>
<string name="LoadingData">
- Chargement..
+ Chargement...
</string>
<string name="AvatarNameNobody">
(personne)
@@ -148,8 +224,8 @@
<string name="AvatarNameWaiting">
(en attente)
</string>
- <string name="AvatarNameHippos">
- (hippos)
+ <string name="AvatarNameMultiple">
+ (multiple)
</string>
<string name="GroupNameNone">
(aucun)
@@ -187,7 +263,79 @@
<string name="AssetErrorUnknownStatus">
Statut inconnu
</string>
- <string name="AvatarEditingApparance">
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ son
+ </string>
+ <string name="calling card">
+ carte de visite
+ </string>
+ <string name="landmark">
+ repère
+ </string>
+ <string name="legacy script">
+ script (ancienne version)
+ </string>
+ <string name="clothing">
+ habits
+ </string>
+ <string name="object">
+ objet
+ </string>
+ <string name="note card">
+ note
+ </string>
+ <string name="folder">
+ dossier
+ </string>
+ <string name="root">
+ racine
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ texture tga
+ </string>
+ <string name="body part">
+ partie du corps
+ </string>
+ <string name="snapshot">
+ photo
+ </string>
+ <string name="lost and found">
+ Objets trouvés
+ </string>
+ <string name="targa image">
+ image targa
+ </string>
+ <string name="trash">
+ Poubelle
+ </string>
+ <string name="jpeg image">
+ image jpeg
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ geste
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ lien
+ </string>
+ <string name="AvatarEditingAppearance">
(Apparence en cours de modification)
</string>
<string name="AvatarAway">
@@ -197,7 +345,7 @@
Occupé
</string>
<string name="AvatarMuted">
- Ignoré
+ Bloqué(e)
</string>
<string name="anim_express_afraid">
Effrayé
@@ -412,20 +560,89 @@
<string name="worldmap_offline">
Hors ligne
</string>
+ <string name="worldmap_results_none_found">
+ Aucun résultat.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fichier incomplet
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossible de trouver ROOT ou JOINT.
+ </string>
<string name="whisper">
chuchote :
</string>
<string name="shout">
crie :
</string>
+ <string name="ringing">
+ Connexion au chat vocal du Monde en cours…
+ </string>
+ <string name="connected">
+ Connecté(e)
+ </string>
+ <string name="unavailable">
+ Voix non disponible à l&apos;endroit où vous êtes
+ </string>
+ <string name="hang_up">
+ Déconnecté du chat vocal
+ </string>
+ <string name="reconnect_nearby">
+ Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Débiter vos Linden dollars (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Utiliser vos touches de commandes
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurer vos touches de commandes
+ </string>
+ <string name="AnimateYourAvatar">
+ Animer votre avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attacher à votre avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Passer l&apos;objet dans le domaine public (sans propriétaire)
+ </string>
+ <string name="LinkAndDelink">
+ Lier et délier d&apos;autres objets
+ </string>
+ <string name="AddAndRemoveJoints">
+ Créer et supprimer des liens avec d&apos;autres objets
+ </string>
+ <string name="ChangePermissions">
+ Modifier ses droits
+ </string>
+ <string name="TrackYourCamera">
+ Suivre votre caméra
+ </string>
+ <string name="ControlYourCamera">
+ Contrôler votre caméra
+ </string>
+ <string name="NotConnected">
+ Pas connecté(e)
+ </string>
<string name="SIM_ACCESS_PG">
- PG
+ Général
</string>
<string name="SIM_ACCESS_MATURE">
- Mature
+ Modéré
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ Adulte
</string>
<string name="SIM_ACCESS_DOWN">
Hors ligne
@@ -436,12 +653,6 @@
<string name="land_type_unknown">
(inconnu)
</string>
- <string name="covenant_never_modified">
- Dernière modification : (jamais)
- </string>
- <string name="covenant_modified">
- Dernière modification :
- </string>
<string name="all_files">
Tous fichiers
</string>
@@ -487,17 +698,922 @@
<string name="choose_the_directory">
Choisir le répertoire
</string>
+ <string name="AvatarSetNotAway">
+ Présent
+ </string>
+ <string name="AvatarSetAway">
+ Absent
+ </string>
+ <string name="AvatarSetNotBusy">
+ Pas occupé
+ </string>
+ <string name="AvatarSetBusy">
+ Occupé
+ </string>
+ <string name="shape">
+ Silhouette
+ </string>
+ <string name="skin">
+ Peau
+ </string>
+ <string name="hair">
+ Cheveux
+ </string>
+ <string name="eyes">
+ Yeux
+ </string>
+ <string name="shirt">
+ Chemise
+ </string>
+ <string name="pants">
+ Pantalon
+ </string>
+ <string name="shoes">
+ Chaussures
+ </string>
+ <string name="socks">
+ Chaussettes
+ </string>
+ <string name="jacket">
+ Veste
+ </string>
+ <string name="gloves">
+ Gants
+ </string>
+ <string name="undershirt">
+ Débardeur
+ </string>
+ <string name="underpants">
+ Caleçon
+ </string>
+ <string name="skirt">
+ Jupe
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatouage
+ </string>
+ <string name="invalid">
+ non valide
+ </string>
+ <string name="next">
+ Suivant
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Note au groupe
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Notices au groupe
+ </string>
+ <string name="GroupNotifySentBy">
+ Envoyée par
+ </string>
+ <string name="GroupNotifyAttached">
+ Pièce(s) jointe(s) :
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Ouvrir la pièce jointe
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Enregistrer la pièce jointe
+ </string>
+ <string name="TeleportOffer">
+ Offre de téléportation
+ </string>
+ <string name="StartUpNotifications">
+ De nouvelles notifications sont arrivées en votre absence.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Vous avez %d notification(s) supplémentaire(s)
+ </string>
+ <string name="BodyPartsRightArm">
+ Bras droit
+ </string>
+ <string name="BodyPartsHead">
+ Tête
+ </string>
+ <string name="BodyPartsLeftArm">
+ Bras gauche
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Jambe gauche
+ </string>
+ <string name="BodyPartsTorso">
+ Torse
+ </string>
+ <string name="BodyPartsRightLeg">
+ Jambe droite
+ </string>
+ <string name="GraphicsQualityLow">
+ Faible
+ </string>
+ <string name="GraphicsQualityMid">
+ Moyen
+ </string>
+ <string name="GraphicsQualityHigh">
+ Élevé
+ </string>
+ <string name="LeaveMouselook">
+ Appuyez sur ESC pour quitter la vue subjective
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Aucun objet correspondant dans l&apos;inventaire. Essayer la [secondlife:///app/search/groups &quot;Recherche&quot;].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Faites glisser un repère ici pour l&apos;ajouter à vos Favoris.
+ </string>
+ <string name="InventoryNoTexture">
+ Vous n&apos;avez pas de copie de cette texture dans votre inventaire
+ </string>
+ <string name="no_transfer" value=" (pas de transfert)"/>
+ <string name="no_modify" value=" (pas de modification)"/>
+ <string name="no_copy" value=" (pas de copie)"/>
+ <string name="worn" value=" (porté)"/>
+ <string name="link" value=" (lien)"/>
+ <string name="broken_link" value=" (broken_link)"/>
+ <string name="LoadingContents">
+ chargement des contenus en cours...
+ </string>
+ <string name="NoContents">
+ Aucun contenu
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/>
+ <string name="PermYes">
+ Oui
+ </string>
+ <string name="PermNo">
+ Non
+ </string>
+ <string name="Chat" value=" Chat :"/>
+ <string name="Sound" value=" Son :"/>
+ <string name="Wait" value=" --- Attendre :"/>
+ <string name="AnimFlagStop" value=" Arrêter l&apos;animation :"/>
+ <string name="AnimFlagStart" value=" Démarrer l&apos;animation :"/>
+ <string name="Wave" value=" Faire signe"/>
+ <string name="HelloAvatar" value=" Bonjour, avatar !"/>
+ <string name="ViewAllGestures" value=" Tout afficher &gt;&gt;"/>
+ <string name="Animations" value=" Animations,"/>
+ <string name="Calling Cards" value=" Cartes de visite,"/>
+ <string name="Clothing" value=" Habits,"/>
+ <string name="Gestures" value=" Gestes,"/>
+ <string name="Landmarks" value=" Repères,"/>
+ <string name="Notecards" value=" Notes,"/>
+ <string name="Objects" value=" Objets,"/>
+ <string name="Scripts" value=" Scripts,"/>
+ <string name="Sounds" value=" Sons,"/>
+ <string name="Textures" value=" Textures,"/>
+ <string name="Snapshots" value=" Photos,"/>
+ <string name="No Filters" value="Non "/>
+ <string name="Since Logoff" value=" - Depuis la déconnexion"/>
+ <string name="InvFolder My Inventory">
+ Mon inventaire
+ </string>
+ <string name="InvFolder My Favorites">
+ Mes Favoris
+ </string>
+ <string name="InvFolder Library">
+ Bibliothèque
+ </string>
+ <string name="InvFolder Textures">
+ Textures
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartes de visite
+ </string>
+ <string name="InvFolder Landmarks">
+ Repères
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Habits
+ </string>
+ <string name="InvFolder Objects">
+ Objets
+ </string>
+ <string name="InvFolder Notecards">
+ Notes
+ </string>
+ <string name="InvFolder New Folder">
+ Nouveau dossier
+ </string>
+ <string name="InvFolder Inventory">
+ Inventaire
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Images non compressées
+ </string>
+ <string name="InvFolder Body Parts">
+ Parties du corps
+ </string>
+ <string name="InvFolder Trash">
+ Poubelle
+ </string>
+ <string name="InvFolder Photo Album">
+ Albums photo
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objets trouvés
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons non compressés
+ </string>
+ <string name="InvFolder Animations">
+ Animations
+ </string>
+ <string name="InvFolder Gestures">
+ Gestes
+ </string>
+ <string name="InvFolder favorite">
+ Favoris
+ </string>
+ <string name="InvFolder Current Outfit">
+ Tenue actuelle
+ </string>
+ <string name="InvFolder My Outfits">
+ Mes tenues
+ </string>
+ <string name="InvFolder Friends">
+ Amis
+ </string>
+ <string name="InvFolder All">
+ Tout
+ </string>
+ <string name="Buy">
+ Acheter
+ </string>
+ <string name="BuyforL$">
+ Acheter des L$
+ </string>
+ <string name="Stone">
+ Pierre
+ </string>
+ <string name="Metal">
+ Métal
+ </string>
+ <string name="Glass">
+ Verre
+ </string>
+ <string name="Wood">
+ Bois
+ </string>
+ <string name="Flesh">
+ Chair
+ </string>
+ <string name="Plastic">
+ Plastique
+ </string>
+ <string name="Rubber">
+ Caoutchouc
+ </string>
+ <string name="Light">
+ Léger
+ </string>
+ <string name="KBShift">
+ Maj-
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Poitrine
+ </string>
+ <string name="Skull">
+ Crâne
+ </string>
+ <string name="Left Shoulder">
+ Épaule gauche
+ </string>
+ <string name="Right Shoulder">
+ Épaule droite
+ </string>
+ <string name="Left Hand">
+ Main gauche
+ </string>
+ <string name="Right Hand">
+ Main droite
+ </string>
+ <string name="Left Foot">
+ Pied gauche
+ </string>
+ <string name="Right Foot">
+ Pied droit
+ </string>
+ <string name="Spine">
+ Colonne
+ </string>
+ <string name="Pelvis">
+ Bassin
+ </string>
+ <string name="Mouth">
+ Bouche
+ </string>
+ <string name="Chin">
+ Menton
+ </string>
+ <string name="Left Ear">
+ Oreille gauche
+ </string>
+ <string name="Right Ear">
+ Oreille droite
+ </string>
+ <string name="Left Eyeball">
+ Globe oculaire gauche
+ </string>
+ <string name="Right Eyeball">
+ Globe oculaire droit
+ </string>
+ <string name="Nose">
+ Nez
+ </string>
+ <string name="R Upper Arm">
+ Bras D
+ </string>
+ <string name="R Forearm">
+ Avant-bras D
+ </string>
+ <string name="L Upper Arm">
+ Bras G
+ </string>
+ <string name="L Forearm">
+ Avant-bras G
+ </string>
+ <string name="Right Hip">
+ Hanche droite
+ </string>
+ <string name="R Upper Leg">
+ Cuisse D
+ </string>
+ <string name="R Lower Leg">
+ Jambe D
+ </string>
+ <string name="Left Hip">
+ Hanche gauche
+ </string>
+ <string name="L Upper Leg">
+ Cuisse G
+ </string>
+ <string name="L Lower Leg">
+ Jambe G
+ </string>
+ <string name="Stomach">
+ Estomac
+ </string>
+ <string name="Left Pec">
+ Pectoral gauche
+ </string>
+ <string name="Right Pec">
+ Pectoral droit
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Inscrit aujourd&apos;hui
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] an
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] ans
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] ans
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mois
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mois
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semaine
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semaines
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semaines
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] jour
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] jours
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] jours
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membre
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membres
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membres
+ </string>
+ <string name="AcctTypeResident">
+ Résident
+ </string>
+ <string name="AcctTypeTrial">
+ Essai
+ </string>
+ <string name="AcctTypeCharterMember">
+ Membre originaire
+ </string>
+ <string name="AcctTypeEmployee">
+ Employé(e) de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Infos de paiement utilisées
+ </string>
+ <string name="PaymentInfoOnFile">
+ Infos de paiement enregistrées
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Aucune info de paiement enregistrée
+ </string>
+ <string name="AgeVerified">
+ Personne dont l&apos;âge a été vérifié
+ </string>
+ <string name="NotAgeVerified">
+ Personne dont l&apos;âge n&apos;a pas été vérifié
+ </string>
+ <string name="Center 2">
+ Centrer 2
+ </string>
+ <string name="Top Right">
+ En haut à droite
+ </string>
+ <string name="Top">
+ En haut
+ </string>
+ <string name="Top Left">
+ En haut à gauche
+ </string>
+ <string name="Center">
+ Centrer
+ </string>
+ <string name="Bottom Left">
+ En bas à gauche
+ </string>
+ <string name="Bottom">
+ Bas
+ </string>
+ <string name="Bottom Right">
+ En bas à droite
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Téléchargé, compilation en cours
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script introuvable sur le serveur.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problème lors du téléchargement
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permissions insuffisantes pour télécharger un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permissions insuffisantes pour
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Échec du téléchargement, erreur inconnue
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilation - progrès
+ </string>
+ <string name="CompileQueueStart">
+ recompiler
+ </string>
+ <string name="ResetQueueTitle">
+ Réinitialiser les progrès
+ </string>
+ <string name="ResetQueueStart">
+ réinitialiser
+ </string>
+ <string name="RunQueueTitle">
+ Lancer
+ </string>
+ <string name="RunQueueStart">
+ lancer
+ </string>
+ <string name="NotRunQueueTitle">
+ Arrêter
+ </string>
+ <string name="NotRunQueueStart">
+ arrêter
+ </string>
+ <string name="CompileSuccessful">
+ Compilation réussie !
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilation réussie, enregistrement en cours...
+ </string>
+ <string name="SaveComplete">
+ Enregistrement terminé.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objet hors de portée)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objet [OBJECT] appartenant à [OWNER]
+ </string>
+ <string name="GroupsNone">
+ aucun
+ </string>
+ <string name="Group" value=" (groupe)"/>
+ <string name="Unknown">
+ (Inconnu)
+ </string>
+ <string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/>
+ <string name="NextStipendDay" value="Prochaine prime le "/>
+ <string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
+ <string name="Balance">
+ Solde
+ </string>
+ <string name="Credits">
+ Remerciements
+ </string>
+ <string name="Debits">
+ Débits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Aucune donnée trouvée pour le groupe
+ </string>
+ <string name="IMParentEstate">
+ domaine parent
+ </string>
+ <string name="IMMainland">
+ continent
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ erreur
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ tous les domaines appartenant à [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ tous les domaines vous appartenant
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ tous les domaines que vous gérez pour [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Résidents autorisés : ([ALLOWEDAGENTS], max. [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Groupes autorisés : ([ALLOWEDGROUPS], max. [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Mémoire des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelles répertoriées : [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Mémoire utilisée : [COUNT] Ko
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL des scripts de parcelles
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s)
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilisées : [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Une erreur est survenue pendant la requête d&apos;informations.
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Aucune parcelle sélectionnée
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erreur : les informations de script ne sont disponibles que dans votre région actuelle.
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Extraction des informations en cours...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Vous n&apos;avez pas le droit d&apos;examiner cette parcelle.
+ </string>
+ <string name="SITTING_ON">
+ Assis(e) dessus
+ </string>
+ <string name="ATTACH_CHEST">
+ Poitrine
+ </string>
+ <string name="ATTACH_HEAD">
+ Tête
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Épaule gauche
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Épaule droite
+ </string>
+ <string name="ATTACH_LHAND">
+ Main gauche
+ </string>
+ <string name="ATTACH_RHAND">
+ Main droite
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pied gauche
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pied droit
+ </string>
+ <string name="ATTACH_BACK">
+ Précédent
+ </string>
+ <string name="ATTACH_PELVIS">
+ Bassin
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bouche
+ </string>
+ <string name="ATTACH_CHIN">
+ Menton
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreille gauche
+ </string>
+ <string name="ATTACH_REAR">
+ Oreille droite
+ </string>
+ <string name="ATTACH_LEYE">
+ Å’il gauche
+ </string>
+ <string name="ATTACH_REYE">
+ Å’il droit
+ </string>
+ <string name="ATTACH_NOSE">
+ Nez
+ </string>
+ <string name="ATTACH_RUARM">
+ Bras droit
+ </string>
+ <string name="ATTACH_RLARM">
+ Avant-bras droit
+ </string>
+ <string name="ATTACH_LUARM">
+ Bras gauche
+ </string>
+ <string name="ATTACH_LLARM">
+ Avant-bras gauche
+ </string>
+ <string name="ATTACH_RHIP">
+ Hanche droite
+ </string>
+ <string name="ATTACH_RULEG">
+ Cuisse droite
+ </string>
+ <string name="ATTACH_RLLEG">
+ Jambe droite
+ </string>
+ <string name="ATTACH_LHIP">
+ Hanche gauche
+ </string>
+ <string name="ATTACH_LULEG">
+ Cuisse gauche
+ </string>
+ <string name="ATTACH_LLLEG">
+ Jambe gauche
+ </string>
+ <string name="ATTACH_BELLY">
+ Ventre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pectoral droit
+ </string>
+ <string name="ATTACH_LPEC">
+ Pectoral gauche
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD centre 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD en haut à droite
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD en haut au centre
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD en haut à gauche
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD centre 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD en bas à gauche
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD en bas
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD en bas à droite
+ </string>
+ <string name="CursorPos">
+ Ligne [LINE], colonne [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trouvé(s)
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsNewScript">
+ Nouveau script
+ </string>
+ <string name="MuteByName">
+ (par nom)
+ </string>
+ <string name="MuteAgent">
+ (résident)
+ </string>
+ <string name="MuteObject">
+ (objet)
+ </string>
+ <string name="MuteGroup">
+ (groupe)
+ </string>
+ <string name="RegionNoCovenant">
+ Il n&apos;y a aucun règlement pour ce domaine.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.
+ </string>
+ <string name="covenant_last_modified">
+ Dernière modification :
+ </string>
+ <string name="none_text" value=" (aucun)"/>
+ <string name="never_text" value=" (jamais)"/>
+ <string name="GroupOwned">
+ Propriété du groupe
+ </string>
+ <string name="Public">
+ Public
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (mise à jour après la publication)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Vous n&apos;avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Chargement...
+ </string>
+ <string name="MultiPreviewTitle">
+ Prévisualiser
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriétés
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objet appelé
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possédé par le groupe
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ possédé par un groupe inconnu
+ </string>
+ <string name="InvOfferOwnedBy">
+ possédé par
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ possédé par un résident inconnu
+ </string>
+ <string name="InvOfferGaveYou">
+ vous a donné
+ </string>
+ <string name="InvOfferYouDecline">
+ Vous avez refusé
+ </string>
+ <string name="InvOfferFrom">
+ de la part de
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ acheté
+ </string>
+ <string name="GroupMoneyPaidYou">
+ vous a payé
+ </string>
+ <string name="GroupMoneyPaidInto">
+ payé
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ a acheté un pass à
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ a payé des frais pour un événement
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ a payé un prix pour un événement
+ </string>
+ <string name="GroupMoneyBalance">
+ Solde
+ </string>
+ <string name="GroupMoneyCredits">
+ Remerciements
+ </string>
+ <string name="GroupMoneyDebits">
+ Débits
+ </string>
+ <string name="ViewerObjectContents">
+ Contenus
+ </string>
+ <string name="AcquiredItems">
+ Objets acquis
+ </string>
+ <string name="Cancel">
+ Annuler
+ </string>
+ <string name="UploadingCosts">
+ Charger %s coûte
+ </string>
+ <string name="UnknownFileExtension">
+ Extension de fichier inconnue .%s
+.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés
+ </string>
+ <string name="MuteObject2">
+ Ignorer
+ </string>
+ <string name="MuteAvatar">
+ Ignorer
+ </string>
+ <string name="UnmuteObject">
+ Ne plus ignorer
+ </string>
+ <string name="UnmuteAvatar">
+ Ne plus ignorer
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Ajouter à mes repères...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifier mon repère...
+ </string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -508,90 +1624,1697 @@
<string name="accel-win-shift">
Maj+
</string>
- <string name="GraphicsQualityLow">
- Faible
+ <string name="FileSaved">
+ Fichier enregistré
</string>
- <string name="GraphicsQualityMid">
- Moyen
+ <string name="Receiving">
+ Réception
</string>
- <string name="GraphicsQualityHigh">
- Élevé
+ <string name="AM">
+ Matin
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Appartenant aux Lindens</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Art et Culture</string>
- <string name="Business">Affaires</string>
- <string name="Educational">Éducation</string>
- <string name="Gaming">Jeux</string>
- <string name="Hangout">Favoris</string>
- <string name="Newcomer Friendly">Accueil pour les nouveaux</string>
- <string name="Parks&amp;Nature">Parcs et Nature</string>
- <string name="Residential">Résidentiel</string>
- <string name="Shopping">Shopping</string>
- <string name="Other">Autre</string>
-
- <string name="ringing">
- Connexion au chat vocal du Monde en cours…
+ <string name="PM">
+ Après-midi
</string>
- <string name="connected">
- Connecté(e)
+ <string name="PST">
+ PST
</string>
- <string name="unavailable">
- Voix non disponible à l&apos;endroit où vous êtes
+ <string name="PDT">
+ PDT
</string>
- <string name="hang_up">
- Déconnecté du chat vocal
+ <string name="Forward">
+ Vers l&apos;avant
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
+ <string name="Left">
+ Gauche
</string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
+ <string name="Right">
+ Droite
</string>
- <string name="ScriptTakeMoney">
- Débiter vos Linden dollars (L$)
+ <string name="Back">
+ Arrière
</string>
- <string name="ActOnControlInputs">
- Utiliser vos touches de commandes
+ <string name="North">
+ Nord
</string>
- <string name="RemapControlInputs">
- Reconfigurer vos touches de commandes
+ <string name="South">
+ Sud
</string>
- <string name="AnimateYourAvatar">
- Animer votre avatar
+ <string name="West">
+ Ouest
</string>
- <string name="AttachToYourAvatar">
- Attacher à votre avatar
+ <string name="East">
+ Est
</string>
- <string name="ReleaseOwnership">
- Passer l&apos;objet dans le domaine public (sans propriétaire)
+ <string name="Up">
+ Haut
</string>
- <string name="LinkAndDelink">
- Lier et délier d&apos;autres objets
+ <string name="Down">
+ Bas
</string>
- <string name="AddAndRemoveJoints">
- Créer et supprimer des liens avec d&apos;autres objets
+ <string name="Any Category">
+ Toutes catégories
</string>
- <string name="ChangePermissions">
- Modifier ses droits
+ <string name="Shopping">
+ Shopping
</string>
- <string name="TrackYourCamera">
- Suivre votre caméra
+ <string name="Land Rental">
+ Terrains à louer
</string>
- <string name="ControlYourCamera">
- Contrôler votre caméra
+ <string name="Property Rental">
+ Propriétés à louer
+ </string>
+ <string name="Special Attraction">
+ Divertissements
+ </string>
+ <string name="New Products">
+ Nouveaux produits
+ </string>
+ <string name="Employment">
+ Emplois
+ </string>
+ <string name="Wanted">
+ Offres
+ </string>
+ <string name="Service">
+ Services
+ </string>
+ <string name="Personal">
+ Divers
+ </string>
+ <string name="None">
+ Aucun
+ </string>
+ <string name="Linden Location">
+ Appartenant aux Lindens
+ </string>
+ <string name="Adult">
+ Adulte
+ </string>
+ <string name="Arts&amp;Culture">
+ Arts et culture
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Éducation
+ </string>
+ <string name="Gaming">
+ Jeux
+ </string>
+ <string name="Hangout">
+ Favoris
+ </string>
+ <string name="Newcomer Friendly">
+ Accueil pour les nouveaux
+ </string>
+ <string name="Parks&amp;Nature">
+ Parcs et nature
+ </string>
+ <string name="Residential">
+ Résidentiel
+ </string>
+ <string name="Stage">
+ Phase
+ </string>
+ <string name="Other">
+ Autre
+ </string>
+ <string name="Any">
+ Aucun
+ </string>
+ <string name="You">
+ Vous
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Médias multiples
+ </string>
+ <string name="Play Media">
+ Lire/pauser le média
+ </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
+Erreur :
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] - Utilisation de la ligne de commande :
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ne peut accéder à un fichier requis.
+
+Cela vient du fait que quelqu&apos;un a ouvert plusieurs copies ou que votre système pense qu&apos;un fichier est ouvert.
+Si ce message persiste, veuillez redémarrer votre ordinateur.
+Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ Erreur fatale
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] est déjà en cours d&apos;exécution.
+Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches.
+Si ce message persiste, redémarrez votre ordinateur.
</string>
- <text name="only_user_message">
+ <string name="MBFrozenCrashed">
+ [APP_NAME] semble avoir crashé lors de l&apos;utilisation précédente.
+Voulez-vous envoyer un rapport de crash ?
+ </string>
+ <string name="MBAlert">
+ Notification
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
+[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l&apos;utiliser avec DirectX 9.0b.
+
+Voulez-vous continuer ?
+ </string>
+ <string name="MBWarning">
+ Avertissement
+ </string>
+ <string name="MBNoAutoUpdate">
+ Les mises à jour automatiques n&apos;existent pas encore pour Linux.
+Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass a échoué
+ </string>
+ <string name="MBError">
+ Erreur
+ </string>
+ <string name="MBFullScreenErr">
+ Impossible d&apos;ouvrir le mode plein écran à [WIDTH] x [HEIGHT].
+Utilisation du mode fenêtré.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué)
+ </string>
+ <string name="MBShutdownErr">
+ Erreur de fermeture
+ </string>
+ <string name="MBDevContextErr">
+ Impossible de créer le contexte GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossible de trouver la description du format pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] nécessite True Color (32 bits) pour s&apos;exécuter.
+Accédez aux paramètres d&apos;affichage de votre ordinateur et réglez le mode couleur sur 32 bits.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] ne peut pas s&apos;exécuter, car il n&apos;y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo.
+Assurez-vous d&apos;avoir installé le pilote de carte vidéo le plus récent possible.
+Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration &gt; Affichage &gt; Paramètres.
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossible de trouver le format pixel approprié
+ </string>
+ <string name="MBGLContextErr">
+ Impossible de créer le contexte de rendu GL
+ </string>
+ <string name="MBGLContextActErr">
+ Impossible d&apos;activer le contexte de rendu GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] ne peut pas s&apos;exécuter car les pilotes de votre carte vidéo n&apos;ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d&apos;avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
+
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Peu
+ </string>
+ <string name="All White">
+ Tout blancs
+ </string>
+ <string name="Anime Eyes">
+ Grand yeux
+ </string>
+ <string name="Arced">
+ Arqués
+ </string>
+ <string name="Arm Length">
+ Longueur des bras
+ </string>
+ <string name="Attached">
+ Attachés
+ </string>
+ <string name="Attached Earlobes">
+ Lobes
+ </string>
+ <string name="Back Fringe">
+ Mèches de derrière
+ </string>
+ <string name="Baggy">
+ Plus
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Beady Eyes">
+ Yeux perçants
+ </string>
+ <string name="Belly Size">
+ Taille du ventre
+ </string>
+ <string name="Big">
+ Plus
+ </string>
+ <string name="Big Butt">
+ Grosses fesses
+ </string>
+ <string name="Big Hair Back">
+ Volume : Derrière
+ </string>
+ <string name="Big Hair Front">
+ Volume : Devant
+ </string>
+ <string name="Big Hair Top">
+ Volume : Haut
+ </string>
+ <string name="Big Head">
+ Plus
+ </string>
+ <string name="Big Pectorals">
+ Gros pectoraux
+ </string>
+ <string name="Big Spikes">
+ Spikes
+ </string>
+ <string name="Black">
+ Noir
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Cheveux blonds
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Couleur du blush
+ </string>
+ <string name="Blush Opacity">
+ Opacité du blush
+ </string>
+ <string name="Body Definition">
+ Contour du corps
+ </string>
+ <string name="Body Fat">
+ Graisse
+ </string>
+ <string name="Body Freckles">
+ Grains de beauté
+ </string>
+ <string name="Body Thick">
+ Plus
+ </string>
+ <string name="Body Thickness">
+ Épaisseur du corps
+ </string>
+ <string name="Body Thin">
+ Moins
+ </string>
+ <string name="Bow Legged">
+ Jambes arquées
+ </string>
+ <string name="Breast Buoyancy">
+ Hauteur des seins
+ </string>
+ <string name="Breast Cleavage">
+ Clivage
+ </string>
+ <string name="Breast Size">
+ Taille des seins
+ </string>
+ <string name="Bridge Width">
+ Arête du nez
+ </string>
+ <string name="Broad">
+ Large
+ </string>
+ <string name="Brow Size">
+ Taille
+ </string>
+ <string name="Bug Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bugged Eyes">
+ Yeux globuleux
+ </string>
+ <string name="Bulbous">
+ En bulbe
+ </string>
+ <string name="Bulbous Nose">
+ Nez en bulbe
+ </string>
+ <string name="Bushy Eyebrows">
+ Sourcils touffus
+ </string>
+ <string name="Bushy Hair">
+ Beaucoup
+ </string>
+ <string name="Butt Size">
+ Taille des fesses
+ </string>
+ <string name="bustle skirt">
+ Jupe gonflante
+ </string>
+ <string name="no bustle">
+ Pas gonflante
+ </string>
+ <string name="more bustle">
+ Plus gonflante
+ </string>
+ <string name="Chaplin">
+ Moins
+ </string>
+ <string name="Cheek Bones">
+ Pommettes
+ </string>
+ <string name="Chest Size">
+ Taille de la poitrine
+ </string>
+ <string name="Chin Angle">
+ Angle du menton
+ </string>
+ <string name="Chin Cleft">
+ Fente du menton
+ </string>
+ <string name="Chin Curtains">
+ Favoris
+ </string>
+ <string name="Chin Depth">
+ Profondeur
+ </string>
+ <string name="Chin Heavy">
+ Menton lourd
+ </string>
+ <string name="Chin In">
+ Menton rentré
+ </string>
+ <string name="Chin Out">
+ Menton sorti
+ </string>
+ <string name="Chin-Neck">
+ Menton-cou
+ </string>
+ <string name="Clear">
+ Clair
+ </string>
+ <string name="Cleft">
+ Fendu
+ </string>
+ <string name="Close Set Eyes">
+ Yeux rapprochés
+ </string>
+ <string name="Closed">
+ Fermé(s)
+ </string>
+ <string name="Closed Back">
+ Fermé à l&apos;arrière
+ </string>
+ <string name="Closed Front">
+ Fermé devant
+ </string>
+ <string name="Closed Left">
+ Fermé à gauche
+ </string>
+ <string name="Closed Right">
+ Fermé à droite
+ </string>
+ <string name="Coin Purse">
+ Mini
+ </string>
+ <string name="Collar Back">
+ Col arrière
+ </string>
+ <string name="Collar Front">
+ Col devant
+ </string>
+ <string name="Corner Down">
+ Coin vers le bas
+ </string>
+ <string name="Corner Up">
+ Coin vers le haut
+ </string>
+ <string name="Creased">
+ Fripée
+ </string>
+ <string name="Crooked Nose">
+ Déviation du nez
+ </string>
+ <string name="Cuff Flare">
+ Jambes
+ </string>
+ <string name="Dark">
+ Sombre
+ </string>
+ <string name="Dark Green">
+ Vert foncé
+ </string>
+ <string name="Darker">
+ Plus foncé
+ </string>
+ <string name="Deep">
+ Profonde
+ </string>
+ <string name="Default Heels">
+ Talons par défaut
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double menton
+ </string>
+ <string name="Downturned">
+ Pointant vers le bas
+ </string>
+ <string name="Duffle Bag">
+ Maxi
+ </string>
+ <string name="Ear Angle">
+ Angle de l&apos;oreille
+ </string>
+ <string name="Ear Size">
+ Taille
+ </string>
+ <string name="Ear Tips">
+ Extrémités
+ </string>
+ <string name="Egg Head">
+ Forme de la tête
+ </string>
+ <string name="Eye Bags">
+ Cernes
+ </string>
+ <string name="Eye Color">
+ Couleur des yeux
+ </string>
+ <string name="Eye Depth">
+ Profondeur
+ </string>
+ <string name="Eye Lightness">
+ Clarté
+ </string>
+ <string name="Eye Opening">
+ Ouverture
+ </string>
+ <string name="Eye Pop">
+ Œil proéminent
+ </string>
+ <string name="Eye Size">
+ Taille de l&apos;œil
+ </string>
+ <string name="Eye Spacing">
+ Espacement
+ </string>
+ <string name="Eyebrow Arc">
+ Arc
+ </string>
+ <string name="Eyebrow Density">
+ Épaisseur sourcils
+ </string>
+ <string name="Eyebrow Height">
+ Hauteur
+ </string>
+ <string name="Eyebrow Points">
+ Direction
+ </string>
+ <string name="Eyebrow Size">
+ Taille
+ </string>
+ <string name="Eyelash Length">
+ Longueur des cils
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Couleur de l&apos;eyeliner
+ </string>
+ <string name="Eyes Bugged">
+ Yeux globuleux
+ </string>
+ <string name="Face Shear">
+ Visage
+ </string>
+ <string name="Facial Definition">
+ Définition
+ </string>
+ <string name="Far Set Eyes">
+ Yeux écartés
+ </string>
+ <string name="Fat Lips">
+ Lèvres épaisses
+ </string>
+ <string name="Female">
+ Femme
+ </string>
+ <string name="Fingerless">
+ Sans doigts
+ </string>
+ <string name="Fingers">
+ Doigts
+ </string>
+ <string name="Flared Cuffs">
+ Jambes larges
+ </string>
+ <string name="Flat">
+ Moins
+ </string>
+ <string name="Flat Butt">
+ Fesses plates
+ </string>
+ <string name="Flat Head">
+ Tête plate
+ </string>
+ <string name="Flat Toe">
+ Orteil plat
+ </string>
+ <string name="Foot Size">
+ Pointure
+ </string>
+ <string name="Forehead Angle">
+ Angle du front
+ </string>
+ <string name="Forehead Heavy">
+ Front lourd
+ </string>
+ <string name="Freckles">
+ Tâches de rousseur
+ </string>
+ <string name="Front Fringe">
+ Mèches de devant
+ </string>
+ <string name="Full Back">
+ Arrière touffu
+ </string>
+ <string name="Full Eyeliner">
+ Eyeliner marqué
+ </string>
+ <string name="Full Front">
+ Devant touffu
+ </string>
+ <string name="Full Hair Sides">
+ Côtés touffus
+ </string>
+ <string name="Full Sides">
+ Côtés touffus
+ </string>
+ <string name="Glossy">
+ Brillant
+ </string>
+ <string name="Glove Fingers">
+ Doigts avec gants
+ </string>
+ <string name="Glove Length">
+ Longueur des gants
+ </string>
+ <string name="Hair">
+ Cheveux
+ </string>
+ <string name="Hair Back">
+ Cheveux : Derrière
+ </string>
+ <string name="Hair Front">
+ Cheveux : Devant
+ </string>
+ <string name="Hair Sides">
+ Cheveux : Côtés
+ </string>
+ <string name="Hair Sweep">
+ Sens de la coiffure
+ </string>
+ <string name="Hair Thickess">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Thickness">
+ Épaisseur cheveux
+ </string>
+ <string name="Hair Tilt">
+ Inclinaison
+ </string>
+ <string name="Hair Tilted Left">
+ Vers la gauche
+ </string>
+ <string name="Hair Tilted Right">
+ Vers la droite
+ </string>
+ <string name="Hair Volume">
+ Cheveux : Volume
+ </string>
+ <string name="Hand Size">
+ Taille de la main
+ </string>
+ <string name="Handlebars">
+ Plus
+ </string>
+ <string name="Head Length">
+ Longueur
+ </string>
+ <string name="Head Shape">
+ Forme
+ </string>
+ <string name="Head Size">
+ Taille
+ </string>
+ <string name="Head Stretch">
+ Allongement
+ </string>
+ <string name="Heel Height">
+ Talons
+ </string>
+ <string name="Heel Shape">
+ Forme des talons
+ </string>
+ <string name="Height">
+ Taille
+ </string>
+ <string name="High">
+ Haut
+ </string>
+ <string name="High Heels">
+ Talons hauts
+ </string>
+ <string name="High Jaw">
+ Haut
+ </string>
+ <string name="High Platforms">
+ Haute
+ </string>
+ <string name="High and Tight">
+ Haut et serré
+ </string>
+ <string name="Higher">
+ Plus élevé
+ </string>
+ <string name="Hip Length">
+ Longueur hanche
+ </string>
+ <string name="Hip Width">
+ Largeur hanche
+ </string>
+ <string name="In">
+ Rentré
+ </string>
+ <string name="In Shdw Color">
+ Couleur ombre interne
+ </string>
+ <string name="In Shdw Opacity">
+ Opacité ombre interne
+ </string>
+ <string name="Inner Eye Corner">
+ Coin interne
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombre de l&apos;œil interne
+ </string>
+ <string name="Inner Shadow">
+ Ombre interne
+ </string>
+ <string name="Jacket Length">
+ Longueur de la veste
+ </string>
+ <string name="Jacket Wrinkles">
+ Plis de la veste
+ </string>
+ <string name="Jaw Angle">
+ Angle mâchoire
+ </string>
+ <string name="Jaw Jut">
+ Saillie de la mâchoire
+ </string>
+ <string name="Jaw Shape">
+ Mâchoire
+ </string>
+ <string name="Join">
+ Rapprochés
+ </string>
+ <string name="Jowls">
+ Bajoues
+ </string>
+ <string name="Knee Angle">
+ Angle du genou
+ </string>
+ <string name="Knock Kneed">
+ Genoux rapprochés
+ </string>
+ <string name="Large">
+ Plus
+ </string>
+ <string name="Large Hands">
+ Grandes mains
+ </string>
+ <string name="Left Part">
+ Raie à gauche
+ </string>
+ <string name="Leg Length">
+ Longueur
+ </string>
+ <string name="Leg Muscles">
+ Muscles
+ </string>
+ <string name="Less">
+ Moins
+ </string>
+ <string name="Less Body Fat">
+ Moins
+ </string>
+ <string name="Less Curtains">
+ Moins
+ </string>
+ <string name="Less Freckles">
+ Moins
+ </string>
+ <string name="Less Full">
+ Moins
+ </string>
+ <string name="Less Gravity">
+ Moins
+ </string>
+ <string name="Less Love">
+ Moins
+ </string>
+ <string name="Less Muscles">
+ Moins
+ </string>
+ <string name="Less Muscular">
+ Moins
+ </string>
+ <string name="Less Rosy">
+ Moins
+ </string>
+ <string name="Less Round">
+ Moins ronde
+ </string>
+ <string name="Less Saddle">
+ Moins
+ </string>
+ <string name="Less Square">
+ Moins carrée
+ </string>
+ <string name="Less Volume">
+ Moins
+ </string>
+ <string name="Less soul">
+ Moins
+ </string>
+ <string name="Lighter">
+ Plus léger
+ </string>
+ <string name="Lip Cleft">
+ Fente labiale
+ </string>
+ <string name="Lip Cleft Depth">
+ Fente labiale
+ </string>
+ <string name="Lip Fullness">
+ Volume des lèvres
+ </string>
+ <string name="Lip Pinkness">
+ Rougeur des lèvres
+ </string>
+ <string name="Lip Ratio">
+ Proportion des lèvres
+ </string>
+ <string name="Lip Thickness">
+ Épaisseur
+ </string>
+ <string name="Lip Width">
+ Largeur
+ </string>
+ <string name="Lipgloss">
+ Brillant à lèvres
+ </string>
+ <string name="Lipstick">
+ Rouge à lèvres
+ </string>
+ <string name="Lipstick Color">
+ Couleur du rouge à lèvres
+ </string>
+ <string name="Long">
+ Plus
+ </string>
+ <string name="Long Head">
+ Tête longue
+ </string>
+ <string name="Long Hips">
+ Hanches longues
+ </string>
+ <string name="Long Legs">
+ Jambes longues
+ </string>
+ <string name="Long Neck">
+ Long cou
+ </string>
+ <string name="Long Pigtails">
+ Longues couettes
+ </string>
+ <string name="Long Ponytail">
+ Longue queue de cheval
+ </string>
+ <string name="Long Torso">
+ Torse long
+ </string>
+ <string name="Long arms">
+ Bras longs
+ </string>
+ <string name="Loose Pants">
+ Pantalons amples
+ </string>
+ <string name="Loose Shirt">
+ Chemise ample
+ </string>
+ <string name="Loose Sleeves">
+ Manches amples
+ </string>
+ <string name="Love Handles">
+ Poignées d&apos;amour
+ </string>
+ <string name="Low">
+ Bas
+ </string>
+ <string name="Low Heels">
+ Talons bas
+ </string>
+ <string name="Low Jaw">
+ Bas
+ </string>
+ <string name="Low Platforms">
+ Basse
+ </string>
+ <string name="Low and Loose">
+ Bas et ample
+ </string>
+ <string name="Lower">
+ Abaisser
+ </string>
+ <string name="Lower Bridge">
+ Arête plus basse
+ </string>
+ <string name="Lower Cheeks">
+ Joue inférieure
+ </string>
+ <string name="Male">
+ Homme
+ </string>
+ <string name="Middle Part">
+ Raie au milieu
+ </string>
+ <string name="More">
+ Plus
+ </string>
+ <string name="More Blush">
+ Plus
+ </string>
+ <string name="More Body Fat">
+ Plus
+ </string>
+ <string name="More Curtains">
+ Plus
+ </string>
+ <string name="More Eyeshadow">
+ Plus
+ </string>
+ <string name="More Freckles">
+ Plus
+ </string>
+ <string name="More Full">
+ Plus
+ </string>
+ <string name="More Gravity">
+ Plus
+ </string>
+ <string name="More Lipstick">
+ Plus
+ </string>
+ <string name="More Love">
+ Plus
+ </string>
+ <string name="More Lower Lip">
+ Inférieure plus grosse
+ </string>
+ <string name="More Muscles">
+ Plus
+ </string>
+ <string name="More Muscular">
+ Plus
+ </string>
+ <string name="More Rosy">
+ Plus
+ </string>
+ <string name="More Round">
+ Plus
+ </string>
+ <string name="More Saddle">
+ Plus
+ </string>
+ <string name="More Sloped">
+ Plus
+ </string>
+ <string name="More Square">
+ Plus
+ </string>
+ <string name="More Upper Lip">
+ Supérieure plus grosse
+ </string>
+ <string name="More Vertical">
+ Plus
+ </string>
+ <string name="More Volume">
+ Plus
+ </string>
+ <string name="More soul">
+ Plus
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Coin de la bouche
+ </string>
+ <string name="Mouth Position">
+ Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Musclé
+ </string>
+ <string name="Mutton Chops">
+ Longs
+ </string>
+ <string name="Nail Polish">
+ Vernis à ongles
+ </string>
+ <string name="Nail Polish Color">
+ Couleur du vernis
+ </string>
+ <string name="Narrow">
+ Moins
+ </string>
+ <string name="Narrow Back">
+ Arrière étroit
+ </string>
+ <string name="Narrow Front">
+ Devant étroit
+ </string>
+ <string name="Narrow Lips">
+ Lèvres étroites
+ </string>
+ <string name="Natural">
+ Naturel
+ </string>
+ <string name="Neck Length">
+ Longueur du cou
+ </string>
+ <string name="Neck Thickness">
+ Épaisseur du cou
+ </string>
+ <string name="No Blush">
+ Pas de blush
+ </string>
+ <string name="No Eyeliner">
+ Pas d&apos;eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Pas d&apos;ombre à paupières
+ </string>
+ <string name="No Lipgloss">
+ Pas de brillant à lèvres
+ </string>
+ <string name="No Lipstick">
+ Pas de rouge à lèvres
+ </string>
+ <string name="No Part">
+ Pas de raie
+ </string>
+ <string name="No Polish">
+ Pas de vernis
+ </string>
+ <string name="No Red">
+ Pas de rouge
+ </string>
+ <string name="No Spikes">
+ Pas de spikes
+ </string>
+ <string name="No White">
+ Pas de blanc
+ </string>
+ <string name="No Wrinkles">
+ Pas de rides
+ </string>
+ <string name="Normal Lower">
+ Normal plus bas
+ </string>
+ <string name="Normal Upper">
+ Normal plus haut
+ </string>
+ <string name="Nose Left">
+ Nez à gauche
+ </string>
+ <string name="Nose Right">
+ Nez à droite
+ </string>
+ <string name="Nose Size">
+ Taille du nez
+ </string>
+ <string name="Nose Thickness">
+ Épaisseur du nez
+ </string>
+ <string name="Nose Tip Angle">
+ Bout du nez
+ </string>
+ <string name="Nose Tip Shape">
+ Bout du nez
+ </string>
+ <string name="Nose Width">
+ Largeur du nez
+ </string>
+ <string name="Nostril Division">
+ Division des narines
+ </string>
+ <string name="Nostril Width">
+ Largeur des narines
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Ouvert
+ </string>
+ <string name="Open Back">
+ Derrière ouvert
+ </string>
+ <string name="Open Front">
+ Devant ouvert
+ </string>
+ <string name="Open Left">
+ Ouvert à gauche
+ </string>
+ <string name="Open Right">
+ Ouvert à droite
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Sorti
+ </string>
+ <string name="Out Shdw Color">
+ Couleur de l&apos;ombre externe
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacité de l&apos;ombre externe
+ </string>
+ <string name="Outer Eye Corner">
+ Coin externe
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombre de l&apos;œil externe
+ </string>
+ <string name="Outer Shadow">
+ Ombre externe
+ </string>
+ <string name="Overbite">
+ Rentrée
+ </string>
+ <string name="Package">
+ Parties
+ </string>
+ <string name="Painted Nails">
+ Ongles vernis
+ </string>
+ <string name="Pale">
+ Pâle
+ </string>
+ <string name="Pants Crotch">
+ Entrejambe
+ </string>
+ <string name="Pants Fit">
+ Taille
+ </string>
+ <string name="Pants Length">
+ Longueur
+ </string>
+ <string name="Pants Waist">
+ Taille
+ </string>
+ <string name="Pants Wrinkles">
+ Plis
+ </string>
+ <string name="Part">
+ Raie
+ </string>
+ <string name="Part Bangs">
+ Séparation frange
+ </string>
+ <string name="Pectorals">
+ Pectoraux
+ </string>
+ <string name="Pigment">
+ Pigmentation
+ </string>
+ <string name="Pigtails">
+ Couettes
+ </string>
+ <string name="Pink">
+ Rose
+ </string>
+ <string name="Pinker">
+ Plus rose
+ </string>
+ <string name="Platform Height">
+ Plateforme (hauteur)
+ </string>
+ <string name="Platform Width">
+ Plateforme (largeur)
+ </string>
+ <string name="Pointy">
+ Pointue
+ </string>
+ <string name="Pointy Heels">
+ Talons pointus
+ </string>
+ <string name="Ponytail">
+ Queue de cheval
+ </string>
+ <string name="Poofy Skirt">
+ Jupe bouffante
+ </string>
+ <string name="Pop Left Eye">
+ Å’il gauche saillant
+ </string>
+ <string name="Pop Right Eye">
+ Å’il droit saillant
+ </string>
+ <string name="Puffy">
+ Plus
+ </string>
+ <string name="Puffy Eyelids">
+ Cernes
+ </string>
+ <string name="Rainbow Color">
+ Couleur arc en ciel
+ </string>
+ <string name="Red Hair">
+ Cheveux roux
+ </string>
+ <string name="Regular">
+ Standard
+ </string>
+ <string name="Right Part">
+ Raie à droite
+ </string>
+ <string name="Rosy Complexion">
+ Teint rosé
+ </string>
+ <string name="Round">
+ Rond
+ </string>
+ <string name="Ruddiness">
+ Rougeur
+ </string>
+ <string name="Ruddy">
+ Rouge
+ </string>
+ <string name="Rumpled Hair">
+ Texture
+ </string>
+ <string name="Saddle Bags">
+ Culotte de cheval
+ </string>
+ <string name="Scrawny Leg">
+ Jambes maigres
+ </string>
+ <string name="Separate">
+ Séparés
+ </string>
+ <string name="Shallow">
+ Creux
+ </string>
+ <string name="Shear Back">
+ Coupe derrière
+ </string>
+ <string name="Shear Face">
+ Visage
+ </string>
+ <string name="Shear Front">
+ Front
+ </string>
+ <string name="Shear Left Up">
+ Haut gauche décalé
+ </string>
+ <string name="Shear Right Up">
+ Haut droit décalé
+ </string>
+ <string name="Sheared Back">
+ Dégagé derrière
+ </string>
+ <string name="Sheared Front">
+ Dégagé devant
+ </string>
+ <string name="Shift Left">
+ Vers la gauche
+ </string>
+ <string name="Shift Mouth">
+ Déplacer la bouche
+ </string>
+ <string name="Shift Right">
+ Vers la droite
+ </string>
+ <string name="Shirt Bottom">
+ Chemise
+ </string>
+ <string name="Shirt Fit">
+ Taille
+ </string>
+ <string name="Shirt Wrinkles">
+ Plis
+ </string>
+ <string name="Shoe Height">
+ Hauteur
+ </string>
+ <string name="Short">
+ Moins
+ </string>
+ <string name="Short Arms">
+ Bras courts
+ </string>
+ <string name="Short Legs">
+ Jambes courtes
+ </string>
+ <string name="Short Neck">
+ Petit cou
+ </string>
+ <string name="Short Pigtails">
+ Couettes courtes
+ </string>
+ <string name="Short Ponytail">
+ Queue de cheval courte
+ </string>
+ <string name="Short Sideburns">
+ Court
+ </string>
+ <string name="Short Torso">
+ Torse court
+ </string>
+ <string name="Short hips">
+ Hanches courtes
+ </string>
+ <string name="Shoulders">
+ Épaules
+ </string>
+ <string name="Side Fringe">
+ Mèches sur le côté
+ </string>
+ <string name="Sideburns">
+ Favoris
+ </string>
+ <string name="Sides Hair">
+ Cheveux sur le côté
+ </string>
+ <string name="Sides Hair Down">
+ Cheveux sur le côté en bas
+ </string>
+ <string name="Sides Hair Up">
+ Cheveux sur le côté en haut
+ </string>
+ <string name="Skinny Neck">
+ Cou maigre
+ </string>
+ <string name="Skirt Fit">
+ Taille jupe
+ </string>
+ <string name="Skirt Length">
+ Longueur jupe
+ </string>
+ <string name="Slanted Forehead">
+ Front incliné
+ </string>
+ <string name="Sleeve Length">
+ Longueur manche
+ </string>
+ <string name="Sleeve Looseness">
+ Ampleur manche
+ </string>
+ <string name="Slit Back">
+ Fente : Derrière
+ </string>
+ <string name="Slit Front">
+ Fente : Devant
+ </string>
+ <string name="Slit Left">
+ Fente : Gauche
+ </string>
+ <string name="Slit Right">
+ Fente : Droite
+ </string>
+ <string name="Small">
+ Moins
+ </string>
+ <string name="Small Hands">
+ Petites mains
+ </string>
+ <string name="Small Head">
+ Moins
+ </string>
+ <string name="Smooth">
+ Moins
+ </string>
+ <string name="Smooth Hair">
+ Cheveux lisses
+ </string>
+ <string name="Socks Length">
+ Longueur des chaussettes
+ </string>
+ <string name="Soulpatch">
+ Barbichette
+ </string>
+ <string name="Sparse">
+ Rares
+ </string>
+ <string name="Spiked Hair">
+ Mèches en pointe
+ </string>
+ <string name="Square">
+ Carrée
+ </string>
+ <string name="Square Toe">
+ Orteil carré
+ </string>
+ <string name="Squash Head">
+ Écraser la tête
+ </string>
+ <string name="Stretch Head">
+ Allonger la tête
+ </string>
+ <string name="Sunken">
+ Saillante
+ </string>
+ <string name="Sunken Chest">
+ Poitrine enfoncée
+ </string>
+ <string name="Sunken Eyes">
+ Yeux enfoncés
+ </string>
+ <string name="Sweep Back">
+ En arrière
+ </string>
+ <string name="Sweep Forward">
+ Vers l&apos;avant
+ </string>
+ <string name="Tall">
+ Plus
+ </string>
+ <string name="Taper Back">
+ Arrière
+ </string>
+ <string name="Taper Front">
+ Avant
+ </string>
+ <string name="Thick Heels">
+ Talons épais
+ </string>
+ <string name="Thick Neck">
+ Cou épais
+ </string>
+ <string name="Thick Toe">
+ Orteil épais
+ </string>
+ <string name="Thin">
+ Mince
+ </string>
+ <string name="Thin Eyebrows">
+ Sourcils fins
+ </string>
+ <string name="Thin Lips">
+ Lèvres fines
+ </string>
+ <string name="Thin Nose">
+ Nez fin
+ </string>
+ <string name="Tight Chin">
+ Menton fin
+ </string>
+ <string name="Tight Cuffs">
+ Jambes serrées
+ </string>
+ <string name="Tight Pants">
+ Pantalons serrés
+ </string>
+ <string name="Tight Shirt">
+ Chemise serrée
+ </string>
+ <string name="Tight Skirt">
+ Jupe serrée
+ </string>
+ <string name="Tight Sleeves">
+ Manches serrées
+ </string>
+ <string name="Toe Shape">
+ Forme de l&apos;orteil
+ </string>
+ <string name="Toe Thickness">
+ Épaisseur de l&apos;orteil
+ </string>
+ <string name="Torso Length">
+ Longueur du torse
+ </string>
+ <string name="Torso Muscles">
+ Muscles du torse
+ </string>
+ <string name="Torso Scrawny">
+ Torse maigre
+ </string>
+ <string name="Unattached">
+ Séparés
+ </string>
+ <string name="Uncreased">
+ Lisse
+ </string>
+ <string name="Underbite">
+ Sortie
+ </string>
+ <string name="Unnatural">
+ Artificiel
+ </string>
+ <string name="Upper Bridge">
+ Arête supérieure
+ </string>
+ <string name="Upper Cheeks">
+ Pommette
+ </string>
+ <string name="Upper Chin Cleft">
+ Menton supérieur
+ </string>
+ <string name="Upper Eyelid Fold">
+ Paupière sup.
+ </string>
+ <string name="Upturned">
+ En trompette
+ </string>
+ <string name="Very Red">
+ Très rouge
+ </string>
+ <string name="Waist Height">
+ Hauteur taille
+ </string>
+ <string name="Well-Fed">
+ Ronde
+ </string>
+ <string name="White Hair">
+ Cheveux blancs
+ </string>
+ <string name="Wide">
+ Plus
+ </string>
+ <string name="Wide Back">
+ Derrière large
+ </string>
+ <string name="Wide Front">
+ Devant large
+ </string>
+ <string name="Wide Lips">
+ Lèvres larges
+ </string>
+ <string name="Wild">
+ Artificiel
+ </string>
+ <string name="Wrinkles">
+ Rides
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Ajouter à mes repères
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifier mon repère
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ En savoir plus sur l&apos;emplacement actuel
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historique de mes emplacements
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Acheter ce terrain
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Chat vocal indisponible ici
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Vol interdit
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Pas de bousculades
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Construction/placement d&apos;objets interdit
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Scripts interdits
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Santé
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] - Mise à jour
+ </string>
+ <string name="UpdaterNowUpdating">
+ Mise à jour de [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installation de [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Le client [APP_NAME] est en train d&apos;être mis à jour. Cela peut prendre un certain temps, merci de votre patience.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Mise à jour en cours...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Mise à jour en cours
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Le téléchargement de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ L&apos;installation de la mise à jour a échoué
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Impossible de lancer le client
+ </string>
+ <string name="IM_logging_string">
+ -- Archivage des IM activé --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] est en train d&apos;écrire...
+ </string>
+ <string name="Unnamed">
+ (sans nom)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Modéré : Voix désactivées par défaut)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Le chat écrit n&apos;est pas disponible pour cet appel.
+ </string>
+ <string name="IM_muted_text_label">
+ Votre chat écrit a été désactivé par un modérateur de groupe.
+ </string>
+ <string name="IM_default_text_label">
+ Cliquez ici pour envoyer un message instantané.
+ </string>
+ <string name="IM_to_label">
+ À
+ </string>
+ <string name="IM_moderator_label">
+ (Modérateur)
+ </string>
+ <string name="started_call">
+ A appelé quelqu&apos;un
+ </string>
+ <string name="joined_call">
+ A rejoint l&apos;appel
+ </string>
+ <string name="ringing-im">
+ En train de rejoindre l&apos;appel...
+ </string>
+ <string name="connected-im">
+ Connecté(e), cliquez sur Quitter l&apos;appel pour raccrocher
+ </string>
+ <string name="hang_up-im">
+ A quitté l&apos;appel
+ </string>
+ <string name="answering-im">
+ Connexion en cours...
+ </string>
+ <string name="conference-title">
+ Conférence ad-hoc
+ </string>
+ <string name="inventory_item_offered-im">
+ Objet de l&apos;inventaire offert
+ </string>
+ <string name="share_alert">
+ Faire glisser les objets de l&apos;inventaire ici
+ </string>
+ <string name="only_user_message">
Vous êtes le seul participant à cette session.
- </text>
- <text name="offline_message">
+ </string>
+ <string name="offline_message">
[FIRST] [LAST] est déconnecté(e).
- </text>
+ </string>
<string name="invite_message">
Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].
</string>
+ <string name="muted_message">
+ Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré.
+ </string>
+ <string name="generic">
+ Erreur lors de la requête, veuillez réessayer ultérieurement.
+ </string>
<string name="generic_request_error">
Erreur lors de la requête, veuillez réessayer ultérieurement.
</string>
@@ -610,46 +3333,37 @@
<string name="not_a_mod_error">
Vous n&apos;êtes pas modérateur de session.
</string>
+ <string name="muted">
+ Un modérateur de groupe a désactivé votre chat écrit.
+ </string>
<string name="muted_error">
Un modérateur de groupe a désactivé votre chat écrit.
</string>
<string name="add_session_event">
Impossible d&apos;ajouter des participants à la session de chat avec [RECIPIENT].
</string>
+ <string name="message">
+ Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
+ </string>
<string name="message_session_event">
Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
</string>
+ <string name="mute">
+ Erreur lors de la modération.
+ </string>
+ <string name="removed">
+ Vous avez été supprimé du groupe.
+ </string>
<string name="removed_from_group">
Vous avez été supprimé du groupe.
</string>
<string name="close_on_no_ability">
Vous ne pouvez plus participer à la session de chat.
</string>
- <string name="AcctTypeResident">
- Résident
- </string>
- <string name="AcctTypeTrial">
- Essai
- </string>
- <string name="AcctTypeCharterMember">
- Membre originaire
- </string>
- <string name="AcctTypeEmployee">
- Employé(e) de Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Infos de paiement utilisées
- </string>
- <string name="PaymentInfoOnFile">
- Infos de paiement enregistrées
- </string>
- <string name="NoPaymentInfoOnFile">
- Aucune info de paiement
- </string>
- <string name="AgeVerified">
- Âge vérifié
- </string>
- <string name="NotAgeVerified">
- Âge non vérifié
- </string>
+ <string name="unread_chat_single">
+ [SOURCES] a dit quelque chose de nouveau
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ont dit quelque chose de nouveau
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 810a32f64e..b76ae370fd 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages name="">
<message_set name="errors">
<message name="invalid_tport">
- Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à la page suivante :
-www.secondlife.com/support
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à la page suivante :
-www.secondlife.com/support
+ Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index 2c91375930..a2fcaa63f6 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -1,20 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="Informazioni su [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life è offerto da Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Fatto con [COMPILER] versione [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Tu sei in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] a [REGION] ospitata da [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memoria: [MEMORY_MB] MB
+Versione Sistema Operativo: [OS_VERSION]
+Venditore Scheda Grafica: [GRAPHICS_CARD_VENDOR]
+Scheda Grafica: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Versione Driver Scheda Grafica: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Versione OpenGL: [OPENGL_VERSION]
+
+Versione libcurl: [LIBCURL_VERSION]
+Versione J2C Decoder: [J2C_VERSION]
+Versione Audio Driver: [AUDIO_DRIVER_VERSION]
+Versione Qt Webkit: [QT_WEBKIT_VERSION]
+Versione Vivox: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (nessuno)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Pacchetti Perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Informazioni" name="support_panel">
+ <button label="Copia negli appunti" name="copy_btn"/>
+ </panel>
+ <panel label="Ringraziamenti" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life è offerto da Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
Per avere successo nel business, sii coraggioso, sii il primo, sii differente. --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licenze" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -35,10 +75,7 @@
Tutti i diritti riservati. Leggi licenses.txt per maggiori dettagli.
Chat vocale Codifica audio: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Sei a [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index ede581c5ed..4c82475a6f 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -1,7 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Informazioni sul terreno">
+<floater name="floaterland" title="INFO SUL TERRENO">
+ <floater.string name="Minutes">
+ [MINUTES] minuti
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] secondi
+ </floater.string>
+ <floater.string name="Remaining">
+ restante
+ </floater.string>
<tab_container name="landtab">
- <panel label="Generale" name="land_general_panel">
+ <panel label="GENERALE" name="land_general_panel">
+ <panel.string name="new users only">
+ Solo ai nuovi residenti
+ </panel.string>
+ <panel.string name="anyone">
+ A chiunque
+ </panel.string>
+ <panel.string name="area_text">
+ Area
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Asta n.: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Devi confermare l&apos;acquisto prima di poter modificare il terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Posseduta dal gruppo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profilo...
+ </panel.string>
+ <panel.string name="info_text">
+ Info...
+ </panel.string>
+ <panel.string name="public_text">
+ (pubblica)
+ </panel.string>
+ <panel.string name="none_text">
+ (nessuno)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (vendita in corso)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Nessun appezzamento selezionato.
+Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezzamento per vederne i dettagli.
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -11,123 +63,93 @@
<text name="LandType">
Tipo:
</text>
- <text name="LandTypeText" left="119">
+ <text left="119" name="LandTypeText">
Mainland / Homestead
</text>
<text name="ContentRating" width="115">
Categoria di accesso:
</text>
- <text name="ContentRatingText" left="119">
+ <text left="119" name="ContentRatingText">
Adult
</text>
<text name="Owner:">
Proprietario:
</text>
- <text name="OwnerText" left="119" width="227">
+ <text left="119" name="OwnerText" width="227">
Leyla Linden
</text>
- <button label="Profilo..." label_selected="Profilo..." name="Profile..."/>
<text name="Group:">
Gruppo:
</text>
- <text left="119" name="GroupText" width="227" />
+ <text left="119" name="GroupText" width="227"/>
<button label="Imposta..." label_selected="Imposta..." name="Set..."/>
- <check_box left="119" label="Permetti cessione al gruppo" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
+ <check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
<button label="Cedi..." label_selected="Cedi..." name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/>
- <check_box left="119" label="Il proprietario fa un contributo con la cessione" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
+ <check_box label="Il proprietario fa un contributo con la cessione" left="119" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
<text name="For Sale:">
In vendita:
</text>
- <text name="Not for sale." left="119">
+ <text left="119" name="Not for sale.">
Non in vendita.
</text>
- <text name="For Sale: Price L$[PRICE]." left="119">
+ <text left="119" name="For Sale: Price L$[PRICE].">
Prezzo: [PRICE]L$ ([PRICE_PER_SQM]L$/m²).
</text>
- <text name="SalePending" left="119" width="321"/>
+ <text left="119" name="SalePending" width="321"/>
<button bottom="-242" label="Vendi la terra..." label_selected="Vendi la terra..." name="Sell Land..."/>
- <text name="For sale to" left="119">
+ <text left="119" name="For sale to">
In vendita a: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="240" left="119">
+ <text left="119" name="Sell with landowners objects in parcel." width="240">
Gli oggetti sono inclusi nella vendita.
</text>
- <text name="Selling with no objects in parcel." width="240" left="119">
+ <text left="119" name="Selling with no objects in parcel." width="240">
Gli oggetti non sono inclusi nella vendita.
</text>
- <button bottom="-242" font="SansSerifSmall" left="275" width="165" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" name="Cancel Land Sale"/>
+ <button bottom="-242" font="SansSerifSmall" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" left="275" name="Cancel Land Sale" width="165"/>
<text name="Claimed:" width="115">
Presa in possesso il:
</text>
- <text name="DateClaimText" left="119">
+ <text left="119" name="DateClaimText">
Tue Aug 15 13:47:25 2006
</text>
<text name="PriceLabel">
Area:
</text>
- <text name="PriceText" left="119" width="140">
+ <text left="119" name="PriceText" width="140">
4048 m²
</text>
<text name="Traffic:">
Traffico:
</text>
- <text name="DwellText" left="119" width="140">
+ <text left="119" name="DwellText" width="140">
0
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
<button label="Acquista per il gruppo..." label_selected="Acquista per il gruppo..." name="Buy For Group..."/>
- <button label="Compra pass..." label_selected="Compra pass..." left="130" width="125" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio."/>
+ <button label="Compra pass..." label_selected="Compra pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/>
<button label="Abbandona la terra..." label_selected="Abbandona la terra..." name="Abandon Land..."/>
<button label="Reclama la terra..." label_selected="Reclama la terra..." name="Reclaim Land..."/>
<button label="Vendita Linden..." label_selected="Vendita Linden..." name="Linden Sale..." tool_tip="La terra deve essere posseduta, con contenuto impostato, e non già messa in asta."/>
- <panel.string name="new users only">
- Solo ai nuovi residenti
- </panel.string>
- <panel.string name="anyone">
- A chiunque
- </panel.string>
- <panel.string name="area_text">
- Area
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Asta n.: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Devi confermare l&apos;acquisto prima di poter modificare il terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Posseduta dal gruppo)
- </panel.string>
- <panel.string name="profile_text">
- Profilo...
- </panel.string>
- <panel.string name="info_text">
- Info...
- </panel.string>
- <panel.string name="public_text">
- (pubblica)
+ </panel>
+ <panel label="COVENANT" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ La terra acquistata in questa regione può essere rivenduta.
</panel.string>
- <panel.string name="none_text">
- (nessuno)
+ <panel.string name="can_not_resell">
+ La terra acquistata in questa regione non può essere rivenduta.
</panel.string>
- <panel.string name="sale_pending_text">
- (vendita in corso)
+ <panel.string name="can_change">
+ La terra acquistata in questa regione può essere unita
+o suddivisa.
</panel.string>
- <panel.string name="no_selection_text">
- Nessun appezzamento selezionato.
-Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezzamento per vederne i dettagli.
+ <panel.string name="can_not_change">
+ La terra acquistata in questa regione non può essere unita
+o suddivisa.
</panel.string>
- </panel>
- <panel label="Regolamento" name="land_covenant_panel">
<text name="estate_section_lbl">
Proprietà:
</text>
- <text name="estate_name_lbl">
- Nome:
- </text>
<text name="estate_name_text">
Continente
</text>
@@ -146,131 +168,144 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
<text name="region_section_lbl">
Regione:
</text>
- <text name="region_name_lbl">
- Nome:
- </text>
- <text name="region_name_text" left="125">
+ <text left="125" name="region_name_text">
leyla
</text>
<text name="region_landtype_lbl">
Tipo:
</text>
- <text name="region_landtype_text" left="125">
+ <text left="125" name="region_landtype_text">
Mainland / Homestead
</text>
<text name="region_maturity_lbl" width="115">
Categoria di accesso:
</text>
- <text name="region_maturity_text" left="125">
+ <text left="125" name="region_maturity_text">
Adult
</text>
<text name="resellable_lbl">
Rivendita:
</text>
- <text name="resellable_clause" left="125">
+ <text left="125" name="resellable_clause">
La terra in questa regione non può essere rivenduta.
</text>
<text name="changeable_lbl">
Suddividi:
</text>
- <text name="changeable_clause" left="125">
+ <text left="125" name="changeable_clause">
La terra in questa regione non può essere unita/suddivisa.
</text>
- <panel.string name="can_resell">
- La terra acquistata in questa regione può essere rivenduta.
- </panel.string>
- <panel.string name="can_not_resell">
- La terra acquistata in questa regione non può essere rivenduta.
- </panel.string>
- <panel.string name="can_change">
- La terra acquistata in questa regione può essere unita
-o suddivisa.
+ </panel>
+ <panel label="OBJECTS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] dei [MAX] ([AVAILABLE] disponibili)
</panel.string>
- <panel.string name="can_not_change">
- La terra acquistata in questa regione non può essere unita
-o suddivisa.
+ <panel.string name="objects_deleted_text">
+ [COUNT] dei [MAX] ([DELETED] saranno cancellati)
</panel.string>
- </panel>
- <panel label="Oggetti" name="land_objects_panel">
<text name="parcel_object_bonus">
Fattore bonus degli oggetti della regione: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Oggetti presenti sul simulatore:
+ Uso dei Primative :
</text>
- <text name="objects_available" left="214" width="230" >
+ <text left="214" name="objects_available" width="230">
[COUNT] dei [MAX] ([AVAILABLE] dsponibili)
</text>
- <panel.string name="objects_available_text">
- [COUNT] dei [MAX] ([AVAILABLE] disponibili)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] dei [MAX] ([DELETED] saranno cancellati)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
Oggetti che il terreno supporta:
</text>
- <text name="object_contrib_text" left="214" width="152">
+ <text left="214" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
Oggetti sul terreno:
</text>
- <text name="total_objects_text" left="214" width="48">
+ <text left="214" name="total_objects_text" width="48">
[COUNT]
</text>
- <text name="Owned by parcel owner:" left="14" width="180" >
+ <text left="14" name="Owned by parcel owner:" width="180">
Posseduti dal proprietario:
</text>
- <text name="owner_objects_text" left="214" width="48">
+ <text left="214" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowOwner" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOwner..." tool_tip="Restituisci gli oggetti ai loro proprietari." right="-10" width="119"/>
- <text name="Set to group:" left="14" width="180">
+ <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <text left="14" name="Set to group:" width="180">
Imposta al gruppo:
</text>
- <text name="group_objects_text" left="214" width="48">
+ <text left="214" name="group_objects_text" width="48">
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowGroup" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnGroup..." tool_tip="Restituisci gli oggetti ai loro proprietari." right="-10" width="119"/>
- <text name="Owned by others:" left="14" width="180">
+ <button label="Restituisci..." label_selected="Restituisci..." name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <text left="14" name="Owned by others:" width="180">
Posseduti da altri:
</text>
- <text name="other_objects_text" left="214" width="48">
+ <text left="214" name="other_objects_text" width="48">
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowOther" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOther..." tool_tip="Restituisci gli oggetti ai loro proprietari." right="-10" width="119"/>
- <text name="Selected / sat upon:" left="14" width="193">
+ <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <text left="14" name="Selected / sat upon:" width="193">
Selezionati / sui quali sei sopra:
</text>
- <text name="selected_objects_text" left="214" width="48">
+ <text left="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text name="Autoreturn" left="4" width="412">
+ <text left="4" name="Autoreturn" width="412">
Autorestituisci gli oggetti degli altri residenti (minuti, 0 per disabilitata):
</text>
- <line_editor name="clean other time" right="-20" />
+ <line_editor name="clean other time" right="-20"/>
<text name="Object Owners:" width="150">
Proprietari degli oggetti:
</text>
- <button label="Aggiorna Elenco" label_selected="Aggiorna Elenco" name="Refresh List" left="158"/>
- <button label="Restituisci oggetti..." label_selected="Restituisci oggetti..." name="Return objects..." left="270" width="164"/>
+ <button label="Aggiorna Elenco" label_selected="Aggiorna Elenco" left="158" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Restituisci oggetti..." label_selected="Restituisci oggetti..." left="270" name="Return objects..." width="164"/>
<name_list name="owner list">
- <column label="Tipo" name="type"/>
- <column label="Nome" name="name"/>
- <column label="Conta" name="count"/>
- <column label="Più recenti" name="mostrecent"/>
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nome" name="name"/>
+ <name_list.columns label="Conta" name="count"/>
+ <name_list.columns label="Più recenti" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opzioni" name="land_options_panel">
+ <panel label="OPZIONI" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Fai in modo che la gente trovi questo terreno nei risultati della ricerca.
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Questa opzione è disabilitata perchè questo terreno ha un&apos;area di 128 m² o inferiore.
+Solamente terreni più grandi possono essere abilitati nella ricerca.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Questa opzione è disabilitata perchè tu non puoi modificare le opzioni di questo terreno.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Contenuto Mature
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Contenuto Adult
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Il contenuto o le informazioni del tuo terreno sono considerate Mature.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Il contenuto o le informazioni del tuo terreno sono considerate Adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (nessuno)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Nessuna spinta
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Nessuna spinta (Impostazione regionale)
+ </panel.string>
<text name="allow_label">
Permetti agli altri residenti di:
</text>
<check_box label="Modificare il terreno" name="edit land check" tool_tip="Se spuntato, chiunque può terraformare il tuo terreno. E&apos; preferibile lasciare questo quadrato non spuntato, dato che sarai sempre in grado di modificare il tuo terreno."/>
- <check_box label="Creare dei landmark" name="check landmark"/>
<check_box label="Permetti il volo" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
<text name="allow_label2">
Creare oggetti:
@@ -292,85 +327,37 @@ o suddivisa.
</text>
<check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su &apos;sicuro&apos;, disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento a morte."/>
<check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/>
- <check_box label="Mostra il luogo nella ricerca (30 L$/week) sotto" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/>
- <panel.string name="search_enabled_tooltip">
- Fai in modo che la gente trovi questo terreno nei risultati della ricerca.
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Questa opzione è disabilitata perchè questo terreno ha un&apos;area di 128 m² o inferiore.
-Solamente terreni più grandi possono essere abilitati nella ricerca.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Questa opzione è disabilitata perchè tu non puoi modificare le opzioni di questo terreno.
- </panel.string>
- <combo_box name="land category with adult" left="282" width="140">
- <combo_box.item name="item0" label="Tutte le categorie"
- />
- <combo_box.item name="item1" label="Luogo dei Linden"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Arte &amp; Cultura"
- />
- <combo_box.item name="item4" label="Affari"
- />
- <combo_box.item name="item5" label="Educazione"
- />
- <combo_box.item name="item6" label="Gioco"
- />
- <combo_box.item name="item7" label="Divertimento"
- />
- <combo_box.item name="item8" label="Accoglienza nuovi residenti"
- />
- <combo_box.item name="item9" label="Parchi &amp; Natura"
- />
- <combo_box.item name="item10" label="Residenziale"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Altro"
- />
+ <check_box label="Mostra luogo nel Cerca (L$30/settimana)" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/>
+ <combo_box left="282" name="land category with adult" width="140">
+ <combo_box.item label="Tutte le categorie" name="item0"/>
+ <combo_box.item label="Luogo dei Linden" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Arte &amp; Cultura" name="item3"/>
+ <combo_box.item label="Affari" name="item4"/>
+ <combo_box.item label="Educazione" name="item5"/>
+ <combo_box.item label="Gioco" name="item6"/>
+ <combo_box.item label="Divertimento" name="item7"/>
+ <combo_box.item label="Accoglienza nuovi residenti" name="item8"/>
+ <combo_box.item label="Parchi &amp; Natura" name="item9"/>
+ <combo_box.item label="Residenziale" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Altro" name="item12"/>
</combo_box>
- <combo_box name="land category" left="282" width="140">
- <combo_box.item name="item0" label="Tutte le categorie"
- />
- <combo_box.item name="item1" label="Luogo dei Linden"
- />
- <combo_box.item name="item3" label="Arte &amp; Cultura"
- />
- <combo_box.item name="item4" label="Affari"
- />
- <combo_box.item name="item5" label="Educazione"
- />
- <combo_box.item name="item6" label="Gioco"
- />
- <combo_box.item name="item7" label="Divertimento"
- />
- <combo_box.item name="item8" label="Accoglienza nuovi residenti"
- />
- <combo_box.item name="item9" label="Parchi &amp; Natura"
- />
- <combo_box.item name="item10" label="Residenziale"
- />
- <combo_box.item name="item11" label="Shopping"
- />
- <combo_box.item name="item12" label="Altro"
- />
+ <combo_box left="282" name="land category" width="140">
+ <combo_box.item label="Tutte le categorie" name="item0"/>
+ <combo_box.item label="Luogo dei Linden" name="item1"/>
+ <combo_box.item label="Arte &amp; Cultura" name="item3"/>
+ <combo_box.item label="Affari" name="item4"/>
+ <combo_box.item label="Educazione" name="item5"/>
+ <combo_box.item label="Gioco" name="item6"/>
+ <combo_box.item label="Divertimento" name="item7"/>
+ <combo_box.item label="Accoglienza nuovi residenti" name="item8"/>
+ <combo_box.item label="Parchi &amp; Natura" name="item9"/>
+ <combo_box.item label="Residenziale" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Altro" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" name="?" left="427"/>
<check_box label="Contenuto Mature" name="MatureCheck" tool_tip=" "/>
- <panel.string name="mature_check_mature">
- Contenuto Mature
- </panel.string>
- <panel.string name="mature_check_adult">
- Contenuto Adult
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Il contenuto o le informazioni del tuo terreno sono considerate Mature.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Il contenuto o le informazioni del tuo terreno sono considerate Adult.
- </panel.string>
<text name="Snapshot:">
Fotografia:
</text>
@@ -378,39 +365,31 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<text name="landing_point">
Punto di atterraggio: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (nessuno)
- </panel.string>
- <button width="60" label="Imposta" label_selected="Imposta" name="Set" tool_tip="Imposta il punto di atterraggio dove arrivano i visitatori. Impostalo nel punto dove si trova il tuo avatar in questo terreno."/>
- <button width="60" left="301" label="Elimina" label_selected="Elimina" name="Clear" tool_tip="Elimina punto di atterraggio."/>
+ <button label="Imposta" label_selected="Imposta" name="Set" tool_tip="Imposta il punto di atterraggio dove arrivano i visitatori. Impostalo nel punto dove si trova il tuo avatar in questo terreno." width="60"/>
+ <button label="Elimina" label_selected="Elimina" left="301" name="Clear" tool_tip="Elimina punto di atterraggio." width="60"/>
<text name="Teleport Routing: ">
Rotte dei teleport:
</text>
- <combo_box width="140" name="landing type" tool_tip="Rotte dei teleport -- seleziona come vuoi organizzare i teleport nella tua terra.">
- <combo_box.item name="Blocked" label="Bloccati"
- />
- <combo_box.item name="LandingPoint" label="Punto di atterraggio"
- />
- <combo_box.item name="Anywhere" label="Ovunque"
- />
+ <combo_box name="landing type" tool_tip="Rotte dei teleport -- seleziona come vuoi organizzare i teleport nella tua terra." width="140">
+ <combo_box.item label="Bloccati" name="Blocked"/>
+ <combo_box.item label="Punto di atterraggio" name="LandingPoint"/>
+ <combo_box.item label="Ovunque" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Nessuna spinta
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Nessuna spinta (Impostazione regionale)
- </panel.string>
</panel>
- <panel label="Media" name="land_media_panel">
+ <panel label="MEDIA" name="land_media_panel">
<text name="with media:" width="85">
Tipo di Media:
</text>
- <combo_box left="97" name="media type" tool_tip="Specifica se l&apos;Url è un video, una pagina web, o un altro tipo di media"/>
+ <combo_box left="97" name="media type" tool_tip="Specifica se l&apos;Url è un video, una pagina web, o un altro tipo di media"/>
<text name="at URL:" width="85">
- URL Media:
+ Home Page:
</text>
<line_editor left="97" name="media_url"/>
<button label="Imposta..." label_selected="Imposta..." name="set_media_url" width="63"/>
+ <text name="CurrentURL:">
+ Pagina attuale:
+ </text>
+ <check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/>
<text name="Description:">
Descrizione:
</text>
@@ -419,21 +398,14 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Cambia
Texture:
</text>
- <texture_picker left="97" label="" name="media texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ <texture_picker label="" left="97" name="media texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
<text name="replace_texture_help" width="285">
(Gli oggetti che hanno questa texture applicata
mostreranno il video o la pagina web dopo che avrai
cliccato sulla freccia play.)
</text>
- <text name="Options:">
- Opzioni
-Media:
- </text>
- <check_box left="94" label="Auto ridimensiona" name="media_auto_scale" tool_tip="Spuntando questa opzione, nell&apos;appezzamento il contenuto media si ridimensionerà automaticamente. Potrebbe darsi che appaia un po&apos; più lento e che diminuisca la qualità visiva ma nessun altro riadattamento o allineamento della texture sarà necessario."/>
- <check_box left="265" label="Fai ripetere il video" name="media_loop" tool_tip="Fai ripetere il video continuamente. Quando il video è finito, reinizierà dal principio."/>
- <check_box left="94" label="Nascondi indirizzo URL Media" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/>
- <check_box left="265" label="Nascondi indirizzo URL Musica" name="hide_music_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url della musica a tutte le persone non autorizzate a vedere le informazioni del terreno."/>
- <text left="99" width="120" name="media_size" tool_tip="Aumenta grandezza per far vedere meglio i media web, lascia a 0 per impostare il default.">
+ <check_box label="Auto ridimensiona" left="94" name="media_auto_scale" tool_tip="Spuntando questa opzione, nell&apos;appezzamento il contenuto media si ridimensionerà automaticamente. Potrebbe darsi che appaia un po&apos; più lento e che diminuisca la qualità visiva ma nessun altro riadattamento o allineamento della texture sarà necessario."/>
+ <text left="99" name="media_size" tool_tip="Aumenta grandezza per far vedere meglio i media web, lascia a 0 per impostare il default." width="120">
Grandezza Media:
</text>
<spinner left_delta="104" name="media_size_width" tool_tip="Aumenta larghezza per far vedere meglio i media web, lascia a 0 per impostare il default."/>
@@ -441,57 +413,43 @@ Media:
<text name="pixels">
pixels
</text>
- <text name="MusicURL:">
- URL Musica:
- </text>
- <line_editor left="97" name="music_url"/>
- <text name="Sound:">
- Suono:
- </text>
- <check_box left="94" label="Limita le gesture e i suoni degli oggetti in questo territorio" name="check sound local"/>
- <button label="?" label_selected="?" name="?" left="420"/>
- <text name="Voice settings:">
- Voice:
+ <text name="Options:">
+ Opzioni
+Media:
</text>
- <check_box left="94" label="Abilita il Voice" name="parcel_enable_voice_channel"/>
- <check_box left="94" label="Abilita il Voice (stabilito su tutta la proprietà)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box left="114" label="Limita il voice a questa porzione di terreno" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Fai ripetere il video" left="265" name="media_loop" tool_tip="Fai ripetere il video continuamente. Quando il video è finito, reinizierà dal principio."/>
+ </panel>
+ <panel label="SUONO" name="land_audio_panel">
+ <check_box label="Attiva Voice" name="parcel_enable_voice_channel"/>
+ <check_box label="Attiva Voice (stabilito dalla Proprietà)" name="parcel_enable_voice_channel_is_estate_disabled"/>
</panel>
- <panel label="Accesso" name="land_access_panel">
+ <panel label="ACCESSO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definito dalla Proprietà)
+ </panel.string>
+ <panel.string name="estate_override">
+ Una o più di queste impostazioni sono già impostate a livello regionale
+ </panel.string>
<text name="Limit access to this parcel to:">
Accesso a questo terreno
</text>
- <check_box label="Permetti accesso pubblico" name="public_access"/>
+ <check_box label="Permetti Accesso Pubblico [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Blocca l&apos;accesso con Residenti:
+ Accesso ristretto ai Residenti verificati con:
</text>
- <check_box label="Che non hanno dato le proprie informazioni di pagamento alla Linden Lab" name="limit_payment" tool_tip="Manda via residenti non identificati."/>
- <check_box label="Che non sono adulti con età verificata" name="limit_age_verified" tool_tip="Manda via residenti che non hanno verificato la loro età. Guarda il sito support.secondlife.com per ulteriori informazioni."/>
- <panel.string name="estate_override">
- Una o più di queste impostazioni sono già impostate a livello regionale
- </panel.string>
+ <check_box label="Informazioni di pagamento on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Manda via residenti non identificati."/>
+ <check_box label="Verifica dell&apos;età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli residenti che non hanno verificato l&apos;età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti accesso al gruppo: [GROUP]" name="GroupCheck" tool_tip="Imposta il gruppo nel pannello generale."/>
<check_box label="Vendi pass a:" name="PassCheck" tool_tip="Permetti in questo terreno l&apos;accesso temporaneo"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Chiunque"
- />
- <combo_box.item name="Group" label="Gruppo"
- />
+ <combo_box.item label="Chiunque" name="Anyone"/>
+ <combo_box.item label="Gruppo" name="Group"/>
</combo_box>
<spinner label="Prezzo in L$:" name="PriceSpin"/>
<spinner label="Ore di accesso:" name="HoursSpin"/>
- <text label="Permetti sempre" name="AllowedText">
- Residenti permessi
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] in elenco, [MAX] massimo)"/>
- <button label="Aggiungi..." label_selected="Aggiungi..." name="add_allowed"/>
- <button label="Rimuovi" label_selected="Rimuovi" name="remove_allowed"/>
- <text label="Blocca" name="BanCheck">
- Residenti bloccati
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] in elenco, [MAX] massimo)"/>
- <button label="Aggiungi..." label_selected="Aggiungi..." name="add_banned"/>
- <button label="Rimuovi" label_selected="Rimuovi" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="([LISTED] in lista, [MAX] max)"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_activeim.xml b/indra/newview/skins/default/xui/it/floater_activeim.xml
new file mode 100644
index 0000000000..d19882fa48
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ATTIVA IM"/>
diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
index b6d6148afb..74a994825d 100644
--- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
@@ -1,70 +1,177 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Impossibile inizializzare la sequenza
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Il file dell&apos;animazione è lungo [LENGTH] secondi.
+
+La lunghezza massima è [MAX_LENGTH] secondi.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Impossibile leggere il file dell&apos;animazione.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fine prematura del file.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossibile leggere la definizione del vincolo.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Non può aprire il file BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ HIERARCHY header non valido.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Impossibile trovare la RADICE o UNIONE. ????????????
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossibile trovare il nome MISTO. ??????
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossibile trovare OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossibile trovare CHANNELS. ?????
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossibile ottenere un ordine di rotazione.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Rotazione dell&apos;asse non disponibile.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossibile trovare il GESTO.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossibile ottenere il numero dei frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossibile ottenere il tempo del frame.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossibile ottenre una posizione dei valori.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossibile ottenere i valori di rotazione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossibile aprire la traduzione del file.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossibile leggere l&apos;intestazione della traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossibile leggere i nomi della traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossibile leggere la traduzione ignora il valore. ?????
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossibile leggere la traduzione del valore relativo.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Cannot read translation outname value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossibile leggere la matrice di traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossibile unire il nome del bambino.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossibile unire il nome del genitore.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossibile ottenre il valore di priorità.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossibile ottenere il valore di loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossibile essere in agio nei valori. ?????????
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Cannot get ease Out values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossibile ottenere il valore morph della mano.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossibile leggere il nome emote.
+ </floater.string>
<text name="name_label">
Nome:
</text>
<text name="description_label">
Descrizione:
</text>
- <spinner label_width="72" width="110" label="Priorità" name="priority" tool_tip="Controlla quali altre animazioni possono essere annullate da questa animazione."/>
- <check_box label="Ciclica" name="loop_check" tool_tip="Rende questa animazione ciclica."/>
- <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto nell&apos;animazione in cui ritornare dopo ogni ciclo."/>
- <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto nell&apos;animazione in cui terminare dopo ogni ciclo."/>
+ <spinner label="Priorità" label_width="72" name="priority" tool_tip="Controlla quali altre animazioni possono prevalere su questa animazione" width="110"/>
+ <check_box label="Ciclica" name="loop_check" tool_tip="Rendi questa animazione in loop"/>
+ <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il momento nel quale l&apos;animazione inizia il loop"/>
+ <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il momento nel quale l&apos;animazione ferma il loop"/>
<text name="hand_label">
Postura della mano
</text>
- <combo_box left_delta="100" width="184" name="hand_pose_combo" tool_tip="Controlla cosa fanno le mani durante l&apos;animazione.">
- <combo_box.item name="Spread" label="Aperte"/>
- <combo_box.item name="Relaxed" label="Rilassate"/>
- <combo_box.item name="PointBoth" label="Entrambe indicano"/>
- <combo_box.item name="Fist" label="Pugno"/>
- <combo_box.item name="RelaxedLeft" label="Sinistra Rilassata"/>
- <combo_box.item name="PointLeft" label="Sinistra Indica"/>
- <combo_box.item name="FistLeft" label="Sinistra a pugno"/>
- <combo_box.item name="RelaxedRight" label="Destra rilassata"/>
- <combo_box.item name="PointRight" label="Destra Indica"/>
- <combo_box.item name="FistRight" label="Destra a Pugno"/>
- <combo_box.item name="SaluteRight" label="Destra Saluta"/>
- <combo_box.item name="Typing" label="Digitano"/>
- <combo_box.item name="PeaceRight" label="Destra &apos;segno di pace&apos;"/>
+ <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controlla ciò che fanno le mani durante l&apos;animazione" width="184">
+ <combo_box.item label="Stendi" name="Spread"/>
+ <combo_box.item label="Rilassato" name="Relaxed"/>
+ <combo_box.item label="indica entrambi" name="PointBoth"/>
+ <combo_box.item label="Pugno" name="Fist"/>
+ <combo_box.item label="Sinistra rilassata" name="RelaxedLeft"/>
+ <combo_box.item label="Indica sinistra" name="PointLeft"/>
+ <combo_box.item label="Pugno sinistra" name="FistLeft"/>
+ <combo_box.item label="Destra rilassata" name="RelaxedRight"/>
+ <combo_box.item label="Indica destra" name="PointRight"/>
+ <combo_box.item label="Pugno Destro" name="FistRight"/>
+ <combo_box.item label="Saluta Destra" name="SaluteRight"/>
+ <combo_box.item label="Scrivendo" name="Typing"/>
+ <combo_box.item label="Pace Destra" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Espressione
</text>
- <combo_box left_delta="100" width="184" name="emote_combo" tool_tip="Controlla l&apos;espressione del viso durante l&apos;animazione.">
- <combo_box.item name="[None]" label="None]"/>
- <combo_box.item name="Aaaaah" label="Aaaaah"/>
- <combo_box.item name="Afraid" label="Paura"/>
- <combo_box.item name="Angry" label="Rabbia"/>
- <combo_box.item name="BigSmile" label="Sorriso Aperto"/>
- <combo_box.item name="Bored" label="Noia"/>
- <combo_box.item name="Cry" label="Pianto"/>
- <combo_box.item name="Disdain" label="Sdegno"/>
- <combo_box.item name="Embarrassed" label="Imbarazzo"/>
- <combo_box.item name="Frown" label="Accigliato"/>
- <combo_box.item name="Kiss" label="Bacio"/>
- <combo_box.item name="Laugh" label="Risata"/>
- <combo_box.item name="Plllppt" label="Linguaccia"/>
- <combo_box.item name="Repulsed" label="Repulsione"/>
- <combo_box.item name="Sad" label="Tristezza"/>
- <combo_box.item name="Shrug" label="Spallucce"/>
- <combo_box.item name="Smile" label="Sorriso"/>
- <combo_box.item name="Surprise" label="Sorpresa"/>
- <combo_box.item name="Wink" label="Ammiccamento"/>
- <combo_box.item name="Worry" label="Preoccupazione"/>
+ <combo_box left_delta="100" name="emote_combo" tool_tip="Controlla ciò che fà il viso durante l&apos;animazione" width="184">
+ <combo_box.item label="(Nessuno)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Spavento" name="Afraid"/>
+ <combo_box.item label="Arrabbiato" name="Angry"/>
+ <combo_box.item label="Grande sorriso" name="BigSmile"/>
+ <combo_box.item label="Annoiato" name="Bored"/>
+ <combo_box.item label="Pianto" name="Cry"/>
+ <combo_box.item label="Disdegno" name="Disdain"/>
+ <combo_box.item label="Imbarazzato" name="Embarrassed"/>
+ <combo_box.item label="Accigliato ?????" name="Frown"/>
+ <combo_box.item label="Bacio" name="Kiss"/>
+ <combo_box.item label="Risata" name="Laugh"/>
+ <combo_box.item label="Plllppt" name="Plllppt"/>
+ <combo_box.item label="Repulsione" name="Repulsed"/>
+ <combo_box.item label="Triste" name="Sad"/>
+ <combo_box.item label="Scrollata di spalle" name="Shrug"/>
+ <combo_box.item label="Sorriso" name="Smile"/>
+ <combo_box.item label="Stupore" name="Surprise"/>
+ <combo_box.item label="Occhiolino" name="Wink"/>
+ <combo_box.item label="Preoccupato" name="Worry"/>
</combo_box>
<text name="preview_label" width="250">
Vedi anteprima mentre
</text>
- <combo_box left_delta="154" width="130" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali.">
- <combo_box.item name="Standing" label="In piedi"/>
- <combo_box.item name="Walking" label="Passeggia"/>
- <combo_box.item name="Sitting" label="Siede"/>
- <combo_box.item name="Flying" label="Vola"/>
+ <combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali." width="130">
+ <combo_box.item label="In piedi" name="Standing"/>
+ <combo_box.item label="Camminando" name="Walking"/>
+ <combo_box.item label="Sedendo" name="Sitting"/>
+ <combo_box.item label="Volando" name="Flying"/>
</combo_box>
- <spinner label_width="125" width="192" label="Avvio lento (sec)" name="ease_in_time" tool_tip="Tempo (in secondi) in cui le animazioni iniziano a sfumare."/>
- <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Arresto lento (sec)" name="ease_out_time" tool_tip="Tempo (in secondi) in cui le animazioni iniziano a sfumare."/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Attiva/sospendi l&apos;animazione."/>
+ <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni si miscelano" width="192"/>
+ <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni terminano di miscelarsi" width="192"/>
+ <button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/>
+ <button name="pause_btn" tool_tip="La tua animazione in Pause"/>
<button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell&apos;animazione"/>
<text name="bad_animation_text">
Impossibile leggere il file dell&apos;animazione.
@@ -72,19 +179,6 @@
Raccomandiamo file di tipo BVH esportati da
Poser 4.
</text>
- <button label="Annulla" name="cancel_btn"/>
<button label="Importa ([AMOUNT]L$)" name="ok_btn"/>
- <string name="failed_to_initialize">
- Impossibile inizializzare la sequenza
- </string>
- <string name="anim_too_long">
- Il file dell&apos;animazione è lungo [LENGTH] secondi.
-
-La lunghezza massima è [MAX_LENGTH] secondi.
- </string>
- <string name="failed_file_read">
- Impossibile leggere il file dell&apos;animazione.
-
-[STATUS]
- </string>
+ <button label="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml
index edbb9ab9a9..aa7b79fc50 100644
--- a/indra/newview/skins/default/xui/it/floater_auction.xml
+++ b/indra/newview/skins/default/xui/it/floater_auction.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="Inizia a vendere terra Linden">
- <check_box label="Includi barriere di selezione gialle" name="fence_check"/>
- <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <string name="already for sale">
+<floater name="floater_auction" title="INIZIA LA VENDITA DI TERRA LINDEN">
+ <floater.string name="already for sale">
Non puoi mettere in asta terreni che sono già in vendita.
- </string>
+ </floater.string>
+ <check_box initial_value="true" label="Includi barriere di selezione gialle" name="fence_check"/>
+ <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/>
+ <button label="Vendi a chiunque" label_selected="Vendi a chiunque" name="sell_to_anyone_btn"/>
+ <button label="Annulla le Impostazioni" label_selected="Annulla le Impostazioni" name="reset_parcel_btn"/>
+ <button label="Inizia l&apos;Asta" label_selected="Inizia l&apos;Asta" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
index a223e30fb5..e583d0b8b5 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Scegli residente">
+<floater name="avatarpicker" title="SCEGLI RESIDENTE">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; non trovato
+ </floater.string>
+ <floater.string name="no_one_near">
+ Nessuno vicino
+ </floater.string>
+ <floater.string name="no_results">
+ Nessun risultato
+ </floater.string>
+ <floater.string name="searching">
+ Ricerca...
+ </floater.string>
+ <string label="Seleziona" label_selected="Seleziona" name="Select">
+ Seleziona
+ </string>
+ <string name="Close">
+ Chiudi
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Cerca" name="SearchPanel">
<text name="InstructSearchResidentName">
- Scrivi parte del nome del residente:
+ Scrivi parte del nome di una persona:
</text>
- <button label="Trova" label_selected="Trova" name="Find"/>
+ <button label="Vai" label_selected="Vai" name="Find"/>
</panel>
- <panel label="Biglietti da visita" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Seleziona un biglietto da visita:
+ <panel label="Amici" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Seleziona una persona:
</text>
</panel>
<panel label="Vicino a me" name="NearMePanel">
<text name="InstructSelectResident">
- Seleziona un residente
-nelle vicinanze:
+ Seleziona una persona nei dintorni:
</text>
- <button font="SansSerifSmall" left_delta="6" width="110" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" name="Refresh"/>
- <slider label="Range" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Range" name="near_me_range"/>
<text name="meters">
Metri
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" left_delta="6" name="Refresh" width="110"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Seleziona" label_selected="Seleziona" name="Select"/>
- <button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; non trovato
- </string>
- <string name="no_one_near">
- Nessuno è vicino
- </string>
- <string name="no_results">
- Nessun risultato
- </string>
- <string name="searching">
- Ricerca...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancella" label_selected="Cancella" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
index 281f436224..e5ce07f300 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
@@ -1,30 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="Texture dell&apos;Avatar">
- <text name="baked_label">
- Texture Visualizzate
- </text>
+<floater name="avatar_texture_debug" title="AVATAR TEXTURES">
+ <floater.string name="InvalidAvatar">
+ AVATAR NON VALIDO
+ </floater.string>
<text name="composite_label">
Texture Composite
</text>
- <texture_picker label="Testa" name="baked_head"/>
- <texture_picker label="Trucco" name="head_bodypaint"/>
- <texture_picker label="Capelli" name="hair"/>
<button label="Deposito" label_selected="Deposito" name="Dump"/>
- <texture_picker label="Occhi" name="baked_eyes"/>
- <texture_picker label="Occhio" name="eye_texture"/>
- <texture_picker label="Parte superiore del corpo" name="baked_upper_body"/>
- <texture_picker label="Tatuaggio parte superiore del corpo" name="upper_bodypaint"/>
- <texture_picker label="Canottiera" name="undershirt"/>
- <texture_picker label="Guanti" name="gloves"/>
- <texture_picker label="Maglietta" name="shirt"/>
- <texture_picker label="Giacca, parte superiore" name="upper_jacket"/>
- <texture_picker label="Parte inferiore del corpo" name="baked_lower_body"/>
- <texture_picker label="Tatuaggio parte inferiore del corpo" name="lower_bodypaint"/>
- <texture_picker label="Mutande" name="underpants"/>
- <texture_picker label="Calze" name="socks"/>
- <texture_picker label="Scarpe" name="shoes"/>
- <texture_picker label="Pantaloni" name="pants"/>
- <texture_picker label="Giacca" name="jacket"/>
- <texture_picker label="Gonna" name="baked_skirt"/>
- <texture_picker label="Gonna" name="skirt_texture"/>
+ <texture_picker label="Capelli" name="hair_grain"/>
+ <texture_picker label="Capelli Alpha" name="hair_alpha"/>
+ <texture_picker label="Trucco" name="head_bodypaint"/>
+ <texture_picker label="Testa Alpha" name="head_alpha"/>
+ <texture_picker label="Tatuaggio Testa" name="head_tattoo"/>
+ <texture_picker label="Occhio" name="eyes_iris"/>
+ <texture_picker label="Occhi Alpha" name="eyes_alpha"/>
+ <texture_picker label="Bodypaint Corpo Superiore" name="upper_bodypaint"/>
+ <texture_picker label="Maglietta intima" name="upper_undershirt"/>
+ <texture_picker label="Guanti" name="upper_gloves"/>
+ <texture_picker label="Camicia" name="upper_shirt"/>
+ <texture_picker label="Giacca superiore" name="upper_jacket"/>
+ <texture_picker label="Alpha Superiore" name="upper_alpha"/>
+ <texture_picker label="Tatuaggio superiore" name="upper_tattoo"/>
+ <texture_picker label="Bodypaint Corpo Inferiore" name="lower_bodypaint"/>
+ <texture_picker label="Slip" name="lower_underpants"/>
+ <texture_picker label="Calze" name="lower_socks"/>
+ <texture_picker label="Scarpe" name="lower_shoes"/>
+ <texture_picker label="Pantaloni" name="lower_pants"/>
+ <texture_picker label="Giacca" name="lower_jacket"/>
+ <texture_picker label="Alpha Inferiore" name="lower_alpha"/>
+ <texture_picker label="Tatuaggio basso" name="lower_tattoo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml
index 035b073729..8fd69d811d 100644
--- a/indra/newview/skins/default/xui/it/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/it/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Segnali luminosi">
+<floater name="beacons" title="BEACONS">
<panel name="beacons_panel">
- <check_box label="Oggetti scriptati con solo &apos;tocca&apos; abilitato" name="touch_only"/>
- <check_box label="Oggetti scriptati" name="scripted"/>
- <check_box label="Oggetti fisici" name="physical"/>
- <check_box label="Sorgenti di suoni" name="sounds"/>
- <check_box label="Sorgenti di particelle" name="particles"/>
- <check_box label="Visualizza l&apos;evidenziato" name="highlights"/>
- <check_box label="Visualizza segnali" name="beacons"/>
- <text name="beacon_width_label">
- Ampiezza segnali:
+ <text name="label_show">
+ Mostra:
</text>
+ <check_box label="Beacons" name="beacons"/>
+ <check_box label="Highlights" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Beacon width">
+ Larghezza:
+ </text>
+ <text name="label_objects">
+ Per questi oggetti:
+ </text>
+ <check_box label="Fisico" name="physical"/>
+ <check_box label="Scripted" name="scripted"/>
+ <check_box label="Tocca solo" name="touch_only"/>
+ <check_box label="Fonte del Suono" name="sounds"/>
+ <check_box label="Fonte delle Particle" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_build_options.xml b/indra/newview/skins/default/xui/it/floater_build_options.xml
index 2c60aeda2b..233efef19b 100644
--- a/indra/newview/skins/default/xui/it/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_build_options.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="Opzioni della griglia">
- <spinner label="Unità di misura della griglia (metri)" name="GridResolution" width="250" label_width="192"/>
- <spinner label="Estensione della griglia (metri)" name="GridDrawSize" width="250" label_width="192"/>
- <check_box label="Abilita sotto-unità di movimento" name="GridSubUnit"/>
- <check_box label="Mostra piani d&apos;intersezione" name="GridCrossSection"/>
+<floater name="build options floater" title="GRID OPTIONS">
+ <spinner label="Grid Units (meters)" label_width="192" name="GridResolution" width="250"/>
+ <spinner label="Estensione della griglia (metri)" label_width="192" name="GridDrawSize" width="250"/>
+ <check_box label="Usa allineamento sub-unitario" name="GridSubUnit"/>
+ <check_box label="Guarda le cross-sections" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacità della Grid">
+ Opacità:
+ </text>
<slider label="Trasparenza della griglia" name="GridOpacity" width="250"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
index 7ca57f34b3..26890dc209 100644
--- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Modifica in massa i permessi del contenuto">
- <text name="applyto">
- Tipi di contenuto
- </text>
+<floater name="floaterbulkperms" title="MODIFICA PERMESSI DEL CONTENUTO">
+ <floater.string name="nothing_to_modify_text">
+ La selezione non contiene nessun contenuto modificabile.
+ </floater.string>
+ <floater.string name="status_text">
+ Impostazione permessi su [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Avvio richiesta di modifica dei permessi...
+ </floater.string>
+ <floater.string name="done_text">
+ Conclusa richiesta di modifica dei permessi.
+ </floater.string>
<check_box label="Animazioni" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animazioni"/>
<check_box label="Parti del corpo" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Parti del Corpo"/>
<check_box label="Abiti" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Vestiario"/>
<check_box label="Gesture" name="check_gesture"/>
- <check_box label="Landmark" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestures"/>
<check_box label="Notecard" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Notecards"/>
<check_box label="Oggetti" name="check_object"/>
+ <icon name="icon_object" tool_tip="Oggetti"/>
<check_box label="Script" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Suoni" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Suoni"/>
<check_box label="Texture" name="check_texture"/>
- <button label="Spunta tutti" label_selected="Tutti" name="check_all"/>
- <button label="Togli la spunta a tutti" label_selected="Nessuno" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Textures"/>
+ <button label="√ Tutto" label_selected="Tutti" name="check_all"/>
+ <button label="Pulisci" label_selected="Nessuno" name="check_none"/>
<text name="newperms">
- Nuovi permessi
+ Nuovo Permessi del Contenuto
+ </text>
+ <text name="GroupLabel">
+ Gruppo:
</text>
- <check_box label="Condividi con il gruppo" name="share_with_group"/>
- <check_box label="Permetti a tutti di copiare" name="everyone_copy"/>
+ <check_box label="Condividi" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Chiunque:
+ </text>
+ <check_box label="Copia" name="everyone_copy"/>
<text name="NextOwnerLabel">
- Il prossimo proprietario può:
+ Prossimo proprietario:
</text>
<check_box label="Modificare" name="next_owner_modify"/>
<check_box label="Copiare" name="next_owner_copy"/>
- <check_box label="Rivendere/Regalare" name="next_owner_transfer"/>
- <button label="Aiuto" name="help"/>
- <button label="Applica" name="apply"/>
- <button label="Chiudi" name="close"/>
- <string name="nothing_to_modify_text">
- La selezione non contiene nessun contenuto modificabile.
- </string>
- <string name="status_text">
- Impostazione permessi su [NAME]
- </string>
- <string name="start_text">
- Avvio richiesta di modifica dei permessi...
- </string>
- <string name="done_text">
- Conclusa richiesta di modifica dei permessi.
- </string>
+ <check_box initial_value="true" label="Transfer" name="next_owner_transfer" tool_tip="Prossimo proprietario può donare o rivendere questo oggetto"/>
+ <button label="Ok" name="apply"/>
+ <button label="Cancella" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml
index d9ce29fa08..d9dd3f26d7 100644
--- a/indra/newview/skins/default/xui/it/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/it/floater_bumps.xml
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="Collisioni, spinte e colpi">
- <string name="none_detected">
+<floater name="floater_bumps" title="COLLISIONI, SPINTE E COLPI">
+ <floater.string name="none_detected">
Nessuno rilevato
- </string>
- <string name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] ti ha urtato
- </string>
- <string name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] ti ha spinto per mezzo di uno script
- </string>
- <string name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] ti ha colpito con un oggetto
- </string>
- <string name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] ti ha colpito con un oggetto scriptato
- </string>
- <string name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] ti ha colpito con un oggetto fisico
- </string>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
index 2836f98970..e84d396138 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="Compra i contenuti">
+<floater name="floater_buy_contents" title="COMPRA I CONTENUTI">
<text name="contains_text">
[NAME] contiene:
</text>
@@ -7,8 +7,9 @@
Compra per [AMOUNT]L$ da [NAME]?
</text>
<button label="Annulla" label_selected="Annulla" name="cancel_btn" width="73"/>
- <button label="Compra" label_selected="Compra" name="buy_btn" width="73" left_delta="-77"/>
- <check_box label="Indossa adesso &#10;l&apos;indumento" name="wear_check" bottom="-234" left_delta="-125"/>
+ <button label="Compra" label_selected="Compra" left_delta="-77" name="buy_btn" width="73"/>
+ <check_box bottom="-234" label="Indossa adesso
+l&apos;indumento" left_delta="-125" name="wear_check"/>
<string name="no_copy_text">
(non copiabile)
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index a24f0dbe7a..9d97f7d72d 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -1,69 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="Acquista valuta">
- <text name="info_buying">
- Acquistando valuta:
- </text>
- <text name="info_cannot_buy" left="5" right="-5">
- Non è possibile comprare ora
- </text>
- <text name="info_need_more" left="5" right="-5" font="SansSerifLarge">
- Hai bisogno di acquistare ulteriore contante:
- </text>
- <text name="error_message">
- Qualcosa non è andato a buon fine.
+<floater name="buy currency" title="COMPRA L$">
+ <floater.string name="buy_currency">
+ Compra L$ [LINDENS] per approx. [LOCALAMOUNT]
+ </floater.string>
+ <text font="SansSerifLarge" left="5" name="info_need_more" right="-5">
+ Necessiti di più L$
</text>
- <button label="Vai al sito web" name="error_web"/>
<text name="contacting">
Sto contattando il LindeX...
</text>
- <text name="buy_action_unknown">
- Compra L$ sul mercato delle valute LindeX
+ <text name="info_buying">
+ COMPRA L$
</text>
- <text name="buy_action">
- [NAME] [PRICE]L$
+ <text name="balance_label">
+ Io ho
+ </text>
+ <text name="balance_amount">
+ [AMT]L$
</text>
<text name="currency_action" width="45">
- Compra
+ Io voglio comprare
</text>
- <line_editor name="currency_amt">
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
1234
</line_editor>
+ <text name="buying_label">
+ Al prezzo
+ </text>
<text name="currency_est">
- L$ per circa [USD]US$
+ approx. [LOCALAMOUNT]
</text>
<text name="getting_data">
- Dati in ricezione...
+ Calcolando...
</text>
- <text name="balance_label">
- Attualmente possiedi
- </text>
- <text name="balance_amount">
- [AMT]L$
- </text>
- <text name="buying_label">
- Stai comprando
- </text>
- <text name="buying_amount">
- [AMT]L$
+ <text name="buy_action">
+ [NAME] [PRICE]L$
</text>
<text name="total_label">
- Il tuo saldo sarà
+ Il mio saldo sarà
</text>
<text name="total_amount">
[AMT]L$
</text>
- <text name="purchase_warning_repurchase" height="48" bottom_delta="-64" right="-10">
- Confermando questa operazione si acquisterà solo
-la valuta. Per acquistare il bene, dovrai riprovare
-l&apos;operazione nuovamente.
+ <text name="currency_links">
+ [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
</text>
- <text name="purchase_warning_notenough" bottom_delta="16">
- Non stai comprando abbastanza denaro.
-Devi aumentare l&apos;importo da acquistare.
+ <text name="exchange_rate_note">
+ Ri-scrivi un importo per vedere l&apos;ultimo rapporto di cambio.
</text>
+ <text name="purchase_warning_repurchase">
+ Confermando questo acquisto di soli L$, non l&apos;oggetto.
+ </text>
+ <text bottom_delta="16" name="purchase_warning_notenough">
+ Non stai acquistando abbastanza L$. Per favore aumenta l&apos;importo.
+ </text>
+ <button label="Compra ora" name="buy_btn"/>
<button label="Cancella" name="cancel_btn"/>
- <button label="Acquista" name="buy_btn"/>
- <string name="buy_currency">
- acquistare [LINDENS] L$ per circa [USD] US$
- </string>
+ <text left="5" name="info_cannot_buy" right="-5">
+ Non in grado di acquistare
+ </text>
+ <button label="Continua sul Web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index d6036c19dd..9fa5bd5570 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Compra terra">
+<floater name="buy land" title="COMPRA LA TERRA">
<text name="region_name_label">
Regione:
</text>
@@ -18,10 +18,10 @@
<text name="estate_name_text">
(sconosciuto)
</text>
- <text name="estate_owner_label" width="120" right="575">
+ <text name="estate_owner_label" right="575" width="120">
Proprietario della regione:
</text>
- <text name="estate_owner_text" left="580" width="155">
+ <text left="580" name="estate_owner_text" width="155">
(sconosciuto)
</text>
<text name="resellable_changeable_label">
@@ -57,9 +57,9 @@
Prezzo:
</text>
<text name="info_price">
- 1500 L$
-(1.1 L$/m²)
-venduta con gli oggetti
+ L$ 1500
+(L$ 1.1/m²)
+sold with objects
</text>
<text name="info_action">
Comprando questa terra:
@@ -75,15 +75,16 @@ venduta con gli oggetti
Solo i membri premium possono possedere terra.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9.95 US$/mese, addebitati mensilmente"/>
- <combo_box.item name="US$7.50/month,billedquarterly" label="7.50 US$/mese, addebitati ogni quadrimestre"/>
- <combo_box.item name="US$6.00/month,billedannually" label="6.00 US$/mese, addebitati annualmente"/>
+ <combo_box.item label="US$9.95/mese, addebitato mensilmente" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50/mese, addebitato trimestralmente" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/mese, addebitato annualmente" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Aumenta il tasso di pagamento mensile delle tasse d&apos;uso della terra a 40 US$/mese.
</text>
<text name="land_use_reason">
- Possiedi 1309 m² di terra. Questa porzione è 512 m² di terra.
+ Tu occupi 1309 m² di terreno.
+This parcel is 512 m² di terreno.
</text>
<text name="purchase_action">
Paga il residente Joe 4000 L$ per la terra
@@ -94,16 +95,16 @@ venduta con gli oggetti
<text name="currency_action" width="106">
Compra ulteriori L$
</text>
- <line_editor name="currency_amt" left="174" width="80">
+ <line_editor left="174" name="currency_amt" width="80">
1000
</line_editor>
<text name="currency_est">
- per circa [AMOUNT2] US$
+ per circa. [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Possiedi 2.100 L$.
</text>
- <check_box label="Rimuovi [AMOUNT] metri quadri di contribuzione dal gruppo." name="remove_contribution"/>
+ <check_box label="Rimuovi [AMOUNT] m² di contribuzione dal gruppo." name="remove_contribution"/>
<button label="Compra" name="buy_btn"/>
<button label="Annulla" name="cancel_btn"/>
<string name="can_resell">
@@ -180,26 +181,26 @@ Prova a selezionare un&apos;area più piccola.
Il tuo account può possedere terra.
</string>
<string name="land_holdings">
- Possiedi [BUYER] di metri quadri di terra.
+ Tu occupi [BUYER] m² di terreno.
</string>
<string name="pay_to_for_land">
Paga [AMOUNT] L$ a [SELLER] per questa terra
</string>
<string name="buy_for_US">
- Comprare [AMOUNT] L$ per circa [AMOUNT2] US$,
+ Compra L$ [AMOUNT] per circa. [LOCAL_AMOUNT],
</string>
<string name="parcel_meters">
- Questo terreno è di [AMOUNT] metri quadri.
+ Questo parcel è [AMOUNT] m²
</string>
<string name="premium_land">
- Questa terra è premium, e sarà  addebitata come [AMOUNT] metri quadri.
+ Questo terreno è premium, e costerà [AMOUNT] m².
</string>
<string name="discounted_land">
- Questa terra è scontata, e sarà  addebitata come [AMOUNT] metri quadri.
+ Questo terreno è scontato, e costerà [AMOUNT] m².
</string>
<string name="meters_supports_object">
- [AMOUNT] metri quadri
-supporta [AMOUNT2] oggetti
+ [AMOUNT] m²
+mantiene [AMOUNT2] oggetti
</string>
<string name="sold_with_objects">
venduta con oggetti
@@ -208,9 +209,9 @@ supporta [AMOUNT2] oggetti
Oggetti non inclusi
</string>
<string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/m²)
-[SOLD_WITH_OBJECTS]
+ L$ [PRICE]
+(L$ [PREZZO_PER_QM]/m²)
+[VENDUTO_CON_OGGETTI]
</string>
<string name="insufficient_land_credits">
Il gruppo [GROUP] avrà bisogno di contribuzioni anticipate, mediante crediti d&apos;uso terriero,
diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml
index 90ff84a89c..5f3413931b 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Compra una copia dell&apos;oggetto">
+<floater name="contents" title="COMPRA COPIA DELL&apos;OGGETTO">
<text name="contents_text">
- e dei suoi contenuti:
+ Contiene:
</text>
<text name="buy_text">
Compra per [AMOUNT]L$ da [NAME]?
diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml
index 823be8f4a1..182f82f17f 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -10,7 +10,22 @@
Muovi la telecamera su e giù e a sinistra e destra
</floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Muovi la telecamera su e giù e a sinistra e destra"/>
- <joystick_zoom name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura"/>
+ <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale sù e giù, sinistra e destra"/>
+ <panel name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura">
+ <slider_bar name="zoom_slider" tool_tip="Zoom verso il focus"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al focus"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Visuale posteriore"/>
+ <button name="group_view" tool_tip="Visuale di Gruppo"/>
+ <button name="front_view" tool_tip="Visuale Frontale"/>
+ <button name="mouselook_view" tool_tip="Visuale Mouselook"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Ruota la visuale"/>
+ <button label="" name="pan_btn" tool_tip="Visuale Panoramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Guardare un avatar"/>
+ <button label="" name="freecamera_btn" tool_tip="Vedi oggetto"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_choose_group.xml b/indra/newview/skins/default/xui/it/floater_choose_group.xml
index 3b5fc79bd8..00f2692295 100644
--- a/indra/newview/skins/default/xui/it/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/it/floater_choose_group.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="groups" title="Gruppi">
+<floater name="groups" title="GRUPPI">
<text name="groupdesc">
Scegli un gruppo:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_color_picker.xml b/indra/newview/skins/default/xui/it/floater_color_picker.xml
index 1e6d7bc3f0..8551d65da2 100644
--- a/indra/newview/skins/default/xui/it/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="Tavolozza colori">
+<floater name="ColorPicker" title="SELETTORE di COLORE">
<text name="r_val_text">
Rosso:
</text>
@@ -24,15 +24,14 @@
Luminosità:
</text>
<spinner left="84" name="lspin" width="47"/>
- <check_box label="Applica Immediatamente" name="apply_immediate"/>
- <button left_delta="150" name="color_pipette" />
- <button left_delta="55" label="Annulla" label_selected="Annulla" name="cancel_btn"/>
- <button label="Seleziona" label_selected="Seleziona" name="select_btn"/>
+ <check_box label="Applica ora" name="apply_immediate"/>
+ <button left_delta="150" name="color_pipette"/>
+ <button label="Annulla" label_selected="Annulla" left_delta="55" name="cancel_btn"/>
+ <button label="Ok" label_selected="Ok" name="select_btn"/>
<text name="Current color:">
Colore attuale:
</text>
<text name="(Drag below to save.)">
- (Trascina qui sotto
- per salvare)
+ (Trascina sotto per salvare)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml
index eac673e004..63e08444cd 100644
--- a/indra/newview/skins/default/xui/it/floater_customize.xml
+++ b/indra/newview/skins/default/xui/it/floater_customize.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Aspetto fisico" width="551">
+<floater name="floater customize" title="ASPETTO" width="551">
<tab_container name="customize tab container" tab_min_width="120" width="549">
<placeholder label="Parti del corpo" name="body_parts_placeholder"/>
- <panel label="Forma del corpo" name="Shape" left="124" width="389">
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <panel label="Forma del corpo" left="124" name="Shape" width="389">
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
<button label="Corpo" label_selected="Corpo" name="Body"/>
<button label="Testa" label_selected="Testa" name="Head"/>
<button label="Occhi" label_selected="Occhi" name="Eyes"/>
@@ -14,8 +14,8 @@
<button label="Torso" label_selected="Torso" name="Torso"/>
<button label="Gambe" label_selected="Gambe" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Femmina" />
- <radio_item name="radio2" label="Maschio" />
+ <radio_item label="Femmina" name="radio"/>
+ <radio_item label="Maschio" name="radio2"/>
</radio_group>
<text name="title">
[DESC]
@@ -43,8 +43,8 @@ sul tuo avatar. In alternativa, puoi crearne una nuova ed indossarla.
Forma del corpo:
</text>
<button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
</panel>
<panel label="Pelle" name="Skin">
<button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/>
@@ -76,13 +76,13 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
<text name="Item Action Label" right="89">
Pelle:
</text>
- <texture_picker width="96" label="Tatuaggi: testa" name="Head Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <texture_picker width="96" label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <texture_picker width="96" label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ <texture_picker label="Tatuaggi: testa" name="Head Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
+ <texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
+ <texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Capelli" name="Hair">
<button label="Capelli" label_selected="Colore" name="Color"/>
@@ -116,9 +116,9 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Occhi" name="Eyes">
<text name="title">
@@ -148,19 +148,19 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
</text>
<texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
- <panel label="Vestiti" name="clothes_placeholder"/>
+ <placeholder label="Vestiti" name="clothes_placeholder"/>
<panel label="Camicia" name="Shirt">
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere un colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -189,12 +189,12 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
</panel>
<panel label="Pantaloni" name="Pants">
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere un colore"/>
- <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New" />
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -248,12 +248,12 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
Scarpe:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere un colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Calze" name="Socks">
<text name="title">
@@ -282,12 +282,12 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
Calze:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere un colore"/>
- <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New" />
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Giacca" name="Jacket">
<text name="title">
@@ -315,14 +315,14 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
<text name="Item Action Label" right="89">
Giacca:
</text>
- <texture_picker width="96" label="Tessuto: superiore" name="Upper Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <texture_picker width="96" label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere il colore"/>
+ <texture_picker label="Tessuto: superiore" name="Upper Fabric" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
+ <texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Guanti" name="Gloves">
<text name="title">
@@ -351,12 +351,12 @@ In alternativa, puoi crearne un paio nuovo da zero ed indossarlo.
Guanti:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere il colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/>
- <button width="115" font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Canottiera" name="Undershirt">
<text name="title">
@@ -385,12 +385,12 @@ In alternativa, puoi crearne una nuovo da zero ed indossarla.
Canottiera:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere il colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/>
- <button width="115" font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Mutande" name="Underpants">
<text name="title">
@@ -419,12 +419,12 @@ In alternativa, puoi crearne una paio nuovo da zero ed indossarlo.
Mutande:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere il colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/>
- <button width="115" font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
</panel>
<panel label="Gonna" name="Skirt">
<text name="title">
@@ -453,16 +453,88 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
Gonna:
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per scegliere il colore"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/>
- <button width="115" font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off"/>
- <button left="95" width="72" label="Salva" label_selected="Salva" name="Save"/>
- <button left="171" label="Salva come..." label_selected="Salva come..." name="Save As"/>
- <button font="SansSerifSmall" width="120" left="267" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
+ <button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
+ <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ </panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: non può essere modificato
+ </text>
+ <text name="title_loading">
+ [DESC]: caricando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: non indossato
+ </text>
+ <text name="path">
+ Collocato in [PATH]
+ </text>
+ <text name="not worn instructions">
+ Metti una nuova alpha mask trascinandone una dall&apos;inventario del tuo avatar.
+In alternativa, creane una nuova partendo da zero e indossala.
+ </text>
+ <text name="no modify instructions">
+ Non hai i permessi per modificare questa vestibilità.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegiere una fotografia"/>
+ <button label="Crea nuova alpha" label_selected="Crea nuova alpha" name="Create New"/>
+ <button label="Togli" label_selected="Togli" name="Take Off"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/>
+ <button label="Ripristina" label_selected="Ripristina" name="Revert"/>
+ </panel>
+ <panel label="Tatuaggio" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: non può essere modificato
+ </text>
+ <text name="title_loading">
+ [DESC]: caricando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: non indossato
+ </text>
+ <text name="path">
+ Collocato in [PATH]
+ </text>
+ <text name="not worn instructions">
+ Metti un nuovo tatuaggio trascinandone uno dall&apos;inventario del tuo avatar.
+In alternativa, creane uno nuovo partendo da zero e indossalo.
+ </text>
+ <text name="no modify instructions">
+ Non hai i permessi per moficare questa vestibilità.
+ </text>
+ <text name="Item Action Label">
+ Tatuaggio:
+ </text>
+ <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <button label="Crea Nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/>
+ <button label="Togli" label_selected="Togli" name="Take Off"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/>
+ <button label="Ripristina" label_selected="Ripristina" name="Revert"/>
</panel>
</tab_container>
<scroll_container left="254" name="panel_container"/>
+ <button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Crea Outfit..." label_selected="Crea Outfit..." name="Make Outfit" left="122" />
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
index 4c62d4f5a2..7d50e322c0 100644
--- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="Editor delle ciclo giorno/notte">
+<floater name="Day Cycle Floater" title="EDITOR DELLE CICLO GIORNO/NOTTE">
<tab_container name="Day Cycle Tabs">
<panel label="Ciclo giorno/notte" name="Day Cycle">
<button label="?" name="WLDayCycleHelp"/>
diff --git a/indra/newview/skins/default/xui/it/floater_device_settings.xml b/indra/newview/skins/default/xui/it/floater_device_settings.xml
index cbf965bf93..2410a16882 100644
--- a/indra/newview/skins/default/xui/it/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_device_settings.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="Impostazioni dispositivi Voice Chat"/>
+<floater name="floater_device_settings" title="OPZIONI PER IL DISPOSITIVO VOICE CHAT"/>
diff --git a/indra/newview/skins/default/xui/it/floater_env_settings.xml b/indra/newview/skins/default/xui/it/floater_env_settings.xml
index 36f97bda81..1c17c18e84 100644
--- a/indra/newview/skins/default/xui/it/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_env_settings.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="Editor dell&apos;ambiente">
+<floater name="Environment Editor Floater" title="EDITOR DELL&apos;AMBIENTE">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Ora del
giorno
@@ -15,7 +18,7 @@ Nuvole
Colore
dell&apos;Acqua
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Clicca per aprire la tavolozza dei colori"/>
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Clicca per aprire il selettore dei colori"/>
<text name="EnvWaterFogText">
Nebbiosità
dell&apos;acqua
@@ -23,5 +26,4 @@ dell&apos;acqua
<button bottom="-144" label="Usa orario della regione" name="EnvUseEstateTimeButton" width="145"/>
<button label="Cielo avanzato" name="EnvAdvancedSkyButton"/>
<button label="Acqua avanzata" name="EnvAdvancedWaterButton"/>
- <button label="?" name="EnvSettingsHelpButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_font_test.xml b/indra/newview/skins/default/xui/it/floater_font_test.xml
index 27b87a931d..859c068b11 100644
--- a/indra/newview/skins/default/xui/it/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/it/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Tipo di carattere per test">
+<floater name="contents" title="TIPO DI CARATTERE PER TEST">
<text name="linea">
OverrideTest, dovrebbe apparire qui come Times. (Dal default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_gesture.xml b/indra/newview/skins/default/xui/it/floater_gesture.xml
index 997e13ecb5..eefa3bb392 100644
--- a/indra/newview/skins/default/xui/it/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_gesture.xml
@@ -1,15 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="Gesture attive">
- <text name="help_label">
- Fai doppio click su una gesture per azionare animazioni
-e suoni.
- </text>
+<floater label="Posti" name="gestures" title="GESTURES">
+ <floater.string name="loading">
+ Caricando...
+ </floater.string>
+ <floater.string name="playing">
+ (Riproducendo)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copia di [COPY_NAME]
+ </floater.string>
<scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="Frase scatenante" name="trigger" width="106"/>
- <column label="Pulsante" name="shortcut" width="65"/>
- <column label="Nome" name="name" width="129"/>
+ <scroll_list.columns label="Nome" name="name" width="129"/>
+ <scroll_list.columns label="Chat" name="trigger" width="106"/>
+ <scroll_list.columns label="Pulsante" name="shortcut" width="65"/>
</scroll_list>
- <button label="Nuova" name="new_gesture_btn"/>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Più opzioni"/>
+ <button name="new_gesture_btn" tool_tip="Crea nuova gesture"/>
+ <button name="activate_btn" tool_tip="Attiva/Disattiva la gesture selezionata"/>
+ <button name="del_btn" tool_tip="Cancella questa gesture"/>
+ </panel>
<button label="Modifica" name="edit_btn"/>
<button label="Play" name="play_btn"/>
<button label="Stop" name="stop_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 688f9137a2..08326b1da3 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="Impostazioni Hardware">
+<floater name="Hardware Settings Floater" title="OPZIONI HARDWARE">
<text name="Filtering:">
Filtraggio:
</text>
@@ -8,21 +8,22 @@
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
- <combo_box.item name="FSAADisabled" label="Disattivato"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Disattivato" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (Luminosità, più basso = più luminoso, 0=default)
+ (0 = luminosità default, più basso = più luminoso)
</text>
<text name="Enable VBO:">
Attiva VBO:
</text>
- <check_box label="Attiva oggetti OpenGL Vertex Buffer" name="vbo" tool_tip="Attivandolo su un hardware moderno aumenta la performance. Ma, su un vecchio hardware, spesso l&apos;implementazione dei VBO è scarsa e potresti avere dei crash quando è attivato."/>
- <slider label="Memoria Texture (MB):" name="GrapicsCardTextureMemory" tool_tip="Quantità di memoria allocata per le texture. Impostata di default sulla memoria della scheda grafica. Ridurla può aumentare la performance, ma può anche rendere le texture sfocate."/>
- <spinner label="Indice della distanza &#10;della nebbia:" name="fog"/>
+ <check_box initial_value="true" label="Attiva oggetti OpenGL Vertex Buffer" name="vbo" tool_tip="Attivandolo su un hardware moderno aumenta la performance. Ma, su un vecchio hardware, spesso l&apos;implementazione dei VBO è scarsa e potresti avere dei crash quando è attivato."/>
+ <slider label="Texture Memory (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Memoria della scheda video in Defaults. Ridurre questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le textures poco definite."/>
+ <spinner label="Indice della distanza
+della nebbia:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_help_browser.xml b/indra/newview/skins/default/xui/it/floater_help_browser.xml
new file mode 100644
index 0000000000..9a158c5216
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_help_browser.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="HELP BROWSER">
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls">
+ <button label="Apri nel mio Web Browser" name="open_browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_hud.xml b/indra/newview/skins/default/xui/it/floater_hud.xml
index d31bcedf05..e458913452 100644
--- a/indra/newview/skins/default/xui/it/floater_hud.xml
+++ b/indra/newview/skins/default/xui/it/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="Tutorial"/>
+<floater name="floater_hud" title="TUTORIAL"/>
diff --git a/indra/newview/skins/default/xui/it/floater_im.xml b/indra/newview/skins/default/xui/it/floater_im.xml
index 2a9862fe7c..6303615e60 100644
--- a/indra/newview/skins/default/xui/it/floater_im.xml
+++ b/indra/newview/skins/default/xui/it/floater_im.xml
@@ -10,7 +10,7 @@
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
</string>
<string name="muted_message">
- Hai mutato questo residente. L&apos;invio di un messaggio lo riabiliterà automaticamente.
+ Hai bloccato questo residente. Spedendo un messaggio sarà automaticamente sbloccati.
</string>
<string name="generic_request_error">
Errore durante la richiesta, riprova più tardi.
diff --git a/indra/newview/skins/default/xui/it/floater_im_container.xml b/indra/newview/skins/default/xui/it/floater_im_container.xml
new file mode 100644
index 0000000000..2970639f4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="Instant Messages"/>
diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml
new file mode 100644
index 0000000000..830c65b443
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Pannello di Controllo IM" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="A" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_image_preview.xml b/indra/newview/skins/default/xui/it/floater_image_preview.xml
index 8ee3181bce..341202d8bc 100644
--- a/indra/newview/skins/default/xui/it/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_image_preview.xml
@@ -10,17 +10,17 @@
Anteprima dell&apos;
immagine come:
</text>
- <combo_box label="Tipo d&apos;abito" name="clothing_type_combo" left="120" width="166">
- <combo_box.item name="Image" label="Immagine"/>
- <combo_box.item name="Hair" label="Capelli"/>
- <combo_box.item name="FemaleHead" label="Testa femminile"/>
- <combo_box.item name="FemaleUpperBody" label="Corpo femminile superiore"/>
- <combo_box.item name="FemaleLowerBody" label="Corpo femminile inferiore"/>
- <combo_box.item name="MaleHead" label="Testa maschile"/>
- <combo_box.item name="MaleUpperBody" label="Corpo maschile superiore"/>
- <combo_box.item name="MaleLowerBody" label="Corpo maschile inferiore"/>
- <combo_box.item name="Skirt" label="Gonna"/>
- <combo_box.item name="SculptedPrim" label="Oggetto sculpt"/>
+ <combo_box label="Tipo d&apos;abito" left="120" name="clothing_type_combo" width="166">
+ <combo_box.item label="Immagine" name="Image"/>
+ <combo_box.item label="Capelli" name="Hair"/>
+ <combo_box.item label="Testa Femminile" name="FemaleHead"/>
+ <combo_box.item label="Corpo Femminile Superiore" name="FemaleUpperBody"/>
+ <combo_box.item label="Corpo Femminile Inferiore" name="FemaleLowerBody"/>
+ <combo_box.item label="Testa Maschile" name="MaleHead"/>
+ <combo_box.item label="Corpo Maschile Superiore" name="MaleUpperBody"/>
+ <combo_box.item label="Corpo Maschile Inferiore" name="MaleLowerBody"/>
+ <combo_box.item label="Gonna" name="Skirt"/>
+ <combo_box.item label="Sculpted Prim" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Non è stato possibile leggere l&apos;immagine.
diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
new file mode 100644
index 0000000000..fc7b8de6f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA&apos; CHIAMANDO">
+ <floater.string name="localchat">
+ Voice Chat nei dintorni
+ </floater.string>
+ <floater.string name="anonymous">
+ anonimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ stà chiamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha aggiunto una chiamata in Voice Chat ad una conferenza in chat.
+ </floater.string>
+ <text name="question">
+ Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat?
+ </text>
+ <button label="Accetta" label_selected="Accetta" name="Accept"/>
+ <button label="Rifiuta" label_selected="Rifiuta" name="Reject"/>
+ <button label="Inizia IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inspect.xml b/indra/newview/skins/default/xui/it/floater_inspect.xml
index 6028c40557..bae993d2be 100644
--- a/indra/newview/skins/default/xui/it/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/it/floater_inspect.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="Ispeziona oggetti" min_width="450">
+<floater min_width="450" name="inspect" title="ISPEZIONA OGGETTI">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Seleziona un oggetto da questo elenco per evidenziarlo inworld">
- <column label="Nome dell&apos;oggetto" name="object_name"/>
- <column label="Proprietario" name="owner_name"/>
- <column label="Creatore" name="creator_name"/>
- <column label="Data di creazione" name="creation_date"/>
+ <scroll_list.columns label="Nome dell&apos;oggetto" name="object_name"/>
+ <scroll_list.columns label="Proprietario" name="owner_name"/>
+ <scroll_list.columns label="Creatore" name="creator_name"/>
+ <scroll_list.columns label="Data di creazione" name="creation_date"/>
</scroll_list>
- <button width="185" label="Vedi il profilo del proprietario..." label_selected="" name="button owner" tool_tip="Vedi il profilo del proprietario dell&apos;oggetto evidenziato"/>
- <button width="165" left="205" label="Vedi il profilo del creatore..." label_selected="" name="button creator" tool_tip="Vedi il profilo del creatore originale dell&apos;oggetto evidenziato"/>
+ <button label="Vedi il profilo del proprietario..." label_selected="" name="button owner" tool_tip="Vedi il profilo del proprietario dell&apos;oggetto evidenziato" width="185"/>
+ <button label="Vedi il profilo del creatore..." label_selected="" left="205" name="button creator" tool_tip="Vedi il profilo del creatore originale dell&apos;oggetto evidenziato" width="165"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory.xml b/indra/newview/skins/default/xui/it/floater_inventory.xml
index f21f213497..5049bb3e58 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Inventario">
- <search_editor label="Scrivi qui per cercare" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Tutti gli elementi" name="All Items"/>
- <inventory_panel label="Elementi recenti" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="File" name="File">
- <menu_item_call label="Apri" name="Open"/>
- <menu_item_call label="Nuova finestra" name="New Window"/>
- <menu_item_call label="Mostra Filtri" name="Show Filters"/>
- <menu_item_call label="Azzera Filtri" name="Reset Current"/>
- <menu_item_call label="Chiudi tutte le cartelle" name="Close All Folders"/>
- <menu_item_call label="Svuota Cestino" name="Empty Trash"/>
- </menu>
- <menu label="Crea" name="Create">
- <menu_item_call label="Nuova Cartella" name="New Folder"/>
- <menu_item_call label="Nuovo Script" name="New Script"/>
- <menu_item_call label="Nuova Nota" name="New Note"/>
- <menu_item_call label="Nuova Gesture" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Nuova Camicia" name="New Shirt"/>
- <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove Calze" name="New Socks"/>
- <menu_item_call label="Nuova Giacca" name="New Jacket"/>
- <menu_item_call label="Nuova Gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
- <menu_item_call label="Nuova Canottiera" name="New Undershirt"/>
- <menu_item_call label="Nuove Mutande" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Nuova Forma del Corpo" name="New Shape"/>
- <menu_item_call label="Nuova Pelle" name="New Skin"/>
- <menu_item_call label="Nuovi Capelli" name="New Hair"/>
- <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordinamento" name="Sort">
- <menu_item_check label="Per nome" name="By Name"/>
- <menu_item_check label="Per data" name="By Date"/>
- <menu_item_check label="Cartelle sempre per nome" name="Folders Always By Name"/>
- <menu_item_check label="Cartelle di sistema sempre in cima" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="INVENTARIO">
+ <floater.string name="Title">
+ Inventario
+ </floater.string>
+ <floater.string name="TitleFetching">
+ Inventario (Fetching [ITEM_COUNT] Items...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ Inventario ([ITEM_COUNT] Items) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Raggiunto ??????????
+ </floater.string>
+ <panel label="Pannello dell&apos;Inventario" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
index e32f57e9f4..aaf7b71656 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="Proprietà dell&apos;oggetto nell&apos;inventario">
+<floater name="item properties" title="CARATTERISTICHE DELL&apos;ARTICOLO IN INVENTARIO">
+ <floater.string name="unknown">
+ (sconosciuto)
+ </floater.string>
+ <floater.string name="public">
+ (pubblico)
+ </floater.string>
+ <floater.string name="you_can">
+ Tu puoi:
+ </floater.string>
+ <floater.string name="owner_can">
+ Il proprietario può:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nome:
</text>
@@ -27,55 +42,32 @@
Wed May 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Tu puoi:
- </text>
- <check_box label="Modificare" name="CheckOwnerModify"/>
- <check_box left_delta="88" label="Copiare" name="CheckOwnerCopy"/>
- <check_box label="Rivendere/Regalare" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- O:
+ Tu:
</text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Modifica" name="CheckOwnerModify"/>
+ <check_box label="Copiare" left_delta="88" name="CheckOwnerCopy"/>
+ <check_box label="Rivendi" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Chiunque:
</text>
- <text name="EveryoneMaskDebug">
- E:
+ <check_box label="Copia" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppo:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Condividi con il gruppo" name="CheckShareWithGroup"/>
- <check_box label="Permetti a tutti di copiare" name="CheckEveryoneCopy"/>
+ <check_box label="Condividi" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- Il prossimo proprietario può:
- </text>
- <check_box label="Modificare" name="CheckNextOwnerModify"/>
- <check_box left_delta="88" label="Copiare" name="CheckNextOwnerCopy"/>
- <check_box label="Rivendere/Regalare" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Metti l&apos;oggetto:
+ Prossimo Proprietario:
</text>
+ <check_box label="Modifica" name="CheckNextOwnerModify"/>
+ <check_box label="Copiare" left_delta="88" name="CheckNextOwnerCopy"/>
+ <check_box label="Rivendi" name="CheckNextOwnerTransfer"/>
<check_box label="In vendita" name="CheckPurchase"/>
- <radio_group name="RadioSaleType" left_delta="88" >
- <radio_item name="radio" label="Originale" />
- <radio_item name="radio2" label="Copia" />
- </radio_group>
- <text name="TextPrice">
- Prezzo: L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Originale" name="Original"/>
+ </combo_box>
+ <spinner label="Prezzo:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (sconosciuto)
- </string>
- <string name="public">
- (pubblico)
- </string>
- <string name="you_can">
- Tu puoi:
- </string>
- <string name="owner_can">
- Il proprietario può:
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
index c2c05b4023..b5a17b2fc1 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="Inventario_Cose_recenti" width="165">
+<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI" width="165">
<check_box label="Animazioni" name="check_animation"/>
<check_box label="Biglietti da visita" name="check_calling_card"/>
<check_box label="Abiti" name="check_clothing"/>
diff --git a/indra/newview/skins/default/xui/it/floater_joystick.xml b/indra/newview/skins/default/xui/it/floater_joystick.xml
index b7b7663910..3eff0cfceb 100644
--- a/indra/newview/skins/default/xui/it/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/it/floater_joystick.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Configurazione Joystick">
- <check_box name="enable_joystick" label="Abilita Joystick:"/>
+<floater name="Joystick" title="CONFIGURAZIONE JOYSTICK">
+ <check_box label="Abilita Joystick:" name="enable_joystick"/>
<text left="120" name="joystick_type" width="380"/>
- <spinner label="Mapping: asse X" name="JoystickAxis1" label_width="140" width="180" left="12"/>
- <spinner label="Mapping: asse Y" name="JoystickAxis2" label_width="134" width="174" left="205"/>
- <spinner label="Mapping: asse Z" name="JoystickAxis0" label_width="94" width="134" left="390"/>
- <spinner label="Mapping: direzione o Pitch" name="JoystickAxis4" label_width="140" width="180" left="12"/>
- <spinner label="Mapping: altitudine o Yaw" name="JoystickAxis5" label_width="134" width="174" left="205"/>
- <spinner label="Mapping del Roll" name="JoystickAxis3" label_width="94" width="134" left="390"/>
- <spinner label="Mapping dello Zoom" name="JoystickAxis6" label_width="140" width="180" left="12"/>
- <check_box label="Zoom diretto" name="ZoomDirect" left="205"/>
+ <spinner label="Mapping: asse X" label_width="140" left="12" name="JoystickAxis1" width="180"/>
+ <spinner label="Mapping: asse Y" label_width="134" left="205" name="JoystickAxis2" width="174"/>
+ <spinner label="Mapping: asse Z" label_width="94" left="390" name="JoystickAxis0" width="134"/>
+ <spinner label="Mapping: direzione o Pitch" label_width="140" left="12" name="JoystickAxis4" width="180"/>
+ <spinner label="Mapping: altitudine o Yaw" label_width="134" left="205" name="JoystickAxis5" width="174"/>
+ <spinner label="Mapping del Roll" label_width="94" left="390" name="JoystickAxis3" width="134"/>
+ <spinner label="Mapping dello Zoom" label_width="140" left="12" name="JoystickAxis6" width="180"/>
+ <check_box label="Zoom diretto" left="205" name="ZoomDirect"/>
<check_box label="Cursore 3D" name="Cursor3D"/>
<check_box label="Auto livellamento" name="AutoLeveling"/>
- <text name="Control Modes:" left="3" width="113">
+ <text left="3" name="Control Modes:" width="113">
Modalità di controllo:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" left="192" label="Costruire"/>
- <check_box name="JoystickFlycamEnabled" label="Camera dall&apos;alto"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Costruire" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Camera dall&apos;alto" name="JoystickFlycamEnabled"/>
<text name="XScale">
Regolazione X
</text>
@@ -27,13 +27,13 @@
<text name="ZScale">
Regolazione Z
</text>
- <text name="PitchScale" left="3" width="112">
+ <text left="3" name="PitchScale" width="112">
Regolazione: Pitch
</text>
- <text name="YawScale" left="3" width="112">
+ <text left="3" name="YawScale" width="112">
Regolazione: Yaw
</text>
- <text name="RollScale" left="3" width="112">
+ <text left="3" name="RollScale" width="112">
Regolazione: Roll
</text>
<text name="XDeadZone">
@@ -45,22 +45,22 @@
<text name="ZDeadZone">
Angolo morto Z
</text>
- <text name="PitchDeadZone" left="3" width="112">
+ <text left="3" name="PitchDeadZone" width="112">
Angolo morto: Pitch
</text>
- <text name="YawDeadZone" left="3" width="112">
+ <text left="3" name="YawDeadZone" width="112">
Angolo morto: Yaw
</text>
- <text name="RollDeadZone" left="3" width="112">
+ <text left="3" name="RollDeadZone" width="112">
Angolo morto: Roll
</text>
<text name="Feathering">
Smussamento
</text>
- <text name="ZoomScale2" width="135" left="6">
+ <text left="6" name="ZoomScale2" width="135">
Regolazione dello zoom
</text>
- <text name="ZoomDeadZone" width="135" left="6">
+ <text left="6" name="ZoomDeadZone" width="135">
Angolo morto dello zoom
</text>
<button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
index af70ad9d31..93bf11b069 100644
--- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
@@ -1,155 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Misuratore del lag">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/>
- <text left="30" name="client_lag_cause" right="-10" />
- <text left="30" name="network_lag_cause" right="-10" />
- <text left="30" name="server_lag_cause" right="-32" />
- <text name="client">
- Programma in locale:
- </text>
- <text name="client_text" left="145" font="SansSerifSmall">
- Normale
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/>
- <text name="network">
- Network:
- </text>
- <text name="network_text" font="SansSerifSmall">
- Normale
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Stato del lag del server"/>
- <text name="server">
- Server:
- </text>
- <text name="server_text" font="SansSerifSmall">
- Normale
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="LAG METER">
+ <floater.string name="max_title_msg">
Misuratore del lag
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Programma in locale
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normale, finestra sullo sfondo
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Velocità dei frame al di sotto di [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Velocità dei frame tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normale
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Possibile causa: Campo visivo impostato troppo alto
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Possibile causa: Caricamento immagini
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Possibile causa: Troppe immagini in memoria
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Possibile causa: Troppi oggetti complessi intorno
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Network
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
La connessione sta calando al di sotto del [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
La connessione sta calando tra il [NETWORK_PACKET_LOSS_WARNING]% e il [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normale
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Il tempo di ping della connessione è al di sopra di [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Il tempo di ping della connessione è tra [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Possibile cattiva connessione o la larghezza di banda impostata nelle preferenze troppo alta.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Possibile cattiva connessione o l&apos;apertura di un programma di scambio files.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Server
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Velocità dei frame al di sotto di [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Velocità dei frame tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normale
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Possibile causa: troppi oggetti fisici
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Possibile causa: troppi oggetti scriptati
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Possibile causa: eccessivo traffico sulla rete
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Possibile causa: troppi residenti in movimento nella regione
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Possibile causa: troppe elaborazioni di immagini
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Possibile causa: carico eccessivo del simulatore
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/>
+ <text name="client">
+ Client
+ </text>
+ <text font="SansSerifSmall" left="145" name="client_text">
+ Normale
+ </text>
+ <text left="30" name="client_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/>
+ <text name="network">
+ Network
+ </text>
+ <text font="SansSerifSmall" name="network_text">
+ Normale
+ </text>
+ <text left="30" name="network_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Stato del lag del server"/>
+ <text name="server">
+ Server
+ </text>
+ <text font="SansSerifSmall" name="server_text">
+ Normale
+ </text>
+ <text left="30" name="server_lag_cause" right="-32"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Pulsante per minimizzare"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_land_holdings.xml b/indra/newview/skins/default/xui/it/floater_land_holdings.xml
index 85661c28d7..9f2884448d 100644
--- a/indra/newview/skins/default/xui/it/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/it/floater_land_holdings.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Il mio terreno">
+<floater name="land holdings floater" title="LA MIA TERRA">
<scroll_list name="parcel list">
- <column label="Nome del terreno" name="name"/>
+ <column label="Parcel" name="name"/>
<column label="Regione" name="location"/>
<column label="Tipo" name="type"/>
<column label="Area" name="area"/>
</scroll_list>
<button label="Teletrasportati" label_selected="Teletrasportati" name="Teleport" tool_tip="Teletrasportati al centro di questo terreno."/>
- <button width="130" label="Mostra sulla mappa" label_selected="Mostra sulla mappa" name="Show on Map" tool_tip="Mostra questo terreno sulla mappa."/>
+ <button label="Mappa" label_selected="Mappa" name="Show on Map" tool_tip="Mostra questa terra nella mappa del mondo" width="130"/>
<text name="contrib_label">
Contributi ai tuoi gruppi:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
index bb1f6116cf..d86b834c38 100644
--- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="Script: Nuovo script">
- <button label="Ripristina" label_selected="Ripristina" name="Reset"/>
- <check_box label="In esecuzione" name="running" left="4"/>
- <check_box label="Mono" name="mono" left="106"/>
- <string name="not_allowed">
- Non sei autorizzato a visualizzare questo script.
- </string>
- <string name="script_running">
+<floater name="script ed float" title="SCRIPT: NUOVO SCRIPT">
+ <floater.string name="not_allowed">
+ Non puoi vedere o modificare questo script, perchè è impostato come &quot;no copy&quot;. Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto.
+ </floater.string>
+ <floater.string name="script_running">
In esecuzione
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
+ <button label="Ripristina" label_selected="Ripristina" name="Reset"/>
+ <check_box initial_value="true" label="In esecuzione" left="4" name="running"/>
+ <check_box initial_value="true" label="Mono" left="106" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
index ec62dd087d..b699b280b6 100644
--- a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL Wiki">
+<floater name="script ed float" title="LSL WIKI">
<check_box label="Segui il cursore" name="lock_check"/>
- <combo_box label="Blocca" name="history_combo" left_delta="120" width="70"/>
- <button label="Indietro" name="back_btn" left_delta="75"/>
+ <combo_box label="Blocca" left_delta="120" name="history_combo" width="70"/>
+ <button label="Indietro" left_delta="75" name="back_btn"/>
<button label="Avanti" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml
index 4d3462b348..0e25cef60b 100644
--- a/indra/newview/skins/default/xui/it/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Browser multimediale">
+<floater name="floater_about" title="BROWSER MULTIMEDIALE">
+ <floater.string name="home_page_url">
+ http://it.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://it.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Indietro" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/it/floater_media_settings.xml b/indra/newview/skins/default/xui/it/floater_media_settings.xml
new file mode 100644
index 0000000000..b99a11b881
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="IMPOSTAZIONI MEDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancella" label_selected="Cancella" name="Cancel"/>
+ <button label="Applica" label_selected="Applica" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
index 4bd0e6ae6b..ee3d642fef 100644
--- a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Simulazione di perdità di memoria">
+<floater name="MemLeak" title="SIMULA UNA PERDITA DI MEMORIA">
<spinner label="Perdità di velocità (bytes per frame):" name="leak_speed"/>
<spinner label="Memoria Persa Max (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml
index 5bd84d48c8..edc5d9178d 100644
--- a/indra/newview/skins/default/xui/it/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/it/floater_moveview.xml
@@ -1,13 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Salta o vola in alto"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Inchinati o vola in basso"/>
- <joystick_slide name="slide left btn" tool_tip="Vai a sinistra"/>
- <joystick_slide name="slide right btn" tool_tip="Vai a destra"/>
- <joystick_turn name="forward btn" tool_tip="Vai avanti"/>
- <joystick_turn name="backward btn" tool_tip="Vai indietro"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Cammina in avanti (premi Freccia Sù o W)
+ </string>
+ <string name="walk_back_tooltip">
+ Cammina indietro (premi Freccia Giù o S)
+ </string>
+ <string name="run_forward_tooltip">
+ Corri in avanti (premi Freccia Sù o W)
+ </string>
+ <string name="run_back_tooltip">
+ Corri indietro (premi Freccia Giù o S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Vola in avanti (premi Freccia Sù o W)
+ </string>
+ <string name="fly_back_tooltip">
+ Vola indietro (premi Freccia Giù o S)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi Freccia Sinistra o A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi Freccia Destra o D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto, premi &quot;E&quot;"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso, premi &quot;C&quot;"/>
+ <joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi Freccia Sù o W)"/>
+ <joystick_turn name="backward btn" tool_tip="Cammina indietro (premi Freccia Giù o S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Modalità per camminare"/>
+ <button label="" name="mode_run_btn" tool_tip="Modalità per correre"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modalità di volo"/>
+ <button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_mute_object.xml b/indra/newview/skins/default/xui/it/floater_mute_object.xml
index 6bacdcab41..81cd46ec4d 100644
--- a/indra/newview/skins/default/xui/it/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_mute_object.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="Ignora l&apos;oggetto dal nome">
+<floater name="mute by name" title="BLOCCA OGGETTO PER NOME">
<text name="message">
- Ignora per nome ha effetti sull&apos;oggetto in chat e IM, non
-nei suoni. Devi scrivere esattamente il nome dell&apos;oggetto.
+ Blocca un oggetto:
</text>
<line_editor name="object_name">
Nome dell&apos;oggetto
</line_editor>
+ <text name="note">
+ * Blocca solo il testo dell&apos;oggetto, non i suoni
+ </text>
<button label="OK" name="OK"/>
<button label="Annulla" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_my_friends.xml b/indra/newview/skins/default/xui/it/floater_my_friends.xml
index a77b8aff80..faeba0a6d9 100644
--- a/indra/newview/skins/default/xui/it/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/it/floater_my_friends.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_my_friends" title="Contatti">
+<floater name="floater_my_friends" title="CONTATTI">
<tab_container name="friends_and_groups">
<panel label="Amici" name="friends_panel"/>
<panel label="Gruppi" name="groups_panel"/>
diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
new file mode 100644
index 0000000000..364b62fbdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT VICINA"/>
diff --git a/indra/newview/skins/default/xui/it/floater_openobject.xml b/indra/newview/skins/default/xui/it/floater_openobject.xml
index d04a6f3632..d8144c7cd5 100644
--- a/indra/newview/skins/default/xui/it/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/it/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="Contenuto dell&apos;oggetto">
+<floater name="objectcontents" title="CONTENUTO DEGLI OGGETTI">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_outgoing_call.xml b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml
new file mode 100644
index 0000000000..b4536e31cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="CHIAMANDO">
+ <floater.string name="localchat">
+ Voice Chat nei dintorni
+ </floater.string>
+ <floater.string name="anonymous">
+ anonimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ stà chiamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha aderito ad una chiamata Voice Chat con una chat in conferenza.
+ </floater.string>
+ <text name="connecting">
+ Connettendo a [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Chiamando [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Nessuna risposta. Per favore riprova più tardi.
+ </text>
+ <text name="leaving">
+ Abbandonando [CURRENT_CHAT].
+ </text>
+ <button label="Cancella" label_selected="Cancella" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 4889f97ec7..59004bbbd7 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -1,22 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="118" width="80" />
- <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="210"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="118" width="80" />
- <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="210"/>
- <button label="Paga" label_selected="Paga" name="pay btn" left="127"/>
- <button label="Annulla" label_selected="Annulla" name="cancel btn" left="210"/>
- <text name="payee_label" left="5" width="105">
- Paga residente:
+ <string name="payee_group">
+ Paga Gruppo
+ </string>
+ <string name="payee_resident">
+ Paga Residente
+ </string>
+ <text left="5" name="payee_label" width="105">
+ Paga:
</text>
- <text name="payee_name" left="115">
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="115" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text" width="110" halign="left">
- Pagamento veloce:
- </text>
- <text name="amount text" left="4" >
- Ammontare:
+ <button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/>
+ <button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" left="118" name="fastpay 10" width="80"/>
+ <button label="20 L$" label_selected="20 L$" left="210" name="fastpay 20"/>
+ <text left="4" name="amount text">
+ O, scegli importo:
</text>
<line_editor left="70" name="amount" width="49"/>
+ <button label="Paga" label_selected="Paga" left="127" name="pay btn"/>
+ <button label="Annulla" label_selected="Annulla" left="210" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay_object.xml b/indra/newview/skins/default/xui/it/floater_pay_object.xml
index c41c0ba41e..c51a2b7b31 100644
--- a/indra/newview/skins/default/xui/it/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay_object.xml
@@ -1,31 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="100" halign="left">
- Paga il gruppo:
- </text>
- <text name="payee_resident" width="120" halign="left">
- Paga il residente:
- </text>
- <text name="payee_name" left="120">
+ <string halign="left" name="payee_group" width="100">
+ Paga Gruppo
+ </string>
+ <string halign="left" name="payee_resident" width="120">
+ Pags Residente
+ </string>
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="120" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="110" halign="left">
+ <text halign="left" left="5" name="object_name_label" width="110">
Mediante l&apos;oggetto:
</text>
- <text name="object_name_text" left="120" >
+ <icon name="icon_object" tool_tip="Oggetti"/>
+ <text left="120" name="object_name_text">
...
</text>
- <text name="fastpay text" width="115" halign="left">
- Pagamento diretto:
- </text>
- <text name="amount text" left="5" halign="left">
- Ammontare:
+ <button label="1 L$" label_selected="1 L$" left="125" name="fastpay 1" width="70"/>
+ <button label="5 L$" label_selected="5 L$" left="200" name="fastpay 5" width="70"/>
+ <button label="10 L$" label_selected="10 L$" left="125" name="fastpay 10" width="70"/>
+ <button label="20 L$" label_selected="20 L$" left="200" name="fastpay 20" width="70"/>
+ <text halign="left" left="5" name="amount text">
+ O, scegli importo:
</text>
- <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="125" width="70"/>
- <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="200" width="70"/>
- <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="125" width="70"/>
- <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="200" width="70"/>
+ <line_editor left="74" name="amount" width="50"/>
<button label="Paga" label_selected="Paga" name="pay btn"/>
<button label="Cancella" label_selected="Cancella" name="cancel btn"/>
- <line_editor left="74" name="amount" width="50" />
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
index 8037481f37..67e4093951 100644
--- a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Permessi di base di importazione">
+<floater name="perm prefs" title="PERMESSI di UPLOAD in DEFAULT">
<panel label="Permessi" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Condividi con il gruppo" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/it/floater_post_process.xml b/indra/newview/skins/default/xui/it/floater_post_process.xml
index 226970041b..3aa8b29101 100644
--- a/indra/newview/skins/default/xui/it/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/it/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="Impostazioni di post-produzione">
+<floater name="Post-Process Floater" title="IMPOSTAZIONI DI POST-PRODUZIONE">
<tab_container name="Post-Process Tabs">
<panel label="Filtro Colore" name="wmiColorFilterPanel">
<check_box label="Abilita" name="wmiColorFilterToggle"/>
diff --git a/indra/newview/skins/default/xui/it/floater_postcard.xml b/indra/newview/skins/default/xui/it/floater_postcard.xml
index 5132771acc..de246db826 100644
--- a/indra/newview/skins/default/xui/it/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/it/floater_postcard.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="Invia la fotografia via email">
+<floater name="Postcard" title="ISTANTANEA IN EMAIL">
<text name="to_label" width="135">
Email del destinatario:
</text>
- <line_editor name="to_form" left="143" width="127" />
+ <line_editor left="143" name="to_form" width="127"/>
<text name="from_label">
La tua email:
</text>
- <line_editor name="from_form" left="143" width="127" />
+ <line_editor left="143" name="from_form" width="127"/>
<text name="name_label">
Il tuo nome:
</text>
- <line_editor name="name_form" left="143" width="127" />
+ <line_editor left="143" name="name_form" width="127"/>
<text name="subject_label">
Soggetto:
</text>
- <line_editor name="subject_form" left="143" width="127" />
+ <line_editor left="143" name="subject_form" width="127"/>
<line_editor label="Scrivi il soggetto qui." name="subject_form"/>
<text name="msg_label">
Messaggio:
@@ -29,12 +29,12 @@
<button label="Annulla" name="cancel_btn"/>
<button label="Invia" name="send_btn"/>
<string name="default_subject">
- Cartolina da [SECOND_LIFE]
+ Cartolina da [SECOND_LIFE].
</string>
<string name="default_message">
Vieni a vedere!
</string>
<string name="upload_message">
- In spedizione...
+ Spedendo...
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index 6277300bee..a76b9e3e27 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="Preferenze" min_width="350" width="646">
+<floater min_width="350" name="Preferences" title="PREFERENZE" width="646">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <button label="Applica" label_selected="Applica" name="Apply"/>
- <button label="Informazioni..." label_selected="Informazioni..." name="About..."/>
- <button label="Aiuto" label_selected="Aiuto" name="Help"/>
- <tab_container name="pref core" tab_width="146" width="646" />
+ <tab_container name="pref core" tab_width="146" width="646">
+ <panel label="Generale" name="general"/>
+ <panel label="Grafica" name="display"/>
+ <panel label="Privacy" name="im"/>
+ <panel label="Suono" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Notifiche" name="msgs"/>
+ <panel label="Configurazione" name="input"/>
+ <panel label="Avanzato" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_animation.xml b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
index e9e0252613..006198781b 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animazione: [NAME]
+ </floater.string>
<text name="desc txt">
Descrizione:
</text>
- <button left="20" width="131" label="Esegui inworld" label_selected="Ferma" name="Anim play btn" tool_tip="Esegui questa animazione così che altri possano vederla."/>
- <button left="162" width="125" label="Esegui localmente" label_selected="Ferma" name="Anim audition btn" tool_tip="Esegui questa animazione così che solo tu possa vederla."/>
+ <button label="Esegui inworld" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/>
+ <button label="Esegui localmente" label_selected="Ferma" left="162" name="Anim audition btn" tool_tip="Riproduci questa animazione così che solo tu possa vederla" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_classified.xml b/indra/newview/skins/default/xui/it/floater_preview_classified.xml
index f78c70b1fe..c617f81f7b 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_classified.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="Informazione Riservata"/>
+<floater name="classified_preview" title="INFORMAZIONI RISERVATE">
+ <floater.string name="Title">
+ Riservato: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_event.xml b/indra/newview/skins/default/xui/it/floater_preview_event.xml
index 7cc99a9fea..1e1653e758 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_event.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="Informazione sull&apos;evento"/>
+<floater name="event_preview" title="INFORMAZIONI SULL&apos;EVENTO">
+ <floater.string name="Title">
+ Evento: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 60d3a7710e..850f4c21ac 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -1,14 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animazione da riprodurre:
+ </floater.string>
+ <floater.string name="step_sound">
+ Suono da riprodurre:
+ </floater.string>
+ <floater.string name="step_chat">
+ Scrivi in chat per dire:
+ </floater.string>
+ <floater.string name="step_wait">
+ Attendi:
+ </floater.string>
+ <floater.string name="stop_txt">
Stop
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Anteprima
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Nulla --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesture: [NAME]
+ </floater.string>
<text name="desc_label">
Descrizione:
</text>
@@ -22,36 +37,29 @@
<text name="key_label">
Scorciatoia da tastiera:
</text>
- <combo_box label="Nessuno" name="modifier_combo" left="156" width="76"/>
- <combo_box label="Nessuno" name="key_combo" width="76" left_delta="80"/>
+ <combo_box label="Nessuno" left="156" name="modifier_combo" width="76"/>
+ <combo_box label="Nessuno" left_delta="80" name="key_combo" width="76"/>
<text name="library_label">
Libreria:
</text>
+ <scroll_list name="library_list"/>
+ <button label="Aggiungi &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Fasi:
</text>
- <scroll_list name="library_list">
- Animation
-Suono
-Chat
-Pausa
- </scroll_list>
- <button label="Aggiungi &gt;&gt;" name="add_btn"/>
- <button label="Vai su" name="up_btn"/>
- <button label="Vai giù" name="down_btn"/>
+ <button label="Sù" name="up_btn"/>
+ <button label="Giù" name="down_btn"/>
<button label="Elimina" name="delete_btn"/>
- <text name="help_label">
- Tutti i passi avvengono
-simultaneamente, a meno che tu
-non aggiunga pause.
- </text>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Avvio" />
- <radio_item name="stop" label="Stop" />
+ <radio_item label="Inizia" name="start"/>
+ <radio_item label="Stop" name="stop"/>
</radio_group>
- <check_box left="226" label="finché le animazioni sono eseguite" name="wait_anim_check"/>
+ <check_box label="finché le animazioni sono eseguite" left="226" name="wait_anim_check"/>
<check_box label="tempo in secondi" name="wait_time_check"/>
- <line_editor left_delta="114" name="wait_time_editor" />
+ <line_editor left_delta="114" name="wait_time_editor"/>
+ <text name="help_label">
+ Tutte le fasi avvengono simultaneamente, a meno che non aggiungi una fase attendi.
+ </text>
<check_box label="Attiva" name="active_check" tool_tip="Le gesture attivate possono essere eseguite scrivendo in chat la parola chiave o premendo i tasti chiave. Le gesture generalmente si disattivano quando c&apos;è un conflitto nei relativi tasti."/>
<button label="Anteprima" name="preview_btn"/>
<button label="Salva" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..660b868cae
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTURE SHORTCUT"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..942d5ed1ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="TASTO RAPIDO PER GESTURE">
+ <text name="trigger_label">
+ Chat:
+ </text>
+ <text name="key_label">
+ Tastiera:
+ </text>
+ <combo_box label="Nessuno" name="modifier_combo"/>
+ <combo_box label="Nessuno" name="key_combo"/>
+ <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave &apos;ciao&apos; sostituendo con &apos;buongiorno&apos; cambierà la chat da &apos;Io dico ciao&apos; in &apos;Io dico buongiorno&apos; non appena attiverete la gesture!">
+ Sostituisci:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave &apos;ciao&apos; sostituendo con &apos;buongiorno&apos; cambierà la chat da &apos;Io dico ciao&apos; in &apos;Io dico buongiorno&apos; non appena attiverete la gesture"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..7c1f55ddba
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="TASTO RAPIDO GESTURE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
index b0608c8546..08f5087242 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="Nota:">
- <button label="Salva" label_selected="Salva" name="Save"/>
+<floater name="preview notecard" title="NOTE:">
+ <floater.string name="no_object">
+ Impossibile trovare l&apos;oggetto che contiene questa nota.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Non hai i permessi per leggere questa nota.
+ </floater.string>
+ <floater.string name="Title">
+ Notecard: [NAME]
+ </floater.string>
+ <floater.string label="Salva" label_selected="Salva" name="Save">
+ Salva
+ </floater.string>
<text name="desc txt">
Descrizione:
</text>
<text_editor name="Notecard Editor">
In caricamento...
</text_editor>
- <string name="no_object">
- Impossibile trovare l&apos;oggetto che contiene questa nota.
- </string>
- <string name="not_allowed">
- Non ti è permesso vedere questa nota.
- </string>
+ <button label="Salva" label_selected="Salva" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_sound.xml b/indra/newview/skins/default/xui/it/floater_preview_sound.xml
index 5fd015f7fe..182243561c 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_sound.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Suono: [NAME]
+ </floater.string>
<text name="desc txt">
Descrizione:
</text>
- <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Avvia questo suono in modo che sia ascoltato solo da te."/>
- <button label="Avvia inworld" label_selected="Avvia inworld" name="Sound play btn" tool_tip="Avvia questo suono in modo che sia ascoltato da tutti."/>
+ <button label="Avvia inworld" label_selected="Avvia inworld" name="Sound play btn" tool_tip="Riproduci questo suono in modo che gli altri possano sentirlo"/>
+ <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Riproduci questo suono in modo che solo tu possa sentirlo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_texture.xml b/indra/newview/skins/default/xui/it/floater_preview_texture.xml
index e3232730e2..dd24079ea3 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_texture.xml
@@ -1,9 +1,44 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Texture: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copia nell&apos;Inventario
+ </floater.string>
<text name="desc txt">
Descrizione:
</text>
<text name="dimensions">
- Dimensioni: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Anteprima del rapporto d&apos;aspetto impostato">
+ <combo_item name="Unconstrained">
+ Libero
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Immagine del Gruppo o Profilo nel Mondo Reale">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] profilo">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Annunci ed elenco del Cerca, landmarks">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Info sul terreno">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Preferiti nel Profilo">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="keep"/>
+ <button label="Cancella" name="discard"/>
+ <button label="Salva come:" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_region_info.xml b/indra/newview/skins/default/xui/it/floater_region_info.xml
index a802550bf4..98808e4b55 100644
--- a/indra/newview/skins/default/xui/it/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/it/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="Regione/Proprietà"/>
+<floater name="regioninfo" title="REGIONE/PROPRIETA&apos;"/>
diff --git a/indra/newview/skins/default/xui/it/floater_report_abuse.xml b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
index c67fc69db6..a1e430b6b2 100644
--- a/indra/newview/skins/default/xui/it/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Denuncia di Abuso">
- <check_box label="Includi una fotografia" name="screen_check"/>
+<floater name="floater_report_abuse" title="DENUNCIA DI ABUSO">
+ <floater.string name="Screenshot">
+ Fotografia
+ </floater.string>
+ <check_box label="Utilizza questa fotografia" name="screen_check"/>
<text name="reporter_title">
Segnalato da:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Regione:
@@ -20,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Clicca sul pulsante e poi sull&apos;oggetto:
+ Clicca sul pulsante, poi sull&apos;oggetto offensivo:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Selezionatore di oggetti - Identifica un oggetto come argomento di questa segnalazione"/>
<text name="object_name_label">
- Nome:
+ Oggetto:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -33,54 +36,53 @@
Proprietario:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categoria -- scegli la categoria che descrive meglio questa segnalazione">
- <combo_box.item name="Select_category" label="Scegli la categoria"/>
- <combo_box.item name="Age__Age_play" label="Età &gt; Far finta di essere minore"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Età &gt; Residente adulto nella Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Età &gt; Residente minorenne al di fuori della &apos;Second Life per Teenager&apos;"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assalto &gt; sandbox da combattimento / area pericolosa"/>
- <combo_box.item name="Assault__Safe_area" label="Assalto &gt; Area sicura"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assalto &gt; Test di armi in sandbox"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Commercio &gt; Problema nella consegna di un prodotto o servizio"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Divulgazione &gt; Informazioni del mondo reale"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Divulgazione &gt; Monitoraggio remoto di chat"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Divulgazione &gt; Informazione/chat/IMs di Second Life"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Disturbo della quiete &gt; Uso sleale delle risorse di una regione"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Disturbo della quiete &gt; Numero eccessivo di oggetti scriptati"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Disturbo della quiete &gt; Oggetti messi a soqquadro"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Disturbo della quiete &gt; Spam continuato"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Disturbo della quiete &gt; Spam pubblicitario non richiesto"/>
- <combo_box.item name="Fraud__L$" label="Truffa &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Truffa &gt; Terreno"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Truffa &gt; Multilivello o catena di Sant&apos;Antonio"/>
- <combo_box.item name="Fraud__US$" label="Truffa &gt; Dollari US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Molestie &gt; Territori adibiti a pubblicità / spam visivo"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Molestie &gt; Diffamazione di individui o gruppi"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Molestie &gt; Impedimento di movimenti"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Molestie &gt; Molestie sessuali"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Molestie &gt; Sollecitare/incitare altri a violare i Termini di Servizio"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Molestie &gt; Abusi verbali"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecenza &gt; Condotta o contenuti largamente offensivi"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecenza &gt; Nome di un avatar inappropriato"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecenza &gt; Contenuto o condotta inappropriata in una regione PG"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecenza &gt; Contenuto o condotta inappropriata in una regione Mature"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violazione della proprietà intellettuale &gt; Rimozione contenuti"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violazione della proprietà intellettuale &gt; CopyBot o sblocco di permessi"/>
- <combo_box.item name="Intolerance" label="Intolleranza"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terreno &gt; Abuso delle risorse di una sandbox"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terreno &gt; Invasione &gt; Oggetti/textures"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Terreno &gt; Invasione &gt; Particelle"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terreno &gt; Invasione &gt; Alberi/piante"/>
- <combo_box.item name="Wagering_gambling" label="Chiedere l&apos;elemosina/gioco d&apos;azzardo"/>
- <combo_box.item name="Other" label="Altro"/>
+ <combo_box.item label="Scegli la categoria" name="Select_category"/>
+ <combo_box.item label="Età &gt; Far finta di essere minore" name="Age__Age_play"/>
+ <combo_box.item label="Età &gt; Residente adulto nella Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Età &gt; Residente minorenne al di fuori della &apos;Second Life per Teenager&apos;" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assalto &gt; sandbox da combattimento / area pericolosa" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assalto &gt; Area sicura" name="Assault__Safe_area"/>
+ <combo_box.item label="Assalto &gt; Test di armi in sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Commercio &gt; Problema nella consegna di un prodotto o servizio" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Divulgazione &gt; Informazioni del mondo reale" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Divulgazione &gt; Monitoraggio remoto di chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Divulgazione &gt; Informazione/chat/IMs di Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Disturbo della quiete &gt; Uso sleale delle risorse di una regione" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Disturbo della quiete &gt; Numero eccessivo di oggetti scriptati" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Disturbo della quiete &gt; Oggetti messi a soqquadro" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Disturbo della quiete &gt; Spam continuato" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Disturbo della quiete &gt; Spam pubblicitario non richiesto" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Truffa &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Truffa &gt; Terreno" name="Fraud__Land"/>
+ <combo_box.item label="Truffa &gt; Multilivello o catena di Sant&apos;Antonio" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Truffa &gt; Dollari US$" name="Fraud__US$"/>
+ <combo_box.item label="Molestie &gt; Territori adibiti a pubblicità / spam visivo" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Molestie &gt; Diffamazione di individui o gruppi" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Molestie &gt; Impedimento di movimenti" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Molestie &gt; Molestie sessuali" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Molestie &gt; Sollecitare/incitare altri a violare i Termini di Servizio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Molestie &gt; Abusi verbali" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecenza &gt; Condotta o contenuti largamente offensivi" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecenza &gt; Nome di un avatar inappropriato" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Violazione della proprietà intellettuale &gt; Rimozione contenuti" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Violazione della proprietà intellettuale &gt; CopyBot o sblocco di permessi" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolleranza" name="Intolerance"/>
+ <combo_box.item label="Terreno &gt; Abuso delle risorse di una sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terreno &gt; Invasione &gt; Oggetti/textures" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terreno &gt; Invasione &gt; Particelle" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terreno &gt; Invasione &gt; Alberi/piante" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Chiedere l&apos;elemosina/gioco d&apos;azzardo" name="Wagering_gambling"/>
+ <combo_box.item label="Altro" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nome di chi ha commesso l&apos;abuso:
</text>
<button label="Scegli un residente" label_selected="" name="select_abuser" tool_tip="Scegli il nome di chi ha commesso l&apos;abuso dalla lista"/>
- <check_box label="Non conosco il nome di chi ha fatto l&apos;abuso" name="omit_abuser_name" tool_tip="Metti qui la spunta se non sei in grado di fornire il nome di chi ha fatto l&apos;abuso"/>
<text name="abuser_name_title2">
Luogo dell&apos;abuso:
</text>
@@ -91,13 +93,11 @@
Dettagli:
</text>
<text name="bug_aviso">
- Ti preghiamo di essere circostanziato riguardo data,
-luogo, natura dell&apos;abuso, testo rilevante di chat/IM, e,
-se possibile, indica l&apos;oggetto.
+ Specifica data, luogo, natura dell&apos;abuso, testo rilevante di chat/IM, e se possibile indica l&apos;oggetto.
</text>
<text name="incomplete_title">
- Nota: Segnalazioni incomplete non saranno esaminate.
+ * Nota: segnalazioni incomplete non saranno esaminate
</text>
- <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
<button label="Segnala abuso" label_selected="Segnala abuso" name="send_btn"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_script_debug.xml b/indra/newview/skins/default/xui/it/floater_script_debug.xml
index 39736dde67..89bf80da5e 100644
--- a/indra/newview/skins/default/xui/it/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="script debug floater" title="Avvisi/Errori Script">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[Tutti gli script]"/>
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/it/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/it/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/it/floater_script_preview.xml b/indra/newview/skins/default/xui/it/floater_script_preview.xml
index 20af60b2d4..9428297397 100644
--- a/indra/newview/skins/default/xui/it/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_preview.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="Script: Script di rotazione">
+<floater name="preview lsl text" title="SCRIPT: SCRIPT DI ROTAZIONE">
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
<text name="desc txt">
Descrizione:
</text>
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 e5b38fea62..728fbe8c8d 100644
--- a/indra/newview/skins/default/xui/it/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_queue.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="Progressione reset">
+<floater name="queue" title="RESETTA IL PROGRESSO">
+ <floater.string name="Starting">
+ Conteggio [START] degli [COUNT] articoli.
+ </floater.string>
+ <floater.string name="Done">
+ Eseguito.
+ </floater.string>
+ <floater.string name="Resetting">
+ Resettando
+ </floater.string>
+ <floater.string name="Running">
+ In esecuzione
+ </floater.string>
+ <floater.string name="NotRunning">
+ Non in esecuzione
+ </floater.string>
<button label="Chiudi" label_selected="Chiudi" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_script_search.xml b/indra/newview/skins/default/xui/it/floater_script_search.xml
index 470fb76135..3d0b02877e 100644
--- a/indra/newview/skins/default/xui/it/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="Cerca Script" width="320">
- <check_box label="Senza distinzione tra maiuscole e minuscole" name="case_text" left="65"/>
+<floater name="script search" title="CERCA SCRIPT" width="320">
+ <check_box label="Senza distinzione tra maiuscole e minuscole" left="65" name="case_text"/>
<button label="Cerca" label_selected="Cerca" name="search_btn" width="85"/>
- <button label="Sostituisci" label_selected="Sostituisci" name="replace_btn" left="100" width="85"/>
- <button label="Sostituisci tutto" label_selected="Sostituisci tutto" name="replace_all_btn" left="190" width="122"/>
+ <button label="Sostituisci" label_selected="Sostituisci" left="100" name="replace_btn" width="85"/>
+ <button label="Sostituisci tutto" label_selected="Sostituisci tutto" left="190" name="replace_all_btn" width="122"/>
<text name="txt" width="60">
Cerca
</text>
<text name="txt2" width="60">
Sostituisci
</text>
- <line_editor left="65" name="search_text" width="240" />
- <line_editor left="65" name="replace_text" width="240" />
+ <line_editor left="65" name="search_text" width="240"/>
+ <line_editor left="65" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml
new file mode 100644
index 0000000000..6afdd2437e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="TROVA">
+ <floater.string name="loading_text">
+ Caricando...
+ </floater.string>
+ <floater.string name="done_text">
+ Eseguito
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_select_key.xml b/indra/newview/skins/default/xui/it/floater_select_key.xml
index 04a7726497..181b7d5292 100644
--- a/indra/newview/skins/default/xui/it/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/it/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<text name="Save item as:">
- Premi un tasto per selezionare
+ clicca un tasto per impostare la modalità PARLA con il tuo pulsante.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml
index 79dd2c5abf..2a4fa05b54 100644
--- a/indra/newview/skins/default/xui/it/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="Vendi terra">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Terreno:
- </text>
- <text name="info_parcel" left="82">
- NOME APPEZZAMENTO
- </text>
- <text name="info_size_label">
- Dimensioni:
- </text>
- <text name="info_size" left="82">
- [AREA] m²
- </text>
- <text height="28" name="info_action" bottom_delta="-57">
- Per vendere questo
-terreno:
- </text>
- <icon bottom_delta="-86" name="step_price" />
- <text name="price_label">
- Imposta prezzo:
- </text>
- <text name="price_text">
- Scegli un prezzo appropriato per questa terra.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER] L$ per metro quadro)
- </text>
- <text name="sell_to_label">
- Vendi la terra a:
- </text>
- <text name="sell_to_text">
- Scegli se vendere a tutti o ad un compratore in particolare.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="selezionane uno --"/>
- <combo_box.item name="Anyone" label="Chiunque"/>
- <combo_box.item name="Specificuser:" label="Utente specifico:"/>
- </combo_box>
- <button label="Seleziona..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- Vendi gli oggetti con la terra?
- </text>
- <text name="sell_objects_text">
- Gli oggetti trasferibili del proprietario della terra sul terreno
-cambieranno proprietario.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58" >
- <radio_item name="no" label="No, voglio mantenere la proprietà degli oggetti" />
- <radio_item name="yes" label="Si, vendi gli oggetti con la terra" />
- </radio_group>
- <button label="Mostra oggetti" name="show_objects"/>
- <text name="nag_message_label">
- RICORDA: tutte le vendite sono definitive.
- </text>
- <button label="Metti la terra in vendita" name="sell_btn"/>
- <button label="Annulla" name="cancel_btn"/>
- </panel>
- </scroll_container>
+<floater name="sell land" title="VENDI LA TERRA">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parcel:
+ </text>
+ <text left="82" name="info_parcel">
+ NOME DEL PARCEL
+ </text>
+ <text name="info_size_label">
+ Misura:
+ </text>
+ <text left="82" name="info_size">
+ [AREA] m²
+ </text>
+ <text bottom_delta="-57" height="28" name="info_action">
+ Vendere questo parcel:
+ </text>
+ <text name="price_label">
+ 1. Imposta un prezzo:
+ </text>
+ <text name="price_text">
+ Scegli un prezzo adeguato.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] per m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vendi la terra a:
+ </text>
+ <text name="sell_to_text">
+ Scegli se vendere a chiunque o ad un specifico compratore.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Seleziona uno -" name="--selectone--"/>
+ <combo_box.item label="Chiunque" name="Anyone"/>
+ <combo_box.item label="Persona Specifica:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Seleziona" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Vendi gli oggetti con la terra?
+ </text>
+ <text name="sell_objects_text">
+ Gli oggetti trasferibili del proprietaio della Terra cambieranno proprietà.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="No, mantieni la proprietà sugli oggetti" name="no"/>
+ <radio_item label="Si, vendi gli oggetti con la terra" name="yes"/>
+ </radio_group>
+ <button label="Mostra Oggetti" name="show_objects"/>
+ <text name="nag_message_label">
+ RICORDA: Tutte le vendite sono definitive.
+ </text>
+ <button label="Imposta Terra in Vendita" name="sell_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
index 6dd1b7978d..385a7ed6e9 100644
--- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="Configurazioni per il debug">
+<floater name="settings_debug" title="DEBUG SETTINGS">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="VERO"/>
- <combo_box.item name="FALSE" label="FALSO"/>
+ <combo_box.item label="VERO" name="TRUE"/>
+ <combo_box.item label="FALSO" name="FALSE"/>
</combo_box>
- <color_swatch label="Colore" name="color_swatch"/>
+ <color_swatch label="Colore" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml
index 808158ff7e..668c3c8c9e 100644
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Anteprima della fotografia" width="247">
+<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA" width="247">
<text name="type_label">
Destinazione della fotografia
</text>
<radio_group label="Tipo di fotografia" name="snapshot_type_radio" width="228">
- <radio_item name="postcard" label="Invia via email" />
- <radio_item name="texture" label="Salva nel tuo inventario ([AMOUNT] L$)" />
- <radio_item name="local" label="Salva sul tuo pc" />
+ <radio_item label="Invia via email" name="postcard"/>
+ <radio_item label="Salva nel tuo inventario ([AMOUNT] L$)" name="texture"/>
+ <radio_item label="Salva sul tuo pc" name="local"/>
</radio_group>
<text name="file_size_label">
Grandezza del file: [SIZE] KB
@@ -14,13 +14,13 @@
<button label="Aggiorna la fotografia" name="new_snapshot_btn"/>
<button label="Invia" name="send_btn"/>
<button label="Salva ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Salva" name="save_btn" tool_tip="Salva l&apos;immagine come file" >
- <flyout_button_item name="save_item" label="Salva"/>
- <flyout_button_item name="saveas_item" label="Salva come..."/>
+ <flyout_button label="Salva" name="save_btn" tool_tip="Salva l&apos;immagine come file">
+ <flyout_button_item label="Salva" name="save_item"/>
+ <flyout_button_item label="Salva come..." name="saveas_item"/>
</flyout_button>
<button label="Annulla" name="discard_btn"/>
- <button label="Espandi &gt;&gt;" name="more_btn" tool_tip="Opzioni avanzate"/>
- <button label="&lt;&lt; Diminuisci" name="less_btn" tool_tip="Opzioni avanzate"/>
+ <button label="Espandi &gt;&gt;" name="more_btn" tool_tip="Opzioni Avanzate"/>
+ <button label="&lt;&lt; Diminuisci" name="less_btn" tool_tip="Opzioni Avanzate"/>
<text name="type_label2">
Grandezza
</text>
@@ -28,50 +28,51 @@
Formato
</text>
<combo_box label="Risoluzione" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Finestra corrente"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Personalizzata"/>
+ <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizzata" name="Custom"/>
</combo_box>
<combo_box label="Risoluzione" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Finestra corrente"/>
- <combo_box.item name="Small(128x128)" label="Piccola (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Media (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Larga (512x512)"/>
- <combo_box.item name="Custom" label="Personalizzata"/>
+ <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
+ <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Larga (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizzata" name="Custom"/>
</combo_box>
<combo_box label="Risoluzione" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Finestra corrente"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Personalizzata"/>
+ <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizzata" name="Custom"/>
</combo_box>
<combo_box label="Formato" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Larghezza" name="snapshot_width" label_width="58" width="116"/>
- <spinner label="Altezza" name="snapshot_height" label_width="41" width="101" left="130"/>
+ <spinner label="Larghezza" label_width="58" name="snapshot_width" width="116"/>
+ <spinner label="Altezza" label_width="41" left="130" name="snapshot_height" width="101"/>
<check_box label="Mantieni le proporzioni" name="keep_aspect_check"/>
<slider label="Qualità d&apos;immagine" name="image_quality_slider"/>
<text name="layer_type_label" width="55">
Fotografa:
</text>
- <combo_box label="Layer dell&apos;immagine" name="layer_types" left="68" width="165">
- <combo_box.item name="Colors" label="Colori"/>
- <combo_box.item name="Depth" label="Profondità"/>
- <combo_box.item name="ObjectMattes" label="Colori primari degli oggetti"/>
+ <combo_box label="Layer dell&apos;immagine" left="68" name="layer_types" width="165">
+ <combo_box.item label="Colori" name="Colors"/>
+ <combo_box.item label="Profondità" name="Depth"/>
+ <combo_box.item label="Colori primari degli oggetti" name="ObjectMattes"/>
</combo_box>
<check_box label="Mostra l&apos;interfaccia nella fotografia" name="ui_check"/>
<check_box bottom_delta="-17" label="Mostra i dispositivi indossati nella foto" name="hud_check"/>
<check_box bottom_delta="-17" label="Mantieni aperto dopo aver salvato" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Blocca l&apos;anteprima &#10;(Anteprima a schermo intero)" name="freeze_frame_check"/>
+ <check_box bottom_delta="-17" label="Blocca l&apos;anteprima
+(Anteprima a schermo intero)" name="freeze_frame_check"/>
<check_box bottom_delta="-29" label="Auto-Aggiorna" name="auto_snapshot_check"/>
<string name="unknown">
sconosciuto
diff --git a/indra/newview/skins/default/xui/it/floater_sound_preview.xml b/indra/newview/skins/default/xui/it/floater_sound_preview.xml
index 8611732983..221e5e5b53 100644
--- a/indra/newview/skins/default/xui/it/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="sound.wav">
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
Nome:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_statistics.xml b/indra/newview/skins/default/xui/it/floater_statistics.xml
index 6083949b8c..00df1ff994 100644
--- a/indra/newview/skins/default/xui/it/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/it/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statistiche"/>
+<floater name="stats floater" title="STATISTICHE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
new file mode 100644
index 0000000000..7c8e6ba1a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTICHE">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Base" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Larghezza Banda" name="bandwidth"/>
+ <stat_bar label="Perdita Pacchetti" name="packet_loss"/>
+ <stat_bar label="Tempo Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avanzato" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris Disegnate" name="ktrisframe"/>
+ <stat_bar label="KTris Disegnate" name="ktrissec"/>
+ <stat_bar label="Totale Oggetti" name="objs"/>
+ <stat_bar label="Nuovi Oggetti" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Conteggio" name="numimagesstat"/>
+ <stat_bar label="Conteggio Grezzo" name="numrawimagesstat"/>
+ <stat_bar label="Memoria GL" name="gltexmemstat"/>
+ <stat_bar label="Memoria Formattata" name="formattedmemstat"/>
+ <stat_bar label="Memoria Complessiva" name="rawmemstat"/>
+ <stat_bar label="Memoria Impegnata" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Rete" name="network">
+ <stat_bar label="Pacchetti In Ingresso" name="packetsinstat"/>
+ <stat_bar label="Pacchetti In Uscita" name="packetsoutstat"/>
+ <stat_bar label="Oggetti" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Risorse Server" name="assetkbitstat"/>
+ <stat_bar label="Layer" name="layerskbitstat"/>
+ <stat_bar label="Effettivi In Ingresso" name="actualinkbitstat"/>
+ <stat_bar label="Effettivi in Uscita" name="actualoutkbitstat"/>
+ <stat_bar label="Operazioni pendenti VFS" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulatore" name="sim">
+ <stat_bar label="Dilatazione temporale" name="simtimedilation"/>
+ <stat_bar label="FPS Sim" name="simfps"/>
+ <stat_bar label="FPS Motore Fisico" name="simphysicsfps"/>
+ <stat_view label="Dettagli Motore Fisico" name="physicsdetail">
+ <stat_bar label="Oggetti Pinzati" name="physicspinnedtasks"/>
+ <stat_bar label="Oggetti a basso LOD" name="physicslodtasks"/>
+ <stat_bar label="Memoria Allocata" name="physicsmemoryallocated"/>
+ <stat_bar label="Agenti Aggiornamenti al Sec" name="simagentups"/>
+ <stat_bar label="Agenti Principali" name="simmainagents"/>
+ <stat_bar label="Agenti Figli" name="simchildagents"/>
+ <stat_bar label="Oggetti" name="simobjects"/>
+ <stat_bar label="Oggetti Attivi" name="simactiveobjects"/>
+ <stat_bar label="Script Attivi" name="simactivescripts"/>
+ <stat_bar label="Eventi Script" name="simscripteps"/>
+ <stat_bar label="Pacchetti In Ingresso" name="siminpps"/>
+ <stat_bar label="Pacchetti In Uscita" name="simoutpps"/>
+ <stat_bar label="Download Pendenti" name="simpendingdownloads"/>
+ <stat_bar label="Upload Pendenti" name="simpendinguploads"/>
+ <stat_bar label="Numero totale byte non risposti" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Tempo (ms)" name="simperf">
+ <stat_bar label="Tempo Totale Frame" name="simframemsec"/>
+ <stat_bar label="Tempo Netto" name="simnetmsec"/>
+ <stat_bar label="Tempo Motore Fisico" name="simsimphysicsmsec"/>
+ <stat_bar label="Tempo Simulazione" name="simsimothermsec"/>
+ <stat_bar label="Tempo Agenti" name="simagentmsec"/>
+ <stat_bar label="Tempo Immagini" name="simimagesmsec"/>
+ <stat_bar label="Tempo Script" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_sys_well.xml b/indra/newview/skins/default/xui/it/floater_sys_well.xml
new file mode 100644
index 0000000000..057d3657d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="NOTIFICHE">
+ <string name="title_im_well_window">
+ SESSIONE IM
+ </string>
+ <string name="title_notification_well_window">
+ NOTIFICHE
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_telehub.xml b/indra/newview/skins/default/xui/it/floater_telehub.xml
index 0c5199dbc7..08f5564c7b 100644
--- a/indra/newview/skins/default/xui/it/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/it/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="Telehub" min_height="310" height="310" width="286">
+<floater height="310" min_height="310" name="telehub" title="TELEHUB" width="286">
<text name="status_text_connected">
Telehub connesso all&apos;oggetto [OBJECT]
</text>
@@ -17,16 +17,13 @@
<text name="spawn_points_text" width="265">
Rigenera i punti (posizioni, non oggetti):
</text>
- <scroll_list name="spawn_points_list" width="265" />
- <button width="165" label="Aggiungi punti rigenerazione" name="add_spawn_point_btn"/>
- <button width="105" left="175" label="Rimuovi punti" name="remove_spawn_point_btn"/>
+ <scroll_list name="spawn_points_list" width="265"/>
+ <button label="Aggiungi punti rigenerazione" name="add_spawn_point_btn" width="165"/>
+ <button label="Rimuovi punti" left="175" name="remove_spawn_point_btn" width="105"/>
<text name="spawn_point_help">
- Seleziona un oggetto e clicca su aggiungi per
-specificarne la posizione.
-Potrai quindi muovere o rimuovere l&apos;oggetto.
-Le posizioni sono relative al centro del telehub.
-
-Seleziona un elemento per vederne la posizione
-globale.
+ Seleziona un oggetto e click &quot;Aggiungi Spawn&quot; per specificare la posizione.
+Ora puoi spostare o cancellare l&apos;oggetto.
+Le Posizioni sono relative al centro del telehub.
+Seleziona un oggetto nella lista per evidenziarlo nel mondo.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
index 65bc8ba41d..e57c37073a 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Preferiti: Immagine">
+<floater name="texture picker" title="Foto: TEXTURE">
<string name="choose_picture">
Clicca per scegliere l&apos;immagine
</string>
<text name="Multiple">
- Molteplice
+ Textures multiple
</text>
<text name="unknown">
- Dimensioni: [DIMENSIONS]
+ Misura: [Dimensions]
</text>
<button label="Default" label_selected="Default" name="Default"/>
<button label="Niente" label_selected="Niente" name="None"/>
<button label="Vuoto" label_selected="Vuoto" name="Blank"/>
- <check_box label="Visualizza Cartelle" name="show_folders_check"/>
- <search_editor label="Scrivi qui per cercare" name="inventory search editor"/>
- <check_box label="Applica Subito" name="apply_immediate_check"/>
+ <check_box label="Mostra cartelle" name="show_folders_check"/>
+ <search_editor label="Filtro Textures" name="inventory search editor"/>
+ <check_box label="Applica ora" name="apply_immediate_check"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <button label="Seleziona" label_selected="Seleziona" name="Select"/>
+ <button label="Ok" label_selected="Ok" name="Select"/>
<string name="pick title">
Scegli:
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index 8fc1818ccc..dda957025b 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -1,45 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Costruisci" width="288">
+<floater name="toolbox floater" short_title="STRUMENTI/ATTREZZI PER COSTRUIRE" title="" width="288">
+ <floater.string name="status_rotate">
+ Sposta le fasce colorate per ruotare l&apos;oggetto
+ </floater.string>
+ <floater.string name="status_scale">
+ Clicca e trascina per ridimensionare il lato selezionato
+ </floater.string>
+ <floater.string name="status_move">
+ Trascina per spostare, maiuscolo+trascina per copiare
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Clicca e tieni premuto per modificare il terreno
+ </floater.string>
+ <floater.string name="status_camera">
+ Clicca e trascina per spostare la camera
+ </floater.string>
+ <floater.string name="status_grab">
+ Trascina per spostare, Ctrl per sollevare, Ctrl+Shift per ruotare
+ </floater.string>
+ <floater.string name="status_place">
+ Clicca inworld per costruire
+ </floater.string>
+ <floater.string name="status_selectland">
+ Clicca e trascina per selezionare il terreno
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Schermo
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Locale
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Globale
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Riferimento
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Accessorio
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Focus"/>
<button label="" label_selected="" name="button move" tool_tip="Muoviti"/>
<button label="" label_selected="" name="button edit" tool_tip="Modifica"/>
<button label="" label_selected="" name="button create" tool_tip="Crea"/>
<button label="" label_selected="" name="button land" tool_tip="Terra"/>
+ <text name="text status" width="280">
+ Trascina per muovere, trascina+maiuscolo per copiare
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Guarda ruotando (Ctrl)" name="radio orbit"/>
- <radio_item label="Guarda panoramicamente (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Panoramica (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Muovi" name="radio move"/>
<radio_item label="Alza (Ctrl)" name="radio lift"/>
- <radio_item label="Gira intorno (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Ruota (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Posizione" name="radio position"/>
+ <radio_item label="Sposta" name="radio position"/>
<radio_item label="Ruota (Ctrl)" name="radio rotate"/>
- <radio_item label="Ridimensiona (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Seleziona Texture" name="radio select face"/>
+ <radio_item label="Estendi/Stira???!!!! (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Seleziona Faccia multimediale" name="radio select face"/>
</radio_group>
- <check_box label="Modifica parti unite" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Modalità:
+ <check_box label="Modifica parti collegate" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="Mostra il rendering cost calcolato per questo oggetto">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode" left_delta="48">
- <combo_box.item name="World" label="Globale"
- />
- <combo_box.item name="Local" label="Locale"
- />
- <combo_box.item name="Reference" label="Riferito a"
- />
- </combo_box>
<check_box label="Ridimens. simmetricamente" name="checkbox uniform"/>
- <check_box label="Ridimensiona le texture" name="checkbox stretch textures"/>
- <check_box label="Usa righello" name="checkbox snap to grid"/>
- <button label="Opzioni..." label_selected="Opzioni..." name="Options..."/>
- <text name="text status" width="280">
- Trascina per muovere, trascina+maiuscolo per copiare
- </text>
+ <check_box initial_value="true" label="Ridimensiona le texture" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Posiziona nella rete???!!!" name="checkbox snap to grid"/>
+ <combo_box left_delta="48" name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l&apos;oggetto">
+ <combo_box.item label="Rete del Mondo" name="World"/>
+ <combo_box.item label="Rete locale" name="Local"/>
+ <combo_box.item label="Riferimento della rete???!!!!" name="Reference"/>
+ </combo_box>
+ <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni delle rete"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/>
@@ -55,10 +91,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Anello"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Albero"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Erba"/>
- <check_box label="Mantieni selezionato" name="checkbox sticky"/>
- <check_box label="Copia la selezione" name="checkbox copy selection"/>
- <check_box label="Centra" name="checkbox copy centers"/>
- <check_box label="Ruota" name="checkbox copy rotates"/>
+ <check_box label="Mantieni lo strumento/attrezzo selezionato" name="checkbox sticky"/>
+ <check_box label="Seleziona la Copia" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Centra la Copia" name="checkbox copy centers"/>
+ <check_box label="Ruotare la Copia" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Seleziona il terreno" name="radio select land"/>
<radio_item label="Appiattisci" name="radio flatten"/>
@@ -68,25 +104,61 @@
<radio_item label="Ondula" name="radio noise"/>
<radio_item label="Ripristina" name="radio revert"/>
</radio_group>
- <button label="Applica" label_selected="Applica" name="button apply to selection" tool_tip="Modifica il terreno selezionato" left="146"/>
<text name="Bulldozer:">
Bulldozer:
</text>
<text name="Dozer Size:">
Grandezza
</text>
- <volume_slider left="184" name="slider brush size" width="74" />
+ <slider_bar initial_value="2.0" left="184" name="slider brush size" width="74"/>
<text name="Strength:">
Potenza
</text>
- <text name="obj_count" left="134">
- Oggetti selezionati: [COUNT]
+ <button label="Applica" label_selected="Applica" left="146" name="button apply to selection" tool_tip="Modifica la terra selezionata"/>
+ <text left="134" name="obj_count">
+ Oggetti: [COUNT]
</text>
- <text name="prim_count" left="134">
- primitivi: [COUNT]
+ <text left="134" name="prim_count">
+ Prims: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30" width="288">
<panel label="Generale" name="General">
+ <panel.string name="text deed continued">
+ Intesta
+ </panel.string>
+ <panel.string name="text deed">
+ Cedi al gruppo
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puoi modificare questo oggetto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puoi modificare questi oggetti
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Non puoi modificare questo oggetto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Non puoi modificare questi oggetti
+ </panel.string>
+ <panel.string name="text modify warning">
+ Devi selezionare tutto l&apos;oggetto per impostare i permessi
+ </panel.string>
+ <panel.string name="Cost Default">
+ Prezzo: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Prezzo Totale: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Prezzo per Unità: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Prezzo misto
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Vendita mista
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -99,135 +171,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Profilo..." label_selected="Profilo..." name="button creator profile"/>
<text name="Owner:">
Proprietario:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Profilo..." label_selected="Profilo..." name="button owner profile"/>
<text name="Group:">
Gruppo:
</text>
- <text name="Group Name Proxy">
- The Lindens
- </text>
- <button label="Imposta..." label_selected="Imposta..." name="button set group"/>
- <text name="Permissions:">
- Permessi:
- </text>
-
- <check_box label="Condividi con il gruppo" name="checkbox share with group" tool_tip="Permetti a tutti i membri del gruppo di condividere ed utilizzare i tuoi permessi per questo oggetto. Devi cederlo al gruppo per abilitare le restrizioni di ruolo."/>
- <string name="text deed continued">
- Cedi al gruppo...
- </string>
- <string name="text deed">
- Cedi al gruppo
- </string>
- <button left_delta="152" width="98" label="Cedi al gruppo..." label_selected="Cedi al gruppo..." name="button deed" tool_tip="Gli oggetti condivisi con il gruppo possono essere ceduti da un funzionario del gruppo."/>
- <check_box label="Permetti a chiunque di spostare" name="checkbox allow everyone move"/>
- <check_box label="Permetti a chiunque di copiare" name="checkbox allow everyone copy"/>
- <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti che l&apos;oggetto sia visibile nella ricerca"/>
- <check_box label="In vendita" name="checkbox for sale"/>
- <text name="Cost">
- Prezzo: L$
+ <button label="Imposta..." label_selected="Imposta..." name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/>
+ <name_box initial_value="Caricando..." name="Group Name Proxy"/>
+ <button label="Intesta" label_selected="Intesta" left_delta="152" name="button deed" tool_tip="Intestando permette di regalare questo oggetto con i permessi del prossimo proprietario. Gli oggetti condivisi dal gruppo posso essere instestati solo da un officer del gruppo." width="98"/>
+ <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti ai membri del gruppo selezionato di condividere i tuoi permessi modify per questo oggetto. Tu devi Intestare per attivare le restrizioni al ruolo."/>
+ <text name="label click action" width="220">
+ Clicca:
</text>
+ <combo_box name="clickaction" width="192">
+ <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
+ <combo_box.item label="Compra l&apos;oggetto" name="Buyobject"/>
+ <combo_box.item label="Paga l&apos;oggetto" name="Payobject"/>
+ <combo_box.item label="Apri" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="In vendita:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Copia" name="Copy"/>
<combo_box.item label="Contenuto" name="Contents"/>
<combo_box.item label="Originale" name="Original"/>
</combo_box>
-
- <text name="label click action" width="220">
- Se cliccato con il tasto sinistro del mouse:
- </text>
- <combo_box name="clickaction" width="192">
- <combo_box.item name="Touch/grab(default)" label="Tocca/Afferra (default)"
- />
- <combo_box.item name="Sitonobject" label="Siediti sull&apos;oggetto"
- />
- <combo_box.item name="Buyobject" label="Compra l&apos;oggetto"
- />
- <combo_box.item name="Payobject" label="Paga l&apos;oggetto"
- />
- <combo_box.item name="Open" label="Apri"
- />
- <combo_box.item name="Play" label="Attiva i multimedia del terreno"
- />
- <combo_box.item name="Opemmedia" label="Apri i multimedia del terreno"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Puoi modificare questo oggetto
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Il prossimo proprietario può:
- </text>
- <check_box label="Modificare" name="checkbox next owner can modify"/>
- <check_box label="Copiare" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Puoi modificare questo oggetto
- </string>
- <string name="text modify info 2">
- Puoi modificare questi oggetti
- </string>
- <string name="text modify info 3">
- Non puoi modificare questo oggetto
- </string>
- <string name="text modify info 4">
- Non puoi modificare questi oggetti
- </string>
- <string name="text modify warning">
- Devi selezionare l&apos;intero oggetto per impostare i permessi
- </string>
- <string name="Cost Default">
- Prezzo: L$
- </string>
- <string name="Cost Total">
- Prezzo totale: L$
- </string>
- <string name="Cost Per Unit">
- Prezzo per: L$
- </string>
- <string name="Cost Mixed">
- Prezzo misto
- </string>
- <string name="Sale Mixed">
- Vendita mista
- </string>
+ <spinner label="Prezzo: L$" name="Edit Cost"/>
+ <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti che l&apos;oggetto sia visibile nella ricerca"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Puoi modificare questo oggetto
+ </text>
+ <text name="Anyone can:">
+ Chiunque:
+ </text>
+ <check_box label="Sposta" name="checkbox allow everyone move"/>
+ <check_box label="Copia" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Prossimo proprietario:
+ </text>
+ <check_box label="Modificare" name="checkbox next owner can modify"/>
+ <check_box label="Copiare" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Transfer" left_delta="67" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Oggetto" name="Object">
- <text name="select_single">
- Seleziona solo un prim per modificarne i parametri.
- </text>
- <text name="edit_object">
- Modifica i parametri dell&apos;oggetto:
- </text>
<check_box label="Bloccato" name="checkbox locked" tool_tip="Previene lo spostamento o la cancellazione dell&apos;oggetto. Spesso utile mentre si costruisce per evitare involontarie modifiche."/>
<check_box label="Fisico" name="Physical Checkbox Ctrl" tool_tip="Permette all&apos;oggetto di essere spostato e di subire gli effetti della gravità"/>
- <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Provoca la cancellazione dell&apos;oggetto 1 minuto dopo la sua creazione."/>
+ <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Causa la cancellazione dell&apos;oggetto 1 minuto dopo la sua creazione"/>
<check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Rende l&apos;oggetto penetrabile dagli altri oggetti e dagli avatars"/>
<text name="label position">
Posizione (metri)
@@ -247,48 +261,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Materiale
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Pietra"
- />
- <combo_box.item name="Metal" label="Metallo"
- />
- <combo_box.item name="Glass" label="Vetro"
- />
- <combo_box.item name="Wood" label="Legno"
- />
- <combo_box.item name="Flesh" label="Carne"
- />
- <combo_box.item name="Plastic" label="Plastica"
- />
- <combo_box.item name="Rubber" label="Gomma"
- />
- </combo_box>
- <text name="label basetype">
- Forma di costruzione
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Cubo"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Sfera"
- />
- <combo_box.item name="Torus" label="Toro"
- />
- <combo_box.item name="Tube" label="Tubo"
- />
- <combo_box.item name="Ring" label="Anello"
- />
- <combo_box.item name="Sculpted" label="Sculpted"
- />
+ <combo_box.item label="Cubo" name="Box"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Sfera" name="Sphere"/>
+ <combo_box.item label="Toro" name="Torus"/>
+ <combo_box.item label="Tubo" name="Tube"/>
+ <combo_box.item label="Anello" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Pietra" name="Stone"/>
+ <combo_box.item label="Metallo" name="Metal"/>
+ <combo_box.item label="Vetro" name="Glass"/>
+ <combo_box.item label="Legno" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plastica" name="Plastic"/>
+ <combo_box.item label="Gomma" name="Rubber"/>
</combo_box>
<text name="text cut">
- Linea di taglio Inizio e Fine
+ Riduci una sezione (begin/end)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -302,17 +295,13 @@
Forma del foro
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Default"
- />
- <combo_box.item name="Circle" label="Rotondo"
- />
- <combo_box.item name="Square" label="Quadrato"
- />
- <combo_box.item name="Triangle" label="Triangolare"
- />
+ <combo_box.item label="Default" name="Default"/>
+ <combo_box.item label="Rotondo" name="Circle"/>
+ <combo_box.item label="Quadrato" name="Square"/>
+ <combo_box.item label="Triangolare" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torsione Inizio e Fine
+ Attorciglia (begin/end)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -330,13 +319,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut" width="149">
- Ritaglia il profilo Inizio e Fine
+ Riduci un bordo (begin/end)
</text>
<text name="advanced_dimple">
- Scava Inizio e Fine
+ Fossetta???!!!! (begin/end)
</text>
<text name="advanced_slice">
- Affetta Inizio e Fine
+ Taglia???!!! (begin/end)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -352,22 +341,17 @@
Rivoluzioni
</text>
<texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <check_box label="Rifletti" name="sculpt mirror control" tool_tip="Ribalta lo sculpted prim lungo l&apos;asse X."/>
- <check_box label="Rivolta" name="sculpt invert control" tool_tip="Inverte le normali dello sculpted prim, facendolo apparire rivoltato."/>
+ <check_box label="Rifletti" name="sculpt mirror control" tool_tip="Rovescia il prim sculpted lungo l&apos;asse X"/>
+ <check_box label="Rivolta" name="sculpt invert control" tool_tip="Inverti i normali prim sculpted, facendoli apparire a rovescio"/>
<text name="label sculpt type">
Tipo di congiunzione
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(nessuna)"
- />
- <combo_box.item name="Sphere" label="Sferica"
- />
- <combo_box.item name="Torus" label="Toroidale"
- />
- <combo_box.item name="Plane" label="Piana"
- />
- <combo_box.item name="Cylinder" label="Cilindrica"
- />
+ <combo_box.item label="(nessuna)" name="None"/>
+ <combo_box.item label="Sferica" name="Sphere"/>
+ <combo_box.item label="Toroidale" name="Torus"/>
+ <combo_box.item label="Piana" name="Plane"/>
+ <combo_box.item label="Cilindrica" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Caratteristiche" name="Features">
@@ -377,134 +361,110 @@
<text name="edit_object">
Modifica le caratteristiche dell&apos;oggetto:
</text>
- <check_box label="Flessibilità" name="Flexible1D Checkbox Ctrl" tool_tip="Permette all&apos;oggetto di flettersi rispetto all&apos;asse Z. (solo lato client)"/>
- <spinner label="Morbidezza" name="FlexNumSections" label_width="72" width="135"/>
- <spinner label="Gravità" name="FlexGravity" label_width="72" width="135"/>
- <spinner label="Elasticità" name="FlexFriction" label_width="72" width="135"/>
- <spinner label="Sventolio" name="FlexWind" label_width="72" width="135"/>
- <spinner label="Tensione" name="FlexTension" label_width="72" width="135"/>
- <spinner label="Forza X" name="FlexForceX" label_width="72" width="135"/>
- <spinner label="Forza Y" name="FlexForceY" label_width="72" width="135"/>
- <spinner label="Forza Z" name="FlexForceZ" label_width="72" width="135"/>
+ <check_box label="Flessibilità" name="Flexible1D Checkbox Ctrl" tool_tip="Permetti all&apos;oggetto di flettersi lungo l&apos;asse Z (Client-side only)"/>
+ <spinner label="Morbidezza" label_width="72" name="FlexNumSections" width="135"/>
+ <spinner label="Gravità" label_width="72" name="FlexGravity" width="135"/>
+ <spinner label="Elasticità" label_width="72" name="FlexFriction" width="135"/>
+ <spinner label="Sventolio" label_width="72" name="FlexWind" width="135"/>
+ <spinner label="Tensione" label_width="72" name="FlexTension" width="135"/>
+ <spinner label="Forza X" label_width="72" name="FlexForceX" width="135"/>
+ <spinner label="Forza Y" label_width="72" name="FlexForceY" width="135"/>
+ <spinner label="Forza Z" label_width="72" name="FlexForceZ" width="135"/>
<check_box label="Luce" name="Light Checkbox Ctrl" tool_tip="Imposta l&apos;oggetto come sorgente di luce"/>
- <text name="label color">
- Colore
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
- <spinner label="Intensità" name="Light Intensity" label_width="72" width="135"/>
- <spinner label="Raggio" name="Light Radius" label_width="72" width="135"/>
- <spinner label="Attenuazione" name="Light Falloff" label_width="72" width="135" />
+ <color_swatch label="" name="colorswatch" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <texture_picker label="" name="light texture control" tool_tip="Clicca per scegliere una proiezione dell&apos;immagine (funziona solo con deferred rendering attivato)"/>
+ <spinner label="Intensità" label_width="72" name="Light Intensity" width="135"/>
+ <spinner label="FOV" name="Light FOV"/>
+ <spinner label="Raggio" label_width="72" name="Light Radius" width="135"/>
+ <spinner label="Focus" name="Light Focus"/>
+ <spinner label="Attenuazione" label_width="72" name="Light Falloff" width="135"/>
+ <spinner label="Atmosfera" name="Light Ambiance"/>
</panel>
<panel label="Texture" name="Texture">
+ <panel.string name="string repeats per meter">
+ Ripetizioni per metro
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Ripetizioni per faccia
+ </panel.string>
<texture_picker label="Texture" name="texture control" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <color_swatch label="Colore" name="colorswatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
+ <color_swatch label="Colore" name="colorswatch" tool_tip="Clicca per aprire il selettore dei colori"/>
<text name="color trans">
Trasparenza %
</text>
<text name="glow label">
Bagliore
</text>
- <check_box label="Massima &#10;luminosità" name="checkbox fullbright" bottom_delta="-21"/>
+ <check_box bottom_delta="-21" label="Massima
+luminosità" name="checkbox fullbright"/>
<text name="tex gen">
- Applicazione &#10;della texture
+ Applicazione
+della texture
</text>
- <combo_box name="combobox texgen" bottom_delta="-38">
- <combo_box.item name="Default" label="Default"
- />
- <combo_box.item name="Planar" label="Planare"
- />
+ <combo_box bottom_delta="-38" name="combobox texgen">
+ <combo_box.item label="Default" name="Default"/>
+ <combo_box.item label="Planare" name="Planar"/>
</combo_box>
- <text name="label shininess" bottom="-120">
+ <text bottom="-120" name="label shininess">
Brillantezza
</text>
- <combo_box name="combobox shininess" bottom_delta="-22">
- <combo_box.item name="None" label="Nessuna"
- />
- <combo_box.item name="Low" label="Bassa"
- />
- <combo_box.item name="Medium" label="Media"
- />
- <combo_box.item name="High" label="Alta"
- />
+ <combo_box bottom_delta="-22" name="combobox shininess">
+ <combo_box.item label="Nessuna" name="None"/>
+ <combo_box.item label="Bassa" name="Low"/>
+ <combo_box.item label="Media" name="Medium"/>
+ <combo_box.item label="Alta" name="High"/>
</combo_box>
- <text name="label bumpiness" bottom="-120">
+ <text bottom="-120" name="label bumpiness">
Rilievo
</text>
- <combo_box name="combobox bumpiness" width="100" bottom_delta="-22">
- <combo_box.item name="None" label="Nessuna"
- />
- <combo_box.item name="Brightness" label="Luminoso"
- />
- <combo_box.item name="Darkness" label="Scuro"
- />
- <combo_box.item name="woodgrain" label="Venature del legno"
- />
- <combo_box.item name="bark" label="Corteccia"
- />
- <combo_box.item name="bricks" label="Mattoni"
- />
- <combo_box.item name="checker" label="Scacchi"
- />
- <combo_box.item name="concrete" label="Cemento"
- />
- <combo_box.item name="crustytile" label="Mattonella incrostata"
- />
- <combo_box.item name="cutstone" label="Mosaico in pietra"
- />
- <combo_box.item name="discs" label="Dischi"
- />
- <combo_box.item name="gravel" label="Ghiaia"
- />
- <combo_box.item name="petridish" label="Sassi"
- />
- <combo_box.item name="siding" label="Listoni"
- />
- <combo_box.item name="stonetile" label="Mattonelle in pietra"
- />
- <combo_box.item name="stucco" label="Stucco"
- />
- <combo_box.item name="suction" label="Cerchi rialzati"
- />
- <combo_box.item name="weave" label="Trama"
- />
+ <combo_box bottom_delta="-22" name="combobox bumpiness" width="100">
+ <combo_box.item label="Nessuna" name="None"/>
+ <combo_box.item label="Luminoso" name="Brightness"/>
+ <combo_box.item label="Scuro" name="Darkness"/>
+ <combo_box.item label="Venature del legno" name="woodgrain"/>
+ <combo_box.item label="Corteccia" name="bark"/>
+ <combo_box.item label="Mattoni" name="bricks"/>
+ <combo_box.item label="Scacchi" name="checker"/>
+ <combo_box.item label="Cemento" name="concrete"/>
+ <combo_box.item label="Mattonella incrostata" name="crustytile"/>
+ <combo_box.item label="Mosaico in pietra" name="cutstone"/>
+ <combo_box.item label="Dischi" name="discs"/>
+ <combo_box.item label="Ghiaia" name="gravel"/>
+ <combo_box.item label="Sassi" name="petridish"/>
+ <combo_box.item label="Listoni" name="siding"/>
+ <combo_box.item label="Mattonelle in pietra" name="stonetile"/>
+ <combo_box.item label="Stucco" name="stucco"/>
+ <combo_box.item label="Cerchi rialzati" name="suction"/>
+ <combo_box.item label="Trama" name="weave"/>
</combo_box>
<text name="tex scale">
- Ripetizioni per faccia
+ Ripeti / Lato
</text>
<spinner label="Orizzontale (U)" name="TexScaleU"/>
<check_box label="Inverti" name="checkbox flip s"/>
<spinner label="Verticale (V)" name="TexScaleV"/>
<check_box label="Inverti" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotazione (Gradi)
- </text>
- <string name="string repeats per meter">
- Ripetizioni per metro
- </string>
- <string name="string repeats per face">
- Ripetizioni per faccia
- </string>
- <text name="rpt">
- Ripetizioni per metro
- </text>
- <spinner left="120" name="TexRot" width="60" />
- <spinner left="120" name="rptctrl" width="60" />
- <button label="Applica" label_selected="Applica" name="button apply" left_delta="72"/>
+ <spinner label="RotazioneËš" left="120" name="TexRot" width="60"/>
+ <spinner label="Ripete / Metri" left="120" name="rptctrl" width="60"/>
+ <button label="Applica" label_selected="Applica" left_delta="72" name="button apply"/>
<text name="tex offset">
- Offset
+ Bilanciamento della Texture
</text>
<spinner label="Orizzontale (U)" name="TexOffsetU"/>
<spinner label="Verticale (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Allinea texture dei media
-(deve prima caricarsi)
- </text>
- <button label="Allinea" label_selected="Allinea" name="button align" left="160"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Aggiungi Media"/>
+ <button name="delete_media" tool_tip="Cancella questa media texture"/>
+ <button name="edit_media" tool_tip="Modifica questo Media"/>
+ <button label="Alllinea" label_selected="Allinea Media" name="button align" tool_tip="Allinea media texture (must load first)"/>
+ </panel>
</panel>
<panel label="Contenuto" name="Contents">
- <button label="Nuovo Script" label_selected="Nuovo script" name="button new script"/>
+ <button label="Nuovo Script" label_selected="Nuovo Script" name="button new script"/>
<button label="Permessi" name="button permissions"/>
- <panel name="ContentsInventory" width="272" />
</panel>
</tab_container>
<panel name="land info panel">
@@ -512,62 +472,29 @@
Informazioni sul terreno
</text>
<text name="label_area_price">
- Prezzo: [PRICE] L$ per [AREA] m²
+ Prezzo: L$[PRICE] per [AREA] m²
</text>
<text name="label_area">
Area: [AREA] m²
</text>
- <button label="Informazioni sul terreno..." label_selected="Informazioni sul terreno..." name="button about land" width="156"/>
- <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari: &#10;&#10;Verde = il tuo terreno &#10;Acqua = la terra del tuo gruppo &#10;Rosso = posseduta da altri &#10;Giallo = in vendita &#10;Viola = in asta &#10;Grigia = pubblica"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="120"/>
+ <button label="Info sul terreno" label_selected="Info sul terreno" name="button about land" width="156"/>
+ <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari:
+
+Verde = il tuo terreno
+Acqua = la terra del tuo gruppo
+Rosso = posseduta da altri
+Giallo = in vendita
+Viola = in asta
+Grigia = pubblica"/>
<text name="label_parcel_modify">
Modifica il terreno
</text>
<button label="Suddividi" label_selected="Suddividi" name="button subdivide land" width="156"/>
- <button label="Unisci" label_selected="Unisci" name="button join land" width="156"/>
+ <button label="Aderisci" label_selected="Aderisci" name="button join land" width="156"/>
<text name="label_parcel_trans">
Transazioni del territorio
</text>
- <button label="Acquista il terreno" label_selected="Acquista il terreno" name="button buy land" width="156"/>
- <button label="Abbandona il terreno" label_selected="Abbandona il terreno" name="button abandon land" width="156"/>
+ <button label="Compra la Terra" label_selected="Compra la Terra" name="button buy land" width="156"/>
+ <button label="Abbandona la Terra" label_selected="Abbandona la Terra" name="button abandon land" width="156"/>
</panel>
- <floater.string name="status_rotate">
- Sposta le fasce colorate per ruotare l&apos;oggetto
- </floater.string>
- <floater.string name="status_scale">
- Clicca e trascina per ridimensionare il lato selezionato
- </floater.string>
- <floater.string name="status_move">
- Trascina per spostare, maiuscolo+trascina per copiare
- </floater.string>
- <floater.string name="status_modifyland">
- Clicca e tieni premuto per modificare il terreno
- </floater.string>
- <floater.string name="status_camera">
- Clicca e sposta per cambiare visuale
- </floater.string>
- <floater.string name="status_grab">
- Trascina per muovere, Ctrl per alzare, Ctrl-Shift per ruotare
- </floater.string>
- <floater.string name="status_place">
- Clicca inworld per costruire
- </floater.string>
- <floater.string name="status_selectland">
- Clicca e trascina per selezionare il terreno
- </floater.string>
- <floater.string name="grid_screen_text">
- Schermo
- </floater.string>
- <floater.string name="grid_local_text">
- Locale
- </floater.string>
- <floater.string name="grid_world_text">
- Globale
- </floater.string>
- <floater.string name="grid_reference_text">
- Riferimento
- </floater.string>
- <floater.string name="grid_attachment_text">
- Accessorio
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index 470e21769c..8f7f3e060a 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="In caricamento...">
+<floater name="top_objects" title="Oggetti principali">
<text name="title_text">
In caricamento...
</text>
@@ -19,17 +19,17 @@
</text>
<button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/>
<text name="obj_name_text">
- Nome oggetto:
+ Nome dell&apos;oggetto:
</text>
<button label="Filtro" name="filter_object_btn" width="150"/>
<text name="owner_name_text">
- Nome oggetto:
+ Proprietario:
</text>
<button label="Filtro" name="filter_owner_btn" width="150"/>
<button label="Restituisci selezionato" name="return_selected_btn" width="150"/>
- <button label="Restituisci tutti" name="return_all_btn" left="170"/>
+ <button label="Restituisci tutti" left="170" name="return_all_btn"/>
<button label="Disabilita selezionato" name="disable_selected_btn" width="150"/>
- <button label="Disabilita per tutti" name="disable_all_btn" left="170"/>
+ <button label="Disabilita per tutti" left="170" name="disable_all_btn"/>
<button label="Aggiorna" name="refresh_btn" width="150"/>
<string name="top_scripts_title">
Script pesanti
diff --git a/indra/newview/skins/default/xui/it/floater_tos.xml b/indra/newview/skins/default/xui/it/floater_tos.xml
index 12b6021b5b..f3f8072f56 100644
--- a/indra/newview/skins/default/xui/it/floater_tos.xml
+++ b/indra/newview/skins/default/xui/it/floater_tos.xml
@@ -4,8 +4,7 @@
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<check_box label="Accetto i Termini di Servizio" name="agree_chk"/>
<text name="tos_heading">
- Leggi attentamente i seguenti Termini di Servizio. Per continuare ad entrare in [SECOND_LIFE],
-devi accettare l&apos;accordo.
+ Per favore leggi attentamente i seguenti Termini di Servizio. Per continuare il log in [SECOND_LIFE], devi accettare le condizioni.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
new file mode 100644
index 0000000000..e4c54d44eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Controlli del Voice">
+ <string name="title_nearby">
+ VOICE NEI DINTORNI
+ </string>
+ <string name="title_group">
+ Chiamata di Gruppo con [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Conference Call
+ </string>
+ <string name="title_peer_2_peer">
+ Chiama con [NAME]
+ </string>
+ <string name="no_one_near">
+ Nessuno vicino
+ </string>
+ <panel name="control_panel">
+ <layout_stack>
+ <layout_panel name="leave_btn_panel">
+ <button label="Chiudi Chiamata" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml
index 33f91ed1c8..d2849440d6 100644
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ b/indra/newview/skins/default/xui/it/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="Editor avanzato dell&apos;acqua">
+<floater name="Water Floater" title="EDITOR AVANZATO DELL&apos;ACQUA">
<text name="KeyFramePresetsText" width="224">
Impostazioni predeterminate dell&apos;acqua:
</text>
- <combo_box left_delta="230" name="WaterPresetsCombo" width="150" />
+ <combo_box left_delta="230" name="WaterPresetsCombo" width="150"/>
<button label="Nuovo" label_selected="Nuovo" name="WaterNewPreset"/>
<button label="Salva" label_selected="Salva" name="WaterSavePreset"/>
<button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/>
@@ -12,21 +12,22 @@
<text name="BHText">
Colore della nebbiosità dell&apos;acqua
</text>
- <button label="?" name="WaterFogColorHelp" left="209"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Clicca per aprire la selezione colore"/>
- <text name="WaterFogDensText" font="SansSerifSmall">
- Esponente di densità della nebbia&#10; dell&apos;acqua
+ <button label="?" left="209" name="WaterFogColorHelp"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <text font="SansSerifSmall" name="WaterFogDensText">
+ Esponente di densità della nebbia
+ dell&apos;acqua
</text>
<slider bottom_delta="-40" name="WaterFogDensity"/>
- <button label="?" name="WaterFogDensityHelp" left="209"/>
- <text name="WaterUnderWaterFogModText" font="SansSerifSmall" bottom="-140">
+ <button label="?" left="209" name="WaterFogDensityHelp"/>
+ <text bottom="-140" font="SansSerifSmall" name="WaterUnderWaterFogModText">
Regolatore effetto nebbia subacquea
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" left="209"/>
+ <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
<text name="BDensText">
Scala di riflessione delle onde
</text>
- <button label="?" name="WaterNormalScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -39,31 +40,33 @@
<text name="HDText">
Scala Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterFresnelScaleHelp"/>
<text name="FresnelOffsetText">
Offset Fresnel
</text>
- <button label="?" name="WaterFresnelOffsetHelp" left="415"/>
- <text name="DensMultText" font="SansSerifSmall">
- Scala di rifrazione nell&apos;acqua&#10; dall&apos;alto
+ <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
+ <text font="SansSerifSmall" name="DensMultText">
+ Scala di rifrazione nell&apos;acqua
+ dall&apos;alto
</text>
<slider bottom_delta="-40" name="WaterScaleAbove"/>
- <button label="?" name="WaterScaleAboveHelp" left="650"/>
- <text name="WaterScaleBelowText" font="SansSerifSmall" bottom="-70">
- Scala di rifrazione nell&apos;acqua&#10; dal basso
+ <button label="?" left="650" name="WaterScaleAboveHelp"/>
+ <text bottom="-70" font="SansSerifSmall" name="WaterScaleBelowText">
+ Scala di rifrazione nell&apos;acqua
+ dal basso
</text>
<slider bottom_delta="-40" name="WaterScaleBelow"/>
- <button label="?" name="WaterScaleBelowHelp" left="650"/>
- <text name="MaxAltText" bottom="-122">
+ <button label="?" left="650" name="WaterScaleBelowHelp"/>
+ <text bottom="-122" name="MaxAltText">
Moltiplicatore della sfocatura
</text>
- <button label="?" name="WaterBlurMultiplierHelp" left="650"/>
+ <button label="?" left="650" name="WaterBlurMultiplierHelp"/>
</panel>
<panel label="Immagine" name="Waves">
<text name="BHText">
Direzione della grande onda
</text>
- <button label="?" name="WaterWave1Help" left="170"/>
+ <button label="?" left="170" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
@@ -73,7 +76,7 @@
<text name="BHText2">
Direzione della piccola onda
</text>
- <button label="?" name="WaterWave2Help" left="170"/>
+ <button label="?" left="170" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..6d68db058d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry">
+ <text name="media_label">
+ Inserisci un URL o una configurazione URL da aggiungere alla lista dei domini permessi
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Inserisci un URL o una configurazione URL alla lista bianca"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
index 5076c777dc..e86d656e39 100644
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="Editor avanzato del cielo">
+<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO">
<text name="KeyFramePresetsText">
Cieli predefiniti:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_world_map.xml b/indra/newview/skins/default/xui/it/floater_world_map.xml
index e19335fe07..a672df0d96 100644
--- a/indra/newview/skins/default/xui/it/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_world_map.xml
@@ -1,59 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Mappa">
- <tab_container name="maptab">
- <panel label="Oggetti" name="objects_mapview"/>
- <panel label="Terreno" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Tu
- </text>
- <text name="home_label">
- Casa
- </text>
- <text name="auction_label">
- Asta
- </text>
- <text name="land_for_sale_label">
- Terreno in vendita
- </text>
- <button label="Vai a Casa" label_selected="Vai a Casa" name="Go Home" tool_tip="Teletrasportati a casa"/>
- <check_box label="Residenti" name="people_chk"/>
- <check_box label="Punto informativo" name="infohub_chk"/>
- <check_box label="Punto di snodo &#10;di teletrasporto" name="telehubchk"/>
- <icon bottom="-170" name="landforsale" />
- <check_box label="Terra in vendita" name="land_for_sale_chk" bottom="-170"/>
- <text name="events_label">
- Eventi:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <icon bottom="-200" name="avatar_icon" />
- <combo_box label="Amici Online" name="friend combo" tool_tip="Amici da mostrare sulla mappa">
- <combo_box.item name="item1" label="Amici Online"/>
- </combo_box>
- <combo_box label="Landmark" name="landmark combo" tool_tip="Landmarks da mostrare sulla mappa">
- <combo_box.item name="item1" label="Landmark"/>
- </combo_box>
- <line_editor label="Cerca per nome di regione" name="location" tool_tip="Scrivi il nome di una regione"/>
- <button label="Cerca" name="DoSearch" tool_tip="Cerca regione"/>
- <text name="search_label">
- Cerca tra i risultati:
- </text>
- <scroll_list name="search_results" bottom_delta="-310" height="304" >
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Luogo:
- </text>
- <spinner name="spin x" tool_tip="Coordinata X del luogo da mostrare sulla mappa"/>
- <spinner name="spin y" tool_tip="Coordinata Y del luogo da mostrare sulla mappa"/>
- <spinner name="spin z" tool_tip="Coordinata Z del luogo da mostrare sulla mappa"/>
- <button font="SansSerifSmall" label="Teletrasporto" label_selected="Teletrasporto" name="Teleport" tool_tip="Teletrasporto al luogo prescelto"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostra destinazione" label_selected="Mostra destinazione" name="Show Destination" tool_tip="Centra la mappa sul luogo prescelto"/>
- <button font="SansSerifSmall" label="Pulisci" label_selected="Pulisci" name="Clear" tool_tip="Togli traccia"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostra la mia posizione" label_selected="Mostra la mia posizione" name="Show My Location" tool_tip="Centra la mappa alla posizione del tuo avatar"/>
- <button font="SansSerifSmall" label="Copia lo SLurl negli appunti" name="copy_slurl" tool_tip="Copia l&apos;attuale posizione quale SLurl utilizzabile nel web."/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="MAPPA DEL MONDO">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legenda
+ </text>
+ </panel>
+ <panel>
+ <button font="SansSerifSmall" label="Mostra la mia posizione" label_selected="Mostra la mia posizione" left_delta="91" name="Show My Location" tool_tip="Centra la mappa sul luogo dove si trova il mio avatar" width="135"/>
+ <text name="person_label">
+ Io
+ </text>
+ <check_box label="Residenti" name="people_chk"/>
+ <check_box label="Punto informativo" name="infohub_chk"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box bottom="-170" label="Terra in vendita" name="land_for_sale_chk"/>
+ <icon bottom="-170" name="landforsale"/>
+ <text name="land_sale_label">
+ Vendita di terra
+ </text>
+ <text name="auction_label">
+ per conto del proprietario
+ </text>
+ <button label="Vai a Casa" label_selected="Vai a Casa" name="Go Home" tool_tip="Teleport a casa mia"/>
+ <text name="Home_label">
+ Casa
+ </text>
+ <text name="events_label">
+ Eventi:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ Mature
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Trova sulla Mappa
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Amici Online" name="friend combo" tool_tip="Mostra amici sulla mappa">
+ <combo_box.item label="Miei Amici Online" name="item1"/>
+ </combo_box>
+ <combo_box label="Miei Landmarks" name="landmark combo" tool_tip="Landmark da mostrare sulla mappa">
+ <combo_box.item label="Miei Landmarks" name="item1"/>
+ </combo_box>
+ <search_editor label="Regione per nome" name="location" tool_tip="Scrivi il nome di una regione"/>
+ <button label="Trova" name="DoSearch" tool_tip="Cerca regione"/>
+ <scroll_list bottom_delta="-310" height="304" name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button font="SansSerifSmall" label="Teletrasporto" label_selected="Teletrasporto" name="Teleport" tool_tip="Teletrasporto al luogo prescelto"/>
+ <button font="SansSerifSmall" label="Copia SLurl" name="copy_slurl" tool_tip="Copia il luogo attuale come SLurl per essere usato nel web."/>
+ <button font="SansSerifSmall" label="Mostra Selezione" label_selected="Mostra destinazione" left_delta="91" name="Show Destination" tool_tip="Centra la mappa sul luogo prescelto" width="135"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml
new file mode 100644
index 0000000000..61f7a69234
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [ETA&apos;]
+ </string>
+ <string name="Details">
+ [PROFILO_SL]
+ </string>
+ <slider name="volume_slider" tool_tip="Volume del Voice" value="0.5"/>
+ <button label="Aggiungi Amico" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Di più" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disattiva il Voice" name="disable_voice"/>
+ <button label="Attiva Voice" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_group.xml b/indra/newview/skins/default/xui/it/inspect_group.xml
new file mode 100644
index 0000000000..d7b86fdbcb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Gruppo Privato
+ </string>
+ <string name="FreeToJoin">
+ Adesione libera
+ </string>
+ <string name="CostToJoin">
+ L$[AMOUNT] per aderire
+ </string>
+ <string name="YouAreMember">
+ Tu sei un Membro
+ </string>
+ <button label="Aderire" name="join_btn"/>
+ <button label="Abbandona" name="leave_btn"/>
+ <button label="Vedi Profilo" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_object.xml b/indra/newview/skins/default/xui/it/inspect_object.xml
new file mode 100644
index 0000000000..7e6d195cb1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/inspect_object.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Di [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Di [CREATOR]
+owner [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Gratis!
+ </string>
+ <string name="Touch">
+ Tocca
+ </string>
+ <string name="Sit">
+ Siedi
+ </string>
+ <button label="Compra" name="buy_btn"/>
+ <button label="Paga" name="pay_btn"/>
+ <button label="Fai una Copia" name="take_free_copy_btn"/>
+ <button label="Tocca" name="touch_btn"/>
+ <button label="Siedi" name="sit_btn"/>
+ <button label="Apri" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Secure Browsing"/>
+ <button label="Ulteriore" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_remote_object.xml b/indra/newview/skins/default/xui/it/inspect_remote_object.xml
new file mode 100644
index 0000000000..9fabe2ca0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Proprietario:
+ </text>
+ <button label="Mappa" name="map_btn"/>
+ <button label="Bloccare" name="block_btn"/>
+ <button label="Chiudi" name="close_btn"/>
+</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
new file mode 100644
index 0000000000..ff068b90a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Vedi profilo" name="Profile..."/>
+ <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Invita nel gruppo" name="Invite..."/>
+ <menu_item_call label="Blocca" name="Avatar Mute"/>
+ <menu_item_call label="Denuncia" name="abuse"/>
+ <menu_item_call label="Congela" name="Freeze..."/>
+ <menu_item_call label="Espelli" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Avvicinati" name="Zoom In"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+ <menu_item_call label="Profilo oggetto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
new file mode 100644
index 0000000000..9711b5918a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocca" name="Attachment Object Touch"/>
+ <menu_item_call label="Modifica" name="Edit..."/>
+ <menu_item_call label="Stacca" name="Detach"/>
+ <menu_item_call label="Lascia" name="Drop"/>
+ <menu_item_call label="Alzati" name="Stand Up"/>
+ <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/>
+ <menu_item_call label="I miei amici" name="Friends..."/>
+ <menu_item_call label="I miei gruppi" name="Groups..."/>
+ <menu_item_call label="Il mio profilo" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_icon.xml b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml
new file mode 100644
index 0000000000..522c7ab4e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Vedi profilo" name="Show Profile"/>
+ <menu_item_call label="Manda IM..." name="Send IM"/>
+ <menu_item_call label="Chiedi amicizia..." name="Add Friend"/>
+ <menu_item_call label="Togli amicizia..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_other.xml b/indra/newview/skins/default/xui/it/menu_avatar_other.xml
new file mode 100644
index 0000000000..a435fcd311
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Vedi profilo" name="Profile..."/>
+ <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Invita nel gruppo" name="Invite..."/>
+ <menu_item_call label="Blocca" name="Avatar Mute"/>
+ <menu_item_call label="Denuncia" name="abuse"/>
+ <menu_item_call label="Congela" name="Freeze..."/>
+ <menu_item_call label="Espelli" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Avvicinati" name="Zoom In"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
new file mode 100644
index 0000000000..b7a9f8efbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Alzati" name="Stand Up"/>
+ <context_menu label="Vola &gt;" name="Take Off &gt;">
+ <context_menu label="Abiti &gt;" name="Clothes &gt;">
+ <menu_item_call label="Gonna" name="Shirt"/>
+ <menu_item_call label="Pantaloni" name="Pants"/>
+ <menu_item_call label="Gonna" name="Skirt"/>
+ <menu_item_call label="Scarpe" name="Shoes"/>
+ <menu_item_call label="Calzini" name="Socks"/>
+ <menu_item_call label="Giacca" name="Jacket"/>
+ <menu_item_call label="Guanti" name="Gloves"/>
+ <menu_item_call label="Maglietta intima" name="Self Undershirt"/>
+ <menu_item_call label="Slip" name="Self Underpants"/>
+ <menu_item_call label="Tatuaggio" name="Self Tattoo"/>
+ <menu_item_call label="Alfa (trasparenza)" name="Self Alpha"/>
+ <menu_item_call label="Tutti gli abiti" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD &gt;" name="Object Detach HUD"/>
+ <context_menu label="Stacca &gt;" name="Object Detach"/>
+ <menu_item_call label="Stacca tutto" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/>
+ <menu_item_call label="I miei amici" name="Friends..."/>
+ <menu_item_call label="I miei gruppi" name="Groups..."/>
+ <menu_item_call label="Il mio profilo" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
new file mode 100644
index 0000000000..185cf75183
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
+ <menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
+ <menu_item_check label="Tasto Camera" name="ShowCameraButton"/>
+ <menu_item_check label="Tasto Snapshot" name="ShowSnapshotButton"/>
+ <menu_item_call label="Taglia" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copia" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Incolla" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Cancella" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleziona Tutto" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_favorites.xml b/indra/newview/skins/default/xui/it/menu_favorites.xml
new file mode 100644
index 0000000000..9c4966d198
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleport" name="Teleport To Landmark"/>
+ <menu_item_call label="Vedi/Modifica Landmark" name="Landmark Open"/>
+ <menu_item_call label="Copia SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostra sulla mappa" name="Show On Map"/>
+ <menu_item_call label="Copia" name="Landmark Copy"/>
+ <menu_item_call label="Incolla" name="Landmark Paste"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_gesture_gear.xml b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml
new file mode 100644
index 0000000000..c4f9d21d14
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Aggiungi/Cancella dai favoriti" name="activate"/>
+ <menu_item_call label="Copia" name="copy_gesture"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Copia UUID" name="copy_uuid"/>
+ <menu_item_call label="Salva outfit" name="save_to_outfit"/>
+ <menu_item_call label="Modifica" name="edit_gesture"/>
+ <menu_item_call label="Ispeziona" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_group_plus.xml b/indra/newview/skins/default/xui/it/menu_group_plus.xml
new file mode 100644
index 0000000000..6b7692a067
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Unisciti al gruppo..." name="item_join"/>
+ <menu_item_call label="Nuovo gruppo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
new file mode 100644
index 0000000000..a87e76a19b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostra la barra dei favoriti" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..f78ed8489f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..f39ad316fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Informazioni gruppo" name="Show Profile"/>
+ <menu_item_call label="Mostra sessione" name="Chat"/>
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..e89576b1f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Vedi profilo" name="Show Profile"/>
+ <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Mostra sessione" name="Send IM"/>
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..968fbd37ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Vedi profilo" name="view_profile"/>
+ <menu_item_call label="Chiedi amicizia" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Chiama" name="call"/>
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="Invita nel gruppo" name="invite_to_group"/>
+ <menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Denuncia" name="report"/>
+ <menu_item_call label="Congela" name="freeze"/>
+ <menu_item_call label="Espelli" name="eject"/>
+ <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Trova sulla mappa" name="find_on_map"/>
+ <menu_item_call label="Avvicinati" name="zoom_in"/>
+ <menu_item_call label="Paga" name="pay"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..74d828fc20
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocca" name="touch"/>
+ <menu_item_call label="Siedi" name="sit"/>
+ <menu_item_call label="Paga" name="pay"/>
+ <menu_item_call label="Compra" name="buy"/>
+ <menu_item_call label="Prendi" name="take"/>
+ <menu_item_call label="Prendi copia" name="take_copy"/>
+ <menu_item_call label="Apri" name="open"/>
+ <menu_item_call label="Modifica" name="edit"/>
+ <menu_item_call label="Indossa" name="wear"/>
+ <menu_item_call label="Denuncia" name="report"/>
+ <menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Avvicinati" name="zoom_in"/>
+ <menu_item_call label="Cancella" name="remove"/>
+ <menu_item_call label="Più info" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..1812a21b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Alzati" name="stand_up"/>
+ <menu_item_call label="Il mio aspetto fisico" name="my_appearance"/>
+ <menu_item_call label="Il mio profilo" name="my_profile"/>
+ <menu_item_call label="I miei amici" name="my_friends"/>
+ <menu_item_call label="I miei gruppi" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index 31b50e8d6b..edb9490914 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Nuovo Script" name="New Script"/>
<menu_item_call label="Nuova Notecard" name="New Note"/>
<menu_item_call label="Nuova Gesture" name="New Gesture"/>
- <menu name="New Clothes">
+ <menu label="Maglietta Intima" name="New Clothes">
<menu_item_call label="Nuova Maglietta" name="New Shirt"/>
<menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
<menu_item_call label="Nuove Scarpe" name="New Shoes"/>
@@ -22,31 +22,47 @@
<menu_item_call label="Nuovi Guanti" name="New Gloves"/>
<menu_item_call label="Nuova Canottiera" name="New Undershirt"/>
<menu_item_call label="Nuove Mutande" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
+ <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
+ <menu label="Nuove Parti del Corpo" name="New Body Parts">
<menu_item_call label="Nuova Forma del corpo" name="New Shape"/>
<menu_item_call label="Nuova Pelle" name="New Skin"/>
<menu_item_call label="Nuovi Capelli" name="New Hair"/>
<menu_item_call label="Nuovi Occhi" name="New Eyes"/>
</menu>
+ <menu label="Cambia Tipo" name="Change Type">
+ <menu_item_call label="Predefinito" name="Default"/>
+ <menu_item_call label="Guanti" name="Gloves"/>
+ <menu_item_call label="Giacca" name="Jacket"/>
+ <menu_item_call label="Pantaloni" name="Pants"/>
+ <menu_item_call label="Shape" name="Shape"/>
+ <menu_item_call label="Scarpe" name="Shoes"/>
+ <menu_item_call label="Camicia" name="Shirt"/>
+ <menu_item_call label="Gonna" name="Skirt"/>
+ <menu_item_call label="Slip" name="Underpants"/>
+ <menu_item_call label="Maglietta Intima" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teletrasportati" name="Landmark Open"/>
<menu_item_call label="Apri" name="Animation Open"/>
<menu_item_call label="Apri" name="Sound Open"/>
<menu_item_call label="Elimina oggetto" name="Purge Item"/>
<menu_item_call label="Ripristina oggetto" name="Restore Item"/>
+ <menu_item_call label="Vai al Link" name="Goto Link"/>
<menu_item_call label="Apri" name="Open"/>
<menu_item_call label="Proprietà" name="Properties"/>
<menu_item_call label="Rinomina" name="Rename"/>
<menu_item_call label="Copia UUID dell&apos;oggetto" name="Copy Asset UUID"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Incolla come Link" name="Paste As Link"/>
<menu_item_call label="Cancella" name="Delete"/>
<menu_item_call label="Togli gli oggetti" name="Take Off Items"/>
<menu_item_call label="Aggiungi all&apos;outfit" name="Add To Outfit"/>
<menu_item_call label="Sostituisci outfit" name="Replace Outfit"/>
<menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/>
<menu_item_call label="Esegui" name="Sound Play"/>
- <menu_item_call label="Informazioni sul landmark" name="Teleport To Landmark"/>
+ <menu_item_call label="Informazioni sul Landmark" name="About Landmark"/>
<menu_item_call label="Esegui inworld" name="Animation Play"/>
<menu_item_call label="Esegui localmente" name="Animation Audition"/>
<menu_item_call label="Invia un Instant Message" name="Send Instant Message"/>
@@ -54,8 +70,8 @@
<menu_item_call label="Inizia una conferenza chat" name="Conference Chat"/>
<menu_item_call label="Attiva" name="Activate"/>
<menu_item_call label="Disattiva" name="Deactivate"/>
+ <menu_item_call label="Salva con nome" name="Save As"/>
<menu_item_call label="Stacca da te" name="Detach From Yourself"/>
- <menu_item_call label="Ripristina all&apos;ultima posizione" name="Restore to Last Position"/>
<menu_item_call label="Indossa" name="Object Wear"/>
<menu label="Attacca a" name="Attach To"/>
<menu label="Attacca all&apos;HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
new file mode 100644
index 0000000000..d33dabc4c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Carica sul server" name="upload">
+ <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
+ <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
+ <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nuova Cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo Script" name="New Script"/>
+ <menu_item_call label="Nuova Notecard" name="New Note"/>
+ <menu_item_call label="Nuova Gesture" name="New Gesture"/>
+ <menu label="Nuovi Abiti" name="New Clothes">
+ <menu_item_call label="Nuova Camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove Calze" name="New Socks"/>
+ <menu_item_call label="Nuova Giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova Gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi Slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuove Parti del Corpo" name="New Body Parts">
+ <menu_item_call label="Nuova Shape" name="New Shape"/>
+ <menu_item_call label="Nuova Pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi Capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..e97af5c950
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nuova Finestra di Inventory" name="new_window"/>
+ <menu_item_call label="Ordina per nome" name="sort_by_name"/>
+ <menu_item_call label="Ordina per data (più recenti)" name="sort_by_recent"/>
+ <menu_item_call label="Mostra i Filtri" name="show_filters"/>
+ <menu_item_call label="Cancella i Filtri" name="reset_filters"/>
+ <menu_item_call label="Chiudi le cartelle" name="close_folders"/>
+ <menu_item_call label="Svuota cestino" name="empty_trash"/>
+ <menu_item_call label="Svuota Persi e Ritrovati" name="empty_lostnfound"/>
+ <menu_item_call label="Salva texture come" name="Save Texture As"/>
+ <menu_item_call label="Trova originale" name="Find Original"/>
+ <menu_item_call label="Trova tutti i link" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_land.xml b/indra/newview/skins/default/xui/it/menu_land.xml
new file mode 100644
index 0000000000..173c080c3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Info sul terreno" name="Place Information..."/>
+ <menu_item_call label="Siedi qui" name="Sit Here"/>
+ <menu_item_call label="Compra questo terreno" name="Land Buy"/>
+ <menu_item_call label="Compra permesso" name="Land Buy Pass"/>
+ <menu_item_call label="Costruisci" name="Create"/>
+ <menu_item_call label="Modifica terreno" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_landmark.xml b/indra/newview/skins/default/xui/it/menu_landmark.xml
new file mode 100644
index 0000000000..58e3e992ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copia SLurl" name="copy"/>
+ <menu_item_call label="Cancella" name="delete"/>
+ <menu_item_call label="Crea luogo consigliato" name="pick"/>
+ <menu_item_call label="Aggiungi alla barra dei favoriti" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 44a801d273..db3b84df29 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -1,13 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="File" name="File">
+ <menu label="Io" name="File">
+ <menu_item_call label="Preferenze" name="Preferences..."/>
<menu_item_call label="Chiudi" name="Quit"/>
</menu>
- <menu label="Modifica" name="Edit">
- <menu_item_call label="Preferenze...." name="Preferences..."/>
- </menu>
<menu label="Aiuto" name="Help">
<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Informazioni su [APP_NAME]..." name="About Second Life..."/>
+ </menu>
+ <menu label="Debug" name="Debug">
+ <menu label="Modifica" name="Edit">
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Ripeti" name="Redo"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Duplica" name="Duplicate"/>
+ <menu_item_call label="Seleziona Tutto" name="Select All"/>
+ <menu_item_call label="Deseleziona" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/>
+ <menu_item_call label="Impostazioni colori Interfaccia" name="UI/Color Settings"/>
+ <menu_item_call label="Mostra la finestra laterale" name="Show Side Tray"/>
+ <menu label="Test Interfaccia Utente" name="UI Tests"/>
+ <menu_item_call label="Mostra i Termini di Servizio (TOS)" name="TOS"/>
+ <menu_item_call label="Mostra Messaggi critici" name="Critical"/>
+ <menu_item_call label="Test Web browser" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml
index 1109f3f646..7caa7fd226 100644
--- a/indra/newview/skins/default/xui/it/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
<menu_item_call label="Zoom Medio" name="Zoom Medium"/>
<menu_item_call label="Zoom Distante" name="Zoom Far"/>
+ <menu_item_check label="Ruota la mappa" name="Rotate Map"/>
<menu_item_call label="Ferma il puntamento" name="Stop Tracking"/>
- <menu_item_call label="Profilo..." name="Profile"/>
+ <menu_item_call label="Mappa del mondo" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_navbar.xml b/indra/newview/skins/default/xui/it/menu_navbar.xml
new file mode 100644
index 0000000000..3d855cf701
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
+ <menu_item_check label="Mostra proprietà parcel" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_nearby_chat.xml b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml
new file mode 100644
index 0000000000..2a625fc763
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostra le persone vicine..." name="nearby_people"/>
+ <menu_item_check label="Mostra Testo bloccato" name="muted_text"/>
+ <menu_item_check label="Mostra Icone amici" name="show_buddy_icons"/>
+ <menu_item_check label="Mostra nomi" name="show_names"/>
+ <menu_item_check label="Mostra Icone e nomi" name="show_icons_and_names"/>
+ <menu_item_call label="Dimensioni del Font" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml
new file mode 100644
index 0000000000..955d4c8776
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_object.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocca" name="Object Touch"/>
+ <menu_item_call label="Modifica" name="Edit..."/>
+ <menu_item_call label="Costruisci" name="Build"/>
+ <menu_item_call label="Apri" name="Open"/>
+ <menu_item_call label="Siedi qui" name="Object Sit"/>
+ <menu_item_call label="Profilo oggetto" name="Object Inspect"/>
+ <context_menu label="Metti &gt;" name="Put On">
+ <menu_item_call label="Indossa" name="Wear"/>
+ <context_menu label="Attacca &gt;" name="Object Attach"/>
+ <context_menu label="Attacca HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Togli &gt;" name="Remove">
+ <menu_item_call label="Prendi" name="Pie Object Take"/>
+ <menu_item_call label="Denuncia abuso" name="Report Abuse..."/>
+ <menu_item_call label="Blocca" name="Object Mute"/>
+ <menu_item_call label="Restituisci" name="Return..."/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Prendi copia" name="Take Copy"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+ <menu_item_call label="Compra" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_object_icon.xml b/indra/newview/skins/default/xui/it/menu_object_icon.xml
new file mode 100644
index 0000000000..0f347b1a90
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Profilo oggetto..." name="Object Profile"/>
+ <menu_item_call label="Blocca..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_participant_list.xml b/indra/newview/skins/default/xui/it/menu_participant_list.xml
new file mode 100644
index 0000000000..33c8fc404d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_participant_list.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_call label="Vedi profilo" name="View Profile"/>
+ <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+ <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
+ <menu_item_check label="Muta testo" name="MuteText"/>
+ <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>
+ <menu_item_call label="Muta questo partecipante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Muta tutti gli altri" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Riabilita questo partecipante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Riabilita tutti gli altri" name="ModerateVoiceUnMuteOthers"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..ad8927be13
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordina per nome" name="sort_name"/>
+ <menu_item_check label="Ordina per stato" name="sort_status"/>
+ <menu_item_check label="Icone persone" name="view_icons"/>
+ <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..d31ddaf1aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Visualizza le icone di gruppo" name="Display Group Icons"/>
+ <menu_item_call label="Lascia i gruppi selezionati" name="Leave Selected Group"/>
+</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
new file mode 100644
index 0000000000..be071a5074
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Vedi profilo" name="View Profile"/>
+ <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+ <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..f9fda2fb98
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Chiedi amicizie" name="Add Friends"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..c1b384196d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordina mettendo per primo chi ha parlato per ultimo" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordina per nome" name="sort_name"/>
+ <menu_item_check label="Ordina per Distanza" name="sort_distance"/>
+ <menu_item_check label="Vedi le icone delle persone" name="view_icons"/>
+ <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..f8fd9dca79
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostra prima i più recenti" name="sort_most"/>
+ <menu_item_check label="Ordina per nome" name="sort_name"/>
+ <menu_item_check label="Vedi le icone delle persone" name="view_icons"/>
+ <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_picks.xml b/indra/newview/skins/default/xui/it/menu_picks.xml
new file mode 100644
index 0000000000..e84b321ccf
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Informazioni" name="pick_info"/>
+ <menu_item_call label="Modifica" name="pick_edit"/>
+ <menu_item_call label="Teleport" name="pick_teleport"/>
+ <menu_item_call label="Mappa" name="pick_map"/>
+ <menu_item_call label="Cancella" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_picks_plus.xml b/indra/newview/skins/default/xui/it/menu_picks_plus.xml
new file mode 100644
index 0000000000..d758a9715e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Nuovo luogo consigliato" name="create_pick"/>
+ <menu_item_call label="Nuovo Annuncio" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_place.xml b/indra/newview/skins/default/xui/it/menu_place.xml
new file mode 100644
index 0000000000..5b9261b159
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Prendi il Landmark" name="landmark"/>
+ <menu_item_call label="Crea luogo consigliato" name="pick"/>
+ <menu_item_call label="Compra Permesso" name="pass"/>
+ <menu_item_call label="Modifica" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_place_add_button.xml b/indra/newview/skins/default/xui/it/menu_place_add_button.xml
new file mode 100644
index 0000000000..6dd10f422e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Aggiungi landmark" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..45765bf77d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Aggiungi Landmark" name="add_landmark"/>
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Taglia" name="cut"/>
+ <menu_item_call label="Copia" name="copy_folder"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Rinomina" name="rename"/>
+ <menu_item_call label="Cancella" name="delete"/>
+ <menu_item_call label="Apri" name="expand"/>
+ <menu_item_call label="Chiudi" name="collapse"/>
+ <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
+ <menu_item_check label="Ordina per data" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..2c5b8a848c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="Maggiori Informazioni" name="more_info"/>
+ <menu_item_call label="Mostra sulla Mappa" name="show_on_map"/>
+ <menu_item_call label="Aggiungi Landmark" name="add_landmark"/>
+ <menu_item_call label="Aggiungi Cartella" name="add_folder"/>
+ <menu_item_call label="Taglia" name="cut"/>
+ <menu_item_call label="Copia Landmark" name="copy_landmark"/>
+ <menu_item_call label="Copia SLurl" name="copy_slurl"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Rinomina" name="rename"/>
+ <menu_item_call label="Cancella" name="delete"/>
+ <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
+ <menu_item_check label="Ordina per Data" name="sort_by_date"/>
+ <menu_item_call label="Crea Luogo Consigliato" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_profile_overflow.xml b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml
new file mode 100644
index 0000000000..76a04a127e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Paga" name="pay"/>
+ <menu_item_call label="Condividi" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_slurl.xml b/indra/newview/skins/default/xui/it/menu_slurl.xml
index 283fd92b19..be83133efc 100644
--- a/indra/newview/skins/default/xui/it/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/it/menu_slurl.xml
@@ -2,5 +2,5 @@
<menu name="Popup">
<menu_item_call label="Informazioni sull&apos;indirizzo URL" name="about_url"/>
<menu_item_call label="Teleportati all&apos;indirizzo URL" name="teleport_to_url"/>
- <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Mappa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..71acda5a9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Apri tutte le cartelle" name="Expand all folders"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="Collapse all folders"/>
+ <menu_item_call label="Cancella la storia dei Teleport" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..c01230584b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleport" name="Teleport"/>
+ <menu_item_call label="Più informazioni" name="More Information"/>
+ <menu_item_call label="Copia negli appunti" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..c221f141a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Apri" name="TabOpen"/>
+ <menu_item_call label="Chiudi" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_text_editor.xml b/indra/newview/skins/default/xui/it/menu_text_editor.xml
new file mode 100644
index 0000000000..baab233a21
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Seleziona Tutto" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml
new file mode 100644
index 0000000000..874f7a8df9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra profilo" name="show_agent"/>
+ <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_group.xml b/indra/newview/skins/default/xui/it/menu_url_group.xml
new file mode 100644
index 0000000000..ac9dab2b3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra info gruppo" name="show_group"/>
+ <menu_item_call label="Copia gruppo negli appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_http.xml b/indra/newview/skins/default/xui/it/menu_url_http.xml
new file mode 100644
index 0000000000..b8f965f2d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Apri pagina web" name="url_open"/>
+ <menu_item_call label="Apri nel browser interno" name="url_open_internal"/>
+ <menu_item_call label="Apri nel browser esterno" name="url_open_external"/>
+ <menu_item_call label="Copia URL negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_inventory.xml b/indra/newview/skins/default/xui/it/menu_url_inventory.xml
new file mode 100644
index 0000000000..0b410b4eff
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra elemento dell&apos;inventory" name="show_item"/>
+ <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_map.xml b/indra/newview/skins/default/xui/it/menu_url_map.xml
new file mode 100644
index 0000000000..096efcd1b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleportati nel luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml
new file mode 100644
index 0000000000..67a9f0b914
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra info oggetto" name="show_object"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleportati sul luogo dell&apos;oggetto" name="teleport_to_object"/>
+ <menu_item_call label="Copia nome oggetto negli appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_parcel.xml b/indra/newview/skins/default/xui/it/menu_url_parcel.xml
new file mode 100644
index 0000000000..e40d05f423
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra info appezzamento" name="show_parcel"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_slapp.xml b/indra/newview/skins/default/xui/it/menu_url_slapp.xml
new file mode 100644
index 0000000000..2e5ad64a59
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Lancia questo comando" name="run_slapp"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_slurl.xml b/indra/newview/skins/default/xui/it/menu_url_slurl.xml
new file mode 100644
index 0000000000..1850252669
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra info del luogo" name="show_place"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleporta nel luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_teleport.xml b/indra/newview/skins/default/xui/it/menu_url_teleport.xml
new file mode 100644
index 0000000000..0a09090c26
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleportati in questo posto" name="teleport"/>
+ <menu_item_call label="Mostra Sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 0010f42a12..f9605da22a 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,207 +1,326 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="File" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Carica" name="upload">
- <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
- <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
- <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
- <menu_item_call label="Multiplo ([COST]L$ per file)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Imposta i permessi di base..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Chiudi la finestra" name="Close Window"/>
- <menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Salva la texture come..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Fai una fotografia" name="Take Snapshot"/>
- <menu_item_call label="Salva la fotografia sul tuo disco" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Disconnetti" name="Quit"/>
+ <menu label="Io" name="Me">
+ <menu_item_call label="Preferenze" name="Preferences"/>
+ <menu_item_call label="Il mio Pannello di Controllo" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
+ </menu_item_call>
+ <menu_item_call label="Compra L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Il Mio Profilo" name="Profile"/>
+ <menu_item_call label="Il Mio Aspetto" name="Appearance"/>
+ <menu_item_check label="Il Mio Inventory" name="Inventory"/>
+ <menu_item_call label="Mostra Inventory su Barra Laterale" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Le mie Gesture" name="Gestures"/>
+ <menu label="Il Mio Stato" name="Status">
+ <menu_item_call label="Non Disponibile" name="Set Away"/>
+ <menu_item_call label="Non Disponibile" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Richiedi Status Amministratore" name="Request Admin Options"/>
+ <menu_item_call label="Lascia Status Amministratore" name="Leave Admin Options"/>
+ <menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Modifica" name="Edit">
- <menu_item_call label="Annulla" name="Undo"/>
- <menu_item_call label="Ripeti" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Cerca..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Seleziona tutto" name="Select All"/>
- <menu_item_call label="Deseleziona" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplica" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Indossa l&apos;oggetto" name="Attach Object"/>
- <menu label="Togli l&apos;oggetto" name="Detach Object"/>
- <menu label="Spogliati dei vestiti" name="Take Off Clothing">
- <menu_item_call label="Maglietta" name="Shirt"/>
- <menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Scarpe" name="Shoes"/>
- <menu_item_call label="Calze" name="Socks"/>
- <menu_item_call label="Giacca" name="Jacket"/>
- <menu_item_call label="Guanti" name="Gloves"/>
- <menu_item_call label="Canottiera" name="Menu Undershirt"/>
- <menu_item_call label="Mutande" name="Menu Underpants"/>
- <menu_item_call label="Gonna" name="Skirt"/>
- <menu_item_call label="Tutti i vestiti" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gesture..." name="Gestures..."/>
- <menu_item_call label="Profilo..." name="Profile..."/>
- <menu_item_call label="Aspetto fisico..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amici..." name="Friends..."/>
- <menu_item_call label="Gruppi..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Preferenze..." name="Preferences..."/>
- </menu>
- <menu label="Visualizza" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Visualizzazione in soggettiva" name="Mouselook"/>
- <menu_item_check label="Costruisci" name="Build"/>
- <menu_item_check label="Camera dall&apos;alto" name="Joystick Flycam"/>
- <menu_item_call label="Reimposta la visuale" name="Reset View"/>
- <menu_item_call label="Guarda l&apos;ultimo che ha parlato" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Strumenti" name="Toolbar"/>
- <menu_item_check label="Chat locale" name="Chat History"/>
- <menu_item_check label="Comunica" name="Instant Message"/>
- <menu_item_check label="Inventario" name="Inventory"/>
- <menu_item_check label="Residenti con voice attivo" name="Active Speakers"/>
- <menu_item_check label="Residenti ignorati &amp; Oggetti" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Controlli della telecamera" name="Camera Controls"/>
- <menu_item_check label="Controlli dei movimenti" name="Movement Controls"/>
- <menu_item_check label="Mappa globale" name="World Map"/>
- <menu_item_check label="Mini-Mappa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Barra delle statistiche" name="Statistics Bar"/>
- <menu_item_check label="Confini della proprietÃ" name="Property Lines"/>
- <menu_item_check label="Linee di confini privati" name="Banlines"/>
- <menu_item_check label="Proprietari dei terreni" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Suggerimenti" name="Hover Tips">
- <menu_item_check label="Mostra suggerimenti" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Suggerimenti sul terreno" name="Land Tips"/>
- <menu_item_check label="Suggerimenti su tutti gli oggetti" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Evidenzia oggetti trasparenti" name="Highlight Transparent"/>
- <menu_item_check label="Tracciatori" name="beacons"/>
- <menu_item_check label="Nascondi le particelle" name="Hide Particles"/>
- <menu_item_check label="Mostra dispositivi HUD indossati" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Zoom Avanti" name="Zoom In"/>
- <menu_item_call label="Zoom Default" name="Zoom Default"/>
- <menu_item_call label="Zoom Indietro" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Alterna schermo intero" name="Toggle Fullscreen"/>
- <menu_item_call label="Reimposta la grandezza dell&apos;interfaccia al default" name="Set UI Size to Default"/>
+ <menu label="Comunica" name="Communicate">
+ <menu_item_call label="I Miei Amici" name="My Friends"/>
+ <menu_item_call label="I Miei Gruppi" name="My Groups"/>
+ <menu_item_check label="Chat Limitrofa" name="Nearby Chat"/>
+ <menu_item_call label="Persone Vicine" name="Active Speakers"/>
+ <menu_item_check label="MultiMedia Vicini" name="Nearby Media"/>
</menu>
<menu label="Mondo" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Corri sempre" name="Always Run"/>
- <menu_item_check label="Vola" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Crea qui un landmark" name="Create Landmark Here"/>
- <menu_item_call label="Imposta la tua casa qui" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleportati a casa" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Imposta come &apos;Assente&apos;" name="Set Away"/>
- <menu_item_call label="Imposta occupato" name="Set Busy"/>
- <menu_item_call label="Ferma le animazioni sul mio avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Rilascia tutti i dispositivi" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Estratto conto..." name="Account History..."/>
- <menu_item_call label="Gestisci il mio account..." name="Manage My Account..."/>
- <menu_item_call label="Compra L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Il mio terreno..." name="My Land..."/>
- <menu_item_call label="Informazioni sul terreno..." name="About Land..."/>
- <menu_item_call label="Acquista il terreno..." name="Buy Land..."/>
- <menu_item_call label="Regione/Proprietà Immobiliari..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Impostazioni dell&apos;ambiente" name="Environment Settings">
+ <menu_item_check label="Muovi" name="Movement Controls"/>
+ <menu_item_check label="Vista" name="Camera Controls"/>
+ <menu_item_call label="Info Terreno" name="About Land"/>
+ <menu_item_call label="Regione/Proprietà Immobiliari" name="Region/Estate"/>
+ <menu_item_call label="Compra Terreno" name="Buy Land"/>
+ <menu_item_call label="Il Mio Terreno" name="My Land"/>
+ <menu label="Mostra" name="Land">
+ <menu_item_check label="Linee Non Accessibili" name="Ban Lines"/>
+ <menu_item_check label="Segnalatori" name="beacons"/>
+ <menu_item_check label="Linee di Confine" name="Property Lines"/>
+ <menu_item_check label="Proprietari della Terra" name="Land Owners"/>
+ </menu>
+ <menu label="Landmark" name="Landmarks">
+ <menu_item_call label="Crea Landmark Qui" name="Create Landmark Here"/>
+ <menu_item_call label="Imposta Qui come Casa" name="Set Home to Here"/>
+ </menu>
+ <menu_item_call label="Teleport Casa" name="Teleport Home"/>
+ <menu_item_check label="Mini-Mappa" name="Mini-Map"/>
+ <menu_item_check label="Mappa del Mondo" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu label="Sole" name="Environment Settings">
<menu_item_call label="Alba" name="Sunrise"/>
<menu_item_call label="Mezzogiorno" name="Noon"/>
<menu_item_call label="Tramonto" name="Sunset"/>
<menu_item_call label="Mezzanotte" name="Midnight"/>
- <menu_item_call label="Reimposta al default della regione" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Usa l&apos;ora della Proprietà" name="Revert to Region Default"/>
<menu_item_call label="Editor dell&apos;ambiente" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Strumenti" name="Tools">
- <menu label="Seleziona strumento" name="Select Tool">
- <menu_item_call label="Focalizza" name="Focus"/>
- <menu_item_call label="Muovi" name="Move"/>
- <menu_item_call label="Modifica" name="Edit"/>
- <menu_item_call label="Crea" name="Create"/>
- <menu_item_call label="Terra" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/>
- <menu_item_check label="Seleziona solo gli oggetti mobili" name="Select Only Movable Objects"/>
- <menu_item_check label="Seleziona solo se racchiuso" name="Select By Surrounding"/>
- <menu_item_check label="Mostra selezione nascosta" name="Show Hidden Selection"/>
- <menu_item_check label="Mostra raggio di luce per la selezione" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostra raggio di selezione" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Allinea al righello" name="Snap to Grid"/>
- <menu_item_call label="Allinea l&apos;oggetto XY al righello" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usa la selezione come righello" name="Use Selection for Grid"/>
- <menu_item_call label="Opzioni del righello..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Modifica parti di oggetti uniti" name="Edit Linked Parts"/>
+ <menu label="Build" name="BuildTools">
+ <menu_item_check label="Build" name="Show Build Tools"/>
+ <menu label="Seleziona Strumento Build" name="Select Tool">
+ <menu_item_call label="Strumento Focalizza" name="Focus"/>
+ <menu_item_call label="Strumento Movimento" name="Move"/>
+ <menu_item_call label="Strumento Modifica" name="Edit"/>
+ <menu_item_call label="Crea Strumento" name="Create"/>
+ <menu_item_call label="Strumento Terreno" name="Land"/>
+ </menu>
+ <menu label="Modifica" name="Edit">
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Rifai" name="Redo"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Duplica" name="Duplicate"/>
+ <menu_item_call label="Seleziona Tutto" name="Select All"/>
+ <menu_item_call label="Deseleziona" name="Deselect"/>
+ </menu>
<menu_item_call label="Unisci" name="Link"/>
- <menu_item_call label="Dividi" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Focalizza la selezione" name="Focus on Selection"/>
- <menu_item_call label="Fai zoom sulla selezione" name="Zoom to Selection"/>
- <menu_item_call label="Compra l&apos;oggetto" name="Menu Object Take">
- <on_enable userdata="Compra,Prendi" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Prendi una copia" name="Take Copy"/>
- <menu_item_call label="Salva nuovamente l&apos;oggetto nel contenuto dell&apos;oggetto" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Mostra avvisi script/finestra degli errori" name="Show Script Warning/Error Window"/>
- <menu label="Ricompila gli script nella selezione" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Reimposta gli script nella selezione" name="Reset Scripts in Selection"/>
- <menu_item_call label="Attiva gli script nella selezione" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Disattiva gli script nella selezione" name="Set Scripts to Not Running in Selection"/>
+ <menu_item_call label="Separa" name="Unlink"/>
+ <menu_item_call label="Focalizza su Selezione" name="Focus on Selection"/>
+ <menu_item_call label="Avvicina alla Selezione" name="Zoom to Selection"/>
+ <menu label="Oggetto" name="Object">
+ <menu_item_call label="Compra" name="Menu Object Take"/>
+ <menu_item_call label="Prendi Copia" name="Take Copy"/>
+ <menu_item_call label="Salva Nuovamente nell&apos;Inventory" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Salva Nuovamente Nel Contenuto Oggetto" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Script" name="Scripts">
+ <menu_item_call label="Ricompila Script (Mono)" name="Mono"/>
+ <menu_item_call label="Ricompila gli Script(LSL)" name="LSL"/>
+ <menu_item_call label="Reimposta gli Script" name="Reset Scripts"/>
+ <menu_item_call label="Imposta gli Script in Esecuzione" name="Set Scripts to Running"/>
+ <menu_item_call label="Imposta gli Script Non In Esecuzione" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opzioni" name="Options">
+ <menu_item_check label="Modifica Parti Unite" name="Edit Linked Parts"/>
+ <menu_item_call label="Imposta Permessi di Upload predefiniti" name="perm prefs"/>
+ <menu_item_check label="Mostra Permessi Avanzati" name="DebugPermissions"/>
+ <menu label="Selezione" name="Selection">
+ <menu_item_check label="Seleziona Solo i Miei Oggetti" name="Select Only My Objects"/>
+ <menu_item_check label="Seleziona Solo Oggetti Mobili" name="Select Only Movable Objects"/>
+ <menu_item_check label="Seleziona Se Racchiuso" name="Select By Surrounding"/>
+ </menu>
+ <menu label="Mostra" name="Show">
+ <menu_item_check label="Mostra Selezione Nascosta" name="Show Hidden Selection"/>
+ <menu_item_check label="Mostra Raggio Luce per Selezione" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Mostra Raggio Selezione" name="Show Selection Beam"/>
+ </menu>
+ <menu label="Griglia" name="Grid">
+ <menu_item_check label="Allinea al Righello" name="Snap to Grid"/>
+ <menu_item_call label="Allinea Coordinate XY alla Griglia" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Usa Selezione per la Griglia" name="Use Selection for Grid"/>
+ <menu_item_call label="Opzioni Griglia" name="Grid Options"/>
+ </menu>
+ </menu>
+ <menu label="Seleziona Parti Unite" name="Select Linked Parts">
+ <menu_item_call label="Seleziona Prossima Parte" name="Select Next Part"/>
+ <menu_item_call label="Seleziona Parte Precedente" name="Select Previous Part"/>
+ <menu_item_call label="Includi Prossima Parte" name="Include Next Part"/>
+ <menu_item_call label="Includi Parte Precedente" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Aiuto" name="Help">
- <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="[SECOND_LIFE] Aiuto" name="Second Life Help"/>
<menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog ufficiale Linden..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portale degli script..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Denuncia di abuso..." name="Report Abuse..."/>
- <menu_item_call label="Collisioni, Spinte &amp; Colpi..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Misuratore del lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Segnalazione di un bug" name="Bug Reporting">
- <menu_item_call label="Registro pubblico errori..." name="Public Issue Tracker..."/>
- <menu_item_call label="Aiuto per il registro pubblico errori..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Come fare la segnalazione di un bug..." name="Bug Reporing 101..."/>
- <menu_item_call label="Problematiche di sicurezza..." name="Security Issues..."/>
- <menu_item_call label="Wiki QA - controllo qualità..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Segnala un bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Informazioni su [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Denuncia Abuso" name="Report Abuse"/>
+ <menu_item_call label="Segnala Bug" name="Report Bug"/>
+ </menu>
+ <menu label="Avanzato" name="Advanced">
+ <menu_item_check label="Imposta non disponibile dopo 30 Minuti" name="Go Away/AFK When Idle"/>
+ <menu_item_call label="Ferma le Animazioni" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Ridisegna le Texture" name="Rebake Texture"/>
+ <menu_item_call label="Riporta le Dimensioni dell&apos;interfaccia ai Valori Predefiniti" name="Set UI Size to Default"/>
+ <menu_item_check label="Limita Distanza di Selezione" name="Limit Select Distance"/>
+ <menu_item_check label="Disabilita i Vincoli della Camera" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto ad alta risoluzione" name="HighResSnapshot"/>
+ <menu_item_check label="Manda Foto su Disco Senza Avvisi" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Comprimi le Foto su Disco" name="CompressSnapshotsToDisk"/>
+ <menu label="Strumenti di Performance" name="Performance Tools">
+ <menu_item_call label="Misuratore Lag" name="Lag Meter"/>
+ <menu_item_check label="Barra Statistiche" name="Statistics Bar"/>
+ <menu_item_check label="Mostra Il Costo Visualizzazione Avatar (ARC)" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Evidenziazione e Visibilità" name="Highlighting and Visibility">
+ <menu_item_check label="Effetto Lampeggiante Segnalatore" name="Cheesy Beacon"/>
+ <menu_item_check label="Nascondi Particelle" name="Hide Particles"/>
+ <menu_item_check label="Nascondi Selezionati" name="Hide Selected"/>
+ <menu_item_check label="Evidenzia Trasparente" name="Highlight Transparent"/>
+ <menu_item_check label="Mostra Attachment HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostra Mirino in Soggettiva" name="ShowCrosshairs"/>
+ <menu_item_check label="Mostra Tooltip sul Terreno" name="Land Tips"/>
+ </menu>
+ <menu label="Modalità di Rendering" name="Rendering Types">
+ <menu_item_check label="Semplice" name="Simple"/>
+ <menu_item_check label="Alfa (Trasparenza)" name="Alpha"/>
+ <menu_item_check label="Albero" name="Tree"/>
+ <menu_item_check label="Avatar" name="Character"/>
+ <menu_item_check label="Superfici" name="SurfacePath"/>
+ <menu_item_check label="Cielo" name="Sky"/>
+ <menu_item_check label="Acqua" name="Water"/>
+ <menu_item_check label="Suolo" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Erba" name="Grass"/>
+ <menu_item_check label="Nuvole" name="Clouds"/>
+ <menu_item_check label="Particelle" name="Particles"/>
+ <menu_item_check label="Urti" name="Bump"/>
+ </menu>
+ <menu label="Caratteristiche di Rendering" name="Rendering Features">
+ <menu_item_check label="Interfaccia Utente" name="UI"/>
+ <menu_item_check label="Selezionati" name="Selected"/>
+ <menu_item_check label="Evidenziato" name="Highlighted"/>
+ <menu_item_check label="Texture Dinamiche" name="Dynamic Textures"/>
+ <menu_item_check label="Ombre dei Piedi" name="Foot Shadows"/>
+ <menu_item_check label="Nebbia" name="Fog"/>
+ <menu_item_check label="Oggetti Flessibili" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Esegui Thread Multipli" name="Run Multiple Threads"/>
+ <menu_item_call label="Pulisci la Cache di Gruppo" name="ClearGroupCache"/>
+ <menu_item_check label="Fluidità Mouse" name="Mouse Smoothing"/>
+ <menu_item_check label="Mostra IM nella Chat Limitrofa" name="IMInChat"/>
+ <menu label="Scorciatoie" name="Shortcuts">
+ <menu_item_check label="Ricerca" name="Search"/>
+ <menu_item_call label="Rilascia Tasti" name="Release Keys"/>
+ <menu_item_call label="Imposta dimensioni Interfacca a Valori Predefiniti" name="Set UI Size to Default"/>
+ <menu_item_check label="Corri Sempre" name="Always Run"/>
+ <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_call label="Chiudi Finestra" name="Close Window"/>
+ <menu_item_call label="Chiudi Tutte le Finestre" name="Close All Windows"/>
+ <menu_item_call label="Foto su Disco" name="Snapshot to Disk"/>
+ <menu_item_call label="Soggettiva" name="Mouselook"/>
+ <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Reimposta Vista" name="Reset View"/>
+ <menu_item_call label="Guarda l&apos;Ultimo che ha parlato" name="Look at Last Chatter"/>
+ <menu label="Seleziona Strumento Build" name="Select Tool">
+ <menu_item_call label="Strumento Focalizza" name="Focus"/>
+ <menu_item_call label="Strumento Movimento" name="Move"/>
+ <menu_item_call label="Strumento Modifica" name="Edit"/>
+ <menu_item_call label="Crea Strumento" name="Create"/>
+ <menu_item_call label="Strumento Terreno" name="Land"/>
+ </menu>
+ <menu_item_call label="Avvicina" name="Zoom In"/>
+ <menu_item_call label="Zoom Predefinito" name="Zoom Default"/>
+ <menu_item_call label="Allontana" name="Zoom Out"/>
+ <menu_item_call label="Alterna Schermo Intero" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/>
+ <menu_item_check label="Mostra Menu Sviluppo" name="Debug Mode"/>
+ </menu>
+ <menu label="Sviluppo" name="Develop">
+ <menu label="Console" name="Consoles">
+ <menu_item_check label="Console Texture" name="Texture Console"/>
+ <menu_item_check label="Console di Debug" name="Debug Console"/>
+ <menu_item_call label="Console Notifiche" name="Notifications"/>
+ <menu_item_check label="Console Dimensioni Texture" name="Texture Size"/>
+ <menu_item_check label="Console Categoria Texture" name="Texture Category"/>
+ <menu_item_check label="Timer Veloci" name="Fast Timers"/>
+ <menu_item_check label="Memoria" name="Memory"/>
+ <menu_item_call label="Info Regione Sulla Console di Debug" name="Region Info to Debug Console"/>
+ <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_check label="Vento" name="Wind"/>
+ </menu>
+ <menu label="Mostra Info" name="Display Info">
+ <menu_item_check label="Mostra Tempo" name="Show Time"/>
+ <menu_item_check label="Mostra Info Rendering" name="Show Render Info"/>
+ <menu_item_check label="Mostra Colore sotto il Cursore" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostra Aggiornamenti agli Oggetti" name="Show Updates"/>
+ </menu>
+ <menu label="Forza Errori" name="Force Errors">
+ <menu_item_call label="Forza Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Forza LLError e Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Forza Accesso Invalido alla Memoria" name="Force Bad Memory Access"/>
+ <menu_item_call label="Forza Ciclo Infinito" name="Force Infinite Loop"/>
+ <menu_item_call label="Forza il Crash del Driver" name="Force Driver Carsh"/>
+ <menu_item_call label="Forza Eccezione Software" name="Force Software Exception"/>
+ <menu_item_call label="Forza Disconnessione Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simula un Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Test di Rendering" name="Render Tests">
+ <menu_item_check label="Spostamento Camera" name="Camera Offset"/>
+ <menu_item_check label="Framerate Casuale" name="Randomize Framerate"/>
+ <menu_item_check label="Test Frame" name="Frame Test"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Assi" name="Axes"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Illuminazione Globale" name="Global Illumination"/>
+ <menu_item_check label="Texture delle Animation" name="Animation Textures"/>
+ <menu_item_check label="Disabilita Textures" name="Disable Textures"/>
+ <menu_item_check label="Rendering Luci degli Attachment" name="Render Attached Lights"/>
+ <menu_item_check label="Visualizza Particelle dagli Attachment" name="Render Attached Particles"/>
+ <menu_item_check label="Gli Oggetti Brillano quando sono sotto il Cursore" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Rete" name="Network">
+ <menu_item_check label="Metti in Pausa Avatar" name="AgentPause"/>
+ <menu_item_call label="Perdi un Pacchetto" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Urti, Spinte &amp; Contatti" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Mondo" name="World">
+ <menu_item_check label="Sostituisci al Sole della Regione" name="Sim Sun Override"/>
+ <menu_item_check label="Effetto Lampeggiante Indicatore" name="Cheesy Beacon"/>
+ <menu_item_check label="Fissa il Clima" name="Fixed Weather"/>
+ <menu_item_call label="Stampa la Cache degli Oggetti in Regione" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Interfaccia Utente" name="UI">
+ <menu_item_call label="Test Browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Stampa Info per Oggetto Selezionato" name="Print Selected Object Info"/>
+ <menu_item_call label="Statistiche Memoria" name="Memory Stats"/>
+ <menu_item_check label="Doppio Click Pilota Automatico" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug Click" name="Debug Clicks"/>
+ <menu_item_check label="Debug Eventi del Mouse" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Ricarica Impostazioni Colori" name="Reload Color Settings"/>
+ <menu_item_call label="Test Mostra Font" name="Show Font Test"/>
+ <menu_item_call label="Carica da XML" name="Load from XML"/>
+ <menu_item_call label="Salva in XML" name="Save to XML"/>
+ <menu_item_check label="Mostra Nomi XUI" name="Show XUI Names"/>
+ <menu_item_call label="Manda IM di Test" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iride" name="Iris"/>
+ <menu_item_call label="Testa" name="Head"/>
+ <menu_item_call label="Parte Superiore Corpo" name="Upper Body"/>
+ <menu_item_call label="Parte Inferiore del Corpo" name="Lower Body"/>
+ <menu_item_call label="Gonna" name="Skirt"/>
+ </menu>
+ <menu label="Test Personaggio" name="Character Tests">
+ <menu_item_call label="Alterna la Geometria dei Personaggi" name="Toggle Character Geometry"/>
+ <menu_item_check label="Consenti Selezione Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Forza i Parametri ai Valori Predefiniti" name="Force Params to Default"/>
+ <menu_item_check label="Info delle Animation" name="Animation Info"/>
+ <menu_item_check label="Animazioni lente" name="Slow Motion Animations"/>
+ <menu_item_check label="Disabilita Livello di Dettaglio" name="Disable LOD"/>
+ <menu_item_check label="Mostra Schemi Collisione" name="Show Collision Skeleton"/>
+ <menu_item_check label="Mostra Agent Destinazione" name="Display Agent Target"/>
+ <menu_item_call label="Debug Texture dell&apos;Avatar" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="Texture HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Finestra Console al Prossimo Lancio" name="Console Window"/>
+ <menu_item_check label="Mostra Menu Admin" name="View Admin Options"/>
+ <menu_item_call label="Richiedi Status Amministrator" name="Request Admin Options"/>
+ <menu_item_call label="Lascia lo Stato di Admin" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Amministratore" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Prendi Copia" name="Take Copy"/>
+ <menu_item_call label="Rendimi Proprietario" name="Force Owner To Me"/>
+ <menu_item_call label="Forza Proprietario Facoltativo?" name="Force Owner Permissive"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Blocca" name="Lock"/>
+ </menu>
+ <menu label="Appezzamento" name="Parcel">
+ <menu_item_call label="Rendimi Proprietario" name="Owner To Me"/>
+ <menu_item_call label="Imposta al Contenuto Linden" name="Set to Linden Content"/>
+ <menu_item_call label="Prendi Terreno Pubblico" name="Claim Public Land"/>
+ </menu>
+ <menu label="Regione" name="Region">
+ <menu_item_call label="Stampa i Dati Temporanei degli Asset" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Salva Stato Regione" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Strumenti SuperUser" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/mime_types_linux.xml b/indra/newview/skins/default/xui/it/mime_types_linux.xml
new file mode 100644
index 0000000000..5db3eddca8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenuto del Web
+ </label>
+ <tooltip name="web_tooltip">
+ Questo luogo ha un contenuto Web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostra il contenuto Web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Video
+ </label>
+ <tooltip name="movie_tooltip">
+ Qui c&apos;è un video da riprodurre
+ </tooltip>
+ <playtip name="movie_playtip">
+ Riproduci video
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Immagine
+ </label>
+ <tooltip name="image_tooltip">
+ C&apos;è un immagine in questo luogo
+ </tooltip>
+ <playtip name="image_playtip">
+ Guarda l&apos;immagine di questo luogo
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ In questo luogo c&apos;è l&apos;audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Riproduci l&apos;audio in questo luogo
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Vuoto -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Vuoto -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Immagine
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Video Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Pagina Web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Direttore Macromedia
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Immagine (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Immagine (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Immagine (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Immagine (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Immagine (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Immagine (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Pagina Web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Testo
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Video (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Video (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Video (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Video (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Video (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Video (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/it/mime_types_mac.xml b/indra/newview/skins/default/xui/it/mime_types_mac.xml
new file mode 100644
index 0000000000..f91c9ce5bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Argomento nel Web
+ </label>
+ <tooltip name="web_tooltip">
+ Questo luogo ha un argomento nel Web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostra l&apos;argomento del Web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Filmato
+ </label>
+ <tooltip name="movie_tooltip">
+ C&apos;è un filmato da vedere qui
+ </tooltip>
+ <playtip name="movie_playtip">
+ Riproduci il filmato
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Immagine
+ </label>
+ <tooltip name="image_tooltip">
+ C&apos;è un&apos;immagine in questo luogo
+ </tooltip>
+ <playtip name="image_playtip">
+ Vedere l&apos;immagine di questo luogo
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ C&apos;è un audio in questo luogo
+ </tooltip>
+ <playtip name="audio_playtip">
+ Riproduci l&apos;audio di questo luogo
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Nessuno -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Nessuno -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Immagine
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Filmato (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Pagina Web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Immagine (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Immagine (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Immagine (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Immagine (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Immagine (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Immagine (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Pagina Web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Testo
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Filmato (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Filmato (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Filmato (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Filmato (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Filmato (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Filmato (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 8f8a969ace..2a370a2ed0 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -9,74 +9,33 @@
<global name="implicitclosebutton">
Chiudi
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Messaggio di allerta sconosciuto" name="MissingAlert">
- La tua versione di [APP_NAME] non sa come visualizzare il messaggio di allerta appena ricevuto.
-
-Dettagli dell&apos;errore: il messaggio di allerta &apos;[_NAME]&apos; non è stato trovato in notifications.xml.
+ <template name="okbutton">
+ <form>
+ <button name="OK" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore"/>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="Cancel" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore"/>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Messaggio di Notifica Sconosciuto" name="MissingAlert">
+ La versione di [APP_NAME] non riesce a visualizzare la notifica che ha ricevuto. Verifica di avere l&apos;ultima versione del Viewer installata.
+
+Dettaglio Errore: La notifica di nome &apos;[_NAME]&apos; non è stata trovata in notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,24 +56,18 @@ Dettagli dell&apos;errore: il messaggio di allerta &apos;[_NAME]&apos; non è st
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
</notification>
<notification name="BadInstallation">
- Si è verificato un errore durante l&apos;aggiornamento di [APP_NAME]. Scarica l&apos;ultima versione da secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Errore mentre si aggiornava [APP_NAME]. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Errore di rete: non è stato possibile stabilire una connessione.
+ Non è possibile connettersi a [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Per favore controlla la tua connessione.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Accertati che la tua connessione Internet stia funzionando correttamente.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
Il modello di messaggio [PATH] non è stato trovato.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
Salva i cambiamenti all&apos;attuale parte del corpo/abito?
@@ -177,7 +130,7 @@ Vuoi davvero dare i diritti di modifica ai residenti selezionati?
Non si possono rimuovere membri da quel ruolo.
I membri devono dimettersi volontariamente dal ruolo.
Confermi l&apos;operazione?
- <usetemplate ignoretext="Quando si aggiungono membri al ruolo di proprietario del gruppo." name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Conferma prima di aggiungere un nuovo Proprietario del Gruppo" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="AssignDangerousActionWarning">
Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
@@ -197,58 +150,8 @@ Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Selezionare &apos;Pubblica in Ricerca&apos;
-Marcando questo campo si mostrerà:
-- questo terreno nei risultati di ricerca
-- gli oggetti pubblici di questo terreno
-- questo terreno nella ricerca web
- </notification>
- <notification name="ClickSoundHelpLand">
- I media e la musica possono essere fruiti solo all&apos;interno del terreno. Le opzioni dei suoni e del voice possono essere limitati al terreno o potranno essere sentiti dai residenti al di fuori del terreno, a seconda della loro categoria di accesso. Vuoi andare alla Knowledge Base per ulteriori informazioni su come impostare queste opzioni?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Vai alla Knowledge Base"
- notext="Chiudi" />
- </notification>
- <notification name="ClickSearchHelpAll">
- I risultati della ricerca sono basati sul tipo di scheda nella quale ti trovi, la tua categoria di accesso, la categoria scelta e altri fattori. Per maggiori dettagli, vai alla Knowledge Base.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Vai alla Knowledge Base"
- notext="Chiudi" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Non puoi rendere questo terreno visibile nella ricerca perchè è in una regione che non lo consente.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Scegliendo &apos;Mostra in Ricerca&apos; verrà mostrato:
-- il mio profilo nei risultati della ricerca
-- un link al mio profilo nelle pagine pubbliche del gruppo
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Puoi proporre o cancellare una partnership con un altro/a residente attraverso il sito web [SECOND_LIFE].
-
-Vai al sito web di [SECOND_LIFE] per ulteriori informazioni sulla partnership?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- I tuoi permessi di base possono non funzionare nelle regioni più vecchie.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Se questo/a residente ha impostato una URL nel suo profilo puoi:
- * Cliccare &apos;Carica&apos; per vedere la pagina in questa finestra web.
- * Cliccare Carica &gt; &apos;nel browser esterno&apos; per vedere la pagina nel vostro browser web preimpostato.
- * Cliccare Carica &gt; &apos;URL Principale&apos; per ritornare alla pagina web del profile di questo/a Residente se hai cambiato pagina.
-
-Quando visiti il tuo profilo, puoi specificare qualunque URL come tuo profilo web e cliccare OK per impostarla.
-Altri residenti possono visitare la URL che hai impostato cliccando sul tuo profilo.
+ <notification name="ClickUnimplemented">
+ Mi dispiace, non è ancora stato implementato.
</notification>
<notification name="JoinGroupCanAfford">
Iscriversi a questo gruppo costa [COST]L$.
@@ -259,6 +162,12 @@ Vuoi proseguire?
Iscriversi a questo gruppo costa [COST]L$.
Non hai abbastanza L$ per iscriverti a questo gruppo.
</notification>
+ <notification name="CreateGroupCost">
+ La Creazione di questo gruppo costerà L$100.
+I Gruppi devono avere più di un membro, o saranno cancellati definitivamente.
+Per favore invita altri membri entro le prossime 48 ore.
+ <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Cancella" yestext="Crea un gruppo per L$100"/>
+ </notification>
<notification name="LandBuyPass">
Pagando [COST]L$ puoi entrare in questa terra (&apos;[PARCEL_NAME]&apos;) per [TIME] ore. Compri un pass?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -273,10 +182,10 @@ Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NA
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATTENZIONE: Cliccando &apos;vendi a tutti&apos; rende il tuo terrono disponibile all&apos;intera comunità di [SECOND_LIFE], anche non in questa regione.
+ ATTENZIONE: Cliccando &apos;vendi a tutti&apos; rende questo terreno disponibile all&apos;intera comunità [SECOND_LIFE], perfino a quelli che non sono in questa regione.
-Il terreno selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
-Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NAME].
+Stai mettendo in vendita il terrendo selezionato di [LAND_SIZE] m².
+Il prezzo di vendità è [SALE_PRICE]L$ e verrà autorizzato alla vendita a [NAME].
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -336,6 +245,12 @@ Oggetti: [N]
L&apos;intera regione ha l&apos;abilitazione danni.
Gli script devono essere autorizzati all&apos;esecuzione affinchè le armi funzionino.
</notification>
+ <notification name="MultipleFacesSelected">
+ Multiple facce multimediale sono attualmente selezionate.
+Se prosegui con questa azione, esempi separati del media saranno impostati su facce multimediali dell&apos;oggetto. ???!!!
+Per impostare il media su una sola faccia multimediale, scegli Seleziona Faccia e clicca la faccia desiderata dell&apos;oggetto e poi clicca Aggiungi.
+ <usetemplate ignoretext="Il Media sarà impostato su facce multimediali multiple" name="okcancelignore" notext="Cancella" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Devi essere dentro il terreno per impostare il suo Punto di Atterraggio.
</notification>
@@ -371,6 +286,10 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
<notification name="CannotWearTrash">
Non puoi indossare abiti e parti del corpo che sono nel cestino
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ L&apos;oggetto non può essere attaccato.
+Superato il limite di oggetti attaccati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto.
+ </notification>
<notification name="CannotWearInfoNotComplete">
Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
</notification>
@@ -379,20 +298,28 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
Devi inserire sia il nome che il cognome del tuo avatar.
Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
<notification name="AddClassified">
- Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su www.secondlife.com per una settimana.
-Compila il tuo annuncio e clicca &apos;Pubblica...&apos; per aggiungerlo al database.
-Ti verrà chiesto un prezzo da pagare quando clicchi su Pubblica.
-Pagare un prezzo più alto fa sì che il tuo annuncio compaia più in alto nella lista, e che sia più facile da trovare quando la gente ricerca per parole chiavi.
- <usetemplate ignoretext="Quando si aggiunge una inserzione." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ L&apos;inserzione apparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
+Compila la tua inserzione, e quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco.
+Ti sarà chiesto un prezzo da pagare quando clicchi Pubblica.
+Pagando di più il tuo annuncio apparirà più in alto nella lista, e apparirà anche più in alto quando la gente cerca per Parole Chiavi.
+ <usetemplate ignoretext="Come Creare una nuova Inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Cancella annuncio &apos;[NAME]&apos;?
Non ci sono rimborsi per la tariffa pagata.
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Hai selezionato la cancellazione del media associato a questa faccia multimediale.
+Sei sicuro di voler continuare?
+ <usetemplate ignoretext="Confemra la cancellazione del multimedia dall&apos;oggetto" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
<notification name="ClassifiedSave">
Salva le modifiche all&apos;annuncio [NAME]?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
@@ -403,6 +330,9 @@ Non ci sono rimborsi per la tariffa pagata.
</notification>
<notification name="PromptGoToEventsPage">
Vai alla pagina degli eventi di [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -420,17 +350,17 @@ Non ci sono rimborsi per la tariffa pagata.
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="CacheWillClear">
- La Cache verrà pulita dopo il riavvio di [APP_NAME].
+ La Cache verrà cancellata dopo la ripartenza di [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- La Cache verrà traslocata dopo il riavvio di [APP_NAME].
-Nota: Questo pulirà la cache.
+ La Cache verrà mossa dopo la ripartenza di [APP_NAME].
+Nota: Questo cancellerà anche la cache.
</notification>
<notification name="ChangeConnectionPort">
- Le impostazioni delle porte avranno effetto dopo il riavvio di [APP_NAME].
+ Le importazioni di Porte avranno effetto dopo la ripartenza di [APP_NAME].
</notification>
<notification name="ChangeSkin">
- La nuova pelle apparità dopo il riavvio di [APP_NAME].
+ La nuova skin apparirà dopo la ripartenza di [APP_NAME].
</notification>
<notification name="GoToAuctionPage">
Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
@@ -478,6 +408,11 @@ L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
<notification name="SaveBytecodeFailReason">
C&apos;è stato un problema salvando lo script compilato a causa del seguente motivo: [REASON]. Riprova a salvare lo script più tardi.
</notification>
+ <notification name="StartRegionEmpty">
+ Oops, la tua Regione di Inizio non è stata impostata.
+Per favore scrivi il nome della Regione nello spazio Regione di Inizio oppure scegli la mia ultima Ubicazione o Casa Mia come ultima ubicazione.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Non è stato possibile lanciare o fermare lo script perchè l&apos;oggetto che lo contiene non è stato trovato.
L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
@@ -496,22 +431,21 @@ Vuoi visitare [_URL] per maggiori informazioni?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=it
</url>
- <usetemplate ignoretext="Quando sto individuando hardware non supportato." name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="L&apos;hardware di questo computer non è supportato" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="UnknownGPU">
- Il tuo sistema contiene una scheda grafica che attualmente non supportiamo.
-Questo succede spesso con nuovi prodotti che non siamo riusciti a verificare. Probabilmente [APP_NAME] funzionerà correttamente ma forse dovrai modificare le impostazioni grafiche in modo appropriato.
-(Modifica &gt; Preferenze &gt; Grafica).
+ Il tuo sistema contiene una scheda grafica ancora sconosciuta a [APP_NAME].
+Questo succede spesso con nuovo hardware che non è ancora stato verificato con [APP_NAME]. Probabilmente [APP_NAME] funzionerà correttamente, ma forse devi regolare le impostazioni grafiche a qualcosa di più appropriato.
+(Io &gt; Preferenze &gt; Grafica).
<form name="form">
- <ignore name="ignore" text="Quando sto valutando una scheda grafica sconosciuta"/>
+ <ignore name="ignore" text="La mia scheda grafica non è stata identificata"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] si è bloccata mentre stava inizializzando i driver grafici.
-La qualità grafica verrà impostata al valore basso per evitare alcuni degli errori più comuni con i driver.
-Questo però disabiliterà alcune funzioni grafiche.
-Ti raccomandiamo di aggiornare i driver della tua scheda grafica.
-La qualità grafica può essere aumentara in Preferenze &gt; Grafica.
+ [APP_NAME] si è interrotta mentre stava inizializzando i driver grafici.
+La Qualità Grafica verrà impostata a Basso per evitare alcuni errori comuni di driver. Questo disabiliterà alcune caratteristiche grafiche.
+Si raccomanda di aggiornare i driver della scheda grafica.
+La Qualità Grafica può essere aumentata in Preferenze &gt; Grafica.
</notification>
<notification name="RegionNoTerraforming">
La regione [REGION] non consente di terraformare.
@@ -564,6 +498,9 @@ Non potrà temporaneamente muoversi, chiacchierare in chat, o interagire con il
Espelli [AVATAR_NAME] dal tuo terreno?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Hai espulso [AVATAR_NAME] dal gruppo [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
ERRORE DI ACQUISIZIONE: hai selezionato troppi oggetti.
</notification>
@@ -574,7 +511,10 @@ Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-Vuoi andare su [_URL] per maggiori informazioni su come acquistare L$?
+Vai su [_URL] per informazioni sull&apos;acquisto di L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -660,12 +600,15 @@ Attese [VALIDS]
Impossibile creare il file in uscita: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Non supportiamo attualmente l&apos;upload multiplo di file di animazione.
+ [APP_NAME] non supporta ancora l&apos;upload in blocco di file di animazione.
</notification>
<notification name="CannotUploadReason">
Impossibile importare il file [FILE] a causa del seguente motivo: [REASON]
Riprova più tardi.
</notification>
+ <notification name="LandmarkCreated">
+ Hai aggiunto &quot;[LANDMARK_NAME]&quot; alla tua [FOLDER_NAME] cartella.
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Non puoi creare qui un landmark perchè il proprietario di questo terreno non lo consente.
</notification>
@@ -688,6 +631,9 @@ Seleziona oggetti con degli script.
Seleziona oggetti con script su cui hai i permessi di modifica.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Impossibile aprire la script dell&apos;oggetto senza i permessi modify.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
Impossibile mettere &apos;in esecuzione&apos; gli script.
@@ -714,46 +660,44 @@ Ho cercato: [FINALQUERY]
Impossibile eseguire il teleport.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teletrasporto. Potresti aver bisogno di ricollegarti prima di poter usare il teletrasporto. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-C&apos;è stato un problema nell&apos;elaborare il cambio di regione. Potresti aver bisogno di ricollegarti prima di poterlo effetuare. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
- </notification>
- <notification name="nolandmark_tport">
-Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark
- </notification>
- <notification name="timeout_tport">
-Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
- </notification>
- <notification name="noaccess_tport">
-Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
- </notification>
- <notification name="missing_attach_tport">
-Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.
- </notification>
- <notification name="too_many_uploads_tport">
-Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un&apos;area meno affollata.
- </notification>
- <notification name="expired_tport">
-Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.
- </notification>
- <notification name="expired_region_handoff">
-Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.
- </notification>
- <notification name="no_host">
-Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.
- </notification>
- <notification name="no_inventory_host">
-L&apos;inventario è temporaneamente inaccessibile.
- </notification>
-
+ <notification name="invalid_tport">
+ E&apos; stato incontrato un problema eseguendo la tua richiesta di teleport. Potresti avere bisogno di riloggarti per ritentare il teleport.
+Se continui a ricevere questo errore, controlla [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Ci sono stati problemi eseguendo il passaggio di regione. Potresti avere bisogno di riloggarti per ritentare il passaggio di regione.
+Se continui a ricevere questo errore, controlla [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark
+ </notification>
+ <notification name="timeout_tport">
+ Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
+ </notification>
+ <notification name="noaccess_tport">
+ Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
+ </notification>
+ <notification name="missing_attach_tport">
+ Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un&apos;area meno affollata.
+ </notification>
+ <notification name="expired_tport">
+ Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.
+ </notification>
+ <notification name="expired_region_handoff">
+ Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.
+ </notification>
+ <notification name="no_host">
+ Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.
+ </notification>
+ <notification name="no_inventory_host">
+ L&apos;inventario è temporaneamente inaccessibile.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
Impossibile impostare il proprietario del terreno:
Nessun terreno selezionato.
@@ -791,7 +735,7 @@ Nessun terreno selezionato.
Non riesco a trovare la regione dove è situato il terreno.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Non puoi chiudere la finestra di Acquisto Terreno finchè [APP_NAME] non stima il prezzo di questa transazione.
+ Non puoi chiudere la finestra di Acquisto Terreno finchè [APP_NAME] non finisce di stimare il prezzo di questa transazione.
</notification>
<notification name="CannotDeedLandNothingSelected">
Impossibile cedere il terreno:
@@ -802,8 +746,8 @@ Nessun terreno selezionato.
Nessun gruppo selezionato.
</notification>
<notification name="CannotDeedLandNoRegion">
- Impossibile cedere il terreno:
-Non riesco a trovare la regione dove è situato il terreno.
+ Non è possibile donare il terreno:
+Non riesco a trovare la regione in cui si trova.
</notification>
<notification name="CannotDeedLandMultipleSelected">
Impossibile cedere il terreno:
@@ -812,11 +756,10 @@ Hai selezionato più di un terreno.
Prova a selezionare un solo terreno.
</notification>
<notification name="ParcelCanPlayMedia">
- Questo posto offre contenuto multimediale in streaming.
-Ricevere lo streaming multimediale richiede una connessione internet veloce.
+ Questo posto può mostrare contenuto multimediale in streaming. Questo richiede una connessione Internet veloce.
-Vuoi vedere il contenuto multimediale quando è disponibile?
-(Puoi cambiare questa opzione in seguito scegliendo Preferenze &gt; Audio &amp; Video.)
+Mostra contenuto multimediale quando disponibile?
+(Puoi cambiare questa opzione anche successivamente su Preferenze &gt; Privacy.)
<usetemplate name="okcancelbuttons" notext="Disabilita" yestext="Abilita MultiMedia"/>
</notification>
<notification name="CannotDeedLandWaitingForServer">
@@ -847,8 +790,8 @@ Non hai i permessi per rilasciare questo terreno.
I terreni di tua proprietà vengono visualizzati in verde.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Impossibile abbandonare il terreno:
-Non riesco a trovare la regione dove è situato il terreno.
+ Non è possibile abbandonare il terreno:
+Non riesco a trovare la regione in cui si trova.
</notification>
<notification name="CannotReleaseLandNoTransfer">
Impossibile abbandonare il terreno:
@@ -885,12 +828,12 @@ Dividi il terreno?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Impossibile dividere il terreno:
-Non riesco a trovare la regione dove è situato.
+ Non è possibile suddividere il terreno:
+Non riesco a trovare la regione in cui si trova.
</notification>
<notification name="CannotJoinLandNoRegion">
- Impossibile unire il terreno:
-Non riesco a trovare la regione dove è situato.
+ Non è possibile unire il terreno:
+Non riesco a trovare la regione in cui si trova.
</notification>
<notification name="CannotJoinLandNothingSelected">
Impossibile unire il terreno:
@@ -915,17 +858,6 @@ Dovrai reimpostare il nome e le opzioni del nuovo terreno.
Unisci il terreno?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Mostra i proprietari:
-colora i terreni per mostrare i diversi tipi di proprietari.
-
-Verde = il tuo terreno
-Acqua = la terra del tuo gruppo
-Rosso = posseduta da altri
-Giallo = in vendita
-Viola = in asta
-Grigia = pubblica
- </notification>
<notification name="ConfirmNotecardSave">
Questa notecard deve essere salvata prima che l&apos;elemento possa essere copiato o visualizzato. Salva la notecard?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -947,13 +879,13 @@ Grigia = pubblica
Impossibile salvare &apos;[NAME]&apos; nel file di oggetti indossabili. Dovrai liberare dello spazio sul tuo computer e salvare di nuovo.
</notification>
<notification name="CannotSaveToAssetStore">
- Impossibile salvare [NAME] nel database centrale.
-Normalmente questo problema è temporaneo. Riprova a generare la parte indossabile e a salvarla fra qualche minuto.
+ Non è possibile salvare [NAME] nel database centrale degli asset.
+Questo normalmente è un problema temporaneo. Riadatta e salva i vestiti e riprova fra qualche minuto.
</notification>
<notification name="YouHaveBeenLoggedOut">
Sei stato sconnesso da [SECOND_LIFE]:
[MESSAGE]
-Puoi ancora vedere i tuoi IM e la chat cliccando &apos;Vedi IM &amp; Chat&apos;. Altrimenti, clicca &apos;Esci&apos; per uscire immediatamente da [APP_NAME].
+Puoi ancora vedere gli IM e la chat cliccando &apos;Vedi IM &amp; Chat&apos;. Altrimenti clicca &apos;Esci&apos; per uscire immediatamente da[APP_NAME].
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Vedi IM &amp; Chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -1112,29 +1044,39 @@ Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
<notification name="ErrorMessage">
[ERROR_MESSAGE]
</notification>
- <notification name="AvatarMoved">
- La tua locazione [TYPE] non è al momento disponibile.
-[HELP]
-Il tuo avatar è stato spostato in una regione vicina.
+ <notification name="AvatarMovedDesired">
+ L&apos;ubicazione desiderata non è attualmente disponibile. Sei stato trasportato in una regione vicina.
+ </notification>
+ <notification name="AvatarMovedLast">
+ La tua ultima ubicazione non è al momento disponibile.
+Sei stato trasferito in una regione vicina .
+ </notification>
+ <notification name="AvatarMovedHome">
+ L&apos;ubicazione di casa tua non è al momento disponibile.
+Sei stato trasferito in un&apos;ubicazione vicina.
+Potresti impostare una nuova ubicazione.
</notification>
<notification name="ClothingLoading">
- I tuoi vestiti stanno ancora scaricandosi.
-Puoi usare [SECOND_LIFE] normalmente e gli altri utenti ti vedranno correttamente.
+ Sto ancora scaricando i tuoi abiti.
+Puoi comunque usare [SECOND_LIFE] normalmente e gli altri ti vedranno correttamente.
<form name="form">
- <ignore name="ignore" text="Qualora gli abiti impieghino troppo tempo a caricarsi."/>
+ <ignore name="ignore" text="Lo scarico degli abiti sta impiegando parecchio tempo"/>
</form>
</notification>
<notification name="FirstRun">
- L&apos;installazione di [APP_NAME] è completata.
+ L&apos;installazione di [APP_NAME] è completa.
-Se questa è la prima volta che usi [SECOND_LIFE], avari bisogno di creare un account prima di poterti collegare.
-Vai su www.secondlife.com per creare un nuovo account?
+Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa fare il log in.
+Vuoi ritornare su [http://join.secondlife.com secondlife.com] per creare un nuovo account?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Ci sono stati problemi durante la connessione. Potrebbero esserci problemi con la tua connessione ad internet oppure con i server di [SECOND_LIFE].
+ Ci sono problemi di connessione. Può darsi che siano nella tua connessione Internet oppure in [SECOND_LIFE_GRID].
-Puoi controllare la tua connessione internet e riprovare fra qualche minuto, oppure cliccare su Aiuto per collegarti al nostro sito di supporto, oppure cliccare teleporta per cercare di teleportarti a casa.
+Puoi controllare la tua connessione Internet e riprovare fra qualche minuto, oppure cliccare Aiuto per vedere il [SUPPORT_SITE], oppure cliccare Teleport per tentare di teleportarti a casa.
+ <url name="url">
+ http://it.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Aiuto"/>
@@ -1153,10 +1095,10 @@ Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.
[NAME] [PRICE]L$ Non hai abbastanza L$ per farlo.
</notification>
<notification name="GrantedModifyRights">
- Ti sono stati accordati i privilegi di modifica degli oggetti di [FIRST_NAME] [LAST_NAME].
+ [NAME] ti ha dato il permesso di editare i suoi oggetti.
</notification>
<notification name="RevokedModifyRights">
- Ti sono stati revocati i privilegi di modifica degli oggetti di [FIRST_NAME] [LAST_NAME].
+ Ti è stato revocato il permesso di modificare gli oggetti di [NAME]
</notification>
<notification name="FlushMapVisibilityCaches">
Questo reinizializzerà la cache della mappa di questa regione.
@@ -1237,91 +1179,105 @@ Imposta l&apos;oggetto per la vendita e riprova.
<notification name="DownloadWindowsMandatory">
E&apos; disponibile una nuova versione di [APP_NAME].
[MESSAGE]
-Devi scaricare questo aggiornamento per usare [APP_NAME].
+Devi scaricarla per usare [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadWindows">
E&apos; disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma ti suggeriamo di installarlo per migliorarne le prestazioni e la stabilità.
+Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
E&apos; disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma ti suggeriamo di installarlo per migliorarne le prestazioni e la stabilità.
+Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Una nuova versione di [APP_NAME] è disponibile.
+[MESSAGE]
+Devi scaricare questo aggiornamento per utilizzarlo [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Download"/>
+ </notification>
+ <notification name="DownloadLinux">
+ E&apos; disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ E&apos; disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è obbligatorio, ma è consigliata l&apos;installazione per migliorare le prestazioni e l&apos;affidabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/>
+ </notification>
<notification name="DownloadMacMandatory">
E&apos; disponibile una nuova versione di [APP_NAME].
[MESSAGE]
-Devi scaricare questo aggiornamento per usare [APP_NAME].
+Devi scaricarla per usare [APP_NAME].
-Vuoi avviarne lo scaricamento nella tua cartella applicazioni?
+Scarico nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadMac">
E&apos; disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma ti suggeriamo di installarlo per migliorarne le prestazioni e la stabilità.
+Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
-Vuoi avviarne lo scaricamento nella tua cartella applicazioni?
+Scarico nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
E&apos; disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma ti suggeriamo di installarlo per migliorarne le prestazioni e la stabilità.
+Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
-Vuoi avviarne lo scaricamento nella tua cartella applicazioni?
+Scarico nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DeedObjectToGroup">
La cessione di questo oggetto farà in modo che il gruppo:
* Riceva i L$ pagati all&apos;oggetto
- <usetemplate ignoretext="Quando cedi oggetti ai gruppi." name="okcancelignore" notext="Annulla" yestext="Cedi"/>
+ <usetemplate ignoretext="Conferma la donazione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Apri il tuo browser web per vedere questo contenuto?
- <usetemplate ignoretext="Quando apri il browser di sistema per vedere una pagina web." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi aprire il browser per vedere questo contenuto?
+ <usetemplate ignoretext="Lancia il browser per vedere la pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- Vuoi andare su www.secondlife.com per gestire il tuo account?
- <usetemplate ignoretext="Quando lanci il browser web per gestire il tuo account." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi andare su [http://secondlife.com/account/ Dashboard] per gestire il tuo account?
+ <usetemplate ignoretext="Lancia il browser pe gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Visita la Wiki di [SECOND_LIFE] per i dettagli su come segnalare un problema di sicurezza.
- <usetemplate ignoretext="Quando lanci il browser web per vedere la Wiki sui problemi di sicurezza." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per imparare a segnalare un Problema di Sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Visita il controllo di qualità Wiki [SECOND_LIFE].
- <usetemplate ignoretext="Quando lanci il browser web per vedere il controllo di qualità Wiki." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per vedere il QA Wiki" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Visita il registro pubblico dei problemi di [SECOND_LIFE], dove puoi segnalare bug ed altri problemi.
- <usetemplate ignoretext="Quando lanci il browser web per vedere il registro pubblico dei problemi." name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Visita la Wiki di [SECOND_LIFE] per le informazioni su come usare il registro pubblico dei problemi.
- <usetemplate ignoretext="Quando lanci il browser web per vedere la Wiki del registro pubblico dei problemi." name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ <usetemplate ignoretext="Lancia il browser per vedere il Registro dei Problemi Pubblici" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="WebLaunchSupportWiki">
Vai al blog ufficiale Linden, per le ultime notizie ed informazioni.
- <usetemplate ignoretext="Quando lanci il browser web per vedere il blog." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per vedere il blog" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Vai alla guida dello scripting per l&apos;aiuto sullo scripting?
- <usetemplate ignoretext="Quando lanci il browser web per vedere la guida dello scripting." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi aprire la Guida per lo Scripting per avere aiuto con lo scripting?
+ <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo Scripting" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Vai al portale LSL per aiuto sullo scripting?
- <usetemplate ignoretext="Quando lanci il browser web per vedere il portale LSL." name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ Vuoi visitare il Portale LSL per avere aiuto con lo Scripting?
+ <usetemplate ignoretext="Lancia il browser per vedere il Portale LSL" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="ReturnToOwner">
Confermi di voler restituire gli oggetti selezionati ai loro proprietari? Gli oggetti trasferibili ceduti al gruppo, verranno restituiti ai proprietari precedenti.
*ATTENZIONE* Gli oggetti ceduti non trasferibili verranno cancellati!
- <usetemplate ignoretext="Quando restituisci gli oggetti ai loro proprietari." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Conferma la restituzione degli oggetti ai loro proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Sei attualmente un membro del gruppo [GROUP].
@@ -1333,14 +1289,14 @@ Vuoi lasciare il gruppo?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti gli utenti"/>
</notification>
<notification name="MuteLinden">
- Mi dispiace, ma non puoi mutare un Linden.
+ Mi dispiace, non puoi bloccare un Linden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
Non è possibile mettere in vendita all&apos;asta un terreno che è già impostato per la vendita. Disabilita la vendita del terreno, se sei certo di voler avviare una vendita all&apos;asta.
</notification>
- <notification label="Non è stato possibile mutare l&apos;oggetto per nome" name="MuteByNameFailed">
- Hai già mutato questo nome.
+ <notification label="E&apos; fallito Il Blocco dell&apos;Oggetto" name="MuteByNameFailed">
+ Hai già bloccato questo nome.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1357,16 +1313,13 @@ Vuoi cancellare quell&apos;elemento?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- Impostata la modalità &apos;Occupato&apos;.
-La chat e i messaggi verranno nascosti. I messaggi IM riceveranno la risposta impostata per la modalità &apos;Occupato&apos;. Tutte le offerte di teleport verranno declinate. Tutte le offerte di inventario andranno nel cestino.
- <usetemplate ignoretext="Quando imposti la modalità &apos;occupato&apos;." name="okignore" yestext="OK"/>
+ E&apos; stata impostata la modalità Non Disponibile.
+La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Disponibile. Tutte le offerte di teleport verranno declinate. Tutte le offerte di Inventory andranno nel Cestino.
+ <usetemplate ignoretext="Cambio il mio stato in Non Disponibile" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Sei membro di troppi gruppi per poterti unire ad uno nuovo.
-Abbandona almeno un gruppo prima di unirti a questo, oppure declina l&apos;offerta.
-Per abbandonare un gruppo seleziona l&apos;opzione &apos;Gruppi..&apos; dal menu &apos;Modifica&apos;.
-[NAME] ti ha invitato ad unirti ad un gruppo come membro.
-
+ Hai raggiunto il limite massimo di gruppi. Devi lasciare un gruppo prima di poterti unire a questo, oppure puoi declinare questa offerta.
+[NAME] ti ha invitato ad unirti al gruppo come membro.
[INVITE]
<usetemplate name="okcancelbuttons" notext="Declino" yestext="Unisciti"/>
</notification>
@@ -1432,7 +1385,15 @@ Per abbandonare un gruppo seleziona l&apos;opzione &apos;Gruppi..&apos; dal menu
</notification>
<notification name="TeleportFromLandmark">
Confermi di volerti teleportare?
- <usetemplate ignoretext="Quando ti teleporti da un landmark dell&apos;inventario." name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
+ <usetemplate ignoretext="Conferma il teleport verso un Landmark" name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleport a [PICK]?
+ <usetemplate ignoretext="Conferma il teleport verso l&apos;ubicazione nei Posti Consigliati" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleport a [CLASSIFIED]?
+ <usetemplate ignoretext="Confermo il teleport verso questa ubicazione negli Annunci" name="okcancelignore" notext="Cancella" yestext="Teleport"/>
</notification>
<notification label="Manda un messaggio a tutti nella tua proprietà" name="MessageEstate">
Scrivi un annuncio breve che verrà mandato a tutti quelli che sono in questo momento nella tua proprietà.
@@ -1501,111 +1462,80 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
Non sei ammesso in questa regione a causa della tua categoria di accesso. Questo può risultare da una mancanza di informazioni necessarie per convalidare la tua età.
Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per ulteriori informazioni su come accedere nelle zone con tale categoria di accesso.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Vai alla Knowledge Base"
- notext="Chiudi"
- ignoretext="Quando l&apos;entrata nella regione è bloccata a causa delle categorie di accesso."/>
+ <usetemplate ignoretext="Non posso entrare in questa Regione, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Non puoi entrare in quella regione a causa delle tue preferenze sulle categorie di accesso.
-
-Puoi cliccare su &apos;Cambia le preferenze&apos; per aumentare subito le tue preferenze sulle categorie di accesso e riuscire ad entrare. Ti sarà permesso cercare ed avere accesso al contenuto [REGIONMATURITY] da quel momento in poi. Volendo poi ripristinare le impostazioni, potrai andare in Modifica &gt; Preferenze... &gt; Generale.
- <form name="form">
- <button
- name="OK"
- text="Cambia le preferenze"/>
- <button
- default="true"
- name="Cancel"
- text="Chiudi"/>
- <ignore name="ignore" text="Quando l&apos;entrata in una regione è bloccata a causa delle preferenze delle categorie di accesso."/>
- </form>
+ Non ti è consentito entrare in quella Regione a causa della tua Categoria di Accesso impostata nelle Preferenze.
+
+Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
+ <form name="form">
+ <button name="OK" text="Cambia Preferenza"/>
+ <button default="true" name="Cancel" text="Chiudi"/>
+ <ignore name="ignore" text="Le mie preferenze attivate nel Rating (Classificazione) prevengono il mio ingresso in una Regione"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Non puoi prendere possesso di questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
Non puoi prendere possesso di questa terra a causa delle preferenze sulle categorie di accesso.
Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Vai alla Knowledge Base"
- notext="Chiudi"
- ignoretext="Quando l&apos;acquisizione della terra è bloccata a causa delle categorie di accesso."/>
+ <usetemplate ignoretext="Non posso richiedere questo Terreno, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Non puoi prendere possesso di questa terra a causa della tua categoria di accesso.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- Non puoi prendere possesso di questa terra a causa della tua categoria di accesso.
+ Non puoi richiedere questo Terreno a causa delle tue preferenze di Categoria di Accesso.
-Puoi cliccare su &apos;Cambia le preferenze&apos; per aumentare subito le tue preferenze sulle categorie di accesso e riuscire ad entrare. Ti sarà permesso cercare ed avere accesso al contenuto [REGIONMATURITY] da quel momento in poi. Volendo poi ripristinare le impostazioni, potrai andare in Modifica &gt; Preferenze... &gt; Generale.
- <usetemplate
- name="okcancelignore"
- yestext="Cambia le preferenze"
- notext="Chiudi"
- ignoretext="Quando l&apos;acquisizione della terra è bloccata a causa delle preferenze delle categorie di accesso."/>
+Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
+ <usetemplate ignoretext="Le mie preferenze di Categoria di Accesso mi impediscono di chiedere questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
</notification>
<notification name="LandBuyAccessBlocked">
Non puoi acquistare questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
Non puoi acquistare questo terreno a causa della tua categoria di accesso.
Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Vai alla Knowledge Base"
- notext="Chiudi"
- ignoretext="Quando un acquisto di terra è bloccato a causa delle categorie di accesso."/>
+ <usetemplate ignoretext="Non posso comprare questo Terreno , a causa delle restrizioni della Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Non puoi acquistare questa land a causa della tua categoria di accesso.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- Non puoi acquistare questa terra a causa delle tue preferenze sulle categorie di accesso .
+ Non puoi comprare questo Terreno a causa delle tue preferenze di Categoria di Accesso.
-Puoi cliccare su &apos;Cambia le preferenze&apos; per aumentare subito le tue preferenze sulle categorie di accesso e riuscire ad entrare. Ti sarà permesso cercare ed avere accesso al contenuto [REGIONMATURITY] da quel momento in poi. Volendo poi ripristinare le impostazioni, potrai andare in Modifica &gt; Preferenze... &gt; Generale.
- <usetemplate
- name="okcancelignore"
- yestext="Cambia le preferenze"
- notext="Chiudi"
- ignoretext="Quando un acquisto di terra è bloccato a causa delle preferenze sulle categorie di accesso."/>
+Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
+ <usetemplate ignoretext="Le mie Preferenze di Accesso mi impediscono l&apos;acquisto di questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Hai selezionato troppi prims. Seleziona [MAX_PRIM_COUNT] o meno prims e riprova.&quot;
+ Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
@@ -1638,19 +1568,11 @@ Pubblica questo annuncio adesso per [AMOUNT]L$?
</notification>
<notification name="SetClassifiedMature">
Queste inserzioni includono contenuto Mature?
- <usetemplate
- canceltext="Annulla"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Si"/>
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="SetGroupMature">
Questo gruppo include contenuto Mature?
- <usetemplate
- canceltext="Annulla"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Si"/>
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification label="Conferma il riavvio" name="ConfirmRestart">
Vuoi veramente far ripartire la regione in 2 minuti?
@@ -1664,231 +1586,12 @@ Pubblica questo annuncio adesso per [AMOUNT]L$?
<button name="Cancel" text="Annulla"/>
</form>
</notification>
- <notification label="Blocca il terraforming" name="HelpRegionBlockTerraform">
- Se questa casella è selezionata, i proprietari dei terreni non potranno terraformare il loro terreno indipendentemente dall&apos;impostazione locale di &apos;Modifica Terreno&apos;.
-
-Impostazione base: spenta
- </notification>
- <notification label="Blocca il volo" name="HelpRegionBlockFly">
- Se questa casella è selezionata, le persone non potranno volare in questa regione indipendentemente dall&apos;impostazione locale di &apos;Volo&apos;.
-
-Impostazione base: spenta
- </notification>
- <notification label="Cambiamento in massa delle autorizzazioni del contenuto" name="HelpBulkPermission">
- Lo strumento delle autorizzazioni in massa ti aiuta a modificare rapidamente i permessi su oggetti multipli nel contenuto dell&apos;oggetto/i selezionato/i. Ma tieni presente che stai solo impostando autorizzazioni per gli oggetti presenti nel contenuto e non le autorizzazioni per l&apos;oggetto/i che li contiene.
-
-Inoltre, le autorizzazioni non vengono applicate agli oggetti a loro volta contenuti all&apos;interno degli oggetti di cui stiamo cambiando i permessi. Il cambiamento sarà operato solo ed esclusivamente alla profondità di un livello.
-
-È possibile scegliere selettivamente quali tipi di oggetti modificare usando questa lista di controllo dei &apos;Tipi di contenuto&apos;. Le fotografie sono incluse quando si seleziona textures.
-
-* Questo strumento riuscirà solo a modificare le autorizzazioni degli oggetti che già tu puoi cambiare.
-* Non è possibile impostare in aumento, per il successivo proprietario, alcuna autorizzazione che non sia già in essere.
-* I permessi impostabili per il successivo proprietario sono solo richieste di cambiamento. Se un qualsiasi oggetto non può assumere tutte le nuove autorizzazioni impostate, nessuno dei suoi permessi cambierà.
-
-Quando si è pronti a cambiare i permessi in massa, fare clic su &apos;Applica&apos; e attendere la visualizzazione dei risultati.
-
-Se si chiude la finestra dello strumento autorizzazioni, mentre le autorizzazioni si stanno modificando, l&apos;operazione si arresterà.
- </notification>
- <notification label="Consenti Danni" name="HelpRegionAllowDamage">
- Se questa casella è selezionata, il sistema del livello vitale su tutti i terreni sarà abilitato indipendentemente dalle impostazioni locali. Se la casella è lasciata vuota i proprietari dei singoli terreni individuali potranno comunque essere in grado di attivare il sistema di livello vitale sulla loro terra.
-
-Impostazione base: spenta
- </notification>
- <notification label="Limite avatar" name="HelpRegionAgentLimit">
- Imposta il massimo numero di avatar consentito in questa regione.
-Le prestazioni possono variare a seconda del numero totale di avatar presenti.
-
-Impostazione base: 40
- </notification>
- <notification label="Coefficiente bonus oggetti" name="HelpRegionObjectBonus">
- Il coefficiente bonus oggetti è un moltiplicatore per i prim consentiti su ogni terreno.
-Si può specificare da 1 a 10. Impostandolo ad 1, ogni terreno di 512m² consentià 117 oggetti. Impostandolo a 2, ogni terreno di 512m² ne consentirà 234 o il doppio, e così via. Il numero complessivo di oggetti consentiti per una regione rimane comunque 15.000 indipendentemente dal coefficiente di bonus.
-Una volta impostato, fai attenzione che abbassare il bonus può causare la cancellazione o restituzione di oggetti.
-
-Impostazione base: 1.0
- </notification>
- <notification label="Categoria di accesso" name="HelpRegionMaturity">
- Imposta la categoria di accesso della regione, come mostrato nella barra dei menu nella parte superiore dello schermo di qualsiasi residente e nelle tooltip sulla mappa di [SECOND_LIFE], quando il cursore si muove su questa regione. Questa impostazione influenza anche l&apos;accesso a questa regione e i risultati della ricerca. Altri residenti possono entrare solo in regioni o visualizzare risultati della ricerca con la stessa categoria di accesso che hanno scelto nella loro preferenze.
-
-Può trascorrere un po&apos; di tempo prima che questa modifica si rifletta sulla mappa.
- </notification>
- <notification label="Limita gli urti" name="HelpRegionRestrictPushObject">
- Questa casella limita per tutta la regione i permessi di urto (spinte).
-Se abilitata, i residenti possono essere urtati/spinti solo da sè stessi o dal proprietario del terreno.
-(La spinta si riferisce all&apos;uso della funzione LSL llPushObject())
-
-Impostazione base: spenta
- </notification>
- <notification label="Unisci/Dividi terreno" name="HelpParcelChanges">
- Questa casella imposta se i terreni non posseduti dal possessore della proprietà immobiliare possano essere unite o divise.
-Se questa opzione è deselezionata:
- * Soltanto i possessori o i manager della proprietà immobiliare possono unire o dividere i terreni.
- * Possono solo unire o dividere terreni che appartengono al proprietario, o ad un gruppo dove hanno poteri appropriati.
-Se questa opzione è selezionata:
- * Tutti i proprietari del terreno possono unire o dividere i terreni che possiedono.
- * Per i terreni di proprietà del gruppo, solo coloro con poteri appropriati possono unire o dividere il terreno.
-
-Impostazione base: Selezionata
- </notification>
- <notification label="Non mostrare in ricerca" name="HelpRegionSearch">
- Selezionare questa casella bloccherà i proprietari dei terreni dal mettere in lista i loro terreni nella ricerca
-
-Impostazione base: spenta
- </notification>
<notification label="Cambiato il contenuto Mature" name="RegionMaturityChange">
La classificazione del contenuto Mature di questa regione è stata aggiornata.
Può essere necessario un po&apos; di tempo prima che questo cambiamento sia visibile sulle mappe.
</notification>
- <notification label="Rivendita dei Terreni" name="HelpRegionLandResell">
- I possessori e i manager della proprietà immobiliare possono vendere tutte le terre di cui sono proprietari.
-Se questa opzione è lasciata deselezionata i compratori non potranno rivendere le proprie terre in questa regione.
-Se questa opzione è selezionato i compratori possono rivendere i loro terreni in questa regione.
-
-Impostazione base: Non consentire
- </notification>
- <notification label="Disabilita gli script" name="HelpRegionDisableScripts">
- Se le prestazioni di una sim sono basse, probabilmente è colpa di uno script. Apri la &apos;Barra delle statistiche&apos; (Ctrl+Shift+1). Controlla il FPS della fisica del simulatore.
-Se è più basso di 45, apri il pannello &apos;Time&apos; (Tempi) collocato ln fondo alla &apos;Barra delle statistiche&apos;
-Se il tempo per gli script è di 25 ms o più alto, clicca sul bottone &apos;Visualizza l&apos;elenco degli script più pesanti...&apos;. Ti verrà dato il nome e l&apos;ubicazione degli script che probabilmente causano una cattiva prestazione.
-
-Selezionare la casella della disabilitazione script e, premendo il bottone applica, disabilitare temporaneamente tutti gli script in questa regione. Questo è necessario per poterti recare verso l&apos;ubicazione dello script definito nell&apos;elenco come &apos;script più pesante&apos;. Una volta arrivato all&apos;oggetto, studia lo script per capire se è quello che sta causando il problema. Potresti dover contattare il proprietario dello script oppure cancellare o restituire l&apos;oggetto.
-Disabilita la casella e quindi premere applica per riattivare gli script nella regione.
-
-Impostazione base: spento
- </notification>
- <notification label="Disabilita le collisioni" name="HelpRegionDisableCollisions">
- Quando le prestazioni della sim sono basse, può darsi che la colpa sia di oggetti fisici.
-Apri la &apos;Barra delle statistiche&apos; (Ctrl+Shift+1).
-Controlla il FPS della fisica del simulatore.
-Se è più basso di 45, apri il pannello &apos;Time&apos; (Tempi) collocato in fondo alla &apos;Barra delle statistiche&apos;.
-Se il tempo della sim (fisica) risulta 20 ms o più, clicca sul bottone &apos;mostra gli oggetti che collidono di più&apos;.
-Ti verranno dati il nome e l&apos;ubicazione degli oggetti fisici che possono causare una cattiva prestazione.
-
-Selezionare la casella disabilita collisioni e, premendo il bottone applica, disabilitare temporaneamente le collisioni oggetto-oggetto. Questo è necessario per poterti recare verso l&apos;ubicazione dell&apos;oggetto che sta collidendo eccessivamente.
-Una volta arrivato sul posto, studia l&apos;oggetto - sta collidendo costantemente con altri oggetti? Potresti dover contattare il proprietario dell&apos;oggetto oppure cancellare o restituire l&apos;oggetto.
-Disabilitare la casella disabilita collisioni e quindi premere applica per riattivare le collisioni nella regione.
-
-Impostazione base: spento
- </notification>
- <notification label="Disabilita la fisica" name="HelpRegionDisablePhysics">
- Disabilitare la fisica è simile alla disabilitazione delle collisioni eccetto che tutte le simulazioni fisiche sono disabilitate. Questo significa che non solo gli oggetti cessano di collidere, ma anche gli avatar non riusciranno più a muoversi.
-
-Questo dovrebbe essere utilizzato solo se il &apos;disabilita collisioni&apos; non restituisce abbastanza prestazioni alla regione dopo aver cercato un problema fisico o un oggetto che collide eccessivamente.
-
-Fai attenzione a riabilitare la fisica quando hai terminato, altrimenti nessun avatar riuscirà a muoversi.
-
-Impostazione base: spento
- </notification>
- <notification label="Oggetti con maggiori collisioni" name="HelpRegionTopColliders">
- Mostra una lista di oggetti che sperimentano la maggior quantità di potenziali collisioni oggetto-oggetto. Questi oggetti possono abbassare le prestazioni.
-Seleziona Visualizza &gt; Barra della statistiche e guarda sotto Simulator (Simulatore) &gt; Time (Tempi) &gt; Physics Time (Tempo Sim fisica) per controllare se un tempo di più di 20 ms è impiegato nella fisica.
- </notification>
- <notification label="Script pesanti" name="HelpRegionTopScripts">
- Mostra una lista degli oggetti che occupano la maggior parte del loro tempo eseguendo script LSL. Questi oggetti possono abbassare le prestazioni.
-Seleziona Visualizza &gt; Barra della statistiche e guarda sotto Simulator (Simulatore) &gt; Time (Tempi) &gt; Script Time (Tempo Script) per controllare se un tempo di più di 20 ms è impiegato per gli script.
- </notification>
- <notification label="Fai ripartire la regione" name="HelpRegionRestart">
- Fai ripartire i processi del server che gestisce questa regione dopo un avvertimento di due minuti. Tutti i residenti nella regione verranno scollegati.
-La regione salverà i suoi dati e dovrebbe tornare attiva entro 90 secondi.
-
-Far ripartire la regione non risolverà i problemi maggiori delle prestazioni e dovrebbe essere fatta solo se necessario.
- </notification>
- <notification label="Altezza dell&apos;acqua" name="HelpRegionWaterHeight">
- Questa è l&apos;altezza in metri del mare dove deve apparire l&apos;acqua.
-Se questa impostazione è diversa da 20 e l&apos;acqua circonda il confine di terra o acqua della tua sim, vedrai una discontinuità fra la sim e il mare.
-
-Impostazione base: 20
- </notification>
- <notification label="Sollevamento terreno" name="HelpRegionTerrainRaise">
- Questa è l&apos;ulteriore altezza in metri entro la quale i proprietari di appezzamenti possono alzare il loro terreno partendo dall&apos;altezza preimpostata.
-
-Impostazione base: 4
- </notification>
- <notification label="Abbassamento terreno" name="HelpRegionTerrainLower">
- Questa è l&apos;ulteriore altezza in metri entro la quale i proprietari di appezzamenti possono abbassare il loro terreno partendo dall&apos;altezza preimpostata.
-
-Impostazione base: -4
- </notification>
- <notification label="Importa terreno RAW" name="HelpRegionUploadRaw">
- Questo bottone importa un file .RAW nella regione in cui sei.
-Il file deve avere le corrette dimensioni (RGB, 256x256) e 13 canali. Il modo migliore per creare un file di terreno è di scaricare un file RAW esistente. Un buon primo passo è quello di modificare il canale del rosso (altezza della terra), ed importarlo.
-
-L&apos;importazione può impiegare fino a 45 secondi. Nota che importare un file del terreno *non muoverà* gli oggetti che sono sulla sim, soltanto il terreno stesso e i permessi associati agli appezzamenti.
-Questo potrebbe far sì che gli oggetti vadano sotto terra.
-
-Per maggiori informazioni sulle modifiche dei campi dell&apos;altezza della regione, consulta il tasto F1 Aiuto.
- </notification>
- <notification label="Scarica il terreno RAW" name="HelpRegionDownloadRaw">
- Questo bottone scarica un file che contiene i dati dell&apos;altezza, delle dimensioni, dello stato di vendita del terreno e di alcuni permessi degli appezzamenti di questa regione.
-Aprendo questo file in un programma come Photoshop devi specificare le dimensioni che sono: RGB, 256x256 con 13 channels. Questo file del terreno non può essere aperto in nessun altro modo.
-
-Per maggiori informazioni sulle modifiche dei campi dell&apos;altezza della regione, consulta il tasto F1 Aiuto.
- </notification>
- <notification label="Usa il sole della proprietà" name="HelpRegionUseEstateSun">
- Questa casella fa si che la posizione del sole in questa regione coincida con la posizione del sole nel resto della proprietà.
-
-Impostazione base: attivo
- </notification>
- <notification label="Sole fisso" name="HelpRegionFixedSun">
- Questa casella imposta la posizione del sole ad un valore definito nel cursore delle fasi e fa in modo che il sole non si muova.
-
-Impostazione base: spento
- </notification>
- <notification label="Crea il Terreno" name="HelpRegionBakeTerrain">
- Questo bottone salva l&apos;attuale forma del terreno come impostazione base per la regione. Una volta creato, il terreno può riassumere la forma base ogni volta che che tu o altri dovessero usare l&apos;opzione &apos;Reimposta&apos; della modifica del terreno.
-Il terreno creato è anche il punto intermedio dei limiti di sollevamento ed abbassamento terreno.
- </notification>
- <notification label="Manager della proprietà" name="HelpEstateEstateManager">
- Un manager della proprietà è un residente a cui avete delegato il controllo di una regione o di una proprietà. Un manager della proprietà può cambiare qualunque impostazione in queste finestre, eccezion fatta per l&apos;importazione, l&apos;esportazione e la creazione del terreno. In particolare, possono consentire o bloccare l&apos;accesso ai residenti nella tua proprietà.
-
-I manager della proprietà possono essere soltanto aggiunti o rimossi dal possessore della proprietà e non possono farlo loro l&apos;un l&apos;altro. Scegli solo residenti di cui ti fidi come manager della proprietà, dato che tu sarai responsabile per le loro azioni.
- </notification>
- <notification label="Usa l&apos;ora globale" name="HelpEstateUseGlobalTime">
- Questa casella fa si che il sole nella vostra proprietà segua la stessa posizione della mainland Linden.
-
-Impostazione base: on
- </notification>
- <notification label="Sole Fisso" name="HelpEstateFixedSun">
- Questa casella imposta la posizione del sole su una posizione del cursore di Fase del sole e lo blocca in quella posizione.
- </notification>
- <notification label="Accesso Pubblico" name="HelpEstateExternallyVisible">
- Questa casella permette ai residenti che sono su altre regioni, di entrare in questa proprietà anche se non sono nella lista di accesso.
-
-Impostazione base: attivo
- </notification>
- <notification label="Consenti teleport diretto" name="HelpEstateAllowDirectTeleport">
- Se selezionato, consente ai residenti di teleportarsi direttamente in qualunque punto di questa proprietà.
-Se deselezionato, i residenti si teleporteranno al più vicino snodo.
-
-Impostazione base: spento
- </notification>
- <notification label="Consenti accesso" name="HelpEstateAllowResident">
- L&apos;accesso a questa proprietà verrà limitata solo ai residenti ed ai gruppi elencati più sotto. Questa impostazione è disponibile solo se l&apos;accesso pubblico è deselezionato.
- </notification>
- <notification label="Consenti Accesso di gruppo" name="HelpEstateAllowGroup">
- L&apos;accesso a questa proprietà verrà limitata solo ai gruppi qui elencati e ai residenti loro appartenenti. Questa impostazione è disponibile soltanto se l&apos;accesso pubblico è deselezionato.
- </notification>
- <notification label="Indirizzo di posta email per le segnalazioni di abuso" name="HelpEstateAbuseEmailAddress">
- Impostando qui un indirizzo di posta elettronica valido, farà si che le segnalazioni di abuso, fatte su questa proprietà, siano mandate a quell&apos;indirizzo.
-Lasciandolo vuoto causerà l&apos;invio delle segnalazioni di abuso soltanto ai Linden Lab.
- </notification>
- <notification label="Rifiuta accesso" name="HelpEstateBanResident">
- I residenti su questa lista non saranno accettati nella tua proprietà, indipendentemente da qualunque altra impostazione.
- </notification>
- <notification label="Consenti la voice chat" name="HelpEstateVoiceChat">
- I terreni di questa proprietà potranno avere i loro canali voce nei quali i residenti potranno parlare con gli avatar vicini.
-
-Impostazione base: spento
- </notification>
<notification label="Versione voice non compatibile" name="VoiceVersionMismatch">
- Questa versione di [APP_NAME] non è compatibile con le impostazioni di voice chat di questa regione. Per poter fare funzionare correttamente la chat voce devi aggiornare [APP_NAME].
- </notification>
- <notification label="Regolamento della proprietà" name="HelpEstateCovenant">
- Impostare un regolamento della proprietà ti consente di vendere i terreni all&apos;interno di quella proprietà. Se non imposti un regolamento, non puoi vendere i terreni. La notecard per il tuo regolamente può essere vuota se non desideri applicare nessuna regola o informare i compratori di cose inerenti la terra, prima dell&apos;acquisto.
-
-Un regolamento può essere usato per comunicare regole, linee guida, informazioni culturali o semplicemente ciò che ti aspetti dal possibile compratore. Questo può includere impostazioni in zone, regolamenti architettonici, opzioni di pagamento o qualunque altra informazione che ritieni importante che il nuovo proprietario debba aver visto e accettato prima dell&apos;acquisto.
-
-Il compratore deve accettare il regolamento selezionando la casella appropriata per poter completare l&apos;acquisto. I regolamenti delle proprietà sono sempre visibili nella finestra &apos;Informazioni sul terreno&apos; in tutti gli appezzamenti in cui è stato impostato.
+ Questa versione di [APP_NAME] non è compatibile con le capacità di Chat Voice in questa regione. Per poter far funzionare correttamente la Chat Voice devi aggiornare [APP_NAME].
</notification>
<notification label="Impossibile comprare oggetti" name="BuyObjectOneOwner">
Impossibile comprare oggetti da proprietari diversi nello stesso momento.
@@ -1977,55 +1680,36 @@ Hai aggiornato l&apos;ubicazione di questo preferito ma gli altri dettagli conse
Questi elementi verranno trasferiti nel tuo inventario, ma non copiati.
Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Quando si trasferiscono elementi non copiabili, dagli oggetti all&apos;inventario." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Avvertimi quando rimuovo gli elementi &apos;no-copy&apos; da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Hai selezionato elementi dell&apos;inventario non copiabili. Questi elementi verranno trasferiti nel tuo inventario, non verranno copiati.
Dato che questo oggetto è scriptato, il trasferimento di questi elementi nel tuo inventario potrebbe causare un malfunzionamento degli script.
Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Quando si trasferiscono oggetti scriptati non copiabili nell&apos;inventario." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Avvertimi se la rimozione di elementi &apos;no-copy&apos; possono danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Attenzione: L&apos;azione &apos;Paga l&apos;oggetto&apos; al click è stata impostata, ma funzionerà solo se aggiungi uno script con un evento money().
+ Attenzione: E&apos; stata impostata l&apos;azione &apos;Paga Oggetto&apos;, ma funzionerà soltanto se inserisci uno script con un evento money().
<form name="form">
- <ignore name="ignore" text="Quando imposti il &apos;Paga l&apos;oggetto&apos; senza l&apos;evento money()"/>
+ <ignore name="ignore" text="Ho impostato l&apos;azione &apos;Paga Oggetto&apos; costruendo un oggetto senza uno script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Non ci sono elementi in questo oggetto che tu possa copiare.
</notification>
<notification name="WebLaunchAccountHistory">
- Vai nel sito web di [SECOND_LIFE] per vedere il tuo estratto conto?
- <usetemplate ignoretext="Quando carichi la pagina web dell&apos;estratto conto." name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Visita il sito di supporto di [SECOND_LIFE]?
- <usetemplate ignoretext="Quando visiti il sito del supporto di [SECOND_LIFE]." name="okcancelignore" notext="Annulla" yestext="Vai"/>
+ Vai su [http://secondlife.com/account/ Dashboard] per vedere la storia delle tue Transazioni?
+ <usetemplate ignoretext="Lancia il browser per vedere la storia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="ConfirmQuit">
Confermi di voler uscire?
- <usetemplate ignoretext="Quando esci da [APP_NAME]." name="okcancelignore" notext="Continua" yestext="Esci"/>
+ <usetemplate ignoretext="Conferma Uscita" name="okcancelignore" notext="Non Uscire" yestext="Esci"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Usa questo strumento per segnalare violazioni ai Termini di Servizio e agli standard della Comunità. Vedi:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Usa questo strumento per segnalare violazioni del [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards].
-Tutte gli abusi ai Termini di Servizio e agli Standard della Comunità segnalati, sono indagati e risolti. Puoi controllare la risoluzione degli abusi visitando la pagina delle Risoluzioni degli Incidenti:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- IMPORTANTE: questo rapporto verrà inviato al proprietario della regione dove sei in questo momento e non ai Linden Lab.
-
-Come servizio ai residenti e ai visitatori, il proprietario della regione in cui ti trovi, ha scelto di ricevere e risolvere le segnalazioni di abuso che nascono in questa regione. Il Linden Lab non investiga sulle segnalazione inviate da qui.
-
-Il proprietario della regione risolverà le segnalazione basandosi sulle regole locali di questa regione così come sono indicate dal regolamento della proprietà.
-(Puoi vedere il regolamento andando sul menu Mondo e selezionando Informazioni sul terreno.)
-
-La risoluzione di questa segnalazione verrà applicata solo in questa regione; L&apos;accesso dei residenti ad altre aree di [SECOND_LIFE] non verrà influenzato dal risultato di questa segnalazione. Soltanto i Linden Lab possono restringere l&apos;accesso alla totalità di [SECOND_LIFE].
+Tutti gli abusi segnalati verranno investigati e risolti. Puoi verificare lo stato delle segnalazione leggendo [http://secondlife.com/support/incidentreport.php Incident Report].
</notification>
<notification name="HelpReportAbuseSelectCategory">
Scegli una categoria per questa segnalazione di abuso.
@@ -2049,18 +1733,19 @@ Devi essere il più specifico possibile, includendo i nomi e i dettagli dell&apo
Inserendo una descrizione accurata ci aiuti a gestire ed elaborare le segnalazioni di abuso.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- Caro residente,
+ Gentile Residente,
-Sembra che stai segnalando un problema di furto di proprietà intellettuale. Cerca di essere sicuro che la tua segnalazione stia riportando correttamente:
+Sembra che tu stia segnalando una violazione di proprietà intellettuale. Cerca di essere sicuro che la tua segnalazione stia riportando correttamente:
-(1) Il processo di abuso. Puoi sottomettere una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio, usando CopyBot oppure simili strumenti di copia, per rubare i diritti della proprietà intellettuale. L&apos;ufficio Abusi investigherà e deciderà delle azioni disciplinari adeguate per comportamenti che violano gli standard di comunità di [SECOND_LIFE] o i Termini di Servizio. Si tenga però presente che l&apos;ufficio Abusi non gestisce e non risponde alle richieste di rimozione di contenuto da [SECOND_LIFE].
+(1) Il processo di Abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti della proprietà intellettuale. L&apos;Ufficio Abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini di Servizio] di [SECOND_LIFE] oppure i [http://secondlife.com/corporate/cs.php Standard di Comunità]. Si tenga però presente che l&apos;ufficio Abusi non gestisce e non risponde alle richieste di rimozione di contentuo da [SECOND_LIFE].
-(2) Il processo di rimozione DMCA o processo di rimozione dei contenuti. Per richiedere la rimozione di contenuto da [SECOND_LIFE], DEVI sottomettere una notifica valida di furto intellettuale come definito nella nostra politica DMCA che trovi a http://secondlife.com/corporate/dmca.php.
+(2) Il processo di rimozione DMCA o processo di rimozione dei contenuti. Per richiedere la rimozione di contenuto da [SECOND_LIFE], DEVI compilare una denuncia valid di furto come definito nella nostra [http://secondlife.com/corporate/dmca.php Policy DMCA].
-Se desideri egualmente continuare con il processo di abuso, chiudi questa finestra e termina di compilare la segnalazione. Potresti dover selezionare la categoria specifica &apos;CopyBot o Sfruttamento permessi&apos;.
+Se desideri egualmente continuare con il processo di Abuso, chiudi questa finestra e completa la compilazione della segnalazione. Puoi specificare la categoria specifica &apos;CopyBot o Sfruttamento Permessi&apos;.
Grazie,
-La Linden Lab
+
+Linden Lab
</notification>
<notification name="FailedRequirementsCheck">
I seguenti componenti obbligatori sono mancanti da [FLOATER]:
@@ -2070,9 +1755,9 @@ La Linden Lab
C&apos;è già un oggetto indossato in questo punto del corpo.
Vuoi sostituirlo con l&apos;oggetto selezionato?
<form name="form">
- <ignore name="ignore" save_option="true" text="Quando avviene la sostituzione di un oggetto indossato già esistente."/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Annulla"/>
+ <ignore name="ignore" save_option="true" text="Sostituisci un preesistente attachment con l&apos;elemento selezionato"/>
+ <button ignore="Replace Automatically" name="Yes" text="OK"/>
+ <button ignore="Never Replace" name="No" text="Annulla"/>
</form>
</notification>
<notification label="Avviso di &apos;Occupato&apos;" name="BusyModePay">
@@ -2080,18 +1765,22 @@ Vuoi sostituirlo con l&apos;oggetto selezionato?
Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare questa transazione?
<form name="form">
- <ignore name="ignore" save_option="true" text="Quando avviene il pagamento di una persona o di un oggetto in modalità &apos;Occupato&apos;."/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Abbandona"/>
+ <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono Non Disponibile"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="OK"/>
+ <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La cartella &apos;[FOLDERNAME]&apos; è una cartella di sistema. La cancellazione delle cartelle di sistema può creare instabilità. Sei sicuro di volerla cancellare?
+ <usetemplate ignoretext="Conferma prima di cancellare una cartella di sistema" name="okcancelignore" notext="Cancella" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Confermi di volere permanentemente rimuovere il contenuto del tuo cartella Cestino?
- <usetemplate ignoretext="Quando svuoti la cartella cestino del tuo inventario." name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi veramente cancellare permanentemente il contenuto del tuo Cestino?
+ <usetemplate ignoretext="Conferma lo svuotamento del contenuto del Cestino" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Confermi di voler pulire la cache del tuo browser?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
+ Vuoi veramente cancellare la storia dei viaggi, web e delle ricerche fatte?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Confermi di volere cancellare i tuoi cookie?
@@ -2102,39 +1791,18 @@ Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare quest
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Confermi di volere rimuovere permanentemente il contenuto della tua cartalla Persi e ritrovati?
- <usetemplate ignoretext="Quando cancelli la cartella degli oggetti perduti e ritrovati del tuo inventario." name="okcancelignore" notext="No" yestext="Si"/>
+ Vuoi veramente cancellare permanentemente il contenuto dei tuoi Persi e Ritrovati?
+ <usetemplate ignoretext="Conferma lo svuotamento della cartella Persi e Ritrovati" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="CopySLURL">
- Lo SLurl seguente è stato copiato nei tuoi appunti:
+ Lo SLurl seguente è stato copiato negli Appunti:
[SLURL]
-Lo puoi inserire in una pagina web per dare ad altri modo di accedere a questo posto o puoi provare a copiarla nella barra indirizzi del tuo browser web.
+Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra indirizzo di un browser web.
<form name="form">
- <ignore name="ignore" text="Quando copi uno SLurl negli appunti."/>
+ <ignore name="ignore" text="Lo SLurl è stato copiato negli Appunti"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Questo pannello controlla la dimensione delle finestre, la risoluzione e la qualità della grafica del tuo browser. Le Preferenze &gt; Grafica consente di scegliere fra quattro livelli grafici: Basso, Medio, Alto, e Ultra. Puoi anche modificare le impostazioni grafiche selezionando la casella Personalizza e manipolando le seguenti impostazioni:
-
-Effetti grafici: Abilita o disabilita vari tipi di effetti grafici.
-
-Oggetti riflettenti: Imposta le tipologie di oggetti riflessi dall&apos;acqua.
-
-Visualizzazione Avatar: Imposta le opzioni che influenzano come il client visualizza gli avatar.
-
-Campo visivo: Imposta quanto lontano dalla tua posizione gli oggetti vengono visualizzati nella scena.
-
-Massima quantità di particelle: Imposta il valore massimo di particelle che puoi vedere contemporaneamente sullo schermo.
-
-Qualità post elaborazione: Imposta la risoluzione con il quale il bagliore è visualizzato.
-
-Dettaglio della retinatura: Imposta il dettaglio o il numero di triangoli che sono usati per visualizzare determinati oggetti. Un valore più alto impiega più tempo ad essere visualizzato, ma rende questi oggetti più dettagliati.
-
-Dettagli dell&apos;illuminazione: Seleziona quali tipi di luce vuoi visualizzare.
-
-Dettaglio del terreno: Imposta la quantità di dettagli che vuoi vedere per le texture del terreno.
- </notification>
<notification name="WLSavePresetAlert">
Vuoi sovrascrivere le preimpostazioni salvate?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
@@ -2153,158 +1821,6 @@ Dettaglio del terreno: Imposta la quantità di dettagli che vuoi vedere per le t
Effetto di post elaborazione già presente. Vuoi sovrascrivere?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
- <notification name="HelpEditSky">
- Modifica i cursori di WindLight per creare e savare un insieme di cieli.
- </notification>
- <notification name="HelpEditDayCycle">
- Scegli quale cielo impostare per ciclo giornaliero.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Queste impostazioni modificano il modo in cui l&apos;ambiente viene visto localmente sul tuo computer. La tua scheda grafica deve supportare gli effetti atmosferici per poter accedere a tutte le impostazioni.
-
-Modifica il cursore &apos;Ora del Giorno&apos; per cambiare la fase giornaliera locale sul client.
-
-Modifica il cursore &apos;Intensità delle nuvole&apos; per controllare la quantità di nuvole che coprono il cielo.
-
-Scegli un colore nella tavolozza colori per il &apos;colore dell&apos;acqua&apos; per cambiare il colore dell&apos;acqua.
-
-Modifica il cursore &apos;Nebbiosità dell&apos;acqua&apos; per controllare quanto densa è la nebbia sott&apos;acqua.
-
-Clicca &apos;Usa l&apos;ora della proprietà&apos; per sincronizzare il tempo del giorno con l&apos;ora del giorno della regione e collegarle stabilmente.
-
-Clicca &apos;Cielo avanzato&apos; per visualizzare un editor con le impostazioni avanzate per il cielo.
-
-Clicca &apos;Acqua Avanzata&apos; per visualizzare un editor con le impostazini avanzate per l&apos;acqua.
- </notification>
- <notification name="HelpDayCycle">
- L&apos;editor del Ciclo Giorno/Notte permette di controllare il cielo durante il ciclo giornaliero di [SECOND_LIFE]. Questo è il ciclo che è usato dal cursore dell&apos;editor base dell&apos;ambiente.
-
-L&apos;editor del ciclo giorno/notte funziona impostando i fotogrammi chiave. Questi sono nodi (rappresentati da tacche grige sul grafico temporale) che hanno delle preregolazioni associate del cielo. Man mano che l&apos;ora del giorno procede, il cielo di WindLight&apos;si anima&apos; interpolando i valori fra questi fotogrammi chiave.
-
-La freccia gialla sopra la linea del tempo rappresenta la tua vista corrente, basata sull&apos;ora del giorno. Cliccandola e spostandola vedrai come il giorno si animerebbe. Si può aggiungere o cancellare fotogrammi chiave cliccando sui tasti &apos;Aggiungi Fotogramma Chiave&apos; e &apos;Cancella Fotogramma Chiave&apos; alla destra della linea del tempo.
-
-Si possono impostare le posizioni temporali dei fotogrammi chiave spostandole lungo la linea del tempo o impostando il loro valore a mano nella finestra di impostazione dei fotogrammi chiave. All&apos;interno della finestra di impostazione si può associare il fotogramma chiave con le impostazioni corrispondenti di Wind Light.
-
-La durata del ciclo definisce la durata complessiva di un &apos;giorno&apos;. Impostando questo ad un valore basso (per esempio, 2 minuti) tutto il ciclo di 24 ore verrà completato in solo 2 minuti reali! Una volta soddisfatto dell tua linea del tempo e le impostazioni dei fotogrammi chiave, usa i bottoni Play e Stop per vederne in anteprima i risultati. Attenzione: si può sempre spostare la freccia gialla indicatrice del tempo sopra la linea del tempo per vedere il ciclo animarsi interattivamente. Scegliendo invece il pulsanto &apos;Usa il tempo della regione&apos; ci si sincronizza con il le durate del ciclo definite per questa regione.
-
-Una volta soddisfatto del ciclo giornaliero, puoi salvarlo o ricaricarlo con i bottoni &apos;Salva test del giorno&apos; e &apos;Carica il test del giorno&apos;. Attualmente è possibile definire un solo ciclo giorno/notte
- </notification>
- <notification name="HelpBlueHorizon">
- Si usano i cursori RGB (Rosso/Verde/Blu) per modificare il colore del cielo. Si può usare il cursore I (Intensità) per alterare i tre cursori all&apos;unisono.
- </notification>
- <notification name="HelpHazeHorizon">
- Altezza della foschia all&apos;orizzonte è uno dei parametri più utili per modificare l&apos;esposizione di luce complessiva nella scena.
-E&apos; utile per simulare molte impostazioni di esposizione, come la sovraesposizione del sole e impostazioni più scure a diaframma chiuso.
- </notification>
- <notification name="HelpBlueDensity">
- La densità del blu influenza la saturazione complessiva del cielo e della nebbia. Se impostate il cursore (I) Intensità verso destra i colori diventeranno più brillanti e accesi. Se lo impostate tutto a sinistra, i colori diventeranno opachi e ultimamente si confonderanno con il bianco/nero. Se si vuole controllare in modo preciso l&apos;equilibro di colori del cielo, si può agire sui singoli elementi di saturazione utilizzando i tre cursori RGB (Rosso, Verde, Blu).
- </notification>
- <notification name="HelpHazeDensity">
- La densità della foschia controlla il livello di foschia grigia generale nell&apos;atmosfera.
-E&apos; utile per simulare scene con un livello alto di fumo e di inquinamento di origine umana.
-E&apos; anche utile per simulare la nebbia e la foschia al mattino.
- </notification>
- <notification name="HelpDensityMult">
- Il moltiplicatore di densità può essere usato per influenzare la densità atmosferica generale. Con valori bassi, crea la sensazione di &apos;aria sottile&apos;, con valori alti crea un effetto molto pesante, annebbiato.
- </notification>
- <notification name="HelpDistanceMult">
- Modifica la distanza percepita da WindLight.
-Immettendo il valore zero si spegne l&apos;influenza di WindLight sul terreno e gli oggetti.
-Valori più grandi di 1 simulano distanze più grandi per effetti atmosferici più spessi.
- </notification>
- <notification name="HelpMaxAltitude">
- Altitudine Massima modifica i calcoli di altezza che fa WindLight quando calcola l&apos;illuminazione atmosferica.
-In periodi successivi del giorno, è utile per modificare quanto &apos;profondo&apos; appaia il tramonto.
- </notification>
- <notification name="HelpSunlightColor">
- Modifica il colore e l&apos;intensità della luce diretta nella scena.
- </notification>
- <notification name="HelpSunAmbient">
- Modifica il colore e l&apos;intensità della luce atmosferica ambientale nella scena.
- </notification>
- <notification name="HelpSunGlow">
- Il cursore Grandezza controlla la dimensione del sole.
-Il cursore Focus controlla quanto è offuscato il sole sopra il cielo.
- </notification>
- <notification name="HelpSceneGamma">
- Modifica la distribuzione di luci e ombre nello schermo.
- </notification>
- <notification name="HelpStarBrightness">
- Modifica la brillantezza delle stelle nel cielo.
- </notification>
- <notification name="HelpTimeOfDay">
- Controlla la posizione del sole nel cielo.
-Simile all&apos;elevazione.
- </notification>
- <notification name="HelpEastAngle">
- Controlla la posizione del sole nel cielo.
-Simile all&apos;azimuth.
- </notification>
- <notification name="HelpCloudColor">
- Modifica il colore delle nuvole. Normalmente si raccomanda di mantenere un colore verso il bianco, ma puoi sbizzarrirti.
- </notification>
- <notification name="HelpCloudDetail">
- Controlla l&apos;immagine dei dettagli che è sovraimposta sopra l&apos;immagine principale delle nuvole.
-X e Y controllano la sua posizione.
-D (Densità) controlla quanto gonfie o spezzettate appaiono le nuvole.
- </notification>
- <notification name="HelpCloudDensity">
- Consente di controllare la posizione delle nuvole usando i cursori X e Y e quanto dense siano usando il cursore D.
- </notification>
- <notification name="HelpCloudCoverage">
- Controlla quanto le nuvole coprono il cielo.
- </notification>
- <notification name="HelpCloudScale">
- Controlla le dimensioni delle immagini delle nuvole sul cielo stellato.
- </notification>
- <notification name="HelpCloudScrollX">
- Controlla la velocità delle nuvole lungo la direzione X.
- </notification>
- <notification name="HelpCloudScrollY">
- Controlla la velocità delle nuvole lungo la direzione Y.
- </notification>
- <notification name="HelpClassicClouds">
- Seleziona questa casella per consentire la visualizzazione delle nuvole nello stile classico in aggiunta alle nuvole Windlight.
- </notification>
- <notification name="HelpWaterFogColor">
- Sceglie il Colore della nebbiosità dell&apos;acqua.
- </notification>
- <notification name="HelpWaterFogDensity">
- Controlla la densità della foschia dell&apos;acqua e quanto lontano si può vedere sott&apos;acqua.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifica l&apos;effetto dell&apos;Esponente Densità Vapore Acqueo per controllare quanto lontano può vedere il vostro avatar quando è sott&apos;acqua.
- </notification>
- <notification name="HelpWaterGlow">
- Controlla la quantità del bagliore dell&apos;acqua.
- </notification>
- <notification name="HelpWaterNormalScale">
- Controlla le dimensioni delle tre wavelet che compongono l&apos;acqua.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Controlla quanta luce è riflessa ad angoli differenti.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Controlla quanta intensità di luce è riflessa.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Controlla quanta luce è rifratta guardando dal di sopra della superficie dell&apos;acqua.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Controlla quanta luce è rifratta guardando dal di sotto della superficie dell&apos;acqua.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Controlla come le onde e le riflessioni vengono miscelate.
- </notification>
- <notification name="HelpWaterNormalMap">
- Controlla quale mappa normale è sovraimposta nell&apos;acqua per determinare le riflessioni/rifrazioni.
- </notification>
- <notification name="HelpWaterWave1">
- Controlla dove e quanto velocemente la versione ingrandita della mappa normale si muove lungo le direzioni X e Y.
- </notification>
- <notification name="HelpWaterWave2">
- Controlla dove e quanto velocemente la versione ridotta della mappa normale si muove lungo le direzioni X e Y.
- </notification>
<notification name="NewSkyPreset">
Fornisci il nome per il nuovo cielo.
<form name="form">
@@ -2350,35 +1866,33 @@ D (Densità) controlla quanto gonfie o spezzettate appaiono le nuvole.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Gli elementi non possono essere comprati mentre sono indossati.
+ Non puoi comprare un oggetto mentre è indossato.
</notification>
<notification label="Informazioni sulle richieste per il permesso di addebito" name="DebitPermissionDetails">
Accettare questa richiesta da allo script il permesso continuativo di prendere Linden dollar (L$) dal tuo account. Per revocare questo permesso, il proprietario dell&apos;oggetto deve cancellare l&apos;oggetto oppure reimpostare gli script nell&apos;oggetto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- Vuoi indossare automaticamente i vestiti che crei?
- <usetemplate ignoretext="Quando Indossi automaticamente nuovi vestiti." name="okcancelignore" notext="No" yestext="Si"/>
+ Vuoi indossare automaticamente gli oggetti che stai per creare?
+ <usetemplate ignoretext="Indossa gli abiti che creo mentre modifico il Mio Aspetto" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="NotAgeVerified">
- La tua età deve essere verificata per poter entrare in questo territorio.
-Vuoi visitare il sito di [SECOND_LIFE] per verificare la tua eta?
+ Devi avere l&apos;Età Verificata per visitare quest&apos;area. Vuoi andare sul sito [SECOND_LIFE] per verificare la tua età?
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php
+ https://secondlife.com/account/verification.php?lang=it
</url>
- <usetemplate ignoretext="Quando hai un avviso per mancanza della verifica dell&apos;età." name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Questo terreno richiede che tu abbia registrato le tue informazioni di pagamento prima che tu possa accedervi.
-Vuoi visitare il sito di [SECOND_LIFE] per impostarle?
+ Devi avere le Informazioni di Pagamento registrate per poter visitare quest&apos;area. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=it
</url>
- <usetemplate ignoretext="Quando hai un avviso per mancanza di informazioni di pagamento registrate." name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Manca la registrazione delle Informazioni di Pagamento" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="MissingString">
La stringa [STRING_NAME] non è presente in strings.xml
@@ -2408,7 +1922,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per impostarle?
[FIRST] [LAST] è Offline
</notification>
<notification name="AddSelfFriend">
- Non puoi aggiungere te stesso come amico.
+ Anche se sei molto piacevole, non puoi aggiungerti come amicizia.
</notification>
<notification name="UploadingAuctionSnapshot">
Sto importando le fotografie per l&apos;uso inworld e per il web...
@@ -2427,7 +1941,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per impostarle?
Terrain.raw caricato
</notification>
<notification name="GestureMissing">
- La gesture [NAME] non è stata trovata nel database.
+ Manca la Gesture [NAME] dal database.
</notification>
<notification name="UnableToLoadGesture">
Impossibile caricare la gesture [NAME].
@@ -2440,14 +1954,14 @@ Riprova.
Impossibile caricare il Landmark di riferimento. Riprova.
</notification>
<notification name="CapsKeyOn">
- Il tasto BLOC MAIUSC è attivato.
-Dato che questo tasto ha effetto su come scrivi la password, forse sarebbe preferibile disattivarlo.
+ Hai il Blocco delle Maiuscole attivato.
+Questo potrebbe influenzare la tua password.
</notification>
<notification name="NotecardMissing">
Notecard non trovata nel database.
</notification>
<notification name="NotecardNoPermissions">
- Permessi insufficienti per visualizzare la notecard.
+ Non hai il permesso di vedere questa notecard.
</notification>
<notification name="RezItemNoPermissions">
Permessi insufficienti per creare un oggetto.
@@ -2485,11 +1999,11 @@ Riprova.
Riprova.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Non è possibile acquistare oggetti provenienti da diversi proprietari allo stesso tempo.
-Seleziona un oggetto singolo per volta.
+ Puoi comprare oggetti solo da un proprietario per volta.
+Seleziona solo un oggetto.
</notification>
<notification name="ObjectNotForSale">
- L&apos;oggetto non sembra essere in vendita
+ Questo oggetto non è in vendita.
</notification>
<notification name="EnteringGodMode">
Entra in modalità divina, livello [LEVEL]
@@ -2498,10 +2012,10 @@ Seleziona un oggetto singolo per volta.
Esci dalla modalità divina, livello [LEVEL]
</notification>
<notification name="CopyFailed">
- La copia non è riuscita perche non hai il permesso di copiare.
+ Non hai i permessi per copiare.
</notification>
<notification name="InventoryAccepted">
- [NAME] ha accettato la tua offerta dall&apos;inventario.
+ [NAME] ha ricevuto la tua offerta di Inventory.
</notification>
<notification name="InventoryDeclined">
[NAME] non ha accettato la tua offerta dall&apos;inventario.
@@ -2516,12 +2030,14 @@ Seleziona un oggetto singolo per volta.
Il tuo biglietto da visita non è stato accettato.
</notification>
<notification name="TeleportToLandmark">
- Ora che hai raggiunto la mainland, puoi teleportarti in posti come &apos;[NAME]&apos; cliccando inventario in basso a destra del tuo schermo, e selezionando la cartella dei Landmarks.
-Fai doppio click su un landmark e poi clicca su Teleport per andare là.
+ Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, e quindi selezionare la linguetta Landmarks.
+Clicca su un landmark per selezionarlo e quindi clicca &apos;Teleport&apos; sul fondo del pannello.
+(Puoi anche fare doppio-click sul landmark oppure cliccarlo con il tasto destro e scegliere &apos;Teleport&apos;.)
</notification>
<notification name="TeleportToPerson">
- Ora che hai raggiunto la mainland, puoi contattare residenti con &apos;[NAME]&apos; cliccando inventario in basso a destra del tuo schermo, e selezionando la cartella dei biglietti da visita.
-Fai doppio click sul biglietto, clicca su IM messaggio istantaneo, e scrivi il messaggio.
+ Puoi contattare residenti come &apos;[NAME]&apos; aprendo il pannello Persone sul lato destro dello schermo.
+Seleziona il residente dalla lista, e clica &apos;IM&apos; in fondo al pannello.
+(Puoi anche fare doppio click sul loro nome nella lista, oppure cliccare con il tasto destro e scegliere &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Non è possibile selezionare il terreno attraverso i confini del server.
@@ -2544,6 +2060,9 @@ Prova a selezionare una parte di terreno più piccola.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notifica eventi:
@@ -2568,8 +2087,20 @@ Prova a selezionare una parte di terreno più piccola.
[NAMES]
</notification>
<notification name="NoQuickTime">
- Il software Apple QuickTime sembra non essere installato nel tuo sistema.
-Se desideri visualizzare il video streaming nei terreni supportati si consiglia di andare sul sito di QuickTime (http://www.apple.com/quicktime) e procedere con l&apos;installazione di QuickTime Player.
+ Il Software QuickTime di Apple non sembra installato sul tuo computer.
+Se vuoi vedere contenuto multimediale sugli appezzamenti che lo supportano devi andare su [http://www.apple.com/quicktime QuickTime site] e installare il Player QuickTime.
+ </notification>
+ <notification name="NoPlugin">
+ Nessun Media Plugin è stato trovato per gestire &quot;[MIME_TYPE]&quot; il tipo mime. Il Media di questo tipo non è disponibile.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Questo Media Plugin non funziona:
+ [PLUGIN]
+
+Per favore re-installa il plugin o contatta il venditore se continui ad avere questi problemi.
+ <form name="form">
+ <ignore name="ignore" text="Mancato funzionamento del Media Plugin"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
@@ -2588,24 +2119,26 @@ Gli oggetti non trasferibili che erano stati ceduti al gruppo sono stati cancell
<notification name="UnOwnedObjectsReturned">
Gli oggetti selezionati sul terreno che non sono di tua proprietà sono stati restituiti ai loro proprietari.
</notification>
+ <notification name="ServerObjectMessage">
+ Messaggio da [NAME]:
+[MSG]
+ </notification>
<notification name="NotSafe">
- In questa terra il danno è abilitato (&apos;non sicura&apos;).
-Puoi farti male qui. Se muori, sarai teleportato a casa.
+ Questo terreno è abilitato ai Danni da combattimento.
+Qui potresti ricevere ferite. Se dovessi morire verrai teleportato a casa tua.
</notification>
<notification name="NoFly">
- Questa terra ha il volo disabilitato (&apos;non puoi volare&apos;).
-Non è possibile volare qui.
+ Quest&apos;are ha il volo disabilitato.
+Qui non puoi volare.
</notification>
<notification name="PushRestricted">
- Questa terra è &apos;Senza spinte&apos;.
-Non si puo spingere gli altri a meno che tu non sia propietario del terreno.
+ Quest&apos;area non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno.
</notification>
<notification name="NoVoice">
- Questa terra ha il voice disabilitato.
+ Quest&apos;area ha la chat voice disabilitata. Non puoi sentire nessuno parlare.
</notification>
<notification name="NoBuild">
- Questo terreno ha la costruzione disabilitata (&apos;non puoi costruire&apos;).
-Non puoi costruire qui.
+ Quest&apos;area ha il building disabilitato. Qui non puoi costruire o rezzare oggetti.
</notification>
<notification name="ScriptsStopped">
Un amministratore ha temporaneamente disabilitato gli script in questa regione.
@@ -2614,12 +2147,12 @@ Non puoi costruire qui.
In questa terra nessuno script è attivo.
</notification>
<notification name="NoOutsideScripts">
- Questa land ha script esterni disabilitati.
-(&apos;nessuno script esterno&apos;).
-Nessuno script esterno funzionerà tranne quelli del propietario del terreno.
+ Questo terreno non consente script esterni.
+
+Qui funzinano solo gli script del proprietario del terreno.
</notification>
<notification name="ClaimPublicLand">
- Puoi solo prendere possesso di terra pubblica nella regione dove sei attualmente.
+ Puoi solo chiedere terreni pubblici nella regione in cui sei posizionato.
</notification>
<notification name="RegionTPAccessBlocked">
Non puoi entrare in quella regione a causa della tua categoria di accesso. Può essere necessario validare l&apos;età e/o installare l&apos;ultima versione del programma.
@@ -2632,16 +2165,9 @@ Visita la Knowledge Base per informazioni sull&apos;accesso alle aree con queste
<notification name="NoTeenGridAccess">
Il tuo account non può connettersi a questa regione della griglia per Teenager.
</notification>
- <notification name="NoHelpIslandTP">
- Non è possibile per te ritornare all&apos;Help Island.
-Vai alla &apos;Help Island Public&apos; per ripetere il tutorial.
- </notification>
<notification name="ImproperPaymentStatus">
Non hai una impostazioni di pagamento corrette per entrare in questa regione.
</notification>
- <notification name="MustGetAgeRegion">
- Devi avere un&apos;età verificata per entrare in questa regione.
- </notification>
<notification name="MustGetAgeParcel">
Devi essere di età verificata per entrare in questa terra.
</notification>
@@ -2704,31 +2230,35 @@ Riprova tra qualche istante.
Non è stato trovato nessun territorio valido.
</notification>
<notification name="ObjectGiveItem">
- Un oggetto chiamato [OBJECTFROMNAME] di proprietà di [FIRST] [LAST] ti ha dato un [OBJECTTYPE] che si chiama [OBJECTNAME].
+ L&apos;oggetto [OBJECTFROMNAME] posseduto da [NAME_SLURL] ti ha dato [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
<button name="Discard" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Un oggetto chiamato [OBJECTFROMNAME] di proprietà di (un utente sconosciuto) ti ha dato un [OBJECTTYPE] che si chiama [OBJECTNAME].
+ Un oggetto di nome [OBJECTFROMNAME] posseduto da un residente sconosciuto ti ha dato [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
<button name="Discard" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] ti ha dato un [OBJECTTYPE] chiamato &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] ti ha dato [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
+ <button name="Show" text="Mostra"/>
<button name="Discard" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2740,7 +2270,7 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] ti ha offerto di teleportarti dove sta ora:
+ [NAME] ti ha offerto di teleportarti nella sua ubicazione:
[MESSAGE]
<form name="form">
@@ -2767,6 +2297,9 @@ Riprova tra qualche istante.
<button name="Decline" text="Rifiuta"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Hai offerto l&apos;amicizia a [TO_NAME]
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] ti ha offerto la sua amicizia.
@@ -2792,12 +2325,12 @@ in modo da poter rapidamente inviargli un IM al residente.
</form>
</notification>
<notification name="RegionRestartMinutes">
- Il riavvio della regione avverrà tra [MINUTES] minuti.
-Se rimani in questa regione sarai disconnesso.
+ Questa regione farà il restart fra [MINUTES] minuti.
+Se rimani qui verrai disconnesso.
</notification>
<notification name="RegionRestartSeconds">
- Il riavvio della regione avverrà tra [SECONDS] secondi.
-Se rimani in questa regione sarai disconnesso.
+ Questa regione farà il restart fra [SECONDS] secondi.
+Se rimani qui verrai disconnesso.
</notification>
<notification name="LoadWebPage">
Caricare pagina web [URL]?
@@ -2817,7 +2350,7 @@ Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
Impossibile trovare [TYPE] chiamato [DESC] nel database.
</notification>
<notification name="InvalidWearable">
- L&apos;oggetto che si sta tentando di indossare utilizza una funzione che il programma non riesce a leggere. Aggiorna la tua versione di [APP_NAME] per riuscire a indossare l&apos;oggetto.
+ L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, vorrebbe:
@@ -2827,16 +2360,16 @@ Va bene?
<form name="form">
<button name="Yes" text="Si"/>
<button name="No" text="No"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, vorrebbe:
+ Un oggetto di nome &apos;[OBJECTNAME]&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
-Se non ci si fida dell&apos;oggetto e del suo creatore, si dovrebbe negare la richiesta. Per ulteriori informazioni, fai clic sul pulsante &apos;Dettagli&apos;.
+Se non ti fidi di questo oggetto e del suo creatore dovresti declinare la richiesta.
-Accettare tale richiesta?
+Consenti questa richiesta?
<form name="form">
<button name="Grant" text="Accetta"/>
<button name="Deny" text="Nega"/>
@@ -2857,39 +2390,44 @@ Accettare tale richiesta?
<button name="Ignore" text="Ignora"/>
</form>
</notification>
+ <notification name="ScriptToast">
+ [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; richiede il contributo dell&apos;utente.
+ <form name="form">
+ <button name="Open" text="Apri il Dialog"/>
+ <button name="Ignore" text="Ignora"/>
+ <button name="Block" text="Blocca"/>
+ </form>
+ </notification>
<notification name="FirstBalanceIncrease">
Hai appena ricevuto [AMOUNT]L$.
-Gli oggetti e gli altri utenti possono darti L$.
-Il tuo saldo è indicato nell&apos;angolo in alto a destra dello schermo.
+Il tuo saldo in L$ è mostrato in alto a destra.
</notification>
<notification name="FirstBalanceDecrease">
Hai appena pagato [AMOUNT]L$.
-Il tuo saldo è indicato nell&apos;angolo in alto a destra dello schermo.
+Il tuo saldo in L$ è mostrato in alto a destra.
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Grazie per il pagamento!
+
+Il tuo saldo in L$ sarà aggiornato al termine dell&apos;elaborazione. Se l&apos;elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l&apos;ammontare dell&apos;acquisto verrà rimborsato nel tuo saldo in US$.
+
+Lo stato del tuo pagamento potrà essere controllato nella pagina della Storia delle tue Transazioni su [http://secondlife.com/account/ Pannello di Controllo]
</notification>
<notification name="FirstSit">
Sei seduto.
-Utilizza i tasti freccia (o AWSD) per cambiare visualizzazione.
-Fai clic sul pulsante &apos;Alzati&apos; per rialzarti.
+Usa le frecce (oppure AWSD) per guardarti intorno.
+Clicca il bottone &apos;Alzati&apos; per alzarti.
</notification>
<notification name="FirstMap">
- Fai clic e trascina per scorrere la mappa.
-Doppio click per teleportarti.
-Utilizza i controlli sulla destra per trovare le cose e visualizzare sfondi differenti.
+ Clicca e trascina la mappa per guardare attorno.
+Fai doppio click per teleportarti.
+Usa i controlli sulla destra per trovare cose e visualizzare sfondi differenti.
</notification>
<notification name="FirstBuild">
- È possibile creare nuovi oggetti in alcune zone di [SECOND_LIFE].
-Utilizza gli strumenti in alto a sinistra per costruire, e prova a tenere premuto Ctrl o Alt per passare rapidamente tra uno strumento e l&apos;altro.
-Premi Esc per smettere di costruire.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Cliccare con il tasto sinistro fa interagire con particolari oggetti.
-Se il puntatore del mouse si trasforma in una mano, puoi interagire con l&apos;oggetto.
-Se fai clic col tasto destro ti verranno sempre mostrati menù con le cose che puoi fare.
+ Hai aperto gli Strumenti di Build. Ogni oggetto attorno a te è stato costruito con questi strumenti.
</notification>
<notification name="FirstTeleport">
- Questa regione non permette i teleport da punto a punto, cosi sei stato teletrasportato nel punto più vicino.
-La tua destinazione originale è comunque segnata da un segnale luminoso.
-Segui la freccia rossa per arrivare a destinazione, o fai clic sulla freccia per spegnerla.
+ Puoi teleportarti solo in certe aree di questa regione. La freccia indica la tua destinazione. Clicca sulla freccia per farla sparire.
</notification>
<notification name="FirstOverrideKeys">
I tuoi movimenti della tastiera vengono ora gestiti da un oggetto.
@@ -2899,86 +2437,80 @@ Premi &apos;M&apos; per farlo.
</notification>
<notification name="FirstAppearance">
Stai modificando il tuo aspetto.
-Per ruotare e fare uno zoom, utilizza le frecce della tastiera.
-Quando hai finito, premi &apos;Salva tutto&apos;
-per salvare il tuo look e uscire.
-Puoi modificare il tuo aspetto ogni qualvolta vuoi.
+Usa le frecce per guardarti attorno.
+Quando hai finito premi &apos;Salva Tutto&apos;.
</notification>
<notification name="FirstInventory">
- Questo è il tuo inventario, che contiene gli oggetti, notecard, abbigliamento, e altre cose che possiedi.
-* Per indossare un oggetto o un outfit completo contenuto in una cartella, trascinali su te stesso.
-* Per ricreare un oggetto inworld, trascinalo sul terreno.
-* Per leggere una notecard, fai doppio clic su di essa.
+ Questo è il tuo Inventory, che contiene gli elementi che possiedi.
+
+* Per indossare qualcosa, trascinala su di te.
+* Per rezzare qualcosa inworld, trascinala sul suolo.
+* Per leggere una notecard, fai doppio click.
</notification>
<notification name="FirstSandbox">
- Questa è una regione sandbox.
-Gli oggetti che costruisci qui, potrebbero essere cancellati dopo che lasci questa area, dato che le sandbox si autopuliscono regolarmente. Leggi le informazioni scritte al riguardo, vicino al nome della regione in alto sullo schermo.
+ Questa è una Sandbox, serve per aiutare i Residenti ad imparare a costruire.
-Le regioni sandbox sono rare, e sono contrassegnate da segnali.
+Gli oggetti che costruisci qui saranno cancellati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro e scegliere &apos;Prendi&apos; per trasferirle nel tuo Inventory.
</notification>
<notification name="FirstFlexible">
- Questo oggetto è flessibile.
-Gli oggetti flessibili non possono essere fisici e devano essere fantasma fino a quando la casella di controllo della flessibilità verrà deselezionata.
+ Questo oggetto è flessibile. Gli oggetti Flexy devono essere fantasma e non fisici.
</notification>
<notification name="FirstDebugMenus">
- Hai attivato il menu Avanzato.
-Questo menu contiene funzioni utili per gli sviluppatori per il debug di [SECOND_LIFE].
-Per attivare o disattivare questo menu su Windows premere Ctrl+Alt+D. Su Mac premere &#8997;&#8984;D.
+ Hai abilitato il menu Avanzato.
+
+Per abilitarlo/disabilitarlo,
+ Windows: Ctrl+Alt+D
+ Mac: &#8997;&#8984;D
</notification>
<notification name="FirstSculptedPrim">
- Si sta modificando uno sculpted prim.
-Gli sculpted prim richiedono una speciale texture che ne specifichi la forma.
-Puoi trovare esempi di texture sculpted nella libreria dell&apos;inventario.
- </notification>
- <notification name="FirstMedia">
- Hai iniziato la riproduzione dei media. I media possono essere impostati per essere riprodotti automaticamente nella finestra delle Preferenze sotto la voce Audio / Video. Questo può essere un rischio di sicurezza da media che non sono affidabili.
+ Stai modificando un prim Sculpted. Gli oggetti Sculpted hanno bisogno di una texture speciale per definire la loro forma.
</notification>
<notification name="MaxListSelectMessage">
È possibile selezionare solo fino a [MAX_SELECT] oggetti da questa lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] ti ha invitato a una chiamata Voice.
-Fai clic su Accetta per partecipare alla chiamata o su Rifiuta per rifiutare l&apos;invito. fai clic sul pulsante Muta per mutare il chiamante.
+ [NAME] ti sta invitando ad una chiamata in Chat Voice.
+Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- A [FIRST] [LAST] e&apos; stato mandato un messaggio instantaneo ed è stato quindi automaticamente non mutato.
+ Hai appena inviato un IM a [FIRST] [LAST], che è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByMoney">
- A [FIRST] [LAST] è stato dato del denaro ed è stato automaticamente non mutato.
+ Hai appena inviato del denaro a [FIRST] [LAST], che è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByInventory">
- A [FIRST] [LAST] é stato passato qualcosa dall&apos;inventario ed è stato automaticamente non mutato.
+ Hai appena offerto un elemento dell&apos;Inventory a [FIRST] [LAST], che è stato automaticamente sbloccato.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] ha iniziato una chiamata Voice-Chat con il gruppo [GROUP].
-Fai clic su Accetta per partecipare alla chiamata o Rifiuta per Rifiutare l&apos;invito. Fai clic sul pulsante muta per mutare il chiamante.
+ [NAME] si è aggiunto alla chiamata in Chat Voice con il gruppo [GROUP].
+Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] ha iniziato una chiamata Voice Chat mediante una conferenza chat..
-Fai clic su Accetta per partecipare alla chiamata o Rifiuta per Rifiutare l&apos;invito. Fai clic sul pulsante muta per mutare il chiamante.
+ [NAME] si è aggiunto alla chiamata in Chat Voice con una conferenza.
+Clicca Accetta per unirti alla chiamata oppure Declina to declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] ti ha invitato ad una conferenza chat.
-Fai clic su Accetta per partecipare alla chiamata o su Rifiuta per rifiutare l&apos;invito. Fai clic sul pulsante muta per mutare il chiamante.
+ [NAME] ti sta invitando ad una conferenza in chat.
+Clicca Accetta per unirti alla chat oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
- <button name="Mute" text="Muta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -2988,25 +2520,25 @@ Fai clic su Accetta per partecipare alla chiamata o su Rifiuta per rifiutare l&a
Siamo spiacenti. Questa area ha raggiunto la capacità massima per le chiamate voice. Si prega di provare ad usare il voice in un&apos;altra area.
</notification>
<notification name="VoiceChannelDisconnected">
- Sei stato disconnesso da [VOICE_CHANNEL_NAME]. Ora verrai riconnesso al canale voice chat pubblico.
+ Sei stato disconnesso da [VOICE_CHANNEL_NAME]. Verrai ora riconnesso alla Chat Voice Locale.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha chiuso la chiamata. Ora verrai riconnesso al canale voice chat pubblico.
+ [VOICE_CHANNEL_NAME] ha terminato la chiamata. Verrai ora riconnesso alla Chat Voice Locale.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha rifiutato la tua chiamata. Ora verrai riconnesso al canale voice chat pubblico.
+ [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] non è disponibile per rispondere alla chiamata. Ora verrai riconnesso al canale voice chat pubblico.
+ [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale.
</notification>
<notification name="VoiceChannelJoinFailed">
- Impossibile connettersi con [VOICE_CHANNEL_NAME], si prega di riprovare più tardi. Ora verrai riconnesso al canale voice chat pubblico.
+ Connessione a [VOICE_CHANNEL_NAME] fallita, riprova più tardi. Verrai ora riconnesso alla Chat Voice Locale.
</notification>
<notification name="VoiceLoginRetry">
Stiamo creando una canale voice per te. Questo può richiedere fino a un minuto.
</notification>
<notification name="Cannot enter parcel: not a group member">
- Non puoi entrare nel terreno, non sei un membro del gruppo appropriato.
+ Soltanto i membri di uno specifico gruppo possono visitare quest&apos;area.
</notification>
<notification name="Cannot enter parcel: banned">
Non puoi entrare nel terreno, sei stato bloccato.
@@ -3021,18 +2553,58 @@ Fai clic su Accetta per partecipare alla chiamata o su Rifiuta per rifiutare l&a
Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi.
</notification>
<notification name="ServerVersionChanged">
- La regione in cui sei entrato, gira su una versione di simulatore differente. Fai clic su questo messaggio per i dettagli.
+ Sei appena entrato in una regione che usa una versione differente del server, questo potrebbe influenzare le prestazioni. [[URL] Guarda le Release Notes.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Lo SLurl che hai cliccato non è attivo.
+ </notification>
+ <notification name="BlockedSLURL">
+ Uno SLurl è stato ricevuto da un browser sconosciuto e per la tua sicurezza è stato bloccato.
</notification>
- <notification name="UnableToOpenCommandURL">
- L&apos;URL che hai selezionato non può essere aperto da questo browser.
+ <notification name="ThrottledSLURL">
+ Multipli SLurls sono stati ricevuti da un browser sconosciuto in un breve periodo.
+Per la tua sicurezza verranno bloccati per alcuni secondi.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Rispondi"/>
+ </form>
+ </notification>
+ <notification name="AttachmentSaved">
+ L&apos;Allegato (Attachment) è stato salvato.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Impossibilitato a trovare il tema aiuto per questo elemento (nozione)???!!!!.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Errore del Server: aggiornamento del Media o mancato funzionamento.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Il tuo testo nella chat è stato interrotto dal moderatore.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ La tua voce è stata interrotta dal moderatore.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
+ <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Il bottone selezionato non può essere mostrato in questo momento.
+Il bottone verrà mostrato quando ci sarà abbastanza spazio.
</notification>
<global name="UnsupportedCPU">
- La velocità della tua CPU non soddisfa i requisiti minimi.
</global>
<global name="UnsupportedGLRequirements">
- Sembra che tu non abbia i requisiti appropriati hardware per [APP_NAME]. [APP_NAME] ha bisogno di una scheda grafica OpenGL che abbia il supporto multitexture. Se ritieni di avere l&apos;hardware giusto verifica di avere installati i driver più aggiornati per la tua scheda grafica e gli aggiornamenti e service pack appropriati per il tuo sistema operativo.
+ Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se tu ce l&apos;hai, dovresti accertarti di avere i driver, i service pack e le patch più recenti della scheda grafica e del tuo sistema operativo.
-Se continui ad avere problemi, visita il sito: http://www.secondlife.com/support
+Se continui ad avere problemi, visita [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -3046,10 +2618,8 @@ Se continui ad avere problemi, visita il sito: http://www.secondlife.com/support
<global name="UnsupportedRAM">
- La memoria del tuo sistema non soddisfa i requisiti minimi.
</global>
- <global name="PermYes">
- Si
- </global>
- <global name="PermNo">
- No
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Se possiedi una parte di terra, puoi creare qui la tua ubicazione di casa.
+Altrimenti, puoi guardare sulla Mappa e trovare luoghi segnalati come &quot;Infohub&quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/it/panel_active_object_row.xml b/indra/newview/skins/default/xui/it/panel_active_object_row.xml
new file mode 100644
index 0000000000..b8cca6f01a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Oggetto sconosciuto
+ </string>
+ <text name="object_name">
+ Oggetto senza nome
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..4a7c9b11c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <panel name="panel_call_buttons">
+ <button label="Chiama" name="call_btn"/>
+ <button label="Abbandona Chiamata" name="end_call_btn"/>
+ <button label="Voice Controls" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..40f805774e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]w
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mon
+ </string>
+ <string name="FormatYears">
+ [COUNT]y
+ </string>
+ <text name="avatar_name" value="Sconosciuto"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..cf833924ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista bloccata
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista dei residenti bloccati"/>
+ <button label="Blocca il Residente..." label_selected="Blocca Residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/>
+ <button label="Blocca l&apos;oggetto per nome..." label_selected="Blocca l&apos;oggetto per nome..." name="Block object by name..."/>
+ <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi dalla lista il residente o l&apos;oggetto bloccato"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray.xml b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
new file mode 100644
index 0000000000..f2aab63dce
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Microfono on/off
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Mostra/nascondi il pannello voice control
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_box label="Gesture" name="Gesture" tool_tip="Mostra/nascondi gestures"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Sposta" name="movement_btn" tool_tip="Mostra/nascondi i controlli del movimento"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Visualizza" name="camera_btn" tool_tip="Mostra/nascondi i controlli della camera"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Scatta una foto"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_classified_info.xml b/indra/newview/skins/default/xui/it/panel_classified_info.xml
new file mode 100644
index 0000000000..2ba127d34a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_classified_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <text name="title" value="Info sugli Annunci"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="classified_name" value="[nome]"/>
+ <text name="classified_location" value="[caricando...]"/>
+ <text name="content_type" value="[tipo di contenuto]"/>
+ <text name="category" value="[categoria]"/>
+ <check_box label="Auto rinnovo settimanale" name="auto_renew"/>
+ <text name="price_for_listing" tool_tip="Prezzo di listino.">
+ L$[PREZZO]
+ </text>
+ <text name="classified_desc" value="[descrizione]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Mappa" name="show_on_map_btn"/>
+ <button label="Modifica" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
new file mode 100644
index 0000000000..652bef0430
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Click to choose a picture"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_classified.xml b/indra/newview/skins/default/xui/it/panel_edit_classified.xml
new file mode 100644
index 0000000000..81ef121dd8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_classified.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modifica gli Annunci" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (sarà aggiornato dopo il salvataggio)
+ </panel.string>
+ <text name="title">
+ Modifica gli Annunci
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ <text name="Name:">
+ Titolo:
+ </text>
+ <text name="description_label">
+ Descrizione:
+ </text>
+ <text name="location_label">
+ Luogo:
+ </text>
+ <text name="classified_location">
+ caricando...
+ </text>
+ <button label="Imposta sul luogo attuale" name="set_to_curr_location_btn"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Fissare il Prezzo." value="50"/>
+ <check_box label="Auto-rinnovo settimanale" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Salva" name="save_changes_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_eyes.xml b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml
new file mode 100644
index 0000000000..3b1e51e759
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Occhi"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
new file mode 100644
index 0000000000..2a80d6df3d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Guanti"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_hair.xml b/indra/newview/skins/default/xui/it/panel_edit_hair.xml
new file mode 100644
index 0000000000..137a5cabeb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Colore"/>
+ <accordion_tab name="hair_style_tab" title="Stile"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sopracciglia"/>
+ <accordion_tab name="hair_facial_tab" title="Facciale"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
new file mode 100644
index 0000000000..43c825ff73
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tessuto superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Giacca"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
new file mode 100644
index 0000000000..cbab711fb1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantaloni"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
new file mode 100644
index 0000000000..7f2e82e4ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modifica scelta ????" name="panel_edit_pick">
+ <text name="title">
+ Modifica scelta ????
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ <text name="Name:">
+ Titolo:
+ </text>
+ <text name="description_label">
+ Descrizione:
+ </text>
+ <text name="location_label">
+ Luogo:
+ </text>
+ <text name="pick_location">
+ caricando...
+ </text>
+ <button label="Imposta come luogo attuale" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Salva [WHAT]" name="save_changes_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 0eba7bf3b6..b9779c77b5 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -1,45 +1,48 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Residente" />
- <string name="AcctTypeTrial"
- value="Prova" />
- <string name="AcctTypeCharterMember"
- value="Membro privilegiato" />
- <string name="AcctTypeEmployee"
- value="Impiegato della Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Info. di pagamento usate" />
- <string name="PaymentInfoOnFile"
- value="Info. di pagamento in archivio" />
- <string name="NoPaymentInfoOnFile"
- value="Nessuna info. di pagamento" />
- <string name="AgeVerified"
- value="Età verificata" />
- <string name="NotAgeVerified"
- value="Età non verificata" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=it
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Risposta agli IM quando sono in &apos;Occupato&apos;:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Modifica del profilo" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([ETA&apos;])
+ </string>
+ <string name="AcctTypeResident" value="Residente"/>
+ <string name="AcctTypeTrial" value="Prova"/>
+ <string name="AcctTypeCharterMember" value="Membro privilegiato"/>
+ <string name="AcctTypeEmployee" value="Impiegato della Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Info. di pagamento usate"/>
+ <string name="PaymentInfoOnFile" value="Info. di pagamento in archivio"/>
+ <string name="NoPaymentInfoOnFile" value="Nessuna info. di pagamento"/>
+ <string name="AgeVerified" value="Età verificata"/>
+ <string name="NotAgeVerified" value="Età non verificata"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=it
+ </string>
+ <string name="no_partner_text" value="Nessuno"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Mondo Reale:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ <text name="title_homepage_text">
+ Homepage:
+ </text>
+ <check_box label="Mostrami nei risultati della ricerca" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Mio Account:"/>
+ <text name="my_account_link" value="[[URL] Vai al mio pannello personale]"/>
+ <text name="acc_status_text" value="Residente. No payment info on file."/>
+ <text name="title_partner_text" value="Mio Partner:"/>
+ <text name="partner_edit_link" value="[[URL] Modifica]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Salva le modifiche" name="save_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shape.xml b/indra/newview/skins/default/xui/it/panel_edit_shape.xml
new file mode 100644
index 0000000000..f22b393ecd
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Sesso:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Femminile" name="radio"/>
+ <radio_item label="Maschile" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corpo"/>
+ <accordion_tab name="shape_head_tab" title="Testa"/>
+ <accordion_tab name="shape_eyes_tab" title="Occhi"/>
+ <accordion_tab name="shape_ears_tab" title="Orecchie"/>
+ <accordion_tab name="shape_nose_tab" title="Naso"/>
+ <accordion_tab name="shape_mouth_tab" title="Bocca"/>
+ <accordion_tab name="shape_chin_tab" title="Mento"/>
+ <accordion_tab name="shape_torso_tab" title="Busto"/>
+ <accordion_tab name="shape_legs_tab" title="Gambe"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
new file mode 100644
index 0000000000..5d902ae40b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camicia"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
new file mode 100644
index 0000000000..bd1fa5b16d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Scarpe"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skin.xml b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
new file mode 100644
index 0000000000..2fa76d4afc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuaggi Testa" name="Head Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Colore della pelle"/>
+ <accordion_tab name="skin_face_tab" title="Dettagli del Viso"/>
+ <accordion_tab name="skin_makeup_tab" title="Trucco"/>
+ <accordion_tab name="skin_body_tab" title="Dettagli del Corpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
new file mode 100644
index 0000000000..e036fff67e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Gonna"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
new file mode 100644
index 0000000000..1d1eb4bd3a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Calze"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..5435a28ff9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatuaggio sulla testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una foto"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
new file mode 100644
index 0000000000..ca2ba3ca01
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Slip"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..cf44dad464
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Maglietta intima"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
new file mode 100644
index 0000000000..baf585dad0
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Indossabile" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Modifica la Shape
+ </string>
+ <string name="edit_skin_title">
+ Modifica la Skin
+ </string>
+ <string name="edit_hair_title">
+ Modifica capelli
+ </string>
+ <string name="edit_eyes_title">
+ Modifica occhi
+ </string>
+ <string name="edit_shirt_title">
+ Modifica camicia
+ </string>
+ <string name="edit_pants_title">
+ Modifica pantaloni
+ </string>
+ <string name="edit_shoes_title">
+ Modifica scarpe
+ </string>
+ <string name="edit_socks_title">
+ Modifica calze
+ </string>
+ <string name="edit_jacket_title">
+ Modifica Giacca
+ </string>
+ <string name="edit_skirt_title">
+ Modifica gonna
+ </string>
+ <string name="edit_gloves_title">
+ Modifica guanti
+ </string>
+ <string name="edit_undershirt_title">
+ Modifica maglietta intima
+ </string>
+ <string name="edit_underpants_title">
+ Modifica slip
+ </string>
+ <string name="edit_alpha_title">
+ Modifica Alpha Mask
+ </string>
+ <string name="edit_tattoo_title">
+ Modifica tatuaggio
+ </string>
+ <string name="shape_desc_text">
+ Shape:
+ </string>
+ <string name="skin_desc_text">
+ Skin:
+ </string>
+ <string name="hair_desc_text">
+ Capelli:
+ </string>
+ <string name="eyes_desc_text">
+ Occhi:
+ </string>
+ <string name="shirt_desc_text">
+ Camicia:
+ </string>
+ <string name="pants_desc_text">
+ Pantaloni:
+ </string>
+ <string name="shoes_desc_text">
+ Scarpe:
+ </string>
+ <string name="socks_desc_text">
+ Calze:
+ </string>
+ <string name="jacket_desc_text">
+ Giacca:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Giacca:
+ </string>
+ <string name="gloves_desc_text">
+ Guanti:
+ </string>
+ <string name="undershirt_desc_text">
+ Maglietta intima:
+ </string>
+ <string name="underpants_desc_text">
+ Slip:
+ </string>
+ <string name="alpha_desc_text">
+ Alpha Mask
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuaggio:
+ </string>
+ <text name="edit_wearable_title" value="Modifica Shape"/>
+ <panel label="Camicia" name="wearable_type_panel">
+ <text name="description_text" value="Shape:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Salva con nome" name="save_as_button"/>
+ <button label="Ripristina" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_friends.xml b/indra/newview/skins/default/xui/it/panel_friends.xml
index e2eb3dd6e7..a3a985f5aa 100644
--- a/indra/newview/skins/default/xui/it/panel_friends.xml
+++ b/indra/newview/skins/default/xui/it/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Amici multipli...
+ Amici multipli
</string>
<scroll_list name="friend_list" tool_tip="Tieni premuto shift o control mentre clicchi per selezionare più di un amico">
<column name="icon_online_status" tool_tip="Stato Online"/>
@@ -13,8 +13,8 @@
</scroll_list>
<button label="IM/Chiama" name="im_btn" tool_tip="Apri una sessione di IM - Messaggio Privato"/>
<button label="Profilo" name="profile_btn" tool_tip="Mostra foto, gruppi, ed altre informazioni"/>
- <button label="Teleport..." name="offer_teleport_btn" tool_tip="Offri a questo amico un teleport per dove sei tu ora"/>
- <button label="Paga..." name="pay_btn" tool_tip="Dai Linden dollar (L$) a questo amico"/>
- <button label="Rimuovi..." name="remove_btn" tool_tip="Rimuovi questa persona dalla tua lista amici"/>
- <button label="Aggiungi..." name="add_btn" tool_tip="Offri amicizia ad un residente"/>
+ <button label="Teleport" name="offer_teleport_btn" tool_tip="Offri a questo amico un teleport per dove sei tu ora"/>
+ <button label="Paga" name="pay_btn" tool_tip="Dai Linden dollar (L$) a questo amico"/>
+ <button label="Rimuovi" name="remove_btn" tool_tip="Rimuovi questa persona dalla tua lista amici"/>
+ <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia ad un residente"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
new file mode 100644
index 0000000000..c2bceaeef6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <button label="Profilo del Gruppo" name="group_info_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Chiama Gruppo" name="call_btn"/>
+ <button label="Chiudi Chiamata" name="end_call_btn"/>
+ <button label="Apri Controlli Voice" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_general.xml b/indra/newview/skins/default/xui/it/panel_group_general.xml
index 2bc4d82082..0ca1ce2064 100644
--- a/indra/newview/skins/default/xui/it/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_general.xml
@@ -1,72 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Generale" name="general_tab">
- <string name="help_text">
- Il pannello &apos;Generale&apos; contiene informazioni generali riguardanti il gruppo, un elenco dei proprietari e i membri visibili, le preferenze generali di gruppo e le opzioni dei membri.
+ <panel.string name="help_text">
+ La tabella generale contiene informazioni generali su questo gruppo, lista dei membri, preferenze generali del gruppo e opzioni dei membri.
-Passa il mouse sulle opzioni per un aiuto aggiuntivo.
- </string>
- <string name="group_info_unchanged">
- Le informazioni generali del gruppo sono cambiate.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Scrivi il nome del nuovo gruppo qui" name="group_name_editor"/>
- <text name="group_name">
- Scrivi il nome del nuovo gruppo qui
- </text>
- <text name="prepend_founded_by">
- Fondato da
- </text>
- <text name="founder_name">
- (attendi)
- </text>
- <text name="group_charter_label">
- Statuto del gruppo
- </text>
- <texture_picker label="Immagine del gruppo" name="insignia" tool_tip="Clicca per scegliere una immagine"/>
+Muovi il tuo mouse sopra le opzioni per maggior aiuto.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Le informazioni generali sul gruppo sono cambiate
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Rilevando i dati dei membri
+ </panel.string>
<text_editor name="charter">
Statuto del gruppo
</text_editor>
- <button label="Unisciti (0 L$)" label_selected="Unisciti (0 L$)" name="join_button"/>
- <button label="Visualizza dettagli" label_selected="Visualizza dettagli" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Proprietari &amp; Membri visibili
- </text>
- <text name="text_owners_are_shown_in_bold">
- (I proprietari sono scritti in neretto)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nome del membro" name="name"/>
+ <name_list.columns label="Membro" name="name"/>
<name_list.columns label="Titolo" name="title"/>
- <name_list.columns label="Ultimo login" name="online"/>
</name_list>
- <text name="text_group_preferences">
- Preferenze di gruppo
+ <text name="active_title_label">
+ Mio Titolo
</text>
+ <combo_box name="active_title" tool_tip="Imposta il titolo nella tag del tuo avatar quando questo gruppo è attivo."/>
+ <check_box label="Ricevi notice dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere Notice da questo. De-seleziona questa casella se il gruppo ti manda spam."/>
+ <check_box label="Mostra nel mio Profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi mostrare questo gruppo nel tuo profilo"/>
<panel name="preferences_container">
- <check_box label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Lascia che i residenti vedano questo gruppo nella ricerca."/>
- <check_box label="Iscrizione libera" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di unirsi senza essere invitati."/>
- <check_box label="Tassa di iscrizione:" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa di iscrizione per unirsi al gruppo."/>
- <spinner width="60" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi membri devono pagare questa tassa per unirsi al gruppo. La tassa di iscrizione è selezionata."/>
+ <check_box label="Iscrizione libera" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/>
+ <check_box label="Tassa d&apos;iscrizione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d&apos;iscrizione per aderire al gruppo"/>
+ <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi membri devono pagare questa tassa d&apos;iscrizione quando tassa d&apos;iscrizione è selezionata." width="60"/>
<combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi Mature.">
- <combo_box.item name="select_mature" label="- Seleziona -"/>
- <combo_box.item name="mature" label="Contenuto Mature"/>
- <combo_box.item name="pg" label="Contenuto PG"/>
+ <combo_box.item label="Contenuto PG" name="pg"/>
+ <combo_box.item label="Contenuto Mature" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Il mio titolo attivo
- </text>
- <combo_box name="active_title" tool_tip="Imposta il titolo che appare sulla testa del tuo avatar quando il gruppo è attivo."/>
- </panel>
- <check_box label="Ricevi avvisi dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere avvisi da questo gruppo. Togli la spunta da questa casella se questo gruppo ti sta spammando."/>
- <check_box label="Elenca il gruppo nel mio profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi elencare questo gruppo nel tuo profilo"/>
+ <check_box initial_value="true" label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Permetti alle persone di vedere questo gruppo nei risultati del Cerca"/>
</panel>
- <string name="incomplete_member_data_str">
- Rilevando i dati dei membri
- </string>
- <string name="confirm_group_create_str">
- Creare questo gruppo ti costerà 100 L$.
-Sei davvero, davvero, DAVVERO sicuro che vuoi spendere 100 L$ per creare questo gruppo?
-Fai attenzione che se nessun altro viene unito al gruppo entro 48 ore, questo gruppo verrà dismesso e il nome del gruppo non sarà più disponibile in futuro.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..26255943ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Informazioni sul gruppo" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Ci sono variazioni non salvate nella tabella attuale
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Vuoi salvare queste variazioni?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Aderisci (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Gratis
+ </panel.string>
+ <text name="group_name" value="(Caricando...)"/>
+ <line_editor label="Scrivi qui il nuovo nome del tuo gruppo" name="group_name_editor"/>
+ <texture_picker label="" name="insignia" tool_tip="Clicca per scegliere uan fotografia"/>
+ <text name="prepend_founded_by">
+ Fondatore:
+ </text>
+ <name_box initial_value="(recuperando)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="ADERISCI ORA!" name="btn_join"/>
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Generale"/>
+ <accordion_tab name="group_roles_tab" title="Ruoli"/>
+ <accordion_tab name="group_notices_tab" title="Notice"/>
+ <accordion_tab name="group_land_tab" title="Terra/Beni ?????"/>
+ </accordion>
+ <panel name="button_row">
+ <button label="Crea" label_selected="Nuovo gruppo" name="btn_create"/>
+ <button label="Salva" label_selected="Salva" name="btn_apply"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_invite.xml b/indra/newview/skins/default/xui/it/panel_group_invite.xml
index cc426f7cd2..643d6b05fd 100644
--- a/indra/newview/skins/default/xui/it/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_invite.xml
@@ -1,23 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Invita una persona" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Sei sicuro di voler invitare nuovi capogruppo? Questa azione è irrevocabile!
+ </panel.string>
+ <panel.string name="loading">
+ (Attendi...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Alcuni avatars sono già nel gruppo e non erano stati invitati.
+ </panel.string>
<text name="help_text">
Puoi selezionare più di un residente
da invitare nel tuo gruppo. Clicca su
&apos;Scelta residenti&apos; per iniziare.
</text>
<button label="Scelta residenti" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Tieni premuto il tasto ctrl e clicca i nomi dei residenti per avere una selezione multipla."/>
- <button label="Rimuovi i selezionati dall&apos;elenco" name="remove_button" tool_tip="Rimuove i residenti qui sopra selezionati, dall&apos;elenco degli inviti."/>
+ <name_list name="invitee_list" tool_tip="Tieni premuto il tasto Ctrl e clicca il nome dei residenti per una multi-selezione"/>
+ <button label="Rimuovi i selezionati dall&apos;elenco" name="remove_button" tool_tip="Rimuovi i residenti selezionati dalla lista invito"/>
<text name="role_text">
Scegli che ruolo assegnare loro:
</text>
- <combo_box name="role_name" tool_tip="Scegli dall&apos;elenco dei ruoli che tu sei abilitato ad assegnare."/>
+ <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/>
<button label="Manda gli inviti" name="ok_button"/>
<button label="Annulla" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Sei sicuro di voler invitare nuovi capogruppo? Questa azione è irrevocabile!
- </string>
- <string name="loading">
- (Attendi...)
+ <string name="GroupInvitation">
+ Invito del Gruppo
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
index 3e6684ed06..a532e7a575 100644
--- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terra &amp; L$" name="land_money_tab">
<string name="help_text">
- I terreni di proprietà del gruppo sono elencati insieme ai dettagli delle contribuzioni. Un avviso viene visualizzato se la superficie totale in uso è inferiore o pari al totale delle contribuzioni. Le schede: Pianificazione, Dettagli e Vendite forniscono informazioni sulle finanze del gruppo.
+ Appare un avviso fino a quando la Terra Totale in Uso è meno o = alla Contribuzione Totale.
</string>
<button label="?" name="help_button"/>
<string name="cant_view_group_land_text">
- Non hai i permessi necessari per visualizzare la terra posseduta dal gruppo.
+ Non hai i permessi per vedere la terra posseduta dal gruppo
</string>
<string name="cant_view_group_accounting_text">
- Non hai i permessi necessari per visualizzare i movimenti finanziari del gruppo.
+ Non hai i permessi per vedere le informazioni sulla contabilità del gruppo.
</string>
<string name="loading_txt">
Attendi...
@@ -17,14 +17,14 @@
Terra posseduta dal gruppo
</text>
<scroll_list name="group_parcel_list">
- <column label="Nome dell&apos;appezzamento" name="name"/>
+ <column label="Parcel" name="name"/>
<column label="Regione" name="location"/>
<column label="Tipo" name="type"/>
<column label="Area" name="area"/>
</scroll_list>
- <button label="Mostra sulla mappa" label_selected="Mostra sulla mappa" name="map_button" left="282" width="130"/>
+ <button label="Mappa" label_selected="Mappa" left="282" name="map_button" width="130"/>
<text name="total_contributed_land_label">
- Total Contribution:
+ Contribuzione Totale:
</text>
<text name="total_contributed_land_value">
[AREA] m²
@@ -36,49 +36,48 @@
[AREA] m²
</text>
<text name="land_available_label">
- Terra disponibile:
+ Terreno disponibile:
</text>
<text name="land_available_value">
[AREA] m²
</text>
<text name="your_contribution_label">
- Il tuo contributo:
+ La tua contribuzione:
</text>
<string name="land_contrib_error">
- Non è possibile impostare i tuoi contributi in terra.
+ Incapace di impostare la tua contribuzione di terreno
</string>
<text name="your_contribution_units">
- ( m² )
+ m²
</text>
<text name="your_contribution_max_value">
- ([AMOUNT] massimo)
+ ([IMPORTO] max)
</text>
<text name="group_over_limit_text">
- I membri del gruppo devono contribuire con più crediti per mantenere
-la quantità  di terra in uso.
+ Sono necessari maggiori crediti di terreno per mantenere la terra in uso
</text>
<text name="group_money_heading">
L$ del gruppo
</text>
<tab_container name="group_money_tab_container">
- <panel label="Pianificazione" name="group_money_planning_tab">
+ <panel label="PIANIFICAZIONE" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Conteggio...
+ Caricando...
</text_editor>
</panel>
- <panel label="Dettagli" name="group_money_details_tab">
+ <panel label="DETTAGLI" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Calcolo...
+ Caricando...
</text_editor>
- <button width="90" label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_details_button" tool_tip="Vai ai dettagli precedenti"/>
- <button left_delta="260" width="90" label="Successivo &gt;" label_selected="Successivo &gt;" name="later_details_button" tool_tip="Vai ai dettagli successivi"/>
+ <button label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_details_button" tool_tip="Indietro" width="90"/>
+ <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_details_button" tool_tip="Prossimo" width="90"/>
</panel>
- <panel label="Vendite" name="group_money_sales_tab">
+ <panel label="VENDITE" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Calcolo...
+ Caricando...
</text_editor>
- <button width="90" label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_sales_button" tool_tip="Vai ai dettagli precedenti"/>
- <button left_delta="260" width="90" label="Successivo &gt;" label_selected="Successivo &gt;" name="later_sales_button" tool_tip="Vai ai dettagli successivi"/>
+ <button label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_sales_button" tool_tip="Indietro" width="90"/>
+ <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_sales_button" tool_tip="Prossimo" width="90"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_list_item.xml b/indra/newview/skins/default/xui/it/panel_group_list_item.xml
new file mode 100644
index 0000000000..3e5419d1bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_group_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Sconosciuto"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml
index c6ef84e220..dbeb9d56ff 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml
@@ -1,58 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Notice" name="notices_tab">
- <string name="help_text">
+ <panel.string name="help_text">
Le notice sono un modo veloce per comunicare in un gruppo diffondendo un messaggio e recapitando un eventuale oggetto allegato. Le notice arrivano solo ai membri del gruppo il cui ruolo è abilitato a riceverli.
Puoi disattivare la ricezione delle notice nella finestra principale.
- </string>
- <string name="no_notices_text">
- Non ci sono vecchie notice.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Archivio delle notice del gruppo
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Non ci sono vecchie Notice
+ </panel.string>
<text name="lbl2">
- Le notice sono conservate per 14 giorni. Il numero delle notice è limitato a 200 notice per gruppo al giorno.
+ Le Notice sono conservate per 14 giorni.
+Massimo 200 per gruppo al giorno
</text>
<scroll_list name="notice_list">
- <column label="Oggetto" name="subject"/>
- <column label="Da" name="from"/>
- <column label="Data" name="date"/>
+ <scroll_list.columns label="Oggetto" name="subject"/>
+ <scroll_list.columns label="Da" name="from"/>
+ <scroll_list.columns label="Data" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Nessuna notice trovata.
+ Nessuna trovata
</text>
- <button label="Crea una nuova notice" label_selected="Crea una nuova notice" name="create_new_notice"/>
- <button label="Aggiorna" label_selected="Aggiorna l&apos;elenco" name="refresh_notices"/>
+ <button label="Crea una nuova notice" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea una nuova notice"/>
+ <button label="Aggiorna" label_selected="Aggiorna l&apos;elenco" name="refresh_notices" tool_tip="Aggiorna la lista delle notice"/>
<panel label="Crea una nuova notice" name="panel_create_new_notice">
<text name="lbl">
Crea una notice
</text>
- <text name="lbl2">
- Puoi aggiungere un solo allegato alla notice trascinandolo dal tuo inventario in questa finestra. L&apos;allegato deve essere copiabile e cedibile, e non puoi allegare una cartella.
- </text>
- <text name="lbl3" left="20">
+ <text left="20" name="lbl3">
Oggetto:
</text>
- <line_editor name="create_subject" width="251" left_delta="61"/>
- <text name="lbl4" left="15" width="60">
+ <line_editor left_delta="61" name="create_subject" width="251"/>
+ <text left="15" name="lbl4" width="60">
Messaggio:
</text>
- <text_editor name="create_message" left_delta="66" width="330"/>
+ <text_editor left_delta="66" name="create_message" width="330"/>
<text name="lbl5" width="68">
Allega:
</text>
- <line_editor name="create_inventory_name" width="190" left_delta="74"/>
- <button label="Rimuovi allegato" label_selected="Rimuovi allegato" name="remove_attachment"/>
- <button label="Invia" label_selected="Invia" name="send_notice"/>
- <panel name="drop_target" tool_tip="Trascina un oggetto dall&apos;inventario sulla casella del messaggio per inviarlo con la notice. Devi avere il permesso di copia e trasferimento dell&apos;oggetto per poterlo inviare con la notice."/>
+ <line_editor left_delta="74" name="create_inventory_name" width="190"/>
+ <text name="string">
+ Trascina e rilascia qui l&apos;oggetto da allegare:
+ </text>
+ <button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment"/>
+ <button label="Spedisci" label_selected="Spedisci" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall&apos;inventario nello spazio ALLEGA per spedirlo con la notice. Devi avere i permessi copy e transfer relativi all&apos;oggetto da allegare."/>
</panel>
<panel label="Vedi le notice precedenti" name="panel_view_past_notice">
<text name="lbl">
Notice archiviate
</text>
<text name="lbl2">
- Per mandare una nuova notice, clicca &apos;Crea una nuova notice&apos; qui sopra.
+ Per spedire una nuova notice, clicca il bottone +
</text>
<text name="lbl3">
Oggetto:
@@ -60,6 +57,6 @@ Puoi disattivare la ricezione delle notice nella finestra principale.
<text name="lbl4">
Messaggio:
</text>
- <button label="Apri l&apos;allegato" label_selected="Apri l&apos;allegato" name="open_attachment"/>
+ <button label="Apri allegato" label_selected="Apri l&apos;allegato" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_notify.xml b/indra/newview/skins/default/xui/it/panel_group_notify.xml
new file mode 100644
index 0000000000..de6b139793
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Nome di chi spedisce / Nome del Gruppo"/>
+ </panel>
+ <text name="attachment" value="Attachment"/>
+ <button label="Ok" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml
index 8dfdd5a46e..bc98fdacaf 100644
--- a/indra/newview/skins/default/xui/it/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml
@@ -1,103 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membri &amp; Ruoli" name="roles_tab">
- <string name="default_needs_apply_text">
- Ci sono modifiche non applicate nella scheda attuale.
- </string>
- <string name="want_apply_text">
- Vuoi applicare questi cambiamenti?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Membri &amp; Ruoli
- </text>
- <text name="static2">
- I membri del Gruppo hanno ricevuto ruoli con delle abilità. Queste
-impostazioni possono essere facilmente personalizzate, permettendo
-una maggiore organizzazione e flessibilità.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Ruoli
- </text>
- <text name="role_properties_modifiable">
- Seleziona un ruolo qui sotto. È possibile modificarne il nome,
-la descrizione e il titolo.
- </text>
- <text name="role_properties_not_modifiable">
- Seleziona un ruolo qui sotto per vederne le proprietà, i membri
-e i permessi abilitati.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- Puoi anche assegnare abilità al ruolo.
- </text>
- <text name="role_actions_not_modifiable">
- Puoi vedere, ma non modificare, le abilità assegnate.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Abilità
- </text>
- <text name="static2">
- Puoi vedere la descrizione delle abilità e quali ruoli e membri possono
-eseguire tali abilità.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ Ci sono modifiche non salvate nella scheda attuale
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Vuoi salvare queste modifiche?
+ </panel.string>
<tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Membri" name="members_sub_tab" tool_tip="Membri">
- <line_editor bottom="127" name="search_text"/>
- <button label="Cerca" name="search_button" width="75"/>
- <button label="Mostra tutti" name="show_all_button" left_delta="80"/>
- <name_list name="member_list" bottom_delta="-105" height="104" >
- <column label="Nome del membro" name="name"/>
- <column label="Contributo donato" name="donated"/>
- <column label="Ultimo accesso" name="online"/>
- </name_list>
- <button label="Invita un nuovo membro..." name="member_invite" width="165"/>
- <button label="Espellere dal gruppo" name="member_eject"/>
- <string name="help_text">
+ <panel height="148" label="MEMBRI" name="members_sub_tab" tool_tip="Membri">
+ <panel.string name="help_text">
Puoi aggiungere o rimuovere i ruoli assegnati ai membri.
Seleziona più membri tenendo premuto il tasto Ctrl e
cliccando sui loro nomi.
- </string>
+ </panel.string>
+ <filter_editor label="Filtra Membri" name="filter_input"/>
+ <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list.columns label="Nome del Membro" name="name"/>
+ <name_list.columns label="Donazioni" name="donated"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Invita" name="member_invite" width="165"/>
+ <button label="Espelli" name="member_eject"/>
</panel>
- <panel height="148" label="Ruoli" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Cerca" name="search_button" width="75"/>
- <button label="Mostra tutti" name="show_all_button" left_delta="80"/>
- <scroll_list name="role_list" bottom_delta="-104" height="104">
- <column label="Nome del ruolo" name="name"/>
- <column label="Titolo" name="title"/>
- <column label="Membri" name="members"/>
+ <panel height="148" label="RUOLI" name="roles_sub_tab">
+ <panel.string name="help_text">
+ I ruoli hanno un titolo con un elenco di abilità permesse che i membri possono eseguire.
+ I membri possono avere uno o più ruoli. Un gruppo può avere fino a 10 ruoli, inclusi il ruolo base o &quot;Membro&quot; e
+ il ruolo del Capogruppo.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ I Ruoli &apos;Everyone&apos; e &apos;Owners&apos; sono speciali e non possono essere cancellati.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Cartella Inventario chiusa
+ </panel.string>
+ <filter_editor label="Filtra i ruoli" name="filter_input"/>
+ <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list.columns label="Ruolo" name="name"/>
+ <scroll_list.columns label="Titolo" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Crea un nuovo ruolo..." name="role_create"/>
+ <button label="Crea nuovo ruolo" name="role_create"/>
<button label="Elimina ruolo" name="role_delete"/>
- <string name="help_text">
- I ruoli hanno un titolo e un elenco di abilità permesse
-che i membri possono eseguire. I membri possono appartenere a
-uno o più ruoli. Un gruppo può avere fino a 10 ruoli,
-compresi il ruolo base o &apos;Membro&apos; e il ruolo del Capogruppo.
- </string>
- <string name="cant_delete_role">
- I ruoli &apos;Membro&apos; e &apos;Capogruppo&apos; sono ruoli speciali e non possono essere eliminati.
- </string>
</panel>
- <panel height="148" label="Abilità" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Cerca" name="search_button" width="75"/>
- <button label="Visualizza tutto" name="show_all_button" left_delta="80"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Seleziona una abilità per vederne maggiori dettagli."/>
- <string name="help_text">
+ <panel height="148" label="ABILITA&apos;" name="actions_sub_tab" tool_tip="Puoi vedere la descrizione dell&apos;abilità e quali Ruoli o Membri possono eseguirla.">
+ <panel.string name="help_text">
Le abilità permettono ai membri nei ruoli di fare cose specifiche
in questo gruppo. C&apos;è una vasta gamma di abilità.
- </string>
+ </panel.string>
+ <filter_editor label="Filtra Abilità" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Seleziona un&apos;abilità per vedere maggiori dettagli."/>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
- Ruoli assegnati
+ Membri assegnati
</text>
<text name="static2">
Abilità permesse
@@ -106,44 +63,44 @@ in questo gruppo. C&apos;è una vasta gamma di abilità.
</panel>
<panel name="roles_footer">
<text name="static">
- Nome
- </text>
- <text name="static2">
- Descrizione
+ Nome del Ruolo
</text>
<line_editor name="role_name">
Addetti
</line_editor>
<text name="static3">
- Titolo
+ Titolo del Ruolo
</text>
<line_editor name="role_title">
(attendi)
</line_editor>
+ <text name="static2">
+ Descrizione
+ </text>
<text_editor name="role_description">
(attendi)
</text_editor>
<text name="static4">
- Membri assegnati
+ Ruoli assegnati
</text>
+ <check_box label="Mostrare i membri" name="role_visible_in_list" tool_tip="Imposta nella tabella Generale per i membri con questo ruolo di poter essere visti dalle persone esterne a questo gruppo."/>
<text name="static5" tool_tip="Una lista delle abilità che il ruolo ora selezionato può eseguire.">
Abilità permesse
</text>
- <check_box label="I membri sono visibili" name="role_visible_in_list" tool_tip="Serve ad impostare se i membri di questo ruolo sono visibili nel pannello generale ai residenti al di fuori del gruppo."/>
<scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi il pannello abilità."/>
</panel>
<panel name="actions_footer">
<text name="static">
- Descrizione
+ Descrizione abilità
</text>
<text_editor name="action_description">
Questa abilità è &apos;Espelli i membri dal gruppo&apos;. Solo un Capogruppo puo espellere un&apos;altro Capogruppo.
</text_editor>
<text name="static2">
- Ruoli con abilità
+ Ruoli con questa abilità
</text>
<text name="static3">
- Membri con abilità
+ Membri con questa abilità
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
new file mode 100644
index 0000000000..f6c3fa9288
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Sconosciuto"/>
+ <button label="Profilo" name="view_profile_btn"/>
+ <button label="Aggiungi Amico" name="add_friend_btn"/>
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Condividi" name="share_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Chiama" name="call_btn"/>
+ <button label="Abbandona chiamata" name="end_call_btn"/>
+ <button label="Controllo Voice" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_landmark_info.xml b/indra/newview/skins/default/xui/it/panel_landmark_info.xml
new file mode 100644
index 0000000000..5908a873cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_landmark_info.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Crea Landmark"/>
+ <string name="title_edit_landmark" value="Modifica Landmark"/>
+ <string name="title_landmark" value="Landmark"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(sconosciuto)"/>
+ <string name="public" value="(pubblico)"/>
+ <string name="server_update_text">
+ Info sul luogo non disponibili senza l&apos;aggiornamento del server.
+ </string>
+ <string name="server_error_text">
+ Info su questo luogo non disponibili ora, prova più tardi.
+ </string>
+ <string name="server_forbidden_text">
+ Info su questo luogo non disponibili a causa delle restrizioni di accesso. Controlla i tuoi permessi con il proprietario del terreno .
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Colloca Profilo"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="sconosciuto"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Proprietario:"/>
+ <text name="creator_label" value="Creatore:"/>
+ <text name="created_label" value="Creato:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Titolo:"/>
+ <text name="notes_label" value="Mie note:"/>
+ <text name="folder_label" value="Landmark del luogo:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_landmarks.xml b/indra/newview/skins/default/xui/it/panel_landmarks.xml
new file mode 100644
index 0000000000..0efeaac97d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barra dei Preferiti"/>
+ <accordion_tab name="tab_landmarks" title="Landmarks"/>
+ <accordion_tab name="tab_inventory" title="Mio Inventario"/>
+ <accordion_tab name="tab_library" title="Libreria"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ <button name="add_btn" tool_tip="Aggiungi nuovo landmark"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi landmark selezionato"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 1782089039..7706a044fa 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,39 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
- <text name="first_name_text" left="20">
- Nome:
- </text>
- <line_editor left="20" name="first_name_edit" width="126" />
- <text name="last_name_text" left="158">
- Cognome:
- </text>
- <line_editor left="158" name="last_name_edit" width="126" />
- <text name="password_text">
- Password:
- </text>
- <text name="start_location_text" left="20" width="105">
- Punto di partenza:
- </text>
- <combo_box name="start_location_combo" left_delta="105" width="160">
- <combo_box.item name="MyHome" label="Casa Mia" />
- <combo_box.item name="MyLastLocation" label="Ultimo luogo visitato" />
- <combo_box.item name="Typeregionname" label="&lt;Scrivi la regione&gt;" />
- </combo_box>
- <check_box label="Ricorda password" name="remember_check" left_delta="168"/>
- <button label="Log In" label_selected="Log In" name="connect_btn"/>
- <text name="create_new_account_text">
- Registra un account
- </text>
- <text name="forgot_password_text" left="-240" width="230">
- Hai dimenticato il tuo nome o la password?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=it
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Nome:
+ </text>
+ <line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <line_editor label="Cognome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <check_box label="Ricordare" name="remember_check"/>
+ <text name="start_location_text">
+ Iniziare presso:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Casa mia" name="MyHome"/>
+ </combo_box>
+ <button label="Log In" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Aderire
+ </text>
+ <text name="login_help">
+ Aiuto quando log in?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_main_inventory.xml b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
new file mode 100644
index 0000000000..edaab6e60c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cose" name="main inventory panel">
+ <panel.string name="Title">
+ Cose
+ </panel.string>
+ <filter_editor label="Filtro" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Tutti gli elementi" name="All Items"/>
+ <inventory_panel label="Elementi recenti" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;elemento selezionato"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="File" name="File">
+ <menu_item_call label="Apri" name="Open"/>
+ <menu label="Carica nel server" name="upload">
+ <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
+ <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
+ <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nuova Finestra" name="New Window"/>
+ <menu_item_call label="Mostra Filtri" name="Show Filters"/>
+ <menu_item_call label="Cancella Filtri" name="Reset Current"/>
+ <menu_item_call label="Chiudi tutte le Cartelle" name="Close All Folders"/>
+ <menu_item_call label="Svuota Cestino" name="Empty Trash"/>
+ <menu_item_call label="Svuota Oggetti Smarriti" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Crea" name="Create">
+ <menu_item_call label="Nuova Cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo Script" name="New Script"/>
+ <menu_item_call label="Nuova Notecard" name="New Note"/>
+ <menu_item_call label="Nuova Gesture" name="New Gesture"/>
+ <menu label="Nuovi Abiti" name="New Clothes">
+ <menu_item_call label="Nuova Camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove Calze" name="New Socks"/>
+ <menu_item_call label="Nuova Giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova Gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi Slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuove Parti del Corpo" name="New Body Parts">
+ <menu_item_call label="Nuova Shape" name="New Shape"/>
+ <menu_item_call label="Nuova Pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi Capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Ordina" name="Sort">
+ <menu_item_check label="Per Nome" name="By Name"/>
+ <menu_item_check label="Per Data" name="By Date"/>
+ <menu_item_check label="Cartelle sempre per Nome" name="Folders Always By Name"/>
+ <menu_item_check label="Cartelle di sistema all&apos;inizio" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_me.xml b/indra/newview/skins/default/xui/it/panel_me.xml
new file mode 100644
index 0000000000..03678ecad5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mio Profilo" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="PROFILO" name="panel_profile"/>
+ <panel label="PREFERITI" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
new file mode 100644
index 0000000000..cb629e5cfb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Generale" name="Media Settings General">
+ <text name="home_label">
+ Home Page:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Questa pagina non passa la lista bianca specifica)
+ </text>
+ <line_editor name="home_url" tool_tip="La home page per questa fonte media"/>
+ <text name="preview_label">
+ Anteprima
+ </text>
+ <text name="current_url_label">
+ Pagina attuale:
+ </text>
+ <text name="current_url" tool_tip="La pagina attuale per questa fonte media" value=""/>
+ <button label="Resetta" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Auto Loop" name="auto_loop"/>
+ <check_box initial_value="false" label="Primo Click Interagisce" name="first_click_interact"/>
+ <check_box initial_value="false" label="Auto Zoom" name="auto_zoom"/>
+ <check_box initial_value="false" label="Auto Play Media" name="auto_play"/>
+ <text name="media_setting_note">
+ Nota: I Residenti possono annullare questa impostazione
+ </text>
+ <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/>
+ <text name="size_label">
+ Misura:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..551d86864d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Personalizza" name="Media settings for controls">
+ <text name="controls_label">
+ Controlli:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_group_control"/>
+ <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_security.xml b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml
new file mode 100644
index 0000000000..0df0331198
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sicurezza" name="Media Settings Security">
+ <check_box initial_value="false" label="Accesso permesso solo a URLs specificati (by prefix)" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Annota che le home page mancate sono segnate:
+ </text>
+ <button label="Aggiungi" name="whitelist_add"/>
+ <button label="Cancella" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Attenzione: la home page specificata nella Tabella General non ha passato questa lista bianca. E&apos; stata disattivata fino a quando non sarà aggiunta un entrata valid.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
new file mode 100644
index 0000000000..60faf4e7c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_my_profile.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profilo" name="panel_profile">
+ <string name="no_partner_text" value="Nessuno"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/>
+ <text name="title_rw_descr_text" value="Mondo Reale:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Homepage:
+ </text>
+ <text name="title_member_text" value="Membro dal:"/>
+ <text name="title_acc_status_text" value="Stato dell&apos;account:"/>
+ <text name="acc_status_text" value="Residente. Nessuna info di pagamento."/>
+ <text name="title_partner_text" value="Partner:"/>
+ <text name="title_groups_text" value="Gruppi:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Aggiungi amico" name="add_friend"/>
+ <button label="IM" name="im"/>
+ <button label="Chiama" name="call"/>
+ <button label="Mappa" name="show_on_map_btn"/>
+ <button label="Teleport" name="teleport"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Modifica Profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
+ <button label="Modifica aspetto" name="edit_appearance_btn" tool_tip="Crea/modifica la tua apparenza: aspetto fisico, vestiti, etc."/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
new file mode 100644
index 0000000000..2e057c2983
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <button name="back_btn" tool_tip="Ritorna al luogo precedente"/>
+ <button name="forward_btn" tool_tip="Vai ad un luogo"/>
+ <button name="home_btn" tool_tip="Teleport a casa mia"/>
+ <location_input label="Luogo" name="location_combo"/>
+ <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
+ <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite">
+ <chevron_button name="&gt;&gt;" tool_tip="Mostra più dei miei Preferiti"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
new file mode 100644
index 0000000000..7ffe972181
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ CHAT NEI DINTORNI
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..0361eb49ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per dire, Ctrl+Invio per gridare"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/Nasconde la chat log nei dintorni"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_notes.xml b/indra/newview/skins/default/xui/it/panel_notes.xml
new file mode 100644
index 0000000000..ff843c1684
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Note &amp; Privacy" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Le mie note private:"/>
+ <text name="status_message2" value="Permetti a questa persona di:"/>
+ <check_box label="Vedermi On-line" name="status_check"/>
+ <check_box label="Vedermi sull mappa" name="map_check"/>
+ <check_box label="Modificare, cancellare o prendere i miei oggetti" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Aggiungi" name="add_friend" tool_tip="Offrire amicizia ad un residente"/>
+ <button label="IM" name="im" tool_tip="Apri una sessione di messaggio istantaneo"/>
+ <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
+ <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
+ <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..9332a3ef36
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <accordion_tab name="tab_cof" title="Vestiario attuale"/>
+ <accordion_tab name="tab_outfits" title="Mio Vestiario"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..c6be942312
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Sostituisci il Vestiario attuale" name="wear"/>
+ <menu_item_call label="Aggiungi al Vestiario attuale" name="add"/>
+ <menu_item_call label="Rimuovi dal Vestiario attuale" name="remove"/>
+ <menu_item_call label="Rinomina" name="rename"/>
+ <menu_item_call label="Rimuovi" name="remove_link"/>
+ <menu_item_call label="Cancella" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
new file mode 100644
index 0000000000..b20db0d565
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Persona" name="people_panel">
+ <string name="no_people" value="Nessuna persona"/>
+ <string name="no_one_near" value="Nessuno vicino"/>
+ <string name="no_friends_online" value="Nessun amico online"/>
+ <string name="no_friends" value="Nessun amico"/>
+ <string name="no_groups" value="Nessun gruppo"/>
+ <string name="people_filter_label" value="Filtro Persone"/>
+ <string name="groups_filter_label" value="Filtro Gruppi"/>
+ <filter_editor label="Filtro" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="NELLE VICINANZE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/>
+ </panel>
+ </panel>
+ <panel label="AMICI" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Tutti"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="add_btn" tool_tip="Offri amicizia ad un residente"/>
+ <button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla tua lista di amici"/>
+ </panel>
+ </panel>
+ <panel label="GRUPPI" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
+ <button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/>
+ </panel>
+ </panel>
+ <panel label="RECENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Profilo" name="view_profile_btn" tool_tip="Mostra foto, gruppi, e info di altri residenti"/>
+ <button label="IM" name="im_btn" tool_tip="Apri sessione instant message"/>
+ <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
+ <button label="Condividi" name="share_btn"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
+ <button label="Profilo del Gruppo" name="group_info_btn" tool_tip="Mostra info del gruppo"/>
+ <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_pick_info.xml b/indra/newview/skins/default/xui/it/panel_pick_info.xml
new file mode 100644
index 0000000000..4771457825
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Scegli Info ????"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[nome]"/>
+ <text name="pick_location" value="[Caricando...]"/>
+ <text name="pick_desc" value="[descrizione]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Mappa" name="show_on_map_btn"/>
+ <button label="Modifica" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_picks.xml b/indra/newview/skins/default/xui/it/panel_picks.xml
new file mode 100644
index 0000000000..bcc433708d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Foto" name="panel_picks">
+ <string name="no_picks" value="Nessuna Foto"/>
+ <string name="no_classifieds" value="Nessun Annuncio"/>
+ <text name="empty_picks_panel_text">
+ Nessuna foto/annuncio qui
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Foto"/>
+ <accordion_tab name="tab_classifieds" title="Annunci"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Crea una nuova foto o annuncio in questo luogo"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Mostra info sulla foto"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport all&apos;area corrispondente"/>
+ <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra l&apos;area corrispondente nella Mappa del Mondo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
new file mode 100644
index 0000000000..70e1577199
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Chiunque"/>
+ <string name="available" value="disponibile"/>
+ <string name="allocated" value="assegnato"/>
+ <string name="title_place" value="Profilo del luogo"/>
+ <string name="title_teleport_history" value="Cronologia dei Teleport"/>
+ <string name="not_available" value="(N\D)"/>
+ <string name="unknown" value="(sconosciuto)"/>
+ <string name="public" value="(publico)"/>
+ <string name="none_text" value="(nessuno)"/>
+ <string name="sale_pending_text" value="(Vendita in attesa di)"/>
+ <string name="group_owned_text" value="(Gruppo posseduto)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Tutti i Residenti"/>
+ <string name="group_text" value="Gruppo"/>
+ <string name="can_resell">
+ La terra acquistata in questa regione può essere rivenduta.
+ </string>
+ <string name="can_not_resell">
+ La terra acquistata in questa regione non può essere rivenduta.
+ </string>
+ <string name="can_change">
+ La terra acquistata in questa regione può essere unita o suddivisa.
+ </string>
+ <string name="can_not_change">
+ La terra acquistata in questa regione non può essere unita o suddivisa.
+ </string>
+ <string name="server_update_text">
+ Informazioni su questo luogo non disponibili senza l&apos;aggiornamento del server.
+ </string>
+ <string name="server_error_text">
+ Informazioni su questo luogo non sono disponibili ora, per favore riprova più tardi.
+ </string>
+ <string name="server_forbidden_text">
+ Informazioni su questo luogo non sono disponibili a cause delle restrizioni sull&apos;accesso. Per favore verifica i tuoi permessi con il proprietario del parcel.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Profilo del luogo"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Proprietario:"/>
+ <text name="maturity_value" value="sconosciuto"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parcel">
+ <panel>
+ <text name="rating_label" value="Valutazione:"/>
+ <text name="rating_value" value="sconosciuto"/>
+ <text name="voice_label" value="Voice:"/>
+ <text name="voice_value" value="On"/>
+ <text name="fly_label" value="Vola:"/>
+ <text name="fly_value" value="On"/>
+ <text name="push_label" value="Spingi:"/>
+ <text name="push_value" value="Off"/>
+ <text name="build_label" value="Costruisci:"/>
+ <text name="build_value" value="On"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="On"/>
+ <text name="damage_label" value="Danno:"/>
+ <text name="damage_value" value="Off"/>
+ <button label="Info sul terreno" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Regione">
+ <panel>
+ <text name="region_name_label" value="Regione:"/>
+ <text name="region_type_label" value="Scrivi:"/>
+ <text name="region_rating_label" value="Valutazione:"/>
+ <text name="region_owner_label" value="Proprietario:"/>
+ <text name="region_group_label" value="Gruppo:"/>
+ <button label="Regione/Proprietà immobiliare" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Proprietà immobiliare">
+ <panel>
+ <text name="estate_name_label" value="Proprietà immobiliare:"/>
+ <text name="estate_rating_label" value="Valutazione:"/>
+ <text name="estate_owner_label" value="Proprietà:"/>
+ <text name="covenant_label" value="Regolamento:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="In vendita">
+ <panel>
+ <text name="sales_price_label" value="Prezzo:"/>
+ <text name="area_label" value="Area:"/>
+ <text name="traffic_label" value="Traffico:"/>
+ <text name="primitives_label" value="Primitive:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Limiti per Terraform:"/>
+ <text name="subdivide_label" value="Suddividi/Unisci abilità:"/>
+ <text name="resale_label" value="Rivendi abilità:"/>
+ <text name="sale_to_label" value="In vendita a:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_places.xml b/indra/newview/skins/default/xui/it/panel_places.xml
new file mode 100644
index 0000000000..8e50a8b9d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_places.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Luoghi" name="places panel">
+ <string name="landmarks_tab_title" value="MIEI LANDMARKS"/>
+ <string name="teleport_history_tab_title" value="TELEPORT PRECEDENTI"/>
+ <filter_editor label="Filtro Luoghi" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Mappa" name="map_btn"/>
+ <button label="Modifica" name="edit_btn"/>
+ <button label="Chiudi" name="close_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ <button label="Salva" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 2355dc7f0a..13ffabbebf 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
+ <panel.string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </panel.string>
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <check_box label="Chat a Bolle" name="bubble_text_chat"/>
+ <color_swatch name="background" tool_tip="Scegli il colore delle vignette della Chat"/>
+ <slider label="Opacità" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="larghezza/altezza">
- Rapporto di visualizzazione:
+ Rapporto di visualizzazione
</text>
<combo_box name="aspect_ratio" tool_tip="larghezza/altezza">
<combo_box.item label="4:3 (Monitor Standard)" name="item1"/>
@@ -9,4 +18,31 @@
<combo_box.item label="8:5 (Widescreen)" name="item3"/>
<combo_box.item label="16:9 (Widescreen)" name="item4"/>
</combo_box>
+ <check_box label="Rilevamento automatico" name="aspect_auto_detect"/>
+ <text name="heading1">
+ Camera:
+ </text>
+ <slider label="Angolazione della visuale" name="camera_fov"/>
+ <slider label="Distanza" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posizionamento Automatico per:
+ </text>
+ <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera entrando e uscendo dalla modalità modifica"/>
+ <check_box label="Aspetto Fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
+ <text name="heading3">
+ Avatar:
+ </text>
+ <check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/>
+ <check_box label="Cammino sempre con le frecce di movimento" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Doppio Click-Tieni Premuto per correre" name="tap_tap_hold_to_run"/>
+ <check_box label="Consente il movimento delle labbra dell&apos;Avatar quando parla" name="enable_lip_sync"/>
+ <check_box label="Mostra errori degli script" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="In chat" name="0"/>
+ <radio_item label="In una finestra" name="1"/>
+ </radio_group>
+ <check_box label="Modalità del microfono &quot;interruttore ON/OFF&quot; quando premo l&apos;interruttore PARLA:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto."/>
+ <line_editor label="Premi il pulsante per parlare" name="modifier_combo"/>
+ <button label="Imposta" name="set_voice_hotkey_button"/>
+ <button label="Pulsante centrale del Mouse" name="set_voice_middlemouse_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
index 54517635fd..02da9de4a4 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Pop-up" name="popups" title="Pop-up">
- <text name="dont_show_label">
- Non mostrare questi pop-up:
+ <text name="tell_me_label">
+ Dimmi:
</text>
- <button label="Abilita questo pop-up" name="enable_popup"/>
- <button width="200" label="Abilita tutti i pop-up..." name="reset_dialogs_btn" tool_tip="Abilita tutti i pop-up opzionali e le notifiche da &apos;utilizzo per la prima volta&apos;."/>
+ <check_box label="Quando spendo o ottengo L$" name="notify_money_change_checkbox"/>
+ <check_box label="Quando i miei amici entrano o escono da SL" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Mostra questi pop-up:
+ Mostra sempre questi allarmi:
</text>
- <button width="200" label="Disabilita tutti questi pop-up..." name="skip_dialogs_btn" tool_tip="Disabilita tutti i pop-up opzionali e le notifiche da &apos;utilizzo per la prima volta&apos;."/>
- <text name="text_box2">
- Offerte di notecard, texture e landmark:
+ <text name="dont_show_label">
+ Non mostrare mai questi allarmi:
</text>
- <check_box label="Accetta automaticamente" name="accept_new_inventory"/>
- <check_box label="Apri automaticamente dopo aver accettato" name="show_new_inventory"/>
- <check_box label="Mostra automaticamente nell&apos;inventario, gli oggetti appena accettati" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 7125832c7b..9c064c2716 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Text Chat" name="chat">
- <text name="text_box">
- Grandezza carattere
-chat:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Piccolo" />
- <radio_item name="radio2" label="Medio" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Piccolo" name="radio"/>
+ <radio_item label="Medio" name="radio2"/>
+ <radio_item label="Grande" name="radio3"/>
</radio_group>
<color_swatch label="Tuo" name="user"/>
<text name="text_box1">
- Tuo
+ Io
</text>
<color_swatch label="Altri" name="agent"/>
<text name="text_box2">
@@ -37,22 +33,14 @@ chat:
<text name="text_box7">
Proprietario
</text>
- <color_swatch label="Vignetta" name="background"/>
- <text name="text_box8">
- Vignetta
- </text>
<color_swatch label="URLs" name="links"/>
<text name="text_box9">
URLs
</text>
- <check_box label="Mostra errori script ed avvertimenti nella chat principale" name="script_errors_as_chat"/>
- <spinner label="Dissolvi la chat dopo" name="fade_chat_time" label_width="112" width="162"/>
- <slider label="Opacità" name="console_opacity"/>
- <check_box label="Utilzza la larghezza intera dello schermo (Richiede riavvio)" name="chat_full_width_check"/>
- <check_box label="Chiudi la barra chat dopo aver premuto invio" name="close_chat_on_return_check"/>
- <check_box label="Le frecce muovono comunque l&apos;avatar quando si sta scrivendo" name="arrow_keys_move_avatar_check"/>
- <check_box label="Mostra orario nella chat principale" name="show_timestamps_check"/>
- <check_box label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
- <check_box label="Mostra vignette chat" name="bubble_text_chat"/>
- <slider label="Opacità" name="bubble_chat_opacity"/>
+ <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
+ <check_box label="Spediscimi nella email gli IM quando sono OFF-LINE" name="send_im_to_email"/>
+ <radio_group name="chat_window" tool_tip="Mostra i tuoi Instant Messages in finestre separate, o in una finestra con diverse tabelle (Requires restart)">
+ <radio_item label="Finestre multiple" name="radio"/>
+ <radio_item label="Una finestra" name="radio2"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index e6cd6e67b2..80b152752b 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -1,90 +1,64 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Generale" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Vai a casa di default quando fai login" label="Casa mia"/>
- <combo_box.item name="MyLastLocation" tool_tip="Vai nell&apos;ultimo posto visitato di default quando fai login." label="Ultimo posto visitato"/>
- </combo_box>
- <check_box label="Mostra il punto di partenza nella schermata d&apos;inizio" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Mai"/>
- <combo_box.item name="Show Temporarily" label="Mostra temporanemente"/>
- <combo_box.item name="Always" label="Sempre"/>
- </combo_box>
- <check_box label="Nomi avatar in piccolo" name="small_avatar_names_checkbox"/>
- <check_box label="Nascondi il mio nome sul mio schermo" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Titoli di gruppo:
- </text>
- <check_box label="Nascondi i titoli di gruppo" name="show_all_title_checkbox"/>
- <check_box label="Nascondi il mio titolo di gruppo" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
- <text name="UI Size:">
- Dimensione interfaccia:
+ <text name="language_textbox">
+ Lingua:
</text>
- <check_box label="Usa ridimensionamento indipendente dalla risoluzione" name="ui_auto_scale"/>
- <spinner label="Assente dopo:" name="afk_timeout_spinner"/>
- <check_box label="Avvisami quando spendo o ricevo Linden Dollars (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Categoria di accesso:
+ <combo_box name="language_combobox">
+ <combo_box.item label="System default" name="System Default Language"/>
+ <combo_box.item label="English" name="English"/>
+ <combo_box.item label="Dansk (Danese) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Spagnolo) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francese) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Olandese) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polacco) - Beta" name="Polish"/>
+ <combo_box.item label="Portugués (Portoghese) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Richiede restart)
</text>
<text name="maturity_desired_prompt">
Voglio accedere al contenuto di tipo:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature e Adult"/>
- <combo_box.item name="Desired_Mature" label="PG e Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="PG, Mature e Adult" name="Desired_Adult"/>
+ <combo_box.item label="PG e Mature" name="Desired_Mature"/>
+ <combo_box.item label="PG" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
- Punto di partenza:
+ Luogo d&apos;inizio:
</text>
- <text name="show_names_textbox">
- Mostra Nomi:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Ultimo posto visitato" name="MyLastLocation" tool_tip="Vai nell&apos;ultimo posto visitato di default quando fai login."/>
+ <combo_box.item label="Casa mia" name="MyHome" tool_tip="Vai a casa di default quando fai login"/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostra su login" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Nome sulle tags:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio"/>
+ <radio_item label="On" name="radio2"/>
+ <radio_item label="Mostra brevemente" name="radio3"/>
+ </radio_group>
+ <check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Nome piccolo sulle tags" name="small_avatar_names_checkbox"/>
+ <check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Colore per i miei effetti:
+ Miei effetti:
+ </text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
+ <text name="title_afk_text">
+ Pausa di Away:
</text>
+ <spinner label="Assente dopo:" name="afk_timeout_spinner"/>
<text name="seconds_textbox">
secondi
</text>
- <text name="crash_report_textbox">
- Rapporti crash:
- </text>
- <text name="language_textbox">
- Lingua:
- </text>
- <text name="language_textbox2">
- (Richiede il riavvio)
+ <text name="text_box3">
+ Risposta in modalità occupato:
</text>
- <string name="region_name_prompt">
- &lt;Scrivi il nome della regione&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Chiedi prima di inviare"/>
- <combo_box.item name="Alwayssend" label="Invia sempre"/>
- <combo_box.item name="Neversend" label="Non inviare mai"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Default di sistema"/>
- <combo_box.item name="English" label="English"/>
- <combo_box.item name="Danish" label="Dansk (Danese) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Tedesco) - Beta"/>
- <combo_box.item name="Spanish" label="Español (Spagnolo) - Beta"/>
- <combo_box.item name="French" label="Français (Francese) - Beta"/>
- <combo_box.item name="Italian" label="Italiano - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Ungherese) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Olandese) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polacco) - Beta"/>
- <combo_box.item name="Portugese" label="Portugués (Portoghese) - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russo) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ukraino) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Cinese) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Giapponese) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coreano) - Beta"/>
- </combo_box>
- <check_box label="Condividi la tua lingua con gli oggetti" name="language_is_public" tool_tip="Questo fa in modo che gli oggetti inworld riconoscano la tua lingua."/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index 6e1640334f..647df27633 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -1,42 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafica" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Esegui Second Life in una finestra" name="windowed mode"/>
- <text_editor name="FullScreenInfo" width="480">
- Se deselezionato, all&apos;avvio il programma partirà a schermo intero.
- </text_editor>
- <text name="WindowSizeLabel">
- Dimensione della finestra:
+ <text name="UI Size:">
+ misura UI:
</text>
- <combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="720x480" label="720x480 (NTSC)"/>
- <combo_box.item name="768x576" label="768x576 (PAL)"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- </combo_box>
- <text name="DisplayResLabel">
- Risoluzione del monitor:
- </text>
- <text name="AspectRatioLabel1" tool_tip="larghezza/altezza">
- Rapporto di visualizzazione:
- </text>
- <combo_box name="aspect_ratio" tool_tip="larghezza/altezza">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Monitor Standard)"/>
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/>
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)"/>
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)"/>
- </combo_box>
- <check_box label="Autoconfigurazione" name="aspect_auto_detect"/>
- <text name="HigherText">
- Qualità e
- </text>
- <text name="QualityText">
- Performance:
+ <text name="QualitySpeed">
+ Qualità e velocità:
</text>
<text name="FasterText">
Più veloce
</text>
+ <text name="BetterText">
+ Migliore
+ </text>
<text name="ShadersPrefText">
Basso
</text>
@@ -49,96 +24,82 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2">
- Più alto
- </text>
- <text name="QualityText2">
- Qualità
- </text>
- <check_box label="Personalizzate" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Effetti grafici:
- </text>
- <check_box label="Piccoli rilievi e scintillii" name="BumpShiny"/>
- <check_box label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/>
- <check_box label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/>
- <check_box label="Riflessi dell&apos;acqua" name="Reflections"/>
- <text name="ReflectionDetailText">
- Dettaglio dei riflessi
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terreno ed alberi" />
- <radio_item name="1" label="Tutti gli aggetti statici" />
- <radio_item name="2" label="Tutti gli avatar e gli oggetti" />
- <radio_item name="3" label="Tutto" />
- </radio_group>
- <text name="AvatarRenderingText">
- Rendering dell&apos;avatar:
- </text>
- <check_box label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
- <check_box label="Hardware Skinning" name="AvatarVertexProgram"/>
- <check_box label="Abiti dell&apos;avatar" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Distanza di disegno:" name="DrawDistance" label_width="158" width="255"/>
- <slider label="Conteggio massimo particelle:" name="MaxParticleCount" label_width="158" width="262" />
- <slider label="Qualità in post-produzione:" name="RenderPostProcess" label_width="158" width="223"/>
- <text name="MeshDetailText">
- Dettagli reticolo:
- </text>
- <slider label=" Oggetti:" name="ObjectMeshDetail"/>
- <slider label=" Prims flessibili:" name="FlexibleMeshDetail"/>
- <slider label=" Alberi:" name="TreeMeshDetail"/>
- <slider label=" Avatar:" name="AvatarMeshDetail"/>
- <slider label=" Terreno:" name="TerrainMeshDetail"/>
- <slider label=" Cielo:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Basso
- </text>
- <text name="ObjectMeshDetailText">
- Basso
- </text>
- <text name="FlexibleMeshDetailText">
- Basso
- </text>
- <text name="TreeMeshDetailText">
- Basso
- </text>
- <text name="AvatarMeshDetailText">
- Basso
- </text>
- <text name="TerrainMeshDetailText">
- Basso
- </text>
- <text name="SkyMeshDetailText">
- Basso
- </text>
- <text name="LightingDetailText">
- Dettagli illuminazione:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Solo il sole e la luna" />
- <radio_item name="LocalLights" label="Luci locali" />
- </radio_group>
- <text name="TerrainDetailText">
- Dettagli terreno:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Bassi" />
- <radio_item name="2" label="Alti" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Effetti grafici:
+ </text>
+ <check_box initial_value="true" label="Piccoli rilievi e scintillii" name="BumpShiny"/>
+ <check_box initial_value="true" label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/>
+ <check_box initial_value="true" label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Riflessi dell&apos;acqua" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Dettaglio dei riflessi
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terreno e alberi" name="0"/>
+ <radio_item label="Tutti gli aggetti statici" name="1"/>
+ <radio_item label="Tutti gli avatar e gli oggetti" name="2"/>
+ <radio_item label="Tutto" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Rendering dell&apos;avatar:
+ </text>
+ <check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Abiti dell&apos;avatar" name="AvatarCloth"/>
+ <slider label="Distanza di disegno:" label_width="158" name="DrawDistance" width="255"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Conteggio massimo particelle:" label_width="158" name="MaxParticleCount" width="262"/>
+ <slider label="Qualità in post-produzione:" label_width="158" name="RenderPostProcess" width="223"/>
+ <text name="MeshDetailText">
+ Dettagli reticolo:
+ </text>
+ <slider label=" Oggetti:" name="ObjectMeshDetail"/>
+ <slider label=" Prims flessibili:" name="FlexibleMeshDetail"/>
+ <slider label=" Alberi:" name="TreeMeshDetail"/>
+ <slider label=" Avatar:" name="AvatarMeshDetail"/>
+ <slider label=" Terreno:" name="TerrainMeshDetail"/>
+ <slider label=" Cielo:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Basso
+ </text>
+ <text name="ObjectMeshDetailText">
+ Basso
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Basso
+ </text>
+ <text name="TreeMeshDetailText">
+ Basso
+ </text>
+ <text name="AvatarMeshDetailText">
+ Basso
+ </text>
+ <text name="TerrainMeshDetailText">
+ Basso
+ </text>
+ <text name="SkyMeshDetailText">
+ Basso
+ </text>
+ <text name="LightingDetailText">
+ Dettagli illuminazione:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Solo il sole e la luna" name="SunMoon"/>
+ <radio_item label="Luci locali" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Dettagli terreno:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Basso" name="0"/>
+ <radio_item label="Alto" name="2"/>
+ </radio_group>
</panel>
- <button label="Configurazione raccomandata" name="Defaults" left="110" width="190" />
- <button label="Opzioni hardware" label_selected="Opzioni hardware" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Applica" label_selected="Applica" name="Apply"/>
+ <button label="Resetta" left="110" name="Defaults" width="190"/>
+ <button label="Avanzato" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 2249d94688..c84edbb47e 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -1,33 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Comunicazioni" name="im">
- <text name="text_box">
- Il mio stato online:
+<panel label="Comunicazione" name="im">
+ <panel.string name="log_in_to_change">
+ log in per cambiare
+ </panel.string>
+ <button label="Pulisci la cronologia" name="clear_cache"/>
+ <text name="cache_size_label_l">
+ (Luoghi, immagini, web, cronologia del search)
</text>
- <check_box label="Solo i miei amici e i miei gruppi possono vedermi online" name="online_visibility"/>
- <text name="text_box2">
- Opzioni IM:
+ <check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
+ <check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
+ <check_box label="Spegnere il microfono quando chiudi le chiamate" name="auto_disengage_mic_check"/>
+ <check_box label="Accetta cookies" name="cookies_enabled"/>
+ <check_box label="Permettere Media Autoplay" name="autoplay_enabled"/>
+ <text name="Logs:">
+ Logs:
</text>
- <string name="log_in_to_change">
- Effettua login per cambiare
- </string>
- <check_box label="Invia gli IM alla mia email ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Inserisci gli IM nella console della chat" name="include_im_in_chat_console"/>
- <check_box label="Mostra l&apos;orario negli IM" name="show_timestamps_check"/>
- <check_box label="Mostrami le notifiche degli amici online" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Risposta agli IM quando
-sono in &apos;Occupato&apos;:
- </text>
- <text name="text_box4" width="136">
- Opzioni salvataggio chat:
- </text>
- <check_box label="Salva una copia degli IM sul mio computer" name="log_instant_messages"/>
- <check_box label="Mostra l&apos;orario nei registri IM" name="log_instant_messages_timestamp"/>
- <check_box label="Mostra la parte finale della precedente conversazione IM" name="log_show_history"/>
- <check_box label="Salva un registro della chat locale sul mio computer" name="log_chat"/>
- <check_box label="Mostra l&apos;orario nei registri della chat locale" name="log_chat_timestamp"/>
- <check_box label="Mostra gli IM entranti nel registro della chat locale" name="log_chat_IM"/>
- <check_box label="Includi la data nell&apos;orario" name="log_date_timestamp"/>
- <button label="Cambia percorso" label_selected="Cambia percorso" name="log_path_button" width="130"/>
+ <check_box label="Salvare le ultime chat logs nel mio computer" name="log_nearby_chat"/>
+ <check_box label="Salvare gli IM logs nel mio computer" name="log_instant_messages"/>
+ <check_box label="Aggiungere orario" name="show_timestamps_check_im"/>
<line_editor left="288" name="log_path_string" right="-20"/>
+ <text name="log_path_desc">
+ Luoghi delle logs
+ </text>
+ <button label="Browse" label_selected="Browse" name="log_path_button" width="130"/>
+ <button label="Bloccare lista" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index e1239d5820..17257a7cb8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -1,36 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Controlli &amp; Telecamera" name="Input panel">
- <text name=" Mouselook Options:">
- Opzioni visualizzazione
-in soggettiva:
- </text>
- <text name=" Mouse Sensitivity:">
- Sensibilità del mouse:
- </text>
- <check_box label="Inverti i controlli del mouse" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Opzioni di volo
-automatico:
- </text>
- <check_box label="Vola/atterra premendo su/giù" name="automatic_fly"/>
- <text name=" Camera Options:">
- Opzioni della
-telecamera:
- </text>
- <text name="camera_fov_label" width="218">
- Angolo di visualizzazione della telecamera:
- </text>
- <slider bottom_delta="-6" width="128" left="366" name="camera_fov" />
- <text name="Camera Follow Distance:" width="218">
- Distanza della telecamera dall&apos;avatar:
- </text>
- <slider bottom_delta="-6" width="128" left="366" name="camera_offset_scale" />
- <check_box label="Movimenti automatici della telecamera in &#10;modalità modifica oggetti" name="edit_camera_movement" tool_tip="Usa il posizionamento automatico della telecamera entrando e uscendo dalla modalità modifica oggetti"/>
- <check_box bottom_delta="-34" label="Movimenti automatici della telecamera in &#10;modalità aspetto fisico" name="appearance_camera_movement" tool_tip="Usa il posizionamento automatico della telecamera durante la modalità modifica oggetti"/>
- <text name="text2" bottom_delta="-42">
- Opzione di visualizzazione
-dell&apos;avatar:
- </text>
- <check_box label="Mostra l&apos;avatar in prima persona" name="first_person_avatar_visible"/>
- <button bottom_delta="-40" label="Installazione del joystick" name="joystick_setup_button" width="165"/>
+<panel label="Input &amp; Camera" name="Input panel">
+ <button bottom_delta="-40" label="Altri Dispositivi" name="joystick_setup_button" width="165"/>
+ <text name="Mouselook:">
+ Mouselook:
+ </text>
+ <text name=" Mouse Sensitivity">
+ Sensibilità del Mouse
+ </text>
+ <check_box label="Inverti" name="invert_mouse"/>
+ <text name="Network:">
+ Network:
+ </text>
+ <text name="Maximum bandwidth">
+ Banda Massima
+ </text>
+ <text name="text_box2">
+ kbps
+ </text>
+ <check_box label="Custom port" name="connection_port_enabled"/>
+ <spinner label="Port number:" name="web_proxy_port"/>
+ <text name="cache_size_label_l">
+ Cache size
+ </text>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Browse" label_selected="Browse" name="set_cache"/>
+ <button label="Resetta" label_selected="Imposta" name="reset_cache"/>
+ <text name="Cache location">
+ Cache location
+ </text>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Usa il built-in browser" name="internal" tool_tip="Usa il built-in web browser per aiuto, web links, etc. Questo browser apre come una nuova finestra all&apos;interno [APP_NAME]."/>
+ <radio_item label="Usa il mio browser (IE, Firefox)" name="external" tool_tip="Usa il default system web browser per aiuto, web links, etc. Non raccomandato se utilizzi lo schermo pieno(full screen)."/>
+ </radio_group>
+ <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/>
+ <line_editor name="web_proxy_editor" tool_tip="Nome o indirizzo IP del proxy che vorresti usare"/>
+ <button label="Browse" label_selected="Browse" name="set_proxy"/>
+ <text name="Proxy location">
+ Proxy location
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index 41f67951c2..c4d46291dd 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -1,38 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Audio &amp; Video" name="Preference Media panel">
- <slider label="Master" name="System Volume"/>
+<panel label="Suoni" name="Preference Media panel">
+ <slider label="Principale" name="System Volume"/>
+ <check_box initial_value="true" label="Spegni suono se minimizzato" name="mute_when_minimized"/>
<slider label="Ambiente" name="Wind Volume"/>
- <slider label="Suoni" name="SFX Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Interfaccia utente" name="UI Volume"/>
+ <slider label="Pulsanti" name="UI Volume"/>
+ <slider label="MultiMedia" name="Media Volume"/>
+ <slider label="Effetto Suoni" name="SFX Volume"/>
<slider label="Musica" name="Music Volume"/>
+ <check_box label="Voce" name="enable_voice_check"/>
<slider label="Voice" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Voice chat non disponibile
- </text_editor>
- <check_box label="Abilita voice chat" name="enable_voice_check"/>
+ <text name="Listen from">
+ Ascolta da:
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Ascolta voice chat dalla posizione della telecamera" />
- <radio_item name="1" label="Ascolta voice chat dalla posizione dell&apos;avatar" />
+ <radio_item label="Posizione della Camera" name="0"/>
+ <radio_item label="Posizione dell&apos;Avatar" name="1"/>
</radio_group>
- <button label="Configurazione periferica" name="device_settings_btn" width="165"/>
- <text name="muting_text">
- Volume:
- </text>
- <text name="streaming_prefs_text" bottom="-195" >
- Preferenze Streaming:
- </text>
- <text name="audio_prefs_text">
- Preferenze Audio:
- </text>
- <panel label="Volume" name="Volume Panel"/>
- <check_box label="Ascolta il canale della musica" name="streaming_music"/>
- <check_box height="32" label="Guarda i video" name="streaming_video"/>
- <check_box label="Attiva automaticamente i video" name="auto_streaming_video"/>
- <check_box label="Muta l&apos;audio quando minimizzi la finestra" name="mute_when_minimized"/>
- <slider label="Effetto Doppler" name="Doppler Effect" label_width="140" width="270" />
- <slider label="Fattore di Distanza" name="Distance Factor" label_width="140" width="270"/>
- <slider label="Fattore di Allontanamento" name="Rolloff Factor" label_width="140" width="270"/>
- <spinner label="Suono di Avviso Transazioni &#8805; a L$" name="L$ Change Threshold" label_width="195" width="259"/>
- <spinner label="Livello vitale dell&apos;avatar" name="Health Change Threshold" label_width="195" width="259"/>
+ <button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
+ <panel label="Impostazioni del dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Predefinito
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Mio volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
+ <text name="wait_text">
+ Attendi
+ </text>
+ <text name="Output">
+ Output
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..dc7d59084e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <layout_stack name="media_controls">
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Lista Bianca attivata"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Avanzamento riproduzione Movie"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Silenzia questo Media ????"/>
+ <slider name="volume_slider" tool_tip="Volume Media"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack>
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Media stà caricando"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
new file mode 100644
index 0000000000..837aa4ac65
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profilo" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=it-IT
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=it
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
+ <string name="no_partner_text" value="Nessuno"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mondo Reale:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Homepage:
+ </text>
+ <text name="title_member_text" value="Membro dal:"/>
+ <text name="title_acc_status_text" value="Stato dell&apos;Account:"/>
+ <text name="acc_status_text" value="Resident. No payment info on file."/>
+ <text name="title_partner_text" value="Partner:"/>
+ <text name="title_groups_text" value="Gruppi:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Aggiungi Amico" name="add_friend" tool_tip="Offri amicizia ad un residente"/>
+ <button label="IM" name="im" tool_tip="Apri una sessione instant message"/>
+ <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
+ <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
+ <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Paga o condividi l&apos;inventario con il residente"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Modifica Profilo" name="edit_profile_btn"/>
+ <button label="Modifica Aspetto" name="edit_appearance_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml
new file mode 100644
index 0000000000..bf89a3e6f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Online
+ </string>
+ <string name="status_offline">
+ Offline
+ </string>
+ <text_editor name="user_name" value="(Caricando...)"/>
+ <text name="status" value="Online"/>
+ <tab_container name="tabs">
+ <panel label="PROFILO" name="panel_profile"/>
+ <panel label="PREFERITI" name="panel_picks"/>
+ <panel label="NOTE &amp; PRIVACY" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_covenant.xml b/indra/newview/skins/default/xui/it/panel_region_covenant.xml
index 9dfecde317..f35b451ac1 100644
--- a/indra/newview/skins/default/xui/it/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Regolamento" name="Covenant">
<text name="estate_section_lbl">
- Proprietà:
+ Proprietà immobiliare
</text>
<text name="estate_name_lbl">
Nome:
@@ -22,49 +22,48 @@
Ultima modifica Merc 31 Dic 1969 16:00:00
</text>
<button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-247" height="162" >
+ <text_editor bottom="-247" height="162" name="covenant_editor">
Per questa proprietà non è stato emesso alcun regolamento.
</text_editor>
<button label="Ripristina" name="reset_covenant"/>
- <text bottom="-25" name="covenant_help_text">
+ <text bottom="-25" name="covenant_help_text">
Le modifiche nel regolamento saranno visibili su tutti i terreni
della proprietà.
</text>
- <text bottom_delta="-36" name="covenant_instructions">
- Trascina e rilascia una notecard per cambiare il regolamento di
- questa proprietà.
+ <text bottom_delta="-36" name="covenant_instructions">
+ Trascina ed inserisci una notecard per cambiare i Covenant di questa proprietà immobiliare.
</text>
<text name="region_section_lbl">
- Regione:
+ Regione
</text>
<text name="region_name_lbl">
Nome:
</text>
- <text name="region_name_text" left="126">
+ <text left="126" name="region_name_text">
leyla
</text>
<text name="region_landtype_lbl">
Tipo:
</text>
- <text name="region_landtype_text" left="126">
+ <text left="126" name="region_landtype_text">
Mainland / Homestead
</text>
<text name="region_maturity_lbl" width="115">
Categoria di accesso:
</text>
- <text name="region_maturity_text" left="126">
+ <text left="126" name="region_maturity_text">
Adult
</text>
<text name="resellable_lbl">
Rivendita:
</text>
- <text name="resellable_clause" left="126">
+ <text left="126" name="resellable_clause">
La terra in questa regione non può essere rivenduta.
</text>
<text name="changeable_lbl">
Suddividi:
</text>
- <text name="changeable_clause" left="126">
+ <text left="126" name="changeable_clause">
La terra in questa regione non può essere unita/suddivisa.
</text>
<string name="can_resell">
diff --git a/indra/newview/skins/default/xui/it/panel_region_debug.xml b/indra/newview/skins/default/xui/it/panel_region_debug.xml
index 85fb968ab4..9e81d42410 100644
--- a/indra/newview/skins/default/xui/it/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_debug.xml
@@ -22,18 +22,18 @@
<line_editor name="target_avatar_name">
(nessuno)
</line_editor>
- <button label="Scegli..." name="choose_avatar_btn"/>
+ <button label="Scegli" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opzioni:
</text>
- <check_box label="Restituisci gli oggetti con script" name="return_scripts" tool_tip="Restituisci solo gli oggetti contenenti script."/>
- <check_box label="Restituisci solo gli oggetti che sono sulle terre altrui" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/>
- <check_box label="Restituisci gli oggetti in ogni regione di questi possedimenti" name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l&apos;insieme dei possedimenti terrieri"/>
+ <check_box label="Con scripts" name="return_scripts" tool_tip="Ritorna solo gli oggetti che hanno scripts"/>
+ <check_box label="Sulla terra di qualcun&apos;altro" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/>
+ <check_box label="In ogni regione di questa proprietà" name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l&apos;insieme dei possedimenti terrieri"/>
<button label="Restituisci" name="return_btn"/>
- <button width="280" label="Visualizza l&apos;elenco dei maggiori collidenti..." name="top_colliders_btn" tool_tip="Elenco degli oggetti che stanno potenzialmente subendo le maggiori collisioni"/>
- <button label="?" name="top_colliders_help" left="297"/>
- <button width="280" label="Visualizza l&apos;elenco degli script più pesanti..." name="top_scripts_btn" tool_tip="Elenco degli oggetti che impiegano più tempo a far girare gli script"/>
- <button label="?" name="top_scripts_help" left="297"/>
+ <button label="Visualizza l&apos;elenco dei maggiori collidenti..." name="top_colliders_btn" tool_tip="Elenco degli oggetti che stanno potenzialmente subendo le maggiori collisioni" width="280"/>
+ <button label="?" left="297" name="top_colliders_help"/>
+ <button label="Visualizza l&apos;elenco degli script più pesanti..." name="top_scripts_btn" tool_tip="Elenco degli oggetti che impiegano più tempo a far girare gli script" width="280"/>
+ <button label="?" left="297" name="top_scripts_help"/>
<button label="Riavvia la regione" name="restart_btn" tool_tip="Dai 2 minuti di tempo massimo e fai riavviare la regione"/>
<button label="?" name="restart_help"/>
<button label="Ritarda il riavvio" name="cancel_restart_btn" tool_tip="Ritarda il riavvio della regione di un&apos;ora"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml
index 5b95b7378b..b6dc60a9c2 100644
--- a/indra/newview/skins/default/xui/it/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml
@@ -11,7 +11,7 @@ avranno effetto su tutte le regioni della proprietà.
(sconosciuto)
</text>
<text name="owner_text">
- Proprietario:
+ Proprietario immobiliare:
</text>
<text name="estate_owner">
(sconosciuto)
@@ -24,10 +24,10 @@ avranno effetto su tutte le regioni della proprietà.
<check_box label="Permetti accesso pubblico" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Limita l&apos;accesso a residenti...
+ Accesso ristretto ai Residenti verificati con:
</text>
- <check_box label="che hanno dato info. di pagamento" name="limit_payment" tool_tip="Blocca residenti non identificati."/>
- <check_box label="Adulti con età verificata" name="limit_age_verified" tool_tip="Blocca residenti che non hanno verificato la loro età. Per maggiori informazioni vai a support.secondlife.com."/>
+ <check_box label="Informazioni di pagamento on File" name="limit_payment" tool_tip="Espelli residenti non identificati"/>
+ <check_box label="Verifica dell&apos;età" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno verificato l&apos;età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti la chat voice" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permetti teleport diretto" name="allow_direct_teleport"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_texture.xml b/indra/newview/skins/default/xui/it/panel_region_texture.xml
index 254700e9f1..23d6915a2f 100644
--- a/indra/newview/skins/default/xui/it/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_texture.xml
@@ -45,13 +45,13 @@
<spinner label="Alta" name="height_range_spin_2"/>
<spinner label="Alta" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Questi valori rappresentano l&apos;intervallo di miscelazione delle texture qui sopra.
+ Questi valori riproducono l&apos;insieme della gamma delle textures superiori.
</text>
<text name="height_text_lbl11">
- Misurato in metri, il valore più BASSO corrisponde all&apos;altezza MASSIMA della
+ Misurato in metri, il valore MINIMO è l&apos;altezza MASSIMA della Texture n°1, e il valore MASSIMO è l&apos;altezza MINIMA della Texture n°4.
</text>
<text name="height_text_lbl12">
-   Texture #1, e il valore più ALTO all&apos;altezza MINIMA della Texture #4.
+ Texture #1, e il valore più ALTO all&apos;altezza MINIMA della Texture #4.
</text>
<button label="Applica" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml
new file mode 100644
index 0000000000..a98a88950c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Caricando...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Non puoi vedere o modificare questo script, perchè è impostato come &quot;no copy&quot;. Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto..
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Oggetti Pubblici non possono attivare scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Attivando
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Caricando...
+ </text_editor>
+ <button label="Salva" label_selected="Salva" name="Save_btn"/>
+ <combo_box label="Inserire..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="File" name="File">
+ <menu_item_call label="Salva" name="Save"/>
+ <menu_item_call label="Annulla tutti i cambiamenti" name="Revert All Changes"/>
+ </menu>
+ <menu label="Modifica" name="Edit">
+ <menu_item_call label="Slaccia" name="Undo"/>
+ <menu_item_call label="Rifai" name="Redo"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Seleziona Tutto" name="Select All"/>
+ <menu_item_call label="Deseleziona" name="Deselect"/>
+ <menu_item_call label="Cerca / Sostituisci..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Aiuto" name="Help">
+ <menu_item_call label="Aiuto..." name="Help..."/>
+ <menu_item_call label="Aiuto nella tastiera..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_side_tray.xml b/indra/newview/skins/default/xui/it/panel_side_tray.xml
new file mode 100644
index 0000000000..06bc51f5db
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_side_tray.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Casa." name="sidebar_home">
+ <panel label="casa" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Trova i tuoi amici, contatti e persone nelle vicinanze." name="sidebar_people">
+ <panel_container name="panel_container">
+ <panel label="Info di Gruppo" name="panel_group_info_sidetray"/>
+ <panel label="Residenti bloccati &amp; Oggetti" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Trova luoghi dove andare e luoghi già visitati." label="Luoghi" name="sidebar_places">
+ <panel label="Luoghi" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Modifica il tuo profilo pubblico e le foto." name="sidebar_me">
+ <panel label="Io" name="panel_me"/>
+ </sidetray_tab>
+ <sidetray_tab description="Cambia il tuo aspetto ed il tuo look attuale." name="sidebar_appearance">
+ <panel label="Modifica Aspetto" name="sidepanel_appearance"/>
+ </sidetray_tab>
+ <sidetray_tab description="Curiosa nel tuo inventario." name="sidebar_inventory">
+ <panel label="Modifica Inventario" name="sidepanel_inventory"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..5e5f229ce4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Vaschetta laterale"/>
+ <button name="show_help" tool_tip="Mostra Aiuto"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..2fafc38ba1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Stare in piedi" name="stand_btn" tool_tip="Clicca qui per alzarti."/>
+ <button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index dfaacb659e..9acbb34c79 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -1,38 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nome dell&apos;appezzamento di terreno su cui sei. Clicca &apos;Informazioni sul terreno&apos;.">
- indica qui il nome del terreno
- </text>
- <text name="BalanceText" tool_tip="Saldo dell&apos;Account">
- In caricamento ...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Acquista valuta"/>
- <text name="TimeText" tool_tip="Ora corrente (Pacifico)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Domenica:Lunedì:Martedì:Mercoledì:Giovedì:Venerdì:Sabato
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Gennaio:Febbraio:Marzo:Aprile:Maggio:Giugno:Luglio:Agosto:Settembre:Ottobre:Novembre:Dicembre
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Avvisi ed Errori degli script"/>
- <button label="" label_selected="" name="health" tool_tip="Salute"/>
- <text name="HealthText" tool_tip="Salute">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Volo non permesso"/>
- <button label="" label_selected="" name="no_build" tool_tip="Costruzione non permessa"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="Script non permessi"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Vietato spingere"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Voice non disponibile qui"/>
- <button label="" label_selected="" name="buyland" tool_tip="Compra questo terreno"/>
- <line_editor label="Cerca" name="search_editor" tool_tip="Cerca in [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Cerca in [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Perdita di pacchetti
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Larghezza di banda
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Il mio saldo: Clicca per comprare più L$"/>
+ <text name="TimeText" tool_tip="Ora attuale (Pacific)">
+ 12:00 AM
+ </text>
+ <button name="volume_btn" tool_tip="Controllo del volume globale"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history.xml b/indra/newview/skins/default/xui/it/panel_teleport_history.xml
new file mode 100644
index 0000000000..3f02b1449a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_teleport_history.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Oggi"/>
+ <accordion_tab name="yesterday" title="Ieri"/>
+ <accordion_tab name="2_days_ago" title="2 giorni fà"/>
+ <accordion_tab name="3_days_ago" title="3 giorni fà"/>
+ <accordion_tab name="4_days_ago" title="4 giorni fà"/>
+ <accordion_tab name="5_days_ago" title="5 giorni fà"/>
+ <accordion_tab name="6_days_and_older" title="6 giorni fà o più vecchio"/>
+ <accordion_tab name="1_month_and_older" title="1 mese o più vecchio"/>
+ <accordion_tab name="6_months_and_older" title="6 mesi o più vecchio"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_world_map.xml b/indra/newview/skins/default/xui/it/panel_world_map.xml
index d00157a297..1349b36e2c 100644
--- a/indra/newview/skins/default/xui/it/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/it/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Sto Caricando...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Luogo non valido
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
new file mode 100644
index 0000000000..eab8e6b4e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Queste abilità permettono di aggiungere e rimuovere Membri dal gruppo, e permettono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
+ <action description="Invitare persone in questo Gruppo" longdescription="Invita Persone in questo Gruppo usando il bottone &apos;Invita&apos; nella sezione Ruoli &gt; tabella Membri." name="member invite"/>
+ <action description="Espellere Membri da questo Gruppo" longdescription="Espelli Membri dal Gruppo usando il bottone &apos;Espelli&apos; nella sezione Ruoli &gt; tabella Membri. Un Proprietario può espellere chiunque eccetto un altro Proprietario. Se tu non sei un Proprietario, un Membro può essere espulso da un gruppo solo ed unicamente, se hanno il Ruolo Everyone, e nessun altro Ruolo. Per rimuovere Membri dai Ruoli, devi avere l&apos;Abilità &apos;Rimuovi Membri dai Ruoli&apos;." name="member eject"/>
+ <action description="Seleziona &apos;Iscrizione libera&apos; e modifica da &apos;Tassa d&apos;Iscrizione&apos;" longdescription="Seleziona &apos;Iscrizione libera&apos; per permettere ai nuovi Membri di aderire senza invito, e modifica da &apos;Tassa d&apos;Iscrizione&apos; nella sezione Generale." name="member options"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i Ruoli del Gruppo, aggiungere e rimuovere Membri dai Ruoli, e assegnare Abilità ai Ruoli." name="Roles">
+ <action description="Creare nuovi Ruoli" longdescription="Crea nuovi Ruoli nella sezione Ruoli &gt; tabella Ruoli." name="role create"/>
+ <action description="Cancellare Ruoli" longdescription="Cancella Ruoli nella sezione Ruoli &gt; tabella Ruoli." name="role delete"/>
+ <action description="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici" longdescription="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici. Viene fatto nella parte bassa della sezione Ruoli &gt; tabella Ruoli dopo avere selezionato un Ruolo." name="role properties"/>
+ <action description="Incaricare Membri ad Assegnare Ruoli" longdescription="Assegna un Ruolo a Membri nella lista dei Ruoli assegnati (Roles section &gt; Members tab). Un Membro con questa Abilità può aggiungere Membri ad un Ruolo già presente nell&apos;elenco." name="role assign member limited"/>
+ <action description="Assegnare Membri a tutti i Ruoli" longdescription="Assegna Tutti i Ruoli a Membri nella lista dei Ruoli Assegnati (Roles section &gt; Members tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri Membri non Proprietari-- Ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente elevandosi ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità." name="role assign member"/>
+ <action description="Rimuovere Membri dai Ruoli" longdescription="Rimuovi dai Ruoli i Membri nella lista dei Ruoli Assegnati (Roles section &gt; Members tab). Il Proprietario non può essere rimosso." name="role remove member"/>
+ <action description="Assegnare e Rimuovere Abilità nei Ruoli" longdescription="Assegna e Rimuovi Abilità per ogni Ruolo nella lista dei Ruoli Assegnati (Roles section &gt; Roles tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi --ed assegnare ad altri Membri non Proprietà-- tutte le Abilità, che potenzialmente lo elevano ai poteri ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità ." name="role change actions"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di modificare l&apos;identità di questo Gruppo, come il cambiamento della visibilità pubblica, lo statuto, e lo stemma." name="Group Identity">
+ <action description="Cambiare lo Statuto, lo Stemma, e &apos;Mostra nel Cerca/Search&apos;" longdescription="Cambia Statuto, Immagine, e &apos;Mostra nel Cerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
+ </action_set>
+ <action_set description="Queste Abilità includono il potere di intestare, modificare, e vendere terreni di proprietà del Gruppo. Per aprire la finestra Info sul Terreno, click destro sulla terra e seleziona &apos;Info sul Terreno&apos;, o clicca l&apos;icona &apos;i&apos; sulla Barra di Navigazione." name="Parcel Management">
+ <action description="Intestare terra e comprare terra per il gruppo" longdescription="Intesta terra e compra terra per il Gruppo. Viene fatto in Informazioni sul Terreno &gt; tabella Generale." name="land deed"/>
+ <action description="Abbandonare la terra in favore di Governor Linden" longdescription="Abbandona la terra in favore di Governor Linden. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può abbandonare la terra posseduta dal Gruppo in Informazioni sul Terreno &gt; tabella Generale, restituendola alla proprietà Linden senza una vendita! Devi essere sicuro di quello che fai prima di assegnare questa Abilità." name="land release"/>
+ <action description="Impostare le info per la vendita della terra" longdescription="Imposta le info per la vendita della terra. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può vendere la terra posseduta dal Gruppo in Info sul Terreno &gt; tabella Generale (al prezzo che vogliono)! Devi essere sicuro di quello che fai prima di assegnare questa Abilità." name="land set sale info"/>
+ <action description="Suddividere e unire appezzamenti" longdescription="Suddividi e unisci parcel. Viene fatto con click destro sul terra, &apos;Modifica Terreno&apos;, trascinando poi il mouse sulla terra per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca &apos;Suddividere&apos;. Per unire, seleziona due o più two parcel confinanti e clicca &apos;Unisci&apos;." name="land divide join"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di cambiare il nome dell&apos;appezzamento, le impostazioni pre-definite, la visibilità nella mappatura, il punto di arrivo &amp; le coordinate del Teleport." name="Parcel Identity">
+ <action description="Premi &apos;Mostra Luogo nel Cerca&apos; e seleziona una categoria" longdescription="Premi &apos;Mostra Luogo nel Cerca&apos; e seleziona una categoria di parcel in Info sul Terreno &gt; tabella Opzioni." name="land find places"/>
+ <action description="Cambia il nome del parcel, descrizione, e impostazioni nel &apos;Mostra Luogo nel Cerca&apos;" longdescription="Cambia il nome del parcel, descrizione, e impostazioni nel &apos;Mostra Luogo nel Cerca&apos;. Viene fatto in Info sul Terreno &gt; tabella Opzioni." name="land change identity"/>
+ <action description="Impostare il punto di arrivo e le coordinate del Teleport" longdescription="In un appezzamento posseduto da un Gruppo, i Membri con questo Ruolo e Abilità possono impostare un punto di arrivo per i Teleport entranti, e impostare anche le coordinate del Teleport per ulteriore precisione. Viene fatto in Informazioni sul Terreno &gt; tabella Opzioni." name="land set landing point"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono alcune permessi nell&apos;appezzamento, quali &apos;Creare Oggetti&apos;, &apos;Editare il Terreno&apos;, trasmettere musica &amp; tabella Media." name="Parcel Settings">
+ <action description="Cambiare musica &amp; tabella media" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul Terreno &gt; tabella Media." name="land change media"/>
+ <action description="Cliccare &apos;Edita il Terreno&apos;" longdescription="Clicca &apos;Edita il Terreno&apos;. *ATTENZIONE* Informazioni sul Terreno &gt; tabella Opzioni &gt; Edita il Terreno permette a tutti di modificare la forma del terreno, collocare e spostare le piante Linden. Devi essere sicuro di quello che fai prima di assignera questa Abilità. Edita il terreno in Informazioni sul Terreno &gt; tabella Opzioni." name="land edit"/>
+ <action description="Cliccare Informazioni sul Terreno &gt; Impostazione Opzioni" longdescription="Premi &apos;Salvo (nessun danno)&apos;, &apos;Vola&apos;, e permetti agli altri Residenti di: &apos;modifica Terreno&apos;, &apos;Crea&apos;, &apos;Crea Landmarks&apos;, e &apos;Scripts attivi&apos; nella terra posseduta da un Gruppo in Info sul Terreno &gt; tabella Opzioni." name="land options"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono ai Membri di non avere restrizioni in un appezzamento posseduto da un Gruppo." name="Parcel Powers">
+ <action description="Permettere sempre &apos;Edita il Terreno&apos;" longdescription="I Membri con questo Ruolo e Abilità possono editare il terreno posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow edit land"/>
+ <action description="Permettere Vola Sempre&apos;" longdescription="I Membri con questo Ruolo e Abilità possono volare in un terreno posseduto da un Gruppo, anche se non è selezionato in Info sul Terreno &gt; tabella Opzioni." name="land allow fly"/>
+ <action description="Permettere &apos;Crea Oggetti&apos; sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare oggetti in un appezzamento posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow create"/>
+ <action description="Permettere &apos;Crea Landmark&apos; sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare Landmark in un appezzamento posseduto da un Gruppo , anche se non è evidenziato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow landmark"/>
+ <action description="Permettere &apos;Teleportami a Casa&apos; in un appezzamento di un Gruppo" longdescription="I Membri in un Ruolo con questa Abilità possono usare il menu Mondo &gt; Landmarks &gt; Imposta come Casa su un parcel intestato ad un Gruppo." name="land allow set home"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso ad un appezzamento di un Gruppo, e includono Congela ed Espelli un Residente." name="Parcel Access">
+ <action description="Gestire la lista degli Accessi Consentiti" longdescription="Gestisci la lista degli Accessi Consentiti in Informazioni sul Terreno &gt; tabella Accesso." name="land manage allowed"/>
+ <action description="Gestire la lista degli Accessi Bloccati" longdescription="Gestisci la lista Espulsi dal parcel in Info sul Terreno &gt; tabella Accesso." name="land manage banned"/>
+ <action description="Cambia le impostazioni del parcel in &apos;Vendi Pass a&apos;" longdescription="Cambia le impostazioni &apos;Vendi Pass a&apos; in Info sul Terreno &gt; tabella Accesso." name="land manage passes"/>
+ <action description="Espellere e Congelare i Residenti in un appezzamento" longdescription="Membri in un Ruolo con questa Abilità possono occuparsi di un residente indesiderato in un parcel posseduto da un Gruppo, con click destro sul residente, selezionando &apos;Espelli&apos; o &apos;Immobilizza&apos;." name="land admin"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono ai Membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai Membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè non si può annullare la restituzione degli Oggetti." name="Parcel Content">
+ <action description="Restituire oggetti posseduti da un Gruppo" longdescription="Restituisci gli oggetti posseduti da un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno &gt; tabella Oggetti." name="land return group owned"/>
+ <action description="Restituire oggetti concessi ad un Gruppo" longdescription="Restituisci oggetti concessi ad un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno &gt; tabella Oggetti." name="land return group set"/>
+ <action description="Restituire oggetti estranei al Gruppo" longdescription="Restituire oggetti estranei al Gruppo in un appezzamento di un Gruppo in Info sul Terreno &gt; tabella Oggetti." name="land return non group"/>
+ <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi di posizionare e spostare alberi, piante, erba. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; Cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
+ </action_set>
+ <action_set description="Queste Abilità includono il potere di intestare, modificare, vendere oggetti posseduti dal gruppo. Viene fatto in Build Tools &gt; tabella Generale. Click destro su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
+ <action description="Intestare oggetti ad un Gruppo" longdescription="Intesta oggetti ad un Gruppo in Build Tools &gt; tabella Generale." name="object deed"/>
+ <action description="Modificare (sposta, copia, modifica) oggetti di un Gruppo" longdescription="Controlla (sposta, copia, modifica) gli oggetti posseduti da un Gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
+ <action description="Mettere in vendita oggetti di un Gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Build Tools &gt; tabelle Generale." name="object set sale"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di richiedere ai Membri di pagare le perdite del Gruppo e di ricevere i dividendi del Gruppo, e di limitare l&apos;accesso all&apos;account del Gruppo." name="Accounting">
+ <action description="Pagare le perdite del Gruppo e ricevere i dividendi del Gruppo" longdescription="I Membri con questo Ruolo e Abilità pagheranno automaticamente le perdite del Gruppo e riceveranno i dividendi del Gruppo. Questo significa che riceveranno una porzione delle vendite di terre possedute dal gruppo (che sono risolte giornalmente), e contribuiranno anche su cose come le tasse di iscrizione dell&apos;appezzament. " name="accounting accountable"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono ai Membri di spedire, ricevere, e vedere le Notice del Gruppo." name="Notices">
+ <action description="Spedire Notice" longdescription="Membri in un Ruolo con questa Abilità possono spedire Notice nel Gruppo &gt; sezione Notice." name="notices send"/>
+ <action description="Ricevere Notice e vedere Notice precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere Notice e vedere Notice vecchie nel Gruppo &gt; sezione Notice." name="notices receive"/>
+ </action_set>
+ <action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di voice chat nel gruppo." name="Chat">
+ <action description="Aderire alla Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di chat, sia scritte che in voice." name="join group chat"/>
+ <action description="Aderire alla Voice Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di Voice Chat nel gruppo. NOTA: Per poter partecipare alla Chat di Gruppo è necessario accedere alla sessione di voice chat." name="join voice chat"/>
+ <action description="Moderare la Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono controllare l&apos;accesso e la partecipazione alle sessioni di chat scritta e di voice chat nel Gruppo." name="moderate group chat"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
new file mode 100644
index 0000000000..8dd7bfec42
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Vestiario" name="appearance panel">
+ <string name="No Outfit" value="Nessun vestiario"/>
+ <filter_editor label="Filtri per il vestiario" name="Filter"/>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ <button name="newlook_btn" tool_tip="Aggiungi nuovo vestiario"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;articolo selezionato"/>
+ <button label="Indossa" name="wear_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
new file mode 100644
index 0000000000..196eb75bd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cose" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Profilo" name="info_btn"/>
+ <button label="Indossa" name="wear_btn"/>
+ <button label="Riproduci" name="play_btn"/>
+ <button label="Teleport" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
new file mode 100644
index 0000000000..23ca8b5ad8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Caratteristiche dell&apos;articolo nell&apos;Inventario">
+ <panel.string name="unknown">
+ (Sconosciuto)
+ </panel.string>
+ <panel.string name="public">
+ (pubblico)
+ </panel.string>
+ <panel.string name="you_can">
+ Tu puoi:
+ </panel.string>
+ <panel.string name="owner_can">
+ Il Proprietario può:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Caratteristiche dell&apos;articolo"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nome:
+ </text>
+ <text name="LabelItemDescTitle">
+ Descrizione:
+ </text>
+ <text name="LabelCreatorTitle">
+ Creatore:
+ </text>
+ <button label="Profilo..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Proprietario:
+ </text>
+ <button label="Profilo..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Acquisito:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Tu:
+ </text>
+ <check_box label="Modifica" name="CheckOwnerModify"/>
+ <check_box label="Copia" name="CheckOwnerCopy"/>
+ <check_box label="Rivendi" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Chiunque:
+ </text>
+ <check_box label="Copia" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppo:
+ </text>
+ <check_box label="Condividi" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Prossimo Proprietario:
+ </text>
+ <check_box label="Modifica" name="CheckNextOwnerModify"/>
+ <check_box label="Copia" name="CheckNextOwnerCopy"/>
+ <check_box label="Rivendi" name="CheckNextOwnerTransfer"/>
+ <check_box label="In vendita" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Originale" name="Original"/>
+ </combo_box>
+ <spinner label="Prezzo:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
new file mode 100644
index 0000000000..e5f27795be
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Caratteristiche dell&apos;oggetto">
+ <panel.string name="text deed continued">
+ Intesta
+ </panel.string>
+ <panel.string name="text deed">
+ Intesta
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puoi modificare questo oggetto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puoi modificare questi oggetti
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Non puoi modificare questo oggetto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Non puoi modificare questi oggetti
+ </panel.string>
+ <panel.string name="text modify warning">
+ Questo oggetto ha parti unite
+ </panel.string>
+ <panel.string name="Cost Default">
+ Prezzo: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Prezzo Totale: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Prezzo Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Prezzo assortito
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Vendita assortita
+ </panel.string>
+ <panel label="">
+ <text name="Name:">
+ Nome:
+ </text>
+ <text name="Description:">
+ Descrizione:
+ </text>
+ <text name="Creator:">
+ Creatore:
+ </text>
+ <text name="Owner:">
+ Proprietario:
+ </text>
+ <text name="Group:">
+ Gruppo:
+ </text>
+ <button name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/>
+ <name_box initial_value="Caricando..." name="Group Name Proxy"/>
+ <button label="Intesta" label_selected="Intesta" name="button deed" tool_tip="Intestando questo oggetto lo passa con i permessi del prossimo proprietario. Gli oggetti condivisi dal Gruppo possono essere intestati solo da un Officer del gruppo."/>
+ <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti a tutti i Membri del gruppo impostato di condividere la tua modifica ai permessi di questo oggetto. Tu devi Intestare per consentire le restrizioni al ruolo."/>
+ <text name="label click action">
+ Clicca per:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Siedi sull&apos;oggetto" name="Sitonobject"/>
+ <combo_box.item label="Compra l&apos;oggetto" name="Buyobject"/>
+ <combo_box.item label="Paga l&apos;ogggetto" name="Payobject"/>
+ <combo_box.item label="Apri" name="Open"/>
+ </combo_box>
+ <check_box label="In Vendita:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Contenuti" name="Contents"/>
+ <combo_box.item label="Originale" name="Original"/>
+ </combo_box>
+ <spinner label="Prezzo: L$" name="Edit Cost"/>
+ <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Mostra questo oggetto nei risultati della ricerca"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Puoi modificare questo oggetto
+ </text>
+ <text name="Anyone can:">
+ Chiunque:
+ </text>
+ <check_box label="Sposta" name="checkbox allow everyone move"/>
+ <check_box label="Copia" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Prossimo Proprietario:
+ </text>
+ <check_box label="Modifica" name="checkbox next owner can modify"/>
+ <check_box label="Copia" name="checkbox next owner can copy"/>
+ <check_box label="Transfer" name="checkbox next owner can transfer" tool_tip="Prossimo proprietario può regalare o rivendere questo oggetto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel name="button_panel">
+ <button label="Apri" name="open_btn"/>
+ <button label="Paga" name="pay_btn"/>
+ <button label="Compra" name="buy_btn"/>
+ <button label="Cancella" name="cancel_btn"/>
+ <button label="Salva" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index bc3cc38a40..910e6e0960 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -4,9 +4,27 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Portale di supporto di Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Ricerca hardware...
+ </string>
+ <string name="StartupLoading">
+ In Caricamento
+ </string>
<string name="LoginInProgress">
In connessione. [APP_NAME] può sembrare rallentata. Attendi.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Logging in...
+ </string>
<string name="LoginAuthenticating">
In autenticazione
</string>
@@ -25,11 +43,14 @@
<string name="LoginInitializingMultimedia">
Inizializzazione dati multimediali...
</string>
+ <string name="LoginInitializingFonts">
+ Caricamento caratteri...
+ </string>
<string name="LoginVerifyingCache">
- Verifica della cache corso (può impiegarci dai 60-90 secondi)...
+ Verifica file della cache (tempo previsto 60-90 secondi)...
</string>
<string name="LoginProcessingResponse">
- Risposta in elaborazione...
+ Elaborazione risposta...
</string>
<string name="LoginInitializingWorld">
Inizializzazione...
@@ -55,6 +76,15 @@
<string name="LoginDownloadingClothing">
Sto caricando i vestiti...
</string>
+ <string name="LoginFailedNoNetwork">
+ Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.
+ </string>
+ <string name="Quit">
+ Termina
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=it-IT
+ </string>
<string name="AgentLostConnection">
Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
</string>
@@ -73,39 +103,9 @@
<string name="TooltipIsGroup">
(Gruppo)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Fisica
- </string>
- <string name="TooltipFlagTouch">
- Tocca
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Prendi dall&apos;inventario
- </string>
- <string name="TooltipFlagPhantom">
- Fantasma
- </string>
- <string name="TooltipFlagTemporary">
- Temporaneo
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Clicca con il tasto destro per il menù)
- </string>
- <string name="TooltipFreeToCopy">
- Copia consentita
- </string>
<string name="TooltipForSaleL$">
In Vendita: [AMOUNT]L$
</string>
- <string name="TooltipForSaleMsg">
- In Vendita: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Costruzione solo con gruppo
</string>
@@ -133,6 +133,76 @@
<string name="TooltipMustSingleDrop">
Solo un singolo oggetto può essere creato qui
</string>
+ <string name="TooltipHttpUrl">
+ Clicca per visitare questa pagina web
+ </string>
+ <string name="TooltipSLURL">
+ Clicca per avere maggiori informazioni sul luogo
+ </string>
+ <string name="TooltipAgentUrl">
+ Clicca per vedere il profilo del residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clicca per vedere la descrizione del gruppo
+ </string>
+ <string name="TooltipEventUrl">
+ Clicca per vedere la descrizione dell&apos;evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clicca per vedere questa inserzione
+ </string>
+ <string name="TooltipParcelUrl">
+ Clicca per vedere la descrizione della parcel
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clicca per teleportarti a questa destinazione
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clicca per vedere la descrizione dell&apos;oggetto
+ </string>
+ <string name="TooltipMapUrl">
+ Clicca per vedere questo posto sulla mappa
+ </string>
+ <string name="TooltipSLAPP">
+ Clicca per avviare il comando secondlife://
+ </string>
+ <string name="CurrentURL" value=" URL attuale: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportati a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostra la mappa per
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Chiudi (&#8984;W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Chiudi (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Ripristina
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizza
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Distacca
+ </string>
+ <string name="BUTTON_DOCK">
+ Àncora
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Disàncora
+ </string>
+ <string name="BUTTON_HELP">
+ Mostra gli aiuti
+ </string>
+ <string name="Searching">
+ In ricerca...
+ </string>
+ <string name="NoneFound">
+ Nessun risultato.
+ </string>
<string name="RetrievingData">
Recupero dati in corso...
</string>
@@ -187,8 +257,77 @@
<string name="AssetErrorUnknownStatus">
Stato sconosciuto
</string>
- <string name="AvatarEditingApparance">
- (In modifica dell&apos;aspetto fisico)
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ suono
+ </string>
+ <string name="calling card">
+ biglietto da visita
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ script (vecchia versione)
+ </string>
+ <string name="clothing">
+ abito
+ </string>
+ <string name="object">
+ oggetto
+ </string>
+ <string name="note card">
+ notecard
+ </string>
+ <string name="folder">
+ cartella
+ </string>
+ <string name="root">
+ cartella principale
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ parte del corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ oggetti smarriti
+ </string>
+ <string name="targa image">
+ immagine targa
+ </string>
+ <string name="trash">
+ cestino
+ </string>
+ <string name="jpeg image">
+ immagine jpeg
+ </string>
+ <string name="animation">
+ animazione
+ </string>
+ <string name="gesture">
+ gesture
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ preferiti
+ </string>
+ <string name="symbolic link">
+ link
</string>
<string name="AvatarAway">
Assente
@@ -407,17 +546,80 @@
Si
</string>
<string name="texture_loading">
- Caricando...
+ In Caricamento...
</string>
<string name="worldmap_offline">
Offline
</string>
+ <string name="worldmap_results_none_found">
+ Nessun risultato.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fine prematura del file
+ </string>
+ <string name="ST_NO_JOINT">
+ Impossibile trovare ROOT o JOINT.
+ </string>
<string name="whisper">
sussurra:
</string>
<string name="shout">
grida:
</string>
+ <string name="ringing">
+ In connessione alla Voice Chat in-world...
+ </string>
+ <string name="connected">
+ Connesso
+ </string>
+ <string name="unavailable">
+ Il voice non è disponibile nel posto dove ti trovi ora
+ </string>
+ <string name="hang_up">
+ Disconnesso dalla Voice Chat in-world
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Prendere dollari Linden (L$) da te
+ </string>
+ <string name="ActOnControlInputs">
+ Agire sul tuo controllo degli input
+ </string>
+ <string name="RemapControlInputs">
+ Rimappare il tuo controllo degli input
+ </string>
+ <string name="AnimateYourAvatar">
+ Animare il tuo avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Far indossare al tuo avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Rilasciare la propietà è far diventare pubblico.
+ </string>
+ <string name="LinkAndDelink">
+ Collegare e scollegare dagli altri oggetti
+ </string>
+ <string name="AddAndRemoveJoints">
+ Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti
+ </string>
+ <string name="ChangePermissions">
+ Cambiare i permessi
+ </string>
+ <string name="TrackYourCamera">
+ Tracciare la fotocamera
+ </string>
+ <string name="ControlYourCamera">
+ Controllare la tua fotocamera
+ </string>
<string name="SIM_ACCESS_PG">
PG
</string>
@@ -436,8 +638,6 @@
<string name="land_type_unknown">
(sconosciuto)
</string>
- <string name="covenant_never_modified">Ultima modifica: (mai)</string>
- <string name="covenant_modified">Ultima modifica: </string>
<string name="all_files">
Tutti i file
</string>
@@ -483,6 +683,729 @@
<string name="choose_the_directory">
Scegli la cartella
</string>
+ <string name="AvatarSetNotAway">
+ Imposta non assente
+ </string>
+ <string name="AvatarSetAway">
+ Imposta assente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Imposta non occupato
+ </string>
+ <string name="AvatarSetBusy">
+ Imposta occupato
+ </string>
+ <string name="shape">
+ Shape
+ </string>
+ <string name="skin">
+ Skin
+ </string>
+ <string name="hair">
+ Capelli
+ </string>
+ <string name="eyes">
+ Occhi
+ </string>
+ <string name="shirt">
+ Camicia
+ </string>
+ <string name="pants">
+ Pantaloni
+ </string>
+ <string name="shoes">
+ Scarpe
+ </string>
+ <string name="socks">
+ Calze
+ </string>
+ <string name="jacket">
+ Giacca
+ </string>
+ <string name="gloves">
+ Guanti
+ </string>
+ <string name="undershirt">
+ Maglietta intima
+ </string>
+ <string name="underpants">
+ slip
+ </string>
+ <string name="skirt">
+ Gonna
+ </string>
+ <string name="alpha">
+ Alfa (Trasparenza)
+ </string>
+ <string name="tattoo">
+ Tatuaggio
+ </string>
+ <string name="invalid">
+ non valido
+ </string>
+ <string name="next">
+ Seguente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Notice di gruppo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Notice di gruppo
+ </string>
+ <string name="GroupNotifySentBy">
+ Inviato da
+ </string>
+ <string name="GroupNotifyAttached">
+ Allegato:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Visualizza i notice passati o scegli qui di non riceverne.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Apri l&apos;allegato
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salva l&apos;allegato
+ </string>
+ <string name="TeleportOffer">
+ Offerta di Teletrasporto
+ </string>
+ <string name="StartUpNotification">
+ [%d] una nuova notifica è arrivata mentre eri assente...
+ </string>
+ <string name="StartUpNotifications">
+ [%d] nuove notifice sono arrivate mentre eri assente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Hai ancora [%d] notifiche
+ </string>
+ <string name="BodyPartsRightArm">
+ Braccio destro
+ </string>
+ <string name="BodyPartsHead">
+ Testa
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braccio sinistro
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Gamba sinistra
+ </string>
+ <string name="BodyPartsTorso">
+ Torace
+ </string>
+ <string name="BodyPartsRightLeg">
+ Gamba destra
+ </string>
+ <string name="GraphicsQualityLow">
+ Basso
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Premi ESC per tornare in visulizzazione normale
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Nessun oggetto corrispondente trovato in inventario.
+ </string>
+ <string name="InventoryNoTexture">
+ Non hai una copia
+di questa texture in inventario.
+ </string>
+ <string name="no_transfer" value=" (no transfer)"/>
+ <string name="no_modify" value=" (no modify)"/>
+ <string name="no_copy" value=" (no copy)"/>
+ <string name="worn" value=" (indossato)"/>
+ <string name="link" value=" (link)"/>
+ <string name="broken_link" value=" (broken_link)"/>
+ <string name="LoadingContents">
+ Contenuto in caricamento...
+ </string>
+ <string name="NoContents">
+ Nessun contenuto
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (indossato su [ATTACHMENT_POINT])"/>
+ <string name="Chat" value=" Chat :"/>
+ <string name="Sound" value=" Suono :"/>
+ <string name="Wait" value=" --- Attendi :"/>
+ <string name="AnimFlagStop" value=" Ferma l&apos;Animazione :"/>
+ <string name="AnimFlagStart" value=" Inizia l&apos;Animazione :"/>
+ <string name="Wave" value=" Wave"/>
+ <string name="HelloAvatar" value=" Ciao, avatar!"/>
+ <string name="ViewAllGestures" value=" Visualizza tutte le gesture &gt;&gt;"/>
+ <string name="Animations" value=" Animazioni,"/>
+ <string name="Calling Cards" value=" Biglietti da visita,"/>
+ <string name="Clothing" value=" Vestiti,"/>
+ <string name="Gestures" value=" Gesture,"/>
+ <string name="Landmarks" value=" Landmark,"/>
+ <string name="Notecards" value=" Notecard,"/>
+ <string name="Objects" value=" Oggetti,"/>
+ <string name="Scripts" value=" Script,"/>
+ <string name="Sounds" value=" Suoni,"/>
+ <string name="Textures" value=" Texture,"/>
+ <string name="Snapshots" value=" Fotografie,"/>
+ <string name="No Filters" value="No "/>
+ <string name="Since Logoff" value=" - Dalla disconnessione"/>
+ <string name="InvFolder My Inventory">
+ Il mio inventario
+ </string>
+ <string name="InvFolder My Favorites">
+ I miei preferiti
+ </string>
+ <string name="InvFolder Library">
+ Libreria
+ </string>
+ <string name="InvFolder Textures">
+ Texture
+ </string>
+ <string name="InvFolder Sounds">
+ Suoni
+ </string>
+ <string name="InvFolder Calling Cards">
+ Biglieti da visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmark
+ </string>
+ <string name="InvFolder Scripts">
+ Script
+ </string>
+ <string name="InvFolder Clothing">
+ Vestiti
+ </string>
+ <string name="InvFolder Objects">
+ Oggetti
+ </string>
+ <string name="InvFolder Notecards">
+ Notecard
+ </string>
+ <string name="InvFolder New Folder">
+ Nuova cartella
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Immagini non compresse
+ </string>
+ <string name="InvFolder Body Parts">
+ Parti del corpo
+ </string>
+ <string name="InvFolder Trash">
+ Cestino
+ </string>
+ <string name="InvFolder Photo Album">
+ Album fotografico
+ </string>
+ <string name="InvFolder Lost And Found">
+ Oggetti smarriti
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Suoni non compressi
+ </string>
+ <string name="InvFolder Animations">
+ Animazioni
+ </string>
+ <string name="InvFolder Gestures">
+ Gesture
+ </string>
+ <string name="InvFolder favorite">
+ Preferiti
+ </string>
+ <string name="InvFolder Current Outfit">
+ Outfit attuale
+ </string>
+ <string name="InvFolder My Outfits">
+ I miei Outfit
+ </string>
+ <string name="InvFolder Friends">
+ Amici
+ </string>
+ <string name="InvFolder All">
+ Tutti
+ </string>
+ <string name="Buy">
+ Compra
+ </string>
+ <string name="BuyforL$">
+ Compra per L$
+ </string>
+ <string name="Stone">
+ Pietra
+ </string>
+ <string name="Metal">
+ Metallo
+ </string>
+ <string name="Glass">
+ Vetro
+ </string>
+ <string name="Wood">
+ Legno
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plastica
+ </string>
+ <string name="Rubber">
+ Gomma
+ </string>
+ <string name="Light">
+ Luce
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Petto
+ </string>
+ <string name="Skull">
+ Cranio
+ </string>
+ <string name="Left Shoulder">
+ Spalla sinistra
+ </string>
+ <string name="Right Shoulder">
+ Spalla destra
+ </string>
+ <string name="Left Hand">
+ Mano sinistra
+ </string>
+ <string name="Right Hand">
+ Mano destra
+ </string>
+ <string name="Left Foot">
+ Piede sinisto
+ </string>
+ <string name="Right Foot">
+ Piede destro
+ </string>
+ <string name="Spine">
+ Spina dorsale
+ </string>
+ <string name="Pelvis">
+ Pelvi
+ </string>
+ <string name="Mouth">
+ Bocca
+ </string>
+ <string name="Chin">
+ Mento
+ </string>
+ <string name="Left Ear">
+ Orecchio sinistro
+ </string>
+ <string name="Right Ear">
+ Orecchio destro
+ </string>
+ <string name="Left Eyeball">
+ Bulbo sinistro
+ </string>
+ <string name="Right Eyeball">
+ Bulbo destro
+ </string>
+ <string name="Nose">
+ Naso
+ </string>
+ <string name="R Upper Arm">
+ Avambraccio destro
+ </string>
+ <string name="R Forearm">
+ Braccio destro
+ </string>
+ <string name="L Upper Arm">
+ Avambraccio sinistro
+ </string>
+ <string name="L Forearm">
+ Braccio sinistro
+ </string>
+ <string name="Right Hip">
+ Anca destra
+ </string>
+ <string name="R Upper Leg">
+ Coscia destra
+ </string>
+ <string name="R Lower Leg">
+ Gamba destra
+ </string>
+ <string name="Left Hip">
+ Anca sinista
+ </string>
+ <string name="L Upper Leg">
+ Coscia sinistra
+ </string>
+ <string name="L Lower Leg">
+ Gamba sinistra
+ </string>
+ <string name="Stomach">
+ Stomaco
+ </string>
+ <string name="Left Pec">
+ Petto sinistro
+ </string>
+ <string name="Right Pec">
+ Petto destro
+ </string>
+ <string name="YearsMonthsOld">
+ Nato da [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ Nato da [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ Nato da [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ Nato da [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ Nato da [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Iscritto oggi
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] anno
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anni
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anni
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mese
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] mesi
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] mesi
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] settimana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] settimane
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] settimane
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] giorno
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] giorni
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] giorni
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membri
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membri
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ In prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Membro onorario
+ </string>
+ <string name="AcctTypeEmployee">
+ Impiegato Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Informazioni di pagamento usate
+ </string>
+ <string name="PaymentInfoOnFile">
+ Informazioni di pagamento registrate
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nessuna informazione di pagamento
+ </string>
+ <string name="AgeVerified">
+ Età verificata
+ </string>
+ <string name="NotAgeVerified">
+ Età non verificata
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ In alto a destra
+ </string>
+ <string name="Top">
+ In alto
+ </string>
+ <string name="Top Left">
+ In alto a sinistra
+ </string>
+ <string name="Center">
+ Al centro
+ </string>
+ <string name="Bottom Left">
+ In basso a sinistra
+ </string>
+ <string name="Bottom">
+ In basso
+ </string>
+ <string name="Bottom Right">
+ In basso a destra
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Scaricato, in compilazione
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script non trovato sul server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema nel download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permessi insufficenti per scaricare lo script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permessi insufficenti per
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Errore di dowload sconosciuto
+ </string>
+ <string name="CompileQueueTitle">
+ Avanzamento ricompilazione
+ </string>
+ <string name="CompileQueueStart">
+ ricompila
+ </string>
+ <string name="ResetQueueTitle">
+ Avanzamento reset
+ </string>
+ <string name="ResetQueueStart">
+ reset
+ </string>
+ <string name="RunQueueTitle">
+ Avanzamento attivazione
+ </string>
+ <string name="RunQueueStart">
+ Attiva
+ </string>
+ <string name="NotRunQueueTitle">
+ Avanzamento disattivazione
+ </string>
+ <string name="NotRunQueueStart">
+ Disattivazione
+ </string>
+ <string name="CompileSuccessful">
+ Compilazione riuscita!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilazione riuscita, in salvataggio...
+ </string>
+ <string name="SaveComplete">
+ Salvataggio completato.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (oggetto fuori portata)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Oggetto [OBJECT] di proprietà di [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nessuno
+ </string>
+ <string name="Group" value=" (gruppo)"/>
+ <string name="Unknown">
+ (Sconosciuto)
+ </string>
+ <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/>
+ <string name="NextStipendDay" value="Il prossimo giorno di stipendio è "/>
+ <string name="GroupIndividualShare" value=" Gruppo Dividendi individuali"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Crediti
+ </string>
+ <string name="Debits">
+ Debiti
+ </string>
+ <string name="Total">
+ Totale
+ </string>
+ <string name="NoGroupDataFound">
+ Nessun dato trovato per questo gruppo
+ </string>
+ <string name="IMParentEstate">
+ Proprietà principale
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ errore
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ la proprietà posseduta da [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ Le proprietà che possiedi
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ Le proprietà di cui sei manager per conto di [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residenti ammessi: ([ALLOWEDAGENTS], massimo [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Gruppi ammessi: ([ALLOWEDGROUPS], massimo [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Riga [LINE], Colonna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] trovato/i
+ </string>
+ <string name="PanelContentsNewScript">
+ Nuovo Script
+ </string>
+ <string name="MuteByName">
+ (per nome)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (oggetto)
+ </string>
+ <string name="MuteGroup">
+ (gruppo)
+ </string>
+ <string name="RegionNoCovenant">
+ Non esiste nessun regolamento per questa proprietà.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Non esiste nessun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
+ </string>
+ <string name="covenant_last_modified">
+ Ultima modifica:
+ </string>
+ <string name="none_text" value=" (nessuno) "/>
+ <string name="never_text" value=" (mai) "/>
+ <string name="GroupOwned">
+ Posseduta da un gruppo
+ </string>
+ <string name="Public">
+ Pubblica
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (si aggiornerà dopo la pubblicazione)
+ </string>
+ <string name="MultiPreviewTitle">
+ Anteprima
+ </string>
+ <string name="MultiPropertiesTitle">
+ Proprietà
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un oggetto chiamato
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ Posseduto dal gruppo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ Posseduto da un gruppo sconosciuto
+ </string>
+ <string name="InvOfferOwnedBy">
+ Posseduto da
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ Posseduto da un&apos;utente sconosciuto
+ </string>
+ <string name="InvOfferGaveYou">
+ Ti ha offerto
+ </string>
+ <string name="InvOfferYouDecline">
+ Rifiuta
+ </string>
+ <string name="InvOfferFrom">
+ da
+ </string>
+ <string name="GroupMoneyTotal">
+ Totale
+ </string>
+ <string name="GroupMoneyBought">
+ comprato
+ </string>
+ <string name="GroupMoneyPaidYou">
+ ti ha pagato
+ </string>
+ <string name="GroupMoneyPaidInto">
+ ha pagato
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ ha comprato il pass
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagato la tassa per l&apos;evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagato il premio per l&apos;evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Crediti
+ </string>
+ <string name="GroupMoneyDebits">
+ Debiti
+ </string>
+ <string name="ViewerObjectContents">
+ Contenuto
+ </string>
+ <string name="AcquiredItems">
+ Oggetti acquisiti
+ </string>
+ <string name="Cancel">
+ Cancella
+ </string>
+ <string name="UploadingCosts">
+ Costi di caricamento [%s]
+ </string>
+ <string name="UnknownFileExtension">
+ Estensione del file sconosciuta [.%s]
+Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Aggiungi landmark...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Modifica landmark...
+ </string>
<string name="accel-mac-control">
&#8963;
</string>
@@ -504,81 +1427,1790 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
+ <string name="FileSaved">
+ File Salvato
+ </string>
+ <string name="Receiving">
+ In ricezione
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Avanti
+ </string>
+ <string name="Left">
+ Sinistra
+ </string>
+ <string name="Right">
+ Destra
+ </string>
+ <string name="Back">
+ Dietro
+ </string>
+ <string name="North">
+ Nord
+ </string>
+ <string name="South">
+ Sud
+ </string>
+ <string name="West">
+ Ovest
+ </string>
+ <string name="East">
+ Est
+ </string>
+ <string name="Up">
+ Su
+ </string>
+ <string name="Down">
+ Giù
+ </string>
+ <string name="Any Category">
+ Tutte le categorie
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Affitto terreni
+ </string>
+ <string name="Property Rental">
+ Affitto proprietà
+ </string>
+ <string name="Special Attraction">
+ Attrazioni speciali
+ </string>
+ <string name="New Products">
+ Nuovi prodotti
+ </string>
+ <string name="Employment">
+ Impiego
+ </string>
+ <string name="Wanted">
+ Richiesti
+ </string>
+ <string name="Service">
+ Servizi
+ </string>
+ <string name="Personal">
+ Personale
+ </string>
+ <string name="None">
+ Nessuno
+ </string>
+ <string name="Linden Location">
+ Luogo dei Linden
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte &amp; Cultura
+ </string>
+ <string name="Business">
+ Affari
+ </string>
+ <string name="Educational">
+ Educazione
+ </string>
+ <string name="Gaming">
+ Gioco
+ </string>
+ <string name="Hangout">
+ Divertimento
+ </string>
+ <string name="Newcomer Friendly">
+ Accoglienza nuovi residenti
+ </string>
+ <string name="Parks&amp;Nature">
+ Parchi &amp; Natura
+ </string>
+ <string name="Residential">
+ Residenziale
+ </string>
+ <string name="Stage">
+ Stage
+ </string>
+ <string name="Other">
+ Altro
+ </string>
+ <string name="Any">
+ Tutti
+ </string>
+ <string name="You">
+ Tu
+ </string>
+ <string name="Multiple Media">
+ Media Multipli
+ </string>
+ <string name="Play Media">
+ Media Play/Pausa
+ </string>
+ <string name="MBCmdLineError">
+ Un errore è stato riscontrato analizzando la linea di comando.
+Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters
+Errore:
+ </string>
+ <string name="MBCmdLineUsg">
+ uso linea di comando del programma [APP_NAME] :
+ </string>
+ <string name="MBUnableToAccessFile">
+ Il programma [APP_NAME] non è in grado di accedere ad un file necessario.
+
+Potrebbe darsi che tu abbia copie multiple attivate, o il tuo sistema reputa erroneamente che il file sia già aperto.
+Se il problema persiste, riavvia il computer e riprova.
+Se il problema persiste ancora, dovresti completamente disinstallare l&apos;applicazione [APP_NAME] e reinstallarla.
+ </string>
+ <string name="MBFatalError">
+ Errore fatale
+ </string>
+ <string name="MBRequiresAltiVec">
+ Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).
+ </string>
+ <string name="MBAlreadyRunning">
+ Il programma [APP_NAME] è già attivo.
+Controlla che il programma non sia minimizzato nella tua barra degli strumenti.
+Se il messaggio persiste, riavvia il computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente.
+Vuoi mandare un crash report?
+ </string>
+ <string name="MBAlert">
+ Avviso
+ </string>
+ <string name="MBNoDirectX">
+ Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore.
+[APP_NAME] usa le DirectX per determinare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Sebbene tu possa avviare il programma [APP_NAME] senza di esse, raccomandiamo caldamente di installare le DirectX 9.0b.
+
+Vuoi continuare?
+ </string>
+ <string name="MBWarning">
+ Attenzione
+ </string>
+ <string name="MBNoAutoUpdate">
+ L&apos;aggiornamento automatico non è stato ancora implementato per Linux.
+Raccomandiamo di scaricare l&apos;utima versione da www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass non riuscito
+ </string>
+ <string name="MBError">
+ Errore
+ </string>
+ <string name="MBFullScreenErr">
+ Impossibile visualizzare a schermo intero a risoluzione [WIDTH] x [HEIGHT].
+Visualizzazione corrente ridotta a finestra.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)
+ </string>
+ <string name="MBShutdownErr">
+ Errore di arresto
+ </string>
+ <string name="MBDevContextErr">
+ Impossibile caricare i driver GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Impossibile trovare un formato pixel adatto
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Impossibile ottenere una descrizione del formato pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] richiede True Color (32-bit) per funzionare.
+Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] non funziona poichè è impossibile trovare un canale alpha ad 8 Bit. Questo problema normalmente deriva dai driver della scheda video.
+Assicurati di avere installato i driver della scheda video più recenti.
+Assicurati anche che il monitor sia impostato a True Color (32-bit) nel pannello di controllo &gt; Display &gt; Settings.
+Se il messaggio persiste, contatta contatta [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Impossibile impostare il formato pixel
+ </string>
+ <string name="MBGLContextErr">
+ Impossibile creare il GL rendering
+ </string>
+ <string name="MBGLContextActErr">
+ Impossibile attivare il GL rendering
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a reinstallarli di nuovo.
+
+Se il messaggio persiste, contatta [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba leggera
+ </string>
+ <string name="All White">
+ Tutti bianchi
+ </string>
+ <string name="Anime Eyes">
+ Occhi grandi
+ </string>
+ <string name="Arced">
+ Arcuato
+ </string>
+ <string name="Arm Length">
+ Lunghezza braccia
+ </string>
+ <string name="Attached">
+ Attaccato
+ </string>
+ <string name="Attached Earlobes">
+ Lobi attaccati
+ </string>
+ <string name="Back Bangs">
+ #Back Bangs
+ </string>
+ <string name="Back Bangs Down">
+ #Back Bangs Down
+ </string>
+ <string name="Back Bangs Up">
+ #Back Bangs Up
+ </string>
+ <string name="Back Fringe">
+ Frangetta all&apos;indietro
+ </string>
+ <string name="Back Hair">
+ #Back Hair
+ </string>
+ <string name="Back Hair Down">
+ #Back Hair Down
+ </string>
+ <string name="Back Hair Up">
+ #Back Hair Up
+ </string>
+ <string name="Baggy">
+ Con le borse
+ </string>
+ <string name="Bangs">
+ Frange
+ </string>
+ <string name="Bangs Down">
+ #Bangs Down
+ </string>
+ <string name="Bangs Up">
+ #Bangs Up
+ </string>
+ <string name="Beady Eyes">
+ Occhi piccoli
+ </string>
+ <string name="Belly Size">
+ punto vita
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Sedere grande
+ </string>
+ <string name="Big Eyeball">
+ #Big Eyeball
+ </string>
+ <string name="Big Hair Back">
+ Gonfiore dei capelli: dietro
+ </string>
+ <string name="Big Hair Front">
+ Gonfiore dei capelli: davanti
+ </string>
+ <string name="Big Hair Top">
+ Gonfiore dei capelli: sopra
+ </string>
+ <string name="Big Head">
+ Grandezza testa
+ </string>
+ <string name="Big Pectorals">
+ Grandezza pettorali
+ </string>
+ <string name="Big Spikes">
+ Capelli con punte
+ </string>
+ <string name="Black">
+ Nero
+ </string>
+ <string name="Blonde">
+ Biondo
+ </string>
+ <string name="Blonde Hair">
+ Capelli biondi
+ </string>
+ <string name="Blush">
+ Fard
+ </string>
+ <string name="Blush Color">
+ Colore fard
+ </string>
+ <string name="Blush Opacity">
+ Opacità fard
+ </string>
+ <string name="Body Definition">
+ Definizione muscolare
+ </string>
+ <string name="Body Fat">
+ Grasso corporeo
+ </string>
+ <string name="Body Freckles">
+ Lentiggini e nei
+ </string>
+ <string name="Body Thick">
+ Corpo robusto
+ </string>
+ <string name="Body Thickness">
+ Robustezza del corpo
+ </string>
+ <string name="Body Thin">
+ Magrezza del corpo
+ </string>
+ <string name="Bow Legged">
+ Gambe arcuate
+ </string>
+ <string name="Breast Buoyancy">
+ Altezza del seno
+ </string>
+ <string name="Breast Cleavage">
+ Avvicinamento dei seni
+ </string>
+ <string name="Breast Size">
+ Grandezza del seno
+ </string>
+ <string name="Bridge Width">
+ Larghezza setto
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Grandezza delle sopracciglia
+ </string>
+ <string name="Bug Eyes">
+ Sporgenza degli occhi
+ </string>
+ <string name="Bugged Eyes">
+ Occhi sporgenti
+ </string>
+ <string name="Bulbous">
+ Bulboso
+ </string>
+ <string name="Bulbous Nose">
+ Naso bulboso
+ </string>
+ <string name="Bushy Eyebrows">
+ Sopracciglia cespugliose
+ </string>
+ <string name="Bushy Hair">
+ Capelli a cespuglio
+ </string>
+ <string name="Butt Size">
+ Grandezza del sedere
+ </string>
+ <string name="bustle skirt">
+ Arricciatura posteriore
+ </string>
+ <string name="no bustle">
+ Meno arricciatura
+ </string>
+ <string name="more bustle">
+ Più arricciatura
+ </string>
+ <string name="Chaplin">
+ Baffetti
+ </string>
+ <string name="Cheek Bones">
+ Mascella
+ </string>
+ <string name="Chest Size">
+ Ampiezza del torace
+ </string>
+ <string name="Chin Angle">
+ Angolo del mento
+ </string>
+ <string name="Chin Cleft">
+ Fessura inf. del mento
+ </string>
+ <string name="Chin Curtains">
+ Barba sottomento
+ </string>
+ <string name="Chin Depth">
+ Profondità mento
+ </string>
+ <string name="Chin Heavy">
+ Appuntita verso l&apos;alto
+ </string>
+ <string name="Chin In">
+ Mento in dentro
+ </string>
+ <string name="Chin Out">
+ Mento in fuori
+ </string>
+ <string name="Chin-Neck">
+ Grandezza mento-collo
+ </string>
+ <string name="Clear">
+ Trasparente
+ </string>
+ <string name="Cleft">
+ Fossetta
+ </string>
+ <string name="Close Set Eyes">
+ Occhi ravvicinati
+ </string>
+ <string name="Closed">
+ Chiusa
+ </string>
+ <string name="Closed Back">
+ Spacco chiuso dietro
+ </string>
+ <string name="Closed Front">
+ Spacco chiuso davanti
+ </string>
+ <string name="Closed Left">
+ Spacco chiuso sx
+ </string>
+ <string name="Closed Right">
+ Spacco chiuso dx
+ </string>
+ <string name="Coin Purse">
+ Meno pronunciati
+ </string>
+ <string name="Collar Back">
+ Scollatura posteriore
+ </string>
+ <string name="Collar Front">
+ Scollatura anteriore
+ </string>
+ <string name="Corner Down">
+ Angolo all&apos;ingiù
+ </string>
+ <string name="Corner Normal">
+ Angolo Normale
+ </string>
+ <string name="Corner Up">
+ Angolo all&apos;insù
+ </string>
+ <string name="Creased">
+ Alzato
+ </string>
+ <string name="Crooked Nose">
+ Naso storto
+ </string>
+ <string name="Cropped Hair">
+ Capelli raccolti
+ </string>
+ <string name="Cuff Flare">
+ Fondo pantalone
+ </string>
+ <string name="Dark">
+ Scuro
+ </string>
+ <string name="Dark Green">
+ Verde scuro
+ </string>
+ <string name="Darker">
+ Più scuro
+ </string>
+ <string name="Deep">
+ Più pronunciato
+ </string>
+ <string name="Default Heels">
+ Tacchi standard
+ </string>
+ <string name="Default Toe">
+ Punta del piede standard
+ </string>
+ <string name="Dense">
+ Meno rade
+ </string>
+ <string name="Dense hair">
+ #Dense Hair
+ </string>
+ <string name="Double Chin">
+ Doppio mento
+ </string>
+ <string name="Downturned">
+ Naso all&apos;ingiù
+ </string>
+ <string name="Duffle Bag">
+ Più pronunciati
+ </string>
+ <string name="Ear Angle">
+ Orecchie a sventola
+ </string>
+ <string name="Ear Size">
+ Grandezza orecchie
+ </string>
+ <string name="Ear Tips">
+ Tipo di orecchio
+ </string>
+ <string name="Egg Head">
+ Ovalizzazione testa
+ </string>
+ <string name="Eye Bags">
+ Borse sotto agli occhi
+ </string>
+ <string name="Eye Color">
+ Colore degli occhi
+ </string>
+ <string name="Eye Depth">
+ Occhi incavati
+ </string>
+ <string name="Eye Lightness">
+ Luminosità degli occhi
+ </string>
+ <string name="Eye Opening">
+ Apertura degli occhi
+ </string>
+ <string name="Eye Pop">
+ Differenza apertura occhi
+ </string>
+ <string name="Eye Size">
+ Grandezza occhi
+ </string>
+ <string name="Eye Spacing">
+ Distanza occhi
+ </string>
+ <string name="Eyeball Size">
+ #Eyeball Size
+ </string>
+ <string name="Eyebrow Arc">
+ Arco delle sopracciglia
+ </string>
+ <string name="Eyebrow Density">
+ Densità delle sopracciglia
+ </string>
+ <string name="Eyebrow Height">
+ Altezza delle sopracciglia
+ </string>
+ <string name="Eyebrow Points">
+ Sopracciglia appuntite
+ </string>
+ <string name="Eyebrow Size">
+ Grandezza sopracciglia
+ </string>
+ <string name="Eyelash Length">
+ Lunghezza delle ciglia
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Colore dell&apos;eyeliner
+ </string>
+ <string name="Eyes Back">
+ #Eyes Back
+ </string>
+ <string name="Eyes Bugged">
+ Occhi sporgenti
+ </string>
+ <string name="Eyes Forward">
+ #Eyes Forward
+ </string>
+ <string name="Eyes Long Head">
+ #Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Distorsione occhi in alto a sx
+ </string>
+ <string name="Eyes Shear Right Up">
+ Distorsione occhi in alto a dx
+ </string>
+ <string name="Eyes Short Head">
+ #Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ #Eyes Spread
+ </string>
+ <string name="Eyes Sunken">
+ #Eyes Sunken
+ </string>
+ <string name="Eyes Together">
+ #Eyes Together
+ </string>
+ <string name="Face Shear">
+ Distorsione del viso
+ </string>
+ <string name="Facial Definition">
+ Lineamenti del viso
+ </string>
+ <string name="Far Set Eyes">
+ Occhi distanti
+ </string>
+ <string name="Fat">
+ #Fat
+ </string>
+ <string name="Fat Head">
+ #Fat Head
+ </string>
+ <string name="Fat Lips">
+ Labbra carnose
+ </string>
+ <string name="Fat Lower">
+ #Fat Lower
+ </string>
+ <string name="Fat Lower Lip">
+ Labbro inferiore sporgente
+ </string>
+ <string name="Fat Torso">
+ #Fat Torso
+ </string>
+ <string name="Fat Upper">
+ #Fat Upper
+ </string>
+ <string name="Fat Upper Lip">
+ Labbro superiore sporgente
+ </string>
+ <string name="Female">
+ Femmina
+ </string>
+ <string name="Fingerless">
+ Senza dita
+ </string>
+ <string name="Fingers">
+ Dita
+ </string>
+ <string name="Flared Cuffs">
+ Fondo largo
+ </string>
+ <string name="Flat">
+ Piatto
+ </string>
+ <string name="Flat Butt">
+ Sedere piatto
+ </string>
+ <string name="Flat Head">
+ Viso piatto
+ </string>
+ <string name="Flat Toe">
+ Punta piatta
+ </string>
+ <string name="Foot Size">
+ Grandezza piede
+ </string>
+ <string name="Forehead Angle">
+ Angolo della fronte
+ </string>
+ <string name="Forehead Heavy">
+ Appuntita verso il basso
+ </string>
+ <string name="Freckles">
+ Lentiggini
+ </string>
+ <string name="Front Bangs Down">
+ #Front Bangs Down
+ </string>
+ <string name="Front Bangs Up">
+ #Front Bangs Up
+ </string>
+ <string name="Front Fringe">
+ Frangetta
+ </string>
+ <string name="Front Hair">
+ #Front Hair
+ </string>
+ <string name="Front Hair Down">
+ #Front Hair Down
+ </string>
+ <string name="Front Hair Up">
+ #Front Hair Up
+ </string>
+ <string name="Full Back">
+ Scostati
+ </string>
+ <string name="Full Eyeliner">
+ Con eyeliner
+ </string>
+ <string name="Full Front">
+ Anteriore pieno
+ </string>
+ <string name="Full Hair Sides">
+ Riempimento lati
+ </string>
+ <string name="Full Sides">
+ Pieni
+ </string>
+ <string name="Glossy">
+ Lucido
+ </string>
+ <string name="Glove Fingers">
+ Dita dei guanti
+ </string>
+ <string name="Glove Length">
+ Lunghezza guanti
+ </string>
+ <string name="Hair">
+ Capelli
+ </string>
+ <string name="Hair Back">
+ Capelli: dietro
+ </string>
+ <string name="Hair Front">
+ Capelli: davanti
+ </string>
+ <string name="Hair Sides">
+ Capelli: lati
+ </string>
+ <string name="Hair Sweep">
+ Traslazione
+ </string>
+ <string name="Hair Thickess">
+ Spessore
+ </string>
+ <string name="Hair Thickness">
+ Spessore barba
+ </string>
+ <string name="Hair Tilt">
+ Rotazione capelli
+ </string>
+ <string name="Hair Tilted Left">
+ Verso sinistra
+ </string>
+ <string name="Hair Tilted Right">
+ Verso destra
+ </string>
+ <string name="Hair Volume">
+ Capelli: volume
+ </string>
+ <string name="Hand Size">
+ Grandezza mani
+ </string>
+ <string name="Handlebars">
+ Baffi lunghi
+ </string>
+ <string name="Head Length">
+ Sporgenza del viso
+ </string>
+ <string name="Head Shape">
+ Forma della testa
+ </string>
+ <string name="Head Size">
+ Grandezza della testa
+ </string>
+ <string name="Head Stretch">
+ Compressione lat testa
+ </string>
+ <string name="Heel Height">
+ Altezza tacchi
+ </string>
+ <string name="Heel Shape">
+ Forma tacchi
+ </string>
+ <string name="Height">
+ Altezza
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Tacchi alti
+ </string>
+ <string name="High Jaw">
+ Mandibola alta
+ </string>
+ <string name="High Platforms">
+ Alta
+ </string>
+ <string name="High and Tight">
+ Cavallo alto
+ </string>
+ <string name="Higher">
+ Più alto
+ </string>
+ <string name="Hip Length">
+ Altezza bacino
+ </string>
+ <string name="Hip Width">
+ Larghezza bacino
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Colore ombretto interno
+ </string>
+ <string name="In Shdw Opacity">
+ Opacità ombretto interno
+ </string>
+ <string name="Inner Eye Corner">
+ Angolo interno
+ </string>
+ <string name="Inner Eye Shadow">
+ Ombretto interno
+ </string>
+ <string name="Inner Shadow">
+ Ombretto interno
+ </string>
+ <string name="Jacket Length">
+ Lunghezza giacca
+ </string>
+ <string name="Jacket Wrinkles">
+ Grinze della giacca
+ </string>
+ <string name="Jaw Angle">
+ Angolo mandibola
+ </string>
+ <string name="Jaw Jut">
+ Prognatismo mento
+ </string>
+ <string name="Jaw Shape">
+ Forma del mento
+ </string>
+ <string name="Join">
+ Avvicinati
+ </string>
+ <string name="Jowls">
+ Guance
+ </string>
+ <string name="Knee Angle">
+ Angolo ginocchia
+ </string>
+ <string name="Knock Kneed">
+ Gambe ad X
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mani grandi
+ </string>
+ <string name="Left Part">
+ Riga a sinistra
+ </string>
+ <string name="Leg Length">
+ Lunghezza gambe
+ </string>
+ <string name="Leg Muscles">
+ Muscoli gambe
+ </string>
+ <string name="Less">
+ Meno
+ </string>
+ <string name="Less Body Fat">
+ Meno grasso
+ </string>
+ <string name="Less Curtains">
+ Meno
+ </string>
+ <string name="Less Freckles">
+ Meno lentiggini
+ </string>
+ <string name="Less Full">
+ Meno piene
+ </string>
+ <string name="Less Gravity">
+ Più alto
+ </string>
+ <string name="Less Love">
+ Meno maniglie
+ </string>
+ <string name="Less Muscles">
+ Meno muscoli
+ </string>
+ <string name="Less Muscular">
+ Meno muscolari
+ </string>
+ <string name="Less Rosy">
+ Meno rosato
+ </string>
+ <string name="Less Round">
+ Meno rotondo
+ </string>
+ <string name="Less Saddle">
+ Meno a sella
+ </string>
+ <string name="Less Square">
+ Meno quadrato
+ </string>
+ <string name="Less Volume">
+ Meno volume
+ </string>
+ <string name="Less soul">
+ Meno
+ </string>
+ <string name="Lighter">
+ Più chiaro
+ </string>
+ <string name="Lip Cleft">
+ Distanza divis. labbro sup.
+ </string>
+ <string name="Lip Cleft Depth">
+ Prof. spacco labbro sup.
+ </string>
+ <string name="Lip Fullness">
+ Riempimento delle labbra
+ </string>
+ <string name="Lip Pinkness">
+ Tonalità rosa labbra
+ </string>
+ <string name="Lip Ratio">
+ Proporzione labbra
+ </string>
+ <string name="Lip Thickness">
+ Carnosità labbra
+ </string>
+ <string name="Lip Width">
+ Larghezza labbra
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Rossetto
+ </string>
+ <string name="Lipstick Color">
+ Colore rossetto
+ </string>
+ <string name="Long">
+ Lungo
+ </string>
+ <string name="Long Head">
+ Viso sporgente
+ </string>
+ <string name="Long Hips">
+ Bacino alto
+ </string>
+ <string name="Long Legs">
+ Gambe lunghe
+ </string>
+ <string name="Long Neck">
+ Collo lungo
+ </string>
+ <string name="Long Pigtails">
+ Ciuffi laterali lunghi
+ </string>
+ <string name="Long Ponytail">
+ Codino lungo
+ </string>
+ <string name="Long Torso">
+ Torace lungo
+ </string>
+ <string name="Long arms">
+ Braccia lunghe
+ </string>
+ <string name="Longcuffs">
+ Longcuffs
+ </string>
+ <string name="Loose Pants">
+ Non attillati
+ </string>
+ <string name="Loose Shirt">
+ Non attillata
+ </string>
+ <string name="Loose Sleeves">
+ Maniche lente
+ </string>
+ <string name="Love Handles">
+ Maniglie dell&apos;amore
+ </string>
+ <string name="Low">
Basso
</string>
- <string name="GraphicsQualityMid">
- Medio
+ <string name="Low Heels">
+ Tacchi bassi
</string>
- <string name="GraphicsQualityHigh">
+ <string name="Low Jaw">
+ Mandibola bassa
+ </string>
+ <string name="Low Platforms">
+ Bassa
+ </string>
+ <string name="Low and Loose">
+ Cavallo basso
+ </string>
+ <string name="Lower">
+ Più basso
+ </string>
+ <string name="Lower Bridge">
+ Parte bassa del setto
+ </string>
+ <string name="Lower Cheeks">
+ Guance
+ </string>
+ <string name="Male">
+ Maschio
+ </string>
+ <string name="Middle Part">
+ Riga nel mezzo
+ </string>
+ <string name="More">
+ Di più
+ </string>
+ <string name="More Blush">
+ Più fard
+ </string>
+ <string name="More Body Fat">
+ Più grasso
+ </string>
+ <string name="More Curtains">
+ Più
+ </string>
+ <string name="More Eyeshadow">
+ Più ombretto
+ </string>
+ <string name="More Freckles">
+ Più lentiggini
+ </string>
+ <string name="More Full">
+ Più piene
+ </string>
+ <string name="More Gravity">
+ Più calato
+ </string>
+ <string name="More Lipstick">
+ Più rossetto
+ </string>
+ <string name="More Love">
+ Più maniglie
+ </string>
+ <string name="More Lower Lip">
+ Labbro inf. pronunciato
+ </string>
+ <string name="More Muscles">
+ Più muscoli
+ </string>
+ <string name="More Muscular">
+ Più muscolatura
+ </string>
+ <string name="More Rosy">
+ Più rosato
+ </string>
+ <string name="More Round">
+ Più rotondo
+ </string>
+ <string name="More Saddle">
+ Più a sella
+ </string>
+ <string name="More Sloped">
+ Più orizzontale
+ </string>
+ <string name="More Square">
+ Più quadrato
+ </string>
+ <string name="More Upper Lip">
+ Labbro sup. pronunciato
+ </string>
+ <string name="More Vertical">
+ Più verticale
+ </string>
+ <string name="More Volume">
+ Più volume
+ </string>
+ <string name="More soul">
+ Più
+ </string>
+ <string name="Moustache">
+ Baffi
+ </string>
+ <string name="Mouth Corner">
+ Angolo della bocca
+ </string>
+ <string name="Mouth Position">
+ Posizione della bocca
+ </string>
+ <string name="Mowhawk">
+ Vuoti
+ </string>
+ <string name="Muscular">
+ Muscolatura
+ </string>
+ <string name="Mutton Chops">
+ Basette lunghe
+ </string>
+ <string name="Nail Polish">
+ Smalto
+ </string>
+ <string name="Nail Polish Color">
+ Colore smalto
+ </string>
+ <string name="Narrow">
+ Socchiusi
+ </string>
+ <string name="Narrow Back">
+ Laterali post. vicini
+ </string>
+ <string name="Narrow Front">
+ Laterali ant. vicini
+ </string>
+ <string name="Narrow Lips">
+ Labbra strette
+ </string>
+ <string name="Natural">
+ Naturale
+ </string>
+ <string name="Neck Length">
+ Lunghezza del collo
+ </string>
+ <string name="Neck Thickness">
+ Grandezza del collo
+ </string>
+ <string name="No Blush">
+ Senza fard
+ </string>
+ <string name="No Eyeliner">
+ Senza eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Senza ombretto
+ </string>
+ <string name="No Heels">
+ No Heels
+ </string>
+ <string name="No Lipgloss">
+ Senza lipgloss
+ </string>
+ <string name="No Lipstick">
+ Senza rossetto
+ </string>
+ <string name="No Part">
+ Senza riga
+ </string>
+ <string name="No Polish">
+ Senza smalto
+ </string>
+ <string name="No Red">
+ Senza rosso
+ </string>
+ <string name="No Spikes">
+ Senza punte
+ </string>
+ <string name="No White">
+ Senza bianco
+ </string>
+ <string name="No Wrinkles">
+ Senza pieghe
+ </string>
+ <string name="Normal Lower">
+ Inferiore normale
+ </string>
+ <string name="Normal Upper">
+ Superiore normale
+ </string>
+ <string name="Nose Left">
+ Storto a sinistra
+ </string>
+ <string name="Nose Right">
+ Storto a destra
+ </string>
+ <string name="Nose Size">
+ Grandezza naso
+ </string>
+ <string name="Nose Thickness">
+ Spessore naso
+ </string>
+ <string name="Nose Tip Angle">
+ Angolo punta naso
+ </string>
+ <string name="Nose Tip Shape">
+ Forma punta naso
+ </string>
+ <string name="Nose Width">
+ Larghezza naso
+ </string>
+ <string name="Nostril Division">
+ Divisione narici
+ </string>
+ <string name="Nostril Width">
+ Larghezza narici
+ </string>
+ <string name="Old">
+ Vecchio
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Aperto
+ </string>
+ <string name="Open Back">
+ Retro aperto
+ </string>
+ <string name="Open Front">
+ Aperto Frontale
+ </string>
+ <string name="Open Left">
+ Lato sin. aperto
+ </string>
+ <string name="Open Right">
+ Lato des. aperto
+ </string>
+ <string name="Orange">
+ Arancio
+ </string>
+ <string name="Out">
+ Fuori
+ </string>
+ <string name="Out Shdw Color">
+ Colore ombretto esterno
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacità ombretto esterno
+ </string>
+ <string name="Outer Eye Corner">
+ Angolo esterno occhio
+ </string>
+ <string name="Outer Eye Shadow">
+ Ombretto esterno
+ </string>
+ <string name="Outer Shadow">
+ Ombreggiatura esterna
+ </string>
+ <string name="Overbite">
+ Denti sup. in fuori
+ </string>
+ <string name="Package">
+ Genitali
+ </string>
+ <string name="Painted Nails">
+ Unghie colorate
+ </string>
+ <string name="Pale">
+ Pallido
+ </string>
+ <string name="Pants Crotch">
+ Cavallo
+ </string>
+ <string name="Pants Fit">
+ Vestibilità pantaloni
+ </string>
+ <string name="Pants Length">
+ Lunghezza pantaloni
+ </string>
+ <string name="Pants Waist">
+ Altezza slip
+ </string>
+ <string name="Pants Wrinkles">
+ Pantaloni con le grinze
+ </string>
+ <string name="Part">
+ Con riga
+ </string>
+ <string name="Part Bangs">
+ Frangetta divisa
+ </string>
+ <string name="Pectorals">
+ Pettorali
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Ciuffi
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Più rosato
+ </string>
+ <string name="Platform Height">
+ Altezza pianta
+ </string>
+ <string name="Platform Width">
+ Larghezza pianta
+ </string>
+ <string name="Pointy">
+ Appuntito
+ </string>
+ <string name="Pointy Heels">
+ Tacchi a spillo
+ </string>
+ <string name="Pointy Toe">
+ Punta appuntita
+ </string>
+ <string name="Ponytail">
+ Codino
+ </string>
+ <string name="Poofy Skirt">
+ Gonna gonfia
+ </string>
+ <string name="Pop Left Eye">
+ Sinistro più aperto
+ </string>
+ <string name="Pop Right Eye">
+ Destro più aperto
+ </string>
+ <string name="Puffy">
+ Paffute
+ </string>
+ <string name="Puffy Eyelids">
+ Palpebre gonfie
+ </string>
+ <string name="Rainbow Color">
+ Tonalità
+ </string>
+ <string name="Red Hair">
+ Presenza di rosso nei capelli
+ </string>
+ <string name="Red Skin">
+ Red Skin
+ </string>
+ <string name="Regular">
+ Normale
+ </string>
+ <string name="Regular Muscles">
+ Muscolatura normale
+ </string>
+ <string name="Right Part">
+ Riga a destra
+ </string>
+ <string name="Rosy Complexion">
+ Incarnato
+ </string>
+ <string name="Round">
+ Rotondo
+ </string>
+ <string name="Round Forehead">
+ Round Forehead
+ </string>
+ <string name="Ruddiness">
+ Rossore
+ </string>
+ <string name="Ruddy">
+ Rosse
+ </string>
+ <string name="Rumpled Hair">
+ Capelli mossi
+ </string>
+ <string name="Saddle Bags">
+ Rotondità fianchi
+ </string>
+ <string name="Saddlebags">
+ Rotondità fianchi
+ </string>
+ <string name="Scrawny">
+ Scrawny
+ </string>
+ <string name="Scrawny Leg">
+ Gambe magre
+ </string>
+ <string name="Separate">
+ Separati
+ </string>
+ <string name="Shading">
+ Shading
+ </string>
+ <string name="Shadow hair">
+ Shadow hair
+ </string>
+ <string name="Shallow">
+ Meno pronunciato
+ </string>
+ <string name="Shear Back">
+ Accostamento posteriore
+ </string>
+ <string name="Shear Face">
+ Distorsione viso
+ </string>
+ <string name="Shear Front">
+ Riempimento davanti
+ </string>
+ <string name="Shear Left">
+ A sinistra
+ </string>
+ <string name="Shear Left Up">
+ Distorto a sinistra
+ </string>
+ <string name="Shear Right">
+ A destra
+ </string>
+ <string name="Shear Right Up">
+ Distorto a destra
+ </string>
+ <string name="Sheared Back">
+ Accostati
+ </string>
+ <string name="Sheared Front">
+ Anteriormente vuoto
+ </string>
+ <string name="Shift Left">
+ A sinistra
+ </string>
+ <string name="Shift Mouth">
+ Spostamento bocca
+ </string>
+ <string name="Shift Right">
+ A destra
+ </string>
+ <string name="Shirt Bottom">
+ Parte inferiore camicia
+ </string>
+ <string name="Shirt Fit">
+ Vestibilità camicia
+ </string>
+ <string name="Shirt Wrinkles">
+ Camicia con le grinze
+ </string>
+ <string name="Shoe Height">
+ Altezza scarpe
+ </string>
+ <string name="Short">
+ Basso
+ </string>
+ <string name="Short Arms">
+ Braccia corte
+ </string>
+ <string name="Short Legs">
+ Gambe corte
+ </string>
+ <string name="Short Neck">
+ Collo corto
+ </string>
+ <string name="Short Pigtails">
+ Ciuffi laterali corti
+ </string>
+ <string name="Short Ponytail">
+ Codino Corto
+ </string>
+ <string name="Short Sideburns">
+ Basette corte
+ </string>
+ <string name="Short Torso">
+ Torace corto
+ </string>
+ <string name="Short hips">
+ Bacino corto
+ </string>
+ <string name="Shoulders">
+ Spalle
+ </string>
+ <string name="Side Bangs">
+ Side Bangs
+ </string>
+ <string name="Side Bangs Down">
+ Side Bangs Down
+ </string>
+ <string name="Side Bangs Up">
+ Side Bangs Up
+ </string>
+ <string name="Side Fringe">
+ Ciuffi laterali
+ </string>
+ <string name="Sideburns">
+ Basette
+ </string>
+ <string name="Sides Hair">
+ Capigliatura later.
+ </string>
+ <string name="Sides Hair Down">
+ Giù
+ </string>
+ <string name="Sides Hair Up">
+ Su
+ </string>
+ <string name="Skinny">
+ Skinny
+ </string>
+ <string name="Skinny Neck">
+ Collo fino
+ </string>
+ <string name="Skirt Fit">
+ Vestibilità gonna
+ </string>
+ <string name="Skirt Length">
+ Lunghezza gonna
+ </string>
+ <string name="Slanted Forehead">
+ Fronte inclinata
+ </string>
+ <string name="Sleeve Length">
+ Lunghezza maniche
+ </string>
+ <string name="Sleeve Looseness">
+ Morbidezza maniche
+ </string>
+ <string name="Slit Back">
+ Spacco: posteriore
+ </string>
+ <string name="Slit Front">
+ Spacco: anteriore
+ </string>
+ <string name="Slit Left">
+ Spacco: sinistro
+ </string>
+ <string name="Slit Right">
+ Spacco: destro
+ </string>
+ <string name="Small">
+ Piccolo
+ </string>
+ <string name="Small Hands">
+ Mani piccole
+ </string>
+ <string name="Small Head">
+ Testa piccola
+ </string>
+ <string name="Smooth">
+ Liscio
+ </string>
+ <string name="Smooth Hair">
+ Capelli lisci
+ </string>
+ <string name="Socks Length">
+ Lunghezza calze
+ </string>
+ <string name="Some">
+ Some
+ </string>
+ <string name="Soulpatch">
+ Pizzetto labbro inferiore
+ </string>
+ <string name="Sparse">
+ Piu rade
+ </string>
+ <string name="Spiked Hair">
+ Capelli a punta
+ </string>
+ <string name="Square">
+ Quadrato
+ </string>
+ <string name="Square Toe">
+ Punta quadrata
+ </string>
+ <string name="Squash Head">
+ Testa schiacciata
+ </string>
+ <string name="Squash/Stretch Head">
+ Testa Schiacciata/Allungata
+ </string>
+ <string name="Stretch Head">
+ Testa allungata
+ </string>
+ <string name="Sunken">
+ Scarne
+ </string>
+ <string name="Sunken Chest">
+ Senza pettorali
+ </string>
+ <string name="Sunken Eyes">
+ Occhi infossati
+ </string>
+ <string name="Sweep Back">
+ Indietro
+ </string>
+ <string name="Sweep Forward">
+ Avanti
+ </string>
+ <string name="Swept Back">
+ Swept Back
+ </string>
+ <string name="Swept Back Hair">
+ Swept Back Hair
+ </string>
+ <string name="Swept Forward">
+ Swept Forward
+ </string>
+ <string name="Swept Forward Hair">
+ Swept Forward Hair
+ </string>
+ <string name="Tall">
Alto
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING - TAKE FROM floater_about_land."land category with adult".item1-item12 -->
- <string name="Linden Location">Luogo dei Linden</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Arte &amp; Cultura</string>
- <string name="Business">Affari</string>
- <string name="Educational">Educazione</string>
- <string name="Gaming">Gioco</string>
- <string name="Hangout">Divertimento</string>
- <string name="Newcomer Friendly">Accoglienza nuovi residenti</string>
- <string name="Parks&amp;Nature">Parchi &amp; Natura</string>
- <string name="Residential">Residenziale</string>
- <string name="Shopping">Shopping</string>
- <string name="Other">Altro</string>
-
- <string name="ringing">
- In connessione alla Voice Chat in-world...
+ <string name="Taper Back">
+ Ravv. lat. posteriore
</string>
- <string name="connected">
- Connesso
+ <string name="Taper Front">
+ Ravv. lat. frontale
</string>
- <string name="unavailable">
- Il voice non è disponibile nel posto dove ti trovi ora
+ <string name="Thick Heels">
+ Tacchi spessi
</string>
- <string name="hang_up">
- Disconnesso dalla Voice Chat in-world
+ <string name="Thick Neck">
+ Collo grosso
+ </string>
+ <string name="Thick Toe">
+ Punta spessa
+ </string>
+ <string name="Thickness">
+ Thickness
+ </string>
+ <string name="Thin">
+ Ossute
+ </string>
+ <string name="Thin Eyebrows">
+ Sopracciglia fini
+ </string>
+ <string name="Thin Lips">
+ Labbra fini
+ </string>
+ <string name="Thin Nose">
+ Naso fino
+ </string>
+ <string name="Tight Chin">
+ Mento magro
+ </string>
+ <string name="Tight Cuffs">
+ Fondo stretto
+ </string>
+ <string name="Tight Pants">
+ Attillati
+ </string>
+ <string name="Tight Shirt">
+ Attilata
+ </string>
+ <string name="Tight Skirt">
+ Attillata
+ </string>
+ <string name="Tight Sleeves">
+ Attillate
+ </string>
+ <string name="Tilt Left">
+ Tilt Left
+ </string>
+ <string name="Tilt Right">
+ Tilt Right
+ </string>
+ <string name="Toe Shape">
+ Forma della punta
+ </string>
+ <string name="Toe Thickness">
+ Spessore della punta
+ </string>
+ <string name="Torso Length">
+ Lunghezza del torace
+ </string>
+ <string name="Torso Muscles">
+ Muscoli del torace
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Distaccato
+ </string>
+ <string name="Uncreased">
+ Abbassato
+ </string>
+ <string name="Underbite">
+ Denti inf. in fuori
+ </string>
+ <string name="Unnatural">
+ Innaturale
+ </string>
+ <string name="Upper Bridge">
+ Parte alta del setto
+ </string>
+ <string name="Upper Cheeks">
+ Parte alta degli zigomi
+ </string>
+ <string name="Upper Chin Cleft">
+ Fessura sup. del mento
+ </string>
+ <string name="Upper Eyelid Fold">
+ Piega palpebra sup.
+ </string>
+ <string name="Upturned">
+ Naso all&apos;insù
+ </string>
+ <string name="Very Red">
+ Molto rossi
+ </string>
+ <string name="Waist Height">
+ Vita alta
+ </string>
+ <string name="Well-Fed">
+ Pienotte
+ </string>
+ <string name="White Hair">
+ Capelli bianchi
+ </string>
+ <string name="Wide">
+ Spalancati
+ </string>
+ <string name="Wide Back">
+ Laterali post. larghi
+ </string>
+ <string name="Wide Front">
+ Laterali ant. larghi
+ </string>
+ <string name="Wide Lips">
+ Labbra larghe
+ </string>
+ <string name="Wild">
+ Colorati
+ </string>
+ <string name="Wrinkles">
+ Grinze
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Aggiungi ai miei landmark
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Modifica i miei landmark
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ maggiori informazioni sulla posizione attuale
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Lo storico delle mie posizioni
+ </string>
+ <string name="UpdaterWindowTitle">
+ Aggiornamento [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] In aggiornamento...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] In installazione...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Il Viewer del programma [APP_NAME] si sta aggiornando all&apos;ultima versione. Potrebbe volerci del tempo, attendi.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Aggiornamento in download...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Download dell&apos;aggiornamento
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Download dell&apos;aggiornamento non riuscito
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Il programma [APP_NAME] ha riscontrato un&apos;errore nel tentativo di aggiornamento. Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Tentativo di installazione aggiornamento non riuscito
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Errore nell&apos;apertura del viewer
+ </string>
+ <string name="IM_logging_string">
+ -- Registrazione messaggi instantanei abilitata --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] sta scrivendo...
+ </string>
+ <string name="Unnamed">
+ (anonimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderato: Voice spento di default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ La chat di testo non è disponibile per questa chiamata.
+ </string>
+ <string name="IM_muted_text_label">
+ La chat di testo è stata disabilitata da un moderatore di gruppo.
+ </string>
+ <string name="IM_default_text_label">
+ Clicca qua per inviare un messaggio instantaneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatore)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Prendere dollari Linden (L$) da te
- </string>
- <string name="ActOnControlInputs">
- Agire sul tuo controllo degli input
- </string>
- <string name="RemapControlInputs">
- Rimappare il tuo controllo degli input
- </string>
- <string name="AnimateYourAvatar">
- Animare il tuo avatar
- </string>
- <string name="AttachToYourAvatar">
- Far indossare al tuo avatar
- </string>
- <string name="ReleaseOwnership">
- Rilasciare la propietà è far diventare pubblico.
- </string>
- <string name="LinkAndDelink">
- Collegare e scollegare dagli altri oggetti
- </string>
- <string name="AddAndRemoveJoints">
- Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti
- </string>
- <string name="ChangePermissions">
- Cambiare i permessi
- </string>
- <string name="TrackYourCamera">
- Tracciare la fotocamera
- </string>
- <string name="ControlYourCamera">
- Controllare la tua fotocamera
- </string>
<string name="only_user_message">
Sei l&apos;unico utente di questa sessione.
</string>
@@ -621,31 +3253,4 @@
<string name="close_on_no_ability">
Non hai più le abilitazioni per rimanere nella sessione chat.
</string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Prova
- </string>
- <string name="AcctTypeCharterMember">
- Membro privilegiato
- </string>
- <string name="AcctTypeEmployee">
- Impiegato della Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Info. di pagamento usate
- </string>
- <string name="PaymentInfoOnFile">
- Info. di pagamento in archivio
- </string>
- <string name="NoPaymentInfoOnFile">
- Nessuna info. di pagamento
- </string>
- <string name="AgeVerified">
- Età verificata
- </string>
- <string name="NotAgeVerified">
- Età non verificata
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index 57e81bc41e..eff7516050 100644
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teletrasporto. Potresti aver bisogno di ricollegarti prima di poter usare il teletrasporto. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support
+ C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti aver bisogno di ricollegarti prima di poter usare il teleport. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
+www.secondlife.com/support.
</message>
<message name="invalid_region_handoff">
C&apos;è stato un problema nell&apos;elaborare il cambio di regione. Potresti aver bisogno di ricollegarti prima di poterlo effetuare. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support
+www.secondlife.com/support.
</message>
<message name="blocked_tport">
Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index a9b3d81a3b..9105c2613d 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -1,27 +1,68 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="[CAPITALIZED_APP_NAME] ã«ã¤ã„ã¦">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ コンパイラー [COMPILER] [COMPILER_VERSION] ãƒãƒ¼ã‚¸ãƒ§ãƒ³
+ </floater.string>
+ <floater.string name="AboutPosition">
+ ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ã§ã™ã€‚([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [リリースノート]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+メモリ: [MEMORY_MB] MB
+OS ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [OS_VERSION]
+グラフィックカード製造元: [GRAPHICS_CARD_VENDOR]
+グラフィックカード: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows グラフィックドライãƒãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [OPENGL_VERSION]
+
+libcurl ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [LIBCURL_VERSION]
+J2C デコーダãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [J2C_VERSION]
+オーディオドライãƒãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [AUDIO_DRIVER_VERSION]
+Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION]
+Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (ãªã—)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ パケットロス: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="情報" name="support_panel">
+ <button label="クリップボードã«ã‚³ãƒ”ー" name="copy_btn"/>
+ </panel>
+ <panel label="クレジット" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚
ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã ã€‚ --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="ライセンス" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
@@ -34,10 +75,7 @@
無断転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <text name="you_are_at">
- [POSITION]
- </text>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index fb7136d7ce..d57a81c770 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -1,7 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="土地情報">
+ <floater.string name="Minutes">
+ [MINUTES] 分
+ </floater.string>
+ <floater.string name="Minute">
+ 分
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] ç§’
+ </floater.string>
+ <floater.string name="Remaining">
+ 残り
+ </floater.string>
<tab_container name="landtab">
<panel label="一般" name="land_general_panel">
+ <panel.string name="new users only">
+ æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿
+ </panel.string>
+ <panel.string name="anyone">
+ 誰ã§ã‚‚
+ </panel.string>
+ <panel.string name="area_text">
+ é¢ç©ï¼š
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] 平方メートル
+ </panel.string>
+ <panel.string name="auction_id_text">
+ オークション ID: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ ã“ã®åœŸåœ°ã‚’修正変更ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (グループ所有)
+ </panel.string>
+ <panel.string name="profile_text">
+ プロフィール
+ </panel.string>
+ <panel.string name="info_text">
+ 情報
+ </panel.string>
+ <panel.string name="public_text">
+ (公共)
+ </panel.string>
+ <panel.string name="none_text">
+ (ãªã—)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (購入審査中)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+ </panel.string>
<text name="Name:">
åå‰ï¼š
</text>
@@ -27,13 +78,15 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="プロフィール..." label_selected="プロフィール..." name="Profile..."/>
<text name="Group:">
グループ:
</text>
- <button label="設定..." label_selected="設定..." name="Set..."/>
- <check_box label="グループã¸ã®è­²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループ・オフィサーã¯ã€ã“ã®åœŸåœ°ã‚’グループã«è­²æ¸¡ã—ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°é…分ã«å§”ã­ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <button label="譲渡..." label_selected="譲渡..." name="Deed..." tool_tip="é¸æŠžã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’譲渡ã§ãã¾ã™ã€‚"/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="設定" label_selected="設定..." name="Set..."/>
+ <check_box label="グループã¸ã®è­²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ィサーã¯ã“ã®åœŸåœ°ã‚’グループã«è­²æ¸¡ã§ãã¾ã™ã€‚ãã†ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚"/>
+ <button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="é¸æŠžã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’譲渡ã§ãã¾ã™ã€‚"/>
<check_box label="オーナーãŒè­²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è­²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/>
<text name="For Sale:">
è²©å£²ã®æœ‰ç„¡ï¼š
@@ -42,19 +95,19 @@
販売対象外
</text>
<text name="For Sale: Price L$[PRICE].">
- 価格: L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル)
+ 価格: L$ [PRICE] (L$ [PRICE_PER_SQM] / 平方メートル)
</text>
- <button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/>
+ <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..." width="100"/>
<text name="For sale to">
販売先:[BUYER]
</text>
<text name="Sell with landowners objects in parcel.">
- オブジェクトも販売価格ã«å«ã¾ã‚Œã¾ã™
+ オブジェクトを一緒ã«è²©å£²
</text>
<text name="Selling with no objects in parcel.">
- オブジェクトã¯è²©å£²å¯¾è±¡å¤–ã§ã™
+ オブジェクトã¯è²©å£²ã—ãªã„
</text>
- <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/>
+ <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale" width="100"/>
<text name="Claimed:">
å–得日時:
</text>
@@ -65,7 +118,7 @@
é¢ç©ï¼š
</text>
<text name="PriceText">
- 4048平方メートル
+ 4048 m²
</text>
<text name="Traffic:">
交通é‡:
@@ -73,65 +126,36 @@
<text name="DwellText">
誤
</text>
- <button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/>
- <button label="グループ用ã«è³¼å…¥..." label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/>
- <button label="入場許å¯ã‚’購入..." label_selected="入場許å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="125"/>
- <button label="土地を放棄..." label_selected="土地を放棄..." name="Abandon Land..."/>
- <button label="土地ã®è¿”é‚„ã‚’è¦æ±‚..." label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/>
- <button label="Lindenセール..." label_selected="Lindenセール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
- <panel.string name="new users only">
- æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿
- </panel.string>
- <panel.string name="anyone">
- 誰ã§ã‚‚
- </panel.string>
- <panel.string name="area_text">
- é¢ç©ï¼š
- </panel.string>
- <panel.string name="area_size_text">
- [AREA]平方メートル
- </panel.string>
- <panel.string name="auction_id_text">
- オークションID: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- ã“ã®åœŸåœ°ã‚’修正変更ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </panel.string>
- <panel.string name="group_owned_text">
- (グループ所有)
- </panel.string>
- <panel.string name="profile_text">
- プロフィール...
- </panel.string>
- <panel.string name="info_text">
- 情報...
- </panel.string>
- <panel.string name="public_text">
- (公共)
+ <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <button label="スクリプト情報" name="Scripts..." width="100"/>
+ <button label="グループã«è³¼å…¥" label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/>
+ <button label="入場許å¯ã‚’購入" label_selected="入場許å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="100"/>
+ <button label="åœŸåœ°ã®æ”¾æ£„" label_selected="土地を放棄..." name="Abandon Land..."/>
+ <button label="土地をå–り戻ã™" label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/>
+ <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
+ </panel>
+ <panel label="約款" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚
</panel.string>
- <panel.string name="none_text">
- (ãªã—)
+ <panel.string name="can_not_resell">
+ ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
</panel.string>
- <panel.string name="sale_pending_text">
- (購入審査中)
+ <panel.string name="can_change">
+ ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚
</panel.string>
- <panel.string name="no_selection_text">
- 区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
-「世界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼žã€ŒåœŸåœ°æƒ…å ±ã€ã«é€²ã‚€ã‹ã€åˆ¥ã®åŒºç”»ã‚’é¸æŠžã—ã¦ã€è©³ç´°ã‚’表示ã—ã¾ã™ã€‚
+ <panel.string name="can_not_change">
+ ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ
+ã‚りã¾ã™ã€‚
</panel.string>
- </panel>
- <panel label="約款" name="land_covenant_panel">
<text font="SansSerifLarge" name="estate_section_lbl">
ä¸å‹•産:
</text>
- <text name="estate_name_lbl">
- åå‰ï¼š
- </text>
<text name="estate_name_text">
メインランド
</text>
<text name="estate_owner_lbl">
- オーナー:
+ 所有者:
</text>
<text name="estate_owner_text">
(ãªã—)
@@ -145,11 +169,8 @@
<text font="SansSerifLarge" name="region_section_lbl">
地域:
</text>
- <text name="region_name_lbl">
- åå‰ï¼š
- </text>
<text name="region_name_text">
- Leyla
+ EricaVille
</text>
<text name="region_landtype_lbl">
種類:
@@ -167,7 +188,7 @@
å†è²©ï¼š
</text>
<text name="resellable_clause">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。
</text>
<text name="changeable_lbl">
å†åˆ†å‰²ï¼š
@@ -176,36 +197,23 @@
ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ã
ã¾ã›ã‚“。
</text>
- <panel.string name="can_resell">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚
- </panel.string>
- <panel.string name="can_not_resell">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
- </panel.string>
- <panel.string name="can_change">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚
- </panel.string>
- <panel.string name="can_not_change">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ
-ã‚りã¾ã™ã€‚
- </panel.string>
</panel>
<panel label="オブジェクト" name="land_objects_panel">
+ <panel.string left="200" name="objects_available_text">
+ [MAX] ã®å†… [COUNT]([AVAILABLE] 利用å¯èƒ½ï¼‰
+ </panel.string>
+ <panel.string left="200" name="objects_deleted_text">
+ [MAX] ã®å†… [COUNT]([DELETED] を削除)
+ </panel.string>
<text name="parcel_object_bonus">
- 地域オブジェクトボーナスè¦å› : [BONUS]
+ オブジェクトボーナス: [BONUS]
</text>
<text name="Simulator primitive usage:" width="500">
- 地域全体ã®ãƒ—リム使用状æ³ï¼š
+ プリム使用状æ³ï¼š
</text>
<text left="200" name="objects_available">
- [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰
+ [MAX] ã®å†… [COUNT] ([AVAILABLE] 利用å¯èƒ½ï¼‰
</text>
- <panel.string left="200" name="objects_available_text">
- [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰
- </panel.string>
- <panel.string left="200" name="objects_deleted_text">
- [MAX]ã®å†…[COUNT]([DELETED]を削除)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数:
</text>
@@ -219,13 +227,13 @@
[COUNT]
</text>
<text name="Owned by parcel owner:" width="300">
- 区画オーナーã«ã‚ˆã‚‹æ‰€æœ‰ï¼š
+ åŒºç”»æ‰€æœ‰è€…ã®æ‰€æœ‰ç‰©ï¼š
</text>
<text left="200" name="owner_objects_text">
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowOwner" right="-145"/>
- <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
<text name="Set to group:">
グループã«è¨­å®šï¼š
</text>
@@ -233,263 +241,239 @@
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowGroup" right="-145"/>
- <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
<text name="Owned by others:">
- 他人ã«ã‚ˆã‚‹æ‰€æœ‰ï¼š
+ ä»–äººã®æ‰€æœ‰ç‰©ï¼š
</text>
<text left="200" name="other_objects_text">
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowOther" right="-145"/>
- <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
<text name="Selected / sat upon:">
- é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š
+ é¸æŠžæ¸ˆã¿ãƒ»æ±ºå®šæ¸ˆã¿ï¼š
</text>
<text left="200" name="selected_objects_text">
[COUNT]
</text>
<text name="Autoreturn" width="500">
- ä»–ã®ä½äººã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´(分ã€0ã§è‡ªå‹•è¿”å´ãªã—)
+ 他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0 ã§è‡ªå‹•è¿”å´ãªã—):
</text>
<line_editor left_delta="5" name="clean other time" right="-80"/>
<text name="Object Owners:" width="150">
- オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š
+ ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…:
</text>
- <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List"/>
- <button label="オブジェクトã®è¿”å´..." label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/>
+ <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°ã—ã¾ã™"/>
+ <button label="オブジェクトを返å´ã™ã‚‹" label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/>
<name_list label="カウント" name="owner list">
- <column label="タイプ" name="type"/>
- <column name="online_status"/>
- <column label="åå‰" name="name"/>
- <column label="カウント" name="count"/>
- <column label="最新" name="mostrecent"/>
+ <name_list.columns label="タイプ" name="type"/>
+ <name_list.columns name="online_status"/>
+ <name_list.columns label="åå‰" name="name"/>
+ <name_list.columns label="カウント" name="count"/>
+ <name_list.columns label="最新" name="mostrecent"/>
</name_list>
</panel>
<panel label="オプション" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ 区画é¢ç©ãŒ 128 平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
+大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨­å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ 控ãˆã‚コンテンツ
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Adultコンテンツ
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æŽ§ãˆã‚ã¨ã•れã¦ã„ã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•れã¦ã„ã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (ãªã—)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ プッシングを制é™
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先)
+ </panel.string>
<text name="allow_label">
- ä»–ã®ä½äººã«ä»¥ä¸‹ã‚’許å¯ï¼š
+ ä»–ã®ä½äººã¸ã®è¨±å¯ï¼š
</text>
<check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/>
- <check_box label="ランドマーク作æˆ" name="check landmark"/>
<check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
<text left="138" name="allow_label2" width="144">
- オブジェクトã®ä½œæˆï¼š
+ 制作:
</text>
- <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="edit objects check"/>
+ <check_box label="全員" left="280" name="edit objects check"/>
<check_box label="グループ" left="380" name="edit group objects check"/>
<text left="138" name="allow_label3" width="144">
オブジェクトã®é€²å…¥ï¼š
</text>
- <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="all object entry check"/>
+ <check_box label="全員" left="280" name="all object entry check"/>
<check_box label="グループ" left="380" name="group object entry check"/>
<text left="138" name="allow_label4" width="144">
スクリプトã®å®Ÿè¡Œï¼š
</text>
- <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="check other scripts"/>
+ <check_box label="全員" left="280" name="check other scripts"/>
<check_box label="グループ" left="380" name="check group scripts"/>
<text name="land_options_label">
土地オプション:
</text>
<check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åйã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨­å®šã•れã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚"/>
- <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を妨ã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="検索ã«è¡¨ç¤ºï¼žï¼ˆé€±L$30)以下ã®å ´æ‰€" name="ShowDirectoryCheck" tool_tip="æ¤œç´¢çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/>
- <panel.string name="search_enabled_tooltip">
- ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
-大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨­å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
- </panel.string>
+ <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
<combo_box name="land category with adult">
- <combo_box.item name="item0" label="全カテゴリ"
- />
- <combo_box.item name="item1" label="Linden所在地"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼"
- />
- <combo_box.item name="item4" label="ビジãƒã‚¹"
- />
- <combo_box.item name="item5" label="教育的"
- />
- <combo_box.item name="item6" label="ゲーム"
- />
- <combo_box.item name="item7" label="ãŸã¾ã‚Šå ´"
- />
- <combo_box.item name="item8" label="æ–°ä½äººã«å¥½æ„çš„"
- />
- <combo_box.item name="item9" label="公園ã¨è‡ªç„¶"
- />
- <combo_box.item name="item10" label="ä½å®…用"
- />
- <combo_box.item name="item11" label="ショッピング"
- />
- <combo_box.item name="item12" label="ãã®ä»–"
- />
+ <combo_box.item label="全カテゴリ" name="item0"/>
+ <combo_box.item label="Linden 所在地" name="item1"/>
+ <combo_box.item label="アダルト" name="item2"/>
+ <combo_box.item label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼" name="item3"/>
+ <combo_box.item label="ビジãƒã‚¹" name="item4"/>
+ <combo_box.item label="教育的" name="item5"/>
+ <combo_box.item label="ゲーム" name="item6"/>
+ <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/>
+ <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/>
+ <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/>
+ <combo_box.item label="ä½å®…用" name="item10"/>
+ <combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item name="item0" label="全カテゴリー"
- />
- <combo_box.item name="item1" label="Linden所在地"
- />
- <combo_box.item name="item3" label="アート&amp;カルãƒãƒ£ãƒ¼"
- />
- <combo_box.item name="item4" label="ビジãƒã‚¹"
- />
- <combo_box.item name="item5" label="教育的"
- />
- <combo_box.item name="item6" label="ゲーム"
- />
- <combo_box.item name="item7" label="ãŸã¾ã‚Šå ´"
- />
- <combo_box.item name="item8" label="æ–°ä½äººã«å¥½æ„çš„"
- />
- <combo_box.item name="item9" label="公園ã¨è‡ªç„¶"
- />
- <combo_box.item name="item10" label="ä½å®…用"
- />
- <combo_box.item name="item11" label="ショッピング"
- />
- <combo_box.item name="item12" label="ãã®ä»–"
- />
+ <combo_box.item label="全カテゴリー" name="item0"/>
+ <combo_box.item label="Linden 所在地" name="item1"/>
+ <combo_box.item label="アート&amp;カルãƒãƒ£ãƒ¼" name="item3"/>
+ <combo_box.item label="ビジãƒã‚¹" name="item4"/>
+ <combo_box.item label="教育的" name="item5"/>
+ <combo_box.item label="ゲーム" name="item6"/>
+ <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/>
+ <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/>
+ <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/>
+ <combo_box.item label="ä½å®…用" name="item10"/>
+ <combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" name="?"/>
- <check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Matureコンテンツ
- </panel.string>
- <panel.string name="mature_check_adult">
- Adultコンテンツ
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Matureã¨ã•れã¦ã„ã¾ã™ã€‚
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•れã¦ã„ã¾ã™ã€‚
- </panel.string>
+ <check_box label="控ãˆã‚コンテンツ" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
スナップショット:
</text>
- <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="landing_point">
ç€åœ°ç‚¹: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (ãªã—)
- </panel.string>
<button label="設定" label_selected="設定" name="Set" tool_tip="訪å•者ã®ç€åœ°ç‚¹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚ã“ã®åŒºç”»å†…ã«ç«‹ã£ã¦è¡Œã£ã¦ãã ã•ã„。"/>
- <button label="クリア" label_selected="クリア" name="Clear" tool_tip="ç€åœ°ç‚¹ã‚’クリアã—ã¦ãã ã•ã„。"/>
+ <button label="クリア" label_selected="クリア" name="Clear" tool_tip="ç€åœ°ç‚¹ã‚’クリア"/>
<text name="Teleport Routing: ">
テレãƒãƒ¼ãƒˆåˆ¶é™ï¼š
</text>
- <combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land.">
- <combo_box.item name="Blocked" label="ä¸å¯"
- />
- <combo_box.item name="LandingPoint" label="ç€åœ°ç‚¹"
- />
- <combo_box.item name="Anywhere" label="ã©ã“ã§ã‚‚"
- />
+ <combo_box name="landing type" tool_tip="テレãƒãƒ¼ãƒˆçµŒè·¯ -- ã‚ãªãŸã®åœŸåœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆçµŒè·¯ã‚’é¸æŠž">
+ <combo_box.item label="ä¸å¯" name="Blocked"/>
+ <combo_box.item label="ç€åœ°ç‚¹" name="LandingPoint"/>
+ <combo_box.item label="ã©ã“ã§ã‚‚" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- プッシングを制é™
- </panel.string>
- <panel.string name="push_restrict_region_text">
- ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先)
- </panel.string>
</panel>
<panel label="メディア" name="land_media_panel">
<text name="with media:">
- タイプ:
+ 種類:
</text>
- <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/>
+ <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/>
<text name="at URL:">
- URL:
+ ホームページ:
+ </text>
+ <button label="設定" label_selected="設定..." name="set_media_url"/>
+ <text name="CurrentURL:">
+ ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ï¼š
</text>
- <button label="設定..." label_selected="設定..." name="set_media_url"/>
+ <button label="リセット..." label_selected="リセット..." name="reset_media_url" tool_tip="URLを更新"/>
+ <check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/>
<text name="Description:">
説明:
</text>
- <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/[ロード]ボタンã®éš£ã«è¡¨ç¤ºã•れるテキスト"/>
+ <line_editor name="url_description" tool_tip="「å†ç”Ÿã€ã€Œãƒ­ãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテキストã§ã™"/>
<text name="Media texture:">
- テクスãƒ
-ãƒ£å–æ›¿ï¼š
+ テクスãƒãƒ£ç½®ãæ›ãˆï¼š
</text>
- <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" left="120" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="replace_texture_help" width="290">
- 「å†ç”Ÿã€çŸ¢å°ã‚’クリックã™ã‚‹ã¨ã€ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã‚’
- 使用ã™ã‚‹ã‚ªãƒ–ジェクトã«å‹•ç”»ã¾ãŸã¯ã‚¦ã‚§ãƒ–・ページ
- ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
- </text>
- <text name="Options:">
- メディア
-オプション:
+ ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ã€Œå†ç”Ÿã€ã‚’クリックã™ã‚‹ã¨ã€å‹•画や Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨­å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/>
- <check_box label="メディアã®ãƒ«ãƒ¼ãƒ—" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/>
- <check_box label="メディア URL ã‚’éš ã™" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/>
- <check_box label="音楽ã®URLã‚’éš ã™" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯éŸ³æ¥½ã® URL ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。"/>
- <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
+ <text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
サイズ:
</text>
- <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
- <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
<text name="pixels">
ピクセル
</text>
+ <text name="Options:">
+ オプション:
+ </text>
+ <check_box label="ループ" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/>
+ </panel>
+ <panel label="サウンド" name="land_audio_panel">
<text name="MusicURL:">
- 音楽ã®URL:
+ 音楽 URL:
</text>
+ <check_box label="URL ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションã«ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€æ¨©é™ã®ãªã„人ãŒåŒºç”»æƒ…報を見ãŸã¨ãã«éŸ³æ¥½ã®URLãŒéš ã‚Œã¾ã™ã€‚"/>
<text name="Sound:">
サウンド:
</text>
- <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/>
- <button label="?" label_selected="?" left="408" name="?"/>
+ <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®šã™ã‚‹" name="check sound local"/>
<text name="Voice settings:">
ボイス:
</text>
<check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/>
<check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™ã™ã‚‹" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="ボイスをã“ã®åŒºç”»ã«é™å®šã™ã‚‹" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="アクセス" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (エステートã«é™å®šï¼‰
+ </panel.string>
+ <panel.string name="estate_override">
+ 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ </panel.string>
<text name="Limit access to this parcel to:">
- ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹
+ ã“ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹
</text>
- <check_box label="パブリック・アクセスを許å¯" name="public_access"/>
+ <check_box label="パブリックアクセスを許å¯ã™ã‚‹ [MATURITY]" name="public_access"/>
<text name="Only Allow">
- 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブロック:
+ 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
- <check_box label="Linden Labã«æ”¯æ‰•ã„æƒ…報を登録ã—ã¦ã„ãªã„ä½äºº" name="limit_payment" tool_tip="æ”¯æ‰•ã„æƒ…報未確èªã®ä½äººã‚’排除ã™ã‚‹"/>
- <check_box label="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„æˆäººã®ä½äºº" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’排除ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã¯ã€support.secondlife.comã‚’å‚ç…§ã—ã¦ãã ã•ã„。"/>
- <panel.string name="estate_override">
- 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚
- </panel.string>
- <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/>
+ <check_box label="支払情報登録済 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚"/>
+ <check_box label="å¹´é½¢ç¢ºèª [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
+ <check_box label="グループã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
+ <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="誰ã§ã‚‚"
- />
- <combo_box.item name="Group" label="グループ"
- />
+ <combo_box.item label="誰ã§ã‚‚" name="Anyone"/>
+ <combo_box.item label="グループ" name="Group"/>
</combo_box>
<spinner label="価格(L$):" name="PriceSpin"/>
<spinner label="アクセス時間:" name="HoursSpin"/>
- <text label="常ã«è¨±å¯" name="AllowedText">
- 許å¯ã•れãŸä½äºº
- </text>
- <name_list name="AccessList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/>
- <button label="追加..." label_selected="追加..." name="add_allowed"/>
- <button label="削除" label_selected="削除" name="remove_allowed"/>
- <text label="ç¦æ­¢" name="BanCheck">
- ç¦æ­¢ã•れãŸä½äºº
- </text>
- <name_list name="BannedList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/>
- <button label="追加..." label_selected="追加..." name="add_banned"/>
- <button label="削除" label_selected="削除" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <text label="常ã«è¨±å¯" name="AllowedText">
+ 立入を許å¯ã•れãŸä½äºº
+ </text>
+ <name_list name="AccessList" tool_tip="(åˆè¨ˆ[LISTED] äººã€æœ€å¤§ [MAX] 人)"/>
+ <button label="追加" name="add_allowed"/>
+ <button label="削除" label_selected="削除" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="ç¦æ­¢" name="BanCheck">
+ ç«‹å…¥ã‚’ç¦æ­¢ã•れãŸä½äºº
+ </text>
+ <name_list name="BannedList" tool_tip="(åˆè¨ˆ [LISTED] äººã€æœ€å¤§ [MAX] 人)"/>
+ <button label="追加" name="add_banned"/>
+ <button label="削除" label_selected="削除" name="remove_banned"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_activeim.xml b/indra/newview/skins/default/xui/ja/floater_activeim.xml
new file mode 100644
index 0000000000..1c743e1fd2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="アクティブ㪠IM"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
index b61007d86e..8c2ac17ace 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
@@ -1,101 +1,187 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ
+ </floater.string>
+ <floater.string name="anim_too_long">
+ アニメーションファイルã®é•·ã•ã¯[LENGTH]ç§’ã§ã™ã€‚
+
+ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]ç§’ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="failed_file_read">
+ アニメーションファイルを読ã¿å–れã¾ã›ã‚“。
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ ä¸å®Œå…¨ãªãƒ•ァイル。
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ 制約定義を読ã¿ã¨ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH ファイルを開ã‘ã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ 無効㪠HIERARCHY ヘッダーã§ã™ã€‚.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ JOINT ãƒãƒ¼ãƒ ã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFFSET ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ 回転順åºã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ 回転軸をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ MOTION ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ フレーム数をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ フレームタイムをå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ ãƒã‚¸ã‚·ãƒ§ãƒ³å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ 回転値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ ファイルを開ã‘ã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ 読ã¿ã¨ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Mergechild åã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Mergeparent åã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ プロパティ値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ ループ値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ easeln 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ easeOut 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Hand morph 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ エモートåを読ã¿ã¨ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ ルートジョイントåãŒç„¡åйã§ã™ã€‚「hipã€ã‚’使用ã—ã¦ãã ã•ã„。
+ </floater.string>
<text name="name_label">
åå‰ï¼š
</text>
<text name="description_label">
説明:
</text>
- <spinner label="優先順ä½" name="priority"
- tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã§ä¸Šæ›¸ãå¯èƒ½ãªä»–ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’制御ã—ã¾ã™ã€‚" />
- <text name="preview_label">
- åŒæ™‚進行行動
- </text>
- <combo_box label="" name="preview_base_anim"
- tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚">
- <combo_box.item name="Standing" label="ç«‹ã¤" />
- <combo_box.item name="Walking" label="æ­©ã" />
- <combo_box.item name="Sitting" label="座る" />
- <combo_box.item name="Flying" label="飛行" />
- </combo_box>
- <pad height="7" />
- <check_box label="ループ" name="loop_check"
- tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™ã€‚" />
- <spinner label="イン(%)" name="loop_in_point"
- tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™ã€‚" label_width="45" left="70" width="100" />
- <spinner label="アウト(%)" name="loop_out_point"
- tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™ã€‚" label_width="60" left="170" width="100" />
+ <spinner label="優先順ä½" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã©ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’上書ãã™ã‚‹ã‹ã‚’決ã‚ã¾ã™"/>
+ <check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™"/>
+ <spinner label="イン(ï¼…)" label_width="45" left="60" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™" width="100"/>
+ <spinner label="アウト(ï¼…)" label_width="50" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™" width="100"/>
<text name="hand_label">
手ã®å‹•ã
</text>
- <combo_box label="" name="hand_pose_combo"
- tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æ‰‹ã®å‹•ãをコントロールã—ã¾ã™ã€‚">
- <combo_box.item name="Spread" label="広ãŒã‚‹" />
- <combo_box.item name="Relaxed" label="リラックス" />
- <combo_box.item name="PointBoth" label="両方を指ã™" />
- <combo_box.item name="Fist" label="拳" />
- <combo_box.item name="RelaxedLeft" label="リラックス左" />
- <combo_box.item name="PointLeft" label="左を指ã™" />
- <combo_box.item name="FistLeft" label="拳左" />
- <combo_box.item name="RelaxedRight" label="リラックスå³" />
- <combo_box.item name="PointRight" label="å³ã‚’指ã™" />
- <combo_box.item name="FistRight" label="拳å³" />
- <combo_box.item name="SaluteRight" label="敬礼å³" />
- <combo_box.item name="Typing" label="入力ã™ã‚‹" />
- <combo_box.item name="PeaceRight" label="ピース・サインå³" />
+ <combo_box label="" name="hand_pose_combo" tool_tip="アニメーションå†ç”Ÿä¸­ã®æ‰‹ã®å‹•ãを決ã‚ã¾ã™">
+ <combo_box.item label="広ã’ã‚‹" name="Spread"/>
+ <combo_box.item label="リラックス" name="Relaxed"/>
+ <combo_box.item label="指を指ã™ãƒ»ä¸¡æ‰‹" name="PointBoth"/>
+ <combo_box.item label="拳" name="Fist"/>
+ <combo_box.item label="リラックス・左" name="RelaxedLeft"/>
+ <combo_box.item label="指を指ã™ãƒ»å·¦" name="PointLeft"/>
+ <combo_box.item label="拳を上ã’る・左" name="FistLeft"/>
+ <combo_box.item label="リラックス・å³" name="RelaxedRight"/>
+ <combo_box.item label="指を指ã™ãƒ»å³" name="PointRight"/>
+ <combo_box.item label="拳を上ã’る・å³" name="FistRight"/>
+ <combo_box.item label="敬礼・å³" name="SaluteRight"/>
+ <combo_box.item label="タイピング" name="Typing"/>
+ <combo_box.item label="ピース・å³" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
表ç¾
</text>
- <combo_box label="" name="emote_combo"
- tool_tip="アニメーションã®é¡”を表情をコントロールã—ã¾ã™ã€‚">
- <combo_box.item name="[None]" label="None]" />
- <combo_box.item name="Aaaaah" label="アーーーーー" />
- <combo_box.item name="Afraid" label="怖れ" />
- <combo_box.item name="Angry" label="怒り" />
- <combo_box.item name="BigSmile" label="満é¢ã®ç¬‘ã¿" />
- <combo_box.item name="Bored" label="退屈" />
- <combo_box.item name="Cry" label="æ³£ã" />
- <combo_box.item name="Disdain" label="侮蔑" />
- <combo_box.item name="Embarrassed" label="困惑" />
- <combo_box.item name="Frown" label="ã—ã‹ã‚ã£é¢" />
- <combo_box.item name="Kiss" label="キス" />
- <combo_box.item name="Laugh" label="笑ã†" />
- <combo_box.item name="Plllppt" label="Plllppt" />
- <combo_box.item name="Repulsed" label="嫌悪感" />
- <combo_box.item name="Sad" label="悲ã—ã„" />
- <combo_box.item name="Shrug" label="è‚©ã‚’ã™ãã‚ã‚‹" />
- <combo_box.item name="Smile" label="笑ã¿" />
- <combo_box.item name="Surprise" label="驚ã" />
- <combo_box.item name="Wink" label="ウィンク" />
- <combo_box.item name="Worry" label="心é…" />
+ <combo_box label="" name="emote_combo" tool_tip="アニメーションå†ç”Ÿä¸­ã®é¡”ã®è¡¨æƒ…を決ã‚ã¾ã™">
+ <combo_box.item label="(ãªã—)" name="[None]"/>
+ <combo_box.item label="アーーーーー" name="Aaaaah"/>
+ <combo_box.item label="æã‚Œã‚‹" name="Afraid"/>
+ <combo_box.item label="怒る" name="Angry"/>
+ <combo_box.item label="満é¢ã®ç¬‘ã¿" name="BigSmile"/>
+ <combo_box.item label="退屈" name="Bored"/>
+ <combo_box.item label="æ³£ã" name="Cry"/>
+ <combo_box.item label="侮辱" name="Disdain"/>
+ <combo_box.item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed"/>
+ <combo_box.item label="ã—ã‹ã‚ã£é¢" name="Frown"/>
+ <combo_box.item label="キス" name="Kiss"/>
+ <combo_box.item label="笑ã†" name="Laugh"/>
+ <combo_box.item label="Plllppt" name="Plllppt"/>
+ <combo_box.item label="嫌悪感" name="Repulsed"/>
+ <combo_box.item label="悲ã—ã„" name="Sad"/>
+ <combo_box.item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug"/>
+ <combo_box.item label="微笑む" name="Smile"/>
+ <combo_box.item label="驚ã" name="Surprise"/>
+ <combo_box.item label="ウィンク" name="Wink"/>
+ <combo_box.item label="心é…ã™ã‚‹" name="Worry"/>
</combo_box>
- <spinner label="フェーズイï¾(ç§’)" name="ease_in_time"
- tool_tip="アニメーションã®ãƒ–レンド・イン時間(秒)" />
- <spinner label="フェーズアウト(秒)" name="ease_out_time"
- tool_tip="アニメーションã®ãƒ–レンド・アウト時間(秒)" />
- <button label="" name="play_btn"
- tool_tip="アニメーションã®å†ç”Ÿï¼ä¸€æ™‚åœæ­¢" />
- <button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ­¢" />
- <slider label="" name="playback_slider" />
+ <text name="preview_label">
+ åŒæ™‚進行行動
+ </text>
+ <combo_box label="" name="preview_base_anim" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚">
+ <combo_box.item label="ç«‹ã¤" name="Standing"/>
+ <combo_box.item label="æ­©ã" name="Walking"/>
+ <combo_box.item label="座る" name="Sitting"/>
+ <combo_box.item label="飛ã¶" name="Flying"/>
+ </combo_box>
+ <spinner label="イーズイン(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
+ <spinner label="イーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
+ <button label="" name="play_btn" tool_tip="アニメーションをå†ç”Ÿã™ã‚‹"/>
+ <button name="pause_btn" tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹"/>
+ <button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ­¢"/>
+ <slider label="" name="playback_slider"/>
<text name="bad_animation_text">
- アニメーション・ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
+ アニメーションファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸBVHファイルを推奨ã—ã¾ã™ã€‚
</text>
- <button label="å–り消ã—" name="cancel_btn" />
- <button label="アップロードL$[AMOUNT]" name="ok_btn" />
- <text name="failed_to_initialize">
- ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ
- </text>
- <text name="anim_too_long">
- アニメーションファイルã®é•·ã•ã¯[LENGTH]ç§’ã§ã™ã€‚
-
-ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]ç§’ã§ã™ã€‚
- </text>
- <text name="failed_file_read">
- アニメーションファイルを読ã¿å–れã¾ã›ã‚“。
-
-[STATUS]
- </text>
+ <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_auction.xml b/indra/newview/skins/default/xui/ja/floater_auction.xml
index ba34ec488d..e9aa287f2c 100644
--- a/indra/newview/skins/default/xui/ja/floater_auction.xml
+++ b/indra/newview/skins/default/xui/ja/floater_auction.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="リンデンã®åœŸåœ°å£²è²·é–‹å§‹">
- <check_box label="黄色ã®é¸æŠžãƒ•ェンスをå«ã‚ã‚‹" name="fence_check" />
- <button label="スナップショット" label_selected="スナップショット"
- name="snapshot_btn" />
- <button label="OK" label_selected="OK" name="ok_btn" />
- <text name="already for sale">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="リンデンランドã®è²©å£²é–‹å§‹">
+ <floater.string name="already for sale">
売り出ã—中ã®åŒºç”»ã¯ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã§ãã¾ã›ã‚“。
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="黄色ã®é¸æŠžãƒ•ェンスをå«ã‚ã‚‹" name="fence_check"/>
+ <button label="スナップショット" label_selected="スナップショット" name="snapshot_btn"/>
+ <button label="誰ã«ã§ã‚‚販売" label_selected="誰ã«ã§ã‚‚販売" name="sell_to_anyone_btn"/>
+ <button label="設定をクリア" label_selected="設定をクリア" name="reset_parcel_btn"/>
+ <button label="オークション開始" label_selected="オークション開始" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
index ea07684652..7f965e490d 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -1,40 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="ä½äººã‚’é¸æŠž" min_width="275" width="275">
+<floater min_width="275" name="avatarpicker" title="ä½äººã‚’é¸æŠž" width="275">
+ <floater.string name="not_found">
+ 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ </floater.string>
+ <floater.string name="no_one_near">
+ è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="no_results">
+ æ¤œç´¢çµæžœï¼šã‚¼ãƒ­
+ </floater.string>
+ <floater.string name="searching">
+ 検索中...
+ </floater.string>
+ <string label="OK" label_selected="OK" name="Select">
+ é¸æŠž
+ </string>
+ <string name="Close">
+ é–‰ã˜ã‚‹
+ </string>
<tab_container name="ResidentChooserTabs" width="265">
<panel label="検索" name="SearchPanel" width="145">
<text name="InstructSearchResidentName">
- ä½äººã®åå‰ã®ä¸€éƒ¨ã‚’入力:
+ åå‰ã®ä¸€éƒ¨ã‚’入力:
</text>
<button label="検索" label_selected="検索" name="Find"/>
</panel>
- <panel label="コーリングカード" name="CallingCardsPanel" width="145">
- <text name="InstructSelectCallingCard">
- ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é¸æŠžï¼š
+ <panel label="フレンド" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžï¼š
</text>
</panel>
<panel label="自分ã®è¿‘ã" name="NearMePanel" width="145">
<text name="InstructSelectResident">
- è¿‘ãã®ä½äººã‚’é¸æŠžï¼š
+ è¿‘ãã®äººã‚’é¸æŠžï¼š
</text>
- <button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
<slider label="範囲" name="near_me_range"/>
<text name="meters" width="50">
メートル
</text>
+ <button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
</panel>
</tab_container>
- <button label="é¸æŠž" label_selected="é¸æŠž" name="Select"/>
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
- <string name="not_found">
- 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
- </string>
- <string name="no_one_near">
- è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“
- </string>
- <string name="no_results">
- æ¤œç´¢çµæžœï¼šã‚¼ãƒ­
- </string>
- <string name="searching">
- 検索中...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
index 95940dba96..0ea913e66a 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
@@ -1,31 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="ã‚¢ãƒã‚¿ãƒ¼ãƒ»ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼">
- <text name="label">
+<floater name="avatar_texture_debug" title="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£">
+ <floater.string name="InvalidAvatar">
+ 無効ãªã‚¢ãƒã‚¿ãƒ¼
+ </floater.string>
+ <text name="label" width="100">
ベークドテクスãƒãƒ£
</text>
<text name="composite_label" width="128">
- åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼
+ åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£
</text>
- <button label="テクスãƒãƒ£IDä¸€è¦§ã‚’ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump"/>
- <texture_picker label="髪型" name="hair-baked"/>
- <texture_picker label="髪" name="hair"/>
- <texture_picker label="é ­" name="head-baked"/>
- <texture_picker label="メイクアップ" name="head bodypaint"/>
- <texture_picker label="ç›®" name="eyes-baked"/>
- <texture_picker label="ç›®" name="iris"/>
- <texture_picker label="上åŠèº«" name="upper-baked"/>
- <texture_picker label="上åŠèº«ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper bodypaint"/>
- <texture_picker label="(下ç€ã®ï¼‰ã‚·ãƒ£ãƒ„" name="undershirt"/>
- <texture_picker label="手袋" name="gloves"/>
- <texture_picker label="シャツ" name="shirt"/>
- <texture_picker label="上ç€" name="upper jacket"/>
- <texture_picker label="下åŠèº«" name="lower-baked"/>
- <texture_picker label="下åŠèº«ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower bodypaint"/>
- <texture_picker label="(下ç€ã®ï¼‰ãƒ‘ンツ" name="underpants"/>
- <texture_picker label="é´ä¸‹" name="socks"/>
- <texture_picker label="é´" name="shoes"/>
- <texture_picker label="ズボン" name="pants"/>
- <texture_picker label="上ç€" name="lower jacket"/>
- <texture_picker label="スカート" name="skirt-baked"/>
- <texture_picker label="スカート" name="skirt"/>
+ <button label="テクスãƒãƒ£IDä¸€è¦§ã‚’ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump" width="200"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <texture_picker label="髪" name="hair-baked"/>
+ <texture_picker label="髪" name="hair_grain"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/>
+ <texture_picker label="é ­" name="head-baked"/>
+ <texture_picker label="メイクアップ" name="head_bodypaint"/>
+ <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="head_alpha"/>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="head_tattoo"/>
+ <texture_picker label="ç›®" name="eyes-baked"/>
+ <texture_picker label="ç›®" name="eyes_iris"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="eyes_alpha"/>
+ <texture_picker label="上åŠèº«" name="upper-baked"/>
+ <texture_picker label="上åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="upper_bodypaint"/>
+ <texture_picker label="下ç€ã‚·ãƒ£ãƒ„" name="upper_undershirt"/>
+ <texture_picker label="手袋" name="upper_gloves"/>
+ <texture_picker label="シャツ" name="upper_shirt"/>
+ <texture_picker label="上ç€" name="upper_jacket"/>
+ <texture_picker label="アルファ(上)" name="upper_alpha"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper_tattoo"/>
+ <texture_picker label="下åŠèº«" name="lower-baked"/>
+ <texture_picker label="下åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="lower_bodypaint"/>
+ <texture_picker label="下ç€ãƒ‘ンツ" name="lower_underpants"/>
+ <texture_picker label="é´ä¸‹" name="lower_socks"/>
+ <texture_picker label="é´" name="lower_shoes"/>
+ <texture_picker label="パンツ" name="lower_pants"/>
+ <texture_picker label="ジャケット" name="lower_jacket"/>
+ <texture_picker label="アルファ(下)" name="lower_alpha"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower_tattoo"/>
+ <texture_picker label="スカート" name="skirt-baked"/>
+ <texture_picker label="スカート" name="skirt"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index 2065656732..d2f4798949 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="beacons" title="ビーコン(標識)">
<panel name="beacons_panel">
- <check_box label="タッï¾ï½µï¾ï¾˜ï½°ã®ï½½ï½¸ï¾˜ï¾Œï¾Ÿï¾„ã‚’å«ã‚€ï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„" name="touch_only"/>
- <check_box label="スクリプト・オブジェクト" name="scripted"/>
- <check_box label="物ç†çš„オブジェクト" name="physical"/>
+ <text name="label_show">
+ 表示:
+ </text>
+ <check_box label="ビーコン(標識)" name="beacons"/>
+ <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="ビーコン(標識)ã®å¹…">
+ 幅:
+ </text>
+ <text name="label_objects">
+ 対象オブジェクト:
+ </text>
+ <check_box label="物ç†çš„" name="physical"/>
+ <check_box label="スクリプト" name="scripted"/>
+ <check_box label="触れる" name="touch_only"/>
<check_box label="音æº" name="sounds"/>
<check_box label="パーティクルæº" name="particles"/>
- <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°" name="highlights"/>
- <check_box label="ビーコン(標識)ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°" name="beacons"/>
- <text name="beacon_width_label">
- ビーコン(標識)ã®å¹…
- </text>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 49348aaa10..8cb67ca521 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -1,8 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="build options floater" title="グリッドã®ã‚ªãƒ—ション">
- <spinner label="グリッドå˜ä½ï¼ˆï¾’ートル)" name="GridResolution" />
- <spinner label="グリッド範囲(メートル)" name="GridDrawSize" />
- <check_box label="サブユニット・スナッピングを有効化" name="GridSubUnit" />
- <check_box label="æ–­é¢ã‚’表示" name="GridCrossSection" />
- <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="グリッドオプション">
+ <spinner label="グリッドå˜ä½ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰" name="GridResolution"/>
+ <spinner label="グリッド゙範囲(メートル)" name="GridDrawSize"/>
+ <check_box label="より細ã‹ã„å˜ä½ã§ã‚¹ãƒŠãƒƒãƒ—フィット" name="GridSubUnit"/>
+ <check_box label="横断é¢ã‚’表示" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="グリッドã®ä¸é€æ˜Žåº¦">
+ ä¸é€æ˜Žåº¦ï¼š
+ </text>
+ <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index 6ee90038fb..be24960c6e 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="コンテンツ権é™ã®ä¸€æ‹¬å¤‰æ›´">
- <text name="applyto">
- コンテンツã®ç¨®é¡ž
- </text>
+<floater name="floaterbulkperms" title="ä¸­èº«ã®æ¨©é™ã®ç·¨é›†">
+ <floater.string name="nothing_to_modify_text">
+ é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="status_text">
+ [NAME]ã«æ¨©é™ã‚’設定中ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="start_text">
+ 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="done_text">
+ 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ
+ </floater.string>
<check_box label="アニメーション" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="アニメーション"/>
<check_box label="身体部ä½" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="身体部ä½"/>
<check_box label="æœ" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="衣類"/>
<check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/>
- <check_box label="ランドマーク" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="ジェスãƒãƒ£ãƒ¼"/>
<check_box label="ノートカード" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="ノートカード"/>
<check_box label="オブジェクト" name="check_object"/>
+ <icon name="icon_object" tool_tip="オブジェクト"/>
<check_box label="スクリプト" name="check_script"/>
+ <icon name="icon_script" tool_tip="スクリプト"/>
<check_box label="サウンド" name="check_sound"/>
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/>
- <button label="å…¨ã¦é¸æŠž" label_selected="å…¨ã¦" name="check_all"/>
- <button label="å…¨ã¦è§£é™¤" label_selected="ãªã—" name="check_none"/>
+ <icon name="icon_sound" tool_tip="サウンド"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
+ <icon name="icon_texture" tool_tip="テクスãƒãƒ£"/>
+ <button label="ã™ã¹ã¦ã« √" label_selected="å…¨ã¦" name="check_all"/>
+ <button label="クリア" label_selected="ãªã—" name="check_none"/>
<text name="newperms">
- æ–°ã—ã„æ¨©é™
+ æ–°ã—ã„ä¸­èº«ã®æ¨©é™
+ </text>
+ <text name="GroupLabel">
+ グループ:
</text>
- <check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/>
- <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作:
+ <check_box label="共有" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ 全員:
+ </text>
+ <check_box label="コピー" name="everyone_copy"/>
+ <text name="NextOwnerLabel" left="160">
+ æ¬¡ã®æ‰€æœ‰è€…:
</text>
<check_box label="修正" name="next_owner_modify"/>
<check_box label="コピー" name="next_owner_copy"/>
- <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/>
- <button label="ヘルプ" name="help"/>
- <button label="é©ç”¨" name="apply"/>
- <button label="é–‰ã˜ã‚‹" name="close"/>
- <string name="nothing_to_modify_text">
- é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™
- </string>
- <string name="status_text">
- [NAME]ã«æ¨©é™ã‚’設定中ã§ã™ã€‚
- </string>
- <string name="start_text">
- 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™
- </string>
- <string name="done_text">
- 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ
- </string>
+ <check_box initial_value="true" label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
+ <button label="OK" name="apply"/>
+ <button label="キャンセル" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index cbd6a2f9e2..8a1e19b852 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -1,21 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_bumps" title="è¡çªã®è¨˜éŒ²">
- <text name="none_detected">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="è¡çªãƒ»ãƒ—ッシュ・打撃">
+ <floater.string name="none_detected">
検出ãªã—
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST]ãŒã€ã‚ãªãŸã«ã¶ã¤ã‹ã‚Šã¾ã—ãŸã€‚
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’プッシュã—ã¾ã—ãŸã€‚
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST]ãŒã€ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST]ãŒã€ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index 8bf660d71d..69d4faf5b8 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_buy_contents" title="コンテンツを購入" width="340" min_width="340">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="340" name="floater_buy_contents" title="中身ã®è³¼å…¥" width="340">
<text name="contains_text" width="320">
- [NAME]ã®å†…容:
+ [NAME]ã®ä¸­èº«ï¼š
</text>
<scroll_list name="item_list" width="310"/>
<text name="buy_text" width="320">
- コンテンツを[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+ 中身を[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
</text>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" width="73"/>
- <button label="購入" label_selected="購入" name="buy_btn" width="73" left_delta="-77"/>
- <check_box label="今ã™ãæœã‚’ç€ã‚‹" name="wear_check" left_delta="-125"/>
+ <button label="購入" label_selected="購入" left_delta="-77" name="buy_btn" width="73"/>
+ <check_box label="今ã™ãæœã‚’ç€ã‚‹" left_delta="-125" name="wear_check"/>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯)
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯)
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index 9d5aea612b..32de533dc4 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -1,68 +1,66 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="buy currency" title="貨幣購入">
- <text name="info_buying">
- 貨幣を購入:
- </text>
- <text name="info_cannot_buy">
- ç¾åœ¨è³¼å…¥ä¸å¯ï¼š
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="L$ ã®è³¼å…¥">
+ <floater.string name="buy_currency">
+ 約 [LOCALAMOUNT] 㧠L$ [LINDENS] を購入
+ </floater.string>
<text name="info_need_more">
- ã•らã«ãŠé‡‘ãŒå¿…è¦ã§ã™ï¼š
+ L$ ãŒè¶³ã‚Šã¾ã›ã‚“
</text>
- <text name="error_message">
- 何ã‹å¤‰ã§ã™ã€‚
- </text>
- <button label="ウェブ・サイトã«ç§»å‹•" name="error_web" width="140"/>
<text name="contacting">
LindeXã¨ã‚³ãƒ³ã‚¿ã‚¯ãƒˆä¸­â€¦
</text>
- <text name="buy_action_unknown">
- LindeX通貨両替ã§L$を購入
+ <text name="info_buying">
+ L$ ã®è³¼å…¥
</text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
+ <text name="balance_label">
+ 残高
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
</text>
<text name="currency_action">
- L$購入
+ 購入希望é¡
+ </text>
+ <text name="currency_label">
+ L$
</text>
- <line_editor name="currency_amt">
+ <line_editor label="L$" name="currency_amt">
1234
</line_editor>
- <text name="currency_est">
- ç´„US$ [USD]
- </text>
- <text name="getting_data" left_delta="3">
- データをå–å¾—ã—ã¦ã„ã¾ã™...
- </text>
- <text name="balance_label">
- ç¾åœ¨æ‰€æœ‰ã—ã¦ã„る金é¡
+ <text name="buying_label">
+ 価格
</text>
- <text name="balance_amount">
- L$ [AMT]
+ <text name="currency_est">
+ ç´„ [LOCALAMOUNT]
</text>
- <text name="buying_label">
- 購入ã™ã‚‹é‡‘é¡
+ <text left_delta="3" name="getting_data">
+ 見ç©ã‚‚り中...
</text>
- <text name="buying_amount">
- L$ [AMT]
+ <text name="buy_action">
+ [NAME] L$ [PRICE]
</text>
<text name="total_label">
- åˆè¨ˆæ®‹é«˜
+ è³¼å…¥å¾Œã®æ®‹é«˜
</text>
<text name="total_amount">
L$ [AMT]
</text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP æ›ç®—レート]
+ </text>
+ <text name="exchange_rate_note">
+ 金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚
+ </text>
<text name="purchase_warning_repurchase">
- ã“ã®è³¼è²·ã®ç¢ºèªã§ã¯ã€é€šè²¨ã ã‘を購入ã—ã¾ã™ã€‚
-冿“作ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚
+ ã“ã®å–引を決定ã™ã‚‹ã¨ã€L$ を購入ã—ã¾ã™ã€‚オブジェクトã¯è³¼å…¥ã—ã¾ã›ã‚“。
</text>
<text name="purchase_warning_notenough">
- ã‚ãªãŸãŒè²·ã†ãƒªãƒ³ãƒ‡ãƒ³ãƒ»ãƒ‰ãƒ«ã§ã¯è¶³ã‚Šã¾ã›ã‚“。
-購入é¡ã‚’増やã—ã¦ãã ã•ã„。
+ 購入ã—よã†ã¨ã—ã¦ã„ã‚‹ L$ ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ 金é¡ã‚’上ã’ã¦ãã ã•ã„。
</text>
- <button label="購入" name="buy_btn" />
- <button label="å–り消ã—" name="cancel_btn" />
- <text name="buy_currency">
- ç´„US$ [USD]ã§L$ [LINDENS]を購入
+ <button label="購入ã™ã‚‹" name="buy_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ 購入ã§ãã¾ã›ã‚“
</text>
+ <button label="Web サイトã«ç§»å‹•" name="error_web" width="140"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
index 1ccd1f53a4..a50f36b6f3 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
@@ -1,5 +1,132 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="土地を購入">
+<floater name="buy land" title="土地ã®è³¼å…¥">
+ <floater.string name="can_resell">
+ å†è²©å¯èƒ½
+ </floater.string>
+ <floater.string name="can_not_resell">
+ å†è²©ä¸å¯èƒ½
+ </floater.string>
+ <floater.string name="can_change">
+ çµ±åˆãƒ»å†åˆ†å‰²å¯èƒ½
+ </floater.string>
+ <floater.string name="can_not_change">
+ çµ±åˆãƒ»å†åˆ†å‰²ä¸å¯èƒ½
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="no_land_selected">
+ 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れよりå°ã•ãªç¯„å›²ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </floater.string>
+ <floater.string name="no_permission">
+ ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™
+ </floater.string>
+ <floater.string name="group_already_owns">
+ グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="you_already_own">
+ ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="no_public_land">
+ é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ ä»–ã®ä½¿ç”¨è€…ã«æ‰€æœ‰ã•れãŸåœŸåœ°ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
+ã“れよりå°ã•ãªç¯„å›²ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </floater.string>
+ <floater.string name="processing">
+ 購入処ç†ä¸­...
+
+(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰
+ </floater.string>
+ <floater.string name="fetching_error">
+ åœŸåœ°è³¼å…¥ã®æƒ…報入手中ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—ãŸ
+ </floater.string>
+ <floater.string name="buying_will">
+ ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š
+ </floater.string>
+ <floater.string name="buying_for_group">
+ グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ ç¾åœ¨è³¼å…¥ä¸å¯ï¼š
+ </floater.string>
+ <floater.string name="not_for_sale">
+ 販売対象外:
+ </floater.string>
+ <floater.string name="none_needed">
+ 一切必è¦ãªã—
+ </floater.string>
+ <floater.string name="must_upgrade">
+ アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="cant_own_land">
+ ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™
+ </floater.string>
+ <floater.string name="land_holdings">
+ ã‚ãªãŸã¯ã€[BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ã†
+ </floater.string>
+ <floater.string name="buy_for_US">
+ L$ [AMOUNT] ã‚’ã€ç´„ [LOCAL_AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="parcel_meters">
+ ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã§ã™ã€‚
+ </floater.string>
+ <floater.string name="premium_land">
+ ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="discounted_land">
+ ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] 平方メートル
+オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ オブジェクト込ã¿ã§è²©å£²
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$[PRICE_PER_SQM]/平方メートル)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ 価格ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™
+ </floater.string>
+ <floater.string name="balance_left">
+ 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™
+ </floater.string>
+ <floater.string name="balance_needed">
+ ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“)
+ </floater.string>
+ <floater.string name="icon_PG" value="Parcel_PG_Dark"/>
+ <floater.string name="icon_M" value="Parcel_M_Dark"/>
+ <floater.string name="icon_R" value="Parcel_R_Dark"/>
<text name="region_name_label">
地域:
</text>
@@ -27,10 +154,10 @@
<text name="resellable_changeable_label">
ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ï¼š
</text>
- <text name="resellable_clause">
+ <text left="460" name="resellable_clause">
å†è²©ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚
</text>
- <text name="changeable_clause">
+ <text left="460" name="changeable_clause">
çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚
</text>
<text name="covenant_text">
@@ -51,15 +178,15 @@
サイズ:
</text>
<text bottom_delta="-37" height="48" name="info_size">
- 1024平方メートル
+ 1024 平方メートル
</text>
<text name="info_price_label">
価格:
</text>
<text name="info_price">
L$ 1500
- (L$ 1.1/平方メートル)
- オブジェクトも土地販売価格ã«å«ã¾ã‚Œã¾ã™
+(L$ 1.1/平方メートル)
+オブジェクトも土地販売価格ã«å«ã¾ã‚Œã¾ã™
</text>
<text name="info_action">
ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š
@@ -67,24 +194,24 @@
<text name="error_message">
何ã‹å¤‰ã§ã™
</text>
- <button label="ウェブ・サイトã«ç§»å‹•" name="error_web"/>
+ <button label="Webサイトã«ç§»å‹•" name="error_web"/>
<text name="account_action">
- プレミアム・メンãƒãƒ¼ã«ã‚¢ãƒƒãƒ—グレード
+ プレミアム会員ã«ã‚¢ãƒƒãƒ—グレード
</text>
<text name="account_reason">
- åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム・メンãƒãƒ¼ã ã‘ã§ã™
+ åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム会員ã ã‘ã§ã™
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="月é¡9.95ç±³ãƒ‰ãƒ«ã€æœˆæ‰•ã„" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="月é¡7.50米ドルã€å¹´4回払ã„" />
- <combo_box.item name="US$6.00/month,billedannually" label="月é¡6.00米ドルã€å¹´æ‰•ã„" />
+ <combo_box.item label="æœˆé¡ 9.95米ドル〠月払ã„" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="æœˆé¡ 7.50米ドル〠年4回3ヶ月毎" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="æœˆé¡ 6.00米ドル〠年間一括払ã„" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
毎月ã®åœŸåœ°ä½¿ç”¨æ–™ã‚’US$40ã«å¼•ã上ã’ã¾ã™
</text>
<text name="land_use_reason">
- ã‚ãªãŸã¯1,309平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚
-ã“ã®åŒºç”»ã¯512平方メートルã§ã™ã€‚
+ ã‚ãªãŸã¯ 1309 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚
+ã“ã®åŒºç”»ã®å¤§ãã•ã¯ã€512 平方メートルã§ã™ã€‚
</text>
<text name="purchase_action">
Joe Residentã«L$4000支払ã£ã¦åœŸåœ°ã‚’購入
@@ -99,140 +226,12 @@
1000
</line_editor>
<text name="currency_est">
- ç´„US$ [AMOUNT2]
+ ç´„ [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
所æŒé‡‘㯠L$2,100ã§ã™ã€‚
</text>
- <check_box label="[AMOUNT]平方メートルã®è²¢çŒ®é¢ç©ã‚’グループã‹ã‚‰å–り除ã" name="remove_contribution"/>
+ <check_box label="グループã‹ã‚‰ [AMOUNT] 平方メートルã®è²¢çŒ®ã‚’å–り除ãã¾ã™ã€‚" name="remove_contribution"/>
<button label="購入" name="buy_btn"/>
<button label="å–り消ã—" name="cancel_btn"/>
- <string name="can_resell">
- å†è²©å¯èƒ½
- </string>
- <string name="can_not_resell">
- å†è²©ä¸å¯èƒ½
- </string>
- <string name="can_change">
- çµ±åˆï¼å†åˆ†å‰²å¯èƒ½
- </string>
- <string name="can_not_change">
- çµ±åˆï¼å†åˆ†å‰²ä¸å¯èƒ½
- </string>
- <string name="cant_buy_for_group">
- ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="no_land_selected">
- 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="multiple_parcels_selected">
- 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </string>
- <string name="no_permission">
- ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="parcel_not_for_sale">
- é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™
- </string>
- <string name="group_already_owns">
- グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
- </string>
- <string name="you_already_own">
- ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
- </string>
- <string name="set_to_sell_to_other">
- é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™
- </string>
- <string name="no_public_land">
- é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“
- </string>
- <string name="not_owned_by_you">
- ä»–ã®ä½¿ç”¨è€…ã«æ‰€æœ‰ã•れãŸåœŸåœ°ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </string>
- <string name="processing">
- 購入処ç†ä¸­...
-
-(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰
- </string>
- <string name="fetching_error">
- åœŸåœ°è³¼å…¥ã®æƒ…報入手中ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—ãŸ
- </string>
- <string name="buying_will">
- ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š
- </string>
- <string name="buying_for_group">
- グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š
- </string>
- <string name="cannot_buy_now">
- ç¾åœ¨è³¼å…¥ä¸å¯ï¼š
- </string>
- <string name="not_for_sale">
- 販売対象外:
- </string>
- <string name="none_needed">
- 一切必è¦ãªã—
- </string>
- <string name="must_upgrade">
- アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“
- </string>
- <string name="cant_own_land">
- ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™
- </string>
- <string name="land_holdings">
- ã‚ãªãŸã¯ [BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™
- </string>
- <string name="pay_to_for_land">
- ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ã†
- </string>
- <string name="buy_for_US">
- ç´„US$ [AMOUNT2]ã§L$ [AMOUNT]を購入
- </string>
- <string name="parcel_meters">
- ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã‚りã¾ã™
- </string>
- <string name="premium_land">
- ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
- </string>
- <string name="discounted_land">
- ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
- </string>
- <string name="meters_supports_object">
- [AMOUNT]平方メートルã§ã‚れã°ã€
-[AMOUNT2]個ã®ã‚ªãƒ–ジェクトãŒã‚µãƒ
-ートã•れã¾ã™
- </string>
- <string name="sold_with_objects">
- オブジェクトã¨å…±ã«è²©å£²æ¸ˆã¿
- </string>
- <string name="sold_without_objects">
- オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/平方メートル)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ 価格ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™
- </string>
- <string name="have_enough_lindens">
- ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™
- </string>
- <string name="not_enough_lindens">
- ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™
- </string>
- <string name="balance_left">
- 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™
- </string>
- <string name="balance_needed">
- ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™
- </string>
- <string name="no_parcel_selected">
- (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“)
- </string>
- <string name="buy_currency">
- ç´„US$ [USD]ã§L$ [LINDENS]を購入
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index 1b5dd8b979..7a5b7dc140 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入">
<text name="contents_text">
- ãŠã‚ˆã³ãã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„:
+ 中身:
</text>
<text name="buy_text">
[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
</text>
- <button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn" />
- <button label="購入" label_selected="購入" name="buy_btn" />
+ <button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn"/>
+ <button label="購入" label_selected="購入" name="buy_btn"/>
<text name="title_buy_text">
購入
</text>
<string name="title_buy_copy_text">
- 次ã®ã‚‚ã®ã‚’è²·ã†
+ 次ã®ã‚‚ã®ã‚’購入
</string>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯)
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯)
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index bb87b194a4..3730bcd385 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="camera_floater">
<floater.string name="rotate_tooltip">
フォーカスを中心ã«ã‚«ãƒ¡ãƒ©ã‚’回転
@@ -10,7 +10,22 @@
カメラを上下左å³ã«ç§»å‹•
</floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«ç§»å‹•"/>
- <joystick_zoom name="zoom" tool_tip="フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム"/>
+ <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/>
+ <panel name="zoom" tool_tip="å‘ã„ã¦ã„る方法ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
+ <slider_bar name="zoom_slider" tool_tip="å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="後方視界"/>
+ <button name="group_view" tool_tip="グループ視界"/>
+ <button name="front_view" tool_tip="剿–¹è¦–界"/>
+ <button name="mouselook_view" tool_tip="一人称視界"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="カメラを回ã™"/>
+ <button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/>
+ <button label="" name="avatarview_btn" tool_tip="ã‚¢ãƒã‚¿ãƒ¼è¦–点"/>
+ <button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_choose_group.xml b/indra/newview/skins/default/xui/ja/floater_choose_group.xml
index 08c91f1895..7d91cb69ed 100644
--- a/indra/newview/skins/default/xui/ja/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/ja/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="groups" title="グループ">
<text name="groupdesc">
ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžï¼š
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
index 8047e49b75..dc87d27a15 100644
--- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="カラー・ピッカー">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="カラーピッカー">
<text name="r_val_text">
赤:
</text>
@@ -18,14 +18,14 @@
<text name="l_val_text">
è¼åº¦ï¼š
</text>
- <check_box label="ãŸã ã¡ã«é©ç”¨" name="apply_immediate" />
- <button label="" label_selected="" name="color_pipette" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" />
- <button label="é¸æŠž" label_selected="é¸æŠž" name="select_btn" />
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate"/>
+ <button label="" label_selected="" name="color_pipette"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
ç¾åœ¨ã®è‰²ï¼š
</text>
<text name="(Drag below to save.)">
- ドラッグã—ã¦ä¿å­˜
+ (下ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ä¿å­˜ï¼‰
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_critical.xml b/indra/newview/skins/default/xui/ja/floater_critical.xml
index 39f6ee8e3f..f69c24622a 100644
--- a/indra/newview/skins/default/xui/ja/floater_critical.xml
+++ b/indra/newview/skins/default/xui/ja/floater_critical.xml
@@ -3,10 +3,10 @@
<button label="続行" label_selected="続行" name="Continue" />
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
<text name="tos_title">
- クリティカル・メッセージ
+ クリティカルメッセージ
</text>
<text name="tos_heading">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ³¨æ„æ·±ããŠèª­ã¿ãã ã•ã„。
+ 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’注æ„ã—ã¦ã‚ˆããŠèª­ã¿ãã ã•ã„。
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml
index d51fb74807..4d8b91ff99 100644
--- a/indra/newview/skins/default/xui/ja/floater_customize.xml
+++ b/indra/newview/skins/default/xui/ja/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater customize" title="容姿">
<tab_container name="customize tab container">
- <placeholder label="身体部ä½" name="body_parts_placeholder"/>
+ <text label="身体部ä½" name="body_parts_placeholder">
+ 身体部ä½
+ </text>
<panel label="シェイプ" name="Shape">
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
<button label="身体" label_selected="身体" name="Body"/>
@@ -14,8 +16,8 @@
<button label="胴体" label_selected="胴体" name="Torso"/>
<button label="両脚" label_selected="両脚" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="女性"/>
- <radio_item name="radio2" label="男性"/>
+ <radio_item label="女性" name="radio" value="0"/>
+ <radio_item label="男性" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,8 +35,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„シェイプ(体型)ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾
-ã—ょã†ã€‚å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -49,7 +50,7 @@
<panel label="スキン" name="Skin">
<button label="スキンã®è‰²" label_selected="スキンã®è‰²" name="Skin Color"/>
<button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/>
- <button label="メイクアップ" label_selected="メイクアップ" name="Makeup"/>
+ <button label="メイク" label_selected="メイク" name="Makeup"/>
<button label="身体細部" label_selected="身体細部" name="Body Detail"/>
<text name="title">
[DESC]
@@ -67,8 +68,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„スキンをæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スキンをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -105,8 +105,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„髪型をæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -137,8 +136,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„眼をæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„目をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -152,12 +150,14 @@
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
</panel>
- <panel label="æœ" name="clothes_placeholder"/>
+ <text label="æœ" name="clothes_placeholder">
+ 衣類
+ </text>
<panel label="シャツ" name="Shirt">
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
@@ -177,8 +177,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„シャツをæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -187,11 +186,11 @@
シャツ:
</text>
</panel>
- <panel label="ズボン" name="Pants">
+ <panel label="パンツ" name="Pants">
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„ズボンを作æˆ" label_selected="æ–°ã—ã„ズボンを作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
@@ -211,14 +210,13 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„ズボンをæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„パンツを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
<text name="Item Action Label">
- ズボン:
+ パンツ:
</text>
</panel>
<panel label="é´" name="Shoes">
@@ -238,9 +236,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„é´ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -248,8 +246,7 @@
é´ï¼š
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -272,9 +269,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„é´ä¸‹ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ä¸‹ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -282,8 +279,7 @@
é´ä¸‹ï¼š
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -306,9 +302,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„上ç€ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -317,8 +313,7 @@
</text>
<texture_picker label="上åŠèº«ã®ç”Ÿåœ°" name="Upper Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<texture_picker label="下層生地" name="Lower Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -341,9 +336,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„æ‰‹è¢‹ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„æ‰‹è¢‹ã‚’ã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -351,8 +346,7 @@
手袋:
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -375,9 +369,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„下ç€ã‚’æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ã‚’ç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -385,8 +379,7 @@
下ç€ã‚·ãƒ£ãƒ„:
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -409,9 +402,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„パンツをæŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -419,8 +412,7 @@
下ç€ãƒ‘ンツ:
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -443,9 +435,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æ–°ã—ã„スカートをæŒç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¾ã—ょã†ã€‚
- å®Œå…¨ã«æ–°è¦ã®çŠ¶æ…‹ã‹ã‚‰ä½œæˆã—ã¦è£…ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -453,15 +445,85 @@
スカート:
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
+ <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
</panel>
+ <panel label="タトゥ" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: 修正ä¸å¯
+ </text>
+ <text name="title_loading">
+ [DESC]: ローディング...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: 未ç€ç”¨
+ </text>
+ <text name="path">
+ å‚ç…§ [PATH]
+ </text>
+ <text name="not worn instructions">
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ </text>
+ <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/>
+ <text name="no modify instructions">
+ ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </text>
+ <text name="Item Action Label">
+ タトゥ:
+ </text>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
+ <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
+ </panel>
+ <panel label="アルファ" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: 修正ä¸å¯
+ </text>
+ <text name="title_loading">
+ [DESC]: ローディング...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: 未ç€ç”¨
+ </text>
+ <text name="path">
+ å‚ç…§ [PATH]
+ </text>
+ <text name="not worn instructions">
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ </text>
+ <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/>
+ <text name="no modify instructions">
+ ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </text>
+ <text name="Item Action Label">
+ アルファ:
+ </text>
+ <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
+ <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
+ </panel>
</tab_container>
+ <button label="スクリプト情報" label_selected="スクリプト情報" name="script_info" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«ä»˜ã„ã¦ã„るスクリプトを表示ã™ã‚‹"/>
+ <button label="アウトフィット作æˆ" label_selected="アウトフィット作æˆ" name="make_outfit_btn"/>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="æœè£…を作æˆ..." label_selected="æœè£…を作æˆ..." name="Make Outfit"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
index 2d8b54cdd5..3bd5ed2837 100644
--- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
@@ -84,10 +84,10 @@
<text name="DayCycleText3">
プレビュー:
</text>
- <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" />
+ <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" left_delta="70"/>
<button label="åœæ­¢!" label_selected="åœæ­¢" name="WLStopAnimSky" />
<button label="ä¸å‹•ç”£ã®æ™‚刻を使用"
- label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" />
+ label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" width="140"/>
<button label="デイ・テストをä¿å­˜"
label_selected="デイ・テストをä¿å­˜" name="WLSaveDayCycle" />
<button label="デイ・テストをロード"
diff --git a/indra/newview/skins/default/xui/ja/floater_device_settings.xml b/indra/newview/skins/default/xui/ja/floater_device_settings.xml
index 5c258df9fd..3ae7356fb6 100644
--- a/indra/newview/skins/default/xui/ja/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_device_settings.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_device_settings" title="ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨­å®š" /> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_device_settings" title="ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨­å®š"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_env_settings.xml b/indra/newview/skins/default/xui/ja/floater_env_settings.xml
index 48c22323f8..1d5f26a6eb 100644
--- a/indra/newview/skins/default/xui/ja/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_env_settings.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Environment Editor Floater" title="環境編集">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="自然環境エディター">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
時刻
</text>
@@ -12,13 +15,11 @@
<text name="EnvWaterColorText">
æ°´ã®è‰²
</text>
- <color_swatch name="EnvWaterColor"
- tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã" />
+ <color_swatch name="EnvWaterColor" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<text name="EnvWaterFogText">
水中照度
</text>
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" name="EnvUseEstateTimeButton" />
- <button label="空ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedSkyButton" />
- <button label="æ°´ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedWaterButton" />
- <button label="?" name="EnvSettingsHelpButton" />
+ <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" name="EnvUseEstateTimeButton"/>
+ <button label="空ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedSkyButton"/>
+ <button label="æ°´ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedWaterButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
new file mode 100644
index 0000000000..306b262b70
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="イベント" name="Event" title="イベント詳細">
+ <floater.string name="none">
+ ãªã—
+ </floater.string>
+ <floater.string name="notify">
+ 知らã›ã‚‹
+ </floater.string>
+ <floater.string name="dont_notify">
+ 知らã›ãªã„
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text name="event_category">
+ (カテゴリãªã—)
+ </text>
+ <text name="event_runby_label">
+ 主催者:
+ </text>
+ <text initial_value="(å–得中)" name="event_runby"/>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration">
+ 1 時間
+ </text>
+ <text name="event_cover">
+ ç„¡æ–™
+ </text>
+ <text name="event_location_label">
+ 場所:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="レーティング区分:"/>
+ <text name="rating_value" value="䏿˜Ž"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="イベント作æˆ"/>
+ <button name="god_delete_event_btn" tool_tip="イベント削除"/>
+ <button label="知らã›ã‚‹" name="notify_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="地図" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml b/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml
new file mode 100644
index 0000000000..fce9185b8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="set_name_in_the_cladd">
+ <check_box label="クイックヒントをオフã«ã™ã‚‹" name="DontShowFirstTimeTip_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_gesture.xml b/indra/newview/skins/default/xui/ja/floater_gesture.xml
index 66be1f7d84..a79854bcef 100644
--- a/indra/newview/skins/default/xui/ja/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_gesture.xml
@@ -1,17 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="アクティブ・ジェスãƒãƒ£ãƒ¼">
- <text name="help_label">
- ジェスãƒãƒ£ãƒ¼ã‚’ダブルクリックã—ã¦ã€&#10;アニメーションã¨ã‚µã‚¦ãƒ³ãƒ‰ã‚’å†ç”Ÿã€‚
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="場所" name="gestures" title="ジェスãƒãƒ£ãƒ¼">
+ <floater.string name="loading">
+ ローディング...
+ </floater.string>
+ <floater.string name="playing">
+ (å†ç”Ÿä¸­ï¼‰
+ </floater.string>
+ <floater.string name="copy_name">
+ [COPY_NAME] ã®ã‚³ãƒ”ー
+ </floater.string>
<scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="トリガ" name="trigger" />
- <column label="キー" name="shortcut" />
- <column label="" name="key" />
- <column label="åå‰" name="name" />
+ <scroll_list.columns label="åå‰" name="name"/>
+ <scroll_list.columns label="ãƒãƒ£ãƒƒãƒˆ" name="trigger"/>
+ <scroll_list.columns label="" name="key"/>
+ <scroll_list.columns label="キー" name="shortcut"/>
</scroll_list>
- <button label="æ–°è¦" name="new_gesture_btn" />
- <button label="æŒã¡ç‰©" name="inventory_btn" />
- <button label="編集" name="edit_btn" />
- <button label="å†ç”Ÿ" name="play_btn" />
- <button label="åœæ­¢" name="stop_btn" />
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="詳細オプション"/>
+ <button name="new_gesture_btn" tool_tip="æ–°è¦ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’作æˆ"/>
+ <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã®æœ‰ç„¡"/>
+ <button name="del_btn" tool_tip="ã“ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’削除"/>
+ </panel>
+ <button label="編集" name="edit_btn"/>
+ <button label="å†ç”Ÿ" name="play_btn"/>
+ <button label="åœæ­¢" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index 8fe41a823a..075cde8dec 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -1,144 +1,99 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="godtools floater" title="ゴッド・ツール">
<tab_container name="GodTools Tabs">
<panel label="グリッド" name="grid">
- <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™"
- label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™"
- name="Kick all users" />
- <button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去"
- label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去"
- name="Flush This Region&apos;s Map Visibility Caches" />
+ <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users" width="160"/>
+ <button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" name="Flush This Region&apos;s Map Visibility Caches"/>
</panel>
<panel label="地域" name="region">
<text name="Sim Name:">
シムå:
</text>
- <check_box label="準備" name="check prelude"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚" />
- <check_box label="太陽固定" name="check fixed sun"
- tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰" />
- <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ ã‚’リセット" name="check reset home"
- tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§åŽ»ã£ãŸã¨ãã€å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ ã‚’目的地ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã€‚" />
- <check_box label="å¯è¦–" name="check visible"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚" />
- <check_box label="ダメージ" name="check damage"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚" />
- <check_box label="トラフィック・トラッキングをブロック"
- name="block dwell"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ィック計算をオフã«ã—ã¾ã™ã€‚" />
- <check_box label="土地整備をブロック" name="block terraform"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ­¢" />
- <check_box label="サンドボックス" name="is sandbox"
- tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ" />
- <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹"
- name="Bake Terrain"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚" />
- <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™"
- name="Revert Terrain"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚" />
- <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚" />
+ <check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/>
+ <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/>
+ <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ ã‚’リセット" name="check reset home" tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§å¤–ã«å‡ºãŸã‚‰ã€ãƒ›ãƒ¼ãƒ ã‚’目的地ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚"/>
+ <check_box label="å¯è¦–" name="check visible" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚"/>
+ <check_box label="ダメージ" name="check damage" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚"/>
+ <check_box label="トラフィック・トラッキングをブロック" name="block dwell" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ィック計算をオフã«ã—ã¾ã™ã€‚"/>
+ <check_box label="土地整備をブロック" name="block terraform" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ­¢"/>
+ <check_box label="サンドボックス" name="is sandbox" tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/>
+ <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚"/>
+ <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/>
+ <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/>
<text name="estate id">
ä¸å‹•産ID:
</text>
<text name="parent id">
親ID:
</text>
- <line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•産ã§ã™ã€‚" />
+ <line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•産ã§ã™ã€‚"/>
<text name="Grid Pos: ">
グリッドä½ç½®ï¼š
</text>
- <line_editor name="gridposx"
- tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚" />
- <line_editor name="gridposy"
- tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚" />
+ <line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚"/>
+ <line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚"/>
<text name="Redirect to Grid: ">
- グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š
+ グリッドã«ãƒªãƒ€
+イレクト:
</text>
<text name="billable factor text">
請求率:
</text>
<text name="land cost text">
- 平方メートル当ãŸã‚ŠL$:
+ 平方メートル当
+ãŸã‚ŠL$:
</text>
- <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh"
- tool_tip="ä¸Šè¨˜ã®æƒ…報を更新ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" />
- <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"
- tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" />
- <button label="åœ°åŸŸã‚’é¸æŠž" label_selected="åœ°åŸŸã‚’é¸æŠž" name="Select Region"
- tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。" />
- <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å­˜ã™ã‚‹"
- label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å­˜ã™ã‚‹" name="Autosave now"
- tool_tip="Gzip状態を自動ä¿å­˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã—ã¾ã™ã€‚" />
+ <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="ä¸Šè¨˜ã®æƒ…報を更新ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
+ <button label="åœ°åŸŸã‚’é¸æŠž" label_selected="åœ°åŸŸã‚’é¸æŠž" name="Select Region" tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
+ <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å­˜ã™ã‚‹" label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å­˜ã™ã‚‹" name="Autosave now" tool_tip="Gzip状態を自動ä¿å­˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã—ã¾ã™ã€‚"/>
</panel>
<panel label="オブジェクト" name="objects">
+ <panel.string name="no_target">
+ (ターゲットãªã—)
+ </panel.string>
<text name="Sim Name:">
シムå:
</text>
<text name="region name">
ウェルシュ
</text>
- <check_box label="スクリプトを無効化" name="disable scripts"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–" />
- <check_box label="è¡çªã‚’無効化" name="disable collisions"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化" />
- <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics"
- tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–" />
- <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"
- tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" />
- <button label="対象ã®è¨­å®š" label_selected="対象ã®è¨­å®š" name="Set Target"
- tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’設定ã—ã¦ãã ã•ã„。" />
+ <check_box label="スクリプトを無効化" name="disable scripts" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="è¡çªã‚’無効化" name="disable collisions" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化"/>
+ <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
+ <button label="対象ã®è¨­å®š" label_selected="対象ã®è¨­å®š" name="Set Target" tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’設定ã—ã¦ãã ã•ã„。"/>
<text name="target_avatar_name">
(対象ãªã—)
</text>
- <button
- label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除"
- label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除"
- name="Delete Target&apos;s Scripted Objects On Others Land"
- tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚" />
- <button
- label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除"
- label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除"
- name="Delete Target&apos;s Scripted Objects On *Any* Land"
- tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚" />
- <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤"
- label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤"
- name="Delete *ALL* Of Target&apos;s Objects"
- tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚" />
- <button label="トップ・コライダーをå–å¾—"
- label_selected="トップ・コライダーをå–å¾—"
- name="Get Top Colliders"
- tool_tip="最も段階ã®ç‹­ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" />
- <button label="トップ・スクリプトをå–å¾—"
- label_selected="トップ・スクリプトをå–å¾—"
- name="Get Top Scripts"
- tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" />
- <button label="スクリプト・ダイジェスト"
- label_selected="スクリプト・ダイジェスト" name="Scripts digest"
- tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" />
+ <button label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/>
+ <button label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/>
+ <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ­¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/>
+ <button label="トップ・コライダーをå–å¾—" label_selected="トップ・コライダーをå–å¾—" name="Get Top Colliders" tool_tip="最も段階ã®ç‹­ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/>
+ <button label="トップ・スクリプトをå–å¾—" label_selected="トップ・スクリプトをå–å¾—" name="Get Top Scripts" tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/>
+ <button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/>
</panel>
<panel label="è¦æ±‚" name="request">
<text name="Destination:">
目的地:
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="é¸æŠž"/>
- <combo_box.item name="item2" label="エージェント地域"/>
+ <combo_box.item label="é¸æŠž" name="item1"/>
+ <combo_box.item label="エージェント地域" name="item2"/>
</combo_box>
<text name="Request:">
è¦æ±‚:
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="コライダー<ステップ>"/>
- <combo_box.item name="item2" label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>"/>
- <combo_box.item name="item3" label="オブジェクト<パターン>"/>
- <combo_box.item name="item4" label="rez <asset_id>"/>
+ <combo_box.item label="コライダー<ステップ>" name="item1"/>
+ <combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/>
+ <combo_box.item label="オブジェクト<パターン>" name="item3"/>
+ <combo_box.item label="rez <asset_id>" name="item4"/>
</combo_box>
<text name="Parameter:">
パラメーター:
</text>
- <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹"
- name="Make Request" />
+ <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹" name="Make Request"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index 67d105c2a4..c5a2800e0e 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -1,32 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Hardware Settings Floater" title="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨­å®š">
<text name="Filtering:">
フィルタリング:
</text>
- <check_box
- label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰"
- name="ani" />
+ <check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/>
<text name="Antialiasing:">
アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°:
</text>
<combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa">
- <combo_box.item name="FSAADisabled" label="無効" />
- <combo_box.item name="2x" label="2x" />
- <combo_box.item name="4x" label="4x" />
- <combo_box.item name="8x" label="8x" />
- <combo_box.item name="16x" label="16x" />
+ <combo_box.item label="無効" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
- <spinner label="ガンマ:" name="gamma" />
+ <spinner label="ガンマ:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (è¼åº¦ï¼šä½Žã„ï¼é«˜è¼åº¦ã€0ï¼ãƒ‡ãƒ•ォルト値)
+ (0 ã§ãƒ‡ãƒ•ォルトã€ä½Žã„ã»ã©æ˜Žã‚‹ã„)
</text>
<text name="Enable VBO:">
VBO を有効化:
</text>
- <check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo"
- tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãれãŒã‚りã¾ã™ã€‚" />
- <slider label="テクスãƒãƒ£ï¾’モリ(MB):" name="GrapicsCardTextureMemory"
- tool_tip="テクスãƒãƒ£ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ¡ãƒ¢ãƒªã®åˆè¨ˆã€‚ ビデオ・カード・メモリをデフォルトã«ã—ã¾ã™ã€‚ ã“ã®æ•°å€¤ã‚’減らã™ã¨ã€ãƒ‘ãƒ•ã‚©ãƒ¼ãƒžãƒ³ã‚¹ãŒæ”¹å–„ã•れã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒã¼ã‚„ã‘ãŸæ„Ÿã˜ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚" />
- <spinner label="フォグã®è·é›¢æ¯”率:" name="fog" />
- <button label="OK" label_selected="OK" name="OK" />
+ <check_box initial_value="true" label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãれãŒã‚りã¾ã™ã€‚"/>
+ <slider label="テクスãƒãƒ£ãƒ¡ãƒ¢ãƒªï¼ˆMB):" name="GraphicsCardTextureMemory" tool_tip="テクスãƒãƒ£ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ¡ãƒ¢ãƒªã®é‡ã€‚ ビデオカードã®ãƒ¡ãƒ¢ãƒªã«æ—¢å®šã€‚ 数値を下ã’ã‚‹ã¨ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ç²¾åº¦ãŒè½ã¡ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚"/>
+ <spinner label="フォグã®è·é›¢æ¯”率:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_help_browser.xml b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
new file mode 100644
index 0000000000..15200d7ef7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="ヘルプブラウザ">
+ <floater.string name="loading_text">
+ ローディング...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_hud.xml b/indra/newview/skins/default/xui/ja/floater_hud.xml
index a1970ebbd5..e3841c2cd9 100644
--- a/indra/newview/skins/default/xui/ja/floater_hud.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hud.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_im.xml b/indra/newview/skins/default/xui/ja/floater_im.xml
index eec644715d..9c323f25e6 100644
--- a/indra/newview/skins/default/xui/ja/floater_im.xml
+++ b/indra/newview/skins/default/xui/ja/floater_im.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="インスタント・メッセージ">
<string name="only_user_message">
ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
@@ -10,7 +10,7 @@
ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。
</string>
<string name="muted_message">
- ã‚ãªãŸã¯ã“ã®ä½äººã‚’無視ã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ä¿¡ã™ã‚‹ã¨ã€ç„¡è¦–設定ã¯è‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚
+ ã“ã®ä½äººã‚’ブロックã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ロックãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚
</string>
<string name="generic_request_error">
è¦æ±‚中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml
new file mode 100644
index 0000000000..1d028258ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="æ›ç®—"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml
new file mode 100644
index 0000000000..6646cc0b25
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="IM コントロールパãƒãƒ«" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="宛先" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index fae9c87da4..2e57acf0d2 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Image Preview" title="">
<text name="name_label">
åå‰ï¼š
@@ -7,26 +7,26 @@
説明:
</text>
<text name="preview_label">
- イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½­ï½°ï¼š
+ プレビュー:
</text>
<combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo">
- <combo_box.item name="Image" label="ç”»åƒ" />
- <combo_box.item name="Hair" label="髪" />
- <combo_box.item name="FemaleHead" label="女性ã®é ­" />
- <combo_box.item name="FemaleUpperBody" label="女性ã®ä¸ŠåŠèº«" />
- <combo_box.item name="FemaleLowerBody" label="女性ã®ä¸‹åŠèº«" />
- <combo_box.item name="MaleHead" label="男性ã®é ­" />
- <combo_box.item name="MaleUpperBody" label="男性ã®ä¸ŠåŠèº«" />
- <combo_box.item name="MaleLowerBody" label="男性ã®ä¸‹åŠèº«" />
- <combo_box.item name="Skirt" label="スカート" />
- <combo_box.item name="SculptedPrim" label="変形ã•れãŸãƒ—リム" />
+ <combo_box.item label="ç”»åƒ" name="Image"/>
+ <combo_box.item label="髪" name="Hair"/>
+ <combo_box.item label="女性ã®é ­" name="FemaleHead"/>
+ <combo_box.item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody"/>
+ <combo_box.item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody"/>
+ <combo_box.item label="男性ã®é ­" name="MaleHead"/>
+ <combo_box.item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody"/>
+ <combo_box.item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody"/>
+ <combo_box.item label="スカート" name="Skirt"/>
+ <combo_box.item label="スカルプトプリム" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
イメージを読ã¿å–れã¾ã›ã‚“。
24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å­˜ã—ã¦ãã ã•ã„。
</text>
- <check_box label="ロスã®ãªã„圧縮を使用" name="lossless_check" />
- <button label="å–り消ã—" name="cancel_btn" />
- <button label="アップロードL$[AMOUNT]" name="ok_btn" />
+ <check_box label="å¯é€†åœ§ç¸®" name="lossless_check"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="アップロード゙L$[AMOUNT]" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
new file mode 100644
index 0000000000..04013799ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="䏿˜Žã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ
+ </floater.string>
+ <floater.string name="anonymous">
+ 匿åユーザー
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ ãŒã‚³ãƒ¼ãƒ«ã—ã¦ã„ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ãŒã‚³ãƒ³ãƒ•ァレンスãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã—ãŸã€‚
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ 㯠[GROUP]. ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
+ </floater.string>
+ <text name="question">
+ [CURRENT_CHAT] を退席ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã™ã‹ï¼Ÿ
+ </text>
+ <button label="ã¯ã„" label_selected="ã¯ã„" name="Accept"/>
+ <button label="ã„ã„ãˆ" label_selected="ã„ã„ãˆ" name="Reject"/>
+ <button label="IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index 3ada48ef8e..b3825c0b7f 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="inspect" title="オブジェクト検査" min_width="450" >
- <scroll_list name="object_list"
- tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã“ã®ä¸–界ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
- <column label="オブジェクトå" name="object_name" />
- <column label="所有者å" name="owner_name" />
- <column label="制作者å" name="creator_name" />
- <column label="ä½œæˆæ—¥" name="creation_date" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="450" name="inspect" title="オブジェクトã®ãƒã‚§ãƒƒã‚¯">
+ <floater.string name="timeStamp">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="リストã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
+ <scroll_list.columns label="åå‰" name="object_name"/>
+ <scroll_list.columns label="所有者å" name="owner_name"/>
+ <scroll_list.columns label="制作者å" name="creator_name"/>
+ <scroll_list.columns label="ä½œæˆæ—¥" name="creation_date"/>
</scroll_list>
- <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner"
- tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを見る" />
- <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator"
- tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを見る" />
+ <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
+ <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory.xml b/indra/newview/skins/default/xui/ja/floater_inventory.xml
index 680496839a..b113fde94a 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory.xml
@@ -1,51 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory" title="æŒã¡ç‰©">
- <search_editor label="ã“ã“ã«å…¥åŠ›ã—ã¦æ¤œç´¢" name="inventory search editor" />
- <tab_container name="inventory filter tabs">
- <inventory_panel label="ã™ã¹ã¦" name="All Items" />
- <inventory_panel label="最近ã®å…¥æ‰‹ã‚¢ã‚¤ãƒ†ãƒ " name="Recent Items" />
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="ファイル" name="File">
- <menu_item_call label="é–‹ã" name="Open" />
- <menu_item_call label="æ–°ã—ã„ウィンドウ" name="New Window" />
- <menu_item_call label="フィルタを表示" name="Show Filters" />
- <menu_item_call label="フィルターã®ãƒªã‚»ãƒƒãƒˆ" name="Reset Current" />
- <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="Close All Folders" />
- <menu_item_call label="ゴミ箱を空ã«ã™ã‚‹" name="Empty Trash" />
- </menu>
- <menu label="作æˆ" name="Create">
- <menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder" />
- <menu_item_call label="æ–°ã—ã„スクリプト" name="New Script" />
- <menu_item_call label="æ–°ã—ã„ノート" name="New Note" />
- <menu_item_call label="æ–°ã—ã„ジェスãƒãƒ£ãƒ¼" name="New Gesture" />
- <menu name="New Clothes">
- <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt" />
- <menu_item_call label="æ–°ã—ã„ズボン" name="New Pants" />
- <menu_item_call label="æ–°ã—ã„é´" name="New Shoes" />
- <menu_item_call label="æ–°ã—ã„é´ä¸‹" name="New Socks" />
- <menu_item_call label="æ–°ã—ã„ジャケット" name="New Jacket" />
- <menu_item_call label="æ–°ã—ã„スカート" name="New Skirt" />
- <menu_item_call label="æ–°ã—ã„æ‰‹è¢‹" name="New Gloves" />
- <menu_item_call label="æ–°ã—ã„下ç€" name="New Undershirt" />
- <menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants" />
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape" />
- <menu_item_call label="æ–°ã—ã„スキン" name="New Skin" />
- <menu_item_call label="æ–°ã—ã„髪" name="New Hair" />
- <menu_item_call label="æ–°ã—ã„眼" name="New Eyes" />
- </menu>
- </menu>
- <menu label="ä¸¦ã¹æ›¿ãˆ" name="Sort">
- <menu_item_check label="åå‰" name="By Name" />
- <menu_item_check label="日付" name="By Date" />
- <menu_item_check label="フォルダã¯å¸¸ã«åå‰é †" name="Folders Always By Name" />
- <menu_item_check label="システムフォルダをトップã¸" name="System Folders To Top" />
- </menu>
- <menu label="フィルタ" name="Filters">
- <menu_item_check label="ç¾çŠ¶ã‚’ä¿®æ­£" name="Modify Current" />
- <menu_item_call label="ç¾çŠ¶ã‚’ãƒªã‚»ãƒƒãƒˆ" name="Reset Current" />
- </menu>
- </menu_bar>
+ <floater.string name="Title">
+ æŒã¡ç‰©
+ </floater.string>
+ <floater.string name="TitleFetching">
+ æŒã¡ç‰© ( [ITEM_COUNT] アイテムをå–得中...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ æŒã¡ç‰© ( [ITEM_COUNT] アイテム) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ å–得済
+ </floater.string>
+ <panel label="æŒã¡ç‰©ãƒ‘ãƒãƒ«" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
index 8588ee1a96..7480b04856 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ロパティ">
+ <floater.string name="unknown">
+ (䏿˜Žï¼‰
+ </floater.string>
+ <floater.string name="public">
+ (公共)
+ </floater.string>
+ <floater.string name="you_can">
+ ã§ãã‚‹ã“ã¨ï¼š
+ </floater.string>
+ <floater.string name="owner_can">
+ ã‚ªãƒ¼ãƒŠãƒ¼ã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
åå‰ï¼š
</text>
@@ -12,14 +27,14 @@
<text name="LabelCreatorName">
Nicole Linden
</text>
- <button label="情報" label_selected="" name="BtnCreator" />
+ <button label="情報" label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
オーナー:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
- <button label="情報" label_selected="" name="BtnOwner" />
+ <button label="情報" label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
入手日時:
</text>
@@ -27,55 +42,32 @@
2006年5月24日水曜日12:50:46
</text>
<text name="OwnerLabel">
- ã§ãã‚‹ã“ã¨ï¼š
+ ã‚ãªãŸï¼š
</text>
- <check_box label="修正" name="CheckOwnerModify" />
- <check_box label="コピー" name="CheckOwnerCopy" />
- <check_box label="å†è²©ï¼ãƒ—レゼント" name="CheckOwnerTransfer" />
- <text name="BaseMaskDebug">
- B:
+ <check_box label="編集" name="CheckOwnerModify"/>
+ <check_box label="コピー" name="CheckOwnerCopy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 全員:
</text>
- <text name="OwnerMaskDebug">
- O:
+ <check_box label="コピー" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ グループ:
</text>
- <text name="GroupMaskDebug">
- G:
- </text>
- <text name="EveryoneMaskDebug">
- E:
- </text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="グループ分担" name="CheckShareWithGroup" />
- <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="CheckEveryoneCopy" />
+ <check_box label="共有" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="158">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹ã“ã¨ï¼š
- </text>
- <check_box label="修正" name="CheckNextOwnerModify" />
- <check_box label="コピー" name="CheckNextOwnerCopy" />
- <check_box label="å†è²©ï¼ãƒ—レゼント" name="CheckNextOwnerTransfer" />
- <text name="SaleLabel">
- アイテムã«ãƒžãƒ¼ã‚¯ï¼š
- </text>
- <check_box label="売り出ã—中" name="CheckPurchase" />
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="オリジナル" />
- <radio_item name="radio2" label="コピー" />
- </radio_group>
- <text name="TextPrice">
- 料金:L$
- </text>
- <text name="unknown">
- (䏿˜Žï¼‰
- </text>
- <text name="public">
- (公共)
- </text>
- <text name="you_can">
- ã§ãã‚‹ã“ã¨ï¼š
- </text>
- <text name="owner_can">
- ã‚ªãƒ¼ãƒŠãƒ¼ã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š
+ æ¬¡ã®æ‰€æœ‰è€…:
+ </text>
+ <check_box label="編集" name="CheckNextOwnerModify"/>
+ <check_box label="コピー" name="CheckNextOwnerCopy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer"/>
+ <check_box label="売り出ã—中" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="コピー" name="Copy"/>
+ <combo_box.item label="オリジナル" name="Original"/>
+ </combo_box>
+ <spinner label="価格:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index d4037487b7..47a63e5e20 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory Finder" title="inventory_recent_items">
- <check_box label="アニメーション" name="check_animation" />
- <check_box label="コーリング・カード" name="check_calling_card" />
- <check_box label="æœ" name="check_clothing" />
- <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture" />
- <check_box label="ランドマーク" name="check_landmark" />
- <check_box label="ノートカード" name="check_notecard" />
- <check_box label="オブジェクト" name="check_object" />
- <check_box label="スクリプト" name="check_script" />
- <check_box label="サウンド" name="check_sound" />
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture" />
- <check_box label="スナップショット" name="check_snapshot" />
- <button label="ã™ã¹ã¦" label_selected="ã™ã¹ã¦" name="All" />
- <button label="ãªã—" label_selected="ãªã—" name="None" />
- <check_box label="常ã«ãƒ•ォルダを表示" name="check_show_empty" />
- <check_box label="ログオフ以é™" name="check_since_logoff" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="最近å–å¾—ã—ãŸæŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ">
+ <check_box label="アニメーション" name="check_animation"/>
+ <check_box label="コーリング・カード" name="check_calling_card"/>
+ <check_box label="æœ" name="check_clothing"/>
+ <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/>
+ <check_box label="ランドマーク" name="check_landmark"/>
+ <check_box label="ノートカード" name="check_notecard"/>
+ <check_box label="オブジェクト" name="check_object"/>
+ <check_box label="スクリプト" name="check_script"/>
+ <check_box label="サウンド" name="check_sound"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
+ <check_box label="スナップショット" name="check_snapshot"/>
+ <button label="ã™ã¹ã¦" label_selected="ã™ã¹ã¦" name="All"/>
+ <button label="ãªã—" label_selected="ãªã—" name="None"/>
+ <check_box label="常ã«ãƒ•ォルダを表示" name="check_show_empty"/>
+ <check_box label="ログオフ以é™" name="check_since_logoff"/>
<text name="- OR -">
ï¼ã¾ãŸã¯ï¼
</text>
- <spinner label="çµŒéŽæ™‚é–“" name="spin_hours_ago" />
- <spinner label="çµŒéŽæ—¥æ•°" name="spin_days_ago" />
- <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="Close" />
+ <spinner label="çµŒéŽæ™‚é–“" name="spin_hours_ago"/>
+ <spinner label="çµŒéŽæ—¥æ•°" name="spin_days_ago"/>
+ <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index 177567c806..65eeebe4ed 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="ジョイスティックã®è¨­å®š">
- <check_box name="enable_joystick" width="120" label="ジョイスティックを使ã†ï¼š"/>
+ <check_box label="ジョイスティックを使ã†ï¼š" name="enable_joystick" width="120"/>
<text left="180" name="joystick_type" width="320"/>
<spinner label="X軸マッピング" name="JoystickAxis1"/>
<spinner label="Y軸マッピング" name="JoystickAxis2"/>
@@ -15,9 +15,9 @@
<text name="Control Modes:">
制御モード:
</text>
- <check_box left="131" name="JoystickAvatarEnabled" label="ã‚¢ãƒã‚¿ãƒ¼"/>
- <check_box left="201" name="JoystickBuildEnabled" label="造る"/>
- <check_box left="271" name="JoystickFlycamEnabled" label="フライ・カメラ"/>
+ <check_box label="ã‚¢ãƒã‚¿ãƒ¼" left="131" name="JoystickAvatarEnabled"/>
+ <check_box label="造る" left="201" name="JoystickBuildEnabled"/>
+ <check_box label="フライ・カメラ" left="271" name="JoystickFlycamEnabled"/>
<text left="5" name="XScale" width="120">
Xスケール
</text>
@@ -71,7 +71,7 @@
<spinner left="135" name="AvatarAxisDeadZone0" width="50"/>
<spinner left="205" name="BuildAxisDeadZone0" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone0" width="50"/>
- <text left="0" name="PitchDeadZone" width="135">
+ <text left="0" name="PitchDeadZone" width="125">
ピッãƒãƒ»ãƒ‡ãƒƒãƒ‰ãƒ»ã‚¾ãƒ¼ãƒ³
</text>
<spinner left="135" name="AvatarAxisDeadZone4" width="50"/>
@@ -83,7 +83,7 @@
<spinner left="135" name="AvatarAxisDeadZone5" width="50"/>
<spinner left="205" name="BuildAxisDeadZone5" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone5" width="50"/>
- <text left="0" name="RollDeadZone" width="135">
+ <text left="0" name="RollDeadZone" width="125">
ロール・デッド・ゾーン
</text>
<spinner left="205" name="BuildAxisDeadZone3" width="50"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
index e25771ea72..e3546cd837 100644
--- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
@@ -1,152 +1,151 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_lagmeter" title="ラグ メーター">
- <button name="client_lagmeter" tool_tip="クライアント ラグ ステータス" />
- <text name="client">
- クライアント:
- </text>
- <text name="client_text">
- ノーマル
- </text>
- <button name="network_lagmeter" tool_tip="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ ラグ ステータス" />
- <text name="network">
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯:
- </text>
- <text name="network_text">
- ノーマル
- </text>
- <button name="server_lagmeter" tool_tip="サーãƒãƒ¼ ラグ ステータス" />
- <text name="server">
- サーãƒãƒ¼:
- </text>
- <text name="server_text">
- ノーマル
- </text>
- <button label="?" name="server_help" />
- <button label="&gt;&gt; " name="minimize" />
- <text name="max_title_msg">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="ラグメーター">
+ <floater.string name="max_title_msg">
ラグ メーター
- </text>
- <text name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
350
- </text>
- <text name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
ラグ
- </text>
- <text name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </text>
- <text name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
クライアント
- </text>
- <text name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </text>
- <text name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </text>
- <text name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
ノーマルã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¯èƒŒæ™¯ã«
- </text>
- <text name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
クライアント フレームレート < [CLIENT_FRAME_RATE_CRITICAL]
- </text>
- <text name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
クライアント フレームレート: [CLIENT_FRAME_RATE_CRITICAL] ~ [CLIENT_FRAME_RATE_WARNING]
- </text>
- <text name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
ノーマル
- </text>
- <text name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : æç”»è·é›¢ã®è¨­å®šãŒå¤§ãã™ãŽã‚‹
- </text>
- <text name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : ç”»åƒã®ãƒ­ãƒ¼ãƒ‰ä¸­
- </text>
- <text name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : メモリ内ã®ç”»åƒæ•°ãŒå¤šã™ãŽã‚‹
- </text>
- <text name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : ç”»é¢ã«å«ã¾ã‚Œã‚‹è¤‡é›‘ãªã‚ªãƒ–ジェクトãŒå¤šã™ãŽã‚‹
- </text>
- <text name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯
- </text>
- <text name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </text>
- <text name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </text>
- <text name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
接続ã§ãƒ‰ãƒ­ãƒƒãƒ—ã•れるパケットã®å‰²åˆ: > [NETWORK_PACKET_LOSS_CRITICAL]
- </text>
- <text name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
接続ã§ãƒ‰ãƒ­ãƒƒãƒ—ã•れるパケットã®å‰²åˆ:[NETWORK_PACKET_LOSS_WARNING] ~ [NETWORK_PACKET_LOSS_CRITICAL]
- </text>
- <text name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
ノーマル
- </text>
- <text name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </text>
- <text name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </text>
- <text name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
接続㮠ping 時間: > [NETWORK_PING_CRITICAL] ミリ秒
- </text>
- <text name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
接続㮠ping 時間: [NETWORK_PING_WARNING] ~ [NETWORK_PING_CRITICAL] ミリ秒
- </text>
- <text name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
接続ä¸è‰¯ã«ãªã£ã¦ã„ã‚‹ã‹ã€å¸¯åŸŸå¹…設定ãŒé«˜ã™ãŽã¾ã™ã€‚
- </text>
- <text name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
接続ä¸è‰¯ã«ãªã£ã¦ã„ã‚‹ã‹ã€ãƒ•ァイル共有アプリケーションã«å•題ãŒã‚りã¾ã™ã€‚
- </text>
- <text name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
サーãƒãƒ¼
- </text>
- <text name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </text>
- <text name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </text>
- <text name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </text>
- <text name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
シミュレーターã®ãƒ•レームレート: < [SERVER_FRAME_RATE_CRITICAL]
- </text>
- <text name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
シミュレーターã®ãƒ•レームレート: [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING]
- </text>
- <text name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
ノーマル
- </text>
- <text name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : 物ç†çš„オブジェクトãŒå¤šã™ãŽã‚‹
- </text>
- <text name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : スクリプトをå«ã‚€ã‚ªãƒ–ジェクトãŒå¤šã™ãŽã‚‹
- </text>
- <text name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ トラフィックéŽå¤§
- </text>
- <text name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : 地域内ã«ã¦å‹•ã„ã¦ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ãŒå¤šã™ãŽã‚‹
- </text>
- <text name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : ç”»åƒè¨ˆç®—ãŒå¤šã™ãŽã‚‹
- </text>
- <text name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
考ãˆã‚‰ã‚Œã‚‹åŽŸå› : シミュレーターã®éŽè² è·
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="クライアント ラグ ステータス"/>
+ <text name="client">
+ クライアント
</text>
- <text name="smaller_label">
- &gt;&gt; 
+ <text name="client_text">
+ ノーマル
+ </text>
+ <button name="network_lagmeter" tool_tip="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ ラグ ステータス"/>
+ <text name="network">
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯
</text>
- <text name="bigger_label">
- &lt;&lt; 
+ <text name="network_text">
+ ノーマル
+ </text>
+ <button name="server_lagmeter" tool_tip="サーãƒãƒ¼ ラグ ステータス"/>
+ <text name="server">
+ サーãƒãƒ¼
+ </text>
+ <text name="server_text">
+ ノーマル
</text>
+ <button label="&gt;&gt; " name="minimize" tool_tip="フローターã®ã‚µã‚¤ã‚ºã‚’トグル"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index cb87dafb49..aca916f22f 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -1,40 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="land holdings floater" title="自分ã®åœŸåœ°">
<scroll_list name="parcel list">
- <column label="区画å" name="name"/>
+ <column label="区画" name="name"/>
<column label="地域(リージョン)" name="location"/>
<column label="種類" name="type"/>
<column label="é¢ç©" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="地図上ã«è¡¨ç¤º" label_selected="地図上ã«è¡¨ç¤º" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™ã€‚"/>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="地図" label_selected="地図" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™"/>
<text name="contrib_label">
- ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š
+ 所属グループã¸ã®è²¢çŒ®ï¼š
</text>
<scroll_list name="grant list">
<column label="グループå" name="group"/>
<column label="é¢ç©" name="area"/>
</scroll_list>
<text name="allowed_label">
- ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š
+ ç¾åœ¨ã®æ”¯æ‰•ã„プランã§è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š
</text>
<text name="allowed_text">
- [AREA]平方メートル
+ [AREA] 平方メートル
</text>
<text name="current_label">
ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š
</text>
<text name="current_text">
- [AREA]平方メートル
+ [AREA] 平方メートル
</text>
<text name="available_label">
- 土地購入å¯ï¼š
+ 購入å¯èƒ½ãªåœŸåœ°ï¼š
</text>
<text name="available_text">
- [AREA]平方メートル
+ [AREA] 平方メートル
</text>
<string name="area_string">
- [AREA]平方メートル
+ [AREA] 平方メートル
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
index 79942738ea..5a155c9f12 100644
--- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="スクリプト:新ã—ã„スクリプト">
- <button label="リセット" label_selected="リセット" name="Reset" />
- <check_box label="実行中" name="running" />
- <check_box label="Mono" name="mono" />
- <text name="not_allowed">
- ã‚ãªãŸã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを見るã“ã¨ãŒã§ãã¾ã›ã‚“。
- </text>
- <string name="script_running">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="スクリプト: æ–°ã—ã„スクリプト">
+ <floater.string name="not_allowed">
+ ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºãƒ»ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºãƒ»ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="script_running">
実行中
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ スクリプト: [NAME]
+ </floater.string>
+ <button label="リセット" label_selected="リセット" name="Reset"/>
+ <check_box initial_value="true" label="実行中" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
index 55eba966dc..5773752788 100644
--- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL Wiki">
- <check_box label="カーソルを追ã†" name="lock_check" />
- <combo_box label="ロック" name="history_combo" />
- <button label="戻る" name="back_btn" />
- <button label="進む" name="fwd_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL レファレンス">
+ <check_box label="カーソルを追ã†" name="lock_check"/>
+ <combo_box label="ロック" name="history_combo"/>
+ <button label="戻る" name="back_btn"/>
+ <button label="進む" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 3356d4948a..8d920a3c3f 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="ミニマップ">
<floater.string name="mini_map_north">
北
</floater.string>
@@ -24,6 +24,9 @@
<floater.string name="mini_map_northwest">
北西
</floater.string>
+ <floater.string name="ToolTipMsg">
+ [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ãã¾ã™ï¼‰
+ </floater.string>
<text label="北" name="floater_map_north" text="北">
北
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
index 6877cc7f53..c4731b73a3 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
@@ -1,19 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="メディア・ブラウザ">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="メディアブラウザ">
+ <floater.string name="home_page_url">
+ http://jp.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://jp.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
- <button label="戻る" name="back" />
- <button label="進む" name="forward" />
- <button label="æ›´æ–°" name="reload" />
- <button label="閲覧" name="go" />
+ <button label="戻る" name="back"/>
+ <button label="進む" name="forward"/>
+ <button label="æ›´æ–°" name="reload"/>
+ <button label="閲覧" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="å·»ãæˆ»ã—" name="rewind"/>
+ <button label="åœæ­¢" name="stop"/>
+ <button label="æ—©é€ã‚Š" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="ç¾åœ¨ã® URL を区画ã«é€ä¿¡" name="assign" />
+ <button label="ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã‚’区画ã«é€ã‚‹" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser" />
- <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always" />
- <button label="é–‰ã˜ã‚‹" name="close" />
+ <button label="外部Webブラウザã§é–‹ã" name="open_browser"/>
+ <check_box label="常ã«å¤–部ã®Webブラウザã§é–‹ã" name="open_always"/>
+ <button label="é–‰ã˜ã‚‹" name="close"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_media_settings.xml b/indra/newview/skins/default/xui/ja/floater_media_settings.xml
new file mode 100644
index 0000000000..46ac1a8dfd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="メディアã®è¨­å®š">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
index 4d6b6ca70a..f48bb94e32 100644
--- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
@@ -1,10 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="メモリ・リーク・シミュレーション">
- <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):"
- name="leak_speed" label_width="244" />
- <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" name="max_leak" label_width="244" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ">
+ <spinner label="リーク速度(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/>
+ <spinner label="最大メモリリーク(MB):" label_width="244" name="max_leak"/>
<text name="total_leaked_label">
- ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB
+ ç¾åœ¨ã®ãƒ¡ãƒ¢ãƒªãƒªãƒ¼ã‚¯ï¼š [SIZE] KB
</text>
<text name="note_label_1">
[NOTE1]
@@ -12,8 +11,8 @@
<text name="note_label_2">
[NOTE2]
</text>
- <button label="é–‹å§‹" name="start_btn" />
- <button label="åœæ­¢" name="stop_btn" />
- <button label="解放" name="release_btn" />
- <button label="é–‰ã˜ã‚‹" name="close_btn" />
+ <button label="é–‹å§‹" name="start_btn"/>
+ <button label="åœæ­¢" name="stop_btn"/>
+ <button label="解放" name="release_btn"/>
+ <button label="é–‰ã˜ã‚‹" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index df6ae7bb61..8ba297c7a0 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -1,17 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="å·¦ã«æ›²ãŒã‚‹" />
- <button label="" label_selected="" name="turn right btn" tool_tip="å³ã«æ›²ãŒã‚‹" />
- <button label="" label_selected="" name="move up btn"
- tool_tip="ジャンプã¾ãŸã¯ä¸Šæ˜‡" />
- <button label="" label_selected="" name="move down btn"
- tool_tip="ã—ゃãŒã‚€ã¾ãŸã¯ä¸‹é™" />
- <button label="飛行" label_selected="飛行" name="fly btn"
- tool_tip="飛行を開始ã¾ãŸã¯åœæ­¢" />
- <joystick_slide name="slide left btn" tool_tip="å·¦ã«ç§»å‹•" />
- <joystick_slide name="slide right btn" tool_tip="å³ã«ç§»å‹•" />
- <joystick_turn name="forward btn" tool_tip="å‰ã«ç§»å‹•" />
- <joystick_turn name="backward btn" tool_tip="後ã‚ã«ç§»å‹•" />
-</panel>
+ <string name="walk_forward_tooltip">
+ å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
+ </string>
+ <string name="walk_back_tooltip">
+ 後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰
+ </string>
+ <string name="run_forward_tooltip">
+ å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
+ </string>
+ <string name="run_back_tooltip">
+ 後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰
+ </string>
+ <string name="fly_forward_tooltip">
+ å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
+ </string>
+ <string name="fly_back_tooltip">
+ 後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="飛ã¶ãƒ»E を押ã™"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="ç€åœ°ãƒ»C を押ã™"/>
+ <joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/>
+ <joystick_turn name="backward btn" tool_tip="後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
+ <button label="" name="mode_run_btn" tool_tip="走行モード"/>
+ <button label="" name="mode_fly_btn" tool_tip="飛行モード"/>
+ <button label="é£›è¡Œåœæ­¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ­¢"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_mute_object.xml b/indra/newview/skins/default/xui/ja/floater_mute_object.xml
index 072bb4a576..04ffd5254d 100644
--- a/indra/newview/skins/default/xui/ja/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mute_object.xml
@@ -1,12 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="mute by name" title="オブジェクトåã§ç„¡è¦–ã™ã‚‹">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="mute by name" title="åå‰ã§ã‚ªãƒ–ジェクトをブロック">
<text name="message">
- テキストã®ã¿ã«å½±éŸ¿ã—ã€ï½»ï½³ï¾ï¾„゙(環境音ãªã©)ã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。
-正確ãªã‚ªãƒ–ジェクトåを入力ã—ã¦ãã ã•ã„。
+ オブジェクトをブロックã—ã¾ã™ï¼š
</text>
<line_editor name="object_name">
オブジェクトå
</line_editor>
- <button label="OK" name="OK" />
- <button label="キャï¾ï½¾ï¾™" name="Cancel" />
+ <text name="note">
+ * ブロックã•れるã®ã¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ–‡å­—ã ã‘ã§ã€éŸ³ã¯ãƒ–ロックã•れã¾ã›ã‚“。
+ </text>
+ <button label="OK" name="OK"/>
+ <button label="キャï¾ï½¾ï¾™" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_friends.xml b/indra/newview/skins/default/xui/ja/floater_my_friends.xml
index 10e55f0655..b55cdde5b5 100644
--- a/indra/newview/skins/default/xui/ja/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/ja/floater_my_friends.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_my_friends" title="連絡先" min_width="500">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="500" name="floater_my_friends" title="連絡先">
<tab_container name="friends_and_groups">
- <panel label="フレンド" name="friends_panel" />
- <panel label="グループ" name="groups_panel" />
+ <panel label="フレンド" name="friends_panel"/>
+ <panel label="グループ" name="groups_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
new file mode 100644
index 0000000000..a3cc105048
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_openobject.xml b/indra/newview/skins/default/xui/ja/floater_openobject.xml
index 485528e985..bd1b650f98 100644
--- a/indra/newview/skins/default/xui/ja/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/ja/floater_openobject.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="objectcontents" title="オブジェクト・コンテンツ">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="オブジェクトã®ä¸­èº«">
<text name="object_name">
[DESC]:
</text>
- <button label="æŒã¡ç‰©ã«ã‚³ãƒ”ー" label_selected="æŒã¡ç‰©ã«ã‚³ãƒ”ー"
- name="copy_to_inventory_button" />
- <button label="コピーã—ã¦è£…ç€" label_selected="コピーã—ã¦è£…ç€"
- name="copy_and_wear_button" />
+ <button label="æŒã¡ç‰©ã«ã‚³ãƒ”ー" label_selected="æŒã¡ç‰©ã«ã‚³ãƒ”ー" name="copy_to_inventory_button"/>
+ <button label="コピーã—ã¦è£…ç€" label_selected="コピーã—ã¦è£…ç€" name="copy_and_wear_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..70555e6ded
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="アウトフィットをä¿å­˜ã™ã‚‹">
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
+ <text name="Save item as:">
+ ç€ç”¨ã—ã¦ã„ã‚‹ã‚‚ã®ã‚’
+æ–°ã—ã„アウトフィットã«ä¿å­˜ï¼š
+ </text>
+ <line_editor name="name ed">
+ [DESC] (新)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
new file mode 100644
index 0000000000..4ccaf1a4af
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="コール中">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ
+ </floater.string>
+ <floater.string name="anonymous">
+ 匿åユーザー
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ ãŒã‚³ãƒ¼ãƒ«ã—ã¦ã„ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ãŒã‚³ãƒ³ãƒ•ァレンスãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã—ãŸã€‚
+ </floater.string>
+ <text name="connecting">
+ [CALLEE_NAME] ã«æŽ¥ç¶šä¸­
+ </text>
+ <text name="calling">
+ [CALLEE_NAME] ã«ã‚³ãƒ¼ãƒ«ä¸­
+ </text>
+ <text name="noanswer">
+ 繋ãŒã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </text>
+ <text name="nearby">
+ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ コールを終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ [CURRENT_CHAT] を終了ã—ã¾ã™ã€‚
+ </text>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 8702ab1e74..4564354899 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -1,21 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="支払ã„" label_selected="支払ã„" name="pay btn" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn" />
+ <string name="payee_group">
+ ã‚°ãƒ«ãƒ¼ãƒ—ã«æ”¯æ‰•ã†
+ </string>
+ <string name="payee_resident">
+ ä½äººã«æ”¯æ‰•ã†
+ </string>
<text name="payee_label">
- 支払ã„先:
+ 支払ã„:
</text>
+ <icon name="icon_person" tool_tip="ä½äºº"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text">
- 一括払ã„:
- </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
<text name="amount text">
- 金é¡ï¼š
+ 金é¡ã‚’指定:
</text>
+ <button label="支払ã„" label_selected="支払ã„" name="pay btn"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
index 5f280ca5fa..ffd57ab67b 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
@@ -1,30 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group">
- グループã¸ã®æ”¯æ‰•ã„:
- </text>
- <text name="payee_resident">
- ä½äººã¸ã®æ”¯æ‰•ã„:
- </text>
+ <string name="payee_group">
+ ã‚°ãƒ«ãƒ¼ãƒ—ã«æ”¯æ‰•ã†
+ </string>
+ <string name="payee_resident">
+ ä½äººã«æ”¯æ‰•ã†
+ </string>
+ <icon name="icon_person" tool_tip="ä½äºº"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
<text name="object_name_label">
オブジェクトを介ã—ã¦ï¼š
</text>
+ <icon name="icon_object" tool_tip="オブジェクト"/>
<text name="object_name_text">
...
</text>
- <text name="fastpay text">
- 一括払ã„:
- </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
<text name="amount text">
- 金é¡ï¼š
+ 金é¡ã‚’指定:
</text>
- <button label="L$1" label_selected="L$1" name="fastpay 1" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="支払ã„" label_selected="支払ã„" name="pay btn" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn" />
+ <button label="支払ã„" label_selected="支払ã„" name="pay btn"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
index adbb8596d3..98cda25a81 100644
--- a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
@@ -5,11 +5,11 @@
<check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/>
<check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/>
<text name="NextOwnerLabel">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作:
+ æ¬¡ã®æ‰€æœ‰è€…ãŒã§ãã‚‹æ“作:
</text>
<check_box label="修正" name="next_owner_modify"/>
<check_box label="コピー" name="next_owner_copy"/>
- <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_postcard.xml b/indra/newview/skins/default/xui/ja/floater_postcard.xml
index e22ce24180..5a2b047fe0 100644
--- a/indra/newview/skins/default/xui/ja/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_postcard.xml
@@ -1,40 +1,37 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Postcard" title="スナップショットをEメールã§é€ä¿¡">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="スナップショットをメール">
<text name="to_label">
- ä½äººã®Eメール:
+ ä½äººã®ãƒ¡ãƒ¼ãƒ«ï¼š
</text>
- <line_editor left="145" name="to_form" width="125" />
+ <line_editor left="145" name="to_form" width="125"/>
<text name="from_label">
- ã‚ãªãŸã®Eメール:
+ ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ï¼š
</text>
- <line_editor left="145" name="from_form" width="125" />
+ <line_editor left="145" name="from_form" width="125"/>
<text name="name_label">
ã‚ãªãŸã®åå‰ï¼š
</text>
- <line_editor left="145" name="name_form" width="125" />
+ <line_editor left="145" name="name_form" width="125"/>
<text name="subject_label">
ä»¶å:
</text>
- <line_editor label="ä»¶åã‚’ã“ã“ã«å…¥åŠ›" left="145" name="subject_form"
- width="125" />
+ <line_editor label="ä»¶åを入力ã—ã¦ãã ã•ã„" left="145" name="subject_form" width="125"/>
<text name="msg_label">
メッセージ:
</text>
<text_editor bottom_delta="-120" height="110" name="msg_form">
メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
</text_editor>
- <check_box label="ウェブ上ã§å…¬é–‹" name="allow_publish_check"
- tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ウェブ上ã§å…¬é–‹ã—ã¾ã™ã€‚" />
- <check_box label="æˆäººå‘ã‘コンテンツ" name="mature_check"
- tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã«ã¯æˆäººå‘ã‘内容ãŒå«ã¾ã‚Œã¾ã™ã€‚" />
- <button label="?" left="300" name="publish_help_btn" />
+ <check_box label="Web上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’Web上ã§å…¬é–‹ã—ã¾ã™ã€‚"/>
+ <check_box label="æˆäººå‘ã‘コンテンツ" name="mature_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã«ã¯æˆäººå‘ã‘内容ãŒå«ã¾ã‚Œã¾ã™ã€‚"/>
+ <button label="?" left="300" name="publish_help_btn"/>
<text name="fine_print">
ã“ã®å—信者ãŒSLã«å‚加ã™ã‚‹ã¨ã€ã‚ãªãŸã«ç´¹ä»‹ãƒœãƒ¼ãƒŠã‚¹ãŒå…¥ã‚Šã¾ã™
</text>
- <button bottom_delta="-52" label="å–り消ã—" name="cancel_btn" />
- <button label="é€ä¿¡" name="send_btn" />
+ <button bottom_delta="-52" label="å–り消ã—" name="cancel_btn"/>
+ <button label="é€ä¿¡" name="send_btn"/>
<text name="default_subject">
- [SECOND_LIFE] ã‹ã‚‰ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰
+ [SECOND_LIFE] ã‹ã‚‰ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã§ã™ã€‚
</text>
<text name="default_message">
ã“れã¯çµ¶å¯¾ãƒã‚§ãƒƒã‚¯ï¼
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 3d0c82bd41..6ba27b71a6 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -1,8 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Preferences" title="環境設定">
- <button label="OK" label_selected="OK" name="OK" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
- <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" />
- <button label="概è¦" label_selected="概è¦" name="About..." />
- <button label="ヘルプ" label_selected="ヘルプ" name="Help" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="一般" name="general"/>
+ <panel label="グラフィック" name="display"/>
+ <panel label="プライãƒã‚·ãƒ¼" name="im"/>
+ <panel label="サウンドã¨ãƒ¡ãƒ‡ã‚£ã‚¢" name="audio"/>
+ <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/>
+ <panel label="メッセージ" name="msgs"/>
+ <panel label="セットアップ" name="input"/>
+ <panel label="詳細" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index 653674129c..606dda12bd 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ アニメーション: [NAME]
+ </floater.string>
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn"
- tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä»–ã®äººã‚‚見るã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚" />
- <button label="ローカルã«å†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn"
- tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚" />
+ <button label="インワールドã§å†ç”Ÿã™ã‚‹" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«ã‚‚見ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
index f0770b2ed5..ba3bb028b2 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="クラシファイド広告情報" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="クラシファイド広告情報">
+ <floater.string name="Title">
+ クラシファイド広告: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_event.xml b/indra/newview/skins/default/xui/ja/floater_preview_event.xml
index 9ecabfabb0..21f57ca7a3 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_event.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="イベント情報" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="イベント情報">
+ <floater.string name="Title">
+ イベント: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index 1ec868d0d8..8a0aea717c 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -1,14 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ プレイã™ã‚‹ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ï¼š
+ </floater.string>
+ <floater.string name="step_sound">
+ プレイã™ã‚‹ã‚µã‚¦ãƒ³ãƒ‰ï¼š
+ </floater.string>
+ <floater.string name="step_chat">
+ 発言ã™ã‚‹ãƒãƒ£ãƒƒãƒˆï¼š
+ </floater.string>
+ <floater.string name="step_wait">
+ 待機:
+ </floater.string>
+ <floater.string name="stop_txt">
æ­¢ã¾ã‚‹
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
プレビュー
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- ãªã— --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ ジェスãƒãƒ£ãƒ¼ï¼š [NAME]
+ </floater.string>
+ <text name="name_text">
+ åå‰ï¼š
+ </text>
<text name="desc_label">
説明:
</text>
@@ -20,37 +38,30 @@
</text>
<line_editor name="replace_editor" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•れã¾ã™ã€‚"/>
<text name="key_label">
- ショートカット・キー:
+ ショートカット:
</text>
- <combo_box label="ãªã—" name="modifier_combo" left="160"/>
+ <combo_box label="ãªã—" left="160" name="modifier_combo"/>
<combo_box label="ãªã—" name="key_combo"/>
<text name="library_label">
ライブラリ:
</text>
+ <scroll_list name="library_list"/>
+ <button label="追加>>" name="add_btn"/>
<text name="steps_label">
手順:
</text>
- <scroll_list name="library_list">
- アニメーション
-サウンド
-ãƒãƒ£ãƒƒãƒˆ
-待機
- </scroll_list>
- <button label="追加>>" name="add_btn"/>
- <button label="上ã«ç§»å‹•" name="up_btn"/>
- <button label="下ã«ç§»å‹•" name="down_btn"/>
+ <button label="上" name="up_btn"/>
+ <button label="下" name="down_btn"/>
<button label="削除" name="delete_btn"/>
- <text name="help_label">
- 待機ステップを追加ã—ãªã„é™ã‚Šã€
-ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒåŒæ™‚ã«è¡Œã‚れ
-ã¾ã™ã€‚
- </text>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="é–‹å§‹" />
- <radio_item name="stop" label="åœæ­¢" />
+ <radio_item label="é–‹å§‹" name="start"/>
+ <radio_item label="åœæ­¢" name="stop"/>
</radio_group>
<check_box label="アニメーションãŒå®Œäº†ã™ã‚‹ã¾ã§" name="wait_anim_check"/>
<check_box label="ç§’è¡¨ç¤ºã®æ™‚é–“" name="wait_time_check"/>
+ <text name="help_label">
+ 待機ステップを入れãªã„é™ã‚Šã¯ã€ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒåŒæ™‚ã«èµ·ã“りã¾ã™ã€‚
+ </text>
<check_box label="アクティブ" left="120" name="active_check" tool_tip="アクティブ・ジェスãƒãƒ£ãƒ¼ã¯ã€ãƒˆãƒªã‚¬ãƒ¼ãƒ»ãƒ•レーズを使ã†ã‹ã€ã¾ãŸã¯ãƒ›ãƒƒãƒˆãƒ»ã‚­ãƒ¼ã‚’押ã™ã“ã¨ã«ã‚ˆã£ã¦ãƒˆãƒªã‚¬ãƒ¼ã§ãã¾ã™ã€‚ 1ã¤ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆãƒ»ã‚­ãƒ¼ã«2ã¤ä»¥ä¸Šã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå ´åˆã€ãã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ä¸¡æ–¹ã¨ã‚‚アクティブã§ã¯ãªããªã‚Šã¾ã™ã€‚"/>
<button label="プレビュー" name="preview_btn"/>
<button label="ä¿å­˜" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..682b295a14
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..e96a43d0c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ">
+ <text name="trigger_label">
+ ãƒãƒ£ãƒƒãƒˆï¼š
+ </text>
+ <text name="key_label">
+ キーボード:
+ </text>
+ <combo_box label="ãªã—" name="modifier_combo" width="60"/>
+ <combo_box label="ãªã—" name="key_combo" width="60"/>
+ <text name="replace_text" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã¾ã™ã€‚">
+ ç½®ãæ›ãˆï¼š
+ </text>
+ <line_editor name="replace_editor" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã¾ã™ã€‚"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..682b295a14
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
index e7dd4d2c09..6e6e04c7d8 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview notecard" title="メモ:">
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="ノートカード:">
+ <floater.string name="no_object">
+ ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ãŒå«ã¾ã‚ŒãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="not_allowed">
+ ã“ã®ãƒŽãƒ¼ãƒˆã‚’見る権é™ãŒã‚りã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="Title">
+ ノートカード: [NAME]
+ </floater.string>
+ <floater.string label="ä¿å­˜" label_selected="ä¿å­˜" name="Save">
+ ä¿å­˜
+ </floater.string>
<text name="desc txt">
説明:
</text>
<text_editor name="Notecard Editor">
ローディング...
</text_editor>
- <text name="no_object">
- ã“ã®ãƒŽãƒ¼ãƒˆã‚’å«ã‚“ã ã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
- </text>
- <text name="not_allowed">
- ã‚ãªãŸã¯ã“ã®ãƒŽãƒ¼ãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã›ã‚“。
- </text>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
index 244ef13d13..c8375389ce 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ サウンド: [NAME]
+ </floater.string>
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn"
- tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’ä»–ã®äººã‚‚èžãã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚" />
- <button label="ローカルã«å†ç”Ÿ" label_selected="ローカルã«å†ç”Ÿ"
- name="Sound audition btn"
- tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚" />
+ <button label="インワールドã§å†ç”Ÿã™ã‚‹" label_selected="インワールドã§å†ç”Ÿã™ã‚‹" name="Sound play btn" tool_tip="他人ã«ã‚‚èžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="ローカルå†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
index ffd9e3bfbe..6ea1d79cfc 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
@@ -1,9 +1,47 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ テクスãƒãƒ£ï¼š [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ æŒã¡ç‰©ã«ã‚³ãƒ”ー
+ </floater.string>
<text name="desc txt">
説明:
</text>
<text name="dimensions">
- 寸法:[HEIGHT]x[WIDTH]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <text name="aspect_ratio">
+ 縦横比ã®ãƒ—レビュー
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="固定ã—ãŸç¸¦æ¨ªæ¯”ã®ãƒ—レビュー">
+ <combo_item name="Unconstrained">
+ éžæ‹˜æŸ
+ </combo_item>
+ <combo_item name="1:1" tool_tip="グループ記章ã‹ç¾å®Ÿä¸–界ã®ãƒ—ロフィール">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] プロフィール">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã€æ¤œç´¢ä¸€è¦§ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="土地情報">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="プロフィールã®ãƒ”ック">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="処分ã™ã‚‹" name="Discard"/>
+ <button label="別åã§ä¿å­˜" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_region_info.xml b/indra/newview/skins/default/xui/ja/floater_region_info.xml
index 7ac7facce5..d08c51c61e 100644
--- a/indra/newview/skins/default/xui/ja/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/ja/floater_region_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="地域/ä¸å‹•産" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="地域 / ä¸å‹•産"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index 6eae7613b3..c66f307f23 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="嫌ãŒã‚‰ã›ã®å ±å‘Š">
- <texture_picker label="" name="screenshot"/>
- <check_box label="スクリーï¾ï½¼ï½®ï½¯ï¾„ã‚’å«ã‚ã‚‹" name="screen_check"/>
+ <floater.string name="Screenshot">
+ スクリーンショット
+ </floater.string>
+ <check_box label="ã“ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’使用" name="screen_check"/>
<text name="reporter_title">
報告者:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
地域:
@@ -21,106 +23,66 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- ボタンを使ã£ã¦ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžï¼š
+ ボタンをクリックã—ã¦ã‹ã‚‰ã€æ‚ªæ„ã®ã‚るオブジェクトをクリック:
</text>
- <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/>
+ <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクトピッカー - 報告対象ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„"/>
<text name="object_name_label">
- åå‰ï¼š
+ オブジェクト:
</text>
<text name="object_name">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
- オーナー:
+ 所有者:
</text>
<text name="owner_name">
- Hendrerit Vulputate
- </text>
- <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„">
- <combo_box.item name="Select_category" label="ã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠž"
- />
- <combo_box.item name="Age__Age_play" label="年齢>年齢å½è¨¼"
- />
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="年齢>æˆäººã®ä½äººãŒTeen Second Life上ã«ã„ã‚‹"
- />
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="年齢>未æˆå¹´ãªä½äººãŒTeen Second Lifeã®å¤–ã«ã„ã‚‹"
- />
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢"
- />
- <combo_box.item name="Assault__Safe_area" label="攻撃>安全ãªã‚¨ãƒªã‚¢"
- />
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="攻撃>武器テスト用サンドボックス"
- />
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ãŒè¡Œã‚れãªã„"
- />
- <combo_box.item name="Disclosure__Real_world_information" label="é–‹ç¤ºï¼žãƒªã‚¢ãƒ«ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®æƒ…å ±"
- />
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹"
- />
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM"
- />
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³"
- />
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨"
- />
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¨ã¦ç½®ã"
- />
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム"
- />
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム"
- />
- <combo_box.item name="Fraud__L$" label="è©æ¬ºï¼ž L$"
- />
- <combo_box.item name="Fraud__Land" label="è©æ¬ºï¼žåœŸåœ°"
- />
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«"
- />
- <combo_box.item name="Fraud__US$" label="è©æ¬ºï¼ž US$"
- />
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム"
- />
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸­å‚·"
- />
- <combo_box.item name="Harassment__Impeding_movement" label="嫌ãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³"
- />
- <combo_box.item name="Harassment__Sexual_harassment" label="嫌ãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›"
- />
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="嫌ãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’行ã†ã‚ˆã†ä»–者を勧誘/扇動"
- />
- <combo_box.item name="Harassment__Verbal_abuse" label="嫌ãŒã‚‰ã›ï¼žæš´è¨€"
- />
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•れるコンテンツã¾ãŸã¯è¡Œç‚º"
- />
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å"
- />
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º"
- />
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="ã‚ã„ã›ã¤ï¼žMature地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º"
- />
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»"
- />
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨"
- />
- <combo_box.item name="Intolerance" label="ä¸å¯›å®¹"
- />
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="土地>サンドボックス・リソースã®ä¹±ç”¨"
- />
- <combo_box.item name="Land__Encroachment__Objects_textures" label="åœŸåœ°ï¼žä¸æ³•侵入>オブジェクト/テクスãƒãƒ£ãƒ¼"
- />
- <combo_box.item name="Land__Encroachment__Particles" label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル"
- />
- <combo_box.item name="Land__Encroachment__Trees_plants" label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©"
- />
- <combo_box.item name="Wagering_gambling" label="è³­ã‘/ギャンブル"
- />
- <combo_box.item name="Other" label="ãã®ä»–"
- />
+ Hendrerit Vulputate Kamawashi Longname
+ </text>
+ <combo_box name="category_combo" tool_tip="カテゴリ -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„">
+ <combo_box.item label="ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„" name="Select_category"/>
+ <combo_box.item label="年齢>年齢å½è¨¼" name="Age__Age_play"/>
+ <combo_box.item label="å¹´é½¢ &gt; æˆäººã®ä½äººãŒ Teen Second Life ã«ã„ã‚‹" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="å¹´é½¢ &gt; 未æˆå¹´ã®ä½äººãŒTeen Second Life ã®å¤–ã«ã„ã‚‹" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="攻撃>安全ãªã‚¨ãƒªã‚¢" name="Assault__Safe_area"/>
+ <combo_box.item label="攻撃>武器テスト用サンドボックス" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ãŒè¡Œã‚れãªã„" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="é–‹ç¤ºï¼žãƒªã‚¢ãƒ«ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®æƒ…å ±" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¨ã¦ç½®ã" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="è©æ¬ºï¼ž L$" name="Fraud__L$"/>
+ <combo_box.item label="è©æ¬ºï¼žåœŸåœ°" name="Fraud__Land"/>
+ <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="è©æ¬ºï¼ž US$" name="Fraud__US$"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸­å‚·" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’行ã†ã‚ˆã†ä»–者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæš´è¨€" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•れるコンテンツã¾ãŸã¯è¡Œç‚º" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="ã‚ã„ã›ã¤ &gt; 控ãˆã‚指定ã®åœ°åŸŸã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="ä¸å¯›å®¹" name="Intolerance"/>
+ <combo_box.item label="土地>サンドボックス・リソースã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>オブジェクト/テクスãƒãƒ£ãƒ¼" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="è³­ã‘/ギャンブル" name="Wagering_gambling"/>
+ <combo_box.item label="ãã®ä»–" name="Other"/>
</combo_box>
<text name="abuser_name_title">
迷惑ユーザーã®åå‰ï¼š
</text>
- <button label="ä½äººã‚’é¸æŠž" label_selected="" name="select_abuser" tool_tip="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ãŒä¸æ˜Ž" name="omit_abuser_name" tool_tip="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’æä¾›ã§ããªã„ã‹ã«ã¤ã„ã¦ã€ã“れを確èª"/>
+ <button label="é¸æŠž" label_selected="" name="select_abuser" tool_tip="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/>
<text name="abuser_name_title2">
嫌ãŒã‚‰ã›ã®èµ·ããŸå ´æ‰€ï¼š
</text>
@@ -130,14 +92,12 @@
<text name="dscr_title">
詳細:
</text>
- <text name="bug_aviso">
- 日付ã€å ´æ‰€ã€å«ŒãŒã‚‰ã›ã®ç‰¹å¾´ã€é–¢é€£ã™ã‚‹ä¼šè©±ï¼IMテキス
-トã«é–¢ã—明確ã«è¨˜å…¥ã—ã€å¯èƒ½ã§ã‚れã°ã‚ªãƒ–ジェクトをé¸
-択ã—ã¦ãã ã•ã„。
+ <text name="bug_aviso" width="210">
+ ã§ãã‚‹ã ã‘具体的ã«è©³ã—ã記入ã—ã¦ãã ã•ã„。
</text>
<text name="incomplete_title">
- 注æ„:ä¸å®Œå…¨ãªãƒ¬ãƒãƒ¼ãƒˆã¯èª¿æŸ»ã•れã¾ã›ã‚“。
+ * ä¸å®Œå…¨ãªå ±å‘Šã¯èª¿æŸ»å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。
</text>
- <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="嫌ãŒã‚‰ã›ã®å ±å‘Š" label_selected="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="send_btn"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug.xml b/indra/newview/skins/default/xui/ja/floater_script_debug.xml
index dd934e3592..0ac7a988e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater name="script debug floater" title="スクリプト警告ï¼ã‚¨ãƒ©ãƒ¼">
<tab_container name="Preview Tabs">
- <floater label="スクリプト" name="all_scripts" title="[All scripts]" />
+ <floater label="スクリプト" name="all_scripts" title="[ALL SCRIPTS]" />
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_limits.xml b/indra/newview/skins/default/xui/ja/floater_script_limits.xml
new file mode 100644
index 0000000000..7ccd858af7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="スクリプト情報"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_preview.xml b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
index ef729e0f6f..656357aa17 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="スクリプト:回転スクリプト">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="スクリプト: 回転スクリプト">
+ <floater.string name="Title">
+ スクリプト: [NAME]
+ </floater.string>
<text name="desc txt">
説明:
</text>
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 7c4979a033..97e79fb483 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
@@ -1,4 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="queue" title="進æ—ã®ãƒªã‚»ãƒƒãƒˆ">
- <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="進行ã®ãƒªã‚»ãƒƒãƒˆ">
+ <floater.string name="Starting">
+ [COUNT] アイテム㮠[START] ã‚’é–‹å§‹ã—ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="Done">
+ 完了。
+ </floater.string>
+ <floater.string name="Resetting">
+ リセット中
+ </floater.string>
+ <floater.string name="Running">
+ 実行中
+ </floater.string>
+ <floater.string name="NotRunning">
+ 実行ã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_search.xml b/indra/newview/skins/default/xui/ja/floater_script_search.xml
index 90f4393bf7..bc4f48c995 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_search.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script search" title="スクリプト検索">
- <check_box label="大文字ã¨å°æ–‡å­—を区別ã—ãªã„" name="case_text" />
- <button label="検索" label_selected="検索" name="search_btn" />
- <button label="ç½®æ›" label_selected="ç½®æ›" name="replace_btn" />
- <button label="ã™ã¹ã¦ç½®æ›" label_selected="ã™ã¹ã¦ç½®æ›" name="replace_all_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="ã‚¹ã‚¯ãƒªãƒ—ãƒˆã®æ¤œç´¢">
+ <check_box label="大文字ã¨å°æ–‡å­—を区別ã—ãªã„" name="case_text"/>
+ <button label="検索" label_selected="検索" name="search_btn"/>
+ <button label="ç½®æ›" label_selected="ç½®æ›" name="replace_btn"/>
+ <button label="ã™ã¹ã¦ç½®æ›" label_selected="ã™ã¹ã¦ç½®æ›" name="replace_all_btn"/>
<text name="txt">
検索
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml
new file mode 100644
index 0000000000..289098a343
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="検索">
+ <floater.string name="loading_text">
+ ローディング...
+ </floater.string>
+ <floater.string name="done_text">
+ 完了
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ ç¾åœ¨ã®ã‚´ãƒƒãƒ‰ãƒ¬ãƒ™ãƒ«ã«å映ã•ã›ã‚‹ãŸã‚検索をやり直ã—ã¦ãã ã•ã„
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_select_key.xml b/indra/newview/skins/default/xui/ja/floater_select_key.xml
index 09c98add47..d41be86873 100644
--- a/indra/newview/skins/default/xui/ja/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/ja/floater_select_key.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="キャンセル" label_selected="キャンセル" name="Cancel" />
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<text name="Save item as:">
- キーを押ã—ã¦é¸æŠž
+ キーを押ã—ã¦ã‚¹ãƒ”ーカーボタンã®ãƒˆãƒªã‚¬ãƒ¼ã‚’設定ã—ã¾ã™ã€‚
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index 5193e5bba1..1e884af5f2 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -1,70 +1,65 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="sell land" title="土地を販売" height="496" min_height="496" >
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- 区画:
- </text>
- <text name="info_parcel">
- 区画å
- </text>
- <text name="info_size_label">
- サイズ:
- </text>
- <text name="info_size">
- [AREA]平方メートル
- </text>
- <text name="info_action" bottom_delta="-57">
- ã“ã®åŒºç”»ã‚’販売ã™
-ã‚‹ã«ã¯:
- </text>
- <icon bottom_delta="-86" name="step_price" />
- <text name="price_label">
- 価格を設定:
- </text>
- <text name="price_text">
- ã“ã®åœŸåœ°ã«å¯¾ã™ã‚‹é©åˆ‡ãªä¾¡æ ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m" width="230" left_delta="106">
- (1平方メートル当ãŸã‚ŠL$ [PER_METER])
- </text>
- <text name="sell_to_label">
- 土地ã®è²©å£²å…ˆï¼š
- </text>
- <text name="sell_to_text" right="-6">
- 誰ã«ã§ã‚‚販売ã™ã‚‹ã‹ã€ç‰¹å®šã®äººã«ã®ã¿è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="1ã¤é¸æŠžï¼ï¼" />
- <combo_box.item name="Anyone" label="誰ã§ã‚‚" />
- <combo_box.item name="Specificuser:" label="特定ユーザー:" />
- </combo_box>
- <button label="é¸æŠž..." name="sell_to_select_agent" />
- <text name="sell_objects_label">
- 土地ã¨å…±ã«ã‚ªãƒ–ジェクトを販売ã—ã¾ã™ã‹ï¼Ÿ
- </text>
- <text name="sell_objects_text">
- 区画上ã«ã‚る譲渡å¯èƒ½ãªã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•れã¾ã™
- </text>
- <radio_group name="sell_objects" height="72" bottom_delta="-76">
- <radio_item name="no">
- ã„ã„ãˆã€ã‚ªãƒ–ジェクト所有権
-ã‚’ä¿æŒã—ã¾ã™
- </radio_item>
- <radio_item name="yes" bottom="-56">
- ã¯ã„ã€åœŸåœ°ã¨ä¸€ç·’ã«ã‚ªãƒ–ジェ
-クトを売りã¾ã™
- </radio_item>
- </radio_group>
- <button label="オブジェクトを表示" name="show_objects" width="138"/>
- <text name="nag_message_label">
- 注æ„:返å“や交æ›ã¯ã§ãã¾ã›ã‚“
- </text>
- <button label="販売を決定" name="sell_btn" bottom="-489"/>
- <button label="å–り消ã—" name="cancel_btn" />
- </panel>
- </scroll_container>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="496" min_height="496" name="sell land" title="土地ã®è²©å£²">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ 区画:
+ </text>
+ <text name="info_parcel">
+ PARCEL NAME
+ </text>
+ <text name="info_size_label">
+ サイズ:
+ </text>
+ <text name="info_size">
+ [AREA] 平方メートル
+ </text>
+ <text bottom_delta="-57" name="info_action">
+ ã“ã®åŒºç”»ã‚’販売:
+ </text>
+ <text name="price_label">
+ 1. 価格ã®è¨­å®šï¼š
+ </text>
+ <text name="price_text">
+ 驿­£ä¾¡æ ¼ã‚’設定ã—ã¦ãã ã•ã„。
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text left_delta="106" name="price_per_m" width="230">
+ (1平方メートルã‚ãŸã‚Š L$[PER_METER])
+ </text>
+ <text name="sell_to_label">
+ 2. 特定ã®äººã«è²©å£²ï¼š
+ </text>
+ <text name="sell_to_text" right="-6">
+ è²©å£²å…ˆã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- 1ã¤é¸æŠž -" name="--selectone--"/>
+ <combo_box.item label="指定ãªã—・誰ã«ã§ã‚‚販売" name="Anyone"/>
+ <combo_box.item label="特定ã®äººï¼š" name="Specificuser:"/>
+ </combo_box>
+ <button label="é¸æŠž" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. オブジェクトも土地ã¨ä¸€ç·’ã«è²©å£²ã—ã¾ã™ã‹ï¼Ÿ
+ </text>
+ <text name="sell_objects_text">
+ 区画上ã«ã‚ã‚‹ã€åœŸåœ°æ‰€æœ‰è€…ã®è­²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•れã¾ã™ã€‚
+ </text>
+ <radio_group bottom_delta="-76" height="72" name="sell_objects">
+ <radio_item label="ã„ã„ãˆã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰æ¨©ã‚’ä¿æŒã—ã¾ã™" name="no"/>
+ <radio_item bottom="-56" label="ã¯ã„ã€ã‚ªãƒ–ジェクトã¨åœŸåœ°ã‚’一緒ã«è²©å£²ã—ã¾ã™" name="yes"/>
+ </radio_group>
+ <button label="オブジェクトを表示" name="show_objects" width="138"/>
+ <text name="nag_message_label">
+ 注æ„: è¿”å“・交æ›ã¯ã§ãã¾ã›ã‚“。
+ </text>
+ <button bottom="-489" label="土地を販売" name="sell_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
index 133a8ce2cd..cb7950bf53 100644
--- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="デãƒãƒƒã‚°è¨­å®š">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="æ­£" />
- <combo_box.item name="FALSE" label="誤" />
+ <combo_box.item label="TRUE" name="TRUE"/>
+ <combo_box.item label="FALSE" name="FALSE"/>
</combo_box>
- <color_swatch label="色" name="color_swatch" />
- <spinner label="x" name="val_spinner_1" />
- <spinner label="x" name="val_spinner_2" />
- <spinner label="x" name="val_spinner_3" />
- <spinner label="x" name="val_spinner_4" />
- <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn" />
+ <color_swatch label="色" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index fb9f7be7a9..53384aca90 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -1,26 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="プレビュー">
+<floater name="Snapshot" title="スナップショットã®ãƒ—レビュー">
<text name="type_label">
スナップショットã®é€ã‚Šå…ˆ
</text>
<radio_group label="スナップショット・タイプ" name="snapshot_type_radio">
- <radio_item name="postcard" label="Eメールã§é€ä¿¡" />
- <radio_item name="texture" label="æŒã¡ç‰©ã«ä¿å­˜ï¼ˆL$[AMOUNT])" />
- <radio_item name="local" label="ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã«ä¿å­˜" />
+ <radio_item label="メール" name="postcard"/>
+ <radio_item label="ç§ã®æŒã¡ç‰©ï¼ˆL$[AMOUNT])" name="texture"/>
+ <radio_item label="コンピューターã«ä¿å­˜" name="local"/>
</radio_group>
<text name="file_size_label">
- ファイル・サイズ: [SIZE] KB
+ [SIZE] KB
</text>
<button label="スナップショットを更新" name="new_snapshot_btn"/>
<button label="é€ä¿¡" name="send_btn"/>
<button label="ä¿å­˜ï¼ˆL$[AMOUNT])" name="upload_btn"/>
<flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
- <flyout_button.item name="save_item" label="ä¿å­˜"/>
- <flyout_button.item name="saveas_item" label="åå‰ã‚’付ã‘ã¦ä¿å­˜"/>
+ <flyout_button.item label="ä¿å­˜" name="save_item"/>
+ <flyout_button.item label="åå‰ã‚’付ã‘ã¦ä¿å­˜" name="saveas_item"/>
</flyout_button>
<button label="キャンセル" name="discard_btn"/>
- <button label="全表示 &gt;&gt;" name="more_btn" tool_tip="高度ãªã‚ªãƒ—ション"/>
- <button label="&lt;&lt; 簡易" name="less_btn" tool_tip="高度ãªã‚ªãƒ—ション"/>
+ <button label="全表示" name="more_btn" tool_tip="詳ã—ã„設定"/>
+ <button label="簡易" name="less_btn" tool_tip="詳ã—ã„設定"/>
<text name="type_label2">
サイズ
</text>
@@ -28,50 +28,50 @@
å½¢å¼
</text>
<combo_box label="è§£åƒåº¦" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="Custom" label="カスタム" />
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<combo_box label="è§£åƒåº¦" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" />
- <combo_box.item name="Small(128x128)" label="å°ï¼ˆ128x128)" />
- <combo_box.item name="Medium(256x256)" label="中(256x256)" />
- <combo_box.item name="Large(512x512)" label="大(512x512)" />
- <combo_box.item name="Custom" label="カスタム" />
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/>
+ <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="大(512x512)" name="Large(512x512)"/>
+ <combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<combo_box label="è§£åƒåº¦" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" />
- <combo_box.item name="320x240" label="320x240" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="1280x1024" label="1280x1024" />
- <combo_box.item name="1600x1200" label="1600x1200" />
- <combo_box.item name="Custom" label="カスタム" />
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<combo_box label="å½¢å¼" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG" />
- <combo_box.item name="JPEG" label="JPEG" />
- <combo_box.item name="BMP" label="BMP" />
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="å¹…" name="snapshot_width" label_width="25" width="90"/>
- <spinner label="高ã•" name="snapshot_height" label_width="30" left="115" width="90"/>
+ <spinner label="å¹…" label_width="25" name="snapshot_width" width="90"/>
+ <spinner label="高ã•" label_width="30" left="115" name="snapshot_height" width="90"/>
<check_box label="縦横比ã®å›ºå®š" name="keep_aspect_check"/>
<slider label="画質" name="image_quality_slider"/>
<text name="layer_type_label">
- キャプï¾ï½¬ï¼š
+ キャプãƒãƒ£ï¼š
</text>
<combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
- <combo_box.item name="Colors" label="色" />
- <combo_box.item name="Depth" label="æ·±ã•" />
- <combo_box.item name="ObjectMattes" label="オグジェクトã®ã¤ã‚„消ã—" />
+ <combo_box.item label="色" name="Colors"/>
+ <combo_box.item label="色深度" name="Depth"/>
+ <combo_box.item label="マットオブジェクト" name="ObjectMattes"/>
</combo_box>
- <check_box label="インタフェースを表示" name="ui_check"/>
- <check_box label="HUD オブジェクトを表示" name="hud_check"/>
+ <check_box label="インターフェース" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
<check_box label="ä¿å­˜å¾Œã‚‚é–‹ã„ãŸçŠ¶æ…‹ã‚’ä¿æŒ" name="keep_open_check"/>
- <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢ã•ã›ã‚‹" name="freeze_frame_check"/>
+ <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
<check_box label="自動更新" name="auto_snapshot_check"/>
<string name="unknown">
未知
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
index b247914389..7d83309c46 100644
--- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Sound Preview" title="sound.wav">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
<text name="name_label">
åå‰ï¼š
</text>
<text name="description_label">
説明:
</text>
- <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" />
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="アップロード (L$[AMOUNT])" label_selected="アップロード (L$[AMOUNT])" name="ok_btn"/>
<text name="text">
- ビットレート(kbps):
+ ビットレート(kbps):
</text>
<radio_group name="bitrate">
- <radio_item name="32" label="32" />
- <radio_item name="64" label="64" />
- <radio_item name="96" label="96" />
- <radio_item name="128" label="128" />
+ <radio_item label="32" name="32"/>
+ <radio_item label="64" name="64"/>
+ <radio_item label="96" name="96"/>
+ <radio_item label="128" name="128"/>
</radio_group>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
new file mode 100644
index 0000000000..97927776c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="統計">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="ベーシック" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="帯域幅" name="bandwidth"/>
+ <stat_bar label="パケットロス" name="packet_loss"/>
+ <stat_bar label="Pingシム" name="ping"/>
+ </stat_view>
+ <stat_view label="アドãƒãƒ³ã‚¹" name="advanced">
+ <stat_view label="æç”»" name="render">
+ <stat_bar label="KTris æç”»" name="ktrisframe"/>
+ <stat_bar label="KTris æç”»" name="ktrissec"/>
+ <stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/>
+ <stat_bar label="æ–°è¦ã‚ªãƒ–ジェクト" name="newobjs"/>
+ </stat_view>
+ <stat_view label="テクスãƒãƒ£" name="texture">
+ <stat_bar label="カウント" name="numimagesstat"/>
+ <stat_bar label="Raw カウント" name="numrawimagesstat"/>
+ <stat_bar label="GL メモリ" name="gltexmemstat"/>
+ <stat_bar label="フォーマット済メモリ" name="formattedmemstat"/>
+ <stat_bar label="Raw メモリ" name="rawmemstat"/>
+ <stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network">
+ <stat_bar label="パケットイン" name="packetsinstat"/>
+ <stat_bar label="パケットアウト" name="packetsoutstat"/>
+ <stat_bar label="オブジェクト" name="objectkbitstat"/>
+ <stat_bar label="テクスãƒãƒ£" name="texturekbitstat"/>
+ <stat_bar label="アセット" name="assetkbitstat"/>
+ <stat_bar label="レイヤー" name="layerskbitstat"/>
+ <stat_bar label="実際ã®å—ä¿¡" name="actualinkbitstat"/>
+ <stat_bar label="実際ã®é€ä¿¡" name="actualoutkbitstat"/>
+ <stat_bar label="VFS ä¿ç•™ä¸­ã®æ“作" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="シミュレーター" name="sim">
+ <stat_bar label="時間ã®é…れ" name="simtimedilation"/>
+ <stat_bar label="シム FPS" name="simfps"/>
+ <stat_bar label="物ç†ä½œç”¨ FPS" name="simphysicsfps"/>
+ <stat_view label="物ç†ä½œç”¨ã®è©³ç´°" name="physicsdetail">
+ <stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/>
+ <stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/>
+ <stat_bar label="メモリé…分" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°/ç§’" name="simagentups"/>
+ <stat_bar label="メインエージェント" name="simmainagents"/>
+ <stat_bar label="ãƒãƒ£ã‚¤ãƒ«ãƒ‰ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ" name="simchildagents"/>
+ <stat_bar label="オブジェクト" name="simobjects"/>
+ <stat_bar label="アクティブãªã‚ªãƒ–ジェクト" name="simactiveobjects"/>
+ <stat_bar label="アクティブãªã‚¹ã‚¯ãƒªãƒ—ト" name="simactivescripts"/>
+ <stat_bar label="スクリプトイベント" name="simscripteps"/>
+ <stat_bar label="パケットイン" name="siminpps"/>
+ <stat_bar label="パケットアウト" name="simoutpps"/>
+ <stat_bar label="ä¿ç•™ä¸­ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" name="simpendingdownloads"/>
+ <stat_bar label="ä¿ç•™ä¸­ã®ã‚¢ãƒƒãƒ—ロード" name="simpendinguploads"/>
+ <stat_bar label="未é€ä¿¡ãƒã‚¤ãƒˆåˆè¨ˆ" name="simtotalunackedbytes"/>
+ <stat_view label="時間(ms)" name="simperf">
+ <stat_bar label="フレーム時間åˆè¨ˆ" name="simframemsec"/>
+ <stat_bar label="ç·æ™‚é–“æ•°" name="simnetmsec"/>
+ <stat_bar label="物ç†çš„作用時間" name="simsimphysicsmsec"/>
+ <stat_bar label="シミュレーション時間" name="simsimothermsec"/>
+ <stat_bar label="エージェント時間" name="simagentmsec"/>
+ <stat_bar label="イメージ時間" name="simimagesmsec"/>
+ <stat_bar label="スクリプト時間" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sys_well.xml b/indra/newview/skins/default/xui/ja/floater_sys_well.xml
new file mode 100644
index 0000000000..3ac2a11a97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification_chiclet" title="通知">
+ <string name="title_im_well_window">
+ æ›ç®—
+ </string>
+ <string name="title_notification_well_window">
+ 通知
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_telehub.xml b/indra/newview/skins/default/xui/ja/floater_telehub.xml
index cd590abe3c..7318083771 100644
--- a/indra/newview/skins/default/xui/ja/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/ja/floater_telehub.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="telehub" title="テレãƒãƒ–">
<text name="status_text_connected">
物体[OBJECT]ã«æŽ¥ç¶šã•れãŸãƒ†ãƒ¬ãƒãƒ–
@@ -10,19 +10,16 @@
「切断ã€ã‚’クリックã—ã¦å‰Šé™¤ã—ã¾ã™ã€‚
</text>
<text name="help_text_not_connected">
- ç‰©ä½“ã‚’é¸æŠžã—「テレãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã™ã‚‹
+ ç‰©ä½“ã‚’é¸æŠžã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã—ã¦ãã ã•ã„。
</text>
- <button label="テレãƒãƒ–ã®æŽ¥ç¶š" name="connect_btn" />
- <button label="切断" name="disconnect_btn" />
+ <button label="テレãƒãƒ–ã®æŽ¥ç¶š" name="connect_btn"/>
+ <button label="切断" name="disconnect_btn"/>
<text name="spawn_points_text">
出ç¾åœ°ç‚¹ï¼ˆç‰©ä½“ã§ã¯ãªãä½ç½®ï¼‰
</text>
- <button label="出ç¾ä½ç½®ã‚’追加" name="add_spawn_point_btn" />
- <button label="出ç¾åœ°ç‚¹ã‚’削除" name="remove_spawn_point_btn" />
+ <button label="出ç¾ä½ç½®ã‚’追加" name="add_spawn_point_btn"/>
+ <button label="出ç¾åœ°ç‚¹ã‚’削除" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- ç‰©ä½“ã‚’é¸æŠžã—「追加ã€ã‚’クリックã—ä½ç½®ã‚’指定。
-物体を移動ã¾ãŸã¯å‰Šé™¤ã§ãる。
-ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–・センターãŒåŸºæº–ã®ç›¸å¯¾ä½ç½®ã€‚
-リスト内å“ç›®ã‚’é¸æŠžã—ワールド内ä½ç½®ã‚’示ã™ã€‚
+ オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’追加ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 5102116069..399cffcce5 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="texture picker" title="é¸æŠžï¼šãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="テクスãƒãƒ£ã®é¸æŠž">
<string name="choose_picture">
クリックã—ã¦å†™çœŸã‚’é¸æŠž
</string>
<text name="Multiple">
- 複数
+ 複数ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£
</text>
<text name="unknown">
- 寸法: [DIMENSIONS]
+ サイズ: [DIMENSIONS]
</text>
- <button label="デフォルト" label_selected="デフォルト" name="Default" />
- <button label="ãªã—" label_selected="ãªã—" name="None" />
- <button label="ブランク" label_selected="ブランク" name="Blank" />
- <check_box label="フォルダを表示" name="show_folders_check" />
- <search_editor label="ã“ã“ã«ã‚¿ã‚¤ãƒ—ã—ã¦æ¤œç´¢" name="inventory search editor" />
- <check_box label="ãŸã ã¡ã«é©ç”¨" name="apply_immediate_check" />
- <button label="" label_selected="" name="Pipette" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
- <button label="é¸æŠž" label_selected="é¸æŠž" name="Select" />
+ <button label="デフォルト" label_selected="デフォルト" name="Default"/>
+ <button label="ãªã—" label_selected="ãªã—" name="None"/>
+ <button label="ブランク" label_selected="ブランク" name="Blank"/>
+ <check_box label="フォルダを表示" name="show_folders_check"/>
+ <search_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/>
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate_check"/>
+ <button label="" label_selected="" name="Pipette"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<text name="pick title">
ピック:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 5840773dbd..24bb5b614c 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -1,42 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="制作">
+<floater name="toolbox floater" short_title="制作ツール" title="">
+ <floater.string name="status_rotate">
+ 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転
+ </floater.string>
+ <floater.string name="status_scale">
+ é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™
+ </floater.string>
+ <floater.string name="status_move">
+ 移動:ドラッグã€ã‚³ãƒ”ー:Shift + ドラッグ
+ </floater.string>
+ <floater.string name="status_modifyland">
+ 土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ­£å¤‰æ›´
+ </floater.string>
+ <floater.string name="status_camera">
+ クリック + ドラッグã§è¦–界移動
+ </floater.string>
+ <floater.string name="status_grab">
+ ドラッグã§ç§»å‹•ã€Ctrlã§æŒã¡ä¸Šã’ã€Ctrl + Shiftã§å›žè»¢
+ </floater.string>
+ <floater.string name="status_place">
+ インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ
+ </floater.string>
+ <floater.string name="status_selectland">
+ 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ ç”»é¢
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ローカル
+ </floater.string>
+ <floater.string name="grid_world_text">
+ インワールド
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ レファレンス
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ アタッãƒãƒ¡ãƒ³ãƒˆ
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
<button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/>
<button label="" label_selected="" name="button edit" tool_tip="編集"/>
<button label="" label_selected="" name="button create" tool_tip="作æˆ"/>
<button label="" label_selected="" name="button land" tool_tip="土地"/>
+ <text name="text status">
+ 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftキーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚°
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="ズーム" name="radio zoom"/>
<radio_item label="軌跡(Ctrl)" name="radio orbit"/>
- <radio_item label="パン(Ctrl+Shift)" name="radio pan"/>
+ <radio_item label="水平・垂直移動 (Ctrl + Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="移動" name="radio move"/>
<radio_item label="æŒã¡ä¸Šã’る(Ctrl)" name="radio lift"/>
- <radio_item label="スピン(Ctrl+Shift)" name="radio spin"/>
+ <radio_item label="回転 (Ctrl + Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="ä½ç½®" name="radio position"/>
+ <radio_item label="移動" name="radio position"/>
<radio_item label="回転(Ctrl)" name="radio rotate"/>
- <radio_item label="引伸ã°ã™ï¼ˆCtrl+Shift)" name="radio stretch"/>
- <radio_item label="テクスãƒãƒ£ãƒ¼ã‚’é¸æŠž" name="radio select face"/>
+ <radio_item label="引ãå»¶ã°ã™ (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="é¢ã‚’é¸æŠž" name="radio select face"/>
</radio_group>
- <check_box label="リンク部ä½ã‚’編集" name="checkbox edit linked parts"/>
- <text name="text ruler mode" width="88">
- ルーラー:
+ <check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示">
+ þ: [COUNT]
</text>
- <combo_box left_delta="60" name="combobox grid mode" width="76">
- <combo_box.item name="World" label="世界"/>
- <combo_box.item name="Local" label="ローカル"/>
- <combo_box.item name="Reference" label="リファレンス"/>
- </combo_box>
<check_box label="両å´ã‚’引伸ã°ã™" left="116" name="checkbox uniform"/>
- <check_box label="テクスãƒãƒ£ãƒ¼ã‚’引伸ã°ã™" name="checkbox stretch textures"/>
- <check_box label="グリッド使用" left_delta="27" name="checkbox snap to grid"/>
- <button label="オプション" label_selected="オプション" name="Options..."/>
- <text name="text status">
- 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftキーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚°
- </text>
+ <check_box initial_value="true" label="テクスãƒãƒ£ã‚’引伸ã°ã™" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/>
+ <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠž" width="76">
+ <combo_box.item label="インワールドグリッド" name="World"/>
+ <combo_box.item label="ローカルグリッド" name="Local"/>
+ <combo_box.item label="リファレンスグリッド" name="Reference"/>
+ </combo_box>
+ <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示ã—ã¾ã™"/>
<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
@@ -52,9 +91,9 @@
<button label="" label_selected="" name="ToolRing" tool_tip="リング"/>
<button label="" label_selected="" name="ToolTree" tool_tip="樹木"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="è‰åœ°"/>
- <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿æŒ" name="checkbox sticky"/>
+ <check_box label="é¸æŠžã—ãŸãƒ„ールを維æŒ" name="checkbox sticky"/>
<check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’コピー" name="checkbox copy selection"/>
- <check_box label="中央ã«ä½ç½®" name="checkbox copy centers"/>
+ <check_box initial_value="true" label="中央ã«ä½ç½®" name="checkbox copy centers"/>
<check_box label="回転" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="åœŸåœ°ã‚’é¸æŠž" name="radio select land"/>
@@ -65,7 +104,6 @@
<radio_item label="凸凹ã«ã™ã‚‹" name="radio noise"/>
<radio_item label="å…ƒã«æˆ»ã™" name="radio revert"/>
</radio_group>
- <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’修正"/>
<text name="Bulldozer:">
ブルドーザー:
</text>
@@ -75,14 +113,51 @@
<text name="Strength:">
強度
</text>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’修正"/>
<text name="obj_count">
- é¸æŠžæ¸ˆã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ:[COUNT]
+ オブジェクト: [COUNT]
</text>
<text name="prim_count">
- プリム:[COUNT]
+ プリム: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30">
<panel label="一般" name="General">
+ <panel.string name="text deed continued">
+ 譲渡
+ </panel.string>
+ <panel.string name="text deed">
+ 譲渡
+ </panel.string>
+ <panel.string name="text modify info 1">
+ ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </panel.string>
+ <panel.string name="text modify info 2">
+ ã“れらã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </panel.string>
+ <panel.string name="text modify info 3">
+ ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel.string name="text modify info 4">
+ ã“れらã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel.string name="text modify warning">
+ ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆå…¨ä½“ã‚’é¸æŠžã—ã¦æ¨©é™ã®è¨­å®šã‚’行ã£ã¦ãã ã•ã„。
+ </panel.string>
+ <panel.string name="Cost Default">
+ 価格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ åˆè¨ˆï¼š L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ å˜ä¾¡ï¼š L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ æ··åˆä¾¡æ ¼
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ æ··åˆè²©å£²
+ </panel.string>
<text name="Name:">
åå‰ï¼š
</text>
@@ -90,134 +165,83 @@
説明:
</text>
<text name="Creator:">
- クリエーター
+ 制作者:
</text>
<text name="Creator Name">
- Thrax Linden
+ Esbee Linden
</text>
- <button label="情報..." label_selected="情報..." name="button creator profile"/>
<text name="Owner:">
- オーナー:
+ 所有者:
</text>
<text name="Owner Name">
- Thrax Linden
+ Erica Linden
</text>
- <button label="情報..." label_selected="情報..." name="button owner profile"/>
<text name="Group:">
グループ:
</text>
- <text name="Group Name Proxy">
- Lindenå®¶
- </text>
- <button label="設定..." label_selected="設定..." name="button set group"/>
- <text name="Permissions:">
- 権é™
- </text>
-
- <check_box label="グループã§å…±åŒç®¡ç†" name="checkbox share with group" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¨©é™ã‚’共有ã—ã¾ã™ã€‚ 役割制é™ã‚’有効ã«ã™ã‚‹ã«ã¯ã€è­²æ¸¡ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/>
- <string name="text deed continued">
- 譲渡...
- </string>
- <string name="text deed">
- 譲渡
- </string>
- <button label="譲渡..." label_selected="譲渡..." name="button deed" tool_tip="グループ共有ã®ã‚ªãƒ–ジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・オフィサーã«ã‚ˆã‚Šè­²æ¸¡å¯èƒ½ã§ã™ã€‚"/>
- <check_box label="誰ã«å¯¾ã—ã¦ã‚‚移動を許å¯" name="checkbox allow everyone move"/>
- <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="checkbox allow everyone copy"/>
- <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/>
- <check_box label="売り出ã—中" name="checkbox for sale"/>
- <text name="Cost">
- 価格: L$
- </text>
- <combo_box name="sale type">
- <combo_box.item label="コピー" name="Copy"/>
- <combo_box.item label="コンテンツ" name="Contents"/>
- <combo_box.item label="オリジナル" name="Original"/>
- </combo_box>
-
+ <button label="設定..." label_selected="設定..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/>
+ <name_box initial_value="ローディング..." name="Group Name Proxy"/>
+ <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè­²æ¸¡ã§ãã¾ã™ã€‚"/>
+ <check_box label="共有" name="checkbox share with group" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 譲渡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/>
<text name="label click action">
- 左クリックã™ã‚‹ã¨ï¼š
+ クリックã§ï¼š
</text>
<combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="触るï¼ã¤ã‹ã‚€ (デフォルト)"/>
- <combo_box.item name="Sitonobject" label="オブジェクトã«åº§ã‚‹"/>
- <combo_box.item name="Buyobject" label="オブジェクトを購入"/>
- <combo_box.item name="Payobject" label="オブジェクトã¸ã®æ”¯æ‰•ã„"/>
- <combo_box.item name="Open" label="é–‹ã"/>
- <combo_box.item name="Play" label="区画メディアをå†ç”Ÿ"/>
- <combo_box.item name="Opemmedia" label="区画メディアを開ã"/>
+ <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
+ <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/>
+ <combo_box.item label="オブジェクトを購入" name="Buyobject"/>
+ <combo_box.item label="オブジェクトã¸ã®æ”¯æ‰•ã„" name="Payobject"/>
+ <combo_box.item label="é–‹ã" name="Open"/>
+ <combo_box.item label="ズーム" name="Zoom"/>
</combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ­£ã§ãã¾ã™ã€‚
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作:
- </text>
- <check_box label="修正" name="checkbox next owner can modify"/>
- <check_box label="コピー" name="checkbox next owner can copy"/>
- <check_box name="checkbox next owner can transfer"/>
- </panel>
- <string name="text modify info 1">
- ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ­£ã§ãã¾ã™ã€‚
- </string>
- <string name="text modify info 2">
- ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ­£ã§ãã¾ã™ã€‚
- </string>
- <string name="text modify info 3">
- ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
- </string>
- <string name="text modify info 4">
- ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
- </string>
- <string name="text modify warning">
- 権é™ã‚’設定ã™ã‚‹ã«ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆå…¨ä½“ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </string>
- <string name="Cost Default">
- 価格: L$
- </string>
- <string name="Cost Total">
- åˆè¨ˆä¾¡æ ¼ï¼š L$
- </string>
- <string name="Cost Per Unit">
- å˜ä¾¡ï¼š L$
- </string>
- <string name="Cost Mixed">
- æ··åˆä¾¡æ ¼
- </string>
- <string name="Sale Mixed">
- æ··åˆè²©å£²
- </string>
+ <check_box label="販売対象:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="コピー" name="Copy"/>
+ <combo_box.item label="中身" name="Contents"/>
+ <combo_box.item label="オリジナル" name="Original"/>
+ </combo_box>
+ <spinner label="価格: L$" name="Edit Cost"/>
+ <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã«ã“ã®ã‚ªãƒ–ジェクトを表示ã—ã¾ã™"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ ã‚ãªãŸã¯ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </text>
+ <text name="Anyone can:">
+ 全員:
+ </text>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <check_box label="コピー" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ æ¬¡ã®æ‰€æœ‰è€…:
+ </text>
+ <check_box label="修正" name="checkbox next owner can modify"/>
+ <check_box label="コピー" name="checkbox next owner can copy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="形状" name="Object">
- <text name="select_single">
- プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
- </text>
- <text name="edit_object">
- オブジェクトã®ãƒ‘ラメーターを編集:
- </text>
- <check_box label="ロック済ã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸­ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/>
- <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="作æˆ1分後ã«ã‚ªãƒ–ジェクトを削除"/>
- <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/>
+ <check_box label="ロック済ã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€åˆ¶ä½œä¸­ã®æ„図ã›ã¬ç·¨é›†ã‚’防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã—ã¾ã™"/>
+ <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後 1 分ã§ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™"/>
+ <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿ã—ã¾ã™"/>
<text name="label position">
ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰
</text>
@@ -236,33 +260,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- ç´ æ
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="石æ"/>
- <combo_box.item name="Metal" label="金属"/>
- <combo_box.item name="Glass" label="ガラス"/>
- <combo_box.item name="Wood" label="木æ"/>
- <combo_box.item name="Flesh" label="肌"/>
- <combo_box.item name="Plastic" label="プラスãƒãƒƒã‚¯"/>
- <combo_box.item name="Rubber" label="ゴム"/>
- </combo_box>
- <text name="label basetype">
- 建造物ブロック・タイプ
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="ボックス"/>
- <combo_box.item name="Cylinder" label="シリンダー"/>
- <combo_box.item name="Prism" label="プリズム"/>
- <combo_box.item name="Sphere" label="çƒå½¢"/>
- <combo_box.item name="Torus" label="トーラス"/>
- <combo_box.item name="Tube" label="ãƒãƒ¥ãƒ¼ãƒ–"/>
- <combo_box.item name="Ring" label="リング"/>
- <combo_box.item name="Sculpted" label="スカルプト"/>
+ <combo_box.item label="ボックス" name="Box"/>
+ <combo_box.item label="シリンダー" name="Cylinder"/>
+ <combo_box.item label="プリズム" name="Prism"/>
+ <combo_box.item label="çƒå½¢" name="Sphere"/>
+ <combo_box.item label="トーラス" name="Torus"/>
+ <combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/>
+ <combo_box.item label="リング" name="Ring"/>
+ <combo_box.item label="スカルプト" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="石æ" name="Stone"/>
+ <combo_box.item label="金属" name="Metal"/>
+ <combo_box.item label="ガラス" name="Glass"/>
+ <combo_box.item label="木æ" name="Wood"/>
+ <combo_box.item label="肌" name="Flesh"/>
+ <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/>
+ <combo_box.item label="ゴム" name="Rubber"/>
</combo_box>
<text name="text cut">
- パス・カットã®å§‹ç‚¹ã¨çµ‚点
+ パスカット(始点ã¨çµ‚点)
</text>
<spinner label="B" name="cut begin"/>
<spinner label="E" name="cut end"/>
@@ -276,13 +294,13 @@
中空(空洞)ã®å½¢
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="デフォルト"/>
- <combo_box.item name="Circle" label="サークル"/>
- <combo_box.item name="Square" label="正方形"/>
- <combo_box.item name="Triangle" label="三角形"/>
+ <combo_box.item label="デフォルト" name="Default"/>
+ <combo_box.item label="サークル" name="Circle"/>
+ <combo_box.item label="正方形" name="Square"/>
+ <combo_box.item label="三角形" name="Triangle"/>
</combo_box>
<text name="text twist">
- ã²ã­ã‚Šã®å§‹ã¾ã‚Šã¨çµ‚ã‚り
+ ã²ã­ã‚Šï¼ˆå§‹ç‚¹ã¨çµ‚点)
</text>
<spinner label="B" name="Twist Begin"/>
<spinner label="E" name="Twist End"/>
@@ -300,13 +318,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- プロフィール・カットã®å§‹ç‚¹ã¨çµ‚点
+ プロフィールカット(始点ã¨çµ‚点)
</text>
<text name="advanced_dimple">
- ãã¼ã¿ã®å§‹ç‚¹ã¨çµ‚点
+ ãã¼ã¿ï¼ˆå§‹ç‚¹ã¨çµ‚点)
</text>
<text name="advanced_slice">
- 切りå–りã®å§‹ç‚¹ã¨çµ‚点
+ 切りå–り(始点ã¨çµ‚点)
</text>
<spinner label="B" name="Path Limit Begin"/>
<spinner label="E" name="Path Limit End"/>
@@ -321,48 +339,55 @@
<text name="text revolutions">
回転体
</text>
- <texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトã•れãŸãƒ—リムをX軸上ã§å転"/>
- <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトã•れãŸãƒ—リムã®ãƒŽãƒ¼ãƒžãƒ«ã‚’逆転ã•ã›ã€è£è¿”ã—ã«è¡¨ç¤º"/>
+ <texture_picker label="スカルプトテクスãƒãƒ£" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
+ <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã¾ã™"/>
+ <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/>
<text name="label sculpt type">
縫ã„ç›®ã®ã‚¿ã‚¤ãƒ—
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(ãªã—)"/>
- <combo_box.item name="Sphere" label="çƒå½¢"/>
- <combo_box.item name="Torus" label="トーラス"/>
- <combo_box.item name="Plane" label="å¹³é¢"/>
- <combo_box.item name="Cylinder" label="シリンダー"/>
+ <combo_box.item label="(ãªã—)" name="None"/>
+ <combo_box.item label="çƒå½¢" name="Sphere"/>
+ <combo_box.item label="トーラス" name="Torus"/>
+ <combo_box.item label="å¹³é¢" name="Plane"/>
+ <combo_box.item label="シリンダー" name="Cylinder"/>
</combo_box>
</panel>
<panel label="特徴" name="Features">
<text name="select_single">
- プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
+ プリムを 1 ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
</text>
<text name="edit_object">
オブジェクトã®ç‰¹å¾´ã‚’編集:
</text>
- <check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心ã¨ã™ã‚‹ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æŠ˜ã‚Œæ›²ãŒã‚Šã‚’有効ã«ã™ã‚‹ (クライアントå´ã®ã¿ï¼‰"/>
- <spinner label="柔軟性" name="FlexNumSections" width="135" label_width="72"/>
- <spinner label="é‡åŠ›" name="FlexGravity" width="135" label_width="72"/>
- <spinner label="ドラッグ" name="FlexFriction" width="135" label_width="72"/>
- <spinner label="風" name="FlexWind" width="135" label_width="72"/>
- <spinner label="ç·Šå¼µ" name="FlexTension" width="135" label_width="72"/>
- <spinner label="X軸方å‘ã®åŠ›" name="FlexForceX" width="135" label_width="72"/>
- <spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY" width="135" label_width="72"/>
- <spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ" width="135" label_width="72"/>
- <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/>
- <text name="label color">
- 色
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã" left_delta="74"/>
- <spinner label="è¼åº¦" name="Light Intensity" width="135" label_width="72"/>
- <spinner label="åŠå¾„" name="Light Radius" width="135" label_width="72"/>
- <spinner label="å¼±ã¾ã‚‹" name="Light Falloff" width="135" label_width="72"/>
+ <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
+ <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
+ <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/>
+ <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
+ <spinner label="風" label_width="72" name="FlexWind" width="135"/>
+ <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
+ <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
+ <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
+ <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
+ <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>
+ <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
+ <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/>
+ <spinner label="FOV" name="Light FOV"/>
+ <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/>
+ <spinner label="焦点" name="Light Focus"/>
+ <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/>
+ <spinner label="環境" name="Light Ambiance"/>
</panel>
<panel label="æè³ª" name="Texture">
+ <panel.string name="string repeats per meter">
+ メートルã”ã¨ã«ç¹°ã‚Šè¿”ã™
+ </panel.string>
+ <panel.string name="string repeats per face">
+ é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™
+ </panel.string>
<texture_picker label="テクスãƒãƒ£ãƒ¼" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
+ <color_swatch label="色" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<text name="color trans">
é€éŽåº¦ %
</text>
@@ -374,75 +399,69 @@
マッピング
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="デフォルト"/>
- <combo_box.item name="Planar" label="å¹³é¢"/>
+ <combo_box.item label="デフォルト" name="Default"/>
+ <combo_box.item label="å¹³é¢" name="Planar"/>
</combo_box>
<text name="label shininess">
è¼ã
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="ãªã—"/>
- <combo_box.item name="Low" label="低"/>
- <combo_box.item name="Medium" label="中"/>
- <combo_box.item name="High" label="高"/>
+ <combo_box.item label="ãªã—" name="None"/>
+ <combo_box.item label="低" name="Low"/>
+ <combo_box.item label="中" name="Medium"/>
+ <combo_box.item label="高" name="High"/>
</combo_box>
<text name="label bumpiness">
凹凸
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="ãªã—"/>
- <combo_box.item name="Brightness" label="明るã•"/>
- <combo_box.item name="Darkness" label="æš—ã•"/>
- <combo_box.item name="woodgrain" label="木目調"/>
- <combo_box.item name="bark" label="木ã®çš®"/>
- <combo_box.item name="bricks" label="レンガ"/>
- <combo_box.item name="checker" label="ãƒã‚§ãƒƒã‚«ãƒ¼"/>
- <combo_box.item name="concrete" label="コンクリート"/>
- <combo_box.item name="crustytile" label="クラスティ・タイル"/>
- <combo_box.item name="cutstone" label="カットストーン"/>
- <combo_box.item name="discs" label="ディスク"/>
- <combo_box.item name="gravel" label="砂利"/>
- <combo_box.item name="petridish" label="ペトリ"/>
- <combo_box.item name="siding" label="羽目æ¿"/>
- <combo_box.item name="stonetile" label="ストーン・タイル"/>
- <combo_box.item name="stucco" label="ã—ã£ãã„"/>
- <combo_box.item name="suction" label="å¸ã„è¾¼ã¿"/>
- <combo_box.item name="weave" label="織目"/>
+ <combo_box.item label="ãªã—" name="None"/>
+ <combo_box.item label="明るã•" name="Brightness"/>
+ <combo_box.item label="æš—ã•" name="Darkness"/>
+ <combo_box.item label="木目調" name="woodgrain"/>
+ <combo_box.item label="木ã®çš®" name="bark"/>
+ <combo_box.item label="レンガ" name="bricks"/>
+ <combo_box.item label="ãƒã‚§ãƒƒã‚«ãƒ¼" name="checker"/>
+ <combo_box.item label="コンクリート" name="concrete"/>
+ <combo_box.item label="クラスティ・タイル" name="crustytile"/>
+ <combo_box.item label="カットストーン" name="cutstone"/>
+ <combo_box.item label="ディスク" name="discs"/>
+ <combo_box.item label="砂利" name="gravel"/>
+ <combo_box.item label="ペトリ" name="petridish"/>
+ <combo_box.item label="羽目æ¿" name="siding"/>
+ <combo_box.item label="ストーン・タイル" name="stonetile"/>
+ <combo_box.item label="ã—ã£ãã„" name="stucco"/>
+ <combo_box.item label="å¸ã„è¾¼ã¿" name="suction"/>
+ <combo_box.item label="織目" name="weave"/>
</combo_box>
<text name="tex scale">
- é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™
+ å復 / é¢
</text>
<spinner label="水平(U)" name="TexScaleU"/>
<check_box label="å転" name="checkbox flip s"/>
<spinner label="垂直(V)" name="TexScaleV"/>
<check_box label="å転" name="checkbox flip t"/>
- <text name="tex rotate">
- 回転(度)
- </text>
- <string name="string repeats per meter">
- メートルã”ã¨ã«ç¹°è¿”ã™
- </string>
- <string name="string repeats per face">
- é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™
- </string>
- <text name="rpt">
- メートルã”ã¨ã«ç¹°è¿”ã™
- </text>
+ <spinner label="回転˚" name="TexRot"/>
+ <spinner label="å復 / メーター" name="rptctrl"/>
<button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/>
<text name="tex offset">
- ãšã‚Œ
+ テクスãƒãƒ£ã®ã‚ºãƒ¬
</text>
<spinner label="水平(U)" name="TexOffsetU"/>
<spinner label="垂直(V)" name="TexOffsetV"/>
- <text name="textbox autofix" width="190">
- メディア・テクスãƒãƒ£ãƒ¼ã‚’æƒãˆã‚‹
-(最åˆã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ï¼‰
- </text>
- <button bottom="-365" label="æƒãˆã‚‹" label_selected="æƒãˆã‚‹" left="155" name="button align"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ メディア
+ </text>
+ <button name="add_media" tool_tip="メディアを追加ã—ã¾ã™"/>
+ <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/>
+ <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¾ã™"/>
+ <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™ï¼ˆæœ€åˆã«èª­ã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/>
+ </panel>
</panel>
<panel label="中身" name="Contents">
- <button label="æ–°ã—ã„スクリプト" label_selected="æ–°ã—ã„スクリプト" name="button new script" width="120"/>
- <button label="権é™" name="button permissions" left_delta="130" width="80"/>
+ <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script" width="120"/>
+ <button label="権é™" left_delta="130" name="button permissions" width="80"/>
</panel>
</tab_container>
<panel name="land info panel">
@@ -450,62 +469,22 @@
区画情報
</text>
<text name="label_area_price" width="200">
- 価格:[AREA]平方メートルã‚ãŸã‚ŠL$[PRICE]
+ 価格: [AREA] 平方メートル L$ [PRICE]
</text>
<text name="label_area" width="200">
- é¢ç©ï¼š[AREA]平方メートル
+ é¢ç©ï¼š [AREA] 平方メートル
</text>
- <button label="土地情報..." label_selected="土地情報..." name="button about land"/>
- <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別ã«åŒºç”»ã‚’色分ã‘ã—ã¾ã™ï¼š &#10;&#10;ç·‘ = ã‚ãªãŸã®åœŸåœ° &#10;アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 &#10;赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° &#10;黄色 = 売り出ã—中 &#10;ç´« = オークション &#10;グレー = パブリック"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="114"/>
+ <button label="土地情報" label_selected="土地情報" name="button about land"/>
+ <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—中 ç´« = オークション グレー = パブリック"/>
<text name="label_parcel_modify">
区画ã®ç·¨é›†
</text>
<button label="å†åˆ†å‰²" label_selected="å†åˆ†å‰²" name="button subdivide land"/>
- <button label="çµ±åˆã™ã‚‹" label_selected="çµ±åˆã™ã‚‹" name="button join land"/>
+ <button label="çµ±åˆ" label_selected="çµ±åˆ" name="button join land"/>
<text name="label_parcel_trans">
土地å–引
</text>
- <button label="土地を購入" label_selected="土地を購入" name="button buy land"/>
- <button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/>
+ <button label="土地ã®è³¼å…¥" label_selected="土地ã®è³¼å…¥" name="button buy land"/>
+ <button label="åœŸåœ°ã®æ”¾æ£„" label_selected="åœŸåœ°ã®æ”¾æ£„" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転
- </floater.string>
- <floater.string name="status_scale">
- é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™
- </floater.string>
- <floater.string name="status_move">
- 移動:ドラッグã€ã‚³ãƒ”ー:Shiftを押ã—ãªãŒã‚‰ï¾„゙ラッグ
- </floater.string>
- <floater.string name="status_modifyland">
- 土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ­£å¤‰æ›´
- </floater.string>
- <floater.string name="status_camera">
- クリックã—ドラッグã—ã¦è¦–界を調整
- </floater.string>
- <floater.string name="status_grab">
- ç§»å‹•ï¼šï¾„ï¾žï¾—ï½¯ï½¸ï¾žã€æŒã¡ä¸Šã’:Ctrlã€å›žè»¢ï¼šCtrl+Shift
- </floater.string>
- <floater.string name="status_place">
- インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ
- </floater.string>
- <floater.string name="status_selectland">
- 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž
- </floater.string>
- <floater.string name="grid_screen_text">
- ç”»é¢
- </floater.string>
- <floater.string name="grid_local_text">
- ローカル
- </floater.string>
- <floater.string name="grid_world_text">
- 世界
- </floater.string>
- <floater.string name="grid_reference_text">
- å‚ç…§
- </floater.string>
- <floater.string name="grid_attachment_text">
- アタッãƒãƒ¡ãƒ³ãƒˆ
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
index e59f72bf30..bfc93e5624 100644
--- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
@@ -1,55 +1,56 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="ロード中...">
+<floater name="top_objects" title="トップオブジェクト">
+ <floater.string name="top_scripts_title">
+ トップ・スクリプト
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT]スクリプト全体ã®å®Ÿè¡Œæ™‚é–“ã¯[TIME]ミリ秒。
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ 時間
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Monoタイム
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ 上部コライダー
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ 上ä½[COUNT]個ã®ç‰©ä½“ã¯å¤šãã®è¡çªå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ æ•°
+ </floater.string>
+ <floater.string name="none_descriptor">
+ 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </floater.string>
<text name="title_text">
ロード中...
</text>
<scroll_list name="objects_list">
- <column label="æ•°" name="score"/>
- <column label="åå‰" name="name"/>
- <column label="所有者" name="owner"/>
- <column label="ロケーション" name="location"/>
- <column label="時間" name="time"/>
- <column label="Monoタイム" name="mono_time"/>
+ <scroll_list.columns label="æ•°" name="score"/>
+ <scroll_list.columns label="åå‰" name="name"/>
+ <scroll_list.columns label="所有者" name="owner"/>
+ <scroll_list.columns label="ロケーション" name="location"/>
+ <scroll_list.columns label="時間" name="time"/>
+ <scroll_list.columns label="Monoタイム" name="mono_time"/>
+ <scroll_list.columns label="URL" name="URLs"/>
</scroll_list>
<text name="id_text">
物体ID:
</text>
<button label="標識を表示" name="show_beacon_btn"/>
<text name="obj_name_text">
- 物体å:
+ オブジェクトå:
</text>
<button label="フィルタ" name="filter_object_btn"/>
<text name="owner_name_text">
- 所有者å:
+ 所有者:
</text>
<button label="フィルタ" name="filter_owner_btn"/>
+ <button label="æ›´æ–°" name="refresh_btn"/>
<button label="é¸æŠžå†…å®¹ã‚’è¿”å´" name="return_selected_btn"/>
<button label="ã™ã¹ã¦è¿”å´" name="return_all_btn"/>
<button label="é¸æŠžå†…å®¹ã‚’ç„¡åŠ¹åŒ–" name="disable_selected_btn"/>
<button label="ã™ã¹ã¦ç„¡åŠ¹åŒ–" name="disable_all_btn"/>
- <button label="æ›´æ–°" name="refresh_btn"/>
- <string name="top_scripts_title">
- トップ・スクリプト
- </string>
- <string name="top_scripts_text">
- [COUNT]スクリプト全体ã®å®Ÿè¡Œæ™‚é–“ã¯[TIME]ミリ秒。
- </string>
- <string name="scripts_score_label">
- 時間
- </string>
- <string name="scripts_mono_time_label">
- Monoタイム
- </string>
- <string name="top_colliders_title">
- 上部コライダー
- </string>
- <string name="top_colliders_text">
- 上ä½[COUNT]個ã®ç‰©ä½“ã¯å¤šãã®è¡çªå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
- </string>
- <string name="colliders_score_label">
- æ•°
- </string>
- <string name="none_descriptor">
- 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_tos.xml b/indra/newview/skins/default/xui/ja/floater_tos.xml
index c0d1af1d6a..85ac102885 100644
--- a/indra/newview/skins/default/xui/ja/floater_tos.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tos.xml
@@ -1,18 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="続行" label_selected="続行" name="Continue" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
+ <button label="続行" label_selected="続行" name="Continue"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
<radio_group name="tos_agreement">
- <radio_item name="radio_disagree" label="利用è¦ç´„ã«åŒæ„ã—ã¾ã›ã‚“" />
- <radio_item name="radio_agree" label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" />
+ <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã›ã‚“" name="radio_disagree"/>
+ <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="radio_agree"/>
</radio_group>
<text name="tos_title">
利用è¦ç´„
</text>
- <check_box label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="agree_chk" />
+ <check_box label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="agree_chk"/>
<text name="tos_heading">
- 以下ã®åˆ©ç”¨è¦ç´„ã‚’æ³¨æ„æ·±ããŠèª­ã¿ãã ã•ã„。 SecondLifeã¸ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯ã€
-è¦ç´„ã«åŒæ„ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
+ 次ã®åˆ©ç”¨è¦ç´„をよããŠèª­ã¿ãã ã•ã„。 [SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
index 9d3ca20c7c..8e09e4748a 100644
--- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
メディア URL:
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" width="78"/>
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="38"/>
<button label="キャンセル" name="cancel_btn" width="80"/>
- <button label="クリア" name="clear_btn" />
- <text name="loading_label">
+ <button label="クリア" name="clear_btn" left_pad="76"/>
+ <text name="loading_label" left="140">
ロード中...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
new file mode 100644
index 0000000000..5a0694e5c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="ボイスコントロール">
+ <string name="title_nearby">
+ è¿‘ãã®ãƒœã‚¤ã‚¹
+ </string>
+ <string name="title_group">
+ [GROUP] ã¨ã‚°ãƒ«ãƒ¼ãƒ—コール
+ </string>
+ <string name="title_adhoc">
+ コンファレンスコール
+ </string>
+ <string name="title_peer_2_peer">
+ [NAME] ã§ã‚³ãƒ¼ãƒ«
+ </string>
+ <string name="no_one_near">
+ è¿‘ãã«ãƒœã‚¤ã‚¹ã‚’有効ã«ã—ã¦ã„る人ã¯ã„ã¾ã›ã‚“。
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="コール終了" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_water.xml b/indra/newview/skins/default/xui/ja/floater_water.xml
index 054b003197..52cd91a08a 100644
--- a/indra/newview/skins/default/xui/ja/floater_water.xml
+++ b/indra/newview/skins/default/xui/ja/floater_water.xml
@@ -1,66 +1,52 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="æ°´ã®é«˜åº¦ãªç·¨é›†">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
<text name="KeyFramePresetsText">
æ°´ã®äº‹å‰è¨­å®šï¼š
</text>
- <button label="æ–°è¦" label_selected="æ–°è¦" name="WaterNewPreset" />
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WaterSavePreset" />
- <button label="削除" label_selected="削除" name="WaterDeletePreset" />
+ <button label="æ–°è¦" label_selected="æ–°è¦" name="WaterNewPreset"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WaterSavePreset"/>
+ <button label="削除" label_selected="削除" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
<panel label="設定" name="Settings">
<text name="BHText">
水中ã®ãƒ•ォグ効果ã®è‰²
</text>
- <button label="?" name="WaterFogColorHelp" />
- <color_swatch name="WaterFogColor"
- tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã" />
+ <color_swatch name="WaterFogColor" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<text name="WaterFogDensText">
水中ã®é€æ˜Žåº¦æŒ‡æ•°
</text>
- <button label="?" name="WaterFogDensityHelp" />
<text name="WaterUnderWaterFogModText">
水中ã®ãƒ•ォグ効果加減
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" />
<text name="BDensText">
ã•ã–æ³¢ã®å射スケール
</text>
- <button label="?" name="WaterNormalScaleHelp" />
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
<text name="HDText">
フレãƒãƒ«ãƒ»ã‚¹ã‚±ãƒ¼ãƒ«
</text>
- <button label="?" name="WaterFresnelScaleHelp" />
<text name="FresnelOffsetText">
フレãƒãƒ«ãƒ»ã‚ªãƒ•セット
</text>
- <button label="?" name="WaterFresnelOffsetHelp" />
<text name="DensMultText">
æ°´é¢ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
</text>
- <button label="?" name="WaterScaleAboveHelp" />
<text name="WaterScaleBelowText">
水中ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
</text>
- <button label="?" name="WaterScaleBelowHelp" />
<text name="MaxAltText">
ä¸é€æ˜Žåº¦ã®å¢—å¹…
</text>
- <button label="?" name="WaterBlurMultiplierHelp" />
</panel>
<panel label="ç”»åƒ" name="Waves">
<text name="BHText">
å¤§æ³¢ã®æ–¹å‘
</text>
- <button label="?" name="WaterWave1Help" />
<text name="WaterWave1DirXText">
X
</text>
@@ -70,7 +56,6 @@
<text name="BHText2">
å°æ³¢ã®æ–¹å‘
</text>
- <button label="?" name="WaterWave2Help" />
<text name="WaterWave2DirXText">
X
</text>
@@ -80,10 +65,6 @@
<text name="BHText3">
ノーマル・マップ
</text>
- <button label="?" name="WaterNormalMapHelp" />
</panel>
</tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
index fc9ddf5096..de8b590a80 100644
--- a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
<text name="Save item as:">
- アイテムを別åã§ä¿å­˜ï¼š
+ アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
</text>
<line_editor name="name ed">
New [DESC]
diff --git a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..34aba9d485
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="ホワイトリストã®å…¥åŠ›">
+ <text name="media_label">
+ URL ã‹ URL パターンを入力ã—ã¦ã€è¨±å¯ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’リストã«è¿½åŠ ã—ã¾ã™ã€‚
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="URL ã‹ URL パターンをホワイトリストã«å…¥åŠ›ã—ã¾ã™"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_windlight_options.xml b/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
index fa70de054f..feb94ef73e 100644
--- a/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
@@ -1,19 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="空ã®é«˜åº¦ãªç·¨é›†">
<text name="KeyFramePresetsText">
空ã®äº‹å‰è¨­å®šï¼š
</text>
- <button label="æ–°è¦" label_selected="æ–°è¦" name="WLNewPreset" />
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WLSavePreset" />
- <button label="削除" label_selected="削除" name="WLDeletePreset" />
- <button label="デイサイクル編集"
- label_selected="デイサイクル編集" name="WLDayCycleMenuButton" />
+ <button label="æ–°è¦" label_selected="æ–°è¦" name="WLNewPreset"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WLSavePreset"/>
+ <button label="削除" label_selected="削除" name="WLDeletePreset"/>
+ <button label="デイサイクル編集" label_selected="デイサイクル編集" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
<panel label="大気" name="Atmosphere">
<text name="BHText">
空ã®é…色
</text>
- <button label="?" name="WLBlueHorizonHelp" />
+ <button label="?" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -29,11 +28,11 @@
<text name="BDensText">
空ã¨é æ™¯ã®éœ²å…‰
</text>
- <button label="?" name="WLHazeHorizonHelp" />
+ <button label="?" name="WLHazeHorizonHelp"/>
<text name="BDensText2">
空ã®é…è‰²ã¨æ¿ƒåº¦
</text>
- <button label="?" name="WLBlueDensityHelp" />
+ <button label="?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -49,25 +48,25 @@
<text name="HDText">
大気ã®ä¸é€æ˜Žåº¦
</text>
- <button label="?" name="WLHazeDensityHelp" />
+ <button label="?" name="WLHazeDensityHelp"/>
<text name="DensMultText">
大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…
</text>
- <button label="?" name="WLDensityMultHelp" />
+ <button label="?" name="WLDensityMultHelp"/>
<text name="WLDistanceMultText">
視界ã®å¢—å¹…
</text>
- <button label="?" name="WLDistanceMultHelp" />
+ <button label="?" name="WLDistanceMultHelp"/>
<text name="MaxAltText">
最大高度
</text>
- <button label="?" name="WLMaxAltitudeHelp" />
+ <button label="?" name="WLMaxAltitudeHelp"/>
</panel>
<panel label="ライティング" name="Lighting">
<text name="SLCText">
太陽/月ã®è‰²
</text>
- <button label="?" name="WLSunlightColorHelp" />
+ <button label="?" name="WLSunlightColorHelp"/>
<text name="BHText">
R
</text>
@@ -83,11 +82,11 @@
<text name="TODText">
太陽/月ã®ä½ç½®
</text>
- <button label="?" name="WLTimeOfDayHelp" />
+ <button label="?" name="WLTimeOfDayHelp"/>
<text name="WLAmbientText">
アンビエント
</text>
- <button label="?" name="WLAmbientHelp" />
+ <button label="?" name="WLAmbientHelp"/>
<text name="BHText5">
R
</text>
@@ -103,27 +102,27 @@
<text name="WLEastAngleText">
æ±ã®è§’度
</text>
- <button label="?" name="WLEastAngleHelp" />
+ <button label="?" name="WLEastAngleHelp"/>
<text name="SunGlowText">
太陽ã®è¼ã
</text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="フォーカス " name="WLGlowB" />
- <slider label="サイズ " name="WLGlowR" />
+ <button label="?" name="WLSunGlowHelp"/>
+ <slider label="フォーカス " name="WLGlowB"/>
+ <slider label="サイズ " name="WLGlowR"/>
<text name="SceneGammaText">
風景ガンマ
</text>
- <button label="?" name="WLSceneGammaHelp" />
+ <button label="?" name="WLSceneGammaHelp"/>
<text name="WLStarText">
星ã®è¼ã
</text>
- <button label="?" name="WLStarBrightnessHelp" />
+ <button label="?" name="WLStarBrightnessHelp"/>
</panel>
<panel label="雲" name="Clouds">
<text name="WLCloudColorText">
雲ã®è‰²
</text>
- <button label="?" name="WLCloudColorHelp" />
+ <button label="?" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -139,7 +138,7 @@
<text name="WLCloudColorText2">
雲㮠XY/密度
</text>
- <button label="?" name="WLCloudDensityHelp" />
+ <button label="?" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -152,15 +151,15 @@
<text name="WLCloudCoverageText">
雲ã®é‡
</text>
- <button label="?" name="WLCloudCoverageHelp" />
+ <button label="?" name="WLCloudCoverageHelp"/>
<text name="WLCloudScaleText">
雲ã®ã‚¹ã‚±ãƒ¼ãƒ«
</text>
- <button label="?" name="WLCloudScaleHelp" />
+ <button label="?" name="WLCloudScaleHelp"/>
<text name="WLCloudDetailText">
雲ã®è©³ç´° (XY/密度)
</text>
- <button label="?" name="WLCloudDetailHelp" />
+ <button label="?" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -173,15 +172,15 @@
<text name="WLCloudScrollXText">
雲ã®ç§»å‹•速度 (X æ–¹å‘)
</text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="ロック" name="WLCloudLockX" />
+ <button label="?" name="WLCloudScrollXHelp"/>
+ <check_box label="ロック" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
雲ã®ç§»å‹•速度 (Y æ–¹å‘)
</text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="ロック" name="WLCloudLockY" />
- <check_box label="従æ¥ã®é›²ã‚’æç”»" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
+ <button label="?" name="WLCloudScrollYHelp"/>
+ <check_box label="ロック" name="WLCloudLockY"/>
+ <check_box label="従æ¥ã®é›²ã‚’æç”»" name="DrawClassicClouds"/>
+ <button label="?" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml
new file mode 100644
index 0000000000..152a5f4806
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="ウィンドウサイズ">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="横幅 x 高ã•">
+ <combo_box.item label="1000 x 700 (標準)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="設定" name="set_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml
index 6a34e49d84..c44c6b3fd3 100644
--- a/indra/newview/skins/default/xui/ja/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml
@@ -1,58 +1,82 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="worldmap" title="世界地図">
- <tab_container name="maptab">
- <panel label="オブジェクト" name="objects_mapview"/>
- <panel label="地形" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- ã‚ãªãŸ
- </text>
- <text name="home_label">
- ホーム
- </text>
- <text name="auction_label">
- オークション
- </text>
- <icon left="1123" name="square"/>
- <text left_delta="20" name="land_for_sale_label">
- 売出ã—中ã®åœŸåœ°
- </text>
- <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="自分ã®ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <check_box label="ä½äºº" name="people_chk"/>
- <check_box label="インフォãƒãƒ–" name="infohub_chk"/>
- <check_box label="テレãƒãƒ–" name="telehubchk"/>
- <check_box label="売り地" name="land_for_sale_chk"/>
- <text name="events_label">
- イベント:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <combo_box label="オンラインã®ãƒ•レンド" name="friend combo" tool_tip="地図ã«è¡¨ç¤ºã•れãŸãƒ•レンド">
- <combo_box.item name="item1" label="オンラインã®ãƒ•レンド" />
- </combo_box>
- <combo_box label="ランドマーク" name="landmark combo" tool_tip="地図ã«è¡¨ç¤ºã•れãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
- <combo_box.item name="item1" label="ランドマーク" />
- </combo_box>
- <line_editor label="地域åã§æ¤œç´¢" name="location" tool_tip="地域åを入力ã—ã¦ãã ã•ã„。"/>
- <button label="検索" name="DoSearch" tool_tip="地域検索"/>
- <text name="search_label">
- æ¤œç´¢çµæžœï¼š
- </text>
- <scroll_list name="search_results">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- ä½ç½®ï¼š
- </text>
- <spinner name="spin x" tool_tip="地図上ã«è¡¨ç¤ºã•れるä½ç½®ã®X座標"/>
- <spinner name="spin y" tool_tip="地図上ã«è¡¨ç¤ºã•れるä½ç½®ã®Y座標"/>
- <spinner name="spin z" tool_tip="地図上ã«è¡¨ç¤ºã•れるä½ç½®ã®Z座標"/>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã•れãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="目的地を表示" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’地図ã®ä¸­å¿ƒã«ã™ã‚‹"/>
- <button label="クリア" label_selected="クリア" name="Clear" tool_tip="ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚’åœæ­¢"/>
- <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’地図ã®ä¸­å¿ƒã«ã™ã‚‹"/>
- <button label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’SLurlã¨ã—ã¦ã‚³ãƒ”ーã—ã€ã‚¦ã‚§ãƒ–ã§ä½¿ç”¨"/>
- <slider label="ズーム" name="zoom slider"/>
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ 表記・記å·
+ </text>
+ </panel>
+ <panel>
+ <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
+ <text name="me_label">
+ 自分
+ </text>
+ <check_box label="ä½äºº" name="people_chk"/>
+ <text name="person_label">
+ ä½äºº
+ </text>
+ <check_box label="インフォãƒãƒ–" name="infohub_chk"/>
+ <text name="infohub_label">
+ インフォãƒãƒ–
+ </text>
+ <check_box label="売り地" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ 土地販売
+ </text>
+ <text name="by_owner_label">
+ 所有者ã®è²©å£²
+ </text>
+ <text name="auction_label">
+ 土地オークション
+ </text>
+ <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <text name="Home_label">
+ ホーム
+ </text>
+ <text name="events_label">
+ イベント:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <text name="pg_label">
+ 一般
+ </text>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ 控ãˆã‚
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ <text name="adult_label">
+ アダルト
+ </text>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ åœ°å›³ä¸Šã§æŽ¢ã™
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="オンラインã®ãƒ•レンド" name="friend combo" tool_tip="フレンドを地図上ã«è¡¨ç¤ºã—ã¾ã™">
+ <combo_box.item label="オンラインã®ãƒ•レンド" name="item1"/>
+ </combo_box>
+ <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図上ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
+ <combo_box.item label="マイ ランドマーク" name="item1"/>
+ </combo_box>
+ <search_editor label="リージョンå" name="location" tool_tip="地域åを入力ã—ã¦ãã ã•ã„。"/>
+ <button label="検索" name="DoSearch" tool_tip="地域検索"/>
+ <button name="Clear" tool_tip="追跡ラインをクリアã—ã¦åœ°å›³ã‚’リセットã—ã¾ã™"/>
+ <scroll_list name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ </scroll_list>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’ SLurl ã§ã‚³ãƒ”ーã—㦠Web ã§ä½¿ç”¨ã—ã¾ã™ã€‚"/>
+ <button label="é¸æŠžã‚’ã‚’è¡¨ç¤ºã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ ズーム
+ </text>
+ </panel>
+ <panel>
+ <slider label="ズーム" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
new file mode 100644
index 0000000000..aeac0a8328
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_name" value="Grumpity ProductEngine"/>
+ <text name="user_subtitle" value="11 Months, 3 days old"/>
+ <text name="user_details">
+ This is my second life description and I really think it is great.
+ </text>
+ <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/>
+ <button label="フレンド登録" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="プロフィール" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="ボイスを無効ã«ã™ã‚‹" name="disable_voice"/>
+ <button label="ボイスを有効ã«ã™ã‚‹" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_group.xml b/indra/newview/skins/default/xui/ja/inspect_group.xml
new file mode 100644
index 0000000000..b461b93f65
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/inspect_group.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ プライベートグループ
+ </string>
+ <string name="FreeToJoin">
+ å‚加費無料
+ </string>
+ <string name="CostToJoin">
+ å‚加費 L$[AMOUNT]
+ </string>
+ <string name="YouAreMember">
+ ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã§ã™
+ </string>
+ <text name="group_name">
+ Grumpity&apos;s Grumpy Group of Moose
+ </text>
+ <text name="group_subtitle">
+ 123 メートル
+ </text>
+ <text name="group_details">
+ A group of folks charged with creating a room with a moose.
+Fear the moose! Fear it! And the mongoose too!
+ </text>
+ <text name="group_cost">
+ L$123 to join
+ </text>
+ <button label="å‚加" name="join_btn"/>
+ <button label="脱退" name="leave_btn"/>
+ <button label="プロフィールã®è¡¨ç¤º" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_object.xml b/indra/newview/skins/default/xui/ja/inspect_object.xml
new file mode 100644
index 0000000000..842030c39a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/inspect_object.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ 制作者: [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ 制作者: [CREATOR]
+所有者: [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ ç„¡æ–™ã§ã™ï¼
+ </string>
+ <string name="Touch">
+ 触る
+ </string>
+ <string name="Sit">
+ 座る
+ </string>
+ <text name="object_name" value="Test Object Name That Is Really Long"/>
+ <text name="object_creator">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$300,000
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="è²·ã†" name="buy_btn"/>
+ <button label="支払ã†" name="pay_btn"/>
+ <button label="コピーをå–ã‚‹" name="take_free_copy_btn"/>
+ <button label="触る" name="touch_btn"/>
+ <button label="座る" name="sit_btn"/>
+ <button label="é–‹ã" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="安全ãªé–²è¦§"/>
+ <button label="詳細" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_remote_object.xml b/indra/newview/skins/default/xui/ja/inspect_remote_object.xml
new file mode 100644
index 0000000000..483d3fec52
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/inspect_remote_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Test Object Name That Is Really Long
+ </text>
+ <text name="object_owner_label">
+ 所有者:
+ </text>
+ <text name="object_owner">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text name="object_slurl_label">
+ ä½ç½®ï¼š
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="地図" name="map_btn"/>
+ <button label="ブロック" name="block_btn"/>
+ <button label="é–‰ã˜ã‚‹" name="close_btn"/>
+</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
new file mode 100644
index 0000000000..f163c2cf4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Profile..."/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="Invite..."/>
+ <menu_item_call label="ブロック" name="Avatar Mute"/>
+ <menu_item_call label="報告" name="abuse"/>
+ <menu_item_call label="フリーズ" name="Freeze..."/>
+ <menu_item_call label="追放" name="Eject..."/>
+ <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/>
+ <menu_item_call label="ズームイン" name="Zoom In"/>
+ <menu_item_call label="支払ã†" name="Pay..."/>
+ <menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
new file mode 100644
index 0000000000..209edd80ba
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="触る" name="Attachment Object Touch"/>
+ <menu_item_call label="編集" name="Edit..."/>
+ <menu_item_call label="å–り外ã™" name="Detach"/>
+ <menu_item_call label="下ã«è½ã¨ã™" name="Drop"/>
+ <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
+ <menu_item_call label="容姿" name="Appearance..."/>
+ <menu_item_call label="フレンド" name="Friends..."/>
+ <menu_item_call label="グループ" name="Groups..."/>
+ <menu_item_call label="プロフィール" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
new file mode 100644
index 0000000000..b04f602134
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Show Profile"/>
+ <menu_item_call label="IMã‚’é€ä¿¡..." name="Send IM"/>
+ <menu_item_call label="フレンドを追加..." name="Add Friend"/>
+ <menu_item_call label="フレンドを削除..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
new file mode 100644
index 0000000000..74d877cdda
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Profile..."/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="Invite..."/>
+ <menu_item_call label="ブロック" name="Avatar Mute"/>
+ <menu_item_call label="報告" name="abuse"/>
+ <menu_item_call label="フリーズ" name="Freeze..."/>
+ <menu_item_call label="追放" name="Eject..."/>
+ <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/>
+ <menu_item_call label="ズームイン" name="Zoom In"/>
+ <menu_item_call label="支払ã†" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
new file mode 100644
index 0000000000..a638bed36f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
+ <context_menu label="脱ã â–¶" name="Take Off &gt;">
+ <context_menu label="衣類 ▶" name="Clothes &gt;">
+ <menu_item_call label="シャツ" name="Shirt"/>
+ <menu_item_call label="パンツ" name="Pants"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="é´" name="Shoes"/>
+ <menu_item_call label="é´ä¸‹" name="Socks"/>
+ <menu_item_call label="ジャケット" name="Jacket"/>
+ <menu_item_call label="手袋" name="Gloves"/>
+ <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Self Undershirt"/>
+ <menu_item_call label="下ç€ãƒ‘ンツ" name="Self Underpants"/>
+ <menu_item_call label="タトゥ" name="Self Tattoo"/>
+ <menu_item_call label="アルファ" name="Self Alpha"/>
+ <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="å–り外㙠▶" name="Object Detach"/>
+ <menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="容姿" name="Appearance..."/>
+ <menu_item_call label="フレンド" name="Friends..."/>
+ <menu_item_call label="グループ" name="Groups..."/>
+ <menu_item_call label="プロフィール" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
new file mode 100644
index 0000000000..ea7ba1b741
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="ジェスãƒãƒ£ãƒ¼ãƒœã‚¿ãƒ³" name="ShowGestureButton"/>
+ <menu_item_check label="移動ボタン" name="ShowMoveButton"/>
+ <menu_item_check label="視界ボタン" name="ShowCameraButton"/>
+ <menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
+ <menu_item_call label="切りå–り" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="コピー" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="貼り付ã‘" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="削除" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml
new file mode 100644
index 0000000000..4708b1446c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport To Landmark"/>
+ <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/>
+ <menu_item_call label="SLurl をコピー" name="Copy slurl"/>
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="Show On Map"/>
+ <menu_item_call label="コピー" name="Landmark Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Landmark Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
new file mode 100644
index 0000000000..abf490a247
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰ã®è¿½åŠ ãƒ»å‰Šé™¤" name="activate"/>
+ <menu_item_call label="コピー" name="copy_gesture"/>
+ <menu_item_call label="貼り付ã‘" name="paste"/>
+ <menu_item_call label="UUID をコピー" name="copy_uuid"/>
+ <menu_item_call label="ç¾åœ¨ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«ä¿å­˜" name="save_to_outfit"/>
+ <menu_item_call label="編集" name="edit_gesture"/>
+ <menu_item_call label="調ã¹ã‚‹" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
new file mode 100644
index 0000000000..3787f7d645
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="グループã«å‚加..." name="item_join"/>
+ <menu_item_call label="æ–°ã—ã„グループ..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
new file mode 100644
index 0000000000..09e70b0d1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_im_well_button.xml b/indra/newview/skins/default/xui/ja/menu_im_well_button.xml
new file mode 100644
index 0000000000..3397004bd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="ã™ã¹ã¦é–‰ã˜ã‚‹" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..8cd6fa4a27
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="セッション終了" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..5bcb96f083
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="グループ情報" name="Show Profile"/>
+ <menu_item_call label="セッションを表示" name="Chat"/>
+ <menu_item_call label="セッション終了" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..5453f998fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="Show Profile"/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="セッションを表示" name="Send IM"/>
+ <menu_item_call label="セッション終了" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..93f75f3ce1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="view_profile"/>
+ <menu_item_call label="フレンド登録" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="コール" name="call"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="teleport"/>
+ <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…" name="invite_to_group"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ブロック解除" name="unblock"/>
+ <menu_item_call label="報告" name="report"/>
+ <menu_item_call label="フリーズ" name="freeze"/>
+ <menu_item_call label="追放" name="eject"/>
+ <menu_item_call label="デãƒãƒƒã‚°" name="debug"/>
+ <menu_item_call label="åœ°å›³ã§æŽ¢ã™" name="find_on_map"/>
+ <menu_item_call label="ズームイン" name="zoom_in"/>
+ <menu_item_call label="支払ã†" name="pay"/>
+ <menu_item_call label="共有" name="share"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..506614316e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="触る" name="touch"/>
+ <menu_item_call label="座る" name="sit"/>
+ <menu_item_call label="支払ã†" name="pay"/>
+ <menu_item_call label="è²·ã†" name="buy"/>
+ <menu_item_call label="å–ã‚‹" name="take"/>
+ <menu_item_call label="コピーをå–ã‚‹" name="take_copy"/>
+ <menu_item_call label="é–‹ã" name="open"/>
+ <menu_item_call label="編集" name="edit"/>
+ <menu_item_call label="装ç€" name="wear"/>
+ <menu_item_call label="報告" name="report"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ズームイン" name="zoom_in"/>
+ <menu_item_call label="削除" name="remove"/>
+ <menu_item_call label="詳細" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..d02701b400
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_up"/>
+ <menu_item_call label="容姿" name="my_appearance"/>
+ <menu_item_call label="プロフィール" name="my_profile"/>
+ <menu_item_call label="フレンド" name="my_friends"/>
+ <menu_item_call label="グループ" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 37c52f173c..a2dbc34270 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -10,9 +10,9 @@
<menu_item_call label="éºå¤±ç‰©ãƒ•ォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/>
<menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder"/>
<menu_item_call label="æ–°ã—ã„スクリプト" name="New Script"/>
- <menu_item_call label="æ–°ã—ã„ノート" name="New Note"/>
+ <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/>
<menu_item_call label="æ–°ã—ã„ジェスãƒãƒ£ãƒ¼" name="New Gesture"/>
- <menu name="New Clothes">
+ <menu label="æ–°ã—ã„衣類" name="New Clothes">
<menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/>
<menu_item_call label="æ–°ã—ã„ズボン" name="New Pants"/>
<menu_item_call label="æ–°ã—ã„é´" name="New Shoes"/>
@@ -22,40 +22,58 @@
<menu_item_call label="æ–°ã—ã„æ‰‹è¢‹" name="New Gloves"/>
<menu_item_call label="æ–°ã—ã„下ç€" name="New Undershirt"/>
<menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants"/>
+ <menu_item_call label="æ–°ã—ã„アルファマスク" name="New Alpha Mask"/>
+ <menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
+ <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
<menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
<menu_item_call label="æ–°ã—ã„スキン" name="New Skin"/>
<menu_item_call label="æ–°ã—ã„髪" name="New Hair"/>
<menu_item_call label="æ–°ã—ã„眼" name="New Eyes"/>
</menu>
+ <menu label="種類を変更" name="Change Type">
+ <menu_item_call label="デフォルト" name="Default"/>
+ <menu_item_call label="手袋" name="Gloves"/>
+ <menu_item_call label="ジャケット" name="Jacket"/>
+ <menu_item_call label="パンツ" name="Pants"/>
+ <menu_item_call label="シェイプ" name="Shape"/>
+ <menu_item_call label="é´" name="Shoes"/>
+ <menu_item_call label="シャツ" name="Shirt"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="下ç€ãƒ‘ンツ" name="Underpants"/>
+ <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt"/>
+ </menu>
<menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/>
<menu_item_call label="é–‹ã" name="Animation Open"/>
<menu_item_call label="é–‹ã" name="Sound Open"/>
+ <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="Replace Outfit"/>
+ <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="Add To Outfit"/>
+ <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="Remove From Outfit"/>
<menu_item_call label="アイテムを除外" name="Purge Item"/>
<menu_item_call label="アイテムを復元" name="Restore Item"/>
+ <menu_item_call label="オリジナルを探ã™" name="Find Original"/>
<menu_item_call label="é–‹ã" name="Open"/>
<menu_item_call label="プロパティ" name="Properties"/>
<menu_item_call label="åå‰ã®å¤‰æ›´" name="Rename"/>
<menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/>
<menu_item_call label="コピー" name="Copy"/>
<menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="リンクã®è²¼ã‚Šä»˜ã‘" name="Paste As Link"/>
+ <menu_item_call label="リンクを外ã™" name="Remove Link"/>
<menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="アイテムをå–り外ã™" name="Take Off Items"/>
- <menu_item_call label="æœè£…ã«è¿½åŠ " name="Add To Outfit"/>
- <menu_item_call label="æœè£…ã‚’ç½®æ›" name="Replace Outfit"/>
- <menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/>
+ <menu_item_call label="システムフォルダを削除ã™ã‚‹" name="Delete System Folder"/>
+ <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹" name="Conference Chat Folder"/>
<menu_item_call label="å†ç”Ÿ" name="Sound Play"/>
- <menu_item_call label="ランドマーク情報" name="Teleport To Landmark"/>
- <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/>
- <menu_item_call label="ローカルã«å†ç”Ÿ" name="Animation Audition"/>
- <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/>
+ <menu_item_call label="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…å ±" name="About Landmark"/>
+ <menu_item_call label="インワールドã§å†ç”Ÿã™ã‚‹" name="Animation Play"/>
+ <menu_item_call label="ローカルå†ç”Ÿ" name="Animation Audition"/>
+ <menu_item_call label="インスタントメッセージをé€ä¿¡" name="Send Instant Message"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹..." name="Offer Teleport..."/>
<menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/>
<menu_item_call label="アクティブ" name="Activate"/>
<menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/>
+ <menu_item_call label="別åã§ä¿å­˜" name="Save As"/>
<menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/>
- <menu_item_call label="å‰å›žã‚ã£ãŸä½ç½®ã«æˆ»ã™" name="Restore to Last Position"/>
<menu_item_call label="装ç€" name="Object Wear"/>
<menu label="装ç€å…ˆ" name="Attach To"/>
<menu label="HUD装ç€å…ˆ" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
new file mode 100644
index 0000000000..14ad7900e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="アップロード" name="upload">
+ <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
+ <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
+ <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
+ <menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="æ–°è¦ãƒ•ォルダ" name="New Folder"/>
+ <menu_item_call label="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="New Script"/>
+ <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/>
+ <menu_item_call label="æ–°è¦ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼" name="New Gesture"/>
+ <menu label="æ–°ã—ã„衣類" name="New Clothes">
+ <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/>
+ <menu_item_call label="æ–°ã—ã„パンツ" name="New Pants"/>
+ <menu_item_call label="æ–°ã—ã„é´" name="New Shoes"/>
+ <menu_item_call label="æ–°ã—ã„é´ä¸‹" name="New Socks"/>
+ <menu_item_call label="æ–°ã—ã„ジャケット" name="New Jacket"/>
+ <menu_item_call label="æ–°ã—ã„スカート" name="New Skirt"/>
+ <menu_item_call label="æ–°ã—ã„æ‰‹è¢‹" name="New Gloves"/>
+ <menu_item_call label="æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
+ <menu_item_call label="æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
+ <menu_item_call label="æ–°ã—ã„アルファ" name="New Alpha"/>
+ <menu_item_call label="æ–°ã—ã„タトゥー" name="New Tattoo"/>
+ </menu>
+ <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
+ <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
+ <menu_item_call label="æ–°ã—ã„スキン" name="New Skin"/>
+ <menu_item_call label="æ–°ã—ã„髪" name="New Hair"/>
+ <menu_item_call label="æ–°ã—ã„ç›®" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..e3114327a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="æ–°ã—ã„æŒã¡ç‰©ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="new_window"/>
+ <menu_item_call label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
+ <menu_item_call label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent"/>
+ <menu_item_call label="フィルターを表示" name="show_filters"/>
+ <menu_item_call label="フィルターをリセット" name="reset_filters"/>
+ <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="close_folders"/>
+ <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="empty_trash"/>
+ <menu_item_call label="紛失物を空ã«ã™ã‚‹" name="empty_lostnfound"/>
+ <menu_item_call label="別åã§ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ä¿å­˜" name="Save Texture As"/>
+ <menu_item_call label="オリジナルを表示" name="Find Original"/>
+ <menu_item_call label="ã™ã¹ã¦ã®ãƒªãƒ³ã‚¯ã‚’表示" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml
new file mode 100644
index 0000000000..89c122f14f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="土地情報" name="Place Information..."/>
+ <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Sit Here"/>
+ <menu_item_call label="ã“ã®åœŸåœ°ã‚’購入" name="Land Buy"/>
+ <menu_item_call label="入場許å¯ã‚’購入" name="Land Buy Pass"/>
+ <menu_item_call label="制作" name="Create"/>
+ <menu_item_call label="地形を編集" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml
new file mode 100644
index 0000000000..c134422955
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl をコピー" name="copy"/>
+ <menu_item_call label="削除" name="delete"/>
+ <menu_item_call label="ピックを作æˆ" name="pick"/>
+ <menu_item_call label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã«è¿½åŠ " name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index afb1219095..d6f13f0e59 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -1,13 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="ファイル" name="File">
- <menu_item_call label="終了" name="Quit" />
- </menu>
- <menu label="編集" name="Edit">
- <menu_item_call label="環境設定..." name="Preferences..." />
+ <menu label="ミー" name="File">
+ <menu_item_call label="環境設定" name="Preferences..."/>
+ <menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
<menu label="ヘルプ" name="Help">
- <menu_item_call label="[SECOND_LIFE]ヘルプ" name="Second Life Help" />
- <menu_item_call label="[APP_NAME]ã«ã¤ã„ã¦..." name="About Second Life..." />
+ <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
+ <menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
+ </menu>
+ <menu label="デãƒãƒƒã‚°" name="Debug">
+ <menu label="編集" name="Edit">
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="やり直ã—" name="Redo"/>
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="複製" name="Duplicate"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+ <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
+ </menu>
+ <menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示" name="Debug Settings"/>
+ <menu_item_call label="UI/色ã®è¨­å®š" name="UI/Color Settings"/>
+ <menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/>
+ <menu label="UI テスト" name="UI Tests"/>
+ <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定..." name="Set Window Size..."/>
+ <menu_item_call label="利用è¦ç´„を表示" name="TOS"/>
+ <menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
+ <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index c8828a50be..ec49c3a98d 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="ズーム(近)" name="Zoom Close"/>
<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
<menu_item_call label="ズーム(é ï¼‰" name="Zoom Far"/>
+ <menu_item_check label="地図を回転" name="Rotate Map"/>
<menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/>
- <menu_item_call label="プロフィール..." name="Profile"/>
+ <menu_item_call label="世界地図" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml
new file mode 100644
index 0000000000..9ae2e58198
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="座標を表示" name="Show Coordinates"/>
+ <menu_item_check label="区画ã®ãƒ—ロパティを表示" name="Show Parcel Properties"/>
+ <menu_item_call label="ランドマーク" name="Landmark"/>
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml
new file mode 100644
index 0000000000..c2e4a27686
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="è¿‘ãã®äººã‚’表示ã™ã‚‹..." name="nearby_people"/>
+ <menu_item_check label="ブロックã•ã‚ŒãŸæ–‡å­—を表示" name="muted_text"/>
+ <menu_item_check label="ãƒãƒ‡ã‚£ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示" name="show_buddy_icons"/>
+ <menu_item_check label="åå‰ã‚’表示" name="show_names"/>
+ <menu_item_check label="アイコンã¨åå‰ã‚’表示" name="show_icons_and_names"/>
+ <menu_item_call label="文字ã®å¤§ãã•" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml
new file mode 100644
index 0000000000..913bae8958
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="ã™ã¹ã¦é–‰ã˜ã‚‹" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
new file mode 100644
index 0000000000..888d382e7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="触る" name="Object Touch"/>
+ <menu_item_call label="編集" name="Edit..."/>
+ <menu_item_call label="制作" name="Build"/>
+ <menu_item_call label="é–‹ã" name="Open"/>
+ <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Object Sit"/>
+ <menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
+ <menu_item_call label="ズームイン" name="Zoom In"/>
+ <context_menu label="è£…ç€ â–¶" name="Put On">
+ <menu_item_call label="装ç€" name="Wear"/>
+ <context_menu label="å–り付ã‘ã‚‹ â–¶" name="Object Attach"/>
+ <context_menu label="HUD ã‚’å–り付ã‘ã‚‹ â–¶" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="å–り外㙠▶" name="Remove">
+ <menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="Report Abuse..."/>
+ <menu_item_call label="ブロック" name="Object Mute"/>
+ <menu_item_call label="è¿”å´" name="Return..."/>
+ <menu_item_call label="削除" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
+ <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
+ <menu_item_call label="支払ã†" name="Pay..."/>
+ <menu_item_call label="è²·ã†" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
new file mode 100644
index 0000000000..8c4f328661
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="オブジェクトã®ãƒ—ロフィール..." name="Object Profile"/>
+ <menu_item_call label="ブロック..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
new file mode 100644
index 0000000000..398a78bb61
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="SortByName"/>
+ <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="SortByRecentSpeakers"/>
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="View Profile"/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="共有" name="Share"/>
+ <menu_item_call label="支払ã†" name="Pay"/>
+ <menu_item_check label="ボイスをブロック" name="Block/Unblock"/>
+ <menu_item_check label="文字をブロックã™ã‚‹" name="MuteText"/>
+ <context_menu label="モデレーターã®ã‚ªãƒ—ション &gt;" name="Moderator Options">
+ <menu_item_check label="文字ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/>
+ <menu_item_call label="ã“ã®å‚加者をミュートã™ã‚‹" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="ä»–ã®äººå…¨å“¡ã‚’ミュートã™ã‚‹" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="ã“ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="ä»–ã®äººå…¨å“¡ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteOthers"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..5eaad31898
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
+ <menu_item_check label="オンライン状態ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/>
+ <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
+ <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
new file mode 100644
index 0000000000..842d79dc4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="情報を表示" name="View Info"/>
+ <menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="アクティブ" name="Activate"/>
+ <menu_item_call label="脱退" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..bfc7d15017
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="グループアイコンを表示" name="Display Group Icons"/>
+ <menu_item_call label="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è„±é€€" name="Leave Selected Group"/>
+</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
new file mode 100644
index 0000000000..4788803789
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="プロフィールã®è¡¨ç¤º" name="View Profile"/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="共有" name="Share"/>
+ <menu_item_call label="支払ã†" name="Pay"/>
+ <menu_item_check label="ブロック・ブロック解除" name="Block/Unblock"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..238bfc4af9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="フレンド登録" name="Add Friends"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="共有" name="Share"/>
+ <menu_item_call label="支払ã†" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..a31480158a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent_speakers"/>
+ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
+ <menu_item_check label="è·é›¢ã§ä¸¦ã¹æ›¿ãˆ" name="sort_distance"/>
+ <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
+ <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..b4f177a068
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_most"/>
+ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
+ <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
+ <menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml
new file mode 100644
index 0000000000..011d3d2526
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="情報" name="pick_info"/>
+ <menu_item_call label="編集" name="pick_edit"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="pick_teleport"/>
+ <menu_item_call label="地図" name="pick_map"/>
+ <menu_item_call label="削除" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml
new file mode 100644
index 0000000000..84bf90fea0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="æ–°ã—ã„ピック" name="create_pick"/>
+ <menu_item_call label="æ–°ã—ã„クラシファイド広告" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml
new file mode 100644
index 0000000000..a9f05e126d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="ランドマークを作æˆ" name="landmark"/>
+ <menu_item_call label="ピックを作æˆ" name="pick"/>
+ <menu_item_call label="入場許å¯ã‚’購入" name="pass"/>
+ <menu_item_call label="編集" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml
new file mode 100644
index 0000000000..d5ce88b055
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="ランドマークを追加" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..6f91a3ebf9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="ランドマークを追加" name="add_landmark"/>
+ <menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="切りå–り" name="cut"/>
+ <menu_item_call label="コピー" name="copy_folder"/>
+ <menu_item_call label="貼り付ã‘" name="paste"/>
+ <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
+ <menu_item_call label="削除" name="delete"/>
+ <menu_item_call label="拡大" name="expand"/>
+ <menu_item_call label="戻ã™" name="collapse"/>
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
+ <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..5a135e5f56
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="teleport"/>
+ <menu_item_call label="ã‚‚ã£ã¨è©³ã—ã" name="more_info"/>
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
+ <menu_item_call label="ランドマークを追加" name="add_landmark"/>
+ <menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="切りå–り" name="cut"/>
+ <menu_item_call label="ランドマークをコピー" name="copy_landmark"/>
+ <menu_item_call label="SLurl をコピー" name="copy_slurl"/>
+ <menu_item_call label="貼り付ã‘" name="paste"/>
+ <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
+ <menu_item_call label="削除" name="delete"/>
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
+ <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
+ <menu_item_call label="ピックを作æˆ" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
new file mode 100644
index 0000000000..d7107dc153
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="支払ã†" name="pay"/>
+ <menu_item_call label="共有" name="share"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ブロック解除" name="unblock"/>
+ <menu_item_call label="追放" name="kick"/>
+ <menu_item_call label="フリーズ" name="freeze"/>
+ <menu_item_call label="フリーズ解除" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 6d15563382..61ba3085d9 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url" />
- <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url" />
- <menu_item_call label="地図上ã«è¡¨ç¤º" name="show_on_map" />
+ <menu_item_call label="URL ã«ã¤ã„ã¦" name="about_url"/>
+ <menu_item_call label="URL ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
+ <menu_item_call label="地図" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..901eab9166
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="Expand all folders"/>
+ <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="Collapse all folders"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆã®å±¥æ­´ã‚’クリア" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..66bc32214f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport"/>
+ <menu_item_call label="ã‚‚ã£ã¨è©³ã—ã" name="More Information"/>
+ <menu_item_call label="クリップボードã«ã‚³ãƒ”ー" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..4dd44d2ec8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="é–‹ã" name="TabOpen"/>
+ <menu_item_call label="é–‰ã˜ã‚‹" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_text_editor.xml b/indra/newview/skins/default/xui/ja/menu_text_editor.xml
new file mode 100644
index 0000000000..fcb1038a6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
new file mode 100644
index 0000000000..92d118a5ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="ä½äººã®ãƒ—ロフィールを表示" name="show_agent"/>
+ <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml
new file mode 100644
index 0000000000..1dd3d79438
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="グループ情報を表示" name="show_group"/>
+ <menu_item_call label="グループをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml
new file mode 100644
index 0000000000..c3da8a8686
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Web ページを開ã" name="url_open"/>
+ <menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/>
+ <menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/>
+ <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
new file mode 100644
index 0000000000..7af2f9e2cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’表示" name="show_item"/>
+ <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_map.xml b/indra/newview/skins/default/xui/ja/menu_url_map.xml
new file mode 100644
index 0000000000..8d41e1a571
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
+ <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_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
new file mode 100644
index 0000000000..d6a048dcfc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æƒ…報を表示" name="show_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"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
new file mode 100644
index 0000000000..8d264059d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="区画情報を表示" name="show_parcel"/>
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml
new file mode 100644
index 0000000000..a516c5a075
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行" name="run_slapp"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
new file mode 100644
index 0000000000..2c857ec915
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="å ´æ‰€ã®æƒ…報を表示" name="show_place"/>
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
+ <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
new file mode 100644
index 0000000000..c3507a9a33
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport"/>
+ <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
+ <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index bb33a14be4..85fb23d5b7 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,219 +1,413 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="ファイル" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="アップロード" name="upload">
- <menu_item_call label="ç”»åƒ ï¼ˆL$[COST])..." name="Upload Image"/>
- <menu_item_call label="サウンド (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="アニメーション (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="一括 (ファイルã«ã¤ãL$[COST])..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="デフォルト権é™ã®è¨­å®š..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
- <menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="テクスãƒãƒ£ãƒ¼ã‚’別åã§ä¿å­˜..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="スナップショットを撮る" name="Take Snapshot"/>
- <menu_item_call label="スナップショットをディスクã«ä¿å­˜" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="終了" name="Quit"/>
- </menu>
- <menu label="編集" name="Edit">
- <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
- <menu_item_call label="やり直ã—" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="カット" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="検索..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="ã™ã¹ã¦ã‚’é¸æŠž" name="Select All"/>
- <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="複製" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="オブジェクトを装ç€" name="Attach Object"/>
- <menu label="オブジェクトをå–り外ã™" name="Detach Object"/>
- <menu label="æœã‚’脱ã" name="Take Off Clothing">
- <menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="ズボン" name="Pants"/>
- <menu_item_call label="é´" name="Shoes"/>
- <menu_item_call label="é´ä¸‹" name="Socks"/>
- <menu_item_call label="ジャケット" name="Jacket"/>
- <menu_item_call label="手袋" name="Gloves"/>
- <menu_item_call label="(下ç€ã®ï¼‰ã‚·ãƒ£ãƒ„" name="Menu Undershirt"/>
- <menu_item_call label="(下ç€ã®ï¼‰ãƒ‘ンツ" name="Menu Underpants"/>
- <menu_item_call label="スカート" name="Skirt"/>
- <menu_item_call label="ã™ã¹ã¦ã®æœ" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="ジェスãƒãƒ£ãƒ¼â€¦" name="Gestures..."/>
- <menu_item_call label="プロフィール..." name="Profile..."/>
- <menu_item_call label="容姿..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="フレンド..." name="Friends..."/>
- <menu_item_call label="グループ..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="環境設定..." name="Preferences..."/>
+ <menu label="ミー" name="Me">
+ <menu_item_call label="環境設定" name="Preferences"/>
+ <menu_item_call label="マイアカウント" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
+ </menu_item_call>
+ <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/>
+ <menu_item_call label="マイ プロフィール" name="Profile"/>
+ <menu_item_call label="マイ 容姿" name="Appearance"/>
+ <menu_item_check label="マイ æŒã¡ç‰©" name="Inventory"/>
+ <menu_item_call label="æŒã¡ç‰©ã‚’サイドトレイã«è¡¨ç¤º" name="ShowSidetrayInventory"/>
+ <menu_item_call label="マイ ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
+ <menu label="マイ ログイン状態" name="Status">
+ <menu_item_call label="一時退席中" name="Set Away"/>
+ <menu_item_call label="å–り込ã¿ä¸­" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="管ç†è€…権é™ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" name="Request Admin Options"/>
+ <menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
+ <menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
- <menu label="表示" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="一人称視点(マウスルック)" name="Mouselook"/>
- <menu_item_check label="制作ツール" name="Build"/>
- <menu_item_check label="ジョイスティックæ“作" name="Joystick Flycam"/>
- <menu_item_call label="表示をリセット" name="Reset View"/>
- <menu_item_call label="最後ã®ãƒãƒ£ãƒƒãƒˆã‚’閲覧" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="ツールãƒãƒ¼" name="Toolbar"/>
- <menu_item_check label="ローカル・ãƒãƒ£ãƒƒãƒˆ" name="Chat History"/>
- <menu_item_check label="コミュニケーション" name="Instant Message"/>
- <menu_item_check label="æŒã¡ç‰©" name="Inventory"/>
- <menu_item_check label="ボイスãƒãƒ£ãƒƒãƒˆãƒ»ãƒ¦ãƒ¼ã‚¶ãƒ¼ä¸€è¦§" name="Active Speakers"/>
- <menu_item_check label="無視リスト" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="カメラ・コントロール" name="Camera Controls"/>
- <menu_item_check label="移動コントロール" name="Movement Controls"/>
- <menu_item_check label="世界地図" name="World Map"/>
- <menu_item_check label="ミニマップ" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="地域ã®çµ±è¨ˆæƒ…å ±" name="Statistics Bar"/>
- <menu_item_check label="土地ã®å¢ƒç•Œç·š" name="Property Lines"/>
- <menu_item_check label="ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³" name="Banlines"/>
- <menu_item_check label="土地オーナー" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="ヒントã®ãƒãƒƒãƒ—アップ" name="Hover Tips">
- <menu_item_check label="ヒントを表示" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="土地ã®ãƒ’ント" name="Land Tips"/>
- <menu_item_check label="ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹ãƒ’ント" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="逿˜Žã‚ªãƒ–ジェクトを強調表示" name="Highlight Transparent"/>
- <menu_item_check label="ビーコン(標識)" name="beacons"/>
- <menu_item_check label="パーティクルをéžè¡¨ç¤º" name="Hide Particles"/>
- <menu_item_check label="HUD装ç€ç‰©ã‚’表示" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="カメラ・ズームイン" name="Zoom In"/>
- <menu_item_call label="カメラ・デフォルト" name="Zoom Default"/>
- <menu_item_call label="カメラ・ズームアウト" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="[全画é¢è¡¨ç¤º]" name="Toggle Fullscreen"/>
- <menu_item_call label="UIã‚µã‚¤ã‚ºã‚’æ¨™æº–è¨­å®šã«æˆ»ã™" name="Set UI Size to Default"/>
+ <menu label="コミュニケーション" name="Communicate">
+ <menu_item_call label="フレンド" name="My Friends"/>
+ <menu_item_call label="所属グループ" name="My Groups"/>
+ <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="Nearby Chat"/>
+ <menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/>
+ <menu_item_check label="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢" name="Nearby Media"/>
</menu>
<menu label="世界" name="World">
- <menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/>
- <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
- <menu_item_check label="飛行" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="ã“ã®å ´æ‰€ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆ" name="Create Landmark Here"/>
- <menu_item_call label="ホームをã“ã“ã«è¨­å®š" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
+ <menu_item_check label="ミニマップ" name="Mini-Map"/>
+ <menu_item_check label="世界地図" name="World Map"/>
+ <menu_item_call label="スナップショット" name="Take Snapshot"/>
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
+ <menu label="場所ã®ãƒ—ロフィール" name="Land">
+ <menu_item_call label="土地情報" name="About Land"/>
+ <menu_item_call label="地域 / ä¸å‹•産" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="ã“ã®åœŸåœ°ã‚’購入" name="Buy Land"/>
+ <menu_item_call label="自分ã®åœŸåœ°" name="My Land"/>
+ <menu label="表示" name="LandShow">
+ <menu_item_check label="移動コントロール" name="Movement Controls"/>
+ <menu_item_check label="コントロールを表示" name="Camera Controls"/>
+ </menu>
<menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="離席中ã«è¨­å®š" name="Set Away"/>
- <menu_item_call label="å–り込ã¿ä¸­ã«è¨­å®š" name="Set Busy"/>
- <menu_item_call label="自分ã®ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢" name="Stop Animating My Avatar"/>
- <menu_item_call label="キー制御を解除" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="アカウントã®å±¥æ­´..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=ja"/>
- </menu_item_call>
- <menu_item_call label="マイアカウントã®ç®¡ç†..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
- </menu_item_call>
- <menu_item_call label="L$(リンデン・ドル)を購入" name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="自分ã®åœŸåœ°..." name="My Land..."/>
- <menu_item_call label="土地情報..." name="About Land..."/>
- <menu_item_call label="土地を購入..." name="Buy Land..."/>
- <menu_item_call label="地域ï¼ä¸å‹•産..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="環境ã®è¨­å®š" name="Environment Settings">
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
+ <menu label="太陽" name="Environment Settings">
<menu_item_call label="æ—¥ã®å‡º" name="Sunrise"/>
<menu_item_call label="æ­£åˆ" name="Noon"/>
<menu_item_call label="日没" name="Sunset"/>
<menu_item_call label="深夜" name="Midnight"/>
- <menu_item_call label="åœ°åŸŸã®æ¨™æº–è¨­å®šã«æˆ»ã™" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="環境編集" name="Environment Editor"/>
+ <menu_item_call label="エステートタイム" name="Revert to Region Default"/>
+ <menu_item_call label="自然環境エディター" name="Environment Editor"/>
</menu>
</menu>
- <menu label="ツール" name="Tools">
- <menu label="ツールをé¸ã¶" name="Select Tool">
- <menu_item_call label="フォーカス" name="Focus"/>
- <menu_item_call label="移動" name="Move"/>
- <menu_item_call label="編集" name="Edit"/>
- <menu_item_call label="作æˆ" name="Create"/>
- <menu_item_call label="土地" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="自分ã®ã‚ªãƒ–ジェクトã®ã¿é¸æŠž" name="Select Only My Objects"/>
- <menu_item_check label="移動å¯èƒ½ãªã‚ªãƒ–ジェクトã®ã¿é¸æŠž" name="Select Only Movable Objects"/>
- <menu_item_check label="環境ã§é¸æŠž" name="Select By Surrounding"/>
- <menu_item_check label="隠れãŸä½ç½®ã®é¸æŠžã‚‚表示" name="Show Hidden Selection"/>
- <menu_item_check label="é¸æŠžã—ãŸã‚‚ã®ã®å…‰æºç¯„囲を表示" name="Show Light Radius for Selection"/>
- <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤º" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap to Grid"/>
- <menu_item_call label="オブジェクトã®XY移動をグリッドã«åˆã‚ã›ã‚‹" name="Snap Object XY to Grid"/>
- <menu_item_call label="グリッドをオブジェクトã®ä½ç½®åŸºæº–ã§å†è¨­å®š" name="Use Selection for Grid"/>
- <menu_item_call label="グリッドã®ã‚ªãƒ—ション..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="リンクã•れãŸä¸€éƒ¨ã‚’編集" name="Edit Linked Parts"/>
+ <menu label="制作" name="BuildTools">
+ <menu_item_check label="制作" name="Show Build Tools"/>
+ <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹" name="Select Tool">
+ <menu_item_call label="フォーカスツール" name="Focus"/>
+ <menu_item_call label="移動ツール" name="Move"/>
+ <menu_item_call label="編集ツール" name="Edit"/>
+ <menu_item_call label="クリエーションツール" name="Create"/>
+ <menu_item_call label="土地ツール" name="Land"/>
+ </menu>
+ <menu label="編集" name="Edit">
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="やり直ã—" name="Redo"/>
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="複製" name="Duplicate"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+ <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
+ </menu>
<menu_item_call label="リンク" name="Link"/>
- <menu_item_call label="リンク解除" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="é¸æŠžå¯¾è±¡ã«è¦–点移動" name="Focus on Selection"/>
- <menu_item_call label="é¸æŠžç¯„å›²ã«ã‚ºãƒ¼ãƒ ã‚¤ãƒ³" name="Zoom to Selection"/>
- <menu_item_call label="オブジェクトを購入" name="Menu Object Take">
- <on_enable userdata="購入,å–ã‚‹" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
- <menu_item_call label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãƒ»ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«æˆ»ã—ã¦ä¿å­˜" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="スクリプト警告ï¼ã‚¨ãƒ©ãƒ¼ãƒ»ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示" name="Show Script Warning/Error Window"/>
- <menu label="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ä¸­ã®ã‚¹ã‚¯ãƒªãƒ—トをå†ã‚³ãƒ³ãƒ‘イル" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ä¸­ã®ã‚¹ã‚¯ãƒªãƒ—トをリセット" name="Reset Scripts in Selection"/>
- <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ä¸­ã®ã‚¹ã‚¯ãƒªãƒ—トを起動ã™ã‚‹" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ä¸­ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’åœæ­¢ã™ã‚‹" name="Set Scripts to Not Running in Selection"/>
+ <menu_item_call label="リンクを外ã™" name="Unlink"/>
+ <menu_item_check label="リンクã—ãŸéƒ¨åˆ†ã‚’編集" name="Edit Linked Parts"/>
+ <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã«ç„¦ç‚¹ã‚’åˆã‚ã›ã‚‹" name="Focus on Selection"/>
+ <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã‚’ズームã™ã‚‹" name="Zoom to Selection"/>
+ <menu label="オブジェクト" name="Object">
+ <menu_item_call label="å–ã‚‹" name="Menu Object Take"/>
+ <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
+ <menu_item_call label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="オブジェクトã®ä¸­èº«ã«ä¿å­˜" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="スクリプト" name="Scripts">
+ <menu_item_call label="スクリプトã®ãƒªã‚³ãƒ³ãƒ‘イル(Mono)" name="Mono"/>
+ <menu_item_call label="スクリプトã®ãƒªã‚³ãƒ³ãƒ‘イル(LSL)" name="LSL"/>
+ <menu_item_call label="スクリプトã®ãƒªã‚»ãƒƒãƒˆ" name="Reset Scripts"/>
+ <menu_item_call label="スクリプトを実行中ã«ã™ã‚‹" name="Set Scripts to Running"/>
+ <menu_item_call label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’å®Ÿè¡Œåœæ­¢ã«ã™ã‚‹" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="オプション" name="Options">
+ <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
+ <menu_item_check label="権é™ã®è©³ç´°ã‚’表示" name="DebugPermissions"/>
+ <menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠž" name="Select Only My Objects"/>
+ <menu_item_check label="動的オブジェクトã®ã¿é¸æŠž" name="Select Only Movable Objects"/>
+ <menu_item_check label="環境ã§é¸æŠž" name="Select By Surrounding"/>
+ <menu_item_check label="éžè¡¨ç¤ºã®é¸æŠžã‚’表示" name="Show Hidden Selection"/>
+ <menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示" name="Show Light Radius for Selection"/>
+ <menu_item_check label="é¸æŠžã—ãŸãƒ“ームを表示" name="Show Selection Beam"/>
+ <menu_item_check label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap to Grid"/>
+ <menu_item_call label="オブジェクトã®XY軸をグリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap Object XY to Grid"/>
+ <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨" name="Use Selection for Grid"/>
+ <menu_item_call label="グリッドオプション" name="Grid Options"/>
+ </menu>
+ <menu label="リンクã—ãŸéƒ¨åˆ†ã‚’é¸æŠž" name="Select Linked Parts">
+ <menu_item_call label="次ã®éƒ¨ä½ã‚’é¸æŠž" name="Select Next Part"/>
+ <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’é¸æŠž" name="Select Previous Part"/>
+ <menu_item_call label="次ã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Next Part"/>
+ <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="ヘルプ" name="Help">
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- <menu_item_call label="ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Lindenå…¬å¼ãƒ–ログ..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="スクリプト・ãƒãƒ¼ã‚¿ãƒ«..." name="Scripting Portal...">
- <on_click name="ScriptingPortal_url" userdata="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal/ja" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š..." name="Report Abuse..."/>
- <menu_item_call label="è¡çªã®è¨˜éŒ²..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="ラグ メーター" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="ãƒã‚°ã®å ±å‘Š" name="Bug Reporting">
- <menu_item_call label="パブリックå•題トラッカー..." name="Public Issue Tracker..."/>
- <menu_item_call label="パブリックå•題トラッカー ヘルプ..." name="Publc Issue Tracker Help...">
- <on_click name="PublicIssueTrackerHelp_url" userdata="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker/ja" />
- </menu_item_call>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="ãƒã‚°ã®å ±å‘Š 101..." name="Bug Reporing 101...">
- <on_click name="BugReporting101_url" userdata="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101"/>
- </menu_item_call>
- <menu_item_call label="セキュリティå•題..." name="Security Issues...">
- <on_click name="SecurityIssues_url" userdata="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues/ja"/>
- </menu_item_call>
- <menu_item_call label="å“質ä¿è¨¼é–¢é€£Wiki..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="ãƒã‚°ã®å ±å‘Š..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="[APP_NAME]ã«ã¤ã„ã¦" name="About Second Life..."/>
+ <menu_item_call label="嫌ãŒã‚‰ã›ã‚’報告ã™ã‚‹" name="Report Abuse"/>
+ <menu_item_call label="ãƒã‚°ã‚’報告ã™ã‚‹" name="Report Bug"/>
+ <menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
+ </menu>
+ <menu label="アドãƒãƒ³ã‚¹" name="Advanced">
+ <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯" name="Rebake Texture"/>
+ <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
+ <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®šï¼š" name="Set Window Size..."/>
+ <menu_item_check label="é ãã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ãªã„" name="Limit Select Distance"/>
+ <menu_item_check label="カメラã®è·é›¢ç§»å‹•を制é™ã—ãªã„" name="Disable Camera Distance"/>
+ <menu_item_check label="高解åƒåº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="HighResSnapshot"/>
+ <menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="圧縮ã—ã¦ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜ã™ã‚‹" name="CompressSnapshotsToDisk"/>
+ <menu label="パフォーマンスツール" name="Performance Tools">
+ <menu_item_call label="ラグ計測器" name="Lag Meter"/>
+ <menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã¨ç›®ã«è¦‹ãˆã‚‹ã‚‚ã®" name="Highlighting and Visibility">
+ <menu_item_check label="ãƒãƒ¼ã‚¸ãƒ¼ãƒ“ーコン" name="Cheesy Beacon"/>
+ <menu_item_check label="パーティクルをéžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Particles"/>
+ <menu_item_check label="é¸æŠžã—ãŸã‚‚ã®ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Selected"/>
+ <menu_item_check label="逿˜Žéƒ¨åˆ†ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlight Transparent"/>
+ <menu_item_check label="HUD を表示" name="Show HUD Attachments"/>
+ <menu_item_check label="一人称視点ã®ã¨ãã«å字線を表示" name="ShowCrosshairs"/>
+ <menu_item_check label="土地ã®ãƒ„ールãƒãƒƒãƒ—を表示" name="Land Tips"/>
+ </menu>
+ <menu label="レンダリング(種類)" name="Rendering Types">
+ <menu_item_check label="シンプル" name="Simple"/>
+ <menu_item_check label="アルファ" name="Alpha"/>
+ <menu_item_check label="木" name="Tree"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"/>
+ <menu_item_check label="地表" name="SurfacePath"/>
+ <menu_item_check label="空" name="Sky"/>
+ <menu_item_check label="æ°´" name="Water"/>
+ <menu_item_check label="地é¢" name="Ground"/>
+ <menu_item_check label="ボリューム" name="Volume"/>
+ <menu_item_check label="è‰" name="Grass"/>
+ <menu_item_check label="雲" name="Clouds"/>
+ <menu_item_check label="パーティクル" name="Particles"/>
+ <menu_item_check label="è¡çª" name="Bump"/>
+ </menu>
+ <menu label="レンダリング(機能)" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="é¸æŠžæ¸ˆ" name="Selected"/>
+ <menu_item_check label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlighted"/>
+ <menu_item_check label="ダイナミックテクスãƒãƒ£" name="Dynamic Textures"/>
+ <menu_item_check label="è¶³ã®å½±" name="Foot Shadows"/>
+ <menu_item_check label="ãもり" name="Fog"/>
+ <menu_item_check label="FRInfo ã®ãƒ†ã‚¹ãƒˆ" name="Test FRInfo"/>
+ <menu_item_check label="フレキシブルオブジェクト" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="マルãƒã‚¹ãƒ¬ãƒƒãƒ‰å‡¦ç†" name="Run Multiple Threads"/>
+ <menu_item_call label="グループキャッシュã®ã‚¯ãƒªã‚¢" name="ClearGroupCache"/>
+ <menu_item_check label="マウスã®å¹³æ»‘化" name="Mouse Smoothing"/>
+ <menu label="ショートカット" name="Shortcuts">
+ <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
+ <menu_item_check label="検索" name="Search"/>
+ <menu_item_call label="キーをリリース" name="Release Keys"/>
+ <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®š" name="Set UI Size to Default"/>
+ <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
+ <menu_item_check label="飛行" name="Fly"/>
+ <menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
+ <menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
+ <menu_item_call label="スナップショットをディスクã«ä¿å­˜" name="Snapshot to Disk"/>
+ <menu_item_call label="一人称視点" name="Mouselook"/>
+ <menu_item_check label="ジョイスティック・フライカム" name="Joystick Flycam"/>
+ <menu_item_call label="表示をリセット" name="Reset View"/>
+ <menu_item_call label="最後ã®ç™ºè¨€è€…を見る" name="Look at Last Chatter"/>
+ <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠž" name="Select Tool">
+ <menu_item_call label="焦点ツール" name="Focus"/>
+ <menu_item_call label="移動ツール" name="Move"/>
+ <menu_item_call label="編集ツール" name="Edit"/>
+ <menu_item_call label="作æˆãƒ„ール" name="Create"/>
+ <menu_item_call label="土地ツール" name="Land"/>
+ </menu>
+ <menu_item_call label="ズームイン" name="Zoom In"/>
+ <menu_item_call label="ズーム・デフォルト" name="Zoom Default"/>
+ <menu_item_call label="ズームアウト" name="Zoom Out"/>
+ <menu_item_call label="全画é¢è¡¨ç¤º" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示ã™ã‚‹" name="Debug Settings"/>
+ <menu_item_check label="開発メニューを表示" name="Debug Mode"/>
+ </menu>
+ <menu label="開発" name="Develop">
+ <menu label="コンソール" name="Consoles">
+ <menu_item_check label="テクスãƒãƒ£ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Console"/>
+ <menu_item_check label="デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Debug Console"/>
+ <menu_item_call label="通知コンソール" name="Notifications"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚µã‚¤ã‚ºã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Size"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªãƒ»ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/>
+ <menu_item_check label="ファーストタイマー" name="Fast Timers"/>
+ <menu_item_check label="メモリ" name="Memory"/>
+ <menu_item_call label="リージョン情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Region Info to Debug Console"/>
+ <menu_item_call label="グループ情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Group Info to Debug Console"/>
+ <menu_item_call label="性能情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="カメラ" name="Camera"/>
+ <menu_item_check label="風" name="Wind"/>
+ <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="ãƒãƒƒã‚¸" name="Badge"/>
+ </menu>
+ <menu label="情報を表示" name="Display Info">
+ <menu_item_check label="時間を表示" name="Show Time"/>
+ <menu_item_check label="æç”»æƒ…報を表示" name="Show Render Info"/>
+ <menu_item_check label="マトリックスを表示" name="Show Matrices"/>
+ <menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示" name="Show Color Under Cursor"/>
+ <menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示" name="Show Updates"/>
+ </menu>
+ <menu label="エラーを実行" name="Force Errors">
+ <menu_item_call label="ブレークãƒã‚¤ãƒ³ãƒˆ" name="Force Breakpoint"/>
+ <menu_item_call label="LLError ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force LLError And Crash"/>
+ <menu_item_call label="ãƒãƒƒãƒ‰ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’実行" name="Force Bad Memory Access"/>
+ <menu_item_call label="ç„¡é™ãƒ«ãƒ¼ãƒ—" name="Force Infinite Loop"/>
+ <menu_item_call label="ドライãƒã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force Driver Carsh"/>
+ <menu_item_call label="ソフトウェア例外エラーã®å®Ÿè¡Œ" name="Force Software Exception"/>
+ <menu_item_call label="ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šé®æ–­ã‚’実行" name="Force Disconnect Viewer"/>
+ <menu_item_call label="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="レンダーテスト" name="Render Tests">
+ <menu_item_check label="カメラオフセット" name="Camera Offset"/>
+ <menu_item_check label="フレームレートをランダム化" name="Randomize Framerate"/>
+ <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
+ <menu_item_check label="フレームテスト" name="Frame Test"/>
+ </menu>
+ <menu label="メタデータã®ãƒ¬ãƒ³ãƒ€ãƒ¼" name="Render Metadata">
+ <menu_item_check label="ãƒã‚¦ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒœãƒƒã‚¯ã‚¹" name="Bounding Boxes"/>
+ <menu_item_check label="オクトリー" name="Octree"/>
+ <menu_item_check label="シャドウ円éŒ" name="Shadow Frusta"/>
+ <menu_item_check label="オクルージョン" name="Occlusion"/>
+ <menu_item_check label="ãƒãƒƒãƒã®æç”»" name="Render Batches"/>
+ <menu_item_check label="アニメーション部分をテクスãƒãƒ£ã§è¡¨ç¤º" name="Texture Anim"/>
+ <menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/>
+ <menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/>
+ <menu_item_check label="Face Area" name="Face Area"/>
+ <menu_item_check label="å…‰" name="Lights"/>
+ <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®š" name="Collision Skeleton"/>
+ <menu_item_check label="Raycast" name="Raycast"/>
+ </menu>
+ <menu label="レンダリング" name="Rendering">
+ <menu_item_check label="軸" name="Axes"/>
+ <menu_item_check label="接線基底" name="Tangent Basis"/>
+ <menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…報基底" name="Selected Texture Info Basis"/>
+ <menu_item_check label="ワイヤーフレーム" name="Wireframe"/>
+ <menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/>
+ <menu_item_check label="フレームãƒãƒƒãƒ•ァ・オブジェクト" name="Framebuffer Objects"/>
+ <menu_item_check label="é…延レンダリング" name="Deferred Rendering"/>
+ <menu_item_check label="グローãƒãƒ«ã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³" name="Global Illumination"/>
+ <menu_item_check label="GLデãƒãƒƒã‚°" name="Debug GL"/>
+ <menu_item_check label="経路をデãƒãƒƒã‚°" name="Debug Pipeline"/>
+ <menu_item_check label="ファーストアルファ" name="Fast Alpha"/>
+ <menu_item_check label="アニメーションテクスãƒãƒ£" name="Animation Textures"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚’無効ã«ã™ã‚‹" name="Disable Textures"/>
+ <menu_item_check label="フル解åƒåº¦ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Rull Res Textures"/>
+ <menu_item_check label="テクスãƒãƒ£ã®æ¤œæŸ»" name="Audit Textures"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚¢ãƒˆãƒ©ã‚¹" name="Texture Atlas"/>
+ <menu_item_check label="装ç€ã•れãŸå…‰æºã‚’æç”»ã™ã‚‹" name="Render Attached Lights"/>
+ <menu_item_check label="å–り付ã‘られãŸãƒ‘ーティクルをæç”»ã™ã‚‹" name="Render Attached Particles"/>
+ <menu_item_check label="マウスオーãƒãƒ¼ã§å¼·èª¿è¡¨ç¤º" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="Network">
+ <menu_item_check label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ä¸€æ™‚åœæ­¢" name="AgentPause"/>
+ <menu_item_call label="メッセージログを有効ã«ã™ã‚‹" name="Enable Message Log"/>
+ <menu_item_call label="メッセージログを使用ä¸å¯ã«ã™ã‚‹" name="Disable Message Log"/>
+ <menu_item_check label="é€ŸåŠ›ãŒæŒ¿å…¥ã•れãŸã‚ªãƒ–ジェクト" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="挿入ã•れãŸã‚ªãƒ–ジェクトã®ä½ç½®ã® Ping" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="パケットドロップ" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="スクリプト付ãカメラをダンプ" name="Dump Scripted Camera"/>
+ <menu_item_call label="è¡çªãƒ»ãƒ—ッシュ・打撃" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="レコーダー" name="Recorder">
+ <menu_item_call label="å†ç”Ÿé–‹å§‹" name="Start Playback"/>
+ <menu_item_call label="å†ç”Ÿåœæ­¢" name="Stop Playback"/>
+ <menu_item_check label="å†ç”Ÿã‚’ループ" name="Loop Playback"/>
+ <menu_item_call label="記録開始" name="Start Record"/>
+ <menu_item_call label="è¨˜éŒ²åœæ­¢" name="Stop Record"/>
+ </menu>
+ <menu label="世界" name="World">
+ <menu_item_check label="シムã®å¤ªé™½ã®è¨­å®šã‚’無視ã™ã‚‹" name="Sim Sun Override"/>
+ <menu_item_check label="ビーコンã®å¼·èª¿è¡¨ç¤º" name="Cheesy Beacon"/>
+ <menu_item_check label="固定ã•れãŸå¤©æ°—" name="Fixed Weather"/>
+ <menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプ" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
+ <menu_item_call label="æŒã¡ç‰©ã®å‡ºåŠ›" name="Dump Inventory"/>
+ <menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
+ <menu_item_call label="フォーカスホールダーをダンプ" name="Dump Focus Holder"/>
+ <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクト情報をプリント" name="Print Selected Object Info"/>
+ <menu_item_call label="エージェント情報をプリント" name="Print Agent Info"/>
+ <menu_item_call label="メモリ使用状æ³" name="Memory Stats"/>
+ <menu_item_check label="ダブルクリックã—ãŸå ´æ‰€ã«è‡ªå‹•æ“作ã§ç§»å‹•" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="SelectMgr ã®ãƒ‡ãƒãƒƒã‚°" name="Debug SelectMgr"/>
+ <menu_item_check label="ダブルクリック" name="Debug Clicks"/>
+ <menu_item_check label="デãƒãƒƒã‚°è¡¨ç¤º" name="Debug Views"/>
+ <menu_item_check label="デãƒãƒƒã‚°åツールãƒãƒƒãƒ—" name="Debug Name Tooltips"/>
+ <menu_item_check label="マウスæ“作ã§ç™ºç”Ÿã™ã‚‹ã‚‚ã®ã®ãƒ‡ãƒãƒƒã‚°" name="Debug Mouse Events"/>
+ <menu_item_check label="デãƒãƒƒã‚°ã‚­ãƒ¼" name="Debug Keys"/>
+ <menu_item_check label="WindowProc ã®ãƒ‡ãƒãƒƒã‚°" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="色ã®è¨­å®šã‚’æ›´æ–°" name="Reload Color Settings"/>
+ <menu_item_call label="フォントテストを表示" name="Show Font Test"/>
+ <menu_item_call label="XML ã‹ã‚‰èª­ã¿è¾¼ã‚€" name="Load from XML"/>
+ <menu_item_call label="XML ã§ä¿å­˜" name="Save to XML"/>
+ <menu_item_check label="XUI ãƒãƒ¼ãƒ ã‚’表示" name="Show XUI Names"/>
+ <menu_item_call label="テスト用 IM ã‚’é€ä¿¡" name="Send Test IMs"/>
+ </menu>
+ <menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character">
+ <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—" name="Grab Baked Texture">
+ <menu_item_call label="çž³" name="Iris"/>
+ <menu_item_call label="é ­" name="Head"/>
+ <menu_item_call label="上åŠèº«" name="Upper Body"/>
+ <menu_item_call label="下åŠèº«" name="Lower Body"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ </menu>
+ <menu label="キャラクターテスト" name="Character Tests">
+ <menu_item_call label="容姿を XML ã«ä¿å­˜" name="Appearance To XML"/>
+ <menu_item_call label="キャラクタジオメトリã®åˆ‡ã‚Šæ›¿ãˆ" name="Toggle Character Geometry"/>
+ <menu_item_call label="男性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Male"/>
+ <menu_item_call label="女性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Female"/>
+ <menu_item_call label="PG ã®ãƒˆã‚°ãƒ«" name="Toggle PG"/>
+ <menu_item_check label="é¸æŠžã‚¢ãƒã‚¿ãƒ¼è¨±å¯" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Params をデフォルトã«å®Ÿè¡Œ" name="Force Params to Default"/>
+ <menu_item_check label="アニメーション情報" name="Animation Info"/>
+ <menu_item_check label="アニメーションをスローモーション" name="Slow Motion Animations"/>
+ <menu_item_check label="見ã¦ã„ã‚‹ã‚‚ã®ã‚’表示ã™ã‚‹" name="Show Look At"/>
+ <menu_item_check label="クリックã—ãŸå ´æ‰€ã‚’表示ã™ã‚‹" name="Show Point At"/>
+ <menu_item_check label="çµåˆéƒ¨ã®ã‚¢ãƒƒãƒ—デートã®ãƒ‡ãƒãƒƒã‚°" name="Debug Joint Updates"/>
+ <menu_item_check label="LOD を無効ã«ã™ã‚‹" name="Disable LOD"/>
+ <menu_item_check label="キャラクター Vis ã®ãƒ‡ãƒãƒƒã‚°" name="Debug Character Vis"/>
+ <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示" name="Show Collision Skeleton"/>
+ <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="アタッãƒãƒ¡ãƒ³ãƒˆã‚’ダンプ" name="Dump Attachments"/>
+ <menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’デãƒãƒƒã‚°" name="Debug Avatar Textures"/>
+ <menu_item_call label="ローカルテクスãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Texture" name="HTTP Textures"/>
+ <menu_item_call label="圧縮画åƒ" name="Compress Images"/>
+ <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
+ <menu_item_check label="次回ã®èµ·å‹•時ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示" name="Console Window"/>
+ <menu_item_check label="管ç†è€…メニューを表示" name="View Admin Options"/>
+ <menu_item_call label="管ç†è€…ステータスã®å‘¼ã³å‡ºã—" name="Request Admin Options"/>
+ <menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
+ </menu>
+ <menu label="管ç†è€…" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
+ <menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Force Owner To Me"/>
+ <menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="ロック" name="Lock"/>
+ <menu_item_call label="アセット ID ã‚’å–å¾—" name="Get Assets IDs"/>
+ </menu>
+ <menu label="区画" name="Parcel">
+ <menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Owner To Me"/>
+ <menu_item_call label="リンデンコンテンツã«è¨­å®š" name="Set to Linden Content"/>
+ <menu_item_call label="パブリックã®åœŸåœ°ã‚’å–å¾—" name="Claim Public Land"/>
+ </menu>
+ <menu label="リージョン/地域" name="Region">
+ <menu_item_call label="一時アセットデータをダンプ" name="Dump Temp Asset Data"/>
+ <menu_item_call label="リージョンã®çŠ¶æ…‹ã‚’ä¿å­˜" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="グリッドツール" name="God Tools"/>
+ </menu>
+ <menu label="管ç†è€…" name="Deprecated">
+ <menu label="オブジェクトをå–り付ã‘ã‚‹" name="Attach Object"/>
+ <menu label="オブジェクトをå–り外ã™" name="Detach Object"/>
+ <menu label="衣類を脱ã" name="Take Off Clothing">
+ <menu_item_call label="シャツ" name="Shirt"/>
+ <menu_item_call label="パンツ" name="Pants"/>
+ <menu_item_call label="é´" name="Shoes"/>
+ <menu_item_call label="é´ä¸‹" name="Socks"/>
+ <menu_item_call label="ジャケット" name="Jacket"/>
+ <menu_item_call label="手袋" name="Gloves"/>
+ <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Menu Undershirt"/>
+ <menu_item_call label="下ç€ãƒ‘ンツ" name="Menu Underpants"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="アルファ" name="Alpha"/>
+ <menu_item_call label="タトゥ" name="Tattoo"/>
+ <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
+ </menu>
+ <menu label="ヘルプ" name="Help">
+ <menu_item_call label="リンデン公å¼ãƒ–ログ" name="Official Linden Blog"/>
+ <menu_item_call label="スクリプトãƒãƒ¼ã‚¿ãƒ«" name="Scripting Portal"/>
+ <menu label="ãƒã‚°ã®å ±å‘Š" name="Bug Reporting">
+ <menu_item_call label="パブリックå•題トラッカー" name="Public Issue Tracker"/>
+ <menu_item_call label="パブリックå•題トラッカーヘルプ" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="ãƒã‚°å ±å‘Šã®åŸºç¤ŽçŸ¥è­˜" name="Bug Reporing 101"/>
+ <menu_item_call label="セキュリティå•題" name="Security Issues"/>
+ <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index 2f945b2010..54663a0367 100644
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- ウェブ・コンテンツ
+ Webコンテンツ
</label>
<tooltip name="web_tooltip">
- ã“ã“ã«ã‚¦ã‚§ãƒ–・コンテンツãŒã‚りã¾ã™ã€‚
+ ã“ã“ã«WebコンテンツãŒã‚りã¾ã™ã€‚
</tooltip>
<playtip name="web_playtip">
- ウェブ・コンテンツを表示
+ Webコンテンツを表示
</playtip>
</widgetset>
<widgetset name="movie">
@@ -119,7 +119,7 @@
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- ウェブ・ページ (XHTML)
+ Webページ (XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
@@ -184,7 +184,7 @@
</mimetype>
<mimetype menu="1" name="text/html">
<label name="text/html_label">
- ウェブ・ページ
+ Webページ
</label>
</mimetype>
<mimetype menu="1" name="text/plain">
diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
new file mode 100644
index 0000000000..0ec1030113
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web コンテンツ
+ </label>
+ <tooltip name="web_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ Web コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™
+ </tooltip>
+ <playtip name="web_playtip">
+ Web コンテンツを表示ã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ ムービー
+ </label>
+ <tooltip name="movie_tooltip">
+ ã“ã“ã«ã¯ãƒ ãƒ¼ãƒ“ーãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="movie_playtip">
+ ムービーをå†ç”Ÿã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ ç”»åƒ
+ </label>
+ <tooltip name="image_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ç”»åƒãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="image_playtip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ç”»åƒã‚’表示ã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ オーディオ
+ </label>
+ <tooltip name="audio_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="audio_playtip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’å†ç”Ÿã™ã‚‹
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ リアルタイム・ストリーミング
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - ãªã— -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - ãªã— -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ オーディオ
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ ビデオ
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ ç”»åƒ
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ ムービー(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg オーディオ・ビデオ
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF ドキュメント
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript ドキュメント
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ リッãƒãƒ†ã‚­ã‚¹ãƒˆï¼ˆRTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web ページ(XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ マクロメディアディレクター
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ オーディオ(MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ オーディオ(MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ オーディオ(AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ オーディオ(WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ ç”»åƒï¼ˆBMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ ç”»åƒï¼ˆGIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ ç”»åƒï¼ˆJPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ ç”»åƒï¼ˆPNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ ç”»åƒï¼ˆSVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ ç”»åƒï¼ˆTIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web ページ
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ テキスト
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ ムービー(MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ ムービー(MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ ムービー(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ ムービー(Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ ムービー(Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ ムービー(AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
new file mode 100644
index 0000000000..0ec1030113
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web コンテンツ
+ </label>
+ <tooltip name="web_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ Web コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™
+ </tooltip>
+ <playtip name="web_playtip">
+ Web コンテンツを表示ã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ ムービー
+ </label>
+ <tooltip name="movie_tooltip">
+ ã“ã“ã«ã¯ãƒ ãƒ¼ãƒ“ーãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="movie_playtip">
+ ムービーをå†ç”Ÿã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ ç”»åƒ
+ </label>
+ <tooltip name="image_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ç”»åƒãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="image_playtip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ç”»åƒã‚’表示ã™ã‚‹
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ オーディオ
+ </label>
+ <tooltip name="audio_tooltip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ã¯ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãŒã‚りã¾ã™
+ </tooltip>
+ <playtip name="audio_playtip">
+ ã“ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’å†ç”Ÿã™ã‚‹
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ リアルタイム・ストリーミング
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - ãªã— -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - ãªã— -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ オーディオ
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ ビデオ
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ ç”»åƒ
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ ムービー(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg オーディオ・ビデオ
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF ドキュメント
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript ドキュメント
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ リッãƒãƒ†ã‚­ã‚¹ãƒˆï¼ˆRTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web ページ(XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ マクロメディアディレクター
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ オーディオ(MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ オーディオ(MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ オーディオ(AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ オーディオ(WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ ç”»åƒï¼ˆBMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ ç”»åƒï¼ˆGIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ ç”»åƒï¼ˆJPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ ç”»åƒï¼ˆPNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ ç”»åƒï¼ˆSVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ ç”»åƒï¼ˆTIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web ページ
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ テキスト
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ ムービー(MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ ムービー(MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ ムービー(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ ムービー(Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ ムービー(Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ ムービー(AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 4d067d2823..f4c46f82ac 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -9,79 +9,49 @@
<global name="implicitclosebutton">
é–‰ã˜ã‚‹
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="䏿˜Žãªè­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert">
- ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€
-今å—ã‘å–ã£ãŸè­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-
-エラー詳細: 「[_NAME]ã€ã¨ã„ã†è­¦å‘Šã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="䏿˜Žã®é€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert">
+ ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸé€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
+
+エラー詳細: 「 [_NAME] ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
- フロータ・エラー:下記ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š
+ フロータエラー:下記ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š
[CONTROLS]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -97,13 +67,13 @@
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/>
</notification>
<notification name="BadInstallation">
- [APP_NAME] をアップデート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã•ã„。
+ [APP_NAME] をアップデート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ビューワ㮠[http://get.secondlife.com 最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロード] ã—ã¦ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続ãŒç¢ºç«‹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ [SECOND_LIFE_GRID] ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
「[DIAGNOSTIC]ã€
-ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。
+インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ­£å¸¸ã‹ã”確èªãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -111,43 +81,50 @@
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
- ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨ã®è¡£é¡žã€èº«ä½“部ä½ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
</notification>
<notification name="CompileQueueSaveText">
- 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
+後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CompileQueueSaveBytecode">
- 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
+後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="WriteAnimationFail">
ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="UploadAuctionSnapshotFail">
- 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]
+ 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
</notification>
<notification name="UnableToViewContentsMoreThanOne">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’表示ã§ãã¾ã›ã‚“。
+アイテムを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="SaveClothingBodyChanges">
- è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ è¡£æœã€èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å­˜"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨­å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="ã¯ã„"/>
+ </notification>
<notification name="GrantModifyRights">
- ä»–ã®ä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„ã‚‹
-ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。
-[FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
+ 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+[FIRST_NAME] [LAST_NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- 変更権é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒä½œæˆã—ãŸå…¨ã¦ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã«ã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。
-é¸æŠžã—ãŸä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
+ 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+é¸æŠžã—ãŸä½äººã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRights">
- [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
+ [FIRST_NAME] [LAST_NAME] ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -169,28 +146,27 @@
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AddGroupOwnerWarning">
- ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ [ROLE_NAME] ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€
-彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。
+役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="オーナーã®å½¹å‰²ã«ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã‚’加ãˆã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="グループオーナーを新ã—ã追加ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="AssignDangerousActionWarning">
- ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’
+ ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
*警告*
ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€
自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€
-自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«
-任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰
-実行ã—ã¦ãã ã•ã„。
+自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰å®Ÿè¡Œã—ã¦ãã ã•ã„。
-ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
+ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="AssignDangerousAbilityWarning">
- ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’
+ ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
*警告*
@@ -198,135 +174,99 @@
自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€
自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚
-ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
+ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
- <notification name="ClickPublishHelpLand">
- 「検索ã§å…¬é–‹ã€ã‚’é¸æŠž
-ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨è¡¨ç¤ºï¼š
-- æ¤œç´¢çµæžœã«ãŠã‘ã‚‹ã“ã®åŒºç”»
-- ã“ã®åŒºç”»ã®ãƒ‘ブリック・オブジェクト
-- ウェブ検索ã«ãŠã‘ã‚‹ã“ã®åŒºç”»
- </notification>
- <notification name="ClickSoundHelpLand">
- メディアã¨éŸ³æ¥½ã¯ã“ã®åŒºç”»å†…ã§ã®ã¿ãŠæ¥½ã—ã¿ã„ãŸã ã‘ã¾ã™ã€‚ サウンドã¨ãƒœã‚¤ã‚¹ã¯åŒºç”»å†…é™å®šã‹ã€å„自ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã£ã¦ã¯åŒºç”»å¤–ã§ã‚‚èžãã“ã¨ãŒã§ãã¾ã™ã€‚ ナレッジベースを開ã„ã¦è¨­å®šã®ä»•方を学ã³ã¾ã™ã‹ï¼Ÿ
- <url name="url">
- http://wiki.secondlife.com/wiki/区画上ã®ãƒ¡ãƒ‡ã‚£ã‚¢_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
- </notification>
- <notification name="ClickSearchHelpAll">
- æ¤œç´¢çµæžœã¯ä»Šè¦‹ã¦ã„るタブã€ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã€é¸æŠžã—ãŸã‚«ãƒ†ã‚´ãƒªãã®ä»–ã‚’å…ƒã«ç·¨æˆã•れã¦ã„ã¾ã™ã€‚ 詳細ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
- <url name="url">
- http://wiki.secondlife.com/wiki/検索ã«é–¢ã™ã‚‹ã‚ˆãã‚る質å•集_(KB)
- </url>
- <usetemplate name="okcancelbuttons" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- ã“ã®åŒºç”»ã¯æ¤œç´¢ã‚’ç¦ãšã‚‹åœ°åŸŸã«ã‚ã‚‹ãŸã‚ã€
-ã“ã®åŒºç”»ã‚’検索ã«è¡¨ç¤ºã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </notification>
- <notification name="ClickPublishHelpAvatar">
- 「検索ã«è¡¨ç¤ºã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤ºï¼š
-- æ¤œç´¢çµæžœã«ãŠã‘る自分ã®ãƒ—ロフィール
-- 公開グループ・ページã«ãŠã‘る自分ã®ãƒ—ロフィールã¸ã®ãƒªãƒ³ã‚¯
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- [SECOND_LIFE]ã®ã‚¦ã‚§ãƒ–・サイトã‹ã‚‰ã€
-ä»–ã®ä½äººã¸ã®ãƒ—ロãƒãƒ¼ã‚ºã€ãƒ‘ートナー解消手続ããŒã§ãã¾ã™ã€‚
-
-ウェブ・サイトã«è¡Œã£ã¦ パートナーã«é–¢ã™ã‚‹æƒ…報をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- ã‚ãªãŸã®æŒã¤ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯å¤ã„地域ã§ã¯ä½¿ãˆã¾ã›ã‚“。
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- ã“ã®ä½äººãŒã‚¦ã‚§ãƒ–・プロフィールURLを設定ã—ã¦ã„ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
- * 「ロードã€ã‚’クリックã—ã€ã“ã®ã‚¦ã‚§ãƒ–・タブ内ã§ãƒšãƒ¼ã‚¸ã‚’表示
- * 「ロードã€ï¼žã€Œå¤–部ブラウザ〠をクリックã—ã€ãƒ‡ã‚£ãƒ•ォルトã®ã‚¦ã‚§ãƒ–・ブラウザã§ãƒšãƒ¼ã‚¸ã‚’表示
- * 「ロードã€ï¼žã€Œãƒ›ãƒ¼ãƒ URL〠をクリックã—ã€ä»–ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ã“ã®ä½äººã®ã‚¦ã‚§ãƒ–ãƒ»ãƒ—ãƒ­ãƒ•ã‚£ãƒ¼ãƒ«ã«æˆ»ã‚‹
-
-自分ã®ãƒ—ロフィールã«ä»»æ„ã®URLを入力ã—OKをクリックã—ã¦ã€ã‚¦ã‚§ãƒ–・プロフィールã¨ã—ã¦è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-ãれを見ãŸä»–ã®ä½äººãŒãã®ã‚µã‚¤ãƒˆã‚’訪れるã“ã¨ãŒã§ãã¾ã™ã€‚
+ <notification name="AttachmentDrop">
+ アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«ç½®ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="JoinGroupCanAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã«ã¯ã€L$ [COST] ã‹ã‹ã‚Šã¾ã™ã€‚
続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚加"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ [NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="å‚加"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚
-L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$ [COST] å¿…è¦ã§ã™ã€‚
+L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="CreateGroupCost">
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$ 100 ã‹ã‹ã‚Šã¾ã™ã€‚
+一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚
+48 時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。
+ <usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/>
</notification>
<notification name="LandBuyPass">
- L$[COST]ã§ [TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ L$ [COST] ã§ [TIME] 時間 [PARCEL_NAME] ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
入場許å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SalePriceRestriction">
ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€
-売å´ä¾¡æ ¼ã¯L$0以上ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-売å´ä¾¡æ ¼ã‚’L$0ã«è¨­å®šã™ã‚‹å ´åˆã¯ã€
+売å´ä¾¡æ ¼ã¯L$ 0 以上ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+売å´ä¾¡æ ¼ã‚’L$ 0 ã«è¨­å®šã™ã‚‹å ´åˆã¯ã€
売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="ConfirmLandSaleChange">
- é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
+ é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+売å´ä¾¡æ ¼ L$ [SALE_PRICE] ã§ã€[NAME] ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- 注:「誰ã«ã§ã‚‚売å´ã™ã‚‹ã€ã‚’クリックã™ã‚‹ã¨ã€
-ã‚ãªãŸã®åœŸåœ°ã¯[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã©ã“ã‹ã‚‰ã§ã‚‚
-(ã“ã®åœ°åŸŸã«ãªã„コミュニティをå«ã‚€ï¼‰è³¼å…¥ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+ 注æ„: 「誰ã«ã§ã‚‚販売ã€ã‚’クリックã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®åœŸåœ°ã¯ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人ã«é™ã‚‰ãš [SECOND_LIFE] コミュニティ全体ã§åˆ©ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
-é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€
-売り出ã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
+é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€è²©å£²å¯¾è±¡ã«è¨­å®šã•れã¾ã—ãŸã€‚
+販売価格 L$ [SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
- ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedByUser">
ã“ã®åŒºç”»ã§ã€
-ä½äºº[NAME]ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
-å½¼ã‚‰ã®æŒã¡ç‰©ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
+ä½äºº [NAME] ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
+本人ã®ã€ŒæŒã¡ç‰©ã€ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ã‚ãªãŸã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByUser">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€
-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸè­²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚
+[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
@@ -335,37 +275,42 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisableAllTopObjects">
- ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
- ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME]
-ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ— [NAME] ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトを所有者ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="UnableToDisableOutsideScripts">
スクリプトを無効ã«ã§ãã¾ã›ã‚“。
-ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
武器を使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
+ <notification name="MultipleFacesSelected">
+ ç¾åœ¨è¤‡æ•°ã®é¢ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
+ã“ã®ã¾ã¾ç¶šã‘ãŸå ´åˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®åˆ¥ã€…ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒã‚ªãƒ–ジェクトã®è¤‡æ•°ã®é¢ã«è¨­å®šã•れã¾ã™ã€‚
+メディアを 1 ã¤ã®é¢ã ã‘ã«å–り付ã‘ã‚‹ã«ã¯ã€ã€Œé¢ã‚’é¸æŠžã€ã‚’é¸ã‚“ã§ã‚ªãƒ–ジェクトã®å¸Œæœ›ã™ã‚‹é¢ã‚’クリックã€ãれã‹ã‚‰ã€Œè¿½åŠ ã€ã‚’クリックã—ã¦ãã ã•ã„。
+ <usetemplate ignoretext="メディアãŒé¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れるã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã«
ç«‹ã£ã¦ãã ã•ã„。
</notification>
<notification name="PromptRecipientEmail">
- å—ä¿¡è€…ã®æœ‰åйãªEメールアドレスを入力ã—ã¦ãã ã•ã„。
+ å—ä¿¡è€…ã®æœ‰åйãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptSelfEmail">
- ã‚ãªãŸã®Eメール・アドレスを入力ã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptMissingSubjMsg">
デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ErrorProcessingSnapshot">
- スナップショット・データã®å‡¦ç†ã‚¨ãƒ©ãƒ¼
+ スナップショットデータã®å‡¦ç†ã‚¨ãƒ©ãƒ¼
</notification>
<notification name="ErrorEncodingSnapshot">
スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼
@@ -380,11 +325,15 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。
</notification>
<notification name="CouldNotPutOnOutfit">
- æœè£…を装ç€ã§ãã¾ã›ã‚“。
-æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚りã¾ã›ã‚“。
+ アウトフィットを装ç€ã§ãã¾ã›ã‚“。
+アウトフィットフォルダã«è¡£é¡žã€èº«ä½“部ä½ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="CannotWearTrash">
- ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。
+ ã”ã¿ç®±ã«ã‚る衣類や身体部ä½ã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ オブジェクトを付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚
+最大数㮠[MAX_ATTACHMENTS] 個を越ãˆã¦ã„ã¾ã™ã€‚ ã©ã‚Œã‹å–り外ã—ã¦ã‹ã‚‰ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CannotWearInfoNotComplete">
ã¾ã èª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。
@@ -394,33 +343,45 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=ja-JP
+ </url>
<usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
</notification>
<notification name="AddClassified">
- 検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイドã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€
-クラシファイド広告ãŒ1週間掲載ã•れã¾ã™ã€‚
-広告を記入後ã€ã€Œå…¬é–‹ã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«
-追加ã—ã¾ã™ã€‚
-「公開ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚
-å¤šãæ‰•ã†ã»ã©ã€åºƒå‘ŠãŒã‚¯ãƒ©ã‚·ãƒ•ァイド・リストã¨ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢
-ã®ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚
- <usetemplate ignoretext="æ–°ã—ã„クラシファイド広告を加ãˆã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイド広告ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•れã¾ã™ã€‚
+広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。
+「掲載ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•ã„ãŸã„金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚
+支払金é¡ãŒå¤šã„ã»ã©ã‚ãªãŸã®åºƒå‘Šã¯ä¸€è¦§ã¨ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢ã§ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚
+ <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
- クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ
+ クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ ã“ã®é¢ã«ã‚るメディアを削除ã™ã‚‹é¸æŠžã‚’ã—ã¾ã—ãŸã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ </notification>
<notification name="ClassifiedSave">
- クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ クラシファイド広告 [NAME] ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ クラシファイド広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ
+ ピック「 [PICK] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
- [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ
+ [SECOND_LIFE] イベント Web ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ
+ <url name="url">
+ http://secondlife.com/events/?lang=ja-JP
+ </url>
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -429,29 +390,24 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<notification name="SelectHistoryItemToView">
表示ã™ã‚‹å±¥æ­´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
- <notification name="ResetShowNextTimeDialogs">
- ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’å†åº¦æœ‰åŠ¹åŒ–ã—ã¾ã™ã‹ï¼Ÿï¼ˆä»¥å‰ã€Œä»Šå¾Œã¯è¡¨ç¤ºã—ãªã„ã€ã¨æŒ‡å®šã—ã¦ã„ã¾ã™ï¼‰
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- スキップå¯èƒ½ãªãƒãƒƒãƒ—アップ全ã¦ã‚’無効化ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
<notification name="CacheWillClear">
- [APP_NAME]ã®å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
+ [APP_NAME] ã‚’å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
</notification>
<notification name="CacheWillBeMoved">
- [APP_NAME]ã®å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒç§»å‹•ã•れã¾ã™ã€‚
-注æ„:ã“れã«ã‚ˆã‚Šã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
+ [APP_NAME] ã‚’å†èµ·å‹•後ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒç§»å‹•ã•れã¾ã™ã€‚
+ã”æ³¨æ„: キャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚
</notification>
<notification name="ChangeConnectionPort">
- ãƒãƒ¼ãƒˆã®è¨­å®šã¯ã€[APP_NAME]ã®å†èµ·å‹•å¾Œã«æœ‰åйã«ãªã‚Šã¾ã™ã€‚
+ ãƒãƒ¼ãƒˆã®è¨­å®šã¯ [APP_NAME] ã‚’å†èµ·å‹•後ã«å映ã•れã¾ã™ã€‚
</notification>
<notification name="ChangeSkin">
- æ–°ã—ã„スキンã¯[APP_NAME]ã‚’å†èµ·å‹•ã™ã‚‹ã¨ç¾ã‚Œã¾ã™
+ æ–°ã—ã„スキン㯠[APP_NAME] ã‚’å†èµ·å‹•後ã«è¡¨ç¤ºã•れã¾ã™ã€‚
</notification>
<notification name="GoToAuctionPage">
- [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入札ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
+ [SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœ­ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SaveChanges">
@@ -496,6 +452,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<notification name="SaveBytecodeFailReason">
次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å­˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
+ <notification name="StartRegionEmpty">
+ ログインä½ç½®ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。
+ログインä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œãƒ›ãƒ¼ãƒ ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ­¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚¹ã‚¯ãƒªãƒ—ãƒˆãŒæ ¼ç´ã•れã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
@@ -504,46 +465,38 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ファイルをダウンロードã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotWriteFile">
- ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。
+ ファイル [[FILE]] を書ãè¾¼ã‚ã¾ã›ã‚“。
</notification>
<notification name="UnsupportedHardware">
- 警告: ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ã¯ [APP_NAME] を使用ã™ã‚‹ãŸã‚ã«å¿…è¦ãªå¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
-[APP_NAME] ã‚’ã“ã®ã¾ã¾ã”使用ã«ãªã‚‹ã¨ã€ä¸å分ãªãƒ‘フォーマンスã—ã‹å¾—られãªã„ãŠãれãŒã‚りã¾ã™ã€‚
-ã¾ãŸã€ã‚µãƒãƒ¼ãƒˆå¤–ã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã§ã”使用ã®å ´åˆã€ãƒ†ã‚¯ãƒ‹ã‚«ãƒ«ã‚µãƒãƒ¼ãƒˆã‚’ã”利用ã„ãŸã ãã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューター㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 パフォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。
- å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶
-[_URL] ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ã•らã«è©³ã—ã„æƒ…報をã”覧ã«ãªã‚Šã¾ã™ã‹ï¼Ÿ
+最低動作環境
+[_URL] ã«ç§»å‹•ã—ã¦ç¢ºèªã‚’ã—ã¾ã™ã‹ï¼Ÿ
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=ja
</url>
- <usetemplate ignoretext="サãƒãƒ¼ãƒˆå¤–ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºæ™‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="使用中ã®ã‚³ãƒ³ãƒ”ューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="UnknownGPU">
- ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾æ™‚点ã§ã¯ä¸æ˜Žãªã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
-ã“れã¯ã€å½“社ã«ã‚ˆã‚‹å‹•作テストãŒè¡Œã‚れã¦ã„ãªã„æ–°ã—ã„ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒä½¿ç”¨ã•れã¦ã„ã‚‹å ´åˆãŒã»ã¨ã‚“ã©ã§ã™ã€‚
-[APP_NAME] ã¯ã»ã¼é–“é•ã„ãªã正常ã«å‹•作ã—ã¾ã™ãŒã€
-å¿…è¦ã«å¿œã˜ãŸã‚°ãƒ©ãƒ•ィック設定ã®èª¿æ•´ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚
-(「編集ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ï¼žã€Œè¡¨ç¤ºã€ï¼‰
+ ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè­˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
+[APP_NAME] ã§ã¾ã ãƒ†ã‚¹ãƒˆã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•題ãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ィックã®è¨­å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+(ミー > 環境設定 > グラフィック)
<form name="form">
- <ignore name="ignore" text="䏿˜Žãªã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã®æ¤œå‡ºæ™‚"/>
+ <ignore name="ignore" text="使用中ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè­˜ã•れãªã„ã¨ã"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] ã¯ã€
-グラフィック・ドライãƒã®åˆæœŸåŒ–中ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚
-一般的ãªãƒ‰ãƒ©ã‚¤ãƒãƒ»ã‚¨ãƒ©ãƒ¼ã‚’回é¿ã™ã‚‹ãŸã‚ã€ã€Œå“質ãŠã‚ˆã³ãƒ‘フォーマンスã€ã¯ã€Œä½Žã€ã«è¨­å®šã•れã¾ã™ã€‚
-ã“れã«ã‚ˆã‚Šã€ã„ãã¤ã‹ã®ã‚°ãƒ©ãƒ•ィックス機能ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚
-グラフィックカード・ドライãƒã®ã‚¢ãƒƒãƒ—デートをãŠå‹§ã‚ã—ã¾ã™ã€‚
-「グラフィックã®å“質ã€ã¯ã€Œç’°å¢ƒè¨­å®šã€ï¼žã€Œè¡¨ç¤ºã€ã‹ã‚‰ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ グラフィックドライãƒã‚’åˆæœŸåŒ–中㫠[APP_NAME] ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚
+ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ç”»è³ªãŒä½Žã«è¨­å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚
+ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィックカードã®ãƒ‰ãƒ©ã‚¤ãƒã‚’アップデートã™ã‚‹ã‚ˆã†ãŠã™ã™ã‚ã—ã¾ã™ã€‚
+画質ã¯ã€ç’°å¢ƒè¨­å®š > グラフィック ã§è¨­å®šã§ãã¾ã™ã€‚
</notification>
<notification name="RegionNoTerraforming">
- ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ォーミングãŒã§ãã¾ã›ã‚“。
+ [REGION] ã§ã¯ã€åœ°å½¢ã®å¤‰æ›´ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotCopyWarning">
- ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを
-許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’ã‚‹ã¨
-æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ 本当ã«
-ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’ã‚‹ã¨ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰ãªããªã‚Šã¾ã™ã€‚
+本当ã«ã“れを渡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CannotGiveItem">
@@ -553,34 +506,32 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
å–引ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
</notification>
<notification name="TooManyItems">
- 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。
+ 一度㫠42 個以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯æ¸¡ã›ã¾ã›ã‚“。
</notification>
<notification name="NoItems">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã§ãる権é™ãŒã‚りã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="CannotCopyCountItems">
- ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを
-許ã•れã¦ã„ã¾ã›ã‚“。
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚
-本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã¯é¸æŠžã—㟠[COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã®ã‚³ãƒ”ーを許ã•れã¦ã„ã¾ã›ã‚“。
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚
+本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã—ãŸã„ã§ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CannotGiveCategory">
- é¸æŠžã—ãŸãƒ•ォルダを譲渡ã§ãる権é™ãŒã‚りã¾ã›ã‚“
+ é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“
</notification>
<notification name="FreezeAvatar">
ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
-ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€
-ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/>
+ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆã‚’å«ã‚インワールドã§ä½•ã‚‚ã§ããªããªã‚Šã¾ã™ã€‚
+ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
<notification name="FreezeAvatarFullname">
[AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ
フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
<notification name="EjectAvatarFullname">
- ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ­¢" yestext="追放"/>
</notification>
<notification name="EjectAvatarNoBan">
@@ -591,48 +542,51 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ [GROUP_NAME] ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã—ãŸ
+ </notification>
<notification name="AcquireErrorTooManyObjects">
å–å¾—ã‚¨ãƒ©ãƒ¼ï¼šé¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚
</notification>
<notification name="AcquireErrorObjectSpan">
å–得エラー:
-オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
-å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€
-ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。
+オブジェクトãŒè¤‡æ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã¾ãŸãŒã£ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
+ã™ã¹ã¦åŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã«ç§»å‹•ã•ã›ã¦ã‹ã‚‰å–å¾—ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-[_URL]ã«ç§»å‹•ã—ã¦è²¨å¹£è³¼å…¥ã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
+[_URL] ã«ç§»å‹•ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«è³¼å…¥ã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=ja-JP
+ </url>
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
- ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。
-最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ [COUNT] 個ã®ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
+リンクã§ãã‚‹ã®ã¯æœ€å¤§ [MAX] 個ã§ã™ã€‚
</notification>
<notification name="CannotLinkIncompleteSet">
- セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数ã®
-ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ ã‚»ãƒƒãƒˆã§æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚
+複数ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotLinkModify">
- ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ­£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚ã€
-リンクã§ãã¾ã›ã‚“。
+ ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£è¨±å¯ãŒãªã„ãŸã‚リンクã§ãã¾ã›ã‚“。
-オブジェクトãŒã™ã¹ã¦ãƒ­ãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
+ã©ã®ã‚ªãƒ–ジェクトもロックã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotLinkDifferentOwners">
- 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを
-リンクã§ãã¾ã›ã‚“。
+ 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="NoFileExtension">
- ファイル「[FILE]ã€ã®æ‹¡å¼µå­ãŒç„¡åйã§ã™ã€‚
+ 「 [FILE] ã€ã®æ‹¡å¼µå­ãŒç„¡åйã§ã™ã€‚
ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ãŒæ­£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。
</notification>
<notification name="InvalidFileExtension">
- ファイル拡張å­[EXTENSION]ã¯ç„¡åйã§ã™
+ [EXTENSION]ã¯ç„¡åйã§ã™ã€‚
æ­£ã—ã„æ‹¡å¼µå­ï¼š[VALIDS]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -641,11 +595,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[FILE]
</notification>
<notification name="SoundFileNotRIFF">
- ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
+ RIFF WAVE ファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileNotPCM">
- ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
+ PCM WAVE オーディオファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileInvalidChannelCount">
@@ -653,31 +607,31 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[FILE]
</notification>
<notification name="SoundFileInvalidSampleRate">
- ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
+ ファイルã®ã‚µãƒ³ãƒ—ルレートãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(44.1k ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
[FILE]
</notification>
<notification name="SoundFileInvalidWordSize">
- ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
+ ファイルã®ãƒ¯ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(8 ã¾ãŸã¯ 16 ビットã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
[FILE]
</notification>
<notification name="SoundFileInvalidHeader">
- WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
+ WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileInvalidTooLong">
- オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒):
+ オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒):
[FILE]
</notification>
<notification name="ProblemWithFile">
- ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚
+ 「 [FILE] ã€ã«å•題ãŒã‚りã¾ã™ã€‚
[ERROR]
</notification>
<notification name="CannotOpenTemporarySoundFile">
- 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE]
+ 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンドファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE]
</notification>
<notification name="UnknownVorbisEncodeFailure">
- 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE]
+ 䏿˜Žã® Vorbis ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—: [FILE]
</notification>
<notification name="CannotEncodeFile">
次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE]
@@ -686,55 +640,62 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE]
</notification>
<notification name="UnknownResourceFileVersion">
- 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE]
+ 䏿˜Žã®ãƒªãƒ³ãƒ‡ãƒ³ãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE]
</notification>
<notification name="UnableToCreateOutputFile">
- æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
+ 出力ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- アニメーションファイルã®ãƒãƒ«ã‚¯ã‚¢ãƒƒãƒ—ロードã¯ç¾åœ¨ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
+ ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ロードã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotUploadReason">
- 次ã®ç†ç”±ã§ã€[FILE] をアップロードã§ãã¾ã›ã‚“: [REASON]
+ 次ã®ç†ç”±ã§ã€ã€Œ [FILE] ã€ã‚’アップロードã§ãã¾ã›ã‚“: [REASON]
ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
+ <notification name="LandmarkCreated">
+ 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ ç¾åœ¨åœ°ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
- åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€
-ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotRecompileSelectObjectsNoScripts">
- å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ 「リコンパイルã€ã§ãã¾ã›ã‚“。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotRecompileSelectObjectsNoPermission">
- 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚
+ 「リコンパイルã€ã§ãã¾ã›ã‚“。
-変更修正権é™ã®ã‚ã‚‹
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+修正修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotResetSelectObjectsNoScripts">
- 「å†è¨­å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotResetSelectObjectsNoPermission">
- 「å†è¨­å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-変更修正権é™ã®ã‚ã‚‹
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ 修正権é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
- スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨­å®šãŒã§ãã¾ã›ã‚“。
+ スクリプトã®ã€Œå®Ÿè¡Œã€ãŒã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotSetRunningNotSelectObjectsNoScripts">
- スクリプトを「実行ã—ãªã„ã€ã«è¨­å®šã§ãã¾ã›ã‚“。
+ スクリプトを「実行ã—ãªã„ã€è¨­å®šã«ã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="NoFrontmostFloater">
- ä¿å­˜ã™ã¹ãfrontmostフロータãŒã‚りã¾ã›ã‚“。
+ ä¿å­˜ã™ã‚‹ frontmost フロータãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="SeachFilteredOnShortWords">
指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸ­ã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚
@@ -749,43 +710,43 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[REASON]
</notification>
<notification name="invalid_tport">
- テレãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ãç¶šã表示ã•れる場åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。
+ テレãƒãƒ¼ãƒˆå‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</notification>
<notification name="invalid_region_handoff">
- 地域間ã®ç§»å‹•ã®å‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚地域間を移動ã™ã‚‹ã«ã¯ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ãç¶šã表示ã•れる場åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。
+ リージョン間ã®ç§»å‹•中ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</notification>
<notification name="blocked_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
-やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ãれã§ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
</notification>
<notification name="nolandmark_tport">
- 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。ランドマークã®ç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="timeout_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã«ã‚ˆã‚‹ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šãŒå®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="noaccess_tport">
- 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。
+ 残念ãªãŒã‚‰ã€ç›®çš„地ã¸ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“。
</notification>
<notification name="missing_attach_tport">
- 添付物ã¯ã€ã¾ã åˆ°ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。
+ 添付物ãŒã¾ã å±Šã„ã¦ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã‚’ã™ã‚‹å‰ã«ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
</notification>
<notification name="too_many_uploads_tport">
- ã“ã®åœ°åŸŸã®è³‡ç”£ã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
-数分後ã«ã‚„り直ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¢ã‚»ãƒƒãƒˆã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨æ··ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ãã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
+数分後ã«ã‚„り直ã™ã‹ã€æ··é›‘ã—ã¦ã„ãªã„ä»–ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="expired_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="expired_region_handoff">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³é–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="no_host">
- テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="no_inventory_host">
æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
@@ -795,15 +756,12 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotSetLandOwnerMultipleRegions">
- 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€
-åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。
+é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ForceOwnerAuctionWarning">
- ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã•れã¦ã„ã¾ã™ã€‚
-åŒºç”»ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ãŒç„¡åйã«ãªã‚Šã€
-入札ãŒé–‹å§‹ã—ã¦ã„ãŸã‚‰ä¸æº€ã«æ€ã†ä½äººãŒå‡ºã¦ãã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
-所有権をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºã•れã¦ã„ã¾ã™ã€‚ 所有権を変更ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã¨ãªã‚Šã€æ—¢ã«ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‚加ã—ã¦ã„ã‚‹ä½äººãŒã„れã°ãã®äººã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã„ã¾ã™ã€‚
+所有権を変更ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -815,12 +773,12 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandNothingSelected">
- 土地を破棄ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“:
+ 土地を破棄ã§ãã¾ã›ã‚“:
区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandNoRegion">
土地を破棄ã§ãã¾ã›ã‚“:
-地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+リージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotBuyLandNothingSelected">
土地を購入ã§ãã¾ã›ã‚“:
@@ -828,11 +786,10 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotBuyLandNoRegion">
土地を購入ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ã“ã®åœŸåœ°ãŒã‚るリージョンを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
</notification>
<notification name="CannotCloseFloaterBuyLand">
- [APP_NAME]ã«ã‚ˆã‚‹ã€
-ã“ã®å–引ã®è¦‹ç©ã‚ŠãŒå®Œäº†ã™ã‚‹ã¾ã§ã€ŒåœŸåœ°ã‚’購入ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ [APP_NAME] ãŒã“ã®å–引価格を見ç©ã‚‚ã‚‹ã¾ã§ã¯ã€åœŸåœ°ã®è³¼å…¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotDeedLandNothingSelected">
土地を譲渡ã§ãã¾ã›ã‚“:
@@ -844,21 +801,13 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotDeedLandNoRegion">
土地を譲渡ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotDeedLandMultipleSelected">
土地を譲渡ã§ãã¾ã›ã‚“:
複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ParcelCanPlayMedia">
- ã“ã“ã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚
-メディアã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã«ã¯ã€é«˜é€Ÿãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šç’°å¢ƒãŒå¿…è¦ã§ã™ã€‚
-
-利用å¯èƒ½ã«ãªã£ãŸã‚‰å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ
-(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨­å®šã€ï¼žã€ŒéŸ³å£°ã¨ãƒ“デオã€ã§å¾Œã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ï¼‰
- <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/>
+区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotDeedLandWaitingForServer">
土地を譲渡ã§ãã¾ã›ã‚“:
@@ -868,7 +817,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotDeedLandNoTransfer">
土地を譲渡ã§ãã¾ã›ã‚“:
-ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
+[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandWatingForServer">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -878,9 +827,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotReleaseLandSelected">
土地を破棄ã§ãã¾ã›ã‚“:
-ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。
+ã‚ãªãŸã¯ã€é¸æŠžã—ãŸåŒºç”»ã®ã™ã¹ã¦ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。
-1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotReleaseLandDontOwn">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -888,12 +837,12 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- 土地を破棄ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ 土地を放棄ã§ãã¾ã›ã‚“:
+ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandNoTransfer">
土地を破棄ã§ãã¾ã›ã‚“:
-ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
+[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandPartialSelection">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -902,9 +851,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。
</notification>
<notification name="ReleaseLandWarning">
- ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’破棄ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ã€[AREA] 平方メートルã®åœŸåœ°ã‚’破棄ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
ã“ã®åŒºç”»ã‚’破棄ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€
-L$ã¯è¿”金ã•れã¾ã›ã‚“。
+L$ ã¯è¿”金ã•れã¾ã›ã‚“。
土地を破棄ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
@@ -921,7 +870,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="LandDivideWarning">
- ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚
+ ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2 ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚
区画ã”ã¨ã®è¨­å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨­å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚
土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
@@ -929,11 +878,11 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
</notification>
<notification name="CannotDivideLandNoRegion">
土地を分割ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotJoinLandNoRegion">
土地を統åˆã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ã“ã®åœŸåœ°ãŒã‚るリージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotJoinLandNothingSelected">
土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
@@ -941,35 +890,23 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
土地を統åˆã§ãã¾ã›ã‚“:
-1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+区画㌠1 ã¤ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotJoinLandSelection">
土地を統åˆã§ãã¾ã›ã‚“:
-1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+区画を 1 ã¤ä»¥ä¸Šé¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="JoinLandWarning">
- ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹
-å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•れã¾ã™ã€‚
+ ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦ã€å¤§ããªåŒºç”»ãŒ 1 ã¤ä½œæˆã•れã¾ã™ã€‚
æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
土地を統åˆã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- オーナーを表示:
-区画ã«è‰²ã‚’付ã‘ã¦ã‚ªãƒ¼ãƒŠãƒ¼ã®ç¨®é¡žã‚’表示
-
-ç·‘ = ã‚ãªãŸã®åœŸåœ°
-アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地
-赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ°
-黄色 = 売り出ã—中
-紫 = オークション
-グレー = パブリック
- </notification>
<notification name="ConfirmNotecardSave">
ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å­˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
@@ -979,7 +916,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/>
</notification>
<notification name="ResolutionSwitchFail">
- è§£åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ è§£åƒåº¦ã‚’ [RESX]x[RESY] ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ErrorUndefinedGrasses">
ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES]
@@ -988,48 +925,42 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES]
</notification>
<notification name="CannotSaveWearableOutOfSpace">
- 「[NAME]ã€ã‚’æœã®ãƒ•ァイルã«ä¿å­˜ã§ãã¾ã›ã‚“。 コンピューターã®
-ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦
-ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。
+ 「 [NAME] ã€ã‚’衣類ã®ãƒ•ァイルã«ä¿å­˜ã§ãã¾ã›ã‚“。
+コンピューターã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’å°‘ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。
</notification>
<notification name="CannotSaveToAssetStore">
- [NAME]を中央資産格ç´åº«ã«ä¿å­˜ã§ãã¾ã›ã‚“。
-ã“れã¯ä¸€æ™‚çš„ãªä¸å…·åˆã§ã™ã€‚
-æœé£¾å“ãªã©ã‚’カスタマイズã—ã€æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦ä¿å­˜ã—ã¦ãã ã•ã„。
+ 「 [NAME] ã€ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。
+通常ã“れã¯ä¸€æ™‚çš„ãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ 数分後ã«ã‚‚ã†ä¸€åº¦ç€ç”¨ç‰©ã‚’カスタマイズ・ä¿å­˜ã—ã¦ãã ã•ã„。
</notification>
<notification name="YouHaveBeenLoggedOut">
- ã‚ãªãŸã¯[SECOND_LIFE]ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã—ãŸã€‚
+ ã—ã¾ã£ãŸã€ [SECOND_LIFE] ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚
[MESSAGE]
-「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示ã€ã‚’クリックã™ã‚‹ã¨ã€
-ç¾åœ¨ã‚ã‚‹IMã¨ãƒãƒ£ãƒƒãƒˆã‚’確èªã§ãã¾ã™ã€‚
-確èªã—ãªã„å ´åˆã¯ã€Œçµ‚了ã€ã‚’クリックã—ã€
-ã™ãã«[APP_NAME]を終了ã—ã¦ãã ã•ã„。
<usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“:
ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
- <notification label="フレンドを追加" name="AddFriend">
- フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨­å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ <notification label="フレンド登録" name="AddFriend">
+ フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
[NAME] ã«ãƒ•レンドシップをé€ã‚Šã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
- <notification label="フレンドを追加" name="AddFriendWithMessage">
- フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨­å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ <notification label="フレンド登録" name="AddFriendWithMessage">
+ フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
-[NAME] ã«ãƒ•レンドシップã®ã‚ªãƒ•ァーをã—ã¾ã™ã‹ï¼Ÿ
+[NAME] ã«ãƒ•レンドシップを申ã—出ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãれã¾ã™ã‹ï¼Ÿ
+ フレンド登録ã—ã¦ãれã¾ã™ã‹ï¼Ÿ
</input>
<button name="Offer" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ [FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1038,160 +969,169 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
</notification>
<notification name="GodDeleteAllScriptedPublicObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ å†…ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GodDeleteAllScriptedObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GodDeleteAllObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプト・オブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—ト・オブジェクト)を
+所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプトオブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—トオブジェクト)を
ã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BlankClassifiedName">
- クラシファイドã«åå‰ã‚’指定ã—ã¦ãã ã•ã„。
+ クラシファイドã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
</notification>
<notification name="MinClassifiedPrice">
- åºƒå‘Šæ–™ã®æ”¯æ‰•ã„金é¡ã¯ã€Lã¨[MIN_PRICE]ãŒä¸‹é™ã§ã™ã€‚
+ åºƒå‘Šæ–™ã¯æœ€ä½Ž L$ [MIN_PRICE] å¿…è¦ã§ã™ã€‚
金é¡ã‚’増やã—ã¦ãã ã•ã„。
</notification>
<notification name="ConfirmObjectDeleteLock">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopy">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoOwn">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopy">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopyNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLock">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeNoOwn">
- å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
+ãã®ãŸã‚ã€å°†æ¥ã€ä¿®æ­£ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLockNoOwn">
- 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
+ãã®ãŸã‚ã€å°†æ¥ã€ç·¨é›†ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CantBuyLandAcrossMultipleRegions">
- 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。
+ 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。
é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="DeedLandToGroup">
ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
+ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—
-「[GROUP_NAME]ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—
+「 [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒ
-å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚
+ ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
ã“ã®è­²æ¸¡ã«ã‚ˆã‚Šã€
-「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰
+「 [FIRST_NAME] [LAST_NAME] ã€ã‹ã‚‰
グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•れã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。
-譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«ã¯è¿”金ã•れã¾ã›ã‚“。
+譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã€Œ [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
- -safeオプションを指定ã—ãŸã®ã§ã€
-表示設定ã¯ã‚»ãƒ¼ãƒ•・レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ -safe オプションを指定ã—ãŸã®ã§ã€
+表示設定ã¯ã‚»ãƒ¼ãƒ•レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="DisplaySetToRecommended">
- 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«
-基ã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
</notification>
- <notification name="AvatarMoved">
- ã‚ãªãŸãŒè¨ªã‚ŒãŸã„[TYPE]ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。 [HELP]
-è¿‘ãã®åœ°åŸŸã«ç§»å‹•ã—ã¾ã—ãŸã€‚
+ <notification name="AvatarMovedLast">
+ å‰å›žã„ãŸå ´æ‰€ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarMovedHome">
+ ホームロケーションã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
+æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’設定ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
</notification>
<notification name="ClothingLoading">
- ã‚ãªãŸã®æœã‚’ダウンロード中ã§ã™ã€‚
-通常ã©ãŠã‚Šã«[SECOND_LIFE]を使ãˆã€
-ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚‚ã‚ãªãŸã‚’正常ã«è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ ç¾åœ¨è¡£é¡žã‚’ダウンロード中ã§ã™ã€‚
+ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ­£ã—ã表示ã•れã¾ã™ã€‚
<form name="form">
- <ignore name="ignore" text="æœã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«é•·ã„時間ãŒã‹ã‹ã‚‹å ´åˆ"/>
+ <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã‚‹ã¨ã"/>
</form>
</notification>
<notification name="FirstRun">
- [APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚
+ [APP_NAME] ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚
-[SECOND_LIFE] ã®ä½¿ç”¨ãŒåˆã‚ã¦ã®æ–¹ã¯ã€
-ログインå‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒå¿…è¦ã§ã™ã€‚
-www.secondlife.comã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã„ã¾ã™ã‹ï¼Ÿ
+[SECOND_LIFE] を使ã£ãŸã“ã¨ãŒãªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã£ã¦ãã ã•ã„。
+[http://join.secondlife.com/?lang=ja-JP] ã§æ–°ã—ã„アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- 接続ã«å•題ãŒç”Ÿã˜ã¦ã„ã¾ã™ã€‚ ã‚ãªãŸã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã€ã¾ãŸã¯[SECOND_LIFE] サーãƒãƒ¼ã«å•題ãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ 接続ãŒãªã‹ãªã‹ã§ãã¾ã›ã‚“。 ãŠä½¿ã„ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‹ã€[SECOND_LIFE_GRID] ã®å•題ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
-インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦è©¦ã¿ã‚‹ã‹ã€ã€Œãƒ˜ãƒ«ãƒ—ã€ã‚’クリックã—ã¦å½“社ã®ã‚µãƒãƒ¼ãƒˆã‚µã‚¤ãƒˆã«æŽ¥ç¶šã—ã¦ãã ã•ã„。ã¾ãŸã¯ã€ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。
+インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ã‹ã‚‰æ•°åˆ†å¾Œã«å†æŽ¥ç¶šã™ã‚‹ã‹ã€ãƒ˜ãƒ«ãƒ—をクリックã—㦠[SUPPORT_SITE] ã‚’ã”覧ã«ãªã‚‹ã‹ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ç§»å‹•ã—ã¦ã¿ã¦ãã ã•ã„。
+ <url name="url">
+ http://jp.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="ヘルプ"/>
@@ -1202,8 +1142,8 @@ www.secondlife.comã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã„ã¾ã™ã
ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
矢å°ã‚­ãƒ¼ã‚’使用ã—ã¦æ­©ãã¾ã™ã€‚
-ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€
-F1キーを押ã—ã¦ãã ã•ã„。
+ヘルプãŒå¿…è¦ãªã¨ãã‚„ [SECOND_LIFE] ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€
+F1 キーを押ã—ã¦ãã ã•ã„。
男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。
ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
@@ -1212,35 +1152,31 @@ F1キーを押ã—ã¦ãã ã•ã„。
[NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚
</notification>
<notification name="GrantedModifyRights">
- ã‚ãªãŸã«ã¯ã€
-[FIRST_NAME] [LAST_NAME]
-ã®ã‚ªãƒ–ジェクトを修正ã™ã‚‹æ¨©é™ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚
+ [NAME] ã¯ã€ã‚ãªãŸã«ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’与ãˆã¾ã—ãŸã€‚
</notification>
<notification name="RevokedModifyRights">
- [FIRST_NAME] [LAST_NAME]
-ã®ã‚ªãƒ–ジェクトを修正ã™ã‚‹æ¨©é™ãŒå–り消ã•れã¾ã—ãŸã€‚
+ [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="FlushMapVisibilityCaches">
- ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã—ã¾ã™ã€‚
-ã“れãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚
-(作æˆä¸­ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«
-æ›´æ–°ã•れã¾ã™ï¼‰
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®åœ°å›³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã—ã¾ã™ã€‚
+デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚
+(作æˆä¸­ã¯ 5 分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyOneObjectOnly">
- 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ 一度㫠1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを買ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="OnlyCopyContentsOfSingleItem">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’コピーã§ãã¾ã›ã‚“。
+オブジェクトを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="KickUsersFromRegion">
- ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ã‚‹å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="EstateObjectReturn">
- [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ
+ [USER_NAME] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="InvalidTerrainBitDepth">
@@ -1251,17 +1187,16 @@ F1キーを押ã—ã¦ãã ã•ã„。
</notification>
<notification name="InvalidTerrainSize">
地域テクスãƒãƒ£ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
-地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚
+地形テクスãƒãƒ£ã€Œ [TEXTURE_NUM] ã€ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚
-テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
+「 [TEXTURE_NUM] ã€ã‚’ 24 ビット 512x512 ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
</notification>
<notification name="RawUploadStarted">
- アップロード開始。 接続速度ã«ã‚ˆã£ã¦ã¯ã€
-最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚
+ アップロードを開始ã—ã¾ã—ãŸã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ 2 分間ã‹ã‹ã‚Šã¾ã™ã€‚
</notification>
<notification name="ConfirmBakeTerrain">
ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸­å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚
+ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ãƒ»ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸­å¿ƒã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
@@ -1269,182 +1204,189 @@ F1キーを押ã—ã¦ãã ã•ã„。
許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="MaxBannedAgentsOnRegion">
- ç¦æ­¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚
+ ç¦æ­¢ä½äººã¯ [MAX_BANNED] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="MaxAgentOnRegionBatch">
[NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’追加ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="MaxAllowedGroupsOnRegion">
- 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚
+ 許å¯ã‚°ãƒ«ãƒ¼ãƒ—㯠[MAX_GROUPS] グループã¾ã§ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/>
</notification>
<notification name="MaxManagersOnRegion">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚
+ ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ [MAX_MANAGER] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="OwnerCanNotBeDenied">
- ä¸å‹•産オーナーをä¸å‹•ç”£ã€Œç¦æ­¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。
+ ä¸å‹•産オーナーをä¸å‹•産ã®ã€Œç¦æ­¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。
</notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
- æœãŠã‚ˆã³å½¢ãŒãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。
+ 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèª­ã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ClassifiedMustBeAlphanumeric">
- クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ァベットã‹
-æ•°å­—ã§å§‹ã‚ã¾ã™ã€‚ å¥èª­ç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。
+ クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹æ•°å­—ã§å§‹ã‚ã¾ã™ã€‚å¥èª­ç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。
</notification>
<notification name="CantSetBuyObject">
- オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨­å®šã§ãã¾ã›ã‚“。
-販売対象ã®ã‚ªãƒ–ジェクトを設定ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒã§ãã¾ã›ã‚“。
+販売対象ã®ã‚ªãƒ–ジェクトを指定ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="FinishedRawDownload">
- 未加工ã®åœ°å½¢ãƒ•ァイルを次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š
-[DOWNLOAD_PATH]。
+ 未加工ã®åœ°å½¢ãƒ•ァイルをダウンロードã—ã¾ã—ãŸï¼š
+[DOWNLOAD_PATH]
</notification>
<notification name="DownloadWindowsMandatory">
- [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã¯ã€
-ã“ã®ã‚¢ãƒƒãƒ—デートをダウンロードã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
</notification>
<notification name="DownloadWindows">
- [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
+[MESSAGE]
+[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadLinux">
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
+[MESSAGE]
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
+[MESSAGE]
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンロード"/>
+ </notification>
<notification name="DownloadMacMandatory">
- [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã€
-ã“ã®ã‚¢ãƒƒãƒ—デートをダウンロードã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚
-アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
</notification>
<notification name="DownloadMac">
- [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚
+ [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
[MESSAGE]
-ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
<notification name="DeedObjectToGroup">
ã“ã®ã‚ªãƒ–ジェクトを譲渡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š
-* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚
- <usetemplate ignoretext="オブジェクトをグループã«è­²æ¸¡ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="譲渡"/>
+* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れ㟠L$ ã‚’å—é ˜ã—ã¾ã™ã€‚
+ <usetemplate ignoretext="オブジェクトをグループã«è­²æ¸¡ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="譲渡"/>
</notification>
<notification name="WebLaunchExternalTarget">
- ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã®ã‚¦ã‚§ãƒ–・ブラウザを開ã„ã¦ã€ã“ã®å†…容を表示ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ–ラウザを開ã„ã¦ã‚¦ã‚§ãƒ–・ページを表示ã—よã†ã¨ã—ãŸã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- www.secondlife.comã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="アカウントを管ç†ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
- [SECOND_LIFE] Wikiã§ã€
-セキュリティå•題を報告ã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="セキュリティå•題Wikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ [SECOND_LIFE] Wiki ã§ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題を報告ã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
- [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£Wikiã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="å“質ä¿è¨¼é–¢é€£Wikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£ Wiki ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
- [SECOND_LIFE]ã®ãƒ‘ブリックå•題トラッカーã§ã€
+ [SECOND_LIFE] ã®ãƒ‘ブリックå•題トラッカーã§ã€
ãƒã‚°ã‚„ãã®ä»–ã®å•題を報告ã§ãã¾ã™ã€‚
- <usetemplate ignoretext="パブリックå•題トラッカーを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- [SECOND_LIFE] Wikiã§ã€
-パブリックå•題トラッカーã®ä½¿ç”¨æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="パブリックå•題トラッカーWikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
</notification>
<notification name="WebLaunchSupportWiki">
- Lindenå…¬å¼ãƒ–ログã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„情報を入手ã—ã¦ãã ã•ã„。
- <usetemplate ignoretext="ブログを表示ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ Linden å…¬å¼ãƒ–ログã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„情報を入手ã—ã¦ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ログを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- スクリプトガイドを開ã„ã¦ã€ã‚¹ã‚¯ãƒªãƒ—トã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="LSLガイドを表示ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- LSLãƒãƒ¼ã‚¿ãƒ«ã‚’é–‹ã„ã¦ã‚¹ã‚¯ãƒªãƒ—トã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="LSLãƒãƒ¼ã‚¿ãƒ«ã‚’表示ã™ã‚‹ãŸã‚ã«ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
+ LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
</notification>
<notification name="ReturnToOwner">
é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
-譲渡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯
-以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
+「å†è²©ãƒ»ãƒ—レゼントå¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
-*警告* 移転ãŒä¸å¯èƒ½ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
- <usetemplate ignoretext="オブジェクトをæŒã¡ä¸»ã«è¿”å´ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+*警告* 「å†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã™ï¼
+ <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
-ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
+ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚­ãƒƒã‚¯ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッドã®å¤–ã«ã‚­ãƒƒã‚¯ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/>
</notification>
<notification name="MuteLinden">
- 残念ãªãŒã‚‰Lindenを無視設定ã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ リンデンをブロックã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
æ—¢ã«å£²ã‚Šå‡ºã—中ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—設定を解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。
</notification>
- <notification label="オブジェクトをåå‰ã§ãƒŸãƒ¥ãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" name="MuteByNameFailed">
- ã‚ãªãŸã¯ã™ã§ã«ã“ã®åå‰ã‚’ミュートã—ã¦ã„ã¾ã™ã€‚
+ <notification label="åå‰ã§ã®ã‚ªãƒ–ジェクトã®ãƒ–ロックã«å¤±æ•—ã—ã¾ã—ãŸ" name="MuteByNameFailed">
+ ã“ã®åå‰ã¯æ—¢ã«ãƒ–ロック済ã¿ã§ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
- コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æå‚·ã‚’ä¸Žãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
+削除を続ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CantOfferCallingCard">
- ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CantOfferFriendship">
- ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«è©¦ã—ã¦ãã ã•ã„。
+ ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- å–り込ã¿ä¸­ã«è¨­å®šã•れã¾ã—ãŸã€‚
-ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ»ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼ˆIM)ãŒéš ã‚Œã¾ã™ã€‚
-相手ã¯ã€Œå–り込ã¿ä¸­å¿œç­”メッセージã€ã‚’IMã§å—ã‘å–りã¾ã™ã€‚
-テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァーã¯å…¨ã¦æ‹’å¦ã•ã‚Œã€æŒã¡ç‰©ã®ã‚ªãƒ•ァーã¯å…¨ã¦ã‚´ãƒŸç®±ã«é€ã‚‰ã‚Œã¾ã™ã€‚
- <usetemplate ignoretext="å–り込ã¿ä¸­ã®è¨­å®šã‚’ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/>
+ å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚
+ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–り込ã¿ä¸­è¿”答メッセージãŒè¡¨ç¤ºã•れã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァーã¯å—ã‘å–り拒å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ァーã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚
+ <usetemplate ignoretext="ログイン状態をå–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- ã‚ãªãŸã¯ç¾åœ¨ãƒ¡ãƒ³ãƒãƒ¼ã«ãªã£ã¦ã„るグループãŒå¤šã™ãŽã‚‹ãŸã‚ã€
-ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã§ãã¾ã›ã‚“。少ãªãã¨ã‚‚1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã—ã¦ã‹ã‚‰ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã‹ã€ã“ã®æ‹›å¾…ã‚’æ–­ã£ã¦ãã ã•ã„。
-グループを抜ã‘ã‚‹ã«ã¯ã€ç·¨é›†ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€Œã‚°ãƒ«ãƒ¼ãƒ—...ã€ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’ã‚’é¸æŠžã—ã¾ã™ã€‚
-[NAME]ã¯ã€ã‚ãªãŸã‚’メンãƒãƒ¼ã¨ã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
-[INVITE]
+ 加入ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れを断ã£ã¦ãã ã•ã„。
+[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚加"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ 加入ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ æ–°ã—ãグループã«å‚加ã€ã¾ãŸã¯ä½œæˆã™ã‚‹å‰ã«ã€ã©ã‚Œã‹ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰æŠœã‘ã¦ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
@@ -1454,7 +1396,7 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="KickAllUsers">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
@@ -1464,17 +1406,17 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="FreezeUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…㌠IM ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="UnFreezeUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。
@@ -1484,32 +1426,39 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="OfferTeleport">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„る場所ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
+ 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ç¾åœ¨åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
+ [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="OfferTeleportFromGod">
- ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ
+ ユーザーをゴッドサモンã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
+ [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="TeleportFromLandmark">
- 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹æ™‚" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ ã“ã®ã¾ã¾ &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ </notification>
+ <notification name="TeleportToPick">
+ [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ [CLASSIFIED] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
</notification>
<notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate">
- 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹
-短ã„メッセージを入力ã—ã¦ãã ã•ã„。
+ 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ã€çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
@@ -1517,93 +1466,87 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification label="Lindenã®ä¸å‹•産を変更" name="ChangeLindenEstate">
- ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒªãƒ³ãƒ‡ãƒ³æ‰€æœ‰ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“れã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“を根本ã‹ã‚‰æºã‚‹ãŒã—ã‹ã­ãªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
+ã“れã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“を根本ã‹ã‚‰æºã‚‹ãŒã—ã‹ã­ãªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification label="Lindenã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess">
- ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒªãƒ³ãƒ‡ãƒ³æ‰€æœ‰ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚りã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚­ãƒ³ã‚°ã‚’引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚
-ã“れã«ã‚ˆã‚Šå¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
+ã“れã«ã‚ˆã‚Šå¤šæ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd">
- ã“ã®ä¸å‹•産ã®è¨±å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove">
- 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd">
- ã“ã®ä¸å‹•産ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove">
- 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd">
- ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã§ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATE] ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove">
- ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä½äººãŒã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd">
- ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’追加ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã®ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’追加ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="キックを確èª" name="EstateKickUser">
- ã“ã®ä¸å‹•産ã‹ã‚‰[EVIL_USER]を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産ã‹ã‚‰ [EVIL_USER] を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="EstateChangeCovenant">
- ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
- <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚Œãªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
+ <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-
-「設定を変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
-ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。
- <form name="form">
- <button
- name="OK"
- text="設定ã®å¤‰æ›´"/>
- <button
- default="true"
- name="Cancel"
- text="é–‰ã˜ã‚‹"/>
- <ignore name="ignore" text="レーティング区分設定ã«ã‚ˆã£ã¦åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚Œãªã„ã¨ã"/>
- </form>
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+
+「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
+ <form name="form">
+ <button name="OK" text="環境設定ã®å¤‰æ›´"/>
+ <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/>
+ <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚Œãªã„ã¨ã"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
@@ -1616,9 +1559,9 @@ F1キーを押ã—ã¦ãã ã•ã„。
ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
- <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
+ <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -1626,9 +1569,8 @@ F1キーを押ã—ã¦ãã ã•ã„。
<notification name="LandClaimAccessBlocked_Change">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-「設定を変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
-ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="レーティング区分設定ã«ã‚ˆã£ã¦åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
+「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
</notification>
<notification name="LandBuyAccessBlocked">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
@@ -1641,9 +1583,9 @@ F1キーを押ã—ã¦ãã ã•ã„。
ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
- <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
+ <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -1651,379 +1593,75 @@ F1キーを押ã—ã¦ãã ã•ã„。
<notification name="LandBuyAccessBlocked_Change">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-「設定を変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
-ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="レーティング区分設定ã«ã‚ˆã£ã¦åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
+「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
</notification>
<notification name="TooManyPrimsSelected">
- é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚
-[MAX_PRIM_COUNT] ã‚’é¸æŠžã™ã‚‹ã‹ã€
-プリム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ [MAX_PRIM_COUNT] å€‹é¸æŠžã™ã‚‹ã‹ã€ãƒ—リム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
- ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題発生。
+ ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemAddingEstateManager">
æ–°ã—ã„ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
+ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="ProblemAddingEstateGeneric">
ä¸å‹•産リストã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
+ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="UnableToLoadNotecardAsset">
- ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£IDを読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆ ID を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
- è¦æ±‚ã•れãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚
+ è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆ ID ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MissingNotecardAssetID">
- ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。
+ ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆ ID ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PublishClassified">
注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。
-L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ
+L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åºƒå‘Šã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="SetGroupMature">
- ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">
- ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ 2 分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
- <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion">
- ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹
-短ã„メッセージを入力ã—ã¦ãã ã•ã„。
+ <notification label="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人全員ã«é€ã‚‹çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
- <notification label="土地整備をブロック" name="HelpRegionBlockTerraform">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹å ´åˆã€
-区画ã”ã¨ã®ã€Œé ˜åŸŸã‚’編集ã€ã®è¨­å®šã«ã‹ã‹ã‚らãšã€åœŸåœ°ã‚ªãƒ¼ãƒŠãƒ¼ã¯åœŸåœ°æ•´å‚™ãŒã§ãã¾ã›ã‚“。
-
-デフォルト:オフ
- </notification>
- <notification label="飛行をブロック" name="HelpRegionBlockFly">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€åŒºç”»ã”ã¨ã®ã€Œé£›è¡Œã€è¨­å®šã«é–¢ã‚らãšé£›è¡ŒãŒã§ããªããªã‚Šã¾ã™ã€‚
-
-デフォルト:オフ
- </notification>
- <notification label="コンテンツ権é™ã®ä¸€æ‹¬å¤‰æ›´" name="HelpBulkPermission">
- 権é™ã®ä¸€æ‹¬å¤‰æ›´ãƒ„ールã§ã¯ã€é¸æŠžã—ãŸè¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®æ¨©é™ã‚’ç´ æ—©ã変更ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
-ã—ã‹ã—é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ä¸­èº«ã®æ¨©é™è¨­å®šã‚’ã™ã‚‹ã ã‘ã§ã€ã‚ªãƒ–ジェクトãã®ã‚‚ã®ã§ã¯ãªã„ã“ã¨ã«ã”注æ„ãã ã•ã„。
-
-ã¾ãŸã€æ¨©é™ã¯ä¸­ã«ã‚るアイテムã®ãã®ä¸­èº«ã«ã¯é©ç”¨ã•れãªã„ã“ã¨ã‚‚ã”æ³¨æ„ãã ã•ã„。 1段階層ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¨ãªã‚Šã¾ã™ã€‚
-
-「コンテンツã®ç¨®é¡žã€ã«ã‚ã‚‹ãƒã‚§ãƒƒã‚¯ãƒªã‚¹ãƒˆã‚’使ã£ã¦ã€ä¿®æ­£ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã®ç¨®é¡žã‚’é¸æŠžã—ã¾ã™ã€‚ テクスãƒãƒ£ãƒ¼ã‚’é¸æŠžã™ã‚‹ã¨ã€ã‚¹ãƒŠãƒƒãƒ—ショットもå«ã¾ã‚Œã¾ã™ã€‚
-
-* ã“ã®ãƒ„ールã®ä½¿ç”¨ã¯ã€
-ã‚ãªãŸãŒå¤‰æ›´ã™ã‚‹ã“ã¨ã®ã§ãるアイテムã«ã®ã¿æœ‰åйã§ã™ã€‚
-* 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒã‚ãªãŸã«ãªã„å ´åˆã¯ã€é©ç”¨ã•れã¾ã›ã‚“。
-* 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ã¯å˜ã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã™ãŽã¾ã›ã‚“。 ã©ã‚Œã‹ä¸€ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã§ã‚‚æ–°ã—ã„æ¨©é™ã®è¨­å®šã‚’å—ã‘付ã‘ãªã„å ´åˆã€ã™ã¹ã¦ã®æ¨©é™ã®è¨­å®šã¯ãã®ã¾ã¾ç¶­æŒã•れã¾ã™ã€‚
-
-ä¸€æ‹¬å¤‰æ›´ã®æº–å‚™ãŒã§ããŸã‚‰ã€ã€Œé©ç”¨ã€ã‚’クリックã—ã¦çµæžœãŒè¡¨ç¤ºã•れるã®ã‚’ãŠå¾…ã¡ãã ã•ã„。
-
-権é™å¤‰æ›´ä¸­ã«æ¨©é™ã®ä¸€æ‹¬å¤‰æ›´ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ãŸå ´åˆã€å‡¦ç†ã¯åœæ­¢ã•れã¾ã™ã€‚
- </notification>
- <notification label="ダメージ許å¯" name="HelpRegionAllowDamage">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€
-å„区画ã®å€‹åˆ¥ã®è¨­å®šã«ã‹ã‹ã‚らãšã€å…¨ã¦ã®åŒºç”»ã«ãŠã‘るヘルスシステムを有効ã«ã—ã¾ã™ã€‚
-ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã§ã‚‚ã€
-個別ã®åŒºç”»ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€è‡ªåˆ†ã®åŒºç”»ã«å¯¾ã™ã‚‹ãƒ˜ãƒ«ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã‚’有効ã«ã§ãã¾ã™ã€‚
-
-デフォルト: オフ
- </notification>
- <notification label="人物ã®åˆ¶é™" name="HelpRegionAgentLimit">
- ã“ã®åœ°åŸŸã«è¨±å¯ã•れるアãƒã‚¿ãƒ¼ã®æœ€å¤§æ•°ã‚’設定ã—ã¾ã™ã€‚
-1ã¤ã®åœ°åŸŸã«ã‚¢ãƒã‚¿ãƒ¼ãŒå¤šã„ã¨ãƒ‘フォーマンスãŒ
-低下ã™ã‚‹åŽŸå› ã«ãªã‚‹ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。
-
-デフォルト: 40
- </notification>
- <notification label="物体ボーナス" name="HelpRegionObjectBonus">
- オブジェクトボーナスã¯ã€åŒºç”»ã«ãŠã„ã¦è¨±å¯ã•れã¦ã„るプリムã®å€çŽ‡æ•°ã‚’æ„味ã—ã¾ã™ã€‚
-èªå¯ã•れã¦ã„る範囲ã¯1ã‹ã‚‰10ã§ã™ã€‚
-ã—ãŸãŒã£ã¦ã€ã€Œ1ã€ã«è¨­å®šã™ã‚‹ã¨ã€512 m²ã®åœŸåœ°ã«ã¯ã€117ã®ã‚ªãƒ–ジェクトãŒè¨±å¯ã•れã¾ã™ã€‚
-「2ã€ã«è¨­å®šã™ã‚‹ã¨ã€åŒã˜512 m²ã®åœŸåœ°ã«ã¯ã€1ã®ã¨ãã®2å€ã«ã‚ãŸã‚‹234ã®ã‚ªãƒ–ジェクトãŒè¨±å¯ã•れã€3以é™ã‚‚åŒæ§˜ã«å¢—ãˆã¦ã„ãã¾ã™ã€‚
-å…¨åœ°åŸŸã®æœ€é«˜ã‚ªãƒ–ジェクト数ã¯ã€ã‚ªãƒ–ジェクトボーナスã®å€¤ã«å½±éŸ¿ã•れãšã€
-15,000ã®ã¾ã¾å¤‰ã‚りã¾ã›ã‚“。
-ã„ã£ãŸã‚“決定ã—ãŸå¾Œã§ã‚ªãƒ–ジェクトボーナスã®å€¤ã‚’下ã’ã‚‹ã¨ã€ã‚ªãƒ–ジェクトãŒè¿”å´ã¾ãŸã¯å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã®ã§ã”注æ„ãã ã•ã„。
-ディフォルト: 1.0
- </notification>
- <notification label="レーティング区分" name="HelpRegionMaturity">
- ä½äººã®ãƒ“ューワ上部ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã«è¡¨ç¤ºã•れるã€åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’設定ã—ã¾ã™ã€‚
-世界地図上ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’ã“ã®åœ°åŸŸã«ä¹—ã›ã‚‹ã¨ãƒ„ールãƒãƒƒãƒ—ã«è¡¨ç¤ºã•れã¾ã™ã€‚
-ã“ã®è¨­å®šã¯ã“ã®åœ°åŸŸå…¨ä½“ã¨æ¤œç´¢çµæžœã«å映ã•れã¾ã™ã€‚
-ä»–ã®ä½äººã¯ç’°å¢ƒè¨­å®šã§é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«åˆã£ãŸåœ°åŸŸã«å…¥ã‚‹ã“ã¨ãŒã§ãã€æ¤œç´¢çµæžœã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚
-
-地図ã«ã“ã®å¤‰æ›´ãŒå映ã™ã‚‹ã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
- </notification>
- <notification label="プッシュを制é™" name="HelpRegionRestrictPushObject">
- ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€åˆ¶é™ã•れãŸãƒ—ッシュ権é™ã‚’全地域ã«é©ç”¨ã—ã¾ã™ã€‚
-有効ã«ãªã£ã¦ã„ã‚‹å ´åˆã€ä½äººã¯è‡ªåˆ†è‡ªèº«ã§ã®ãƒ—ッシュã€
-ã‚ã‚‹ã„ã¯åŒºç”»ã®æ‰€æœ‰è€…ã«ã‚ˆã‚‹ãƒ—ッシュã ã‘ã«åˆ¶é™ã§ãã¾ã™ã€‚
-(プッシュã¯ã€LSLã® llPushObject() 機能をå‚ç…§ã—ã¾ã™ã€‚)
-
-デフォルト: オフ
- </notification>
- <notification label="区画統åˆï¼å†åˆ†å‰²" name="HelpParcelChanges">
- ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„ãªã„区画を統åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚
-本オプションãŒç„¡åйãªå ´åˆï¼š
-*ä¸å‹•産オーナーã€ã¾ãŸã¯ç®¡ç†è€…ã®ã¿ãŒã€çµ±åˆï¼å†åˆ†å‰²ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
-*オーナーã€ã¾ãŸã¯ã€é©åˆ‡ãªæ¨©é™ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹åŒºç”»ã®ã¿ã‚’
-çµ±åˆï¼å†åˆ†å‰²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-æœ¬ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãŒæœ‰åйãªå ´åˆï¼š
-*å…¨ã¦ã®åŒºç”»ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€æ‰€æœ‰ã™ã‚‹åŒºç”»ã®çµ±åˆï¼å†åˆ†å‰²ãŒã§ãã¾ã™ã€‚
-*グループ所有ã®åŒºç”»ã¯ã€é©åˆ‡ãªæ¨©é™ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹åŒºç”»ã‚’çµ±åˆï¼å†åˆ†å‰²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-デフォルト:ãƒã‚§ãƒƒã‚¯ã‚り
- </notification>
- <notification label="検索ã§è¡¨ç¤ºã—ãªã„" name="HelpRegionSearch">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€åŒºç”»ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€è‡ªåˆ†ã®åŒºç”»ãŒæ¤œç´¢çµæžœã«ãƒªã‚¹ãƒˆã•れるã“ã¨ã‚’阻止ã§ãã¾ã™ã€‚
-デフォルト:オフ
- </notification>
<notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange">
- ã“ã®åœ°åŸŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚
-ã“ã®å¤‰æ›´ãŒåœ°å›³ã«å映ã•れるã¾ã§ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚
- </notification>
- <notification label="土地ã®å†è²©" name="HelpRegionLandResell">
- ä¸å‹•産ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¨ç®¡ç†è€…ã¯ã€ä¸å‹•産オーナーã®åœŸåœ°ã‚’販売ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ãªã„å ´åˆã€è³¼å…¥è€…ãŒæœ¬åœ°åŸŸã«ãŠã‘る土地をå†è²©ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ãŸå ´åˆã€è³¼å…¥è€…ã¯æœ¬åœ°åŸŸã«ãŠã‘る土地をå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-デフォルト:許å¯ã—ãªã„
- </notification>
- <notification label="スクリプトを無効化" name="HelpRegionDisableScripts">
- スクリプトãŒåŽŸå› ã§ã‚·ãƒ ã®çжæ³ãŒæ‚ªããªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚
-統計グラフをã ã—ã¦ï¼ˆCtrl+Shift+1)ã€
-シミュレーターフィジックスFPSを見ã¦ãã ã•ã„。
-45より数ãŒä½Žã‘れã°ã€ä¸€ç•ªä¸‹ã«ä½ç½®ã—ã¦ã„るタイムパãƒãƒ«ã‚’é–‹ã„ã¦ãã ã•ã„。
-スクリプト時間ãŒ25ms以上ã§ã‚れã°ã€
-「トップスクリプトをå–å¾—ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
-悪影響をåŠã¼ã—ã¦ã„るスクリプトã®åå‰ã¨ä½ç½®ãŒç¾ã‚Œã¾ã™ã€‚
-
-「スクリプトを無効ã«ã™ã‚‹ã€ã‚’ãƒã‚§ãƒƒã‚¯ã—「é©ç”¨ã€ã‚’クリックã™ã‚‹ã¨ã€åœ°åŸŸå†…ã®å…¨ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トãŒä¸€æ™‚çš„ã«ç„¡åйã«ãªã‚Šã¾ã™ã€‚
-ãƒˆãƒƒãƒ—ã‚¹ã‚¯ãƒªãƒ—ãƒˆã§æ¤œç´¢ã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä½ç½®ã¾ã§åˆ°é”ã™ã‚‹ã«ã¯ã€
-ã“ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒå¿…è¦ã«ãªã‚‹å ´åˆã‚‚ã‚りã¾ã™ã€‚
-スクリプトä½ç½®ã«åˆ°ç€å¾Œã€ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’è¦‹ã¦æ‚ªå½±éŸ¿ã‚’与ãˆã¦ã„ã‚‹ã‹èª¿æŸ»ã—ã¦ãã ã•ã„。
-ã‚¹ã‚¯ãƒªãƒ—ãƒˆã®æ‰€æœ‰è€…ã«é€£çµ¡ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ªãƒ–ジェクトã®å‰Šé™¤ã¾ãŸã¯è¿”å´ã‚‚考ãˆã‚‰ã‚Œã¾ã™ã€‚
-「スクリプトを無効ã«ã™ã‚‹ã€ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã€ã€Œé©ç”¨ã€ã‚’クリックã—ã¦åœ°åŸŸå…¨ä½“ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’æœ‰åŠ¹ã«æˆ»ã—ã¦ãã ã•ã„。
-
-デフォルト:オフ
- </notification>
- <notification label="è¡çªã‚’無効化" name="HelpRegionDisableCollisions">
- 物ç†çš„オブジェクトãŒåŽŸå› ã§ã€
-シムã®å‡¦ç†ãŒé‡ããªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-統計グラフを開ã„ã¦ï¼ˆCtrl+Shift+1)ã€
-シミュレーターフィジックスFPSを見ã¦ãã ã•ã„。
-数値ãŒ45より低ã‘れã°ã€çµ±è¨ˆãƒãƒ¼ã®ä¸‹ã«ä½ç½®ã—ã¦ã„るタイムパãƒãƒ«ã‚’é–‹ã„ã¦ãã ã•ã„。
-ã‚‚ã—シムタイム(物ç†çš„作用)ãŒ20 msより長ã„å ´åˆã¯ã€
-「トップ・コライダーをå–å¾—ã€ã‚’クリックã—ã¦ãã ã•ã„。
-悪影響をåŠã¼ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚る物ç†ã‚ªãƒ–ジェクトã®åå‰ã¨ä½ç½®ãŒç¾ã‚Œã¾ã™ã€‚
-
-「è¡çªã‚’無効ã«ã™ã‚‹ã€ã‚’ãƒã‚§ãƒƒã‚¯ã—「é©ç”¨ã€ã‚’クリックã™ã‚‹ã¨ã€
-オブジェクトåŒå£«ã®è¡çªãŒä¸€æ™‚çš„ã«ç„¡åйã«ãªã‚Šã¾ã™ã€‚
-当該ã®ãƒˆãƒƒãƒ—・コライダーã®ä½ç½®ã¾ã§åˆ°é”ã™ã‚‹ã«ã¯
-上記ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒå¿…è¦ã«ãªã‚‹å ´åˆã‚‚ã‚りã¾ã™ã€‚
-到ç€å¾Œã€ã‚ªãƒ–ジェクトを見ã¦å¸¸æ™‚ä»–ã®ã‚ªãƒ–ジェクトã¨è¡çªã—ã¦ã„ã‚‹ã‹èª¿æŸ»ã—ã¦ãã ã•ã„。
-ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã«é€£çµ¡ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ªãƒ–ジェクトã®å‰Šé™¤ã¾ãŸã¯è¿”å´ã‚’考慮ã™ã¹ãã‹ã‚‚ã—れã¾ã›ã‚“。
-「è¡çªã‚’無効ã«ã™ã‚‹ã€ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã€ã€Œé©ç”¨ã€ã‚’クリックã—ã¦
-地域全体ã®è¡çªã‚’æœ‰åŠ¹ã«æˆ»ã—ã¦ãã ã•ã„。
-
-デフォルト:オフ
- </notification>
- <notification label="物ç†ä½œç”¨ã‚’無効化" name="HelpRegionDisablePhysics">
- 物ç†çš„作用を無効ã«ã™ã‚‹ã“ã¨ã¯ã€ç‰©ç†çš„シミュレーション全ã¦ã®ç„¡åŠ¹ã‚’é™¤ã„ã¦ã€è¡çªã‚’無効ã«ã™ã‚‹ã“ã¨ã¨ä¼¼ã¦ã„ã¾ã™ã€‚
-ã“れã¯ã€ã‚ªãƒ–ジェクトã®è¡çªã‚’æ­¢ã‚ã‚‹ã®ã¿ãªã‚‰ãšã€ã‚¢ãƒã‚¿ãƒ¼ã®ç§»å‹•ãŒã§ããªããªã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
-
-ã“ã®æ©Ÿèƒ½ã¯ã€ç‰©ç†çš„ãªå•題ãªã®ã‹ã€ã¾ãŸã¯ãƒˆãƒƒãƒ—・コライダーãªã®ã‹ã‚’調査ã™ã‚‹ã«ã‚ãŸã‚Šã€è¡çªã®ç„¡åйãŒåœ°åŸŸã«å¯¾ã—ã¦å分ãªãƒ‘フォーマンスを発æ®ã—ãªã„å ´åˆã«ã®ã¿ä½¿ç”¨ã—ã¦ãã ã•ã„。
-
-終了ã™ã‚‹æ™‚ã«ã¯ã€ç‰©ç†çš„作用をå†åº¦å¯èƒ½ã«è¨­å®šã—ã¦ãã ã•ã„。
-ãã®ã¾ã¾ã ã¨ã€ã‚¢ãƒã‚¿ãƒ¼ã¯ãšã£ã¨å‹•ã‘ã¾ã›ã‚“。
-
-デフォルト:オフ
- </notification>
- <notification label="トップ・コライダー" name="HelpRegionTopColliders">
- オブジェクトåŒå£«ã®è¡çªãŒæœ€ã‚‚多ã„å¯èƒ½æ€§ã®ã‚ã‚‹
-オブジェクトã®ãƒªã‚¹ãƒˆã‚’表示ã—ã¾ã™ã€‚ã“れらã®ã‚ªãƒ–ジェクトã¯ã€
-パフォーマンスを低下ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-ビューã‹ã‚‰çµ±è¨ˆãƒãƒ¼ã‚’é¸æŠžã—ã€
-シミュレータ>時間>シム時間 (物ç†çš„作用) ã§ã€
-物ç†çš„作用ã«20 ms以上を費ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¦ãã ã•ã„。
- </notification>
- <notification label="トップ・スクリプト" name="HelpRegionTopScripts">
- LSLスクリプトã®å®Ÿè¡Œã«ä¸€ç•ªæ™‚間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’入手ã—ã¾ã™ã€‚
-ã“れらã®ã‚ªãƒ–ジェクトã¯ã€ãƒ‘フォーマンスを低下ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-ビューã‹ã‚‰çµ±è¨ˆãƒãƒ¼ã‚’é¸æŠžã—ã€
-ミュレータ>時間>スクリプト時間ã§ã€
-スクリプトã«25 ms以上を費ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¦ãã ã•ã„。
- </notification>
- <notification label="地域をå†èµ·å‹•" name="HelpRegionRestart">
- 2分後ã«ã‚µãƒ¼ãƒãƒ¼ãŒå†èµ·å‹•ã•れるã¨ã„ã†è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¾Œã«ã€
-ã“ã®åœ°åŸŸã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスをå†èµ·å‹•ã—ã¾ã™ã€‚
-ã“ã®åœ°åŸŸã®ã™ã¹ã¦ã®ä½äººã®æŽ¥ç¶šãŒåˆ‡æ–­ã•れã¾ã™ã€‚
-地域ã®ãƒ‡ãƒ¼ã‚¿ã¯ä¿å­˜ã•れã€90秒以内ã«å›žå¾©ã—ã¾ã™ã€‚
-
-ã“ã®åœ°åŸŸã‚’å†èµ·å‹•ã—ã¦ã‚‚ã€ã»ã¨ã‚“ã©ã®ãƒ‘フォーマンスã®å•題ã«å¤‰åŒ–ã¯ã‚りã¾ã›ã‚“。
-指示ã•ã‚ŒãŸæ™‚ã ã‘利用ã—ã¦ãã ã•ã„。
- </notification>
- <notification label="æ°´é¢ã®é«˜ã•" name="HelpRegionWaterHeight">
- ã“れã¯ã€æ°´ãŒç¾ã‚Œã‚‹é«˜ã•(å˜ä½ï¼šãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ã§ã™ã€‚
-ã“ã®è¨­å®šãŒ20以外ã§ã€æ°´ãŒä¸–界ã®
-端やã€ã€Œç©ºã®ã€æ°´ã«è¿‘ã‘れã°ã€
-æºãŒè¦‹ãˆã‚‹ã§ã—ょã†ã€‚
-
-デフォルト: 20
- </notification>
- <notification label="地形ã®ä¸Šæ˜‡" name="HelpRegionTerrainRaise">
- ã“ã®æ•°å€¤ã¯ã€ã€Œãƒ™ãƒ¼ã‚¯ã€åœ°å½¢ã®ãƒ‡ãƒ•ォルトã®é«˜ã•以上ã«ã€
-区画所有者ãŒåœŸåœ°ã‚’上ã’ã‚‹ã“ã¨ã®ã§ãるメートル値ã§ã™ã€‚
-
-デフォルト: 4
- </notification>
- <notification label="地形ã®ä¸‹é™" name="HelpRegionTerrainLower">
- ã“ã®æ•°å€¤ã¯ã€ã€Œãƒ™ãƒ¼ã‚¯ã€åœ°å½¢ã®ãƒ‡ãƒ•ォルトã®é«˜ã•以下ã«ã€
-区画所有者ãŒåœŸåœ°ã‚’下ã’られるメートル値ã§ã™ã€‚
-
-デフォルト: -4
- </notification>
- <notification label="RAW地形をアップロード" name="HelpRegionUploadRaw">
- ã“ã®ãƒœã‚¿ãƒ³ã‚’使ã£ã¦ã€.RAW ファイルを
-ç¾åœ¨ã‚ãªãŸãŒå±…る地域ã«ã‚¢ãƒƒãƒ—ロードã—ã¾ã™ã€‚
-ファイルãŒå¿…ãšæ­£ã—ã„サイズã®256x256ã€RGBã€
-ã¾ãŸã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
-地形(Terrain) ファイルを作æˆã™ã‚‹æœ€è‰¯ã®æ–¹æ³•ã¯ã€
-既存ã®RAWファイルをダウンロードã™ã‚‹ã“ã¨ã§ã™ã€‚
-ã¾ãšæœ€åˆã®ãƒãƒ£ãƒ³ãƒãƒ«ï¼ˆåœŸåœ°ã®é«˜ã•)を変更ã—ã€
-アップロードã™ã‚‹ã“ã¨ã‹ã‚‰å§‹ã‚られã¾ã™ã€‚
-
-アップロードã«ã¯45ç§’ã»ã©ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-ã“ã“ã§æ³¨æ„ã™ã‚‹ã“ã¨ã¯ã€åœ°å½¢ãƒ•ァイルã®ã‚¢ãƒƒãƒ—ロードã«ã‚ˆã£ã¦ã€åœŸåœ°ã«é…ç½®ã•れã¦ã„るオブジェクトã¯ã€Œå‹•ã‹ãªã„ã€ã¨ã„ã†ã“ã¨ã§ã™ã€‚
-影響ãŒã‚ã‚‹ã®ã¯ã€åœ°å½¢è‡ªä½“ã¨ã€åœŸåœ°ã«é–¢ä¿‚ã™ã‚‹è¨±å¯ã®ã¿ã§ã™ã€‚
-よã£ã¦ã€ã‚ªãƒ–ジェクトãŒåœ°ä¸‹ã«åŸ‹ã¾ã£ã¦ã—ã¾ã†ã“ã¨ãŒã‚ã‚‹ã®ã§ã”注æ„ãã ã•ã„。
-
-åœ°å½¢è¨­å®šç·¨é›†ã®æƒ…å ±ã¨è©³ç´°ã«ã¤ã„ã¦ã¯ã€F1ヘルプをã”覧ãã ã•ã„。
- </notification>
- <notification label="RAW地形をダウンロード" name="HelpRegionDownloadRaw">
- ã“ã®ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ã€æ¨™é«˜ãƒ•ィールドデータã€
-区画寸法ã€å£²ã‚Šå‡ºã—区画ステータスã€ã“ã®åœ°åŸŸã«ãŠã‘る許å¯ã‚’
-å«ã‚€ãƒ•ァイルをダウンロードã—ã¾ã™ã€‚フォトショップã®ã‚ˆã†ãªãƒ—ログラムã§ã“ã®ãƒ•ァイルを開ãã«ã¯ã€
-以下ã®ã‚ˆã†ãªãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼š
-RGBã€256x256ã§ã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13
-ã“ã®åœ°å½¢ãƒ•ァイルã¯ã€ä»–ã®æ–¹æ³•ã§ã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。
-
-地形ã«ãŠã‘る標高フィールドã®ç·¨é›†ã«é–¢ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã¯ã€F1ヘルプをã”覧ãã ã•ã„。
- </notification>
- <notification label="ä¸å‹•産ã®å¤ªé™½ã‚’使用" name="HelpRegionUseEstateSun">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹ã¨ã€ã“ã®åœ°åŸŸã®å¤ªé™½ã¯
-ä¸å‹•産ã®ä»–ã®å ´æ‰€ã«ãŠã‘る太陽ã¨ä½ç½®ãŒåŒã˜ã«ãªã‚Šã¾ã™ã€‚
-
-デフォルト: オン
- </notification>
- <notification label="太陽固定" name="HelpRegionFixedSun">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€å¤ªé™½ã®ä½ç½®ã¯æ®µéšŽã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼å†…ã«
-設定ã•れã€å‹•ã‹ãªããªã‚Šã¾ã™ã€‚
-デフォルト: オフ
- </notification>
- <notification label="地形を構築ã™ã‚‹" name="HelpRegionBakeTerrain">
- ã“ã®ãƒœã‚¿ãƒ³ã«ã‚ˆã‚Šã€ç¾åœ¨ã®åœ°å½¢ã®å½¢çŠ¶ã‚’æ–°ãŸãªãƒ‡ãƒ•ォルトã¨ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚
-一度ベークã•れるã¨ã€ã‚ãªãŸã‚„ä»–ã®äººãŒåœ°å½¢ç·¨é›†ã®ã€Œå¾©å¸°ã€ã‚ªãƒ—ションï¼ãƒ„ールを使用ã—ãŸéš›ã«ã€ä¿å­˜ã•れãŸå½¢çжã«å›žå¾©ã§ãã¾ã™ã€‚
-ベークã•れãŸåœ°å½¢ã¯ã€åœ°å½¢ä¸Šæ˜‡ãŠã‚ˆã³ä¸‹é™å¢ƒç•Œã®ä¸­é–“点ã§ã‚‚ã‚りã¾ã™ã€‚
- </notification>
- <notification label="ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼" name="HelpEstateEstateManager">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¨ã¯ã€åœ°åŸŸã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã¨
-ä¸å‹•産設定ãŒå§”ä»»ã•れãŸä½äººã‚’ã•ã—ã¾ã™ã€‚ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ã€
-アップロードã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€ãŠã‚ˆã³åœ°å½¢æ§‹ç¯‰ã‚’除ã„ãŸãƒ‘ãƒãƒ«å†…ã®
-設定を変更ã§ãã¾ã™ã€‚特筆ã™ã¹ãã¯ã€
-ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ã¾ãŸã¯ç¦æ­¢ã®è¨­å®šãŒã§ãã‚‹ã“ã¨ã§ã™ã€‚
-
-ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã¨å‰Šé™¤ã¯ã€ä¸å‹•産オーナーã®ã¿ãŒè¡Œã†ã“ã¨ãŒã§ãã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼åŒå£«ã§ã¯ä¸å¯èƒ½ã§ã™ã€‚
-ä¿¡é ¼ã§ãã‚‹ä½äººã®ã¿ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ä»»å‘½ã—ã¦ãã ã•ã„。
-彼らã®è¡Œå‹•ã®å…¨è²¬ä»»ã¯ã€æœ€çµ‚çš„ã«ã¯ã‚ãªãŸã«ã‚りã¾ã™ã€‚
- </notification>
- <notification label="グローãƒãƒ«ãƒ»ã‚¿ã‚¤ãƒ ã‚’使用" name="HelpEstateUseGlobalTime">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹ã¨ã€
-ã‚ãªãŸã®æ‰€æœ‰åœ°ã®å¤ªé™½ã¯Linden社所有ã®ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ä¸å‹•産ã§ã®å¤ªé™½ã®ä½ç½®ã«æº–ã˜ã¾ã™ã€‚
-
-デフォルト: オン
- </notification>
- <notification label="太陽固定" name="HelpEstateFixedSun">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹ã¨ã€
-太陽ã®ä½ç½®ã¯æ®µéšŽã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼å†…ã«è¨­å®šã•れã€å‹•ã‹ãªããªã‚Šã¾ã™ã€‚
- </notification>
- <notification label="パブリック・アクセス" name="HelpEstateExternallyVisible">
- ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€
-ä»–ã®ä¸å‹•産ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ãªãã¦ã‚‚ã“ã®ä¸å‹•産ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚
-
-デフォルト: オン
- </notification>
- <notification label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="HelpEstateAllowDirectTeleport">
- ãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹ã¨ã€ä¸å‹•産ã®ã©ã“ã«ã§ã‚‚直接テレãƒãƒ¼ãƒˆãŒ
-å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„ã¨ã€æœ€ã‚‚è¿‘ã„テレãƒãƒ–ã«
-テレãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚
+地図ã«å¤‰æ›´ãŒå映ã•れるã¾ã§æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-デフォルト: オフ
- </notification>
- <notification label="アクセスを許å¯" name="HelpEstateAllowResident">
- ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„ã‚‹ä½äººã¨
-下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚
-ã“ã®è¨­å®šã¯ã€Œãƒ‘ブリック・アクセスã€ãŒã‚ªãƒ•ã«ãªã£ã¦ã‚‹ã¨ãã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚
- </notification>
- <notification label="グループ・アクセスを許å¯" name="HelpEstateAllowGroup">
- ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„るグループã¨
-下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸä½äººã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚
-ã“ã®è¨­å®šã¯ã€Œãƒ‘ブリック・アクセスã€ãŒã‚ªãƒ•ã«ãªã£ã¦ã‚‹ã¨ãã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚
- </notification>
- <notification label="嫌ãŒã‚‰ã›ã«é–¢ã™ã‚‹ãƒ¡ãƒ¼ãƒ«å…ˆ" name="HelpEstateAbuseEmailAddress">
- ã“れを有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«è¨­å®šã™ã‚‹ã¨ã€ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã“ã®ä¸å‹•産ã«ãŠã„ã¦è¡Œã‚れãŸ
-嫌ãŒã‚‰ã›ã®å ±å‘ŠãŒé€ä¿¡ã•れるよã†ã«ãªã‚Šã¾ã™ã€‚
-設定を行ã‚ãªã„å ´åˆï¼ˆç©ºç™½ï¼‰ã€å«ŒãŒã‚‰ã›å ±å‘Šã¯ Linden Lab ã«ã®ã¿
-é€ä¿¡ã•れã¾ã™ã€‚
- </notification>
- <notification label="アクセス拒å¦" name="HelpEstateBanResident">
- ã“ã®ãƒªã‚¹ãƒˆã®ä½äººã¯ã€ä»–ã®è¨­å®šã«ã‹ã‹ã‚らãšã€ã‚ãªãŸã®ä¸å‹•産ã¸ã®
-アクセスãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
- </notification>
- <notification label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="HelpEstateVoiceChat">
- ã“ã®ä¸å‹•産ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹
-独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-デフォルト: オフ
+アダルト専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
</notification>
<notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch">
- ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® [APP_NAME] ã¯ã€
-ã“ã®åœ°åŸŸã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。
-ボイスãƒãƒ£ãƒƒãƒˆã‚’æ­£ã—ã使用ã™ã‚‹ã«ã¯ã€
-[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚
- </notification>
- <notification label="ä¸å‹•産約款" name="HelpEstateCovenant">
- ä¸å‹•産約款を定ã‚ã‚‹ã¨ã€è‡ªåˆ†ã®ä¸å‹•産内ã®åŒºç”»ã‚’販売ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
-約款を定ã‚ã¦ã„ãªã„ã¨åœŸåœ°ã¯å£²ã‚Œã¾ã›ã‚“。
-土地ã«é–¢ã™ã‚‹è¦å‰‡ã‚’é©ç”¨ã—ãŸããªã‹ã£ãŸã‚Šã€è³¼å…¥å‰ã«åœŸåœ°ã«é–¢ã™ã‚‹æƒ…報を購入者ã«çŸ¥ã‚‰ã›ãŸããªã„å ´åˆã€ã‚ãªãŸã®ç´„款ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã¯ç™½ç´™ã§ã‹ã¾ã„ã¾ã›ã‚“。
-
-約款ã¯è³¼å…¥ã‚’考ãˆã¦ã„る人ã«ã€è¦å‰‡ã€ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³ã€æ–‡åŒ–的情報や
-å˜ã«ã‚ãªãŸãŒæœŸå¾…ã™ã‚‹ã“ã¨ã‚’ä¼ãˆã‚‹ãŸã‚ã«ã‚‚使ãˆã¾ã™ã€‚
-ã“ã“ã«ã¯ã€åŒºç”»è¦åˆ¶ã€å»ºé€ ç‰©è¦åˆ¶ã€æ”¯æ‰•ã„オプションã€ãれã‹ã‚‰è³¼å…¥è€…ãŒäº‹å‰ã«ç›®ã‚’通ã—ã¦åŒæ„ã—ã¦ãŠãã¹ãã ã¨ã‚ãªãŸãŒæ€ã†é‡è¦ãªæƒ…報をã™ã¹ã¦å…¥ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-購入者ãŒãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ç´„款ã«åŒæ„ã—ãªã„ã‹ãŽã‚Šã€è³¼å…¥ã®æ‰‹ç¶šãã¯å®Œäº†ã—ã¾ã›ã‚“。
-ä¸å‹•産約款ãŒå®šã‚られã¦ã„る区画ã§ã‚れã°ã€ã€ŒåœŸåœ°æƒ…å ±ã€ã‹ã‚‰ç´„款をã„ã¤ã§ã‚‚閲覧ã§ãã¾ã™ã€‚
+ [APP_NAME] ã®ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãŠã‘るボイスãƒãƒ£ãƒƒãƒˆã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。 ボイスãƒãƒ£ãƒƒãƒˆã‚’正常ã«è¡Œã†ãŸã‚ã«ã¯ã€[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚
</notification>
<notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner">
- 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly">
@@ -2031,62 +1669,64 @@ RGBã€256x256ã§ã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13
é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner">
- 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="BuyOriginal">
- オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚
+ オリジナルã®ã‚ªãƒ–ジェクトを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
-変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyOriginalNoOwner">
- L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ
-ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚
+ L$ [PRICE] ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
-変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyCopy">
- コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+ コピーを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+å¯èƒ½ãªæ“作ã¯ã€
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyCopyNoOwner">
- L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+ L$ [PRICE] ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+å¯èƒ½ãªæ“作ã¯ã€
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyContents">
- コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+ 中身を [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyContentsNoOwner">
- L$[PRICE]ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+ L$ [PRICE] ã§ä¸­èº«ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmPurchase">
ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
[ACTION]
-ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ
+購入を続ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmPurchasePassword">
ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
[ACTION]
-ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ
-パスワードをå†å…¥åŠ›ã—ã€ã€ŒOKã€ã‚’クリックã—ã¦ãã ã•ã„。
+購入を続ã‘ã¾ã™ã‹ï¼Ÿ
+パスワードをå†å…¥åŠ›ã—ã€ã€Œ OK ã€ã‚’クリックã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="ConfirmPurchase" text="OK"/>
@@ -2095,77 +1735,48 @@ RGBã€256x256ã§ã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13
</notification>
<notification name="SetPickLocation">
メモ:
-本ピックã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€
+本ピックã®ä½ç½®ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€
ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromObject">
- ã€Œã‚³ãƒ”ãƒ¼ç¦æ­¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚
+ 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ã‚³ãƒ”ãƒ¼ç¦æ­¢ã®æŒã¡ç‰©ã‚’オブジェクトã‹ã‚‰ç§»å‹•ã•ã›ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
- ã€Œã‚³ãƒ”ãƒ¼ç¦æ­¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れるã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚
-ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨
+ 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãšã«ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
+ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã›ã‚‹ã¨
スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’移動ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ã‚³ãƒ”ãƒ¼ç¦æ­¢ã®æŒã¡ç‰©ã‚’スクリプト付ãオブジェクトã‹ã‚‰ç§»å‹•ã•ã›ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- 警告:「クリックã§ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã„ã€ã®è¨­å®šãŒã•れã¾ã—ãŸã€‚
-ãŸã ã—ã€ã“れã¯ã‚¹ã‚¯ãƒªãƒ—トãŒé‡‘銭money() イベントã«è¿½åŠ ã•れãŸå ´åˆã«ã®ã¿ä½œå‹•ã—ã¾ã™ã€‚
+ 警告: クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨­å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚
<form name="form">
- <ignore name="ignore" text="money()イベントãªã—ã«ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚’設定ã™ã‚‹ã¨ã"/>
+ <ignore name="ignore" text="オブジェクトを作æˆä¸­ã«ã€money() スクリプトを入れãšã«ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’設定ã—ãŸã¨ã"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚りã¾ã›ã‚“。
</notification>
<notification name="WebLaunchAccountHistory">
- [SECOND_LIFE] ウェブ・ページを開ã„ã¦
-アカウント履歴を確èªã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="アカウント履歴ã®ã‚¦ã‚§ãƒ–・ページをロードã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
- </notification>
- <notification name="ClickOpenF1Help">
- [SECOND_LIFE] ã®ã‚µãƒãƒ¼ãƒˆã‚¦ã‚§ãƒ–サイトを利用ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="[SECOND_LIFE] ã®ã‚µãƒãƒ¼ãƒˆã‚¦ã‚§ãƒ–サイトを閲覧ã™ã‚‹ã«ã‚ãŸã£ã¦ã€‚" name="okcancelignore" notext="キャンセル" yestext="行ã"/>
+ [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
</notification>
<notification name="ConfirmQuit">
- 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="[APP_NAME] ã®çµ‚了ã«ã‚ãŸã£ã¦ã€‚" name="okcancelignore" notext="継続" yestext="終了"/>
+ 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- 利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã®å ±å‘Šã«ã“ã®ãƒ„ールをã”使用ãã ã•ã„。 å‚照:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã«é–¢ã™ã‚‹å…¨ã¦ã®ãƒ¬ãƒãƒ¼ãƒˆã¯ã€èª¿æŸ»ã•れã€è§£æ±ºã•れã¾ã™ã€‚
-以下ã®ãƒªãƒ³ã‚¯å…ˆã®è¢«å®³å ±å‘Šã«ã¦ãã®ç¢ºèªã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- é‡è¦ï¼š ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã¯Linden Lab 社ã§ã¯ãªãã€
-ã‚ãªãŸãŒç¾åœ¨ã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«é€ã‚‰ã‚Œã¾ã™ã€‚
--
-ã‚ãªãŸãŒä»Šã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€
-ä½äººã¨è¨ªå•者ã¸ã®ã‚µãƒ¼ãƒ“スã®ä¸€ç’°ã¨ã—ã¦ã€ã“ã®åœ°åŸŸã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’ã™ã¹ã¦å—ã‘付ã‘ã€è§£æ±ºã™ã‚‹ã“ã¨ã«åŒæ„ã—ã¦ã„ã¾ã™ã€‚
-よã£ã¦Linden Lab 社ãŒã€
-ã‚ãªãŸãŒã“ã“ã‹ã‚‰æå‡ºã™ã‚‹ãƒ¬ãƒãƒ¼ãƒˆã‚’調査ã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。
-地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ä¸å‹•ç”£ç´„æ¬¾ã§æŒ‡å®šã—ã¦ã„る地元ã®è¦å‰‡ã‚’基ã«ã€å ±å‘Šã•れãŸå•題を解決ã—ã¾ã™ã€‚
-(「世界ã€ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã¨ã€ç´„款を閲覧ã§ãã¾ã™ï¼‰
--
-ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹è§£æ±ºç­–ã¯ã€ã“ã®åœ°åŸŸã«ã ã‘当ã¦ã¯ã¾ã‚Šã¾ã™ã€‚
-ä½äººãŒ[SECOND_LIFE] ã®ä»–ã®åœ°åŸŸã¸ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã€
-ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã®çµæžœã«å½±éŸ¿ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。
-Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹
-ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™æ¨©ã‚’æŒã£ã¦ã„ã¾ã™ã€‚
+ ã“ã®ãƒ„ールを利用ã—㦠[http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã®é•åを報告ã—ã¦ãã ã•ã„。
+
+報告ã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚
</notification>
<notification name="HelpReportAbuseSelectCategory">
嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
@@ -2192,63 +1803,54 @@ Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹
嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- ä½äººã®çš†æ§˜ã¸ã€
+ ã“ã‚“ã«ã¡ã¯ã€
-知的財産ã®ä¾µå®³ã«é–¢ã™ã‚‹å ±å‘Šã‚’行ã†éš›ã«ã¯ã€ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+知的財産権ã®ä¾µå®³ã‚’報告ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ 正確ã«å ±å‘Šã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ã”確èªãã ã•ã„:
-(1) 嫌ãŒã‚‰ã›ã®å ±å‘Šã®ãƒ—ロセス
-[SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã‚’悪用ã—ã¦ã„ã‚‹ä½äººã‚’見ã¤ã‘ãŸã‚‰ã€
-嫌ãŒã‚‰ã›ã®å ±å‘Šã‚’行ã£ã¦ãã ã•ã„。
-例ãˆã°ã‚³ãƒ”ーBotã®ä½¿ç”¨ã€ãれã«ä¼¼ãŸãƒ„ールã®ä½¿ç”¨ã«ã‚ˆã‚‹çŸ¥çš„財産権ã®ä¾µå®³ãŒã‚りã¾ã™ã€‚
-アビューズãƒãƒ¼ãƒ ã¯èª¿æŸ»ã«åŸºã¥ãã€
-[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã‚„
-利用è¦ç´„ã«é•åã™ã‚‹è¡Œç‚ºã¨åˆ¤æ–­ã•れãŸå ´åˆã«ã¯é©åˆ‡ãªå‡¦ç½®ã‚’行ã£ã¦ã„ã¾ã™ã€‚
-ãŸã ã—ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’[SECOND_LIFE] ã‹ã‚‰æ’¤åŽ»ã—ã¦ã»ã—ã„ã€
-ã¨ã„ã£ãŸè¦æœ›ã«ã¯ã‚¢ãƒ“ューズãƒãƒ¼ãƒ ã¯å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+(1) 嫌ãŒã‚‰ã›ã®å ±å‘Šã®æ‰‹é † ä½äººãŒ [SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã‚’悪用ã—ã¦ã„ã‚‹ã®ã‚’見ã¤ã‘ãŸã‚‰ã€å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚例ãˆã°ã€CopyBot ã‚„ä¼¼ãŸã‚ˆã†ãªã‚³ãƒ”ーツールを使用ã—ã¦çŸ¥çš„財産権を侵害ã—ã¦ã„ã‚‹å ´åˆã§ã™ã€‚ 担当ãƒãƒ¼ãƒ ã¯èª¿æŸ»ã‚’行ã„ã€[SECOND_LIFE] [http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã«é•åã™ã‚‹è¡Œç‚ºã«å¯¾ã™ã‚‹é©åˆ‡ãªå‡¦ç½°ã‚’下ã—ã¾ã™ã€‚ ãŸã ã—ã€æ‹…当ãƒãƒ¼ãƒ ã¯ [SECOND_LIFE] ã®ä¸–界ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を削除ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¿œã˜ã¾ã›ã‚“。
-(2) DMCA(デジタルミレニアム著作権法)åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„撤去プロセス
-[SECOND_LIFE] ã‹ã‚‰ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã‚’ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã‚‹ã«ã¯ã€
-è‘—ä½œæ¨©ä¾µå®³é€šçŸ¥ã®æå‡ºã‚’è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚
-å‚照: http://secondlife.com/corporate/dmca.php
+(2) DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã®æ‰‹é † コンテンツを [SECOND_LIFE] ã‹ã‚‰å‰Šé™¤ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ã‚‹ã«ã¯ã€å¼Šç¤¾ [http://secondlife.com/corporate/dmca.php DMCA ãƒãƒªã‚·ãƒ¼] ã§æç¤ºã•れã¦ã„ã‚‹ã¨ãŠã‚Šã€æœ‰åйãªä¾µå®³ã®é€šçŸ¥ã‚’æå‡ºã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。.
-ã“ã®ä»¶ã«é–¢ã™ã‚‹å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ã‚‹éš›ã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦ãã ã•ã„ã€‚é¸æŠžã™ã¹ãカテゴリã¯ã€ŒçŸ¥çš„財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã»ã†ãŒé©ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ã®ã§ã”確èªãã ã•ã„。
+ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚
-よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚
+ã”å”力ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
Linden Lab
</notification>
<notification name="FailedRequirementsCheck">
- 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™
+ 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER] ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™
[COMPONENTS]
</notification>
<notification label="既存ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment">
- 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚
+ 体ã®ã“ã®éƒ¨ä½ã«ã¯æ—¢ã«ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚
é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ
<form name="form">
- <ignore name="ignore" save_option="true" text="ç¾åœ¨ã€è£…ç€ã—ã¦ã„ã‚‹ã‚‚ã®ã‚’ç½®æ›ã™ã‚‹ã¨ã"/>
+ <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’入れ替ãˆã‚‹ã¨ã"/>
<button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/>
<button ignore="交æ›ã—ãªã„" name="No" text="キャンセル"/>
</form>
</notification>
<notification label="å–り込ã¿ä¸­ã®è­¦å‘Š" name="BusyModePay">
- ç¾åœ¨ã€å–り込ã¿ä¸­ã®ãŸã‚ã€ã“ã®æ”¯æ‰•ã„ã¨
-å¼•ãæ›ãˆã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒ
-ã§ãã¾ã›ã‚“。
+ ç¾åœ¨ã€ã€Œå–り込ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-ã“ã®å–引を完了ã™ã‚‹å‰ã«ã€å–り込ã¿ä¸­ã®è¨­å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
- <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸­ã®äººã¾ãŸã¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã¨ã"/>
- <button ignore="常ã«å–り込ã¿ä¸­ã®è¨­å®š" name="Yes" text="OK"/>
- <button ignore="å–り込ã¿ä¸­ã®è¨­å®šã«ã—ãªã„" name="No" text="キャンセル"/>
+ <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/>
+ <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除" name="Yes" text="OK"/>
+ <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’継続" name="No" text="キャンセル"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ 「 [FOLDERNAME] 〠ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ•ォルダã§ã™ã€‚ システムフォルダを削除ã™ã‚‹ã¨ä¸å®‰å®šã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- ゴミ箱フォルダã®ä¸­èº«ã‚’完全ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©å†…ã®ã€Œã”ã¿ç®±ã€ãƒ•ォルダを空ã«ã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ ã”ã¿ç®±ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- 本当ã«ãƒ–ラウザã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’クリアã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
+ トラベルã€Webã€æ¤œç´¢ã®å±¥æ­´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
本当ã«ã‚¯ãƒƒã‚­ãƒ¼ã‚’クリアã—ã¾ã™ã‹ï¼Ÿ
@@ -2259,232 +1861,36 @@ Linden Lab
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- éºå¤±ç‰©ãƒ•ォルダã®ä¸­èº«ã‚’完全ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©å†…ã®ã€Œéºå¤±ç‰©ã€ãƒ•ォルダを空ã«ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ 紛失物ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CopySLURL">
- 以下ã®SLurlãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸã€‚
+ 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š
[SLURL]
-ä»–ã®äººãŒã‚¢ã‚¯ã‚»ã‚¹ã—ã‚„ã™ã„よã†ã«ã‚¦ã‚§ãƒ–・ページã«è¼‰ã›ãŸã‚Šã€
-ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒ»ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦ã€è‡ªåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã¿ã¾ã—ょã†ã€‚
+Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Web ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。
<form name="form">
- <ignore name="ignore" text="SLurlをクリップボードã«ã‚³ãƒ”ーã™ã‚‹ã¨ã"/>
+ <ignore name="ignore" text="クリップボード㫠SLurl をコピーã™ã‚‹ã¨ã"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- ã“ã®ãƒ‘ãƒãƒ«ã§ã¯ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºã¨è§£åƒåº¦ã€ãŠã‚ˆã³ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ã‚°ãƒ©ãƒ•ィックã®å“質を設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚「環境設定ã€ï¼žã€Œè¡¨ç¤ºã€ã®ã‚¤ãƒ³ã‚¿ãƒ•ェースã§ã¯ã€ä½Žã€ä¸­ã€é«˜ã€è¶…高ã®4ã¤ã®ä¸­ã‹ã‚‰ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ãƒ¬ãƒ™ãƒ«ã‚’é¸æŠžã§ãã¾ã™ã€‚ã¾ãŸã€ã€Œã‚«ã‚¹ã‚¿ãƒ ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã€ä»¥ä¸‹ã®ã‚°ãƒ©ãƒ•ィックスã®è¨­å®šã‚’カスタマイズã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
-
-シェーダー:ピクセル・シェーダーã®ã•ã¾ã–ã¾ãªç¨®é¡žã‚’有効ã¾ãŸã¯ç„¡åйã«ã—ã¾ã™ã€‚
-
-å射詳細:水ãŒåå°„ã™ã‚‹ã‚ªãƒ–ジェクトã®ç¨®é¡žã‚’設定ã—ã¾ã™ã€‚
-
-ã‚¢ãƒã‚¿ãƒ¼ãƒ»ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼šã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã‚‹ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ–¹æ³•ã«å½±éŸ¿ã™ã‚‹ã‚ªãƒ—ションを設定ã—ã¾ã™ã€‚
-
-æç”»è·é›¢ï¼šã‚ãªãŸã®è¦–点ã‹ã‚‰è¦–界ã®ã©ã®ãらã„ã®è·é›¢ã¾ã§ã€ã‚ªãƒ–ジェクトãŒãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•れるã‹ã«å½±éŸ¿ã—ã¾ã™ã€‚
-
-最大パーティクル数:画é¢ã«ä¸€åº¦ã«è¦‹ã‚‹ã“ã¨ãŒã§ãã‚‹ãƒ‘ãƒ¼ãƒ†ã‚£ã‚¯ãƒ«ã®æœ€å¤§æ•°ã‚’設定ã—ã¾ã™ã€‚
-
-ãƒã‚¹ãƒˆãƒ—ロセスå“質:グロー効果(è¼ã)ãŒãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•れる際ã®è§£åƒåº¦ã‚’設定ã—ã¾ã™ã€‚
-
-メッシュ詳細: 特定ã®ã‚ªãƒ–ジェクトã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ™‚ã®ç´°éƒ¨è¡¨ç¾ã€ã¾ãŸã¯ä¸‰è§’å½¢ã®æ•°ã‚’設定ã—ã¾ã™ã€‚ 値を大ããã™ã‚‹ã»ã©ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ãŒã€ã‚ªãƒ–ジェクトãŒã‚ˆã‚Šè©³ç´°ã«è¡¨ç¤ºã•れã¾ã™ã€‚
-
-ライティング詳細:レンダリングã™ã‚‹å…‰æºã®ç¨®é¡žã‚’é¸æŠžã—ã¾ã™ã€‚
-
-地形詳細: 地形テクスãƒãƒ£ã®ç´°éƒ¨è¡¨ç¾ã‚’設定ã—ã¾ã™ã€‚
- </notification>
<notification name="WLSavePresetAlert">
ä¿å­˜ã•れãŸäº‹å‰è¨­å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="WLDeletePresetAlert">
- [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ
+ 「 [SKY] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="WLNoEditDefault">
デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="WLMissingSky">
- ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
+ ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
</notification>
<notification name="PPSaveEffectAlert">
ãƒã‚¹ãƒˆãƒ—ロセス効果ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
- <notification name="HelpEditSky">
- ウィンドライトã®å„種スライダーを編集ã—ã¦ç©ºã‚’作æˆãŠã‚ˆã³ä¿å­˜ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpEditDayCycle">
- 1 日を通ã—ã¦å¤‰åŒ–ã™ã‚‹ç©ºã®æ§˜å­ã‚’設定ã—ã¾ã™ã€‚
- </notification>
- <notification name="EnvSettingsHelpButton">
- 次ã®å„設定ã¯ã‚³ãƒ³ãƒ”ュータ上ã§ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ç’°å¢ƒãŒã©ã®ã‚ˆã†ã«è¡¨ç¤ºã•れるã‹ã‚’調整ã—ã¾ã™ã€‚ 設定ã®ã™ã¹ã¦ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィック・カードãŒå‘¨å›²ï¼ˆå¤§æ°—)シェーダー (atmospheric shaders) をサãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-
-「時間帯ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãƒ“ューワã§å®Ÿéš›ã«ä½¿ç”¨ã™ã‚‹æ™‚間帯を変更ã§ãã¾ã™ã€‚
-
-「雲ã®é‡ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šç©ºã‚’ãŠãŠã†é›²ã®é‡ã‚’制御ã§ãã¾ã™ã€‚
-
-「水ã®è‰²ã€ã‚«ãƒ©ãƒ¼ãƒ»ãƒ”ッカーã§è‰²ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®è‰²ã‚’変更ã§ãã¾ã™ã€‚
-
-「水中ã®ãƒ•ォグ効果ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®é€æ˜Žåº¦ã‚’制御ã§ãã¾ã™ã€‚
-
-「ä¸å‹•ç”£ã®æ™‚刻を使用ã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ™‚刻ã¯ãƒªã‚»ãƒƒãƒˆã•れ地域ã®ç¾åœ¨æ™‚刻ã«é€£å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-「空ã®é«˜åº¦ãªè¨­å®šã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šç©ºã®ã‚ˆã‚Šé«˜åº¦ãªè¨­å®šã‚’行ã†ãŸã‚ã®ç·¨é›†ãƒ—ログラムを起動ã§ãã¾ã™ã€‚
-
-「水ã®é«˜åº¦ãªè¨­å®šã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®ã‚ˆã‚Šé«˜åº¦ãªè¨­å®šã‚’行ã†ãŸã‚ã®ç·¨é›†ãƒ—ログラムを起動ã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpDayCycle">
- 「デイ・サイクル編集ã€ã§ã¯ã€
-[SECOND_LIFE] ã§ã®æ˜¼ã¨å¤œã®ç©ºã®å¤‰åŒ–を制御ã§ãã¾ã™ã€‚
-ã“れã¯ã€ŒåŸºæœ¬ç’°å¢ƒç·¨é›†ã€ã®ã€Œæ™‚間帯ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§ä½¿ç”¨ã•れるサイクルã§ã™ã€‚
-
-「デイ・サイクル編集ã€ã¯ã‚­ãƒ¼ãƒ•レームを設定ã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ã—ã¾ã™ã€‚
-å„キーフレームã«ã¯ãƒ—リセットã•れãŸç©ºã®è¨­å®šãŒé–¢é€£ä»˜ã‘られã¦ã„ã¾ã™ã€‚(時間グラフã«ç°è‰²ã®ç¯€ã¨ã—ã¦è¡¨ç¤ºã•れã¾ã™ï¼‰
-ウィンドライト( WindLight )ã¯ã‚­ãƒ¼ãƒ•レーム間をデータ補間ã—ã€
-時間ã®çµŒéŽã¨ã¨ã‚‚ã«ç©ºã®è‡ªç„¶ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作り出ã—ã¾ã™ã€‚
-
-時間グラフã®ä¸Šã«è¡¨ç¤ºã•れる黄色ã®çŸ¢å°ã¯ã€æ™‚刻をもã¨ã«ã—ãŸç¾åœ¨ã®çœºã‚を表ã—ã¦ã„ã¾ã™ã€‚
-黄色ã®çŸ¢å°ã‚’クリック&ドラッグã™ã‚‹ã“ã¨ã§ã€
-1 æ—¥ã®ç§»ã‚Šå¤‰ã‚りを見るã“ã¨ãŒã§ãã¾ã™ã€‚
-「キーã®è¿½åŠ ã€ãƒœã‚¿ãƒ³ã¾ãŸã¯ã€Œã‚­ãƒ¼ã®å‰Šé™¤ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€
-時間グラフã®å³å´ã«ã‚­ãƒ¼ãƒ•レームを追加ã‚ã‚‹ã„ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-ã‚­ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ã®æ™‚刻を指定ã™ã‚‹ã«ã¯ã€
-æ™‚é–“ã‚°ãƒ©ãƒ•ã«æ²¿ã£ã¦ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã‹ã€Œã‚­ãƒ¼ãƒ•レームã®è¨­å®šã€ã®ãƒ•レーム内ã§å€¤ã‚’直接入力ã—ã¾ã™ã€‚
-「キーフレームã®è¨­å®šã€ã®ãƒ•レーム内ã§ã¯ã‚­ãƒ¼ãƒ•レームã«ã‚¦ã‚£ãƒ³ãƒ‰ãƒ©ã‚¤ãƒˆï¼ˆ WindLight )ã®äº‹å‰è¨­å®šã‚’関連付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-
-「サイクルã®é•·ã•ã€ã§ã¯1 æ—¥å…¨ä½“ã®æ™‚間を指定ã§ãã¾ã™ã€‚
-ã“ã®å€¤ã‚’低ã設定ã™ã‚‹ã¨ï¼ˆä¾‹ãˆã°2分)ã€24 æ™‚é–“ã®æ™‚間グラフã¯
-実時間㮠2 分間ã«ç›¸å½“ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
-時間グラフã¨ã‚­ãƒ¼ãƒ•レーム・サイクルã®è¨­å®šãŒå®Œäº†ã—ãŸã‚‰ã€
-「å†ç”Ÿã€ãƒœã‚¿ãƒ³ã¨ã€Œåœæ­¢ã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦çµæžœã‚’プレビューã—ã¦ã¿ã¾ã—ょã†ã€‚
-ã¾ãŸã€æ™‚間グラフ上ã®é»„è‰²ã„æ™‚刻表示矢å°ã‚’移動ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã‚‚サイクルã®å¤‰åŒ–をインタラクティブã«ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 「ä¸å‹•ç”£ã®æ™‚刻を使用ã€ãƒœã‚¿ãƒ³ã‚’使用ã™ã‚‹ã“ã¨ã§æ—¥ã®é•·ã•ã¨æ™‚刻ãŒä¸å‹•産ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã«åŒæœŸã•れã¾ã™ã€‚
-
-デイ・サイクルã®è¨­å®šãŒå®Œäº†ã—ãŸã‚‰ã€ã€Œãƒ‡ã‚¤ãƒ»ãƒ†ã‚¹ãƒˆã‚’ä¿å­˜ã€ãƒœã‚¿ãƒ³ãŠã‚ˆã³ã€Œãƒ‡ã‚¤ãƒ»ãƒ†ã‚¹ãƒˆã‚’ロードã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã‚’ä¿å­˜ãŠã‚ˆã³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚
-å°šã€ç¾åœ¨ã®ä»•様ã§ã¯ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã§æŒ‡å®šã§ãã‚‹ã®ã¯
-1 日分ã ã‘ã§ã™ã€‚
- </notification>
- <notification name="HelpBlueHorizon">
- 空ã®è‰²ã‚’調整ã™ã‚‹ã«ã¯ 「R〠(赤)ã€ã€ŒG〠(緑)ã€ã€ŒB〠(é’) ã®å„スライダーを使用ã—ã¾ã™ã€‚  「I〠スライダーを使用ã™ã‚‹ã¨ã€3 ã¤ã® RGB スライダーを一斉ã«å‹•ã‹ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpHazeHorizon">
- 「空ã¨é æ™¯ã®éœ²å…‰ã€ã¯é¢¨æ™¯ã®éœ²å…‰é‡å…¨ä½“を調整ã™ã‚‹ä¸Šã§æœ€ã‚‚便利ãªãƒ‘ラメーター㮠1 ã¤ã§ã™ã€‚ 太陽光ã«ã‚ˆã‚‹ãƒ›ãƒ¯ã‚¤ãƒˆã‚¢ã‚¦ãƒˆç¾è±¡ã‚„æš—ã絞り込んã è¨­å®šãªã©ã€ã•ã¾ã–ã¾ãªéœ²å‡ºè¨­å®šã‚’シミュレーションã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpBlueDensity">
- 「空ã®é…è‰²ã¨æ¿ƒåº¦ã€ã¯ç©ºã¨éœ§ã®å½©åº¦å…¨ä½“ã«å½±éŸ¿ã—ã¾ã™ã€‚ 「I〠スライダーをå³ã«ç§»å‹•ã™ã‚‹ã¨è‰²ã¯æ˜Žã‚‹ããã£ãりã¨ãªã‚Šã¾ã™ã€‚
-ã“ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’左端ã«ç§»å‹•ã™ã‚‹ã¨ã€è‰²ã¯å½©ã‚Šã‚’失ã„ã€ç™½é»’ã«é€€è‰²ã—ã¾ã™ã€‚ 空ã®è‰²ã‚’微調整ã™ã‚‹å ´åˆã¯ã€
-「R〠(赤)〠「G〠(緑)〠「B〠(é’)
-ã®å„スライダーを使用ã—ã¦å½©åº¦ã‚’個別ã«åˆ¶å¾¡ã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpHazeDensity">
- 「大気ã®ä¸é€æ˜Žåº¦ã€ã¯å¤§æ°—中ã®ã©ã‚“よりã¨ã—ãŸç©ºã®é›°å›²æ°—ã€ã‚°ãƒ¬ãƒ¼ãŒã‹ã£ãŸéœ§ã®ãƒ¬ãƒ™ãƒ«ã‚’制御ã—ã¾ã™ã€‚ 濃ã„煙や大気汚染ãªã©
-を表ç¾ã™ã‚‹ã®ã«é©ã—ã¦ã„ã¾ã™ã€‚ 霧やもやãªã©ã®è¡¨ç¾æ‰‹æ®µã¨ã—ã¦ã‚‚効果的ã§ã™ã€‚
- </notification>
- <notification name="HelpDensityMult">
- 「大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…ã€ã¯ç©ºæ°—ã®æ¿ƒåº¦å…¨ä½“を制御ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ ã“ã®å€¤ã‚’低ã設定ã™ã‚‹ã¨ã€Œå¤§æ°—ã®è–„ã„状態ã€ã‚’演出ã—ã€é«˜ã„数値ã«è¨­å®šã™ã‚‹ã¨ã¨ã¦ã‚‚ã©ã‚“よりã¨ã—ãŸã‚¹ãƒ¢ãƒƒã‚°ã®ã‹ã‹ã£ãŸé›°å›²æ°—を表ç¾ã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpDistanceMult">
- ウィンドライトã®è¦–覚的è·é›¢ã‚’調整ã—ã¾ã™ã€‚ 値ã¨ã—ã¦ã‚¼ãƒ­ã‚’設定ã™ã‚‹ã¨ã€åœ°å½¢ãŠã‚ˆã³ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹
-ウィンドライトã®å½±éŸ¿ã‚’効果的ã«å–り消ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ 1 より大ããªå€¤ã‚’設定ã™ã‚‹å ´åˆã€å€¤ãŒå¤§ãããªã‚‹ã«ã¤ã‚Œã¦
-å¤§æ°—ãŒæ¬¡ç¬¬ã«æ¿ƒããªã‚‹ã‚ˆã†ãªåŠ¹æžœãŒå¾—られã¾ã™ã€‚
- </notification>
- <notification name="HelpMaxAltitude">
- 「最大高度ã€ã§ã¯å¤§æ°—中ã®å…‰ã®é‡ã‚’算出ã™ã‚‹ã¨ãã«
-ウィンドライトãŒç®—出ã—ãŸé«˜åº¦ã‚’調整ã—ã¾ã™ã€‚
-1æ—¥ã®çµ‚ã‚りã«å¤•焼ã‘ã®åº¦åˆã„を調整ã™ã‚‹ã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚
- </notification>
- <notification name="HelpSunlightColor">
- 風景ã®ä¸­ã§ç›´å°„日光ã®è‰²ã‚„å¼·ã•を調整ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpSunAmbient">
- 風景ã®ä¸­ã§å‘¨å›²ã‚’ã¨ã‚Šã¾ã大気中ã®ã‚¢ãƒ³ãƒ“エント光ã®è‰²ã‚„å¼·ã•を調整ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpSunGlow">
- 「サイズã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã¯å¤ªé™½ã®å¤§ãã•を制御ã—ã¾ã™ã€‚
-「フォーカスã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã¯ç©ºã‚’背ã«ã—ãŸå¤ªé™½ã®ã‹ã™ã¿å…·åˆã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpSceneGamma">
- 風景ã®ä¸­ã§æ˜Žæš—ã®é…分を調整ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpStarBrightness">
- ç©ºã®æ˜Ÿã®è¼ãを調整ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpTimeOfDay">
- 空ã®å¤ªé™½ã®å ´æ‰€ã‚’調整ã—ã¾ã™ã€‚
-標高ã«ä¼¼ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="HelpEastAngle">
- 空ã®å¤ªé™½ã®å ´æ‰€ã‚’調整ã—ã¾ã™ã€‚
-æ–¹ä½è§’ã«ä¼¼ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudColor">
- 雲ã®è‰²ã‚’編集ã—ã¾ã™ã€‚ 通常ã¯ç™½ã£ã½ã„色をãŠå‹§ã‚ã—ã¾ã™ãŒã€ã‚‚ã¡ã‚ã‚“
-ãŠå¥½ã¿ã®è‰²ã‚’設定ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="HelpCloudDetail">
- 主è¦ãªé›²ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã®ä¸Šã«ãƒ¬ã‚¤ãƒ¤ãƒ¼ã•れãŸè©³ç´°ãªã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’制御ã—ã¾ã™ã€‚ X 㨠Y ã§ãã®ä½ç½®ã‚’制御ã—ã¾ã™ã€‚
-「Dã€ï¼ˆæ¿ƒåº¦ï¼‰ã¯çœŸç¶¿ã®ã‚ˆã†ãªæ§˜å­ã‚„ã€
-雲ã®å‰²ã‚Œç›®ã®æ§˜å­ãªã©é›²ã®å¤–観を制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudDensity">
- 「X〠㨠「Y〠ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§é›²ã®ä½ç½®ã‚’ã€
-「Dã€ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§ãã®å¯†åº¦ã‚’制御ã§ãã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudCoverage">
- 空を覆ã†é›²ã®é‡ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudScale">
- ç©ºã«æµ®ã‹ã¶é›²ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã®ç¸®å°ºã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudScrollX">
- 「Xã€ ã®æ–¹å‘ã«é›²ãŒç§»å‹•ã™ã‚‹éš›ã®é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpCloudScrollY">
- 「Yã€ ã®æ–¹å‘ã«é›²ãŒç§»å‹•ã™ã‚‹éš›ã®é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpClassicClouds">
- ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’有効ã«ã™ã‚‹ã¨ã€WindLight ã®é›²ã«åŠ ãˆã¦ã€[SECOND_LIFE] ã®å¾“æ¥ã®é›²ã‚‚レンダリングã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterFogColor">
- 水中ã®ãƒ•ォグ効果ã«è‰²ã‚’ã¤ã‘ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterFogDensity">
- 水中ã®ãƒ•ォグ効果ã®å¼·å¼±ã€æ°´ä¸­ã§ã©ã®ãらã„ã®è·é›¢ã¾ã§è¦‹æ¸¡ã›ã‚‹ã‹ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpUnderWaterFogMod">
- 「水中ã®ãƒ•ォグ濃度指数ã€ã®åŠ¹æžœã‚’åŠ æ¸›ã—ã¦ã€ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒæ°´ä¸­ã«ã„ã‚‹ã¨ãã€ã©ã®ãらã„é ãã¾ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterGlow">
- æ°´é¢ã®è¼ãã®åº¦åˆã„を制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterNormalScale">
- æ°´é¢ã‚’表ç¾ã™ã‚‹ 3 種類ã®ã•ã–æ³¢ã®ç¸®å°ºã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterFresnelScale">
- ã•ã¾ã–ã¾ãªè§’度ã§ã€åå°„ã™ã‚‹å…‰ã®é‡ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterFresnelOffset">
- åå°„ã™ã‚‹å…‰åº¦ã®é‡ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterScaleAbove">
- 上ã‹ã‚‰æ°´ä¸­ã‚’見ãŸã¨ãã®å…‰ã®å±ˆæŠ˜å…·åˆã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterScaleBelow">
- 水中ã‹ã‚‰è¦‹ãŸã¨ãã®å…‰ã®å±ˆæŠ˜å…·åˆã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- æ³¢ã¨åå°„ã®æ··ã–り具åˆã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterNormalMap">
- å射や屈折を決定ã™ã‚‹ãŸã‚ã«æ°´ã«é‡ã­ã‚‰ã‚Œã‚‹ãƒŽãƒ¼ãƒžãƒ«ãƒ»ãƒžãƒƒãƒ—を制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterWave1">
- 拡大ã•れãŸãƒŽãƒ¼ãƒžãƒ«ãƒ»ãƒžãƒƒãƒ—ãŒç§»å‹•ã™ã‚‹æ–¹å‘(X 軸㨠Y 軸ã§è¡¨ç¾ï¼‰ã¨é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚
- </notification>
- <notification name="HelpWaterWave2">
- 縮å°ã•れãŸãƒŽãƒ¼ãƒžãƒ«ãƒ»ãƒžãƒƒãƒ—ãŒç§»å‹•ã™ã‚‹æ–¹å‘(X 軸㨠Y 軸ã§è¡¨ç¾ï¼‰ã¨é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚
- </notification>
<notification name="NewSkyPreset">
æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
<form name="form">
@@ -2515,7 +1921,7 @@ Linden Lab
デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ChatterBoxSessionStartError">
- [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
[REASON]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -2530,115 +1936,108 @@ Linden Lab
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- ã‚¢ã‚¤ãƒ†ãƒ ãŒæ·»ä»˜ç‰©ã®ä¸€éƒ¨ã§ã‚ã‚‹é–“ã¯ã€
-アイテムを購入ã§ãã¾ã›ã‚“。
+ オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¾ã¾ã§ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
</notification>
- <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails">
- ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
-ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
+ <notification label="引ã出ã—許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails">
+ ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’引ã出ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
+ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ãŒã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- ã‚ãªãŸãŒä½œæˆã—ãŸæœã‚¢ã‚¤ãƒ†ãƒ ã‚’自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æ–°ã—ã„æœã‚’自動的ã«è£…ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="「マイ 容姿ã€ã‚’編集中ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="NotAgeVerified">
- ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã¯ã€
-年齢確èªã‚’行ã†å¿…è¦ãŒã‚りã¾ã™ã€‚
-[SECOND_LIFE] ã®ã‚¦ã‚§ãƒ–サイトã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã€
-年齢確èªã‚’行ã„ã¾ã™ã‹ï¼Ÿ
+ 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=ja
</url>
- <usetemplate ignoretext="å¹´é½¢ã®æœªç¢ºèªã«ã¤ã„ã¦è­¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€æ”¯æ‰•ã„æƒ…å ±ãŒäº‹å‰ã«ç™»éŒ²ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-[SECOND_LIFE] ã®ã‚¦ã‚§ãƒ–サイトã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€è¨­å®šã—ã¾ã™ã‹ï¼Ÿ
+ 支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=ja
</url>
- <usetemplate ignoretext="æ”¯æ‰•ã„æƒ…å ±ã®æœªç™»éŒ²ã«ã¤ã„ã¦è­¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="MissingString">
- 文字列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
+ 文字列 [STRING_NAME] ㌠strings.xml ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
<notification name="Cancelled">
- å–り消ã•れã¾ã—ãŸ
+ å–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="CancelledSit">
- 座るã®ã‚’å–り消ã•れã¾ã—ãŸ
+ 座るã®ã‚’ã‚„ã‚ã¾ã—ãŸã€‚
</notification>
<notification name="CancelledAttach">
- 添付ã¯å–り消ã•れã¾ã—ãŸ
+ 添付ãŒå–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="ReplacedMissingWearable">
- 欠è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚
+ 欠è½ã—ã¦ã„る衣類や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚
</notification>
<notification name="GroupNotice">
- ä»¶å: [SUBJECT], メッセージ: [MESSAGE]
+ ä»¶å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
</notification>
<notification name="FriendOnline">
- [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
</notification>
<notification name="FriendOffline">
- [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™
</notification>
<notification name="AddSelfFriend">
- 自分自身をフレンドã«ã¯ã§ãã¾ã›ã‚“。
+ 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="UploadingAuctionSnapshot">
- インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
-ï¼ˆæ‰€è¦æ™‚間:約5分)
+ インワールド㨠Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
+ï¼ˆæ‰€è¦æ™‚間:約 5 分)
</notification>
<notification name="UploadPayment">
- アップロード㫠L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚
+ アップロード㫠L$ [AMOUNT] 支払ã„ã¾ã—ãŸã€‚
</notification>
<notification name="UploadWebSnapshotDone">
- Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
+ Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
</notification>
<notification name="UploadSnapshotDone">
インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
</notification>
<notification name="TerrainDownloaded">
- raw地形ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ
+ raw 地形ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ
</notification>
<notification name="GestureMissing">
- ジェスãƒãƒ£ãƒ¼[NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。
+ ジェスãƒãƒ£ãƒ¼ã® [NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="UnableToLoadGesture">
- ジェスãƒãƒ£ãƒ¼[NAME] を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
-å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。
+ [NAME] ã¨ã„ã†ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="LandmarkMissing">
データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="UnableToLoadLandmark">
- ランドマークをロードã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ランドマークを読ã¿è¾¼ã‚ã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CapsKeyOn">
- コンピューター㮠Caps LockキーãŒ
-有効ã«ãªã£ã¦ã„ã¾ã™ã€‚パスワード入力ã«
-影響ã™ã‚‹ã®ã§è§£é™¤ã—ã¾ã—ょã†ã€‚
+ CapsLock ã‚­ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚
+パスワードã«å½±éŸ¿ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
</notification>
<notification name="NotecardMissing">
ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。
</notification>
<notification name="NotecardNoPermissions">
- ノートカードを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™
+ ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="RezItemNoPermissions">
- オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚
+ オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="UnableToLoadNotecard">
- ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ロードã§ãã¾ã›ã‚“。
+ ノートカードを読ã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ScriptMissing">
データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。
@@ -2650,67 +2049,66 @@ Linden Lab
スクリプトをロードã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="IncompleteInventory">
- ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã å…¨éƒ¨æƒã„ã¾ã›ã‚“。
-å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã¾ã å…¨éƒ¨æƒã£ã¦ã„ã¾ã›ã‚“。
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CannotModifyProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
+ ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotRemoveProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
+ ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
</notification>
<notification name="OfferedCard">
- ã‚ãªãŸã¯[FIRST] [LAST] ã«
-コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚
+ [FIRST] [LAST] ã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Šã¾ã—ãŸã€‚
</notification>
<notification name="UnableToBuyWhileDownloading">
オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="UnableToLinkWhileDownloading">
オブジェクトデータã®ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
-å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ オブジェクトã¯ä¸€åº¦ã«ä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚
+オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。
</notification>
<notification name="ObjectNotForSale">
- オブジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。
+ ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。
</notification>
<notification name="EnteringGodMode">
- レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™
+ レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™
</notification>
<notification name="LeavingGodMode">
- レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã‚’解除
+ レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™
</notification>
<notification name="CopyFailed">
- コピー権é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ
+ ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="InventoryAccepted">
- [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’å—ã‘入れã¾ã—ãŸã€‚
+ [NAME] ã¯ã€ã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚
</notification>
<notification name="InventoryDeclined">
- [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’断りã¾ã—ãŸã€‚
+ [NAME] ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’断りã¾ã—ãŸã€‚
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
</notification>
<notification name="CallingCardAccepted">
- コーリング・カードãŒå—ç†ã•れã¾ã—ãŸã€‚
+ コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚
</notification>
<notification name="CallingCardDeclined">
- ã‚³ãƒ¼ãƒªãƒ³ã‚°ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
+ ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
</notification>
<notification name="TeleportToLandmark">
- 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚
-[NAME]ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ï¼ˆLandmarksï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
-ランドマークをダブルクリックã—ãŸå¾Œã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã™ã‚‹ã¨ãã®å ´æ‰€ã¸ç§»å‹•ã—ã¾ã™ã€‚
+ ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚
+好ããªãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’クリックã—ã¦é¸ã³ã€æ¬¡ã«ãƒ‘ãƒãƒ«ä¸‹ã®ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
+(ランドマークをダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
</notification>
<notification name="TeleportToPerson">
- 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚
-ä½äººã®[NAME]ã¨æŽ¥è§¦ã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ï¼ˆCalling Cardsï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
-カードをダブルクリックã—ã€ã€ŒIMã‚’é€ã‚‹ã€ã‚’クリックã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。
+ ç”»é¢å³ã®ã€Œäººã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€[NAME] ã¨ã„ã£ãŸä½äººã«é€£çµ¡ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+リストã‹ã‚‰ä½äººã‚’é¸æŠžã—ã¦ã€ãƒ‘ãƒãƒ«ä¸‹ã®ã€ŒIMã€ã‚’クリックã—ã¾ã™ã€‚
+(リストã®åå‰ã‚’ダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒIMã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。
@@ -2720,7 +2118,7 @@ Linden Lab
ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚
</notification>
<notification name="NoContentToSearch">
- å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(PG, Mature, Adult)
+ å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„ã€‚ï¼ˆä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆï¼‰
</notification>
<notification name="GroupVote">
[NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š
@@ -2733,6 +2131,9 @@ Linden Lab
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
イベント通知:
@@ -2745,10 +2146,10 @@ Linden Lab
</form>
</notification>
<notification name="TransferObjectsHighlighted">
- ã“ã®åŒºç”»ä¸Šã«å­˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è­²æ¸¡ã•れるオブジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•れã¾ã™ã€‚
+ ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«å—ã‘æ¸¡ã•れるオブジェクトã¯ã€ã™ã¹ã¦åŒºç”»ä¸Šã§å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
-*譲渡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¾ã›ã‚“。
+*å—ã‘æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã›ã‚“。
<form name="form">
<button name="Done" text="完了"/>
</form>
@@ -2758,89 +2159,97 @@ Linden Lab
[NAMES]
</notification>
<notification name="NoQuickTime">
- Apple社ã®QuickTimeãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã¨æ€ã‚れã¾ã™ã€‚
-ストリーミング・メディアã®å†ç”Ÿã‚’行ã„ãŸã„å ´åˆã¯ã€QuickTimeã®ã‚µã‚¤ãƒˆï¼ˆhttp://www.apple.com/quicktime)ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€QuickTime Player をインストールã—ã¦ãã ã•ã„。
+ Apple ã® QuickTime ソフトウェアãŒãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„よã†ã§ã™ã€‚
+ストリーミングメディアをサãƒãƒ¼ãƒˆã™ã‚‹åŒºç”»ã§è¦‹ãŸã„å ´åˆã¯ã€[http://www.apple.com/jp/quicktime QuickTime サイト] ã‹ã‚‰ QuickTime プレイヤーをインストールã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="NoPlugin">
+ 「 [MIME_TYPE] ã€ã® MIME タイプを扱ã†ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+ </notification>
+ <notification name="MediaPluginFailed">
+ 次ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒå®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
+ [PLUGIN]
+
+プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ <form name="form">
+ <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸã¨ã"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned">
- é¸æŠžã•れã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
[FIRST] [LAST]
- ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned2">
- é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€
-ä½äººã®[NAME]ã®æ‰€æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ 「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="GroupObjectsReturned">
- é¸æŠžã•れã¦ã„る区画上ã«ã‚りã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
-譲渡ã•れã¦ã„ãŸè­²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚
-グループã«è­²æ¸¡ã•れã¦ã„ãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
+譲渡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
+グループã«è­²æ¸¡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="UnOwnedObjectsReturned">
- é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã®ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="ServerObjectMessage">
+ [NAME] ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
- ã“ã®åœŸåœ°ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åŠ¹ï¼ˆã€Œå®‰å…¨ã§ã¯ãªã„ã€ï¼‰ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 命をè½ã¨ã—ãŸå ´åˆã¯ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚
+ ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚
+ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 死んã§ã—ã¾ã£ãŸå ´åˆã¯ã€Œãƒ›ãƒ¼ãƒ ã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚
</notification>
<notification name="NoFly">
- ã“ã®åœŸåœ°ã¯é£›è¡ŒãŒç„¡åŠ¹ï¼ˆã€Œé£›è¡Œç¦æ­¢ã€ï¼‰ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-ã“ã“ã§é£›ã¶ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
+ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。
</notification>
<notification name="PushRestricted">
- ã“ã®åœŸåœ°ã§ã¯ã€Œãƒ—ãƒƒã‚·ãƒ³ã‚°ç¦æ­¢ã€ã§ã™ã€‚
-土地所有者以外ã¯ã“ã“ã§ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="NoVoice">
- ã“ã®åœŸåœ°ã¯ãƒœã‚¤ã‚¹ãŒç„¡åйã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="NoBuild">
- ã“ã®åœŸåœ°ã¯ã‚ªãƒ–ジェクトã®ä½œæˆç¦æ­¢ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-ã“ã“ã§ã‚ªãƒ–ジェクトを作るã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ScriptsStopped">
- 管ç†è€…ãŒã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ­¢ã•ã›ã¾ã—ãŸã€‚
+ 管ç†è€…ãŒã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ­¢ã—ã¾ã—ãŸã€‚
</notification>
<notification name="ScriptsNotRunning">
- ã“ã®åœ°åŸŸã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ­¢ã•れã¦ã„ã¾ã™
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="NoOutsideScripts">
- ã“ã®åœŸåœ°ã§ã¯å¤–部スクリプトãŒç„¡åйã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-ï¼ˆã€Œå¤–éƒ¨ã‚¹ã‚¯ãƒªãƒ—ãƒˆç¦æ­¢ã€ï¼‰
-土地所有者以外ã®ã‚¹ã‚¯ãƒªãƒ—トã¯èµ·å‹•ã§ãã¾ã›ã‚“
+ ã“ã®åœŸåœ°ã§ã¯ã€å¤–部ã®ã‚¹ã‚¯ãƒªãƒ—トãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
+
+土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå®Ÿè¡Œã•れã¾ã›ã‚“。
</notification>
<notification name="ClaimPublicLand">
- 自分ãŒã„る地域ã§ã®ã¿å…¬å…±ã®åœŸåœ°ã‚’ç²å¾—ã§ãã¾ã™ã€‚
+ ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ãªã„ã¨å…¬å…±ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="RegionTPAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。
ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
</notification>
<notification name="URBannedFromRegion">
- ã‚ãªãŸã¯åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="NoTeenGridAccess">
ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。
</notification>
- <notification name="NoHelpIslandTP">
- Help Islandã«ã¯æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-「Help Island Publicã€ã«è¡Œãã€
-å†åº¦ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’行ã£ã¦ãã ã•ã„。
- </notification>
<notification name="ImproperPaymentStatus">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。
</notification>
- <notification name="MustGetAgeRegion">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+ <notification name="MustGetAgeRgion">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
<notification name="MustGetAgeParcel">
ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
<notification name="NoDestRegion">
- 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ 目的地ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="NotAllowedInDest">
目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。
@@ -2858,20 +2267,20 @@ Linden Lab
テレãƒãƒ¼ãƒˆãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
</notification>
<notification name="FullRegionTryAgain">
- å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚
+ å…¥ã‚ã†ã¨ã—ã¦ã„るリージョン(地域)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚
ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="GeneralFailure">
よãã‚る失敗
</notification>
<notification name="RoutedWrongRegion">
- ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ ç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="NoValidAgentID">
- エージェントIDãŒç„¡åйã§ã™ã€‚
+ エージェント ID ãŒç„¡åйã§ã™ã€‚
</notification>
<notification name="NoValidSession">
- セッションIDãŒç„¡åйã§ã™ã€‚
+ セッション ID ãŒç„¡åйã§ã™ã€‚
</notification>
<notification name="NoValidCircuit">
回路コードãŒç„¡åйã§ã™ã€‚
@@ -2886,7 +2295,7 @@ Linden Lab
内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
</notification>
<notification name="NoGoodTPDestination">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="InternalErrorRegionResolver">
内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
@@ -2898,34 +2307,35 @@ Linden Lab
有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ObjectGiveItem">
- [FIRST] [LAST]所有ã®ã€
-[OBJECTFROMNAME]ã‹ã‚‰ã€
-[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚
+ [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="å—ã‘å–ã‚‹"/>
<button name="Discard" text="破棄"/>
- <button name="Mute" text="無視リストã¸"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- (未知ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ 所有ã®[OBJECTFROMNAME]ã‹ã‚‰ã€
-ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚
+ ï¼ˆä¸æ˜Žã®ä½äººï¼‰ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="å—ã‘å–ã‚‹"/>
<button name="Discard" text="破棄"/>
- <button name="Mute" text="無視リストã¸"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME]ã¯ã€ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†åå‰ã®[OBJECTTYPE]を渡ã—ã¾ã—ãŸã€‚
+ [NAME_SLURL] ãŒã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="å—ã‘å–ã‚‹"/>
+ <button name="Show" text="表示"/>
<button name="Discard" text="破棄"/>
- <button name="Mute" text="無視リストã¸"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2937,7 +2347,7 @@ Linden Lab
</form>
</notification>
<notification name="TeleportOffered">
- [NAME]ã¯ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆã§å‘¼ã³å¯„ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ï¼š
+ [NAME] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚
[MESSAGE]
<form name="form">
@@ -2945,6 +2355,9 @@ Linden Lab
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ [TO_NAME] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã—ãŸã€‚
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2959,83 +2372,85 @@ Linden Lab
[MESSAGE]
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ [TO_NAME] ã«ãƒ•レンド登録を申ã—出ã¾ã—ãŸã€‚
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME]ã¯ã€
フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME]ã¯ã€ãƒ•レンド 登録をå—ã‘入れã¾ã—ãŸã€‚
+ [NAME]ã¯ã€ãƒ•レンド登録をå—ã‘入れã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipDeclined">
- [NAME]ã¯ã€ãƒ•レンド 登録を断りã¾ã—ãŸã€‚
+ [NAME]ã¯ã€ãƒ•レンド登録を断りã¾ã—ãŸã€‚
</notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST]ãŒ
-ã‚ãªãŸã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã£ã¦ãã¾ã—ãŸã€‚
-ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ã™ã°ã‚„ãIMã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ [FIRST] [LAST] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
- ã“ã®åœ°åŸŸã¯[MINUTES]分後ã«å†èµ·å‹•ã•れã¾ã™ã€‚
-強制ログアウトã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 分後ã«å†èµ·å‹•ã•れã¾ã™ã€‚
+ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚
</notification>
<notification name="RegionRestartSeconds">
- ã“ã®åœ°åŸŸã¯[SECONDS]秒後ã«å†èµ·å‹•ã•れã¾ã™ã€‚
-強制ログアウトã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 秒後ã«å†èµ·å‹•ã•れã¾ã™ã€‚.
+ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚
</notification>
<notification name="LoadWebPage">
- ウェブ・ページ[URL]をロードã—ã¾ã™ã‹ï¼Ÿ
+ Web ページ [URL] を読ã¿è¾¼ã¿ã¾ã™ã‹ï¼Ÿ
[MESSAGE]
-ロード元ã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]?
+読ã¿è¾¼ã¿å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€æ‰€æœ‰è€…:[NAME]?
<form name="form">
<button name="Gotopage" text="移動"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="FailedToFindWearableUnnamed">
- データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ データベース㫠[TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</notification>
<notification name="FailedToFindWearable">
- データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ データベース㫠[DESC] ã¨ã„ã†åå‰ã® [TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="InvalidWearable">
- ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME]ビューワを最新ã®ã‚‚ã®ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
+ ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
</notification>
<notification name="ScriptQuestion">
- 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’:
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「 [OBJECTNAME] ã€ã‚’:
[QUESTIONS]
よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
<form name="form">
<button name="Yes" text="ã¯ã„"/>
<button name="No" text="ã„ã„ãˆ"/>
- <button name="Mute" text="無視リストã«è¿½åŠ "/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- 「[OBJECTNAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[NAME]ã€ã¯ã€æ¬¡ã®ã“ã¨ã‚’求ã‚ã¦ã„ã¾ã™ï¼š
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
[QUESTIONS]
-ã“ã®ã‚ªãƒ–ジェクトã¨åˆ¶ä½œè€…ãŒä¿¡ç”¨ã§ããªã„å ´åˆã¯ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。追加情報ã¯ã€è©³ç´°ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。
+ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。
-ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã—ã¾ã™ã‹ï¼Ÿ
+リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ
<form name="form">
<button name="Grant" text="許å¯"/>
<button name="Deny" text="æ‹’å¦"/>
@@ -3043,205 +2458,189 @@ Linden Lab
</form>
</notification>
<notification name="ScriptDialog">
- [FIRST] [LAST]ã®ã€Œ[TITLE]ã€
+ [FIRST] [LAST] ã®ã€Œ [TITLE] ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME]ã®ã€Œ[TITLE]ã€
+ [GROUPNAME] ã®ã€Œ [TITLE] ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- L$[AMOUNT]ã‚’å—ã‘å–りã¾ã—ãŸã€‚
-オブジェクトãŠã‚ˆã³ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚ãªãŸã«ãŠé‡‘を支払ã£ãŸã‚ˆã†ã§ã™ã€‚
-ã‚ãªãŸã®æ®‹é«˜ã¯ç”»é¢ã®å³ä¸Šã«è¡¨ç¤ºã•れ㦠ã„ã¾ã™ã€‚
- </notification>
- <notification name="FirstBalanceDecrease">
- L$[AMOUNT]を支払ã„ã¾ã—ãŸã€‚
-ã‚ãªãŸã®æ®‹é«˜ã¯ç”»é¢ã®å³ä¸Šã«è¡¨ç¤ºã•れ㦠ã„ã¾ã™ã€‚
- </notification>
- <notification name="FirstSit">
- ã‚ãªãŸã¯åº§ã£ã¦ã„ã¾ã™ã€‚
-矢å°ï¼ˆã¾ãŸã¯ AWSD)ã®ã‚­ãƒ¼ã‚’使ã£ã¦
-視点を変ãˆã¾ã™ã€‚
-ç«‹ã¡ä¸ŠãŒã‚‹ã«ã¯ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ã‚’クリックã—ã¾ã™ã€‚
- </notification>
- <notification name="FirstMap">
- 地図をスクロールã™ã‚‹ã«ã¯ã€ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãƒ‰ãƒ©ãƒƒã‚°ã—ã¾ã™ã€‚
-テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ãƒ€ãƒ–ルクリックã—ã¾ã™ã€‚
-å³å´ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ç‰©ã‚’見ã¤ã‘ãŸã‚Šã€åˆ¥ã®èƒŒæ™¯ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- </notification>
- <notification name="FirstBuild">
- [SECOND_LIFE] ã«ã¯ã€
-æ–°ã—ã„オブジェクトを作るã“ã¨ãŒã§ãる地域ãŒã‚りã¾ã™ã€‚
-作æˆã«ã¯ç”»é¢ä¸Šéƒ¨å·¦ã®ãƒ„ールãŒä½¿ãˆã€
-CtrlキーやAltキーを押ã—ãŸã¾ã¾ã«ã™ã‚Œã°
-ç´ æ—©ãツールを切り替ãˆã‚‰ã‚Œã¾ã™ã€‚
-Escキーを押ã™ã¨ã€ä½œæˆã¯çµ‚了ã—ã¾ã™ã€‚
- </notification>
- <notification name="FirstLeftClickNoHit">
- 左クリックã§ç‰¹åˆ¥ãªã‚ªãƒ–ジェクトをæ“作ã§ãã¾ã™ã€‚
-マウス・ãƒã‚¤ãƒ³ã‚¿ãŒæ‰‹ã®ãƒžãƒ¼ã‚¯ã«å¤‰ã‚ã‚‹ã¨ã€ãƒã‚¤ãƒ³ãƒˆã—ã¦ã„るオブジェクトをæ“作ã§ãã¾ã™ã€‚
-å³ã‚¯ãƒªãƒƒã‚¯ã§å®Ÿè¡Œå¯èƒ½ãªæ“作ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
- </notification>
- <notification name="FirstTeleport">
- ã“ã®åœ°åŸŸã§ã¯ã€ãƒã‚¤ãƒ³ãƒˆé–“ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒèªã‚られã¦ã„ã¾ã›ã‚“ã®ã§ã€æœ€ã‚‚è¿‘ã„テレãƒãƒ–周辺ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
-ã‚ãªãŸã®ç›®çš„地ã¯ã€å¤§ããªæ¨™è­˜ï¼ˆãƒ“ーコン)ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚赤ã„矢å°ã«å‘ã‹ã£ã¦é€²ã‚€ã¨æ¨™è­˜ï¼ˆãƒ“ーコン)ã¸è¾¿ã‚Šç€ãã¾ã™ã€‚
-矢å°ã‚’クリックã™ã‚‹ã¨æ¨™è­˜ï¼ˆãƒ“ーコン)を消ã›ã¾ã™
+ <notification name="ScriptToast">
+ [FIRST] [LAST] ã®ã€Œ [TITLE] ã€ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ãƒ—ットをリクエストã—ã¦ã„ã¾ã™ã€‚
+ <form name="form">
+ <button name="Open" text="ダイアログを開ã"/>
+ <button name="Ignore" text="無視"/>
+ <button name="Block" text="ブロック"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
+
+ã‚ãªãŸã® L$ 残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚ 処ç†ã« 20 分以上ã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$ 残高ã«è¿½åŠ ã•れã¾ã™ã€‚
+
+[http://secondlife.com/account/ マイアカウント] ã®å–引履歴ページã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚
</notification>
<notification name="FirstOverrideKeys">
ã‚ãªãŸã®ç§»å‹•ã‚­ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚
-矢å°ã‹AWSDã®ã‚­ãƒ¼ã§å‹•作を確èªã—ã¦ãã ã•ã„。
-銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
- </notification>
- <notification name="FirstAppearance">
- ã‚ãªãŸã¯å®¹å§¿ã‚’編集中ã§ã™ã€‚
-回転ã€ã‚ºãƒ¼ãƒ ã™ã‚‹ã«ã¯çŸ¢å°ã‚­ãƒ¼ã‚’使ã„ã¾ã™ã€‚
-編集ãŒçµ‚ã‚ã£ãŸã‚‰ã€Œã™ã¹ã¦ä¿å­˜ã€ã‚’クリックã—ã¦å®¹å§¿ã‚’ä¿å­˜ã—ã€çµ‚了ã—ã¾ã™ã€‚
-容姿ã®ç·¨é›†ã¯ä½•度ã§ã‚‚行ãˆã¾ã™ã€‚
- </notification>
- <notification name="FirstInventory">
- ã“れã¯ã€ã‚ªãƒ–ジェクトã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã€æœã€ãã®ä»–ã‚ãªãŸã®æ‰€æœ‰ç‰©ãŒã™ã¹ã¦å…¥ã£ãŸã€ŒæŒã¡ç‰©ã€ã§ã™ã€‚
-*マウスã§ã‚¢ãƒã‚¿ãƒ¼ã«ã‚ªãƒ–ジェクトやæœè£…フォルダをドラッグã—ã¦è£…ç€ã—ã¾ã™ã€‚
-*オブジェクトを地é¢ã®ä¸Šã«ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã¨ã€å‘¨å›²ã®ä¸–界ã«è¡¨ç¤ºã•ã›ã¾ã™ã€‚(Rez)
-*ノートカードを読むã«ã¯ã€ãƒ€ãƒ–ルクリックã—ã¾ã™ã€‚
+矢å°ã‹ AWSD ã®ã‚­ãƒ¼ã§å‹•作を確èªã—ã¦ãã ã•ã„。
+銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
</notification>
<notification name="FirstSandbox">
- ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã§ã™ã€‚
-ã‚ãªãŸãŒã“ã“ã§ä½œã£ãŸã‚ªãƒ–ジェクトã¯ã‚ãªãŸãŒç«‹ã¡åŽ»ã£ãŸå¾Œã€å‰Šé™¤ã•れるã‹ã‚‚ã—れã¾ã›ã‚“。サンドボックスã¯å®šæœŸçš„ã«æ¸…掃ã•れã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€ç”»é¢ä¸Šéƒ¨ã€åœ°åŸŸåã®éš£ã®æƒ…報をå‚ç…§ã—ã¦ãã ã•ã„。
-
-サンドボックスã¯ç‰¹åˆ¥ãªã‚¨ãƒªã‚¢ã§ã€ç›®å°ã®ã‚µã‚¤ãƒ³ãŒã¤ã„ã¦ã„ã¾ã™ã€‚
- </notification>
- <notification name="FirstFlexible">
- ã“ã®ã‚ªãƒ–ジェクト㯠フレキシブルã§ã™ã€‚
-フレキシブル・ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ãŒå¤–ã•れるã¾ã§ã¯ã€ã‚ªãƒ–ジェクトã¯ç‰©ç†çš„ã§ãªãファントムã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
- </notification>
- <notification name="FirstDebugMenus">
- 高度ãªè¨­å®šã‚’有効ã«ã—ã¾ã—ãŸã€‚
-ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ã¯ã€
-[SECOND_LIFE] をデãƒãƒƒã‚°ã™ã‚‹ãƒ‡ãƒ™ãƒ­ãƒƒãƒ‘ーã«ã¨ã£ã¦
-æœ‰ç”¨ãªæ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚
-ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’切り替ãˆã‚‹ã«ã¯ã€
-Windowsã§ã¯Ctrl+Alt+Dを押ã—ã¾ã™ã€‚
-Macã®å ´åˆã¯ã€&#8997;&#8984;Dを押ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="FirstSculptedPrim">
- スカルプトプリムを編集ã—ã¦ã„ã¾ã™ã€‚
-スカルプトプリムã¯ã€å½¢çŠ¶ã‚’æŒ‡å®šã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒå¿…è¦ã§ã™ã€‚
-æŒã¡ç‰©ãƒ©ã‚¤ãƒ–ラリã§ã€ã‚¹ã‚«ãƒ«ãƒ—トテクスãƒãƒ£ãƒ¼ã®ã‚µãƒ³ãƒ—ルをå‚ç…§ã§ãã¾ã™ã€‚
- </notification>
- <notification name="FirstMedia">
- メディアã®å†ç”Ÿã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚
-オーディオ/ビデオã®ç’°å¢ƒè¨­å®šã§ã€è‡ªå‹•çš„ã«ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹ã‚ˆã†ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-注: ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ä¿¡é ¼ã—ãªã„ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ã‚µã‚¤ãƒˆã«æŽ¥ç¶šã•れるセキュリティ・リスクãŒä¼´ã„ã¾ã™ã€‚
+ ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å­¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。
</notification>
<notification name="MaxListSelectMessage">
- ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
+ ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ [MAX_SELECT] 個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
</notification>
<notification name="VoiceInviteP2P">
- [NAME]ãŒã€ã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
-コールã«å‚加ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–­ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。
+ [NAME] ãŒã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
+å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ミュート"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST]ã«
-インスタント・メッセージãŒé€ä¿¡ã•れã€ç„¡è¦–設定ã¯è‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚
+ [FIRST] [LAST] ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST]ã«ãŠé‡‘を渡ã—ãŸãŸã‚〠無視設定ãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚
+ [FIRST] [LAST] ã¯ãŠé‡‘ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST]ã«æŒã¡ç‰©ã‚’渡ã—ãŸãŸã‚〠無視設定ãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚
+ [FIRST] [LAST] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="VoiceInviteGroup">
- [NAME]ãŒã€ グループ[GROUP]ã¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
-コールã«å‚加ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–­ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。
+ [NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
+å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ミュート"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME]ãŒã€ 会議ãƒãƒ£ãƒƒãƒˆã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
-コールã«å‚加ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–­ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。 ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。
+ [NAME] 㯠コンファレンスãƒãƒ£ãƒƒãƒˆã®ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
+å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ミュート"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME]ãŒã€ ã‚ãªãŸã‚’会議ãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
-ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–­ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。
+ [NAME] ãŒã‚ãªãŸã‚’コンファレンスãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
+å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
- <button name="Mute" text="ミュート"/>
+ <button name="Mute" text="ブロック"/>
</form>
</notification>
<notification name="VoiceChannelFull">
- ã‚ãªãŸãŒå‚加ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ ã‚ãªãŸãŒå‚加ã—よã†ã¨ã—ã¦ã„るボイスコール [VOICE_CHANNEL_NAME] ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ProximalVoiceChannelFull">
ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="VoiceChannelDisconnected">
- [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•れã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME]ã¯ã€ã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ãŒã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘å–れã¾ã›ã‚“。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ã¯ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="VoiceChannelJoinFailed">
- [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="VoiceLoginRetry">
- ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚
+ ボイスãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1 分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚
</notification>
<notification name="Cannot enter parcel: not a group member">
- é©åˆ‡ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã¯ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
</notification>
<notification name="Cannot enter parcel: banned">
ç«‹å…¥ç¦æ­¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="Cannot enter parcel: not on access list">
- アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ アクセスリストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="VoiceNotAllowed">
- ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ ã‚ãªãŸã«ã¯ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="VoiceCallGenericError">
- [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ServerVersionChanged">
- 到ç€ã—ãŸåœ°åŸŸã¯ç•°ãªã‚‹ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å®Ÿè¡Œã•れã¦ã„ã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’クリックã—ã¦ãã ã•ã„。
+ ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ [[URL] リリースノートを確èª]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
+ </notification>
+ <notification name="BlockedSLURL">
+ 信用ã§ããªã„ブラウザã‹ã‚‰ SLurl ãŒé€ã‚‰ã‚Œã¦ããŸã®ã§ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã®ãŸã‚ブロックã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="ThrottledSLURL">
+ 短期間ã®ã‚ã„ã ã«ã€ä¿¡ç”¨ã§ããªã„ブラウザã‹ã‚‰è¤‡æ•°ã® SLurls ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚
+安全ã®ãŸã‚ã«æ•°ç§’間ブロックã•れã¾ã™ã€‚
</notification>
- <notification name="UnableToOpenCommandURL">
- クリックã—ãŸURLã¯ã“ã®ã‚¦ã‚§ãƒ–ブラウザã§ã¯é–‹ã‘ã¾ã›ã‚“
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="返答"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ アタッãƒãƒ¡ãƒ³ãƒˆãŒä¿å­˜ã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ ヘルプトピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </notification>
+ <notification name="ObjectMediaFailure">
+ サーãƒãƒ¼ã‚¨ãƒ©ãƒ¼ï¼š メディアã®ã‚¢ãƒƒãƒ—デートã¾ãŸã¯å¤±æ•—。
+「[ERROR]ã€
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ モデレーターãŒã‚ãªãŸã®æ–‡å­—ãƒãƒ£ãƒƒãƒˆã‚’ミュートã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ モデレーターãŒã‚ãªãŸã®ãƒœã‚¤ã‚¹ã‚’ミュートã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ テレãƒãƒ¼ãƒˆå±¥æ­´ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç¾åœ¨è¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ã˜ã‚…ã†ã¶ã‚“ãªã‚¹ãƒšãƒ¼ã‚¹ãŒã§ãれã°ãƒœã‚¿ãƒ³ã¯è¡¨ç¤ºã•れã¾ã™ã€‚
</notification>
<global name="UnsupportedCPU">
- ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
<global name="UnsupportedGLRequirements">
- [APP_NAME] ã®ä½¿ç”¨ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ç’°å¢ƒãŒæº€ãŸã•れã¦ã„ãªã„よã†ã§ã™ã€‚ [APP_NAME] ã§ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã«å¯¾å¿œã—ãŸOpenGLグラフィック・カードãŒå¿…è¦ã§ã™ã€‚ ã“ã®å ´åˆã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã€ãŠã‚ˆã³ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ»ã‚·ã‚¹ãƒ†ãƒ ã«ã‚µãƒ¼ãƒ“ス・パックã¨ä¿®æ­£ãƒ—ログラムãŒé©ç”¨ã•れã¦ã„ã‚‹ã“ã¨ã‚’ã”確èªãã ã•ã„。
+ [APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。
-å•題ãŒè§£æ±ºã•れãªã„å ´åˆã«ã¯ã€æ¬¡ã®ã‚µã‚¤ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„。 http://www.secondlife.com/support
+ã“ã®å•題ãŒä½•度も起ãã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</global>
<global name="UnsupportedCPUAmount">
796
@@ -3250,15 +2649,13 @@ Macã®å ´åˆã¯ã€&#8997;&#8984;Dを押ã—ã¦ãã ã•ã„。
510
</global>
<global name="UnsupportedGPU">
- - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィック・カードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
+ - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィックカードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
<global name="UnsupportedRAM">
- - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãƒ»ãƒ¡ãƒ¢ãƒªã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
- <global name="PermYes">
- ã¯ã„
+ - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãƒ¡ãƒ¢ãƒªã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
- <global name="PermNo">
- ã„ã„ãˆ
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ã€Œãƒ›ãƒ¼ãƒ ã€ã«è¨­å®šã§ãã¾ã™ã€‚
+ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’ãŠæŽ¢ã—ãã ã•ã„。
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/ja/panel_active_object_row.xml b/indra/newview/skins/default/xui/ja/panel_active_object_row.xml
new file mode 100644
index 0000000000..90491e84c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ 䏿˜Žã®ã‚ªãƒ–ジェクト
+ </string>
+ <text name="object_name">
+ åå‰ã®ãªã„オブジェクト
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_activeim_row.xml b/indra/newview/skins/default/xui/ja/panel_activeim_row.xml
new file mode 100644
index 0000000000..84272752cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_activeim_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="contact_name">
+ Grumpity ProductEngine
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..17e1283d24
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="コール" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="コール終了" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="ボイスコントロール" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..03eaf33d92
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] ç§’
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] 分
+ </string>
+ <string name="FormatHours">
+ [COUNT] 時間
+ </string>
+ <string name="FormatDays">
+ [COUNT] æ—¥
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] 週間
+ </string>
+ <string name="FormatMonths">
+ [COUNT] ヶ月
+ </string>
+ <string name="FormatYears">
+ [COUNT] å¹´
+ </string>
+ <text name="avatar_name" value="䏿˜Ž"/>
+ <text name="last_interaction" value="0 ç§’"/>
+ <button name="profile_btn" tool_tip="プロフィールã®è¡¨ç¤º"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml b/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml
new file mode 100644
index 0000000000..fd91ea97d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ The quick brown fox jumps over the lazy dog.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..5d6a6065ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ ブロックリスト
+ </text>
+ <scroll_list name="blocked" tool_tip="ç¾åœ¨ãƒ–ロックã•れã¦ã„ã‚‹ä½äººä¸€è¦§"/>
+ <button label="ã‚¢ãƒã‚¿ãƒ¼ã‚’ブロック" label_selected="ä½äººã‚’ブロック..." name="Block resident..." tool_tip="ブロックã—ãŸã„ä½äººã‚’é¸ã‚“ã§ãã ã•ã„"/>
+ <button label="åå‰ã§ã‚ªãƒ–ジェクトをブロック..." label_selected="åå‰ã§ã‚ªãƒ–ジェクトをブロック..." name="Block object by name..." tool_tip="åå‰ã§ãƒ–ロックã—ãŸã„オブジェクトをé¸ã‚“ã§ãã ã•ã„"/>
+ <button label="ブロック解除" label_selected="ブロック解除" name="Unblock" tool_tip="ブロックリストã‹ã‚‰ä½äººãƒ»ã‚ªãƒ–ジェクトを削除"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
new file mode 100644
index 0000000000..f12f07f3e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ ボイスコントロールパãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="話ã™" label_selected="話ã™" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="移動" name="movement_btn" tool_tip="移動コントロールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="視界" name="camera_btn" tool_tip="カメラコントロールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="スナップショットを撮りã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="会話"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="通知"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..6eca8adfe5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_chat_header.xml b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
new file mode 100644
index 0000000000..babbff3132
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text_editor name="user_name" value="Ericag Vader"/>
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_classified_info.xml b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
new file mode 100644
index 0000000000..14e04d5691
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ 控ãˆã‚
+ </panel.string>
+ <panel.string name="type_pg">
+ 一般コンテンツ
+ </panel.string>
+ <panel.string name="l$_price">
+ L$ [PRICE]
+ </panel.string>
+ <text name="title" value="クラシファイド広告情報"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text_editor name="category" value="[category]"/>
+ <check_box label="毎週自動更新" name="auto_renew"/>
+ <text_editor name="price_for_listing" tool_tip="掲載価格"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="地図" name="show_on_map_btn"/>
+ <button label="編集" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
new file mode 100644
index 0000000000..f2e3e6e993
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢&#10;ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_classified.xml b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml
new file mode 100644
index 0000000000..4cb5884f28
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="クラシファイド広告ã®ç·¨é›†" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (掲載後更新)
+ </panel.string>
+ <text name="title">
+ クラシファイド広告ã®ç·¨é›†
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ <text name="Name:">
+ タイトル:
+ </text>
+ <text name="description_label">
+ 説明:
+ </text>
+ <text name="location_label">
+ ä½ç½®ï¼š
+ </text>
+ <text name="classified_location">
+ ローディング...
+ </text>
+ <button label="ç¾åœ¨åœ°ã«è¨­å®š" name="set_to_curr_location_btn"/>
+ <combo_box name="content_type">
+ <combo_item name="mature_ci">
+ 控ãˆã‚コンテンツ
+ </combo_item>
+ <combo_item name="pg_ci">
+ 一般コンテンツ
+ </combo_item>
+ </combo_box>
+ <spinner label="L$" name="price_for_listing" tool_tip="掲載価格" value="50"/>
+ <check_box label="毎週自動更新" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="ä¿å­˜" name="save_changes_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
new file mode 100644
index 0000000000..0cee85f685
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="çž³" name="Iris" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="ç›®"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
new file mode 100644
index 0000000000..393bd15236
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="手袋"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
new file mode 100644
index 0000000000..065771df16
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="色"/>
+ <accordion_tab name="hair_style_tab" title="スタイル"/>
+ <accordion_tab name="hair_eyebrows_tab" title="眉毛"/>
+ <accordion_tab name="hair_facial_tab" title="フェイシャル"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
new file mode 100644
index 0000000000..96a851cc4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="生地・上" name="Upper Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="生地・下" name="Lower Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="ジャケット"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
new file mode 100644
index 0000000000..f93d3d6b14
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="パンツ"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
new file mode 100644
index 0000000000..88c05fbae7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ピック編集" name="panel_edit_pick">
+ <text name="title">
+ ピック編集
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ <text name="Name:">
+ タイトル:
+ </text>
+ <text name="description_label">
+ 説明:
+ </text>
+ <text name="location_label">
+ 場所:
+ </text>
+ <text name="pick_location">
+ ローディング...
+ </text>
+ <button label="ç¾åœ¨åœ°ã«è¨­å®š" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="[WHAT] ã‚’ä¿å­˜" name="save_changes_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index ca4ab3e773..cd81565acb 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -1,45 +1,59 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="ä½äºº" />
- <string name="AcctTypeTrial"
- value="トライアル" />
- <string name="AcctTypeCharterMember"
- value="特権メンãƒãƒ¼" />
- <string name="AcctTypeEmployee"
- value="Linden Lab従業員" />
- <string name="PaymentInfoUsed"
- value="æ”¯æ‰•ã„æƒ…報登録済" />
- <string name="PaymentInfoOnFile"
- value="æ”¯æ‰•ã„æƒ…報登録済ã¿" />
- <string name="NoPaymentInfoOnFile"
- value="æ”¯æ‰•ã„æƒ…報未登録" />
- <string name="AgeVerified"
- value="å¹´é½¢ç¢ºèªæ¸ˆã¿" />
- <string name="NotAgeVerified"
- value="年齢未確èª" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=ja
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- å–り込ã¿ä¸­å¿œç­”メッセージ:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="プロフィールã®ç·¨é›†" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="ä½äºº"/>
+ <string name="AcctTypeTrial" value="トライアル"/>
+ <string name="AcctTypeCharterMember" value="創立メンãƒãƒ¼"/>
+ <string name="AcctTypeEmployee" value="Linden Lab 従業員"/>
+ <string name="PaymentInfoUsed" value="支払情報使用履歴ã‚り"/>
+ <string name="PaymentInfoOnFile" value="支払情報登録済"/>
+ <string name="NoPaymentInfoOnFile" value="支払情報未登録"/>
+ <string name="AgeVerified" value="å¹´é½¢ç¢ºèªæ¸ˆ"/>
+ <string name="NotAgeVerified" value="年齢未確èª"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=ja
+ </string>
+ <string name="my_account_link_url">
+ http://jp.secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="ãªã—"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="ç¾å®Ÿä¸–界:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ <text name="title_homepage_text">
+ Web サイト:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <check_box label="æ¤œç´¢çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="マイアカウント:"/>
+ <text_editor name="acc_status_text" value="ä½äººã€‚ 支払情報未登録。"/>
+ <text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/>
+ <text name="title_partner_text" value="マイパートナー:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(å–得中)" name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="変更をä¿å­˜" name="save_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
new file mode 100644
index 0000000000..1e20eb26b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ 性別:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="女性" name="radio"/>
+ <radio_item label="男性" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="身体"/>
+ <accordion_tab name="shape_head_tab" title="é ­"/>
+ <accordion_tab name="shape_eyes_tab" title="ç›®"/>
+ <accordion_tab name="shape_ears_tab" title="耳"/>
+ <accordion_tab name="shape_nose_tab" title="é¼»"/>
+ <accordion_tab name="shape_mouth_tab" title="å£"/>
+ <accordion_tab name="shape_chin_tab" title="ã‚ã”"/>
+ <accordion_tab name="shape_torso_tab" title="é ­"/>
+ <accordion_tab name="shape_legs_tab" title="脚"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
new file mode 100644
index 0000000000..b2eb8fa18e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="シャツ"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
new file mode 100644
index 0000000000..83e302f8f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="é´"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
new file mode 100644
index 0000000000..cd7efbec68
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="肌ã®è‰²"/>
+ <accordion_tab name="skin_face_tab" title="é¡”ã®è©³ç´°"/>
+ <accordion_tab name="skin_makeup_tab" title="メイクアップ"/>
+ <accordion_tab name="skin_body_tab" title="身体ã®è©³ç´°"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
new file mode 100644
index 0000000000..0a0936a3a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="スカート"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
new file mode 100644
index 0000000000..7cbc75624f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="é´ä¸‹"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..78ddae47f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
new file mode 100644
index 0000000000..9287463b2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="下ç€ãƒ‘ンツ"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..085ad97384
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="下ç€ã‚·ãƒ£ãƒ„"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
new file mode 100644
index 0000000000..2ae8e1863e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ç€ç”¨å¯èƒ½ãªã‚‚ã®" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ シェイプを編集中
+ </string>
+ <string name="edit_skin_title">
+ スキンを編集中
+ </string>
+ <string name="edit_hair_title">
+ 髪を編集中
+ </string>
+ <string name="edit_eyes_title">
+ 目を編集中
+ </string>
+ <string name="edit_shirt_title">
+ シャツを編集中
+ </string>
+ <string name="edit_pants_title">
+ パンツを編集中
+ </string>
+ <string name="edit_shoes_title">
+ é´ã‚’編集中
+ </string>
+ <string name="edit_socks_title">
+ é´ä¸‹ã‚’編集中
+ </string>
+ <string name="edit_jacket_title">
+ ジャケットを編集中
+ </string>
+ <string name="edit_skirt_title">
+ スカートを編集中
+ </string>
+ <string name="edit_gloves_title">
+ 手袋を編集中
+ </string>
+ <string name="edit_undershirt_title">
+ 下ç€ï¼ˆä¸Šï¼‰ã‚’編集中
+ </string>
+ <string name="edit_underpants_title">
+ 下ç€ï¼ˆä¸‹ï¼‰ã‚’編集中
+ </string>
+ <string name="edit_alpha_title">
+ アルファマスクを編集中
+ </string>
+ <string name="edit_tattoo_title">
+ タトゥーを編集中
+ </string>
+ <string name="shape_desc_text">
+ シェイプ:
+ </string>
+ <string name="skin_desc_text">
+ スキン:
+ </string>
+ <string name="hair_desc_text">
+ 髪:
+ </string>
+ <string name="eyes_desc_text">
+ 目:
+ </string>
+ <string name="shirt_desc_text">
+ シャツ:
+ </string>
+ <string name="pants_desc_text">
+ パンツ:
+ </string>
+ <string name="shoes_desc_text">
+ é´ï¼š
+ </string>
+ <string name="socks_desc_text">
+ é´ä¸‹ï¼š
+ </string>
+ <string name="jacket_desc_text">
+ ジャケット:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ スカート:
+ </string>
+ <string name="gloves_desc_text">
+ 手袋:
+ </string>
+ <string name="undershirt_desc_text">
+ 下ç€ã‚·ãƒ£ãƒ„:
+ </string>
+ <string name="underpants_desc_text">
+ 下ç€ãƒ‘ンツ:
+ </string>
+ <string name="alpha_desc_text">
+ アルファマスク:
+ </string>
+ <string name="tattoo_desc_text">
+ タトゥ:
+ </string>
+ <text name="edit_wearable_title" value="シェイプを編集中"/>
+ <panel label="シャツ" name="wearable_type_panel">
+ <text name="description_text" value="シェイプ:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="別åã§ä¿å­˜" name="save_as_button"/>
+ <button label="å…ƒã«æˆ»ã™" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_friends.xml b/indra/newview/skins/default/xui/ja/panel_friends.xml
index d4cf678d70..0c7114dbb7 100644
--- a/indra/newview/skins/default/xui/ja/panel_friends.xml
+++ b/indra/newview/skins/default/xui/ja/panel_friends.xml
@@ -1,53 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- 複数ã®ãƒ•レンド...
+ 複数ã®ãƒ•レンド
</string>
- <scroll_list name="friend_list"
- tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shiftキーã¾ãŸã¯Ctrlキーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚">
- <column name="icon_online_status" tool_tip="オンライン・ステータス" />
- <column label="åå‰" name="friend_name" tool_tip="åå‰" />
- <column name="icon_visible_online"
- tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" />
- <column name="icon_visible_map"
- tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…場所を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" />
- <column name="icon_edit_mine"
- tool_tip="フレンドã¯ã€ã‚ªãƒ–ジェクトを編集ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" />
- <column name="icon_edit_theirs"
- tool_tip="ã‚ãªãŸã¯ã€ã“ã®ãƒ•レンドã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" />
+ <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shift キーã¾ãŸã¯ Ctrl キーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚">
+ <column name="icon_online_status" tool_tip="オンライン状態"/>
+ <column label="åå‰" name="friend_name" tool_tip="åå‰"/>
+ <column name="icon_visible_online" tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <column name="icon_visible_map" tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…場所を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <column name="icon_edit_mine" tool_tip="フレンドã¯ã€ã‚ªãƒ–ジェクトを編集ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <column name="icon_edit_theirs" tool_tip="ã‚ãªãŸã¯ã€ã“ã®ãƒ•レンドã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
</scroll_list>
<panel name="rights_container">
<text name="friend_name_label" right="-10">
ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã—ã¦æ¨©åˆ©ã‚’変更...
</text>
- <check_box label="オンライン・ステータスã®ç¢ºèªã‚’許å¯ã™ã‚‹"
- name="online_status_cb"
- tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨­å®š" />
- <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹"
- name="map_status_cb"
- tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®š" />
- <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb"
- tool_tip="ã“ã®ãƒ•レンドãŒã‚ªãƒ–ジェクトを改造ã§ãる許å¯ã‚’与ãˆã‚‹" />
+ <check_box label="オンライン状態ã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨­å®šã—ã¾ã™"/>
+ <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®šã—ã¾ã™"/>
+ <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•レンドã«ç§ã®ã‚ªãƒ–ジェクトを改造ã™ã‚‹è¨±å¯ã‚’与ãˆã¾ã™"/>
<text name="process_rights_label">
権利変更をプロセス中...
</text>
</panel>
- <pad left="-95" />
- <button label="IM/コール" name="im_btn"
- tool_tip="インスタントメッセージ・セッションを開ã"
- width="90" />
- <button label="プロフィール" name="profile_btn"
- tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…報を表示ã—ã¾ã™ã€‚"
- width="90" />
- <button label="テレãƒãƒ¼ãƒˆ..." name="offer_teleport_btn"
- tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¾ã§ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚"
- width="90" />
- <button label="支払ã†..." name="pay_btn"
- tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã‚‹"
- width="90" />
- <button label="削除..." name="remove_btn"
- tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚"
- width="90" />
- <button label="追加..." name="add_btn"
- tool_tip="ä½äººã«ãƒ•レンドシップを申請ã—ã¾ã™ã€‚" width="90" />
+ <pad left="-95"/>
+ <button label="IM・コール" name="im_btn" tool_tip="インスタントメッセージセッションを開ãã¾ã™ã€‚" width="90"/>
+ <button label="プロフィール" name="profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…報を表示ã—ã¾ã™ã€‚" width="90"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨åœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/>
+ <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã¾ã™ã€‚" width="90"/>
+ <button label="削除" name="remove_btn" tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚" width="90"/>
+ <button label="追加" name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™ã€‚" width="90"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
new file mode 100644
index 0000000000..f7f575206a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="グループ情報" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="グループコール" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="コール終了" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="ボイスコントロールを開ã" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_general.xml b/indra/newview/skins/default/xui/ja/panel_group_general.xml
index 43e3ca69ef..a8df9aef80 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml
@@ -1,74 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="一般" name="general_tab">
- <string name="help_text">
- 「一般ã€ã‚¿ãƒ–ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«é–¢ã™ã‚‹
-一般情報ã€ã‚ªãƒ¼ãƒŠãƒ¼ã¨è¡¨ç¤ºå¯èƒ½ãªãƒ¡ãƒ³ãƒãƒ¼ã®ãƒªã‚¹ãƒˆ
-一般的ãªã€Œã‚°ãƒ«ãƒ¼ãƒ—環境設定ã€ã€ãƒ¡ãƒ³ãƒãƒ¼ã®ã‚ªãƒ—ションãŒå«ã¾ã‚Œã¾ã™ã€‚
+ <panel.string name="help_text">
+ 「一般ã€ã‚¿ãƒ–ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ä¸€è¦§ã€è¨­å®šã€ãƒ¡ãƒ³ãƒãƒ¼ã®ã‚ªãƒ—ションãªã©ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«é–¢ã™ã‚‹ä¸€èˆ¬çš„ãªæƒ…å ±ãŒè¨˜ã•れã¦ã„ã¾ã™ã€‚
-オプションã®ä¸Šã§ãƒžã‚¦ã‚¹ã‚«ãƒ¼ã‚½ãƒ«ã‚’å‹•ã‹ã™ã¨ã€ãƒ˜ãƒ«ãƒ—情報を得られã¾ã™ã€‚
- </string>
- <string name="group_info_unchanged">
- グループ設定ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="æ–°ã—ã„グループåã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。" name="group_name_editor" width="330"/>
- <text name="group_name" width="330">
- æ–°ã—ã„グループåã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
- </text>
- <text name="prepend_founded_by">
- 創設者
- </text>
- <text name="founder_name">
- (待機中)
- </text>
- <text name="group_charter_label">
- グループç†å¿µ
- </text>
- <texture_picker label="グループ記章" name="insignia" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+オプションã«ãƒžã‚¦ã‚¹ã‚«ãƒ¼ã‚½ãƒ«ã‚’当ã¦ã‚‹ã¨è©³ã—ã„説明ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ 一般的ãªã‚°ãƒ«ãƒ¼ãƒ—情報ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ メンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’検索
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <text name="prepend_founded_by">
+ 創設者:
+ </text>
+ <name_box initial_value="(å–得中)" name="founder_name"/>
+ <text name="join_cost_text">
+ ç„¡æ–™
+ </text>
+ <button label="å‚加ã—ã¾ã™ï¼" name="btn_join"/>
+ </panel>
<text_editor name="charter">
グループã®ç†å¿µã€æŒ‡é‡ã‚’記入ã—ã¦ãã ã•ã„
</text_editor>
- <button label="å‚加ã™ã‚‹ï¼ˆL$0)" label_selected="å‚加ã™ã‚‹ï¼ˆL$0)" name="join_button"/>
- <button label="詳細表示" label_selected="詳細表示" name="info_button"/>
- <text name="text_owners_and_visible_members">
- オーナーã¨å…¬é–‹ãƒ¡ãƒ³ãƒãƒ¼
- </text>
- <text name="text_owners_are_shown_in_bold">
- (オーナーã¯å¤ªå­—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ï¼‰
- </text>
<name_list name="visible_members">
- <name_list.columns label="メンãƒãƒ¼å" name="name"/>
+ <name_list.columns label="メンãƒãƒ¼" name="name"/>
<name_list.columns label="タイトル" name="title"/>
- <name_list.columns label="最終ログイン" name="online"/>
+ <name_list.columns label="ログイン" name="status"/>
</name_list>
- <text name="text_group_preferences">
- グループ環境設定
+ <text name="my_group_settngs_label">
+ 個人ã®è¨­å®š
+ </text>
+ <text name="active_title_label">
+ ç§ã®ã‚¿ã‚¤ãƒˆãƒ«ï¼š
</text>
+ <combo_box name="active_title" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ãŸã¨ãã«ã€ã‚¢ãƒã‚¿ãƒ¼åã®ä¸Šã«è¡¨ç¤ºã•れるタイトルを設定ã—ã¾ã™ã€‚"/>
+ <check_box label="グループ通知をå—ä¿¡" name="receive_notices" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ã®é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚ グループã‹ã‚‰ã‚¹ãƒ‘ムãŒé€ã‚‰ã‚Œã¦ãã‚‹å ´åˆã¯ã“ã®ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"/>
+ <check_box label="プロフィールã«è¡¨ç¤º" name="list_groups_in_profile" tool_tip="ã‚ãªãŸã®ãƒ—ロフィールã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚"/>
<panel name="preferences_container">
- <check_box label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/>
- <check_box label="会員募集" name="open_enrollement" tool_tip="招待状ãªã—ã«è‡ªç”±ã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™"/>
- <check_box label="入会費:" name="check_enrollment_fee" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®å‚加ã«å…¥ä¼šè²»ã‚’å¿…é ˆã¨ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™"/>
- <spinner name="spin_enrollment_fee" tool_tip="「入会費ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ã‚‹å ´åˆã€æ–°è¦ä¼šå“¡ã¯å…¥ä¼šæ™‚ã«ã“ã“ã«æŒ‡å®šã•れãŸé‡‘é¡ã‚’支払ã†å¿…è¦ãŒã‚りã¾ã™"/>
- <combo_box name="group_mature_check" tool_tip="グループ情報ãŒMatureå‘ã‘ã‹ã©ã†ã‹ã®è¨­å®šã‚’ã—ã¾ã™ã€‚">
- <combo_box.item name="select_mature" label="- Matureã®é¸æŠž -"/>
- <combo_box.item name="mature" label="Matureコンテンツ"/>
- <combo_box.item name="pg" label="PGコンテンツ"/>
+ <text name="group_settngs_label">
+ グループã®è¨­å®š
+ </text>
+ <check_box label="誰ã§ã‚‚入会ã§ãã¾ã™" name="open_enrollement" tool_tip="招待ã•れãªãã¦ã‚‚æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
+ <check_box label="入会費ãŒã‹ã‹ã‚Šã¾ã™" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="「入会費ã€ã«ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã¯æŒ‡å®šã•れãŸå…¥ä¼šè²»ã‚’支払ã‚ãªã‘れã°ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚Œã¾ã›ã‚“。"/>
+ <combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã«ãƒ¬ãƒ¼ãƒˆè¨­å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™">
+ <combo_box.item label="一般コンテンツ" name="pg"/>
+ <combo_box.item label="控ãˆã‚コンテンツ" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- ç§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–・タイトル
- </text>
- <combo_box name="active_title" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—をアクティブ設定ã«ã—ãŸéš›ã‚¢ãƒã‚¿ãƒ¼ã®ãƒãƒ¼ãƒ ã‚¿ã‚°ã«è¡¨ç¤ºã•れるタイトルã®è¨­å®š"/>
- </panel>
- <check_box label="グループ通知をå—ä¿¡" name="receive_notices" tool_tip="グループã‹ã‚‰ã®é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒã‚¹ãƒ‘ム行為をã—ã¦ã„ã‚‹å ´åˆã¯ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„"/>
- <check_box label="プロフィールã«è¡¨ç¤º" name="list_groups_in_profile" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ã‚ãªãŸã®ãƒ—ロフィールã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™"/>
+ <check_box initial_value="true" label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/>
</panel>
- <string name="incomplete_member_data_str">
- メンãƒãƒ¼ãƒ»ãƒ‡ãƒ¼ã‚¿ã‚’検索
- </string>
- <string name="confirm_group_create_str">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ä½œæˆã«ã¯L$100ã‹ã‹ã‚Šã¾ã™ã€‚
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ä½œæˆã«L$100ã‚‚ã®ãŠé‡‘ã‚’ã‹ã‘ã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“ã‹ï¼Ÿ æ…Žé‡ã«åˆ¤æ–­ã—ã¦ãã ã•ã„。
-48時間以内ã«èª°ã‚‚ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã—ãªã‹ã£ãŸå ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—ã¯è§£ä½“ã•れã€ã‚°ãƒ«ãƒ¼ãƒ—ã®åå‰ã¯ä»Šå¾Œä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..4166108472
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="グループ情報" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ ä¿å­˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™
+ </panel.string>
+ <panel.string name="want_apply_text">
+ 変更をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ </panel.string>
+ <panel.string name="group_join_btn">
+ å‚加 (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ ç„¡æ–™
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="(ローディング...)"/>
+ <line_editor label="æ–°ã—ã„グループã®åå‰ã‚’入力ã—ã¦ãã ã•ã„" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="一般"/>
+ <accordion_tab name="group_roles_tab" title="役割"/>
+ <accordion_tab name="group_notices_tab" title="通知"/>
+ <accordion_tab name="group_land_tab" title="土地・資産"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="ãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/>
+ <button label="グループコール" name="btn_call" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="btn_apply"/>
+ <button label="グループを作æˆ" name="btn_create" tool_tip="æ–°ã—ã„グループを作æˆ"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index 14009f2972..a21b340fdd 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -1,30 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel">
- <text name="help_text" font="SansSerifSmall" height="72" bottom_delta="-96">
- ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ä¸€åº¦ã«è¤‡æ•°ã®
-ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€
-をクリックã—ã¦ãã ã•ã„。
+ <panel.string name="confirm_invite_owner_str">
+ æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹ï¼Ÿã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
+ </panel.string>
+ <panel.string name="loading">
+ (ローディング...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ é¸æŠžã—ãŸä½äººã®ãªã‹ã«ã€æ—¢ã«ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„る人ãŒã„ã‚‹ãŸã‚ã€æ‹›å¾…ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </panel.string>
+ <text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text">
+ グループã«ã¯ä¸€åº¦ã«è¤‡æ•°ã®ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ã‚’クリックã—ã¦ãã ã•ã„。
</text>
<button bottom_delta="-10" label="リストã‹ã‚‰ä½äººã‚’é¸æŠž" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" height="156" bottom_delta="-160"
- tool_tip="複数ã®ä½äººã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Ctrlキーを押ã—ãªãŒã‚‰ä½äººåをクリックã—ã¾ã™ã€‚" />
- <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button"
- tool_tip="上ã§é¸æŠžã—ãŸå±…ä½è€…を招待リストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚" />
- <text>
- 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š
- </text>
+ <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="Ctrl キーを押ã—ãªãŒã‚‰è¤‡æ•°ã®ä½äººã‚’クリックã§ãã¾ã™"/>
+ <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button" tool_tip="招待リストã‹ã‚‰ä¸Šã§é¸æŠžã—ãŸä½äººã‚’削除ã—ã¾ã™"/>
<text name="role_text">
割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š
</text>
- <combo_box name="role_name"
- tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªå½¹å‰²ã‚’リストã‹ã‚‰é¸æŠžã€‚" />
- <button label="招待をé€ä¿¡" name="ok_button" />
- <button label="å–り消ã—" name="cancel_button" />
- <string name="confirm_invite_owner_str">
- æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
+ <combo_box name="role_name" tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ãŸã„役割をリストã‹ã‚‰é¸ã‚“ãã ã•ã„"/>
+ <button label="招待をé€ä¿¡" name="ok_button"/>
+ <button label="å–り消ã—" name="cancel_button"/>
+ <string name="GroupInvitation">
+ グループã¸ã®æ‹›å¾…
</string>
- <text name="loading">
- (ローディング...)
- </text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index 595d315cf9..c0449f1221 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -1,85 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="土地ã¨L$" name="land_money_tab">
- <string name="help_text">
- グループ所有地一覧ã¯ã€å¯„付ã«é–¢ã™ã‚‹è©³ç´°ã¨ä¸€ç·’ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è­¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚ 「計画ã€ã€ã€Œè©³ç´°ã€ã€ã€Œè²©å£²ã€ã‚¿ãƒ–ã«ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®è³‡é‡‘ã«é–¢ã™ã‚‹æƒ…å ±ãŒæŽ²è¼‰ã•れã¦ã„ã¾ã™ã€‚
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。
- </string>
- <string name="cant_view_group_accounting_text">
- ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¼šè¨ˆæƒ…å ±ã®è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。
- </string>
- <string name="loading_txt">
+ <panel.string name="help_text">
+ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è­¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ グループ所有地を確èªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ グループã®ä¼šè¨ˆæƒ…報を確èªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </panel.string>
+ <panel.string name="loading_txt">
ロード中...
- </string>
- <text name="group_land_heading">
- グループã®ä¿æœ‰åœ°
- </text>
- <scroll_list name="group_parcel_list">
- <column label="区画å" name="name"/>
- <column label="地域(リージョン)" name="location"/>
- <column label="種類" name="type"/>
- <column label="é¢ç©" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="地図上ã«è¡¨ç¤º" label_selected="地図上ã«è¡¨ç¤º" name="map_button"/>
- <text name="total_contributed_land_label">
- 寄付ç·é¡ï¼š
- </text>
- <text name="total_contributed_land_value" width="150">
- [AREA]平方メートル
- </text>
- <text name="total_land_in_use_label">
- 土地利用ã®åˆè¨ˆï¼š
- </text>
- <text name="total_land_in_use_value" width="150">
- [AREA]平方メートル
- </text>
- <text name="land_available_label">
- 利用å¯ã®åœŸåœ°ï¼š
- </text>
- <text name="land_available_value" width="150">
- [AREA]平方メートル
- </text>
- <text name="your_contribution_label">
- ã‚ãªãŸã®è²¢çŒ®ï¼š
- </text>
- <string name="land_contrib_error">
- 土地ã®å‡ºè³‡è¨­å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
- </string>
- <text name="your_contribution_units">
- (平方メートル)
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT]最大)
- </text>
- <text name="group_over_limit_text">
- 使用中ã®åœŸåœ°ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ãŒã•らã«å¤š
-ãã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </text>
- <text name="group_money_heading">
- グループL$
- </text>
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ 土地ã®è²¢çŒ®ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="区画" name="name"/>
+ <scroll_list.columns label="地域" name="location"/>
+ <scroll_list.columns label="種類" name="type"/>
+ <scroll_list.columns label="é¢ç©" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ 寄付åˆè¨ˆï¼š
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] 平方メートル
+ </text>
+ <button label="地図" label_selected="地図" name="map_button"/>
+ <text name="total_land_in_use_label">
+ 土地利用ã®åˆè¨ˆï¼š
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] 平方メートル
+ </text>
+ <text name="land_available_label">
+ 利用å¯èƒ½ã®åœŸåœ°ï¼š
+ </text>
+ <text name="land_available_value">
+ [AREA] 平方メートル
+ </text>
+ <text name="your_contribution_label">
+ ã‚ãªãŸã®è²¢çŒ®ï¼š
+ </text>
+ <text name="your_contribution_units">
+ 平方メートル
+ </text>
+ <text name="your_contribution_max_value">
+ (最大 [AMOUNT])
+ </text>
+ <text name="group_over_limit_text">
+ 土地利用をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒè¶³ã‚Šã¾ã›ã‚“
+ </text>
+ <text name="group_money_heading">
+ グループ㮠L$
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="計画" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- 計算中...
+ ローディング...
</text_editor>
</panel>
<panel label="詳細" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- 計算中…
+ ローディング...
</text_editor>
- <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±ã®å±¥æ­´"/>
- <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±ã®å±¥æ­´"/>
+ <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±"/>
+ <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±"/>
</panel>
- <panel label="販売" name="group_money_sales_tab">
+ <panel label="販売å–引" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- 計算中…
+ ローディング...
</text_editor>
- <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±ã®å±¥æ­´"/>
- <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±ã®å±¥æ­´"/>
+ <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±"/>
+ <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
new file mode 100644
index 0000000000..4b548049c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="䏿˜Ž"/>
+ <button name="profile_btn" tool_tip="プロフィールã®è¡¨ç¤º"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index afca4c4dfd..a0c50c6122 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -1,66 +1,61 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="通知" name="notices_tab">
- <string name="help_text">
- 通知機能を使ã†ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã§ã™ã°ã‚„ãæƒ…報をä¼é”ã§ãã¾ã™ã€‚
-複数ã®ã‚ã¦å…ˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã§ãã‚‹ã»ã‹ã€
-å¿…è¦ã«å¿œã˜ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ·»ä»˜ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
-通知ã¯ã€å—信アビリティãŒã‚る役割ã®ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«ã®ã¿é…ä¿¡ã•れã¾ã™ã€‚
-通知をオフã«ã™ã‚‹ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使ã„ã¾ã™ã€‚
- </string>
- <string name="no_notices_text">
- éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“。
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- グループ通知アーカイブ
- </text>
+ <panel.string name="help_text">
+ 通知ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã€é€šçŸ¥ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’添付ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+通知をå—ã‘å–ã‚‹ã“ã¨ãŒã§ãる「役割ã€ã«ã‚るメンãƒãƒ¼ã ã‘ã«é€ä¿¡ã•れã¾ã™ã€‚
+「一般ã€ã‚¿ãƒ–ã§é€šçŸ¥ã®å—信をオフã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="no_notices_text">
+ éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“
+ </panel.string>
<text name="lbl2">
- 通知ã¯14日間ä¿å­˜ã•れã¾ã™ã€‚ãŸã ã—ã€å„グループã®é€šçŸ¥ãƒªã‚¹ãƒˆã¯1æ—¥ã‚ãŸã‚Š200通ã«åˆ¶é™ã•れã¾ã™ã€‚
+ 通知㯠14 日間ä¿å­˜ã•れã¾ã™ã€‚
+1 æ—¥ã®åˆ¶é™æ•°ã¯ 200 通ã§ã™ã€‚
</text>
<scroll_list name="notice_list">
- <column label="" name="icon"/>
- <column label="ä»¶å" name="subject"/>
- <column label="é€ã‚Šä¸»" name="from"/>
- <column label="日付" name="date"/>
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="ä»¶å" name="subject"/>
+ <scroll_list.columns label="é€ã‚Šä¸»" name="from"/>
+ <scroll_list.columns label="日付" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</text>
- <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice"/>
- <button label="更新" label_selected="リスト更新" name="refresh_notices"/>
+ <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆã—ã¾ã™"/>
+ <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新ã—ã¾ã™"/>
<panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice">
<text name="lbl">
通知を作æˆ
</text>
- <text name="lbl2">
- æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã“ã®ãƒ‘ãƒãƒ«ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã«æ·»ä»˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 添付ã§ãã‚‹ã®ã¯ã‚³ãƒ”ーã€è­²æ¸¡ãŒå¯èƒ½ãªã‚¢ã‚¤ãƒ†ãƒ ã§ã€ãƒ•ォルダをé€ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- </text>
<text name="lbl3">
ä»¶å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
<text name="lbl5">
添付:
</text>
- <button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/>
- <button label="通知をé€ä¿¡" label_selected="通知をé€ä¿¡" name="send_notice"/>
- <panel name="drop_target" tool_tip="æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’メッセージ欄ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ãã ã•ã„。通知ã¨ä¸€ç·’ã«é€ä¿¡ã•れã¾ã™ã€‚é€ä¿¡ã™ã‚‹ã«ã¯ã‚³ãƒ”ーã€è­²æ¸¡ãŒå¯èƒ½ãªã‚ªãƒ–ジェクトã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/>
+ <text name="string">
+ ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグ&ドロップã—ã¦æ·»ä»˜ã—ã¦ãã ã•ã„:
+ </text>
+ <button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment" tool_tip="ã‚ãªãŸã®é€šçŸ¥ã‹ã‚‰æ·»ä»˜ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ <button label="é€ä¿¡" label_selected="é€ä¿¡" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—ãƒ¬ã‚¼ãƒ³ãƒˆã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/>
</panel>
<panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice">
<text name="lbl">
アーカイブ通知
</text>
<text name="lbl2">
- æ–°ã—ã„通知ã®é€ä¿¡ã¯ã€ä¸Šã®[æ–°ã—ã„通知を作æˆã™ã‚‹]をクリックã—ã¦ãã ã•ã„。
+ æ–°ã—ã„通知をé€ä¿¡ã™ã‚‹ã«ã¯ã€+ ボタンを押ã—ã¦ãã ã•ã„
</text>
<text name="lbl3">
ä»¶å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
- <button label="添付物を開ã" label_selected="添付物を開ã" name="open_attachment"/>
+ <button label="添付アイテムを開ã" label_selected="添付物を開ã" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notify.xml b/indra/newview/skins/default/xui/ja/panel_group_notify.xml
new file mode 100644
index 0000000000..7135ae780d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="header" name="header">
+ <text name="title" value="é€ä¿¡è€…ã®åå‰ / グループå"/>
+ </panel>
+ <text_editor name="message" value="message"/>
+ <text name="attachment" value="添付アイテム"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index 2d39938b53..db6fe268c7 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -1,157 +1,115 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンãƒãƒ¼ã¨å½¹å‰²" name="roles_tab">
- <string name="default_needs_apply_text">
- ç¾åœ¨ã®ã‚µãƒ–タブã«ã€æœªé©ç”¨ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚
- </string>
- <string name="want_apply_text">
- ã“れらã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- メンãƒãƒ¼ã¨å½¹å‰²
- </text>
- <text name="static2">
- グループ・メンãƒãƒ¼ã«ã¯ã€å½¹å‰²ã¨èƒ½åŠ›ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ ã“ã®è¨­å®šã¯ã€
-組織ã®è¦æ¨¡ã«å¿œã˜ã¦æŸ”軟ã‹ã¤å®¹æ˜“ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãã¾ã™ã€‚
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- 役割
- </text>
- <text name="role_properties_modifiable">
- 下ã«ã‚ã‚‹å½¹å‰²ã‚’é¸æŠžã—ã¦ãã ã•ã„。 役割ã®åå‰ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼ãƒ»ã‚¿ã‚¤ãƒˆãƒ«ã‚’修正ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- </text>
- <text name="role_properties_not_modifiable">
- 役割åã‚’é¸æŠžã™ã‚‹ã¨ï½¤èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼ã€èƒ½åŠ›ã‚’ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- </text>
- <text name="role_actions_modifiable">
- ã‚ãªãŸã¯å½¹å‰²ã«èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="role_actions_not_modifiable">
- 能力ã®è¡¨ç¤ºã¯ã§ãã¾ã™ãŒï½¤ä¿®æ­£ã‚„割り当ã¦ãªã©ã¯ã§ãã¾ã›ã‚“。
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- 能力
- </text>
- <text name="static2">
- 能力ã®èª¬æ˜Žã€ã©ã®å½¹å‰²ã¨ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’å®Ÿè¡Œã§ãã‚‹ã‹ã‚’
-表示ã§ãã¾ã™ã€‚
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ ä¿å­˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™
+ </panel.string>
+ <panel.string name="want_apply_text">
+ 変更をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ </panel.string>
<tab_container name="roles_tab_container">
<panel label="メンãƒãƒ¼" name="members_sub_tab" tool_tip="メンãƒãƒ¼">
- <button label="検索" name="search_button"/>
- <button label="å…¨ã¦ã‚’表示" name="show_all_button"/>
- <name_list name="member_list">
- <column label="メンãƒãƒ¼å" name="name"/>
- <column label="寄付ã•れãŸTier" name="donated"/>
- <column label="最終ログイン" name="online"/>
- </name_list>
- <button label="æ–°ã—ã„メンãƒãƒ¼ã‚’招待" name="member_invite"/>
- <button label="グループã‹ã‚‰è¿½æ”¾" name="member_eject"/>
- <string name="help_text">
+ <panel.string name="help_text">
ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚’付加ã€å‰Šé™¤ã§ãã¾ã™ã€‚
Ctrl キーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨
複数ã®äººã‚’é¸æŠžã§ãã¾ã™ã€‚
- </string>
+ </panel.string>
+ <filter_editor label="メンãƒãƒ¼ã‚’é¸åˆ¥" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="メンãƒãƒ¼" name="name"/>
+ <name_list.columns label="寄付" name="donated"/>
+ <name_list.columns label="ステータス" name="online"/>
+ </name_list>
+ <button label="招待" name="member_invite"/>
+ <button label="追放" name="member_eject"/>
</panel>
<panel label="役割" name="roles_sub_tab">
- <button label="検索" name="search_button"/>
- <button label="ã™ã¹ã¦ã‚’表示" name="show_all_button"/>
+ <panel.string name="help_text">
+ 役割ã«ã¯ã€ã‚¿ã‚¤ãƒˆãƒ«ã¨è¨±å¯ã•れãŸèƒ½åŠ›ãŒ
+割り当ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ メンãƒãƒ¼ã¯
+1ã¤ä»¥ä¸Šã®å½¹å‰²ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ グループã§ä½¿ãˆã‚‹å½¹å‰²ã¯10ã¤ã¾ã§ã§ã€
+「全員(Everyone)ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ï¼ˆOwner)ã€ãŒãれã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ 「全員(Everyone)ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ï¼ˆOwner)ã€ã®å½¹å‰²ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string name="power_all_have_icon">
+ Checkbox_On
+ </panel.string>
+ <panel.string name="power_partial_icon">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor label="役割をé¸åˆ¥" name="filter_input"/>
<scroll_list name="role_list">
- <column label="役割å" name="name"/>
- <column label="肩書ã" name="title"/>
- <column label="メンãƒãƒ¼" name="members"/>
+ <scroll_list.columns label="役割" name="name"/>
+ <scroll_list.columns label="肩書ã" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="æ–°ã—ã„役割を作æˆ..." name="role_create"/>
+ <button label="æ–°ã—ã„役割" name="role_create"/>
<button label="役割を削除" name="role_delete"/>
- <string name="help_text">
- 役割ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ãŒã‚りã€ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡Œä½¿å¯èƒ½ãª
-能力ã®ãƒªã‚¹ãƒˆãŒå®šç¾©ã•れã¾ã™ã€‚ メンãƒãƒ¼ã¯ã€
-1ã¤ã¾ãŸã¯è¤‡æ•°ã®å½¹å‰²ã«å±žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—ã€
-「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã®å½¹å‰²ã‚’å«ã‚ã¦æœ€é«˜ã§10ã®å½¹å‰²ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
- </string>
- <string name="cant_delete_role">
- 「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã¯ç‰¹åˆ¥ãªå½¹å‰²ãªã®ã§ã€å‰Šé™¤ã§ãã¾ã›ã‚“。
- </string>
</panel>
- <panel label="能力" name="actions_sub_tab">
- <button label="検索" name="search_button"/>
- <button label="ã™ã¹ã¦ã‚’表示" name="show_all_button"/>
- <scroll_list name="action_list" tool_tip="èƒ½åŠ›ã‚’é¸æŠžã—ã¦è©³ç´°ã‚’表示ã—ã¾ã™ã€‚">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- <string name="help_text">
+ <panel label="能力" name="actions_sub_tab" tool_tip="能力ã®èª¬æ˜Žæ–‡ã«ã¯ã€ã©ã®å½¹å‰²ãƒ»ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’æŒã¤ã‹ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚">
+ <panel.string name="help_text">
ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã§å½¹å‰²ã‚’与ãˆã‚‰ã‚Œã¦ã„るメンãƒãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作ã¯ã€
能力ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ ã•ã¾ã–ã¾ãªèƒ½åŠ›ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚
- </string>
+ </panel.string>
+ <filter_editor label="能力をé¸åˆ¥" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="詳細を見るã«ã¯ã€èƒ½åŠ›ã‚’é¸ã‚“ã§ãã ã•ã„。">
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
割当られãŸå½¹å‰²
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
許å¯ã•れãŸèƒ½åŠ›
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
- </scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。">
- <column label="" name="icon"/>
- <column label="" name="action"/>
+ <scroll_list name="member_allowed_actions" tool_tip="å„能力ã®è©³ç´°ã¯ã€èƒ½åŠ›ã®ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。">
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
- åå‰
+ 役割å
</text>
+ <line_editor name="role_name"/>
+ <text name="static3">
+ 役割タイトル
+ </text>
+ <line_editor name="role_title"/>
<text name="static2">
説明
</text>
- <line_editor name="role_name">
- 従業員
- </line_editor>
- <text name="static3">
- 肩書ã
- </text>
- <line_editor name="role_title">
- (待機中)
- </line_editor>
- <text_editor name="role_description">
- (待機中)
- </text_editor>
+ <text_editor name="role_description"/>
<text name="static4">
割当られãŸãƒ¡ãƒ³ãƒãƒ¼
</text>
+ <check_box label="Reveal members" name="role_visible_in_list" tool_tip="グループ外ã®äººãŒä¸€èˆ¬ã‚¿ãƒ–を見ãŸã¨ãã«ã€ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡¨ç¤ºã•れるã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
<text name="static5" tool_tip="ç¾åœ¨é¸æŠžã•れã¦ã„る役割ã§å®Ÿè¡Œã§ãる能力ã®ãƒªã‚¹ãƒˆ">
許å¯ã•れãŸèƒ½åŠ›
</text>
- <check_box label="メンãƒãƒ¼ãŒå…¬é–‹çŠ¶æ…‹" name="role_visible_in_list" tool_tip="ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループ外ã®äººã®ä¸€èˆ¬ã‚¿ãƒ–ã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
- <scroll_list name="role_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="role_allowed_actions" tool_tip="å„能力ã®è©³ç´°ã¯ã€èƒ½åŠ›ã®ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
- <text name="static">
- 説明
- </text>
<text_editor name="action_description">
ã“れã¯ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã™ã‚‹ã€èƒ½åŠ›ã§ã™ã€‚ オーナーを追放ã§ãã‚‹ã®ã¯ã€åˆ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã ã‘ã§ã™ã€‚
</text_editor>
<text name="static2">
- 役割ã¨èƒ½åŠ›
+ ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²
</text>
<text name="static3">
- 能力ã®ã‚るメンãƒãƒ¼
+ ã“ã®èƒ½åŠ›ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_groups.xml b/indra/newview/skins/default/xui/ja/panel_groups.xml
index 785fd868ab..de81a6431a 100644
--- a/indra/newview/skins/default/xui/ja/panel_groups.xml
+++ b/indra/newview/skins/default/xui/ja/panel_groups.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
<text name="groupdesc">
- アクティブãªï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿåã¯å¤ªå­—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™
+ アクティブãªã‚°ãƒ«ãƒ¼ãƒ—ã¯å¤ªå­—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™
</text>
- <text name="groupcount">
- ã‚ãªãŸã¯[COUNT] ï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
+ <text name="groupcount" width="270">
+ [COUNT] ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
</text>
- <button label="IM/コール" name="IM"
+ <button label="IM・コール" name="IM"
tool_tip="インスタントメッセージ・セッションを開ã" />
<button label="情報" name="Info" />
<button label="アクティブ" name="Activate" />
diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
new file mode 100644
index 0000000000..be15e92aa1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="䏿˜Ž"/>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="プロフィール" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="フレンド登録" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="ã“ã®äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="共有" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="支払ã†" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="コール" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="コール終了" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="ボイスコントロール" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_instant_message.xml b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
new file mode 100644
index 0000000000..9fd0cb3b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="user_name" value="Erica Vader"/>
+ <text name="time_box" value="23:30"/>
+ </panel>
+ <button label="返信" name="reply"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
new file mode 100644
index 0000000000..87477c2651
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="ランドマークを作æˆ"/>
+ <string name="title_edit_landmark" value="ランドマークを編集"/>
+ <string name="title_landmark" value="ランドマーク"/>
+ <string name="not_available" value="(該当ãªã—)"/>
+ <string name="unknown" value="ï¼ˆä¸æ˜Žï¼‰"/>
+ <string name="public" value="(公開)"/>
+ <string name="server_update_text">
+ å ´æ‰€ã®æƒ…å ±ã¯ã‚µãƒ¼ãƒãƒ¼ãŒã‚¢ãƒƒãƒ—デートã•れるã¾ã§ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+ </string>
+ <string name="server_error_text">
+ ã“ã®ä½ç½®ã®æƒ…å ±ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="server_forbidden_text">
+ ã“ã®ä½ç½®ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="acquired_date">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <button name="back_btn" tool_tip="戻る"/>
+ <text name="title" value="場所ã®ãƒ—ロフィール"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="䏿˜Ž"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="所有者:"/>
+ <text name="creator_label" value="制作者:"/>
+ <text name="created_label" value="制作日:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="タイトル:"/>
+ <text name="notes_label" value="メモ:"/>
+ <text name="folder_label" value="ランドマークã®ä½ç½®ï¼š"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
new file mode 100644
index 0000000000..993c52b561
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼"/>
+ <accordion_tab name="tab_landmarks" title="マイ ランドマーク"/>
+ <accordion_tab name="tab_inventory" title="æŒã¡ç‰©"/>
+ <accordion_tab name="tab_library" title="ライブラリ"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <button name="add_btn" tool_tip="æ–°ã—ã„ランドマークを追加ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除ã—ã¾ã™"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 0f270beb2c..c217af38ba 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <text name="first_name_text" left="20">
- ファーストãƒãƒ¼ãƒ ï¼š
- </text>
- <line_editor left="20" name="first_name_edit" width="126" />
- <text name="last_name_text" left="158">
- ラストãƒãƒ¼ãƒ ï¼š
- </text>
- <line_editor left="158" name="last_name_edit" width="126" />
- <text name="password_text">
- パスワード:
- </text>
- <text name="start_location_text" left="20" >
- ログインä½ç½®ï¼š
- </text>
- <combo_box name="start_location_combo" left_delta="92" width="172">
- <combo_box.item name="MyHome" label="自宅(ホーム)" />
- <combo_box.item name="MyLastLocation" label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" />
- <combo_box.item name="Typeregionname" label="&lt; 地域ã®åå‰å…¥åŠ› &gt;" />
- </combo_box>
- <check_box label="パスワードを記憶" name="remember_check" left_delta="180"/>
- <text name="full_screen_text">
- ログイン時ã«ã¯ãƒ•ルスクリーン表示ã«ãªã‚Šã¾ã™
- </text>
- <button label="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." label_selected="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." name="new_account_btn"/>
- <button label="環境設定..." label_selected="環境設定..." name="preferences_btn"/>
- <button label="ログイン" label_selected="ログイン" name="connect_btn"/>
- <button label="終了" label_selected="終了" name="quit_btn"/>
- <text name="version_text">
- 1.23.4 (5)
- </text>
- <text name="create_new_account_text">
- アカウントを申ã—込む
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
- <text name="forgot_password_text" left="-230" width="220">
- åå‰ã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
- </text>
- <text name="forgot_password_url">
- http://secondlife.com/account/request.php
- </text>
+ <panel.string name="create_account_url">
+ http://jp.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=ja
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ ファーストãƒãƒ¼ãƒ ï¼š
+ </text>
+ <line_editor label="最åˆ" name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/>
+ <text name="last_name_text">
+ ラストãƒãƒ¼ãƒ ï¼š
+ </text>
+ <line_editor label="最後" name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/>
+ <text name="password_text">
+ パスワード:
+ </text>
+ <check_box label="パスワードを記憶" name="remember_check"/>
+ <text name="start_location_text">
+ 開始地点:
+ </text>
+ <combo_box name="start_location_combo" width="160">
+ <combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation"/>
+ <combo_box.item label="ホーム" name="MyHome"/>
+ <combo_box.item label="<地域åを入力>" name="Typeregionname"/>
+ </combo_box>
+ <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ ãŠç”³ã—è¾¼ã¿
+ </text>
+ <text name="forgot_password_text">
+ åå‰ã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
+ </text>
+ <text name="login_help">
+ ãƒ­ã‚°ã‚¤ãƒ³ã®æ–¹æ³•
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
new file mode 100644
index 0000000000..36c7b75f97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ã‚‚ã®" name="main inventory panel">
+ <panel.string name="Title">
+ ã‚‚ã®
+ </panel.string>
+ <filter_editor label="æŒã¡ç‰©ã‚’フィルター" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="æŒã¡ç‰©" name="All Items"/>
+ <inventory_panel label="最新" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <button name="add_btn" tool_tip="æ–°ã—ã„アイテムを追加ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="ファイル" name="File">
+ <menu_item_call label="é–‹ã" name="Open"/>
+ <menu label="アップロード" name="upload">
+ <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
+ <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
+ <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
+ <menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="æ–°ã—ã„ウィンドウ" name="New Window"/>
+ <menu_item_call label="フィルターを表示" name="Show Filters"/>
+ <menu_item_call label="フィルターをリセット" name="Reset Current"/>
+ <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="Close All Folders"/>
+ <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/>
+ <menu_item_call label="紛失物を空ã«ã™ã‚‹" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="æ–°è¦ä½œæˆ" name="Create">
+ <menu_item_call label="フォルダ" name="New Folder"/>
+ <menu_item_call label="スクリプト" name="New Script"/>
+ <menu_item_call label="ノートカード" name="New Note"/>
+ <menu_item_call label="ジェスãƒãƒ£ãƒ¼" name="New Gesture"/>
+ <menu label="衣類" name="New Clothes">
+ <menu_item_call label="シャツ" name="New Shirt"/>
+ <menu_item_call label="パンツ" name="New Pants"/>
+ <menu_item_call label="é´" name="New Shoes"/>
+ <menu_item_call label="é´ä¸‹" name="New Socks"/>
+ <menu_item_call label="ジャケット" name="New Jacket"/>
+ <menu_item_call label="スカート" name="New Skirt"/>
+ <menu_item_call label="手袋" name="New Gloves"/>
+ <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
+ <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
+ <menu_item_call label="アルファ" name="New Alpha"/>
+ <menu_item_call label="タトゥ" name="New Tattoo"/>
+ </menu>
+ <menu label="身体部ä½" name="New Body Parts">
+ <menu_item_call label="シェイプ(体型)" name="New Shape"/>
+ <menu_item_call label="スキン" name="New Skin"/>
+ <menu_item_call label="髪" name="New Hair"/>
+ <menu_item_call label="ç›®" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="ä¸¦ã¹æ›¿ãˆ" name="Sort">
+ <menu_item_check label="åå‰é †" name="By Name"/>
+ <menu_item_check label="日付順" name="By Date"/>
+ <menu_item_check label="フォルダを常ã«åå‰é †ã«ä¸¦ã¹ã‚‹" name="Folders Always By Name"/>
+ <menu_item_check label="システムフォルダを上ã«ä¸¦ã¹ã‚‹" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml
new file mode 100644
index 0000000000..dda5bc0009
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="マイ プロフィール" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="マイ プロフィール" name="panel_profile"/>
+ <panel label="マイ ピック" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
new file mode 100644
index 0000000000..6321dbb048
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="Media Settings General">
+ <text name="home_label">
+ ホームページ:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (ã“ã®ãƒšãƒ¼ã‚¸ã¯æŒ‡å®šã—ãŸãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã‚’パスã—ã¾ã›ã‚“)
+ </text>
+ <line_editor name="home_url" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚½ãƒ¼ã‚¹ã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸"/>
+ <text name="preview_label">
+ プレビュー
+ </text>
+ <text name="current_url_label">
+ ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ï¼š
+ </text>
+ <text name="current_url" tool_tip="メディアソースã®ç¾åœ¨ã®ãƒšãƒ¼ã‚¸" value=""/>
+ <button label="リセット" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="ループå†ç”Ÿ" name="auto_loop"/>
+ <check_box initial_value="false" label="最åˆã«ã‚¯ãƒªãƒƒã‚¯ã—ãŸã¨ãã®å‹•作" name="first_click_interact"/>
+ <check_box initial_value="false" label="自動ズーム" name="auto_zoom"/>
+ <check_box initial_value="false" label="自動メディアå†ç”Ÿ" name="auto_play"/>
+ <text name="media_setting_note">
+ 注æ„: ä½äººã¯ã“ã®è¨­å®šã‚’無視ã§ãã¾ã™
+ </text>
+ <check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦è‡ªå‹•調整" name="auto_scale"/>
+ <text name="size_label">
+ サイズ:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..223bd3e28c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="カスタマイズ" name="Media settings for controls">
+ <text name="controls_label">
+ コントロール:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ 標準
+ </combo_item>
+ <combo_item name="Mini">
+ ミニ
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_owner_control"/>
+ <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_group_interact"/>
+ <check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_group_control"/>
+ <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
new file mode 100644
index 0000000000..ea4fdb9ce5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="セキュリティ" name="Media Settings Security">
+ <check_box initial_value="false" label="指定ã—㟠URL パターンã‹ã‚‰å§‹ã¾ã‚‹æŽ¥ç¶šã‚’許å¯ã™ã‚‹" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒã‚りã¾ã—ãŸï¼š
+ </text>
+ <button label="追加" name="whitelist_add"/>
+ <button label="削除" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ 警告: 「一般ã€ã‚¿ãƒ–ã§æŒ‡å®šã•れãŸãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã¯ã€ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã«æŽ²è¼‰ã•れã¦ã„ã¾ã›ã‚“。 æ­£ã—ã„æ©Ÿèƒ½ãŒè¨­å®šã•れるã¾ã§ã€ã“ã®æ©Ÿèƒ½ã¯ä¸€æ™‚åœæ­¢ã—ã¾ã™ã€‚
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
new file mode 100644
index 0000000000..17461ef771
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="プロフィール" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=ja
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/billing.php?lang=ja
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="no_partner_text" value="ãªã—"/>
+ <string name="no_group_text" value="ãªã—"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
+ <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
+ </panel>
+ <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/>
+ <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
+ <text_editor name="acc_status_text">
+ ä½äººã€‚ 支払情報未登録。
+ リンデン。
+ </text_editor>
+ <text name="title_partner_text" value="パートナー:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(å–得中)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="グループ:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="å€‹äººçš„ãªæƒ…報を編集ã—ã¾ã™"/>
+ <button label="容姿ã®ç·¨é›†" name="edit_appearance_btn" tool_tip="見ãŸç›®ã‚’作æˆãƒ»ç·¨é›†ã—ã¾ã™ï¼š (身体的データã€è¡£é¡žãªã©ï¼‰"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
new file mode 100644
index 0000000000..0426c4fe9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
+ <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€ã¸é€²ã¿ã¾ã™"/>
+ <button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
+ <location_input label="場所" name="location_combo"/>
+ <search_combo_box label="検索" name="search_combo_box" tool_tip="検索">
+ <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
new file mode 100644
index 0000000000..c0549c8ae9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..3dbabc62be
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enter キーを押ã—ã¦ç™ºè¨€ã—ã€Ctrl + Enter キーã§å«ã³ã¾ã™ã€‚"/>
+ <button name="show_nearby_chat" tool_tip="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’表示・éžè¡¨ç¤º"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
new file mode 100644
index 0000000000..ca93d46e4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (メディアアイテム %ld )
+ </string>
+ <string name="empty_item_text">
+ &lt;空&gt;
+ </string>
+ <string name="parcel_media_name">
+ 区画ストリーミングメディア
+ </string>
+ <string name="parcel_audio_name">
+ 区画ストリーミングオーディオ
+ </string>
+ <string name="playing_suffix">
+ (å†ç”Ÿä¸­ï¼‰
+ </string>
+ <panel name="minimized_controls">
+ <button label="ã™ã¹ã¦åœæ­¢" name="all_nearby_media_disable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/>
+ <button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/>
+ <button name="open_prefs_btn" tool_tip="メディアã®è¨­å®šã‚’é–‹ãã¾ã™"/>
+ <button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="more_less_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="ã™ã¹ã¦" name="All"/>
+ <combo_box.item label="ã“ã®åŒºç”»å†…" name="WithinParcel"/>
+ <combo_box.item label="ã“ã®åŒºç”»å¤–" name="OutsideParcel"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="近接" name="media_proximity"/>
+ <scroll_list.columns label="表示" name="media_visibility"/>
+ <scroll_list.columns label="クラス" name="media_class"/>
+ <scroll_list.columns label="åå‰" name="media_name"/>
+ <scroll_list.columns label="デãƒãƒƒã‚°" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿ"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€æ™‚åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³é‡"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³ã‚’ミュート"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã«è¿‘ã¥ã"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚‰é ã–ã‹ã‚‹"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml
new file mode 100644
index 0000000000..cbeb5a7f97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes">
+ <layout_stack name="layout">
+ <layout_panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="個人的メモ:"/>
+ <text name="status_message2" value="ã“ã®äººã«è¨±å¯ï¼š"/>
+ <check_box label="オンライン状態ã®ç¢ºèª" name="status_check"/>
+ <check_box label="地図ã§å±…場所を確èª" name="map_check"/>
+ <check_box label="ç§ã®ã‚ªãƒ–ジェクトã®ç·¨é›†ãƒ»å‰Šé™¤ãƒ»å–å¾—" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="notes_buttons_panel">
+ <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
+ <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_online_status.xml b/indra/newview/skins/default/xui/ja/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..b941763388
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ã‚‚ã®" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <inventory_panel label="マイ アウトフィット" name="outfitslist_tab"/>
+ <inventory_panel label="ç€ç”¨ä¸­" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ <button label="アウトフィットをä¿å­˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å­˜ã—ã¾ã™" width="140"/>
+ <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã—ã¾ã™"/>
+ <button label="M" name="look_edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..e8caab0696
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear"/>
+ <menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="remove"/>
+ <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
+ <menu_item_call label="リンクを外ã™" name="remove_link"/>
+ <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
new file mode 100644
index 0000000000..bad4cdbc05
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="人" name="people_panel">
+ <string name="no_people" value="誰もã„ã¾ã›ã‚“"/>
+ <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“"/>
+ <string name="no_friends_online" value="オンラインã®ãƒ•レンドã¯ã„ã¾ã›ã‚“"/>
+ <string name="no_friends" value="フレンドã¯ã„ã¾ã›ã‚“"/>
+ <string name="people_filter_label" value="人をフィルター"/>
+ <string name="groups_filter_label" value="グループをフィルター"/>
+ <filter_editor label="フィルター" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="è¿‘ã" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="オプション"/>
+ <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
+ </panel>
+ </panel>
+ <panel label="マイ フレンド" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="オンライン"/>
+ <accordion_tab name="tab_all" title="全員"/>
+ </accordion>
+ <text name="no_friends_msg">
+ ãŠå‹é”を追加ã™ã‚‹ã«ã¯ã€[secondlife:///app/search/people グローãƒãƒ«æ¤œç´¢] ã‚’ã™ã‚‹ã‹ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’クリックã—ã¦è¡Œã£ã¦ãã ã•ã„。
+誰ã‹ä¸€ç·’ã«è¡Œå‹•ã‚’ã™ã‚‹äººã‚’ãŠæŽ¢ã—ã®æ™‚ã¯ã€[secondlife:///app/worldmap 地図をãŠè©¦ã—ã ã•ã„]。
+ </text>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="オプション"/>
+ <button name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
+ <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™"/>
+ </panel>
+ </panel>
+ <panel label="マイ グループ" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="オプション"/>
+ <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/>
+ <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/>
+ </panel>
+ </panel>
+ <panel label="最新" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="オプション"/>
+ <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示ã—ã¾ã™"/>
+ <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="共有" name="share_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示ã—ã¾ã™"/>
+ <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™"/>
+ <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_pick_info.xml b/indra/newview/skins/default/xui/ja/panel_pick_info.xml
new file mode 100644
index 0000000000..30fd8d1adc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="ãƒ”ãƒƒã‚¯ã®æƒ…å ±"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[loading...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="地図" name="show_on_map_btn"/>
+ <button label="編集" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml
new file mode 100644
index 0000000000..4f58c032da
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_picks.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ピック" name="panel_picks">
+ <string name="no_picks" value="ピックãªã—"/>
+ <string name="no_classifieds" value="クラシファイド広告ãªã—"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="ピック"/>
+ <accordion_tab name="tab_classifieds" title="クラシファイド広告"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="ç¾åœ¨åœ°ã®æ–°ã—ã„ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を作æˆã—ã¾ã™"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="情報" name="info_btn" tool_tip="ãƒ”ãƒƒã‚¯ã®æƒ…報を表示ã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示ã—ã¾ã™"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
new file mode 100644
index 0000000000..a6af5f3d3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="オン"/>
+ <string name="off" value="オフ"/>
+ <string name="anyone" value="全員"/>
+ <string name="available" value="利用å¯"/>
+ <string name="allocated" value="å‰²ã‚Šå½“ã¦æ¸ˆ"/>
+ <string name="title_place" value="場所ã®ãƒ—ロフィール"/>
+ <string name="title_teleport_history" value="テレãƒãƒ¼ãƒˆã®å±¥æ­´"/>
+ <string name="not_available" value="(該当ãªã—)"/>
+ <string name="unknown" value="ï¼ˆä¸æ˜Žï¼‰"/>
+ <string name="public" value="(公開)"/>
+ <string name="none_text" value="(ãªã—)"/>
+ <string name="sale_pending_text" value="(販売処ç†ä¸­ï¼‰"/>
+ <string name="group_owned_text" value="(グループ所有)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="平方メートル"/>
+ <string name="all_residents_text" value="ã™ã¹ã¦ã®ä½äºº"/>
+ <string name="group_text" value="グループ"/>
+ <string name="can_resell">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ </string>
+ <string name="can_not_resell">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="can_change">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆãƒ»åˆ†å‰²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ </string>
+ <string name="can_not_change">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆãƒ»åˆ†å‰²ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="server_update_text">
+ å ´æ‰€ã®æƒ…å ±ã¯ã€ã‚µãƒ¼ãƒãƒ¼ãŒã‚¢ãƒƒãƒ—デートã•れるã¾ã§ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+ </string>
+ <string name="server_error_text">
+ ã“ã®å ´æ‰€ã®æƒ…å ±ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="server_forbidden_text">
+ ã“ã®å ´æ‰€ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="acquired_date">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <string name="icon_PG" value="parcel_drk_PG"/>
+ <string name="icon_M" value="parcel_drk_M"/>
+ <string name="icon_R" value="parcel_drk_R"/>
+ <string name="icon_Voice" value="parcel_drk_Voice"/>
+ <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
+ <string name="icon_Fly" value="parcel_drk_Fly"/>
+ <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
+ <string name="icon_Push" value="parcel_drk_Push"/>
+ <string name="icon_PushNo" value="parcel_drk_PushNo"/>
+ <string name="icon_Build" value="parcel_drk_Build"/>
+ <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
+ <string name="icon_Scripts" value="parcel_drk_Scripts"/>
+ <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
+ <string name="icon_Damage" value="parcel_drk_Damage"/>
+ <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
+ <button name="back_btn" tool_tip="戻る"/>
+ <text name="title" value="場所ã®ãƒ—ロフィール"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="所有者:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="䏿˜Ž"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="区画">
+ <panel>
+ <text name="rating_label" value="レーティング区分:"/>
+ <text name="rating_value" value="䏿˜Ž"/>
+ <text name="voice_label" value="ボイス:"/>
+ <text name="voice_value" value="オン"/>
+ <text name="fly_label" value="飛行:"/>
+ <text name="fly_value" value="オン"/>
+ <text name="push_label" value="プッシュ:"/>
+ <text name="push_value" value="オフ"/>
+ <text name="build_label" value="制作:"/>
+ <text name="build_value" value="オン"/>
+ <text name="scripts_label" value="スクリプト:"/>
+ <text name="scripts_value" value="オン"/>
+ <text name="damage_label" value="ダメージ:"/>
+ <text name="damage_value" value="オフ"/>
+ <button label="土地情報" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="リージョン(地域) ">
+ <panel>
+ <text name="region_name_label" value="地域:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="種類:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="レーティング区分:"/>
+ <text name="region_rating" value="アダルト"/>
+ <text name="region_owner_label" value="所有者:"/>
+ <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_group_label" value="グループ:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="地域 / ä¸å‹•産" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="エステート(ä¸å‹•産)">
+ <panel>
+ <text name="estate_name_label" value="ä¸å‹•産:"/>
+ <text name="estate_rating_label" value="レーティング区分:"/>
+ <text name="estate_owner_label" value="所有者:"/>
+ <text name="covenant_label" value="約款:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="販売中">
+ <panel>
+ <text name="sales_price_label" value="価格:"/>
+ <text name="area_label" value="é¢ç©ï¼š"/>
+ <text name="traffic_label" value="トラフィック:"/>
+ <text name="primitives_label" value="プリム:"/>
+ <text name="parcel_scripts_label" value="スクリプト:"/>
+ <text name="terraform_limits_label" value="地形編集制é™ï¼š"/>
+ <text name="subdivide_label" value="分割・統åˆè¨±å¯ï¼š"/>
+ <text name="resale_label" value="å†ç‰ˆè¨±å¯ï¼š"/>
+ <text name="sale_to_label" value="販売先:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
new file mode 100644
index 0000000000..e2dba19c1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="場所" name="places panel">
+ <string name="landmarks_tab_title" value="マイ ランドマーク"/>
+ <string name="teleport_history_tab_title" value="テレãƒãƒ¼ãƒˆã®å±¥æ­´"/>
+ <filter_editor label="ç§ã®å ´æ‰€ã‚’フィルターã™ã‚‹" name="Filter"/>
+ <panel name="button_panel">
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="地図" name="map_btn"/>
+ <button label="編集" name="edit_btn" tool_tip="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…報を編集ã—ã¾ã™"/>
+ <button name="overflow_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
+ <button label="é–‰ã˜ã‚‹" name="close_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ <button label="ä¿å­˜" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index 0665dd4590..e0c25c35a1 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -1,12 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <text name="AspectRatioLabel1" tool_tip="(幅/高ã•)">
- 縦横比:
+<panel label="アドãƒãƒ³ã‚¹" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <slider label="視界角" name="camera_fov"/>
+ <slider label="è·é›¢" name="camera_offset_scale"/>
+ <text name="heading2">
+ 自動ãƒã‚¸ã‚·ãƒ§ãƒ³ï¼š
</text>
- <combo_box name="aspect_ratio" tool_tip="(幅/高ã•)">
- <combo_box.item label="4:3(標準CRT)" name="item1"/>
- <combo_box.item label="5:4(1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5(ワイドスクリï¼ãƒ³ï¼‰" name="item3"/>
- <combo_box.item label="16:9(ワイドスクリï¼ãƒ³ï¼‰" name="item4"/>
- </combo_box>
+ <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
+ <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
+ <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
+ <check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/>
+ <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
+ <slider label="逿˜Žåº¦" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/>
+ <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="0"/>
+ <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/>
+ </radio_group>
+ <check_box label="押ã™ã¨ãƒœã‚¤ã‚¹ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•を切り替ãˆã¾ã™ï¼š" name="push_to_talk_toggle_check" tool_tip="ãƒˆã‚°ãƒ«ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’1度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•設定を切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
+ <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
+ <button label="キー設定" name="set_voice_hotkey_button"/>
+ <button label="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
index 96123c9d98..7fd2e31698 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
@@ -1,21 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ãƒãƒƒãƒ—アップ" name="popups" title="ãƒãƒƒãƒ—アップ">
- <text name="text_box">
- ãƒãƒƒãƒ—アップを表示ã—ãªã„:
+ <text name="tell_me_label">
+ 知らã›ã‚‹ï¼š
</text>
- <text name="dont_show_label">
- 次ã®ãƒãƒƒãƒ—アップã¯è¡¨ç¤ºã—ãªã„:
- </text>
- <button label="ã“れã¯è¡¨ç¤ºã™ã‚‹" label_selected="ã“れã¯è¡¨ç¤ºã™ã‚‹" name="enable_popup"/>
- <text name="show_label" width="300" >
- 次ã®ãƒãƒƒãƒ—アップã¯è¡¨ç¤ºï¼š
+ <check_box label="リンデンドルを使用・å—ã‘å–ã‚‹ã¨ã" name="notify_money_change_checkbox"/>
+ <check_box label="フレンドãŒãƒ­ã‚°ã‚¤ãƒ³ãƒ»ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/>
+ <text name="show_label" width="300">
+ 常ã«è¡¨ç¤ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
</text>
- <text name="text_box2" width="280">
- ノートカードã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æä¾›ï¼š
+ <text name="dont_show_label">
+ 表示ã—ãªã„メッセージ:
</text>
- <check_box label="è‡ªå‹•çš„ã«æ‰¿èª" name="accept_new_inventory"/>
- <check_box label="承èªå¾Œã€è‡ªå‹•çš„ã«é–²è¦§" name="show_new_inventory"/>
- <button width="235" label="ãƒãƒƒãƒ—アップ全ã¦ã‚’有効化..." label_selected="「次回表示ã€ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ãƒªã‚»ãƒƒãƒˆ..." name="reset_dialogs_btn" tool_tip="å…¨ã¦ã®ã‚ªãƒ—ショナルãƒãƒƒãƒ—アップã¨ã€Œåˆå›žä½¿ç”¨ã€é€šçŸ¥ã‚’有効ã«ã—ã¦ãã ã•ã„。"/>
- <button width="235" label="ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’無効化..." name="skip_dialogs_btn" tool_tip="å…¨ã¦ã®ã‚ªãƒ—ショナルãƒãƒƒãƒ—アップã¨ã€Œåˆå›žä½¿ç”¨ã€é€šçŸ¥ã‚’無効ã«ã—ã¦ãã ã•ã„。"/>
- <check_box label="æ–°ãŸã«å—ã‘å–ã£ãŸã‚ªãƒ–ジェクトをæŒã¡ç‰©ã«è‡ªå‹•çš„ã«è¡¨ç¤º" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 3bf303eaa3..d6fe54fbd1 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -1,12 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat">
- <text name="text_box">
- ãƒãƒ£ãƒƒãƒˆã®ãƒ•ォント:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="å°" />
- <radio_item name="radio2" label="中" />
- <radio_item name="radio3" label="大" />
+ <radio_item label="å°" name="radio" value="0"/>
+ <radio_item label="中" name="radio2" value="1"/>
+ <radio_item label="大" name="radio3" value="2"/>
</radio_group>
<color_swatch label="自分" name="user"/>
<text name="text_box1">
@@ -14,44 +11,37 @@
</text>
<color_swatch label="ãã®ä»–" name="agent"/>
<text name="text_box2">
- ãã®ä»–
+ 他人
</text>
<color_swatch label="IM" name="im"/>
<text name="text_box3">
IM
</text>
- <color_swatch label="システム" name="system"/>
+ <color_swatch label="システム" name="system"/>
<text name="text_box4">
- システム
+ システム
</text>
<color_swatch label="エラー" name="script_error"/>
<text name="text_box5">
エラー
</text>
- <color_swatch label="オブジェクト" name="objects"/>
+ <color_swatch label="オブジェクト" name="objects"/>
<text name="text_box6">
- オブジェクト
+ オブジェクト
</text>
<color_swatch label="所有者" name="owner"/>
<text name="text_box7">
所有者
</text>
- <color_swatch label="å¹å‡ºã—" name="background"/>
- <text name="text_box8">
- å¹å‡ºã—
- </text>
<color_swatch label="URL" name="links"/>
<text name="text_box9">
URL
</text>
- <spinner label="フェード" name="fade_chat_time"/>
- <slider label="ä¸é€æ˜Žåº¦" name="console_opacity"/>
- <check_box label="全画é¢å¹…を使用 (å†èµ·å‹•ãŒå¿…è¦)" name="chat_full_width_check"/>
- <check_box label="Enterキーを押ã—ãŸå¾Œãƒãƒ£ãƒƒãƒˆ ãƒãƒ¼ã‚’é–‰ã˜ã‚‹" name="close_chat_on_return_check"/>
- <check_box label="ãƒãƒ£ãƒƒãƒˆä¸­ã¯ã€ã„ã¤ã§ã‚‚矢å°ã‚­ãƒ¼ã§ã‚¢ãƒã‚¿ãƒ¼ã‚’移動å¯èƒ½" name="arrow_keys_move_avatar_check"/>
- <check_box label="ローカルãƒãƒ£ãƒƒãƒˆã«ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を表示" name="show_timestamps_check"/>
- <check_box label="ãƒãƒ£ãƒƒãƒˆä¸­ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
- <check_box label="ãƒãƒ£ãƒƒãƒˆã®å¹ã出ã—を表示" name="bubble_text_chat"/>
- <slider label="ä¸é€æ˜Žåº¦" name="bubble_chat_opacity"/>
- <check_box label="スクリプト・エラーã¨è­¦å‘Šã‚’ãƒãƒ£ãƒƒãƒˆåŒæ§˜ã«è¡¨ç¤º" name="script_errors_as_chat"/>
+ <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
+ <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆå±¥æ­´ã«æ–‡å­—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/>
+ <radio_group name="chat_window" tool_tip="インスタントメッセージを別フローターã€ã¾ãŸã¯1ã¤ã®ãƒ•ローターã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºã—ã¾ã™ï¼ˆè¦å†èµ·å‹•)">
+ <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/>
+ <radio_item label="タブ" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 584fcd6164..f216c3acbc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -1,90 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="一般" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="常ã«è‡ªå®…(ホーム)ã«ãƒ­ã‚°ã‚¤ãƒ³" label="自宅(ホーム)"/>
- <combo_box.item name="MyLastLocation" tool_tip="å¸¸ã«æœ€å¾Œã«ã„ãŸå ´æ‰€ã«ãƒ­ã‚°ã‚¤ãƒ³" label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€"/>
- </combo_box>
- <check_box label="ログイン画é¢ã«ãƒ­ã‚°ã‚¤ãƒ³ä½ç½®ã‚’表示" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="ãªã—"/>
- <combo_box.item name="Show Temporarily" label="一時的ã«è¡¨ç¤º"/>
- <combo_box.item name="Always" label="ã„ã¤ã‚‚"/>
- </combo_box>
- <check_box label="å°ã•ãªã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
- <check_box label="ç”»é¢ä¸Šã§è‡ªåˆ†ã®åå‰ã‚’éš ã™" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- グループ・タイトル:
- </text>
- <check_box label="グループ・タイトルをã™ã¹ã¦éžè¡¨ç¤º" name="show_all_title_checkbox"/>
- <check_box label="ç”»é¢ä¸Šã§è‡ªåˆ†ã®ã‚°ãƒ«ãƒ¼ãƒ—・タイトルを隠ã™" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
- <text name="UI Size:">
- UI サイズ:
+ <text name="language_textbox">
+ 言語:
</text>
- <check_box label="è§£åƒåº¦ç‹¬ç«‹ã‚¹ã‚±ãƒ¼ãƒ«ã‚’使用" name="ui_auto_scale"/>
- <spinner label="退席ã¾ã§ã®æ™‚間:" name="afk_timeout_spinner"/>
- <check_box label="リンデン・ドル(L$ï¼‰ã®æ”¯æ‰•ã„/å—ã‘å–りを通知" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- レーティング区分:
+ <combo_box name="language_combobox">
+ <combo_box.item label="システムデフォルト" name="System Default Language"/>
+ <combo_box.item label="English (英語)" name="English"/>
+ <combo_box.item label="Dansk (デンマーク語) – ベータ" name="Danish"/>
+ <combo_box.item label="Deutsch (ドイツ語) – ベータ" name="Deutsch(German)"/>
+ <combo_box.item label="Español (スペイン語) – ベータ" name="Spanish"/>
+ <combo_box.item label="Français (フランス語) – ベータ" name="French"/>
+ <combo_box.item label="Italiano (イタリア語) - ベータ" name="Italian"/>
+ <combo_box.item label="Nederlands (オランダ語) - ベータ" name="Dutch"/>
+ <combo_box.item label="Polski (ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰ - ベータ" name="Polish"/>
+ <combo_box.item label="Português (ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰ – ベータ" name="Portugese"/>
+ <combo_box.item label="日本語 – ベータ" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (å†èµ·å‹•後ã«å映)
</text>
<text name="maturity_desired_prompt">
アクセスã—ãŸã„コンテンツ:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PGã€Matureã€Adult"/>
- <combo_box.item name="Desired_Mature" label="PGã¨Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="ä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆ" name="Desired_Adult"/>
+ <combo_box.item label="ä¸€èˆ¬ã¨æŽ§ãˆã‚" name="Desired_Mature"/>
+ <combo_box.item label="一般" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
ログインä½ç½®ï¼š
</text>
- <text name="show_names_textbox">
- åå‰ã‚’表示:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation" tool_tip="å¸¸ã«æœ€å¾Œã«ã„ãŸå ´æ‰€ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
+ <combo_box.item label="ホーム" name="MyHome" tool_tip="常ã«ãƒ›ãƒ¼ãƒ ï¼ˆè‡ªå®…)ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
+ </combo_box>
+ <check_box initial_value="true" label="ログイン画é¢ã«è¡¨ç¤ºã™ã‚‹" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ åå‰ã®è¡¨ç¤ºï¼š
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="オフ" name="radio" value="0"/>
+ <radio_item label="オン" name="radio2" value="1"/>
+ <radio_item label="一時的ã«è¡¨ç¤º" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="ç§ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
+ <check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- 自分ã®åŠ¹æžœã®è‰²ï¼š
- </text>
- <text name="seconds_textbox">
- ç§’
- </text>
- <text name="crash_report_textbox">
- クラッシュ報告:
+ ビームã®è‰²ï¼š
</text>
- <text name="language_textbox">
- 言語:
+ <text name="title_afk_text">
+ 一時退席ã¾ã§ã®æ™‚間:
</text>
- <text name="language_textbox2">
- (å†èµ·å‹•ã«ã¦å映)
- </text>
- <string name="region_name_prompt">
- &lt;地域ã®åå‰å…¥åŠ›&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="é€ã‚‹å‰ã«ç¢ºèªã™ã‚‹"/>
- <combo_box.item name="Alwayssend" label="常ã«é€ä¿¡"/>
- <combo_box.item name="Neversend" label="é€ä¿¡ã—ãªã„"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="システム・デフォルト"/>
- <combo_box.item name="English" label="English (英語)"/>
- <combo_box.item name="Danish" label="Dansk (デンマーク語) – ベータ"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (ドイツ語) – ベータ"/>
- <combo_box.item name="Spanish" label="Español (スペイン語) – ベータ"/>
- <combo_box.item name="French" label="Français (フランス語) – ベータ"/>
- <combo_box.item name="Italian" label="Italiano (イタリア語) - ベータ"/>
- <combo_box.item name="Hungarian" label="Magyar (ãƒãƒ³ã‚¬ãƒªãƒ¼èªžï¼‰ - ベータ"/>
- <combo_box.item name="Dutch" label="Nederlands (オランダ語) - ベータ"/>
- <combo_box.item name="Polish" label="Polski (ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰ - ベータ"/>
- <combo_box.item name="Portugese" label="Português (ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰ – ベータ"/>
- <combo_box.item name="Russian" label="РуÑÑкий (ロシア語) - ベータ"/>
- <combo_box.item name="Turkish" label="Türkçe (トルコ語) - ベータ"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (ウクライナ語) - ベータ"/>
- <combo_box.item name="Chinese" label="中文 (简体) (中国語) - ベータ"/>
- <combo_box.item name="(Japanese)" label="日本語 – ベータ"/>
- <combo_box.item name="(Korean)" label="한국어 (韓国語) – ベータ"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
+ <combo_box label="一時退席ã¾ã§ã®æ™‚間:" name="afk">
+ <combo_box.item label="2分" name="item0"/>
+ <combo_box.item label="5分" name="item1"/>
+ <combo_box.item label="10分" name="item2"/>
+ <combo_box.item label="30分" name="item3"/>
+ <combo_box.item label="一時退席設定ãªã—" name="item4"/>
</combo_box>
- <check_box label="言語をオブジェクトã¨å…±æœ‰" name="language_is_public" tool_tip="優先言語をインワールドã®ã‚ªãƒ–ジェクトãŒèªè­˜ã™ã‚‹"/>
+ <text name="text_box3">
+ å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰æ™‚ã®è¿”事:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 636c137b4b..8df829c296 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -1,66 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="表示" name="Display panel">
- <text name="text">
- 表示解åƒåº¦ï¼š
- </text>
- <button label="?" name="GraphicsPreferencesHelpButton" />
- <check_box label="ウィンドウ内㧠Second Life を起動" name="windowed mode" />
- <text_editor name="voice_chat_description">
- ãƒã‚§ãƒƒã‚¯ç„¡ã—ã®å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³æ™‚ã«ãƒ•ルスクリーン表示
- </text_editor>
- <text name="Fullscreen Aspect Ratio:">
- 全画é¢ã®ç¸¦æ¨ªæ¯”:
- </text>
- <text name="(width / height)">
- (幅ï¼é«˜ã•)
- </text>
- <text_editor bottom="-56" height="40" name="FullScreenInfo" width="480">
- ãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ãƒ“ューワãŒãƒ•ルスクリーンã§è¡¨ç¤ºã•れã¾ã™ã€‚
- </text_editor>
<text name="WindowSizeLabel">
ウィンドウ・サイズ:
</text>
+ <check_box label="全画é¢" name="windowed mode"/>
<combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="720x480 (NTSC)" name="720x480"/>
+ <combo_box.item label="768x576 (PAL)" name="768x576"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
</combo_box>
- <text name="DisplayResLabel">
- 表示解åƒåº¦ï¼š
- </text>
- <text name="AspectRatioLabel1" tool_tip="(幅/高ã•)">
- 縦横比:
- </text>
- <combo_box name="aspect_ratio" tool_tip="(幅/高ã•)">
- <combo_box.item name="4:3(StandardCRT)" label="4:3(標準CRT)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4(1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5(ワイドスクリï¼ãƒ³ï¼‰" />
- <combo_box.item name="16:9(Widescreen)" label="16:9(ワイドスクリï¼ãƒ³ï¼‰" />
- </combo_box>
- <check_box label="自動検出率" name="aspect_auto_detect" />
<text name="UI Size:">
- UIサイズ:
- </text>
- <text name="(meters, lower is faster)">
- (メートルã€ä½Žã„ã»ã©é€Ÿã„)
- </text>
- <text name="text2">
- 表示オプション:
- </text>
- <check_box label="è§£åƒåº¦å˜ç‹¬ã‚¹ã‚±ãƒ¼ãƒ«ã‚’使用" name="ui_auto_scale" />
- <spinner label="æç”»è·é›¢ï¼š" name="draw_distance" />
- <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’一人称視点(マウスルック)ã§è¡¨ç¤º" name="avfp" />
- <text name="HigherText">
- å“質ãŠã‚ˆã³
+ UI サイズ:
</text>
- <text name="QualityText">
- パフォーマンス:
+ <text name="QualitySpeed">
+ クオリティã¨ã‚¹ãƒ”ード:
</text>
<text name="FasterText">
速ã„
</text>
+ <text name="BetterText">
+ é…ã„
+ </text>
<text name="ShadersPrefText">
低
</text>
@@ -73,99 +35,82 @@
<text name="ShadersPrefText4">
超高
</text>
- <text name="HigherText2">
- 高ã„
- </text>
- <text name="QualityText2">
- å“質
- </text>
- <check_box label="カスタム" name="CustomSettings" />
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- シェーダー:
- </text>
- <check_box label="ãƒãƒ³ãƒ—・マッピングã¨å…‰æ²¢" name="BumpShiny" />
- <check_box label="基本シェーダー" name="BasicShaders"
- tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã‚°ãƒ©ãƒ•ィック・カード・ドライãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥é˜²æ­¢ã«ãªã‚Šã¾ã™ã€‚" />
- <check_box label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders" />
- <check_box label="æ°´ã®åå°„" name="Reflections" />
- <text name="ReflectionDetailText">
- å射詳細:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="åœ°å½¢ã¨æ¨¹æœ¨" />
- <radio_item name="1" label="ã™ã¹ã¦ã®é™çš„オブジェクト" />
- <radio_item name="2" label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" />
- <radio_item name="3" label="ã™ã¹ã¦" />
- </radio_group>
- <text name="AvatarRenderingText">
- ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
- </text>
- <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’下ã’ã‚‹" name="AvatarImpostors" />
- <check_box label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram" />
- <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã®æœ" name="AvatarCloth" />
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="æç”»è·é›¢ï¼š" name="DrawDistance" />
- <slider label="最大パーティクル数:" name="MaxParticleCount" />
- <slider label="ãƒã‚¹ãƒˆãƒ—ロセスå“質:" name="RenderPostProcess" />
- <text name="MeshDetailText">
- メッシュ詳細:
- </text>
- <slider label=" オブジェクト:" name="ObjectMeshDetail" />
- <slider label=" フレキシプリム:" name="FlexibleMeshDetail" />
- <slider label=" 樹木:" name="TreeMeshDetail" />
- <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail" />
- <slider label=" 地形:" name="TerrainMeshDetail" />
- <slider label=" 空:" name="SkyMeshDetail" />
- <text name="PostProcessText">
- 低
- </text>
- <text name="ObjectMeshDetailText">
- 低
- </text>
- <text name="FlexibleMeshDetailText">
- 低
- </text>
- <text name="TreeMeshDetailText">
- 低
- </text>
- <text name="AvatarMeshDetailText">
- 低
- </text>
- <text name="TerrainMeshDetailText">
- 低
- </text>
- <text name="SkyMeshDetailText">
- 低
- </text>
- <text name="LightingDetailText">
- ライティング詳細:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="å¤ªé™½ã¨æœˆã®ã¿" />
- <radio_item name="LocalLights" label="近隣ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ©ã‚¤ãƒˆ" />
- </radio_group>
- <text name="TerrainDetailText">
- 地形詳細:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="低" />
- <radio_item name="2" label="高" />
- </radio_group>
+ <panel label="カスタムグラフィック" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ シェーダー:
+ </text>
+ <check_box initial_value="true" label="ãƒãƒ³ãƒ—マッピングã¨å…‰æ²¢" name="BumpShiny"/>
+ <check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã€ã‚°ãƒ©ãƒ•ィックカードã®ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚"/>
+ <check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="æ°´ã®åå°„" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ å射詳細:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="åœ°å½¢ã¨æ¨¹æœ¨" name="0"/>
+ <radio_item label="ã™ã¹ã¦ã®é™æ­¢ã‚ªãƒ–ジェクト" name="1"/>
+ <radio_item label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" name="2"/>
+ <radio_item label="ã™ã¹ã¦" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
+ </text>
+ <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æç”»ã‚’簡略化" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®å¸ƒ" name="AvatarCloth"/>
+ <slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="最大パーティクル数:" name="MaxParticleCount"/>
+ <slider label="ãƒã‚¹ãƒˆãƒ—ロセスå“質:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ メッシュ詳細:
+ </text>
+ <slider label=" オブジェクト:" name="ObjectMeshDetail"/>
+ <slider label=" フレキシプリム:" name="FlexibleMeshDetail"/>
+ <slider label=" 樹木:" name="TreeMeshDetail"/>
+ <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail"/>
+ <slider label=" 地形:" name="TerrainMeshDetail"/>
+ <slider label=" 空:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ 低
+ </text>
+ <text name="ObjectMeshDetailText">
+ 低
+ </text>
+ <text name="FlexibleMeshDetailText">
+ 低
+ </text>
+ <text name="TreeMeshDetailText">
+ 低
+ </text>
+ <text name="AvatarMeshDetailText">
+ 低
+ </text>
+ <text name="TerrainMeshDetailText">
+ 低
+ </text>
+ <text name="SkyMeshDetailText">
+ 低
+ </text>
+ <text name="LightingDetailText">
+ ライティング詳細:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon"/>
+ <radio_item label="è¿‘ãã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚µã‚¤ãƒˆ" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ 地形詳細:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="低" name="0"/>
+ <radio_item label="高" name="2"/>
+ </radio_group>
</panel>
- <button label="推奨ã•れãŸè¨­å®š" name="Defaults" />
- <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚ªãƒ—ション"
- label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚ªãƒ—ション"
- name="GraphicsHardwareButton" />
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"/>
+ <button label="リセット" name="Defaults"/>
+ <button label="詳ã—ã„設定" name="Advanced"/>
+ <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index 20299542fb..b81889b412 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -1,32 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ãƒãƒ£ãƒƒãƒˆè¨­å®š" name="im">
- <text name="text_box">
- オンライン通知:
+ <panel.string name="log_in_to_change">
+ ログインã—ã¦å¤‰æ›´
+ </panel.string>
+ <button label="履歴を消去" name="clear_cache" tool_tip="ログイン画åƒã€æœ€å¾Œã«ã„ãŸå ´æ‰€ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆå±¥æ­´ã€Webã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除ã—ã¾ã™"/>
+ <text name="cache_size_label_l">
+ (ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ­´ï¼‰
</text>
- <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è‡ªåˆ†ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚’確èªå¯èƒ½ã«" name="online_visibility"/>
- <text name="text_box2">
- IMオプション:
+ <check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãã‚‹ã®ã¯ã€ãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/>
+ <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>
+ <check_box label="コールãŒçµ‚了ã—ãŸã‚‰è‡ªå‹•çš„ã«ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/>
+ <check_box label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
+ <text name="Logs:">
+ ログ:
</text>
- <text name="log_in_to_change">
- ログインã—ã¦å¤‰æ›´ã—ã¦ãã ã•ã„
- </text>
- <check_box label="IMã‚’é›»å­ãƒ¡ãƒ¼ãƒ«ï¼ˆ[EMAIL])ã¸é€ä¿¡" name="send_im_to_email"/>
- <check_box label="ãƒãƒ£ãƒƒãƒˆã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«IMを表示ã™ã‚‹" name="include_im_in_chat_console"/>
- <check_box label="IMã«ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を表示" name="show_timestamps_check"/>
- <check_box label="オンライン・フレンド通知を表示" name="friends_online_notify_checkbox"/>
- <text name="text_box4">
- 記録オプション:
- </text>
- <check_box label="IMログを自分ã®ã‚³ãƒ³ãƒ”ュータã«ä¿å­˜" name="log_instant_messages"/>
- <check_box label="IMログã«ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を表示" name="log_instant_messages_timestamp"/>
- <check_box label="ローカルãƒãƒ£ãƒƒãƒˆã®ãƒ­ã‚°ã‚’自分ã®ã‚³ãƒ³ãƒ”ュータã«ä¿å­˜" name="log_chat"/>
- <check_box label="最後ã®IMãƒãƒ£ãƒƒãƒˆã®æœ«å°¾ã‚’表示" name="log_show_history"/>
- <check_box label="ローカルãƒãƒ£ãƒƒãƒˆã®ãƒ­ã‚°ã«ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を表示" name="log_chat_timestamp"/>
- <check_box label="ローカルãƒãƒ£ãƒƒãƒˆã®ãƒ­ã‚°ã«å—ä¿¡IMを表示" name="log_chat_IM"/>
- <check_box label="ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã«æ—¥ä»˜ã‚’加ãˆã‚‹" name="log_date_timestamp"/>
- <button label="パス変更" label_selected="パス変更" name="log_path_button"/>
- <text name="text_box3">
- å–り込ã¿ä¸­
-応答メッセージ:
+ <check_box label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’コンピューターã«ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
+ <check_box label="IM ログをコンピューターã«ä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
+ <check_box label="日時を入れる" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ ログã®ä¿å­˜å ´æ‰€ï¼š
</text>
+ <button label="å‚ç…§" label_selected="å‚ç…§" name="log_path_button"/>
+ <button label="ブロックリスト" name="block_list"/>
</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 ded6f9df38..ad8c8437be 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -1,31 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="æ“作ã¨ã‚«ãƒ¡ãƒ©" name="Input panel">
- <text name=" Mouselook Options:">
- 一人称視点
-(マウスルック):
+<panel label="セットアップ" name="Input panel">
+ <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
+ <text name="Mouselook:">
+ 一人称視点:
</text>
- <text name=" Mouse Sensitivity:">
- 感度:
+ <text name=" Mouse Sensitivity">
+ ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦
</text>
- <check_box label="上下をå転" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- 自動飛行オプション:
+ <check_box label="切り替ãˆ" name="invert_mouse"/>
+ <text name="Network:">
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š
</text>
- <check_box label="上下矢å°ã‚­ãƒ¼ã®é•·æŠ¼ã—ã§é£›è¡Œï¼ç€åœ°" name="automatic_fly"/>
- <text name=" Camera Options:">
- カメラ・オプション:
+ <text name="Maximum bandwidth">
+ 最大帯域幅
</text>
- <text name="camera_fov_label">
- カメラ視野角:
+ <text name="text_box2">
+ kbps
</text>
- <text name="Camera Follow Distance:">
- カメラ追従è·é›¢ï¼š
+ <check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="connection_port"/>
+ <text name="cache_size_label_l">
+ キャッシュサイズ
</text>
- <check_box label="編集カメラã®è‡ªå‹•移動" name="edit_camera_movement" tool_tip="編集モードã®é–‹å§‹ã€çµ‚了時ã¯ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/>
- <check_box label="容姿カメラã®è‡ªå‹•移動" name="appearance_camera_movement" tool_tip="編集モードã§ã¯ã€ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/>
- <text name="text2">
- ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
+ <text name="text_box5">
+ MB
</text>
- <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’一人称視点(マウスルック)ã§è¡¨ç¤º" name="first_person_avatar_visible"/>
- <button label="ジョイスティック設定" name="joystick_setup_button"/>
+ <text name="Cache location">
+ キャッシュã®ä¿å­˜å ´æ‰€ï¼š
+ </text>
+ <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>
+ <button label="リセット" label_selected="リセット" name="reset_cache"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value="0"/>
+ <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•中ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="1"/>
+ </radio_group>
+ <check_box initial_value="false" label="Web プロキシを有効ã«ã™ã‚‹" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ プロキシ:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ロキシã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレス"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index d8763193ae..af64a217f6 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,77 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="音声ã¨ãƒ“デオ" name="Preference Media panel">
- <slider label="マスター" name="System Volume"/>
- <slider label="風ã®éŸ³é‡" name="Wind Volume"/>
- <slider label="サウンド" name="SFX Volume"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="サウンド" name="Preference Media panel">
+ <slider label="全体ã®éŸ³é‡" name="System Volume"/>
+ <check_box initial_value="true" label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/>
+ <slider label="ボタン" name="UI Volume"/>
+ <slider label="風" name="Wind Volume"/>
+ <slider label="効果音" name="SFX Volume"/>
+ <slider label="ストリーミング音楽" name="Music Volume"/>
+ <check_box label="有効" name="music_enabled"/>
<slider label="メディア" name="Media Volume"/>
- <slider label="UI" name="UI Volume"/>
- <slider label="ミュージック" name="Music Volume"/>
- <slider label="ボイス" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- ボイスãƒãƒ£ãƒƒãƒˆã‚’利用ã§ãã¾ã›ã‚“
- </text_editor>
- <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’有効ã«ã™ã‚‹" name="enable_voice_check"/>
- <radio_group name="ear_location">
- <radio_item name="0" label="カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。" />
- <radio_item name="1" label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。" />
- </radio_group>
- <button label="機器ã®è¨­å®š" name="device_settings_btn"/>
- <text name="muting_text">
- ボリューム:
- </text>
- <check_box label="オーディオをミュート" name="disable audio" />
- <text name="streaming_prefs_text">
- ストリーム環境設定:
- </text>
- <text name="audio_prefs_text">
- オーディオ環境設定:
- </text>
- <panel label="ボリューム" name="Volume Panel" />
- <check_box label="メディアを自動å†ç”Ÿ" name="auto_streaming_video" />
- <check_box
- label="ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒæœ€å°åŒ–ã•れãŸã¨ãã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’ミュート"
- name="mute_when_minimized" />
- <text name="streaming_text">
- ストリーミング:
- </text>
- <check_box label="音楽ãŒã‚ã‚‹å ´åˆå†ç”Ÿã™ã‚‹"
- name="streaming_music" />
- <check_box
- label="ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢ä½¿ç”¨å¯æ™‚ã«å†ç”Ÿ"
- name="streaming_video" />
- <text name="system_volume_text">
- サウンド効果:
- </text>
- <text name="wind_volume_text">
- 風ã®éŸ³é‡ï¼š
+ <check_box label="有効" name="enable_media"/>
+ <slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Voice Volume"/>
+ <check_box label="有効" name="enable_voice_check"/>
+ <check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="media_auto_play_btn" tool_tip="ã“ã“ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¦ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•å†ç”Ÿã‚’許å¯ã—ã¾ã™" value="true"/>
+ <check_box label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã—ã¾ã™" name="media_show_on_others_btn" tool_tip="ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã€è¿‘ãã«ã„ã‚‹ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã€‚" value="true"/>
+ <text name="Listen from">
+ ボイスãƒãƒ£ãƒƒãƒˆã®è¨­å®š
</text>
- <text name="footsteps_volume_text">
- 足音:
- </text>
- <text name="ui_volume_text">
- UI音é‡ï¼š
- </text>
- <slider label="ドップラー効果" name="Doppler Effect" />
- <slider label="é éš”è¦å› " name="Distance Factor" />
- <slider label="ロールオフ係数" name="Rolloff Factor" />
- <spinner label="L$変更基準点" name="L$ Change Threshold" />
- <spinner label="ヘルス変化基準点" name="Health Change Threshold" />
- <text name="doppler_effect_text">
- オーディオ環境設定:
- </text>
- <text name="distance_factor_text">
- è·é›¢ä¿‚数:
- </text>
- <text name="rolloff_factor_text">
- ロールオフ:
- </text>
- <text name="default_upload_bitrate_text">
- デフォルトUL速度:
- </text>
- <radio_group name="bitrate">
- <radio_item name="32kbps" label="32kbps" />
- <radio_item name="64kbps" label="64kbps" />
- <radio_item name="96kbps" label="96kbps" />
- <radio_item name="128kbps" label="128kbps" />
+ <radio_group name="ear_location">
+ <radio_item label="カメラã®ä½ç½®ã‹ã‚‰èžã" name="0"/>
+ <radio_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰èžã" name="1"/>
</radio_group>
+ <button label="入力・出力機器" name="device_settings_btn"/>
+ <panel label="機器ã®è¨­å®š" name="device_settings_panel">
+ <panel.string name="default_text">
+ デフォルト
+ </panel.string>
+ <text name="Input">
+ 入力
+ </text>
+ <text name="My volume label">
+ ç§ã®éŸ³é‡ï¼š
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使ã£ã¦éŸ³é‡ã‚’調節ã—ã¾ã™"/>
+ <text name="wait_text">
+ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </text>
+ <text name="Output">
+ 出力
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..0e1e2851e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="ローディング"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navigate back"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navigate forward"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="ホームページ"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="æ›´æ–°"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="読ã¿è¾¼ã¿åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="メディアをå†ç”Ÿ"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€æ™‚åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="メディア URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="ホワイトリスト有効"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="安全ãªé–²è¦§"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="ムービーå†ç”Ÿé€²è¡Œ"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Step back"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Step forward"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="ミュート"/>
+ <slider name="volume_slider" tool_tip="メディアã®éŸ³é‡"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="メディアã«ã‚ºãƒ¼ãƒ ã‚¤ãƒ³"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom Back"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
new file mode 100644
index 0000000000..e7bc989c52
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="プロフィール" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=ja-JP
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=ja
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
+ <string name="no_partner_text" value="ãªã—"/>
+ <string name="no_group_text" value="ãªã—"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
+ </panel>
+ <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/>
+ <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
+ <text_editor name="acc_status_text">
+ ä½äººã€‚ 支払情報未登録。
+ リンデン。
+ </text_editor>
+ <text name="title_partner_text" value="パートナー:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(å–得中)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="グループ:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
+ <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="å€‹äººçš„ãªæƒ…報を編集ã—ã¾ã™"/>
+ <button label="容姿ã®ç·¨é›†" name="edit_appearance_btn" tool_tip="見ãŸç›®ã‚’作æˆãƒ»ç·¨é›†ã—ã¾ã™ï¼š (身体的データã€è¡£é¡žãªã©ï¼‰"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
new file mode 100644
index 0000000000..5666a93cf0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ オンライン
+ </string>
+ <string name="status_offline">
+ オフライン
+ </string>
+ <text_editor name="user_name" value="(ローディング...)"/>
+ <text name="status" value="オンライン"/>
+ <tab_container name="tabs">
+ <panel label="プロフィール" name="panel_profile"/>
+ <panel label="ピック" name="panel_picks"/>
+ <panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
index 169f922149..9a517d79e9 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="約款" name="Covenant">
- <text font="SansSerifLarge" name="estate_section_lbl">
- ä¸å‹•産:
+ <text font="SansSerifLarge" name="estate_section_lbl" width="200">
+ ä¸å‹•産
</text>
<text name="estate_name_lbl">
åå‰ï¼š
@@ -26,21 +26,20 @@
ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。
</text_editor>
<button label="リセット" name="reset_covenant"/>
- <text name="covenant_help_text">
+ <text name="covenant_help_text" left="100">
約款ã®å¤‰æ›´ã¯ä¸å‹•産全区画ã«é©ç”¨ã¨ãªã‚Šã¾ã™ã€‚
</text>
- <text name="covenant_instructions">
- ã“ã®ä¸å‹•産ã®ç´„款ã®å¤‰æ›´ã™ã‚‹ã«ã¯ã€
-ノートカードをドラッグ&amp;ドロップã—ã¦ãã ã•ã„。
+ <text name="covenant_instructions" width="390">
+ ã“ã®ä¸å‹•産約款ã®å¤‰æ›´ã‚’ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドロップã—ã¦ãã ã•ã„。
</text>
- <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl">
- 地域:
+ <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl" width="200">
+ 地域
</text>
<text name="region_name_lbl">
åå‰ï¼š
</text>
<text name="region_name_text">
- leyla
+ Erica
</text>
<text name="region_landtype_lbl">
種類:
diff --git a/indra/newview/skins/default/xui/ja/panel_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
index 4e6bae7172..f6865c12b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
@@ -6,14 +6,14 @@
<text name="region_text">
未知
</text>
- <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/>
<button label="?" name="disable_scripts_help"/>
- <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効化"/>
+ <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効ã«ã—ã¾ã™"/>
<button label="?" name="disable_collisions_help"/>
- <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/>
<button label="?" name="disable_physics_help"/>
<button label="é©ç”¨" name="apply_btn"/>
- <text name="objret_text_lbl" width="120" >
+ <text name="objret_text_lbl" width="120">
オブジェクトã®è¿”å´
</text>
<text name="resident_text_lbl">
@@ -22,19 +22,19 @@
<line_editor name="target_avatar_name">
(ãªã—)
</line_editor>
- <button label="é¸æŠž..." name="choose_avatar_btn"/>
+ <button label="é¸æŠž" name="choose_avatar_btn"/>
<text name="options_text_lbl">
オプション:
</text>
- <check_box label="スクリプトã®ã‚るオブジェクトã®ã¿ã‚’è¿”å´" name="return_scripts" tool_tip="スクリプトãŒã‚るオブジェクトã®ã¿ã‚’è¿”å´"/>
- <check_box label="他人ã®åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´"/>
- <check_box label="ã“ã®ä¸å‹•産ã®å„地域ã®ã‚ªãƒ–ジェクトを返å´" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´"/>
+ <check_box label="スクリプト付ãã®ã‚‚ã®" name="return_scripts" tool_tip="スクリプトã®ã‚ªãƒ–ジェクトã ã‘è¿”å´ã—ã¾ã™"/>
+ <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´ã—ã¾ã™"/>
+ <check_box label="ã“ã®ä¸å‹•産ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´ã—ã¾ã™"/>
<button label="è¿”å´" name="return_btn"/>
<button label="上部コライダーå–å¾—" name="top_colliders_btn" tool_tip="è¡çªã™ã‚‹å¯èƒ½æ€§ãŒæœ€ã‚‚高ã„オブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_colliders_help"/>
<button label="上部スクリプトå–å¾—" name="top_scripts_btn" tool_tip="スクリプトã®å®Ÿè¡Œã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_scripts_help"/>
- <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•"/>
+ <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•ã—ã¾ã™"/>
<button label="?" name="restart_help"/>
- <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã™ã‚‹"/>
+ <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 186820f00a..71551c7680 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -1,8 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ä¸å‹•産" name="Estate">
- <text name="estate_help_text">
- ã“ã®ã‚¿ãƒ–ã®è¨­å®šã‚’変更ã™ã‚‹ã¨ã“ã®ä¸å‹•産内
-ã®å…¨ã¦ã®åœ°åŸŸã«å½±éŸ¿ã‚’与ãˆã¾ã™ã€‚
+ <text name="estate_help_text" width="400">
+ ã“ã®ã‚¿ãƒ–内ã®è¨­å®šå¤‰æ›´ã¯ã€ä¸å‹•産内ã®ã™ã¹ã¦ã®åœ°åŸŸã«å½±éŸ¿ã—ã¾ã™ã€‚
</text>
<text name="estate_text">
ä¸å‹•産:
@@ -17,62 +16,59 @@
ï¼ˆä¸æ˜Žï¼‰
</text>
<text name="Only Allow">
- 次ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ï¼š
+ 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ï¼š
</text>
- <check_box label="æ”¯æ‰•ã„æƒ…報登録済ã¿ã®ä½äºº" name="limit_payment"
- tool_tip="æ”¯æ‰•ã„æƒ…報未登録ã®ä½äººã‚’排除ã™ã‚‹" />
- <check_box label="å¹´é½¢ç¢ºèªæ¸ˆã¿ã®æˆäºº" name="limit_age_verified"
- tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’排除ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã¯ã€support.secondlife.comã‚’å‚ç…§ã—ã¦ãã ã•ã„。" />
- <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check" />
- <button label="?" name="voice_chat_help" />
+ <check_box label="支払情報登録済" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™"/>
+ <check_box label="年齢確èª" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
+ <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/>
+ <button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
嫌ãŒã‚‰ã›ã«é–¢ã™ã‚‹ãƒ¡ãƒ¼ãƒ«å…ˆ:
</text>
<string name="email_unsupported">
サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„機能
</string>
- <button label="?" name="abuse_email_address_help" />
+ <button label="?" name="abuse_email_address_help"/>
<text name="estate_manager_label">
ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ï¼š
</text>
- <button label="?" name="estate_manager_help" />
- <button label="追加..." name="add_estate_manager_btn" />
- <button label="削除..." name="remove_estate_manager_btn" />
- <check_box label="世界時間を使用" name="use_global_time_check" />
- <button label="?" name="use_global_time_help" />
- <check_box label="太陽固定" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="段階" name="sun_hour_slider" />
- <check_box label="パブリック・アクセスを許å¯" name="externally_visible_check" />
- <button label="?" name="externally_visible_help" />
- <check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport" />
- <button label="?" name="allow_direct_teleport_help" />
+ <button label="?" name="estate_manager_help"/>
+ <button label="追加..." name="add_estate_manager_btn"/>
+ <button label="削除..." name="remove_estate_manager_btn"/>
+ <check_box label="世界時間を使用" name="use_global_time_check"/>
+ <button label="?" name="use_global_time_help"/>
+ <check_box label="太陽固定" name="fixed_sun_check"/>
+ <button label="?" name="fixed_sun_help"/>
+ <slider label="段階" name="sun_hour_slider"/>
+ <check_box label="パブリックアクセスを許å¯" name="externally_visible_check"/>
+ <button label="?" name="externally_visible_help"/>
+ <check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport"/>
+ <button label="?" name="allow_direct_teleport_help"/>
<text name="region_text_lbl">
支払ã„状æ³ã«ã‚ˆã‚Šã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ï¼š
</text>
- <check_box label="支払情報登録ãŒãªã„ã‚‚ã®ã‚’æ‹’å¦" name="deny_anonymous" />
- <check_box label="支払情報登録ãŒã‚ã‚‹ã‚‚ã®ã‚’æ‹’å¦" name="deny_identified" />
- <check_box label="使用ã•れã¦ã„る支払情報を拒å¦" name="deny_transacted" />
- <button label="é©ç”¨" name="apply_btn" />
+ <check_box label="支払情報登録ãŒãªã„ã‚‚ã®ã‚’æ‹’å¦" name="deny_anonymous"/>
+ <check_box label="支払情報登録ãŒã‚ã‚‹ã‚‚ã®ã‚’æ‹’å¦" name="deny_identified"/>
+ <check_box label="使用ã•れã¦ã„る支払情報を拒å¦" name="deny_transacted"/>
+ <button label="é©ç”¨" name="apply_btn"/>
<text name="allow_resident_label">
許å¯ã•れãŸä½äºº:
</text>
- <button label="?" name="allow_resident_help" />
- <button label="追加..." name="add_allowed_avatar_btn" />
- <button label="削除..." name="remove_allowed_avatar_btn" />
+ <button label="?" name="allow_resident_help"/>
+ <button label="追加..." name="add_allowed_avatar_btn"/>
+ <button label="削除..." name="remove_allowed_avatar_btn"/>
<text name="allow_group_label">
許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—:
</text>
- <button label="?" name="allow_group_help" />
- <button label="追加..." name="add_allowed_group_btn" />
- <button label="削除..." name="remove_allowed_group_btn" />
+ <button label="?" name="allow_group_help"/>
+ <button label="追加..." name="add_allowed_group_btn"/>
+ <button label="削除..." name="remove_allowed_group_btn"/>
<text name="ban_resident_label">
ç¦æ­¢ã•れãŸä½äºº:
</text>
- <button label="?" name="ban_resident_help" />
- <button label="追加..." name="add_banned_avatar_btn" />
- <button label="削除..." name="remove_banned_avatar_btn" />
- <button label="メッセージをä¸å‹•産ã¸é€ä¿¡..." name="message_estate_btn" />
- <button label="土地ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™..."
- name="kick_user_from_estate_btn" />
+ <button label="?" name="ban_resident_help"/>
+ <button label="追加..." name="add_banned_avatar_btn"/>
+ <button label="削除..." name="remove_banned_avatar_btn"/>
+ <button label="メッセージをä¸å‹•産ã«é€ä¿¡..." name="message_estate_btn"/>
+ <button label="土地ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index 690cf3f33d..168141ee77 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -3,19 +3,19 @@
<text name="region_text_lbl">
地域:
</text>
- <text left="90" name="region_text">
+ <text left_delta="70" name="region_text">
未知
</text>
<text name="version_channel_text_lbl" width="100">
ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
</text>
- <text left="90" name="version_channel_text">
+ <text left_delta="70" name="version_channel_text">
䏿˜Ž
</text>
<text name="region_type_lbl">
種類:
</text>
- <text name="region_type">
+ <text name="region_type" left_delta="70">
䏿˜Ž
</text>
<check_box label="土地整備をブロック" name="block_terraform_check"/>
@@ -28,9 +28,9 @@
<button label="?" name="restrict_pushobject_help"/>
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
<button label="?" name="land_resell_help"/>
- <check_box label="土地ã®çµ±åˆï¼åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
+ <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
<button label="?" name="parcel_changes_help"/>
- <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’人ã«è¦‹ã›ã‚‹"/>
+ <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
<button label="?" name="parcel_search_help"/>
<spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
<button label="?" name="agent_limit_help"/>
@@ -39,15 +39,15 @@
<text label="æˆäººæŒ‡å®š" name="access_text">
区分:
</text>
- <combo_box label="Mature" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
+ <combo_box label="控ãˆã‚" name="access_combo">
+ <combo_box.item label="アダルト" name="Adult"/>
+ <combo_box.item label="控ãˆã‚" name="Mature"/>
+ <combo_box.item label="一般" name="PG"/>
</combo_box>
<button label="?" name="access_help"/>
<button label="é©ç”¨" name="apply_btn"/>
- <button label="ユーザー1人ホームテレãƒãƒ¼ãƒˆ" name="kick_btn"/>
- <button label="ユーザー全員ホームテレãƒãƒ¼ãƒˆ" name="kick_all_btn"/>
- <button label="メッセージを地域ã¸é€ä¿¡..." name="im_btn"/>
+ <button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="kick_btn"/>
+ <button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="kick_all_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
<button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
new file mode 100644
index 0000000000..df7e5d9129
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="リージョン(地域)" name="General">
+ <text name="region_text_lbl">
+ 地域:
+ </text>
+ <text name="region_text" left_delta="70">
+ 䏿˜Ž
+ </text>
+ <text name="version_channel_text_lbl">
+ ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
+ </text>
+ <text name="version_channel_text" left_delta="70">
+ 䏿˜Ž
+ </text>
+ <text name="region_type_lbl">
+ 種類:
+ </text>
+ <text name="region_type" left_delta="70">
+ 䏿˜Ž
+ </text>
+ <check_box label="地形編集をブロック" name="block_terraform_check"/>
+ <check_box label="飛行をブロック" name="block_fly_check"/>
+ <check_box label="ダメージを許å¯" name="allow_damage_check"/>
+ <check_box label="プッシュを制é™" name="restrict_pushobject"/>
+ <check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
+ <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
+ <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
+ <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin" label_width="110" width="190"/>
+ <spinner label="物体ボーナス" name="object_bonus_spin" label_width="110" width="190"/>
+ <text label="レーティング区分" name="access_text">
+ レーティング区分:
+ </text>
+ <combo_box label="控ãˆã‚" name="access_combo">
+ <combo_box.item label="アダルト" name="Adult"/>
+ <combo_box.item label="控ãˆã‚" name="Mature"/>
+ <combo_box.item label="一般" name="PG"/>
+ </combo_box>
+ <button label="é©ç”¨" name="apply_btn"/>
+ <button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/>
+ <button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
+ <button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index d77f9749c2..8df803b2dc 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -18,13 +18,13 @@
<button label="?" name="fixed_sun_help" />
<slider label="段階" name="sun_hour_slider" />
<button label="é©ç”¨" name="apply_btn" />
- <button label="RAW地形ダウンロード..." name="download_raw_btn"
- tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" />
+ <button label="RAW 地形ダウンロード..." name="download_raw_btn"
+ tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
<button label="?" name="download_raw_help" />
- <button label="RAW地形アップロード..." name="upload_raw_btn"
- tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" />
+ <button label="RAW 地形アップロード..." name="upload_raw_btn"
+ tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
<button label="?" name="upload_raw_help" />
<button label="åœ°å½¢ã®æ§‹ç¯‰" name="bake_terrain_btn"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇ï¼ä¸‹é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®š" />
+ tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇・下é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®šã—ã¾ã™" />
<button label="?" name="bake_terrain_help" />
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_texture.xml b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
index 6527f0fbe6..526e6cdeb9 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼" name="Textures">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Textures">
<text name="region_text_lbl">
地域:
</text>
@@ -7,7 +7,7 @@
未知
</text>
<text name="detail_texture_text">
- 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ (512x512ã€24ビット .tgaファイルãŒå¿…è¦)
+ 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ (512x512ã€24ビット .tgaファイルãŒå¿…è¦ã§ã™ï¼‰
</text>
<text name="height_text_lbl">
1(低)
@@ -19,10 +19,10 @@
3
</text>
<text name="height_text_lbl4">
- 4(高)
+ 4(高)
</text>
<text name="height_text_lbl5">
- テクスãƒãƒ£ãƒ¼æ¨™é«˜ç¯„囲
+ テクスãƒãƒ£æ¨™é«˜ç¯„囲
</text>
<text name="height_text_lbl6">
å—西
@@ -36,22 +36,23 @@
<text name="height_text_lbl9">
北æ±
</text>
- <spinner label="低" name="height_start_spin_0" />
- <spinner label="低" name="height_start_spin_1" />
- <spinner label="低" name="height_start_spin_2" />
- <spinner label="低" name="height_start_spin_3" />
- <spinner label="高" name="height_range_spin_0" />
- <spinner label="高" name="height_range_spin_1" />
- <spinner label="高" name="height_range_spin_2" />
- <spinner label="高" name="height_range_spin_3" />
+ <spinner label="低" name="height_start_spin_0"/>
+ <spinner label="低" name="height_start_spin_1"/>
+ <spinner label="低" name="height_start_spin_2"/>
+ <spinner label="低" name="height_start_spin_3"/>
+ <spinner label="高" name="height_range_spin_0"/>
+ <spinner label="高" name="height_range_spin_1"/>
+ <spinner label="高" name="height_range_spin_2"/>
+ <spinner label="高" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- ã“ã‚Œã‚‰ã®æ•°å­—ã¯ã€ä¸Šè¨˜ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã‚’ブレンドã™ã‚‹ç¯„囲を表ã—ã¾ã™ã€‚
+ 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚
</text>
<text name="height_text_lbl11">
- 計測ã®å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼#1ã®è¡¨ç¤ºé«˜ã•ã®æœ€å¤§å€¤ã§ã™ã€‚
+ 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®
+「最大値ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
</text>
<text name="height_text_lbl12">
- ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚
+ ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚
</text>
- <button label="é©ç”¨" name="apply_btn" />
+ <button label="é©ç”¨" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
new file mode 100644
index 0000000000..a7305fa763
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ ローディング...
+ </panel.string>
+ <panel.string name="can_not_view">
+ ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºãƒ»ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºãƒ»ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ 公共ã®ã‚ªãƒ–ジェクトã§ã¯ã‚¹ã‚¯ãƒªãƒ—トを実行ã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel.string name="script_running">
+ 実行中
+ </panel.string>
+ <panel.string name="Title">
+ スクリプト: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ ローディング...
+ </text_editor>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save_btn"/>
+ <combo_box label="挿入..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="ファイル" name="File">
+ <menu_item_call label="ä¿å­˜" name="Save"/>
+ <menu_item_call label="å¤‰æ›´ã‚’å…ƒã«æˆ»ã™" name="Revert All Changes"/>
+ </menu>
+ <menu label="編集" name="Edit">
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="やり直ã—" name="Redo"/>
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+ <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
+ <menu_item_call label="検索 / å†é…ç½®..." name="Search / Replace..."/>
+ </menu>
+ <menu label="ヘルプ" name="Help">
+ <menu_item_call label="ヘルプ..." name="Help..."/>
+ <menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..494884c187
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="マイ ã‚¢ãƒã‚¿ãƒ¼" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¹ã‚¯ãƒªãƒ—ト使用
+ </text>
+ <text name="loading_text">
+ ローディング...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="オブジェクトå" name="name"/>
+ <scroll_list.columns label="場所" name="location"/>
+ </scroll_list>
+ <button label="リスト更新" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..d91eba9699
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="リージョンメモリ" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ 区画スクリプトメモリ
+ </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
+ <text name="loading_text">
+ ローディング...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="オブジェクトå" name="name"/>
+ <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner" width="120"/>
+ <scroll_list.columns label="区画" name="parcel"/>
+ <scroll_list.columns label="場所" name="location"/>
+ </scroll_list>
+ <button label="リスト更新" name="refresh_list_btn"/>
+ <button label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlight_btn"/>
+ <button label="è¿”å´" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray.xml b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
new file mode 100644
index 0000000000..5364b8726f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose" tab_title="サイドãƒãƒ¼ã‚’é–‹ã・閉ã˜ã‚‹"/>
+ <sidetray_tab description="ホーム。" name="sidebar_home" tab_title="ホーム">
+ <panel label="ホーム" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me" tab_title="マイ プロフィール">
+ <panel_container name="panel_container">
+ <panel label="ミー" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people" tab_title="人">
+ <panel_container name="panel_container">
+ <panel label="グループ情報" name="panel_group_info_sidetray"/>
+ <panel label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="行ããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¦ãã ã•ã„。" label="場所" name="sidebar_places" tab_title="場所">
+ <panel label="場所" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory" tab_title="マイ æŒã¡ç‰©">
+ <panel label="æŒã¡ç‰©ã‚’編集" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance" tab_title="マイ 容姿">
+ <panel label="容姿ã®ç·¨é›†" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/ja/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..8f4a76fd43
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="サイドパãƒãƒ«"/>
+ <button name="show_help" tool_tip="ヘルプを表示"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
new file mode 100644
index 0000000000..aef1f90298
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Part of side tray, see that XML file for panel config -->
+<panel label="home_tab" name="home_tab">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="sidebar_people">
+ <text name="tab_name" value="人"/>
+ <text name="tab_description">
+ ã‚ãªãŸã®ãƒ•レンドã€ã‚°ãƒ«ãƒ¼ãƒ—ã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¾ã™ã€‚
+ </text>
+ </panel>
+ <panel name="sidebar_places">
+ <text name="tab_name" value="場所"/>
+ <text name="tab_description">
+ 行ããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¾ã™ã€‚
+ </text>
+ </panel>
+ <panel name="sidebar_me">
+ <text name="tab_name" value="マイ プロフィール"/>
+ <text name="tab_description">
+ ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールを編集ã—ã¾ã™ã€‚
+ </text>
+ </panel>
+ <panel name="sidebar_appearance">
+ <text name="tab_name" value="マイ 容姿"/>
+ <text name="tab_description">
+ ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¾ã™ã€‚
+ </text>
+ </panel>
+ <panel name="sidebar_inventory">
+ <text name="tab_name" value="マイ æŒã¡ç‰©"/>
+ <text name="tab_description">
+ ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¾ã™ã€‚
+ </text>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..2308aff19b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_btn" tool_tip="ã“ã“をクリックã—ã¦ç«‹ã¡ä¸ŠãŒã‚Šã¾ã™ã€‚"/>
+ <button label="é£›è¡Œåœæ­¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ­¢"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 9c5fe981b8..a9e13cfd9f 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,42 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="ã‚ãªãŸãŒç«‹ã£ã¦ã„る土地区画ã®å å‰ã€‚クリックã™ã‚‹ã¨ã€ŒåœŸåœ°æƒ…å ±ã€ãŒé–‹ãã¾ã™ã€‚">
- 区画åã¯ã“ã“ã§ã™
- </text>
- <text name="BalanceText" tool_tip="å£åº§æ®‹é«˜">
- ローディング...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="貨幣ã®è³¼å…¥"/>
- <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋時)">
- 12:00 AM
- </text>
- <text name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
- </text>
- <text name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
- </text>
- <button label="" label_selected="" name="scriptout" tool_tip="スクリプト警告ãŠã‚ˆã³ã‚¨ãƒ©ãƒ¼"/>
- <button label="" label_selected="" name="health" tool_tip="å¥åº·çŠ¶æ…‹"/>
- <text name="HealthText" tool_tip="å¥åº·çŠ¶æ…‹">
- 100%
- </text>
- <button label="" label_selected="" name="fly" tool_tip="é£›è¡Œç¦æ­¢"/>
- <button label="" label_selected="" name="build" tool_tip="作æˆç¦æ­¢"/>
- <button label="" label_selected="" name="scripts" tool_tip="スクリプトãªã—"/>
- <button name="no_fly" tool_tip="é£›è¡Œç¦æ­¢"/>
- <button name="no_build" tool_tip="制作ï¼Rezç¦æ­¢"/>
- <button name="no_scripts" tool_tip="ã‚¹ã‚¯ãƒªãƒ—ãƒˆç¦æ­¢"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="プッシングを制é™"/>
- <button name="status_voice" tool_tip="ボイス有効"/>
- <button name="status_no_voice" tool_tip="ã“ã“ã§ã¯ãƒœã‚¤ã‚¹ã‚’使用ã§ãã¾ã›ã‚“。"/>
- <button label="" label_selected="" name="buyland" tool_tip="ã“ã®åŒºç”»ã‚’購入"/>
- <text name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
パケットæå¤±
- </text>
- <text name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
帯域幅
- </text>
- <line_editor label="検索" name="search_editor" tool_tip="[SECOND_LIFE]を検索"/>
- <button name="search_btn" tool_tip="[SECOND_LIFE]を検索"/>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="所æŒé‡‘"/>
+ <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="クリックã—ã¦ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’切り替ãˆã¾ã™"/>
+ <button name="volume_btn" tool_tip="グローãƒãƒ«éŸ³é‡è¨­å®š"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml b/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml
new file mode 100644
index 0000000000..81db7c8989
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="sys_well_item" title="sys_well_item">
+ <text name="title">
+ Beware the trout. BEWARE! THE! TROUT!
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
new file mode 100644
index 0000000000..2264ae965b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="今日"/>
+ <accordion_tab name="yesterday" title="昨日"/>
+ <accordion_tab name="2_days_ago" title="2æ—¥å‰"/>
+ <accordion_tab name="3_days_ago" title="3æ—¥å‰"/>
+ <accordion_tab name="4_days_ago" title="4æ—¥å‰"/>
+ <accordion_tab name="5_days_ago" title="5æ—¥å‰"/>
+ <accordion_tab name="6_days_and_older" title="6日以上å‰"/>
+ <accordion_tab name="1_month_and_older" title="1ヶ月以上å‰"/>
+ <accordion_tab name="6_months_and_older" title="åŠå¹´ä»¥ä¸Šå‰"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..c570cd5696
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="アイテム情報を表示"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml
index 391379b072..2f5c2bf6a1 100644
--- a/indra/newview/skins/default/xui/ja/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ ローディング...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ 無効ãªä½ç½®
+ </panel.string>
<panel.string name="world_map_north">
北
</panel.string>
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 9a58f753e5..0a63cedf10 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -1,205 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚加をèªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Membership">
- <action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待"
- longdescription="グループã«äººã‚’招待ã™ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ–>「メンãƒãƒ¼ã€ã‚µãƒ–タブã®ã€Œæ–°ã—ã„人を招待...ã€ãƒœã‚¿ãƒ³ã‚’使ã„ã¾ã™ã€‚"
- name="member invite" value="1" />
- <action description="メンãƒãƒ¼ã‚’ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾"
- longdescription="メンãƒãƒ¼ã‚’ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾ã™ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ– > 「役割ã€ã‚µãƒ–タブã®ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾ã€ã‚’使ã„ã¾ã™ã€‚ オーナーã¯ã€ä»–ã®ã‚ªãƒ¼ãƒŠãƒ¼ä»¥å¤–ã®ä»»æ„ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã§ãã¾ã™ã€‚ オーナーã§ãªã„ユーザーãŒã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã§ãã‚‹ã®ã¯ã€ãã®ãƒ¡ãƒ³ãƒãƒ¼ãŒã€Œå…¨å“¡ã€ã®å½¹å‰²ã«ã®ã¿æ‰€å±žã—ã¦ãŠã‚Šã€ä»–ã®å½¹å‰²ã«æ‰€å±žã—ã¦ã„ãªã„å ´åˆã ã‘ã§ã™ã€‚ 役割ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’除外ã™ã‚‹ã«ã¯ã€ã€Œå½¹å‰²ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’除外ã€èƒ½åŠ›ã‚’æœ‰ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
- name="member eject" value="2" />
- <action description="「会員募集ã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€Œå…¥ä¼šè²»ã€ã‚’変更。"
- longdescription="招待状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãるよã†ã«ã€Œä¼šå“¡å‹Ÿé›†ã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã®ã€Œã‚°ãƒ«ãƒ¼ãƒ—環境設定ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ã€Œå…¥ä¼šè²»ã€ã‚’変更ã—ã¾ã™ã€‚"
- name="member options" value="3" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚加をèªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership">
+ <action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「招待ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’招待ã—ã¾ã™ã€‚" name="member invite" value="1"/>
+ <action description="メンãƒãƒ¼ã‚’ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「追放ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã—ã¾ã™ã€‚ 「オーナーã€ã¯ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã¯èª°ã§ã‚‚追放ã§ãã¾ã™ã€‚ 「オーナーã€ã§ã¯ãªã„人ãŒã€Œå…¨å“¡ï¼ˆEveryone)ã€ã«ã—ã‹å½¹å‰²ãŒãªã„å ´åˆã€ãƒ¡ãƒ³ãƒãƒ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾ã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ 「役割ã€ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã™ã‚‹ã«ã¯ã€ã€Œå½¹å‰²ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã€ã®èƒ½åŠ›ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" name="member eject" value="2"/>
+ <action description="「自由å‚加ã€ã¨ã€Œå…¥ä¼šè²»ã€ã®åˆ‡ã‚Šæ›¿ãˆ" longdescription="「自由å‚加ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã¨ã€æ‹›å¾…ã•れãªãã¦ã‚‚æ–°ã—ã„メンãƒãƒ¼ãŒå…¥ä¼šã§ãã¾ã™ã€‚「入会費ã€ã¯ã€Œä¸€èˆ¬ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§å¤‰æ›´ã—ã¾ã™ã€‚" name="member options" value="3"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®å½¹å‰²ã‚’追加ã€å‰Šé™¤ã€å¤‰æ›´ã—ã€å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã€å‰Šé™¤ã—ã€ã•らã«å½¹å‰²ã¸èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Roles">
- <action description="æ–°ã—ã„役割を作æˆ"
- longdescription="「メンãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ– > 「役割ã€ã‚µãƒ–ã‚¿ãƒ–ã§æ–°ã—ã„役割を作æˆ"
- name="role create" value="4" />
- <action description="役割を削除"
- longdescription="役割を削除ã™ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ– > 「役割ã€ã‚µãƒ–タブを使ã„ã¾ã™ã€‚"
- name="role delete" value="5" />
- <action description="役割åã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã‚’変更"
- longdescription="役割åã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã‚’変更ã™ã‚‹ã«ã¯ã€å½¹å‰²ã‚’é¸æŠžã—ãŸå¾Œã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ– > 「役割ã€ã‚µãƒ–タブã®ä¸‹éƒ¨åˆ†ã‚’使ã„ã¾ã™ã€‚"
- name="role properties" value="6" />
- <action description="メンãƒãƒ¼ã‚’割り当ã¦äººã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹"
- longdescription="メンãƒãƒ¼ã‚’割り当ã¦äººã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ–>「役割ã€ã‚µãƒ–タブã®å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€å‰²ã‚Šå½“ã¦äººãŒç¾åœ¨æ‰€å±žã—ã¦ã„る役割ã«å¯¾ã—ã¦ã®ã¿ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã§ãã¾ã™ã€‚"
- name="role assign member limited" value="7" />
- <action description="メンãƒãƒ¼ã‚’ä»»æ„ã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹"
- longdescription="メンãƒãƒ¼ã‚’ä»»æ„ã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ–>「役割ã€ã‚µãƒ–タブã®å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€è‡ªåˆ†è‡ªèº«ã‚„ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ç¾åœ¨ã®å½¹å‰²ã‚ˆã‚Šã‚‚強力ãªå½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ãŸã‚ã€ã‚ªãƒ¼ãƒŠãƒ¼ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«å¯¾ã—ã¦ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿‘ã„パワーを与ãˆã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。"
- name="role assign member" value="8" />
- <action description="役割ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’解除"
- longdescription="メンãƒãƒ¼ã‚’役割ã‹ã‚‰è§£é™¤ã™ã‚‹ã«ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ–>「メンãƒãƒ¼ã€ã‚µãƒ–タブã®ã€Œå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™ã€‚ オーナーã¯è§£é™¤ã§ãã¾ã›ã‚“。"
- name="role remove member" value="9" />
- <action description="役割ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¨è§£é™¤"
- longdescription="役割ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¨è§£é™¤ã¯ã€ã€Œãƒ¡ãƒ³ãƒãƒ¼ã¨å½¹å‰²ã€ã‚¿ãƒ–>「役割ã€ã‚µãƒ–タブã®è¨±å¯ã•れãŸèƒ½åŠ›ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œã„ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã™ã¹ã¦ã®èƒ½åŠ›ã‚’è‡ªåˆ†è‡ªèº«ã‚„ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ãŸã‚ã€ã‚ªãƒ¼ãƒŠãƒ¼ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«å¯¾ã—ã¦ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿‘ã„パワーをæŒãŸã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。"
- name="role change actions" value="10" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®å½¹å‰²ã‚’追加ã€å‰Šé™¤ã€å¤‰æ›´ã—ã€å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã€å‰Šé™¤ã—ã€ã•らã«å½¹å‰²ã¸èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Roles">
+ <action description="æ–°ã—ã„役割を作æˆ" longdescription="æ–°ã—ã„「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–ã§ä½œæˆã—ã¾ã™ã€‚" name="role create" value="4"/>
+ <action description="役割を削除" longdescription="「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–ã§å‰Šé™¤ã§ãã¾ã™ã€‚" name="role delete" value="5"/>
+ <action description="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更" longdescription="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更ã—ã¾ã™ã€‚ 「役割ã€ã‚’é¸æŠžå¾Œã«ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ– ã®ä¸‹ã§è¨­å®šã§ãã¾ã™ã€‚" name="role properties" value="6"/>
+ <action description="メンãƒãƒ¼ã‚’割り当ã¦äººã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚ ã“ã®èƒ½åŠ›ãŒã‚るメンãƒãƒ¼ã¯ã€å‰²ã‚Šå½“ã¦ã‚‹äººãŒæ—¢ã«æ‰€å±žã™ã‚‹ã€Œå½¹å‰²ã€ã«ã®ã¿ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã§ãã¾ã™ã€‚" name="role assign member limited" value="7"/>
+ <action description="メンãƒãƒ¼ã‚’ä»»æ„ã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã©ã®ã€Œå½¹å‰²ã€ã«ã‚‚割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ *警告* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ç¾åœ¨ä»¥ä¸Šã®æ¨©é™ã®ã‚る「役割ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„力をæŒã¤ã‚ˆã†è¨­å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role assign member" value="8"/>
+ <action description="役割ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’解除" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚ 「オーナーã€ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。" name="role remove member" value="9"/>
+ <action description="役割ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¨è§£é™¤" longdescription="「許å¯ã•れãŸèƒ½åŠ›ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã«ã‚ã‚‹ã€å„「役割ã€ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ãŸã‚Šã€å‰Šé™¤ã—ã¾ã™ã€‚ *警告* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã™ã¹ã¦ã®ã€Œèƒ½åŠ›ã€ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„æ¨©é™ã‚’æŒã¤ã‚ˆã†è¨­å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role change actions" value="10"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®å…¬é–‹æ€§ã‚„ç†å¿µã€è¨˜ç« ã®å¤‰æ›´ã¨ã„ã£ãŸã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’修正ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Group Identity">
- <action
- description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—情報内ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。"
- longdescription="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—情報内ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更ã—ã¾ã™ã€‚ ã“ã®æ“作ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使用ã—ã¾ã™ã€‚"
- name="group change identity" value="11" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®å…¬é–‹æ€§ã‚„ç†å¿µã€è¨˜ç« ã®å¤‰æ›´ã¨ã„ã£ãŸã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’修正ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Group Identity">
+ <action description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb 上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—情報内ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。" longdescription="ç†å¿µã€è¨˜ç« ã€ã€Œæ¤œç´¢ã«è¡¨ç¤ºã€ã®å¤‰æ›´ã‚’ã—ã¾ã™ã€‚ 「一般ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œãˆã¾ã™ã€‚" name="group change identity" value="11"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’譲渡ã€ä¿®æ­£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ 「土地情報ã€ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‹ãã«ã¯ã€åœ°é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸æŠžã™ã‚‹ã‹ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã®ã€ŒåŒºç”»æƒ…å ±ã€ã‚’クリックã—ã¾ã™ã€‚"
- name="Parcel Management">
- <action description="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥"
- longdescription="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥ã‚’行ã„ã¾ã™ã€‚ ã“ã®æ“作ã«ã¯ã€åœŸåœ°æƒ…å ±ç”»é¢ ï¼ž 一般タブを使ã„ã¾ã™ã€‚"
- name="land deed" value="12" />
- <action description="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™"
- longdescription="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§Lindenç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。"
- name="land release" value="13" />
- <action description="売り地情報ã®è¨­å®š"
- longdescription="売り地情報を設定ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’è‡ªåˆ†ã®æ€ã„ã©ãŠã‚Šã«è²©å£²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。"
- name="land set sale info" value="14" />
- <action description="区画ã®å†åˆ†å‰²ã¨çµ±åˆ"
- longdescription="区画をå†åˆ†å‰²ãŠã‚ˆã³çµ±åˆã—ã¾ã™ã€‚ ã“ã®æ“作を実行ã™ã‚‹ã«ã¯ã€åœ°é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œåœ°å½¢ã‚’編集ã€ã‚’é¸æŠžã—ã€åœŸåœ°ã®ä¸Šã§ãƒžã‚¦ã‚¹ã‚’ドラッグã—ã¦ç¯„å›²ã‚’é¸æŠžã—ã¾ã™ã€‚ å†åˆ†å‰²ã™ã‚‹ã«ã¯ã€åˆ†å‰²å¯¾è±¡ã‚’é¸æŠžã—ãŸå¾Œã€ã€Œå†åˆ†å‰²...ã€ã‚’クリックã—ã¾ã™ã€‚ çµ±åˆã™ã‚‹ã«ã¯ã€è¤‡æ•°ã®éš£æŽ¥ã™ã‚‹åŒºç”»ã‚’é¸æŠžã—ãŸå¾Œã€ã€Œçµ±åˆ...ã€ã‚’クリックã—ã¾ã™ã€‚"
- name="land divide join" value="15" />
+ <action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®æ‰€æœ‰åœ°ã®è­²æ¸¡ã€ä¿®æ­£ã€è²©å£²ã‚’ã™ã‚‹æ¨©é™ãŒã‚りã¾ã™ã€‚ 「土地情報ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’見るã«ã¯ã€åœ°é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã‹ã€ãƒŠãƒ“ゲーションãƒãƒ¼ã®ã€Œiã€ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã—ã¾ã™ã€‚" name="Parcel Management">
+ <action description="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥" longdescription="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥ã‚’行ã„ã¾ã™ã€‚ ã“ã®æ“作ã«ã¯ã€åœŸåœ°æƒ…å ±ç”»é¢ ï¼ž 一般タブを使ã„ã¾ã™ã€‚" name="land deed" value="12"/>
+ <action description="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™" longdescription="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§ãƒªãƒ³ãƒ‡ãƒ³ç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land release" value="13"/>
+ <action description="売り地情報ã®è¨­å®š" longdescription="売り地情報を設定ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’è‡ªåˆ†ã®æ€ã„ã©ãŠã‚Šã«è²©å£²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land set sale info" value="14"/>
+ <action description="区画ã®å†åˆ†å‰²ã¨çµ±åˆ" longdescription="区画をå†åˆ†å‰²ã€çµ±åˆã—ã¾ã™ã€‚ 地é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œåœ°å½¢ã‚’編集ã€ã‚’é¸ã³ã€ãƒžã‚¦ã‚¹ã‚’土地ã®ä¸Šã§ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ç¯„å›²ã‚’é¸æŠžã—ã¾ã™ã€‚ å†åˆ†å‰²ã™ã‚‹ã«ã¯ã€åˆ†å‰²å¯¾è±¡ã‚’é¸ã‚“ã§ã€Œå†åˆ†å‰²ã€ã‚’クリックã—ã¾ã™ã€‚ çµ±åˆã™ã‚‹ã«ã¯ã€2ã¤ä»¥ä¸Šã®éš£æŽ¥ã™ã‚‹åŒºç”»ã‚’é¸ã‚“ã§ã€Œçµ±åˆã€ã‚’クリックã—ã¾ã™ã€‚" name="land divide join" value="15"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨­å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã«TPルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Parcel Identity">
- <action description="「場所検索ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’設定"
- longdescription="「場所検索ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’設定"
- name="land find places" value="17" />
- <action description="区画åã€èª¬æ˜Žã€ã€ŒWeb上ã§å…¬é–‹ã€ã®è¨­å®šã‚’変更"
- longdescription="区画åã€èª¬æ˜Žã€ã€ŒWeb上ã§å…¬é–‹ã€ã®è¨­å®šã‚’変更。 ã“ã®æ“作ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「オプションã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land change identity" value="18" />
- <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’設定"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚"
- name="land set landing point" value="19" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨­å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã« TP ルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity">
+ <action description="「場所検索ã«è¡¨ç¤ºã€ã‚’切り替ãˆã‚«ãƒ†ã‚´ãƒªã‚’設定" longdescription="「場所検索ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…報〠&gt; 「オプションã€ã‚¿ãƒ–ã§åŒºç”»ã®ã‚«ãƒ†ã‚´ãƒªã‚’設定ã—ã¾ã™ã€‚" name="land find places" value="17"/>
+ <action description="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨­å®šã‚’変更" longdescription="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨­å®šã‚’変更ã—ã¾ã™ã€‚ 「土地情報〠&gt; 「オプションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land change identity" value="18"/>
+ <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€éŸ³æ¥½ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šãªã©ã€åŒºç”»ã®ã‚ªãƒ—ションã«é–¢é€£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Parcel Settings">
- <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šã‚’変更"
- longdescription="ストリーミング・ミュージックã¨å‹•ç”»ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land change media" value="20" />
- <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ"
- longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *警告* 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨­ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚"
- name="land edit" value="21" />
- <action
- description="「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–内ã®ã•ã¾ã–ã¾ãªè¨­å®šã‚’切り替ãˆ"
- longdescription="「安全(ダメージãªã—)ã€ã€ã€Œé£›ã¶ã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€ ä»–ã®ä½äººãŒã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã§ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã€ã€ã€Œã‚¹ã‚¯ãƒªãƒ—トを実行ã€ã§ãるよã†ã«ã—ã¾ã™ã€‚"
- name="land options" value="22" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€éŸ³æ¥½ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šãªã©ã€åŒºç”»ã®ã‚ªãƒ—ションã«é–¢é€£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Settings">
+ <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šã‚’変更" longdescription="ストリーミングミュージックã¨å‹•ç”»ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land change media" value="20"/>
+ <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ" longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *警告* 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã®è¨­ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" name="land edit" value="21"/>
+ <action description="「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–内ã®ã•ã¾ã–ã¾ãªè¨­å®šã‚’切り替ãˆ" longdescription="「安全(ダメージãªã—)ã€ã€ã€Œé£›è¡Œã€ã‚’切り替ãˆã€ä½äººã«ä»¥ä¸‹ã‚’許å¯ã—ã¾ã™ï¼š グループ所有地ã®ã€ŒåœŸåœ°æƒ…報〠&gt; 「オプションã€ã‚¿ãƒ–内ã®ã€ã€Œåœ°å½¢ã‚’編集ã€ã€ã€Œåˆ¶ä½œã€ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆã€ã€ã€Œã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã€ã€‚" name="land options" value="22"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã«é–¢ã™ã‚‹è¦åˆ¶ã‚’迂回ã™ã‚‹ã“ã¨ã‚’ã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Parcel Powers">
- <action description="常ã«ã€Œåœ°å½¢ã‚’編集ã€ã‚’許å¯"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§åœ°å½¢ã‚’編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€åœ°å½¢ã®ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"
- name="land allow edit land" value="23" />
- <action description="常ã«ã€Œé£›è¡Œã€ã‚’許å¯"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã‚’飛行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€é£›è¡ŒãŒå¯èƒ½ã§ã™ã€‚"
- name="land allow fly" value="24" />
- <action description="常ã«ã€Œã‚ªãƒ–ジェクト作æˆã€ã‚’許å¯"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚"
- name="land allow create" value="25" />
- <action description="常ã«ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã€ã‚’許å¯"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚"
- name="land allow landmark" value="26" />
- <action description="グループã®åœŸåœ°ã¸ã®ã€Œãƒ›ãƒ¼ãƒ è¨­å®šã€ã‚’許å¯"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œä¸–界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼žã€Œãƒ›ãƒ¼ãƒ ã‚’ã“ã“ã«è¨­å®šã€ã‚’使用ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸåŒºç”»ã‚’ホームã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="land allow set home" value="28" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã«é–¢ã™ã‚‹è¦åˆ¶ã‚’迂回ã™ã‚‹ã“ã¨ã‚’ã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Powers">
+ <action description="常ã«ã€Œåœ°å½¢ã‚’編集ã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§åœ°å½¢ã‚’編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€åœ°å½¢ã®ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚" name="land allow edit land" value="23"/>
+ <action description="常ã«ã€Œé£›è¡Œã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã‚’飛行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€é£›è¡ŒãŒå¯èƒ½ã§ã™ã€‚" name="land allow fly" value="24"/>
+ <action description="常ã«ã€Œã‚ªãƒ–ジェクト作æˆã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚" name="land allow create" value="25"/>
+ <action description="常ã«ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚" name="land allow landmark" value="26"/>
+ <action description="グループã®åœŸåœ°ã¸ã®ã€Œãƒ›ãƒ¼ãƒ è¨­å®šã€ã‚’許å¯" longdescription="ã“ã®ã€Œå½¹å‰²ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸåŒºç”»ä¸Šã§ã€Œä¸–界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ &gt; ランドマーク &gt; ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š を使用ã—ã¦ã€ãƒ›ãƒ¼ãƒ ã®è¨­å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚" name="land allow set home" value="28"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ä½äººã®å‡çµã‚„追放をå«ã‚€ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€åˆ¶é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Parcel Access">
- <action description="区画アクセス・リストã®ç®¡ç†"
- longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚"
- name="land manage allowed" value="29" />
- <action description="åŒºç”»ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†"
- longdescription="åŒºç”»ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œç¦æ­¢ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚"
- name="land manage banned" value="30" />
- <action description="区画ã®ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨­å®šã‚’変更"
- longdescription="区画ã®ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「アクセスã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land manage passes" value="31" />
- <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨å‡çµ"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã«å•題ã®ã‚ã‚‹ä½äººãŒã„ã‚‹å ´åˆã«ã€å³ã‚¯ãƒªãƒƒã‚¯ãƒ»ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€Œè©³ç´°ã€ã‚’é¸æŠžã—ã€ã€Œè¿½æ”¾...ã€ã¾ãŸã¯ã€Œãƒ•リーズ...ã€ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãã®ä½äººã‚’処ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="land admin" value="32" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ä½äººã®å‡çµã‚„追放をå«ã‚€ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€åˆ¶é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Access">
+ <action description="区画アクセスリストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/>
+ <action description="åŒºç”»ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†" longdescription="「土地情報〠&gt; 「アクセスã€ã‚¿ãƒ–ã®ã€åŒºç”»ã®ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†ãŒã§ãã¾ã™ã€‚" name="land manage banned" value="30"/>
+ <action description="「入場許å¯ã‚’販売ã€ã®è¨­å®šã‚’変更" longdescription="「土地情報〠&gt; 「アクセスã€ã‚¿ãƒ–ã§ã€åŒºç”»ã®ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨­å®šã‚’変更ã—ã¾ã™ã€‚" name="land manage passes" value="31"/>
+ <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨ãƒ•リーズ" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有地ã«ã„ã¦æ¬²ã—ããªã„ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã€ã€Œè¿½æ”¾ã€ã‚„「フリーズã€ã‚’é¸ã‚“ã§å¯¾å¿œã§ãã¾ã™ã€‚" name="land admin" value="32"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚ªãƒ–ジェクトã®è¿”å´ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨­ç½®ã‚„移動をã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ ã“れã¯ãƒ¡ãƒ³ãƒãƒ¼ãŒã‚´ãƒŸå‡¦ç†ã‚„景観作æˆã‚’ã™ã‚‹éš›ã«ä¾¿åˆ©ã§ã™ãŒã€è¿”å´ã—ãŸã‚ªãƒ–ジェクトã¯å…ƒã«æˆ»ã›ãªã„ã®ã§ã€æ³¨æ„ã—ã¦è¡Œã„ã¾ã—ょã†ã€‚"
- name="Parcel Content">
- <action description="グループ所有オブジェクトã®è¿”å´"
- longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land return group owned" value="48" />
- <action description="グループã«è¨­å®šã•れã¦ã„るオブジェクトを返å´"
- longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«è¨­å®šã•れã¦ã„るオブジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land return group set" value="33" />
- <action description="éžã‚°ãƒ«ãƒ¼ãƒ—・オブジェクトã®è¿”å´"
- longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="land return non group" value="34" />
- <action description="Lindenè£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ"
- longdescription="景観作æˆèƒ½åŠ›ã«ã‚ˆã‚Šã€ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’é…ç½®ãŠã‚ˆã³ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã€è‡ªåˆ†ã®æŒã¡ç‰©ã®ãƒ©ã‚¤ãƒ–ラリ>オブジェクト・フォルダã‹ã‚‰æ¤œç´¢ã§ãã‚‹ã»ã‹ã€ã€Œä½œæˆã€ãƒœã‚¿ãƒ³ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
- name="land gardening" value="35" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚ªãƒ–ジェクトã®è¿”å´ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨­ç½®ã‚„移動をã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ ã“れã¯ãƒ¡ãƒ³ãƒãƒ¼ãŒã‚´ãƒŸå‡¦ç†ã‚„景観作æˆã‚’ã™ã‚‹éš›ã«ä¾¿åˆ©ã§ã™ãŒã€è¿”å´ã—ãŸã‚ªãƒ–ジェクトã¯å…ƒã«æˆ»ã›ãªã„ã®ã§ã€æ³¨æ„ã—ã¦è¡Œã„ã¾ã—ょã†ã€‚" name="Parcel Content">
+ <action description="グループ所有オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group owned" value="48"/>
+ <action description="グループã«è¨­å®šã•れã¦ã„るオブジェクトを返å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«è¨­å®šã•れã¦ã„るオブジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group set" value="33"/>
+ <action description="éžã‚°ãƒ«ãƒ¼ãƒ—オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/>
+ <action description="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãりã®èƒ½åŠ›ã§ã™ã€‚ ã“ã‚Œã‚‰ã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠&gt; 「オブジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを譲渡ã€ä¿®æ­£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ ã“ã†ã—ãŸå¤‰æ›´ã¯ã€ã€Œç·¨é›†ãƒ„ールã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§è¡Œã‚れã¾ã™ã€‚ オブジェクトをå³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œç·¨é›†ã€ã‚’é–‹ãã¨ã€è¨­å®šå†…容を表示ã§ãã¾ã™ã€‚"
- name="Object Management">
- <action description="グループã«ã‚ªãƒ–ジェクトを譲渡"
- longdescription="グループã«ã‚ªãƒ–ジェクトを譲渡ã™ã‚‹ã«ã¯ã€ã€Œç·¨é›†ãƒ„ールã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="object deed" value="36" />
- <action
- description="ã‚°ãƒ«ãƒ¼ãƒ—æ‰€æœ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰"
- longdescription="ã‚°ãƒ«ãƒ¼ãƒ—æ‰€æœ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰ã¯ã€ã€Œç·¨é›†ãƒ„ールã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚"
- name="object manipulate" value="38" />
- <action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®š"
- longdescription="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®šã«ã™ã‚‹ã«ã¯ã€ã€Œç·¨é›†ãƒ„ールã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚"
- name="object set sale" value="39" />
+ <action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを譲渡ã€ä¿®æ­£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ 変更ã¯ã€Œåˆ¶ä½œãƒ„ール〠&gt; 「一般ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚ オブジェクトをå³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œç·¨é›†ã€ã‚’é–‹ãã¨è¨­å®šå†…容を確èªã§ãã¾ã™ã€‚" name="Object Management">
+ <action description="グループã«ã‚ªãƒ–ジェクトを譲渡" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚ªãƒ–ジェクトをグループã«è­²æ¸¡ã—ã¾ã™ã€‚" name="object deed" value="36"/>
+ <action description="ã‚°ãƒ«ãƒ¼ãƒ—æ‰€æœ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトをæ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰ã—ã¾ã™ã€‚" name="object manipulate" value="38"/>
+ <action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®š" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを販売対象ã«è¨­å®šã—ã¾ã™ã€‚" name="object set sale" value="39"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Accounting">
- <action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有ã®åœŸåœ°ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚"
- name="accounting accountable" value="40" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"><action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚
+ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—通知ã®é€ä¿¡ã€å—ä¿¡ã€è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Notices">
- <action description="通知をé€ä¿¡"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—情報ã€ï¼žã€Œé€šçŸ¥ã€ã‚¿ãƒ–ã§é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="notices send" value="42" />
- <action description="通知ã®å—ä¿¡ã¨éŽåŽ»ã®é€šçŸ¥ã®é–²è¦§"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—情報ã€ï¼žã€Œé€šçŸ¥ã€ã‚¿ãƒ–ã§éŽåŽ»ã®é€šçŸ¥ã‚’閲覧ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="notices receive" value="43" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—通知ã®é€ä¿¡ã€å—ä¿¡ã€è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Notices">
+ <action description="通知をé€ä¿¡" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠&gt; 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰é€šçŸ¥ã‚’é€ä¿¡ã§ãã¾ã™ã€‚" name="notices send" value="42"/>
+ <action description="通知ã®å—ä¿¡ã¨éŽåŽ»ã®é€šçŸ¥ã®é–²è¦§" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠&gt; 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§é€šçŸ¥ã‚’å—ä¿¡ã—ãŸã‚ŠéŽåŽ»ã®é€šçŸ¥ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚" name="notices receive" value="43"/>
</action_set>
- <action_set
- description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ææ¡ˆã®ä½œæˆã¨æŠ•ç¥¨ã€æŠ•ç¥¨å±¥æ­´ã®è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚"
- name="Proposals">
- <action description="ææ¡ˆã‚’作æˆ"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•票ã®å¯¾è±¡ã¨ãªã‚‹å•題æèµ·ã‚’「グループ情報ã€ï¼žã€Œå•題æèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="proposal start" value="44" />
- <action description="å•題æèµ·ã«æŠ•票ã™ã‚‹"
- longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ï¼žææ¡ˆã‚¿ãƒ–ã§ææ¡ˆã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
- name="proposal vote" value="45" />
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ææ¡ˆã®ä½œæˆã¨æŠ•ç¥¨ã€æŠ•ç¥¨å±¥æ­´ã®è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Proposals">
+ <action description="ææ¡ˆã‚’作æˆ" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•票ã®å¯¾è±¡ã¨ãªã‚‹å•題æèµ·ã‚’「グループ情報ã€ï¼žã€Œå•題æèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal start" value="44"/>
+ <action description="å•題æèµ·ã«æŠ•票ã™ã‚‹" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ï¼žææ¡ˆã‚¿ãƒ–ã§ææ¡ˆã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal vote" value="45"/>
</action_set>
- <action_set
- description="
-ã“れらã®ã‚¢ãƒ“リティã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚
-"
- name="Chat">
- <action description="グループ・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹"
- longdescription="
-ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚
-"
- name="join group chat" />
- <action description="グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹"
- longdescription="
-ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ã‚¢ãƒ“リティãŒå¿…è¦ã§ã™ã€‚
-"
- name="join voice chat" />
- <action description="グループ・ãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹"
- longdescription="
-ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—・テキスト・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-"
- name="moderate group chat" />
+ <action_set description=" ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループボイスãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat">
+ <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat"/>
+ <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
new file mode 100644
index 0000000000..4fba4b1567
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="アウトフィット" name="appearance panel">
+ <string name="No Outfit" value="アウトフィットãªã—"/>
+ <panel name="panel_currentlook">
+ <button label="編集" name="editappearance_btn"/>
+ <text name="currentlook_title">
+ (ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“)
+ </text>
+ <text name="currentlook_name">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ </panel>
+ <filter_editor label="アウトフィットã®ãƒ•ィルター" name="Filter"/>
+ <button label="装ç€" name="wear_btn"/>
+ <button label="æ–°ã—ã„アウトフィット" name="newlook_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
new file mode 100644
index 0000000000..0c97fed901
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ã‚‚ã®" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="プロフィール" name="info_btn"/>
+ <button label="装ç€" name="wear_btn"/>
+ <button label="プレイ" name="play_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
new file mode 100644
index 0000000000..c6a13fa212
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="オブジェクトã®ãƒ—ロフィール">
+ <panel.string name="unknown">
+ ï¼ˆä¸æ˜Žï¼‰
+ </panel.string>
+ <panel.string name="public">
+ (公開)
+ </panel.string>
+ <panel.string name="you_can">
+ ã‚ãªãŸãŒã§ãã‚‹ã“ã¨ï¼š
+ </panel.string>
+ <panel.string name="owner_can">
+ 所有者ãŒã§ãã‚‹ã“ã¨ï¼š
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <text name="title" value="オブジェクトã®ãƒ—ロフィール"/>
+ <text name="where" value="(æŒã¡ç‰©ï¼‰"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ åå‰ï¼š
+ </text>
+ <text name="LabelItemDescTitle">
+ 説明:
+ </text>
+ <text name="LabelCreatorTitle">
+ 制作者:
+ </text>
+ <text name="LabelCreatorName">
+ Nicole Linden
+ </text>
+ <button label="プロフィール" name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ 所有者:
+ </text>
+ <text name="LabelOwnerName">
+ Thrax Linden
+ </text>
+ <button label="プロフィール" name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ å–得:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ ã‚ãªãŸãŒã§ãã‚‹ã“ã¨ï¼š
+ </text>
+ <check_box label="修正" name="CheckOwnerModify"/>
+ <check_box label="コピー" name="CheckOwnerCopy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 全員:
+ </text>
+ <check_box label="コピー" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ グループ:
+ </text>
+ <check_box label="共有" name="CheckShareWithGroup" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 譲渡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/>
+ <text name="NextOwnerLabel">
+ æ¬¡ã®æ‰€æœ‰è€…:
+ </text>
+ <check_box label="修正" name="CheckNextOwnerModify"/>
+ <check_box label="コピー" name="CheckNextOwnerCopy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
+ </panel>
+ <check_box label="販売ã™ã‚‹" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="コピー" name="Copy"/>
+ <combo_box.item label="オリジナル" name="Original"/>
+ </combo_box>
+ <spinner label="価格: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="キャンセル" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
new file mode 100644
index 0000000000..ab00953f1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="オブジェクトã®ãƒ—ロフィール">
+ <panel.string name="text deed continued">
+ 譲渡
+ </panel.string>
+ <panel.string name="text deed">
+ 譲渡
+ </panel.string>
+ <panel.string name="text modify info 1">
+ ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </panel.string>
+ <panel.string name="text modify info 2">
+ ã“れらã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </panel.string>
+ <panel.string name="text modify info 3">
+ ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel.string name="text modify info 4">
+ ã“れらã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã›ã‚“
+ </panel.string>
+ <panel.string name="text modify warning">
+ ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãƒ‘ーツãŒãƒªãƒ³ã‚¯ã•れã¦ã„ã¾ã™
+ </panel.string>
+ <panel.string name="Cost Default">
+ 価格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ åˆè¨ˆï¼š L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="title" value="オブジェクトã®ãƒ—ロフィール"/>
+ <text name="where" value="(インワールド)"/>
+ <panel label="">
+ <text name="Name:">
+ åå‰ï¼š
+ </text>
+ <text name="Description:">
+ 説明:
+ </text>
+ <text name="CreatorNameLabel">
+ 制作者:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ 所有者:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ グループ:
+ </text>
+ <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/>
+ <name_box initial_value="ローディング..." name="Group Name Proxy"/>
+ <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè­²æ¸¡ã§ãã¾ã™ã€‚"/>
+ <text name="label click action">
+ クリックã§ï¼š
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
+ <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/>
+ <combo_box.item label="オブジェクトを買ã†" name="Buyobject"/>
+ <combo_box.item label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†" name="Payobject"/>
+ <combo_box.item label="é–‹ã" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
+ </text>
+ <text name="Anyone can:">
+ 全員:
+ </text>
+ <check_box label="コピー" name="checkbox allow everyone copy"/>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ グループ:
+ </text>
+ <check_box label="共有" name="checkbox share with group" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 譲渡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/>
+ <text name="NextOwnerLabel">
+ æ¬¡ã®æ‰€æœ‰è€…:
+ </text>
+ <check_box label="修正" name="checkbox next owner can modify"/>
+ <check_box label="コピー" name="checkbox next owner can copy"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
+ </panel>
+ <check_box label="販売中" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="コピー" name="Copy"/>
+ <combo_box.item label="中身" name="Contents"/>
+ <combo_box.item label="オリジナル" name="Original"/>
+ </combo_box>
+ <spinner label="価格: L$" name="Edit Cost"/>
+ <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
+ <text name="B:">
+ B.
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="é–‹ã" name="open_btn"/>
+ <button label="支払ã†" name="pay_btn"/>
+ <button label="è²·ã†" name="buy_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 0eb26754cf..9b272b2fe8 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1,32 +1,62 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Grid
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life サãƒãƒ¼ãƒˆãƒãƒ¼ã‚¿ãƒ«
+ </string>
+ <string name="StartupDetectingHardware">
+ ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸­ã§ã™...
+ </string>
+ <string name="StartupLoading">
+ ローディング
+ </string>
+ <string name="Fullbright">
+ 明るã•全開(レガシー)
+ </string>
<string name="LoginInProgress">
ログイン中ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•リーズã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
</string>
+ <string name="LoginInProgressNoFrozen">
+ ログイン中ã§ã™...
+ </string>
<string name="LoginAuthenticating">
èªè¨¼ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginMaintenance">
- アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™...
+ アカウントã®ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã‚’実行ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginAttempt">
- å‰å›žã®ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ログイン中ã§ã™([NUMBER]回目)
+ å‰å›žã®ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ログイン中ã§ã™ï¼ˆ[NUMBER] 回目)
</string>
<string name="LoginPrecaching">
- ワールドをロードã—ã¦ã„ã¾ã™...
+ ワールドを読ã¿è¾¼ã‚“ã§ã„ã¾ã™...
</string>
<string name="LoginInitializingBrowser">
- 埋ã‚è¾¼ã¿Webãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ 内蔵 Web ãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginInitializingMultimedia">
マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
</string>
+ <string name="LoginInitializingFonts">
+ フォントをローディング中...
+ </string>
<string name="LoginVerifyingCache">
- キャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(æ‰€è¦æ™‚é–“ã¯60~90ç§’)...
+ キャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)...
</string>
<string name="LoginProcessingResponse">
応答を処ç†ã—ã¦ã„ã¾ã™...
@@ -38,73 +68,52 @@
ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™...
</string>
<string name="LoginInitializingQuicktime">
- QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ QuickTime ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginQuicktimeNotFound">
- QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ QuickTime ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
</string>
<string name="LoginQuicktimeOK">
- QuickTimeãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚
+ QuickTime ãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚
</string>
<string name="LoginWaitingForRegionHandshake">
- 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
+ リージョンã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
</string>
<string name="LoginConnectingToRegion">
- åœ°åŸŸã«æŽ¥ç¶šã—ã¦ã„ã¾ã™...
+ ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™...
</string>
<string name="LoginDownloadingClothing">
- æœã‚’ダウンロードã—ã¦ã„ã¾ã™...
+ 衣類をダウンロードã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginFailedNoNetwork">
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
+ </string>
+ <string name="Quit">
+ 終了
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=ja-JP
</string>
<string name="AgentLostConnection">
- ã“ã®åœ°åŸŸã«ã¯ã€å•題ãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¸éƒ½åˆãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ã”使用ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
<string name="TooltipPerson">
人
</string>
<string name="TooltipNoName">
- (åå‰ãªã—)
+ (åå‰ãªã—)
</string>
<string name="TooltipOwner">
- オーナー:
+ 所有者:
</string>
<string name="TooltipPublic">
公共
</string>
<string name="TooltipIsGroup">
- (グループ)
- </string>
- <string name="TooltipFlagScript">
- スクリプト
- </string>
- <string name="TooltipFlagPhysics">
- 物ç†ä½œç”¨
- </string>
- <string name="TooltipFlagTouch">
- 触る
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- æŒã¡ç‰©ã‚’ドロップã™ã‚‹
- </string>
- <string name="TooltipFlagPhantom">
- ファントム
- </string>
- <string name="TooltipFlagTemporary">
- 一時的
- </string>
- <string name="TooltipFlagRightClickMenu">
- (å³ã‚¯ãƒªãƒƒã‚¯ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示)
- </string>
- <string name="TooltipFreeToCopy">
- コピーå¯èƒ½
+ (グループ)
</string>
<string name="TooltipForSaleL$">
- 売り出ã—中:L$[AMOUNT]
- </string>
- <string name="TooltipForSaleMsg">
- 売り出ã—中: [MESSAGE]
+ 売り出ã—中:L$ [AMOUNT]
</string>
<string name="TooltipFlagGroupBuild">
グループ作æˆ
@@ -122,7 +131,7 @@
é£›è¡Œç¦æ­¢
</string>
<string name="TooltipFlagGroupScripts">
- グループ・スクリプト
+ グループスクリプト
</string>
<string name="TooltipFlagNoScripts">
スクリプトãªã—
@@ -131,73 +140,212 @@
土地:
</string>
<string name="TooltipMustSingleDrop">
- 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
+ アイテム㯠1 ã¤ã ã‘ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
</string>
- <string name="RetrievingData">
+ <string name="TooltipHttpUrl">
+ クリックã—ã¦ã“ã® Web ページを見ã¾ã™
+ </string>
+ <string name="TooltipSLURL">
+ クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…報を見ã¾ã™
+ </string>
+ <string name="TooltipAgentUrl">
+ クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見ã¾ã™
+ </string>
+ <string name="TooltipGroupUrl">
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipEventUrl">
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipClassifiedUrl">
+ クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見ã¾ã™
+ </string>
+ <string name="TooltipParcelUrl">
+ クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipTeleportUrl">
+ クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™
+ </string>
+ <string name="TooltipObjectIMUrl">
+ クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
+ </string>
+ <string name="TooltipMapUrl">
+ クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã—ã¾ã™
+ </string>
+ <string name="TooltipSLAPP">
+ クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™
+ </string>
+ <string name="CurrentURL" value=" ç¾åœ¨ã® URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ テレãƒãƒ¼ãƒˆ
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ 地図ã«è¡¨ç¤º
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ é–‰ã˜ã‚‹ (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ é–‰ã˜ã‚‹ (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ 復元
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ å…ƒã«æˆ»ã™ï¼ˆç¸®å°ï¼‰
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ 別ウィンドウã§é–‹ã
+ </string>
+ <string name="BUTTON_DOCK">
+ ドッキング
+ </string>
+ <string name="BUTTON_HELP">
+ ヘルプを表示
+ </string>
+ <string name="Searching">
検索中...
</string>
+ <string name="NoneFound">
+ 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="RetrievingData">
+ å–得中...
+ </string>
<string name="ReleaseNotes">
リリースノート
</string>
<string name="LoadingData">
- ロード中...
+ ローディング...
</string>
<string name="AvatarNameNobody">
- (無人)
+ (ãªã—)
</string>
<string name="AvatarNameWaiting">
- (待機中)
+ (待機中)
</string>
- <string name="AvatarNameHippos">
- (ã‚«ãƒ)
+ <string name="AvatarNameMultiple">
+ (複数)
</string>
<string name="GroupNameNone">
- (ãªã—)
+ (ãªã—)
</string>
<string name="AssetErrorNone">
エラーãªã—
</string>
<string name="AssetErrorRequestFailed">
- 資産ã®è¦æ±‚: 失敗
+ アセットリクエスト: 失敗
</string>
<string name="AssetErrorNonexistentFile">
- 資産ã®è¦æ±‚: 存在ã—ãªã„ファイル
+ アセットリクエスト: 存在ã—ãªã„ファイル
</string>
<string name="AssetErrorNotInDatabase">
- 資産ã®è¦æ±‚: データベースã§ã¯è¦‹ã¤ã‹ã‚‰ãªã„資産
+ アセットリクエスト: データベースã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</string>
<string name="AssetErrorEOF">
- ファイルã®çµ‚ã‚り
+ 終了
</string>
<string name="AssetErrorCannotOpenFile">
- ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“
+ ファイルを開ã‘ã¾ã›ã‚“
</string>
<string name="AssetErrorFileNotFound">
ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
</string>
<string name="AssetErrorTCPTimeout">
- ファイル転é€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã§ã™
+ ファイルã®è»¢é€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ
</string>
<string name="AssetErrorCircuitGone">
- 接続ãŒè§£é™¤ã•れã¾ã—ãŸ
+ サーキットエラー
</string>
<string name="AssetErrorPriceMismatch">
ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“
</string>
<string name="AssetErrorUnknownStatus">
- ステータスãŒä¸æ˜Žã§ã™
+ 䏿˜Žã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
+ </string>
+ <string name="texture">
+ テクスãƒãƒ£
+ </string>
+ <string name="sound">
+ サウンド
+ </string>
+ <string name="calling card">
+ コーリングカード
+ </string>
+ <string name="landmark">
+ ランドマーク
+ </string>
+ <string name="legacy script">
+ レガシースクリプト
+ </string>
+ <string name="clothing">
+ 衣類
+ </string>
+ <string name="object">
+ オブジェクト
+ </string>
+ <string name="note card">
+ ノートカード
+ </string>
+ <string name="folder">
+ フォルダ
+ </string>
+ <string name="root">
+ ルート
+ </string>
+ <string name="lsl2 script">
+ LSL2 スクリプト
+ </string>
+ <string name="lsl bytecode">
+ LSL ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰
+ </string>
+ <string name="tga texture">
+ tga テクスãƒãƒ£
+ </string>
+ <string name="body part">
+ 身体部ä½
</string>
- <string name="AvatarEditingApparance">
- (容姿ã®ç·¨é›†)
+ <string name="snapshot">
+ スナップショット
+ </string>
+ <string name="lost and found">
+ 紛失物
+ </string>
+ <string name="targa image">
+ targa ç”»åƒ
+ </string>
+ <string name="trash">
+ ã”ã¿ç®±
+ </string>
+ <string name="jpeg image">
+ jpeg ç”»åƒ
+ </string>
+ <string name="animation">
+ アニメーション
+ </string>
+ <string name="gesture">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="simstate">
+ 統計
+ </string>
+ <string name="favorite">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="symbolic link">
+ リンク
+ </string>
+ <string name="AvatarEditingAppearance">
+ (容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
<string name="AvatarAway">
- 退席中
+ 一時退席中
</string>
<string name="AvatarBusy">
å–り込ã¿ä¸­
</string>
<string name="AvatarMuted">
- ミュート
+ ブロック中
</string>
<string name="anim_express_afraid">
怖れ
@@ -236,28 +384,28 @@
æ³£ã
</string>
<string name="anim_dance1">
- ダンス1
+ ダンス 1
</string>
<string name="anim_dance2">
- ダンス2
+ ダンス 2
</string>
<string name="anim_dance3">
- ダンス3
+ ダンス 3
</string>
<string name="anim_dance4">
- ダンス4
+ ダンス 4
</string>
<string name="anim_dance5">
- ダンス5
+ ダンス 5
</string>
<string name="anim_dance6">
- ダンス6
+ ダンス 6
</string>
<string name="anim_dance7">
- ダンス7
+ ダンス 7
</string>
<string name="anim_dance8">
- ダンス8
+ ダンス 8
</string>
<string name="anim_express_disdain">
侮蔑
@@ -407,25 +555,94 @@
é ·ã
</string>
<string name="texture_loading">
- ロード中...
+ ローディング...
</string>
<string name="worldmap_offline">
オフライン
</string>
+ <string name="worldmap_results_none_found">
+ 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ ä¸å®Œå…¨ãªãƒ•ァイル
+ </string>
+ <string name="ST_NO_JOINT">
+ ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
<string name="whisper">
ã®ã•ã•ã‚„ã:
</string>
<string name="shout">
ã®å«ã³:
</string>
+ <string name="ringing">
+ インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­...
+ </string>
+ <string name="connected">
+ 接続ã—ã¾ã—ãŸ
+ </string>
+ <string name="unavailable">
+ ç¾åœ¨åœ°ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="hang_up">
+ インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•れã¾ã—ãŸ
+ </string>
+ <string name="reconnect_nearby">
+ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ </string>
+ <string name="ScriptTakeMoney">
+ リンデンドル(L$)を支払ã†
+ </string>
+ <string name="ActOnControlInputs">
+ 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹•
+ </string>
+ <string name="RemapControlInputs">
+ 制御入力ã®ãƒªãƒžãƒƒãƒ—
+ </string>
+ <string name="AnimateYourAvatar">
+ ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•作
+ </string>
+ <string name="AttachToYourAvatar">
+ ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€
+ </string>
+ <string name="ReleaseOwnership">
+ 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹
+ </string>
+ <string name="LinkAndDelink">
+ ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤
+ </string>
+ <string name="AddAndRemoveJoints">
+ ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤
+ </string>
+ <string name="ChangePermissions">
+ 権é™ã®å¤‰æ›´
+ </string>
+ <string name="TrackYourCamera">
+ カメラ追従
+ </string>
+ <string name="ControlYourCamera">
+ カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«
+ </string>
+ <string name="NotConnected">
+ 接続ã•れã¦ã„ã¾ã›ã‚“
+ </string>
<string name="SIM_ACCESS_PG">
- PG
+ 一般
</string>
<string name="SIM_ACCESS_MATURE">
- Mature
+ 控ãˆã‚
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ アダルト
</string>
<string name="SIM_ACCESS_DOWN">
オフライン
@@ -436,12 +653,6 @@
<string name="land_type_unknown">
ï¼ˆä¸æ˜Žï¼‰
</string>
- <string name="covenant_never_modified">
- 最終修正: (無)
- </string>
- <string name="covenant_modified">
- 最終修正:
- </string>
<string name="all_files">
å…¨ã¦ã®ãƒ•ァイル
</string>
@@ -461,22 +672,22 @@
ロード
</string>
<string name="targa_image_files">
- Targaç”»åƒ
+ Targa ç”»åƒ
</string>
<string name="bitmap_image_files">
ビットマップ画åƒ
</string>
<string name="avi_movie_file">
- AVIムービーファイル
+ AVI ムービーファイル
</string>
<string name="xaf_animation_file">
- XAFアニメーションファイル
+ XAF アニメーションファイル
</string>
<string name="xml_file">
- XMLファイル
+ XML ファイル
</string>
<string name="dot_raw_file">
- RAWファイル
+ RAW ファイル
</string>
<string name="compressed_image_files">
圧縮画åƒ
@@ -487,17 +698,922 @@
<string name="choose_the_directory">
å‚ç…§
</string>
+ <string name="AvatarSetNotAway">
+ 一時退席中解除
+ </string>
+ <string name="AvatarSetAway">
+ 一時退席中
+ </string>
+ <string name="AvatarSetNotBusy">
+ å–り込ã¿ä¸­è§£é™¤
+ </string>
+ <string name="AvatarSetBusy">
+ å–り込ã¿ä¸­
+ </string>
+ <string name="shape">
+ シェイプ
+ </string>
+ <string name="skin">
+ スキン
+ </string>
+ <string name="hair">
+ 髪
+ </string>
+ <string name="eyes">
+ ç›®
+ </string>
+ <string name="shirt">
+ シャツ
+ </string>
+ <string name="pants">
+ パンツ
+ </string>
+ <string name="shoes">
+ é´
+ </string>
+ <string name="socks">
+ é´ä¸‹
+ </string>
+ <string name="jacket">
+ ジャケット
+ </string>
+ <string name="gloves">
+ 手袋
+ </string>
+ <string name="undershirt">
+ 下ç€ã‚·ãƒ£ãƒ„
+ </string>
+ <string name="underpants">
+ 下ç€ãƒ‘ンツ
+ </string>
+ <string name="skirt">
+ スカート
+ </string>
+ <string name="alpha">
+ アルファ
+ </string>
+ <string name="tattoo">
+ タトゥ
+ </string>
+ <string name="invalid">
+ 無効
+ </string>
+ <string name="next">
+ 次ã¸
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ グループ通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ グループ通知
+ </string>
+ <string name="GroupNotifySentBy">
+ é€ä¿¡è€…
+ </string>
+ <string name="GroupNotifyAttached">
+ 添付:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ã“ã“ã§éŽåŽ»ã®é€šçŸ¥ã‚’表示ã™ã‚‹ã‹ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–らãªã„設定をã—ã¾ã™ã€‚
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ 添付アイテムを開ã
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ 添付アイテムをä¿å­˜
+ </string>
+ <string name="TeleportOffer">
+ テレãƒãƒ¼ãƒˆã‚’é€ã‚‹
+ </string>
+ <string name="StartUpNotifications">
+ ä¸åœ¨ä¸­ã«æ–°ã—ã„通知ãŒå±Šãã¾ã—ãŸã€‚
+ </string>
+ <string name="OverflowInfoChannelString">
+ ã‚ãªãŸã«ã¯ã•ら㫠%d 通ã®é€šçŸ¥ãŒã‚りã¾ã™
+ </string>
+ <string name="BodyPartsRightArm">
+ å³è…•
+ </string>
+ <string name="BodyPartsHead">
+ é ­
+ </string>
+ <string name="BodyPartsLeftArm">
+ 左腕
+ </string>
+ <string name="BodyPartsLeftLeg">
+ 左脚
+ </string>
+ <string name="BodyPartsTorso">
+ é ­
+ </string>
+ <string name="BodyPartsRightLeg">
+ å³è„š
+ </string>
+ <string name="GraphicsQualityLow">
+ 低
+ </string>
+ <string name="GraphicsQualityMid">
+ 中
+ </string>
+ <string name="GraphicsQualityHigh">
+ 高
+ </string>
+ <string name="LeaveMouselook">
+ ESC キーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™
+ </string>
+ <string name="InventoryNoMatchingItems">
+ 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ [secondlife:///app/search/groups 「検索ã€] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ã€ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
+ </string>
+ <string name="InventoryNoTexture">
+ 「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“
+ </string>
+ <string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
+ <string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
+ <string name="no_copy" value=" (コピーä¸å¯ï¼‰"/>
+ <string name="worn" value=" (ç€ç”¨ä¸­ï¼‰"/>
+ <string name="link" value=" (リンク)"/>
+ <string name="broken_link" value=" (壊れãŸãƒªãƒ³ã‚¯ï¼‰"/>
+ <string name="LoadingContents">
+ コンテンツをロード中ã§ã™...
+ </string>
+ <string name="NoContents">
+ コンテンツãªã—
+ </string>
+ <string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] ã«è£…ç€ä¸­ï¼‰"/>
+ <string name="PermYes">
+ ã¯ã„
+ </string>
+ <string name="PermNo">
+ ã„ã„ãˆ
+ </string>
+ <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š"/>
+ <string name="Sound" value=" サウンド:"/>
+ <string name="Wait" value=" --- 待機::"/>
+ <string name="AnimFlagStop" value=" ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ï¼š"/>
+ <string name="AnimFlagStart" value=" アニメーションを開始:"/>
+ <string name="Wave" value=" 手を振る"/>
+ <string name="HelloAvatar" value=" ã‚„ã‚ã€ã‚¢ãƒã‚¿ãƒ¼ï¼"/>
+ <string name="ViewAllGestures" value=" ã™ã¹ã¦è¡¨ç¤º &gt;&gt;"/>
+ <string name="Animations" value="アニメーションã€"/>
+ <string name="Calling Cards" value="コーリングカードã€"/>
+ <string name="Clothing" value="衣類ã€"/>
+ <string name="Gestures" value="ジェスãƒãƒ£ãƒ¼ã€"/>
+ <string name="Landmarks" value="ランドマークã€"/>
+ <string name="Notecards" value="ノートカードã€"/>
+ <string name="Objects" value="オブジェクトã€"/>
+ <string name="Scripts" value="スクリプトã€"/>
+ <string name="Sounds" value="サウンドã€"/>
+ <string name="Textures" value="テクスãƒãƒ£ã€"/>
+ <string name="Snapshots" value="スナップショットã€"/>
+ <string name="No Filters" value="ã„ã„㈠"/>
+ <string name="Since Logoff" value=" - ログオフ以æ¥"/>
+ <string name="InvFolder My Inventory">
+ æŒã¡ç‰©
+ </string>
+ <string name="InvFolder My Favorites">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="InvFolder Library">
+ ライブラリ
+ </string>
+ <string name="InvFolder Textures">
+ テクスãƒãƒ£
+ </string>
+ <string name="InvFolder Sounds">
+ サウンド
+ </string>
+ <string name="InvFolder Calling Cards">
+ コーリングカード
+ </string>
+ <string name="InvFolder Landmarks">
+ ランドマーク
+ </string>
+ <string name="InvFolder Scripts">
+ スクリプト
+ </string>
+ <string name="InvFolder Clothing">
+ 衣類
+ </string>
+ <string name="InvFolder Objects">
+ オブジェクト
+ </string>
+ <string name="InvFolder Notecards">
+ ノートカード
+ </string>
+ <string name="InvFolder New Folder">
+ æ–°è¦ãƒ•ォルダ
+ </string>
+ <string name="InvFolder Inventory">
+ æŒã¡ç‰©
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ 圧縮ã•れã¦ã„ãªã„ç”»åƒ
+ </string>
+ <string name="InvFolder Body Parts">
+ 身体部ä½
+ </string>
+ <string name="InvFolder Trash">
+ ã”ã¿ç®±
+ </string>
+ <string name="InvFolder Photo Album">
+ フォトアルãƒãƒ 
+ </string>
+ <string name="InvFolder Lost And Found">
+ 紛失物
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ 圧縮ã•れã¦ã„ãªã„サウンド
+ </string>
+ <string name="InvFolder Animations">
+ アニメーション
+ </string>
+ <string name="InvFolder Gestures">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="InvFolder favorite">
+ ãŠæ°—ã«å…¥ã‚Š
+ </string>
+ <string name="InvFolder Current Outfit">
+ ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィット
+ </string>
+ <string name="InvFolder My Outfits">
+ マイ アウトフィット
+ </string>
+ <string name="InvFolder Friends">
+ フレンド
+ </string>
+ <string name="InvFolder All">
+ 全員
+ </string>
+ <string name="Buy">
+ è²·ã†
+ </string>
+ <string name="BuyforL$">
+ Buy for L$
+ </string>
+ <string name="Stone">
+ 石
+ </string>
+ <string name="Metal">
+ 金属
+ </string>
+ <string name="Glass">
+ ガラス
+ </string>
+ <string name="Wood">
+ 木
+ </string>
+ <string name="Flesh">
+ 肌
+ </string>
+ <string name="Plastic">
+ プラスãƒãƒƒã‚¯
+ </string>
+ <string name="Rubber">
+ ゴム
+ </string>
+ <string name="Light">
+ ライト
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ 胸部
+ </string>
+ <string name="Skull">
+ é ­è“‹
+ </string>
+ <string name="Left Shoulder">
+ 左肩
+ </string>
+ <string name="Right Shoulder">
+ å³è‚©
+ </string>
+ <string name="Left Hand">
+ 左手
+ </string>
+ <string name="Right Hand">
+ 峿‰‹
+ </string>
+ <string name="Left Foot">
+ 左足
+ </string>
+ <string name="Right Foot">
+ å³è¶³
+ </string>
+ <string name="Spine">
+ 背骨
+ </string>
+ <string name="Pelvis">
+ 骨盤
+ </string>
+ <string name="Mouth">
+ å£
+ </string>
+ <string name="Chin">
+ ã‚ã”
+ </string>
+ <string name="Left Ear">
+ 左耳
+ </string>
+ <string name="Right Ear">
+ å³è€³
+ </string>
+ <string name="Left Eyeball">
+ 左目眼çƒ
+ </string>
+ <string name="Right Eyeball">
+ å³ç›®çœ¼çƒ
+ </string>
+ <string name="Nose">
+ é¼»
+ </string>
+ <string name="R Upper Arm">
+ å³ä¸Šè…•
+ </string>
+ <string name="R Forearm">
+ å³å‰è…•
+ </string>
+ <string name="L Upper Arm">
+ 左上腕
+ </string>
+ <string name="L Forearm">
+ å·¦å‰è…•
+ </string>
+ <string name="Right Hip">
+ å³è…°
+ </string>
+ <string name="R Upper Leg">
+ å³ä¸Šè„š
+ </string>
+ <string name="R Lower Leg">
+ å³ä¸‹è„š
+ </string>
+ <string name="Left Hip">
+ 左腰
+ </string>
+ <string name="L Upper Leg">
+ 左上脚
+ </string>
+ <string name="L Lower Leg">
+ 左下脚
+ </string>
+ <string name="Stomach">
+ è…¹
+ </string>
+ <string name="Left Pec">
+ 左胸筋
+ </string>
+ <string name="Right Pec">
+ å³èƒ¸ç­‹
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ 今日å‚加
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] ヶ月
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] 週間
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] 週間
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] 週間
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] 日間
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] 日間
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] 日間
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] 人
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] 人
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] 人
+ </string>
+ <string name="AcctTypeResident">
+ ä½äºº
+ </string>
+ <string name="AcctTypeTrial">
+ トライアル
+ </string>
+ <string name="AcctTypeCharterMember">
+ 創立メンãƒãƒ¼
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab 従業員
+ </string>
+ <string name="PaymentInfoUsed">
+ 支払情報使用履歴ã‚り
+ </string>
+ <string name="PaymentInfoOnFile">
+ 支払情報登録済
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ 支払情報未登録
+ </string>
+ <string name="AgeVerified">
+ å¹´é½¢ç¢ºèªæ¸ˆ
+ </string>
+ <string name="NotAgeVerified">
+ 年齢未確èª
+ </string>
+ <string name="Center 2">
+ 中心 2
+ </string>
+ <string name="Top Right">
+ å³ä¸Š
+ </string>
+ <string name="Top">
+ 上部
+ </string>
+ <string name="Top Left">
+ 左上
+ </string>
+ <string name="Center">
+ 中心
+ </string>
+ <string name="Bottom Left">
+ 左下
+ </string>
+ <string name="Bottom">
+ 下部
+ </string>
+ <string name="Bottom Right">
+ å³ä¸‹
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ ダウンロード完了ã€ã‚³ãƒ³ãƒ‘イル中
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ サーãƒãƒ¼ä¸Šã«ã‚¹ã‚¯ãƒªãƒ—トãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ ダウンロードã«å•題ãŒã‚りã¾ã™
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ 権é™ä¸è¶³ã®ãŸã‚スクリプトをダウンロードã§ãã¾ã›ã‚“。
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ 権é™ä¸è¶³ï¼š
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ åŽŸå› ä¸æ˜Žã®å¤±æ•—ã«ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="CompileQueueTitle">
+ リコンパイル進行
+ </string>
+ <string name="CompileQueueStart">
+ リコンパイル
+ </string>
+ <string name="ResetQueueTitle">
+ 進行をリセット
+ </string>
+ <string name="ResetQueueStart">
+ リセット
+ </string>
+ <string name="RunQueueTitle">
+ 実行を続ã‘るよã†è¨­å®š
+ </string>
+ <string name="RunQueueStart">
+ 実行中ã«è¨­å®š
+ </string>
+ <string name="NotRunQueueTitle">
+ å®Ÿè¡Œã‚’åœæ­¢ã™ã‚‹ã‚ˆã†è¨­å®š
+ </string>
+ <string name="NotRunQueueStart">
+ å®Ÿè¡Œåœæ­¢ã«è¨­å®š
+ </string>
+ <string name="CompileSuccessful">
+ コンパイルãŒå®Œäº†ã—ã¾ã—ãŸï¼
+ </string>
+ <string name="CompileSuccessfulSaving">
+ コンパイル完了ã€ä¿å­˜ä¸­ã§ã™...
+ </string>
+ <string name="SaveComplete">
+ ä¿å­˜å®Œäº†ã€‚
+ </string>
+ <string name="ObjectOutOfRange">
+ スクリプト(オブジェクトãŒç¯„囲外ã«ã‚りã¾ã™ï¼‰
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER] 所有ã®ã‚ªãƒ–ジェクト「[OBJECT]ã€
+ </string>
+ <string name="GroupsNone">
+ ãªã—
+ </string>
+ <string name="Group" value=" (グループ)"/>
+ <string name="Unknown">
+ ï¼ˆä¸æ˜Žï¼‰
+ </string>
+ <string name="SummaryForTheWeek" value="今週ã®ã¾ã¨ã‚。開始日ã¯"/>
+ <string name="NextStipendDay" value="ã§ã™ã€‚次回ã®ãŠå°é£ã„支給日:"/>
+ <string name="GroupIndividualShare" value=" グループ 個人ã®å‰²ã‚Šå½“ã¦"/>
+ <string name="Balance">
+ 残高
+ </string>
+ <string name="Credits">
+ åŽå…¥
+ </string>
+ <string name="Debits">
+ 支出
+ </string>
+ <string name="Total">
+ åˆè¨ˆ
+ </string>
+ <string name="NoGroupDataFound">
+ グループã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ メインランド
+ </string>
+ <string name="IMTeen">
+ ティーン
+ </string>
+ <string name="RegionInfoError">
+ エラー
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ ã‚ãªãŸãŒ [OWNER] ã®ãŸã‚ã«ç®¡ç†ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ 許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人)
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ)
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 区画スクリプトメモリ
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ 区画一覧: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š [MAX] kb 中 [COUNT] kb:[AVAILABLE] kb 利用å¯
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ 区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ 使用ã•れ㟠URL: [MAX] 中 [COUNT] :[AVAILABLE] 利用å¯
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ 使用ã•れ㟠URL: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ 情報ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ エラー: スクリプト情報ã¯ç¾åœ¨åœ°ã®ã¿å–å¾—ã§ãã¾ã™
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ 情報をå–得中...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ ã“ã®åŒºç”»ã‚’調査ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="SITTING_ON">
+ ç€å¸­ä¸­
+ </string>
+ <string name="ATTACH_CHEST">
+ 胸部
+ </string>
+ <string name="ATTACH_HEAD">
+ é ­
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ 左肩
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ å³è‚©
+ </string>
+ <string name="ATTACH_LHAND">
+ 左手
+ </string>
+ <string name="ATTACH_RHAND">
+ 峿‰‹
+ </string>
+ <string name="ATTACH_LFOOT">
+ 左足
+ </string>
+ <string name="ATTACH_RFOOT">
+ å³è¶³
+ </string>
+ <string name="ATTACH_BACK">
+ 背中
+ </string>
+ <string name="ATTACH_PELVIS">
+ 骨盤
+ </string>
+ <string name="ATTACH_MOUTH">
+ å£
+ </string>
+ <string name="ATTACH_CHIN">
+ ã‚ã”
+ </string>
+ <string name="ATTACH_LEAR">
+ 左耳
+ </string>
+ <string name="ATTACH_REAR">
+ å³è€³
+ </string>
+ <string name="ATTACH_LEYE">
+ 左目
+ </string>
+ <string name="ATTACH_REYE">
+ å³ç›®
+ </string>
+ <string name="ATTACH_NOSE">
+ é¼»
+ </string>
+ <string name="ATTACH_RUARM">
+ å³è…•(上)
+ </string>
+ <string name="ATTACH_RLARM">
+ å³è…•(下)
+ </string>
+ <string name="ATTACH_LUARM">
+ 左腕(上)
+ </string>
+ <string name="ATTACH_LLARM">
+ 左腕(下)
+ </string>
+ <string name="ATTACH_RHIP">
+ å³è…°
+ </string>
+ <string name="ATTACH_RULEG">
+ å³è„šï¼ˆä¸Šï¼‰
+ </string>
+ <string name="ATTACH_RLLEG">
+ å³è„šï¼ˆä¸‹ï¼‰
+ </string>
+ <string name="ATTACH_LHIP">
+ 左腰
+ </string>
+ <string name="ATTACH_LULEG">
+ 左脚(上)
+ </string>
+ <string name="ATTACH_LLLEG">
+ 左脚(下)
+ </string>
+ <string name="ATTACH_BELLY">
+ ãŠè…¹
+ </string>
+ <string name="ATTACH_RPEC">
+ å³èƒ¸ç­‹
+ </string>
+ <string name="ATTACH_LPEC">
+ 左胸筋
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD(中央 2)
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD(å³ä¸Šï¼‰
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD(上・中央)
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD(左上)
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD(中央 1)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD(左下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD(下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD(å³ä¸‹ï¼‰
+ </string>
+ <string name="CursorPos">
+ [LINE] 行目ã€[COLUMN] 列目
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] 件見ã¤ã‹ã‚Šã¾ã—ãŸ
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsNewScript">
+ æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
+ </string>
+ <string name="MuteByName">
+ (å称別)
+ </string>
+ <string name="MuteAgent">
+ (ä½äººï¼‰
+ </string>
+ <string name="MuteObject">
+ (オブジェクト)
+ </string>
+ <string name="MuteGroup">
+ (グループ)
+ </string>
+ <string name="RegionNoCovenant">
+ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã¯è²©å£²ã—ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚
+ </string>
+ <string name="covenant_last_modified">
+ 最終修正日:
+ </string>
+ <string name="none_text" value=" (ãªã—) "/>
+ <string name="never_text" value=" (無) "/>
+ <string name="GroupOwned">
+ グループ所有
+ </string>
+ <string name="Public">
+ パブリック
+ </string>
+ <string name="ClassifiedClicksTxt">
+ クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プロフィール
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (掲載後更新)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ ピックやクラシファイド広告を作æˆã—ã¦ã„ã¾ã›ã‚“。 作æˆã™ã‚‹ã«ã¯ã€ä¸‹ã«ã‚る「プラスã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ ローディング...
+ </string>
+ <string name="MultiPreviewTitle">
+ プレビュー
+ </string>
+ <string name="MultiPropertiesTitle">
+ プロパティ
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ オブジェクトå
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ 所有グループ
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ 䏿˜Žãªã‚°ãƒ«ãƒ¼ãƒ—所有
+ </string>
+ <string name="InvOfferOwnedBy">
+ 所有者
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ 䏿˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼æ‰€æœ‰
+ </string>
+ <string name="InvOfferGaveYou">
+ ãŒæ¸¡ã—ã¾ã—ãŸ
+ </string>
+ <string name="InvOfferYouDecline">
+ You decline
+ </string>
+ <string name="InvOfferFrom">
+ from
+ </string>
+ <string name="GroupMoneyTotal">
+ åˆè¨ˆ
+ </string>
+ <string name="GroupMoneyBought">
+ ã¯è³¼å…¥ã—ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyPaidYou">
+ ãŒã‚ãªãŸã«æ”¯æ‰•ã„ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyPaidInto">
+ paid into
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ bought pass to
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è²»ç”¨ã‚’支払ã„ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è³žé‡‘を支払ã„ã¾ã—ãŸ
+ </string>
+ <string name="GroupMoneyBalance">
+ 残高
+ </string>
+ <string name="GroupMoneyCredits">
+ åŽå…¥
+ </string>
+ <string name="GroupMoneyDebits">
+ 支出
+ </string>
+ <string name="ViewerObjectContents">
+ 内容
+ </string>
+ <string name="AcquiredItems">
+ å–得アイテム
+ </string>
+ <string name="Cancel">
+ キャンセル
+ </string>
+ <string name="UploadingCosts">
+ %s ã®ã‚¢ãƒƒãƒ—ロード代金:
+ </string>
+ <string name="UnknownFileExtension">
+ 䏿˜Žã®æ‹¡å¼µå­ï¼š %s
+使用å¯èƒ½ãªæ‹¡å¼µå­ï¼š .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ ブロック
+ </string>
+ <string name="MuteAvatar">
+ ブロック
+ </string>
+ <string name="UnmuteObject">
+ ブロック解除
+ </string>
+ <string name="UnmuteAvatar">
+ ブロック解除
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ マイ ランドマークã«è¿½åŠ ...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ マイ ランドマークを編集...
+ </string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -508,88 +1624,1696 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
+ <string name="FileSaved">
+ ファイルãŒä¿å­˜ã•れã¾ã—ãŸ
+ </string>
+ <string name="Receiving">
+ å–得中
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ 太平洋標準時
+ </string>
+ <string name="PDT">
+ å¤ªå¹³æ´‹å¤æ™‚é–“
+ </string>
+ <string name="Forward">
+ å‰
+ </string>
+ <string name="Left">
+ å·¦
+ </string>
+ <string name="Right">
+ å³
+ </string>
+ <string name="Back">
+ 後ã‚
+ </string>
+ <string name="North">
+ 北
+ </string>
+ <string name="South">
+ å—
+ </string>
+ <string name="West">
+ 西
+ </string>
+ <string name="East">
+ æ±
+ </string>
+ <string name="Up">
+ 上
+ </string>
+ <string name="Down">
+ 下
+ </string>
+ <string name="Any Category">
+ 全カテゴリ
+ </string>
+ <string name="Shopping">
+ ショッピング
+ </string>
+ <string name="Land Rental">
+ 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ«
+ </string>
+ <string name="Property Rental">
+ プロパティã®ãƒ¬ãƒ³ã‚¿ãƒ«
+ </string>
+ <string name="Special Attraction">
+ 特別アトラクション
+ </string>
+ <string name="New Products">
+ 新製å“
+ </string>
+ <string name="Employment">
+ 雇用
+ </string>
+ <string name="Wanted">
+ 求む
+ </string>
+ <string name="Service">
+ サービス
+ </string>
+ <string name="Personal">
+ パーソナル
+ </string>
+ <string name="None">
+ ãªã—
+ </string>
+ <string name="Linden Location">
+ Linden 所在地
+ </string>
+ <string name="Adult">
+ アダルト
+ </string>
+ <string name="Arts&amp;Culture">
+ アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Business">
+ ビジãƒã‚¹
+ </string>
+ <string name="Educational">
+ 教育的
+ </string>
+ <string name="Gaming">
+ ゲーム
+ </string>
+ <string name="Hangout">
+ ãŸã¾ã‚Šå ´
+ </string>
+ <string name="Newcomer Friendly">
+ æ–°ä½äººã«å„ªã—ã„
+ </string>
+ <string name="Parks&amp;Nature">
+ 公園ã¨è‡ªç„¶
+ </string>
+ <string name="Residential">
+ ä½å®…用
+ </string>
+ <string name="Stage">
+ ステージ
+ </string>
+ <string name="Other">
+ ãã®ä»–
+ </string>
+ <string name="Any">
+ 全員
+ </string>
+ <string name="You">
+ ã‚ãªãŸ
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ 複数ã®ãƒ¡ãƒ‡ã‚£ã‚¢
+ </string>
+ <string name="Play Media">
+ メディアをå†ç”Ÿ/ä¸€æ™‚åœæ­¢
+ </string>
+ <string name="MBCmdLineError">
+ コマンドラインã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+リンク先をå‚ç…§ã—ã¦ãã ã•ã„: http://wiki.secondlife.com/wiki/Client_parameters
+エラー:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] コマンドライン使用:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ã¯å¿…è¦ãªãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。
+
+複数ã®ã‚³ãƒ”ーを実行中ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«é–‹ã„ã¦ã„ã‚‹ã¨ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãŒèª¤èªè­˜ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ãれã§ã‚‚å•題ãŒç¶šãå ´åˆã€[APP_NAME] を完全ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã€å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBFatalError">
+ 致命的ãªã‚¨ãƒ©ãƒ¼
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] ã¯ã€AltiVecæ­è¼‰ã®ãƒ—ロセッサãŒå¿…è¦ã§ã™ã€‚(G4 以é™ï¼‰
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ã¯ã™ã§ã«å®Ÿè¡Œä¸­ã§ã™ã€‚
+最å°åŒ–ã•れãŸãƒ—ログラムã®ã‚³ãƒ”ーをタスクãƒãƒ¼ã§ç¢ºèªã—ã¦ãã ã•ã„。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] ã¯å‰å›žã®å®Ÿè¡Œæ™‚ã«ãƒ•リーズã—ã¦ã„ã¾ã™ã€‚
+クラッシュ報告をé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ
+ </string>
+ <string name="MBAlert">
+ 通知
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] 㯠DirectX 9.0b åŠã³ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+[APP_NAME] 㯠DirectX を使用ã—ã¦å®‰å®šæ€§ã®å•題ã€ä½Žãƒ‘フォーマンスã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ç­‰æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚„å¤ã„ドライãƒã‚’検出ã—ã¾ã™ã€‚ DirectX 9.0b ãŒãªãã¦ã‚‚ [APP_NAME] を実行ã§ãã¾ã™ãŒã€DirectX 9.0bã¨ã®ã”ä½¿ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚
+
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ </string>
+ <string name="MBWarning">
+ 警告
+ </string>
+ <string name="MBNoAutoUpdate">
+ 自動更新ã¯ç¾åœ¨ Linux ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。
+www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass 失敗
+ </string>
+ <string name="MBError">
+ エラー
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH] x [HEIGHT] ã§ã¯å…¨ç”»é¢ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ウィンドウモードã§å®Ÿè¡Œä¸­ã§ã™ã€‚
+ </string>
+ <string name="MBDestroyWinFailed">
+ シャットダウンエラー(DestroyWindow() 失敗)
+ </string>
+ <string name="MBShutdownErr">
+ シャットダウンエラー
+ </string>
+ <string name="MBDevContextErr">
+ GL ディãƒã‚¤ã‚¹ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒä½œã‚Œã¾ã›ã‚“
+ </string>
+ <string name="MBPixelFmtErr">
+ é©åˆ‡ãªãƒ”クセル形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="MBPixelFmtDescErr">
+ ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color (32ビット)ãŒå¿…è¦ã§ã™ã€‚
+ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã—ã¦ãã ã•ã„。
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚
+ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
+ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
+ </string>
+ <string name="MBPixelFmtSetErr">
+ ピクセル形å¼ãŒè¨­å®šã§ãã¾ã›ã‚“
+ </string>
+ <string name="MBGLContextErr">
+ GL レンダーコンテキストãŒä½œã‚Œã¾ã›ã‚“
+ </string>
+ <string name="MBGLContextActErr">
+ GL レンダーコンテキストをアクティベートã§ãã¾ã›ã‚“
+ </string>
+ <string name="MBVideoDrvErr">
+ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。
+
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ ã†ã£ã™ã‚‰ã¨ã—ãŸãƒ’ゲ
+ </string>
+ <string name="All White">
+ 真ã£ç™½
+ </string>
+ <string name="Anime Eyes">
+ アニメ風ã®ç›®
+ </string>
+ <string name="Arced">
+ アーãƒ
+ </string>
+ <string name="Arm Length">
+ è…•ã®é•·ã•
+ </string>
+ <string name="Attached">
+ å°
+ </string>
+ <string name="Attached Earlobes">
+ 耳ãŸã¶
+ </string>
+ <string name="Back Fringe">
+ 後ã‚é«ªã®æ¯›å…ˆ
+ </string>
+ <string name="Baggy">
+ ãŸã‚‹ã‚“ã§ã„ã‚‹
+ </string>
+ <string name="Bangs">
+ å‰é«ª
+ </string>
+ <string name="Beady Eyes">
+ ビーズã®ã‚ˆã†ãªç›®
+ </string>
+ <string name="Belly Size">
+ ãŠè…¹ã®å¤§ãã•
+ </string>
+ <string name="Big">
+ 大
+ </string>
+ <string name="Big Butt">
+ 大
+ </string>
+ <string name="Big Hair Back">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š 後ã‚
+ </string>
+ <string name="Big Hair Front">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š å‰
+ </string>
+ <string name="Big Hair Top">
+ 髪ã®å¤§éƒ¨åˆ†ï¼š 上部
+ </string>
+ <string name="Big Head">
+ 大
+ </string>
+ <string name="Big Pectorals">
+ 大
+ </string>
+ <string name="Big Spikes">
+ ã¨ã’ã‚り
+ </string>
+ <string name="Black">
+ é»’
+ </string>
+ <string name="Blonde">
+ ブロンド
+ </string>
+ <string name="Blonde Hair">
+ ブロンドã®é«ª
+ </string>
+ <string name="Blush">
+ ãƒãƒ¼ã‚¯
+ </string>
+ <string name="Blush Color">
+ ãƒãƒ¼ã‚¯ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="Blush Opacity">
+ ãƒãƒ¼ã‚¯ã®æ¿ƒã•
+ </string>
+ <string name="Body Definition">
+ 体ã®ç²¾ç´°åº¦
+ </string>
+ <string name="Body Fat">
+ 体脂肪
+ </string>
+ <string name="Body Freckles">
+ 体ã®ã—ã¿ãƒ»ãã°ã‹ã™
+ </string>
+ <string name="Body Thick">
+ 骨太
+ </string>
+ <string name="Body Thickness">
+ 体ã®åŽšã¿
+ </string>
+ <string name="Body Thin">
+ ç´°ã‚
+ </string>
+ <string name="Bow Legged">
+ 外股
+ </string>
+ <string name="Breast Buoyancy">
+ 胸ã®é‡åŠ›
+ </string>
+ <string name="Breast Cleavage">
+ 胸ã®è°·é–“
+ </string>
+ <string name="Breast Size">
+ 胸ã®å¤§ãã•
+ </string>
+ <string name="Bridge Width">
+ 両目ã®é–“ã®å¹…
+ </string>
+ <string name="Broad">
+ 広
+ </string>
+ <string name="Brow Size">
+ 眉毛ã®å¤§ãã•
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ çªã出ãŸç›®
+ </string>
+ <string name="Bulbous">
+ ã ã‚“ã”
+ </string>
+ <string name="Bulbous Nose">
+ ã ã‚“ã”é¼»
+ </string>
+ <string name="Bushy Eyebrows">
+ 太
+ </string>
+ <string name="Bushy Hair">
+ ã¼ã•ã¼ã•ヘア
+ </string>
+ <string name="Butt Size">
+ ãŠå°»ã®å¤§ãã•
+ </string>
+ <string name="bustle skirt">
+ 後ã‚ã®è†¨ã‚‰ã¿
+ </string>
+ <string name="no bustle">
+ 膨らã¿ãªã—
+ </string>
+ <string name="more bustle">
+ 膨らã¿å¤§
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ ã»ãŠéª¨
+ </string>
+ <string name="Chest Size">
+ 胸部ã®å¤§ãã•
+ </string>
+ <string name="Chin Angle">
+ ã‚ã”ã®è§’度
+ </string>
+ <string name="Chin Cleft">
+ ã‚ã”ã®å…ˆã®å‰²ã‚Œ
+ </string>
+ <string name="Chin Curtains">
+ ã‚ã”ã«æ²¿ã£ãŸã²ã’
+ </string>
+ <string name="Chin Depth">
+ ã‚ã”ã®é•·ã•
+ </string>
+ <string name="Chin Heavy">
+ ã‚ã”ã«é‡ç‚¹
+ </string>
+ <string name="Chin In">
+ ã²ã„ãŸã‚ã”
+ </string>
+ <string name="Chin Out">
+ çªã出ãŸã‚ã”
+ </string>
+ <string name="Chin-Neck">
+ ã‚ã”ã¨é¦–
+ </string>
+ <string name="Clear">
+ クリア
+ </string>
+ <string name="Cleft">
+ 割れãŸ
+ </string>
+ <string name="Close Set Eyes">
+ é¡”ã®ä¸­å¿ƒå¯„りã®ç›®
+ </string>
+ <string name="Closed">
+ クローズ
+ </string>
+ <string name="Closed Back">
+ 後ã‚ã¨ã˜
+ </string>
+ <string name="Closed Front">
+ å‰ã¨ã˜
+ </string>
+ <string name="Closed Left">
+ å·¦ã¨ã˜
+ </string>
+ <string name="Closed Right">
+ å³ã¨ã˜
+ </string>
+ <string name="Coin Purse">
+ コイン入れ
+ </string>
+ <string name="Collar Back">
+ 後ã‚ãˆã‚Š
+ </string>
+ <string name="Collar Front">
+ å‰ãˆã‚Š
+ </string>
+ <string name="Corner Down">
+ ダウン
+ </string>
+ <string name="Corner Up">
+ アップ
+ </string>
+ <string name="Creased">
+ é‡ã„ã¾ã¶ãŸ
+ </string>
+ <string name="Crooked Nose">
+ 曲ãŒã£ãŸé¼»
+ </string>
+ <string name="Cuff Flare">
+ 袖å£ã®ãƒ•レア
+ </string>
+ <string name="Dark">
+ ダーク
+ </string>
+ <string name="Dark Green">
+ ダークグリーン
+ </string>
+ <string name="Darker">
+ ダーク
+ </string>
+ <string name="Deep">
+ å°–ã£ãŸ
+ </string>
+ <string name="Default Heels">
+ デフォルトã®ã‹ã‹ã¨
+ </string>
+ <string name="Dense">
+ 濃
+ </string>
+ <string name="Double Chin">
+ 二é‡ã‚ã”
+ </string>
+ <string name="Downturned">
+ 下å‘ã
+ </string>
+ <string name="Duffle Bag">
+ ダッフルãƒãƒƒã‚°
+ </string>
+ <string name="Ear Angle">
+ 耳ã®è§’度
+ </string>
+ <string name="Ear Size">
+ 耳ã®å¤§ãã•
+ </string>
+ <string name="Ear Tips">
+ 耳ã®å…ˆ
+ </string>
+ <string name="Egg Head">
+ ãŸã¾ã”é ­
+ </string>
+ <string name="Eye Bags">
+ 下ã¾ã¶ãŸ
+ </string>
+ <string name="Eye Color">
+ çž³ã®è‰²
+ </string>
+ <string name="Eye Depth">
+ ç›®ã®ãã¼ã¿
+ </string>
+ <string name="Eye Lightness">
+ çž³ã®æ˜Žã‚‹ã•
+ </string>
+ <string name="Eye Opening">
+ 見開ãå…·åˆ
+ </string>
+ <string name="Eye Pop">
+ 両目ã®å¤§ãã•ã®å¯¾ç§°
+ </string>
+ <string name="Eye Size">
+ ç›®ã®å¤§ãã•
+ </string>
+ <string name="Eye Spacing">
+ ç›®ã¨ç›®ã®ã‚ã„ã ã®å¹…
+ </string>
+ <string name="Eyebrow Arc">
+ 眉毛ã®ã‚¢ãƒ¼ãƒ
+ </string>
+ <string name="Eyebrow Density">
+ 眉毛ã®å¯†é›†åº¦
+ </string>
+ <string name="Eyebrow Height">
+ 眉毛ã®é«˜ã•
+ </string>
+ <string name="Eyebrow Points">
+ 眉毛ã®è§’
+ </string>
+ <string name="Eyebrow Size">
+ 眉毛ã®å¤§ãã•
+ </string>
+ <string name="Eyelash Length">
+ ã¾ã¤ã’ã®é•·ã•
+ </string>
+ <string name="Eyeliner">
+ アイライナー
+ </string>
+ <string name="Eyeliner Color">
+ アイライナーã®è‰²
+ </string>
+ <string name="Eyes Bugged">
+ 下ã¾ã¶ãŸãŒãŸã‚‹ã‚“ã ç›®
+ </string>
+ <string name="Face Shear">
+ é¡”ã®ã‚†ãŒã¿
+ </string>
+ <string name="Facial Definition">
+ é¡”ã®ç²¾ç´°åº¦
+ </string>
+ <string name="Far Set Eyes">
+ 離れãŸç›®
+ </string>
+ <string name="Fat Lips">
+ 大
+ </string>
+ <string name="Female">
+ 女性
+ </string>
+ <string name="Fingerless">
+ 指ãªã—
+ </string>
+ <string name="Fingers">
+ 指ã‚り
+ </string>
+ <string name="Flared Cuffs">
+ 広ãŒã£ãŸè¢–å£
+ </string>
+ <string name="Flat">
+ 平ら
+ </string>
+ <string name="Flat Butt">
+ å°
+ </string>
+ <string name="Flat Head">
+ çµ¶å£é ­
+ </string>
+ <string name="Flat Toe">
+ フラット
+ </string>
+ <string name="Foot Size">
+ è¶³ã®å¤§ãã•
+ </string>
+ <string name="Forehead Angle">
+ ã²ãŸã„ã®è§’度
+ </string>
+ <string name="Forehead Heavy">
+ ã²ãŸã„ã«é‡ç‚¹
+ </string>
+ <string name="Freckles">
+ ã—ã¿ãƒ»ãã°ã‹ã™
+ </string>
+ <string name="Front Fringe">
+ å‰é«ªã®æ¯›å…ˆ
+ </string>
+ <string name="Full Back">
+ 刈られã¦ã„ãªã„髪
+ </string>
+ <string name="Full Eyeliner">
+ ã‚り
+ </string>
+ <string name="Full Front">
+ 刈られã¦ã„ãªã„髪
+ </string>
+ <string name="Full Hair Sides">
+ サイドã®é«ª
+ </string>
+ <string name="Full Sides">
+ ç”Ÿãˆæƒã£ãŸã‚µã‚¤ãƒ‰
+ </string>
+ <string name="Glossy">
+ ã‚り
+ </string>
+ <string name="Glove Fingers">
+ æ‰‹è¢‹ã®æŒ‡
+ </string>
+ <string name="Glove Length">
+ 手袋ã®é•·ã•
+ </string>
+ <string name="Hair">
+ 髪
+ </string>
+ <string name="Hair Back">
+ 髪: 後ã‚
+ </string>
+ <string name="Hair Front">
+ 髪: å‰
+ </string>
+ <string name="Hair Sides">
+ 髪: サイド
+ </string>
+ <string name="Hair Sweep">
+ æµã™
+ </string>
+ <string name="Hair Thickess">
+ 髪ã®é‡
+ </string>
+ <string name="Hair Thickness">
+ 髪ã®é‡
+ </string>
+ <string name="Hair Tilt">
+ 髪ã®å‘ã
+ </string>
+ <string name="Hair Tilted Left">
+ å·¦å‘ã
+ </string>
+ <string name="Hair Tilted Right">
+ å³å‘ã
+ </string>
+ <string name="Hair Volume">
+ 髪: ボリューム
+ </string>
+ <string name="Hand Size">
+ 手ã®å¤§ãã•
+ </string>
+ <string name="Handlebars">
+ ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼
+ </string>
+ <string name="Head Length">
+ é ­ã®é•·ã•
+ </string>
+ <string name="Head Shape">
+ é ­ã®å½¢
+ </string>
+ <string name="Head Size">
+ é ­ã®å¤§ãã•
+ </string>
+ <string name="Head Stretch">
+ é ­ã®ä¼¸ã³
+ </string>
+ <string name="Heel Height">
+ ヒールã®é«˜ã•
+ </string>
+ <string name="Heel Shape">
+ ヒールã®å½¢
+ </string>
+ <string name="Height">
+ 身長
+ </string>
+ <string name="High">
+ 高
+ </string>
+ <string name="High Heels">
+ ãƒã‚¤ãƒ’ール
+ </string>
+ <string name="High Jaw">
+ 高
+ </string>
+ <string name="High Platforms">
+ 厚底
+ </string>
+ <string name="High and Tight">
+ 高ã‚ã§ã‚¿ã‚¤ãƒˆ
+ </string>
+ <string name="Higher">
+ 高
+ </string>
+ <string name="Hip Length">
+ è…°ã®é•·ã•
+ </string>
+ <string name="Hip Width">
+ è…°ã®å¹…
+ </string>
+ <string name="In">
+ 内å‘ã
+ </string>
+ <string name="In Shdw Color">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="In Shdw Opacity">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã•
+ </string>
+ <string name="Inner Eye Corner">
+ 目頭
+ </string>
+ <string name="Inner Eye Shadow">
+ 内å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Inner Shadow">
+ 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Jacket Length">
+ ジャケット丈
+ </string>
+ <string name="Jacket Wrinkles">
+ ジャケットã®ã—ã‚
+ </string>
+ <string name="Jaw Angle">
+ ã‚ã”ã®è§’度
+ </string>
+ <string name="Jaw Jut">
+ ã‚ã”ã®çªå‡º
+ </string>
+ <string name="Jaw Shape">
+ ã‚ã”ã®å½¢
+ </string>
+ <string name="Join">
+ 寄ã›ãŸ
+ </string>
+ <string name="Jowls">
+ ãˆã‚‰
+ </string>
+ <string name="Knee Angle">
+ è†ã®è§’度
+ </string>
+ <string name="Knock Kneed">
+ 内股
+ </string>
+ <string name="Large">
+ 大
+ </string>
+ <string name="Large Hands">
+ 大
+ </string>
+ <string name="Left Part">
+ 左分ã‘
+ </string>
+ <string name="Leg Length">
+ 脚ã®é•·ã•
+ </string>
+ <string name="Leg Muscles">
+ 脚ã®ç­‹è‚‰
+ </string>
+ <string name="Less">
+ å°
+ </string>
+ <string name="Less Body Fat">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Curtains">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Freckles">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Full">
+ è–„ã„
+ </string>
+ <string name="Less Gravity">
+ å°‘
+ </string>
+ <string name="Less Love">
+ å°‘
+ </string>
+ <string name="Less Muscles">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Muscular">
+ å°‘ãªã‚
+ </string>
+ <string name="Less Rosy">
+ å°‘ãªç›®
+ </string>
+ <string name="Less Round">
+ 丸ã¿å°‘ãªç›®
+ </string>
+ <string name="Less Saddle">
+ å°
+ </string>
+ <string name="Less Square">
+ å°
+ </string>
+ <string name="Less Volume">
+ ボリューム少ãªç›®
+ </string>
+ <string name="Less soul">
+ å°
+ </string>
+ <string name="Lighter">
+ ライト
+ </string>
+ <string name="Lip Cleft">
+ 唇ã®å±±
+ </string>
+ <string name="Lip Cleft Depth">
+ 唇ã®å±±ã®é«˜ã•
+ </string>
+ <string name="Lip Fullness">
+ 唇ã®åŽšã¿
+ </string>
+ <string name="Lip Pinkness">
+ 唇ã®èµ¤ã¿
+ </string>
+ <string name="Lip Ratio">
+ 上下唇ã®å¤§ãã•
+ </string>
+ <string name="Lip Thickness">
+ 唇ã®å‰å¾Œå¹…
+ </string>
+ <string name="Lip Width">
+ å£ã®å¤§ãã•
+ </string>
+ <string name="Lipgloss">
+ リップグロス
+ </string>
+ <string name="Lipstick">
+ å£ç´…
+ </string>
+ <string name="Lipstick Color">
+ å£ç´…ã®è‰²
+ </string>
+ <string name="Long">
+ é•·
+ </string>
+ <string name="Long Head">
+ å‰å¾Œå¹…ãŒåºƒã„é ­
+ </string>
+ <string name="Long Hips">
+ é•·
+ </string>
+ <string name="Long Legs">
+ é•·
+ </string>
+ <string name="Long Neck">
+ é•·
+ </string>
+ <string name="Long Pigtails">
+ é•·
+ </string>
+ <string name="Long Ponytail">
+ é•·
+ </string>
+ <string name="Long Torso">
+ é•·
+ </string>
+ <string name="Long arms">
+ é•·
+ </string>
+ <string name="Loose Pants">
+ ゆã£ãŸã‚Š
+ </string>
+ <string name="Loose Shirt">
+ ゆるã‚
+ </string>
+ <string name="Loose Sleeves">
+ ゆるã‚
+ </string>
+ <string name="Love Handles">
+ ウエスト周り
+ </string>
+ <string name="Low">
低
</string>
- <string name="GraphicsQualityMid">
- 中
+ <string name="Low Heels">
+ ローヒール
</string>
- <string name="GraphicsQualityHigh">
+ <string name="Low Jaw">
+ 低
+ </string>
+ <string name="Low Platforms">
+ 低ã‚
+ </string>
+ <string name="Low and Loose">
+ 低ã‚ã§ã‚†ã£ãŸã‚Š
+ </string>
+ <string name="Lower">
+ 低
+ </string>
+ <string name="Lower Bridge">
+ 鼻筋
+ </string>
+ <string name="Lower Cheeks">
+ ã»ãŠã®ä¸‹éƒ¨
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ 真ん中分ã‘
+ </string>
+ <string name="More">
+ 大
+ </string>
+ <string name="More Blush">
+ ãã¤ã‚
+ </string>
+ <string name="More Body Fat">
+ 多ã‚
+ </string>
+ <string name="More Curtains">
+ 多ã‚
+ </string>
+ <string name="More Eyeshadow">
+ ã‚り
+ </string>
+ <string name="More Freckles">
+ 多ã‚
+ </string>
+ <string name="More Full">
+ 厚ã„
+ </string>
+ <string name="More Gravity">
+ 大
+ </string>
+ <string name="More Lipstick">
+ ã‚り
+ </string>
+ <string name="More Love">
+ 大
+ </string>
+ <string name="More Lower Lip">
+ 大
+ </string>
+ <string name="More Muscles">
+ 多ã‚
+ </string>
+ <string name="More Muscular">
+ 筋骨隆々
+ </string>
+ <string name="More Rosy">
+ 多ã‚
+ </string>
+ <string name="More Round">
+ ã¾ã‚‹
+ </string>
+ <string name="More Saddle">
+ 大
+ </string>
+ <string name="More Sloped">
+ ãªã ã‚‰ã‹
+ </string>
+ <string name="More Square">
+ 四角
+ </string>
+ <string name="More Upper Lip">
+ 大
+ </string>
+ <string name="More Vertical">
+ 垂直
+ </string>
+ <string name="More Volume">
+ 大
+ </string>
+ <string name="More soul">
+ 大
+ </string>
+ <string name="Moustache">
+ å£ã²ã’
+ </string>
+ <string name="Mouth Corner">
+ å£è§’
+ </string>
+ <string name="Mouth Position">
+ å£ã®ä½ç½®
+ </string>
+ <string name="Mowhawk">
+ モヒカン
+ </string>
+ <string name="Muscular">
+ 筋骨ãŸãã¾ã—ã„
+ </string>
+ <string name="Mutton Chops">
+ マトンãƒãƒ§ãƒƒãƒ—ス
+ </string>
+ <string name="Nail Polish">
+ マニキュア
+ </string>
+ <string name="Nail Polish Color">
+ マニキュアã®è‰²
+ </string>
+ <string name="Narrow">
+ ç‹­
+ </string>
+ <string name="Narrow Back">
+ ç‹­
+ </string>
+ <string name="Narrow Front">
+ ç‹­
+ </string>
+ <string name="Narrow Lips">
+ ãŠã¡ã‚‡ã¼å£
+ </string>
+ <string name="Natural">
+ ナãƒãƒ¥ãƒ©ãƒ«
+ </string>
+ <string name="Neck Length">
+ 首ã®é•·ã•
+ </string>
+ <string name="Neck Thickness">
+ 首ã®å¤ªã•
+ </string>
+ <string name="No Blush">
+ ãªã—
+ </string>
+ <string name="No Eyeliner">
+ ãªã—
+ </string>
+ <string name="No Eyeshadow">
+ ãªã—
+ </string>
+ <string name="No Lipgloss">
+ ãªã—
+ </string>
+ <string name="No Lipstick">
+ ãªã—
+ </string>
+ <string name="No Part">
+ ãªã—
+ </string>
+ <string name="No Polish">
+ ãªã—
+ </string>
+ <string name="No Red">
+ ãªã—
+ </string>
+ <string name="No Spikes">
+ ãªã—
+ </string>
+ <string name="No White">
+ ãªã—
+ </string>
+ <string name="No Wrinkles">
+ ãªã—
+ </string>
+ <string name="Normal Lower">
+ 下
+ </string>
+ <string name="Normal Upper">
+ 上
+ </string>
+ <string name="Nose Left">
+ 左曲ãŒã‚Š
+ </string>
+ <string name="Nose Right">
+ 峿›²ãŒã‚Š
+ </string>
+ <string name="Nose Size">
+ é¼»ã®å¤§ãã•
+ </string>
+ <string name="Nose Thickness">
+ é¼»ã®åŽšã¿
+ </string>
+ <string name="Nose Tip Angle">
+ 鼻先ã®è§’度
+ </string>
+ <string name="Nose Tip Shape">
+ 鼻先ã®å½¢
+ </string>
+ <string name="Nose Width">
+ é¼»ã®å¹…
+ </string>
+ <string name="Nostril Division">
+ é¼»ã®ç©´ã®é«˜ã•
+ </string>
+ <string name="Nostril Width">
+ é¼»ã®ç©´ã®å¹…
+ </string>
+ <string name="Opaque">
+ 濃ã„ã‚
+ </string>
+ <string name="Open">
+ オープン
+ </string>
+ <string name="Open Back">
+ 後ã‚ã‚ã
+ </string>
+ <string name="Open Front">
+ å‰ã‚ã
+ </string>
+ <string name="Open Left">
+ å·¦ã‚ã
+ </string>
+ <string name="Open Right">
+ å³ã‚ã
+ </string>
+ <string name="Orange">
+ オレンジ
+ </string>
+ <string name="Out">
+ 外å‘ã
+ </string>
+ <string name="Out Shdw Color">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼
+ </string>
+ <string name="Out Shdw Opacity">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã•
+ </string>
+ <string name="Outer Eye Corner">
+ 目尻
+ </string>
+ <string name="Outer Eye Shadow">
+ 外å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Outer Shadow">
+ 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦
+ </string>
+ <string name="Overbite">
+ å‡ºã£æ­¯
+ </string>
+ <string name="Package">
+ パッケージ
+ </string>
+ <string name="Painted Nails">
+ ã‚り
+ </string>
+ <string name="Pale">
+ 悪ã„
+ </string>
+ <string name="Pants Crotch">
+ パンツã®è‚¡
+ </string>
+ <string name="Pants Fit">
+ パンツã®ãƒ•ィット感
+ </string>
+ <string name="Pants Length">
+ パンツ丈
+ </string>
+ <string name="Pants Waist">
+ ウエスト
+ </string>
+ <string name="Pants Wrinkles">
+ パンツã®ã—ã‚
+ </string>
+ <string name="Part">
+ ã‚り
+ </string>
+ <string name="Part Bangs">
+ 分ã‘ãŸå‰é«ª
+ </string>
+ <string name="Pectorals">
+ 胸筋
+ </string>
+ <string name="Pigment">
+ 色素
+ </string>
+ <string name="Pigtails">
+ 下ã’髪
+ </string>
+ <string name="Pink">
+ ピンク
+ </string>
+ <string name="Pinker">
+ ピンク
+ </string>
+ <string name="Platform Height">
+ é´åº•ã®é«˜ã•
+ </string>
+ <string name="Platform Width">
+ é´åº•ã®å¹…
+ </string>
+ <string name="Pointy">
+ å°–ã£ãŸ
+ </string>
+ <string name="Pointy Heels">
+ å¹…ç‹­
+ </string>
+ <string name="Ponytail">
+ ãƒãƒ‹ãƒ¼ãƒ†ãƒ¼ãƒ«
+ </string>
+ <string name="Poofy Skirt">
+ ãµã‚“ã‚り
+ </string>
+ <string name="Pop Left Eye">
+ 左目を大ãã
+ </string>
+ <string name="Pop Right Eye">
+ å³ç›®ã‚’大ãã
+ </string>
+ <string name="Puffy">
+ ãµã£ãら
+ </string>
+ <string name="Puffy Eyelids">
+ ç›®ã®å‘¨ã‚Šã®è†¨ã‚‰ã¿
+ </string>
+ <string name="Rainbow Color">
+ 虹色
+ </string>
+ <string name="Red Hair">
+ 赤毛
+ </string>
+ <string name="Regular">
+ 凿•´ã®ã¨ã‚ŒãŸ
+ </string>
+ <string name="Right Part">
+ å³åˆ†ã‘
+ </string>
+ <string name="Rosy Complexion">
+ ã»ãŠã®èµ¤ã‚‰ã¿
+ </string>
+ <string name="Round">
+ ã¾ã‚‹ã£ã“ã„
+ </string>
+ <string name="Ruddiness">
+ 血色
+ </string>
+ <string name="Ruddy">
+ 良ã„
+ </string>
+ <string name="Rumpled Hair">
+ ãã—ゃãã—ゃヘア
+ </string>
+ <string name="Saddle Bags">
+ 腰回りã®è‚‰ä»˜ã
+ </string>
+ <string name="Scrawny Leg">
+ 骨張ã£ãŸè„š
+ </string>
+ <string name="Separate">
+ 離れãŸ
+ </string>
+ <string name="Shallow">
+ ãªã ã‚‰ã‹
+ </string>
+ <string name="Shear Back">
+ 後方を刈る
+ </string>
+ <string name="Shear Face">
+ é¡”ã®ã‚†ãŒã¿
+ </string>
+ <string name="Shear Front">
+ 剿–¹ã‚’刈る
+ </string>
+ <string name="Shear Left Up">
+ å·¦åŠåˆ†ã‚’上ã«
+ </string>
+ <string name="Shear Right Up">
+ å³åŠåˆ†ã‚’上ã«
+ </string>
+ <string name="Sheared Back">
+ 後ã‚を刈られãŸé«ª
+ </string>
+ <string name="Sheared Front">
+ å‰ã‚’刈られãŸé«ª
+ </string>
+ <string name="Shift Left">
+ å·¦å‘ã
+ </string>
+ <string name="Shift Mouth">
+ å£ã®å‘ã
+ </string>
+ <string name="Shift Right">
+ å³å‘ã
+ </string>
+ <string name="Shirt Bottom">
+ シャツã®è£¾
+ </string>
+ <string name="Shirt Fit">
+ シャツã®ãƒ•ィット感
+ </string>
+ <string name="Shirt Wrinkles">
+ シャツã®ã—ã‚
+ </string>
+ <string name="Shoe Height">
+ é´ã®é•·ã•
+ </string>
+ <string name="Short">
+ 短
+ </string>
+ <string name="Short Arms">
+ 短
+ </string>
+ <string name="Short Legs">
+ 短
+ </string>
+ <string name="Short Neck">
+ 短
+ </string>
+ <string name="Short Pigtails">
+ 短
+ </string>
+ <string name="Short Ponytail">
+ 短
+ </string>
+ <string name="Short Sideburns">
+ 短ã‚
+ </string>
+ <string name="Short Torso">
+ 短
+ </string>
+ <string name="Short hips">
+ 短
+ </string>
+ <string name="Shoulders">
+ è‚©
+ </string>
+ <string name="Side Fringe">
+ ã‚µã‚¤ãƒ‰ã®æ¯›å…ˆ
+ </string>
+ <string name="Sideburns">
+ ã‚‚ã¿ã‚ã’
+ </string>
+ <string name="Sides Hair">
+ サイドã®é«ª
+ </string>
+ <string name="Sides Hair Down">
+ ダウン
+ </string>
+ <string name="Sides Hair Up">
+ アップ
+ </string>
+ <string name="Skinny Neck">
+ ç´°
+ </string>
+ <string name="Skirt Fit">
+ スカートã®ãƒ•ィット感
+ </string>
+ <string name="Skirt Length">
+ スカート丈
+ </string>
+ <string name="Slanted Forehead">
+ 傾斜ã—ãŸé¡
+ </string>
+ <string name="Sleeve Length">
+ 袖丈
+ </string>
+ <string name="Sleeve Looseness">
+ 袖ã®ãƒ•ィット感
+ </string>
+ <string name="Slit Back">
+ スリット: 後ã‚
+ </string>
+ <string name="Slit Front">
+ スリット: å‰
+ </string>
+ <string name="Slit Left">
+ スリット: 左
+ </string>
+ <string name="Slit Right">
+ スリット: å³
+ </string>
+ <string name="Small">
+ å°
+ </string>
+ <string name="Small Hands">
+ å°
+ </string>
+ <string name="Small Head">
+ å°
+ </string>
+ <string name="Smooth">
+ 滑らã‹
+ </string>
+ <string name="Smooth Hair">
+ スムーズ
+ </string>
+ <string name="Socks Length">
+ é´ä¸‹ä¸ˆ
+ </string>
+ <string name="Soulpatch">
+ ソウルパッãƒ
+ </string>
+ <string name="Sparse">
+ è–„
+ </string>
+ <string name="Spiked Hair">
+ ã¨ã’ã¨ã’ヘア
+ </string>
+ <string name="Square">
+ è§’å¼µã£ãŸ
+ </string>
+ <string name="Square Toe">
+ スクエアトゥ
+ </string>
+ <string name="Squash Head">
+ カボãƒãƒ£åž‹
+ </string>
+ <string name="Stretch Head">
+ 縦長
+ </string>
+ <string name="Sunken">
+ ã“ã‘ãŸ
+ </string>
+ <string name="Sunken Chest">
+ å°
+ </string>
+ <string name="Sunken Eyes">
+ ãã¼ã‚“ã ç›®
+ </string>
+ <string name="Sweep Back">
+ 後ã‚ã¸
+ </string>
+ <string name="Sweep Forward">
+ å‰ã¸
+ </string>
+ <string name="Tall">
高
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Linden所在地</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼</string>
- <string name="Business">ビジãƒã‚¹</string>
- <string name="Educational">教育的</string>
- <string name="Gaming">ゲーム</string>
- <string name="Hangout">ãŸã¾ã‚Šå ´</string>
- <string name="Newcomer Friendly">æ–°ä½äººã«å¥½æ„çš„</string>
- <string name="Parks&amp;Nature">公園ã¨è‡ªç„¶</string>
- <string name="Residential">ä½å®…用</string>
- <string name="Shopping">ショッピング</string>
- <string name="Other">ãã®ä»–</string>
- <string name="ringing">
- インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­...
+ <string name="Taper Back">
+ 後ã‚ã«å…ˆç´°
</string>
- <string name="connected">
- 接続ã—ã¾ã—ãŸ
+ <string name="Taper Front">
+ å‰ã«å…ˆç´°
</string>
- <string name="unavailable">
- ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
+ <string name="Thick Heels">
+ 幅広
</string>
- <string name="hang_up">
- インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•れã¾ã—ãŸ
+ <string name="Thick Neck">
+ 太
</string>
- <string name="ScriptQuestionCautionChatGranted">
- [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ <string name="Thick Toe">
+ 厚ã‚
</string>
- <string name="ScriptQuestionCautionChatDenied">
- [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ <string name="Thin">
+ è–„ã„
</string>
- <string name="ScriptTakeMoney">
- リンデンドル(L$)を支払ã†
+ <string name="Thin Eyebrows">
+ ç´°
</string>
- <string name="ActOnControlInputs">
- 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹•
+ <string name="Thin Lips">
+ å°
</string>
- <string name="RemapControlInputs">
- 制御入力ã®ãƒªãƒžãƒƒãƒ—
+ <string name="Thin Nose">
+ ç´°ã„é¼»
</string>
- <string name="AnimateYourAvatar">
- ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•作
+ <string name="Tight Chin">
+ ã²ãã—ã¾ã£ãŸã‚ã”
</string>
- <string name="AttachToYourAvatar">
- ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€
+ <string name="Tight Cuffs">
+ タイト
</string>
- <string name="ReleaseOwnership">
- 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹
+ <string name="Tight Pants">
+ タイト
</string>
- <string name="LinkAndDelink">
- ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤
+ <string name="Tight Shirt">
+ タイト
</string>
- <string name="AddAndRemoveJoints">
- ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤
+ <string name="Tight Skirt">
+ タイト
</string>
- <string name="ChangePermissions">
- 権é™ã®å¤‰æ›´
+ <string name="Tight Sleeves">
+ タイト
</string>
- <string name="TrackYourCamera">
- カメラ追従
+ <string name="Toe Shape">
+ ã¤ã¾å…ˆã®å½¢
</string>
- <string name="ControlYourCamera">
- カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«
+ <string name="Toe Thickness">
+ ã¤ã¾å…ˆã®åŽšã¿
+ </string>
+ <string name="Torso Length">
+ 上åŠèº«ã®é•·ã•
+ </string>
+ <string name="Torso Muscles">
+ 上åŠèº«ã®ç­‹è‚‰
+ </string>
+ <string name="Torso Scrawny">
+ 上åŠèº«ã®éª¨å¼µã‚Š
+ </string>
+ <string name="Unattached">
+ 大
+ </string>
+ <string name="Uncreased">
+ 軽ã„ã¾ã¶ãŸ
+ </string>
+ <string name="Underbite">
+ å—ã‘å£
+ </string>
+ <string name="Unnatural">
+ ユニーク
+ </string>
+ <string name="Upper Bridge">
+ 両目ã®ã‚ã„ã 
+ </string>
+ <string name="Upper Cheeks">
+ ã»ãŠã®ä¸Šéƒ¨
+ </string>
+ <string name="Upper Chin Cleft">
+ ã‚ã”上部ã®å‰²ã‚Œå…·åˆ
+ </string>
+ <string name="Upper Eyelid Fold">
+ 二é‡ã®å¹…
+ </string>
+ <string name="Upturned">
+ 上å‘ã
+ </string>
+ <string name="Very Red">
+ 真ã£èµ¤
+ </string>
+ <string name="Waist Height">
+ ウエストã®é«˜ã•
+ </string>
+ <string name="Well-Fed">
+ ã¤ã¾ã£ãŸ
+ </string>
+ <string name="White Hair">
+ 白髪
+ </string>
+ <string name="Wide">
+ 広
+ </string>
+ <string name="Wide Back">
+ 広
+ </string>
+ <string name="Wide Front">
+ 広
+ </string>
+ <string name="Wide Lips">
+ 大ãã„å£
+ </string>
+ <string name="Wild">
+ ワイルド
+ </string>
+ <string name="Wrinkles">
+ ã—ã‚ã‚り
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ マイ ランドマークã«è¿½åŠ 
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ マイ ランドマークを編集
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ ç¾åœ¨åœ°ã®è©³ç´°ã‚’見る
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ マイ ロケーション履歴
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ ã“ã®åœŸåœ°ã‚’購入
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ã“ã“ã§ã¯ãƒœã‚¤ã‚¹ã®åˆ©ç”¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ 飛行ã¯ç¦æ­¢ã•れã¦ã„ã¾ã™
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ オブジェクトã®åˆ¶ä½œãƒ»ãƒ‰ãƒ­ãƒƒãƒ—ã¯ç¦æ­¢ã•れã¦ã„ã¾ã™
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ スクリプトä¸å¯
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ 体力
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] アップデート
+ </string>
+ <string name="UpdaterNowUpdating">
+ åªä»Š [APP_NAME] をアップデート中ã§ã™...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] をインストール中ã§ã™...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ ãŠä½¿ã„ã® [APP_NAME] ãƒ“ãƒ¥ãƒ¼ãƒ¯ãŒæœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã•れã¦ã„ã¾ã™ã€‚ 数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã®ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ アップデートをダウンロード中ã§ã™...
+ </string>
+ <string name="UpdaterProgressBarText">
+ アップデートをダウンロード中
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ アップデートã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME] をアップデート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã•ã„。
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ アップデートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="UpdaterFailStartTitle">
+ ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ
+ </string>
+ <string name="IM_logging_string">
+ -- インスタントメッセージã®ä¿å­˜é–‹å§‹ --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] ã¯å…¥åЛ䏭ã§ã™...
+ </string>
+ <string name="Unnamed">
+ (åå‰ãªã—)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (モデレート: デフォルトã§ãƒœã‚¤ã‚¹ã¯ã‚ªãƒ•)
+ </string>
+ <string name="IM_unavailable_text_label">
+ ã“ã®ã‚³ãƒ¼ãƒ«ã§ã¯æ–‡å­—ãƒãƒ£ãƒƒãƒˆãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="IM_muted_text_label">
+ グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãŒã€ã‚ãªãŸã®æ–‡å­—ãƒãƒ£ãƒƒãƒˆã‚’ä½¿ç”¨ç¦æ­¢ã«ã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="IM_default_text_label">
+ ã“ã“をクリックã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’開始。
+ </string>
+ <string name="IM_to_label">
+ 宛先
+ </string>
+ <string name="IM_moderator_label">
+ (モデレータ)
+ </string>
+ <string name="started_call">
+ ボイスコールを開始ã—ã¾ã™
+ </string>
+ <string name="joined_call">
+ ボイスコールã«å‚加ã—ã¾ã—ãŸ
+ </string>
+ <string name="ringing-im">
+ ボイスコールã«å‚加...
+ </string>
+ <string name="connected-im">
+ 接続ã—ã¾ã—ãŸã€‚コール終了をクリックã—ã¦åˆ‡ã‚Šã¾ã™
+ </string>
+ <string name="hang_up-im">
+ ボイスコールã‹ã‚‰é€€å¸­ã—ã¾ã—ãŸ
+ </string>
+ <string name="answering-im">
+ 接続中...
+ </string>
+ <string name="conference-title">
+ アドホックコンファレンス
+ </string>
+ <string name="inventory_item_offered-im">
+ æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚Šã¾ã—ãŸ
+ </string>
+ <string name="share_alert">
+ æŒã¡ç‰©ã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™
</string>
<string name="only_user_message">
ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
</string>
<string name="offline_message">
- [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚
</string>
<string name="invite_message">
- ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。
+ ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。
+ </string>
+ <string name="muted_message">
+ ã“ã®ä½äººã‚’ブロックã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ロックãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚
+ </string>
+ <string name="generic">
+ リクエスト中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</string>
<string name="generic_request_error">
è¦æ±‚中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
@@ -607,48 +3331,39 @@
ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。
</string>
<string name="not_a_mod_error">
- ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。
+ ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。
+ </string>
+ <string name="muted">
+ グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ãŒã€ã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’ç¦æ­¢ã—ã¾ã—ãŸã€‚
</string>
<string name="muted_error">
グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—ãŸ
</string>
<string name="add_session_event">
- [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="message">
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</string>
<string name="message_session_event">
- [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="mute">
+ モデレート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="removed">
+ グループã‹ã‚‰è„±é€€ã—ã¾ã—ãŸã€‚
</string>
<string name="removed_from_group">
ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚
</string>
<string name="close_on_no_ability">
- ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
- </string>
- <string name="AcctTypeResident">
- ä½äºº
- </string>
- <string name="AcctTypeTrial">
- トライアル
- </string>
- <string name="AcctTypeCharterMember">
- 特権メンãƒãƒ¼
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab従業員
- </string>
- <string name="PaymentInfoUsed">
- æ”¯æ‰•ã„æƒ…報登録済
- </string>
- <string name="PaymentInfoOnFile">
- æ”¯æ‰•ã„æƒ…報登録済ã¿
- </string>
- <string name="NoPaymentInfoOnFile">
- æ”¯æ‰•ã„æƒ…報未登録
- </string>
- <string name="AgeVerified">
- å¹´é½¢ç¢ºèªæ¸ˆã¿
- </string>
- <string name="NotAgeVerified">
- 年齢未確èª
- </string>
+ ã“ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 7e99d2562e..72c183d03b 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages name="">
<message_set name="errors">
<message name="invalid_tport">
- テレãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ãç¶šã表示ã•れる場åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。
+ テレãƒãƒ¼ãƒˆå‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</message>
<message name="invalid_region_handoff">
- 地域間ã®ç§»å‹•ã®å‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚地域間を移動ã™ã‚‹ã«ã¯ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ãç¶šã表示ã•れる場åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。
+ リージョン間ã®ç§»å‹•中ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</message>
<message name="blocked_tport">
申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
index 9ad947df66..10c30eb361 100644
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Over [APP_NAME]">
+<floater name="floater_about" title="OVER [CAPITALIZED_APP_NAME]">
<tab_container name="about_tab">
<panel name="credits_panel">
<text_editor name="credits_editor">
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
index 6aa80c00db..3a77de70d2 100644
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Over land">
+<floater name="floaterland" title="OVER LAND">
<tab_container name="landtab">
<panel label="Algemeen" name="land_general_panel">
<text name="Name:">
diff --git a/indra/newview/skins/default/xui/nl/floater_auction.xml b/indra/newview/skins/default/xui/nl/floater_auction.xml
index eb061e028d..611024699b 100644
--- a/indra/newview/skins/default/xui/nl/floater_auction.xml
+++ b/indra/newview/skins/default/xui/nl/floater_auction.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="Start Linden Land Verkoop">
+<floater name="floater_auction" title="START LINDEN LAND VERKOOP">
<check_box label="Voeg geel selectie kader toe" name="fence_check"/>
<button label="Foto" label_selected="Foto" name="snapshot_btn"/>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_beacons.xml b/indra/newview/skins/default/xui/nl/floater_beacons.xml
index 84196ac14f..ecc485e354 100644
--- a/indra/newview/skins/default/xui/nl/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/nl/floater_beacons.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Bakens">
+<floater name="beacons" title="BAKENS">
<panel name="beacons_panel">
<check_box label="Gescripte objecten met alleen Aanraken" name="touch_only"/>
<check_box label="Gescripte objecten" name="scripted"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
index 7f35ec45a9..5374ffc26a 100644
--- a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Bulk wijzigen inhoud permissies">
+<floater name="floaterbulkperms" title="BULK WIJZIGEN INHOUD PERMISSIES">
<text name="applyto">
Inhoud Typen
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_bumps.xml b/indra/newview/skins/default/xui/nl/floater_bumps.xml
index 9dbfe405aa..df9a99d62e 100644
--- a/indra/newview/skins/default/xui/nl/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/nl/floater_bumps.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="Botsingen, duwen &amp; slaan">
+<floater name="floater_bumps" title="BOTSINGEN, DUWEN &amp; SLAAN">
<string name="none_detected">
Geen gedetecteerd
</string>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
index df0614b3d2..4c0ff7d04a 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="Koop inhoud">
+<floater name="floater_buy_contents" title="KOOP INHOUD">
<text name="contains_text">
[NAME] bevat:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
index 9f740b86c8..6ee5cc5341 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="Koop valuta">
+<floater name="buy currency" title="KOOP VALUTA">
<text name="info_buying">
Valuta kopen
</text>
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est" left_delta="80">
- voor ong. US$ [USD]
+ voor ong. [LOCALAMOUNT]
</text>
<text name="getting_data">
Data ophalen…
@@ -63,6 +63,6 @@ Verhoog de hoeveelheid die gekocht moet worden.
<button label="Annuleren" name="cancel_btn"/>
<button label="Kopen" name="buy_btn"/>
<string name="buy_currency">
- Koop L$ [LINDENS] voor ong. US$ [USD]
+ Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_land.xml b/indra/newview/skins/default/xui/nl/floater_buy_land.xml
index 1bb02cc7d0..04990e78db 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Koop land">
+<floater name="buy land" title="KOOP LAND">
<text name="region_name_label">
Regio:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_object.xml b/indra/newview/skins/default/xui/nl/floater_buy_object.xml
index c83f2008c6..5d2d9dd3d0 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Koop een kopie van object">
+<floater name="contents" title="KOOP EEN KOPIE VAN OBJECT">
<text name="contents_text">
en zijn inhoud:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_choose_group.xml b/indra/newview/skins/default/xui/nl/floater_choose_group.xml
index 3f6ce44cfd..8d54d62d2d 100644
--- a/indra/newview/skins/default/xui/nl/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/nl/floater_choose_group.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="groups" title="Groepen">
+<floater name="groups" title="GROEPEN">
<text name="groupdesc">
Kies een groep:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_color_picker.xml b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
index a357e874f7..9b61af0710 100644
--- a/indra/newview/skins/default/xui/nl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="Kleurkiezer">
+<floater name="ColorPicker" title="KLEURKIEZER">
<text name="r_val_text">
Rood:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml
index 99a109ab78..4de26347e1 100644
--- a/indra/newview/skins/default/xui/nl/floater_customize.xml
+++ b/indra/newview/skins/default/xui/nl/floater_customize.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Uiterlijk" width="551">
+<floater name="floater customize" title="UITERLIJK" width="551">
<tab_container name="customize tab container" tab_min_width="120" width="549">
<placeholder label="Lichaamsdelen" name="body_parts_placeholder"/>
<panel label="Postuur" name="Shape" left="124" width="389">
diff --git a/indra/newview/skins/default/xui/nl/floater_env_settings.xml b/indra/newview/skins/default/xui/nl/floater_env_settings.xml
index d66c0b2205..3c207040d2 100644
--- a/indra/newview/skins/default/xui/nl/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/nl/floater_env_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="Omgeving editor">
+<floater name="Environment Editor Floater" title="OMGEVING EDITOR">
<text bottom="-42" name="EnvTimeText">
Tijd van de
dag
diff --git a/indra/newview/skins/default/xui/nl/floater_font_test.xml b/indra/newview/skins/default/xui/nl/floater_font_test.xml
index 8e8b07ee1a..31e53e7fba 100644
--- a/indra/newview/skins/default/xui/nl/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/nl/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Lettertypetest">
+<floater name="contents" title="LETTERTYPETEST">
<text name="linea">
Overschrijf test, zou hier moeten verschijnen als Times (vanuit default/xui/en-us).
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_gesture.xml b/indra/newview/skins/default/xui/nl/floater_gesture.xml
index d38972d5fe..4fa994c69e 100644
--- a/indra/newview/skins/default/xui/nl/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/nl/floater_gesture.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="Actieve gebaren">
+<floater name="gestures" title="ACTIEVE GEBAREN">
<text name="help_label">
Dubbelklik een gebaar om animaties en geluiden af te spelen
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_hud.xml b/indra/newview/skins/default/xui/nl/floater_hud.xml
index 9da732ff2f..8ef7de1b02 100644
--- a/indra/newview/skins/default/xui/nl/floater_hud.xml
+++ b/indra/newview/skins/default/xui/nl/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="Handleiding"/>
+<floater name="floater_hud" title="HANDLEIDING"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_inspect.xml b/indra/newview/skins/default/xui/nl/floater_inspect.xml
index 96c9d59f90..6a0885b57f 100644
--- a/indra/newview/skins/default/xui/nl/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/nl/floater_inspect.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="Objecten inspecteren">
+<floater name="inspect" title="OBJECTEN INSPECTEREN">
<scroll_list name="object_list" tool_tip="Selecteer een object van deze lijst om het in-wereld te markeren">
<column label="Objectnaam" name="object_name"/>
<column label="Eigenaar" name="owner_name"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory.xml b/indra/newview/skins/default/xui/nl/floater_inventory.xml
index 272fa3c899..a69039d811 100644
--- a/indra/newview/skins/default/xui/nl/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/nl/floater_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Inventaris">
+<floater name="Inventory" title="INVENTARIS">
<search_editor label="Typ hier om te zoeken" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Alle items" name="All Items"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml
index ccc39034f5..505e3cd719 100644
--- a/indra/newview/skins/default/xui/nl/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/nl/floater_joystick.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Joystick configuratie">
+<floater name="Joystick" title="JOYSTICK CONFIGURATIE">
<check_box name="enable_joystick" width="80" label="Joystick inschakelen:"/>
<text left="146" name="joystick_type" width="360"/>
<spinner label="X-as mapping" name="JoystickAxis1"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
index e8b1fb14bc..e3943c2470 100644
--- a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Lag meter">
+<floater name="floater_lagmeter" title="LAG METER">
<button label="" label_selected="" name="client_lagmeter" tool_tip="Client lag status"/>
<text name="client">
Client:
diff --git a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
index 556d151c8c..27b3ff834e 100644
--- a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL Wiki">
+<floater name="script ed float" title="LSL WIKI">
<check_box label="Volg cursor" name="lock_check"/>
<combo_box label="Vergrendelen" name="history_combo"/>
<button label="Terug" name="back_btn"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
index 1c7e070e4a..d0b25587b6 100644
--- a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Geheugenlek simulatie">
+<floater name="MemLeak" title="GEHEUGENLEK SIMULATIE">
<spinner label="Leksnelheid (bytes per frame):" name="leak_speed"/>
<spinner label="Max gelekt geheugen (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
index ca3b34c3a2..7a34be1bd7 100644
--- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="Negeer object op naam">
+<floater name="mute by name" title="NEGEER OBJECT OP NAAM">
<text name="message" bottom_delta="-40">
Negeer op naam heeft alleen invloed op object chat
en IM, niet op geluiden. U dient de naam van het object
diff --git a/indra/newview/skins/default/xui/nl/floater_my_friends.xml b/indra/newview/skins/default/xui/nl/floater_my_friends.xml
index ed81e6baf9..8d709d3c00 100644
--- a/indra/newview/skins/default/xui/nl/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/nl/floater_my_friends.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_my_friends" title="Contacten">
+<floater name="floater_my_friends" title="CONTACTEN">
<tab_container name="friends_and_groups">
<panel label="Vrienden" name="friends_panel"/>
<panel label="Groepen" name="groups_panel"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_openobject.xml b/indra/newview/skins/default/xui/nl/floater_openobject.xml
index 10b502be1c..832c63403d 100644
--- a/indra/newview/skins/default/xui/nl/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/nl/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="Object inhoud">
+<floater name="objectcontents" title="OBJECT INHOUD">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
index c1c9492286..f946c42678 100644
--- a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Standaard upload Permissies">
+<floater name="perm prefs" title="STANDAARD UPLOAD PERMISSIES">
<panel label="Permissies" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Delen met groep" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_post_process.xml b/indra/newview/skins/default/xui/nl/floater_post_process.xml
index 45fc211aeb..e627f81a70 100644
--- a/indra/newview/skins/default/xui/nl/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/nl/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="Nabewerkinginstellingen">
+<floater name="Post-Process Floater" title="NABEWERKINGINSTELLINGEN">
<tab_container name="Post-Process Tabs">
<panel label="Kleurfilter" name="wmiColorFilterPanel">
<check_box label="Inschakelen" name="wmiColorFilterToggle"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_postcard.xml b/indra/newview/skins/default/xui/nl/floater_postcard.xml
index a6d10f2244..c2d092fdd4 100644
--- a/indra/newview/skins/default/xui/nl/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/nl/floater_postcard.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="Email foto">
+<floater name="Postcard" title="EMAIL FOTO">
<text name="to_label">
Ontvanger e-mail:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_preferences.xml b/indra/newview/skins/default/xui/nl/floater_preferences.xml
index 25984ee65a..6fc8005fd2 100644
--- a/indra/newview/skins/default/xui/nl/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/nl/floater_preferences.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="Voorkeuren">
+<floater name="Preferences" title="VOORKEUREN">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
<button label="Toepassen" label_selected="Toepassen" name="Apply"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_region_info.xml b/indra/newview/skins/default/xui/nl/floater_region_info.xml
index 3d4386bc16..0a98da3b4e 100644
--- a/indra/newview/skins/default/xui/nl/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/nl/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="Regio/estate"/>
+<floater name="regioninfo" title="REGIO/ESTATE"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
index 012198d7b6..19b11ede0a 100644
--- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Misbruik rapporteren">
+<floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN">
<check_box label="Voeg schermafbeelding toe" name="screen_check"/>
<text name="reporter_title" width="110">
Rapporteur:
diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
index 306ad5d1a3..15e57f30d6 100644
--- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="script debug floater" title="Script waarschuwing/fout">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[Alle scripts]"/>
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_queue.xml b/indra/newview/skins/default/xui/nl/floater_script_queue.xml
index 38c227e53c..f79ad8faf3 100644
--- a/indra/newview/skins/default/xui/nl/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/nl/floater_script_queue.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="Voortgang opnieuw instellen">
+<floater name="queue" title="VOORTGANG OPNIEUW INSTELLEN">
<button label="Sluiten" label_selected="Sluiten" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_sell_land.xml b/indra/newview/skins/default/xui/nl/floater_sell_land.xml
index 3981f3ccc2..468a383cfc 100644
--- a/indra/newview/skins/default/xui/nl/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_sell_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="Verkoop land">
+<floater name="sell land" title="VERKOOP LAND">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="info_parcel_label">
diff --git a/indra/newview/skins/default/xui/nl/floater_snapshot.xml b/indra/newview/skins/default/xui/nl/floater_snapshot.xml
index c7174d42f3..251f3690da 100644
--- a/indra/newview/skins/default/xui/nl/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/nl/floater_snapshot.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Fotovoorbeeld">
+<floater name="Snapshot" title="FOTOVOORBEELD">
<text name="type_label">
Fotobestemming
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_statistics.xml b/indra/newview/skins/default/xui/nl/floater_statistics.xml
index b899c32a56..7684a73663 100644
--- a/indra/newview/skins/default/xui/nl/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/nl/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statistieken"/>
+<floater name="stats floater" title="STATISTIEKEN"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_telehub.xml b/indra/newview/skins/default/xui/nl/floater_telehub.xml
index 8fe8e06c03..7b745d967c 100644
--- a/indra/newview/skins/default/xui/nl/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/nl/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="Telehub" width="292">
+<floater name="telehub" title="TELEHUB" width="292">
<text name="status_text_connected">
Telehub verbonden met object [OBJECT]
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
index 13a68747c6..c8caa8caf4 100644
--- a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Kies: Textuur">
+<floater name="texture picker" title="KIES: TEXTUUR">
<string name="choose_picture">
Klik om een afbeelding te kiezen
</string>
diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml
index cb0c1ad89a..f79d3dbd6b 100644
--- a/indra/newview/skins/default/xui/nl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/nl/floater_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Bouwen" width="288">
+<floater name="toolbox floater" title="" short_title="BOUWEN" width="288">
<button label="" label_selected="" name="button focus" tool_tip="Focus"/>
<button label="" label_selected="" name="button move" tool_tip="Verplaats"/>
<button label="" label_selected="" name="button edit" tool_tip="Bewerk"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_top_objects.xml b/indra/newview/skins/default/xui/nl/floater_top_objects.xml
index cc252352eb..2bbb701df8 100644
--- a/indra/newview/skins/default/xui/nl/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/nl/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="laden…">
+<floater name="top_objects" title="LADEN…">
<text name="title_text">
Laden…
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_water.xml b/indra/newview/skins/default/xui/nl/floater_water.xml
index 2238008fd8..1fb1ca241b 100644
--- a/indra/newview/skins/default/xui/nl/floater_water.xml
+++ b/indra/newview/skins/default/xui/nl/floater_water.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="Geavanceerde water editor">
+<floater name="Water Floater" title="GEAVANCEERDE WATER EDITOR">
<combo_box bottom="-50" height="18" left_delta="116" name="WaterPresetsCombo" width="150" />
<text name="KeyFramePresetsText">
Watervoorinstellingen
diff --git a/indra/newview/skins/default/xui/nl/floater_world_map.xml b/indra/newview/skins/default/xui/nl/floater_world_map.xml
index e1eebaf92f..bc14f92126 100644
--- a/indra/newview/skins/default/xui/nl/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/nl/floater_world_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Wereldkaart">
+<floater name="worldmap" title="WERELDKAART">
<tab_container name="maptab">
<panel label="Objecten" name="objects_mapview"/>
<panel label="Terrein" name="terrain_mapview"/>
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
index 9a83eaea61..a282c267a1 100644
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ b/indra/newview/skins/default/xui/nl/notifications.xml
@@ -380,6 +380,9 @@ De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
U moet zowel de voornaam als de achternaam van uw avatar opgeven.
U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=nl-NL
+ </url>
<usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
</notification>
<notification name="AddClassified">
@@ -1131,7 +1134,7 @@ U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
[APP_NAME] installatie compleet.
Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar www.secondlife.com om een nieuw account aan te maken?
+Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
<usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
index 00f8c087de..172395e20a 100644
--- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Inwoner" />
- <string name="AcctTypeTrial"
- value="Proef" />
- <string name="AcctTypeCharterMember"
- value="Charter lid" />
- <string name="AcctTypeEmployee"
- value="Linden Lab werknemer" />
- <string name="PaymentInfoUsed"
- value="Betalingsinformatie gebruikt" />
- <string name="PaymentInfoOnFile"
- value="Betalingsinformatie aanwezig" />
- <string name="NoPaymentInfoOnFile"
- value="Geen betalingsinfo aanwezig" />
- <string name="AgeVerified"
- value="Leeftijd geverifieerd" />
- <string name="NotAgeVerified"
- value="Leeftijd niet geverifieerd" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=nl
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Antwoord bij Niet Storen:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="AcctTypeResident"
+ value="Inwoner" />
+ <string name="AcctTypeTrial"
+ value="Proef" />
+ <string name="AcctTypeCharterMember"
+ value="Charter lid" />
+ <string name="AcctTypeEmployee"
+ value="Linden Lab werknemer" />
+ <string name="PaymentInfoUsed"
+ value="Betalingsinformatie gebruikt" />
+ <string name="PaymentInfoOnFile"
+ value="Betalingsinformatie aanwezig" />
+ <string name="NoPaymentInfoOnFile"
+ value="Geen betalingsinfo aanwezig" />
+ <string name="AgeVerified"
+ value="Leeftijd geverifieerd" />
+ <string name="NotAgeVerified"
+ value="Leeftijd niet geverifieerd" />
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=nl
+ </string>
+ <panel name="scroll_content_panel">
+ <panel name="data_panel" >
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text">
+ [SECOND_LIFE]:
+ </text>
+ </panel>
+ </panel>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <text name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ <text name="text_box3">
+ Antwoord bij Niet Storen:
+ </text>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
index 5bfb9dd235..235e15e7fb 100644
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ b/indra/newview/skins/default/xui/nl/panel_login.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=nl-NL
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=nl-NL
+ </panel.string>
+<panel name="login_widgets">
<text name="first_name_text">
Voornaam:
</text>
@@ -35,3 +36,4 @@
[VERSION]
</text>
</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/role_actions.xml b/indra/newview/skins/default/xui/nl/role_actions.xml
new file mode 100644
index 0000000000..1f0a6e4235
--- /dev/null
+++ b/indra/newview/skins/default/xui/nl/role_actions.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Deze Mogelijkheden regelen het toevoegen en verwijderen van Groepsleden, en om aan te geven dat nieuwe Leden lid kunnen worden zonder uitnodiging." name="Membership">
+ <action description="Personen uitnodigen voor deze Groep" longdescription="Personen uitnodigen voor deze Groep door de 'Uitnodigen Nieuwe Leden...' knop in de leden &amp; Rollen tab &gt; Leden sub-tab." name="member invite"/>
+ <action description="Leden uit deze Groep zetten" longdescription="Leden uit deze Groep zetten door de 'Uit Groep Zetten' knop in de leden tab &amp; Rollen tab &gt; Leden sub-tab. Een Eigenaar kan iedereen uit de groep zetten behalve een andere Eigenaar. Als je geen Eigenaar bent, kan een Lid worden uitgezet als, en alleen als, het Lid deel uitmaakt van de Iedereen Rol, en NIET van andere Rollen. Om Leden uit Rollen te verwijderen, moet je de 'Leden uit Rollen Verwijderen' mogelijkheid hebben." name="member eject"/>
+ <action description="Selecteer 'Vrije Toegang' en wijzig 'Contibutie Bijdrage'" longdescription="Selecteer 'Vrije Toegang' zodat nieuwe Leden lid kunnen worden zonder uitnodiging, en wijzig 'Contributie Bijdrage' in de Groep Voorkeuren sectie van de Algemene tab." name="member options"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het toevoegen, verwijderen, en wijzigen van Groepsrollen, toevoegen en verwijderen van Leden in Rollen, en toewijzen van Mogelijkheden aan Rollen." name="Roles">
+ <action description="Creëren nieuwe Rollen" longdescription="Creëren nieuwe Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role create"/>
+ <action description="Verwijderen Rollen" longdescription="Verwijderen Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role delete"/>
+ <action description="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn" longdescription="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn. Dit kan worden gedaan onderaan de de Leden &amp; Rollen tab &gt; Rollen sub-tab na de selectie van een rol." name="role properties"/>
+ <action description="Toewijzen Leden aan Toewijzers Rollen" longdescription="Toewijzen Leden aan Rollen in de Toegewezen Rollen sectie van de Leden &amp; Rol tab &gt; Leden sub-tab. Een Lid met deze Mogelijkheid kan alleen Leden toevoegen aan een Rol waartoe men zelf al behoort." name="role assign member limited"/>
+ <action description="Toewijzen Leden aan Alle Rollen" longdescription="Toewijzen van Leden aan Alle Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role assign member"/>
+ <action description="Verwijderen Leden uit Rollen" longdescription="Verwijderen Leden uit Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. Eigenaars kunnen niet worcen verwijderd." name="role remove member"/>
+ <action description="Toewijzen en Verwijderen Mogelijkheden in Rollen" longdescription="Toewijzen en Verwijderen Mogelijkheden in Rollen in de Toegestane Mogelijkheden van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role change actions"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het wijzigen van de Groepsidentiteit, zoals het veranderen van publieke zichtbaarheid, charter en insigne." name="Group Identity">
+ <action description="Wijzigen Charter, Insigne, en 'Toon in zoeken'" longdescription="Wijzigen Charter, Insigne, en 'Toon in zoeken'. Dit kan worden gedaan in de Algemeen tab." name="group change identity"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het overdragen, wijzigen, en verkopen van land dat in bezit is van deze groep. Om naar het Over Land venster te gaan, rechts-klik de grond selecteer 'Over Land...', of klik op de perceel info in de menubalk." name="Parcel Management">
+ <action description="Land overdragen en land kopen voor groep" longdescription="Land overdragen en land kopen voor groep. Dit kan worden gedaan in Over Land &gt; Algemeen tab." name="land deed"/>
+ <action description="Land overdragen aan Govenor Linden" longdescription="Land overdragen aan Govenor Linden. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep laten vervallen in Over Land &gt; Algemeen tab, teruggeven in Linden eigendom zonder verkoop! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land release"/>
+ <action description="Activeer land te koop info" longdescription="Activeer land te koop info. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep verkopen in Over Land &gt; Algemeen tab als ze dat willen! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land set sale info"/>
+ <action description="Opdelen en samenvoegen van percelen" longdescription="Opdelen en samenvoegen van percelen. Dit kan worden gedaan door rechts klikken op de grond, 'Terrein Bewerken, en de muis te slepen naar het land om een selectie te maken. Om te verdelen, selecteer wat je wil splitsen en klik 'Opdelen...'. Om samen te voegen, selecteer twee of meer aaneengesloten percelen en klik 'Samenvoegen...'." name="land divide join"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het veranderen van de perceelnaam en publicatie instelling, zichtbaarheid in 'Tonen in zoeken', en landingspunt &amp; TP routering." name="Parcel Identity">
+ <action description="Selecteer 'Tonen in zoeken' en instellen categorie" longdescription="Selecteer 'Tonen in zoeken' en instellen van de categorie voor een perceel in Over Land &gt; Opties tab." name="land find places"/>
+ <action description="Veranderen perceel naam, omschrijving, en 'Tonen in zoeken' instellingen" longdescription="Veranderen perceel naam, omschrijving en 'Tonen in zoeken' instellingen. Dit kan worden gedaan in Overland &gt; Opties tab." name="land change identity"/>
+ <action description="Instellen landingsplaats en instellen teleport routering" longdescription="Op een perceel in groepseigendom, Leden in een Rol met die mogelijkheid kunnen een landingsplaats instellen om te bepalen waar inkomende teleports aankomen, en ook een teleport routering instelling voor meer controle. Dit kan worden gedaan in About Land &gt; Opties tab." name="land set landing point"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het aanpassen van perceel opties, zoals 'Maak Objecten', 'Bewerken Terrein', en muziek &amp; media instellingen." name="Parcel Settings">
+ <action description="Veranderen muziek &amp; media instellingen" longdescription="Veranderen streaming muziek en film instellingen in Over Land&gt; Media tab." name="land change media"/>
+ <action description="Instellen 'Bewerken Terrein'" longdescription="Instellen 'Bewerken Terrein'. *WAARSCHUWING* Over Land &gt; Opties tab &gt; Bewerken Terrein staat toe dat iedereen de vorm van het terrein kan aanpassen, en Linden planten kan plaatsen en verplaatsen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend. Bewerken terrein kan worden aangezet in Over Land&gt; Opties tab." name="land edit"/>
+ <action description="Instellen diversen Over Land &gt; Optie instellingen" longdescription="Instellen 'Veilig (geen letsel)', 'Vliegen' and andere Inwoners toestaan om: 'Objecten te maken', 'Terrein te bewerken', en 'Scripts uit te voeren' op land in groepseigendom in Over Land &gt; Opties tab." name="land options"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelend de toestemming voor leden om beperkingen te omzeilen op percelen in groepseigendom." name="Parcel Powers">
+ <action description="'Bewerken Terrein' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen terrein bewerken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow edit land"/>
+ <action description="'Vliegen' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen vliegen op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow fly"/>
+ <action description="'Maak Objecten' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen objecten maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow create"/>
+ <action description="'Maak Landmarkering' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen een landmarkering maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow landmark"/>
+ <action description="Toestaan 'Thuis hier Instellen' op land in groepseigendom" longdescription="Leden in een Rol met deze Mogelijkheid kunnen gebruik maken van Wereld menu &gt; Thuis hier Instellen op een perceel afgestaan aan deze groep." name="land allow set home"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het toestaan of beperken van toegang van percelen in groepseigendom, inclusief het bevriezen en verbannen van Inwoners." name="Parcel Access">
+ <action description="Beheren perceel Toegang lijsten" longdescription="Beheren perceel Toegang lijsten in Over Land &gt; Toegang tab." name="land manage allowed"/>
+ <action description="Beheren perceel Verbannen lijst" longdescription="Beheren perceel Verbannen lijst in Over Land &gt; Verbannen tab." name="land manage banned"/>
+ <action description="Veranderen perceel 'Verkoop toegangspassen...' instellingen" longdescription="Verandere perceel 'Verkoop toegangspassen...'instellingen" name="land manage passes"/>
+ <action description="Uitwerpen en bevriezen Inwoners op percelen" longdescription="Leden in een Rol met deze mogelijkheid kunnen een onwelkome Inwoners aanpakken op een perceel in groepseigendom door een rechter-klik op deze inwoner &gt; en 'Uitwerpen...'of 'Bevriezen...'te selecteren." name="land admin"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen de toestemming voor leden om objecten te retourneren en Linden planten te plaatsen en te verplaatsen. Dit is nuttig voor Leden om rommel op te ruimen en landschappen te maken, echter het moet ook met omzichtigheid worden gebruikt, omdat er geen herstelfunktie is voor retourneren objecten." name="Parcel Content">
+ <action description="Retourneren objecten in groepseigendom" longdescription="Retourneren van objecten die in eigendom zijn van de groep op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group owned"/>
+ <action description="Retourneren objecten toegewezen aan de groep" longdescriotion="Retourneren van objecten die aan de groep zijn toegewezen op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group set"/>
+ <action description="Retourneren objecten die niet van de groep zijn" longdescription="Retourneren objecten die niet van de groep zijn op percelen in groepeigendom in Over Land &gt; Objecten tab." name="land return non group"/>
+ <action description="Landschappen maken met Linden planten" longdescription="Landschappen maken om Linden bomen, planten en grassen te plaatsen en te verplaatsen. Deze opties zijn te vinden in de inventaris Library &gt; Objects folder of ze kunnen worden gemaakt via de Bouwen knop." name="land gardening"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen het afstaan, wijzigen, en verkopen van objecten in groepseigendom. Deze veranderingen worden gedaan in Bewerken Gereedschap &gt; Algemeen tab. Rechts-klik een object en selecteer Bewerken om de instellingen ervan te bekijken." name="Object Management">
+ <action description="Overdragen objecten aan groep" longdescription="Overdragen objecten aan groep in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object deed"/>
+ <action description="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom" longdescription="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object manipulate"/>
+ <action description="Te koop zetten van objecten in groepseigendom" longdescription="Te koop zetten van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object set sale"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen dat Leden groepsverplichtingen betalen en groepsdividenden ontvangen, en toegang beperken tot de financiele historie van de groep." name="Accounting">
+ <action description="Betalen groepsverplichtingen en ontvangen van groepsdividenden" longdescription="Leden in een Rol met deze mogelijkheid betalen groepsverplichtingen en ontvangen groepsdividenden automatisch. Dit betekent dat ze een deel ontvangen van de verkoop van land in groepseigendom die dagelijks worden verdeeld, maar ook dat ze bijdragen aan zaken zoals lijstbijdrage voor het perceel." name="accounting accountable"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Groepsberichten kunnen versturen, ontvangen en inzien." name="Notices">
+ <action description="Versturen Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten versturen in Groep Informatie &gt; Berichten tab." name="notices send"/>
+ <action description="Ontvangen Berichten en inzien van oude Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten ontvangen en oude Berichten inzien in Groep Informatie &gt; Berichten tab." name="notices receive"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Voorstellen kunnen maken, Voorstellen kunnen inzien, en het stemverloop kunnen bekijken." name="Proposals">
+ <action description="Maken Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Voorstellen maken waarop kan worden gestemd in Groep Informatie &gt; Voorstellen tab." name="proposal start"/>
+ <action description="Stemmen op Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen stemmen op Voorstellen in Groep Informatie &gt; Voorstellen tab." name="proposal vote"/>
+ </action_set>
+ <action_set description="Deze Mogelijkheden regelen de toegang (en de beperking ervan) tot groep chat sessies en groep voice chat." name="Chat">
+ <action description="Deelname aan Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep chat sessies, zowel voor tekst als voice." name="join group chat"/>
+ <action description="Deelname aan Groep Voice Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep voice chat sessies. OPMERKING: De Deelname Group Chat is vereist om toegang te krijgen to de voice chat sessie." name="join voice chat"/>
+ <action description="Modereren Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen toegang en deelname controleren in groep voice en tekst chat sessies." name="moderate group chat"/>
+ </action_set>
+</role_actions> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 49ebcd319c..0be5ec9e86 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string>
<string name="LoginInProgress">
Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index 0f100b9d83..29a5aca90d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -1,20 +1,60 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="O [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life zostało stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl i wielu innych.
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="O [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Buduj z [COMPILER] wersjÄ… [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Znajdujesz siÄ™ na pozycji [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ Procesor: [CPU]
+Pamięć: [MEMORY_MB] MB
+Wersja OS: [OS_VERSION]
+Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
+Karta Graficzna: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Sterownik Karty Graficznej: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Wersja OpenGL: [OPENGL_VERSION]
+
+Wersja libcurl: [LIBCURL_VERSION]
+Wersja Dekodera J2C: [J2C_VERSION]
+Wersja Sterownika Audio: [AUDIO_DRIVER_VERSION]
+Wersja Qt Webkit: [QT_WEBKIT_VERSION]
+Wersja Vivox: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (żadne)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Stracone Pakiety: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="Kopiuj do Schowka" name="copy_btn"/>
+ </panel>
+ <panel label="Podziękowania" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life zostało stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl i wielu innych.
Podziękowania dla następujących rezydentów za pomoc w pracy nad obecną wersją Second Life: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
I get by with a little help from my friends. --Richard Starkey
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licencje" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
@@ -34,10 +74,7 @@
Wszystkie prawa zastrzeżone. Szczegóły w pliku licenses.txt.
Programowanie dźwięku czatu: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Położenie: [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index 83d4b717a7..d456ea26b4 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="O Posiadłości">
+<floater name="floaterland" title="O POSIADÅOÅšCI">
<tab_container name="landtab">
<panel label="Ogólne" name="land_general_panel">
<text name="Name:">
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
index 0524b8ade3..0524b8ade3 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_auction.xml b/indra/newview/skins/default/xui/pl/floater_auction.xml
index 65a1bb85ea..37e35ed1e9 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_auction.xml
+++ b/indra/newview/skins/default/xui/pl/floater_auction.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="Rozpocznij Sprzedaż Posiadłości">
+<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI">
<check_box label="Zawierając żółte ogrodzenie" name="fence_check" />
<button label="Zdjęce" label_selected="Zdjęce" name="snapshot_btn" />
<button label="OK" label_selected="OK" name="ok_btn" />
diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
index cf4dcb91bf..8c09f7294c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Wybierz Rezydenta">
+<floater name="avatarpicker" title="WYBIERZ REZYDENTA">
<tab_container name="ResidentChooserTabs">
<panel label="Znajdź" name="SearchPanel">
<text name="InstructSearchResidentName">
diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
index b27c90b8f2..dce2330807 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="avatar_texture_debug" title="Tekstury Awatara">
+<floater name="avatar_texture_debug" title="TEKSTURY AWATARA">
<text name="baked_label">
Tekstury Renderowane
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml
index fd12d13595..6e7013f2d7 100644
--- a/indra/newview/skins/default/xui/pl/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Emitery">
+<floater name="beacons" title="EMITERY">
<panel name="beacons_panel">
<check_box label="Obiekty Dotykalne" name="touch_only"/>
<check_box label="Obiekty Skryptowane" name="scripted"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_build_options.xml b/indra/newview/skins/default/xui/pl/floater_build_options.xml
index 7cbc410614..f538be218c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_build_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="build options floater" title="Opcje Siatki">
+<floater name="build options floater" title="OPCJE SIATKI">
<spinner label="Jednostka Siatki (metry)" name="GridResolution" />
<spinner label="Rozmiary Siatki (metry)" name="GridDrawSize" />
<check_box label="Udostępnij Podjednostkowe Dopasowywanie" name="GridSubUnit" />
diff --git a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
index a99acdb238..f06615642e 100644
--- a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Hurtowa zmiana praw zawartości">
+<floater name="floaterbulkperms" title="HURTOWA ZMIANA PRAW ZAWARTOÅšCI">
<text name="applyto">
Rodzaj Zawartości
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml
index 365268dbd6..10f9d73284 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_bumps" title="Zderzenia, Popchnięcia, Uderzenia">
+<floater name="floater_bumps" title="ZDERZENIA, POPCHNIĘCIA, UDERZENIA">
<string name="none_detected">
Brak
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
index 395bcb4ea9..ebe1c9dfd8 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_buy_contents" title="Kup Zawartość">
+<floater name="floater_buy_contents" title="KUP ZAWARTOŚĆ">
<text name="contains_text">
[NAME] zawiera:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index a5c0a2498a..5e59482883 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="buy currency" title="Kup $L">
+<floater name="buy currency" title="KUP $L">
<text name="info_buying">
Kup L$:
</text>
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- L$ za [USD]US$
+ za [LOCALAMOUNT]
</text>
<text name="getting_data">
Otrzymywanie danych...
@@ -64,6 +64,6 @@ Proszę zwiększyć ilość.
<button label="Anuluj" name="cancel_btn" />
<button label="Kup" name="buy_btn" />
<string name="buy_currency">
- Kup [LINDENS]L$ za [USD]US$
+ Kup [LINDENS]L$ za [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
index ff371b38c0..648888828b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Buy Land">
+<floater name="buy land" title="BUY LAND">
<text name="region_name_label">
Region:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml
index b0868a46a2..bad7982228 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="contents" title="Kup kopiÄ™ obiektu">
+<floater name="contents" title="KUP KOPIĘ OBIEKTU">
<text name="contents_text">
i jej zawartość:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml
index 5957018144..5957018144 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_choose_group.xml b/indra/newview/skins/default/xui/pl/floater_choose_group.xml
index 789c40e48c..72b6617094 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/pl/floater_choose_group.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="groups" title="Grupy">
+<floater name="groups" title="GRUPY">
<text name="groupdesc">
Wybierz grupÄ™:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
index d6ffe1837a..904a2cc270 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="Wybór Koloru">
+<floater name="ColorPicker" title="WYBÓR KOLORU">
<text name="r_val_text">
Czerwony:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_critical.xml b/indra/newview/skins/default/xui/pl/floater_critical.xml
index 8221a4e1bd..8221a4e1bd 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_critical.xml
+++ b/indra/newview/skins/default/xui/pl/floater_critical.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml
index 64d9300621..0c01d15faf 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_customize.xml
+++ b/indra/newview/skins/default/xui/pl/floater_customize.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="WyglÄ…d">
+<floater name="floater customize" title="WYGLĄD">
<tab_container name="customize tab container">
<placeholder label="Części Ciała" name="body_parts_placeholder"/>
<panel label="Kształt" name="Shape">
diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
index ea8db99570..6671bb853e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Day Cycle Floater" title="Edytor Cyklu Dnia">
+<floater name="Day Cycle Floater" title="EDYTOR CYKLU DNIA">
<tab_container name="Day Cycle Tabs">
<panel label="Cykl Dnia" name="Day Cycle">
<button label="?" name="WLDayCycleHelp" />
diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml
index 0122aa819e..e79478731d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_device_settings.xml
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_device_settings"
- title="Ustawienia Urządzeń Komunikacji Głosowej" />
+ title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ" />
diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
index 3e0809b193..e197d94b27 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Environment Editor Floater" title="Edytor Åšrodowiska">
+<floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA">
<text name="EnvTimeText">
Czas
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_font_test.xml b/indra/newview/skins/default/xui/pl/floater_font_test.xml
index 586d2690b3..019cee3e1e 100644
--- a/indra/newview/skins/default/xui/pl/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/pl/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Czcionka Tekstu">
+<floater name="contents" title="CZCIONKA TEKSTU">
<text name="linea">
OverrideTest, powinno wyświetlać się jako Times. (From default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_gesture.xml b/indra/newview/skins/default/xui/pl/floater_gesture.xml
index a05408dfc5..4685eb6afe 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_gesture.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="Aktywne Gesty">
+<floater name="gestures" title="AKTYWNE GESTY">
<text name="help_label">
Kliknij podwójnie by aktywować głos i animację gestu.
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_god_tools.xml b/indra/newview/skins/default/xui/pl/floater_god_tools.xml
index df821f3b6d..a3ccffac03 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_god_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="Boskie Narzędzia">
+<floater name="godtools floater" title="BOSKIE NARZĘDZIA">
<tab_container name="GodTools Tabs">
<panel label="Grid" name="grid">
<button width="205" label="Usuń wszystkich użytkowników" label_selected="Usuń wszystkich użytkowników" name="Kick all users"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
index f1e6e5ea9e..39695a67b6 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Hardware Settings Floater" title="Ustawienia Sprzętowe">
+<floater name="Hardware Settings Floater" title="USTAWIENIA SPRZĘTOWE">
<text name="Filtering:">
Filtrowanie:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_hud.xml b/indra/newview/skins/default/xui/pl/floater_hud.xml
index 916473f063..ff2d702132 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_hud.xml
+++ b/indra/newview/skins/default/xui/pl/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="Samouczek" />
+<floater name="floater_hud" title="SAMOUCZEK" />
diff --git a/indra/newview/skins/default/xui/pl/floater_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml
index 67c9d13496..67c9d13496 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_im.xml
+++ b/indra/newview/skins/default/xui/pl/floater_im.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_image_preview.xml b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
index 27f898a66b..27f898a66b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml
index 1efdced527..c98e0541d8 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="inspect" title="Inspekcja Obiektów">
+<floater name="inspect" title="INSPEKCJA OBIEKTÓW">
<scroll_list name="object_list" tool_tip="">
<column label="Nazwa" name="object_name" />
<column label="Właściciel" name="owner_name" />
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory.xml b/indra/newview/skins/default/xui/pl/floater_inventory.xml
index 6df978de69..157be76c4d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Moja Szafa">
+<floater name="Inventory" title="MOJA SZAFA">
<search_editor label="Wyszukiwarka" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Wszystkie Obiekty" name="All Items"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
index c32d1eeabf..665172dd49 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="item properties" title="Właściwości Obiektów w Szafie">
+<floater name="item properties" title="WÅAÅšCIWOÅšCI OBIEKTÓW W SZAFIE">
<text name="LabelItemNameTitle">
Nazwa:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
index 2224c026ef..9204262304 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Inventory Finder" title="Nowe Obiekty">
+<floater name="Inventory Finder" title="NOWE OBIEKTY">
<check_box label="Animacje" name="check_animation" />
<check_box label="Wizytówki" name="check_calling_card" />
<check_box label="Ubrania" name="check_clothing" />
diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml
index 2ab92dfbb7..22ac458b85 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" width="590" title="Konfiguracja Joysticka">
+<floater name="Joystick" width="590" title="KONFIGURACJA JOYSTICKA">
<check_box name="enable_joystick" label="Aktywuj Joystick:"/>
<text left="130" name="joystick_type" width="360"/>
<spinner label="Kalibracja Osi X" left="20" width="170" label_width="130" name="JoystickAxis1"/>
@@ -116,4 +116,4 @@
<string name="NoDevice">
brak podłącznego urządzenia
</string>
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
index 949289594e..69d563bdba 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_lagmeter" title="Pomiar Lagów">
+<floater name="floater_lagmeter" title="POMIAR LAGÓW">
<button label="" label_selected="" name="client_lagmeter"
tool_tip="Status lagów klienta" />
<text name="client">
diff --git a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
index 29268f0e97..13e6a8b16d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Moja posiadłość">
+<floater name="land holdings floater" title="MOJA POSIADÅOŚĆ">
<scroll_list name="parcel list">
<column label="Nazwa posiadłości" name="name"/>
<column label="Region" name="location"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
index 94efd7afcb..8120ff8c77 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="Skrypt: Nowy Skrypt">
+<floater name="script ed float" title="SKRYPT: NOWY SKRYPT">
<button label="Zresetuj" label_selected="Zresetuj" name="Reset" />
<check_box label="Włącz" name="running" />
<check_box label="Mono" name="mono" />
diff --git a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
index a0fa00dffe..5601aa4464 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL Wiki">
+<floater name="script ed float" title="LSL WIKI">
<check_box label="Idź za kursorem" name="lock_check" />
<combo_box label="Zablokuj" name="history_combo" />
<button label="Wróć" name="back_btn" />
diff --git a/indra/newview/skins/default/xui/pl/floater_media_browser.xml b/indra/newview/skins/default/xui/pl/floater_media_browser.xml
index 2fb4287d90..74210c75e5 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pl/floater_media_browser.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Przeglądarka Mediów">
+<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Wróć" name="back" />
diff --git a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
index fe977e96c5..88a878af72 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="Symulacja Przecieków Alokacji Pamięci">
+<floater name="MemLeak" title="SYMULACJA PRZECIEKÓW ALOKACJI PAMIĘCI">
<spinner label="Prędkość Przecieków (byty na klatkę):" name="leak_speed" />
<spinner label="Max Przecieki (MB):" name="max_leak" />
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/pl/floater_moveview.xml b/indra/newview/skins/default/xui/pl/floater_moveview.xml
index e28cfd589d..e28cfd589d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_moveview.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_mute_object.xml b/indra/newview/skins/default/xui/pl/floater_mute_object.xml
index 310810db76..8055617371 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_mute_object.xml
@@ -1,13 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="mute by name" title="Wycisz Obiekt Według Nazwy" height="160" min_height="160" >
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="160" min_height="160" name="mute by name" title="ZABLOKUJ OBIEKT WEDÅUG NAZWY">
<text name="message">
- Wyciszenie obiektu jest skuteczne jedynie na czacie oraz w
-wiadomościach IM. Nie obejmuje natomiast dźwięków.
-By wyciszyć obiekt musisz wpisać dokładnie jego nazwę.
+ Zablokuj obiekt:
</text>
- <line_editor name="object_name" bottom_delta="-60">
+ <line_editor bottom_delta="-60" name="object_name">
Nazwa Obiektu
</line_editor>
- <button label="Ok" name="OK" />
- <button label="Anuluj" name="Cancel" />
+ <text name="note">
+ * Zablokuj jedynie tekst obiektu, bez dźwięku
+ </text>
+ <button label="Ok" name="OK"/>
+ <button label="Anuluj" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml
index cc5f1f2a01..0bcf6ba4d5 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/pl/floater_my_friends.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_my_friends" title="Kontakty">
+<floater name="floater_my_friends" title="KONTAKTY">
<tab_container name="friends_and_groups">
<panel label="Znajomi" name="friends_panel" />
<panel label="Grupy" name="groups_panel" />
diff --git a/indra/newview/skins/default/xui/pl/floater_openobject.xml b/indra/newview/skins/default/xui/pl/floater_openobject.xml
index 0470f4d6dc..fbbed0f11d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/pl/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="objectcontents" title="Zawartość Obiektu">
+<floater name="objectcontents" title="ZAWARTOŚĆ OBIEKTU">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_pay.xml b/indra/newview/skins/default/xui/pl/floater_pay.xml
index dfb1b6616c..dfb1b6616c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pl/floater_pay.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_pay_object.xml b/indra/newview/skins/default/xui/pl/floater_pay_object.xml
index 376f517aaa..376f517aaa 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_pay_object.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
index dd7cbe1f79..834552e2b0 100644
--- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Prawa Domyślne">
+<floater name="perm prefs" title="PRAWA DOMYÅšLNE">
<panel label="Prawa" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Udostępnij grupie" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml
index 0081d1d3a7..6bd91f97b1 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/pl/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Post-Process Floater" title="Ustawienia Przetwarzania Końcowego">
+<floater name="Post-Process Floater" title="USTAWIENIA PRZETWARZANIA KOŃCOWEGO">
<tab_container name="Post-Process Tabs">
<panel label="Kolor Filtru" name="wmiColorFilterPanel">
<check_box label="Udostępnij" name="wmiColorFilterToggle" />
diff --git a/indra/newview/skins/default/xui/pl/floater_postcard.xml b/indra/newview/skins/default/xui/pl/floater_postcard.xml
index e5bdaf2ba9..8f4018924d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/pl/floater_postcard.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="Wyślij Pocztówkę">
+<floater name="Postcard" title="WYŚLIJ POCZTÓWKĘ">
<text name="to_label">
Email Odbiorcy:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml
index 380738425e..2be663283f 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Preferences" title="Ustawienia">
+<floater name="Preferences" title="USTAWIENIA">
<button label="OK" label_selected="OK" name="OK" />
<button label="Anuluj" label_selected="Anuluj" name="Cancel" />
<button label="Zastosuj" label_selected="Zastosuj" name="Apply" />
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
index 7139c470a4..7139c470a4 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
index cc7d276117..eae9ba2690 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="Reklama" />
+<floater name="classified_preview" title="REKLAMA" />
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml
index 75e17f6fa2..9fc0ff4da6 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_event.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="Informacje o Imprezie" />
+<floater name="event_preview" title="INFORMACJE O IMPREZIE" />
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
index 1c7a3f6631..1c7a3f6631 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
index 0b3b9063c4..b9f80490ab 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview notecard" title="Nota:">
+<floater name="preview notecard" title="NOTA:">
<button label="Zapisz" label_selected="Zapisz" name="Save" />
<text name="desc txt">
Opis:
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
index 656b9bec38..656b9bec38 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
index 8bcd800411..8bcd800411 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_region_info.xml b/indra/newview/skins/default/xui/pl/floater_region_info.xml
index 6e632fd9c3..ca3c1391db 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/pl/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="Region/MajÄ…tek" />
+<floater name="regioninfo" title="REGION/MAJĄTEK" />
diff --git a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
index 853c669ade..18ce1b230f 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Raport o Nadużyciu">
- <texture_picker label="" name="screenshot"/>
- <check_box label="Załącz zdjęcie ekranu" name="screen_check"/>
+<floater name="floater_report_abuse" title="RAPORT O NADUŻYCIU">
+ <floater.string name="Screenshot">
+ Zdjęcie Ekranu
+ </floater.string>
+ <check_box label="Załącz zdjęcie do raportu" name="screen_check"/>
<text name="reporter_title">
Reporter:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Region:
@@ -21,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Kliknij na przycisk, a później na obiekt:
+ Wybierz ten przycisk a następnie obiekt, który zgłaszasz do raportu:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Wybór obiektu - wybierz obiekt, którego dotyczy raport"/>
<text name="object_name_label">
- Nazwa:
+ Nazwa Obiektu:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -34,48 +36,48 @@
Właściciel:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Wybór kategorii - wybierz kategorię, której dotyczy raport">
- <combo_box.item name="Select_category" label="Wybierz KategoriÄ™:"/>
- <combo_box.item name="Age__Age_play" label="Wiek &gt; Udawanie Nieletniej Osoby"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Wiek &gt; Dorosły Rezydent w Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Wiek &gt; Nieletni Rezydent poza Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Napaść &gt; Strefa Militarna / Niebezpieczny Obszar"/>
- <combo_box.item name="Assault__Safe_area" label="Napaść &gt; Bezpieczny Obszar"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Napaść &gt; Obszar do Testowania Broni"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel &gt; Niedostarczenie Produktu lub Usługi"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Naruszenie Prywatności &gt; Dane Osobiste"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Ujawnienie &gt; Monitorowanie Czatu"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Ujawnienie &gt; Dane z Second Life / Czatu / IM"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Zakłócanie Spokoju &gt; Nieuczciwe Używanie Zasobów Regionu"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Zakłócanie Spokoju &gt; Przesadnie Skryptowane Obiekty"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Zakłócanie Spokoju &gt; Śmiecenie Obiektami"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Zakłócanie Spokoju &gt; Ciągły Spam"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Zakłócanie Spokoju &gt; Nieporządany Spam Reklamowy"/>
- <combo_box.item name="Fraud__L$" label="Oszustwo &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Oszustwo &gt; Posiadłości"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Oszustwo &gt; Piramidy albo Listy ÅaÅ„cuchowe"/>
- <combo_box.item name="Fraud__US$" label="Oszustwo &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Prześladowanie &gt; Farmy Reklamowe / Wizualny Spam"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Prześladowanie &gt; Zniesławianie Jedostek lub Grup"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Prześladowanie &gt; Ograniczanie Ruchu"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Prześladowanie &gt; Molestowanie Seksualne"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="PrzeÅ›ladowanie &gt; Namawianie/ZachÄ™canie Innych do Åamania Warunków Umowy (ToS)"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Prześladowanie &gt; Znieważanie Słowne"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Nieprzyzwoitość &gt; Obraźliwa Treść lub Postępowanie"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Nieprzyzwoitość &gt; Niestosowne Imię Awatara"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;PG&apos;"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;Mature&apos;"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Naruszenie Własności Intelektualnej &gt; Usunięcie Treści"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Naruszenie Własności Intelektualnej &gt; CopyBot albo Nadużycie Przywilejów"/>
- <combo_box.item name="Intolerance" label="Nietolerancja"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Posiadłości &gt; Nadużywanie Piaskownicy"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Posiadłości &gt; Naruszenie &gt; Obiekty/Tekstury"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Posiadłości &gt; Naruszenie &gt; Cząsteczki"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Posiadłości &gt; Naruszenie &gt; Drzewa/Rośliny"/>
- <combo_box.item name="Wagering_gambling" label="Zakłady/Hazard"/>
- <combo_box.item name="Other" label="Inne"/>
+ <combo_box.item label="Wybierz KategoriÄ™:" name="Select_category"/>
+ <combo_box.item label="Wiek &gt; Udawanie Nieletniej Osoby" name="Age__Age_play"/>
+ <combo_box.item label="Wiek &gt; Dorosły Rezydent w Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Wiek &gt; Nieletni Rezydent poza Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Napaść &gt; Strefa Militarna / Niebezpieczny Obszar" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Napaść &gt; Bezpieczny Obszar" name="Assault__Safe_area"/>
+ <combo_box.item label="Napaść &gt; Obszar do Testowania Broni" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Handel &gt; Niedostarczenie Produktu lub Usługi" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Naruszenie Prywatności &gt; Dane Osobiste" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Ujawnienie &gt; Monitorowanie Czatu" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Ujawnienie &gt; Dane z Second Life / Czatu / IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Zakłócanie Spokoju &gt; Nieuczciwe Używanie Zasobów Regionu" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Zakłócanie Spokoju &gt; Przesadnie Skryptowane Obiekty" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Zakłócanie Spokoju &gt; Śmiecenie Obiektami" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Zakłócanie Spokoju &gt; Ciągły Spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Zakłócanie Spokoju &gt; Nieporządany Spam Reklamowy" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Oszustwo &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Oszustwo &gt; Posiadłości" name="Fraud__Land"/>
+ <combo_box.item label="Oszustwo &gt; Piramidy albo Listy ÅaÅ„cuchowe" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Oszustwo &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Prześladowanie &gt; Farmy Reklamowe / Wizualny Spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Prześladowanie &gt; Zniesławianie Jedostek lub Grup" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Prześladowanie &gt; Ograniczanie Ruchu" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Prześladowanie &gt; Molestowanie Seksualne" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="PrzeÅ›ladowanie &gt; Namawianie/ZachÄ™canie Innych do Åamania Warunków Umowy (ToS)" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Prześladowanie &gt; Znieważanie Słowne" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa Treść lub Postępowanie" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Niestosowne Imię Awatara" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Naruszenie Własności Intelektualnej &gt; Usunięcie Treści" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Naruszenie Własności Intelektualnej &gt; CopyBot albo Nadużycie Przywilejów" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Nietolerancja" name="Intolerance"/>
+ <combo_box.item label="Posiadłości &gt; Nadużywanie Piaskownicy" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Obiekty/Tekstury" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Cząsteczki" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Drzewa/Rośliny" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Zakłady/Hazard" name="Wagering_gambling"/>
+ <combo_box.item label="Inne" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Dane osobowe:
@@ -94,13 +96,12 @@
Szczegóły:
</text>
<text name="bug_aviso">
- Podaj datę, miejsce, kategorię nadużycia, fragmenty
-czatu/IM, dane obiektów.
+ Podaj jak najwięcej możliwych szczegółów dotyczących nadużycia
</text>
<text_editor name="details_edit"/>
<text name="incomplete_title">
- Pamiętaj: Niedokończone raporty nie będą rozpatrywane!
+ * Pamiętaj: Niedokończone raporty nie będą rozpatrywane
</text>
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
<button label="Wyślij" label_selected="Wyślij" name="send_btn"/>
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug.xml b/indra/newview/skins/default/xui/pl/floater_script_debug.xml
index b41add8246..714a600262 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater name="script debug floater" title="Ostrzeżenie/Błąd Skryptu">
<tab_container name="Preview Tabs">
- <floater label="Skrypt" name="all_scripts" title="[All scripts]" />
+ <floater label="Skrypt" name="all_scripts" title="[ALL SCRIPTS]" />
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_preview.xml b/indra/newview/skins/default/xui/pl/floater_script_preview.xml
index ca3fde33e7..e3e72e15a3 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="Skrypt: Skrypt Obrotu">
+<floater name="preview lsl text" title="SKRYPT: SKRYPT OBROTU">
<text name="desc txt">
Opis:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_queue.xml b/indra/newview/skins/default/xui/pl/floater_script_queue.xml
index 70d4669a07..7655f5fcac 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_queue.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="queue" title="Zresetuj PracÄ™ w Toku">
+<floater name="queue" title="ZRESETUJ PRACĘ W TOKU">
<button label="Zamknij" label_selected="Zamknij" name="close" />
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_search.xml b/indra/newview/skins/default/xui/pl/floater_script_search.xml
index 50a9de1500..255ab4264c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script search" title="Szukaj Skryptu">
+<floater name="script search" title="SZUKAJ SKRYPTU">
<check_box label="CapsLoock Nieaktywny" name="case_text" />
<button label="Szukaj" label_selected="Szukaj" name="search_btn" />
<button label="Zamień" label_selected="Zamień" name="replace_btn" />
diff --git a/indra/newview/skins/default/xui/pl/floater_select_key.xml b/indra/newview/skins/default/xui/pl/floater_select_key.xml
index 194a6da1bd..194a6da1bd 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/pl/floater_select_key.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
index 579dcd6745..a306ec2c34 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="sell land" title="Sell Land">
+<floater name="sell land" title="SELL LAND">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="info_parcel_label">
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index 99fa444a1b..f87e2edecc 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="Ustawienia Usuwania Błędów">
+<floater name="settings_debug" title="USTAWIENIA USUWANIA BÅĘDÓW">
<combo_box name="boolean_combo">
<combo_box.item name="TRUE" label="PRAWDA" />
<combo_box.item name="FALSE" label="NIEPRAWDA" />
diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
index 4945cf6413..c807087170 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Wygląd Zdjęcia">
+<floater name="Snapshot" title="WYGLĄD ZDJĘCIA">
<text name="type_label">
Lokacja zapisu
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
index 2461aebbcf..0826508fd6 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Sound Preview" title="dźwięk.wav">
+<floater name="Sound Preview" title="DŹWIĘK.WAV">
<text name="name_label">
Opis:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_statistics.xml b/indra/newview/skins/default/xui/pl/floater_statistics.xml
index 933801bbda..b7025e484d 100644
--- a/indra/newview/skins/default/xui/pl/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/pl/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statystyki"/>
+<floater name="stats floater" title="STATYSTYKI"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_stats.xml b/indra/newview/skins/default/xui/pl/floater_stats.xml
new file mode 100644
index 0000000000..acd3df0585
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATYSTYKI">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Podstawowe" name="basic">
+ <stat_bar label="Ilość Obrazów/Sec (FPS)" name="fps"/>
+ <stat_bar label="Przepustowość" name="bandwidth"/>
+ <stat_bar label="Stracone Pakiety" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Zaawansowane" name="advanced">
+ <stat_view label="Renderuj" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="Wszystkie Obiekty" name="objs"/>
+ <stat_bar label="Nowe Obiekty" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Tekstura" name="texture">
+ <stat_bar label="Suma" name="numimagesstat"/>
+ <stat_bar label="Suma Raw" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Sformatowane Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Sieć" name="network">
+ <stat_bar label="Pakiety Wewnętrzne" name="packetsinstat"/>
+ <stat_bar label="Pakiety Zewnętrzne" name="packetsoutstat"/>
+ <stat_bar label="Obiekty" name="objectkbitstat"/>
+ <stat_bar label="Tesktura" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Podkład" name="layerskbitstat"/>
+ <stat_bar label="Aktualna Ilość Wewnętrzna" name="actualinkbitstat"/>
+ <stat_bar label="Aktualna Ilość Zewnętrzna" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Symulator" name="sim">
+ <stat_bar label="Czas Rozszerzenia" name="simtimedilation"/>
+ <stat_bar label="Ilość Obrazów/Sec na Symulatorze (Sim FPS)" name="simfps"/>
+ <stat_bar label="Fizyka Obrazów/Sec" name="simphysicsfps"/>
+ <stat_view label="Szczegóły Fizyki" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Niskie LOD Obiektów" name="physicslodtasks"/>
+ <stat_bar label="Alokacja Pamięci" name="physicsmemoryallocated"/>
+ <stat_bar label="Aktualizacja Agentów/Sec" name="simagentups"/>
+ <stat_bar label="Główni Agenci" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Obiekty" name="simobjects"/>
+ <stat_bar label="Aktywne Obiekty" name="simactiveobjects"/>
+ <stat_bar label="Aktywne Skrypty" name="simactivescripts"/>
+ <stat_bar label="Wydarzenie Skryptowe" name="simscripteps"/>
+ <stat_bar label="Pakiety Wewnętrzne" name="siminpps"/>
+ <stat_bar label="Pakiety Zewnętrzne" name="simoutpps"/>
+ <stat_bar label="Oczekiwane na Pobranie" name="simpendingdownloads"/>
+ <stat_bar label="Oczekiwane na Załadowanie" name="simpendinguploads"/>
+ <stat_bar label="Wszystkie Niepotwierdzone Bity" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Czas (ms)" name="simperf">
+ <stat_bar label="Całkowity Czas Obrazu" name="simframemsec"/>
+ <stat_bar label="Czas Sieciowy" name="simnetmsec"/>
+ <stat_bar label="Czas Fizyki" name="simsimphysicsmsec"/>
+ <stat_bar label="Czas Symulatora" name="simsimothermsec"/>
+ <stat_bar label="Czas Agenta" name="simagentmsec"/>
+ <stat_bar label="Czas Obrazu" name="simimagesmsec"/>
+ <stat_bar label="Czas Skryptu" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_telehub.xml b/indra/newview/skins/default/xui/pl/floater_telehub.xml
index 917ab95ecc..9f564452a9 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/pl/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="telehub" title="Obsługa Teleportera" min_height="300" height="300" >
+<floater name="telehub" title="OBSÅUGA TELEPORTERA" min_height="300" height="300" >
<text name="status_text_connected" width="250">
Teleporter połączony z obiektem [OBJECT]
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index 6d4df12e4b..48366e2b64 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Wybór Tekstury">
+<floater name="texture picker" title="WYBÓR TEKSTURY">
<string name="choose_picture">
Kliknij by wybrać obraz
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml
index c9e7a7e9eb..e898c283c5 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Buduj">
+<floater name="toolbox floater" title="" short_title="BUDUJ">
<button label="" label_selected="" name="button focus" tool_tip="Zbliżenie"/>
<button label="" label_selected="" name="button move" tool_tip="Przesunięcie"/>
<button label="" label_selected="" name="button edit" tool_tip="Edycja"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_top_objects.xml b/indra/newview/skins/default/xui/pl/floater_top_objects.xml
index 44d838035d..e7299b0abb 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pl/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="Åadowanie...">
+<floater name="top_objects" title="ÅADOWANIE...">
<text name="title_text">
Åadowanie...
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index b9a146df22..b9a146df22 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_url_entry.xml b/indra/newview/skins/default/xui/pl/floater_url_entry.xml
index fc170d8d1b..fc170d8d1b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/pl/floater_url_entry.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml
index a22b5809dc..7333633c1d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_water.xml
+++ b/indra/newview/skins/default/xui/pl/floater_water.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Water Floater" title="Zaawansowany Edytor Wody">
+<floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY">
<text name="KeyFramePresetsText">
Ustawienia Wody:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
index 2d4582392c..2d4582392c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
index 94c20c06f7..86ef9300da 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="Zaawansowany Edytor Nieba">
+<floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA">
<text name="KeyFramePresetsText">
Ustawienia Nieba:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_world_map.xml b/indra/newview/skins/default/xui/pl/floater_world_map.xml
index 65f1c8ae59..36e3b0651b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/pl/floater_world_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Mapa Åšwiata">
+<floater name="worldmap" title="MAPA ÅšWIATA">
<tab_container name="maptab">
<panel label="Obiekty" name="objects_mapview"/>
<panel label="Teren" name="terrain_mapview"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_other.xml b/indra/newview/skins/default/xui/pl/menu_attachment_other.xml
new file mode 100644
index 0000000000..4872956cc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Zobacz Profil" name="Profile..."/>
+ <menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="ZaproÅ› do Grupy" name="Invite..."/>
+ <menu_item_call label="Zablokuj" name="Avatar Mute"/>
+ <menu_item_call label="Raport" name="abuse"/>
+ <menu_item_call label="Unieruchom" name="Freeze..."/>
+ <menu_item_call label="Wyrzuć" name="Eject..."/>
+ <menu_item_call label="Debugowanie" name="Debug..."/>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+ <menu_item_call label="Sprawdź" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
new file mode 100644
index 0000000000..1107a5d9d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Dotnij" name="Attachment Object Touch"/>
+ <menu_item_call label="Edytuj" name="Edit..."/>
+ <menu_item_call label="Odłącz" name="Detach"/>
+ <menu_item_call label="Opuść" name="Drop"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <menu_item_call label="Mój Wygląd" name="Appearance..."/>
+ <menu_item_call label="Moi Znajomi" name="Friends..."/>
+ <menu_item_call label="Moje Grupy" name="Groups..."/>
+ <menu_item_call label="Mój Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_icon.xml b/indra/newview/skins/default/xui/pl/menu_avatar_icon.xml
new file mode 100644
index 0000000000..c9ad275a26
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profil" name="Show Profile"/>
+ <menu_item_call label="Czat/IM..." name="Send IM"/>
+ <menu_item_call label="Dodaj Znajomość..." name="Add Friend"/>
+ <menu_item_call label="Usuń..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_other.xml b/indra/newview/skins/default/xui/pl/menu_avatar_other.xml
new file mode 100644
index 0000000000..832c2f9c96
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Zobacz Profil" name="Profile..."/>
+ <menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="ZaproÅ› do Grupy" name="Invite..."/>
+ <menu_item_call label="Zablokuj" name="Avatar Mute"/>
+ <menu_item_call label="Raport" name="abuse"/>
+ <menu_item_call label="Unieruchom" name="Freeze..."/>
+ <menu_item_call label="Wyrzuć" name="Eject..."/>
+ <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
new file mode 100644
index 0000000000..427c0d464b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <context_menu label="Zdejmij &gt;" name="Take Off &gt;">
+ <context_menu label="Ubranie &gt;" name="Clothes &gt;">
+ <menu_item_call label="KoszulkÄ™" name="Shirt"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Spódnicę" name="Skirt"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Skarpetki" name="Socks"/>
+ <menu_item_call label="KurtkÄ™" name="Jacket"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
+ <menu_item_call label="BieliznÄ™" name="Self Underpants"/>
+ <menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Ubranie Przezroczyste" name="Self Alpha"/>
+ <menu_item_call label="Wszystko" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD &gt;" name="Object Detach HUD"/>
+ <context_menu label="Odłącz &gt;" name="Object Detach"/>
+ <menu_item_call label="Odłącz Wszystko" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Mój Wygląd" name="Appearance..."/>
+ <menu_item_call label="Moi Znajomi" name="Friends..."/>
+ <menu_item_call label="Moje Grupy" name="Groups..."/>
+ <menu_item_call label="Mój Profil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
new file mode 100644
index 0000000000..818dfc08ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Przycisk Gesturek" name="ShowGestureButton"/>
+ <menu_item_check label="Przycisk Ruchu" name="ShowMoveButton"/>
+ <menu_item_check label="Przycisk Widoku" name="ShowCameraButton"/>
+ <menu_item_check label="Przycisk Zdjęć" name="ShowSnapshotButton"/>
+ <menu_item_call label="Wytnij" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Usuń" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Zaznacz Wszystko" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_favorites.xml b/indra/newview/skins/default/xui/pl/menu_favorites.xml
new file mode 100644
index 0000000000..0a0b54a548
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportuj" name="Teleport To Landmark"/>
+ <menu_item_call label="Zobacz/Edytuj Ulubione Miejsce" name="Landmark Open"/>
+ <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/>
+ <menu_item_call label="Pokaż na Mapie" name="Show On Map"/>
+ <menu_item_call label="Kopiuj" name="Landmark Copy"/>
+ <menu_item_call label="Wklej" name="Landmark Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_gesture_gear.xml b/indra/newview/skins/default/xui/pl/menu_gesture_gear.xml
new file mode 100644
index 0000000000..a72dec22fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Dodaj/Usuń z Ulubionych" name="activate"/>
+ <menu_item_call label="Kopiuj" name="copy_gesture"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Kopiuj UUID" name="copy_uuid"/>
+ <menu_item_call label="Zapisz do obecnego zestawu ubrania" name="save_to_outfit"/>
+ <menu_item_call label="Edytuj" name="edit_gesture"/>
+ <menu_item_call label="Sprawdź" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_group_plus.xml b/indra/newview/skins/default/xui/pl/menu_group_plus.xml
new file mode 100644
index 0000000000..9d3859081e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Dołącz do Grupy..." name="item_join"/>
+ <menu_item_call label="Nowa Grupa..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
new file mode 100644
index 0000000000..1c2687338d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Pokaż Pasek Nawigacji" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Pokaż Pasek Ulubionych" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..925272d5ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..dc232c096d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="O Grupie" name="Show Profile"/>
+ <menu_item_call label="Pokaż Sesję" name="Chat"/>
+ <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..df991cbc36
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Zobacz Profil" name="Show Profile"/>
+ <menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="Pokaż Sesję" name="Send IM"/>
+ <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..22d81cb823
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Zobacz Profil" name="view_profile"/>
+ <menu_item_call label="Dodaj Znajomość" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Zadzwoń" name="call"/>
+ <menu_item_call label="Teleportuj" name="teleport"/>
+ <menu_item_call label="ZaproÅ› do Grupy" name="invite_to_group"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Raport" name="report"/>
+ <menu_item_call label="Unieruchom" name="freeze"/>
+ <menu_item_call label="Wyrzuć" name="eject"/>
+ <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Znajdź na Mapie" name="find_on_map"/>
+ <menu_item_call label="Przybliż" name="zoom_in"/>
+ <menu_item_call label="Zapłać" name="pay"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..988c31a6e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Dotknij" name="touch"/>
+ <menu_item_call label="Usiądź" name="sit"/>
+ <menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Kup" name="buy"/>
+ <menu_item_call label="Weź" name="take"/>
+ <menu_item_call label="Weź Kopię" name="take_copy"/>
+ <menu_item_call label="Otwórz" name="open"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+ <menu_item_call label="Ubierz" name="wear"/>
+ <menu_item_call label="Raport" name="report"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Przybliż" name="zoom_in"/>
+ <menu_item_call label="Usuń" name="remove"/>
+ <menu_item_call label="Więcej Informacji" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..ee2f202ee9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Wstań" name="stand_up"/>
+ <menu_item_call label="Mój Wygląd" name="my_appearance"/>
+ <menu_item_call label="Mój Profil" name="my_profile"/>
+ <menu_item_call label="Moi Znajomi" name="my_friends"/>
+ <menu_item_call label="Moje Grupy" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index 7f89f78324..75c84c275d 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Nowy Skrypt" name="New Script"/>
<menu_item_call label="Nowa Nota" name="New Note"/>
<menu_item_call label="Nowy Gest" name="New Gesture"/>
- <menu name="New Clothes">
+ <menu label="Nowe Ubranie" name="New Clothes">
<menu_item_call label="Nowa Koszulka" name="New Shirt"/>
<menu_item_call label="Nowe Spodnie" name="New Pants"/>
<menu_item_call label="Nowe Buty" name="New Shoes"/>
@@ -22,31 +22,47 @@
<menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
<menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
<menu_item_call label="Nowa Bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowa Maska Przezroczysta" name="New Alpha Mask"/>
+ <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts">
+ <menu label="Nowa Część Ciała" name="New Body Parts">
<menu_item_call label="Nowy Kształt" name="New Shape"/>
<menu_item_call label="Nowa Skórka" name="New Skin"/>
<menu_item_call label="Nowe Włosy" name="New Hair"/>
<menu_item_call label="Nowe Oczy" name="New Eyes"/>
</menu>
+ <menu label="Zmień Czcionkę" name="Change Type">
+ <menu_item_call label="Domyślna" name="Default"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Kurtka" name="Jacket"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Kształt" name="Shape"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Koszulka" name="Shirt"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Bielizna" name="Underpants"/>
+ <menu_item_call label="Podkoszulek" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teleportuj" name="Landmark Open"/>
<menu_item_call label="Otwórz" name="Animation Open"/>
<menu_item_call label="Otwórz" name="Sound Open"/>
<menu_item_call label="Usuń Obiekt" name="Purge Item"/>
<menu_item_call label="Przywróć Obiekt" name="Restore Item"/>
+ <menu_item_call label="Otwórz Link" name="Goto Link"/>
<menu_item_call label="Otwórz" name="Open"/>
<menu_item_call label="Właściwości" name="Properties"/>
<menu_item_call label="Zmień Nazwę" name="Rename"/>
<menu_item_call label="Kopiuj Dane UUID" name="Copy Asset UUID"/>
<menu_item_call label="Kopiuj" name="Copy"/>
<menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Wklej jako Link" name="Paste As Link"/>
<menu_item_call label="Usuń" name="Delete"/>
<menu_item_call label="Zdejmij Obiekt" name="Take Off Items"/>
<menu_item_call label="Dodaj do Stroju" name="Add To Outfit"/>
<menu_item_call label="Zmień Strój" name="Replace Outfit"/>
<menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat Folder"/>
<menu_item_call label="Odtwarzaj" name="Sound Play"/>
- <menu_item_call label="O Miejscu" name="Teleport To Landmark"/>
+ <menu_item_call label="O Miejscu" name="About Landmark"/>
<menu_item_call label="Odtwarzaj w Åšwiecie" name="Animation Play"/>
<menu_item_call label="Odtwarzaj Lokalnie" name="Animation Audition"/>
<menu_item_call label="Wyślij IM" name="Send Instant Message"/>
@@ -54,8 +70,8 @@
<menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat"/>
<menu_item_call label="Aktywuj" name="Activate"/>
<menu_item_call label="Deaktywuj" name="Deactivate"/>
+ <menu_item_call label="Zapisz jako" name="Save As"/>
<menu_item_call label="Odłącz od Siebie" name="Detach From Yourself"/>
- <menu_item_call label="Przywróć ostatnią pozycję" name="Restore to Last Position"/>
<menu_item_call label="Ubierz" name="Object Wear"/>
<menu label="Dołącz do" name="Attach To"/>
<menu label="Dołącz do Załączników HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
new file mode 100644
index 0000000000..5b8c5426dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Załaduj" name="upload">
+ <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Dźwięk (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nowy Folder" name="New Folder"/>
+ <menu_item_call label="Nowy Skrypt" name="New Script"/>
+ <menu_item_call label="Nowa Nota" name="New Note"/>
+ <menu_item_call label="Nowa Gesturka" name="New Gesture"/>
+ <menu label="Nowe Ubranie" name="New Clothes">
+ <menu_item_call label="Nowa Koszulka" name="New Shirt"/>
+ <menu_item_call label="Nowe Spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe Buty" name="New Shoes"/>
+ <menu_item_call label="Nowe Skarpetki" name="New Socks"/>
+ <menu_item_call label="Nowa Kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa Spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="Nowa Bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/>
+ <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
+ </menu>
+ <menu label="Nowa Część Ciała" name="New Body Parts">
+ <menu_item_call label="Nowy Kształt" name="New Shape"/>
+ <menu_item_call label="Nowa Skórka" name="New Skin"/>
+ <menu_item_call label="Nowe Włosy" name="New Hair"/>
+ <menu_item_call label="Nowe Oczy" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8f5f94a02f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nowe Okno Szafy" name="new_window"/>
+ <menu_item_call label="Porządkuj Według Nazwy" name="sort_by_name"/>
+ <menu_item_call label="Porządkuj Według Daty" name="sort_by_recent"/>
+ <menu_item_call label="Pokaż Filtry" name="show_filters"/>
+ <menu_item_call label="Zresetuj Filtry" name="reset_filters"/>
+ <menu_item_call label="Zamknij Wszystkie Foldery" name="close_folders"/>
+ <menu_item_call label="Opróżnij Kosz" name="empty_trash"/>
+ <menu_item_call label="Opróżnij Zagubione i Odnalezione" name="empty_lostnfound"/>
+ <menu_item_call label="Zapisz TeksturÄ™ Jako" name="Save Texture As"/>
+ <menu_item_call label="Znajdź Oryginał" name="Find Original"/>
+ <menu_item_call label="Znajdź Wszystkie Linki" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_land.xml b/indra/newview/skins/default/xui/pl/menu_land.xml
new file mode 100644
index 0000000000..2c89b43525
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="O Posiadłości" name="Place Information..."/>
+ <menu_item_call label="Usiądź Tutaj" name="Sit Here"/>
+ <menu_item_call label="Kup Posiadłość" name="Land Buy"/>
+ <menu_item_call label="Kup Wstęp" name="Land Buy Pass"/>
+ <menu_item_call label="Buduj" name="Create"/>
+ <menu_item_call label="Edytuj Teren" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_landmark.xml b/indra/newview/skins/default/xui/pl/menu_landmark.xml
new file mode 100644
index 0000000000..8cd7e03bf1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Kopiuj SLurl" name="copy"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Utwórz" name="pick"/>
+ <menu_item_call label="Dodaj do Paska Ulubionych" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index 2445d69ac0..5084b59397 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -1,13 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Plik" name="File">
- <menu_item_call label="Wyłącz Program" name="Quit" />
- </menu>
- <menu label="Edycja" name="Edit">
- <menu_item_call label="Ustawienia..." name="Preferences..." />
+ <menu label="Ja" name="File">
+ <menu_item_call label="Ustawienia" name="Preferences..."/>
+ <menu_item_call label="Wyłącz Program" name="Quit"/>
</menu>
<menu label="Pomoc" name="Help">
- <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help" />
- <menu_item_call label="O [APP_NAME]..." name="About Second Life..." />
+ <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/>
+ </menu>
+ <menu label="Debug" name="Debug">
+ <menu label="Edytuj" name="Edit">
+ <menu_item_call label="Cofnij" name="Undo"/>
+ <menu_item_call label="Powtórz" name="Redo"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Powiel" name="Duplicate"/>
+ <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+ <menu_item_call label="Odznacz" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Ustawienia Debugowania" name="Debug Settings"/>
+ <menu_item_call label="Ustawienia UI/Kolor" name="UI/Color Settings"/>
+ <menu_item_call label="Pokaż schowek" name="Show Side Tray"/>
+ <menu label="UI Testy" name="UI Tests"/>
+ <menu_item_call label="Wyświetl TOS" name="TOS"/>
+ <menu_item_call label="Wyświetl Wiadomość Krytyczną" name="Critical"/>
+ <menu_item_call label="Test PrzeglÄ…darki Internetowej" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pl/menu_mini_map.xml b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
index da2eba07a0..4152fb41c8 100644
--- a/indra/newview/skins/default/xui/pl/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom Blisko" name="Zoom Close"/>
<menu_item_call label="Zoom Åšrednio" name="Zoom Medium"/>
<menu_item_call label="Zoom Daleko" name="Zoom Far"/>
+ <menu_item_check label="Obróć Mapę" name="Rotate Map"/>
<menu_item_call label="Zatrzymaj" name="Stop Tracking"/>
- <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Mapa Åšwiata" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_navbar.xml b/indra/newview/skins/default/xui/pl/menu_navbar.xml
new file mode 100644
index 0000000000..8d84f3e764
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Pokaż Współrzędne" name="Show Coordinates"/>
+ <menu_item_check label="Pokaż Właściwości Posiadłości" name="Show Parcel Properties"/>
+ <menu_item_call label="Ulubione Miejsce" name="Landmark"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml
new file mode 100644
index 0000000000..78b8c0a4fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Pokaż Osoby w Pobliżu..." name="nearby_people"/>
+ <menu_item_check label="Pokaż Zablokowany Tekst" name="muted_text"/>
+ <menu_item_check label="Wyświetlaj Ikonki Znajomych" name="show_buddy_icons"/>
+ <menu_item_check label="Wyświetlaj Imiona" name="show_names"/>
+ <menu_item_check label="Wyświetlaj Ikonki i Imiona" name="show_icons_and_names"/>
+ <menu_item_call label="Rozmiar Czcionki" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml
new file mode 100644
index 0000000000..bdeeb61bf4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_object.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Dotknij" name="Object Touch"/>
+ <menu_item_call label="Edytuj" name="Edit..."/>
+ <menu_item_call label="Buduj" name="Build"/>
+ <menu_item_call label="Otwórz" name="Open"/>
+ <menu_item_call label="Usiądź Tutaj" name="Object Sit"/>
+ <menu_item_call label="Sprawdź" name="Object Inspect"/>
+ <context_menu label="Połóż &gt;" name="Put On">
+ <menu_item_call label="Załóż" name="Wear"/>
+ <context_menu label="Dołącz do &gt;" name="Object Attach"/>
+ <context_menu label="Dołącz do HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Usuń &gt;" name="Remove">
+ <menu_item_call label="Weź" name="Pie Object Take"/>
+ <menu_item_call label="Raport" name="Report Abuse..."/>
+ <menu_item_call label="Zablokuj" name="Object Mute"/>
+ <menu_item_call label="Zwróć" name="Return..."/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Weź Kopię" name="Take Copy"/>
+ <menu_item_call label="Zapłać" name="Pay..."/>
+ <menu_item_call label="Kup" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_object_icon.xml b/indra/newview/skins/default/xui/pl/menu_object_icon.xml
new file mode 100644
index 0000000000..b499bca2db
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Sprawdź..." name="Object Profile"/>
+ <menu_item_call label="Zablokuj..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_participant_list.xml b/indra/newview/skins/default/xui/pl/menu_participant_list.xml
new file mode 100644
index 0000000000..604ee2d104
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_participant_list.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_call label="Zobacz Profil" name="View Profile"/>
+ <menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+ <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
+ <menu_item_check label="Zablokuj Tekst" name="MuteText"/>
+ <menu_item_check label="Odblokuj Tekst" name="AllowTextChat"/>
+ <menu_item_call label="Zablokuj tego uczestnika" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Zablokuj wszystkich pozostałych" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Oblokuj tego uczestnika" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Odblokuj wszystkich pozostałych" name="ModerateVoiceUnMuteOthers"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..0043030035
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj Według Statusu" name="sort_status"/>
+ <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..f661cfeba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Wyświetlaj Ikonki Grupy" name="Display Group Icons"/>
+ <menu_item_call label="Opuść Zaznaczone Grupy" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml
new file mode 100644
index 0000000000..0f80b56c16
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Zobacz Profil" name="View Profile"/>
+ <menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+ <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..156c10e3f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Dodaj Znajomych" name="Add Friends"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Udostępnij" name="Share"/>
+ <menu_item_call label="Zapłać" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..9e5f1a5917
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Porządkuj Według Ostatnich Rozmówców" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj Według Odległości" name="sort_distance"/>
+ <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..418b67bce8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Porządkuj Według Daty" name="sort_most"/>
+ <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
+ <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_picks.xml b/indra/newview/skins/default/xui/pl/menu_picks.xml
new file mode 100644
index 0000000000..6f6e4b7fa8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Edytuj" name="pick_edit"/>
+ <menu_item_call label="Teleportuj" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Usuń" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_picks_plus.xml b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml
new file mode 100644
index 0000000000..14ab9c2978
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Utwórz" name="create_pick"/>
+ <menu_item_call label="Nowa Reklama" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_place.xml b/indra/newview/skins/default/xui/pl/menu_place.xml
new file mode 100644
index 0000000000..72f4b1265f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Zapisz Ulubione Miejsce" name="landmark"/>
+ <menu_item_call label="Utwórz" name="pick"/>
+ <menu_item_call label="Kup Wstęp" name="pass"/>
+ <menu_item_call label="Edytuj" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_place_add_button.xml b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml
new file mode 100644
index 0000000000..a737fc49ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Dodaj Folder" name="add_folder"/>
+ <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..f5ece87b28
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
+ <menu_item_call label="Dodaj Folder" name="add_folder"/>
+ <menu_item_call label="Wytnij" name="cut"/>
+ <menu_item_call label="Kopiuj" name="copy_folder"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Zmień Nazwę" name="rename"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Rozwiń" name="expand"/>
+ <menu_item_call label="Schowaj" name="collapse"/>
+ <menu_item_call label="Rozwiń Wszystkie Foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/>
+ <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..e88f650ed0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportuj" name="teleport"/>
+ <menu_item_call label="Więcej Informacji" name="more_info"/>
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
+ <menu_item_call label="Dodaj Folder" name="add_folder"/>
+ <menu_item_call label="Wytnij" name="cut"/>
+ <menu_item_call label="Kopiuj Ulubione Miejsce" name="copy_landmark"/>
+ <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
+ <menu_item_call label="Wklej" name="paste"/>
+ <menu_item_call label="Zmień Nazwę" name="rename"/>
+ <menu_item_call label="Usuń" name="delete"/>
+ <menu_item_call label="Rozwiń Wszystkie Foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/>
+ <menu_item_check label="Sortuj według daty" name="sort_by_date"/>
+ <menu_item_call label="Stwórz Ulubione" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml
new file mode 100644
index 0000000000..8405d48e49
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Udostępnij" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_slurl.xml b/indra/newview/skins/default/xui/pl/menu_slurl.xml
index ca5e2b0965..719959df6a 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/pl/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="O Miejscu" name="about_url" />
- <menu_item_call label="Teleportuj do Miejsca" name="teleport_to_url" />
- <menu_item_call label="Pokaż Miejsce na Mapie" name="show_on_map" />
+ <menu_item_call label="O Miejscu" name="about_url"/>
+ <menu_item_call label="Teleportuj do Miejsca" name="teleport_to_url"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/pl/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..2161963a61
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Rozwiń wszystkie foldery" name="Expand all folders"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="Collapse all folders"/>
+ <menu_item_call label="Wyczyść Historię Teleportacji" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..7e58747267
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportuj" name="Teleport"/>
+ <menu_item_call label="Więcej Szczegółów" name="More Information"/>
+ <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/pl/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..b12df08d6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Otwórz" name="TabOpen"/>
+ <menu_item_call label="Zamknij" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_text_editor.xml b/indra/newview/skins/default/xui/pl/menu_text_editor.xml
new file mode 100644
index 0000000000..4529246b56
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_agent.xml b/indra/newview/skins/default/xui/pl/menu_url_agent.xml
new file mode 100644
index 0000000000..0f210b140b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Profil Rezydenta" name="show_agent"/>
+ <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_group.xml b/indra/newview/skins/default/xui/pl/menu_url_group.xml
new file mode 100644
index 0000000000..38e4360691
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Szczegóły o Grupie" name="show_group"/>
+ <menu_item_call label="Kopiuj GrupÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_http.xml b/indra/newview/skins/default/xui/pl/menu_url_http.xml
new file mode 100644
index 0000000000..0d8793d41e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Otwórz Przeglądarkę Internetową" name="url_open"/>
+ <menu_item_call label="Otwórz w Wewnętrzenej Przeglądarce" name="url_open_internal"/>
+ <menu_item_call label="Otwórz w Zewnętrznej Przeglądarce" name="url_open_external"/>
+ <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_inventory.xml b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml
new file mode 100644
index 0000000000..c11860d6fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Obiekt w Szafie" name="show_item"/>
+ <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_map.xml b/indra/newview/skins/default/xui/pl/menu_url_map.xml
new file mode 100644
index 0000000000..becbd8276f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj do Miejsca" name="teleport_to_location"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_objectim.xml b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml
new file mode 100644
index 0000000000..0bdf1da2a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Szczegóły o Obiekcie" name="show_object"/>
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj to Miejsca Obiektu" name="teleport_to_object"/>
+ <menu_item_call label="Kopiuj NazwÄ™ Obiektu do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_parcel.xml b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml
new file mode 100644
index 0000000000..881c010bc1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_parcel"/>
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_slapp.xml b/indra/newview/skins/default/xui/pl/menu_url_slapp.xml
new file mode 100644
index 0000000000..eb83245c48
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Uruchom tÄ™ komendÄ™" name="run_slapp"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_slurl.xml b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml
new file mode 100644
index 0000000000..b9fa692365
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_place"/>
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_teleport.xml b/indra/newview/skins/default/xui/pl/menu_url_teleport.xml
new file mode 100644
index 0000000000..7376fb3afc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleportuj do tego miejsca" name="teleport"/>
+ <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 1898906d9f..2a5842e553 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -1,207 +1,324 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Plik" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Załaduj" name="upload">
- <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Dźwięk (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animacja (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Zbiór plików (L$[COST] za plik)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Wybierz ustawienia domyślne..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Zamknij Bieżące Okno" name="Close Window"/>
- <menu_item_call label="Zamknij Wszystkie Okna" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Zapisz Obraz Jako..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Zrób Zdjęcie" name="Take Snapshot"/>
- <menu_item_call label="Zapisz Zdjęcie na Dysk" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Wyłącz Program" name="Quit"/>
+ <menu label="Ja" name="Me">
+ <menu_item_call label="Ustawienia" name="Preferences"/>
+ <menu_item_call label="Moja Tablica" name="Manage My Account"/>
+ <menu_item_call label="Kup L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Mój Profil" name="Profile"/>
+ <menu_item_call label="Mój Wygląd" name="Appearance"/>
+ <menu_item_check label="Moja Szafa" name="Inventory"/>
+ <menu_item_call label="Pokaż Szafę w Schowku" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Moje Gesturki" name="Gestures"/>
+ <menu label="Mój Status" name="Status">
+ <menu_item_call label="Tryb Oddalenia" name="Set Away"/>
+ <menu_item_call label="Tryb Pracy" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="ZarzÄ…daj Statusu Administratora" name="Request Admin Options"/>
+ <menu_item_call label="Wyłącz Status Administratora" name="Leave Admin Options"/>
+ <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Edycja" name="Edit">
- <menu_item_call label="Cofnij" name="Undo"/>
- <menu_item_call label="Powtórz" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Wytnij" name="Cut"/>
- <menu_item_call label="Kopiuj" name="Copy"/>
- <menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Usuń" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Szukaj..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
- <menu_item_call label="Cofnij Zaznaczenie" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplikat" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Dołącz Obiekt" name="Attach Object"/>
- <menu label="Odłącz Obiekt" name="Detach Object"/>
- <menu label="Zdejmij Ubranie" name="Take Off Clothing">
- <menu_item_call label="KoszulÄ™" name="Shirt"/>
- <menu_item_call label="Spodnie" name="Pants"/>
- <menu_item_call label="Buty" name="Shoes"/>
- <menu_item_call label="Skarpety" name="Socks"/>
- <menu_item_call label="KurtkÄ™" name="Jacket"/>
- <menu_item_call label="Rękawiczki" name="Gloves"/>
- <menu_item_call label="Podkoszulek" name="Menu Undershirt"/>
- <menu_item_call label="BieliznÄ™" name="Menu Underpants"/>
- <menu_item_call label="Spódnicę" name="Skirt"/>
- <menu_item_call label="Całe Ubranie" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gesty..." name="Gestures..."/>
- <menu_item_call label="Profil..." name="Profile..."/>
- <menu_item_call label="WyglÄ…d..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Znajomi..." name="Friends..."/>
- <menu_item_call label="Grupy..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Ustawienia..." name="Preferences..."/>
+ <menu label="Kommunikacja" name="Communicate">
+ <menu_item_call label="Znajomi" name="My Friends"/>
+ <menu_item_call label="Grupy" name="My Groups"/>
+ <menu_item_check label="Czat Lokalny" name="Nearby Chat"/>
+ <menu_item_call label="Osoby w Pobliżu" name="Active Speakers"/>
+ <menu_item_check label="Media w Pobliżu" name="Nearby Media"/>
</menu>
- <menu label="Widok" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Widok Panoramiczny" name="Mouselook"/>
- <menu_item_check label="Budowanie" name="Build"/>
- <menu_item_check label="Wolna Kamera" name="Joystick Flycam"/>
- <menu_item_call label="Normalny Widok" name="Reset View"/>
- <menu_item_call label="Historia Rozmów" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Narzędzia" name="Toolbar"/>
- <menu_item_check label="Rozmowa Lokalna" name="Chat History"/>
- <menu_item_check label="Rozmowa Prywatna (IM)" name="Instant Message"/>
- <menu_item_check label="Moja Szafa" name="Inventory"/>
- <menu_item_check label="RozmawiajÄ…ce Osoby" name="Active Speakers"/>
- <menu_item_check label="Wyciszone Osoby" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Ustawienia Kamery" name="Camera Controls"/>
+ <menu label="Åšwiat" name="World">
<menu_item_check label="Ustawienia Ruchu" name="Movement Controls"/>
- <menu_item_check label="Mapa Åšwiata" name="World Map"/>
+ <menu_item_check label="Widok" name="Camera Controls"/>
+ <menu_item_call label="O Posiadłości" name="About Land"/>
+ <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
+ <menu_item_call label="Kup Posiadłość" name="Buy Land"/>
+ <menu_item_call label="Moje Posiadłości" name="My Land"/>
+ <menu label="Pokaż" name="Land">
+ <menu_item_check label="Linie Banu" name="Ban Lines"/>
+ <menu_item_check label="Emitery" name="beacons"/>
+ <menu_item_check label="Granice Posiadłości" name="Property Lines"/>
+ <menu_item_check label="Właściciele Posiadłości" name="Land Owners"/>
+ </menu>
+ <menu label="Ulubione Miejsca" name="Landmarks">
+ <menu_item_call label="Zapisz Ulubione Miejsce" name="Create Landmark Here"/>
+ <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
+ </menu>
+ <menu_item_call label="Miejsce Startu" name="Teleport Home"/>
<menu_item_check label="Mini-Mapa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Statystyki" name="Statistics Bar"/>
- <menu_item_check label="Granice Posiadłości" name="Property Lines"/>
- <menu_item_check label="Linie banu" name="Banlines"/>
- <menu_item_check label="Właściciele Posiadłości" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Podpowiedzi" name="Hover Tips">
- <menu_item_check label="Pokaż Podpowiedzi" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Posiadłość: wskazówki" name="Land Tips"/>
- <menu_item_check label="Obiekty: wskazówki" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Pokaż Przezroczyste Obiekty" name="Highlight Transparent"/>
- <menu_item_check label="Emitery" name="beacons"/>
- <menu_item_check label="Ukryj CzÄ…steczki" name="Hide Particles"/>
- <menu_item_check label="Pokaż Załączniki HUD" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Zbliżenie" name="Zoom In"/>
- <menu_item_call label="Domyślny Tryb Widoku" name="Zoom Default"/>
- <menu_item_call label="Oddalenie" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Tryb Widoku Pełnoekranowego" name="Toggle Fullscreen"/>
- <menu_item_call label="Ustaw Domyślny Rozmiar Interfejsu Użytkownika" name="Set UI Size to Default"/>
- </menu>
- <menu label="Åšwiat" name="World">
- <menu_item_call label="Rozmowa/Czat" name="Chat"/>
- <menu_item_check label="Biegnij" name="Always Run"/>
- <menu_item_check label="Leć" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Zapamiętaj Miejsce (LM)" name="Create Landmark Here"/>
- <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleportuj do Miejsca Startu" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Åšpij" name="Set Away"/>
- <menu_item_call label="Pracuj" name="Set Busy"/>
- <menu_item_call label="Zatrzymaj Wszystkie Animacje" name="Stop Animating My Avatar"/>
- <menu_item_call label="Zwolnij Klawisze" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Historia Konta..." name="Account History..."/>
- <menu_item_call label="ZarzÄ…dzaj Kontem..." name="Manage My Account..."/>
- <menu_item_call label="Kup L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Moje Posiadłości..." name="My Land..."/>
- <menu_item_call label="O Posiadłości..." name="About Land..."/>
- <menu_item_call label="Kup Posiadłość..." name="Buy Land..."/>
- <menu_item_call label="Region/MajÄ…tek..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Ustawienia Åšrodowiska" name="Environment Settings">
+ <menu_item_check label="Mapa Åšwiata" name="World Map"/>
+ <menu_item_call label="Zrób Zdjęcie" name="Take Snapshot"/>
+ <menu label="Słońce" name="Environment Settings">
<menu_item_call label="Wschód Słońca" name="Sunrise"/>
<menu_item_call label="Południe" name="Noon"/>
<menu_item_call label="Zachód Słońca" name="Sunset"/>
<menu_item_call label="Północ" name="Midnight"/>
- <menu_item_call label="Przywróć Domyślne Ustawienia Regionu" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Używaj Czasu Regionu" name="Revert to Region Default"/>
<menu_item_call label="Edytor Åšrodowiska" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Narzędzia" name="Tools">
- <menu label="Wybierz Narzędzie " name="Select Tool">
- <menu_item_call label="Przybliżenie" name="Focus"/>
- <menu_item_call label="Przesuń" name="Move"/>
- <menu_item_call label="Edytuj" name="Edit"/>
- <menu_item_call label="Stwórz" name="Create"/>
- <menu_item_call label="Posiadłość" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/>
- <menu_item_check label="Wybierz Tylko Obiekty Przesuwalne" name="Select Only Movable Objects"/>
- <menu_item_check label="Wybierz Przez Zaznaczenie" name="Select By Surrounding"/>
- <menu_item_check label="Pokaż Ukrytą Selekcję" name="Show Hidden Selection"/>
- <menu_item_check label="Pokaż Zasięg Światła dla Selekcji" name="Show Light Radius for Selection"/>
- <menu_item_check label="Pokaż Źródło Selekcji" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="PrzeciÄ…gnij Obiekt" name="Snap to Grid"/>
- <menu_item_call label="PrzeciÄ…gnij Obiekt Do Siatki" name="Snap Object XY to Grid"/>
- <menu_item_call label="Zastosuj Zaznaczenie Dla Siatki" name="Use Selection for Grid"/>
- <menu_item_call label="Opcje Siatki..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Edytuj Zgrupowane Obiekty" name="Edit Linked Parts"/>
+ <menu label="Buduj" name="BuildTools">
+ <menu_item_check label="Buduj" name="Show Build Tools"/>
+ <menu label="Wybierz Narzędzie Budowania" name="Select Tool">
+ <menu_item_call label="Narzędzie Ogniskowej" name="Focus"/>
+ <menu_item_call label="Narzędzie Ruchu" name="Move"/>
+ <menu_item_call label="Narzędzie Edycji" name="Edit"/>
+ <menu_item_call label="Stwórz Narzędzie" name="Create"/>
+ <menu_item_call label="Narzędzie Posiadłości" name="Land"/>
+ </menu>
+ <menu label="Edytuj" name="Edit">
+ <menu_item_call label="Cofnij" name="Undo"/>
+ <menu_item_call label="Cofnij" name="Redo"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zduplikuj" name="Duplicate"/>
+ <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+ <menu_item_call label="Cofnij Zaznaczenie" name="Deselect"/>
+ </menu>
<menu_item_call label="Grupuj" name="Link"/>
- <menu_item_call label="Rozgrupuj" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="OglÄ…daj SelekcjÄ™" name="Focus on Selection"/>
+ <menu_item_call label="Rozlinkuj" name="Unlink"/>
+ <menu_item_call label="Ogniskowa Selekcji" name="Focus on Selection"/>
<menu_item_call label="Przybliż do Selekcji" name="Zoom to Selection"/>
- <menu_item_call label="Kup Obiekt" name="Menu Object Take">
- <on_enable userdata="Kup,Weź" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Weź Kopię" name="Take Copy"/>
- <menu_item_call label="Zapisz Obiekt z Poprawkami" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Pokaż Okno Ostrzeżenia/Błędu Skryptu" name="Show Script Warning/Error Window"/>
- <menu label="Zrekompiluj Skrypt w Selekcji" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Zresetuj Skrypt w Selekcji" name="Reset Scripts in Selection"/>
- <menu_item_call label="Uruchom Działanie Skryptów w Selekcji" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Wstrzymaj Działanie Skryptów w Selekcji" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Obiekt" name="Object">
+ <menu_item_call label="Kup" name="Menu Object Take"/>
+ <menu_item_call label="Weź Kopię" name="Take Copy"/>
+ <menu_item_call label="Zapisz Obiekt do Szafy" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Zapisz do Treści Obiektu" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Skrypty" name="Scripts">
+ <menu_item_call label="Zrekompiluj Skrypt w Selekcji (Mono)" name="Mono"/>
+ <menu_item_call label="Zrekompiluj Skrypty" name="LSL"/>
+ <menu_item_call label="Reset Skryptów" name="Reset Scripts"/>
+ <menu_item_call label="Ustaw Uruchamienie Skryptów" name="Set Scripts to Running"/>
+ <menu_item_call label="Wstrzymaj Działanie Skryptów w Selekcji" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opcje" name="Options">
+ <menu_item_check label="Edytuj Części Zlinkowane" name="Edit Linked Parts"/>
+ <menu_item_call label="Ustaw DomyÅ›lne Pozwolenia Åadowania" name="perm prefs"/>
+ <menu_item_check label="Pokaż Zaawansowane Pozwolenia" name="DebugPermissions"/>
+ <menu label="Selekcja" name="Selection">
+ <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/>
+ <menu_item_check label="Zaznacz Tylko PoruszajÄ…ce siÄ™ Obiekty" name="Select Only Movable Objects"/>
+ <menu_item_check label="Wybierz Przez Zaznaczenie" name="Select By Surrounding"/>
+ </menu>
+ <menu label="Pokaż" name="Show">
+ <menu_item_check label="Pokaż Ukrytą Selekcję" name="Show Hidden Selection"/>
+ <menu_item_check label="Pokaż Promień Światła dla Selekcji" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Pokaż Emitery Selekcji" name="Show Selection Beam"/>
+ </menu>
+ <menu label="Siatka" name="Grid">
+ <menu_item_check label="PrzeciÄ…gnij Obiekt" name="Snap to Grid"/>
+ <menu_item_call label="PrzeciÄ…gnij Obiekt XY do Siatki" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Zastosuj Zaznaczenie dla Siatki" name="Use Selection for Grid"/>
+ <menu_item_call label="Ustawienia Siatki" name="Grid Options"/>
+ </menu>
+ </menu>
+ <menu label="Wybierz Zlinkowane Części" name="Select Linked Parts">
+ <menu_item_call label="Wybierz Następną Część" name="Select Next Part"/>
+ <menu_item_call label="Zaznacz Poprzednią Część" name="Select Previous Part"/>
+ <menu_item_call label="Uwzględnij Następną Część" name="Include Next Part"/>
+ <menu_item_call label="Uwzględnij Poprzednią Część" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Pomoc" name="Help">
- <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/>
+ <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/>
<menu_item_call label="Samouczek" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Oficjalny Blog [SECOND_LIFE]..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal dla Skrypterów..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Złóż Raport o Nadużyciu..." name="Report Abuse..."/>
- <menu_item_call label="Zderzenia, Popchnięcia, Uderzenia..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Pomiar Lagów" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Zgłoś Błędy Klienta" name="Bug Reporting">
- <menu_item_call label="Publiczna Baza Błędów (JIRA)..." name="Public Issue Tracker..."/>
- <menu_item_call label="Co to jest JIRA?..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Instrukcje: Jak Zgłosić Błąd?..." name="Bug Reporing 101..."/>
- <menu_item_call label="Zabezpieczenia..." name="Security Issues..."/>
- <menu_item_call label="Pytania i Odpowiedzi: Wikipedia..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Wyślij Raport Błędu..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="O [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/>
+ <menu_item_call label="Zgłoś Błędy Klienta" name="Report Bug"/>
+ </menu>
+ <menu label="Zaawansowane" name="Advanced">
+ <menu_item_check label="Uruchom Tryb Oddalenia po 30 Minutach" name="Go Away/AFK When Idle"/>
+ <menu_item_call label="Zatrzymaj Wszystkie Animacje" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Odswież Wyświetlanie Tekstur" name="Rebake Texture"/>
+ <menu_item_call label="Domyślne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/>
+ <menu_item_check label="Ogranicz Dystans Selekcji" name="Limit Select Distance"/>
+ <menu_item_check label="Wyłącz Ograniczenia Zasięgu Kamery" name="Disable Camera Distance"/>
+ <menu_item_check label="Wysoka Rozdzielczość Zdjęć" name="HighResSnapshot"/>
+ <menu_item_check label="Zapisuj Zdjęcia na Dysk Twardy bez Efektu Dźwiękowego" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Skompresuj Zdjęcie na Dysk Twardy" name="CompressSnapshotsToDisk"/>
+ <menu label="Narzędzia" name="Performance Tools">
+ <menu_item_call label="Pomiar Lagów" name="Lag Meter"/>
+ <menu_item_check label="Statystyki" name="Statistics Bar"/>
+ <menu_item_check label="Pokaż Wartość Renderowania Awatara" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Podkreślanie i Widoczność" name="Highlighting and Visibility">
+ <menu_item_check label="Efekt Emiterów" name="Cheesy Beacon"/>
+ <menu_item_check label="Ukryj CzÄ…steczki" name="Hide Particles"/>
+ <menu_item_check label="Ukryj Zaznaczone" name="Hide Selected"/>
+ <menu_item_check label="Pokaż Przeźroczyste Obiekty" name="Highlight Transparent"/>
+ <menu_item_check label="Pokaż Załączniki HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Pokaż Celownik Myszki" name="ShowCrosshairs"/>
+ <menu_item_check label="Pokaż Podpowiedzi Posiadłości" name="Land Tips"/>
+ </menu>
+ <menu label="Rodzaje Renderowania" name="Rendering Types">
+ <menu_item_check label="Podstawowe" name="Simple"/>
+ <menu_item_check label="Maska Przezroczysta" name="Alpha"/>
+ <menu_item_check label="Drzewo" name="Tree"/>
+ <menu_item_check label="Awatary" name="Character"/>
+ <menu_item_check label="Płaszczyzna Powierzchni" name="SurfacePath"/>
+ <menu_item_check label="Niebo" name="Sky"/>
+ <menu_item_check label="Woda" name="Water"/>
+ <menu_item_check label="Ziemia" name="Ground"/>
+ <menu_item_check label="Głośność" name="Volume"/>
+ <menu_item_check label="Trawa" name="Grass"/>
+ <menu_item_check label="Chmury" name="Clouds"/>
+ <menu_item_check label="CzÄ…steczki" name="Particles"/>
+ <menu_item_check label="Zderzenie" name="Bump"/>
+ </menu>
+ <menu label="Opcje Renderowania" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Zaznaczone" name="Selected"/>
+ <menu_item_check label="Podświetlenie" name="Highlighted"/>
+ <menu_item_check label="Tekstury Dynamiczne" name="Dynamic Textures"/>
+ <menu_item_check label="Cień Stopy" name="Foot Shadows"/>
+ <menu_item_check label="Mgła" name="Fog"/>
+ <menu_item_check label="Obiekty Elastyczne" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Uruchom Wiele Wątków" name="Run Multiple Threads"/>
+ <menu_item_call label="Wyczyść Bufor Danych Grupy" name="ClearGroupCache"/>
+ <menu_item_check label="Wygładzanie Ruchu Myszki" name="Mouse Smoothing"/>
+ <menu_item_check label="Pokaż Wiadomości w Pobliżu" name="IMInChat"/>
+ <menu label="Skróty" name="Shortcuts">
+ <menu_item_check label="Szukaj" name="Search"/>
+ <menu_item_call label="Zwolnij Klawisze" name="Release Keys"/>
+ <menu_item_call label="Domyślne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/>
+ <menu_item_check label="Biegnij" name="Always Run"/>
+ <menu_item_check label="Zacznij Latać" name="Fly"/>
+ <menu_item_call label="Zamknij Okno" name="Close Window"/>
+ <menu_item_call label="Zamknij Wszystkie Okna" name="Close All Windows"/>
+ <menu_item_call label="Zapisz Zdjęcie na Dysk Twardy" name="Snapshot to Disk"/>
+ <menu_item_call label="Widok Panoramiczny" name="Mouselook"/>
+ <menu_item_check label="Wolna Kamera" name="Joystick Flycam"/>
+ <menu_item_call label="Reset Widoku" name="Reset View"/>
+ <menu_item_call label="Zobacz Ostatniego Rozmówce" name="Look at Last Chatter"/>
+ <menu label="Wybierz Narzędzie Budowania" name="Select Tool">
+ <menu_item_call label="Narzędzie Ogniskowej" name="Focus"/>
+ <menu_item_call label="Narzędzie Ruchu" name="Move"/>
+ <menu_item_call label="Narzędzie Edycji" name="Edit"/>
+ <menu_item_call label="Stwórz Narzędzie" name="Create"/>
+ <menu_item_call label="Narzędzia Posiadłości" name="Land"/>
+ </menu>
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <menu_item_call label="Domyślne Przybliżenie" name="Zoom Default"/>
+ <menu_item_call label="Oddal" name="Zoom Out"/>
+ <menu_item_call label="Rozwiń Widok Pełnoekranowy" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Pokaż Ustawienia Debugowania" name="Debug Settings"/>
+ <menu_item_check label="Pokaż Menu Progresu" name="Debug Mode"/>
+ </menu>
+ <menu label="Postęp" name="Develop">
+ <menu label="Konsola" name="Consoles">
+ <menu_item_check label="Konsola Tekstur" name="Texture Console"/>
+ <menu_item_check label="Debugowanie Zdarzeń Konsoli" name="Debug Console"/>
+ <menu_item_call label="Konsola Powiadomień" name="Notifications"/>
+ <menu_item_check label="Konsola Rozmiaru Tekstury" name="Texture Size"/>
+ <menu_item_check label="Konsola Kategorii Tekstur" name="Texture Category"/>
+ <menu_item_check label="Szybkie Timery" name="Fast Timers"/>
+ <menu_item_check label="Pamięć" name="Memory"/>
+ <menu_item_call label="Info Regionu do Debugowania Konsoli" name="Region Info to Debug Console"/>
+ <menu_item_check label="Kamera" name="Camera"/>
+ <menu_item_check label="Wiatr" name="Wind"/>
+ </menu>
+ <menu label="Pokaż Informacje" name="Display Info">
+ <menu_item_check label="Pokaż Czas" name="Show Time"/>
+ <menu_item_check label="Pokaż Informacje o Renderowaniu" name="Show Render Info"/>
+ <menu_item_check label="Pokaż Kolor pod Kursorem" name="Show Color Under Cursor"/>
+ <menu_item_check label="Pokaż Aktualizacje Obiektów" name="Show Updates"/>
+ </menu>
+ <menu label="Reset Błędu" name="Force Errors">
+ <menu_item_call label="Aktywacja Punktu Załamania" name="Force Breakpoint"/>
+ <menu_item_call label="Reset Błędów LL" name="Force LLError And Crash"/>
+ <menu_item_call label="Reset Błędów Pamięci" name="Force Bad Memory Access"/>
+ <menu_item_call label="Reset Pętli" name="Force Infinite Loop"/>
+ <menu_item_call label="Reset Sterowników" name="Force Driver Carsh"/>
+ <menu_item_call label="WyjÄ…tek Programu" name="Force Software Exception"/>
+ <menu_item_call label="Uruchom Rozłączenie" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Symulacja Wycieku Pamięci" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Test Renderowania" name="Render Tests">
+ <menu_item_check label="Kamera Poza Zasiegiem" name="Camera Offset"/>
+ <menu_item_check label="Losowa Ilość Klatek" name="Randomize Framerate"/>
+ <menu_item_check label="Test Klatki Obrazu" name="Frame Test"/>
+ </menu>
+ <menu label="Renderowanie" name="Rendering">
+ <menu_item_check label="Osie" name="Axes"/>
+ <menu_item_check label="Tryb Obrazu Szkieletowego" name="Wireframe"/>
+ <menu_item_check label="Globalne Oświetlenie" name="Global Illumination"/>
+ <menu_item_check label="Tekstury Animacji" name="Animation Textures"/>
+ <menu_item_check label="Wyłącz Tekstury" name="Disable Textures"/>
+ <menu_item_check label="Renderowania Załączonego Światła" name="Render Attached Lights"/>
+ <menu_item_check label="Renderowanie Załączonych Cząsteczek" name="Render Attached Particles"/>
+ <menu_item_check label="Wyświetlaj Obiekty Odblaskowe" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Sieć" name="Network">
+ <menu_item_check label="Zatrzymaj Awatara" name="AgentPause"/>
+ <menu_item_call label="Upuść Pakiet Pamięci" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Zderzenia, Popchnięcia &amp; Uderzenia" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Åšwiat" name="World">
+ <menu_item_check label="Domyślne Ustawienia Środowiska Regionu" name="Sim Sun Override"/>
+ <menu_item_check label="Efekty Emiterów" name="Cheesy Beacon"/>
+ <menu_item_check label="Ustalona Pogoda" name="Fixed Weather"/>
+ <menu_item_call label="Zachowaj Bufor Pamięci Obiektów Regionu" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Test PrzeglÄ…darki Internetowej" name="Web Browser Test"/>
+ <menu_item_call label="Drukuj Zaznaczone Informacje o Obiekcie" name="Print Selected Object Info"/>
+ <menu_item_call label="Statystyki Pamięci" name="Memory Stats"/>
+ <menu_item_check label="Kliknij Podójnie by Uruchomić Auto-Pilota" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debugowanie Zdarzeń Klikania" name="Debug Clicks"/>
+ <menu_item_check label="Debugowanie Zdarzeń Myszy" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Załaduj Ustawienia Koloru" name="Reload Color Settings"/>
+ <menu_item_call label="Pokaż Test Czcionki" name="Show Font Test"/>
+ <menu_item_call label="Załaduj z XML" name="Load from XML"/>
+ <menu_item_call label="Zapisz jako XML" name="Save to XML"/>
+ <menu_item_check label="Pokaż Nazwy XUI" name="Show XUI Names"/>
+ <menu_item_call label="Wyślij Wiadomość (IM) Testową" name="Send Test IMs"/>
+ </menu>
+ <menu label="Awatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Tęczówka Oka" name="Iris"/>
+ <menu_item_call label="Głowa" name="Head"/>
+ <menu_item_call label="Górna Część Ciała" name="Upper Body"/>
+ <menu_item_call label="Dolna Część Ciała" name="Lower Body"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ </menu>
+ <menu label="Testy Postaci" name="Character Tests">
+ <menu_item_call label="Przesuń Geometrię Postaci" name="Toggle Character Geometry"/>
+ <menu_item_check label="Pozwól na Zaznaczanie Awatarów" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Powrót do Domyślnych Parametrów" name="Force Params to Default"/>
+ <menu_item_check label="Info o Animacji" name="Animation Info"/>
+ <menu_item_check label="Wolne Animacje" name="Slow Motion Animations"/>
+ <menu_item_check label="Wyłącz Poziom Detalu" name="Disable LOD"/>
+ <menu_item_check label="Pokaż Szczegóły Kolizji" name="Show Collision Skeleton"/>
+ <menu_item_check label="Wyświetl Cel Aganta" name="Display Agent Target"/>
+ <menu_item_call label="Debugowanie Tekstur Awatara" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="Tekstury HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Aktywacja okna konsoli podczas następnego uruchomienia" name="Console Window"/>
+ <menu_item_check label="Pokaż Menu Administratora" name="View Admin Options"/>
+ <menu_item_call label="Uzyskaj Status Administratora" name="Request Admin Options"/>
+ <menu_item_call label="Opuść Status Administratora" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Administrator" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Weź Kopię" name="Take Copy"/>
+ <menu_item_call label="Reset Właściciela" name="Force Owner To Me"/>
+ <menu_item_call label="Reset Przyzwolenia Właściciela" name="Force Owner Permissive"/>
+ <menu_item_call label="Usuń" name="Delete"/>
+ <menu_item_call label="Zablokuj" name="Lock"/>
+ </menu>
+ <menu label="Posiadłość" name="Parcel">
+ <menu_item_call label="Reset Właściciela" name="Owner To Me"/>
+ <menu_item_call label="Ustawienia Treści Lindenów" name="Set to Linden Content"/>
+ <menu_item_call label="Odzyskaj Posiadłość Publiczną" name="Claim Public Land"/>
+ </menu>
+ <menu label="Region" name="Region">
+ <menu_item_call label="Zachowaj Tymczasowo BazÄ™ Asset" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Zachowaj Ustawienie Regionu" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Boskie Nadzędzia" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pl/mime_types.xml b/indra/newview/skins/default/xui/pl/mime_types.xml
index c90d5761e6..c90d5761e6 100755..100644
--- a/indra/newview/skins/default/xui/pl/mime_types.xml
+++ b/indra/newview/skins/default/xui/pl/mime_types.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_audio_device.xml b/indra/newview/skins/default/xui/pl/panel_audio_device.xml
index fc3b3776f0..fc3b3776f0 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/pl/panel_audio_device.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..d7fcb8c966
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista Blokad
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista zablokowanych obecnie rezydentów"/>
+ <button label="Zablokuj Rezydenta..." label_selected="Zablokuj Rezydenta..." name="Block resident..." tool_tip="Wybierz rezydenta, którego chcesz zablokować"/>
+ <button label="Zablokuj obiekt według nazwy..." label_selected="Zablokuj obiekt według nazwy..." name="Block object by name..."/>
+ <button label="Odblokuj" label_selected="Odblokuj" name="Unblock" tool_tip="Usuń rezydenta lub obiekt z listy blokad"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
index e449a92d7e..97fa3118f8 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Rezydent" />
- <string name="AcctTypeTrial"
- value="Próbne" />
- <string name="AcctTypeCharterMember"
- value="Członek-zalożyciel" />
- <string name="AcctTypeEmployee"
- value="Pracownik Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Dane Konta Używane" />
- <string name="PaymentInfoOnFile"
- value="Dane Konta Dostępne" />
- <string name="NoPaymentInfoOnFile"
- value="Brak Danych Konta" />
- <string name="AgeVerified"
- value="Wiek Zweryfikowany" />
- <string name="NotAgeVerified"
- value="Brak Weryfikacji Wieku" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pl
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Pracuś Mówi:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="AcctTypeResident"
+ value="Rezydent" />
+ <string name="AcctTypeTrial"
+ value="Próbne" />
+ <string name="AcctTypeCharterMember"
+ value="Członek-zalożyciel" />
+ <string name="AcctTypeEmployee"
+ value="Pracownik Linden Lab" />
+ <string name="PaymentInfoUsed"
+ value="Dane Konta Używane" />
+ <string name="PaymentInfoOnFile"
+ value="Dane Konta Dostępne" />
+ <string name="NoPaymentInfoOnFile"
+ value="Brak Danych Konta" />
+ <string name="AgeVerified"
+ value="Wiek Zweryfikowany" />
+ <string name="NotAgeVerified"
+ value="Brak Weryfikacji Wieku" />
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pl
+ </string>
+ <panel name="scroll_content_panel">
+ <panel name="data_panel" >
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text">
+ [SECOND_LIFE]:
+ </text>
+ </panel>
+ </panel>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <text name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ <text name="text_box3">
+ Pracuś Mówi:
+ </text>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_friends.xml b/indra/newview/skins/default/xui/pl/panel_friends.xml
index b6df36f199..b6df36f199 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_friends.xml
+++ b/indra/newview/skins/default/xui/pl/panel_friends.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_group_general.xml b/indra/newview/skins/default/xui/pl/panel_group_general.xml
index d09ff72226..d09ff72226 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_general.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_group_invite.xml b/indra/newview/skins/default/xui/pl/panel_group_invite.xml
index 12d48279ad..12d48279ad 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_invite.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
index dbfa8e3122..dbfa8e3122 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
index 1c19571ec0..1c19571ec0 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_group_roles.xml b/indra/newview/skins/default/xui/pl/panel_group_roles.xml
index ccef8870d2..dd46b4aeaa 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_roles.xml
@@ -1,118 +1,80 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Członkowie" name="roles_tab">
- <string name="default_needs_apply_text">
- Panel zawiera nie zapisane zmiany.
- </string>
- <string name="want_apply_text">
- Chcesz zapisać zmiany?
- </string>
- <button label="?" name="help_button" />
- <panel name="members_header">
- <text name="static">
- Funkcje Członków
- </text>
- <text name="static2">
- Członkowie Grupy mają przydzielone Funkcje z Przywilejami. Ustawienia te
-można łatwo zmienić, umożliwiając grupie lepszą organizację i działaność.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Funkcje
- </text>
- <text name="role_properties_modifiable">
- Wybierz Funkcję. Możesz zmienić Nazwę, Opis i Tytuł Członka.
- </text>
- <text name="role_properties_not_modifiable">
- Wybierz Funkcję żeby zobaczyć jej atrybuty, Członków i Przywileje.
- </text>
- <text name="role_actions_modifiable">
- Możesz również przypisać Przywileje do Funkcji.
- </text>
- <text name="role_actions_not_modifiable">
- Możesz zobaczyć ale nie możesz modyfikować Przywilejów.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Przywileje
- </text>
- <text name="static2">
- Możesz zobaczyć opis Przywileju oraz Funkcje i Członków z przypisanym
-Przywilejem.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ Zakładka zawiera niezapisane zmiany
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Czy chcesz zapisać zmiany?
+ </panel.string>
<tab_container name="roles_tab_container">
- <panel label="Członkowie" name="members_sub_tab" tool_tip="Członkowie">
- <button label="Szukaj" name="search_button" />
- <button label="Wszystko" name="show_all_button" />
- <name_list name="member_list">
- <column label="ImiÄ™" name="name" />
- <column label="Kontrybucje" name="donated" />
- <column label="Ostatnio w SL" name="online" />
- </name_list>
- <button label="ZaproÅ› NowÄ… OsobÄ™..." name="member_invite"/>
- <button label="Usuń z Grupy" name="member_eject" />
- <string name="help_text">
+ <panel label="CZÅONKOWIE" name="members_sub_tab" tool_tip="CzÅ‚onkowie">
+ <panel.string name="help_text">
Możesz dodawać i usuwać Funkcje przypisane do Członków.
Możesz wybrać wielu Członków naciskając Ctrl i klikając na ich imionach.
- </string>
+ </panel.string>
+ <filter_editor label="Filtruj Członków" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Członek" name="name"/>
+ <name_list.columns label="Dotacje" name="donated"/>
+ <name_list.columns label="Ostatnio w SL" name="online"/>
+ </name_list>
+ <button label="ZaproÅ› do Grupy" name="member_invite"/>
+ <button label="Usuń z Grupy" name="member_eject"/>
</panel>
- <panel label="Funkcje" name="roles_sub_tab">
- <button label="Szukaj" name="search_button" />
- <button label="Wszystko" name="show_all_button" />
+ <panel label="FUNKCJE" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Wszystkie funkcje mają tytuł oraz przypisane do niego przywileje
+które umożliwiają wykonywanie danej funckji. Każdy członek może pełnić
+jedną lub wiele funkcji. Każda grupa może posiadać maksymalnie 10 funkcji,
+łącznie z funkcją Każdy i Właściciel.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Specjalne Funkcje Każdy i Właściciel nie mogą zostać usunięte.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtruj Funkcje" name="filter_input"/>
<scroll_list name="role_list">
- <column label="Funkcja" name="name" />
- <column label="Tytuł" name="title" />
- <column label="Liczba" name="members" />
+ <scroll_list.columns label="Funkcja" name="name"/>
+ <scroll_list.columns label="Tytuł" name="title"/>
+ <scroll_list.columns label="Liczba" name="members"/>
</scroll_list>
- <button label="Dodaj NowÄ… FunkcjÄ™..." name="role_create" />
- <button label="Usuń Funkcję" name="role_delete" />
- <string name="help_text">
- Funkcje mają Tytuł i przypisane Przywileje. Członkowie mogą mieć jedną lub więcej Funkcji.
- Grupa może zawierać maksymalnie 10 Funkcji uwzględniając Funkcje Każdy i Właściciel.
- </string>
- <string name="cant_delete_role">
- Specjalne Funkcje Każdy i Właściciel nie mogą zostać usunięte.
- </string>
+ <button label="Stwórz Nową Funkcję" name="role_create"/>
+ <button label="Usuń Funkcję" name="role_delete"/>
</panel>
- <panel label="Przywileje" name="actions_sub_tab">
- <button label="Szukaj" name="search_button" />
- <button label="Wszystko" name="show_all_button" />
- <scroll_list name="action_list" tool_tip="Zaznacz aby zobaczyć więcej informacji.">
- <column label="" name="icon" />
- <column label="" name="action" />
- </scroll_list>
- <string name="help_text">
+ <panel label="PRZYWILEJE" name="actions_sub_tab" tool_tip="Możesz sprawdzić szczegóły dotyczące dangego przywileju oraz jakie funkcje oraz jacy członkowie posiadają prawo korzystania z niego.">
+ <panel.string name="help_text">
Przywileje pozwalają Członkom przypisanym do Funkcji na wykonywanie różnych zadań.
Istnieje wiele Przywilei.
- </string>
+ </panel.string>
+ <filter_editor label="Filtruj Przywileje" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Wybierz przywilej by zobaczyć szczegóły">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Funkcje
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
Przywileje
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox" />
- <column label="" name="role" />
- </scroll_list>
- <scroll_list name="member_allowed_actions"
- tool_tip="Opisy Przywilejów są dostępne w zakładce Przywileje.">
- <column label="" name="icon" />
- <column label="" name="action" />
+ <scroll_list name="member_allowed_actions" tool_tip="By zobaczyć szczegóły, wybierz zakładkę Przywileje">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
Nazwa
</text>
- <text name="static2">
- Opis
- </text>
<line_editor name="role_name">
Liczba
</line_editor>
@@ -122,36 +84,37 @@ Istnieje wiele Przywilei.
<line_editor name="role_title">
(proszę czekać)
</line_editor>
+ <text name="static2">
+ Opis
+ </text>
<text_editor name="role_description">
(proszę czekać)
</text_editor>
<text name="static4">
- Przypisani Członkowie
+ Przypisane Funkcje
</text>
+ <check_box label="Opcja widoczności jest aktywna" name="role_visible_in_list" tool_tip="Opcja ta pozwala określić widoczność członków pełniących tę funkcję dla ludzi spoza Grupy."/>
<text name="static5" tool_tip="Przywileje przypisane do wybranej Funkcji.">
Przypisane Przywileje
</text>
- <check_box label="Członkowie są Widoczni" name="role_visible_in_list"
- tool_tip="Określa czy Członkowie w tej Funkcji są widoczni dla ludzi spoza Grupy." />
- <scroll_list name="role_allowed_actions"
- tool_tip="Opisy Przywilejów są dostępne w zakładce Przywileje.">
- <column label="" name="icon" />
- <column label="" name="checkbox" />
- <column label="" name="action" />
+ <scroll_list name="role_allowed_actions" tool_tip="By zobaczyć szczegóły dozwolonych przywilejów wybierz zakładkę Przywileje">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
<text name="static">
- Opis
+ Opis Przywileju
</text>
<text_editor name="action_description">
Przywilej &apos;Usuń Członka z Grupy&apos;. Tylko Właściciel może usunąć innego Właściciela.
</text_editor>
<text name="static2">
- Funkcje z Przywilejem
+ Funkcje z tym przywilejem
</text>
<text name="static3">
- Członkowie z Przywilejem
+ Członkowie z tym przywilejem
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_groups.xml b/indra/newview/skins/default/xui/pl/panel_groups.xml
index 9df90fc797..9df90fc797 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_groups.xml
+++ b/indra/newview/skins/default/xui/pl/panel_groups.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index 3caf9338a2..cec7e34da5 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -1,37 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
+ <panel.string name="real_url">
http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
+ </panel.string>
+ <panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
- </string>
- <text name="first_name_text">
- ImiÄ™:
- </text>
- <text name="last_name_text">
- Nazwisko:
- </text>
- <text name="password_text">
- Hasło:
- </text>
- <text name="start_location_text">
- Miejsce Startu:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Mój Start" />
- <combo_box.item name="MyLastLocation" label="Ostatnie Miejsce" />
- <combo_box.item name="Typeregionname" label="&lt;Wpisz Region&gt;" />
- </combo_box>
- <check_box label="Zapamiętaj Hasło" name="remember_check" />
- <button label="Połącz" label_selected="Połącz" name="connect_btn" />
- <text name="create_new_account_text">
- Utwórz nowe konto
- </text>
- <text name="forgot_password_text">
- Nie pamiętasz hasła?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ </panel.string>
+ <panel name="login_widgets">
+ <text name="first_name_text">
+ ImiÄ™:
+ </text>
+ <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ImiÄ™"/>
+ <text name="last_name_text">
+ Nazwisko
+ </text>
+ <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nazwisko"/>
+ <text name="password_text">
+ Hasło:
+ </text>
+ <button label="Zaloguj" label_selected="Zaloguj" name="connect_btn"/>
+ <text name="start_location_text">
+ Miejsce Startu:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Moje Ostatnie Miejsce" name="MyLastLocation"/>
+ <combo_box.item label="Moje Miejsce Startu" name="MyHome"/>
+ <combo_box.item label="&lt;Wpisz nazwÄ™ regionu&gt;" name="Typeregionname"/>
+ </combo_box>
+ <check_box label="Zapamiętaj Hasło" name="remember_check"/>
+ <text name="create_new_account_text">
+ Załóż Nowe Konto
+ </text>
+ <text name="forgot_password_text">
+ Nie pamiętasz swojego imienia lub hasła?
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
new file mode 100644
index 0000000000..e34fd69671
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Rzeczy" name="main inventory panel">
+ <panel.string name="Title">
+ Rzeczy
+ </panel.string>
+ <filter_editor label="Filtr" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Wszystkie Obiekty" name="All Items"/>
+ <inventory_panel label="Ostatnio Dodane Obiekty" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/>
+ <button name="add_btn" tool_tip="Dodaj nowy obiekt"/>
+ <dnd_button name="trash_btn" tool_tip="Usuń wybrany obiekt"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Plik" name="File">
+ <menu_item_call label="Otwórz" name="Open"/>
+ <menu label="Załaduj" name="upload">
+ <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Dźwięk (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nowe Okno" name="New Window"/>
+ <menu_item_call label="Pokaż Filtry" name="Show Filters"/>
+ <menu_item_call label="Zresetuj Filtry" name="Reset Current"/>
+ <menu_item_call label="Zamknij Wszystkie Foldery" name="Close All Folders"/>
+ <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/>
+ <menu_item_call label="Opróżnij Folder Zgubione i Znalezione" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Stwórz" name="Create">
+ <menu_item_call label="Nowy Folder" name="New Folder"/>
+ <menu_item_call label="Nowy Skrypt" name="New Script"/>
+ <menu_item_call label="NowÄ… NotÄ™" name="New Note"/>
+ <menu_item_call label="NowÄ… GesturkÄ™" name="New Gesture"/>
+ <menu label="Nowe Ubranie" name="New Clothes">
+ <menu_item_call label="NowÄ… KoszulkÄ™" name="New Shirt"/>
+ <menu_item_call label="Nowe Spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe Buty" name="New Shoes"/>
+ <menu_item_call label="Nowe Skarpetki" name="New Socks"/>
+ <menu_item_call label="NowÄ… KurtkÄ™" name="New Jacket"/>
+ <menu_item_call label="Nową Spódnicę" name="New Skirt"/>
+ <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="NowÄ… BieliznÄ™" name="New Underpants"/>
+ <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/>
+ <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
+ </menu>
+ <menu label="Nową Część Ciała" name="New Body Parts">
+ <menu_item_call label="Nowy Kształt" name="New Shape"/>
+ <menu_item_call label="Nową Skórkę" name="New Skin"/>
+ <menu_item_call label="Nowe Włosy" name="New Hair"/>
+ <menu_item_call label="Nowe Oczy" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="UporzÄ…dkuj" name="Sort">
+ <menu_item_check label="Wegług Nazwy" name="By Name"/>
+ <menu_item_check label="Według Daty" name="By Date"/>
+ <menu_item_check label="Foldery zawsze według nazwy" name="Folders Always By Name"/>
+ <menu_item_check label="Foldery Systemowe od Góry" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index 2b70a728fa..c3bd66274b 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
+ <panel.string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </panel.string>
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <check_box label="Czat Chmurkowy" name="bubble_text_chat"/>
+ <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/>
+ <slider label="Intensywność" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="width / height">
- Proporcje:
+ Proporcje
</text>
<combo_box name="aspect_ratio" tool_tip="width / height">
<combo_box.item label="4:3 (Standardowy CRT)" name="item1"/>
@@ -9,4 +18,31 @@
<combo_box.item label="8:5 (Panoramiczny)" name="item3"/>
<combo_box.item label="16:9 (Panoramiczny)" name="item4"/>
</combo_box>
+ <check_box label="Automatyczne Wykrywanie" name="aspect_auto_detect"/>
+ <text name="heading1">
+ Kamery:
+ </text>
+ <slider label="KÄ…t Widoku" name="camera_fov"/>
+ <slider label="Odległość" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatyczne pozycjonowanie dla:
+ </text>
+ <check_box label="Buduj/Edytuj" name="edit_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery aktywując i deaktywując tryb edycji"/>
+ <check_box label="Wygląd" name="appearance_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas trybu edycji"/>
+ <text name="heading3">
+ Awatary:
+ </text>
+ <check_box label="Pokaż w trybie widoku panoramicznego" name="first_person_avatar_visible"/>
+ <check_box label="Aktywacja klawiszy strzałek do poruszania awatarem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="kliknij-kliknij-przytrzymaj, aby uruchomić" name="tap_tap_hold_to_run"/>
+ <check_box label="Poruszaj ustami awatara kiedy używana jest komunikacja głosowa" name="enable_lip_sync"/>
+ <check_box label="Pokaż błędy skryptów" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="W czacie" name="0"/>
+ <radio_item label="W oknie" name="1"/>
+ </radio_group>
+ <check_box label="Uruchom tryb mówienia przez mikrofon podczas nasiśnięcia przycisku Mów:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteś w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteś w trybie mówienia, mikrofon przesyła Twój głos tylko w momencie aktywacji pełnej przycisku Mów."/>
+ <line_editor label="Naciśnij Mów by rozpocząć komunikację głosową" name="modifier_combo"/>
+ <button label="wybierz Klawisz" name="set_voice_hotkey_button"/>
+ <button label="Åšrodkowy Przycisk Myszki" name="set_voice_middlemouse_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
index 7826af8b03..7195c30f20 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
@@ -1,21 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Informacje" name="popups" title="Popups">
- <text name="dont_show_label">
- Ukryj te informacje:
+ <text name="tell_me_label">
+ Powiadom mnie:
</text>
- <button label="Pokazuj TÄ™ InformacjÄ™" name="enable_popup" />
- <button label="Pokazuj Wszystko..." name="reset_dialogs_btn"
- tool_tip="Wyświetlaj wszystkie opcjonalne i &apos;Użyte pierwszy raz&apos; informacje." />
+ <check_box label="Kiedy wydajÄ™ lub otrzymujÄ™ L$" name="notify_money_change_checkbox"/>
+ <check_box label="Kiedy moi znajomi siÄ™ logujÄ… lub wylogowujÄ…" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Pokazuj te informacje:
+ Zawsze pokazuj te powiadomienia:
</text>
- <button label="Ukryj TÄ™ InformacjÄ™..." name="skip_dialogs_btn"
- tool_tip="Nie wyświetlaj żadnych opcjonalnych i &apos;Użyte pierwszy raz&apos; informacji" />
- <text name="text_box2">
- Oferty notek, obrazów i miejsc (LM):
+ <text name="dont_show_label">
+ Nigdy nie pokazuj tych powiadomień:
</text>
- <check_box label="Akceptuj automatycznie" name="accept_new_inventory" />
- <check_box label="Wyświetlaj automatycznie po akceptacji" name="show_new_inventory" />
- <check_box label="Automatycznie pokazuj nowe obiekty w szafie po akceptacji"
- name="show_in_inventory" />
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 13b66ed242..5599c21686 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Czat/IM" name="chat">
- <text name="text_box">
- Rozmiar Czcionki Czatu:
- </text>
- <radio_group name="chat_font_size">
- <radio_item name="radio" label="Mała" />
- <radio_item name="radio2" label="Åšrednia" />
- <radio_item name="radio3" label="Duża" />
- </radio_group>
+ <radio_group name="chat_font_size">
+ <radio_item label="Mała" name="radio"/>
+ <radio_item label="Åšrednia" name="radio2"/>
+ <radio_item label="Duża" name="radio3"/>
+ </radio_group>
<color_swatch label="Ty" name="user"/>
<text name="text_box1">
- Ty
+ Ja
</text>
<color_swatch label="Inni" name="agent"/>
<text name="text_box2">
@@ -36,22 +33,10 @@
<text name="text_box7">
Właściciel
</text>
- <color_swatch label="Chmurka" name="background"/>
- <text name="text_box8">
- Chmurka
- </text>
<color_swatch label="Linki" name="links"/>
<text name="text_box9">
Linki
</text>
- <check_box label="Pokazuj ostrzeżenia i błędy skryptu w czacie" name="script_errors_as_chat" />
- <spinner label="Zamykaj czat w" name="fade_chat_time" />
- <slider label="Przeźroczystość" name="console_opacity" />
- <check_box label="Używaj pełnej szerokość ekranu (restart wymagany)" name="chat_full_width_check" />
- <check_box label="Zamknij panel czatu po naciśnięciu Wróć" name="close_chat_on_return_check" />
- <check_box label="Strzałki sterują awatarem podczas czatu" name="arrow_keys_move_avatar_check" />
- <check_box label="Pokazuj czas w czacie" name="show_timestamps_check" />
- <check_box label="Używaj animacji podczas pisania" name="play_typing_animation" />
- <check_box label="Pokazuj chmurki w czacie" name="bubble_text_chat" />
- <slider label="Przeźroczystość" name="bubble_chat_opacity" />
+ <check_box initial_value="true" label="Używaj animacji podczas pisania" name="play_typing_animation"/>
+ <check_box label="Wysyłaj wszystkie wiadomości (IM) na moją skrzynkę pocztową kiedy jestem niedostępny" name="send_im_to_email"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 97b4975f29..97b4975f29 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
index ddd4c736d6..ddd4c736d6 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index e3cdaae840..e3cdaae840 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
index 1e2289b496..1e2289b496 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index 64e3acfcde..f9b5d221a5 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -1,40 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Audio i Video" name="Preference Media panel">
- <slider label="Master" name="System Volume"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Dźwięki" name="Preference Media panel">
+ <slider label="Główny" name="System Volume"/>
+ <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/>
<slider label="Otoczenie" name="Wind Volume"/>
- <slider label="Dźwięki" name="SFX Volume"/>
+ <slider label="Interfejs" name="UI Volume"/>
<slider label="Media" name="Media Volume"/>
- <slider label="UI" name="UI Volume"/>
- <slider label="Muzyka" name="Music Volume"/>
+ <slider label="Efekty Dźwiękowe" name="SFX Volume"/>
+ <slider label="Muzyka Strumieniowa" name="Music Volume"/>
+ <check_box label="Głos" name="enable_voice_check"/>
<slider label="Głos" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Rozmowy są Niedostępne
- </text_editor>
- <check_box label="Pozwól na Rozmowy" name="enable_voice_check"/>
+ <text name="Listen from">
+ Odtwarzaj z:
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Odtwarzaj głos z pozycji kamery" />
- <radio_item name="1" label="Odtwarzaj głos z pozycji awatara" />
+ <radio_item label="Pozycji kamery" name="0"/>
+ <radio_item label="Pozycji Awatara" name="1"/>
</radio_group>
- <button label="Ustawienia Sprzętowe" name="device_settings_btn"/>
- <text name="muting_text">
- Głośność:
- </text>
- <text name="streaming_prefs_text">
- Ustawienia Strumieni:
- </text>
- <text name="audio_prefs_text">
- Ustawienia Audio:
- </text>
- <panel label="Głośność" name="Volume Panel" />
- <check_box label="Odtwarzaj Strumienie Muzyki"
- name="streaming_music" />
- <check_box label="Odtwarzaj Strumienie Video"
- name="streaming_video" />
- <check_box label="Automatycznie Odtwarzaj Media" name="auto_streaming_video" />
- <check_box label="Wyciszaj Audio Podczas Minimalizacji Okna" name="mute_when_minimized" />
- <slider label="Efekt Dopplera" name="Doppler Effect" />
- <slider label="Wpływ Dystansu" name="Distance Factor" />
- <slider label="Wyciszanie" name="Rolloff Factor" />
- <spinner label="Próg Zmiany L$" name="L$ Change Threshold" />
- <spinner label="Próg Zmiany Statusu" name="Health Change Threshold" />
+ <button label="Wejściowe/Wyjściowe Urządzenia" name="device_settings_btn"/>
+ <panel label="Ustawienia Sprzętowe" name="device_settings_panel">
+ <panel.string name="default_text">
+ Domyślne
+ </panel.string>
+ <text name="Input">
+ Wejściowe
+ </text>
+ <text name="My volume label">
+ Moja głośność:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Zmień próg głośności korzystając z tego suwaka"/>
+ <text name="wait_text">
+ Proszę czekać
+ </text>
+ <text name="Output">
+ Wyjściowe
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
index f20387dd25..f20387dd25 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_region_debug.xml b/indra/newview/skins/default/xui/pl/panel_region_debug.xml
index fe7b554a13..fe7b554a13 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_debug.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_region_estate.xml b/indra/newview/skins/default/xui/pl/panel_region_estate.xml
index 4275f3f647..4275f3f647 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_estate.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_region_general.xml b/indra/newview/skins/default/xui/pl/panel_region_general.xml
index 20296dac71..20296dac71 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_general.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
index b206616e34..b206616e34 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_region_texture.xml b/indra/newview/skins/default/xui/pl/panel_region_texture.xml
index d24579fc75..d24579fc75 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_texture.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
index 70a6e39412..70a6e39412 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
index 9226e67dff..9226e67dff 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_world_map.xml b/indra/newview/skins/default/xui/pl/panel_world_map.xml
index 608f102dc9..70479fe209 100644
--- a/indra/newview/skins/default/xui/pl/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/pl/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Åadowanie...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Niewłaściwa Lokalizacja
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/pl/role_actions.xml b/indra/newview/skins/default/xui/pl/role_actions.xml
index 5711eacf2f..5711eacf2f 100755..100644
--- a/indra/newview/skins/default/xui/pl/role_actions.xml
+++ b/indra/newview/skins/default/xui/pl/role_actions.xml
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 1f67944f86..e8dcfac02d 100755..100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -4,9 +4,21 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SUPPORT_SITE">
+ Portal Pomocy Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Wykrywanie dysku twardego...
+ </string>
+ <string name="StartupLoading">
+ Åadowanie
+ </string>
<string name="LoginInProgress">
Trwa logowanie. [APP_NAME] Proszę czekać.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Logowanie...
+ </string>
<string name="LoginAuthenticating">
Autoryzacja
</string>
@@ -25,8 +37,11 @@
<string name="LoginInitializingMultimedia">
Inicjalizacja multimediów...
</string>
+ <string name="LoginInitializingFonts">
+ Åadowanie czcionek...
+ </string>
<string name="LoginVerifyingCache">
- Weryfikacja plików z bazy danych (może zająć 60-90 sekund)...
+ Weryfikacja bufora danych na dysku (może trwać od 60 do 90 sekund)...
</string>
<string name="LoginProcessingResponse">
Przetwarzanie Odpowiedzi...
@@ -55,8 +70,11 @@
<string name="LoginDownloadingClothing">
Åadowanie ubrania...
</string>
+ <string name="LoginFailedNoNetwork">
+ Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
+ </string>
<string name="Quit">
- Wyjdź
+ Wyłącz Program
</string>
<string name="AgentLostConnection">
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
@@ -76,39 +94,9 @@
<string name="TooltipIsGroup">
(Grupa)
</string>
- <string name="TooltipFlagScript">
- Skrypt
- </string>
- <string name="TooltipFlagPhysics">
- Fizyka
- </string>
- <string name="TooltipFlagTouch">
- Dotyk
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Usuń z Szafy
- </string>
- <string name="TooltipFlagPhantom">
- Fantom
- </string>
- <string name="TooltipFlagTemporary">
- Tymczasowy
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Menu - wciśnij prawy klawisz)
- </string>
- <string name="TooltipFreeToCopy">
- Za darmo
- </string>
<string name="TooltipForSaleL$">
Na Sprzedaż: L$[AMOUNT]
</string>
- <string name="TooltipForSaleMsg">
- Na Sprzedaż: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Budowanie Grupowe
</string>
@@ -136,6 +124,76 @@
<string name="TooltipMustSingleDrop">
Tylko pojedynczy obiekt może być tutaj przeciągnięty
</string>
+ <string name="TooltipHttpUrl">
+ Kliknij by zobaczyć zawartość tej strony internetowej
+ </string>
+ <string name="TooltipSLURL">
+ Kliknij by zobaczyć szczegóły tego miejsca
+ </string>
+ <string name="TooltipAgentUrl">
+ Kliknij by zobaczyć profil tego rezydenta
+ </string>
+ <string name="TooltipGroupUrl">
+ Kliknij by zobaczyć opis tej grupy
+ </string>
+ <string name="TooltipEventUrl">
+ Klinij by zobaczyć szczegóły tego wydarzenia
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Kliknij by zobaczyć tę reklamę
+ </string>
+ <string name="TooltipParcelUrl">
+ Kliknij by zobaczyć opis tej posiadłości
+ </string>
+ <string name="TooltipTeleportUrl">
+ Kliknij by teleportować się do tego miejsca
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Kliknij by zobaczyć opis tego obiektu
+ </string>
+ <string name="TooltipMapUrl">
+ Kliknij by zobaczyć to miejsce na mapie
+ </string>
+ <string name="TooltipSLAPP">
+ Kliknij by uruchomić secondlife:// command
+ </string>
+ <string name="CurrentURL" value=" Obecny Adres: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportuj do
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Pokaż na Mapie
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Zamknij (&#8984;W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Zamknij (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Odzyskaj
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimalizuj
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Oderwij
+ </string>
+ <string name="BUTTON_DOCK">
+ Przyłącz
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Odłącz
+ </string>
+ <string name="BUTTON_HELP">
+ Pokaż Pomoc
+ </string>
+ <string name="Searching">
+ Wyszukiwanie...
+ </string>
+ <string name="NoneFound">
+ Nieodnaleziono.
+ </string>
<string name="RetrievingData">
Odzyskiwanie danych...
</string>
@@ -190,8 +248,77 @@
<string name="AssetErrorUnknownStatus">
Status nieznany
</string>
- <string name="AvatarEditingApparance">
- (Edycja WyglÄ…du)
+ <string name="texture">
+ tekstury
+ </string>
+ <string name="sound">
+ dźwięku
+ </string>
+ <string name="calling card">
+ wizytówki
+ </string>
+ <string name="landmark">
+ ulubionego miejsca
+ </string>
+ <string name="legacy script">
+ skryptu
+ </string>
+ <string name="clothing">
+ ubrania
+ </string>
+ <string name="object">
+ obieku
+ </string>
+ <string name="note card">
+ notatki
+ </string>
+ <string name="folder">
+ folderu
+ </string>
+ <string name="root">
+ podstawy
+ </string>
+ <string name="lsl2 script">
+ skryptu LSL2
+ </string>
+ <string name="lsl bytecode">
+ kodu LSL
+ </string>
+ <string name="tga texture">
+ tekstury typu tga
+ </string>
+ <string name="body part">
+ części ciała
+ </string>
+ <string name="snapshot">
+ zdjęcia
+ </string>
+ <string name="lost and found">
+ Zgubione i Odnalezione
+ </string>
+ <string name="targa image">
+ obrau typu targa
+ </string>
+ <string name="trash">
+ Kosz
+ </string>
+ <string name="jpeg image">
+ obrazu typu jpeg
+ </string>
+ <string name="animation">
+ animacji
+ </string>
+ <string name="gesture">
+ gesturki
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ulubione
+ </string>
+ <string name="symbolic link">
+ link
</string>
<string name="AvatarAway">
Åšpi
@@ -413,7 +540,19 @@
Åadowanie...
</string>
<string name="worldmap_offline">
- Niedostępna
+ Mapa Świata jest Niedostępna
+ </string>
+ <string name="worldmap_results_none_found">
+ Miejsce Nieodnalezione.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Przedwczesna końcówka pliku
+ </string>
+ <string name="ST_NO_JOINT">
+ PODSTAWA lub ÅÄ„CZNIK nieodnaleziona/y
</string>
<string name="whisper">
szepcze:
@@ -421,6 +560,57 @@
<string name="shout">
krzyczy:
</string>
+ <string name="ringing">
+ ÅÄ…czenie z rozmowami gÅ‚osem w Å›wiecie...
+ </string>
+ <string name="connected">
+ Połączenie uzyskane.
+ </string>
+ <string name="unavailable">
+ Niestety, rozmowy głosem są niedozwolone w tym miejscu.
+ </string>
+ <string name="hang_up">
+ Połączenie rozmowy utracone.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], nie pozwala Ci na: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Zabiera Lindeny (L$) od Ciebie
+ </string>
+ <string name="ActOnControlInputs">
+ Używaj klawiszy sterowania
+ </string>
+ <string name="RemapControlInputs">
+ Zmień klawisze sterowania
+ </string>
+ <string name="AnimateYourAvatar">
+ Animuj Awatara
+ </string>
+ <string name="AttachToYourAvatar">
+ Dołącz do Awatara
+ </string>
+ <string name="ReleaseOwnership">
+ Usuń prawo własności (zmień na publiczne)
+ </string>
+ <string name="LinkAndDelink">
+ ÅÄ…cz / odłącz z innymi obiektów
+ </string>
+ <string name="AddAndRemoveJoints">
+ Dodaj / usuń połączenia z innymi obiektami
+ </string>
+ <string name="ChangePermissions">
+ Ustaw zezwolenia
+ </string>
+ <string name="TrackYourCamera">
+ Chodź za kamerą
+ </string>
+ <string name="ControlYourCamera">
+ Kontroluj kamerÄ™
+ </string>
<string name="SIM_ACCESS_PG">
&apos;PG&apos;
</string>
@@ -439,8 +629,6 @@
<string name="land_type_unknown">
(nieznane)
</string>
- <string name="covenant_never_modified">Ostatnia Modyfikacja: (nigdy)</string>
- <string name="covenant_modified">Ostatnia Modyfikacja: </string>
<string name="all_files">
Wszystkie Pliki
</string>
@@ -486,18 +674,733 @@
<string name="choose_the_directory">
Wybierz Katalog
</string>
- <string name="accel-mac-control">
- &#8963;
+ <string name="AvatarSetNotAway">
+ Ustaw Nie Åšpij
+ </string>
+ <string name="AvatarSetAway">
+ Åšpij
+ </string>
+ <string name="AvatarSetNotBusy">
+ Ustawiaj Nie Pracuj
+ </string>
+ <string name="AvatarSetBusy">
+ Pracuj
+ </string>
+ <string name="shape">
+ Kształt
+ </string>
+ <string name="skin">
+ Skórka
+ </string>
+ <string name="hair">
+ Włosy
+ </string>
+ <string name="eyes">
+ Oczy
+ </string>
+ <string name="shirt">
+ Koszulka
+ </string>
+ <string name="pants">
+ Spodnie
+ </string>
+ <string name="shoes">
+ Buty
+ </string>
+ <string name="socks">
+ Skarpetki
+ </string>
+ <string name="jacket">
+ Kurtka
+ </string>
+ <string name="gloves">
+ Rękawiczki
+ </string>
+ <string name="undershirt">
+ Podkoszulka
+ </string>
+ <string name="underpants">
+ Bielizna
+ </string>
+ <string name="skirt">
+ Spódnica
+ </string>
+ <string name="alpha">
+ Ubranie Przezroczyste
+ </string>
+ <string name="tattoo">
+ Tatuaż
+ </string>
+ <string name="invalid">
+ niewłaściwa funkcja
+ </string>
+ <string name="next">
+ Następne
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Ogłoszenie Grupowe
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Ogłoszenia Grupowe
+ </string>
+ <string name="GroupNotifySentBy">
+ Wysłane przez
+ </string>
+ <string name="GroupNotifyAttached">
+ Załączone:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Zobacz poprzednie zawiadomienia lub otrzymanen wiadomości tutaj.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Otwórz Załącznik
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Zapisz Załącznik
+ </string>
+ <string name="TeleportOffer">
+ Oferta teleportacji
+ </string>
+ <string name="StartUpNotification">
+ [%d] nowe zawiadomienie zostało wysłane kiedy byłeś w trybie oddalenia...
+ </string>
+ <string name="StartUpNotifications">
+ [%d] nowe zawiadomienia zostały wysłane kiedy byłeś w trybie oddalenia...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Masz jeszcze [%d] powiadomień
+ </string>
+ <string name="BodyPartsRightArm">
+ Prawe RamiÄ™
+ </string>
+ <string name="BodyPartsHead">
+ Głowa
+ </string>
+ <string name="BodyPartsLeftArm">
+ Lewe RamiÄ™
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Lewa Noga
+ </string>
+ <string name="BodyPartsTorso">
+ Tułów
+ </string>
+ <string name="BodyPartsRightLeg">
+ Prawa Noga
+ </string>
+ <string name="GraphicsQualityLow">
+ Niska
+ </string>
+ <string name="GraphicsQualityMid">
+ Åšrednia
+ </string>
+ <string name="GraphicsQualityHigh">
+ Wysoka
+ </string>
+ <string name="LeaveMouselook">
+ Wybierz ESC by powrócić do trybu widoku normalne
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Brak wyników w szafie dla wpisanego słowa.
+ </string>
+ <string name="InventoryNoTexture">
+ Nie posiadasz kopi
+tej tekstury w swojej szafie
+ </string>
+ <string name="no_transfer" value=" (brak oddawania)"/>
+ <string name="no_modify" value=" (brak modyfikowania)"/>
+ <string name="no_copy" value=" (brak kopiowania)"/>
+ <string name="worn" value=" (załóż)"/>
+ <string name="link" value=" (link)"/>
+ <string name="broken_link" value=" (broken_link)"/>
+ <string name="LoadingContents">
+ Åadowanie zawartoÅ›ci...
+ </string>
+ <string name="NoContents">
+ Brak zawartości
+ </string>
+ <string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/>
+ <string name="Chat" value=" Czat :"/>
+ <string name="Sound" value=" Dźwięk :"/>
+ <string name="Wait" value=" --- Zaczekaj :"/>
+ <string name="AnimFlagStop" value=" Zatrzymaj AnimacjÄ™ :"/>
+ <string name="AnimFlagStart" value=" Rozpocznij AnimacjÄ™ :"/>
+ <string name="Wave" value=" Wave"/>
+ <string name="HelloAvatar" value=" Witaj, Awatarze!"/>
+ <string name="ViewAllGestures" value=" Zobacz Wszystkie &gt;&gt;"/>
+ <string name="Animations" value=" Animacje,"/>
+ <string name="Calling Cards" value=" Wizytówki,"/>
+ <string name="Clothing" value=" Ubrania,"/>
+ <string name="Gestures" value=" Gesturki,"/>
+ <string name="Landmarks" value=" Ulubione Miejsca,"/>
+ <string name="Notecards" value=" Notki,"/>
+ <string name="Objects" value=" Obiekty,"/>
+ <string name="Scripts" value=" Skrypty,"/>
+ <string name="Sounds" value=" Dźwięki,"/>
+ <string name="Textures" value=" Tekstury,"/>
+ <string name="Snapshots" value=" Zdjęcia,"/>
+ <string name="No Filters" value="Nie "/>
+ <string name="Since Logoff" value=" - od wylogowania siÄ™"/>
+ <string name="InvFolder My Inventory">
+ Moja Szafa
+ </string>
+ <string name="InvFolder My Favorites">
+ Moje Ulubione
+ </string>
+ <string name="InvFolder Library">
+ Biblioteka
+ </string>
+ <string name="InvFolder Textures">
+ Tekstury
+ </string>
+ <string name="InvFolder Sounds">
+ Dźwięki
+ </string>
+ <string name="InvFolder Calling Cards">
+ Wizytówki
+ </string>
+ <string name="InvFolder Landmarks">
+ Ulubione Miejsca
+ </string>
+ <string name="InvFolder Scripts">
+ Skrypty
+ </string>
+ <string name="InvFolder Clothing">
+ Ubrania
+ </string>
+ <string name="InvFolder Objects">
+ Obiekty
+ </string>
+ <string name="InvFolder Notecards">
+ Noty
+ </string>
+ <string name="InvFolder New Folder">
+ Nowy Folder
+ </string>
+ <string name="InvFolder Inventory">
+ Szafa
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Nieskompresowane Obrazy
+ </string>
+ <string name="InvFolder Body Parts">
+ Części Ciała
+ </string>
+ <string name="InvFolder Trash">
+ Kosz
+ </string>
+ <string name="InvFolder Photo Album">
+ Album ze Zdjęciami
+ </string>
+ <string name="InvFolder Lost And Found">
+ Zagubione i Odnalezione
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Nieskompresowane Dźwięki
+ </string>
+ <string name="InvFolder Animations">
+ Animacje
+ </string>
+ <string name="InvFolder Gestures">
+ Gesturki
+ </string>
+ <string name="InvFolder favorite">
+ Ulubione
+ </string>
+ <string name="InvFolder Current Outfit">
+ Obecne Ubranie
+ </string>
+ <string name="InvFolder My Outfits">
+ Moje Ubranie
+ </string>
+ <string name="InvFolder Friends">
+ Znajomi
+ </string>
+ <string name="InvFolder All">
+ Wszystkie
+ </string>
+ <string name="Buy">
+ Kup
+ </string>
+ <string name="BuyforL$">
+ Kup za L$
+ </string>
+ <string name="Stone">
+ Kamień
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Szkło
+ </string>
+ <string name="Wood">
+ Drewno
+ </string>
+ <string name="Flesh">
+ Tkanka
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Guma
+ </string>
+ <string name="Light">
+ Lekkie
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Klatka Piersiowa
+ </string>
+ <string name="Skull">
+ Czaszka
+ </string>
+ <string name="Left Shoulder">
+ Lewe RamiÄ™
+ </string>
+ <string name="Right Shoulder">
+ Prawe RamiÄ™
+ </string>
+ <string name="Left Hand">
+ Lewa Dłoń
+ </string>
+ <string name="Right Hand">
+ Prawa Dłoń
+ </string>
+ <string name="Left Foot">
+ Lewa Stopa
+ </string>
+ <string name="Right Foot">
+ Prawa Stopa
+ </string>
+ <string name="Spine">
+ Kręgosłup
+ </string>
+ <string name="Pelvis">
+ Mednica
+ </string>
+ <string name="Mouth">
+ Usta
+ </string>
+ <string name="Chin">
+ Szczęka
+ </string>
+ <string name="Left Ear">
+ Lewe Ucho
+ </string>
+ <string name="Right Ear">
+ Prawe Ucho
+ </string>
+ <string name="Left Eyeball">
+ Lewe Oko
+ </string>
+ <string name="Right Eyeball">
+ Prawe Oko
+ </string>
+ <string name="Nose">
+ Nos
+ </string>
+ <string name="R Upper Arm">
+ P RamiÄ™
+ </string>
+ <string name="R Forearm">
+ P PrzedramiÄ™
+ </string>
+ <string name="L Upper Arm">
+ L RamiÄ™
+ </string>
+ <string name="L Forearm">
+ L PrzedramiÄ™
+ </string>
+ <string name="Right Hip">
+ Prawe Biodro
+ </string>
+ <string name="R Upper Leg">
+ P Udo
+ </string>
+ <string name="R Lower Leg">
+ P Dolna Noga
+ </string>
+ <string name="Left Hip">
+ Lewe Biodro
+ </string>
+ <string name="L Upper Leg">
+ L Udo
+ </string>
+ <string name="L Lower Leg">
+ L Dolna Noga
+ </string>
+ <string name="Stomach">
+ Brzuch
+ </string>
+ <string name="Left Pec">
+ Left Pec
+ </string>
+ <string name="Right Pec">
+ Right Pec
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ Dołączył dzisiaj
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] rok
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] lat
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] lat
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] miesiÄ…c
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] miesięcy
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] miesięcy
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] tydzień
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] tygodni
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] tygodni
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dzień
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dni
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dni
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] członek
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] członków
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] członków
+ </string>
+ <string name="AcctTypeResident">
+ Rezydent
+ </string>
+ <string name="AcctTypeTrial">
+ Proces
</string>
- <string name="accel-mac-command">
- &#8984;
+ <string name="AcctTypeCharterMember">
+ Wyróżniony Członek
</string>
- <string name="accel-mac-option">
- &#8997;
+ <string name="AcctTypeEmployee">
+ Pracownik Linden Lab
</string>
- <string name="accel-mac-shift">
- &#8679;
+ <string name="PaymentInfoUsed">
+ Dane Konta Używane
</string>
+ <string name="PaymentInfoOnFile">
+ Dane Płatnicze na Koncie
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Brak Danych na Koncie
+ </string>
+ <string name="AgeVerified">
+ Weryfikacja Wieku Przeprowadzona
+ </string>
+ <string name="NotAgeVerified">
+ Brak Weryfikacji Wieku
+ </string>
+ <string name="Center 2">
+ Åšrodek 2
+ </string>
+ <string name="Top Right">
+ Prawa Góra
+ </string>
+ <string name="Top">
+ Góra
+ </string>
+ <string name="Top Left">
+ Lewa Góra
+ </string>
+ <string name="Center">
+ Åšrodek
+ </string>
+ <string name="Bottom Left">
+ Lewy Dół
+ </string>
+ <string name="Bottom">
+ Dół
+ </string>
+ <string name="Bottom Right">
+ Prawy Dół
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Pobieranie zakończone, rozpoczęcie kompilacji
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Skrypt nie został odnaleziony na serwerze.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem z pobieraniem
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Brak odpowiedniej zgody do pobrania skryptu.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Brak odpowiedniej zgody dla
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Nieznany błąd podczas próby pobierania
+ </string>
+ <string name="CompileQueueTitle">
+ Postęp Rekompilacji
+ </string>
+ <string name="CompileQueueStart">
+ rekompiluj
+ </string>
+ <string name="ResetQueueTitle">
+ Zresetuj
+ </string>
+ <string name="ResetQueueStart">
+ zresetuj
+ </string>
+ <string name="RunQueueTitle">
+ Ustaw Uruchomiaj Progres
+ </string>
+ <string name="RunQueueStart">
+ ustaw uruchom
+ </string>
+ <string name="NotRunQueueTitle">
+ Ustaw Nie Uruchamiaj Progres
+ </string>
+ <string name="NotRunQueueStart">
+ ustaw nie uruchamiaj
+ </string>
+ <string name="CompileSuccessful">
+ Kompliacja zakończona pomyślnie!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Komplilacja zakończona pomyślnie, zapisywanie...
+ </string>
+ <string name="SaveComplete">
+ Zapisywanie zakończone.
+ </string>
+ <string name="ObjectOutOfRange">
+ Skrypt (obiekt poza zasięgiem)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Obiekt [OBJECT] należący [OWNER]
+ </string>
+ <string name="GroupsNone">
+ żadne
+ </string>
+ <string name="Group" value=" (groupa)"/>
+ <string name="Unknown">
+ (nieznane)
+ </string>
+ <string name="SummaryForTheWeek" value="Podsumowanie dla tego tygodnia, poczÄ…wszy od "/>
+ <string name="NextStipendDay" value="Następna wypłata będzie w "/>
+ <string name="GroupIndividualShare" value=" Groupa Udziały Indywidualne"/>
+ <string name="Balance">
+ Stan
+ </string>
+ <string name="Credits">
+ Kredyty
+ </string>
+ <string name="Debits">
+ Debet
+ </string>
+ <string name="Total">
+ Suma
+ </string>
+ <string name="NoGroupDataFound">
+ Brak informacji na temat podanej grupy
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ główny
+ </string>
+ <string name="IMTeen">
+ dla niepełnoletnich
+ </string>
+ <string name="RegionInfoError">
+ błąd
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ wszystkie majątki, które są własnością [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ wszystkie majątki, które posiadasz
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ wszystkie majątki, które nadzorujesz dla [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Rezydenci mający dostęp: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupy mające dostęp: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Linia [LINE], Kolumna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] odnalezionych
+ </string>
+ <string name="PanelContentsNewScript">
+ Nowy Skrypt
+ </string>
+ <string name="MuteByName">
+ (według nazwy)
+ </string>
+ <string name="MuteAgent">
+ (rezydenta)
+ </string>
+ <string name="MuteObject">
+ (obiekt)
+ </string>
+ <string name="MuteGroup">
+ (grupÄ™)
+ </string>
+ <string name="RegionNoCovenant">
+ Brak umowy dla tego majÄ…tku.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Brak umowy dla tego majątku. Każda posiadłość w tym majątku została sprzedana przez Właściciela majątku nie Linden Lab. Skontaktuj się z właścicielem majątku w celu uzuskania szczegółów sprzedaży.
+ </string>
+ <string name="covenant_last_modified">
+ Ostatnia Modyfikacja:
+ </string>
+ <string name="none_text" value=" (żadne) "/>
+ <string name="never_text" value=" (nigdy) "/>
+ <string name="GroupOwned">
+ Własność Grupy
+ </string>
+ <string name="Public">
+ Publiczny
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Kliknij: [TELEPORT] teleportuj, [MAP] mapa, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (zostanie zaktualizowane po publikacji)
+ </string>
+ <string name="MultiPreviewTitle">
+ PodglÄ…d
+ </string>
+ <string name="MultiPropertiesTitle">
+ Właściwości
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Obiekt o nazwie
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ należacy do grupy
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ należący do nieznanej grupy
+ </string>
+ <string name="InvOfferOwnedBy">
+ należy do
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ należący do nieznanego właściciela
+ </string>
+ <string name="InvOfferGaveYou">
+ oddany Tobie
+ </string>
+ <string name="InvOfferYouDecline">
+ Odrzucony przez Ciebie
+ </string>
+ <string name="InvOfferFrom">
+ od
+ </string>
+ <string name="GroupMoneyTotal">
+ Suma
+ </string>
+ <string name="GroupMoneyBought">
+ zakupione
+ </string>
+ <string name="GroupMoneyPaidYou">
+ zapłać sobie
+ </string>
+ <string name="GroupMoneyPaidInto">
+ zapłać do
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ kup dostęp do
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ zapłać opłatę za wydarzenie
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ zapłać za wydarzenia
+ </string>
+ <string name="GroupMoneyBalance">
+ Stan
+ </string>
+ <string name="GroupMoneyCredits">
+ Kredyty
+ </string>
+ <string name="GroupMoneyDebits">
+ Debet
+ </string>
+ <string name="ViewerObjectContents">
+ Zawartość
+ </string>
+ <string name="AcquiredItems">
+ Zdobyte Obiekty
+ </string>
+ <string name="Cancel">
+ Anuluj
+ </string>
+ <string name="UploadingCosts">
+ Koszty załadowania [%s]
+ </string>
+ <string name="UnknownFileExtension">
+ Nieznane rozszerzenie dla pliku [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Dodaj Ulubione Miejsce...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Edytuj Ulubione Miejce...
+ </string>
+ <string name="accel-mac-control">&#8963;</string>
+ <string name="accel-mac-command">&#8984;</string>
+ <string name="accel-mac-option">&#8997;</string>
+ <string name="accel-mac-shift">&#8679;</string>
<string name="accel-win-control">
Ctrl+
</string>
@@ -507,81 +1410,1790 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
- Niska
+ <string name="FileSaved">
+ Zapisane Pliki
</string>
- <string name="GraphicsQualityMid">
- Åšrednia
+ <string name="Receiving">
+ Otrzymane
</string>
- <string name="GraphicsQualityHigh">
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Do Przodu
+ </string>
+ <string name="Left">
+ W Lewo
+ </string>
+ <string name="Right">
+ W Prawo
+ </string>
+ <string name="Back">
+ Wróć
+ </string>
+ <string name="North">
+ Północ
+ </string>
+ <string name="South">
+ Południe
+ </string>
+ <string name="West">
+ Zachód
+ </string>
+ <string name="East">
+ Wschód
+ </string>
+ <string name="Up">
+ W Górę
+ </string>
+ <string name="Down">
+ W Dół
+ </string>
+ <string name="Any Category">
+ Każda Kategoria
+ </string>
+ <string name="Shopping">
+ Zakupy
+ </string>
+ <string name="Land Rental">
+ Wynajem Ziemi
+ </string>
+ <string name="Property Rental">
+ Wynajem Posiadłości
+ </string>
+ <string name="Special Attraction">
+ Specjalne Oferty
+ </string>
+ <string name="New Products">
+ Nowe Produkty
+ </string>
+ <string name="Employment">
+ Praca
+ </string>
+ <string name="Wanted">
+ Poszukiwane
+ </string>
+ <string name="Service">
+ Serwis
+ </string>
+ <string name="Personal">
+ Personalne
+ </string>
+ <string name="None">
+ Żadne
+ </string>
+ <string name="Linden Location">
+ Linden Lokacja
+ </string>
+ <string name="Adult">
+ &apos;Adult&apos;
+ </string>
+ <string name="Arts&amp;Culture">
+ Sztuka i Kultura
+ </string>
+ <string name="Business">
+ Biznes
+ </string>
+ <string name="Educational">
+ Edukacyjna
+ </string>
+ <string name="Gaming">
+ Gra
+ </string>
+ <string name="Hangout">
+ Poznawanie ludzi
+ </string>
+ <string name="Newcomer Friendly">
+ Przyjazne dla nowych
+ </string>
+ <string name="Parks&amp;Nature">
+ Park i Natura
+ </string>
+ <string name="Residential">
+ Mieszkalna
+ </string>
+ <string name="Stage">
+ Scena
+ </string>
+ <string name="Other">
+ Inna
+ </string>
+ <string name="Any">
+ Jakiekolwiek
+ </string>
+ <string name="You">
+ Ty
+ </string>
+ <string name="Multiple Media">
+ Multi Media
+ </string>
+ <string name="Play Media">
+ Uruchom/Zatrzymaj Media
+ </string>
+ <string name="MBCmdLineError">
+ Podczas realizacji podanej komendy, wystąpił błąd.
+Prosimy odwiedzić stronę internetową: http://wiki.secondlife.com/wiki/Client_parameters
+Błąd:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] zastosowana komenda:
+ </string>
+ <string name="MBUnableToAccessFile">
+ Aplikacja [APP_NAME] nie odnalazła poszukiwanego pliku.
+
+Może być to spowodowane aktywnością kilku kopii oprogramowania w tej samej chwili lub Twój system błędnie odczytuje proces zakończenia dla uruchomionuch aplikacji.
+Jeżeli nadal otrzymujesz ten komunikat, uruchom swój komputer ponownie.
+Jeżeli problem nadal występuje, proponujemy całkowite odinstalowanie aplikacji [APP_NAME] oraz ponowną jej instalację.
+ </string>
+ <string name="MBFatalError">
+ Błąd Krytyczny
+ </string>
+ <string name="MBRequiresAltiVec">
+ Aplikacja [APP_NAME] wymaga procesora z AltiVec (wersja G4 lub starsza).
+ </string>
+ <string name="MBAlreadyRunning">
+ Aplikacja [APP_NAME] została już uruchomiona.
+Sprawdź czy Twój pasek aplikacji nie ma zminimaliwoanych okien programu.
+Jeżeli nadal otrzymujesz ten komunikat, uruchom swój komputer ponownie.
+ </string>
+ <string name="MBFrozenCrashed">
+ Aplikacja [APP_NAME] znajduje się w trybie zatrzymania lub zawieszenia po poprzedniej próbie uruchomienia.
+Czy chcesz wysłać raport na temat zawieszenia?
+ </string>
+ <string name="MBAlert">
+ Powiadomienie
+ </string>
+ <string name="MBNoDirectX">
+ Aplikacja [APP_NAME] nie wykryła oprogramowania DirectX 9.0b lub wersji nowszej.
+[APP_NAME] używa oprogramowaniau DirectX w celu detekcji dysku twardego i/lub nieaktualizowanych dysków twardych, które mogą przyczynić się do obniżenia stabilności, wydajności systemoweu oraz zawieszeń. Jeżeli chcesz uruchomić aplikację [APP_NAME] bez problemów, doradzamy korzystanie z uruchomionym oprogramowaniem min. DirectX 9.0b.
+
+Czy chcesz kontynuować?
+ </string>
+ <string name="MBWarning">
+ Ostrzeżenie
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatyczna aktualizacja nie została jeszcze zaimplementowana dla platformy Linux.
+Prosimy o pobranie najnowszej wersji ze strony internetowej: www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ błąd rejestru
+ </string>
+ <string name="MBError">
+ Błąd
+ </string>
+ <string name="MBFullScreenErr">
+ Niemożliwość uruchomienia trybu pełnoekranowego w proporcji [WIDTH] x [HEIGHT].
+Uruchomione w oknie.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Błąd w próbie wyłączenia podczas zamykania okna (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Błąd w próbie wyłączenia
+ </string>
+ <string name="MBDevContextErr">
+ Brak możliwości stworzenia zawartości GL dla sterownika
+ </string>
+ <string name="MBPixelFmtErr">
+ Brak odnalezienia właściwego formatu pikselowego
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Brak otrzymania formatu pikselowego opisu
+ </string>
+ <string name="MBTrueColorWindow">
+ Aplikacja [APP_NAME] wymaga ustawienia Koloru na (32-bit) do uruchomienia.
+Sprawdź swoje ustawienia dla wyświetlacza i ustaw tryb koloru na 32-bity.
+ </string>
+ <string name="MBAlpha">
+ Aplikacja [APP_NAME] nie może zostać uruchomiona z powodu niemożliwości dostania się na kanał 8 bitowy alpha. Najcześciej jest to spowodowane błędami sterowników karty video.
+Upewnij się, że posiadasz najnowsze aktualizacje sterowników karty video.
+Dodatkowo, sprawdź czy Twój monitor posiada poprawną konfigurację koloru (32-bity) w Panelu Kontroli &gt; Display &gt; Ustawienia.
+Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Brak ustawienie formatu pikselowego
+ </string>
+ <string name="MBGLContextErr">
+ Brak możliwości stworzenia renderowania zawartości GL
+ </string>
+ <string name="MBGLContextActErr">
+ Brak aktywacji renderowania zawartości GL
+ </string>
+ <string name="MBVideoDrvErr">
+ Aplikacja [APP_NAME] nie może zostać uruchomiona, ponieważ Twoja karta video jest niepoprawnie zainstalowana, nieaktualizowana lub przeznaczona jest dla innego rodzaju dysków twardych. Upewnij się, że Twoja karta video została zaktualizowana poprawnie lub spróbuj zainstalować ponownie.
+
+Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Cień o godzinie 5
+ </string>
+ <string name="All White">
+ Wszystko Białe
+ </string>
+ <string name="Anime Eyes">
+ Animuj Oczy
+ </string>
+ <string name="Arced">
+ Obrócony
+ </string>
+ <string name="Arm Length">
+ Długość Ramienia
+ </string>
+ <string name="Attached">
+ Dołączone
+ </string>
+ <string name="Attached Earlobes">
+ Płatki Uszu Dołączone
+ </string>
+ <string name="Back Bangs">
+ Tylnie Pasemka
+ </string>
+ <string name="Back Bangs Down">
+ Tylnie Pasemka w Dół
+ </string>
+ <string name="Back Bangs Up">
+ Tylnie Pasemka do Góry
+ </string>
+ <string name="Back Fringe">
+ Tylnia Grzywka
+ </string>
+ <string name="Back Hair">
+ Back Hair
+ </string>
+ <string name="Back Hair Down">
+ Back Hair Down
+ </string>
+ <string name="Back Hair Up">
+ Back Hair Up
+ </string>
+ <string name="Baggy">
+ Wypchane
+ </string>
+ <string name="Bangs">
+ Pasemka
+ </string>
+ <string name="Bangs Down">
+ Pasemka w Dół
+ </string>
+ <string name="Bangs Up">
+ Pasemka do Góry
+ </string>
+ <string name="Beady Eyes">
+ Oczy Załzawione
+ </string>
+ <string name="Belly Size">
+ Rozmiar Brzucha
+ </string>
+ <string name="Big">
+ Duży
+ </string>
+ <string name="Big Butt">
+ Duży Pośladek
+ </string>
+ <string name="Big Eyeball">
+ Duża Gałka Oczna
+ </string>
+ <string name="Big Hair Back">
+ Duże Włosy: z Tyłu
+ </string>
+ <string name="Big Hair Front">
+ Duże Włosy: z Przodu
+ </string>
+ <string name="Big Hair Top">
+ Duże Włosy: z Góry
+ </string>
+ <string name="Big Head">
+ Duża Głowa
+ </string>
+ <string name="Big Pectorals">
+ Duże Mięśnie Piersiowe
+ </string>
+ <string name="Big Spikes">
+ Duże Kolce
+ </string>
+ <string name="Black">
+ Czarne
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Włosy Koloru Blond
+ </string>
+ <string name="Blush">
+ Rumieniec
+ </string>
+ <string name="Blush Color">
+ Kolor Rumieńca
+ </string>
+ <string name="Blush Opacity">
+ Intensywność Rumieńca
+ </string>
+ <string name="Body Definition">
+ Detale Ciała
+ </string>
+ <string name="Body Fat">
+ Zawartość Tkanki Tłuszczowej
+ </string>
+ <string name="Body Freckles">
+ Piegi
+ </string>
+ <string name="Body Thick">
+ Zagęszczenie Ciała
+ </string>
+ <string name="Body Thickness">
+ Grubość Ciała
+ </string>
+ <string name="Body Thin">
+ Szczupłość
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Jędrność Piersi
+ </string>
+ <string name="Breast Cleavage">
+ Odstęp Między Piersiami
+ </string>
+ <string name="Breast Size">
+ Rozmiar Piersi
+ </string>
+ <string name="Bridge Width">
+ Szerokość
+ </string>
+ <string name="Broad">
+ Szerokie
+ </string>
+ <string name="Brow Size">
+ Rozmiar Czoła
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Bugged Eyes
+ </string>
+ <string name="Bulbous">
+ Bulwiasty
+ </string>
+ <string name="Bulbous Nose">
+ Bulwiasty Nos
+ </string>
+ <string name="Bushy Eyebrows">
+ Bujne Brwi
+ </string>
+ <string name="Bushy Hair">
+ Bujne Włosy
+ </string>
+ <string name="Butt Size">
+ Rozmiar Pośladków
+ </string>
+ <string name="bustle skirt">
+ Bustle Skirt
+ </string>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Kości Policzkowe
+ </string>
+ <string name="Chest Size">
+ Rozmiar Klatki Piersiowej
+ </string>
+ <string name="Chin Angle">
+ Kąt Podbródka
+ </string>
+ <string name="Chin Cleft">
+ Dołek w Podbródku
+ </string>
+ <string name="Chin Curtains">
+ Zasłonięcie Podbródka
+ </string>
+ <string name="Chin Depth">
+ Długość Podbródka
+ </string>
+ <string name="Chin Heavy">
+ Ciężar Podbródka
+ </string>
+ <string name="Chin In">
+ Podbródek Wewnątrz
+ </string>
+ <string name="Chin Out">
+ Podbródek Zewnętrzny
+ </string>
+ <string name="Chin-Neck">
+ Podwójny Podbródek
+ </string>
+ <string name="Clear">
+ Wyczyść
+ </string>
+ <string name="Cleft">
+ Rozszczepienie
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Zamknięte
+ </string>
+ <string name="Closed Back">
+ Zamknięte z Tyłu
+ </string>
+ <string name="Closed Front">
+ Zamknięte z Przodu
+ </string>
+ <string name="Closed Left">
+ Lewe Oko Zamknięte
+ </string>
+ <string name="Closed Right">
+ Prawe Oko Zamknięte
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Kołnierz z Tyłu
+ </string>
+ <string name="Collar Front">
+ Kołnierz z Przodu
+ </string>
+ <string name="Corner Down">
+ Corner Down
+ </string>
+ <string name="Corner Normal">
+ Corner Normal
+ </string>
+ <string name="Corner Up">
+ Corner Up
+ </string>
+ <string name="Creased">
+ Pognieciony
+ </string>
+ <string name="Crooked Nose">
+ Skrzywienie Nosa
+ </string>
+ <string name="Cropped Hair">
+ Przycięte Włosy
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Ciemne
+ </string>
+ <string name="Dark Green">
+ Ciemne Zielone
+ </string>
+ <string name="Darker">
+ Ciemniejsze
+ </string>
+ <string name="Deep">
+ Glębokie
+ </string>
+ <string name="Default Heels">
+ Domyślne Buty na Obcasie
+ </string>
+ <string name="Default Toe">
+ Domyślny Palec
+ </string>
+ <string name="Dense">
+ Gęstość
+ </string>
+ <string name="Dense hair">
+ Gęste Włosy
+ </string>
+ <string name="Double Chin">
+ Podwójny Podbródek
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Odstawanie Uszu
+ </string>
+ <string name="Ear Size">
+ Rozmiar Uszu
+ </string>
+ <string name="Ear Tips">
+ Wierzchołki Uszu
+ </string>
+ <string name="Egg Head">
+ Jajowata Głowa
+ </string>
+ <string name="Eye Bags">
+ Woreczek Åzowy
+ </string>
+ <string name="Eye Color">
+ Kolor Oczu
+ </string>
+ <string name="Eye Depth">
+ Głębokość Osadzenia Oczu
+ </string>
+ <string name="Eye Lightness">
+ Ustawienie Jasności Oczu
+ </string>
+ <string name="Eye Opening">
+ Oczy Otwarte
+ </string>
+ <string name="Eye Pop">
+ Różnica w Wielkości Oczu
+ </string>
+ <string name="Eye Size">
+ Rozmiar Oczu
+ </string>
+ <string name="Eye Spacing">
+ Rozstaw Oczu
+ </string>
+ <string name="Eyeball Size">
+ Wielkość Gałki Ocznej
+ </string>
+ <string name="Eyebrow Arc">
+ Åuk Brwiowy
+ </string>
+ <string name="Eyebrow Density">
+ Gęstość Brwi
+ </string>
+ <string name="Eyebrow Height">
+ Wysokość Brwi
+ </string>
+ <string name="Eyebrow Points">
+ Kształt Brwi
+ </string>
+ <string name="Eyebrow Size">
+ Rozmiar Brwi
+ </string>
+ <string name="Eyelash Length">
+ Długość Rzęs
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Kolor Eyeliner&apos;a
+ </string>
+ <string name="Eyes Back">
+ Eyes Back
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Eyes Forward">
+ Eyes Forward
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Eyes Shear Left Up
+ </string>
+ <string name="Eyes Shear Right Up">
+ Eyes Shear Right Up
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Rozmieszczenie Oczu
+ </string>
+ <string name="Eyes Sunken">
+ Eyes Sunken
+ </string>
+ <string name="Eyes Together">
+ Oczy Razem
+ </string>
+ <string name="Face Shear">
+ Usunięcie Twarzy
+ </string>
+ <string name="Facial Definition">
+ Detale Twarzy
+ </string>
+ <string name="Far Set Eyes">
+ Far Set Eyes
+ </string>
+ <string name="Fat">
+ Grubość
+ </string>
+ <string name="Fat Head">
+ Gruba Głowa
+ </string>
+ <string name="Fat Lips">
+ Grube Usta
+ </string>
+ <string name="Fat Lower">
+ Fat Lower
+ </string>
+ <string name="Fat Lower Lip">
+ Fat Lower Lip
+ </string>
+ <string name="Fat Torso">
+ Gruby Tułów
+ </string>
+ <string name="Fat Upper">
+ Fat Upper
+ </string>
+ <string name="Fat Upper Lip">
+ Fat Upper Lip
+ </string>
+ <string name="Female">
+ Kobieta
+ </string>
+ <string name="Fingerless">
+ Fingerless
+ </string>
+ <string name="Fingers">
+ Palce
+ </string>
+ <string name="Flared Cuffs">
+ Flared Cuffs
+ </string>
+ <string name="Flat">
+ Płaskość
+ </string>
+ <string name="Flat Butt">
+ Płaskie Pośladki
+ </string>
+ <string name="Flat Head">
+ Płaska Głowa
+ </string>
+ <string name="Flat Toe">
+ Płaski Palec
+ </string>
+ <string name="Foot Size">
+ Rozmiar Stopy
+ </string>
+ <string name="Forehead Angle">
+ Kształt Czoła
+ </string>
+ <string name="Forehead Heavy">
+ Ciężar Czoła
+ </string>
+ <string name="Freckles">
+ Piegi
+ </string>
+ <string name="Front Bangs Down">
+ Przednie Pasemka w Dół
+ </string>
+ <string name="Front Bangs Up">
+ Przednie Pasemka do Góry
+ </string>
+ <string name="Front Fringe">
+ Przednia Grzywka
+ </string>
+ <string name="Front Hair">
+ Front Hair
+ </string>
+ <string name="Front Hair Down">
+ Front Hair Down
+ </string>
+ <string name="Front Hair Up">
+ Przednie Włosy do Góry
+ </string>
+ <string name="Full Back">
+ Gęstość Włosów po Bokach
+ </string>
+ <string name="Full Eyeliner">
+ Gęsty Eyeliner
+ </string>
+ <string name="Full Front">
+ Gęsty Przód
+ </string>
+ <string name="Full Hair Sides">
+ Gęste Włosy po Bokach
+ </string>
+ <string name="Full Sides">
+ Gęste Boki
+ </string>
+ <string name="Glossy">
+ Błyszczące
+ </string>
+ <string name="Glove Fingers">
+ Rękawiczki
+ </string>
+ <string name="Glove Length">
+ Długość Rękawiczek
+ </string>
+ <string name="Hair">
+ Włosy
+ </string>
+ <string name="Hair Back">
+ Włosy: z Tyłu
+ </string>
+ <string name="Hair Front">
+ Włosy: z Przodu
+ </string>
+ <string name="Hair Sides">
+ Hair: Boki
+ </string>
+ <string name="Hair Sweep">
+ Kierunek Zaczesania
+ </string>
+ <string name="Hair Thickess">
+ Grubość Włosów
+ </string>
+ <string name="Hair Thickness">
+ Grubość Włosów
+ </string>
+ <string name="Hair Tilt">
+ Przesunięcie Fryzury
+ </string>
+ <string name="Hair Tilted Left">
+ Przesunięcie Fryzury w Lewo
+ </string>
+ <string name="Hair Tilted Right">
+ Przesunięcie Fryzury w Prawo
+ </string>
+ <string name="Hair Volume">
+ Włosy: Objętość
+ </string>
+ <string name="Hand Size">
+ Rozmiar Dłoni
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Długość Głowy
+ </string>
+ <string name="Head Shape">
+ Kształt Głowy
+ </string>
+ <string name="Head Size">
+ Rozmiar Głowy
+ </string>
+ <string name="Head Stretch">
+ Rozciągnięcie Głowy
+ </string>
+ <string name="Heel Height">
+ Wysokość Obcasa
+ </string>
+ <string name="Heel Shape">
+ Ksztalt Obcasa
+ </string>
+ <string name="Height">
+ Wysokość
+ </string>
+ <string name="High">
Wysoka
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Linden Lokacja</string>
- <string name="Adult">&apos;Adult&apos;</string>
- <string name="Arts&amp;Culture">Sztuka i Kultura</string>
- <string name="Business">Biznes</string>
- <string name="Educational">Edukacyjna</string>
- <string name="Gaming">Gra</string>
- <string name="Hangout">Poznawanie ludzi</string>
- <string name="Newcomer Friendly">Przyjazne dla nowych</string>
- <string name="Parks&amp;Nature">Park i Natura</string>
- <string name="Residential">Mieszkalna</string>
- <string name="Shopping">Zakupy</string>
- <string name="Other">Inna</string>
-
- <string name="ringing">
- ÅÄ…czenie z rozmowami gÅ‚osem w Å›wiecie...
+ <string name="High Heels">
+ Wysokie Obcasy
</string>
- <string name="connected">
- Połączenie uzyskane.
+ <string name="High Jaw">
+ High Jaw
</string>
- <string name="unavailable">
- Niestety, rozmowy głosem są niedozwolone w tym miejscu.
+ <string name="High Platforms">
+ High Platforms
</string>
- <string name="hang_up">
- Połączenie rozmowy utracone.
+ <string name="High and Tight">
+ High and Tight
+ </string>
+ <string name="Higher">
+ Wyżej
+ </string>
+ <string name="Hip Length">
+ Długość Bioder
+ </string>
+ <string name="Hip Width">
+ Szerokość Bioder
+ </string>
+ <string name="In">
+ W
+ </string>
+ <string name="In Shdw Color">
+ Wewnętrzny Kolor Cienia
+ </string>
+ <string name="In Shdw Opacity">
+ Wewnętrzna Intensywność Cienia
+ </string>
+ <string name="Inner Eye Corner">
+ Wenwętrzny Bok Oka
+ </string>
+ <string name="Inner Eye Shadow">
+ Wewnętrzny Cień Oka
+ </string>
+ <string name="Inner Shadow">
+ Wewnętrzny Cień
+ </string>
+ <string name="Jacket Length">
+ Długość Kurtki
+ </string>
+ <string name="Jacket Wrinkles">
+ Zmarszczki na Kurtce
+ </string>
+ <string name="Jaw Angle">
+ Jaw Angle
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Jaw Shape
+ </string>
+ <string name="Join">
+ Złącz
+ </string>
+ <string name="Jowls">
+ Jowls
+ </string>
+ <string name="Knee Angle">
+ KÄ…t Kolana
+ </string>
+ <string name="Knock Kneed">
+ Knock Kneed
+ </string>
+ <string name="Large">
+ Duże
+ </string>
+ <string name="Large Hands">
+ Duże Dłonie
+ </string>
+ <string name="Left Part">
+ Left Part
+ </string>
+ <string name="Leg Length">
+ Długość Nogi
+ </string>
+ <string name="Leg Muscles">
+ Umięśnione Nogi
+ </string>
+ <string name="Less">
+ Mniej
+ </string>
+ <string name="Less Body Fat">
+ Mniejsza Zawartości Tkanki Tłuszczowej
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Mniej Piegów
+ </string>
+ <string name="Less Full">
+ Less Full
+ </string>
+ <string name="Less Gravity">
+ Mniej Ciężaru
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Mniej Mięśni
+ </string>
+ <string name="Less Muscular">
+ Mniej Umięśnienia
+ </string>
+ <string name="Less Rosy">
+ Less Rosy
+ </string>
+ <string name="Less Round">
+ Mniej ZaaokrÄ…glone
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Mniej Kwadratowe
+ </string>
+ <string name="Less Volume">
+ Mniej Objętości
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lżejsze
+ </string>
+ <string name="Lip Cleft">
+ Szerokość Rozszczepienia Górnej Wargi
+ </string>
+ <string name="Lip Cleft Depth">
+ Głębokość Rozszczepienia Górnej Wargi
+ </string>
+ <string name="Lip Fullness">
+ Pełność Ust
+ </string>
+ <string name="Lip Pinkness">
+ Róż Ust
+ </string>
+ <string name="Lip Ratio">
+ Proporcje Ust
+ </string>
+ <string name="Lip Thickness">
+ Grubość Ust
+ </string>
+ <string name="Lip Width">
+ Szerokość Ust
+ </string>
+ <string name="Lipgloss">
+ Połysk
+ </string>
+ <string name="Lipstick">
+ Szminka
+ </string>
+ <string name="Lipstick Color">
+ Kolor Szminki
+ </string>
+ <string name="Long">
+ Dlugość
+ </string>
+ <string name="Long Head">
+ Długa Głowa
+ </string>
+ <string name="Long Hips">
+ Długie Biodra
+ </string>
+ <string name="Long Legs">
+ Długie Nogi
+ </string>
+ <string name="Long Neck">
+ Długi Kark
+ </string>
+ <string name="Long Pigtails">
+ Długi Warkocz
+ </string>
+ <string name="Long Ponytail">
+ Długi Kucyk
+ </string>
+ <string name="Long Torso">
+ Długi Tułów
+ </string>
+ <string name="Long arms">
+ Dlugie Ramiona
+ </string>
+ <string name="Longcuffs">
+ Długie Rękawy
+ </string>
+ <string name="Loose Pants">
+ Luźne Spodnie
+ </string>
+ <string name="Loose Shirt">
+ Luźna Koszulka
+ </string>
+ <string name="Loose Sleeves">
+ Luźne Rękawy
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Nisko
+ </string>
+ <string name="Low Heels">
+ Niskie Obcasy
+ </string>
+ <string name="Low Jaw">
+ Niska Szczęka
+ </string>
+ <string name="Low Platforms">
+ Low Platforms
+ </string>
+ <string name="Low and Loose">
+ Niskie i Luźne
+ </string>
+ <string name="Lower">
+ Niżej
+ </string>
+ <string name="Lower Bridge">
+ Lower Bridge
+ </string>
+ <string name="Lower Cheeks">
+ Lower Cheeks
+ </string>
+ <string name="Male">
+ Mężczyzna
+ </string>
+ <string name="Middle Part">
+ Część Środkowa
+ </string>
+ <string name="More">
+ Więcej
+ </string>
+ <string name="More Blush">
+ More Blush
+ </string>
+ <string name="More Body Fat">
+ Więcej Zawartości Tkanki Tłuszczowej
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ More Eyeshadow
+ </string>
+ <string name="More Freckles">
+ Więcej Piegów
+ </string>
+ <string name="More Full">
+ More Full
+ </string>
+ <string name="More Gravity">
+ Więcej Ciężaru
+ </string>
+ <string name="More Lipstick">
+ Więcej Szminki
+ </string>
+ <string name="More Love">
+ More Love
+ </string>
+ <string name="More Lower Lip">
+ Więcej Dolnej Wargi
+ </string>
+ <string name="More Muscles">
+ Więcej Mięśni
+ </string>
+ <string name="More Muscular">
+ Więcej Umięśnienia
+ </string>
+ <string name="More Rosy">
+ More Rosy
+ </string>
+ <string name="More Round">
+ Więcej Zaokrąglenia
+ </string>
+ <string name="More Saddle">
+ More Saddle
+ </string>
+ <string name="More Sloped">
+ More Sloped
+ </string>
+ <string name="More Square">
+ Więcej Kwadratowy
+ </string>
+ <string name="More Upper Lip">
+ Więcej Górnej Wargi
+ </string>
+ <string name="More Vertical">
+ More Vertical
+ </string>
+ <string name="More Volume">
+ Więcej Objętości
+ </string>
+ <string name="More soul">
+ More soul
+ </string>
+ <string name="Moustache">
+ WÄ…sy
+ </string>
+ <string name="Mouth Corner">
+ KÄ…ciki Ust
+ </string>
+ <string name="Mouth Position">
+ Pozycja Ust
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Umięśnienie
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Lakier na Paznokciach
+ </string>
+ <string name="Nail Polish Color">
+ Kolor Lakieru na Paznokciach
+ </string>
+ <string name="Narrow">
+ WÄ…skie
+ </string>
+ <string name="Narrow Back">
+ Wąski Tył
+ </string>
+ <string name="Narrow Front">
+ Wąski Przód
+ </string>
+ <string name="Narrow Lips">
+ WÄ…skie Usta
+ </string>
+ <string name="Natural">
+ Naturalne
+ </string>
+ <string name="Neck Length">
+ Długość Karku
+ </string>
+ <string name="Neck Thickness">
+ Grubość Karku
+ </string>
+ <string name="No Blush">
+ No Blush
+ </string>
+ <string name="No Eyeliner">
+ Brak Eyeliner&apos;s
+ </string>
+ <string name="No Eyeshadow">
+ Brak Cienia pod PowiekÄ…
+ </string>
+ <string name="No Heels">
+ Brak Obcasów
+ </string>
+ <string name="No Lipgloss">
+ Brak Połysku
+ </string>
+ <string name="No Lipstick">
+ Brak Szminki
+ </string>
+ <string name="No Part">
+ No Part
+ </string>
+ <string name="No Polish">
+ Brak Lakieru
+ </string>
+ <string name="No Red">
+ Brak Czerwieni
+ </string>
+ <string name="No Spikes">
+ Brak Szpiców
+ </string>
+ <string name="No White">
+ Brak Białego
+ </string>
+ <string name="No Wrinkles">
+ Brak Zmarszczek
+ </string>
+ <string name="Normal Lower">
+ Dół Normalny
+ </string>
+ <string name="Normal Upper">
+ Góra Normalna
+ </string>
+ <string name="Nose Left">
+ Nos w StronÄ™ LewÄ…
+ </string>
+ <string name="Nose Right">
+ Nos w StronÄ™ PrawÄ…
+ </string>
+ <string name="Nose Size">
+ Rozmiar Nosa
+ </string>
+ <string name="Nose Thickness">
+ Grubość Nosa
+ </string>
+ <string name="Nose Tip Angle">
+ KÄ…t Czubka Nosa
+ </string>
+ <string name="Nose Tip Shape">
+ Kształt Czubka Nosa
+ </string>
+ <string name="Nose Width">
+ Szerokość Nosa
+ </string>
+ <string name="Nostril Division">
+ Przegroda Nosa
+ </string>
+ <string name="Nostril Width">
+ Wielkość Dziurek w Nosie
+ </string>
+ <string name="Old">
+ Stare
+ </string>
+ <string name="Opaque">
+ Intensywność
+ </string>
+ <string name="Open">
+ Otwarte
+ </string>
+ <string name="Open Back">
+ Otwarte z Tyłu
+ </string>
+ <string name="Open Front">
+ Otwarte z Przodu
+ </string>
+ <string name="Open Left">
+ Otwarte z Lewej
+ </string>
+ <string name="Open Right">
+ Otwarte z Prawej
+ </string>
+ <string name="Orange">
+ Pomarańczowe
+ </string>
+ <string name="Out">
+ Zewnętrznie
+ </string>
+ <string name="Out Shdw Color">
+ Zewnętrzny Kolor Cienia
+ </string>
+ <string name="Out Shdw Opacity">
+ Zewnętrzna Grubość Cienia
+ </string>
+ <string name="Outer Eye Corner">
+ Zewnętrzny Bok Oka
+ </string>
+ <string name="Outer Eye Shadow">
+ Zewnętrzny Cień Oka
+ </string>
+ <string name="Outer Shadow">
+ Zewnętrzny Cień
+ </string>
+ <string name="Overbite">
+ Overbite
+ </string>
+ <string name="Package">
+ Package
+ </string>
+ <string name="Painted Nails">
+ Pomalowane Paznokcie
+ </string>
+ <string name="Pale">
+ Pale
+ </string>
+ <string name="Pants Crotch">
+ Krocze Spodni
+ </string>
+ <string name="Pants Fit">
+ Pants Fit
+ </string>
+ <string name="Pants Length">
+ Długość Spodni
+ </string>
+ <string name="Pants Waist">
+ Talia Spodni
+ </string>
+ <string name="Pants Wrinkles">
+ Zmarszczki Spodni
+ </string>
+ <string name="Part">
+ Część
+ </string>
+ <string name="Part Bangs">
+ Part Bangs
+ </string>
+ <string name="Pectorals">
+ Mięśnie Klatki Piersiowej
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Pigtails
+ </string>
+ <string name="Pink">
+ Różowe
+ </string>
+ <string name="Pinker">
+ Róż
+ </string>
+ <string name="Platform Height">
+ Platform Height
+ </string>
+ <string name="Platform Width">
+ Platform Width
+ </string>
+ <string name="Pointy">
+ Pointy
+ </string>
+ <string name="Pointy Heels">
+ Pointy Heels
+ </string>
+ <string name="Pointy Toe">
+ Pointy Toe
+ </string>
+ <string name="Ponytail">
+ Kucyk
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Pop Left Eye
+ </string>
+ <string name="Pop Right Eye">
+ Pop Right Eye
+ </string>
+ <string name="Puffy">
+ Puffy
+ </string>
+ <string name="Puffy Eyelids">
+ Spuchnięte Powieki
+ </string>
+ <string name="Rainbow Color">
+ Kolor Tęczy
+ </string>
+ <string name="Red Hair">
+ Czerwone Włosy
+ </string>
+ <string name="Red Skin">
+ Czerwona Skóra
+ </string>
+ <string name="Regular">
+ Regularne
+ </string>
+ <string name="Regular Muscles">
+ Regularne Mięśnie
+ </string>
+ <string name="Right Part">
+ Prawa Cześć
+ </string>
+ <string name="Rosy Complexion">
+ Kompleksowość Różu
+ </string>
+ <string name="Round">
+ ZaokrÄ…glenie
+ </string>
+ <string name="Round Forehead">
+ ZaokrÄ…glenie na Czole
+ </string>
+ <string name="Ruddiness">
+ Rudowatość
+ </string>
+ <string name="Ruddy">
+ Rudy
+ </string>
+ <string name="Rumpled Hair">
+ Włosy w Nieładzie
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Saddlebags">
+ Saddlebags
+ </string>
+ <string name="Scrawny">
+ Scrawny
+ </string>
+ <string name="Scrawny Leg">
+ Scrawny Leg
+ </string>
+ <string name="Separate">
+ Odzielne
+ </string>
+ <string name="Shading">
+ Cieniowanie
+ </string>
+ <string name="Shadow hair">
+ Cieniowane Włosy
+ </string>
+ <string name="Shallow">
+ Płytkie
+ </string>
+ <string name="Shear Back">
+ Tylne Usunięcie Włosów
+ </string>
+ <string name="Shear Face">
+ Usunięcie Twarzy
+ </string>
+ <string name="Shear Front">
+ Przednie Usunięcie Włosów
+ </string>
+ <string name="Shear Left">
+ Usunięcie z Lewej Strony
+ </string>
+ <string name="Shear Left Up">
+ Usunięcie od Lewej Strony do Góry
+ </string>
+ <string name="Shear Right">
+ Usunięcie z Prawej Strony
+ </string>
+ <string name="Shear Right Up">
+ Usunięcie od Prawej Strony do Góry
+ </string>
+ <string name="Sheared Back">
+ Tylnie Usunięcie Włosów
+ </string>
+ <string name="Sheared Front">
+ Przednie Usunięcie Włosów
+ </string>
+ <string name="Shift Left">
+ Przesuń w Lewo
+ </string>
+ <string name="Shift Mouth">
+ Przesuń Usta
+ </string>
+ <string name="Shift Right">
+ Przesuń w Prawo
+ </string>
+ <string name="Shirt Bottom">
+ Dolna Część Koszulki
+ </string>
+ <string name="Shirt Fit">
+ Shirt Fit
+ </string>
+ <string name="Shirt Wrinkles">
+ Zmarszczki na Koszulce
+ </string>
+ <string name="Shoe Height">
+ Wysokość Buta
+ </string>
+ <string name="Short">
+ Krótkie
+ </string>
+ <string name="Short Arms">
+ Krótkie Ramiona
+ </string>
+ <string name="Short Legs">
+ Krótkie Nogi
+ </string>
+ <string name="Short Neck">
+ Krótki Kark
+ </string>
+ <string name="Short Pigtails">
+ Short Pigtails
+ </string>
+ <string name="Short Ponytail">
+ Krótki Kucyk
+ </string>
+ <string name="Short Sideburns">
+ Krótkie Baczki
+ </string>
+ <string name="Short Torso">
+ Krótki Tułów
+ </string>
+ <string name="Short hips">
+ Krótkie Biodra
+ </string>
+ <string name="Shoulders">
+ Ramiona
+ </string>
+ <string name="Side Bangs">
+ Boczne Pasemka
+ </string>
+ <string name="Side Bangs Down">
+ Boczne Pasemka w Dół
+ </string>
+ <string name="Side Bangs Up">
+ Boczne Pasemka do Góry
+ </string>
+ <string name="Side Fringe">
+ Boczna Grzywka
+ </string>
+ <string name="Sideburns">
+ Baczki
+ </string>
+ <string name="Sides Hair">
+ Boczne Włosy
+ </string>
+ <string name="Sides Hair Down">
+ Boczne Włosy w Dół
+ </string>
+ <string name="Sides Hair Up">
+ Boczne Włosy do Góry
+ </string>
+ <string name="Skinny">
+ Smukłość
+ </string>
+ <string name="Skinny Neck">
+ Smukły Kark
+ </string>
+ <string name="Skirt Fit">
+ Skirt Fit
+ </string>
+ <string name="Skirt Length">
+ Długość Spódnicy
+ </string>
+ <string name="Slanted Forehead">
+ Ukośne Czoło
+ </string>
+ <string name="Sleeve Length">
+ Długość Rękawów
+ </string>
+ <string name="Sleeve Looseness">
+ Luźność Rękawów
+ </string>
+ <string name="Slit Back">
+ Slit: Back
+ </string>
+ <string name="Slit Front">
+ Slit: Front
+ </string>
+ <string name="Slit Left">
+ Slit: Left
+ </string>
+ <string name="Slit Right">
+ Slit: Right
+ </string>
+ <string name="Small">
+ Małe
+ </string>
+ <string name="Small Hands">
+ Małe Dłonie
+ </string>
+ <string name="Small Head">
+ Mała Głowa
+ </string>
+ <string name="Smooth">
+ Gładkie
+ </string>
+ <string name="Smooth Hair">
+ Gładkie Włosy
+ </string>
+ <string name="Socks Length">
+ Długość Skarpetek
+ </string>
+ <string name="Some">
+ Some
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparse
+ </string>
+ <string name="Spiked Hair">
+ Kolczaste Włosy
+ </string>
+ <string name="Square">
+ Kwadratowe
+ </string>
+ <string name="Square Toe">
+ Kwadratowy Palec
+ </string>
+ <string name="Squash Head">
+ Ściśnięta Głowa
+ </string>
+ <string name="Squash/Stretch Head">
+ Ściśnięta/Rozciągnięta Głowa
+ </string>
+ <string name="Stretch Head">
+ Rozciągnięta Głowa
+ </string>
+ <string name="Sunken">
+ Sunken
+ </string>
+ <string name="Sunken Chest">
+ Sunken Chest
+ </string>
+ <string name="Sunken Eyes">
+ Sunken Eyes
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Swept Back">
+ Swept Back
+ </string>
+ <string name="Swept Back Hair">
+ Swept Back Hair
+ </string>
+ <string name="Swept Forward">
+ Swept Forward
+ </string>
+ <string name="Swept Forward Hair">
+ Swept Forward Hair
+ </string>
+ <string name="Tall">
+ Wysokość
+ </string>
+ <string name="Taper Back">
+ Taper Back
+ </string>
+ <string name="Taper Front">
+ Taper Front
+ </string>
+ <string name="Thick Heels">
+ Grube Obcasy
+ </string>
+ <string name="Thick Neck">
+ Gruby Kark
+ </string>
+ <string name="Thick Toe">
+ Gruby Palec
+ </string>
+ <string name="Thickness">
+ Grubość
+ </string>
+ <string name="Thin">
+ WÄ…ski
+ </string>
+ <string name="Thin Eyebrows">
+ WÄ…skie Brwi
+ </string>
+ <string name="Thin Lips">
+ WÄ…skie Usta
+ </string>
+ <string name="Thin Nose">
+ WÄ…ski Nos
+ </string>
+ <string name="Tight Chin">
+ Obcisły Podbródek
+ </string>
+ <string name="Tight Cuffs">
+ Obcisłe Rękawy
+ </string>
+ <string name="Tight Pants">
+ Obciesłe Spodnie
+ </string>
+ <string name="Tight Shirt">
+ Obcisły Podkoszulek
+ </string>
+ <string name="Tight Skirt">
+ Tight Skirt
+ </string>
+ <string name="Tight Sleeves">
+ Obcisłe Rękawy
+ </string>
+ <string name="Tilt Left">
+ Przesuń w Lewo
+ </string>
+ <string name="Tilt Right">
+ Przesuń w Prawo
+ </string>
+ <string name="Toe Shape">
+ Kształt Palca
+ </string>
+ <string name="Toe Thickness">
+ Grubość Palca
+ </string>
+ <string name="Torso Length">
+ Długość Tułowia
+ </string>
+ <string name="Torso Muscles">
+ Mięśnie Tułowia
+ </string>
+ <string name="Torso Scrawny">
+ Wychudzony Tułów
+ </string>
+ <string name="Unattached">
+ Nieprzyłączone
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Nienaturalne
+ </string>
+ <string name="Upper Bridge">
+ Górny Mostek
+ </string>
+ <string name="Upper Cheeks">
+ Górne Policzki
+ </string>
+ <string name="Upper Chin Cleft">
+ Roszczepienie Górnego Podbródka
+ </string>
+ <string name="Upper Eyelid Fold">
+ Górna Powieka
+ </string>
+ <string name="Upturned">
+ Zadarta
+ </string>
+ <string name="Very Red">
+ Bardzo Czerwona
+ </string>
+ <string name="Waist Height">
+ Wysokość Tali
+ </string>
+ <string name="Well-Fed">
+ Well-Fed
+ </string>
+ <string name="White Hair">
+ Białe Włosy
+ </string>
+ <string name="Wide">
+ Szerokie
+ </string>
+ <string name="Wide Back">
+ Szeroki Tył
+ </string>
+ <string name="Wide Front">
+ Szeroki Przód
+ </string>
+ <string name="Wide Lips">
+ Szerokie Usta
+ </string>
+ <string name="Wild">
+ Dzikość
+ </string>
+ <string name="Wrinkles">
+ Zmarszczki
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Dodaj do Zapisanych Miejsc
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Edytuj Zapisane Miejsca
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Zobacz więcej szczegółów na temat obecnej lokalizacji
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historia odwiedzonych miejsc
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Aktualizacja
+ </string>
+ <string name="UpdaterNowUpdating">
+ Pobieranie [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalizacja [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Twoja [APP_NAME] wersja klienta jest aktualizowana do najnowszej wersji. Prosimy o cierpliwość.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Pobieranie aktualizacji...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Pobieranie aktualizacji
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Pobieranie aktualizacji nie powiodło się
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Podczas aktualizacji [APP_NAME] wystąpił błąd. Prosimy o pobranie najnowszej wersji klienta ze strony internetowej: www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Instalacja aktualizacji nie powiodła się
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Uruchomienie klienta nie powiodło się
+ </string>
+ <string name="IM_logging_string">
+ -- Zapisywanie logów rozmowy aktywowane --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] pisze...
+ </string>
+ <string name="Unnamed">
+ (Brak nazwy)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderacja: Komunikacja głosowa wyłączona domyślnie)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Czat tekstowy jest nieaktywny dla tej rozmowy.
+ </string>
+ <string name="IM_muted_text_label">
+ Twój tekst w czacie grupowym został wyłączony przez Moderatora Grupy.
+ </string>
+ <string name="IM_default_text_label">
+ Klknij tutaj by wysłać wiadomość prywatną (IM).
+ </string>
+ <string name="IM_to_label">
+ Do
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], nie pozwala Ci na: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Zabiera Lindeny (L$) od Ciebie
- </string>
- <string name="ActOnControlInputs">
- Używaj klawiszy sterowania
- </string>
- <string name="RemapControlInputs">
- Zmień klawisze sterowania
- </string>
- <string name="AnimateYourAvatar">
- Animuj Awatara
- </string>
- <string name="AttachToYourAvatar">
- Dołącz do Awatara
- </string>
- <string name="ReleaseOwnership">
- Usuń prawo własności (zmień na publiczne)
- </string>
- <string name="LinkAndDelink">
- ÅÄ…cz / odłącz z innymi obiektów
- </string>
- <string name="AddAndRemoveJoints">
- Dodaj / usuń połączenia z innymi obiektami
- </string>
- <string name="ChangePermissions">
- Ustaw zezwolenia
- </string>
- <string name="TrackYourCamera">
- Chodź za kamerą
- </string>
- <string name="ControlYourCamera">
- Kontroluj kamerÄ™
- </string>
<string name="only_user_message">
JesteÅ› jedynÄ… osobÄ… w tej konferencji.
</string>
@@ -624,31 +3236,4 @@
<string name="close_on_no_ability">
Nie posiadasz praw by uczestniczyć w tej konferencji.
</string>
- <string name="AcctTypeResident">
- Rezydent
- </string>
- <string name="AcctTypeTrial">
- Próbne
- </string>
- <string name="AcctTypeCharterMember">
- Członek-zalożyciel
- </string>
- <string name="AcctTypeEmployee">
- Pracownik Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Dane Konta Używane
- </string>
- <string name="PaymentInfoOnFile">
- Dane Konta Dostępne
- </string>
- <string name="NoPaymentInfoOnFile">
- Brak Danych Konta
- </string>
- <string name="AgeVerified">
- Wiek Zweryfikowany
- </string>
- <string name="NotAgeVerified">
- Brak Weryfikacji Wieku
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml
index 3384ae30b7..906978effe 100755..100644
--- a/indra/newview/skins/default/xui/pl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml
@@ -1,15 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Wystąpił problem z teleportacją. Wyloguj się i zaloguj ponownie.
-Jeśli nadal otrzymujesz ten komunikat sprawdź Pomoc Techniczną na stronie:
-www.secondlife.com/support.
+ Przepraszamy, ale pojawił się błąd podczas Twojej próby teleportacji. By ponowić teleportację, wyloguj się i zaloguj ponownie.
+Jeżeli nadal otrzymujesz komunikat błędu teleportacji, sprawdź [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Wystąpił problem ze zmianą regionu. Wyloguj się i zaloguj ponownie.
-Jeśli nadal otrzymujesz ten komunikat sprawdź Pomoc Techniczną na stronie:
-www.secondlife.com/support.
+ Przepraszamy, ale pojawił się błąd podczas próby zmiany regionu. By ponowić próbę przejścia na drugi region, wyloguj się i zaloguj ponownie.
+Jeżeli nadal otrzymujesz komunikat błędu podczas przejścia na drugi region, sprawdź [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz.
diff --git a/indra/newview/skins/default/xui/pl/xui_version.xml b/indra/newview/skins/default/xui/pl/xui_version.xml
index 0e777751d3..0e777751d3 100755..100644
--- a/indra/newview/skins/default/xui/pl/xui_version.xml
+++ b/indra/newview/skins/default/xui/pl/xui_version.xml
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index 12cc879cbc..d6e1c925b0 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -1,19 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Sobre o [APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life é oferecido a você por Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl e muitos outros.
+<floater name="floater_about" title="SOBRE O [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Construído com [COMPILER] versão [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memória: [MEMORY_MB] MBs
+Versão OS: [OS_VERSION]
+Placa de vídeo: [GRAPHICS_CARD_VENDOR]
+Placa gráfica: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Versão OpenGL: [OPENGL_VERSION]
+
+Versão libcurl: [LIBCURL_VERSION]
+Versão J2C Decoder: [J2C_VERSION]
+Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
+Versão Qt Webkit: [QT_WEBKIT_VERSION]
+Versão Vivox: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (nenhum)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="Copiar para área de transferência" name="copy_btn"/>
+ </panel>
+ <panel label="Créditos" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life é oferecido a você por Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl e muitos outros.
Obrigado aos seguintes residentes por ajudar a garantir para que esta versão seja ainda melhor: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
Para ter sucesso nos negócios, seja ousado, seja o primeiro, seja diferente. --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licenças" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -34,10 +73,7 @@
Todos os direitos reservados. Veja licenças.txt para detalhes.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Você está em [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 417d24608e..bf6faf50cc 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -1,7 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="Sobre o Terreno">
+<floater name="floaterland" title="SOBRE O TERRENO">
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ faltam
+ </floater.string>
<tab_container name="landtab">
- <panel label="Geral" name="land_general_panel">
+ <panel label="GERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Somente novos usuários
+ </panel.string>
+ <panel.string name="anyone">
+ Qualquer um
+ </panel.string>
+ <panel.string name="area_text">
+ Ãrea
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID do Leilão: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Você deve ter sua compra aprovada para modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Possuído pelo Grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Informação...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (nenhum)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venda Pendente)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Nenhum lote selecionado.
+Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar seus detalhes.
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -26,7 +78,6 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="Profile..."/>
<text name="Group:">
Grupo:
</text>
@@ -78,54 +129,25 @@
<button label="Abandonar Terra.." label_selected="Abandonar Terra.." name="Abandon Land..."/>
<button label="Reclamar Terra..." label_selected="Reclamar Terra..." name="Reclaim Land..."/>
<button label="Venda Linden..." label_selected="Venda Linden..." name="Linden Sale..." tool_tip="A terra precisa ser possuída, estar com o conteúdo configurado e não estar pronta para leilão."/>
- <panel.string name="new users only">
- Somente novos usuários
- </panel.string>
- <panel.string name="anyone">
- Qualquer um
- </panel.string>
- <panel.string name="area_text">
- Ãrea
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- ID do Leilão: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Você deve ter sua compra aprovada para modificar este terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Possuído pelo Grupo)
- </panel.string>
- <panel.string name="profile_text">
- Perfil...
- </panel.string>
- <panel.string name="info_text">
- Informação...
- </panel.string>
- <panel.string name="public_text">
- (público)
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Terra comprada nesta região pode ser revendida.
</panel.string>
- <panel.string name="none_text">
- (nenhum)
+ <panel.string name="can_not_resell">
+ Terra comprada nesta região não pode ser revendida.
</panel.string>
- <panel.string name="sale_pending_text">
- (Venda Pendente)
+ <panel.string name="can_change">
+ Terra comprada nesta região pode ser compartilhada
+ou sub-dividida.
</panel.string>
- <panel.string name="no_selection_text">
- Nenhum lote selecionado.
-Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar seus detalhes.
+ <panel.string name="can_not_change">
+ Terra comprada nesta região não pode ser compartilhada
+ou sub-dividida.
</panel.string>
- </panel>
- <panel label="Corretor" name="land_covenant_panel">
<text name="estate_section_lbl">
Propriedade:
</text>
- <text name="estate_name_lbl">
- Nome:
- </text>
<text name="estate_name_text">
mainland
</text>
@@ -144,9 +166,6 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
<text name="region_section_lbl">
Região:
</text>
- <text name="region_name_lbl">
- Nome:
- </text>
<text name="region_name_text">
leyla
</text>
@@ -174,37 +193,23 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
<text name="changeable_clause">
Terra nesta região não pode ser unida/sub-dividida.
</text>
- <panel.string name="can_resell">
- Terra comprada nesta região pode ser revendida.
- </panel.string>
- <panel.string name="can_not_resell">
- Terra comprada nesta região não pode ser revendida.
- </panel.string>
- <panel.string name="can_change">
- Terra comprada nesta região pode ser compartilhada
-ou sub-dividida.
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de [MAX] ([AVAILABLE] disponíveis)
</panel.string>
- <panel.string name="can_not_change">
- Terra comprada nesta região não pode ser compartilhada
-ou sub-dividida.
+ <panel.string name="objects_deleted_text">
+ [COUNT] de [MAX] ([DELETED] serão deletados)
</panel.string>
- </panel>
- <panel label="Objetos" name="land_objects_panel">
<text name="parcel_object_bonus">
Fator de Bonus para Objetos na Região: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso do simulador de primitivas:
+ Uso de prims:
</text>
<text left="214" name="objects_available" width="230">
[COUNT] de [MAX] ([AVAILABLE] disponíveis)
</text>
- <panel.string name="objects_available_text">
- [COUNT] de [MAX] ([AVAILABLE] disponíveis)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] de [MAX] ([DELETED] serão deletados)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
Primitivas suportadas pelo lote:
</text>
@@ -254,33 +259,63 @@ ou sub-dividida.
<text name="Object Owners:">
Donos dos Objetos:
</text>
- <button label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh List" left="118"/>
- <button label="Retornar objetos..." label_selected="Retornar objetos..." name="Return objects..." left="230"/>
+ <button label="Atualizar Lista" label_selected="Atualizar Lista" left="118" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Retornar objetos..." label_selected="Retornar objetos..." left="230" name="Return objects..."/>
<name_list name="owner list">
- <column label="Tipo" name="type"/>
- <column label="Nome" name="name"/>
- <column label="Contar" name="count"/>
- <column label="Mais recente" name="mostrecent"/>
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nome" name="name"/>
+ <name_list.columns label="Contar" name="count"/>
+ <name_list.columns label="Mais recente" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opções" name="land_options_panel">
+ <panel label="OPÇÕES" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Permitir que as pessoas vejam este lote nos resultados de busca
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Esta opção está desabilitada porque a área deste lote tem 128 m² ou menos.
+Apenas lotes maiores podem ser listados na busca.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Esta opção está desabilitada porque você não pode modificar as opções deste lote.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Conteúdo Mature
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Conteúdo Adult
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ A informação do seu lote ou seu conteúdo são considerados mature.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ A informação do seu lote ou seu conteúdo são considerados adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (nenhum)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Sem Empurrar
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Sem Empurrar (Imposição na Região)
+ </panel.string>
<text name="allow_label">
Permitir outros residentes a:
</text>
<check_box label="Editar Terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar a forma da sua terra. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/>
- <check_box label="Criar Landmarks" name="check landmark"/>
<check_box label="Voar" name="check fly" tool_tip="Se ativado, os Residentes podem voar na sua terra. Se desativado, eles podem voar apenas para dentro e por cima de sua terra."/>
- <text name="allow_label2" left="172">
+ <text left="172" name="allow_label2">
Criar Objetos:
</text>
<check_box label="Residentes" name="edit objects check"/>
<check_box label="Grupo" name="edit group objects check"/>
- <text name="allow_label3" left="172">
+ <text left="172" name="allow_label3">
Entrada do Objeto:
</text>
<check_box label="Residentes" name="all object entry check"/>
<check_box label="Grupo" name="group object entry check"/>
- <text name="allow_label4" left="172">
+ <text left="172" name="allow_label4">
Executar Scripts:
</text>
<check_box label="Residentes" name="check other scripts"/>
@@ -290,85 +325,37 @@ ou sub-dividida.
</text>
<check_box label="Salvo (sem dano)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, desabilitando combate com danos. Se não ativado, o combate com danos é habilitado."/>
<check_box label="Sem Empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. A ativação dessa opção pode ser útil para prevenir comportamentos desordeiros na sua terra."/>
- <check_box label="Mostra o Lugar na Busca (L$30/semana) sob" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
- <panel.string name="search_enabled_tooltip">
- Permitir que as pessoas vejam este lote nos resultados de busca
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Esta opção está desabilitada porque a área deste lote tem 128 m² ou menos.
-Apenas lotes maiores podem ser listados na busca.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Esta opção está desabilitada porque você não pode modificar as opções deste lote.
- </panel.string>
- <combo_box name="land category with adult" left="265" width="155">
- <combo_box.item name="item0" label="Qualquer Categoria"
- />
- <combo_box.item name="item1" label="Locação Linden"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Artes e Cultura"
- />
- <combo_box.item name="item4" label="Negócios"
- />
- <combo_box.item name="item5" label="Educacional"
- />
- <combo_box.item name="item6" label="Jogos"
- />
- <combo_box.item name="item7" label="Moradia"
- />
- <combo_box.item name="item8" label="Amigável a Novos Usuários"
- />
- <combo_box.item name="item9" label="Parques &amp; Natureza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Outros"
- />
+ <check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
+ <combo_box left="265" name="land category with adult" width="155">
+ <combo_box.item label="Qualquer Categoria" name="item0"/>
+ <combo_box.item label="Locação Linden" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Artes e Cultura" name="item3"/>
+ <combo_box.item label="Negócios" name="item4"/>
+ <combo_box.item label="Educacional" name="item5"/>
+ <combo_box.item label="Jogos" name="item6"/>
+ <combo_box.item label="Moradia" name="item7"/>
+ <combo_box.item label="Amigável a Novos Usuários" name="item8"/>
+ <combo_box.item label="Parques &amp; Natureza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Outros" name="item12"/>
</combo_box>
- <combo_box name="land category" left="265" width="155">
- <combo_box.item name="item0" label="Qualquer Categoria"
- />
- <combo_box.item name="item1" label="Locação Linden"
- />
- <combo_box.item name="item3" label="Artes e Cultura"
- />
- <combo_box.item name="item4" label="Negócios"
- />
- <combo_box.item name="item5" label="Educacional"
- />
- <combo_box.item name="item6" label="Jogos"
- />
- <combo_box.item name="item7" label="Moradia"
- />
- <combo_box.item name="item8" label="Amigável a Novos Usuários"
- />
- <combo_box.item name="item9" label="Parques e Natureza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Outros"
- />
+ <combo_box left="265" name="land category" width="155">
+ <combo_box.item label="Qualquer Categoria" name="item0"/>
+ <combo_box.item label="Locação Linden" name="item1"/>
+ <combo_box.item label="Artes e Cultura" name="item3"/>
+ <combo_box.item label="Negócios" name="item4"/>
+ <combo_box.item label="Educacional" name="item5"/>
+ <combo_box.item label="Jogos" name="item6"/>
+ <combo_box.item label="Moradia" name="item7"/>
+ <combo_box.item label="Amigável a Novos Usuários" name="item8"/>
+ <combo_box.item label="Parques e Natureza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Outros" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" left="426" name="?"/>
<check_box label="Conteúdo Mature" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Conteúdo Mature
- </panel.string>
- <panel.string name="mature_check_adult">
- Conteúdo Adult
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- A informação do seu lote ou seu conteúdo são considerados mature.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- A informação do seu lote ou seu conteúdo são considerados adult.
- </panel.string>
<text name="Snapshot:">
Foto:
</text>
@@ -376,39 +363,31 @@ Apenas lotes maiores podem ser listados na busca.
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (nenhum)
- </panel.string>
<button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem aonde o visitante chega. Define para o ponto em que seu avatar se encontra neste lote."/>
<button label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Limpar o ponto de aterrissagem."/>
<text name="Teleport Routing: ">
Rota de Tele-transporte:
</text>
- <combo_box width="160" left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os tele-transportes no seu lote.">
- <combo_box.item name="Blocked" label="Bloqueado"
- />
- <combo_box.item name="LandingPoint" label="Ponto de Aterrissagem"
- />
- <combo_box.item name="Anywhere" label="Qualquer lugar"
- />
+ <combo_box left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os tele-transportes no seu lote." width="160">
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Ponto de Aterrissagem" name="LandingPoint"/>
+ <combo_box.item label="Qualquer lugar" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Sem Empurrar
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Sem Empurrar (Imposição na Região)
- </panel.string>
</panel>
- <panel label="Mídia" name="land_media_panel">
+ <panel label="MÃDIA" name="land_media_panel">
<text name="with media:" width="85">
Tipo de Mídia:
</text>
<combo_box left="97" name="media type" tool_tip="Especificar se a URL é um filme, uma página web ou outra mídia"/>
<text name="at URL:" width="85">
- URL da Mídia:
+ Página web:
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir..." label_selected="Definir..." name="set_media_url"/>
+ <text name="CurrentURL:">
+ Página atual:
+ </text>
+ <check_box label="Esconder a URL da Mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
<text name="Description:">
Descrição:
</text>
@@ -423,14 +402,7 @@ Textura:
a página web depois que você clicar na seta de
reproduzir.)
</text>
- <text name="Options:">
- Opções de
-Mídia:
- </text>
<check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opção o conteúdo se ajustará ao lote automaticamente. A mídia pode se tornar lenta e com baixa qualidade visual mas nenhum outro ajuste de textura ou alinhamento será necessário."/>
- <check_box label="Mídia em Repetição" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia terminar a execução, ela reiniciará do começo."/>
- <check_box label="Esconder a URL da Mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
- <check_box label="Esconder a URL de Música" name="hide_music_url" tool_tip="Ativando esta opção, a URL de música se esconderá para visualizadores não autorizados a ver esta informação do lote"/>
<text left="102" name="media_size" tool_tip="Tamanho para desenhar a mídia Web, deixar 0 como padrão." width="115">
Tamanho da mídia:
</text>
@@ -439,57 +411,43 @@ Mídia:
<text name="pixels">
pixels
</text>
- <text name="MusicURL:">
- URL da Música:
- </text>
- <line_editor left="97" name="music_url"/>
- <text name="Sound:">
- Som:
- </text>
- <check_box label="Restringir gestos e sons de objetos a este lote" left="97" name="check sound local"/>
- <button label="?" label_selected="?" name="?"/>
- <text name="Voice settings:">
- Voz:
+ <text name="Options:">
+ Opções de
+Mídia:
</text>
- <check_box left="97" label="Habilitar Voz" name="parcel_enable_voice_channel"/>
- <check_box left="97" label="Habilitar Voz (definida pela Propriedade)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box left="117" label="Restringir Voz a este lote" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Mídia em Repetição" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia terminar a execução, ela reiniciará do começo."/>
+ </panel>
+ <panel label="SOM" name="land_audio_panel">
+ <check_box label="Ativar voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Ativar voz (definições do terreno)" name="parcel_enable_voice_channel_is_estate_disabled"/>
</panel>
- <panel label="Acesso" name="land_access_panel">
+ <panel label="ACESSO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definições do terreno)
+ </panel.string>
+ <panel.string name="estate_override">
+ Uma ou mais destas opções está definida no nível de propriedade.
+ </panel.string>
<text name="Limit access to this parcel to:">
Acesso a Este Lote
</text>
- <check_box label="Permitir Acesso Público" name="public_access"/>
+ <check_box label="Acesso para público categoria [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Bloquear Acesso por:
+ Restringir acesso a contas confirmardas por:
</text>
- <check_box label="Residentes que não forneceram informações de pagamento para a Linden Lab" name="limit_payment" tool_tip="Banir residentes não identificados."/>
- <check_box label="Residentes que não tiveram a idade de adulto confirmada" name="limit_age_verified" tool_tip="Banir residentes que não tiveram sua idade verificada. Veja support.secondlife.com para maiores informações."/>
- <panel.string name="estate_override">
- Uma ou mais destas opções está definida no nível de propriedade.
- </panel.string>
+ <check_box label="Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Banir residentes não identificados."/>
+ <check_box label="Idade confirmada: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
<check_box label="Permitir Acesso do Grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/>
<check_box label="Vender passes para:" name="PassCheck" tool_tip="Permite acesso temporário a este terreno"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Qualquer um"
- />
- <combo_box.item name="Group" label="Grupo"
- />
+ <combo_box.item label="Qualquer um" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
</combo_box>
<spinner label="Preço em L$:" name="PriceSpin"/>
<spinner label="Horas de Acesso:" name="HoursSpin"/>
- <text label="Permitir Sempre" name="AllowedText">
- Residentes Permitidos
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listados, [MAX] máximo)"/>
- <button label="Adicionar..." label_selected="Adicionar..." name="add_allowed"/>
- <button label="Remover" label_selected="Remover" name="remove_allowed"/>
- <text label="Banir" name="BanCheck">
- Residentes Banidos
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listados, [MAX] máximo)"/>
- <button label="Adicionar..." label_selected="Adicionar..." name="add_banned"/>
- <button label="Remover" label_selected="Remover" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="(Total [LISTED], máx de [MAX])"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_activeim.xml b/indra/newview/skins/default/xui/pt/floater_activeim.xml
new file mode 100644
index 0000000000..892ccdf974
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="MI ativa"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
index f3297ea5ee..020cfbc811 100644
--- a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
@@ -1,70 +1,177 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Não foi possível iniciar o movimento
+ </floater.string>
+ <floater.string name="anim_too_long">
+ O arquivo de animação tem [LENGTH] segundos de duração.
+
+A duração máxima de animação permitida é de [MAX_LENGTH] segundos.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Não foi possível ler o arquivo de animação.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fim de arquivo prematuro
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossível ler definição constraint.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossível abrir arquivo BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ RAIZ ou JUNTA não encontrados.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossível obter nome JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossível localizar OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossível localizar CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossível obter ordem de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Impossível obter eixo de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossível localizar MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossível determinar número de quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossível determinar tempo dos quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossível definir posicionamento.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossível definir valores da rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossível abrir arquivo de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossível ler cabeçalho de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossível ler nomes traduzidos.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossível obter valor traduzido a ignorar.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossível obter valor traduzido relativo.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Impossível obter valor traduzido.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossível ler matriz de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossível obter nome mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossível obter nome mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossível obter valor prioritário.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossível obter valor do loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossível obter valor easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Impossível obter valor easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossível obter valor de morph da mão.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossível ler nome do emote.
+ </floater.string>
<text name="name_label">
Nome:
</text>
<text name="description_label">
Descrição:
</text>
- <spinner label_width="72" width="110" label="Prioridade" name="priority" tool_tip="Controla quais animações podem se sobrepor a esta animação."/>
- <check_box label="Loop" name="loop_check" tool_tip="Executa a animação repetidamente."/>
- <spinner label_width="56" left="65" width="116" label="Dentro(%)" name="loop_in_point" tool_tip="Ajusta o ponto da animação onde a repetição começa."/>
- <spinner label_width="40" left="185" label="Fora(%)" name="loop_out_point" tool_tip="Ajusta o ponto da animação onde a repetição termina."/>
+ <spinner label="Prioridade" label_width="72" name="priority" tool_tip="Controla quais animações podem ser interrompidas por esta animação" width="110"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Executa esta animação sem parar"/>
+ <spinner label="Dentro(%)" label_width="56" left="65" name="loop_in_point" tool_tip="Define o ponto em que a animação em loop reinicia" width="116"/>
+ <spinner label="Fora(%)" label_width="40" left="185" name="loop_out_point" tool_tip="Define o ponto em que a animação em loop acaba"/>
<text name="hand_label">
Pose de Mão
</text>
- <combo_box left_delta="100" width="184" name="hand_pose_combo" tool_tip="Controla o que as mãos fazem durante a animação">
- <combo_box.item name="Spread" label="Espreguiçar" />
- <combo_box.item name="Relaxed" label="Relaxado" />
- <combo_box.item name="PointBoth" label="Apontar Ambos" />
- <combo_box.item name="Fist" label="Punho" />
- <combo_box.item name="RelaxedLeft" label="Relaxado para Esquerda" />
- <combo_box.item name="PointLeft" label="Apontar à Esquerda" />
- <combo_box.item name="FistLeft" label="Punho Esquerdo" />
- <combo_box.item name="RelaxedRight" label="Relaxado para Direita" />
- <combo_box.item name="PointRight" label="Apontar à Direita" />
- <combo_box.item name="FistRight" label="Punho Direito" />
- <combo_box.item name="SaluteRight" label="Saudar à Direita" />
- <combo_box.item name="Typing" label="Digitando" />
- <combo_box.item name="PeaceRight" label="Pacífico à Direita" />
+ <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controla os gestos das mãos durante a animação" width="184">
+ <combo_box.item label="Abrir" name="Spread"/>
+ <combo_box.item label="Relaxado" name="Relaxed"/>
+ <combo_box.item label="Apontar ambas" name="PointBoth"/>
+ <combo_box.item label="Punho" name="Fist"/>
+ <combo_box.item label="E relaxada" name="RelaxedLeft"/>
+ <combo_box.item label="Apontar E" name="PointLeft"/>
+ <combo_box.item label="Punho E" name="FistLeft"/>
+ <combo_box.item label="D relaxada" name="RelaxedRight"/>
+ <combo_box.item label="Apontar D" name="PointRight"/>
+ <combo_box.item label="Punho D" name="FistRight"/>
+ <combo_box.item label="Saudação D" name="SaluteRight"/>
+ <combo_box.item label="Escrevendo" name="Typing"/>
+ <combo_box.item label="Paz D" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expressão
</text>
- <combo_box left_delta="100" width="184" name="emote_combo" tool_tip="Controla o que a face faz durante a animação.">
- <combo_box.item name="[None]" label="None]" />
- <combo_box.item name="Aaaaah" label="Aaaaah" />
- <combo_box.item name="Afraid" label="Temeroso" />
- <combo_box.item name="Angry" label="Raivoso" />
- <combo_box.item name="BigSmile" label="Sorrisão" />
- <combo_box.item name="Bored" label="Entediado" />
- <combo_box.item name="Cry" label="Chorar" />
- <combo_box.item name="Disdain" label="Desprezar" />
- <combo_box.item name="Embarrassed" label="Envergonhado" />
- <combo_box.item name="Frown" label="Franzir a testa" />
- <combo_box.item name="Kiss" label="Beijar" />
- <combo_box.item name="Laugh" label="Rir" />
- <combo_box.item name="Plllppt" label="Plllppt" />
- <combo_box.item name="Repulsed" label="Enojado" />
- <combo_box.item name="Sad" label="Triste" />
- <combo_box.item name="Shrug" label="Indiferença" />
- <combo_box.item name="Smile" label="Sorriso" />
- <combo_box.item name="Surprise" label="Surpreso" />
- <combo_box.item name="Wink" label="Piscar" />
- <combo_box.item name="Worry" label="Preocupado" />
+ <combo_box left_delta="100" name="emote_combo" tool_tip="Controla as expressões faciais durante a animação" width="184">
+ <combo_box.item label="(nenhum)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Com medo" name="Afraid"/>
+ <combo_box.item label="Bravo" name="Angry"/>
+ <combo_box.item label="Sorriso contagiante" name="BigSmile"/>
+ <combo_box.item label="À toa" name="Bored"/>
+ <combo_box.item label="Chorar" name="Cry"/>
+ <combo_box.item label="Desdenho" name="Disdain"/>
+ <combo_box.item label="Com vergonha" name="Embarrassed"/>
+ <combo_box.item label="Franzir testa" name="Frown"/>
+ <combo_box.item label="Beijo" name="Kiss"/>
+ <combo_box.item label="Rir" name="Laugh"/>
+ <combo_box.item label="Mostrar a língua" name="Plllppt"/>
+ <combo_box.item label="Asco" name="Repulsed"/>
+ <combo_box.item label="Triste" name="Sad"/>
+ <combo_box.item label="Encolher os ombros" name="Shrug"/>
+ <combo_box.item label="Sorriso" name="Smile"/>
+ <combo_box.item label="Surpresa" name="Surprise"/>
+ <combo_box.item label="Piscar" name="Wink"/>
+ <combo_box.item label="Preocupado" name="Worry"/>
</combo_box>
<text name="preview_label" width="250">
Prever enquanto
</text>
- <combo_box left_delta="100" width="130" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns.">
- <combo_box.item name="Standing" label="Parado" />
- <combo_box.item name="Walking" label="Andando" />
- <combo_box.item name="Sitting" label="Sentando" />
- <combo_box.item name="Flying" label="Voando" />
+ <combo_box left_delta="100" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns." width="130">
+ <combo_box.item label="Em pé" name="Standing"/>
+ <combo_box.item label="Andando" name="Walking"/>
+ <combo_box.item label="Sentado" name="Sitting"/>
+ <combo_box.item label="Voando" name="Flying"/>
</combo_box>
- <spinner label_width="125" width="192" label="Facilitar a entrada (sec)" name="ease_in_time" tool_tip="Quantidade de tempo (em segundos) para que as animações se mesclem."/>
- <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Facilitar a saída (sec)" name="ease_out_time" tool_tip="Quantidade de tempo (em segundos) para que a animações se mesclem."/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Executa/pausa sua animação."/>
+ <spinner label="Facilitar a entrada (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (em segundos) da transição inicial da animação" width="192"/>
+ <spinner bottom_delta="-20" label="Facilitar a saída (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (em segundos) da transição de saída da animação" width="192"/>
+ <button bottom_delta="-32" name="play_btn" tool_tip="Executar animação"/>
+ <button name="pause_btn" tool_tip="Pausar a animação"/>
<button label="" name="stop_btn" tool_tip="Interrompe a execução da animação."/>
<text name="bad_animation_text">
Incapaz de ler o arquivo de animação.
@@ -72,19 +179,6 @@
Nós recomendamos exportar arquivos BVH do
Poser 4.
</text>
- <button label="Cancelar" name="cancel_btn"/>
<button label="Carregar (L$[AMOUNT])" name="ok_btn"/>
- <string name="failed_to_initialize">
- Não foi possível iniciar o movimento
- </string>
- <string name="anim_too_long">
- O arquivo de animação tem [LENGTH] segundos de duração.
-
-A duração máxima de animação permitida é de [MAX_LENGTH] segundos.
- </string>
- <string name="failed_file_read">
- Não foi possível ler o arquivo de animação.
-
-[STATUS]
- </string>
+ <button label="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml
index 48e0b92400..074f7bf001 100644
--- a/indra/newview/skins/default/xui/pt/floater_auction.xml
+++ b/indra/newview/skins/default/xui/pt/floater_auction.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="Iniciar a venda de terrenos da Linden">
- <check_box label="Incluir marcador de seleção amarelo" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <text name="already for sale">
+<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN START">
+ <floater.string name="already for sale">
Você não pode leiloar terrenos que já estão configurados para venda.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Incluir marcador de seleção amarelo" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="Vender a qualquer um" label_selected="Vender a qualquer um" name="sell_to_anyone_btn"/>
+ <button label="Clear Settings" label_selected="Limpar configurações" name="reset_parcel_btn"/>
+ <button label="Iniciar Leilão" label_selected="Iniciar Leilão" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
index 4e1598c8fa..a2e6f7945a 100644
--- a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="Escolha o Residente" min_width="285" width="285">
+<floater min_width="285" name="avatarpicker" title="SELECIONE O RESIDENTE" width="285">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; não encontrado
+ </floater.string>
+ <floater.string name="no_one_near">
+ Ninguém por perto
+ </floater.string>
+ <floater.string name="no_results">
+ Nenhum resultado
+ </floater.string>
+ <floater.string name="searching">
+ Buscando...
+ </floater.string>
+ <string label="Selecionar" label_selected="Selecionar" name="Select">
+ Selecionar
+ </string>
+ <string name="Close">
+ Fechar
+ </string>
<tab_container name="ResidentChooserTabs" width="275">
<panel label="Buscar" name="SearchPanel">
<text name="InstructSearchResidentName">
- Digite parte do nome do Residente:
+ Digite parte do nome de alguém:
</text>
- <button label="Encontrar" label_selected="Encontrar" name="Find"/>
+ <button label="OK" label_selected="OK" name="Find"/>
</panel>
- <panel label="Cartões de Visita" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Selecione um cartão de visita:
+ <panel label="Amigos" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Selecione alguém:
</text>
</panel>
<panel label="Próximo a Mim" name="NearMePanel">
<text name="InstructSelectResident">
- Selecione residente
-próximo:
+ Selecione alguém por perto:
</text>
- <button font="SansSerifSmall" left_delta="1" width="115" label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh"/>
- <slider label="Faixa" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Faixa" name="near_me_range"/>
<text name="meters">
Metros
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Atualizar Lista" label_selected="Atualizar Lista" left_delta="1" name="Refresh" width="115"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Selecionar" label_selected="Selecionar" name="Select"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; não encontrado
- </string>
- <string name="no_one_near">
- Ninguém proximo
- </string>
- <string name="no_results">
- Nenhum resultado
- </string>
- <string name="searching">
- Buscando...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
index db0023d748..0d52fec23b 100644
--- a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
@@ -1,30 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="Texturas do Avatar">
- <text name="baked_label">
- Texturas sobrepostas
- </text>
+<floater name="avatar_texture_debug" title="TEXTURAS DE AVATAR">
+ <floater.string name="InvalidAvatar">
+ AVATAR INVÃLIDO
+ </floater.string>
<text name="composite_label">
Texturas compostas
</text>
- <texture_picker label="Cabeça" name="baked_head"/>
- <texture_picker label="Maquiagem" name="head_bodypaint"/>
- <texture_picker label="Cabelo" name="hair"/>
<button label="Tombar" label_selected="Tombar" name="Dump"/>
- <texture_picker label="Olhos" name="baked_eyes"/>
- <texture_picker label="Olho" name="eye_texture"/>
- <texture_picker label="Parte de cima" name="baked_upper_body"/>
- <texture_picker label="Tatuagem para partes de cima" name="upper_bodypaint"/>
- <texture_picker label="Camiseta" name="undershirt"/>
- <texture_picker label="Luvas" name="gloves"/>
- <texture_picker label="Camisa" name="shirt"/>
- <texture_picker label="Jaqueta" name="upper_jacket"/>
- <texture_picker label="Parte de baixo" name="baked_lower_body"/>
- <texture_picker label="Tatuagem para partes de baixo" name="lower_bodypaint"/>
- <texture_picker label="Roupas de baixo" name="underpants"/>
- <texture_picker label="Meias" name="socks"/>
- <texture_picker label="Calçados" name="shoes"/>
- <texture_picker label="Calças" name="pants"/>
- <texture_picker label="Jaqueta" name="jacket"/>
- <texture_picker label="Saia" name="baked_skirt"/>
- <texture_picker label="Saia" name="skirt_texture"/>
+ <texture_picker label="Cabelo" name="hair_grain"/>
+ <texture_picker label="Cabelo alpha" name="hair_alpha"/>
+ <texture_picker label="Maquilagem" name="head_bodypaint"/>
+ <texture_picker label="Cabeça Alpha" name="head_alpha"/>
+ <texture_picker label="Tatuagem na cabeça" name="head_tattoo"/>
+ <texture_picker label="Olho" name="eyes_iris"/>
+ <texture_picker label="Olhos Alpha" name="eyes_alpha"/>
+ <texture_picker label="Pintura corporal, cintura para cima" name="upper_bodypaint"/>
+ <texture_picker label="Camiseta" name="upper_undershirt"/>
+ <texture_picker label="Luvas" name="upper_gloves"/>
+ <texture_picker label="Camisa" name="upper_shirt"/>
+ <texture_picker label="Jaqueta (cima)" name="upper_jacket"/>
+ <texture_picker label="Alpha de cima" name="upper_alpha"/>
+ <texture_picker label="Tatuagem parte de cima" name="upper_tattoo"/>
+ <texture_picker label="Pintura corporal, cintura para baixo" name="lower_bodypaint"/>
+ <texture_picker label="Roupa de baixo" name="lower_underpants"/>
+ <texture_picker label="Meias" name="lower_socks"/>
+ <texture_picker label="Sapatos" name="lower_shoes"/>
+ <texture_picker label="Calças" name="lower_pants"/>
+ <texture_picker label="Jaqueta" name="lower_jacket"/>
+ <texture_picker label="Alpha inferior" name="lower_alpha"/>
+ <texture_picker label="Tatuagem de baixo" name="lower_tattoo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml
index edd1e08094..b16ff6003e 100644
--- a/indra/newview/skins/default/xui/pt/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="Balizas">
+<floater name="beacons" title="BALIZAS">
<panel name="beacons_panel">
- <check_box label="Objetos programados com toque apenas" name="touch_only"/>
- <check_box label="Objetos programados" name="scripted"/>
- <check_box label="Objetos físicos" name="physical"/>
- <check_box label="Fontes de Som" name="sounds"/>
- <check_box label="Fontes de Partículas" name="particles"/>
- <check_box label="Renderização de Highlights" name="highlights"/>
- <check_box label="Renderização de Balizas" name="beacons"/>
- <text name="beacon_width_label">
- Largura da Baliza
+ <text name="label_show">
+ Mostrar:
</text>
+ <check_box label="Balizas" name="beacons"/>
+ <check_box label="Realce" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Largura da baliza">
+ Largura:
+ </text>
+ <text name="label_objects">
+ Para estes objetos:
+ </text>
+ <check_box label="Físicos" name="physical"/>
+ <check_box label="Com script" name="scripted"/>
+ <check_box label="Só tocar" name="touch_only"/>
+ <check_box label="Fontes de som" name="sounds"/>
+ <check_box label="Fontes de partículas" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml
index ebc9d0f0c8..71a1483dde 100644
--- a/indra/newview/skins/default/xui/pt/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="Opções de grade">
- <spinner label="Uni. Grade (metros)" name="GridResolution" width="180" label_width="122"/>
- <spinner label="Ext. da Grade (metros)" name="GridDrawSize" width="180" label_width="122"/>
- <check_box label="Habilitar ajuste de sub-grade" name="GridSubUnit"/>
- <check_box label="Mostrar as seções de cruzamento" name="GridCrossSection"/>
+<floater name="build options floater" title="OPÇÕES DE GRADE">
+ <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/>
+ <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/>
+ <check_box label="Encaixar em sub-unidades" name="GridSubUnit"/>
+ <check_box label="Ver corte transversal" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacidade da grade">
+ Opacidade:
+ </text>
<slider label="Opacidade da grade" name="GridOpacity" width="220"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
index c064d24f96..9f34111d8a 100644
--- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Mudança conjunta das permissões de conteúdo">
- <text name="applyto">
- Tipos de Conteúdo
- </text>
+<floater name="floaterbulkperms" title="EDITAR AUTORIZAÇÕES DE CONTEÚDO">
+ <floater.string name="nothing_to_modify_text">
+ A seleção não contém nenhum conteúdo editável.
+ </floater.string>
+ <floater.string name="status_text">
+ Definindo permissões em [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Iniciando solicitação de mudança de permissão...
+ </floater.string>
+ <floater.string name="done_text">
+ Solicitação de mudança de permissão concluída.
+ </floater.string>
<check_box label="Animação" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animação"/>
<check_box label="Partes do Corpo" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Partes do corpo"/>
<check_box label="Roupas" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Vestuário"/>
<check_box label="Gestos" name="check_gesture"/>
- <check_box label="Landmarks" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestos"/>
<check_box label="Notecards" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Anotações"/>
<check_box label="Objetos" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objects"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Sons" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sons"/>
<check_box label="Texturas" name="check_texture"/>
- <button label="Marcar Todas" label_selected="Todas" name="check_all"/>
- <button label="Desmarcar Todas" label_selected="Nenhuma" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texturas"/>
+ <button label="√ Tudo" label_selected="Todas" name="check_all"/>
+ <button label="Limpar" label_selected="Nenhuma" name="check_none"/>
<text name="newperms">
- Novas Permissões
+ Novas autorizações de conteúdo
+ </text>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <check_box label="Compartilhar com o grupo" name="share_with_group"/>
- <check_box label="Permitir que qualquer um copie" name="everyone_copy"/>
+ <check_box label="Compartilhar" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Todos:
+ </text>
+ <check_box label="Copiar" name="everyone_copy"/>
<text name="NextOwnerLabel">
- O próximo dono pode:
+ Próximo proprietário:
</text>
<check_box label="Modificar" name="next_owner_modify"/>
<check_box label="Copiar" name="next_owner_copy"/>
- <check_box label="Revender/Dar" name="next_owner_transfer"/>
- <button label="Ajuda" name="help"/>
- <button label="Aplicar" name="apply"/>
- <button label="Fechar" name="close"/>
- <string name="nothing_to_modify_text">
- A seleção não contém nenhum conteúdo editável.
- </string>
- <string name="status_text">
- Definindo permissões em [NAME]
- </string>
- <string name="start_text">
- Iniciando solicitação de mudança de permissão...
- </string>
- <string name="done_text">
- Solicitação de mudança de permissão concluída.
- </string>
+ <check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ <button label="OK" name="apply"/>
+ <button label="Cancelar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_bumps.xml b/indra/newview/skins/default/xui/pt/floater_bumps.xml
index 0bc2546275..5e656f4730 100644
--- a/indra/newview/skins/default/xui/pt/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bumps.xml
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="Colisões, impulsos e batidas">
- <text name="none_detected">
+<floater name="floater_bumps" title="COLISÕES, IMPULSOS E BATIDAS">
+ <floater.string name="none_detected">
Nada detectado
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] conflitou com você
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] empurrou você com um script
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto programado
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto físico
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
index 3e8713d59e..c64523ceb3 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="Comprar conteúdo">
+<floater name="floater_buy_contents" title="COMPRAR CONTEÚDO">
<text name="contains_text">
[NAME] contém:
</text>
@@ -7,8 +7,8 @@
Comprar por L$[AMOUNT] de(a) [NAME]?
</text>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn" width="73"/>
- <button label="Comprar" label_selected="Comprar" name="buy_btn" width="73" left_delta="-77"/>
- <check_box label="Vestir roupa agora" name="wear_check" left_delta="-130"/>
+ <button label="Comprar" label_selected="Comprar" left_delta="-77" name="buy_btn" width="73"/>
+ <check_box label="Vestir roupa agora" left_delta="-130" name="wear_check"/>
<string name="no_copy_text">
(sem copiar)
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index 42ba205475..b3cce2d78f 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -1,68 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="Comprar Dinheiro">
- <text name="info_buying">
- Comprando Dinheiro:
- </text>
- <text name="info_cannot_buy">
- Não pode comprar agora:
- </text>
+<floater name="buy currency" title="Comprar L$">
+ <floater.string name="buy_currency">
+ Compre L$ [LINDENS] por aprox. [LOCALAMOUNT]
+ </floater.string>
<text name="info_need_more">
- Você precisa de mais dinheiro:
+ Você precisa de mais L$
</text>
- <text name="error_message">
- Algo não está certo.
- </text>
- <button label="Ir para o website" name="error_web"/>
<text name="contacting">
Contatando LindeX...
</text>
- <text name="buy_action_unknown">
- Comprar L$ no câmbio atual da LindeX
- </text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
- </text>
- <text name="currency_action" width="60">
+ <text name="info_buying">
Comprar L$
</text>
- <line_editor name="currency_amt" left_delta="65" width="70">
- 1234
- </line_editor>
- <text name="currency_est" left_delta="72">
- por aproxim. US$ [USD]
- </text>
- <text name="getting_data">
- Obtendo dados...
- </text>
<text name="balance_label">
- Você tem atualmente
+ Tenho
</text>
<text name="balance_amount">
L$ [AMT]
</text>
+ <text name="currency_action" width="60">
+ Comprar
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" left_delta="65" name="currency_amt" width="70">
+ 1234
+ </line_editor>
<text name="buying_label">
- Você está comprando
+ O preço é
</text>
- <text name="buying_amount">
- L$ [AMT]
+ <text left_delta="72" name="currency_est">
+ aprox. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Calculando...
+ </text>
+ <text name="buy_action">
+ [NAME] L$ [PRICE]
</text>
<text name="total_label">
- Seu saldo será
+ Saldo resultante:
</text>
<text name="total_amount">
L$ [AMT]
</text>
+ <text name="currency_links">
+ [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ </text>
+ <text name="exchange_rate_note">
+ Digite o valor novamente para ver o câmbio atual.
+ </text>
<text name="purchase_warning_repurchase">
- Confirmando esta compra só compra a moeda.
-Você precisará tentar novamente a operação.
+ Confirmar esta transação compra somente L$, não o objeto.
</text>
<text name="purchase_warning_notenough">
- Você não está comprando moeda suficiente.
-Aumente a quantidade de compra.
+ O valor da transação não é suficiente. Aumente o volume da compra.
</text>
+ <button label="Comprar já!" name="buy_btn"/>
<button label="Fechar" name="cancel_btn"/>
- <button label="Adquirir" name="buy_btn"/>
- <string name="buy_currency">
- Comprar L$ [LINDENS] por aproximadamente US$ [USD]
- </string>
+ <text name="info_cannot_buy">
+ Transação incompleta
+ </text>
+ <button label="Prosseguir para a web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 2caf057283..f0e5808df3 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="Comprar terra">
+<floater name="buy land" title="COMPRAR TERRENO">
<text name="region_name_label">
Região:
</text>
- <text name="region_name_text" left="560">
+ <text left="560" name="region_name_text">
(desconhecido)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text name="region_type_text" left="560">
+ <text left="560" name="region_type_text">
(desconhecido)
</text>
<text name="estate_name_label">
Propriedade:
</text>
- <text name="estate_name_text" left="560">
+ <text left="560" name="estate_name_text">
(desconhecido)
</text>
- <text name="estate_owner_label" width="105" right="565">
+ <text name="estate_owner_label" right="565" width="105">
Dono da propriedade:
</text>
- <text name="estate_owner_text" left="560" >
+ <text left="560" name="estate_owner_text">
(desconhecido)
</text>
<text name="resellable_changeable_label">
@@ -40,7 +40,7 @@
<text_editor name="covenant_editor">
Carregando...
</text_editor>
- <check_box label="Eu concordo com as definições do &#10;Corretor feitas acima." name="agree_covenant"/>
+ <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/>
<text name="info_parcel_label">
Lote:
</text>
@@ -58,8 +58,7 @@
</text>
<text name="info_price">
L$ 1500
-(L$ 1.1/m²)
-vendido com os objetos
+(L$ 1,1/m²) inclui objetos
</text>
<text name="info_action">
Comprar este lote irá:
@@ -67,7 +66,7 @@ vendido com os objetos
<text name="error_message">
Algo ainda não está correto.
</text>
- <button label="Ir para a página da web" name="error_web" width="150" />
+ <button label="Ir para a página da web" name="error_web" width="150"/>
<text name="account_action">
Evoluir sua conta para membro Premium
</text>
@@ -75,16 +74,16 @@ vendido com os objetos
Somente membros Premium podem possuir terra.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/mês, debitado mensalmente" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/mês, debitado trimestralmente" />
- <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/mês, debitado anualmente" />
+ <combo_box.item label="US$9.95/mês, pagamento mensal" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7,50/mês, pagamento trimestral" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/mês, pagamento trimestral" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Aumente sua taxa de locação de terra para US$ 40/mês.
</text>
<text name="land_use_reason">
- Você possui 1309 m² de terra.
-Este lote tem 512 m² de terra.
+ Você tem 1309 m².
+Este lote mede 512 m².
</text>
<text name="purchase_action">
Pagar ao Residente Joe L$4000 pela terra
@@ -95,16 +94,16 @@ Este lote tem 512 m² de terra.
<text name="currency_action" width="116">
Compre L$ adicionais
</text>
- <line_editor name="currency_amt" left="190" width="65">
+ <line_editor left="190" name="currency_amt" width="65">
1000
</line_editor>
<text name="currency_est">
- por aproxim. US$ [AMOUNT2]
+ cerca de [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Você tem L$2,100.
</text>
- <check_box label="Remover [AMOUNT] m² de contribuição do grupo." name="remove_contribution"/>
+ <check_box label="Subtrair [AMOUNT] m² da minha contribuição." name="remove_contribution"/>
<button label="Adquirir" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
<string name="can_resell">
@@ -179,26 +178,26 @@ Este lote tem 512 m² de terra.
Sua conta pode possuir uma terra.
</string>
<string name="land_holdings">
- Você possui [BUYER] m² de terra.
+ Você tem [BUYER] m².
</string>
<string name="pay_to_for_land">
Pagar L$ [AMOUNT] para [SELLER] por esta terra
</string>
<string name="buy_for_US">
- Comprar L$ [AMOUNT] por aprox. US$ [AMOUNT2],
+ Compre L$ [AMOUNT] por cerca de [LOCAL_AMOUNT],
</string>
<string name="parcel_meters">
- Este lote tem [AMOUNT] m².
+ Este lote tem [AMOUNT] m²
</string>
<string name="premium_land">
- Esta terra é premium e será taxada como [AMOUNT] m².
+ Esse é um terreno premium e custa o equivalente a [AMOUNT] m².
</string>
<string name="discounted_land">
- Esta terra tem desconto e será taxada como [AMOUNT] m².
+ Esse é um terreno com desconto, e custa o equivalente a [AMOUNT] m².
</string>
<string name="meters_supports_object">
[AMOUNT] m²
-aceita [AMOUNT2] objetos
+suporta [AMOUNT2] objetos
</string>
<string name="sold_with_objects">
vendido com objetos
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_object.xml b/indra/newview/skins/default/xui/pt/floater_buy_object.xml
index b8e1085471..d71eb04cc4 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Comprar cópia do objeto">
+<floater name="contents" title="COMPRAR CÓPIA DO OBJETO">
<text name="contents_text">
- e seus conteúdos:
+ Contém:
</text>
<text name="buy_text">
Comprar por L$[AMOUNT] de(a) [NAME]?
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index b61e261148..5114b19336 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -10,7 +10,22 @@
Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
</floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita"/>
- <joystick_zoom name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"/>
+ <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/>
+ <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco">
+ <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Órbita em torno do foco da câmera"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Vista de trás"/>
+ <button name="group_view" tool_tip="Visualizar grupo"/>
+ <button name="front_view" tool_tip="Vista frontal"/>
+ <button name="mouselook_view" tool_tip="Visâo do mouse"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Câmera orbital"/>
+ <button label="" name="pan_btn" tool_tip="Câmera Pan"/>
+ <button label="" name="avatarview_btn" tool_tip="ver como o avatar"/>
+ <button label="" name="freecamera_btn" tool_tip="Visualizar objeto"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_choose_group.xml b/indra/newview/skins/default/xui/pt/floater_choose_group.xml
index 449d578716..60f01a3733 100644
--- a/indra/newview/skins/default/xui/pt/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/pt/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="groups" title="Grupos">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GRUPOS">
<text name="groupdesc">
Escolha um grupo:
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Cancelar" label_selected="Cancelar" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_color_picker.xml b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
index 76da972b5d..d60a815f30 100644
--- a/indra/newview/skins/default/xui/pt/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="Seletor de Cor">
+<floater name="ColorPicker" title="DESTAQUE DE COR">
<text name="r_val_text">
Vermelho:
</text>
@@ -18,15 +18,14 @@
<text name="l_val_text">
Lum:
</text>
- <check_box label="Aplicar imediatamente" name="apply_immediate"/>
- <button left_delta="150" name="color_pipette" />
- <button left_delta="55" label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
- <button label="Selecionar" label_selected="Selecionar" name="select_btn"/>
+ <check_box label="inscrever-se agora" name="apply_immediate"/>
+ <button left_delta="150" name="color_pipette"/>
+ <button label="Cancelar" label_selected="Cancelar" left_delta="55" name="cancel_btn"/>
+ <button label="Ok" label_selected="Ok" name="select_btn"/>
<text name="Current color:">
Cor atual:
</text>
<text name="(Drag below to save.)">
- (Arraste abaixo
- para salvar)
+ (Arrastar abaixo para salvar)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
index 4bced69664..447ca8c543 100644
--- a/indra/newview/skins/default/xui/pt/floater_customize.xml
+++ b/indra/newview/skins/default/xui/pt/floater_customize.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="Aparência" width="546">
+<floater name="floater customize" title="APARÊNCIA" width="546">
<tab_container name="customize tab container" tab_min_width="115" width="544">
<placeholder label="Partes de corpo" name="body_parts_placeholder"/>
<panel label="Forma" name="Shape">
@@ -14,8 +14,8 @@
<button label="Tórax" label_selected="Tórax" name="Torso"/>
<button label="Pernas" label_selected="Pernas" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Feminino" />
- <radio_item name="radio2" label="Masculino" />
+ <radio_item label="Feminino" name="radio"/>
+ <radio_item label="Masculino" name="radio2"/>
</radio_group>
<text name="title">
[DESC]
@@ -47,10 +47,10 @@ Alternativamente, você pode criar uma nova de um esboço e usá-la.
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
</panel>
<panel label="Pele" name="Skin">
- <button width="115" label="Cor de Pele" label_selected="Cor de Pele" name="Skin Color"/>
- <button width="115" label="Detalhes Faciais" label_selected="Detalhes Faciais" name="Face Detail"/>
- <button width="115" label="Maquiagem" label_selected="Maquiagem" name="Makeup"/>
- <button width="115" label="Detalhes do Corpo" label_selected="Detalhes do Corpo" name="Body Detail"/>
+ <button label="Cor de Pele" label_selected="Cor de Pele" name="Skin Color" width="115"/>
+ <button label="Detalhes Faciais" label_selected="Detalhes Faciais" name="Face Detail" width="115"/>
+ <button label="Maquiagem" label_selected="Maquiagem" name="Makeup" width="115"/>
+ <button label="Detalhes do Corpo" label_selected="Detalhes do Corpo" name="Body Detail" width="115"/>
<text name="title">
[DESC]
</text>
@@ -77,19 +77,19 @@ e usá-la.
<text name="Item Action Label">
Pele:
</text>
- <texture_picker width="86" label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho"/>
- <texture_picker width="86" label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho"/>
- <texture_picker width="86" label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho"/>
+ <texture_picker label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
+ <texture_picker label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
+ <texture_picker label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
<button label="Criar Nova Pele" label_selected="Criar Nova Pele" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
<panel label="Cabelo" name="Hair">
- <button width="115" label="Cor" label_selected="Cor" name="Color"/>
- <button width="115" label="Estilo" label_selected="Estilo" name="Style"/>
- <button width="115" label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows"/>
- <button width="115" label="Rosto" label_selected="Rosto" name="Facial"/>
+ <button label="Cor" label_selected="Cor" name="Color" width="115"/>
+ <button label="Estilo" label_selected="Estilo" name="Style" width="115"/>
+ <button label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows" width="115"/>
+ <button label="Rosto" label_selected="Rosto" name="Facial" width="115"/>
<text name="title">
[DESC]
</text>
@@ -154,10 +154,10 @@ Alternativamente, você pode criar um novo modelo de um esboço e usá-lo.
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
- <panel label="Roupas" name="clothes_placeholder"/>
+ <placeholder label="Roupas" name="clothes_placeholder"/>
<panel label="Camisa" name="Shirt">
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Nova Camisa" label_selected="Criar Nova Camisa" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -192,7 +192,7 @@ um esboço e usá-lo.
</panel>
<panel label="Calças" name="Pants">
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas."/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Novas Calças" label_selected="Criar Novas Calças" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -253,7 +253,7 @@ de um esboço e usá-lo.
Sapatos:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Novos Sapatos" label_selected="Criar Novos Sapatos" name="Create New" width="166"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -288,7 +288,7 @@ um esboço e usá-las.
Meias:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Novas Meias" label_selected="Criar Novas Meias" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -324,7 +324,7 @@ partir de um esboço e usá-lo.
</text>
<texture_picker label="Tecido Superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
<texture_picker label="Tecido Inferior" name="Lower Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Nova Jaqueta" label_selected="Criar Nova Jaqueta" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -359,7 +359,7 @@ partir de um esboço e usá-lo.
Luvas:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Novas Luvas" label_selected="Criar Novas Luvas" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -394,7 +394,7 @@ partir de um esboço e usá-lo.
Camiseta:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Nova Camiseta" label_selected="Criar Nova Camiseta" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -429,7 +429,7 @@ modelo a partir de um esboço e usá-lo.
Roupas de Baixo:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Novas Roupas de Baixo" label_selected="Criar Novas Roupas de Baixo" name="Create New" width="180"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
@@ -464,16 +464,88 @@ partir de um esboço e usá-lo.
Saia:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Criar Nova Saia" label_selected="Criar Nova Saia" name="Create New"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]:
+ </text>
+ <text name="title_no_modify">
+ [DESC]: não pode ser modificado
+ </text>
+ <text name="title_loading">
+ [DESC]: Carregando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: não vestido
+ </text>
+ <text name="path">
+ Localização: [PATH]
+ </text>
+ <text name="not worn instructions">
+ Para por uma máscara alpha nova, arraste a máscara do inventário para o seu avatar.
+Ou crie uma máscara nova e coloque-a.
+ </text>
+ <text name="no modify instructions">
+ Você não está autorizado a modificar este acessório.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
+ <button label="Criar Alpha novo" label_selected="Criar Alpha novo" name="Create New"/>
+ <button label="Tirar" label_selected="Tirar" name="Take Off"/>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
+ <button label="Reverter" label_selected="Reverter" name="Revert"/>
+ </panel>
+ <panel label="Tatuagem" name="Tattoo">
+ <text name="title">
+ [DESC]:
+ </text>
+ <text name="title_no_modify">
+ [DESC]: não pode ser modificado
+ </text>
+ <text name="title_loading">
+ [DESC]: Carregando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: não vestido
+ </text>
+ <text name="path">
+ Localização: [PATH]
+ </text>
+ <text name="not worn instructions">
+ Para por uma tatuagem nova, arraste uma tatuagem do inventário para o seu avatar.
+Ou crie uma tatuagem nova.
+ </text>
+ <text name="no modify instructions">
+ Você não está autorizado a modificar este acessório.
+ </text>
+ <text name="Item Action Label">
+ Tatuagem:
+ </text>
+ <texture_picker label="Tatuagem na cabeça" name="Head Tattoo" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem parte de cima" name="Upper Tattoo" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem de baixo" name="Lower Tattoo" tool_tip="Selecionar imagem"/>
+ <button label="Criar tatuagem" label_selected="Criar tatuagem" name="Create New"/>
+ <button label="Tirar" label_selected="Tirar" name="Take Off"/>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
+ <button label="Reverter" label_selected="Reverter" name="Revert"/>
+ </panel>
</tab_container>
<scroll_container left="249" name="panel_container"/>
+ <button label="Criar look" label_selected="Criar look" name="make_outfit_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Criar Vestimenta..." label_selected="Criar Vestimenta..." name="Make Outfit" left="117" width="125" />
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
index f02cca9c25..42f34a3d82 100644
--- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="Editor de ciclo de dia">
+<floater name="Day Cycle Floater" title="EDITOR DE CICLO DE DIA">
<tab_container name="Day Cycle Tabs">
<panel label="Ciclo do dia" name="Day Cycle">
<button label="?" name="WLDayCycleHelp"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
index 9ce773116c..48a4a6ef6f 100644
--- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="Ajustes do Dispositivo de Conversa por Voz"/>
+<floater name="floater_device_settings" title="CONFIGURAÇÃO DE DISPOSITIVO DE VOZ"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
index d3ed760551..3ca8d934c9 100644
--- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="Editor do Ambiente">
+<floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Hora do Dia
</text>
@@ -13,13 +16,12 @@ Nuvens
<text name="EnvWaterColorText">
Cor da água
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Clique para abrir o Editor de cores"/>
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Selecionar a cor"/>
<text name="EnvWaterFogText">
Névoa da
água
</text>
<button bottom="-144" label="Usar hora da propriedade" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Céu Avançado" name="EnvAdvancedSkyButton" width="155" left="167"/>
- <button label="Ãgua Avançada" name="EnvAdvancedWaterButton" width="155" left="326"/>
- <button label="?" name="EnvSettingsHelpButton"/>
+ <button label="Céu Avançado" left="167" name="EnvAdvancedSkyButton" width="155"/>
+ <button label="Ãgua Avançada" left="326" name="EnvAdvancedWaterButton" width="155"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_font_test.xml b/indra/newview/skins/default/xui/pt/floater_font_test.xml
index eb52d3341d..c506cdb12d 100644
--- a/indra/newview/skins/default/xui/pt/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/pt/floater_font_test.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="Teste de Fonte">
+<floater name="contents" title="TESTE DE FONTE">
<text name="linea">
OverrideTest, deveria aparecer aqui como Times. (De default/xui/en-us)
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_gesture.xml b/indra/newview/skins/default/xui/pt/floater_gesture.xml
index ac50f32dd1..2e5b92aaf7 100644
--- a/indra/newview/skins/default/xui/pt/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_gesture.xml
@@ -1,14 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="Gestos Ativos">
- <text name="help_label">
- Clicar duas vezes no gesto para executar animações e sons.
- </text>
+<floater label="Lugares" name="gestures" title="GESTOS">
+ <floater.string name="loading">
+ Carregando...
+ </floater.string>
+ <floater.string name="playing">
+ (Em execução)
+ </floater.string>
+ <floater.string name="copy_name">
+ Cópia de [COPY_NAME]
+ </floater.string>
<scroll_list name="gesture_list">
- <column label="Acionar" name="trigger"/>
- <column label="Chave" name="shortcut"/>
- <column label="Nome" name="name"/>
+ <scroll_list.columns label="Nome" name="name"/>
+ <scroll_list.columns label="Bate-papo" name="trigger"/>
+ <scroll_list.columns label="Chave" name="shortcut"/>
</scroll_list>
- <button label="Novo" name="new_gesture_btn"/>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Mais opções"/>
+ <button name="new_gesture_btn" tool_tip="Criar novo gesto"/>
+ <button name="activate_btn" tool_tip="Ativar/Desativar gesto selecionado"/>
+ <button name="del_btn" tool_tip="Excluir este gesto"/>
+ </panel>
<button label="Editar" name="edit_btn"/>
<button label="Executar" name="play_btn"/>
<button label="Parar" name="stop_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_god_tools.xml b/indra/newview/skins/default/xui/pt/floater_god_tools.xml
index 9406658f62..4b7b2eb34e 100644
--- a/indra/newview/skins/default/xui/pt/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_god_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="Ferramentas de Deus">
+<floater name="godtools floater" title="FERRAMENTAS DE DEUS">
<tab_container name="GodTools Tabs">
<panel label="Grade" name="grid">
<button label="Desconectar todos os usuários" label_selected="Desconectar todos os usuários" name="Kick all users"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
index 0f9c1fd487..c666a941fe 100644
--- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="Ajustes de Hardware">
+<floater name="Hardware Settings Floater" title="CONFIGURAÇÃO DO HARDWARE">
<text name="Filtering:">
Filtragem:
</text>
@@ -8,21 +8,21 @@
Suavização:
</text>
<combo_box label="Suavização" name="fsaa" width="94">
- <combo_box.item name="FSAADisabled" label="Desabilitado"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Desativado" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gama:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (brilho, quanto menor, mais brilho, 0=usar padrão)
+ (0 = brilho padrão, menor = mais brilho)
</text>
<text name="Enable VBO:">
Habilitar VBO:
</text>
- <check_box label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/>
- <slider label="Memória de Textura (MB):" name="GrapicsCardTextureMemory" tool_tip="Quantidade de memória a se reservar para texturas. Usa por padrão, a Memória da Placa de Vídeo. Sua redução pode aumentar a performance mas pode também deixar as texturas borradas."/>
- <spinner label="Relação de Distância de &#10;Nevoeiro:" name="fog"/>
+ <check_box initial_value="true" label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/>
+ <slider label="Memória de texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Quanto da memória deve ser alocado para texturas. O padrão é definido pela memória da placa de vídeo. Reduzir este valor pode melhorar o desempenho, mas as texturas podem fica fora de foco."/>
+ <spinner label="Relação de Distância de Nevoeiro:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_help_browser.xml b/indra/newview/skins/default/xui/pt/floater_help_browser.xml
new file mode 100644
index 0000000000..281bdbd183
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_help_browser.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="NAVEGADOR DA AJUDA">
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls">
+ <button label="Abrir no navegador" name="open_browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_hud.xml b/indra/newview/skins/default/xui/pt/floater_hud.xml
index d31bcedf05..e458913452 100644
--- a/indra/newview/skins/default/xui/pt/floater_hud.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="Tutorial"/>
+<floater name="floater_hud" title="TUTORIAL"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_im.xml b/indra/newview/skins/default/xui/pt/floater_im.xml
index 75c3409339..f6057c48f1 100644
--- a/indra/newview/skins/default/xui/pt/floater_im.xml
+++ b/indra/newview/skins/default/xui/pt/floater_im.xml
@@ -10,7 +10,7 @@
Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
</string>
<string name="muted_message">
- Você emudeceu este residente. Enviar uma mensagem vai automaticamente reativá-lo novamente.
+ Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
</string>
<string name="generic_request_error">
Erro na requisição, por favor, tente novamente.
diff --git a/indra/newview/skins/default/xui/pt/floater_im_container.xml b/indra/newview/skins/default/xui/pt/floater_im_container.xml
new file mode 100644
index 0000000000..a21d4a6f1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="Mensagens instantâneas"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml
new file mode 100644
index 0000000000..39dde3408b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Painel de controle de MI" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="Para" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index a0d8c02ef0..2ff1aa7915 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -10,17 +10,17 @@
Prévia da
imagem como:
</text>
- <combo_box label="Tipo de Roupas" name="clothing_type_combo" left="100" width="186">
- <combo_box.item name="Image" label="Imagem" />
- <combo_box.item name="Hair" label="Cabelo" />
- <combo_box.item name="FemaleHead" label="Cabeça Feminina" />
- <combo_box.item name="FemaleUpperBody" label="Parte Superior do Corpo Feminino" />
- <combo_box.item name="FemaleLowerBody" label="Parte Inferior do Corpo Feminino" />
- <combo_box.item name="MaleHead" label="Cabeça Masculina" />
- <combo_box.item name="MaleUpperBody" label="Parte Superior do Corpo Masculino" />
- <combo_box.item name="MaleLowerBody" label="Parte Inferiro do Corpo Masculino" />
- <combo_box.item name="Skirt" label="Saia" />
- <combo_box.item name="SculptedPrim" label="Primitiva Esculpida" />
+ <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
+ <combo_box.item label="Imagem" name="Image"/>
+ <combo_box.item label="Cabelo" name="Hair"/>
+ <combo_box.item label="Cabeça de mulher" name="FemaleHead"/>
+ <combo_box.item label="Cintura para cima, mulher" name="FemaleUpperBody"/>
+ <combo_box.item label="Cintura para baixo, mulher" name="FemaleLowerBody"/>
+ <combo_box.item label="Cabeça de homem" name="MaleHead"/>
+ <combo_box.item label="Cintura para cima, homem" name="MaleUpperBody"/>
+ <combo_box.item label="Cintura para baixo, homem" name="MaleLowerBody"/>
+ <combo_box.item label="Saia" name="Skirt"/>
+ <combo_box.item label="Prim esculpido" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Incapaz de ler a imagem.
diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml
new file mode 100644
index 0000000000..79124966d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="LIGAÇÃO DE DESCONHECIDO">
+ <floater.string name="localchat">
+ Bate-papo local
+ </floater.string>
+ <floater.string name="anonymous">
+ anônimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está ligando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ entrou numa ligação de voz via conferência.
+ </floater.string>
+ <text name="question">
+ Sair do [CURRENT_CHAT] e entrar neste bate-papo?
+ </text>
+ <button label="Aceitar" label_selected="Aceitar" name="Accept"/>
+ <button label="Rejeitar" label_selected="Rejeitar" name="Reject"/>
+ <button label="Enviar MI" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inspect.xml b/indra/newview/skins/default/xui/pt/floater_inspect.xml
index f3c23f008e..6a00b1a628 100644
--- a/indra/newview/skins/default/xui/pt/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inspect.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="Inspecionar Objeto" min_width="450">
+<floater min_width="450" name="inspect" title="EXAMINAR OBJETOS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Selecione um objeto nesta lista para destacá-lo in-world">
- <column label="Nome do Objeto" name="object_name"/>
- <column label="Proprietário" name="owner_name"/>
- <column label="Criador" name="creator_name"/>
- <column label="Data de Criação" name="creation_date"/>
+ <scroll_list.columns label="Nome do Objeto" name="object_name"/>
+ <scroll_list.columns label="Proprietário" name="owner_name"/>
+ <scroll_list.columns label="Criador" name="creator_name"/>
+ <scroll_list.columns label="Data de Criação" name="creation_date"/>
</scroll_list>
- <button width="185" label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado"/>
- <button width="165" left="205" label="Ver perfil do criador..." label_selected="" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado"/>
+ <button label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado" width="185"/>
+ <button label="Ver perfil do criador..." label_selected="" left="205" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado" width="165"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory.xml b/indra/newview/skins/default/xui/pt/floater_inventory.xml
index 8a06fefe3c..409261a136 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="Inventário">
- <search_editor label="Escreva aqui para busca" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Todos os Itens" name="All Items"/>
- <inventory_panel label="Itens Recentes" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Arquivo" name="File">
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Nova Janela" name="New Window"/>
- <menu_item_call label="Mostrar Filtros" name="Show Filters"/>
- <menu_item_call label="Redefinir Filtros" name="Reset Current"/>
- <menu_item_call label="Fechar Todas as Pastas" name="Close All Folders"/>
- <menu_item_call label="Limpar Lixeira" name="Empty Trash"/>
- </menu>
- <menu label="Criar" name="Create">
- <menu_item_call label="Nova Pasta" name="New Folder"/>
- <menu_item_call label="Novo Script" name="New Script"/>
- <menu_item_call label="Nova Nota" name="New Note"/>
- <menu_item_call label="Novo Gesto" name="New Gesture"/>
- <menu label="Nova Roupa" name="New Clothes">
- <menu_item_call label="Nova Camisa" name="New Shirt"/>
- <menu_item_call label="Nova Calça" name="New Pants"/>
- <menu_item_call label="Novos Sapatos" name="New Shoes"/>
- <menu_item_call label="Novas Meias" name="New Socks"/>
- <menu_item_call label="Nova Jaqueta" name="New Jacket"/>
- <menu_item_call label="Nova Saia" name="New Skirt"/>
- <menu_item_call label="Novas Luvas" name="New Gloves"/>
- <menu_item_call label="Nova Anágua" name="New Undershirt"/>
- <menu_item_call label="Novas Roupas de Baixo" name="New Underpants"/>
- </menu>
- <menu label="Parte do corpo" name="New Body Parts">
- <menu_item_call label="Nova Forma" name="New Shape"/>
- <menu_item_call label="Nova Pele" name="New Skin"/>
- <menu_item_call label="Novo Cabelo" name="New Hair"/>
- <menu_item_call label="Novos Olhos" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordenar" name="Sort">
- <menu_item_check label="Por Nome" name="By Name"/>
- <menu_item_check label="Por Data" name="By Date"/>
- <menu_item_check label="Pastas Sempre por Nome" name="Folders Always By Name"/>
- <menu_item_check label="Pastas do sistema primeiro" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="INVENTÃRIO">
+ <floater.string name="Title">
+ Inventário
+ </floater.string>
+ <floater.string name="TitleFetching">
+ Inventário ([ITEM_COUNT] Items) [FILTER] [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ Inventário ([ITEM_COUNT] Items) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Obtido
+ </floater.string>
+ <panel label="Painel do inventário" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
index 69752253b6..8fe69c097d 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="Propriedades do Item de Inventário">
+<floater name="item properties" title="PROPRIEDADES DE ITEM NO INVENTÃRIO">
+ <floater.string name="unknown">
+ (desconhecido)
+ </floater.string>
+ <floater.string name="public">
+ (público)
+ </floater.string>
+ <floater.string name="you_can">
+ Você pode:
+ </floater.string>
+ <floater.string name="owner_can">
+ Proprietário pode :
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nome:
</text>
@@ -27,55 +42,32 @@
Qua Mai 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Você pode:
+ Você:
</text>
- <check_box label="Modificar" name="CheckOwnerModify"/>
+ <check_box label="Editar" name="CheckOwnerModify"/>
<check_box label="Copiar" name="CheckOwnerCopy"/>
- <check_box label="Revender/Doar" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- O:
- </text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Todos:
</text>
- <text name="EveryoneMaskDebug">
- E:
+ <check_box label="Cortar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Compartilhar com o grupo" name="CheckShareWithGroup"/>
- <check_box label="Permitir qualquer um copiar" name="CheckEveryoneCopy"/>
+ <check_box label="Compartilhar" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- Próximo dono pode:
+ Próximo proprietário:
</text>
- <check_box label="Modificar" name="CheckNextOwnerModify"/>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
<check_box label="Copiar" name="CheckNextOwnerCopy"/>
- <check_box label="Revender/Doar" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Marcar Item:
- </text>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="À venda" name="CheckPurchase"/>
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Cópia" />
- </radio_group>
- <text name="TextPrice">
- Price: L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Cortar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (desconhecido)
- </string>
- <string name="public">
- (público)
- </string>
- <string name="you_can">
- Você pode:
- </string>
- <string name="owner_can">
- Proprietário pode :
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
index 83df449ae6..57cdd50dcc 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="itens_de_inventário_recentes" width="165">
+<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES" width="165">
<check_box label="Animação" name="check_animation"/>
<check_box label="Cartões de chamadas" name="check_calling_card"/>
<check_box label="Roupas" name="check_clothing"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_joystick.xml b/indra/newview/skins/default/xui/pt/floater_joystick.xml
index ac7b7fd02a..ecc4fcc9e9 100644
--- a/indra/newview/skins/default/xui/pt/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="Configuração do Joystick">
- <check_box name="enable_joystick" label="Habilitar Joystick:"/>
+<floater name="Joystick" title="CONFIGURAÇÃO DO JOYSTICK">
+ <check_box label="Habilitar Joystick:" name="enable_joystick"/>
<text left="135" name="joystick_type" width="360"/>
- <spinner label="Mapeamento: eixo X" name="JoystickAxis1" label_width="124" width="164"/>
- <spinner label="Mapeamento: eixo Y" name="JoystickAxis2" label_width="124" width="164"/>
- <spinner label="Mapeamento: eixo Z" name="JoystickAxis0" label_width="124" width="164"/>
- <spinner label="Mapeamento: Elevação" name="JoystickAxis4" label_width="124" width="164"/>
- <spinner label="Mapeamento: Guinada" name="JoystickAxis5" label_width="124" width="164"/>
- <spinner label="Mapeamento: Rolagem" name="JoystickAxis3" label_width="124" width="164"/>
- <spinner label="Mapeamento: Zoom" name="JoystickAxis6" label_width="124" width="164"/>
- <check_box label="Zoom Direto" name="ZoomDirect" left="194"/>
+ <spinner label="Mapeamento: eixo X" label_width="124" name="JoystickAxis1" width="164"/>
+ <spinner label="Mapeamento: eixo Y" label_width="124" name="JoystickAxis2" width="164"/>
+ <spinner label="Mapeamento: eixo Z" label_width="124" name="JoystickAxis0" width="164"/>
+ <spinner label="Mapeamento: Elevação" label_width="124" name="JoystickAxis4" width="164"/>
+ <spinner label="Mapeamento: Guinada" label_width="124" name="JoystickAxis5" width="164"/>
+ <spinner label="Mapeamento: Rolagem" label_width="124" name="JoystickAxis3" width="164"/>
+ <spinner label="Mapeamento: Zoom" label_width="124" name="JoystickAxis6" width="164"/>
+ <check_box label="Zoom Direto" left="194" name="ZoomDirect"/>
<check_box label="Cursor 3D" name="Cursor3D"/>
<check_box label="Nível Automático" name="AutoLeveling"/>
<text name="Control Modes:">
Modos de Controle:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" left="192" label="Construir"/>
- <check_box name="JoystickFlycamEnabled" label="Camera aérea"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Camera aérea" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala X
</text>
@@ -27,13 +27,13 @@
<text name="ZScale">
Escala Z
</text>
- <text name="PitchScale" left="3" width="115">
+ <text left="3" name="PitchScale" width="115">
Escala de Elevação
</text>
- <text name="YawScale" left="3" width="115">
+ <text left="3" name="YawScale" width="115">
Escala da Guinada
</text>
- <text name="RollScale" left="3" width="115">
+ <text left="3" name="RollScale" width="115">
Escala de Rolagem
</text>
<text name="XDeadZone">
@@ -45,13 +45,13 @@
<text name="ZDeadZone">
Zona Morta Z
</text>
- <text name="PitchDeadZone" left="3" width="115">
+ <text left="3" name="PitchDeadZone" width="115">
Zona Morta: Elevação
</text>
- <text name="YawDeadZone" left="3" width="115">
+ <text left="3" name="YawDeadZone" width="115">
Zona Morta: Guinada
</text>
- <text name="RollDeadZone" left="3" width="115">
+ <text left="3" name="RollDeadZone" width="115">
Zona Morta: Rolagem
</text>
<text name="Feathering">
@@ -60,10 +60,10 @@
<text name="ZoomScale2">
Escala de Zoom
</text>
- <text name="ZoomDeadZone" width="110" left="4">
+ <text left="4" name="ZoomDeadZone" width="110">
Zona Morta de Zoom
</text>
- <button label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall"/>
+ <button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/>
<button label="OK" label_selected="OK" name="ok_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<stat_view label="Monitor do Joystick" name="axis_view">
diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
index 6657641992..9932318293 100644
--- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
@@ -1,155 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="Medidor de Atraso">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
- <text left="30" name="client_lag_cause" right="-10" />
- <text left="30" name="network_lag_cause" right="-10" />
- <text left="30" name="server_lag_cause" right="-32" />
- <text name="client">
- Cliente:
- </text>
- <text name="client_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
- <text name="network">
- Rede:
- </text>
- <text name="network_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
- <text name="server">
- Servidor:
- </text>
- <text name="server_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="LAG - Ãndice">
+ <floater.string name="max_title_msg">
Medidor de Atraso
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Atraso
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Cliente
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, janela por baixo
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Causa possível: Distância de desenho ajustada muito alta
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Causa possível: Carregamento de Imagens
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Causa possível: Muitas imagens na memória
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Causa possível: Muitos objetos complexos na cena
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Rede
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Tempo de conexão de ping é cerca de [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Possível conexão ruim ou &apos;Largura de Banda&apos; escolhida muito alta.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Possível conexão ruim ou aplicativos compartilhando arquivos.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Servidor
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Causa possível: Muitos objetos físicos
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Causa possível: Muitos objetos com scripts
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Causa possível: Muito tráfego na rede
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Causa possível: Muitas pessoas se movendo na região
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Causa possível: Muitos cálculos de imagem
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Causa possível: Carga no simulador muito pesada
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
+ <text name="client">
+ Cliente
+ </text>
+ <text font="SansSerifSmall" name="client_text">
+ Normal
+ </text>
+ <text left="30" name="client_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
+ <text name="network">
+ Rede
+ </text>
+ <text font="SansSerifSmall" name="network_text">
+ Normal
+ </text>
+ <text left="30" name="network_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
+ <text name="server">
+ Servidor
+ </text>
+ <text font="SansSerifSmall" name="server_text">
+ Normal
+ </text>
+ <text left="30" name="server_lag_cause" right="-32"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Alternar o tamanho da janela"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
index 4734d665ef..2b0d6790f2 100644
--- a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="Meu terreno">
+<floater name="land holdings floater" title="MEUS TERRENOS">
<scroll_list name="parcel list">
- <column label="Nome do Lote" name="name"/>
+ <column label="Lote" name="name"/>
<column label="Região" name="location"/>
<column label="Tipo" name="type"/>
<column label="Ãrea" name="area"/>
</scroll_list>
<button label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o centro do terreno."/>
- <button width="130" label="Mostrar no mapa" label_selected="Mostrar no mapa" name="Show on Map" tool_tip="Mostrar esse terreno no mapa do mundo."/>
+ <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar terreno na mápa-mundi" width="130"/>
<text name="contrib_label">
Contribuições para os seus grupos:
</text>
@@ -18,19 +18,19 @@
<text name="allowed_label" width="380">
Propriedades de terreno permitidas com o plano de pagamento atual:
</text>
- <text name="allowed_text" left_delta="390">
+ <text left_delta="390" name="allowed_text">
[AREA] m²
</text>
<text name="current_label">
Propriedades de terrenos atuais:
</text>
- <text name="current_text" left_delta="390">
+ <text left_delta="390" name="current_text">
[AREA] m²
</text>
<text name="available_label">
Disponível para compra de terras:
</text>
- <text name="available_text" left_delta="390">
+ <text left_delta="390" name="available_text">
[AREA] m²
</text>
<string name="area_string">
diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
index d2654de589..1717088eae 100644
--- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="Script: Novo Script">
- <button label="Resetar" label_selected="Resetar" name="Reset"/>
- <check_box label="Correndo" name="running"/>
- <check_box label="Mono" name="mono" left="86"/>
- <string name="not_allowed">
- Você não tem permissão para visualizar este script.
- </string>
- <string name="script_running">
+<floater name="script ed float" title="SCRIPT: NOVO SCRIPT">
+ <floater.string name="not_allowed">
+ Você não pode ver ou editar o script, uma vez que está definido como &quot;não&quot; copiar. Você precisa de permissões para ver ou editar um script dentro de um objeto.
+ </floater.string>
+ <floater.string name="script_running">
Executando
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
+ <button label="Resetar" label_selected="Resetar" name="Reset"/>
+ <check_box initial_value="true" label="Correndo" name="running"/>
+ <check_box initial_value="true" label="Mono" left="86" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
index 4f60ef23a6..f9a5e08e97 100644
--- a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL Wiki">
- <check_box label="Seguir o Cursor" name="lock_check" />
- <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/>
- <button label="Anterior" name="back_btn" left_delta="75"/>
- <button label="Posterior" name="fwd_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL WIKI">
+ <check_box label="Seguir o Cursor" name="lock_check"/>
+ <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/>
+ <button label="Anterior" left_delta="75" name="back_btn"/>
+ <button label="Posterior" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
index cfaec5b410..1cd6d5662c 100644
--- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="477" name="floater_about" title="Navegador de Mídia" width="570">
+<floater min_width="477" name="floater_about" title="NAVEGADOR DE MÃDIA" width="570">
+ <floater.string name="home_page_url">
+ http://br.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://br.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1" width="550">
<layout_panel name="nav_controls">
<button label="Para trás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_settings.xml b/indra/newview/skins/default/xui/pt/floater_media_settings.xml
new file mode 100644
index 0000000000..5af002c502
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="CONFIGURAÇÕES DE MÃDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
index 374592f0e2..efb5da4ace 100644
--- a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Simulação de Perda de Memória">
+<floater name="MemLeak" title="SIMULAR UM VAZAMENTO DE MEMÓRIA">
<spinner label="Velocidade da Perda (bytes por quadro):" name="leak_speed"/>
<spinner label="Máximo de Memória Perdida (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml
index 996a974254..7c4436537d 100644
--- a/indra/newview/skins/default/xui/pt/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml
@@ -1,13 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Pular ou Voar"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Agaixar ou pousar"/>
- <joystick_slide name="slide left btn" tool_tip="Mover para a esquerda"/>
- <joystick_slide name="slide right btn" tool_tip="Mover para a direita"/>
- <joystick_turn name="forward btn" tool_tip="Mover para a frente."/>
- <joystick_turn name="backward btn" tool_tip="Mover para trás"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Andar para frente (flecha para cima ou W)
+ </string>
+ <string name="walk_back_tooltip">
+ Andar para trás (flecha para baixo ou S)
+ </string>
+ <string name="run_forward_tooltip">
+ Correr para frente (flecha para cima ou W)
+ </string>
+ <string name="run_back_tooltip">
+ Correr para trás (flecha para baixo ou S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Voar para frente (flecha para cima ou W)
+ </string>
+ <string name="fly_back_tooltip">
+ Voar para trás (flecha para baixo ou S)
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voar para o alto (tecla E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
+ <joystick_turn name="forward btn" tool_tip="Andar para frente (flecha para cima ou W)"/>
+ <joystick_turn name="backward btn" tool_tip="Andar para trás (flecha para baixo ou S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Modo caminhar"/>
+ <button label="" name="mode_run_btn" tool_tip="Modo correr"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modo voar"/>
+ <button label="Parar de voar" name="stop_fly_btn" tool_tip="Parar de voar"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_mute_object.xml b/indra/newview/skins/default/xui/pt/floater_mute_object.xml
index 7ec0051a7d..97fbd35fcc 100644
--- a/indra/newview/skins/default/xui/pt/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_mute_object.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="Silenciar objeto pelo nome">
+<floater name="mute by name" title="BLOQUEAR OBJETO POR NOME">
<text name="message">
- Silenciar pelo nome afeta apenas conversa de objeto e MI,
-não sons. Você deve digitar o nome exato do objeto.
+ Bloquear o objeto:
</text>
<line_editor name="object_name">
Nome do objeto
</line_editor>
+ <text name="note">
+ * Bloquear apenas texto do objeto, não sons
+ </text>
<button label="OK" name="OK"/>
<button label="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_friends.xml b/indra/newview/skins/default/xui/pt/floater_my_friends.xml
index a78b255f8a..68f2a19998 100644
--- a/indra/newview/skins/default/xui/pt/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/pt/floater_my_friends.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_my_friends" title="Contatos">
+<floater name="floater_my_friends" title="CONTATOS">
<tab_container name="friends_and_groups">
<panel label="Amigos" name="friends_panel"/>
<panel label="Grupos" name="groups_panel"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
new file mode 100644
index 0000000000..5ba2dcd925
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="Bate-papo local"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_openobject.xml b/indra/newview/skins/default/xui/pt/floater_openobject.xml
index d3b72b4b18..0dc2852bac 100644
--- a/indra/newview/skins/default/xui/pt/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/pt/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="Conteúdo do objeto">
+<floater name="objectcontents" title="CONTEÚDO DO OBJETO">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
new file mode 100644
index 0000000000..2078185315
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="LIGANDO">
+ <floater.string name="localchat">
+ Bate-papo local
+ </floater.string>
+ <floater.string name="anonymous">
+ anônimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está ligando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ entrou numa ligação de voz via conferência.
+ </floater.string>
+ <text name="connecting">
+ Conectando com [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Ligando para [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Não há resposta. Tente novamente mais tarde.
+ </text>
+ <text name="leaving">
+ Saindo de [CURRENT_CHAT].
+ </text>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 187df8fd18..81c861687f 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -1,21 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1" left="112" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" left="112" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="Pagar" label_selected="Pagar" name="pay btn" />
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn" />
- <text name="payee_label" width="110" left="5">
- Pagar residente:
+ <string name="payee_group">
+ Pagar grupo
+ </string>
+ <string name="payee_resident">
+ Pagar residente
+ </string>
+ <text left="5" name="payee_label" width="110">
+ Pagar:
</text>
- <text name="payee_name" left="115">
+ <icon name="icon_person" tool_tip="Pessoa"/>
+ <text left="115" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text" width="120" halign="left">
- Pagamento rápido:
- </text>
- <text name="amount text" left="4" >
- Quantia:
+ <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text left="4" name="amount text">
+ Outro valor:
</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay_object.xml b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
index 3a3dd9e52e..161c7c6d4b 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
@@ -1,31 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="100" halign="left">
- Pagar Grupo:
- </text>
- <text name="payee_resident" width="120" halign="left" >
- Pagar residente:
- </text>
- <text name="payee_name" left="105">
+ <string halign="left" name="payee_group" width="100">
+ Pagar grupo
+ </string>
+ <string halign="left" name="payee_resident" width="120">
+ Pagar residente
+ </string>
+ <icon name="icon_person" tool_tip="Pessoa"/>
+ <text left="105" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="95" halign="left">
+ <text halign="left" left="5" name="object_name_label" width="95">
Via objeto:
</text>
- <text name="object_name_text" left="105" >
+ <icon name="icon_object" tool_tip="Objects"/>
+ <text left="105" name="object_name_text">
...
</text>
- <text name="fastpay text" width="115" halign="left">
- Pagamento Rápido:
- </text>
- <text name="amount text" left="5" halign="left">
- Quantia:
+ <button label="L$1" label_selected="L$1" left="125" name="fastpay 1" width="70"/>
+ <button label="L$5" label_selected="L$5" left="200" name="fastpay 5" width="70"/>
+ <button label="L$10" label_selected="L$10" left="125" name="fastpay 10" width="70"/>
+ <button label="L$20" label_selected="L$20" left="200" name="fastpay 20" width="70"/>
+ <text halign="left" left="5" name="amount text">
+ Outro valor:
</text>
- <button label="L$1" label_selected="L$1" name="fastpay 1" left="125" width="70"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5" left="200" width="70"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10" left="125" width="70"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20" left="200" width="70"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn" />
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn" />
- <line_editor left="60" name="amount" width="50" />
+ <line_editor left="60" name="amount" width="50"/>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml
index 9bb7f04256..33a0d6a456 100644
--- a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="Permissões Padrão de Upload">
+<floater name="perm prefs" title="PERMISSÕES PADRÃO DE UPLOAD">
<panel label="Permissões" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Compartilhar com o grupo" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_post_process.xml b/indra/newview/skins/default/xui/pt/floater_post_process.xml
index 8f5f5db743..d4f2e96539 100644
--- a/indra/newview/skins/default/xui/pt/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/pt/floater_post_process.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="Ajustes de Pós-processamento">
+<floater name="Post-Process Floater" title="AJUSTES DE PÓS-PROCESSAMENTO">
<tab_container name="Post-Process Tabs">
<panel label="Filtro de Cor" name="wmiColorFilterPanel">
<check_box label="Habilitar" name="wmiColorFilterToggle"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_postcard.xml b/indra/newview/skins/default/xui/pt/floater_postcard.xml
index 62fd050ea4..d3c5b6ec23 100644
--- a/indra/newview/skins/default/xui/pt/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_postcard.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="Foto por email">
+<floater name="Postcard" title="ENVIAR FOTO VIA EMAIL">
<text name="to_label" width="135">
Email do Destinatário:
</text>
- <line_editor name="to_form" left="143" width="127" />
+ <line_editor left="143" name="to_form" width="127"/>
<text name="from_label">
Seu Email:
</text>
- <line_editor name="from_form" left="143" width="127" />
+ <line_editor left="143" name="from_form" width="127"/>
<text name="name_label">
Seu nome:
</text>
- <line_editor name="name_form" left="143" width="127" />
+ <line_editor left="143" name="name_form" width="127"/>
<text name="subject_label">
Assunto:
</text>
- <line_editor name="subject_form" left="143" width="127" />
+ <line_editor left="143" name="subject_form" width="127"/>
<line_editor label="Digite seu assunto aqui." name="subject_form"/>
<text name="msg_label">
Mensagem:
@@ -29,7 +29,7 @@
<button label="Cancelar" name="cancel_btn"/>
<button label="Enviar" name="send_btn"/>
<string name="default_subject">
- Cartão postal do [SECOND_LIFE]
+ Postal do [SECOND_LIFE].
</string>
<string name="default_message">
Dá uma olhada nisto!
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml
index 0e9ef768b5..dc29bcf6b1 100644
--- a/indra/newview/skins/default/xui/pt/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="Preferências" min_width="332" width="628">
+<floater min_width="332" name="Preferences" title="PREFERÊNCIAS" width="628">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
- <button label="Sobre" label_selected="Sobre" name="About..."/>
- <button label="Ajuda" label_selected="Ajuda" name="Help"/>
- <tab_container name="pref core" tab_width="128" width="628" />
+ <tab_container name="pref core" tab_width="128" width="628">
+ <panel label="Público geral" name="general"/>
+ <panel label="Vídeo" name="display"/>
+ <panel label="Privacidade" name="im"/>
+ <panel label="Som" name="audio"/>
+ <panel label="Bate-papo" name="chat"/>
+ <panel label="Notificações" name="msgs"/>
+ <panel label="Configurações" name="input"/>
+ <panel label="Avançado" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
index 26ca8f87e0..c7d3affd73 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animação: [NOME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
- <button label="Executar in World" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Executar esta animação para que outros vejam." width="131"/>
- <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Executar esta animação somente para você ver." width="125"/>
+ <button label="Executar in World" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
+ <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
index 4c583c28fb..bb626430ed 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="Informação do Anúncio Classificado"/>
+<floater name="classified_preview" title="INFORMAÇÕES CLASSIFICADAS">
+ <floater.string name="Title">
+ Classificados: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
index 3c8ebcf95a..b422580f3b 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="Informação do Evento"/>
+<floater name="event_preview" title="DADOS DO EVENTO">
+ <floater.string name="Title">
+ Evento: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index 87bf86c282..af4dceaa89 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -1,14 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Selecionar animação:
+ </floater.string>
+ <floater.string name="step_sound">
+ Selecionar animação:
+ </floater.string>
+ <floater.string name="step_chat">
+ Diga por bate-papo:
+ </floater.string>
+ <floater.string name="step_wait">
+ Espere:
+ </floater.string>
+ <floater.string name="stop_txt">
Parar
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Prévia
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Nenhum --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
<text name="desc_label">
Descrição:
</text>
@@ -22,37 +37,30 @@
<text name="key_label">
Tecla de Atalho:
</text>
- <combo_box label="Nenhum" name="modifier_combo" left="116" width="76"/>
- <combo_box label="Nenhum" name="key_combo" width="76" left_delta="80"/>
+ <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/>
+ <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/>
<text name="library_label">
Biblioteca:
</text>
+ <scroll_list name="library_list" width="84"/>
+ <button label="Incluir" left="118" name="add_btn" width="87"/>
<text name="steps_label">
Passos:
</text>
- <scroll_list name="library_list" width="84">
- Animação
-Som
-Bate Papo
-Esperar
- </scroll_list>
- <button label="Incluir" name="add_btn" left="118" width="87"/>
- <button label="Mover Para Cima" name="up_btn" width="114" left_delta="-13"/>
- <button label="Mover Para Baixo" name="down_btn" width="114"/>
- <button label="Remover" name="delete_btn" width="84" left_delta="13"/>
- <scroll_list left="226" name="step_list" width="205" />
- <text name="help_label">
- Todos os passos acontecem
-simultaneamente, a menos que
-você inclua passos de espera.
- </text>
+ <scroll_list left="226" name="step_list" width="205"/>
+ <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/>
+ <button label="P/ baixo" name="down_btn" width="114"/>
+ <button label="Remover" left_delta="13" name="delete_btn" width="84"/>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Iniciar" />
- <radio_item name="stop" label="Parar" />
+ <radio_item label="OK" name="start"/>
+ <radio_item label="Pare" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="até que as animações estejam &#10;concluídas" name="wait_anim_check"/>
+ <check_box bottom_delta="34" label="até que as animações estejam concluídas" name="wait_anim_check"/>
<check_box bottom_delta="-30" label="tempo em segundos" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor" />
+ <line_editor left_delta="130" name="wait_time_editor"/>
+ <text name="help_label">
+ Se não incluir etapas de espera, todas as etapas ocorrem ao mesmo tempo.
+ </text>
<check_box label="Ativar" name="active_check" tool_tip="Gestos ativos podem ser gatilhados escrevendo suas frases de gatilho no chat ou através de suas teclas de atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
<button label="Prévia" name="preview_btn"/>
<button label="Salvar" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..aabcff70d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..64bb7785f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO">
+ <text name="trigger_label">
+ Bate-papo:
+ </text>
+ <text name="key_label">
+ Tecla:
+ </text>
+ <combo_box label="Nenhum" name="modifier_combo"/>
+ <combo_box label="Nenhum" name="key_combo"/>
+ <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando &apos;olá&apos; por &apos;oi&apos; para trocar &apos;Olá, tudo bem&apos; por &apos;Oi tudo bem&apos;. O gesto também será executado.">
+ Trocar:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando &apos;olá&apos; por &apos;oi&apos; para trocar &apos;Olá, tudo bem&apos; por &apos;Oi tudo bem&apos;. O gesto também será executado."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..aabcff70d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
index e0a133d8ab..6194bfffd6 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="Nota:">
- <button label="Salvar" label_selected="Salvar" name="Save"/>
+<floater name="preview notecard" title="NOTA:">
+ <floater.string name="no_object">
+ Não foi possível encontrar o objeto que contém esta nota.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Você não está autorizado a ler esta nota.
+ </floater.string>
+ <floater.string name="Title">
+ Anotação: [NAME]
+ </floater.string>
+ <floater.string label="Salvar" label_selected="Salvar" name="Save">
+ Salvar
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
<text_editor name="Notecard Editor">
Carregando...
</text_editor>
- <string name="no_object">
- Não foi possível encontrar o objeto que contém esta nota.
- </string>
- <string name="not_allowed">
- Você não tem permissão de visualizar esta nota.
- </string>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
index 3dd2f84f91..8691542d95 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Som: [NAME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
- <button left_delta="-132" label="Executar in-World" label_selected="Executar in-World" name="Sound play btn" tool_tip="Executar este som para que todos possam ouvi-lo."/>
- <button width="135" left="152" label="Executar Localmente" label_selected="Executar Localmente" name="Sound audition btn" tool_tip="Executar este som somente para você ouvir."/>
+ <button label="Executar in-World" label_selected="Executar in-World" left_delta="-132" name="Sound play btn" tool_tip="Tocar som para todos ouvirem"/>
+ <button label="Executar Localmente" label_selected="Executar Localmente" left="152" name="Sound audition btn" tool_tip="Tocar som de forma que apenas você possa ouvir" width="135"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
index 72bc42fa19..066cf05163 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
@@ -1,9 +1,44 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Textura: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copiar para inventário
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
<text name="dimensions">
- Dimensões: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Visualizar com proporção de aspecto fixa">
+ <combo_item name="Unconstrained">
+ Sem limites
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Símbolo ou perfil RW do grupo">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] perfil">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Procurar anúncios classificados e marcos">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Sobre terrenos">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Perfis destacados">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="keep"/>
+ <button label="Cancelar" name="discard"/>
+ <button label="Salvar como" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_region_info.xml b/indra/newview/skins/default/xui/pt/floater_region_info.xml
index fe228ab405..cc5e0d59d4 100644
--- a/indra/newview/skins/default/xui/pt/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/pt/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="Região/Propriedade"/>
+<floater name="regioninfo" title="REGIÃO/PROPRIEDADE"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
index 51d7ef8190..7988056a3b 100644
--- a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="Reportar abuso">
- <check_box label="Incluir cópia da tela" name="screen_check"/>
+<floater name="floater_report_abuse" title="REPORTAR ABUSO">
+ <floater.string name="Screenshot">
+ Captura de tela
+ </floater.string>
+ <check_box label="Usar esta captura de tela" name="screen_check"/>
<text name="reporter_title">
Denunciador:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Região:
@@ -20,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Clique no botão e em seguida no objeto:
+ Clique no botão e em seguida no objeto abusivo:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Object Picker - Identifica um objeto como o assunto deste report"/>
<text name="object_name_label">
- Nome:
+ Objeto:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -33,54 +36,53 @@
Proprietário:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categoria -- Selecione a categoria que melhor descreve este report">
- <combo_box.item name="Select_category" label="Selecionar categoria"/>
- <combo_box.item name="Age__Age_play" label="Idade &gt; Idade no jogo"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Idade &gt; Residente adulto no Second Life Jovem"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Idade &gt; Residente menor de idade fora do Second Life Teen"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assalto &gt; Sandbox de combate / área não segura"/>
- <combo_box.item name="Assault__Safe_area" label="Assalto &gt; Ãrea segura"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assalto &gt; Testando armas em sandbox"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comércio &gt; Falha em enviar produto ou serviço"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Revelar &gt; Informação do mundo real"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Revelar &gt; Conversa monitorada remotamente"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Revelar &gt; Informação do Second Life/conversa/MIs"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Distúrbio da paz &gt; Uso injusto dos recursos da região"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Distúrbio da paz &gt; Objetos com excesso de scripts"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Distúrbio da paz &gt; Objeto despejando lixo"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Distúrbio da paz &gt; Spam repetitivo"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Distúrbio da paz &gt; Spam de anúncio indesejado"/>
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Terra"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Esquema de pirâmide ou cartas encadeadas"/>
- <combo_box.item name="Fraud__US$" label="Fraude &gt; R$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Perturbação &gt; Fazendas de Anúncios / spam visual"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Perturbação &gt; Difamação de indivíduos ou grupos"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Perturbação &gt; Impedindo movimentos"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Perturbação &gt; Perturbação sexual"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Perturbação &gt; Solicitando/incitando outros a violarem o ToS"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Perturbação &gt; Abuso verbal"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecência &gt; Conteúdo ou conduta amplamente ofensivos"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecência &gt; Nome de avatar inapropriado"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecência &gt; Conduta ou conteúdo inapropriados numa região PG"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecência &gt; Conduta ou conteúdo inapropriados numa região Mature"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violação de propriedade intelectual &gt; Remoção de Conteúdo"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violação de Propriedade intelectual &gt; Cópia Ilegal ou Aproveitar-se de Permissões"/>
- <combo_box.item name="Intolerance" label="Intolerância"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terra &gt; Abuso dos recursos da sandbox"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terra &gt; Invasão &gt; Objetos/texturas"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Terra &gt; Invasão &gt; Partículas"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terra &gt; Violação &gt; Ãrvores/plantas"/>
- <combo_box.item name="Wagering_gambling" label="Apostas/jogos de azar"/>
- <combo_box.item name="Other" label="Outro"/>
+ <combo_box.item label="Selecionar categoria" name="Select_category"/>
+ <combo_box.item label="Idade &gt; Idade no jogo" name="Age__Age_play"/>
+ <combo_box.item label="Idade &gt; Residente adulto no Second Life Jovem" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Idade &gt; Residente menor de idade fora do Second Life Teen" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assalto &gt; Sandbox de combate / área não segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assalto &gt; Ãrea segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Assalto &gt; Testando armas em sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comércio &gt; Falha em enviar produto ou serviço" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Revelar &gt; Informação do mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Revelar &gt; Conversa monitorada remotamente" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Revelar &gt; Informação do Second Life/conversa/MIs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Distúrbio da paz &gt; Uso injusto dos recursos da região" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Distúrbio da paz &gt; Objetos com excesso de scripts" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Distúrbio da paz &gt; Objeto despejando lixo" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Distúrbio da paz &gt; Spam repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Distúrbio da paz &gt; Spam de anúncio indesejado" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terra" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Esquema de pirâmide ou cartas encadeadas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; R$" name="Fraud__US$"/>
+ <combo_box.item label="Perturbação &gt; Fazendas de Anúncios / spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Perturbação &gt; Difamação de indivíduos ou grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Perturbação &gt; Impedindo movimentos" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Perturbação &gt; Perturbação sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Perturbação &gt; Solicitando/incitando outros a violarem o ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Perturbação &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecência &gt; Conteúdo ou conduta amplamente ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecência &gt; Nome de avatar inapropriado" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecência &gt; Conduta ou conteúdo inapropriados numa região PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecência &gt; Conduta ou conteúdo inapropriados numa região Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Violação de propriedade intelectual &gt; Remoção de Conteúdo" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Violação de Propriedade intelectual &gt; Cópia Ilegal ou Aproveitar-se de Permissões" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerância" name="Intolerance"/>
+ <combo_box.item label="Terra &gt; Abuso dos recursos da sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terra &gt; Invasão &gt; Objetos/texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terra &gt; Invasão &gt; Partículas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terra &gt; Violação &gt; Ãrvores/plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apostas/jogos de azar" name="Wagering_gambling"/>
+ <combo_box.item label="Outro" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nome do Denunciado:
</text>
- <button label="Escolher Residente" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/>
- <check_box label="Não sei o nome do denunciado" name="omit_abuser_name" tool_tip="Marque aqui se você não consegue fornecer o nome do denunciado"/>
+ <button label="Selecionar" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/>
<text name="abuser_name_title2">
Local do Abuso:
</text>
@@ -91,13 +93,11 @@
Detalhes:
</text>
<text name="bug_aviso">
- Por favor, seja específico(a) sobre data, localidade,
-natureza do abuso, texto relevante de conversa/MI e
-selecione o objeto, se possível.
+ Seja o mais específico possível
</text>
<text name="incomplete_title">
- Nota: Relatos incompletos não serão investigados.
+ * Denúncias incompletas não serão investigadas
</text>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<button label="Reportar Abuso" label_selected="Reportar Abuso" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug.xml b/indra/newview/skins/default/xui/pt/floater_script_debug.xml
index 48c73b93a3..6d1d981ca7 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_debug.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="script debug floater" title="Aviso de script/erro">
<tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[Todos os scripts]"/>
+ <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_preview.xml b/indra/newview/skins/default/xui/pt/floater_script_preview.xml
index 2a7680565f..5fafb0d1b8 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="preview lsl text" title="Script: Rotation Script">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT">
+ <floater.string name="Title">
+ Script: [NAME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_queue.xml b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
index 7b35226bdb..5fb6dd1c35 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="Resetar Progresso">
+<floater name="queue" title="RESETAR PROGRESSO">
+ <floater.string name="Starting">
+ Iniciando [START] de [COUNT] items.
+ </floater.string>
+ <floater.string name="Done">
+ Pronto.
+ </floater.string>
+ <floater.string name="Resetting">
+ Redefinindo
+ </floater.string>
+ <floater.string name="Running">
+ Executando
+ </floater.string>
+ <floater.string name="NotRunning">
+ Inerte
+ </floater.string>
<button label="Fechar" label_selected="Fechar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_search.xml b/indra/newview/skins/default/xui/pt/floater_script_search.xml
index c904c0f816..8878590a4e 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="Busca de Script" width="320">
- <check_box label="Não diferenciar Maiúsculas de Minúsculas" name="case_text" left="75"/>
+<floater name="script search" title="BUSCAR SCRIPT" width="320">
+ <check_box label="Não diferenciar Maiúsculas de Minúsculas" left="75" name="case_text"/>
<button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/>
- <button label="Substituir" label_selected="Substituir" name="replace_btn" left="100" width="85"/>
- <button label="Substituir Tudo" label_selected="Substituir Tudo" name="replace_all_btn" left="190" width="122"/>
+ <button label="Substituir" label_selected="Substituir" left="100" name="replace_btn" width="85"/>
+ <button label="Substituir Tudo" label_selected="Substituir Tudo" left="190" name="replace_all_btn" width="122"/>
<text name="txt" width="65">
Buscar
</text>
<text name="txt2" width="65">
Substituir
</text>
- <line_editor left="75" name="search_text" width="240" />
- <line_editor left="75" name="replace_text" width="240" />
+ <line_editor left="75" name="search_text" width="240"/>
+ <line_editor left="75" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml
new file mode 100644
index 0000000000..4bf7181180
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="BUSCAR">
+ <floater.string name="loading_text">
+ Carregando...
+ </floater.string>
+ <floater.string name="done_text">
+ Pronto
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Buscar novamente com status God
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_select_key.xml b/indra/newview/skins/default/xui/pt/floater_select_key.xml
index e41a565d11..15772da434 100644
--- a/indra/newview/skins/default/xui/pt/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/pt/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Aperte uma tecla para selecionar
+ Pressione uma tecla para definir o botão disparador do Falar.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
index d3581405ff..e6d4dc7ed6 100644
--- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="Vender terreno">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Lote:
- </text>
- <text name="info_parcel">
- Nome do Lote
- </text>
- <text name="info_size_label">
- Tamanho:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action" bottom_delta="-67">
- Para vender este lote:
- </text>
- <icon bottom_delta="-66" name="step_price" />
- <text name="price_label">
- Defina um preço:
- </text>
- <text name="price_text">
- Escolha um preço apropriado para esta terra.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- (L$[PER_METER] por m²)
- </text>
- <text name="sell_to_label">
- Vender esta terra para:
- </text>
- <text name="sell_to_text">
- Escolha se venderá para qualquer um ou para um comprador em
-particular.
- </text>
- <combo_box name="sell_to" bottom_delta="-32">
- <combo_box.item name="--selectone--" label="Selecione um --" />
- <combo_box.item name="Anyone" label="Qualquer um" />
- <combo_box.item name="Specificuser:" label="Usuário Específico:" />
- </combo_box>
- <button label="Selecione..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- Vender os objetos com a terra?
- </text>
- <text name="sell_objects_text">
- Os objetos tranferíveis do proprietário do terreno que estão neste
-lote irão mudar de propriedade.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58">
- <radio_item name="no" label="Não, manter a propriedade sobre os objetos" />
- <radio_item name="yes" label="Sim, vender objetos com a terra" />
- </radio_group>
- <button label="Mostrar Objetos" name="show_objects"/>
- <text name="nag_message_label">
- LEMBRE-SE: Todas as vendas são finais.
- </text>
- <button label="Definir Terra para Venda" name="sell_btn"/>
- <button label="Cancelar" name="cancel_btn"/>
- </panel>
- </scroll_container>
+<floater name="sell land" title="VENDER TERRENO">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Lote:
+ </text>
+ <text name="info_parcel">
+ NOME DO LOTE
+ </text>
+ <text name="info_size_label">
+ Tamanho:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text bottom_delta="-67" name="info_action">
+ Para vender este terreno:
+ </text>
+ <text name="price_label">
+ 1. Preço:
+ </text>
+ <text name="price_text">
+ Determine o preço adequado.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] por m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vender para:
+ </text>
+ <text name="sell_to_text">
+ Vender para qualquer pessoa ou determinado comprador.
+ </text>
+ <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box.item label="- Selecione -" name="--selectone--"/>
+ <combo_box.item label="Todos" name="Anyone"/>
+ <combo_box.item label="Pessoa específica:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Selecionar" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Vender o terreno com os objetos?
+ </text>
+ <text name="sell_objects_text">
+ O objetos transferíveis do terreno passam a ser do novo dono.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="Não, os objetos continuam sendo meus" name="no"/>
+ <radio_item label="Sim, vender o terreno com os objetos" name="yes"/>
+ </radio_group>
+ <button label="Mostrar objetos" name="show_objects"/>
+ <text name="nag_message_label">
+ LEMBRE-SE: Qualquer transação de compra e venda é irreversível.
+ </text>
+ <button label="Colocar terreno à venda" name="sell_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
index f7b468bb22..dfffb89f30 100644
--- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="Configurações de Debug">
+<floater name="settings_debug" title="DEBUG SETTINGS">
<combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="VERDADEIRO" />
- <combo_box.item name="FALSE" label="FALSO" />
+ <combo_box.item label="TRUE" name="TRUE"/>
+ <combo_box.item label="FALSE" name="FALSE"/>
</combo_box>
- <color_swatch label="Cor" name="color_swatch"/>
+ <color_swatch label="Cor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index a924706cb9..b5d070c9d5 100644
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="Prévia da foto">
+<floater name="Snapshot" title="VER FOTO">
<text name="type_label">
Destino da foto
</text>
<radio_group label="Tipo de Foto" name="snapshot_type_radio">
- <radio_item name="postcard" label="Enviar por email" />
- <radio_item name="texture" label="Salvar no seu inventário (L$[AMOUNT])" />
- <radio_item name="local" label="Salvar no seu disco rígido" />
+ <radio_item label="Enviar por email" name="postcard"/>
+ <radio_item label="Salvar no seu inventário (L$[AMOUNT])" name="texture"/>
+ <radio_item label="Salvar no seu disco rígido" name="local"/>
</radio_group>
<text name="file_size_label">
Tamanho do arquivo: [SIZE] KB
@@ -15,12 +15,12 @@
<button label="Enviar" name="send_btn"/>
<button label="Salvar (L$[AMOUNT])" name="upload_btn"/>
<flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
- <flyout_button.item name="save_item" label="Salvar"/>
- <flyout_button.item name="saveas_item" label="Salvar como..."/>
+ <flyout_button.item label="Salvar" name="save_item"/>
+ <flyout_button.item label="Salvar como..." name="saveas_item"/>
</flyout_button>
<button label="Cancelar" name="discard_btn"/>
- <button label="Mais &gt;" name="more_btn" tool_tip="Opções Avançadas"/>
- <button label="&lt; Menos" name="less_btn" tool_tip="Opções Avançadas"/>
+ <button label="Mais &gt;" name="more_btn" tool_tip="Opções avançadas"/>
+ <button label="&lt; Menos" name="less_btn" tool_tip="Opções avançadas"/>
<text name="type_label2">
Tamanho
</text>
@@ -28,50 +28,50 @@
Formato
</text>
<combo_box label="Resolução" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="Custom" label="Customizado" />
+ <combo_box.item label="Janela Atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Customizado" name="Custom"/>
</combo_box>
<combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="Small(128x128)" label="Pequeno (128x128)" />
- <combo_box.item name="Medium(256x256)" label="Médio (256x256)" />
- <combo_box.item name="Large(512x512)" label="Grande (512x512)" />
- <combo_box.item name="Custom" label="Customizado" />
+ <combo_box.item label="Janela Atual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Customizado" name="Custom"/>
</combo_box>
<combo_box label="Resolução" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="320x240" label="320x240" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="1280x1024" label="1280x1024" />
- <combo_box.item name="1600x1200" label="1600x1200" />
- <combo_box.item name="Custom" label="Customizado" />
+ <combo_box.item label="Janela Atual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Customizado" name="Custom"/>
</combo_box>
<combo_box label="Formato" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG" />
- <combo_box.item name="JPEG" label="JPEG" />
- <combo_box.item name="BMP" label="BMP" />
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Largura" name="snapshot_width" label_width="41" width="101"/>
- <spinner label="Altura" name="snapshot_height" label_width="31" width="91" left="119"/>
+ <spinner label="Largura" label_width="41" name="snapshot_width" width="101"/>
+ <spinner label="Altura" label_width="31" left="119" name="snapshot_height" width="91"/>
<check_box label="Restringir proporções" name="keep_aspect_check"/>
<slider label="Qualidade da Imagem" name="image_quality_slider"/>
<text name="layer_type_label">
Capturar:
</text>
<combo_box label="Camadas da Imagem" name="layer_types">
- <combo_box.item name="Colors" label="Cores" />
- <combo_box.item name="Depth" label="Formato" />
- <combo_box.item name="ObjectMattes" label="Decoração do Objeto" />
+ <combo_box.item label="Cores" name="Colors"/>
+ <combo_box.item label="Formato" name="Depth"/>
+ <combo_box.item label="Decoração do Objeto" name="ObjectMattes"/>
</combo_box>
<check_box label="Mostrar interface na Foto" name="ui_check"/>
<check_box bottom_delta="-17" label="Mostrar Objetos HUD na Foto" name="hud_check"/>
<check_box bottom_delta="-17" label="Manter aberto após salvar" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Quadro Congelado&#10; (prévia da tela inteira)" name="freeze_frame_check"/>
+ <check_box bottom_delta="-17" label="Quadro Congelado (prévia da tela inteira)" name="freeze_frame_check"/>
<check_box bottom_delta="-29" label="Auto-atualizar" name="auto_snapshot_check"/>
<string name="unknown">
desconhecido
diff --git a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
index df76499f42..e62260c2e3 100644
--- a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="sound.wav">
+<floater name="Sound Preview" title="SOM.WAV">
<text name="name_label">
Nome:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_statistics.xml b/indra/newview/skins/default/xui/pt/floater_statistics.xml
index d26c7081cc..ecbf638157 100644
--- a/indra/newview/skins/default/xui/pt/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/pt/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="Statística"/>
+<floater name="stats floater" title="ESTATÃSTICAS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml
new file mode 100644
index 0000000000..11589b31b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="ESTATÃSTICAS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Básico" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandwidth" name="bandwidth"/>
+ <stat_bar label="Bandwidth" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avançado" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="Total Objects" name="objs"/>
+ <stat_bar label="New Objects" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Rede" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="Objects" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Layers" name="layerskbitstat"/>
+ <stat_bar label="Actual In" name="actualinkbitstat"/>
+ <stat_bar label="Actual Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Time Dilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Objects" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="Script Events" name="simscripteps"/>
+ <stat_bar label="Packets In" name="siminpps"/>
+ <stat_bar label="Packets Out" name="simoutpps"/>
+ <stat_bar label="Pending Downloads" name="simpendingdownloads"/>
+ <stat_bar label="Pending Uploads" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="Script Time" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sys_well.xml b/indra/newview/skins/default/xui/pt/floater_sys_well.xml
new file mode 100644
index 0000000000..b4760835b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="AVISOS">
+ <string name="title_im_well_window">
+ MIs
+ </string>
+ <string name="title_notification_well_window">
+ AVISOS
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_telehub.xml b/indra/newview/skins/default/xui/pt/floater_telehub.xml
index 11886c7cab..6b35d3f919 100644
--- a/indra/newview/skins/default/xui/pt/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/pt/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="Telehub" min_height="310" height="310" width="286">
+<floater height="310" min_height="310" name="telehub" title="TELEHUB" width="286">
<text name="status_text_connected">
Telehub conectado ao objeto [OBJECT]
</text>
@@ -17,16 +17,13 @@
<text name="spawn_points_text" width="265">
Pontos de Nascimento (posições, não objetos):
</text>
- <scroll_list name="spawn_points_list" width="265" />
- <button width="135" label="Adicionar Nascimento" name="add_spawn_point_btn"/>
- <button width="130" label="Remover Nascimento" name="remove_spawn_point_btn" left="150"/>
+ <scroll_list name="spawn_points_list" width="265"/>
+ <button label="Adicionar Nascimento" name="add_spawn_point_btn" width="135"/>
+ <button label="Remover Nascimento" left="150" name="remove_spawn_point_btn" width="130"/>
<text name="spawn_point_help">
- Selecione um objeto e clique Adicionar para
-especificar a posição.
-Em seguida, você pode mover ou apagar o objeto.
-As posições são relativas ao centro do telehub.
-
-Selecione um item na lista para mostrar a posição
-in-world.
+ Selecione o objeto e clique em &apos;Adicionar spawn&apos; para especificar a posição.
+O objeto pode ser excluído ou movido posteriormente.
+As posições são definidas em relação ao centro do telehub.
+Selecione um item da lista para realçá-lo inworld.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index 784540a48e..69ea67699c 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Pegar: Textura">
+<floater name="texture picker" title="DESTAQUE: TEXTURA">
<string name="choose_picture">
Clique para escolher uma imagem
</string>
<text name="Multiple">
- Multiplo
+ Multiplas texturas
</text>
<text name="unknown">
- Dimensões: [DIMENSIONS]
+ Tamanho: [DIMENSÕES]
</text>
<button label="Padrão" label_selected="Padrão" name="Default"/>
<button label="Nenhum" label_selected="Nenhum" name="None"/>
<button label="Branco" label_selected="Branco" name="Blank"/>
- <check_box label="Mostrar Pastas" name="show_folders_check"/>
- <search_editor label="Clique aqui para buscar" name="inventory search editor"/>
- <check_box label="Aplicar Imediatamente" name="apply_immediate_check"/>
+ <check_box label="Exibir pastas" name="show_folders_check"/>
+ <search_editor label="Filtrar texturas" name="inventory search editor"/>
+ <check_box label="Applicar agora" name="apply_immediate_check"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Selecionar" label_selected="Selecionar" name="Select"/>
+ <button label="Ok" label_selected="Ok" name="Select"/>
<string name="pick title">
Pegar:
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index d7227deacc..fb44c5c3bf 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -1,45 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="Construir" width="288">
+<floater name="toolbox floater" short_title="BUILD TOOLS" title="" width="288">
+ <floater.string name="status_rotate">
+ Arrastar as bandas coloridas para girar o objeto
+ </floater.string>
+ <floater.string name="status_scale">
+ Clicar e arrastar para esticar o lado selecionado
+ </floater.string>
+ <floater.string name="status_move">
+ Arrastar para mover, Shift-arrastar para copiar
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Clicar e reter para modificar a terra
+ </floater.string>
+ <floater.string name="status_camera">
+ Clique e arraste para mexer a câmera
+ </floater.string>
+ <floater.string name="status_grab">
+ Arraste para mexer, Ctrl para levantar, Ctrl+Shift para girar
+ </floater.string>
+ <floater.string name="status_place">
+ Clique no mundo para construir
+ </floater.string>
+ <floater.string name="status_selectland">
+ Clicar e arrastar para selecionar a terra
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Tela
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referência
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anexo
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Foco"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
<button label="" label_selected="" name="button edit" tool_tip="Editar"/>
<button label="" label_selected="" name="button create" tool_tip="Criar"/>
<button label="" label_selected="" name="button land" tool_tip="Terra"/>
+ <text name="text status" width="280">
+ Arraste para mover, shift+Arrastar para Copiar
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Órbita (Ctrl)" name="radio orbit"/>
- <radio_item label="Pan (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Pan (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Mover" name="radio move"/>
<radio_item label="Suspender (Ctrl)" name="radio lift"/>
- <radio_item label="Girar (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Posição" name="radio position"/>
+ <radio_item label="Movimentar" name="radio position"/>
<radio_item label="Rotacionar (Ctrl)" name="radio rotate"/>
- <radio_item label="Esticar (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Selecionar Textura" name="radio select face"/>
+ <radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Face selecionada" name="radio select face"/>
</radio_group>
- <check_box label="Editar partes unidas" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Régua:
+ <check_box label="Editar item linkado" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="Mostra o cálculo do custo de renderização do objeto">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Mundo"
- />
- <combo_box.item name="Local" label="Local"
- />
- <combo_box.item name="Reference" label="Referência"
- />
- </combo_box>
<check_box label="Esticar ambos os lados" name="checkbox uniform"/>
- <check_box label="Esticar Texturas" name="checkbox stretch textures"/>
- <check_box label="Usar Grade" name="checkbox snap to grid"/>
- <button label="Opções..." label_selected="Opções..." name="Options..."/>
- <text name="text status" width="280">
- Arraste para mover, shift+Arrastar para Copiar
- </text>
+ <check_box initial_value="true" label="Esticar Texturas" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Mostrar na grade" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Selecione o tipo de régua da grade onde o objeto será colocado">
+ <combo_box.item label="Grid SL" name="World"/>
+ <combo_box.item label="Grid local" name="Local"/>
+ <combo_box.item label="Grid de referência" name="Reference"/>
+ </combo_box>
+ <button label="Opções..." label_selected="Opções..." name="Options..." tool_tip="Mais opções de grade"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pirâmide"/>
@@ -55,10 +91,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Anel"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Ãrvore"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Grama"/>
- <check_box label="Manter selecionado" name="checkbox sticky"/>
- <check_box label="Copiar selecionado" name="checkbox copy selection"/>
- <check_box label="Centro" name="checkbox copy centers"/>
- <check_box label="Rotacionar" name="checkbox copy rotates"/>
+ <check_box label="Ficar com ferramenta selecionado" name="checkbox sticky"/>
+ <check_box label="Copiar seleção" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Copiar parte central" name="checkbox copy centers"/>
+ <check_box label="Girar cópia" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Selecionar Terra" name="radio select land"/>
<radio_item label="Aplainar" name="radio flatten"/>
@@ -68,7 +104,6 @@
<radio_item label="Endurecer" name="radio noise"/>
<radio_item label="Reverter" name="radio revert"/>
</radio_group>
- <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar Terra Selecionada"/>
<text name="Bulldozer:">
Escavadeira:
</text>
@@ -78,14 +113,51 @@
<text name="Strength:">
Força
</text>
- <text name="obj_count" left="134">
- Objetos selecionados: [COUNT]
+ <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar a terra selecionada"/>
+ <text left="134" name="obj_count">
+ Objects: [COUNT]
</text>
- <text name="prim_count" left="134">
- primitivas: [COUNT]
+ <text left="134" name="prim_count">
+ Prims: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288">
<panel label="Comum" name="General">
+ <panel.string name="text deed continued">
+ Doar
+ </panel.string>
+ <panel.string name="text deed">
+ Doar
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Você pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Você pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Você não pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Você não pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Selecione o objeto intereiro para configurar as autorizações
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preço: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Preço unitário: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Preço Misturado
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venda Misturada
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -98,135 +170,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/>
<text name="Owner:">
Proprietário:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/>
<text name="Group:">
Grupo:
</text>
- <text name="Group Name Proxy">
- The Lindens
- </text>
- <button label="Definir..." label_selected="Definir..." name="button set group"/>
- <text name="Permissions:">
- Permissões:
- </text>
-
- <check_box label="Compartilhar com o Grupo" name="checkbox share with group" tool_tip="Permite que todos os membros do grupo definido compartilhem e usem suas permissões para este objeto. Você precisa Doar ao Grupo para habilitar as restrições de função."/>
- <string name="text deed continued">
- Doar...
- </string>
- <string name="text deed">
- Doar
- </string>
- <button label="Doar..." label_selected="Doar..." name="button deed" tool_tip="Objetos compartilhados do Grupo pode ser doados pelo gerente do grupo."/>
- <check_box label="Permitir que qualquer um mova" name="checkbox allow everyone move"/>
- <check_box label="Permitir que qualquer um copie" name="checkbox allow everyone copy"/>
- <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/>
- <check_box label="À Venda" name="checkbox for sale"/>
- <text name="Cost">
- Preço: L$
+ <button label="Definir..." label_selected="Definir..." name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
+ <name_box initial_value="Carregando..." name="Group Name Proxy"/>
+ <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
+ <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
+ <text name="label click action" width="220">
+ Clique para:
</text>
+ <combo_box name="clickaction" width="192">
+ <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentar no objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar Objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="À venda" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Cópia" name="Copy"/>
<combo_box.item label="Conteúdo" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action" width="220">
- Quando clicado com o botão esquerdo:
- </text>
- <combo_box name="clickaction" width="192">
- <combo_box.item name="Touch/grab(default)" label="Tocar/Pegar (padrão)"
- />
- <combo_box.item name="Sitonobject" label="Sentar no objeto"
- />
- <combo_box.item name="Buyobject" label="Comprar objeto"
- />
- <combo_box.item name="Payobject" label="Pagar Objeto"
- />
- <combo_box.item name="Open" label="Abrir"
- />
- <combo_box.item name="Play" label="Executar a mídia do lote"
- />
- <combo_box.item name="Opemmedia" label="Abrir a mídia do lote"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Você pode modificar este objeto
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Próximo Proprietário pode:
- </text>
- <check_box label="Modificar" name="checkbox next owner can modify"/>
- <check_box label="Copiar" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Você pode modificar este objeto
- </string>
- <string name="text modify info 2">
- Você pode modificar estes objetos
- </string>
- <string name="text modify info 3">
- Você não pode modificar este objeto
- </string>
- <string name="text modify info 4">
- Você não pode modificar estes objetos
- </string>
- <string name="text modify warning">
- Você precisa selecionar o objeto todo para ajustar as permissões
- </string>
- <string name="Cost Default">
- Preço: L$
- </string>
- <string name="Cost Total">
- Preço Total: L$
- </string>
- <string name="Cost Per Unit">
- Preço Por: L$
- </string>
- <string name="Cost Mixed">
- Preço Misturado
- </string>
- <string name="Sale Mixed">
- Venda Misturada
- </string>
+ <spinner label="Preço: L$" name="Edit Cost"/>
+ <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Você pode modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Todos:
+ </text>
+ <check_box label="Movimentar" name="checkbox allow everyone move"/>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo proprietário:
+ </text>
+ <check_box label="Modificar" name="checkbox next owner can modify"/>
+ <check_box label="Copiar" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Transferir" left_delta="67" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objeto" name="Object">
- <text name="select_single" width="272">
- Selecione apenas uma primitiva para editar os parâmetros.
- </text>
- <text name="edit_object">
- Editar os parâmetros do Objeto:
- </text>
<check_box label="Travado" name="checkbox locked" tool_tip="Previne que o objeto seja movido ou apagado. Muito útil para evitar edições não intencionais durante a construção."/>
<check_box label="Física" name="Physical Checkbox Ctrl" tool_tip="Permite que os objetos sejam empurrados e sofram efeito da gravidade"/>
- <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="Faz com que o objeto seja apagado 1 minuto após ser criado."/>
+ <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="O objeto será excluído um minuto depois de ser criado"/>
<check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Faz com que o objeto não colida com outros objetos ou avatares"/>
<text name="label position">
Posição (metros)
@@ -246,48 +260,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Material
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Pedra"
- />
- <combo_box.item name="Metal" label="Metal"
- />
- <combo_box.item name="Glass" label="Vidro"
- />
- <combo_box.item name="Wood" label="Madeira"
- />
- <combo_box.item name="Flesh" label="Carne"
- />
- <combo_box.item name="Plastic" label="Plástico"
- />
- <combo_box.item name="Rubber" label="Couro"
- />
- </combo_box>
- <text name="label basetype">
- Forma básica
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Caixa"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toróide"
- />
- <combo_box.item name="Tube" label="Tubo"
- />
- <combo_box.item name="Ring" label="Anel"
- />
- <combo_box.item name="Sculpted" label="Esculpida"
- />
+ <combo_box.item label="Caixa" name="Box"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toróide" name="Torus"/>
+ <combo_box.item label="Tubo" name="Tube"/>
+ <combo_box.item label="Anel" name="Ring"/>
+ <combo_box.item label="Esculpida" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Pedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidro" name="Glass"/>
+ <combo_box.item label="Madeira" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Couro" name="Rubber"/>
</combo_box>
<text name="text cut">
- Recorte Início e final
+ Path Cut (begin/end)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -301,17 +294,13 @@
Forma Vazia
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Padrão"
- />
- <combo_box.item name="Circle" label="Circulo"
- />
- <combo_box.item name="Square" label="Quadrado"
- />
- <combo_box.item name="Triangle" label="Triâgulo"
- />
+ <combo_box.item label="Padrão" name="Default"/>
+ <combo_box.item label="Circulo" name="Circle"/>
+ <combo_box.item label="Quadrado" name="Square"/>
+ <combo_box.item label="Triâgulo" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torcer no Início e final
+ Twist (begin/end)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -329,13 +318,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut" width="156">
- Perfil Recortado no Início e fim
+ Profile Cut (begin/end)
</text>
<text name="advanced_dimple">
- Cova Início e final
+ Dimple (begin/end)
</text>
<text name="advanced_slice">
- Pedaço Início e fim
+ Slice (begin/end)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -351,22 +340,17 @@
Revoluções
</text>
<texture_picker label="Texture de Escultura" name="sculpt texture control" tool_tip="Click to choose a picture"/>
- <check_box label="Espelho" name="sculpt mirror control" tool_tip="Inverter a primitiva esculpida ao longo do eixo X."/>
- <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverte as normais das primitivas esculpidas, fazendo-as parecer de dentro para fora."/>
+ <check_box label="Espelho" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
+ <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
<text name="label sculpt type">
Tipo costura
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(nenhum)"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toróide"
- />
- <combo_box.item name="Plane" label="Plano"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
+ <combo_box.item label="(nenhum)" name="None"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toróide" name="Torus"/>
+ <combo_box.item label="Plano" name="Plane"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Recursos" name="Features">
@@ -376,7 +360,7 @@
<text name="edit_object">
Editar características do Objeto:
</text>
- <check_box label="Flexíbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que o objeto flexione no eixo Z. (Somente no lado do Cliente)"/>
+ <check_box label="Flexíbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
<spinner label="Suavidade" name="FlexNumSections"/>
<spinner label="Gravidade" name="FlexGravity"/>
<spinner label="Arrastar" name="FlexFriction"/>
@@ -386,17 +370,24 @@
<spinner label="Força Y" name="FlexForceY"/>
<spinner label="Força Z" name="FlexForceZ"/>
<check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Faz com que o objeto emita luz"/>
- <text name="label color">
- Cor
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Selecionar a cor"/>
+ <texture_picker label="" name="light texture control" tool_tip="Clique para selecionar uma imagem de projeção (só com renderização suspesa ativada)"/>
<spinner label="Intensidade" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Raio" name="Light Radius"/>
+ <spinner label="Enfocar" name="Light Focus"/>
<spinner label="Queda" name="Light Falloff"/>
+ <spinner label="Ambiente" name="Light Ambiance"/>
</panel>
<panel label="Textura" name="Texture">
+ <panel.string name="string repeats per meter">
+ Repetir por Metro
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repetir por Face
+ </panel.string>
<texture_picker label="Textura" name="texture control" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/>
+ <color_swatch label="Cor" name="colorswatch" tool_tip="Selecionar a cor"/>
<text name="color trans" width="100">
Transparência %
</text>
@@ -408,99 +399,69 @@
Mapeamento
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Padrão"
- />
- <combo_box.item name="Planar" label="Planar"
- />
+ <combo_box.item label="Padrão" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
</combo_box>
<text name="label shininess">
Brilho
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Nenhum"
- />
- <combo_box.item name="Low" label="Baixo"
- />
- <combo_box.item name="Medium" label="Médio"
- />
- <combo_box.item name="High" label="Alto"
- />
+ <combo_box.item label="Nenhum" name="None"/>
+ <combo_box.item label="Baixo" name="Low"/>
+ <combo_box.item label="Médio" name="Medium"/>
+ <combo_box.item label="Alto" name="High"/>
</combo_box>
<text name="label bumpiness">
Ondulação
</text>
- <combo_box name="combobox bumpiness" width="100" >
- <combo_box.item name="None" label="Nenhum"
- />
- <combo_box.item name="Brightness" label="Claridade"
- />
- <combo_box.item name="Darkness" label="Escuridão"
- />
- <combo_box.item name="woodgrain" label="Granulação"
- />
- <combo_box.item name="bark" label="Casca"
- />
- <combo_box.item name="bricks" label="Tijolos"
- />
- <combo_box.item name="checker" label="Caixa"
- />
- <combo_box.item name="concrete" label="Concreto"
- />
- <combo_box.item name="crustytile" label="Encaroçado"
- />
- <combo_box.item name="cutstone" label="Pedra Cortante"
- />
- <combo_box.item name="discs" label="Discos"
- />
- <combo_box.item name="gravel" label="Cascalho"
- />
- <combo_box.item name="petridish" label="Pedrisco"
- />
- <combo_box.item name="siding" label="Revestimento"
- />
- <combo_box.item name="stonetile" label="Empedrado"
- />
- <combo_box.item name="stucco" label="Grafiato"
- />
- <combo_box.item name="suction" label="Sulcos"
- />
- <combo_box.item name="weave" label="Weave"
- />
+ <combo_box name="combobox bumpiness" width="100">
+ <combo_box.item label="Nenhum" name="None"/>
+ <combo_box.item label="Claridade" name="Brightness"/>
+ <combo_box.item label="Escuridão" name="Darkness"/>
+ <combo_box.item label="Granulação" name="woodgrain"/>
+ <combo_box.item label="Casca" name="bark"/>
+ <combo_box.item label="Tijolos" name="bricks"/>
+ <combo_box.item label="Caixa" name="checker"/>
+ <combo_box.item label="Concreto" name="concrete"/>
+ <combo_box.item label="Encaroçado" name="crustytile"/>
+ <combo_box.item label="Pedra Cortante" name="cutstone"/>
+ <combo_box.item label="Discos" name="discs"/>
+ <combo_box.item label="Cascalho" name="gravel"/>
+ <combo_box.item label="Pedrisco" name="petridish"/>
+ <combo_box.item label="Revestimento" name="siding"/>
+ <combo_box.item label="Empedrado" name="stonetile"/>
+ <combo_box.item label="Grafiato" name="stucco"/>
+ <combo_box.item label="Sulcos" name="suction"/>
+ <combo_box.item label="Weave" name="weave"/>
</combo_box>
<text name="tex scale">
- Repetir por Face
+ Repeats / Face
</text>
<spinner label="Horizontal (U)" name="TexScaleU"/>
<check_box label="Flip" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Flip" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotação (graus)
- </text>
- <string name="string repeats per meter">
- Repetir por Metro
- </string>
- <string name="string repeats per face">
- Repetir por Face
- </string>
- <text name="rpt">
- Repetir por Metro
- </text>
+ <spinner label="RotationËš" name="TexRot"/>
+ <spinner label="Repeats / Meter" name="rptctrl"/>
<button label="Aplicar" label_selected="Aplicar" name="button apply"/>
<text name="tex offset">
- Deslocamento
+ Texture Offset
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertical (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Alinhar Texturas
- </text>
- <button label="Alinhar" label_selected="Alinhar" name="button align"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Mídia
+ </text>
+ <button name="add_media" tool_tip="Adicionar mídia"/>
+ <button name="delete_media" tool_tip="Excluir esta textura de mídia"/>
+ <button name="edit_media" tool_tip="Editar esta mídia"/>
+ <button label="Alinhar" label_selected="Alinhar mídias" name="button align" tool_tip="Alinhar textura da mídia (após carregar mídia)"/>
+ </panel>
</panel>
<panel label="Conteúdo" name="Contents">
- <button label="Novo Script" label_selected="Novo Script" name="button new script"/>
- <button label="Permissões" name="button permissions"/>
- <panel name="ContentsInventory" width="272" />
+ <button label="Novo Script" label_selected="Novo script" name="button new script"/>
+ <button label="Autorizações" name="button permissions"/>
</panel>
</tab_container>
<panel name="land info panel">
@@ -508,62 +469,22 @@
Informações do Lote
</text>
<text name="label_area_price">
- Preço: L$[PRICE] por [AREA] m².
+ Preço: L$[PRICE] por [AREA] m²
</text>
<text name="label_area">
- Ãrea: [AREA] m².
+ Ãrea: [AREA] m²
</text>
- <button label="Sobre a Terra..." label_selected="Sobre a Terra..." name="button about land"/>
- <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: &#10;&#10;Green = Sua terra &#10;Aqua = Terra do seu grupo &#10;Red = Possuída por outros &#10;Yellow = À venda &#10;Purple = A leilão &#10;Grey = Pública"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="100"/>
+ <button label="Sobre terrenos" label_selected="Sobre terrenos" name="button about land"/>
+ <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: Green = Sua terra Aqua = Terra do seu grupo Red = Possuída por outros Yellow = À venda Purple = A leilão Grey = Pública"/>
<text name="label_parcel_modify">
Modificar Lote
</text>
- <button label="Sub-Dividir" label_selected="Sub-Dividir" name="button subdivide land"/>
- <button label="Unir" label_selected="Unir" name="button join land"/>
+ <button label="Subdividir" label_selected="Subdividir" name="button subdivide land"/>
+ <button label="Juntar" label_selected="Juntar" name="button join land"/>
<text name="label_parcel_trans">
Transações com a Terra
</text>
- <button label="Comprar Terra" label_selected="Comprar Terra" name="button buy land"/>
- <button label="Abandonar Terra" label_selected="Abandonar Terra" name="button abandon land"/>
+ <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land"/>
+ <button label="Abandonar terreno" label_selected="Abandonar terreno" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- Arrastar as bandas coloridas para girar o objeto
- </floater.string>
- <floater.string name="status_scale">
- Clicar e arrastar para esticar o lado selecionado
- </floater.string>
- <floater.string name="status_move">
- Arrastar para mover, Shift-arrastar para copiar
- </floater.string>
- <floater.string name="status_modifyland">
- Clicar e reter para modificar a terra
- </floater.string>
- <floater.string name="status_camera">
- Clicar e arrastar para mudar a vista
- </floater.string>
- <floater.string name="status_grab">
- Arrastar para mover, Ctrl para levantar, Ctrl-Shift para rotacionar
- </floater.string>
- <floater.string name="status_place">
- Clique no mundo para construir
- </floater.string>
- <floater.string name="status_selectland">
- Clicar e arrastar para selecionar a terra
- </floater.string>
- <floater.string name="grid_screen_text">
- Tela
- </floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referência
- </floater.string>
- <floater.string name="grid_attachment_text">
- Anexo
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index cd94b51b16..c6a62c9118 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="Carregando...">
+<floater name="top_objects" title="Principais objetos:">
<text name="title_text">
Carregando...
</text>
@@ -16,20 +16,20 @@
</text>
<button label="Mostrar Avisos" name="show_beacon_btn"/>
<text name="obj_name_text">
- Nome do Objeto:
+ Nome do objeto:
</text>
<button label="Filtro" name="filter_object_btn"/>
<text name="owner_name_text" width="130">
- Nome do Proprietário:
+ Proprietário:
</text>
<line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
<line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
<line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
<button label="Filtro" name="filter_owner_btn"/>
<button label="Retornar Selecionado" name="return_selected_btn" width="170"/>
- <button label="Retornar Tudo" name="return_all_btn" left="190"/>
+ <button label="Retornar Tudo" left="190" name="return_all_btn"/>
<button label="Desabilitar Selecionado" name="disable_selected_btn" width="170"/>
- <button label="Desabilitar Tudo" name="disable_all_btn" left="190"/>
+ <button label="Desabilitar Tudo" left="190" name="disable_all_btn"/>
<button label="Atualizar" name="refresh_btn"/>
<string name="top_scripts_title">
Principais Scripts
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 7a0c187517..9a9666f9db 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -4,8 +4,7 @@
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<check_box label="Eu concordo com os Termos do Serviço" name="agree_chk"/>
<text name="tos_heading">
- Por favor, leia os seguintes Termos de Serviço cuidadosamente. Para continuar acessando o
-[SECOND_LIFE], você precisa aceitar o acordo.
+ Leia com atenção os Termos do Serviço. Para continuar a entrar no [SECOND_LIFE], é preciso aceitar o contrato.
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
new file mode 100644
index 0000000000..8348b375b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Controles de voz">
+ <string name="title_nearby">
+ VOZ LOCAL
+ </string>
+ <string name="title_group">
+ Ligação de grupo com [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Teleconferência
+ </string>
+ <string name="title_peer_2_peer">
+ Ligação para [NAME]
+ </string>
+ <string name="no_one_near">
+ Ninguém por perto
+ </string>
+ <panel name="control_panel">
+ <layout_stack>
+ <layout_panel name="leave_btn_panel">
+ <button label="Desligar" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
index ceb4414058..36b995d4fd 100644
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ b/indra/newview/skins/default/xui/pt/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="Editor de Ãgua Avançado">
+<floater name="Water Floater" title="EDITOR DE ÃGUA AVANÇADO">
<text name="KeyFramePresetsText" width="154">
Pré-configurações da Ãgua:
</text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150" />
+ <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
<button label="Novo" label_selected="Novo" name="WaterNewPreset"/>
<button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/>
<button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/>
@@ -13,19 +13,19 @@
Cor da névoa da Ãgua
</text>
<button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Clique para abrir o Capturador de Cor"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Selecionar a cor"/>
<text name="WaterFogDensText">
Expoente da Densidade de névoa
</text>
- <button label="?" name="WaterFogDensityHelp" left="209"/>
+ <button label="?" left="209" name="WaterFogDensityHelp"/>
<text name="WaterUnderWaterFogModText">
Modificador da névoa Subaquática
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" left="209"/>
+ <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
<text name="BDensText">
Escala da Marola de Reflexão
</text>
- <button label="?" name="WaterNormalScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -38,29 +38,29 @@
<text name="HDText">
Escala de Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterFresnelScaleHelp"/>
<text name="FresnelOffsetText">
Deslocamento de Fresnel
</text>
- <button label="?" name="WaterFresnelOffsetHelp" left="415"/>
+ <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
<text name="DensMultText">
Refratar a Escala para Cima
</text>
- <button label="?" name="WaterScaleAboveHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleAboveHelp"/>
<text name="WaterScaleBelowText">
Refratar a Escala para Baixo
</text>
- <button label="?" name="WaterScaleBelowHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleBelowHelp"/>
<text name="MaxAltText">
Multiplicador de Difusão
</text>
- <button label="?" name="WaterBlurMultiplierHelp" left="640"/>
+ <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
</panel>
<panel label="Imagem" name="Waves">
<text name="BHText">
Direção da Onda Maior
</text>
- <button label="?" name="WaterWave1Help" left="170"/>
+ <button label="?" left="170" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
@@ -70,7 +70,7 @@
<text name="BHText2">
Direção da Onda Pequena
</text>
- <button label="?" name="WaterWave2Help" left="170"/>
+ <button label="?" left="170" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..8f616396ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry">
+ <text name="media_label">
+ Digite um URL ou série de URLs para a lista de domínios permitidos
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Digite um URL ou série de URLs para a lista branca"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
index 0de8bd22f8..951e37a1a6 100644
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="Editor de Céu Avançado">
+<floater name="WindLight floater" title="EDITOR DE CÉU AVANÇADO">
<text name="KeyFramePresetsText" width="130">
Pré-definições de Céu:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml
index 056d121520..81f8ce7846 100644
--- a/indra/newview/skins/default/xui/pt/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml
@@ -1,53 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="Mapa Mundi">
- <tab_container name="maptab">
- <panel label="Objetos" name="objects_mapview"/>
- <panel label="Terreno" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Você
- </text>
- <text name="home_label">
- Casa
- </text>
- <text name="auction_label">
- Leilão
- </text>
- <text name="land_for_sale_label">
- Terra à venda
- </text>
- <button label="Ir para Casa" label_selected="Ir para casa" name="Go Home" tool_tip="Teletransportar para sua Casa"/>
- <check_box label="Residente" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Terra à Venda" name="land_for_sale_chk"/>
- <text name="events_label">
- Eventos:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <combo_box label="Amigos Conectados" name="friend combo" tool_tip="Amigos para mostrar no Mapa">
- <combo_box.item name="item1" label="Amigos Conectados" />
- </combo_box>
- <combo_box label="Landmarks" name="landmark combo" tool_tip="Landmark para mostrar no Mapa">
- <combo_box.item name="item1" label="Landmarks" />
- </combo_box>
- <line_editor label="Procurar por nome de região" name="location" tool_tip="Digite o nome de uma Região"/>
- <button label="Procurar" name="DoSearch" tool_tip="Procurar por região"/>
- <text name="search_label">
- Resultados da Procura:
- </text>
- <text name="location_label">
- Localização:
- </text>
- <spinner name="spin x" tool_tip="Coordenada X da posição mostrada no mapa"/>
- <spinner name="spin y" tool_tip="Coordenada Y da posição mostrada no mapa"/>
- <spinner name="spin z" tool_tip="Coordenada Z da posição mostrada no Mapa"/>
- <button font="SansSerifSmall" label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para a posição selecionada"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostrar destino" label_selected="Mostrar Destino" name="Show Destination" tool_tip="Centralizar mapa na posição selecionada"/>
- <button font="SansSerifSmall" label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Parar de percorrer"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostra minha localização" label_selected="Mostra minha localização" name="Show My Location" tool_tip="Centraliza o mapa na posição do seu Avatar"/>
- <button font="SansSerifSmall" label="Copiar SLurl para área de transferência" name="copy_slurl" tool_tip="Copia a posição atual como SLurl para ser usada na Web"/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="MAPA-MÚNDI">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legenda
+ </text>
+ </panel>
+ <panel>
+ <button font="SansSerifSmall" label="Mostra minha localização" label_selected="Mostra minha localização" left_delta="91" name="Show My Location" tool_tip="Centrar o mapa na localização do meu avatar" width="135"/>
+ <text name="person_label">
+ Eu
+ </text>
+ <check_box label="Residente" name="people_chk"/>
+ <check_box label="Infohub" name="infohub_chk"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box label="Terra à Venda" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ Venda de terreno
+ </text>
+ <text name="auction_label">
+ pelo dono
+ </text>
+ <button label="Ir para Casa" label_selected="Ir para casa" name="Go Home" tool_tip="Teletransportar para minha casa"/>
+ <text name="Home_label">
+ Casa
+ </text>
+ <text name="events_label">
+ Eventos:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ Moderado
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ </panel>
+ <panel>
+ <text name="find_on_map_label">
+ Localizar no mapa
+ </text>
+ </panel>
+ <panel>
+ <combo_box label="Amigos Conectados" name="friend combo" tool_tip="Mostrar amigos no mapa">
+ <combo_box.item label="Amigos conectados" name="item1"/>
+ </combo_box>
+ <combo_box label="Meus marcos" name="landmark combo" tool_tip="Mostrar marco no mapa">
+ <combo_box.item label="Meus marcos" name="item1"/>
+ </combo_box>
+ <search_editor label="Regiões por nome" name="location" tool_tip="Digite o nome de uma Região"/>
+ <button label="Buscar" name="DoSearch" tool_tip="Procurar por região"/>
+ <button font="SansSerifSmall" label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para a posição selecionada"/>
+ <button font="SansSerifSmall" label="Copiar SLurl" name="copy_slurl" tool_tip="Copia a localização atual como um SLurl para usar na web."/>
+ <button font="SansSerifSmall" label="Mostrar seleção" label_selected="Mostrar Destino" left_delta="91" name="Show Destination" tool_tip="Centralizar mapa na posição selecionada" width="135"/>
+ </panel>
+ <panel>
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel>
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
new file mode 100644
index 0000000000..8f35acf19e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [IDADE]
+ </string>
+ <string name="Details">
+ [PERFIL_SL]
+ </string>
+ <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/>
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Mais" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disabilitar Voz" name="disable_voice"/>
+ <button label="Habilitar Voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_group.xml b/indra/newview/skins/default/xui/pt/inspect_group.xml
new file mode 100644
index 0000000000..889d35f269
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Grupo privado
+ </string>
+ <string name="FreeToJoin">
+ Livre para ingressar
+ </string>
+ <string name="CostToJoin">
+ [AMOUNT]L$ para ingressar
+ </string>
+ <string name="YouAreMember">
+ Você é um membro
+ </string>
+ <button label="Ingressar" name="join_btn"/>
+ <button label="Abandonar" name="leave_btn"/>
+ <button label="Visualizar Perfil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_object.xml b/indra/newview/skins/default/xui/pt/inspect_object.xml
new file mode 100644
index 0000000000..e9f1ca3a0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_object.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Autor: [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Autor: [CREATOR]
+Proprietário: [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Grátis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentar
+ </string>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Pegar uma cópia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentar" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegação segura"/>
+ <button label="Mais" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_remote_object.xml b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml
new file mode 100644
index 0000000000..789194bf2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Proprietário:
+ </text>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Bloquear" name="block_btn"/>
+ <button label="Fechar" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
new file mode 100644
index 0000000000..b6cf896836
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
new file mode 100644
index 0000000000..04f6227141
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Tirar" name="Detach"/>
+ <menu_item_call label="Largar" name="Drop"/>
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <menu_item_call label="Minha aparência" name="Appearance..."/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml
new file mode 100644
index 0000000000..beba969b7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar MI..." name="Send IM"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
new file mode 100644
index 0000000000..21c2cb196a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
new file mode 100644
index 0000000000..99d5ae9bec
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <context_menu label="Tirar &gt;" name="Take Off &gt;">
+ <context_menu label="Roupa &gt;" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Meias" name="Socks"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
+ <menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Todas as roupas" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD &gt;" name="Object Detach HUD"/>
+ <context_menu label="Tirar &gt;" name="Object Detach"/>
+ <menu_item_call label="Tirar tudo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Minha aparência" name="Appearance..."/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
new file mode 100644
index 0000000000..43b446a67e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
+ <menu_item_check label="Botão de ver" name="ShowCameraButton"/>
+ <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_favorites.xml b/indra/newview/skins/default/xui/pt/menu_favorites.xml
new file mode 100644
index 0000000000..062820fbca
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teletransportar" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar marco" name="Landmark Open"/>
+ <menu_item_call label="Copiar SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar no mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Colar" name="Landmark Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml
new file mode 100644
index 0000000000..70d8ae7a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Adicionar/remover de favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Copiar UUID" name="copy_uuid"/>
+ <menu_item_call label="Salvar para look atual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Verificar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_group_plus.xml b/indra/newview/skins/default/xui/pt/menu_group_plus.xml
new file mode 100644
index 0000000000..1083845d68
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar no grupo..." name="item_join"/>
+ <menu_item_call label="Novo grupo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
new file mode 100644
index 0000000000..472ca466c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..ead949ba13
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..dd177d1b8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Sobre o grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar sessão" name="Chat"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d821b3ded0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Mostrar sessão" name="Send IM"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..46c536e64b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ver perfil" name="view_profile"/>
+ <menu_item_call label="Adicionar amigo..." name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Ligar" name="call"/>
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="invite_to_group"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Ejetar" name="eject"/>
+ <menu_item_call label="Depurar" name="debug"/>
+ <menu_item_call label="Localizar no mapa" name="find_on_map"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+ <menu_item_call label="Pagar" name="pay"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..b69d205533
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentar" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Pegar" name="take"/>
+ <menu_item_call label="Pegar uma cópia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Vestir" name="wear"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+ <menu_item_call label="Tirar" name="remove"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..2eba4ccb2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ficar de pé" name="stand_up"/>
+ <menu_item_call label="Minha aparência" name="my_appearance"/>
+ <menu_item_call label="Meu perfil" name="my_profile"/>
+ <menu_item_call label="Meus amigos" name="my_friends"/>
+ <menu_item_call label="Meus grupos" name="my_groups"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 486588158e..de33849d0c 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Novo Script" name="New Script"/>
<menu_item_call label="Nova Nota" name="New Note"/>
<menu_item_call label="Novo Gesto" name="New Gesture"/>
- <menu label="Nova Roupa" name="New Clothes">
+ <menu label="Novas roupas" name="New Clothes">
<menu_item_call label="Nova Camisa" name="New Shirt"/>
<menu_item_call label="Nova Calça" name="New Pants"/>
<menu_item_call label="Novos Calçados" name="New Shoes"/>
@@ -22,31 +22,47 @@
<menu_item_call label="Novas Luvas" name="New Gloves"/>
<menu_item_call label="Nova Anágua" name="New Undershirt"/>
<menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
</menu>
- <menu label="Parte do corpo" name="New Body Parts">
+ <menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
<menu_item_call label="Nova pele" name="New Skin"/>
<menu_item_call label="Novo cabelo" name="New Hair"/>
<menu_item_call label="Novos olhos" name="New Eyes"/>
</menu>
+ <menu label="Alterar fonte" name="Change Type">
+ <menu_item_call label="Padrão" name="Default"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Silhueta" name="Shape"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Roupa de baixo" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teletransporte" name="Landmark Open"/>
<menu_item_call label="Abrir" name="Animation Open"/>
<menu_item_call label="Abrir" name="Sound Open"/>
<menu_item_call label="Remover item" name="Purge Item"/>
<menu_item_call label="Restaurar item" name="Restore Item"/>
+ <menu_item_call label="Ir para o link" name="Goto Link"/>
<menu_item_call label="Abrir" name="Open"/>
<menu_item_call label="Propriedades" name="Properties"/>
<menu_item_call label="Renomear" name="Rename"/>
<menu_item_call label="Copy Asset UUID" name="Copy Asset UUID"/>
<menu_item_call label="Copiar" name="Copy"/>
<menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Colar como link" name="Paste As Link"/>
<menu_item_call label="Apagar" name="Delete"/>
<menu_item_call label="Remover os itens" name="Take Off Items"/>
<menu_item_call label="Adicionar ao equipamento" name="Add To Outfit"/>
<menu_item_call label="Substituir equipamento" name="Replace Outfit"/>
<menu_item_call label="Iniciar conversa em conferência" name="Conference Chat Folder"/>
<menu_item_call label="Executar" name="Sound Play"/>
- <menu_item_call label="Sobre as Landmarks" name="Teleport To Landmark"/>
+ <menu_item_call label="Sobre o marco" name="About Landmark"/>
<menu_item_call label="Executar in World" name="Animation Play"/>
<menu_item_call label="Executar localmente" name="Animation Audition"/>
<menu_item_call label="Mandar Mensagem Instantânea" name="Send Instant Message"/>
@@ -54,8 +70,8 @@
<menu_item_call label="Iniciar conversa em conferência" name="Conference Chat"/>
<menu_item_call label="Ativar" name="Activate"/>
<menu_item_call label="Desativar" name="Deactivate"/>
+ <menu_item_call label="Salvar como" name="Save As"/>
<menu_item_call label="Retirar de você" name="Detach From Yourself"/>
- <menu_item_call label="Recuperar Última Posição" name="Restore to Last Position"/>
<menu_item_call label="Vestir" name="Object Wear"/>
<menu label="Anexar a" name="Attach To"/>
<menu label="Anexar ao HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
new file mode 100644
index 0000000000..d1bdcd3a8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova nota" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova silhueta" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8bae7afddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nova janela de inventário" name="new_window"/>
+ <menu_item_call label="Ordenar por nome" name="sort_by_name"/>
+ <menu_item_call label="Ordenar por mais recente" name="sort_by_recent"/>
+ <menu_item_call label="Mostrar filtros" name="show_filters"/>
+ <menu_item_call label="Restabelecer filtros" name="reset_filters"/>
+ <menu_item_call label="Fechar todas as pastas" name="close_folders"/>
+ <menu_item_call label="Esvaziar lixeira" name="empty_trash"/>
+ <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Salvar textura como" name="Save Texture As"/>
+ <menu_item_call label="Encontrar original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos os links" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_land.xml b/indra/newview/skins/default/xui/pt/menu_land.xml
new file mode 100644
index 0000000000..9182ce321a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Sobre terrenos" name="Place Information..."/>
+ <menu_item_call label="Sentar aqui" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar passe" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Editar a topografia" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_landmark.xml b/indra/newview/skins/default/xui/pt/menu_landmark.xml
new file mode 100644
index 0000000000..6accfebee7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar SLurl" name="copy"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index 7ec324cb3f..3dd5d2c152 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -1,13 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Arquivo" name="File">
+ <menu label="Eu" name="File">
+ <menu_item_call label="Preferências" name="Preferences..."/>
<menu_item_call label="Sair" name="Quit"/>
</menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Preferências..." name="Preferences..."/>
- </menu>
<menu label="Ajuda" name="Help">
<menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Sobre o [APP_NAME]..." name="About Second Life..."/>
+ </menu>
+ <menu label="Depurar" name="Debug">
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Desfazer" name="Undo"/>
+ <menu_item_call label="Repetir" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Replicar" name="Duplicate"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desfazer seleção" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Mostrar configurações" name="Debug Settings"/>
+ <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/>
+ <menu_item_call label="Mostrar bandeja lateral" name="Show Side Tray"/>
+ <menu label="Testes de UI" name="UI Tests"/>
+ <menu_item_call label="Mostrar TOS" name="TOS"/>
+ <menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
+ <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/menu_mini_map.xml b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
index 1293f4e17f..f7b86b8f22 100644
--- a/indra/newview/skins/default/xui/pt/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom Perto" name="Zoom Close"/>
<menu_item_call label="Zoom Médio" name="Zoom Medium"/>
<menu_item_call label="Zoom Longe" name="Zoom Far"/>
+ <menu_item_check label="Girar mapa" name="Rotate Map"/>
<menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/>
- <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Mapa-múndi" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_navbar.xml b/indra/newview/skins/default/xui/pt/menu_navbar.xml
new file mode 100644
index 0000000000..57c1471de3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
+ <menu_item_call label="Marco" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml
new file mode 100644
index 0000000000..f1ea83c837
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/>
+ <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/>
+ <menu_item_check label="Mostrar ícones de amigos" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar nomes" name="show_names"/>
+ <menu_item_check label="Mostrar ícones e nomes" name="show_icons_and_names"/>
+ <menu_item_call label="Tamanho da fonte" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml
new file mode 100644
index 0000000000..658f44d692
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_object.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentar aqui" name="Object Sit"/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+ <context_menu label="Colocar no(a)" name="Put On">
+ <menu_item_call label="Vestir" name="Wear"/>
+ <context_menu label="Anexar &gt;" name="Object Attach"/>
+ <context_menu label="Anexar o HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Tirar &gt;" name="Remove">
+ <menu_item_call label="Pegar" name="Pie Object Take"/>
+ <menu_item_call label="Denunciar abuso" name="Report Abuse..."/>
+ <menu_item_call label="Bloquear" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
new file mode 100644
index 0000000000..7af760a6ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil do objeto..." name="Object Profile"/>
+ <menu_item_call label="Bloquear..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_participant_list.xml b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
new file mode 100644
index 0000000000..6db1fe7105
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/>
+ <menu_item_check label="Silenciar texto" name="MuteText"/>
+ <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/>
+ <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Silenciar os demais" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Desfazer silenciar dos demais" name="ModerateVoiceUnMuteOthers"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..25a37488d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por status" name="sort_status"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..86a9d2263f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/>
+ <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
new file mode 100644
index 0000000000..eb47f51ed0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..855e7c9920
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Adicionar amigo..." name="Add Friends"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..228ce46a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por distância" name="sort_distance"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..f3b89e01cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por mais recente" name="sort_most"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_picks.xml b/indra/newview/skins/default/xui/pt/menu_picks.xml
new file mode 100644
index 0000000000..8b9e10fc02
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teletransportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Excluir" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_picks_plus.xml b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml
new file mode 100644
index 0000000000..95a7c05262
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Adicionar" name="create_pick"/>
+ <menu_item_call label="Novo anúncio" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_place.xml b/indra/newview/skins/default/xui/pt/menu_place.xml
new file mode 100644
index 0000000000..282ea20a7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Criar marco" name="landmark"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Comprar passe" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_place_add_button.xml b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml
new file mode 100644
index 0000000000..d099d04f8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..2059a9ed2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expanda" name="expand"/>
+ <menu_item_call label="Recolher" name="collapse"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..52a9d13735
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar marco" name="copy_landmark"/>
+ <menu_item_call label="Copiar SLurl" name="copy_slurl"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+ <menu_item_call label="Criar destaque" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
new file mode 100644
index 0000000000..b3e09bc695
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartilhar" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_slurl.xml b/indra/newview/skins/default/xui/pt/menu_slurl.xml
index 67a4b51b61..6d4c84fc3c 100644
--- a/indra/newview/skins/default/xui/pt/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/pt/menu_slurl.xml
@@ -2,5 +2,5 @@
<menu name="Popup">
<menu_item_call label="Sobre a URL" name="about_url"/>
<menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/>
- <menu_item_call label="Mostrar no Mapa" name="show_on_map"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..f034509be8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/>
+ <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/>
+ <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..b4216b7ddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teletransportar" name="Teleport"/>
+ <menu_item_call label="Mais informações" name="More Information"/>
+ <menu_item_call label="Copiar para área de transferência" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..6a633cf74c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Fechar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_text_editor.xml b/indra/newview/skins/default/xui/pt/menu_text_editor.xml
new file mode 100644
index 0000000000..31c284c6ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml
new file mode 100644
index 0000000000..ba5e055124
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar perfil de residente" name="show_agent"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_group.xml b/indra/newview/skins/default/xui/pt/menu_url_group.xml
new file mode 100644
index 0000000000..5b67a69c9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações do grupo" name="show_group"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_http.xml b/indra/newview/skins/default/xui/pt/menu_url_http.xml
new file mode 100644
index 0000000000..e53a2572b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir página da web" name="url_open"/>
+ <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/>
+ <menu_item_call label="Abrir no navegador externo" name="url_open_external"/>
+ <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_inventory.xml b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml
new file mode 100644
index 0000000000..45c14355d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar item de inventário" name="show_item"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_map.xml b/indra/newview/skins/default/xui/pt/menu_url_map.xml
new file mode 100644
index 0000000000..ba114cccaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
new file mode 100644
index 0000000000..c197444181
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_parcel.xml b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml
new file mode 100644
index 0000000000..6cc668bfd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_slapp.xml b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml
new file mode 100644
index 0000000000..d0784149ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Executar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_slurl.xml b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml
new file mode 100644
index 0000000000..7216ccf0b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_teleport.xml b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml
new file mode 100644
index 0000000000..f007425646
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teletransportar para este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index c476ef0bbc..acadc952ca 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,211 +1,326 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="Arquivo" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] por arquivo)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Definir Permissões Padrão..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Fechar janela" name="Close Window"/>
- <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Salvar textura como..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Tirar Foto" name="Take Snapshot"/>
- <menu_item_call label="Salvar Foto no disco" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Sair" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Voltar" name="Undo"/>
- <menu_item_call label="Avançar" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Apagar" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Procurar..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Selecionar todos" name="Select All"/>
- <menu_item_call label="Retirar seleção" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplicar" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Anexar objeto" name="Attach Object"/>
- <menu label="Desanexar objeto" name="Detach Object"/>
- <menu label="Tirar a roupa" name="Take Off Clothing">
- <menu_item_call label="Camiseta" name="Shirt"/>
- <menu_item_call label="Calças" name="Pants"/>
- <menu_item_call label="Sapatos" name="Shoes"/>
- <menu_item_call label="Meias" name="Socks"/>
- <menu_item_call label="Blusa" name="Jacket"/>
- <menu_item_call label="Luvas" name="Gloves"/>
- <menu_item_call label="Anágua" name="Menu Undershirt"/>
- <menu_item_call label="Roupa de baixo" name="Menu Underpants"/>
- <menu_item_call label="saia" name="Skirt"/>
- <menu_item_call label="Toda a roupa" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gestos..." name="Gestures..."/>
- <menu_item_call label="Perfil..." name="Profile..."/>
- <menu_item_call label="Aparência..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amigos..." name="Friends..."/>
- <menu_item_call label="Grupos..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Preferências..." name="Preferences..."/>
+ <menu label="Eu" name="Me">
+ <menu_item_call label="Preferências" name="Preferences"/>
+ <menu_item_call label="Meu painel" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
+ </menu_item_call>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Meu perfil" name="Profile"/>
+ <menu_item_call label="Minha aparência" name="Appearance"/>
+ <menu_item_check label="Meu inventário" name="Inventory"/>
+ <menu_item_call label="Mostrar inventário na bandeja lateral" name="ShowSidetrayInventory"/>
+ <menu_item_call label="Meus gestos" name="Gestures"/>
+ <menu label="Meu status" name="Status">
+ <menu_item_call label="Ausente" name="Set Away"/>
+ <menu_item_call label="Ocupado" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Exibir" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Visão do mouse" name="Mouselook"/>
- <menu_item_check label="Construir" name="Build"/>
- <menu_item_check label="Câmera voadora pelo joystick" name="Joystick Flycam"/>
- <menu_item_call label="Resetar visão" name="Reset View"/>
- <menu_item_call label="Olhar para o último movimento" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Barra de ferramentas" name="Toolbar"/>
- <menu_item_check label="Conversa local" name="Chat History"/>
- <menu_item_check label="Comunicar" name="Instant Message"/>
- <menu_item_check label="Inventário" name="Inventory"/>
- <menu_item_check label="Falantes Ativos" name="Active Speakers"/>
- <menu_item_check label="Lista de residentes e objetos silenciados" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Controles de câmera" name="Camera Controls"/>
- <menu_item_check label="Controles de movimento" name="Movement Controls"/>
- <menu_item_check label="Mapa do mundo" name="World Map"/>
- <menu_item_check label="Mini-Mapa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
- <menu_item_check label="Linhas de propriedades" name="Property Lines"/>
- <menu_item_check label="Linhas de banimento" name="Banlines"/>
- <menu_item_check label="Donos de terrenos" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Dicas" name="Hover Tips">
- <menu_item_check label="Mostrar dicas" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Dicas de terreno" name="Land Tips"/>
- <menu_item_check label="Dicas de todos os objetos" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Luz para transparência" name="Highlight Transparent"/>
- <menu_item_check label="Balizas" name="beacons"/>
- <menu_item_check label="Esconder partículas" name="Hide Particles"/>
- <menu_item_check label="Mostrar anexo em HUD" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mais zoom" name="Zoom In"/>
- <menu_item_call label="Zoom padrão" name="Zoom Default"/>
- <menu_item_call label="Menos zoom" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Tela cheia" name="Toggle Fullscreen"/>
- <menu_item_call label="Ajustar o tamanho da UI ao padrão" name="Set UI Size to Default"/>
+ <menu label="Comunicar" name="Communicate">
+ <menu_item_call label="Meus amigos" name="My Friends"/>
+ <menu_item_call label="Meus grupos" name="My Groups"/>
+ <menu_item_check label="Bate-papo local" name="Nearby Chat"/>
+ <menu_item_call label="Pessoas por perto" name="Active Speakers"/>
+ <menu_item_check label="Mídia por perto" name="Nearby Media"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_call label="Conversa" name="Chat"/>
- <menu_item_check label="Sempre Correr" name="Always Run"/>
- <menu_item_check label="Voar" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Criar Landmark aqui" name="Create Landmark Here"/>
- <menu_item_call label="Marcar como casa" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teletransportar para casa" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Deixar ausente" name="Set Away"/>
- <menu_item_call label="Deixar Ocupado" name="Set Busy"/>
- <menu_item_call label="Parar Animação do Meu Avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Liberar teclas" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Histórico de conta..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Gerenciar minha conta..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Meu terreno..." name="My Land..."/>
- <menu_item_call label="Sobre o terreno..." name="About Land..."/>
- <menu_item_call label="Comprar terreno..." name="Buy Land..."/>
- <menu_item_call label="Região/Propriedade..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Configurações de ambiente" name="Environment Settings">
+ <menu_item_check label="Movimentar" name="Movement Controls"/>
+ <menu_item_check label="Exibir" name="Camera Controls"/>
+ <menu_item_call label="Sobre terrenos" name="About Land"/>
+ <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
+ <menu_item_call label="Comprar terreno" name="Buy Land"/>
+ <menu_item_call label="Meus terrenos" name="My Land"/>
+ <menu label="Mostrar" name="Land">
+ <menu_item_check label="Limites" name="Ban Lines"/>
+ <menu_item_check label="Balizas" name="beacons"/>
+ <menu_item_check label="Limites do imóvel" name="Property Lines"/>
+ <menu_item_check label="Proprietários" name="Land Owners"/>
+ </menu>
+ <menu label="Marcos" name="Landmarks">
+ <menu_item_call label="Colocar marco aqui" name="Create Landmark Here"/>
+ <menu_item_call label="Definir como casa" name="Set Home to Here"/>
+ </menu>
+ <menu_item_call label="Início" name="Teleport Home"/>
+ <menu_item_check label="Mini Mapa" name="Mini-Map"/>
+ <menu_item_check label="Mapa-múndi" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanhecer" name="Sunrise"/>
<menu_item_call label="Meio-dia" name="Noon"/>
<menu_item_call label="Pôr-do-Sol" name="Sunset"/>
<menu_item_call label="Meia-noite" name="Midnight"/>
- <menu_item_call label="Reverter ao padrão da região" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Usar o horário deste lugar" name="Revert to Region Default"/>
<menu_item_call label="Editor de ambiente" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Ferramentas" name="Tools">
- <menu label="Selecionar ferramenta" name="Select Tool">
- <menu_item_call label="Foco" name="Focus"/>
- <menu_item_call label="Mover" name="Move"/>
- <menu_item_call label="Editar" name="Edit"/>
- <menu_item_call label="Criar" name="Create"/>
- <menu_item_call label="Terreno" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Selecionar apenas meus objetos" name="Select Only My Objects"/>
- <menu_item_check label="Selecionar apenas objetos móveis" name="Select Only Movable Objects"/>
- <menu_item_check label="Selecionar objetos pela vizinhança" name="Select By Surrounding"/>
- <menu_item_check label="Mostrar seleções escondidas" name="Show Hidden Selection"/>
- <menu_item_check label="Mostrar luz radiante para seleção" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostrar seleções de feixes" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Alinhar à grade" name="Snap to Grid"/>
- <menu_item_call label="Alinhar xy do objeto à grade" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usar seleção na grade" name="Use Selection for Grid"/>
- <menu_item_call label="Opções de grade..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Editar partes unidas" name="Edit Linked Parts"/>
- <menu_item_call label="Unir" name="Link"/>
- <menu_item_call label="Desunir" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Foco na seleção" name="Focus on Selection"/>
- <menu_item_call label="Zoom na Seleção" name="Zoom to Selection"/>
- <menu_item_call label="Comprar el objeto" name="Menu Object Take">
- <on_enable userdata="Comprar,Pegar" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Pegar cópia" name="Take Copy"/>
- <menu_item_call label="Salvar objeto de volta aos conteúdos do objeto" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Mostrar scripts defeituosos/Erros de janela" name="Show Script Warning/Error Window"/>
- <menu label="Recompilar os scripts na seleção" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Resetar scripts selecionados" name="Reset Scripts in Selection"/>
- <menu_item_call label="Ajustar scripts para rodar na seleção" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Ajustar scripts para não rodar na seleção" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Construir" name="BuildTools">
+ <menu_item_check label="Construir" name="Show Build Tools"/>
+ <menu label="Selecionar ferramenta de construção" name="Select Tool">
+ <menu_item_call label="Ferramenta enfoque" name="Focus"/>
+ <menu_item_call label="Ferramenta de movimentação" name="Move"/>
+ <menu_item_call label="Ferramenta de edição" name="Edit"/>
+ <menu_item_call label="Ferramenta criar" name="Create"/>
+ <menu_item_call label="Ferramenta de terrenos" name="Land"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Desfazer" name="Undo"/>
+ <menu_item_call label="Repetir" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Replicar" name="Duplicate"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desfazer seleção" name="Deselect"/>
+ </menu>
+ <menu_item_call label="Link" name="Link"/>
+ <menu_item_call label="Desconectar links" name="Unlink"/>
+ <menu_item_call label="Focus on Selection" name="Focus on Selection"/>
+ <menu_item_call label="Ampliar seleção" name="Zoom to Selection"/>
+ <menu label="Objeto:" name="Object">
+ <menu_item_call label="Comprar" name="Menu Object Take"/>
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompilar scripts (LSL)" name="Mono"/>
+ <menu_item_call label="Recompilar scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Reset Scripts" name="Reset Scripts"/>
+ <menu_item_call label="Scripts em modo execução" name="Set Scripts to Running"/>
+ <menu_item_call label="Scripts em modo não execução" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opções" name="Options">
+ <menu_item_check label="Edit Linked Parts" name="Edit Linked Parts"/>
+ <menu_item_call label="Set Default Upload Permissions" name="perm prefs"/>
+ <menu_item_check label="Mostrar permissões avançadas" name="DebugPermissions"/>
+ <menu label="Seleção" name="Selection">
+ <menu_item_check label="Só selecionar meus objetos" name="Select Only My Objects"/>
+ <menu_item_check label="Só selecionar meus objetos" name="Select Only Movable Objects"/>
+ <menu_item_check label="Selecionar contornando" name="Select By Surrounding"/>
+ </menu>
+ <menu label="Mostrar" name="Show">
+ <menu_item_check label="Mostrar seleção oculta" name="Show Hidden Selection"/>
+ <menu_item_check label="Show Light Radius for Selection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Show Selection Beam" name="Show Selection Beam"/>
+ </menu>
+ <menu label="Grade" name="Grid">
+ <menu_item_check label="Mostrar na grade" name="Snap to Grid"/>
+ <menu_item_call label="Snap Object XY to Grid" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Use Selection for Grid" name="Use Selection for Grid"/>
+ <menu_item_call label="Opções de grade" name="Grid Options"/>
+ </menu>
+ </menu>
+ <menu label="Selecionar partes conectadas" name="Select Linked Parts">
+ <menu_item_call label="Select Next Part" name="Select Next Part"/>
+ <menu_item_call label="Select Previous Part" name="Select Previous Part"/>
+ <menu_item_call label="Include Next Part" name="Include Next Part"/>
+ <menu_item_call label="Include Previous Part" name="Include Previous Part"/>
+ </menu>
</menu>
<menu label="Ajuda" name="Help">
- <menu_item_call label="Ajuda [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
<menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog oficial da Linden..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal de Scripts..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Reportar Abuso..." name="Report Abuse..."/>
- <menu_item_call label="Colisões, impulsos e batidas..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Medidor de Lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Reportando Bug" name="Bug Reporting">
- <menu_item_call label="Rastreador público de problemas..." name="Public Issue Tracker..."/>
- <menu_item_call label="Ajuda do rastreador público de problemas..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Reportando Bug 101..." name="Bug Reporing 101..."/>
- <menu_item_call label="Questões de Segurança..." name="Security Issues..."/>
- <menu_item_call label="Wiki de QA ..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Reportar Bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Sobre [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Denunciar abuso" name="Report Abuse"/>
+ <menu_item_call label="Relatar bug" name="Report Bug"/>
+ </menu>
+ <menu label="Avançado" name="Advanced">
+ <menu_item_check label="Status &apos;ausente&apos; em 30 minutos" name="Go Away/AFK When Idle"/>
+ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Recarregar texturas" name="Rebake Texture"/>
+ <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
+ <menu_item_check label="Limitar distância da seleção" name="Limit Select Distance"/>
+ <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto de alta resolução" name="HighResSnapshot"/>
+ <menu_item_check label="Compactar fotos para HD" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Compactar fotos para HD" name="CompressSnapshotsToDisk"/>
+ <menu label="Ferramentas de desempenho" name="Performance Tools">
+ <menu_item_call label="Lag Meter" name="Lag Meter"/>
+ <menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
+ <menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Realces e visibilidade" name="Highlighting and Visibility">
+ <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
+ <menu_item_check label="Hide Particles" name="Hide Particles"/>
+ <menu_item_check label="Ocultar seleções" name="Hide Selected"/>
+ <menu_item_check label="Realçar transparentes" name="Highlight Transparent"/>
+ <menu_item_check label="Mostrar anexos HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostrar retículo na vista subjetiva" name="ShowCrosshairs"/>
+ <menu_item_check label="Mostrar dicas de terreno" name="Land Tips"/>
+ </menu>
+ <menu label="Tipos de renderização" name="Rendering Types">
+ <menu_item_check label="Simples" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Ãrvore" name="Tree"/>
+ <menu_item_check label="Avatares" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Céu" name="Sky"/>
+ <menu_item_check label="Ãgua" name="Water"/>
+ <menu_item_check label="Chão" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Grama" name="Grass"/>
+ <menu_item_check label="Nuvens" name="Clouds"/>
+ <menu_item_check label="Particles" name="Particles"/>
+ <menu_item_check label="Elevação" name="Bump"/>
+ </menu>
+ <menu label="Recursos de renderização" name="Rendering Features">
+ <menu_item_check label="Interface" name="UI"/>
+ <menu_item_check label="Selecionado" name="Selected"/>
+ <menu_item_check label="Realçado" name="Highlighted"/>
+ <menu_item_check label="Texturas dinâmicas" name="Dynamic Textures"/>
+ <menu_item_check label="Foot Shadows" name="Foot Shadows"/>
+ <menu_item_check label="Fog" name="Fog"/>
+ <menu_item_check label="Flexible Objects" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Executar diversas instâncias" name="Run Multiple Threads"/>
+ <menu_item_call label="Limpar cache de grupo" name="ClearGroupCache"/>
+ <menu_item_check label="Mouse Smoothing" name="Mouse Smoothing"/>
+ <menu_item_check label="Mostrar MIs no bate-papo" name="IMInChat"/>
+ <menu label="Atalhos" name="Shortcuts">
+ <menu_item_check label="Busca" name="Search"/>
+ <menu_item_call label="Soltar objeto" name="Release Keys"/>
+ <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
+ <menu_item_check label="Correr sempre" name="Always Run"/>
+ <menu_item_check label="Voar" name="Fly"/>
+ <menu_item_call label="Fechar janela" name="Close Window"/>
+ <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
+ <menu_item_call label="Gravar fotos no HD" name="Snapshot to Disk"/>
+ <menu_item_call label="Visão subjetiva" name="Mouselook"/>
+ <menu_item_check label="Flycam Joystick" name="Joystick Flycam"/>
+ <menu_item_call label="Visão padrão" name="Reset View"/>
+ <menu_item_call label="Olhar para quem fala por último" name="Look at Last Chatter"/>
+ <menu label="Selecionar ferramenta de construção" name="Select Tool">
+ <menu_item_call label="Ferramenta enfoque" name="Focus"/>
+ <menu_item_call label="Ferramenta de movimentação" name="Move"/>
+ <menu_item_call label="Ferramenta de edição" name="Edit"/>
+ <menu_item_call label="Ferramenta criar" name="Create"/>
+ <menu_item_call label="Ferramenta de terrenos" name="Land"/>
+ </menu>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Zoom padrão" name="Zoom Default"/>
+ <menu_item_call label="Menos zoom" name="Zoom Out"/>
+ <menu_item_call label="Alternar tela inteira" name="Toggle Fullscreen"/>
+ </menu>
+ <menu_item_call label="Mostrar configurações de depuração" name="Debug Settings"/>
+ <menu_item_check label="Show Develop Menu" name="Debug Mode"/>
+ </menu>
+ <menu label="Desenvolver" name="Develop">
+ <menu label="Painéis" name="Consoles">
+ <menu_item_check label="Painel de textura" name="Texture Console"/>
+ <menu_item_check label="Debug Console" name="Debug Console"/>
+ <menu_item_call label="Painel de avisos" name="Notifications"/>
+ <menu_item_check label="Painel de tamanho de textura" name="Texture Size"/>
+ <menu_item_check label="Painel de texturas" name="Texture Category"/>
+ <menu_item_check label="Tempos" name="Fast Timers"/>
+ <menu_item_check label="Memória" name="Memory"/>
+ <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_check label="Câmera:" name="Camera"/>
+ <menu_item_check label="Vento" name="Wind"/>
+ </menu>
+ <menu label="Show Info" name="Display Info">
+ <menu_item_check label="Mostrar hora" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostrar mudanças a objetos" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Force LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Contornos" name="Wireframe"/>
+ <menu_item_check label="Global Illumination" name="Global Illumination"/>
+ <menu_item_check label="Texturas de animação" name="Animation Textures"/>
+ <menu_item_check label="Desativar texturas" name="Disable Textures"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Objetos iridescentes" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Network" name="Network">
+ <menu_item_check label="Pausar avatar" name="AgentPause"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Mundo" name="World">
+ <menu_item_check label="Impor sobre sol regional" name="Sim Sun Override"/>
+ <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
+ <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Interface" name="UI">
+ <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Memory Stats" name="Memory Stats"/>
+ <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Recarregar cores" name="Reload Color Settings"/>
+ <menu_item_call label="Show Font Test" name="Show Font Test"/>
+ <menu_item_call label="Load from XML" name="Load from XML"/>
+ <menu_item_call label="Salvar para XML" name="Save to XML"/>
+ <menu_item_check label="Mostrar nomes XUI" name="Show XUI Names"/>
+ <menu_item_call label="Enviar MIs de teste" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Ãris" name="Iris"/>
+ <menu_item_call label="Cabeça" name="Head"/>
+ <menu_item_call label="Cintura acima" name="Upper Body"/>
+ <menu_item_call label="Cintura para baixo" name="Lower Body"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ </menu>
+ <menu label="Testes de personagem" name="Character Tests">
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_check label="Dados da animação" name="Animation Info"/>
+ <menu_item_check label="Mostrar animação de movimento" name="Slow Motion Animations"/>
+ <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ <menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="Texturas HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_check label="Mostrar menu admin" name="View Admin Options"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ </menu>
+ <menu label="Lote" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Conteúdo da Linden Lab" name="Set to Linden Content"/>
+ <menu_item_call label="Pedir terras públicas" name="Claim Public Land"/>
+ </menu>
+ <menu label="Região" name="Region">
+ <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/mime_types_linux.xml b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
new file mode 100644
index 0000000000..789843cbba
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Conteúdo web
+ </label>
+ <tooltip name="web_tooltip">
+ Este lugar possui conteúdo na web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar conteúdo na web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Filme
+ </label>
+ <tooltip name="movie_tooltip">
+ Aqui tem um vídeo para você assistir
+ </tooltip>
+ <playtip name="movie_playtip">
+ Mostrar vídeo
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagem
+ </label>
+ <tooltip name="image_tooltip">
+ Aqui tem uma imagem para você ver
+ </tooltip>
+ <playtip name="image_playtip">
+ Mostrar imagem
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ãudio
+ </label>
+ <tooltip name="audio_tooltip">
+ Aqui tem um clipe de áudio para você ouvir
+ </tooltip>
+ <playtip name="audio_playtip">
+ Tocar clipe
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Stream em tempo real
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ãudio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagem
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Vídeo (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ãudio/Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Arquivo PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Arquivo Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ãudio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ãudio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ãudio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ãudio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagem (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagem (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagem (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagem (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagem (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagem (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Vídeo (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Vídeo (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Vídeo (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Vídeo (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Vídeo (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Vídeo (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pt/mime_types_mac.xml b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
new file mode 100644
index 0000000000..34b40e94ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Conteúdo Web
+ </label>
+ <tooltip name="web_tooltip">
+ Esta localização tem conteúdo Web
+ </tooltip>
+ <playtip name="web_playtip">
+ Exibir conteúdo Web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Filme
+ </label>
+ <tooltip name="movie_tooltip">
+ Há um filme que vai passar aqui
+ </tooltip>
+ <playtip name="movie_playtip">
+ Começar filme
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagem
+ </label>
+ <tooltip name="image_tooltip">
+ Ha uma imagem nesta localização
+ </tooltip>
+ <playtip name="image_playtip">
+ Visualizar a imagem desta localização
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Há áudio nesta localização
+ </tooltip>
+ <playtip name="audio_playtip">
+ Tocar o áudio desta localização
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ãudio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagem
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Filme (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ãudio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Linguagem sincronizada de integração multimidia (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página Web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ãudio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ãudio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ãudio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ãudio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagem (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagem (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagem (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagem (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagem (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagem (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página Web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Filme (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Filme (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Filme (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Filme (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Filme (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Filme (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 0ee2c5cb84..57130fb5cd 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -9,74 +9,33 @@
<global name="implicitclosebutton">
Fechar
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Mensagem de Alerta Desconhecida" name="MissingAlert">
- Sua versão do [APP_NAME] não sabe como mostrar a mensagem de alerta que acabou de receber.
-
-Detalhes do erro: O alerta chamado &apos;[_NAME]&apos; não foi encontrado em notifications.xml.
+ <template name="okbutton">
+ <form>
+ <button name="OK" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore"/>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="Cancel" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore"/>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Notificação desconhecida" name="MissingAlert">
+ Esta versão do [APP_NAME] não consegue exibir o aviso recebido. Verifique se você possui a versão mais recente do Visualizador.
+
+Detalhes do erro: O aviso &apos;[_NAME]&apos; não foi localizado no arquivo notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -96,24 +55,18 @@ Detalhes do erro: O alerta chamado &apos;[_NAME]&apos; não foi encontrado em no
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
</notification>
<notification name="BadInstallation">
- Ocorreu um erro atualizando o [APP_NAME]. Por favor, faça o download da última versão em secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Um erro ocorreu ao atualizar o [APP_NAME]. [http://get.secondlife.com Baixe a versão atual] do Visualizador.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Erro de Rede: Não conseguiu estabelecer uma conexão.
+ Falha de conexão com o [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Por favor, verifique sua conexão de rede.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Verifique se a conexão à internet está funcionando.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
Modelo de Mensagem [PATH] não encontrado.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
Salvar modificações?
@@ -177,7 +130,7 @@ Você deseja permitir que os residentes selecionados tenham direito de edição?
Membros não podem ser removidos dessa função.
Os membros podem, eles próprios, recusar a função.
Deseja continuar?
- <usetemplate ignoretext="Quando adicionar membro ao grupo como dono" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Confirmar antes de adicionar novo Proprietário do grupo" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="AssignDangerousActionWarning">
Você está prestes a adicionar a habilidade &apos;[ACTION_NAME]&apos; para a função &apos;[ROLE_NAME]&apos;
@@ -197,58 +150,8 @@ Qualquer membro numa função com esta habilidade, pode atribuir a sí mesmo --
Adicionar esta habilidade a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Selecionando &quot;Publicar na Busca&quot;
-Clicando neste Box, será mostrado:
-- este lote nos resultados de busca
-- os objetos públicos deste lote
-- este lote na busca da web
- </notification>
- <notification name="ClickSoundHelpLand">
- Mídia e Música podem apenas ser utilizadas dentro deste lote. As opções de Som e Voz podem ser restritas ao lote ou serão ouvidas por residentes fora do lote, dependendo de suas Classificações de maturidade. Ir para o Banco de Conhecimento para saber mais sobre como definir essas opções?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Os resultados de busca são organizados com base na aba em que você se encontra, sua Classificação de maturidade, a categoria escolhida e outros fatores. Para mais detalhes, por favor veja o Banco de Conhecimento.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Você não pode fazer este lote visível na busca porque ele está localizado numa região que proíbe isso.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Selecionando &quot;Mostrar na Busca&quot; será mostrado:
-- meu perfil nos resultados de busca
-- um link para meu perfil nas páginas de grupos públicos
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Você pode propor a outro Residente ou dissolver uma parceria existente através do website [SECOND_LIFE].
-
-Ir para o site do [SECOND_LIFE] para mais informações sobre parceria?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a Página"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Suas permissões padrão podem não funcionar em regiões antigas.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Se este Residente definiu uma URL de perfil na web, então você pode:
- * Clicar em &apos;Carregar&apos; para ver a página na aba Web.
- * Clicar Carregar &gt; &apos;Em navegador externo&apos; para ver a página no seu navegador de web padrão.
- * Clicar Carregar &gt; &apos;URL de Casa&apos; para voltar ao perfil do Residente na web se você navegou adiante.
-
-Quando você está vendo seu próprio perfil, você pode entrar com qualquer URL como sendo seu perfil na web e clicar OK para definí-la.
-Outros residentes podem visitar a URL que você definiu, quando eles olharem seu perfil.
+ <notification name="ClickUnimplemented">
+ Infelizmente isso ainda não foi implementado.
</notification>
<notification name="JoinGroupCanAfford">
Unir-se a esse grupo custa L$[COST].
@@ -259,6 +162,12 @@ Deseja prosseguir?
Associar-se a este grupo custa L$[COST].
Você não tem L$ suficientes para associar-se a este grupo.
</notification>
+ <notification name="CreateGroupCost">
+ Criar este grupo custa L$100.
+Grupos ser formados por mais de um membro, caso contrário serão definitivamente excluídos.
+Convite outros membros dentro de 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Criar grupo por L$100"/>
+ </notification>
<notification name="LandBuyPass">
Por L$[COST] você pode ingressar no terreno (&apos;[PARCEL_NAME]&apos;) por [TIME] horas. Comprar um passe de acesso?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -273,10 +182,10 @@ Seu preço de venda será L$[SALE_PRICE] e está autorizado para venda para [NA
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Continuar"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATENÇÃO: Ao clicar em &apos;vender para qualquer um&apos; torna a sua terra disponível para toda a comunidade [SECOND_LIFE], mesmo aqueles que não estão nesta região.
+ ATENÇÃO: Clicar em &apos;vender a qualquer um&apos; torna o terreno disponível para toda a comunidade do [SECOND_LIFE], inclusive residentes de outras regiões.
-A área de [LAND_SIZE] m² de terra selecionada está posta para venda.
-Seu preço de venda será L$ [SALE_PRICE] e está autorizado para [NAME].
+O terreno selecionado, de [LAND_SIZE] m², está sendo reservado para venda.
+O preço será L$[SALE_PRICE] e [NAME] pode comprar o terreno.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -335,6 +244,12 @@ Objetos: [N]
Toda esta região possui dano habilitado.
Scripts devem ser permitidos para fazer as armas funcionarem.
</notification>
+ <notification name="MultipleFacesSelected">
+ Diversas faces foram selecionadas.
+Se você optar por prosseguir, diversas ocorrências a mídia serão colocadas nas diferentes faces do objeto.
+Para colocar a mídia em só uma face, selecione Selecionar face e clique na face desejada do objeto. Depois clique em Adicionar.
+ <usetemplate ignoretext="A mídia será colocada nas diferentes faces selecionadas." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Você deve permanecer dentro do lote para definir o ponto de aterrissagem.
</notification>
@@ -369,6 +284,10 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
<notification name="CannotWearTrash">
Não é possível usar roupas ou partes do corpo que estão no lixo.
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Não foi possível anexar o objeto.
+Ele ultrapassa o limite de anexos, de [MAX_ATTACHMENTS] objetos. Remova um objeto para poder anexar outro.
+ </notification>
<notification name="CannotWearInfoNotComplete">
Você não pode vestir este item porque ele ainda não carregou. Por favor, tente novamente em um minuto.
</notification>
@@ -377,20 +296,28 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
Você precisa entrar com ambos os Nome e Sobrenome do seu avatar.
Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/>
</notification>
<notification name="AddClassified">
- Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no www.secondlife.com por uma semana.
-Preencha seu anúncio e então clique &apos;Publicar...&apos; para adicioná-lo ao diretório.
-Será solicitado a você um preço a ser pago, quando você clicar Publicar.
-Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave.
- <usetemplate ignoretext="Quando adicionando um Classificado novo" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Os anúncios serão publicados na seção &apos;Classificados&apos; das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana.
+Escreva seu anúncio e clique em &apos;Publicar...&apos;
+Depois, decida quanto deseja pagar pelo anúncio.
+Quanto mais você pagar, mais alto será o posicionamento do seu anúncio nos classficados e nos resultados de busca das suas palavras-chave.
+ <usetemplate ignoretext="Como colocar um anúncio" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Apagar classificado&apos;[NAME]&apos;?
Não há reembolso por taxas já pagas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/>
</notification>
+ <notification name="DeleteMedia">
+ Você optor por excluir a mídia associada a esta face.
+Tem certeza de que quer prosseguir?
+ <usetemplate ignoretext="Confirmar antes de apagar mídia de objetos" name="okcancelignore" notext="Não" yestext="Sim"/>
+ </notification>
<notification name="ClassifiedSave">
Salvar as mudanças no classificado [NAME]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar"/>
@@ -401,6 +328,9 @@ Não há reembolso por taxas já pagas.
</notification>
<notification name="PromptGoToEventsPage">
Ir até a página web de enventos [SECOND_LIFE] ?
+ <url name="url">
+ http://secondlife.com/events/?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/>
</notification>
<notification name="SelectProposalToView">
@@ -418,17 +348,17 @@ Não há reembolso por taxas já pagas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="CacheWillClear">
- O cache será limpo quando você reiniciar [APP_NAME].
+ O cache será limpo quando o [APP_NAME] for iniciado.
</notification>
<notification name="CacheWillBeMoved">
- O Cache será removido após reiniciar [APP_NAME].
-Nota: Isto limpará o cache.
+ O cache será limpo quando o [APP_NAME] for iniciado.
+Nota: Este procedimento limpa o cache.
</notification>
<notification name="ChangeConnectionPort">
- Configuração de porta terá efeito após reiniciar [APP_NAME].
+ Reinicie o [APP_NAME] para ativar a reconfiguração da porta.
</notification>
<notification name="ChangeSkin">
- A nova pele será exibida após reiniciar [APP_NAME].
+ Reinicie o [APP_NAME] para ativar a pele nova.
</notification>
<notification name="GoToAuctionPage">
Ir para a página do [SECOND_LIFE] para ver os detalhes do leilão ou fazer um lance?
@@ -476,6 +406,11 @@ O objeto pode estar fora de alcance ou ter sido deletado.
<notification name="SaveBytecodeFailReason">
Houve um problema em salvar uma compilação de script devido a seguinte razão: [REASON]. Por favor, tente salvar novamente o script mais tarde.
</notification>
+ <notification name="StartRegionEmpty">
+ Oops, você ainda não definiu sua região de partida.
+Digite o nome da região na caixa &apos;Ponto de partida&apos; ou selecione &apos;Última localização&apos; ou &apos;Minha casa&apos; como ponto de partida.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Não foi possível iniciar ou parar o script pois o objeto em que ele está não pôde ser encontrado.
O objeto pode estar fora de alcance ou ter sido deletado.
@@ -492,24 +427,23 @@ O objeto pode estar fora de alcance ou ter sido deletado.
MINSPECS
Você deseja visitar [_URL] para maiores informações?
<url name="url" option="0">
- http://www.secondlife.com/corporate/sysreqs.php
+ http://secondlife.com/support/sysreqs.php?lang=pt
</url>
- <usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="O hardware do meu computador não é suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="UnknownGPU">
- Seu sistema possui uma placa gráfica que nos é desconhecido neste momento.
-Este é normalmente o caso de um novo hardware que nós não tivemos a chance de testar. [APP_NAME] vai muito provavelmente executar corretamente, mas talvez seja necessário ajustar suas configurações de gráficos para algo mais apropriado.
-(Menu Editar &gt; Preferências &gt; Gráficos).
+ O [APP_NAME] não consegue reconhecer a placa de vídeo do seu computador.
+Isto acontece quando novos hardwares que ainda não foram testados no [APP_NAME]. O [APP_NAME] provavelmente vai funcionar com sua placa de vídeo, mas talvez seja necessário checar as configurações de vídeo.
+( Eu &gt; Preferências &gt; Vídeo)
<form name="form">
- <ignore name="ignore" text="Ao detectar uma placa de vídeo desconhecida"/>
+ <ignore name="ignore" text="Minha placa de vídeo não foi reconhecida."/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] travou quando inicializava os drivers gráficos.
-A Qualidade Gráfica será ajustada para baixa, para evitar alguns erros comuns de drivers.
-Isto irá desabilitar alguns atributos gráficos.
-Nós recomendamos a atualização dos drivers de sua placa gráfica.
-A Qualidade Gráfica pode ser aumentada no Preferências &gt; Gráficos.
+ O [APP_NAME] sofreu uma pane ao iniciar os drivers de vídeo.
+A Qualidade do vídeo será definida como baixa para evitar os erros de driver mais comuns. Assim, alguns recursos de vídeo serão desativados.
+Tente atualizar o driver da sua placa de vídeo.
+Para aumentar a qualidade do vídeo, vá para Preferências &gt; Vídeo.
</notification>
<notification name="RegionNoTerraforming">
A região [REGION] não permite ser aplainada.
@@ -560,6 +494,9 @@ Ele ou ela vai ficar temporariamente incapaz de se mover, usar o bate-papo ou in
Ejetar [AVATAR_NAME] da sua terra?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ejetar"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Você ejetou [AVATAR_NAME] do grupo [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
Erro de aquisição: Muitos objetos selecionados.
</notification>
@@ -570,7 +507,10 @@ Por favor, mova todos os objetos a serem adquiridos para uma mesma região.
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-Vá para [_URL] para informação sobre compra de L$.
+Para mais informações sobre como comprar L$, consulte [_URL].
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -656,12 +596,15 @@ Esperada [VALIDS]
Incapaz de criar arquivo de saída: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Atualmente, não suportamos o envio de arquivos de animação em massa.
+ O [APP_NAME] ainda não faz o upload de vários arquivos de animação de uma vez.
</notification>
<notification name="CannotUploadReason">
Incapaz de carregar [FILE] devido ao seguinte motivo: [REASON]
Por favor tente novamente mais tarde.
</notification>
+ <notification name="LandmarkCreated">
+ Você adicionou &quot;[LANDMARK_NAME]&quot; a sua pasta [FOLDER_NAME].
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Você não pode criar um ponto de referência porque o proprietário do terreno não permite. Tente novamente a alguns metros de distância.
</notification>
@@ -684,6 +627,9 @@ Selecione objetos com scripts.
Selecione objetos com scripts que você tem permissão para modificar.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Impossível abrir script em objeto sem ter autorização para modificar.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
Impossibilitado de definir quaisquer scripts para &apos;rodando&apos;.
@@ -709,46 +655,44 @@ Pesquisava por: [FINALQUERY]
Não é possível teletransportar-se.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
- </notification>
- <notification name="nolandmark_tport">
-Desculpe, mas o sistema não conseguiu localizar a landmark de destino.
- </notification>
- <notification name="timeout_tport">
-Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
- </notification>
- <notification name="noaccess_tport">
-Desculpe, você não tem acesso ao destino deste teletransporte.
- </notification>
- <notification name="missing_attach_tport">
-Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.
- </notification>
- <notification name="too_many_uploads_tport">
-Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.
- </notification>
- <notification name="expired_tport">
-Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.
- </notification>
- <notification name="expired_region_handoff">
-Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.
- </notification>
- <notification name="no_host">
-Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.
- </notification>
- <notification name="no_inventory_host">
-O sistema de inventário está indisponível no momento.
- </notification>
-
+ <notification name="invalid_tport">
+ Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
+Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
+Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Desculpe, mas o sistema não conseguiu localizar a landmark de destino.
+ </notification>
+ <notification name="timeout_tport">
+ Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
+ </notification>
+ <notification name="noaccess_tport">
+ Desculpe, você não tem acesso ao destino deste teletransporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </notification>
+ <notification name="no_host">
+ Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ O sistema de inventário está indisponível no momento.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
Incapaz de estabelecer o proprietário do terreno:
Nenhum lote selecionado.
@@ -785,7 +729,7 @@ Nenhum lote selecionado.
Não é possível achar a região em que este terreno se encontra.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Você não pode fechar a janela de Compra de Terreno até que o [APP_NAME] calcule o preço desta transação.
+ A janela Comprar terreno poderá ser fechada quando o [APP_NAME] determinar o preço da transação.
</notification>
<notification name="CannotDeedLandNothingSelected">
Não é possível transferir posse do terreno:
@@ -796,8 +740,8 @@ Nenhum lote selecionado.
Nenhum grupo selecionado.
</notification>
<notification name="CannotDeedLandNoRegion">
- Não é possível transferir posse do terreno:
-Não é possível se achar a região em que este terreno se encontra.
+ Houve um problema ao processar a doação do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotDeedLandMultipleSelected">
Impossibilitado de passar a propriedade da terra:
@@ -806,11 +750,11 @@ Selecionados vários lotes.
Tente selecionar um único lote.
</notification>
<notification name="ParcelCanPlayMedia">
- Esta localidade pode executar fluxo de mídia.
-Fluxo de mídia necessita de uma conexão de Internet rápida.
+ Há mídia em stream disponível aqui.
+O streaming requer uma conexão rápida.
-Executar fluxo de mídia quando disponível?
-(Você pode mudar esta opção mais tarde no Preferências &gt; Ãudio &amp; Vídeo.)
+Executar as mídias em stream detectadas?
+(Esta opção pode ser modificada sob Preferências &gt; Privacidade.)
<usetemplate name="okcancelbuttons" notext="Desabilitar" yestext="Exibir Mídia"/>
</notification>
<notification name="CannotDeedLandWaitingForServer">
@@ -841,8 +785,8 @@ Você não tem permissão de liberar este lote.
Os lotes que você possui estão em verde.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Impossibilitado de abandonar a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar o abandono do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotReleaseLandNoTransfer">
Não é possível abandonar terreno:
@@ -879,12 +823,12 @@ Quer dividir o terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Dividir"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Impossibilitado de dividir a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar a divisão do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotJoinLandNoRegion">
- Impossibilitado de unir a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar a junção dos terrenos:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotJoinLandNothingSelected">
Não é possível unir terreno:
@@ -909,17 +853,6 @@ Você vai ter que redefinir nome e as opções do novo lote.
Unir a terra?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir"/>
</notification>
- <notification name="ShowOwnersHelp">
- Mostrar donos:
-Colorir os lotes para mostrar o tipo de dono.
-
-Green = Sua terra
-Aqua = Terra do seu Grupo
-Red = Possuída por outros
-Yellow = À venda
-Purple = A leilão
-Grey = Pública
- </notification>
<notification name="ConfirmNotecardSave">
Esta nota precisa ser salva antes do item ser copiado ou visualizado. Salvar nota?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Salvar"/>
@@ -941,13 +874,13 @@ Grey = Pública
Não é possível salvar &apos;[NAME]&apos; para um arquivo de vestimenta. Você precisa liberar algum espaço no seu computador e salvar o arquivo novamente.
</notification>
<notification name="CannotSaveToAssetStore">
- Impossibilitado de salvar [NAME] no armazenamento central de ativos.
-Isso é geralmente uma falha temporária. Por favor personalize e salve novamente a vestimenta em poucos minutos.
+ Ocorreu um problema ao salvar [NAME].
+Em geral, essa é uma falha técnica temporária. Personalize e volte a salvar o item novamente dentro de alguns minutos.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Você foi deslogado do [SECOND_LIFE]:
+ Você saiu do [SECOND_LIFE]:
[MESSAGE]
-Você ainda pode olhar o bate-papo e as mensagens instantâneas existentes, clicando em &apos;Exibir IM &amp; bate-papo&apos;. Caso contrário, clique em &apos;Sair&apos; para sair do [APP_NAME] imediatamente.
+Ainda é possível ler suas MIs e o bate-papo. Para isso, clique &apos;Ver MIs e bate-papo&apos;. Ou clique em &apos;Sair&apos; para sair do [APP_NAME] completamente.
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Exibir IM &amp; bate-papo"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -1099,29 +1032,40 @@ Transferir propriedade destes [AREA] m² de terreno para o grupo &apos;[GROUP_NA
<notification name="ErrorMessage">
[ERROR_MESSAGE]
</notification>
- <notification name="AvatarMoved">
- Sua [TYPE] localização não está disponível no momento.
- [HELP]
-Você foi movido para uma região vizinha.
+ <notification name="AvatarMovedDesired">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
+Pense em usar outra região como casa.
</notification>
<notification name="ClothingLoading">
- Sua vestimenta ainda está baixando.
-Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretamente.
+ As suas roupas estão sendo transferidas.
+Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido corretamente.
<form name="form">
- <ignore name="ignore" text="Quando o vestuário está levando muito tempo para fazer download"/>
+ <ignore name="ignore" text="A roupa está demorando para chegar"/>
</form>
</notification>
<notification name="FirstRun">
- A instalação do [APP_NAME] está completa.
+ A instalação do [APP_NAME] está pronta.
-Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar.
-Retornar a www.secondlife.com para criar uma nova conta?
+Se você ainda não conhece o [SECOND_LIFE], basta criar uma conta para começar.
+Voltar para [http://join.secondlife.com secondlife.com] para criar sua conta?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE].
+ Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [SECOND_LIFE_GRID].
-Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa.
+Cheque sua conexão e tente em alguns minutos, clique na Ajuda para acessar o [SUPPORT_SITE], ou tente voltar para casa clicando em &apos;Teletransportar&apos;.
+ <url name="url">
+ http://br.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Ajuda"/>
@@ -1140,10 +1084,10 @@ Por favor, escolha se o seu avatar é feminino ou masculino. Você pode mudar de
[NAME] L$ [PRICE] Você não possui suficientes L$ para fazer isso.
</notification>
<notification name="GrantedModifyRights">
- Foi garantido à você o privilégio de alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]&apos;
+ [NAME] autorizou você a editar seus objetos.
</notification>
<notification name="RevokedModifyRights">
- Seu privilégio para alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]&apos;s foi removido.
+ Seu direito de modificar objetos do/da [NAME] foi revogado
</notification>
<notification name="FlushMapVisibilityCaches">
Isto irá descarregar os caches de mapa relativos a esta região.
@@ -1220,94 +1164,107 @@ Por favor, ponha o objeto à venda e tente novamente.
[DOWNLOAD_PATH]
</notification>
<notification name="DownloadWindowsMandatory">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Você deve baixar essa atualização para utilizar o [APP_NAME].
+Baixe a atualização para usar o [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/>
</notification>
<notification name="DownloadWindows">
- Uma versão atualizada do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- Uma versão atualizada do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Baixe a atualização para usar o [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Sair" yestext="Baixar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/>
+ </notification>
<notification name="DownloadMacMandatory">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Você deve baixar esta atualização para utilizar o [APP_NAME].
+Baixe a atualização para usar o [APP_NAME].
-Baixar para sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/>
</notification>
<notification name="DownloadMac">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
-Baixar para a sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- Uma nova versão do [APP_NAME] está disponível.
-
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
-Baixar para sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DeedObjectToGroup">
Delegar este objeto causará ao grupo:
* Receber os L$ pagos ao objeto
- <usetemplate ignoretext="Ao transferir objetos aos grupos" name="okcancelignore" notext="Cancelar" yestext="Acionar"/>
+ <usetemplate ignoretext="Confirmar doações de um objeto a um grupo antes de fazer a doação" name="okcancelignore" notext="Cancelar" yestext="Acionar"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Abrir o navegador do seu sistema para ver este conteúdo?
- <usetemplate ignoretext="Ao abrir o navegador web do seu sistema para visualizar uma página Web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Abrir uma janela do navegador para ver essas informações?
+ <usetemplate ignoretext="Abrir o navegador para acessar uma página na web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- Ir ao www.secondlife.com para gerenciar sua conta?
- <usetemplate ignoretext="Ao abrir o navegador web para gerenciar sua conta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Deseja abrir o [http://secondlife.com/account/ Painel] para gerenciar sua conta?
+ <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Visite a Wiki do [SECOND_LIFE] para detalhes de como Reportar um Problema de Segurança.
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar a Wiki de Problemas de Segurança" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir o navegador para ver como denunciar uma ocorrência" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Visite o Wiki de QA do [SECOND_LIFE].
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar a Wiki de QA" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir meu navegador para ver a página Wiki" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Visite o Rastreador Público de Problemas do [SECOND_LIFE], onde você poderá reportar Bugs e outros Problemas.
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Visite a Wiki [SECOND_LIFE] para informações sobre como utilizar o Rastrador de Público de Problemas.
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar a wiki do Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ <usetemplate ignoretext="Abrir o navegador para usar o Monitor de problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/>
</notification>
<notification name="WebLaunchSupportWiki">
Ir até o Blog Oficial da Linden buscar pelas últimas notícias e informações.
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/>
+ <usetemplate ignoretext="Abrir meu navegador para ler o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Ir para a página guia do LSL para ajuda com script?
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Guia de Scripts." name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ Abrir o Guia de scripts para obter ajuda?
+ <usetemplate ignoretext="Abrir meu navegador para usar o Guia de scripts" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Ir para o portal LSL para ajuda com script?
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o Portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ Consultar o LSL Portal para obter ajuda com scripts?
+ <usetemplate ignoretext="Abrir meu navegador para consultar o LSL Portal" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="ReturnToOwner">
Você tem certeza que deseja retornar os objetos selecionados para seus proprietários? Objetos transferíveis doados irão retornar aos proprietários anteriores.
*AVISO* Objetos doados não – transferíveis serão deletados!
- <usetemplate ignoretext="Ao retornar objetos a seus proprietários" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a seus donos" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Você é atualmente um membro do grupo [GROUP].
@@ -1319,14 +1276,14 @@ Deixar este grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar todos os usuários"/>
</notification>
<notification name="MuteLinden">
- Desculpe, você não pode silenciar um Linden.
+ Desculpe, nenhum Linden pode ser bloqueado.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
Você não pode começar um leilão com um lote que já foi colocado à venda. Desabilite a venda da terra se você tem certeza que deseja iniciar um leilão.
</notification>
- <notification label="Silenciar objeto pelo nome falhou" name="MuteByNameFailed">
- Você já silenciou este nome.
+ <notification label="Falha ao bloquear objeto por nome" name="MuteByNameFailed">
+ Você já bloqueou este residente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1342,13 +1299,13 @@ Deixar este grupo?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- Definido o Modo Ocupado.
-Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas irão receber a sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário irão para a sua Lixeira.
- <usetemplate ignoretext="Ao definir o Modo Ocupado" name="okignore" yestext="OK"/>
+ Modo ocupado ativado.
+O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário serão colocadas na Lixeira.
+ <usetemplate ignoretext="Passar meu status para o modo ocupado" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Você já pertence a muitos grupos para entrar em outro. Por favor, deixe pelo menos um grupo antes de entrar neste. Para sair de um grupo, selecione o Menu Editar e a opção Meus &apos;Grupos...&apos;
-[NAME] convidou você para entrar num grupo como membro.
+ Você atingiu o limite máximo de grupos. Saia de outro grupo para poder entrar nesse ou recuse o convite.
+[NAME] está te convidando para ser membro do grupo.
[INVITE]
<usetemplate name="okcancelbuttons" notext="Recusar" yestext="Entrar"/>
</notification>
@@ -1414,7 +1371,15 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</notification>
<notification name="TeleportFromLandmark">
Você tem certeza que quer se teletransportar?
- <usetemplate ignoretext="Ao se teletransportar a partir de uma Landmark no inventário" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para marcos" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teletransportar para [PICK]?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para Destaques" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teletransportar para [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado lugar do anúncio" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
</notification>
<notification label="Mensagem para todos na sua Propriedade" name="MessageEstate">
Digite um breve anúncio que será enviado para todos que estejam atualmente na sua propriedade.
@@ -1483,111 +1448,80 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
Você não é permitido na Região devido à sua Classificação de maturidade. Isto pode ser o resultado da falta de informação de validação de sua idade.
Por favor, verifique se você está com o último Visualizador instalado e vá ao Banco de Conhecimento para detalhes em como acessar áreas com esta classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Você não é permitido nesta região devido à sua Classificação de maturidade.
Ir para o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando a entrada na região está bloqueada devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não posso entrar nessa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Você não é permitido nesta região devido à sua Classificação de maturidade.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Você não é permitido nessa região devido à sua preferência de Classificação de maturidade.
-
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <form name="form">
- <button
- name="OK"
- text="Mudar Preferência"/>
- <button
- default="true"
- name="Cancel"
- text="Fechar"/>
- <ignore name="ignore" text="Quando a entrada na Região está bloqueada devido à preferência de Classificação de maturidade"/>
- </form>
+ Você não pode entrar nessa região devido à sua seleção de maturidade.
+
+Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu &gt; Preferências &gt; Geral.
+ <form name="form">
+ <button name="OK" text="Mudar preferência"/>
+ <button default="true" name="Cancel" text="Fechar"/>
+ <ignore name="ignore" text="Minha preferência de maturidade impede que eu vá a uma região"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
Você não pode reclamar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade.
Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
Você não pode reclamar esta terra devido à sua Classificação de maturidade.
Ir para a o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando reclamar a Terra está bloqueado devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não reivindicar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Você não pode reclamar esta terra devido à sua Classificação de maturidade.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- Você não pode reclamar esta terra devido à sua preferência de Classsificação de maturidade.
+ Você não pode reivindicar essa região devido à sua preferência de maturidade
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <usetemplate
- name="okcancelignore"
- yestext="Mudar Preferência"
- notext="Fechar"
- ignoretext="Quando reclamar a Terra está bloqueado devido à preferência de Classificação de maturidade"/>
+Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu &gt; Preferências &gt; Geral.
+ <usetemplate ignoretext="Minha preferência de conteúdo impede que eu reivindique terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/>
</notification>
<notification name="LandBuyAccessBlocked">
Você não pode comprar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade.
Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
Você não pode comprar esta terra devido à sua Classificação de maturidade.
Ir para o Banco de Conhecimento para maiores informações sobre Classificações de Maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando a compra de Terra está bloqueada devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não posso comprar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Você não pode comprar esta terra devido à sua Classificação de maturidade.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- Você não pode comprar esta terra devido à sua preferência de Classificação de maturidade.
+ Você não pode comprar esse terreno devido à sua preferência de maturidade
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <usetemplate
- name="okcancelignore"
- yestext="Mudar Preferência"
- notext="Fechar"
- ignoretext="Quando a compra de Terra está bloqueada devido à preferência de Classificação de maturidade"/>
+Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu &gt; Preferências &gt; Geral.
+ <usetemplate ignoretext="Minha preferência de conteúdo não me deixa comprar terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Muitos prims foram selecionados. Por favor, selecione [MAX_PRIM_COUNT] ou menos e tente novamente.&quot;
+ Muitos prims foram selecionados. Selecione [MAX_PRIM_COUNT] ou menos prims, e tente de novo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
@@ -1620,19 +1554,11 @@ Publicar este classificado agora por L$ [AMOUNT]?
</notification>
<notification name="SetClassifiedMature">
Este classificado contém conteúdo Mature?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="Não"
- yestext="Sim"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="SetGroupMature">
Este grupo contém conteúdo Mature?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="Não"
- yestext="Sim"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification label="Confirmar reiniciar" name="ConfirmRestart">
Você quer realmente reiniciar esta região em 2 minutos?
@@ -1646,217 +1572,12 @@ Publicar este classificado agora por L$ [AMOUNT]?
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="Bloquear Terraforma" name="HelpRegionBlockTerraform">
- Se esta opção for assinalada, donos de Terrenos não serão capazes de terraformar independentemente da configuração &apos;Editar Terreno&apos; de suas terras por lote.
-
-Padrão: desligado
- </notification>
- <notification label="Bloquear Vôo" name="HelpRegionBlockFly">
- Se esta caixa estiver marcada, as pessoas não poderão voar nesta região independente das configurações por lote de &apos;Voar&apos;.
-
-Padrão: desligado.
- </notification>
- <notification label="Mudança Conjunta das Permissões de Conteúdo" name="HelpBulkPermission">
- A ferramenta de Mudança Conjunta das Permissões lhe ajuda a mudar, rapidamente, as permissões de múltiplos itens que estão no conteúdo do(s) objeto(s) selecionado(s). Por favor observe que, no entanto, você está apenas definindo permissões para on itens que estão no conteúdo dos objetos selecionados -- não as permissões para o container dos próprios objetos.
-
-Também observe que as permissões não se aplicam aos conteúdos aninhados, contidos em quaisquer dos objetos. Sua solicitação opera apenas nos itens em exatamente um nível de profundidade.
-
-Você pode escolher seletivamente quais tipos de itens modificar, usando a lista de conferência aqui, abaixo de &apos;Tipos de Conteúdo&apos;. Quando você seleciona Texturas, as fotos são incluídas.
-
-* Esta ferramenta apenas mudará as permissões em itens que você pode mudar.
-* Você não pode dar ao Próximo dono, as permissões que você já não tem.
-* As permissões ao Próximo dono são meramente solicitações. Se um dos itens não puder assumir todas as novas permissões, nenhuma delas mudará.
-
-Quando você estiver pronto para mudar as permissões globais, clique &apos;Aplicar&apos; e aguarde os resultados na tela.
-
-Se você fechar a janela de Permissões Conjuntas enquanto elas estiverem sendo alteradas, a operação será suspensa.
- </notification>
- <notification label="Permitir Dano" name="HelpRegionAllowDamage">
- Marcar essa caixa habilita o sistema de vitalidade em todos os lotes independente das configurações individuais. Se esta caixa ficar desmarcada, os proprietários de lotes individuais ainda estarão aptos a ativar o sistema de vitalidade de seus lotes.
-
-Padrão: desligado.
- </notification>
- <notification label="Limite de Agentes" name="HelpRegionAgentLimit">
- Define o número máximo de residentes permitidos nesta região.
-Quanto mais residentes existirem em sua região, pior pode ser a performance.
-
-Padrão: 40
- </notification>
- <notification label="Bonus de Objetos" name="HelpRegionObjectBonus">
- O Bônus de objetos é um multiplicador para primitivas permitidas em qualquer lote. O intervalo permitido é de 1 a 10.
-Se fixado em &apos;1 &apos;, 512m² de cada lote permitem 117 objetos.
-Fixado em &apos;2 &apos;, 512m² cada lote permitem 234, ou o dobro, e assim por diante.
-O número máximo de objetos permitidos por região permanece 15000 não importa qual seja o Bônus de objeto. Uma vez estabelecido, esteja ciente de que a redução do Bônus de objetos pode retornar objetos ou apagá-los.
-
-Padrão: 1.0
- </notification>
- <notification label="Maturidade" name="HelpRegionMaturity">
- Define a Classificação de Maturidade da região, como mostrado na barra de menu, no topo de qualquer visualizador do Residente e nas dicas no Mapa-Mundi, quando o cursor passa sobre esta Região. Esta definição também afeta o acesso a esta Região e aos resultados de busca. Outros Residentes podem apenas entrar em Regiões ou ver resultados de busca com a mesma Classificação de maturidade que eles escolheram em suas preferências.
-
-Pode levar algum tempo até que esta mudança se reflita no mapa.
- </notification>
- <notification label="Restringir Empurrar" name="HelpRegionRestrictPushObject">
- Esta caixa de verificação Configura toda a região para permissões restritivas de empurrar.
-Quando habilitada, os agentes só podem empurrar a si mesmos ou serem empurrados pelo dono do lote.
-(Empurrar se refere à função LSL llPushObject().)
-
-Padrão: Desligado.
- </notification>
- <notification label="Unir/dividir lote" name="HelpParcelChanges">
- Configura se os lotes que não pertencem ao dono da propriedade podem ser unidos ou subdivididos.
-Se esta opção estiver desmarcada:
- * Apenas os donos ou gerentes de propriedades podem unir ou dividir lotes.
- * Eles podem unir ou subdividir lotes pertencentes ao dono ou ao grupo onde eles tem os poderes apropriados.
-Se esta opção estiver marcada:
- * Todos os donos de lotes podem unir ou subdividir os lotes que eles possuem.
- * Para lotes pertencentes a grupos, aqueles com os poderes apropriados podem unir ou subdividir lotes.
-
-Padrão: Marcado.
- </notification>
- <notification label="Não Mostrar na Pesquisa" name="HelpRegionSearch">
- Ao marcar esta caixa irá bloquear os donos de lotes de listar seus lotes na busca
-
-Padrão: desligado
- </notification>
<notification label="Modificar a maturidade da Região" name="RegionMaturityChange">
A classificação de maturidade para esta região foi atualizada.
Pode levar algum tempo para que a mudança seja refletida no mapa.
</notification>
- <notification label="Revenda de Terreno" name="HelpRegionLandResell">
- Os gerentes e os donos de propriedades podem vender qualquer terreno pertencente ao dono da propriedade.
-Se esta opção estiver desmarcada, os compradores não podem revender seus terrenos nesta região.
-Se esta opção estiver marcada, compradores podem vender seus terrenos nesta região.
-
-Padrão: Desabilitada.
- </notification>
- <notification label="Desabilitar Scripts" name="HelpRegionDisableScripts">
- Quando a performance do simulador está ruim, um script pode ser o culpado. Abra a Barra de Estatísticas (Ctrl+Shift+1). Olhe no Simulador de Física FPS. Se estiver abaixo de 45, então abra o painel &apos;Tempo&apos; localizado na parte de baixo da Barra de Estatísticas. Se o Tempo de Script indicar 25 ms ou mais, clique no botão &apos;Get Top CScripts&apos;. Será dado o nome e a localização do script que pode estar causando uma performance ruim. Marque a caixa &apos;Desabilitar Scripts&apos; e aperte o botão &apos;Aplicar&apos;. Isto temporariamente desabilitará todos os scripts nesta região. Uma vez que você chegar ao local, investigue o script para determinar se ele está causando o problema. Você pode querer entrar em contato com o proprietário do script, excluir ou devolver o objeto. Desmarque a caixa &apos;Desabilitar Script&apos; e então clique em &apos;Aplicar&apos; para reativar os scripts na região. Padrão: desligado.
- </notification>
- <notification label="Desabilitar Colisões" name="HelpRegionDisableCollisions">
- Quando a performance do simulador é pobre, os objetos físicos podem ser os culpados.Abra a a Barra de Estatísticas (Ctrl+Shift+1).
-Olhe a taxa de quadros por segundos (FPS) dos objetos físicos.
-
-Se ela estiver abaixo de 45, abra o painel de Tempo, localizado na parte inferior da Barra de Estatísticas. Se o Tempo (Físicos) do Simulador mostrar 20 ms ou mais, clique o botão &apos;Pegue os Maiores Colidentes&apos;. Será fornecido a você o nome e a localidade dos objetos físicos que podem estar causando uma performance pobre.
-Ativando a caixa Desabilitar Colisões e então pressionando o botão Aplicar, as colisões objeto-objeto serão temporariamente desabilitadas. Você pode precisar fazer isso para que possa viajar até a localidade onde observou um &apos;colidente-mor&apos;. Uma vez tendo chegado à localidade, investigue o objeto – ele está constantemente colidindo com outros objetos? Você pode desejar contatar o dono do objeto ou deletar ou retornar o objeto.
-Desative a caixa &apos;Desabilitar Colisões&apos; e então use &apos;Aplicar&apos; para reativar as colisões na região.
-
-Padrão: off
- </notification>
- <notification label="Desabilitar Física" name="HelpRegionDisablePhysics">
- Desabilitar Física é similar a desabilitar Colisões, com exceção de que todas as simulações físicas serão desabilitadas. Isto significa que não só os objetos pararão de colidir, mas também que os avatares não poderão se mover.
-
-Isto só deve ser usado quando Desabilitar Colisões não trouxer performance suficiente à região para investigar um problema de Física ou do &apos;Colidente-Mor&apos;.
-
-Esteja certo de reabilitar Física quando você terminar, ou os avatares não poderão se mover.
-
-Default: desligado
- </notification>
- <notification label="Principais Colidentes" name="HelpRegionTopColliders">
- Mostra uma lista de objetos com o maior número de potenciais colisões objeto-objeto. Estes objetos podem diminuir a performance do simulador.
-Selecione Ver &gt; Barra de Estatísticas e olhe em Simulador &gt; Tempo &gt; Tempo de Simulação (Física) para ver se mais de 20 ms são gastos em física.
- </notification>
- <notification label="Principais Scripts" name="HelpRegionTopScripts">
- Mostra uma lista dos objetos gastando mais tempo rodando scripts LSL. Estes objetos podem diminuir a performance do simulador.
-Selecione Ver &gt; Barra de Estatísticas e olhe em Simulador &gt; Tempo &gt; Tempo de Script para ver se mais de 25 ms são gastos em scripts.
- </notification>
- <notification label="Reiniciar Região" name="HelpRegionRestart">
- Reinicia o processo do servidor rodando esta região, após um aviso de dois minutos. Todos os residentes nesta região serão desconectados. A região salvará seus dados e deverá retornar em até 90 segundos.
-
-Reiniciar a região não consertará a maioria dos problemas de performance, e deveria ser utilizada somente quando solicitado.
- </notification>
- <notification label="Altura da água" name="HelpRegionWaterHeight">
- Esta é a altura em metros onde a água aparece. Caso este ajuste seja diferente de 20 e você tenha águas adjacentes ao limite do seu terreno ou águas continentais, haverá uma abertura visível.
-
-Padrão: 20
- </notification>
- <notification label="Limite do aumento" name="HelpRegionTerrainRaise">
- Esta é a distância em metros que os donos de lotes podem elevar o terreno, a partir da altura nivelada do terreno.
-
-Padrão: 4
- </notification>
- <notification label="Limite mais baixo" name="HelpRegionTerrainLower">
- Esta é a distância em metros que os donos de lotes podem abaixar o terreno, a partir da altura nivelada do terreno.
-
-Padrão: -4
- </notification>
- <notification label="Carregar terreno RAW" name="HelpRegionUploadRaw">
- Este botão faz upload de um arquivo .RAW para a região em que você está.
-O arquivo precisa conter as dimensões/número de canais corretos: RGB, 256x256 e 13 canais. A melhor forma de criar um arquivo da região é baixando o arquivo .RAW existente. Um bom primeiro passo seria modificar o primeiro canal (altura da região) e fazer o upload do arquivo.
-
-O upload pode levar certa de 45 segundos. Note que fazer upload do arquivo da região *não* moverá os objetos que estão na região, apenas o terreno e as permissões associadas a ele. Isso pode fazer com que alguns objetos fiquem debaixo da terra.
-
-Para mais informações sobre edição dos campos de altura da região, consulte a ajuda F1.
- </notification>
- <notification label="Baixar RAW de terreno" name="HelpRegionDownloadRaw">
- Este botão faz download de um arquivo contendo dados de altura do campo, dimensões do lote, status de lotes à venda e algumas permissões de lote para este terreno. Ao abrir o arquivo em programas como o Photoshop, você precisa especificar as dimensões do documento, que são: RGB, 256x256 com 13 canais. Este arquivo de terras não pode ser aberto de outra forma.
-
-Para mais informações sobre edição dos campos de altura da região, consulte a Ajuda F1.
- </notification>
- <notification label="Usar Sol da Propriedade" name="HelpRegionUseEstateSun">
- Esta caixa de opção faz com que a posição do sol nesta região seja a mesma que no resto da região.
-
-Padrão: ligada
- </notification>
- <notification label="Sol fixo" name="HelpRegionFixedSun">
- Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol.
-
-Padrão: desligada
- </notification>
- <notification label="Nivelar Terreno" name="HelpRegionBakeTerrain">
- Este botão salva a forma atual do terreno como o novo padrão para a região. Uma vez nivelado, o terreno pode reverter à forma que foi salva, sempre que você ou outros utilizarem a ferramenta &apos;Revert&apos; na edição de terreno. O terreno nivelado é também o ponto médio entre os limites de elevação e redução de terreno.
- </notification>
- <notification label="Gerentes da Propriedade" name="HelpEstateEstateManager">
- Um gerente da propriedade é um residente a quem você delegou o controle das configurações da região. Ele pode alterar qualquer configuração da região, com exceção de elevar, abaixar ou nivelar o terreno. Em particular, eles podem permitir ou banir residentes da sua propriedade. Gerentes da propriedade só podem ser adicionados ou removidos pelo dono da propriedade.
-
-Um gerente não pode adicionar ou remover outro gerente. Por favor, escolha somente residentes em quem você confia para serem gerentes da propriedade, pois você poderá ser responsabilizado pelas ações deles.
- </notification>
- <notification label="Usar hora Global" name="HelpEstateUseGlobalTime">
- Esta caixa de opção faz com que o Sol em sua propriedade siga a mesma posição do Sol nas propriedades da &apos;mainland&apos; do Linden Lab.
-
-Padrão: ligado
- </notification>
- <notification label="Sol fixo" name="HelpEstateFixedSun">
- Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol.
- </notification>
- <notification label="Acesso público" name="HelpEstateExternallyVisible">
- Esta caixa de verificação define se os Residentes que estão em outras propriedades podem entrar nesta, sem estar em uma lista de acesso.
-
-Padrão: on
- </notification>
- <notification label="Permitir Teletransporte direto" name="HelpEstateAllowDirectTeleport">
- Quando marcada, permite que os residentes se teletransportem diretamente para qualquer ponto da sua propriedade. Quando desmarcada, os residentes serão teleportados para o telehub mais próximo.
-
-Padrão: desmarcada
- </notification>
- <notification label="Permitir acesso" name="HelpEstateAllowResident">
- Acesso a esta propriedade estará limitado aos Residentes listados aqui e em quaisquer grupos abaixo.
-Esta definição está disponível apenas quando o Acesso Público estiver desmarcado.
- </notification>
- <notification label="Permitir acesso de grupo" name="HelpEstateAllowGroup">
- Acesso a esta propriedade estará limitado aos grupos listados aqui e a quaisquer Residentes acima.
-Esta definição está disponível apenas quando o Acesso Público estiver desmarcado.
- </notification>
- <notification label="Endereço de Email do Abuso" name="HelpEstateAbuseEmailAddress">
- Configurar isto para um endereço de email válido, fará com que relatos de abuso nesta propriedade sejam enviados para esse endereço.
-Definí-lo em branco fará com que os relatórios de abuso sejam enviados apenas para a Linden Lab.
- </notification>
- <notification label="Negar acesso" name="HelpEstateBanResident">
- Residentes desta lista estão proibidos de acessar a sua propriedade, independentemente de outras configurações.
- </notification>
- <notification label="Permitir Conversa por Voz" name="HelpEstateVoiceChat">
- Lotes nesta propriedade têm permissão para ter seus canais de voz próprios, nos quais os residentes podem ouvir e falar com os outros residentes próximos.
-
-Padrão: desligado
- </notification>
<notification label="Discordância de Versão de Voz" name="VoiceVersionMismatch">
- Esta versão do [APP_NAME] não é compatível com as características do Canal de Voz desta região. Para que a Conversa por Voz funcione corretamente, você precisará atualizar o [APP_NAME].
- </notification>
- <notification label="Corretor da Propriedade" name="HelpEstateCovenant">
- Definir um corretor da propriedade lhe permite vender lotes nesta propriedade. Se um corretor não for definido, você não pode vender terras. O cartão do seu corretor pode ficar vazio se você não desejar aplicar quaisquer regras ou avisar os compradores sobre qualquer coisa em relação ao lote antes da compra.
-
-Um corretor pode ser usado para comunicar regras, orientações, informações culturais ou simplesmente suas expectativas quanto ao futuro comprador. Isto pode incluir zoneamento, regulamentos para construções, opções de pagamento ou qualquer outra informação que você julgar importante que o novo proprietário veja e concorde antes da compra.
-
-O comprador precisa concordar com o corretor marcando a caixa de verificação antes de concluir a compra. Corretores são sempre visíveis na caixa de diálogo &apos;Sobre a Terra&apos; para todos os lotes que têm corretores definidos.
+ Esta versão do [APP_NAME] não é compatível com o recurso &apos;Bate-papo de voz&apos; desta região. Para o bate-papo de voz funcionar, atualize o [APP_NAME].
</notification>
<notification label="Impossível Comprar Objetos" name="BuyObjectOneOwner">
Não é possível comprar objetos de diferentes proprietários ao mesmo tempo.
@@ -1944,56 +1665,36 @@ Por favor, re-insira sua senha e clique &apos;Confirmar Compra&apos;.
Estes itens serão movidos para o seu inventário, não copiados.
Mover os itens do inventário?
- <usetemplate ignoretext="Quando estiver movendo inventário não copiável a partir de objetos." name="okcancelignore" notext="Não mover" yestext="Mover"/>
+ <usetemplate ignoretext="Avisar antes de eu pegar items &apos;cópia proibida&apos; de um objeto" name="okcancelignore" notext="Não mover" yestext="Mover"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Você selecionou itens de inventário não copiáveis.
Estes itens serão movidos para seu inventário, não copiados. Pelo fato de o objeto ter scripts, mover estes itens ao inventário pode provocar um mal funcionamento do script.
Mover para o inventário o(s) item(s)?
- <usetemplate ignoretext="Quando movendo objetos com scripts não copiáveis ao inventário" name="okcancelignore" notext="Não mover" yestext="Mover"/>
+ <usetemplate ignoretext="Avisar antes de eu pegar items &apos;cópia proibida&apos; que podem quebrar objetos com script" name="okcancelignore" notext="Não mover" yestext="Mover"/>
</notification>
<notification name="ClickActionNotPayable">
- Aviso: A ação de &apos;Pagar Objeto&apos; com clique foi definida, mas funcionará apenas se for adicionado um script com o evento money().
+ Aviso: O clique em &apos;Pagar por objeto&apos; foi processado, mas só pode funcionar se um script tiver um evento money().
<form name="form">
- <ignore name="ignore" text="Quando Definindo &apos;Pagar&apos; em objetos sem eventos money()"/>
+ <ignore name="ignore" text="Definir &apos;Pagar por objeto&apos; ao construir um objeto sem script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Não há itens neste objeto que você está autorizado a copiar.
</notification>
<notification name="WebLaunchAccountHistory">
- Ir para o site do [SECOND_LIFE] para visualizar o histórico de sua conta?
- <usetemplate ignoretext="Ao abrir a página web de histórico de conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Visitar o website de Suporte do [SECOND_LIFE]?
- <usetemplate ignoretext="Quando visitando o website de Suporte do [SECOND_LIFE]" name="okcancelignore" notext="Cancelar" yestext="Ir"/>
+ Deseja abrir o [http://secondlife.com/account/ Painel] para ver o histórico da sua conta?
+ <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="ConfirmQuit">
Tem certeza que deseja sair?
- <usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/>
+ <usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta ferramenta para reportar violações aos Termos de Serviço e aos Padrões da Comunidade. Veja:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em:
+ Use esta ferramenta para denunciar infrações dos [http://secondlife.com/corporate/tos.php Termos do Serviço] e das [http://secondlife.com/corporate/cs.php Normas da Comunidade].
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- IMPORTANTE: Esta reportagem irá para o dono da região em que você se encontra atualmente e não para a Linden Lab.
-
-Como um serviço aos residentes e visitantes, o dono da região em que você se encontra foi eleito para receber e resolver todas as reportagens originadas nesta região. A Linden Lab não irá investigar reportagens que você envia desta localidade.
-
-O dono da região resolverá as reportagens baseado nas regras locais desta região, como definido na Declaração da propriedade.
-(Veja as declarações indo ao menu Mundo e selecionando Sobre a Terra.)
-
-A resolução desta reportagem se aplica apenas a esta região; o acesso de Residentes às outras áreas do [SECOND_LIFE] não será afetado pelas decisões desta reportagem.
-Apenas a Linden Lab pode restringir acesso a todo o [SECOND_LIFE].
+Todas as denúncias de abuso são investigadas e resolvidas. Para saber o que foi feito, consulte o [http://secondlife.com/support/incidentreport.php relatório de ocorrências].
</notification>
<notification name="HelpReportAbuseSelectCategory">
Por favor, selecione uma categoria para a reportagem deste abuso.
@@ -2017,17 +1718,18 @@ Seja tão específico quanto você puder, incluindo nomes e os detalhes do incid
Fazer uma descrição precisa nos ajuda a arquivar e processar as reportagens de abuso.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- Caro Residente,
+ Caro residente,
-Você parece estar relatando violação de propriedade intelectual. Por favor, certifique-se de que está relatando corretamente:
+Aparentemente você fez uma denúncia de infranção de propriedade intelectual. Certifique-se de que sua denúncia está correta:
-(1) O Processo de abuso. Você pode apresentar um relatório de abuso se você acredita que um Residente está infringindo o sistema de permissões do [SECOND_LIFE], por exemplo, utilizando ferramentas CopyBot para copiar ou similar, para violar os direitos de propriedade intelectual. A Equipe de Abuso investiga e divulga a ação disciplinar adequada para o comportamento que viola o Estatuto da Comunidade do [SECOND_LIFE] ou os Termos de Serviço. No entanto, a mesma não controla e não irá responder aos pedidos para remover o conteúdo do mundo [SECOND_LIFE].
+(1) Procedimento do abuso Se você tem motivos para acreditar que um residente está burlando o sistema de autorização do [SECOND_LIFE] usando o CopyBot ou ferramentas parecidas para infringir direitos de propriedade intelectual, envie um relatório de abuso. A equipe anti-abuso investiga e impõe sanções em casos de infranção dos [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Termos de Serviço] ou das [http://secondlife.com/corporate/cs.php Normas da Comunidade]. Entretando, a equipe anti-abuso não lida com pedidos de remoção de conteúdo do [SECOND_LIFE]. Tais pedidos não serão atendidos.
-(2) O processo de remoção de conteúdo ou DMCA. Para solicitar a remoção de conteúdo do [SECOND_LIFE], você deve enviar uma notificação válida de infração, conforme previsto em nossa Política de DMCA em http://secondlife.com/corporate/dmca.php.
+(2) Procedimentos DMCA ou remoção de conteúdo. Para solicitar a remoção de conteúdo do [SECOND_LIFE], é imprescindível enviar uma notificação de infração elaborada conforme as disposicões da [http://secondlife.com/corporate/dmca.php Política DMCA].
-Se você ainda deseja prosseguir com o processo de abuso, por favor, feche esta janela e termine de enviar seu relatório. Pode ser necessário selecionar a categoria específica &apos;CopyBot Infração de Permissões&apos;.
+Se você deseja continuar o procedimento de denúncia de abuso, feche esta janela e termine o relatório. A categoria &apos;CopyBot or Permissions Exploit&apos; (robô de cópia ou exploit de autorização)
+
+Obrigado.
-Obrigado,
Linden Lab
</notification>
<notification name="FailedRequirementsCheck">
@@ -2038,9 +1740,9 @@ Linden Lab
Já existe um objeto anexado a este ponto do seu corpo.
Você deseja substituí-lo pelo objeto selecionado?
<form name="form">
- <ignore name="ignore" save_option="true" text="Ao substituir os anexos existentes"/>
- <button name="Yes" text="Sim"/>
- <button name="No" text="Não"/>
+ <ignore name="ignore" save_option="true" text="Trocar um anexo atual pelo item selecionado"/>
+ <button ignore="Replace Automatically" name="Yes" text="Sim"/>
+ <button ignore="Never Replace" name="No" text="Não"/>
</form>
</notification>
<notification label="Aviso de Modo Ocupado" name="BusyModePay">
@@ -2048,18 +1750,22 @@ Você deseja substituí-lo pelo objeto selecionado?
Você gostaria de deixar o modo Ocupado antes de completar esta transação?
<form name="form">
- <ignore name="ignore" save_option="true" text="Ao pagar uma pessoa ou objeto no modo ocupado"/>
- <button name="Yes" text="Sim"/>
- <button name="No" text="Não"/>
+ <ignore name="ignore" save_option="true" text="Estou prestes a pagar alguém ou um objeto no modo ocupado"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="Sim"/>
+ <button ignore="Never leave Busy Mode" name="No" text="Não"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ A pasta &apos;[FOLDERNAME]&apos; é uma pasta do sistema. Excluir pastas de sistema pode deixar o sistema instável. Tem certeza de que quer prosseguir?
+ <usetemplate ignoretext="Confirmar antes de excluir pastas do sistema." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Tem certeza de que deseja remover permanentemente o conteúdo da lixeira de seu inventário?
- <usetemplate ignoretext="Ao esvaziar a pasta da lixeira no seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Tem certeza de que deseja excluir o conteúdo da Lixeira? Para sempre?
+ <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Lixeira" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Você tem certeza que deseja limpar o cache do seu navegador?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
+ Tem certeza de que quer apagar todo o histórico de viagens, web e buscas?
+ <usetemplate name="okcancelbuttons" notext="Não" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Você tem certeza de que deseja limpar os cookies?
@@ -2070,39 +1776,18 @@ Você gostaria de deixar o modo Ocupado antes de completar esta transação?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Deseja realmente remover permanentemente o conteúdo da pasta achados e perdidos?
- <usetemplate ignoretext="Ao esvaziar pasta Achados e Perdidos do seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Tem certeza de que deseja excluir o conteúdo dos Achados e Perdidos? Para sempre?
+ <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Achados e Perdidos" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="CopySLURL">
- A seguinte SLurl foi copiada para o seu clipboard:
+ O seguinte SLurl foi copiado para a área de transferência:
[SLURL]
-Coloque-a em uma página web para dar aos outros um fácil acesso a este local ou tente você, colando-a na barra de endereços do seu navegador.
+Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de endereço de qualquer navegador da web.
<form name="form">
- <ignore name="ignore" text="Ao copiar a SURL para o seu clipboard"/>
+ <ignore name="ignore" text="SLurl copiado para área de transferência."/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Este painel controla o tamanho da janela, resolução e a qualidade dos gráficos do computador cliente. O Preferências &gt; Interface Gráfica permite escolher entre quatro níveis gráficos: Baixo, Médio, Alto e Ultra. Você também pode personalizar suas configurações de gráficos selecionando a opção Personalizar e manipulando as seguintes definições:
-
-Sombreamento: Ativar ou desativar vários tipos de sombreadores de pixel.
-
-Detalhes de Reflexão: Define os tipos de objetos que a água pode refletir.
-
-Renderização de Avatar: Define opções que afetam a forma como o cliente renderizará os avatares.
-
-Alcance: Afeta a distância do seu ponto de vista que os objetos serão renderizados na cena.
-
-Número máximo de partículas: Define o número máximo de partículas que será capaz de ver na sua tela de uma só vez.
-
-Qualidade de Pós-Processamento: Define a resolução com a qual o brilho será renderizado.
-
-Detalhes de malha: Ajusta a quantidade de detalhes ou número de triângulos utilizados na renderização de certos objetos. Um valor mais alto leva mais tempo para renderizar, mas torna esses objetos mais detalhados.
-
-Detalhe de Iluminação: Seleciona os tipos de luzes que você gostaria de renderizar.
-
-Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver para a textura do terreno.
- </notification>
<notification name="WLSavePresetAlert">
Você deseja substituir a pré-configuração salva?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
@@ -2121,149 +1806,6 @@ Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver pa
Existe efeito de Pós-Processamento. Você deseja substituí-lo?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="HelpEditSky">
- Editar os controles graduais do WindLight para configurar e salvar um conjunto de céus.
- </notification>
- <notification name="HelpEditDayCycle">
- Definir quais céus colocar durante todo o dia.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Essas configurações ajustam a forma como o ambiente parece localmente no seu computador. Sua placa de vídeo precisa suportar o sombreador atmosférico, a fim de ter acesso a todas as definições.
-
-Ajuste o controle gradual &quot;Hora do Dia&quot; para alterar a fase do dia localmente no visualizador.
-
-Ajuste o controle gradual de &quot;Cobertura das nuvens&quot; para controlar quantas nuvens cobrem o céu.
-
-Pegue uma cor na paleta de cores de &quot;Cor da Ãgua&quot; para mudar a cor desta.
-
-Ajuste o controle gradual de &quot;Névoa de Ãgua&quot; para controlar o quão densa é a névoa dentro da água.
-
-Clique &quot;Usar Horário da Propriedade&quot; para redefinir a hora do dia para o horário atual do dia da região e permanecer atrelado a ela.
-
-Clique &quot;Céu Avançado &quot; para abrir um editor com configurações mais avançadas para o céu.
-
-Clique &quot;Ãgua Avançada &quot; para abrir um editor com configurações mais avançadas para a água.
- </notification>
- <notification name="HelpDayCycle">
- O editor de Ciclo do Dia dá a você o controle do céu durante um ciclo de dia/noite do [SECOND_LIFE]. Este é o ciclo usado pelo controle gradual da hora do dia do editor de ambiente básico.
-
-O editor do ciclo de dia trabalha configurando quadros-chave. Estes são pontos (representados pelos ícones cinza no gráfico de horário) que possuem um pré-ajuste de céu associado a eles. Conforme o dia passa, o céu do Windlight &quot; anima &quot; a interpolação entre esses quadros-chave.
-
-A seta amarela acima da linha de tempo representa a sua vista atual, baseada no horário do dia. Clique e arraste para ver como o seu dia será animado. Você pode adicionar ou deletar os quadros-chave pressionando os botões Adicionar Chave e Deletar chave ao lado direito da linha de tempo.
-
-Você pode configurar a posição do tempo de um quadro-chave arrastando-o pela linha do tempo, ou configurando manualmente no quadro de configurações do seu quadro-chave. Será possível a você associar o seu quadro-chave a este respectivo padrão WindLight.
-
-A duração do ciclo determina a duração geral do &quot;dia&quot;. Configurá-la para um valor baixo (por exmplo, 2 min.) quer dizer que a linha do tempo de 24 horas será animada completamente em apenas dois minutos reais! Assim que estiver satisfeito com a linha do tempo e o ciclo dos quadros-chave, use os botões Play e Stop para uma prévia de como ficará o resultado. Lembre-se, você também pode utilizar a seta amarela indicadora do tempo acima da linha do tempo para ver o ciclo animado interativamente. Usando o botão do tempo da popriedade irá sincronizar a duração do seu dia ao ciclo diário da propriedade.
-
-Assim que estiver satisfeito com o seu ciclo diário, você pode salvá-lo ou carregá-lo através dos botões Salvar Dia Teste e Carregar Dia Teste. Note que, por enquanto, nós permitimos apenas um Ciclo de dia.
- </notification>
- <notification name="HelpBlueHorizon">
- Use os cursores Vermelho/Verde/Azul ( Red/Green/Blue -RGB) para ajustar as cores do céu. Você também pode usar o controle de Intensidade (I) para mover os três controles RGB simultaneamente.
- </notification>
- <notification name="HelpHazeHorizon">
- Haze Horizon é um dos parâmetros mais úteis para ajuste global de exposição de luz na cena. Ele é eficaz para simular diversas configurações de exposição, tais como configurações para super-exposição do sol e escuros halos de Iris.
- </notification>
- <notification name="HelpBlueDensity">
- A densidade global azul afeta a saturação da cor do céu e nevoeiro. Se você mover o controle gradual de intensidade (I) para a direita, as cores vão se tornar mais brilhantes e vibrantes. Se você movê-lo totalmente para a esquerda, as cores perdem intensidade e cor, eventualmente chegando a preto e branco. Se pretende um ajuste fino do equilíbrio de cor do céu, você pode controlar os diversos elementos da saturação, utilizando os controles graduais para vermelho / verde / azul (RGB).
- </notification>
- <notification name="HelpHazeDensity">
- Densidade de Poeira controla o nível de fumaça, poeira cinza na atmosfera. Eficaz para simular cenas com altos níveis de poeira e poluentes. É também efetivo em simular névoa e nevoeiro.
- </notification>
- <notification name="HelpDensityMult">
- O Multiplicador de Densidade pode ser usado para afetar a densidade atmosférica global. Com definições mais baixas, ele cria uma sensação de &quot;ar rarefeito&quot; e em definições mais altas, ele cria um efeito mais denso, mais esfumaçado.
- </notification>
- <notification name="HelpDistanceMult">
- Ajusta como a distância no WindLight é percebida. Um valor zero efetivamente desativa a influência do WindLight sobre terrenos e objetos. Valores superiores a 1 simulam os efeitos atmosféricos mais espessos a maiores distâncias.
- </notification>
- <notification name="HelpMaxAltitude">
- Max Altitude ajusta os cálculos de performance de altitude do WindLight, quando computa sua iluminação atmosférica. Em períodos vespertinos do dia, é útil para ajustar a &quot;profundidade&quot; de como o pôr-do-sol aparece.
- </notification>
- <notification name="HelpSunlightColor">
- Ajustar a cor e intensidade da luz direta na cena.
- </notification>
- <notification name="HelpSunAmbient">
- Ajusta a cor e a intensidade da luz ambiente atmosférica na cena.
- </notification>
- <notification name="HelpSunGlow">
- O controle gradual de Tamanho controla o tamanho do sol.
-O controle gradual de Foco controla o quanto o sol aparecerá desfocado no céu.
- </notification>
- <notification name="HelpSceneGamma">
- Ajusta a distribuição na tela de luz e escuridão.
- </notification>
- <notification name="HelpStarBrightness">
- Ajusta o brilho das estrelas no céu.
- </notification>
- <notification name="HelpTimeOfDay">
- Controla a localização do sol no céu. Semelhante a elevação.
- </notification>
- <notification name="HelpEastAngle">
- Controla a localização do sol no céu.
-Similar ao azimute.
- </notification>
- <notification name="HelpCloudColor">
- Edita as cores das nuvens, É normalmente recomendado manter o tom esbranquiçado, mas hey! Você pode se divertir se desejar.
- </notification>
- <notification name="HelpCloudDetail">
- Controla os detalhes da camada de imagem superior na imagem de nuvem principal. X e Y controla sua posição. D (Densidade) controla o quão cheio ou estratificada as nuvens devem aparecer.
- </notification>
- <notification name="HelpCloudDensity">
- Permite que você controle a posição das nuvens com os cursores X e Y e a densidade deles com o cursor D.
- </notification>
- <notification name="HelpCloudCoverage">
- Controla o quanto as nuvens cobrem o céu.
- </notification>
- <notification name="HelpCloudScale">
- Controla o dimensionamento da imagem de nuvens na cúpula celeste.
- </notification>
- <notification name="HelpCloudScrollX">
- Controla a velocidade das nuvens que se movem na direção X.
- </notification>
- <notification name="HelpCloudScrollY">
- Controla a velocidade que as núvens se movem na direção Y.
- </notification>
- <notification name="HelpClassicClouds">
- Marque esta check box para permitir a reprodução das nuvens clássicas mais velhas do [SECOND_LIFE], além das nuvens WindLight.
- </notification>
- <notification name="HelpWaterFogColor">
- Escolhe a cor da neblina subaquática.
- </notification>
- <notification name="HelpWaterFogDensity">
- Controla a densidade da neblina da água e a distância de visibilidade debaixo d&apos;água.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifica o efeito do expoente de densidade de Neblina para controlar até onde você pode ver quando o seu avatar está imerso.
- </notification>
- <notification name="HelpWaterGlow">
- Controla o quanto a superfície da água deve brilhar.
- </notification>
- <notification name="HelpWaterNormalScale">
- Controla o escalonamento das três marolas que compõem a água.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Controla o quanto de luz será refletido por ângulos diferentes.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Controla o quanto da intensidade da luz é refletida.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Controla o quanto de luz será refratado olhando acima da superfície da água.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Controla o quanto de luz sera refratado visto debaixo da superfície da água.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Controla como ondas e reflexos são misturados.
- </notification>
- <notification name="HelpWaterNormalMap">
- Controla o mapeamento normal em todos os níveis da água para determinar reflexões / refrações.
- </notification>
- <notification name="HelpWaterWave1">
- Controla aonde e com que velocidade a versão em escala maior do mapa normal se move nas direções X e Y .
- </notification>
- <notification name="HelpWaterWave2">
- Controla onde e a velocidade com que o mapa normal em escala menor se move nas direções X e Y.
- </notification>
<notification name="NewSkyPreset">
Me dê o nome para o novo céu.
<form name="form">
@@ -2309,35 +1851,33 @@ Similar ao azimute.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Os itens não podem ser comprados enquanto forem parte de um anexo.
+ Objetos não podem ser adquiridos quando estão anexados.
</notification>
<notification label="Sobre o pedido de Permissão de Débito" name="DebitPermissionDetails">
Conceder esse pedido dá permissão ao script para tirar Linden dólares (L$) de sua conta. Para revogar esta permissão, o proprietário do objeto deve excluir o objeto ou resetar os scripts dele.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- Você gostaria de vestir automaticamente o item de vestuário que você criar?
- <usetemplate ignoretext="Automaticamente vestir novo vestuário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Vestir automaticamente a roupa que você vai criar?
+ <usetemplate ignoretext="Vestir as roupas que eu criar enquanto edito minha aparência" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="NotAgeVerified">
- Você precisa ter a idade verificada para acessar este lote.
-Gostaria de visitar o site do [SECOND_LIFE] para verificação de idade?
+ Ãrea restrita a residentes com idade comprovada. Deseja ir ao site do [SECOND_LIFE] para comprovar sua idade?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=pt
</url>
- <usetemplate ignoretext="Alertar sobre a falta de verificação de idade" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Ainda não comprovei minha idade" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Este lote exige que você tenha informações de pagamento no arquivo antes de poder acessá-lo.
-Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
+ Ãrea restrita a residentes que já cadastraram seus dados de pagamento Deseja ir ao site do [SECOND_LIFE] para cuidar disso?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=pt
</url>
- <usetemplate ignoretext="Avisar sobre a falta de informação de pagamento." name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Ainda não tenho cadastro de pagamento" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="MissingString">
A sequência [STRING_NAME] está faltando do strings.xml
@@ -2367,7 +1907,7 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
[FIRST] [LAST] está Offline
</notification>
<notification name="AddSelfFriend">
- Você não pode adicionar a si mesmo como amigo
+ Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a).
</notification>
<notification name="UploadingAuctionSnapshot">
Fazendo o upload das fotos do site da web e do mundo...
@@ -2386,7 +1926,7 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
Feito o download de Terrain.raw
</notification>
<notification name="GestureMissing">
- O Gesto [NAME] não se encontra na base de dados
+ O gesto [NAME] não está no banco de dados.
</notification>
<notification name="UnableToLoadGesture">
Impossível de carregar o gesto [NAME].
@@ -2399,14 +1939,14 @@ Por favor, tente novamente.
Impossível carregar o landmark. Por favor, tente de novo.
</notification>
<notification name="CapsKeyOn">
- Seu botão CAPS LOCK está ativado.
-Como isto afeta a senha digitada, você provavelmente desejará desativá-lo.
+ A tecla Maiúsc. está ligada.
+Ela pode afetar a digitação da senha.
</notification>
<notification name="NotecardMissing">
Notecard foi perdido no banco de dados.
</notification>
<notification name="NotecardNoPermissions">
- Permissões insuficientes para visualizar o notecard
+ Você não está autorizado a ler esta nota.
</notification>
<notification name="RezItemNoPermissions">
Sem permissões suficientes para criar objetos.
@@ -2444,11 +1984,11 @@ Por favor, tente novamente.
Por favor, tente novamente.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Impossível comprar objetos de diferentes compradores ao mesmo tempo.
-Por favor, compre apenas um objeto.
+ Só dá para comprar objetos de um dono por vez.
+Selecione só um objeto.
</notification>
<notification name="ObjectNotForSale">
- Este objeto não está a venda.
+ Este objeto não está à venda.
</notification>
<notification name="EnteringGodMode">
Entrando em god mode, nível [LEVEL]
@@ -2457,10 +1997,10 @@ Por favor, compre apenas um objeto.
Saindo do god mode, nível [LEVEL]
</notification>
<notification name="CopyFailed">
- A cópia falhou porque você não tem permissão para copiar.
+ Você não está autorizado a copiar isso.
</notification>
<notification name="InventoryAccepted">
- [NAME] aceitou sua oferta de inventário.
+ [NAME] recebeu sua oferta de inventário.
</notification>
<notification name="InventoryDeclined">
[NAME] rejeitou sua oferta de inventário.
@@ -2475,12 +2015,14 @@ Por favor, compre apenas um objeto.
Seu cartão de visita foi negado.
</notification>
<notification name="TeleportToLandmark">
- Agora que você chegou à mainland, você pode se teletransportar para locais como &apos;[NAME]&apos; clicando no botão de Inventário, no canto direito inferior de sua tela, e selecionando a pasta Landmarks.
-Dê um duplo-clique na landmark e clique Teletransportar para viajar para o local desejado.
+ Para se teletransportar para lugares como &apos;[NAME]&apos;, abra o painel &apos;Lugares&apos; à direita da tela e selecione a guia Marcos.
+Basta clicar em qualquer marco e depois clicar em &apos;Teletransportar&apos; na parte inferior da tela.
+(Também é possível clicar duas vezes no marco, ou clicar no marco com o botão direito e selecionar &apos;Teletransportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Agora que você chegou à mainland, você pode contatar residentes como &apos;[NAME]&apos; clicando no botão de Inventário, canto direito inferior de sua tela, e selecionando a pasta Cartões de Visita.
-Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua mensagem.
+ Para entrar em contato com residentes como &apos;&apos;[NAME]&apos;, abra o painel &apos;Pessoas&apos; à direita da tela.
+Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do painel.
+(Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Impossível selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra.
@@ -2502,6 +2044,9 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificação de evento:
@@ -2524,8 +2069,20 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua
[NAMES]
</notification>
<notification name="NoQuickTime">
- O software QuickTime da Apple parece não estar instalado em seu sistema.
-Se você deseja ver fluxo de mídia em terrenos que aceitem isso, você deverá ir ao site do QickTime (http://www.apple.com/quicktime) e instalar o player do QuickTime.
+ Aparentemente o QuickTime da Apple ainda não foi instalado no seu computador.
+Para ver mídia em stream nas regiões que oferecem esse formato, vá ao [http://www.apple.com/quicktime site do QuickTime] e instale o QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ Nenhum plugin de mídia detectado para lidar com o tipo de mime &quot;[MIME_TYPE]&quot;. Este tipo de mídia não poderão ser acessados.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Falha no plugin de mídia abaixo:
+ [PLUGIN]
+
+Instale o plugin novamente ou contate o fabricante se o problema persistir.
+ <form name="form">
+ <ignore name="ignore" text="Falha do plugin de mídia"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Os objetos que lhe pertencem no lote selecionado do terreno, voltaram ao seu inventário.
@@ -2544,23 +2101,26 @@ Objetos não transferíveis dados ao grupo foram deletados.
<notification name="UnOwnedObjectsReturned">
Os objetos no lote selecionado que NÃO são seus, voltaram aos seus donos.
</notification>
+ <notification name="ServerObjectMessage">
+ Mensagem de [NAME]:
+[MSG]
+ </notification>
<notification name="NotSafe">
- Esta terra permite que você sofra ataques.
-Você pode ser ferido aqui. Se você morrer, você será teletransportado à sua posição inicial.
+ A opção &apos;danos&apos; desta região está ativada.
+Você pode se dar mal aqui. Se você morre, você será teletransportado de volta para casa.
</notification>
<notification name="NoFly">
- Este terreno tem a opção Voar desabilitada.
-Ou seja, você não pode voar aqui.
+ Esta área desativou a opção de voar.
+Logo, não é possível voar aqui.
</notification>
<notification name="PushRestricted">
- Esta terra é “Não empurreâ€.
-Você não pode empurrar os outros, a não ser que seja o proprietário da terra.
+ Esta área não tolera empurrões. Não é possível empurrar os outros aqui, a não ser que você seja o proprietário.
</notification>
<notification name="NoVoice">
- O uso de voz está desabilitado nesta terra.
+ Esta área desativou o bate-papo de voz. Você não vai ouvir ninguém falar.
</notification>
<notification name="NoBuild">
- Este terreno tem a opção de construir desabilitada, ou seja, você não pode criar objetos aqui.
+ Esta área desativou a opção de construir. Não é possível construir ou fazer rez de objetos nesta área.
</notification>
<notification name="ScriptsStopped">
Um administrador não permitiu scripts temporariamente nesta região.
@@ -2569,10 +2129,12 @@ Você não pode empurrar os outros, a não ser que seja o proprietário da terra
Esta região não roda nenhum script.
</notification>
<notification name="NoOutsideScripts">
- Neste terreno, nenhum script funcionará, a não ser os scripts do próprio dono da terra.
+ Esta região não permite scripts de fora.
+
+Os únicos scripts que funcionam são os do proprietário do terreno.
</notification>
<notification name="ClaimPublicLand">
- Pode apenas reclamar terreno público na região em que você está.
+ Você só pode reivindicar terrenos públicos na região onde você está.
</notification>
<notification name="RegionTPAccessBlocked">
Você não é permitido na Região devido à sua Classificação de maturidade. Você precisa validar sua idade e/ou instalar o último Visualizador.
@@ -2585,16 +2147,9 @@ Por favor, vá ao Banco de Conhecimento para detalhes sobre o acesso de áreas c
<notification name="NoTeenGridAccess">
Sua conta não pode conectar a esta região da grade teen.
</notification>
- <notification name="NoHelpIslandTP">
- Você não pode se tele-transportar de volta à Ilha de Ajuda.
-Vá para a Ilha de Ajuda Pública para repetir este tutorial.
- </notification>
<notification name="ImproperPaymentStatus">
Você não tem o status de pagamento adequado para entrar nesta região.
</notification>
- <notification name="MustGetAgeRegion">
- Você precisa ter sua idade verificada para entrar nesta região.
- </notification>
<notification name="MustGetAgeParcel">
Você precisa ter a idade verificada para entrar neste lote.
</notification>
@@ -2657,31 +2212,35 @@ Por favor, tente novamente em alguns instantes.
Nenhum lote válido foi encontrado.
</notification>
<notification name="ObjectGiveItem">
- Um objeto nomeado [OBJECTFROMNAME] do dono [FIRST] [LAST] deu a você [OBJECTTYPE] nomeado &apos;[OBJECTNAME]&apos;.
+ Um objeto chamado [OBJECTFROMNAME] de [NAME_SLURL] lhe deu [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Segure"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Um objeto nomeado [OBJECTFROMNAME], de dono desconhecido, deu a você um [OBJECTTYPE] nomeado [OBJECTNAME].
+ Um objeto chamado [OBJECTFROMNAME] de (residente desconhecido) lhe deu [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Segure"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME]deu a voce um [OBJECTTYPE] nomeado &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] lhe deu [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Mantenha"/>
+ <button name="Show" text="Mostrar"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2693,7 +2252,7 @@ Por favor, tente novamente em alguns instantes.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] ofereceu um teletransporte para seu local:
+ [NAME] quer te teletransportar para a região deles:
[MESSAGE]
<form name="form">
@@ -2720,6 +2279,9 @@ Por favor, tente novamente em alguns instantes.
<button name="Decline" text="Recusar"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Você convidou [TO_NAME] para ser seu amigo(a)
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] está lhe oferecendo sua amizade.
@@ -2744,12 +2306,12 @@ Isto adicionará uma anotação em seu inventário, de modo que você possa mand
</form>
</notification>
<notification name="RegionRestartMinutes">
- A região será reiniciada em [MINUTES] minutos.
-Se permanecer nesta região, você será desconectado.
+ Esta região será reiniciada em [MINUTES] minutos.
+Se permanecer aqui, você será desconectado.
</notification>
<notification name="RegionRestartSeconds">
- Região será reiniciada em [SECONDS] segundos.
-Se permanecer nesta região, você será desconectado.
+ Esta região será reiniciada em [SECONDS] segundos.
+Se permanecer aqui, você será desconectado.
</notification>
<notification name="LoadWebPage">
Carregar página da web [URL]?
@@ -2769,7 +2331,7 @@ Do objeto: [OBJECTNAME], dono: [NAME]?
Falhou ao procurar [TYPE] nomeado [DESC] no banco de dados.
</notification>
<notification name="InvalidWearable">
- O item que você está tentando vestir usa uma característica que seu Visualizador não lê. Por favor, atualize sua versão do [APP_NAME] para vestir este item.
+ O item que você está tentando usar tem um recurso que seu Visualizador não consegue ler. Atualize o [APP_NAME] para poder vestir esse item.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, um objeto pertencente a &apos;[NAME]&apos;, gostaria de:
@@ -2779,16 +2341,16 @@ Está OK?
<form name="form">
<button name="Yes" text="Sim"/>
<button name="No" text="Não"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[NAME]&apos;, gostaria de:
+ Um objeto chamado &apos;[OBJECTNAME]&apos;, de &apos;[NAME]&apos; gostaria de:
[QUESTIONS]
-Se você não confia neste objeto ou em seu criador, você deveria negar o pedido. Para informações adicionais clique no botão Detalhes.
+Se você não confia nos objetos deste autor, recuse-o.
-Autorizar este pedido?
+Deixar?
<form name="form">
<button name="Grant" text="Autorizar"/>
<button name="Deny" text="Negar"/>
@@ -2809,39 +2371,44 @@ Autorizar este pedido?
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
+ <notification name="ScriptToast">
+ [FIRST] [LAST], &apos;[TITLE]&apos; está pedindo dados de usuário.
+ <form name="form">
+ <button name="Open" text="Abrir diálogo"/>
+ <button name="Ignore" text="Ignorar"/>
+ <button name="Block" text="Bloquear"/>
+ </form>
+ </notification>
<notification name="FirstBalanceIncrease">
- Você recebeu uma quantia de L$[AMOUNT].
-Objetos e outros usuários podem dar L$ a você.
-Seu saldo é mostrado no canto superior direito da tela.
+ Você acaba de ganhar L$[AMOUNT].
+Seu saldo em L$ está no canto direito superior.
</notification>
<notification name="FirstBalanceDecrease">
- Você pagou L$[AMOUNT].
-O seu balanço de dinheiro está sendo mostrado no canto superior direito da tela.
+ Você acaba de pagar L$[AMOUNT].
+Seu saldo em L$ está no canto direito superior.
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Obrigado e volte sempre!
+
+Seu saldo L$ será atualizado findo o processamento da transação. Se o processamento levar mais de 20 min, a transação pode vir a ser cancelada. Neste caso, o valor da compra será creditado ao seu saldo em US$.
+
+Para checar o status do pagamento, consulte seu Histórico de transações no [http://secondlife.com/account/ Painel]
</notification>
<notification name="FirstSit">
- Você está sentado.
-Use as setas (ou AWSD) para mudar a visão.
-Clique em &apos;Levantar&apos; para levantar.
+ Você está sentado(a).
+Use as teclas de seta (ou AWSD) para olhar à sua volta.
+Clique o botão &apos;Ficar de pé&apos; para ficar de pé.
</notification>
<notification name="FirstMap">
- Clique e arraste para movimentar o mapa.
-Dê um duplo clique para teletransportar-se.
-Use os controles à direita para achar coisas e mostrar fundos diferentes.
+ Clique a arraste o mapa para olhar à sua volta.
+Clique duas vezes para se teletransportar.
+Use os controles à direita para achar coisas e exibir outros planos de fundo.
</notification>
<notification name="FirstBuild">
- Você pode construir novos objetos em algumas áreas do [SECOND_LIFE].
-Use as ferramentas acima, à esquerda para construir e tente manter apertadas as teclas Ctrl ou Alt para mudar rapidamente as ferramentas.
-Aperte ESC para parar de construir.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Clicando com esquerdo, você interage com os objetos especiais.
-Se o ponteiro do mouse mudar a uma mão, você pode interagir com o objeto.
-Clique com o direito que será mostrado sempre um menu das ações que você pode fazer.
+ Você abriu as Ferramentas de construção. Todos os objetos à sua volta foram criados com essas ferrametnas.
</notification>
<notification name="FirstTeleport">
- Esta região não permite teletransporte ponto-a-ponto. Assim, você foi teletransportado para o telehub mais próximo.
-Seu destino está assinalado com um farol alto.
-Siga a flecha vermelha até o farol, ou clique nela para apagar o farol.
+ Você só pode se teletransportar para certas áreas nesta região. A seta aponta o seu destino específico. Clique na seta para ignorá-la.
</notification>
<notification name="FirstOverrideKeys">
Suas chaves do movimento estão sendo seguras agora por um objeto.
@@ -2850,87 +2417,81 @@ Alguns objetos (como armas) requerem que você passe para mouselook para usá-lo
Pressione &apos;M&apos; para fazer isto.
</notification>
<notification name="FirstAppearance">
- Você está editando sua aparência.
-Para girar e ver em zoom, use as teclas de setas.
-Quando terminar, aperte &apos;Salvar Tudo&apos; para salvar sua aparência e sair.
-Você pode editar sua aparência quantas vezes quiser.
+ Você está editando sua aparência.
+Use as teclas de seta para olhar à sua volta.
+Quando terminar, clique em &apos;Salvar tudo&apos;.
</notification>
<notification name="FirstInventory">
- Este é o seu inventário, que contém objetos, notecards, roupas e outras coisas suas.
-* Para vestir um objeto ou uma pasta completa, arraste-o para si mesmo(a).
-* Para trzer um objeto ao mundo, arraste-o ao chão.
-* Para ler um notecard, dê um duplo-click nele.
+ Este é seu inventário, onde ficam todos os seus pertences.
+
+* Para vestir uma peça, arraste-a para o seu corpo.
+* Para fazer rez de um objeto, arraste-o para o chão.
+* Para ler uma anotação, clique duas vezes nela.
</notification>
<notification name="FirstSandbox">
- Esta é a região conhecida como sandbox.
-Os objetos que você constrói aqui podem ser deletados depois que você deixa a área.
-As sandboxes são limpas de forma periódica.
-Por favor, veja a informação no alto da tela, próxima ao nome da região.
-As regiões de sandbox não são comuns e são marcadas com símbolos.
+ Este é um sandbox, uma área onde residentes podem aprender a construir.
+
+Qualquer objeto deixado aqui será apagado quando você sair. Não se esqueça de clicar duas vezes e selecionar &apos;Pegar&apos; para levar seu projeto para o seu inventário.
</notification>
<notification name="FirstFlexible">
- Este objeto tem a propriedade flexível.
-Objetos flexíveis não podem ser físicos e devem ser fantasmas até que a caixa de verificação seja desmarcada.
+ Este objeto é flexível. Flexis devem ser phantom, não físicos.
</notification>
<notification name="FirstDebugMenus">
- Você ativou o menu Avançado.
-Este menu contém funcionalidades úteis para desenvolvedores debugarem o [SECOND_LIFE].
-Para mostrar esse menu no Windows pressione Ctrl+Alt+D. No Mac pressione &#8997;&#8984;D.
+ Você abriu o menu Avançado.
+
+Para alternar este menu,
+ Windows Ctrl+Alt+D
+ Mac: ⌥⌘D
</notification>
<notification name="FirstSculptedPrim">
- Você está editando uma primitiva esculpida.
-Primitivas esculpidas requerem uma textura especial para especificar suas formas.
-Você encontrará exemplos dessas texturas na Biblioteca do Inventário.
- </notification>
- <notification name="FirstMedia">
- Você começou a tocar uma mídia. Mídias podem ser autorizadas a iniciar automaticamente se você assim escolher na janela de Preferências, sob Ãudio/Vídeo. Atente para o risco de segurança que pode haver ao acessar websites de mídia que você não confia.
+ Você está editando um prim esculpido. Prims esculpidos requerem uma textura especial para definir o formato.
</notification>
<notification name="MaxListSelectMessage">
Você pode selecionar até [MAX_SELECT] itens desta lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] está lhe convidando para uma conversa com voz.
-Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando.
+ [NAME] está te convidando para um bate-papo de voz.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST] recebeu uma Mensagem Instantânea sua e automaticamente não está mais no modo mudo.
+ [FIRST] [LAST] recebeu uma MI e foi desbloqueado(a) automaticamente.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST] recebeu pagamento seu e automaticamente não está mais no modo mudo.
+ [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST] recebeu inventário seu e automaticamente não está mais mudo.
+ [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] juntou-se a uma conversa com voz do grupo [GROUP].
-Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando.
+ [NAME] atendeu uma ligação de bate-papo de voz com o grupo [GROUP].
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] juntou-se a uma chamada de Conferência com voz...
-Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Clique Mudo para calar este usuário.
+ [NAME] atendeu uma ligação de teleconferência.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] está lhe convidando para uma conversa em conferência...
- Clique Aceitar para se juntar à conversa, ou Recusar para recusar o convite. Clique Mudo para calar este usuário.
+ [NAME] está te convidando para uma teleconferência de bate-papo.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -2940,25 +2501,25 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq
Desculpe-nos. Esta área atingiu seu limite de capacidade para conversas com voz. Favor tentar usar voz em outra área.
</notification>
<notification name="VoiceChannelDisconnected">
- Você foi desconectado de [VOICE_CHANNEL_NAME]. Voce será reconectado agora à Conversa com voz local.
+ Você saiu da ligação com [VOICE_CHANNEL_NAME]. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] desligou a chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] encerrou a ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] recusou sua chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] recusou a ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] não está disponível para aceitar sua chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] não está disponível para atender sua ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceChannelJoinFailed">
- Falha na conexão com [VOICE_CHANNEL_NAME], tente novamente mais tarde. Voce será reconectado agora à Conversa com voz local.
+ Falha de conexão com [VOICE_CHANNEL_NAME]. Tente novamente mais tarde. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceLoginRetry">
Estamos criando uma canal de voz para você. Isto pode levar até um minuto.
</notification>
<notification name="Cannot enter parcel: not a group member">
- Você não pode entrar nessa terra, você não é membro do grupo autorizado.
+ Só membros de um grupo podem acessar esta área.
</notification>
<notification name="Cannot enter parcel: banned">
Você não pode entrar nessa terra, você foi banido.
@@ -2973,18 +2534,58 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq
Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME]. Favor tentar novamente mais tarde.
</notification>
<notification name="ServerVersionChanged">
- A região em que você entrou está rodando uma versão diferente de simulador. Clique aqui para mais detalhes.
+ Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho. [[URL] Consultar notas da versão.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ O SLurl no qual você clicou não é suportado.
+ </notification>
+ <notification name="BlockedSLURL">
+ Um SLurl recebido de um navegador inidôneo foi bloqueado para a sua segurança.
</notification>
- <notification name="UnableToOpenCommandURL">
- A URL que vocÊ clicou não pode ser aberta no navegador web.
+ <notification name="ThrottledSLURL">
+ Vários SLurls foram recebidos de um navegador inidôneo em pouco tempo.
+Para sua segurança, os SLurls serão bloqueados por alguns instantes.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="AttachmentSaved">
+ Anexo salvo.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Nenhum tópico de ajuda foi encontrado com relação a este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Erro do servidor: Falha ao atualizar ou executar a mídia.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Seu texto de bate-papo foi silenciado pelo moderador.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Sua voz foi silenciada pelo moderador.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Tem certeza que deseja apagar todo o seu histórico de teletransporte?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ O botão selecionado não pode ser exibido no momento.
+O botão será exibido quando houver espaço suficente.
</notification>
<global name="UnsupportedCPU">
- A velocidade da sua CPU não suporta os requisitos mínimos exigidos.
</global>
<global name="UnsupportedGLRequirements">
- Você não parece ter os requisitos de hardware recomendados para rodar o [APP_NAME]. O [APP_NAME] exige uma placa gráfica OpenGL que tem apoio a multi- texturas. Se este for o caso, você pode se certificar de que tem os drivers mais recentes para sua placa gráfica, e os patches e pacotes de serviços para seu sistema operacional.
+ Aparentemente a sua máquina não atende os requisitos de hardware do [APP_NAME]. [APP_NAME] requer placas de vídeo OpenGL com suporte a multitexturas. Se sua place de vídeo tiver este perfil, atualize o driver da placa de vídeo, assim como patches e service packs do sistema operacional.
-Se continuar com problemas, por favor visite: http://www.secondlife.com/support
+Se você continuar a receber esta mensagem, consulte o [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -2998,10 +2599,8 @@ Se continuar com problemas, por favor visite: http://www.secondlife.com/support
<global name="UnsupportedRAM">
- A memória do seu sistema não suporta os requisitos mínimos exigidos.
</global>
- <global name="PermYes">
- Sim
- </global>
- <global name="PermNo">
- Não
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Se você tem um terreno, seu terreno pode ser sua casa.
+Outra opção é procurar por lugares com a tag &apos;Infohub&apos; no mapa.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/pt/panel_active_object_row.xml b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml
new file mode 100644
index 0000000000..73f6b2225f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Objeto desconhecido
+ </string>
+ <text name="object_name">
+ Objeto sem nome
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..aa8fd0b2d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <panel name="panel_call_buttons">
+ <button label="Ligar" name="call_btn"/>
+ <button label="Desligar" name="end_call_btn"/>
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..ecaf062e41
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]min
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]dias
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]semanas
+ </string>
+ <string name="FormatMonths">
+ [COUNT]meses
+ </string>
+ <string name="FormatYears">
+ [COUNT]anos
+ </string>
+ <text name="avatar_name" value="Desconhecido"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..c5f93d719a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista de bloqueados
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/>
+ <button label="Bloquear residente..." label_selected="Bloquear residente..." name="Block resident..." tool_tip="Selecione o residente a bloquear"/>
+ <button label="Bloquear objeto por nome..." label_selected="Bloquear objeto por nome..." name="Block object by name..."/>
+ <button label="Desbloquear" label_selected="Desbloquear" name="Unblock" tool_tip="Remover residente ou objeto da lista dos bloqueados"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_bottomtray.xml b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml
new file mode 100644
index 0000000000..2a66620800
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Liga e desliga o microfone
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Mostra/oculta os controles de voz
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_box label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Movimentar" name="movement_btn" tool_tip="Mostra/oculta os controles de movimento"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Tirar foto"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_classified_info.xml b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
new file mode 100644
index 0000000000..6f48a36182
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <text name="title" value="Dados do anúncio"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="classified_name" value="[nome]"/>
+ <text name="classified_location" value="[carregando...]"/>
+ <text name="content_type" value="[content type]"/>
+ <text name="category" value="[category]"/>
+ <check_box label="Renovar automaticamente todas as semanas" name="auto_renew"/>
+ <text name="price_for_listing" tool_tip="Preço do anúncio.">
+ L$ [PRICE]
+ </text>
+ <text name="classified_desc" value="[descrição]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
new file mode 100644
index 0000000000..f8be9daf1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_classified.xml b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
new file mode 100644
index 0000000000..a754c5f070
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar anúncio" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (salvar para atualizar)
+ </panel.string>
+ <text name="title">
+ Editar anúncio
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ <text name="Name:">
+ Cargo:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <text name="location_label">
+ Localização:
+ </text>
+ <text name="classified_location">
+ Carregando...
+ </text>
+ <button label="Usar configuração local" name="set_to_curr_location_btn"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Preço do anúncio" value="50"/>
+ <check_box label="Renovação automática semanal" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Salvar" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
new file mode 100644
index 0000000000..2c73e67c4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Ãris" name="Iris" tool_tip="Selecionar imagem"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Olhos"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
new file mode 100644
index 0000000000..6b4141e4a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Luvas"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
new file mode 100644
index 0000000000..b49f5850aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Texture" name="Texture" tool_tip="Selecionar imagem"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Cor"/>
+ <accordion_tab name="hair_style_tab" title="Estilo"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sombrancelhas"/>
+ <accordion_tab name="hair_facial_tab" title="Faciais"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
new file mode 100644
index 0000000000..dcccf76c26
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tecido de cima" name="Upper Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tecido de baixo" name="Lower Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jaqueta"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
new file mode 100644
index 0000000000..8cfa6933eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Calças"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
new file mode 100644
index 0000000000..f56533652d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar destaques" name="panel_edit_pick">
+ <text name="title">
+ Editar destaques
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ <text name="Name:">
+ Cargo:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <text name="location_label">
+ Localização:
+ </text>
+ <text name="pick_location">
+ Carregando...
+ </text>
+ <button label="Usar configuração local" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Salvar [WHAT]" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
index e97e77cfe6..d7e7d30a73 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
@@ -1,45 +1,48 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Residente" />
- <string name="AcctTypeTrial"
- value="Teste" />
- <string name="AcctTypeCharterMember"
- value="Estatuto do membro" />
- <string name="AcctTypeEmployee"
- value="Contratado da Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Infor. de pagamento utilizadas" />
- <string name="PaymentInfoOnFile"
- value="Infor. de pagamento no arquivo" />
- <string name="NoPaymentInfoOnFile"
- value="Sem infor. de pagamento no arquivo" />
- <string name="AgeVerified"
- value="Idade Verificada" />
- <string name="NotAgeVerified"
- value="Idade não Verificada" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pt
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Parceiro:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Resposta no Modo Ocupado:
- </text>
- </panel>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar perfil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Residente"/>
+ <string name="AcctTypeTrial" value="Teste"/>
+ <string name="AcctTypeCharterMember" value="Estatuto do membro"/>
+ <string name="AcctTypeEmployee" value="Contratado da Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Infor. de pagamento utilizadas"/>
+ <string name="PaymentInfoOnFile" value="Infor. de pagamento no arquivo"/>
+ <string name="NoPaymentInfoOnFile" value="Sem infor. de pagamento no arquivo"/>
+ <string name="AgeVerified" value="Idade Verificada"/>
+ <string name="NotAgeVerified" value="Idade não Verificada"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pt
+ </string>
+ <string name="no_partner_text" value="Nenhum"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Mundo real:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Selecione uma imagem"/>
+ <text name="title_homepage_text">
+ Página web:
+ </text>
+ <check_box label="Mostrar nos resultados de busca" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Minha conta:"/>
+ <text name="my_account_link" value="[[URL] Abrir meu painel]"/>
+ <text name="acc_status_text" value="Residente. Dados de pagamento: não constam"/>
+ <text name="title_partner_text" value="Parceiro(a):"/>
+ <text name="partner_edit_link" value="[[URL] Editar]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Salvar alterações" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shape.xml b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
new file mode 100644
index 0000000000..6a03c2e2ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Sexo:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Feminino" name="radio"/>
+ <radio_item label="Masculino" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corpo"/>
+ <accordion_tab name="shape_head_tab" title="Cabeça"/>
+ <accordion_tab name="shape_eyes_tab" title="Olhos"/>
+ <accordion_tab name="shape_ears_tab" title="Orelhas"/>
+ <accordion_tab name="shape_nose_tab" title="Nariz"/>
+ <accordion_tab name="shape_mouth_tab" title="Boca"/>
+ <accordion_tab name="shape_chin_tab" title="Queixo"/>
+ <accordion_tab name="shape_torso_tab" title="Tronco"/>
+ <accordion_tab name="shape_legs_tab" title="Pernas"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
new file mode 100644
index 0000000000..e9d4207e49
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="tecido" name="Fabric" tool_tip="Clique para escolher uma foto"/>
+ <color_swatch label="Cor/Matiz" name="Color/Tint" tool_tip="Clique para abrir o selecionador de cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camisa"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
new file mode 100644
index 0000000000..79cb641079
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Sapatos"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
new file mode 100644
index 0000000000..e3caf9f6f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuagens na cabeça" name="Head Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem parte de cima" name="Upper Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem de baixo" name="Lower Tattoos" tool_tip="Selecionar imagem"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Cor da pele"/>
+ <accordion_tab name="skin_face_tab" title="Detalhe do rosto"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquilagem"/>
+ <accordion_tab name="skin_body_tab" title="Detalhe do corpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
new file mode 100644
index 0000000000..00ec0691ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Saia"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
new file mode 100644
index 0000000000..88abc74716
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Meias"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..c11d800171
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatoo de cabeça" name="Head Tattoo" tool_tip="Clique para escolher uma foto"/>
+ <texture_picker label="Tatoo da parte superior do corpo" name="Upper Tattoo" tool_tip="Clique para escolher uma foto"/>
+ <texture_picker label="Tatoo da parte inferior do corpo" name="Lower Tattoo" tool_tip="Clique para escolher uma foto"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
new file mode 100644
index 0000000000..10c34a1c0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Roupa de baixo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..fb7b919365
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
new file mode 100644
index 0000000000..b85d481941
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Vestível" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Editando forma
+ </string>
+ <string name="edit_skin_title">
+ Editando pele
+ </string>
+ <string name="edit_hair_title">
+ Editando cabelo
+ </string>
+ <string name="edit_eyes_title">
+ Editando os olhos
+ </string>
+ <string name="edit_shirt_title">
+ Editando camisa
+ </string>
+ <string name="edit_pants_title">
+ Editando calças
+ </string>
+ <string name="edit_shoes_title">
+ Editando sapatos
+ </string>
+ <string name="edit_socks_title">
+ Editando meias
+ </string>
+ <string name="edit_jacket_title">
+ Editando jaqueta
+ </string>
+ <string name="edit_skirt_title">
+ Editando saia
+ </string>
+ <string name="edit_gloves_title">
+ Editando luvas
+ </string>
+ <string name="edit_undershirt_title">
+ Editando camiseta
+ </string>
+ <string name="edit_underpants_title">
+ Editando roupa de baixo
+ </string>
+ <string name="edit_alpha_title">
+ Editando máscara Alpha
+ </string>
+ <string name="edit_tattoo_title">
+ Editando tatuagem
+ </string>
+ <string name="shape_desc_text">
+ Forma:
+ </string>
+ <string name="skin_desc_text">
+ Pele:
+ </string>
+ <string name="hair_desc_text">
+ Cabelo:
+ </string>
+ <string name="eyes_desc_text">
+ Olhos:
+ </string>
+ <string name="shirt_desc_text">
+ Camisa:
+ </string>
+ <string name="pants_desc_text">
+ Calças:
+ </string>
+ <string name="shoes_desc_text">
+ Sapatos:
+ </string>
+ <string name="socks_desc_text">
+ Meias:
+ </string>
+ <string name="jacket_desc_text">
+ Jaqueta:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Saia:
+ </string>
+ <string name="gloves_desc_text">
+ Luvas:
+ </string>
+ <string name="undershirt_desc_text">
+ Camiseta:
+ </string>
+ <string name="underpants_desc_text">
+ Roupa de baixo:
+ </string>
+ <string name="alpha_desc_text">
+ Máscara alpha:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuagem:
+ </string>
+ <text name="edit_wearable_title" value="Editando forma"/>
+ <panel label="Camisa" name="wearable_type_panel">
+ <text name="description_text" value="Forma:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Salvar como" name="save_as_button"/>
+ <button label="Reverter" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_friends.xml b/indra/newview/skins/default/xui/pt/panel_friends.xml
index d430d637ad..1bf7986825 100644
--- a/indra/newview/skins/default/xui/pt/panel_friends.xml
+++ b/indra/newview/skins/default/xui/pt/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Múltiplos amigos...
+ Diversos amigos
</string>
<scroll_list name="friend_list" tool_tip="Aperte shift ou control enquanto clica para selecionar múltiplos amigos">
<column name="icon_online_status" tool_tip="Status Online"/>
@@ -11,10 +11,10 @@
<column name="icon_edit_mine" tool_tip="Amigo pode editar, apagar ou pegar seus objetos"/>
<column name="icon_edit_theirs" tool_tip="Você pode editar os objetos deste amigo"/>
</scroll_list>
- <button width="86" label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea"/>
- <button width="86" label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações"/>
- <button width="86" label="Teletransp..." name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual"/>
- <button width="86" label="Pagar..." name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo"/>
- <button width="86" label="Remover..." name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos"/>
- <button width="86" label="Adicionar..." name="add_btn" tool_tip="Oferecer amizade a um residente"/>
+ <button label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea" width="86"/>
+ <button label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações" width="86"/>
+ <button label="Teletransportar" name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual" width="86"/>
+ <button label="Pagar" name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo" width="86"/>
+ <button label="Tirar" name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos" width="86"/>
+ <button label="Adicionar" name="add_btn" tool_tip="Oferecer amizade a um residente" width="86"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
new file mode 100644
index 0000000000..9dc53d54eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <button label="Perfil do grupo" name="group_info_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Ligar para o grupo" name="call_btn"/>
+ <button label="Desligar" name="end_call_btn"/>
+ <button label="Abrir controles de voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_general.xml b/indra/newview/skins/default/xui/pt/panel_group_general.xml
index 226011c138..6ff4f82ba7 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_general.xml
@@ -1,70 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_tab">
- <string name="help_text">
- A aba Geral contém informações gerais sobre este grupo, a lista dos donos e membros visíveis, preferências gerais do grupo e opções dos membros. Passe o mouse sobre as opções para mais ajuda.
- </string>
- <string name="group_info_unchanged">
- Informações gerais do grupo foram modificadas
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Digite o nome do seu novo grupo aqui" name="group_name_editor"/>
- <text name="group_name">
- Digite o nome do seu novo grupo aqui
- </text>
- <text name="prepend_founded_by">
- Fundado por:
- </text>
- <text name="founder_name" left_delta="74" >
- (espera)
- </text>
- <text name="group_charter_label">
- Declaração do Grupo
- </text>
- <texture_picker label="Insígnia do Grupo" name="insignia" tool_tip="Clique para escolher uma imagem"/>
+ <panel.string name="help_text">
+ A guia Geral contém informações gerais sobre o grupo, uma lista de membros, preferências do grupo e opções para membros.
+
+Para obter mais ajuda, passe o mouse sobre as opções.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Informações gerais do grupo modificadas.
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando dados do membro
+ </panel.string>
<text_editor name="charter">
Declaração do grupo
</text_editor>
- <button label="Unir (L$0)" label_selected="Unir (L$0)" name="join_button"/>
- <button label="Vista detalhada" label_selected="Vista detalhada" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Proprietários &amp; Membros visíveis
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Proprietários são mostrados em negrito )
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nome do membro" name="name"/>
+ <name_list.columns label="Membro" name="name"/>
<name_list.columns label="Título" name="title"/>
- <name_list.columns label="Último login" name="online"/>
</name_list>
- <text name="text_group_preferences">
- Preferências do Grupo
+ <text name="active_title_label">
+ Meu cargo
</text>
+ <combo_box name="active_title" tool_tip="Define o cargo que é exibido com o nome do seu avatar quando o grupo está ativo."/>
+ <check_box label="Receber avisos do grupo" name="receive_notices" tool_tip="Define o seu recebimento de avisos deste grupo. Desmarque esta opção se o grupo envia spam."/>
+ <check_box label="Mostrar no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja incluir este grupo no seu perfil."/>
<panel name="preferences_container">
- <check_box label="Mostre na busca" name="show_in_group_list" tool_tip="Deixe as pessoas verem este grupo nos resultados de busca."/>
- <check_box label="Adesão aberta" name="open_enrollement" tool_tip="Definir se este grupo permite que novos membros entrem sem serem convidados"/>
- <check_box label="Taxa de adesão:" name="check_enrollment_fee" tool_tip="Define se é necessária uma taxa de adesão para se unir ao grupo."/>
- <spinner width="60" left_delta="120" name="spin_enrollment_fee" tool_tip="Os novos membros devem pagar esta taxa para se unir ao grupo quando a Taxa de Adesão está marcada."/>
- <combo_box width="170" name="group_mature_check" tool_tip="Define se a informação do seu grupo é considerada mature.">
- <combo_box.item name="select_mature" label="- Selecionar Maturidade -"/>
- <combo_box.item name="mature" label="Conteúdo Mature"/>
- <combo_box.item name="pg" label="Conteúdo PG"/>
+ <check_box label="Adesão aberta" name="open_enrollement" tool_tip="Controla a entrada de novos membros, com ou sem convite."/>
+ <check_box label="Taxa de associação" name="check_enrollment_fee" tool_tip="Controla a cobrança de uma taxa de associação ao grupo."/>
+ <spinner label="L$" left_delta="120" name="spin_enrollment_fee" tool_tip="Se a opção &apos;Taxa de associação&apos; estiver marcada, novos membros precisam pagar o valor definido para entrar no grupo." width="60"/>
+ <combo_box name="group_mature_check" tool_tip="Define se a informação do seu grupo é considerada mature." width="170">
+ <combo_box.item label="Conteúdo PG" name="pg"/>
+ <combo_box.item label="Conteúdo Mature" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Meu título ativo
- </text>
- <combo_box name="active_title" tool_tip="Define o título que aparece em seu avatar quando o grupo estiver ativo."/>
- </panel>
- <check_box label="Receber notícias do grupo" name="receive_notices" tool_tip="Define se Você deseja receber notícias deste grupo. Desmarque esta caixa se o grupo está lhe fazendo spam."/>
- <check_box label="Listar grupo no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja listar este grupo no seu Perfil"/>
+ <check_box initial_value="true" label="Mostre na busca" name="show_in_group_list" tool_tip="Incluir o grupo nos resultados de busca"/>
</panel>
- <string name="incomplete_member_data_str">
- Recuperando dados do membro
- </string>
- <string name="confirm_group_create_str">
- Criar este grupo irá custar L$100.
-Você está realmente, realmente, REALMENTE seguro que deseja gastar L$100 para criar este grupo?
-Esteja consciente de que se ninguém mais se juntar a este grupo dentro de 48 horas, este será dissolvido e o nome não estará disponível para uso futuro.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..c547e4c646
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sobre o grupo" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ As mudanças feitas nesta guia ainda não foram salvas
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Deseja salvar essas mudanças?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Entrar (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Grátis
+ </panel.string>
+ <text name="group_name" value="Carregando..."/>
+ <line_editor label="Digite o nome do grupo aqui" name="group_name_editor"/>
+ <texture_picker label="" name="insignia" tool_tip="Selecionar imagem"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(pesquisando)" name="founder_name"/>
+ <text name="join_cost_text">
+ Grátis
+ </text>
+ <button label="ENTRAR AGORA!" name="btn_join"/>
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Público geral"/>
+ <accordion_tab name="group_roles_tab" title="Cargos"/>
+ <accordion_tab name="group_notices_tab" title="Avisos"/>
+ <accordion_tab name="group_land_tab" title="Terrenos/Bens"/>
+ </accordion>
+ <panel name="button_row">
+ <button label="Crie" label_selected="Novo grupo" name="btn_create"/>
+ <button label="Salvar" label_selected="Salvar" name="btn_apply"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_invite.xml b/indra/newview/skins/default/xui/pt/panel_group_invite.xml
index a02a17139b..4ed1b950a4 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_invite.xml
@@ -1,23 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Convidar um membro" name="invite_panel" width="224">
+ <panel.string name="confirm_invite_owner_str">
+ Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente!
+ </panel.string>
+ <panel.string name="loading">
+ (carregando...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Alguns avatares já estão nesse grupo e portanto não foram convidados.
+ </panel.string>
<text name="help_text" width="214">
Voce pode selecionar vários residentes
para convidar ao seu grupo. Clique
&apos;Abrir Seletor de Residente&apos; para iniciar.
</text>
<button label="Abrir Seletor de Residente" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Mantenha apertada a tecla Control e clique nos nomes dos residentes para uma seleção múltipla."/>
- <button left_delta="-7" width="214" label="Remove os selecionados acima da lista" name="remove_button" tool_tip="Remove os residentes selecionados acima da lista de convite."/>
+ <name_list name="invitee_list" tool_tip="Pressione Ctrl enquanto clica nos nomes dos residentes"/>
+ <button label="Remove os selecionados acima da lista" left_delta="-7" name="remove_button" tool_tip="Exclui os residentes selecionados acima da lista de convidados" width="214"/>
<text name="role_text">
Escolha que Função atribuir a eles:
</text>
- <combo_box name="role_name" tool_tip="Escolha a partir da lista de Funções autorizadas a você para inclusão de membros."/>
+ <combo_box name="role_name" tool_tip="Selecione o cargo da lista de cargos que você pode designar a membros"/>
<button label="Mandar convites" name="ok_button"/>
<button label="Cancelar" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente!
- </string>
- <string name="loading">
- (carregando...)
+ <string name="GroupInvitation">
+ Convite
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
index 5b09363e3c..aa7c7de75f 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terra &amp; L$" name="land_money_tab">
<string name="help_text">
- Lotes pertencentes ao grupo são listados adiante, com os detalhes de contribuição. Um aviso aparece até que o Total de Terra em Uso seja menor ou igual à Contribuição Total. As abas de Planejamento, Detalhes e Vendas fornecem informações sobre as finanças do grupo.
+ Será exibido um aviso até o Total de terrenos usados for igual ou inferior à contribuição total.
</string>
<button label="?" name="help_button"/>
<string name="cant_view_group_land_text">
- Você não tem permissão para ver as terras pertencentes ao grupo.
+ Você não está autorizado a acessar terrenos de grupos
</string>
<string name="cant_view_group_accounting_text">
- Você não tem permissão para ver as informações sobre as contas do grupo.
+ Você não está autorizado a acessar os dados de contabilidade do grupo.
</string>
<string name="loading_txt">
Carregando...
@@ -17,68 +17,67 @@
Terra percentente ao grupo
</text>
<scroll_list name="group_parcel_list">
- <column label="Nome do Lote" name="name"/>
+ <column label="Lote" name="name"/>
<column label="Região" name="location"/>
<column label="Tipo" name="type"/>
<column label="Ãrea" name="area"/>
</scroll_list>
- <button label="Mostrar no Mapa" label_selected="Mostrar no Mapa" name="map_button" left="282" width="130"/>
+ <button label="Mapa" label_selected="Mapa" left="282" name="map_button" width="130"/>
<text name="total_contributed_land_label">
- Contribuição Total:
+ Total contribuído:
</text>
<text name="total_contributed_land_value">
[AREA] m²
</text>
<text name="total_land_in_use_label">
- Total de Terra em Uso:
+ Total em uso:
</text>
<text name="total_land_in_use_value">
[AREA] m²
</text>
<text name="land_available_label">
- Terra Disponível:
+ Disponíveis:
</text>
<text name="land_available_value">
[AREA] m²
</text>
<text name="your_contribution_label">
- Sua Contribuição:
+ Sua contribuição:
</text>
<string name="land_contrib_error">
- Não é possível definir sua contribuição para o terreno.
+ Não foi possível definir sua contribuição
</string>
<text name="your_contribution_units">
- ( m² )
+ m²
</text>
<text name="your_contribution_max_value">
- ([AMOUNT] máxima)
+ ([AMOUNT] max)
</text>
<text name="group_over_limit_text">
- Membros do grupo precisam contribuir com mais créditos de Terra para
-garantir a terra em uso.
+ O terreno em uso requer mais créditos
</text>
<text name="group_money_heading">
Grupo L$
</text>
<tab_container name="group_money_tab_container">
- <panel label="Planejamento" name="group_money_planning_tab">
+ <panel label="PLANEJAMENTO" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Computando..
+ Carregando...
</text_editor>
</panel>
- <panel label="Detalhes" name="group_money_details_tab">
+ <panel label="DETALHES" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Computando...
+ Carregando...
</text_editor>
- <button label="&lt; Mais Cedo" label_selected="&lt; Cedo" name="earlier_details_button" tool_tip="Voltar no Tempo"/>
- <button label="Mais Tarde &gt;" label_selected="Tarde &gt;" name="later_details_button" tool_tip="Adiantar o Tempo"/>
+ <button label="&lt; Mais Cedo" label_selected="&lt; Cedo" name="earlier_details_button" tool_tip="Atrás"/>
+ <button label="Mais Tarde &gt;" label_selected="Tarde &gt;" name="later_details_button" tool_tip="Próximo"/>
</panel>
- <panel label="Vendas" name="group_money_sales_tab">
+ <panel label="VENDAS" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Computando...
+ Carregando...
</text_editor>
- <button label="&lt; Mais Cedo" label_selected="&lt; Mais Cedo" name="earlier_sales_button" tool_tip="Voltar no Tempo"/>
- <button label="Mais Tarde &gt;" label_selected="Mais Tarde &gt;" name="later_sales_button" tool_tip="Adiantar o Tempo"/>
+ <button label="&lt; Mais Cedo" label_selected="&lt; Mais Cedo" name="earlier_sales_button" tool_tip="Atrás"/>
+ <button label="Mais Tarde &gt;" label_selected="Mais Tarde &gt;" name="later_sales_button" tool_tip="Próximo"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml
new file mode 100644
index 0000000000..c9fd7cdfe3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Desconhecido"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
index d5c0f01e33..66252a0473 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -1,58 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Notícias" name="notices_tab">
- <text name="help_text">
+ <panel.string name="help_text">
As notícias são uma maneira rápida de comunicar-se através de um grupo transmitindo uma mensagem e entregando um item anexo, opcionalmente. As notícias vão apenas a membros do grupo que têm a função habilitada para receber notícias. Você pode desligar Notícias na aba Geral.
- </text>
- <text name="no_notices_text">
- Não existem notícias anteriores.
- </text>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Arquivo de notícias do grupo
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Não há nenhum aviso antigo
+ </panel.string>
<text name="lbl2">
- As notícias são mantidas por 14 dias.
-Listas de aviso estão limitadas a 200 por grupo, diariamente.
+ Cada aviso é armazenado por 14 dias.
+Cada grupo pode enviar no máximo 200 avisos/dia
</text>
<scroll_list name="notice_list">
- <column label="Assunto" name="subject"/>
- <column label="Para" name="from"/>
- <column label="Data" name="date"/>
+ <scroll_list.columns label="Assunto" name="subject"/>
+ <scroll_list.columns label="Para" name="from"/>
+ <scroll_list.columns label="Data" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Nenhum encontrado.
+ Nenhum resultado foi encontrado.
</text>
- <button label="Criar nova notícia" label_selected="Criar nova notícia" name="create_new_notice"/>
- <button label="Atualizar" label_selected="Atualizar Lista" name="refresh_notices"/>
+ <button label="Criar um novo aviso" label_selected="Criar nova notícia" name="create_new_notice" tool_tip="Criar um novo aviso"/>
+ <button label="Atualizar" label_selected="Atualizar Lista" name="refresh_notices" tool_tip="Atualizar lista de avisos"/>
<panel label="Criar nova notícia" name="panel_create_new_notice">
<text name="lbl">
Criar uma notícia
</text>
- <text name="lbl2">
- Você pode adicionar um item simples à notícia, arrastando-o do seu Inventário para o painel. Itens anexados devem ser copiáveis e transferíveis e você não pode mandar uma pasta.
- </text>
- <text name="lbl3" left="20">
+ <text left="20" name="lbl3">
Assunto:
</text>
- <line_editor name="create_subject" width="251" left_delta="61"/>
- <text name="lbl4" left="15" width="60">
+ <line_editor left_delta="61" name="create_subject" width="251"/>
+ <text left="15" name="lbl4" width="60">
Mensagem:
</text>
- <text_editor name="create_message" left_delta="66" width="330"/>
+ <text_editor left_delta="66" name="create_message" width="330"/>
<text name="lbl5" width="68">
Anexo:
</text>
- <line_editor name="create_inventory_name" width="190" left_delta="74"/>
- <button label="Remover o anexo" label_selected="Remover o anexo" name="remove_attachment"/>
+ <line_editor left_delta="74" name="create_inventory_name" width="190"/>
+ <text name="string">
+ Arrastar e soltar o item aqui para anexá-lo:
+ </text>
+ <button label="Tirar" label_selected="Remover o anexo" name="remove_attachment"/>
<button label="Enviar" label_selected="Enviar" name="send_notice"/>
- <panel name="drop_target" tool_tip="Arraste um item do inventário para dentro da caixa de mensagem para enviá-lo com a notícia. Você deve ter permissão para copiar e transferir o objeto, para enviá-lo com a notícia."/>
+ <group_drop_target name="drop_target" tool_tip="Arrastar um item do inventário para a caixa para enviá-lo com o aviso. É preciso ter autorização de cópia e transferência do item para anexá-lo ao aviso."/>
</panel>
<panel label="Visualizar Notícia Anterior" name="panel_view_past_notice">
<text name="lbl">
Notícia arquivada
</text>
<text name="lbl2">
- Para enviar uma notícia nova, clique no botão &apos;Criar Nova Notícia&apos; acima.
+ Para enviar um novo aviso, clique no botão +
</text>
<text name="lbl3">
Asunto:
@@ -60,6 +56,6 @@ Listas de aviso estão limitadas a 200 por grupo, diariamente.
<text name="lbl4">
Mensagem:
</text>
- <button label="Abrir o anexo" label_selected="Abrir o anexo" name="open_attachment"/>
+ <button label="Abrir anexo" label_selected="Abrir o anexo" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notify.xml b/indra/newview/skins/default/xui/pt/panel_group_notify.xml
new file mode 100644
index 0000000000..5a8ea81074
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Nome do remetente / grupo"/>
+ </panel>
+ <text name="attachment" value="Anexo"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
index 087cf0c107..cf9e9f2b8d 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
@@ -1,146 +1,104 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membros e Funções" name="roles_tab">
- <string name="default_needs_apply_text">
- Existem alterações não aplicadas na sub-aba atual.
- </string>
- <string name="want_apply_text">
- Você quer submeter essas alterações?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Membros e Funções
- </text>
- <text name="static2">
- São atribuídas funções com habilidades aos membros do grupo.
-Estes ajustes podem ser facilmente customizados para uma flexibilidade
-e organização maiores.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Funções
- </text>
- <text name="role_properties_modifiable">
- Selecionar uma função abaixo. Você pode modificar o nome, a descrição
-e o título do membro.
- </text>
- <text name="role_properties_not_modifiable">
- Selecione uma função abaixo para ver suas propriedades, membros e
-habilidades permitidas.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- Você também pode atribuir habilidades à função.
- </text>
- <text name="role_actions_not_modifiable">
- Você pode ver, mas não pode alterar habilidades atribuídas.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Habilidades
- </text>
- <text name="static2">
- Você pode ver a descrição de uma habilidade e quais funções e membros
-podem executar essa habilidade.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ As mudanças feitas nesta guia ainda não foram salvas
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Deseja salvar essas mudanças?
+ </panel.string>
<tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Membros" name="members_sub_tab" tool_tip="Membros">
- <line_editor bottom="127" name="search_text"/>
- <button label="Pesquisar" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <name_list name="member_list" bottom_delta="-105" height="104" >
- <column label="Nome do membro" name="name"/>
- <column label="Tarifa doada" name="donated"/>
- <column label="Último login" name="online"/>
- </name_list>
- <button label="Convidar Novo Membro..." name="member_invite" width="165"/>
- <button label="Ejetar do Grupo" name="member_eject"/>
- <string name="help_text">
+ <panel height="148" label="MEMBROS" name="members_sub_tab" tool_tip="Membros">
+ <panel.string name="help_text">
Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar por membro" name="filter_input"/>
+ <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list.columns label="Membro" name="name"/>
+ <name_list.columns label="Doações" name="donated"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Convidar" name="member_invite" width="165"/>
+ <button label="Ejetar" name="member_eject"/>
</panel>
- <panel height="148" label="Funções" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Busca" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <scroll_list name="role_list" bottom_delta="-104" height="104">
- <column label="Nome da função" name="name"/>
- <column label="Título" name="title"/>
- <column label="Membro" name="members"/>
+ <panel height="148" label="CARGOS" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Cada cargo tem um nome e uma lista das funções que membros designados podem desempenhar.
+ Os membros podem ter um ou mais cargos.
+ Cada grupo pode ter 10 cargos, incluindo Membro e Dono do Grupo.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ As funções &apos;Todos&apos; e &apos;Owners&apos; são especiais e não podem ser apagadas.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtrar por cargo" name="filter_input"/>
+ <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list.columns label="Cargo" name="name"/>
+ <scroll_list.columns label="Título" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Criar nova função..." name="role_create"/>
+ <button label="Adicionar cargo" name="role_create"/>
<button label="Apagar função" name="role_delete"/>
- <string name="help_text">
- As funções têm um título e uma lista de habilidades
-permitidas que os membros podem executar. Os membros poderão ter um ou mais funções.
- Um grupo poderá ter até 10 funções, incluíndo as funções dos membros e do dono do grupo.
- </string>
- <string name="cant_delete_role">
- As funções &apos;todos&apos; e &apos;donos&apos; são especiais e não podem ser deletadas.
- </string>
</panel>
- <panel height="148" label="Habilidades" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Busca" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma habilidade para ver mais detalhes."/>
- <string name="help_text">
+ <panel height="148" label="FUNÇÕES" name="actions_sub_tab" tool_tip="Você pode ver a descrição de uma função e quais cargos e membros podem desempenhá-la.">
+ <panel.string name="help_text">
As habilidades permitem que os membros nas funções façam coisas específicas dentro do grupo.
Há uma grande variedade de habilidades.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar por função" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma função para ver mais detalhes"/>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
- Funções atribuídas
+ Membros atribuídos
</text>
<text name="static2">
Habilidades permitidas
</text>
- <scroll_list name="member_allowed_actions" tool_tip="Para detalhes de cada habilidade permitida, veja a aba Habilidades."/>
+ <scroll_list name="member_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
<panel name="roles_footer">
<text name="static">
- Nome
- </text>
- <text name="static2">
- Descrição
+ Nome da função
</text>
<line_editor name="role_name">
Empregados
</line_editor>
<text name="static3">
- Título
+ Título da função
</text>
<line_editor name="role_title">
(esperando)
</line_editor>
+ <text name="static2">
+ Descrição
+ </text>
<text_editor name="role_description">
(esperando)
</text_editor>
<text name="static4">
- Membros atribuídos
+ Cargos desempenhados
</text>
+ <check_box label="Revelar membros" name="role_visible_in_list" tool_tip="Define se os membros dessa função são visíveis na guia geral para pessoas de fora do grupo."/>
<text name="static5" tool_tip="Uma lista de habilidades que a função selecionada atualmente pode executar.">
Habilidades permitidas
</text>
- <check_box label="Membros estão visíveis" name="role_visible_in_list" tool_tip="Selecione se os membros desta função estarão visíveis na aba Diversos, para as pessoas de fora do grupo."/>
- <scroll_list name="role_allowed_actions" tool_tip="Para ver detalhes de cada habilidade permitida, veja a aba correspondente."/>
+ <scroll_list name="role_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
<panel name="actions_footer">
<text name="static">
- Descrição
+ Descrição da função
</text>
<text_editor name="action_description">
Essa habilidade permite tirar alguem do grupo. Somente o dono do grupo poderá retirar outro dono do grupo.
</text_editor>
<text name="static2">
- Funções com habilidades
+ Cargos com esta função
</text>
<text name="static3">
- Membros com habilidades
+ Membros com esta função
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
new file mode 100644
index 0000000000..f7102f2fb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <text name="avatar_name" value="Desconhecido"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Compartilhar" name="share_btn"/>
+ <panel name="panel_call_buttons">
+ <button label="Ligar" name="call_btn"/>
+ <button label="Desligar" name="end_call_btn"/>
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_landmark_info.xml b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml
new file mode 100644
index 0000000000..97e7f51beb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Criar Landmark"/>
+ <string name="title_edit_landmark" value="Editar Landmark"/>
+ <string name="title_landmark" value="Landmark"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(desconhecido)"/>
+ <string name="public" value="(público)"/>
+ <string name="server_update_text">
+ Informação do lugar não disponível sem atualização do servidor.
+ </string>
+ <string name="server_error_text">
+ Informações sobre esta localização não está disponível neste momento, por favor, tente novamente mais tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Informações sobre esta localização está indisponível devido a restrições de acesso. Por favor, verifique as permissões com o proprietário da parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Perfil do Lugar"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="desconhecido"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Proprietário:"/>
+ <text name="creator_label" value="Criador:"/>
+ <text name="created_label" value="Criado:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Título:"/>
+ <text name="notes_label" value="Minhas notas:"/>
+ <text name="folder_label" value="Localização da Landmark:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_landmarks.xml b/indra/newview/skins/default/xui/pt/panel_landmarks.xml
new file mode 100644
index 0000000000..693905e04c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barra &apos;Destaques&apos;"/>
+ <accordion_tab name="tab_landmarks" title="Marcos"/>
+ <accordion_tab name="tab_inventory" title="Meu inventário"/>
+ <accordion_tab name="tab_library" title="Biblioteca"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <button name="add_btn" tool_tip="Adicionar marco"/>
+ <dnd_button name="trash_btn" tool_tip="Excluir marco selecionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index c6f1433440..3540a338ea 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,31 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <text name="first_name_text">
- Primeiro nome:
- </text>
- <text name="last_name_text">
- Sobrenome:
- </text>
- <text name="password_text">
- Senha:
- </text>
- <text name="start_location_text">
- Posição inicial:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Minha casa" />
- <combo_box.item name="MyLastLocation" label="Minha última localização" />
- <combo_box.item name="Typeregionname" label="&lt; Digite o nome da região &gt;" />
- </combo_box>
- <check_box label="Lembrar senha" name="remember_check"/>
- <button label="Entrar" label_selected="Entrar" name="connect_btn"/>
- <text name="create_new_account_text">
- Registrar-se para uma conta
- </text>
- <text name="forgot_password_text" left="-240" width="230">
- Esqueceu seu nome de usuário ou senha?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=pt
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ Primeiro nome:
+ </text>
+ <line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <line_editor label="Sobrenome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <check_box label="Lembrar" name="remember_check"/>
+ <text name="start_location_text">
+ Começar em:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Minha casa" name="MyHome"/>
+ </combo_box>
+ <button label="conectar" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Cadastre-se
+ </text>
+ <text name="login_help">
+ Precisa de ajuda ao conectar?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
new file mode 100644
index 0000000000..1bc080886d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Coisas" name="main inventory panel">
+ <panel.string name="Title">
+ Coisas
+ </panel.string>
+ <filter_editor label="Filtro" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Todos os itens" name="All Items"/>
+ <inventory_panel label="Itens recentes" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <button name="add_btn" tool_tip="Adicionar novo item"/>
+ <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Arquivo" name="File">
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nova janela" name="New Window"/>
+ <menu_item_call label="Mostrar filtros" name="Show Filters"/>
+ <menu_item_call label="Restabelecer filtros" name="Reset Current"/>
+ <menu_item_call label="Fechar todas as pastas" name="Close All Folders"/>
+ <menu_item_call label="Esvaziar lixeira" name="Empty Trash"/>
+ <menu_item_call label="Esvaziar achados e perdidos" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Crie" name="Create">
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova nota" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova silhueta" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Classificar" name="Sort">
+ <menu_item_check label="Por nome" name="By Name"/>
+ <menu_item_check label="Por data" name="By Date"/>
+ <menu_item_check label="Pastas sempre por nome" name="Folders Always By Name"/>
+ <menu_item_check label="Pastas do sistema no topo" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_me.xml b/indra/newview/skins/default/xui/pt/panel_me.xml
new file mode 100644
index 0000000000..c3fda2e886
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Meu perfil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="DESTAQUES" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
new file mode 100644
index 0000000000..9815b8d0b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Público geral" name="Media Settings General">
+ <text name="home_label">
+ Página web:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Esta página não atende à lista de páginas aprovadas)
+ </text>
+ <line_editor name="home_url" tool_tip="Website desta mídia"/>
+ <text name="preview_label">
+ Visualizar
+ </text>
+ <text name="current_url_label">
+ Página atual:
+ </text>
+ <text name="current_url" tool_tip="Website desta mídia" value=""/>
+ <button label="Redefinir" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Loop contínuo" name="auto_loop"/>
+ <check_box initial_value="false" label="Interagir no primeiro clique" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
+ <check_box initial_value="false" label="Mídia auto-executável" name="auto_play"/>
+ <text name="media_setting_note">
+ Nota: Residentes podem redefinir a configuração.
+ </text>
+ <check_box initial_value="false" label="Dimensionamento automático na frente do objeto" name="auto_scale"/>
+ <text name="size_label">
+ Tamanho:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..009dd0d752
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Customizar" name="Media settings for controls">
+ <text name="controls_label">
+ Controles:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Padrão
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_group_control"/>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
new file mode 100644
index 0000000000..adc93cc2f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Segurança" name="Media Settings Security">
+ <check_box initial_value="false" label="Acesso restrito a URLs especificados (pelo prefixo)" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ URLs com falha de acesso na página inicial são indicados com um:
+ </text>
+ <button label="Adicionar" name="whitelist_add"/>
+ <button label="Excluir" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Aviso: A página inicial especificada na aba Geral não consta na lista de acesso. Seu acesso será autorizado quando a lista for retificada.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_my_profile.xml b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
new file mode 100644
index 0000000000..8fd30873a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="no_partner_text" value="Nenhum"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Página web:
+ </text>
+ <text name="title_member_text" value="Membro desde:"/>
+ <text name="title_acc_status_text" value="Conta:"/>
+ <text name="acc_status_text" value="Residente. Dados de pagamento: não constam"/>
+ <text name="title_partner_text" value="Parceiro(a):"/>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Adicionar amigo" name="add_friend"/>
+ <button label="MI" name="im"/>
+ <button label="Ligar" name="call"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Teletransportar" name="teleport"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
+ <button label="Editar aparência" name="edit_appearance_btn" tool_tip="Criar/editar aparência: corpo, roupa, etc."/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
new file mode 100644
index 0000000000..49e1d916c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <button name="back_btn" tool_tip="Voltar para região anterior"/>
+ <button name="forward_btn" tool_tip="Avançar uma região"/>
+ <button name="home_btn" tool_tip="Teletransportar para minha casa"/>
+ <location_input label="Onde" name="location_combo"/>
+ <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
+ <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite">
+ <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
new file mode 100644
index 0000000000..bdbf29e70b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ Bate-papo local
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..a8c74d50e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_notes.xml b/indra/newview/skins/default/xui/pt/panel_notes.xml
new file mode 100644
index 0000000000..a5b2542e77
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Anotações e Privacidade" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Minhas anotações privadas:"/>
+ <text name="status_message2" value="Deixar esta pessoa:"/>
+ <check_box label="Ver meu status" name="status_check"/>
+ <check_box label="Ver minha localização no mapa" name="map_check"/>
+ <check_box label="Pegar, editar ou excluir objetos meus" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Adicionar" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
+ <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
+ <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/>
+ <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..98a9be29c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <accordion_tab name="tab_cof" title="Vestimenta atual"/>
+ <accordion_tab name="tab_outfits" title="Minhas vestimentas"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..5ef6edf9ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Substituir look atual" name="wear"/>
+ <menu_item_call label="Adicionar ao look atual" name="add"/>
+ <menu_item_call label="Tirar do look atual" name="remove"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Tirar" name="remove_link"/>
+ <menu_item_call label="Excluir" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
new file mode 100644
index 0000000000..9d71c37c55
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Pessoas" name="people_panel">
+ <string name="no_people" value="Nenhuma pessoa"/>
+ <string name="no_one_near" value="Ninguém por perto"/>
+ <string name="no_friends_online" value="Nenhum amigo online"/>
+ <string name="no_friends" value="Nenhum amigo"/>
+ <string name="no_groups" value="Nenhum grupo"/>
+ <string name="people_filter_label" value="Filtro de pessoas"/>
+ <string name="groups_filter_label" value="Filtro de grupos"/>
+ <filter_editor label="Filtro" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="PROXIMIDADE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opções"/>
+ <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Todos"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opções"/>
+ <button name="add_btn" tool_tip="Oferecer amizade para o residente"/>
+ <button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="GRUPOS" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opções"/>
+ <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/>
+ <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/>
+ </panel>
+ </panel>
+ <panel label="RECENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opções"/>
+ <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/>
+ <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
+ <button label="Chamada" name="call_btn" tool_tip="Chamar este residente"/>
+ <button label="Compartilhar" name="share_btn"/>
+ <button label="Teletransporte" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
+ <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir informação de grupo"/>
+ <button label="Bate- papo de grupo" name="chat_btn" tool_tip="abrir sessão de bate- papo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_pick_info.xml b/indra/newview/skins/default/xui/pt/panel_pick_info.xml
new file mode 100644
index 0000000000..007965a8c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Detalhes do destaque"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[NAME]"/>
+ <text name="pick_location" value="[carregando...]"/>
+ <text name="pick_desc" value="[descrição]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_picks.xml b/indra/newview/skins/default/xui/pt/panel_picks.xml
new file mode 100644
index 0000000000..453954bc3e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Destaques" name="panel_picks">
+ <string name="no_picks" value="Sem destaques"/>
+ <string name="no_classifieds" value="Sem classificados"/>
+ <text name="empty_picks_panel_text">
+ Não ha nenhum destaque/ classificado aqui
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Destaques"/>
+ <accordion_tab name="tab_classifieds" title="Classificados"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Criar um novo destaque ou classificado na localização atual"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Exibir informação de destaque"/>
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área correspondente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir a área correspondente no Mapa Mundi"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
new file mode 100644
index 0000000000..371f7bdb1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Ligar"/>
+ <string name="off" value="Desligar"/>
+ <string name="anyone" value="Todos"/>
+ <string name="available" value="disponível"/>
+ <string name="allocated" value="alocados"/>
+ <string name="title_place" value="Perfil da região"/>
+ <string name="title_teleport_history" value="Localização do histórico de teletransportes"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(Desconhecido)"/>
+ <string name="public" value="(público)"/>
+ <string name="none_text" value="(nenhum)"/>
+ <string name="sale_pending_text" value="(Venda em andamento)"/>
+ <string name="group_owned_text" value="(Propriedade do grupo)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Todos os residentes"/>
+ <string name="group_text" value="Grupo"/>
+ <string name="can_resell">
+ Esta região permite a compra e venda de lotes.
+ </string>
+ <string name="can_not_resell">
+ Esta região não permite a compra e venda de lotes.
+ </string>
+ <string name="can_change">
+ Esta região permite a junção ou subdivisão de lotes.
+ </string>
+ <string name="can_not_change">
+ Esta região não permite a junção ou subdivisão de lotes.
+ </string>
+ <string name="server_update_text">
+ Dados sobre o local requerem atualização do servidor.
+ </string>
+ <string name="server_error_text">
+ Dados sobre o local não disponíveis no momento. Favor tentar mais tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Dados sobre o local controlados por lista de acesso. Verifique se você está autorizado a acessá-los com o dono do lote.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <text name="title" value="Perfil da região"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Proprietário:"/>
+ <text name="maturity_value" value="(Desconhecido)"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Lote">
+ <panel>
+ <text name="rating_label" value="Classificação:"/>
+ <text name="rating_value" value="(Desconhecido)"/>
+ <text name="voice_label" value="Voz:"/>
+ <text name="voice_value" value="Ligar"/>
+ <text name="fly_label" value="Voar:"/>
+ <text name="fly_value" value="Ligar"/>
+ <text name="push_label" value="Push:"/>
+ <text name="push_value" value="Desligar"/>
+ <text name="build_label" value="Construir:"/>
+ <text name="build_value" value="Ligar"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Ligar"/>
+ <text name="damage_label" value="Dano:"/>
+ <text name="damage_value" value="Desligar"/>
+ <button label="Sobre terrenos" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Região">
+ <panel>
+ <text name="region_name_label" value="Região:"/>
+ <text name="region_type_label" value="Tipo:"/>
+ <text name="region_rating_label" value="Classificação:"/>
+ <text name="region_owner_label" value="Proprietário:"/>
+ <text name="region_group_label" value="Grupo:"/>
+ <button label="Região/Propriedade" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Propriedade">
+ <panel>
+ <text name="estate_name_label" value="Propriedade:"/>
+ <text name="estate_rating_label" value="Classificação:"/>
+ <text name="estate_owner_label" value="Proprietário:"/>
+ <text name="covenant_label" value="Contrato:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="À venda">
+ <panel>
+ <text name="sales_price_label" value="Preço:"/>
+ <text name="area_label" value="Ãrea:"/>
+ <text name="traffic_label" value="Trânsito:"/>
+ <text name="primitives_label" value="Prims:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Limite de terraplenagem:"/>
+ <text name="subdivide_label" value="Juntar/subdividir:"/>
+ <text name="resale_label" value="Revenda:"/>
+ <text name="sale_to_label" value="À venda para:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml
new file mode 100644
index 0000000000..5c0f3cd11d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_places.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lugares" name="places panel">
+ <string name="landmarks_tab_title" value="MEUS MARCOS"/>
+ <string name="teleport_history_tab_title" value="HISTÓRICO DE TELETRANSPORTES"/>
+ <filter_editor label="Filtrar lugares" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ <button label="Fechar" name="close_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Salvar" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index 5ca80bd74d..431f3ca8e1 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="advanced">
+ <panel.string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </panel.string>
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <check_box label="Balão de bate-papo" name="bubble_text_chat"/>
+ <color_swatch name="background" tool_tip="Escolha a cor do balão de bate-papo"/>
+ <slider label="Opacidade" name="bubble_chat_opacity"/>
<text name="AspectRatioLabel1" tool_tip="largura / altura">
- Relação de Aspecto:
+ Relação de aspecto
</text>
<combo_box name="aspect_ratio" tool_tip="largura / altura">
<combo_box.item label="4:3 (CRT Padrão)" name="item1"/>
@@ -9,4 +18,31 @@
<combo_box.item label="8:5 (tela ampla)" name="item3"/>
<combo_box.item label="16:9 (tela ampla)" name="item4"/>
</combo_box>
+ <check_box label="Auto-detectar" name="aspect_auto_detect"/>
+ <text name="heading1">
+ Câmera:
+ </text>
+ <slider label="Ângulo de visão" name="camera_fov"/>
+ <slider label="Distância" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posicionamento automático da:
+ </text>
+ <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/>
+ <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/>
+ <text name="heading3">
+ Avatares:
+ </text>
+ <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/>
+ <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
+ <check_box label="Mover os lábios do avatar quando estiver falando" name="enable_lip_sync"/>
+ <check_box label="Mostrar erros de script" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="No bate papo" name="0"/>
+ <radio_item label="Em uma janela" name="1"/>
+ </radio_group>
+ <check_box label="Alternar para o modo microfone quando eu pressionar a tecla de falar:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Quando em modo de alternância, o microfone só transmite sua enquanto o botão estiver pressionado."/>
+ <line_editor label="Botao apertar e falar" name="modifier_combo"/>
+ <button label="Definir chave" name="set_voice_hotkey_button"/>
+ <button label="Botão do meio do mouse" name="set_voice_middlemouse_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
index e060d784da..4cb823d432 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
- <text name="dont_show_label">
- Não mostrar estas popups:
+ <text name="tell_me_label">
+ Avisar:
</text>
- <button label="Habilitar esta popup" label_selected="Habilitar este popup" name="enable_popup"/>
- <button label="Habilitar todas as popups..." label_selected="Reiniciar Dialogos que serão mostrados na próxima vez..." name="reset_dialogs_btn" tool_tip="Habilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/>
+ <check_box label="Quando eu gasto ou recebo L$" name="notify_money_change_checkbox"/>
+ <check_box label="Quando meus amigos entram e saem" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Mostrar estas popups:
+ Sempre mostrar esses alertas:
</text>
- <button label="Desabilitar todas estas popups..." name="skip_dialogs_btn" tool_tip="Desabilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/>
- <text name="text_box2">
- Ofertas de notecards, texturas e landmarks:
+ <text name="dont_show_label">
+ Nunca mostrar esses alertas:
</text>
- <check_box label="Aceitar automaticamente" name="accept_new_inventory"/>
- <check_box label="Visualizar automaticamente após aceitar" name="show_new_inventory"/>
- <check_box label="Mostrar automaticamente objetos aceitos recentemente no inventário." name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index aa40f97fe3..d6d8be7dc7 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat" name="chat">
- <text name="text_box">
- Tamanho da Fonte
-do Chat:
- </text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Pequeno" />
- <radio_item name="radio2" label="Médio" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Pequeno" name="radio"/>
+ <radio_item label="Média" name="radio2"/>
+ <radio_item label="Grande" name="radio3"/>
</radio_group>
<color_swatch label="Você" name="user"/>
<text name="text_box1">
- Você
+ Eu
</text>
<color_swatch label="Outros" name="agent"/>
<text name="text_box2">
@@ -37,23 +33,14 @@ do Chat:
<text name="text_box7">
Dono
</text>
- <color_swatch label="Bolha" name="background"/>
- <text name="text_box8">
- Bolha
- </text>
<color_swatch label="URLs" name="links"/>
<text name="text_box9">
URLs
</text>
- <check_box label="Mostrar Erros de Script e avisos como chat comum" name="script_errors_as_chat"/>
- <spinner label="Ocultar Chat depois" label_width="108" name="fade_chat_time" width="160"/>
- <spinner left="373" name="max_chat_count"/>
- <slider label="Opacidade" name="console_opacity"/>
- <check_box label="Use a largura total da tela (Precisa reiniciar)" name="chat_full_width_check"/>
- <check_box label="Feche a barra de conversa após pressionar retornar" name="close_chat_on_return_check"/>
- <check_box label="Teclas de Setas sempre movem o avatar durante a conversa" name="arrow_keys_move_avatar_check"/>
- <check_box label="Mostrar a hora na conversa local" name="show_timestamps_check"/>
- <check_box label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
- <check_box label="Mostrar bolhas do chat" name="bubble_text_chat"/>
- <slider label="Opacidade" name="bubble_chat_opacity"/>
+ <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
+ <check_box label="Envie MIs por email quando eu estiver desconectado" name="send_im_to_email"/>
+ <radio_group name="chat_window" tool_tip="Exibir cada bate-papo em uma janela ou em uma única janela com uma aba para cada pessoa (requer reinício)">
+ <radio_item label="Janelas diferentes" name="radio"/>
+ <radio_item label="Uma janela" name="radio2"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
index 8bde39545c..17f43943c1 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
@@ -1,90 +1,64 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Como padrão, registrar na minha casa." label="Minha Casa"/>
- <combo_box.item name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade." label="Minha Última Localidade"/>
- </combo_box>
- <check_box label="Mostrar Posição Inicial na Tela de Login" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nunca"/>
- <combo_box.item name="Show Temporarily" label="Mostrar Temporariamente"/>
- <combo_box.item name="Always" label="Sempre"/>
- </combo_box>
- <check_box label="Avatar com Nomes Pequenos" name="small_avatar_names_checkbox"/>
- <check_box label="Ocultar meu Nome na minha Tela" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Títulos dos Grupos:
- </text>
- <check_box label="Ocultar todos os Títulos de Grupos" name="show_all_title_checkbox"/>
- <check_box label="Ocultar meu Título no Grupo" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/>
- <text name="UI Size:">
- Tamanho da UI:
+ <text name="language_textbox">
+ Linguagem:
</text>
- <check_box label="Usar escala independente da resolução" name="ui_auto_scale"/>
- <spinner label="Tempo para ficar Ausente:" name="afk_timeout_spinner"/>
- <check_box label="Avisar quando receber ou gastar Linden dollars (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Classificação:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Padrão" name="System Default Language"/>
+ <combo_box.item label="English (Inglês)" name="English"/>
+ <combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Espanhol) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francês) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Holandês) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polonês) - Beta" name="Polish"/>
+ <combo_box.item label="Português - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Reinicie para mostrar o novo idioma)
</text>
<text name="maturity_desired_prompt">
Eu quero acessar conteúdo classificado:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature e Adult"/>
- <combo_box.item name="Desired_Mature" label="PG e Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="PG, Mature e Adult" name="Desired_Adult"/>
+ <combo_box.item label="PG e Mature" name="Desired_Mature"/>
+ <combo_box.item label="PG" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
- Posição Inicial:
+ Ponto de partida:
</text>
- <text name="show_names_textbox">
- Mostrar Nomes:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Minha Última Localidade" name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade."/>
+ <combo_box.item label="Minha Casa" name="MyHome" tool_tip="Como padrão, registrar na minha casa."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar ao entrar" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Mostrar nomes:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Desligar" name="radio"/>
+ <radio_item label="Ligar" name="radio2"/>
+ <radio_item label="Brevemente" name="radio3"/>
+ </radio_group>
+ <check_box label="Mostrar meu nome" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Nomes pequenos" name="small_avatar_names_checkbox"/>
+ <check_box label="Mostrar cargo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Cores para Meus Efeitos:
+ Meus efeitos:
+ </text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/>
+ <text name="title_afk_text">
+ Entrar no modo ausente em:
</text>
+ <spinner label="Tempo para ficar Ausente:" name="afk_timeout_spinner"/>
<text name="seconds_textbox">
segundos
</text>
- <text name="crash_report_textbox">
- Relatórios de Falhas:
- </text>
- <text name="language_textbox">
- Linguagem:
- </text>
- <text name="language_textbox2">
- (Precisa de reinício para efetivar)
+ <text name="text_box3">
+ Mensagem do modo ocupado:
</text>
- <string name="region_name_prompt">
- Digite o nome da Região
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Perguntar antes de enviar"/>
- <combo_box.item name="Alwayssend" label="Sempre enviar"/>
- <combo_box.item name="Neversend" label="Nunca Enviar"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Padrão do Sistema"/>
- <combo_box.item name="English" label="English (Inglês)"/>
- <combo_box.item name="Danish" label="Dansk (Dinamarquês) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Alemão) - Beta"/>
- <combo_box.item name="Spanish" label="Español (Espanhol) - Beta"/>
- <combo_box.item name="French" label="Français (Francês) - Beta"/>
- <combo_box.item name="Italian" label="Italiano - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Holandês) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polonês) - Beta"/>
- <combo_box.item name="Portugese" label="Português - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russo) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinês) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japonês) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coreano) - Beta"/>
- </combo_box>
- <check_box label="Compartilhar a linguagem com objetos" name="language_is_public" tool_tip="Isto permite que os objetos no mundo conheçam sua linguagem preferida."/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
index d7982ab940..252415ae2d 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -1,43 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Gráficos" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Execute Second Life em uma janela" name="windowed mode"/>
- <text_editor bottom="-56" height="40" name="FullScreenInfo" width="480">
- Se desmarcado, o visualizador exibirá tela inteira quando fizer o acesso.
- </text_editor>
- <text name="WindowSizeLabel">
- Tamanho da Janela:
+ <text name="UI Size:">
+ Interface:
</text>
- <combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
- </combo_box>
- <text name="DisplayResLabel">
- Resolução de Display:
- </text>
- <text name="AspectRatioLabel1" tool_tip="largura / altura">
- Relação de Aspecto:
- </text>
- <combo_box name="aspect_ratio" tool_tip="largura / altura">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (CRT Padrão)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (tela ampla)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (tela ampla)" />
- </combo_box>
- <check_box label="Auto-detectar a relação" name="aspect_auto_detect"/>
- <text name="HigherText">
- Qualidade e
- </text>
- <text name="QualityText">
- Performance:
+ <text name="QualitySpeed">
+ Qualidade e velocidade:
</text>
<text name="FasterText">
Mais
rápido
</text>
+ <text name="BetterText">
+ Melhor
+ </text>
<text name="ShadersPrefText">
Baixo
</text>
@@ -50,96 +25,82 @@ rápido
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2">
- Mais alto
- </text>
- <text name="QualityText2">
- Qualidade
- </text>
- <check_box label="Personalizar" left="395" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Sombreadores:
- </text>
- <check_box label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
- <check_box label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
- <check_box label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
- <check_box label="Reflexos de Ãgua" name="Reflections"/>
- <text name="ReflectionDetailText">
- Detalhes de Reflexão:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terreno e Ãrvores" />
- <radio_item name="1" label="Todos os objetos estáticos" />
- <radio_item name="2" label="Todos os avatares e Objetos" />
- <radio_item name="3" label="Tudo" />
- </radio_group>
- <text name="AvatarRenderingText">
- Renderização de Avatar:
- </text>
- <check_box label="Atributos do Avatar" name="AvatarImpostors"/>
- <check_box label="Melhoria de Hardware" name="AvatarVertexProgram"/>
- <check_box label="Vestimenta do Avatar" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Distancia de desenho:" label_width="150" name="DrawDistance" width="255"/>
- <slider label="Contador máx. de partículas:" label_width="150" name="MaxParticleCount" width="262"/>
- <slider label="Qualidade de Pós-processamento:" label_width="178" name="RenderPostProcess" width="223"/>
- <text name="MeshDetailText">
- Detalhes de Malha:
- </text>
- <slider label=" Objetos:" name="ObjectMeshDetail"/>
- <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/>
- <slider label=" Ãrvores:" name="TreeMeshDetail"/>
- <slider label=" Avatares:" name="AvatarMeshDetail"/>
- <slider label=" Terreno:" name="TerrainMeshDetail"/>
- <slider label=" Céu:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Baixo
- </text>
- <text name="ObjectMeshDetailText">
- Baixo
- </text>
- <text name="FlexibleMeshDetailText">
- Baixo
- </text>
- <text name="TreeMeshDetailText">
- Baixo
- </text>
- <text name="AvatarMeshDetailText">
- Baixo
- </text>
- <text name="TerrainMeshDetailText">
- Baixo
- </text>
- <text name="SkyMeshDetailText">
- Baixo
- </text>
- <text name="LightingDetailText">
- Detalhes de Iluminação:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Sol e Lua apenas" />
- <radio_item name="LocalLights" label="Luzes locais nas proximidades" />
- </radio_group>
- <text name="TerrainDetailText">
- Detalhe do Terreno:
- </text>
- <radio_group left_delta="45" name="TerrainDetailRadio" width="276">
- <radio_item name="0" label="Baixo" />
- <radio_item name="2" label="Alto" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Sombreadores:
+ </text>
+ <check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
+ <check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
+ <check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflexos de Ãgua" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Detalhes de Reflexão:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terreno e árvores" name="0"/>
+ <radio_item label="Todos os objetos estáticos" name="1"/>
+ <radio_item label="Todos os avatares e Objetos" name="2"/>
+ <radio_item label="Tudo" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Renderização de Avatar:
+ </text>
+ <check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Vestimenta do Avatar" name="AvatarCloth"/>
+ <slider label="Distancia de desenho:" label_width="150" name="DrawDistance" width="255"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Contador máx. de partículas:" label_width="150" name="MaxParticleCount" width="262"/>
+ <slider label="Qualidade de Pós-processamento:" label_width="178" name="RenderPostProcess" width="223"/>
+ <text name="MeshDetailText">
+ Detalhes de Malha:
+ </text>
+ <slider label=" Objetos:" name="ObjectMeshDetail"/>
+ <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/>
+ <slider label=" Ãrvores:" name="TreeMeshDetail"/>
+ <slider label=" Avatares:" name="AvatarMeshDetail"/>
+ <slider label=" Terreno:" name="TerrainMeshDetail"/>
+ <slider label=" Céu:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Baixo
+ </text>
+ <text name="ObjectMeshDetailText">
+ Baixo
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Baixo
+ </text>
+ <text name="TreeMeshDetailText">
+ Baixo
+ </text>
+ <text name="AvatarMeshDetailText">
+ Baixo
+ </text>
+ <text name="TerrainMeshDetailText">
+ Baixo
+ </text>
+ <text name="SkyMeshDetailText">
+ Baixo
+ </text>
+ <text name="LightingDetailText">
+ Detalhes de Iluminação:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Sol e Lua apenas" name="SunMoon"/>
+ <radio_item label="Luzes locais nas proximidades" name="LocalLights"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Detalhe do Terreno:
+ </text>
+ <radio_group left_delta="45" name="TerrainDetailRadio" width="276">
+ <radio_item label="Baixo" name="0"/>
+ <radio_item label="Alto" name="2"/>
+ </radio_group>
</panel>
- <button label="Configurações Recomendadas" name="Defaults" width="190" left="110"/>
- <button label="Opções de Hardware" label_selected="Opções de Hardware" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+ <button label="Redefinir" left="110" name="Defaults" width="190"/>
+ <button label="Avançado" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
index 84c6c934c8..fc83a0e97a 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
@@ -1,33 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Comunicação" name="im">
- <text name="text_box">
- Minha situação online:
+ <panel.string name="log_in_to_change">
+ autentique-se para mudar
+ </panel.string>
+ <button label="Limpar histórico" name="clear_cache"/>
+ <text name="cache_size_label_l">
+ (Locações, imagens, web, histórico de busca)
</text>
- <check_box label="Apenas meus Amigos e Grupos podem me ver online" name="online_visibility"/>
- <text name="text_box2">
- Opções MI:
+ <check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/>
+ <check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/>
+ <check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/>
+ <check_box label="Aceitar cookies" name="cookies_enabled"/>
+ <check_box label="Permitir toque automático da mídia" name="autoplay_enabled"/>
+ <text name="Logs:">
+ Logs:
</text>
- <string name="log_in_to_change">
- Logar para Alterar
- </string>
- <check_box label="Enviar MI para o e-mail ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Incluir MIs no console do chat" name="include_im_in_chat_console"/>
- <check_box label="Mostrar data e hora na MI" name="show_timestamps_check"/>
- <check_box label="Mostrar notificação de Amigo online" name="friends_online_notify_checkbox"/>
- <text name="text_box3" width="134">
- Resposta no Modo
-Ocupado:
- </text>
- <text name="text_box4">
- Opções de Registro:
- </text>
- <check_box label="Salvar um registro das MIs em meu computador" name="log_instant_messages"/>
- <check_box label="Mostrar a hora nas MIs" name="log_instant_messages_timestamp"/>
- <check_box label="Mostrar o final da última conversa em MI" name="log_show_history"/>
- <check_box label="Salvar um registro da Conversa local em meu computador" name="log_chat"/>
- <check_box label="Mostrar a hora no registro da Conversa local" name="log_chat_timestamp"/>
- <check_box label="Mostrar MIs recebidas no registro de Conversa local" name="log_chat_IM"/>
- <check_box label="Incluir data e hora" name="log_date_timestamp"/>
- <button label="Mudar Local" label_selected="Alterar Caminho" name="log_path_button" width="120"/>
+ <check_box label="Salvar logs de bate- papo das proximidades no meu computador" name="log_nearby_chat"/>
+ <check_box label="Salvar logs de MI no meu computador" name="log_instant_messages"/>
+ <check_box label="Adicionar timestamp" name="show_timestamps_check_im"/>
<line_editor left="278" name="log_path_string" right="-20"/>
+ <text name="log_path_desc">
+ Localização dos logs
+ </text>
+ <button label="Navegar" label_selected="Navegar" name="log_path_button" width="120"/>
+ <button label="Lista dos bloqueados" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index 3c94090131..002b3fa8a7 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -1,33 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Câmera" name="Input panel">
- <text name=" Mouselook Options:">
- Mouselook:
+<panel label="Entrada e câmera" name="Input panel">
+ <button bottom_delta="-40" label="Outros dispositivos" name="joystick_setup_button" width="165"/>
+ <text name="Mouselook:">
+ Visão subjetiva:
</text>
- <text name=" Mouse Sensitivity:">
- Sensibilidade do Mouse:
+ <text name=" Mouse Sensitivity">
+ Sensibilidade do mouse
</text>
- <check_box label="Inverter o Mouse" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Vôo Automático:
+ <check_box label="Inverter" name="invert_mouse"/>
+ <text name="Network:">
+ Rede:
</text>
- <check_box label="Voar/Aterrissar pressionando teclas para cima/baixo" name="automatic_fly"/>
- <text name=" Camera Options:">
- Opções de Câmera:
+ <text name="Maximum bandwidth">
+ Largura de banda máxima
</text>
- <text name="camera_fov_label" width="218">
- Angulo de Visão da Câmera:
+ <text name="text_box2">
+ kbps
</text>
- <slider bottom_delta="-6" width="128" left="360" name="camera_fov" />
- <text name="Camera Follow Distance:" width="218">
- Distância de Acompanhamento da Camêra:
+ <check_box label="Personalizar porta" name="connection_port_enabled"/>
+ <spinner label="Número da porta:" name="web_proxy_port"/>
+ <text name="cache_size_label_l">
+ Tamanho do cache
</text>
- <slider bottom_delta="-6" width="128" left="360" name="camera_offset_scale" />
- <check_box label="Edição automática do movimento da câmera" name="edit_camera_movement" tool_tip="Usar posicionamento automático da câmera quando entrar e sair do modo de edição"/>
- <check_box label="Movimento Automático da Câmera na edição de aparência" name="appearance_camera_movement" tool_tip="Usar posicionamento automático da câmera em modo de edição"/>
- <text name="text2">
- Opções de Exibição
-do Avatar:
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Navegar" label_selected="Navegar" name="set_cache"/>
+ <button label="Redefinir" label_selected="Definir" name="reset_cache"/>
+ <text name="Cache location">
+ Localização do cache
+ </text>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]."/>
+ <radio_item label="Usar meu navegador (IE, Firefox)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado."/>
+ </radio_group>
+ <check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/>
+ <line_editor name="web_proxy_editor" tool_tip="O nome ou endereço IP do proxy da sua preferência"/>
+ <button label="Navegar" label_selected="Navegar" name="set_proxy"/>
+ <text name="Proxy location">
+ Localização do proxy
</text>
- <check_box label="Mostra o avatar em primeira pessoa" name="first_person_avatar_visible"/>
- <button bottom_delta="-40" label="Configuração do Joystick" name="joystick_setup_button" width="165"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
index 5574679cde..37855672c9 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
@@ -1,39 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Ãudio &amp; Vídeo" name="Preference Media panel">
- <slider label="Mestre" name="System Volume"/>
+<panel label="Sons" name="Preference Media panel">
+ <slider label="Volume principal" name="System Volume"/>
+ <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/>
<slider label="Ambiente" name="Wind Volume"/>
- <slider label="Sons" name="SFX Volume"/>
+ <slider label="Botões" name="UI Volume"/>
<slider label="Mídia" name="Media Volume"/>
- <slider label="UI" name="UI Volume"/>
- <slider label="Música" name="Music Volume"/>
+ <slider label="Efeitos sonoros" name="SFX Volume"/>
+ <slider label="Streaming de música" name="Music Volume"/>
+ <check_box label="Voz" name="enable_voice_check"/>
<slider label="Voz" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Bate-papo de Voz nâo está disponível
- </text_editor>
- <check_box label="Habilitar bate-papo de Voz" name="enable_voice_check"/>
+ <text name="Listen from">
+ Ouvir a partir de:
+ </text>
<radio_group name="ear_location">
- <radio_item name="0" label="Ouvir o bate-papo de voz pela posição de câmera" />
- <radio_item name="1" label="Ouvir o bate-papo de voz pela posição do avatar" />
+ <radio_item label="Posição de câmera" name="0"/>
+ <radio_item label="Posição do avatar" name="1"/>
</radio_group>
- <button label="Configurações do dispositivo" name="device_settings_btn" width="180"/>
- <text name="muting_text">
- Volume:
- </text>
- <text name="streaming_prefs_text">
- Preferências de
-Streaming:
- </text>
- <text name="audio_prefs_text">
- Preferências de Ãudio:
- </text>
- <panel label="Volume" name="Volume Panel"/>
- <check_box label="Tocar música em streaming" name="streaming_music"/>
- <check_box label="Tocar streaming de Mídia" name="streaming_video"/>
- <check_box label="Tocar mídia automaticamente" name="auto_streaming_video"/>
- <check_box label="Silenciar Ãudio quando minimizar janela" name="mute_when_minimized"/>
- <slider label="Efeito Doppler" name="Doppler Effect"/>
- <slider label="Fator Distância" name="Distance Factor"/>
- <slider label="Fator Rolloff" name="Rolloff Factor"/>
- <spinner label="Mudar nível de alerta de L$" name="L$ Change Threshold" label_width="165" width="229"/>
- <spinner label="Mudar nível de alerta de Saúde" name="Health Change Threshold" label_width="165" width="229"/>
+ <button label="Controles de entrada/saída" name="device_settings_btn" width="180"/>
+ <panel label="Configuração dos dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Padrão
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Meu volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
+ <text name="wait_text">
+ Aguarde
+ </text>
+ <text name="Output">
+ Saída
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..d8013c974f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <layout_stack name="media_controls">
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL da mídia"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Lista ativada"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Andamento do vídeo"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Silenciar esta mídia"/>
+ <slider name="volume_slider" tool_tip="Volume"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack>
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Carregando mídia"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
new file mode 100644
index 0000000000..a9a5116d3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=pt-BR
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pt
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
+ <string name="no_partner_text" value="Ninguém"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="me_homepage_text">
+ Homepage:
+ </text>
+ <text name="title_member_text" value="Membro desde:"/>
+ <text name="title_acc_status_text" value="Status da conta:"/>
+ <text name="acc_status_text" value="Residente. Nenhuma info de pagamento no arquivo."/>
+ <text name="title_partner_text" value="Parceiro:"/>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ <panel name="profile_buttons_panel">
+ <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade para o residente"/>
+ <button label="MI" name="im" tool_tip="Abrir sessão de Mensagem instantânea"/>
+ <button label="Chamada" name="call" tool_tip="Chamar este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="exibir o residente no mapa"/>
+ <button label="Teletransporte" name="teleport" tool_tip="Oferecer teletransporte"/>
+ <button label="▼" name="overflow_btn" tool_tip="Pagar dinheiro ou compartilhar inventário com o residente"/>
+ </panel>
+ <panel name="profile_me_buttons_panel">
+ <button label="Editar perfil" name="edit_profile_btn"/>
+ <button label="Editar aparência" name="edit_appearance_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
new file mode 100644
index 0000000000..62a16c6fbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Conectado
+ </string>
+ <string name="status_offline">
+ Desconectado
+ </string>
+ <text_editor name="user_name" value="Carregando..."/>
+ <text name="status" value="Conectado"/>
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="DESTAQUES" name="panel_picks"/>
+ <panel label="ANOTAÇÕES E PRIVACIDADE" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
index 4977a1fac9..122cae940c 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Corretagem" name="Covenant">
<text name="estate_section_lbl">
- Propriedade:
+ Propriedade
</text>
<text bottom_delta="-19" name="estate_name_lbl">
Nome:
@@ -22,7 +22,7 @@
Última modificação: Quarta, 31 de dezembro de 1969 às 16:00:00 horas
</text>
<button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-247" height="162" >
+ <text_editor bottom="-247" height="162" name="covenant_editor">
Não há nenhuma regra fornecida para esta Propriedade.
</text_editor>
<button label="Resetar" name="reset_covenant"/>
@@ -30,12 +30,11 @@
As mudanças das regras serão mostradas em todos os lotes
da propriedade.
</text>
- <text bottom_delta="-36" name="covenant_instructions">
- Arraste e solte um notecard, para mudar as Regras desta
- Propriedade.
+ <text bottom_delta="-36" name="covenant_instructions">
+ Arrastar e soltar um notecard para alterar o Covenant para esta propriedade.
</text>
<text bottom_delta="-36" name="region_section_lbl">
- Região:
+ Região
</text>
<text name="region_name_lbl">
Nome:
diff --git a/indra/newview/skins/default/xui/pt/panel_region_debug.xml b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
index 724df20155..2119a06e55 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
@@ -22,18 +22,18 @@
<line_editor name="target_avatar_name">
(nenhum)
</line_editor>
- <button label="Escolher..." name="choose_avatar_btn"/>
+ <button label="Selecionar" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opções:
</text>
- <check_box label="Retornar apenas aqueles objetos que contenham scripts" name="return_scripts" tool_tip="Retornar apenas objetos que contenham scripts."/>
- <check_box label="Retornar apenas aqueles objetos na terra de alguém" name="return_other_land" tool_tip="Retornar apenas objetos que estejam na terra pertencente a alguém"/>
- <check_box label="Retornar objetos em cada região desta propriedade" name="return_estate_wide" tool_tip="Retornar objetos em todas as regiões que constituem esta propriedade"/>
+ <check_box label="Com scripts" name="return_scripts" tool_tip="Só devolver objetos com scripts"/>
+ <check_box label="No terreno de outra pessoa" name="return_other_land" tool_tip="Retornar apenas objetos que estejam na terra pertencente a alguém"/>
+ <check_box label="Em todas as regiões desta propriedade" name="return_estate_wide" tool_tip="Retornar objetos em todas as regiões que constituem esta propriedade"/>
<button label="Retornar" name="return_btn"/>
- <button width="280" label="Pegar os principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos que experimentam as mais potenciais colisões"/>
- <button label="?" name="top_colliders_help" left="297"/>
- <button width="280" label="Pegar Principais Scripts..." name="top_scripts_btn" tool_tip="Lista de objetos gastando mais tempo rodando scripts"/>
- <button label="?" name="top_scripts_help" left="297"/>
+ <button label="Pegar os principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos que experimentam as mais potenciais colisões" width="280"/>
+ <button label="?" left="297" name="top_colliders_help"/>
+ <button label="Pegar Principais Scripts..." name="top_scripts_btn" tool_tip="Lista de objetos gastando mais tempo rodando scripts" width="280"/>
+ <button label="?" left="297" name="top_scripts_help"/>
<button label="Reiniciar a Região" name="restart_btn" tool_tip="Dar 2 minutos de contagem regressiva e reiniciar a região"/>
<button label="?" name="restart_help"/>
<button label="Atrasar o Reinicio" name="cancel_restart_btn" tool_tip="Atrasar o reinicio da região por uma hora"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
index f43402be15..c893472de1 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
@@ -11,7 +11,7 @@ todas as regiões desta propriedade.
(desconhecido)
</text>
<text name="owner_text">
- Proprietário:
+ Proprietário do imóvel:
</text>
<text name="estate_owner">
(desconhecido)
@@ -24,10 +24,10 @@ todas as regiões desta propriedade.
<check_box label="Permitir acesso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Acesso restrito a Residentes...
+ Restringir acesso a contas confirmardas por:
</text>
- <check_box label="com info. de pagamento em arquivo" name="limit_payment" tool_tip="Banir residentes não identificados."/>
- <check_box label="Adultos com idade verificada" name="limit_age_verified" tool_tip="Banir residentes que não tenham confirmado a sua idade. Ver support.secondlife.com para mais informações."/>
+ <check_box label="Dados de pagamento fornecidos" name="limit_payment" tool_tip="Banir residentes sem identificação"/>
+ <check_box label="Verificação de idade" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
<check_box label="Permitir conversa de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir Tele-transporte direto" name="allow_direct_teleport"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_texture.xml b/indra/newview/skins/default/xui/pt/panel_region_texture.xml
index 4787b59a8d..7f37919af2 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Texturas de Chão" name="Textures">
<text name="region_text_lbl">
Região:
@@ -36,22 +36,22 @@
<text name="height_text_lbl9">
Noroeste
</text>
- <spinner label="Baixo" name="height_start_spin_0" />
- <spinner label="Baixo" name="height_start_spin_1" />
- <spinner label="Baixo" name="height_start_spin_2" />
- <spinner label="Baixo" name="height_start_spin_3" />
- <spinner label="Alto" name="height_range_spin_0" />
- <spinner label="Alto" name="height_range_spin_1" />
- <spinner label="Alto" name="height_range_spin_2" />
- <spinner label="Alto" name="height_range_spin_3" />
+ <spinner label="Baixo" name="height_start_spin_0"/>
+ <spinner label="Baixo" name="height_start_spin_1"/>
+ <spinner label="Baixo" name="height_start_spin_2"/>
+ <spinner label="Baixo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Estes valores respresentam o tipo de escala para as texturas acima.
+ Os valores representam o intervalo de mistura das texturas acima.
</text>
<text name="height_text_lbl11">
- Medido em metros, o valor Baixo é a altura máxima da Textura #1,
+ Em metros, o valor BAIXO é a altura MÃXIMA da Textura 1, e HIGH é a altura MÃNIMA da Textura 4.
</text>
<text name="height_text_lbl12">
e o valor Alto é a altura Mínima da Textura #4.
</text>
- <button label="Aplicar" name="apply_btn" />
+ <button label="Aplicar" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
new file mode 100644
index 0000000000..6f022945c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Carregando...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Você não pode ver ou editar o script, uma vez que está definido como &quot;não&quot; copiar &quot;. Você precisa de permissões para ver ou editar um script dentro de um objeto.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Objetos públicos não podem executar scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Executando
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NOME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Carregando...
+ </text_editor>
+ <button label="Salvar" label_selected="Salvar" name="Save_btn"/>
+ <combo_box label="Inserir..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Arquivo" name="File">
+ <menu_item_call label="Salvar" name="Save"/>
+ <menu_item_call label="Reverter todas as alterações" name="Revert All Changes"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="desfazer" name="Undo"/>
+ <menu_item_call label="Refazer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desmarcar" name="Deselect"/>
+ <menu_item_call label="Buscar / Substituir..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Ajuda" name="Help">
+ <menu_item_call label="ajuda..." name="Help..."/>
+ <menu_item_call label="ajuda palavra- chave..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray.xml b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
new file mode 100644
index 0000000000..7892fc9e0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Casa." name="sidebar_home" tab_title="Home">
+ <panel label="casa" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Encontre seus amigos, contatos e pessoas nas proximidades." name="sidebar_people" tab_title="People">
+ <panel_container name="panel_container">
+ <panel label="Info de grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes&amp; Objetos bloqueados" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encontre lugares para ir e lugares que você ja visitou." label="Lugares" name="sidebar_places" tab_title="Places">
+ <panel label="Lugares" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Editar seu perfil público e destaques ." name="sidebar_me" tab_title="My Profile">
+ <panel label="Eu" name="panel_me"/>
+ </sidetray_tab>
+ <sidetray_tab description="Muda sua aparência e visual atual." name="sidebar_appearance" tab_title="My Appearance">
+ <panel label="Editar aparência" name="sidepanel_appearance"/>
+ </sidetray_tab>
+ <sidetray_tab description="Busca no seu inventário." name="sidebar_inventory" tab_title="My Inventory">
+ <panel label="Editar inventário" name="sidepanel_inventory"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..7c06119901
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Bandeja lateral"/>
+ <button name="show_help" tool_tip="Mostrar ajuda"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..05869cf67a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Levantar-se" name="stand_btn" tool_tip="Clique aqui para ficar de pé."/>
+ <button label="Parar de voar" name="stop_fly_btn" tool_tip="Parar de voar"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index 7f3d2b34a6..9485915263 100644
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -1,38 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nome do pedaço de terra em que você está. Clique Sobre a Terra para informações.">
- Nome do pedaço de terra vai aqui
- </text>
- <text name="BalanceText" tool_tip="Saldo">
- Carregando...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinheiro"/>
- <text name="TimeText" tool_tip="Hora atual (do Pacífico)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Erros e avisos do Script"/>
- <button label="" label_selected="" name="health" tool_tip="Saúde"/>
- <text name="HealthText" tool_tip="Saúde">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Não é permitido Voar"/>
- <button label="" label_selected="" name="no_build" tool_tip="Construir/Rezzar não permitido"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="Scripts não permitidos"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Não Empurrar"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Voz não disponível aqui"/>
- <button label="" label_selected="" name="buyland" tool_tip="Comprar este lote"/>
- <line_editor label="Buscar" name="search_editor" tool_tip="Buscar no [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Buscar no [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Perda de pacote
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Banda
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Meu saldo: Comprar mais L$"/>
+ <text name="TimeText" tool_tip="Hora atual (Pacífico)">
+ 12:00 AM
+ </text>
+ <button name="volume_btn" tool_tip="Volume geral"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml
new file mode 100644
index 0000000000..9dc5aed91e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Hoje"/>
+ <accordion_tab name="yesterday" title="Ontem"/>
+ <accordion_tab name="2_days_ago" title="2 dias atrás"/>
+ <accordion_tab name="3_days_ago" title="3 dias atrás"/>
+ <accordion_tab name="4_days_ago" title="4 dias atrás"/>
+ <accordion_tab name="5_days_ago" title="5 dias atrás"/>
+ <accordion_tab name="6_days_and_older" title="6 dias e mais velhos"/>
+ <accordion_tab name="1_month_and_older" title="1 mês e mais velhos"/>
+ <accordion_tab name="6_months_and_older" title="6 meses e mais velhos"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_world_map.xml b/indra/newview/skins/default/xui/pt/panel_world_map.xml
index 2fda713ec7..584ef8a666 100644
--- a/indra/newview/skins/default/xui/pt/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Carregando...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Localização inválida
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml
index 8d192d4002..2e6e4dd133 100644
--- a/indra/newview/skins/default/xui/pt/role_actions.xml
+++ b/indra/newview/skins/default/xui/pt/role_actions.xml
@@ -1,186 +1,71 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite."
- name="Membership">
- <action description="Convidar pessoas para este grupo"
- longdescription="Convide pessoas para este grupo usando o botão &apos;Convidar nova pessoa...&apos; em Membros &amp; aba Funções &gt; sub-aba Membros."
- name="member invite" />
- <action description="Expulsar membros deste grupo"
- longdescription="Expulse membros deste grupo usando o botão &apos;Expulsar do grupo&apos; em Membros &amp; aba Funções &gt; sub-aba Membros. Um proprietário pode expulsar qualquer um, exceto outro proprietário. Se você não é um proprietário, um membro pode expulsá-lo do grupo se, e somente se, ele apenas tiver a função de todos e não outras funções. Para remover membros de funções, você precisa ter a habilidade &apos;Remover membros de funções&apos;."
- name="member eject" />
- <action
- description="Ativar/desativar &apos;Abrir registro&apos; e mudar &apos;Taxa de assinatura&apos;"
- longdescription="Ative/desative &apos;Abrir registro&apos; para permitir que novos membros se unam sem um convite, e mude a &apos;Taxa de registro&apos; na seção Preferência de grupo da aba Geral."
- name="member options" />
+ <action_set description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." name="Membership">
+ <action description="Convidar pessoas para este grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Convidar&apos; para convidar pessoas para entrar no grupo." name="member invite"/>
+ <action description="Expulsar membros deste grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Ejetar&apos; para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo &apos;Todos&apos; e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função &apos;Destituir membro com cargo&apos;." name="member eject"/>
+ <action description="Alterna entre &apos;Inscrições abertas&apos; e &apos;Taxa de associação&apos;." longdescription="Ative &apos;Inscrições abertas&apos; para que novos membros entrem no grupo sem convite, mude a &apos;Taxa de associação&apos; na seção Geral." name="member options"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções."
- name="Roles">
- <action description="Criar novas funções"
- longdescription="Crie novas funções em Membros &amp; aba Funções &gt; sub-aba Funções."
- name="role create" />
- <action description="Apagar funções"
- longdescription="Apague funções em Membros &amp; aba Funções &gt; sub-aba Funções."
- name="role delete" />
- <action description="Mudar nomes de função, títulos e descrições"
- longdescription="Mude o nome de funções, títulos e descrições na parte inferior de Membros &amp; aba Funções &gt; sub-aba Funções após selecionar uma função."
- name="role properties" />
- <action description="Designar membros para a função do designador"
- longdescription="Designe membros a funções na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. Um membro com este poder pode somente adicionar membros para a função que o designador já possui."
- name="role assign member limited" />
- <action description="Designar membros para qualquer função"
- longdescription="Designe membros a qualquer função na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. *AVISO* Quaisquer membros em uma função com esta habilidade podem designar a si próprios--e quaisquer outros membros não proprietários--para funções que têm mais poderes do que as atuais, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="role assign member" />
- <action description="Remover membros das funções"
- longdescription="Remova membros de funções na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. Proprietários não podem ser removidos."
- name="role remove member" />
- <action description="Determinar e remover habilidades em funções"
- longdescription="Designe e remova habilidades em funções na seção habilidades pertmitidas de Membros &amp; aba Funções &gt; sub-aba Funções. *AVISO* Quaisquer membros em uma função com esta habilidade podem desginar a si próprios--e quaisquer outros membros não proprietários--todas as habilidades, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="role change actions" />
+ <action_set description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." name="Roles">
+ <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create"/>
+ <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete"/>
+ <action description="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties"/>
+ <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos &gt; guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited"/>
+ <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos &gt; guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member"/>
+ <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos &gt; guia Membros). Proprietários não podem ser destituídos." name="role remove member"/>
+ <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos &gt; guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insígnia."
- name="Group Identity">
- <action
- description="Mudar apresentação, insígnia, &apos;Publicar na web&apos;, e quais membros estão publicamente visíveis em Informações do Grupo."
- longdescription="Mude a apresentação, insígnia, &apos;Publicar na web&apos; e quais membros estão publicamente visíveis em Informações do grupo. É feito na aba Geral."
- name="group change identity" />
+ <action_set description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insígnia." name="Group Identity">
+ <action description="Mudar apresentação, insígnia, &apos;Publicar na web&apos;, e quais membros estão publicamente visíveis em Informações do Grupo." longdescription="Modificar o estatuto, símbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes para transferir, modificar e vender terrenos do grupo. Vá pra a janela Sobre o terreno, clique com o botão direito no terreno e selecione &apos;Sobre o terreno...&apos; ou clique na informação da parcela na barra do menu."
- name="Parcel Management">
- <action description="Transferir e comprar terreno para o grupo"
- longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno &gt; aba Geral."
- name="land deed" />
- <action description="Abandonar terreno para Governador Linden"
- longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno &gt; aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="land release" />
- <action description="Definir terreno para informação de venda"
- longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno &gt; aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade."
- name="land set sale info" />
- <action description="Subdividir e unir parcelas"
- longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide...&apos;. To join, select two or more contiguous parcels and click &apos;Join...&apos;. "
- name="land divide join" />
+ <action_set description="Estas funções incluem poderes de transferir, vender e modificar os terrenos do grupo. Para acessar a janela &apos;Sobre terrenos&apos;, clique no chão com o botão direito e selecione &apos;Sobre terrenos&apos;. Ou clique no ícone &apos;i&apos; da barra de navegação." name="Parcel Management">
+ <action description="Transferir e comprar terreno para o grupo" longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno &gt; aba Geral." name="land deed"/>
+ <action description="Abandonar terreno para Governador Linden" longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno &gt; aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." name="land release"/>
+ <action description="Definir terreno para informação de venda" longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno &gt; aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." name="land set sale info"/>
+ <action description="Subdividir e unir parcelas" longdescription="Juntar ou dividir lotes. Clique no chão com o botão direito, selecione &apos;Editar terreno&apos; e arraste o mouse sobre o terreno para ver as opções. Para dividir um terreno, selecione a área a ser dividida e clique em &apos;Dividir&apos;. Para juntar terrenos, selecione dois ou mais lotes adjacentes e clique em &apos;Juntar&apos;." name="land divide join"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem &amp; opções de rota de TP."
- name="Parcel Identity">
- <action
- description="Ativar/desativar &apos;Exibir em locais de encontro&apos; e definir categoria"
- longdescription="Ativar/desativar &apos;Exibir em locais de encontro&apos; e configurar uma categoria de parcela em Sobre o terreno &gt; aba Opções."
- name="land find places" />
- <action
- description="Mudar nome da parcela, descrição, e configurações &apos;Publicar na web&apos;"
- longdescription="Mude o nome da parcela, descrição e configurações de &apos;Publicar na web&apos;. É feito em Sobre o terreno &gt; aba Opções."
- name="land change identity" />
- <action description="Definir ponto de aterrissagem e rota de teletransporte"
- longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno &gt; aba Opções."
- name="land set landing point" />
+ <action_set description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem &amp; opções de rota de TP." name="Parcel Identity">
+ <action description="Alternar &apos;Exibir nos resultados de busca&apos; e selecionar a categoria" longdescription="Alterne entre &apos;Exibir nos resultados de busca&apos; ou não, e selecione a categoria do terreno em &apos;Sobre o terreno&apos;." name="land find places"/>
+ <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno &gt; guia Opções." name="land change identity"/>
+ <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno &gt; aba Opções." name="land set landing point"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes que afetam opções de parcela, como &apos;Criar objetos&apos;, &apos;Editar terreno&apos; e música &amp; configurações de mídia."
- name="Parcel Settings">
- <action description="Mudar música &amp; configurações de mídia"
- longdescription="Mude streaming de música e configurações de vídeo em Sobre o terreno &gt; aba Mídia."
- name="land change media" />
- <action description="Ativar/desativar &apos;Editar terreno&apos;"
- longdescription="Ative/desative &apos;Editar terreno&apos;. *AVISO* Sobre o terreno &gt; aba Opções &gt; Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno &gt; aba Opções."
- name="land edit" />
- <action
- description="Ativar/desativar variados Sobre o Terreno &gt; Opções de configuração"
- longdescription="Ative/desative &apos;Seguro (sem dano)&apos;, &apos;Voar&apos;, e permita a outros residentes: &apos;Criar objetos&apos;, &apos;Editar terreno&apos;, &apos;Criar pontos de referência&apos;, e &apos;Executar scripts&apos; em um terreno pertencente ao grupo em Sobre o terreno &gt; aba Opções."
- name="land options" />
+ <action_set description="Estas habilidade incluem poderes que afetam opções de parcela, como &apos;Criar objetos&apos;, &apos;Editar terreno&apos; e música &amp; configurações de mídia." name="Parcel Settings">
+ <action description="Mudar música &amp; configurações de mídia" longdescription="Mude streaming de música e configurações de vídeo em Sobre o terreno &gt; aba Mídia." name="land change media"/>
+ <action description="Ativar/desativar &apos;Editar terreno&apos;" longdescription="Ative/desative &apos;Editar terreno&apos;. *AVISO* Sobre o terreno &gt; aba Opções &gt; Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno &gt; aba Opções." name="land edit"/>
+ <action description="Ativar/desativar variados Sobre o Terreno &gt; Opções de configuração" longdescription="Alterna as opções &apos;Seguro (zero danos)&apos;, &apos;Voar&apos; e autorizar outros residentes a: &apos;Editar terreno&apos;, &apos;Contruir&apos;, &apos;Criar marcos&apos; e &apos;Executar scripts&apos; nos terrenos do grupo. Clique em Sobre o terreno &gt; guia Opções." name="land options"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo."
- name="Parcel Powers">
- <action description="Sempre permitir &apos;Editar terreno&apos;"
- longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow edit land" />
- <action description="Sempre permitir &apos;Voar&apos;"
- longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow fly" />
- <action description="Sempre permitir &apos;Criar objetos&apos;"
- longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow create" />
- <action description="Sempre permitir &apos;Criar ponto de referência&apos;"
- longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow landmark" />
- <action description="Permitir &apos;Colocar casa aqui&apos; no terreno do grupo"
- longdescription="Membros em uma função com esta habilidade podem usar o menu Mundo &gt; Definir lar aqui em uma parcela do grupo (definir terreno ou transferir para este grupo)."
- name="land allow set home" />
+ <action_set description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo." name="Parcel Powers">
+ <action description="Sempre permitir &apos;Editar terreno&apos;" longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow edit land"/>
+ <action description="Sempre permitir &apos;Voar&apos;" longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow fly"/>
+ <action description="Sempre permitir &apos;Criar objetos&apos;" longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow create"/>
+ <action description="Sempre permitir &apos;Criar ponto de referência&apos;" longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow landmark"/>
+ <action description="Permitir &apos;Colocar casa aqui&apos; no terreno do grupo" longdescription="Membros exercendo cargos com esta função podem selecionar no menu Mundo &gt; Marcos &gt; Definir como casa em lotes doados ao grupo." name="land allow set home"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes."
- name="Parcel Access">
- <action description="Gerenciar listas de acesso à parcela"
- longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno &gt; aba Acesso."
- name="land manage allowed" />
- <action description="Gerenciar lista de banidos da parcela"
- longdescription="Gerencie a lista de banidos da parcela em Sobre o terreno &gt; aba Banido."
- name="land manage banned" />
- <action description="Mudar configurações de parcela &apos;Vender passes...&apos;"
- longdescription="Mude configurações de &apos;Vender passes...&apos; em Sobre o terreno &gt; aba Acesso."
- name="land manage passes" />
- <action description="Expulsar e congelar residentes nas parcelas"
- longdescription="Membros em uma função com esta habilidade podem lidar com um residente indesejado em uma parcela pertencente ao grupo clicando com o botão direitos sobre ele, Mais &gt; e selecionado &apos;Expulsar...&apos; ou &apos;Congelar...&apos;."
- name="land admin" />
+ <action_set description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes." name="Parcel Access">
+ <action description="Gerenciar listas de acesso à parcela" longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno &gt; aba Acesso." name="land manage allowed"/>
+ <action description="Gerenciar lista de banidos da parcela" longdescription="Administre as listas de acesso e bloqueio em Sobre o terreno &gt; guia Acesso." name="land manage banned"/>
+ <action description="Modificar as opções &apos;Vender passes para&apos;" longdescription="Mude as opções &apos;Vender passes para&apos; em Sobre o terreno &gt; guia Acesso." name="land manage passes"/>
+ <action description="Expulsar e congelar residentes nas parcelas" longdescription="Membros exercendo cargos com esta função podem lidar com residentes problemáticos nos terrenos do grupo. Clique no residente com o botão direito, depois selecione &apos;Ejetar&apos; ou &apos;Congelar&apos;." name="land admin"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possível desfazer a mudança dos objetos."
- name="Parcel Content">
- <action description="Retornar objetos que pertencem ao grupo"
- longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno &gt; aba Objetos."
- name="land return group owned" />
- <action description="Retornar objetos definidos para o grupo"
- longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno &gt; aba Objetos."
- name="land return group set" />
- <action description="Retornar objetos que não pertencem ao grupo"
- longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno &gt; aba Objetos."
- name="land return non group" />
- <action description="Ajardinar usando plantas Linden"
- longdescription="A habilidade de ajardinar permite colocar e mover árvores Linden, plantas e gramas. Estes itens podem ser encontrando na Biblioteca de seu inventário &gt; pasta Objetos ou podem ser criados através do botão Construir."
- name="land gardening" />
+ <action_set description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possível desfazer a mudança dos objetos." name="Parcel Content">
+ <action description="Retornar objetos que pertencem ao grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno &gt; aba Objetos." name="land return group owned"/>
+ <action description="Retornar objetos definidos para o grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno &gt; aba Objetos." name="land return group set"/>
+ <action description="Retornar objetos que não pertencem ao grupo" longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno &gt; aba Objetos." name="land return non group"/>
+ <action description="Ajardinar usando plantas Linden" longdescription="Função de paisagismo: poder de plantar e mudar árvores, plantas e grama Linden. A pasta Biblioteca &gt; Objetos do inventário contém material de paisagismo. Use o menu Construir para criar suas próprias plantas." name="land gardening"/>
</action_set>
- <action_set
- description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools &gt; General Tab. Right-click an object and Edit to see its settings. "
- name="Object Management">
- <action description="Transferir objetos para o grupo"
- longdescription="Transfere objetos para o grupo em Editar ferramentas &gt; aba Geral."
- name="object deed" />
- <action description="Manipular (mover, copiar, modificar) objetos do grupo"
- longdescription="Manipule (mover,copiar, modificar) objetos pertencentes ao grupo em Editar Ferramentas &gt; aba Geral."
- name="object manipulate" />
- <action description="Definir objetos pertencentes ao grupo para venda"
- longdescription="Defina objetos pertencentes ao grupo para venda em Editar Ferramentas &gt; aba Geral."
- name="object set sale" />
+ <action_set description="Estas funções incluem poderes de transferir, vender e modificar os objetos do grupo. Essas opções ficam nas Ferramentas de contrução &gt; guia Geral. Clique em um objeto com o botão direito e selecione Editar para ver as configurações do objeto." name="Object Management">
+ <action description="Transferir objetos para o grupo" longdescription="Transfira objetos para o grupo em Ferramentas de construção &gt; guia Geral." name="object deed"/>
+ <action description="Manipular (mover, copiar, modificar) objetos do grupo" longdescription="Manipule (transportar, copiar, modificar) objetos do grupo nas Ferramentas de construção &gt; guia Geral." name="object manipulate"/>
+ <action description="Definir objetos pertencentes ao grupo para venda" longdescription="Ponha objetos do grupo à venda nas Ferramentas de construção &gt; guia Geral." name="object set sale"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes que requerem que membros paguem dívidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo."
- name="Accounting">
- <action description="Pagar débitos e receber dividendos do grupo"
- longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. "
- name="accounting accountable" />
+ <action_set description="Estas habilidades incluem poderes que requerem que membros paguem dívidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo." name="Accounting">
+ <action description="Pagar débitos e receber dividendos do grupo" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " name="accounting accountable"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo."
- name="Notices">
- <action description="Enviar aviso"
- longdescription="Membros em uma função com esta habiliade podem enviar avisos em Informações de grupo &gt; aba Avisos."
- name="notices send" />
- <action description="Receber novos avisos e ver os anteriores"
- longdescription="Membros em uma função com esta habilidade podem receber os novos avisos e ver os anteriores em Informações de grupo &gt; aba Avisos."
- name="notices receive" />
+ <action_set description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo." name="Notices">
+ <action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send"/>
+ <action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação."
- name="Proposals">
- <action description="Criar proposta"
- longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo &gt; aba Propostas."
- name="proposal start" />
- <action description="Votar em propostas"
- longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo &gt; aba Propostas."
- name="proposal vote" />
+ <action_set description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação." name="Proposals">
+ <action description="Criar proposta" longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo &gt; aba Propostas." name="proposal start"/>
+ <action description="Votar em propostas" longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo &gt; aba Propostas." name="proposal vote"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml
new file mode 100644
index 0000000000..73ec6fb068
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Looks" name="appearance panel">
+ <string name="No Outfit" value="Nenhum"/>
+ <filter_editor label="Filtrar looks" name="Filter"/>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <button name="newlook_btn" tool_tip="Novo look"/>
+ <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
+ <button label="Vestir" name="wear_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
new file mode 100644
index 0000000000..75b737b8bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Coisas" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Perfil" name="info_btn"/>
+ <button label="Vestir" name="wear_btn"/>
+ <button label="Tocar" name="play_btn"/>
+ <button label="Teletransportar" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
new file mode 100644
index 0000000000..556c631bf7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Propriedaded do item de inventário">
+ <panel.string name="unknown">
+ (desconhecido)
+ </panel.string>
+ <panel.string name="public">
+ (público)
+ </panel.string>
+ <panel.string name="you_can">
+ você pode:
+ </panel.string>
+ <panel.string name="owner_can">
+ Proprietário pode:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Propriedade do item"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nome:
+ </text>
+ <text name="LabelItemDescTitle">
+ Descrição:
+ </text>
+ <text name="LabelCreatorTitle">
+ Criador:
+ </text>
+ <button label="Perfil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Proprietário:
+ </text>
+ <button label="Perfil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Adquirido:
+ </text>
+ <text name="LabelAcquiredDate">
+ Quarta 24 de Maio 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Você:
+ </text>
+ <check_box label="Editar" name="CheckOwnerModify"/>
+ <check_box label="Copiar" name="CheckOwnerCopy"/>
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Qualquer um:
+ </text>
+ <check_box label="Copiar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartilhar" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Próximo proprietário:
+ </text>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
+ <check_box label="Copiar" name="CheckNextOwnerCopy"/>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
+ <check_box label="À venda" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
new file mode 100644
index 0000000000..3ae728e69d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Propriedades do objeto">
+ <panel.string name="text deed continued">
+ Doar
+ </panel.string>
+ <panel.string name="text deed">
+ Doar
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Você pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Você pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Você não pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Você não pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ O objeto contém links ligando suas partes
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preço: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Preço total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Preço unitário: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Preço misto
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venda mista
+ </panel.string>
+ <panel label="">
+ <text name="Name:">
+ Nome:
+ </text>
+ <text name="Description:">
+ Descrição:
+ </text>
+ <text name="Creator:">
+ Criador:
+ </text>
+ <text name="Owner:">
+ Proprietário:
+ </text>
+ <text name="Group:">
+ Grupo:
+ </text>
+ <button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
+ <name_box initial_value="Carregando..." name="Group Name Proxy"/>
+ <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
+ <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
+ <text name="label click action">
+ Clique para:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentar em objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar por objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ </combo_box>
+ <check_box label="À venda" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Conteúdo" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço: L$" name="Edit Cost"/>
+ <check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Você pode modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Todos:
+ </text>
+ <check_box label="Movimentar" name="checkbox allow everyone move"/>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo proprietário:
+ </text>
+ <check_box label="Modificar" name="checkbox next owner can modify"/>
+ <check_box label="Copiar" name="checkbox next owner can copy"/>
+ <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel name="button_panel">
+ <button label="Abrir" name="open_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Salvar" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2d3514e5fe..0e2a8a88f1 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -4,9 +4,21 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="SUPPORT_SITE">
+ Portal de Apoio do Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Detectando hardware...
+ </string>
+ <string name="StartupLoading">
+ Carregando
+ </string>
<string name="LoginInProgress">
Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Logando...
+ </string>
<string name="LoginAuthenticating">
Autenticando
</string>
@@ -25,8 +37,11 @@
<string name="LoginInitializingMultimedia">
Inicializando multimídia...
</string>
+ <string name="LoginInitializingFonts">
+ Carregando fontes...
+ </string>
<string name="LoginVerifyingCache">
- Verificando arquivos no cache (pode levar 60-90 segundos)...
+ Verificando arquivos cache (pode levar de 60-90 segundos)...
</string>
<string name="LoginProcessingResponse">
Processando Resposta...
@@ -55,6 +70,15 @@
<string name="LoginDownloadingClothing">
Baixando roupas...
</string>
+ <string name="LoginFailedNoNetwork">
+ Erro de Rede: Não foi possível estabelecer a conexão, verifique sua conexão de rede.
+ </string>
+ <string name="Quit">
+ Sair
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=pt-BR
+ </string>
<string name="AgentLostConnection">
Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
</string>
@@ -73,39 +97,9 @@
<string name="TooltipIsGroup">
(Grupo)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Física
- </string>
- <string name="TooltipFlagTouch">
- Toque
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Dar Inventário
- </string>
- <string name="TooltipFlagPhantom">
- Imaterial
- </string>
- <string name="TooltipFlagTemporary">
- Temporário
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Clique com o botão direito para acessar o menu)
- </string>
- <string name="TooltipFreeToCopy">
- Cópia Permitida
- </string>
<string name="TooltipForSaleL$">
À venda: L$[AMOUNT]
</string>
- <string name="TooltipForSaleMsg">
- À venda: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Construído por Grupo
</string>
@@ -133,6 +127,76 @@
<string name="TooltipMustSingleDrop">
Apenas um item único pode ser arrastado para este local
</string>
+ <string name="TooltipHttpUrl">
+ Clique para ver essa página web
+ </string>
+ <string name="TooltipSLURL">
+ Clique para ver a informação desta localização
+ </string>
+ <string name="TooltipAgentUrl">
+ Clique para ver o perfil deste residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clique para ver a descrição deste Grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Clique para ver a descrição deste evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clique para ver este classificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Clique para ver a descrição desta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clique para teletransportar para esta localização
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clique para ver a descrição deste objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Clique para ver esta localização no mapa
+ </string>
+ <string name="TooltipSLAPP">
+ Clique para ativar no secondlife:// commando
+ </string>
+ <string name="CurrentURL" value="URL atual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teletransportar para
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrar no mapa para
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fechar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fechar (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar-se da janela
+ </string>
+ <string name="BUTTON_DOCK">
+ conectar-se à barra
+ </string>
+ <string name="BUTTON_UNDOCK">
+ desconectar-se da barra
+ </string>
+ <string name="BUTTON_HELP">
+ Mostrar ajuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ Não encontrado.
+ </string>
<string name="RetrievingData">
Buscando...
</string>
@@ -187,8 +251,77 @@
<string name="AssetErrorUnknownStatus">
Status desconhecido
</string>
- <string name="AvatarEditingApparance">
- (Editando Aparência)
+ <string name="texture">
+ textura
+ </string>
+ <string name="sound">
+ som
+ </string>
+ <string name="calling card">
+ cartão de visitas
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ script obsoleto
+ </string>
+ <string name="clothing">
+ roupas
+ </string>
+ <string name="object">
+ objeto
+ </string>
+ <string name="note card">
+ notecard
+ </string>
+ <string name="folder">
+ pasta
+ </string>
+ <string name="root">
+ raiz
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ textura tga
+ </string>
+ <string name="body part">
+ parte do corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ Achados e Perdidos
+ </string>
+ <string name="targa image">
+ imagem targa
+ </string>
+ <string name="trash">
+ Lixo
+ </string>
+ <string name="jpeg image">
+ imagem jpeg
+ </string>
+ <string name="animation">
+ animação
+ </string>
+ <string name="gesture">
+ gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorito
+ </string>
+ <string name="symbolic link">
+ link
</string>
<string name="AvatarAway">
Distante
@@ -410,7 +543,19 @@
Carregando...
</string>
<string name="worldmap_offline">
- Desconectado
+ Offline
+ </string>
+ <string name="worldmap_results_none_found">
+ Nenhum encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ término prematuro do arquivo
+ </string>
+ <string name="ST_NO_JOINT">
+ Não é possível encontrar a raiz (ROOT) ou junção (JOINT).
</string>
<string name="whisper">
sussurra:
@@ -418,6 +563,57 @@
<string name="shout">
grita:
</string>
+ <string name="ringing">
+ Conectando à conversa de Voz no mundo
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ Voz não disponível na sua localização atual
+ </string>
+ <string name="hang_up">
+ Desconectado da conversa de Voz no mundo
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tomar linden dólares (L$) de você
+ </string>
+ <string name="ActOnControlInputs">
+ Atue nas suas entradas de controle
+ </string>
+ <string name="RemapControlInputs">
+ Remapeie suas entradas de controle
+ </string>
+ <string name="AnimateYourAvatar">
+ Faça uma animação para o seu avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexe ao seu avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Libere a propriedade e torne-a pública
+ </string>
+ <string name="LinkAndDelink">
+ Una e desuna de outros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Adicione e remova junções com outros objetos
+ </string>
+ <string name="ChangePermissions">
+ Modifique as permissões
+ </string>
+ <string name="TrackYourCamera">
+ Acompanhe sua câmera
+ </string>
+ <string name="ControlYourCamera">
+ Controle sua camera
+ </string>
<string name="SIM_ACCESS_PG">
PG
</string>
@@ -436,8 +632,6 @@
<string name="land_type_unknown">
(desconhecido)
</string>
- <string name="covenant_never_modified">Última modificação: (nunca)</string>
- <string name="covenant_modified">Última modificação: </string>
<string name="all_files">
Todos os Arquivos
</string>
@@ -483,17 +677,739 @@
<string name="choose_the_directory">
Escolher Diretório
</string>
+ <string name="AvatarSetNotAway">
+ deixar como não away
+ </string>
+ <string name="AvatarSetAway">
+ deixar como Away
+ </string>
+ <string name="AvatarSetNotBusy">
+ deixar como não Ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Deixar como Busy
+ </string>
+ <string name="shape">
+ Silhueta
+ </string>
+ <string name="skin">
+ Pele
+ </string>
+ <string name="hair">
+ Cabelo
+ </string>
+ <string name="eyes">
+ Olhos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ calças
+ </string>
+ <string name="shoes">
+ Sapatos
+ </string>
+ <string name="socks">
+ Meias
+ </string>
+ <string name="jacket">
+ Blusa
+ </string>
+ <string name="gloves">
+ Luvas
+ </string>
+ <string name="undershirt">
+ camiseta
+ </string>
+ <string name="underpants">
+ roupa debaixo
+ </string>
+ <string name="skirt">
+ saia
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tattoo
+ </string>
+ <string name="invalid">
+ inválido
+ </string>
+ <string name="next">
+ Próximo
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Anúncio de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Anúncios do grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Anexo:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver últimos anúncios ou optar por não receber essas mensagens aqui.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir anexo
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salvar anexo
+ </string>
+ <string name="TeleportOffer">
+ Oferta de teletransporte
+ </string>
+ <string name="StartUpNotification">
+ [%d] nova notificação chegou enquanto você estava fora...
+ </string>
+ <string name="StartUpNotifications">
+ [%d] Novas notificações chegaram enquanto você estava fora...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Você tem mais [%d] notificações
+ </string>
+ <string name="BodyPartsRightArm">
+ Braço direito
+ </string>
+ <string name="BodyPartsHead">
+ Cabeça
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braço esquerdo
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Perna esquerda
+ </string>
+ <string name="BodyPartsTorso">
+ Tronco
+ </string>
+ <string name="BodyPartsRightLeg">
+ Perna direita
+ </string>
+ <string name="GraphicsQualityLow">
+ Baixo
+ </string>
+ <string name="GraphicsQualityMid">
+ Meio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pressione ESC para retornar para visão do mundo
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Nenhum item correspondente encontrado no inventário.
+ </string>
+ <string name="InventoryNoTexture">
+ Você não possui uma cópia desta textura no seu inventário
+ </string>
+ <string name="no_transfer" value="(não transferível)"/>
+ <string name="no_modify" value="(não modificável)"/>
+ <string name="no_copy" value="(não copiável)"/>
+ <string name="worn" value="(vestido)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(link_quebrado)&quot;"/>
+ <string name="LoadingContents">
+ Carregando conteúdo...
+ </string>
+ <string name="NoContents">
+ Nenhum conteúdo
+ </string>
+ <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
+ <string name="Chat" value="Bate papo :"/>
+ <string name="Sound" value="Som :"/>
+ <string name="Wait" value="--- Aguarde :"/>
+ <string name="AnimFlagStop" value="Parar animação :"/>
+ <string name="AnimFlagStart" value="Iniciar animação :"/>
+ <string name="Wave" value="Aceno"/>
+ <string name="HelloAvatar" value="Olá, avatar!"/>
+ <string name="ViewAllGestures" value="Ver tudo &gt;&gt;"/>
+ <string name="Animations" value="Animações,"/>
+ <string name="Calling Cards" value="Cartões de visitas,"/>
+ <string name="Clothing" value="Vestuário,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Landmarks,"/>
+ <string name="Notecards" value="Notecards,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sons,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotografias,"/>
+ <string name="No Filters" value="Não"/>
+ <string name="Since Logoff" value="- desde desligado"/>
+ <string name="InvFolder My Inventory">
+ Meu Inventorio
+ </string>
+ <string name="InvFolder My Favorites">
+ Meus Favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartões de Visitas
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarks
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Vestuário
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notecards
+ </string>
+ <string name="InvFolder New Folder">
+ Nova Pasta
+ </string>
+ <string name="InvFolder Inventory">
+ Inventário
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imagens Descompactadas
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes do Corpo
+ </string>
+ <string name="InvFolder Trash">
+ Lixo
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de Fotografias
+ </string>
+ <string name="InvFolder Lost And Found">
+ Achados e Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons Descompactados
+ </string>
+ <string name="InvFolder Animations">
+ Animações
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestimanta Atual
+ </string>
+ <string name="InvFolder My Outfits">
+ Minhas Vestimentas
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Tudo
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Pedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Vidro
+ </string>
+ <string name="Wood">
+ Madeira
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Borrracha
+ </string>
+ <string name="Light">
+ Luz
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Peito
+ </string>
+ <string name="Skull">
+ Crânio
+ </string>
+ <string name="Left Shoulder">
+ Ombro esquerdo
+ </string>
+ <string name="Right Shoulder">
+ Ombro direito
+ </string>
+ <string name="Left Hand">
+ Mão esquerda
+ </string>
+ <string name="Right Hand">
+ Mão direita
+ </string>
+ <string name="Left Foot">
+ Pé esquerdo
+ </string>
+ <string name="Right Foot">
+ Pé direito
+ </string>
+ <string name="Spine">
+ Espinha
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Queixo
+ </string>
+ <string name="Left Ear">
+ Orelha esquerda
+ </string>
+ <string name="Right Ear">
+ Orelha direita
+ </string>
+ <string name="Left Eyeball">
+ Globo ocular esquerdo
+ </string>
+ <string name="Right Eyeball">
+ Globo ocular direito
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Braço superior D
+ </string>
+ <string name="R Forearm">
+ Antebraço D
+ </string>
+ <string name="L Upper Arm">
+ Braço superior E
+ </string>
+ <string name="L Forearm">
+ Antebraço E
+ </string>
+ <string name="Right Hip">
+ Quadril direito
+ </string>
+ <string name="R Upper Leg">
+ Coxa D
+ </string>
+ <string name="R Lower Leg">
+ Perna inferior D
+ </string>
+ <string name="Left Hip">
+ Quadril esquerdo
+ </string>
+ <string name="L Upper Leg">
+ Coxa E
+ </string>
+ <string name="L Lower Leg">
+ Perna inferior E
+ </string>
+ <string name="Stomach">
+ Estômago
+ </string>
+ <string name="Left Pec">
+ Pec esquerdo
+ </string>
+ <string name="Right Pec">
+ Pec direito
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de idade
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de idade
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de idade
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de idade
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de idade
+ </string>
+ <string name="TodayOld">
+ Cadastrado hoje
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] ano
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anos
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anos
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mês
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dia
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dias
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dias
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Lista de membros
+ </string>
+ <string name="AcctTypeEmployee">
+ Empregado da Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Info de Pagamento usada
+ </string>
+ <string name="PaymentInfoOnFile">
+ Info de Pagamento no Arquivo
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nenhuma Info de Pagamento no Arquivo
+ </string>
+ <string name="AgeVerified">
+ Idade-verificada
+ </string>
+ <string name="NotAgeVerified">
+ Idade não-verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Topo direita
+ </string>
+ <string name="Top">
+ Topo
+ </string>
+ <string name="Top Left">
+ Topo esquerda
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Inferior esquerdo
+ </string>
+ <string name="Bottom">
+ Inferior
+ </string>
+ <string name="Bottom Right">
+ Inferior direito
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Downloaded, agora compilando
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script não encontrado no servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema no download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permissões insuficientes para fazer o download do script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permissões insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Falha desconhecida para download
+ </string>
+ <string name="CompileQueueTitle">
+ Progresso do Recompilamento
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progresso
+ </string>
+ <string name="ResetQueueStart">
+ reset
+ </string>
+ <string name="RunQueueTitle">
+ Definir funcionamento do progresso
+ </string>
+ <string name="RunQueueStart">
+ deixar funcionando
+ </string>
+ <string name="NotRunQueueTitle">
+ Definir progresso não funcionando
+ </string>
+ <string name="NotRunQueueStart">
+ não deixar funcionando
+ </string>
+ <string name="CompileSuccessful">
+ Compilação bem sucedida
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilação bem sucedida, salvando...
+ </string>
+ <string name="SaveComplete">
+ Salvo.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objecto fora de alcance)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objeto [OBJECT] de propriedade de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nenhum
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconhecido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em"/>
+ <string name="NextStipendDay" value="Próximo dia de salário é"/>
+ <string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
+ <string name="Balance">
+ Balanço
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Não ha dados de grupo para o grupo
+ </string>
+ <string name="IMParentEstate">
+ propriedade dos pais
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ adolescente
+ </string>
+ <string name="RegionInfoError">
+ erro
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todas as propriedades pertencem a [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todas as propriedades que você possui
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todas as propriedades que você gerencia para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residentes permitidos : ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos permitidos: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Linha [LINE], Coluna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] encontrado
+ </string>
+ <string name="PanelContentsNewScript">
+ Novo Script
+ </string>
+ <string name="MuteByName">
+ (por nome)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (objeto)
+ </string>
+ <string name="MuteGroup">
+ (grupo)
+ </string>
+ <string name="RegionNoCovenant">
+ Não ha Contrato fornecido para essa Região.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Não ha Contrato fornecido para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
+ </string>
+ <string name="covenant_last_modified">
+ Última modificação:
+ </string>
+ <string name="none_text" value="(nenhum)"/>
+ <string name="never_text" value="(nunca)"/>
+ <string name="GroupOwned">
+ Propriedade do Grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vai atualizar depois de publicado)
+ </string>
+ <string name="MultiPreviewTitle">
+ Preview
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ um objeto chamado
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possuído pelo grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ possuído por um grupo desconhecido
+ </string>
+ <string name="InvOfferOwnedBy">
+ possuído por
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ possuído por usuário desconhecido
+ </string>
+ <string name="InvOfferGaveYou">
+ deu a você
+ </string>
+ <string name="InvOfferYouDecline">
+ Você declina
+ </string>
+ <string name="InvOfferFrom">
+ de
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprou
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagou a você
+ </string>
+ <string name="GroupMoneyPaidInto">
+ depositado
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ comprou passe para
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagou taxa para o evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagou prêmio para o evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Balanço
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Conteúdo
+ </string>
+ <string name="AcquiredItems">
+ Itens adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Uploading [%s] custos
+ </string>
+ <string name="UnknownFileExtension">
+ Extensão de arquivo desconhecida [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Adicionar Landmark...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar Landmark...
+ </string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -504,80 +1420,1789 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
- Baixo
+ <string name="FileSaved">
+ Arquivo salvo
</string>
- <string name="GraphicsQualityMid">
- Meio
+ <string name="Receiving">
+ Recebendo
</string>
- <string name="GraphicsQualityHigh">
- Alto
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Avante
+ </string>
+ <string name="Left">
+ Esquerda
+ </string>
+ <string name="Right">
+ Direita
+ </string>
+ <string name="Back">
+ Atrás
+ </string>
+ <string name="North">
+ Norte
+ </string>
+ <string name="South">
+ Sul
+ </string>
+ <string name="West">
+ Oeste
+ </string>
+ <string name="East">
+ Leste
+ </string>
+ <string name="Up">
+ Acima
+ </string>
+ <string name="Down">
+ Abaixo
+ </string>
+ <string name="Any Category">
+ Qualquer categoria
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Aluguel de terrenos
+ </string>
+ <string name="Property Rental">
+ Aluguel de propriedade
</string>
+ <string name="Special Attraction">
+ Atração especial
+ </string>
+ <string name="New Products">
+ Novos Produtos
+ </string>
+ <string name="Employment">
+ Emprego
+ </string>
+ <string name="Wanted">
+ Desejado
+ </string>
+ <string name="Service">
+ Serviço
+ </string>
+ <string name="Personal">
+ Pessoal
+ </string>
+ <string name="None">
+ Nenhum
+ </string>
+ <string name="Linden Location">
+ Locação Linden
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Artes e Cultura
+ </string>
+ <string name="Business">
+ Negócios
+ </string>
+ <string name="Educational">
+ Educacional
+ </string>
+ <string name="Gaming">
+ Jogos
+ </string>
+ <string name="Hangout">
+ Moradia
+ </string>
+ <string name="Newcomer Friendly">
+ Amigável a Novos Usuários
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques &amp; Natureza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Estágio
+ </string>
+ <string name="Other">
+ Outros
+ </string>
+ <string name="Any">
+ Qualquer
+ </string>
+ <string name="You">
+ Você
+ </string>
+ <string name="Multiple Media">
+ Mídia múltipla
+ </string>
+ <string name="Play Media">
+ Tocar/Pausar mídia
+ </string>
+ <string name="MBCmdLineError">
+ Um erro foi encontrado analisando a linha de comando.
+Consulte: http://wiki.secondlife.com/wiki/Client_parameters
+Erro:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de linha de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] não é capaz de acessar um arquivo que ele precisa.
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Locação Linden</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Artes e Cultura</string>
- <string name="Business">Negócios</string>
- <string name="Educational">Educacional</string>
- <string name="Gaming">Jogos</string>
- <string name="Hangout">Moradia</string>
- <string name="Newcomer Friendly">Amigável a Novos Usuários</string>
- <string name="Parks&amp;Nature">Parques &amp; Natureza</string>
- <string name="Residential">Residencial</string>
- <string name="Shopping">Compras</string>
- <string name="Other">Outros</string>
- <string name="ringing">
- Conectando à conversa de Voz no mundo
+Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto.
+Se a mensagem persistir, reinicie o computador e tente novamente.
+Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.
</string>
- <string name="connected">
- Conectado
+ <string name="MBFatalError">
+ Erro Fatal
</string>
- <string name="unavailable">
- Voz não disponível na sua localização atual
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] exige um processador com AltiVec (G4 ou superior).
</string>
- <string name="hang_up">
- Desconectado da conversa de Voz no mundo
+ <string name="MBAlreadyRunning">
+ [APP_NAME] já está em execução.
+Verifique a sua barra de tarefas para obter uma cópia do programa minimizado.
+Se a mensagem persistir, reinicie o computador.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] parece ter congelado ou falhado na execução anterior. Você gostaria de enviar um relatório de falha?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
+[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b.
+
+Deseja continuar?
+ </string>
+ <string name="MBWarning">
+ Aviso
+ </string>
+ <string name="MBNoAutoUpdate">
+ Atualização automática ainda não está implementada para o Linux.
+Faça o download da versão mais recente do www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass falhou
+ </string>
+ <string name="MBError">
+ Erro
+ </string>
+ <string name="MBFullScreenErr">
+ Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
+Executando em janela.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erro de desligamento ao destruir janela (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Erro de desligamento
+ </string>
+ <string name="MBDevContextErr">
+ Não é possível fazer contexto do dispositivo GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Não é possível encontrar um formato de pixel adequado
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Não é possível encontrar descrição de formato de pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requer True Color (32-bit) para ser executado.
+Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
+Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados.
+Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações&gt; Display&gt;.
+Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ ão é possível definir o formato de pixel
+ </string>
+ <string name="MBGLContextErr">
+ Não é possível criar o contexto de renderização GL
+ </string>
+ <string name="MBGLContextActErr">
+ Não é possível ativar o contexto de renderização GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Sombra descuidada
+ </string>
+ <string name="All White">
+ Todo branco
+ </string>
+ <string name="Anime Eyes">
+ Olhos de Anime
+ </string>
+ <string name="Arced">
+ arqueado
+ </string>
+ <string name="Arm Length">
+ Comprimento do Braço
+ </string>
+ <string name="Attached">
+ Anexado
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos da orelha anexados
+ </string>
+ <string name="Back Bangs">
+ Franja traseira
+ </string>
+ <string name="Back Bangs Down">
+ franja traseira longa
+ </string>
+ <string name="Back Bangs Up">
+ franja traseira arrepiada
+ </string>
+ <string name="Back Fringe">
+ corte traseiro
+ </string>
+ <string name="Back Hair">
+ cabelo traseiro
+ </string>
+ <string name="Back Hair Down">
+ cabelo de trás longo
+ </string>
+ <string name="Back Hair Up">
+ cabelo de trás arrepiado
+ </string>
+ <string name="Baggy">
+ folgado
+ </string>
+ <string name="Bangs">
+ Franja
+ </string>
+ <string name="Bangs Down">
+ franja longa
+ </string>
+ <string name="Bangs Up">
+ franja arrepiada
+ </string>
+ <string name="Beady Eyes">
+ Olhos malévolos
+ </string>
+ <string name="Belly Size">
+ Tamanho da barriga
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Traseiro Grande
+ </string>
+ <string name="Big Eyeball">
+ Globo ocular grande
+ </string>
+ <string name="Big Hair Back">
+ Cabelo volumoso: Trás
+ </string>
+ <string name="Big Hair Front">
+ Cabelo volumoso: Frente
+ </string>
+ <string name="Big Hair Top">
+ cabelo volumoso: Topo
+ </string>
+ <string name="Big Head">
+ cabeça grande
+ </string>
+ <string name="Big Pectorals">
+ Peitorais grandes
+ </string>
+ <string name="Big Spikes">
+ espinhos grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Loiro
+ </string>
+ <string name="Blonde Hair">
+ Cabelo Loiro
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ cor do Blush
+ </string>
+ <string name="Blush Opacity">
+ Opacidade do Blush
+ </string>
+ <string name="Body Definition">
+ definição do Corpo
+ </string>
+ <string name="Body Fat">
+ Gordura corporal
+ </string>
+ <string name="Body Freckles">
+ Sardas do corpo
+ </string>
+ <string name="Body Thick">
+ Corpo cheio
+ </string>
+ <string name="Body Thickness">
+ Espessura do corpo
+ </string>
+ <string name="Body Thin">
+ Corpo magro
+ </string>
+ <string name="Bow Legged">
+ pernas arqueadas
+ </string>
+ <string name="Breast Buoyancy">
+ Flexibilidade dos seios
+ </string>
+ <string name="Breast Cleavage">
+ Separação dos seios
+ </string>
+ <string name="Breast Size">
+ Tamanho dos seios
+ </string>
+ <string name="Bridge Width">
+ Largura do nariz
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ tamanho da sobrancelha
+ </string>
+ <string name="Bug Eyes">
+ Olhos saltados
+ </string>
+ <string name="Bugged Eyes">
+ Olhos esbugalhados
+ </string>
+ <string name="Bulbous">
+ Bulbos
+ </string>
+ <string name="Bulbous Nose">
+ Nariz em bulbo
+ </string>
+ <string name="Bushy Eyebrows">
+ Sobrancelhas grossas
+ </string>
+ <string name="Bushy Hair">
+ Cabelo grosso
+ </string>
+ <string name="Butt Size">
+ Tamanho do traseiro
+ </string>
+ <string name="bustle skirt">
+ Movimentação de saia
+ </string>
+ <string name="no bustle">
+ Sem movimento
+ </string>
+ <string name="more bustle">
+ Mais movimento
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Maças do rosto
+ </string>
+ <string name="Chest Size">
+ Tamanho do peito
+ </string>
+ <string name="Chin Angle">
+ ângulo do queixo
+ </string>
+ <string name="Chin Cleft">
+ Fissura do queixo
+ </string>
+ <string name="Chin Curtains">
+ Barba de contorno
+ </string>
+ <string name="Chin Depth">
+ Profundidade do queixo
+ </string>
+ <string name="Chin Heavy">
+ Queixo pronunciado
+ </string>
+ <string name="Chin In">
+ Queixo para dentro
+ </string>
+ <string name="Chin Out">
+ Queixo para fora
+ </string>
+ <string name="Chin-Neck">
+ Queixo-pescoço
+ </string>
+ <string name="Clear">
+ Limpar
+ </string>
+ <string name="Cleft">
+ Fenda
+ </string>
+ <string name="Close Set Eyes">
+ Fechar conjunto de olhos
+ </string>
+ <string name="Closed">
+ Fechado
+ </string>
+ <string name="Closed Back">
+ Trás fechada
+ </string>
+ <string name="Closed Front">
+ Frente fechada
+ </string>
+ <string name="Closed Left">
+ Esquerda fechada
+ </string>
+ <string name="Closed Right">
+ Direita fechada
+ </string>
+ <string name="Coin Purse">
+ Pubis
+ </string>
+ <string name="Collar Back">
+ Colarinho posterior
+ </string>
+ <string name="Collar Front">
+ Colarinho anterior
+ </string>
+ <string name="Corner Down">
+ Canto para baixo
+ </string>
+ <string name="Corner Normal">
+ Canto normal
+ </string>
+ <string name="Corner Up">
+ Canto para cima
+ </string>
+ <string name="Creased">
+ Vincado
+ </string>
+ <string name="Crooked Nose">
+ Nariz torto
+ </string>
+ <string name="Cropped Hair">
+ Cabelo curto rente
+ </string>
+ <string name="Cuff Flare">
+ bainha larga
+ </string>
+ <string name="Dark">
+ Escuro
+ </string>
+ <string name="Dark Green">
+ Verde escuro
+ </string>
+ <string name="Darker">
+ mais escuro
+ </string>
+ <string name="Deep">
+ Profundidade
+ </string>
+ <string name="Default Heels">
+ Salto Padrão
+ </string>
+ <string name="Default Toe">
+ Dedo do pé padrão
+ </string>
+ <string name="Dense">
+ Densidade
+ </string>
+ <string name="Dense hair">
+ Cabelo Denso
+ </string>
+ <string name="Double Chin">
+ Queixo duplo
+ </string>
+ <string name="Downturned">
+ Curvado para baixo
+ </string>
+ <string name="Duffle Bag">
+ pubis
+ </string>
+ <string name="Ear Angle">
+ ângulo da orelha
+ </string>
+ <string name="Ear Size">
+ Tamanho da orelha
+ </string>
+ <string name="Ear Tips">
+ Pontas das orelhas
+ </string>
+ <string name="Egg Head">
+ Cabeça oval
+ </string>
+ <string name="Eye Bags">
+ Olheiras
+ </string>
+ <string name="Eye Color">
+ Cor dos olhos
+ </string>
+ <string name="Eye Depth">
+ Profundidade dos olhos
+ </string>
+ <string name="Eye Lightness">
+ Luminosidade dos olhos
+ </string>
+ <string name="Eye Opening">
+ Abertura dos olhos
+ </string>
+ <string name="Eye Pop">
+ Olho Saltado
+ </string>
+ <string name="Eye Size">
+ Tamanho dos olhos
+ </string>
+ <string name="Eye Spacing">
+ Espaçamento dos olhos
+ </string>
+ <string name="Eyeball Size">
+ Tamanho do globo ocular
+ </string>
+ <string name="Eyebrow Arc">
+ Arco da sobrancelha
+ </string>
+ <string name="Eyebrow Density">
+ densidade da sobrancelha
+ </string>
+ <string name="Eyebrow Height">
+ Altura da sobrancelha
+ </string>
+ <string name="Eyebrow Points">
+ Pontas da sobrancelha
+ </string>
+ <string name="Eyebrow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Eyelash Length">
+ Comprimento das pestanas
+ </string>
+ <string name="Eyeliner">
+ Delineador
+ </string>
+ <string name="Eyeliner Color">
+ Cor do delineador
+ </string>
+ <string name="Eyes Back">
+ Eyes Back
+ </string>
+ <string name="Eyes Bugged">
+ Olhos esbugalhados
+ </string>
+ <string name="Eyes Forward">
+ Eyes Forward
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Ponta esquerda dos olhos para cima
+ </string>
+ <string name="Eyes Shear Right Up">
+ Ponta direita dos olhos para cima
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Extensão dos Olhos
+ </string>
+ <string name="Eyes Sunken">
+ Olhos afundados
+ </string>
+ <string name="Eyes Together">
+ Olhos juntos
+ </string>
+ <string name="Face Shear">
+ Face raspada
+ </string>
+ <string name="Facial Definition">
+ Definição facial
+ </string>
+ <string name="Far Set Eyes">
+ Distância entre os olhos
+ </string>
+ <string name="Fat">
+ Gordo
+ </string>
+ <string name="Fat Head">
+ Cabeça gorda
+ </string>
+ <string name="Fat Lips">
+ Lábios carnudos
+ </string>
+ <string name="Fat Lower">
+ Inferior carnudo
+ </string>
+ <string name="Fat Lower Lip">
+ Lábio superior carnudo
+ </string>
+ <string name="Fat Torso">
+ Tronco corpulento
+ </string>
+ <string name="Fat Upper">
+ Superior carnudo
+ </string>
+ <string name="Fat Upper Lip">
+ lábio superior carnudo
+ </string>
+ <string name="Female">
+ Feminino
+ </string>
+ <string name="Fingerless">
+ Dedos
+ </string>
+ <string name="Fingers">
+ Dedos
+ </string>
+ <string name="Flared Cuffs">
+ Punhos largos
+ </string>
+ <string name="Flat">
+ Chato
+ </string>
+ <string name="Flat Butt">
+ Traseiro chato
+ </string>
+ <string name="Flat Head">
+ Cabeça chata
+ </string>
+ <string name="Flat Toe">
+ Dedos dos pés chatos
+ </string>
+ <string name="Foot Size">
+ Tamanho dos pés
+ </string>
+ <string name="Forehead Angle">
+ ângulo da testa
+ </string>
+ <string name="Forehead Heavy">
+ Testa pronunciada
+ </string>
+ <string name="Freckles">
+ Sardas
+ </string>
+ <string name="Front Bangs Down">
+ Franja da frente longa
+ </string>
+ <string name="Front Bangs Up">
+ Franja da frene arrepiada
+ </string>
+ <string name="Front Fringe">
+ Franja
+ </string>
+ <string name="Front Hair">
+ Cabelo da frente
+ </string>
+ <string name="Front Hair Down">
+ Cabelo da frente baixo
+ </string>
+ <string name="Front Hair Up">
+ cabelo da frente arrepiado
+ </string>
+ <string name="Full Back">
+ Trás cheia
+ </string>
+ <string name="Full Eyeliner">
+ Delienador cheio
+ </string>
+ <string name="Full Front">
+ Frente cheia
+ </string>
+ <string name="Full Hair Sides">
+ Cabelos laterais cheios
+ </string>
+ <string name="Full Sides">
+ Lados cheios
+ </string>
+ <string name="Glossy">
+ Brilhante
+ </string>
+ <string name="Glove Fingers">
+ Dedos da luva
+ </string>
+ <string name="Glove Length">
+ comprimento das luvas
+ </string>
+ <string name="Hair">
+ Cabelo
+ </string>
+ <string name="Hair Back">
+ Cabelo: Trás
+ </string>
+ <string name="Hair Front">
+ Cabelo: Frente
+ </string>
+ <string name="Hair Sides">
+ Cabelos: Lateral
+ </string>
+ <string name="Hair Sweep">
+ Cabelo penteado
+ </string>
+ <string name="Hair Thickess">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Thickness">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Tilt">
+ Divisão do cabelo
+ </string>
+ <string name="Hair Tilted Left">
+ Divistão do cabelo esquerda
+ </string>
+ <string name="Hair Tilted Right">
+ Divisão do cabelo direita
+ </string>
+ <string name="Hair Volume">
+ Cabelo: Volume
+ </string>
+ <string name="Hand Size">
+ Tamanho das mãos
+ </string>
+ <string name="Handlebars">
+ bigode
+ </string>
+ <string name="Head Length">
+ Comprimento da cabeça
+ </string>
+ <string name="Head Shape">
+ Formato da cabeça
+ </string>
+ <string name="Head Size">
+ Tamanho da cabeça
+ </string>
+ <string name="Head Stretch">
+ Extensão da cabeça
+ </string>
+ <string name="Heel Height">
+ Altura do salto
+ </string>
+ <string name="Heel Shape">
+ Formato do salto
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ alto
+ </string>
+ <string name="High Heels">
+ Salto alto
+ </string>
+ <string name="High Jaw">
+ Maxilar alto
+ </string>
+ <string name="High Platforms">
+ Plataformas alta
+ </string>
+ <string name="High and Tight">
+ Alto e justo
+ </string>
+ <string name="Higher">
+ Mais alto
+ </string>
+ <string name="Hip Length">
+ Comprimento do quadril
+ </string>
+ <string name="Hip Width">
+ Largura do quadril
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Cor da sombra interna
+ </string>
+ <string name="In Shdw Opacity">
+ Opacidade da sombra interna
+ </string>
+ <string name="Inner Eye Corner">
+ Canto interno dos olhos
+ </string>
+ <string name="Inner Eye Shadow">
+ Sombra interna dos olhos
+ </string>
+ <string name="Inner Shadow">
+ Sombra interna
+ </string>
+ <string name="Jacket Length">
+ Comprimento da blusa
+ </string>
+ <string name="Jacket Wrinkles">
+ Dobras da Blusa
+ </string>
+ <string name="Jaw Angle">
+ Ângulo da mandíbula
+ </string>
+ <string name="Jaw Jut">
+ Posição do maxilar
+ </string>
+ <string name="Jaw Shape">
+ Formato do maxilar
+ </string>
+ <string name="Join">
+ Juntar
+ </string>
+ <string name="Jowls">
+ Papo
+ </string>
+ <string name="Knee Angle">
+ Ângulo do joelho
+ </string>
+ <string name="Knock Kneed">
+ Joelhos para dentro
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mãos grandes
+ </string>
+ <string name="Left Part">
+ Parte esquerda
+ </string>
+ <string name="Leg Length">
+ Comprimento da perna
+ </string>
+ <string name="Leg Muscles">
+ Musculatura da perna
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura corporal
+ </string>
+ <string name="Less Curtains">
+ Menos barba
+ </string>
+ <string name="Less Freckles">
+ Menos sardas
+ </string>
+ <string name="Less Full">
+ Menos
+ </string>
+ <string name="Less Gravity">
+ Menos gravidade
+ </string>
+ <string name="Less Love">
+ Menos cintura
+ </string>
+ <string name="Less Muscles">
+ Menos músculos
+ </string>
+ <string name="Less Muscular">
+ Menos musculoso
+ </string>
+ <string name="Less Rosy">
+ Menos rosado
+ </string>
+ <string name="Less Round">
+ Menos arredondado
+ </string>
+ <string name="Less Saddle">
+ Menos ancas
+ </string>
+ <string name="Less Square">
+ Menos quadrado
+ </string>
+ <string name="Less Volume">
+ Menos volume
+ </string>
+ <string name="Less soul">
+ Menos alma
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Fenda dos lábios
+ </string>
+ <string name="Lip Cleft Depth">
+ Prfundidade da fenda dos lábios
+ </string>
+ <string name="Lip Fullness">
+ Volume dos lábios
+ </string>
+ <string name="Lip Pinkness">
+ Rosado dos lábios
+ </string>
+ <string name="Lip Ratio">
+ Proporção dos lábios
+ </string>
+ <string name="Lip Thickness">
+ Espessura dos lábios
+ </string>
+ <string name="Lip Width">
+ Largura dos lábios
+ </string>
+ <string name="Lipgloss">
+ Brilho dos lábios
+ </string>
+ <string name="Lipstick">
+ Batom
+ </string>
+ <string name="Lipstick Color">
+ Cor do batom
+ </string>
+ <string name="Long">
+ Longo
+ </string>
+ <string name="Long Head">
+ Cabeça alongada
+ </string>
+ <string name="Long Hips">
+ Lábios longos
+ </string>
+ <string name="Long Legs">
+ Pernas longas
+ </string>
+ <string name="Long Neck">
+ Pescoço longo
+ </string>
+ <string name="Long Pigtails">
+ Chiquinhas longas
+ </string>
+ <string name="Long Ponytail">
+ Rabo de cavalo longo
+ </string>
+ <string name="Long Torso">
+ Torso longo
+ </string>
+ <string name="Long arms">
+ Braços longos
+ </string>
+ <string name="Longcuffs">
+ Punho longo
+ </string>
+ <string name="Loose Pants">
+ Pantalonas
+ </string>
+ <string name="Loose Shirt">
+ Saia folgada
+ </string>
+ <string name="Loose Sleeves">
+ Manga longa
+ </string>
+ <string name="Love Handles">
+ Pneu
+ </string>
+ <string name="Low">
+ baixo
+ </string>
+ <string name="Low Heels">
+ Salto baixo
+ </string>
+ <string name="Low Jaw">
+ maxilar baixo
+ </string>
+ <string name="Low Platforms">
+ Plataformas baixas
+ </string>
+ <string name="Low and Loose">
+ baixo e solto
+ </string>
+ <string name="Lower">
+ diminuir
+ </string>
+ <string name="Lower Bridge">
+ nariz baixo
+ </string>
+ <string name="Lower Cheeks">
+ bochechas abaixadas
+ </string>
+ <string name="Male">
+ Masculino
+ </string>
+ <string name="Middle Part">
+ Parte do meio
+ </string>
+ <string name="More">
+ Mais
+ </string>
+ <string name="More Blush">
+ Mais blush
+ </string>
+ <string name="More Body Fat">
+ Mais gordura corporal
+ </string>
+ <string name="More Curtains">
+ Mais barba
+ </string>
+ <string name="More Eyeshadow">
+ Mais sombra dos olhos
+ </string>
+ <string name="More Freckles">
+ Mais sardas
+ </string>
+ <string name="More Full">
+ Mais volume
+ </string>
+ <string name="More Gravity">
+ Mais gravidade
+ </string>
+ <string name="More Lipstick">
+ Mais batom
+ </string>
+ <string name="More Love">
+ Mais cintura
+ </string>
+ <string name="More Lower Lip">
+ Mais lábio inferior
+ </string>
+ <string name="More Muscles">
+ Mais músculos
+ </string>
+ <string name="More Muscular">
+ Mais musculoso
+ </string>
+ <string name="More Rosy">
+ Mais rosado
+ </string>
+ <string name="More Round">
+ Mais arredondado
+ </string>
+ <string name="More Saddle">
+ Mais ancas
+ </string>
+ <string name="More Sloped">
+ Mais inclinado
+ </string>
+ <string name="More Square">
+ Mais quadrado
+ </string>
+ <string name="More Upper Lip">
+ Mais lábios superiores
+ </string>
+ <string name="More Vertical">
+ Mais vertical
+ </string>
+ <string name="More Volume">
+ Mais Volume
+ </string>
+ <string name="More soul">
+ Mais alma
+ </string>
+ <string name="Moustache">
+ Bigode
+ </string>
+ <string name="Mouth Corner">
+ Canto da boca
+ </string>
+ <string name="Mouth Position">
+ Posição da boca
+ </string>
+ <string name="Mowhawk">
+ Moicano
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Costeletas
+ </string>
+ <string name="Nail Polish">
+ Esmate das unhas
+ </string>
+ <string name="Nail Polish Color">
+ Cor do esmalte das unhas
+ </string>
+ <string name="Narrow">
+ Estreito
+ </string>
+ <string name="Narrow Back">
+ Costas estreitas
+ </string>
+ <string name="Narrow Front">
+ Frente estreita
+ </string>
+ <string name="Narrow Lips">
+ Lábios estreitos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Comprimento do pescoço
+ </string>
+ <string name="Neck Thickness">
+ Espessura do pescoço
+ </string>
+ <string name="No Blush">
+ Sem Blush
+ </string>
+ <string name="No Eyeliner">
+ Sem delineador
+ </string>
+ <string name="No Eyeshadow">
+ Sem Sombra dos olhos
+ </string>
+ <string name="No Heels">
+ Sem salto
+ </string>
+ <string name="No Lipgloss">
+ Sem brilho labial
+ </string>
+ <string name="No Lipstick">
+ Sem batom
+ </string>
+ <string name="No Part">
+ Sem parte
+ </string>
+ <string name="No Polish">
+ Sem esmalte
+ </string>
+ <string name="No Red">
+ Sem vermelho
+ </string>
+ <string name="No Spikes">
+ Sem espinhos
+ </string>
+ <string name="No White">
+ Sem branco
+ </string>
+ <string name="No Wrinkles">
+ Sem dobras
+ </string>
+ <string name="Normal Lower">
+ Normal inferior
+ </string>
+ <string name="Normal Upper">
+ Normal superior
+ </string>
+ <string name="Nose Left">
+ Nariz para esquerda
+ </string>
+ <string name="Nose Right">
+ Nariz para direita
+ </string>
+ <string name="Nose Size">
+ Tamanho do nariz
+ </string>
+ <string name="Nose Thickness">
+ Espessura do nariz
+ </string>
+ <string name="Nose Tip Angle">
+ Ângulo da ponta do nariz
+ </string>
+ <string name="Nose Tip Shape">
+ Formato da ponta do nariz
+ </string>
+ <string name="Nose Width">
+ Largura do nariz
+ </string>
+ <string name="Nostril Division">
+ Divisão das narinas
+ </string>
+ <string name="Nostril Width">
+ Largura das narinas
+ </string>
+ <string name="Old">
+ Velho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Aberto atrás
+ </string>
+ <string name="Open Front">
+ Aberto na frente
+ </string>
+ <string name="Open Left">
+ Aberto esquerdo
+ </string>
+ <string name="Open Right">
+ Aberto direito
+ </string>
+ <string name="Orange">
+ Laranja
+ </string>
+ <string name="Out">
+ Fora
+ </string>
+ <string name="Out Shdw Color">
+ Cor da sombra externa
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacidade da sombra externa
+ </string>
+ <string name="Outer Eye Corner">
+ Canto externo do olho
+ </string>
+ <string name="Outer Eye Shadow">
+ Sombra externa do olho
+ </string>
+ <string name="Outer Shadow">
+ Sombra externa
+ </string>
+ <string name="Overbite">
+ Overbite
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Unhas pintadas
+ </string>
+ <string name="Pale">
+ Pálido
+ </string>
+ <string name="Pants Crotch">
+ Cavalo da calça
+ </string>
+ <string name="Pants Fit">
+ Pants Fit
+ </string>
+ <string name="Pants Length">
+ Comprimento das calças
+ </string>
+ <string name="Pants Waist">
+ Cintura da calça
+ </string>
+ <string name="Pants Wrinkles">
+ Dobras das calças
+ </string>
+ <string name="Part">
+ Parte
+ </string>
+ <string name="Part Bangs">
+ Parts da franja
+ </string>
+ <string name="Pectorals">
+ Peitoral
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Chiquinhas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Mais rosado
+ </string>
+ <string name="Platform Height">
+ Altura da plataforma
+ </string>
+ <string name="Platform Width">
+ Largura da plataforma
+ </string>
+ <string name="Pointy">
+ Pontudo
+ </string>
+ <string name="Pointy Heels">
+ Salto agulha
+ </string>
+ <string name="Pointy Toe">
+ Dedo dos pés pontudo
+ </string>
+ <string name="Ponytail">
+ Rabo de cavalo
+ </string>
+ <string name="Poofy Skirt">
+ Saia bufante
+ </string>
+ <string name="Pop Left Eye">
+ Olho saltado esquerdo
+ </string>
+ <string name="Pop Right Eye">
+ Olho saltado direito
+ </string>
+ <string name="Puffy">
+ Inchado
+ </string>
+ <string name="Puffy Eyelids">
+ Pálpebras inchadas
+ </string>
+ <string name="Rainbow Color">
+ Cor do arco iris
+ </string>
+ <string name="Red Hair">
+ Cabelo ruivo
+ </string>
+ <string name="Red Skin">
+ Pele vermelha
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Regular Muscles">
+ Músculos normais
+ </string>
+ <string name="Right Part">
+ Parte direita
+ </string>
+ <string name="Rosy Complexion">
+ Rosado da face
+ </string>
+ <string name="Round">
+ Arredondado
+ </string>
+ <string name="Round Forehead">
+ Testa arredonda
+ </string>
+ <string name="Ruddiness">
+ Rubor
+ </string>
+ <string name="Ruddy">
+ Corado
+ </string>
+ <string name="Rumpled Hair">
+ Cabelo desalinhado
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Saddlebags">
+ Saddlebags
+ </string>
+ <string name="Scrawny">
+ Magricela
+ </string>
+ <string name="Scrawny Leg">
+ Pernas magricelas
+ </string>
+ <string name="Separate">
+ Separar
+ </string>
+ <string name="Shading">
+ Sombreamento
+ </string>
+ <string name="Shadow hair">
+ Sombra do cabelo
+ </string>
+ <string name="Shallow">
+ raso
+ </string>
+ <string name="Shear Back">
+ Trás rente
+ </string>
+ <string name="Shear Face">
+ Face raspada
+ </string>
+ <string name="Shear Front">
+ Frente rente
+ </string>
+ <string name="Shear Left">
+ Rente esquerda
+ </string>
+ <string name="Shear Left Up">
+ Esquerda rente para cima
+ </string>
+ <string name="Shear Right">
+ Direita rente
+ </string>
+ <string name="Shear Right Up">
+ Trás rente para cima
+ </string>
+ <string name="Sheared Back">
+ Rente atrás
+ </string>
+ <string name="Sheared Front">
+ Rente frente
+ </string>
+ <string name="Shift Left">
+ Deslocar à esquerda
+ </string>
+ <string name="Shift Mouth">
+ Deslocar boca
+ </string>
+ <string name="Shift Right">
+ Deslocar direita
+ </string>
+ <string name="Shirt Bottom">
+ Deslocar inferior
+ </string>
+ <string name="Shirt Fit">
+ Deslocar ajuste
+ </string>
+ <string name="Shirt Wrinkles">
+ Deslocar dobras
+ </string>
+ <string name="Shoe Height">
+ Altura do sapato
+ </string>
+ <string name="Short">
+ Curto
+ </string>
+ <string name="Short Arms">
+ Braços curtos
+ </string>
+ <string name="Short Legs">
+ Pernas curtas
+ </string>
+ <string name="Short Neck">
+ Pescoço curto
+ </string>
+ <string name="Short Pigtails">
+ Chiquinhas curtas
+ </string>
+ <string name="Short Ponytail">
+ Rabo de cavalo curto
+ </string>
+ <string name="Short Sideburns">
+ Costeletas curtas
+ </string>
+ <string name="Short Torso">
+ Tronco curto
+ </string>
+ <string name="Short hips">
+ Quadril curto
+ </string>
+ <string name="Shoulders">
+ Ombros
+ </string>
+ <string name="Side Bangs">
+ Franja lateral
+ </string>
+ <string name="Side Bangs Down">
+ Franja lateral longa
+ </string>
+ <string name="Side Bangs Up">
+ Franja lateral arrepiada
+ </string>
+ <string name="Side Fringe">
+ pontas laterais
+ </string>
+ <string name="Sideburns">
+ Costeletas
+ </string>
+ <string name="Sides Hair">
+ Cabelo lateral
+ </string>
+ <string name="Sides Hair Down">
+ Cabelo lateral long
+ </string>
+ <string name="Sides Hair Up">
+ Cabelo lateral superior
+ </string>
+ <string name="Skinny">
+ Magro
+ </string>
+ <string name="Skinny Neck">
+ Pescoço fino
+ </string>
+ <string name="Skirt Fit">
+ Ajuste de saia
+ </string>
+ <string name="Skirt Length">
+ Comprimento da saia
+ </string>
+ <string name="Slanted Forehead">
+ Testa inclinada
+ </string>
+ <string name="Sleeve Length">
+ Comprimento da manga
+ </string>
+ <string name="Sleeve Looseness">
+ Folga da manga
+ </string>
+ <string name="Slit Back">
+ Abertura : Atrás
+ </string>
+ <string name="Slit Front">
+ Abertura: Frente
+ </string>
+ <string name="Slit Left">
+ Abertura: Esquerda
+ </string>
+ <string name="Slit Right">
+ Abertura: Direita
+ </string>
+ <string name="Small">
+ Pequeno
+ </string>
+ <string name="Small Hands">
+ Mãos pequenas
+ </string>
+ <string name="Small Head">
+ Cabeça pequena
+ </string>
+ <string name="Smooth">
+ Suavizar
+ </string>
+ <string name="Smooth Hair">
+ Suavizar cabelo
+ </string>
+ <string name="Socks Length">
+ Comprimento das meias
+ </string>
+ <string name="Some">
+ Alguns
+ </string>
+ <string name="Soulpatch">
+ Cavanhaque
+ </string>
+ <string name="Sparse">
+ Disperso
+ </string>
+ <string name="Spiked Hair">
+ Cabelo espetado
+ </string>
+ <string name="Square">
+ Quadrado
+ </string>
+ <string name="Square Toe">
+ Dedo quadrado
+ </string>
+ <string name="Squash Head">
+ Cabeça de Pera
+ </string>
+ <string name="Squash/Stretch Head">
+ Cabeça esticada/forma de pera
+ </string>
+ <string name="Stretch Head">
+ Cabeça esticada
+ </string>
+ <string name="Sunken">
+ Afundar
+ </string>
+ <string name="Sunken Chest">
+ Peito afundado
+ </string>
+ <string name="Sunken Eyes">
+ Olhos afundados
+ </string>
+ <string name="Sweep Back">
+ Pentear para trás
+ </string>
+ <string name="Sweep Forward">
+ Pentear para frente
+ </string>
+ <string name="Swept Back">
+ Pentear para trás
+ </string>
+ <string name="Swept Back Hair">
+ Cabelo penteado para trás
+ </string>
+ <string name="Swept Forward">
+ Penteado para frente
+ </string>
+ <string name="Swept Forward Hair">
+ Cabelo penteado para frente
+ </string>
+ <string name="Tall">
+ Alto
+ </string>
+ <string name="Taper Back">
+ Afinar atrás
+ </string>
+ <string name="Taper Front">
+ Afinar a frente
+ </string>
+ <string name="Thick Heels">
+ Salto grosso
+ </string>
+ <string name="Thick Neck">
+ Pescoço grosso
+ </string>
+ <string name="Thick Toe">
+ Dedo grosso
+ </string>
+ <string name="Thickness">
+ Espessura
+ </string>
+ <string name="Thin">
+ Fino
+ </string>
+ <string name="Thin Eyebrows">
+ Sobrancelhas finas
+ </string>
+ <string name="Thin Lips">
+ Lábios finos
+ </string>
+ <string name="Thin Nose">
+ Nariz fino
+ </string>
+ <string name="Tight Chin">
+ Queixo apertado
+ </string>
+ <string name="Tight Cuffs">
+ Punho justo
+ </string>
+ <string name="Tight Pants">
+ Calça justa
+ </string>
+ <string name="Tight Shirt">
+ Camisa justa
+ </string>
+ <string name="Tight Skirt">
+ Saia justa
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Tilt Left">
+ Inclinado à esquerda
+ </string>
+ <string name="Tilt Right">
+ Inclinado à direita
+ </string>
+ <string name="Toe Shape">
+ Formato dos dedos
+ </string>
+ <string name="Toe Thickness">
+ Espessura dos dos dedos
+ </string>
+ <string name="Torso Length">
+ Comprimento do tronco
+ </string>
+ <string name="Torso Muscles">
+ Músculos do tronco
+ </string>
+ <string name="Torso Scrawny">
+ Tronco magricela
+ </string>
+ <string name="Unattached">
+ Desanexado
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Não natural
+ </string>
+ <string name="Upper Bridge">
+ Parte alta do nariz
+ </string>
+ <string name="Upper Cheeks">
+ Bochechas altas
+ </string>
+ <string name="Upper Chin Cleft">
+ fenda do queixo alta
+ </string>
+ <string name="Upper Eyelid Fold">
+ Curvatura dos cílios supériores
+ </string>
+ <string name="Upturned">
+ Voltado para cima
+ </string>
+ <string name="Very Red">
+ Bem vermelho
+ </string>
+ <string name="Waist Height">
+ Altura da cintura
+ </string>
+ <string name="Well-Fed">
+ Corpulento
+ </string>
+ <string name="White Hair">
+ Grisalho
+ </string>
+ <string name="Wide">
+ Amplo
+ </string>
+ <string name="Wide Back">
+ Costas largas
+ </string>
+ <string name="Wide Front">
+ Testa larga
+ </string>
+ <string name="Wide Lips">
+ Lábios amplos
+ </string>
+ <string name="Wild">
+ Selvagem
+ </string>
+ <string name="Wrinkles">
+ Rugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Adicionar às minhas Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar minhas Landmarks
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver mais informações sobre a localização atual
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Meu histórico de localizações
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Atualização
+ </string>
+ <string name="UpdaterNowUpdating">
+ Atualizando agora o [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Fazendo o download da atualização...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Fazendo o download da atualização
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Falha no download da atualização
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Falha ao instalar a atualização
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Falha ao iniciar o visualizador
+ </string>
+ <string name="IM_logging_string">
+ -- Log de mensagem instantânea habilitado --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está digitando...
+ </string>
+ <string name="Unnamed">
+ (Anônimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: Voz desativado por padrão)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bate-papo de texto não está disponível para esta chamada.
+ </string>
+ <string name="IM_muted_text_label">
+ Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.
+ </string>
+ <string name="IM_default_text_label">
+ Clique aqui para menagem instantânea.
+ </string>
+ <string name="IM_to_label">
+ Para
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Tomar linden dólares (L$) de você
- </string>
- <string name="ActOnControlInputs">
- Atue nas suas entradas de controle
- </string>
- <string name="RemapControlInputs">
- Remapeie suas entradas de controle
- </string>
- <string name="AnimateYourAvatar">
- Faça uma animação para o seu avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexe ao seu avatar
- </string>
- <string name="ReleaseOwnership">
- Libere a propriedade e torne-a pública
- </string>
- <string name="LinkAndDelink">
- Una e desuna de outros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Adicione e remova junções com outros objetos
- </string>
- <string name="ChangePermissions">
- Modifique as permissões
- </string>
- <string name="TrackYourCamera">
- Acompanhe sua câmera
- </string>
- <string name="ControlYourCamera">
- Controle sua camera
- </string>
<string name="only_user_message">
Você é o único usuário desta sessão.
</string>
@@ -620,31 +3245,4 @@
<string name="close_on_no_ability">
Você não possui mais a habilidade de estar na sessão de bate-papo.
</string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Teste
- </string>
- <string name="AcctTypeCharterMember">
- Estatuto do membro
- </string>
- <string name="AcctTypeEmployee">
- Contratado da Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Infor. de pagamento utilizadas
- </string>
- <string name="PaymentInfoOnFile">
- Infor. de pagamento no arquivo
- </string>
- <string name="NoPaymentInfoOnFile">
- Sem infor. de pagamento no arquivo
- </string>
- <string name="AgeVerified">
- Idade Verificada
- </string>
- <string name="NotAgeVerified">
- Idade não Verificada
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 6eecc45bcf..1a0461082b 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
+ Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
+ Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
diff --git a/indra/newview/tests/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index 4759c7dc91..ca7d02fc68 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -50,6 +50,7 @@
#include "tests/networkio.h"
#include "tests/commtest.h"
#include "tests/wrapllerrs.h"
+#include "message.h"
#include "stringize.h"
#if defined(LL_WINDOWS)
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index ed753b6ff7..7ba82fbd2c 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -60,6 +60,11 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count)
{
+ count_string_t key(xml_desc, count);
+ if (gCountString.find(key) == gCountString.end())
+ {
+ return std::string("Couldn't find ") + xml_desc;
+ }
return gCountString[ count_string_t(xml_desc, count) ];
}
@@ -91,8 +96,11 @@ namespace tut
gCountString[ count_string_t("AgeYears", 2) ] = "2 years";
gCountString[ count_string_t("AgeMonths", 1) ] = "1 month";
gCountString[ count_string_t("AgeMonths", 2) ] = "2 months";
+ gCountString[ count_string_t("AgeMonths", 11) ]= "11 months";
gCountString[ count_string_t("AgeWeeks", 1) ] = "1 week";
gCountString[ count_string_t("AgeWeeks", 2) ] = "2 weeks";
+ gCountString[ count_string_t("AgeWeeks", 3) ] = "3 weeks";
+ gCountString[ count_string_t("AgeWeeks", 4) ] = "4 weeks";
gCountString[ count_string_t("AgeDays", 1) ] = "1 day";
gCountString[ count_string_t("AgeDays", 2) ] = "2 days";
}
@@ -113,12 +121,18 @@ namespace tut
ensure_equals("years",
LLDateUtil::ageFromDate("12/31/2007", mNow),
"2 years old" );
- ensure_equals("single year",
- LLDateUtil::ageFromDate("12/31/2008", mNow),
- "1 year old" );
+ ensure_equals("years",
+ LLDateUtil::ageFromDate("1/1/2008", mNow),
+ "1 year 11 months old" );
+ ensure_equals("single year + one month",
+ LLDateUtil::ageFromDate("11/30/2008", mNow),
+ "1 year 1 month old" );
ensure_equals("single year + a bit",
LLDateUtil::ageFromDate("12/12/2008", mNow),
"1 year old" );
+ ensure_equals("single year",
+ LLDateUtil::ageFromDate("12/31/2008", mNow),
+ "1 year old" );
}
template<> template<>
@@ -128,6 +142,9 @@ namespace tut
ensure_equals("months",
LLDateUtil::ageFromDate("10/30/2009", mNow),
"2 months old" );
+ ensure_equals("months 2",
+ LLDateUtil::ageFromDate("10/31/2009", mNow),
+ "2 months old" );
ensure_equals("single month",
LLDateUtil::ageFromDate("11/30/2009", mNow),
"1 month old" );
@@ -137,6 +154,9 @@ namespace tut
void dateutil_object_t::test<3>()
{
set_test_name("Weeks");
+ ensure_equals("4 weeks",
+ LLDateUtil::ageFromDate("12/1/2009", mNow),
+ "4 weeks old" );
ensure_equals("weeks",
LLDateUtil::ageFromDate("12/17/2009", mNow),
"2 weeks old" );
@@ -159,4 +179,14 @@ namespace tut
LLDateUtil::ageFromDate("12/31/2009", mNow),
"Joined today" );
}
+
+ template<> template<>
+ void dateutil_object_t::test<5>()
+ {
+ set_test_name("2010 rollover");
+ LLDate now(std::string("2010-01-04T12:00:00Z"));
+ ensure_equals("days",
+ LLDateUtil::ageFromDate("12/13/2009", now),
+ "3 weeks old" );
+ }
}
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index 009be35f64..ef93586c6e 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -1,423 +1,424 @@
-/**
- * @file lllogininstance_test.cpp
- * @brief Test for lllogininstance.cpp.
- *
- * $LicenseInfo:firstyear=2008&license=internal$
- * Copyright (c) 2008, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-// Precompiled header
-#include "../llviewerprecompiledheaders.h"
-// Own header
-#include "../lllogininstance.h"
-// STL headers
-// std headers
-// external library headers
-// other Linden headers
-#include "../test/lltut.h"
-#include "llevents.h"
-
-#if defined(LL_WINDOWS)
-#pragma warning(disable: 4355) // using 'this' in base-class ctor initializer expr
-#endif
-
-// Constants
-const std::string VIEWERLOGIN_URI("viewerlogin_uri");
-const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid");
-
-const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno");
-
-// Link seams.
-
-//-----------------------------------------------------------------------------
-static LLEventStream gTestPump("test_pump");
-
-#include "lllogin.h"
-static std::string gLoginURI;
-static LLSD gLoginCreds;
-static bool gDisconnectCalled = false;
-class LLLogin::Impl
-{
-};
-LLLogin::LLLogin() {}
-LLLogin::~LLLogin() {}
-LLEventPump& LLLogin::getEventPump() { return gTestPump; }
-void LLLogin::connect(const std::string& uri, const LLSD& credentials)
-{
- gLoginURI = uri;
- gLoginCreds = credentials;
-}
-
-void LLLogin::disconnect()
-{
- gDisconnectCalled = true;
-}
-
-//-----------------------------------------------------------------------------
-#include "../llviewernetwork.h"
-unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'}; /* Flawfinder: ignore */
-
-LLViewerLogin::LLViewerLogin() {}
-LLViewerLogin::~LLViewerLogin() {}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
-{
- uris.push_back(VIEWERLOGIN_URI);
-}
-std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; }
-
-//-----------------------------------------------------------------------------
-#include "../llviewercontrol.h"
-LLControlGroup gSavedSettings("Global");
-std::string gCurrentVersion = "invalid_version";
-
-LLControlGroup::LLControlGroup(const std::string& name) :
- LLInstanceTracker<LLControlGroup, std::string>(name){}
-LLControlGroup::~LLControlGroup() {}
-void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
-BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
-U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
-void LLControlGroup::setString(const std::string& name, const std::string& val) {}
-std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }
-BOOL LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return TRUE; }
-BOOL LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return TRUE; }
-
-#include "lluicolortable.h"
-void LLUIColorTable::saveUserSettings(void)const {}
-
-//-----------------------------------------------------------------------------
-#include "../llurlsimstring.h"
-LLURLSimString LLURLSimString::sInstance;
-bool LLURLSimString::parse() { return true; }
-
-//-----------------------------------------------------------------------------
-#include "llnotifications.h"
-#include "llfloaterreg.h"
-static std::string gTOSType;
-static LLEventPump * gTOSReplyPump = NULL;
-
-//static
-LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
-{
- gTOSType = name;
- gTOSReplyPump = &LLEventPumps::instance().obtain(key["reply_pump"]);
- return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// LLNotifications
-class MockNotifications : public LLNotificationsInterface
-{
- boost::function<void (const LLSD&, const LLSD&)> mResponder;
- int mAddedCount;
-
-public:
- MockNotifications() :
- mResponder(0),
- mAddedCount(0)
- {
- }
-
- virtual ~MockNotifications() {}
-
- /* virtual */ LLNotificationPtr add(
- const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload,
- LLNotificationFunctorRegistry::ResponseFunctor functor)
- {
- mResponder = functor;
- mAddedCount++;
- return LLNotificationPtr((LLNotification*)NULL);
- }
-
- void sendYesResponse()
- {
- LLSD notification;
- LLSD response;
- response = 1;
- mResponder(notification, response);
- }
-
- void sendNoResponse()
- {
- LLSD notification;
- LLSD response;
- response = 2;
- mResponder(notification, response);
- }
-
- void sendBogusResponse()
- {
- LLSD notification;
- LLSD response;
- response = 666;
- mResponder(notification, response);
- }
-
- int addedCount() { return mAddedCount; }
-};
-
-S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
-{
- return response.asInteger();
-}
-
-// misc
-std::string xml_escape_string(const std::string& in)
-{
- return in;
-}
-
-/*****************************************************************************
-* TUT
-*****************************************************************************/
-namespace tut
-{
- struct lllogininstance_data
- {
- lllogininstance_data() : logininstance(LLLoginInstance::getInstance())
- {
- // Global initialization
- gLoginURI.clear();
- gLoginCreds.clear();
- gDisconnectCalled = false;
-
- gTOSType = ""; // Set to invalid value.
- gTOSReplyPump = 0; // clear the callback.
-
-
- gSavedSettings.declareBOOL("NoInventoryLibrary", FALSE, "", FALSE);
- gSavedSettings.declareBOOL("ConnectAsGod", FALSE, "", FALSE);
- gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE);
- gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE);
- gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE);
- gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE);
- gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);
- gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE);
-
- credentials["first"] = "testfirst";
- credentials["last"] = "testlast";
- credentials["passwd"] = "testpass";
-
- logininstance->setNotificationsInterface(&notifications);
- }
-
- LLLoginInstance* logininstance;
- LLSD credentials;
- MockNotifications notifications;
- };
-
- typedef test_group<lllogininstance_data> lllogininstance_group;
- typedef lllogininstance_group::object lllogininstance_object;
- lllogininstance_group llsdmgr("lllogininstance");
-
- template<> template<>
- void lllogininstance_object::test<1>()
- {
- set_test_name("Test Simple Success And Disconnect");
-
- // Test default connect.
- logininstance->connect(credentials);
-
- ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
-
- // Dummy success response.
- LLSD response;
- response["state"] = "online";
- response["change"] = "connect";
- response["progress"] = 1.0;
- response["transfer_rate"] = 7;
- response["data"] = "test_data";
-
- gTestPump.post(response);
-
- ensure("Success response", logininstance->authSuccess());
- ensure_equals("Test Response Data", logininstance->getResponse().asString(), "test_data");
-
- logininstance->disconnect();
-
- ensure_equals("Called Login Module Disconnect", gDisconnectCalled, true);
-
- response.clear();
- response["state"] = "offline";
- response["change"] = "disconnect";
- response["progress"] = 0.0;
- response["transfer_rate"] = 0;
- response["data"] = "test_data";
-
- gTestPump.post(response);
-
- ensure("Disconnected", !(logininstance->authSuccess()));
- }
-
- template<> template<>
- void lllogininstance_object::test<2>()
- {
- set_test_name("Test User TOS/Critical message Interaction");
-
- const std::string test_uri = "testing-uri";
-
- // Test default connect.
- logininstance->connect(test_uri, credentials);
-
- // connect should call LLLogin::connect to init gLoginURI and gLoginCreds.
- ensure_equals("Default connect uri", gLoginURI, "testing-uri");
- ensure_equals("Default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
- ensure_equals("Default for read critical", gLoginCreds["params"]["read_critical"].asBoolean(), false);
-
- // TOS failure response.
- LLSD response;
- response["state"] = "offline";
- response["change"] = "fail.login";
- response["progress"] = 0.0;
- response["transfer_rate"] = 7;
- response["data"]["reason"] = "tos";
- gTestPump.post(response);
-
- ensure_equals("TOS Dialog type", gTOSType, "message_tos");
- ensure("TOS callback given", gTOSReplyPump != 0);
- gTOSReplyPump->post(false); // Call callback denying TOS.
- ensure("No TOS, failed auth", logininstance->authFailure());
-
- // Start again.
- logininstance->connect(test_uri, credentials);
- gTestPump.post(response); // Fail for tos again.
- gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos.
- ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true);
- ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
-
- // Fail connection, attempt connect again.
- // The new request should have reset agree to tos to default.
- response["data"]["reason"] = "key"; // bad creds.
- gTestPump.post(response);
- ensure("TOS auth failure", logininstance->authFailure());
-
- logininstance->connect(test_uri, credentials);
- ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
-
- // Critical Message failure response.
- logininstance->connect(test_uri, credentials);
- response["data"]["reason"] = "critical"; // Change response to "critical message"
- gTestPump.post(response);
-
- ensure_equals("TOS Dialog type", gTOSType, "message_critical");
- ensure("TOS callback given", gTOSReplyPump != 0);
- gTOSReplyPump->post(true);
- ensure_equals("Accepted read critical message", gLoginCreds["params"]["read_critical"].asBoolean(), true);
- ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
-
- // Fail then attempt new connection
- response["data"]["reason"] = "key"; // bad creds.
- gTestPump.post(response);
- ensure("TOS auth failure", logininstance->authFailure());
- logininstance->connect(test_uri, credentials);
- ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
- }
-
- template<> template<>
- void lllogininstance_object::test<3>()
- {
- set_test_name("Test Mandatory Update User Accepts");
-
- // Part 1 - Mandatory Update, with User accepts response.
- // Test connect with update needed.
- logininstance->connect(credentials);
-
- ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
-
- // Update needed failure response.
- LLSD response;
- response["state"] = "offline";
- response["change"] = "fail.login";
- response["progress"] = 0.0;
- response["transfer_rate"] = 7;
- response["data"]["reason"] = "update";
- gTestPump.post(response);
-
- ensure_equals("Notification added", notifications.addedCount(), 1);
-
- notifications.sendYesResponse();
-
- ensure("Disconnected", !(logininstance->authSuccess()));
- }
-
- template<> template<>
- void lllogininstance_object::test<4>()
- {
- set_test_name("Test Mandatory Update User Decline");
-
- // Test connect with update needed.
- logininstance->connect(credentials);
-
- ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
-
- // Update needed failure response.
- LLSD response;
- response["state"] = "offline";
- response["change"] = "fail.login";
- response["progress"] = 0.0;
- response["transfer_rate"] = 7;
- response["data"]["reason"] = "update";
- gTestPump.post(response);
-
- ensure_equals("Notification added", notifications.addedCount(), 1);
- notifications.sendNoResponse();
-
- ensure("Disconnected", !(logininstance->authSuccess()));
- }
-
- template<> template<>
- void lllogininstance_object::test<6>()
- {
- set_test_name("Test Optional Update User Accept");
-
- // Part 3 - Mandatory Update, with bogus response.
- // Test connect with update needed.
- logininstance->connect(credentials);
-
- ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
-
- // Update needed failure response.
- LLSD response;
- response["state"] = "offline";
- response["change"] = "fail.login";
- response["progress"] = 0.0;
- response["transfer_rate"] = 7;
- response["data"]["reason"] = "optional";
- gTestPump.post(response);
-
- ensure_equals("Notification added", notifications.addedCount(), 1);
- notifications.sendYesResponse();
-
- ensure("Disconnected", !(logininstance->authSuccess()));
- }
-
- template<> template<>
- void lllogininstance_object::test<7>()
- {
- set_test_name("Test Optional Update User Denies");
-
- // Part 3 - Mandatory Update, with bogus response.
- // Test connect with update needed.
- logininstance->connect(credentials);
-
- ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
-
- // Update needed failure response.
- LLSD response;
- response["state"] = "offline";
- response["change"] = "fail.login";
- response["progress"] = 0.0;
- response["transfer_rate"] = 7;
- response["data"]["reason"] = "optional";
- gTestPump.post(response);
-
- ensure_equals("Notification added", notifications.addedCount(), 1);
- notifications.sendNoResponse();
-
- // User skips, should be reconnecting.
- ensure_equals("reconnect uri", gLoginURI, VIEWERLOGIN_URI);
- ensure_equals("skipping optional update", gLoginCreds["params"]["skipoptional"].asBoolean(), true);
- }
-}
+/**
+ * @file lllogininstance_test.cpp
+ * @brief Test for lllogininstance.cpp.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * Copyright (c) 2008, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "../llviewerprecompiledheaders.h"
+// Own header
+#include "../lllogininstance.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "../test/lltut.h"
+#include "llevents.h"
+
+#if defined(LL_WINDOWS)
+#pragma warning(disable: 4355) // using 'this' in base-class ctor initializer expr
+#endif
+
+// Constants
+const std::string VIEWERLOGIN_URI("viewerlogin_uri");
+const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid");
+
+const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno");
+
+// Link seams.
+
+//-----------------------------------------------------------------------------
+static LLEventStream gTestPump("test_pump");
+
+#include "lllogin.h"
+static std::string gLoginURI;
+static LLSD gLoginCreds;
+static bool gDisconnectCalled = false;
+class LLLogin::Impl
+{
+};
+LLLogin::LLLogin() {}
+LLLogin::~LLLogin() {}
+LLEventPump& LLLogin::getEventPump() { return gTestPump; }
+void LLLogin::connect(const std::string& uri, const LLSD& credentials)
+{
+ gLoginURI = uri;
+ gLoginCreds = credentials;
+}
+
+void LLLogin::disconnect()
+{
+ gDisconnectCalled = true;
+}
+
+//-----------------------------------------------------------------------------
+#include "../llviewernetwork.h"
+unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'};
+
+LLViewerLogin::LLViewerLogin() : mGridChoice(GRID_INFO_NONE) {}
+LLViewerLogin::~LLViewerLogin() {}
+void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
+{
+ uris.push_back(VIEWERLOGIN_URI);
+}
+std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; }
+
+//-----------------------------------------------------------------------------
+#include "../llviewercontrol.h"
+LLControlGroup gSavedSettings("Global");
+std::string gCurrentVersion = "invalid_version";
+
+LLControlGroup::LLControlGroup(const std::string& name) :
+ LLInstanceTracker<LLControlGroup, std::string>(name){}
+LLControlGroup::~LLControlGroup() {}
+void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
+BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
+F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; }
+U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
+void LLControlGroup::setString(const std::string& name, const std::string& val) {}
+std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }
+BOOL LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return TRUE; }
+BOOL LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return TRUE; }
+
+#include "lluicolortable.h"
+void LLUIColorTable::saveUserSettings(void)const {}
+
+//-----------------------------------------------------------------------------
+#include "../llurlsimstring.h"
+LLURLSimString LLURLSimString::sInstance;
+bool LLURLSimString::parse() { return true; }
+
+//-----------------------------------------------------------------------------
+#include "llnotifications.h"
+#include "llfloaterreg.h"
+static std::string gTOSType;
+static LLEventPump * gTOSReplyPump = NULL;
+
+//static
+LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
+{
+ gTOSType = name;
+ gTOSReplyPump = &LLEventPumps::instance().obtain(key["reply_pump"]);
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// LLNotifications
+class MockNotifications : public LLNotificationsInterface
+{
+ boost::function<void (const LLSD&, const LLSD&)> mResponder;
+ int mAddedCount;
+
+public:
+ MockNotifications() :
+ mResponder(0),
+ mAddedCount(0)
+ {
+ }
+
+ virtual ~MockNotifications() {}
+
+ /* virtual */ LLNotificationPtr add(
+ const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ LLNotificationFunctorRegistry::ResponseFunctor functor)
+ {
+ mResponder = functor;
+ mAddedCount++;
+ return LLNotificationPtr((LLNotification*)NULL);
+ }
+
+ void sendYesResponse()
+ {
+ LLSD notification;
+ LLSD response;
+ response = 1;
+ mResponder(notification, response);
+ }
+
+ void sendNoResponse()
+ {
+ LLSD notification;
+ LLSD response;
+ response = 2;
+ mResponder(notification, response);
+ }
+
+ void sendBogusResponse()
+ {
+ LLSD notification;
+ LLSD response;
+ response = 666;
+ mResponder(notification, response);
+ }
+
+ int addedCount() { return mAddedCount; }
+};
+
+S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
+{
+ return response.asInteger();
+}
+
+// misc
+std::string xml_escape_string(const std::string& in)
+{
+ return in;
+}
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct lllogininstance_data
+ {
+ lllogininstance_data() : logininstance(LLLoginInstance::getInstance())
+ {
+ // Global initialization
+ gLoginURI.clear();
+ gLoginCreds.clear();
+ gDisconnectCalled = false;
+
+ gTOSType = ""; // Set to invalid value.
+ gTOSReplyPump = 0; // clear the callback.
+
+
+ gSavedSettings.declareBOOL("NoInventoryLibrary", FALSE, "", FALSE);
+ gSavedSettings.declareBOOL("ConnectAsGod", FALSE, "", FALSE);
+ gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE);
+ gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE);
+ gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE);
+ gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE);
+ gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);
+ gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE);
+
+ credentials["first"] = "testfirst";
+ credentials["last"] = "testlast";
+ credentials["passwd"] = "testpass";
+
+ logininstance->setNotificationsInterface(&notifications);
+ }
+
+ LLLoginInstance* logininstance;
+ LLSD credentials;
+ MockNotifications notifications;
+ };
+
+ typedef test_group<lllogininstance_data> lllogininstance_group;
+ typedef lllogininstance_group::object lllogininstance_object;
+ lllogininstance_group llsdmgr("lllogininstance");
+
+ template<> template<>
+ void lllogininstance_object::test<1>()
+ {
+ set_test_name("Test Simple Success And Disconnect");
+
+ // Test default connect.
+ logininstance->connect(credentials);
+
+ ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
+
+ // Dummy success response.
+ LLSD response;
+ response["state"] = "online";
+ response["change"] = "connect";
+ response["progress"] = 1.0;
+ response["transfer_rate"] = 7;
+ response["data"] = "test_data";
+
+ gTestPump.post(response);
+
+ ensure("Success response", logininstance->authSuccess());
+ ensure_equals("Test Response Data", logininstance->getResponse().asString(), "test_data");
+
+ logininstance->disconnect();
+
+ ensure_equals("Called Login Module Disconnect", gDisconnectCalled, true);
+
+ response.clear();
+ response["state"] = "offline";
+ response["change"] = "disconnect";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 0;
+ response["data"] = "test_data";
+
+ gTestPump.post(response);
+
+ ensure("Disconnected", !(logininstance->authSuccess()));
+ }
+
+ template<> template<>
+ void lllogininstance_object::test<2>()
+ {
+ set_test_name("Test User TOS/Critical message Interaction");
+
+ const std::string test_uri = "testing-uri";
+
+ // Test default connect.
+ logininstance->connect(test_uri, credentials);
+
+ // connect should call LLLogin::connect to init gLoginURI and gLoginCreds.
+ ensure_equals("Default connect uri", gLoginURI, "testing-uri");
+ ensure_equals("Default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
+ ensure_equals("Default for read critical", gLoginCreds["params"]["read_critical"].asBoolean(), false);
+
+ // TOS failure response.
+ LLSD response;
+ response["state"] = "offline";
+ response["change"] = "fail.login";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 7;
+ response["data"]["reason"] = "tos";
+ gTestPump.post(response);
+
+ ensure_equals("TOS Dialog type", gTOSType, "message_tos");
+ ensure("TOS callback given", gTOSReplyPump != 0);
+ gTOSReplyPump->post(false); // Call callback denying TOS.
+ ensure("No TOS, failed auth", logininstance->authFailure());
+
+ // Start again.
+ logininstance->connect(test_uri, credentials);
+ gTestPump.post(response); // Fail for tos again.
+ gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos.
+ ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true);
+ ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
+
+ // Fail connection, attempt connect again.
+ // The new request should have reset agree to tos to default.
+ response["data"]["reason"] = "key"; // bad creds.
+ gTestPump.post(response);
+ ensure("TOS auth failure", logininstance->authFailure());
+
+ logininstance->connect(test_uri, credentials);
+ ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
+
+ // Critical Message failure response.
+ logininstance->connect(test_uri, credentials);
+ response["data"]["reason"] = "critical"; // Change response to "critical message"
+ gTestPump.post(response);
+
+ ensure_equals("TOS Dialog type", gTOSType, "message_critical");
+ ensure("TOS callback given", gTOSReplyPump != 0);
+ gTOSReplyPump->post(true);
+ ensure_equals("Accepted read critical message", gLoginCreds["params"]["read_critical"].asBoolean(), true);
+ ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
+
+ // Fail then attempt new connection
+ response["data"]["reason"] = "key"; // bad creds.
+ gTestPump.post(response);
+ ensure("TOS auth failure", logininstance->authFailure());
+ logininstance->connect(test_uri, credentials);
+ ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
+ }
+
+ template<> template<>
+ void lllogininstance_object::test<3>()
+ {
+ set_test_name("Test Mandatory Update User Accepts");
+
+ // Part 1 - Mandatory Update, with User accepts response.
+ // Test connect with update needed.
+ logininstance->connect(credentials);
+
+ ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
+
+ // Update needed failure response.
+ LLSD response;
+ response["state"] = "offline";
+ response["change"] = "fail.login";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 7;
+ response["data"]["reason"] = "update";
+ gTestPump.post(response);
+
+ ensure_equals("Notification added", notifications.addedCount(), 1);
+
+ notifications.sendYesResponse();
+
+ ensure("Disconnected", !(logininstance->authSuccess()));
+ }
+
+ template<> template<>
+ void lllogininstance_object::test<4>()
+ {
+ set_test_name("Test Mandatory Update User Decline");
+
+ // Test connect with update needed.
+ logininstance->connect(credentials);
+
+ ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
+
+ // Update needed failure response.
+ LLSD response;
+ response["state"] = "offline";
+ response["change"] = "fail.login";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 7;
+ response["data"]["reason"] = "update";
+ gTestPump.post(response);
+
+ ensure_equals("Notification added", notifications.addedCount(), 1);
+ notifications.sendNoResponse();
+
+ ensure("Disconnected", !(logininstance->authSuccess()));
+ }
+
+ template<> template<>
+ void lllogininstance_object::test<6>()
+ {
+ set_test_name("Test Optional Update User Accept");
+
+ // Part 3 - Mandatory Update, with bogus response.
+ // Test connect with update needed.
+ logininstance->connect(credentials);
+
+ ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
+
+ // Update needed failure response.
+ LLSD response;
+ response["state"] = "offline";
+ response["change"] = "fail.login";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 7;
+ response["data"]["reason"] = "optional";
+ gTestPump.post(response);
+
+ ensure_equals("Notification added", notifications.addedCount(), 1);
+ notifications.sendYesResponse();
+
+ ensure("Disconnected", !(logininstance->authSuccess()));
+ }
+
+ template<> template<>
+ void lllogininstance_object::test<7>()
+ {
+ set_test_name("Test Optional Update User Denies");
+
+ // Part 3 - Mandatory Update, with bogus response.
+ // Test connect with update needed.
+ logininstance->connect(credentials);
+
+ ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
+
+ // Update needed failure response.
+ LLSD response;
+ response["state"] = "offline";
+ response["change"] = "fail.login";
+ response["progress"] = 0.0;
+ response["transfer_rate"] = 7;
+ response["data"]["reason"] = "optional";
+ gTestPump.post(response);
+
+ ensure_equals("Notification added", notifications.addedCount(), 1);
+ notifications.sendNoResponse();
+
+ // User skips, should be reconnecting.
+ ensure_equals("reconnect uri", gLoginURI, VIEWERLOGIN_URI);
+ ensure_equals("skipping optional update", gLoginCreds["params"]["skipoptional"].asBoolean(), true);
+ }
+}
diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp
index 445ec7aa34..33d413bd21 100644
--- a/indra/newview/tests/llmediadataclient_test.cpp
+++ b/indra/newview/tests/llmediadataclient_test.cpp
@@ -75,15 +75,13 @@
<string>baz</string> \
</array>"
-#define _DATA_URLS(ID,DIST,INT,URL1,URL2) " \
+#define _DATA_URLS(ID,INTEREST,NEW,URL1,URL2) " \
<llsd> \
<map> \
<key>uuid</key> \
<string>" ID "</string> \
- <key>distance</key> \
- <real>" DIST "</real> \
<key>interest</key> \
- <real>" INT "</real> \
+ <real>" INTEREST "</real> \
<key>cap_urls</key> \
<map> \
<key>ObjectMedia</key> \
@@ -93,21 +91,26 @@
</map> \
<key>media_data</key> \
" MEDIA_DATA " \
+ <key>is_dead</key> \
+ <boolean>false</boolean> \
+ <key>is_new</key> \
+ <boolean>" NEW "</boolean> \
</map> \
</llsd>"
-#define _DATA(ID,DIST,INT) _DATA_URLS(ID,DIST,INT,FAKE_OBJECT_MEDIA_CAP_URL,FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL)
+#define _DATA(ID,INTEREST,NEW) _DATA_URLS(ID,INTEREST,NEW,FAKE_OBJECT_MEDIA_CAP_URL,FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL)
-const char *DATA = _DATA(VALID_OBJECT_ID,"1.0","1.0");
+const char *DATA = _DATA(VALID_OBJECT_ID,"1.0","true");
#define STR(I) boost::lexical_cast<std::string>(I)
#define LOG_TEST(N) LL_DEBUGS("LLMediaDataClient") << "\n" << \
"================================================================================\n" << \
-"===================================== TEST " #N " ===================================\n" << \
+"==================================== TEST " #N " ===================================\n" << \
"================================================================================\n" << LL_ENDL;
LLSD *gPostRecords = NULL;
+F64 gMinimumInterestLevel = (F64)0.0;
// stubs:
void LLHTTPClient::post(
@@ -125,21 +128,20 @@ void LLHTTPClient::post(
gPostRecords->append(record);
// Magic URL that triggers a 503:
+ LLSD result;
+ result[LLTextureEntry::OBJECT_ID_KEY] = body[LLTextureEntry::OBJECT_ID_KEY];
if ( url == FAKE_OBJECT_MEDIA_CAP_URL_503 )
{
responder->error(HTTP_SERVICE_UNAVAILABLE, "fake reason");
+ return;
}
else if (url == FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL_ERROR)
{
- LLSD result;
LLSD error;
error["code"] = LLObjectMediaNavigateClient::ERROR_PERMISSION_DENIED_CODE;
result["error"] = error;
- responder->result(result);
- }
- else {
- responder->result(LLSD());
- }
+ }
+ responder->result(result);
}
const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f;
@@ -168,28 +170,44 @@ public:
virtual LLUUID getID() const
{ return mRep["uuid"]; }
virtual void mediaNavigateBounceBack(U8 index)
- {
- mNumBounceBacks++;
- }
+ { mNumBounceBacks++; }
virtual bool hasMedia() const
{ return mRep.has("media_data"); }
- virtual void updateObjectMediaData(LLSD const &media_data_array)
- { mRep["media_data"] = media_data_array; }
+ virtual void updateObjectMediaData(LLSD const &media_data_array, const std::string &media_version)
+ { mRep["media_data"] = media_data_array; mRep["media_version"] = media_version; }
+
+ virtual F64 getMediaInterest() const
+ { return (LLSD::Real)mRep["interest"]; }
- virtual F64 getDistanceFromAvatar() const
- { return (LLSD::Real)mRep["distance"]; }
+ virtual bool isInterestingEnough() const
+ { return getMediaInterest() > gMinimumInterestLevel; }
- virtual F64 getTotalMediaInterest() const
- { return (LLSD::Real)mRep["interest"]; }
-
virtual std::string getCapabilityUrl(const std::string &name) const
{ return mRep["cap_urls"][name]; }
+ virtual bool isDead() const
+ { return mRep["is_dead"]; }
+
+ virtual U32 getMediaVersion() const
+ { return (LLSD::Integer)mRep["media_version"]; }
+
+ virtual bool isNew() const
+ { return mRep["is_new"]; }
+
+ void setMediaInterest(F64 val)
+ { mRep["interest"] = val; }
+
int getNumBounceBacks() const
{ return mNumBounceBacks; }
+ void markDead()
+ { mRep["is_dead"] = true; }
+
+ void markOld()
+ { mRep["is_new"] = false; }
+
private:
LLSD mRep;
int mNumBounceBacks;
@@ -211,10 +229,11 @@ namespace tut
{
mediadataclient() {
gPostRecords = &mLLSD;
+ gMinimumInterestLevel = (F64)0.0;
- //LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
- //LLError::setClassLevel("LLMediaDataClient", LLError::LEVEL_DEBUG);
- //LLError::setTagLevel("MediaOnAPrim", LLError::LEVEL_DEBUG);
+// LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
+// LLError::setClassLevel("LLMediaDataClient", LLError::LEVEL_DEBUG);
+// LLError::setTagLevel("MediaOnAPrim", LLError::LEVEL_DEBUG);
}
LLSD mLLSD;
};
@@ -365,11 +384,11 @@ namespace tut
LOG_TEST(4);
LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(
- _DATA(VALID_OBJECT_ID_1,"3.0","1.0"));
+ _DATA(VALID_OBJECT_ID_1,"1.0","true"));
LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(
- _DATA(VALID_OBJECT_ID_2,"1.0","1.0"));
+ _DATA(VALID_OBJECT_ID_2,"3.0","true"));
LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(
- _DATA(VALID_OBJECT_ID_3,"2.0","1.0"));
+ _DATA(VALID_OBJECT_ID_3,"2.0","true"));
{
LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
const char *ORDERED_OBJECT_IDS[] = { VALID_OBJECT_ID_2, VALID_OBJECT_ID_3, VALID_OBJECT_ID_1 };
@@ -415,8 +434,7 @@ namespace tut
LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest(
_DATA_URLS(VALID_OBJECT_ID,
- "1.0",
- "1.0",
+ "1.0","true",
FAKE_OBJECT_MEDIA_CAP_URL_503,
FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL));
int num_refs_start = o->getNumRefs();
@@ -471,8 +489,7 @@ namespace tut
LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest(
_DATA_URLS(VALID_OBJECT_ID,
- "1.0",
- "1.0",
+ "1.0","true",
FAKE_OBJECT_MEDIA_CAP_URL,
FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL_ERROR));
{
@@ -497,5 +514,425 @@ namespace tut
ensure("REF COUNT", o->getNumRefs(), 1);
}
+ template<> template<>
+ void mediadataclient_object_t::test<7>()
+ {
+ // Test LLMediaDataClient::isInQueue()
+ LOG_TEST(7);
+
+ LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(
+ _DATA(VALID_OBJECT_ID_1,"3.0","true"));
+ LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(
+ _DATA(VALID_OBJECT_ID_2,"1.0","true"));
+ int num_refs_start = o1->getNumRefs();
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+
+ ensure("not in queue yet 1", ! mdc->isInQueue(o1));
+ ensure("not in queue yet 2", ! mdc->isInQueue(o2));
+
+ mdc->fetchMedia(o1);
+
+ ensure("is in queue", mdc->isInQueue(o1));
+ ensure("is not in queue", ! mdc->isInQueue(o2));
+
+ ::pump_timers();
+
+ ensure("not in queue anymore", ! mdc->isInQueue(o1));
+ ensure("still is not in queue", ! mdc->isInQueue(o2));
+
+ ensure("queue empty", mdc->isEmpty());
+ }
+
+ // Make sure everyone's destroyed properly
+ ensure("REF COUNT", o1->getNumRefs(), num_refs_start);
+
+ }
+
+ template<> template<>
+ void mediadataclient_object_t::test<8>()
+ {
+ // Test queue handling of objects that are marked dead.
+ LOG_TEST(8);
+
+ LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"4.0","true"));
+ LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"3.0","true"));
+ LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"2.0","true"));
+ LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"1.0","true"));
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+
+ // queue up all 4 objects
+ mdc->fetchMedia(o1);
+ mdc->fetchMedia(o2);
+ mdc->fetchMedia(o3);
+ mdc->fetchMedia(o4);
+
+ // and mark the second and fourth ones dead.
+ dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o2))->markDead();
+ dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o4))->markDead();
+
+ ensure("is in queue 1", mdc->isInQueue(o1));
+ ensure("is in queue 2", mdc->isInQueue(o2));
+ ensure("is in queue 3", mdc->isInQueue(o3));
+ ensure("is in queue 4", mdc->isInQueue(o4));
+ ensure("post records", gPostRecords->size(), 0);
+
+ ::pump_timers();
+
+ // The first tick should remove the first one
+ ensure("is not in queue 1", !mdc->isInQueue(o1));
+ ensure("is in queue 2", mdc->isInQueue(o2));
+ ensure("is in queue 3", mdc->isInQueue(o3));
+ ensure("is in queue 4", mdc->isInQueue(o4));
+ ensure("post records", gPostRecords->size(), 1);
+
+ ::pump_timers();
+
+ // The second tick should skip the second and remove the third
+ ensure("is not in queue 2", !mdc->isInQueue(o2));
+ ensure("is not in queue 3", !mdc->isInQueue(o3));
+ ensure("is in queue 4", mdc->isInQueue(o4));
+ ensure("post records", gPostRecords->size(), 2);
+
+ ::pump_timers();
+
+ // The third tick should skip the fourth one and empty the queue.
+ ensure("is not in queue 4", !mdc->isInQueue(o4));
+ ensure("post records", gPostRecords->size(), 2);
+
+ ensure("queue empty", mdc->isEmpty());
+ }
+ ensure("refcount of o1", o1->getNumRefs(), 1);
+ ensure("refcount of o2", o2->getNumRefs(), 1);
+ ensure("refcount of o3", o3->getNumRefs(), 1);
+ ensure("refcount of o4", o4->getNumRefs(), 1);
+
+ }
+ //////////////////////////////////////////////////////////////////////////////////////////
+
+ template<> template<>
+ void mediadataclient_object_t::test<9>()
+ {
+ //
+ // Test queue re-ordering
+ //
+ LOG_TEST(9);
+
+ LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"40.0","true"));
+ LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"30.0","true"));
+ LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"20.0","true"));
+ LLMediaDataClientObjectTest *object4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"10.0","true"));
+ LLMediaDataClientObject::ptr_t o4 = object4;
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+
+ // queue up all 4 objects. They should now be in the queue in
+ // order 1 through 4, with 4 being at the front of the queue
+ mdc->fetchMedia(o1);
+ mdc->fetchMedia(o2);
+ mdc->fetchMedia(o3);
+ mdc->fetchMedia(o4);
+
+ int tick_num = 0;
+
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // The first tick should remove the first one
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1);
+
+ // Now, pretend that object 4 moved relative to the avatar such
+ // that it is now closest
+ object4->setMediaInterest(50.0);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // The second tick should still pick off item 2, but then re-sort
+ // have picked off object 4
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // The third tick should pick off object 2
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3);
+
+ // The fourth tick should pick off object 3
+ ::pump_timers();
+ ++tick_num;
+
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4);
+
+ ensure("queue empty", mdc->isEmpty());
+ }
+ ensure("refcount of o1", o1->getNumRefs(), 1);
+ ensure("refcount of o2", o2->getNumRefs(), 1);
+ ensure("refcount of o3", o3->getNumRefs(), 1);
+ ensure("refcount of o4", o4->getNumRefs(), 1);
+ }
+
+
+ template<> template<>
+ void mediadataclient_object_t::test<10>()
+ {
+ //
+ // Test using the "round-robin" queue
+ //
+ LOG_TEST(10);
+
+ LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","true"));
+ LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","true"));
+ LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","false"));
+ LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","false"));
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+
+ // queue up all 4 objects. The first two should be in the sorted
+ // queue [2 1], the second in the round-robin queue. The queues
+ // are serviced interleaved, so we should expect:
+ // 2, 4, 1, 3
+ mdc->fetchMedia(o1);
+ mdc->fetchMedia(o2);
+ mdc->fetchMedia(o3);
+ mdc->fetchMedia(o4);
+
+ int tick_num = 0;
+
+ // 0
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 1 The first tick should remove object 2
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[0]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_2));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 2 The second tick should send object 4, but it will still be
+ // "in the queue"
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[1]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_4));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 3 The third tick should remove object 1
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[2]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_1));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 4 The fourth tick should send object 3, but it will still be
+ // "in the queue"
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[3]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_3));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 5 The fifth tick should now identify objects 3 and 4 as no longer
+ // needing "updating", and remove them from the queue
+ ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4);
+
+ ::pump_timers();
+
+ // Whew....better be empty
+ ensure("queue empty", mdc->isEmpty());
+ }
+ ensure("refcount of o1", o1->getNumRefs(), 1);
+ ensure("refcount of o2", o2->getNumRefs(), 1);
+ ensure("refcount of o3", o3->getNumRefs(), 1);
+ ensure("refcount of o4", o4->getNumRefs(), 1);
+ }
+
+
+ template<> template<>
+ void mediadataclient_object_t::test<11>()
+ {
+ //
+ // Test LLMediaDataClient's destructor
+ //
+ LOG_TEST(11);
+
+ LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest(DATA);
+ int num_refs_start = o->getNumRefs();
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+ mdc->fetchMedia(o);
+ // must tick enough times to clear refcount of mdc
+ ::pump_timers();
+ }
+ // Make sure everyone's destroyed properly
+ ensure("REF COUNT", o->getNumRefs(), num_refs_start);
+ }
+
+ template<> template<>
+ void mediadataclient_object_t::test<12>()
+ {
+ //
+ // Test the "not interesting enough" call
+ //
+ LOG_TEST(12);
+
+ LLMediaDataClientObjectTest *object1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","true"));
+ LLMediaDataClientObject::ptr_t o1 = object1;
+ LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","true"));
+ LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","true"));
+ LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","true"));
+ {
+ LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+
+ // queue up all 4 objects. The first two are "interesting enough".
+ // Firing the timer 4 times should therefore leave them.
+ // Note that they should be sorted 4,3,2,1
+ // Then, we'll make one "interesting enough", fire the timer a few
+ // times, and make sure only it gets pulled off the queue
+ gMinimumInterestLevel = 2.5;
+ mdc->fetchMedia(o1);
+ mdc->fetchMedia(o2);
+ mdc->fetchMedia(o3);
+ mdc->fetchMedia(o4);
+
+ int tick_num = 0;
+
+ // 0
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 1 The first tick should remove object 4
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[0]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_4));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 2 The second tick should send object 3
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[1]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_3));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 3 The third tick should not pull off anything
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 4 The fourth tick (for good measure) should not pull off anything
+ ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2);
+
+ // Okay, now futz with object 1's interest, such that it is now
+ // "interesting enough"
+ object1->setMediaInterest((F64)5.0);
+
+ // This should sort so that the queue is now [1 2]
+ ::pump_timers();
+ ++tick_num;
+
+ // 5 The fifth tick should now identify objects 3 and 4 as no longer
+ // needing "updating", and remove them from the queue
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3);
+ ensure(STR(tick_num) + ". post object id", (*gPostRecords)[2]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_1));
+
+ ::pump_timers();
+ ++tick_num;
+
+ // 6 The sixth tick should not pull off anything
+ ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+ ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2));
+ ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+ ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+ ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3);
+
+ ::pump_timers();
+ ++tick_num;
+
+ // Whew....better NOT be empty ... o2 should still be there
+ ensure("queue not empty", !mdc->isEmpty());
+
+ // But, we need to clear the queue, or else we won't destroy MDC...
+ // this is a strange interplay between the queue timer and the MDC
+ ensure("o2 couldn't be removed from queue", mdc->removeFromQueue(o2));
+ // tick
+ ::pump_timers();
+ }
+ ensure("refcount of o1", o1->getNumRefs(), 1);
+ ensure("refcount of o2", o2->getNumRefs(), 1);
+ ensure("refcount of o3", o3->getNumRefs(), 1);
+ ensure("refcount of o4", o4->getNumRefs(), 1);
+ }
}
diff --git a/indra/newview/tests/lltextureinfo_test.cpp b/indra/newview/tests/lltextureinfo_test.cpp
new file mode 100644
index 0000000000..8dfba46262
--- /dev/null
+++ b/indra/newview/tests/lltextureinfo_test.cpp
@@ -0,0 +1,284 @@
+/**
+ * @file llwtextureinfo_test.cpp
+ * @author Si & Gabriel
+ * @date 2009-03-30
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltextureinfo.h"
+// Dependencies
+#include "../lltextureinfodetails.cpp"
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+ // Test wrapper declarations
+ struct textureinfo_test
+ {
+ // Constructor and destructor of the test wrapper
+ textureinfo_test()
+ {
+ }
+ ~textureinfo_test()
+ {
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<textureinfo_test> textureinfo_t;
+ typedef textureinfo_t::object textureinfo_object_t;
+ tut::textureinfo_t tut_textureinfo("textureinfo");
+
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLTextureInfo
+ // ---------------------------------------------------------------------------------------
+
+
+ // Test instantiation
+ template<> template<>
+ void textureinfo_object_t::test<1>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+ ensure("have we crashed?", true);
+ }
+
+ // Check lltextureinfo does not contain UUIDs we haven't added
+ template<> template<>
+ void textureinfo_object_t::test<2>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+ ensure(!tex_info.has(nonExistant));
+ }
+
+ // Check we can add a request time for a texture
+ template<> template<>
+ void textureinfo_object_t::test<3>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestStartTime(id, 200);
+
+ ensure_equals(tex_info.getRequestStartTime(id), 200);
+ }
+
+ // Check time for non-existant texture
+ template<> template<>
+ void textureinfo_object_t::test<4>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+ ensure_equals(tex_info.getRequestStartTime(nonExistant), 0);
+ }
+
+ // Check download complete time for non existant texture
+ template<> template<>
+ void textureinfo_object_t::test<5>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+ ensure_equals(tex_info.getRequestCompleteTime(nonExistant), 0);
+ }
+
+ // requested size is passed in correctly
+ template<> template<>
+ void textureinfo_object_t::test<6>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestSize(id, 600);
+
+ ensure_equals(tex_info.getRequestSize(id), 600);
+ }
+
+ // transport type is recorded correctly (http)
+ template<> template<>
+ void textureinfo_object_t::test<7>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+
+ ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ }
+
+ // transport type is recorded correctly (udp)
+ template<> template<>
+ void textureinfo_object_t::test<8>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_UDP);
+
+ ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_UDP);
+ }
+
+ // request offset is recorded correctly
+ template<> template<>
+ void textureinfo_object_t::test<9>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestOffset(id, 1234);
+
+ ensure_equals(tex_info.getRequestOffset(id), 1234);
+ }
+
+ // ask for averages gives us correct figure
+ template<> template<>
+ void textureinfo_object_t::test<10>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ S32 requestStartTimeOne = 200;
+ S32 requestEndTimeOne = 400;
+ S32 requestSizeOne = 1024;
+ S32 requestSizeOneBits = requestSizeOne * 8;
+ LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestStartTime(id1, requestStartTimeOne);
+ tex_info.setRequestSize(id1, requestSizeOne);
+ tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+ U32 requestStartTimeTwo = 100;
+ U32 requestEndTimeTwo = 500;
+ U32 requestSizeTwo = 2048;
+ S32 requestSizeTwoBits = requestSizeTwo * 8;
+ LLUUID id2("10e65d70-46fd-429f-841a-bf698e9424d4");
+ tex_info.setRequestStartTime(id2, requestStartTimeTwo);
+ tex_info.setRequestSize(id2, requestSizeTwo);
+ tex_info.setRequestType(id2, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ tex_info.setRequestCompleteTimeAndLog(id2, requestEndTimeTwo);
+
+ S32 averageBitRate = ((requestSizeOneBits/(requestEndTimeOne - requestStartTimeOne)) +
+ (requestSizeTwoBits/(requestEndTimeTwo - requestStartTimeTwo))) / 2;
+
+ S32 totalBytes = requestSizeOne + requestSizeTwo;
+
+ LLSD results = tex_info.getAverages();
+ ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), averageBitRate);
+ ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), totalBytes);
+ ensure_equals("is transport correct", results["transport"].asString(), std::string("HTTP"));
+ }
+
+ // make sure averages cleared when reset is called
+ template<> template<>
+ void textureinfo_object_t::test<11>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ S32 requestStartTimeOne = 200;
+ S32 requestEndTimeOne = 400;
+ S32 requestSizeOne = 1024;
+ LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestStartTime(id1, requestStartTimeOne);
+ tex_info.setRequestSize(id1, requestSizeOne);
+ tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+ tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+ tex_info.getAverages();
+ tex_info.reset();
+ LLSD results = tex_info.getAverages();
+ ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), 0);
+ ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), 0);
+ ensure_equals("is transport correct", results["transport"].asString(), std::string("NONE"));
+ }
+
+ // make sure map item removed when expired
+ template<> template<>
+ void textureinfo_object_t::test<12>()
+ {
+ LLTextureInfo tex_info;
+ tex_info.setUpLogging(true, true);
+
+ S32 requestStartTimeOne = 200;
+ S32 requestEndTimeOne = 400;
+ S32 requestSizeOne = 1024;
+ LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+ tex_info.setRequestStartTime(id1, requestStartTimeOne);
+ tex_info.setRequestSize(id1, requestSizeOne);
+ tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+
+ ensure_equals("map item created", tex_info.getTextureInfoMapSize(), 1);
+
+ tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+ ensure_equals("map item removed when consumed", tex_info.getTextureInfoMapSize(), 0);
+ }
+}
+
diff --git a/indra/newview/tests/lltextureinfodetails_test.cpp b/indra/newview/tests/lltextureinfodetails_test.cpp
new file mode 100644
index 0000000000..aa2697fb8e
--- /dev/null
+++ b/indra/newview/tests/lltextureinfodetails_test.cpp
@@ -0,0 +1,98 @@
+/**
+ * @file llwtextureinfodetails_test.cpp
+ * @author Si & Gabriel
+ * @date 2009-03-30
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltextureinfodetails.h"
+// Dependencies
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+ // Test wrapper declarations
+ struct textureinfodetails_test
+ {
+ // Constructor and destructor of the test wrapper
+ textureinfodetails_test()
+ {
+ }
+ ~textureinfodetails_test()
+ {
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<textureinfodetails_test> textureinfodetails_t;
+ typedef textureinfodetails_t::object textureinfodetails_object_t;
+ tut::textureinfodetails_t tut_textureinfodetails("textureinfodetails");
+
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLTextureInfo
+ // ---------------------------------------------------------------------------------------
+
+
+ // Test instantiation
+ template<> template<>
+ void textureinfodetails_object_t::test<1>()
+ {
+ ensure("have we crashed?", true);
+ }
+}
diff --git a/indra/newview/tests/lltexturestatsuploader_test.cpp b/indra/newview/tests/lltexturestatsuploader_test.cpp
new file mode 100644
index 0000000000..77a3e2c3d8
--- /dev/null
+++ b/indra/newview/tests/lltexturestatsuploader_test.cpp
@@ -0,0 +1,156 @@
+/**
+ * @file lltexturestatsuploader_test.cpp
+ * @author Si
+ * @date 2009-05-27
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltexturestatsuploader.h"
+// Dependencies
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+#include "boost/intrusive_ptr.hpp"
+void boost::intrusive_ptr_add_ref(LLCurl::Responder*){}
+void boost::intrusive_ptr_release(LLCurl::Responder* p){}
+const F32 HTTP_REQUEST_EXPIRY_SECS = 0.0f;
+
+static std::string most_recent_url;
+static LLSD most_recent_body;
+
+void LLHTTPClient::post(
+ const std::string& url,
+ const LLSD& body,
+ ResponderPtr,
+ const LLSD& headers,
+ const F32 timeout)
+{
+ // set some sensor code
+ most_recent_url = url;
+ most_recent_body = body;
+ return;
+}
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+ // Test wrapper declarations
+ struct texturestatsuploader_test
+ {
+ // Constructor and destructor of the test wrapper
+ texturestatsuploader_test()
+ {
+ most_recent_url = "some sort of default text that should never match anything the tests are expecting!";
+ LLSD blank_llsd;
+ most_recent_body = blank_llsd;
+ }
+ ~texturestatsuploader_test()
+ {
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<texturestatsuploader_test> texturestatsuploader_t;
+ typedef texturestatsuploader_t::object texturestatsuploader_object_t;
+ tut::texturestatsuploader_t tut_texturestatsuploader("texturestatsuploader");
+
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLTextureInfo
+ // ---------------------------------------------------------------------------------------
+
+
+ // Test instantiation
+ template<> template<>
+ void texturestatsuploader_object_t::test<1>()
+ {
+ LLTextureStatsUploader tsu;
+ llinfos << &tsu << llendl;
+ ensure("have we crashed?", true);
+ }
+
+ // does it call out to the provided url if we ask it to?
+ template<> template<>
+ void texturestatsuploader_object_t::test<2>()
+ {
+ LLTextureStatsUploader tsu;
+ std::string url = "http://blahblahblah";
+ LLSD texture_stats;
+ tsu.uploadStatsToSimulator(url, texture_stats);
+ ensure_equals("did the right url get called?", most_recent_url, url);
+ ensure_equals("did the right body get sent?", most_recent_body, texture_stats);
+ }
+
+ // does it not call out to the provided url if we send it an ungranted cap?
+ template<> template<>
+ void texturestatsuploader_object_t::test<3>()
+ {
+ LLTextureStatsUploader tsu;
+
+ // this url left intentionally blank to mirror
+ // not getting a cap in the caller.
+ std::string url_for_ungranted_cap = "";
+
+ LLSD texture_stats;
+ std::string most_recent_url_before_test = most_recent_url;
+ tsu.uploadStatsToSimulator(url_for_ungranted_cap, texture_stats);
+
+ ensure_equals("hopefully no url got called!", most_recent_url, most_recent_url_before_test);
+ }
+
+ // does it call out if the data is empty?
+ // should it even do that?
+}
+
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index 988d28c301..dd61ac6ae5 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -36,45 +36,75 @@
#include "../test/lltut.h"
#include "../llviewerhelputil.h"
+#include "../llweb.h"
#include "llcontrol.h"
-#include "llsys.h"
#include <iostream>
-//----------------------------------------------------------------------------
-// Implementation of enough of LLControlGroup to support the tests:
+// values for all of the supported substitutions parameters
+static std::string gHelpURL;
+static std::string gVersion;
+static std::string gChannel;
+static std::string gLanguage;
+static std::string gGrid;
+static std::string gOS;
-static std::map<std::string,std::string> test_stringvec;
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
LLControlGroup::LLControlGroup(const std::string& name)
- : LLInstanceTracker<LLControlGroup, std::string>(name)
-{
-}
-
-LLControlGroup::~LLControlGroup()
-{
-}
-
-// Implementation of just the LLControlGroup methods we requre
+ : LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
BOOL LLControlGroup::declareString(const std::string& name,
const std::string& initial_val,
const std::string& comment,
- BOOL persist)
+ BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+std::string LLControlGroup::getString(const std::string& name)
{
- test_stringvec[name] = initial_val;
- return true;
+ if (name == "HelpURLFormat")
+ return gHelpURL;
+ return "";
}
+LLControlGroup gSavedSettings("test");
-void LLControlGroup::setString(const std::string& name, const std::string& val)
+static void substitute_string(std::string &input, const std::string &search, const std::string &replace)
{
- test_stringvec[name] = val;
+ size_t pos = input.find(search);
+ while (pos != std::string::npos)
+ {
+ input = input.replace(pos, search.size(), replace);
+ pos = input.find(search);
+ }
}
-std::string LLControlGroup::getString(const std::string& name)
+class LLAgent
+{
+public:
+ LLAgent() {}
+ ~LLAgent() {}
+#ifdef __GNUC__
+ __attribute__ ((noinline))
+#endif
+ BOOL isGodlike() const { return FALSE; }
+};
+LLAgent gAgent;
+
+std::string LLWeb::expandURLSubstitutions(const std::string &url,
+ const LLSD &default_subs)
{
- return test_stringvec[name];
+ (void)gAgent.isGodlike(); // ref symbol to stop compiler from stripping it
+ std::string new_url = url;
+ substitute_string(new_url, "[TOPIC]", default_subs["TOPIC"].asString());
+ substitute_string(new_url, "[VERSION]", gVersion);
+ substitute_string(new_url, "[CHANNEL]", gChannel);
+ substitute_string(new_url, "[LANGUAGE]", gLanguage);
+ substitute_string(new_url, "[GRID]", gGrid);
+ substitute_string(new_url, "[OS]", gOS);
+ return new_url;
}
+
//----------------------------------------------------------------------------
namespace tut
@@ -90,41 +120,52 @@ namespace tut
template<> template<>
void viewerhelputil_object_t::test<1>()
{
- LLOSInfo osinfo;
- LLControlGroup cgr("test");
- cgr.declareString("HelpURLFormat", "fooformat", "declared_for_test", FALSE);
- cgr.declareString("VersionChannelName", "foochannelname", "declared_for_test", FALSE);
- cgr.declareString("Language", "foolanguage", "declared_for_test", FALSE);
std::string topic("test_topic");
-
std::string subresult;
- cgr.setString("HelpURLFormat", "fooformat");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "fooformat";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("no substitution tags", subresult, "fooformat");
- cgr.setString("HelpURLFormat", "");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("blank substitution format", subresult, "");
- cgr.setString("HelpURLFormat", "[LANGUAGE]");
- cgr.setString("Language", "");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "[TOPIC]";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
+ ensure_equals("topic name", subresult, "test_topic");
+
+ gHelpURL = "[LANGUAGE]";
+ gLanguage = "";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("simple substitution with blank", subresult, "");
- cgr.setString("HelpURLFormat", "[LANGUAGE]");
- cgr.setString("Language", "Esperanto");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "[LANGUAGE]";
+ gLanguage = "Esperanto";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("simple substitution", subresult, "Esperanto");
- cgr.setString("HelpURLFormat", "[XXX]");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "http://secondlife.com/[LANGUAGE]";
+ gLanguage = "Gaelic";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
+ ensure_equals("simple substitution with url", subresult, "http://secondlife.com/Gaelic");
+
+ gHelpURL = "[XXX]";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("unknown substitution", subresult, "[XXX]");
- cgr.setString("HelpURLFormat", "[LANGUAGE]/[LANGUAGE]");
- cgr.setString("Language", "Esperanto");
- subresult = LLViewerHelpUtil::buildHelpURL(topic, cgr, osinfo);
+ gHelpURL = "[LANGUAGE]/[LANGUAGE]";
+ gLanguage = "Esperanto";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
ensure_equals("multiple substitution", subresult, "Esperanto/Esperanto");
+
+ gHelpURL = "http://[CHANNEL]/[VERSION]/[LANGUAGE]/[OS]/[GRID]/[XXX]";
+ gChannel = "Second Life Test";
+ gVersion = "2.0";
+ gLanguage = "gaelic";
+ gOS = "AmigaOS 2.1";
+ gGrid = "mysim";
+ subresult = LLViewerHelpUtil::buildHelpURL(topic);
+ ensure_equals("complex substitution", subresult, "http://Second Life Test/2.0/gaelic/AmigaOS 2.1/mysim/[XXX]");
}
-
}
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
new file mode 100644
index 0000000000..56cf86f6df
--- /dev/null
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -0,0 +1,523 @@
+/**
+ * @file llworldmap_test.cpp
+ * @author Merov Linden
+ * @date 2009-03-09
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../llworldmap.h"
+// Dependencies
+#include "../llviewerimagelist.h"
+#include "../llworldmapmessage.h"
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+// Stub image calls
+LLViewerImageList::LLViewerImageList() { }
+LLViewerImageList::~LLViewerImageList() { }
+LLViewerImageList gImageList;
+LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id,
+ BOOL usemipmaps,
+ BOOL level_immediate,
+ LLGLint internal_format,
+ LLGLenum primary_format,
+ LLHost request_from_host)
+{ return NULL; }
+void LLViewerImage::setBoostLevel(S32 level) { }
+void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) { }
+
+// Stub related map calls
+LLWorldMapMessage::LLWorldMapMessage() { }
+LLWorldMapMessage::~LLWorldMapMessage() { }
+void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { }
+void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { }
+LLWorldMipmap::LLWorldMipmap() { }
+LLWorldMipmap::~LLWorldMipmap() { }
+void LLWorldMipmap::reset() { }
+void LLWorldMipmap::dropBoostLevels() { }
+void LLWorldMipmap::equalizeBoostLevels() { }
+LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load)
+{ return NULL; }
+
+// Stub other stuff
+BOOL gPacificDaylightTime;
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+const F32 X_WORLD_TEST = 1000.0f * REGION_WIDTH_METERS;
+const F32 Y_WORLD_TEST = 2000.0f * REGION_WIDTH_METERS;
+const F32 Z_WORLD_TEST = 240.0f;
+const std::string ITEM_NAME_TEST = "Item Foo";
+const std::string TOOLTIP_TEST = "Tooltip Foo";
+
+const std::string SIM_NAME_TEST = "Sim Foo";
+
+namespace tut
+{
+ // Test wrapper declarations
+ struct iteminfo_test
+ {
+ // Instance to be tested
+ LLItemInfo* mItem;
+
+ // Constructor and destructor of the test wrapper
+ iteminfo_test()
+ {
+ LLUUID id;
+ mItem = new LLItemInfo(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
+ }
+ ~iteminfo_test()
+ {
+ delete mItem;
+ }
+ };
+
+ struct siminfo_test
+ {
+ // Instance to be tested
+ LLSimInfo* mSim;
+
+ // Constructor and destructor of the test wrapper
+ siminfo_test()
+ {
+ U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+ mSim = new LLSimInfo(handle);
+ }
+ ~siminfo_test()
+ {
+ delete mSim;
+ }
+ };
+
+ struct worldmap_test
+ {
+ // Instance to be tested
+ LLWorldMap* mWorld;
+
+ // Constructor and destructor of the test wrapper
+ worldmap_test()
+ {
+ mWorld = LLWorldMap::getInstance();
+ }
+ ~worldmap_test()
+ {
+ mWorld = NULL;
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<iteminfo_test> iteminfo_t;
+ typedef iteminfo_t::object iteminfo_object_t;
+ tut::iteminfo_t tut_iteminfo("iteminfo");
+
+ typedef test_group<siminfo_test> siminfo_t;
+ typedef siminfo_t::object siminfo_object_t;
+ tut::siminfo_t tut_siminfo("siminfo");
+
+ typedef test_group<worldmap_test> worldmap_t;
+ typedef worldmap_t::object worldmap_object_t;
+ tut::worldmap_t tut_worldmap("worldmap");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLItemInfo interface
+ // ---------------------------------------------------------------------------------------
+ template<> template<>
+ void iteminfo_object_t::test<1>()
+ {
+ // Test 1 : setCount() / getCount()
+ mItem->setCount(10);
+ ensure("LLItemInfo::setCount() test failed", mItem->getCount() == 10);
+ // Test 2 : setTooltip() / getToolTip()
+ std::string tooltip = TOOLTIP_TEST;
+ mItem->setTooltip(tooltip);
+ ensure("LLItemInfo::setTooltip() test failed", mItem->getToolTip() == TOOLTIP_TEST);
+ // Test 3 : setElevation() / getGlobalPosition()
+ mItem->setElevation(Z_WORLD_TEST);
+ LLVector3d pos = mItem->getGlobalPosition();
+ LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, Z_WORLD_TEST);
+ ensure("LLItemInfo::getGlobalPosition() test failed", pos == ref);
+ // Test 4 : getName()
+ std::string name = mItem->getName();
+ ensure("LLItemInfo::getName() test failed", name == ITEM_NAME_TEST);
+ // Test 5 : isName()
+ ensure("LLItemInfo::isName() test failed", mItem->isName(name));
+ // Test 6 : getUUID()
+ LLUUID id;
+ ensure("LLItemInfo::getUUID() test failed", mItem->getUUID() == id);
+ // Test 7 : getRegionHandle()
+ U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+ ensure("LLItemInfo::getRegionHandle() test failed", mItem->getRegionHandle() == handle);
+ }
+ // ---------------------------------------------------------------------------------------
+ // Test the LLSimInfo interface
+ // ---------------------------------------------------------------------------------------
+ // Test Setters and Accessors methods
+ template<> template<>
+ void siminfo_object_t::test<1>()
+ {
+ // Test 1 : setName() / getName()
+ std::string name = SIM_NAME_TEST;
+ mSim->setName(name);
+ ensure("LLSimInfo::setName() test failed", mSim->getName() == SIM_NAME_TEST);
+ // Test 2 : isName()
+ ensure("LLSimInfo::isName() test failed", mSim->isName(name));
+ // Test 3 : getGlobalPos()
+ LLVector3 local;
+ LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, 0.0f);
+ LLVector3d pos = mSim->getGlobalPos(local);
+ ensure("LLSimInfo::getGlobalPos() test failed", pos == ref);
+ // Test 4 : getGlobalOrigin()
+ pos = mSim->getGlobalOrigin();
+ ensure("LLSimInfo::getGlobalOrigin() test failed", pos == ref);
+ // Test 5 : clearImage()
+ try {
+ mSim->clearImage();
+ } catch (...) {
+ fail("LLSimInfo::clearImage() test failed");
+ }
+ // Test 6 : dropImagePriority()
+ try {
+ mSim->dropImagePriority();
+ } catch (...) {
+ fail("LLSimInfo::dropImagePriority() test failed");
+ }
+ // Test 7 : updateAgentCount()
+ try {
+ mSim->updateAgentCount(0.0f);
+ } catch (...) {
+ fail("LLSimInfo::updateAgentCount() test failed");
+ }
+ // Test 8 : getAgentCount()
+ S32 agents = mSim->getAgentCount();
+ ensure("LLSimInfo::getAgentCount() test failed", agents == 0);
+ // Test 9 : setLandForSaleImage() / getLandForSaleImage()
+ LLUUID id;
+ mSim->setLandForSaleImage(id);
+ LLPointer<LLViewerImage> image = mSim->getLandForSaleImage();
+ ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull());
+ // Test 10 : isPG()
+ mSim->setAccess(SIM_ACCESS_PG);
+ ensure("LLSimInfo::isPG() test failed", mSim->isPG());
+ // Test 11 : isDown()
+ mSim->setAccess(SIM_ACCESS_DOWN);
+ ensure("LLSimInfo::isDown() test failed", mSim->isDown());
+ // Test 12 : Access strings can't be accessed from unit test...
+ //ensure("LLSimInfo::getAccessString() test failed", mSim->getAccessString() == "Offline");
+ // Test 13 : Region strings can't be accessed from unit test...
+ //mSim->setRegionFlags(REGION_FLAGS_SANDBOX);
+ //ensure("LLSimInfo::setRegionFlags() test failed", mSim->getFlagsString() == "Sandbox");
+ }
+ // Test management of LLInfoItem lists
+ template<> template<>
+ void siminfo_object_t::test<2>()
+ {
+ // Test 14 : clearItems()
+ try {
+ mSim->clearItems();
+ } catch (...) {
+ fail("LLSimInfo::clearItems() at init test failed");
+ }
+
+ // Test 15 : Verify that all the lists are empty
+ LLSimInfo::item_info_list_t list;
+ list = mSim->getTeleHub();
+ ensure("LLSimInfo::getTeleHub() empty at init test failed", list.empty());
+ list = mSim->getInfoHub();
+ ensure("LLSimInfo::getInfoHub() empty at init test failed", list.empty());
+ list = mSim->getPGEvent();
+ ensure("LLSimInfo::getPGEvent() empty at init test failed", list.empty());
+ list = mSim->getMatureEvent();
+ ensure("LLSimInfo::getMatureEvent() empty at init test failed", list.empty());
+ list = mSim->getLandForSale();
+ ensure("LLSimInfo::getLandForSale() empty at init test failed", list.empty());
+ list = mSim->getAgentLocation();
+ ensure("LLSimInfo::getAgentLocation() empty at init test failed", list.empty());
+
+ // Create an item to be inserted
+ LLUUID id;
+ LLItemInfo item(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
+
+ // Insert the item in each list
+ mSim->insertTeleHub(item);
+ mSim->insertInfoHub(item);
+ mSim->insertPGEvent(item);
+ mSim->insertMatureEvent(item);
+ mSim->insertLandForSale(item);
+ mSim->insertAgentLocation(item);
+
+ // Test 16 : Verify that the lists contain 1 item each
+ list = mSim->getTeleHub();
+ ensure("LLSimInfo::insertTeleHub() test failed", list.size() == 1);
+ list = mSim->getInfoHub();
+ ensure("LLSimInfo::insertInfoHub() test failed", list.size() == 1);
+ list = mSim->getPGEvent();
+ ensure("LLSimInfo::insertPGEvent() test failed", list.size() == 1);
+ list = mSim->getMatureEvent();
+ ensure("LLSimInfo::insertMatureEvent() test failed", list.size() == 1);
+ list = mSim->getLandForSale();
+ ensure("LLSimInfo::insertLandForSale() test failed", list.size() == 1);
+ list = mSim->getAgentLocation();
+ ensure("LLSimInfo::insertAgentLocation() test failed", list.size() == 1);
+
+ // Test 17 : clearItems()
+ try {
+ mSim->clearItems();
+ } catch (...) {
+ fail("LLSimInfo::clearItems() at end test failed");
+ }
+
+ // Test 18 : Verify that all the lists are empty again... *except* agent which is persisted!! (on purpose)
+ list = mSim->getTeleHub();
+ ensure("LLSimInfo::getTeleHub() empty after clear test failed", list.empty());
+ list = mSim->getInfoHub();
+ ensure("LLSimInfo::getInfoHub() empty after clear test failed", list.empty());
+ list = mSim->getPGEvent();
+ ensure("LLSimInfo::getPGEvent() empty after clear test failed", list.empty());
+ list = mSim->getMatureEvent();
+ ensure("LLSimInfo::getMatureEvent() empty after clear test failed", list.empty());
+ list = mSim->getLandForSale();
+ ensure("LLSimInfo::getLandForSale() empty after clear test failed", list.empty());
+ list = mSim->getAgentLocation();
+ ensure("LLSimInfo::getAgentLocation() empty after clear test failed", list.size() == 1);
+ }
+
+ // ---------------------------------------------------------------------------------------
+ // Test the LLWorldMap interface
+ // ---------------------------------------------------------------------------------------
+ // Test Setters and Accessors methods
+ template<> template<>
+ void worldmap_object_t::test<1>()
+ {
+ // Test 1 : reset()
+ try {
+ mWorld->reset();
+ } catch (...) {
+ fail("LLWorldMap::reset() at init test failed");
+ }
+ // Test 2 : clearImageRefs()
+ try {
+ mWorld->clearImageRefs();
+ } catch (...) {
+ fail("LLWorldMap::clearImageRefs() test failed");
+ }
+ // Test 3 : dropImagePriorities()
+ try {
+ mWorld->dropImagePriorities();
+ } catch (...) {
+ fail("LLWorldMap::dropImagePriorities() test failed");
+ }
+ // Test 4 : reloadItems()
+ try {
+ mWorld->reloadItems(true);
+ } catch (...) {
+ fail("LLWorldMap::reloadItems() test failed");
+ }
+ // Test 5 : updateRegions()
+ try {
+ mWorld->updateRegions(1000, 1000, 1004, 1004);
+ } catch (...) {
+ fail("LLWorldMap::updateRegions() test failed");
+ }
+ // Test 6 : equalizeBoostLevels()
+ try {
+ mWorld->equalizeBoostLevels();
+ } catch (...) {
+ fail("LLWorldMap::equalizeBoostLevels() test failed");
+ }
+ // Test 7 : getObjectsTile()
+ try {
+ LLPointer<LLViewerImage> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);
+ ensure("LLWorldMap::getObjectsTile() failed", image.isNull());
+ } catch (...) {
+ fail("LLWorldMap::getObjectsTile() test failed with exception");
+ }
+ }
+ // Test management of LLSimInfo lists
+ template<> template<>
+ void worldmap_object_t::test<2>()
+ {
+ // Test 8 : reset()
+ try {
+ mWorld->reset();
+ } catch (...) {
+ fail("LLWorldMap::reset() at init test failed");
+ }
+
+ // Test 9 : Verify that all the region list is empty
+ LLWorldMap::sim_info_map_t list;
+ list = mWorld->getRegionMap();
+ ensure("LLWorldMap::getRegionMap() empty at init test failed", list.empty());
+
+ // Test 10 : Insert a region
+ bool success;
+ LLUUID id;
+ std::string name_sim = SIM_NAME_TEST;
+ success = mWorld->insertRegion( U32(X_WORLD_TEST),
+ U32(Y_WORLD_TEST),
+ name_sim,
+ id,
+ SIM_ACCESS_PG,
+ REGION_FLAGS_SANDBOX);
+ list = mWorld->getRegionMap();
+ ensure("LLWorldMap::insertRegion() failed", success && (list.size() == 1));
+
+ // Test 11 : Insert an item in the same region -> number of regions doesn't increase
+ std::string name_item = ITEM_NAME_TEST;
+ success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS/2),
+ U32(Y_WORLD_TEST + REGION_WIDTH_METERS/2),
+ name_item,
+ id,
+ MAP_ITEM_LAND_FOR_SALE,
+ 0, 0);
+ list = mWorld->getRegionMap();
+ ensure("LLWorldMap::insertItem() in existing region failed", success && (list.size() == 1));
+
+ // Test 12 : Insert an item in another region -> number of regions increases
+ success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS*2),
+ U32(Y_WORLD_TEST + REGION_WIDTH_METERS*2),
+ name_item,
+ id,
+ MAP_ITEM_LAND_FOR_SALE,
+ 0, 0);
+ list = mWorld->getRegionMap();
+ ensure("LLWorldMap::insertItem() in unexisting region failed", success && (list.size() == 2));
+
+ // Test 13 : simInfoFromPosGlobal() in region
+ LLVector3d pos1( X_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2,
+ Y_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2,
+ 0.0f);
+ LLSimInfo* sim;
+ sim = mWorld->simInfoFromPosGlobal(pos1);
+ ensure("LLWorldMap::simInfoFromPosGlobal() test on existing region failed", sim != NULL);
+
+ // Test 14 : simInfoFromPosGlobal() outside region
+ LLVector3d pos2( X_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2,
+ Y_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2,
+ 0.0f);
+ sim = mWorld->simInfoFromPosGlobal(pos2);
+ ensure("LLWorldMap::simInfoFromPosGlobal() test outside region failed", sim == NULL);
+
+ // Test 15 : simInfoFromName()
+ sim = mWorld->simInfoFromName(name_sim);
+ ensure("LLWorldMap::simInfoFromName() test on existing region failed", sim != NULL);
+
+ // Test 16 : simInfoFromHandle()
+ U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+ sim = mWorld->simInfoFromHandle(handle);
+ ensure("LLWorldMap::simInfoFromHandle() test on existing region failed", sim != NULL);
+
+ // Test 17 : simNameFromPosGlobal()
+ LLVector3d pos3( X_WORLD_TEST + REGION_WIDTH_METERS/2,
+ Y_WORLD_TEST + REGION_WIDTH_METERS/2,
+ 0.0f);
+ success = mWorld->simNameFromPosGlobal(pos3, name_sim);
+ ensure("LLWorldMap::simNameFromPosGlobal() test on existing region failed", success && (name_sim == SIM_NAME_TEST));
+
+ // Test 18 : reset()
+ try {
+ mWorld->reset();
+ } catch (...) {
+ fail("LLWorldMap::reset() at end test failed");
+ }
+
+ // Test 19 : Verify that all the region list is empty
+ list = mWorld->getRegionMap();
+ ensure("LLWorldMap::getRegionMap() empty at end test failed", list.empty());
+ }
+ // Test tracking
+ template<> template<>
+ void worldmap_object_t::test<3>()
+ {
+ // Point to track
+ LLVector3d pos( X_WORLD_TEST + REGION_WIDTH_METERS/2, Y_WORLD_TEST + REGION_WIDTH_METERS/2, Z_WORLD_TEST);
+
+ // Test 20 : no tracking
+ mWorld->cancelTracking();
+ ensure("LLWorldMap::cancelTracking() at begin test failed", mWorld->isTracking() == false);
+
+ // Test 21 : set tracking
+ mWorld->setTracking(pos);
+ ensure("LLWorldMap::setTracking() failed", mWorld->isTracking() && !mWorld->isTrackingValidLocation());
+
+ // Test 22 : set click and commit flags
+ mWorld->setTrackingDoubleClick();
+ ensure("LLWorldMap::setTrackingDoubleClick() failed", mWorld->isTrackingDoubleClick());
+ mWorld->setTrackingCommit();
+ ensure("LLWorldMap::setTrackingCommit() failed", mWorld->isTrackingCommit());
+
+ // Test 23 : in rectangle test
+ bool inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST, Y_WORLD_TEST,
+ X_WORLD_TEST + REGION_WIDTH_METERS,
+ Y_WORLD_TEST + REGION_WIDTH_METERS);
+ ensure("LLWorldMap::isTrackingInRectangle() in rectangle failed", inRect);
+ inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST + REGION_WIDTH_METERS,
+ Y_WORLD_TEST + REGION_WIDTH_METERS,
+ X_WORLD_TEST + 2 * REGION_WIDTH_METERS,
+ Y_WORLD_TEST + 2 * REGION_WIDTH_METERS);
+ ensure("LLWorldMap::isTrackingInRectangle() outside rectangle failed", !inRect);
+
+ // Test 24 : set tracking to valid and invalid
+ mWorld->setTrackingValid();
+ ensure("LLWorldMap::setTrackingValid() failed", mWorld->isTrackingValidLocation() && !mWorld->isTrackingInvalidLocation());
+ mWorld->setTrackingInvalid();
+ ensure("LLWorldMap::setTrackingInvalid() failed", !mWorld->isTrackingValidLocation() && mWorld->isTrackingInvalidLocation());
+
+ // Test 25 : getTrackedPositionGlobal()
+ LLVector3d res = mWorld->getTrackedPositionGlobal();
+ ensure("LLWorldMap::getTrackedPositionGlobal() failed", res == pos);
+
+ // Test 26 : reset tracking
+ mWorld->cancelTracking();
+ ensure("LLWorldMap::cancelTracking() at end test failed", mWorld->isTracking() == false);
+ }
+}
diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp
new file mode 100644
index 0000000000..9938175c55
--- /dev/null
+++ b/indra/newview/tests/llworldmipmap_test.cpp
@@ -0,0 +1,176 @@
+/**
+ * @file llworldmipmap_test.cpp
+ * @author Merov Linden
+ * @date 2009-02-03
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../llworldmipmap.h"
+// Dependencies
+#include "../llviewerimagelist.h"
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+LLViewerImageList::LLViewerImageList() { }
+LLViewerImageList::~LLViewerImageList() { }
+
+LLViewerImageList gImageList;
+
+LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url,
+ BOOL usemipmaps,
+ BOOL level_immediate,
+ LLGLint internal_format,
+ LLGLenum primary_format,
+ const LLUUID& force_id)
+{ return NULL; }
+void LLViewerImage::setBoostLevel(S32 level) { }
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+ // Test wrapper declaration
+ struct worldmipmap_test
+ {
+ // Derived test class
+ class LLTestWorldMipmap : public LLWorldMipmap
+ {
+ // Put here stubbs of virtual methods we shouldn't call all the way down
+ };
+ // Instance to be tested
+ LLTestWorldMipmap* mMap;
+
+ // Constructor and destructor of the test wrapper
+ worldmipmap_test()
+ {
+ mMap = new LLTestWorldMipmap;
+ }
+ ~worldmipmap_test()
+ {
+ delete mMap;
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<worldmipmap_test> worldmipmap_t;
+ typedef worldmipmap_t::object worldmipmap_object_t;
+ tut::worldmipmap_t tut_worldmipmap("worldmipmap");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+ // Test static methods
+ // Test 1 : scaleToLevel()
+ template<> template<>
+ void worldmipmap_object_t::test<1>()
+ {
+ S32 level = mMap->scaleToLevel(0.0);
+ ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS);
+ level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE);
+ ensure("scaleToLevel() test 2 failed", level == 1);
+ level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE);
+ ensure("scaleToLevel() test 3 failed", level == 1);
+ }
+ // Test 2 : globalToMipmap()
+ template<> template<>
+ void worldmipmap_object_t::test<2>()
+ {
+ U32 grid_x, grid_y;
+ mMap->globalToMipmap(1000.f*REGION_WIDTH_METERS, 1000.f*REGION_WIDTH_METERS, 1, &grid_x, &grid_y);
+ ensure("globalToMipmap() test 1 failed", (grid_x == 1000) && (grid_y == 1000));
+ mMap->globalToMipmap(0.0, 0.0, LLWorldMipmap::MAP_LEVELS, &grid_x, &grid_y);
+ ensure("globalToMipmap() test 2 failed", (grid_x == 0) && (grid_y == 0));
+ }
+ // Test 3 : getObjectsTile()
+ template<> template<>
+ void worldmipmap_object_t::test<3>()
+ {
+ // Depends on some inline methods in LLViewerImage... Thinking about how to make this work
+ // LLPointer<LLViewerImage> img = mMap->getObjectsTile(0, 0, 1);
+ // ensure("getObjectsTile() test failed", img.isNull());
+ }
+ // Test 4 : equalizeBoostLevels()
+ template<> template<>
+ void worldmipmap_object_t::test<4>()
+ {
+ try
+ {
+ mMap->equalizeBoostLevels();
+ }
+ catch (...)
+ {
+ fail("equalizeBoostLevels() test failed");
+ }
+ }
+ // Test 5 : dropBoostLevels()
+ template<> template<>
+ void worldmipmap_object_t::test<5>()
+ {
+ try
+ {
+ mMap->dropBoostLevels();
+ }
+ catch (...)
+ {
+ fail("dropBoostLevels() test failed");
+ }
+ }
+ // Test 6 : reset()
+ template<> template<>
+ void worldmipmap_object_t::test<6>()
+ {
+ try
+ {
+ mMap->reset();
+ }
+ catch (...)
+ {
+ fail("reset() test failed");
+ }
+ }
+}
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index c94ba0a3e8..c2c7e963b9 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-03-20
* @brief Test for llxmlrpclistener.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index b85d31d1ac..3f379fcf75 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -40,67 +40,73 @@ sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util'))
from llmanifest import LLManifest, main, proper_windows_path, path_ancestors
class ViewerManifest(LLManifest):
+ def is_packaging_viewer(self):
+ # This is overridden by the WindowsManifest sub-class,
+ # which has different behavior if it is not packaging the viewer.
+ return True
+
def construct(self):
super(ViewerManifest, self).construct()
self.exclude("*.svn*")
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
- if self.prefix(src="app_settings"):
- self.exclude("logcontrol.xml")
- self.exclude("logcontrol-dev.xml")
- self.path("*.pem")
- self.path("*.ini")
- self.path("*.xml")
- self.path("*.db2")
-
- # include the entire shaders directory recursively
- self.path("shaders")
- # ... and the entire windlight directory
- self.path("windlight")
- self.end_prefix("app_settings")
-
- if self.prefix(src="character"):
- self.path("*.llm")
- self.path("*.xml")
- self.path("*.tga")
- self.end_prefix("character")
-
- # Include our fonts
- if self.prefix(src="fonts"):
- self.path("*.ttf")
- self.path("*.txt")
- self.end_prefix("fonts")
-
- # skins
- if self.prefix(src="skins"):
- self.path("paths.xml")
- # include the entire textures directory recursively
- if self.prefix(src="*/textures"):
- self.path("*/*.tga")
- self.path("*/*.j2c")
- self.path("*/*.jpg")
- self.path("*/*.png")
- self.path("*.tga")
- self.path("*.j2c")
- self.path("*.jpg")
- self.path("*.png")
- self.path("textures.xml")
- self.end_prefix("*/textures")
- self.path("*/xui/*/*.xml")
- self.path("*/xui/*/widgets/*.xml")
- self.path("*/*.xml")
-
- # Local HTML files (e.g. loading screen)
- if self.prefix(src="*/html"):
- self.path("*.png")
- self.path("*/*/*.html")
- self.path("*/*/*.gif")
- self.end_prefix("*/html")
- self.end_prefix("skins")
-
- # Files in the newview/ directory
- self.path("gpu_table.txt")
+ if self.is_packaging_viewer():
+ if self.prefix(src="app_settings"):
+ self.exclude("logcontrol.xml")
+ self.exclude("logcontrol-dev.xml")
+ self.path("*.pem")
+ self.path("*.ini")
+ self.path("*.xml")
+ self.path("*.db2")
+
+ # include the entire shaders directory recursively
+ self.path("shaders")
+ # ... and the entire windlight directory
+ self.path("windlight")
+ self.end_prefix("app_settings")
+
+ if self.prefix(src="character"):
+ self.path("*.llm")
+ self.path("*.xml")
+ self.path("*.tga")
+ self.end_prefix("character")
+
+ # Include our fonts
+ if self.prefix(src="fonts"):
+ self.path("*.ttf")
+ self.path("*.txt")
+ self.end_prefix("fonts")
+
+ # skins
+ if self.prefix(src="skins"):
+ self.path("paths.xml")
+ # include the entire textures directory recursively
+ if self.prefix(src="*/textures"):
+ self.path("*/*.tga")
+ self.path("*/*.j2c")
+ self.path("*/*.jpg")
+ self.path("*/*.png")
+ self.path("*.tga")
+ self.path("*.j2c")
+ self.path("*.jpg")
+ self.path("*.png")
+ self.path("textures.xml")
+ self.end_prefix("*/textures")
+ self.path("*/xui/*/*.xml")
+ self.path("*/xui/*/widgets/*.xml")
+ self.path("*/*.xml")
+
+ # Local HTML files (e.g. loading screen)
+ if self.prefix(src="*/html"):
+ self.path("*.png")
+ self.path("*/*/*.html")
+ self.path("*/*/*.gif")
+ self.end_prefix("*/html")
+ self.end_prefix("skins")
+
+ # Files in the newview/ directory
+ self.path("gpu_table.txt")
def login_channel(self):
"""Channel reported for login and upgrade purposes ONLY;
@@ -163,6 +169,12 @@ class WindowsManifest(ViewerManifest):
else:
return ''.join(self.channel().split()) + '.exe'
+ def is_packaging_viewer(self):
+ # Some commands, files will only be included
+ # if we are packaging the viewer on windows.
+ # This manifest is also used to copy
+ # files during the build.
+ return 'package' in self.args['actions']
def test_msvcrt_and_copy_action(self, src, dst):
# This is used to test a dll manifest.
@@ -211,28 +223,46 @@ class WindowsManifest(ViewerManifest):
print "Doesn't exist:", src
def enable_crt_manifest_check(self):
- WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
+ if self.is_packaging_viewer():
+ WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
def enable_no_crt_manifest_check(self):
- WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
+ if self.is_packaging_viewer():
+ WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
def disable_manifest_check(self):
- del WindowsManifest.copy_action
+ if self.is_packaging_viewer():
+ del WindowsManifest.copy_action
def construct(self):
super(WindowsManifest, self).construct()
- # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
- self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
self.enable_crt_manifest_check()
+ if self.is_packaging_viewer():
+ # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
+ self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
+
# Plugin host application
self.path(os.path.join(os.pardir,
'llplugin', 'slplugin', self.args['configuration'], "slplugin.exe"),
"slplugin.exe")
- # need to get the llcommon.dll from the build directory as well
- if self.prefix(src=self.args['configuration'], dst=""):
+ self.disable_manifest_check()
+
+ # Get shared libs from the shared libs staging directory
+ if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
+ dst=""):
+
+ self.enable_crt_manifest_check()
+
+ # Get kdu dll, continue if missing.
+ try:
+ self.path('llkdu.dll', dst='llkdu.dll')
+ except RuntimeError:
+ print "Skipping llkdu.dll"
+
+ # Get llcommon and deps. If missing assume static linkage and continue.
try:
self.path('llcommon.dll')
self.path('libapr-1.dll')
@@ -242,22 +272,43 @@ class WindowsManifest(ViewerManifest):
print err.message
print "Skipping llcommon.dll (assuming llcommon was linked statically)"
- self.end_prefix()
-
- # need to get the kdu dll from the build directory as well
- try:
- self.path('%s/llkdu.dll' % self.args['configuration'], dst='llkdu.dll')
- except RuntimeError:
- print "Skipping llkdu.dll"
-
- self.disable_manifest_check()
+ self.disable_manifest_check()
- # For textures
- if self.prefix(src=self.args['configuration'], dst=""):
- if(self.args['configuration'].lower() == 'debug'):
+ # For textures
+ if self.args['configuration'].lower() == 'debug':
self.path("openjpegd.dll")
else:
self.path("openjpeg.dll")
+
+ # These need to be installed as a SxS assembly, currently a 'private' assembly.
+ # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
+ if self.args['configuration'].lower() == 'debug':
+ self.path("msvcr80d.dll")
+ self.path("msvcp80d.dll")
+ self.path("Microsoft.VC80.DebugCRT.manifest")
+ else:
+ self.path("msvcr80.dll")
+ self.path("msvcp80.dll")
+ self.path("Microsoft.VC80.CRT.manifest")
+
+ # Vivox runtimes
+ self.path("SLVoice.exe")
+ self.path("vivoxsdk.dll")
+ self.path("ortp.dll")
+ self.path("libsndfile-1.dll")
+ self.path("zlib1.dll")
+ self.path("vivoxplatform.dll")
+ self.path("vivoxoal.dll")
+
+ # For google-perftools tcmalloc allocator.
+ try:
+ if self.args['configuration'].lower() == 'debug':
+ self.path('libtcmalloc_minimal-debug.dll')
+ else:
+ self.path('libtcmalloc_minimal.dll')
+ except:
+ print "Skipping libtcmalloc_minimal.dll"
+
self.end_prefix()
self.path(src="licenses-win32.txt", dst="licenses.txt")
@@ -270,6 +321,7 @@ class WindowsManifest(ViewerManifest):
self.path("fmod.dll")
self.enable_no_crt_manifest_check()
+
# Media plugins - QuickTime
if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_quicktime.dll")
@@ -279,50 +331,71 @@ class WindowsManifest(ViewerManifest):
if self.prefix(src='../media_plugins/webkit/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_webkit.dll")
self.end_prefix()
-
- if self.prefix(src="../../libraries/i686-win32/lib/release", dst="llplugin"):
- self.path("libeay32.dll")
- self.path("qtcore4.dll")
- self.path("qtgui4.dll")
- self.path("qtnetwork4.dll")
- self.path("qtopengl4.dll")
- self.path("qtwebkit4.dll")
- self.path("ssleay32.dll")
- self.end_prefix()
- # For WebKit/Qt plugin runtimes (image format plugins)
- if self.prefix(src="../../libraries/i686-win32/lib/release/imageformats", dst="llplugin/imageformats"):
- self.path("qgif4.dll")
- self.path("qico4.dll")
- self.path("qjpeg4.dll")
- self.path("qmng4.dll")
- self.path("qsvg4.dll")
- self.path("qtiff4.dll")
- self.end_prefix()
+ if self.args['configuration'].lower() == 'debug':
+ if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),
+ dst="llplugin"):
+ self.path("libeay32.dll")
+ self.path("qtcored4.dll")
+ self.path("qtguid4.dll")
+ self.path("qtnetworkd4.dll")
+ self.path("qtopengld4.dll")
+ self.path("qtwebkitd4.dll")
+ self.path("qtxmlpatternsd4.dll")
+ self.path("ssleay32.dll")
+
+ # For WebKit/Qt plugin runtimes (image format plugins)
+ if self.prefix(src="imageformats", dst="imageformats"):
+ self.path("qgifd4.dll")
+ self.path("qicod4.dll")
+ self.path("qjpegd4.dll")
+ self.path("qmngd4.dll")
+ self.path("qsvgd4.dll")
+ self.path("qtiffd4.dll")
+ self.end_prefix()
- self.disable_manifest_check()
+ # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+ if self.prefix(src="codecs", dst="codecs"):
+ self.path("qcncodecsd4.dll")
+ self.path("qjpcodecsd4.dll")
+ self.path("qkrcodecsd4.dll")
+ self.path("qtwcodecsd4.dll")
+ self.end_prefix()
- # These need to be installed as a SxS assembly, currently a 'private' assembly.
- # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
- if self.prefix(src=self.args['configuration'], dst=""):
- if self.args['configuration'] == 'Debug':
- self.path("msvcr80d.dll")
- self.path("msvcp80d.dll")
- self.path("Microsoft.VC80.DebugCRT.manifest")
- else:
- self.path("msvcr80.dll")
- self.path("msvcp80.dll")
- self.path("Microsoft.VC80.CRT.manifest")
- self.end_prefix()
+ self.end_prefix()
+ else:
+ if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
+ dst="llplugin"):
+ self.path("libeay32.dll")
+ self.path("qtcore4.dll")
+ self.path("qtgui4.dll")
+ self.path("qtnetwork4.dll")
+ self.path("qtopengl4.dll")
+ self.path("qtwebkit4.dll")
+ self.path("qtxmlpatterns4.dll")
+ self.path("ssleay32.dll")
+
+ # For WebKit/Qt plugin runtimes (image format plugins)
+ if self.prefix(src="imageformats", dst="imageformats"):
+ self.path("qgif4.dll")
+ self.path("qico4.dll")
+ self.path("qjpeg4.dll")
+ self.path("qmng4.dll")
+ self.path("qsvg4.dll")
+ self.path("qtiff4.dll")
+ self.end_prefix()
- # Vivox runtimes
- if self.prefix(src=self.args['configuration'], dst=""):
- self.path("SLVoice.exe")
- self.path("alut.dll")
- self.path("vivoxsdk.dll")
- self.path("ortp.dll")
- self.path("wrap_oal.dll")
- self.end_prefix()
+ # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+ if self.prefix(src="codecs", dst="codecs"):
+ self.path("qcncodecs4.dll")
+ self.path("qjpcodecs4.dll")
+ self.path("qkrcodecs4.dll")
+ self.path("qtwcodecs4.dll")
+ self.end_prefix()
+
+ self.end_prefix()
+
+ self.disable_manifest_check()
# pull in the crash logger and updater from other projects
# tag:"crash-logger" here as a cue to the exporter
@@ -331,16 +404,8 @@ class WindowsManifest(ViewerManifest):
self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
dst="updater.exe")
- # For google-perftools tcmalloc allocator.
- if self.prefix(src=self.args['configuration'], dst=""):
- try:
- if self.args['configuration'] == 'Debug':
- self.path('libtcmalloc_minimal-debug.dll')
- else:
- self.path('libtcmalloc_minimal.dll')
- except:
- print "Skipping libtcmalloc_minimal.dll"
- self.end_prefix()
+ if not self.is_packaging_viewer():
+ self.package_file = "copied_deps"
def nsi_file_commands(self, install=True):
def wpath(path):
@@ -535,10 +600,11 @@ class DarwinManifest(ViewerManifest):
self.path("zh-Hans.lproj")
# SLVoice and vivox lols
- self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib")
- self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib")
+ self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib")
+ self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")
self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
+ self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")
self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
libdir = "../../libraries/universal-darwin/lib_release"
@@ -756,13 +822,15 @@ class LinuxManifest(ViewerManifest):
'dst': self.get_dst_prefix(),
'inst': self.build_path_of(installer_name)})
try:
- # --numeric-owner hides the username of the builder for
- # security etc.
- self.run_command('tar -C %(dir)s --numeric-owner -cjf '
- '%(inst_path)s.tar.bz2 %(inst_name)s' % {
- 'dir': self.get_build_prefix(),
- 'inst_name': installer_name,
- 'inst_path':self.build_path_of(installer_name)})
+ # only create tarball if it's a release build.
+ if self.args['buildtype'].lower() == 'release':
+ # --numeric-owner hides the username of the builder for
+ # security etc.
+ self.run_command('tar -C %(dir)s --numeric-owner -cjf '
+ '%(inst_path)s.tar.bz2 %(inst_name)s' % {
+ 'dir': self.get_build_prefix(),
+ 'inst_name': installer_name,
+ 'inst_path':self.build_path_of(installer_name)})
finally:
self.run_command("mv %(inst)s %(dst)s" % {
'dst': self.get_dst_prefix(),
@@ -786,9 +854,10 @@ class Linux_i686Manifest(LinuxManifest):
print "Skipping %s - not found" % libfile
pass
- self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin")
- self.path("../linux_crash_logger/linux-crash-logger-stripped","bin/linux-crash-logger.bin")
- self.path("../linux_updater/linux-updater-stripped", "bin/linux-updater.bin")
+ self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin")
+
+ self.path("../linux_crash_logger/linux-crash-logger","bin/linux-crash-logger.bin")
+ self.path("../linux_updater/linux-updater", "bin/linux-updater.bin")
self.path("../llplugin/slplugin/SLPlugin", "bin/SLPlugin")
if self.prefix("res-sdl"):
self.path("*")
@@ -798,7 +867,7 @@ class Linux_i686Manifest(LinuxManifest):
# plugins
if self.prefix(src="", dst="bin/llplugin"):
self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so")
- self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_quicktime.so")
+ self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.end_prefix("bin/llplugin")
self.path("featuretable_linux.txt")
@@ -817,6 +886,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
+ self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
try:
self.path("libkdu_v42R.so", "libkdu.so")
pass
@@ -837,21 +907,17 @@ class Linux_i686Manifest(LinuxManifest):
self.end_prefix()
if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
self.path("libortp.so")
+ self.path("libsndfile.so.1")
+ #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
self.path("libvivoxsdk.so")
+ self.path("libvivoxplatform.so")
self.end_prefix("lib")
-class Linux_x86_64Manifest(LinuxManifest):
- def construct(self):
- super(Linux_x86_64Manifest, self).construct()
- self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin")
- self.path("../linux_crash_logger/linux-crash-logger-stripped","linux-crash-logger.bin")
- if self.prefix("res-sdl"):
- self.path("*")
- # recurse
- self.end_prefix("res-sdl")
+ if self.args['buildtype'].lower() == 'release':
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command("find %(d)r/bin %(d)r/lib -type f | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
- self.path("featuretable_linux.txt")
- self.path("secondlife-i686.supp")
+################################################################
if __name__ == "__main__":
main()
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index cc9fa598f2..c1360987a5 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -119,8 +119,10 @@ get_target_property(TEST_EXE test LOCATION)
IF(WINDOWS)
set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ELSEIF(DARWIN)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
+ set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
ENDIF(WINDOWS)
LL_TEST_COMMAND("${LD_LIBRARY_PATH}"
diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp
index 31130c3c79..e58b10ce07 100644
--- a/indra/test/llevents_tut.cpp
+++ b/indra/test/llevents_tut.cpp
@@ -21,6 +21,7 @@
#define testable public
#include "llevents.h"
#undef testable
+#include "lllistenerwrapper.h"
// STL headers
// std headers
#include <iostream>
@@ -639,6 +640,33 @@ namespace tut
heaptest.post(2);
}
+ template<> template<>
+ void events_object::test<15>()
+ {
+ // This test ensures that using an LLListenerWrapper subclass doesn't
+ // block Boost.Signals2 from recognizing a bound LLEventTrackable
+ // subclass.
+ set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))");
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ {
+ TempTrackableListener tempListener("temp", live);
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ llwrap<LLLogListener>(
+ boost::bind(&TempTrackableListener::call,
+ boost::ref(tempListener), _1)));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+ } // presumably this will make tempListener go away?
+ // verify that
+ ensure("TempTrackableListener destroyed", ! live);
+ ensure("implicit disconnect", ! connection.connected());
+ // now just make sure we don't blow up trying to access a freed object!
+ heaptest.post(2);
+ }
+
class TempSharedListener: public TempListener,
public boost::enable_shared_from_this<TempSharedListener>
{
@@ -649,7 +677,7 @@ namespace tut
};
template<> template<>
- void events_object::test<15>()
+ void events_object::test<16>()
{
set_test_name("listen(boost::bind(...TempSharedListener ref...))");
#if 0
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp
index c541997e89..2b1496e912 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/test/llhttpclient_tut.cpp
@@ -269,6 +269,7 @@ namespace tut
template<> template<>
void HTTPClientTestObject::test<2>()
{
+ skip("error test depends on dev's local ISP not supplying \"helpful\" search page");
LLHTTPClient::get("http://www.invalid", newResult());
runThePump();
ensureStatusError();
diff --git a/indra/test/llsdutil_tut.cpp b/indra/test/llsdutil_tut.cpp
index d125bb0005..aebb1f9770 100644
--- a/indra/test/llsdutil_tut.cpp
+++ b/indra/test/llsdutil_tut.cpp
@@ -207,7 +207,7 @@ namespace tut
map.insert("Date", LLSD::Date());
map.insert("URI", LLSD::URI());
map.insert("Binary", LLSD::Binary());
- map.insert("Map", LLSD().insert("foo", LLSD()));
+ map.insert("Map", LLSD().with("foo", LLSD()));
// Only an empty array can be constructed on the fly
LLSD array;
array.append(LLSD());
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 88c4ba8ad9..b4043b0fd9 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -7,6 +7,7 @@ include(FindOpenGL)
include(LLCommon)
include(LLPlugin)
include(Linking)
+include(LLSharedLibs)
include(PluginAPI)
include(LLImage)
include(LLMath)
@@ -293,6 +294,7 @@ add_dependencies(llmediaplugintest
SLPlugin
media_plugin_quicktime
media_plugin_webkit
+ media_plugin_example
${LLPLUGIN_LIBRARIES}
${LLMESSAGE_LIBRARIES}
${LLCOMMON_LIBRARIES}
@@ -323,27 +325,7 @@ if (DARWIN)
make_directory
${PLUGINS_DESTINATION_DIR}
COMMENT "Creating Resources directory in app bundle."
- )
-
- # copy the llcommon dylib and its dependencies to Contents/Resources.
- get_target_property(BUILT_LLCOMMON llcommon LOCATION)
- add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${BUILT_LLCOMMON}
- )
- # FIXME: these paths should come from somewhere reliable. The canonical list seems to be in indra/newview/viewer_manifest.py
- add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib
- )
- add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib
- )
- add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib
- )
+ )
else (DARWIN)
set(PLUGINS_DESTINATION_DIR
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
@@ -356,6 +338,13 @@ add_custom_command(TARGET llmediaplugintest POST_BUILD
DEPENDS ${BUILT_SLPLUGIN}
)
+get_target_property(BUILT_LLCOMMON llcommon LOCATION)
+add_custom_command(TARGET llmediaplugintest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR}
+ DEPENDS ${BUILT_LLCOMMON}
+)
+
+
if (DARWIN OR WINDOWS)
get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
add_custom_command(TARGET llmediaplugintest POST_BUILD
@@ -369,6 +358,12 @@ if (DARWIN OR WINDOWS)
DEPENDS ${BUILT_QUICKTIME_PLUGIN}
)
+ get_target_property(BUILT_EXAMPLE_PLUGIN media_plugin_example LOCATION)
+ add_custom_command(TARGET llmediaplugintest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_EXAMPLE_PLUGIN} ${PLUGINS_DESTINATION_DIR}
+ DEPENDS ${BUILT_EXAMPLE_PLUGIN}
+ )
+
# copy over bookmarks file if llmediaplugintest gets built
get_target_property(BUILT_LLMEDIAPLUGINTEST llmediaplugintest LOCATION)
add_custom_command(TARGET llmediaplugintest POST_BUILD
@@ -433,7 +428,23 @@ if(WINDOWS)
${plugintest_debug_files}
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
+
+ # Debug config runtime files required for the plugin test mule (Qt codec plugins)
+ set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/codecs")
+ set(plugintest_debug_files
+ qcncodecsd4.dll
+ qjpcodecsd4.dll
+ qkrcodecsd4.dll
+ qtwcodecsd4.dll
+ )
+ copy_if_different(
+ ${plugintest_debug_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs"
+ out_targets
+ ${plugintest_debug_files}
+ )
+ set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
# Release & ReleaseDebInfo config runtime files required for the plugin test mule
set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
set(plugintest_release_files
@@ -447,6 +458,7 @@ if(WINDOWS)
qtnetwork4.dll
qtopengl4.dll
qtwebkit4.dll
+ qtxmlpatterns4.dll
ssleay32.dll
)
copy_if_different(
@@ -491,21 +503,37 @@ if(WINDOWS)
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+ # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins)
+ set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/codecs")
+ set(plugintest_release_files
+ qcncodecs4.dll
+ qjpcodecs4.dll
+ qkrcodecs4.dll
+ qtwcodecs4.dll
+ )
copy_if_different(
- "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}"
- "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
+ ${plugintest_release_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs"
out_targets
- llcommon.dll libapr-1.dll libaprutil-1.dll libapriconv-1.dll
+ ${plugintest_release_files}
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
- add_custom_target(copy_plugintest_libs ALL
- DEPENDS
- ${plugin_test_targets}
- llcommon
+ copy_if_different(
+ ${plugintest_release_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs"
+ out_targets
+ ${plugintest_release_files}
)
+ set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
+ add_custom_target(copy_plugintest_libs ALL
+ DEPENDS
+ ${plugin_test_targets}
+ )
add_dependencies(llmediaplugintest copy_plugintest_libs)
endif(WINDOWS)
+ll_deploy_sharedlibs_command(llmediaplugintest)
diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt
index ef34167b29..b8b83df386 100644
--- a/indra/test_apps/llplugintest/bookmarks.txt
+++ b/indra/test_apps/llplugintest/bookmarks.txt
@@ -34,3 +34,4 @@
(QT) Movie - The Informers,http://movies.apple.com/movies/independent/theinformers/theinformers_h.320.mov
(QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif
(QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt
+(EX) Example Plugin,example://blah
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 553d1ab131..0ff53f3e00 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -138,8 +138,6 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
mMediaBrowserControlBackButtonFlag( true ),
mMediaBrowserControlForwardButtonFlag( true ),
mHomeWebUrl( "http://www.google.com/" )
- //mHomeWebUrl( "file:///C|/Program Files/QuickTime/Sample.mov" )
- //mHomeWebUrl( "http://movies.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov" )
{
// debugging spam
std::cout << std::endl << " GLUT version: " << "3.7.6" << std::endl; // no way to get real version from GLUT
@@ -199,7 +197,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
{
LLError::initForApplication(".");
LLError::setDefaultLevel(LLError::LEVEL_INFO);
-// LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
+ //LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
}
// lots of randomness in this app
@@ -225,7 +223,6 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
resetView();
// initial media panel
-
const int num_initial_panels = 1;
for( int i = 0; i < num_initial_panels; ++i )
{
@@ -277,8 +274,6 @@ void LLMediaPluginTest::bindTexture(GLuint texture, GLint row_length, GLint alig
{
glEnable( GL_TEXTURE_2D );
-// std::cerr << "binding texture " << texture << std::endl;
-
glBindTexture( GL_TEXTURE_2D, texture );
glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length );
glPixelStorei( GL_UNPACK_ALIGNMENT, alignment );
@@ -410,7 +405,7 @@ void LLMediaPluginTest::draw( int draw_type )
// only bother with pick if we have something to render
// Actually, we need to pick even if we're not ready to render.
// Otherwise you can't select and remove a panel which has gone bad.
-// if ( mMediaPanels[ panel ]->mReadyToRender )
+ //if ( mMediaPanels[ panel ]->mReadyToRender )
{
glMatrixMode( GL_TEXTURE );
glPushMatrix();
@@ -621,10 +616,10 @@ void LLMediaPluginTest::idle()
if ( mSelectedPanel )
{
// set volume based on slider if we have time media
-// if ( mGluiMediaTimeControlWindowFlag )
-// {
-// mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
-// };
+ //if ( mGluiMediaTimeControlWindowFlag )
+ //{
+ // mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
+ //};
// NOTE: it is absurd that we need cache the state of GLUI controls
// but enabling/disabling controls drags framerate from 500+
@@ -1174,8 +1169,8 @@ void LLMediaPluginTest::keyboard( int key )
exit( 0 );
};
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 );
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0 );
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD());
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());
};
////////////////////////////////////////////////////////////////////////////////
@@ -1463,6 +1458,12 @@ std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url )
else
if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors
mime_type = "video/quicktime";
+ else
+ if ( url.find( ".mp3" ) != std::string::npos ) // Apple Text descriptors
+ mime_type = "video/quicktime";
+ else
+ if ( url.find( "example://" ) != std::string::npos ) // Example plugin
+ mime_type = "example/example";
return mime_type;
}
@@ -1487,6 +1488,9 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type )
else
if ( mime_type == "text/html" )
plugin_name = "media_plugin_webkit.dll";
+ else
+ if ( mime_type == "example/example" )
+ plugin_name = "media_plugin_example.dll";
#elif LL_LINUX
std::string plugin_name( "libmedia_plugin_null.so" );
@@ -1525,7 +1529,21 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
#elif LL_WINDOWS
std::string launcher_name( "SLPlugin.exe" );
#endif
- media_source->init( launcher_name, plugin_name );
+
+ // for this test app, use the cwd as the user data path (ugh).
+#if LL_WINDOWS
+ std::string user_data_path = ".\\";
+#else
+ char cwd[ FILENAME_MAX ];
+ if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+ {
+ std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
+ return;
+ }
+ std::string user_data_path = std::string( cwd ) + "/";
+#endif
+
+ media_source->init( launcher_name, plugin_name, false, user_data_path );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -1748,7 +1766,21 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
#elif LL_WINDOWS
std::string launcher_name( "SLPlugin.exe" );
#endif
- media_source->init( launcher_name, plugin_name );
+
+ // for this test app, use the cwd as the user data path (ugh).
+#if LL_WINDOWS
+ std::string user_data_path = ".\\";
+#else
+ char cwd[ FILENAME_MAX ];
+ if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+ {
+ std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
+ return;
+ }
+ std::string user_data_path = std::string( cwd ) + "/";
+#endif
+
+ media_source->init( launcher_name, plugin_name, false, user_data_path );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -1799,7 +1831,7 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string
// adjust this random size if it's a browser so we get
// a more useful size for testing..
- if ( mime_type == "text/html" )
+ if ( mime_type == "text/html" || mime_type == "example/example" )
{
width = ( ( rand() % 100 ) + 100 ) * 4;
height = ( width * ( ( rand() % 400 ) + 1000 ) ) / 1000;
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 7a30315b9a..b9f61ca7e1 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -70,7 +70,7 @@ public:
LLEventPump& getEventPump() { return mPump; }
private:
- void sendProgressEvent(const std::string& state, const std::string& change,
+ LLSD getProgressEventLLSD(const std::string& state, const std::string& change,
const LLSD& data = LLSD())
{
LLSD status_data;
@@ -87,7 +87,13 @@ private:
{
status_data["data"] = data;
}
+ return status_data;
+ }
+ void sendProgressEvent(const std::string& state, const std::string& change,
+ const LLSD& data = LLSD())
+ {
+ LLSD status_data = getProgressEventLLSD(state, change, data);
mPump.post(status_data);
}
@@ -127,10 +133,17 @@ void LLLogin::Impl::connect(const std::string& uri, const LLSD& credentials)
void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credentials)
{
- LL_INFOS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self)
- << " with uri '" << uri << "', credentials " << credentials << LL_ENDL;
- // Arriving in SRVRequest state
- LLEventStream replyPump("reply", true);
+ LLSD printable_credentials = credentials;
+ if(printable_credentials.has("params")
+ && printable_credentials["params"].has("passwd"))
+ {
+ printable_credentials["params"]["passwd"] = "*******";
+ }
+ LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self)
+ << " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL;
+
+ // Arriving in SRVRequest state
+ LLEventStream replyPump("SRVreply", true);
// Should be an array of one or more uri strings.
LLSD rewrittenURIs;
{
@@ -138,20 +151,40 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
sendProgressEvent("offline", "srvrequest");
// Request SRV record.
- LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
+ LL_DEBUGS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
- // *NOTE:Mani - Completely arbitrary timeout value for SRV request.
- filter.errorAfter(5, "SRV Request timed out!");
+ // *NOTE:Mani - Completely arbitrary default timeout value for SRV request.
+ F32 seconds_to_timeout = 5.0f;
+ if(credentials.has("cfg_srv_timeout"))
+ {
+ seconds_to_timeout = credentials["cfg_srv_timeout"].asReal();
+ }
+
+ // If the SRV request times out (e.g. EXT-3934), simulate response: an
+ // array containing our original URI.
+ LLSD fakeResponse(LLSD::emptyArray());
+ fakeResponse.append(uri);
+ filter.eventAfter(seconds_to_timeout, fakeResponse);
+
+ std::string srv_pump_name = "LLAres";
+ if(credentials.has("cfg_srv_pump"))
+ {
+ srv_pump_name = credentials["cfg_srv_pump"].asString();
+ }
- // Make request
+ // Make request
LLSD request;
request["op"] = "rewriteURI";
request["uri"] = uri;
request["reply"] = replyPump.getName();
- rewrittenURIs = postAndWait(self, request, "LLAres", filter);
+ rewrittenURIs = postAndWait(self, request, srv_pump_name, filter);
} // we no longer need the filter
LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
+ // EXT-4193: use a DIFFERENT reply pump than for the SRV request. We used
+ // to share them -- but the EXT-3934 fix made it possible for an abandoned
+ // SRV response to arrive just as we were expecting the XMLRPC response.
+ LLEventStream loginReplyPump("loginreply", true);
// Loop through the rewrittenURIs, counting attempts along the way.
// Because of possible redirect responses, we may make more than one
@@ -162,7 +195,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
urit != urend; ++urit)
{
LLSD request(credentials);
- request["reply"] = replyPump.getName();
+ request["reply"] = loginReplyPump.getName();
request["uri"] = *urit;
std::string status;
@@ -174,6 +207,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
LLSD progress_data;
progress_data["attempt"] = attempts;
progress_data["request"] = request;
+ if(progress_data["request"].has("params")
+ && progress_data["request"]["params"].has("passwd"))
+ {
+ progress_data["request"]["params"]["passwd"] = "*******";
+ }
sendProgressEvent("offline", "authenticating", progress_data);
// We expect zero or more "Downloading" status events, followed by
@@ -182,32 +220,36 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// possible for the reply to arrive before the post() call
// returns. Subsequent responses, of course, must be awaited
// without posting again.
- for (mAuthResponse = validateResponse(replyPump.getName(),
- postAndWait(self, request, xmlrpcPump, replyPump, "reply"));
+ for (mAuthResponse = validateResponse(loginReplyPump.getName(),
+ postAndWait(self, request, xmlrpcPump, loginReplyPump, "reply"));
mAuthResponse["status"].asString() == "Downloading";
- mAuthResponse = validateResponse(replyPump.getName(),
- waitForEventOn(self, replyPump)))
+ mAuthResponse = validateResponse(loginReplyPump.getName(),
+ waitForEventOn(self, loginReplyPump)))
{
// Still Downloading -- send progress update.
sendProgressEvent("offline", "downloading");
}
+
+ LL_DEBUGS("LLLogin") << "Auth Response: " << mAuthResponse << LL_ENDL;
status = mAuthResponse["status"].asString();
// Okay, we've received our final status event for this
// request. Unless we got a redirect response, break the retry
// loop for the current rewrittenURIs entry.
- if (! (status == "Complete" &&
- mAuthResponse["responses"]["login"].asString() == "indeterminate"))
+ if (!(status == "Complete" &&
+ mAuthResponse["responses"]["login"].asString() == "indeterminate"))
{
break;
}
+ sendProgressEvent("offline", "indeterminate", mAuthResponse["responses"]);
+
// Here the login service at the current URI is redirecting us
// to some other URI ("indeterminate" -- why not "redirect"?).
// The response should contain another uri to try, with its
// own auth method.
- request["uri"] = mAuthResponse["next_url"];
- request["method"] = mAuthResponse["next_method"];
+ request["uri"] = mAuthResponse["responses"]["next_url"].asString();
+ request["method"] = mAuthResponse["responses"]["next_method"].asString();
} // loop back to try the redirected URI
// Here we're done with redirects for the current rewrittenURIs
@@ -243,7 +285,14 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// Here we got through all the rewrittenURIs without succeeding. Tell
// caller this didn't work out so well. Of course, the only failure data
// we can reasonably show are from the last of the rewrittenURIs.
- sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]);
+
+ // *NOTE: The response from LLXMLRPCListener's Poller::poll method returns an
+ // llsd with no "responses" node. To make the output from an incomplete login symmetrical
+ // to success, add a data/message and data/reason fields.
+ LLSD error_response;
+ error_response["reason"] = mAuthResponse["status"];
+ error_response["message"] = mAuthResponse["error"];
+ sendProgressEvent("offline", "fail.login", error_response);
}
void LLLogin::Impl::disconnect()
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index a8ae2883d5..51f5cd0692 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -29,6 +29,20 @@
#include "llevents.h"
#include "stringize.h"
+#if LL_WINDOWS
+#define skipwin(arg) skip(arg)
+#define skipmac(arg)
+#define skiplinux(arg)
+#elif LL_DARWIN
+#define skipwin(arg)
+#define skipmac(arg) skip(arg)
+#define skiplinux(arg)
+#elif LL_LINUX
+#define skipwin(arg)
+#define skipmac(arg)
+#define skiplinux(arg) skip(arg)
+#endif
+
/*****************************************************************************
* Helper classes
*****************************************************************************/
@@ -47,6 +61,7 @@ public:
bool call(const LLSD& event)
{
mDebug(STRINGIZE("LoginListener called!: " << event));
+
mLastEvent = event;
return false;
}
@@ -200,14 +215,14 @@ namespace tut
void llviewerlogin_object::test<1>()
{
DEBUG;
- // Testing login with immediate repsonses from Ares and XMLPRC
+ // Testing login with immediate responses from Ares and XMLPRC
// The response from both requests will come before the post request exits.
// This tests an edge case of the login state handling.
LLEventStream llaresPump("LLAres"); // Dummy LLAres pump.
LLEventStream xmlrpcPump("LLXMLRPCTransaction"); // Dummy XMLRPC pump
bool respond_immediately = true;
- // Have 'dummy ares' repsond immediately.
+ // Have 'dummy ares' respond immediately.
LLAresListener dummyLLAres("dummy_llares", respond_immediately);
dummyLLAres.listenTo(llaresPump);
@@ -236,7 +251,7 @@ namespace tut
DEBUG;
// Tests a successful login in with delayed responses.
// Also includes 'failure' that cause the login module
- // To re-attempt connection, once from a basic failure
+ // to re-attempt connection, once from a basic failure
// and once from the 'indeterminate' response.
set_test_name("LLLogin multiple srv uris w/ success");
@@ -296,14 +311,15 @@ namespace tut
data["error"] = "dummy response";
data["transfer_rate"] = 0;
data["responses"]["login"] = "indeterminate";
- data["next_url"] = "login.indeterminate.com";
- data["next_method"] = "test_login_method";
+ data["responses"]["next_url"] = "login.indeterminate.com";
+ data["responses"]["next_method"] = "test_login_method";
dummyXMLRPC.setResponse(data);
dummyXMLRPC.sendReply();
ensure_equals("Fail back to authenticate 2", listener.lastEvent()["change"].asString(), "authenticating");
ensure_equals("Attempt 3", listener.lastEvent()["data"]["attempt"].asInteger(), 3);
ensure_equals("URI 3", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.indeterminate.com");
+ ensure_equals("Method 3", listener.lastEvent()["data"]["request"]["method"].asString(), "test_login_method");
// Finally let the auth succeed.
data.clear();
@@ -414,4 +430,52 @@ namespace tut
ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");
}
+
+ template<> template<>
+ void llviewerlogin_object::test<5>()
+ {
+ DEBUG;
+ // Test SRV request timeout.
+ set_test_name("LLLogin SRV timeout testing");
+
+ // Testing normal login procedure.
+ LLEventStream llaresPump("LLAres"); // Dummy LLAres pump.
+
+ LLAresListener dummyLLAres("dummy_llares");
+ dummyLLAres.listenTo(llaresPump);
+
+ LLLogin login;
+ LoginListener listener("test_ear");
+ listener.listenTo(login.getEventPump());
+
+ LLSD credentials;
+ credentials["first"] = "these";
+ credentials["last"] = "don't";
+ credentials["passwd"] = "matter";
+ credentials["cfg_srv_timeout"] = 0.0f;
+
+ login.connect("login.bar.com", credentials);
+
+ ensure_equals("SRV State", listener.lastEvent()["change"].asString(), "srvrequest");
+
+ // Get the mainloop eventpump, which needs a pinging in order to drive the
+ // SRV timeout.
+ LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
+ LLSD frame_event;
+ mainloop.post(frame_event);
+
+ // In this state we have NOT sent a reply from LLAresListener -- in
+ // fact there's no such object. Nonetheless, we expect the timeout to
+ // have stepped the login module forward to try to authenticate with
+ // the original URI.
+ ensure_equals("Auth state", listener.lastEvent()["change"].asString(), "authenticating");
+ ensure_equals("Attempt", listener.lastEvent()["data"]["attempt"].asInteger(), 1);
+ ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com");
+
+ // EXT-4193: if the SRV reply isn't lost but merely late, and if it
+ // arrives just at the moment we're expecting the XMLRPC reply, the
+ // original code got confused and crashed. Drive that case here. We
+ // observe that without the fix, this call DOES repro.
+ dummyLLAres.sendReply();
+ }
}
diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt
index 0bd59f0990..990dc6783e 100644
--- a/indra/win_crash_logger/CMakeLists.txt
+++ b/indra/win_crash_logger/CMakeLists.txt
@@ -11,6 +11,7 @@ include(LLVFS)
include(LLWindow)
include(LLXML)
include(Linking)
+include(LLSharedLibs)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -87,3 +88,5 @@ if (WINDOWS)
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
)
endif (WINDOWS)
+
+ll_deploy_sharedlibs_command(windows-crash-logger) \ No newline at end of file
diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt
index dedb7cfcc7..82347adf20 100644
--- a/indra/win_updater/CMakeLists.txt
+++ b/indra/win_updater/CMakeLists.txt
@@ -33,3 +33,6 @@ set_target_properties(windows-updater
LINK_FLAGS "/NODEFAULTLIB:LIBCMT"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
)
+
+# The windows-updater doesn't link against anything non-system, apparently
+#ll_deploy_sharedlibs_command(windows-updater) \ No newline at end of file
diff --git a/install.xml b/install.xml
index 8e5c7e7ae4..4c377a9f3e 100644
--- a/install.xml
+++ b/install.xml
@@ -132,9 +132,9 @@
<key>windows</key>
<map>
<key>md5sum</key>
- <string>4e2d4de03dce8a991a5727c15a284e8d</string>
+ <string>f5cf8d121b26f2e7944f7e63cdbff04d</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-windows-20090917.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri>
</map>
</map>
</map>
@@ -193,30 +193,30 @@
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>74f3a765644927c93fa3bc7acc730552</string>
+ <string>5ff1e212bb9bcde21cb174228e2437f6</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.1-darwin-20090805.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100219.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>8fb4151b883b5f5d2b12da19a6ff8e7d</string>
+ <string>9d4cbaac12d0068b3bb8ee73fcfbe9d7</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.1-linux-20090804.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100219.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
<key>md5sum</key>
- <string>77237f33b1740daef0dc1e6c801f68e1</string>
+ <string>af4badd6b2c10bc4db82ff1256695892</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.1-linux64-20090804.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20100119.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>4f05166629caa4c132a7448eefb8d592</string>
+ <string>94fd43f534e2055858d524086384907d</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20090917.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100219.tar.bz2</uri>
</map>
</map>
</map>
@@ -254,9 +254,9 @@
<key>windows</key>
<map>
<key>md5sum</key>
- <string>8dc4e818c2d6fbde76e9a5e34f4ffa72</string>
+ <string>53e5ab7affff7121a5af2f82b4d58b54</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20090917b.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20091016.tar.bz2</uri>
</map>
</map>
</map>
@@ -436,9 +436,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
- <string>978ad7c67fe4a2419bfc841e2956ff9f</string>
+ <string>9de3f44be65645c7f6af236139596942</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-20090521c.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-nommap.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -948,23 +948,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>b40a13847ee773c9ee06f641fe0dd1c2</string>
+ <string>95f44f0023dddc80be4398fc4f213861</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20091023.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100208.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>0d8aab394b4dc00aae44b4ada50c2d9f</string>
+ <string>4c75b2f1e8524c7844ee3ea1cd59a3db</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091027.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100209b.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>6f2f911545e5906edc87f4f3cda423a1</string>
+ <string>1e9798dc424a6f6c2bea50649bbcc7ae</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091023.tar.bz2</uri>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100210.tar.bz2</uri>
</map>
</map>
</map>
@@ -1159,9 +1159,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>f0d9a8d1318b519cffe6c40c9cac4e21</string>
+ <string>75a7004ab14bea46594b1c652f1a6040</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20081010c-59a71b14-plughw.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20100120-3ad86a1c.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -1269,7 +1269,7 @@ anguage Infrstructure (CLI) international standard</string>
<key>quicktime</key>
<map>
<key>copyright</key>
- <string>Copyright (C) 1990-2006 by Apple Computer, Inc., all rights reserved.</string>
+ <string>Copyright (C) 1990-2007 by Apple Computer, Inc., all rights reserved.</string>
<key>description</key>
<string>Separate download. Used to play in-world video clips on a prim. </string>
<key>license</key>
@@ -1279,9 +1279,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>7a2e6fc89b1ef027f3a36ebb46fb0c8a</string>
+ <string>be45825cc14ede53790ac93c58307dcb</string>
<key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-windows-20080611.tar.bz2</uri>
+ <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-sdk-windows-7.3-20091110.tar.bz2</uri>
</map>
</map>
</map>
@@ -1367,23 +1367,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>8675b5eedef038b514338b17f0e55961</string>
+ <string>316f86790b7afb5c9bd4f95bc193b80f</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-darwin-20090309.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-darwin-20100205.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>01573510dce7f380f44e561ef2f3dd9f</string>
+ <string>13f6886fa3e6675838e47adcabb0f0ac</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-linux-20090309.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-linux-20100205.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>752daa90e07c05202d1f76980cb955eb</string>
+ <string>2a81e3c42799c33742746925f16b54ca</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-windows-20090309.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-windows-20100205.tar.bz2</uri>
</map>
</map>
</map>
@@ -1447,9 +1447,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>1804b54034ef7f82832506a44acb06b8</string>
+ <string>26fe88213c213dc6153690ab142c25ca</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux-20090603.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3dfsg-linux-20091208.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
diff --git a/scripts/install.py b/scripts/install.py
index 78b8880b95..7368af0b37 100755
--- a/scripts/install.py
+++ b/scripts/install.py
@@ -793,8 +793,13 @@ def _getuser():
import getpass
return getpass.getuser()
except ImportError:
- import win32api
- return win32api.GetUserName()
+ import ctypes
+ MAX_PATH = 260 # according to a recent WinDef.h
+ name = ctypes.create_unicode_buffer(MAX_PATH)
+ namelen = ctypes.c_int(len(name)) # len in chars, NOT bytes
+ if not ctypes.windll.advapi32.GetUserNameW(name, ctypes.byref(namelen)):
+ raise ctypes.WinError()
+ return name.value
def _default_installable_cache():
"""In general, the installable files do not change much, so find a
diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg
index a5a99d79f0..d4f791c202 100644
--- a/scripts/messages/message_template.msg
+++ b/scripts/messages/message_template.msg
@@ -53,7 +53,7 @@ version 2.0
// OpenCircuit - Tells the recipient's messaging system to open the descibed circuit
{
- OpenCircuit Fixed 0xFFFFFFFC NotTrusted Unencoded
+ OpenCircuit Fixed 0xFFFFFFFC NotTrusted Unencoded UDPBlackListed
{
CircuitInfo Single
{ IP IPADDR }
@@ -1383,6 +1383,10 @@ version 2.0
{ AgentID LLUUID }
{ KickedFromEstateID U32 }
}
+ {
+ AgentInfo Single
+ { AgentEffectiveMaturity U32 }
+ }
}
// DataHomeLocationReply data->sim
diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py
index 8bb5e1d76d..adcfcbcae6 100755
--- a/scripts/template_verifier.py
+++ b/scripts/template_verifier.py
@@ -103,7 +103,7 @@ MESSAGE_TEMPLATE = 'message_template.msg'
PRODUCTION_ACCEPTABLE = (compatibility.Same, compatibility.Newer)
DEVELOPMENT_ACCEPTABLE = (
compatibility.Same, compatibility.Newer,
- compatibility.Older, compatibility.Mixed)
+ compatibility.Older, compatibility.Mixed)
MAX_MASTER_AGE = 60 * 60 * 4 # refresh master cache every 4 hours
@@ -203,8 +203,13 @@ def getuser():
import getpass
return getpass.getuser()
except ImportError:
- import win32api
- return win32api.GetUserName()
+ import ctypes
+ MAX_PATH = 260 # according to a recent WinDef.h
+ name = ctypes.create_unicode_buffer(MAX_PATH)
+ namelen = ctypes.c_int(len(name)) # len in chars, NOT bytes
+ if not ctypes.windll.advapi32.GetUserNameW(name, ctypes.byref(namelen)):
+ raise ctypes.WinError()
+ return name.value
def local_master_cache_filename():
"""Returns the location of the master template cache (which is in the system tempdir)
diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py
index ee1ce69a15..da60fd105a 100755
--- a/scripts/update_version_files.py
+++ b/scripts/update_version_files.py
@@ -47,6 +47,9 @@ def usage():
Options:
--version
Specify the version string to replace current version.
+ --revision
+ Specify the revision to replace the last digit of the version.
+ By default, revision is computed from the version control system.
--skip-on-branch
Specify a regular expression against which the current branch
is matched. If it matches, then leave version strings alone.
@@ -161,6 +164,7 @@ def main():
opts, args = getopt.getopt(sys.argv[1:],
"",
['version=',
+ 'revision=',
'channel=',
'server_channel=',
'skip-on-branch=',
@@ -171,12 +175,15 @@ def main():
update_server = False
update_viewer = False
new_version = None
+ new_revision = None
new_viewer_channel = None
new_server_channel = None
skip_on_branch_re = None
for o,a in opts:
if o in ('--version'):
new_version = a
+ if o in ('--revision'):
+ new_revision = a
if o in ('--skip-on-branch'):
skip_on_branch_re = re.compile(a)
if o in ('--channel'):
@@ -243,11 +250,20 @@ def main():
else:
if llversion.using_svn():
- revision = llversion.get_svn_revision()
+ if new_revision:
+ revision = new_revision
+ else:
+ revision = llversion.get_svn_revision()
branch = llversion.get_svn_branch()
elif llversion.using_hg():
- revision = llversion.get_hg_changeset()
+ if new_revision:
+ revision = new_revision
+ else:
+ revision = llversion.get_hg_changeset()
branch = llversion.get_hg_repo()
+ elif new_revision:
+ revision = new_revision
+ branch = "unknown"
else:
print >>sys.stderr, "ERROR: could not determine revision and branch"
return -1